From: root Date: Fri, 17 Apr 2015 15:07:39 +0000 (+0200) Subject: Merge remote-tracking branch 'origin/pycurl' into planetlab-4_0-branch X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=refs%2Fheads%2Fplanetlab-4_0-branch;hp=31f76aa36b03a1baa5711062ba76f069699e2668;p=plcapi.git Merge remote-tracking branch 'origin/pycurl' into planetlab-4_0-branch --- diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fcc8c82 --- /dev/null +++ b/Makefile @@ -0,0 +1,139 @@ +# +# (Re)builds Python metafiles (__init__.py) and documentation +# +# Mark Huang +# Copyright (C) 2005 The Trustees of Princeton University +# +# $Id: Makefile,v 1.15 2007/10/01 20:51:46 tmack Exp $ +# + +# Metafiles +init := PLC/__init__.py PLC/Methods/__init__.py + +# Python modules +modules := psycopg2 + +# Temporarily until we can kill the Fedora Core 2 build +curl_vernum := $(shell printf %d 0x$(shell curl-config --vernum)) +pycurl_vernum := $(shell printf %d 0x070d01) # 7.13.1 +ifeq ($(shell test $(curl_vernum) -ge $(pycurl_vernum) && echo 1),1) +modules += pycurl +endif + +modules-install := $(foreach module, $(modules), $(module)-install) +modules-clean := $(foreach module, $(modules), $(module)-clean) + +# Other stuff +subdirs := doc php php/xmlrpc + +# autoconf compatible variables +DESTDIR := /plc/root +datadir := /usr/share +bindir := /usr/bin + +PWD := $(shell pwd) + +all: $(init) $(subdirs) $(modules) + python setup.py build + +install: $(modules-install) + python setup.py install \ + --install-purelib=$(DESTDIR)/$(datadir)/plc_api \ + --install-scripts=$(DESTDIR)/$(datadir)/plc_api \ + --install-data=$(DESTDIR)/$(datadir)/plc_api + install -D -m 755 php/xmlrpc/xmlrpc.so $(DESTDIR)/$(shell php-config --extension-dir)/xmlrpc.so + install -D -m 755 refresh-peer.py $(DESTDIR)/$(bindir)/refresh-peer.py + +$(subdirs): $(init) $(modules) + +$(subdirs): %: + $(MAKE) -C $@ + +$(modules): + # Install in the current directory so that we can import it while developing + cd $@ && \ + python setup.py build && \ + python setup.py install_lib --install-dir=$(PWD) + +$(modules-install): %-install: + cd $* && \ + python setup.py install_lib --install-dir=$(DESTDIR)/$(datadir)/plc_api + +$(modules-clean): %-clean: + cd $* && python setup.py clean && rm -rf build + +clean: $(modules-clean) + find . -name '*.pyc' | xargs rm -f + rm -f $(INIT) + for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir clean ; done + python setup.py clean && rm -rf build + +index: $(init) + +index-clean: + rm $(init) + +tags: + find . '(' -name '*.py' -o -name '*.sql' -o -name '*.php' -o -name Makefile ')' | xargs etags + +########## make sync PLCHOST=hostname +ifdef PLCHOST +PLCSSH:=root@$(PLCHOST) +endif + +LOCAL_RSYNC_EXCLUDES := --exclude '*.pyc' +RSYNC_EXCLUDES := --exclude .svn --exclude CVS --exclude '*~' --exclude TAGS $(LOCAL_RSYNC_EXCLUDES) +RSYNC_COND_DRY_RUN := $(if $(findstring n,$(MAKEFLAGS)),--dry-run,) +RSYNC := rsync -a -v $(RSYNC_COND_DRY_RUN) $(RSYNC_EXCLUDES) + +sync: +ifeq (,$(PLCSSH)) + echo "sync: You must define target host as PLCHOST on the command line" + echo " e.g. make sync PLCHOST=private.one-lab.org" ; exit 1 +else + +$(RSYNC) PLC planetlab4.sql migrations $(PLCSSH):/plc/root/usr/share/plc_api/ + ssh $(PLCSSH) chroot /plc/root apachectl graceful +endif + +#################### +# All .py files in PLC/ + +# the current content of __init__.py +PLC_now := $(sort $(shell fgrep -v '"' PLC/__init__.py 2>/dev/null)) +# what should be declared +PLC_paths := $(filter-out %/__init__.py, $(wildcard PLC/*.py)) +PLC_files := $(sort $(notdir $(PLC_paths:.py=))) + +ifneq ($(PLC_now),$(PLC_files)) +PLC/__init__.py: force +endif +PLC/__init__.py: + (echo 'all = """' ; cd PLC; ls -1 *.py | grep -v __init__ | sed -e 's,.py$$,,' ; echo '""".split()') > $@ + + +# the current content of __init__.py +METHODS_now := $(sort $(shell fgrep -v '"' PLC/Methods/__init__.py 2>/dev/null)) +# what should be declared +METHODS_paths := $(filter-out %/__init__.py, $(wildcard PLC/Methods/*.py PLC/Methods/system/*.py)) +METHODS_files := $(sort $(notdir $(subst system/, system., $(METHODS_paths:.py=)))) + +ifneq ($(METHODS_now),$(METHODS_files)) +PLC/Methods/__init__.py: force +endif +PLC/Methods/__init__.py: + (echo 'methods = """' ; cd PLC/Methods; ls -1 *.py system/*.py | grep -v __init__ | sed -e 's,.py$$,,' -e 's,system/,system.,' ; echo '""".split()') > $@ + +force: + +.PHONY: all install force clean index tags $(subdirs) $(modules) + +#################### convenience, for debugging only +# make +foo : prints the value of $(foo) +# make ++foo : idem but verbose, i.e. foo=$(foo) +++%: varname=$(subst +,,$@) +++%: + @echo "$(varname)=$($(varname))" ++%: varname=$(subst +,,$@) ++%: + @echo "$($(varname))" + diff --git a/ModPython.py b/ModPython.py new file mode 100644 index 0000000..a1b2ab2 --- /dev/null +++ b/ModPython.py @@ -0,0 +1,62 @@ +# +# Apache mod_python interface +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# $Id: ModPython.py,v 1.5 2007/02/12 18:42:49 mlhuang Exp $ +# + +import sys +import traceback +import xmlrpclib +from mod_python import apache + +from PLC.Debug import log + +from PLC.API import PLCAPI +api = PLCAPI() + +def handler(req): + try: + if req.method != "POST": + req.content_type = "text/html" + req.send_http_header() + req.write(""" + +PLCAPI XML-RPC/SOAP Interface + +

PLCAPI XML-RPC/SOAP Interface

+

Please use XML-RPC or SOAP to access the PLCAPI.

+ +""") + return apache.OK + + # Read request + request = req.read(int(req.headers_in['content-length'])) + + # mod_python < 3.2: The IP address portion of remote_addr is + # incorrect (always 0.0.0.0) when IPv6 is enabled. + # http://issues.apache.org/jira/browse/MODPYTHON-64?page=all + (remote_ip, remote_port) = req.connection.remote_addr + remote_addr = (req.connection.remote_ip, remote_port) + + # Handle request + response = api.handle(remote_addr, request) + + # Shut down database connection, otherwise up to MaxClients DB + # connections will remain open. + api.db.close() + + # Write response + req.content_type = "text/xml; charset=" + api.encoding + req.send_http_header() + req.write(response) + + return apache.OK + + except Exception, err: + # Log error in /var/log/httpd/(ssl_)?error_log + print >> log, err, traceback.format_exc() + return apache.HTTP_INTERNAL_SERVER_ERROR diff --git a/PLC/.cvsignore b/PLC/.cvsignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/PLC/.cvsignore @@ -0,0 +1 @@ +*.pyc diff --git a/PLC/API.py b/PLC/API.py new file mode 100644 index 0000000..5c4cb9d --- /dev/null +++ b/PLC/API.py @@ -0,0 +1,174 @@ +# +# PLCAPI XML-RPC and SOAP interfaces +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# $Id: API.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import sys +import traceback +import string + +import xmlrpclib + +# See "2.2 Characters" in the XML specification: +# +# #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] +# avoiding +# [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF] + +invalid_xml_ascii = map(chr, range(0x0, 0x8) + [0xB, 0xC] + range(0xE, 0x1F)) +xml_escape_table = string.maketrans("".join(invalid_xml_ascii), "?" * len(invalid_xml_ascii)) + +def xmlrpclib_escape(s, replace = string.replace): + """ + xmlrpclib does not handle invalid 7-bit control characters. This + function augments xmlrpclib.escape, which by default only replaces + '&', '<', and '>' with entities. + """ + + # This is the standard xmlrpclib.escape function + s = replace(s, "&", "&") + s = replace(s, "<", "<") + s = replace(s, ">", ">",) + + # Replace invalid 7-bit control characters with '?' + return s.translate(xml_escape_table) + +def xmlrpclib_dump(self, value, write): + """ + xmlrpclib cannot marshal instances of subclasses of built-in + types. This function overrides xmlrpclib.Marshaller.__dump so that + any value that is an instance of one of its acceptable types is + marshalled as that type. + + xmlrpclib also cannot handle invalid 7-bit control characters. See + above. + """ + + # Use our escape function + args = [self, value, write] + if isinstance(value, (str, unicode)): + args.append(xmlrpclib_escape) + + try: + # Try for an exact match first + f = self.dispatch[type(value)] + except KeyError: + # Try for an isinstance() match + for Type, f in self.dispatch.iteritems(): + if isinstance(value, Type): + f(*args) + return + raise TypeError, "cannot marshal %s objects" % type(value) + else: + f(*args) + +# You can't hide from me! +xmlrpclib.Marshaller._Marshaller__dump = xmlrpclib_dump + +# SOAP support is optional +try: + import SOAPpy + from SOAPpy.Parser import parseSOAPRPC + from SOAPpy.Types import faultType + from SOAPpy.NS import NS + from SOAPpy.SOAPBuilder import buildSOAP +except ImportError: + SOAPpy = None + +from PLC.Config import Config +from PLC.Faults import * +import PLC.Methods + +class PLCAPI: + methods = PLC.Methods.methods + + def __init__(self, config = "/etc/planetlab/plc_config", encoding = "utf-8"): + self.encoding = encoding + + # Better just be documenting the API + if config is None: + return + + # Load configuration + self.config = Config(config) + + # Initialize database connection + if self.config.PLC_DB_TYPE == "postgresql": + from PLC.PostgreSQL import PostgreSQL + self.db = PostgreSQL(self) + + else: + raise PLCAPIError, "Unsupported database type " + self.config.PLC_DB_TYPE + + def callable(self, method): + """ + Return a new instance of the specified method. + """ + + # Look up method + if method not in self.methods: + raise PLCInvalidAPIMethod, method + + # Get new instance of method + try: + classname = method.split(".")[-1] + module = __import__("PLC.Methods." + method, globals(), locals(), [classname]) + return getattr(module, classname)(self) + except ImportError, AttributeError: + raise PLCInvalidAPIMethod, method + + def call(self, source, method, *args): + """ + Call the named method from the specified source with the + specified arguments. + """ + + function = self.callable(method) + function.source = source + return function(*args) + + def handle(self, source, data): + """ + Handle an XML-RPC or SOAP request from the specified source. + """ + + # Parse request into method name and arguments + try: + interface = xmlrpclib + (args, method) = xmlrpclib.loads(data) + methodresponse = True + except Exception, e: + if SOAPpy is not None: + interface = SOAPpy + (r, header, body, attrs) = parseSOAPRPC(data, header = 1, body = 1, attrs = 1) + method = r._name + args = r._aslist() + # XXX Support named arguments + else: + raise e + + try: + result = self.call(source, method, *args) + except PLCFault, fault: + # Handle expected faults + if interface == xmlrpclib: + result = fault + methodresponse = None + elif interface == SOAPpy: + result = faultParameter(NS.ENV_T + ":Server", "Method Failed", method) + result._setDetail("Fault %d: %s" % (fault.faultCode, fault.faultString)) + + # Return result + if interface == xmlrpclib: + if not isinstance(result, PLCFault): + result = (result,) + data = xmlrpclib.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1) + elif interface == SOAPpy: + data = buildSOAP(kw = {'%sResponse' % method: {'Result': result}}, encoding = self.encoding) + + return data diff --git a/PLC/AddressTypes.py b/PLC/AddressTypes.py new file mode 100644 index 0000000..7156c00 --- /dev/null +++ b/PLC/AddressTypes.py @@ -0,0 +1,66 @@ +# +# Functions for interacting with the address_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: AddressTypes.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from types import StringTypes +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table + +class AddressType(Row): + """ + Representation of a row in the address_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'address_types' + primary_key = 'address_type_id' + join_tables = ['address_address_type'] + fields = { + 'address_type_id': Parameter(int, "Address type identifier"), + 'name': Parameter(str, "Address type", max = 20), + 'description': Parameter(str, "Address type description", max = 254), + } + + def validate_name(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Address type must be specified" + + # Make sure address type does not already exist + conflicts = AddressTypes(self.api, [name]) + for address_type_id in conflicts: + if 'address_type_id' not in self or self['address_type_id'] != address_type_id: + raise PLCInvalidArgument, "Address type name already in use" + + return name + +class AddressTypes(Table): + """ + Representation of the address_types table in the database. + """ + + def __init__(self, api, address_type_filter = None, columns = None): + Table.__init__(self, api, AddressType, columns) + + sql = "SELECT %s FROM address_types WHERE True" % \ + ", ".join(self.columns) + + if address_type_filter is not None: + if isinstance(address_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), address_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), address_type_filter) + address_type_filter = Filter(AddressType.fields, {'address_type_id': ints, 'name': strs}) + sql += " AND (%s) %s" % address_type_filter.sql(api, "OR") + elif isinstance(address_type_filter, dict): + address_type_filter = Filter(AddressType.fields, address_type_filter) + sql += " AND (%s) %s" % address_type_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/PLC/Addresses.py b/PLC/Addresses.py new file mode 100644 index 0000000..36c0d1d --- /dev/null +++ b/PLC/Addresses.py @@ -0,0 +1,99 @@ +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter +from PLC.AddressTypes import AddressType, AddressTypes + +class Address(Row): + """ + Representation of a row in the addresses table. To use, instantiate + with a dict of values. + """ + + table_name = 'addresses' + primary_key = 'address_id' + join_tables = ['address_address_type', 'site_address'] + fields = { + 'address_id': Parameter(int, "Address identifier"), + 'line1': Parameter(str, "Address line 1", max = 254), + 'line2': Parameter(str, "Address line 2", max = 254, nullok = True), + 'line3': Parameter(str, "Address line 3", max = 254, nullok = True), + 'city': Parameter(str, "City", max = 254), + 'state': Parameter(str, "State or province", max = 254), + 'postalcode': Parameter(str, "Postal code", max = 64), + 'country': Parameter(str, "Country", max = 128), + 'address_type_ids': Parameter([int], "Address type identifiers"), + 'address_types': Parameter([str], "Address types"), + } + + def add_address_type(self, address_type, commit = True): + """ + Add address type to existing address. + """ + + assert 'address_id' in self + assert isinstance(address_type, AddressType) + assert 'address_type_id' in address_type + + address_id = self['address_id'] + address_type_id = address_type['address_type_id'] + + if address_type_id not in self['address_type_ids']: + assert address_type['name'] not in self['address_types'] + + self.api.db.do("INSERT INTO address_address_type (address_id, address_type_id)" \ + " VALUES(%(address_id)d, %(address_type_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['address_type_ids'].append(address_type_id) + self['address_types'].append(address_type['name']) + + def remove_address_type(self, address_type, commit = True): + """ + Add address type to existing address. + """ + + assert 'address_id' in self + assert isinstance(address_type, AddressType) + assert 'address_type_id' in address_type + + address_id = self['address_id'] + address_type_id = address_type['address_type_id'] + + if address_type_id in self['address_type_ids']: + assert address_type['name'] in self['address_types'] + + self.api.db.do("DELETE FROM address_address_type" \ + " WHERE address_id = %(address_id)d" \ + " AND address_type_id = %(address_type_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['address_type_ids'].remove(address_type_id) + self['address_types'].remove(address_type['name']) + +class Addresses(Table): + """ + Representation of row(s) from the addresses table in the + database. + """ + + def __init__(self, api, address_filter = None, columns = None): + Table.__init__(self, api, Address, columns) + + sql = "SELECT %s FROM view_addresses WHERE True" % \ + ", ".join(self.columns) + + if address_filter is not None: + if isinstance(address_filter, (list, tuple, set)): + address_filter = Filter(Address.fields, {'address_id': address_filter}) + elif isinstance(address_filter, dict): + address_filter = Filter(Address.fields, address_filter) + sql += " AND (%s) %s" % address_filter.sql(api) + + self.selectall(sql) diff --git a/PLC/Auth.py b/PLC/Auth.py new file mode 100644 index 0000000..498acc5 --- /dev/null +++ b/PLC/Auth.py @@ -0,0 +1,332 @@ +# +# PLCAPI authentication parameters +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Auth.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import crypt +import sha +import hmac +import time + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Persons +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Sessions import Session, Sessions +from PLC.Peers import Peer, Peers +from PLC.Boot import notify_owners + +class Auth(Parameter): + """ + Base class for all API authentication methods, as well as a class + that can be used to represent all supported API authentication + methods. + """ + + def __init__(self, auth = None): + if auth is None: + auth = {'AuthMethod': Parameter(str, "Authentication method to use", optional = False)} + Parameter.__init__(self, auth, "API authentication structure") + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert 'AuthMethod' in auth + + if auth['AuthMethod'] == "session": + expected = SessionAuth() + elif auth['AuthMethod'] == "password" or \ + auth['AuthMethod'] == "capability": + expected = PasswordAuth() + elif auth['AuthMethod'] == "gpg": + expected = GPGAuth() + elif auth['AuthMethod'] == "hmac": + expected = BootAuth() + elif auth['AuthMethod'] == "anonymous": + expected = AnonymousAuth() + else: + raise PLCInvalidArgument("must be 'session', 'password', 'gpg', 'hmac', or 'anonymous'", "AuthMethod") + + # Re-check using the specified authentication method + method.type_check("auth", auth, expected, (auth,) + args) + +class GPGAuth(Auth): + """ + Proposed PlanetLab federation authentication structure. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'gpg'", optional = False), + 'name': Parameter(str, "Peer or user name", optional = False), + 'signature': Parameter(str, "Message signature", optional = False) + }) + + def check(self, method, auth, *args): + try: + peers = Peers(method.api, [auth['name']]) + if peers: + if 'peer' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = peer = peers[0] + keys = [peer['key']] + else: + persons = Persons(method.api, {'email': auth['name'], 'enabled': True, 'peer_id': None}) + if not persons: + raise PLCAuthenticationFailure, "No such user '%s'" % auth['name'] + + if not set(person['roles']).intersection(method.roles): + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = person = persons[0] + keys = Keys(method.api, {'key_id': person['key_ids'], 'key_type': "gpg", 'peer_id': None}) + + if not keys: + raise PLCAuthenticationFailure, "No GPG key on record for peer or user '%s'" + + for key in keys: + try: + from PLC.GPG import gpg_verify + gpg_verify(args, key, auth['signature'], method.name) + return + except PLCAuthenticationFailure, fault: + pass + + raise fault + + except PLCAuthenticationFailure, fault: + # XXX Send e-mail + raise fault + +class SessionAuth(Auth): + """ + Secondary authentication method. After authenticating with a + primary authentication method, call GetSession() to generate a + session key that may be used for subsequent calls. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'session'", optional = False), + 'session': Parameter(str, "Session key", optional = False) + }) + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert auth.has_key('session') + + # Get session record + sessions = Sessions(method.api, [auth['session']], expires = None) + if not sessions: + raise PLCAuthenticationFailure, "No such session" + session = sessions[0] + + try: + if session['node_id'] is not None: + nodes = Nodes(method.api, {'node_id': session['node_id'], 'peer_id': None}) + if not nodes: + raise PLCAuthenticationFailure, "No such node" + node = nodes[0] + + if 'node' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = node + + elif session['person_id'] is not None and session['expires'] > time.time(): + persons = Persons(method.api, {'person_id': session['person_id'], 'enabled': True, 'peer_id': None}) + if not persons: + raise PLCAuthenticationFailure, "No such account" + person = persons[0] + + if not set(person['roles']).intersection(method.roles): + raise PLCPermissionDenied, "Not allowed to call method" + + method.caller = persons[0] + + else: + raise PLCAuthenticationFailure, "Invalid session" + + except PLCAuthenticationFailure, fault: + session.delete() + raise fault + +class BootAuth(Auth): + """ + PlanetLab version 3.x node authentication structure. Used by the + Boot Manager to make authenticated calls to the API based on a + unique node key or boot nonce value. + + The original parameter serialization code did not define the byte + encoding of strings, or the string encoding of all other types. We + define the byte encoding to be UTF-8, and the string encoding of + all other types to be however Python version 2.3 unicode() encodes + them. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'hmac'", optional = False), + 'node_id': Parameter(int, "Node identifier", optional = False), + 'value': Parameter(str, "HMAC of node key and method call", optional = False) + }) + + def canonicalize(self, args): + values = [] + + for arg in args: + if isinstance(arg, list) or isinstance(arg, tuple): + # The old implementation did not recursively handle + # lists of lists. But neither did the old API itself. + values += self.canonicalize(arg) + elif isinstance(arg, dict): + # Yes, the comments in the old implementation are + # misleading. Keys of dicts are not included in the + # hash. + values += self.canonicalize(arg.values()) + else: + # We use unicode() instead of str(). + values.append(unicode(arg)) + + return values + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert auth.has_key('node_id') + + if 'node' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method" + + try: + nodes = Nodes(method.api, {'node_id': auth['node_id'], 'peer_id': None}) + if not nodes: + raise PLCAuthenticationFailure, "No such node" + node = nodes[0] + + if node['key']: + key = node['key'] + elif node['boot_nonce']: + # Allow very old nodes that do not have a node key in + # their configuration files to use their "boot nonce" + # instead. The boot nonce is a random value generated + # by the node itself and POSTed by the Boot CD when it + # requests the Boot Manager. This is obviously not + # very secure, so we only allow it to be used if the + # requestor IP is the same as the IP address we have + # on record for the node. + key = node['boot_nonce'] + + nodenetwork = None + if node['nodenetwork_ids']: + nodenetworks = NodeNetworks(method.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + break + + if not nodenetwork or not nodenetwork['is_primary']: + raise PLCAuthenticationFailure, "No primary network interface on record" + + if method.source is None: + raise PLCAuthenticationFailure, "Cannot determine IP address of requestor" + + if nodenetwork['ip'] != method.source[0]: + raise PLCAuthenticationFailure, "Requestor IP %s does not match node IP %s" % \ + (method.source[0], nodenetwork['ip']) + else: + raise PLCAuthenticationFailure, "No node key or boot nonce" + + # Yes, this is the "canonicalization" method used. + args = self.canonicalize(args) + args.sort() + msg = "[" + "".join(args) + "]" + + # We encode in UTF-8 before calculating the HMAC, which is + # an 8-bit algorithm. + digest = hmac.new(key, msg.encode('utf-8'), sha).hexdigest() + + if digest != auth['value']: + raise PLCAuthenticationFailure, "Call could not be authenticated" + + method.caller = node + + except PLCAuthenticationFailure, fault: + if nodes: + notify_owners(method, node, 'authfail', include_pis = True, include_techs = True, fault = fault) + raise fault + +class AnonymousAuth(Auth): + """ + PlanetLab version 3.x anonymous authentication structure. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'anonymous'", False), + }) + + def check(self, method, auth, *args): + if 'anonymous' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method anonymously" + + method.caller = None + +class PasswordAuth(Auth): + """ + PlanetLab version 3.x password authentication structure. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'password' or 'capability'", optional = False), + 'Username': Parameter(str, "PlanetLab username, typically an e-mail address", optional = False), + 'AuthString': Parameter(str, "Authentication string, typically a password", optional = False), + }) + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert auth.has_key('Username') + + # Get record (must be enabled) + persons = Persons(method.api, {'email': auth['Username'].lower(), 'enabled': True, 'peer_id': None}) + if len(persons) != 1: + raise PLCAuthenticationFailure, "No such account" + + person = persons[0] + + if auth['Username'] == method.api.config.PLC_API_MAINTENANCE_USER: + # "Capability" authentication, whatever the hell that was + # supposed to mean. It really means, login as the special + # "maintenance user" using password authentication. Can + # only be used on particular machines (those in a list). + sources = method.api.config.PLC_API_MAINTENANCE_SOURCES.split() + if method.source is not None and method.source[0] not in sources: + raise PLCAuthenticationFailure, "Not allowed to login to maintenance account" + + # Not sure why this is not stored in the DB + password = method.api.config.PLC_API_MAINTENANCE_PASSWORD + + if auth['AuthString'] != password: + raise PLCAuthenticationFailure, "Maintenance account password verification failed" + else: + # Compare encrypted plaintext against encrypted password stored in the DB + plaintext = auth['AuthString'].encode(method.api.encoding) + password = person['password'] + + # Protect against blank passwords in the DB + if password is None or password[:12] == "" or \ + crypt.crypt(plaintext, password[:12]) != password: + raise PLCAuthenticationFailure, "Password verification failed" + + if not set(person['roles']).intersection(method.roles): + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = person diff --git a/PLC/Boot.py b/PLC/Boot.py new file mode 100644 index 0000000..00a33ca --- /dev/null +++ b/PLC/Boot.py @@ -0,0 +1,61 @@ +# +# Boot Manager support +# +# Mark Huang +# Copyright (C) 2007 The Trustees of Princeton University +# +# $Id: Boot.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Debug import log +from PLC.Messages import Message, Messages +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.sendmail import sendmail + +def notify_owners(method, node, message_id, + include_pis = False, include_techs = False, include_support = False, + fault = None): + messages = Messages(method.api, [message_id], enabled = True) + if not messages: + print >> log, "No such message template '%s'" % message_id + return 1 + message = messages[0] + + To = [] + + if method.api.config.PLC_MAIL_BOOT_ADDRESS: + To.append(("Boot Messages", method.api.config.PLC_MAIL_BOOT_ADDRESS)) + + if include_support and method.api.config.PLC_MAIL_SUPPORT_ADDRESS: + To.append(("%s Support" % method.api.config.PLC_NAME, + method.api.config.PLC_MAIL_SUPPORT_ADDRESS)) + + if include_pis or include_techs: + sites = Sites(method.api, [node['site_id']]) + if not sites: + raise PLCAPIError, "No site associated with node" + site = sites[0] + + persons = Persons(method.api, site['person_ids']) + for person in persons: + if include_pis and 'pi' in person['roles'] or \ + include_techs and 'tech' in person['roles']: + To.append(("%s %s" % (person['first_name'], person['last_name']), person['email'])) + + # Send email + params = {'node_id': node['node_id'], + 'hostname': node['hostname'], + 'PLC_WWW_HOST': method.api.config.PLC_WWW_HOST, + 'PLC_WWW_SSL_PORT': method.api.config.PLC_WWW_SSL_PORT, + 'fault': fault} + + sendmail(method.api, To = To, + Subject = message['subject'] % params, + Body = message['template'] % params) + + # Logging variables + method.object_type = "Node" + method.object_ids = [node['node_id']] + method.message = "Sent message %s" % message_id diff --git a/PLC/BootStates.py b/PLC/BootStates.py new file mode 100644 index 0000000..014b61a --- /dev/null +++ b/PLC/BootStates.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the boot_states table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: BootStates.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class BootState(Row): + """ + Representation of a row in the boot_states table. To use, + instantiate with a dict of values. + """ + + table_name = 'boot_states' + primary_key = 'boot_state' + join_tables = ['nodes'] + fields = { + 'boot_state': Parameter(str, "Boot state", max = 20), + } + + def validate_boot_state(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Boot state must be specified" + + # Make sure boot state does not alredy exist + conflicts = BootStates(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Boot state name already in use" + + return name + +class BootStates(Table): + """ + Representation of the boot_states table in the database. + """ + + def __init__(self, api, boot_states = None): + Table.__init__(self, api, BootState) + + sql = "SELECT %s FROM boot_states" % \ + ", ".join(BootState.fields) + + if boot_states: + sql += " WHERE boot_state IN (%s)" % ", ".join(map(api.db.quote, boot_states)) + + self.selectall(sql) diff --git a/PLC/ConfFiles.py b/PLC/ConfFiles.py new file mode 100644 index 0000000..f15a574 --- /dev/null +++ b/PLC/ConfFiles.py @@ -0,0 +1,155 @@ +# +# Functions for interacting with the conf_files table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: ConfFiles.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Nodes import Node, Nodes +from PLC.NodeGroups import NodeGroup, NodeGroups + +class ConfFile(Row): + """ + Representation of a row in the conf_files table. To use, + instantiate with a dict of values. + """ + + table_name = 'conf_files' + primary_key = 'conf_file_id' + join_tables = ['conf_file_node', 'conf_file_nodegroup'] + fields = { + 'conf_file_id': Parameter(int, "Configuration file identifier"), + 'enabled': Parameter(bool, "Configuration file is active"), + 'source': Parameter(str, "Relative path on the boot server where file can be downloaded", max = 255), + 'dest': Parameter(str, "Absolute path where file should be installed", max = 255), + 'file_permissions': Parameter(str, "chmod(1) permissions", max = 20), + 'file_owner': Parameter(str, "chown(1) owner", max = 50), + 'file_group': Parameter(str, "chgrp(1) owner", max = 50), + 'preinstall_cmd': Parameter(str, "Shell command to execute prior to installing", max = 1024, nullok = True), + 'postinstall_cmd': Parameter(str, "Shell command to execute after installing", max = 1024, nullok = True), + 'error_cmd': Parameter(str, "Shell command to execute if any error occurs", max = 1024, nullok = True), + 'ignore_cmd_errors': Parameter(bool, "Install file anyway even if an error occurs"), + 'always_update': Parameter(bool, "Always attempt to install file even if unchanged"), + 'node_ids': Parameter(int, "List of nodes linked to this file"), + 'nodegroup_ids': Parameter(int, "List of node groups linked to this file"), + } + + def add_node(self, node, commit = True): + """ + Add configuration file to node. + """ + + assert 'conf_file_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + conf_file_id = self['conf_file_id'] + node_id = node['node_id'] + + if node_id not in self['node_ids']: + self.api.db.do("INSERT INTO conf_file_node (conf_file_id, node_id)" \ + " VALUES(%(conf_file_id)d, %(node_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].append(node_id) + node['conf_file_ids'].append(conf_file_id) + + def remove_node(self, node, commit = True): + """ + Remove configuration file from node. + """ + + assert 'conf_file_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + conf_file_id = self['conf_file_id'] + node_id = node['node_id'] + + if node_id in self['node_ids']: + self.api.db.do("DELETE FROM conf_file_node" \ + " WHERE conf_file_id = %(conf_file_id)d" \ + " AND node_id = %(node_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].remove(node_id) + node['conf_file_ids'].remove(conf_file_id) + + def add_nodegroup(self, nodegroup, commit = True): + """ + Add configuration file to node group. + """ + + assert 'conf_file_id' in self + assert isinstance(nodegroup, NodeGroup) + assert 'nodegroup_id' in nodegroup + + conf_file_id = self['conf_file_id'] + nodegroup_id = nodegroup['nodegroup_id'] + + if nodegroup_id not in self['nodegroup_ids']: + self.api.db.do("INSERT INTO conf_file_nodegroup (conf_file_id, nodegroup_id)" \ + " VALUES(%(conf_file_id)d, %(nodegroup_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['nodegroup_ids'].append(nodegroup_id) + nodegroup['conf_file_ids'].append(conf_file_id) + + def remove_nodegroup(self, nodegroup, commit = True): + """ + Remove configuration file from node group. + """ + + assert 'conf_file_id' in self + assert isinstance(nodegroup, NodeGroup) + assert 'nodegroup_id' in nodegroup + + conf_file_id = self['conf_file_id'] + nodegroup_id = nodegroup['nodegroup_id'] + + if nodegroup_id in self['nodegroup_ids']: + self.api.db.do("DELETE FROM conf_file_nodegroup" \ + " WHERE conf_file_id = %(conf_file_id)d" \ + " AND nodegroup_id = %(nodegroup_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['nodegroup_ids'].remove(nodegroup_id) + nodegroup['conf_file_ids'].remove(conf_file_id) + +class ConfFiles(Table): + """ + Representation of the conf_files table in the database. + """ + + def __init__(self, api, conf_file_filter = None, columns = None): + Table.__init__(self, api, ConfFile, columns) + + sql = "SELECT %s FROM view_conf_files WHERE True" % \ + ", ".join(self.columns) + + if conf_file_filter is not None: + if isinstance(conf_file_filter, (list, tuple, set)): + conf_file_filter = Filter(ConfFile.fields, {'conf_file_id': conf_file_filter}) + elif isinstance(conf_file_filter, dict): + conf_file_filter = Filter(ConfFile.fields, conf_file_filter) + sql += " AND (%s) %s" % conf_file_filter.sql(api) + + self.selectall(sql) diff --git a/PLC/Config.py b/PLC/Config.py new file mode 100644 index 0000000..693ba22 --- /dev/null +++ b/PLC/Config.py @@ -0,0 +1,96 @@ +#!/usr/bin/python +# +# PLCAPI configuration store. Supports XML-based configuration file +# format exported by MyPLC. +# +# Mark Huang +# Copyright (C) 2004-2006 The Trustees of Princeton University +# +# $Id: Config.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import os +import sys + +from PLC.Faults import * +from PLC.Debug import profile + +# If we have been checked out into a directory at the same +# level as myplc, where plc_config.py lives. If we are in a +# MyPLC environment, plc_config.py has already been installed +# in site-packages. +myplc = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + \ + os.sep + "myplc" + +class Config: + """ + Parse the bash/Python/PHP version of the configuration file. Very + fast but no type conversions. + """ + + def __init__(self, file = "/etc/planetlab/plc_config"): + # Load plc_config + try: + execfile(file, self.__dict__) + except: + # Try myplc directory + try: + execfile(myplc + os.sep + "plc_config", self.__dict__) + except: + raise PLCAPIError("Could not find plc_config in " + \ + file + ", " + \ + myplc + os.sep + "plc_config") + +class XMLConfig: + """ + Parse the XML configuration file directly. Takes longer but is + presumably more accurate. + """ + + def __init__(self, file = "/etc/planetlab/plc_config.xml"): + try: + from plc_config import PLCConfiguration + except: + sys.path.append(myplc) + from plc_config import PLCConfiguration + + # Load plc_config.xml + try: + cfg = PLCConfiguration(file) + except: + # Try myplc directory + try: + cfg = PLCConfiguration(myplc + os.sep + "plc_config.xml") + except: + raise PLCAPIError("Could not find plc_config.xml in " + \ + file + ", " + \ + myplc + os.sep + "plc_config.xml") + + for (category, variablelist) in cfg.variables().values(): + for variable in variablelist.values(): + # Try to cast each variable to an appropriate Python + # type. + if variable['type'] == "int": + value = int(variable['value']) + elif variable['type'] == "double": + value = float(variable['value']) + elif variable['type'] == "boolean": + if variable['value'] == "true": + value = True + else: + value = False + else: + value = variable['value'] + + # Variables are split into categories such as + # "plc_api", "plc_db", etc. Within each category are + # variables such as "host", "port", etc. For backward + # compatibility, refer to variables by their shell + # names. + shell_name = category['id'].upper() + "_" + variable['id'].upper() + setattr(self, shell_name, value) + +if __name__ == '__main__': + import pprint + pprint = pprint.PrettyPrinter() + pprint.pprint(Config().__dict__.items()) diff --git a/PLC/Debug.py b/PLC/Debug.py new file mode 100644 index 0000000..b8dac85 --- /dev/null +++ b/PLC/Debug.py @@ -0,0 +1,54 @@ +import time +import sys +import syslog + +class unbuffered: + """ + Write to /var/log/httpd/error_log. See + + http://www.modpython.org/FAQ/faqw.py?req=edit&file=faq02.003.htp + """ + + def write(self, data): + sys.stderr.write(data) + sys.stderr.flush() + +log = unbuffered() + +def profile(callable): + """ + Prints the runtime of the specified callable. Use as a decorator, e.g., + + @profile + def foo(...): + ... + + Or, equivalently, + + def foo(...): + ... + foo = profile(foo) + + Or inline: + + result = profile(foo)(...) + """ + + def wrapper(*args, **kwds): + start = time.time() + result = callable(*args, **kwds) + end = time.time() + args = map(str, args) + args += ["%s = %s" % (name, str(value)) for (name, value) in kwds.items()] + print >> log, "%s (%s): %f s" % (callable.__name__, ", ".join(args), end - start) + return result + + return wrapper + +if __name__ == "__main__": + def sleep(seconds = 1): + time.sleep(seconds) + + sleep = profile(sleep) + + sleep(1) diff --git a/PLC/EventObjects.py b/PLC/EventObjects.py new file mode 100644 index 0000000..52b44c7 --- /dev/null +++ b/PLC/EventObjects.py @@ -0,0 +1,63 @@ +# +# Functions for interacting with the events table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: EventObjects.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table + +class EventObject(Row): + """ + Representation of a row in the event_object table. + """ + + table_name = 'event_object' + primary_key = 'event_id' + fields = { + 'event_id': Parameter(int, "Event identifier"), + 'person_id': Parameter(int, "Identifier of person responsible for event, if any"), + 'node_id': Parameter(int, "Identifier of node responsible for event, if any"), + 'fault_code': Parameter(int, "Event fault code"), + 'call_name': Parameter(str, "Call responsible for this event"), + 'call': Parameter(str, "Call responsible for this event, including paramters"), + 'message': Parameter(str, "High level description of this event"), + 'runtime': Parameter(float, "Runtime of event"), + 'time': Parameter(int, "Date and time that the event took place, in seconds since UNIX epoch", ro = True), + 'object_id': Parameter(int, "ID of objects affected by this event"), + 'object_type': Parameter(str, "What type of object is this event affecting") + } + +class EventObjects(Table): + """ + Representation of row(s) from the event_object table in the database. + """ + + def __init__(self, api, event_filter = None, columns = None): + Table.__init__(self, api, EventObject, columns) + + sql = "SELECT %s FROM view_event_objects WHERE True" % \ + ", ".join(self.columns) + + if event_filter is not None: + if isinstance(event_filter, (list, tuple, set)): + event_filter = Filter(EventObject.fields, {'event_id': event_filter}) + sql += " AND (%s) %s" % event_filter.sql(api, "OR") + elif isinstance(event_filter, dict): + event_filter = Filter(EventObject.fields, event_filter) + sql += " AND (%s) %s" % event_filter.sql(api, "AND") + elif isinstance (event_filter, int): + event_filter = Filter(EventObject.fields, {'event_id':[event_filter]}) + sql += " AND (%s) %s" % event_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong event object filter %r"%event_filter +# with new filtering, caller needs to set this explicitly +# sql += " ORDER BY %s" % EventObject.primary_key + + self.selectall(sql) diff --git a/PLC/Events.py b/PLC/Events.py new file mode 100644 index 0000000..0d319cf --- /dev/null +++ b/PLC/Events.py @@ -0,0 +1,79 @@ +# +# Functions for interacting with the events table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Events.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table + +class Event(Row): + """ + Representation of a row in the events table. + """ + + table_name = 'events' + primary_key = 'event_id' + fields = { + 'event_id': Parameter(int, "Event identifier"), + 'person_id': Parameter(int, "Identifier of person responsible for event, if any"), + 'node_id': Parameter(int, "Identifier of node responsible for event, if any"), + 'auth_type': Parameter(int, "Type of auth used. i.e. AuthMethod"), + 'fault_code': Parameter(int, "Event fault code"), + 'call_name': Parameter(str, "Call responsible for this event"), + 'call': Parameter(str, "Call responsible for this event, including paramters"), + 'message': Parameter(str, "High level description of this event"), + 'runtime': Parameter(float, "Runtime of event"), + 'time': Parameter(int, "Date and time that the event took place, in seconds since UNIX epoch", ro = True), + 'object_ids': Parameter([int], "IDs of objects affected by this event"), + 'object_types': Parameter([str], "What type of object were affected by this event") + } + + def add_object(self, object_type, object_id, commit = True): + """ + Relate object to this event. + """ + + assert 'event_id' in self + + event_id = self['event_id'] + + if 'object_ids' not in self: + self['object_ids'] = [] + + if object_id not in self['object_ids']: + self.api.db.do("INSERT INTO event_object (event_id, object_id, object_type)" \ + " VALUES(%(event_id)d, %(object_id)d, %(object_type)s)", + locals()) + + if commit: + self.api.db.commit() + + self['object_ids'].append(object_id) + +class Events(Table): + """ + Representation of row(s) from the events table in the database. + """ + + def __init__(self, api, event_filter = None, columns = None): + Table.__init__(self, api, Event, columns) + + sql = "SELECT %s FROM view_events WHERE True" % \ + ", ".join(self.columns) + + if event_filter is not None: + if isinstance(event_filter, (list, tuple, set)): + event_filter = Filter(Event.fields, {'event_id': event_filter}) + elif isinstance(event_filter, dict): + event_filter = Filter(Event.fields, event_filter) + sql += " AND (%s) %s" % event_filter.sql(api) +# with new filtering, caller needs to set this explicitly +# sql += " ORDER BY %s" % Event.primary_key + self.selectall(sql) diff --git a/PLC/Faults.py b/PLC/Faults.py new file mode 100644 index 0000000..e3d46e5 --- /dev/null +++ b/PLC/Faults.py @@ -0,0 +1,67 @@ +# +# PLCAPI XML-RPC faults +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# $Id: Faults.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import xmlrpclib + +class PLCFault(xmlrpclib.Fault): + def __init__(self, faultCode, faultString, extra = None): + if extra: + faultString += ": " + extra + xmlrpclib.Fault.__init__(self, faultCode, faultString) + +class PLCInvalidAPIMethod(PLCFault): + def __init__(self, method, role = None, extra = None): + faultString = "Invalid method " + method + if role: + faultString += " for role " + role + PLCFault.__init__(self, 100, faultString, extra) + +class PLCInvalidArgumentCount(PLCFault): + def __init__(self, got, min, max = min, extra = None): + if min != max: + expected = "%d-%d" % (min, max) + else: + expected = "%d" % min + faultString = "Expected %s arguments, got %d" % \ + (expected, got) + PLCFault.__init__(self, 101, faultString, extra) + +class PLCInvalidArgument(PLCFault): + def __init__(self, extra = None, name = None): + if name is not None: + faultString = "Invalid %s value" % name + else: + faultString = "Invalid argument" + PLCFault.__init__(self, 102, faultString, extra) + +class PLCAuthenticationFailure(PLCFault): + def __init__(self, extra = None): + faultString = "Failed to authenticate call" + PLCFault.__init__(self, 103, faultString, extra) + +class PLCDBError(PLCFault): + def __init__(self, extra = None): + faultString = "Database error" + PLCFault.__init__(self, 106, faultString, extra) + +class PLCPermissionDenied(PLCFault): + def __init__(self, extra = None): + faultString = "Permission denied" + PLCFault.__init__(self, 108, faultString, extra) + +class PLCNotImplemented(PLCFault): + def __init__(self, extra = None): + faultString = "Not fully implemented" + PLCFault.__init__(self, 109, faultString, extra) + +class PLCAPIError(PLCFault): + def __init__(self, extra = None): + faultString = "Internal API error" + PLCFault.__init__(self, 111, faultString, extra) diff --git a/PLC/Filter.py b/PLC/Filter.py new file mode 100644 index 0000000..4e950f1 --- /dev/null +++ b/PLC/Filter.py @@ -0,0 +1,203 @@ +from types import StringTypes +try: + set +except NameError: + from sets import Set + set = Set + +import time + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed, python_type + +class Filter(Parameter, dict): + """ + A type of parameter that represents a filter on one or more + columns of a database table. + Special features provide support for negation, upper and lower bounds, + as well as sorting and clipping. + + + fields should be a dictionary of field names and types + Only filters on non-sequence type fields are supported. + example : fields = {'node_id': Parameter(int, "Node identifier"), + 'hostname': Parameter(int, "Fully qualified hostname", max = 255), + ...} + + + filter should be a dictionary of field names and values + representing the criteria for filtering. + example : filter = { 'hostname' : '*.edu' , site_id : [34,54] } + Whether the filter represents an intersection (AND) or a union (OR) + of these criteria is determined by the join_with argument + provided to the sql method below + + Special features: + + * a field starting with the ~ character means negation. + example : filter = { '~peer_id' : None } + + * a field starting with < [ ] or > means lower than or greater than + < > uses strict comparison + [ ] is for using <= or >= instead + example : filter = { ']event_id' : 2305 } + example : filter = { '>time' : 1178531418 } + in this example the integer value denotes a unix timestamp + + * if a value is a sequence type, then it should represent + a list of possible values for that field + example : filter = { 'node_id' : [12,34,56] } + + * a (string) value containing either a * or a % character is + treated as a (sql) pattern; * are replaced with % that is the + SQL wildcard character. + example : filter = { 'hostname' : '*.jp' } + + * fields starting with - are special and relate to row selection, i.e. sorting and clipping + * '-SORT' : a field name, or an ordered list of field names that are used for sorting + * these fields may start with + (default) or - for denoting increasing or decreasing order + example : filter = { '-SORT' : [ '+node_id', '-hostname' ] } + * '-OFFSET' : the number of first rows to be ommitted + * '-LIMIT' : the amount of rows to be returned + example : filter = { '-OFFSET' : 100, 'LIMIT':25} + + A realistic example would read + GetNodes ( { 'hostname' : '*.edu' , '-SORT' : 'hostname' , '-OFFSET' : 30 , '-LIMIT' : 25 } ) + and that would return nodes matching '*.edu' in alphabetical order from 31th to 55th + """ + + def __init__(self, fields = {}, filter = {}, doc = "Attribute filter"): + # Store the filter in our dict instance + dict.__init__(self, filter) + + # Declare ourselves as a type of parameter that can take + # either a value or a list of values for each of the specified + # fields. + self.fields = {} + + for field, expected in fields.iteritems(): + # Cannot filter on sequences + if python_type(expected) in (list, tuple, set): + continue + + # Accept either a value or a list of values of the specified type + self.fields[field] = Mixed(expected, [expected]) + + # Null filter means no filter + Parameter.__init__(self, self.fields, doc = doc, nullok = True) + + # this code is not used anymore + # at some point the select in the DB for event objects was done on + # the events table directly, that is stored as a timestamp, thus comparisons + # needed to be done based on SQL timestamps as well + def unix2timestamp (self,unix): + s = time.gmtime(unix) + return "TIMESTAMP'%04d-%02d-%02d %02d:%02d:%02d'" % (s.tm_year,s.tm_mon,s.tm_mday, + s.tm_hour,s.tm_min,s.tm_sec) + + def sql(self, api, join_with = "AND"): + """ + Returns a SQL conditional that represents this filter. + """ + + # So that we always return something + if join_with == "AND": + conditionals = ["True"] + elif join_with == "OR": + conditionals = ["False"] + else: + assert join_with in ("AND", "OR") + + # init + sorts = [] + clips = [] + + for field, value in self.iteritems(): + # handle negation, numeric comparisons + # simple, 1-depth only mechanism + + modifiers={'~' : False, + '<' : False, '>' : False, + '[' : False, ']' : False, + '-' : False, + } + + for char in modifiers.keys(): + if field[0] == char: + modifiers[char]=True; + field = field[1:] + break + + # filter on fields + if not modifiers['-']: + if field not in self.fields: + raise PLCInvalidArgument, "Invalid filter field '%s'" % field + + if isinstance(value, (list, tuple, set)): + # Turn empty list into (NULL) instead of invalid () + if not value: + value = [None] + + operator = "IN" + value = map(str, map(api.db.quote, value)) + value = "(%s)" % ", ".join(value) + else: + if value is None: + operator = "IS" + value = "NULL" + elif isinstance(value, StringTypes) and \ + (value.find("*") > -1 or value.find("%") > -1): + operator = "LIKE" + value = str(api.db.quote(value.replace("*", "%"))) + else: + operator = "=" + if modifiers['<']: + operator='<' + if modifiers['>']: + operator='>' + if modifiers['[']: + operator='<=' + if modifiers[']']: + operator='>=' + else: + value = str(api.db.quote(value)) + + clause = "%s %s %s" % (field, operator, value) + + if modifiers['~']: + clause = " ( NOT %s ) " % (clause) + + conditionals.append(clause) + # sorting and clipping + else: + if field not in ('SORT','OFFSET','LIMIT'): + raise PLCInvalidArgument, "Invalid filter, unknown sort and clip field %r"%field + # sorting + if field == 'SORT': + if not isinstance(value,(list,tuple,set)): + value=[value] + for field in value: + order = 'ASC' + if field[0] == '+': + field = field[1:] + elif field[0] == '-': + field = field[1:] + order = 'DESC' + if field not in self.fields: + raise PLCInvalidArgument, "Invalid field %r in SORT filter"%field + sorts.append("%s %s"%(field,order)) + # clipping + elif field == 'OFFSET': + clips.append("OFFSET %d"%value) + # clipping continued + elif field == 'LIMIT' : + clips.append("LIMIT %d"%value) + + where_part = (" %s " % join_with).join(conditionals) + clip_part = "" + if sorts: + clip_part += " ORDER BY " + ",".join(sorts) + if clips: + clip_part += " " + " ".join(clips) +# print 'where_part=',where_part,'clip_part',clip_part + return (where_part,clip_part) diff --git a/PLC/GPG.py b/PLC/GPG.py new file mode 100644 index 0000000..457c32b --- /dev/null +++ b/PLC/GPG.py @@ -0,0 +1,183 @@ +# +# Python "binding" for GPG. I'll write GPGME bindings eventually. The +# intent is to use GPG to sign method calls, as a way of identifying +# and authenticating peers. Calls should still go over an encrypted +# transport such as HTTPS, with certificate checking. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: GPG.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import os +import xmlrpclib +import shutil +from types import StringTypes +from StringIO import StringIO +from xml.dom import minidom +from xml.dom.ext import Canonicalize +from subprocess import Popen, PIPE, call +from tempfile import NamedTemporaryFile, mkdtemp + +from PLC.Faults import * + +def canonicalize(args, methodname = None, methodresponse = False): + """ + Returns a canonicalized XML-RPC representation of the specified + method call (methodname != None) or response (methodresponse = + True). + """ + + xml = xmlrpclib.dumps(args, methodname, methodresponse, encoding = 'utf-8', allow_none = 1) + dom = minidom.parseString(xml) + + # Canonicalize(), though it claims to, does not encode unicode + # nodes to UTF-8 properly and throws an exception unless you write + # the stream to a file object, so just encode it ourselves. + buf = StringIO() + Canonicalize(dom, output = buf) + xml = buf.getvalue().encode('utf-8') + + return xml + +def gpg_export(keyring, armor = True): + """ + Exports the specified public keyring file. + """ + + homedir = mkdtemp() + args = ["gpg", "--batch", "--no-tty", + "--homedir", homedir, + "--no-default-keyring", + "--keyring", keyring, + "--export"] + if armor: + args.append("--armor") + + p = Popen(args, stdin = PIPE, stdout = PIPE, stderr = PIPE, close_fds = True) + export = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + # Clean up + shutil.rmtree(homedir) + + if rc: + raise PLCAuthenticationFailure, "GPG export failed with return code %d: %s" % (rc, err) + + return export + +def gpg_sign(args, secret_keyring, keyring, methodname = None, methodresponse = False, detach_sign = True): + """ + Signs the specified method call (methodname != None) or response + (methodresponse == True) using the specified GPG keyring files. If + args is not a tuple representing the arguments to the method call + or the method response value, then it should be a string + representing a generic message to sign (detach_sign == True) or + sign/encrypt (detach_sign == False) specified). Returns the + detached signature (detach_sign == True) or signed/encrypted + message (detach_sign == False). + """ + + # Accept either an opaque string blob or a Python tuple + if isinstance(args, StringTypes): + message = args + elif isinstance(args, tuple): + message = canonicalize(args, methodname, methodresponse) + + # Use temporary trustdb + homedir = mkdtemp() + + cmd = ["gpg", "--batch", "--no-tty", + "--homedir", homedir, + "--no-default-keyring", + "--secret-keyring", secret_keyring, + "--keyring", keyring, + "--armor"] + + if detach_sign: + cmd.append("--detach-sign") + else: + cmd.append("--sign") + + p = Popen(cmd, stdin = PIPE, stdout = PIPE, stderr = PIPE) + p.stdin.write(message) + p.stdin.close() + signature = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + # Clean up + shutil.rmtree(homedir) + + if rc: + raise PLCAuthenticationFailure, "GPG signing failed with return code %d: %s" % (rc, err) + + return signature + +def gpg_verify(args, key, signature = None, methodname = None, methodresponse = False): + """ + Verifies the signature of the specified method call (methodname != + None) or response (methodresponse = True) using the specified + public key material. If args is not a tuple representing the + arguments to the method call or the method response value, then it + should be a string representing a generic message to verify (if + signature is specified) or verify/decrypt (if signature is not + specified). + """ + + # Accept either an opaque string blob or a Python tuple + if isinstance(args, StringTypes): + message = args + else: + message = canonicalize(args, methodname, methodresponse) + + # Write public key to temporary file + if os.path.exists(key): + keyfile = None + keyfilename = key + else: + keyfile = NamedTemporaryFile(suffix = '.pub') + keyfile.write(key) + keyfile.flush() + keyfilename = keyfile.name + + # Import public key into temporary keyring + homedir = mkdtemp() + call(["gpg", "--batch", "--no-tty", "--homedir", homedir, "--import", keyfilename], + stdin = PIPE, stdout = PIPE, stderr = PIPE) + + cmd = ["gpg", "--batch", "--no-tty", + "--homedir", homedir] + + if signature is not None: + # Write detached signature to temporary file + sigfile = NamedTemporaryFile() + sigfile.write(signature) + sigfile.flush() + cmd += ["--verify", sigfile.name, "-"] + else: + # Implicit signature + sigfile = None + cmd.append("--decrypt") + + p = Popen(cmd, stdin = PIPE, stdout = PIPE, stderr = PIPE) + p.stdin.write(message) + p.stdin.close() + if signature is None: + message = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + # Clean up + shutil.rmtree(homedir) + if sigfile: + sigfile.close() + if keyfile: + keyfile.close() + + if rc: + raise PLCAuthenticationFailure, "GPG verification failed with return code %d: %s" % (rc, err) + + return message diff --git a/PLC/InitScripts.py b/PLC/InitScripts.py new file mode 100644 index 0000000..9f864d2 --- /dev/null +++ b/PLC/InitScripts.py @@ -0,0 +1,66 @@ +# +# Functions for interacting with the initscripts table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# + +from types import StringTypes +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table + +class InitScript(Row): + """ + Representation of a row in the initscripts table. To use, + instantiate with a dict of values. + """ + + table_name = 'initscripts' + primary_key = 'initscript_id' + join_tables = [] + fields = { + 'initscript_id': Parameter(int, "Initscript identifier"), + 'name': Parameter(str, "Initscript name", max = 254), + 'enabled': Parameter(bool, "Initscript is active"), + 'script': Parameter(str, "Initscript"), + } + + def validate_name(self, name): + """ + validates the script name + """ + + conflicts = InitScripts(self.api, [name]) + for initscript in conflicts: + if 'initscript_id' not in self or self['initscript_id'] != initscript['initscript_id']: + raise PLCInvalidArgument, "Initscript name already in use" + + return name + + +class InitScripts(Table): + """ + Representation of the initscipts table in the database. + """ + + def __init__(self, api, initscript_filter = None, columns = None): + Table.__init__(self, api, InitScript, columns) + + sql = "SELECT %s FROM initscripts WHERE True" % \ + ", ".join(self.columns) + + if initscript_filter is not None: + if isinstance(initscript_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), initscript_filter) + strs = filter(lambda x: isinstance(x, StringTypes), initscript_filter) + initscript_filter = Filter(InitScript.fields, {'initscript_id': ints, 'name': strs }) + sql += " AND (%s) %s" % initscript_filter.sql(api, "OR") + elif isinstance(initscript_filter, dict): + initscript_filter = Filter(InitScript.fields, initscript_filter) + sql += " AND (%s) %s" % initscript_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/PLC/KeyTypes.py b/PLC/KeyTypes.py new file mode 100644 index 0000000..920662b --- /dev/null +++ b/PLC/KeyTypes.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the key_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: KeyTypes.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class KeyType(Row): + """ + Representation of a row in the key_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'key_types' + primary_key = 'key_type' + join_tables = ['keys'] + fields = { + 'key_type': Parameter(str, "Key type", max = 20), + } + + def validate_key_type(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Key type must be specified" + + # Make sure key type does not alredy exist + conflicts = KeyTypes(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Key type name already in use" + + return name + +class KeyTypes(Table): + """ + Representation of the key_types table in the database. + """ + + def __init__(self, api, key_types = None): + Table.__init__(self, api, KeyType) + + sql = "SELECT %s FROM key_types" % \ + ", ".join(KeyType.fields) + + if key_types: + sql += " WHERE key_type IN (%s)" % ", ".join(map(api.db.quote, key_types)) + + self.selectall(sql) diff --git a/PLC/Keys.py b/PLC/Keys.py new file mode 100644 index 0000000..8d22dc2 --- /dev/null +++ b/PLC/Keys.py @@ -0,0 +1,122 @@ +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.KeyTypes import KeyType, KeyTypes + +class Key(Row): + """ + Representation of a row in the keys table. To use, instantiate with a + dict of values. Update as you would a dict. Commit to the database + with sync(). + """ + + table_name = 'keys' + primary_key = 'key_id' + join_tables = ['person_key', 'peer_key'] + fields = { + 'key_id': Parameter(int, "Key identifier"), + 'key_type': Parameter(str, "Key type"), + 'key': Parameter(str, "Key value", max = 4096), + 'person_id': Parameter(int, "User to which this key belongs", nullok = True), + 'peer_id': Parameter(int, "Peer to which this key belongs", nullok = True), + 'peer_key_id': Parameter(int, "Foreign key identifier at peer", nullok = True), + } + + # for Cache + class_key= 'key' + foreign_fields = ['key_type'] + foreign_xrefs = [] + + def validate_key_type(self, key_type): + key_types = [row['key_type'] for row in KeyTypes(self.api)] + if key_type not in key_types: + raise PLCInvalidArgument, "Invalid key type" + return key_type + + def validate_key(self, key): + # Key must not be blacklisted + rows = self.api.db.selectall("SELECT 1 from keys" \ + " WHERE key = %(key)s" \ + " AND is_blacklisted IS True", + locals()) + if rows: + raise PLCInvalidArgument, "Key is blacklisted and cannot be used" + + return key + + def validate(self): + # Basic validation + Row.validate(self) + + assert 'key' in self + key = self['key'] + + if self['key_type'] == 'ssh': + # Accept only SSH version 2 keys without options. From + # sshd(8): + # + # Each protocol version 2 public key consists of: options, + # keytype, base64 encoded key, comment. The options field + # is optional...The comment field is not used for anything + # (but may be convenient for the user to identify the + # key). For protocol version 2 the keytype is ``ssh-dss'' + # or ``ssh-rsa''. + + good_ssh_key = r'^.*(?:ssh-dss|ssh-rsa)[ ]+[A-Za-z0-9+/=]+(?: .*)?$' + if not re.match(good_ssh_key, key, re.IGNORECASE): + raise PLCInvalidArgument, "Invalid SSH version 2 public key" + + def blacklist(self, commit = True): + """ + Permanently blacklist key (and all other identical keys), + preventing it from ever being added again. Because this could + affect multiple keys associated with multiple accounts, it + should be admin only. + """ + + assert 'key_id' in self + assert 'key' in self + + # Get all matching keys + rows = self.api.db.selectall("SELECT key_id FROM keys WHERE key = %(key)s", + self) + key_ids = [row['key_id'] for row in rows] + assert key_ids + assert self['key_id'] in key_ids + + # Keep the keys in the table + self.api.db.do("UPDATE keys SET is_blacklisted = True" \ + " WHERE key_id IN (%s)" % ", ".join(map(str, key_ids))) + + # But disassociate them from all join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE key_id IN (%s)" % \ + (table, ", ".join(map(str, key_ids)))) + + if commit: + self.api.db.commit() + +class Keys(Table): + """ + Representation of row(s) from the keys table in the + database. + """ + + def __init__(self, api, key_filter = None, columns = None): + Table.__init__(self, api, Key, columns) + + sql = "SELECT %s FROM view_keys WHERE is_blacklisted IS False" % \ + ", ".join(self.columns) + + if key_filter is not None: + if isinstance(key_filter, (list, tuple, set)): + key_filter = Filter(Key.fields, {'key_id': key_filter}) + elif isinstance(key_filter, dict): + key_filter = Filter(Key.fields, key_filter) + sql += " AND (%s) %s" % key_filter.sql(api) + + self.selectall(sql) diff --git a/PLC/Messages.py b/PLC/Messages.py new file mode 100644 index 0000000..0620ac0 --- /dev/null +++ b/PLC/Messages.py @@ -0,0 +1,50 @@ +# +# Functions for interacting with the messages table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Messages.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter + +class Message(Row): + """ + Representation of a row in the messages table. + """ + + table_name = 'messages' + primary_key = 'message_id' + fields = { + 'message_id': Parameter(str, "Message identifier"), + 'subject': Parameter(str, "Message summary", nullok = True), + 'template': Parameter(str, "Message template", nullok = True), + 'enabled': Parameter(bool, "Message is enabled"), + } + +class Messages(Table): + """ + Representation of row(s) from the messages table in the database. + """ + + def __init__(self, api, message_filter = None, columns = None, enabled = None): + Table.__init__(self, api, Message, columns) + + sql = "SELECT %s from messages WHERE True" % \ + ", ".join(self.columns) + + if enabled is not None: + sql += " AND enabled IS %s" % enabled + + if message_filter is not None: + if isinstance(message_filter, (list, tuple, set)): + message_filter = Filter(Message.fields, {'message_id': message_filter}) + sql += " AND (%s) %s" % message_filter.sql(api, "OR") + elif isinstance(message_filter, dict): + message_filter = Filter(Message.fields, message_filter) + sql += " AND (%s) %s" % message_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/PLC/Method.py b/PLC/Method.py new file mode 100644 index 0000000..5e7d09a --- /dev/null +++ b/PLC/Method.py @@ -0,0 +1,372 @@ +# +# Base class for all PLCAPI functions +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Method.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import xmlrpclib +from types import * +import textwrap +import os +import time +import pprint + +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed, python_type, xmlrpc_type +from PLC.Auth import Auth +from PLC.Debug import profile, log +from PLC.Events import Event, Events +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons + +class Method: + """ + Base class for all PLCAPI functions. At a minimum, all PLCAPI + functions must define: + + roles = [list of roles] + accepts = [Parameter(arg1_type, arg1_doc), Parameter(arg2_type, arg2_doc), ...] + returns = Parameter(return_type, return_doc) + call(arg1, arg2, ...): method body + + Argument types may be Python types (e.g., int, bool, etc.), typed + values (e.g., 1, True, etc.), a Parameter, or lists or + dictionaries of possibly mixed types, values, and/or Parameters + (e.g., [int, bool, ...] or {'arg1': int, 'arg2': bool}). + + Once function decorators in Python 2.4 are fully supported, + consider wrapping calls with accepts() and returns() functions + instead of performing type checking manually. + """ + + # Defaults. Could implement authentication and type checking with + # decorators, but they are not supported in Python 2.3 and it + # would be hard to generate documentation without writing a code + # parser. + + roles = [] + accepts = [] + returns = bool + status = "current" + + def call(self, *args): + """ + Method body for all PLCAPI functions. Must override. + """ + + return True + + def __init__(self, api): + self.name = self.__class__.__name__ + self.api = api + + # Auth may set this to a Person instance (if an anonymous + # method, will remain None). + self.caller = None + + # API may set this to a (addr, port) tuple if known + self.source = None + + def __call__(self, *args, **kwds): + """ + Main entry point for all PLCAPI functions. Type checks + arguments, authenticates, and executes call(). + """ + + try: + start = time.time() + (min_args, max_args, defaults) = self.args() + + # Check that the right number of arguments were passed in + if len(args) < len(min_args) or len(args) > len(max_args): + raise PLCInvalidArgumentCount(len(args), len(min_args), len(max_args)) + + for name, value, expected in zip(max_args, args, self.accepts): + self.type_check(name, value, expected, args) + + result = self.call(*args, **kwds) + runtime = time.time() - start + + if self.api.config.PLC_API_DEBUG or hasattr(self, 'message'): + self.log(None, runtime, *args) + + return result + + except PLCFault, fault: + + caller = "" + if isinstance(self.caller, Person): + caller = 'person_id %s' % self.caller['person_id'] + elif isinstance(self.caller, Node): + caller = 'node_id %s' % self.caller['node_id'] + + # Prepend caller and method name to expected faults + fault.faultString = caller + ": " + self.name + ": " + fault.faultString + runtime = time.time() - start + self.log(fault, runtime, *args) + raise fault + + def log(self, fault, runtime, *args): + """ + Log the transaction + """ + + # Do not log system or Get calls + #if self.name.startswith('system') or self.name.startswith('Get'): + # return False + + # Create a new event + event = Event(self.api) + event['fault_code'] = 0 + if fault: + event['fault_code'] = fault.faultCode + event['runtime'] = runtime + + # Redact passwords and sessions + if args and isinstance(args[0], dict): + # what type of auth this is + if args[0].has_key('AuthMethod'): + auth_methods = ['session', 'password', 'capability', 'gpg', 'hmac','anonymous'] + auth_method = args[0]['AuthMethod'] + if auth_method in auth_methods: + event['auth_type'] = auth_method + for password in 'AuthString', 'session': + if args[0].has_key(password): + auth = args[0].copy() + auth[password] = "Removed by API" + args = (auth,) + args[1:] + + # Log call representation + # XXX Truncate to avoid DoS + event['call'] = self.name + pprint.saferepr(args) + event['call_name'] = self.name + + # Both users and nodes can call some methods + if isinstance(self.caller, Person): + event['person_id'] = self.caller['person_id'] + elif isinstance(self.caller, Node): + event['node_id'] = self.caller['node_id'] + + event.sync(commit = False) + + if hasattr(self, 'event_objects') and isinstance(self.event_objects, dict): + for key in self.event_objects.keys(): + for object_id in self.event_objects[key]: + event.add_object(key, object_id, commit = False) + + + # Set the message for this event + if fault: + event['message'] = fault.faultString + elif hasattr(self, 'message'): + event['message'] = self.message + + # Commit + event.sync() + + def help(self, indent = " "): + """ + Text documentation for the method. + """ + + (min_args, max_args, defaults) = self.args() + + text = "%s(%s) -> %s\n\n" % (self.name, ", ".join(max_args), xmlrpc_type(self.returns)) + + text += "Description:\n\n" + lines = [indent + line.strip() for line in self.__doc__.strip().split("\n")] + text += "\n".join(lines) + "\n\n" + + text += "Allowed Roles:\n\n" + if not self.roles: + roles = ["any"] + else: + roles = self.roles + text += indent + ", ".join(roles) + "\n\n" + + def param_text(name, param, indent, step): + """ + Format a method parameter. + """ + + text = indent + + # Print parameter name + if name: + param_offset = 32 + text += name.ljust(param_offset - len(indent)) + else: + param_offset = len(indent) + + # Print parameter type + param_type = python_type(param) + text += xmlrpc_type(param_type) + "\n" + + # Print parameter documentation right below type + if isinstance(param, Parameter): + wrapper = textwrap.TextWrapper(width = 70, + initial_indent = " " * param_offset, + subsequent_indent = " " * param_offset) + text += "\n".join(wrapper.wrap(param.doc)) + "\n" + param = param.type + + text += "\n" + + # Indent struct fields and mixed types + if isinstance(param, dict): + for name, subparam in param.iteritems(): + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, Mixed): + for subparam in param: + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, (list, tuple, set)): + for subparam in param: + text += param_text("", subparam, indent + step, step) + + return text + + text += "Parameters:\n\n" + for name, param in zip(max_args, self.accepts): + text += param_text(name, param, indent, indent) + + text += "Returns:\n\n" + text += param_text("", self.returns, indent, indent) + + return text + + def args(self): + """ + Returns a tuple: + + ((arg1_name, arg2_name, ...), + (arg1_name, arg2_name, ..., optional1_name, optional2_name, ...), + (None, None, ..., optional1_default, optional2_default, ...)) + + That represents the minimum and maximum sets of arguments that + this function accepts and the defaults for the optional arguments. + """ + + # Inspect call. Remove self from the argument list. + max_args = self.call.func_code.co_varnames[1:self.call.func_code.co_argcount] + defaults = self.call.func_defaults + if defaults is None: + defaults = () + + min_args = max_args[0:len(max_args) - len(defaults)] + defaults = tuple([None for arg in min_args]) + defaults + + return (min_args, max_args, defaults) + + def type_check(self, name, value, expected, args): + """ + Checks the type of the named value against the expected type, + which may be a Python type, a typed value, a Parameter, a + Mixed type, or a list or dictionary of possibly mixed types, + values, Parameters, or Mixed types. + + Extraneous members of lists must be of the same type as the + last specified type. For example, if the expected argument + type is [int, bool], then [1, False] and [14, True, False, + True] are valid, but [1], [False, 1] and [14, True, 1] are + not. + + Extraneous members of dictionaries are ignored. + """ + + # If any of a number of types is acceptable + if isinstance(expected, Mixed): + for item in expected: + try: + self.type_check(name, value, item, args) + return + except PLCInvalidArgument, fault: + pass + raise fault + + # If an authentication structure is expected, save it and + # authenticate after basic type checking is done. + if isinstance(expected, Auth): + auth = expected + else: + auth = None + + # Get actual expected type from within the Parameter structure + if isinstance(expected, Parameter): + min = expected.min + max = expected.max + nullok = expected.nullok + expected = expected.type + else: + min = None + max = None + nullok = False + + expected_type = python_type(expected) + + # If value can be NULL + if value is None and nullok: + return + + # Strings are a special case. Accept either unicode or str + # types if a string is expected. + if expected_type in StringTypes and isinstance(value, StringTypes): + pass + + # Integers and long integers are also special types. Accept + # either int or long types if an int or long is expected. + elif expected_type in (IntType, LongType) and isinstance(value, (IntType, LongType)): + pass + + elif not isinstance(value, expected_type): + raise PLCInvalidArgument("expected %s, got %s" % \ + (xmlrpc_type(expected_type), + xmlrpc_type(type(value))), + name) + + # If a minimum or maximum (length, value) has been specified + if expected_type in StringTypes: + if min is not None and \ + len(value.encode(self.api.encoding)) < min: + raise PLCInvalidArgument, "%s must be at least %d bytes long" % (name, min) + if max is not None and \ + len(value.encode(self.api.encoding)) > max: + raise PLCInvalidArgument, "%s must be at most %d bytes long" % (name, max) + elif expected_type in (list, tuple, set): + if min is not None and len(value) < min: + raise PLCInvalidArgument, "%s must contain at least %d items" % (name, min) + if max is not None and len(value) > max: + raise PLCInvalidArgument, "%s must contain at most %d items" % (name, max) + else: + if min is not None and value < min: + raise PLCInvalidArgument, "%s must be > %s" % (name, str(min)) + if max is not None and value > max: + raise PLCInvalidArgument, "%s must be < %s" % (name, str(max)) + + # If a list with particular types of items is expected + if isinstance(expected, (list, tuple, set)): + for i in range(len(value)): + if i >= len(expected): + j = len(expected) - 1 + else: + j = i + self.type_check(name + "[]", value[i], expected[j], args) + + # If a struct with particular (or required) types of items is + # expected. + elif isinstance(expected, dict): + for key in value.keys(): + if key in expected: + self.type_check(name + "['%s']" % key, value[key], expected[key], args) + for key, subparam in expected.iteritems(): + if isinstance(subparam, Parameter) and \ + subparam.optional is not None and \ + not subparam.optional and key not in value.keys(): + raise PLCInvalidArgument("'%s' not specified" % key, name) + + if auth is not None: + auth.check(self, *args) diff --git a/PLC/Methods/.cvsignore b/PLC/Methods/.cvsignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/PLC/Methods/.cvsignore @@ -0,0 +1 @@ +*.pyc diff --git a/PLC/Methods/AddAddressType.py b/PLC/Methods/AddAddressType.py new file mode 100644 index 0000000..9fc771b --- /dev/null +++ b/PLC/Methods/AddAddressType.py @@ -0,0 +1,36 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in ['address_type_id'] + +class AddAddressType(Method): + """ + Adds a new address type. Fields specified in address_type_fields + are used. + + Returns the new address_type_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + address_type_fields = dict(filter(can_update, AddressType.fields.items())) + + accepts = [ + Auth(), + address_type_fields + ] + + returns = Parameter(int, 'New address_type_id (> 0) if successful') + + + def call(self, auth, address_type_fields): + address_type_fields = dict(filter(can_update, address_type_fields.items())) + address_type = AddressType(self.api, address_type_fields) + address_type.sync() + + self.event_objects = {'AddressType' : [address_type['address_type_id']]} + + return address_type['address_type_id'] diff --git a/PLC/Methods/AddAddressTypeToAddress.py b/PLC/Methods/AddAddressTypeToAddress.py new file mode 100644 index 0000000..d69e627 --- /dev/null +++ b/PLC/Methods/AddAddressTypeToAddress.py @@ -0,0 +1,47 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class AddAddressTypeToAddress(Method): + """ + Adds an address type to the specified address. + + PIs may only update addresses of their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']), + Address.fields['address_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_type_id_or_name, address_id): + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.add_address_type(address_type) + self.event_objects = {'Address': [address['address_id']]} + + return 1 diff --git a/PLC/Methods/AddBootState.py b/PLC/Methods/AddBootState.py new file mode 100644 index 0000000..fc75254 --- /dev/null +++ b/PLC/Methods/AddBootState.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.BootStates import BootState, BootStates +from PLC.Auth import Auth + +class AddBootState(Method): + """ + Adds a new node boot state. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + BootState.fields['boot_state'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + boot_state = BootState(self.api) + boot_state['boot_state'] = name + boot_state.sync(insert = True) + + return 1 diff --git a/PLC/Methods/AddConfFile.py b/PLC/Methods/AddConfFile.py new file mode 100644 index 0000000..5604cef --- /dev/null +++ b/PLC/Methods/AddConfFile.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['conf_file_id', 'node_ids', 'nodegroup_ids'] + +class AddConfFile(Method): + """ + Adds a new node configuration file. Any fields specified in + conf_file_fields are used, otherwise defaults are used. + + Returns the new conf_file_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + conf_file_fields = dict(filter(can_update, ConfFile.fields.items())) + + accepts = [ + Auth(), + conf_file_fields + ] + + returns = Parameter(int, 'New conf_file_id (> 0) if successful') + + + def call(self, auth, conf_file_fields): + conf_file_fields = dict(filter(can_update, conf_file_fields.items())) + conf_file = ConfFile(self.api, conf_file_fields) + conf_file.sync() + + self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} + + return conf_file['conf_file_id'] diff --git a/PLC/Methods/AddConfFileToNode.py b/PLC/Methods/AddConfFileToNode.py new file mode 100644 index 0000000..2d1542c --- /dev/null +++ b/PLC/Methods/AddConfFileToNode.py @@ -0,0 +1,51 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class AddConfFileToNode(Method): + """ + Adds a configuration file to the specified node. If the node is + already linked to the configuration file, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, conf_file_id, node_id_or_hostname): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Link configuration file to node + if node['node_id'] not in conf_file['node_ids']: + conf_file.add_node(node) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'Node': [node['node_id']] } + + return 1 diff --git a/PLC/Methods/AddConfFileToNodeGroup.py b/PLC/Methods/AddConfFileToNodeGroup.py new file mode 100644 index 0000000..6ff642c --- /dev/null +++ b/PLC/Methods/AddConfFileToNodeGroup.py @@ -0,0 +1,50 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +class AddConfFileToNodeGroup(Method): + """ + Adds a configuration file to the specified node group. If the node + group is already linked to the configuration file, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, conf_file_id, nodegroup_id_or_name): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get node + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such node group" + nodegroup = nodegroups[0] + + # Link configuration file to node + if nodegroup['nodegroup_id'] not in conf_file['nodegroup_ids']: + conf_file.add_nodegroup(nodegroup) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'NodeGroup': [nodegroup['nodegroup_id']] } + + return 1 diff --git a/PLC/Methods/AddInitScript.py b/PLC/Methods/AddInitScript.py new file mode 100644 index 0000000..8c247cb --- /dev/null +++ b/PLC/Methods/AddInitScript.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['initscript_id'] + +class AddInitScript(Method): + """ + Adds a new initscript. Any fields specified in initscript_fields + are used, otherwise defaults are used. + + Returns the new initscript_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + initscript_fields = dict(filter(can_update, InitScript.fields.items())) + + accepts = [ + Auth(), + initscript_fields + ] + + returns = Parameter(int, 'New initscript_id (> 0) if successful') + + + def call(self, auth, initscript_fields): + initscript_fields = dict(filter(can_update, initscript_fields.items())) + initscript = InitScript(self.api, initscript_fields) + initscript.sync() + + self.event_objects = {'InitScript': [initscript['initscript_id']]} + + return initscript['initscript_id'] diff --git a/PLC/Methods/AddKeyType.py b/PLC/Methods/AddKeyType.py new file mode 100644 index 0000000..b3690a8 --- /dev/null +++ b/PLC/Methods/AddKeyType.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import Auth + +class AddKeyType(Method): + """ + Adds a new key type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + KeyType.fields['key_type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + key_type = KeyType(self.api) + key_type['key_type'] = name + key_type.sync(insert = True) + + return 1 diff --git a/PLC/Methods/AddMessage.py b/PLC/Methods/AddMessage.py new file mode 100644 index 0000000..62a2da7 --- /dev/null +++ b/PLC/Methods/AddMessage.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +class AddMessage(Method): + """ + Adds a new message template. Any values specified in + message_fields are used, otherwise defaults are used. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Message.fields, + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, message_fields): + message = Message(self.api, message_fields) + message.sync(insert = True) + + return 1 diff --git a/PLC/Methods/AddNetworkMethod.py b/PLC/Methods/AddNetworkMethod.py new file mode 100644 index 0000000..11f3845 --- /dev/null +++ b/PLC/Methods/AddNetworkMethod.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import Auth + +class AddNetworkMethod(Method): + """ + Adds a new network method. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkMethod.fields['method'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_method = NetworkMethod(self.api) + network_method['method'] = name + network_method.sync(insert = True) + + return 1 diff --git a/PLC/Methods/AddNetworkType.py b/PLC/Methods/AddNetworkType.py new file mode 100644 index 0000000..6533053 --- /dev/null +++ b/PLC/Methods/AddNetworkType.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import Auth + +class AddNetworkType(Method): + """ + Adds a new network type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkType.fields['type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_type = NetworkType(self.api) + network_type['type'] = name + network_type.sync(insert = True) + + return 1 diff --git a/PLC/Methods/AddNode.py b/PLC/Methods/AddNode.py new file mode 100644 index 0000000..8d253df --- /dev/null +++ b/PLC/Methods/AddNode.py @@ -0,0 +1,66 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['hostname', 'boot_state', 'model', 'version'] + +class AddNode(Method): + """ + Adds a new node. Any values specified in node_fields are used, + otherwise defaults are used. + + PIs and techs may only add nodes to their own sites. Admins may + add nodes to any site. + + Returns the new node_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + node_fields = dict(filter(can_update, Node.fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + node_fields + ] + + returns = Parameter(int, 'New node_id (> 0) if successful') + + def call(self, auth, site_id_or_login_base, node_fields): + node_fields = dict(filter(can_update, node_fields.items())) + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site. + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + assert self.caller['person_id'] not in site['person_ids'] + raise PLCPermissionDenied, "Not allowed to add nodes to specified site" + else: + assert self.caller['person_id'] in site['person_ids'] + + node = Node(self.api, node_fields) + node['site_id'] = site['site_id'] + node.sync() + + self.event_objects = {'Site': [site['site_id']], + 'Node': [node['node_id']]} + self.message = "Node %s created" % node['node_id'] + + return node['node_id'] diff --git a/PLC/Methods/AddNodeGroup.py b/PLC/Methods/AddNodeGroup.py new file mode 100644 index 0000000..34f5f97 --- /dev/null +++ b/PLC/Methods/AddNodeGroup.py @@ -0,0 +1,39 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description'] + +class AddNodeGroup(Method): + """ + Adds a new node group. Any values specified in nodegroup_fields + are used, otherwise defaults are used. + + Returns the new nodegroup_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + nodegroup_fields = dict(filter(can_update, NodeGroup.fields.items())) + + accepts = [ + Auth(), + nodegroup_fields + ] + + returns = Parameter(int, 'New nodegroup_id (> 0) if successful') + + + def call(self, auth, nodegroup_fields): + nodegroup_fields = dict(filter(can_update, nodegroup_fields.items())) + nodegroup = NodeGroup(self.api, nodegroup_fields) + nodegroup.sync() + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']]} + self.message = 'Node group %d created' % nodegroup['nodegroup_id'] + + return nodegroup['nodegroup_id'] diff --git a/PLC/Methods/AddNodeNetwork.py b/PLC/Methods/AddNodeNetwork.py new file mode 100644 index 0000000..6e24bce --- /dev/null +++ b/PLC/Methods/AddNodeNetwork.py @@ -0,0 +1,73 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in ['nodenetwork_id', 'node_id'] + +class AddNodeNetwork(Method): + """ + + Adds a new network for a node. Any values specified in + nodenetwork_fields are used, otherwise defaults are + used. Acceptable values for method may be retrieved via + GetNetworkMethods. Acceptable values for type may be retrieved via + GetNetworkTypes. + + If type is static, ip, gateway, network, broadcast, netmask, and + dns1 must all be specified in nodenetwork_fields. If type is dhcp, + these parameters, even if specified, are ignored. + + PIs and techs may only add networks to their own nodes. Admins may + add networks to any node. + + Returns the new nodenetwork_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + nodenetwork_fields + ] + + returns = Parameter(int, 'New nodenetwork_id (> 0) if successful') + + + def call(self, auth, node_id_or_hostname, nodenetwork_fields): + nodenetwork_fields = dict(filter(can_update, nodenetwork_fields.items())) + + # Check if node exists + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site where the node exists. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to add node network for specified node" + + # Add node network + nodenetwork = NodeNetwork(self.api, nodenetwork_fields) + nodenetwork['node_id'] = node['node_id'] + # if this is the first node network, make it primary + if not node['nodenetwork_ids']: + nodenetwork['is_primary'] = True + nodenetwork.sync() + + # Logging variables + self.object_ids = [node['node_id'], nodenetwork['nodenetwork_id']] + self.messgage = "Node network %d added" % nodenetwork['nodenetwork_id'] + + return nodenetwork['nodenetwork_id'] diff --git a/PLC/Methods/AddNodeNetworkSetting.py b/PLC/Methods/AddNodeNetworkSetting.py new file mode 100644 index 0000000..f02670d --- /dev/null +++ b/PLC/Methods/AddNodeNetworkSetting.py @@ -0,0 +1,89 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +from PLC.Nodes import Nodes +from PLC.Sites import Sites + +class AddNodeNetworkSetting(Method): + """ + Sets the specified setting for the specified nodenetwork + to the specified value. + + In general only tech(s), PI(s) and of course admin(s) are allowed to + do the change, but this is defined in the nodenetwork setting type object. + + Returns the new nodenetwork_setting_id (> 0) if successful, faults + otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + # no other way to refer to a nodenetwork + NodeNetworkSetting.fields['nodenetwork_id'], + Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name']), + NodeNetworkSetting.fields['value'], + ] + + returns = Parameter(int, 'New nodenetwork_setting_id (> 0) if successful') + + object_type = 'NodeNetwork' + + + def call(self, auth, nodenetwork_id, nodenetwork_setting_type_id_or_name, value): + nodenetworks = NodeNetworks(self.api, [nodenetwork_id]) + if not nodenetworks: + raise PLCInvalidArgument, "No such nodenetwork %r"%nodenetwork_id + nodenetwork = nodenetworks[0] + + nodenetwork_setting_types = NodeNetworkSettingTypes(self.api, [nodenetwork_setting_type_id_or_name]) + if not nodenetwork_setting_types: + raise PLCInvalidArgument, "No such nodenetwork setting type %r"%nodenetwork_setting_type_id_or_name + nodenetwork_setting_type = nodenetwork_setting_types[0] + + # checks for existence - does not allow several different settings + conflicts = NodeNetworkSettings(self.api, + {'nodenetwork_id':nodenetwork['nodenetwork_id'], + 'nodenetwork_setting_type_id':nodenetwork_setting_type['nodenetwork_setting_type_id']}) + + if len(conflicts) : + raise PLCInvalidArgument, "Nodenetwork %d already has setting %d"%(nodenetwork['nodenetwork_id'], + nodenetwork_setting_type['nodenetwork_setting_type_id']) + + # check permission : it not admin, is the user affiliated with the right site + if 'admin' not in self.caller['roles']: + # locate node + node = Nodes (self.api,[nodenetwork['node_id']])[0] + # locate site + site = Sites (self.api, [node['site_id']])[0] + # check caller is affiliated with this site + if self.caller['person_id'] not in site['person_ids']: + raise PLCPermissionDenied, "Not a member of the hosting site %s"%site['abbreviated_site'] + + required_min_role = nodenetwork_setting_type ['min_role_id'] + if required_min_role is not None and \ + min(self.caller['role_ids']) > required_min_role: + raise PLCPermissionDenied, "Not allowed to modify the specified nodenetwork setting, requires role %d",required_min_role + + nodenetwork_setting = NodeNetworkSetting(self.api) + nodenetwork_setting['nodenetwork_id'] = nodenetwork['nodenetwork_id'] + nodenetwork_setting['nodenetwork_setting_type_id'] = nodenetwork_setting_type['nodenetwork_setting_type_id'] + nodenetwork_setting['value'] = value + + nodenetwork_setting.sync() + self.object_ids = [nodenetwork_setting['nodenetwork_setting_id']] + + return nodenetwork_setting['nodenetwork_setting_id'] diff --git a/PLC/Methods/AddNodeNetworkSettingType.py b/PLC/Methods/AddNodeNetworkSettingType.py new file mode 100644 index 0000000..1c3cc2c --- /dev/null +++ b/PLC/Methods/AddNodeNetworkSettingType.py @@ -0,0 +1,45 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# + + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'category', 'min_role_id'] + +class AddNodeNetworkSettingType(Method): + """ + Adds a new type of nodenetwork setting. + Any fields specified are used, otherwise defaults are used. + + Returns the new nodenetwork_setting_id (> 0) if successful, + faults otherwise. + """ + + roles = ['admin'] + + nodenetwork_setting_type_fields = dict(filter(can_update, NodeNetworkSettingType.fields.items())) + + accepts = [ + Auth(), + nodenetwork_setting_type_fields + ] + + returns = Parameter(int, 'New nodenetwork_setting_id (> 0) if successful') + + + def call(self, auth, nodenetwork_setting_type_fields): + nodenetwork_setting_type_fields = dict(filter(can_update, nodenetwork_setting_type_fields.items())) + nodenetwork_setting_type = NodeNetworkSettingType(self.api, nodenetwork_setting_type_fields) + nodenetwork_setting_type.sync() + + self.object_ids = [nodenetwork_setting_type['nodenetwork_setting_type_id']] + + return nodenetwork_setting_type['nodenetwork_setting_type_id'] diff --git a/PLC/Methods/AddNodeToNodeGroup.py b/PLC/Methods/AddNodeToNodeGroup.py new file mode 100644 index 0000000..a552b11 --- /dev/null +++ b/PLC/Methods/AddNodeToNodeGroup.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class AddNodeToNodeGroup(Method): + """ + Add a node to the specified node group. If the node is + already a member of the nodegroup, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, node_id_or_hostname, nodegroup_id_or_name): + # Get node info + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Get nodegroup info + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + + nodegroup = nodegroups[0] + + # add node to nodegroup + if node['node_id'] not in nodegroup['node_ids']: + nodegroup.add_node(node) + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']], + 'Node': [node['node_id']]} + self.message = 'Node %d added to node group %d' % \ + (node['node_id'], nodegroup['nodegroup_id']) + return 1 diff --git a/PLC/Methods/AddNodeToPCU.py b/PLC/Methods/AddNodeToPCU.py new file mode 100644 index 0000000..c0d5eff --- /dev/null +++ b/PLC/Methods/AddNodeToPCU.py @@ -0,0 +1,74 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AddNodeToPCU(Method): + """ + Adds a node to a port on a PCU. Faults if the node has already + been added to the PCU or if the port is already in use. + + Non-admins may only update PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + PCU.fields['pcu_id'], + Parameter(int, 'PCU port number') + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname, pcu_id, port): + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Get PCU + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + ok = False + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + if pcu['pcu_id'] in site['pcu_ids']: + ok = True + break + if not ok: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + # Add node to PCU + if node['node_id'] in pcu['node_ids']: + raise PLCInvalidArgument, "Node already controlled by PCU" + + if node['site_id'] != pcu['site_id']: + raise PLCInvalidArgument, "Node is at a different site than this PCU" + + if port in pcu['ports']: + raise PLCInvalidArgument, "PCU port already in use" + + pcu.add_node(node, port) + + # Logging variables + self.event_objects = {'Node': [node['node_id']], + 'PCU': [pcu['pcu_id']]} + self.message = 'Node %d added to pcu %d on port %d' % \ + (node['node_id'], pcu['pcu_id'], port) + return 1 diff --git a/PLC/Methods/AddPCU.py b/PLC/Methods/AddPCU.py new file mode 100644 index 0000000..3c46194 --- /dev/null +++ b/PLC/Methods/AddPCU.py @@ -0,0 +1,61 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +can_update = lambda (field, value): field in \ + ['ip', 'hostname', 'protocol', + 'username', 'password', + 'model', 'notes'] + +class AddPCU(Method): + """ + Adds a new power control unit (PCU) to the specified site. Any + fields specified in pcu_fields are used, otherwise defaults are + used. + + PIs and technical contacts may only add PCUs to their own sites. + + Returns the new pcu_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + pcu_fields = dict(filter(can_update, PCU.fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + pcu_fields + ] + + returns = Parameter(int, 'New pcu_id (> 0) if successful') + + + def call(self, auth, site_id_or_login_base, pcu_fields): + pcu_fields = dict(filter(can_update, pcu_fields.items())) + + # Get associated site details + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to add a PCU to that site" + + pcu = PCU(self.api, pcu_fields) + pcu['site_id'] = site['site_id'] + pcu.sync() + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'PCU': [pcu['pcu_id']]} + self.message = 'PCU %d added site %s' % \ + (pcu['pcu_id'], site['site_id']) + + return pcu['pcu_id'] diff --git a/PLC/Methods/AddPCUProtocolType.py b/PLC/Methods/AddPCUProtocolType.py new file mode 100644 index 0000000..76dad3b --- /dev/null +++ b/PLC/Methods/AddPCUProtocolType.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['pcu_type_id', 'port', 'protocol', 'supported'] + +class AddPCUProtocolType(Method): + """ + Adds a new pcu protocol type. + + Returns the new pcu_protocol_type_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + protocol_type_fields = dict(filter(can_update, PCUProtocolType.fields.items())) + + accepts = [ + Auth(), + Mixed(PCUType.fields['pcu_type_id'], + PCUType.fields['model']), + protocol_type_fields + ] + + returns = Parameter(int, 'New pcu_protocol_type_id (> 0) if successful') + + def call(self, auth, pcu_type_id_or_model, protocol_type_fields): + + # Check if pcu type exists + pcu_types = PCUTypes(self.api, [pcu_type_id_or_model]) + if not pcu_types: + raise PLCInvalidArgument, "No such pcu type" + pcu_type = pcu_types[0] + + + # Check if this port is already used + if 'port' not in protocol_type_fields: + raise PLCInvalidArgument, "Must specify a port" + else: + protocol_types = PCUProtocolTypes(self.api, {'pcu_type_id': pcu_type['pcu_type_id']}) + for protocol_type in protocol_types: + if protocol_type['port'] == protocol_type_fields['port']: + raise PLCInvalidArgument, "Port alreay in use" + + protocol_type_fields = dict(filter(can_update, protocol_type_fields.items())) + protocol_type = PCUProtocolType(self.api, protocol_type_fields) + protocol_type['pcu_type_id'] = pcu_type['pcu_type_id'] + protocol_type.sync() + self.event_object = {'PCUProtocolType': [protocol_type['pcu_protocol_type_id']]} + + return protocol_type['pcu_protocol_type_id'] diff --git a/PLC/Methods/AddPCUType.py b/PLC/Methods/AddPCUType.py new file mode 100644 index 0000000..106791a --- /dev/null +++ b/PLC/Methods/AddPCUType.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['model', 'name'] + +class AddPCUType(Method): + """ + Adds a new pcu type. + + Returns the new pcu_type_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + pcu_type_fields = dict(filter(can_update, PCUType.fields.items())) + + accepts = [ + Auth(), + pcu_type_fields + ] + + returns = Parameter(int, 'New pcu_type_id (> 0) if successful') + + + def call(self, auth, pcu_type_fields): + pcu_type_fields = dict(filter(can_update, pcu_type_fields.items())) + pcu_type = PCUType(self.api, pcu_type_fields) + pcu_type.sync() + self.event_object = {'PCUType': [pcu_type['pcu_type_id']]} + + return pcu_type['pcu_type_id'] diff --git a/PLC/Methods/AddPeer.py b/PLC/Methods/AddPeer.py new file mode 100644 index 0000000..d6dc576 --- /dev/null +++ b/PLC/Methods/AddPeer.py @@ -0,0 +1,36 @@ +# +# Thierry Parmentelat - INRIA +# + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Peers import Peer, Peers + +can_update = lambda (field, value): field in \ + ['peername', 'peer_url', 'key', 'cacert'] + +class AddPeer(Method): + """ + Adds a new peer. + + Returns the new peer_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + peer_fields = dict(filter(can_update, Peer.fields.items())) + + accepts = [ + Auth(), + peer_fields + ] + + returns = Parameter(int, "New peer_id (> 0) if successful") + + def call(self, auth, peer_fields): + peer = Peer(self.api, peer_fields); + peer.sync() + self.event_objects = {'Peer': [peer['peer_id']]} + + return peer['peer_id'] diff --git a/PLC/Methods/AddPerson.py b/PLC/Methods/AddPerson.py new file mode 100644 index 0000000..cb0aa71 --- /dev/null +++ b/PLC/Methods/AddPerson.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['first_name', 'last_name', 'title', + 'email', 'password', 'phone', 'url', 'bio'] + +class AddPerson(Method): + """ + Adds a new account. Any fields specified in person_fields are + used, otherwise defaults are used. + + Accounts are disabled by default. To enable an account, use + UpdatePerson(). + + Returns the new person_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + person_fields = dict(filter(can_update, Person.fields.items())) + + accepts = [ + Auth(), + person_fields + ] + + returns = Parameter(int, 'New person_id (> 0) if successful') + + def call(self, auth, person_fields): + person_fields = dict(filter(can_update, person_fields.items())) + person_fields['enabled'] = False + person = Person(self.api, person_fields) + person.sync() + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = 'Person %d added' % person['person_id'] + + return person['person_id'] diff --git a/PLC/Methods/AddPersonKey.py b/PLC/Methods/AddPersonKey.py new file mode 100644 index 0000000..aa4ed00 --- /dev/null +++ b/PLC/Methods/AddPersonKey.py @@ -0,0 +1,59 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +can_update = lambda (field, value): field in ['key_type','key'] + +class AddPersonKey(Method): + """ + Adds a new key to the specified account. + + Non-admins can only modify their own keys. + + Returns the new key_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + key_fields = dict(filter(can_update, Key.fields.items())) + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + key_fields + ] + + returns = Parameter(int, 'New key_id (> 0) if successful') + + def call(self, auth, person_id_or_email, key_fields): + key_fields = dict(filter(can_update, key_fields.items())) + + # Get account details + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # If we are not admin, make sure caller is adding a key to their account + if 'admin' not in self.caller['roles']: + if person['person_id'] != self.caller['person_id']: + raise PLCPermissionDenied, "You may only modify your own keys" + + key = Key(self.api, key_fields) + key.sync(commit = False) + person.add_key(key, commit = True) + + # Logging variables + self.event_objects = {'Person': [person['person_id']], + 'Key': [key['key_id']]} + self.message = 'Key %d added to person %d' % \ + (key['key_id'], person['person_id']) + + return key['key_id'] diff --git a/PLC/Methods/AddPersonToSite.py b/PLC/Methods/AddPersonToSite.py new file mode 100644 index 0000000..7d5ac10 --- /dev/null +++ b/PLC/Methods/AddPersonToSite.py @@ -0,0 +1,56 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AddPersonToSite(Method): + """ + Adds the specified person to the specified site. If the person is + already a member of the site, no errors are returned. Does not + change the person's primary site. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, site_id_or_login_base): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + if site['site_id'] not in person['site_ids']: + site.add_person(person) + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'Person': [person['person_id']]} + self.message = 'Person %d added to site %d' % \ + (person['person_id'], site['site_id']) + return 1 diff --git a/PLC/Methods/AddPersonToSlice.py b/PLC/Methods/AddPersonToSlice.py new file mode 100644 index 0000000..e3392eb --- /dev/null +++ b/PLC/Methods/AddPersonToSlice.py @@ -0,0 +1,61 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class AddPersonToSlice(Method): + """ + Adds the specified person to the specified slice. If the person is + already a member of the slice, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, slice_id_or_name): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # N.B. Allow foreign users to be added to local slices and + # local users to be added to foreign slices (and, of course, + # local users to be added to local slices). + if person['peer_id'] is not None and slice['peer_id'] is not None: + raise PLCInvalidArgument, "Cannot add foreign users to foreign slices" + + # If we are not admin, make sure the caller is a PI + # of the site associated with the slice + if 'admin' not in self.caller['roles']: + if slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to add users to this slice" + + if slice['slice_id'] not in person['slice_ids']: + slice.add_person(person) + + # Logging variables + self.event_objects = {'Person': [person['person_id']], + 'Slice': [slice['slice_id']]} + self.object_ids = [slice['slice_id']] + + return 1 diff --git a/PLC/Methods/AddRole.py b/PLC/Methods/AddRole.py new file mode 100644 index 0000000..7266180 --- /dev/null +++ b/PLC/Methods/AddRole.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Roles import Role, Roles +from PLC.Auth import Auth + +class AddRole(Method): + """ + Adds a new role. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Role.fields['role_id'], + Role.fields['name'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, role_id, name): + role = Role(self.api) + role['role_id'] = role_id + role['name'] = name + role.sync(insert = True) + self.event_objects = {'Role': [role['role_id']]} + + return 1 diff --git a/PLC/Methods/AddRoleToPerson.py b/PLC/Methods/AddRoleToPerson.py new file mode 100644 index 0000000..5a8e241 --- /dev/null +++ b/PLC/Methods/AddRoleToPerson.py @@ -0,0 +1,66 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Roles import Role, Roles + +class AddRoleToPerson(Method): + """ + Grants the specified role to the person. + + PIs can only grant the tech and user roles to users and techs at + their sites. Admins can grant any role to any user. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Role.fields['role_id'], + Role.fields['name']), + Mixed(Person.fields['person_id'], + Person.fields['email']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, role_id_or_name, person_id_or_email): + # Get role + roles = Roles(self.api, [role_id_or_name]) + if not roles: + raise PLCInvalidArgument, "Invalid role '%s'" % unicode(role_id_or_name) + role = roles[0] + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Can only grant lesser (higher) roles to others + if 'admin' not in self.caller['roles'] and \ + role['role_id'] <= min(self.caller['role_ids']): + raise PLCInvalidArgument, "Not allowed to grant that role" + + if role['role_id'] not in person['role_ids']: + person.add_role(role) + + self.event_objects = {'Person': [person['person_id']], + 'Role': [role['role_id']]} + self.message = "Role %d granted to person %d" % \ + (role['role_id'], person['person_id']) + + return 1 diff --git a/PLC/Methods/AddSession.py b/PLC/Methods/AddSession.py new file mode 100644 index 0000000..6f5bc88 --- /dev/null +++ b/PLC/Methods/AddSession.py @@ -0,0 +1,37 @@ +import time + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Sessions import Session, Sessions +from PLC.Persons import Person, Persons + +class AddSession(Method): + """ + Creates and returns a new session key for the specified user. + (Used for website 'user sudo') + """ + + roles = ['admin'] + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + returns = Session.fields['session_id'] + + + def call(self, auth, person_id_or_email): + + persons = Persons(self.api, [person_id_or_email], ['person_id', 'email']) + + if not persons: + raise PLCInvalidArgument, "No such person" + + person = persons[0] + session = Session(self.api) + session['expires'] = int(time.time()) + (24 * 60 * 60) + session.sync(commit = False) + session.add_person(person, commit = True) + + return session['session_id'] diff --git a/PLC/Methods/AddSite.py b/PLC/Methods/AddSite.py new file mode 100644 index 0000000..475c8b1 --- /dev/null +++ b/PLC/Methods/AddSite.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'abbreviated_name', 'login_base', + 'is_public', 'latitude', 'longitude', 'url', + 'max_slices', 'max_slivers', 'enabled'] + +class AddSite(Method): + """ + Adds a new site, and creates a node group for that site. Any + fields specified in site_fields are used, otherwise defaults are + used. + + Returns the new site_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + site_fields = dict(filter(can_update, Site.fields.items())) + + accepts = [ + Auth(), + site_fields + ] + + returns = Parameter(int, 'New site_id (> 0) if successful') + + def call(self, auth, site_fields): + site_fields = dict(filter(can_update, site_fields.items())) + site = Site(self.api, site_fields) + site.sync() + + # Logging variables + self.event_objects = {'Site': [site['site_id']]} + self.message = 'Site %d created' % site['site_id'] + + return site['site_id'] diff --git a/PLC/Methods/AddSiteAddress.py b/PLC/Methods/AddSiteAddress.py new file mode 100644 index 0000000..a3a4eff --- /dev/null +++ b/PLC/Methods/AddSiteAddress.py @@ -0,0 +1,58 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +can_update = lambda (field, value): field in \ + ['line1', 'line2', 'line3', + 'city', 'state', 'postalcode', 'country'] + +class AddSiteAddress(Method): + """ + Adds a new address to a site. Fields specified in + address_fields are used; some are not optional. + + PIs may only add addresses to their own sites. + + Returns the new address_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + address_fields = dict(filter(can_update, Address.fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + address_fields + ] + + returns = Parameter(int, 'New address_id (> 0) if successful') + + def call(self, auth, site_id_or_login_base, address_fields): + address_fields = dict(filter(can_update, address_fields.items())) + + # Get associated site details + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address = Address(self.api, address_fields) + address.sync(commit = False) + site.add_address(address, commit = True) + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'Address': [address['address_id']]} + self.message = 'Address %d assigned to Site %d' % \ + (address['address_id'], site['site_id']) + + return address['address_id'] diff --git a/PLC/Methods/AddSlice.py b/PLC/Methods/AddSlice.py new file mode 100644 index 0000000..6cc056c --- /dev/null +++ b/PLC/Methods/AddSlice.py @@ -0,0 +1,80 @@ +import re + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +can_update = lambda (field, value): field in \ + ['name', 'instantiation', 'url', 'description', 'max_nodes'] + +class AddSlice(Method): + """ + Adds a new slice. Any fields specified in slice_fields are used, + otherwise defaults are used. + + Valid slice names are lowercase and begin with the login_base + (slice prefix) of a valid site, followed by a single + underscore. Thereafter, only letters, numbers, or additional + underscores may be used. + + PIs may only add slices associated with their own sites (i.e., + slice prefixes must always be the login_base of one of their + sites). + + Returns the new slice_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + slice_fields = dict(filter(can_update, Slice.fields.items())) + + accepts = [ + Auth(), + slice_fields + ] + + returns = Parameter(int, 'New slice_id (> 0) if successful') + + def call(self, auth, slice_fields): + slice_fields = dict(filter(can_update, slice_fields.items())) + + # 1. Lowercase. + # 2. Begins with login_base (letters or numbers). + # 3. Then single underscore after login_base. + # 4. Then letters, numbers, or underscores. + name = slice_fields['name'] + good_name = r'^[a-z0-9]+_[a-zA-Z0-9_]+$' + if not name or \ + not re.match(good_name, name): + raise PLCInvalidArgument, "Invalid slice name" + + # Get associated site details + login_base = name.split("_")[0] + sites = Sites(self.api, [login_base]) + if not sites: + raise PLCInvalidArgument, "Invalid slice prefix %s in %s"%(login_base,name) + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Slice prefix %s must be the same as the login_base of one of your sites"%login_base + + if len(site['slice_ids']) >= site['max_slices']: + raise PLCInvalidArgument, "Site %s has reached (%d) its maximum allowable slice count (%d)"%(site['name'], + len(site['slice_ids']), + site['max_slices']) + + if not site['enabled']: + raise PLCInvalidArgument, "Site %s is disabled can cannot create slices" % (site['name']) + + slice = Slice(self.api, slice_fields) + slice['creator_person_id'] = self.caller['person_id'] + slice['site_id'] = site['site_id'] + slice.sync() + + self.event_objects = {'Slice': [slice['slice_id']]} + + return slice['slice_id'] diff --git a/PLC/Methods/AddSliceAttribute.py b/PLC/Methods/AddSliceAttribute.py new file mode 100644 index 0000000..ad32437 --- /dev/null +++ b/PLC/Methods/AddSliceAttribute.py @@ -0,0 +1,113 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class AddSliceAttribute(Method): + """ + Sets the specified attribute of the slice (or sliver, if + node_id_or_hostname is specified) to the specified value. + + Attributes may require the caller to have a particular role in + order to be set or changed. Users may only set attributes of + slices or slivers of which they are members. PIs may only set + attributes of slices or slivers at their sites, or of which they + are members. Admins may set attributes of any slice or sliver. + + Returns the new slice_attribute_id (> 0) if successful, faults + otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(SliceAttribute.fields['slice_id'], + SliceAttribute.fields['name']), + Mixed(SliceAttribute.fields['attribute_type_id'], + SliceAttribute.fields['name']), + Mixed(SliceAttribute.fields['value'], + InitScript.fields['name']), + Mixed(Node.fields['node_id'], + Node.fields['hostname'], + None), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, 'New slice_attribute_id (> 0) if successful') + + def call(self, auth, slice_id_or_name, attribute_type_id_or_name, value, node_id_or_hostname = None, nodegroup_id_or_name = None): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + attribute_types = SliceAttributeTypes(self.api, [attribute_type_id_or_name]) + if not attribute_types: + raise PLCInvalidArgument, "No such slice attribute type" + attribute_type = attribute_types[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if attribute_type['min_role_id'] is not None and \ + min(self.caller['role_ids']) > attribute_type['min_role_id']: + raise PLCPermissionDenied, "Not allowed to set the specified slice attribute" + + # if initscript is specified, validate value + if attribute_type['name'] in ['initscript']: + initscripts = InitScripts(self.api, {'enabled': True, 'name': value}) + if not initscripts: + raise PLCInvalidArgument, "No such plc initscript" + + slice_attribute = SliceAttribute(self.api) + slice_attribute['slice_id'] = slice['slice_id'] + slice_attribute['attribute_type_id'] = attribute_type['attribute_type_id'] + slice_attribute['value'] = unicode(value) + + # Sliver attribute if node is specified + if node_id_or_hostname is not None: + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['node_id'] not in slice['node_ids']: + raise PLCInvalidArgument, "Node not in the specified slice" + slice_attribute['node_id'] = node['node_id'] + + # Sliver attribute shared accross nodes if nodegroup is sepcified + if nodegroup_id_or_name is not None: + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + nodegroup = nodegroups[0] + + slice_attribute['nodegroup_id'] = nodegroup['nodegroup_id'] + + # Check if slice attribute alreay exists + slice_attributes_check = SliceAttributes(self.api, {'slice_id': slice['slice_id'], 'name': attribute_type['name'], 'value': value}) + for slice_attribute_check in slice_attributes_check: + if 'node_id' in slice_attribute and slice_attribute['node_id'] == slice_attribute_check['node_id']: + raise PLCInvalidArgument, "Sliver attribute already exists" + if 'nodegroup_id' in slice_attribute and slice_attribute['nodegroup_id'] == slice_attribute_check['nodegroup_id']: + raise PLCInvalidArgument, "Slice attribute already exists for this nodegroup" + if node_id_or_hostname is None and nodegroup_id_or_name is None: + raise PLCInvalidArgument, "Slice attribute already exists" + + slice_attribute.sync() + self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]} + + return slice_attribute['slice_attribute_id'] diff --git a/PLC/Methods/AddSliceAttributeType.py b/PLC/Methods/AddSliceAttributeType.py new file mode 100644 index 0000000..095ae83 --- /dev/null +++ b/PLC/Methods/AddSliceAttributeType.py @@ -0,0 +1,38 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'min_role_id'] + +class AddSliceAttributeType(Method): + """ + Adds a new type of slice attribute. Any fields specified in + attribute_type_fields are used, otherwise defaults are used. + + Returns the new attribute_type_id (> 0) if successful, faults + otherwise. + """ + + roles = ['admin'] + + attribute_type_fields = dict(filter(can_update, SliceAttributeType.fields.items())) + + accepts = [ + Auth(), + attribute_type_fields + ] + + returns = Parameter(int, 'New attribute_id (> 0) if successful') + + + def call(self, auth, attribute_type_fields): + attribute_type_fields = dict(filter(can_update, attribute_type_fields.items())) + attribute_type = SliceAttributeType(self.api, attribute_type_fields) + attribute_type.sync() + + self.event_objects = {'AttributeType': [attribute_type['attribute_type_id']]} + + return attribute_type['attribute_type_id'] diff --git a/PLC/Methods/AddSliceInstantiation.py b/PLC/Methods/AddSliceInstantiation.py new file mode 100644 index 0000000..0374957 --- /dev/null +++ b/PLC/Methods/AddSliceInstantiation.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Auth import Auth + +class AddSliceInstantiation(Method): + """ + Adds a new slice instantiation state. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + SliceInstantiation.fields['instantiation'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + slice_instantiation = SliceInstantiation(self.api) + slice_instantiation['instantiation'] = name + slice_instantiation.sync(insert = True) + + return 1 diff --git a/PLC/Methods/AddSliceToNodes.py b/PLC/Methods/AddSliceToNodes.py new file mode 100644 index 0000000..d5a2c8c --- /dev/null +++ b/PLC/Methods/AddSliceToNodes.py @@ -0,0 +1,69 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AddSliceToNodes(Method): + """ + Adds the specified slice to the specified nodes. Nodes may be + either local or foreign nodes. + + If the slice is already associated with a node, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + # Get specified nodes, add them to the slice + nodes = Nodes(self.api, node_id_or_hostname_list, ['node_id', 'hostname', 'slice_ids', 'slice_ids_whitelist', 'site_id']) + + for node in nodes: + # check the slice whitelist on each node first + # allow users at site to add node to slice, ignoring whitelist + if node['slice_ids_whitelist'] and \ + slice['slice_id'] not in node['slice_ids_whitelist'] and \ + not set(self.caller['site_ids']).intersection([node['site_id']]): + raise PLCInvalidArgument, "%s is not allowed on %s (not on the whitelist)" % \ + (slice['name'], node['hostname']) + if slice['slice_id'] not in node['slice_ids']: + slice.add_node(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/PLC/Methods/AddSliceToNodesWhitelist.py b/PLC/Methods/AddSliceToNodesWhitelist.py new file mode 100644 index 0000000..a6b4bd1 --- /dev/null +++ b/PLC/Methods/AddSliceToNodesWhitelist.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class AddSliceToNodesWhitelist(Method): + """ + Adds the specified slice to the whitelist on the specified nodes. Nodes may be + either local or foreign nodes. + + If the slice is already associated with a node, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + # Get specified nodes, add them to the slice + nodes = Nodes(self.api, node_id_or_hostname_list) + for node in nodes: + if node['peer_id'] is not None: + raise PLCInvalidArgument, "%s not a local node" % node['hostname'] + if slice['slice_id'] not in node['slice_ids_whitelist']: + slice.add_to_node_whitelist(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/PLC/Methods/AdmAddAddressType.py b/PLC/Methods/AdmAddAddressType.py new file mode 100644 index 0000000..e0cd09d --- /dev/null +++ b/PLC/Methods/AdmAddAddressType.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth +from PLC.Methods.AddAddressType import AddAddressType + +class AdmAddAddressType(AddAddressType): + """ + Deprecated. See AddAddressType. + """ + + status = "deprecated" + + accepts = [ + Auth(), + AddressType.fields['name'] + ] + + def call(self, auth, name): + return AddAddressType.call(self, auth, {'name': name}) diff --git a/PLC/Methods/AdmAddNode.py b/PLC/Methods/AdmAddNode.py new file mode 100644 index 0000000..dda5c99 --- /dev/null +++ b/PLC/Methods/AdmAddNode.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Sites import Site, Sites +from PLC.Auth import Auth +from PLC.Methods.AddNode import AddNode + +can_update = lambda (field, value): field in \ + ['model', 'version'] + +class AdmAddNode(AddNode): + """ + Deprecated. See AddNode. + """ + + status = "deprecated" + + node_fields = dict(filter(can_update, Node.fields.items())) + + accepts = [ + Auth(), + Site.fields['site_id'], + Node.fields['hostname'], + Node.fields['boot_state'], + node_fields + ] + + def call(self, auth, site_id, hostname, boot_state, node_fields = {}): + node_fields['site_id'] = site_id + node_fields['hostname'] = hostname + node_fields['boot_state'] = boot_state + return AddNode.call(self, auth, node_fields) diff --git a/PLC/Methods/AdmAddNodeGroup.py b/PLC/Methods/AdmAddNodeGroup.py new file mode 100644 index 0000000..6bbb59e --- /dev/null +++ b/PLC/Methods/AdmAddNodeGroup.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth +from PLC.Methods.AddNodeGroup import AddNodeGroup + +class AdmAddNodeGroup(AddNodeGroup): + """ + Deprecated. See AddNodeGroup. + """ + + status = "deprecated" + + accepts = [ + Auth(), + NodeGroup.fields['name'], + NodeGroup.fields['description'] + ] + + def call(self, auth, name, description): + return AddNodeGroup.call(self, auth, {'name': name, 'description': description}) diff --git a/PLC/Methods/AdmAddNodeNetwork.py b/PLC/Methods/AdmAddNodeNetwork.py new file mode 100644 index 0000000..c309a77 --- /dev/null +++ b/PLC/Methods/AdmAddNodeNetwork.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth +from PLC.Methods.AddNodeNetwork import AddNodeNetwork + +can_update = lambda (field, value): field not in ['nodenetwork_id', 'node_id', 'method', 'type'] + +class AdmAddNodeNetwork(AddNodeNetwork): + """ + Deprecated. See AddNodeNetwork. + """ + + status = "deprecated" + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Auth(), + NodeNetwork.fields['node_id'], + NodeNetwork.fields['method'], + NodeNetwork.fields['type'], + nodenetwork_fields + ] + + def call(self, auth, node_id, method, type, nodenetwork_fields = {}): + nodenetwork_fields['node_id'] = node_id + nodenetwork_fields['method'] = method + nodenetwork_fields['type'] = type + return AddNodeNetwork.call(self, auth, nodenetwork_fields) diff --git a/PLC/Methods/AdmAddNodeToNodeGroup.py b/PLC/Methods/AdmAddNodeToNodeGroup.py new file mode 100644 index 0000000..dc7eab4 --- /dev/null +++ b/PLC/Methods/AdmAddNodeToNodeGroup.py @@ -0,0 +1,8 @@ +from PLC.Methods.AddNodeToNodeGroup import AddNodeToNodeGroup + +class AdmAddNodeToNodeGroup(AddNodeToNodeGroup): + """ + Deprecated. See AddNodeToNodeGroup. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmAddPerson.py b/PLC/Methods/AdmAddPerson.py new file mode 100644 index 0000000..2b90f61 --- /dev/null +++ b/PLC/Methods/AdmAddPerson.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Methods.AddPerson import AddPerson + +can_update = lambda (field, value): field in \ + ['title', 'email', 'password', 'phone', 'url', 'bio'] + +class AdmAddPerson(AddPerson): + """ + Deprecated. See AddPerson. + """ + + status = "deprecated" + + person_fields = dict(filter(can_update, Person.fields.items())) + + accepts = [ + Auth(), + Person.fields['first_name'], + Person.fields['last_name'], + person_fields + ] + + def call(self, auth, first_name, last_name, person_fields = {}): + person_fields['first_name'] = first_name + person_fields['last_name'] = last_name + return AddPerson.call(self, auth, person_fields) diff --git a/PLC/Methods/AdmAddPersonKey.py b/PLC/Methods/AdmAddPersonKey.py new file mode 100644 index 0000000..05d0a69 --- /dev/null +++ b/PLC/Methods/AdmAddPersonKey.py @@ -0,0 +1,28 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Methods.AddPersonKey import AddPersonKey + +class AdmAddPersonKey(AddPersonKey): + """ + Deprecated. See AddPersonKey. Keys can no longer be marked as + primary, i.e. the is_primary argument does nothing. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Key.fields['key_type'], + Key.fields['key'], + Parameter(int, "Make this key the primary key") + ] + + def call(self, auth, person_id_or_email, key_type, key_value, is_primary): + key_fields = {'key_type': key_type, 'key_value': key_value} + return AddPersonKey.call(self, auth, person_id_or_email, key_fields) diff --git a/PLC/Methods/AdmAddPersonToSite.py b/PLC/Methods/AdmAddPersonToSite.py new file mode 100644 index 0000000..948b06f --- /dev/null +++ b/PLC/Methods/AdmAddPersonToSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.AddPersonToSite import AddPersonToSite + +class AdmAddPersonToSite(AddPersonToSite): + """ + Deprecated. See AddPersonToSite. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmAddSite.py b/PLC/Methods/AdmAddSite.py new file mode 100644 index 0000000..929c0a7 --- /dev/null +++ b/PLC/Methods/AdmAddSite.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth +from PLC.Methods.AddSite import AddSite + +can_update = lambda (field, value): field in \ + ['is_public', 'latitude', 'longitude', 'url'] + +class AdmAddSite(AddSite): + """ + Deprecated. See AddSite. + """ + + status = "deprecated" + + site_fields = dict(filter(can_update, Site.fields.items())) + + accepts = [ + Auth(), + Site.fields['name'], + Site.fields['abbreviated_name'], + Site.fields['login_base'], + site_fields + ] + + def call(self, auth, name, abbreviated_name, login_base, site_fields = {}): + site_fields['name'] = name + site_fields['abbreviated_name'] = abbreviated_name + site_fields['login_base'] = login_base + return AddSite.call(self, auth, site_fields) diff --git a/PLC/Methods/AdmAddSitePowerControlUnit.py b/PLC/Methods/AdmAddSitePowerControlUnit.py new file mode 100644 index 0000000..e9e452e --- /dev/null +++ b/PLC/Methods/AdmAddSitePowerControlUnit.py @@ -0,0 +1,8 @@ +from PLC.Methods.AddPCU import AddPCU + +class AdmAddSitePowerControlUnit(AddPCU): + """ + Deprecated. See AddPCU. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmAssociateNodeToPowerControlUnitPort.py b/PLC/Methods/AdmAssociateNodeToPowerControlUnitPort.py new file mode 100644 index 0000000..9e955be --- /dev/null +++ b/PLC/Methods/AdmAssociateNodeToPowerControlUnitPort.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth +from PLC.Methods.AddNodeToPCU import AddNodeToPCU + +class AdmAssociateNodeToPowerControlUnitPort(AddNodeToPCU): + """ + Deprecated. See AddNodeToPCU. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + Parameter(int, 'PCU port number'), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_id, port, node_id_or_hostname): + return AddNodeToPCU(self, auth, node_id_or_hostname, pcu_id, port) diff --git a/PLC/Methods/AdmAuthCheck.py b/PLC/Methods/AdmAuthCheck.py new file mode 100644 index 0000000..63defa5 --- /dev/null +++ b/PLC/Methods/AdmAuthCheck.py @@ -0,0 +1,8 @@ +from PLC.Methods.AuthCheck import AuthCheck + +class AdmAuthCheck(AuthCheck): + """ + Deprecated. See AuthCheck. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmDeleteAddressType.py b/PLC/Methods/AdmDeleteAddressType.py new file mode 100644 index 0000000..12f0625 --- /dev/null +++ b/PLC/Methods/AdmDeleteAddressType.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteAddressType import DeleteAddressType + +class AdmDeleteAddressType(DeleteAddressType): + """ + Deprecated. See DeleteAddressType. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmDeleteAllPersonKeys.py b/PLC/Methods/AdmDeleteAllPersonKeys.py new file mode 100644 index 0000000..9f038f9 --- /dev/null +++ b/PLC/Methods/AdmDeleteAllPersonKeys.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class AdmDeleteAllPersonKeys(Method): + """ + Deprecated. Functionality can be implemented with GetPersons and + DeleteKey. + + Deletes all of the keys associated with an account. Non-admins may + only delete their own keys. + + Non-admins may only delete their own keys. + + Returns 1 if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to update specified account" + + key_ids = person['key_ids'] + if not key_ids: + return 1 + + # Get associated key details + keys = Keys(self.api, key_ids) + + for key in keys: + key.delete() + + return 1 diff --git a/PLC/Methods/AdmDeleteNode.py b/PLC/Methods/AdmDeleteNode.py new file mode 100644 index 0000000..2ec9ff1 --- /dev/null +++ b/PLC/Methods/AdmDeleteNode.py @@ -0,0 +1,9 @@ +from PLC.Methods.DeleteNode import DeleteNode + +class AdmDeleteNode(DeleteNode): + """ + Deprecated. See DeleteNode. + """ + + status = "deprecated" + diff --git a/PLC/Methods/AdmDeleteNodeGroup.py b/PLC/Methods/AdmDeleteNodeGroup.py new file mode 100644 index 0000000..b5b2cb6 --- /dev/null +++ b/PLC/Methods/AdmDeleteNodeGroup.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteNodeGroup import DeleteNodeGroup + +class AdmDeleteNodeGroup(DeleteNodeGroup): + """ + Deprecated. See DeleteNodeGroup. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmDeleteNodeNetwork.py b/PLC/Methods/AdmDeleteNodeNetwork.py new file mode 100644 index 0000000..d566504 --- /dev/null +++ b/PLC/Methods/AdmDeleteNodeNetwork.py @@ -0,0 +1,24 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Methods.DeleteNodeNetwork import DeleteNodeNetwork + +class AdmDeleteNodeNetwork(DeleteNodeNetwork): + """ + Deprecated. See DeleteNodeNetwork. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + NodeNetwork.fields['nodenetwork_id'] + ] + + def call(self, auth, node_id_or_hostname, nodenetwork_id): + return DeleteNodeNetwork.call(self, auth, nodenetwork_id) diff --git a/PLC/Methods/AdmDeletePerson.py b/PLC/Methods/AdmDeletePerson.py new file mode 100644 index 0000000..ff29e8b --- /dev/null +++ b/PLC/Methods/AdmDeletePerson.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeletePerson import DeletePerson + +class AdmDeletePerson(DeletePerson): + """ + Deprecated. See DeletePerson. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmDeletePersonKeys.py b/PLC/Methods/AdmDeletePersonKeys.py new file mode 100644 index 0000000..fd24eef --- /dev/null +++ b/PLC/Methods/AdmDeletePersonKeys.py @@ -0,0 +1,56 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class AdmDeletePersonKeys(Method): + """ + Deprecated. Functionality can be implemented with GetPersons and + DeleteKey. + + Deletes the specified keys. Non-admins may only delete their own + keys. + + Returns 1 if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + [Key.fields['key_id']] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, key_ids): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to update specified account" + + key_ids = set(key_ids).intersection(person['key_ids']) + if not key_ids: + return 1 + + # Get associated key details + keys = Keys(self.api, key_ids) + + for key in keys: + key.delete() + + return 1 diff --git a/PLC/Methods/AdmDeleteSite.py b/PLC/Methods/AdmDeleteSite.py new file mode 100644 index 0000000..7501ad5 --- /dev/null +++ b/PLC/Methods/AdmDeleteSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteSite import DeleteSite + +class AdmDeleteSite(DeleteSite): + """ + Deprecated. See DeleteSite. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmDeleteSitePowerControlUnit.py b/PLC/Methods/AdmDeleteSitePowerControlUnit.py new file mode 100644 index 0000000..2865224 --- /dev/null +++ b/PLC/Methods/AdmDeleteSitePowerControlUnit.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeletePCU import DeletePCU + +class AdmDeleteSitePowerControlUnit(DeletePCU): + """ + Deprecated. See DeletePCU. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmDisassociatePowerControlUnitPort.py b/PLC/Methods/AdmDisassociatePowerControlUnitPort.py new file mode 100644 index 0000000..5f7c448 --- /dev/null +++ b/PLC/Methods/AdmDisassociatePowerControlUnitPort.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth +from PLC.Methods.DeleteNodeFromPCU import DeleteNodeFromPCU + +class AdmDisassociatePowerControlUnitPort(DeleteNodeFromPCU): + """ + Deprecated. See DeleteNodeFromPCU. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + Parameter(int, 'PCU port number'), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_id, port): + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + + pcu = pcus[0] + + ports = dict(zip(pcu['ports'], pcu['node_ids'])) + if port not in ports: + raise PLCInvalidArgument, "No node on that port or no such port" + + return DeleteNodeFromPCU(self, auth, ports[port], pcu_id) diff --git a/PLC/Methods/AdmGenerateNodeConfFile.py b/PLC/Methods/AdmGenerateNodeConfFile.py new file mode 100644 index 0000000..85789bd --- /dev/null +++ b/PLC/Methods/AdmGenerateNodeConfFile.py @@ -0,0 +1,110 @@ +import random +import base64 + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +class AdmGenerateNodeConfFile(Method): + """ + Deprecated. Functionality can be implemented with GetNodes, + GetNodeNetworks, and UpdateNode. + + Creates a new node configuration file if all network settings are + present. This function will generate a new node key for the + specified node, effectively invalidating any old configuration + files. + + Non-admins can only generate files for nodes at their sites. + + Returns the contents of the file if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(str, "Node configuration file") + + def call(self, auth, node_id_or_hostname): + # Get node information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to generate a configuration file for that node" + + # Get node networks for this node + primary = None + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + primary = nodenetwork + break + if primary is None: + raise PLCInvalidArgument, "No primary network configured" + + # Split hostname into host and domain parts + parts = node['hostname'].split(".", 1) + if len(parts) < 2: + raise PLCInvalidArgument, "Node hostname is invalid" + host = parts[0] + domain = parts[1] + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + node['key'] = base64.b64encode("".join(map(chr, bytes))) + # XXX Boot Manager cannot handle = in the key + node['key'] = node['key'].replace("=", "") + # Save it + node.sync() + + # Generate node configuration file suitable for BootCD + file = "" + + file += 'NODE_ID="%d"\n' % node['node_id'] + file += 'NODE_KEY="%s"\n' % node['key'] + + if primary['mac']: + file += 'NET_DEVICE="%s"\n' % primary['mac'].lower() + + file += 'IP_METHOD="%s"\n' % primary['method'] + + if primary['method'] == 'static': + file += 'IP_ADDRESS="%s"\n' % primary['ip'] + file += 'IP_GATEWAY="%s"\n' % primary['gateway'] + file += 'IP_NETMASK="%s"\n' % primary['netmask'] + file += 'IP_NETADDR="%s"\n' % primary['network'] + file += 'IP_BROADCASTADDR="%s"\n' % primary['broadcast'] + file += 'IP_DNS1="%s"\n' % primary['dns1'] + file += 'IP_DNS2="%s"\n' % (primary['dns2'] or "") + + file += 'HOST_NAME="%s"\n' % host + file += 'DOMAIN_NAME="%s"\n' % domain + + for nodenetwork in nodenetworks: + if nodenetwork['method'] == 'ipmi': + file += 'IPMI_ADDRESS="%s"\n' % nodenetwork['ip'] + if nodenetwork['mac']: + file += 'IPMI_MAC="%s"\n' % nodenetwork['mac'].lower() + break + + return file diff --git a/PLC/Methods/AdmGetAllAddressTypes.py b/PLC/Methods/AdmGetAllAddressTypes.py new file mode 100644 index 0000000..ca4748b --- /dev/null +++ b/PLC/Methods/AdmGetAllAddressTypes.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetAddressTypes import GetAddressTypes + +class AdmGetAllAddressTypes(GetAddressTypes): + """ + Deprecated. See GetAddressTypes. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmGetAllKeyTypes.py b/PLC/Methods/AdmGetAllKeyTypes.py new file mode 100644 index 0000000..4383f84 --- /dev/null +++ b/PLC/Methods/AdmGetAllKeyTypes.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetKeyTypes import GetKeyTypes + +class AdmGetAllKeyTypes(GetKeyTypes): + """ + Deprecated. See GetKeyTypes. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmGetAllNodeNetworks.py b/PLC/Methods/AdmGetAllNodeNetworks.py new file mode 100644 index 0000000..c00bdec --- /dev/null +++ b/PLC/Methods/AdmGetAllNodeNetworks.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth +from PLC.Methods.GetNodeNetworks import GetNodeNetworks + +class AdmGetAllNodeNetworks(GetNodeNetworks): + """ + Deprecated. Functionality can be implemented with GetNodes and + GetNodeNetworks. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = [NodeNetwork.fields] + + def call(self, auth, node_id_or_hostname): + # Get node information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if not node['nodenetwork_ids']: + return [] + + return GetNodeNetworks.call(self, auth, node['nodenetwork_ids']) diff --git a/PLC/Methods/AdmGetAllRoles.py b/PLC/Methods/AdmGetAllRoles.py new file mode 100644 index 0000000..2b88714 --- /dev/null +++ b/PLC/Methods/AdmGetAllRoles.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter +from PLC.Auth import Auth +from PLC.Methods.GetRoles import GetRoles + +class AdmGetAllRoles(GetRoles): + """ + Deprecated. See GetRoles. + + Return all possible roles as a struct: + + {'10': 'admin', '20': 'pi', '30': 'user', '40': 'tech'} + + Note that because of XML-RPC marshalling limitations, the keys to + this struct are string representations of the integer role + identifiers. + """ + + status = "deprecated" + + returns = dict + + def call(self, auth): + roles_list = GetRoles.call(self, auth) + + roles_dict = {} + for role in roles_list: + # Stringify the keys! + roles_dict[str(role['role_id'])] = role['name'] + + return roles_dict diff --git a/PLC/Methods/AdmGetNodeGroupNodes.py b/PLC/Methods/AdmGetNodeGroupNodes.py new file mode 100644 index 0000000..51c392a --- /dev/null +++ b/PLC/Methods/AdmGetNodeGroupNodes.py @@ -0,0 +1,36 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.NodeGroups import NodeGroup, NodeGroups + +class AdmGetNodeGroupNodes(Method): + """ + Deprecated. See GetNodeGroups. + + Returns a list of node_ids for the node group specified. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = NodeGroup.fields['node_ids'] + + def call(self, auth, nodegroup_id_or_name): + # Get nodes in this nodegroup + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such node group" + + # Get the info for the node group specified + nodegroup = nodegroups[0] + + # Return the list of node_ids + return nodegroup['node_ids'] diff --git a/PLC/Methods/AdmGetNodeGroups.py b/PLC/Methods/AdmGetNodeGroups.py new file mode 100644 index 0000000..fa1ad59 --- /dev/null +++ b/PLC/Methods/AdmGetNodeGroups.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetNodeGroups import GetNodeGroups + +class AdmGetNodeGroups(GetNodeGroups): + """ + Deprecated. See GetNodeGroups. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmGetNodes.py b/PLC/Methods/AdmGetNodes.py new file mode 100644 index 0000000..74d8489 --- /dev/null +++ b/PLC/Methods/AdmGetNodes.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetNodes import GetNodes + +class AdmGetNodes(GetNodes): + """ + Deprecated. See GetNodes. All fields are now always returned. + """ + + status = "deprecated" + + def call(self, auth, node_id_or_hostname_list = None, return_fields = None): + return GetNodes.call(self, auth, node_id_or_hostname_list) diff --git a/PLC/Methods/AdmGetPersonKeys.py b/PLC/Methods/AdmGetPersonKeys.py new file mode 100644 index 0000000..946230a --- /dev/null +++ b/PLC/Methods/AdmGetPersonKeys.py @@ -0,0 +1,40 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth +from PLC.Methods.GetKeys import GetKeys + +class AdmGetPersonKeys(GetKeys): + """ + Deprecated. Functionality can be implemented with GetPersons and + GetKeys. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + [Key.fields['key_id']] + ] + + returns = [Key.fields] + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to view keys for specified account" + + return GetKeys.call(self, auth, person['key_ids']) diff --git a/PLC/Methods/AdmGetPersonRoles.py b/PLC/Methods/AdmGetPersonRoles.py new file mode 100644 index 0000000..024b93c --- /dev/null +++ b/PLC/Methods/AdmGetPersonRoles.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmGetPersonRoles(Method): + """ + Deprecated. See GetPersons. + + Return the roles that the specified person has as a struct: + + {'10': 'admin', '30': 'user', '20': 'pi', '40': 'tech'} + + Admins can get the roles for any user. PIs can only get the roles + for members of their sites. All others may only get their own + roles. + + Note that because of XML-RPC marshalling limitations, the keys to + this struct are string representations of the integer role + identifiers. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = dict + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + # Authenticated function + assert self.caller is not None + + # Check if we can view this account + if not self.caller.can_view(person): + raise PLCPermissionDenied, "Not allowed to view specified account" + + # Stringify the keys! + role_ids = map(str, person['role_ids']) + roles = person['roles'] + + return dict(zip(role_ids, roles)) diff --git a/PLC/Methods/AdmGetPersonSites.py b/PLC/Methods/AdmGetPersonSites.py new file mode 100644 index 0000000..79324f8 --- /dev/null +++ b/PLC/Methods/AdmGetPersonSites.py @@ -0,0 +1,47 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetPersonSites(Method): + """ + Deprecated. See GetPersons. + + Returns the sites that the specified person is associated with as + an array of site identifiers. + + Admins may retrieve details about anyone. Users and techs may only + retrieve details about themselves. PIs may retrieve details about + themselves and others at their sites. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = Person.fields['site_ids'] + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + # Authenticated function + assert self.caller is not None + + # Check if we can view this account + if not self.caller.can_view(person): + raise PLCPermissionDenied, "Not allowed to view specified account" + + return person['site_ids'] diff --git a/PLC/Methods/AdmGetPersons.py b/PLC/Methods/AdmGetPersons.py new file mode 100644 index 0000000..35e94a0 --- /dev/null +++ b/PLC/Methods/AdmGetPersons.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetPersons import GetPersons + +class AdmGetPersons(GetPersons): + """ + Deprecated. See GetPersons. + """ + + status = "deprecated" + + def call(self, auth, person_id_or_email_list = None, return_fields = None): + return GetPersons.call(self, auth, person_id_or_email_list) diff --git a/PLC/Methods/AdmGetPowerControlUnitNodes.py b/PLC/Methods/AdmGetPowerControlUnitNodes.py new file mode 100644 index 0000000..af298ee --- /dev/null +++ b/PLC/Methods/AdmGetPowerControlUnitNodes.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class AdmGetPowerControlUnitNodes(Method): + """ + Deprecated. See GetPCUs. + + Returns a list of the nodes, and the ports they are assigned to, + on the specified PCU. + + Admin may query all PCUs. Non-admins may only query the PCUs at + their sites. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'] + ] + + returns = [{'node_id': Parameter(int, "Node identifier"), + 'port_number': Parameter(int, "Port number")}] + + def call(self, auth, pcu_id): + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + if pcu['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to view that PCU" + + return [{'node_id': node_id, 'port_number': port} \ + for (node_id, port) in zip(pcu['node_ids'], pcu['ports'])] diff --git a/PLC/Methods/AdmGetPowerControlUnits.py b/PLC/Methods/AdmGetPowerControlUnits.py new file mode 100644 index 0000000..8f7e0c7 --- /dev/null +++ b/PLC/Methods/AdmGetPowerControlUnits.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetPCUs import GetPCUs + +class AdmGetPowerControlUnits(GetPCUs): + """ + Deprecated. See GetPCUs. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmGetSiteNodes.py b/PLC/Methods/AdmGetSiteNodes.py new file mode 100644 index 0000000..b366c80 --- /dev/null +++ b/PLC/Methods/AdmGetSiteNodes.py @@ -0,0 +1,44 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetSiteNodes(Method): + """ + Deprecated. See GetSites. + + Return a struct containing an array of node_ids for each of the + sites specified. Note that the keys of the struct are strings, not + integers, because of XML-RPC marshalling limitations. + + Admins may retrieve details about all nodes on a site by not specifying + site_id_or_name or by specifying an empty list. Users and + techs may only retrieve details about themselves. PIs may retrieve + details about themselves and others at their sites. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + [Mixed(Site.fields['site_id'], + Site.fields['name'])], + ] + + returns = dict + + def call(self, auth, site_id_or_name_list = None): + # Get site information + sites = Sites(self.api, site_id_or_name_list) + if not sites: + raise PLCInvalidArgument, "No such site" + + # Convert to {str(site_id): [node_id]} + site_nodes = {} + for site in sites: + site_nodes[str(site['site_id'])] = site['node_ids'] + + return site_nodes diff --git a/PLC/Methods/AdmGetSitePIs.py b/PLC/Methods/AdmGetSitePIs.py new file mode 100644 index 0000000..d35ee88 --- /dev/null +++ b/PLC/Methods/AdmGetSitePIs.py @@ -0,0 +1,44 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmGetSitePIs(Method): + """ + Deprecated. Functionality can be implemented with GetSites and + GetPersons. + + Return a list of person_ids of the PIs for the site specified. + """ + + status = "deprecated" + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Site.fields['person_ids'] + + def call(self, auth, site_id_or_login_base): + # Authenticated function + assert self.caller is not None + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + persons = Persons(self.api, site['person_ids']) + + has_pi_role = lambda person: 'pi' in person['roles'] + pis = filter(has_pi_role, persons) + + return [pi['person_id'] for pi in pis] diff --git a/PLC/Methods/AdmGetSitePersons.py b/PLC/Methods/AdmGetSitePersons.py new file mode 100644 index 0000000..8122528 --- /dev/null +++ b/PLC/Methods/AdmGetSitePersons.py @@ -0,0 +1,44 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetSitePersons(Method): + """ + Deprecated. See GetSites. + + Return a list of person_ids for the site specified. + + PIs may only retrieve the person_ids of accounts at their + site. Admins may retrieve the person_ids of accounts at any site. + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Site.fields['person_ids'] + + def call(self, auth, site_id_or_login_base): + # Authenticated function + assert self.caller is not None + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to view accounts at that site" + + return site['person_ids'] diff --git a/PLC/Methods/AdmGetSitePowerControlUnits.py b/PLC/Methods/AdmGetSitePowerControlUnits.py new file mode 100644 index 0000000..b95f298 --- /dev/null +++ b/PLC/Methods/AdmGetSitePowerControlUnits.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetSitePowerControlUnits(Method): + """ + Deprecated. Functionality can be implemented with GetSites and GetPCUs. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = [PCU.fields] + + def call(self, auth, site_id_or_login_base): + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to view the PCUs at that site" + + return PCUs(self.api, site['pcu_ids']) diff --git a/PLC/Methods/AdmGetSiteTechContacts.py b/PLC/Methods/AdmGetSiteTechContacts.py new file mode 100644 index 0000000..f531db5 --- /dev/null +++ b/PLC/Methods/AdmGetSiteTechContacts.py @@ -0,0 +1,45 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmGetSiteTechContacts(Method): + """ + Deprecated. Functionality can be implemented with GetSites and + GetPersons. + + Return a list of person_ids of the technical contacts for the site + specified. + """ + + status = "deprecated" + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Site.fields['person_ids'] + + def call(self, auth, site_id_or_login_base): + # Authenticated function + assert self.caller is not None + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + persons = Persons(self.api, site['person_ids']) + + has_tech_role = lambda person: 'tech' in person['roles'] + techs = filter(has_tech_role, persons) + + return [tech['person_id'] for tech in techs] diff --git a/PLC/Methods/AdmGetSites.py b/PLC/Methods/AdmGetSites.py new file mode 100644 index 0000000..cf5b0cd --- /dev/null +++ b/PLC/Methods/AdmGetSites.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetSites import GetSites + +class AdmGetSites(GetSites): + """ + Deprecated. See GetSites. + """ + + status = "deprecated" + + def call(self, auth, site_id_or_login_base_list = None, return_fields = None): + return GetSites.call(self, auth, site_id_or_login_base_list) diff --git a/PLC/Methods/AdmGrantRoleToPerson.py b/PLC/Methods/AdmGrantRoleToPerson.py new file mode 100644 index 0000000..36e2e25 --- /dev/null +++ b/PLC/Methods/AdmGrantRoleToPerson.py @@ -0,0 +1,11 @@ +from PLC.Methods.AddRoleToPerson import AddRoleToPerson + +class AdmGrantRoleToPerson(AddRoleToPerson): + """ + Deprecated. See AddRoleToPerson. + """ + + status = "deprecated" + + def call(self, auth, person_id_or_email, role_id_or_name): + return AddRoleToPerson.call(self, auth, role_id_or_name, person_id_or_email) diff --git a/PLC/Methods/AdmIsPersonInRole.py b/PLC/Methods/AdmIsPersonInRole.py new file mode 100644 index 0000000..b32ab03 --- /dev/null +++ b/PLC/Methods/AdmIsPersonInRole.py @@ -0,0 +1,67 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Roles import Role, Roles + +class AdmIsPersonInRole(Method): + """ + Deprecated. Functionality can be implemented with GetPersons. + + Returns 1 if the specified account has the specified role, 0 + otherwise. This function differs from AdmGetPersonRoles() in that + any authorized user can call it. It is currently restricted to + verifying PI roles. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Parameter(int, "Role identifier"), + Parameter(str, "Role name")) + ] + + returns = Parameter(int, "1 if account has role, 0 otherwise") + + def call(self, auth, person_id_or_email, role_id_or_name): + # This is a totally fucked up function. I have no idea why it + # exists or who calls it, but here is how it is supposed to + # work. + + # Only allow PI roles to be checked + roles = {} + for role in Roles(self.api): + roles[role['role_id']] = role['name'] + roles[role['name']] = role['role_id'] + + if role_id_or_name not in roles: + raise PLCInvalidArgument, "Invalid role identifier or name" + + if isinstance(role_id_or_name, int): + role_id = role_id_or_name + else: + role_id = roles[role_id_or_name] + + if roles[role_id] != "pi": + raise PLCInvalidArgument, "Only the PI role may be checked" + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + + # Rather than raise an error, and indicate whether or not + # the person is real, return 0. + if not persons: + return 0 + + person = persons[0] + + if role_id in person['role_ids']: + return 1 + + return 0 diff --git a/PLC/Methods/AdmQueryConfFile.py b/PLC/Methods/AdmQueryConfFile.py new file mode 100644 index 0000000..6cf5d99 --- /dev/null +++ b/PLC/Methods/AdmQueryConfFile.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +class AdmQueryConfFile(Method): + """ + Deprecated. See GetConfFiles. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'node_id': Node.fields['node_id']} + ] + + returns = [ConfFile.fields['conf_file_id']] + + def call(self, auth, search_vals): + if 'node_id' in search_vals: + conf_files = ConfFiles(self.api) + + conf_files = filter(lambda conf_file: \ + search_vals['node_id'] in conf_file['node_ids'], + conf_files) + + if conf_files: + return [conf_file['conf_file_id'] for conf_file in conf_files] + + return [] diff --git a/PLC/Methods/AdmQueryNode.py b/PLC/Methods/AdmQueryNode.py new file mode 100644 index 0000000..f41d04f --- /dev/null +++ b/PLC/Methods/AdmQueryNode.py @@ -0,0 +1,67 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks, valid_ip +from PLC.Auth import Auth + +class AdmQueryNode(Method): + """ + Deprecated. Functionality can be implemented with GetNodes and + GetNodeNetworks. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'node_hostname': Node.fields['hostname'], + 'nodenetwork_ip': NodeNetwork.fields['ip'], + 'nodenetwork_mac': NodeNetwork.fields['mac'], + 'nodenetwork_method': NodeNetwork.fields['method']} + ] + + returns = [Node.fields['node_id']] + + def call(self, auth, search_vals): + # Get possible nodenetworks + if 'node_hostname' in search_vals: + nodes = Nodes(self.api, [search_vals['node_hostname']]) + if not nodes: + return [] + + # No network interface filters specified + if 'nodenetwork_ip' not in search_vals and \ + 'nodenetwork_mac' not in search_vals and \ + 'nodenetwork_method' not in search_vals: + return [nodes[0]['node_id']] + + if nodes[0]['nodenetwork_ids']: + nodenetworks = NodeNetworks(self.api, nodes[0]['nodenetwork_ids']) + else: + nodenetworks = [] + else: + nodenetworks = NodeNetworks(self.api) + + if 'nodenetwork_ip' in search_vals: + if not valid_ip(search_vals['nodenetwork_ip']): + raise PLCInvalidArgument, "Invalid IP address" + nodenetworks = filter(lambda nodenetwork: \ + socket.inet_aton(nodenetwork['ip']) == socket.inet_aton(search_vals['nodenetwork_ip']), + nodenetworks) + + if 'nodenetwork_mac' in search_vals: + nodenetworks = filter(lambda nodenetwork: \ + nodenetwork['mac'].lower() == search_vals['nodenetwork_mac'].lower(), + nodenetworks) + + if 'nodenetwork_method' in search_vals: + nodenetworks = filter(lambda nodenetwork: \ + nodenetwork['method'].lower() == search_vals['nodenetwork_method'].lower(), + nodenetworks) + + return [nodenetwork['node_id'] for nodenetwork in nodenetworks] diff --git a/PLC/Methods/AdmQueryPerson.py b/PLC/Methods/AdmQueryPerson.py new file mode 100644 index 0000000..b41d0a5 --- /dev/null +++ b/PLC/Methods/AdmQueryPerson.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmQueryPerson(Method): + """ + Deprecated. See GetPersons. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'email': Person.fields['email']} + ] + + returns = [Person.fields['person_id']] + + def call(self, auth, search_vals): + if 'email' in search_vals: + persons = Persons(self.api, [search_vals['email']]) + if persons: + return [persons[0]['person_id']] + + return [] diff --git a/PLC/Methods/AdmQueryPowerControlUnit.py b/PLC/Methods/AdmQueryPowerControlUnit.py new file mode 100644 index 0000000..8fc2f42 --- /dev/null +++ b/PLC/Methods/AdmQueryPowerControlUnit.py @@ -0,0 +1,59 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks, valid_ip +from PLC.Auth import Auth + +class AdmQueryPowerControlUnit(Method): + """ + Deprecated. Functionality can be implemented with GetPCUs or + GetNodes. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'pcu_hostname': PCU.fields['hostname'], + 'pcu_ip': PCU.fields['ip'], + 'node_hostname': Node.fields['hostname'], + 'node_id': Node.fields['node_id']} + ] + + returns = [PCU.fields['pcu_id']] + + def call(self, auth, search_vals): + # Get all PCUs. This is a stupid function. The API should not + # be used for DB mining. + pcus = PCUs(self.api) + + if 'pcu_hostname' in search_vals: + pcus = filter(lambda pcu: \ + pcu['hostname'].lower() == search_vals['pcu_hostname'].lower(), + pcus) + + if 'pcu_ip' in search_vals: + if not valid_ip(search_vals['pcu_ip']): + raise PLCInvalidArgument, "Invalid IP address" + pcus = filter(lambda pcu: \ + socket.inet_aton(pcu['ip']) == socket.inet_aton(search_vals['pcu_ip']), + pcus) + + if 'node_id' in search_vals: + pcus = filter(lambda pcu: \ + search_vals['node_id'] in pcu['node_ids'], + pcus) + + if 'node_hostname' in search_vals: + pcus = filter(lambda pcu: \ + search_vals['node_hostname'] in \ + [node['hostname'] for node in Nodes(self.api, pcu['node_ids'])], + pcus) + + return [pcu['pcu_id'] for pcu in pcus] diff --git a/PLC/Methods/AdmQuerySite.py b/PLC/Methods/AdmQuerySite.py new file mode 100644 index 0000000..cad6b8c --- /dev/null +++ b/PLC/Methods/AdmQuerySite.py @@ -0,0 +1,87 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks, valid_ip +from PLC.Auth import Auth + +class AdmQuerySite(Method): + """ + Deprecated. Functionality can be implemented with GetSites and + GetNodes. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'site_name': Site.fields['name'], + 'site_abbreviatedname': Site.fields['abbreviated_name'], + 'site_loginbase': Site.fields['login_base'], + 'node_hostname': Node.fields['hostname'], + 'node_id': Node.fields['node_id'], + 'nodenetwork_ip': NodeNetwork.fields['ip'], + 'nodenetwork_mac': NodeNetwork.fields['mac']} + ] + + returns = [Site.fields['site_id']] + + def call(self, auth, search_vals): + if 'site_loginbase' in search_vals: + sites = Sites(self.api, [search_vals['site_loginbase']]) + else: + sites = Sites(self.api) + + if 'site_name' in search_vals: + sites = filter(lambda site: \ + site['name'] == search_vals['site_name'], + sites) + + if 'site_abbreviatedname' in search_vals: + sites = filter(lambda site: \ + site['abbreviatedname'] == search_vals['site_abbreviatedname'], + sites) + + if 'node_id' in search_vals: + sites = filter(lambda site: \ + search_vals['node_id'] in site['node_ids'], + sites) + + if 'node_hostname' in search_vals or \ + 'nodenetwork_ip' in search_vals or \ + 'nodenetwork_mac' in search_vals: + for site in sites: + site['hostnames'] = [] + site['ips'] = [] + site['macs'] = [] + if site['node_ids']: + nodes = Nodes(self.api, site['node_ids']) + for node in nodes: + site['hostnames'].append(node['hostname']) + if 'nodenetwork_ip' in search_vals or \ + 'nodenetwork_mac' in search_vals: + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + site['ips'] += [nodenetwork['ip'] for nodenetwork in nodenetworks] + site['macs'] += [nodenetwork['mac'] for nodenetwork in nodenetworks] + + if 'node_hostname' in search_vals: + sites = filter(lambda site: \ + search_vals['node_hostname'] in site['hostnames'], + sites) + + if 'nodenetwork_ip' in search_vals: + sites = filter(lambda site: \ + search_vals['nodenetwork_ip'] in site['ips'], + sites) + + if 'nodenetwork_mac' in search_vals: + sites = filter(lambda site: \ + search_vals['nodenetwork_mac'] in site['macs'], + sites) + + return [site['site_id'] for site in sites] diff --git a/PLC/Methods/AdmRebootNode.py b/PLC/Methods/AdmRebootNode.py new file mode 100644 index 0000000..c8368e3 --- /dev/null +++ b/PLC/Methods/AdmRebootNode.py @@ -0,0 +1,8 @@ +from PLC.Methods.RebootNode import RebootNode + +class AdmRebootNode(RebootNode): + """ + Deprecated. See RebootNode. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmRemoveNodeFromNodeGroup.py b/PLC/Methods/AdmRemoveNodeFromNodeGroup.py new file mode 100644 index 0000000..f905a16 --- /dev/null +++ b/PLC/Methods/AdmRemoveNodeFromNodeGroup.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteNodeFromNodeGroup import DeleteNodeFromNodeGroup + +class AdmRemoveNodeFromNodeGroup(DeleteNodeFromNodeGroup): + """ + Deprecated. See DeleteNodeFromNodeGroup. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmRemovePersonFromSite.py b/PLC/Methods/AdmRemovePersonFromSite.py new file mode 100644 index 0000000..54d3f1d --- /dev/null +++ b/PLC/Methods/AdmRemovePersonFromSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeletePersonFromSite import DeletePersonFromSite + +class AdmRemovePersonFromSite(DeletePersonFromSite): + """ + Deprecated. See DeletePersonFromSite. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmRevokeRoleFromPerson.py b/PLC/Methods/AdmRevokeRoleFromPerson.py new file mode 100644 index 0000000..2631a3a --- /dev/null +++ b/PLC/Methods/AdmRevokeRoleFromPerson.py @@ -0,0 +1,11 @@ +from PLC.Methods.DeleteRoleFromPerson import DeleteRoleFromPerson + +class AdmRevokeRoleFromPerson(DeleteRoleFromPerson): + """ + Deprecated. See DeleteRoleFromPerson. + """ + + status = "deprecated" + + def call(self, auth, person_id_or_email, role_id_or_name): + return DeleteRoleFromPerson.call(self, auth, role_id_or_name, person_id_or_email) diff --git a/PLC/Methods/AdmSetPersonEnabled.py b/PLC/Methods/AdmSetPersonEnabled.py new file mode 100644 index 0000000..2009f00 --- /dev/null +++ b/PLC/Methods/AdmSetPersonEnabled.py @@ -0,0 +1,23 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Methods.UpdatePerson import UpdatePerson + +class AdmSetPersonEnabled(UpdatePerson): + """ + Deprecated. See UpdatePerson. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Person.fields['enabled'] + ] + + def call(self, auth, person_id_or_email, enabled): + return UpdatePerson.call(self, auth, person_id_or_email, {'enabled': enabled}) diff --git a/PLC/Methods/AdmSetPersonPrimarySite.py b/PLC/Methods/AdmSetPersonPrimarySite.py new file mode 100644 index 0000000..c631a95 --- /dev/null +++ b/PLC/Methods/AdmSetPersonPrimarySite.py @@ -0,0 +1,8 @@ +from PLC.Methods.SetPersonPrimarySite import SetPersonPrimarySite + +class AdmSetPersonPrimarySite(SetPersonPrimarySite): + """ + Deprecated. See SetPersonPrimarySite. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmUpdateNode.py b/PLC/Methods/AdmUpdateNode.py new file mode 100644 index 0000000..ba4b3f1 --- /dev/null +++ b/PLC/Methods/AdmUpdateNode.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdateNode import UpdateNode + +class AdmUpdateNode(UpdateNode): + """ + Deprecated. See UpdateNode. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmUpdateNodeGroup.py b/PLC/Methods/AdmUpdateNodeGroup.py new file mode 100644 index 0000000..b53198a --- /dev/null +++ b/PLC/Methods/AdmUpdateNodeGroup.py @@ -0,0 +1,27 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth +from PLC.Methods.UpdateNodeGroup import UpdateNodeGroup + +class AdmUpdateNodeGroup(UpdateNodeGroup): + """ + Deprecated. See UpdateNodeGroup. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + NodeGroup.fields['name'], + NodeGroup.fields['description'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodegroup_id_or_name, name, description): + return UpdateNodeGroup.call(self, auth, nodegroup_id_or_name, + {'name': name, 'description': description}) diff --git a/PLC/Methods/AdmUpdateNodeNetwork.py b/PLC/Methods/AdmUpdateNodeNetwork.py new file mode 100644 index 0000000..a85d62a --- /dev/null +++ b/PLC/Methods/AdmUpdateNodeNetwork.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdateNodeNetwork import UpdateNodeNetwork + +class AdmUpdateNodeNetwork(UpdateNodeNetwork): + """ + Deprecated. See UpdateNodeNetwork. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmUpdatePerson.py b/PLC/Methods/AdmUpdatePerson.py new file mode 100644 index 0000000..066fe6d --- /dev/null +++ b/PLC/Methods/AdmUpdatePerson.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdatePerson import UpdatePerson + +class AdmUpdatePerson(UpdatePerson): + """ + Deprecated. See UpdatePerson. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmUpdateSite.py b/PLC/Methods/AdmUpdateSite.py new file mode 100644 index 0000000..0b6c26a --- /dev/null +++ b/PLC/Methods/AdmUpdateSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdateSite import UpdateSite + +class AdmUpdateSite(UpdateSite): + """ + Deprecated. See UpdateSite. + """ + + status = "deprecated" diff --git a/PLC/Methods/AdmUpdateSitePowerControlUnit.py b/PLC/Methods/AdmUpdateSitePowerControlUnit.py new file mode 100644 index 0000000..ed564fb --- /dev/null +++ b/PLC/Methods/AdmUpdateSitePowerControlUnit.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdatePCU import UpdatePCU + +class AdmUpdateSitePowerControlUnit(UpdatePCU): + """ + Deprecated. See UpdatePCU. + """ + + status = "deprecated" diff --git a/PLC/Methods/AnonAdmGetNodeGroups.py b/PLC/Methods/AnonAdmGetNodeGroups.py new file mode 100644 index 0000000..b223e1e --- /dev/null +++ b/PLC/Methods/AnonAdmGetNodeGroups.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetNodeGroups import GetNodeGroups + +class AnonAdmGetNodeGroups(GetNodeGroups): + """ + Deprecated. See GetNodeGroups. All fields are now always returned + """ + + status = "deprecated" + + def call(self, auth, nodegroup_id_or_name_list = None, return_fields = None): + return GetNodeGroups.call(self, auth, nodegroup_id_or_name_list) diff --git a/PLC/Methods/AuthCheck.py b/PLC/Methods/AuthCheck.py new file mode 100644 index 0000000..0a4c260 --- /dev/null +++ b/PLC/Methods/AuthCheck.py @@ -0,0 +1,16 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth, BootAuth + +class AuthCheck(Method): + """ + Returns 1 if the user or node authenticated successfully, faults + otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + accepts = [Auth()] + returns = Parameter(int, '1 if successful') + + def call(self, auth): + return 1 diff --git a/PLC/Methods/BlacklistKey.py b/PLC/Methods/BlacklistKey.py new file mode 100644 index 0000000..7953e7a --- /dev/null +++ b/PLC/Methods/BlacklistKey.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class BlacklistKey(Method): + """ + Blacklists a key, disassociating it and all others identical to it + from all accounts and preventing it from ever being added again. + + WARNING: Identical keys associated with other accounts with also + be blacklisted. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Key.fields['key_id'], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, key_id): + # Get associated key details + keys = Keys(self.api, [key_id]) + if not keys: + raise PLCInvalidArgument, "No such key" + key = keys[0] + + # N.B.: Can blacklist any key, even foreign ones + + key.blacklist() + + # Logging variables + self.event_objects = {'Key': [key['key_id']]} + self.message = 'Key %d blacklisted' % key['key_id'] + + return 1 diff --git a/PLC/Methods/BootCheckAuthentication.py b/PLC/Methods/BootCheckAuthentication.py new file mode 100644 index 0000000..ea9b098 --- /dev/null +++ b/PLC/Methods/BootCheckAuthentication.py @@ -0,0 +1,8 @@ +from PLC.Methods.AuthCheck import AuthCheck + +class BootCheckAuthentication(AuthCheck): + """ + Deprecated. See AuthCheck. + """ + + status = "deprecated" diff --git a/PLC/Methods/BootGetNodeDetails.py b/PLC/Methods/BootGetNodeDetails.py new file mode 100644 index 0000000..2f5056d --- /dev/null +++ b/PLC/Methods/BootGetNodeDetails.py @@ -0,0 +1,55 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import BootAuth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Sessions import Session, Sessions + +class BootGetNodeDetails(Method): + """ + Returns a set of details about the calling node, including a new + node session value. + """ + + roles = ['node'] + + accepts = [BootAuth()] + + returns = { + 'hostname': Node.fields['hostname'], + 'boot_state': Node.fields['boot_state'], + 'model': Node.fields['model'], + 'networks': [NodeNetwork.fields], + 'session': Session.fields['session_id'], + } + + def call(self, auth): + details = { + 'hostname': self.caller['hostname'], + 'boot_state': self.caller['boot_state'], + # XXX Boot Manager cannot unmarshal None + 'model': self.caller['model'] or "", + } + + # Generate a new session value + session = Session(self.api) + session.sync(commit = False) + session.add_node(self.caller, commit = True) + + details['session'] = session['session_id'] + + if self.caller['nodenetwork_ids']: + details['networks'] = NodeNetworks(self.api, self.caller['nodenetwork_ids']) + # XXX Boot Manager cannot unmarshal None + for network in details['networks']: + for field in network: + if network[field] is None: + if isinstance(network[field], (int, long)): + network[field] = -1 + else: + network[field] = "" + + self.messge = "Node request boot_state (%s) and networks" % \ + (details['boot_state']) + return details + diff --git a/PLC/Methods/BootNotifyOwners.py b/PLC/Methods/BootNotifyOwners.py new file mode 100644 index 0000000..c1da332 --- /dev/null +++ b/PLC/Methods/BootNotifyOwners.py @@ -0,0 +1,32 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth, BootAuth +from PLC.Nodes import Node, Nodes +from PLC.Messages import Message, Messages + +from PLC.Boot import notify_owners + +class BootNotifyOwners(Method): + """ + Notify the owners of the node, and/or support about an event that + happened on the machine. + + Returns 1 if successful. + """ + + roles = ['node'] + + accepts = [ + BootAuth(), + Message.fields['message_id'], + Parameter(int, "Notify PIs"), + Parameter(int, "Notify technical contacts"), + Parameter(int, "Notify support") + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, message_id, include_pis, include_techs, include_support): + assert isinstance(self.caller, Node) + notify_owners(self, self.caller, message_id, include_pis, include_techs, include_support) + return 1 diff --git a/PLC/Methods/BootUpdateNode.py b/PLC/Methods/BootUpdateNode.py new file mode 100644 index 0000000..52381cb --- /dev/null +++ b/PLC/Methods/BootUpdateNode.py @@ -0,0 +1,64 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth, BootAuth, SessionAuth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +can_update = lambda (field, value): field in \ + ['method', 'mac', 'gateway', 'network', + 'broadcast', 'netmask', 'dns1', 'dns2'] + +class BootUpdateNode(Method): + """ + Allows the calling node to update its own record. Only the primary + network can be updated, and the node IP cannot be changed. + + Returns 1 if updated successfully. + """ + + roles = ['node'] + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Mixed(BootAuth(), SessionAuth()), + {'boot_state': Node.fields['boot_state'], + 'primary_network': nodenetwork_fields, + 'ssh_host_key': Node.fields['ssh_rsa_key']} + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_fields): + # Update node state + if node_fields.has_key('boot_state'): + self.caller['boot_state'] = node_fields['boot_state'] + if node_fields.has_key('ssh_host_key'): + self.caller['ssh_rsa_key'] = node_fields['ssh_host_key'] + + # Update primary node network state + if node_fields.has_key('primary_network'): + primary_network = node_fields['primary_network'] + + if 'nodenetwork_id' not in primary_network: + raise PLCInvalidArgument, "Node network not specified" + if primary_network['nodenetwork_id'] not in self.caller['nodenetwork_ids']: + raise PLCInvalidArgument, "Node network not associated with calling node" + + nodenetworks = NodeNetworks(self.api, [primary_network['nodenetwork_id']]) + if not nodenetworks: + raise PLCInvalidArgument, "No such node network" + nodenetwork = nodenetworks[0] + + if not nodenetwork['is_primary']: + raise PLCInvalidArgument, "Not the primary node network on record" + + nodenetwork_fields = dict(filter(can_update, primary_network.items())) + nodenetwork.update(nodenetwork_fields) + nodenetwork.sync(commit = False) + + self.caller.sync(commit = True) + self.message = "Node updated: %s" % ", ".join(node_fields.keys()) + + return 1 diff --git a/PLC/Methods/DeleteAddress.py b/PLC/Methods/DeleteAddress.py new file mode 100644 index 0000000..d4f98bc --- /dev/null +++ b/PLC/Methods/DeleteAddress.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class DeleteAddress(Method): + """ + Deletes an address. + + PIs may only delete addresses from their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Address.fields['address_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_id): + # Get associated address details + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.delete() + + # Logging variables + self.event_objects = {'Address': [address['address_id']]} + self.message = 'Address %d deleted' % address['address_id'] + + return 1 diff --git a/PLC/Methods/DeleteAddressType.py b/PLC/Methods/DeleteAddressType.py new file mode 100644 index 0000000..4fd1d9b --- /dev/null +++ b/PLC/Methods/DeleteAddressType.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +class DeleteAddressType(Method): + """ + Deletes an address type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_type_id_or_name): + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + address_type.delete() + self.event_objects = {'AddressType': [address_type['address_type_id']]} + + return 1 diff --git a/PLC/Methods/DeleteAddressTypeFromAddress.py b/PLC/Methods/DeleteAddressTypeFromAddress.py new file mode 100644 index 0000000..d4ea928 --- /dev/null +++ b/PLC/Methods/DeleteAddressTypeFromAddress.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class DeleteAddressTypeFromAddress(Method): + """ + Deletes an address type from the specified address. + + PIs may only update addresses of their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']), + Address.fields['address_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_type_id_or_name, address_id): + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.remove_address_type(address_type) + self.event_objects = {'Address' : [address['address_id']], + 'AddressType': [address_type['address_type_id']]} + + return 1 diff --git a/PLC/Methods/DeleteBootState.py b/PLC/Methods/DeleteBootState.py new file mode 100644 index 0000000..507fc7b --- /dev/null +++ b/PLC/Methods/DeleteBootState.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.BootStates import BootState, BootStates +from PLC.Auth import Auth + +class DeleteBootState(Method): + """ + Deletes a node boot state. + + WARNING: This will cause the deletion of all nodes in this boot + state. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + BootState.fields['boot_state'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + boot_states = BootStates(self.api, [name]) + if not boot_states: + raise PLCInvalidArgument, "No such boot state" + boot_state = boot_states[0] + + boot_state.delete() + + return 1 diff --git a/PLC/Methods/DeleteConfFile.py b/PLC/Methods/DeleteConfFile.py new file mode 100644 index 0000000..f05ae43 --- /dev/null +++ b/PLC/Methods/DeleteConfFile.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +class DeleteConfFile(Method): + """ + Returns an array of structs containing details about node + configuration files. If conf_file_ids is specified, only the + specified configuration files will be queried. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, conf_file_id): + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + + conf_file = conf_files[0] + conf_file.delete() + self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} + + return 1 diff --git a/PLC/Methods/DeleteConfFileFromNode.py b/PLC/Methods/DeleteConfFileFromNode.py new file mode 100644 index 0000000..50b08e6 --- /dev/null +++ b/PLC/Methods/DeleteConfFileFromNode.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class DeleteConfFileFromNode(Method): + """ + Deletes a configuration file from the specified node. If the node + is not linked to the configuration file, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, conf_file_id, node_id_or_hostname): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + # Link configuration file to node + if node['node_id'] in conf_file['node_ids']: + conf_file.remove_node(node) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'Node': [node['node_id']]} + + return 1 diff --git a/PLC/Methods/DeleteConfFileFromNodeGroup.py b/PLC/Methods/DeleteConfFileFromNodeGroup.py new file mode 100644 index 0000000..5504b0f --- /dev/null +++ b/PLC/Methods/DeleteConfFileFromNodeGroup.py @@ -0,0 +1,49 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +class DeleteConfFileFromNodeGroup(Method): + """ + Deletes a configuration file from the specified nodegroup. If the nodegroup + is not linked to the configuration file, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, conf_file_id, nodegroup_id_or_name): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get nodegroup + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + nodegroup = nodegroups[0] + + # Link configuration file to nodegroup + if nodegroup['nodegroup_id'] in conf_file['nodegroup_ids']: + conf_file.remove_nodegroup(nodegroup) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'NodeGroup': [nodegroup['nodegroup_id']]} + + return 1 diff --git a/PLC/Methods/DeleteInitScript.py b/PLC/Methods/DeleteInitScript.py new file mode 100644 index 0000000..47a9993 --- /dev/null +++ b/PLC/Methods/DeleteInitScript.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class DeleteInitScript(Method): + """ + Deletes an existing initscript. + + Returns 1 if successfuli, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + InitScript.fields['initscript_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, initscript_id): + initscripts = InitScripts(self.api, [initscript_id]) + if not initscripts: + raise PLCInvalidArgument, "No such initscript" + + initscript = initscripts[0] + initscript.delete() + self.event_objects = {'InitScript': [initscript['initscript_id']]} + + return 1 diff --git a/PLC/Methods/DeleteKey.py b/PLC/Methods/DeleteKey.py new file mode 100644 index 0000000..86c16a5 --- /dev/null +++ b/PLC/Methods/DeleteKey.py @@ -0,0 +1,46 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class DeleteKey(Method): + """ + Deletes a key. + + Non-admins may only delete their own keys. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + Key.fields['key_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, key_id): + # Get associated key details + keys = Keys(self.api, [key_id]) + if not keys: + raise PLCInvalidArgument, "No such key" + key = keys[0] + + if key['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local key" + + if 'admin' not in self.caller['roles']: + if key['key_id'] not in self.caller['key_ids']: + raise PLCPermissionDenied, "Key must be associated with your account" + + key.delete() + + # Logging variables + self.event_objects = {'Key': [key['key_id']]} + self.message = 'Key %d deleted' % key['key_id'] + + return 1 diff --git a/PLC/Methods/DeleteKeyType.py b/PLC/Methods/DeleteKeyType.py new file mode 100644 index 0000000..e09e5c5 --- /dev/null +++ b/PLC/Methods/DeleteKeyType.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import Auth + +class DeleteKeyType(Method): + """ + Deletes a key type. + + WARNING: This will cause the deletion of all keys of this type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + KeyType.fields['key_type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + key_types = KeyTypes(self.api, [name]) + if not key_types: + raise PLCInvalidArgument, "No such key type" + key_type = key_types[0] + + key_type.delete() + + return 1 diff --git a/PLC/Methods/DeleteMessage.py b/PLC/Methods/DeleteMessage.py new file mode 100644 index 0000000..4989942 --- /dev/null +++ b/PLC/Methods/DeleteMessage.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +class DeleteMessage(Method): + """ + Deletes a message template. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Message.fields['message_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, message_id): + # Get message information + messages = Messages(self.api, [message_id]) + if not messages: + raise PLCInvalidArgument, "No such message" + message = messages[0] + + message.delete() + self.event_objects = {'Message': [message['message_id']]} + + return 1 diff --git a/PLC/Methods/DeleteNetworkMethod.py b/PLC/Methods/DeleteNetworkMethod.py new file mode 100644 index 0000000..d0f982e --- /dev/null +++ b/PLC/Methods/DeleteNetworkMethod.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import Auth + +class DeleteNetworkMethod(Method): + """ + Deletes a network method. + + WARNING: This will cause the deletion of all network interfaces + that use this method. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkMethod.fields['method'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_methods = NetworkMethods(self.api, [name]) + if not network_methods: + raise PLCInvalidArgument, "No such network method" + network_method = network_methods[0] + + network_method.delete() + + return 1 diff --git a/PLC/Methods/DeleteNetworkType.py b/PLC/Methods/DeleteNetworkType.py new file mode 100644 index 0000000..a02f6e0 --- /dev/null +++ b/PLC/Methods/DeleteNetworkType.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import Auth + +class DeleteNetworkType(Method): + """ + Deletes a network type. + + WARNING: This will cause the deletion of all network interfaces + that use this type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkType.fields['type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_types = NetworkTypes(self.api, [name]) + if not network_types: + raise PLCInvalidArgument, "No such network type" + network_type = network_types[0] + + network_type.delete() + + return 1 diff --git a/PLC/Methods/DeleteNode.py b/PLC/Methods/DeleteNode.py new file mode 100644 index 0000000..bc92718 --- /dev/null +++ b/PLC/Methods/DeleteNode.py @@ -0,0 +1,52 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes + +class DeleteNode(Method): + """ + Mark an existing node as deleted. + + PIs and techs may only delete nodes at their own sites. ins may + delete nodes at any site. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname): + # Get account information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + # Authenticated function + assert self.caller is not None + + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete nodes from specified site" + + node.delete() + + # Logging variables + self.event_objects = {'Node': [node['node_id']]} + self.message = "Node %d deleted" % node['node_id'] + + return 1 diff --git a/PLC/Methods/DeleteNodeFromNodeGroup.py b/PLC/Methods/DeleteNodeFromNodeGroup.py new file mode 100644 index 0000000..2bc6770 --- /dev/null +++ b/PLC/Methods/DeleteNodeFromNodeGroup.py @@ -0,0 +1,53 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class DeleteNodeFromNodeGroup(Method): + """ + Removes a node from the specified node group. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, node_id_or_hostname, nodegroup_id_or_name): + # Get node info + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + + node = nodes[0] + + # Get nodegroup info + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + + nodegroup = nodegroups[0] + + # Remove node from nodegroup + if node['node_id'] in nodegroup['node_ids']: + nodegroup.remove_node(node) + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']], + 'Node': [node['node_id']]} + self.message = 'node %d deleted from node group %d' % \ + (node['node_id'], nodegroup['nodegroup_id']) + + return 1 diff --git a/PLC/Methods/DeleteNodeFromPCU.py b/PLC/Methods/DeleteNodeFromPCU.py new file mode 100644 index 0000000..8e728ef --- /dev/null +++ b/PLC/Methods/DeleteNodeFromPCU.py @@ -0,0 +1,65 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class DeleteNodeFromPCU(Method): + """ + Deletes a node from a PCU. + + Non-admins may only update PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + PCU.fields['pcu_id'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname, pcu_id): + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + + node = nodes[0] + + # Get PCU + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + ok = False + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + if pcu['pcu_id'] in site['pcu_ids']: + ok = True + break + if not ok: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + # Removed node from PCU + + if node['node_id'] in pcu['node_ids']: + pcu.remove_node(node) + + # Logging variables + self.event_objects = {'PCU': [pcu['pcu_id']], + 'Node': [node['node_id']]} + self.message = 'Node %d removed from PCU %d' % \ + (node['node_id'], pcu['pcu_id']) + + return 1 diff --git a/PLC/Methods/DeleteNodeGroup.py b/PLC/Methods/DeleteNodeGroup.py new file mode 100644 index 0000000..7650150 --- /dev/null +++ b/PLC/Methods/DeleteNodeGroup.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.NodeGroups import NodeGroup, NodeGroups + +class DeleteNodeGroup(Method): + """ + Delete an existing Node Group. + + ins may delete any node group + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, node_group_id_or_name): + # Get account information + nodegroups = NodeGroups(self.api, [node_group_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such node group" + + nodegroup = nodegroups[0] + + nodegroup.delete() + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']]} + self.message = 'Node group %d deleted' % nodegroup['nodegroup_id'] + + return 1 diff --git a/PLC/Methods/DeleteNodeNetwork.py b/PLC/Methods/DeleteNodeNetwork.py new file mode 100644 index 0000000..4bdda21 --- /dev/null +++ b/PLC/Methods/DeleteNodeNetwork.py @@ -0,0 +1,57 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +class DeleteNodeNetwork(Method): + """ + Deletes an existing node network interface. + + Admins may delete any node network. PIs and techs may only delete + node network interfaces associated with nodes at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + NodeNetwork.fields['nodenetwork_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, nodenetwork_id): + + # Get node network information + nodenetworks = NodeNetworks(self.api, [nodenetwork_id]) + if not nodenetworks: + raise PLCInvalidArgument, "No such node network" + nodenetwork = nodenetworks[0] + + # Get node information + nodes = Nodes(self.api, [nodenetwork['node_id']]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + # Authenticated functino + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete this node network" + + nodenetwork.delete() + + # Logging variables + self.event_objects = {'NodeNetwork': [nodenetwork['nodenetwork_id']]} + self.message = "Node network %d deleted" % nodenetwork['nodenetwork_id'] + + return 1 diff --git a/PLC/Methods/DeleteNodeNetworkSetting.py b/PLC/Methods/DeleteNodeNetworkSetting.py new file mode 100644 index 0000000..e092f37 --- /dev/null +++ b/PLC/Methods/DeleteNodeNetworkSetting.py @@ -0,0 +1,73 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +from PLC.Nodes import Node, Nodes +from PLC.Sites import Site, Sites + +class DeleteNodeNetworkSetting(Method): + """ + Deletes the specified nodenetwork setting + + Attributes may require the caller to have a particular role in order + to be deleted, depending on the related nodenetwork setting type. + Admins may delete attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + NodeNetworkSetting.fields['nodenetwork_setting_id'] + ] + + returns = Parameter(int, '1 if successful') + + object_type = 'NodeNetwork' + + + def call(self, auth, nodenetwork_setting_id): + nodenetwork_settings = NodeNetworkSettings(self.api, [nodenetwork_setting_id]) + if not nodenetwork_settings: + raise PLCInvalidArgument, "No such nodenetwork setting %r"%nodenetwork_setting_id + nodenetwork_setting = nodenetwork_settings[0] + + ### reproducing a check from UpdateSliceAttribute, looks dumb though + nodenetworks = NodeNetworks(self.api, [nodenetwork_setting['nodenetwork_id']]) + if not nodenetworks: + raise PLCInvalidArgument, "No such nodenetwork %r"%nodenetwork_setting['nodenetwork_id'] + nodenetwork = nodenetworks[0] + + assert nodenetwork_setting['nodenetwork_setting_id'] in nodenetwork['nodenetwork_setting_ids'] + + # check permission : it not admin, is the user affiliated with the right site + if 'admin' not in self.caller['roles']: + # locate node + node = Nodes (self.api,[nodenetwork['node_id']])[0] + # locate site + site = Sites (self.api, [node['site_id']])[0] + # check caller is affiliated with this site + if self.caller['person_id'] not in site['person_ids']: + raise PLCPermissionDenied, "Not a member of the hosting site %s"%site['abbreviated_site'] + + required_min_role = nodenetwork_setting_type ['min_role_id'] + if required_min_role is not None and \ + min(self.caller['role_ids']) > required_min_role: + raise PLCPermissionDenied, "Not allowed to modify the specified nodenetwork setting, requires role %d",required_min_role + + nodenetwork_setting.delete() + self.object_ids = [nodenetwork_setting['nodenetwork_setting_id']] + + return 1 diff --git a/PLC/Methods/DeleteNodeNetworkSettingType.py b/PLC/Methods/DeleteNodeNetworkSettingType.py new file mode 100644 index 0000000..d79a862 --- /dev/null +++ b/PLC/Methods/DeleteNodeNetworkSettingType.py @@ -0,0 +1,39 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.Auth import Auth + +class DeleteNodeNetworkSettingType(Method): + """ + Deletes the specified nodenetwork setting type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, nodenetwork_setting_type_id_or_name): + nodenetwork_setting_types = NodeNetworkSettingTypes(self.api, [nodenetwork_setting_type_id_or_name]) + if not nodenetwork_setting_types: + raise PLCInvalidArgument, "No such nodenetwork settnig type" + nodenetwork_setting_type = nodenetwork_setting_types[0] + + nodenetwork_setting_type.delete() + self.object_ids = [nodenetwork_setting_type['nodenetwork_setting_type_id']] + + return 1 diff --git a/PLC/Methods/DeletePCU.py b/PLC/Methods/DeletePCU.py new file mode 100644 index 0000000..944882b --- /dev/null +++ b/PLC/Methods/DeletePCU.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class DeletePCU(Method): + """ + Deletes a PCU. + + Non-admins may only delete PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, pcu_id): + # Get associated PCU details + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + if pcu['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + pcu.delete() + + # Logging variables + self.event_objects = {'PCU': [pcu['pcu_id']]} + self.message = 'PCU %d deleted' % pcu['pcu_id'] + + return 1 diff --git a/PLC/Methods/DeletePCUProtocolType.py b/PLC/Methods/DeletePCUProtocolType.py new file mode 100644 index 0000000..ab66520 --- /dev/null +++ b/PLC/Methods/DeletePCUProtocolType.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.Auth import Auth + +class DeletePCUProtocolType(Method): + """ + Deletes a PCU protocol type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + PCUProtocolType.fields['pcu_protocol_type_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, protocol_type_id): + protocol_types = PCUProtocolTypes(self.api, [protocol_type_id]) + if not protocol_types: + raise PLCInvalidArgument, "No such pcu protocol type" + + protocol_type = protocol_types[0] + protocol_type.delete() + self.event_objects = {'PCUProtocolType': [protocol_type['pcu_protocol_type_id']]} + + return 1 diff --git a/PLC/Methods/DeletePCUType.py b/PLC/Methods/DeletePCUType.py new file mode 100644 index 0000000..d73c204 --- /dev/null +++ b/PLC/Methods/DeletePCUType.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +class DeletePCUType(Method): + """ + Deletes a PCU type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + PCUType.fields['pcu_type_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, pcu_type_id): + pcu_types = PCUTypes(self.api, [pcu_type_id]) + if not pcu_types: + raise PLCInvalidArgument, "No such pcu type" + + pcu_type = pcu_types[0] + pcu_type.delete() + self.event_objects = {'PCUType': [pcu_type['pcu_type_id']]} + + return 1 diff --git a/PLC/Methods/DeletePeer.py b/PLC/Methods/DeletePeer.py new file mode 100644 index 0000000..4260d25 --- /dev/null +++ b/PLC/Methods/DeletePeer.py @@ -0,0 +1,38 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Peers import Peer, Peers + +class DeletePeer(Method): + """ + Mark an existing peer as deleted. All entities (e.g., slices, + keys, nodes, etc.) for which this peer is authoritative will also + be deleted or marked as deleted. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Peer.fields['peer_id'], + Peer.fields['peername']) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, auth, peer_id_or_name): + # Get account information + peers = Peers(self.api, [peer_id_or_name]) + if not peers: + raise PLCInvalidArgument, "No such peer" + + peer = peers[0] + peer.delete() + + # Log affected objects + self.event_objects = {'Peer': [peer['peer_id']]} + + return 1 diff --git a/PLC/Methods/DeletePerson.py b/PLC/Methods/DeletePerson.py new file mode 100644 index 0000000..448f808 --- /dev/null +++ b/PLC/Methods/DeletePerson.py @@ -0,0 +1,51 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class DeletePerson(Method): + """ + Mark an existing account as deleted. + + Users and techs can only delete themselves. PIs can only delete + themselves and other non-PIs at their sites. ins can delete + anyone. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to delete specified account" + + person.delete() + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = 'Person %d deleted' % person['person_id'] + + return 1 diff --git a/PLC/Methods/DeletePersonFromSite.py b/PLC/Methods/DeletePersonFromSite.py new file mode 100644 index 0000000..db2af2d --- /dev/null +++ b/PLC/Methods/DeletePersonFromSite.py @@ -0,0 +1,56 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class DeletePersonFromSite(Method): + """ + Removes the specified person from the specified site. If the + person is not a member of the specified site, no error is + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, site_id_or_login_base): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + if site['site_id'] in person['site_ids']: + site.remove_person(person) + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'Person': [person['person_id']]} + self.message = 'Person %d deleted from site %d ' % \ + (person['person_id'], site['site_id']) + return 1 diff --git a/PLC/Methods/DeletePersonFromSlice.py b/PLC/Methods/DeletePersonFromSlice.py new file mode 100644 index 0000000..c990ccd --- /dev/null +++ b/PLC/Methods/DeletePersonFromSlice.py @@ -0,0 +1,59 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeletePersonFromSlice(Method): + """ + Deletes the specified person from the specified slice. If the person is + not a member of the slice, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, slice_id_or_name): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # N.B. Allow foreign users to be added to local slices and + # local users to be added to foreign slices (and, of course, + # local users to be added to local slices). + if person['peer_id'] is not None and slice['peer_id'] is not None: + raise PLCInvalidArgument, "Cannot delete foreign users from foreign slices" + + # If we are not admin, make sure the caller is a pi + # of the site associated with the slice + if 'admin' not in self.caller['roles']: + if slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete users from this slice" + + if slice['slice_id'] in person['slice_ids']: + slice.remove_person(person) + + self.event_objects = {'Slice': [slice['slice_id']], + 'Person': [person['person_id']]} + + return 1 diff --git a/PLC/Methods/DeleteRole.py b/PLC/Methods/DeleteRole.py new file mode 100644 index 0000000..f707280 --- /dev/null +++ b/PLC/Methods/DeleteRole.py @@ -0,0 +1,38 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Roles import Role, Roles +from PLC.Auth import Auth + +class DeleteRole(Method): + """ + Deletes a role. + + WARNING: This will remove the specified role from all accounts + that possess it, and from all node and slice attributes that refer + to it. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Role.fields['role_id'], + Role.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, role_id_or_name): + roles = Roles(self.api, [role_id_or_name]) + if not roles: + raise PLCInvalidArgument, "No such role" + role = roles[0] + + role.delete() + self.event_objects = {'Role': [role['role_id']]} + + return 1 diff --git a/PLC/Methods/DeleteRoleFromPerson.py b/PLC/Methods/DeleteRoleFromPerson.py new file mode 100644 index 0000000..151ba25 --- /dev/null +++ b/PLC/Methods/DeleteRoleFromPerson.py @@ -0,0 +1,67 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Roles import Role, Roles + +class DeleteRoleFromPerson(Method): + """ + Deletes the specified role from the person. + + PIs can only revoke the tech and user roles from users and techs + at their sites. ins can revoke any role from any user. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Role.fields['role_id'], + Role.fields['name']), + Mixed(Person.fields['person_id'], + Person.fields['email']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, role_id_or_name, person_id_or_email): + # Get role + roles = Roles(self.api, [role_id_or_name]) + if not roles: + raise PLCInvalidArgument, "Invalid role '%s'" % unicode(role_id_or_name) + role = roles[0] + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Can only revoke lesser (higher) roles from others + if 'admin' not in self.caller['roles'] and \ + role['role_id'] <= min(self.caller['role_ids']): + raise PLCPermissionDenied, "Not allowed to revoke that role" + + if role['role_id'] in person['role_ids']: + person.remove_role(role) + + # Logging variables + self.event_objects = {'Person': [person['person_id']], + 'Role': [role['role_id']]} + self.message = "Role %d revoked from person %d" % \ + (role['role_id'], person['person_id']) + + return 1 diff --git a/PLC/Methods/DeleteSession.py b/PLC/Methods/DeleteSession.py new file mode 100644 index 0000000..3898f51 --- /dev/null +++ b/PLC/Methods/DeleteSession.py @@ -0,0 +1,30 @@ +import time + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import SessionAuth +from PLC.Sessions import Session, Sessions + +class DeleteSession(Method): + """ + Invalidates the current session. + + Returns 1 if successful. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + accepts = [SessionAuth()] + returns = Parameter(int, '1 if successful') + + + def call(self, auth): + assert auth.has_key('session') + + sessions = Sessions(self.api, [auth['session']]) + if not sessions: + raise PLCAPIError, "No such session" + session = sessions[0] + + session.delete() + + return 1 diff --git a/PLC/Methods/DeleteSite.py b/PLC/Methods/DeleteSite.py new file mode 100644 index 0000000..c23fff4 --- /dev/null +++ b/PLC/Methods/DeleteSite.py @@ -0,0 +1,46 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class DeleteSite(Method): + """ + Mark an existing site as deleted. The accounts of people who are + not members of at least one other non-deleted site will also be + marked as deleted. Nodes, PCUs, and slices associated with the + site will be deleted. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, site_id_or_login_base): + # Get account information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + site.delete() + + # Logging variables + self.event_objects = {'Site': [site['site_id']]} + self.message = 'Site %d deleted' % site['site_id'] + + return 1 diff --git a/PLC/Methods/DeleteSlice.py b/PLC/Methods/DeleteSlice.py new file mode 100644 index 0000000..297f8a9 --- /dev/null +++ b/PLC/Methods/DeleteSlice.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeleteSlice(Method): + """ + Deletes the specified slice. + + Users may only delete slices of which they are members. PIs may + delete any of the slices at their sites, or any slices of which + they are members. Admins may delete any slice. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + slice.delete() + self.event_objects = {'Slice': [slice['slice_id']]} + + return 1 diff --git a/PLC/Methods/DeleteSliceAttribute.py b/PLC/Methods/DeleteSliceAttribute.py new file mode 100644 index 0000000..06a99f3 --- /dev/null +++ b/PLC/Methods/DeleteSliceAttribute.py @@ -0,0 +1,59 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class DeleteSliceAttribute(Method): + """ + Deletes the specified slice or sliver attribute. + + Attributes may require the caller to have a particular role in + order to be deleted. Users may only delete attributes of + slices or slivers of which they are members. PIs may only delete + attributes of slices or slivers at their sites, or of which they + are members. Admins may delete attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + SliceAttribute.fields['slice_attribute_id'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_attribute_id): + slice_attributes = SliceAttributes(self.api, [slice_attribute_id]) + if not slice_attributes: + raise PLCInvalidArgument, "No such slice attribute" + slice_attribute = slice_attributes[0] + + slices = Slices(self.api, [slice_attribute['slice_id']]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + assert slice_attribute['slice_attribute_id'] in slice['slice_attribute_ids'] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if slice_attribute['min_role_id'] is not None and \ + min(self.caller['role_ids']) > slice_attribute['min_role_id']: + raise PLCPermissioinDenied, "Not allowed to delete the specified attribute" + + slice_attribute.delete() + self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]} + + return 1 diff --git a/PLC/Methods/DeleteSliceAttributeType.py b/PLC/Methods/DeleteSliceAttributeType.py new file mode 100644 index 0000000..e6c1a8a --- /dev/null +++ b/PLC/Methods/DeleteSliceAttributeType.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Auth import Auth + +class DeleteSliceAttributeType(Method): + """ + Deletes the specified slice attribute. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(SliceAttributeType.fields['attribute_type_id'], + SliceAttributeType.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, attribute_type_id_or_name): + attribute_types = SliceAttributeTypes(self.api, [attribute_type_id_or_name]) + if not attribute_types: + raise PLCInvalidArgument, "No such slice attribute type" + attribute_type = attribute_types[0] + + attribute_type.delete() + self.event_objects = {'AttributeType': [attribute_type['attribute_type_id']]} + + return 1 diff --git a/PLC/Methods/DeleteSliceFromNodes.py b/PLC/Methods/DeleteSliceFromNodes.py new file mode 100644 index 0000000..2390be5 --- /dev/null +++ b/PLC/Methods/DeleteSliceFromNodes.py @@ -0,0 +1,58 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeleteSliceFromNodes(Method): + """ + Deletes the specified slice from the specified nodes. If the slice is + not associated with a node, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + # Remove slice from all nodes found + + # Get specified nodes + nodes = Nodes(self.api, node_id_or_hostname_list) + for node in nodes: + if slice['peer_id'] is not None and node['peer_id'] is not None: + raise PLCPermissionDenied, "Not allowed to remove peer slice from peer node" + if slice['slice_id'] in node['slice_ids']: + slice.remove_node(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/PLC/Methods/DeleteSliceFromNodesWhitelist.py b/PLC/Methods/DeleteSliceFromNodesWhitelist.py new file mode 100644 index 0000000..8899d88 --- /dev/null +++ b/PLC/Methods/DeleteSliceFromNodesWhitelist.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeleteSliceFromNodesWhitelist(Method): + """ + Deletes the specified slice from the whitelist on the specified nodes. Nodes may be + either local or foreign nodes. + + If the slice is already associated with a node, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + # Get specified nodes, add them to the slice + nodes = Nodes(self.api, node_id_or_hostname_list) + for node in nodes: + if node['peer_id'] is not None: + raise PLCInvalidArgument, "%s not a local node" % node['hostname'] + if slice['slice_id'] in node['slice_ids_whitelist']: + slice.delete_from_node_whitelist(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/PLC/Methods/DeleteSliceInstantiation.py b/PLC/Methods/DeleteSliceInstantiation.py new file mode 100644 index 0000000..5098a9d --- /dev/null +++ b/PLC/Methods/DeleteSliceInstantiation.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Auth import Auth + +class DeleteSliceInstantiation(Method): + """ + Deletes a slice instantiation state. + + WARNING: This will cause the deletion of all slices of this instantiation. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + SliceInstantiation.fields['instantiation'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, instantiation): + slice_instantiations = SliceInstantiations(self.api, [instantiation]) + if not slice_instantiations: + raise PLCInvalidArgument, "No such slice instantiation state" + slice_instantiation = slice_instantiations[0] + + slice_instantiation.delete() + + return 1 diff --git a/PLC/Methods/GenerateNodeConfFile.py b/PLC/Methods/GenerateNodeConfFile.py new file mode 100644 index 0000000..0b5cf8e --- /dev/null +++ b/PLC/Methods/GenerateNodeConfFile.py @@ -0,0 +1,107 @@ +import random +import base64 + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +class GenerateNodeConfFile(Method): + """ + Creates a new node configuration file if all network settings are + present. This function will generate a new node key for the + specified node, effectively invalidating any old configuration + files. + + Non-admins can only generate files for nodes at their sites. + + Returns the contents of the file if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Parameter(bool, "True if you want to regenerate node key") + ] + + returns = Parameter(str, "Node configuration file") + + def call(self, auth, node_id_or_hostname, regenerate_node_key = True): + # Get node information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to generate a configuration file for that node" + + # Get node networks for this node + primary = None + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + primary = nodenetwork + break + if primary is None: + raise PLCInvalidArgument, "No primary network configured" + + # Split hostname into host and domain parts + parts = node['hostname'].split(".", 1) + if len(parts) < 2: + raise PLCInvalidArgument, "Node hostname is invalid" + host = parts[0] + domain = parts[1] + + if regenerate_node_key: + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + node['key'] = base64.b64encode("".join(map(chr, bytes))) + # XXX Boot Manager cannot handle = in the key + node['key'] = node['key'].replace("=", "") + # Save it + node.sync() + + # Generate node configuration file suitable for BootCD + file = "" + + file += 'NODE_ID="%d"\n' % node['node_id'] + file += 'NODE_KEY="%s"\n' % node['key'] + + if primary['mac']: + file += 'NET_DEVICE="%s"\n' % primary['mac'].lower() + + file += 'IP_METHOD="%s"\n' % primary['method'] + + if primary['method'] == 'static': + file += 'IP_ADDRESS="%s"\n' % primary['ip'] + file += 'IP_GATEWAY="%s"\n' % primary['gateway'] + file += 'IP_NETMASK="%s"\n' % primary['netmask'] + file += 'IP_NETADDR="%s"\n' % primary['network'] + file += 'IP_BROADCASTADDR="%s"\n' % primary['broadcast'] + file += 'IP_DNS1="%s"\n' % primary['dns1'] + file += 'IP_DNS2="%s"\n' % (primary['dns2'] or "") + + file += 'HOST_NAME="%s"\n' % host + file += 'DOMAIN_NAME="%s"\n' % domain + + for nodenetwork in nodenetworks: + if nodenetwork['method'] == 'ipmi': + file += 'IPMI_ADDRESS="%s"\n' % nodenetwork['ip'] + if nodenetwork['mac']: + file += 'IPMI_MAC="%s"\n' % nodenetwork['mac'].lower() + break + + return file diff --git a/PLC/Methods/GetAddressTypes.py b/PLC/Methods/GetAddressTypes.py new file mode 100644 index 0000000..d10be73 --- /dev/null +++ b/PLC/Methods/GetAddressTypes.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +class GetAddressTypes(Method): + """ + Returns an array of structs containing details about address + types. If address_type_filter is specified and is an array of + address type identifiers, or a struct of address type attributes, + only address types matching the filter will be returned. If + return_fields is specified, only the specified details will be + returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name'])], + Filter(AddressType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [AddressType.fields] + + + def call(self, auth, address_type_filter = None, return_fields = None): + return AddressTypes(self.api, address_type_filter, return_fields) diff --git a/PLC/Methods/GetAddresses.py b/PLC/Methods/GetAddresses.py new file mode 100644 index 0000000..b299295 --- /dev/null +++ b/PLC/Methods/GetAddresses.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class GetAddresses(Method): + """ + Returns an array of structs containing details about addresses. If + address_filter is specified and is an array of address + identifiers, or a struct of address attributes, only addresses + matching the filter will be returned. If return_fields is + specified, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Address.fields['address_id']], + Filter(Address.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Address.fields] + + + def call(self, auth, address_filter = None, return_fields = None): + return Addresses(self.api, address_filter, return_fields) diff --git a/PLC/Methods/GetBootMedium.py b/PLC/Methods/GetBootMedium.py new file mode 100644 index 0000000..5daac9b --- /dev/null +++ b/PLC/Methods/GetBootMedium.py @@ -0,0 +1,400 @@ +import random +import base64 +import os +import os.path + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings + +# +# xxx todo +# Thierry on june 5 2007 +# +# it turns out that having either apache (when invoked through xmlrpc) +# or root (when running plcsh directly) run this piece of code is +# problematic. In fact although we try to create intermediate dirs +# with mode 777, what happens is that root's umask in the plc chroot +# jail is set to 0022. +# +# the bottom line is, depending on who (apache or root) runs this for +# the first time, we can access denied issued (when root comes first) +# so probably we'd better implement a scheme where files are stored +# directly under /var/tmp or something +# +# in addition the sequels of a former run (e.g. with a non-empty +# filename) can prevent subsequent runs if the file is not properly +# cleaned up after use, which is generally the case if someone invokes +# this through plcsh and does not clean up +# so maybe a dedicated cleanup method could be useful just in case +# + +# could not define this in the class.. +boot_medium_actions = [ 'node-preview', + 'node-floppy', + 'node-iso', + 'node-usb', + 'generic-iso', + 'generic-usb', + ] + +class GetBootMedium(Method): + """ + This method is a redesign based on former, supposedly dedicated, + AdmGenerateNodeConfFile + + As compared with its ancestor, this method provides a much more detailed + detailed interface, that allows to + (*) either just preview the node config file (in which case + the node key is NOT recomputed, and NOT provided in the output + (*) or regenerate the node config file for storage on a floppy + that is, exactly what the ancestor method used todo, + including renewing the node's key + (*) or regenerate the config file and bundle it inside an ISO or USB image + (*) or just provide the generic ISO or USB boot images + in which case of course the node_id_or_hostname parameter is not used + + action is expected among the following string constants + (*) node-preview + (*) node-floppy + (*) node-iso + (*) node-usb + (*) generic-iso + (*) generic-usb + + Apart for the preview mode, this method generates a new node key for the + specified node, effectively invalidating any old boot medium. + + Non-admins can only generate files for nodes at their sites. + + In addition, two return mechanisms are supported. + (*) The default behaviour is that the file's content is returned as a + base64-encoded string. This is how the ancestor method used to work. + To use this method, pass an empty string as the file parameter. + + (*) Or, for efficiency -- this makes sense only when the API is used + by the web pages that run on the same host -- the caller may provide + a filename, in which case the resulting file is stored in that location instead. + The filename argument can use the following markers, that are expanded + within the method + - %d : default root dir (some builtin dedicated area under /var/tmp/) + Using this is recommended, and enforced for non-admin users + - %n : the node's name when this makes sense, or a mktemp-like name when + generic media is requested + - %s : a file suffix appropriate in the context (.txt, .iso or the like) + - %v : the bootcd version string (e.g. 4.0) + - %p : the PLC name + With the file-based return mechanism, the method returns the full pathname + of the result file; it is the caller's responsability to remove + this file after use. + + Security: + When the user's role is not admin, the provided directory *must* be under + the %d area + + Housekeeping: + Whenever needed, the method stores intermediate files in a + private area, typically not located under the web server's + accessible area, and are cleaned up by the method. + + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Parameter (str, "Action mode, expected in " + "|".join(boot_medium_actions)), + Parameter (str, "Empty string for verbatim result, resulting file full path otherwise"), + ] + + returns = Parameter(str, "Node boot medium, either inlined, or filename, depending to the filename parameter") + + BOOTCDDIR = "/usr/share/bootcd/" + BOOTCUSTOM = "/usr/share/bootcd/bootcustom.sh" + GENERICDIR = "/var/www/html/download/" + NODEDIR = "/var/tmp/bootmedium/results" + WORKDIR = "/var/tmp/bootmedium/work" + DEBUG = False + # uncomment this to preserve temporary area and bootcustom logs + #DEBUG = True + + ### returns (host, domain) : + # 'host' : host part of the hostname + # 'domain' : domain part of the hostname + def split_hostname (self, node): + # Split hostname into host and domain parts + parts = node['hostname'].split(".", 1) + if len(parts) < 2: + raise PLCInvalidArgument, "Node hostname %s is invalid"%node['hostname'] + return parts + + # plnode.txt content + def floppy_contents (self, node, renew_key): + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to generate a configuration file for %s"%node['hostname'] + + # Get node networks for this node + primary = None + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + primary = nodenetwork + break + if primary is None: + raise PLCInvalidArgument, "No primary network configured on %s"%node['hostname'] + + ( host, domain ) = self.split_hostname (node) + + if renew_key: + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + node['key'] = base64.b64encode("".join(map(chr, bytes))) + # XXX Boot Manager cannot handle = in the key + node['key'] = node['key'].replace("=", "") + # Save it + node.sync() + + # Generate node configuration file suitable for BootCD + file = "" + + if renew_key: + file += 'NODE_ID="%d"\n' % node['node_id'] + file += 'NODE_KEY="%s"\n' % node['key'] + + if primary['mac']: + file += 'NET_DEVICE="%s"\n' % primary['mac'].lower() + + file += 'IP_METHOD="%s"\n' % primary['method'] + + if primary['method'] == 'static': + file += 'IP_ADDRESS="%s"\n' % primary['ip'] + file += 'IP_GATEWAY="%s"\n' % primary['gateway'] + file += 'IP_NETMASK="%s"\n' % primary['netmask'] + file += 'IP_NETADDR="%s"\n' % primary['network'] + file += 'IP_BROADCASTADDR="%s"\n' % primary['broadcast'] + file += 'IP_DNS1="%s"\n' % primary['dns1'] + file += 'IP_DNS2="%s"\n' % (primary['dns2'] or "") + + file += 'HOST_NAME="%s"\n' % host + file += 'DOMAIN_NAME="%s"\n' % domain + + # define various nodenetwork settings attached to the primary nodenetwork + settings = NodeNetworkSettings (self.api, {'nodenetwork_id':nodenetwork['nodenetwork_id']}) + + categories = set() + for setting in settings: + if setting['category'] is not None: + categories.add(setting['category']) + + for category in categories: + category_settings = NodeNetworkSettings(self.api,{'nodenetwork_id':nodenetwork['nodenetwork_id'], + 'category':category}) + if category_settings: + file += '### Category : %s\n'%category + for setting in category_settings: + file += '%s_%s="%s"\n'%(category.upper(),setting['name'].upper(),setting['value']) + + for nodenetwork in nodenetworks: + if nodenetwork['method'] == 'ipmi': + file += 'IPMI_ADDRESS="%s"\n' % nodenetwork['ip'] + if nodenetwork['mac']: + file += 'IPMI_MAC="%s"\n' % nodenetwork['mac'].lower() + break + + return file + + def bootcd_version (self): + try: + f = open (self.BOOTCDDIR + "/build/version.txt") + version=f.readline().strip() + finally: + f.close() + return version + + def cleandir (self,tempdir): + if not self.DEBUG: + os.system("rm -rf %s"%tempdir) + + def call(self, auth, node_id_or_hostname, action, filename): + + ### check action + if action not in boot_medium_actions: + raise PLCInvalidArgument, "Unknown action %s"%action + + ### compute file suffix + if action.find("-iso") >= 0 : + suffix=".iso" + elif action.find("-usb") >= 0: + suffix=".usb" + else: + suffix=".txt" + + ### compute a 8 bytes random number + tempbytes = random.sample (xrange(0,256), 8); + def hexa2 (c): + return chr((c>>4)+65) + chr ((c&16)+65) + temp = "".join(map(hexa2,tempbytes)) + + ### check node if needed + if action.find("node-") == 0: + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node %r"%node_id_or_hostname + node = nodes[0] + nodename = node['hostname'] + + else: + node = None + nodename = temp + + ### handle filename + filename = filename.replace ("%d",self.NODEDIR) + filename = filename.replace ("%n",nodename) + filename = filename.replace ("%s",suffix) + filename = filename.replace ("%p",self.api.config.PLC_NAME) + # only if filename contains "%v", bootcd is maybe not avail ? + if filename.find("%v") >=0: + filename = filename.replace ("%v",self.bootcd_version()) + + ### Check filename location + if filename != '': + if 'admin' not in self.caller['roles']: + if ( filename.index(self.NODEDIR) != 0): + raise PLCInvalidArgument, "File %s not under %s"%(filename,self.NODEDIR) + + ### output should not exist (concurrent runs ..) + if os.path.exists(filename): + raise PLCInvalidArgument, "Resulting file %s already exists"%filename + + ### we can now safely create the file, + ### either we are admin or under a controlled location + if not os.path.exists(os.path.dirname(filename)): + try: + os.makedirs (os.path.dirname(filename),0777) + except: + raise PLCPermissionDenied, "Could not create dir %s"%os.path.dirname(filename) + + + ### generic media + if action == 'generic-iso' or action == 'generic-usb': + # this raises an exception if bootcd is missing + version = self.bootcd_version() + generic_name = "%s-BootCD-%s%s"%(self.api.config.PLC_NAME, + version, + suffix) + generic_path = "%s/%s" % (self.GENERICDIR,generic_name) + + if filename: + ret=os.system ("cp %s %s"%(generic_path,filename)) + if ret==0: + return filename + else: + raise PLCPermissionDenied, "Could not copy %s into"%(generic_path,filename) + else: + ### return the generic medium content as-is, just base64 encoded + return base64.b64encode(file(generic_path).read()) + + ### floppy preview + if action == 'node-preview': + floppy = self.floppy_contents (node,False) + if filename: + try: + file(filename,'w').write(floppy) + except: + raise PLCPermissionDenied, "Could not write into %s"%filename + return filename + else: + return floppy + + if action == 'node-floppy': + floppy = self.floppy_contents (node,True) + if filename: + try: + file(filename,'w').write(floppy) + except: + raise PLCPermissionDenied, "Could not write into %s"%filename + return filename + else: + return floppy + + ### we're left with node-iso and node-usb + if action == 'node-iso' or action == 'node-usb': + + ### check we've got required material + version = self.bootcd_version() + generic_name = "%s-BootCD-%s%s"%(self.api.config.PLC_NAME, + version, + suffix) + generic_path = "%s/%s" % (self.GENERICDIR,generic_name) + if not os.path.isfile(generic_path): + raise PLCAPIError, "Cannot locate generic medium %s"%generic_path + + if not os.path.isfile(self.BOOTCUSTOM): + raise PLCAPIError, "Cannot locate bootcustom script %s"%self.BOOTCUSTOM + + # need a temporary area + tempdir = "%s/%s"%(self.WORKDIR,nodename) + if not os.path.isdir(tempdir): + try: + os.makedirs(tempdir,0777) + except: + raise PLCPermissionDenied, "Could not create dir %s"%tempdir + + try: + # generate floppy config + floppy = self.floppy_contents(node,True) + # store it + node_floppy = "%s/%s"%(tempdir,nodename) + try: + file(node_floppy,"w").write(floppy) + except: + raise PLCPermissionDenied, "Could not write into %s"%node_floppy + + # invoke bootcustom + bootcustom_command = 'sudo %s -C "%s" "%s" "%s"'%(self.BOOTCUSTOM, + tempdir, + generic_path, + node_floppy) + if self.DEBUG: + print 'bootcustom command:',bootcustom_command + ret=os.system(bootcustom_command) + if ret != 0: + raise PLCPermissionDenied,"bootcustom.sh failed to create node-specific medium" + + node_image = "%s/%s%s"%(tempdir,nodename,suffix) + if not os.path.isfile (node_image): + raise PLCAPIError,"Unexpected location of bootcustom output - %s"%node_image + + # cache result + if filename: + ret=os.system("mv %s %s"%(node_image,filename)) + if ret != 0: + raise PLCAPIError, "Could not move node image %s into %s"%(node_image,filename) + self.cleandir(tempdir) + return filename + else: + result = file(node_image).read() + self.cleandir(tempdir) + return base64.b64encode(result) + except: + self.cleandir(tempdir) + raise + + # we're done here, or we missed something + raise PLCAPIError,'Unhandled action %s'%action + diff --git a/PLC/Methods/GetBootStates.py b/PLC/Methods/GetBootStates.py new file mode 100644 index 0000000..4cd31be --- /dev/null +++ b/PLC/Methods/GetBootStates.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.BootStates import BootState, BootStates +from PLC.Auth import Auth + +class GetBootStates(Method): + """ + Returns an array of all valid node boot states. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [BootState.fields['boot_state']] + + + def call(self, auth): + return [boot_state['boot_state'] for boot_state in BootStates(self.api)] diff --git a/PLC/Methods/GetConfFiles.py b/PLC/Methods/GetConfFiles.py new file mode 100644 index 0000000..89d5250 --- /dev/null +++ b/PLC/Methods/GetConfFiles.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +class GetConfFiles(Method): + """ + Returns an array of structs containing details about configuration + files. If conf_file_filter is specified and is an array of + configuration file identifiers, or a struct of configuration file + attributes, only configuration files matching the filter will be + returned. If return_fields is specified, only the specified + details will be returned. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed([ConfFile.fields['conf_file_id']], + Filter(ConfFile.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [ConfFile.fields] + + + def call(self, auth, conf_file_filter = None, return_fields = None): + return ConfFiles(self.api, conf_file_filter, return_fields) diff --git a/PLC/Methods/GetEventObjects.py b/PLC/Methods/GetEventObjects.py new file mode 100644 index 0000000..02bcd68 --- /dev/null +++ b/PLC/Methods/GetEventObjects.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.EventObjects import EventObject, EventObjects +from PLC.Auth import Auth + +class GetEventObjects(Method): + """ + Returns an array of structs containing details about events and + faults. If event_filter is specified and is an array of event + identifiers, or a struct of event attributes, only events matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Filter(EventObject.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [EventObject.fields] + + def call(self, auth, event_filter = None, return_fields = None): + return EventObjects(self.api, event_filter, return_fields) + diff --git a/PLC/Methods/GetEvents.py b/PLC/Methods/GetEvents.py new file mode 100644 index 0000000..2bc989c --- /dev/null +++ b/PLC/Methods/GetEvents.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Events import Event, Events +from PLC.Auth import Auth + +class GetEvents(Method): + """ + Returns an array of structs containing details about events and + faults. If event_filter is specified and is an array of event + identifiers, or a struct of event attributes, only events matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed([Event.fields['event_id']], + Filter(Event.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Event.fields] + + def call(self, auth, event_filter = None, return_fields = None): + return Events(self.api, event_filter, return_fields) + diff --git a/PLC/Methods/GetInitScripts.py b/PLC/Methods/GetInitScripts.py new file mode 100644 index 0000000..d8bb0f5 --- /dev/null +++ b/PLC/Methods/GetInitScripts.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class GetInitScripts(Method): + """ + Returns an array of structs containing details about initscripts. + If initscript_filter is specified and is an array of initscript + identifiers, or a struct of initscript attributes, only initscripts + matching the filter will be returned. If return_fields is specified, + only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(InitScript.fields['initscript_id'], + InitScript.fields['name'])], + Filter(InitScript.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [InitScript.fields] + + + def call(self, auth, initscript_filter = None, return_fields = None): + return InitScripts(self.api, initscript_filter, return_fields) diff --git a/PLC/Methods/GetKeyTypes.py b/PLC/Methods/GetKeyTypes.py new file mode 100644 index 0000000..32bb658 --- /dev/null +++ b/PLC/Methods/GetKeyTypes.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import Auth + +class GetKeyTypes(Method): + """ + Returns an array of all valid key types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [KeyType.fields['key_type']] + + + def call(self, auth): + return [key_type['key_type'] for key_type in KeyTypes(self.api)] diff --git a/PLC/Methods/GetKeys.py b/PLC/Methods/GetKeys.py new file mode 100644 index 0000000..2d7550c --- /dev/null +++ b/PLC/Methods/GetKeys.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class GetKeys(Method): + """ + Returns an array of structs containing details about keys. If + key_filter is specified and is an array of key identifiers, or a + struct of key attributes, only keys matching the filter will be + returned. If return_fields is specified, only the specified + details will be returned. + + Admin may query all keys. Non-admins may only query their own + keys. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Key.fields['key_id'])], + Filter(Key.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Key.fields] + + + def call(self, auth, key_filter = None, return_fields = None): + keys = Keys(self.api, key_filter, return_fields) + + # If we are not admin, make sure to only return our own keys + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + keys = filter(lambda key: key['key_id'] in self.caller['key_ids'], keys) + + return keys diff --git a/PLC/Methods/GetMessages.py b/PLC/Methods/GetMessages.py new file mode 100644 index 0000000..b0eb44e --- /dev/null +++ b/PLC/Methods/GetMessages.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +class GetMessages(Method): + """ + Returns an array of structs containing details about message + templates. If message template_filter is specified and is an array + of message template identifiers, or a struct of message template + attributes, only message templates matching the filter will be + returned. If return_fields is specified, only the specified + details will be returned. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed([Message.fields['message_id']], + Filter(Message.fields)), + Parameter([str], "List of fields to return", nullok = True), + ] + + returns = [Message.fields] + + + def call(self, auth, message_filter = None, return_fields = None): + return Messages(self.api, message_filter, return_fields) diff --git a/PLC/Methods/GetNetworkMethods.py b/PLC/Methods/GetNetworkMethods.py new file mode 100644 index 0000000..cee914a --- /dev/null +++ b/PLC/Methods/GetNetworkMethods.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import Auth + +class GetNetworkMethods(Method): + """ + Returns a list of all valid network methods. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [NetworkMethod.fields['method']] + + + def call(self, auth): + return [network_method['method'] for network_method in NetworkMethods(self.api)] diff --git a/PLC/Methods/GetNetworkTypes.py b/PLC/Methods/GetNetworkTypes.py new file mode 100644 index 0000000..dbddd9f --- /dev/null +++ b/PLC/Methods/GetNetworkTypes.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import Auth + +class GetNetworkTypes(Method): + """ + Returns a list of all valid network types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [NetworkType.fields['type']] + + + def call(self, auth): + return [network_type['type'] for network_type in NetworkTypes(self.api)] diff --git a/PLC/Methods/GetNodeGroups.py b/PLC/Methods/GetNodeGroups.py new file mode 100644 index 0000000..f4927ef --- /dev/null +++ b/PLC/Methods/GetNodeGroups.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.NodeGroups import NodeGroup, NodeGroups + +class GetNodeGroups(Method): + """ + Returns an array of structs containing details about node groups. + If nodegroup_filter is specified and is an array of node group + identifiers or names, or a struct of node group attributes, only + node groups matching the filter will be returned. If return_fields + is specified, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name'])], + Filter(NodeGroup.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeGroup.fields] + + def call(self, auth, nodegroup_filter = None, return_fields = None): + return NodeGroups(self.api, nodegroup_filter, return_fields) diff --git a/PLC/Methods/GetNodeNetworkSettingTypes.py b/PLC/Methods/GetNodeNetworkSettingTypes.py new file mode 100644 index 0000000..462cfbc --- /dev/null +++ b/PLC/Methods/GetNodeNetworkSettingTypes.py @@ -0,0 +1,33 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes + +class GetNodeNetworkSettingTypes(Method): + """ + Returns an array of structs containing details about + nodenetwork setting types. + + The usual filtering scheme applies on this method. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name'])], + Filter(NodeNetworkSettingType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeNetworkSettingType.fields] + + def call(self, auth, nodenetwork_setting_type_filter = None, return_fields = None): + return NodeNetworkSettingTypes(self.api, nodenetwork_setting_type_filter, return_fields) diff --git a/PLC/Methods/GetNodeNetworkSettings.py b/PLC/Methods/GetNodeNetworkSettings.py new file mode 100644 index 0000000..0003be9 --- /dev/null +++ b/PLC/Methods/GetNodeNetworkSettings.py @@ -0,0 +1,45 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.Sites import Site, Sites +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +class GetNodeNetworkSettings(Method): + """ + Returns an array of structs containing details about + nodenetworks and related settings. + + If nodenetwork_setting_filter is specified and is an array of + nodenetwork setting identifiers, only nodenetwork settings matching + the filter will be returned. If return_fields is specified, only + the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([NodeNetworkSetting.fields['nodenetwork_setting_id']], + Parameter(int,"Nodenetwork setting id"), + Filter(NodeNetworkSetting.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeNetworkSetting.fields] + + + def call(self, auth, nodenetwork_setting_filter = None, return_fields = None): + + nodenetwork_settings = NodeNetworkSettings(self.api, nodenetwork_setting_filter, return_fields) + + return nodenetwork_settings diff --git a/PLC/Methods/GetNodeNetworks.py b/PLC/Methods/GetNodeNetworks.py new file mode 100644 index 0000000..150f87d --- /dev/null +++ b/PLC/Methods/GetNodeNetworks.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +class GetNodeNetworks(Method): + """ + Returns an array of structs containing details about node network + interfacess. If nodenetworks_filter is specified and is an array + of node network identifiers, or a struct of node network + fields and values, only node network interfaces matching the filter + will be returned. + + If return_fields is given, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([NodeNetwork.fields['nodenetwork_id']], + Parameter (int, "nodenetwork id"), + Filter(NodeNetwork.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeNetwork.fields] + + def call(self, auth, nodenetwork_filter = None, return_fields = None): + return NodeNetworks(self.api, nodenetwork_filter, return_fields) diff --git a/PLC/Methods/GetNodes.py b/PLC/Methods/GetNodes.py new file mode 100644 index 0000000..8e2931a --- /dev/null +++ b/PLC/Methods/GetNodes.py @@ -0,0 +1,79 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class GetNodes(Method): + """ + Returns an array of structs containing details about nodes. If + node_filter is specified and is an array of node identifiers or + hostnames, or a struct of node attributes, only nodes matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Some fields may only be viewed by admins. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(Node.fields['node_id'], + Node.fields['hostname'])], + Parameter(str,"hostname"), + Parameter(int,"node_id"), + Filter(Node.fields)), + Parameter([str], "List of fields to return", nullok = True), + ] + + returns = [Node.fields] + + + def call(self, auth, node_filter = None, return_fields = None): + + # Must query at least slice_ids_whitelist + if return_fields is not None: + added_fields = set(['slice_ids_whitelist', 'site_id']).difference(return_fields) + return_fields += added_fields + else: + added_fields =[] + + # Get node information + nodes = Nodes(self.api, node_filter, return_fields) + + # Remove admin only fields + if not isinstance(self.caller, Person) or \ + 'admin' not in self.caller['roles']: + slice_ids = set() + site_ids = set() + if self.caller: + slice_ids.update(self.caller['slice_ids']) + site_ids.update(self.caller['site_ids']) + + # if node has whitelist, only return it if users is at + # the same site or user has a slice on the whitelist + for node in nodes[:]: + if 'site_id' in node and \ + site_ids.intersection([node['site_id']]): + continue + if 'slice_ids_whitelist' in node and \ + node['slice_ids_whitelist'] and \ + not slice_ids.intersection(node['slice_ids_whitelist']): + nodes.remove(node) + + # remove remaining admin only fields + for node in nodes: + for field in ['boot_nonce', 'key', 'session', 'root_person_ids']: + if field in node: + del node[field] + + # remove added fields if not specified + if added_fields: + for node in nodes: + for field in added_fields: + del node[field] + + return nodes diff --git a/PLC/Methods/GetPCUProtocolTypes.py b/PLC/Methods/GetPCUProtocolTypes.py new file mode 100644 index 0000000..44f9380 --- /dev/null +++ b/PLC/Methods/GetPCUProtocolTypes.py @@ -0,0 +1,40 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.Auth import Auth +from PLC.Filter import Filter + +class GetPCUProtocolTypes(Method): + """ + Returns an array of PCU Types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([PCUProtocolType.fields['pcu_type_id']], + Filter(PCUProtocolType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [PCUProtocolType.fields] + + + def call(self, auth, protocol_type_filter = None, return_fields = None): + + #Must query at least pcu_type_id + if return_fields is not None and 'pcu_protocol_type_id' not in return_fields: + return_fields.append('pcu_protocol_type_id') + added_fields = ['pcu_protocol_type_id'] + else: + added_fields = [] + + protocol_types = PCUProtocolTypes(self.api, protocol_type_filter, return_fields) + + for added_field in added_fields: + for protocol_type in protocol_types: + del protocol_type[added_field] + + return protocol_types diff --git a/PLC/Methods/GetPCUTypes.py b/PLC/Methods/GetPCUTypes.py new file mode 100644 index 0000000..cf0d689 --- /dev/null +++ b/PLC/Methods/GetPCUTypes.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth +from PLC.Filter import Filter + +class GetPCUTypes(Method): + """ + Returns an array of PCU Types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([PCUType.fields['pcu_type_id'], + PCUType.fields['model']], + Filter(PCUType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [PCUType.fields] + + + def call(self, auth, pcu_type_filter = None, return_fields = None): + + #Must query at least pcu_type_id + if return_fields is not None: + added_fields = [] + if 'pcu_type_id' not in return_fields: + return_fields.append('pcu_type_id') + added_fields.append('pcu_type_id') + if 'pcu_protocol_types' in return_fields and \ + 'pcu_protocol_type_ids' not in return_fields: + return_fields.append('pcu_protocol_type_ids') + added_fields.append('pcu_protocol_type_ids') + else: + added_fields = [] + + pcu_types = PCUTypes(self.api, pcu_type_filter, return_fields) + + # remove added fields and protocol_types + for added_field in added_fields: + for pcu_type in pcu_types: + del pcu_type[added_field] + + return pcu_types diff --git a/PLC/Methods/GetPCUs.py b/PLC/Methods/GetPCUs.py new file mode 100644 index 0000000..ee9ab4d --- /dev/null +++ b/PLC/Methods/GetPCUs.py @@ -0,0 +1,73 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class GetPCUs(Method): + """ + Returns an array of structs containing details about power control + units (PCUs). If pcu_filter is specified and is an array of PCU + identifiers, or a struct of PCU attributes, only PCUs matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Admin may query all PCUs. Non-admins may only query the PCUs at + their sites. + """ + + roles = ['admin', 'pi', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([PCU.fields['pcu_id']], + Filter(PCU.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [PCU.fields] + + def call(self, auth, pcu_filter = None, return_fields = None): + # If we are not admin + if not (isinstance(self.caller, Person) and 'admin' in self.caller['roles']): + # Return only the PCUs at our site + valid_pcu_ids = [] + + if isinstance(self.caller, Person): + site_ids = self.caller['site_ids'] + elif isinstance(self.caller, Node): + site_ids = [self.caller['site_id']] + + for site in Sites(self.api, site_ids): + valid_pcu_ids += site['pcu_ids'] + + if not valid_pcu_ids: + return [] + + if pcu_filter is None: + pcu_filter = valid_pcu_ids + + # Must query at least slice_id (see below) + if return_fields is not None and 'pcu_id' not in return_fields: + return_fields.append('pcu_id') + added_fields = True + else: + added_fields = False + + pcus = PCUs(self.api, pcu_filter, return_fields) + + # Filter out PCUs that are not viewable + if not (isinstance(self.caller, Person) and 'admin' in self.caller['roles']): + pcus = filter(lambda pcu: pcu['pcu_id'] in valid_pcu_ids, pcus) + + # Remove pcu_id if not specified + if added_fields: + for pcu in pcus: + if 'pcu_id' in pcu: + del pcu['pcu_id'] + + return pcus diff --git a/PLC/Methods/GetPeerData.py b/PLC/Methods/GetPeerData.py new file mode 100644 index 0000000..e68cf55 --- /dev/null +++ b/PLC/Methods/GetPeerData.py @@ -0,0 +1,87 @@ +# +# Thierry Parmentelat - INRIA +# +# $Id: GetPeerData.py 5574 2007-10-25 20:33:17Z thierry $ + +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.Peers import Peer, Peers + +from PLC.Sites import Site, Sites +from PLC.Keys import Key, Keys +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.SliceAttributes import SliceAttributes + +class GetPeerData(Method): + """ + Returns lists of local objects that a peer should cache in its + database as foreign objects. Also returns the list of foreign + nodes in this database, for which the calling peer is + authoritative, to assist in synchronization of slivers. + + See the implementation of RefreshPeer for how this data is used. + """ + + roles = ['admin', 'peer'] + + accepts = [Auth()] + + returns = { + 'Sites': Parameter([dict], "List of local sites"), + 'Keys': Parameter([dict], "List of local keys"), + 'Nodes': Parameter([dict], "List of local nodes"), + 'Persons': Parameter([dict], "List of local users"), + 'Slices': Parameter([dict], "List of local slices"), + 'db_time': Parameter(float, "(Debug) Database fetch time"), + } + + def call (self, auth): + start = time.time() + + # Filter out various secrets + node_fields = filter(lambda field: field not in \ + ['boot_nonce', 'key', 'session', 'root_person_ids'], + Node.fields) + nodes = Nodes(self.api, {'peer_id': None}, node_fields); + # filter out whitelisted nodes + nodes = [ n for n in nodes if not n['slice_ids_whitelist']] + + + person_fields = filter(lambda field: field not in \ + ['password', 'verification_key', 'verification_expires'], + Person.fields) + + # XXX Optimize to return only those Persons, Keys, and Slices + # necessary for slice creation on the calling peer's nodes. + + # filter out special person + persons = Persons(self.api, {'~email':[self.api.config.PLC_API_MAINTENANCE_USER, + self.api.config.PLC_ROOT_USER], + 'peer_id': None}, person_fields) + + # filter out system slices + system_slice_ids = SliceAttributes(self.api, {'name': 'system', 'value': '1'}).dict('slice_id') + slices = Slices(self.api, {'peer_id': None, + '~slice_id':system_slice_ids.keys()}) + + result = { + 'Sites': Sites(self.api, {'peer_id': None}), + 'Keys': Keys(self.api, {'peer_id': None}), + 'Nodes': nodes, + 'Persons': persons, + 'Slices': slices, + } + + if isinstance(self.caller, Peer): + result['PeerNodes'] = Nodes(self.api, {'peer_id': self.caller['peer_id']}) + + result['db_time'] = time.time() - start + + return result diff --git a/PLC/Methods/GetPeerName.py b/PLC/Methods/GetPeerName.py new file mode 100644 index 0000000..30fbd94 --- /dev/null +++ b/PLC/Methods/GetPeerName.py @@ -0,0 +1,19 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter +from PLC.Auth import Auth + +from PLC.Peers import Peer, Peers + +class GetPeerName (Method): + """ + Returns this peer's name, as defined in the config as PLC_NAME + """ + + roles = ['admin', 'peer', 'node'] + + accepts = [Auth()] + + returns = Peer.fields['peername'] + + def call (self, auth): + return self.api.config.PLC_NAME diff --git a/PLC/Methods/GetPeers.py b/PLC/Methods/GetPeers.py new file mode 100644 index 0000000..e93fe36 --- /dev/null +++ b/PLC/Methods/GetPeers.py @@ -0,0 +1,47 @@ +# +# Thierry Parmentelat - INRIA +# + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth + +from PLC.Persons import Person +from PLC.Peers import Peer, Peers + +class GetPeers (Method): + """ + Returns an array of structs containing details about peers. If + person_filter is specified and is an array of peer identifiers or + peer names, or a struct of peer attributes, only peers matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin', 'node','pi','user'] + + accepts = [ + Auth(), + Mixed([Mixed(Peer.fields['peer_id'], + Peer.fields['peername'])], + Filter(Peer.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Peer.fields] + + def call (self, auth, peer_filter = None, return_fields = None): + + peers = Peers(self.api, peer_filter, return_fields) + + # Remove admin only fields + if not isinstance(self.caller, Person) or \ + 'admin' not in self.caller['roles']: + for peer in peers: + for field in ['key', 'cacert']: + if field in peer: + del peer[field] + + return peers diff --git a/PLC/Methods/GetPersons.py b/PLC/Methods/GetPersons.py new file mode 100644 index 0000000..5228933 --- /dev/null +++ b/PLC/Methods/GetPersons.py @@ -0,0 +1,87 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +hidden_fields = ['password', 'verification_key', 'verification_expires'] + +class GetPersons(Method): + """ + Returns an array of structs containing details about users. If + person_filter is specified and is an array of user identifiers or + usernames, or a struct of user attributes, only users matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Users and techs may only retrieve details about themselves. PIs + may retrieve details about themselves and others at their + sites. Admins and nodes may retrieve details about all accounts. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Person.fields['person_id'], + Person.fields['email'])], + Parameter(str,"email"), + Parameter(int,"person_id"), + Filter(Person.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + # Filter out password field + return_fields = dict(filter(lambda (field, value): field not in hidden_fields, + Person.fields.items())) + returns = [return_fields] + + def call(self, auth, person_filter = None, return_fields = None): + # If we are not admin, make sure to only return viewable accounts + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get accounts that we are able to view + valid_person_ids = [self.caller['person_id']] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_person_ids += site['person_ids'] + + if not valid_person_ids: + return [] + + if person_filter is None: + person_filter = valid_person_ids + + # Filter out password field + if return_fields: + return_fields = filter(lambda field: field not in hidden_fields, + return_fields) + else: + return_fields = self.return_fields.keys() + + # Must query at least person_id, site_ids, and role_ids (see + # Person.can_view() and below). + if return_fields is not None: + added_fields = set(['person_id', 'site_ids', 'role_ids']).difference(return_fields) + return_fields += added_fields + else: + added_fields = [] + + persons = Persons(self.api, person_filter, return_fields) + + # Filter out accounts that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + persons = filter(self.caller.can_view, persons) + + # Remove added fields if not specified + if added_fields: + for person in persons: + for field in added_fields: + if field in person: + del person[field] + + return persons diff --git a/PLC/Methods/GetPlcRelease.py b/PLC/Methods/GetPlcRelease.py new file mode 100644 index 0000000..7df66aa --- /dev/null +++ b/PLC/Methods/GetPlcRelease.py @@ -0,0 +1,57 @@ +from PLC.Method import Method +from PLC.Auth import Auth +from PLC.Faults import * + +import re + +comment_regexp = '\A\s*#.|\A\s*\Z|\Axxxxx' + +regexps = { 'build' : '\A[bB]uild\s+(?P[^:]+)\s*:\s*(?P.*)\Z', + 'tags' : '\A(?P[^:]+)\s*:=\s*(?P.*)\Z'} + +class GetPlcRelease(Method): + """ + Returns various information about the current myplc installation. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + ] + + # for now only return /etc/myplc-release verbatim + returns = { 'build' : 'information about the build', + 'tags' : 'describes the codebase location and tags used for building', + 'rpms' : 'details the rpm installed in the myplc chroot jail' } + + def call(self, auth): + + comment_matcher = re.compile(comment_regexp) + + matchers = {} + result = {} + for field in regexps.keys(): + matchers[field] = re.compile(regexps[field]) + result[field]={} + result['rpms']="Not implemented yet" + + try: + release = open('/etc/myplc-release') + for line in release.readlines(): + line=line.strip() + if comment_matcher.match(line): + continue + for field in regexps.keys(): + m=matchers[field].match(line) + if m: + (key,value)=m.groups(['key','value']) + result[field][key]=value + break + else: + if not result.has_key('unexpected'): + result['unexpected']="" + result['unexpected'] += (line+"\n") + except: + raise PLCNotImplemented, 'Cannot open /etc/myplc-release' + return result diff --git a/PLC/Methods/GetRoles.py b/PLC/Methods/GetRoles.py new file mode 100644 index 0000000..0456662 --- /dev/null +++ b/PLC/Methods/GetRoles.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Roles import Role, Roles +from PLC.Auth import Auth + +class GetRoles(Method): + """ + Get an array of structs containing details about all roles. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [Role.fields] + + def call(self, auth): + return Roles(self.api) diff --git a/PLC/Methods/GetSession.py b/PLC/Methods/GetSession.py new file mode 100644 index 0000000..ae75219 --- /dev/null +++ b/PLC/Methods/GetSession.py @@ -0,0 +1,39 @@ +import time + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Sessions import Session, Sessions +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons + +class GetSession(Method): + """ + Returns a new session key if a user or node authenticated + successfully, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + accepts = [Auth()] + returns = Session.fields['session_id'] + + + def call(self, auth): + # Authenticated with a session key, just return it + if auth.has_key('session'): + return auth['session'] + + session = Session(self.api) + + if isinstance(self.caller, Person): + # XXX Make this configurable + session['expires'] = int(time.time()) + (24 * 60 * 60) + + session.sync(commit = False) + + if isinstance(self.caller, Node): + session.add_node(self.caller, commit = True) + elif isinstance(self.caller, Person): + session.add_person(self.caller, commit = True) + + return session['session_id'] diff --git a/PLC/Methods/GetSessions.py b/PLC/Methods/GetSessions.py new file mode 100644 index 0000000..a72553c --- /dev/null +++ b/PLC/Methods/GetSessions.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Sessions import Session, Sessions +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class GetSessions(Method): + """ + Returns an array of structs containing details about users sessions. If + session_filter is specified and is an array of user identifiers or + session_keys, or a struct of session attributes, only sessions matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed([Mixed(Session.fields['person_id'], + Session.fields['session_id'])], + Filter(Session.fields)) + ] + + returns = [Session.fields] + + def call(self, auth, session_filter = None): + + sessions = Sessions(self.api, session_filter) + + return sessions diff --git a/PLC/Methods/GetSites.py b/PLC/Methods/GetSites.py new file mode 100644 index 0000000..c0f198e --- /dev/null +++ b/PLC/Methods/GetSites.py @@ -0,0 +1,31 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +class GetSites(Method): + """ + Returns an array of structs containing details about sites. If + site_filter is specified and is an array of site identifiers or + hostnames, or a struct of site attributes, only sites matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(Site.fields['site_id'], + Site.fields['login_base'])], + Parameter(str,"login_base"), + Parameter(int,"site_id"), + Filter(Site.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Site.fields] + + def call(self, auth, site_filter = None, return_fields = None): + return Sites(self.api, site_filter, return_fields) diff --git a/PLC/Methods/GetSliceAttributeTypes.py b/PLC/Methods/GetSliceAttributeTypes.py new file mode 100644 index 0000000..bc8f1ed --- /dev/null +++ b/PLC/Methods/GetSliceAttributeTypes.py @@ -0,0 +1,30 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes + +class GetSliceAttributeTypes(Method): + """ + Returns an array of structs containing details about slice + attribute types. If attribute_type_filter is specified and + is an array of slice attribute type identifiers, or a + struct of slice attribute type attributes, only slice attribute + types matching the filter will be returned. If return_fields is + specified, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(SliceAttributeType.fields['attribute_type_id'], + SliceAttributeType.fields['name'])], + Filter(SliceAttributeType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [SliceAttributeType.fields] + + def call(self, auth, attribute_type_filter = None, return_fields = None): + return SliceAttributeTypes(self.api, attribute_type_filter, return_fields) diff --git a/PLC/Methods/GetSliceAttributes.py b/PLC/Methods/GetSliceAttributes.py new file mode 100644 index 0000000..b8a0a11 --- /dev/null +++ b/PLC/Methods/GetSliceAttributes.py @@ -0,0 +1,88 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class GetSliceAttributes(Method): + """ + Returns an array of structs containing details about slice and + sliver attributes. An attribute is a sliver attribute if the + node_id field is set. If slice_attribute_filter is specified and + is an array of slice attribute identifiers, or a struct of slice + attribute attributes, only slice attributes matching the filter + will be returned. If return_fields is specified, only the + specified details will be returned. + + Users may only query attributes of slices or slivers of which they + are members. PIs may only query attributes of slices or slivers at + their sites, or of which they are members. Admins may query + attributes of any slice or sliver. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([SliceAttribute.fields['slice_attribute_id']], + Filter(SliceAttribute.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [SliceAttribute.fields] + + + def call(self, auth, slice_attribute_filter = None, return_fields = None): + # If we are not admin, make sure to only return our own slice + # and sliver attributes. + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + # Get slice attributes that we are able to view + valid_slice_attribute_ids = [] + slices = Slices(self.api, valid_slice_ids) + for slice in slices: + valid_slice_attribute_ids += slice['slice_attribute_ids'] + + if not valid_slice_attribute_ids: + return [] + + if slice_attribute_filter is None: + slice_attribute_filter = valid_slice_attribute_ids + + # Must query at least slice_attribute_id (see below) + if return_fields is not None and 'slice_attribute_id' not in return_fields: + return_fields.append('slice_attribute_id') + added_fields = True + else: + added_fields = False + + slice_attributes = SliceAttributes(self.api, slice_attribute_filter, return_fields) + + # Filter out slice attributes that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + slice_attributes = filter(lambda slice_attribute: \ + slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids, + slice_attributes) + + # Remove slice_attribute_id if not specified + if added_fields: + for slice_attribute in slice_attributes: + if 'slice_attribute_id' in slice_attribute: + del slice_attribute['slice_attribute_id'] + + return slice_attributes diff --git a/PLC/Methods/GetSliceInstantiations.py b/PLC/Methods/GetSliceInstantiations.py new file mode 100644 index 0000000..174c209 --- /dev/null +++ b/PLC/Methods/GetSliceInstantiations.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Auth import Auth + +class GetSliceInstantiations(Method): + """ + Returns an array of all valid slice instantiation states. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [SliceInstantiation.fields['instantiation']] + + def call(self, auth): + return [slice_instantiation['instantiation'] for slice_instantiation in SliceInstantiations(self.api)] diff --git a/PLC/Methods/GetSliceKeys.py b/PLC/Methods/GetSliceKeys.py new file mode 100644 index 0000000..4029c83 --- /dev/null +++ b/PLC/Methods/GetSliceKeys.py @@ -0,0 +1,134 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Slices import Slice, Slices +from PLC.Keys import Key, Keys + +class GetSliceKeys(Method): + """ + Returns an array of structs containing public key info for users in + the specified slices. If slice_filter is specified and is an array + of slice identifiers or slice names, or a struct of slice + attributes, only slices matching the filter will be returned. If + return_fields is specified, only the specified details will be + returned. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins and nodes may query + any slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Slice.fields['slice_id'], + Slice.fields['name'])], + Filter(Slice.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [ + { + 'slice_id': Slice.fields['slice_id'], + 'name': Slice.fields['name'], + 'person_id': Person.fields['person_id'], + 'email': Person.fields['email'], + 'key': Key.fields['key'] + }] + + def call(self, auth, slice_filter = None, return_fields = None): + slice_fields = ['slice_id', 'name'] + person_fields = ['person_id', 'email'] + key_fields = ['key'] + + # If we are not admin, make sure to return only viewable + # slices. + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + if slice_filter is None: + slice_filter = valid_slice_ids + + if return_fields: + slice_return_fields = filter(lambda field: field in slice_fields, return_fields) + person_return_fields = filter(lambda field: field in person_fields, return_fields) + key_return_fields = filter(lambda field: field in key_fields, return_fields) + else: + slice_return_fields = slice_fields + person_return_fields = person_fields + key_return_fields = key_fields + + # Must query at least Slice.slice_id, Slice.person_ids, + # and Person.person_id and Person.key_ids so we can join data correctly + slice_added_fields = set(['slice_id', 'person_ids']).difference(slice_return_fields) + slice_return_fields += slice_added_fields + person_added_fields = set(['person_id', 'key_ids']).difference(person_return_fields) + person_return_fields += person_added_fields + key_added_fields = set(['key_id']).difference(key_return_fields) + key_return_fields += key_added_fields + + # Get the slices + all_slices = Slices(self.api, slice_filter, slice_return_fields).dict('slice_id') + slice_ids = all_slices.keys() + slices = all_slices.values() + + # Filter out slices that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + # Get the persons + person_ids = set() + for slice in slices: + person_ids.update(slice['person_ids']) + + all_persons = Persons(self.api, list(person_ids), person_return_fields).dict('person_id') + person_ids = all_persons.keys() + persons = all_persons.values() + + # Get the keys + key_ids = set() + for person in persons: + key_ids.update(person['key_ids']) + + all_keys = Keys(self.api, list(key_ids), key_return_fields).dict('key_id') + key_ids = all_keys.keys() + keys = all_keys.values() + + # Create slice_keys list + slice_keys = [] + slice_fields = list(set(slice_return_fields).difference(slice_added_fields)) + person_fields = list(set(person_return_fields).difference(person_added_fields)) + key_fields = list(set(key_return_fields).difference(key_added_fields)) + + for slice in slices: + slice_key = dict.fromkeys(slice_fields + person_fields + key_fields) + if not slice['person_ids']: + continue + for person_id in slice['person_ids']: + person = all_persons[person_id] + if not person['key_ids']: + continue + for key_id in person['key_ids']: + key = all_keys[key_id] + slice_key.update(dict(filter(lambda (k, v): k in slice_fields, slice.items()))) + slice_key.update(dict(filter(lambda (k, v): k in person_fields, person.items()))) + slice_key.update(dict(filter(lambda (k, v): k in key_fields, key.items()))) + slice_keys.append(slice_key.copy()) + + return slice_keys + diff --git a/PLC/Methods/GetSliceTicket.py b/PLC/Methods/GetSliceTicket.py new file mode 100644 index 0000000..cd73f7b --- /dev/null +++ b/PLC/Methods/GetSliceTicket.py @@ -0,0 +1,77 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.GPG import gpg_sign, gpg_verify +from PLC.InitScripts import InitScript, InitScripts + +from PLC.Methods.GetSlivers import get_slivers + +class GetSliceTicket(Method): + """ + Returns a ticket for, or signed representation of, the specified + slice. Slice tickets may be used to manually instantiate or update + a slice on a node. Present this ticket to the local Node Manager + interface to redeem it. + + If the slice has not been added to a node with AddSliceToNodes, + and the ticket is redeemed on that node, it will be deleted the + next time the Node Manager contacts the API. + + Users may only obtain tickets for slices of which they are + members. PIs may obtain tickets for any of the slices at their + sites, or any slices of which they are members. Admins may obtain + tickets for any slice. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'peer'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + ] + + returns = Parameter(str, 'Signed slice ticket') + + def call(self, auth, slice_id_or_name): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # Allow peers to obtain tickets for their own slices + if slice['peer_id'] is not None: + if not isinstance(self.caller, Peer): + raise PLCInvalidArgument, "Not a local slice" + elif slice['peer_id'] != self.caller['peer_id']: + raise PLCInvalidArgument, "Only the authoritative peer may obtain tickets for that slice" + + # Tickets are the canonicalized XML-RPC methodResponse + # representation of a partial GetSlivers() response, i.e., + + initscripts = InitScripts(self.api, {'enabled': True}) + + data = { + 'timestamp': int(time.time()), + 'initscripts': initscripts, + 'slivers': get_slivers(self.api, [slice['slice_id']]), + } + + # Sign ticket + signed_ticket = gpg_sign((data,), + self.api.config.PLC_ROOT_GPG_KEY, + self.api.config.PLC_ROOT_GPG_KEY_PUB, + methodresponse = True, + detach_sign = False) + + # Verify ticket + gpg_verify(signed_ticket, + self.api.config.PLC_ROOT_GPG_KEY_PUB) + + return signed_ticket diff --git a/PLC/Methods/GetSlices.py b/PLC/Methods/GetSlices.py new file mode 100644 index 0000000..63dc0b4 --- /dev/null +++ b/PLC/Methods/GetSlices.py @@ -0,0 +1,75 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Slices import Slice, Slices + +class GetSlices(Method): + """ + Returns an array of structs containing details about slices. If + slice_filter is specified and is an array of slice identifiers or + slice names, or a struct of slice attributes, only slices matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins and nodes may query + any slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Slice.fields['slice_id'], + Slice.fields['name'])], + Parameter(str,"name"), + Parameter(int,"slice_id"), + Filter(Slice.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Slice.fields] + + def call(self, auth, slice_filter = None, return_fields = None): + # If we are not admin, make sure to return only viewable + # slices. + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + if slice_filter is None: + slice_filter = valid_slice_ids + + # Must query at least slice_id (see below) + if return_fields is not None and 'slice_id' not in return_fields: + return_fields.append('slice_id') + added_fields = True + else: + added_fields = False + + slices = Slices(self.api, slice_filter, return_fields) + + # Filter out slices that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + # Remove slice_id if not specified + if added_fields: + for slice in slices: + if 'slice_id' in slice: + del slice['slice_id'] + + return slices diff --git a/PLC/Methods/GetSlicesMD5.py b/PLC/Methods/GetSlicesMD5.py new file mode 100644 index 0000000..b7e4cde --- /dev/null +++ b/PLC/Methods/GetSlicesMD5.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +class GetSlicesMD5(Method): + """ + Returns the current md5 hash of slices.xml file + (slices-0.5.xml.md5) + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + ] + + returns = Parameter(str, "MD5 hash of slices.xml") + + + def call(self, auth): + try: + file_path = '/var/www/html/xml/slices-0.5.xml.md5' + slices_md5 = file(file_path).readline().strip() + if slices_md5 <> "": + return slices_md5 + raise PLCInvalidArgument, "File is empty" + except IOError: + raise PLCInvalidArgument, "No such file" + diff --git a/PLC/Methods/GetSlivers.py b/PLC/Methods/GetSlivers.py new file mode 100644 index 0000000..d3c5471 --- /dev/null +++ b/PLC/Methods/GetSlivers.py @@ -0,0 +1,226 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.InitScripts import InitScript, InitScripts + +def get_slivers(api, slice_filter, node = None): + # Get slice information + slices = Slices(api, slice_filter, ['slice_id', 'name', 'instantiation', 'expires', 'person_ids', 'slice_attribute_ids']) + + # Build up list of users and slice attributes + person_ids = set() + slice_attribute_ids = set() + for slice in slices: + person_ids.update(slice['person_ids']) + slice_attribute_ids.update(slice['slice_attribute_ids']) + + # Get user information + all_persons = Persons(api, {'person_id':person_ids,'enabled':True}, ['person_id', 'enabled', 'key_ids']).dict() + + # Build up list of keys + key_ids = set() + for person in all_persons.values(): + key_ids.update(person['key_ids']) + + # Get user account keys + all_keys = Keys(api, key_ids, ['key_id', 'key', 'key_type']).dict() + + # Get slice attributes + all_slice_attributes = SliceAttributes(api, slice_attribute_ids).dict() + + slivers = [] + for slice in slices: + keys = [] + for person_id in slice['person_ids']: + if person_id in all_persons: + person = all_persons[person_id] + if not person['enabled']: + continue + for key_id in person['key_ids']: + if key_id in all_keys: + key = all_keys[key_id] + keys += [{'key_type': key['key_type'], + 'key': key['key']}] + + attributes = [] + + # All (per-node and global) attributes for this slice + slice_attributes = [] + for slice_attribute_id in slice['slice_attribute_ids']: + if slice_attribute_id in all_slice_attributes: + slice_attributes.append(all_slice_attributes[slice_attribute_id]) + + # Per-node sliver attributes take precedence over global + # slice attributes, so set them first. + # Then comes nodegroup slice attributes + # Followed by global slice attributes + sliver_attributes = [] + + if node is not None: + for sliver_attribute in filter(lambda a: a['node_id'] == node['node_id'], slice_attributes): + sliver_attributes.append(sliver_attribute['name']) + attributes.append({'name': sliver_attribute['name'], + 'value': sliver_attribute['value']}) + + # set nodegroup slice attributes + for slice_attribute in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_attributes): + # Do not set any nodegroup slice attributes for + # which there is at least one sliver attribute + # already set. + if slice_attribute['name'] not in slice_attributes: + attributes.append({'name': slice_attribute['name'], + 'value': slice_attribute['value']}) + + for slice_attribute in filter(lambda a: a['node_id'] is None, slice_attributes): + # Do not set any global slice attributes for + # which there is at least one sliver attribute + # already set. + if slice_attribute['name'] not in sliver_attributes: + attributes.append({'name': slice_attribute['name'], + 'value': slice_attribute['value']}) + + slivers.append({ + 'name': slice['name'], + 'slice_id': slice['slice_id'], + 'instantiation': slice['instantiation'], + 'expires': slice['expires'], + 'keys': keys, + 'attributes': attributes + }) + + return slivers + +class GetSlivers(Method): + """ + Returns a struct containing information about the specified node + (or calling node, if called by a node and node_id_or_hostname is + not specified), including the current set of slivers bound to the + node. + + All of the information returned by this call can be gathered from + other calls, e.g. GetNodes, GetNodeNetworks, GetSlices, etc. This + function exists almost solely for the benefit of Node Manager. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + ] + + returns = { + 'timestamp': Parameter(int, "Timestamp of this call, in seconds since UNIX epoch"), + 'node_id': Node.fields['node_id'], + 'hostname': Node.fields['hostname'], + 'networks': [NodeNetwork.fields], + 'groups': [NodeGroup.fields['name']], + 'conf_files': [ConfFile.fields], + 'initscripts': [InitScript.fields], + 'slivers': [{ + 'name': Slice.fields['name'], + 'slice_id': Slice.fields['slice_id'], + 'instantiation': Slice.fields['instantiation'], + 'expires': Slice.fields['expires'], + 'keys': [{ + 'key_type': Key.fields['key_type'], + 'key': Key.fields['key'] + }], + 'attributes': [{ + 'name': SliceAttribute.fields['name'], + 'value': SliceAttribute.fields['value'] + }] + }] + } + + def call(self, auth, node_id_or_hostname = None): + timestamp = int(time.time()) + + # Get node + if node_id_or_hostname is None: + if isinstance(self.caller, Node): + node = self.caller + else: + raise PLCInvalidArgument, "'node_id_or_hostname' not specified" + else: + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Get nodenetwork information + networks = NodeNetworks(self.api, node['nodenetwork_ids']) + + # Get node group information + nodegroups = NodeGroups(self.api, node['nodegroup_ids']).dict('name') + groups = nodegroups.keys() + + # Get all (enabled) configuration files + all_conf_files = ConfFiles(self.api, {'enabled': True}).dict() + conf_files = {} + + # Global configuration files are the default. If multiple + # entries for the same global configuration file exist, it is + # undefined which one takes precedence. + for conf_file in all_conf_files.values(): + if not conf_file['node_ids'] and not conf_file['nodegroup_ids']: + conf_files[conf_file['dest']] = conf_file + + # Node group configuration files take precedence over global + # ones. If a node belongs to multiple node groups for which + # the same configuration file is defined, it is undefined + # which one takes precedence. + for nodegroup in nodegroups.values(): + for conf_file_id in nodegroup['conf_file_ids']: + if conf_file_id in all_conf_files: + conf_files[conf_file['dest']] = all_conf_files[conf_file_id] + + # Node configuration files take precedence over node group + # configuration files. + for conf_file_id in node['conf_file_ids']: + if conf_file_id in all_conf_files: + conf_files[conf_file['dest']] = all_conf_files[conf_file_id] + + + # Get all (enabled) initscripts + initscripts = InitScripts(self.api, {'enabled': True}) + + # Get system slices + system_slice_attributes = SliceAttributes(self.api, {'name': 'system', 'value': '1'}).dict('slice_id') + system_slice_ids = system_slice_attributes.keys() + + # Get nm-controller slices + controller_and_delegated_slices = Slices(self.api, {'instantiation': ['nm-controller', 'delegated']}, ['slice_id']).dict('slice_id') + controller_and_delegated_slice_ids = controller_and_delegated_slices.keys() + slice_ids = system_slice_ids + controller_and_delegated_slice_ids + node['slice_ids'] + + slivers = get_slivers(self.api, slice_ids, node) + + node.update_last_contact() + + return { + 'timestamp': timestamp, + 'node_id': node['node_id'], + 'hostname': node['hostname'], + 'networks': networks, + 'groups': groups, + 'conf_files': conf_files.values(), + 'initscripts': initscripts, + 'slivers': slivers + } diff --git a/PLC/Methods/GetWhitelist.py b/PLC/Methods/GetWhitelist.py new file mode 100644 index 0000000..11251f8 --- /dev/null +++ b/PLC/Methods/GetWhitelist.py @@ -0,0 +1,73 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class GetWhitelist(Method): + """ + Returns an array of structs containing details about the specified nodes + whitelists. If node_filter is specified and is an array of node identifiers or + hostnames, or a struct of node attributes, only nodes matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Some fields may only be viewed by admins. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(Node.fields['node_id'], + Node.fields['hostname'])], + Filter(Node.fields)), + Parameter([str], "List of fields to return", nullok = True), + ] + + returns = [Node.fields] + + + def call(self, auth, node_filter = None, return_fields = None): + + # Must query at least slice_ids_whitelist + if return_fields is not None: + added_fields = set(['slice_ids_whitelist']).difference(return_fields) + return_fields += added_fields + else: + added_fields =[] + + # Get node information + nodes = Nodes(self.api, node_filter, return_fields) + + # Remove all nodes without a whitelist + for node in nodes[:]: + if not node['slice_ids_whitelist']: + nodes.remove(node) + + # Remove admin only fields + if not isinstance(self.caller, Person) or \ + 'admin' not in self.caller['roles']: + slice_ids = set() + if self.caller: + slice_ids.update(self.caller['slice_ids']) + #if node has whitelist, make sure the user has a slice on the whitelist + for node in nodes[:]: + if 'slice_ids_whitelist' in node and \ + node['slice_ids_whitelist'] and \ + not slice_ids.intersection(node['slice_ids_whitelist']): + nodes.remove(node) + for node in nodes: + for field in ['boot_nonce', 'key', 'session', 'root_person_ids']: + if field in node: + del node[field] + + # remove added fields if not specified + if added_fields: + for node in nodes: + for field in added_fields: + del node[field] + + return nodes diff --git a/PLC/Methods/NotifyPersons.py b/PLC/Methods/NotifyPersons.py new file mode 100644 index 0000000..70c273d --- /dev/null +++ b/PLC/Methods/NotifyPersons.py @@ -0,0 +1,48 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.sendmail import sendmail + +class NotifyPersons(Method): + """ + Sends an e-mail message to the specified users. If person_filter + is specified and is an array of user identifiers or usernames, or + a struct of user attributes, only users matching the filter will + receive the message. + + Returns 1 if successful. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Person.fields['person_id'], + Person.fields['email'])], + Filter(Person.fields)), + Parameter(str, "E-mail subject"), + Parameter(str, "E-mail body") + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_filter, subject, body): + persons = Persons(self.api, person_filter, + ['person_id', 'first_name', 'last_name', 'email']) + if not persons: + raise PLCInvalidArgument, "No such user(s)" + + # Send email + sendmail(self.api, + To = [("%s %s" % (person['first_name'], person['last_name']), + person['email']) for person in persons], + Subject = subject, + Body = body) + + # Logging variables + self.event_objects = {'Person': [person['person_id'] for person in persons]} + self.message = subject + + return 1 diff --git a/PLC/Methods/NotifySupport.py b/PLC/Methods/NotifySupport.py new file mode 100644 index 0000000..99ec318 --- /dev/null +++ b/PLC/Methods/NotifySupport.py @@ -0,0 +1,36 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.sendmail import sendmail + +class NotifySupport(Method): + """ + Sends an e-mail message to the configured support address. + + Returns 1 if successful. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Parameter(str, "E-mail subject"), + Parameter(str, "E-mail body") + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, subject, body): + to_name="%s Support"%self.api.config.PLC_NAME + to_address=self.api.config.PLC_MAIL_SUPPORT_ADDRESS + + # Send email + sendmail(self.api, To=(to_name,to_address), + Subject = subject, + Body = body) + + # Logging variables + #self.event_objects = {'Person': [person['person_id'] for person in persons]} + self.message = subject + + return 1 diff --git a/PLC/Methods/RebootNode.py b/PLC/Methods/RebootNode.py new file mode 100644 index 0000000..bea6b89 --- /dev/null +++ b/PLC/Methods/RebootNode.py @@ -0,0 +1,73 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth +from PLC.POD import udp_pod + +class RebootNode(Method): + """ + Sends the specified node a specially formatted UDP packet which + should cause it to reboot immediately. + + Admins can reboot any node. Techs and PIs can only reboot nodes at + their site. + + Returns 1 if the packet was successfully sent (which only whether + the packet was sent, not whether the reboot was successful). + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname): + # Get account information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + + node = nodes[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete nodes from specified site" + + session = node['session'] + if not session: + raise PLCInvalidArgument, "No session key on record for that node (i.e., has never successfully booted)" + session = session.strip() + + # Only use the hostname as a backup, try to use the primary ID + # address instead. + host = node['hostname'] + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary'] == 1: + host = nodenetwork['ip'] + break + + try: + udp_pod(host, session) + except socket.error, e: + # Ignore socket errors + pass + + self.event_objects = {'Node': [node['node_id']]} + self.message = "RebootNode called" + + return 1 diff --git a/PLC/Methods/RefreshPeer.py b/PLC/Methods/RefreshPeer.py new file mode 100644 index 0000000..a45f8bd --- /dev/null +++ b/PLC/Methods/RefreshPeer.py @@ -0,0 +1,476 @@ +# +# Thierry Parmentelat - INRIA +# +# $Id: RefreshPeer.py 5574 2007-10-25 20:33:17Z thierry $ + +import time + +from PLC.Debug import log +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.Peers import Peer, Peers +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Keys import Key, Keys +from PLC.BootStates import BootState, BootStates +from PLC.Nodes import Node, Nodes +from PLC.SliceInstantiations import SliceInstantiations +from PLC.Slices import Slice, Slices + +verbose=False + +class RefreshPeer(Method): + """ + Fetches site, node, slice, person and key data from the specified peer + and caches it locally; also deletes stale entries. + Upon successful completion, returns a dict reporting various timers. + Faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Peer.fields['peer_id'], + Peer.fields['peername']), + ] + + returns = Parameter(int, "1 if successful") + + def call(self, auth, peer_id_or_peername): + # Get peer + peers = Peers(self.api, [peer_id_or_peername]) + if not peers: + raise PLCInvalidArgument, "No such peer '%s'" % unicode(peer_id_or_peername) + peer = peers[0] + peer_id = peer['peer_id'] + + # Connect to peer API + peer.connect() + + timers = {} + + # Get peer data + start = time.time() + print >>log, 'Issuing GetPeerData' + peer_tables = peer.GetPeerData() + timers['transport'] = time.time() - start - peer_tables['db_time'] + timers['peer_db'] = peer_tables['db_time'] + if verbose: + print >>log, 'GetPeerData returned -> db=%d transport=%d'%(timers['peer_db'],timers['transport']) + + def sync(objects, peer_objects, classobj): + """ + Synchronizes two dictionaries of objects. objects should + be a dictionary of local objects keyed on their foreign + identifiers. peer_objects should be a dictionary of + foreign objects keyed on their local (i.e., foreign to us) + identifiers. Returns a final dictionary of local objects + keyed on their foreign identifiers. + """ + + if verbose: + print >>log, 'Entering sync on',classobj(self.api).__class__.__name__ + + synced = {} + + # Delete stale objects + for peer_object_id, object in objects.iteritems(): + if peer_object_id not in peer_objects: + object.delete(commit = False) + print >> log, peer['peername'],classobj(self.api).__class__.__name__, object[object.primary_key],"deleted" + + # Add/update new/existing objects + for peer_object_id, peer_object in peer_objects.iteritems(): + if peer_object_id in objects: + # Update existing object + object = objects[peer_object_id] + + # Replace foreign identifier with existing local + # identifier temporarily for the purposes of + # comparison. + peer_object[object.primary_key] = object[object.primary_key] + + # Must use __eq__() instead of == since + # peer_object may be a raw dict instead of a Peer + # object. + if not object.__eq__(peer_object): + # Only update intrinsic fields + object.update(object.db_fields(peer_object)) + sync = True + dbg = "changed" + else: + sync = False + dbg = None + + # Restore foreign identifier + peer_object[object.primary_key] = peer_object_id + else: + # Add new object + object = classobj(self.api, peer_object) + # Replace foreign identifier with new local identifier + del object[object.primary_key] + sync = True + dbg = "added" + + if sync: + try: + object.sync(commit = False) + except PLCInvalidArgument, err: + # Skip if validation fails + # XXX Log an event instead of printing to logfile + print >> log, "Warning: Skipping invalid", \ + peer['peername'], object.__class__.__name__, \ + ":", peer_object, ":", err + continue + + synced[peer_object_id] = object + + if dbg: + print >> log, peer['peername'], classobj(self.api).__class__.__name__, object[object.primary_key], dbg + + if verbose: + print >>log, 'Exiting sync on',classobj(self.api).__class__.__name__ + + return synced + + # + # Synchronize foreign sites + # + + start = time.time() + + print >>log, 'Dealing with Sites' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Sites']: + columns = peer_tables['Sites'][0].keys() + else: + columns = None + + # Keyed on foreign site_id + old_peer_sites = Sites(self.api, {'peer_id': peer_id}, columns).dict('peer_site_id') + sites_at_peer = dict([(site['site_id'], site) for site in peer_tables['Sites']]) + + # Synchronize new set (still keyed on foreign site_id) + peer_sites = sync(old_peer_sites, sites_at_peer, Site) + + for peer_site_id, site in peer_sites.iteritems(): + # Bind any newly cached sites to peer + if peer_site_id not in old_peer_sites: + peer.add_site(site, peer_site_id, commit = False) + site['peer_id'] = peer_id + site['peer_site_id'] = peer_site_id + + timers['site'] = time.time() - start + + # + # XXX Synchronize foreign key types + # + + print >>log, 'Dealing with Keys' + + key_types = KeyTypes(self.api).dict() + + # + # Synchronize foreign keys + # + + start = time.time() + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Keys']: + columns = peer_tables['Keys'][0].keys() + else: + columns = None + + # Keyed on foreign key_id + old_peer_keys = Keys(self.api, {'peer_id': peer_id}, columns).dict('peer_key_id') + keys_at_peer = dict([(key['key_id'], key) for key in peer_tables['Keys']]) + + # Fix up key_type references + for peer_key_id, key in keys_at_peer.items(): + if key['key_type'] not in key_types: + # XXX Log an event instead of printing to logfile + print >> log, "Warning: Skipping invalid %s key:" % peer['peername'], \ + key, ": invalid key type", key['key_type'] + del keys_at_peer[peer_key_id] + continue + + # Synchronize new set (still keyed on foreign key_id) + peer_keys = sync(old_peer_keys, keys_at_peer, Key) + for peer_key_id, key in peer_keys.iteritems(): + # Bind any newly cached keys to peer + if peer_key_id not in old_peer_keys: + peer.add_key(key, peer_key_id, commit = False) + key['peer_id'] = peer_id + key['peer_key_id'] = peer_key_id + + timers['keys'] = time.time() - start + + # + # Synchronize foreign users + # + + start = time.time() + + print >>log, 'Dealing with Persons' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Persons']: + columns = peer_tables['Persons'][0].keys() + else: + columns = None + + # Keyed on foreign person_id + old_peer_persons = Persons(self.api, {'peer_id': peer_id}, columns).dict('peer_person_id') + + # artificially attach the persons returned by GetPeerData to the new peer + # this is because validate_email needs peer_id to be correct when checking for duplicates + for person in peer_tables['Persons']: + person['peer_id']=peer_id + persons_at_peer = dict([(peer_person['person_id'], peer_person) \ + for peer_person in peer_tables['Persons']]) + + # XXX Do we care about membership in foreign site(s)? + + # Synchronize new set (still keyed on foreign person_id) + peer_persons = sync(old_peer_persons, persons_at_peer, Person) + + # transcoder : retrieve a local key_id from a peer_key_id + key_transcoder = dict ( [ (key['key_id'],peer_key_id) \ + for peer_key_id,key in peer_keys.iteritems()]) + + for peer_person_id, person in peer_persons.iteritems(): + # Bind any newly cached users to peer + if peer_person_id not in old_peer_persons: + peer.add_person(person, peer_person_id, commit = False) + person['peer_id'] = peer_id + person['peer_person_id'] = peer_person_id + person['key_ids'] = [] + + # User as viewed by peer + peer_person = persons_at_peer[peer_person_id] + + # Foreign keys currently belonging to the user + old_person_key_ids = [key_transcoder[key_id] for key_id in person['key_ids'] \ + if key_transcoder[key_id] in peer_keys] + + # Foreign keys that should belong to the user + # this is basically peer_person['key_ids'], we just check it makes sense + # (e.g. we might have failed importing it) + person_key_ids = [ key_id for key_id in peer_person['key_ids'] if key_id in peer_keys] + + # Remove stale keys from user + for key_id in (set(old_person_key_ids) - set(person_key_ids)): + person.remove_key(peer_keys[key_id], commit = False) + print >> log, peer['peername'], 'Key', key_id, 'removed from', person['email'] + + # Add new keys to user + for key_id in (set(person_key_ids) - set(old_person_key_ids)): + person.add_key(peer_keys[key_id], commit = False) + print >> log, peer['peername'], 'Key', key_id, 'added into', person['email'] + + timers['persons'] = time.time() - start + + # + # XXX Synchronize foreign boot states + # + + boot_states = BootStates(self.api).dict() + + # + # Synchronize foreign nodes + # + + start = time.time() + + print >>log, 'Dealing with Nodes' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Nodes']: + columns = peer_tables['Nodes'][0].keys() + else: + columns = None + + # Keyed on foreign node_id + old_peer_nodes = Nodes(self.api, {'peer_id': peer_id}, columns).dict('peer_node_id') + nodes_at_peer = dict([(node['node_id'], node) \ + for node in peer_tables['Nodes']]) + + # Fix up site_id and boot_states references + for peer_node_id, node in nodes_at_peer.items(): + errors = [] + if node['site_id'] not in peer_sites: + errors.append("invalid site %d" % node['site_id']) + if node['boot_state'] not in boot_states: + errors.append("invalid boot state %s" % node['boot_state']) + if errors: + # XXX Log an event instead of printing to logfile + print >> log, "Warning: Skipping invalid %s node:" % peer['peername'], \ + node, ":", ", ".join(errors) + del nodes_at_peer[peer_node_id] + continue + else: + node['site_id'] = peer_sites[node['site_id']]['site_id'] + + # Synchronize new set + peer_nodes = sync(old_peer_nodes, nodes_at_peer, Node) + + for peer_node_id, node in peer_nodes.iteritems(): + # Bind any newly cached foreign nodes to peer + if peer_node_id not in old_peer_nodes: + peer.add_node(node, peer_node_id, commit = False) + node['peer_id'] = peer_id + node['peer_node_id'] = peer_node_id + + timers['nodes'] = time.time() - start + + # + # Synchronize local nodes + # + + start = time.time() + + # Keyed on local node_id + local_nodes = Nodes(self.api).dict() + + for node in peer_tables['PeerNodes']: + # Foreign identifier for our node as maintained by peer + peer_node_id = node['node_id'] + # Local identifier for our node as cached by peer + node_id = node['peer_node_id'] + if node_id in local_nodes: + # Still a valid local node, add it to the synchronized + # set of local node objects keyed on foreign node_id. + peer_nodes[peer_node_id] = local_nodes[node_id] + + timers['local_nodes'] = time.time() - start + + # + # XXX Synchronize foreign slice instantiation states + # + + slice_instantiations = SliceInstantiations(self.api).dict() + + # + # Synchronize foreign slices + # + + start = time.time() + + print >>log, 'Dealing with Slices' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Slices']: + columns = peer_tables['Slices'][0].keys() + else: + columns = None + + # Keyed on foreign slice_id + old_peer_slices = Slices(self.api, {'peer_id': peer_id}, columns).dict('peer_slice_id') + slices_at_peer = dict([(slice['slice_id'], slice) \ + for slice in peer_tables['Slices']]) + + # Fix up site_id, instantiation, and creator_person_id references + for peer_slice_id, slice in slices_at_peer.items(): + errors = [] + if slice['site_id'] not in peer_sites: + errors.append("invalid site %d" % slice['site_id']) + if slice['instantiation'] not in slice_instantiations: + errors.append("invalid instantiation %s" % slice['instantiation']) + if slice['creator_person_id'] not in peer_persons: + # Just NULL it out + slice['creator_person_id'] = None + else: + slice['creator_person_id'] = peer_persons[slice['creator_person_id']]['person_id'] + if errors: + print >> log, "Warning: Skipping invalid %s slice:" % peer['peername'], \ + slice, ":", ", ".join(errors) + del slices_at_peer[peer_slice_id] + continue + else: + slice['site_id'] = peer_sites[slice['site_id']]['site_id'] + + # Synchronize new set + peer_slices = sync(old_peer_slices, slices_at_peer, Slice) + + # transcoder : retrieve a local node_id from a peer_node_id + node_transcoder = dict ( [ (node['node_id'],peer_node_id) \ + for peer_node_id,node in peer_nodes.iteritems()]) + person_transcoder = dict ( [ (person['person_id'],peer_person_id) \ + for peer_person_id,person in peer_persons.iteritems()]) + + for peer_slice_id, slice in peer_slices.iteritems(): + # Bind any newly cached foreign slices to peer + if peer_slice_id not in old_peer_slices: + peer.add_slice(slice, peer_slice_id, commit = False) + slice['peer_id'] = peer_id + slice['peer_slice_id'] = peer_slice_id + slice['node_ids'] = [] + slice['person_ids'] = [] + + # Slice as viewed by peer + peer_slice = slices_at_peer[peer_slice_id] + + # Nodes that are currently part of the slice + old_slice_node_ids = [ node_transcoder[node_id] for node_id in slice['node_ids'] \ + if node_transcoder[node_id] in peer_nodes] + + # Nodes that should be part of the slice + slice_node_ids = [ node_id for node_id in peer_slice['node_ids'] if node_id in peer_nodes] + + # Remove stale nodes from slice + for node_id in (set(old_slice_node_ids) - set(slice_node_ids)): + slice.remove_node(peer_nodes[node_id], commit = False) + print >> log, peer['peername'], 'Node', peer_nodes[node_id]['hostname'], 'removed from', slice['name'] + + # Add new nodes to slice + for node_id in (set(slice_node_ids) - set(old_slice_node_ids)): + slice.add_node(peer_nodes[node_id], commit = False) + print >> log, peer['peername'], 'Node', peer_nodes[node_id]['hostname'], 'added into', slice['name'] + + # N.B.: Local nodes that may have been added to the slice + # by hand, are removed. In other words, don't do this. + + # Foreign users that are currently part of the slice + #old_slice_person_ids = [ person_transcoder[person_id] for person_id in slice['person_ids'] \ + # if person_transcoder[person_id] in peer_persons] + # An issue occurred with a user who registered on both sites (same email) + # So the remote person could not get cached locally + # The one-line map/filter style is nicer but ineffective here + old_slice_person_ids = [] + for person_id in slice['person_ids']: + if not person_transcoder.has_key(person_id): + print >> log, 'WARNING : person_id %d in %s not transcodable (1) - skipped'%(person_id,slice['name']) + elif person_transcoder[person_id] not in peer_persons: + print >> log, 'WARNING : person_id %d in %s not transcodable (2) - skipped'%(person_id,slice['name']) + else: + old_slice_person_ids += [person_transcoder[person_id]] + + # Foreign users that should be part of the slice + slice_person_ids = [ person_id for person_id in peer_slice['person_ids'] if person_id in peer_persons ] + + # Remove stale users from slice + for person_id in (set(old_slice_person_ids) - set(slice_person_ids)): + slice.remove_person(peer_persons[person_id], commit = False) + print >> log, peer['peername'], 'User', peer_persons[person_id]['email'], 'removed from', slice['name'] + + # Add new users to slice + for person_id in (set(slice_person_ids) - set(old_slice_person_ids)): + slice.add_person(peer_persons[person_id], commit = False) + print >> log, peer['peername'], 'User', peer_persons[person_id]['email'], 'added into', slice['name'] + + # N.B.: Local users that may have been added to the slice + # by hand, are not touched. + + timers['slices'] = time.time() - start + + # Update peer itself and commit + peer.sync(commit = True) + + return timers diff --git a/PLC/Methods/ResetPassword.py b/PLC/Methods/ResetPassword.py new file mode 100644 index 0000000..0e2d2a9 --- /dev/null +++ b/PLC/Methods/ResetPassword.py @@ -0,0 +1,128 @@ +import random +import base64 +import time +import urllib + +from types import StringTypes + +from PLC.Debug import log +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Messages import Message, Messages +from PLC.Auth import Auth +from PLC.sendmail import sendmail + +class ResetPassword(Method): + """ + If verification_key is not specified, then a new verification_key + will be generated and stored with the user's account. The key will + be e-mailed to the user in the form of a link to a web page. + + The web page should verify the key by calling this function again + and specifying verification_key. If the key matches what has been + stored in the user's account, a new random password will be + e-mailed to the user. + + Returns 1 if verification_key was not specified, or was specified + and is valid, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Person.fields['verification_key'], + Person.fields['verification_expires'] + ] + + returns = Parameter(int, '1 if verification_key is valid') + + def call(self, auth, person_id_or_email, verification_key = None, verification_expires = None): + # Get account information + # we need to search in local objects only + if isinstance (person_id_or_email,StringTypes): + filter={'email':person_id_or_email} + else: + filter={'person_id':person_id_or_email} + filter['peer_id']=None + persons = Persons(self.api, filter) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + if not person['enabled']: + raise PLCInvalidArgument, "Account must be enabled" + + # Be paranoid and deny password resets for admins + if 'admin' in person['roles']: + raise PLCInvalidArgument, "Cannot reset admin passwords" + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + random_key = base64.b64encode("".join(map(chr, bytes))) + + if verification_key is not None: + if person['verification_key'] is None or \ + person['verification_expires'] is None or \ + person['verification_expires'] < time.time(): + raise PLCPermissionDenied, "Verification key has expired" + elif person['verification_key'] != verification_key: + raise PLCPermissionDenied, "Verification key incorrect" + else: + # Reset password to random string + person['password'] = random_key + person['verification_key'] = None + person['verification_expires'] = None + person.sync() + + message_id = 'Password reset' + else: + # Only allow one reset at a time + if person['verification_expires'] is not None and \ + person['verification_expires'] > time.time(): + raise PLCPermissionDenied, "Password reset request already pending" + + if verification_expires is None: + verification_expires = int(time.time() + (24 * 60 * 60)) + + person['verification_key'] = random_key + person['verification_expires'] = verification_expires + person.sync() + + message_id = 'Password reset requested' + + messages = Messages(self.api, [message_id]) + if messages: + # Send password to user + message = messages[0] + + params = {'PLC_NAME': self.api.config.PLC_NAME, + 'PLC_MAIL_SUPPORT_ADDRESS': self.api.config.PLC_MAIL_SUPPORT_ADDRESS, + 'PLC_WWW_HOST': self.api.config.PLC_WWW_HOST, + 'PLC_WWW_SSL_PORT': self.api.config.PLC_WWW_SSL_PORT, + 'person_id': person['person_id'], + # Will be used in a URL, so must quote appropriately + 'verification_key': urllib.quote_plus(random_key), + 'password': random_key, + 'email': person['email']} + + sendmail(self.api, + To = ("%s %s" % (person['first_name'], person['last_name']), person['email']), + Subject = message['subject'] % params, + Body = message['template'] % params) + else: + print >> log, "Warning: No message template '%s'" % message_id + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = message_id + + return 1 diff --git a/PLC/Methods/SetPersonPrimarySite.py b/PLC/Methods/SetPersonPrimarySite.py new file mode 100644 index 0000000..644826b --- /dev/null +++ b/PLC/Methods/SetPersonPrimarySite.py @@ -0,0 +1,62 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class SetPersonPrimarySite(Method): + """ + Makes the specified site the person's primary site. The person + must already be a member of the site. + + Admins may update anyone. All others may only update themselves. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + object_type = 'Person' + + def call(self, auth, person_id_or_email, site_id_or_login_base): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Non-admins can only update their own primary site + if 'admin' not in self.caller['roles'] and \ + self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + if site['site_id'] not in person['site_ids']: + raise PLCInvalidArgument, "Not a member of the specified site" + + person.set_primary_site(site) + + return 1 diff --git a/PLC/Methods/SliceCreate.py b/PLC/Methods/SliceCreate.py new file mode 100644 index 0000000..cc30b52 --- /dev/null +++ b/PLC/Methods/SliceCreate.py @@ -0,0 +1,25 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Methods.AddSlice import AddSlice + +class SliceCreate(AddSlice): + """ + Deprecated. See AddSlice. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Slice.fields['name'], + AddSlice.accepts[1] + ] + + returns = Parameter(int, 'New slice_id (> 0) if successful') + + def call(self, auth, name, slice_fields = {}): + slice_fields['name'] = name + return AddSlice.call(self, auth, slice_fields) diff --git a/PLC/Methods/SliceDelete.py b/PLC/Methods/SliceDelete.py new file mode 100644 index 0000000..70f6696 --- /dev/null +++ b/PLC/Methods/SliceDelete.py @@ -0,0 +1,29 @@ +import re + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.DeleteSlice import DeleteSlice + +class SliceDelete(DeleteSlice): + """ + Deprecated. See DeleteSlice. + + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Slice.fields['name'] + ] + + returns = Parameter(int, 'Returns 1 if successful, a fault otherwise.') + + def call(self, auth, slice_name): + + return DeleteSlice.call(self, auth, slice_name) diff --git a/PLC/Methods/SliceExtendedInfo.py b/PLC/Methods/SliceExtendedInfo.py new file mode 100644 index 0000000..1211610 --- /dev/null +++ b/PLC/Methods/SliceExtendedInfo.py @@ -0,0 +1,84 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Sites import Site, Sites +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons + +class SliceExtendedInfo(Method): + """ + Deprecated. Can be implemented with GetSlices. + + Returns an array of structs containing details about slices. + The summary can optionally include the list of nodes in and + users of each slice. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + [Slice.fields['name']], + Parameter(bool, "Whether or not to return users for the slices", nullok = True), + Parameter(bool, "Whether or not to return nodes for the slices", nullok = True) + ] + + returns = [Slice.fields] + + + def call(self, auth, slice_name_list=None, return_users=None, return_nodes=None, return_attributes=None): + # If we are not admin, make sure to return only viewable + # slices. + slice_filter = slice_name_list + slices = Slices(self.api, slice_filter) + if not slices: + raise PLCInvalidArgument, "No such slice" + + if 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + for slice in slices: + index = slices.index(slice) + node_ids = slices[index].pop('node_ids') + person_ids = slices[index].pop('person_ids') + attribute_ids = slices[index].pop('slice_attribute_ids') + if return_users or return_users is None: + persons = Persons(self.api, person_ids) + person_info = [{'email': person['email'], + 'person_id': person['person_id']} \ + for person in persons] + slices[index]['users'] = person_info + if return_nodes or return_nodes is None: + nodes = Nodes(self.api, node_ids) + node_info = [{'hostname': node['hostname'], + 'node_id': node['node_id']} \ + for node in nodes] + slices[index]['nodes'] = node_info + if return_attributes or return_attributes is None: + attributes = SliceAttributes(self.api, attribute_ids) + attribute_info = [{'name': attribute['name'], + 'value': attribute['value']} \ + for attribute in attributes] + slices[index]['attributes'] = attribute_info + + return slices diff --git a/PLC/Methods/SliceGetTicket.py b/PLC/Methods/SliceGetTicket.py new file mode 100644 index 0000000..64413c9 --- /dev/null +++ b/PLC/Methods/SliceGetTicket.py @@ -0,0 +1,249 @@ +import os +import sys +from subprocess import Popen, PIPE, call +from tempfile import NamedTemporaryFile +from xml.sax.saxutils import escape, quoteattr, XMLGenerator + +from PLC.Faults import * +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.SliceAttributes import SliceAttribute, SliceAttributes + +from PLC.Methods.GetSliceTicket import GetSliceTicket + +class PrettyXMLGenerator(XMLGenerator): + """ + Adds indentation to the beginning and newlines to the end of + opening and closing tags. + """ + + def __init__(self, out = sys.stdout, encoding = "utf-8", indent = "", addindent = "", newl = ""): + XMLGenerator.__init__(self, out, encoding) + # XMLGenerator does not export _write() + self.write = self.ignorableWhitespace + self.indents = [indent] + self.addindent = addindent + self.newl = newl + + def startDocument(self): + XMLGenerator.startDocument(self) + + def startElement(self, name, attrs, indent = True, newl = True): + if indent: + self.ignorableWhitespace("".join(self.indents)) + self.indents.append(self.addindent) + + XMLGenerator.startElement(self, name, attrs) + + if newl: + self.ignorableWhitespace(self.newl) + + def characters(self, content): + # " to " + # ' to ' + self.write(escape(content, { + '"': '"', + "'": ''', + })) + + def endElement(self, name, indent = True, newl = True): + self.indents.pop() + if indent: + self.ignorableWhitespace("".join(self.indents)) + + XMLGenerator.endElement(self, name) + + if newl: + self.ignorableWhitespace(self.newl) + + def simpleElement(self, name, attrs = {}, indent = True, newl = True): + if indent: + self.ignorableWhitespace("".join(self.indents)) + + self.write('<' + name) + for (name, value) in attrs.items(): + self.write(' %s=%s' % (name, quoteattr(value))) + self.write('/>') + + if newl: + self.ignorableWhitespace(self.newl) + +class SliceGetTicket(GetSliceTicket): + """ + Deprecated. See GetSliceTicket. + + Warning: This function exists solely for backward compatibility + with the old public PlanetLab 3.0 Node Manager, which will be + removed from service by 2007. This call is not intended to be used + by any other PLC except the public PlanetLab. + """ + + status = "deprecated" + + def call(self, auth, slice_id_or_name): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # Allow peers to obtain tickets for their own slices + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if slice['instantiation'] != 'delegated': + raise PLCInvalidArgument, "Not in delegated state" + + nodes = Nodes(self.api, slice['node_ids']).dict() + persons = Persons(self.api, slice['person_ids']).dict() + slice_attributes = SliceAttributes(self.api, slice['slice_attribute_ids']).dict() + + ticket = NamedTemporaryFile() + + xml = PrettyXMLGenerator(out = ticket, encoding = self.api.encoding, indent = "", addindent = " ", newl = "\n") + xml.startDocument() + + # + xml.startElement('ticket', {}) + + # + xml.startElement('slice', + {'id': str(slice['slice_id']), + 'name': unicode(slice['name']), + 'expiry': unicode(int(slice['expires']))}) + + # + xml.startElement('nodes', {}) + for node_id in slice['node_ids']: + if not nodes.has_key(node_id): + continue + node = nodes[node_id] + # + xml.simpleElement('node', + {'id': str(node['node_id']), + 'hostname': unicode(node['hostname'])}) + # + xml.endElement('nodes') + + # + xml.startElement('users', {}) + for person_id in slice['person_ids']: + if not persons.has_key(person_id): + continue + user = persons[person_id] + # + xml.simpleElement('user', + {'person_id': unicode(user['person_id']), + 'email': unicode(user['email'])}) + # + xml.endElement('users') + + # + xml.startElement('rspec', {}) + for slice_attribute_id in slice['slice_attribute_ids']: + if not slice_attributes.has_key(slice_attribute_id): + continue + slice_attribute = slice_attributes[slice_attribute_id] + + name = slice_attribute['name'] + value = slice_attribute['value'] + + def kbps_to_bps(kbps): + bps = int(kbps) * 1000 + return bps + + def max_kbyte_to_bps(max_kbyte): + bps = int(max_kbyte) * 1000 * 8 / 24 / 60 / 60 + return bps + + # XXX Used to support multiple named values for each attribute type + name_type_cast = { + 'cpu_share': ('nm_cpu_share', 'cpu_share', 'integer', int), + + 'net_share': ('nm_net_share', 'rate', 'integer', int), + 'net_min_rate': ('nm_net_min_rate', 'rate', 'integer', int), + 'net_max_rate': ('nm_net_max_rate', 'rate', 'integer', int), + 'net_max_kbyte': ('nm_net_avg_rate', 'rate', 'integer', max_kbyte_to_bps), + + 'net_i2_share': ('nm_net_exempt_share', 'rate', 'integer', int), + 'net_i2_min_rate': ('nm_net_exempt_min_rate', 'rate', 'integer', kbps_to_bps), + 'net_i2_max_rate': ('nm_net_exempt_max_rate', 'rate', 'integer', kbps_to_bps), + 'net_i2_max_kbyte': ('nm_net_exempt_avg_rate', 'rate', 'integer', max_kbyte_to_bps), + + 'disk_max': ('nm_disk_quota', 'quota', 'integer', int), + 'plc_agent_version': ('plc_agent_version', 'version', 'string', str), + 'plc_slice_type': ('plc_slice_type', 'type', 'string', str), + 'plc_ticket_pubkey': ('plc_ticket_pubkey', 'key', 'string', str), + } + + if name == 'initscript': + (attribute_name, value_name, type) = ('initscript', 'initscript_id', 'integer') + value = slice_attribute['slice_attribute_id'] + elif name in name_type_cast: + (attribute_name, value_name, type, cast) = name_type_cast[name] + value = cast(value) + else: + attribute_name = value_name = name + type = "string" + + # + xml.startElement('resource', {'name': unicode(attribute_name)}) + + # + xml.startElement('value', + {'name': unicode(value_name), + 'type': type}, + newl = False) + # element value + xml.characters(unicode(value)) + # + xml.endElement('value', indent = False) + + # + xml.endElement('resource') + # + xml.endElement('rspec') + + # + xml.endElement('slice') + + # Add signature template + xml.startElement('Signature', {'xmlns': "http://www.w3.org/2000/09/xmldsig#"}) + xml.startElement('SignedInfo', {}) + xml.simpleElement('CanonicalizationMethod', {'Algorithm': "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"}) + xml.simpleElement('SignatureMethod', {'Algorithm': "http://www.w3.org/2000/09/xmldsig#rsa-sha1"}) + xml.startElement('Reference', {'URI': ""}) + xml.startElement('Transforms', {}) + xml.simpleElement('Transform', {'Algorithm': "http://www.w3.org/2000/09/xmldsig#enveloped-signature"}) + xml.endElement('Transforms') + xml.simpleElement('DigestMethod', {'Algorithm': "http://www.w3.org/2000/09/xmldsig#sha1"}) + xml.simpleElement('DigestValue', {}) + xml.endElement('Reference') + xml.endElement('SignedInfo') + xml.simpleElement('SignatureValue', {}) + xml.endElement('Signature') + + xml.endElement('ticket') + xml.endDocument() + + if not hasattr(self.api.config, 'PLC_API_TICKET_KEY') or \ + not os.path.exists(self.api.config.PLC_API_TICKET_KEY): + raise PLCAPIError, "Slice ticket signing key not found" + + ticket.flush() + + # Sign the ticket + p = Popen(["xmlsec1", "--sign", + "--privkey-pem", self.api.config.PLC_API_TICKET_KEY, + ticket.name], + stdin = PIPE, stdout = PIPE, stderr = PIPE, close_fds = True) + signed_ticket = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + ticket.close() + + if rc: + raise PLCAPIError, err + + return signed_ticket diff --git a/PLC/Methods/SliceInfo.py b/PLC/Methods/SliceInfo.py new file mode 100644 index 0000000..9645f99 --- /dev/null +++ b/PLC/Methods/SliceInfo.py @@ -0,0 +1,75 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Faults import * +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes + +class SliceInfo(Method): + """ + Deprecated. Can be implemented with GetSlices. + + Returns an array of structs containing details about slices. + The summary can optionally include the list of nodes in and + users of each slice. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + [Mixed(Slice.fields['name'])], + Parameter(bool, "Whether or not to return users for the slices", nullok = True), + Parameter(bool, "Whether or not to return nodes for the slices", nullok = True) + ] + + returns = [Slice.fields] + + + def call(self, auth, slice_name_list=None, return_users=None, return_nodes=None): + # If we are not admin, make sure to return only viewable + # slices. + slice_filter = slice_name_list + slices = Slices(self.api, slice_filter) + if not slices: + raise PLCInvalidArgument, "No such slice" + + if 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + + for slice in slices: + index = slices.index(slice) + node_ids = slices[index].pop('node_ids') + person_ids = slices[index].pop('person_ids') + if return_users or return_users is None: + persons = Persons(self.api, person_ids) + emails = [person['email'] for person in persons] + slices[index]['users'] = emails + if return_nodes or return_nodes is None: + nodes = Nodes(self.api, node_ids) + hostnames = [node['hostname'] for node in nodes] + slices[index]['nodes'] = hostnames + + + return slices diff --git a/PLC/Methods/SliceListNames.py b/PLC/Methods/SliceListNames.py new file mode 100644 index 0000000..4d94933 --- /dev/null +++ b/PLC/Methods/SliceListNames.py @@ -0,0 +1,45 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Methods.GetSlices import GetSlices + +class SliceListNames(GetSlices): + """ + Deprecated. Can be implemented with GetSlices. + + List the names of registered slices. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Parameter(str, "Slice prefix", nullok = True) + ] + + returns = [Slice.fields['name']] + + + def call(self, auth, prefix=None): + + slice_filter = None + if prefix: + slice_filter = {'name': prefix+'*'} + + slices = GetSlices.call(self, auth, slice_filter) + + if not slices: + raise PLCInvalidArgument, "No such slice" + + slice_names = [slice['name'] for slice in slices] + + return slice_names diff --git a/PLC/Methods/SliceListUserSlices.py b/PLC/Methods/SliceListUserSlices.py new file mode 100644 index 0000000..9e054ed --- /dev/null +++ b/PLC/Methods/SliceListUserSlices.py @@ -0,0 +1,47 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Methods.GetSlices import GetSlices +from PLC.Methods.GetPersons import GetPersons + +class SliceListUserSlices(GetSlices, GetPersons): + """ + Deprecated. Can be implemented with GetPersons and GetSlices. + + Return the slices the specified user (by email address) is a member of. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Person.fields['email'] + ] + + returns = [Slice.fields['name']] + + + def call(self, auth, email): + + persons = GetPersons.call(self, auth, [email]) + if not persons: + return [] + person = persons[0] + slice_ids = person['slice_ids'] + if not slice_ids: + return [] + + slices = GetSlices.call(self, auth, slice_ids) + slice_names = [slice['name'] for slice in slices] + + return slice_names diff --git a/PLC/Methods/SliceNodesAdd.py b/PLC/Methods/SliceNodesAdd.py new file mode 100644 index 0000000..35ccabe --- /dev/null +++ b/PLC/Methods/SliceNodesAdd.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.AddSliceToNodes import AddSliceToNodes + +class SliceNodesAdd(AddSliceToNodes): + """ + Deprecated. See AddSliceToNodes. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Node.fields['hostname']] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, nodes_list): + + return AddSliceToNodes.call(self, auth, slice_name, nodes_list) diff --git a/PLC/Methods/SliceNodesDel.py b/PLC/Methods/SliceNodesDel.py new file mode 100644 index 0000000..66c0ed2 --- /dev/null +++ b/PLC/Methods/SliceNodesDel.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.DeleteSliceFromNodes import DeleteSliceFromNodes + +class SliceNodesDel(DeleteSliceFromNodes): + """ + Deprecated. See DeleteSliceFromNodes. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Node.fields['hostname']] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, nodes_list): + + return DeleteSliceFromNodes.call(self, auth, slice_name, nodes_list) diff --git a/PLC/Methods/SliceNodesList.py b/PLC/Methods/SliceNodesList.py new file mode 100644 index 0000000..0c44f66 --- /dev/null +++ b/PLC/Methods/SliceNodesList.py @@ -0,0 +1,40 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Methods.GetSlices import GetSlices +from PLC.Methods.GetNodes import GetNodes + +class SliceNodesList(GetSlices, GetNodes): + """ + Deprecated. Can be implemented with GetSlices and GetNodes. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'] + ] + + returns = [Node.fields['hostname']] + + + def call(self, auth, slice_name): + slices = GetSlices.call(self, auth, [slice_name]) + if not slices: + return [] + + slice = slices[0] + nodes = GetNodes.call(self, auth, slice['node_ids']) + if not nodes: + return [] + + node_hostnames = [node['hostname'] for node in nodes] + + return node_hostnames diff --git a/PLC/Methods/SliceRenew.py b/PLC/Methods/SliceRenew.py new file mode 100644 index 0000000..4ac6f89 --- /dev/null +++ b/PLC/Methods/SliceRenew.py @@ -0,0 +1,34 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.UpdateSlice import UpdateSlice + +class SliceRenew(UpdateSlice): + """ + Deprecated. See UpdateSlice. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + Slice.fields['expires'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, slice_expires): + + slice_fields = {} + slice_fields['expires'] = slice_expires + + return UpdateSlice.call(self, auth, slice_name, slice_fields) + diff --git a/PLC/Methods/SliceTicketGet.py b/PLC/Methods/SliceTicketGet.py new file mode 100644 index 0000000..5b2b786 --- /dev/null +++ b/PLC/Methods/SliceTicketGet.py @@ -0,0 +1,13 @@ +from PLC.Methods.SliceGetTicket import SliceGetTicket + +class SliceTicketGet(SliceGetTicket): + """ + Deprecated. See GetSliceTicket. + + Warning: This function exists solely for backward compatibility + with the old public PlanetLab 3.0 Node Manager, which will be + removed from service by 2007. This call is not intended to be used + by any other PLC except the public PlanetLab. + """ + + status = "deprecated" diff --git a/PLC/Methods/SliceUpdate.py b/PLC/Methods/SliceUpdate.py new file mode 100644 index 0000000..9e82d3a --- /dev/null +++ b/PLC/Methods/SliceUpdate.py @@ -0,0 +1,37 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.UpdateSlice import UpdateSlice + +class SliceUpdate(UpdateSlice): + """ + Deprecated. See UpdateSlice. + + """ + + status = 'deprecated' + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + Slice.fields['url'], + Slice.fields['description'], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, url, description): + + slice_fields = {} + slice_fields['url'] = url + slice_fields['description'] = description + + return UpdateSlice.call(self, auth, slice_name, slice_fields) + + return 1 diff --git a/PLC/Methods/SliceUserAdd.py b/PLC/Methods/SliceUserAdd.py new file mode 100644 index 0000000..560a66a --- /dev/null +++ b/PLC/Methods/SliceUserAdd.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.AddPersonToSlice import AddPersonToSlice + +class SliceUserAdd(AddPersonToSlice): + """ + Deprecated. See AddPersonToSlice. + + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Person.fields['email']], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, user_list): + + for user in user_list: + AddPersonToSlice.call(self, auth, user, slice_name) + + return 1 diff --git a/PLC/Methods/SliceUserDel.py b/PLC/Methods/SliceUserDel.py new file mode 100644 index 0000000..0b41b15 --- /dev/null +++ b/PLC/Methods/SliceUserDel.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Methods.DeletePersonFromSlice import DeletePersonFromSlice + +class SliceUserDel(Method): + """ + Deprecated. Can be implemented with DeletePersonFromSlice. + + Removes the specified users from the specified slice. If the person is + already a member of the slice, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Person.fields['email']], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, user_list): + for user in user_list: + DeletePersonFromSlice.call(self, auth, user, slice_name) + + return 1 diff --git a/PLC/Methods/SliceUsersList.py b/PLC/Methods/SliceUsersList.py new file mode 100644 index 0000000..e3eb1e4 --- /dev/null +++ b/PLC/Methods/SliceUsersList.py @@ -0,0 +1,45 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Methods.GetSlices import GetSlices +from PLC.Methods.GetPersons import GetPersons + +class SliceUsersList(GetSlices, GetPersons): + """ + Deprecated. Can be implemented with GetSlices and GetPersons. + + List users that are members of the named slice. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified details + about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'] + ] + + returns = [Person.fields['email']] + + + def call(self, auth, slice_name): + + slice_filter = [slice_name] + slices = GetSlices.call(self, auth, slice_filter) + if not slices: + return [] + slice = slices[0] + + persons = GetPersons.call(self, auth, slice['person_ids']) + person_emails = [person['email'] for person in persons] + + return person_emails diff --git a/PLC/Methods/UpdateAddress.py b/PLC/Methods/UpdateAddress.py new file mode 100644 index 0000000..ed2fd43 --- /dev/null +++ b/PLC/Methods/UpdateAddress.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['line1', 'line2', 'line3', + 'city', 'state', 'postalcode', 'country'] + +class UpdateAddress(Method): + """ + Updates the parameters of an existing address with the values in + address_fields. + + PIs may only update addresses of their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + address_fields = dict(filter(can_update, Address.fields.items())) + + accepts = [ + Auth(), + Address.fields['address_id'], + address_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, address_id, address_fields): + address_fields = dict(filter(can_update, address_fields.items())) + + # Get associated address details + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.update(address_fields) + address.sync() + + # Logging variables + self.event_objects = {'Address': [address['address_id']]} + self.message = 'Address %d updated: %s' % \ + (address['address_id'], ", ".join(address_fields.keys())) + + return 1 diff --git a/PLC/Methods/UpdateAddressType.py b/PLC/Methods/UpdateAddressType.py new file mode 100644 index 0000000..922c940 --- /dev/null +++ b/PLC/Methods/UpdateAddressType.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in ['name', 'description'] + +class UpdateAddressType(Method): + """ + Updates the parameters of an existing address type with the values + in address_type_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + address_type_fields = dict(filter(can_update, AddressType.fields.items())) + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']), + address_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, address_type_id_or_name, address_type_fields): + address_type_fields = dict(filter(can_update, address_type_fields.items())) + + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + + address_type.update(address_type_fields) + address_type.sync() + self.event_objects = {'AddressType': [address_type['address_type_id']]} + + return 1 diff --git a/PLC/Methods/UpdateConfFile.py b/PLC/Methods/UpdateConfFile.py new file mode 100644 index 0000000..6fd0e2a --- /dev/null +++ b/PLC/Methods/UpdateConfFile.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['conf_file_id', 'node_ids', 'nodegroup_ids'] + +class UpdateConfFile(Method): + """ + Updates a node configuration file. Only the fields specified in + conf_file_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + conf_file_fields = dict(filter(can_update, ConfFile.fields.items())) + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + conf_file_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, conf_file_id, conf_file_fields): + conf_file_fields = dict(filter(can_update, conf_file_fields.items())) + + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + + conf_file = conf_files[0] + conf_file.update(conf_file_fields) + conf_file.sync() + self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} + + return 1 diff --git a/PLC/Methods/UpdateInitScript.py b/PLC/Methods/UpdateInitScript.py new file mode 100644 index 0000000..bb0f1f0 --- /dev/null +++ b/PLC/Methods/UpdateInitScript.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['initscript_id'] + +class UpdateInitScript(Method): + """ + Updates an initscript. Only the fields specified in + initscript_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + initscript_fields = dict(filter(can_update, InitScript.fields.items())) + + accepts = [ + Auth(), + InitScript.fields['initscript_id'], + initscript_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, initscript_id, initscript_fields): + initscript_fields = dict(filter(can_update, initscript_fields.items())) + + initscripts = InitScripts(self.api, [initscript_id]) + if not initscripts: + raise PLCInvalidArgument, "No such initscript" + + initscript = initscripts[0] + initscript.update(initscript_fields) + initscript.sync() + self.event_objects = {'InitScript': [initscript['initscript_id']]} + + return 1 diff --git a/PLC/Methods/UpdateKey.py b/PLC/Methods/UpdateKey.py new file mode 100644 index 0000000..0fb560b --- /dev/null +++ b/PLC/Methods/UpdateKey.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['key_type', 'key'] + +class UpdateKey(Method): + """ + Updates the parameters of an existing key with the values in + key_fields. + + Non-admins may only update their own keys. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + key_fields = dict(filter(can_update, Key.fields.items())) + + accepts = [ + Auth(), + Key.fields['key_id'], + key_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, key_id, key_fields): + key_fields = dict(filter(can_update, key_fields.items())) + + # Get key information + keys = Keys(self.api, [key_id]) + if not keys: + raise PLCInvalidArgument, "No such key" + key = keys[0] + + if key['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local key" + + if 'admin' not in self.caller['roles']: + if key['key_id'] not in self.caller['key_ids']: + raise PLCPermissionDenied, "Key must be associated with one of your accounts" + + key.update(key_fields) + key.sync() + + # Logging variables + self.event_objects = {'Key': [key['key_id']]} + self.message = 'key %d updated: %s' % \ + (key['key_id'], ", ".join(key_fields.keys())) + return 1 diff --git a/PLC/Methods/UpdateMessage.py b/PLC/Methods/UpdateMessage.py new file mode 100644 index 0000000..e44dca4 --- /dev/null +++ b/PLC/Methods/UpdateMessage.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['template', 'enabled'] + +class UpdateMessage(Method): + """ + Updates the parameters of an existing message template with the + values in message_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + message_fields = dict(filter(can_update, Message.fields.items())) + + accepts = [ + Auth(), + Message.fields['message_id'], + message_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, message_id, message_fields): + message_fields = dict(filter(can_update, message_fields.items())) + + # Get message information + messages = Messages(self.api, [message_id]) + if not messages: + raise PLCInvalidArgument, "No such message" + message = messages[0] + + message.update(message_fields) + message.sync() + self.event_objects = {'Message': [message['message_id']]} + + return 1 diff --git a/PLC/Methods/UpdateNode.py b/PLC/Methods/UpdateNode.py new file mode 100644 index 0000000..d5cdb0d --- /dev/null +++ b/PLC/Methods/UpdateNode.py @@ -0,0 +1,81 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +related_fields = Node.related_fields.keys() +can_update = lambda (field, value): field in \ + ['hostname', 'boot_state', 'model', 'version', + 'key', 'session', 'boot_nonce'] + \ + related_fields + +class UpdateNode(Method): + """ + Updates a node. Only the fields specified in node_fields are + updated, all other fields are left untouched. + + PIs and techs can update only the nodes at their sites. Only + admins can update the key, session, and boot_nonce fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + node_fields = dict(filter(can_update, Node.fields.items() + Node.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + node_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname, node_fields): + node_fields = dict(filter(can_update, node_fields.items())) + + # Remove admin only fields + if 'admin' not in self.caller['roles']: + for key in 'key', 'session', 'boot_nonce': + if node_fields.has_key(key): + del node_fields[key] + + # Get account information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete nodes from specified site" + + # Make requested associations + for field in related_fields: + if field in node_fields: + node.associate(auth, field, node_fields[field]) + node_fields.pop(field) + + node.update(node_fields) + node.update_last_updated(False) + node.sync() + + # Logging variables + self.event_objects = {'Node': [node['node_id']]} + self.message = 'Node %d updated: %s.' % \ + (node['node_id'], ", ".join(node_fields.keys())) + if 'boot_state' in node_fields.keys(): + self.message += ' boot_state updated to %s' % node_fields['boot_state'] + + return 1 diff --git a/PLC/Methods/UpdateNodeGroup.py b/PLC/Methods/UpdateNodeGroup.py new file mode 100644 index 0000000..c84c7f1 --- /dev/null +++ b/PLC/Methods/UpdateNodeGroup.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +related_fields = NodeGroup.related_fields.keys() +can_update = lambda (field, value): field in \ + ['name', 'description'] + \ + related_fields + +class UpdateNodeGroup(Method): + """ + Updates a custom node group. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + nodegroup_fields = dict(filter(can_update, NodeGroup.fields.items() + NodeGroup.related_fields.items())) + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + nodegroup_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodegroup_id_or_name, nodegroup_fields): + nodegroup_fields = dict(filter(can_update, nodegroup_fields.items())) + + # Get nodegroup information + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + nodegroup = nodegroups[0] + + # Make requested associations + for field in related_fields: + if field in nodegroup_fields: + nodegroup.associate(auth, field, nodegroup_fields[field]) + nodegroup_fields.pop(field) + + nodegroup.update(nodegroup_fields) + nodegroup.sync() + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']]} + self.message = 'Node group %d updated: %s' % \ + (nodegroup['nodegroup_id'], ", ".join(nodegroup_fields.keys())) + return 1 diff --git a/PLC/Methods/UpdateNodeNetwork.py b/PLC/Methods/UpdateNodeNetwork.py new file mode 100644 index 0000000..dc1e65a --- /dev/null +++ b/PLC/Methods/UpdateNodeNetwork.py @@ -0,0 +1,69 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['nodenetwork_id','node_id'] + +class UpdateNodeNetwork(Method): + """ + Updates an existing node network. Any values specified in + nodenetwork_fields are used, otherwise defaults are + used. Acceptable values for method are dhcp and static. If type is + static, then ip, gateway, network, broadcast, netmask, and dns1 + must all be specified in nodenetwork_fields. If type is dhcp, + these parameters, even if specified, are ignored. + + PIs and techs may only update networks associated with their own + nodes. Admins may update any node network. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Auth(), + NodeNetwork.fields['nodenetwork_id'], + nodenetwork_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodenetwork_id, nodenetwork_fields): + nodenetwork_fields = dict(filter(can_update, nodenetwork_fields.items())) + + # Get node network information + nodenetworks = NodeNetworks(self.api, [nodenetwork_id]) + if not nodenetworks: + raise PLCInvalidArgument, "No such node network" + + nodenetwork = nodenetworks[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site where the node exists. + if 'admin' not in self.caller['roles']: + nodes = Nodes(self.api, [nodenetwork['node_id']]) + if not nodes: + raise PLCPermissionDenied, "Node network is not associated with a node" + node = nodes[0] + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to update node network" + + # Update node network + nodenetwork.update(nodenetwork_fields) + nodenetwork.sync() + + self.event_objects = {'NodeNetwork': [nodenetwork['nodenetwork_id']]} + self.message = "Node network %d updated: %s " % \ + (nodenetwork['nodenetwork_id'], ", ".join(nodenetwork_fields.keys())) + + return 1 diff --git a/PLC/Methods/UpdateNodeNetworkSetting.py b/PLC/Methods/UpdateNodeNetworkSetting.py new file mode 100644 index 0000000..e8f7497 --- /dev/null +++ b/PLC/Methods/UpdateNodeNetworkSetting.py @@ -0,0 +1,72 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +from PLC.Nodes import Nodes +from PLC.Sites import Sites + +class UpdateNodeNetworkSetting(Method): + """ + Updates the value of an existing nodenetwork setting + + Access rights depend on the nodenetwork setting type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + NodeNetworkSetting.fields['nodenetwork_setting_id'], + NodeNetworkSetting.fields['value'] + ] + + returns = Parameter(int, '1 if successful') + + object_type = 'NodeNetwork' + + def call(self, auth, nodenetwork_setting_id, value): + nodenetwork_settings = NodeNetworkSettings(self.api, [nodenetwork_setting_id]) + if not nodenetwork_settings: + raise PLCInvalidArgument, "No such nodenetwork setting %r"%nodenetwork_setting_id + nodenetwork_setting = nodenetwork_settings[0] + + ### reproducing a check from UpdateSliceAttribute, looks dumb though + nodenetworks = NodeNetworks(self.api, [nodenetwork_setting['nodenetwork_id']]) + if not nodenetworks: + raise PLCInvalidArgument, "No such nodenetwork %r"%nodenetwork_setting['nodenetwork_id'] + nodenetwork = nodenetworks[0] + + assert nodenetwork_setting['nodenetwork_setting_id'] in nodenetwork['nodenetwork_setting_ids'] + + # check permission : it not admin, is the user affiliated with the right site + if 'admin' not in self.caller['roles']: + # locate node + node = Nodes (self.api,[nodenetwork['node_id']])[0] + # locate site + site = Sites (self.api, [node['site_id']])[0] + # check caller is affiliated with this site + if self.caller['person_id'] not in site['person_ids']: + raise PLCPermissionDenied, "Not a member of the hosting site %s"%site['abbreviated_site'] + + required_min_role = nodenetwork_setting_type ['min_role_id'] + if required_min_role is not None and \ + min(self.caller['role_ids']) > required_min_role: + raise PLCPermissionDenied, "Not allowed to modify the specified nodenetwork setting, requires role %d",required_min_role + + nodenetwork_setting['value'] = value + nodenetwork_setting.sync() + + self.object_ids = [nodenetwork_setting['nodenetwork_setting_id']] + return 1 diff --git a/PLC/Methods/UpdateNodeNetworkSettingType.py b/PLC/Methods/UpdateNodeNetworkSettingType.py new file mode 100644 index 0000000..b18079b --- /dev/null +++ b/PLC/Methods/UpdateNodeNetworkSettingType.py @@ -0,0 +1,48 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'category', 'min_role_id'] + +class UpdateNodeNetworkSettingType(Method): + """ + Updates the parameters of an existing setting type + with the values in nodenetwork_setting_type_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + nodenetwork_setting_type_fields = dict(filter(can_update, NodeNetworkSettingType.fields.items())) + + accepts = [ + Auth(), + Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name']), + nodenetwork_setting_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodenetwork_setting_type_id_or_name, nodenetwork_setting_type_fields): + nodenetwork_setting_type_fields = dict(filter(can_update, nodenetwork_setting_type_fields.items())) + + nodenetwork_setting_types = NodeNetworkSettingTypes(self.api, [nodenetwork_setting_type_id_or_name]) + if not nodenetwork_setting_types: + raise PLCInvalidArgument, "No such setting type" + nodenetwork_setting_type = nodenetwork_setting_types[0] + + nodenetwork_setting_type.update(nodenetwork_setting_type_fields) + nodenetwork_setting_type.sync() + self.object_ids = [nodenetwork_setting_type['nodenetwork_setting_type_id']] + + return 1 diff --git a/PLC/Methods/UpdatePCU.py b/PLC/Methods/UpdatePCU.py new file mode 100644 index 0000000..8916684 --- /dev/null +++ b/PLC/Methods/UpdatePCU.py @@ -0,0 +1,52 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['pcu_id', 'site_id'] + +class UpdatePCU(Method): + """ + Updates the parameters of an existing PCU with the values in + pcu_fields. + + Non-admins may only update PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + update_fields = dict(filter(can_update, PCU.fields.items())) + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + update_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_id, pcu_fields): + pcu_fields = dict(filter(can_update, pcu_fields.items())) + + # Get associated PCU details + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + if pcu['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + pcu.update(pcu_fields) + pcu.sync() + + # Logging variables + self.event_objects = {'PCU': [pcu['pcu_id']]} + self.message = 'PCU %d updated: %s' % \ + (pcu['pcu_id'], ", ".join(pcu_fields.keys())) + return 1 diff --git a/PLC/Methods/UpdatePCUProtocolType.py b/PLC/Methods/UpdatePCUProtocolType.py new file mode 100644 index 0000000..b1a30bc --- /dev/null +++ b/PLC/Methods/UpdatePCUProtocolType.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['pcu_type_id', 'port', 'protocol', 'supported'] + +class UpdatePCUProtocolType(Method): + """ + Updates a pcu protocol type. Only the fields specified in + port_typee_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + protocol_type_fields = dict(filter(can_update, PCUProtocolType.fields.items())) + + accepts = [ + Auth(), + PCUProtocolType.fields['pcu_protocol_type_id'], + protocol_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, protocol_type_id, protocol_type_fields): + protocol_type_fields = dict(filter(can_update, protocol_type_fields.items())) + + protocol_types = PCUProtocolTypes(self.api, [protocol_type_id]) + if not protocol_types: + raise PLCInvalidArgument, "No such pcu protocol type" + + protocol_type = protocol_types[0] + protocol_type.update(protocol_type_fields) + protocol_type.sync() + self.event_objects = {'PCUProtocolType': [protocol_type['pcu_protocol_type_id']]} + return 1 diff --git a/PLC/Methods/UpdatePCUType.py b/PLC/Methods/UpdatePCUType.py new file mode 100644 index 0000000..fc4e886 --- /dev/null +++ b/PLC/Methods/UpdatePCUType.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['model', 'name'] + +class UpdatePCUType(Method): + """ + Updates a PCU type. Only the fields specified in + pcu_typee_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + pcu_type_fields = dict(filter(can_update, PCUType.fields.items())) + + accepts = [ + Auth(), + PCUType.fields['pcu_type_id'], + pcu_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_type_id, pcu_type_fields): + pcu_type_fields = dict(filter(can_update, pcu_type_fields.items())) + + pcu_types = PCUTypes(self.api, [pcu_type_id]) + if not pcu_types: + raise PLCInvalidArgument, "No such pcu type" + + pcu_type = pcu_types[0] + pcu_type.update(pcu_type_fields) + pcu_type.sync() + self.event_objects = {'PCUType': [pcu_type['pcu_type_id']]} + + return 1 diff --git a/PLC/Methods/UpdatePeer.py b/PLC/Methods/UpdatePeer.py new file mode 100644 index 0000000..8586a48 --- /dev/null +++ b/PLC/Methods/UpdatePeer.py @@ -0,0 +1,50 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Peers import Peer, Peers + +can_update = lambda (field, value): field in \ + ['peername', 'peer_url', 'key', 'cacert'] + +class UpdatePeer(Method): + """ + Updates a peer. Only the fields specified in peer_fields are + updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + peer_fields = dict(filter(can_update, Peer.fields.items())) + + accepts = [ + Auth(), + Mixed(Peer.fields['peer_id'], + Peer.fields['peername']), + peer_fields + ] + + returns = Parameter(int, "1 if successful") + + def call(self, auth, peer_id_or_name, peer_fields): + peer_fields = dict(filter(can_update, peer_fields.items())) + + # Get account information + peers = Peers(self.api, [peer_id_or_name]) + if not peers: + raise PLCInvalidArgument, "No such peer" + peer = peers[0] + + if isinstance(self.caller, Peer): + if self.caller['peer_id'] != peer['peer_id']: + raise PLCPermissionDenied, "Not allowed to update specified peer" + + peer.update(peer_fields) + peer.sync() + + # Log affected objects + self.event_objects = {'Peer': [peer['peer_id']]} + + return 1 diff --git a/PLC/Methods/UpdatePerson.py b/PLC/Methods/UpdatePerson.py new file mode 100644 index 0000000..8f74fc0 --- /dev/null +++ b/PLC/Methods/UpdatePerson.py @@ -0,0 +1,77 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +related_fields = Person.related_fields.keys() +can_update = lambda (field, value): field in \ + ['first_name', 'last_name', 'title', 'email', + 'password', 'phone', 'url', 'bio', 'accepted_aup', + 'enabled'] + related_fields + +class UpdatePerson(Method): + """ + Updates a person. Only the fields specified in person_fields are + updated, all other fields are left untouched. + + Users and techs can only update themselves. PIs can only update + themselves and other non-PIs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + person_fields = dict(filter(can_update, Person.fields.items() + Person.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + person_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, person_fields): + person_fields = dict(filter(can_update, person_fields.items())) + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Make requested associations + for field in related_fields: + if field in person_fields: + person.associate(auth, field, person_fields[field]) + person_fields.pop(field) + + person.update(person_fields) + person.update_last_updated(False) + person.sync() + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + + # Redact password + if 'password' in person_fields: + person_fields['password'] = "Removed by API" + self.message = 'Person %d updated: %s.' % \ + (person['person_id'], person_fields.keys()) + if 'enabled' in person_fields: + self.message += ' Person enabled' + + return 1 diff --git a/PLC/Methods/UpdateSite.py b/PLC/Methods/UpdateSite.py new file mode 100644 index 0000000..6a33c5e --- /dev/null +++ b/PLC/Methods/UpdateSite.py @@ -0,0 +1,79 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +related_fields = Site.related_fields.keys() +can_update = lambda (field, value): field in \ + ['name', 'abbreviated_name', 'login_base', + 'is_public', 'latitude', 'longitude', 'url', + 'max_slices', 'max_slivers', 'enabled', 'ext_consortium_id'] + \ + related_fields + +class UpdateSite(Method): + """ + Updates a site. Only the fields specified in update_fields are + updated, all other fields are left untouched. + + PIs can only update sites they are a member of. Only admins can + update max_slices, max_slivers, and login_base. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + site_fields = dict(filter(can_update, Site.fields.items() + Site.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + site_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, site_id_or_login_base, site_fields): + site_fields = dict(filter(can_update, site_fields.items())) + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site. + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to modify specified site" + + # Remove admin only fields + for key in 'max_slices', 'max_slivers', 'login_base': + if key in site_fields: + del site_fields[key] + + # Make requested associations + for field in related_fields: + if field in site_fields: + site.associate(auth, field, site_fields[field]) + site_fields.pop(field) + + site.update(site_fields) + site.update_last_updated(False) + site.sync() + + # Logging variables + self.event_objects = {'Site': [site['site_id']]} + self.message = 'Site %d updated: %s' % \ + (site['site_id'], ", ".join(site_fields.keys())) + + return 1 diff --git a/PLC/Methods/UpdateSlice.py b/PLC/Methods/UpdateSlice.py new file mode 100644 index 0000000..901ecbc --- /dev/null +++ b/PLC/Methods/UpdateSlice.py @@ -0,0 +1,107 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +related_fields = Slice.related_fields.keys() +can_update = lambda (field, value): field in \ + ['instantiation', 'url', 'description', 'max_nodes', 'expires'] + \ + related_fields + + +class UpdateSlice(Method): + """ + Updates the parameters of an existing slice with the values in + slice_fields. + + Users may only update slices of which they are members. PIs may + update any of the slices at their sites, or any slices of which + they are members. Admins may update any slice. + + Only PIs and admins may update max_nodes. Slices cannot be renewed + (by updating the expires parameter) more than 8 weeks into the + future. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + slice_fields = dict(filter(can_update, Slice.fields.items() + Slice.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + slice_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, slice_fields): + slice_fields = dict(filter(can_update, slice_fields.items())) + + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + # Renewing + if 'expires' in slice_fields and slice_fields['expires'] > slice['expires']: + sites = Sites(self.api, [slice['site_id']]) + assert sites + site = sites[0] + + if site['max_slices'] < 0: + raise PLCInvalidArgument, "Slice creation and renewal have been disabled for the site" + + # Maximum expiration date is 8 weeks from now + # XXX Make this configurable + max_expires = time.time() + (8 * 7 * 24 * 60 * 60) + + if 'admin' not in self.caller['roles'] and slice_fields['expires'] > max_expires: + raise PLCInvalidArgument, "Cannot renew a slice beyond 8 weeks from now" + + # XXX Make this a configurable policy + if slice['description'] is None or not slice['description'].strip(): + if 'description' not in slice_fields or slice_fields['description'] is None or \ + not slice_fields['description'].strip(): + raise PLCInvalidArgument, "Cannot renew a slice with an empty description or URL" + + if slice['url'] is None or not slice['url'].strip(): + if 'url' not in slice_fields or slice_fields['url'] is None or \ + not slice_fields['url'].strip(): + raise PLCInvalidArgument, "Cannot renew a slice with an empty description or URL" + + if 'max_nodes' in slice_fields and slice_fields['max_nodes'] != slice['max_nodes']: + if 'admin' not in self.caller['roles'] and \ + 'pi' not in self.caller['roles']: + raise PLCInvalidArgument, "Only admins and PIs may update max_nodes" + + # Make requested associations + for field in related_fields: + if field in slice_fields: + slice.associate(auth, field, slice_fields[field]) + slice_fields.pop(field) + + slice.update(slice_fields) + slice.sync() + + self.event_objects = {'Slice': [slice['slice_id']]} + + return 1 diff --git a/PLC/Methods/UpdateSliceAttribute.py b/PLC/Methods/UpdateSliceAttribute.py new file mode 100644 index 0000000..9451291 --- /dev/null +++ b/PLC/Methods/UpdateSliceAttribute.py @@ -0,0 +1,65 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class UpdateSliceAttribute(Method): + """ + Updates the value of an existing slice or sliver attribute. + + Users may only update attributes of slices or slivers of which + they are members. PIs may only update attributes of slices or + slivers at their sites, or of which they are members. Admins may + update attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + SliceAttribute.fields['slice_attribute_id'], + Mixed(SliceAttribute.fields['value'], + InitScript.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_attribute_id, value): + slice_attributes = SliceAttributes(self.api, [slice_attribute_id]) + if not slice_attributes: + raise PLCInvalidArgument, "No such slice attribute" + slice_attribute = slice_attributes[0] + + slices = Slices(self.api, [slice_attribute['slice_id']]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + assert slice_attribute['slice_attribute_id'] in slice['slice_attribute_ids'] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if slice_attribute['min_role_id'] is not None and \ + min(self.caller['role_ids']) > slice_attribute['min_role_id']: + raise PLCPermissionDenied, "Not allowed to update the specified attribute" + + if slice_attribute['name'] in ['initscript']: + initscripts = InitScripts(self.api, {'enabled': True, 'name': value}) + if not initscripts: + raise PLCInvalidArgument, "No such plc initscript" + + slice_attribute['value'] = unicode(value) + slice_attribute.sync() + self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]} + return 1 diff --git a/PLC/Methods/UpdateSliceAttributeType.py b/PLC/Methods/UpdateSliceAttributeType.py new file mode 100644 index 0000000..145a51d --- /dev/null +++ b/PLC/Methods/UpdateSliceAttributeType.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'min_role_id'] + +class UpdateSliceAttributeType(Method): + """ + Updates the parameters of an existing attribute with the values in + attribute_type_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + attribute_type_fields = dict(filter(can_update, SliceAttributeType.fields.items())) + + accepts = [ + Auth(), + Mixed(SliceAttributeType.fields['attribute_type_id'], + SliceAttributeType.fields['name']), + attribute_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, attribute_type_id_or_name, attribute_type_fields): + attribute_type_fields = dict(filter(can_update, attribute_type_fields.items())) + + attribute_types = SliceAttributeTypes(self.api, [attribute_type_id_or_name]) + if not attribute_types: + raise PLCInvalidArgument, "No such attribute" + attribute_type = attribute_types[0] + + attribute_type.update(attribute_type_fields) + attribute_type.sync() + self.event_objects = {'AttributeType': [attribute_type['attribute_type_id']]} + + return 1 diff --git a/PLC/Methods/VerifyPerson.py b/PLC/Methods/VerifyPerson.py new file mode 100644 index 0000000..9dd784b --- /dev/null +++ b/PLC/Methods/VerifyPerson.py @@ -0,0 +1,156 @@ +import random +import base64 +import time +import urllib + +from PLC.Debug import log +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Messages import Message, Messages +from PLC.Auth import Auth +from PLC.sendmail import sendmail + +class VerifyPerson(Method): + """ + Verify a new (must be disabled) user's e-mail address and registration. + + If verification_key is not specified, then a new verification_key + will be generated and stored with the user's account. The key will + be e-mailed to the user in the form of a link to a web page. + + The web page should verify the key by calling this function again + and specifying verification_key. If the key matches what has been + stored in the user's account, then an e-mail will be sent to the + user's PI (and support if the user is requesting a PI role), + asking the PI (or support) to enable the account. + + Returns 1 if the verification key if valid. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Person.fields['verification_key'], + Person.fields['verification_expires'] + ] + + returns = Parameter(int, '1 if verification_key is valid') + + def call(self, auth, person_id_or_email, verification_key = None, verification_expires = None): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account %r"%person_id_or_email + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account %r"%person_id_or_email + + if person['enabled']: + raise PLCInvalidArgument, "Account %r must be new (disabled)"%person_id_or_email + + # Get the primary site name + person_sites = Sites(self.api, person['site_ids']) + if person_sites: + site_name = person_sites[0]['name'] + else: + site_name = "No Site" + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + random_key = base64.b64encode("".join(map(chr, bytes))) + + if verification_key is None or \ + (verification_key is not None and person['verification_expires'] and \ + person['verification_expires'] < time.time()): + # Only allow one verification at a time + if person['verification_expires'] is not None and \ + person['verification_expires'] > time.time(): + raise PLCPermissionDenied, "Verification request already pending" + + if verification_expires is None: + verification_expires = int(time.time() + (24 * 60 * 60)) + + person['verification_key'] = random_key + person['verification_expires'] = verification_expires + person.sync() + + # Send e-mail to user + To = ("%s %s" % (person['first_name'], person['last_name']), person['email']) + Cc = None + + message_id = 'Verify account' + + + elif verification_key is not None: + if person['verification_key'] is None or \ + person['verification_expires'] is None: + raise PLCPermissionDenied, "Invalid Verification key" + elif person['verification_key'] != verification_key: + raise PLCPermissionDenied, "Verification key incorrect" + else: + person['verification_key'] = None + person['verification_expires'] = None + person.sync() + + # Get the PI(s) of each site that the user is registering with + person_ids = set() + for site in person_sites: + person_ids.update(site['person_ids']) + persons = Persons(self.api, person_ids) + pis = filter(lambda person: 'pi' in person['roles'] and person['enabled'], persons) + + # Send e-mail to PI(s) and copy the user + To = [("%s %s" % (pi['first_name'], pi['last_name']), pi['email']) for pi in pis] + Cc = ("%s %s" % (person['first_name'], person['last_name']), person['email']) + + if 'pi' in person['roles']: + # And support if user is requesting a PI role + To.append(("%s Support" % self.api.config.PLC_NAME, + self.api.config.PLC_MAIL_SUPPORT_ADDRESS)) + message_id = 'New PI account' + else: + message_id = 'New account' + + messages = Messages(self.api, [message_id]) + if messages: + # Send message to user + message = messages[0] + + params = {'PLC_NAME': self.api.config.PLC_NAME, + 'PLC_MAIL_SUPPORT_ADDRESS': self.api.config.PLC_MAIL_SUPPORT_ADDRESS, + 'PLC_WWW_HOST': self.api.config.PLC_WWW_HOST, + 'PLC_WWW_SSL_PORT': self.api.config.PLC_WWW_SSL_PORT, + 'person_id': person['person_id'], + # Will be used in a URL, so must quote appropriately + 'verification_key': urllib.quote_plus(random_key), + 'site_name': site_name, + 'first_name': person['first_name'], + 'last_name': person['last_name'], + 'email': person['email'], + 'roles': ", ".join(person['roles'])} + + sendmail(self.api, + To = To, + Cc = Cc, + Subject = message['subject'] % params, + Body = message['template'] % params) + else: + print >> log, "Warning: No message template '%s'" % message_id + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = message_id + + if verification_key is not None and person['verification_expires'] and \ + person['verification_expires'] < time.time(): + raise PLCPermissionDenied, "Verification key has expired. Another email has been sent." + + return 1 diff --git a/PLC/Methods/__init__.py b/PLC/Methods/__init__.py new file mode 100644 index 0000000..45c9228 --- /dev/null +++ b/PLC/Methods/__init__.py @@ -0,0 +1,231 @@ +methods = """ +AddAddressType +AddAddressTypeToAddress +AddBootState +AddConfFile +AddConfFileToNodeGroup +AddConfFileToNode +AddInitScript +AddKeyType +AddMessage +AddNetworkMethod +AddNetworkType +AddNodeGroup +AddNodeNetwork +AddNodeNetworkSetting +AddNodeNetworkSettingType +AddNode +AddNodeToNodeGroup +AddNodeToPCU +AddPCUProtocolType +AddPCU +AddPCUType +AddPeer +AddPersonKey +AddPerson +AddPersonToSite +AddPersonToSlice +AddRole +AddRoleToPerson +AddSession +AddSiteAddress +AddSite +AddSliceAttribute +AddSliceAttributeType +AddSliceInstantiation +AddSlice +AddSliceToNodes +AddSliceToNodesWhitelist +AdmAddAddressType +AdmAddNodeGroup +AdmAddNodeNetwork +AdmAddNode +AdmAddNodeToNodeGroup +AdmAddPersonKey +AdmAddPerson +AdmAddPersonToSite +AdmAddSitePowerControlUnit +AdmAddSite +AdmAssociateNodeToPowerControlUnitPort +AdmAuthCheck +AdmDeleteAddressType +AdmDeleteAllPersonKeys +AdmDeleteNodeGroup +AdmDeleteNodeNetwork +AdmDeleteNode +AdmDeletePersonKeys +AdmDeletePerson +AdmDeleteSitePowerControlUnit +AdmDeleteSite +AdmDisassociatePowerControlUnitPort +AdmGenerateNodeConfFile +AdmGetAllAddressTypes +AdmGetAllKeyTypes +AdmGetAllNodeNetworks +AdmGetAllRoles +AdmGetNodeGroupNodes +AdmGetNodeGroups +AdmGetNodes +AdmGetPersonKeys +AdmGetPersonRoles +AdmGetPersonSites +AdmGetPersons +AdmGetPowerControlUnitNodes +AdmGetPowerControlUnits +AdmGetSiteNodes +AdmGetSitePersons +AdmGetSitePIs +AdmGetSitePowerControlUnits +AdmGetSites +AdmGetSiteTechContacts +AdmGrantRoleToPerson +AdmIsPersonInRole +AdmQueryConfFile +AdmQueryNode +AdmQueryPerson +AdmQueryPowerControlUnit +AdmQuerySite +AdmRebootNode +AdmRemoveNodeFromNodeGroup +AdmRemovePersonFromSite +AdmRevokeRoleFromPerson +AdmSetPersonEnabled +AdmSetPersonPrimarySite +AdmUpdateNodeGroup +AdmUpdateNodeNetwork +AdmUpdateNode +AdmUpdatePerson +AdmUpdateSitePowerControlUnit +AdmUpdateSite +AnonAdmGetNodeGroups +AuthCheck +BlacklistKey +BootCheckAuthentication +BootGetNodeDetails +BootNotifyOwners +BootUpdateNode +DeleteAddress +DeleteAddressTypeFromAddress +DeleteAddressType +DeleteBootState +DeleteConfFileFromNodeGroup +DeleteConfFileFromNode +DeleteConfFile +DeleteInitScript +DeleteKey +DeleteKeyType +DeleteMessage +DeleteNetworkMethod +DeleteNetworkType +DeleteNodeFromNodeGroup +DeleteNodeFromPCU +DeleteNodeGroup +DeleteNodeNetwork +DeleteNodeNetworkSetting +DeleteNodeNetworkSettingType +DeleteNode +DeletePCUProtocolType +DeletePCU +DeletePCUType +DeletePeer +DeletePersonFromSite +DeletePersonFromSlice +DeletePerson +DeleteRoleFromPerson +DeleteRole +DeleteSession +DeleteSite +DeleteSliceAttribute +DeleteSliceAttributeType +DeleteSliceFromNodes +DeleteSliceFromNodesWhitelist +DeleteSliceInstantiation +DeleteSlice +GenerateNodeConfFile +GetAddresses +GetAddressTypes +GetBootMedium +GetBootStates +GetConfFiles +GetEventObjects +GetEvents +GetInitScripts +GetKeys +GetKeyTypes +GetMessages +GetNetworkMethods +GetNetworkTypes +GetNodeGroups +GetNodeNetworkSettings +GetNodeNetworkSettingTypes +GetNodeNetworks +GetNodes +GetPCUProtocolTypes +GetPCUs +GetPCUTypes +GetPeerData +GetPeerName +GetPeers +GetPersons +GetPlcRelease +GetRoles +GetSession +GetSessions +GetSites +GetSliceAttributes +GetSliceAttributeTypes +GetSliceInstantiations +GetSliceKeys +GetSlicesMD5 +GetSlices +GetSliceTicket +GetSlivers +GetWhitelist +NotifyPersons +NotifySupport +RebootNode +RefreshPeer +ResetPassword +SetPersonPrimarySite +SliceCreate +SliceDelete +SliceExtendedInfo +SliceGetTicket +SliceInfo +SliceListNames +SliceListUserSlices +SliceNodesAdd +SliceNodesDel +SliceNodesList +SliceRenew +SliceTicketGet +SliceUpdate +SliceUserAdd +SliceUserDel +SliceUsersList +system.listMethods +system.methodHelp +system.methodSignature +system.multicall +UpdateAddress +UpdateAddressType +UpdateConfFile +UpdateInitScript +UpdateKey +UpdateMessage +UpdateNodeGroup +UpdateNodeNetwork +UpdateNodeNetworkSetting +UpdateNodeNetworkSettingType +UpdateNode +UpdatePCUProtocolType +UpdatePCU +UpdatePCUType +UpdatePeer +UpdatePerson +UpdateSite +UpdateSliceAttribute +UpdateSliceAttributeType +UpdateSlice +VerifyPerson +""".split() diff --git a/PLC/Methods/system/.cvsignore b/PLC/Methods/system/.cvsignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/PLC/Methods/system/.cvsignore @@ -0,0 +1 @@ +*.pyc diff --git a/PLC/Methods/system/__init__.py b/PLC/Methods/system/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PLC/Methods/system/listMethods.py b/PLC/Methods/system/listMethods.py new file mode 100644 index 0000000..c8cfa37 --- /dev/null +++ b/PLC/Methods/system/listMethods.py @@ -0,0 +1,20 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter +import PLC.Methods + +class listMethods(Method): + """ + This method lists all the methods that the XML-RPC server knows + how to dispatch. + """ + + roles = [] + accepts = [] + returns = Parameter(list, 'List of methods') + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.listMethods" + + def call(self): + return self.api.methods diff --git a/PLC/Methods/system/methodHelp.py b/PLC/Methods/system/methodHelp.py new file mode 100644 index 0000000..22a0dc1 --- /dev/null +++ b/PLC/Methods/system/methodHelp.py @@ -0,0 +1,20 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter + +class methodHelp(Method): + """ + Returns help text if defined for the method passed, otherwise + returns an empty string. + """ + + roles = [] + accepts = [Parameter(str, 'Method name')] + returns = Parameter(str, 'Method help') + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.methodHelp" + + def call(self, method): + function = self.api.callable(method) + return function.help() diff --git a/PLC/Methods/system/methodSignature.py b/PLC/Methods/system/methodSignature.py new file mode 100644 index 0000000..4b049a1 --- /dev/null +++ b/PLC/Methods/system/methodSignature.py @@ -0,0 +1,60 @@ +from PLC.Parameter import Parameter, Mixed +from PLC.Method import Method, xmlrpc_type + +class methodSignature(Method): + """ + Returns an array of known signatures (an array of arrays) for the + method name passed. If no signatures are known, returns a + none-array (test for type != array to detect missing signature). + """ + + roles = [] + accepts = [Parameter(str, "Method name")] + returns = [Parameter([str], "Method signature")] + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.methodSignature" + + def possible_signatures(self, signature, arg): + """ + Return a list of the possible new signatures given a current + signature and the next argument. + """ + + if isinstance(arg, Mixed): + arg_types = [xmlrpc_type(mixed_arg) for mixed_arg in arg] + else: + arg_types = [xmlrpc_type(arg)] + + return [signature + [arg_type] for arg_type in arg_types] + + def signatures(self, returns, args): + """ + Returns a list of possible signatures given a return value and + a set of arguments. + """ + + signatures = [[xmlrpc_type(returns)]] + + for arg in args: + # Create lists of possible new signatures for each current + # signature. Reduce the list of lists back down to a + # single list. + signatures = reduce(lambda a, b: a + b, + [self.possible_signatures(signature, arg) \ + for signature in signatures]) + + return signatures + + def call(self, method): + function = self.api.callable(method) + (min_args, max_args, defaults) = function.args() + + signatures = [] + + assert len(max_args) >= len(min_args) + for num_args in range(len(min_args), len(max_args) + 1): + signatures += self.signatures(function.returns, function.accepts[:num_args]) + + return signatures diff --git a/PLC/Methods/system/multicall.py b/PLC/Methods/system/multicall.py new file mode 100644 index 0000000..64563ef --- /dev/null +++ b/PLC/Methods/system/multicall.py @@ -0,0 +1,54 @@ +import sys +import xmlrpclib + +from PLC.Parameter import Parameter, Mixed +from PLC.Method import Method + +class multicall(Method): + """ + Process an array of calls, and return an array of results. Calls + should be structs of the form + + {'methodName': string, 'params': array} + + Each result will either be a single-item array containg the result + value, or a struct of the form + + {'faultCode': int, 'faultString': string} + + This is useful when you need to make lots of small calls without + lots of round trips. + """ + + roles = [] + accepts = [[{'methodName': Parameter(str, "Method name"), + 'params': Parameter(list, "Method arguments")}]] + returns = Mixed([Mixed()], + {'faultCode': Parameter(int, "XML-RPC fault code"), + 'faultString': Parameter(int, "XML-RPC fault detail")}) + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.multicall" + + def call(self, calls): + # Some error codes, borrowed from xmlrpc-c. + REQUEST_REFUSED_ERROR = -507 + + results = [] + for call in calls: + try: + name = call['methodName'] + params = call['params'] + if name == 'system.multicall': + errmsg = "Recursive system.multicall forbidden" + raise xmlrpclib.Fault(REQUEST_REFUSED_ERROR, errmsg) + result = [self.api.call(self.source, name, *params)] + except xmlrpclib.Fault, fault: + result = {'faultCode': fault.faultCode, + 'faultString': fault.faultString} + except: + errmsg = "%s:%s" % (sys.exc_type, sys.exc_value) + result = {'faultCode': 1, 'faultString': errmsg} + results.append(result) + return results diff --git a/PLC/NetworkMethods.py b/PLC/NetworkMethods.py new file mode 100644 index 0000000..d6b6a63 --- /dev/null +++ b/PLC/NetworkMethods.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the network_methods table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: NetworkMethods.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class NetworkMethod(Row): + """ + Representation of a row in the network_methods table. To use, + instantiate with a dict of values. + """ + + table_name = 'network_methods' + primary_key = 'method' + join_tables = ['nodenetworks'] + fields = { + 'method': Parameter(str, "Network method", max = 20), + } + + def validate_method(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Network method must be specified" + + # Make sure network method does not alredy exist + conflicts = NetworkMethods(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Network method name already in use" + + return name + +class NetworkMethods(Table): + """ + Representation of the network_methods table in the database. + """ + + def __init__(self, api, methods = None): + Table.__init__(self, api, NetworkMethod) + + sql = "SELECT %s FROM network_methods" % \ + ", ".join(NetworkMethod.fields) + + if methods: + sql += " WHERE method IN (%s)" % ", ".join(map(api.db.quote, methods)) + + self.selectall(sql) diff --git a/PLC/NetworkTypes.py b/PLC/NetworkTypes.py new file mode 100644 index 0000000..b42b42e --- /dev/null +++ b/PLC/NetworkTypes.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the network_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: NetworkTypes.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class NetworkType(Row): + """ + Representation of a row in the network_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'network_types' + primary_key = 'type' + join_tables = ['nodenetworks'] + fields = { + 'type': Parameter(str, "Network type", max = 20), + } + + def validate_type(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Network type must be specified" + + # Make sure network type does not alredy exist + conflicts = NetworkTypes(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Network type name already in use" + + return name + +class NetworkTypes(Table): + """ + Representation of the network_types table in the database. + """ + + def __init__(self, api, types = None): + Table.__init__(self, api, NetworkType) + + sql = "SELECT %s FROM network_types" % \ + ", ".join(NetworkType.fields) + + if types: + sql += " WHERE type IN (%s)" % ", ".join(map(api.db.quote, types)) + + self.selectall(sql) diff --git a/PLC/NodeGroups.py b/PLC/NodeGroups.py new file mode 100644 index 0000000..65b4a41 --- /dev/null +++ b/PLC/NodeGroups.py @@ -0,0 +1,182 @@ +# +# Functions for interacting with the nodegroups table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: NodeGroups.py 5666 2007-11-06 21:52:21Z tmack $ +# + +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.Nodes import Node, Nodes + +class NodeGroup(Row): + """ + Representation of a row in the nodegroups table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'nodegroups' + primary_key = 'nodegroup_id' + join_tables = ['nodegroup_node', 'conf_file_nodegroup'] + fields = { + 'nodegroup_id': Parameter(int, "Node group identifier"), + 'name': Parameter(str, "Node group name", max = 50), + 'description': Parameter(str, "Node group description", max = 200, nullok = True), + 'node_ids': Parameter([int], "List of nodes in this node group"), + 'conf_file_ids': Parameter([int], "List of configuration files specific to this node group"), + } + related_fields = { + 'conf_files': [Parameter(int, "ConfFile identifier")], + 'nodes': [Mixed(Parameter(int, "Node identifier"), + Parameter(str, "Fully qualified hostname"))] + } + + def validate_name(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Invalid node group name" + + # Make sure node group does not alredy exist + conflicts = NodeGroups(self.api, [name]) + for nodegroup in conflicts: + if 'nodegroup_id' not in self or self['nodegroup_id'] != nodegroup['nodegroup_id']: + raise PLCInvalidArgument, "Node group name already in use" + + return name + + def add_node(self, node, commit = True): + """ + Add node to existing nodegroup. + """ + + assert 'nodegroup_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + node_id = node['node_id'] + nodegroup_id = self['nodegroup_id'] + + if node_id not in self['node_ids']: + assert nodegroup_id not in node['nodegroup_ids'] + + self.api.db.do("INSERT INTO nodegroup_node (nodegroup_id, node_id)" \ + " VALUES(%(nodegroup_id)d, %(node_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].append(node_id) + node['nodegroup_ids'].append(nodegroup_id) + + def remove_node(self, node, commit = True): + """ + Remove node from existing nodegroup. + """ + + assert 'nodegroup_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + node_id = node['node_id'] + nodegroup_id = self['nodegroup_id'] + + if node_id in self['node_ids']: + assert nodegroup_id in node['nodegroup_ids'] + + self.api.db.do("DELETE FROM nodegroup_node" \ + " WHERE nodegroup_id = %(nodegroup_id)d" \ + " AND node_id = %(node_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].remove(node_id) + node['nodegroup_ids'].remove(nodegroup_id) + + def associate_nodes(self, auth, field, value): + """ + Adds nodes found in value list to this nodegroup (using AddNodeToNodeGroup). + Deletes nodes not found in value list from this slice (using DeleteNodeFromNodeGroup). + """ + + assert 'node_ids' in self + assert 'nodegroup_id' in self + assert isinstance(value, list) + + (node_ids, hostnames) = self.separate_types(value)[0:2] + + # Translate hostnames into node_ids + if hostnames: + nodes = Nodes(self.api, hostnames, ['node_id']).dict('node_id') + node_ids += nodes.keys() + + # Add new ids, remove stale ids + if self['node_ids'] != node_ids: + from PLC.Methods.AddNodeToNodeGroup import AddNodeToNodeGroup + from PLC.Methods.DeleteNodeFromNodeGroup import DeleteNodeFromNodeGroup + new_nodes = set(node_ids).difference(self['node_ids']) + stale_nodes = set(self['node_ids']).difference(node_ids) + + for new_node in new_nodes: + AddNodeToNodeGroup.__call__(AddNodeToNodeGroup(self.api), auth, new_node, self['nodegroup_id']) + for stale_node in stale_nodes: + DeleteNodeFromNodeGroup.__call__(DeleteNodeFromNodeGroup(self.api), auth, stale_node, self['nodegroup_id']) + + def associate_conf_files(self, auth, field, value): + """ + Add conf_files found in value list (AddConfFileToNodeGroup) + Delets conf_files not found in value list (DeleteConfFileFromNodeGroup) + """ + + assert 'conf_file_ids' in self + assert 'nodegroup_id' in self + assert isinstance(value, list) + + conf_file_ids = self.separate_types(value)[0] + + if self['conf_file_ids'] != conf_file_ids: + from PLC.Methods.AddConfFileToNodeGroup import AddConfFileToNodeGroup + from PLC.Methods.DeleteConfFileFromNodeGroup import DeleteConfFileFromNodeGroup + new_conf_files = set(conf_file_ids).difference(self['conf_file_ids']) + stale_conf_files = set(self['conf_file_ids']).difference(conf_file_ids) + + for new_conf_file in new_conf_files: + AddConfFileToNodeGroup.__call__(AddConfFileToNodeGroup(self.api), auth, new_conf_file, self['nodegroup_id']) + for stale_conf_file in stale_conf_files: + DeleteConfFileFromNodeGroup.__call__(DeleteConfFileFromNodeGroup(self.api), auth, stale_conf_file, self['nodegroup_id']) + + +class NodeGroups(Table): + """ + Representation of row(s) from the nodegroups table in the + database. + """ + + def __init__(self, api, nodegroup_filter = None, columns = None): + Table.__init__(self, api, NodeGroup, columns) + + sql = "SELECT %s FROM view_nodegroups WHERE True" % \ + ", ".join(self.columns) + + if nodegroup_filter is not None: + if isinstance(nodegroup_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), nodegroup_filter) + strs = filter(lambda x: isinstance(x, StringTypes), nodegroup_filter) + nodegroup_filter = Filter(NodeGroup.fields, {'nodegroup_id': ints, 'name': strs}) + sql += " AND (%s) %s" % nodegroup_filter.sql(api, "OR") + elif isinstance(nodegroup_filter, dict): + nodegroup_filter = Filter(NodeGroup.fields, nodegroup_filter) + sql += " AND (%s) %s" % nodegroup_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/PLC/NodeNetworkSettingTypes.py b/PLC/NodeNetworkSettingTypes.py new file mode 100644 index 0000000..69f36b7 --- /dev/null +++ b/PLC/NodeNetworkSettingTypes.py @@ -0,0 +1,83 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Roles import Role, Roles + +class NodeNetworkSettingType (Row): + + """ + Representation of a row in the nodenetwork_setting_types table. + """ + + table_name = 'nodenetwork_setting_types' + primary_key = 'nodenetwork_setting_type_id' + join_tables = ['nodenetwork_setting'] + fields = { + 'nodenetwork_setting_type_id': Parameter(int, "Nodenetwork setting type identifier"), + 'name': Parameter(str, "Nodenetwork setting type name", max = 100), + 'description': Parameter(str, "Nodenetwork setting type description", max = 254), + 'category' : Parameter (str, "Nodenetwork setting category", max=64), + 'min_role_id': Parameter(int, "Minimum (least powerful) role that can set or change this attribute"), + } + + # for Cache + class_key = 'name' + foreign_fields = ['category','description','min_role_id'] + foreign_xrefs = [] + + def validate_name(self, name): + if not len(name): + raise PLCInvalidArgument, "nodenetwork setting type name must be set" + + conflicts = NodeNetworkSettingTypes(self.api, [name]) + for setting_type in conflicts: + if 'nodenetwork_setting_type_id' not in self or \ + self['nodenetwork_setting_type_id'] != setting_type['nodenetwork_setting_type_id']: + raise PLCInvalidArgument, "nodenetwork setting type name already in use" + + return name + + def validate_min_role_id(self, role_id): + roles = [row['role_id'] for row in Roles(self.api)] + if role_id not in roles: + raise PLCInvalidArgument, "Invalid role" + + return role_id + +class NodeNetworkSettingTypes(Table): + """ + Representation of row(s) from the nodenetwork_setting_types table + in the database. + """ + + def __init__(self, api, nodenetwork_setting_type_filter = None, columns = None): + Table.__init__(self, api, NodeNetworkSettingType, columns) + + sql = "SELECT %s FROM nodenetwork_setting_types WHERE True" % \ + ", ".join(self.columns) + + if nodenetwork_setting_type_filter is not None: + if isinstance(nodenetwork_setting_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), nodenetwork_setting_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), nodenetwork_setting_type_filter) + nodenetwork_setting_type_filter = Filter(NodeNetworkSettingType.fields, {'nodenetwork_setting_type_id': ints, 'name': strs}) + sql += " AND (%s) %s" % nodenetwork_setting_type_filter.sql(api, "OR") + elif isinstance(nodenetwork_setting_type_filter, dict): + nodenetwork_setting_type_filter = Filter(NodeNetworkSettingType.fields, nodenetwork_setting_type_filter) + sql += " AND (%s) %s" % nodenetwork_setting_type_filter.sql(api, "AND") + elif isinstance (nodenetwork_setting_type_filter, StringTypes): + nodenetwork_setting_type_filter = Filter(NodeNetworkSettingType.fields, {'name':[nodenetwork_setting_type_filter]}) + sql += " AND (%s) %s" % nodenetwork_setting_type_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong nodenetwork setting type filter %r"%nodenetwork_setting_type_filter + + self.selectall(sql) diff --git a/PLC/NodeNetworkSettings.py b/PLC/NodeNetworkSettings.py new file mode 100644 index 0000000..bcf2506 --- /dev/null +++ b/PLC/NodeNetworkSettings.py @@ -0,0 +1,57 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision: 5574 $ +# +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes + +class NodeNetworkSetting(Row): + """ + Representation of a row in the nodenetwork_setting. + To use, instantiate with a dict of values. + """ + + table_name = 'nodenetwork_setting' + primary_key = 'nodenetwork_setting_id' + fields = { + 'nodenetwork_setting_id': Parameter(int, "Nodenetwork setting identifier"), + 'nodenetwork_id': Parameter(int, "NodeNetwork identifier"), + 'nodenetwork_setting_type_id': NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + 'name': NodeNetworkSettingType.fields['name'], + 'description': NodeNetworkSettingType.fields['description'], + 'category': NodeNetworkSettingType.fields['category'], + 'min_role_id': NodeNetworkSettingType.fields['min_role_id'], + 'value': Parameter(str, "Nodenetwork setting value"), + ### relations + + } + +class NodeNetworkSettings(Table): + """ + Representation of row(s) from the nodenetwork_setting table in the + database. + """ + + def __init__(self, api, nodenetwork_setting_filter = None, columns = None): + Table.__init__(self, api, NodeNetworkSetting, columns) + + sql = "SELECT %s FROM view_nodenetwork_settings WHERE True" % \ + ", ".join(self.columns) + + if nodenetwork_setting_filter is not None: + if isinstance(nodenetwork_setting_filter, (list, tuple, set)): + nodenetwork_setting_filter = Filter(NodeNetworkSetting.fields, {'nodenetwork_setting_id': nodenetwork_setting_filter}) + elif isinstance(nodenetwork_setting_filter, dict): + nodenetwork_setting_filter = Filter(NodeNetworkSetting.fields, nodenetwork_setting_filter) + elif isinstance(nodenetwork_setting_filter, int): + nodenetwork_setting_filter = Filter(NodeNetworkSetting.fields, {'nodenetwork_setting_id': [nodenetwork_setting_filter]}) + else: + raise PLCInvalidArgument, "Wrong nodenetwork setting filter %r"%nodenetwork_setting_filter + sql += " AND (%s) %s" % nodenetwork_setting_filter.sql(api) + + + self.selectall(sql) diff --git a/PLC/NodeNetworks.py b/PLC/NodeNetworks.py new file mode 100644 index 0000000..19229e6 --- /dev/null +++ b/PLC/NodeNetworks.py @@ -0,0 +1,226 @@ +# +# Functions for interacting with the nodenetworks table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: NodeNetworks.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from types import StringTypes +import socket +import struct + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +import PLC.Nodes + +def valid_ip(ip): + try: + ip = socket.inet_ntoa(socket.inet_aton(ip)) + return True + except socket.error: + return False + +def in_same_network(address1, address2, netmask): + """ + Returns True if two IPv4 addresses are in the same network. Faults + if an address is invalid. + """ + + address1 = struct.unpack('>L', socket.inet_aton(address1))[0] + address2 = struct.unpack('>L', socket.inet_aton(address2))[0] + netmask = struct.unpack('>L', socket.inet_aton(netmask))[0] + + return (address1 & netmask) == (address2 & netmask) + +class NodeNetwork(Row): + """ + Representation of a row in the nodenetworks table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'nodenetworks' + primary_key = 'nodenetwork_id' + join_tables = ['nodenetwork_setting'] + fields = { + 'nodenetwork_id': Parameter(int, "Node interface identifier"), + 'method': Parameter(str, "Addressing method (e.g., 'static' or 'dhcp')"), + 'type': Parameter(str, "Address type (e.g., 'ipv4')"), + 'ip': Parameter(str, "IP address", nullok = True), + 'mac': Parameter(str, "MAC address", nullok = True), + 'gateway': Parameter(str, "IP address of primary gateway", nullok = True), + 'network': Parameter(str, "Subnet address", nullok = True), + 'broadcast': Parameter(str, "Network broadcast address", nullok = True), + 'netmask': Parameter(str, "Subnet mask", nullok = True), + 'dns1': Parameter(str, "IP address of primary DNS server", nullok = True), + 'dns2': Parameter(str, "IP address of secondary DNS server", nullok = True), + 'bwlimit': Parameter(int, "Bandwidth limit", min = 0, nullok = True), + 'hostname': Parameter(str, "(Optional) Hostname", nullok = True), + 'node_id': Parameter(int, "Node associated with this interface"), + 'is_primary': Parameter(bool, "Is the primary interface for this node"), + 'nodenetwork_setting_ids' : Parameter([int], "List of nodenetwork settings"), + } + + def validate_method(self, method): + network_methods = [row['method'] for row in NetworkMethods(self.api)] + if method not in network_methods: + raise PLCInvalidArgument, "Invalid addressing method %s"%method + return method + + def validate_type(self, type): + network_types = [row['type'] for row in NetworkTypes(self.api)] + if type not in network_types: + raise PLCInvalidArgument, "Invalid address type %s"%type + return type + + def validate_ip(self, ip): + if ip and not valid_ip(ip): + raise PLCInvalidArgument, "Invalid IP address %s"%ip + return ip + + def validate_mac(self, mac): + if not mac: + return mac + + try: + bytes = mac.split(":") + if len(bytes) < 6: + raise Exception + for i, byte in enumerate(bytes): + byte = int(byte, 16) + if byte < 0 or byte > 255: + raise Exception + bytes[i] = "%02x" % byte + mac = ":".join(bytes) + except: + raise PLCInvalidArgument, "Invalid MAC address %s"%mac + + return mac + + validate_gateway = validate_ip + validate_network = validate_ip + validate_broadcast = validate_ip + validate_netmask = validate_ip + validate_dns1 = validate_ip + validate_dns2 = validate_ip + + def validate_bwlimit(self, bwlimit): + if not bwlimit: + return bwlimit + + if bwlimit < 500000: + raise PLCInvalidArgument, 'Minimum bw is 500 kbs' + + return bwlimit + + def validate_hostname(self, hostname): + # Optional + if not hostname: + return hostname + + if not PLC.Nodes.valid_hostname(hostname): + raise PLCInvalidArgument, "Invalid hostname %s"%hostname + + return hostname + + def validate_node_id(self, node_id): + nodes = PLC.Nodes.Nodes(self.api, [node_id]) + if not nodes: + raise PLCInvalidArgument, "No such node %d"%node_id + + return node_id + + def validate_is_primary(self, is_primary): + """ + Set this interface to be the primary one. + """ + + if is_primary: + nodes = PLC.Nodes.Nodes(self.api, [self['node_id']]) + if not nodes: + raise PLCInvalidArgument, "No such node %d"%node_id + node = nodes[0] + + if node['nodenetwork_ids']: + conflicts = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in conflicts: + if ('nodenetwork_id' not in self or \ + self['nodenetwork_id'] != nodenetwork['nodenetwork_id']) and \ + nodenetwork['is_primary']: + raise PLCInvalidArgument, "Can only set one primary interface per node" + + return is_primary + + def validate(self): + """ + Flush changes back to the database. + """ + + # Basic validation + Row.validate(self) + + assert 'method' in self + method = self['method'] + + if method == "proxy" or method == "tap": + if 'mac' in self and self['mac']: + raise PLCInvalidArgument, "For %s method, mac should not be specified" % method + if 'ip' not in self or not self['ip']: + raise PLCInvalidArgument, "For %s method, ip is required" % method + if method == "tap" and ('gateway' not in self or not self['gateway']): + raise PLCInvalidArgument, "For tap method, gateway is required and should be " \ + "the IP address of the node that proxies for this address" + # Should check that the proxy address is reachable, but + # there's no way to tell if the only primary interface is + # DHCP! + + elif method == "static": + for key in ['ip', 'gateway', 'network', 'broadcast', 'netmask', 'dns1']: + if key not in self or not self[key]: + raise PLCInvalidArgument, "For static method, %s is required" % key + globals()[key] = self[key] + if not in_same_network(ip, network, netmask): + raise PLCInvalidArgument, "IP address %s is inconsistent with network %s/%s" % \ + (ip, network, netmask) + if not in_same_network(broadcast, network, netmask): + raise PLCInvalidArgument, "Broadcast address %s is inconsistent with network %s/%s" % \ + (broadcast, network, netmask) + if not in_same_network(ip, gateway, netmask): + raise PLCInvalidArgument, "Gateway %s is not reachable from %s/%s" % \ + (gateway, ip, netmask) + + elif method == "ipmi": + if 'ip' not in self or not self['ip']: + raise PLCInvalidArgument, "For ipmi method, ip is required" + +class NodeNetworks(Table): + """ + Representation of row(s) from the nodenetworks table in the + database. + """ + + def __init__(self, api, nodenetwork_filter = None, columns = None): + Table.__init__(self, api, NodeNetwork, columns) + + sql = "SELECT %s FROM view_nodenetworks WHERE True" % \ + ", ".join(self.columns) + + if nodenetwork_filter is not None: + if isinstance(nodenetwork_filter, (list, tuple, set)): + nodenetwork_filter = Filter(NodeNetwork.fields, {'nodenetwork_id': nodenetwork_filter}) + elif isinstance(nodenetwork_filter, dict): + nodenetwork_filter = Filter(NodeNetwork.fields, nodenetwork_filter) + elif isinstance(nodenetwork_filter, int): + nodenetwork_filter = Filter(NodeNetwork.fields, {'nodenetwork_id': [nodenetwork_filter]}) + else: + raise PLCInvalidArgument, "Wrong node network filter %r"%nodenetwork_filter + sql += " AND (%s) %s" % nodenetwork_filter.sql(api) + + self.selectall(sql) diff --git a/PLC/Nodes.py b/PLC/Nodes.py new file mode 100644 index 0000000..ac7b126 --- /dev/null +++ b/PLC/Nodes.py @@ -0,0 +1,326 @@ +# +# Functions for interacting with the nodes table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Nodes.py 5654 2007-11-06 03:43:55Z tmack $ +# + +from types import StringTypes +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.BootStates import BootStates + +def valid_hostname(hostname): + # 1. Each part begins and ends with a letter or number. + # 2. Each part except the last can contain letters, numbers, or hyphens. + # 3. Each part is between 1 and 64 characters, including the trailing dot. + # 4. At least two parts. + # 5. Last part can only contain between 2 and 6 letters. + good_hostname = r'^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+' \ + r'[a-z]{2,6}$' + return hostname and \ + re.match(good_hostname, hostname, re.IGNORECASE) + +class Node(Row): + """ + Representation of a row in the nodes table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'nodes' + primary_key = 'node_id' + # Thierry -- we use delete on nodenetworks so the related NodeNetworkSettings get deleted too + join_tables = ['nodegroup_node', 'conf_file_node', 'pcu_node', 'slice_node', 'slice_attribute', 'node_session', 'peer_node','node_slice_whitelist'] + fields = { + 'node_id': Parameter(int, "Node identifier"), + 'hostname': Parameter(str, "Fully qualified hostname", max = 255), + 'site_id': Parameter(int, "Site at which this node is located"), + 'boot_state': Parameter(str, "Boot state", max = 20), + 'model': Parameter(str, "Make and model of the actual machine", max = 255, nullok = True), + 'boot_nonce': Parameter(str, "(Admin only) Random value generated by the node at last boot", max = 128), + 'version': Parameter(str, "Apparent Boot CD version", max = 64), + 'ssh_rsa_key': Parameter(str, "Last known SSH host key", max = 1024), + 'date_created': Parameter(int, "Date and time when node entry was created", ro = True), + 'last_updated': Parameter(int, "Date and time when node entry was created", ro = True), + 'last_contact': Parameter(int, "Date and time when node last contacted plc", ro = True), + 'key': Parameter(str, "(Admin only) Node key", max = 256), + 'session': Parameter(str, "(Admin only) Node session value", max = 256, ro = True), + 'nodenetwork_ids': Parameter([int], "List of network interfaces that this node has"), + 'nodegroup_ids': Parameter([int], "List of node groups that this node is in"), + 'conf_file_ids': Parameter([int], "List of configuration files specific to this node"), + # 'root_person_ids': Parameter([int], "(Admin only) List of people who have root access to this node"), + 'slice_ids': Parameter([int], "List of slices on this node"), + 'slice_ids_whitelist': Parameter([int], "List of slices allowed on this node"), + 'pcu_ids': Parameter([int], "List of PCUs that control this node"), + 'ports': Parameter([int], "List of PCU ports that this node is connected to"), + 'peer_id': Parameter(int, "Peer to which this node belongs", nullok = True), + 'peer_node_id': Parameter(int, "Foreign node identifier at peer", nullok = True), + } + related_fields = { + 'nodenetworks': [Mixed(Parameter(int, "NodeNetwork identifier"), + Filter(NodeNetwork.fields))], + 'nodegroups': [Mixed(Parameter(int, "NodeGroup identifier"), + Parameter(str, "NodeGroup name"))], + 'conf_files': [Parameter(int, "ConfFile identifier")], + 'slices': [Mixed(Parameter(int, "Slice identifier"), + Parameter(str, "Slice name"))], + 'slices_whitelist': [Mixed(Parameter(int, "Slice identifier"), + Parameter(str, "Slice name"))] + } + # for Cache + class_key = 'hostname' + foreign_fields = ['boot_state','model','version'] + # forget about these ones, they are read-only anyway + # handling them causes Cache to re-sync all over again + # 'date_created','last_updated' + foreign_xrefs = [ + # in this case, we dont need the 'table' but Cache will look it up, so... + {'field' : 'site_id' , 'class' : 'Site' , 'table' : 'unused-on-direct-refs' } , + ] + + def validate_hostname(self, hostname): + if not valid_hostname(hostname): + raise PLCInvalidArgument, "Invalid hostname" + + conflicts = Nodes(self.api, [hostname]) + for node in conflicts: + if 'node_id' not in self or self['node_id'] != node['node_id']: + raise PLCInvalidArgument, "Hostname already in use" + + return hostname + + def validate_boot_state(self, boot_state): + boot_states = [row['boot_state'] for row in BootStates(self.api)] + if boot_state not in boot_states: + raise PLCInvalidArgument, "Invalid boot state" + + return boot_state + + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp + validate_last_contact = Row.validate_timestamp + + def update_last_contact(self, commit = True): + """ + Update last_contact field with current time + """ + + assert 'node_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_contact = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where node_id = %d" % ( self['node_id']) ) + self.sync(commit) + + + def update_last_updated(self, commit = True): + """ + Update last_updated field with current time + """ + + assert 'node_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_updated = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where node_id = %d" % (self['node_id']) ) + self.sync(commit) + + def associate_nodenetworks(self, auth, field, value): + """ + Delete nodenetworks not found in value list (using DeleteNodeNetwor)k + Add nodenetworks found in value list (using AddNodeNetwork) + Updates nodenetworks found w/ nodenetwork_id in value list (using UpdateNodeNetwork) + """ + + assert 'nodenetworkp_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + (nodenetwork_ids, blank, nodenetworks) = self.separate_types(value) + + if self['nodenetwork_ids'] != nodenetwork_ids: + from PLC.Methods.DeleteNodeNetwork import DeleteNodeNetwork + + stale_nodenetworks = set(self['nodenetwork_ids']).difference(nodenetwork_ids) + + for stale_nodenetwork in stale_nodenetworks: + DeleteNodeNetwork.__call__(DeleteNodeNetwork(self.api), auth, stale_nodenetwork['nodenetwork_id']) + + def associate_nodegroups(self, auth, field, value): + """ + Add node to nodegroups found in value list (AddNodeToNodegroup) + Delete node from nodegroup not found in value list (DeleteNodeFromNodegroup) + """ + + from PLC.NodeGroups import NodeGroups + + assert 'nodegroup_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + (nodegroup_ids, nodegroup_names) = self.separate_types(value)[0:2] + + if nodegroup_names: + nodegroups = NodeGroups(self.api, nodegroup_names, ['nodegroup_id']).dict('nodegroup_id') + nodegroup_ids += nodegroups.keys() + + if self['nodegroup_ids'] != nodegroup_ids: + from PLC.Methods.AddNodeToNodeGroup import AddNodeToNodeGroup + from PLC.Methods.DeleteNodeFromNodeGroup import DeleteNodeFromNodeGroup + + new_nodegroups = set(nodegroup_ids).difference(self['nodegroup_ids']) + stale_nodegroups = set(self['nodegroup_ids']).difference(nodegroup_ids) + + for new_nodegroup in new_nodegroups: + AddNodeToNodeGroup.__call__(AddNodeToNodeGroup(self.api), auth, self['node_id'], new_nodegroup) + for stale_nodegroup in stale_nodegroups: + DeleteNodeFromNodeGroup.__call__(DeleteNodeFromNodeGroup(self.api), auth, self['node_id'], stale_nodegroup) + + + + def associate_conf_files(self, auth, field, value): + """ + Add conf_files found in value list (AddConfFileToNode) + Delets conf_files not found in value list (DeleteConfFileFromNode) + """ + + assert 'conf_file_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + conf_file_ids = self.separate_types(value)[0] + + if self['conf_file_ids'] != conf_file_ids: + from PLC.Methods.AddConfFileToNode import AddConfFileToNode + from PLC.Methods.DeleteConfFileFromNode import DeleteConfFileFromNode + new_conf_files = set(conf_file_ids).difference(self['conf_file_ids']) + stale_conf_files = set(self['conf_file_ids']).difference(conf_file_ids) + + for new_conf_file in new_conf_files: + AddConfFileToNode.__call__(AddConfFileToNode(self.api), auth, new_conf_file, self['node_id']) + for stale_conf_file in stale_conf_files: + DeleteConfFileFromNode.__call__(DeleteConfFileFromNode(self.api), auth, stale_conf_file, self['node_id']) + + + def associate_slices(self, auth, field, value): + """ + Add slices found in value list to (AddSliceToNode) + Delete slices not found in value list (DeleteSliceFromNode) + """ + + from PLC.Slices import Slices + + assert 'slice_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + (slice_ids, slice_names) = self.separate_types(value)[0:2] + + if slice_names: + slices = Slices(self.api, slice_names, ['slice_id']).dict('slice_id') + slice_ids += slices.keys() + + if self['slice_ids'] != slice_ids: + from PLC.Methods.AddSliceToNodes import AddSliceToNodes + from PLC.Methods.DeleteSliceFromNodes import DeleteSliceFromNodes + new_slices = set(slice_ids).difference(self['slice_ids']) + stale_slices = set(self['slice_ids']).difference(slice_ids) + + for new_slice in new_slices: + AddSliceToNodes.__call__(AddSliceToNodes(self.api), auth, new_slice, [self['node_id']]) + for stale_slice in stale_slices: + DeleteSliceFromNodes.__call__(DeleteSliceFromNodes(self.api), auth, stale_slice, [self['node_id']]) + + def associate_slices_whitelist(self, auth, field, value): + """ + Add slices found in value list to whitelist (AddSliceToNodesWhitelist) + Delete slices not found in value list from whitelist (DeleteSliceFromNodesWhitelist) + """ + + from PLC.Slices import Slices + + assert 'slice_ids_whitelist' in self + assert 'node_id' in self + assert isinstance(value, list) + + (slice_ids, slice_names) = self.separate_types(value)[0:2] + + if slice_names: + slices = Slices(self.api, slice_names, ['slice_id']).dict('slice_id') + slice_ids += slices.keys() + + if self['slice_ids_whitelist'] != slice_ids: + from PLC.Methods.AddSliceToNodesWhitelist import AddSliceToNodesWhitelist + from PLC.Methods.DeleteSliceFromNodesWhitelist import DeleteSliceFromNodesWhitelist + new_slices = set(slice_ids).difference(self['slice_ids_whitelist']) + stale_slices = set(self['slice_ids_whitelist']).difference(slice_ids) + + for new_slice in new_slices: + AddSliceToNodesWhitelist.__call__(AddSliceToNodesWhitelist(self.api), auth, new_slice, [self['node_id']]) + for stale_slice in stale_slices: + DeleteSliceFromNodesWhitelist.__call__(DeleteSliceFromNodesWhitelist(self.api), auth, stale_slice, [self['node_id']]) + + + def delete(self, commit = True): + """ + Delete existing node. + """ + + assert 'node_id' in self + assert 'nodenetwork_ids' in self + + # we need to clean up NodeNetworkSettings, so handling nodenetworks as part of join_tables does not work + for nodenetwork in NodeNetworks(self.api,self['nodenetwork_ids']): + nodenetwork.delete() + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE node_id = %d" % \ + (table, self['node_id'])) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + + +class Nodes(Table): + """ + Representation of row(s) from the nodes table in the + database. + """ + + def __init__(self, api, node_filter = None, columns = None): + Table.__init__(self, api, Node, columns) + + sql = "SELECT %s FROM view_nodes WHERE deleted IS False" % \ + ", ".join(self.columns) + + if node_filter is not None: + if isinstance(node_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), node_filter) + strs = filter(lambda x: isinstance(x, StringTypes), node_filter) + node_filter = Filter(Node.fields, {'node_id': ints, 'hostname': strs}) + sql += " AND (%s) %s" % node_filter.sql(api, "OR") + elif isinstance(node_filter, dict): + node_filter = Filter(Node.fields, node_filter) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + elif isinstance (node_filter, StringTypes): + node_filter = Filter(Node.fields, {'hostname':[node_filter]}) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + elif isinstance (node_filter, int): + node_filter = Filter(Node.fields, {'node_id':[node_filter]}) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong node filter %r"%node_filter + + self.selectall(sql) diff --git a/PLC/PCUProtocolTypes.py b/PLC/PCUProtocolTypes.py new file mode 100644 index 0000000..9475d31 --- /dev/null +++ b/PLC/PCUProtocolTypes.py @@ -0,0 +1,75 @@ +# +# Functions for interacting with the pcu_type_port table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter + +class PCUProtocolType(Row): + """ + Representation of a row in the pcu_protocol_type table. To use, + instantiate with a dict of values. + """ + + table_name = 'pcu_protocol_type' + primary_key = 'pcu_protocol_type_id' + join_tables = [] + fields = { + 'pcu_protocol_type_id': Parameter(int, "PCU protocol type identifier"), + 'pcu_type_id': Parameter(int, "PCU type identifier"), + 'port': Parameter(int, "PCU port"), + 'protocol': Parameter(str, "Protocol"), + 'supported': Parameter(bool, "Is the port/protocol supported by PLC") + } + + def validate_port(self, port): + # make sure port is not blank + + if not port: + raise PLCInvalidArgument, "Port must be specified" + + return port + + def validate_protocol(self, protocol): + # make sure port is not blank + if not len(protocol): + raise PLCInvalidArgument, "protocol must be specified" + + return protocol + +class PCUProtocolTypes(Table): + """ + Representation of the pcu_protocol_types table in the database. + """ + + def __init__(self, api, protocol_type_filter = None, columns = None): + Table.__init__(self, api, PCUProtocolType, columns) + + sql = "SELECT %s FROM pcu_protocol_type WHERE True" % \ + ", ".join(self.columns) + + if protocol_type_filter is not None: + if isinstance(protocol_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), protocol_type_filter) + protocol_type_filter = Filter(PCUProtocolType.fields, {'pcu_protocol_type_id': ints}) + sql += " AND (%s) %s" % protocol_type_filter.sql(api, "OR") + elif isinstance(protocol_type_filter, dict): + protocol_type_filter = Filter(PCUProtocolType.fields, protocol_type_filter) + sql += " AND (%s) %s" % protocol_type_filter.sql(api, "AND") + elif isinstance (protocol_type_filter, int): + protocol_type_filter = Filter(PCUProtocolType.fields, {'pcu_protocol_type_id':[protocol_type_filter]}) + + sql += " AND (%s) %s" % protocol_type_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong pcu_protocol_type filter %r"%protocol_type_filter + + + self.selectall(sql) diff --git a/PLC/PCUTypes.py b/PLC/PCUTypes.py new file mode 100644 index 0000000..d1f650c --- /dev/null +++ b/PLC/PCUTypes.py @@ -0,0 +1,104 @@ +# +# Functions for interacting with the pcu_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: +# +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter + +class PCUType(Row): + """ + Representation of a row in the pcu_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'pcu_types' + primary_key = 'pcu_type_id' + join_tables = ['pcu_port_type'] + fields = { + 'pcu_type_id': Parameter(int, "PCU Type Identifier"), + 'model': Parameter(str, "PCU model", max = 254), + 'name': Parameter(str, "PCU full name", max = 254), + 'pcu_protocol_type_ids': Parameter([int], "PCU Protocol Type Identifiers"), + 'pcu_protocol_types': Parameter([dict], "PCU Protocol Type List") + } + + def validate_model(self, model): + # Make sure name is not blank + if not len(model): + raise PLCInvalidArgument, "Model must be specified" + + # Make sure boot state does not alredy exist + conflicts = PCUTypes(self.api, [model]) + for pcu_type in conflicts: + if 'pcu_type_id' not in self or self['pcu_type_id'] != pcu_type['pcu_type_id']: + raise PLCInvalidArgument, "Model already in use" + + return model + +class PCUTypes(Table): + """ + Representation of the pcu_types table in the database. + """ + + def __init__(self, api, pcu_type_filter = None, columns = None): + + # Remove pcu_protocol_types from query since its not really a field + # in the db. We will add it later + if columns == None: + columns = PCUType.fields.keys() + if 'pcu_protocol_types' in columns: + removed_fields = ['pcu_protocol_types'] + columns.remove('pcu_protocol_types') + else: + removed_fields = [] + + Table.__init__(self, api, PCUType, columns) + + sql = "SELECT %s FROM view_pcu_types WHERE True" % \ + ", ".join(self.columns) + + if pcu_type_filter is not None: + if isinstance(pcu_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), pcu_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), pcu_type_filter) + pcu_type_filter = Filter(PCUType.fields, {'pcu_type_id': ints, 'model': strs}) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "OR") + elif isinstance(pcu_type_filter, dict): + pcu_type_filter = Filter(PCUType.fields, pcu_type_filter) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "AND") + elif isinstance (pcu_type_filter, StringTypes): + pcu_type_filter = Filter(PCUType.fields, {'model':[pcu_type_filter]}) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "AND") + elif isinstance (pcu_type_filter, int): + pcu_type_filter = Filter(PCUType.fields, {'pcu_type_id':[pcu_type_filter]}) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong pcu_type filter %r"%pcu_type_filter + + + self.selectall(sql) + + # return a list of protocol type objects for each port type + if 'pcu_protocol_types' in removed_fields: + from PLC.PCUProtocolTypes import PCUProtocolTypes + protocol_type_ids = set() + for pcu_type in self: + protocol_type_ids.update(pcu_type['pcu_protocol_type_ids']) + + protocol_return_fields = ['pcu_protocol_type_id', 'port', 'protocol', 'supported'] + all_protocol_types = PCUProtocolTypes(self.api, list(protocol_type_ids), \ + protocol_return_fields).dict('pcu_protocol_type_id') + + for pcu_type in self: + pcu_type['pcu_protocol_types'] = [] + for protocol_type_id in pcu_type['pcu_protocol_type_ids']: + pcu_type['pcu_protocol_types'].append(all_protocol_types[protocol_type_id]) diff --git a/PLC/PCUs.py b/PLC/PCUs.py new file mode 100644 index 0000000..0ab56cc --- /dev/null +++ b/PLC/PCUs.py @@ -0,0 +1,116 @@ +# +# Functions for interacting with the pcus table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: PCUs.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.NodeNetworks import valid_ip, NodeNetwork, NodeNetworks +from PLC.Nodes import Node, Nodes + +class PCU(Row): + """ + Representation of a row in the pcus table. To use, + instantiate with a dict of values. + """ + + table_name = 'pcus' + primary_key = 'pcu_id' + join_tables = ['pcu_node'] + fields = { + 'pcu_id': Parameter(int, "PCU identifier"), + 'site_id': Parameter(int, "Identifier of site where PCU is located"), + 'hostname': Parameter(str, "PCU hostname", max = 254), + 'ip': Parameter(str, "PCU IP address", max = 254), + 'protocol': Parameter(str, "PCU protocol, e.g. ssh, https, telnet", max = 16, nullok = True), + 'username': Parameter(str, "PCU username", max = 254, nullok = True), + 'password': Parameter(str, "PCU username", max = 254, nullok = True), + 'notes': Parameter(str, "Miscellaneous notes", max = 254, nullok = True), + 'model': Parameter(str, "PCU model string", max = 32, nullok = True), + 'node_ids': Parameter([int], "List of nodes that this PCU controls"), + 'ports': Parameter([int], "List of the port numbers that each node is connected to"), + } + + def validate_ip(self, ip): + if not valid_ip(ip): + raise PLCInvalidArgument, "Invalid IP address " + ip + return ip + + def add_node(self, node, port, commit = True): + """ + Add node to existing PCU. + """ + + assert 'pcu_id' in self + assert isinstance(node, Node) + assert isinstance(port, (int, long)) + assert 'node_id' in node + + pcu_id = self['pcu_id'] + node_id = node['node_id'] + + if node_id not in self['node_ids'] and port not in self['ports']: + self.api.db.do("INSERT INTO pcu_node (pcu_id, node_id, port)" \ + " VALUES(%(pcu_id)d, %(node_id)d, %(port)d)", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].append(node_id) + self['ports'].append(port) + + def remove_node(self, node, commit = True): + """ + Remove node from existing PCU. + """ + + assert 'pcu_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + pcu_id = self['pcu_id'] + node_id = node['node_id'] + + if node_id in self['node_ids']: + i = self['node_ids'].index(node_id) + port = self['ports'][i] + + self.api.db.do("DELETE FROM pcu_node" \ + " WHERE pcu_id = %(pcu_id)d" \ + " AND node_id = %(node_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].remove(node_id) + self['ports'].remove(port) + +class PCUs(Table): + """ + Representation of row(s) from the pcus table in the + database. + """ + + def __init__(self, api, pcu_filter = None, columns = None): + Table.__init__(self, api, PCU, columns) + + sql = "SELECT %s FROM view_pcus WHERE True" % \ + ", ".join(self.columns) + + if pcu_filter is not None: + if isinstance(pcu_filter, (list, tuple, set)): + pcu_filter = Filter(PCU.fields, {'pcu_id': pcu_filter}) + elif isinstance(pcu_filter, dict): + pcu_filter = Filter(PCU.fields, pcu_filter) + sql += " AND (%s) %s" % pcu_filter.sql(api) + + self.selectall(sql) diff --git a/PLC/POD.py b/PLC/POD.py new file mode 100644 index 0000000..01a7ddd --- /dev/null +++ b/PLC/POD.py @@ -0,0 +1,90 @@ +# Marc E. Fiuczynski +# Copyright (C) 2004 The Trustees of Princeton University +# +# Client ping of death program for both udp & icmp +# +# modified for inclusion by api by Aaron K + +import struct +import os +import array +import getopt +from socket import * + +UPOD_PORT = 664 + +def _in_cksum(packet): + """THE RFC792 states: 'The 16 bit one's complement of + the one's complement sum of all 16 bit words in the header.' + Generates a checksum of a (ICMP) packet. Based on in_chksum found + in ping.c on FreeBSD. + """ + + # add byte if not dividable by 2 + if len(packet) & 1: + packet = packet + '\0' + + # split into 16-bit word and insert into a binary array + words = array.array('h', packet) + sum = 0 + + # perform ones complement arithmetic on 16-bit words + for word in words: + sum += (word & 0xffff) + + hi = sum >> 16 + lo = sum & 0xffff + sum = hi + lo + sum = sum + (sum >> 16) + + return (~sum) & 0xffff # return ones complement + +def _construct(id, data): + """Constructs a ICMP IPOD packet + """ + ICMP_TYPE = 6 # ping of death code used by PLK + ICMP_CODE = 0 + ICMP_CHECKSUM = 0 + ICMP_ID = 0 + ICMP_SEQ_NR = 0 + + header = struct.pack('bbHHh', ICMP_TYPE, ICMP_CODE, ICMP_CHECKSUM, \ + ICMP_ID, ICMP_SEQ_NR+id) + + packet = header + data # ping packet without checksum + checksum = _in_cksum(packet) # make checksum + + # construct header with correct checksum + header = struct.pack('bbHHh', ICMP_TYPE, ICMP_CODE, checksum, ICMP_ID, \ + ICMP_SEQ_NR+id) + + # ping packet *with* checksum + packet = header + data + + # a perfectly formatted ICMP echo packet + return packet + +def icmp_pod(host,key): + uid = os.getuid() + if uid <> 0: + print "must be root to send icmp pod" + return + + s = socket(AF_INET, SOCK_RAW, getprotobyname("icmp")) + packet = _construct(0, key) # make a ping packet + addr = (host,1) + print 'pod sending icmp-based reboot request to %s' % host + for i in range(1,10): + s.sendto(packet, addr) + +def udp_pod(host,key,fromaddr=('', 0)): + addr = host, UPOD_PORT + s = socket(AF_INET, SOCK_DGRAM) + s.bind(fromaddr) + packet = key + print 'pod sending udp-based reboot request to %s' % host + for i in range(1,10): + s.sendto(packet, addr) + +def noop_pod(host,key): + pass diff --git a/PLC/Parameter.py b/PLC/Parameter.py new file mode 100644 index 0000000..474ad78 --- /dev/null +++ b/PLC/Parameter.py @@ -0,0 +1,105 @@ +# +# Shared type definitions +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Parameter.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from types import * +from PLC.Faults import * + +class Parameter: + """ + Typed value wrapper. Use in accepts and returns to document method + parameters. Set the optional and default attributes for + sub-parameters (i.e., dict fields). + """ + + def __init__(self, type, doc = "", + min = None, max = None, + optional = None, + ro = False, + nullok = False): + # Basic type of the parameter. Must be a builtin type + # that can be marshalled by XML-RPC. + self.type = type + + # Documentation string for the parameter + self.doc = doc + + # Basic value checking. For numeric types, the minimum and + # maximum possible values, inclusive. For string types, the + # minimum and maximum possible UTF-8 encoded byte lengths. + self.min = min + self.max = max + + # Whether the sub-parameter is optional or not. If None, + # unknown whether it is optional. + self.optional = optional + + # Whether the DB field is read-only. + self.ro = ro + + # Whether the DB field can be NULL. + self.nullok = nullok + + def type(self): + return self.type + + def __repr__(self): + return repr(self.type) + +class Mixed(tuple): + """ + A list (technically, a tuple) of types. Use in accepts and returns + to document method parameters that may return mixed types. + """ + + def __new__(cls, *types): + return tuple.__new__(cls, types) + + +def python_type(arg): + """ + Returns the Python type of the specified argument, which may be a + Python type, a typed value, or a Parameter. + """ + + if isinstance(arg, Parameter): + arg = arg.type + + if isinstance(arg, type): + return arg + else: + return type(arg) + +def xmlrpc_type(arg): + """ + Returns the XML-RPC type of the specified argument, which may be a + Python type, a typed value, or a Parameter. + """ + + arg_type = python_type(arg) + + if arg_type == NoneType: + return "nil" + elif arg_type == IntType or arg_type == LongType: + return "int" + elif arg_type == bool: + return "boolean" + elif arg_type == FloatType: + return "double" + elif arg_type in StringTypes: + return "string" + elif arg_type == ListType or arg_type == TupleType: + return "array" + elif arg_type == DictType: + return "struct" + elif arg_type == Mixed: + # Not really an XML-RPC type but return "mixed" for + # documentation purposes. + return "mixed" + else: + raise PLCAPIError, "XML-RPC cannot marshal %s objects" % arg_type diff --git a/PLC/Peers.py b/PLC/Peers.py new file mode 100644 index 0000000..0973c3d --- /dev/null +++ b/PLC/Peers.py @@ -0,0 +1,235 @@ +# +# Thierry Parmentelat - INRIA +# + +import re +from types import StringTypes +from urlparse import urlparse + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Table import Row, Table +import PLC.Auth + +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Nodes import Node, Nodes +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices + +class Peer(Row): + """ + Stores the list of peering PLCs in the peers table. + See the Row class for more details + """ + + table_name = 'peers' + primary_key = 'peer_id' + join_tables = ['peer_site', 'peer_person', 'peer_key', 'peer_node', + 'peer_slice_attribute_type', 'peer_slice_attribute', 'peer_slice'] + fields = { + 'peer_id': Parameter (int, "Peer identifier"), + 'peername': Parameter (str, "Peer name"), + 'peer_url': Parameter (str, "Peer API URL"), + 'key': Parameter(str, "Peer GPG public key"), + 'cacert': Parameter(str, "Peer SSL public certificate"), + ### cross refs + 'site_ids': Parameter([int], "List of sites for which this peer is authoritative"), + 'person_ids': Parameter([int], "List of users for which this peer is authoritative"), + 'key_ids': Parameter([int], "List of keys for which this peer is authoritative"), + 'node_ids': Parameter([int], "List of nodes for which this peer is authoritative"), + 'slice_ids': Parameter([int], "List of slices for which this peer is authoritative"), + } + + def validate_peername(self, peername): + if not len(peername): + raise PLCInvalidArgument, "Peer name must be specified" + + conflicts = Peers(self.api, [peername]) + for peer in conflicts: + if 'peer_id' not in self or self['peer_id'] != peer['peer_id']: + raise PLCInvalidArgument, "Peer name already in use" + + return peername + + def validate_peer_url(self, url): + """ + Validate URL. Must be HTTPS. + """ + + (scheme, netloc, path, params, query, fragment) = urlparse(url) + if scheme != "https": + raise PLCInvalidArgument, "Peer URL scheme must be https" + + return url + + def delete(self, commit = True): + """ + Deletes this peer and all related entities. + """ + + assert 'peer_id' in self + + # Remove all related entities + for obj in \ + Slices(self.api, self['slice_ids']) + \ + Keys(self.api, self['key_ids']) + \ + Persons(self.api, self['person_ids']) + \ + Nodes(self.api, self['node_ids']) + \ + Sites(self.api, self['site_ids']): + assert obj['peer_id'] == self['peer_id'] + obj.delete(commit = False) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + + def add_site(self, site, peer_site_id, commit = True): + """ + Associate a local site entry with this peer. + """ + + add = Row.add_object(Site, 'peer_site') + add(self, site, + {'peer_id': self['peer_id'], + 'site_id': site['site_id'], + 'peer_site_id': peer_site_id}, + commit = commit) + + def add_person(self, person, peer_person_id, commit = True): + """ + Associate a local user entry with this peer. + """ + + add = Row.add_object(Person, 'peer_person') + add(self, person, + {'peer_id': self['peer_id'], + 'person_id': person['person_id'], + 'peer_person_id': peer_person_id}, + commit = commit) + + def add_key(self, key, peer_key_id, commit = True): + """ + Associate a local key entry with this peer. + """ + + add = Row.add_object(Key, 'peer_key') + add(self, key, + {'peer_id': self['peer_id'], + 'key_id': key['key_id'], + 'peer_key_id': peer_key_id}, + commit = commit) + + def add_node(self, node, peer_node_id, commit = True): + """ + Associate a local node entry with this peer. + """ + + add = Row.add_object(Node, 'peer_node') + add(self, node, + {'peer_id': self['peer_id'], + 'node_id': node['node_id'], + 'peer_node_id': peer_node_id}, + commit = commit) + + def add_slice(self, slice, peer_slice_id, commit = True): + """ + Associate a local slice entry with this peer. + """ + + add = Row.add_object(Slice, 'peer_slice') + add(self, slice, + {'peer_id': self['peer_id'], + 'slice_id': slice['slice_id'], + 'peer_slice_id': peer_slice_id}, + commit = commit) + + def connect(self, **kwds): + """ + Connect to this peer via XML-RPC. + """ + + import xmlrpclib + from PLC.PyCurl import PyCurlTransport + self.server = xmlrpclib.ServerProxy(self['peer_url'], + PyCurlTransport(self['peer_url'], self['cacert']), + allow_none = 1, **kwds) + + def add_auth(self, function, methodname, **kwds): + """ + Sign the specified XML-RPC call and add an auth struct as the + first argument of the call. + """ + + def wrapper(*args, **kwds): + from PLC.GPG import gpg_sign + signature = gpg_sign(args, + self.api.config.PLC_ROOT_GPG_KEY, + self.api.config.PLC_ROOT_GPG_KEY_PUB, + methodname) + + auth = {'AuthMethod': "gpg", + 'name': self.api.config.PLC_NAME, + 'signature': signature} + + # Automagically add auth struct to every call + args = (auth,) + args + + return function(*args) + + return wrapper + + def __getattr__(self, attr): + """ + Returns a callable API function if attr is the name of a + PLCAPI function; otherwise, returns the specified attribute. + """ + + try: + # Figure out if the specified attribute is the name of a + # PLCAPI function. If so and the function requires an + # authentication structure as its first argument, return a + # callable that automagically adds an auth struct to the + # call. + methodname = attr + api_function = self.api.callable(methodname) + if api_function.accepts and \ + (isinstance(api_function.accepts[0], PLC.Auth.Auth) or \ + (isinstance(api_function.accepts[0], Mixed) and \ + filter(lambda param: isinstance(param, Auth), api_function.accepts[0]))): + function = getattr(self.server, methodname) + return self.add_auth(function, methodname) + except Exception, err: + pass + + if hasattr(self, attr): + return getattr(self, attr) + else: + raise AttributeError, "type object 'Peer' has no attribute '%s'" % attr + +class Peers (Table): + """ + Maps to the peers table in the database + """ + + def __init__ (self, api, peer_filter = None, columns = None): + Table.__init__(self, api, Peer, columns) + + sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \ + ", ".join(self.columns) + + if peer_filter is not None: + if isinstance(peer_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), peer_filter) + strs = filter(lambda x: isinstance(x, StringTypes), peer_filter) + peer_filter = Filter(Peer.fields, {'peer_id': ints, 'peername': strs}) + sql += " AND (%s) %s" % peer_filter.sql(api, "OR") + elif isinstance(peer_filter, dict): + peer_filter = Filter(Peer.fields, peer_filter) + sql += " AND (%s) %s" % peer_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/PLC/Persons.py b/PLC/Persons.py new file mode 100644 index 0000000..d2bb510 --- /dev/null +++ b/PLC/Persons.py @@ -0,0 +1,501 @@ +# +# Functions for interacting with the persons table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Persons.py 5652 2007-11-06 03:42:57Z tmack $ +# + +from types import StringTypes +from datetime import datetime +import md5 +import time +from random import Random +import re +import crypt + +from PLC.Faults import * +from PLC.Debug import log +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Roles import Role, Roles +from PLC.Keys import Key, Keys +from PLC.Messages import Message, Messages + +class Person(Row): + """ + Representation of a row in the persons table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'persons' + primary_key = 'person_id' + join_tables = ['person_key', 'person_role', 'person_site', 'slice_person', 'person_session', 'peer_person'] + fields = { + 'person_id': Parameter(int, "User identifier"), + 'first_name': Parameter(str, "Given name", max = 128), + 'last_name': Parameter(str, "Surname", max = 128), + 'title': Parameter(str, "Title", max = 128, nullok = True), + 'email': Parameter(str, "Primary e-mail address", max = 254), + 'phone': Parameter(str, "Telephone number", max = 64, nullok = True), + 'url': Parameter(str, "Home page", max = 254, nullok = True), + 'bio': Parameter(str, "Biography", max = 254, nullok = True), + 'enabled': Parameter(bool, "Has been enabled"), + 'password': Parameter(str, "Account password in crypt() form", max = 254), + 'verification_key': Parameter(str, "Reset password key", max = 254, nullok = True), + 'verification_expires': Parameter(int, "Date and time when verification_key expires", nullok = True), + 'last_updated': Parameter(int, "Date and time of last update", ro = True), + 'date_created': Parameter(int, "Date and time when account was created", ro = True), + 'role_ids': Parameter([int], "List of role identifiers"), + 'roles': Parameter([str], "List of roles"), + 'site_ids': Parameter([int], "List of site identifiers"), + 'key_ids': Parameter([int], "List of key identifiers"), + 'slice_ids': Parameter([int], "List of slice identifiers"), + 'peer_id': Parameter(int, "Peer to which this user belongs", nullok = True), + 'peer_person_id': Parameter(int, "Foreign user identifier at peer", nullok = True), + } + related_fields = { + 'roles': [Mixed(Parameter(int, "Role identifier"), + Parameter(str, "Role name"))], + 'sites': [Mixed(Parameter(int, "Site identifier"), + Parameter(str, "Site name"))], + 'keys': [Mixed(Parameter(int, "Key identifier"), + Filter(Key.fields))], + 'slices': [Mixed(Parameter(int, "Slice identifier"), + Parameter(str, "Slice name"))] + } + + + + # for Cache + class_key = 'email' + foreign_fields = ['first_name', 'last_name', 'title', 'email', 'phone', 'url', + 'bio', 'enabled', 'password', ] + # forget about these ones, they are read-only anyway + # handling them causes Cache to re-sync all over again + # 'last_updated', 'date_created' + foreign_xrefs = [ + {'field' : 'key_ids', 'class': 'Key', 'table' : 'person_key' } , + {'field' : 'site_ids', 'class': 'Site', 'table' : 'person_site'}, +# xxx this is not handled by Cache yet +# 'role_ids': Parameter([int], "List of role identifiers"), +] + + def validate_email(self, email): + """ + Validate email address. Stolen from Mailman. + """ + + invalid_email = PLCInvalidArgument("Invalid e-mail address") + email_badchars = r'[][()<>|;^,\200-\377]' + + # Pretty minimal, cheesy check. We could do better... + if not email or email.count(' ') > 0: + raise invalid_email + if re.search(email_badchars, email) or email[0] == '-': + raise invalid_email + + email = email.lower() + at_sign = email.find('@') + if at_sign < 1: + raise invalid_email + user = email[:at_sign] + rest = email[at_sign+1:] + domain = rest.split('.') + + # This means local, unqualified addresses, are not allowed + if not domain: + raise invalid_email + if len(domain) < 2: + raise invalid_email + + # check only against users on the same peer + if 'peer_id' in self: + namespace_peer_id = self['peer_id'] + else: + namespace_peer_id = None + + conflicts = Persons(self.api, {'email':email,'peer_id':namespace_peer_id}) + + for person in conflicts: + if 'person_id' not in self or self['person_id'] != person['person_id']: + raise PLCInvalidArgument, "E-mail address already in use" + + return email + + def validate_password(self, password): + """ + Encrypt password if necessary before committing to the + database. + """ + + magic = "$1$" + + if len(password) > len(magic) and \ + password[0:len(magic)] == magic: + return password + else: + # Generate a somewhat unique 8 character salt string + salt = str(time.time()) + str(Random().random()) + salt = md5.md5(salt).hexdigest()[:8] + return crypt.crypt(password.encode(self.api.encoding), magic + salt + "$") + + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp + validate_verification_expires = Row.validate_timestamp + + def can_update(self, person): + """ + Returns true if we can update the specified person. We can + update a person if: + + 1. We are the person. + 2. We are an admin. + 3. We are a PI and the person is a user or tech or at + one of our sites. + """ + + assert isinstance(person, Person) + + if self['person_id'] == person['person_id']: + return True + + if 'admin' in self['roles']: + return True + + if 'pi' in self['roles']: + if set(self['site_ids']).intersection(person['site_ids']): + # Can update people with higher role IDs + return min(self['role_ids']) < min(person['role_ids']) + + return False + + def can_view(self, person): + """ + Returns true if we can view the specified person. We can + view a person if: + + 1. We are the person. + 2. We are an admin. + 3. We are a PI and the person is at one of our sites. + """ + + assert isinstance(person, Person) + + if self.can_update(person): + return True + + if 'pi' in self['roles']: + if set(self['site_ids']).intersection(person['site_ids']): + # Can view people with equal or higher role IDs + return min(self['role_ids']) <= min(person['role_ids']) + + return False + + add_role = Row.add_object(Role, 'person_role') + remove_role = Row.remove_object(Role, 'person_role') + + add_key = Row.add_object(Key, 'person_key') + remove_key = Row.remove_object(Key, 'person_key') + + def set_primary_site(self, site, commit = True): + """ + Set the primary site for an existing user. + """ + + assert 'person_id' in self + assert 'site_id' in site + + person_id = self['person_id'] + site_id = site['site_id'] + self.api.db.do("UPDATE person_site SET is_primary = False" \ + " WHERE person_id = %(person_id)d", + locals()) + self.api.db.do("UPDATE person_site SET is_primary = True" \ + " WHERE person_id = %(person_id)d" \ + " AND site_id = %(site_id)d", + locals()) + + if commit: + self.api.db.commit() + + assert 'site_ids' in self + assert site_id in self['site_ids'] + + # Make sure that the primary site is first in the list + self['site_ids'].remove(site_id) + self['site_ids'].insert(0, site_id) + + def update_last_updated(self, commit = True): + """ + Update last_updated field with current time + """ + + assert 'person_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_updated = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where person_id = %d" % (self['person_id']) ) + self.sync(commit) + + def associate_roles(self, auth, field, value): + """ + Adds roles found in value list to this person (using AddRoleToPerson). + Deletes roles not found in value list from this person (using DeleteRoleFromPerson). + """ + + assert 'role_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (role_ids, roles_names) = self.separate_types(value)[0:2] + + # Translate roles into role_ids + if roles_names: + roles = Roles(self.api, role_names, ['role_id']).dict('role_id') + role_ids += roles.keys() + + # Add new ids, remove stale ids + if self['role_ids'] != role_ids: + from PLC.Methods.AddRoleToPerson import AddRoleToPerson + from PLC.Methods.DeleteRoleFromPerson import DeleteRoleFromPerson + new_roles = set(role_ids).difference(self['role_ids']) + stale_roles = set(self['role_ids']).difference(role_ids) + + for new_role in new_roles: + AddRoleToPerson.__call__(AddRoleToPerson(self.api), auth, new_role, self['person_id']) + for stale_role in stale_roles: + DeleteRoleFromPerson.__call__(DeleteRoleFromPerson(self.api), auth, stale_role, self['person_id']) + + + def associate_sites(self, auth, field, value): + """ + Adds person to sites found in value list (using AddPersonToSite). + Deletes person from site not found in value list (using DeletePersonFromSite). + """ + + from PLC.Sites import Sites + + assert 'site_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (site_ids, site_names) = self.separate_types(value)[0:2] + + # Translate roles into role_ids + if site_names: + sites = Sites(self.api, site_names, ['site_id']).dict('site_id') + site_ids += sites.keys() + + # Add new ids, remove stale ids + if self['site_ids'] != site_ids: + from PLC.Methods.AddPersonToSite import AddPersonToSite + from PLC.Methods.DeletePersonFromSite import DeletePersonFromSite + new_sites = set(site_ids).difference(self['site_ids']) + stale_sites = set(self['site_ids']).difference(site_ids) + + for new_site in new_sites: + AddPersonToSite.__call__(AddPersonToSite(self.api), auth, self['person_id'], new_site) + for stale_site in stale_sites: + DeletePersonFromSite.__call__(DeletePersonFromSite(self.api), auth, self['person_id'], stale_site) + + + def associate_keys(self, auth, field, value): + """ + Deletes key_ids not found in value list (using DeleteKey). + Adds key if key_fields w/o key_id is found (using AddPersonKey). + Updates key if key_fields w/ key_id is found (using UpdateKey). + """ + assert 'key_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (key_ids, blank, keys) = self.separate_types(value) + + if self['key_ids'] != key_ids: + from PLC.Methods.DeleteKey import DeleteKey + stale_keys = set(self['key_ids']).difference(key_ids) + + for stale_key in stale_keys: + DeleteKey.__call__(DeleteKey(self.api), auth, stale_key) + + if keys: + from PLC.Methods.AddPersonKey import AddPersonKey + from PLC.Methods.UpdateKey import UpdateKey + updated_keys = filter(lambda key: 'key_id' in key, keys) + added_keys = filter(lambda key: 'key_id' not in key, keys) + + for key in added_keys: + AddPersonKey.__call__(AddPersonKey(self.api), auth, self['person_id'], key) + for key in updated_keys: + key_id = key.pop('key_id') + UpdateKey.__call__(UpdateKey(self.api), auth, key_id, key) + + + def associate_slices(self, auth, field, value): + """ + Adds person to slices found in value list (using AddPersonToSlice). + Deletes person from slices found in value list (using DeletePersonFromSlice). + """ + + from PLC.Slices import Slices + + assert 'slice_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (slice_ids, slice_names) = self.separate_types(value)[0:2] + + # Translate roles into role_ids + if slice_names: + slices = Slices(self.api, slice_names, ['slice_id']).dict('slice_id') + slice_ids += slices.keys() + + # Add new ids, remove stale ids + if self['slice_ids'] != slice_ids: + from PLC.Methods.AddPersonToSlice import AddPersonToSlice + from PLC.Methods.DeletePersonFromSlice import DeletePersonFromSlice + new_slices = set(slice_ids).difference(self['slice_ids']) + stale_slices = set(self['slice_ids']).difference(slice_ids) + + for new_slice in new_slices: + AddPersonToSlice.__call__(AddPersonToSlice(self.api), auth, self['person_id'], new_slice) + for stale_slice in stale_slices: + DeletePersonFromSlice.__call__(DeletePersonFromSlice(self.api), auth, self['person_id'], stale_slice) + + + def delete(self, commit = True): + """ + Delete existing user. + """ + + # Delete all keys + keys = Keys(self.api, self['key_ids']) + for key in keys: + key.delete(commit = False) + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE person_id = %d" % \ + (table, self['person_id'])) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + +class Persons(Table): + """ + Representation of row(s) from the persons table in the + database. + """ + + def __init__(self, api, person_filter = None, columns = None): + Table.__init__(self, api, Person, columns) + #sql = "SELECT %s FROM view_persons WHERE deleted IS False" % \ + # ", ".join(self.columns) + foreign_fields = {'role_ids': ('role_id', 'person_role'), + 'roles': ('name', 'roles'), + 'site_ids': ('site_id', 'person_site'), + 'key_ids': ('key_id', 'person_key'), + 'slice_ids': ('slice_id', 'slice_person') + } + foreign_keys = {} + db_fields = filter(lambda field: field not in foreign_fields.keys(), Person.fields.keys()) + all_fields = db_fields + [value[0] for value in foreign_fields.values()] + fields = [] + _select = "SELECT " + _from = " FROM persons " + _join = " LEFT JOIN peer_person USING (person_id) " + _where = " WHERE deleted IS False " + + if not columns: + # include all columns + fields = all_fields + tables = [value[1] for value in foreign_fields.values()] + tables.sort() + for key in foreign_fields.keys(): + foreign_keys[foreign_fields[key][0]] = key + for table in tables: + if table in ['roles']: + _join += " LEFT JOIN roles USING(role_id) " + else: + _join += " LEFT JOIN %s USING (person_id) " % (table) + else: + tables = set() + columns = filter(lambda column: column in db_fields+foreign_fields.keys(), columns) + columns.sort() + for column in columns: + if column in foreign_fields.keys(): + (field, table) = foreign_fields[column] + foreign_keys[field] = column + fields += [field] + tables.add(table) + if column in ['roles']: + _join += " LEFT JOIN roles USING(role_id) " + else: + _join += " LEFT JOIN %s USING (person_id)" % \ + (foreign_fields[column][1]) + + else: + fields += [column] + + # postgres will return timestamps as datetime objects. + # XMLPRC cannot marshal datetime so convert to int + timestamps = ['date_created', 'last_updated', 'verification_expires'] + for field in fields: + if field in timestamps: + fields[fields.index(field)] = \ + "CAST(date_part('epoch', %s) AS bigint) AS %s" % (field, field) + + _select += ", ".join(fields) + sql = _select + _from + _join + _where + + # deal with filter + if person_filter is not None: + if isinstance(person_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), person_filter) + strs = filter(lambda x: isinstance(x, StringTypes), person_filter) + person_filter = Filter(Person.fields, {'person_id': ints, 'email': strs}) + sql += " AND (%s) %s" % person_filter.sql(api, "OR") + elif isinstance(person_filter, dict): + person_filter = Filter(Person.fields, person_filter) + sql += " AND (%s) %s" % person_filter.sql(api, "AND") + elif isinstance (person_filter, StringTypes): + person_filter = Filter(Person.fields, {'email':[person_filter]}) + sql += " AND (%s) %s" % person_filter.sql(api, "AND") + elif isinstance (person_filter, int): + person_filter = Filter(Person.fields, {'person_id':[person_filter]}) + sql += " AND (%s) %s" % person_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong person filter %r"%person_filter + + # aggregate data + all_persons = {} + for row in self.api.db.selectall(sql): + person_id = row['person_id'] + + if all_persons.has_key(person_id): + for (key, key_list) in foreign_keys.items(): + data = row.pop(key) + row[key_list] = [data] + if data and data not in all_persons[person_id][key_list]: + all_persons[person_id][key_list].append(data) + else: + for key in foreign_keys.keys(): + value = row.pop(key) + if value: + row[foreign_keys[key]] = [value] + else: + row[foreign_keys[key]] = [] + if row: + all_persons[person_id] = row + + # populate self + for row in all_persons.values(): + obj = self.classobj(self.api, row) + self.append(obj) + diff --git a/PLC/PostgreSQL.py b/PLC/PostgreSQL.py new file mode 100644 index 0000000..c58a69f --- /dev/null +++ b/PLC/PostgreSQL.py @@ -0,0 +1,240 @@ +# +# PostgreSQL database interface. Sort of like DBI(3) (Database +# independent interface for Perl). +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: PostgreSQL.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import psycopg2 +import psycopg2.extensions +psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) +# UNICODEARRAY not exported yet +psycopg2.extensions.register_type(psycopg2._psycopg.UNICODEARRAY) + +import pgdb +from types import StringTypes, NoneType +import traceback +import commands +import re +from pprint import pformat + +from PLC.Debug import profile, log +from PLC.Faults import * + +if not psycopg2: + is8bit = re.compile("[\x80-\xff]").search + + def unicast(typecast): + """ + pgdb returns raw UTF-8 strings. This function casts strings that + appear to contain non-ASCII characters to unicode objects. + """ + + def wrapper(*args, **kwds): + value = typecast(*args, **kwds) + + # pgdb always encodes unicode objects as UTF-8 regardless of + # the DB encoding (and gives you no option for overriding + # the encoding), so always decode 8-bit objects as UTF-8. + if isinstance(value, str) and is8bit(value): + value = unicode(value, "utf-8") + + return value + + return wrapper + + pgdb.pgdbTypeCache.typecast = unicast(pgdb.pgdbTypeCache.typecast) + +class PostgreSQL: + def __init__(self, api): + self.api = api + self.debug = False + self.connection = None + + def cursor(self): + if self.connection is None: + # (Re)initialize database connection + if psycopg2: + try: + # Try UNIX socket first + self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + database = self.api.config.PLC_DB_NAME) + except psycopg2.OperationalError: + # Fall back on TCP + self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + database = self.api.config.PLC_DB_NAME, + host = self.api.config.PLC_DB_HOST, + port = self.api.config.PLC_DB_PORT) + self.connection.set_client_encoding("UNICODE") + else: + self.connection = pgdb.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + host = "%s:%d" % (api.config.PLC_DB_HOST, api.config.PLC_DB_PORT), + database = self.api.config.PLC_DB_NAME) + + (self.rowcount, self.description, self.lastrowid) = \ + (None, None, None) + + return self.connection.cursor() + + def close(self): + if self.connection is not None: + self.connection.close() + self.connection = None + + def quote(self, value): + """ + Returns quoted version of the specified value. + """ + + # The pgdb._quote function is good enough for general SQL + # quoting, except for array types. + if isinstance(value, (list, tuple, set)): + return "ARRAY[%s]" % ", ".join(map, self.quote, value) + else: + return pgdb._quote(value) + + quote = classmethod(quote) + + def param(self, name, value): + # None is converted to the unquoted string NULL + if isinstance(value, NoneType): + conversion = "s" + # True and False are also converted to unquoted strings + elif isinstance(value, bool): + conversion = "s" + elif isinstance(value, float): + conversion = "f" + elif not isinstance(value, StringTypes): + conversion = "d" + else: + conversion = "s" + + return '%(' + name + ')' + conversion + + param = classmethod(param) + + def begin_work(self): + # Implicit in pgdb.connect() + pass + + def commit(self): + self.connection.commit() + + def rollback(self): + self.connection.rollback() + + def do(self, query, params = None): + cursor = self.execute(query, params) + cursor.close() + return self.rowcount + + def last_insert_id(self, table_name, primary_key): + if isinstance(self.lastrowid, int): + sql = "SELECT %s FROM %s WHERE oid = %d" % \ + (primary_key, table_name, self.lastrowid) + rows = self.selectall(sql, hashref = False) + if rows: + return rows[0][0] + + return None + + def execute(self, query, params = None): + return self.execute_array(query, (params,)) + + def execute_array(self, query, param_seq): + cursor = self.cursor() + try: + if self.debug: + for params in param_seq: + if params: + print >> log, query % params + else: + print >> log, query + + # psycopg2 requires %()s format for all parameters, + # regardless of type. + if psycopg2: + query = re.sub(r'(%\([^)]*\)|%)[df]', r'\1s', query) + + cursor.executemany(query, param_seq) + (self.rowcount, self.description, self.lastrowid) = \ + (cursor.rowcount, cursor.description, cursor.lastrowid) + except Exception, e: + try: + self.rollback() + except: + pass + uuid = commands.getoutput("uuidgen") + print >> log, "Database error %s:" % uuid + print >> log, e + print >> log, "Query:" + print >> log, query + print >> log, "Params:" + print >> log, pformat(param_seq[0]) + raise PLCDBError("Please contact " + \ + self.api.config.PLC_NAME + " Support " + \ + "<" + self.api.config.PLC_MAIL_SUPPORT_ADDRESS + ">" + \ + " and reference " + uuid) + + return cursor + + def selectall(self, query, params = None, hashref = True, key_field = None): + """ + Return each row as a dictionary keyed on field name (like DBI + selectrow_hashref()). If key_field is specified, return rows + as a dictionary keyed on the specified field (like DBI + selectall_hashref()). + + If params is specified, the specified parameters will be bound + to the query. + """ + + cursor = self.execute(query, params) + rows = cursor.fetchall() + cursor.close() + + if hashref or key_field is not None: + # Return each row as a dictionary keyed on field name + # (like DBI selectrow_hashref()). + labels = [column[0] for column in self.description] + rows = [dict(zip(labels, row)) for row in rows] + + if key_field is not None and key_field in labels: + # Return rows as a dictionary keyed on the specified field + # (like DBI selectall_hashref()). + return dict([(row[key_field], row) for row in rows]) + else: + return rows + + def fields(self, table, notnull = None, hasdef = None): + """ + Return the names of the fields of the specified table. + """ + + if hasattr(self, 'fields_cache'): + if self.fields_cache.has_key((table, notnull, hasdef)): + return self.fields_cache[(table, notnull, hasdef)] + else: + self.fields_cache = {} + + sql = "SELECT attname FROM pg_attribute, pg_class" \ + " WHERE pg_class.oid = attrelid" \ + " AND attnum > 0 AND relname = %(table)s" + + if notnull is not None: + sql += " AND attnotnull is %(notnull)s" + + if hasdef is not None: + sql += " AND atthasdef is %(hasdef)s" + + rows = self.selectall(sql, locals(), hashref = False) + + self.fields_cache[(table, notnull, hasdef)] = [row[0] for row in rows] + + return self.fields_cache[(table, notnull, hasdef)] diff --git a/PLC/PyCurl.py b/PLC/PyCurl.py new file mode 100644 index 0000000..032ab75 --- /dev/null +++ b/PLC/PyCurl.py @@ -0,0 +1,80 @@ +# +# Replacement for xmlrpclib.SafeTransport, which does not validate +# SSL certificates. Requires PyCurl. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: PyCurl.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import os +import xmlrpclib +import pycurl +from tempfile import NamedTemporaryFile + +class PyCurlTransport(xmlrpclib.Transport): + def __init__(self, uri, cert = None, timeout = 300): + self.curl = pycurl.Curl() + + # Suppress signals + self.curl.setopt(pycurl.NOSIGNAL, 1) + + # Follow redirections + self.curl.setopt(pycurl.FOLLOWLOCATION, 1) + + # Set URL + self.url = uri + self.curl.setopt(pycurl.URL, str(uri)) + + # Set certificate path + if cert is not None: + if os.path.exists(cert): + cert_path = str(cert) + else: + # Keep a reference so that it does not get deleted + self.cert = NamedTemporaryFile(prefix = "cert") + self.cert.write(cert) + self.cert.flush() + cert_path = self.cert.name + self.curl.setopt(pycurl.CAINFO, cert_path) + self.curl.setopt(pycurl.SSL_VERIFYPEER, 2) + + # Set connection timeout + if timeout: + self.curl.setopt(pycurl.CONNECTTIMEOUT, timeout) + self.curl.setopt(pycurl.TIMEOUT, timeout) + + # Set request callback + self.body = "" + def body(buf): + self.body += buf + self.curl.setopt(pycurl.WRITEFUNCTION, body) + + def request(self, host, handler, request_body, verbose = 1): + # Set verbosity + self.curl.setopt(pycurl.VERBOSE, verbose) + + # Post request + self.curl.setopt(pycurl.POST, 1) + self.curl.setopt(pycurl.POSTFIELDS, request_body) + + try: + self.curl.perform() + errcode = self.curl.getinfo(pycurl.HTTP_CODE) + response = self.body + self.body = "" + except pycurl.error, err: + (errcode, errmsg) = err + + if errcode == 60: + raise Exception, "PyCurl: SSL certificate validation failed" + elif errcode != 200: + raise Exception, "PyCurl: HTTP error %d -- %r" % (errcode,errmsg) + + # Parse response + p, u = self.getparser() + p.feed(response) + p.close() + + return u.close() diff --git a/PLC/Roles.py b/PLC/Roles.py new file mode 100644 index 0000000..53d68d0 --- /dev/null +++ b/PLC/Roles.py @@ -0,0 +1,72 @@ +# +# Functions for interacting with the roles table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Roles.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from types import StringTypes +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table + +class Role(Row): + """ + Representation of a row in the roles table. To use, + instantiate with a dict of values. + """ + + table_name = 'roles' + primary_key = 'role_id' + join_tables = ['person_role', ('slice_attribute_types', 'min_role_id')] + fields = { + 'role_id': Parameter(int, "Role identifier"), + 'name': Parameter(str, "Role", max = 100), + } + + def validate_role_id(self, role_id): + # Make sure role does not already exist + conflicts = Roles(self.api, [role_id]) + if conflicts: + raise PLCInvalidArgument, "Role ID already in use" + + return role_id + + def validate_name(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Role must be specified" + + # Make sure role does not already exist + conflicts = Roles(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Role name already in use" + + return name + +class Roles(Table): + """ + Representation of the roles table in the database. + """ + + def __init__(self, api, role_filter = None): + Table.__init__(self, api, Role) + + sql = "SELECT %s FROM roles WHERE True" % \ + ", ".join(Role.fields) + + if role_filter is not None: + if isinstance(role_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), role_filter) + strs = filter(lambda x: isinstance(x, StringTypes), role_filter) + role_filter = Filter(Role.fields, {'role_id': ints, 'name': strs}) + sql += " AND (%s) %s" % role_filter.sql(api, "OR") + elif isinstance(role_filter, dict): + role_filter = Filter(Role.fields, role_filter) + sql += " AND (%s) %s" % role_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/PLC/Sessions.py b/PLC/Sessions.py new file mode 100644 index 0000000..e0a57b3 --- /dev/null +++ b/PLC/Sessions.py @@ -0,0 +1,91 @@ +from types import StringTypes +import random +import base64 +import time + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes + +class Session(Row): + """ + Representation of a row in the sessions table. To use, instantiate + with a dict of values. + """ + + table_name = 'sessions' + primary_key = 'session_id' + join_tables = ['person_session', 'node_session'] + fields = { + 'session_id': Parameter(str, "Session key"), + 'person_id': Parameter(int, "Account identifier, if applicable"), + 'node_id': Parameter(int, "Node identifier, if applicable"), + 'expires': Parameter(int, "Date and time when session expires, in seconds since UNIX epoch"), + } + + def validate_expires(self, expires): + if expires < time.time(): + raise PLCInvalidArgument, "Expiration date must be in the future" + + return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(expires)) + + add_person = Row.add_object(Person, 'person_session') + + def add_node(self, node, commit = True): + # Nodes can have only one session at a time + self.api.db.do("DELETE FROM node_session WHERE node_id = %d" % \ + node['node_id']) + + add = Row.add_object(Node, 'node_session') + add(self, node, commit = commit) + + def sync(self, commit = True, insert = None): + if not self.has_key('session_id'): + # Before a new session is added, delete expired sessions + expired = Sessions(self.api, expires = -int(time.time())) + for session in expired: + session.delete(commit) + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + self['session_id'] = base64.b64encode("".join(map(chr, bytes))) + # Force insert + insert = True + + Row.sync(self, commit, insert) + +class Sessions(Table): + """ + Representation of row(s) from the session table in the database. + """ + + def __init__(self, api, session_filter = None, expires = int(time.time())): + Table.__init__(self, api, Session) + + sql = "SELECT %s FROM view_sessions WHERE True" % \ + ", ".join(Session.fields) + + if session_filter is not None: + if isinstance(session_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), session_filter) + strs = filter(lambda x: isinstance(x, StringTypes), session_filter) + session_filter = Filter(Session.fields, {'person_id': ints, 'session_id': strs}) + sql += " AND (%s) %s" % session_filter.sql(api, "OR") + elif isinstance(session_filter, dict): + session_filter = Filter(Session.fields, session_filter) + sql += " AND (%s) %s" % session_filter.sql(api, "AND") + + if expires is not None: + if expires >= 0: + sql += " AND expires > %(expires)d" + else: + expires = -expires + sql += " AND expires < %(expires)d" + + self.selectall(sql, locals()) diff --git a/PLC/Shell.py b/PLC/Shell.py new file mode 100644 index 0000000..43317a0 --- /dev/null +++ b/PLC/Shell.py @@ -0,0 +1,260 @@ +#!/usr/bin/python +# +# Interactive shell for testing PLCAPI +# +# Mark Huang +# Copyright (C) 2005 The Trustees of Princeton University +# +# $Id: Shell.py 5574 2007-10-25 20:33:17Z thierry $ +# + +import os +import pydoc +import xmlrpclib + +from PLC.API import PLCAPI +from PLC.Parameter import Mixed +from PLC.Auth import Auth +from PLC.Config import Config +from PLC.Method import Method +from PLC.PyCurl import PyCurlTransport +import PLC.Methods + +class Callable: + """ + Wrapper to call a method either directly or remotely and + automagically add the authentication structure if necessary. + """ + + def __init__(self, shell, name, func, auth = None): + self.shell = shell + self.name = name + self.func = func + self.auth = auth + + def __call__(self, *args, **kwds): + """ + Automagically add the authentication structure if the function + requires it and it has not been specified. + """ + + if self.auth and \ + (not args or not isinstance(args[0], dict) or \ + (not args[0].has_key('AuthMethod') and \ + not args[0].has_key('session'))): + args = (self.auth,) + args + + if self.shell.multi: + self.shell.calls.append({'methodName': self.name, 'params': list(args)}) + return None + else: + return self.func(*args, **kwds) + +class Shell: + def __init__(self, + # Add API functions to global scope + globals = None, + # Configuration file + config = None, + # XML-RPC server + url = None, xmlrpc = False, cacert = None, + # API authentication method + method = None, + # Password authentication + role = None, user = None, password = None, + # Session authentication + session = None): + """ + Initialize a new shell instance. Re-initializes globals. + """ + + try: + # If any XML-RPC options have been specified, do not try + # connecting directly to the DB. + if (url, method, user, password, role, cacert, xmlrpc) != \ + (None, None, None, None, None, None, False): + raise Exception + + # Otherwise, first try connecting directly to the DB. This + # absolutely requires a configuration file; the API + # instance looks for one in a default location if one is + # not specified. If this fails, try connecting to the API + # server via XML-RPC. + if config is None: + self.api = PLCAPI() + else: + self.api = PLCAPI(config) + self.config = self.api.config + self.url = None + self.server = None + except Exception, err: + # Try connecting to the API server via XML-RPC + self.api = PLCAPI(None) + + try: + if config is None: + self.config = Config() + else: + self.config = Config(config) + except Exception, err: + # Try to continue if no configuration file is available + self.config = None + + if url is None: + if self.config is None: + raise Exception, "Must specify API URL" + + url = "https://" + self.config.PLC_API_HOST + \ + ":" + str(self.config.PLC_API_PORT) + \ + "/" + self.config.PLC_API_PATH + "/" + + if cacert is None: + cacert = self.config.PLC_API_CA_SSL_CRT + + self.url = url + if cacert is not None: + self.server = xmlrpclib.ServerProxy(url, PyCurlTransport(url, cacert), allow_none = 1) + else: + self.server = xmlrpclib.ServerProxy(url, allow_none = 1) + + # Set up authentication structure + + # Default is to use session or capability authentication + if (method, user, password) == (None, None, None): + if session is not None or os.path.exists("/etc/planetlab/session"): + method = "session" + if session is None: + session = "/etc/planetlab/session" + else: + method = "capability" + + if method == "capability": + # Load defaults from configuration file if using capability + # authentication. + if user is None and self.config is not None: + user = self.config.PLC_API_MAINTENANCE_USER + if password is None and self.config is not None: + password = self.config.PLC_API_MAINTENANCE_PASSWORD + if role is None: + role = "admin" + elif method is None: + # Otherwise, default to password authentication + method = "password" + + if role == "anonymous" or method == "anonymous": + self.auth = {'AuthMethod': "anonymous"} + elif method == "session": + if session is None: + raise Exception, "Must specify session" + + if os.path.exists(session): + session = file(session).read() + + self.auth = {'AuthMethod': "session", 'session': session} + else: + if user is None: + raise Exception, "Must specify username" + + if password is None: + raise Exception, "Must specify password" + + self.auth = {'AuthMethod': method, + 'Username': user, + 'AuthString': password} + + if role is not None: + self.auth['Role'] = role + + for method in PLC.Methods.methods: + api_function = self.api.callable(method) + + if self.server is None: + # Can just call it directly + func = api_function + else: + func = getattr(self.server, method) + + # If the function requires an authentication structure as + # its first argument, automagically add an auth struct to + # the call. + if api_function.accepts and \ + (isinstance(api_function.accepts[0], Auth) or \ + (isinstance(api_function.accepts[0], Mixed) and \ + filter(lambda param: isinstance(param, Auth), api_function.accepts[0]))): + auth = self.auth + else: + auth = None + + callable = Callable(self, method, func, auth) + + # Add to ourself and the global environment. Add dummy + # subattributes to support tab completion of methods with + # dots in their names (e.g., system.listMethods). + class Dummy: pass + paths = method.split(".") + if len(paths) > 1: + first = paths.pop(0) + + if not hasattr(self, first): + obj = Dummy() + setattr(self, first, obj) + # Also add to global environment if specified + if globals is not None: + globals[first] = obj + + obj = getattr(self, first) + + for path in paths: + if not hasattr(obj, path): + if path == paths[-1]: + setattr(obj, path, callable) + else: + setattr(obj, path, Dummy()) + obj = getattr(obj, path) + else: + setattr(self, method, callable) + # Also add to global environment if specified + if globals is not None: + globals[method] = callable + + # Override help(), begin(), and commit() + if globals is not None: + globals['help'] = self.help + globals['begin'] = self.begin + globals['commit'] = self.commit + + # Multicall support + self.calls = [] + self.multi = False + + def help(self, topic = None): + if isinstance(topic, Callable): + pydoc.pager(self.system.methodHelp(topic.name)) + else: + pydoc.help(topic) + + def begin(self): + if self.calls: + raise Exception, "multicall already in progress" + + self.multi = True + + def commit(self): + if self.calls: + ret = [] + self.multi = False + results = self.system.multicall(self.calls) + for result in results: + if type(result) == type({}): + raise xmlrpclib.Fault(result['faultCode'], result['faultString']) + elif type(result) == type([]): + ret.append(result[0]) + else: + raise ValueError, "unexpected type in multicall result" + else: + ret = None + + self.calls = [] + self.multi = False + + return ret diff --git a/PLC/Sites.py b/PLC/Sites.py new file mode 100644 index 0000000..6035bb7 --- /dev/null +++ b/PLC/Sites.py @@ -0,0 +1,271 @@ +from types import StringTypes +import string + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.Slices import Slice, Slices +from PLC.PCUs import PCU, PCUs +from PLC.Nodes import Node, Nodes +from PLC.Addresses import Address, Addresses +from PLC.Persons import Person, Persons + +class Site(Row): + """ + Representation of a row in the sites table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'sites' + primary_key = 'site_id' + join_tables = ['person_site', 'site_address', 'peer_site'] + fields = { + 'site_id': Parameter(int, "Site identifier"), + 'name': Parameter(str, "Full site name", max = 254), + 'abbreviated_name': Parameter(str, "Abbreviated site name", max = 50), + 'login_base': Parameter(str, "Site slice prefix", max = 20), + 'is_public': Parameter(bool, "Publicly viewable site"), + 'enabled': Parameter(bool, "Has been enabled"), + 'latitude': Parameter(float, "Decimal latitude of the site", min = -90.0, max = 90.0, nullok = True), + 'longitude': Parameter(float, "Decimal longitude of the site", min = -180.0, max = 180.0, nullok = True), + 'url': Parameter(str, "URL of a page that describes the site", max = 254, nullok = True), + 'date_created': Parameter(int, "Date and time when site entry was created, in seconds since UNIX epoch", ro = True), + 'last_updated': Parameter(int, "Date and time when site entry was last updated, in seconds since UNIX epoch", ro = True), + 'max_slices': Parameter(int, "Maximum number of slices that the site is able to create"), + 'max_slivers': Parameter(int, "Maximum number of slivers that the site is able to create"), + 'person_ids': Parameter([int], "List of account identifiers"), + 'slice_ids': Parameter([int], "List of slice identifiers"), + 'address_ids': Parameter([int], "List of address identifiers"), + 'pcu_ids': Parameter([int], "List of PCU identifiers"), + 'node_ids': Parameter([int], "List of site node identifiers"), + 'peer_id': Parameter(int, "Peer to which this site belongs", nullok = True), + 'peer_site_id': Parameter(int, "Foreign site identifier at peer", nullok = True), + 'ext_consortium_id': Parameter(int, "external consortium id", nullok = True) + } + related_fields = { + 'persons': [Mixed(Parameter(int, "Person identifier"), + Parameter(str, "Email address"))], + 'addresses': [Mixed(Parameter(int, "Address identifer"), + Filter(Address.fields))] + } + # for Cache + class_key = 'login_base' + foreign_fields = ['abbreviated_name', 'name', 'is_public', 'latitude', 'longitude', + 'url', 'max_slices', 'max_slivers', + ] + # forget about these ones, they are read-only anyway + # handling them causes Cache to re-sync all over again + # 'last_updated', 'date_created' + foreign_xrefs = [] + + def validate_name(self, name): + if not len(name): + raise PLCInvalidArgument, "Name must be specified" + + return name + + validate_abbreviated_name = validate_name + + def validate_login_base(self, login_base): + if not len(login_base): + raise PLCInvalidArgument, "Login base must be specified" + + if not set(login_base).issubset(string.lowercase + string.digits): + raise PLCInvalidArgument, "Login base must consist only of lowercase ASCII letters or numbers" + + conflicts = Sites(self.api, [login_base]) + for site in conflicts: + if 'site_id' not in self or self['site_id'] != site['site_id']: + raise PLCInvalidArgument, "login_base already in use" + + return login_base + + def validate_latitude(self, latitude): + if not self.has_key('longitude') or \ + self['longitude'] is None: + raise PLCInvalidArgument, "Longitude must also be specified" + + return latitude + + def validate_longitude(self, longitude): + if not self.has_key('latitude') or \ + self['latitude'] is None: + raise PLCInvalidArgument, "Latitude must also be specified" + + return longitude + + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp + + add_person = Row.add_object(Person, 'person_site') + remove_person = Row.remove_object(Person, 'person_site') + + add_address = Row.add_object(Address, 'site_address') + remove_address = Row.remove_object(Address, 'site_address') + + def update_last_updated(self, commit = True): + """ + Update last_updated field with current time + """ + + assert 'site_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_updated = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where site_id = %d" % (self['site_id']) ) + self.sync(commit) + + + def associate_persons(self, auth, field, value): + """ + Adds persons found in value list to this site (using AddPersonToSite). + Deletes persons not found in value list from this site (using DeletePersonFromSite). + """ + + assert 'person_ids' in self + assert 'site_id' in self + assert isinstance(value, list) + + (person_ids, emails) = self.separate_types(value)[0:2] + + # Translate emails into person_ids + if emails: + persons = Persons(self.api, emails, ['person_id']).dict('person_id') + person_ids += persons.keys() + + # Add new ids, remove stale ids + if self['person_ids'] != person_ids: + from PLC.Methods.AddPersonToSite import AddPersonToSite + from PLC.Methods.DeletePersonFromSite import DeletePersonFromSite + new_persons = set(person_ids).difference(self['person_ids']) + stale_persons = set(self['person_ids']).difference(person_ids) + + for new_person in new_persons: + AddPersonToSite.__call__(AddPersonToSite(self.api), auth, new_person, self['site_id']) + for stale_person in stale_persons: + DeletePersonFromSite.__call__(DeletePersonFromSite(self.api), auth, stale_person, self['site_id']) + + def associate_addresses(self, auth, field, value): + """ + Deletes addresses_ids not found in value list (using DeleteAddress). + Adds address if slice_fields w/o address_id found in value list (using AddSiteAddress). + Update address if slice_fields w/ address_id found in value list (using UpdateAddress). + """ + + assert 'address_ids' in self + assert 'site_id' in self + assert isinstance(value, list) + + (address_ids, blank, addresses) = self.separate_types(value) + + for address in addresses: + if 'address_id' in address: + address_ids.append(address['address_id']) + + # Add new ids, remove stale ids + if self['address_ids'] != address_ids: + from PLC.Methods.DeleteAddress import DeleteAddress + stale_addresses = set(self['address_ids']).difference(address_ids) + + for stale_address in stale_addresses: + DeleteAddress.__call__(DeleteAddress(self.api), auth, stale_address) + + if addresses: + from PLC.Methods.AddSiteAddress import AddSiteAddress + from PLC.Methods.UpdateAddress import UpdateAddress + + updated_addresses = filter(lambda address: 'address_id' in address, addresses) + added_addresses = filter(lambda address: 'address_id' not in address, addresses) + + for address in added_addresses: + AddSiteAddress.__call__(AddSiteAddress(self.api), auth, self['site_id'], address) + for address in updated_addresses: + address_id = address.pop('address_id') + UpdateAddress.__call__(UpdateAddress(self.api), auth, address_id, address) + + def delete(self, commit = True): + """ + Delete existing site. + """ + + assert 'site_id' in self + + # Delete accounts of all people at the site who are not + # members of at least one other non-deleted site. + persons = Persons(self.api, self['person_ids']) + for person in persons: + delete = True + + person_sites = Sites(self.api, person['site_ids']) + for person_site in person_sites: + if person_site['site_id'] != self['site_id']: + delete = False + break + + if delete: + person.delete(commit = False) + + # Delete all site addresses + addresses = Addresses(self.api, self['address_ids']) + for address in addresses: + address.delete(commit = False) + + # Delete all site slices + slices = Slices(self.api, self['slice_ids']) + for slice in slices: + slice.delete(commit = False) + + # Delete all site PCUs + pcus = PCUs(self.api, self['pcu_ids']) + for pcu in pcus: + pcu.delete(commit = False) + + # Delete all site nodes + nodes = Nodes(self.api, self['node_ids']) + for node in nodes: + node.delete(commit = False) + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE site_id = %d" % \ + (table, self['site_id'])) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + +class Sites(Table): + """ + Representation of row(s) from the sites table in the + database. + """ + + def __init__(self, api, site_filter = None, columns = None): + Table.__init__(self, api, Site, columns) + + sql = "SELECT %s FROM view_sites WHERE deleted IS False" % \ + ", ".join(self.columns) + + if site_filter is not None: + if isinstance(site_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), site_filter) + strs = filter(lambda x: isinstance(x, StringTypes), site_filter) + site_filter = Filter(Site.fields, {'site_id': ints, 'login_base': strs}) + sql += " AND (%s) %s" % site_filter.sql(api, "OR") + elif isinstance(site_filter, dict): + site_filter = Filter(Site.fields, site_filter) + sql += " AND (%s) %s" % site_filter.sql(api, "AND") + elif isinstance (site_filter, StringTypes): + site_filter = Filter(Site.fields, {'login_base':[site_filter]}) + sql += " AND (%s) %s" % site_filter.sql(api, "AND") + elif isinstance (site_filter, int): + site_filter = Filter(Site.fields, {'site_id':[site_filter]}) + sql += " AND (%s) %s" % site_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong site filter %r"%site_filter + + self.selectall(sql) diff --git a/PLC/SliceAttributeTypes.py b/PLC/SliceAttributeTypes.py new file mode 100644 index 0000000..5884fe0 --- /dev/null +++ b/PLC/SliceAttributeTypes.py @@ -0,0 +1,72 @@ +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Roles import Role, Roles + +class SliceAttributeType(Row): + """ + Representation of a row in the slice_attribute_types table. To + use, instantiate with a dict of values. + """ + + table_name = 'slice_attribute_types' + primary_key = 'attribute_type_id' + join_tables = ['slice_attribute'] + fields = { + 'attribute_type_id': Parameter(int, "Slice attribute type identifier"), + 'name': Parameter(str, "Slice attribute type name", max = 100), + 'description': Parameter(str, "Slice attribute type description", max = 254), + 'min_role_id': Parameter(int, "Minimum (least powerful) role that can set or change this attribute"), + } + + # for Cache + class_key = 'name' + foreign_fields = ['description','min_role_id'] + foreign_xrefs = [] + + def validate_name(self, name): + if not len(name): + raise PLCInvalidArgument, "Slice attribute type name must be set" + + conflicts = SliceAttributeTypes(self.api, [name]) + for attribute in conflicts: + if 'attribute_type_id' not in self or \ + self['attribute_type_id'] != attribute['attribute_type_id']: + raise PLCInvalidArgument, "Slice attribute type name already in use" + + return name + + def validate_min_role_id(self, role_id): + roles = [row['role_id'] for row in Roles(self.api)] + if role_id not in roles: + raise PLCInvalidArgument, "Invalid role" + + return role_id + +class SliceAttributeTypes(Table): + """ + Representation of row(s) from the slice_attribute_types table in the + database. + """ + + def __init__(self, api, attribute_type_filter = None, columns = None): + Table.__init__(self, api, SliceAttributeType, columns) + + sql = "SELECT %s FROM slice_attribute_types WHERE True" % \ + ", ".join(self.columns) + + if attribute_type_filter is not None: + if isinstance(attribute_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), attribute_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), attribute_type_filter) + attribute_type_filter = Filter(SliceAttributeType.fields, {'attribute_type_id': ints, 'name': strs}) + sql += " AND (%s) %s" % attribute_type_filter.sql(api, "OR") + elif isinstance(attribute_type_filter, dict): + attribute_type_filter = Filter(SliceAttributeType.fields, attribute_type_filter) + sql += " AND (%s) %s" % attribute_type_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/PLC/SliceAttributes.py b/PLC/SliceAttributes.py new file mode 100644 index 0000000..9f0b1fb --- /dev/null +++ b/PLC/SliceAttributes.py @@ -0,0 +1,46 @@ +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes + +class SliceAttribute(Row): + """ + Representation of a row in the slice_attribute table. To use, + instantiate with a dict of values. + """ + + table_name = 'slice_attribute' + primary_key = 'slice_attribute_id' + fields = { + 'slice_attribute_id': Parameter(int, "Slice attribute identifier"), + 'slice_id': Parameter(int, "Slice identifier"), + 'node_id': Parameter(int, "Node identifier, if a sliver attribute"), + 'nodegroup_id': Parameter(int, "Nodegroup identifier, if a sliver attribute"), + 'attribute_type_id': SliceAttributeType.fields['attribute_type_id'], + 'name': SliceAttributeType.fields['name'], + 'description': SliceAttributeType.fields['description'], + 'min_role_id': SliceAttributeType.fields['min_role_id'], + 'value': Parameter(str, "Slice attribute value"), + } + +class SliceAttributes(Table): + """ + Representation of row(s) from the slice_attribute table in the + database. + """ + + def __init__(self, api, slice_attribute_filter = None, columns = None): + Table.__init__(self, api, SliceAttribute, columns) + + sql = "SELECT %s FROM view_slice_attributes WHERE True" % \ + ", ".join(self.columns) + + if slice_attribute_filter is not None: + if isinstance(slice_attribute_filter, (list, tuple, set)): + slice_attribute_filter = Filter(SliceAttribute.fields, {'slice_attribute_id': slice_attribute_filter}) + elif isinstance(slice_attribute_filter, dict): + slice_attribute_filter = Filter(SliceAttribute.fields, slice_attribute_filter) + sql += " AND (%s) %s" % slice_attribute_filter.sql(api) + + self.selectall(sql) diff --git a/PLC/SliceInstantiations.py b/PLC/SliceInstantiations.py new file mode 100644 index 0000000..db11838 --- /dev/null +++ b/PLC/SliceInstantiations.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the slice_instantiations table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: SliceInstantiations.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class SliceInstantiation(Row): + """ + Representation of a row in the slice_instantiations table. To use, + instantiate with a dict of values. + """ + + table_name = 'slice_instantiations' + primary_key = 'instantiation' + join_tables = ['slices'] + fields = { + 'instantiation': Parameter(str, "Slice instantiation state", max = 100), + } + + def validate_instantiation(self, instantiation): + # Make sure name is not blank + if not len(instantiation): + raise PLCInvalidArgument, "Slice instantiation state name must be specified" + + # Make sure slice instantiation does not alredy exist + conflicts = SliceInstantiations(self.api, [instantiation]) + if conflicts: + raise PLCInvalidArgument, "Slice instantiation state name already in use" + + return instantiation + +class SliceInstantiations(Table): + """ + Representation of the slice_instantiations table in the database. + """ + + def __init__(self, api, instantiations = None): + Table.__init__(self, api, SliceInstantiation) + + sql = "SELECT %s FROM slice_instantiations" % \ + ", ".join(SliceInstantiation.fields) + + if instantiations: + sql += " WHERE instantiation IN (%s)" % ", ".join(map(api.db.quote, instantiations)) + + self.selectall(sql) diff --git a/PLC/Slices.py b/PLC/Slices.py new file mode 100644 index 0000000..1a1786c --- /dev/null +++ b/PLC/Slices.py @@ -0,0 +1,296 @@ +from types import StringTypes +import time +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Nodes import Node +from PLC.Persons import Person, Persons +from PLC.SliceAttributes import SliceAttribute + +class Slice(Row): + """ + Representation of a row in the slices table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync().To use, instantiate + with a dict of values. + """ + + table_name = 'slices' + primary_key = 'slice_id' + join_tables = ['slice_node', 'slice_person', 'slice_attribute', 'peer_slice', 'node_slice_whitelist'] + fields = { + 'slice_id': Parameter(int, "Slice identifier"), + 'site_id': Parameter(int, "Identifier of the site to which this slice belongs"), + 'name': Parameter(str, "Slice name", max = 32), + 'instantiation': Parameter(str, "Slice instantiation state"), + 'url': Parameter(str, "URL further describing this slice", max = 254, nullok = True), + 'description': Parameter(str, "Slice description", max = 2048, nullok = True), + 'max_nodes': Parameter(int, "Maximum number of nodes that can be assigned to this slice"), + 'creator_person_id': Parameter(int, "Identifier of the account that created this slice"), + 'created': Parameter(int, "Date and time when slice was created, in seconds since UNIX epoch", ro = True), + 'expires': Parameter(int, "Date and time when slice expires, in seconds since UNIX epoch"), + 'node_ids': Parameter([int], "List of nodes in this slice", ro = True), + 'person_ids': Parameter([int], "List of accounts that can use this slice", ro = True), + 'slice_attribute_ids': Parameter([int], "List of slice attributes", ro = True), + 'peer_id': Parameter(int, "Peer to which this slice belongs", nullok = True), + 'peer_slice_id': Parameter(int, "Foreign slice identifier at peer", nullok = True), + } + related_fields = { + 'persons': [Mixed(Parameter(int, "Person identifier"), + Parameter(str, "Email address"))], + 'nodes': [Mixed(Parameter(int, "Node identifier"), + Parameter(str, "Fully qualified hostname"))] + } + # for Cache + class_key = 'name' + foreign_fields = ['instantiation', 'url', 'description', 'max_nodes', 'expires'] + foreign_xrefs = [ + {'field': 'node_ids' , 'class': 'Node', 'table': 'slice_node' }, + {'field': 'person_ids', 'class': 'Person', 'table': 'slice_person'}, + {'field': 'creator_person_id', 'class': 'Person', 'table': 'unused-on-direct-refs'}, + {'field': 'site_id', 'class': 'Site', 'table': 'unused-on-direct-refs'}, + ] + # forget about this one, it is read-only anyway + # handling it causes Cache to re-sync all over again + # 'created' + + def validate_name(self, name): + # N.B.: Responsibility of the caller to ensure that login_base + # portion of the slice name corresponds to a valid site, if + # desired. + + # 1. Lowercase. + # 2. Begins with login_base (letters or numbers). + # 3. Then single underscore after login_base. + # 4. Then letters, numbers, or underscores. + good_name = r'^[a-z0-9]+_[a-zA-Z0-9_]+$' + if not name or \ + not re.match(good_name, name): + raise PLCInvalidArgument, "Invalid slice name" + + conflicts = Slices(self.api, [name]) + for slice in conflicts: + if 'slice_id' not in self or self['slice_id'] != slice['slice_id']: + raise PLCInvalidArgument, "Slice name already in use, %s"%name + + return name + + def validate_instantiation(self, instantiation): + instantiations = [row['instantiation'] for row in SliceInstantiations(self.api)] + if instantiation not in instantiations: + raise PLCInvalidArgument, "No such instantiation state" + + return instantiation + + validate_created = Row.validate_timestamp + + def validate_expires(self, expires): + # N.B.: Responsibility of the caller to ensure that expires is + # not too far into the future. + check_future = not ('is_deleted' in self and self['is_deleted']) + return Row.validate_timestamp(self, expires, check_future = check_future) + + add_person = Row.add_object(Person, 'slice_person') + remove_person = Row.remove_object(Person, 'slice_person') + + add_node = Row.add_object(Node, 'slice_node') + remove_node = Row.remove_object(Node, 'slice_node') + + add_to_node_whitelist = Row.add_object(Node, 'node_slice_whitelist') + delete_from_node_whitelist = Row.remove_object(Node, 'node_slice_whitelist') + + def associate_persons(self, auth, field, value): + """ + Adds persons found in value list to this slice (using AddPersonToSlice). + Deletes persons not found in value list from this slice (using DeletePersonFromSlice). + """ + + assert 'person_ids' in self + assert 'slice_id' in self + assert isinstance(value, list) + + (person_ids, emails) = self.separate_types(value)[0:2] + + # Translate emails into person_ids + if emails: + persons = Persons(self.api, emails, ['person_id']).dict('person_id') + person_ids += persons.keys() + + # Add new ids, remove stale ids + if self['person_ids'] != person_ids: + from PLC.Methods.AddPersonToSlice import AddPersonToSlice + from PLC.Methods.DeletePersonFromSlice import DeletePersonFromSlice + new_persons = set(person_ids).difference(self['person_ids']) + stale_persons = set(self['person_ids']).difference(person_ids) + + for new_person in new_persons: + AddPersonToSlice.__call__(AddPersonToSlice(self.api), auth, new_person, self['slice_id']) + for stale_person in stale_persons: + DeletePersonFromSlice.__call__(DeletePersonFromSlice(self.api), auth, stale_person, self['slice_id']) + + def associate_nodes(self, auth, field, value): + """ + Adds nodes found in value list to this slice (using AddSliceToNodes). + Deletes nodes not found in value list from this slice (using DeleteSliceFromNodes). + """ + + from PLC.Nodes import Nodes + + assert 'node_ids' in self + assert 'slice_id' in self + assert isinstance(value, list) + + (node_ids, hostnames) = self.separate_types(value)[0:2] + + # Translate hostnames into node_ids + if hostnames: + nodes = Nodes(self.api, hostnames, ['node_id']).dict('node_id') + node_ids += nodes.keys() + + # Add new ids, remove stale ids + if self['node_ids'] != node_ids: + from PLC.Methods.AddSliceToNodes import AddSliceToNodes + from PLC.Methods.DeleteSliceFromNodes import DeleteSliceFromNodes + new_nodes = set(node_ids).difference(self['node_ids']) + stale_nodes = set(self['node_ids']).difference(node_ids) + + if new_nodes: + AddSliceToNodes.__call__(AddSliceToNodes(self.api), auth, self['slice_id'], list(new_nodes)) + if stale_nodes: + DeleteSliceFromNodes.__call__(DeleteSliceFromNodes(self.api), auth, self['slice_id'], list(stale_nodes)) + def associate_slice_attributes(self, auth, fields, value): + """ + Deletes slice_attribute_ids not found in value list (using DeleteSliceAttribute). + Adds slice_attributes if slice_fields w/o slice_id is found (using AddSliceAttribute). + Updates slice_attribute if slice_fields w/ slice_id is found (using UpdateSlceiAttribute). + """ + + assert 'slice_attribute_ids' in self + assert isinstance(value, list) + + (attribute_ids, blank, attributes) = self.separate_types(value) + + # There is no way to add attributes by id. They are + # associated with a slice when they are created. + # So we are only looking to delete here + if self['slice_attribute_ids'] != attribute_ids: + from PLC.Methods.DeleteSliceAttribute import DeleteSliceAttribute + stale_attributes = set(self['slice_attribute_ids']).difference(attribute_ids) + + for stale_attribute in stale_attributes: + DeleteSliceAttribute.__call__(DeleteSliceAttribute(self.api), auth, stale_attribute['slice_attribute_id']) + + # If dictionary exists, we are either adding new + # attributes or updating existing ones. + if attributes: + from PLC.Methods.AddSliceAttribute import AddSliceAttribute + from PLC.Methods.UpdateSliceAttribute import UpdateSliceAttribute + + added_attributes = filter(lambda x: 'slice_attribute_id' not in x, attributes) + updated_attributes = filter(lambda x: 'slice_attribute_id' in x, attributes) + + for added_attribute in added_attributes: + if 'attribute_type' in added_attribute: + type = added_attribute['attribute_type'] + elif 'attribute_type_id' in added_attribute: + type = added_attribute['attribute_type_id'] + else: + raise PLCInvalidArgument, "Must specify attribute_type or attribute_type_id" + + if 'value' in added_attribute: + value = added_attribute['value'] + else: + raise PLCInvalidArgument, "Must specify a value" + + if 'node_id' in added_attribute: + node_id = added_attribute['node_id'] + else: + node_id = None + + if 'nodegroup_id' in added_attribute: + nodegroup_id = added_attribute['nodegroup_id'] + else: + nodegroup_id = None + + AddSliceAttribute.__call__(AddSliceAttribute(self.api), auth, self['slice_id'], type, value, node_id, nodegroup_id) + for updated_attribute in updated_attributes: + attribute_id = updated_attribute.pop('slice_attribute_id') + if attribute_id not in self['slice_attribute_ids']: + raise PLCInvalidArgument, "Attribute doesnt belong to this slice" + else: + UpdateSliceAttribute.__call__(UpdateSliceAttribute(self.api), auth, attribute_id, updated_attribute) + + def sync(self, commit = True): + """ + Add or update a slice. + """ + + # Before a new slice is added, delete expired slices + if 'slice_id' not in self: + expired = Slices(self.api, expires = -int(time.time())) + for slice in expired: + slice.delete(commit) + + Row.sync(self, commit) + + def delete(self, commit = True): + """ + Delete existing slice. + """ + + assert 'slice_id' in self + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE slice_id = %d" % \ + (table, self['slice_id'])) + + # Mark as deleted + self['is_deleted'] = True + self.sync(commit) + + +class Slices(Table): + """ + Representation of row(s) from the slices table in the + database. + """ + + def __init__(self, api, slice_filter = None, columns = None, expires = int(time.time())): + Table.__init__(self, api, Slice, columns) + + sql = "SELECT %s FROM view_slices WHERE is_deleted IS False" % \ + ", ".join(self.columns) + + if expires is not None: + if expires >= 0: + sql += " AND expires > %d" % expires + else: + expires = -expires + sql += " AND expires < %d" % expires + + if slice_filter is not None: + if isinstance(slice_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), slice_filter) + strs = filter(lambda x: isinstance(x, StringTypes), slice_filter) + slice_filter = Filter(Slice.fields, {'slice_id': ints, 'name': strs}) + sql += " AND (%s) %s" % slice_filter.sql(api, "OR") + elif isinstance(slice_filter, dict): + slice_filter = Filter(Slice.fields, slice_filter) + sql += " AND (%s) %s" % slice_filter.sql(api, "AND") + elif isinstance (slice_filter, StringTypes): + slice_filter = Filter(Slice.fields, {'name':[slice_filter]}) + sql += " AND (%s) %s" % slice_filter.sql(api, "AND") + elif isinstance (slice_filter, int): + slice_filter = Filter(Slice.fields, {'slice_id':[slice_filter]}) + sql += " AND (%s) %s" % slice_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong slice filter %r"%slice_filter + + self.selectall(sql) diff --git a/PLC/Table.py b/PLC/Table.py new file mode 100644 index 0000000..2362d61 --- /dev/null +++ b/PLC/Table.py @@ -0,0 +1,322 @@ +from types import StringTypes +import time +import calendar + +from PLC.Faults import * +from PLC.Parameter import Parameter + +class Row(dict): + """ + Representation of a row in a database table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + # Set this to the name of the table that stores the row. + table_name = None + + # Set this to the name of the primary key of the table. It is + # assumed that the this key is a sequence if it is not set when + # sync() is called. + primary_key = None + + # Set this to the names of tables that reference this table's + # primary key. + join_tables = [] + + # Set this to a dict of the valid fields of this object and their + # types. Not all fields (e.g., joined fields) may be updated via + # sync(). + fields = {} + + def __init__(self, api, fields = {}): + dict.__init__(self, fields) + self.api = api + + def validate(self): + """ + Validates values. Will validate a value with a custom function + if a function named 'validate_[key]' exists. + """ + + # Warn about mandatory fields + mandatory_fields = self.api.db.fields(self.table_name, notnull = True, hasdef = False) + for field in mandatory_fields: + if not self.has_key(field) or self[field] is None: + raise PLCInvalidArgument, field + " must be specified and cannot be unset in class %s"%self.__class__.__name__ + + # Validate values before committing + for key, value in self.iteritems(): + if value is not None and hasattr(self, 'validate_' + key): + validate = getattr(self, 'validate_' + key) + self[key] = validate(value) + + def separate_types(self, items): + """ + Separate a list of different typed objects. + Return a list for each type (ints, strs and dicts) + """ + + if isinstance(items, (list, tuple, set)): + ints = filter(lambda x: isinstance(x, (int, long)), items) + strs = filter(lambda x: isinstance(x, StringTypes), items) + dicts = filter(lambda x: isinstance(x, dict), items) + return (ints, strs, dicts) + else: + raise PLCInvalidArgument, "Can only separate list types" + + + def associate(self, *args): + """ + Provides a means for high lvl api calls to associate objects + using low lvl calls. + """ + + if len(args) < 3: + raise PLCInvalidArgumentCount, "auth, field, value must be specified" + elif hasattr(self, 'associate_' + args[1]): + associate = getattr(self, 'associate_'+args[1]) + associate(*args) + else: + raise PLCInvalidArguemnt, "No such associate function associate_%s" % args[1] + + def validate_timestamp(self, timestamp, check_future = False): + """ + Validates the specified GMT timestamp string (must be in + %Y-%m-%d %H:%M:%S format) or number (seconds since UNIX epoch, + i.e., 1970-01-01 00:00:00 GMT). If check_future is True, + raises an exception if timestamp is not in the future. Returns + a GMT timestamp string. + """ + + time_format = "%Y-%m-%d %H:%M:%S" + + if isinstance(timestamp, StringTypes): + # calendar.timegm() is the inverse of time.gmtime() + timestamp = calendar.timegm(time.strptime(timestamp, time_format)) + + # Human readable timestamp string + human = time.strftime(time_format, time.gmtime(timestamp)) + + if check_future and timestamp < time.time(): + raise PLCInvalidArgument, "'%s' not in the future" % human + + return human + + def add_object(self, classobj, join_table, columns = None): + """ + Returns a function that can be used to associate this object + with another. + """ + + def add(self, obj, columns = None, commit = True): + """ + Associate with the specified object. + """ + + # Various sanity checks + assert isinstance(self, Row) + assert self.primary_key in self + assert join_table in self.join_tables + assert isinstance(obj, classobj) + assert isinstance(obj, Row) + assert obj.primary_key in obj + assert join_table in obj.join_tables + + # By default, just insert the primary keys of each object + # into the join table. + if columns is None: + columns = {self.primary_key: self[self.primary_key], + obj.primary_key: obj[obj.primary_key]} + + params = [] + for name, value in columns.iteritems(): + params.append(self.api.db.param(name, value)) + + self.api.db.do("INSERT INTO %s (%s) VALUES(%s)" % \ + (join_table, ", ".join(columns), ", ".join(params)), + columns) + + if commit: + self.api.db.commit() + + return add + + add_object = classmethod(add_object) + + def remove_object(self, classobj, join_table): + """ + Returns a function that can be used to disassociate this + object with another. + """ + + def remove(self, obj, commit = True): + """ + Disassociate from the specified object. + """ + + assert isinstance(self, Row) + assert self.primary_key in self + assert join_table in self.join_tables + assert isinstance(obj, classobj) + assert isinstance(obj, Row) + assert obj.primary_key in obj + assert join_table in obj.join_tables + + self_id = self[self.primary_key] + obj_id = obj[obj.primary_key] + + self.api.db.do("DELETE FROM %s WHERE %s = %s AND %s = %s" % \ + (join_table, + self.primary_key, self.api.db.param('self_id', self_id), + obj.primary_key, self.api.db.param('obj_id', obj_id)), + locals()) + + if commit: + self.api.db.commit() + + return remove + + remove_object = classmethod(remove_object) + + def db_fields(self, obj = None): + """ + Return only those fields that can be set or updated directly + (i.e., those fields that are in the primary table (table_name) + for this object, and are not marked as a read-only Parameter. + """ + + if obj is None: + obj = self + + db_fields = self.api.db.fields(self.table_name) + return dict(filter(lambda (key, value): \ + key in db_fields and \ + (key not in self.fields or \ + not isinstance(self.fields[key], Parameter) or \ + not self.fields[key].ro), + obj.items())) + + def __eq__(self, y): + """ + Compare two objects. + """ + + # Filter out fields that cannot be set or updated directly + # (and thus would not affect equality for the purposes of + # deciding if we should sync() or not). + x = self.db_fields() + y = self.db_fields(y) + return dict.__eq__(x, y) + + def sync(self, commit = True, insert = None): + """ + Flush changes back to the database. + """ + + # Validate all specified fields + self.validate() + + # Filter out fields that cannot be set or updated directly + db_fields = self.db_fields() + + # Parameterize for safety + keys = db_fields.keys() + values = [self.api.db.param(key, value) for (key, value) in db_fields.items()] + + # If the primary key (usually an auto-incrementing serial + # identifier) has not been specified, or the primary key is the + # only field in the table, or insert has been forced. + if not self.has_key(self.primary_key) or \ + keys == [self.primary_key] or \ + insert is True: + # Insert new row + sql = "INSERT INTO %s (%s) VALUES (%s)" % \ + (self.table_name, ", ".join(keys), ", ".join(values)) + else: + # Update existing row + columns = ["%s = %s" % (key, value) for (key, value) in zip(keys, values)] + sql = "UPDATE %s SET " % self.table_name + \ + ", ".join(columns) + \ + " WHERE %s = %s" % \ + (self.primary_key, + self.api.db.param(self.primary_key, self[self.primary_key])) + + self.api.db.do(sql, db_fields) + + if not self.has_key(self.primary_key): + self[self.primary_key] = self.api.db.last_insert_id(self.table_name, self.primary_key) + + if commit: + self.api.db.commit() + + def delete(self, commit = True): + """ + Delete row from its primary table, and from any tables that + reference it. + """ + + assert self.primary_key in self + + for table in self.join_tables + [self.table_name]: + if isinstance(table, tuple): + key = table[1] + table = table[0] + else: + key = self.primary_key + + sql = "DELETE FROM %s WHERE %s = %s" % \ + (table, key, + self.api.db.param(self.primary_key, self[self.primary_key])) + + self.api.db.do(sql, self) + + if commit: + self.api.db.commit() + +class Table(list): + """ + Representation of row(s) in a database table. + """ + + def __init__(self, api, classobj, columns = None): + self.api = api + self.classobj = classobj + self.rows = {} + + if columns is None: + columns = classobj.fields + else: + columns = filter(lambda x: x in classobj.fields, columns) + if not columns: + raise PLCInvalidArgument, "No valid return fields specified" + + self.columns = columns + + def sync(self, commit = True): + """ + Flush changes back to the database. + """ + + for row in self: + row.sync(commit) + + def selectall(self, sql, params = None): + """ + Given a list of rows from the database, fill ourselves with + Row objects. + """ + + for row in self.api.db.selectall(sql, params): + obj = self.classobj(self.api, row) + self.append(obj) + + def dict(self, key_field = None): + """ + Return ourself as a dict keyed on key_field. + """ + + if key_field is None: + key_field = self.classobj.primary_key + + return dict([(obj[key_field], obj) for obj in self]) diff --git a/PLC/Test.py b/PLC/Test.py new file mode 100644 index 0000000..4867119 --- /dev/null +++ b/PLC/Test.py @@ -0,0 +1,1460 @@ +#!/usr/bin/python +# +# Test script utility class +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Test.py 5574 2007-10-25 20:33:17Z thierry $ +# + +from pprint import pprint +from string import letters, digits, punctuation +from traceback import print_exc +from optparse import OptionParser +import socket +import base64 +import struct +import os +import xmlrpclib + +from PLC.Shell import Shell + +from random import Random +random = Random() + +def randfloat(min = 0.0, max = 1.0): + return float(min) + (random.random() * (float(max) - float(min))) + +def randint(min = 0, max = 1): + return int(randfloat(min, max + 1)) + +# See "2.2 Characters" in the XML specification: +# +# #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] +# avoiding +# [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF] +# + +ascii_xml_chars = map(unichr, [0x9, 0xA]) +# xmlrpclib uses xml.parsers.expat, which always converts either '\r' +# (#xD) or '\n' (#xA) to '\n'. So avoid using '\r', too, if this is +# still the case. +if xmlrpclib.loads(xmlrpclib.dumps(('\r',)))[0][0] == '\r': + ascii_xml_chars.append('\r') +ascii_xml_chars += map(unichr, xrange(0x20, 0x7F - 1)) +low_xml_chars = list(ascii_xml_chars) +low_xml_chars += map(unichr, xrange(0x84 + 1, 0x86 - 1)) +low_xml_chars += map(unichr, xrange(0x9F + 1, 0xFF)) +valid_xml_chars = list(low_xml_chars) +valid_xml_chars += map(unichr, xrange(0xFF + 1, 0xD7FF)) +valid_xml_chars += map(unichr, xrange(0xE000, 0xFDD0 - 1)) +valid_xml_chars += map(unichr, xrange(0xFDDF + 1, 0xFFFD)) + +def randstr(length, pool = valid_xml_chars, encoding = "utf-8"): + sample = random.sample(pool, min(length, len(pool))) + while True: + s = u''.join(sample) + bytes = len(s.encode(encoding)) + if bytes > length: + sample.pop() + elif bytes < length: + sample += random.sample(pool, min(length - bytes, len(pool))) + random.shuffle(sample) + else: + break + return s + +def randhostname(): + # 1. Each part begins and ends with a letter or number. + # 2. Each part except the last can contain letters, numbers, or hyphens. + # 3. Each part is between 1 and 64 characters, including the trailing dot. + # 4. At least two parts. + # 5. Last part can only contain between 2 and 6 letters. + hostname = 'a' + randstr(61, letters + digits + '-') + '1.' + \ + 'b' + randstr(61, letters + digits + '-') + '2.' + \ + 'c' + randstr(5, letters) + return hostname + +def randpath(length): + parts = [] + for i in range(randint(1, 10)): + parts.append(randstr(randint(1, 30), ascii_xml_chars)) + return u'/'.join(parts)[0:length] + +def randemail(): + return (randstr(100, letters + digits) + "@" + randhostname()).lower() + +def randkey(bits = 2048): + ssh_key_types = ["ssh-dss", "ssh-rsa"] + key_type = random.sample(ssh_key_types, 1)[0] + return ' '.join([key_type, + base64.b64encode(''.join(randstr(bits / 8).encode("utf-8"))), + randemail()]) + +def random_site(): + return { + 'name': randstr(254), + 'abbreviated_name': randstr(50), + 'login_base': randstr(20, letters).lower(), + 'latitude': int(randfloat(-90.0, 90.0) * 1000) / 1000.0, + 'longitude': int(randfloat(-180.0, 180.0) * 1000) / 1000.0, + } + +def random_address_type(): + return { + 'name': randstr(20), + 'description': randstr(254), + } + +def random_address(): + return { + 'line1': randstr(254), + 'line2': randstr(254), + 'line3': randstr(254), + 'city': randstr(254), + 'state': randstr(254), + 'postalcode': randstr(64), + 'country': randstr(128), + } + +def random_person(): + return { + 'first_name': randstr(128), + 'last_name': randstr(128), + 'email': randemail(), + 'bio': randstr(254), + # Accounts are disabled by default + 'enabled': False, + 'password': randstr(254), + } + +def random_key(key_types): + return { + 'key_type': random.sample(key_types, 1)[0], + 'key': randkey() + } + +def random_nodegroup(): + return { + 'name': randstr(50), + 'description': randstr(200), + } + +def random_node(boot_states): + return { + 'hostname': randhostname(), + 'boot_state': random.sample(boot_states, 1)[0], + 'model': randstr(255), + 'version': randstr(64), + } + +def random_nodenetwork(method, type): + nodenetwork_fields = { + 'method': method, + 'type': type, + 'bwlimit': randint(500000, 10000000), + } + + if method != 'dhcp': + ip = randint(0, 0xffffffff) + netmask = (0xffffffff << randint(2, 31)) & 0xffffffff + network = ip & netmask + broadcast = ((ip & netmask) | ~netmask) & 0xffffffff + gateway = randint(network + 1, broadcast - 1) + dns1 = randint(0, 0xffffffff) + + for field in 'ip', 'netmask', 'network', 'broadcast', 'gateway', 'dns1': + nodenetwork_fields[field] = socket.inet_ntoa(struct.pack('>L', locals()[field])) + + return nodenetwork_fields + +def random_pcu(): + return { + 'hostname': randhostname(), + 'ip': socket.inet_ntoa(struct.pack('>L', randint(0, 0xffffffff))), + 'protocol': randstr(16), + 'username': randstr(254), + 'password': randstr(254), + 'notes': randstr(254), + 'model': randstr(32), + } + +def random_conf_file(): + return { + 'enabled': bool(randint()), + 'source': randpath(255), + 'dest': randpath(255), + 'file_permissions': "%#o" % randint(0, 512), + 'file_owner': randstr(32, letters + '_' + digits), + 'file_group': randstr(32, letters + '_' + digits), + 'preinstall_cmd': randpath(100), + 'postinstall_cmd': randpath(100), + 'error_cmd': randpath(100), + 'ignore_cmd_errors': bool(randint()), + 'always_update': bool(randint()), + } + +def random_attribute_type(role_ids): + return { + 'name': randstr(100), + 'description': randstr(254), + 'min_role_id': random.sample(role_ids, 1)[0], + } + +def random_slice(login_base): + return { + 'name': login_base + "_" + randstr(11, letters).lower(), + 'url': "http://" + randhostname() + "/", + 'description': randstr(2048), + } + +class Test: + tiny = { + 'sites': 1, + 'address_types': 1, + 'addresses_per_site': 1, + 'persons_per_site': 1, + 'keys_per_person': 1, + 'nodegroups': 1, + 'nodes_per_site': 1, + 'nodenetworks_per_node': 1, + 'pcus_per_site': 1, + 'conf_files': 1, + 'attribute_types': 1, + 'slices_per_site': 1, + 'attributes_per_slice': 1, + } + + default = { + 'sites': 10, + 'address_types': 2, + 'addresses_per_site': 2, + 'persons_per_site': 10, + 'keys_per_person': 2, + 'nodegroups': 10, + 'nodes_per_site': 2, + 'nodenetworks_per_node': 1, + 'pcus_per_site': 1, + 'conf_files': 10, + 'attribute_types': 10, + 'slices_per_site': 10, + 'attributes_per_slice': 2, + } + + def __init__(self, api, check = True, verbose = True): + self.api = api + self.check = check + self.verbose = verbose + + self.site_ids = [] + self.address_type_ids = [] + self.address_ids = [] + self.person_ids = [] + self.key_ids = [] + self.nodegroup_ids = [] + self.node_ids = [] + self.nodenetwork_ids = [] + self.pcu_ids = [] + self.conf_file_ids = [] + self.attribute_type_ids = [] + self.slice_ids = [] + self.slice_attribute_ids = [] + + def Run(self, **kwds): + """ + Run a complete database and API consistency test. Populates + the database with a set of random entities, updates them, then + deletes them. Examples: + + test.Run() # Defaults + test.Run(**Test.default) # Defaults + test.Run(**Test.tiny) # Tiny set + test.Run(sites = 123, slices_per_site = 4) # Defaults with overrides + """ + + try: + self.Add(**kwds) + self.Update() + finally: + self.Delete() + + def Add(self, **kwds): + """ + Populate the database with a set of random entities. Examples: + + test.populate() # Defaults + test.populate(Test.tiny) # Tiny set + test.populate(sites = 123, slices_per_site = 4) # Defaults with overrides + """ + + params = self.default.copy() + params.update(kwds) + + self.AddSites(params['sites']) + self.AddAddressTypes(params['address_types']) + self.AddAddresses(params['addresses_per_site']) + self.AddPersons(params['persons_per_site']) + self.AddKeys(params['keys_per_person']) + self.AddNodeGroups(params['nodegroups']) + self.AddNodes(params['nodes_per_site']) + self.AddNodeNetworks(params['nodenetworks_per_node']) + self.AddPCUs(params['pcus_per_site']) + self.AddConfFiles(params['conf_files']) + self.AddSliceAttributeTypes(params['attribute_types']) + self.AddSlices(params['slices_per_site']) + self.AddSliceAttributes(params['attributes_per_slice']) + + def Update(self): + self.UpdateSites() + self.UpdateAddressTypes() + self.UpdateAddresses() + self.UpdatePersons() + self.UpdateKeys() + self.UpdateNodeGroups() + self.UpdateNodes() + self.UpdateNodeNetworks() + self.UpdatePCUs() + self.UpdateConfFiles() + self.UpdateSliceAttributeTypes() + self.UpdateSlices() + self.UpdateSliceAttributes() + + def Delete(self): + self.DeleteSliceAttributes() + self.DeleteSlices() + self.DeleteSliceAttributeTypes() + self.DeleteKeys() + self.DeleteConfFiles() + self.DeletePCUs() + self.DeleteNodeNetworks() + self.DeleteNodes() + self.DeletePersons() + self.DeleteNodeGroups() + self.DeleteAddresses() + self.DeleteAddressTypes() + self.DeleteSites() + + def AddSites(self, n = 10): + """ + Add a number of random sites. + """ + + for i in range(n): + # Add site + site_fields = random_site() + site_id = self.api.AddSite(site_fields) + + # Should return a unique site_id + assert site_id not in self.site_ids + self.site_ids.append(site_id) + + # Enable slice creation + site_fields['max_slices'] = randint(1, 10) + self.api.UpdateSite(site_id, site_fields) + + if self.check: + # Check site + site = self.api.GetSites([site_id])[0] + for field in site_fields: + assert site[field] == site_fields[field] + + if self.verbose: + print "Added site", site_id + + def UpdateSites(self): + """ + Make random changes to any sites we may have added. + """ + + for site_id in self.site_ids: + # Update site + site_fields = random_site() + # Do not change login_base + if 'login_base' in site_fields: + del site_fields['login_base'] + self.api.UpdateSite(site_id, site_fields) + + if self.check: + # Check site + site = self.api.GetSites([site_id])[0] + for field in site_fields: + assert site[field] == site_fields[field] + + if self.verbose: + print "Updated site", site_id + + def DeleteSites(self): + """ + Delete any random sites we may have added. + """ + + for site_id in self.site_ids: + self.api.DeleteSite(site_id) + + if self.check: + assert not self.api.GetSites([site_id]) + + if self.verbose: + print "Deleted site", site_id + + if self.check: + assert not self.api.GetSites(self.site_ids) + + self.site_ids = [] + + def AddAddressTypes(self, n = 2): + """ + Add a number of random address types. + """ + + for i in range(n): + address_type_fields = random_address_type() + address_type_id = self.api.AddAddressType(address_type_fields) + + # Should return a unique address_type_id + assert address_type_id not in self.address_type_ids + self.address_type_ids.append(address_type_id) + + if self.check: + # Check address type + address_type = self.api.GetAddressTypes([address_type_id])[0] + for field in address_type_fields: + assert address_type[field] == address_type_fields[field] + + if self.verbose: + print "Added address type", address_type_id + + def UpdateAddressTypes(self): + """ + Make random changes to any address types we may have added. + """ + + for address_type_id in self.address_type_ids: + # Update address_type + address_type_fields = random_address_type() + self.api.UpdateAddressType(address_type_id, address_type_fields) + + if self.check: + # Check address type + address_type = self.api.GetAddressTypes([address_type_id])[0] + for field in address_type_fields: + assert address_type[field] == address_type_fields[field] + + if self.verbose: + print "Updated address_type", address_type_id + + def DeleteAddressTypes(self): + """ + Delete any random address types we may have added. + """ + + for address_type_id in self.address_type_ids: + self.api.DeleteAddressType(address_type_id) + + if self.check: + assert not self.api.GetAddressTypes([address_type_id]) + + if self.verbose: + print "Deleted address type", address_type_id + + if self.check: + assert not self.api.GetAddressTypes(self.address_type_ids) + + self.address_type_ids = [] + + def AddAddresses(self, per_site = 2): + """ + Add a number of random addresses to each site. + """ + + for site_id in self.site_ids: + for i in range(per_site): + address_fields = random_address() + address_id = self.api.AddSiteAddress(site_id, address_fields) + + # Should return a unique address_id + assert address_id not in self.address_ids + self.address_ids.append(address_id) + + # Add random address type + if self.address_type_ids: + for address_type_id in random.sample(self.address_type_ids, 1): + self.api.AddAddressTypeToAddress(address_type_id, address_id) + + if self.check: + # Check address + address = self.api.GetAddresses([address_id])[0] + for field in address_fields: + assert address[field] == address_fields[field] + + if self.verbose: + print "Added address", address_id, "to site", site_id + + def UpdateAddresses(self): + """ + Make random changes to any addresses we may have added. + """ + + for address_id in self.address_ids: + # Update address + address_fields = random_address() + self.api.UpdateAddress(address_id, address_fields) + + if self.check: + # Check address + address = self.api.GetAddresses([address_id])[0] + for field in address_fields: + assert address[field] == address_fields[field] + + if self.verbose: + print "Updated address", address_id + + def DeleteAddresses(self): + """ + Delete any random addresses we may have added. + """ + + for address_id in self.address_ids: + # Remove address types + address = self.api.GetAddresses([address_id])[0] + for address_type_id in address['address_type_ids']: + self.api.DeleteAddressTypeFromAddress(address_type_id, address_id) + + if self.check: + address = self.api.GetAddresses([address_id])[0] + assert not address['address_type_ids'] + + self.api.DeleteAddress(address_id) + + if self.check: + assert not self.api.GetAddresses([address_id]) + + if self.verbose: + print "Deleted address", address_id + + if self.check: + assert not self.api.GetAddresses(self.address_ids) + + self.address_ids = [] + + def AddPersons(self, per_site = 10): + """ + Add a number of random users to each site. + """ + + for site_id in self.site_ids: + for i in range(per_site): + # Add user + person_fields = random_person() + person_id = self.api.AddPerson(person_fields) + + # Should return a unique person_id + assert person_id not in self.person_ids + self.person_ids.append(person_id) + + if self.check: + # Check user + person = self.api.GetPersons([person_id])[0] + for field in person_fields: + if field != 'password': + assert person[field] == person_fields[field] + + auth = {'AuthMethod': "password", + 'Username': person_fields['email'], + 'AuthString': person_fields['password']} + + if self.check: + # Check that user is disabled + try: + assert not self.api.AuthCheck(auth) + except: + pass + + # Add random set of roles + role_ids = random.sample([20, 30, 40], randint(1, 3)) + for role_id in role_ids: + self.api.AddRoleToPerson(role_id, person_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert set(role_ids) == set(person['role_ids']) + + # Enable user + self.api.UpdatePerson(person_id, {'enabled': True}) + + if self.check: + # Check that user is enabled + assert self.api.AuthCheck(auth) + + # Associate user with site + self.api.AddPersonToSite(person_id, site_id) + self.api.SetPersonPrimarySite(person_id, site_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert person['site_ids'][0] == site_id + + if self.verbose: + print "Added user", person_id, "to site", site_id + + def UpdatePersons(self): + """ + Make random changes to any users we may have added. + """ + + for person_id in self.person_ids: + # Update user + person_fields = random_person() + # Keep them enabled + person_fields['enabled'] = True + self.api.UpdatePerson(person_id, person_fields) + + if self.check: + # Check user + person = self.api.GetPersons([person_id])[0] + for field in person_fields: + if field != 'password': + assert person[field] == person_fields[field] + + if self.verbose: + print "Updated person", person_id + + person = self.api.GetPersons([person_id])[0] + + # Associate user with a random set of sites + site_ids = random.sample(self.site_ids, randint(0, len(self.site_ids))) + for site_id in (set(site_ids) - set(person['site_ids'])): + self.api.AddPersonToSite(person_id, site_id) + for site_id in (set(person['site_ids']) - set(site_ids)): + self.api.DeletePersonFromSite(person_id, site_id) + + if site_ids: + self.api.SetPersonPrimarySite(person_id, site_ids[0]) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert set(site_ids) == set(person['site_ids']) + + if self.verbose: + print "Updated person", person_id, "to sites", site_ids + + def DeletePersons(self): + """ + Delete any random users we may have added. + """ + + for person_id in self.person_ids: + # Remove from site + person = self.api.GetPersons([person_id])[0] + for site_id in person['site_ids']: + self.api.DeletePersonFromSite(person_id, site_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert not person['site_ids'] + + # Revoke roles + for role_id in person['role_ids']: + self.api.DeleteRoleFromPerson(role_id, person_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert not person['role_ids'] + + # Disable account + self.api.UpdatePerson(person_id, {'enabled': False}) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert not person['enabled'] + + # Delete account + self.api.DeletePerson(person_id) + + if self.check: + assert not self.api.GetPersons([person_id]) + + if self.verbose: + print "Deleted user", person_id + + if self.check: + assert not self.api.GetPersons(self.person_ids) + + self.person_ids = [] + + def AddKeys(self, per_person = 2): + """ + Add a number of random keys to each user. + """ + + key_types = self.api.GetKeyTypes() + if not key_types: + raise Exception, "No key types" + + for person_id in self.person_ids: + for i in range(per_person): + # Add key + key_fields = random_key(key_types) + key_id = self.api.AddPersonKey(person_id, key_fields) + + # Should return a unique key_id + assert key_id not in self.key_ids + self.key_ids.append(key_id) + + if self.check: + # Check key + key = self.api.GetKeys([key_id])[0] + for field in key_fields: + assert key[field] == key_fields[field] + + # Add and immediately blacklist a key + key_fields = random_key(key_types) + key_id = self.api.AddPersonKey(person_id, key_fields) + + self.api.BlacklistKey(key_id) + + # Is effectively deleted + assert not self.api.GetKeys([key_id]) + + # Cannot be added again + try: + key_id = self.api.AddPersonKey(person_id, key_fields) + assert False + except Exception, e: + pass + + if self.verbose: + print "Added key", key_id, "to user", person_id + + def UpdateKeys(self): + """ + Make random changes to any keys we may have added. + """ + + key_types = self.api.GetKeyTypes() + if not key_types: + raise Exception, "No key types" + + for key_id in self.key_ids: + # Update key + key_fields = random_key(key_types) + self.api.UpdateKey(key_id, key_fields) + + if self.check: + # Check key + key = self.api.GetKeys([key_id])[0] + for field in key_fields: + assert key[field] == key_fields[field] + + if self.verbose: + print "Updated key", key_id + + def DeleteKeys(self): + """ + Delete any random keys we may have added. + """ + + for key_id in self.key_ids: + self.api.DeleteKey(key_id) + + if self.check: + assert not self.api.GetKeys([key_id]) + + if self.verbose: + print "Deleted key", key_id + + if self.check: + assert not self.api.GetKeys(self.key_ids) + + self.key_ids = [] + + def AddNodeGroups(self, n = 10): + """ + Add a number of random node groups. + """ + + for i in range(n): + # Add node group + nodegroup_fields = random_nodegroup() + nodegroup_id = self.api.AddNodeGroup(nodegroup_fields) + + # Should return a unique nodegroup_id + assert nodegroup_id not in self.nodegroup_ids + self.nodegroup_ids.append(nodegroup_id) + + if self.check: + # Check node group + nodegroup = self.api.GetNodeGroups([nodegroup_id])[0] + for field in nodegroup_fields: + assert nodegroup[field] == nodegroup_fields[field] + + if self.verbose: + print "Added node group", nodegroup_id + + def UpdateNodeGroups(self): + """ + Make random changes to any node groups we may have added. + """ + + for nodegroup_id in self.nodegroup_ids: + # Update nodegroup + nodegroup_fields = random_nodegroup() + self.api.UpdateNodeGroup(nodegroup_id, nodegroup_fields) + + if self.check: + # Check nodegroup + nodegroup = self.api.GetNodeGroups([nodegroup_id])[0] + for field in nodegroup_fields: + assert nodegroup[field] == nodegroup_fields[field] + + if self.verbose: + print "Updated node group", nodegroup_id + + def DeleteNodeGroups(self): + """ + Delete any random node groups we may have added. + """ + + for nodegroup_id in self.nodegroup_ids: + self.api.DeleteNodeGroup(nodegroup_id) + + if self.check: + assert not self.api.GetNodeGroups([nodegroup_id]) + + if self.verbose: + print "Deleted node group", nodegroup_id + + if self.check: + assert not self.api.GetNodeGroups(self.nodegroup_ids) + + self.nodegroup_ids = [] + + def AddNodes(self, per_site = 2): + """ + Add a number of random nodes to each site. Each node will also + be added to a random node group if AddNodeGroups() was + previously run. + """ + + boot_states = self.api.GetBootStates() + if not boot_states: + raise Exception, "No boot states" + + for site_id in self.site_ids: + for i in range(per_site): + # Add node + node_fields = random_node(boot_states) + node_id = self.api.AddNode(site_id, node_fields) + + # Should return a unique node_id + assert node_id not in self.node_ids + self.node_ids.append(node_id) + + # Add to a random set of node groups + nodegroup_ids = random.sample(self.nodegroup_ids, randint(0, len(self.nodegroup_ids))) + for nodegroup_id in nodegroup_ids: + self.api.AddNodeToNodeGroup(node_id, nodegroup_id) + + if self.check: + # Check node + node = self.api.GetNodes([node_id])[0] + for field in node_fields: + assert node[field] == node_fields[field] + + if self.verbose: + print "Added node", node_id + + def UpdateNodes(self): + """ + Make random changes to any nodes we may have added. + """ + + boot_states = self.api.GetBootStates() + if not boot_states: + raise Exception, "No boot states" + + for node_id in self.node_ids: + # Update node + node_fields = random_node(boot_states) + self.api.UpdateNode(node_id, node_fields) + + node = self.api.GetNodes([node_id])[0] + + # Add to a random set of node groups + nodegroup_ids = random.sample(self.nodegroup_ids, randint(0, len(self.nodegroup_ids))) + for nodegroup_id in (set(nodegroup_ids) - set(node['nodegroup_ids'])): + self.api.AddNodeToNodeGroup(node_id, nodegroup_id) + for nodegroup_id in (set(node['nodegroup_ids']) - set(nodegroup_ids)): + self.api.DeleteNodeFromNodeGroup(node_id, nodegroup_id) + + if self.check: + # Check node + node = self.api.GetNodes([node_id])[0] + for field in node_fields: + assert node[field] == node_fields[field] + assert set(nodegroup_ids) == set(node['nodegroup_ids']) + + if self.verbose: + print "Updated node", node_id + print "Added node", node_id, "to node groups", nodegroup_ids + + def DeleteNodes(self): + """ + Delete any random nodes we may have added. + """ + + for node_id in self.node_ids: + # Remove from node groups + node = self.api.GetNodes([node_id])[0] + for nodegroup_id in node['nodegroup_ids']: + self.api.DeleteNodeFromNodeGroup(node_id, nodegroup_id) + + if self.check: + node = self.api.GetNodes([node_id])[0] + assert not node['nodegroup_ids'] + + self.api.DeleteNode(node_id) + + if self.check: + assert not self.api.GetNodes([node_id]) + + if self.verbose: + print "Deleted node", node_id + + if self.check: + assert not self.api.GetNodes(self.node_ids) + + self.node_ids = [] + + def AddNodeNetworks(self, per_node = 1): + """ + Add a number of random network interfaces to each node. + """ + + network_methods = self.api.GetNetworkMethods() + if not network_methods: + raise Exception, "No network methods" + + network_types = self.api.GetNetworkTypes() + if not network_types: + raise Exception, "No network types" + + for node_id in self.node_ids: + for i in range(per_node): + method = random.sample(network_methods, 1)[0] + type = random.sample(network_types, 1)[0] + + # Add node network + nodenetwork_fields = random_nodenetwork(method, type) + nodenetwork_id = self.api.AddNodeNetwork(node_id, nodenetwork_fields) + + # Should return a unique nodenetwork_id + assert nodenetwork_id not in self.nodenetwork_ids + self.nodenetwork_ids.append(nodenetwork_id) + + if self.check: + # Check node network + nodenetwork = self.api.GetNodeNetworks([nodenetwork_id])[0] + for field in nodenetwork_fields: + assert nodenetwork[field] == nodenetwork_fields[field] + + if self.verbose: + print "Added node network", nodenetwork_id, "to node", node_id + + def UpdateNodeNetworks(self): + """ + Make random changes to any network interfaces we may have added. + """ + + network_methods = self.api.GetNetworkMethods() + if not network_methods: + raise Exception, "No network methods" + + network_types = self.api.GetNetworkTypes() + if not network_types: + raise Exception, "No network types" + + for nodenetwork_id in self.nodenetwork_ids: + method = random.sample(network_methods, 1)[0] + type = random.sample(network_types, 1)[0] + + # Update nodenetwork + nodenetwork_fields = random_nodenetwork(method, type) + self.api.UpdateNodeNetwork(nodenetwork_id, nodenetwork_fields) + + if self.check: + # Check nodenetwork + nodenetwork = self.api.GetNodeNetworks([nodenetwork_id])[0] + for field in nodenetwork_fields: + assert nodenetwork[field] == nodenetwork_fields[field] + + if self.verbose: + print "Updated node network", nodenetwork_id + + def DeleteNodeNetworks(self): + """ + Delete any random network interfaces we may have added. + """ + + for nodenetwork_id in self.nodenetwork_ids: + self.api.DeleteNodeNetwork(nodenetwork_id) + + if self.check: + assert not self.api.GetNodeNetworks([nodenetwork_id]) + + if self.verbose: + print "Deleted node network", nodenetwork_id + + if self.check: + assert not self.api.GetNodeNetworks(self.nodenetwork_ids) + + self.nodenetwork_ids = [] + + def AddPCUs(self, per_site = 1): + """ + Add a number of random PCUs to each site. Each node at the + site will be added to a port on the PCU if AddNodes() was + previously run. + """ + + for site_id in self.site_ids: + for i in range(per_site): + # Add PCU + pcu_fields = random_pcu() + pcu_id = self.api.AddPCU(site_id, pcu_fields) + + # Should return a unique pcu_id + assert pcu_id not in self.pcu_ids + self.pcu_ids.append(pcu_id) + + # Add each node at this site to a different port on this PCU + site = self.api.GetSites([site_id])[0] + port = randint(1, 10) + for node_id in site['node_ids']: + self.api.AddNodeToPCU(node_id, pcu_id, port) + port += 1 + + if self.check: + # Check PCU + pcu = self.api.GetPCUs([pcu_id])[0] + for field in pcu_fields: + assert pcu[field] == pcu_fields[field] + + if self.verbose: + print "Added PCU", pcu_id, "to site", site_id + + def UpdatePCUs(self): + """ + Make random changes to any PCUs we may have added. + """ + + for pcu_id in self.pcu_ids: + # Update PCU + pcu_fields = random_pcu() + self.api.UpdatePCU(pcu_id, pcu_fields) + + if self.check: + # Check PCU + pcu = self.api.GetPCUs([pcu_id])[0] + for field in pcu_fields: + assert pcu[field] == pcu_fields[field] + + if self.verbose: + print "Updated PCU", pcu_id + + def DeletePCUs(self): + """ + Delete any random nodes we may have added. + """ + + for pcu_id in self.pcu_ids: + # Remove nodes from PCU + pcu = self.api.GetPCUs([pcu_id])[0] + for node_id in pcu['node_ids']: + self.api.DeleteNodeFromPCU(node_id, pcu_id) + + if self.check: + pcu = self.api.GetPCUs([pcu_id])[0] + assert not pcu['node_ids'] + + self.api.DeletePCU(pcu_id) + + if self.check: + assert not self.api.GetPCUs([pcu_id]) + + if self.verbose: + print "Deleted PCU", pcu_id + + if self.check: + assert not self.api.GetPCUs(self.pcu_ids) + + self.pcu_ids = [] + + def AddConfFiles(self, n = 10): + """ + Add a number of random global configuration files. + """ + + conf_files = [] + + for i in range(n): + # Add a random configuration file + conf_files.append(random_conf_file()) + + if n: + # Add a nodegroup override file + nodegroup_conf_file = conf_files[0].copy() + nodegroup_conf_file['source'] = randpath(255) + conf_files.append(nodegroup_conf_file) + + # Add a node override file + node_conf_file = conf_files[0].copy() + node_conf_file['source'] = randpath(255) + conf_files.append(node_conf_file) + + for conf_file_fields in conf_files: + conf_file_id = self.api.AddConfFile(conf_file_fields) + + # Should return a unique conf_file_id + assert conf_file_id not in self.conf_file_ids + self.conf_file_ids.append(conf_file_id) + + # Add to nodegroup + if conf_file_fields == nodegroup_conf_file and self.nodegroup_ids: + nodegroup_id = random.sample(self.nodegroup_ids, 1)[0] + self.api.AddConfFileToNodeGroup(conf_file_id, nodegroup_id) + else: + nodegroup_id = None + + # Add to node + if conf_file_fields == node_conf_file and self.node_ids: + node_id = random.sample(self.node_ids, 1)[0] + self.api.AddConfFileToNode(conf_file_id, node_id) + else: + node_id = None + + if self.check: + # Check configuration file + conf_file = self.api.GetConfFiles([conf_file_id])[0] + for field in conf_file_fields: + assert conf_file[field] == conf_file_fields[field] + + if self.verbose: + print "Added configuration file", conf_file_id, + if nodegroup_id is not None: + print "to node group", nodegroup_id, + elif node_id is not None: + print "to node", node_id, + print + + def UpdateConfFiles(self): + """ + Make random changes to any configuration files we may have added. + """ + + for conf_file_id in self.conf_file_ids: + # Update configuration file + conf_file_fields = random_conf_file() + # Do not update dest so that it remains an override if set + if 'dest' in conf_file_fields: + del conf_file_fields['dest'] + self.api.UpdateConfFile(conf_file_id, conf_file_fields) + + if self.check: + # Check configuration file + conf_file = self.api.GetConfFiles([conf_file_id])[0] + for field in conf_file_fields: + assert conf_file[field] == conf_file_fields[field] + + if self.verbose: + print "Updated configuration file", conf_file_id + + def DeleteConfFiles(self): + """ + Delete any random configuration files we may have added. + """ + + for conf_file_id in self.conf_file_ids: + self.api.DeleteConfFile(conf_file_id) + + if self.check: + assert not self.api.GetConfFiles([conf_file_id]) + + if self.verbose: + print "Deleted configuration file", conf_file_id + + if self.check: + assert not self.api.GetConfFiles(self.conf_file_ids) + + self.conf_file_ids = [] + + def AddSliceAttributeTypes(self, n = 10): + """ + Add a number of random slice attribute types. + """ + + roles = self.api.GetRoles() + if not roles: + raise Exception, "No roles" + role_ids = [role['role_id'] for role in roles] + + for i in range(n): + attribute_type_fields = random_attribute_type(role_ids) + attribute_type_id = self.api.AddSliceAttributeType(attribute_type_fields) + + # Should return a unique attribute_type_id + assert attribute_type_id not in self.attribute_type_ids + self.attribute_type_ids.append(attribute_type_id) + + if self.check: + # Check slice attribute type + attribute_type = self.api.GetSliceAttributeTypes([attribute_type_id])[0] + for field in attribute_type_fields: + assert attribute_type[field] == attribute_type_fields[field] + + if self.verbose: + print "Added slice attribute type", attribute_type_id + + def UpdateSliceAttributeTypes(self): + """ + Make random changes to any slice attribute types we may have added. + """ + + roles = self.api.GetRoles() + if not roles: + raise Exception, "No roles" + role_ids = [role['role_id'] for role in roles] + + for attribute_type_id in self.attribute_type_ids: + # Update slice attribute type + attribute_type_fields = random_attribute_type(role_ids) + self.api.UpdateSliceAttributeType(attribute_type_id, attribute_type_fields) + + if self.check: + # Check slice attribute type + attribute_type = self.api.GetSliceAttributeTypes([attribute_type_id])[0] + for field in attribute_type_fields: + assert attribute_type[field] == attribute_type_fields[field] + + if self.verbose: + print "Updated slice attribute type", attribute_type_id + + def DeleteSliceAttributeTypes(self): + """ + Delete any random slice attribute types we may have added. + """ + + for attribute_type_id in self.attribute_type_ids: + self.api.DeleteSliceAttributeType(attribute_type_id) + + if self.check: + assert not self.api.GetSliceAttributeTypes([attribute_type_id]) + + if self.verbose: + print "Deleted slice attribute type", attribute_type_id + + if self.check: + assert not self.api.GetSliceAttributeTypes(self.attribute_type_ids) + + self.attribute_type_ids = [] + + def AddSlices(self, per_site = 10): + """ + Add a number of random slices per site. + """ + + for site in self.api.GetSites(self.site_ids): + for i in range(min(per_site, site['max_slices'])): + # Add slice + slice_fields = random_slice(site['login_base']) + slice_id = self.api.AddSlice(slice_fields) + + # Should return a unique slice_id + assert slice_id not in self.slice_ids + self.slice_ids.append(slice_id) + + # Add slice to a random set of nodes + node_ids = random.sample(self.node_ids, randint(0, len(self.node_ids))) + if node_ids: + self.api.AddSliceToNodes(slice_id, node_ids) + + # Add random set of site users to slice + person_ids = random.sample(site['person_ids'], randint(0, len(site['person_ids']))) + for person_id in person_ids: + self.api.AddPersonToSlice(person_id, slice_id) + + if self.check: + # Check slice + slice = self.api.GetSlices([slice_id])[0] + for field in slice_fields: + assert slice[field] == slice_fields[field] + + assert set(node_ids) == set(slice['node_ids']) + assert set(person_ids) == set(slice['person_ids']) + + if self.verbose: + print "Added slice", slice_id, "to site", site['site_id'], + if node_ids: + print "and nodes", node_ids, + print + if person_ids: + print "Added users", site['person_ids'], "to slice", slice_id + + def UpdateSlices(self): + """ + Make random changes to any slices we may have added. + """ + + for slice_id in self.slice_ids: + # Update slice + slice_fields = random_slice("unused") + # Cannot change slice name + if 'name' in slice_fields: + del slice_fields['name'] + self.api.UpdateSlice(slice_id, slice_fields) + + slice = self.api.GetSlices([slice_id])[0] + + # Add slice to a random set of nodes + node_ids = random.sample(self.node_ids, randint(0, len(self.node_ids))) + self.api.AddSliceToNodes(slice_id, list(set(node_ids) - set(slice['node_ids']))) + self.api.DeleteSliceFromNodes(slice_id, list(set(slice['node_ids']) - set(node_ids))) + + # Add random set of users to slice + person_ids = random.sample(self.person_ids, randint(0, len(self.person_ids))) + for person_id in (set(person_ids) - set(slice['person_ids'])): + self.api.AddPersonToSlice(person_id, slice_id) + for person_id in (set(slice['person_ids']) - set(person_ids)): + self.api.DeletePersonFromSlice(person_id, slice_id) + + if self.check: + slice = self.api.GetSlices([slice_id])[0] + for field in slice_fields: + assert slice[field] == slice_fields[field] + assert set(node_ids) == set(slice['node_ids']) + assert set(person_ids) == set(slice['person_ids']) + + if self.verbose: + print "Updated slice", slice_id + print "Added nodes", node_ids, "to slice", slice_id + print "Added persons", person_ids, "to slice", slice_id + + def DeleteSlices(self): + """ + Delete any random slices we may have added. + """ + + for slice_id in self.slice_ids: + self.api.DeleteSlice(slice_id) + + if self.check: + assert not self.api.GetSlices([slice_id]) + + if self.verbose: + print "Deleted slice", slice_id + + if self.check: + assert not self.api.GetSlices(self.slice_ids) + + self.slice_ids = [] + + def AddSliceAttributes(self, per_slice = 2): + """ + Add a number of random slices per site. + """ + + if not self.attribute_type_ids: + return + + for slice_id in self.slice_ids: + slice = self.api.GetSlices([slice_id])[0] + + for i in range(per_slice): + # Set a random slice/sliver attribute + for attribute_type_id in random.sample(self.attribute_type_ids, 1): + value = randstr(16, letters + '_' + digits) + # Make it a sliver attribute with 50% probability + if slice['node_ids']: + node_id = random.sample(slice['node_ids'] + [None] * len(slice['node_ids']), 1)[0] + else: + node_id = None + + # Add slice attribute + if node_id is None: + slice_attribute_id = self.api.AddSliceAttribute(slice_id, attribute_type_id, value) + else: + slice_attribute_id = self.api.AddSliceAttribute(slice_id, attribute_type_id, value, node_id) + + # Should return a unique slice_attribute_id + assert slice_attribute_id not in self.slice_attribute_ids + self.slice_attribute_ids.append(slice_attribute_id) + + if self.check: + # Check slice attribute + slice_attribute = self.api.GetSliceAttributes([slice_attribute_id])[0] + for field in 'attribute_type_id', 'slice_id', 'node_id', 'slice_attribute_id', 'value': + assert slice_attribute[field] == locals()[field] + + if self.verbose: + print "Added slice attribute", slice_attribute_id, "of type", attribute_type_id, + if node_id is not None: + print "to node", node_id, + print + + def UpdateSliceAttributes(self): + """ + Make random changes to any slice attributes we may have added. + """ + + for slice_attribute_id in self.slice_attribute_ids: + # Update slice attribute + value = randstr(16, letters + '_' + digits) + self.api.UpdateSliceAttribute(slice_attribute_id, value) + + # Check slice attribute again + slice_attribute = self.api.GetSliceAttributes([slice_attribute_id])[0] + assert slice_attribute['value'] == value + + if self.verbose: + print "Updated slice attribute", slice_attribute_id + + def DeleteSliceAttributes(self): + """ + Delete any random slice attributes we may have added. + """ + + for slice_attribute_id in self.slice_attribute_ids: + self.api.DeleteSliceAttribute(slice_attribute_id) + + if self.check: + assert not self.api.GetSliceAttributes([slice_attribute_id]) + + if self.verbose: + print "Deleted slice attribute", slice_attribute_id + + if self.check: + assert not self.api.GetSliceAttributes(self.slice_attribute_ids) + + self.slice_attribute_ids = [] + +def main(): + parser = OptionParser() + parser.add_option("-c", "--check", action = "store_true", default = False, help = "Check most actions (default: %default)") + parser.add_option("-q", "--quiet", action = "store_true", default = False, help = "Be quiet (default: %default)") + parser.add_option("-t", "--tiny", action = "store_true", default = False, help = "Run a tiny test (default: %default)") + (options, args) = parser.parse_args() + + test = Test(api = Shell(), + check = options.check, + verbose = not options.quiet) + + if options.tiny: + params = Test.tiny + else: + params = Test.default + + test.Run(**params) + +if __name__ == "__main__": + main() diff --git a/PLC/__init__.py b/PLC/__init__.py new file mode 100644 index 0000000..d5ddda8 --- /dev/null +++ b/PLC/__init__.py @@ -0,0 +1,48 @@ +all = """ +Addresses +AddressTypes +API +Auth +Boot +BootStates +ConfFiles +Config +Debug +EventObjects +Events +Faults +Filter +GPG +InitScripts +Keys +KeyTypes +Messages +Method +NetworkMethods +NetworkTypes +NodeGroups +NodeNetworkSettings +NodeNetworkSettingTypes +NodeNetworks +Nodes +Parameter +PCUProtocolTypes +PCUs +PCUTypes +Peers +Persons +POD +PostgreSQL +PyCurl +Roles +sendmail +Sessions +Shell +Sites +SliceAttributes +SliceAttributeTypes +SliceInstantiations +Slices +Table +Test +""".split() diff --git a/PLC/sendmail.py b/PLC/sendmail.py new file mode 100644 index 0000000..cab0ae6 --- /dev/null +++ b/PLC/sendmail.py @@ -0,0 +1,98 @@ +import os +import sys +import pprint +from types import StringTypes +from email.MIMEText import MIMEText +from email.Header import Header +from smtplib import SMTP + +from PLC.Debug import log +from PLC.Faults import * + +def sendmail(api, To, Subject, Body, From = None, Cc = None, Bcc = None): + """ + Uses sendmail (must be installed and running locally) to send a + message to the specified recipients. If the API is running under + mod_python, the apache user must be listed in e.g., + /etc/mail/trusted-users. + + To, Cc, and Bcc may be addresses or lists of addresses. Each + address may be either a plain text address or a tuple of (name, + address). + """ + + # Fix up defaults + if not isinstance(To, list): + To = [To] + if Cc is not None and not isinstance(Cc, list): + Cc = [Cc] + if Bcc is not None and not isinstance(Bcc, list): + Bcc = [Bcc] + if From is None: + From = ("%s Support" % api.config.PLC_NAME, + api.config.PLC_MAIL_SUPPORT_ADDRESS) + + # Create a MIME-encoded UTF-8 message + msg = MIMEText(Body.encode(api.encoding), _charset = api.encoding) + + # Unicode subject headers are automatically encoded correctly + msg['Subject'] = Subject + + def encode_addresses(addresses, header_name = None): + """ + Unicode address headers are automatically encoded by + email.Header, but not correctly. The correct way is to put the + textual name inside quotes and the address inside brackets: + + To: "=?utf-8?b?encoded" + + Each address in addrs may be a tuple of (name, address) or + just an address. Returns a tuple of (header, addrlist) + representing the encoded header text and the list of plain + text addresses. + """ + + header = [] + addrs = [] + + for addr in addresses: + if isinstance(addr, tuple): + (name, addr) = addr + try: + name = name.encode('ascii') + header.append('%s <%s>' % (name, addr)) + except: + h = Header(name, charset = api.encoding, header_name = header_name) + header.append('"%s" <%s>' % (h.encode(), addr)) + else: + header.append(addr) + addrs.append(addr) + + return (", ".join(header), addrs) + + (msg['From'], from_addrs) = encode_addresses([From], 'From') + (msg['To'], to_addrs) = encode_addresses(To, 'To') + + if Cc is not None: + (msg['Cc'], cc_addrs) = encode_addresses(Cc, 'Cc') + to_addrs += cc_addrs + + if Bcc is not None: + (unused, bcc_addrs) = encode_addresses(Bcc, 'Bcc') + to_addrs += bcc_addrs + + # Needed to pass some spam filters + msg['Reply-To'] = msg['From'] + msg['X-Mailer'] = "Python/" + sys.version.split(" ")[0] + + if not api.config.PLC_MAIL_ENABLED: + print >> log, "From: %(From)s, To: %(To)s, Subject: %(Subject)s" % msg + return + + s = SMTP() + s.connect() + rejected = s.sendmail(from_addrs[0], to_addrs, msg.as_string(), rcpt_options = ["NOTIFY=NEVER"]) + s.close() + + if rejected: + raise PLCAPIError, "Error sending message to " + ", ".join(rejected.keys()) diff --git a/PLCAPI.spec b/PLCAPI.spec new file mode 100644 index 0000000..f96be93 --- /dev/null +++ b/PLCAPI.spec @@ -0,0 +1,82 @@ +Summary: PlanetLab Central API +Name: PLCAPI +Version: 4.1 +Release: 3%{?pldistro:.%{pldistro}}%{?date:.%{date}} +License: PlanetLab +Group: System Environment/Daemons +URL: http://cvs.planet-lab.org/cvs/new_plc_api +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root + +Obsoletes: plcapilib + +# We use set everywhere +Requires: python >= 2.4 + +# We use psycopg2 +BuildRequires: postgresql-devel + +# Standard xmlrpc.so that ships with PHP does not marshal NULL +BuildRequires: php-devel +Obsoletes: php-xmlrpc +Provides: php-xmlrpc + +# OpenJade does not honor XML catalog files and tries to access +# www.oasis-open.org even if DTDs are locally installed. Disable +# documentation generation for now. +# BuildRequires: docbook-dtds, docbook-utils-pdf + +# PostgreSQL and SOAPpy are necessary to run the API server, but not +# plcsh. Since the only supported method of running the server is via +# MyPLC anyway, don't be so stringent about binary requirements, in +# case people want to install this package just for plcsh. +# Requires: postgresql-server, SOAPpy +AutoReqProv: no + +%description +The PLCAPI package provides an XML-RPC and SOAP API for accessing the +PlanetLab Central (PLC) database. The API may be accessed directly via +the Python shell program plcsh, through a toy standalone server, or +through Apache mod_python. + +%prep +%setup -q + +%build +# Build __init__.py metafiles and PHP API. Do not build documentation +# for now. +%{__make} %{?_smp_mflags} subdirs="php php/xmlrpc" + +%install +rm -rf $RPM_BUILD_ROOT +%{__make} %{?_smp_mflags} install DESTDIR="$RPM_BUILD_ROOT" datadir="%{_datadir}" bindir="%{_bindir}" + +# Install shell symlink +mkdir -p $RPM_BUILD_ROOT/%{_bindir} +ln -s %{_datadir}/plc_api/plcsh $RPM_BUILD_ROOT/%{_bindir}/plcsh + +mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/php.d +cat > $RPM_BUILD_ROOT/%{_sysconfdir}/php.d/xmlrpc.ini < - +- Initial build. + diff --git a/Server.py b/Server.py new file mode 100755 index 0000000..84c3360 --- /dev/null +++ b/Server.py @@ -0,0 +1,105 @@ +#!/usr/bin/python +# +# Simple standalone HTTP server for testing PLCAPI +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Server.py,v 1.3 2006/10/25 20:33:07 mlhuang Exp $ +# + +import os +import sys +import getopt +import traceback +import BaseHTTPServer + +# Append PLC to the system path +sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0]))) + +from PLC.API import PLCAPI + +class PLCAPIRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): + """ + Simple standalone HTTP request handler for testing PLCAPI. + """ + + def do_POST(self): + try: + # Read request + request = self.rfile.read(int(self.headers["Content-length"])) + + # Handle request + response = self.server.api.handle(self.client_address, request) + + # Write response + self.send_response(200) + self.send_header("Content-type", "text/xml") + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + + self.wfile.flush() + self.connection.shutdown(1) + + except Exception, e: + # Log error + sys.stderr.write(traceback.format_exc()) + sys.stderr.flush() + + def do_GET(self): + self.send_response(200) + self.send_header("Content-type", 'text/html') + self.end_headers() + self.wfile.write(""" + +PLCAPI XML-RPC/SOAP Interface + +

PLCAPI XML-RPC/SOAP Interface

+

Please use XML-RPC or SOAP to access the PLCAPI.

+ +""") + +class PLCAPIServer(BaseHTTPServer.HTTPServer): + """ + Simple standalone HTTP server for testing PLCAPI. + """ + + def __init__(self, addr, config): + self.api = PLCAPI(config) + self.allow_reuse_address = 1 + BaseHTTPServer.HTTPServer.__init__(self, addr, PLCAPIRequestHandler) + +# Defaults +addr = "0.0.0.0" +port = 8000 +config = "/etc/planetlab/plc_config" + +def usage(): + print "Usage: %s [OPTION]..." % sys.argv[0] + print "Options:" + print " -p PORT, --port=PORT TCP port number to listen on (default: %d)" % port + print " -f FILE, --config=FILE PLC configuration file (default: %s)" % config + print " -h, --help This message" + sys.exit(1) + +# Get options +try: + (opts, argv) = getopt.getopt(sys.argv[1:], "p:f:h", ["port=", "config=", "help"]) +except getopt.GetoptError, err: + print "Error: " + err.msg + usage() + +for (opt, optval) in opts: + if opt == "-p" or opt == "--port": + try: + port = int(optval) + except ValueError: + usage() + elif opt == "-f" or opt == "--config": + config = optval + elif opt == "-h" or opt == "--help": + usage() + +# Start server +PLCAPIServer((addr, port), config).serve_forever() diff --git a/TODO b/TODO new file mode 100644 index 0000000..95ccdec --- /dev/null +++ b/TODO @@ -0,0 +1,31 @@ +* Event logging + * In the current API, every call is logged and certain interesting + events are logged in the events table. I haven't implemented event + logging yet in the new API. + +* Tests + * With Shell.py, it should be easy to write a large set of tests. I've + thought about writing a SQLite DB backend so that MyPLC/PostgreSQL + doesn't have to be setup in order for the tests to be run. But there + are some technical limitations to SQLite. It would probably be best + to run the testsuite against MyPLC for now. + +* Authentication + * Need to implement node and certificate/federation authentication. + * Need to (re)implement "capability" (i.e. trusted host) + authentication. Maybe implement it in the same way as node + authentication. + +* Anonymous functions + * Implement anonymous functions for now for backward compatibility, + but get rid of them as soon as possible + +* Hierarchical layout + * Probably need to organize the functions inside PLC/Methods/ + +* Deletion + * Need to come up with a sane, consistent principal deletion policy. + +* Validation + * Need to come up with a policy (truncation? fault?) for dealing with + variable length strings. diff --git a/Test.py b/Test.py new file mode 100755 index 0000000..3e2e5aa --- /dev/null +++ b/Test.py @@ -0,0 +1,281 @@ +#!/usr/bin/python +# +# Test script for peer caching +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Test.py,v 1.23 2007/09/14 15:34:01 mef Exp $ +# + +""" +Test script for peer caching. Intended for testing multiple PLCs +running on the same machine in different chroots. Here is how I set +things up after installing and configuring MyPLC: + +# Shut down MyPLC +service plc stop + +# Copy to /plc2 +cp -ra /plc /plc2 +ln -sf plc /etc/init.d/plc2 +echo 'PLC_ROOT=/plc2/root' > /etc/sysconfig/plc2 +echo 'PLC_DATA=/plc2/data' >> /etc/sysconfig/plc2 + +# Edit /plc2/data/etc/planetlab/plc_config.xml and change at least the +# following so that they do not conflict with the defaults: +# +# PLC_NAME (e.g., PlanetLab Two) +# PLC_SLICE_PREFIX (e.g., two) +# PLC_ROOT_USER (e.g., root@planetlab.two) +# PLC_API_MAINTENANCE_USER (e.g., maint@planetlab.two) +# PLC_DB_PORT (e.g., 5433) +# PLC_WWW_PORT (e.g., 81) +# PLC_WWW_SSL_PORT (e.g., 444) +# PLC_API_PORT (must be the same as PLC_WWW_SSL_PORT, e.g., 444) +# PLC_BOOT_SSL_PORT (must be the same as PLC_WWW_SSL_PORT, e.g., 444) +# PLC_BOOT_PORT (may be the same as PLC_WWW_PORT, e.g., 81) + +# Start up both MyPLC instances +service plc start +service plc2 start + +# Run test +./Test.py -f /etc/planetlab/plc_config -f /plc2/data/etc/planetlab/plc_config + +# If the test fails and your databases are corrupt and/or you want to +# start over, you can always just blow the databases away. +service plc stop +rm -rf /plc/data/var/lib/pgsql/data +service plc start + +service plc2 stop +rm -rf /plc2/data/var/lib/pgsql/data +service plc2 start +""" + +import re +from optparse import OptionParser + +from PLC.Config import Config +from PLC.GPG import gpg_export +from PLC.Shell import Shell +from PLC.Test import Test + +def todict(list_of_dicts, key): + """ + Turn a list of dicts into a dict keyed on key. + """ + + return dict([(d[key], d) for d in list_of_dicts]) + +def RefreshPeers(plcs): + """ + Refresh each peer with each other. + """ + + for plc in plcs: + for peer in plcs: + if peer == plc: + continue + + print plc.config.PLC_NAME, "refreshing", peer.config.PLC_NAME + plc.RefreshPeer(peer.config.PLC_NAME) + + peer_id = plc.GetPeers([peer.config.PLC_NAME])[0]['peer_id'] + + peer_sites = todict(plc.GetSites({'peer_id': peer_id}), 'site_id') + sites_at_peer = todict(peer.GetSites(), 'site_id') + + peer_keys = todict(plc.GetKeys({'peer_id': peer_id}), 'key_id') + keys_at_peer = todict(peer.GetKeys(), 'key_id') + + peer_persons = todict(plc.GetPersons({'peer_id': peer_id}), 'person_id') + persons_at_peer = todict(peer.GetPersons(), 'person_id') + + peer_nodes = todict(plc.GetNodes({'peer_id': peer_id}), 'node_id') + nodes_at_peer = todict(peer.GetNodes(), 'node_id') + + our_nodes = todict(plc.GetNodes({'peer_id': None}), 'node_id') + our_peer_id_at_peer = peer.GetPeers([plc.config.PLC_NAME])[0]['peer_id'] + our_nodes_at_peer = todict(peer.GetNodes({'peer_id': our_peer_id_at_peer, + 'peer_node_id': our_nodes.keys()}), 'peer_node_id') + + peer_slices = todict(plc.GetSlices({'peer_id': peer_id}), 'peer_slice_id') + slices_at_peer = todict(peer.GetSlices(), 'slice_id') + + for site_id, site in peer_sites.iteritems(): + # Verify that this site exists at the peer + peer_site_id = site['peer_site_id'] + assert peer_site_id in sites_at_peer + peer_site = sites_at_peer[peer_site_id] + + # And is the same + for field in ['name', 'abbreviated_name', 'login_base', 'is_public', + 'latitude', 'longitude', 'url', + 'max_slices', 'max_slivers',]: + assert site[field] == peer_site[field] + + for key_id, key in peer_keys.iteritems(): + # Verify that this key exists at the peer + peer_key_id = key['peer_key_id'] + assert peer_key_id in keys_at_peer + peer_key = keys_at_peer[peer_key_id] + + # And is the same + for field in ['key_type', 'key']: + assert key[field] == peer_key[field] + + for person_id, person in peer_persons.iteritems(): + # Verify that this user exists at the peer + peer_person_id = person['peer_person_id'] + assert peer_person_id in persons_at_peer + peer_person = persons_at_peer[peer_person_id] + + # And is the same + for field in ['first_name', 'last_name', 'title', 'email', 'phone', + 'url', 'bio', 'enabled']: + assert person[field] == peer_person[field] + + for key_id in person['key_ids']: + # Verify that the user is not associated with any local keys + assert key_id in peer_keys + key = peer_keys[key_id] + peer_key_id = key['peer_key_id'] + + # Verify that this key exists at the peer + assert peer_key_id in keys_at_peer + peer_key = keys_at_peer[peer_key_id] + + # And is related to the same user at the peer + assert peer_key['key_id'] in peer_person['key_ids'] + + for node_id, node in peer_nodes.iteritems(): + # Verify that this node exists at the peer + peer_node_id = node['peer_node_id'] + assert peer_node_id in nodes_at_peer + peer_node = nodes_at_peer[peer_node_id] + + # And is the same + for field in ['boot_state', 'ssh_rsa_key', 'hostname', + 'version', 'model']: + assert node[field] == peer_node[field] + + # Verify that the node is not associated with any local sites + assert node['site_id'] in peer_sites + site = peer_sites[node['site_id']] + + # Verify that this site exists at the peer + peer_site_id = site['peer_site_id'] + assert peer_site_id in sites_at_peer + peer_site = sites_at_peer[peer_site_id] + + # And is related to the same node at the peer + assert peer_site['site_id'] == peer_node['site_id'] + + for slice_id, slice in peer_slices.iteritems(): + # Verify that this slice exists at the peer + peer_slice_id = slice['peer_slice_id'] + assert peer_slice_id in slices_at_peer + peer_slice = slices_at_peer[peer_slice_id] + + # And is the same + for field in ['name', 'instantiation', 'url', 'description', + 'max_nodes', 'expires']: + assert slice[field] == peer_slice[field] + + for node_id in slice['node_ids']: + # Verify that the slice is associated only with + # the peer's own nodes, or with our nodes as + # last cached by the peer. + assert node_id in peer_nodes or node_id in our_nodes_at_peer + if node_id in peer_nodes: + node = peer_nodes[node_id] + peer_node_id = node['peer_node_id'] + elif node_id in our_nodes_at_peer: + peer_node = our_nodes_at_peer[node_id] + peer_node_id = peer_node['node_id'] + + # Verify that this node exists at the peer + assert peer_node_id in nodes_at_peer + + # And is related to the same slice at the peer + assert peer_node_id in peer_slice['node_ids'] + +def TestPeers(plcs, check = True, verbose = True, tiny = False): + # Register each peer with each other + for plc in plcs: + for peer in plcs: + if peer == plc: + continue + + key = gpg_export(peer.chroot + peer.config.PLC_ROOT_GPG_KEY_PUB) + cacert = file(peer.chroot + peer.config.PLC_API_CA_SSL_CRT).read() + + if plc.GetPeers([peer.config.PLC_NAME]): + print plc.config.PLC_NAME, "updating peer", peer.config.PLC_NAME + plc.UpdatePeer(peer.config.PLC_NAME, + {'peer_url': peer.url, 'key': key, 'cacert': cacert}) + else: + print plc.config.PLC_NAME, "adding peer", peer.config.PLC_NAME + plc.AddPeer({'peername': peer.config.PLC_NAME, + 'peer_url': peer.url, 'key': key, 'cacert': cacert}) + + # Populate the DB + plc.test = Test(api = plc, check = check, verbose = verbose) + + if tiny: + params = Test.tiny + else: + params = Test.default + + print "Populating", plc.config.PLC_NAME + plc.test.Add(**params) + + # Refresh each other + RefreshPeers(plcs) + + # Change some things + for plc in plcs: + print "Updating", plc.config.PLC_NAME + plc.test.Update() + + # Refresh each other again + RefreshPeers(plcs) + +def main(): + parser = OptionParser() + parser.add_option("-f", "--config", dest = "configs", action = "append", default = [], help = "Configuration file (default: %default)") + parser.add_option("-c", "--check", action = "store_true", default = False, help = "Verify actions (default: %default)") + parser.add_option("-q", "--quiet", action = "store_true", default = False, help = "Be quiet (default: %default)") + parser.add_option("-t", "--tiny", action = "store_true", default = False, help = "Run a tiny test (default: %default)") + (options, args) = parser.parse_args() + + # Test single peer by default + if not options.configs: + options.configs = ["/etc/planetlab/plc_config"] + + plcs = [] + for path in options.configs: + # Load configuration file + config = Config(path) + + # Determine path to chroot + m = re.match(r'(.*)/etc/planetlab', path) + if m is not None: + chroot = m.group(1) + else: + chroot = "" + + # Fix up path to SSL certificate + cacert = chroot + config.PLC_API_CA_SSL_CRT + + # Always connect with XML-RPC + plc = Shell(config = path, cacert = cacert, xmlrpc = True) + plc.chroot = chroot + plcs.append(plc) + + TestPeers(plcs, check = options.check, verbose = not options.quiet, tiny = options.tiny) + +if __name__ == "__main__": + main() diff --git a/doc/.cvsignore b/doc/.cvsignore new file mode 100644 index 0000000..6cf3622 --- /dev/null +++ b/doc/.cvsignore @@ -0,0 +1,9 @@ +*.dvi +*.man +*.ps +*.rtf +*.tex +*.texi +*.txt +*.xml.valid +Methods.xml diff --git a/doc/DocBook.py b/doc/DocBook.py new file mode 100755 index 0000000..7867e47 --- /dev/null +++ b/doc/DocBook.py @@ -0,0 +1,149 @@ +#!/usr/bin/python +# +# Generates a DocBook section documenting all PLCAPI methods on +# stdout. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: DocBook.py,v 1.4 2007/02/19 18:02:39 mlhuang Exp $ +# + +import xml.dom.minidom +from xml.dom.minidom import Element, Text +import codecs + +from PLC.API import PLCAPI +from PLC.Method import * + +api = PLCAPI(None) + +# xml.dom.minidom.Text.writexml adds surrounding whitespace to textual +# data when pretty-printing. Override this behavior. +class TrimText(Text): + """text""" + def __init__(self, text = None): + self.data = unicode(text) + + def writexml(self, writer, indent="", addindent="", newl=""): + Text.writexml(self, writer, "", "", "") + +class TrimTextElement(Element): + """text""" + def __init__(self, tagName, text = None): + Element.__init__(self, tagName) + if text is not None: + self.appendChild(TrimText(text)) + + def writexml(self, writer, indent="", addindent="", newl=""): + writer.write(indent) + Element.writexml(self, writer, "", "", "") + writer.write(newl) + +class simpleElement(TrimTextElement): pass + +class paraElement(simpleElement): + """text""" + def __init__(self, text = None): + simpleElement.__init__(self, 'para', text) + +class blockquoteElement(Element): + """
text......text
""" + def __init__(self, text = None): + Element.__init__(self, 'blockquote') + if text is not None: + # Split on blank lines + lines = [line.strip() for line in text.strip().split("\n")] + lines = "\n".join(lines) + paragraphs = lines.split("\n\n") + + for paragraph in paragraphs: + self.appendChild(paraElement(paragraph)) + +def param_type(param): + """Return the XML-RPC type of a parameter.""" + if isinstance(param, Mixed) and len(param): + subtypes = [param_type(subparam) for subparam in param] + return " or ".join(subtypes) + elif isinstance(param, (list, tuple, set)) and len(param): + return "array of " + " or ".join([param_type(subparam) for subparam in param]) + else: + return xmlrpc_type(python_type(param)) + +class paramElement(Element): + """An optionally named parameter.""" + def __init__(self, name, param): + # + Element.__init__(self, 'listitem') + + description = Element('para') + + if name: + description.appendChild(simpleElement('parameter', name)) + description.appendChild(TrimText(": ")) + + description.appendChild(TrimText(param_type(param))) + + if isinstance(param, (list, tuple, set)) and len(param) == 1: + param = param[0] + + if isinstance(param, Parameter): + description.appendChild(TrimText(", " + param.doc)) + param = param.type + + self.appendChild(description) + + if isinstance(param, dict): + itemizedlist = Element('itemizedlist') + self.appendChild(itemizedlist) + for name, subparam in param.iteritems(): + itemizedlist.appendChild(paramElement(name, subparam)) + + elif isinstance(param, (list, tuple, set)) and len(param): + itemizedlist = Element('itemizedlist') + self.appendChild(itemizedlist) + for subparam in param: + itemizedlist.appendChild(paramElement(None, subparam)) + +for method in api.methods: + func = api.callable(method) + + if func.status == "deprecated": + continue + + (min_args, max_args, defaults) = func.args() + + section = Element('section') + section.setAttribute('id', func.name) + section.appendChild(simpleElement('title', func.name)) + + prototype = "%s (%s)" % (method, ", ".join(max_args)) + para = paraElement('Prototype:') + para.appendChild(blockquoteElement(prototype)) + section.appendChild(para) + + para = paraElement('Description:') + para.appendChild(blockquoteElement(func.__doc__)) + section.appendChild(para) + + para = paraElement('Allowed Roles:') + para.appendChild(blockquoteElement(", ".join(func.roles))) + section.appendChild(para) + + section.appendChild(paraElement('Parameters:')) + params = Element('itemizedlist') + if func.accepts: + for name, param, default in zip(max_args, func.accepts, defaults): + params.appendChild(paramElement(name, param)) + else: + listitem = Element('listitem') + listitem.appendChild(paraElement('None')) + params.appendChild(listitem) + section.appendChild(params) + + section.appendChild(paraElement('Returns:')) + returns = Element('itemizedlist') + returns.appendChild(paramElement(None, func.returns)) + section.appendChild(returns) + + print section.toprettyxml(encoding = "UTF-8") diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..bbb25c9 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,45 @@ +# +# (Re)builds API documentation +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Makefile,v 1.2 2006/11/03 20:36:05 thierry Exp $ +# + +all: PLCAPI.pdf + +.PLCAPI.xml.valid: Methods.xml + +Methods.xml: DocBook.py ../PLC/__init__.py ../PLC/Methods/__init__.py + PYTHONPATH=.. python $< > $@ + +# +# Documentation +# + +# Validate the XML +.%.xml.valid: %.xml + xmllint --valid --output $@ $< + +# Remove the temporary output file after compilation +.SECONDARY: .%.xml.valid + +# Compile it into other formats +FORMATS := dvi html man ps pdf rtf tex texi txt + +DOCBOOK2FLAGS := -V biblio-number=1 + +define docbook2 +%.$(1): %.xml .%.xml.valid + docbook2$(1) --nochunks $$(DOCBOOK2FLAGS) $$< +endef + +$(foreach format,$(FORMATS),$(eval $(call docbook2,$(format)))) + +clean: + rm -f $(patsubst %,*.%,$(FORMATS)) .*.xml.valid Methods.xml + +force: + +.PHONY: force clean docclean diff --git a/doc/PLCAPI.html b/doc/PLCAPI.html new file mode 100644 index 0000000..27390a9 --- /dev/null +++ b/doc/PLCAPI.html @@ -0,0 +1,20342 @@ + +PlanetLab Central API Documentation
Table of Contents
1. Introduction
1.1. Authentication
1.2. Roles
1.3. Filters
1.4. PlanetLab shell
2. PlanetLab API Methods
2.1. AddAddressType
2.2. AddAddressTypeToAddress
2.3. AddBootState
2.4. AddConfFile
2.5. AddConfFileToNodeGroup
2.6. AddConfFileToNode
2.7. AddKeyType
2.8. AddMessage
2.9. AddNetworkMethod
2.10. AddNetworkType
2.11. AddNodeGroup
2.12. AddNodeNetwork
2.13. AddNode
2.14. AddNodeToNodeGroup
2.15. AddNodeToPCU
2.16. AddPCU
2.17. AddPeer
2.18. AddPersonKey
2.19. AddPerson
2.20. AddPersonToSite
2.21. AddPersonToSlice
2.22. AddRole
2.23. AddRoleToPerson
2.24. AddSiteAddress
2.25. AddSite
2.26. AddSliceAttribute
2.27. AddSliceAttributeType
2.28. AddSliceInstantiation
2.29. AddSlice
2.30. AddSliceToNodes
2.31. AuthCheck
2.32. BlacklistKey
2.33. BootGetNodeDetails
2.34. BootNotifyOwners
2.35. BootUpdateNode
2.36. DeleteAddress
2.37. DeleteAddressTypeFromAddress
2.38. DeleteAddressType
2.39. DeleteBootState
2.40. DeleteConfFileFromNodeGroup
2.41. DeleteConfFileFromNode
2.42. DeleteConfFile
2.43. DeleteKey
2.44. DeleteKeyType
2.45. DeleteMessage
2.46. DeleteNetworkMethod
2.47. DeleteNetworkType
2.48. DeleteNodeFromNodeGroup
2.49. DeleteNodeFromPCU
2.50. DeleteNodeGroup
2.51. DeleteNodeNetwork
2.52. DeleteNode
2.53. DeletePCU
2.54. DeletePeer
2.55. DeletePersonFromSite
2.56. DeletePersonFromSlice
2.57. DeletePerson
2.58. DeleteRoleFromPerson
2.59. DeleteRole
2.60. DeleteSession
2.61. DeleteSite
2.62. DeleteSliceAttribute
2.63. DeleteSliceAttributeType
2.64. DeleteSliceFromNodes
2.65. DeleteSliceInstantiation
2.66. DeleteSlice
2.67. GetAddresses
2.68. GetAddressTypes
2.69. GetBootStates
2.70. GetConfFiles
2.71. GetEvents
2.72. GetKeys
2.73. GetKeyTypes
2.74. GetMessages
2.75. GetNetworkMethods
2.76. GetNetworkTypes
2.77. GetNodeGroups
2.78. GetNodeNetworks
2.79. GetNodes
2.80. GetPCUs
2.81. GetPeerData
2.82. GetPeerName
2.83. GetPeers
2.84. GetPersons
2.85. GetRoles
2.86. GetSession
2.87. GetSites
2.88. GetSliceAttributes
2.89. GetSliceAttributeTypes
2.90. GetSliceInstantiations
2.91. GetSlices
2.92. GetSliceTicket
2.93. GetSlivers
2.94. NotifyPersons
2.95. RebootNode
2.96. RefreshPeer
2.97. ResetPassword
2.98. SetPersonPrimarySite
2.99. UpdateAddress
2.100. UpdateAddressType
2.101. UpdateConfFile
2.102. UpdateKey
2.103. UpdateMessage
2.104. UpdateNodeGroup
2.105. UpdateNodeNetwork
2.106. UpdateNode
2.107. UpdatePCU
2.108. UpdatePeer
2.109. UpdatePerson
2.110. UpdateSite
2.111. UpdateSliceAttribute
2.112. UpdateSliceAttributeType
2.113. UpdateSlice
2.114. VerifyPerson
2.115. system.listMethods
2.116. system.methodHelp
2.117. system.methodSignature
2.118. system.multicall

Chapter 1. Introduction

The PlanetLab Central API (PLCAPI) is the interface through + which the PlanetLab Central database should be accessed and + maintained. The API is used by the website, by nodes, by automated + scripts, and by users to access and update information about + users, nodes, sites, slices, and other entities maintained by the + database.


1.1. Authentication

The API should be accessed via XML-RPC over HTTPS. The API + supports the standard introspection calls system.listMethods, system.methodSignature, + and system.methodHelp, + and the standard batching call system.multicall. With the + exception of these calls, all PLCAPI calls take an + authentication structure as their first argument. All + authentication structures require the specification of + AuthMethod. If the documentation for a + call does not further specify the authentication structure, then + any of (but only) the following authentication structures may be + used:

  • Session authentication. User sessions are typically + valid for 24 hours. Node sessions are valid until the next + reboot. Obtain a session key with GetSession using another form of + authentication, such as password or GnuPG + authentication.

    AuthMethodsession 
    sessionSession key 

  • Password authentication.

    AuthMethodpassword 
    UsernameUsername, typically an e-mail address 
    AuthStringAuthentication string, typically a password 

  • GnuPG authentication. Users may upload a GPG public key + using AddPersonKey. Peer + GPG keys should be added with AddPeer or UpdatePeer. +

    AuthMethodgpg 
    namePeer or user name 
    signatureGnuPG signature of + the canonicalized + XML-RPC + representation of the rest of the arguments to the + call. 

  • Anonymous authentication.

    AuthMethodanonymous 


1.2. Roles

Some functions may only be called by users with certain + roles (see GetRoles), and others + may return different information to different callers depending + on the role(s) of the caller.

The node and + anonymous roles are pseudo-roles. A function + that allows the node role may be called by + automated scripts running on a node, such as the Boot and Node + Managers. A function that allows the + anonymous role may be called by anyone; an + API authentication structure must still be specified (see Section 1.1).


1.3. Filters

Most of the Get functions take a + filter argument. Filters may be arrays of integer (and sometimes + string) identifiers, or a struct representing a filter on the + attributes of the entities being queried. For example,


# plcsh code fragment (see below)
+GetNodes([1,2,3])
+GetNodes({'node_id': [1,2,3]})
+GetNodes({'node_id': 1}) + GetNodes({'node_id': 2}) + GetNodes({'node_id': 3})
+

Would all be equivalent queries. Attributes that are + themselves arrays (such as nodenetwork_ids + and slice_ids for nodes) cannot be used in + filters.


1.4. PlanetLab shell

A command-line program called plcsh + simplifies authentication structure handling, and is useful for + scripting. This program is distributed as a Linux RPM called + PLCAPI and requires Python ≥2.4.


usage: plcsh [options]
+
+options:
+  -f CONFIG, --config=CONFIG
+                        PLC configuration file
+  -h URL, --url=URL     API URL
+  -c CACERT, --cacert=CACERT
+                        API SSL certificate
+  -k INSECURE, --insecure=INSECURE
+                        Do not check SSL certificate
+  -m METHOD, --method=METHOD
+                        API authentication method
+  -s SESSION, --session=SESSION
+                        API session key
+  -u USER, --user=USER  API user name
+  -p PASSWORD, --password=PASSWORD
+                        API password
+  -r ROLE, --role=ROLE  API role
+  -x, --xmlrpc          Use XML-RPC interface
+  --help                show this help message and exit
+      

Specify at least the API URL and your user name:


plcsh --url https://www.planet-lab.org/PLCAPI/ -u user@site.edu
+      

You will be presented with a prompt. From here, you can + invoke API calls and omit the authentication structure, as it will + be filled in automatically.


user@site.edu connected using password authentication
+Type "system.listMethods()" or "help(method)" for more information.
+[user@site.edu]>>> AuthCheck()
+1
+[user@site.edu]>>> GetNodes([121], ['node_id', 'hostname'])
+[{'node_id': 121, 'hostname': 'planetlab-1.cs.princeton.edu'}]
+      

As this program is actually a Python interpreter, you may + create variables, execute for loops, import other packages, etc., + directly on the command line as you would using the regular Python + shell.

To use plcsh programmatically, import + the PLC.Shell module:


#!/usr/bin/python
+
+import sys
+
+# Default location that the PLCAPI RPM installs the PLC class
+sys.path.append('/usr/share/plc_api')
+
+# Initialize shell environment. Shell() will define all PLCAPI methods
+# in the specified namespace (specifying globals() will define them
+# globally).
+from PLC.Shell import Shell
+plc = Shell(globals(),
+            url = "https://www.planet-lab.org/PLCAPI/",
+            user = "user@site.edu",
+            password = "password")
+
+# Both are equivalent
+nodes = GetNodes([121], ['node_id', 'hostname'])
+nodes = plc.GetNodes([121], ['node_id', 'hostname'])
+      

Chapter 2. PlanetLab API Methods


2.1. AddAddressType

Prototype:

AddAddressType (auth, address_type_fields)

Description:

Adds a new address type. Fields specified in address_type_fields +are used.

Returns the new address_type_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_type_fields +: struct

    • name +: string, Address type

    • description +: string, Address type description

Returns:

  • int, New address_type_id (> 0) if successful


2.2. AddAddressTypeToAddress

Prototype:

AddAddressTypeToAddress (auth, address_type_id_or_name, address_id)

Description:

Adds an address type to the specified address.

PIs may only update addresses of their own sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_type_id_or_name +: int or string

    • int, Address type identifier

    • string, Address type

  • address_id +: int, Address identifier

Returns:

  • int, 1 if successful


2.3. AddBootState

Prototype:

AddBootState (auth, name)

Description:

Adds a new node boot state.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Boot state

Returns:

  • int, 1 if successful


2.4. AddConfFile

Prototype:

AddConfFile (auth, conf_file_fields)

Description:

Adds a new node configuration file. Any fields specified in +conf_file_fields are used, otherwise defaults are used.

Returns the new conf_file_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_fields +: struct

    • file_owner +: string, chown(1) owner

    • postinstall_cmd +: string, Shell command to execute after installing

    • error_cmd +: string, Shell command to execute if any error occurs

    • preinstall_cmd +: string, Shell command to execute prior to installing

    • dest +: string, Absolute path where file should be installed

    • ignore_cmd_errors +: boolean, Install file anyway even if an error occurs

    • enabled +: boolean, Configuration file is active

    • file_permissions +: string, chmod(1) permissions

    • source +: string, Relative path on the boot server where file can be downloaded

    • always_update +: boolean, Always attempt to install file even if unchanged

    • file_group +: string, chgrp(1) owner

Returns:

  • int, New conf_file_id (> 0) if successful


2.5. AddConfFileToNodeGroup

Prototype:

AddConfFileToNodeGroup (auth, conf_file_id, nodegroup_id_or_name)

Description:

Adds a configuration file to the specified node group. If the node +group is already linked to the configuration file, no errors are +returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_id +: int, Configuration file identifier

  • nodegroup_id_or_name +: int or string

    • int, Node group identifier

    • string, Node group name

Returns:

  • int, 1 if successful


2.6. AddConfFileToNode

Prototype:

AddConfFileToNode (auth, conf_file_id, node_id_or_hostname)

Description:

Adds a configuration file to the specified node. If the node is +already linked to the configuration file, no errors are returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_id +: int, Configuration file identifier

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • int, 1 if successful


2.7. AddKeyType

Prototype:

AddKeyType (auth, name)

Description:

Adds a new key type.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Key type

Returns:

  • int, 1 if successful


2.8. AddMessage

Prototype:

AddMessage (auth, message_fields)

Description:

Adds a new message template. Any values specified in +message_fields are used, otherwise defaults are used.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • message_fields +: struct

    • enabled +: boolean, Message is enabled

    • message_id +: string, Message identifier

    • template +: string, Message template

    • subject +: string, Message summary

Returns:

  • int, 1 if successful


2.9. AddNetworkMethod

Prototype:

AddNetworkMethod (auth, name)

Description:

Adds a new network method.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Network method

Returns:

  • int, 1 if successful


2.10. AddNetworkType

Prototype:

AddNetworkType (auth, name)

Description:

Adds a new network type.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Network type

Returns:

  • int, 1 if successful


2.11. AddNodeGroup

Prototype:

AddNodeGroup (auth, nodegroup_fields)

Description:

Adds a new node group. Any values specified in nodegroup_fields +are used, otherwise defaults are used.

Returns the new nodegroup_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • nodegroup_fields +: struct

    • name +: string, Node group name

    • description +: string, Node group description

Returns:

  • int, New nodegroup_id (> 0) if successful


2.12. AddNodeNetwork

Prototype:

AddNodeNetwork (auth, node_id_or_hostname, nodenetwork_fields)

Description:

Adds a new network for a node. Any values specified in +nodenetwork_fields are used, otherwise defaults are +used. Acceptable values for method may be retrieved via +GetNetworkMethods. Acceptable values for type may be retrieved via +GetNetworkTypes.

If type is static, ip, gateway, network, broadcast, netmask, and +dns1 must all be specified in nodenetwork_fields. If type is dhcp, +these parameters, even if specified, are ignored.

PIs and techs may only add networks to their own nodes. Admins may +add networks to any node.

Returns the new nodenetwork_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

  • nodenetwork_fields +: struct

    • network +: string, Subnet address

    • is_primary +: boolean, Is the primary interface for this node

    • dns1 +: string, IP address of primary DNS server

    • hostname +: string, (Optional) Hostname

    • mac +: string, MAC address

    • bwlimit +: int, Bandwidth limit

    • broadcast +: string, Network broadcast address

    • method +: string, Addressing method (e.g., 'static' or 'dhcp')

    • netmask +: string, Subnet mask

    • dns2 +: string, IP address of secondary DNS server

    • ip +: string, IP address

    • type +: string, Address type (e.g., 'ipv4')

    • gateway +: string, IP address of primary gateway

Returns:

  • int, New nodenetwork_id (> 0) if successful


2.13. AddNode

Prototype:

AddNode (auth, site_id_or_login_base, node_fields)

Description:

Adds a new node. Any values specified in node_fields are used, +otherwise defaults are used.

PIs and techs may only add nodes to their own sites. Admins may +add nodes to any site.

Returns the new node_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

  • node_fields +: struct

    • boot_state +: string, Boot state

    • model +: string, Make and model of the actual machine

    • version +: string, Apparent Boot CD version

    • hostname +: string, Fully qualified hostname

Returns:

  • int, New node_id (> 0) if successful


2.14. AddNodeToNodeGroup

Prototype:

AddNodeToNodeGroup (auth, node_id_or_hostname, nodegroup_id_or_name)

Description:

Add a node to the specified node group. If the node is +already a member of the nodegroup, no errors are returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

  • nodegroup_id_or_name +: int or string

    • int, Node group identifier

    • string, Node group name

Returns:

  • int, 1 if successful


2.15. AddNodeToPCU

Prototype:

AddNodeToPCU (auth, node_id_or_hostname, pcu_id, port)

Description:

Adds a node to a port on a PCU. Faults if the node has already +been added to the PCU or if the port is already in use.

Non-admins may only update PCUs at their sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

  • pcu_id +: int, PCU identifier

  • port +: int, PCU port number

Returns:

  • int, 1 if successful


2.16. AddPCU

Prototype:

AddPCU (auth, site_id_or_login_base, pcu_fields)

Description:

Adds a new power control unit (PCU) to the specified site. Any +fields specified in pcu_fields are used, otherwise defaults are +used.

PIs and technical contacts may only add PCUs to their own sites.

Returns the new pcu_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

  • pcu_fields +: struct

    • username +: string, PCU username

    • protocol +: string, PCU protocol, e.g. ssh, https, telnet

    • ip +: string, PCU IP address

    • notes +: string, Miscellaneous notes

    • hostname +: string, PCU hostname

    • model +: string, PCU model string

    • password +: string, PCU username

Returns:

  • int, New pcu_id (> 0) if successful


2.17. AddPeer

Prototype:

AddPeer (auth, peer_fields)

Description:

Adds a new peer.

Returns the new peer_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • peer_fields +: struct

    • key +: string, Peer GPG public key

    • cacert +: string, Peer SSL public certificate

    • peername +: string, Peer name

    • peer_url +: string, Peer API URL

Returns:

  • int, New peer_id (> 0) if successful


2.18. AddPersonKey

Prototype:

AddPersonKey (auth, person_id_or_email, key_fields)

Description:

Adds a new key to the specified account.

Non-admins can only modify their own keys.

Returns the new key_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin, pi, tech, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • key_fields +: struct

    • key_type +: string, Key type

    • key +: string, Key value

Returns:

  • int, New key_id (> 0) if successful


2.19. AddPerson

Prototype:

AddPerson (auth, person_fields)

Description:

Adds a new account. Any fields specified in person_fields are +used, otherwise defaults are used.

Accounts are disabled by default. To enable an account, use +UpdatePerson().

Returns the new person_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_fields +: struct

    • bio +: string, Biography

    • first_name +: string, Given name

    • last_name +: string, Surname

    • title +: string, Title

    • url +: string, Home page

    • phone +: string, Telephone number

    • password +: string, Account password in crypt() form

    • email +: string, Primary e-mail address

Returns:

  • int, New person_id (> 0) if successful


2.20. AddPersonToSite

Prototype:

AddPersonToSite (auth, person_id_or_email, site_id_or_login_base)

Description:

Adds the specified person to the specified site. If the person is +already a member of the site, no errors are returned. Does not +change the person's primary site.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

Returns:

  • int, 1 if successful


2.21. AddPersonToSlice

Prototype:

AddPersonToSlice (auth, person_id_or_email, slice_id_or_name)

Description:

Adds the specified person to the specified slice. If the person is +already a member of the slice, no errors are returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice name

Returns:

  • int, 1 if successful


2.22. AddRole

Prototype:

AddRole (auth, role_id, name)

Description:

Adds a new role.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • role_id +: int, Role identifier

  • name +: string, Role

Returns:

  • int, 1 if successful


2.23. AddRoleToPerson

Prototype:

AddRoleToPerson (auth, role_id_or_name, person_id_or_email)

Description:

Grants the specified role to the person.

PIs can only grant the tech and user roles to users and techs at +their sites. Admins can grant any role to any user.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • role_id_or_name +: int or string

    • int, Role identifier

    • string, Role

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

Returns:

  • int, 1 if successful


2.24. AddSiteAddress

Prototype:

AddSiteAddress (auth, site_id_or_login_base, address_fields)

Description:

Adds a new address to a site. Fields specified in +address_fields are used; some are not optional.

PIs may only add addresses to their own sites.

Returns the new address_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

  • address_fields +: struct

    • city +: string, City

    • country +: string, Country

    • line3 +: string, Address line 3

    • line2 +: string, Address line 2

    • line1 +: string, Address line 1

    • state +: string, State or province

    • postalcode +: string, Postal code

Returns:

  • int, New address_id (> 0) if successful


2.25. AddSite

Prototype:

AddSite (auth, site_fields)

Description:

Adds a new site, and creates a node group for that site. Any +fields specified in site_fields are used, otherwise defaults are +used.

Returns the new site_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • site_fields +: struct

    • name +: string, Full site name

    • url +: string, URL of a page that describes the site

    • enabled +: boolean, Has been enabled

    • longitude +: double, Decimal longitude of the site

    • latitude +: double, Decimal latitude of the site

    • max_slices +: int, Maximum number of slices that the site is able to create

    • login_base +: string, Site slice prefix

    • max_slivers +: int, Maximum number of slivers that the site is able to create

    • is_public +: boolean, Publicly viewable site

    • abbreviated_name +: string, Abbreviated site name

Returns:

  • int, New site_id (> 0) if successful


2.26. AddSliceAttribute

Prototype:

AddSliceAttribute (auth, slice_id_or_name, attribute_type_id_or_name, value, node_id_or_hostname)

Description:

Sets the specified attribute of the slice (or sliver, if +node_id_or_hostname is specified) to the specified value.

Attributes may require the caller to have a particular role in +order to be set or changed. Users may only set attributes of +slices or slivers of which they are members. PIs may only set +attributes of slices or slivers at their sites, or of which they +are members. Admins may set attributes of any slice or sliver.

Returns the new slice_attribute_id (> 0) if successful, faults +otherwise.

Allowed Roles:

admin, pi, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice attribute type name

  • attribute_type_id_or_name +: int or string

    • int, Slice attribute type identifier

    • string, Slice attribute type name

  • value +: string, Slice attribute value

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • int, New slice_attribute_id (> 0) if successful


2.27. AddSliceAttributeType

Prototype:

AddSliceAttributeType (auth, attribute_type_fields)

Description:

Adds a new type of slice attribute. Any fields specified in +attribute_type_fields are used, otherwise defaults are used.

Returns the new attribute_type_id (> 0) if successful, faults +otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • attribute_type_fields +: struct

    • min_role_id +: int, Minimum (least powerful) role that can set or change this attribute

    • name +: string, Slice attribute type name

    • description +: string, Slice attribute type description

Returns:

  • int, New attribute_id (> 0) if successful


2.28. AddSliceInstantiation

Prototype:

AddSliceInstantiation (auth, name)

Description:

Adds a new slice instantiation state.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Slice instantiation state

Returns:

  • int, 1 if successful


2.29. AddSlice

Prototype:

AddSlice (auth, slice_fields)

Description:

Adds a new slice. Any fields specified in slice_fields are used, +otherwise defaults are used.

Valid slice names are lowercase and begin with the login_base +(slice prefix) of a valid site, followed by a single +underscore. Thereafter, only letters, numbers, or additional +underscores may be used.

PIs may only add slices associated with their own sites (i.e., +slice prefixes must always be the login_base of one of their +sites).

Returns the new slice_id (> 0) if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_fields +: struct

    • url +: string, URL further describing this slice

    • max_nodes +: int, Maximum number of nodes that can be assigned to this slice

    • instantiation +: string, Slice instantiation state

    • name +: string, Slice name

    • description +: string, Slice description

Returns:

  • int, New slice_id (> 0) if successful


2.30. AddSliceToNodes

Prototype:

AddSliceToNodes (auth, slice_id_or_name, node_id_or_hostname_list)

Description:

Adds the specified slice to the specified nodes. Nodes may be +either local or foreign nodes.

If the slice is already associated with a node, no errors are +returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice name

  • node_id_or_hostname_list +: array of int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • int, 1 if successful


2.31. AuthCheck

Prototype:

AuthCheck (auth)

Description:

Returns 1 if the user or node authenticated successfully, faults +otherwise.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • int, 1 if successful


2.32. BlacklistKey

Prototype:

BlacklistKey (auth, key_id)

Description:

Blacklists a key, disassociating it and all others identical to it +from all accounts and preventing it from ever being added again.

WARNING: Identical keys associated with other accounts with also +be blacklisted.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • key_id +: int, Key identifier

Returns:

  • int, 1 if successful


2.33. BootGetNodeDetails

Prototype:

BootGetNodeDetails (auth)

Description:

Returns a set of details about the calling node, including a new +node session value.

Allowed Roles:

node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use, always 'hmac'

    • value +: string, HMAC of node key and method call

    • node_id +: int, Node identifier

Returns:

  • struct

    • boot_state +: string, Boot state

    • model +: string, Make and model of the actual machine

    • hostname +: string, Fully qualified hostname

    • networks +: array of struct

      • broadcast +: string, Network broadcast address

      • is_primary +: boolean, Is the primary interface for this node

      • network +: string, Subnet address

      • ip +: string, IP address

      • dns1 +: string, IP address of primary DNS server

      • hostname +: string, (Optional) Hostname

      • netmask +: string, Subnet mask

      • gateway +: string, IP address of primary gateway

      • nodenetwork_id +: int, Node interface identifier

      • mac +: string, MAC address

      • node_id +: int, Node associated with this interface

      • dns2 +: string, IP address of secondary DNS server

      • bwlimit +: int, Bandwidth limit

      • type +: string, Address type (e.g., 'ipv4')

      • method +: string, Addressing method (e.g., 'static' or 'dhcp')

    • session +: string, Session key


2.34. BootNotifyOwners

Prototype:

BootNotifyOwners (auth, message_id, include_pis, include_techs, include_support)

Description:

Notify the owners of the node, and/or support about an event that +happened on the machine.

Returns 1 if successful.

Allowed Roles:

node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use, always 'hmac'

    • value +: string, HMAC of node key and method call

    • node_id +: int, Node identifier

  • message_id +: string, Message identifier

  • include_pis +: int, Notify PIs

  • include_techs +: int, Notify technical contacts

  • include_support +: int, Notify support

Returns:

  • int, 1 if successful


2.35. BootUpdateNode

Prototype:

BootUpdateNode (auth, node_fields)

Description:

Allows the calling node to update its own record. Only the primary +network can be updated, and the node IP cannot be changed.

Returns 1 if updated successfully.

Allowed Roles:

node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use, always 'hmac'

    • value +: string, HMAC of node key and method call

    • node_id +: int, Node identifier

  • node_fields +: struct

    • boot_state +: string, Boot state

    • primary_network +: struct

      • network +: string, Subnet address

      • dns2 +: string, IP address of secondary DNS server

      • dns1 +: string, IP address of primary DNS server

      • netmask +: string, Subnet mask

      • method +: string, Addressing method (e.g., 'static' or 'dhcp')

      • broadcast +: string, Network broadcast address

      • mac +: string, MAC address

      • gateway +: string, IP address of primary gateway

    • ssh_host_key +: string, Last known SSH host key

Returns:

  • int, 1 if successful


2.36. DeleteAddress

Prototype:

DeleteAddress (auth, address_id)

Description:

Deletes an address.

PIs may only delete addresses from their own sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_id +: int, Address identifier

Returns:

  • int, 1 if successful


2.37. DeleteAddressTypeFromAddress

Prototype:

DeleteAddressTypeFromAddress (auth, address_type_id_or_name, address_id)

Description:

Deletes an address type from the specified address.

PIs may only update addresses of their own sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_type_id_or_name +: int or string

    • int, Address type identifier

    • string, Address type

  • address_id +: int, Address identifier

Returns:

  • int, 1 if successful


2.38. DeleteAddressType

Prototype:

DeleteAddressType (auth, address_type_id_or_name)

Description:

Deletes an address type.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_type_id_or_name +: int or string

    • int, Address type identifier

    • string, Address type

Returns:

  • int, 1 if successful


2.39. DeleteBootState

Prototype:

DeleteBootState (auth, name)

Description:

Deletes a node boot state.

WARNING: This will cause the deletion of all nodes in this boot +state.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Boot state

Returns:

  • int, 1 if successful


2.40. DeleteConfFileFromNodeGroup

Prototype:

DeleteConfFileFromNodeGroup (auth, conf_file_id, nodegroup_id_or_name)

Description:

Deletes a configuration file from the specified nodegroup. If the nodegroup +is not linked to the configuration file, no errors are returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_id +: int, Configuration file identifier

  • nodegroup_id_or_name +: int or string

    • int, Node group identifier

    • string, Node group name

Returns:

  • int, 1 if successful


2.41. DeleteConfFileFromNode

Prototype:

DeleteConfFileFromNode (auth, conf_file_id, node_id_or_hostname)

Description:

Deletes a configuration file from the specified node. If the node +is not linked to the configuration file, no errors are returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_id +: int, Configuration file identifier

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • int, 1 if successful


2.42. DeleteConfFile

Prototype:

DeleteConfFile (auth, conf_file_id)

Description:

Returns an array of structs containing details about node +configuration files. If conf_file_ids is specified, only the +specified configuration files will be queried.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_id +: int, Configuration file identifier

Returns:

  • int, 1 if successful


2.43. DeleteKey

Prototype:

DeleteKey (auth, key_id)

Description:

Deletes a key.

Non-admins may only delete their own keys.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • key_id +: int, Key identifier

Returns:

  • int, 1 if successful


2.44. DeleteKeyType

Prototype:

DeleteKeyType (auth, name)

Description:

Deletes a key type.

WARNING: This will cause the deletion of all keys of this type.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Key type

Returns:

  • int, 1 if successful


2.45. DeleteMessage

Prototype:

DeleteMessage (auth, message_id)

Description:

Deletes a message template.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • message_id +: string, Message identifier

Returns:

  • int, 1 if successful


2.46. DeleteNetworkMethod

Prototype:

DeleteNetworkMethod (auth, name)

Description:

Deletes a network method.

WARNING: This will cause the deletion of all network interfaces +that use this method.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Network method

Returns:

  • int, 1 if successful


2.47. DeleteNetworkType

Prototype:

DeleteNetworkType (auth, name)

Description:

Deletes a network type.

WARNING: This will cause the deletion of all network interfaces +that use this type.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • name +: string, Network type

Returns:

  • int, 1 if successful


2.48. DeleteNodeFromNodeGroup

Prototype:

DeleteNodeFromNodeGroup (auth, node_id_or_hostname, nodegroup_id_or_name)

Description:

Removes a node from the specified node group.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

  • nodegroup_id_or_name +: int or string

    • int, Node group identifier

    • string, Node group name

Returns:

  • int, 1 if successful


2.49. DeleteNodeFromPCU

Prototype:

DeleteNodeFromPCU (auth, node_id_or_hostname, pcu_id)

Description:

Deletes a node from a PCU.

Non-admins may only update PCUs at their sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

  • pcu_id +: int, PCU identifier

Returns:

  • int, 1 if successful


2.50. DeleteNodeGroup

Prototype:

DeleteNodeGroup (auth, node_group_id_or_name)

Description:

Delete an existing Node Group.

ins may delete any node group

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_group_id_or_name +: int or string

    • int, Node group identifier

    • string, Node group name

Returns:

  • int, 1 if successful


2.51. DeleteNodeNetwork

Prototype:

DeleteNodeNetwork (auth, nodenetwork_id)

Description:

Deletes an existing node network interface.

Admins may delete any node network. PIs and techs may only delete +node network interfaces associated with nodes at their sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • nodenetwork_id +: int, Node interface identifier

Returns:

  • int, 1 if successful


2.52. DeleteNode

Prototype:

DeleteNode (auth, node_id_or_hostname)

Description:

Mark an existing node as deleted.

PIs and techs may only delete nodes at their own sites. ins may +delete nodes at any site.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • int, 1 if successful


2.53. DeletePCU

Prototype:

DeletePCU (auth, pcu_id)

Description:

Deletes a PCU.

Non-admins may only delete PCUs at their sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • pcu_id +: int, PCU identifier

Returns:

  • int, 1 if successful


2.54. DeletePeer

Prototype:

DeletePeer (auth, peer_id_or_name)

Description:

Mark an existing peer as deleted. All entities (e.g., slices, +keys, nodes, etc.) for which this peer is authoritative will also +be deleted or marked as deleted.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • peer_id_or_name +: int or string

    • int, Peer identifier

    • string, Peer name

Returns:

  • int, 1 if successful


2.55. DeletePersonFromSite

Prototype:

DeletePersonFromSite (auth, person_id_or_email, site_id_or_login_base)

Description:

Removes the specified person from the specified site. If the +person is not a member of the specified site, no error is +returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

Returns:

  • int, 1 if successful


2.56. DeletePersonFromSlice

Prototype:

DeletePersonFromSlice (auth, person_id_or_email, slice_id_or_name)

Description:

Deletes the specified person from the specified slice. If the person is +not a member of the slice, no errors are returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice name

Returns:

  • int, 1 if successful


2.57. DeletePerson

Prototype:

DeletePerson (auth, person_id_or_email)

Description:

Mark an existing account as deleted.

Users and techs can only delete themselves. PIs can only delete +themselves and other non-PIs at their sites. ins can delete +anyone.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

Returns:

  • int, 1 if successful


2.58. DeleteRoleFromPerson

Prototype:

DeleteRoleFromPerson (auth, role_id_or_name, person_id_or_email)

Description:

Deletes the specified role from the person.

PIs can only revoke the tech and user roles from users and techs +at their sites. ins can revoke any role from any user.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • role_id_or_name +: int or string

    • int, Role identifier

    • string, Role

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

Returns:

  • int, 1 if successful


2.59. DeleteRole

Prototype:

DeleteRole (auth, role_id_or_name)

Description:

Deletes a role.

WARNING: This will remove the specified role from all accounts +that possess it, and from all node and slice attributes that refer +to it.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • role_id_or_name +: int or string

    • int, Role identifier

    • string, Role

Returns:

  • int, 1 if successful


2.60. DeleteSession

Prototype:

DeleteSession (auth)

Description:

Invalidates the current session.

Returns 1 if successful.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • session +: string, Session key

    • AuthMethod +: string, Authentication method to use, always 'session'

Returns:

  • int, 1 if successful


2.61. DeleteSite

Prototype:

DeleteSite (auth, site_id_or_login_base)

Description:

Mark an existing site as deleted. The accounts of people who are +not members of at least one other non-deleted site will also be +marked as deleted. Nodes, PCUs, and slices associated with the +site will be deleted.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

Returns:

  • int, 1 if successful


2.62. DeleteSliceAttribute

Prototype:

DeleteSliceAttribute (auth, slice_attribute_id)

Description:

Deletes the specified slice or sliver attribute.

Attributes may require the caller to have a particular role in +order to be deleted. Users may only delete attributes of +slices or slivers of which they are members. PIs may only delete +attributes of slices or slivers at their sites, or of which they +are members. Admins may delete attributes of any slice or sliver.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_attribute_id +: int, Slice attribute identifier

Returns:

  • int, 1 if successful


2.63. DeleteSliceAttributeType

Prototype:

DeleteSliceAttributeType (auth, attribute_type_id_or_name)

Description:

Deletes the specified slice attribute.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • attribute_type_id_or_name +: int or string

    • int, Slice attribute type identifier

    • string, Slice attribute type name

Returns:

  • int, 1 if successful


2.64. DeleteSliceFromNodes

Prototype:

DeleteSliceFromNodes (auth, slice_id_or_name, node_id_or_hostname_list)

Description:

Deletes the specified slice from the specified nodes. If the slice is +not associated with a node, no errors are returned.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice name

  • node_id_or_hostname_list +: array of int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • int, 1 if successful


2.65. DeleteSliceInstantiation

Prototype:

DeleteSliceInstantiation (auth, instantiation)

Description:

Deletes a slice instantiation state.

WARNING: This will cause the deletion of all slices of this instantiation.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • instantiation +: string, Slice instantiation state

Returns:

  • int, 1 if successful


2.66. DeleteSlice

Prototype:

DeleteSlice (auth, slice_id_or_name)

Description:

Deletes the specified slice.

Users may only delete slices of which they are members. PIs may +delete any of the slices at their sites, or any slices of which +they are members. Admins may delete any slice.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice name

Returns:

  • int, 1 if successful


2.67. GetAddresses

Prototype:

GetAddresses (auth, address_filter, return_fields)

Description:

Returns an array of structs containing details about addresses. If +address_filter is specified and is an array of address +identifiers, or a struct of address attributes, only addresses +matching the filter will be returned. If return_fields is +specified, only the specified details will be returned.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_filter +: array of int or struct

    • array of int, Address identifier

    • struct, Attribute filter

      • city +: string or array of string

        • string, City

        • array of string, City

      • address_id +: int or array of int

        • int, Address identifier

        • array of int, Address identifier

      • country +: string or array of string

        • string, Country

        • array of string, Country

      • line3 +: string or array of string

        • string, Address line 3

        • array of string, Address line 3

      • line2 +: string or array of string

        • string, Address line 2

        • array of string, Address line 2

      • line1 +: string or array of string

        • string, Address line 1

        • array of string, Address line 1

      • state +: string or array of string

        • string, State or province

        • array of string, State or province

      • postalcode +: string or array of string

        • string, Postal code

        • array of string, Postal code

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • city +: string, City

    • address_id +: int, Address identifier

    • country +: string, Country

    • line3 +: string, Address line 3

    • line2 +: string, Address line 2

    • line1 +: string, Address line 1

    • address_type_ids +: array, Address type identifiers

      • int

    • state +: string, State or province

    • postalcode +: string, Postal code

    • address_types +: array, Address types

      • string


2.68. GetAddressTypes

Prototype:

GetAddressTypes (auth, address_type_filter, return_fields)

Description:

Returns an array of structs containing details about address +types. If address_type_filter is specified and is an array of +address type identifiers, or a struct of address type attributes, +only address types matching the filter will be returned. If +return_fields is specified, only the specified details will be +returned.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_type_filter +: array of int or string or struct

    • array of int or string

      • int, Address type identifier

      • string, Address type

    • struct, Attribute filter

      • name +: string or array of string

        • string, Address type

        • array of string, Address type

      • address_type_id +: int or array of int

        • int, Address type identifier

        • array of int, Address type identifier

      • description +: string or array of string

        • string, Address type description

        • array of string, Address type description

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • name +: string, Address type

    • address_type_id +: int, Address type identifier

    • description +: string, Address type description


2.69. GetBootStates

Prototype:

GetBootStates (auth)

Description:

Returns an array of all valid node boot states.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • array of string, Boot state


2.70. GetConfFiles

Prototype:

GetConfFiles (auth, conf_file_filter, return_fields)

Description:

Returns an array of structs containing details about configuration +files. If conf_file_filter is specified and is an array of +configuration file identifiers, or a struct of configuration file +attributes, only configuration files matching the filter will be +returned. If return_fields is specified, only the specified +details will be returned.

Allowed Roles:

admin, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_filter +: array of int or struct

    • array of int, Configuration file identifier

    • struct, Attribute filter

      • file_owner +: string or array of string

        • string, chown(1) owner

        • array of string, chown(1) owner

      • postinstall_cmd +: string or array of string

        • string, Shell command to execute after installing

        • array of string, Shell command to execute after installing

      • error_cmd +: string or array of string

        • string, Shell command to execute if any error occurs

        • array of string, Shell command to execute if any error occurs

      • preinstall_cmd +: string or array of string

        • string, Shell command to execute prior to installing

        • array of string, Shell command to execute prior to installing

      • node_ids +: int or array of int

        • int, List of nodes linked to this file

        • array of int, List of nodes linked to this file

      • dest +: string or array of string

        • string, Absolute path where file should be installed

        • array of string, Absolute path where file should be installed

      • ignore_cmd_errors +: boolean or array of boolean

        • boolean, Install file anyway even if an error occurs

        • array of boolean, Install file anyway even if an error occurs

      • enabled +: boolean or array of boolean

        • boolean, Configuration file is active

        • array of boolean, Configuration file is active

      • conf_file_id +: int or array of int

        • int, Configuration file identifier

        • array of int, Configuration file identifier

      • file_permissions +: string or array of string

        • string, chmod(1) permissions

        • array of string, chmod(1) permissions

      • source +: string or array of string

        • string, Relative path on the boot server where file can be downloaded

        • array of string, Relative path on the boot server where file can be downloaded

      • nodegroup_ids +: int or array of int

        • int, List of node groups linked to this file

        • array of int, List of node groups linked to this file

      • always_update +: boolean or array of boolean

        • boolean, Always attempt to install file even if unchanged

        • array of boolean, Always attempt to install file even if unchanged

      • file_group +: string or array of string

        • string, chgrp(1) owner

        • array of string, chgrp(1) owner

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • file_owner +: string, chown(1) owner

    • postinstall_cmd +: string, Shell command to execute after installing

    • error_cmd +: string, Shell command to execute if any error occurs

    • preinstall_cmd +: string, Shell command to execute prior to installing

    • node_ids +: int, List of nodes linked to this file

    • dest +: string, Absolute path where file should be installed

    • ignore_cmd_errors +: boolean, Install file anyway even if an error occurs

    • enabled +: boolean, Configuration file is active

    • conf_file_id +: int, Configuration file identifier

    • file_permissions +: string, chmod(1) permissions

    • source +: string, Relative path on the boot server where file can be downloaded

    • nodegroup_ids +: int, List of node groups linked to this file

    • always_update +: boolean, Always attempt to install file even if unchanged

    • file_group +: string, chgrp(1) owner


2.71. GetEvents

Prototype:

GetEvents (auth, event_filter, return_fields)

Description:

Returns an array of structs containing details about events and +faults. If event_filter is specified and is an array of event +identifiers, or a struct of event attributes, only events matching +the filter will be returned. If return_fields is specified, only the +specified details will be returned.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • event_filter +: array of int or struct

    • array of int, Event identifier

    • struct, Attribute filter

      • fault_code +: int or array of int

        • int, Event fault code

        • array of int, Event fault code

      • event_id +: int or array of int

        • int, Event identifier

        • array of int, Event identifier

      • object_type +: string or array of string

        • string, What type of object is this event affecting

        • array of string, What type of object is this event affecting

      • node_id +: int or array of int

        • int, Identifier of node responsible for event, if any

        • array of int, Identifier of node responsible for event, if any

      • call +: string or array of string

        • string, Call responsible for this event, including paramters

        • array of string, Call responsible for this event, including paramters

      • time +: int or array of int

        • int, Date and time that the event took place, in seconds since UNIX epoch

        • array of int, Date and time that the event took place, in seconds since UNIX epoch

      • person_id +: int or array of int

        • int, Identifier of person responsible for event, if any

        • array of int, Identifier of person responsible for event, if any

      • message +: string or array of string

        • string, High level description of this event

        • array of string, High level description of this event

      • runtime +: double or array of double

        • double, Runtime of event

        • array of double, Runtime of event

      • call_name +: string or array of string

        • string, Call responsible for this event

        • array of string, Call responsible for this event

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • fault_code +: int, Event fault code

    • event_id +: int, Event identifier

    • object_type +: string, What type of object is this event affecting

    • object_ids +: array, IDs of objects affected by this event

      • int

    • node_id +: int, Identifier of node responsible for event, if any

    • call +: string, Call responsible for this event, including paramters

    • time +: int, Date and time that the event took place, in seconds since UNIX epoch

    • person_id +: int, Identifier of person responsible for event, if any

    • message +: string, High level description of this event

    • runtime +: double, Runtime of event

    • call_name +: string, Call responsible for this event


2.72. GetKeys

Prototype:

GetKeys (auth, key_filter, return_fields)

Description:

Returns an array of structs containing details about keys. If +key_filter is specified and is an array of key identifiers, or a +struct of key attributes, only keys matching the filter will be +returned. If return_fields is specified, only the specified +details will be returned.

Admin may query all keys. Non-admins may only query their own +keys.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • key_filter +: array of int or struct

    • array of int

      • int, Key identifier

    • struct, Attribute filter

      • peer_key_id +: int or array of int

        • int, Foreign key identifier at peer

        • array of int, Foreign key identifier at peer

      • key_type +: string or array of string

        • string, Key type

        • array of string, Key type

      • key +: string or array of string

        • string, Key value

        • array of string, Key value

      • person_id +: int or array of int

        • int, User to which this key belongs

        • array of int, User to which this key belongs

      • key_id +: int or array of int

        • int, Key identifier

        • array of int, Key identifier

      • peer_id +: int or array of int

        • int, Peer to which this key belongs

        • array of int, Peer to which this key belongs

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • peer_id +: int, Peer to which this key belongs

    • key_type +: string, Key type

    • key +: string, Key value

    • person_id +: int, User to which this key belongs

    • key_id +: int, Key identifier

    • peer_key_id +: int, Foreign key identifier at peer


2.73. GetKeyTypes

Prototype:

GetKeyTypes (auth)

Description:

Returns an array of all valid key types.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • array of string, Key type


2.74. GetMessages

Prototype:

GetMessages (auth, message_filter, return_fields)

Description:

Returns an array of structs containing details about message +templates. If message template_filter is specified and is an array +of message template identifiers, or a struct of message template +attributes, only message templates matching the filter will be +returned. If return_fields is specified, only the specified +details will be returned.

Allowed Roles:

admin, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • message_filter +: array of string or struct

    • array of string, Message identifier

    • struct, Attribute filter

      • enabled +: boolean or array of boolean

        • boolean, Message is enabled

        • array of boolean, Message is enabled

      • message_id +: string or array of string

        • string, Message identifier

        • array of string, Message identifier

      • template +: string or array of string

        • string, Message template

        • array of string, Message template

      • subject +: string or array of string

        • string, Message summary

        • array of string, Message summary

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • enabled +: boolean, Message is enabled

    • message_id +: string, Message identifier

    • template +: string, Message template

    • subject +: string, Message summary


2.75. GetNetworkMethods

Prototype:

GetNetworkMethods (auth)

Description:

Returns a list of all valid network methods.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • array of string, Network method


2.76. GetNetworkTypes

Prototype:

GetNetworkTypes (auth)

Description:

Returns a list of all valid network types.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • array of string, Network type


2.77. GetNodeGroups

Prototype:

GetNodeGroups (auth, nodegroup_filter, return_fields)

Description:

Returns an array of structs containing details about node groups. +If nodegroup_filter is specified and is an array of node group +identifiers or names, or a struct of node group attributes, only +node groups matching the filter will be returned. If return_fields +is specified, only the specified details will be returned.

Allowed Roles:

admin, pi, user, tech, node, anonymous

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • nodegroup_filter +: array of int or string or struct

    • array of int or string

      • int, Node group identifier

      • string, Node group name

    • struct, Attribute filter

      • nodegroup_id +: int or array of int

        • int, Node group identifier

        • array of int, Node group identifier

      • name +: string or array of string

        • string, Node group name

        • array of string, Node group name

      • description +: string or array of string

        • string, Node group description

        • array of string, Node group description

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • node_ids +: array, List of nodes in this node group

      • int

    • nodegroup_id +: int, Node group identifier

    • name +: string, Node group name

    • conf_file_ids +: array, List of configuration files specific to this node group

      • int

    • description +: string, Node group description


2.78. GetNodeNetworks

Prototype:

GetNodeNetworks (auth, nodenetwork_filter, return_fields)

Description:

Returns an array of structs containing details about node network +interfacess. If nodenetworks_filter is specified and is an array +of node network identifiers, or a struct of node network +attributes, only node network interfaces matching the filter will +be returned. If return_fields is specified, only the +specified details will be returned.

Allowed Roles:

admin, pi, user, tech, node, anonymous

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • nodenetwork_filter +: array of int or struct

    • array of int, Node interface identifier

    • struct, Attribute filter

      • nodenetwork_id +: int or array of int

        • int, Node interface identifier

        • array of int, Node interface identifier

      • network +: string or array of string

        • string, Subnet address

        • array of string, Subnet address

      • is_primary +: boolean or array of boolean

        • boolean, Is the primary interface for this node

        • array of boolean, Is the primary interface for this node

      • dns1 +: string or array of string

        • string, IP address of primary DNS server

        • array of string, IP address of primary DNS server

      • hostname +: string or array of string

        • string, (Optional) Hostname

        • array of string, (Optional) Hostname

      • mac +: string or array of string

        • string, MAC address

        • array of string, MAC address

      • bwlimit +: int or array of int

        • int, Bandwidth limit

        • array of int, Bandwidth limit

      • broadcast +: string or array of string

        • string, Network broadcast address

        • array of string, Network broadcast address

      • method +: string or array of string

        • string, Addressing method (e.g., 'static' or 'dhcp')

        • array of string, Addressing method (e.g., 'static' or 'dhcp')

      • netmask +: string or array of string

        • string, Subnet mask

        • array of string, Subnet mask

      • node_id +: int or array of int

        • int, Node associated with this interface

        • array of int, Node associated with this interface

      • dns2 +: string or array of string

        • string, IP address of secondary DNS server

        • array of string, IP address of secondary DNS server

      • ip +: string or array of string

        • string, IP address

        • array of string, IP address

      • type +: string or array of string

        • string, Address type (e.g., 'ipv4')

        • array of string, Address type (e.g., 'ipv4')

      • gateway +: string or array of string

        • string, IP address of primary gateway

        • array of string, IP address of primary gateway

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • broadcast +: string, Network broadcast address

    • is_primary +: boolean, Is the primary interface for this node

    • network +: string, Subnet address

    • ip +: string, IP address

    • dns1 +: string, IP address of primary DNS server

    • hostname +: string, (Optional) Hostname

    • netmask +: string, Subnet mask

    • gateway +: string, IP address of primary gateway

    • nodenetwork_id +: int, Node interface identifier

    • mac +: string, MAC address

    • node_id +: int, Node associated with this interface

    • dns2 +: string, IP address of secondary DNS server

    • bwlimit +: int, Bandwidth limit

    • type +: string, Address type (e.g., 'ipv4')

    • method +: string, Addressing method (e.g., 'static' or 'dhcp')


2.79. GetNodes

Prototype:

GetNodes (auth, node_filter, return_fields)

Description:

Returns an array of structs containing details about nodes. If +node_filter is specified and is an array of node identifiers or +hostnames, or a struct of node attributes, only nodes matching the +filter will be returned. If return_fields is specified, only the +specified details will be returned.

Some fields may only be viewed by admins.

Allowed Roles:

admin, pi, user, tech, node, anonymous

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_filter +: array of int or string or struct

    • array of int or string

      • int, Node identifier

      • string, Fully qualified hostname

    • struct, Attribute filter

      • last_updated +: int or array of int

        • int, Date and time when node entry was created

        • array of int, Date and time when node entry was created

      • version +: string or array of string

        • string, Apparent Boot CD version

        • array of string, Apparent Boot CD version

      • boot_state +: string or array of string

        • string, Boot state

        • array of string, Boot state

      • peer_node_id +: int or array of int

        • int, Foreign node identifier at peer

        • array of int, Foreign node identifier at peer

      • hostname +: string or array of string

        • string, Fully qualified hostname

        • array of string, Fully qualified hostname

      • site_id +: int or array of int

        • int, Site at which this node is located

        • array of int, Site at which this node is located

      • boot_nonce +: string or array of string

        • string, (Admin only) Random value generated by the node at last boot

        • array of string, (Admin only) Random value generated by the node at last boot

      • session +: string or array of string

        • string, (Admin only) Node session value

        • array of string, (Admin only) Node session value

      • ssh_rsa_key +: string or array of string

        • string, Last known SSH host key

        • array of string, Last known SSH host key

      • key +: string or array of string

        • string, (Admin only) Node key

        • array of string, (Admin only) Node key

      • date_created +: int or array of int

        • int, Date and time when node entry was created

        • array of int, Date and time when node entry was created

      • model +: string or array of string

        • string, Make and model of the actual machine

        • array of string, Make and model of the actual machine

      • peer_id +: int or array of int

        • int, Peer to which this node belongs

        • array of int, Peer to which this node belongs

      • node_id +: int or array of int

        • int, Node identifier

        • array of int, Node identifier

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • session +: string, (Admin only) Node session value

    • pcu_ids +: array, List of PCUs that control this node

      • int

    • nodegroup_ids +: array, List of node groups that this node is in

      • int

    • last_updated +: int, Date and time when node entry was created

    • version +: string, Apparent Boot CD version

    • nodenetwork_ids +: array, List of network interfaces that this node has

      • int

    • boot_state +: string, Boot state

    • peer_node_id +: int, Foreign node identifier at peer

    • hostname +: string, Fully qualified hostname

    • site_id +: int, Site at which this node is located

    • ports +: array, List of PCU ports that this node is connected to

      • int

    • slice_ids +: array, List of slices on this node

      • int

    • boot_nonce +: string, (Admin only) Random value generated by the node at last boot

    • node_id +: int, Node identifier

    • key +: string, (Admin only) Node key

    • date_created +: int, Date and time when node entry was created

    • model +: string, Make and model of the actual machine

    • peer_id +: int, Peer to which this node belongs

    • conf_file_ids +: array, List of configuration files specific to this node

      • int

    • ssh_rsa_key +: string, Last known SSH host key


2.80. GetPCUs

Prototype:

GetPCUs (auth, pcu_filter, return_fields)

Description:

Returns an array of structs containing details about power control +units (PCUs). If pcu_filter is specified and is an array of PCU +identifiers, or a struct of PCU attributes, only PCUs matching the +filter will be returned. If return_fields is specified, only the +specified details will be returned.

Admin may query all PCUs. Non-admins may only query the PCUs at +their sites.

Allowed Roles:

admin, pi, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • pcu_filter +: array of int or struct

    • array of int, PCU identifier

    • struct, Attribute filter

      • username +: string or array of string

        • string, PCU username

        • array of string, PCU username

      • protocol +: string or array of string

        • string, PCU protocol, e.g. ssh, https, telnet

        • array of string, PCU protocol, e.g. ssh, https, telnet

      • ip +: string or array of string

        • string, PCU IP address

        • array of string, PCU IP address

      • pcu_id +: int or array of int

        • int, PCU identifier

        • array of int, PCU identifier

      • hostname +: string or array of string

        • string, PCU hostname

        • array of string, PCU hostname

      • site_id +: int or array of int

        • int, Identifier of site where PCU is located

        • array of int, Identifier of site where PCU is located

      • model +: string or array of string

        • string, PCU model string

        • array of string, PCU model string

      • password +: string or array of string

        • string, PCU username

        • array of string, PCU username

      • notes +: string or array of string

        • string, Miscellaneous notes

        • array of string, Miscellaneous notes

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • username +: string, PCU username

    • protocol +: string, PCU protocol, e.g. ssh, https, telnet

    • node_ids +: array, List of nodes that this PCU controls

      • int

    • ip +: string, PCU IP address

    • pcu_id +: int, PCU identifier

    • hostname +: string, PCU hostname

    • site_id +: int, Identifier of site where PCU is located

    • ports +: array, List of the port numbers that each node is connected to

      • int

    • model +: string, PCU model string

    • password +: string, PCU username

    • notes +: string, Miscellaneous notes


2.81. GetPeerData

Prototype:

GetPeerData (auth)

Description:

Returns lists of local objects that a peer should cache in its +database as foreign objects. Also returns the list of foreign +nodes in this database, for which the calling peer is +authoritative, to assist in synchronization of slivers.

See the implementation of RefreshPeer for how this data is used.

Allowed Roles:

admin, peer

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • struct

    • Slices +: array, List of local slices

      • struct

    • Keys +: array, List of local keys

      • struct

    • Sites +: array, List of local sites

      • struct

    • Persons +: array, List of local users

      • struct

    • Nodes +: array, List of local nodes

      • struct

    • db_time +: double, (Debug) Database fetch time


2.82. GetPeerName

Prototype:

GetPeerName (auth)

Description:

Returns this peer's name, as defined in the config as PLC_NAME

Allowed Roles:

admin, peer, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • string, Peer name


2.83. GetPeers

Prototype:

GetPeers (auth, peer_filter, return_fields)

Description:

Returns an array of structs containing details about peers. If +person_filter is specified and is an array of peer identifiers or +peer names, or a struct of peer attributes, only peers matching +the filter will be returned. If return_fields is specified, only the +specified details will be returned.

Allowed Roles:

admin, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • peer_filter +: array of int or string or struct

    • array of int or string

      • int, Peer identifier

      • string, Peer name

    • struct, Attribute filter

      • key +: string or array of string

        • string, Peer GPG public key

        • array of string, Peer GPG public key

      • cacert +: string or array of string

        • string, Peer SSL public certificate

        • array of string, Peer SSL public certificate

      • peer_id +: int or array of int

        • int, Peer identifier

        • array of int, Peer identifier

      • peername +: string or array of string

        • string, Peer name

        • array of string, Peer name

      • peer_url +: string or array of string

        • string, Peer API URL

        • array of string, Peer API URL

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • node_ids +: array, List of nodes for which this peer is authoritative

      • int

    • key_ids +: array, List of keys for which this peer is authoritative

      • int

    • person_ids +: array, List of users for which this peer is authoritative

      • int

    • peername +: string, Peer name

    • peer_url +: string, Peer API URL

    • slice_ids +: array, List of slices for which this peer is authoritative

      • int

    • key +: string, Peer GPG public key

    • cacert +: string, Peer SSL public certificate

    • site_ids +: array, List of sites for which this peer is authoritative

      • int

    • peer_id +: int, Peer identifier


2.84. GetPersons

Prototype:

GetPersons (auth, person_filter, return_fields)

Description:

Returns an array of structs containing details about users. If +person_filter is specified and is an array of user identifiers or +usernames, or a struct of user attributes, only users matching the +filter will be returned. If return_fields is specified, only the +specified details will be returned.

Users and techs may only retrieve details about themselves. PIs +may retrieve details about themselves and others at their +sites. Admins and nodes may retrieve details about all accounts.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_filter +: array of int or string or struct

    • array of int or string

      • int, User identifier

      • string, Primary e-mail address

    • struct, Attribute filter

      • bio +: string or array of string

        • string, Biography

        • array of string, Biography

      • first_name +: string or array of string

        • string, Given name

        • array of string, Given name

      • last_name +: string or array of string

        • string, Surname

        • array of string, Surname

      • last_updated +: int or array of int

        • int, Date and time of last update

        • array of int, Date and time of last update

      • title +: string or array of string

        • string, Title

        • array of string, Title

      • url +: string or array of string

        • string, Home page

        • array of string, Home page

      • verification_key +: string or array of string

        • string, Reset password key

        • array of string, Reset password key

      • enabled +: boolean or array of boolean

        • boolean, Has been enabled

        • array of boolean, Has been enabled

      • phone +: string or array of string

        • string, Telephone number

        • array of string, Telephone number

      • peer_person_id +: int or array of int

        • int, Foreign user identifier at peer

        • array of int, Foreign user identifier at peer

      • password +: string or array of string

        • string, Account password in crypt() form

        • array of string, Account password in crypt() form

      • person_id +: int or array of int

        • int, User identifier

        • array of int, User identifier

      • date_created +: int or array of int

        • int, Date and time when account was created

        • array of int, Date and time when account was created

      • peer_id +: int or array of int

        • int, Peer to which this user belongs

        • array of int, Peer to which this user belongs

      • verification_expires +: int or array of int

        • int, Date and time when verification_key expires

        • array of int, Date and time when verification_key expires

      • email +: string or array of string

        • string, Primary e-mail address

        • array of string, Primary e-mail address

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • bio +: string, Biography

    • first_name +: string, Given name

    • last_name +: string, Surname

    • last_updated +: int, Date and time of last update

    • roles +: array, List of roles

      • string

    • title +: string, Title

    • url +: string, Home page

    • key_ids +: array, List of key identifiers

      • int

    • enabled +: boolean, Has been enabled

    • slice_ids +: array, List of slice identifiers

      • int

    • phone +: string, Telephone number

    • peer_person_id +: int, Foreign user identifier at peer

    • role_ids +: array, List of role identifiers

      • int

    • person_id +: int, User identifier

    • date_created +: int, Date and time when account was created

    • site_ids +: array, List of site identifiers

      • int

    • peer_id +: int, Peer to which this user belongs

    • email +: string, Primary e-mail address


2.85. GetRoles

Prototype:

GetRoles (auth)

Description:

Get an array of structs containing details about all roles.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • array of struct

    • name +: string, Role

    • role_id +: int, Role identifier


2.86. GetSession

Prototype:

GetSession (auth)

Description:

Returns a new session key if a user or node authenticated +successfully, faults otherwise.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • string, Session key


2.87. GetSites

Prototype:

GetSites (auth, site_filter, return_fields)

Description:

Returns an array of structs containing details about sites. If +site_filter is specified and is an array of site identifiers or +hostnames, or a struct of site attributes, only sites matching the +filter will be returned. If return_fields is specified, only the +specified details will be returned.

Allowed Roles:

admin, pi, user, tech, node, anonymous

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • site_filter +: array of int or string or struct

    • array of int or string

      • int, Site identifier

      • string, Site slice prefix

    • struct, Attribute filter

      • last_updated +: int or array of int

        • int, Date and time when site entry was last updated, in seconds since UNIX epoch

        • array of int, Date and time when site entry was last updated, in seconds since UNIX epoch

      • name +: string or array of string

        • string, Full site name

        • array of string, Full site name

      • url +: string or array of string

        • string, URL of a page that describes the site

        • array of string, URL of a page that describes the site

      • site_id +: int or array of int

        • int, Site identifier

        • array of int, Site identifier

      • enabled +: boolean or array of boolean

        • boolean, Has been enabled

        • array of boolean, Has been enabled

      • longitude +: double or array of double

        • double, Decimal longitude of the site

        • array of double, Decimal longitude of the site

      • latitude +: double or array of double

        • double, Decimal latitude of the site

        • array of double, Decimal latitude of the site

      • max_slices +: int or array of int

        • int, Maximum number of slices that the site is able to create

        • array of int, Maximum number of slices that the site is able to create

      • login_base +: string or array of string

        • string, Site slice prefix

        • array of string, Site slice prefix

      • is_public +: boolean or array of boolean

        • boolean, Publicly viewable site

        • array of boolean, Publicly viewable site

      • max_slivers +: int or array of int

        • int, Maximum number of slivers that the site is able to create

        • array of int, Maximum number of slivers that the site is able to create

      • date_created +: int or array of int

        • int, Date and time when site entry was created, in seconds since UNIX epoch

        • array of int, Date and time when site entry was created, in seconds since UNIX epoch

      • peer_site_id +: int or array of int

        • int, Foreign site identifier at peer

        • array of int, Foreign site identifier at peer

      • peer_id +: int or array of int

        • int, Peer to which this site belongs

        • array of int, Peer to which this site belongs

      • abbreviated_name +: string or array of string

        • string, Abbreviated site name

        • array of string, Abbreviated site name

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • address_ids +: array, List of address identifiers

      • int

    • pcu_ids +: array, List of PCU identifiers

      • int

    • last_updated +: int, Date and time when site entry was last updated, in seconds since UNIX epoch

    • name +: string, Full site name

    • node_ids +: array, List of site node identifiers

      • int

    • url +: string, URL of a page that describes the site

    • enabled +: boolean, Has been enabled

    • person_ids +: array, List of account identifiers

      • int

    • site_id +: int, Site identifier

    • longitude +: double, Decimal longitude of the site

    • slice_ids +: array, List of slice identifiers

      • int

    • max_slivers +: int, Maximum number of slivers that the site is able to create

    • max_slices +: int, Maximum number of slices that the site is able to create

    • login_base +: string, Site slice prefix

    • date_created +: int, Date and time when site entry was created, in seconds since UNIX epoch

    • latitude +: double, Decimal latitude of the site

    • is_public +: boolean, Publicly viewable site

    • peer_site_id +: int, Foreign site identifier at peer

    • peer_id +: int, Peer to which this site belongs

    • abbreviated_name +: string, Abbreviated site name


2.88. GetSliceAttributes

Prototype:

GetSliceAttributes (auth, slice_attribute_filter, return_fields)

Description:

Returns an array of structs containing details about slice and +sliver attributes. An attribute is a sliver attribute if the +node_id field is set. If slice_attribute_filter is specified and +is an array of slice attribute identifiers, or a struct of slice +attribute attributes, only slice attributes matching the filter +will be returned. If return_fields is specified, only the +specified details will be returned.

Users may only query attributes of slices or slivers of which they +are members. PIs may only query attributes of slices or slivers at +their sites, or of which they are members. Admins may query +attributes of any slice or sliver.

Allowed Roles:

admin, pi, user, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_attribute_filter +: array of int or struct

    • array of int, Slice attribute identifier

    • struct, Attribute filter

      • name +: string or array of string

        • string, Slice attribute type name

        • array of string, Slice attribute type name

      • slice_id +: int or array of int

        • int, Slice identifier

        • array of int, Slice identifier

      • slice_attribute_id +: int or array of int

        • int, Slice attribute identifier

        • array of int, Slice attribute identifier

      • value +: string or array of string

        • string, Slice attribute value

        • array of string, Slice attribute value

      • attribute_type_id +: int or array of int

        • int, Slice attribute type identifier

        • array of int, Slice attribute type identifier

      • node_id +: int or array of int

        • int, Node identifier, if a sliver attribute

        • array of int, Node identifier, if a sliver attribute

      • min_role_id +: int or array of int

        • int, Minimum (least powerful) role that can set or change this attribute

        • array of int, Minimum (least powerful) role that can set or change this attribute

      • description +: string or array of string

        • string, Slice attribute type description

        • array of string, Slice attribute type description

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • name +: string, Slice attribute type name

    • slice_id +: int, Slice identifier

    • slice_attribute_id +: int, Slice attribute identifier

    • value +: string, Slice attribute value

    • attribute_type_id +: int, Slice attribute type identifier

    • node_id +: int, Node identifier, if a sliver attribute

    • min_role_id +: int, Minimum (least powerful) role that can set or change this attribute

    • description +: string, Slice attribute type description


2.89. GetSliceAttributeTypes

Prototype:

GetSliceAttributeTypes (auth, attribute_type_filter, return_fields)

Description:

Returns an array of structs containing details about slice +attribute types. If attribute_type_filter is specified and +is an array of slice attribute type identifiers, or a +struct of slice attribute type attributes, only slice attribute +types matching the filter will be returned. If return_fields is +specified, only the specified details will be returned.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • attribute_type_filter +: array of int or string or struct

    • array of int or string

      • int, Slice attribute type identifier

      • string, Slice attribute type name

    • struct, Attribute filter

      • attribute_type_id +: int or array of int

        • int, Slice attribute type identifier

        • array of int, Slice attribute type identifier

      • min_role_id +: int or array of int

        • int, Minimum (least powerful) role that can set or change this attribute

        • array of int, Minimum (least powerful) role that can set or change this attribute

      • name +: string or array of string

        • string, Slice attribute type name

        • array of string, Slice attribute type name

      • description +: string or array of string

        • string, Slice attribute type description

        • array of string, Slice attribute type description

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • attribute_type_id +: int, Slice attribute type identifier

    • min_role_id +: int, Minimum (least powerful) role that can set or change this attribute

    • name +: string, Slice attribute type name

    • description +: string, Slice attribute type description


2.90. GetSliceInstantiations

Prototype:

GetSliceInstantiations (auth)

Description:

Returns an array of all valid slice instantiation states.

Allowed Roles:

admin, pi, user, tech, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

Returns:

  • array of string, Slice instantiation state


2.91. GetSlices

Prototype:

GetSlices (auth, slice_filter, return_fields)

Description:

Returns an array of structs containing details about slices. If +slice_filter is specified and is an array of slice identifiers or +slice names, or a struct of slice attributes, only slices matching +the filter will be returned. If return_fields is specified, only the +specified details will be returned.

Users may only query slices of which they are members. PIs may +query any of the slices at their sites. Admins and nodes may query +any slice. If a slice that cannot be queried is specified in +slice_filter, details about that slice will not be returned.

Allowed Roles:

admin, pi, user, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_filter +: array of int or string or struct

    • array of int or string

      • int, Slice identifier

      • string, Slice name

    • struct, Attribute filter

      • creator_person_id +: int or array of int

        • int, Identifier of the account that created this slice

        • array of int, Identifier of the account that created this slice

      • instantiation +: string or array of string

        • string, Slice instantiation state

        • array of string, Slice instantiation state

      • name +: string or array of string

        • string, Slice name

        • array of string, Slice name

      • slice_id +: int or array of int

        • int, Slice identifier

        • array of int, Slice identifier

      • created +: int or array of int

        • int, Date and time when slice was created, in seconds since UNIX epoch

        • array of int, Date and time when slice was created, in seconds since UNIX epoch

      • url +: string or array of string

        • string, URL further describing this slice

        • array of string, URL further describing this slice

      • max_nodes +: int or array of int

        • int, Maximum number of nodes that can be assigned to this slice

        • array of int, Maximum number of nodes that can be assigned to this slice

      • expires +: int or array of int

        • int, Date and time when slice expires, in seconds since UNIX epoch

        • array of int, Date and time when slice expires, in seconds since UNIX epoch

      • site_id +: int or array of int

        • int, Identifier of the site to which this slice belongs

        • array of int, Identifier of the site to which this slice belongs

      • peer_slice_id +: int or array of int

        • int, Foreign slice identifier at peer

        • array of int, Foreign slice identifier at peer

      • peer_id +: int or array of int

        • int, Peer to which this slice belongs

        • array of int, Peer to which this slice belongs

      • description +: string or array of string

        • string, Slice description

        • array of string, Slice description

  • return_fields +: array, List of fields to return

    • string

Returns:

  • array of struct

    • creator_person_id +: int, Identifier of the account that created this slice

    • instantiation +: string, Slice instantiation state

    • slice_attribute_ids +: array, List of slice attributes

      • int

    • name +: string, Slice name

    • slice_id +: int, Slice identifier

    • created +: int, Date and time when slice was created, in seconds since UNIX epoch

    • url +: string, URL further describing this slice

    • max_nodes +: int, Maximum number of nodes that can be assigned to this slice

    • person_ids +: array, List of accounts that can use this slice

      • int

    • expires +: int, Date and time when slice expires, in seconds since UNIX epoch

    • site_id +: int, Identifier of the site to which this slice belongs

    • peer_slice_id +: int, Foreign slice identifier at peer

    • node_ids +: array, List of nodes in this slice

      • int

    • peer_id +: int, Peer to which this slice belongs

    • description +: string, Slice description


2.92. GetSliceTicket

Prototype:

GetSliceTicket (auth, slice_id_or_name)

Description:

Returns a ticket for, or signed representation of, the specified +slice. Slice tickets may be used to manually instantiate or update +a slice on a node. Present this ticket to the local Node Manager +interface to redeem it.

If the slice has not been added to a node with AddSliceToNodes, +and the ticket is redeemed on that node, it will be deleted the +next time the Node Manager contacts the API.

Users may only obtain tickets for slices of which they are +members. PIs may obtain tickets for any of the slices at their +sites, or any slices of which they are members. Admins may obtain +tickets for any slice.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user, peer

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice name

Returns:

  • string, Signed slice ticket


2.93. GetSlivers

Prototype:

GetSlivers (auth, node_id_or_hostname)

Description:

Returns a struct containing information about the specified node +(or calling node, if called by a node and node_id_or_hostname is +not specified), including the current set of slivers bound to the +node.

All of the information returned by this call can be gathered from +other calls, e.g. GetNodes, GetNodeNetworks, GetSlices, etc. This +function exists almost solely for the benefit of Node Manager.

Allowed Roles:

admin, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • struct

    • timestamp +: int, Timestamp of this call, in seconds since UNIX epoch

    • hostname +: string, Fully qualified hostname

    • conf_files +: array of struct

      • file_owner +: string, chown(1) owner

      • postinstall_cmd +: string, Shell command to execute after installing

      • error_cmd +: string, Shell command to execute if any error occurs

      • preinstall_cmd +: string, Shell command to execute prior to installing

      • node_ids +: int, List of nodes linked to this file

      • dest +: string, Absolute path where file should be installed

      • ignore_cmd_errors +: boolean, Install file anyway even if an error occurs

      • enabled +: boolean, Configuration file is active

      • conf_file_id +: int, Configuration file identifier

      • file_permissions +: string, chmod(1) permissions

      • source +: string, Relative path on the boot server where file can be downloaded

      • nodegroup_ids +: int, List of node groups linked to this file

      • always_update +: boolean, Always attempt to install file even if unchanged

      • file_group +: string, chgrp(1) owner

    • node_id +: int, Node identifier

    • groups +: array of string, Node group name

    • networks +: array of struct

      • broadcast +: string, Network broadcast address

      • is_primary +: boolean, Is the primary interface for this node

      • network +: string, Subnet address

      • ip +: string, IP address

      • dns1 +: string, IP address of primary DNS server

      • hostname +: string, (Optional) Hostname

      • netmask +: string, Subnet mask

      • gateway +: string, IP address of primary gateway

      • nodenetwork_id +: int, Node interface identifier

      • mac +: string, MAC address

      • node_id +: int, Node associated with this interface

      • dns2 +: string, IP address of secondary DNS server

      • bwlimit +: int, Bandwidth limit

      • type +: string, Address type (e.g., 'ipv4')

      • method +: string, Addressing method (e.g., 'static' or 'dhcp')

    • slivers +: array of struct

      • instantiation +: string, Slice instantiation state

      • name +: string, Slice name

      • slice_id +: int, Slice identifier

      • keys +: array of struct

        • key_type +: string, Key type

        • key +: string, Key value

      • expires +: int, Date and time when slice expires, in seconds since UNIX epoch

      • attributes +: array of struct

        • name +: string, Slice attribute type name

        • value +: string, Slice attribute value


2.94. NotifyPersons

Prototype:

NotifyPersons (auth, person_filter, subject, body)

Description:

Sends an e-mail message to the specified users. If person_filter +is specified and is an array of user identifiers or usernames, or +a struct of user attributes, only users matching the filter will +receive the message.

Returns 1 if successful.

Allowed Roles:

admin, node

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_filter +: array of int or string or struct

    • array of int or string

      • int, User identifier

      • string, Primary e-mail address

    • struct, Attribute filter

      • bio +: string or array of string

        • string, Biography

        • array of string, Biography

      • first_name +: string or array of string

        • string, Given name

        • array of string, Given name

      • last_name +: string or array of string

        • string, Surname

        • array of string, Surname

      • last_updated +: int or array of int

        • int, Date and time of last update

        • array of int, Date and time of last update

      • title +: string or array of string

        • string, Title

        • array of string, Title

      • url +: string or array of string

        • string, Home page

        • array of string, Home page

      • verification_key +: string or array of string

        • string, Reset password key

        • array of string, Reset password key

      • enabled +: boolean or array of boolean

        • boolean, Has been enabled

        • array of boolean, Has been enabled

      • phone +: string or array of string

        • string, Telephone number

        • array of string, Telephone number

      • peer_person_id +: int or array of int

        • int, Foreign user identifier at peer

        • array of int, Foreign user identifier at peer

      • password +: string or array of string

        • string, Account password in crypt() form

        • array of string, Account password in crypt() form

      • person_id +: int or array of int

        • int, User identifier

        • array of int, User identifier

      • date_created +: int or array of int

        • int, Date and time when account was created

        • array of int, Date and time when account was created

      • peer_id +: int or array of int

        • int, Peer to which this user belongs

        • array of int, Peer to which this user belongs

      • verification_expires +: int or array of int

        • int, Date and time when verification_key expires

        • array of int, Date and time when verification_key expires

      • email +: string or array of string

        • string, Primary e-mail address

        • array of string, Primary e-mail address

  • subject +: string, E-mail subject

  • body +: string, E-mail body

Returns:

  • int, 1 if successful


2.95. RebootNode

Prototype:

RebootNode (auth, node_id_or_hostname)

Description:

Sends the specified node a specially formatted UDP packet which +should cause it to reboot immediately.

Admins can reboot any node. Techs and PIs can only reboot nodes at +their site.

Returns 1 if the packet was successfully sent (which only whether +the packet was sent, not whether the reboot was successful).

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

Returns:

  • int, 1 if successful


2.96. RefreshPeer

Prototype:

RefreshPeer (auth, peer_id_or_peername)

Description:

Fetches node and slice data from the specified peer and caches it +locally; also deletes stale entries. Returns 1 if successful, +faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • peer_id_or_peername +: int or string

    • int, Peer identifier

    • string, Peer name

Returns:

  • int, 1 if successful


2.97. ResetPassword

Prototype:

ResetPassword (auth, person_id_or_email, verification_key, verification_expires)

Description:

If verification_key is not specified, then a new verification_key +will be generated and stored with the user's account. The key will +be e-mailed to the user in the form of a link to a web page.

The web page should verify the key by calling this function again +and specifying verification_key. If the key matches what has been +stored in the user's account, a new random password will be +e-mailed to the user.

Returns 1 if verification_key was not specified, or was specified +and is valid, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • verification_key +: string, Reset password key

  • verification_expires +: int, Date and time when verification_key expires

Returns:

  • int, 1 if verification_key is valid


2.98. SetPersonPrimarySite

Prototype:

SetPersonPrimarySite (auth, person_id_or_email, site_id_or_login_base)

Description:

Makes the specified site the person's primary site. The person +must already be a member of the site.

Admins may update anyone. All others may only update themselves.

Allowed Roles:

admin, pi, user, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

Returns:

  • int, 1 if successful


2.99. UpdateAddress

Prototype:

UpdateAddress (auth, address_id, address_fields)

Description:

Updates the parameters of an existing address with the values in +address_fields.

PIs may only update addresses of their own sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_id +: int, Address identifier

  • address_fields +: struct

    • city +: string, City

    • country +: string, Country

    • line3 +: string, Address line 3

    • line2 +: string, Address line 2

    • line1 +: string, Address line 1

    • state +: string, State or province

    • postalcode +: string, Postal code

Returns:

  • int, 1 if successful


2.100. UpdateAddressType

Prototype:

UpdateAddressType (auth, address_type_id_or_name, address_type_fields)

Description:

Updates the parameters of an existing address type with the values +in address_type_fields.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • address_type_id_or_name +: int or string

    • int, Address type identifier

    • string, Address type

  • address_type_fields +: struct

    • name +: string, Address type

    • description +: string, Address type description

Returns:

  • int, 1 if successful


2.101. UpdateConfFile

Prototype:

UpdateConfFile (auth, conf_file_id, conf_file_fields)

Description:

Updates a node configuration file. Only the fields specified in +conf_file_fields are updated, all other fields are left untouched.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • conf_file_id +: int, Configuration file identifier

  • conf_file_fields +: struct

    • file_owner +: string, chown(1) owner

    • postinstall_cmd +: string, Shell command to execute after installing

    • error_cmd +: string, Shell command to execute if any error occurs

    • preinstall_cmd +: string, Shell command to execute prior to installing

    • dest +: string, Absolute path where file should be installed

    • ignore_cmd_errors +: boolean, Install file anyway even if an error occurs

    • enabled +: boolean, Configuration file is active

    • file_permissions +: string, chmod(1) permissions

    • source +: string, Relative path on the boot server where file can be downloaded

    • always_update +: boolean, Always attempt to install file even if unchanged

    • file_group +: string, chgrp(1) owner

Returns:

  • int, 1 if successful


2.102. UpdateKey

Prototype:

UpdateKey (auth, key_id, key_fields)

Description:

Updates the parameters of an existing key with the values in +key_fields.

Non-admins may only update their own keys.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • key_id +: int, Key identifier

  • key_fields +: struct

    • key_type +: string, Key type

    • key +: string, Key value

Returns:

  • int, 1 if successful


2.103. UpdateMessage

Prototype:

UpdateMessage (auth, message_id, message_fields)

Description:

Updates the parameters of an existing message template with the +values in message_fields.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • message_id +: string, Message identifier

  • message_fields +: struct

    • enabled +: boolean, Message is enabled

    • template +: string, Message template

Returns:

  • int, 1 if successful


2.104. UpdateNodeGroup

Prototype:

UpdateNodeGroup (auth, nodegroup_id_or_name, nodegroup_fields)

Description:

Updates a custom node group.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • nodegroup_id_or_name +: int or string

    • int, Node group identifier

    • string, Node group name

  • nodegroup_fields +: struct

    • name +: string, Node group name

    • description +: string, Node group description

Returns:

  • int, 1 if successful


2.105. UpdateNodeNetwork

Prototype:

UpdateNodeNetwork (auth, nodenetwork_id, nodenetwork_fields)

Description:

Updates an existing node network. Any values specified in +nodenetwork_fields are used, otherwise defaults are +used. Acceptable values for method are dhcp and static. If type is +static, then ip, gateway, network, broadcast, netmask, and dns1 +must all be specified in nodenetwork_fields. If type is dhcp, +these parameters, even if specified, are ignored.

PIs and techs may only update networks associated with their own +nodes. Admins may update any node network.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • nodenetwork_id +: int, Node interface identifier

  • nodenetwork_fields +: struct

    • network +: string, Subnet address

    • is_primary +: boolean, Is the primary interface for this node

    • dns1 +: string, IP address of primary DNS server

    • hostname +: string, (Optional) Hostname

    • mac +: string, MAC address

    • bwlimit +: int, Bandwidth limit

    • broadcast +: string, Network broadcast address

    • method +: string, Addressing method (e.g., 'static' or 'dhcp')

    • netmask +: string, Subnet mask

    • dns2 +: string, IP address of secondary DNS server

    • ip +: string, IP address

    • type +: string, Address type (e.g., 'ipv4')

    • gateway +: string, IP address of primary gateway

Returns:

  • int, 1 if successful


2.106. UpdateNode

Prototype:

UpdateNode (auth, node_id_or_hostname, node_fields)

Description:

Updates a node. Only the fields specified in node_fields are +updated, all other fields are left untouched.

PIs and techs can update only the nodes at their sites. Only +admins can update the key, session, and boot_nonce fields.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • node_id_or_hostname +: int or string

    • int, Node identifier

    • string, Fully qualified hostname

  • node_fields +: struct

    • version +: string, Apparent Boot CD version

    • boot_state +: string, Boot state

    • hostname +: string, Fully qualified hostname

    • boot_nonce +: string, (Admin only) Random value generated by the node at last boot

    • session +: string, (Admin only) Node session value

    • key +: string, (Admin only) Node key

    • model +: string, Make and model of the actual machine

Returns:

  • int, 1 if successful


2.107. UpdatePCU

Prototype:

UpdatePCU (auth, pcu_id, pcu_fields)

Description:

Updates the parameters of an existing PCU with the values in +pcu_fields.

Non-admins may only update PCUs at their sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • pcu_id +: int, PCU identifier

  • pcu_fields +: struct

    • username +: string, PCU username

    • protocol +: string, PCU protocol, e.g. ssh, https, telnet

    • node_ids +: array, List of nodes that this PCU controls

      • int

    • ip +: string, PCU IP address

    • notes +: string, Miscellaneous notes

    • hostname +: string, PCU hostname

    • model +: string, PCU model string

    • password +: string, PCU username

    • ports +: array, List of the port numbers that each node is connected to

      • int

Returns:

  • int, 1 if successful


2.108. UpdatePeer

Prototype:

UpdatePeer (auth, peer_id_or_name, peer_fields)

Description:

Updates a peer. Only the fields specified in peer_fields are +updated, all other fields are left untouched.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • peer_id_or_name +: int or string

    • int, Peer identifier

    • string, Peer name

  • peer_fields +: struct

    • key +: string, Peer GPG public key

    • cacert +: string, Peer SSL public certificate

    • peername +: string, Peer name

    • peer_url +: string, Peer API URL

Returns:

  • int, 1 if successful


2.109. UpdatePerson

Prototype:

UpdatePerson (auth, person_id_or_email, person_fields)

Description:

Updates a person. Only the fields specified in person_fields are +updated, all other fields are left untouched.

Users and techs can only update themselves. PIs can only update +themselves and other non-PIs at their sites.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user, tech

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • person_fields +: struct

    • bio +: string, Biography

    • first_name +: string, Given name

    • last_name +: string, Surname

    • title +: string, Title

    • url +: string, Home page

    • enabled +: boolean, Has been enabled

    • phone +: string, Telephone number

    • password +: string, Account password in crypt() form

    • email +: string, Primary e-mail address

Returns:

  • int, 1 if successful


2.110. UpdateSite

Prototype:

UpdateSite (auth, site_id_or_login_base, site_fields)

Description:

Updates a site. Only the fields specified in update_fields are +updated, all other fields are left untouched.

PIs can only update sites they are a member of. Only admins can +update max_slices, max_slivers, and login_base.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • site_id_or_login_base +: int or string

    • int, Site identifier

    • string, Site slice prefix

  • site_fields +: struct

    • name +: string, Full site name

    • url +: string, URL of a page that describes the site

    • enabled +: boolean, Has been enabled

    • longitude +: double, Decimal longitude of the site

    • latitude +: double, Decimal latitude of the site

    • max_slices +: int, Maximum number of slices that the site is able to create

    • login_base +: string, Site slice prefix

    • max_slivers +: int, Maximum number of slivers that the site is able to create

    • is_public +: boolean, Publicly viewable site

    • abbreviated_name +: string, Abbreviated site name

Returns:

  • int, 1 if successful


2.111. UpdateSliceAttribute

Prototype:

UpdateSliceAttribute (auth, slice_attribute_id, value)

Description:

Updates the value of an existing slice or sliver attribute.

Users may only update attributes of slices or slivers of which +they are members. PIs may only update attributes of slices or +slivers at their sites, or of which they are members. Admins may +update attributes of any slice or sliver.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_attribute_id +: int, Slice attribute identifier

  • value +: string, Slice attribute value

Returns:

  • int, 1 if successful


2.112. UpdateSliceAttributeType

Prototype:

UpdateSliceAttributeType (auth, attribute_type_id_or_name, attribute_type_fields)

Description:

Updates the parameters of an existing attribute with the values in +attribute_type_fields.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • attribute_type_id_or_name +: int or string

    • int, Slice attribute type identifier

    • string, Slice attribute type name

  • attribute_type_fields +: struct

    • min_role_id +: int, Minimum (least powerful) role that can set or change this attribute

    • name +: string, Slice attribute type name

    • description +: string, Slice attribute type description

Returns:

  • int, 1 if successful


2.113. UpdateSlice

Prototype:

UpdateSlice (auth, slice_id_or_name, slice_fields)

Description:

Updates the parameters of an existing slice with the values in +slice_fields.

Users may only update slices of which they are members. PIs may +update any of the slices at their sites, or any slices of which +they are members. Admins may update any slice.

Only PIs and admins may update max_nodes. Slices cannot be renewed +(by updating the expires parameter) more than 8 weeks into the +future.

Returns 1 if successful, faults otherwise.

Allowed Roles:

admin, pi, user

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • slice_id_or_name +: int or string

    • int, Slice identifier

    • string, Slice name

  • slice_fields +: struct

    • url +: string, URL further describing this slice

    • max_nodes +: int, Maximum number of nodes that can be assigned to this slice

    • instantiation +: string, Slice instantiation state

    • expires +: int, Date and time when slice expires, in seconds since UNIX epoch

    • description +: string, Slice description

Returns:

  • int, 1 if successful


2.114. VerifyPerson

Prototype:

VerifyPerson (auth, person_id_or_email, verification_key, verification_expires)

Description:

Verify a new (must be disabled) user's e-mail address and registration.

If verification_key is not specified, then a new verification_key +will be generated and stored with the user's account. The key will +be e-mailed to the user in the form of a link to a web page.

The web page should verify the key by calling this function again +and specifying verification_key. If the key matches what has been +stored in the user's account, then an e-mail will be sent to the +user's PI (and support if the user is requesting a PI role), +asking the PI (or support) to enable the account.

Returns 1 if the verification key if valid.

Allowed Roles:

admin

Parameters:

  • auth +: struct, API authentication structure

    • AuthMethod +: string, Authentication method to use

  • person_id_or_email +: int or string

    • int, User identifier

    • string, Primary e-mail address

  • verification_key +: string, Reset password key

  • verification_expires +: int, Date and time when verification_key expires

Returns:

  • int, 1 if verification_key is valid


2.115. system.listMethods

Prototype:

system.listMethods ()

Description:

This method lists all the methods that the XML-RPC server knows +how to dispatch.

Allowed Roles:

Parameters:

  • None

Returns:

  • array, List of methods


2.116. system.methodHelp

Prototype:

system.methodHelp (method)

Description:

Returns help text if defined for the method passed, otherwise +returns an empty string.

Allowed Roles:

Parameters:

  • method +: string, Method name

Returns:

  • string, Method help


2.117. system.methodSignature

Prototype:

system.methodSignature (method)

Description:

Returns an array of known signatures (an array of arrays) for the +method name passed. If no signatures are known, returns a +none-array (test for type != array to detect missing signature).

Allowed Roles:

Parameters:

  • method +: string, Method name

Returns:

  • array of array, Method signature

    • string


2.118. system.multicall

Prototype:

system.multicall (calls)

Description:

Process an array of calls, and return an array of results. Calls +should be structs of the form

{'methodName': string, 'params': array}

Each result will either be a single-item array containg the result +value, or a struct of the form

{'faultCode': int, 'faultString': string}

This is useful when you need to make lots of small calls without +lots of round trips.

Allowed Roles:

Parameters:

  • calls +: array of struct

    • params +: array, Method arguments

    • methodName +: string, Method name

Returns:

  • array of mixed or struct

    • array of mixed

    • struct

      • faultCode +: int, XML-RPC fault code

      • faultString +: int, XML-RPC fault detail

\ No newline at end of file diff --git a/doc/PLCAPI.pdf b/doc/PLCAPI.pdf new file mode 100644 index 0000000..4c3abd0 --- /dev/null +++ b/doc/PLCAPI.pdf @@ -0,0 +1,37971 @@ +%PDF-1.4 +1 0 obj +<< /S /GoTo /D (1.0) >> +endobj +4 0 obj +(PlanetLab Central API Documentation) +endobj +5 0 obj +<< /S /GoTo /D (2.0) >> +endobj +8 0 obj +(Table of Contents) +endobj +9 0 obj +<< /S /GoTo /D (3.0) >> +endobj +12 0 obj +(Chapter 1. Introduction) +endobj +13 0 obj +<< /S /GoTo /D (3.1.1) >> +endobj +16 0 obj +(1.1. Authentication) +endobj +17 0 obj +<< /S /GoTo /D (3.2.1) >> +endobj +20 0 obj +(1.2. Roles) +endobj +21 0 obj +<< /S /GoTo /D (3.3.1) >> +endobj +24 0 obj +(1.3. Filters) +endobj +25 0 obj +<< /S /GoTo /D (3.4.1) >> +endobj +28 0 obj +(1.4. PlanetLab shell) +endobj +29 0 obj +<< /S /GoTo /D (4.0) >> +endobj +32 0 obj +(Chapter 2. PlanetLab API Methods) +endobj +33 0 obj +<< /S /GoTo /D (4.5.1) >> +endobj +36 0 obj +(2.1. AddAddressType) +endobj +37 0 obj +<< /S /GoTo /D (4.6.1) >> +endobj +40 0 obj +(2.2. AddAddressTypeToAddress) +endobj +41 0 obj +<< /S /GoTo /D (4.7.1) >> +endobj +44 0 obj +(2.3. AddBootState) +endobj +45 0 obj +<< /S /GoTo /D (4.8.1) >> +endobj +48 0 obj +(2.4. AddConfFile) +endobj +49 0 obj +<< /S /GoTo /D (4.9.1) >> +endobj +52 0 obj +(2.5. AddConfFileToNodeGroup) +endobj +53 0 obj +<< /S /GoTo /D (4.10.1) >> +endobj +56 0 obj +(2.6. AddConfFileToNode) +endobj +57 0 obj +<< /S /GoTo /D (4.11.1) >> +endobj +60 0 obj +(2.7. AddKeyType) +endobj +61 0 obj +<< /S /GoTo /D (4.12.1) >> +endobj +64 0 obj +(2.8. AddMessage) +endobj +65 0 obj +<< /S /GoTo /D (4.13.1) >> +endobj +68 0 obj +(2.9. AddNetworkMethod) +endobj +69 0 obj +<< /S /GoTo /D (4.14.1) >> +endobj +72 0 obj +(2.10. AddNetworkType) +endobj +73 0 obj +<< /S /GoTo /D (4.15.1) >> +endobj +76 0 obj +(2.11. AddNodeGroup) +endobj +77 0 obj +<< /S /GoTo /D (4.16.1) >> +endobj +80 0 obj +(2.12. AddNodeNetwork) +endobj +81 0 obj +<< /S /GoTo /D (4.17.1) >> +endobj +84 0 obj +(2.13. AddNode) +endobj +85 0 obj +<< /S /GoTo /D (4.18.1) >> +endobj +88 0 obj +(2.14. AddNodeToNodeGroup) +endobj +89 0 obj +<< /S /GoTo /D (4.19.1) >> +endobj +92 0 obj +(2.15. AddNodeToPCU) +endobj +93 0 obj +<< /S /GoTo /D (4.20.1) >> +endobj +96 0 obj +(2.16. AddPCU) +endobj +97 0 obj +<< /S /GoTo /D (4.21.1) >> +endobj +100 0 obj +(2.17. AddPeer) +endobj +101 0 obj +<< /S /GoTo /D (4.22.1) >> +endobj +104 0 obj +(2.18. AddPersonKey) +endobj +105 0 obj +<< /S /GoTo /D (4.23.1) >> +endobj +108 0 obj +(2.19. AddPerson) +endobj +109 0 obj +<< /S /GoTo /D (4.24.1) >> +endobj +112 0 obj +(2.20. AddPersonToSite) +endobj +113 0 obj +<< /S /GoTo /D (4.25.1) >> +endobj +116 0 obj +(2.21. AddPersonToSlice) +endobj +117 0 obj +<< /S /GoTo /D (4.26.1) >> +endobj +120 0 obj +(2.22. AddRole) +endobj +121 0 obj +<< /S /GoTo /D (4.27.1) >> +endobj +124 0 obj +(2.23. AddRoleToPerson) +endobj +125 0 obj +<< /S /GoTo /D (4.28.1) >> +endobj +128 0 obj +(2.24. AddSiteAddress) +endobj +129 0 obj +<< /S /GoTo /D (4.29.1) >> +endobj +132 0 obj +(2.25. AddSite) +endobj +133 0 obj +<< /S /GoTo /D (4.30.1) >> +endobj +136 0 obj +(2.26. AddSliceAttribute) +endobj +137 0 obj +<< /S /GoTo /D (4.31.1) >> +endobj +140 0 obj +(2.27. AddSliceAttributeType) +endobj +141 0 obj +<< /S /GoTo /D (4.32.1) >> +endobj +144 0 obj +(2.28. AddSliceInstantiation) +endobj +145 0 obj +<< /S /GoTo /D (4.33.1) >> +endobj +148 0 obj +(2.29. AddSlice) +endobj +149 0 obj +<< /S /GoTo /D (4.34.1) >> +endobj +152 0 obj +(2.30. AddSliceToNodes) +endobj +153 0 obj +<< /S /GoTo /D (4.35.1) >> +endobj +156 0 obj +(2.31. AuthCheck) +endobj +157 0 obj +<< /S /GoTo /D (4.36.1) >> +endobj +160 0 obj +(2.32. BlacklistKey) +endobj +161 0 obj +<< /S /GoTo /D (4.37.1) >> +endobj +164 0 obj +(2.33. BootGetNodeDetails) +endobj +165 0 obj +<< /S /GoTo /D (4.38.1) >> +endobj +168 0 obj +(2.34. BootNotifyOwners) +endobj +169 0 obj +<< /S /GoTo /D (4.39.1) >> +endobj +172 0 obj +(2.35. BootUpdateNode) +endobj +173 0 obj +<< /S /GoTo /D (4.40.1) >> +endobj +176 0 obj +(2.36. DeleteAddress) +endobj +177 0 obj +<< /S /GoTo /D (4.41.1) >> +endobj +180 0 obj +(2.37. DeleteAddressTypeFromAddress) +endobj +181 0 obj +<< /S /GoTo /D (4.42.1) >> +endobj +184 0 obj +(2.38. DeleteAddressType) +endobj +185 0 obj +<< /S /GoTo /D (4.43.1) >> +endobj +188 0 obj +(2.39. DeleteBootState) +endobj +189 0 obj +<< /S /GoTo /D (4.44.1) >> +endobj +192 0 obj +(2.40. DeleteConfFileFromNodeGroup) +endobj +193 0 obj +<< /S /GoTo /D (4.45.1) >> +endobj +196 0 obj +(2.41. DeleteConfFileFromNode) +endobj +197 0 obj +<< /S /GoTo /D (4.46.1) >> +endobj +200 0 obj +(2.42. DeleteConfFile) +endobj +201 0 obj +<< /S /GoTo /D (4.47.1) >> +endobj +204 0 obj +(2.43. DeleteKey) +endobj +205 0 obj +<< /S /GoTo /D (4.48.1) >> +endobj +208 0 obj +(2.44. DeleteKeyType) +endobj +209 0 obj +<< /S /GoTo /D (4.49.1) >> +endobj +212 0 obj +(2.45. DeleteMessage) +endobj +213 0 obj +<< /S /GoTo /D (4.50.1) >> +endobj +216 0 obj +(2.46. DeleteNetworkMethod) +endobj +217 0 obj +<< /S /GoTo /D (4.51.1) >> +endobj +220 0 obj +(2.47. DeleteNetworkType) +endobj +221 0 obj +<< /S /GoTo /D (4.52.1) >> +endobj +224 0 obj +(2.48. DeleteNodeFromNodeGroup) +endobj +225 0 obj +<< /S /GoTo /D (4.53.1) >> +endobj +228 0 obj +(2.49. DeleteNodeFromPCU) +endobj +229 0 obj +<< /S /GoTo /D (4.54.1) >> +endobj +232 0 obj +(2.50. DeleteNodeGroup) +endobj +233 0 obj +<< /S /GoTo /D (4.55.1) >> +endobj +236 0 obj +(2.51. DeleteNodeNetwork) +endobj +237 0 obj +<< /S /GoTo /D (4.56.1) >> +endobj +240 0 obj +(2.52. DeleteNode) +endobj +241 0 obj +<< /S /GoTo /D (4.57.1) >> +endobj +244 0 obj +(2.53. DeletePCU) +endobj +245 0 obj +<< /S /GoTo /D (4.58.1) >> +endobj +248 0 obj +(2.54. DeletePeer) +endobj +249 0 obj +<< /S /GoTo /D (4.59.1) >> +endobj +252 0 obj +(2.55. DeletePersonFromSite) +endobj +253 0 obj +<< /S /GoTo /D (4.60.1) >> +endobj +256 0 obj +(2.56. DeletePersonFromSlice) +endobj +257 0 obj +<< /S /GoTo /D (4.61.1) >> +endobj +260 0 obj +(2.57. DeletePerson) +endobj +261 0 obj +<< /S /GoTo /D (4.62.1) >> +endobj +264 0 obj +(2.58. DeleteRoleFromPerson) +endobj +265 0 obj +<< /S /GoTo /D (4.63.1) >> +endobj +268 0 obj +(2.59. DeleteRole) +endobj +269 0 obj +<< /S /GoTo /D (4.64.1) >> +endobj +272 0 obj +(2.60. DeleteSession) +endobj +273 0 obj +<< /S /GoTo /D (4.65.1) >> +endobj +276 0 obj +(2.61. DeleteSite) +endobj +277 0 obj +<< /S /GoTo /D (4.66.1) >> +endobj +280 0 obj +(2.62. DeleteSliceAttribute) +endobj +281 0 obj +<< /S /GoTo /D (4.67.1) >> +endobj +284 0 obj +(2.63. DeleteSliceAttributeType) +endobj +285 0 obj +<< /S /GoTo /D (4.68.1) >> +endobj +288 0 obj +(2.64. DeleteSliceFromNodes) +endobj +289 0 obj +<< /S /GoTo /D (4.69.1) >> +endobj +292 0 obj +(2.65. DeleteSliceInstantiation) +endobj +293 0 obj +<< /S /GoTo /D (4.70.1) >> +endobj +296 0 obj +(2.66. DeleteSlice) +endobj +297 0 obj +<< /S /GoTo /D (4.71.1) >> +endobj +300 0 obj +(2.67. GetAddresses) +endobj +301 0 obj +<< /S /GoTo /D (4.72.1) >> +endobj +304 0 obj +(2.68. GetAddressTypes) +endobj +305 0 obj +<< /S /GoTo /D (4.73.1) >> +endobj +308 0 obj +(2.69. GetBootStates) +endobj +309 0 obj +<< /S /GoTo /D (4.74.1) >> +endobj +312 0 obj +(2.70. GetConfFiles) +endobj +313 0 obj +<< /S /GoTo /D (4.75.1) >> +endobj +316 0 obj +(2.71. GetEvents) +endobj +317 0 obj +<< /S /GoTo /D (4.76.1) >> +endobj +320 0 obj +(2.72. GetKeys) +endobj +321 0 obj +<< /S /GoTo /D (4.77.1) >> +endobj +324 0 obj +(2.73. GetKeyTypes) +endobj +325 0 obj +<< /S /GoTo /D (4.78.1) >> +endobj +328 0 obj +(2.74. GetMessages) +endobj +329 0 obj +<< /S /GoTo /D (4.79.1) >> +endobj +332 0 obj +(2.75. GetNetworkMethods) +endobj +333 0 obj +<< /S /GoTo /D (4.80.1) >> +endobj +336 0 obj +(2.76. GetNetworkTypes) +endobj +337 0 obj +<< /S /GoTo /D (4.81.1) >> +endobj +340 0 obj +(2.77. GetNodeGroups) +endobj +341 0 obj +<< /S /GoTo /D (4.82.1) >> +endobj +344 0 obj +(2.78. GetNodeNetworks) +endobj +345 0 obj +<< /S /GoTo /D (4.83.1) >> +endobj +348 0 obj +(2.79. GetNodes) +endobj +349 0 obj +<< /S /GoTo /D (4.84.1) >> +endobj +352 0 obj +(2.80. GetPCUs) +endobj +353 0 obj +<< /S /GoTo /D (4.85.1) >> +endobj +356 0 obj +(2.81. GetPeerData) +endobj +357 0 obj +<< /S /GoTo /D (4.86.1) >> +endobj +360 0 obj +(2.82. GetPeerName) +endobj +361 0 obj +<< /S /GoTo /D (4.87.1) >> +endobj +364 0 obj +(2.83. GetPeers) +endobj +365 0 obj +<< /S /GoTo /D (4.88.1) >> +endobj +368 0 obj +(2.84. GetPersons) +endobj +369 0 obj +<< /S /GoTo /D (4.89.1) >> +endobj +372 0 obj +(2.85. GetRoles) +endobj +373 0 obj +<< /S /GoTo /D (4.90.1) >> +endobj +376 0 obj +(2.86. GetSession) +endobj +377 0 obj +<< /S /GoTo /D (4.91.1) >> +endobj +380 0 obj +(2.87. GetSites) +endobj +381 0 obj +<< /S /GoTo /D (4.92.1) >> +endobj +384 0 obj +(2.88. GetSliceAttributes) +endobj +385 0 obj +<< /S /GoTo /D (4.93.1) >> +endobj +388 0 obj +(2.89. GetSliceAttributeTypes) +endobj +389 0 obj +<< /S /GoTo /D (4.94.1) >> +endobj +392 0 obj +(2.90. GetSliceInstantiations) +endobj +393 0 obj +<< /S /GoTo /D (4.95.1) >> +endobj +396 0 obj +(2.91. GetSlices) +endobj +397 0 obj +<< /S /GoTo /D (4.96.1) >> +endobj +400 0 obj +(2.92. GetSliceTicket) +endobj +401 0 obj +<< /S /GoTo /D (4.97.1) >> +endobj +404 0 obj +(2.93. GetSlivers) +endobj +405 0 obj +<< /S /GoTo /D (4.98.1) >> +endobj +408 0 obj +(2.94. NotifyPersons) +endobj +409 0 obj +<< /S /GoTo /D (4.99.1) >> +endobj +412 0 obj +(2.95. RebootNode) +endobj +413 0 obj +<< /S /GoTo /D (4.100.1) >> +endobj +416 0 obj +(2.96. RefreshPeer) +endobj +417 0 obj +<< /S /GoTo /D (4.101.1) >> +endobj +420 0 obj +(2.97. ResetPassword) +endobj +421 0 obj +<< /S /GoTo /D (4.102.1) >> +endobj +424 0 obj +(2.98. SetPersonPrimarySite) +endobj +425 0 obj +<< /S /GoTo /D (4.103.1) >> +endobj +428 0 obj +(2.99. UpdateAddress) +endobj +429 0 obj +<< /S /GoTo /D (4.104.1) >> +endobj +432 0 obj +(2.100. UpdateAddressType) +endobj +433 0 obj +<< /S /GoTo /D (4.105.1) >> +endobj +436 0 obj +(2.101. UpdateConfFile) +endobj +437 0 obj +<< /S /GoTo /D (4.106.1) >> +endobj +440 0 obj +(2.102. UpdateKey) +endobj +441 0 obj +<< /S /GoTo /D (4.107.1) >> +endobj +444 0 obj +(2.103. UpdateMessage) +endobj +445 0 obj +<< /S /GoTo /D (4.108.1) >> +endobj +448 0 obj +(2.104. UpdateNodeGroup) +endobj +449 0 obj +<< /S /GoTo /D (4.109.1) >> +endobj +452 0 obj +(2.105. UpdateNodeNetwork) +endobj +453 0 obj +<< /S /GoTo /D (4.110.1) >> +endobj +456 0 obj +(2.106. UpdateNode) +endobj +457 0 obj +<< /S /GoTo /D (4.111.1) >> +endobj +460 0 obj +(2.107. UpdatePCU) +endobj +461 0 obj +<< /S /GoTo /D (4.112.1) >> +endobj +464 0 obj +(2.108. UpdatePeer) +endobj +465 0 obj +<< /S /GoTo /D (4.113.1) >> +endobj +468 0 obj +(2.109. UpdatePerson) +endobj +469 0 obj +<< /S /GoTo /D (4.114.1) >> +endobj +472 0 obj +(2.110. UpdateSite) +endobj +473 0 obj +<< /S /GoTo /D (4.115.1) >> +endobj +476 0 obj +(2.111. UpdateSliceAttribute) +endobj +477 0 obj +<< /S /GoTo /D (4.116.1) >> +endobj +480 0 obj +(2.112. UpdateSliceAttributeType) +endobj +481 0 obj +<< /S /GoTo /D (4.117.1) >> +endobj +484 0 obj +(2.113. UpdateSlice) +endobj +485 0 obj +<< /S /GoTo /D (4.118.1) >> +endobj +488 0 obj +(2.114. VerifyPerson) +endobj +489 0 obj +<< /S /GoTo /D (4.119.1) >> +endobj +492 0 obj +(2.115. system.listMethods) +endobj +493 0 obj +<< /S /GoTo /D (4.120.1) >> +endobj +496 0 obj +(2.116. system.methodHelp) +endobj +497 0 obj +<< /S /GoTo /D (4.121.1) >> +endobj +500 0 obj +(2.117. system.methodSignature) +endobj +501 0 obj +<< /S /GoTo /D (4.122.1) >> +endobj +504 0 obj +(2.118. system.multicall) +endobj +505 0 obj +<< /S /GoTo /D [506 0 R /Fit ] >> +endobj +508 0 obj << +/Length 160 +/Filter /FlateDecode +>> +stream +xڍŽ;Â0 „÷ü +t¨‰Ý6NFÞ1tȆB)© •ÿO¤Vˆy8Ÿ>Ëw:J…²)ªVi¸G´S4äÆ d¢ùAÓ"t– ¤ßO–^Í·LÀ9ŠƒˆDkdfð×Ó¬lBWÇpIR;[ÕÝð Íhå~\Ö}õj# ã?¨ÿ¤Oõs‹–Œû¿ýý7Èendstream +endobj +506 0 obj << +/Type /Page +/Contents 508 0 R +/Resources 507 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +>> endobj +509 0 obj << +/D [506 0 R /XYZ 71.731 729.2652 null] +>> endobj +510 0 obj << +/D [506 0 R /XYZ 71.731 718.3063 null] +>> endobj +511 0 obj << +/D [506 0 R /XYZ 71.731 718.3063 null] +>> endobj +2 0 obj << +/D [506 0 R /XYZ 528.0019 700.222 null] +>> endobj +507 0 obj << +/Font << /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +518 0 obj << +/Length 158 +/Filter /FlateDecode +>> +stream +xÚ3T0BCsC=sc ed©gdfj¤œËe ”rç2„*113Ó3254r°Èêš›ëYZ™)è"âÂ¥ïfd¨`©gi” IƒÛd`¡glbl®’­“˜—Zⓘ¤©kdn¡áœšWR”˜á8xB.ùÉ¥¹@™Ä’Ìü<ÍØ/.׸õPSM,ô, Í,‰w>@Ã8endstream +endobj +517 0 obj << +/Type /Page +/Contents 518 0 R +/Resources 516 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +>> endobj +519 0 obj << +/D [517 0 R /XYZ 71.731 729.2652 null] +>> endobj +516 0 obj << +/Font << /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +522 0 obj << +/Length 53930 +/Filter /FlateDecode +>> +stream +xڔÝM“kW~ù¹>‡ä@h¼$È¡¬h)Ün9íêQGÊ*ÊRtu±¢ŠŠ}û>y/öÚȵqÖ³h;B’yjýP€Š¼—ÌçÓÇíÿž~x?Þ/Û9ηëù‡þÿæøÃÿÜþÐ?þÍéñÈÛív8_O·íxñGÿözy?|ÜÏ·þöyä?ýîoþ—8Ÿ~8·ëýúÃïþEÔñr8_n?üîÿ׏¿ûé~üñ÷ÿã§ÓñÇ?þüÓߞßï?þò/ßÿëßÿò§_þÓ¯ýéÿþÝÿö7ÿëïäN‡ëõôþÃí~;œ®——¯IýíÓSß_Òý‡ÃÇm{¹Û+Z¶>_Óé°½€ëñÇÿü§_ÿòÓi{Aø÷þõß~ùÓòBî—Ãõ~J¯ãx8Ÿ?ÞwÞ·ÏýýtÄ×8{~‡õÅÜ—ãéíÕ«y!?&Ù6wäûáýã\Âߟ%÷ëâköãt8ßÏï;Ø7wäËáýýR¾Õãa’msGÞþƒxkáïϒûuq‡Ý>ë[ûV?&Ø6_Êçãö¼m´‘õp–—Íyû@¶?Iuð÷gÉýº¸ÃnŸÇùö^º‡ ¶Íyû@Nïí[ýx˜dÛ|-Ÿ¶äxïàdzàÚâ{9Ü>îåG<&Ø6wäíÞ?Ê·z“ó¥|·ÇÃ$Û掼ýÁÓ[ùn‡I¶ÍyûLŽ×s)?&Ù6_Ëo§ÃñãZ¾Ûãa}sGþü÷­|·ÇÃ$ÛæŽ|;ßßËw{çVÉãa}sGÞ>“·ò·z˜dÛܑ·ÏäòQ¾Ûãa’msGÞ>“˱}·“l›¯åÛö™œOå»=Ù7wäí39Ê_Œ‡I¶ÍyûLŽçòÝ“l›;òýðöqißíÇÃ$Ûækùýxø¸_Êw{< ²oîȗÃÛû[ùn‡I¶Íùºý+®§R~“·[ùn‡AöÍyûL.ïå»=&Ù6wäí3ÙޞR~Þ?ÊˏgÁµÅör8ßß[÷ñ0Á¶¹#_ïï÷K)?&Ù6wäûá|û(áïϒûuñ5{Ù>kû‡öÍyû@®Çò­“l›;òö¼•¶~&Ø6_ËoÛr>—oõxdßܑ·äÔÂߟ%÷ëâ»}ÇòŸ‡éa‚msG¾Noí¿ãÇÃ$Ûækùz<ÜîoåŸAÆà ûæŽ|9œÞ¯å»=&Ù6wäëáv»•ïöx˜dÛܑ·ÏäÚþùz“Ëý\ʏ‡I¶ÍyûLÎ÷òÝ“l›;òö™œ>Úwûñ0ɶùZ~ß>“Ó±|·Çà û掼}&Çcùn‡I¶Íùz¸~œÊ_ۏ‡I¶Íù~8ÞÏí»ýx˜dÛ|-ߏ‡ëû¹|·Çà ûæŽ|9o—òÝ“l›;òö™\ßÊw{“·sùn‡I¶ÍyûL.çöÝ~îïåOÑêa’msG¾.·÷òÝ“l›;òö™”ÿ¼yž%÷ëâ{=œ?ʲDl›;òûáýÞþ¯Öx˜dÛ|-ߎ‡sû§­Ç³àÚâ{>¼ßʟŸÕÃÛ掼} ײ,ÑÃ$Û掼} õ¿åïϒûuñ5û~ü¬îJw< °oîÈÛr.Ë=L²mîÈÛr*xV“l›;òö‘ïí»ýx˜dÛ|-ߏ‡ÓG—èa}sG>n÷ò‡gõ0ɶ¹#_§{™˜èa’msG~?ÜÞËžÕÃ$ÛækùcûLneb¢‡AöÍyûL®eb¢‡I¶ÍyûLÞÊžÕÃ$Û掼}&—Kûn?&Ù6_Ê×ãö™œËžÕÃY^6wäí39•‰‰&Ù6wäí39–‰‰&Ù6wä÷Ãõã־ۏ‡I¶Í×òéx8ÞËÄDƒì›;òùp}/xV“l›;òõp¼•‰‰&Ù6wäí3¹~´ïöãa’móµ|Þ>“·ò‡gõ0Ⱦ¹#oŸÉ[™˜èa’msGÞ>“Kùóz˜dÛܑ·Ïä|jßíÇÃ$Ûækù²}&§ò§*õ0Ⱦ¹#oŸÉñ‡)¾ýӏ½ƒ—Ãñˆ¿Ny<öõW…§õÕ<®ƒ¤s—·í-ýü5ÙöŸÞËÛùíõÁŒ·ËáíÛ?HÛ~ßq?mëu}<Ÿx<¦§¾õg=þîßýןÿôë¿ýóï_õ8oÿQ:>‹–'Ã_ÉgÄv»ï¼{O s|™³a~~!b~ñ‚RÅ ¸¯BÇÜá +™÷UH™;\-3ྠ+5s…Ïœ9ãË*Í®¢p_…¦¹Ã55w¸ºfÀ}Êæ +ŸisƗUˆ›;\u3ྠ+}s‡+pÜW!qîp5΀û*TÎ>3çŒ/«:w¸JgÀ}ZçWì ¸¯BîÜáê÷U(ž+|&Ï_V!zîpUπû*tÏ®ðp_…ô¹ÃÕ>î«P?Wø̟3¾¬BÝá* ÷Uh ;\4ྠ+t‡«ƒÜW¡„®ð™Bg|Y…ºÃUCî«ÐCw¸‚hÀ}’èW ¸¯B]á3‹Îø² +at‡«ŒÜW¡îpÅрû*äÑ®>p_…BºÁŸ鈯«Iw¸*iÀ}:éW( ¸¯B*Ýáj¥÷U¨¥+|æÒ_Vs0ÝÙ£˜Ú6¡™îhEÓ`û*dÓ®np_Íåte+Î´oB<ÝѪ§ÁöUè§;\5ྚêÎ 5ж uEό:ÛË*„Ô®’p_Í-ug˜hۄœº£ÕSƒí«PTWøLª3¾¬æ¨º³GU ´mBWÝÑ +«ÁöUH«;\m5ྠ+uu…ϼ:ãË*Ö®Âp_…ƺÃYYw¸:kÀ}Jë +Ÿ©uƗUˆ­;\µ5ྠ+½u‡+¸ÜW!¹îp5׀û*T×>³ëŒ/«^w¸ÊkÀ}ÚëW| ¸¯B~Ýáê¯÷U(°+|&Ø_V!ÂîpU؀û*tØ®p_…»ÃÕbî«PcWø̱3¾¬BÝá*²÷Uh²;\Q6ྠ+Yv‡«ËÜW¡Ìnð§4;âë*ÄÙ®:p_…>»Ãhhw¸mÀ}*í +Ÿ™vƗUµ;\¥6ྠ+­v‡+ÖÜW!×îpõڀû*Û>“íŒ/«mw¸ªmÀ}ºíW¸ ¸¯BºÝáj·÷U¨·+|æÛ_V!àîp܀û*4Ü®ˆp_ÍwgŽhۄ’»¢gʝíebîWÍ ¸¯Æž»£A7À_!éî`5Ý@û*TÝ>³îŒ/«9ìîìQvm›Ðvw´ân°}òîWß ¸¯æ»²•xgÚ7!òîhUÞ`û*tÞ®Ðp_Í©wgÖhۄڻ¢gîíe‚ïWñ ¸¯BóÝኾ÷UȾ;\Ý7ྠ+åw…Ïô;ãË*Äß®úp_…þ»Ã€€w¸pÀ}*ð +ŸxƗUÁ;\%8ྠ+-x‡+ÜW!ïpõà€û*á þ”„G|]…(¼ÃU…î«Ð…w¸ÂpÀ}ÒðW¸¯B^á3Ïø² +x‡«ÜW¡ïpEâ€û*dâ®Np_…R¼Âg*žñebñW-¸¯B/Þá +Æ÷UHÆ;\Í8ྠ+Õx…Ïl<ãË*„ã¡}nËqxA#ÿÒhï·ãá=Ç㏿Ÿãñëçß ÛþӗãññÔ÷xüüˆÇÿ_þøó_ýežî—Ï$ÿô/zù¾Oם÷ísaû÷÷Ž¯n<÷ååÖt;\ŽŸÿ@ãÅ z?žFÜWwðûáýãÜÚßFÚ6_ËÛu?¿—ôxšìeu¿Þß/í{>žFÜWwðÛá|«íï#m›;òöÉ\ßê÷üñ4Ú¾úº:9nÍÛç߆ip= øººƒoÍçÏXvö÷‡‘¶Íyûdη÷–~<¶¯îàÛGsz¯ßóÇӈûêkü´}4Ÿÿ”¸²í›;òåpû¸·÷xm_ÝÁo‡Óý£}ÏÇӈûê~?Üê·üÛ³]ܹþ1ΣTð<º’éeŽ®t¸Ž®î«pt¥Ãutp_…£+®£+€û*]©ðyt%ãË*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÂçѕŒ/«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VáèJ‡ëè +ྠ+GW:\GW÷U8ºÒá:º¸¯Âѕ +ŸGW2¾¬Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥Ãutp_…£+>®d|Y…£+®£+€û*]ép]ÜWáèJ‡ëè +ྠ+GW*|]Éø² +GW:\GW÷U8ºÒá:º¸¯Âѕ×ÑÀ}Ž®4øÓѕˆ¯«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VóѕÎGW€¶M8ºÒÑ:º¶¯Âѕ×ÑÀ}5]©l]É´oÂѕŽÖÑ°}Ž®t¸Ž®î«ùèJg£+@Û&]©èyt%ÛË*]ép]ÜWóѕÎGW€¶M8ºÒÑ:º¶¯Âѕ +ŸGW2¾¬æ£+=Ž®m›pt¥£utl_…£+®£+€û*]©ðyt%ãË*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÂçѕŒ/«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VáèJ‡ëè +ྠ+GW:\GW÷U8ºÒá:º¸¯Âѕ +ŸGW2¾¬Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥Ãutp_…£+ þtt%âë*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÂçѕŒ/«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VáèJ‡ëè +ྠ+GW:\GW÷Õ|t¥³ÇÑ mŽ®Tô<º’íeŽ®t¸Ž®î«ñèJG?Ž®üuŽ®t°Ž®í«pt¥ÂçѕŒ/«ùèJg£+@Û&]éh]ÛWáèJ‡ëè +ྚ®T¶Ž®dÚ7áèJGëè +ؾ +GW:\GW÷Õ|t¥³ÇÑ mŽ®Tô<º’íeŽ®t¸Ž®î«pt¥Ãutp_…£+®£+€û*]©ðyt%ãË*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÁŸŽ®D|]…£+®£+€û*]ép]ÜWáèJ‡ëè +ྠ+GW*|]Éø² +GW:\GW÷U8ºÒá:º¸¯Âѕ×ÑÀ}Ž®Tø<º’ñeŽ®t¸Ž®î«pt¥Ãutp_…£+®£+€û*]©ðyt%ãË*]‰ÇCº£+ð‚ÆѕçtÞ?º^Ðrtå +GWÞÞÇ÷w8º2žú~tåò8ºòÿöÇ_þË__^9¹}þRñiÜ_Âùðv9½íž]×GòË×Gž_^¸>òâå¤ë#Ù^VáúH‡ëúྚ¯tö¸>´mÂõ‘ŽÖõ°}®4øÓõ‘ˆ¯«ùúHgë#@Û&\éh]ÛWáúH‡ëúྚ¯T¶®dÚ7áúHGëúؾ +×G:\×G÷Õx}¤£×Gþº×G*x^Éô² +×G:\×G÷U¸>Òáº>¸¯Âõ‘×õÀ}®Tø¼>’ñe®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>RáóúHƗU¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«p}¤Ãu}p_…ë#®ë#€û*\ép]ÜWáúH…Ïë#_VáúH‡ëúྠ+×G:\×G÷U¸>Òáº>¸¯Âõ‘ +Ÿ×G2¾¬Âõ‘×õÀ}®t¸®î«p}¤Ãu}p_…ë#>¯d|Y…ë#®ë#€û*\ép]ÜWáúH‡ëúྠ+×GüéúHÄ×U¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«ùúHgë#@Û&\éh]ÛWáúH‡ëúྚ¯T¶®dÚ7áúHGëúؾ +×G:\×G÷Õ|}¤³Çõ m®Tô¼>’íe®t¸®î«ùúHgë#@Û&\éh]ÛWáúH…Ïë#_Vóõ‘Î×G€¶M¸>ÒѺ>¶¯Âõ‘×õÀ}®Tø¼>’ñe®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>RáóúHƗU¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«p}¤Ãu}p_…ë#®ë#€û*\ép]ÜWáúH…Ïë#_VáúH‡ëúྠ+×G:\×G÷U¸>Òáº>¸¯Âõ‘º>ñu®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>RáóúHƗU¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«p}¤Ãu}p_…ë#®ë#€ûj¾>ÒÙãúж ×G*z^Éö² +×G:\×G÷Õx}¤£×Gþº×G:X×G€öU¸>RáóúHƗÕ|}¤³Çõ m®t´®€í«p}¤Ãu}p_Í×G*[×G2í›p}¤£u}l_…ë#®ë#€ûj¾>ÒÙãúж ×G*z^Éö² +×G:\×G÷U¸>Òáº>¸¯Âõ‘×õÀ}®Tø¼>’ñe®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>ÒàO×G"¾®Âõ‘×õÀ}®t¸®î«p}¤Ãu}p_…ë#>¯d|Y…ë#®ë#€û*\ép]ÜWáúH‡ëúྠ+×G*|^Éø² +×G:\×G÷U¸>Òáº>¸¯Âõ‘×õÀ}®Tø¼>’ñe®„íõxAãúÈó +×G Z®¼Áõ‘Ëi{êvë#ã©ï×GÞ×GþÛÿ§Ÿýßÿ?¾ÿýןÿøǵ[Þþbvüü!â'É_ÏgxûØyŸ*îøbgÅýüjCÅý⥊p_…Š»ÃUqî«PqWø¬¸3¾¬BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅ]á³âÎø² +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe*îWÅ ¸¯BÅÝ᪸÷U¨¸;\7ྠ+w…ÏŠ;ãË*TÜ®Šp_…Š»ÃUqî«Pqw¸*nÀ}*î +ŸwƗU¨¸;\7ྠ+w‡«âÜW¡âîpU܀û*TÜ>+îŒ/«Pqw¸*nÀ}*îWÅ ¸¯BÅÝ᪸÷U¨¸ü©âŽøº +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe5Wܝ=*n m*îŽVÅ ¶¯BÅÝ᪸÷Õ\qW¶*îLû&TÜ­Šl_…Š»ÃUqâîìQqm›PqWô¬¸³½¬BÅÝ᪸÷Õ\qwö¨¸¶M¨¸;Z7ؾ +w…ÏŠ;ãËj®¸;{TÜ@Û&TÜ­Šl_…Š»ÃUqî«PqWø¬¸3¾¬BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅ]á³âÎø² +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe*îWÅ ¸¯BÅÝ᪸÷U¨¸;\7ྠ+w…ÏŠ;ãË*TÜ®Šp_…Š»ÃUqî«Pqw¸*nÀ}*#¾®BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅ]á³âÎø² +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe*îWÅ ¸¯BÅÝ᪸÷Õ\qwö¨¸¶M¨¸+zVÜÙ^V¡âîpU܀ûj¬¸;úQqüu*îVÅ ´¯BÅ]á³âÎø²š+îÎ7ж wG«âÛW¡âîpU܀ûj®¸+[w¦}*îŽVÅ ¶¯BÅÝ᪸÷Õ\qwö¨¸¶M¨¸+zVÜÙ^V¡âîpU܀û*TÜ®Šp_…Š»ÃUqî«PqWø¬¸3¾¬BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅÝàOwÄ×U¨¸;\7ྠ+w‡«âÜW¡âîpU܀û*TÜ>+îŒ/«Pqw¸*nÀ}*îWÅ ¸¯BÅÝ᪸÷U¨¸+|VÜ_V¡âîpU܀û*TÜ®Šp_…Š»ÃUqî«PqWø¬¸3¾¬BÅòã¶â†4*îç*îð‚þöít?¼]>ÿ±ýöêËÛöoóeÅ}úØþC÷íǾO·í/6—û|i÷çŒ{<§Ç¾½´×÷ßý·ÿüý¿ù§Ÿý×_þð×W!ïñÛ_מÌõ½mÞ ºgÜ_öŒ{Ÿ_vˆ{_¼ ÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ>ãތ/«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_V!îípŽ€û*Ľ®¸p_…¸·Ã÷î«÷VøŒ{3¾¬BÜÛáŠ{÷Uˆ{;\q/ྠ+qo‡+îÜW!î­ð÷f|Y…¸·Ã÷î«÷v¸â^À}âÞWÜ ¸¯BÜ[á3îÍø² +qo‡+îÜW!îípŽ€û*Ľ®¸p_…¸·ÁŸâވ¯«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_VsÜÛÙ#îÚ6!îíhŽ`û*Ľ®¸p_Íqoe+îÍ´oBÜÛъ{ÁöUˆ{;\q/ྚãÞÎq/ж qoEϸ7ÛË*Ľ®¸p_Íqog¸hۄ¸·£÷‚í«÷VøŒ{3¾¬æ¸·³GÜ ´mBÜÛъ{ÁöUˆ{;\q/ྠ+qo…ϸ7ãË*Ľ®¸p_…¸·Ã÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ>ãތ/«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_V!îípŽ€û*Ľ®¸p_…¸·Ã÷î«÷VøŒ{3¾¬BÜÛáŠ{÷Uˆ{;\q/ྠ+qo‡+îÜW!îmð§¸7âë*Ľ®¸p_…¸·Ã÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ>ãތ/«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_V!îípŽ€û*Ľ®¸p_Íqog¸hۄ¸·¢gܛíeâÞWÜ ¸¯Æ¸·£q/À_!îí`Ž@û*Ľ>ãތ/«9îíì÷m›÷v´â^°}âÞWÜ ¸¯æ¸·²÷fÚ7!îíhŽ`û*Ľ®¸p_Íqog¸hۄ¸·¢gܛíeâÞWÜ ¸¯BÜÛáŠ{÷Uˆ{;\q/ྠ+qo…ϸ7ãË*Ľ®¸p_…¸·Ã÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ þ÷F|]…¸·Ã÷î«÷v¸â^À}âÞWÜ ¸¯BÜ[á3îÍø² +qo‡+îÜW!îípŽ€û*Ľ®¸p_…¸·ÂgܛñeâÞWÜ ¸¯BÜÛáŠ{÷Uˆ{;\q/ྠ+qo…ϸ7ãË*Ľ1Eíâ^xA#î}~A×ý¸7¼ ç¯hNq¯¾¢ùxÚ~Óz¢¯hO}O{O¸÷ïþð‡íÿýåç¿þõw?ݏ?þǟ^ Öãáòþù³´OÎú&nOÜv{^}Sp|©ó›‚Ÿ_kø¦à/(ÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&®ðg|Y…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø² +1q‡+&ÜW!&îpÅĀû*ÄÄ®˜p_…˜¸ÂgLœñebâWL ¸¯BLÜ኉÷Uˆ‰;\11ྠ+1q…Ϙ8ãË*ÄÄ®˜p_…˜¸Ãî«w¸bbÀ}bâ +Ÿ1qƗUˆ‰;\11ྠ+1q‡+&ÜW!&îpÅĀû*ÄÄ þG|]…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø²šcâÎ11ж 1qG+&ÛW!&îpÅĀûjŽ‰+[1q¦}bâŽVL ¶¯BLÜ኉÷Õwöˆ‰¶Mˆ‰+zÆÄÙ^V!&îpÅĀûjŽ‰;{ÄÄ@Û&ÄÄ­˜l_…˜¸ÂgLœñe5Çĝ=bb mbâŽVL ¶¯BLÜ኉÷Uˆ‰+|ÆÄ_V!&îpÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&®ðg|Y…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø² +1q‡+&ÜW!&îpÅĀû*ÄÄ®˜p_…˜¸ÂgLœñebâWL ¸¯BLÜ኉÷Uˆ‰;\11ྠ+1qƒ?ÅÄ_W!&îpÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&®ðg|Y…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø² +1q‡+&ÜW!&îpÅĀûjŽ‰;{ÄÄ@Û&ÄÄ=câl/«w¸bbÀ}5ÆÄýˆ‰þº1q+&ÚW!&®ðg|YÍ1qg˜hۄ˜¸£ƒí«w¸bbÀ}5Çĕ­˜8Ó¾ 1qG+&ÛW!&îpÅĀûjŽ‰;{ÄÄ@Û&ÄÄ=câl/«w¸bbÀ}bâWL ¸¯BLÜ኉÷Uˆ‰+|ÆÄ_V!&îpÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&nð§˜8âë*ÄÄ®˜p_…˜¸Ãî«w¸bbÀ}bâ +Ÿ1qƗUˆ‰;\11ྠ+1q‡+&ÜW!&îpÅĀû*ÄÄ>câŒ/«w¸bbÀ}bâWL ¸¯BLÜ኉÷Uˆ‰+|ÆÄ_V!&Žlà 1ñó +1qxAÏ1ñãïãǘøz¿.Û¯hsL¬§¾ÇÄçݘøÛýåñÿù*ü9lQ}F×wtû_‹®X)P~ÕzîËËÞO^½œî«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9ªð™e|]Í)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|Y)Pi?R ¢m3§@%=R ²}5§@%>R Â}5¦@=R  }3§@%=R ²}5§@%>R Â}5¦@¥ýHˆ¶Íœu´R °—Õœ•øH÷՘•ö#"Ú6s +TÒ#"ÛWs +ÔáJ_Vc +TڏˆhÛÌ)PIˆl_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P…Ï(ãëjNJ|¤@„ûjNJ|¤@„ûjNJ|¤@„ûjN:\)àËjNJ|¤@„ûjNJ|¤@„ûjNJ|¤@„ûjN:\)àËjNJ|¤@„ûjNJ|¤@„ûjNJ|¤@„ûjN:\)àËjNJ|¤@„ûjNJ|¤@„ûjLJû‘m›9êh¥@`/«9*ñ‘î«)*éï)Á_s +TÂ#"ÚWs +ÔáJ_Vc +TڏˆhÛÌ)PIˆl_Í)P‰ˆp_)PghßÌ)PIˆl_Í)P‰ˆp_)Pi?R ¢m3§@­ìe5§@%>R Â}5§@%>R Â}5§@%>R Â}5§@®ðe5§@%>R Â}5§@%>R Â}5§@%>R Â}5§@®ðe5§@%>R Â}5§@%>R Â}5§@%>R Â}5§@>S Œ¯«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9ÊáJ•Ñ z¤@_^Ð~ +”^ÐoNÞ?ÿFÜý +)Ðxê{ +t™)Ðúå—_ÿû¯¿ÿuýFÁí?֗ëç>= þ:NŸ?äû¾Wþœî‡oÿd0¾ÄÇS_^áúùçÓáôþù‹×/f…ÇÓD/«;øåp».-þxq_ÝÁo‡Óõó¯þxq_ÝÁ·Ïæí\¿í§÷՝ïQ||Ñd‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–¸šuÀ}šõW³¸¯B³ÞájÖ÷UhÖ+|6ë_V¡Yïp5ë€û*4ë®fp_…f½ÃÕ¬î«Ð¬WølÖ3¾¬B³ÞájÖ÷UhÖ;\Í:ྠ+Íz‡«YÜW¡Yoð§f=âë*4ë®fp_…f½ÃÕ¬î«Ð¬w¸šuÀ}šõ +ŸÍzƗÕܬwöhց¶MhÖ;ZÍ:ؾ +Íz‡«YÜWs³^ÙjÖ3í›Ð¬w´šu°}šõW³¸¯æf½³G³´mB³^ѳYÏö² +Íz‡«YÜWs³ÞÙ£YÚ6¡Yïh5ë`û*4ë>›õŒ/«¹YïìѬm›Ð¬w´šu°}šõW³¸¯B³^á³YÏø² +Íz‡«YÜW¡Yïp5ë€û*4ë®fp_…f½Âg³žñešõW³¸¯B³ÞájÖ÷UhÖ;\Í:ྠ+Íz…Ïf=ãË*4ë®fp_…f½ÃÕ¬î«Ð¬w¸šuÀ}šõ +ŸÍzƗUhÖ;\Í:ྠ+Íz‡«YÜW¡Yïp5ë€û*4ë>›õŒ/«Ð¬w¸šuÀ}šõW³¸¯B³ÞájÖ÷UhÖü©Yøº +Íz‡«YÜW¡Yïp5ë€û*4ë®fp_…f½Âg³žñešõW³¸¯B³ÞájÖ÷UhÖ;\Í:ྠ+Íz…Ïf=ãË*4ë®fp_…f½ÃÕ¬î«Ð¬w¸šuÀ}šõ +ŸÍzƗUhÖ;\Í:ྠ+Íz‡«YÜWs³ÞÙ£YÚ6¡Y¯èÙ¬g{Y…f½ÃÕ¬YïèG³ð×EhÖ;XÍ:о +Íz…Ïf=ãËjnÖ;{4ë@Û&4ë­fl_…f½ÃÕ¬Y¯l5ë™öMhÖ;ZÍ:ؾ +Íz‡«YÜWs³ÞÙ£YÚ6¡Y¯èÙ¬g{Y…f½ÃÕ¬î«Ð¬w¸šuÀ}šõW³¸¯B³^á³YÏø² +Íz‡«YÜW¡Yïp5ë€û*4ë®fp_…f½Âg³žñešõW³¸¯B³ÞájÖ÷UhÖ;\Í:ྠ+Ízƒ?5ë_W¡Yïp5ë€û*4ë®fp_…f½ÃÕ¬î«Ð¬WølÖ3¾¬B³ÞájÖ÷UhÖ;\Í:ྠ+Íz‡«YÜW¡Y¯ðÙ¬g|Y…f½ÃÕ¬î«Ð¬w¸šuÀ}šõW³¸¯B³^á³YÏø² +Ízˆ®Ûf^Ðh֟_Ðm¿Y/è77ëÛoßNï'hÖÇSߛõ·Ù¬ÿý/ú—ø·?¾HÖ?sœž÷×7ï|úØ/Ö/‡ÛÇ·¿¥_âã¹Û×׸þHþé¶ýòõóî/^Ð üñ4⾺ƒïê;úQêüuJý +ž¥~¦—U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿Âg©ŸñeJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý*õ#¾®B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|YÍ¥~gRhۄR¿£Uêƒí«Pêw¸J}À}5—ú•­R?Ó¾ ¥~G«ÔÛW¡Ôïp•ú€ûj.õ;{”ú@Û&”ú=Kýl/«Pêw¸J}À}5—ú=J} mJýŽV©¶¯B©_á³ÔÏø²šKýÎ¥>ж ¥~G«ÔÛW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿ÁŸJýˆ¯«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}5—ú=J} mJýŠž¥~¶—U(õ;\¥>à¾KýŽ~”ú]„R¿ƒUêí«PêWø,õ3¾¬æR¿³G©´mB©ßÑ*õÁöU(õ;\¥>ྚKýÊV©Ÿi߄R¿£Uêƒí«Pêw¸J}À}5—ú=J} mJýŠž¥~¶—U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«Pê7øS©ñuJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«PêÇؼ+õáRÿù½ï—úá-¥þJý·í¿¹Þ ÔO}/õ¯k©ÿ»ŸîÇù¯¿üáçüË/ÿþçWÁÑûg®ðÄ­ïåéóçúwÂýÙ ÅW<¤ç—¤/(5H€û*4H® p_…©ÃÕ î«Ð Uøl2¾¬BƒÔáj÷Uh:\ ྠ+ R‡«AÜW¡AªðÙ e|Y…©ÃÕ î«Ð u¸$À}¤Wƒ¸¯BƒÔàO RÄ×Uh:\ ྠ+ R‡«AÜW¡Aêp5H€û*4H>¤Œ/«¹AêìÑ m›Ð u´$°}¤Wƒ¸¯æ©²Õ eÚ7¡Aêh5H`û*4H® p_Í Rg hۄ©¢gƒ”íe¤Wƒ¸¯æ©³Gƒ´mBƒÔÑjÀöUh*|6H_VsƒÔÙ£AÚ6¡Aêh5H`û*4H® p_…©Âgƒ”ñe¤Wƒ¸¯BƒÔáj÷Uh:\ ྠ+ R…Ï)ãË*4H® p_…©ÃÕ î«Ð u¸$À}¤ +Ÿ RƗUh:\ ྠ+ R‡«AÜW¡Aêp5H€û*4H>¤Œ/«Ð u¸$À}¤Wƒ¸¯BƒÔáj÷Uh*|6H_V¡Aêp5H€û*4H® p_…©ÃÕ î«Ð 5øSƒñu¤Wƒ¸¯BƒÔáj÷Uh:\ ྠ+ R…Ï)ãË*4H® p_…©ÃÕ î«Ð u¸$À}¤ +Ÿ RƗUh:\ ྠ+ R‡«AÜW¡Aêp5H€û*4H>¤Œ/«Ð u¸$À}¤Wƒ¸¯æ©³Gƒ´mBƒTѳAÊö² + R‡«AÜWcƒÔя ோРu°$ }¤ +Ÿ RƗÕÜ uöh€¶Mh:Z ؾ + R‡«AÜWsƒTÙj2í›Ð u´$°}¤Wƒ¸¯æ©³Gƒ´mBƒTѳAÊö² + R‡«AÜW¡Aêp5H€û*4H® p_…©Âgƒ”ñe¤Wƒ¸¯BƒÔáj÷Uh:\ ྠ+ R…Ï)ãË*4H® p_…©ÃÕ î«Ð u¸$À}¤j"¾®BƒÔáj÷Uh:\ ྠ+ R‡«AÜW¡AªðÙ e|Y…©ÃÕ î«Ð u¸$À}¤Wƒ¸¯BƒTá³AÊø² + R‡«AÜW¡Aêp5H€û*4H® p_…©Âgƒ”ñe¤ØÍt ¼ Ñ =¿ û~ƒ^Ðoþ¶ÐËí°=t†i<õ½Aº¥iýRµëárþüÇ8OÔú>¾o¿®ßëæ·¼ÅW;¿åíùå†oy{ñ‚Ò·¼î«ð-o>¿å-ãË*|Ë[‡ë[Þ÷Uø–·×·¼î«ð-o®oyÜWá[Þ*|~Ë[ƗUø–·×·¼î«ð-o®oyÜWá[Þ:\ßò¸¯Â·¼Uø,,3¾¬BaÙá*,÷U(,;\…%ྠ+…e‡«°ÜW¡°¬ðYXf|Y…²ÃUXî«PXv¸ +KÀ} +ËWa ¸¯BaYá³°Ìø² +…e‡«°ÜW¡°ìp–€û*–®Âp_…²ÁŸ +ˈ¯«PXv¸ +KÀ} +ËWa ¸¯BaÙá*,÷U(,+|–_VsaÙÙ£°Ú6¡°ìh–`û*–®Âp_ͅee«°Ì´oBaÙÑ*,ÁöU(,;\…%ྚ ËÎ…%ж …eEÏÂ2ÛË*–®Âp_ͅegÂhۄ²£UX‚í«PXVø,,3¾¬æ²³Ga ´mBaÙÑ*,ÁöU(,;\…%ྠ+…e…ÏÂ2ãË*–®Âp_…²ÃUXî«PXv¸ +KÀ} +Ë +Ÿ…eƗU(,;\…%ྠ+…e‡«°ÜW¡°ìp–€û*–> ˌ/«PXv¸ +KÀ} +ËWa ¸¯BaÙá*,÷U(,+|–_V¡°ìp–€û*–®Âp_…²ÃUXî«PXVø,,3¾¬BaÙá*,÷U(,;\…%ྠ+…e‡«°ÜW¡°lð§Â2âë*–®Âp_…²ÃUXî«PXv¸ +KÀ} +Ë +Ÿ…eƗU(,;\…%ྠ+…e‡«°ÜW¡°ìp–€û*–> ˌ/«PXv¸ +KÀ} +ËWa ¸¯BaÙá*,÷U(,+|–_V¡°ìp–€û*–®Âp_ͅegÂhۄ²¢ga™íe +ËWa ¸¯Æ²£…%À_¡°ì`–@û*–> ˌ/«¹°ììQXm›PXv´ +K°} +ËWa ¸¯æ²²UXfÚ7¡°ìh–`û*–®Âp_ͅegÂhۄ²¢ga™íe +ËWa ¸¯BaÙá*,÷U(,;\…%ྠ+…e…ÏÂ2ãË*–®Âp_…²ÃUXî«PXv¸ +KÀ} +Ë +Ÿ…eƗU(,;\…%ྠ+…e‡«°ÜW¡°ìp–€û*– þTXF|]…²ÃUXî«PXv¸ +KÀ} +ËWa ¸¯BaYá³°Ìø² +…e‡«°ÜW¡°ìp–€û*–®Âp_…²Âga™ñe +ËWa ¸¯BaÙá*,÷U(,;\…%ྠ+…e…ÏÂ2ãË*–± ì +KxA£°|~Aû…exA¿¹°<_×Ûù…åxê{aù> ËÿòÓùúãÏ?®?þÇ·Èò?þ¼&–§Ë#”x²üçí/y{‰åé¶ýÚóÛ¯ÎãËÕs_^ïúãù§ûáöúå¼ ¿=‹ð×Å×ìùt8½þ +º‚ÇÓD/«;øåp».-þxq_ÝÁ·Ïåúù+è<¸¯îàÛgóv®ßöÇӈûêkü²}:—Kû¶§ _VwðíÓ9_Ú·}<¸¯îàÛ§szkßöñ4⾺ƒoŸÎñznñÇӈûêNÁ}:?®íÛ>ž&|YÝÁ·?z¿µoûxq_ÝÁGâÞá +ç÷Uç;\á<ྠ+á|…Ïp>ãË*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗUç;\á<ྠ+á|‡+œÜW!œïp…ó€û*„ó>ÃùŒ/«Îw¸ÂyÀ}ÂùW8¸¯B8ßá +ç÷Uç+|†ó_V!œïp…ó€û*„ó®pp_…p¾ÃÎî«ÎWø ç3¾¬B8ßá +ç÷Uç;\á<ྠ+á|‡+œÜW!œoð§p>âë*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗÕÎwö灶Mç;Zá<ؾ +á|‡+œÜWs8_Ù +ç3í›Îw´Ây°}ÂùW8¸¯æp¾³G8´mB8_Ñ3œÏö² +á|‡+œÜWs8ßÙ#œÚ6!œïh…ó`û*„ó>ÃùŒ/«9œïìÎm›Îw´Ây°}ÂùW8¸¯B8_á3œÏø² +á|‡+œÜW!œïp…ó€û*„ó®pp_…p¾Âg8ŸñeÂùW8¸¯B8ßá +ç÷Uç;\á<ྠ+á|…Ïp>ãË*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗUç;\á<ྠ+á|‡+œÜW!œïp…ó€û*„ó>ÃùŒ/«Îw¸ÂyÀ}ÂùW8¸¯B8ßá +ç÷Uçü)œøº +á|‡+œÜW!œïp…ó€û*„ó®pp_…p¾Âg8ŸñeÂùW8¸¯B8ßá +ç÷Uç;\á<ྠ+á|…Ïp>ãË*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗUç;\á<ྠ+á|‡+œÜWs8ßÙ#œÚ6!œ¯èÎg{Y…p¾ÃÎî«1œïèG8ð×Eç;Xá<о +á|…Ïp>ãËjç;{„ó@Û&„ó­pl_…p¾ÃÎî«9œ¯l…ó™öMç;Zá<ؾ +á|‡+œÜWs8ßÙ#œÚ6!œ¯èÎg{Y…p¾ÃÎî«Îw¸ÂyÀ}ÂùW8¸¯B8_á3œÏø² +á|‡+œÜW!œïp…ó€û*„ó®pp_…p¾Âg8ŸñeÂùW8¸¯B8ßá +ç÷Uç;\á<ྠ+á|ƒ?…ó_W!œïp…ó€û*„ó®pp_…p¾ÃÎî«ÎWø ç3¾¬B8ßá +ç÷Uç;\á<ྠ+á|‡+œÜW!œ¯ðÎg|Y…p¾ÃÎî«Îw¸ÂyÀ}ÂùW8¸¯B8_á3œÏø² +á|è½Ûp^ÐçŸ_Pçà ZÂù+„ó§ÏØìΏ§¾‡ó÷ÎÿÓÏýëïÿç‹Xþóo(ŸN?<ï¿ø>âûûm7–¿nßþ–Z|‰zîËk|ˏ¦þÅ J¥>à¾KýŽ~”ú]„R¿‚g©ŸéeJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿ÁŸJýˆ¯«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_Vs©ßÙ£ÔÚ6¡Ôïh•ú`û*”ú®Rp_Í¥~e«ÔÏ´oB©ßÑ*õÁöU(õ;\¥>ྚKýÎ¥>ж ¥~EÏR?ÛË*”ú®Rp_Í¥~gRhۄR¿£Uêƒí«PêWø,õ3¾¬æR¿³G©´mB©ßÑ*õÁöU(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôoð§R?âë*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_Í¥~gRhۄR¿¢g©ŸíeJýW©¸¯ÆR¿£¥>À_¡Ôï`•ú@û*”ú>KýŒ/«¹ÔïìQêm›Pêw´J}°}JýW©¸¯æR¿²UêgÚ7¡Ôïh•ú`û*”ú®Rp_Í¥~gRhۄR¿¢g©ŸíeJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú þTêG|]…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿Âg©ŸñeJýW©¸¯B©ßá*õ÷U(õcrzõóýp<ñ¯nôܗt:îëáýÖozÿö›ë†Ç`]O}Ö?f°þ_þõÿûétüñ—¿ü?ÿôó¯ÿúË^÷ÏèòYzñ=ï۟~vÊue†ùµê¹//v?3|õzBfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°Âgf˜ñu5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5f†¥ýÈ ‰¶Íœ–ôÈ Éö՜–øÈ ÷՘vöÈ ö͜–ôÈ Éö՜–øÈ ÷՘–ö#3$Ú6sfØÑÊ Á^VsfXâ#3$ÜWcfXڏ̐hÛ̙aIÌl_͙a‡+3|Y™ai?2C¢m3g†%=2C²}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†>3̯«93,ñ‘î«93,ñ‘î«93,ñ‘î«93ìpe†€/«93,ñ‘î«93,ñ‘î«93,ñ‘î«93ìpe†€/«93,ñ‘î«93,ñ‘î«93,ñ‘î«93ìpe†€/«93,ñ‘î«93,ñ‘î«13,íGfH´mæÌ°£•‚½¬æÌ°ÄGfH¸¯¦Ì°¤¿g†]̙a Ìh_͙a‡+3|Y™ai?2C¢m3g†%=2C²}5g†%>2CÂ}5f†=2C }3g†%=2C²}5g†%>2CÂ}5f†¥ýÈ ‰¶Íœv´2C°—Õœ–øÈ ÷՜–øÈ ÷՜–øÈ ÷՜v¸2CÀ—Õœ–øÈ ÷՜–øÈ ÷՜–øÈ ÷՜v¸2CÀ—Õœ–øÈ ÷՜–øÈ ÷՜–øÈ ÷՜VøÌ 3¾®æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ0åqefH/èñܗt:íf†éýæÌðþöù‹Ê+d†ã©ï™áöç‹Wáï~ºü?¯_’»½ð·ÛÇÓ̋—ôùś»ß‘«ï‘Ì/WÏ}y½ûß#ùêõ„ï‘|YÍß#Yâã{$ ÷Õü=’%®Àp_…À³Ãxî«xVø <3¾¬BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|Y…À³Ãxî«xv¸OÀ}ÏWà ¸¯BàYá3ðÌø² +g‡+ðÜW!ðìpž€û*ž®Àp_…À³Âgà™ñeÏWà ¸¯BàÙá +<÷U<;\'ྠ+g…ÏÀ3ãË*ž®Àp_…À³Ãxî«xv¸OÀ}Ï +<#¾®BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|ÝggÀhۄÀ³£x‚í«xv¸OÀ}5ž•­À3Ó¾ gG+ðÛW!ðìpž€ûj<;{ž@Û&ž=Ïl/«xv¸OÀ}5ž=O mώVà ¶¯BàYá3ðÌø²šÏ΁'ж gG+ðÛW!ðìpž€û*ž>ό/«xv¸OÀ}ÏWà ¸¯BàÙá +<÷U<+|ž_V!ðìpž€û*ž®Àp_…À³Ãxî«xVø <3¾¬BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|Y…À³Ãxî«xv¸OÀ}ÏWà ¸¯BàYá3ðÌø² +g‡+ðÜW!ðìpž€û*ž®Àp_…À³ÁŸψ¯«xv¸OÀ}ÏWà ¸¯BàÙá +<÷U<+|ž_V!ðìpž€û*ž®Àp_…À³Ãxî«xVø <3¾¬BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|Y…À³Ãxî«xv¸OÀ}5ž=O mϊžg¶—U<;\'à¾ώ~ž]„À³ƒxí«xVø <3¾¬æÀ³³Gà ´mBàÙÑ +<ÁöU<;\'ྚÏÊVà™i߄À³£x‚í«xv¸OÀ}5ž=O mϊžg¶—U<;\'ྠ+g‡+ðÜW!ðìpž€û*ž>ό/«xv¸OÀ}ÏWà ¸¯BàÙá +<÷U<+|ž_V!ðìpž€û*ž®Àp_…À³Ãxî«x6øSàñuÏWà ¸¯BàÙá +<÷U<;\'ྠ+g…ÏÀ3ãË*ž®Àp_…À³Ãxî«xv¸OÀ}Ï +ŸgƗU<;\'ྠ+g‡+ðÜW!ð Ubx çó :÷ÏðŠ–Àó +çûéð~}‡¾óñÐ#ï<=坿üáçüË/ÿþç5êÜþ÷ëöY(L`m:·Ûî×G^>“Ïo¿ïM/Q=¿ÆõçÒ/—Ãíüù—ÔõÕ¼“l›;òm{Ã>£Vɏ‡I¶ÍyÔ®•¬„6˶ m#Ï~6ʾ õl%+žÍ²mB:[É*g³l›ÐÍV²²Ù,Û&D³<›Ù(û&³•¬`6˶ ¹l%«–ͲmB+[ÉJe³l›Ê6òìd£ì›PÉV²"Ù,Û&$²•¬B6˶ }l%+Í²mBÛȳ²oB[É +c³l›ÅV²ªØ,Û&4±•¬$6˶ Al#Ï6ʾ 5l%+†Í²mB +[É*a³l›ÐÁV²2Ø,Û&D°<Ø(û&°•¬6˶ ùk%«~ͲmBûZÉJ_³l›¾òS÷šäeª×JVôšeۄ䵒U¼fÙ6¡w­då®Y¶Mˆ]y¶®QöÍ\ºVð]³ûu2×ÊUåšaۄƵ’•¸fÙ6sàÚÀê[£k‹P·V®âÖ Û&¤­•¬²5˶™»Ö +Ykv¿.BÔÚ¸³i°oBÑZÉ +Z³l›9g­àQ³f÷ë"´¬•«”5ö !k#ώ5ʾ™+Ö +kv¿.BÂZ¹*X3l›Ð¯V²òÕ,Û&Ä«<ÛÕ(û&”«•¬p5˶ Ùj%«ZͲmB³ZÉJV³l›¬6òìU£ì›P«V²bÕ,Û&¤ª•¬R5˶ j%+SͲmB¤ÚȳQ²oB¡ZÉ +T³l›§V²êÔ,Û&´©•¬45˶ aj#Ï.5ʾ Uj%+JͲmB’ZÉ*R³l›Ð£V²rÔ,Û&Ĩ<[Ô(û&”¨•¬5˶ j%«BͲmBƒZÉJP³l› òSšäeêÓJV|šeۄô´’UžfÙ6¡;­de§Y¶MˆNy6§QöM(N+YÁi–mrÓJVmšeۄִ’•šfÙ6!4mäٙFÙ7¡2­dE¦Y¶MHL+Y…i–múÒJV^šeۄ¸´‘g[e߄²´’–fÙ6!+­dU¥Y¶ÍܔVðHJ³ûu‚ÒƝ=i„}jÒJVLšeی)iå>JÒ¬~كŽ´R•‘f×6!"mäِFÙ7sAZÁ# Íî×EÈG+Wõh†mÚÑJV:šeÛÌáh«®-B5Z¹ŠF3l›ŒV²ŠÑ,ÛfîE+xä¢Ùýº±hãÎV4¾ ¥h%+ͲmB&ZɪD³l›ÐˆV²Ñ,Û&¢<ûÐ(û&Ô¡•¬84˶ ih%« ͲmBZÉÊB³l›…6òlB£ì›P„V²‚Ð,Û&䠕¬4˶ -h%+ͲmBZÈOh’—M¨@+Yh–mÐJVšeۄþ³’•fÙ6!þläÙ~FÙ7¡ü¬d…ŸY¶MÈ>+YÕg–mšÏJVò™eۄ೑gïe߄ڳ’{fÙ6!õ¬d•žY¶Mè<÷CÅ6ó̯fTžO¯&Ežû/ç7‰çõ¾ýžözƒÈs<õ¨<Ï_+ϧ/ò\KÏÃåýiáeëùþÙJ³Œ/uF€Ï¯5T€/^PÊ÷U;\% ྠ+-`‡+ÜW!¬ðÙf|Y…"°Ã•î«v¸ª@À}ºÀW¸¯BXá³ Ìø² +u`‡+ÜW!ìp‚€û*4‚®Hp_…L°Âg'˜ñeJÁW*¸¯B,Øáª÷Uè;\Á ྠ+É`…Ïf0ãË*Tƒ®lp_…p°ÃUî«Ðv¸âAÀ}òÁ +Ÿý`ƗU(;\ !ྠ+a‡«"ÜW¡#ìp…„€û*¤„ þÔF|]…š°Ã•î«v¸ŠBÀ}šÂWT¸¯BVXá³+Ìø²šËÂÎi!ж qaG«.ÛW¡/ìp†€ûjN +[a¦}*ÎVf¶¯BhØá* ÷ÕÜvöˆ ¶MÈ +zö†Ù^V¡8ìp%‡€ûjŽ;{T‡@Û&t‡­ðl_…ô°Âg{˜ñe5ׇ=òC mĎV¶¯BƒØáŠ÷UÈ+|vˆ_V¡Dìp¥ˆ€û*Ĉ®p_…±Ã$$Vøl3¾¬B•ØáÊ÷U;\e"ྠ+mb‡+NÜW!O¬ðÙ'f|Y…B±Ã•(î«)v¸*EÀ}:ÅW¨¸¯BªXá³UÌø² +µb‡+WÜW!Xìp‹€û*4‹®hp_…l±Âg·˜ñeÊÅWº¸¯B¼Øáª÷Uè;\#ྠ+ cƒ?5Œ_W¡bìpeŒ€û*„Œ®’p_…–±Ã33Vøì3¾¬BÑØáJ÷Uˆ;\U#ྠ+]c‡+lÜW!m¬ðÙ6f|Y…º±Ã•7î«8v¸ +GÀ}ÇW丯BæXá³sÌø² +¥c‡+uÜW!vìpՎ€ûjî;{@Û&$=›Çl/«P=v¸²GÀ}5†ý(þºíc+~ÚW!¬ðÙ?f|YÍdghۄ²£UA‚í«ÐAv¸BHÀ}5§•­2Ó¾ 5dG+‡ÛW!ˆìp‘€ûjn";{D‘@Û&d‘=»Èl/«PFv¸ÒHÀ}âÈW ¸¯BÙá +$÷UH$+|6’_V¡’ìpe’€û*„’®Rp_…V²ÃKKVøì%3¾¬B1ÙáJ&÷Uˆ&;\Õ$ྠ+Ýd‡+œÜW!lð§v2âë*ԓ®|p_…€²ÃUPî«ÐPv¸"JÀ}2Ê +ŸeƗU();\)%ྠ+1e‡«¦ÜW¡§ìp•€û*$•>›ÊŒ/«PUv¸²JÀ}ÂÊWY ¸¯B[ÊÀ6®„4êÊçtºìç•áýæ¾òíó‡|ßÎÐWŽ§}ååk_¹üøñmûóøç+}Z_«ÊÛçßxÝ©*·ÃùüíïåŨ羼Âõçҏ÷Ãûéó7 /^Ð üñ4â¾ú?çϦQُ‡‰öÍùr¸}Üo-ýxm_ÝÁoÛ¯›?Ú÷|<¸¯îà÷í~Ë¿=‹ð×Å×ìùt8½Û7|—ëçï:üñ4⾺ƒoŸÍÛ¹~ÛO#î«;ßU;¾Å·ÂçWg|Y…/îp};0ྠ+ßÜáú‚`À}¾"¸ÃõÁ€û*|Kp…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€ +Ÿ'2¾¬Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|Y…®€û*œèpÜWáD@‡ëDྠ+'*|žÈø² +':\'÷U8Ðá:¸¯Â‰€׉À}NTø<ñeNt¸Nî«p" Ãu"p_…®€û*œ¨ðy" ãË*œèpÜWáD@‡ëDྠ+':\'÷U8ÐàO'"¾®Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|YÍ':{œÚ6áD@GëDؾ +':\'÷Õ|" ²u" Ó¾ ':Z'ÀöU8Ðá:¸¯æ=Nm›p" ¢ç‰€l/«p" Ãu"p_Í':{œÚ6áD@GëDؾ +'*|žÈø²šOtö8´m‰€ŽÖ‰°}Nt¸Nî«p" Â牀Œ/«p" Ãu"p_…®€û*œèpÜWáD@…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€ +Ÿ'2¾¬Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|Y…®€û*œèpÜWáD@‡ëDྠ+'*|žÈø² +':\'÷U8Ðá:¸¯Â‰€׉À}N4øӉ€ˆ¯«p" Ãu"p_…®€û*œèpÜWáD@…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€ +Ÿ'2¾¬Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|Y…®€û*œèpÜWó‰€Î'€¶M8PÑóD@¶—U8Ðá:¸¯Æý8ð×E8ÐÁ:´¯Â‰€ +Ÿ'2¾¬æ=Nm›p" £u"l_…®€ûj>PÙ:i߄­`û*œèpÜWó‰€Î'€¶M8PÑóD@¶—U8Ðá:¸¯Â‰€׉À}Nt¸Nî«p" Â牀Œ/«p" Ãu"p_…®€û*œèpÜWáD@…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€:ñuNt¸Nî«p" Ãu"p_…®€û*œ¨ðy" ãË*œèpÜWáD@‡ëDྠ+':\'÷U8PáóD@ƗU8Ðá:¸¯Â‰€׉À}N„̽=/hœx~A§·ýáýæ—í©ãù'ÆSo_Oüî§ûñÇ_>ÿ»üË/ÿþçW¡ÕÇéó'3ž°õbÀõó§…v.|ïš>èõê¹//8ôO/^PêŸ÷UèŸ:\ýྠ+ýS…Ïþ)ãË*ôO®þ p_…þ©ÃÕ?î«Ð?u¸ú'À}ú§ +ŸýSƗUèŸ:\ýྠ+ýS‡«ÜW¡êpõO€û*ôO>û§Œ/«Ð?u¸ú'À}ú§Wÿ¸¯BÿÔáêŸ÷UèŸü©Šøº +ýS‡«ÜW¡êpõO€û*ôO®þ p_…þ©Âgÿ”ñe5÷O=ú' mú§ŽVÿ¶¯BÿÔáêŸ÷ÕÜ?U¶ú§Lû&ôO­þ l_…þ©ÃÕ?êìÑ?m›Ð?Uô쟲½¬BÿÔáêŸ÷ÕÜ?uö蟀¶MèŸ:Zýؾ +ýS…Ïþ)ãËjîŸ:{ôO@Û&ôO­þ l_…þ©ÃÕ?î«Ð?UøìŸ2¾¬BÿÔáêŸ÷UèŸ:\ýྠ+ýS‡«ÜW¡ªðÙ?e|Y…þ©ÃÕ?î«Ð?u¸ú'À}ú§Wÿ¸¯BÿTá³Êø² +ýS‡«ÜW¡êpõO€û*ôO®þ p_…þ©Âgÿ”ñeú§Wÿ¸¯BÿÔáêŸ÷UèŸ:\ýྠ+ýS…Ïþ)ãË*ôO®þ p_…þ©ÃÕ?î«Ð?u¸ú'À}ú§êŸ"¾®BÿÔáêŸ÷UèŸ:\ýྠ+ýS‡«ÜW¡ªðÙ?e|Y…þ©ÃÕ?î«Ð?u¸ú'À}ú§Wÿ¸¯BÿTá³Êø² +ýS‡«ÜW¡êpõO€û*ôO®þ p_…þ©Âgÿ”ñeú§Wÿ¸¯BÿÔáêŸ÷ÕÜ?uö蟀¶MèŸ*zöOÙ^V¡êpõO€ûjìŸ:úÑ?üuú§Vÿ´¯BÿTá³Êø²šû§Îýж ýSG«ÛW¡êpõO€ûjîŸ*[ýS¦}ú§ŽVÿ¶¯BÿÔáêŸ÷ÕÜ?uö蟀¶MèŸ*zöOÙ^V¡êpõO€û*ôO®þ p_…þ©ÃÕ?î«Ð?UøìŸ2¾¬BÿÔáêŸ÷UèŸ:\ýྠ+ýS‡«ÜW¡ªðÙ?e|Y…þ©ÃÕ?î«Ð?u¸ú'À}ú§Wÿ¸¯BÿÔàOýSÄ×UèŸ:\ýྠ+ýS‡«ÜW¡êpõO€û*ôO>û§Œ/«Ð?u¸ú'À}ú§Wÿ¸¯BÿÔáêŸ÷UèŸ*|öO_V¡êpõO€û*ôO®þ p_…þ)D;mÿ/hôOÏ/ètÝïŸÂ+Zú§+ôO§Ï§.Ð?§ýÓõUÿôßþþÿ\¿ÇîípþöýŠOÌZ>ݯ—Ýòi~±^|¥ó‹õž_jøb½/(}±ྠ+_¬Wáó‹õ2¾¬Âëu¸¾Xp_…/Öëp}±ྠ+_¬×áúb=À}¾X¯Âçëe|Y…/Öëp}±ྠ+_¬×áúb=À}¾X¯ÃõÅz€û*|±^…Ï/ÖËø² +_¬×áúb=À}ÂÒWX +¸¯BXÚá +K÷UK+|†¥_V!,íp…¥€û*„¥®°p_…°´Ã–î«–Vø K3¾¬BXÚá +K÷UK;\a)ྠ+ai‡+,ÜW!,­ð–f|Y…°´Ã–î«–v¸ÂRÀ}ÂÒWX +¸¯BXÚàOaiÄ×UK;\a)ྠ+ai‡+,ÜW!,íp…¥€û*„¥>ÃҌ/«9,íì–m›–v´ÂR°}ÂÒWX +¸¯æ°´²–fÚ7!,íh…¥`û*„¥®°p_Íaig°hۄ°´¢gXšíeÂÒWX +¸¯æ°´³GX +´mBXÚÑ +KÁöUK+|†¥_VsXÚÙ#,Ú6!,íh…¥`û*„¥®°p_…°´ÂgXšñeÂÒWX +¸¯BXÚá +K÷UK;\a)ྠ+ai…Ï°4ãË*„¥®°p_…°´Ã–î«–v¸ÂRÀ}ÂÒ +ŸaiƗUK;\a)ྠ+ai‡+,ÜW!,íp…¥€û*„¥>ÃҌ/«–v¸ÂRÀ}ÂÒWX +¸¯BXÚá +K÷UK+|†¥_V!,íp…¥€û*„¥®°p_…°´Ã–î«–6øSXñuÂÒWX +¸¯BXÚá +K÷UK;\a)ྠ+ai…Ï°4ãË*„¥®°p_…°´Ã–î«–v¸ÂRÀ}ÂÒ +ŸaiƗUK;\a)ྠ+ai‡+,ÜW!,íp…¥€û*„¥>ÃҌ/«–v¸ÂRÀ}ÂÒWX +¸¯æ°´³GX +´mBXZÑ3,Íö² +ai‡+,ÜWcXÚя°ோ–v°ÂR }ÂÒ +ŸaiƗÕ–vöK¶MK;Za)ؾ +ai‡+,ÜWsXZÙ +K3í›–v´ÂR°}ÂÒWX +¸¯æ°´³GX +´mBXZÑ3,Íö² +ai‡+,ÜW!,íp…¥€û*„¥®°p_…°´ÂgXšñeÂÒWX +¸¯BXÚá +K÷UK;\a)ྠ+ai…Ï°4ãË*„¥®°p_…°´Ã–î«–v¸ÂRÀ}ÂÒ +K#¾®BXÚá +K÷UK;\a)ྠ+ai‡+,ÜW!,­ð–f|Y…°´Ã–î«–v¸ÂRÀ}ÂÒWX +¸¯BXZá3,Íø² +ai‡+,ÜW!,íp…¥€û*„¥¡‰lÃRxA#,}~A§Û~X^Ñoþb½ãíð±ýKÇS°ô6ÃÒW9éö§ñ·ÓçßÅ_sÒËyû3ýNNz¼Þ¿ý€S|yã±//oý¡ô폞ϟ¿ïÅËyA?žFÛWwðûáýôùە<¸¯¾ÆO§ÃyçsXíÇÃDûæŽ|9Ü>~<¶¯îà·íWìí{>žFÜWwðûáV¿åߞEøëâkö|:œÞí>ž&zYÝÁ·Ïå[?ÞᏧ÷Õ|û\®Ÿ¿KéðÇӈûê¾}6oçúm<¸¯îTòÛ§s¹´oûxšðeuß>ó¥}ÛÇӈûê>Ît¸Žî«pœ Ãuœp_…ã>d|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç *|'Èø² +Ç :\Ç ÷U8NÐá:N¸¯Âq‚×qÀ}ŽTøNÐÙã8ж Ç :ZÇ ÀöU8NÐá:N¸¯Âq‚ +ŸÇ 2¾¬Âq‚×qÀ}Žt¸Žî«pœ Ãuœp_…ã>d|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç *|'Èø² +Ç :\Ç ÷U8NÐá:N¸¯Âq‚×qÀ}ŽTød|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç *|'Èø² +Ç :\Ç ÷U8NÐá:N¸¯Âq‚×qÀ}ŽTød|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç üé8AÄ×U8NÐá:N¸¯Âq‚×qÀ}Žt¸Žî«pœ Âçq‚Œ/«pœ Ãuœp_…ã®ã€û*'èp'ÜWá8A…Ïã_Vá8A‡ë8ྠ+Ç :\Ç ÷U8N +ûö8¼ qœàùÞ÷„Wô[|>~Ü~‰“<žzÇ ÞŸŽüüó_Ö"ÿxx¿¼ÏÙË·îz¼ï~×õñtØþ"tÑë{ۋôÏ}y/.|?bðêõìF Ú6óa„’‡ÈöÕ|¡ÄÇaÂ}5Fèìqhß̇JzF ÛWóa„‡÷Õt¡¤¿F øëb>ŒÐÁ:Œô²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒPáó0BÆ×Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õx¡´‡ˆ¶Í|¡¤Ça²}5F(ñqp_‡:{FÚ7óa„’‡ÈöÕ|¡ÄÇaÂ}5F(íÇa¢m3FèhF{Y͇J|F ÜWãa„Ò~F Ú6óa„’‡ÈöÕ|¡Ãuðe5F(íÇa¢m3F(éql_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„ +Ÿ‡2¾®æÃ%>#î«ù0B‰Ã„ûj>ŒPâã0ᾚ#t¸#¾¬æÃ%>#î«ù0B‰Ã„ûj>ŒPâã0ᾚ#t¸#¾¬æÃ%>#î«ù0B‰Ã„ûj>ŒPâã0ᾚ#t¸#¾¬æÃ%>#î«ù0B‰Ã„ûj<ŒPڏÃDÛf>ŒÐÑ:Œö²š#”ø8Œ@¸¯¦Ã%ýý0Á_óa„‡ˆöÕ|¡Ãuðe5F(íÇa¢m3F(éql_͇J|F ÜWãa„·€öÍ|¡¤Ça²}5F(ñqp_‡JûqhÛ̇:Z‡À^Vóa„‡÷Õ|¡ÄÇaÂ}5F(ñqp_͇:\‡_Vóa„‡÷Õ|¡ÄÇaÂ}5F(ñqp_͇:\‡_Vóa„‡÷Õ|¡ÄÇaÂ}5F(ñqp_͇*|FÈøºš#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B®û«Ãô‚Ï}yA§ûîa„ôŠ~óa„ûg–øw=Î"ܟÏ"ü寿üé¿üt¾þøóO§ëÿñ*¾\?ÿ!ù„ü՜·ß5ŸÞ÷n$Ì 7½ÔÙó>½Öó®¯&Õ¼QöMhy+Y)o–mBÞJVǛeۄŠ·’ñfÙ6!ámäYðFÙ7¡ß­då»Y¶Mˆw+Yín–mÊÝJV¸›eۄl·‘gµe߄f·’•ìfÙ6!Ø­dõºY¶M¨u+Y±n–mRÝFž¥n”}:ÝJV¦›eۄH·’ÕèfÙ6¡Ð­dºY¶MÈsyÖ¹QöMhs+Yin–mÂÜJV—›eۄ*·’åfÙ6!ÉmäYäFÙ7¡Ç­då¸Y¶Mˆq+Y-n–mJÜJVˆ›eۄ ·‘g…e߄·’•àfÙ6!À­dõ·Y¶M¨o+Yñm–mÒÛB~*o“¼lBw[ÉÊn³l›ÝV²šÛ,Û&·•¬à6˶ ¹m#ÏÚ6ʾ™[Û +©mv¿.Bh[¹êl3l›PÙV²"Û,ÛfNlX…mtmúÚÊU^›aۄ¸¶’ÕÖfÙ6sY[Á#¬Íî×EÈjwVµöMhj+YIm–m3µ¾Aöå×ûý5×ËÓ­º4ßÈ<>a¾‘ùú ‡odþâq¦od»Wᙞod¼WÇodvôå™þ¼ßȬàýÌ3}¬Â72;<ßÈ x¯Â72;<ßÈ x¯Â72;<7འ+ ·ÂwÃ=ãÇ*TÜOÆ x¯BÈíð”Ü€÷*´ÜOÌ x¯BέðÝsÏø± +E·Ã“tÞ«u;Üá ÄïUHľñ?VçJÜÙ+º6!wtJq°{Zq‡'¼Wç\\ÙéÅgº7¡wt’q°{¢q‡§¼WçnÜÙ+º6!WônÇgûX…zÜáÉÇïÕ9 wö*ȁ®Mhȝˆì^…Œ\á»#Ÿñcu.ɝ½Rr kbrG§&»W¡'wx‚rÀ{’r…ï¦|ƏU¨Êž¬ð^…°Üá)ËïUhËž¸ð^…¼\á»/Ÿñc +s‡'1¼W!2wx*sÀ{:s‡'4¼W!5WønÍgüX…ÚÜáÉÍïUΞâð^…æÜá‰ÎïUÈξ»ó?V¡¼W¡?wxtÀ{t…ï}ƏU¨Ðž ð^…Ýá)ÑïUhÑžð^…ÝàW=úˆŸ«P¤;ãÇ*ÔéOžx¯B îðê€÷*4êO¤x¯B¦®ðÝ©Ïø± +¥ºÃ“ªÞ««;<µ:འ+½ºÃ¬Þ«¬+|7ë3~¬Bµîðdë€÷*„ëO¹x¯Îíº³W¼tmB¾®èݯÏö± +»Ã“°Þ«cÄîèKÅðçEèØœè^…”]á»eŸñcu®Ù½rv k‚vG§h»W¡iwx¢vÀ{uÎڕ®}¦{ÊvG'm»W!nwxêvÀ{uî۝½w kwEïÆ}¶U¨ÜžÌð^…ÐÝá)ÝïUhÝžØð^…Ü]á»wŸñcŠw‡'y¼W!zwxªwÀ{ºw‡'|¼W!}WønßgüX…úÝáÉßïUàžð^…Þá‰àïUÈà ~ÕÁø¹ +%¼Ã“ÂÞ«Ã;<5<འ+=¼ÃÄÞ«Ä+|7ñ3~¬Bïðdñ€÷*„ñOx¯BïðÄñ€÷*äñ +ß}üŒ«PÈ;<‰<འ+‘¼ÃSÉÞ«Ðɵ· åáV)ÿ©Hÿv;•žèw·òïf½ÿþô­üoŸº¿´òïÿÝ©Vþ_þôö폿þó/?œ)çG-ðñ—œkã˟ãýÇoïnTó»-½š˜ÚÒë§ÚÒ/hjKïUhK¾ÛÒ?V¡-uxÚRÀ{ÚR‡§-¼W¡-uxÚRÀ{ÚR…ï¶tƏUhKž¶ð^…¶ÔáiKïUhKž¶ð^…¶Tá»-ñcÚR‡§-¼W¡-uxÚRÀ{ÚR‡§-¼W¡-UønKgüX…¶ÔáiKïUhKž¶ð^…¶ÔáiKïUhK¾ÛÒ?V¡-uxÚRÀ{ÚR‡§-¼W¡-uxÚRÀ{ÚR…ï¶tƏUhKž¶ð^…¶ÔáiKïUhKž¶ð^…¶ÔàWm鈟«Ð–:V¡-uxÚRÀ{ulK}iKþ¼m©ƒÓ–ݫЖ*|·¥3~¬Îm©³W[ +tmB[êè´¥`÷*´¥O[ +x¯Îm©²Ó–ÎtoB[êè´¥`÷*´¥O[ +x¯Îm©³W[ +tmB[ªèݖÎö± +m©ÃӖޫЖ:ÜN,‡'ú݉åÃ÷÷?³¾ÿQ}N,ק.‰åÃN,ÿ¯_ÿzV•ßîïޞ?þ>ùj½Ÿáý#oïÿ„½QU~{¼{ýÇNãó­}z¾ó­ôo/ïüñ~_<ÎôåÓh÷ê üíîõþãÏ+¿|ñ^ý¿¿¿{øö&íˇ‰îÍòãÝË÷·K_>v¯ÞÀ_>¾ÖþÌקïÕøÛ݋þ‘ÿã³^üš}¸¿»ýfàëÓD«7ð÷_——{û_ŸF¼Woàï¿.ÏLqøåӈ÷ê üý×æéAÿØ/ŸF¼Wo|ñû¯Îã£ý±¯O~¬ÞÀßuí}}ñ^½¯¯jvx¾ð^…/€vx¾ð^…/€Vø¾N0ãÇ*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«pÀá¹Nx¯Âu…ïë3~¬Âu‡ç:འ+× žë€÷*\'px®Þ«p@áû:ÁŒ«pÀá¹Nx¯Âu‡ç:འ+× žë€÷*\'Pø¾N0ãÇ*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«pÀá¹Nx¯Âuƒ_]'ñs®8<× ïU¸Nàð\'¼Wá:Ãsð^…ë +ß× füX¯8{]'º6á:£sì^…ëÏuÀ{u¾N ì\'˜éބëŽÎu°{®8<× ïÕù:³×u k®(z_'˜íc®8<× ïÕù:³×u k®8:× ÀîU¸N ð}`ƏÕù:³×u k®8:× ÀîU¸Nàð\'¼Wá:Â÷u‚?Vá:Ãsð^…ëÏuÀ{®8<× ïU¸N ð}`ƏU¸Nàð\'¼Wá:Ãsð^…ëÏuÀ{®(|_'˜ñc®8<× ïU¸Nàð\'¼Wá:Ãsð^…ë +ß× füX…ëÏuÀ{®8<× ïU¸Nàð\'¼Wá:Â÷u‚?Vá:Ãsð^…ëÏuÀ{®8<× ïU¸N`ð«ë#~®Âu‡ç:འ+× žë€÷*\'px®Þ«p@áû:ÁŒ«pÀá¹Nx¯Âu‡ç:འ+× žë€÷*\'Pø¾N0ãÇ*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«óug¯ë@×&\'Pô¾N0ÛÇ*\'px®Þ«ãuG_®üy®88× €îU¸N ð}`ƏÕù:³×u k®8:× ÀîU¸Nàð\'¼WçëÊÎu‚™îM¸Nàè\'»Wá:Ãsð^¯8{]'º6á:¢÷u‚Ù>Vá:Ãsð^…ëÏuÀ{®8<× ïU¸N ð}`ƏU¸Nàð\'¼Wá:Ãsð^…ëÏuÀ{®(|_'˜ñc®8<× ïU¸Nàð\'¼Wá:Ãsð^…뿺N0âç*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«pÀá¹Nx¯Âu…ïë3~¬Âu‡ç:འ+× žë€÷*\' +{{h]'øt`¸N0<Ñï¾Npÿr÷øjÍ× ~ûÔÛºNðøù:Áo_ÿüÛWAŸ)ç÷S +O{ãëKϏÏüýÏWSayý´CaùÅM…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Baið«ÂrÄÏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñcu.,½ +K k +KG§°»W¡°tx +KÀ{u.,•Âr¦{ +KG§°»W¡°tx +KÀ{u.,½ +K k +KEïÂr¶U(,žÂð^ Kg¯ÂèڄÂÒÑ),ÁîU(,¾ Ë?VçÂÒÙ«°º6¡°tt +K°{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(, ~UXŽø¹ +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷ê\X:{–@×&–ŠÞ…ål«PX:<…%à½:–Ž¾–^„ÂÒÁ),îU(,¾ Ë?VçÂÒÙ«°º6¡°tt +K°{ +K‡§°¼WçÂRÙ),gº7¡°tt +K°{ +K‡§°¼WçÂÒÙ«°º6¡°Tô.,gûX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂÒàW…刟«PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…åPÚÂh–Ÿ:ÆÇۅåðD¿»°üxÃøíí +Ëõ©Kaù´ Ëþåç÷ÿó·ÿû—_Oúöñöòҏòp÷ôt3®Üß:>çþÖÐë¾5ô‹š¾5ð^…o ux¾5ð^…o UønZgüX…¦ÕáiZïUhZž¦ð^…¦ÕáiZïUhZ¾›Ö?V¡iuxšVÀ{šV‡§i¼W¡iuxšVÀ{šV…ï¦uƏUhZž¦ð^…¦ÕáiZïUhZž¦ð^…¦Uá»iñcšV‡§i¼W¡iuxšVÀ{šV‡§i¼W¡iUønZgüX…¦ÕáiZïUhZž¦ð^…¦ÕáiZïUhZ¾›Ö?V¡iuxšVÀ{šV‡§i¼W¡iuxšVÀ{šVƒ_5­#~®BÓêð4­€÷*4­OÓ +x¯BÓêð4­€÷*4­ +ßM댫sÓêìÕ´]›Ð´::M+ؽ +M«ÃÓ´Þ«sÓªì4­3ݛд::M+ؽ +M«ÃÓ´Þ«sÓêìÕ´]›Ð´*z7­³}¬BÓêð4­€÷êÜ´:{5­@×&4­ŽNÓ +v¯BÓªðÝ´Îø±:7­Î^M+е M«£Ó´‚ݫд:ÝnZ‡'ú½MëÇ+í¯ÙŽIëúÐ¥h}þ\´ösÞÿȯžïÿpµ}þà>Þøú÷1ðúüñ÷§óÓ­]?ÞùJú·û»÷ž=~õ4çéëó|lސï^_$üÛgÉý¼xƒ}¹{xxy•îåÃ×æ ùýäþÕþ¨/&¹6¿–ïßA¾½9øòYpkñûx÷òýMþ¯\›7ä—÷?”|—?êõa’kó†üöþg1éþ㣤~ÚûÚ|¸¿»ý&ÎëÃàöæ ùýWãå^þœ×‡I®Íòû¯Æóû¾œ|ù0ɵyC~ÿyz°?íˇI®ÍÙÿû¯Éã£üi¯ƒÜ›7äËQ'¯K ×æ|gÁÉëÌȵ9Ypòº±rmΔœ ³Ü›óy'¯ë + ×æ|[ÁÉë´ȵ9Vpòº«rmÎW”œ£ +³Ü›óI'¯‹ + ×æ|OÁÉëœȵ9Spòº¥rmΗ”œC +³Ü›ó'¯+ + ×æ|CÁÉë„ȵ9PpòºŸrmÎ×”œã ³Ü›óé'¯Ë ×æ|7ÁÉëlȵ9Mpòº™rmΔœƒ ³Ü›ó¹'¯k ×æ|+ÁÉëTȵ9Jpòº“rmÎW”œ# ³Ü›ó‰'¯ ×æ|ÁÉë<ȵ9GpòºrmΗŒ¼#Œò±9ŸEpòºŠrmÎ7œ¼N"€\›óA'¯{ ×æ| AÉ9†0˽9žBpð帟ç;Î]g®Íù‚“× ks¼€ àuavkq>àÜuýàڜo8y>¹6ÇþÜ=÷óâ|õ@¹9z0ý9ŸP0ÊÇæ|žÀÉë:ȵ9ß&pò:Mrm· œ¼î€\›óU%ç(Á,÷æ|’ÀÉë"ȵ9ß#pò:GrmÎÇœ¼n€\›ó%%çÁ,÷æ|†ÀÉë +ȵ9ß pò:ArmÎœ¼î€\›óõ%çøÀ,÷æ|zÀÉëòȵ9ßpò:;rmŽG|¹9îçÅùâ€rsp`†{s>7àäumäڜn 8÷·S ~ڛ 8uÝ·6ç+JΑYîÍñĀƒ/Àý¼8ßpî:/pmÎÇœ¼n €\›ãe¯Ã³[‹óY箫×æ|SÀÉë¤Èµ9pð垸ŸçkÊÍ1îÍù”€“×%ks¾#àäuFäڜ8yݹ6ç J΁YîÍù|€“×õks¾àäu:äڜ8yÝ ¹6ç«JÎрYîÍùd€“×Őks¾àäu.äڜ8yÝ +¹6çKFއFù؜Ï8y] ¹6çN^'@®Íù@€“×}ks¾ ä˜åޜO8y]¹6ç»N^g@®Íù(€“×Mks¾ ä˜åޜÏ8y]¹6ç[N^§@®ÍùÀ˜³«;ð4—}ªíŸo^çwxÿmáûoV^à +ÀúÔå ÀËÕ€¿þò¯?þÓϟûåÿùÓ÷?þ¯ó(ÀGøúø‘y\Yç÷[?¾<Üú1^u€ããîðúy‡ð‹šR@À{b@‡§¼W¡tx‚@À{’@…ï&pƏU¨ž,ð^…0Ðá)ïUhž8ð^…V¡|txÒGÀ{uŒ}©þ¼ý£ƒ@Ý«@*|73~¬Î¤³W tmBé蔐`÷*´O x¯Î9¤²ÓCÎtoBéè$‘`÷*D‘O x¯Î]¤³W tmB©èÝFÎö± +u¤Ã“GÞ«H:<…$འ+¤ÃIÞ«I*|w’3~¬B)é𤒀÷*ĒO- x¯B/éð“€÷*$“ +ßÍ䌫PM:<Ù$འ+á¤ÃSNÞ«ÐN:<ñ$འ+ù¤Á¯úÉ?W¡ txJÀ{"J‡§¢¼W¡£txBJÀ{RJ…ï–rƏU¨)žœð^… Òá)*ïUh*ž¨ð^…¬RừœñcÊJ‡'­¼W!®txêJÀ{úÊ¡ ´%<Ð*,?•Œ/·Ë቎Æò˗÷?>ÝCc¹>ui,_§Æò_þôöíÿñï?¾Š½>þ¦õJ<ž÷ïÿµ¸QZîük|è]?õ}ñ@Sþ5ãÇ*ä_Oþx¯Bþåðä_€÷*ä_Oþx¯Bþ¥ðÍø± +ù—ÓÞ«9<ùའ+ù—ÓÞ«)|ç_3~¬Bþåðä_€÷*ä_Oþx¯Bþåðä_€÷*ä_ +ßù׌«9<ùའ+ù—ÓÞ«9<ùའ+ù—Á¯ò¯?W!ÿrxò/À{ò/‡'ÿ¼W!ÿrxò/À{ò/…ïükƏÕ9ÿröÊ¿€®MÈ¿ü ì^…üËáÉ¿ïÕ9ÿRvò¯™îMÈ¿ü ì^…üËáÉ¿ïÕ9ÿröÊ¿€®MÈ¿½ó¯Ù>V!ÿrxò/À{uò/ kò/G'ÿ»W!ÿRøοfüXó/g¯ü èڄüËÑÉ¿ÀîUÈ¿žü ð^…üKá;ÿšñcò/‡'ÿ¼W!ÿrxò/À{ò/‡'ÿ¼W!ÿRøοfüX…üËáÉ¿ïUÈ¿žü ð^…üËáÉ¿ïUÈ¿¾ó¯?V!ÿrxò/À{ò/‡'ÿ¼W!ÿrxò/À{ò/…ïükƏUÈ¿žü ð^…üËáÉ¿ïUÈ¿žü ð^…üKá;ÿšñcò/‡'ÿ¼W!ÿrxò/À{ò/‡'ÿ¼W!ÿ2øUþ5âç*ä_Oþx¯Bþåðä_€÷*ä_Oþx¯Bþ¥ðÍø± +ù—ÓÞ«9<ùའ+ù—ÓÞ«)|ç_3~¬Bþåðä_€÷*ä_Oþx¯Bþåðä_€÷*ä_ +ßù׌«9<ùའ+ù—ÓÞ«sþåì•]›)zç_³}¬Bþåðä_€÷ê˜9ú’üyò/'ÿºW!ÿRøοfüXó/g¯ü èڄüËÑÉ¿ÀîUÈ¿žü ð^ó/e'ÿšéބüËÑÉ¿ÀîUÈ¿žü ð^ó/g¯ü èڄüKÑ;ÿšícò/‡'ÿ¼W!ÿrxò/À{ò/‡'ÿ¼W!ÿRøοfüX…üËáÉ¿ïUÈ¿žü ð^…üËáÉ¿ïUÈ¿¾ó¯?V!ÿrxò/À{ò/‡'ÿ¼W!ÿrxò/À{ò/ƒ_å_#~®Bþåðä_€÷*ä_Oþx¯Bþåðä_€÷*ä_ +ßù׌«9<ùའ+ù—ÓÞ«9<ùའ+ù—Âwþ5ãÇ*ä_Oþx¯Bþåðä_€÷*ä_c®äò/x •}Š¬^oç_Ãýî¯Ø{¾¿{~{x…ük}ê’½Uþõ¿ÿÛßþùß~þò矿üúogöõþ;ö׏O~e?ɼˆx+üÊ7ž»¿ñìúy‡o<û⁦o<¼WáÏžä ð^…äMá;y›ñc’7‡'y¼W!ysx’7À{’7‡'y¼W!ySøNÞfüX…äÍáIÞïUHÞžä ð^…äÍáIÞïUHÞ¾“·?V!ysx’7À{’7‡'y¼W!ysx’7À{’7…ïämƏUHÞžä ð^…äÍáIÞïUHÞžä ð^…äÍàWÉۈŸ«¼9<Éའ+ɛÓ¼Þ«¼9<Éའ+ɛÂwò6ãÇꜼ9{%o@×&$oŽNòv¯Bòæð$o€÷Ꜽ);ÉÛL÷&$oŽNòv¯Bòæð$o€÷Ꜽ9{%o@×&$oŠÞÉÛl«¼9<Éà½:'oÎ^Éе ɛ£“¼Ý«¼)|'o3~¬Îɛ³WòtmBòæè$o`÷*$oOòx¯Bò¦ð¼Íø± +ɛÓ¼Þ«¼9<Éའ+ɛÓ¼Þ«¼)|'o3~¬Bòæð$o€÷*$oOòx¯Bòæð$o€÷*$o +ßÉی«¼9<Éའ+ɛÓ¼Þ«¼9<Éའ+ɛÂwò6ãÇ*$oOòx¯Bòæð$o€÷*$oOòx¯Bò¦ð¼Íø± +ɛÓ¼Þ«¼9<Éའ+ɛÓ¼Þ«¼ü*yñs’7‡'y¼W!ysx’7À{’7‡'y¼W!ySøNÞfüX…äÍáIÞïUHÞžä ð^…äÍáIÞïUHÞ¾“·?V!ysx’7À{’7‡'y¼W!ysx’7À{’7…ïämƏUHÞžä ð^…äÍáIÞïÕ9ysöJހ®MHÞ½“·Ù>V!ysx’7À{uLÞ}IÞþ¼ɛƒ“¼Ý«¼)|'o3~¬Îɛ³WòtmBòæè$o`÷*$oOòx¯Îɛ²“¼ÍtoBòæè$o`÷*$oOòx¯Îɛ³WòtmBò¦è¼Íö± +ɛÓ¼Þ«¼9<Éའ+ɛÓ¼Þ«¼)|'o3~¬Bòæð$o€÷*$oOòx¯Bòæð$o€÷*$o +ßÉی«¼9<Éའ+ɛÓ¼Þ«¼9<Éའ+ɛÁ¯’·?W!ysx’7À{’7‡'y¼W!ysx’7À{’7…ïämƏUHÞžä ð^…äÍáIÞïUHÞžä ð^…äMá;y›ñc’7‡'y¼W!ysx’7À{’·1ÔrÉ<ÐJÞ>…eo·“·á‰~wòöøöþ›÷?ªÏÉÛúÔ%yû^ÉÛñøÇ¿>yþøßÕÕüW•Ûëͯ7ûöx÷úWœÆ\ûô€çkéß^î>þÆï‹Çù‚¾|í^½¿Ý½ÞüÅá—O#Þ«_ã÷÷wÿ>Eٗݛ7äÇ»—ïo/–¾|í^½¿¼ÿžý»ý™¯O#Þ«7ð÷ÿTÿÈÿñY„?/~Í>ÜßÝ¿~³?ðõi¢Õøû¯Ë˽ý¯O#Þ«7ð÷_—ç?§8üòiÄ{õþþŸ>=èûåӈ÷ê×øãû¯Îã£ý±¯O~¬ÞÀßuí}}ñ^½¿ÿêÜ?Ùûú4â½zÿO¿=?XüòiÄ{õküéþîÛ÷gûc_Ÿ&üX½?¾ÿÖãÅþØקïÕøËÝ·×Wûc_ŸF¼WoàowÏ/¯úÇ~ù4â½z£“ÿÕ¹õû©/:ù˧ ?Voà됀Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O`ð«ó#~®Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«óyg¯ó@×&œ'pt΀ݫpžÀá9Ox¯Îç ”ó3ݛpžÀÑ9Ov¯Ây‡ç<à½:Ÿ'pö:OtmÂyEïó³}¬Ây‡ç<à½:Ÿ'pö:OtmÂyGç<ؽ +ç ¾ÏÌø±:Ÿ'pö:OtmÂyGç<ؽ +ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ~už`ÄÏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{u>OàìužèڄóŠÞç fûX…óÏyÀ{uO0ÛÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pžÀàWç Fü\…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…ócaïÎÀ­óŸŽ|¿}ž`x¢ã<Á3œ'xÿi¼¼¾ÿ÷`>O°>õÛy‚Çoužà_þôö폿þÓ¯ùñ÷/Sηwi¯¤~ž‡»§ûû›— +va9>ì.,¯Ÿv(,¿x ©°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(, ~UXŽø¹ +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Î…¥³Wa tmBaéè–`÷*–Oa x¯Î…¥²SXÎtoBaéè–`÷*–Oa x¯Î…¥³Wa tmBa©è]XÎö± +…¥ÃSXÞ«saéìUX]›PX::…%ؽ +…¥Âwa9ãÇê\X:{–@×&–ŽNa v¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Á¯ +Ë?W¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^ Kg¯ÂèڄÂRÑ»°œíc +K‡§°¼WÇÂÒїÂàϋPX:8…%н +…¥Âwa9ãÇê\X:{–@×&–ŽNa v¯Baéð–€÷ê\X*;…åL÷&–ŽNa v¯Baéð–€÷ê\X:{–@×&–ŠÞ…ål«PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PXüª°ñs +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°Ê@[X­Âòú¿Ý.,‡'úÝ_}ÿñÛé·'(,ק.…åý*,ÿ×Ïÿñ¿ýÿú?¿üâáçstµÿEWùtë§wõ•Àã#~Æá+¿x é+ïÕñ+}ùJ`€?/ÂW+x%ðL«ð•ÀÏWÞ«ð•ÀÏWÞ«ð•ÀÏWÞ«ð•À +ß_ <ãÇ*|%°Ãó•À€÷*|%°Ãó•À€÷*|%°Ãó•À€÷*|%°Âw°>ãÇ*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:འ+ÁºÃ¬Þ«¬+|ë3~¬B°îðë€÷*ëO°x¯B°îðë€÷*ë +ßÁúŒ«¬;<Á:འ+ÁºÃ¬Þ«¬;<Á:འ+ÁºÂw°>ãÇ*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:འ+ÁºÃ¬Þ«¬ü*Xñs‚u‡'X¼W!Xwx‚uÀ{‚u‡'X¼W!XWøÖgüXƒug¯`èڄ`ÝÑ ÖÁîUÖž`ð^ƒue'XŸéބ`ÝÑ ÖÁîUÖž`ð^ƒug¯`èڄ`]Ñ;XŸíc‚u‡'X¼Wç`ÝÙ+Xº6!Xwt‚u°{‚u…ï`}ƏÕ9Xwö +ց®M֝`ì^…`Ýá ÖïUÖ¾ƒõ?V!Xwx‚uÀ{‚u‡'X¼W!Xwx‚uÀ{‚u…ï`}ƏUÖž`ð^…`Ýá ÖïUÖž`ð^…`]á;XŸñc‚u‡'X¼W!Xwx‚uÀ{‚u‡'X¼W!XWøÖgüX…`Ýá ÖïUÖž`ð^…`Ýá ÖïUÖ¾ƒõ?V!Xwx‚uÀ{‚u‡'X¼W!Xwx‚uÀ{‚uƒ_ë#~®B°îðë€÷*ëO°x¯B°îðë€÷*ë +ßÁúŒ«¬;<Á:འ+ÁºÃ¬Þ«¬;<Á:འ+ÁºÂw°>ãÇ*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:à½:ëÎ^Á:е Áº¢w°>ÛÇ*ëO°x¯ŽÁº£/Á:ÀŸ!Xwp‚u {‚u…ï`}ƏÕ9Xwö +ց®M֝`ì^…`Ýá ÖïÕ9XWv‚õ™îM֝`ì^…`Ýá ÖïÕ9Xwö +ց®MÖ½ƒõÙ>V!Xwx‚uÀ{‚u‡'X¼W!Xwx‚uÀ{‚u…ï`}ƏUÖž`ð^…`Ýá ÖïUÖž`ð^…`]á;XŸñc‚u‡'X¼W!Xwx‚uÀ{‚u‡'X¼W!X7øU°>âç*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:འ+ÁºÃ¬Þ«¬+|ë3~¬B°îðë€÷*ëO°x¯B°>$×6X‡ZÁúõMÁúðD¿7Xwï^__ç^}}蒫?\rõÿü×?ÿëÿüë/ÿùüéáù?þtÿüÇÿ8[í÷ã·Ç×?\Aý4ôËãÍpý·€{|Ðˇ®Ÿóv¾ýœ õöìöæÜn;y¥Û ×æn;yuÛ ×æ\m;yEÛ ×æœl+9Åö,÷æÜk;yåÚ ×æk;yµÚ ×æ\j;y…Ú ×æœi+9•ö,÷æÜh;y%Ú ×æh;yõÙ ×æ\g;yÅÙ ×æœf+9eö,÷æÜe;yeÙ ×æe;y5Ù ×æ\d;yÙ ×æœc+95ö,÷æÜb;y¥Ø ×æb;yuØ ×æ\a;yEØ ×æœ`+9ö,÷æÜ_;yå× ×æ_;yµ× ×æ\^;y…× ×æœ]+9Õõ,÷æÜ\;y%× ×æ\;yõÖ ×æ\[;yÅÖ ×æœZ+9¥õ,÷æÜY;yeÖ ×æY;y5Ö ×æ\X;yÖ ×æœWy×Õ£|lÎmµ“WZ rmÎaµ“WW rmÎUµ“WT rmÎIµ’STÏroŽ=µƒ/95¸Ÿç˜Ú¹«¥¸6ç’ÚÉ+¤¹6njZÁ«¢žÝZœj箄àڜj'¯~äÚëi_âip?/Îé´rSNÏpoÎÝ´“W6 rmŽÑ´ƒ/Í4¸ŸçbÚ¹+˜¸6ç\ZÉ©¥g¹7ÇVÚÁ—TÜϋs(íÜÕI\›s%íäIƒ\›s"­äҳܛsíä•Gƒ\›síäÕFƒ\›síäFƒ\›s­äTѳܛsíä•Dƒ\›síäÕCƒ\›s íäCƒ\›s +­ä”гܛsíä•Aƒ\›síäÕ@ƒ\›síä@ƒ\›sþ¬äÔϳܛsûìä•>ƒ\›søìäÕ=ƒ\›sõìä=ƒ\›sò¬äϳܛsïìä•;ƒ\›sììäÕ:ƒ\›séìä:ƒ\›sælä]9ò±97ÎN^‰3ȵ9ÎN^}3ȵ9×ÍN^q3ȵ9§ÍJNÙ<˽9wÍN^Y3ȵ9GÍN^M3ȵ9ÍN^A3ȵ9çÌJNÍ<˽9·ÌN^)3ȵ9‡ÌN^3ȵ9WÌN^3ȵ9'ÌJNÁ<˽9÷ËN^ù2ȵ9ÇËN^í2ȵ9–˾„Ëà~^œ³eå¦Zžáޜ›e'¯däڜ‚eçþÖ+ƒúio®•ºbepksN••œRy–{sì”|ɔÁý¼8GÊÎ]2Àµ9ÊN^2ȵ9æÉ +^uòìÖâÜ&;w¥É×æ&;yuÉ ×æX%;ø%ƒûyqN’•›"y†{s¼rdksŽ‘¼Zdks.‘¼Bdksΐ•œ +y–{sn¼dks¼úcks®¼âcksN•œòx–{s¼²cksŽŽ¼šcks.Ž¼‚cks΍¼kãQ>6çÖØÉ+5¹6çÐØÉ«3¹6çÊØÉ+2¹6çÄXÉ)Œg¹7ç¾ØÉ+/¹6ç¸ØÉ«-¹6ç²ØÉ+,¹6ç¬XÉ©Šg¹7ç¦ØÉ+)¹6ç ØÉ«'¹6çšxÈ`eL OsùØõÓ<ÞßL‰‡Ç9Jâg(‰ß^Þÿÿü )ñúÔ¥%~\-ñ¯¿þüo?~þÓ¯ùñ_~üüó/ýûY }¿{zúxMç +:Sâ—û§ï·R⇍Ϻë°ë‡ò°/hêÃïU(ÄžD ð^…HÌá©ÄïUèľC±?V!sxZ1À{j1‡'¼W!sxŠ1À{š1…ïhlƏUÈÆžn ð^…rÌáIÇïUˆÇžz ð^…~Lá; ›ñc2‡§!¼W¡"sx22À{B2‡§$¼W¡%SøŽÉfüX…œÌáéÉïU(Êž¤ ð^…¨Ìá©ÊïUèÊ ~–ø¹ +i™ÃӖÞ«P—9V¡ptx +GÀ{u.½ +G k +GG§p»W¡pTø.güX Gg¯ÂèڄÂÑÑ)ÁîU(žÂð^…ÂQá»pœñc +G‡§p¼W¡ptx +GÀ{ +G‡§p¼W¡pTø.güX…ÂÑá)ïU(žÂð^…ÂÑá)ïU(¾ Ç?V¡ptx +GÀ{ +G‡§p¼W¡ptx +GÀ{ +G…ïÂqƏU(žÂð^…ÂÑá)ïU(žÂð^…ÂQá»pœñc +G‡§p¼W¡ptx +GÀ{ +G‡§p¼W¡p4øUá8âç*ŽOáx¯BáèðŽ€÷*ŽOáx¯Bá¨ð]8Îø± +…£ÃS8Þ«P8:<…#འ+…£ÃS8Þ«P8*|Ž3~¬BáèðŽ€÷*ŽOáx¯BáèðŽ€÷*Ž +߅㌫P8:<…#འ+…£ÃS8Þ«sáèìU8]›P8*zŽ³}¬BáèðŽ€÷êX8:úR8üy +G§pºW¡pTø.güX Gg¯ÂèڄÂÑÑ)ÁîU(žÂð^ Ge§pœéބÂÑÑ)ÁîU(žÂð^ Gg¯ÂèڄÂQÑ»pœíc +G‡§p¼W¡ptx +GÀ{ +G‡§p¼W¡pTø.güX…ÂÑá)ïU(žÂð^…ÂÑá)ïU(¾ Ç?V¡ptx +GÀ{ +G‡§p¼W¡ptx +GÀ{ +Gƒ_Ž#~®BáèðŽ€÷*ŽOáx¯BáèðŽ€÷*Ž +߅㌫P8:<…#འ+…£ÃS8Þ«P8:<…#འ+…£Âwá8ãÇ*ŽOáx¯BáèðŽ€÷*ŽCœg Gx U8^?ÐããíÂqx¢ß]8¾ÿÙíûÃÃ+ŽëS—Âñùªpü¿ÿý/þùã㏷Áß?÷òñ§+ãü >ü–öFÞøørwÿ? ™Ï}zÎóíôÇ·÷çy~øò¾À/ŸF¼Woä÷wß¾üãEáëӄ«7ðÕ:~|_<ÎôåÓh÷ꍠõþîþññQâëӄ«7ðÇ÷ŸòÇo(~ù4â½z_ůÃÓÞ«Ð;<1འ+±ÂwG<ãÇ*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1འ+±ÃÓÞ«Ð+|wÄ3~¬BGìðtĀ÷*tÄOG x¯BGìðtĀ÷*tÄ +ßñŒ«Ð;<1འ+±ÃÓÞ«Ð;<1འ+±ÂwG<ãÇ*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1འ+±ÃÓÞ«Ðüª#ñs:b‡§#¼W¡#vx:bÀ{:b‡§#¼W¡#VøîˆgüX;bg¯ŽèڄŽØÑéˆÁîU舞Žð^;be§#žéބŽØÑéˆÁîU舞Žð^;bg¯ŽèڄŽXÑ»#žíc:b‡§#¼WçŽØÙ«#º6¡#vt:b°{:b…ïŽxƏչ#vöꈁ®M舝Žì^…ŽØáéˆïU舾;â?V¡#vx:bÀ{:b‡§#¼W¡#vx:bÀ{:b…ïŽxƏU舞Žð^…ŽØáéˆïU舞Žð^…ŽXá»#žñc:b‡§#¼W¡#vx:bÀ{:b‡§#¼W¡#VøîˆgüX…ŽØáéˆïU舞Žð^…ŽØáéˆïU舾;â?V¡#vx:bÀ{:b‡§#¼W¡#vx:bÀ{:bƒ_uÄ#~®BGìðtĀ÷*tÄOG x¯BGìðtĀ÷*tÄ +ßñŒ«Ð;<1འ+±ÃÓÞ«Ð;<1འ+±ÂwG<ãÇ*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1à½:wÄÎ^1е ±¢wG<ÛÇ*tÄOG x¯Ž±£/1ÀŸ¡#vp:b {:b…ïŽxƏչ#vöꈁ®M舝Žì^…ŽØáéˆïÕ¹#Vv:â™îM舝Žì^…ŽØáéˆïÕ¹#vöꈁ®M舽;âÙ>V¡#vx:bÀ{:b‡§#¼W¡#vx:bÀ{:b…ïŽxƏU舞Žð^…ŽØáéˆïU舞Žð^…ŽXá»#žñc:b‡§#¼W¡#vx:bÀ{:b‡§#¼W¡#6øUG<âç*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1འ+±ÃÓÞ«Ð+|wÄ3~¬BGìðtĀ÷*tÄOG x¯BGß'úÝßNûøü¿AG¼>uéˆ_¿êˆÿåOoßþøÿþã¿þí×ÿ÷VZüýíîéñãßl\±ýpïyx¸ñC½zm{|òýÚöõ£¯mñ@Ókۀ÷*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶­ðýÚöŒ«ókÛÎ^¯m]›ðÚ¶£óÚ6ؽ +¯m;<¯mÞ«ókÛÊÎkÛ3ݛðÚ¶£óÚ6ؽ +¯m;<¯mÞ«ókÛÎ^¯m]›ðÚ¶¢÷kÛ³}¬ÂkÛÏkۀ÷êüÚ¶³×kÛ@×&¼¶í輶 v¯ÂkÛ +߯mÏø±:¿¶íìõÚ6е ¯m;:¯mƒÝ«ðÚ¶ÃóÚ6འ+¯m+|¿¶=ãÇ*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛ +߯mÏø± +¯m;<¯mÞ«ðÚ¶ÃóÚ6འ+¯m;<¯mÞ«ðÚ¶Â÷kÛ3~¬ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶­ðýÚöŒ«ðÚ¶ÃóÚ6འ+¯m;<¯mÞ«ðÚ¶ÃóÚ6འ+¯m+|¿¶=ãÇ*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛ¿zm{ÄÏUxmÛáymð^…׶ž×¶ïUxmÛáymð^…׶¾_۞ñc^Ûvx^Û¼Wáµm‡çµmÀ{^Ûvx^Û¼Wáµm…ï׶güX…׶ž×¶ïUxmÛáymð^…׶ž×¶ïUxm[áûµí?Váµm‡çµmÀ{^Ûvx^Û¼Wç׶½^Ûº6áµmEï׶gûX…׶ž×¶ïÕñµmG_^Ûøó"¼¶í༶ t¯ÂkÛ +߯mÏø±:¿¶íìõÚ6е ¯m;:¯mƒÝ«ðÚ¶ÃóÚ6à½:¿¶­ì¼¶=Ó½ ¯m;:¯mƒÝ«ðÚ¶ÃóÚ6à½:¿¶íìõÚ6е ¯m+z¿¶=ÛÇ*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛ +߯mÏø± +¯m;<¯mÞ«ðÚ¶ÃóÚ6འ+¯m;<¯mÞ«ðÚ¶Â÷kÛ3~¬ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶mð«×¶Gü\…׶ž×¶ïUxmÛáymð^…׶ž×¶ïUxm[áûµí?Váµm‡çµmÀ{^Ûvx^Û¼Wáµm‡çµmÀ{^ÛVø~m{ƏUxmÛáymð^…׶ž×¶ïUxm{xÃؾ¶ ´^Û¾~ Ç—Û¯mOô»_Û~ÿ¥xÿ_À¼¶½>uymûmzmûü>–§»‡oÿÎôÊ:¿êíõñæ×@í/ˆwAÌõó_óÅM_x¯ÂÄ(|Ǎ«ð1ÏÄÞ«ð1ÏÄÞ«ð1ÏÄÞ«ð1 +ß_3ãÇ*|AŒÃó1€÷*|AŒÃó1€÷*|AŒÃó1€÷*|AŒÂ÷ÄÌø± +_ãð|A འ+_ãð|A འ+_ãð|A འ+_£ðý13~¬ÂÄ8<_x¯ÂÄ8<_x¯ÂÄ8<_x¯ÂÄ(|Ǎ«ð1ÏÄÞ«ð1ÏÄÞ«ð1ÏÄÞ«ð1¿* Gü\…ÒÐá) ïU( žÒð^…ÒÐá) ïU( ¾KÃ?VçÒÐÙ«4º6¡4ttJC°{JC‡§4¼WçÒPÙ) gº7¡4ttJC°{JC‡§4¼WçÒÐÙ«4º6¡4Tô. gûX…ÒÐá) ïÕ¹4tö* ®M( Òì^…ÒPá»4œñcu. ½JC kJCG§4»W¡4txJCÀ{JC…ïÒpƏU( žÒð^…ÒÐá) ïU( žÒð^…ÒPá»4œñcJC‡§4¼W¡4txJCÀ{JC‡§4¼W¡4Tø. güX…ÒÐá) ïU( žÒð^…ÒÐá) ïU( ¾KÃ?V¡4txJCÀ{JC‡§4¼W¡4txJCÀ{JC…ïÒpƏU( žÒð^…ÒÐá) ïU( žÒð^…ÒÐàW¥áˆŸ«P:<¥!འ+¥¡ÃSÞ«P:<¥!འ+¥¡Âwi8ãÇ*”†Oix¯Biè𔆀÷*”†Oix¯Bi¨ð]Îø± +¥¡ÃSÞ«P:<¥!འ+¥¡ÃSÞ«P*|—†3~¬Biè𔆀÷*”†Oix¯Î¥¡³WitmBi¨è]Îö± +¥¡ÃSÞ«cièèKiðçE( œÒè^…ÒPá»4œñcu. ½JC kJCG§4»W¡4txJCÀ{u. •Òp¦{JCG§4»W¡4txJCÀ{u. ½JC kJCEïÒp¶U( žÒð^…ÒÐá) ïU( žÒð^…ÒPá»4œñcJC‡§4¼W¡4txJCÀ{JC‡§4¼W¡4Tø. güX…ÒÐá) ïU( žÒð^…ÒÐá) ïU( ~UŽø¹ +¥¡ÃSÞ«P:<¥!འ+¥¡ÃSÞ«P*|—†3~¬Biè𔆀÷*”†Oix¯Biè𔆀÷*”† +ߥጫP:<¥!འ+¥¡ÃSÞ«P}œ- áVixý@Si8<ÑQ>CiøíûÝýýËw( ק.¥á÷O¥áþõןÿüóÏ?ÏÆðñþý·N©}¥|ñ}0Oï?æáããÝËÃ?þ™9>h>÷éIÏ÷Ó_Þÿӏ?6}ñ@_à—O#Þ«7𷻗oÏ¿|ñ^½QWÞß}ûþü]âëӄ«7ðÇ»ç·ûc_ŸF¼Woà+?ux¢VÀ{¢V‡'j¼W!jUøŽZgüX…¨Õá‰ZïUˆZž¨ð^…¨Õá‰ZïUˆZ¾£Ö?V!jux¢VÀ{¢V‡'j¼W!jux¢VÀ{¢V…ï¨uƏUˆZž¨ð^…¨Õá‰ZïUˆZž¨ð^…¨Uá;jñc¢V‡'j¼W!jux¢VÀ{¢V‡'j¼W!jUøŽZgüX…¨Õá‰ZïUˆZž¨ð^…¨Õá‰ZïUˆZ ~µŽø¹ +Q«ÃµÞ«µ:þã7!wo×OõøíÓS}ÿÇÓÇol~ûÔÇCýòË/7Ÿêjm‰ÿ?ZŸ6endstream +endobj +521 0 obj << +/Type /Page +/Contents 522 0 R +/Resources 520 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 524 0 R 528 0 R 529 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R ] +>> endobj +524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.5554 685.0373 184.5772 694.0135] +/Subtype /Link +/A << /S /GoTo /D (0:Introduction) >> +>> endobj +528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 685.0373 538.9788 694.0135] +/Subtype /Link +/A << /S /GoTo /D (0:Introduction) >> +>> endobj +529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 669.7148 221.1101 678.5614] +/Subtype /Link +/A << /S /GoTo /D (0:Authentication) >> +>> endobj +533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 669.7148 538.9788 678.5614] +/Subtype /Link +/A << /S /GoTo /D (0:Authentication) >> +>> endobj +534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 656.7633 184.5875 665.61] +/Subtype /Link +/A << /S /GoTo /D (0:Roles) >> +>> endobj +535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 656.7633 538.9788 665.61] +/Subtype /Link +/A << /S /GoTo /D (0:Roles) >> +>> endobj +536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 643.8119 187.3568 652.6585] +/Subtype /Link +/A << /S /GoTo /D (0:Filters) >> +>> endobj +537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 643.8119 538.9788 652.6585] +/Subtype /Link +/A << /S /GoTo /D (0:Filters) >> +>> endobj +538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 630.8605 223.6007 639.7071] +/Subtype /Link +/A << /S /GoTo /D (0:90) >> +>> endobj +539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 630.8605 538.9788 639.7071] +/Subtype /Link +/A << /S /GoTo /D (0:90) >> +>> endobj +540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.5554 615.4981 234.0115 624.4743] +/Subtype /Link +/A << /S /GoTo /D (0:Methods) >> +>> endobj +541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 615.4981 538.9788 624.4743] +/Subtype /Link +/A << /S /GoTo /D (0:Methods) >> +>> endobj +542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 598.1183 231.372 609.0222] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressType) >> +>> endobj +543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 598.1183 538.9788 609.0222] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressType) >> +>> endobj +544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 585.1668 274.2907 596.0708] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressTypeToAddress) >> +>> endobj +545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 585.1668 538.9788 596.0708] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressTypeToAddress) >> +>> endobj +546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 574.2727 218.3506 583.1193] +/Subtype /Link +/A << /S /GoTo /D (0:AddBootState) >> +>> endobj +547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 574.2727 538.9788 583.1193] +/Subtype /Link +/A << /S /GoTo /D (0:AddBootState) >> +>> endobj +548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 561.3213 214.4752 570.1679] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFile) >> +>> endobj +549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 561.3213 538.9788 570.1679] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFile) >> +>> endobj +550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 546.3125 271.7802 557.2165] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNodeGroup) >> +>> endobj +551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 546.3125 538.9788 557.2165] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNodeGroup) >> +>> endobj +552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 535.2988 246.3258 544.265] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNode) >> +>> endobj +553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 535.2988 538.9788 544.265] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNode) >> +>> endobj +554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 520.4097 214.924 531.3136] +/Subtype /Link +/A << /S /GoTo /D (0:AddKeyType) >> +>> endobj +555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 520.4097 538.9788 531.3136] +/Subtype /Link +/A << /S /GoTo /D (0:AddKeyType) >> +>> endobj +556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 507.4582 213.9073 518.3622] +/Subtype /Link +/A << /S /GoTo /D (0:AddMessage) >> +>> endobj +557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 507.4582 538.9788 518.3622] +/Subtype /Link +/A << /S /GoTo /D (0:AddMessage) >> +>> endobj +558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 496.4445 244.8014 505.4107] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkMethod) >> +>> endobj +559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 496.4445 538.9788 505.4107] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkMethod) >> +>> endobj +560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 481.5554 238.4655 492.4593] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkType) >> +>> endobj +561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 481.5554 538.9788 492.4593] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkType) >> +>> endobj +562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 468.6039 231.0633 479.5079] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeGroup) >> +>> endobj +563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 468.6039 538.9788 479.5079] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeGroup) >> +>> endobj +564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 457.7098 240.3683 466.5564] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeNetwork) >> +>> endobj +565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 457.7098 538.9788 466.5564] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeNetwork) >> +>> endobj +566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 444.7584 205.6089 453.605] +/Subtype /Link +/A << /S /GoTo /D (0:AddNode) >> +>> endobj +567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 444.7584 538.9788 453.605] +/Subtype /Link +/A << /S /GoTo /D (0:AddNode) >> +>> endobj +568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 429.7496 262.9139 440.6536] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToNodeGroup) >> +>> endobj +569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 429.7496 538.9788 440.6536] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToNodeGroup) >> +>> endobj +570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 418.8555 235.2576 427.7021] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToPCU) >> +>> endobj +571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 418.8555 538.9788 427.7021] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToPCU) >> +>> endobj +572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 405.9041 203.407 414.7507] +/Subtype /Link +/A << /S /GoTo /D (0:AddPCU) >> +>> endobj +573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 405.9041 538.9788 414.7507] +/Subtype /Link +/A << /S /GoTo /D (0:AddPCU) >> +>> endobj +574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 392.9526 201.7333 401.7993] +/Subtype /Link +/A << /S /GoTo /D (0:AddPeer) >> +>> endobj +575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 392.9526 538.9788 401.7993] +/Subtype /Link +/A << /S /GoTo /D (0:AddPeer) >> +>> endobj +576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 377.9439 227.3472 388.8479] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonKey) >> +>> endobj +577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 377.9439 538.9788 388.8479] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonKey) >> +>> endobj +578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 366.9302 211.1479 375.8964] +/Subtype /Link +/A << /S /GoTo /D (0:AddPerson) >> +>> endobj +579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 366.9302 538.9788 375.8964] +/Subtype /Link +/A << /S /GoTo /D (0:AddPerson) >> +>> endobj +580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 354.0983 236.921 362.945] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSite) >> +>> endobj +581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 354.0983 538.9788 362.945] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSite) >> +>> endobj +582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 341.1469 241.3443 349.9936] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSlice) >> +>> endobj +583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 341.1469 538.9788 349.9936] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSlice) >> +>> endobj +584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 328.1955 202.8491 337.0421] +/Subtype /Link +/A << /S /GoTo /D (0:AddRole) >> +>> endobj +585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 328.1955 538.9788 337.0421] +/Subtype /Link +/A << /S /GoTo /D (0:AddRole) >> +>> endobj +586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 315.244 240.2386 324.0907] +/Subtype /Link +/A << /S /GoTo /D (0:AddRoleToPerson) >> +>> endobj +587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 315.244 538.9788 324.0907] +/Subtype /Link +/A << /S /GoTo /D (0:AddRoleToPerson) >> +>> endobj +588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 302.2926 232.1786 311.1393] +/Subtype /Link +/A << /S /GoTo /D (0:AddSiteAddress) >> +>> endobj +589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 302.2926 538.9788 311.1393] +/Subtype /Link +/A << /S /GoTo /D (0:AddSiteAddress) >> +>> endobj +590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 289.3412 199.5314 298.1878] +/Subtype /Link +/A << /S /GoTo /D (0:AddSite) >> +>> endobj +591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 289.3412 538.9788 298.1878] +/Subtype /Link +/A << /S /GoTo /D (0:AddSite) >> +>> endobj +592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 276.3897 239.7301 285.2364] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttribute) >> +>> endobj +593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 276.3897 538.9788 285.2364] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttribute) >> +>> endobj +594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 261.381 259.4063 272.285] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttributeType) >> +>> endobj +595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 261.381 538.9788 272.285] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttributeType) >> +>> endobj +596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 250.4869 253.7672 259.3335] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceInstantiation) >> +>> endobj +597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 250.4869 538.9788 259.3335] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceInstantiation) >> +>> endobj +598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 237.4158 203.9548 246.3821] +/Subtype /Link +/A << /S /GoTo /D (0:AddSlice) >> +>> endobj +599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 237.4158 538.9788 246.3821] +/Subtype /Link +/A << /S /GoTo /D (0:AddSlice) >> +>> endobj +600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 224.584 239.6806 233.4307] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceToNodes) >> +>> endobj +601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 224.584 538.9788 233.4307] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceToNodes) >> +>> endobj +602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 211.6326 212.2537 220.4792] +/Subtype /Link +/A << /S /GoTo /D (0:AuthCheck) >> +>> endobj +603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 211.6326 538.9788 220.4792] +/Subtype /Link +/A << /S /GoTo /D (0:AuthCheck) >> +>> endobj +604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 196.6239 218.4999 207.5278] +/Subtype /Link +/A << /S /GoTo /D (0:BlacklistKey) >> +>> endobj +605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 196.6239 538.9788 207.5278] +/Subtype /Link +/A << /S /GoTo /D (0:BlacklistKey) >> +>> endobj +606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 185.7297 250.4398 194.5764] +/Subtype /Link +/A << /S /GoTo /D (0:BootGetNodeDetails) >> +>> endobj +607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 185.7297 538.9788 194.5764] +/Subtype /Link +/A << /S /GoTo /D (0:BootGetNodeDetails) >> +>> endobj +608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 170.721 243.2471 181.6249] +/Subtype /Link +/A << /S /GoTo /D (0:BootNotifyOwners) >> +>> endobj +609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 170.721 538.9788 181.6249] +/Subtype /Link +/A << /S /GoTo /D (0:BootNotifyOwners) >> +>> endobj +610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 157.7696 236.6022 168.6735] +/Subtype /Link +/A << /S /GoTo /D (0:BootUpdateNode) >> +>> endobj +611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 157.7696 538.9788 168.6735] +/Subtype /Link +/A << /S /GoTo /D (0:BootUpdateNode) >> +>> endobj +612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 146.8754 225.5235 155.7221] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddress) >> +>> endobj +613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 146.8754 538.9788 155.7221] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddress) >> +>> endobj +614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 131.8667 299.4358 142.7706] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressTypeFromAddress) >> +>> endobj +615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 131.8667 538.9788 142.7706] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressTypeFromAddress) >> +>> endobj +616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 118.9153 245.1997 129.8192] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressType) >> +>> endobj +617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 118.9153 538.9788 129.8192] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressType) >> +>> endobj +618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 107.9015 232.1783 116.8678] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteBootState) >> +>> endobj +619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 107.9015 538.9788 116.8678] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteBootState) >> +>> endobj +523 0 obj << +/D [521 0 R /XYZ 71.731 729.2652 null] +>> endobj +6 0 obj << +/D [521 0 R /XYZ 244.3315 703.236 null] +>> endobj +520 0 obj << +/Font << /F21 514 0 R /F28 527 0 R /F29 532 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +670 0 obj << +/Length 55961 +/Filter /FlateDecode +>> +stream +xڔÝM¬Wz¥ç¹~‡ÅÂù1lË.Á6Zh¸«G†j»]誢À¢Ðпw2öڑë‰X÷"4( Ü\×æ¥s2óÆ{üîåú?Çïޏ‡÷óõ?NŸ‡ÓÛåôÝ¿üåï^¾ûï׿ôw¼y}{;œ.Ç·ëÿñà¯þýùóõp9½¼}÷÷§—Ãçéxyxêøz>¼¾¾ûû÷—ÃùõüþíÔÿú‡¿û_~úüîóðùvzûîÿí»uL§þðÇÿçw§ÃëËáû¿?]^~÷¿ýðç~þá~üëûýŸþüÃïúñ/ÿôãøǟ~ü·ýþÿýÃÿùwÿûDž>/×ë|~wúµ®Ë—ÓñÉ?Øéóú7~tgûréƒßçüòrøx?¾?¼Ð|ªë4àsõ ~>œßN¯-~;¸¯>Á/‡ËùØâ·ÓˆûêüöWKüvq_}Œ¯ŸÎùµ}ìë4ácõ ~ýtN—Öþõ0Ò¶ùD¾~4ÇKûÌ×i´}õ ~ý«/oõ3¿FÜWã×_ß?ÛðÛa¢}ó‰|>œ>Þkúvm_}‚_ïï翝FÜWŸà×ß»>[û×ÃHÛæcù|ýd.õǽN“=VŸà׏æòÒ>óuq_}‚_?š×öWôÛa¤mó‰|ýdÎׯFJúvm_}Œ_¿y?Úg¾N>VŸà׏æXÛ¿FÚ6ŸÈ×OæåÜ>óum_}‚ŽŸ¯õ?÷í4â¾ú¿¼Þ>^Û_\ÖiÂÇêü|8¾_ÚǾN#î«OðËáíí­}ìë4â¾ú¿~:—ú×ôuq_}Œ¿]?×÷ö±¯Ó„Õ'øõÓ9œZüvq_}‚_?ÓGûØ×iÄ}õ ~ýtŽŸõc¿FÜWãï×OçøÒ>öušð±ú¿~://íc_§÷Õ'øåpù<¶ß&¬Óˆûêüãðòqªûí4â¾úÿx9\ÞOíc_§ «OðóáåíÜ>öuq_}‚_?ËkûØ×iÄ}õ ~ýt^_?Züvq_}Œ^?ëoB%¾N>VŸà×OçôÖ>öuq_}‚_?ã[ûØ×iÄ}õ ~ýt^ÞëÇ~;¸¯>Ä__^¯Ÿå7+: ø\}‚ŸŸ-~;¸¯>Á/‡×÷ÏK‹ßN#î«Oð÷ÃçûKýØo§÷ÕÇøñúé¼½´}&|¬>Á¯ŸÎåøÚâ·Óˆûêüú鼞ÚǾN#î«Oðë§s>Տývq_}ŒŸ®ŸÎéÜ>öušð±ú¿~:ÇöODtq_}‚_?—×÷¿FÜWŸàÏKýØo§÷ÕÇøùåpþxkû:MøX}‚Ÿïoíc_§÷Õ'øåp~{oû:¸¯>Á¯ŸÎ¥ýóÛa¤mó±üzýh^?Úg¾N“=VŸà׏æüÙ>óuq_}‚_?šsKÿrᯋOØëÇrz©øí4Ò¾ú¿\?—cûgž:MøX}‚_?—öÖa¤mó‰|9œ>Oí3_§ÑöÕ'øûáý£þoÚ:¸¯>Æß^§úµÛa¢}ó‰|:¼¿½¾µôí4Ú¾ú¿~4—KûÌ×iÄ}õ ~ýhúð_#m›å÷ë's~kéušì±ú¿~4§÷ö™¯ÓˆûêüúÑß?[üvq_}‚_?œ—ú±ßN#ñ—Ãñó³}ìë4ácõ ~:¼}|¶}FÜWŸà—Ãñã¥}ìë4â¾ú?¼½ÛßÍÖiÄ}õ1þyýtގíc_§ «Oðë§s9µ}FÜWŸà×Oçú}‹ßN#î«Oðë§s>׏ývq_}ˆ_^®ŸÎéµü³'|®>Á¯ŸÎñrjñÛiÄ}õ ~ýt^.Ÿ-~;¸¯>Áß—Ï·ú±ßN#ñãËáåã½}ìë4ácõ ~:\Þß?Züvq_}‚_/oíc_§÷Õ'øõÓ¹|֏ývq_}ŒŸ®ŸÎëgûØ×iÂÇêüúé¼¾´}FÜWŸà×Oç|<¶øí4â¾ú¿~:§ãGüñæÛ¿¡xüã͗ÓÇáåÈ_Ýèܗ ?ƍÎï‡Ï'¿Ï>øiñõÇÙñ§Åß®¿Ó?OçüÓâ:uûiñcüiññƒâ×ï^¿}³rÍGyy¹þÿ“Ÿ¿.|~œ?è¾:÷å‡y¡ó· ]^è~;¸¯>Á/׿årlñÛiÄ}õ þqx½\>Züvq_}Œ_¿‡ø¼~Ï\âë4ácõ ~ýtÎïíc_§÷Õ'ø·Tâ½}ìë4â¾ú¿~:Ǐ׿FÜWã×ï!>_>ÛǾN>VŸàçë_ýlû:¸¯>Á/‡Ï—ö±¯Óˆûêü–Ì”ø +q÷ÕâTøq2>WsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆÓá +q«1Ä)í[ˆC´m槤WˆC¶¯æ§ÄWˆC¸¯Æ§³Wˆ´o槤WˆC¶¯æ§ÄWˆC¸¯Æ§´o!Ѷ™CœŽVˆöXÍ!N‰¯‡p_!NißB¢m3‡8%½B²}5‡8®ð±CœÒ¾…8DÛfqJz…8dûjqJ|…8„ûjq:\!àc5‡8%¾BÂ}5‡8%¾BÂ}5‡8%¾BÂ}5‡8®ð±šCœ_!ᾚCœ_!ᾚCœ_!ᾚCœWˆøXÍ!N‰¯‡p_Í!N‰¯‡p_Í!N‰¯‡p_Í!N‡+Ä|¬æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§Ãâ>VsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSá;ÄÉø\Í!N‰¯‡p_Í!N‰¯‡p_Í!N‰¯‡p_Í!N‡+Ä|¬æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§Ãâ>VsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆÓá +q«9Ä)ñâî«9Ä)ñâî«1Ä)í[ˆC´m槣â€=VsˆSâ+Ä!ÜWSˆSÒ¿†8]Ì!N ¯‡h_Í!N‡+Ä|¬Æ§´o!Ѷ™Cœ’^!Ù¾šCœ_!á¾CœÎ^!о™Cœ’^!Ù¾šCœ_!á¾CœÒ¾…8DÛfq:Z!Øc5‡8%¾BÂ}5‡8%¾BÂ}5‡8%¾BÂ}5‡8®ð±šCœ_!ᾚCœ_!ᾚCœ_!ᾚCœWˆøXÍ!N‰¯‡p_Í!N‰¯‡p_Í!N‰¯‡p_Í!N…ï'ãs5‡8%¾BÂ}5‡8%¾BÂ}5‡8%¾BÂ}5‡8®ð±šCœ_!ᾚCœ_!ᾚCœ_!ᾚCœWˆøXÍ!N‰¯‡p_Í!N‰¯‡p_Í!N®Gª‡.t;÷åBçϧ!NºÑqൠo×/­^__> ÄY§n!Îéaˆ3~üúÏ/ßþ íñ«çóõÝ'ÎõѼ½þòÅB¼§Î}¹èüñôóñp<ûùÁ…&¾N>VŸàçÃÛéÛoë~;¸¯>ÁßÇãë[‹ßN#î«Oðë§ór9µøí4â¾ú=^>/íc_§ «OðóáòñÖ>öuq_}‚¿^ÞßÛǾN#î«OðÃåí½~ì·Óˆûêcürýt.ß~[¯ðušð±ú¿~:¯Ÿíc_§÷Õ'øõÓ9¶}FÜWŸà×OçüR?öÛiÄ}õ1þvýtNÇö±¯Ó„Õ'øõÓ9~ûb¡Ão§÷Õ'øõÓy9µ}FÜWŸàׯÎõc¿FÜWŸd¥«»­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æmð»š7âsjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãc5×¼½j^ mjގVÍ ¶¯BÍÛáªy÷Õ\óV¶jÞLû&Ô¼­šl_…š·ÃUóæíìUóm›PóVô®y³=V¡æípÕ¼€ûj®y;{Õ¼@Û&Ô¼­šl_…š·Âw͛ñ±škÞÎ^5/ж 5oG«æÛW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼ ~WóF|®BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྚkÞÎ^5/ж 5oEïš7ÛcjÞWÍ ¸¯Æš·£o5/À_¡æí`Õ¼@û*Ô¼¾kތÕ\óvöªy¶M¨y;Z5/ؾ +5o‡«æÜWsÍ[Ùªy3í›Póv´j^°}jÞWÍ ¸¯æš·³WÍ ´mBÍ[Ñ»æÍöX…š·ÃUóî«Póv¸j^À}jÞWÍ ¸¯BÍ[á»æÍøX…š·ÃUóî«Póv¸j^À}jÞWÍ ¸¯BÍ[á»æÍøX…š·ÃUóî«Póv¸j^À}jÞWÍ ¸¯BÍÛàw5oÄç*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«P󆵭yáB«æ½¿PªyÍ~ókõÞ>¯Ÿ¯Pó®S·š÷ü¥æý¿¾?]~÷Ã÷ÇËïþ}ü@øËõŸíýۗwÎ|Šoçg=ïuàýøË·ñ¦:÷åªóԏÇÃéÛ¿_xpißí›OäóáíóÛWï};¶¯>Áß®_Ã>ùà·ÓˆûêüãðV?ò_Î"üuñ1{:Žï/í_§‰«Oðëçòvlø:¸¯>Á¯ŸËåÛ×í~;¸¯>ÁWXßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõü.׏ø\…\¿Ã•ëëw¸r}À}rýW®¸¯B®_á;×ÏøX͹~g¯\hۄ\¿£•ëƒí«ëw¸r}À}5çú•­\?Ó¾ ¹~G+×ÛW!×ïpåú€ûjÎõ;{åú@Û&äú½sýlUÈõ;\¹>ྚsýÎ^¹>ж ¹~G+×ÛW!ׯðëg|¬æ\¿³W®´mB®ßÑÊõÁöUÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~ƒßåúŸ«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯æ\¿³W®´mB®_Ñ;×ÏöX…\¿Ã•ëî«1×ïè[®ð×EÈõ;X¹>о +¹~…ï\?ãc5çú½r} mrýŽV®¶¯B®ßáÊõ÷՜ëW¶rýLû&äú­\l_…\¿Ã•ëî«9×ïì•ëm›ëWôÎõ³=V!×ïpåú€û*äú®\p_…\¿Ã•ëëWøÎõ3>V!×ïpåú€û*äú®\p_…\¿Ã•ëëWøÎõ3>V!×ïpåú€û*äú®\p_…\¿Ã•ëë7ø]®ñ¹ +¹~‡+×ÜW!×ïpåú€û*äú®\p_…\¿Âw®Ÿñ± +¹~‡+×ÜW!×ïpåú€û*äú®\p_…\¿Âw®Ÿñ± +¹~‡+×ÜW!×ïpåú€û*äú14ïr}¸ÐÊõï/ôúò<×7ú͹þåíp9Ó»·o‡n±þë³Xÿß¼üîßÿõá[¸ß/ßþõÝÖæ£üøx?òK¸Ó}wÔ{wáÐôÎÛ¤¤7ʾ Ao%«çͲmBÍ[Ɋy³l›òV²JÞ,Û&t¼¼3Þ(û&D¼•¬†7˶ o%+àͲmB¾[ɪw³l›Ðî6òNw£ì›îV²ºÝ,Û&T»•¬h7˶ Én%«ØͲmB¯ÛÈ;׍²oB¬[Éju³l›PêV²BÝ,Û&dº•¬J7˶ n#ïD7ʾ n%«ÏͲmB[Ɋs³l›æV²ÊÜ,Û&t¹¼³Ü(û&D¹•¬&7˶ En%+ÈͲmBŽ[ɪq³l›Ðâ6òNq£ì›âV²:Ü,Û&T¸•¬7˶ n%«ÀͲmB[Èwùm’Ç&Ä·•¬ö6˶ åm%+¼Í²mBv[ɪn³l›ÐÜ6òNn£ì›9¸­àÕÛf÷ë"Ô¶•«Ø6ö ©m%«´Í²mæ恕ÙF×!²­\5¶¶M(l+Ym–m3çµ¼êÚì~]„¶¶qwZa߄°¶’ÕÕfÙ6sU[Á+ªÍî×EHj+WEm†mzÚFÞ9m”}3Ç´¼ZÚì~]„’¶rÒfØ6!£­dU´Y¶Mhhy'´QöMh+Yýl–mêÙJV<›eۄt¶’UÎfÙ6¡›mäÍFÙ7!š­d5³Y¶M(f+YÁl–mrÙJV-›eۄV¶‘w*e߄P¶’ÕÉfÙ6¡’­dE²Y¶MHd+Y…l–múØFÞyl”}âØJV›eۄ2¶’ÆfÙ6!‹­dU±Y¶Mhby'±QöMb+Y=l–mjØJV ›eۄ¶’UÂfÙ6¡ƒ-ä» 6Éc"ØJV›eۄ¶’ÀfÙ6!­dÕ¯Y¶Mh_y§¯QöM_+YÝk–mª×JVôšeۄ䵒U¼fÙ6¡wm䝻FÙ7!v­dµ®Y¶M(]+Y¡k–m2×JVåšeۄƵ‘wâe߄Àµ’Õ·fÙ6¡n­dÅ­Y¶Íœ¶Vð*[³ûuºÖÆÝYk„}¢ÖJVӚeیEkåނ֬~كœµRU³f×6¡em䝲FÙ7sÈZÁ«cÍî×E¨X+Wk†mÖJVÁšeÛÌýj+_®-B¼Z¹jW3l›P®V²ÂÕ,ÛfÎV+xU«ÙýºÍjãîd5¾ Áj%«WͲmB­ZɊU³l›ªV²JÕ,Û&tª¼3Õ(û&Dª•¬F5˶ …j%+PͲmBžZɪS³l›Ð¦6òNS£ì›¦V²ºÔ,Û&T©•¬(5˶ Ij%«HͲmBZÈw9j’Ç&Ĩ•¬5˶ %j%+DͲmB†ZɪP³l›Ð 6òNP£ì› V²úÓ,Û&Ô§•¬ø4˶ éi%«<ͲmBwÚÈ;;²oBtZÉjN³l›PœV²‚Ó,Û&ä¦)‘ìjÓ|››ÞÝæõø¼5}~‘š^ 5ýµ`»@kºNÝbÓ˗Øô?þð·¿ýóÿáÑ jßÏßþ]ŝá79>_ž¿z¦ñš;1½¿ghL\(E¦«™v¸:SÀ}JÓWj +¸¯BlÚáªM÷UèM+|§«œv¸šSÀ}ªÓWv +¸¯BxÚá*O÷UhO+|ǧ«Ÿv¸úSÀ} +ÔW‚ +¸¯B„ÚáªP÷UèP+|‡¨«¢v¸ZTÀ}jÔWŽ +¸¯BÚá*R÷UhR+|G©«¥v¸ºTÀ}ÊÔWš +¸¯BœÚáªS÷UèS+|ª«¨v¸UÀ}*ÕW¦ +¸¯B¨Úá*U÷UhU+|Ǫ««v¸zUÀ}ŠÕW² +¸¯B´ÚáªV÷UèVü.\ø\…tµÃÕ®î«P¯v¸òUÀ}ÖWÁ +¸¯BÃZá;bÍøXÍkg¯Žhۄ’µ£•²‚í«³v¸jVÀ}5÷¬•­ 5Ó¾ IkG«iÛW¡jípe­€ûj[;{•­@Û&´­½ãÖlUÈ[;\}+ྚ ×Î^‰+ж ‘kG«rÛW¡s­ðºf|¬æÔµ³Wë +´mBíÚÑÊ]ÁöU^;\Å+ྠ+Ík…ïè5ãc²×W÷ +¸¯BùÚáJ_÷Uˆ_;\õ+ྠ+ýk…ï6ãcØW ¸¯BÛáÊ`÷Ua;\%,ྠ+-l…ï6ãcrØW ¸¯BÛáJb÷Uˆb;\U,ྠ+]l…ï06ãcÒØW ¸¯BÛáÊc÷Ud;\…,ྠ+l…ïH6ãc2ÙW' ¸¯B)ÛáJe÷Uˆe;\µ,ྠ+½lƒß³Ÿ«Ìv¸šYÀ}ªÙW6 ¸¯B8Ûá*g÷Uhg+|dz«Ïv¸úYÀ} +ÚWB ¸¯BDÛáªh÷Uèh+|‡´«Òv¸ZZÀ}jÚWN ¸¯BPÛá*j÷Uhj+|Gµ«Õv¸ºZÀ}ÊÚWZ ¸¯æ¸¶³W] ´mB_[Ñ;°ÍöX…ĶÃÕØ²íè[f ð×Em;X¥-о +­m…ïØ6ãc5綝½z[ mŠÛŽVr ¶¯BtÛáªn÷ÕÜÝV¶ÂÛLû&¤·­öl_…ú¶Ã•ßî«9ÀíìUàm›ÐàVôŽp³=V!Ãípu¸€û*”¸®p_…·ÃUãî«ÐãVør3>V!Éíp5¹€û*T¹®,p_…0·ÃUæî«ÐæVøŽs3>V!Ïípõ¹€û*º®Dp_…H·ÃUéî«Ðé6ø]¨ñ¹ +©n‡«ÕÜW¡Öíp庀û*»®bp_…f·Âw´›ñ± +Ùn‡«ÛÜW¡Üíp¥»€û*Ä»®zp_…~·ÂwÀ›ñ± + o‡«áÜW¡âípe¼€û*„¼!EmK^¸ÐJyï/”ZÞp£ßüÞØóËõ7›ËbÞuêó¾}‰yÿ釟ÿç÷ǗßýøÓÿø?üüÿýøǙy}ûíÛ¿²½Ó¼8öóýíYÖ»Ó¯xá~Ýß8¤_.”Ò¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_ ~—~E|®BúÕáJ¿÷UH¿:\éྠ+éW‡+ýÜW!ýªð~e|¬æô«³Wú´mBúÕÑJ¿ÀöUH¿:\éྚӯÊVú•i߄ô«£•~í«~u¸Ò/À}5§_½Ò/ mÒ¯ŠÞéW¶Ç*¤_®ô p_ÍéWg¯ô hۄô«£•~í«~UøN¿2>VsúÕÙ+ýÚ6!ýêh¥_`û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«ÁïÒ¯ˆÏUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜWsúÕÙ+ýÚ6!ýªè~e{¬BúÕáJ¿÷՘~uô-ýøë"¤_¬ô h_…ô«Âwú•ñ±šÓ¯Î^éж éWG+ýÛW!ýêp¥_€ûjN¿*[éW¦}Ò¯ŽVú¶¯BúÕáJ¿÷՜~uöJ¿€¶MH¿*z§_Ù«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿ü.ýŠø\…ô«Ã•~~u¸Ò/À}Ò¯Wú¸¯BúUá;ýÊøX…ô«Ã•~~u¸Ò/À}Ò¯Wú¸¯BúUá;ýÊøX…ô«Ã•~~u¸Ò/À}Ò¯˜+ué\h¥_÷z==O¿Â~súuý/áÛÇùÒ¯uê–~½?K¿þðýÇËïþý_xôR¹óñÛÏÄÜy~«Óõ›©ÓùYüµßõ¯¼ßõvçð®·JïzËøX…w½u¸Þõ¸¯Â»Þ:\ïzÜWá]o®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯ÁˆÏUþ:\Áྠ+Á_‡+øÜW!øëp€û*¾ƒ¿ŒÕüuö +þ€¶Mþ:ZÁؾ +Á_‡+øÜWsðWÙ +þ2í›üu´‚?°}‚¿Wð¸¯æ௳Wð´mBðWÑ;øËöX…à¯Ãüî«9øëìüm›üu´‚?°}‚¿ +ßÁ_ÆÇjþ:{@Û&­àl_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«ü5ø]ðñ¹ +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€ûjþ:{@Û&½ƒ¿lUþ:\Áྃ¿Ž¾]„௃üí«üUøþ2>Vsð×Ù+øÚ6!øëh`û*®àp_ÍÁ_e+øË´oBð×Ñ +þÀöUþ:\Áྚƒ¿Î^Áж Á_Eïà/Ûc‚¿Wð¸¯Bð×á +þ÷Uþ:\Áྠ+Á_…ïà/ãc‚¿Wð¸¯Bð×á +þ÷Uþ:\Áྠ+Á_…ïà/ãc‚¿Wð¸¯Bð×á +þ÷Uþ:\Áྠ+Á_ƒßŸ«üu¸‚?À}‚¿Wð¸¯Bð×á +þ÷Uþ*|«üu¸‚?À}‚¿Wð¸¯Bð×á +þ÷Uþ*|«üu¸‚?À}‚¿Wð¸¯Bðµ6øƒ ­àïþB¯ççÁ_¸Ñoþ^^ïçÓ‚¿uêü}| þ~üã¿ÿéÇ¿|ûÏüéÇûיœ®¿À|ûó€;Íït<œ¿µOr¿FÄ ï0âþÆ!Œxp¡Fî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ¿ #">W!Œèp…€û*„®0p_…0¢ÃFî«FTø#2>VsÑÙ+ŒÚ6!Œèh…`û*„®0p_ÍaDe+ŒÈ´oBÑÑ +#ÀöU#:\aྚÈÎ^aж aDEï0"ÛcˆW¸¯æ0¢³W´mBÑÑ +#ÀöU#*|‡«9ŒèìFm›Ft´Â°}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BÑàwaDÄç*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«9ŒèìFm›FTô#²=V!Œèp…€ûj #:úFüuˆV´¯BQá;ŒÈøXÍaDg¯0hۄ0¢£F€í«Ft¸ÂÀ}5‡•­0"Ó¾ aDG+ŒÛW!Œèp…€ûj#:{…@Û&„½ÃˆlU#:\aྠ+aD‡+ŒÜW!Œèp…€û*„¾ÃˆŒU#:\aྠ+aD‡+ŒÜW!Œèp…€û*„¾ÃˆŒU#:\aྠ+aD‡+ŒÜW!Œèp…€û*„ ~FD|®BÑá +#÷U#:\aྠ+aD‡+ŒÜW!Œ¨ðFd|¬BÑá +#÷U#:\aྠ+aD‡+ŒÜW!Œ¨ðFd|¬BÑá +#÷U#:\aྠ+aDøaþ6Œ€ ­0âþB¯¯ÏÈp£F\rqù<^¿m|ùÈa„N݈χaÄú‡ÿ2ß|ózx=]¾»gfñv|ý|VDèM<ù¦:÷åªÏßÄóèBáM<„ûj~O‡ëM<€Õü&ž_oâ!ÜWó›xJ|½‰‡p_Íoâ)ñõ&Â}5¿‰§Ãõ&ÀÇj~O‰¯7ñî«ùM<%¾ÞÄC¸¯æ7ñ”øzᾚßÄÓázàc5¿‰§ÄWpF¸¯æà¬ÄWpF¸¯æà¬ÄWpF¸¯æà¬Ãœ>VspVâ+8#ÜWspVâ+8#ÜWspVâ+8#ÜWspVá;8Ëø\ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‡+8|¬Æ଴oÁѶ™ƒ³’^ÁÙ¾šƒ³_Áᾃ³Î^Áо™ƒ³’^ÁÙ¾šƒ³_Áᾃ³Ò¾gDÛfÎ:ZÁØc5g%¾‚3Â}5g¥} Έ¶Íœ•ô +ÎÈöÕœu¸‚3ÀÇj ÎJûœm›98+霑í«98+ñœî«98ëpg€Õœ•ø +Î÷Õœ•ø +Î÷Õœ•ø +Î÷Õœu¸‚3ÀÇjÎJ|g„ûjÎJ|g„ûjÎJ|g„ûjÎ:\Áàc5g%¾‚3Â}5g%¾‚3Â}5g%¾‚3Â}5g®à 𱚃³_Áᾚƒ³_Áᾚƒ³_Áᾚƒ³WpøXÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY…ïà,ãs5g%¾‚3Â}5g%¾‚3Â}5g%¾‚3Â}5g®à 𱚃³_Áᾚƒ³_Áᾚƒ³_Áᾚƒ³WpøXÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‡+8|¬æà¬ÄWpF¸¯æà¬ÄWpF¸¯Æ଴oÁѶ™ƒ³ŽVpöXÍÁY‰¯àŒp_MÁYIÿœüu1g%¼‚3¢}5g®à 𱃳ҾgDÛfÎJzgdûjÎJ|g„ûj Î:{g@ûfÎJzgdûjÎJ|g„ûj ÎJûœm›98ëhg`Õœ•ø +Î÷Õœ•ø +Î÷Õœ•ø +Î÷Õœu¸‚3ÀÇjÎJ|g„ûjÎJ|g„ûjÎJ|g„ûjÎ:\Áàc5g%¾‚3Â}5g%¾‚3Â}5g%¾‚3Â}5g¾ƒ³ŒÏÕœ•ø +Î÷Õœ•ø +Î÷Õœ•ø +Î÷Õœu¸‚3ÀÇjÎJ|g„ûjÎJ|g„ûjÎJ|g„ûjÎ:\Áàc5g%¾‚3Â}5g%¾‚3Â}5g©•*ƒ3ºÐíܗ …à,Ýè·¾‰çòþqø8}¾Bp¶Nýœ]¿½÷àìñx·Ïã·[z§ø]Nׯ®N¯Ïz³×ãáåó—_¼ãEuîËMçϧ_ÿy.ß¾syp¡øí4â¾ú;¼¼¿ŸZüvq_}‚.oïŸ-~;¸¯>Éü®ŸÎåãRâë4ácõ ~ýt^?ÛǾN#î«OðÕAv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]ÙàwueÄç*ԕ®ºp_…º²ÃUWî«PWv¸êJÀ}êÊ +ßueÆÇj®+;{Օ@Û&ԕ­ºl_…º²ÃUW®¬lՕ™öM¨+;Zu%ؾ +ue‡«®ÜWs]ÙÙ«®Ú6¡®¬è]Wf{¬B]Ùáª+÷Õ\Wvöª+¶M¨+;Zu%ؾ +ue…ïº2ãc5ו½êJ mêʎV] ¶¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨+ü®®Œø\…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}5ו½êJ mêʊÞue¶Ç*ԕ®ºp_ueGßêJ€¿.B]ÙÁª+öU¨++|ו«¹®ììUWm›PWv´êJ°}êÊW] ¸¯æº²²UWfÚ7¡®ìhՕ`û*ԕ®ºp_Íueg¯ºhۄº²¢w]™í± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²ÁïêʈÏU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+;\u%ྠ+ue‡«®ÜW¡® e`[W…V]y¡×Ëóº2Üè7ו×oa>Þém~¿º~Ù{‹+#®ü§~þŸß_~÷ãOÿãQ×wúå'ö×ÊÃy¾þžû4±Tëw7‘Z¿ûû†ÖïÁ…Rë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯ÁïZ¿ˆÏUhý:\­ྠ+­_‡«õÜW¡õëpµ~€û*´~¾[¿ŒÕÜúuöjý€¶Mhý:Z­ؾ +­_‡«õÜWsëWÙjý2í›Ðúu´Z?°}Z¿W븯æÖ¯³Wë´mBëWÑ»õËöX…Ö¯ÃÕúõëìÕúm›Ðúu´Z?°}Z¿ +ß­_ÆÇjný:{µ~@Û&´~­Öl_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«Ðú5ø]ëñ¹ +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€ûjný:{µ~@Û&´~½[¿lUhý:\­à¾[¿Ž¾µ~]„Ö¯ƒÕúí«ÐúUøný2>Vsë×Ù«õÚ6¡õëhµ~`û*´~®Öp_Í­_e«õË´oBë×ÑjýÀöUhý:\­ྚ[¿Î^­ж ­_EïÖ/ÛcZ¿W븯Bë×ájý÷Uhý:\­ྠ+­_…ïÖ/ãcZ¿W븯Bë×ájý÷Uhý:\­ྠ+­_…ïÖ/ãcZ¿W븯Bë×ájý÷Uhý:\­ྠ+­_ƒßµ~Ÿ«Ðúu¸Z?À}Z¿W븯Bë×ájý÷Uhý*|·~«Ðúu¸Z?À}Z¿W븯Bë×ájý÷Uhý*|·~«Ðúu¸Z?À}Z¿W븯Bëµ®õƒ ­ÖïþB¯oÏ[¿p£ßÜú]¿_þ<]áɱß:u‹ýN#ö? ~¼þß~1½ÛŸOïtþ|{ø]Þ>ùª8^Qç¾ÜqþdúñíúUÜ·¯_\è~;¸¯>Á?ßþ^GÿrᯋÙÓñp|y+áušè±ú¿~.oÇö¯Óˆûêüú¹\ŽŸ-~;¸¯>Á¯ŸÍë©~ì·Óˆûêcü|ýtÎçö±¯Ó„Õ'øõÓ9ÛǾN#î«Oðë§s|mû:¸¯>Á¯ŸÎËåÔâ·Óˆûꓷ¤®×ÈVø~9mÆÇ*¼œ¶ÃõrZÀ}^NÛáz9-ྠ+/§ípë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*ë ~¬G|®B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬æ`½³W°´mB°ÞÑ +ÖÁöUÖ;\Á:ྚƒõÊV°ži߄`½£¬ƒí«¬w¸‚uÀ}5락‚u m‚õŠÞÁz¶Ç*ë®`p_ÍÁzg¯`hۄ`½£¬ƒí«¬WøÖ3>Vs°ÞÙ+XÚ6!Xïhë`û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Áï‚õˆÏUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜWs°ÞÙ+XÚ6!X¯è¬g{¬B°Þá +Ö÷Õ¬wô-Xøë"ë¬`h_…`½Âw°žñ±šƒõÎ^Á:ж ÁzG+XÛW!Xïpë€ûjÖ+[Áz¦}‚õŽV°¶¯B°Þá +Ö÷Õ¬wö +ց¶MÖ+zëÙ«¬w¸‚uÀ}‚õW°¸¯B°Þá +Ö÷UÖ+|뫬w¸‚uÀ}‚õW°¸¯B°Þá +Ö÷UÖ+|뫬w¸‚uÀ}‚õW°¸¯B°Þá +Ö÷UÖü.Xø\…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õ˜\wÁ:\hë÷z}¬‡ýæ`ý|½ÈûåÁú:u ÖÏ_‚õÿôÿe&ÚÇëwFïwçƒ[œ¯¯×ûa°¯¸ƒõû;†`ýÁ…R°¸¯Æ`½£oÁ:À_!X¯à¬gz¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!Xoð»`=âs‚õW°¸¯B°Þá +Ö÷UÖ;\Á:ྠ+Áz…ï`=ãc5락‚u m‚õŽV°¶¯B°Þá +Ö÷Õ¬W¶‚õLû&ë­`l_…`½Ã¬î«9Xïì¬m›¬WôÖ³=V!Xïpë€ûjÖ;{ë@Û&ë­`l_…`½Âw°žñ±šƒõÎ^Á:ж ÁzG+XÛW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*ë ~¬G|®B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྚƒõÎ^Á:ж ÁzEï`=Ûc‚õW°¸¯Æ`½£oÁ:À_!Xï`ë@û*뾃õŒÕ¬wö +ց¶MÖ;ZÁ:ؾ +Áz‡+XÜWs°^Ù +Ö3훬w´‚u°}‚õW°¸¯æ`½³W°´mB°^Ñ;XÏöX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°ÞàwÁzÄç*ë®`p_…`½Ã¬î«¬w¸‚uÀ}‚õ +ßÁzÆÇ*ë®`p_…`½Ã¬î«¬w¸‚uÀ}‚õ +ßÁzÆÇ*ë®`p_…`½Ã¬î«¬‡äº ÖáB+X¿¿ÐëÇó`=Üè7ë×̗Óù‚õ_O½­`ýõk°þÃ?Ÿù<\>¾ý©îú[\ãxx;½>Åúñpúå_Ü-ÓcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|ƒßÅòŸ«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«9–ïìËm›Ëw´by°}bùW,¸¯æX¾²ËgÚ7!–ïhÅò`û*Äò®Xp_ͱ|g¯XhۄX¾¢w,Ÿí± +±|‡+–ÜWs,ßÙ+–Ú6!–ïhÅò`û*Äò¾cùŒÕËwöŠå¶Mˆå;Z±<ؾ +±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–oð»X>âsbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷ÕËwöŠå¶Mˆå+zÇòÙ«Ëw¸byÀ}5Æò}‹åþº±|+–ÚW!–¯ðËg|¬æX¾³W,´mB,ßъåÁöUˆå;\±<ྚcùÊV,Ÿi߄X¾£˃í«Ëw¸byÀ}5Çò½by mbùŠÞ±|¶Ç*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù +ß±|ÆÇ*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù +ß±|ÆÇ*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù¿‹å#>W!–ïpÅò€û*Äò®Xp_…X¾ÃËî«ËWøŽå3>V!–ïpÅò€û*Äò®Xp_…X¾ÃËî«ËWøŽå3>V!–ïpÅò€û*Äò®Xp_…X>ÔÞm,Z±üý…R,nô›cùãëáåýt‚X~ºÅò‹åúۏýýO?þå?ÿéçfß~bÿŽzô¢÷Ó³y×}ÅÛîîëþº¡ûzp¡Ô}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûjð»î+âsº¯W÷¸¯B÷Õáê¾÷Uè¾:\Ýྠ+ÝW…ïî+ãc5w_½º/ mº¯ŽV÷¶¯B÷Õáê¾÷ÕÜ}U¶º¯Lû&t_­î l_…î«ÃÕ}ûêìÕ}m›Ð}Uôî¾²=V¡ûêpu_€ûjî¾:{u_@Û&t_­î l_…î«Âw÷•ñ±š»¯Î^Ýж ÝWG«ûÛW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_ ~×}E|®B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྚ»¯Î^Ýж ÝWEïî+Ûcº¯W÷¸¯Æî«£oÝÀ_¡ûê`u_@û*t_¾»¯ŒÕÜ}uö꾀¶Mè¾:ZÝؾ +ÝW‡«ûÜWs÷UÙê¾2í›Ð}u´º/°}º¯W÷¸¯æW÷´mB÷UÑ»ûÊöX…î«ÃÕ}î«Ð}u¸º/À}º¯W÷¸¯B÷Uá»ûÊøX…î«ÃÕ}î«Ð}u¸º/À}º¯W÷¸¯B÷Uá»ûÊøX…î«ÃÕ}î«Ð}u¸º/À}º¯W÷¸¯B÷ÕàwÝWÄç*t_®î p_…î«ÃÕ}î«Ð}u¸º/À}º¯ +ßÝWÆÇ*t_®î p_…î«ÃÕ}î«Ð}u¸º/À}º¯ +ßÝWÆÇ*t_®î p_…î«ÃÕ}î«Ð}…\©í¾àB«ûº¿Ðëçóî+Üè7w_/Çë¯÷/Ð}­S·îëíY÷õç?ýË ¿®ßþ%ÝYóI^^>_Ÿ…_»½Š×ÝíÕý}C{õàB©½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÁïÚ«ˆÏUh¯:\íྠ+íU‡«½ÜW¡½êpµW€û*´W¾Û«ŒÕÜ^uöj¯€¶Mh¯:Zíؾ +íU‡«½ÜWs{UÙj¯2í›Ð^u´Ú+°}Ú«W{¸¯æöª³W{´mB{UÑ»½ÊöX…öªÃÕ^½êìÕ^m›Ð^u´Ú+°}Ú« +ßíUÆÇjn¯:{µW@Û&´W­ö +l_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^5ø]{ñ¹ +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€ûjn¯:{µW@Û&´W½Û«lUh¯:\íà¾Û«Ž¾µW]„öªƒÕ^í«Ð^Uøn¯2>Vs{ÕÙ«½Ú6¡½êhµW`û*´W®ö +p_ÍíUe«½Ê´oB{ÕÑj¯ÀöUh¯:\íྚ۫Î^íж íUEïö*ÛcÚ«W{¸¯B{Õáj¯÷Uh¯:\íྠ+íU…ïö*ãcÚ«W{¸¯B{Õáj¯÷Uh¯:\íྠ+íU…ïö*ãcÚ«W{¸¯B{Õáj¯÷Uh¯:\íྠ+íUƒßµWŸ«Ð^u¸Ú+À}Ú«W{¸¯B{Õáj¯÷Uh¯*|·W«Ð^u¸Ú+À}Ú«W{¸¯B{Õáj¯÷Uh¯*|·W«Ð^u¸Ú+À}Ú«W{¸¯B{‹¡®½‚ ­öêþB——çíU¸Ñom¯^?>®¿Ç¾æöêvê¼Ú«÷íÕøYðãÇáóÛÓÑßüð][Ç÷ÓåYruºþs¾ûG¹ŸxðóáëܗkÎN?ooÇóà =Ào§÷Õ'øÛáx¹~-Uâ·ÓˆûêüãðözzkñÛiÄ}õ1~¾~:çsûØ×iÂÇêüúéœÎíc_§÷Õ'øõÓ9¾¶}FÜWŸà×OçårjñÛiÄ}õ1þz<¼|^ÚǾN>VŸàçÃåã­}ìë4â¾ú;¼¼¿·}FÜWŸà‡ËÛ{ýØo§÷ÕÇøåúé\®_Kuø:MøX}‚_?ë·Œ-~;¸¯>Á¯ŸÎù³}ìë4â¾ú¿½h²Ä×ë+ ÷ÕüúÊWB øXÍ u‰¯„šp_Í u‰¯„šp_Í u‰¯„šp_Í u‡+¡|¬æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÃ•P>VsB]â+¡&ÜWsB]â+¡&ÜWsB]â+¡&ÜWsBÝáJ¨«9¡.ñ•Pî«9¡.ñ•Pî«9¡.ñ•Pî«9¡®ðPg|®æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÃ•P>VcB]Ú·„šhÛÌ uI¯„šl_Í u‰¯„šp_ ug¯„hßÌ uI¯„šl_Í u‰¯„šp_ uißj¢m3'Ô­„챚ê_ 5á¾êÒ¾%ÔDÛfN¨Kz%ÔdûjN¨;\ 5àc5&Ô¥}K¨‰¶ÍœP—ôJ¨Éö՜P—øJ¨ ÷՜Pw¸jÀÇjN¨K|%ԄûjN¨K|%ԄûjN¨K|%ԄûjN¨;\ 5àc5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô®„ð±šê_ 5ᾚê_ 5ᾚê_ 5ᾚêWB øXÍ u‰¯„šp_Í u‰¯„šp_Í u‰¯„šp_Í u‡+¡|¬æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÂwBñ¹šê_ 5ᾚê_ 5ᾚê_ 5ᾚêWB øXÍ u‰¯„šp_Í u‰¯„šp_Í u‰¯„šp_Í u‡+¡|¬æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÃ•P>VsB]â+¡&ÜWsB]â+¡&ÜWcB]Ú·„šhÛÌ uG+¡{¬æ„ºÄWBM¸¯¦„º¤M¨ þº˜ê^ 5ѾšêWB øX uißj¢m3'Ô%½j²}5'Ô%¾jÂ}5&ԝ½j }3'Ô%½j²}5'Ô%¾jÂ}5&Ô¥}K¨‰¶ÍœPw´j°ÇjN¨K|%ԄûjN¨K|%ԄûjN¨K|%ԄûjN¨;\ 5àc5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô®„ð±šê_ 5ᾚê_ 5ᾚê_ 5ᾚê +ß uÆçjN¨K|%ԄûjN¨K|%ԄûjN¨K|%ԄûjN¨;\ 5àc5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô®„ð±šê_ 5ᾚê_ 5ᾚêT— 5]èvî˅.ǧ uºÑoN¨×W´9¡^§n õǗ„úÿþñÏ?|{y哔úòyx}y»û’üÁ…Žß~Ý?âÛ+ómwzuݐ^=¸PJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½jð»ô*âsÒ«Wz¸¯BzÕáJ¯÷UH¯:\éྠ+éU…ïô*ãc5§W½Ò+ mÒ«ŽVz¶¯BzÕáJ¯÷՜^U¶Ò«Lû&¤W­ô +l_…ôªÃ•^î«9½êì•^m›^UôN¯²=V!½êp¥W€ûjN¯:{¥W@Û&¤W­ô +l_…ôªÂwz•ñ±šÓ«Î^éж éUG+½ÛW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W ~—^E|®BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྚӫÎ^éж éUEïô*ÛcÒ«Wz¸¯Æôª£oéÀ_!½ê`¥W@û*¤W¾Ó«ŒÕœ^uöJ¯€¶MH¯:Zéؾ +éU‡+½ÜWszUÙJ¯2훐^u´Ò+°}Ò«Wz¸¯æôª³Wz´mBzUÑ;½ÊöX…ôªÃ•^^u¸Ò+À}Ò«Wz¸¯BzUá;½ÊøX…ôªÃ•^^u¸Ò+À}Ò«Wz¸¯BzUá;½ÊøX…ôªÃ•^^u¸Ò+À}Ò«Wz¸¯BzÕàwéUÄç*¤W®ô +p_…ôªÃ•^^u¸Ò+À}Ò« +ßéUÆÇ*¤W®ô +p_…ôªÃ•^^u¸Ò+À}Ò« +ßéUÆÇ*¤W®ô +p_…ôªÃ•^^…b¨M¯àB+½º¿Ðåô<½ +7úÍéÕõû§ÓÛõžœ^­S·ôês¤Wóݕ/‡·ÏÏ»¿õá㻼||< ®ŽÇÃé—e¯¸Ž}¹âüÁôãùzo_;?¸Îúvm_}‚¿]¿‚üöµs‡ßN#î«OðÃÛGKÿrᯋO^˜¹Þ(ZÁû=¥™«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZáû=¥«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZáû=¥«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZáû=¥«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZá;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,ßàw±|Äç*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù +ß±|ÆÇjŽå;{Åò@Û&Äò­Xl_…X¾ÃËî«9–¯lÅò™öMˆå;Z±<ؾ +±|‡+–ÜWs,ßÙ+–Ú6!–¯èËg{¬B,ßáŠå÷ÕËwöŠå¶Mˆå;Z±<ؾ +±|…ïX>ãc5Çò½by mbùŽV,¶¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆåü.–ø\…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}5Çò½by mbùŠÞ±|¶Ç*Äò®Xp_±|Gßby€¿.B,ßÁŠåöUˆå+|Çò«9–ïìËm›Ëw´by°}bùW,¸¯æX¾²ËgÚ7!–ïhÅò`û*Äò®Xp_ͱ|g¯XhۄX¾¢w,Ÿí± +±|‡+–ÜW!–ïpÅò€û*Äò®Xp_…X¾Âw,Ÿñ± +±|‡+–ÜW!–ïpÅò€û*Äò®Xp_…X¾Âw,Ÿñ± +±|‡+–ÜW!–ïpÅò€û*Äò®Xp_…X¾ÁïbùˆÏUˆå;\±<ྠ+±|‡+–ÜW!–ïpÅò€û*Äò¾cùŒUˆå;\±<ྠ+±|‡+–ÜW!–ïpÅò€û*Äò¾cùŒUˆå;\±<ྠ+±|‡+–ÜW!–µwËÅV,¡ˇýæXþõóú­úå±ü:õk,ý~ï>–ÿÏ?üíozð‚Òë§|>}ûÆ;c¾ ô|¾þšû¤—ßs¼æΘïï2æJ3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!cnð»Œ9âs2æWÆ ¸¯BÆÜáʘ÷UȘ;\3ྠ+s…ïŒ9ãc5g̝½2f m2æŽVÆ ¶¯BÆÜáʘ÷՜1W¶2æLû&dÌ­Œl_…Œ¹Ã•1î«9cîì•1m›1WôΘ³=V!cîpèûjΘ;{eÌ@Û&dÌ­Œl_…Œ¹ÂwƜñ±š3æÎ^3ж sG+cÛW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*dÌ ~—1G|®BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྚ3æÎ^3ж sEïŒ9Ûc2æWÆ ¸¯ÆŒ¹£o3À_!cî`eÌ@û*d̾3挏՜1wöʘ¶MȘ;Z3ؾ +s‡+cÜWsÆ\Ùʘ3훐1w´2f°}2æWÆ ¸¯æŒ¹³WÆ ´mBÆ\Ñ;cÎöX…Œ¹Ã•11w¸2fÀ}2æWÆ ¸¯BÆ\á;cÎøX…Œ¹Ã•11w¸2fÀ}2æWÆ ¸¯BÆ\á;cÎøX…Œ¹Ã•11w¸2fÀ}2æWÆ ¸¯BÆÜàwsÄç*dÌ®Œp_…Œ¹Ã•11w¸2fÀ}2æ +ßsÆÇ*dÌ®Œp_…Œ¹Ã•11w¸2fÀ}2æ +ßsÆÇ*dÌ®Œp_…Œ¹Ã•11‡·Í˜áB+c¾¿Ðåüá}ã™öMxßxGë}ã`û*¼o¼Ãõ¾qÀ}5¾o¼£oïøë"¼o¼‚÷ûÆ3=Vá}ã®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý¿ õ#>W!Ôïp…ú€û*„ú®Pp_…P¿Ãêî«êWøõ3>Vs¨ßÙ+ÔÚ6!Ôïh…ú`û*„ú®Pp_Í¡~e+ÔÏ´oB¨ßÑ +õÁöUõ;\¡>ྚCýÎ^¡>ж ¡~EïP?ÛcBýW¨¸¯æP¿³W¨´mB¨ßÑ +õÁöUõ+|‡ú«9Ôïìêm›êw´B}°}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨ßàw¡~Äç*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«9Ôïìêm›êWôõ³=V!Ôïp…ú€ûj õ;úêüuBýV¨´¯B¨_á;ÔÏøXÍ¡~g¯PhۄP¿£êƒí«êw¸B}À}5‡ú•­P?Ó¾ ¡~G+ÔÛW!Ôïp…ú€ûjõ;{…ú@Û&„ú½CýlUõ;\¡>ྠ+¡~‡+ÔÜW!Ôïp…ú€û*„ú¾CýŒUõ;\¡>ྠ+¡~‡+ÔÜW!Ôïp…ú€û*„ú¾CýŒUõ;\¡>ྠ+¡~‡+ÔÜW!Ôïp…ú€û*„ú ~êG|®B¨ßá +õ÷Uõ;\¡>ྠ+¡~‡+ÔÜW!Ô¯ðêg|¬B¨ßá +õ÷Uõ;\¡>ྠ+¡~‡+ÔÜW!Ô¯ðêg|¬B¨ßá +õ÷Uõ;\¡>ྠ+¡~(ÍÛP.´Býû ]^Ÿ‡úáF¿ù}ã§ëÿr< Ô_§n¡þék¨ÿç?ýËÿáçŸúÓýþôò»{í¿^æÇ·z»ãæÃüüx{–íïÞ/Þx÷~÷W½ßƒ ¥Þ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_ƒßõ~Ÿ«Ðûu¸z?À}z¿W︯Bï×áêý÷Uèý*|÷~«¹÷ëìÕûm›Ðûu´z?°}z¿W︯æÞ¯²ÕûeÚ7¡÷ëhõ~`û*ô~®Þp_ͽ_g¯Þhۄޯ¢wï—í± +½_‡«÷ÜWsï×Ù«÷Ú6¡÷ëhõ~`û*ô~¾{¿ŒÕÜûuöêý€¶Mèý:Z½ؾ +½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷kð»Þ/âsz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷ÕÜûuöêý€¶Mèý*z÷~Ù«Ðûu¸z?À}5ö~}ëýþº½_«÷ÚW¡÷«ðÝûe|¬æÞ¯³Wï´mBï×ÑêýÀöUèý:\½ྚ{¿ÊVï—i߄ޯ£Õûí«Ðûu¸z?À}5÷~½z? mz¿ŠÞ½_¶Ç*ô~®Þp_…Þ¯ÃÕûî«Ðûu¸z?À}z¿ +ß½_ÆÇ*ô~®Þp_…Þ¯ÃÕûî«Ðûu¸z?À}z¿ +ß½_ÆÇ*ô~®Þp_…Þ¯ÃÕûî«Ðûu¸z?À}z¿¿ëý">W¡÷ëpõ~€û*ô~®Þp_…Þ¯ÃÕûî«ÐûUøîý2>V¡÷ëpõ~€û*ô~®Þp_…Þ¯ÃÕûî«ÐûUøîý2>V¡÷ëpõ~€û*ô~®Þp_…Þ/&j]ïZ½ßý….—ç½_¸Ñoîý֟¸çÞoºõ~gèýþðýÇËïþý_g÷wý®åtùöËÜ;_×{ýæâéëzwo¾{ û«‡èÁ…R”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Áïz ˆÏUè:\=ྠ+=P‡«ÜW¡êpõ@€û*ô@¾{ ŒÕÜuöꁀ¶Mè:Z=ؾ +=P‡«ÜWsTÙê2í›Ðu´z °}z W¸¯æ¨³W´mBTÑ»ÊöX…¨ÃÕêìÕm›Ðu´z °}z  +ß=PÆÇjî:{õ@@Û&ô@­l_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«Ð5ø]ñ¹ +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€ûjî:{õ@@Û&ô@½{ lUè:\=à¾{ Ž¾õ@]„¨ƒÕí«ÐUøî2>VsÔÙ«Ú6¡êhõ@`û*ô@®p_Í=Pe«Ê´oBÔÑêÀöUè:\=ྚ{ Î^=ж =PEï(Ûcz W¸¯BÔáê÷Uè:\=ྠ+=P…ï(ãcz W¸¯BÔáê÷Uè:\=ྠ+=P…ï(ãcz W¸¯BÔáê÷Uè:\=ྠ+=Pƒßõ@Ÿ«Ðu¸z À}z W¸¯BÔáê÷Uè*|÷@«Ðu¸z À}z W¸¯BÔáê÷Uè*|÷@«Ðu¸z À}z W¸¯Bҕ¶‚ ­èþB© +7=Ð%÷@çëo6——ë×u±Ò©[ô:{ ßÿôã_þéÇ?þð·Gï|úxý8~wOù…N‡ãûùø´Z¯bÊ·Õ¹/×}þ*¦G +¯b"ÜWó«˜J|½Š‰p_ͯb*ñ•^î«9½êp¥W€Õœ^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^u¸Ò+ÀÇjN¯J|¥W„ûjN¯J|¥W„ûjN¯J|¥W„ûjN¯:\éàc5§W%¾Ò+Â}5§W%¾Ò+Â}5§W%¾Ò+Â}5§W¾Ó«ŒÏ՜^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^u¸Ò+ÀÇjL¯Jû–^m›9½*é•^‘í«9½*ñ•^î«1½êì•^í›9½*é•^‘í«9½*ñ•^î«1½*í[zE´mæôª£•^=VszUâ+½"ÜWczUÚ·ôŠhÛÌéUI¯ôŠl_ÍéU‡+½|¬Æôª´oéѶ™Ó«’^éÙ¾šÓ«_éᾚӫWzøXÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‡+½|¬æôªÄWzE¸¯æôªÄWzE¸¯æôªÄWzE¸¯æôªÃ•^>VszUâ+½"ÜWszUâ+½"ÜWszUâ+½"ÜWszÕáJ¯«9½*ñ•^î«9½*ñ•^î«9½*ñ•^î«9½êp¥W€Õœ^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^UøN¯2>WszUâ+½"ÜWszUâ+½"ÜWszUâ+½"ÜWszÕáJ¯«9½*ñ•^î«9½*ñ•^î«9½*ñ•^î«9½êp¥W€Õœ^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^u¸Ò+ÀÇjN¯J|¥W„ûjN¯J|¥W„ûjL¯Jû–^m›9½êh¥W`Õœ^•øJ¯÷Ք^•ô¯éÁ_szUÂ+½"ÚWszÕáJ¯«1½*í[zE´mæôª¤WzE¶¯æôªÄWzE¸¯Æôª³Wz´oæôª¤WzE¶¯æôªÄWzE¸¯Æôª´oéѶ™Ó«ŽVzöXÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‡+½|¬æôªÄWzE¸¯æôªÄWzE¸¯æôªÄWzE¸¯æôªÃ•^>VszUâ+½"ÜWszUâ+½"ÜWszUâ+½"ÜWszUá;½Êø\ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‡+½|¬æôªÄWzE¸¯æôªÄWzE¸¯æôªÄWzE¸¯æôªÃ•^>VszUâ+½"ÜWszUâ+½"ÜWsz•Š¡2½¢ ÝÎ}¹Ðåíiz•nô[_Åtþ¸¿\¿¢ÍéÕ:uK¯.3½ú?þú·Ÿÿù¯?ÿéŸþӏÍÏñú û·/Úï¸ù +¦Ïëo<Ïò+PñÆ»€º¿r( \(P€û*P® +p_…ªÂw•ñ± +T‡«€ÜW¡€êpP€û*P® +p_…ªÂw•ñ± +T‡«€ÜW¡€êpP€û*P® +p_…ªÂw•ñ± +T‡«€ÜW¡€êpP€û*P® +p_…ªÁï +¨ˆÏU( :\ྠ+T‡«€ÜW¡€êpP€û*P¾ ¨ŒÕ\@uö* €¶M( :Zؾ +T‡«€ÜWsUÙ* 2í›P@u´ +(°} +¨W¸¯æª³W´mBUÑ»€ÊöX…ªÃU@€êìU@m›P@u´ +(°} +¨ +ßTÆÇj. :{P@Û&P­ +l_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@5ø]õÿWv7˵^ivo¥š™~Îpš–l«áÂa•/ #Š’+,+’´u÷ȽæÚ{.ìwŒÓÿ8Ÿ/€d‡Äx÷ˆŸ«P@9<འ+”ÃS@Þ«P@9<འ+”Âw5ãÇ*POx¯BåðP€÷*POx¯B¥ð]@Íø± +”ÃS@Þ«P@9<འ+”ÃS@Þ«P@)|P3~¬BåðP€÷*POx¯Î”³WtmB¥è]@Íö± +”ÃS@Þ«cåèKðí"PNt¯B¥ð]@Íø±:PÎ^е ”£S@Ý«P@9<à½:PÊN5Ó½ ”£S@Ý«P@9<à½:PÎ^е ”¢w5ÛÇ*POx¯BåðP€÷*POx¯B¥ð]@Íø± +”ÃS@Þ«P@9<འ+”ÃS@Þ«P@)|P3~¬BåðP€÷*POx¯BåðP€÷*P¿* Fü\…Êá) ïU( ž +ð^…Êá) ïU( ¾ ¨?V¡€rx +(À{ +(‡§€¼W¡€rx +(À{ +(…ïjƏU( ž +ð^…Êá) ïU( †hÇPðB«€º~¡ïo÷ ¨á~º€z{zx}|ýÔzêR@½žÔñ«àOOÿüœ+á«èéåí^ôôôòðú㏟‹Ç—Ìs7oyþnúÓëÇÏqŸ?Á~ñB_à—§ïÕ;øûÃçÄsôÏ"|»ø5ûüôðôöø*áõ4ÑÇêüãûòúd¿àëiÄ{õþñ}ùþôÃ◧ïÕ;øÇ÷æÛ³þ²_žF¼W¿Æ_>¾;//ö˾ž&üX½ƒ|wž_ì—}=x¯ÞÁ?¾;Oßì—}=x¯ÞÁ?¾;ßŸ-~yñ^ýÿöôðøã»ý²¯§ ?Vïà/ßß_í—}=x¯ÞÁ_ßÞì—}=x¯ÞÁß¾¿¾é/ûåiÄ{õküûÇwçûçÏ® +_O~¬ÞÁ?¾;ß~Ø/ûzñ^½ƒ|w^~Ø/ûzñ^½ƒ|w^õ—ýò4â½z§^¯©ðý¡3~¬Â‡v:<É:འ+ɺÓ¬Þ«¬;<É:འ+ɺÂw²>ãÇ*$ëO²x¯B²îð$ë€÷*$ëO²x¯B²®ð¬Ïø± +ɺÓ¬Þ«¬;<É:འ+ɺÓ¬Þ«¬+|'ë3~¬B²îð$ë€÷*$ëO²x¯B²îð$ë€÷*$ë¿JÖGü\…dÝáIÖïUHÖždð^…dÝáIÖïUHÖ¾“õ?VçdÝÙ+Yº6!Ywt’u°{’u‡'Y¼Wçd]ÙIÖgº7!Ywt’u°{’u‡'Y¼WçdÝÙ+Yº6!YWôNÖgûX…dÝáIÖïÕ9YwöJց®MH֝dì^…d]á;YŸñcuN֝½’u k’uG'Y»W!Ywx’uÀ{’u…ïd}ƏUHÖždð^…dÝáIÖïUHÖždð^…d]á;YŸñc’u‡'Y¼W!Ywx’uÀ{’u‡'Y¼W!YWøNÖgüX…dÝáIÖïUHÖždð^…dÝáIÖïUHÖ¾“õ?V!Ywx’uÀ{’u‡'Y¼W!Ywx’uÀ{’u…ïd}ƏUHÖždð^…dÝáIÖïUHÖždð^…dÝàWÉúˆŸ«¬;<É:འ+ɺÓ¬Þ«¬;<É:འ+ɺÂw²>ãÇ*$ëO²x¯B²îð$ë€÷*$ëO²x¯B²®ð¬Ïø± +ɺÓ¬Þ«¬;<É:འ+ɺÓ¬Þ«¬+|'ë3~¬B²îð$ë€÷*$ëO²x¯Îɺ³W²tmB²®è¬Ïö± +ɺÓ¬Þ«c²îèK²ðí"$ëN²t¯B²®ð¬Ïø±:'ëÎ^É:е ɺ£“¬ƒÝ«¬;<É:à½:'ëÊN²>Ó½ ɺ£“¬ƒÝ«¬;<É:à½:'ëÎ^É:е ɺ¢w²>ÛÇ*$ëO²x¯B²îð$ë€÷*$ëO²x¯B²®ð¬Ïø± +ɺÓ¬Þ«¬;<É:འ+ɺÓ¬Þ«¬+|'ë3~¬B²îð$ë€÷*$ëO²x¯B²îð$ë€÷*$ë¿JÖGü\…dÝáIÖïUHÖždð^…dÝáIÖïUHÖ¾“õ?V!Ywx’uÀ{’u‡'Y¼W!Ywx’uÀ{’u…ïd}ƏUHÖždð^…dÝáIÖïUHևäÚ&ëðB+Y¿~¡ïï÷“õፎdý;$ëßß?þ1KÅúå¡K°þv ÖÿÃ/¿ÿ/ÿôOÿå·ß~ùí«Xúùñó_è·x~øöù~w‚õ0O¯¸ æ«wæóm¦~y–kêe%'^žåڄtÙÈ»\åބnYÉɖg¹6!ZVršåY®M(–•œ`y–kre#ïZy”{Ze%'UžåڄPYÉé”g¹6¡RVr"åY®MH”¼ åQîM蓕œ}¢wÚÚÝŽ/»Äë· +Ä/^hJgüX…Ñá©ïUèžð^…ÑáiïU¨¾sÄ?V!HtxŠDÀ{šD‡'J¼W!KtxºDÀ{ÊD…ï4qƏUˆž:ð^…>Ñá ïUHžFð^…JQá;SœñcBE‡§T¼W¡UtxbEÀ{rE‡§W¼W¡XTøNgüX…hÑá©ïUèžpð^…tÑáiïU¨¾óÅ?V!`tx +FÀ{F‡'b¼W!ctx:FÀ{JFƒ_¥Œ#~®BÌèðԌ€÷*ôŒOÐx¯BÒèð4€÷*T +ßY㌫sØèìU6]›Ð6::q#ؽ +y£ÃÓ7Þ«sá¨ì$Ž3ݛ9::•#ؽ +£Ã:Þ«sêèìÕ:]›P;*z玳}¬Bðèð€÷êÜ<:{E@×&dŽN÷v¯Bù¨ð>Îø±:ǏÎ^õ#е ý££@‚Ý«@:< $འ+¤Âw9ãÇ*„O x¯B éðЀ÷*äO x¯B©ðDÎø± +Q¤ÃSEÞ«ÐE:¼ûø¹nN¨×S—„úi'ÔÿÛÿëÓ÷¿üò/¿Ÿ õÇÿ§=ÿñ»¬WÆÙP{ÿö~¯¡~|ÿ°þø3Áøšyîæ=ÏßNzzxþü _¼Ïi_&º7ïÈ/¯?>twôåi´{õþúñ쏋_žF¼Wïàï¯úKþdzß.މÆWU¯àÝêÏô± +­¾ÃÓêÞ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê+|·ú3~¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷*´úO«x¯B«¯ðÝêÏø± +­¾ÃÓêÞ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê+|·ú3~¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷*´úO«x¯B«oð«VÄÏUhõžVð^…VßáiõïUhõžVð^…V_á»ÕŸñcunõ½Z} kZ}G§Õ»W¡ÕwxZ}À{unõ•V¦{Z}G§Õ»W¡ÕwxZ}À{unõ½Z} kZ}EïV¶UhõžVð^[}g¯VèڄVßÑiõÁîUhõ¾[ý?VçVßÙ«Õº6¡ÕwtZ}°{Z}‡§Õ¼W¡ÕWønõgüX…VßáiõïUhõžVð^…VßáiõïUhõ¾[ý?V¡ÕwxZ}À{Z}‡§Õ¼W¡ÕwxZ}À{Z}…ïVƏUhõžVð^…VßáiõïUhõžVð^…V_á»ÕŸñcZ}‡§Õ¼W¡ÕwxZ}À{Z}‡§Õ¼W¡ÕWønõgüX…VßáiõïUhõžVð^…VßáiõïUhõ ~Õêø¹ +­¾ÃÓêÞ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê+|·ú3~¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷êÜê;{µú@×&´úŠÞ­þl«Ðê;<­>à½:¶úŽ¾´úß.B«ïà´ú@÷*´ú +ß­þŒ«s«ïìÕê]›Ðê;:­>ؽ +­¾ÃÓêÞ«s«¯ì´ú3ݛÐê;:­>ؽ +­¾ÃÓêÞ«s«ïìÕê]›Ðê+z·ú³}¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷*´úO«x¯B«oð«VÄÏUhõžVð^…VßáiõïUhõžVð^…V_á»ÕŸñcZ}‡§Õ¼W¡ÕwxZ}À{Z}‡§Õ¼W¡ÕWønõgüX…VßáiõïUhõžVð^…V(Ím«/´Zýëz}½ßêoô³­þço•¿ÿøø‰vlõóÔ¥ÕÞ­þÿñ×çïùå³×ÿ·/jýLJ——¿½®•ókøããoÁ»µþÓÃÇ?^èEóÜ͛ž¿Ÿþøòðöòúåû|aÿù0ÒµyG~}x~~}³ôåi´{õ~¹e ñu!ð^/$8{]Hº7ç ’^ÈîÕùB‚ÄׅÂ{uº é?/$|»8_Hpp.$}¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_HPø¾0ãçê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇêx!Aڗ D×æ|!AÒëBÙ½:_Høº@x¯Žœ½.$ݛó…I¯ d÷ê|!AâëBá½:^HöåBѵ9_Hpt.$€}¬Î$¾.$Þ«ã…i_.$]›ó…I¯ d÷ê|!ÁṐø±:^HöåBѵ9_Hôº@v¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó……ï 3~®Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷êx!Aڗ D×æ|!Áѹö±:_Høº@x¯N$ýç…‚oç ^ˆîÕùB‚Ãs!ðcu¼ í˅¢ks¾ éu!ì^/$H|]H ¼WÇ Î^€îÍùB‚¤×…²{u¾ ñu!ð^/$Hûr!èڜ/$8:À>Vç _ïÕùB‚ÄׅÂ{u¾ ñu!ð^/$8<?Vç _ïÕùB‚ÄׅÂ{u¾ ñu!ð^/$8<?Vç _ïÕùB‚ÄׅÂ{u¾ ñu!ð^/$(|_H˜ñsu¾ ñu!ð^/$H|]H ¼Wç _ïÕùB‚Ãs!ðcu¾ ñu!ð^/$H|]H ¼Wç _ïÕùB‚Ãs!ðcu¾ ñu!ð^/$H|]H ¼Wç sݯ.$Ð ]ž»y¡×÷»¦7:.$|‡ f ßàBÂzêr!áåË ÿø×÷Ç¿üÛ¿þr^JøüÛÓç¿è¼Òúžž>þn¸w)a×Ôã ïšúú‡šú‹šjjÀ{jj‡§¦¼W¡¦vxjjÀ{jj…ïšzƏU¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^…šÚá©©ïU¨©¾kê?V¡¦vxjjÀ{jj‡§¦¼W¡¦vxjjÀ{jj…ïšzƏU¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^…šÚá©©ïU¨© ~USø¹ +5µÃSSÞ«PS;<55འ+5µÃSSÞ«PS+|×Ô3~¬Î5µ³WM tmBMíèÔÔ`÷*ÔÔOM x¯Î5µ²SSÏtoBMíèÔÔ`÷*ÔÔOM x¯Î5µ³WM tmBM­è]SÏö± +5µÃSSÞ«sMíìUS]›PS;:55ؽ +5µÂwM=ãÇê\S;{ÕÔ@×&ÔԎNM v¯BMíðÔԀ÷*ÔÔ +ß5õŒ«PS;<55འ+5µÃSSÞ«PS;<55འ+5µÂwM=ãÇ*ÔÔOM x¯BMíðÔԀ÷*ÔÔOM x¯BM­ð]SÏø± +5µÃSSÞ«PS;<55འ+5µÃSSÞ«PS+|×Ô3~¬BMíðÔԀ÷*ÔÔOM x¯BMíðÔԀ÷*ÔÔ +ß5õŒ«PS;<55འ+5µÃSSÞ«PS;<55འ+5µÁ¯jê?W¡¦vxjjÀ{jj‡§¦¼W¡¦vxjjÀ{jj…ïšzƏU¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^kjg¯šèڄšZÑ»¦žícjj‡§¦¼WǚÚїšàÛE¨©œšè^…šZỦžñcu®©½jj kjjG§¦»W¡¦vxjjÀ{u®©•šz¦{jjG§¦»W¡¦vxjjÀ{u®©½jj kjjEïšz¶U¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^…šÚá©©ïU¨© ~USø¹ +5µÃSSÞ«PS;<55འ+5µÃSSÞ«PS+|×Ô3~¬BMíðÔԀ÷*ÔÔOM x¯BMíðÔԀ÷*ÔÔ +ß5õŒ«PS;<55འ+5µÃSSÞ«PS°­©á…VM}ýBo÷kêá~úóæ?þñãÇwˆ©/]Zêo»¥þ¿üöÛßþëýôÓûÿ«¾çûžžÞ>¬§§ÜñôÕíôù6S:=˵ ᴒÓMÏrmB5­äDÓ³\›LyӣܛÐK+9¹ô,×&ÄÒJN+=˵ ¥´’JÏrmB&mä]IroB#­ä$Ò³\›H+9}ô,×&ÔÑJN=˵ i´‘w=ʽ ]´’“EÏrmB­ä4ѳ\›PD+9Aô,×&äÐFÞ5ô(÷&´ÐJN +=˵ !´’ÓAÏrmB­äDг\›@yУܛÐ?+9ùó,×&ÄÏJNû<˵ 峒>ÏrmBölä]=roBó¬ä$ϳ\›<+9½ó,×&ÔÎJNì<˵ ©³‘wé<ʽ ³’“9ÏrmBä¬ä4γ\›P8+9ó,×&äÍB¾ª›'ù؄¶YÉI›g¹6!lVrºæY®M¨š•œ¨y–k’f#ï¢y”{sræÙ½]„˜Y¹i™g¸6¡dVrBæY®Í9c6p*æÑ­Eh˜•›„y†kf%§_žåڜëe¯xyvo!]6î.—G¸7¡[Vr²åY®Í9ZVðj–g÷vŠeå&Xžáڄ\ÙÈ»Våޜ[e¯Tyvo!TVn:å®M¨”•œHy–ke#ïBy”{úd%'Ožåڄ8YÉi“g¹6¡LVrÂäY®MȒ¼«äQîMh’•œ$y–k‚d%§GžåڄYɉ‘g¹6!E6ò.‘G¹7¡CVr2äY®Mˆ•œy–k +d%'@žåڄüØÈ»>åބöXÉIg¹6!~{y…”w=uiy¿ï–÷?ýòûÿøëÓã_~ýûÿûùýÿùõŸÎª÷ۏ‡÷ŸÿFùÊúâS‘__¿Ýëzw6¾îÄ®ßw(ľx¡)¼W!sx*1À{:1‡'¼W!SønÅfüX…ZÌáÉÅïUÆžb ð^…fÌá‰ÆïUÈƾ»±?V¡sxÒ1À{â1‡§¼W¡sx2À{2…ï†lƏU¨ÈžŒ ð^…Ìá)ÉïUhÉž˜ ð^…œLá»'›ñcŠ2‡')¼W!*sxª2À{º2‡',¼W!-3øU[6âç*ÔeO^x¯B`æðf€÷*4fOdx¯Bf¦ðݙÍø±:—fÎ^©е ±™£S›Ý«Ð›9<Áà½:'gÊNs6Ó½ ՙ£“Ý«ž9<åà½:·gÎ^ñе ù™¢w6ÛÇ*hO‚x¯Îš³W…tmB‡æè„h`÷*¤h +ß-ڌ«sæ앣]›¤9:Eؽ +MšÃ¥Þ«¥)|wi3~¬B™æð¤i€÷*ÄiOx¯BŸæðj€÷*$j +ߍڌ«P©9<™འ+¡šÃSªޫЪ9<±འ+¹šÂw¯6ãÇ*kO²x¯B´æðTk€÷*tkO¸x¯Bº¦ðÝ®Íø± +õšÃ“¯Þ«°9<འ+ ›Ã±Þ«±)|wl3~¬BÉæð¤l€÷*ÄlOÍx¯BÏæðm€÷*$m¿jÚFü\…ªÍáÉÚïUÛž² ð^…¶Íá‰ÛïUÈÛ¾û¶?V¡psx7À{"7‡§r¼W¡ssxB7À{R7…ïÖmƏU¨ÝžÜ ð^…àÍá)ÞïUhÞžè ð^…ìMá»{›ñcÊ7‡'}¼W!~sxê7À{uîߜ½8 k8Eïn¶U¨àž ð^C8G_J8€o¡…spb8 {r8…ïnƏչˆsöJ‮Mˆâ*ì^….Îá ãïÕ9SvÚ¸™îM¨ã<ì^…@Îá)äïÕ¹‘söŠä€®MÈä½;¹Ù>V¡”sxR9À{b9‡§–¼W¡—sx‚9À{’9…ïfnƏU¨æžlð^…pÎá)çïUhçžxð^…|Nở›ñc +:‡'¡¼W!¢sx*:À{::‡'¤¼W!¥3øUK7âç*ÔtONx¯BPçðu€÷*4uOTx¯BV§ðÝÕÍø± +eÃ“ÖÞ«×9õï‹š>öoƏUøà?‡ç“ÿïUøì?‡çÃÿïUøø?‡çóÿïUø@…ïÄsƏUH<žÄð^…ÄÓáI<ïUH<žÄð^…ÄSá;ñœñcO‡'ñ¼W!ñtxOÀ{O‡'ñ¼W!ñTøNV!ñtxOÀ{uL<}I<¾]„ÄÓÁI<îUH<¾Ï?VçÄÓÙ+ñº6!ñttO°{O‡'ñ¼WçÄSÙIV¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°4øUa9âç*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Ba9–®°„Z…åõ ½}¿_XoôӅåãËÇÏò?Ñ΅åŸO½¯ÂòÇmayf•ÿ_úöô~õ~ùÅûþøñ·Þ¬òñõáùù™w5ñÅçn^ñüÅôÇ÷úüSÃ/ô~yñ^ýzzxþüʾVáF€Ãs#ð^o8úr#àÛE¸ààܺWáF€Â÷€?VçÎ^7€®M¸àèÜ»WáF€Ãs#ð^o(;7fº7áF€£s#ì^…ύÀ{u¾àìu#èڄŠÞ7fûX…ύÀ{n8<7ïU¸àðܼWáF€Â÷€?VáF€Ãs#ð^…ύÀ{n8<7ïU¸ ð}#`ƏU¸àðܼWáF€Ãs#ð^…ύÀ{nüêFÀˆŸ«p#Àá¹x¯Â‡çFའ+7ž€÷*ÜPø¾0ãÇ*ÜpxnÞ«p#Àá¹x¯Â‡çFའ+7¾oÌø± +7ž€÷*ÜpxnÞ«p#`ÌÜݍx¡u#àú…ÞÞïßÞègo<}ü3þùýõÛ|# Oýy#àãgÁÜø?ÿýÿýʼn€Ï éãñëõók÷üùk÷N¼<¼}þ†Óü~뱛÷ûâ@ÀåŽÀW¯3\' »Wçë_× ïÕñ:³×u {s¾N éu€ì^¯H|]' ¼W§ë’þó:Á·‹óuç:ÐÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu…ïë3~®Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Ž× ¤}¹N@tmÎ× $½®Ý«óu‰¯ë„÷êxÀÙë:н9_'ôºN@v¯Î× $¾®Þ«ãui_®]›óuGç:ØÇê|@âë:á½:^'öå:ѵ9_'ôºN@v¯Î× žë€«ãui_®]›óuI¯ëd÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'Pø¾N0ãçê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Ž× ¤}¹N@tmÎ× ë`«óu‰¯ë„÷êt@Ò^' øvq¾N áu€è^¯8<× ?VÇëÒ¾\' º6çë’^× ÈîÕù:Ä×uÂ{u¼Nàìuèޜ¯Hz]' »Wçë_× ïÕñ:´/× ˆ®Íù:£sìcu¾N ñu€ð^¯H|]' ¼Wçë_× ïÕù:Ãsðcu¾N ñu€ð^¯H|]' ¼Wçë_× ïÕù:Ãsðcu¾N ñu€ð^¯H|]' ¼Wçë_× ïÕù:Â÷u‚?Wçë_× ïÕù:Ä×uÂ{u¾N ñu€ð^¯8<× ?Vçë_× ïÕù:Ä×uÂ{u¾N ñu€ð^¯8<× ?Vçë_× ïÕù:Ä×uÂ{u¾N0öê:½Ð幛zº{`z£Ÿ¾NðñCåËËw8Npyèr›àéê6Á/¿üýýÛïûª{ûümνß/ñôðãó—“îœ'XÝöô~+Û¾z½¡Ú>ßdŠ¶G·7!ÙVrŠíY®M赕œ\{–kbm%§ÕžåڄRÛÈ;ÔåބL[É©´g¹6¡ÑVríY®M´•œ>{–kêl#ï8{”{Òl%§Ìžåڄ.[Éɲg¹6!ÊVršìY®M(²¼ƒìQîMȱ•œ{–kZl%'Şåڄ[Éé°g¹6¡Â6òŽ°G¹7!ÁVr +ìY®M试œüz–kâk%§½žåڄòÚÈ;¼åބìZÉ©®g¹6¡¹Vr’ëY®M®•œÞz–kjk#ïØz”{Rk%§´žåڄÎZÉɬg¹6!²VrëY®M(¬¼ëQîMÈ«•œºz–kÚj%'­žåڄ°ZÉéªg¹6¡ªòUT=ÉÇ&$ÕJNQ=˵ =µ’“SÏrmBL­ä´Ô³\›PRy‡Ô£Ü›sF­àUQÏîí"4ÔÊMB=õ µ’ÓOÏrmÎõ´On-B:­Ü”Ó3\›ÐM+9Ùô,×æM+x5Ó³{»Å´qw0=½ ¹´’SKÏrmέ´‚W*=»·‹J+7ô ×&TÒFޑô(÷æœH+xÒ³{»}´r“GÏpmB­ä´Ñ³\›PFy‡Ñ£Ü›E+9Uô,×&4ÑJN=˵ A´’ÓCÏrmB mäCroB +­ä”г\›ÐA+9ô,×&DÐJN=˵ ´‘w=ʽ ù³’S?ÏrmBû¬ä¤Ï³\›>+9Ýó,×&TÏFÞÑó(÷&$ÏJNñ<˵ ½³’“;ÏrmBì¬ä´Î³\›P:y‡Î£Ü›9+9•ó,×&4ÎJNâ<˵ ³’Ó7ÏrmBÝ,䫸y’MH›•œ²y–kºf%'kžåڄ¨YÉišg¹6¡h6òšG¹7!gVrjæY®Mh™•œ”y–kBf%§cžåڄŠÙÈ;båބ„YÉ)˜g¹6¡_VròåY®Mˆ—•œvy–kÊe#ïpy”{²e%§ZžåڄfYÉI–g¹6ç`YÁ«WžÝÛE¨•»cåîMH••œRy–ks씕{ɔgõf"e¥¦QžÝڄBÙÈ;Påޜód¯:yvo¡MVnÒä®M“•œ.y–ks®’ œ(ytk’då¦HžáڄYÉɑg¹6çYÁ«EžÝÛE(‘»CäîMȐ•œ +y–kd%'AžåڄYÉég¹6¡>6òŽG¹7!=VrÊãY®M莕œìx–k¢c%§9žåڄâØÈ;8åބÜXÉ©g¹6¡5VrRãY®M•œÎx–k*c!_EƓ|lBb¬äƳ\›Ð+9yñ,×&ÄÅJN[<˵ e±‘wX<ʽ Y±’SÏrmBS¬ä$ų\›+9=ñ,×&ÔÄFÞ1ñ(÷&¤ÄJNI<˵ ±’“ÏrmBD|?ƒµ ñü6+!¾z›÷o÷ âû¯óÓñ뷇—÷—W(ˆÿ|* ñómBüŸþöÿýòU¸ûöýóüÖ_ûÓ ñnj¯&¦¨öú-‡ªö‹š²ZÀ{ÂZ‡§¬¼W¡­UøŽkgüX…¼ÖáékïU(lžÄð^…ÈÖá©lïUèl¾CÛ?V!µuxZ[À{j[‡'·¼W!¸uxŠ[À{š[…ïèvƏUÈnžîð^…òÖáIoïUˆožúð^…þVá;Àñc\‡§Á¼W¡Âux2\À{B\‡§Ä¼W¡ÅUøŽqgüX…×áéqïU(rž$ð^…(×á©rïUèr¾ÃÜ?V!ÍuxÚ\À{ê\‡'ϼW!Ðux +]À{]…ïHwƏUÈtžNð^…R×áIuïUˆužZð^…^×àWÁ«ì:<Í.འ+ծÓíÞ«î:<å.འ+í®Âw¼;ãÇêœï:{õ»@×&¼ŽN v¯BÄëðT¼€÷êÜñ*;!ïL÷&¤¼ŽNË v¯BÍëð伀÷êô:{½@×&4½ŠÞQïl«õ:<]/à½:—½Î^i/е q¯£S÷‚Ý«Ð÷*|¾3~¬Î‰¯³Wã tmBåëèd¾`÷*„¾Oé x¯Bë«ðûÎø± +¹¯ÃÓûÞ«Pü:<É/འ+ѯÃSýÞ«Ðý*|‡¿3~¬Búë𴿀÷*Ô¿Oþ x¯BìðÀ€÷*4À +ßðŒ«;<0འ+%°Ã“Þ«;<50འ+=°Âw<ãÇ*$ÁO x¯BìðdÁ€÷*„ÁO x¯B¬ðÏø± +y°ÃÓÞ«P;<‰0འ+‘°ÃS Þ«Ð ü*ñsRa‡§¼W¡vxraÀ{‚a‡§¼W¡VøŽ†güX…lØáé†ïU(‡žtð^…xØᩇïU臾â?V!!vxbÀ{*b‡'#¼W!$vxJbÀ{Zb…ï˜xƏUȉžžð^…¢ØáIŠïÕ9*vöªŠ®M芽ÃâÙ>V!-vxÚbÀ{u¬‹}ɋ¾]„ÀØÁ)ŒîUhŒ¾#ã?VçÌØÙ«3º6¡4vtRc°{bc‡§6¼WçÞXÙ Žgº7!9vtšc°{ªc‡';¼WçðØÙ«<º6¡=VôŽgûX…üØáéïU(žð^…ÙᩐïU萾Cä?V!EvxZdÀ{jd‡'G¼W!HvxŠdÀ{šd…ï(yƏUȒž.ð^…2ÙáI“ïUˆ“ž:ð^…>ÙàWòˆŸ«(;<2འ+•²Ã“)Þ«*;<¥2འ+­²Âw¬<ãÇ*äÊO¯ x¯B±ìð$ˀ÷*DËOµ x¯B·¬ð.Ïø± +é²ÃÓ.Þ«P/;<ù2འ+óáڂ^h%Ì×/ôþý~Ã<¼ÑOGÌߟ>þA÷ózê1¿ÜFÌ¿¿þøôðþG]{5Ìï?^¾Ý+˜_Þþø§ñ×c7/xþZúãëÃóóç¿ñûâu¾ /O£Ý«wð÷‡·§Ï?°8üò4â½ú5þôôðüùßS”}y˜èÞ¼#¿<¼þxµôåi´{õþúñ3ûû5_O#Þ«wð??›Ûїûøv>î[Áûó¾gúX…OüvxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'0øÕy‚?Wá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏÕù<³×y kÎ8:ç ÀîU8Oàðœ'¼WçóÊÎy‚™îM8Oàèœ'»Wá<Ãsžð^Ï8{'º6á<¢÷y‚Ù>Vá<Ãsžð^Ï8{'º6á<£sžì^…ó +ßç füXÏ8{'º6á<£sžì^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó¿:O0âç*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<à½:Ÿ'pö:OtmÂyEïó³}¬Ây‡ç<à½:ž'pôå<À·‹pžÀÁ9Ot¯Ây…ïó3~¬Îç œ½Î]›pžÀÑ9Ov¯Ây‡ç<à½:Ÿ'PvÎÌtoÂyGç<ؽ +ç žó€÷ê|žÀÙë<е ç ½ÏÌö± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'0øÕy‚?Wá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<ÁPØÛóðBë<Áõ Mç †7úéó/ï?Û½Áy‚õÔå<Á·ëóÿí×ùíË.þûÛÕ_úÅkÓÇ*ëO±x¯B±îðë€÷*ëO±x¯B±®ð]¬Ïø± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«P¬;<Å:འ+źÂw±>ãÇ*ëO±x¯B±îðë€÷*ëO±x¯B±®ð]¬Ïø± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«P¬;<Å:འ+źÁ¯Šõ?W¡XwxŠuÀ{Šu‡§X¼W¡XwxŠuÀ{Šu…ïb}ƏչXwö*ց®M(֝bì^…bÝá)ÖïÕ¹XWvŠõ™îM(֝bì^…bÝá)ÖïÕ¹Xwö*ց®M(Ö½‹õÙ>V¡XwxŠuÀ{u.֝½Šu kŠuG§X»W¡XWø.ÖgüX‹ug¯bèڄbÝÑ)ÖÁîU(Öžbð^…b]á»XŸñcŠu‡§X¼W¡XwxŠuÀ{Šu‡§X¼W¡XWø.ÖgüX…bÝá)ÖïU(Öžbð^…bÝá)ÖïU(Ö¾‹õ?V¡XwxŠuÀ{Šu‡§X¼W¡XwxŠuÀ{Šu…ïb}ƏU(Öžbð^…bÝá)ÖïU(Öžbð^…b]á»XŸñcŠu‡§X¼W¡XwxŠuÀ{Šu‡§X¼W¡X7øU±>âç*ëO±x¯B±îðë€÷*ëO±x¯B±®ð]¬Ïø± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«s±îìU¬]›P¬+zë³}¬B±îðë€÷êX¬;úR¬|»źƒS¬Ý«P¬+|ë3~¬Îź³W±tmB±îèë`÷*ëO±x¯Îź²S¬ÏtoB±îèë`÷*ëO±x¯Îź³W±tmB±®è]¬Ïö± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«P¬;<Å:འ+źÁ¯Šõ?W¡XwxŠuÀ{Šu‡§X¼W¡XwxŠuÀ{Šu…ïb}ƏU(Öžbð^…bÝá)ÖïU(Öžbð^…b]á»XŸñcŠu‡§X¼W¡XwxŠuÀ{Šõ!¹¶Å:¼Ð*Ö¯_èýí~±>¼ÑOë_ïÏ?×ÍÅúzêR¬ßÅúÿõëûåìÕ?ÿóÉ÷ÏßÒ¿š?¿xooo¯÷zõǗ‡·?~Åi|ÁõØÍ ~ñ™ö¯ÏϟÿÆï‹×ù‚¾<v¯ÞÁßޞ>ÿÀâðËӈ÷êTþéáùó¿§(ûò0ѽyG^‡ó`÷*œ'pxÎÞ«ãyG_Î|»ç ¼ÏÌô± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ~už`ÄÏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcu>OàìužèڄóŽÎy°{Î8<ç ïÕù<²sž`¦{Î8:ç ÀîU8Oàðœ'¼WçóÎ^ç €®M8O è}ž`¶U8Oàðœ'¼WçóÎ^ç €®M8Oàèœ'»Wá<Â÷y‚?VçóÎ^ç €®M8Oàèœ'»Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Á¯ÎŒø¹ +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Îç œ½Î]›pž@Ñû<Ál«pžÀá9Ox¯Žç }9Oðí"œ'ppÎÝ«pž@áû<ÁŒ«óyg¯ó@×&œ'pt΀ݫpžÀá9Ox¯Îç ”ó3ݛpžÀÑ9Ov¯Ây‡ç<à½:Ÿ'pö:OtmÂyEïó³}¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ~už`ÄÏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8O0öî<¼Ð:OpýB?žîŸ'Þè8Oðά¿ýæóë©Ëy‚×}žà?ÿòÛoÿü뿜öãÇ«?®þÒ{_¾÷{ +ˏ¯˜Xþú‡Xþ‹×™by°{by‡'–¼WÇXÞїXàÛEˆå¼cù™>V!–wxbyÀ{by‡'–¼W!–wxbyÀ{by…ïX~ƏUˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^…XÞá‰åïUˆå¾cù?V!–wxbyÀ{by‡'–¼W!–wxbyÀ{by…ïX~ƏUˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^…XÞá‰åïUˆå ~ˏø¹ +±¼ÃËÞ«Ë;<±<འ+±¼ÃËÞ«Ë+|Çò3~¬Î±¼³W,tmB,ïèÄò`÷*ÄòO,x¯Î±¼²ËÏtoB,ïèÄò`÷*ÄòO,x¯Î±¼³W,tmB,¯èËÏö± +±¼ÃËÞ«s,ïìË]›Ë;:±<ؽ +±¼Âw,?ãÇêË;{Åò@×&ÄòŽN,v¯B,ïðÄò€÷*Äò +ß±üŒ«Ë;<±<འ+±¼ÃËÞ«Ë;<±<འ+±¼Âw,?ãÇ*ÄòO,x¯B,ïðÄò€÷*ÄòO,x¯B,¯ðËÏø± +±¼ÃËÞ«Ë;<±<འ+±¼ÃËÞ«Ë+|Çò3~¬B,ïðÄò€÷*ÄòO,x¯B,ïðÄò€÷*Äò +ß±üŒ«Ë;<±<འ+±¼ÃËÞ«Ë;<±<འ+±¼Á¯bù?W!–wxbyÀ{by‡'–¼W!–wxbyÀ{by…ïX~ƏUˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^cyg¯XèڄX^Ñ;–Ÿícby‡'–¼WÇXÞїXàÛEˆåœXè^…X^á;–ŸñcuŽå½by kbyG'–»W!–wxbyÀ{uŽå•X~¦{byG'–»W!–wxbyÀ{uŽå½by kbyEïX~¶UˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^…XÞá‰åïUˆå ~ˏø¹ +±¼ÃËÞ«Ë;<±<འ+±¼ÃËÞ«Ë+|Çò3~¬B,ïðÄò€÷*ÄòO,x¯B,ïðÄò€÷*Äò +ß±üŒ«Ë;<±<འ+±¼ÃËÞ«ËSí-byx¡Ë_¿Ðçû±üðFG,ÿmŽåüxøxos+¿º¤òoW©ü?ÿþËoý¢OŸÏ{|û‡«ñ~ƒ§‡×Ǐ?¾ÜéäŸ>þô¯—Ç®ßïüôǗ‡·—ׯ^æ øÏgɽ]¼Ã¾>> Üܘáޜ/8y¹6dz¾\÷vq¾9àÜuràڜ(9÷f¹7Çk¾÷vq>5àÜuiàڜï 8y¹6ç#J΍YîÍù€“ׁks>/àäu]äڜo 8y¹6çÃJÎ]YîÍùª€“×Qks>)àäuQäڜï 8y¹6çcJÎ-YîÍù’€“×!ks>#àäuEäڜo8y¹6çJÎý€YîÍùz€“×ñks>àäu9äڜï8y ¹6ç£JÎ̀YîÍùb€“×Áks>àäu-äڜo8y +¹6çCFÞwFù؜¯8y ¹6çN^@®Íù>€“×yks> äܘåޜ/8y¹6ç³N^W@®Íù&€“×Iks> äܘåޜ¯8y¹6çSN^—@®Íù€“אks> äܘåޜ/8y¹6çüßÉ«þ¹6ÇößÁ—ôÜÛÅ9üWnºÿî͹úwòŠþA®Í)ùwîŸÅ?¨7{sïïԕûƒ[›sì¯ä´þ³Ü›céïàKèîíâœù;wUþ×æÜø;y%þ ×æø+xõý³[‹sÝïÜ÷\›sÚïäUöƒ\›c×ïàKÖîíâõ+7Mÿ ÷æ\ô;yý ×æœó;yÕü ×æÜò;y¥ü ×æò+9ÿ,÷æ\ñ;yEü ×æœð;yü ×æÜï;yåû ×æï+9íþ,÷æ\î;y…û ×æœí;yUû ×æÜì;y%û ×æìy÷ú£|lε¾“W¬rmΩ¾“W©rmΝ¾“W¦rmΑ¾’ÓèÏro΅¾“W rmÎy¾“WrmÎm¾“WšrmÎa¾’ÓåÏroÎU¾“W”rmÎI¾“W‘rmÎ=þ•ËÞæòØõÛ 1þð:?ô¿~ü1âó7•>þ”üþøãë®{zx{ù㇊‡÷§×y­—Çë×úüű÷oÿ°žú|­þïw_ëjlÿhÃendstream +endobj +669 0 obj << +/Type /Page +/Contents 670 0 R +/Resources 668 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 672 0 R 673 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R ] +>> endobj +672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 705.1906 296.9253 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNodeGroup) >> +>> endobj +673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 705.1906 538.9788 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNodeGroup) >> +>> endobj +674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 694.1769 271.4708 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNode) >> +>> endobj +675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 694.1769 538.9788 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNode) >> +>> endobj +676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 681.2254 228.303 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFile) >> +>> endobj +677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 681.2254 538.9788 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFile) >> +>> endobj +678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 666.3363 209.0756 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKey) >> +>> endobj +679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 666.3363 538.9788 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKey) >> +>> endobj +680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 653.3849 228.7518 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKeyType) >> +>> endobj +681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 653.3849 538.9788 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKeyType) >> +>> endobj +682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 640.4334 227.7351 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteMessage) >> +>> endobj +683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 640.4334 538.9788 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteMessage) >> +>> endobj +684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 629.5393 258.6292 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkMethod) >> +>> endobj +685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 629.5393 538.9788 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkMethod) >> +>> endobj +686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 614.5306 247.3119 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkType) >> +>> endobj +687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 614.5306 538.9788 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkType) >> +>> endobj +688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 601.5791 283.0776 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromNodeGroup) >> +>> endobj +689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 601.5791 538.9788 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromNodeGroup) >> +>> endobj +690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 590.5654 255.4213 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromPCU) >> +>> endobj +691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 590.5654 538.9788 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromPCU) >> +>> endobj +692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 575.6763 239.9098 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeGroup) >> +>> endobj +693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 575.6763 538.9788 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeGroup) >> +>> endobj +694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 564.7821 249.2147 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeNetwork) >> +>> endobj +695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 564.7821 538.9788 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeNetwork) >> +>> endobj +696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 551.8307 214.4553 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNode) >> +>> endobj +697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 551.8307 538.9788 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNode) >> +>> endobj +698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 538.8793 212.2535 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePCU) >> +>> endobj +699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 538.8793 538.9788 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePCU) >> +>> endobj +700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 525.9278 210.5797 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePeer) >> +>> endobj +701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 525.9278 538.9788 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePeer) >> +>> endobj +702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 512.8568 257.0847 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSite) >> +>> endobj +703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 512.8568 538.9788 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSite) >> +>> endobj +704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 500.025 261.5081 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSlice) >> +>> endobj +705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 500.025 538.9788 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSlice) >> +>> endobj +706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 487.0735 219.9943 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePerson) >> +>> endobj +707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 487.0735 538.9788 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePerson) >> +>> endobj +708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 474.1221 260.4024 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRoleFromPerson) >> +>> endobj +709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 474.1221 538.9788 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRoleFromPerson) >> +>> endobj +710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 461.0511 211.6955 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRole) >> +>> endobj +711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 461.0511 538.9788 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRole) >> +>> endobj +712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 448.2192 223.3217 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSession) >> +>> endobj +713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 448.2192 538.9788 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSession) >> +>> endobj +714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 435.2678 208.3778 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSite) >> +>> endobj +715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 435.2678 538.9788 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSite) >> +>> endobj +716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 422.3164 248.5765 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttribute) >> +>> endobj +717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 422.3164 538.9788 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttribute) >> +>> endobj +718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 407.3077 268.2527 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttributeType) >> +>> endobj +719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 407.3077 538.9788 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttributeType) >> +>> endobj +720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 396.4135 259.8444 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceFromNodes) >> +>> endobj +721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 396.4135 538.9788 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceFromNodes) >> +>> endobj +722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 383.4621 262.6136 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceInstantiation) >> +>> endobj +723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 383.4621 538.9788 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceInstantiation) >> +>> endobj +724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 370.5107 212.8012 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSlice) >> +>> endobj +725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 370.5107 538.9788 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSlice) >> +>> endobj +726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 357.4396 222.206 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddresses) >> +>> endobj +727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 357.4396 538.9788 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddresses) >> +>> endobj +728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 342.5505 237.4589 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddressTypes) >> +>> endobj +729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 342.5505 538.9788 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddressTypes) >> +>> endobj +730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 331.5368 224.4375 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:GetBootStates) >> +>> endobj +731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 331.5368 538.9788 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:GetBootStates) >> +>> endobj +732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 318.7049 220.5621 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:GetConfFiles) >> +>> endobj +733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 318.7049 538.9788 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:GetConfFiles) >> +>> endobj +734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 305.7535 208.2288 314.6001] +/Subtype /Link +/A << /S /GoTo /D (0:GetEvents) >> +>> endobj +735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 305.7535 538.9788 314.6001] +/Subtype /Link +/A << /S /GoTo /D (0:GetEvents) >> +>> endobj +736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 290.7448 201.3347 301.6487] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeys) >> +>> endobj +737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 290.7448 538.9788 301.6487] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeys) >> +>> endobj +738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 277.7933 221.0109 288.6973] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeyTypes) >> +>> endobj +739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 277.7933 538.9788 288.6973] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeyTypes) >> +>> endobj +740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 264.8419 219.9942 275.7458] +/Subtype /Link +/A << /S /GoTo /D (0:GetMessages) >> +>> endobj +741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 264.8419 538.9788 275.7458] +/Subtype /Link +/A << /S /GoTo /D (0:GetMessages) >> +>> endobj +742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 253.9478 250.8883 262.7944] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkMethods) >> +>> endobj +743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 253.9478 538.9788 262.7944] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkMethods) >> +>> endobj +744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 238.939 239.571 249.843] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkTypes) >> +>> endobj +745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 238.939 538.9788 249.843] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkTypes) >> +>> endobj +746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 225.9876 232.1689 236.8915] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeGroups) >> +>> endobj +747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 225.9876 538.9788 236.8915] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeGroups) >> +>> endobj +748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 215.0935 241.4738 223.9401] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeNetworks) >> +>> endobj +749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 215.0935 538.9788 223.9401] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeNetworks) >> +>> endobj +750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 202.0224 206.7144 210.9887] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodes) >> +>> endobj +751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 202.0224 538.9788 210.9887] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodes) >> +>> endobj +752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 189.1906 204.5126 198.0373] +/Subtype /Link +/A << /S /GoTo /D (0:GetPCUs) >> +>> endobj +753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 189.1906 538.9788 198.0373] +/Subtype /Link +/A << /S /GoTo /D (0:GetPCUs) >> +>> endobj +754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 176.2392 217.7727 185.0858] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerData) >> +>> endobj +755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 176.2392 538.9788 185.0858] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerData) >> +>> endobj +756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 163.2877 222.754 172.1344] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerName) >> +>> endobj +757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 163.2877 538.9788 172.1344] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerName) >> +>> endobj +758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 150.3363 202.8388 159.183] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeers) >> +>> endobj +759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 150.3363 538.9788 159.183] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeers) >> +>> endobj +760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 137.3849 212.2535 146.2315] +/Subtype /Link +/A << /S /GoTo /D (0:GetPersons) >> +>> endobj +761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 137.3849 538.9788 146.2315] +/Subtype /Link +/A << /S /GoTo /D (0:GetPersons) >> +>> endobj +762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 124.3138 203.9546 133.2801] +/Subtype /Link +/A << /S /GoTo /D (0:GetRoles) >> +>> endobj +763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 124.3138 538.9788 133.2801] +/Subtype /Link +/A << /S /GoTo /D (0:GetRoles) >> +>> endobj +764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 111.3624 211.7055 120.3287] +/Subtype /Link +/A << /S /GoTo /D (0:GetSession) >> +>> endobj +765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 111.3624 538.9788 120.3287] +/Subtype /Link +/A << /S /GoTo /D (0:GetSession) >> +>> endobj +766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 98.411 200.637 107.3772] +/Subtype /Link +/A << /S /GoTo /D (0:GetSites) >> +>> endobj +767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 98.411 538.9788 107.3772] +/Subtype /Link +/A << /S /GoTo /D (0:GetSites) >> +>> endobj +671 0 obj << +/D [669 0 R /XYZ 71.731 729.2652 null] +>> endobj +668 0 obj << +/Font << /F29 532 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +818 0 obj << +/Length 35243 +/Filter /FlateDecode +>> +stream +xڔÝMlW~¥÷¹>‡ä@áŒÈŒ|Ê ·` +Võ¨áAIuÕ&Z],”õí—Œ½väúG¬g]ô@hÔ®õÛuNÕe^ò>8Çïž.ÿïøÝÛñðö|ù?§Ãéõ|úî_ÿÇß=}÷ß.ÿÒ?þÝñzäåõõp:_/ÿŸ;ÿêß?¼Χ§×ïþþôtø8ÏwO_ž/¯§ïþþíéýðüòüöõÔÿúÇ¿û_þóé㻏ÃÇëéõ»?þÛwë˜NýñÏÿõûÓáýýðÃߟÎOßÿã—_ÿùßü×/ÿðë¯?ÿø/?œž¾ÿ_¿üòÃÿóÇÿãïþ·?J;=Þ/÷úîó+/ÿ¡^ÏþC^Ž‡§óÝWç>]ø0.tùu~}½{¡;øõ4â¾ú=<½½Züzq_}€¿ίo-~=¸¯ÞÇϗ·s~?—ø:MøX}€_ÞÎËGûØ×iÄ}õ~y;Ïíc_§÷Õøåíöušð±ú¿¼ãñ½Å¯§÷Õøåí<ÚǾN#î«ð÷ÃËÇsýد§÷ÕûøÛå¯<ïÏíc_§ «ðË_²Þ^ÚǾN#î«ðóåßr>¶øõ4â¾ú¿¼ó¹~ì×ӈûê}üýòv^^ÛǾN>Và—·óüÖ>öuq_}€_ÞÎå)µøõ4â¾ú¿¼ãûK‹_O#î«÷ñËÛyúhû:MøX}€?.íkû:¸¯>Àχ÷§ö±¯Óˆûêüò¯¾ëÇ~=¸¯ÞşŸžïoÇ·×iÀçêüòv^O/-~=¸¯>À/oçü|lñëiÄ}õ~ýWKüzq_½/oçù¥}ìë4ácõ~y;íOQë0Ò¶ù@¾¼šã¹}æë4Ú¾ú¿ü«O¯õ3¿žFÜWï㧧ÃÛGûüz˜hß| ?Nïo5}=¶¯>Àχ··÷ç¿žFÜWàï‡ÓëGkÿ~iÛ¼/?_Þ̹~Ýë4Ùcõ~y5ç§ö™¯Óˆûêüòj^Ú_ѯ‡‘¶ÍòåÍ<_[úzm_½¿\^ÍéÔ>óušð±ú¿¼šcmÿ~iÛ| _ÞÌÓsûÌ×i´}õþ~8~¼Ôÿ¹¯§÷ÕûøùéðúþÒþâ²N>VàχãÛ¹}ìë4â¾ú?^__ÛǾN#î«ðËÛ9׿¦¯Óˆûê}üõòv^ÞÚǾN>Và—·óü~jñëiÄ}õ~y;§÷ö±¯ÓˆûêüòvŽõc¿žFÜWïão—·s|jû:MøX}€_ÞÎÓSûØ×iÄ}õ~>œ?ŽíoÖiÄ}õþ~xz?Տýzq_½¿?Îo§ö±¯Ó„Õøóáéõ¹}ìë4â¾ú¿¼óKûØ×iÄ}õ~y;//ï-~=¸¯ÞÇ?.oçò¡_§ «ðËÛ9½¶}FÜWà—·s|mû:¸¯>À/oçé­~ì×ӈûê]üåééðòñ^þfE§Ÿ«ðÓáãýý½Å¯§÷ÕøùðòöqnñëiÄ}õþvøx{ªûõ4â¾z?^ÞÎëSûØ×iÂÇêüòvÎǗ¿žFÜWà—·órjû:¸¯>À/oçùT?öëiÄ}õ>~º¼ÓsûØ×iÂÇêüòvŽíßÑiÄ}õ~y;O/o-~=¸¯>Àßïçú±_O#î«÷ñç§ÃóûkûØ×iÂÇêütx{mû:¸¯>Àχç×·ö±¯ÓˆûêüòvÚ^¾#m›÷å—Ë«yyoŸù:MöX}€Ÿÿq¼;øõ4â¾ú¿¼šç–þí,Ÿ°—×rzªøõ4Ò¾z?_Þ˱ý{ž:MøX}€_ÞKû·Öa¤mó|>œ>Ní3_§ÑöÕøÛáí½þoÚ:¸¯ÞÇ_Ÿ§úµëa¢}ó|:¼½¾¼¶ôõ4Ú¾ú¿¼šó¹}æë4â¾ú¿¼šþ?ø¶ÍûòÛåÍ<·šX§É«ðË«9½µÏ|FÜWà—Wslÿ4±N#î«ðËËyz¯ûõ4â¾z:?>ÚǾN>Và§Ãë{û§‰uq_}€ŸÇ÷§ö±¯ÓˆûêüíðúÖþibFÜWïã—·ózlû:MøX}€_ÞÎùÔ>öuq_}€_ÞÎKû§‰uq_}€_ÞÎósýد§÷Õ»øùéòvNíŸ&ÖiÀçêüòvŽçS‹_O#î«ðËÛy:´øõ4â¾ú;œ?^ëÇ~=¸¯ÞǏO‡§÷6ÐÑiÂÇêüt8¿µšX§÷ÕøùðôÚ::¸¯>À/oçüQ?öëiÄ}õ>~º¼—öOë4ácõ~y;/m £ÓˆûêüòvžÛ?M¬ÓˆûêüòvNuèúO(çÓûáéÈ?Ýèܧ }¼Ž=¿>ÞüuöNd¹þvvŒ,_/¥{þ8=çÈR§®‘åGŠ,ÿøÃûÓ÷ûëØòüq¸ü/îõ»[tƖ—_ˆ¤;ÂÊ÷Ö¹OaÝ»Pˆ°÷Õa•øŠ°÷Õa•øŠ°÷Õau¸",ÀÇjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°:\àc5GX%¾",Â}5GX%¾",Â}5GX%¾",Â}5GX® ð±š#¬_ᾚ#¬_ᾚ#¬_ᾚ#¬ +ßVÆçjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°:\àc5FX¥}°ˆ¶Ía•ôŠ°ÈöÕa•øŠ°÷ÕauöŠ°€öÍa•ôŠ°ÈöÕa•øŠ°÷Õa•ö5Â"Ú6s„Õъ°À«9Â*ñaî«1Â*ík„E´m櫤W„E¶¯æ«Ãa>Vc„UÚ׋hÛÌVI¯‹l_ÍV‰¯‹p_ÍV‡+Â|¬æ«ÄW„E¸¯æ«ÄW„E¸¯æ«ÄW„E¸¯æ«Ãa>Vs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Õኰ«9Â*ñaî«9Â*ñaî«9Â*ñaî«9ÂêpEX€Õa•øŠ°÷Õa•øŠ°÷Õa•øŠ°÷Õau¸",ÀÇjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°*|GXŸ«9Â*ñaî«9Â*ñaî«9Â*ñaî«9ÂêpEX€Õa•øŠ°÷Õa•øŠ°÷Õa•øŠ°÷Õau¸",ÀÇjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°:\àc5GX%¾",Â}5GX%¾",Â}5FX¥}°ˆ¶Íau´",°ÇjŽ°J|EX„ûjŠ°Jú÷‹àϋ9Â*áaí«9ÂêpEX€Õa•ö5Â"Ú6s„UÒ+Â"ÛWs„Uâ+Â"ÜWc„ÕÙ+ÂÚ7s„UÒ+Â"ÛWs„Uâ+Â"ÜWc„UÚ׋hÛÌVG+Â{¬æ«ÄW„E¸¯æ«ÄW„E¸¯æ«ÄW„E¸¯æ«Ãa>Vs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Õኰ«9Â*ñaî«9Â*ñaî«9Â*ñaî«9ªðae|®æ«ÄW„E¸¯æ«ÄW„E¸¯æ«ÄW„E¸¯æ«Ãa>Vs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Õኰ«9Â*ñaî«9Â*ñaî«9ÂJÅPaх®ç>]èãýa„•n4",øÒÝëåG«——§wˆ°Ö©ß#¬ËÏŸ#¬ÿý/¿üú§¿üúãŸ~ýñ§¿ürï#cïo_q»ÁüJ§ËÏ/â+}û+ßWç>]øñ·¿î](|û‹p_Íßþêðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;kð›ì,âs²³Wv¸¯BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY…ïì,ãc5gg½²3 m²³ŽVv¶¯BvÖáÊÎ÷՜U¶²³Lû&dg­ì l_…ì¬Ã•î«9;ë앝m›UôÎβ=V!;ëpeg€ûjÎÎ:{eg@Û&dg­ì l_…ì¬Âwv–ñ±š³³Î^Ùж ÙYG+;ÛW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg ~“E|®BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྚ³³Î^Ùж ÙYEïì,Ûc²³Wv¸¯Æ쬣¯ÙÀŸ!;ë`eg@û*dg¾³³ŒÕœuöÊ΀¶MÈÎ:ZÙؾ +ÙY‡+;ÜWsvVÙÊÎ2훐u´²3°}²³Wv¸¯æ쬳Wv´mBvVÑ;;ËöX…ì¬Ã•u¸²3À}²³Wv¸¯BvVá;;ËøX…ì¬Ã•u¸²3À}²³Wv¸¯BvVá;;ËøX…ì¬Ã•u¸²3À}²³Wv¸¯BvÖà7ÙYÄç*dg®ì p_…ì¬Ã•u¸²3À}²³ +ßÙYÆÇ*dg®ì p_…ì¬Ã•u¸²3À}²³ +ßÙYÆÇ*dg¡‚øêùðôÌ?Ýèܧ Ÿž×WáJßü ¬×ÃËûÇ ÔWëÔµ¾:Z}5ƒ«§—Ë¿¾þíśý{ÁÕéá×®ž^§ÓoS+^Qç>Ýqþí§÷ÃÛñëOÏw.t¿žFÜWïãÇãáôõoîWöõ0Ѿù@~>¼~|ý/WG_O£í«ð×ːí3_§÷Õøûáµ~保Eøóâ}öt<ߞÚ¾N=Và—÷òzlø:¸¯>À/ïåüõ‡æ¿žFÜWà—wórªûõ4â¾z¾¼ççö±¯Ó„Õøå휞ÛǾN#î«ðËÛ9¾´}FÜWà—·ót>µøõ4â¾z9ž>Îíc_§ «ðçÃùýµ}ìë4â¾ú=<½½µ}FÜWàï‡óë[ýد§÷ÕÑöå휿þÐ\áë4ácõ~y;/íc_§÷ÕøªÚ;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•oð›V>âsZùW+¸¯B+ßájå÷Uhå;\­<ྠ+­|…ïV>ãc5·ò½Zy mZùŽV+¶¯B+ßájå÷ÕÜÊW¶ZùLû&´ò­Vl_…V¾ÃÕÊ•ïìÕÊm›ÐÊWônå³=V¡•ïpµò€ûjnå;{µò@Û&´ò­Vl_…V¾Âw+Ÿñ±š[ùÎ^­<ж ­|G«•ÛW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò ~ÓÊG|®B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྚ[ùÎ^­<ж ­|EïV>ÛcZùW+¸¯ÆV¾£¯­<ÀŸ¡•ï`µò@û*´ò¾[ùŒÕÜÊwöj偶Mhå;Z­<ؾ +­|‡«•ÜWs+_Ùjå3í›ÐÊw´Zy°}ZùW+¸¯æV¾³W+´mB+_Ñ»•ÏöX…V¾ÃÕÊî«ÐÊw¸ZyÀ}ZùW+¸¯B+_ổÏøX…V¾ÃÕÊî«ÐÊw¸ZyÀ}ZùW+¸¯B+_ổÏøX…V¾ÃÕÊî«ÐÊw¸ZyÀ}ZùW+¸¯B+ßà7­|Äç*´ò®Vp_…V¾ÃÕÊî«ÐÊw¸ZyÀ}Zù +ß­|ÆÇ*´ò®Vp_…V¾ÃÕÊî«ÐÊw¸ZyÀ}Zù +ß­|ÆÇ*´ò!ön[y¸Ðjåo/[ùp¥onåϯ‡ó3}¨ôzèZʟ¬”ÿãÏçïü×ÿþÃñéû/¿ÎŒõüõÏü~wCÍùq¾üdû šßYmºì®jon¢Úy›ÔÔfÙ6¡¨mäÔFÙ7!§­dÕ´Y¶Mhi+Y)m–mBÚJVG›eۄŠ¶‘wDe߄„¶’UÐfÙ6¡Ÿ­då³Y¶Mˆg+Yíl–mÊÙFÞál”}²ÙJV5›eۄf¶’•ÌfÙ6!˜­dõ²Y¶M¨eyDzQöMHe+Y¥l–m:ÙJV&›eۄH¶’ÕÈfÙ6¡mäÈFÙ7!­dÕ±Y¶Mhc+Yil–mÂØJV›eۄ*¶‘we߄$¶’UÄfÙ6¡‡­då°Y¶Mˆa+Y-l–mJØFÞ!l”}2ØJV›eۄ¶’•ÀfÙ6!€­dõ¯Y¶M¨_ ù&~Mò؄ôµ’U¾fÙ6¡{­de¯Y¶Mˆ^+YÍk–mŠ×FÞÁk”}3箼j×ì~^„Öµr•ºfØ6!t­du®Y¶Í\¹6°"×èÚ"$®•«Â5ö }k%+oͲm渵‚WۚÝϋP¶6î[#원µV²ªÖ,ÛfnZ+x%­Ùý¼AkåªgÍ°mBÍÚÈ;f²o攵‚WɚÝϋбV®2Ö Û&D¬•¬†5˶ k#ï€5ʾ ùj%«^ͲmB»ZÉJW³l›®V²ºÕ,Û&T«¼£Õ(û&$«•¬b5˶ ½j%+WͲmB¬ZÉjU³l›Pª6òU£ì›©V²*Õ,Û&4ª•¬D5˶ j%«OͲmBÚÈ;N²oBšZÉ*S³l›Ð¥V²²Ô,Û&D©•¬&5˶ Ej#ï 5ʾ 9j%«FͲmB‹ZÉJQ³l›¢V²:Ô,Û&T¨…|¡&ylB‚ZÉ*P³l›ÐŸV²òÓ,Û&ħ•¬ö4˶ åi#ïð4ʾ Ùi%«:ͲmBsZÉJN³l›œV²zÓ,Û&Ô¦¼cÓ(û&¤¦•¬Ò4˶ i%+3ͲmBdZÉjL³l›P˜6òL£ì›—V²êÒ,Û&´¥•¬´4˶™ÃÒ +^]iv?/BUÚ¸;*°oBRZÉ*J³l›±'­ÜkNšÕO{“VªZÒìÚ&”¤¼CÒ(ûfÎH+xU¤Ùý¼ iå*!Í°mB@ZÉêG³l›¹m`ţѵEHG+Wåh†mºÑJV6šeÛÌÑh¯f4»Ÿ¡mÜŒFØ7!­dÕ¢Y¶MhE+Y©h–mBÑJV'šeۄJ´‘w$e߄D´’UˆfÙ6¡­då¡Y¶MˆC+Ymh–mÊÐFÞah”}²ÐJVšeۄ&´’•„fÙ6!­dõ Y¶M¨A ù&Mò؄´’U‚fÙ6¡­de Y¶Mˆ@+Y h–m +ÐFÞh”}òÏJVý™eۄö³’•~fÙ6!ü¬duŸY¶M¨>yGŸQöMH>S¨ØŸù6+ø¼¹Íñéùqïùø>#÷S ¸¯ÆÏwôõ3Å^„ÏWðþLq¦Ç*|¦¸Ãõ™bÀ}>SÜáê©÷U(ª;\I5ྠ+Qu…ïª:ãcºêWX ¸¯BZÝáj«÷U¨«;\y5ྠ+u…ïÂ:ãcëWd ¸¯BfÝáê¬÷U(­;\©5ྠ+±u…ïÚ:ãczëWp ¸¯BrÝáj®÷U¨®;\Ù5ྠ+áu…ïò:ãcÚëW| ¸¯B~Ýáê¯÷U(°;\ 6ྠ+v…ï +;ãc:ìWˆ ¸¯BŠÝáj±÷U¨±;\96ྠ+Av…ï";ãcšìW” ¸¯B–Ýáê²÷U(³;\i6ྠ+qv…ï:;ãcúìW  ¸¯B¢Ýáj´÷U¨´;\™6ྠ+¡vƒß”ÚŸ«Ðjw¸bmÀ}ríW¯ ¸¯B±ÝáJ¶÷Uˆ¶+|WÛ«¹Ûîìnm›nw´Úm°}êíW¾ ¸¯æ€»²UpgÚ7¡áîhEÜ`û*dÜ®Žp_Í%wg¯”hۄ˜»¢wÍí± +=w‡+èÜWsÒÝÙ«éÚ6¡êîheÝ`û*„ݾËÕÜvwöŠ»¶MÈ»;Z}7ؾ +…w‡+ñÜW!ò®ð]yg|¬BçÝá +½÷UH½;\­7ྠ+µw‡+÷ÜW!ø®ð]|g|¬BóÝኾ÷UȾ;\Ý7ྠ+åw‡+ýÜW!þ®ð]g|¬BÿÝá +À÷UHÀ;\ 8ྠ+x‡+ÜW!¯ð]‚g|¬B ÞáŠÁ÷UÈÁ;\=8ྠ+Ex‡+ ÜW! +¯ð]…g|¬BÞá +Ã÷UHÃ;\m8ྠ+ux‡+ÜW!oð›B<âsñW$¸¯B&ÞáêÄ÷U(Å;\©8ྠ+±x…ïZ<ãczñW0¸¯B2ÞájÆ÷U¨Æ;\Ù8ྠ+áx…ïr<ãcÚñW<¸¯B>ÞáêÇ÷U(È;\ 9ྠ+y…ïŠ<ãc:òWH¸¯BJÞájÉ÷Õ\“wöÊɁ¶MÊ+zå٫Дw¸¢rÀ}5få}íÊþ¼ey+-ÚW!.¯ð]—g|¬æ¾¼³W`´mBbÞÑjÌÁöU¨Ì;\™9ྚCóÊViži߄ּ£›ƒí«›w¸zsÀ}5睽’s m¢óŠÞÕy¶Ç*tç®ðp_…ô¼Ã՞î«PŸw¸òsÀ}ô +ßzÆÇ*4è®p_… ½ÃÕ¡î«P¢w¸RtÀ}bô +ß5zÆÇ*ôè® p_…$½ÃÕ¤î«P¥w¸²tÀ}Âô¿)Ó#>W¡MïpÅé€û*äé®>p_…B½Ã•¨î«©Wø®Ô3>V¡Sïp…ê€û*¤ê®Vp_…Z½Ã•«î«¬Wø.Ö3>V¡Y½u­Ã…Vµ~{¡ãÓËãl=\é›?Süütù5÷|„n}ºvë/×nýŸ~úõÇûÛ¾üüËO™Éú徿ýG†7Æ|„o_ÿ7ðèŪyã5wÍ{{ÏPóÞ¹Pªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5oƒßÔ¼Ÿ«Póv¸j^À}jÞWÍ ¸¯BÍÛáªy÷U¨y+|×¼«¹æíìUóm›Póv´j^°}jÞWÍ ¸¯æš·²UófÚ7¡æíhÕ¼`û*Ô¼®šp_Í5og¯šhۄš·¢wÍ›í± +5o‡«æÜWsÍÛÙ«æÚ6¡æíhÕ¼`û*Ô¼¾kތÕ\óvöªy¶M¨y;Z5/ؾ +5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æmð›š7âsjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷Õ\óvöªy¶M¨y+z×¼Ù«Póv¸j^À}5Ö¼}­yþ¼5o«æÚW¡æ­ð]óf|¬æš·³WÍ ´mBÍÛѪyÁöU¨y;\5/ྚkÞÊV͛i߄š·£Uó‚í«Póv¸j^À}5×¼½j^ mjފÞ5o¶Ç*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ¿©y#>W¡æípÕ¼€û*Ô¼®šp_…š·ÃUóî«PóVø®y3>V¡æípÕ¼€û*Ô¼®šp_…š·ÃUóî«PóVø®y3>V¡æ)jWó…VÍ{{¡ãÓëãš7\é›kÞË»x}~ƒšwºÖ¼çkÍûù—Ÿ~úõŸ~úó—{_=>=ýç7€_ãtxy9>üúôúq¼áúñíÃçˆï\&}Ž8Óc>GÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`nð›€9âsæWÀ ¸¯BÀÜá +˜÷U˜;\3ྠ+s…ï€9ãc5̝½f mæŽVÀ ¶¯BÀÜá +˜÷Õ0W¶æLû&Ì­€l_…€¹Ã0î«9`îì0m›0Wô˜³=V!`îp̀ûj˜;{Ì@Û&Ì­€l_…€¹ÂwÀœñ±šæÎ^3ж sG+`ÛW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*Ì ~0G|®BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྚæÎ^3ж sEï€9ÛcæWÀ ¸¯Æ€¹£¯3ÀŸ!`î`Ì@û*̾挏Õ0wö +˜¶M˜;Z3ؾ +s‡+`ÜWsÀ\Ù +˜3í›0w´f°}æWÀ ¸¯æ€¹³WÀ ´mBÀ\Ñ;`ÎöX…€¹Ã0î«0w¸fÀ}æWÀ ¸¯BÀ\á;`ÎøX…€¹Ã0î«0w¸fÀ}æWÀ ¸¯BÀ\á;`ÎøX…€¹Ã0î«0w¸fÀ}æWÀ ¸¯BÀÜà7sÄç*Ì®€p_…€¹Ã0î«0w¸fÀ}æ +ßsÆÇ*Ì®€p_…€¹Ã0î«0w¸fÀ}æ +ßsÆÇ*Ì!Àmf¸Ð +˜o/t|úx0‡+}sÀüôrx{>=CÀ¼N]æWÌÿöó—_þß?|ùòó,˜/÷xýúÍn¿Çñðúõ—ÜGóëåçß~B‹—Ô¹O·œDûš:ß¹ÎãxàϋOWðŽ§3=V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«O7øM<ñ¹ +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÂw<ñ±šãéÎ^ñ4ж ñtG+žÛW!žîpÅӀûjŽ§+[ñt¦}âéŽV< ¶¯B<Ýኧ÷ÕOwöŠ§¶Mˆ§+zÇÓÙ«Ow¸âiÀ}5Çӝ½âi mâéŽV< ¶¯B<]á;žÎøXÍñtg¯xhۄxº£Oƒí«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}â鿉§#>W!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_Íñtg¯xhۄxº¢w<í± +ñt‡+žÜWc<ÝÑ×xàϋOw°âi }âé +ßñtÆÇjŽ§;{ÅÓ@Û&ÄÓ­xl_…xºÃOî«9ž®lÅәöMˆ§;Zñ4ؾ +ñt‡+žÜWs<ÝÙ+žÚ6!ž®èOg{¬B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt‡+žÜW!ž®ðOg|¬B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt‡+žÜW!ž®ðOg|¬B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt‡+žÜW!žnð›x:âsâéW< ¸¯B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt…ïx:ãcâéW< ¸¯B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt…ïx:ãcâéÐþ¶ñ4\hÅÓ·:ŸÇÓáJ#ž>çxúüq¼üîéé=ÇÓ:u§ßOÿòå×?üp<ÿ§_~ùŸ?Ÿ¾ÿéç?ώõ|¹ÈÍÈÝ'yùëãQE­®6ßVç>]÷qW{ïB¡«%ÜWsWÛáêj«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj;\]-àc5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ®®𱚻Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»ÚWW øXÍ]m‰¯®–p_Í]m‰¯®–p_Í]m‰¯®–p_Í]m‡««|¬æ®¶ÄWWK¸¯æ®¶ÄWWK¸¯æ®¶ÄWWK¸¯æ®¶ÂwW›ñ¹š»Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»ÚWW øX]mi_»Z¢m3wµ%½ºZ²}5wµ%¾ºZÂ}5vµ½ºZ }3wµ%½ºZ²}5wµ%¾ºZÂ}5vµ¥}íj‰¶ÍÜÕv´ºZ°ÇjîjK|uµ„ûjìjKûÚÕm›¹«-éÕÕ’í«¹«ípuµ€ÕØՖöµ«%Ú6sW[Ò««%ÛWsW[â««%ÜWsWÛáêj«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj;\]-àc5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ®®𱚻Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»Ú +ß]mÆçjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj;\]-àc5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ®®𱚻Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»ÚWW øXÍ]m‰¯®–p_Í]m‰¯®–p_]mi_»Z¢m3wµ­®챚»Ú_]-ᾚºÚ’þ½«%øóbîjKxuµDûjîj;\]-àc5vµ¥}íj‰¶ÍÜՖôêjÉöÕÜՖøêj ÷ÕØÕvöêjöÍÜՖôêjÉöÕÜՖøêj ÷ÕØՖöµ«%Ú6sWÛÑêjÁ«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj+|wµŸ«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjs Zuµt¡ë¹O:»Út¥oý(ñùíýòÛåèjשkWû~íjÿù˯øòó/?ýå?ÿø?þôóßþùÇ_¿Ü‹¼žO_ÿ‰Â 5Ÿäéôôò¨«ÝáW¼í¿n¯¯;Jáྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üjð›ð+âs¯Wø¸¯BøÕá +¿÷U¿:\áྠ+áW…ïð+ãc5‡_½Â/ m¯ŽVø¶¯BøÕá +¿÷Õ~U¶Â¯Lû&„_­ð l_…ð«Ã~î«9üêì~m›~Uô¿²=V!üêp…_€ûj¿:{…_@Û&„_­ð l_…ð«Âwø•ñ±šÃ¯Î^áж áWG+üÛW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_ ~~E|®BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྚïÎ^áж áWEïð+Ûc¯Wø¸¯Æ𫣯áÀŸ!üê`…_@û*„_¾Ã¯ŒÕ~uö +¿€¶M¿:Záؾ +áW‡+üÜWsøUÙ +¿2í›~u´Â/°}¯Wø¸¯æð«³Wø´mBøUÑ;üÊöX…ð«Ã~î«~u¸Â/À}¯Wø¸¯BøUá;üÊøX…ð«Ã~î«~u¸Â/À}¯Wø¸¯BøUá;üÊøX…ð«Ã~î«~u¸Â/À}¯Wø¸¯BøÕà7áWÄç*„_®ð p_…ð«Ã~î«~u¸Â/À}¯ +ßáWÆÇ*„_®ð p_…ð«Ã~î«~u¸Â/À}¯ +ßáWÆÇ*„_1WêÂ/¸Ð +¿n/ïp¥o¿.?É¿¿Ñ÷;tùéïÚ}}\»¯ÿò×?ÿé×/ÿðç?ÿüå—_æw ß.¿)üúGõ׿ûÎEŽ‡çËo~HQß2¼™Hß2¼½gø–ᝠ¥of|¬Â· ;\ß2ÜWá[†®oî«ð-Ã×· ÷Uø–a…ïof|¬Â· ;\ß2ÜWá[†®oî«ð-Ã×· ÷Uø–a…ïof|¬Â· ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­ ~“´F|®BÒÚáJZ÷UHZ;\I+ྠ+Ik‡+iÜW!i­ð´f|¬æ¤µ³WÒ +´mBÒÚÑJZÁöUHZ;\I+ྚ“ÖÊVҚi߄¤µ£•´‚í«´v¸’VÀ}5'­½’V m’ÖŠÞIk¶Ç*$­®¤p_ÍIkg¯¤hۄ¤µ£•´‚í«´VøNZ3>VsÒÚÙ+iÚ6!iíh%­`û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÁo’ÖˆÏUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜWsÒÚÙ+iÚ6!i­è´f{¬BÒÚáJZ÷՘´vô5iøó"$­¬¤h_…¤µÂwҚñ±š“ÖÎ^I+ж IkG+iÛW!iíp%­€ûjNZ+[Ik¦}’ÖŽVÒ +¶¯BÒÚáJZ÷՜´vöJZ¶MHZ+z'­Ù«´v¸’VÀ}’ÖWÒ +¸¯BÒÚáJZ÷UHZ+|'­«´v¸’VÀ}’ÖWÒ +¸¯BÒÚáJZ÷UHZ+|'­«´v¸’VÀ}’ÖWÒ +¸¯BÒÚáJZ÷UHZü&iø\…¤µÃ•´´v¸’VÀ}’ÖWÒ +¸¯BÒZá;iÍøX…¤µÃ•´´v¸’VÀ}’ÖWÒ +¸¯BÒZá;iÍøX…¤5™mÒ +ZIë텎ÇÓã¤5\雓ÖËo?N—ÿýå¦uú½i=^~­¼µþñ‡÷§ïÿö×/÷³óןÙo°·ž?.Gðk†ñ¾;ýº½pH¿î\(¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«ÁoÒ¯ˆÏUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒÕœ~uöJ¿€¶MH¿:Zéؾ +éW‡+ýÜWsúUÙJ¿2훐~u´Ò/°}Ò¯Wú¸¯æô«³Wú´mBúUÑ;ýÊöX…ô«Ã•~î«9ýêì•~m›~u´Ò/°}Ò¯ +ßéWÆÇjN¿:{¥_@Û&¤_­ô l_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~5øMúñ¹ +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€ûjN¿:{¥_@Û&¤_½Ó¯lUH¿:\éà¾Ó¯Ž¾¦_^„ô«ƒ•~í«~UøN¿2>VsúÕÙ+ýÚ6!ýêh¥_`û*¤_®ô p_ÍéWe+ýÊ´oBúÕÑJ¿ÀöUH¿:\éྚӯÎ^éж éWEïô+ÛcÒ¯Wú¸¯BúÕáJ¿÷UH¿:\éྠ+éW…ïô+ãcÒ¯Wú¸¯BúÕáJ¿÷UH¿:\éྠ+éW…ïô+ãcÒ¯Wú¸¯BúÕáJ¿÷UH¿:\éྠ+éWƒß¤_Ÿ«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~…\©M¿àB+ýº½Ðå7‘Ó¯p¥oN¿ž/7y;!ýZ§Vúuü”~ý§ŸþòoÿùÇŸÍ×óå¿eç¯ÿ¿Qfóõt~}Ô|í/ëŋî/ëÝÞ4|Yï΅җõ÷Uø²^…ï/ëe|¬Â—õ:\_ÖÜWáËz®/ëî«ðe½חõ÷Uø²^…ï/ëe|¬Â—õ:\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*ä• ~“WF|®B^ÙáÊ+÷UÈ+;\y%ྠ+ye‡+¯ÜW!¯¬ðWf|¬æ¼²³W^ ´mB^ÙÑÊ+ÁöUÈ+;\y%ྚóÊÊV^™i߄¼²£•W‚í«Wv¸òJÀ}5畝½òJ mòʊÞye¶Ç*ä•®¼p_Íyeg¯¼hۄ¼²£•W‚í«WVøÎ+3>Vs^ÙÙ+¯Ú6!¯ìhå•`û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²ÁoòʈÏUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜWs^ÙÙ+¯Ú6!¯¬èWf{¬B^ÙáÊ+÷՘Wvô5¯øó"䕬¼h_…¼²Âw^™ñ±šóÊÎ^y%ж yeG+¯ÛW!¯ìp啀ûjÎ++[ye¦}òʎV^ ¶¯B^ÙáÊ+÷՜WvöÊ+¶MÈ++zç•Ù«Wv¸òJÀ}òÊW^ ¸¯B^ÙáÊ+÷UÈ++|ç•«Wv¸òJÀ}òÊW^ ¸¯B^ÙáÊ+÷UÈ++|ç•«Wv¸òJÀ}òÊW^ ¸¯B^ÙáÊ+÷UÈ+ü&¯Œø\…¼²Ã•WWv¸òJÀ}òÊW^ ¸¯B^Yá;¯ÌøX…¼²Ã•WWv¸òJÀ}òÊW^ ¸¯B^Yá;¯ÌøX…¼2”m^ Zyå텎ǗÇye¸Ò7畧·ÃÓéù òÊßO½*¯<}Ê+ÿÏNçï¿üp<ÿ·ñ£¿þÑÊç¯~zMÜ}ŽÏç÷G…åñõòcÈo?¨ÝLÜùÃÒëܧËÎ?©}|?|ý§Jw®s‡þí,Ÿﳧãáøöõ‡© +^§‰«ðçÃëëñ¹Å¯§÷Õø彜¿þ0Õá×ӈûêüòn^Nõc¿žFÜWļ—·óüÜ>öušð±ú¿¼ÓsûØ×iÄ}õ¾jçWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨ü¦¡Žø\…†ºÃÕPî«ÐPw¸jÀ}êWC ¸¯BC]ỡÎøXÍ ug¯†hۄ†º£ÕPƒí«ÐPw¸jÀ}57ԕ­†:Ó¾ uG«¡ÛW¡¡îp5Ԁûjn¨;{5Ô@Û&4Ô½êlUh¨;\ 5ྚêÎ^ 5ж uG«¡ÛW¡¡®ðÝPg|¬æ†º³WC ´mBCÝÑj¨ÁöUh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ uƒß4ÔŸ«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯æ†º³WC ´mBC]Ñ»¡ÎöX…†ºÃÕP¡îèkC ðçEh¨;X 5о + u…ï†:ãc57ԝ½j mêŽVC ¶¯BCÝáj¨÷ÕÜPW¶êLû&4Ô­†l_…†ºÃÕP¡îìÕPm›ÐPWôn¨³=V¡¡îp5Ԁû*4Ô®†p_…†ºÃÕPî«ÐPWøn¨3>V¡¡îp5Ԁû*4Ô®†p_…†ºÃÕPî«ÐPWøn¨3>V¡¡îp5Ԁû*4Ô®†p_…†ºÃÕPî«ÐP7øMCñ¹ + u‡«¡ÜW¡¡îp5Ԁû*4Ô®†p_…†ºÂwCñ± + u‡«¡ÜW¡¡îp5Ԁû*4Ô®†p_…†ºÂwCñ± + ul»†.´êÛ çÇ u¸Ò77ÔǗÃÓÛé õ:µêçO õÿõå—_þôßî|¡öåðòÛO/7ÈüBíëé卿Pï¹ëÊۋ†ºò΅R] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Ùà7ueÄç*ԕ®ºp_…º²ÃUWî«PWv¸êJÀ}êÊ +ßueÆÇj®+;{Օ@Û&ԕ­ºl_…º²ÃUW®¬lՕ™öM¨+;Zu%ؾ +ue‡«®ÜWs]ÙÙ«®Ú6¡®¬è]Wf{¬B]Ùáª+÷Õ\Wvöª+¶M¨+;Zu%ؾ +ue…ïº2ãc5ו½êJ mêʎV] ¶¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨+ü¦®Œø\…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}5ו½êJ mêʊÞue¶Ç*ԕ®ºp_ueG_ëJ€?/B]ÙÁª+öU¨++|ו«¹®ììUWm›PWv´êJ°}êÊW] ¸¯æº²²UWfÚ7¡®ìhՕ`û*ԕ®ºp_Íueg¯ºhۄº²¢w]™í± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²ÁoêʈÏU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+CØ֕p¡UWÞ^èx|}\W†+}s]ùt¼ü²÷ôuå:µêʗOuå?ýôç/ÿøóOÿñ×{]Ýëo¿I¹af_ùñtùíۃ¾rçnñ¦;w»½jÈÝî\(ån«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝü&w‹ø\…ܭÕ»»u¸r7À}r·WBîVá;wËøX͹[g¯Ü hۄܭ£•»í«»u¸r7À}5çn•­Ü-Ó¾ ¹[G+wÛW!wëpån€ûjÎÝ:{ån@Û&än½s·lUÈÝ:\¹ྚs·Î^¹ж ¹[G+wÛW!w«ð»e|¬æÜ­³Wî´mBîÖÑÊÝÀöUÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[ƒßänŸ«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WæÜ­³Wî´mBîVÑ;wËöX…ܭÕ»î«1wëèkîðçEÈÝ:X¹о +¹[…ïÜ-ãc5çn½r7 mr·ŽVBîÖáÊÝ÷՜»U¶r·Lû&än­Ü l_…ܭÕ»î«9wë앻m›»UôÎݲ=V!wëpån€û*än®Ü p_…ܭÕ»»UøÎÝ2>V!wëpån€û*än®Ü p_…ܭÕ»»UøÎÝ2>V!wëpån€û*än®Ü p_…ܭÕ»»5øMîñ¹ +¹[‡+wÜW!wëpån€û*än®Ü p_…Ü­Âwî–ñ± +¹[‡+wÜW!wëpån€û*än®Ü p_…Ü­Âwî–ñ± +¹[µÚÜ .´r·Û os·p¥oÍÝ^Þß/©ûxɹÛõÔ³r·óÈÝþé˯ÿó‡ãÓ÷?ýüßgìôµ•ø8ÏòéíéåQô¦úêv"ÔWŸ.ü¸¾ºw¡P_¾êpÕW€Õ\_•øª¯÷Õ\_•øª¯÷Õ\_•øª¯÷Õ\_u¸ê+ÀÇj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯:\õàc5×W%¾ê+Â}5×W%¾ê+Â}5×W%¾ê+Â}5×W®ú +ð±šë«_õᾚë«_õᾚë«_õá¾šë« +ßõUÆçj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯:\õàc5ÖW¥}­¯ˆ¶Í\_•ôª¯ÈöÕ\_•øª¯÷ÕX_uöª¯€öÍ\_•ôª¯ÈöÕ\_•øª¯÷ÕX_•öµ¾"Ú6s}ÕѪ¯À«¹¾*ñU_¾*ík}E´mæúª¤W}E¶¯æúªÃU_>Vc}UÚ×úŠhÛÌõUI¯úŠl_ÍõU‰¯úŠp_ÍõU‡«¾|¬æúªÄW}E¸¯æúªÄW}E¸¯æúªÄW}E¸¯æúªÃU_>Vs}U⫾"ÜWs}U⫾"ÜWs}U⫾"ÜWs}Õ᪯«¹¾*ñU_¾*ñU_¾*ñU_¾êpÕW€Õ\_•øª¯÷Õ\_•øª¯÷Õ\_•øª¯÷Õ\_u¸ê+ÀÇj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯*|×WŸ«¹¾*ñU_¾*ñU_¾*ñU_¾êpÕW€Õ\_•øª¯÷Õ\_•øª¯÷Õ\_•øª¯÷Õ\_u¸ê+ÀÇj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯:\õàc5×W%¾ê+Â}5×W%¾ê+Â}5ÖW¥}­¯ˆ¶Í\_u´ê+°Çj®¯J|ÕW„ûjª¯Jú÷úŠàϋ¹¾*áU_í«¹¾êpÕW€ÕX_•öµ¾"Ú6s}UÒ«¾"ÛWs}U⫾"ÜWc}ÕÙ«¾Ú7s}UÒ«¾"ÛWs}U⫾"ÜWc}UÚ×úŠhÛÌõUG«¾{¬æúªÄW}E¸¯æúªÄW}E¸¯æúªÄW}E¸¯æúªÃU_>Vs}U⫾"ÜWs}U⫾"ÜWs}U⫾"ÜWs}Õ᪯«¹¾*ñU_¾*ñU_¾*ñU_¾ªð]_e|®æúªÄW}E¸¯æúªÄW}E¸¯æúªÄW}E¸¯æúªÃU_>Vs}U⫾"ÜWs}U⫾"ÜWs}U⫾"ÜWs}Õ᪯«¹¾ÊÅPU_х®ç>]èx|X_¥+}s}µ~°ËõÕ:µê«×Q_?}:^þ-O7?Þ¹ÇéðrùŸÁ£äêò`^_ûMw¼¤Î}ºåü#Ú§×Ãñüõ/êw.t¿žFÜWàï‡×—¯ï®Ã¯§÷Õûøóñp|~~.ñušð±ú¿¼ÓsûØ×iÄ}õ~y;Ǘö±¯ÓˆûêüòvžÎ§¿žFÜWïã/ÇÃÓǹ}ìë4ácõþ|8¿¿¶}FÜWே§··ö±¯ÓˆûêüúÍÃ__R$ÜWó—;\_R|¬æ/)–øú’"ᾚ¿¤Xâjy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-oƒß´¼Ÿ«Ðòv¸Z^À}ZÞWË ¸¯BËÛájy÷Uhy+|·¼«¹åíìÕòm›Ðòv´Z^°}ZÞWË ¸¯æ–·²ÕòfÚ7¡åíhµ¼`û*´¼®–p_Í-og¯–hۄ–·¢wË›í± +-o‡«åÜWsËÛÙ«åÚ6¡åíhµ¼`û*´¼¾[ތÕÜòvöjy¶Mhy;Z-/ؾ +-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡åmð›–7âsZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷ÕÜòvöjy¶Mhy+z·¼Ù«Ðòv¸Z^À}5¶¼}myþ¼-o«åÚW¡å­ðÝòf|¬æ–·³WË ´mBËÛÑjyÁöUhy;\-/ྚ[ÞÊV˛i߄–·£Õò‚í«Ðòv¸Z^À}5·¼½Z^ mZފÞ-o¶Ç*´¼®–p_…–·ÃÕòî«Ðòv¸Z^À}ZÞ +ß-oÆÇ*´¼®–p_…–·ÃÕòî«Ðòv¸Z^À}ZÞ +ß-oÆÇ*´¼®–p_…–·ÃÕòî«Ðòv¸Z^À}ZÞ¿iy#>W¡åípµ¼€û*´¼®–p_…–·ÃÕòî«ÐòVøny3>V¡åípµ¼€û*´¼®–p_…–·ÃÕòî«ÐòVøny3>V¡å )jÛò…VË{{¡ãñãqË®ôÍ-ïå·§×ËÿþrË»N­–÷íSËû‡ÿô_ƈ>~žž¾þ »`¦¼Ç×ÓóÔ÷x8¾ýöcJ¼£Î}ºäšv¿w.”:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆü¦#Žø\…Ž¸ÃÕî«Ðw¸:bÀ}:âWG ¸¯BG\á»#ÎøXÍqg¯ŽhۄŽ¸£Õƒí«Ðw¸:bÀ}5wĕ­Ž8Ó¾ qG«#ÛW¡#îpuĀûjîˆ;{uÄ@Û&tĽ;âlUèˆ;\1ྚ;âÎ^1ж qG«#ÛW¡#®ðÝg|¬æŽ¸³WG ´mBGÜÑêˆÁöUèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+qƒßtÄŸ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯æŽ¸³WG ´mBG\Ñ»#ÎöX…Ž¸ÃÕ#îèkG ðçEèˆ;X1о +q…ïŽ8ãc5wĝ½:b m:âŽVG ¶¯BGÜáêˆ÷ÕÜW¶:âLû&tÄ­Žl_…Ž¸ÃÕ#îìÕm›ÐWô=V¡#îpuĀû*tÄ®Žp_…Ž¸ÃÕî«ÐWøîˆ3>V¡#îpuĀû*tÄ®Žp_…Ž¸ÃÕî«ÐWøîˆ3>V¡#îpuĀû*tÄ®Žp_…Ž¸ÃÕî«Ð7øMGñ¹ +q‡«#ÜW¡#îpuĀû*tÄ®Žp_…Ž¸ÂwGœñ± +q‡«#ÜW¡#îpuĀû*tÄ®Žp_…Ž¸ÂwGœñ± +qè`ێ.´:âÛ OO;âp¥oîˆ_>.¿c=¡#^§VGüþ¹#þòåç¿žŸ¿þzz#ø=Ž‡Ë‰ó£øø~øíŸÅ+^O}ºááÞŠoï\&̙«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜ü¦`Žø\…‚¹ÃU0î«P0w¸ +fÀ} +æWÁ ¸¯BÁ\á»`ÎøXÍsg¯‚hۄ‚¹£U0ƒí«P0w¸ +fÀ}5̕­‚9Ó¾ sG«`ÛW¡`îp̀ûj.˜;{Ì@Û&̽ ælU(˜;\3ྚ æÎ^3ж sG«`ÛW¡`®ð]0g|¬æ‚¹³WÁ ´mBÁÜÑ*˜ÁöU(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+sƒßÌŸ«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯æ‚¹³WÁ ´mBÁ\Ñ»`ÎöX…‚¹ÃU0`îèkÁ ðçE(˜;X3о +s…ï‚9ãc5̝½ +f m +æŽVÁ ¶¯BÁÜá*˜÷Õ\0W¶ +æLû&Ì­‚l_…‚¹ÃU0`îìU0m›P0Wô.˜³=V¡`îp̀û*Ì®‚p_…‚¹ÃU0î«P0Wø.˜3>V¡`îp̀û*Ì®‚p_…‚¹ÃU0î«P0Wø.˜3>V¡`îp̀û*Ì®‚p_…‚¹ÃU0î«P07øMÁñ¹ +s‡«`ÜW¡`îp̀û*Ì®‚p_…‚¹ÂwÁœñ± +s‡«`ÜW¡`îp̀û*Ì®‚p_…‚¹ÂwÁœñ± +spۂ.´ +æÛ OÇÇs¸Ò(˜ÏP0?¿ž_Ÿ_¡`^§VÁüaóÏ¿üô—{ñìÛo֍1æ÷ç—‡CVÓ¯¹›ÖÛ{†¦õ΅RӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÁošÖˆÏUhZ;\M+ྠ+Mk‡«iÜW¡iíp5­€û*4­¾›ÖŒÕÜ´vöjZ¶MhZ;ZM+ؾ +Mk‡«iÜWsÓZÙjZ3í›Ð´v´šV°}šÖWÓ +¸¯æ¦µ³WÓ +´mBÓZÑ»iÍöX…¦µÃÕ´iíìÕ´m›Ð´v´šV°}šÖ +ßMkÆÇjnZ;{5­@Û&4­­¦l_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´6øMÓñ¹ +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€ûjnZ;{5­@Û&4­½›ÖlUhZ;\M+ྛ֎¾6­^„¦µƒÕ´í«Ð´VønZ3>VsÓÚÙ«iÚ6¡iíh5­`û*4­®¦p_ÍMke«iÍ´oBÓÚÑjZÁöUhZ;\M+ྚ›ÖÎ^M+ж MkEï¦5ÛcšÖWÓ +¸¯BÓÚájZ÷UhZ;\M+ྠ+Mk…ï¦5ãcšÖWÓ +¸¯BÓÚájZ÷UhZ;\M+ྠ+Mk…ï¦5ãcšÖWÓ +¸¯BÓÚájZ÷UhZ;\M+ྠ+Mkƒß4­Ÿ«Ð´v¸šVÀ}šÖWÓ +¸¯BÓÚájZ÷UhZ+|7­«Ð´v¸šVÀ}šÖWÓ +¸¯BÓÚájZ÷UhZ+|7­«Ð´† ³mZáB«i½½ÐñtzÜ´†+}óWy/ú˃¦uº6­—ÿÝÜ6­ÿüã¯_æWy/¿ª<ý=á0‹Ö§óåÇéG_å}½üüñÛOhñ’:÷é–óh_?ß{ç:? ðçEø pïgz¬Â;\ÜWáƒÀ®î«ðAàW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<Ýà7ñtÄç*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇjŽ§;{ÅÓ@Û&ÄÓ­xl_…xºÃOî«9ž®lÅәöMˆ§;Zñ4ؾ +ñt‡+žÜWs<ÝÙ+žÚ6!ž®èOg{¬B<Ýኧ÷ÕOwöŠ§¶Mˆ§;Zñ4ؾ +ñt…ïx:ãc5Çӝ½âi mâéŽV< ¶¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§ü&žŽø\…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}5Çӝ½âi mâéŠÞñt¶Ç*ÄÓ®xp_ñtG_ãi€?/B<ÝÁŠ§öUˆ§+|ÇÓ«9žîìOm›Ow´âi°}âéW< ¸¯æxº²OgÚ7!žîhÅÓ`û*ÄÓ®xp_Íñtg¯xhۄxº¢w<í± +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÂw<ñ± +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÂw<ñ± +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÁoâéˆÏUˆ§;\ñ4ྠ+ñt‡+žÜW!žîpÅӀû*ÄÓ¾ã錏Uˆ§;\ñ4ྠ+ñt‡+žÜW!žîpÅӀû*ÄÓ¾ã錏Uˆ§CûÛÆÓp¡Oß^èxz~O‡+}s<½þÆsŽ§×©O?ÇÓÿþã¿~ù‡_ýùÇùáôôýÜI©Ï_ÿ†À׿Å|ãÍÇyù)ïü(¥ÞV¼ò°nï¬;Jྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+VƒßXŸ«`u¸,À}¬W€¸¯B€Õá +°÷U°*|X«9Àêì`m›`u´,°}¬W€¸¯æ«²`eÚ7!ÀêhX`û*X® p_ÍVg¯ hۄ«¢w€•í± +V‡+ÀÜWs€ÕÙ+ÀÚ6!ÀêhX`û*X¾¬ŒÕ`uö +°€¶M°:Zؾ +V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àjð›+âs¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷Õ`uö +°€¶M°*zXÙ«`u¸,À}5X} °þ¼V+ÀÚW!Àªð`e|¬æ«³W€´mB€ÕÑ +°ÀöU°:\ྚ¬ÊV€•i߄«£`í«`u¸,À}5X½, m¬ŠÞV¶Ç*X® p_…«Ã`î«`u¸,À}¬ +ßVÆÇ*X® p_…«Ã`î«`u¸,À}¬ +ßVÆÇ*X® p_…«Ã`î«`u¸,À}¬¿ °">W!ÀêpX€û*X® p_…«Ã`î«`Uø°2>V!ÀêpX€û*X® p_…«Ã`î«`Uø°2>V!ÀŠÅP`Á…V€u{¡Ë/E¬p¥`s€õ|ù5÷ütùñ&X:µ¬Xüáýéû¿ýõ˽ãééíõ»[w>֏óÛÃoZþ^àÕuîÓÝ÷. Â}5®@𱚍_ᾚ_ᾚ_ᾚW øX́F‰¯@ƒp_́F‰¯@ƒp_́F‰¯@ƒp_́F…ï@#ãs5%¾ Â}5%¾ Â}5%¾ Â}5®@ð±Ò¾DÛf4Jzdûj4J|„ûj 4:{@ûf4Jzdûj4J|„ûj 4Jûhm›9Ðèh`Õh”ø +4÷Õh”ö5Ð Ú6s QÒ+Ð ÛWs Ñá +4«1Ð(ík A´mæ@£¤W A¶¯æ@£ÄW A¸¯æ@£Ãh>Vs Qâ+Ð ÜWs Qâ+Ð ÜWs Qâ+Ð ÜWs Ñá +4«9Ð(ñhî«9Ð(ñhî«9Ð(ñhî«9Ðèp€Õh”ø +4÷Õh”ø +4÷Õh”ø +4÷Õht¸ ÀÇj4J|„ûj4J|„ûj4J|„ûj4:\àc5%¾ Â}5%¾ Â}5%¾ Â}5¾ŒÏÕh”ø +4÷Õh”ø +4÷Õh”ø +4÷Õht¸ ÀÇj4J|„ûj4J|„ûj4J|„ûj4:\àc5%¾ Â}5%¾ Â}5%¾ Â}5®@𱚍_ᾚ_á¾Ò¾DÛf4:ZØc5%¾ Â}5%ý{ AðçÅh”ð +4ˆöÕht¸ ÀÇj 4Jûhm›9Ð(éhí«9Ð(ñhî«1Ðèìhí›9Ð(éhí«9Ð(ñhî«1Ð(ík A´mæ@££h€=Vs Qâ+Ð ÜWs Qâ+Ð ÜWs Qâ+Ð ÜWs Ñá +4«9Ð(ñhî«9Ð(ñhî«9Ð(ñhî«9Ðèp€Õh”ø +4÷Õh”ø +4÷Õh”ø +4÷ÕhTø42>Ws Qâ+Ð ÜWs Qâ+Ð ÜWs Qâ+Ð ÜWs Ñá +4«9Ð(ñhî«9Ð(ñhî«9Ð(ñhî«9Ðèp€Õh䒠 +4èB×sŸ.t<éJßú…œç÷Ëñóå»h¬S+ÐxžÆø#ÑǏ˿çõ»[Áïq¼üª÷ò0Å8Ç·ß~N‰—Ô¹O·œDûòœ__¿þÞü΅îà×ӈûêüõp<ý‰¢Ã¯§÷ÕøûáõåôÚâ×ӈûê}üùòvžŸÛǾN>Và—·sznû:¸¯>À/oçë½Küzq_}€_ÞÎÓùÔâ×ӈûêÿ_ÙݬVš¤W¾퉐R©¿;ðÄ`0ô¼±ÓvAö•Ù†¾û–ÊŠG;tÞµjþ±WÔ§¢tTœ‡ø<þõîæöåÁ¾öõ4ŏÕ+ñû›‡çGûÚ×ÓïÕ+ñǛۧ'ûÚ×ÓïÕ+ñ盇Ç'ýÚߟÆx¯^¹rìõ§óðö‰BÅ×Ó?V¯Ä_:__ìk_Oc¼W¯Äßïd“ñuÓÅ{u¾éMÆ×MoïÕù¦7ÏMo?Vç›Þd|ÝôFñ^oz“ñuÓÅ{u¾éMÆ×MoïÕù¦7ÏMo?Vç›Þd|ÝôFñ^oz“ñuÓÅ{ ±‹C¼W«ø†ÄsüXHìâÄïU€Ä.H ñ^HìâÄïU€Ä*¾!ñ?V»x 1Ä{ ±‹C¼W»x 1Ä{ ±‰_@â1~®$vñ@bˆ÷*@b$†x¯$vñ@bˆ÷*@bߐxŽ«3$ví‰!]›‰]:Ú½ +Øʼn!Þ«3$Ví@â9ݛ‰]:Ú½ +Øʼn!Þ«3$ví‰!]›‰UzCâ¹}¬$vñ@bˆ÷ê ‰]{AbH×&@b—$†v¯$Vñ ‰çø±:Cb×^Òµ Ø¥‰¡Ý«‰]<â½ +XÅ7$žãÇ*@b$†x¯$vñ@bˆ÷*@b$†x¯$Vñ ‰çø± +Øʼn!Þ«‰]<â½ +Øʼn!Þ«‰U|Câ9~¬$vñ@bˆ÷*@b$†x¯$vñ@bˆ÷*@bߐxŽ«‰]<â½ +Øʼn!Þ«‰]<â½ +XÅ7$žãÇ*@b$†x¯$vñ@bˆ÷*@b$†x¯$6ñ H<ÆÏU€Ä.H ñ^HìâÄïU€Ä.H ñ^H¬âÏñc ±‹C¼W»x 1Ä{ ±‹C¼W«ø†ÄsüXHìâÄïU€Ä.H ñ^HìâÄïU€Ä*¾!ñ?V»x 1Ä{ ±‹C¼WgHìÚ Cº6«ô†ÄsûXHìâÄïÕ»ô;$†ðÇE€Ä.H é^H¬âÏñcu†Ä®½ 1¤k ±KC»W»x 1Ä{u†ÄªH<§{ ±KC»W»x 1Ä{u†Ä®½ 1¤k ±JoH<·U€Ä.H ñ^HìâÄïU€Ä.H ñ^H¬âÏñc ±‹C¼W»x 1Ä{ ±‹C¼W«ø†ÄsüXHìâÄïU€Ä.H ñ^HìâÄïU€Ä&~‰Çø¹ +Øʼn!Þ«‰]<â½ +Øʼn!Þ«‰U|Câ9~¬$vñ@bˆ÷*@b$†x¯$vñ@bˆ÷*@bߐxŽ«‰k!1hAâËÝ}y¼‰‡#ýnHütwóxûøx=µ ñ×wHü‡¹»»ûço¿þòßÿ÷o¿þø˟OÄúöÿœÞ¾Îz:ßãÓóõ«Ý6éϺIïåaÒûɁ&Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Ò«â›ôÎñcH¯‹‡ôB¼WôºxH/Ä{H¯‹‡ôB¼Wôªø&½süXÒëâ!½ïU ½.Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Ò«â›ôÎñcH¯‹‡ôB¼WôºxH/Ä{H¯‹‡ôB¼Wôšøéãç*^é…x¯éuñ^ˆ÷*^é…x¯éUñMzçø±:“^×^¤Òµ ¤×¥Cz¡Ý«@z]<¤â½:“^ÕéÓ½ ¤×¥Cz¡Ý«@z]<¤â½:“^×^¤Òµ ¤W¥7éÛÇ*^é…x¯Î¤×µé…tméué^h÷*^ߤwŽ«3éuíEz!]›@z]:¤Ú½ +¤×ÅCz!Þ«@zU|“Þ9~¬éuñ^ˆ÷*^é…x¯éuñ^ˆ÷*^ߤwŽ«@z]<¤â½ +¤×ÅCz!Þ«@z]<¤â½ +¤WÅ7éãÇ*^é…x¯éuñ^ˆ÷*^é…x¯éUñMzçø± +¤×ÅCz!Þ«@z]<¤â½ +¤×ÅCz!Þ«@zU|“Þ9~¬éuñ^ˆ÷*^é…x¯éuñ^ˆ÷*^¿ ½cü\Òëâ!½ïU ½.Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Ò«â›ôÎñcH¯‹‡ôB¼WôºxH/Ä{u&½®½H/¤kH¯JoÒ;·U ½.Ò ñ^I¯K¿“^\ÒëÂ!½îU ½*¾Iï?VgÒëڋôBº6ôºtH/´{H¯‹‡ôB¼WgÒ«Ú!½sº7ôºtH/´{H¯‹‡ôB¼WgÒëڋôBº6ôªô&½sûXÒëâ!½ïU ½.Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Òkâ¤wŒŸ«@z]<¤â½ +¤×ÅCz!Þ«@z]<¤â½ +¤WÅ7éãÇ*^é…x¯éuñ^ˆ÷*^é…x¯éUñMzçø± +¤w¤¨Žôé½<Ðݗ§ë¤w8ÒAz€ô><¿þ¶!Ñûþнï ÷Çßüüö§›ï¿üøùoß~þï_þëÇg¶íöéí[ë»óÉ[|~y¸z7w›NºµÛÅQìvžf²nc¹7Aº©r Û\®M`nªå6—kŒ›*‡¸ÍåÚàfÊÛ·åÞݦÊÁms¹6¶©rdÛ\®MpmªÖ6—kP›)oÓ6–{D›*´ÍåÚΦÊÑls¹6Á²©r(Û\®M€l¦¼ÛXîMPlªÄ6—k›*G°ÍåÚ¿¦Êáks¹6¯™ò¶kc¹7A®©ràÚ\®M`kªµ6—k̚*‡¬ÍåÚ°&Ê^m*› ÕT9Xm.×&P5UŽT›Ëµ NM•ÃÔærmR3åmÔÆroÎBM…P›»§©ntÚ®M°iªš6—ks†i&—6vkTšê¥ÍáÚ’¦Êis¹6g¦Â‹£Íݏ‹€ÑLw[´1ܛ ÑT9m.×æÌÐTx)´¹ûq šê† ÍáÚ€fÊ۟åޜõ™ +/|6w?.=SÝȳ9\›àÎT9ìl.×& 3SÞæl,÷&ˆ3U8›Ëµ ÜL•£Íærm‚5SåP³¹\›ÍLy;³±Ü› ÌT9Èl.×&3UŽ0›Ëµ ¾L•ÃËærm.3åmËÆro‚,SåÀ²¹\›ÀÊT9ªl.×&˜2U)›Ëµ  Ì”·'˽ šL•ƒÉærm%SåH²¹\›àÈT9Œl.×& 2Sކl,÷&2U ›Ëµ |L•£Çærm‚Såб¹\›ÇDùMåcԘ*ÍåÚ2¦Êcs¹6Á‹©r¸Ø\®MÀb¦¼­ØXîMbª(6—k˜˜*G‰ÍåÚ#¦Ê!bs¹6ˆ™òöac¹7A‡©rpØ\®M aª6—k\˜*‡…ÍåÚfÊۄåÞ¦Êas¹6ƒ©r4Ø\®Íق©ð¢`s÷ã"@0ÓÝl ÷&(0U›Ëµ90Õ}`sõÃø/U ÿš»µ ø˔·ý˽9Ë/^ðkî~\ö¥ºQ_s¸6Á|©rÈ×\®Í|™p¼×Ø­EÐ^ªì5‡k¨—*GzÍåڜ— +/æ5w?.ò2Ým¼Æpo‚ðR对\›À»T9ºk.×&Ø.UíšËµ °Ë”·ë˽ ªK•ƒºærméR刮¹\›à¹T9œk.×&`.Sޖk,÷&H.UäšËµ ŒK•£¸ærm‚áR容\›¸DùÂoMåcô–*oÍåÚº¥Ê‘[s¹6Ám©rØÖ\®M@[¦¼ÍÖXîM[ª°5—k¸–*GkÍåÚ«¥Ê¡Zs¹6j™òvZc¹7Ai¼H!­ù4Ëh]œæîËóu¢uý<¿ûÒÅõ’™h­§–Ñzüh´þô›Ïú×oßÿz2×O¼Ïoïð"ôÉ¥‹¯ÿæ_!ZJGÝRêò¬•úä<“•‚x¯‚–rñp)ˆ÷*€)˜‚x¯‚™Rñ¦æø± +lÊÅ㦠ޫ §\é×þþ4Æ{õÊíOëz,ߗnÍñc.Ýrñ\ºñ^…K·\<—nA¼WáÒ-Ï¥[ïU¸tKÅ÷¥[süX…K·\<—nA¼WáÒ-Ï¥[ïU¸tËÅséÄ{.ÝRñmçø± +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÅc!Þ«`U|Ç9~¬‚qtñGˆ÷*Gq„x¯‚qtñGˆ÷*GßÆqŽ«`]<Æâ½ +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÄ/Œã?WÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£Šoã8ǏÕÙ8ºö2Ž®M0Ž.ãí^ãèâ1ŽïÕÙ8ªvŒãœîM0Ž.ãí^ãèâ1ŽïÕÙ8ºö2Ž®M0Ž*½ãÜ>VÁ8ºxŒ#Ä{u6Ž®½Œ#¤kŒ£KÇ8B»WÁ8ªø6ŽsüX£k/ãéÚãèÒ1ŽÐîU0Ž.ãñ^ã¨âÛ8ÎñcŒ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ªø6ŽsüXãèâ1ŽïU0Ž.ãñ^ãèâ1ŽïU0Ž*¾ã?VÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£Šoã8ǏU0Ž.ãñ^ãèâ1ŽïU0Ž.ãñ^ã¨âÛ8ÎñcŒ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8šø…qãç*Gq„x¯‚qtñGˆ÷*Gq„x¯‚qTñmçø± +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÅc!Þ«`U|Ç9~¬‚qtñGˆ÷*Gq„x¯‚qtñGˆ÷*GßÆqŽ«`]<Æâ½ +ÆÑÅc!Þ«³qtíe!]›`Uzǹ}¬‚qtñGˆ÷êh]úÝ8Bøã"GŽq„t¯‚qTñmçø±:G×^ÆÒµ ÆÑ¥c¡Ý«`]<Æâ½:GՎqœÓ½ ÆÑ¥c¡Ý«`]<Æâ½:G×^ÆÒµ ÆQ¥·qœÛÇ*Gq„x¯‚qtñGˆ÷*Gq„x¯‚qTñmçø± +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÅc!Þ«`U|Ç9~¬‚qtñGˆ÷*Gq„x¯‚qtñGˆ÷*G¿0Žcü\ãèâ1ŽïU0Ž.ãñ^ãèâ1ŽïU0Ž*¾ã?VÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£Šoã8ǏU0ŽγÆ´Œãåîîo¯ÇáH¯£_?š¿}/)8ã³Çžînžîû}|ó|÷ø’£Ýß^íþþÿPë©·“ýßÕs]l­Þ?Ml­—endstream +endobj +817 0 obj << +/Type /Page +/Contents 818 0 R +/Resources 816 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R ] +>> endobj +820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 707.1283 240.8357 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributes) >> +>> endobj +821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 707.1283 538.9788 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributes) >> +>> endobj +822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 692.2392 260.5119 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributeTypes) >> +>> endobj +823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 692.2392 538.9788 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributeTypes) >> +>> endobj +824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 681.2254 254.8727 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceInstantiations) >> +>> endobj +825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 681.2254 538.9788 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceInstantiations) >> +>> endobj +826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 668.274 205.0603 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlices) >> +>> endobj +827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 668.274 538.9788 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlices) >> +>> endobj +828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 655.3226 226.1909 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceTicket) >> +>> endobj +829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 655.3226 538.9788 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceTicket) >> +>> endobj +830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 642.3711 208.5374 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlivers) >> +>> endobj +831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 642.3711 538.9788 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlivers) >> +>> endobj +832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 627.482 223.8798 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:NotifyPersons) >> +>> endobj +833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 627.482 538.9788 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:NotifyPersons) >> +>> endobj +834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 616.4683 217.2351 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:RebootNode) >> +>> endobj +835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 616.4683 538.9788 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:RebootNode) >> +>> endobj +836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 603.5168 215.561 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:RefreshPeer) >> +>> endobj +837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 603.5168 538.9788 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:RefreshPeer) >> +>> endobj +838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 590.5654 226.9482 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:ResetPassword) >> +>> endobj +839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 590.5654 538.9788 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:ResetPassword) >> +>> endobj +840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 575.6763 254.325 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:SetPersonPrimarySite) >> +>> endobj +841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 575.6763 538.9788 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:SetPersonPrimarySite) >> +>> endobj +842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 562.7248 228.2933 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddress) >> +>> endobj +843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 562.7248 538.9788 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddress) >> +>> endobj +844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 549.7734 252.9508 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddressType) >> +>> endobj +845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 549.7734 538.9788 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddressType) >> +>> endobj +846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 536.822 236.0541 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateConfFile) >> +>> endobj +847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 536.822 538.9788 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateConfFile) >> +>> endobj +848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 523.8706 216.8267 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateKey) >> +>> endobj +849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 523.8706 538.9788 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateKey) >> +>> endobj +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 510.9191 235.4862 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateMessage) >> +>> endobj +851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 510.9191 538.9788 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateMessage) >> +>> endobj +852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 497.9677 247.6609 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeGroup) >> +>> endobj +853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 497.9677 538.9788 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeGroup) >> +>> endobj +854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 485.0163 256.9658 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeNetwork) >> +>> endobj +855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 485.0163 538.9788 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeNetwork) >> +>> endobj +856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 472.0648 222.2064 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNode) >> +>> endobj +857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 472.0648 538.9788 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNode) >> +>> endobj +858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 459.1134 220.0046 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePCU) >> +>> endobj +859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 459.1134 538.9788 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePCU) >> +>> endobj +860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 446.162 218.3308 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePeer) >> +>> endobj +861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 446.162 538.9788 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePeer) >> +>> endobj +862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 433.2105 227.7454 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePerson) >> +>> endobj +863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 433.2105 538.9788 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePerson) >> +>> endobj +864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 420.2591 216.1289 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSite) >> +>> endobj +865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 420.2591 538.9788 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSite) >> +>> endobj +866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 407.3077 256.3276 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttribute) >> +>> endobj +867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 407.3077 538.9788 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttribute) >> +>> endobj +868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 394.3562 276.0038 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttributeType) >> +>> endobj +869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 394.3562 538.9788 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttributeType) >> +>> endobj +870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 381.4048 220.5523 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSlice) >> +>> endobj +871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 381.4048 538.9788 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSlice) >> +>> endobj +872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 368.4534 223.8699 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:VerifyPerson) >> +>> endobj +873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 368.4534 538.9788 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:VerifyPerson) >> +>> endobj +874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 355.5019 249.0747 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:system.listMethods) >> +>> endobj +875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 355.5019 538.9788 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:system.listMethods) >> +>> endobj +876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 342.5505 251.2768 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodHelp) >> +>> endobj +877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 342.5505 538.9788 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodHelp) >> +>> endobj +878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 329.5991 270.096 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodSignature) >> +>> endobj +879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 329.5991 538.9788 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodSignature) >> +>> endobj +880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 316.6476 237.4483 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:system.multicall) >> +>> endobj +881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 316.6476 538.9788 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:system.multicall) >> +>> endobj +819 0 obj << +/D [817 0 R /XYZ 71.731 729.2652 null] +>> endobj +816 0 obj << +/Font << /F29 532 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +915 0 obj << +/Length 1659 +/Filter /FlateDecode +>> +stream +xڝX[“£D~Ÿ_ÁcR5´}åâÛ8¥³««¦œXZåú@€L( D.;ο÷4twšK`´¶fðqîç;ˆƒáq|‚|"ê êÄç;ì¼À­§;¢ Üó㋙»®`> +ê9®-ä›ýÝWßQâPŒ<g4ª0C”yÎ>ùcóxŠ.MZm]ê‚úãÇ¢©¶oʤ›¬,¶î¿Y¡¢Ð= Šû( Øw\"ƨè„íO)x³Ë£"m>E‡þò1QÞ_<ì>ö'Ÿ±À»Op g¤ÿ-«ûc£%eXwܼ‰âTß«ÊöåÔ_¼ž²ø4zfI{5Ñ!ªSéDÏ%…‚ðÎüúT¶yÒãJVÇi]§êרP'ç ƒ¿4AýÆuãžv¥5OÞF†¾¦‡:kÒûáí¢LÒzô[Ô6å9j´¤:®²K£AÒª;}6ô³`@¥ÃZÚ^|j/öcYB™üu(Ûƒw?µUºbÎó,Nmûº“<¯úSÈIÖdi=ç\^&qÓIDª0‰C|D‰à²2]Sš\@×pÖÉ H÷ց ,ˆ£Õò¦(ð=XÞ&Çëó%‹ú“ßüäþ²{TØ±ù"ÿÓñø°ßïžoÖRÝ^.eՌ›£n ´Q•˜V©Êú’š–Ç1Žò¼–7î¾Ýö #†wcà>¸:G1åÚ°žbì¸M¥uõV7éåYÝü˜6§2™XA!‚‚ŒE+ jŊ©4iÅýD)¥H`®(Õ¨5¥i–ëçÎíç쥈š¶Jǖ0 iŸC©.ZbP+–L¥õîÛd1ÐÎ)ò0]Ó®QkÚ'Ò&qøæ—±ÂO‰e# jň©´Q–é5ñ)+^ºr¦ˆû$˜öÒ¤•˜‡8 ˆ#(A˜6ßJåÚ°™VšH³ãØ撽¦6P,ÇÁ² µbÃTš´AÑÔo[¤ÓŒ§o*iíŸ8½\‡Gy4˜Z¡:.ÒùÈÕpî·  ‹þ’ €æ׌D›ÃU+ØXTƒ9n™óB2Ì\teѬқ¦U­Æ[TmI°yiÏ \yú  \Ô©äVéßmV¥ã +^ΤûQˆK7zXà²J»ùň‡˜å²'Í}•=iΌ)Á^  Êڏ×h« +ö1‚í‘׃¤Œ;-{`æ+?¯9P·Ôӱ­®ã¼sï8žÓ‹áº7àÂ$*çmX2rI<È]Toe‘¿]÷EíãhÒˬårŸö½ù6×(׆郅ÝǤkó‰4éÀgJÅD/pã„Îê¯vè§fí°è^ |lhÇ3¬2×pBUm¿Ö¦z¬^+M ¼]:¦R¡ý"ÓåY2*9Êû#lTU­dÿÛå¢ì‘°ŒË £èÙ©Ñ­z(KÝä?ä:¨ÿÚö^qеD_%÷é7àû°ÿp ?ðè<ýj”kÃfèw"Múð”6:-“5hsY»A­hgŒ ç´·õµ¥ +k¡—ï ÃÖ–‹~1hõëZT÷ìD1AA@†ät‰êúU¼ÔCY×ÉSÑîžæëQŠAsÊÈqo–B9¶èVŽY"àÕ¡çÐúÙQ8\ƒ„m…6=û—`Þ.žo•Ì-aBšŒ×HĆ-ˆ­’ÈœÞwÈœ3$2°c'#0Ièbö`í >ûÏÙëÊFjXO_Ï’½Šè tz„™ËûYêқGêÂûj·y9–P{ÅH’J¾_wõ=_6Ò«ç¦êz)„W‡î‡™ù€‰1sŠû¶Q¼5èž[…Ge{3/\)<¶Px¶ZxszßQxsvÌÞÀŽ®0³k<úÛK^FÉ` (”kÃæ>Œ¥™ƒScÕákª5jM5ìò Ã݁êrªÕ‡bE©­éËê(±û 8ç0# Óeݵ¢|*­/¢ž4ýaÏ'ÿ¿\^Þ?Äû@ˆÀĪ_½r´fÅíp£¨¨ê°#äF_)ˆkaºx0l¿Ë1†0&ÌHê>[Žµ™oý3úþ4¨ã endstream +endobj +914 0 obj << +/Type /Page +/Contents 915 0 R +/Resources 913 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 918 0 R 919 0 R 920 0 R 921 0 R 929 0 R 943 0 R 944 0 R 945 0 R ] +>> endobj +918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3072 530.8136 218.5188 541.7176] +/Subtype /Link +/A << /S /GoTo /D (0:system.listMethods) >> +>> endobj +919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.5076 530.8136 321.7405 541.7176] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodSignature) >> +>> endobj +920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.606 530.8136 423.0197 541.7176] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodHelp) >> +>> endobj +921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.4318 517.8622 203.0171 528.7661] +/Subtype /Link +/A << /S /GoTo /D (0:system.multicall) >> +>> endobj +929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.0771 445.6331 329.9009 456.537] +/Subtype /Link +/A << /S /GoTo /D (0:GetSession) >> +>> endobj +943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.1896 228.1838 456.6551 239.0878] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonKey) >> +>> endobj +944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.9595 215.2324 252.8111 226.1363] +/Subtype /Link +/A << /S /GoTo /D (0:AddPeer) >> +>> endobj +945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.0987 215.2324 312.5665 226.1363] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePeer) >> +>> endobj +623 0 obj << +/D [914 0 R /XYZ 71.731 718.3063 null] +>> endobj +10 0 obj << +/D [914 0 R /XYZ 298.5799 703.236 null] +>> endobj +916 0 obj << +/D [914 0 R /XYZ 71.731 672.5787 null] +>> endobj +624 0 obj << +/D [914 0 R /XYZ 71.731 622.8923 null] +>> endobj +14 0 obj << +/D [914 0 R /XYZ 225.2223 579.7949 null] +>> endobj +917 0 obj << +/D [914 0 R /XYZ 71.731 559.6545 null] +>> endobj +922 0 obj << +/D [914 0 R /XYZ 435.9113 508.0639 null] +>> endobj +926 0 obj << +/D [914 0 R /XYZ 71.731 480.0042 null] +>> endobj +927 0 obj << +/D [914 0 R /XYZ 71.731 478.7588 null] +>> endobj +928 0 obj << +/D [914 0 R /XYZ 129.5143 461.7376 null] +>> endobj +930 0 obj << +/D [914 0 R /XYZ 71.731 433.6779 null] +>> endobj +931 0 obj << +/D [914 0 R /XYZ 71.731 423.7153 null] +>> endobj +932 0 obj << +/D [914 0 R /XYZ 71.731 423.7153 null] +>> endobj +936 0 obj << +/D [914 0 R /XYZ 76.7123 370.9133 null] +>> endobj +937 0 obj << +/D [914 0 R /XYZ 129.5143 352.9806 null] +>> endobj +938 0 obj << +/D [914 0 R /XYZ 71.731 352.881 null] +>> endobj +939 0 obj << +/D [914 0 R /XYZ 71.731 342.9184 null] +>> endobj +940 0 obj << +/D [914 0 R /XYZ 71.731 342.9184 null] +>> endobj +941 0 obj << +/D [914 0 R /XYZ 76.7123 249.2697 null] +>> endobj +942 0 obj << +/D [914 0 R /XYZ 129.5143 231.3369 null] +>> endobj +946 0 obj << +/D [914 0 R /XYZ 71.731 216.2286 null] +>> endobj +947 0 obj << +/D [914 0 R /XYZ 71.731 206.266 null] +>> endobj +948 0 obj << +/D [914 0 R /XYZ 71.731 206.266 null] +>> endobj +913 0 obj << +/Font << /F21 514 0 R /F29 532 0 R /F38 925 0 R /F40 935 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +951 0 obj << +/Length 1378 +/Filter /FlateDecode +>> +stream +xÚ­X[ÓF~ß_a©Ä*žÌÅcé ²¢b+D#µ ÊkO²Ž|!Ъÿ½gn^ß²@U­´vâ3çúïœ˜xþˆ3¸ÐшS/;^a¯ˆ ¬L0z¶»Ú¾`ØKPÑÈÛí½0dˆã8öbF‘àDx»üíæù]zêdã”ã Aæú²ê?ä›:ï³®¨+ÿýŸwƒEÎb”Pû [ƒÔÒ1šŒ#àÇ@”Dˆ iÇÚâP¥]ßH? c²¹®ú××Æ¿Ñ3õ±Þ›kw'•§ 0B„óÐ E '\+ÌÒª®Š,-‹¿d®å°µÀ;Ìñ]םžl·çóُøªŸˆÍa»{³ý|,ƒµƒ +8LŒܼ +Þ¼~>ä—,€Î攡¬>nۓ̴š<5²•U—êz,ÂÖ7 Ñ­gd¦-51õGPØZÉz¦ U¢yá Iç$öx"ˆZ-ü ŒÅ\á1&ºð m:I”ò…]J ]µ;¿ÞûáN­ú1 ÀRæ~<¸ø„o¾ëÞ&)í!=U RUÐÙñ ­B/ !Âqh°ûändwWkœm_„Ø`- + Ü-:±©˜1&´(…`cD ײ–HhÌ¡‡àGQÕ©±Ø¼©KéNŽC +c$(† +¨^£Xû­>ÚâîûJ7¶ë˜~±¸©J{w;‚´‹ùÎ>ë[Ùؓ碻³‚²éÒÂB³Ñné[…ùVÊyE™„”-{ñ¯"i +ÆbË +.µ©x¯e7ägl;¤aJã‡mR_±½Ôf[<¶¨©lþj@O3Oy#È4ÃB¸˜£0&Óf͋½Oùf/€ž9STûº9Ž¨Àu. ³šË“¬ò¢:¸rÏÒ¥ vOg –1 +}äå¸e ²¡œ9èõ(àóUËЪÂI24Æj÷DÆÔzóŒµqŒ씍™º±qjeŸ×~dßÓi{¸ÈS›Kˆ¼Vù=·z»˜hÕP|O°Ê‰0.t  +#@ TÌh½ïj@…n³¦89~oúªZÔ=5å¡ÅjÛg¶ŸÓvV÷guÝÍý« +MßݤUz˜ýŸyœ Ïïªõ·åÒF£Y¾®äOÃ&ˆ×/×hß&ªk`7VcïFoÛe9µª{ñcêL_àÄa2Ã0Qððt‹­Lµ…6=ä¨"‘…Q;£_ñÁI}͇…6ǍhuÜ%ÁšjÃ…IÙiÇì´{Q”jW…r}óÌ»©/ìD3°……4v‚ɱb€1L¬Ìl†véŸàœt–*z9¬×ãµË6Š‰¨½×´iÒ/íÔý¢ê¤ÊÀÁiU`:²…ßGÇu€Rhúa© "¨Ó¾*r…m Ϧµ4P7“0 Øݼ²›èÀ&«±.FKځ/·>…õ¡“í…Ù¢Ôv…{|+{Ù2wYS p>êl|N§Hl•E(A‰Žö?ˆ0p™µwæ6Ó$¦îöMz8êÁ©>¹&ÕneYŸ'Ë9èäshQL¨†&~KÓÇìý·ˆþýHïŸEþè‰1bÏþóŸsLßÿh.ÊÓï”gƒ[³®˜Íÿß}…íË| ú)¦åǾPÜÿIýKËaO1È +ZFóÃÑ.çØÊò“‚Àý|¿o]ÃñH[⃩^éxZW²;×Í~fCDˆ—”€%j[dzùܖE&/h5làîÊփ¸ùUUn +»„Â6ž;j˜vb»øýfßÙ %¾LÉ,ß%pÆ`{!lФœ¦_¬Øû?endstream +endobj +950 0 obj << +/Type /Page +/Contents 951 0 R +/Resources 949 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +/Annots [ 958 0 R 964 0 R ] +>> endobj +958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.946 438.6014 426.0189 449.5054] +/Subtype /Link +/A << /S /GoTo /D (0:GetRoles) >> +>> endobj +964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.5554 354.2926 165.3794 364.8229] +/Subtype /Link +/A << /S /GoTo /D (0:Authentication) >> +>> endobj +952 0 obj << +/D [950 0 R /XYZ 76.7123 592.7771 null] +>> endobj +953 0 obj << +/D [950 0 R /XYZ 129.5143 574.8443 null] +>> endobj +954 0 obj << +/D [950 0 R /XYZ 71.731 572.6875 null] +>> endobj +955 0 obj << +/D [950 0 R /XYZ 71.731 562.7249 null] +>> endobj +956 0 obj << +/D [950 0 R /XYZ 71.731 562.7249 null] +>> endobj +625 0 obj << +/D [950 0 R /XYZ 71.731 519.8856 null] +>> endobj +18 0 obj << +/D [950 0 R /XYZ 152.1087 474.6313 null] +>> endobj +957 0 obj << +/D [950 0 R /XYZ 71.731 454.4909 null] +>> endobj +959 0 obj << +/D [950 0 R /XYZ 71.731 406.721 null] +>> endobj +960 0 obj << +/D [950 0 R /XYZ 137.5342 395.9264 null] +>> endobj +961 0 obj << +/D [950 0 R /XYZ 178.4208 395.9264 null] +>> endobj +962 0 obj << +/D [950 0 R /XYZ 427.4646 395.9264 null] +>> endobj +963 0 obj << +/D [950 0 R /XYZ 119.5517 370.0235 null] +>> endobj +626 0 obj << +/D [950 0 R /XYZ 71.731 354.0435 null] +>> endobj +22 0 obj << +/D [950 0 R /XYZ 156.6362 310.5725 null] +>> endobj +965 0 obj << +/D [950 0 R /XYZ 71.731 290.4321 null] +>> endobj +966 0 obj << +/D [950 0 R /XYZ 167.9796 277.6957 null] +>> endobj +967 0 obj << +/D [950 0 R /XYZ 71.731 252.6248 null] +>> endobj +968 0 obj << +/D [950 0 R /XYZ 71.731 187.0522 null] +>> endobj +969 0 obj << +/D [950 0 R /XYZ 432.4945 175.2798 null] +>> endobj +970 0 obj << +/D [950 0 R /XYZ 119.5517 162.3284 null] +>> endobj +627 0 obj << +/D [950 0 R /XYZ 71.731 159.2998 null] +>> endobj +949 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F40 935 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +974 0 obj << +/Length 1461 +/Filter /FlateDecode +>> +stream +xڝioÛ6ô{~…×}ˆD´¨[\,K.ƒ“¶‹mHƒA‘i›ˆ®’ÒcØßã!ùˆêµC‘šz|÷ɇ{üý£À;B¶ïÙ½$;³z+¸úx†5Š©qÌ}¤ŸçgƒÇêE(òm¿7_ö\×Až½À±Qèá°7_<ö¯×qYf˜¶gõ1R¿·yÅ ×ë‹:©h‘Oó_ÏFóV¢ç( +íIµZ¬·ŠÙ¸‡dcÏš56Z>Â8ˆ¤^¹B™ ìOÒ8'Õ8~VŸ|MÒT(\¢}óÚVÐ3…uH.Wʞ¤È²8_˜)͉‚”¬X±8Ó×qš’…æîñÄÀËöììÜÊ4áëѶ‹|'°5§Y™Òϖe®øÇuµ&yE“X:SÂxÅÀ·5Óú¬A=Ðnu¡)ò…:PÍ¢ædY§ê¼,˜P¢gbÏGaEp²QäaWÉO-+ृ9_7LŒn€ +ªÐgÃ!ÑbãFsõ3¦yýªŽÓÉ݁Óäy2¾¾šÜ©Îȗš²Æ“mµV‰4¸EwÎs|a×uµ÷>[¶×áânj[ä†Äq­^8¾L#Ó ,FŽÝ3mŒ|¬©æñŠ\¦oY:€òøX”"üIºÒ9Øö$¾»”wØBAc`êùŽÄ0—ŠÍõÃýÍíÇ õašI‘/éj¨ Š‡Èñ||HS$Š f:3hIS¢ãÛIkj >Mǭܚ¥Cø6Lǂo Ò˜wÀ!ÑÊ_]¦óòqBX5TÐÊ·ìg³±¶èèRä÷iÍ_úíýltýi:j%Ӝ“jaØܜþ¡PTyQiák’¼üO…2…~7šÿòð¡U'#«‹¡‚~‹#Ž \À““Ò¹Öz4›Ý>Ü·â9áØ 5ü[Ð$êã…lOŠ­urÌFÓ]q†b@/ÙO!q¡g¤3›Ju?¹šÍ~{˜îÜXƜo +¶67ßbICtÒ­Ñôa¼Ë!V¤d( Lj‹N½_[Ú×,e¥* +ð ' +þûÝ؜Nt¡Ò¦ä*¤“• C ÜÉX¬‹¢©dç'u­Ò‚‹†¤óFôJq ¯´êèzfÛ{\yŽ6+IB—[Ým+õ›’˜ë#¤¢:´-Yv†ƒÞ¼-jÖ}ñ½ìh«–n§a´7w}GXU%¿ 6› *åÀ6Óøl5PÃa Iê]ZýÄiEYÔ–[&ÿa`lõ‹Z)º¡©ž„Ïí4'ê¯GZ­æ ¾¬¬ô<¼=t #­Cš±¦4Í ×êÿ%æbñb€øc¯ŠȏüZdô8 +G½¡ÉžýÝ<.‡oÃê­½âq±›¾4o%Y,$¥éÖð½>:Íf8™H9I¤/U à%qTš]=¯£*æÛRçù;¾åÉP +o;Ùùg˳à¿S….éw¢RĝjŸ{Ë%+ij€™”ºx<0ïéýû÷Šî +T¿S£Q¢‹Ǐ¤º/DZõˆmü¤[Ëãyà?éâ\ÎׯD¥?}Mðãß-‘~¶Ã7äúê\Ԛ‰QÂQÉhž +úÿóôŸ¥uś|=ùJŒ!AeZ헕~Óé$„þu(v ¨›ã²ÊbMš0"†²> endobj +26 0 obj << +/D [973 0 R /XYZ 231.5225 706.1179 null] +>> endobj +975 0 obj << +/D [973 0 R /XYZ 71.731 685.9775 null] +>> endobj +976 0 obj << +/D [973 0 R /XYZ 251.8044 673.2412 null] +>> endobj +980 0 obj << +/D [973 0 R /XYZ 71.731 648.1703 null] +>> endobj +981 0 obj << +/D [973 0 R /XYZ 71.731 385.6198 null] +>> endobj +982 0 obj << +/D [973 0 R /XYZ 71.731 360.5489 null] +>> endobj +983 0 obj << +/D [973 0 R /XYZ 71.731 319.4679 null] +>> endobj +984 0 obj << +/D [973 0 R /XYZ 71.731 281.4456 null] +>> endobj +985 0 obj << +/D [973 0 R /XYZ 71.731 182.0831 null] +>> endobj +986 0 obj << +/D [973 0 R /XYZ 71.731 134.0981 null] +>> endobj +987 0 obj << +/D [973 0 R /XYZ 148.0846 123.3035 null] +>> endobj +988 0 obj << +/D [973 0 R /XYZ 291.6145 123.3035 null] +>> endobj +989 0 obj << +/D [973 0 R /XYZ 71.731 111.1841 null] +>> endobj +972 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F28 527 0 R /F14 979 0 R /F40 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +992 0 obj << +/Length 596 +/Filter /FlateDecode +>> +stream +xÚ¥T]o›0}ϯ@é‰T æ›I“¶v[•i›ª5oYT¹àKÆfØ4ê~ýlLiX4iâËññ¹ç^_ -O=ÐJ Hõò3àǑoåÕ̳öjén{ŠÓsœ1éf=s?ž•,öck½³Â0‘—$Vø `j­‹Íâ¶DµÄÍÒñ#oy¯˜l–a´àE›KÂÙr»þ<û¸2FA²TÉ^´5°Î…ž•*cq¨A˜(‚‰g1ˆÓ$쌑ªæ\:±ç-ċД¬ã €º E¹2«ðµ´§Rž£Îr÷%K$6Áý—Û÷÷+¿ÿj„D”Šs® rŠÄ`BGqÐYPÎ@d P]cVüð"Ïv[Ѹ¢D vkš?¢šØ +‡*X1" ¢äWŸW”˜RböLÎ*Ì$0ȃ^ԉ:Ñ:#½À;ÂztÇ%WX–¼˜¬åê؋W]5ÎɎàÂ|2TaQ£¼_ÕN ㅰ½Áö”?!*þŤÊR]0c”è‹–S¼]ë¡Jðð§qãù1ðÄnu>†ñöUo_UpÝmŽC5§Iz*Ñ6ôDb^JY‹7®{8@MÃÒ¡è ðfpç×S^Z¡ñ’FÞ "1ÀE;½©VsyàMqºñˆÎ‡¹sïfü¢q“o¸,û‘iúcÁ?[òŒ¨šº©¬ŒXœ¤¼Ãò›uÃ6ЇÛkƒolÍ}$…ÝvɅÔ#doÇ?ÅeuuLà2Œï®þ² SÂ8»xŸŽ8ç×iÀó`0(iëá_oʉ|¿ endstream +endobj +991 0 obj << +/Type /Page +/Contents 992 0 R +/Resources 990 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +990 0 obj << +/Font << /F30 622 0 R /F40 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +995 0 obj << +/Length 890 +/Filter /FlateDecode +>> +stream +xÚ½W]›8}Ÿ_Ác"-®?ðW*¥Ý¶Új·UyëT#œRF@Tí¿ï56Ä †¤Òj5Àøúžããsí’`ø#‰$H2xP¨à4Ù=ßáä }¼#>$QN|DFSÎ$ҊŠ$ “¼ÝÞ½ú@IB1\ñd»¡0C”‰d[|]½{Ê_:Ó¬S*Պ"÷¼?ä•éþο»ÏÍý_îåÓ=ÕE»þ¶ýÔ§&QÂ3›8A‚Ù/HKñ¹6ŚàUáiÛíZàÕ¿/ƧщFZ{ȒI¤(–IÊ(RRÈ>×}Swu^3Ì=®Ÿ›R'J÷6Ày(å RÊñêsœ»§?ÜgîbmêÇŒ©9-бtÀ ‰ýiÚ]S¾te]-QcqAGj­GwÊ¬)_ý,-ä^?”–š{o_Ì®ìÙîeµ°?ÔxŽ­)¥j÷‹Ø/élðÅtǦŸÌ<9—¿,N’¾q¯¸—ÎQÚ{®Çݦì/ùޚ ?:TTó³l ºUóÍáP÷¤†å©¦½Õyñ rÝu¿&¤ËŸ ˆƒ¸{¿ˎ8'2aʖS´pÓ1( ¢\eêªVbbñ'¹,þ¥|J)b¡1ÐËç‰Ä0iB‚©@0‡';#aë%"ͶùmÈk¿Ù]sÜu~£Ý‘a]óMՕ»Ü–IylÌtuÁÕzFÓ!* ÃN¢{Ɲ­g›U¶ÓLGqçefMyœëÊ4ʤ<§±]ÜqQ—Cef2›è[V?}#²>»t®„ë±àç} údŒÉkÆ Â–œ;„]·n÷ï^ò˜1oÈãìÌÚ»St*7Á’X²˜Ÿç-Jâ Á‡ž¢– ꣮ûs +z‹=/HÄÝp¨à̛)z¬õ’-//°Yù¨fp+ªk†-8†]U0†{ƒ„Q Ïh§î ¢¥€[I(ù[Zöoi“TÁ¾é º@ŒÖYxÏßYԖ•m֖k? [¨ý1ìjíÇpo¨ý ~G„<Êj¸Œ>ÿgmL¬óM¹DR1Öïe\ú˜^m€ûî´þǎxÀ<¶Ô—ÅcÝ<Úsáb´,†Ž9ÜoÿC#SH¡£&ó!iã + ‡!cpä6f²‹™¸küýÁû_ð$Õendstream +endobj +994 0 obj << +/Type /Page +/Contents 995 0 R +/Resources 993 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +628 0 obj << +/D [994 0 R /XYZ 71.731 718.3063 null] +>> endobj +30 0 obj << +/D [994 0 R /XYZ 408.0688 703.236 null] +>> endobj +996 0 obj << +/D [994 0 R /XYZ 71.731 672.5787 null] +>> endobj +629 0 obj << +/D [994 0 R /XYZ 71.731 672.5787 null] +>> endobj +34 0 obj << +/D [994 0 R /XYZ 246.3801 631.6006 null] +>> endobj +997 0 obj << +/D [994 0 R /XYZ 71.731 608.1118 null] +>> endobj +998 0 obj << +/D [994 0 R /XYZ 161.0655 598.7239 null] +>> endobj +999 0 obj << +/D [994 0 R /XYZ 71.731 586.6044 null] +>> endobj +1000 0 obj << +/D [994 0 R /XYZ 71.731 555.2385 null] +>> endobj +1001 0 obj << +/D [994 0 R /XYZ 168.8063 544.2282 null] +>> endobj +1002 0 obj << +/D [994 0 R /XYZ 71.731 517.1648 null] +>> endobj +1003 0 obj << +/D [994 0 R /XYZ 71.731 500.7429 null] +>> endobj +1004 0 obj << +/D [994 0 R /XYZ 71.731 469.1613 null] +>> endobj +1005 0 obj << +/D [994 0 R /XYZ 181.5683 458.151 null] +>> endobj +1006 0 obj << +/D [994 0 R /XYZ 71.731 448.0889 null] +>> endobj +1007 0 obj << +/D [994 0 R /XYZ 71.731 416.5173 null] +>> endobj +1008 0 obj << +/D [994 0 R /XYZ 71.731 403.5559 null] +>> endobj +1009 0 obj << +/D [994 0 R /XYZ 71.731 402.3105 null] +>> endobj +1010 0 obj << +/D [994 0 R /XYZ 129.5143 383.232 null] +>> endobj +1011 0 obj << +/D [994 0 R /XYZ 129.5143 383.232 null] +>> endobj +1012 0 obj << +/D [994 0 R /XYZ 71.731 381.7924 null] +>> endobj +1013 0 obj << +/D [994 0 R /XYZ 71.731 381.7924 null] +>> endobj +1014 0 obj << +/D [994 0 R /XYZ 139.477 365.2992 null] +>> endobj +1015 0 obj << +/D [994 0 R /XYZ 139.477 365.2992 null] +>> endobj +1016 0 obj << +/D [994 0 R /XYZ 76.7123 347.3665 null] +>> endobj +1017 0 obj << +/D [994 0 R /XYZ 129.5143 329.4337 null] +>> endobj +1018 0 obj << +/D [994 0 R /XYZ 129.5143 329.4337 null] +>> endobj +1019 0 obj << +/D [994 0 R /XYZ 71.731 328.053 null] +>> endobj +1020 0 obj << +/D [994 0 R /XYZ 71.731 328.053 null] +>> endobj +1021 0 obj << +/D [994 0 R /XYZ 139.477 311.501 null] +>> endobj +1022 0 obj << +/D [994 0 R /XYZ 139.477 311.501 null] +>> endobj +1023 0 obj << +/D [994 0 R /XYZ 71.731 309.3442 null] +>> endobj +1024 0 obj << +/D [994 0 R /XYZ 139.477 293.5682 null] +>> endobj +1025 0 obj << +/D [994 0 R /XYZ 139.477 293.5682 null] +>> endobj +1026 0 obj << +/D [994 0 R /XYZ 71.731 255.7102 null] +>> endobj +1027 0 obj << +/D [994 0 R /XYZ 71.731 242.6592 null] +>> endobj +1028 0 obj << +/D [994 0 R /XYZ 71.731 241.4139 null] +>> endobj +1029 0 obj << +/D [994 0 R /XYZ 129.5143 222.3354 null] +>> endobj +630 0 obj << +/D [994 0 R /XYZ 71.731 215.1972 null] +>> endobj +38 0 obj << +/D [994 0 R /XYZ 334.7464 172.0997 null] +>> endobj +1030 0 obj << +/D [994 0 R /XYZ 71.731 148.611 null] +>> endobj +1031 0 obj << +/D [994 0 R /XYZ 161.0655 139.223 null] +>> endobj +1032 0 obj << +/D [994 0 R /XYZ 71.731 127.1035 null] +>> endobj +993 0 obj << +/Font << /F21 514 0 R /F29 532 0 R /F38 925 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1035 0 obj << +/Length 924 +/Filter /FlateDecode +>> +stream +xÚÍW]o›0}ï¯à±‘Š‡mlCßÒ}©Ó&U]ÞÖ)¢Ám‘ˆÀ¨Ú¿ßu0Äó!íeê„ûŽÏµ/Ø à{#AáBbD8#Þîpx¯ð¯¯WØ@|ƒñmÐÝæêÃx1Š9áÞæÅ£1GL„ž E GÞ&ýuýñ-9*Y®|‚k‚šëÃ>É¥úž<7?×÷ÍÍ©ÞŠ´ZýÞ|»ú¼éø(Ž€dRd‡Ê$±%ã1†…'‚ѐŠ“ÎO²Ú•ÙQeE~«ùOƒ"ÄC=È ÷)¼"‡ÿè!뤞t'¹¹¦i)+óPý9JsW˜ë›yPå.{ +"ÓÞ@¤™ám|Š‹0?Ñ<ܛ ɟæ¦È÷æ®>¦‰’½9¤A/ifì/V„]¿­U¦ä™sÄ©h¥ªËÜLƒ›Kff«êÝH^êýMóàe…ºÞ«–øÊ÷¬’¨sñl½ßÙ ¼q~½ß7ÂZ3‹½¬¦`ÄqÔ,B’²Üh9fK9V˜]'erÍ†Ë\†œÅÎÀu(߆µƒ0Š÷×Á´„'B؀—H$&NÞËëYG;j¨ƒF–}ʂáöu$µzsØFBh ¹5k¯Êz§n.jV—¹Êv‰®Y—rø‚FB QØSœÆ¶(߆Åz3²_¨ƒ ‹0vòŽێêèKc +ї±_šýÌá.ƒr a«¼ô7Ë_[¶šéz{J]ÉÑô†#TõtzmØDz;Ølz]¼ Ò;ÐáNoO‡Ùô¶z³Ýfé¶(·9TµÃrL8"p*ô=Ïreö­Ò^„ñ܆P4ŒçrkÁ¦rÛÂæsëà]’[‡˒6·¶ p¤ û4ËRËÓéUŽûnã€ÌÖ·›ò©…Íûäà]â“C‡Ã'[F¿ZVÕ$D(Ÿ«I6Q“l¶&]¼ jr Ã]“=mMfã;ß° +]F^&Íó9ŒÆàAï07ýÊø)N¡k‹)”þŒçlÊó6﹃w‰çö>Öznë8;8Ú°™Å}ÌN è3Yp£5 Bt£."XÝÞ¥wE¡~*Ýi4„3⢿* Uè:XÚÆÁºŸINŸèÞ¼–ÞÕá^Úáý[?o8å©/5?ŠÔ({¡íarÿóÚN¦ùŽ #ñ䧞…~é1à19Ϥ5ðÑÏ6ß_ ÛV8endstream +endobj +1034 0 obj << +/Type /Page +/Contents 1035 0 R +/Resources 1033 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +1036 0 obj << +/D [1034 0 R /XYZ 71.731 729.2652 null] +>> endobj +1037 0 obj << +/D [1034 0 R /XYZ 71.731 741.2204 null] +>> endobj +1038 0 obj << +/D [1034 0 R /XYZ 71.731 718.3063 null] +>> endobj +1039 0 obj << +/D [1034 0 R /XYZ 168.8063 708.3437 null] +>> endobj +1040 0 obj << +/D [1034 0 R /XYZ 71.731 681.2803 null] +>> endobj +1041 0 obj << +/D [1034 0 R /XYZ 71.731 649.9144 null] +>> endobj +1042 0 obj << +/D [1034 0 R /XYZ 71.731 633.2768 null] +>> endobj +1043 0 obj << +/D [1034 0 R /XYZ 71.731 602.3408 null] +>> endobj +1044 0 obj << +/D [1034 0 R /XYZ 181.5683 590.6849 null] +>> endobj +1045 0 obj << +/D [1034 0 R /XYZ 71.731 580.6227 null] +>> endobj +1046 0 obj << +/D [1034 0 R /XYZ 71.731 547.1996 null] +>> endobj +1047 0 obj << +/D [1034 0 R /XYZ 71.731 536.0897 null] +>> endobj +1048 0 obj << +/D [1034 0 R /XYZ 71.731 534.8444 null] +>> endobj +1049 0 obj << +/D [1034 0 R /XYZ 129.5143 515.7659 null] +>> endobj +1050 0 obj << +/D [1034 0 R /XYZ 129.5143 515.7659 null] +>> endobj +1051 0 obj << +/D [1034 0 R /XYZ 71.731 514.3263 null] +>> endobj +1052 0 obj << +/D [1034 0 R /XYZ 71.731 514.3263 null] +>> endobj +1053 0 obj << +/D [1034 0 R /XYZ 139.477 497.8331 null] +>> endobj +1054 0 obj << +/D [1034 0 R /XYZ 139.477 497.8331 null] +>> endobj +1055 0 obj << +/D [1034 0 R /XYZ 76.7123 479.9004 null] +>> endobj +1056 0 obj << +/D [1034 0 R /XYZ 129.5143 461.9676 null] +>> endobj +1057 0 obj << +/D [1034 0 R /XYZ 129.5143 461.9676 null] +>> endobj +1058 0 obj << +/D [1034 0 R /XYZ 71.731 459.8108 null] +>> endobj +1059 0 obj << +/D [1034 0 R /XYZ 71.731 459.8108 null] +>> endobj +1060 0 obj << +/D [1034 0 R /XYZ 139.477 444.0349 null] +>> endobj +1061 0 obj << +/D [1034 0 R /XYZ 71.731 441.878 null] +>> endobj +1062 0 obj << +/D [1034 0 R /XYZ 139.477 426.1021 null] +>> endobj +1063 0 obj << +/D [1034 0 R /XYZ 76.7123 408.1694 null] +>> endobj +1064 0 obj << +/D [1034 0 R /XYZ 129.5143 390.2366 null] +>> endobj +1065 0 obj << +/D [1034 0 R /XYZ 129.5143 390.2366 null] +>> endobj +1066 0 obj << +/D [1034 0 R /XYZ 71.731 368.8718 null] +>> endobj +1067 0 obj << +/D [1034 0 R /XYZ 71.731 357.2604 null] +>> endobj +1068 0 obj << +/D [1034 0 R /XYZ 71.731 356.015 null] +>> endobj +1069 0 obj << +/D [1034 0 R /XYZ 129.5143 336.9365 null] +>> endobj +631 0 obj << +/D [1034 0 R /XYZ 71.731 330.5156 null] +>> endobj +42 0 obj << +/D [1034 0 R /XYZ 219.8168 286.7009 null] +>> endobj +1070 0 obj << +/D [1034 0 R /XYZ 71.731 266.5605 null] +>> endobj +1071 0 obj << +/D [1034 0 R /XYZ 161.0655 253.8241 null] +>> endobj +1072 0 obj << +/D [1034 0 R /XYZ 71.731 241.7047 null] +>> endobj +1073 0 obj << +/D [1034 0 R /XYZ 71.731 210.675 null] +>> endobj +1074 0 obj << +/D [1034 0 R /XYZ 168.8063 199.3285 null] +>> endobj +1075 0 obj << +/D [1034 0 R /XYZ 71.731 172.2651 null] +>> endobj +1076 0 obj << +/D [1034 0 R /XYZ 71.731 157.6947 null] +>> endobj +1077 0 obj << +/D [1034 0 R /XYZ 71.731 124.9071 null] +>> endobj +1078 0 obj << +/D [1034 0 R /XYZ 181.5683 113.2513 null] +>> endobj +1033 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1081 0 obj << +/Length 1140 +/Filter /FlateDecode +>> +stream +xÚÍX]£6}Ÿ_Ác"5®mðóPivÛ­ZµÒh7oÕŠ‚3A"Ñtÿ}¯Á€æãa«­"Å$¸Ççž{m †ñA‡†ˆrF½øò€½W8õë1ƒÁlлãÏ|ì…(ä”{Ǔç‡1x§H2"½cò×îý9ºÖªÜ(Ã;ŠÚñ9‹rUÿýÝþ|zþ­=øSÕç"©öŸ¿?ürìã3_ PBE’=jJ“†žš<Ð4 œe$ð=%ò_4<£ä’æ:pƒ&u0‡=)Á[ðóž°]TFS«Ç| Œ3†pàs'ßu°a_˜‹À¤á;¹›¦ðB)›Ä¥&D¨3îxxtWMyøҥۏèVŸ²ÑaACÛäVuy‹ëF)×׫¼Nã¨N‹ÜFÞJ5`GrM–na;ÔÁ† Âíå» u°Ya!ù˜¡3î¼°ÝUS÷Âú! +„¸§ñº´åàP—qĨ´±¾iþÚéëõÒÞ®9®‹v¼UjÞ½˜ 0ͽlɽlݽŽ¸[Ü;æ1ã^›G%¼Ù½ƒºïŠ¢îþŽêæÐ |˜ô¸S|Tàã|¡E°´ +fZÚ ² [¹‡­ŠìŠ»AdA·^ä;iÞU=i‡ôdĻűªªÓ-39~QšŒ˜@BúPÆ #곶ßPèEDÈÝS²'x—¼/òӇ4s¥HHŠÅ¨w—E]Ô_¯ê±¿bpI×ì)AœÈ°­ÄdˆÑÐ~Á ë¶e&ÃÉ//ÓL5ƒÊ’ + dëbò³ªâ2½ê:]¢äÃâÊiO©2í³rµ§l÷f~‰ê©iF¯·Òj-U³?åz)û:œÑìMv®*N›¿LÏHóù 6¥êÛJbä) •oieÎ$ê¤ÓݲںHÖ~Gœñ¶4õ-Pž/¸]R¦•C›aš Yû©=ÄMzf¬hhYöÓ@[óú”eEéÓïc‘©j«ëþ“ý…†Ë@¬4¶ÐlzØj³qÅÝÐl&<ÜýŽÇ÷ُPÐD0®ìGlØÂ~¤‡­îG\q7ìG&<œû‘;ÿƒý‘>’8.»×†-¸·‡­º×wƒ{'<Üî½ãÑ4®¬4ðÕ´Õ©ÖRÂ: ¤Ë˳ö$œ¡žVìiÃìÙÃVí銻ÁžN{ÞÑh4+ÞrxÒtۓ¾`Ïøܶê\¯dXÌ¿í]ÝÒXãµÊ·aKÒv°uiq·H;æá–Ö¦q-ª:Ía£›e_⋫üÁÁ,àlAßOg•eÝÚ|¹Dù¨ì•^ÀþÑ_*¾ÕfINý‹n8Ÿ#,%]K„[JD[O„#î–DŒy¸aÓPeY”3)`ðPÃÿÖ)è¶G‘½Mlx˜úˆã[YÍç„PD ÖrbÁ–rÒÁÖs∻%'cîœØ4®¥Z® !á°MûƉ¹–i—ƒ7_#æõµ$<\|Ãga¦/ø(Å}8îPzJböm#Þ¿e„®Ùendstream +endobj +1080 0 obj << +/Type /Page +/Contents 1081 0 R +/Resources 1079 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +1082 0 obj << +/D [1080 0 R /XYZ 71.731 729.2652 null] +>> endobj +1083 0 obj << +/D [1080 0 R /XYZ 71.731 718.3063 null] +>> endobj +1084 0 obj << +/D [1080 0 R /XYZ 71.731 675.3674 null] +>> endobj +1085 0 obj << +/D [1080 0 R /XYZ 71.731 674.1221 null] +>> endobj +1086 0 obj << +/D [1080 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1087 0 obj << +/D [1080 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1088 0 obj << +/D [1080 0 R /XYZ 71.731 653.604 null] +>> endobj +1089 0 obj << +/D [1080 0 R /XYZ 71.731 653.604 null] +>> endobj +1090 0 obj << +/D [1080 0 R /XYZ 139.477 637.1108 null] +>> endobj +1091 0 obj << +/D [1080 0 R /XYZ 139.477 637.1108 null] +>> endobj +1092 0 obj << +/D [1080 0 R /XYZ 76.7123 619.1781 null] +>> endobj +1093 0 obj << +/D [1080 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1094 0 obj << +/D [1080 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1095 0 obj << +/D [1080 0 R /XYZ 71.731 579.1632 null] +>> endobj +1096 0 obj << +/D [1080 0 R /XYZ 71.731 568.2691 null] +>> endobj +1097 0 obj << +/D [1080 0 R /XYZ 71.731 567.0237 null] +>> endobj +1098 0 obj << +/D [1080 0 R /XYZ 129.5143 547.9452 null] +>> endobj +632 0 obj << +/D [1080 0 R /XYZ 71.731 541.5243 null] +>> endobj +46 0 obj << +/D [1080 0 R /XYZ 207.3873 497.7096 null] +>> endobj +1099 0 obj << +/D [1080 0 R /XYZ 71.731 477.5692 null] +>> endobj +1100 0 obj << +/D [1080 0 R /XYZ 161.0655 464.8329 null] +>> endobj +1101 0 obj << +/D [1080 0 R /XYZ 71.731 452.7134 null] +>> endobj +1102 0 obj << +/D [1080 0 R /XYZ 71.731 421.6837 null] +>> endobj +1103 0 obj << +/D [1080 0 R /XYZ 168.8063 410.3372 null] +>> endobj +1104 0 obj << +/D [1080 0 R /XYZ 71.731 383.2738 null] +>> endobj +1105 0 obj << +/D [1080 0 R /XYZ 71.731 357.0471 null] +>> endobj +1106 0 obj << +/D [1080 0 R /XYZ 71.731 323.9503 null] +>> endobj +1107 0 obj << +/D [1080 0 R /XYZ 181.5683 312.6037 null] +>> endobj +1108 0 obj << +/D [1080 0 R /XYZ 71.731 302.5415 null] +>> endobj +1109 0 obj << +/D [1080 0 R /XYZ 71.731 270.9699 null] +>> endobj +1110 0 obj << +/D [1080 0 R /XYZ 71.731 258.0085 null] +>> endobj +1111 0 obj << +/D [1080 0 R /XYZ 71.731 256.7632 null] +>> endobj +1112 0 obj << +/D [1080 0 R /XYZ 129.5143 237.6847 null] +>> endobj +1113 0 obj << +/D [1080 0 R /XYZ 129.5143 237.6847 null] +>> endobj +1114 0 obj << +/D [1080 0 R /XYZ 71.731 236.2451 null] +>> endobj +1115 0 obj << +/D [1080 0 R /XYZ 71.731 236.2451 null] +>> endobj +1116 0 obj << +/D [1080 0 R /XYZ 139.477 219.7519 null] +>> endobj +1117 0 obj << +/D [1080 0 R /XYZ 139.477 219.7519 null] +>> endobj +1118 0 obj << +/D [1080 0 R /XYZ 76.7123 201.8192 null] +>> endobj +1119 0 obj << +/D [1080 0 R /XYZ 129.5143 183.8864 null] +>> endobj +1120 0 obj << +/D [1080 0 R /XYZ 129.5143 183.8864 null] +>> endobj +1121 0 obj << +/D [1080 0 R /XYZ 71.731 182.7074 null] +>> endobj +1122 0 obj << +/D [1080 0 R /XYZ 71.731 182.7074 null] +>> endobj +1123 0 obj << +/D [1080 0 R /XYZ 139.477 165.9537 null] +>> endobj +1124 0 obj << +/D [1080 0 R /XYZ 139.477 165.9537 null] +>> endobj +1125 0 obj << +/D [1080 0 R /XYZ 71.731 163.7968 null] +>> endobj +1126 0 obj << +/D [1080 0 R /XYZ 139.477 148.0209 null] +>> endobj +1127 0 obj << +/D [1080 0 R /XYZ 139.477 148.0209 null] +>> endobj +1128 0 obj << +/D [1080 0 R /XYZ 71.731 145.8641 null] +>> endobj +1129 0 obj << +/D [1080 0 R /XYZ 139.477 130.0882 null] +>> endobj +1130 0 obj << +/D [1080 0 R /XYZ 139.477 130.0882 null] +>> endobj +1131 0 obj << +/D [1080 0 R /XYZ 71.731 127.9313 null] +>> endobj +1132 0 obj << +/D [1080 0 R /XYZ 139.477 112.1554 null] +>> endobj +1133 0 obj << +/D [1080 0 R /XYZ 139.477 112.1554 null] +>> endobj +1134 0 obj << +/D [1080 0 R /XYZ 71.731 109.9986 null] +>> endobj +1079 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1137 0 obj << +/Length 1450 +/Filter /FlateDecode +>> +stream +xڍYю£6}Ÿ¯àq"m¼¶Á6ìC¥é¶»Úª]VóÖ­"œ•@d £ùûÚ`ŒA#M<ÌÁ÷øœë{ A”?(`°P~à`Jp]`p’ÿúú€4d¯1{ôëËÃÇ/! PLƒ—c&,Ä &(^ò¿?ŸÓkËÅn |Ä`ø|.ӊ·¦¯ÃŸOÏ߆Á_¼=×y³ûç叇ß_Æø$d ‰e/ÉÆ ¢qì1 FĉBr +‚"‰bF!ƒ“€¤*3âF˜ZÍOŒÉ”’Ë…8J{Bwúyãaîšó㠖¢Ò¨ç& bìžFΛVÑè9ß À€0Idú4hÚ´¢¨N´Ò¯M]v-þº¦íy½¹ÐBˆK=nÎuWæÃøU_+ª¦M˒ç3Œb4 B0YÑ߆yôa«ú»ânÐÆéÿâTՂ²K~àBÔ¢q˜‘„ ‰½7ãµ®KžVڍoƒ”sÝÓj‡ÈãûÛÉñûpï0yüO]ç•vâ8¢„¢2 ë,ëD³ìÃrQ1^sȂù2°u‡q·84åávȦÁ«ôUçèėYâóås])7NHÛ¢®æþV>k‹›-Ër“ˆDkr[0ŸÜ¶.·#<ÜrÛ4ŽEÉW..EÓHÅ\û!Ž¡,ö§ì|©óŸ@$!]¢îçtËR@fkòZ0Ÿ¼¶.¯#îy§<ÜòÚ4šºwˆF€Ñ„zDýÁËô.I'•ß¤w{æãVhõ<\ ÷o“ÈLý1"¯U¸·ª¬ÓÜ×&P (KVۄóÙf`ë¶9ân±mÊÃm›M#-ßÒ÷æÐ]ó´u¹§ +–O)z*UЍÀT¶å—«6©­ïÚòܞå¾ÑUÙ9­N>‹ ,b«}‚ù,2°u‹q·X4åá¶È¦Ñ®“¨»«ÃBA†Ô[²Nâ:)Y:û宑3Êã˜Ä’ † éçúÁÛNTͧ™HjE ˆÍ©¼AímØMù„ÁAùÙl‹Êc,O—;ã.+oîrò¸é8fÀ¢jµŠßû}ӒÖÕñ0$ð¡ÈM>øË0„7¡M7]–ñ¦9v¥öP®‡ùÐÛ¾' °8 {pHh¢žEXüø”«Í•Ëžü"“áeK ¿×9ÿ*vX™1c( P:ŒUúYÔmݾ_ù§ñŽ[öé{÷ɲõá)w†U!Çe§]{þàRF_¬ä-js÷9,/jq¨Ò ïešß6ñßx“‰âªÎ:>ê²#ŠGꦍäüg&S¨ÆFÓ\yV(Ï­¥ô£~1úYñÛqrß69‘•‚§¹>2—Eõ¯2טQ˜’Vªý(¡z·ôKŶNÚ&¢é‰¢ßÓ<ã4²ƒ‡ŒÚ~@.æ¯sìË}W¶_KÂâ­h8ØêèSYeÈ,ý‡l*ÍÖ¼LóKQm õ¬²/2åäc¾§¢a9ÀDVdE³ažŠ6ÂV+š+6ãqßKL!»ã¡öêÂc9š5‘.3åo|ý¡îçU[d֐X~ºÀPÖ<¶PžmP«ÚtCƒž’pög›Ã“Tdx)änÏ4b‘ïu‡CÐË0Ý]A辘·ˆBVòֆyòv„­æ­+ñpç폾±ô'¡Â¥3e ‚l’Á·î½þ´œ+úJ/–e–-•`¼Vl˜Of[—Ùw‹ÌS 2ێ¸[rðphdÓ¸«N¡LêÙDõKþ(1¢‰÷{ 3ÿ€„!€…ãLŠR¼øNßïÖ¢Œendstream +endobj +1136 0 obj << +/Type /Page +/Contents 1137 0 R +/Resources 1135 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1138 0 obj << +/D [1136 0 R /XYZ 71.731 729.2652 null] +>> endobj +1139 0 obj << +/D [1136 0 R /XYZ 71.731 741.2204 null] +>> endobj +1140 0 obj << +/D [1136 0 R /XYZ 139.477 708.3437 null] +>> endobj +1141 0 obj << +/D [1136 0 R /XYZ 139.477 708.3437 null] +>> endobj +1142 0 obj << +/D [1136 0 R /XYZ 71.731 706.1869 null] +>> endobj +1143 0 obj << +/D [1136 0 R /XYZ 139.477 690.4109 null] +>> endobj +1144 0 obj << +/D [1136 0 R /XYZ 139.477 690.4109 null] +>> endobj +1145 0 obj << +/D [1136 0 R /XYZ 71.731 688.2541 null] +>> endobj +1146 0 obj << +/D [1136 0 R /XYZ 139.477 672.4782 null] +>> endobj +1147 0 obj << +/D [1136 0 R /XYZ 139.477 672.4782 null] +>> endobj +1148 0 obj << +/D [1136 0 R /XYZ 71.731 670.3214 null] +>> endobj +1149 0 obj << +/D [1136 0 R /XYZ 139.477 654.5454 null] +>> endobj +1150 0 obj << +/D [1136 0 R /XYZ 139.477 654.5454 null] +>> endobj +1151 0 obj << +/D [1136 0 R /XYZ 71.731 652.3886 null] +>> endobj +1152 0 obj << +/D [1136 0 R /XYZ 139.477 636.6127 null] +>> endobj +1153 0 obj << +/D [1136 0 R /XYZ 139.477 636.6127 null] +>> endobj +1154 0 obj << +/D [1136 0 R /XYZ 71.731 634.4559 null] +>> endobj +1155 0 obj << +/D [1136 0 R /XYZ 139.477 618.6799 null] +>> endobj +1156 0 obj << +/D [1136 0 R /XYZ 139.477 618.6799 null] +>> endobj +1157 0 obj << +/D [1136 0 R /XYZ 71.731 616.5231 null] +>> endobj +1158 0 obj << +/D [1136 0 R /XYZ 139.477 600.7472 null] +>> endobj +1159 0 obj << +/D [1136 0 R /XYZ 139.477 600.7472 null] +>> endobj +1160 0 obj << +/D [1136 0 R /XYZ 71.731 562.8892 null] +>> endobj +1161 0 obj << +/D [1136 0 R /XYZ 71.731 549.8382 null] +>> endobj +1162 0 obj << +/D [1136 0 R /XYZ 71.731 548.5928 null] +>> endobj +1163 0 obj << +/D [1136 0 R /XYZ 129.5143 529.5143 null] +>> endobj +633 0 obj << +/D [1136 0 R /XYZ 71.731 522.7498 null] +>> endobj +50 0 obj << +/D [1136 0 R /XYZ 321.3874 479.2787 null] +>> endobj +1164 0 obj << +/D [1136 0 R /XYZ 71.731 455.7899 null] +>> endobj +1165 0 obj << +/D [1136 0 R /XYZ 161.0655 446.402 null] +>> endobj +1166 0 obj << +/D [1136 0 R /XYZ 71.731 434.2825 null] +>> endobj +1167 0 obj << +/D [1136 0 R /XYZ 71.731 402.9166 null] +>> endobj +1168 0 obj << +/D [1136 0 R /XYZ 168.8063 391.9063 null] +>> endobj +1169 0 obj << +/D [1136 0 R /XYZ 71.731 364.8429 null] +>> endobj +1170 0 obj << +/D [1136 0 R /XYZ 71.731 337.4102 null] +>> endobj +1171 0 obj << +/D [1136 0 R /XYZ 71.731 305.8287 null] +>> endobj +1172 0 obj << +/D [1136 0 R /XYZ 181.5683 294.1728 null] +>> endobj +1173 0 obj << +/D [1136 0 R /XYZ 71.731 284.1107 null] +>> endobj +1174 0 obj << +/D [1136 0 R /XYZ 71.731 252.539 null] +>> endobj +1175 0 obj << +/D [1136 0 R /XYZ 71.731 239.5777 null] +>> endobj +1176 0 obj << +/D [1136 0 R /XYZ 71.731 238.3323 null] +>> endobj +1177 0 obj << +/D [1136 0 R /XYZ 129.5143 219.2538 null] +>> endobj +1178 0 obj << +/D [1136 0 R /XYZ 129.5143 219.2538 null] +>> endobj +1179 0 obj << +/D [1136 0 R /XYZ 71.731 217.8142 null] +>> endobj +1180 0 obj << +/D [1136 0 R /XYZ 71.731 217.8142 null] +>> endobj +1181 0 obj << +/D [1136 0 R /XYZ 139.477 201.321 null] +>> endobj +1182 0 obj << +/D [1136 0 R /XYZ 139.477 201.321 null] +>> endobj +1183 0 obj << +/D [1136 0 R /XYZ 76.7123 183.3883 null] +>> endobj +1184 0 obj << +/D [1136 0 R /XYZ 129.5143 165.4555 null] +>> endobj +1185 0 obj << +/D [1136 0 R /XYZ 129.5143 165.4555 null] +>> endobj +1186 0 obj << +/D [1136 0 R /XYZ 71.731 163.2987 null] +>> endobj +1187 0 obj << +/D [1136 0 R /XYZ 129.5143 147.5228 null] +>> endobj +1188 0 obj << +/D [1136 0 R /XYZ 129.5143 147.5228 null] +>> endobj +1189 0 obj << +/D [1136 0 R /XYZ 71.731 145.3659 null] +>> endobj +1190 0 obj << +/D [1136 0 R /XYZ 71.731 145.3659 null] +>> endobj +1191 0 obj << +/D [1136 0 R /XYZ 139.477 129.59 null] +>> endobj +1192 0 obj << +/D [1136 0 R /XYZ 71.731 127.4332 null] +>> endobj +1193 0 obj << +/D [1136 0 R /XYZ 139.477 111.6573 null] +>> endobj +1135 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1197 0 obj << +/Length 975 +/Filter /FlateDecode +>> +stream +xڍW[›8}Ÿ_Ác"5®/؆yËÎvªV»«Q•·ÎjÄg‚ÊÀԀªþûý †˜àš'™cŸããïb“à $A’Á@cD§Áñí¯ð¯ÏwÄBv³sAî>>2Ä(T‡SÀb¸ É(Š8‰‚Cú}ópNÞk¥·;Êñ†¢n|ʓBÕ%ÿu_÷O_º«ú\¦ÕößÃ×»O‡Ÿ3‰âHfE¨©L;2 ‰çDBr +ÙÊü¦êFÕý5õÌ9Â!^êµsa=5Ȓ˜Œ©{˜á~¦”Ox)E,$ÔË{=^tô³¼: À NB6֑õ‡îH7d§n¬šãQUթɍLX ôID Íb;.‘ŒƒQÆ»Å(æ°e´Ù§[‚7éCYœ³\¶ޔÿ”©²‹¹ÂB‰"ŠÁGBҞ͓.ë²þý®î‡Ì-»»£ ·ø}ê#kwòŒ9Nšúl÷yØË3Æ4W/Yj, ß^Jýr.«ºHÞL#µ»žÜUû§ªŽ:{¯³²˜ÓË WWw2è2ª^˜uzíFg÷¹.íx¶?TïꘄJ/»°Ùöåt.?²ž7×*Iw_ò¬øaŽ¬_jB6#oð°•Ö¥nóÒ .X»çDÛÅt›y*EJ Á¤pÓr!*-éɈNš¼¶øë_Y¥ÐÚ³Ûçy¹¥|ó«ßú·2WÕbØEÝ1&é[V¬¥zÚ&@pAuœ©;, Mv‘…ºãÂfêÎ[¬;>Þug¢ƒEŽkCÝé0 鱍†¹·G^ëæØ©¡k˜ùª¨³£²ÑjºÁ^Ð¥0óÛ£v.ìb,1íp´¡vÓX8|LÃØË{ÛØ~ÖTÇØX£PʱŒ=øÒuT»²,„f}íoV¼öþzl}ë–•…¦R7£—Æzr-D¯ ›‰Þ¶½>ÞÑ;ÑáÞ‘Ž¶‡œ²¶ƒx|…X^Åñ¥Ó>,Uú,5gÐVv}Ûfɾq-r\¾ æL¶¨e§¤k,¾qÃaG„§{|&* +–lb´íڍð›EÂ}œX* +.l¦( °Å¢àã]Q|:KlQɸ„ÞåV4cÃfàzM"Á—¬q`sÖô°ek<¼k¬ñèðXãÊU¿Ç&Ïí}èg“䣻•†À ËRÞ]#‡ëÞDpÓe!g]ØLҰŬõñ®H[ŸÏ{b¤cå{•iša„""âÙ·¨ƒ™>E9ƒú V2zâ›ïJßÿ¡¯téendstream +endobj +1196 0 obj << +/Type /Page +/Contents 1197 0 R +/Resources 1195 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1198 0 obj << +/D [1196 0 R /XYZ 71.731 729.2652 null] +>> endobj +1199 0 obj << +/D [1196 0 R /XYZ 71.731 741.2204 null] +>> endobj +1200 0 obj << +/D [1196 0 R /XYZ 71.731 675.3674 null] +>> endobj +1201 0 obj << +/D [1196 0 R /XYZ 71.731 674.1221 null] +>> endobj +1202 0 obj << +/D [1196 0 R /XYZ 129.5143 655.0436 null] +>> endobj +634 0 obj << +/D [1196 0 R /XYZ 71.731 648.6227 null] +>> endobj +54 0 obj << +/D [1196 0 R /XYZ 270.0858 604.8079 null] +>> endobj +1203 0 obj << +/D [1196 0 R /XYZ 71.731 584.6676 null] +>> endobj +1204 0 obj << +/D [1196 0 R /XYZ 161.0655 571.9312 null] +>> endobj +1205 0 obj << +/D [1196 0 R /XYZ 71.731 559.8118 null] +>> endobj +1206 0 obj << +/D [1196 0 R /XYZ 71.731 528.7821 null] +>> endobj +1207 0 obj << +/D [1196 0 R /XYZ 168.8063 517.4356 null] +>> endobj +1208 0 obj << +/D [1196 0 R /XYZ 71.731 490.3722 null] +>> endobj +1209 0 obj << +/D [1196 0 R /XYZ 71.731 464.1455 null] +>> endobj +1210 0 obj << +/D [1196 0 R /XYZ 71.731 431.3579 null] +>> endobj +1211 0 obj << +/D [1196 0 R /XYZ 181.5683 419.7021 null] +>> endobj +1212 0 obj << +/D [1196 0 R /XYZ 71.731 409.6399 null] +>> endobj +1213 0 obj << +/D [1196 0 R /XYZ 71.731 378.0683 null] +>> endobj +1214 0 obj << +/D [1196 0 R /XYZ 71.731 365.1069 null] +>> endobj +1215 0 obj << +/D [1196 0 R /XYZ 71.731 363.8616 null] +>> endobj +1216 0 obj << +/D [1196 0 R /XYZ 129.5143 344.7831 null] +>> endobj +1217 0 obj << +/D [1196 0 R /XYZ 129.5143 344.7831 null] +>> endobj +1218 0 obj << +/D [1196 0 R /XYZ 71.731 343.3435 null] +>> endobj +1219 0 obj << +/D [1196 0 R /XYZ 71.731 343.3435 null] +>> endobj +1220 0 obj << +/D [1196 0 R /XYZ 139.477 326.8503 null] +>> endobj +1221 0 obj << +/D [1196 0 R /XYZ 139.477 326.8503 null] +>> endobj +1222 0 obj << +/D [1196 0 R /XYZ 76.7123 308.9175 null] +>> endobj +1223 0 obj << +/D [1196 0 R /XYZ 129.5143 290.9848 null] +>> endobj +1224 0 obj << +/D [1196 0 R /XYZ 129.5143 290.9848 null] +>> endobj +1225 0 obj << +/D [1196 0 R /XYZ 71.731 288.828 null] +>> endobj +1226 0 obj << +/D [1196 0 R /XYZ 129.5143 273.052 null] +>> endobj +1227 0 obj << +/D [1196 0 R /XYZ 129.5143 273.052 null] +>> endobj +1228 0 obj << +/D [1196 0 R /XYZ 71.731 270.8952 null] +>> endobj +1229 0 obj << +/D [1196 0 R /XYZ 71.731 270.8952 null] +>> endobj +1230 0 obj << +/D [1196 0 R /XYZ 139.477 255.1193 null] +>> endobj +1231 0 obj << +/D [1196 0 R /XYZ 71.731 253.6797 null] +>> endobj +1232 0 obj << +/D [1196 0 R /XYZ 139.477 237.1865 null] +>> endobj +1233 0 obj << +/D [1196 0 R /XYZ 71.731 199.3285 null] +>> endobj +1234 0 obj << +/D [1196 0 R /XYZ 71.731 186.2775 null] +>> endobj +1235 0 obj << +/D [1196 0 R /XYZ 71.731 185.0322 null] +>> endobj +1236 0 obj << +/D [1196 0 R /XYZ 129.5143 165.9537 null] +>> endobj +635 0 obj << +/D [1196 0 R /XYZ 71.731 159.5328 null] +>> endobj +1195 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1239 0 obj << +/Length 807 +/Filter /FlateDecode +>> +stream +xÚÝVێ›0}߯à1‘×lã}K¯êMŠVyëV N‚J ÓÕþ}mlˆ äòRUª"Å!ÌÌ9s<ž1 + þ €#À‰^°˜Q¬÷w0ØêWî3 Mè½^ݽzO` €`˜«M@”G'ÄÅÁ*ý6{³KJVóS8ÃÀ®Ë<)¤ú’ü´‹åGûã«T»2­çßWŸîÞ­z|J8±¹H²·ÓÄ(@`D#óË2€-M ¸áÆãÙ"#8K?ϝIóõ²š38{9HCKÇ^Ê1†<Mʜñ6Ö²*U©´ÃCïkւ;ß#ÀPlÁ©†ÃG¸Øµ’—·²^WÙAeeq‰ Ñ;ÇpϦ¶`‰Ã”†Ü³}øeÔ±Dí&Q`Bë]ŒpÖÆy”ª© + +Ù%ÛصnÖkYכ&wymLؤɕ³/ÕNVÏYmCߒé"Ï˖§LmˆÇ2—õ­[¤û¬¸jiÒO*½º²-„_® @)âAD9à‘ “åÚ[…¾™-WèRæãh†ÂÆt„‹1 “¸§ë‘Gç5æAbO5¤Eò0¥9!Ž4ÆäÁm¹ªšµº?9ñÆ_*['¦D}˦’ã; +D€1:-lgúfGa‘9üƒ„:³³Âê͇8“¸ç…í¼Æ<†Âê·çC ­‹í†êR}Ê"ÝhOõ͊m§ï„¬{ÎÚÒ®M-ÏW/$@Pt­xV—j×Y]/Ý1è-•{BâLáz$L½¹nºzmúØýÚ期v +×Ï·B!`Š+*ûfdîÍ®ê<…{ƒÐS<ŽêõJxdEwêÏ·ƒ)š6}Œu0L(ss:Îé¯:Bb~mça;™þân±¶Óƒyoßýx‚Ë<­ÿéÞûD•ÜòDIw÷Z^ùþ6NIÞH¬>ÈuÖ¦àEVL§ç°+Ù÷‘ôþdrÛÇTžŽöÓtsðϙ»bF±éèââÚ³_©)ŽuC¢d<{AžüÙ7ʘendstream +endobj +1238 0 obj << +/Type /Page +/Contents 1239 0 R +/Resources 1237 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1240 0 obj << +/D [1238 0 R /XYZ 71.731 729.2652 null] +>> endobj +58 0 obj << +/D [1238 0 R /XYZ 208.7305 706.1179 null] +>> endobj +1241 0 obj << +/D [1238 0 R /XYZ 71.731 682.6291 null] +>> endobj +1242 0 obj << +/D [1238 0 R /XYZ 161.0655 673.2412 null] +>> endobj +1243 0 obj << +/D [1238 0 R /XYZ 71.731 661.1217 null] +>> endobj +1244 0 obj << +/D [1238 0 R /XYZ 71.731 575.2602 null] +>> endobj +1245 0 obj << +/D [1238 0 R /XYZ 71.731 544.3242 null] +>> endobj +1246 0 obj << +/D [1238 0 R /XYZ 181.5683 532.6683 null] +>> endobj +1247 0 obj << +/D [1238 0 R /XYZ 71.731 522.6062 null] +>> endobj +1248 0 obj << +/D [1238 0 R /XYZ 71.731 491.0346 null] +>> endobj +1249 0 obj << +/D [1238 0 R /XYZ 71.731 478.0732 null] +>> endobj +1250 0 obj << +/D [1238 0 R /XYZ 71.731 476.8278 null] +>> endobj +1251 0 obj << +/D [1238 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1252 0 obj << +/D [1238 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1253 0 obj << +/D [1238 0 R /XYZ 71.731 456.3097 null] +>> endobj +1254 0 obj << +/D [1238 0 R /XYZ 71.731 456.3097 null] +>> endobj +1255 0 obj << +/D [1238 0 R /XYZ 139.477 439.8165 null] +>> endobj +1256 0 obj << +/D [1238 0 R /XYZ 139.477 439.8165 null] +>> endobj +1257 0 obj << +/D [1238 0 R /XYZ 76.7123 421.8838 null] +>> endobj +1258 0 obj << +/D [1238 0 R /XYZ 129.5143 403.951 null] +>> endobj +1259 0 obj << +/D [1238 0 R /XYZ 129.5143 403.951 null] +>> endobj +1260 0 obj << +/D [1238 0 R /XYZ 71.731 381.8689 null] +>> endobj +1261 0 obj << +/D [1238 0 R /XYZ 71.731 370.9748 null] +>> endobj +1262 0 obj << +/D [1238 0 R /XYZ 71.731 369.7295 null] +>> endobj +1263 0 obj << +/D [1238 0 R /XYZ 129.5143 350.6509 null] +>> endobj +636 0 obj << +/D [1238 0 R /XYZ 71.731 344.23 null] +>> endobj +62 0 obj << +/D [1238 0 R /XYZ 211.2435 300.4153 null] +>> endobj +1264 0 obj << +/D [1238 0 R /XYZ 71.731 276.6597 null] +>> endobj +1265 0 obj << +/D [1238 0 R /XYZ 161.0655 267.5386 null] +>> endobj +1266 0 obj << +/D [1238 0 R /XYZ 71.731 255.4191 null] +>> endobj +1267 0 obj << +/D [1238 0 R /XYZ 71.731 224.0532 null] +>> endobj +1268 0 obj << +/D [1238 0 R /XYZ 168.8063 213.0429 null] +>> endobj +1269 0 obj << +/D [1238 0 R /XYZ 71.731 185.9795 null] +>> endobj +1270 0 obj << +/D [1238 0 R /XYZ 71.731 169.5576 null] +>> endobj +1271 0 obj << +/D [1238 0 R /XYZ 71.731 138.6216 null] +>> endobj +1272 0 obj << +/D [1238 0 R /XYZ 181.5683 126.9657 null] +>> endobj +1273 0 obj << +/D [1238 0 R /XYZ 71.731 116.9035 null] +>> endobj +1237 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1276 0 obj << +/Length 1027 +/Filter /FlateDecode +>> +stream +xÚÍXËnÛ8Ýç+´´šåC|e—¶3ƒ)Ú"(¼kŦµ²H2‚þ}¯ž¦$Jf3E²#žÃÃCÞ+‘à $A’Á…jD§Áá|ƒƒ'ø×_7¤…ìZÌνÛß¼ý“á@#-¨ö§€i¸ É(Rœ¨`ü¶yÿ½”&ßî(ÇŠšë}¥¦ü=6_ïîÿn>|6åsv,¶ÿì?Þü±ïù9“H+ YÙ£¦2©¶d¢çD+ÄB&k÷[Â7Q ¨-nÇú›„Š™SBÚÙ°Nü"1Hèa•„Jù„—RÐH¨“w|½êèîšê`*P`…k`'!êˆ.ås¥cä ®*Èm³^E™_å›Ñ*V÷›´ŒQg©¼äf:ÁN‚*%¹Ûص³aWcIÏÁ„:ج±RLCíä7¶»kªch,Ó(”r(ã|iîp— $BØGùÏj 8v0Â2„ÒÁ1±0H5ÄW?]è¥BMáŠxʑ [¨G=Ì[\¼+*’K‡ÕVv+>Ч]{DÚÝ|êì;ÀÎÓ%i—ôID ¯WnÇ%’Š±ÚPʸ¨£HW ´T›»ã–àÍñ‹)_·o²üÇlcBÑ£l¬ºr)Ún7Ïʬüùbnû;®±iïÝQ‚T‰¦w96dÄ&«'ò€9®:¾vš)tÐðq(ÙuÛJ>˜âÇ/UK³¤…Á£… ½–¶ÐD-§ÙR¾yí¾ô2í ÕAÅ°žpú2)ì„z¨Ù©5º$e‹Ï Ë_ã µs½K’¬VjZï¾B)-Ö.At<ÇéZªµ3DSøÀ´g Ú°…-Øü[ÐÅ»b Nt¸»ÂŽÿçq†È J¨§ˆØ°…*ÒüeÄÅ»¢ŽLt8 É@Æoð8C˜B’séK¯[Joó§×Á»&½c3éµuTçéêô^Ýýâ>›jÍLþzb¨Åjݾû RDèÅ×CfúvˆS’µîGªH ™}×ã ü‰œ6öendstream +endobj +1275 0 obj << +/Type /Page +/Contents 1276 0 R +/Resources 1274 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1277 0 obj << +/D [1275 0 R /XYZ 71.731 729.2652 null] +>> endobj +638 0 obj << +/D [1275 0 R /XYZ 71.731 741.2204 null] +>> endobj +1278 0 obj << +/D [1275 0 R /XYZ 71.731 718.3063 null] +>> endobj +1279 0 obj << +/D [1275 0 R /XYZ 71.731 708.2442 null] +>> endobj +1280 0 obj << +/D [1275 0 R /XYZ 71.731 706.9988 null] +>> endobj +1281 0 obj << +/D [1275 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1282 0 obj << +/D [1275 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1283 0 obj << +/D [1275 0 R /XYZ 71.731 686.4807 null] +>> endobj +1284 0 obj << +/D [1275 0 R /XYZ 71.731 686.4807 null] +>> endobj +1285 0 obj << +/D [1275 0 R /XYZ 139.477 669.9875 null] +>> endobj +1286 0 obj << +/D [1275 0 R /XYZ 139.477 669.9875 null] +>> endobj +1287 0 obj << +/D [1275 0 R /XYZ 76.7123 652.0548 null] +>> endobj +1288 0 obj << +/D [1275 0 R /XYZ 129.5143 634.122 null] +>> endobj +1289 0 obj << +/D [1275 0 R /XYZ 129.5143 634.122 null] +>> endobj +1290 0 obj << +/D [1275 0 R /XYZ 71.731 632.7413 null] +>> endobj +1291 0 obj << +/D [1275 0 R /XYZ 71.731 632.7413 null] +>> endobj +1292 0 obj << +/D [1275 0 R /XYZ 139.477 616.1893 null] +>> endobj +1293 0 obj << +/D [1275 0 R /XYZ 139.477 616.1893 null] +>> endobj +1294 0 obj << +/D [1275 0 R /XYZ 71.731 614.0324 null] +>> endobj +1295 0 obj << +/D [1275 0 R /XYZ 139.477 598.2565 null] +>> endobj +1296 0 obj << +/D [1275 0 R /XYZ 139.477 598.2565 null] +>> endobj +1297 0 obj << +/D [1275 0 R /XYZ 71.731 596.0997 null] +>> endobj +1298 0 obj << +/D [1275 0 R /XYZ 139.477 580.3238 null] +>> endobj +1299 0 obj << +/D [1275 0 R /XYZ 139.477 580.3238 null] +>> endobj +1300 0 obj << +/D [1275 0 R /XYZ 71.731 578.1669 null] +>> endobj +1301 0 obj << +/D [1275 0 R /XYZ 139.477 562.391 null] +>> endobj +1302 0 obj << +/D [1275 0 R /XYZ 139.477 562.391 null] +>> endobj +1303 0 obj << +/D [1275 0 R /XYZ 71.731 524.533 null] +>> endobj +1304 0 obj << +/D [1275 0 R /XYZ 71.731 511.482 null] +>> endobj +1305 0 obj << +/D [1275 0 R /XYZ 71.731 510.2367 null] +>> endobj +1306 0 obj << +/D [1275 0 R /XYZ 129.5143 491.1581 null] +>> endobj +637 0 obj << +/D [1275 0 R /XYZ 71.731 484.7373 null] +>> endobj +66 0 obj << +/D [1275 0 R /XYZ 267.2967 440.9225 null] +>> endobj +1307 0 obj << +/D [1275 0 R /XYZ 71.731 420.7821 null] +>> endobj +1308 0 obj << +/D [1275 0 R /XYZ 161.0655 408.0458 null] +>> endobj +1309 0 obj << +/D [1275 0 R /XYZ 71.731 395.9263 null] +>> endobj +1310 0 obj << +/D [1275 0 R /XYZ 71.731 364.8967 null] +>> endobj +1311 0 obj << +/D [1275 0 R /XYZ 168.8063 353.5502 null] +>> endobj +1312 0 obj << +/D [1275 0 R /XYZ 71.731 326.4867 null] +>> endobj +1313 0 obj << +/D [1275 0 R /XYZ 71.731 311.9164 null] +>> endobj +1314 0 obj << +/D [1275 0 R /XYZ 71.731 279.1288 null] +>> endobj +1315 0 obj << +/D [1275 0 R /XYZ 181.5683 267.473 null] +>> endobj +1316 0 obj << +/D [1275 0 R /XYZ 71.731 257.4108 null] +>> endobj +1317 0 obj << +/D [1275 0 R /XYZ 71.731 225.8392 null] +>> endobj +1318 0 obj << +/D [1275 0 R /XYZ 71.731 212.8778 null] +>> endobj +1319 0 obj << +/D [1275 0 R /XYZ 71.731 211.6324 null] +>> endobj +1320 0 obj << +/D [1275 0 R /XYZ 129.5143 192.5539 null] +>> endobj +1321 0 obj << +/D [1275 0 R /XYZ 129.5143 192.5539 null] +>> endobj +1322 0 obj << +/D [1275 0 R /XYZ 71.731 191.1144 null] +>> endobj +1323 0 obj << +/D [1275 0 R /XYZ 71.731 191.1144 null] +>> endobj +1324 0 obj << +/D [1275 0 R /XYZ 139.477 174.6212 null] +>> endobj +1325 0 obj << +/D [1275 0 R /XYZ 139.477 174.6212 null] +>> endobj +1326 0 obj << +/D [1275 0 R /XYZ 76.7123 156.6884 null] +>> endobj +1327 0 obj << +/D [1275 0 R /XYZ 129.5143 138.7557 null] +>> endobj +1328 0 obj << +/D [1275 0 R /XYZ 129.5143 138.7557 null] +>> endobj +1329 0 obj << +/D [1275 0 R /XYZ 71.731 116.6735 null] +>> endobj +1330 0 obj << +/D [1275 0 R /XYZ 71.731 105.7794 null] +>> endobj +1331 0 obj << +/D [1275 0 R /XYZ 71.731 104.5341 null] +>> endobj +1274 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1334 0 obj << +/Length 862 +/Filter /FlateDecode +>> +stream +xÚÅWێ›0}ÏWðH¤Åõc{*¥·U«v­òÖ­*œ *ˆKWû÷µ±!8$RWªò` Ç3gÎxfyPýÇ`D-XQì­w3è=©¿îfÈB‹ † w«Ù›OzˆGÞjãÊB 8EÜ[%ßý÷Ûx_Ër` +} ̺Ìâ\Ö_ã_æv±ül.¾Éz[$ÕüÇêËìãª÷O ‚+'“$CÄAH ð Àˆ:Q @)b*È ëƒÁÂS~D:˜×Ãt4Ócvc@Øìü¯Ý.'ƒ¨H…LQHÆ<Ò¼¾1’!³¤³VÍz-«jÓdš¦²¥ø1 Äµ±€2À8!êLhÔÃAÆýE2GÐOîeý<ÇÐ/Êß«yý—½´æ†ÔB8†JIof˲¨‹Zm¸íwpµ#jýÛ½F B\´‰q‡¬;nܵÑÈj]¦û:-ò)6DÛ÷l*ã,¶>åSÿ¹»é‰š:P M«¤(aFÓY7e^]ȑk£mÆMV[|QoeùœVÆô5‘.²¬hyÊĘx(2Y]›‚8Ù¥ùµ®–sDý¸T©Pem\Œª¡«› +Õ4Ä¥*Â&ª°‡]¬B—ß+ªð„áÕú*ñÐGÓ!Ô4äÖ¦¼.›uW²}»Óûe^§ëXÑ!²)åi€–p1·°*ÂÂ"ÝLJõ°³ÂªäC +§ßóÂv»NyŒ…%„Œi,”.f8Ô¥ªÊB5eŽõMó§N_‡¬;cÎmaÖ¦’gO/¡}0¦Oï6qz{ØÅÓëò{Åé=áá>½#º›^}zêÞ»z`ÛBTèÇýÂvÂó‚@¬2ŠÐ%©°)©;Øe©~¯‘ÚÁÃ1®G<^{\££q]$ò®lv³ýA}˜Ó­íÃ9Õ¿z6> endobj +1335 0 obj << +/D [1333 0 R /XYZ 71.731 729.2652 null] +>> endobj +1336 0 obj << +/D [1333 0 R /XYZ 129.5143 708.3437 null] +>> endobj +70 0 obj << +/D [1333 0 R /XYZ 254.8155 658.1081 null] +>> endobj +1337 0 obj << +/D [1333 0 R /XYZ 71.731 634.6193 null] +>> endobj +1338 0 obj << +/D [1333 0 R /XYZ 161.0655 625.2314 null] +>> endobj +1339 0 obj << +/D [1333 0 R /XYZ 71.731 613.1119 null] +>> endobj +1340 0 obj << +/D [1333 0 R /XYZ 71.731 581.746 null] +>> endobj +1341 0 obj << +/D [1333 0 R /XYZ 168.8063 570.7357 null] +>> endobj +1342 0 obj << +/D [1333 0 R /XYZ 71.731 543.6723 null] +>> endobj +1343 0 obj << +/D [1333 0 R /XYZ 71.731 527.2504 null] +>> endobj +1344 0 obj << +/D [1333 0 R /XYZ 71.731 496.3144 null] +>> endobj +1345 0 obj << +/D [1333 0 R /XYZ 181.5683 484.6585 null] +>> endobj +1346 0 obj << +/D [1333 0 R /XYZ 71.731 474.5963 null] +>> endobj +1347 0 obj << +/D [1333 0 R /XYZ 71.731 443.0247 null] +>> endobj +1348 0 obj << +/D [1333 0 R /XYZ 71.731 430.0633 null] +>> endobj +1349 0 obj << +/D [1333 0 R /XYZ 71.731 428.818 null] +>> endobj +1350 0 obj << +/D [1333 0 R /XYZ 129.5143 409.7395 null] +>> endobj +1351 0 obj << +/D [1333 0 R /XYZ 129.5143 409.7395 null] +>> endobj +1352 0 obj << +/D [1333 0 R /XYZ 71.731 408.2999 null] +>> endobj +1353 0 obj << +/D [1333 0 R /XYZ 71.731 408.2999 null] +>> endobj +1354 0 obj << +/D [1333 0 R /XYZ 139.477 391.8067 null] +>> endobj +1355 0 obj << +/D [1333 0 R /XYZ 139.477 391.8067 null] +>> endobj +1356 0 obj << +/D [1333 0 R /XYZ 76.7123 373.874 null] +>> endobj +1357 0 obj << +/D [1333 0 R /XYZ 129.5143 355.9412 null] +>> endobj +1358 0 obj << +/D [1333 0 R /XYZ 129.5143 355.9412 null] +>> endobj +1359 0 obj << +/D [1333 0 R /XYZ 71.731 333.8591 null] +>> endobj +1360 0 obj << +/D [1333 0 R /XYZ 71.731 322.965 null] +>> endobj +1361 0 obj << +/D [1333 0 R /XYZ 71.731 321.7196 null] +>> endobj +1362 0 obj << +/D [1333 0 R /XYZ 129.5143 302.6411 null] +>> endobj +639 0 obj << +/D [1333 0 R /XYZ 71.731 296.2202 null] +>> endobj +74 0 obj << +/D [1333 0 R /XYZ 242.4379 252.4055 null] +>> endobj +1363 0 obj << +/D [1333 0 R /XYZ 71.731 228.9167 null] +>> endobj +1364 0 obj << +/D [1333 0 R /XYZ 161.0655 219.5287 null] +>> endobj +1365 0 obj << +/D [1333 0 R /XYZ 71.731 207.4093 null] +>> endobj +1366 0 obj << +/D [1333 0 R /XYZ 71.731 176.0434 null] +>> endobj +1367 0 obj << +/D [1333 0 R /XYZ 168.8063 165.0331 null] +>> endobj +1368 0 obj << +/D [1333 0 R /XYZ 71.731 137.9697 null] +>> endobj +1369 0 obj << +/D [1333 0 R /XYZ 71.731 121.5478 null] +>> endobj +1332 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1372 0 obj << +/Length 1185 +/Filter /FlateDecode +>> +stream +xڝX]o«8}ï¯à1‘_lcîÕ²_W]íVÕUÞ¶«Š€Ó %iÕ¿clÀ€óÑ«<`ÂØsæ̙±{>ü°'0.$B„3â%‡;ß{…Gßï°1Y›•môËæîËÔ÷"q½ÍΣGLž … ‡Þ&ýgñë>>6²Z®óéëS²ù+ÞêÛõӃü-›}™ÖË7Þý¾éý3*P‚“‹ {«9LY01ŽcXx ¨hq®ó¼\¶x—©Æò£ÌeýUAiç‡0Ÿj¾YiE0â8ŒÚÙqzȊÞvðµêŒ%‚kWOKÌq$£]ØÑöø8¥( wFÛ[­l³.Z`Bøxmo¦ <Âf~ :0qú^ݬ9Z¬aÈ ÃãˆOÍÞA ¯<(“¯:uS’æ~"5_M–ÄMV¶å©’ó;˜¡ ‘›ØÎje› ÄbU £€:³³ÄBò}DN¿ç‰ífÍqŒ‰¥ +„ÃX/º˜ì2Žxu:å7+^;~´ôrí¸)õõT˳êe"Bà0¸¢^Ûì‚z{³«êuù½A½3nõŽpe*_«òt|Ùe2×}kÂu"ÆEèÒòYy2%¢üŠ¡L×A¸=N‰p±N—R¦ù(›÷%ñeõŸC @!ñÅä8R•MÙ|孇u:¸ÂÚU£Úï" þ—²zٗu£ªÔzR ³_ž}Ÿ¨þÙsã!ê·A —pS8’rÒã®Í±Áàåmή¬Æրڜ_ׅÊð‡¾yS‹ÄùIšÅë£L²6$“û¬¸¶ñRÉ~SM Q%lÃÕ{VË®(wjn|Êk’*O_ÕâŒÓ6Rµ„‚ðÅ”ulâm.õý-Üë(aÐïïjèÁÖ̪$tŒ–­7¹4voY¬ßecÉÁã?‹@ipðïkkxp¡Q‰ÈL¦Æh6ËÐ_ÀҀǬI¡—…X—у)Aã\¥«Ëc§ŸÄd";šÁëÀ7F8*KÎ÷3 ™¶U§I\7ƒÅ!®»§qa §EmZÂáT7æaž›5äya9X:'3£Ýó§û¤‹t׉îØ¿©˜gñŤ ï'¢Î^‹²R¢¥@o#Oõ„ŽF&{󟖢ª…"7£8Mgt×ãƒ)àÏLõê·:«;"Öêmê况c»øuSè²k*¸½7öp\g’¨Ïî†ãiO蛺µ—þ仯õêk ³û!Ó Ú|DBµ]üÎ`ÙÌ?3Àþ o‡pLì¬ +LÏ~4p8üËendstream +endobj +1371 0 obj << +/Type /Page +/Contents 1372 0 R +/Resources 1370 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1373 0 obj << +/D [1371 0 R /XYZ 71.731 729.2652 null] +>> endobj +1374 0 obj << +/D [1371 0 R /XYZ 71.731 718.3063 null] +>> endobj +1375 0 obj << +/D [1371 0 R /XYZ 181.5683 708.3437 null] +>> endobj +1376 0 obj << +/D [1371 0 R /XYZ 71.731 698.2815 null] +>> endobj +1377 0 obj << +/D [1371 0 R /XYZ 71.731 666.7099 null] +>> endobj +1378 0 obj << +/D [1371 0 R /XYZ 71.731 653.7485 null] +>> endobj +1379 0 obj << +/D [1371 0 R /XYZ 71.731 652.5032 null] +>> endobj +1380 0 obj << +/D [1371 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1381 0 obj << +/D [1371 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1382 0 obj << +/D [1371 0 R /XYZ 71.731 631.9851 null] +>> endobj +1383 0 obj << +/D [1371 0 R /XYZ 71.731 631.9851 null] +>> endobj +1384 0 obj << +/D [1371 0 R /XYZ 139.477 615.4919 null] +>> endobj +1385 0 obj << +/D [1371 0 R /XYZ 139.477 615.4919 null] +>> endobj +1386 0 obj << +/D [1371 0 R /XYZ 76.7123 597.5591 null] +>> endobj +1387 0 obj << +/D [1371 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1388 0 obj << +/D [1371 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1389 0 obj << +/D [1371 0 R /XYZ 71.731 578.2456 null] +>> endobj +1390 0 obj << +/D [1371 0 R /XYZ 71.731 578.2456 null] +>> endobj +1391 0 obj << +/D [1371 0 R /XYZ 139.477 561.6936 null] +>> endobj +1392 0 obj << +/D [1371 0 R /XYZ 139.477 561.6936 null] +>> endobj +1393 0 obj << +/D [1371 0 R /XYZ 71.731 559.5368 null] +>> endobj +1394 0 obj << +/D [1371 0 R /XYZ 139.477 543.7609 null] +>> endobj +1395 0 obj << +/D [1371 0 R /XYZ 139.477 543.7609 null] +>> endobj +1396 0 obj << +/D [1371 0 R /XYZ 71.731 505.9029 null] +>> endobj +1397 0 obj << +/D [1371 0 R /XYZ 71.731 492.8519 null] +>> endobj +1398 0 obj << +/D [1371 0 R /XYZ 71.731 491.6065 null] +>> endobj +1399 0 obj << +/D [1371 0 R /XYZ 129.5143 472.528 null] +>> endobj +640 0 obj << +/D [1371 0 R /XYZ 71.731 465.3899 null] +>> endobj +78 0 obj << +/D [1371 0 R /XYZ 258.7062 422.2924 null] +>> endobj +1400 0 obj << +/D [1371 0 R /XYZ 71.731 402.152 null] +>> endobj +1401 0 obj << +/D [1371 0 R /XYZ 161.0655 389.4157 null] +>> endobj +1402 0 obj << +/D [1371 0 R /XYZ 71.731 377.2962 null] +>> endobj +1403 0 obj << +/D [1371 0 R /XYZ 71.731 346.2666 null] +>> endobj +1404 0 obj << +/D [1371 0 R /XYZ 168.8063 334.92 null] +>> endobj +1405 0 obj << +/D [1371 0 R /XYZ 71.731 307.8566 null] +>> endobj +1406 0 obj << +/D [1371 0 R /XYZ 71.731 253.1781 null] +>> endobj +1407 0 obj << +/D [1371 0 R /XYZ 71.731 209.9403 null] +>> endobj +1408 0 obj << +/D [1371 0 R /XYZ 71.731 193.3027 null] +>> endobj +1409 0 obj << +/D [1371 0 R /XYZ 71.731 162.0574 null] +>> endobj +1410 0 obj << +/D [1371 0 R /XYZ 181.5683 150.7108 null] +>> endobj +1411 0 obj << +/D [1371 0 R /XYZ 71.731 140.6487 null] +>> endobj +1370 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1414 0 obj << +/Length 1520 +/Filter /FlateDecode +>> +stream +xÚ­™]oÛ6†ïó+|¨9~Jb/¤íºeX³`ÍÝ:Š¥ÄÂlɓäù÷;²D›–ŽH­+ra9~¥óêá!yH²…?6  |pMx øl½»¢³gøéç+ÖI–fi‹Þ=\ýðQЙ&:àÁìái&t@T(g¡à$R,š=$Îßoâ}–‹%WtÎIûy¿ó´þ-~l¿ÞÜ߶ŸÒzS$Õ⯇_¯~z8ÅW"$:‚ N“'ÕÐ&זMÆ4QŠ…³FDH}Þ/˜šÇe¼KÁmõ¶oátSANjá¤ZÚ2cþRvaá$k,|á\ ârGãö?Ï>Ì]C"šE€"GJ1).}ćzÓøèqã’Ð&B#yÛ¶WU—‡uý¦×ŠÍýi^gë¸ÎŠÜVÊtø‚ÆB¡¢Pá`jiËÎ`Y“ž/dd£`!I)—;ÖÜ5ôq Vh"ÃðÒÆ pi3¡«Hè<}¾Yþlø"XwíãŽ×uÑ~ªt<{…$¾ä=«\¹Û©ü©; :%s{&F×2‘IºÊ’UQ®6EUçЗЌJÒP\’Îòº½(Jýx¶²€°H _¶Z2W¶™?[‘¸S²ña!1ÙjÛ"]âÝ׎RÒ$àJ9Œèch”ŽW¯#Û2š“Ì‹‹; æcˆæÂÆE·üxØn_ÛËñ¶¥ÓuI; Ñþ¨HwÍ<ýÑR9ú£Qyû#tBì›Àû£m¢é0Í¿åß«§,ݶ{°ÖDpd܃Ùb<ä$RE¾ÎgË\fdþ CâNÉ°¾tª¸°ÑaCxIJ¤„Òf|žø|x„Û»©8IÊ´ªÆIr(Ù¸òöUKæ"id~’HÜ)$û>p’¶¬ZíËl—¯Ø¤*z3ÁcQlÓ8ï`ÞVÝäºé†@ó03k¤åӂèu÷û“™@êMÖÝÛôƒñ€"TiùZÀ’¹ZÀÈü-€ÄÒ}x Ø6’¼b#å$Õڑȷ÷—IÜÎÏOH;|¸ûÜݟ–_›BÞ1=IMIxpŸE؝ȋzqèž³eÀQðH½A»FŒ/TÑß÷MUoᚵÿýelò:½ÈIÈCß0lË\4Ìω;…hßÎÔ¶±‹×XA ËÛq Ÿn’ÎßOƒ¥‚‚TKßlË\Ì‰;cߎѶñø²ÍvYÏfLj9¨Å;Žïâ> endobj +1415 0 obj << +/D [1413 0 R /XYZ 71.731 729.2652 null] +>> endobj +1416 0 obj << +/D [1413 0 R /XYZ 71.731 741.2204 null] +>> endobj +1417 0 obj << +/D [1413 0 R /XYZ 71.731 718.3063 null] +>> endobj +1418 0 obj << +/D [1413 0 R /XYZ 71.731 708.2442 null] +>> endobj +1419 0 obj << +/D [1413 0 R /XYZ 71.731 706.9988 null] +>> endobj +1420 0 obj << +/D [1413 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1421 0 obj << +/D [1413 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1422 0 obj << +/D [1413 0 R /XYZ 71.731 686.4807 null] +>> endobj +1423 0 obj << +/D [1413 0 R /XYZ 71.731 686.4807 null] +>> endobj +1424 0 obj << +/D [1413 0 R /XYZ 139.477 669.9875 null] +>> endobj +1425 0 obj << +/D [1413 0 R /XYZ 139.477 669.9875 null] +>> endobj +1426 0 obj << +/D [1413 0 R /XYZ 76.7123 652.0548 null] +>> endobj +1427 0 obj << +/D [1413 0 R /XYZ 129.5143 634.122 null] +>> endobj +1428 0 obj << +/D [1413 0 R /XYZ 129.5143 634.122 null] +>> endobj +1429 0 obj << +/D [1413 0 R /XYZ 71.731 631.9652 null] +>> endobj +1430 0 obj << +/D [1413 0 R /XYZ 71.731 631.9652 null] +>> endobj +1431 0 obj << +/D [1413 0 R /XYZ 139.477 616.1893 null] +>> endobj +1432 0 obj << +/D [1413 0 R /XYZ 71.731 614.7497 null] +>> endobj +1433 0 obj << +/D [1413 0 R /XYZ 139.477 598.2565 null] +>> endobj +1434 0 obj << +/D [1413 0 R /XYZ 76.7123 580.3238 null] +>> endobj +1435 0 obj << +/D [1413 0 R /XYZ 129.5143 562.391 null] +>> endobj +1436 0 obj << +/D [1413 0 R /XYZ 129.5143 562.391 null] +>> endobj +1437 0 obj << +/D [1413 0 R /XYZ 71.731 561.212 null] +>> endobj +1438 0 obj << +/D [1413 0 R /XYZ 71.731 561.212 null] +>> endobj +1439 0 obj << +/D [1413 0 R /XYZ 139.477 544.4583 null] +>> endobj +1440 0 obj << +/D [1413 0 R /XYZ 139.477 544.4583 null] +>> endobj +1441 0 obj << +/D [1413 0 R /XYZ 71.731 542.3014 null] +>> endobj +1442 0 obj << +/D [1413 0 R /XYZ 139.477 526.5255 null] +>> endobj +1443 0 obj << +/D [1413 0 R /XYZ 139.477 526.5255 null] +>> endobj +1444 0 obj << +/D [1413 0 R /XYZ 71.731 524.3687 null] +>> endobj +1445 0 obj << +/D [1413 0 R /XYZ 139.477 508.5928 null] +>> endobj +1446 0 obj << +/D [1413 0 R /XYZ 139.477 508.5928 null] +>> endobj +1447 0 obj << +/D [1413 0 R /XYZ 71.731 506.4359 null] +>> endobj +1448 0 obj << +/D [1413 0 R /XYZ 139.477 490.66 null] +>> endobj +1449 0 obj << +/D [1413 0 R /XYZ 139.477 490.66 null] +>> endobj +1450 0 obj << +/D [1413 0 R /XYZ 71.731 488.5032 null] +>> endobj +1451 0 obj << +/D [1413 0 R /XYZ 139.477 472.7273 null] +>> endobj +1452 0 obj << +/D [1413 0 R /XYZ 139.477 472.7273 null] +>> endobj +1453 0 obj << +/D [1413 0 R /XYZ 71.731 470.5704 null] +>> endobj +1454 0 obj << +/D [1413 0 R /XYZ 139.477 454.7945 null] +>> endobj +1455 0 obj << +/D [1413 0 R /XYZ 139.477 454.7945 null] +>> endobj +1456 0 obj << +/D [1413 0 R /XYZ 71.731 453.355 null] +>> endobj +1457 0 obj << +/D [1413 0 R /XYZ 139.477 436.8618 null] +>> endobj +1458 0 obj << +/D [1413 0 R /XYZ 139.477 436.8618 null] +>> endobj +1459 0 obj << +/D [1413 0 R /XYZ 71.731 434.7049 null] +>> endobj +1460 0 obj << +/D [1413 0 R /XYZ 139.477 418.929 null] +>> endobj +1461 0 obj << +/D [1413 0 R /XYZ 139.477 418.929 null] +>> endobj +1462 0 obj << +/D [1413 0 R /XYZ 71.731 416.7722 null] +>> endobj +1463 0 obj << +/D [1413 0 R /XYZ 139.477 400.9962 null] +>> endobj +1464 0 obj << +/D [1413 0 R /XYZ 139.477 400.9962 null] +>> endobj +1465 0 obj << +/D [1413 0 R /XYZ 71.731 398.8394 null] +>> endobj +1466 0 obj << +/D [1413 0 R /XYZ 139.477 383.0635 null] +>> endobj +1467 0 obj << +/D [1413 0 R /XYZ 139.477 383.0635 null] +>> endobj +1468 0 obj << +/D [1413 0 R /XYZ 71.731 380.9067 null] +>> endobj +1469 0 obj << +/D [1413 0 R /XYZ 139.477 365.1307 null] +>> endobj +1470 0 obj << +/D [1413 0 R /XYZ 139.477 365.1307 null] +>> endobj +1471 0 obj << +/D [1413 0 R /XYZ 71.731 362.9739 null] +>> endobj +1472 0 obj << +/D [1413 0 R /XYZ 139.477 347.198 null] +>> endobj +1473 0 obj << +/D [1413 0 R /XYZ 139.477 347.198 null] +>> endobj +1474 0 obj << +/D [1413 0 R /XYZ 71.731 345.0412 null] +>> endobj +1475 0 obj << +/D [1413 0 R /XYZ 139.477 329.2652 null] +>> endobj +1476 0 obj << +/D [1413 0 R /XYZ 139.477 329.2652 null] +>> endobj +1477 0 obj << +/D [1413 0 R /XYZ 71.731 291.4072 null] +>> endobj +1478 0 obj << +/D [1413 0 R /XYZ 71.731 278.3562 null] +>> endobj +1479 0 obj << +/D [1413 0 R /XYZ 71.731 277.1109 null] +>> endobj +1480 0 obj << +/D [1413 0 R /XYZ 129.5143 258.0324 null] +>> endobj +641 0 obj << +/D [1413 0 R /XYZ 71.731 251.2678 null] +>> endobj +82 0 obj << +/D [1413 0 R /XYZ 191.1362 207.7967 null] +>> endobj +1481 0 obj << +/D [1413 0 R /XYZ 71.731 187.6564 null] +>> endobj +1482 0 obj << +/D [1413 0 R /XYZ 161.0655 174.92 null] +>> endobj +1483 0 obj << +/D [1413 0 R /XYZ 71.731 162.8006 null] +>> endobj +1484 0 obj << +/D [1413 0 R /XYZ 71.731 131.4347 null] +>> endobj +1485 0 obj << +/D [1413 0 R /XYZ 168.8063 120.4244 null] +>> endobj +1412 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1489 0 obj << +/Length 1325 +/Filter /FlateDecode +>> +stream +xÚ¥X]›8}Ÿ_ÁãDšx±?èÃJi»­fµ­Fݼí¬"&8´²@ڝ_l0`>¤U0áØ÷øø^ßkCϗ?è1–D òŽ—;ß{•Ÿ>ßA ÙjÌÖ½ßßýò û^BŠ¨·?y8¤€°ÀcN ÷öñ_÷ÎѵÅf‹ˆ@ó|J£LTD/Íëîé±i|Õ9ËÍßûßï~Û·ö f äÒÈ,É5¦‰BKš4P4¡üJ`€=æs€Ìjž»XÚ­IDÍ#Dîè—<šû.Û@rÿÖ¼|W˜(½ Ý·¼ŠcòìûHÄÍIÖ p¨?¤­B4[)⇦™WgQüHJý%§ ”È[Z¹:%”œüC@8¤õDž 4Ó*q<ëÿ.‘&žg©nEqÜQÔ°*×ϳHôÒåµz6eR‰Òè_’l8üÜ ‘- ©¤€bÖL㛨n…Wò˜X”C¢ =ûÄÿµiú² µü'mæv<Š²<ÝR-ôP×VøšLí1cous«›Qí0iÚhb–ú[žŠò]Û½s8ÓA@!ëޑRMs¹&ÝB­5ÿ¤DŒŠè"dt5f퐁P:9Ì#Œ8w†L‹ÚÚ022œ˜ë¦(<#DFv‘9íŸÓkÌsWèöxD·Ê% +€¯,(È;íUq;Vƒ]GõY•£*É3y“Ñ6š ¡€ w<·®´µP¬Pm¦½éhÔ¤ªrå}„.£Ó¢šN#}MqÆzvR‘f/vèJd”r›*›d¯FY‡ —f¸ÞN ÷°I¿ BöɂßÚ°¿ma‹~ë²»ÂoG<Ü~Ûã¡ö>¹òâæ¯Ivx‰A‚CH@@iØW<É*½uöLúkÀ}@BÆֆÍxl [tY—Ý>ëâaI¢¶GC*¢ðO©¬V)VŽX'ÞbZŠ¥dI™5'ŒF-ë26ºF–1 ‡*‡^`vº”irÔÍk!”>ÿM‡"¢€…áb(Z°¹P4°åPtØ]ŠC¡hó¨K‰SRgã¤2qSÎ\¹dÚ§dqÉ©LÖ NeÁæ¼ÊÀ–ÝÊaw_ y8sDÆKžW‡²Š*áN2=ó™$ñ^v7ë1œBâÐ!t´P32Ô¢Š£+D’pjhs¸H·K]¥K0ٌz_¢T+¥~3`“NƒÚ9’õL”šBýxN²Ñ¾ђêlNv[ÖÝawðCnåmßeÕ¬Š“±ø`ÎÖ7׫<‡™üÛ9ò‡æT(kón|·Â„Ÿò¥¤cÃæ6°e…v×(<äáVئqÎË*“ç—Ä¢‰?ÝRs@ýWzmïLmìm©,ŽH@d•ëîëý\Ÿ§EˆcÀ1¡ 9͆Íä´¶˜Ó\vWä4+ï7èñèÊ¡¯ÿûÔ¬×PN„I½è[Âã×Ê#cÉàQ7ŒßïbµEÅ_¥Áý†ËIµ>$›·«Ë-àÈgƒƒn‘WyõvkÖ»xdR™k竎{=-TnœÊú¢¢øUõÕõ¹iåý£(ErUg 9î˜BQ˽ ¥h ¯d&®š:lMZ_Ï<Ó@KÌEQZˆ(~뾈ˋ¹µËCqZÁš§(Š¼°.«ÌՎ\ Bq=É¢N}}eG‰¾f d‘åqgî&ÒŒ/" âòè†íHÊ*$“׊ƒ?AõÜÆendstream +endobj +1488 0 obj << +/Type /Page +/Contents 1489 0 R +/Resources 1487 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1490 0 obj << +/D [1488 0 R /XYZ 71.731 729.2652 null] +>> endobj +1491 0 obj << +/D [1488 0 R /XYZ 71.731 741.2204 null] +>> endobj +1492 0 obj << +/D [1488 0 R /XYZ 71.731 718.3063 null] +>> endobj +1493 0 obj << +/D [1488 0 R /XYZ 71.731 669.8397 null] +>> endobj +1494 0 obj << +/D [1488 0 R /XYZ 71.731 638.5943 null] +>> endobj +1495 0 obj << +/D [1488 0 R /XYZ 181.5683 627.2478 null] +>> endobj +1496 0 obj << +/D [1488 0 R /XYZ 71.731 617.1856 null] +>> endobj +1497 0 obj << +/D [1488 0 R /XYZ 71.731 583.7625 null] +>> endobj +1498 0 obj << +/D [1488 0 R /XYZ 71.731 572.6526 null] +>> endobj +1499 0 obj << +/D [1488 0 R /XYZ 71.731 571.4073 null] +>> endobj +1500 0 obj << +/D [1488 0 R /XYZ 129.5143 552.3288 null] +>> endobj +1501 0 obj << +/D [1488 0 R /XYZ 129.5143 552.3288 null] +>> endobj +1502 0 obj << +/D [1488 0 R /XYZ 71.731 550.8892 null] +>> endobj +1503 0 obj << +/D [1488 0 R /XYZ 71.731 550.8892 null] +>> endobj +1504 0 obj << +/D [1488 0 R /XYZ 139.477 534.396 null] +>> endobj +1505 0 obj << +/D [1488 0 R /XYZ 139.477 534.396 null] +>> endobj +1506 0 obj << +/D [1488 0 R /XYZ 76.7123 516.4633 null] +>> endobj +1507 0 obj << +/D [1488 0 R /XYZ 129.5143 498.5305 null] +>> endobj +1508 0 obj << +/D [1488 0 R /XYZ 129.5143 498.5305 null] +>> endobj +1509 0 obj << +/D [1488 0 R /XYZ 71.731 496.3737 null] +>> endobj +1510 0 obj << +/D [1488 0 R /XYZ 71.731 496.3737 null] +>> endobj +1511 0 obj << +/D [1488 0 R /XYZ 139.477 480.5978 null] +>> endobj +1512 0 obj << +/D [1488 0 R /XYZ 71.731 479.1582 null] +>> endobj +1513 0 obj << +/D [1488 0 R /XYZ 139.477 462.665 null] +>> endobj +1514 0 obj << +/D [1488 0 R /XYZ 76.7123 444.7322 null] +>> endobj +1515 0 obj << +/D [1488 0 R /XYZ 129.5143 426.7995 null] +>> endobj +1516 0 obj << +/D [1488 0 R /XYZ 129.5143 426.7995 null] +>> endobj +1517 0 obj << +/D [1488 0 R /XYZ 71.731 425.6205 null] +>> endobj +1518 0 obj << +/D [1488 0 R /XYZ 71.731 425.6205 null] +>> endobj +1519 0 obj << +/D [1488 0 R /XYZ 139.477 408.8667 null] +>> endobj +1520 0 obj << +/D [1488 0 R /XYZ 139.477 408.8667 null] +>> endobj +1521 0 obj << +/D [1488 0 R /XYZ 71.731 406.7099 null] +>> endobj +1522 0 obj << +/D [1488 0 R /XYZ 139.477 390.934 null] +>> endobj +1523 0 obj << +/D [1488 0 R /XYZ 139.477 390.934 null] +>> endobj +1524 0 obj << +/D [1488 0 R /XYZ 71.731 388.7772 null] +>> endobj +1525 0 obj << +/D [1488 0 R /XYZ 139.477 373.0012 null] +>> endobj +1526 0 obj << +/D [1488 0 R /XYZ 139.477 373.0012 null] +>> endobj +1527 0 obj << +/D [1488 0 R /XYZ 71.731 370.8444 null] +>> endobj +1528 0 obj << +/D [1488 0 R /XYZ 139.477 355.0685 null] +>> endobj +1529 0 obj << +/D [1488 0 R /XYZ 139.477 355.0685 null] +>> endobj +1530 0 obj << +/D [1488 0 R /XYZ 71.731 317.2105 null] +>> endobj +1531 0 obj << +/D [1488 0 R /XYZ 71.731 304.1595 null] +>> endobj +1532 0 obj << +/D [1488 0 R /XYZ 71.731 302.9142 null] +>> endobj +1533 0 obj << +/D [1488 0 R /XYZ 129.5143 283.8356 null] +>> endobj +642 0 obj << +/D [1488 0 R /XYZ 71.731 277.0711 null] +>> endobj +86 0 obj << +/D [1488 0 R /XYZ 305.1364 233.6 null] +>> endobj +1534 0 obj << +/D [1488 0 R /XYZ 71.731 210.1112 null] +>> endobj +1535 0 obj << +/D [1488 0 R /XYZ 161.0655 200.7233 null] +>> endobj +1536 0 obj << +/D [1488 0 R /XYZ 71.731 188.6038 null] +>> endobj +1537 0 obj << +/D [1488 0 R /XYZ 71.731 157.2379 null] +>> endobj +1538 0 obj << +/D [1488 0 R /XYZ 168.8063 146.2276 null] +>> endobj +1539 0 obj << +/D [1488 0 R /XYZ 71.731 119.1642 null] +>> endobj +1487 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1542 0 obj << +/Length 1054 +/Filter /FlateDecode +>> +stream +xÚÍX]£6}Ÿ_Ác"m\Ûàö-ÝvªVíj´Ê>uª<$)­æß×L0U_ªy€Œï=ßc®AT(`°P]p 0%88_`ð¦†~y@r0˜ƒ úñôðÃcƒÄÓàô„1„E 1àñà”þ¹ûtInRTû&p‡Aw}ʓBÈߓoÝÏãÓ¯ÝÍB^Ê´ÞÿuúíáçSŸŸ„ Ä\%Y$Ù£¦4qpE“Fš&R£EaÀ a²–ç!›ª¨;¨»d¯ÝµnÎgQׯMþ¡ûÇëÁ]ÒäÒàKyÕ÷¬@Soó ²ÌíAËÂh—î˜çå“Ýw‘v!¾”¹¨?öÓºv6F€"·³“ôš[S=íÙ%Urjº®¸)9b…ˆÅ^q{ÔÁ…Yq•ð ¢VÜI4Mác2ɋ±RaoÞûëÀÃΚò¹o‘G<’F^<²á@AC>š%—Us–îêSÏ…ÌΉÌÊÂE6•˜> ¡@8VK7Sµ=êàÂa‘6žû@=lVXµøG±7ï¼°v֔ÇXØ0ccG¥Kç]º„©má^߬x³úzd½váÚ{Yvצ³ÕK" +X³•êua ÕÛÃV«×—wCõNxø«wÄ£(Sñ’¥/eõr)kY(G{äF0 ²p¬wVH³UUîÌ×,æ€#¯Õ¬[ªY [¯YOÞ-5ëááHbkÖ¥¡1å÷YéjTJu>CˆÕkVçѪؒ4¶.'ïi<<<Ò¸4Fæ|lòü½»ý»IòNcL· ½®ŒQ[+_s¥ [pe[u¥/ïWNxø]9â¡]ùV•ÍÍXsΖJ`Èúo¶ŒSQȚ-]ØBíõ°ÕÚóåÝP{>ÓÚÑðÙ²•÷_84R ×ê–T²°u•Oç`FnçF Øe%ÕL´õdñ“¨ÏUvÓMÛÝP )îéš3S2PwyÉ@ÆìÅh@=¤9F>¶'›áf×Ou“÷Á/‰M›W"IÍ í›6všŠ»n³Ò«j7éIžkv—F;jÃJ¨-»¾›v’æ€èì‡OCê1endstream +endobj +1541 0 obj << +/Type /Page +/Contents 1542 0 R +/Resources 1540 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1543 0 obj << +/D [1541 0 R /XYZ 71.731 729.2652 null] +>> endobj +1544 0 obj << +/D [1541 0 R /XYZ 71.731 741.2204 null] +>> endobj +1545 0 obj << +/D [1541 0 R /XYZ 71.731 718.3063 null] +>> endobj +1546 0 obj << +/D [1541 0 R /XYZ 71.731 633.8332 null] +>> endobj +1547 0 obj << +/D [1541 0 R /XYZ 71.731 620.8718 null] +>> endobj +1548 0 obj << +/D [1541 0 R /XYZ 71.731 619.6265 null] +>> endobj +1549 0 obj << +/D [1541 0 R /XYZ 129.5143 600.5479 null] +>> endobj +1550 0 obj << +/D [1541 0 R /XYZ 129.5143 600.5479 null] +>> endobj +1551 0 obj << +/D [1541 0 R /XYZ 71.731 599.1084 null] +>> endobj +1552 0 obj << +/D [1541 0 R /XYZ 71.731 599.1084 null] +>> endobj +1553 0 obj << +/D [1541 0 R /XYZ 139.477 582.6152 null] +>> endobj +1554 0 obj << +/D [1541 0 R /XYZ 139.477 582.6152 null] +>> endobj +1555 0 obj << +/D [1541 0 R /XYZ 76.7123 564.6824 null] +>> endobj +1556 0 obj << +/D [1541 0 R /XYZ 129.5143 546.7497 null] +>> endobj +1557 0 obj << +/D [1541 0 R /XYZ 129.5143 546.7497 null] +>> endobj +1558 0 obj << +/D [1541 0 R /XYZ 71.731 544.5928 null] +>> endobj +1559 0 obj << +/D [1541 0 R /XYZ 71.731 544.5928 null] +>> endobj +1560 0 obj << +/D [1541 0 R /XYZ 139.477 528.8169 null] +>> endobj +1561 0 obj << +/D [1541 0 R /XYZ 71.731 527.3774 null] +>> endobj +1562 0 obj << +/D [1541 0 R /XYZ 139.477 510.8842 null] +>> endobj +1563 0 obj << +/D [1541 0 R /XYZ 76.7123 492.9514 null] +>> endobj +1564 0 obj << +/D [1541 0 R /XYZ 129.5143 475.0187 null] +>> endobj +1565 0 obj << +/D [1541 0 R /XYZ 129.5143 475.0187 null] +>> endobj +1566 0 obj << +/D [1541 0 R /XYZ 71.731 472.8618 null] +>> endobj +1567 0 obj << +/D [1541 0 R /XYZ 71.731 472.8618 null] +>> endobj +1568 0 obj << +/D [1541 0 R /XYZ 139.477 457.0859 null] +>> endobj +1569 0 obj << +/D [1541 0 R /XYZ 71.731 454.9291 null] +>> endobj +1570 0 obj << +/D [1541 0 R /XYZ 139.477 439.1532 null] +>> endobj +1571 0 obj << +/D [1541 0 R /XYZ 71.731 401.2951 null] +>> endobj +1572 0 obj << +/D [1541 0 R /XYZ 71.731 388.2442 null] +>> endobj +1573 0 obj << +/D [1541 0 R /XYZ 71.731 386.9988 null] +>> endobj +1574 0 obj << +/D [1541 0 R /XYZ 129.5143 367.9203 null] +>> endobj +643 0 obj << +/D [1541 0 R /XYZ 71.731 361.4994 null] +>> endobj +90 0 obj << +/D [1541 0 R /XYZ 247.1379 317.6847 null] +>> endobj +1575 0 obj << +/D [1541 0 R /XYZ 71.731 297.5443 null] +>> endobj +1576 0 obj << +/D [1541 0 R /XYZ 161.0655 284.8079 null] +>> endobj +1577 0 obj << +/D [1541 0 R /XYZ 71.731 272.6885 null] +>> endobj +1578 0 obj << +/D [1541 0 R /XYZ 71.731 241.3226 null] +>> endobj +1579 0 obj << +/D [1541 0 R /XYZ 168.8063 230.3123 null] +>> endobj +1580 0 obj << +/D [1541 0 R /XYZ 71.731 203.2489 null] +>> endobj +1581 0 obj << +/D [1541 0 R /XYZ 71.731 162.0783 null] +>> endobj +1582 0 obj << +/D [1541 0 R /XYZ 71.731 143.5891 null] +>> endobj +1583 0 obj << +/D [1541 0 R /XYZ 71.731 112.6531 null] +>> endobj +1584 0 obj << +/D [1541 0 R /XYZ 181.5683 100.9973 null] +>> endobj +1540 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1587 0 obj << +/Length 1123 +/Filter /FlateDecode +>> +stream +xÚÅX]o¤6}ϯàqFʸþÀ6ä¡ÒtÛ]íj[VÓ§¦Š8 ³|h•_ƒm0àžºÊŒrì{îñ¹ö5ȃòyNä‡3Š½ør½Wù¯OwHCs°A¿ï~ùH ‚aæ_<2@¹ïq‚A@Qà“vÞ¢k-ÊýS¸Ã@=OY”‹úkô¬~OŸÕ˟¢~+’jÿïùËÝç>>%„ ²H²GÍiâÐ $Mæ·4‘ü/E>ñ8 ñ ïxFÉ%Íïkª_j¿µdº†DúõÐ&ʙšà´Gt•ÑEÈt«‡iɨqQ + O˜3‡u°a&™‡¨Ëa6[Kác:‹‹±LagÜésàaFÍyÀ¥åˆGÔÔ.Ù°`¡…<(«ºlâú~bƒv¼Èë4Žê´ÈmdSŠy‚†‚\„`àÖ 6lµþ%d`7…•‹±:ãÞ֌šó KBàs>¦q”º¨q¨K`¾¬¾©¾iþjôuÈzQÓ)·êÙTâ¶{!اdͽlɽ¶î^GÜ-îò¸á^›G^$â)MžŠòé­¨ê\V´Cn}À!'c½Ó¼V/Ei/ÀMÏҀ‚0[ñ¬ [ðl[õ¬+îϺxX’hώhHE´ýþ’ºj•’Ö†by0ܔ†Q@x¸VÎ6lI[—Æw‹4il£âüØdÙ»zýÞD™RG¦mCgUR“ærUÚ°…ªìa«U銻¡*g<ÜU9âqY”ŽB$ àYj]OþÞ`º>u„ ÐÚálք4°u!q·9åqCH›Çµ(ëm‡³CÄnp÷–7—g%¤lƒˆÌ}臔»¿ yZç O€ä¯hmôîa«Z»ânÐÚÅÃ*p£õˆÇ  Ғ¾èc¡‰cQU/M¦—Bòã#Ú-܁rÀÒîn`BÕÂa€XÛ?ó`wLöî’vYæ+és`È'ÝiYÔEý~ýˆÁ(¦Å0„ª×H’~Õ!…mO¦s©ÒڐYñšæOÏQ%Lë,Ë´«±,©ä0´µ{þ]Tq™^ÛÆd‰!‘7 †{†•îµ%ÅÓÝãÔyÄE^—E¦œ<­‡ÌdšÓQ$;%ìUģ͸Í^_cŽyÛ󿛩TÖ7†¥ù\ ;}ߕÜwÛŒ2µ÷’Mù#­4./íòGMV»¦f +bUý鳁æÉp·Ée/˜ E±™ð鬊ܜJQ’ô›A5+Õ:+ÕóAªª§#Ý+»Yfo­Ç ¨6ü~™~U¯pX«y1iNåéõ[íxÌ2íÍà[‘‰jkíüowI$5õI¸vîÛ°…-´‡­n¡®¸¶Ð÷q5âñsî’a(dkm¹…Zh= jµótÝÐxNI8¯‘6‡Ÿw‹ÔŸ‘üÈm)\üÒdaæš(ærsD¤Ÿ©åŠøÍÏFŽ€ÿ&uWendstream +endobj +1586 0 obj << +/Type /Page +/Contents 1587 0 R +/Resources 1585 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1588 0 obj << +/D [1586 0 R /XYZ 71.731 729.2652 null] +>> endobj +1589 0 obj << +/D [1586 0 R /XYZ 71.731 686.4773 null] +>> endobj +1590 0 obj << +/D [1586 0 R /XYZ 71.731 675.3674 null] +>> endobj +1591 0 obj << +/D [1586 0 R /XYZ 71.731 674.1221 null] +>> endobj +1592 0 obj << +/D [1586 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1593 0 obj << +/D [1586 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1594 0 obj << +/D [1586 0 R /XYZ 71.731 653.604 null] +>> endobj +1595 0 obj << +/D [1586 0 R /XYZ 71.731 653.604 null] +>> endobj +1596 0 obj << +/D [1586 0 R /XYZ 139.477 637.1108 null] +>> endobj +1597 0 obj << +/D [1586 0 R /XYZ 139.477 637.1108 null] +>> endobj +1598 0 obj << +/D [1586 0 R /XYZ 76.7123 619.1781 null] +>> endobj +1599 0 obj << +/D [1586 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1600 0 obj << +/D [1586 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1601 0 obj << +/D [1586 0 R /XYZ 71.731 599.0885 null] +>> endobj +1602 0 obj << +/D [1586 0 R /XYZ 71.731 599.0885 null] +>> endobj +1603 0 obj << +/D [1586 0 R /XYZ 139.477 583.3126 null] +>> endobj +1604 0 obj << +/D [1586 0 R /XYZ 71.731 581.873 null] +>> endobj +1605 0 obj << +/D [1586 0 R /XYZ 139.477 565.3798 null] +>> endobj +1606 0 obj << +/D [1586 0 R /XYZ 76.7123 547.4471 null] +>> endobj +1607 0 obj << +/D [1586 0 R /XYZ 129.5143 529.5143 null] +>> endobj +1608 0 obj << +/D [1586 0 R /XYZ 129.5143 529.5143 null] +>> endobj +1609 0 obj << +/D [1586 0 R /XYZ 71.731 528.0748 null] +>> endobj +1610 0 obj << +/D [1586 0 R /XYZ 129.5143 511.5816 null] +>> endobj +1611 0 obj << +/D [1586 0 R /XYZ 129.5143 511.5816 null] +>> endobj +1612 0 obj << +/D [1586 0 R /XYZ 71.731 489.4994 null] +>> endobj +1613 0 obj << +/D [1586 0 R /XYZ 71.731 478.6053 null] +>> endobj +1614 0 obj << +/D [1586 0 R /XYZ 71.731 477.36 null] +>> endobj +1615 0 obj << +/D [1586 0 R /XYZ 129.5143 458.2814 null] +>> endobj +644 0 obj << +/D [1586 0 R /XYZ 71.731 451.8606 null] +>> endobj +94 0 obj << +/D [1586 0 R /XYZ 184.4394 408.0458 null] +>> endobj +1616 0 obj << +/D [1586 0 R /XYZ 71.731 387.9054 null] +>> endobj +1617 0 obj << +/D [1586 0 R /XYZ 161.0655 375.1691 null] +>> endobj +1618 0 obj << +/D [1586 0 R /XYZ 71.731 363.0496 null] +>> endobj +1619 0 obj << +/D [1586 0 R /XYZ 71.731 331.6837 null] +>> endobj +1620 0 obj << +/D [1586 0 R /XYZ 168.8063 320.6735 null] +>> endobj +1621 0 obj << +/D [1586 0 R /XYZ 71.731 293.61 null] +>> endobj +1622 0 obj << +/D [1586 0 R /XYZ 71.731 252.4394 null] +>> endobj +1623 0 obj << +/D [1586 0 R /XYZ 71.731 233.9502 null] +>> endobj +1624 0 obj << +/D [1586 0 R /XYZ 71.731 202.3687 null] +>> endobj +1625 0 obj << +/D [1586 0 R /XYZ 181.5683 191.3584 null] +>> endobj +1626 0 obj << +/D [1586 0 R /XYZ 71.731 181.2962 null] +>> endobj +1627 0 obj << +/D [1586 0 R /XYZ 71.731 147.873 null] +>> endobj +1628 0 obj << +/D [1586 0 R /XYZ 71.731 136.7632 null] +>> endobj +1629 0 obj << +/D [1586 0 R /XYZ 71.731 135.5179 null] +>> endobj +1630 0 obj << +/D [1586 0 R /XYZ 129.5143 116.4393 null] +>> endobj +1631 0 obj << +/D [1586 0 R /XYZ 129.5143 116.4393 null] +>> endobj +1632 0 obj << +/D [1586 0 R /XYZ 71.731 114.9998 null] +>> endobj +1633 0 obj << +/D [1586 0 R /XYZ 71.731 114.9998 null] +>> endobj +1634 0 obj << +/D [1586 0 R /XYZ 139.477 98.5066 null] +>> endobj +1635 0 obj << +/D [1586 0 R /XYZ 139.477 98.5066 null] +>> endobj +1585 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1638 0 obj << +/Length 1225 +/Filter /FlateDecode +>> +stream +xÚ¥˜[£6ÇßçSð˜H×÷˺«Æ>˜Ž4@•üê–,,æÎG™VvŸ&û¼ØgùkzÚŽK[»®âvKˆKi f}Ùcƒ9=UÍ oïKYééu¼°.´¢ˆ+íÇÞ«6®ì”Ô™s·N6 òSn¼q§vWy}8H˜_Õ½ ò®Añm)%öT¥ÏSHßI4‚#Á¡qdsh:Y'î44®&7FtÊ,=´ÃsakJÿŒÌö%•)•1¡‚tdsÙÉÂ鉻¤ ‡>& +Òõq>\ö/©Íš‡×€«ˆj=(Bàz9TӉ…1R\kΑÍ%V' '–'î’Äú¸gÖ%–kãRÚâ¿ù[\ A »%âîýŸÍÀÅ RhèF„‡*ԕ̀ìeA¾¸ @Ž|xAÞÙ8y•òìÛ@v³´ß[ôÚ6ë²<¶ß«ê\¶ãÊfЧ©KŽ´†j PwdsÔ;Y˜º'îêC~ꮍôìë· Q#ÈÞvÍgœ$…-Ëi’\"õ ‘tds$;Y˜¤'î’C~’®S^Yßc<3mÔ Ìiy°Y½™Ì/eóU?™& 0‘¡§ª+›ƒÙÉÂ0=q—ÀúðÃtmó²úö§ª;‹$!k|ª:²9, Òw È¡?H×Æ[žØìeeO±™bÉ›†ˆÀ¡Ç¥+›ÁÙ˂8}qàùðâ¼³qŽËòK^$þ¼ÔZé¯íöõnš`ý^*0Ò؈ëõŸlu)Nåãän”S‚ xó»QW6³íeÁݨ/î‚ݨχÓpú{îú¸½Îün×T¬¾´-6©iҌŸ±Àß7C cÒ¾ó¼´ô/‡4¥—KW°…(×¼ +)ÍؘDBÒÞGÛ~ⶠÝa¯- +±B׬Åps%’LI7]ÛMÕÑN\ÿÕ÷­¥ðR߈ø’Um„B_ÒÒ¢¥8¶Y–_ÍØÖÁ§<³åÒ;'oéii¨ÝšˆU\@}W¶˜©`Bb„É@»²™ +îeÁ +öÅ]PÁ#þ÷É;u"ûš‡Nï{|78I«¯¯/qÇ®òRLwu‚47¬mȕʹ¡^lC¾¸ ÚÐȇ· ÝÙØ—æ”Ñÿž.¹â3hëÁúÖL×pÞ÷©ábÛ3T®¡gI3{ÌêhƧ¬‚jÈcú™j¯DOž™zþ­ráendstream +endobj +1637 0 obj << +/Type /Page +/Contents 1638 0 R +/Resources 1636 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1639 0 obj << +/D [1637 0 R /XYZ 71.731 729.2652 null] +>> endobj +1640 0 obj << +/D [1637 0 R /XYZ 76.7123 708.3437 null] +>> endobj +1641 0 obj << +/D [1637 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1642 0 obj << +/D [1637 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1643 0 obj << +/D [1637 0 R /XYZ 71.731 688.2541 null] +>> endobj +1644 0 obj << +/D [1637 0 R /XYZ 71.731 688.2541 null] +>> endobj +1645 0 obj << +/D [1637 0 R /XYZ 139.477 672.4782 null] +>> endobj +1646 0 obj << +/D [1637 0 R /XYZ 71.731 671.0386 null] +>> endobj +1647 0 obj << +/D [1637 0 R /XYZ 139.477 654.5454 null] +>> endobj +1648 0 obj << +/D [1637 0 R /XYZ 76.7123 636.6127 null] +>> endobj +1649 0 obj << +/D [1637 0 R /XYZ 129.5143 618.6799 null] +>> endobj +1650 0 obj << +/D [1637 0 R /XYZ 129.5143 618.6799 null] +>> endobj +1651 0 obj << +/D [1637 0 R /XYZ 71.731 617.2992 null] +>> endobj +1652 0 obj << +/D [1637 0 R /XYZ 71.731 617.2992 null] +>> endobj +1653 0 obj << +/D [1637 0 R /XYZ 139.477 600.7472 null] +>> endobj +1654 0 obj << +/D [1637 0 R /XYZ 139.477 600.7472 null] +>> endobj +1655 0 obj << +/D [1637 0 R /XYZ 71.731 598.5904 null] +>> endobj +1656 0 obj << +/D [1637 0 R /XYZ 139.477 582.8144 null] +>> endobj +1657 0 obj << +/D [1637 0 R /XYZ 139.477 582.8144 null] +>> endobj +1658 0 obj << +/D [1637 0 R /XYZ 71.731 580.6576 null] +>> endobj +1659 0 obj << +/D [1637 0 R /XYZ 139.477 564.8817 null] +>> endobj +1660 0 obj << +/D [1637 0 R /XYZ 139.477 564.8817 null] +>> endobj +1661 0 obj << +/D [1637 0 R /XYZ 71.731 562.7248 null] +>> endobj +1662 0 obj << +/D [1637 0 R /XYZ 139.477 546.9489 null] +>> endobj +1663 0 obj << +/D [1637 0 R /XYZ 139.477 546.9489 null] +>> endobj +1664 0 obj << +/D [1637 0 R /XYZ 71.731 544.7921 null] +>> endobj +1665 0 obj << +/D [1637 0 R /XYZ 139.477 529.0162 null] +>> endobj +1666 0 obj << +/D [1637 0 R /XYZ 139.477 529.0162 null] +>> endobj +1667 0 obj << +/D [1637 0 R /XYZ 71.731 526.8593 null] +>> endobj +1668 0 obj << +/D [1637 0 R /XYZ 139.477 511.0834 null] +>> endobj +1669 0 obj << +/D [1637 0 R /XYZ 139.477 511.0834 null] +>> endobj +1670 0 obj << +/D [1637 0 R /XYZ 71.731 508.9266 null] +>> endobj +1671 0 obj << +/D [1637 0 R /XYZ 139.477 493.1507 null] +>> endobj +1672 0 obj << +/D [1637 0 R /XYZ 139.477 493.1507 null] +>> endobj +1673 0 obj << +/D [1637 0 R /XYZ 71.731 455.2926 null] +>> endobj +1674 0 obj << +/D [1637 0 R /XYZ 71.731 442.2417 null] +>> endobj +1675 0 obj << +/D [1637 0 R /XYZ 71.731 440.9963 null] +>> endobj +1676 0 obj << +/D [1637 0 R /XYZ 129.5143 421.9178 null] +>> endobj +645 0 obj << +/D [1637 0 R /XYZ 71.731 414.7796 null] +>> endobj +98 0 obj << +/D [1637 0 R /XYZ 184.904 371.6822 null] +>> endobj +1677 0 obj << +/D [1637 0 R /XYZ 71.731 351.5418 null] +>> endobj +1678 0 obj << +/D [1637 0 R /XYZ 161.0655 338.8055 null] +>> endobj +1679 0 obj << +/D [1637 0 R /XYZ 71.731 326.686 null] +>> endobj +1680 0 obj << +/D [1637 0 R /XYZ 71.731 295.3201 null] +>> endobj +1681 0 obj << +/D [1637 0 R /XYZ 168.8063 284.3098 null] +>> endobj +1682 0 obj << +/D [1637 0 R /XYZ 71.731 257.2464 null] +>> endobj +1683 0 obj << +/D [1637 0 R /XYZ 71.731 240.8245 null] +>> endobj +1684 0 obj << +/D [1637 0 R /XYZ 71.731 209.2429 null] +>> endobj +1685 0 obj << +/D [1637 0 R /XYZ 181.5683 198.2326 null] +>> endobj +1686 0 obj << +/D [1637 0 R /XYZ 71.731 188.1704 null] +>> endobj +1687 0 obj << +/D [1637 0 R /XYZ 71.731 156.5988 null] +>> endobj +1688 0 obj << +/D [1637 0 R /XYZ 71.731 143.6374 null] +>> endobj +1689 0 obj << +/D [1637 0 R /XYZ 71.731 142.3921 null] +>> endobj +1690 0 obj << +/D [1637 0 R /XYZ 129.5143 123.3136 null] +>> endobj +1691 0 obj << +/D [1637 0 R /XYZ 129.5143 123.3136 null] +>> endobj +1692 0 obj << +/D [1637 0 R /XYZ 71.731 121.874 null] +>> endobj +1693 0 obj << +/D [1637 0 R /XYZ 71.731 121.874 null] +>> endobj +1694 0 obj << +/D [1637 0 R /XYZ 139.477 105.3808 null] +>> endobj +1695 0 obj << +/D [1637 0 R /XYZ 139.477 105.3808 null] +>> endobj +1636 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1698 0 obj << +/Length 1176 +/Filter /FlateDecode +>> +stream +xÚ¥X[o£8}ï¯à1‘ŠÛ؆>¬”½U»ÛEÌÓvT1àLÑ$qѨÿ~?&˜ËjÔœæØßñù®;üaG`$(&Žy ¶;|^yè]c4p•û ¸2Ãp™)‹×c*O­X ÷«#8Fœ )ìC«mYu\ÉëãA¾ìÒö(ׄ]EÃ*:nÈjؤh#ñC«ÝiÑô®1[Ñhߊ[ßä»E+p3Àx¨Uš}½ï‚Uêð}Ü?¶‹Kýå”ÆíúÛ{¹Åló>-.óó™¿$®›WÖŵØ]#]\“FŲ¨,úR òUú~üø4ÖW›¾x‰£JN+L9☈%… ؜¶¬°Åî…‡<ì +›4TÊgÑYZ4öb$$«4ÖGØU„ÊE.©hÀæTÔ°e-vר8äaWѤÑκ8ý Š}Çúôü¤ŽR9ƒ ˜ã2^Øfų¬ê"+F×ͅùù¾À ­Ê„Í´ª¶ØªlvW´*£”jÇßðH³ª“ïƒÜ¶ùÞ¥¸rDš´^<æýÜ.=Xãv™;Ôq,ËòXk¯ÁE"˜5nv™@" ´QžPÖf AàuØ.‚Í.Q:Ùo)ÔéBê2ÏþVÏkÕ†‚@ñ@x5ÉÞ¹/ò*¯Þ/ò¡ßq ¶n¯K õ⠍µ]’ìeÑ#½±þ¾Q]½Ýk- +Ôx͋WyŽÒÓý¨·¼ª¨ú}£Ï˜²«˜”“e\¤—*ͳ9ÒPf'=é²5uÃôšÙìšTy÷|“³.2nʵì|Åq^gjÒÄc±óÆ؇kßðP‰j‘øÈöû~Ð"Ô~™U)Ì/‡&².¦[1a0%[hÅ&l¦÷°ÅVl³»¢xX[ñ èÒþà³¨Ë {}ø-9݌wYÏíq7• ¢~2z1§ÈçKÁk fbW£C×btEäIØ×$1î*‡ u†–ÝU°Â~:VÕèD=º«l.V5l9V-v×Ī…‡1ÅèX5i\‡˜O¥žÓD…_ÓêŠiiˆ@,‹ilÀæ¤Ñ°ei,v×Hcáa‘Ƥq;!é9*ºv-Ý&èÚ"˜$4Ë!ßîŒ  ÂÙwOfüꉑª1Ìø¥˜ápòE’Åà?•Iendstream +endobj +1697 0 obj << +/Type /Page +/Contents 1698 0 R +/Resources 1696 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1699 0 obj << +/D [1697 0 R /XYZ 71.731 729.2652 null] +>> endobj +1700 0 obj << +/D [1697 0 R /XYZ 76.7123 708.3437 null] +>> endobj +1701 0 obj << +/D [1697 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1702 0 obj << +/D [1697 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1703 0 obj << +/D [1697 0 R /XYZ 71.731 689.0302 null] +>> endobj +1704 0 obj << +/D [1697 0 R /XYZ 71.731 689.0302 null] +>> endobj +1705 0 obj << +/D [1697 0 R /XYZ 139.477 672.4782 null] +>> endobj +1706 0 obj << +/D [1697 0 R /XYZ 139.477 672.4782 null] +>> endobj +1707 0 obj << +/D [1697 0 R /XYZ 71.731 670.3214 null] +>> endobj +1708 0 obj << +/D [1697 0 R /XYZ 139.477 654.5454 null] +>> endobj +1709 0 obj << +/D [1697 0 R /XYZ 139.477 654.5454 null] +>> endobj +1710 0 obj << +/D [1697 0 R /XYZ 71.731 652.3886 null] +>> endobj +1711 0 obj << +/D [1697 0 R /XYZ 139.477 636.6127 null] +>> endobj +1712 0 obj << +/D [1697 0 R /XYZ 139.477 636.6127 null] +>> endobj +1713 0 obj << +/D [1697 0 R /XYZ 71.731 634.4559 null] +>> endobj +1714 0 obj << +/D [1697 0 R /XYZ 139.477 618.6799 null] +>> endobj +1715 0 obj << +/D [1697 0 R /XYZ 139.477 618.6799 null] +>> endobj +1716 0 obj << +/D [1697 0 R /XYZ 71.731 580.8219 null] +>> endobj +1717 0 obj << +/D [1697 0 R /XYZ 71.731 567.7709 null] +>> endobj +1718 0 obj << +/D [1697 0 R /XYZ 71.731 566.5256 null] +>> endobj +1719 0 obj << +/D [1697 0 R /XYZ 129.5143 547.4471 null] +>> endobj +646 0 obj << +/D [1697 0 R /XYZ 71.731 540.3089 null] +>> endobj +102 0 obj << +/D [1697 0 R /XYZ 236.7399 497.2114 null] +>> endobj +1720 0 obj << +/D [1697 0 R /XYZ 71.731 473.7227 null] +>> endobj +1721 0 obj << +/D [1697 0 R /XYZ 161.0655 464.3347 null] +>> endobj +1722 0 obj << +/D [1697 0 R /XYZ 71.731 452.2152 null] +>> endobj +1723 0 obj << +/D [1697 0 R /XYZ 71.731 420.8494 null] +>> endobj +1724 0 obj << +/D [1697 0 R /XYZ 168.8063 409.8391 null] +>> endobj +1725 0 obj << +/D [1697 0 R /XYZ 71.731 382.7757 null] +>> endobj +1726 0 obj << +/D [1697 0 R /XYZ 71.731 351.4098 null] +>> endobj +1727 0 obj << +/D [1697 0 R /XYZ 71.731 334.7722 null] +>> endobj +1728 0 obj << +/D [1697 0 R /XYZ 71.731 303.1906 null] +>> endobj +1729 0 obj << +/D [1697 0 R /XYZ 181.5683 292.1803 null] +>> endobj +1730 0 obj << +/D [1697 0 R /XYZ 71.731 282.1181 null] +>> endobj +1731 0 obj << +/D [1697 0 R /XYZ 71.731 248.695 null] +>> endobj +1732 0 obj << +/D [1697 0 R /XYZ 71.731 237.5851 null] +>> endobj +1733 0 obj << +/D [1697 0 R /XYZ 71.731 236.3398 null] +>> endobj +1734 0 obj << +/D [1697 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1735 0 obj << +/D [1697 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1736 0 obj << +/D [1697 0 R /XYZ 71.731 215.8217 null] +>> endobj +1737 0 obj << +/D [1697 0 R /XYZ 71.731 215.8217 null] +>> endobj +1738 0 obj << +/D [1697 0 R /XYZ 139.477 199.3285 null] +>> endobj +1739 0 obj << +/D [1697 0 R /XYZ 139.477 199.3285 null] +>> endobj +1740 0 obj << +/D [1697 0 R /XYZ 76.7123 181.3958 null] +>> endobj +1741 0 obj << +/D [1697 0 R /XYZ 129.5143 163.463 null] +>> endobj +1742 0 obj << +/D [1697 0 R /XYZ 129.5143 163.463 null] +>> endobj +1743 0 obj << +/D [1697 0 R /XYZ 71.731 161.3062 null] +>> endobj +1744 0 obj << +/D [1697 0 R /XYZ 71.731 161.3062 null] +>> endobj +1745 0 obj << +/D [1697 0 R /XYZ 139.477 145.5303 null] +>> endobj +1746 0 obj << +/D [1697 0 R /XYZ 71.731 144.0907 null] +>> endobj +1747 0 obj << +/D [1697 0 R /XYZ 139.477 127.5975 null] +>> endobj +1748 0 obj << +/D [1697 0 R /XYZ 76.7123 109.6647 null] +>> endobj +1696 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1751 0 obj << +/Length 1263 +/Filter /FlateDecode +>> +stream +xڝ˜ËŽ£8†÷õ,+RÅã Æv-FJϥ箨'³š•¨àTPˆ¸t«Þ~llˆP­, ÉoŸßŸí(€êƒ†#ê‚ÀÅÁþtƒWõ×Ç;d%k«Y»¢»»ï~&0@D8 +v‡€ˆPŒ`À)âÁ.ù÷þ‡c|®e¹Zc +ï10×mç²þ#~1_7Û_Í͟²>Iµúo÷ÛÝO»>>% ®‚Lš !"XcFÔ«BHJSƒ°~0X*ƒH¦×õ2=š'ŒéÐÂX Ü»¸ÃëÅG×jìƒð€+¨QØúPC¦($×>>Ë·çC*3êµ~™̹Pq´ôÑ ­ê²Ù×cï¶÷H@"ÏˬS­]مÒÉázíe7™©8Þ¸·™u­Æ>®™BÆ®mhdõÛYz€…P,ðXš¿>˜/¿¯0½—+DïßÌ]O~˜ «øÏÁtdS0;Ùü0] +¦‡£Z2„)ÇïàøEÿgM 3X«XXˆ(XS8´í蓬›2¯Gãî–hÀ!%3 ޕM,ø^6»à}q,xŸb?ﮏ4¯-¿¤FöÕ|ù¼BÐò|NóÛ¤ð{s Õ=2·éÁNG³ß˪:4™@5ÔnÙNöš2À8!í`B£68ŠjÎøý&Ñ“튨¸¥\¹oI1À1TÐõYÀ"³kmË¢.ôÊyì[\ò̶]c"Ä͚Ý$ÉV–:B?²¸©–Ĺýëù B¬wÂv¬c'ë®c×ɏ²Ú—é¹N‹|Ê QZ„{/•‰›KîND¼ßM^Ûóm“;)Þù³üÏrŸ¶?ÙéJsïhl·¥47M%;ì¢>ÊòkZÙyÐS7YíkڅÕX ™ Ý·C}’VñKÖ{y°ÃÛ­¸²aîe®›ØŽò+½ sóÏ9‰ki&TO¥ž°ÞŠ@DXä.x»Ó¥‡·¥õޜ·–†Äz¤`im²¬hít´>™¬–æuœœÒ¼ËâtiÌ­Nª¸ŒORTÛ!Vå¤b®þqeÛa/›Ý}ql‡#þúçʇÞ<Øp òÕ=ƒBS·—yîc½¸Ê¦¼}®cJŸ9×]ÙĹÞËfÏu_Üçúȇ÷\¿²±Q\Lî¯+£PÕ÷·÷ëÉtgÖrqÙnf¯>Ž"4w˜»²©ìídóÙ뉻${‡>nd¯ëÃn^7 x]iaNÞUÀ#¡Š/ÌéLnº²‰Üìe³¹é‹» 7G>¼¹yeã%-|5'Wç†gÑ_’òCZ¼–ñù¸Ò'òM|"èÜÒveSø:Ù<>OÜ%ø†>üø\‡´¬êç\7ùŏ©>î¾è#HڕÝõåFdŽçE5…ÓªæiŽƒ.90ágéxÈ⠒(&@þ­J›Ipúi”ÀYrŽl +]'›g牻ÞЇŸžk£Në̇Ny&\° v»¡÷]k?=ÌlvtdSô:Ù<=OÜ%ô†>üô\M™}Ó6øKq²…ô9~PáÙ@G6°“ÍôÄ]pèÃеq>ù·¦S<™4=˜=°9½¨çàÁ¨ìûҐõÄ%&_©:šñUŠ¹*h…è{jŸÆáÍ÷£ž€ÿþfèäendstream +endobj +1750 0 obj << +/Type /Page +/Contents 1751 0 R +/Resources 1749 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1752 0 obj << +/D [1750 0 R /XYZ 71.731 729.2652 null] +>> endobj +1753 0 obj << +/D [1750 0 R /XYZ 129.5143 708.3437 null] +>> endobj +1754 0 obj << +/D [1750 0 R /XYZ 129.5143 708.3437 null] +>> endobj +1755 0 obj << +/D [1750 0 R /XYZ 71.731 706.9629 null] +>> endobj +1756 0 obj << +/D [1750 0 R /XYZ 71.731 706.9629 null] +>> endobj +1757 0 obj << +/D [1750 0 R /XYZ 139.477 690.4109 null] +>> endobj +1758 0 obj << +/D [1750 0 R /XYZ 139.477 690.4109 null] +>> endobj +1759 0 obj << +/D [1750 0 R /XYZ 71.731 688.2541 null] +>> endobj +1760 0 obj << +/D [1750 0 R /XYZ 139.477 672.4782 null] +>> endobj +1761 0 obj << +/D [1750 0 R /XYZ 139.477 672.4782 null] +>> endobj +1762 0 obj << +/D [1750 0 R /XYZ 71.731 634.6202 null] +>> endobj +1763 0 obj << +/D [1750 0 R /XYZ 71.731 621.5692 null] +>> endobj +1764 0 obj << +/D [1750 0 R /XYZ 71.731 620.3239 null] +>> endobj +1765 0 obj << +/D [1750 0 R /XYZ 129.5143 601.2453 null] +>> endobj +647 0 obj << +/D [1750 0 R /XYZ 71.731 594.1072 null] +>> endobj +106 0 obj << +/D [1750 0 R /XYZ 205.6832 551.0097 null] +>> endobj +1766 0 obj << +/D [1750 0 R /XYZ 71.731 530.8693 null] +>> endobj +1767 0 obj << +/D [1750 0 R /XYZ 161.0655 518.133 null] +>> endobj +1768 0 obj << +/D [1750 0 R /XYZ 71.731 506.0135 null] +>> endobj +1769 0 obj << +/D [1750 0 R /XYZ 71.731 474.6476 null] +>> endobj +1770 0 obj << +/D [1750 0 R /XYZ 168.8063 463.6373 null] +>> endobj +1771 0 obj << +/D [1750 0 R /XYZ 71.731 436.5739 null] +>> endobj +1772 0 obj << +/D [1750 0 R /XYZ 71.731 405.208 null] +>> endobj +1773 0 obj << +/D [1750 0 R /XYZ 71.731 388.5704 null] +>> endobj +1774 0 obj << +/D [1750 0 R /XYZ 71.731 356.9889 null] +>> endobj +1775 0 obj << +/D [1750 0 R /XYZ 181.5683 345.9786 null] +>> endobj +1776 0 obj << +/D [1750 0 R /XYZ 71.731 335.9164 null] +>> endobj +1777 0 obj << +/D [1750 0 R /XYZ 71.731 302.4932 null] +>> endobj +1778 0 obj << +/D [1750 0 R /XYZ 71.731 291.3834 null] +>> endobj +1779 0 obj << +/D [1750 0 R /XYZ 71.731 290.1381 null] +>> endobj +1780 0 obj << +/D [1750 0 R /XYZ 129.5143 271.0595 null] +>> endobj +1781 0 obj << +/D [1750 0 R /XYZ 129.5143 271.0595 null] +>> endobj +1782 0 obj << +/D [1750 0 R /XYZ 71.731 269.62 null] +>> endobj +1783 0 obj << +/D [1750 0 R /XYZ 71.731 269.62 null] +>> endobj +1784 0 obj << +/D [1750 0 R /XYZ 139.477 253.1268 null] +>> endobj +1785 0 obj << +/D [1750 0 R /XYZ 139.477 253.1268 null] +>> endobj +1786 0 obj << +/D [1750 0 R /XYZ 76.7123 235.194 null] +>> endobj +1787 0 obj << +/D [1750 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1788 0 obj << +/D [1750 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1789 0 obj << +/D [1750 0 R /XYZ 71.731 215.8805 null] +>> endobj +1790 0 obj << +/D [1750 0 R /XYZ 71.731 215.8805 null] +>> endobj +1791 0 obj << +/D [1750 0 R /XYZ 139.477 199.3285 null] +>> endobj +1792 0 obj << +/D [1750 0 R /XYZ 139.477 199.3285 null] +>> endobj +1793 0 obj << +/D [1750 0 R /XYZ 71.731 197.1717 null] +>> endobj +1794 0 obj << +/D [1750 0 R /XYZ 139.477 181.3958 null] +>> endobj +1795 0 obj << +/D [1750 0 R /XYZ 139.477 181.3958 null] +>> endobj +1796 0 obj << +/D [1750 0 R /XYZ 71.731 179.2389 null] +>> endobj +1797 0 obj << +/D [1750 0 R /XYZ 139.477 163.463 null] +>> endobj +1798 0 obj << +/D [1750 0 R /XYZ 139.477 163.463 null] +>> endobj +1799 0 obj << +/D [1750 0 R /XYZ 71.731 161.3062 null] +>> endobj +1800 0 obj << +/D [1750 0 R /XYZ 139.477 145.5303 null] +>> endobj +1801 0 obj << +/D [1750 0 R /XYZ 139.477 145.5303 null] +>> endobj +1802 0 obj << +/D [1750 0 R /XYZ 71.731 143.3734 null] +>> endobj +1803 0 obj << +/D [1750 0 R /XYZ 139.477 127.5975 null] +>> endobj +1804 0 obj << +/D [1750 0 R /XYZ 139.477 127.5975 null] +>> endobj +1805 0 obj << +/D [1750 0 R /XYZ 71.731 125.4407 null] +>> endobj +1806 0 obj << +/D [1750 0 R /XYZ 139.477 109.6647 null] +>> endobj +1807 0 obj << +/D [1750 0 R /XYZ 139.477 109.6647 null] +>> endobj +1808 0 obj << +/D [1750 0 R /XYZ 71.731 107.5079 null] +>> endobj +1749 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1812 0 obj << +/Length 1196 +/Filter /FlateDecode +>> +stream +xÚ¥Xßo«6~ï_ÁÛéÆÃ6Æv&u»Ût§mŠî²§uª(8-R•!êúßï€m☦ªâG>Îùüù;>Åð‡#Ž§p ‘”‘(?ÞÅÑ üô󶐍Ål|Ð÷»»o¢q$‘LIíö•)b<‰8%H0,¢]ñ×ê‡×ì­Uz½!,^dŽÛCV©ö×ìÙ\>l¿˜“ßTûZÍúïÝ/w?î†üŒr$$™$™Ä%© Ñ†ÄĤ( !NÅOʇÁq„»Â`ÜëFóH»f‡a¸1Idäty¯gî©1*"¢¦IσJ”p~Iã-kš÷Z•ž÷y†„à’tÀ{£kÓê²zùdÕÎóúTµæ¢´Æñª‹Öß)+sÌõÇ[û³þ±¹µ¯õq4z§S*c”àXΨîÃ&T`³ª‡ò.P}Ä#¨ú uÌÊC@ràL…ä’ouyÌô‡¹P›>Nž…VMox00Ä×nXŒD,“>ÚW՞tÕ܏†A(†!œ`.pXv‡Úø°³ì’ÇFöQ´›²6Ä$˜÷¶ìî© ³’çé÷y”Ukuü]­ [½[ë*ÝÔÕSi}ÛYõ;sêY¶ÜÛé8å9½?¹ „¡p‹D?ÝÆ”öÚÊL• <ÎÅê¡èj¤Ø®)̟^c¶‚Ô»µ€ºù£lU¨9$å»Å§&âV×mÝ~¼©ûታç쳂QŠ…±ÜCQlûaz¹†Ñf§öõӕOµ~ê}jhà {ûP¿”ÕÓsÖ¨^ž1åcàSþ¬š\—omYWS¤),ý)H7&{ûjé6o*/㘨Â'lQõº…m_öW`?Rióf­²ÂÖ[fGu|v}¨¾Ò%°ŠU–ÒºÖ.žî§Ì %…R–Ò~ º/NUXjŸkÕ¸vyÍ_³êE³fà"{Ç_Ì`]º¥”§þZ`P7ým‡±ï ›­Åא^¿— ½d懺/77 _ëƒj–:7+ŽÐI¦Úv•éì¨`«0±ØQh‚s6³Øù°‰Ån€Í.v¡¼ »Ëã» ]Q‡zL‚b<ê0§Ü­ŒÃª{^Um™g]Éúȓ1q°yèsR$b¦yû°‰æ=Àf›w(ï‚æ=âlÞ4@³½ ¨Ë ÊعNlš²M¸‹5ìÔ¨›î%Œ!¸ 3îõaî`³î å]àޏ°{/xŒûP@m ûr­vév¤µöå¿íXx'À"Ûäû°)Ç:ؼcy—86ÀÃÛ÷8Çú4Î۞?׸ʢ3aßõmiÀ"„ÑÙbö`SÒ8ؼ4¼K¤ ðHãÓøϛë`=bAaã.æêчMÔ㛭ÇPÞõ8â®Ç Áí_ $1fðîœÊÿW“8…(ŒÍÕ¤›0ޛ5^(ïã…xŒwAã\“ç­ø¢šÄð>À™«I6%ƒÍKÈ»Dš€4>‹š<«ÓÊÜí{µêTúǼíBÝH(h÷ºË&_wí¨D S9ùÊÌ?Q1"`%å©ÏÃ7?8þ ‘cendstream +endobj +1811 0 obj << +/Type /Page +/Contents 1812 0 R +/Resources 1810 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1813 0 obj << +/D [1811 0 R /XYZ 71.731 729.2652 null] +>> endobj +1814 0 obj << +/D [1811 0 R /XYZ 139.477 708.3437 null] +>> endobj +1815 0 obj << +/D [1811 0 R /XYZ 139.477 708.3437 null] +>> endobj +1816 0 obj << +/D [1811 0 R /XYZ 71.731 706.1869 null] +>> endobj +1817 0 obj << +/D [1811 0 R /XYZ 139.477 690.4109 null] +>> endobj +1818 0 obj << +/D [1811 0 R /XYZ 139.477 690.4109 null] +>> endobj +1819 0 obj << +/D [1811 0 R /XYZ 71.731 652.5529 null] +>> endobj +1820 0 obj << +/D [1811 0 R /XYZ 71.731 639.5019 null] +>> endobj +1821 0 obj << +/D [1811 0 R /XYZ 71.731 638.2566 null] +>> endobj +1822 0 obj << +/D [1811 0 R /XYZ 129.5143 619.1781 null] +>> endobj +648 0 obj << +/D [1811 0 R /XYZ 71.731 612.0399 null] +>> endobj +110 0 obj << +/D [1811 0 R /XYZ 256.9159 568.9424 null] +>> endobj +1823 0 obj << +/D [1811 0 R /XYZ 71.731 548.8021 null] +>> endobj +1824 0 obj << +/D [1811 0 R /XYZ 161.0655 536.0657 null] +>> endobj +1825 0 obj << +/D [1811 0 R /XYZ 71.731 523.9463 null] +>> endobj +1826 0 obj << +/D [1811 0 R /XYZ 71.731 492.5804 null] +>> endobj +1827 0 obj << +/D [1811 0 R /XYZ 168.8063 481.5701 null] +>> endobj +1828 0 obj << +/D [1811 0 R /XYZ 71.731 454.5067 null] +>> endobj +1829 0 obj << +/D [1811 0 R /XYZ 71.731 426.4285 null] +>> endobj +1830 0 obj << +/D [1811 0 R /XYZ 71.731 395.4924 null] +>> endobj +1831 0 obj << +/D [1811 0 R /XYZ 181.5683 383.8366 null] +>> endobj +1832 0 obj << +/D [1811 0 R /XYZ 71.731 373.7744 null] +>> endobj +1833 0 obj << +/D [1811 0 R /XYZ 71.731 342.2028 null] +>> endobj +1834 0 obj << +/D [1811 0 R /XYZ 71.731 329.2414 null] +>> endobj +1835 0 obj << +/D [1811 0 R /XYZ 71.731 327.9961 null] +>> endobj +1836 0 obj << +/D [1811 0 R /XYZ 129.5143 308.9175 null] +>> endobj +1837 0 obj << +/D [1811 0 R /XYZ 129.5143 308.9175 null] +>> endobj +1838 0 obj << +/D [1811 0 R /XYZ 71.731 307.478 null] +>> endobj +1839 0 obj << +/D [1811 0 R /XYZ 71.731 307.478 null] +>> endobj +1840 0 obj << +/D [1811 0 R /XYZ 139.477 290.9848 null] +>> endobj +1841 0 obj << +/D [1811 0 R /XYZ 139.477 290.9848 null] +>> endobj +1842 0 obj << +/D [1811 0 R /XYZ 76.7123 273.052 null] +>> endobj +1843 0 obj << +/D [1811 0 R /XYZ 129.5143 255.1193 null] +>> endobj +1844 0 obj << +/D [1811 0 R /XYZ 129.5143 255.1193 null] +>> endobj +1845 0 obj << +/D [1811 0 R /XYZ 71.731 252.9625 null] +>> endobj +1846 0 obj << +/D [1811 0 R /XYZ 71.731 252.9625 null] +>> endobj +1847 0 obj << +/D [1811 0 R /XYZ 139.477 237.1865 null] +>> endobj +1848 0 obj << +/D [1811 0 R /XYZ 71.731 235.747 null] +>> endobj +1849 0 obj << +/D [1811 0 R /XYZ 139.477 219.2538 null] +>> endobj +1850 0 obj << +/D [1811 0 R /XYZ 76.7123 201.321 null] +>> endobj +1851 0 obj << +/D [1811 0 R /XYZ 129.5143 183.3883 null] +>> endobj +1852 0 obj << +/D [1811 0 R /XYZ 129.5143 183.3883 null] +>> endobj +1853 0 obj << +/D [1811 0 R /XYZ 71.731 181.2315 null] +>> endobj +1854 0 obj << +/D [1811 0 R /XYZ 71.731 181.2315 null] +>> endobj +1855 0 obj << +/D [1811 0 R /XYZ 139.477 165.4555 null] +>> endobj +1856 0 obj << +/D [1811 0 R /XYZ 71.731 164.016 null] +>> endobj +1857 0 obj << +/D [1811 0 R /XYZ 139.477 147.5228 null] +>> endobj +1858 0 obj << +/D [1811 0 R /XYZ 71.731 109.6647 null] +>> endobj +1859 0 obj << +/D [1811 0 R /XYZ 71.731 96.6138 null] +>> endobj +1810 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1862 0 obj << +/Length 1038 +/Filter /FlateDecode +>> +stream +xÚ¥X[£6}Ÿ_Ác"׌í}K¯Úª•¢Ýô©SØàì ˆ Ñjÿ}?À&&q©šÈpìïøøÛ@" $ ªM9Žç}…G¿¿ ‰-&öA?^~üáH!•Ò4:œ"¦RÄE F‘äDF‡üŸÍÏïÙ¥ÕfSŽ7 ×}™Uºý3û2üÜí?7éö½Î›í¿‡?^~=Œõ9HI(2K2!% «(¦)JxEˆBœƒÁ±„‰q0TEPG`Ò fč°n4¯”ò{v„Rùºº÷××*Èã&*!s’°)¢j$#Ã¥8 ×æz<ê¦9]ˎ&ôü1’®³˜ $$cpƒe<í;£ð¼›!7»|Kð&ßoÞÀ¤¾iê강xS.‹£¶ú$Å g7ë"øíMÝÖí÷‹þ0¶Ð"íYض1TM‰T}ƒ]žïµ¹+֏èsœ]Ûw;ÞKz+ò·Ú¼ésV”öAÓ5±ÿ¯²³†v$@7vÕ}º¿èæhŠK[ÔÕaþNéH¸ +·ï–isÑÇâcªsŸ«EÕKè~6 Owh¿«ÂÎJ£³ü»ý1\ÎúüÅ¥­¾ï¤¯`åª,mLm\‡¦Ÿ`0(Ä¥lfÝa‹ëN¨îŠu灓ž|ãº3áÑ1 Mî*tvî[s=ºEj\à»öºj‹cÖeÍG^ïMè(HŒÇIXX‡Š}ØMXÒí\“9ØSaaò1MT°îsa]«GSa™B‰S;ÐeØüêrˆ[ûê½¾EõÕéõÛ äïÆm8Eޙ°ßÓÌsià“µf6'ƒ-K¨»Fš€4>I4÷¦8gÆnÒ:îM7,…yn`s|šG*(Ü°¥<ú°™<Ž°Å<†ê®Èãp'<îl4J G.!ÿ_)OPJÉR}،åFØ¢åBuWX.ÄãÑr·4z'çUq¤p¨M¥\Š£›ÓÆÁ–µ Ô]£M€G@ŸÆ$Žž<ÎqÐ=ô@ùðV$±âþÁöùq¤%œ/½fú°™€Ž°Å€†ê®hˆGà5sÂcåk¦OÓ~*H$’$U³_<ÌãÇNáØI”{êßTéÓO‚ÿ|[Ðâendstream +endobj +1861 0 obj << +/Type /Page +/Contents 1862 0 R +/Resources 1860 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1863 0 obj << +/D [1861 0 R /XYZ 71.731 729.2652 null] +>> endobj +1864 0 obj << +/D [1861 0 R /XYZ 71.731 741.2204 null] +>> endobj +1865 0 obj << +/D [1861 0 R /XYZ 71.731 718.3063 null] +>> endobj +1866 0 obj << +/D [1861 0 R /XYZ 129.5143 708.3437 null] +>> endobj +649 0 obj << +/D [1861 0 R /XYZ 71.731 701.9228 null] +>> endobj +114 0 obj << +/D [1861 0 R /XYZ 265.5406 658.1081 null] +>> endobj +1867 0 obj << +/D [1861 0 R /XYZ 71.731 637.9677 null] +>> endobj +1868 0 obj << +/D [1861 0 R /XYZ 161.0655 625.2314 null] +>> endobj +1869 0 obj << +/D [1861 0 R /XYZ 71.731 613.1119 null] +>> endobj +1870 0 obj << +/D [1861 0 R /XYZ 71.731 581.746 null] +>> endobj +1871 0 obj << +/D [1861 0 R /XYZ 168.8063 570.7357 null] +>> endobj +1872 0 obj << +/D [1861 0 R /XYZ 71.731 543.6723 null] +>> endobj +1873 0 obj << +/D [1861 0 R /XYZ 71.731 517.4456 null] +>> endobj +1874 0 obj << +/D [1861 0 R /XYZ 71.731 484.6581 null] +>> endobj +1875 0 obj << +/D [1861 0 R /XYZ 181.5683 473.0022 null] +>> endobj +1876 0 obj << +/D [1861 0 R /XYZ 71.731 462.94 null] +>> endobj +1877 0 obj << +/D [1861 0 R /XYZ 71.731 429.5169 null] +>> endobj +1878 0 obj << +/D [1861 0 R /XYZ 71.731 418.407 null] +>> endobj +1879 0 obj << +/D [1861 0 R /XYZ 71.731 417.1617 null] +>> endobj +1880 0 obj << +/D [1861 0 R /XYZ 129.5143 398.0832 null] +>> endobj +1881 0 obj << +/D [1861 0 R /XYZ 129.5143 398.0832 null] +>> endobj +1882 0 obj << +/D [1861 0 R /XYZ 71.731 396.6436 null] +>> endobj +1883 0 obj << +/D [1861 0 R /XYZ 71.731 396.6436 null] +>> endobj +1884 0 obj << +/D [1861 0 R /XYZ 139.477 380.1504 null] +>> endobj +1885 0 obj << +/D [1861 0 R /XYZ 139.477 380.1504 null] +>> endobj +1886 0 obj << +/D [1861 0 R /XYZ 76.7123 362.2177 null] +>> endobj +1887 0 obj << +/D [1861 0 R /XYZ 129.5143 344.2849 null] +>> endobj +1888 0 obj << +/D [1861 0 R /XYZ 129.5143 344.2849 null] +>> endobj +1889 0 obj << +/D [1861 0 R /XYZ 71.731 342.1281 null] +>> endobj +1890 0 obj << +/D [1861 0 R /XYZ 71.731 342.1281 null] +>> endobj +1891 0 obj << +/D [1861 0 R /XYZ 139.477 326.3522 null] +>> endobj +1892 0 obj << +/D [1861 0 R /XYZ 71.731 324.9126 null] +>> endobj +1893 0 obj << +/D [1861 0 R /XYZ 139.477 308.4194 null] +>> endobj +1894 0 obj << +/D [1861 0 R /XYZ 76.7123 290.4867 null] +>> endobj +1895 0 obj << +/D [1861 0 R /XYZ 129.5143 272.5539 null] +>> endobj +1896 0 obj << +/D [1861 0 R /XYZ 129.5143 272.5539 null] +>> endobj +1897 0 obj << +/D [1861 0 R /XYZ 71.731 270.3971 null] +>> endobj +1898 0 obj << +/D [1861 0 R /XYZ 71.731 270.3971 null] +>> endobj +1899 0 obj << +/D [1861 0 R /XYZ 139.477 254.6212 null] +>> endobj +1900 0 obj << +/D [1861 0 R /XYZ 71.731 253.1816 null] +>> endobj +1901 0 obj << +/D [1861 0 R /XYZ 139.477 236.6884 null] +>> endobj +1902 0 obj << +/D [1861 0 R /XYZ 71.731 198.8304 null] +>> endobj +1903 0 obj << +/D [1861 0 R /XYZ 71.731 185.7794 null] +>> endobj +1904 0 obj << +/D [1861 0 R /XYZ 71.731 184.5341 null] +>> endobj +1905 0 obj << +/D [1861 0 R /XYZ 129.5143 165.4555 null] +>> endobj +650 0 obj << +/D [1861 0 R /XYZ 71.731 159.0347 null] +>> endobj +1860 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1908 0 obj << +/Length 916 +/Filter /FlateDecode +>> +stream +xÚµWKo£0¾÷Wp$Rñú±é-ûªºÚ•¢*·íªbÁiˆ€¨Ú¿clÀò¸T9Øàof>ŒÇâaøO$ 4F4âÔK÷wØ{ƒ¥Ç;b!Å.èóúîÓw†½Å¼õÆcq„¸=Á(’œHoýö¿l“C£ªE@9ö)2ãj—ªù™ü5ËՓ™üRͶÌêşõ»oë>>gÅ‚\$Ù£¦4)ñˆ@”ðPóìvŒ#Dˆˆ[šіœþ2[ìgÏåNi"`;› ’ /Л‘h­WUٔͿƒzè-$XDm8kP‚""M¸efü·»~Á'Çf{o+XxÍ3ûT${2C%è<»T¾ª:­òC“—Å%2 >UD{2µ –ؘjA¹ÿ>ÐAÚ¨ELD­Ù³jŽUa-‰òëcšªºÞwv­irÜ5_6[U½çµq}ËƖ»]ÙÒR™q¡¬o<Éöyqk¨Õ‚p?©@yÈ\ÂMGBbÄ9^ÈaÌfÓ±G.̤cìAª +L4ƒ©7Má…R>‰ )ÊBBg㞎ÎjʃIG5‡†“y輜‘†ëò`?ySÓæþäDk{U4yšèŒt‘ÇJM7ØQ`1’$âóÂv¨À… Â}¸Gê`g……iÏÆ=/lg5å1VC!Æ4– ‹©v3êr8e!ÒS}óâ­ÓwFÖ½q×ΛҌÇZÏ^ÌPÌɵäP—r×¢®§î4è-™{BâLâ:$l+àq,ÇÚæE—¸CUÎ3-ð Æn¯s2ÁA×*€ » b»*ã\Ütœð˜rÄC_@7W€!C»ë‚ÂW§%Ö^çk+´ ’^Sց]R¶ƒ]Wv&î-ÊÎðÄ”uy Ywöö´ÂÚ—@×gÉ þqŒ(ã¢k`Ø´Y/$ܵ«Ã>d1ÜjuY|tSccÂÍÙU¦ù絬^urÙ·‡ÖÀ¾Wû$ß}pÛóX%E׎@5µÒTj}6×Ôk÷½#ˆC}7Ú=iÇ,òÓ¤0“²Øý3³7×L+=QéÖ̒"3(ݺkf¼¥`ݵìb}b }tïÿye¦uÞ¨™ùR7C§Zð +RÅÒµ8Áenhrît‹èVÛÀ‡RߧñÅ,fú‡…S E,Ž{OíAbgÿ~Ìüˆšxendstream +endobj +1907 0 obj << +/Type /Page +/Contents 1908 0 R +/Resources 1906 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1909 0 obj << +/D [1907 0 R /XYZ 71.731 729.2652 null] +>> endobj +118 0 obj << +/D [1907 0 R /XYZ 185.4033 706.1179 null] +>> endobj +1910 0 obj << +/D [1907 0 R /XYZ 71.731 685.9775 null] +>> endobj +1911 0 obj << +/D [1907 0 R /XYZ 161.0655 673.2412 null] +>> endobj +1912 0 obj << +/D [1907 0 R /XYZ 71.731 661.1217 null] +>> endobj +1913 0 obj << +/D [1907 0 R /XYZ 71.731 577.1118 null] +>> endobj +1914 0 obj << +/D [1907 0 R /XYZ 71.731 544.3242 null] +>> endobj +1915 0 obj << +/D [1907 0 R /XYZ 181.5683 532.6683 null] +>> endobj +1916 0 obj << +/D [1907 0 R /XYZ 71.731 522.6062 null] +>> endobj +1917 0 obj << +/D [1907 0 R /XYZ 71.731 491.0346 null] +>> endobj +1918 0 obj << +/D [1907 0 R /XYZ 71.731 478.0732 null] +>> endobj +1919 0 obj << +/D [1907 0 R /XYZ 71.731 476.8278 null] +>> endobj +1920 0 obj << +/D [1907 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1921 0 obj << +/D [1907 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1922 0 obj << +/D [1907 0 R /XYZ 71.731 456.3097 null] +>> endobj +1923 0 obj << +/D [1907 0 R /XYZ 71.731 456.3097 null] +>> endobj +1924 0 obj << +/D [1907 0 R /XYZ 139.477 439.8165 null] +>> endobj +1925 0 obj << +/D [1907 0 R /XYZ 139.477 439.8165 null] +>> endobj +1926 0 obj << +/D [1907 0 R /XYZ 76.7123 421.8838 null] +>> endobj +1927 0 obj << +/D [1907 0 R /XYZ 129.5143 403.951 null] +>> endobj +1928 0 obj << +/D [1907 0 R /XYZ 129.5143 403.951 null] +>> endobj +1929 0 obj << +/D [1907 0 R /XYZ 71.731 402.5115 null] +>> endobj +1930 0 obj << +/D [1907 0 R /XYZ 129.5143 386.0183 null] +>> endobj +1931 0 obj << +/D [1907 0 R /XYZ 129.5143 386.0183 null] +>> endobj +1932 0 obj << +/D [1907 0 R /XYZ 71.731 363.9362 null] +>> endobj +1933 0 obj << +/D [1907 0 R /XYZ 71.731 353.042 null] +>> endobj +1934 0 obj << +/D [1907 0 R /XYZ 71.731 351.7967 null] +>> endobj +1935 0 obj << +/D [1907 0 R /XYZ 129.5143 332.7182 null] +>> endobj +651 0 obj << +/D [1907 0 R /XYZ 71.731 326.2973 null] +>> endobj +122 0 obj << +/D [1907 0 R /XYZ 262.6488 282.4825 null] +>> endobj +1936 0 obj << +/D [1907 0 R /XYZ 71.731 262.3422 null] +>> endobj +1937 0 obj << +/D [1907 0 R /XYZ 161.0655 249.6058 null] +>> endobj +1938 0 obj << +/D [1907 0 R /XYZ 71.731 237.4863 null] +>> endobj +1939 0 obj << +/D [1907 0 R /XYZ 71.731 206.1205 null] +>> endobj +1940 0 obj << +/D [1907 0 R /XYZ 168.8063 195.1102 null] +>> endobj +1941 0 obj << +/D [1907 0 R /XYZ 71.731 168.0468 null] +>> endobj +1942 0 obj << +/D [1907 0 R /XYZ 71.731 136.6809 null] +>> endobj +1943 0 obj << +/D [1907 0 R /XYZ 71.731 120.0433 null] +>> endobj +1906 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1946 0 obj << +/Length 1053 +/Filter /FlateDecode +>> +stream +xÚ­X]›8}Ÿ_Ác"M¼þĸ+UJÛíª«])êfŸ:«ˆÏ ˆªù÷{Á†˜Ä|¬Tå®}Ï=>Ç\‡>$Iª  Ž§¼À£ßˆ ÙؘôaÿðËg†…THÃ`ÿ0"!y E‘ Q°O¾­>¾ÆçZ—ë xE‘¹î²8×õŸñwóu»ûbnþÒõk‘Të÷<ü¶ïó &‘Š É$È>ê&ULB‚È@â1Îd‹s›eŚŠÕ,_‹LWï(íøƇ¼ogÚP‚B©vtœœÒüÑ <§ý kÒM7ªáF†&çnMÄ*.㓆L.·ìhÈ┇޲û¨֕ ”HLe÷a „'JÅ]^JB½yo¯Wݨ{,rè#°8‚p6Ä_êWm”#ÜdhBÞz«º¼ëÇå4ãu^§Ç¸N‹Ü¼”ú¾Àˆ+¢üÄvQ7ìJ,i,1(¨ %S®¼yljíFÝãËâRalã*»"D!ÃÞò›æ/¿ZOfºö¾.ÌõRéQõ +©$ä3êuÃ&ÔۇͪחwzïpøÕ;ÀQÂ^qH“CQrp³‡êˆ!EC¦Ó¼67EéR?ªVŽ£X8£V7lB­}جZ}y¨Õ‡Ãم­Z0€‘ÇëîkYJ>aLá-2J gH†xÎÈnØ5]Ø<5ž¼K¨ñàðPãÂزegÔoX¢H‰Y¿9aS~ëÂæýæÉ»Äo·8Füæâ8Ãë²È­ãô)N3å”BŒÞînÿ×s<²N Ë ›V6+,_ÞÂòá¸ÖÆÕsÿT]Ÿ¶Ès\6Y՜çÜ°)jº°yjéêX¦ç¦›BËàøÒ­Å›K®ÛÓÍP²ƒ.¾aiŸÓ©ýù¬fGHºÔ_˜ýµÔ}g˜üj§(Núæi^tÛq[]œ¡ÖFŠ!HDÄ,úõ[ÿyöÖ§àÐ7UAÿšÚ]͜ïòk™UŸ@'Ìd躵>άõUïÍ-nvDçV ύZãKVÛ$d)¤•FKñ³O«îaû> endobj +1947 0 obj << +/D [1945 0 R /XYZ 71.731 729.2652 null] +>> endobj +1948 0 obj << +/D [1945 0 R /XYZ 71.731 718.3063 null] +>> endobj +1949 0 obj << +/D [1945 0 R /XYZ 181.5683 708.3437 null] +>> endobj +1950 0 obj << +/D [1945 0 R /XYZ 71.731 698.2815 null] +>> endobj +1951 0 obj << +/D [1945 0 R /XYZ 71.731 664.8583 null] +>> endobj +1952 0 obj << +/D [1945 0 R /XYZ 71.731 653.7485 null] +>> endobj +1953 0 obj << +/D [1945 0 R /XYZ 71.731 652.5032 null] +>> endobj +1954 0 obj << +/D [1945 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1955 0 obj << +/D [1945 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1956 0 obj << +/D [1945 0 R /XYZ 71.731 631.9851 null] +>> endobj +1957 0 obj << +/D [1945 0 R /XYZ 71.731 631.9851 null] +>> endobj +1958 0 obj << +/D [1945 0 R /XYZ 139.477 615.4919 null] +>> endobj +1959 0 obj << +/D [1945 0 R /XYZ 139.477 615.4919 null] +>> endobj +1960 0 obj << +/D [1945 0 R /XYZ 76.7123 597.5591 null] +>> endobj +1961 0 obj << +/D [1945 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1962 0 obj << +/D [1945 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1963 0 obj << +/D [1945 0 R /XYZ 71.731 577.4696 null] +>> endobj +1964 0 obj << +/D [1945 0 R /XYZ 71.731 577.4696 null] +>> endobj +1965 0 obj << +/D [1945 0 R /XYZ 139.477 561.6936 null] +>> endobj +1966 0 obj << +/D [1945 0 R /XYZ 71.731 560.2541 null] +>> endobj +1967 0 obj << +/D [1945 0 R /XYZ 139.477 543.7609 null] +>> endobj +1968 0 obj << +/D [1945 0 R /XYZ 76.7123 525.8281 null] +>> endobj +1969 0 obj << +/D [1945 0 R /XYZ 129.5143 507.8954 null] +>> endobj +1970 0 obj << +/D [1945 0 R /XYZ 129.5143 507.8954 null] +>> endobj +1971 0 obj << +/D [1945 0 R /XYZ 71.731 505.7386 null] +>> endobj +1972 0 obj << +/D [1945 0 R /XYZ 71.731 505.7386 null] +>> endobj +1973 0 obj << +/D [1945 0 R /XYZ 139.477 489.9626 null] +>> endobj +1974 0 obj << +/D [1945 0 R /XYZ 71.731 488.5231 null] +>> endobj +1975 0 obj << +/D [1945 0 R /XYZ 139.477 472.0299 null] +>> endobj +1976 0 obj << +/D [1945 0 R /XYZ 71.731 434.1718 null] +>> endobj +1977 0 obj << +/D [1945 0 R /XYZ 71.731 421.1209 null] +>> endobj +1978 0 obj << +/D [1945 0 R /XYZ 71.731 419.8755 null] +>> endobj +1979 0 obj << +/D [1945 0 R /XYZ 129.5143 400.797 null] +>> endobj +652 0 obj << +/D [1945 0 R /XYZ 71.731 394.3761 null] +>> endobj +126 0 obj << +/D [1945 0 R /XYZ 248.3767 350.5614 null] +>> endobj +1980 0 obj << +/D [1945 0 R /XYZ 71.731 330.421 null] +>> endobj +1981 0 obj << +/D [1945 0 R /XYZ 161.0655 317.6847 null] +>> endobj +1982 0 obj << +/D [1945 0 R /XYZ 71.731 305.5652 null] +>> endobj +1983 0 obj << +/D [1945 0 R /XYZ 71.731 274.1993 null] +>> endobj +1984 0 obj << +/D [1945 0 R /XYZ 168.8063 263.189 null] +>> endobj +1985 0 obj << +/D [1945 0 R /XYZ 71.731 236.1256 null] +>> endobj +1986 0 obj << +/D [1945 0 R /XYZ 71.731 204.7597 null] +>> endobj +1987 0 obj << +/D [1945 0 R /XYZ 71.731 188.1221 null] +>> endobj +1988 0 obj << +/D [1945 0 R /XYZ 71.731 156.8768 null] +>> endobj +1989 0 obj << +/D [1945 0 R /XYZ 181.5683 145.5303 null] +>> endobj +1990 0 obj << +/D [1945 0 R /XYZ 71.731 135.4681 null] +>> endobj +1944 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1993 0 obj << +/Length 1255 +/Filter /FlateDecode +>> +stream +xÚ­˜]o¤6†ïó+¸L¤Ž‹ þÊE¥tû¡VmíÎ]SE,x$#`ºÍ¿¯mƀÁ´Zå'yÍyýøcF±ü…€&ò8@£(»‰£ù¯Ÿo ‘ŒæàŠ¾?Þ|ûSGp‚Ht<þ¢¿‹þµ)º»¿Ž¿Þüxãã„ÎdM“£jiqÇ&„` iDc’4¡ƒÏÇ;ˆo³6{Òmw?·0v"LFAqâµ0ª®ÌZ¡1œXeÊÂBx!é"oÜùóêÃöZúHXÄ$ +’>$( Ódê#»ô¯ÊnjJA¬"(ɽž¯®o/yÿÍlUQ÷ežõeS»ÊK+–´ˆ Å(öƒµªƒ+»‚…*='²²U°2Ic”roÜu°¶×ÒÇlÂAJéÔƃä¢3ÜC@RYWÍKY?Î4ŠÅ€A*gfʺ¬{ÝhZþz¾B ãI(_ÙV¾ZY8_=q÷ä«Ç‡ƒÄæ«kC1©÷I’5” +•‚OqŒäš¾†s&¡RvehFY/î4>K4“¼Òéª27Ís+¥VK™éJÑQm”¢UKÑtG)ÎMøKÑ5‘E+ºîùTŠJÏgT),fÈ÷9YO«4)f¡Šse[ieeá´òÄݓVsÞ/ÄÄF^öïþ//Å)Üø6|0ýܐܗ!,GG¶ÅÍÊÂÜü(]Šüš0á:L,Vž†FW¶ÓÊÂ0=q÷ÀœûðÃtmt}֋ÿóÓÐs²!>·:$ÿ]Öùú1.M`†–KW¶ÅÔÊÂL=q÷0ûð3umœIµÊ›Bøqˆ1¶öqè®Ûö%сÊ~0U·òƒs={…<1×— Á€ Æ›HW¶±‹eÁm¤/îŽ}¤Ï‡³Ñ¶“>ñq=„ü!î¾ýbî̳4‡ß§Çßéf,ÛМVNf.y.Õ§Ke¦LŽ…Jàx˜å¦€²døˆ”`½¨#¹ÛW×U”É…åÆ·Å°Ï÷l1äVÅ +3ŒsÔ6}Ó¿ŸÅýØãšV¦ïA@ ¦\»®Ç5u‰b>œk‡#—ÜKƒ[š8Øwº&~]ޖgu]°eC&·Ü»>ÌšéGíRWNŒ©¬6äóVȕbÖIåõÐzi›ËY7Ové_³þú>s%øP«µåÝЃ5ª³Èõ‘³°Guc ã-Ha¬6ý«h¿”ú.@椬 @0џ›BœÔäf—ª÷½Œ} %n]ÚшRÿ99ß¹¡Ñ?Ø;ñUÕ f,±M%º`*š’ËŠ7IxVûæ +8e€AÂ7o‰Íò’#bÈùø¦¡Öðꕯ'à¿Z=endstream +endobj +1992 0 obj << +/Type /Page +/Contents 1993 0 R +/Resources 1991 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1994 0 obj << +/D [1992 0 R /XYZ 71.731 729.2652 null] +>> endobj +1995 0 obj << +/D [1992 0 R /XYZ 71.731 718.3063 null] +>> endobj +1996 0 obj << +/D [1992 0 R /XYZ 71.731 708.2442 null] +>> endobj +1997 0 obj << +/D [1992 0 R /XYZ 71.731 706.9988 null] +>> endobj +1998 0 obj << +/D [1992 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1999 0 obj << +/D [1992 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2000 0 obj << +/D [1992 0 R /XYZ 71.731 686.4807 null] +>> endobj +2001 0 obj << +/D [1992 0 R /XYZ 71.731 686.4807 null] +>> endobj +2002 0 obj << +/D [1992 0 R /XYZ 139.477 669.9875 null] +>> endobj +2003 0 obj << +/D [1992 0 R /XYZ 139.477 669.9875 null] +>> endobj +2004 0 obj << +/D [1992 0 R /XYZ 76.7123 652.0548 null] +>> endobj +2005 0 obj << +/D [1992 0 R /XYZ 129.5143 634.122 null] +>> endobj +2006 0 obj << +/D [1992 0 R /XYZ 129.5143 634.122 null] +>> endobj +2007 0 obj << +/D [1992 0 R /XYZ 71.731 631.9652 null] +>> endobj +2008 0 obj << +/D [1992 0 R /XYZ 71.731 631.9652 null] +>> endobj +2009 0 obj << +/D [1992 0 R /XYZ 139.477 616.1893 null] +>> endobj +2010 0 obj << +/D [1992 0 R /XYZ 71.731 614.7497 null] +>> endobj +2011 0 obj << +/D [1992 0 R /XYZ 139.477 598.2565 null] +>> endobj +2012 0 obj << +/D [1992 0 R /XYZ 76.7123 580.3238 null] +>> endobj +2013 0 obj << +/D [1992 0 R /XYZ 129.5143 562.391 null] +>> endobj +2014 0 obj << +/D [1992 0 R /XYZ 129.5143 562.391 null] +>> endobj +2015 0 obj << +/D [1992 0 R /XYZ 71.731 561.212 null] +>> endobj +2016 0 obj << +/D [1992 0 R /XYZ 71.731 561.212 null] +>> endobj +2017 0 obj << +/D [1992 0 R /XYZ 139.477 544.4583 null] +>> endobj +2018 0 obj << +/D [1992 0 R /XYZ 139.477 544.4583 null] +>> endobj +2019 0 obj << +/D [1992 0 R /XYZ 71.731 542.3014 null] +>> endobj +2020 0 obj << +/D [1992 0 R /XYZ 139.477 526.5255 null] +>> endobj +2021 0 obj << +/D [1992 0 R /XYZ 139.477 526.5255 null] +>> endobj +2022 0 obj << +/D [1992 0 R /XYZ 71.731 524.3687 null] +>> endobj +2023 0 obj << +/D [1992 0 R /XYZ 139.477 508.5928 null] +>> endobj +2024 0 obj << +/D [1992 0 R /XYZ 139.477 508.5928 null] +>> endobj +2025 0 obj << +/D [1992 0 R /XYZ 71.731 506.4359 null] +>> endobj +2026 0 obj << +/D [1992 0 R /XYZ 139.477 490.66 null] +>> endobj +2027 0 obj << +/D [1992 0 R /XYZ 139.477 490.66 null] +>> endobj +2028 0 obj << +/D [1992 0 R /XYZ 71.731 488.5032 null] +>> endobj +2029 0 obj << +/D [1992 0 R /XYZ 139.477 472.7273 null] +>> endobj +2030 0 obj << +/D [1992 0 R /XYZ 139.477 472.7273 null] +>> endobj +2031 0 obj << +/D [1992 0 R /XYZ 71.731 470.5704 null] +>> endobj +2032 0 obj << +/D [1992 0 R /XYZ 139.477 454.7945 null] +>> endobj +2033 0 obj << +/D [1992 0 R /XYZ 139.477 454.7945 null] +>> endobj +2034 0 obj << +/D [1992 0 R /XYZ 71.731 452.6377 null] +>> endobj +2035 0 obj << +/D [1992 0 R /XYZ 139.477 436.8618 null] +>> endobj +2036 0 obj << +/D [1992 0 R /XYZ 139.477 436.8618 null] +>> endobj +2037 0 obj << +/D [1992 0 R /XYZ 71.731 399.0037 null] +>> endobj +2038 0 obj << +/D [1992 0 R /XYZ 71.731 385.9527 null] +>> endobj +2039 0 obj << +/D [1992 0 R /XYZ 71.731 384.7074 null] +>> endobj +2040 0 obj << +/D [1992 0 R /XYZ 129.5143 365.6289 null] +>> endobj +653 0 obj << +/D [1992 0 R /XYZ 71.731 358.8643 null] +>> endobj +130 0 obj << +/D [1992 0 R /XYZ 179.6704 315.3932 null] +>> endobj +2041 0 obj << +/D [1992 0 R /XYZ 71.731 295.2529 null] +>> endobj +2042 0 obj << +/D [1992 0 R /XYZ 161.0655 282.5165 null] +>> endobj +2043 0 obj << +/D [1992 0 R /XYZ 71.731 270.3971 null] +>> endobj +2044 0 obj << +/D [1992 0 R /XYZ 71.731 239.3674 null] +>> endobj +2045 0 obj << +/D [1992 0 R /XYZ 168.8063 228.0209 null] +>> endobj +2046 0 obj << +/D [1992 0 R /XYZ 71.731 200.9575 null] +>> endobj +2047 0 obj << +/D [1992 0 R /XYZ 71.731 174.7308 null] +>> endobj +2048 0 obj << +/D [1992 0 R /XYZ 71.731 141.6339 null] +>> endobj +2049 0 obj << +/D [1992 0 R /XYZ 181.5683 130.2874 null] +>> endobj +2050 0 obj << +/D [1992 0 R /XYZ 71.731 120.2252 null] +>> endobj +1991 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2053 0 obj << +/Length 1548 +/Filter /FlateDecode +>> +stream +xÚµY]oÛ6}ϯð£ ÄI‰"ՇÞºnÚ!hÓ§e0h‹‰ÈR¦´ý÷#%R¢$꣆ò?5¿îÞ7EyÉ¢b÷ÏýŸ7¿Ý·ñ‰GAÈdY’-jL‡M„B@¢ +ð|Ö<ïvˆlyίB²-Þ )´ƒ&£`è9)´¨½ 3ä_(D= +-LQxÀ˜Œâb,9"ìŒ;üìx˜QcÛ0)Eà×<¤Pù^Ÿ¯Ê‹â1Ð ûª +ò¦ÉWQæÕ¹¼dQiŸyg©¬r1^ ¡ÈPŒ·°µ·a°HÙ³· ›Všb?tƝ֌óè ë…À§´Oã uiîP— ðåæê§OF_‡¬×fºú¹ÌšÏªÓîõ| ͱdÞ5ç]Z¶î8èçHL×"QÄ¥8>Æ"i*È@à@ÚÜeàiO¢ zKž´`sž4°eO:â®ñ䐇ۓ6T¼‰½Ãpƍïª$Ñ–²7Of2§–$d“`iÛ°-[Ø¢–®¸+´ñpjÙ£Qå‰CJÄ@à9 +g'å—Oš‡ìQÐæã™?iaË /›§Hç<>‰ÂüCXI˜”žAàa¹€é-؜ô¶,½#îé‡<ÜÒÛ4DÊO‰pÕUéÀɧ,KOµþp­æI]W­ù܊²L…hIÐ5§§F-Ë9ºFÍ ·˜‡$KŸâ²Š\u@˜QVI­´–oÅ9¾r]º™zö^iZß>aKµ×†Í‰l`Ë*;⮑yÈí³M#‘|BgŸ‚C¼Zh3ÓktÆòԎÉb]¶`s:زΎ¸ktòpëlÓ¸òoÇ"‰Ï¢pŸ»0c¬¯tœšCíGþ-¾VWÝߪëÉ\eŒÈzâA™îKßÌ©Aª°ôlç\ð¹Ék + ñbõ¶`s 2°å9â®IА‡;A6${ŠÓã‰bm‚zýós«q ÝOôYéÜ©å®›|o~{‰…ÊÌײµž-ü>ñ ý¥ÂoÃæ6°e…q×(<äáVئÁO§\¼ÄÒfÑqâ¢Ãd +è\u9¨Ij××MÝy$UYÒüP½&“Ùc0l8|e•§3/”<æI +(X¸“Û°™Ky [¼•»â®¸–»xX—c‡®Âü¥]ڊxŒµ¢ÀŸ›G(Ÿ‘.¦ðTgÙe‹ÇÊÜ°äB(ÀˆÔÉß +(óê&°Gš¨ÈC€NÙö©}}VíáPÊìžvn«Òyô¢€a¨ǀÑ@¿̳2+¿?‹7íˆÎ{zìËê*/ÖÍ»žÈ­]©zEvkõ,)Ã1Ëk“ê?s{àQ…c^”˜<©ÌïiÔ%+J…¬¥/ro8ۋ|[ß-ŸÕÛ¥¹ezòhàf™ŸE9º‰>˓©j½f¯ð±ãj׸•W ×òÌôXßO³<Îv2k¥ÁèО>‰H¿zÿR´»¥œ¥¦¨ÁzÁHº™ú°cÁ®°;oƒ_/ñùÒÉ#!:87ª]…:zæ˂÷ó|Ç&{-C¾CÛî(ç.)TÑ*nû“½ve‡è§ÃÅ­ZO­Ù­Í3±qÙ¶FF<ØÍiàÕ´W¤ëòÔ¯F?Z³µ\õá¤JLÉÈdÄük\4›lM…:$IVs3ûô“ÜãÞª¿®ò;6œýFËŒ¿Ð"XöÙÖۙê¶L~=åø'°bendstream +endobj +2052 0 obj << +/Type /Page +/Contents 2053 0 R +/Resources 2051 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2054 0 obj << +/D [2052 0 R /XYZ 71.731 729.2652 null] +>> endobj +2055 0 obj << +/D [2052 0 R /XYZ 71.731 741.2204 null] +>> endobj +2056 0 obj << +/D [2052 0 R /XYZ 71.731 718.3063 null] +>> endobj +2057 0 obj << +/D [2052 0 R /XYZ 71.731 708.2442 null] +>> endobj +2058 0 obj << +/D [2052 0 R /XYZ 71.731 706.9988 null] +>> endobj +2059 0 obj << +/D [2052 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2060 0 obj << +/D [2052 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2061 0 obj << +/D [2052 0 R /XYZ 71.731 686.4807 null] +>> endobj +2062 0 obj << +/D [2052 0 R /XYZ 71.731 686.4807 null] +>> endobj +2063 0 obj << +/D [2052 0 R /XYZ 139.477 669.9875 null] +>> endobj +2064 0 obj << +/D [2052 0 R /XYZ 139.477 669.9875 null] +>> endobj +2065 0 obj << +/D [2052 0 R /XYZ 76.7123 652.0548 null] +>> endobj +2066 0 obj << +/D [2052 0 R /XYZ 129.5143 634.122 null] +>> endobj +2067 0 obj << +/D [2052 0 R /XYZ 129.5143 634.122 null] +>> endobj +2068 0 obj << +/D [2052 0 R /XYZ 71.731 632.943 null] +>> endobj +2069 0 obj << +/D [2052 0 R /XYZ 71.731 632.943 null] +>> endobj +2070 0 obj << +/D [2052 0 R /XYZ 139.477 616.1893 null] +>> endobj +2071 0 obj << +/D [2052 0 R /XYZ 139.477 616.1893 null] +>> endobj +2072 0 obj << +/D [2052 0 R /XYZ 71.731 614.0324 null] +>> endobj +2073 0 obj << +/D [2052 0 R /XYZ 139.477 598.2565 null] +>> endobj +2074 0 obj << +/D [2052 0 R /XYZ 139.477 598.2565 null] +>> endobj +2075 0 obj << +/D [2052 0 R /XYZ 71.731 596.0997 null] +>> endobj +2076 0 obj << +/D [2052 0 R /XYZ 139.477 580.3238 null] +>> endobj +2077 0 obj << +/D [2052 0 R /XYZ 139.477 580.3238 null] +>> endobj +2078 0 obj << +/D [2052 0 R /XYZ 71.731 578.8842 null] +>> endobj +2079 0 obj << +/D [2052 0 R /XYZ 139.477 562.391 null] +>> endobj +2080 0 obj << +/D [2052 0 R /XYZ 139.477 562.391 null] +>> endobj +2081 0 obj << +/D [2052 0 R /XYZ 71.731 560.2342 null] +>> endobj +2082 0 obj << +/D [2052 0 R /XYZ 139.477 544.4583 null] +>> endobj +2083 0 obj << +/D [2052 0 R /XYZ 139.477 544.4583 null] +>> endobj +2084 0 obj << +/D [2052 0 R /XYZ 71.731 543.0187 null] +>> endobj +2085 0 obj << +/D [2052 0 R /XYZ 139.477 526.5255 null] +>> endobj +2086 0 obj << +/D [2052 0 R /XYZ 139.477 526.5255 null] +>> endobj +2087 0 obj << +/D [2052 0 R /XYZ 71.731 525.086 null] +>> endobj +2088 0 obj << +/D [2052 0 R /XYZ 139.477 508.5928 null] +>> endobj +2089 0 obj << +/D [2052 0 R /XYZ 139.477 508.5928 null] +>> endobj +2090 0 obj << +/D [2052 0 R /XYZ 71.731 506.4359 null] +>> endobj +2091 0 obj << +/D [2052 0 R /XYZ 139.477 490.66 null] +>> endobj +2092 0 obj << +/D [2052 0 R /XYZ 139.477 490.66 null] +>> endobj +2093 0 obj << +/D [2052 0 R /XYZ 71.731 489.2205 null] +>> endobj +2094 0 obj << +/D [2052 0 R /XYZ 139.477 472.7273 null] +>> endobj +2095 0 obj << +/D [2052 0 R /XYZ 139.477 472.7273 null] +>> endobj +2096 0 obj << +/D [2052 0 R /XYZ 71.731 470.5704 null] +>> endobj +2097 0 obj << +/D [2052 0 R /XYZ 139.477 454.7945 null] +>> endobj +2098 0 obj << +/D [2052 0 R /XYZ 139.477 454.7945 null] +>> endobj +2099 0 obj << +/D [2052 0 R /XYZ 71.731 416.9365 null] +>> endobj +2100 0 obj << +/D [2052 0 R /XYZ 71.731 403.8855 null] +>> endobj +2101 0 obj << +/D [2052 0 R /XYZ 71.731 402.6402 null] +>> endobj +2102 0 obj << +/D [2052 0 R /XYZ 129.5143 383.5616 null] +>> endobj +654 0 obj << +/D [2052 0 R /XYZ 71.731 376.7971 null] +>> endobj +134 0 obj << +/D [2052 0 R /XYZ 259.6697 333.326 null] +>> endobj +2103 0 obj << +/D [2052 0 R /XYZ 71.731 313.1856 null] +>> endobj +2104 0 obj << +/D [2052 0 R /XYZ 161.0655 300.4493 null] +>> endobj +2105 0 obj << +/D [2052 0 R /XYZ 71.731 288.3298 null] +>> endobj +2106 0 obj << +/D [2052 0 R /XYZ 71.731 256.9639 null] +>> endobj +2107 0 obj << +/D [2052 0 R /XYZ 168.8063 245.9537 null] +>> endobj +2108 0 obj << +/D [2052 0 R /XYZ 71.731 218.8902 null] +>> endobj +2109 0 obj << +/D [2052 0 R /XYZ 71.731 187.5243 null] +>> endobj +2110 0 obj << +/D [2052 0 R /XYZ 71.731 147.5742 null] +>> endobj +2111 0 obj << +/D [2052 0 R /XYZ 71.731 116.3288 null] +>> endobj +2112 0 obj << +/D [2052 0 R /XYZ 181.5683 104.9823 null] +>> endobj +2051 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2116 0 obj << +/Length 1187 +/Filter /FlateDecode +>> +stream +xÚ­XˎÛ6ÝÏWhic–ñ¡Yp)Z´Å õ® KŽh¤©%'˜¿/)R2e]‹ +daNtÈ{îá=—I„õ?I‚$Ó?4ATpí_îpôI?úíŽ8ÈÆa6>è§ÝÝ*¢Ý!b‰@\Ƒd)NT´Ëþ]ý|L_Ûü´ÞPŽWÙßÇ2­òöÏô£ýsûø»ü•·Ç:kÖvÜýºâs&Q¢tY’jJ“&‘Ò4Elhý”“˜E+Äb&;žiöRT÷–ÆkáçF3×dº.‰nÜpc•Â.ð¸&|•žÒ—\§Û<\ç@ˆŽÊ‰ŒçÇL€9 ¨ësÐùILº&« +O”òI\Ju’„‚q¯/<úYSLAZŽx¤çöÈFc„My°7íé¼oï¯ÊÀÌÏ«¶Ø§mQW>ò|ʧ öôþ‚,lÚø°‹°ÄÔ÷(¡vSX½ù˜Æ ÷¶°ý¬)±°,A±”c[­‹µ .HÄÚ}×úÕ§^_@Ö»\7në¡êoW/&ˆÆœ…ª×ƒÍUo W/wIõ^ó¸Q½>¦,öùs‘=קçJÛÐZ)ąTc­‹ªµƒú䋳^¹bˆ*õêÃfêu€ëŠ» ^!EúzÑЊ¸ÒûÇhêdÊL >aLmo…µ1™„¼ìÃæ´éaam€¸K´xÚø4FÎôäI[ýàãšj¶î¿Ú·W7êË´&ïӝ·¦›±æ ZŠ»Àš°5G<¬8Z˜g£É¼G úu@Ðo4)!ˆ+4©›+Ä.D î’Bx…èÓM:[…‹'LŸG*ä`6#Ü +Å] Äc*܈Æ÷wpÌ%’Š…ìÃf<À‚†â.pð„ìàÏiy†ÜªÁL%jæíe^áÏkªß¾ÝÚ°¸zÇ<$®›·‡…Åâ.÷šÇ q}UõMñX7í­Æˆc$±dßÖcJPBdÐßlÎß=,ìo î<û4.ño­ë×´>ÌôÉÃCÊ\PsÂ8TX—iÐ%²LIªxF–|w.Ë7;üV÷1á Ž¨W¥Ü”)œÄÝZïsý=WÍ|*3ÍSrJ–õa3–`AËBqXâá©Ùo鈇Wd¹ia_œùºoQŸÓƶϞ0Ç?Ú!Öcâ*óàfž÷û¼içÒY_ç%%¼ë›¾› ŒÛ« Š¨473R­¶ÙšàUÖ5Û­~·xeŽ±iC‰%RË«ëSÝÖæÜ{f\ÚW¢í&ˆJìÇmFU6ꐹ¹¸ŽûFØU`™5. /n~ɛý©x5ßÄs\õë$tàÚ8îX÷7ïrÚ×o;Òî:l[™»£·>I›‚›ùšïG¾*ª`òpʇÏùÌ)V·Çüô¥hܓ,?˜ÝNÏeëM2†ÅÆ_HpaOm³$˜¾…]ÞÇP úµ•ìØ_“²AK·z[–uG­Wó}]æÓä®;c…ôKr2{#êa¦¢\ÛJp†•:³É›×›@Àÿ5éªendstream +endobj +2115 0 obj << +/Type /Page +/Contents 2116 0 R +/Resources 2114 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2117 0 obj << +/D [2115 0 R /XYZ 71.731 729.2652 null] +>> endobj +2118 0 obj << +/D [2115 0 R /XYZ 71.731 741.2204 null] +>> endobj +2119 0 obj << +/D [2115 0 R /XYZ 71.731 718.3063 null] +>> endobj +2120 0 obj << +/D [2115 0 R /XYZ 71.731 675.3674 null] +>> endobj +2121 0 obj << +/D [2115 0 R /XYZ 71.731 674.1221 null] +>> endobj +2122 0 obj << +/D [2115 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2123 0 obj << +/D [2115 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2124 0 obj << +/D [2115 0 R /XYZ 71.731 653.604 null] +>> endobj +2125 0 obj << +/D [2115 0 R /XYZ 71.731 653.604 null] +>> endobj +2126 0 obj << +/D [2115 0 R /XYZ 139.477 637.1108 null] +>> endobj +2127 0 obj << +/D [2115 0 R /XYZ 139.477 637.1108 null] +>> endobj +2128 0 obj << +/D [2115 0 R /XYZ 76.7123 619.1781 null] +>> endobj +2129 0 obj << +/D [2115 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2130 0 obj << +/D [2115 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2131 0 obj << +/D [2115 0 R /XYZ 71.731 599.0885 null] +>> endobj +2132 0 obj << +/D [2115 0 R /XYZ 71.731 599.0885 null] +>> endobj +2133 0 obj << +/D [2115 0 R /XYZ 139.477 583.3126 null] +>> endobj +2134 0 obj << +/D [2115 0 R /XYZ 71.731 581.873 null] +>> endobj +2135 0 obj << +/D [2115 0 R /XYZ 139.477 565.3798 null] +>> endobj +2136 0 obj << +/D [2115 0 R /XYZ 76.7123 547.4471 null] +>> endobj +2137 0 obj << +/D [2115 0 R /XYZ 129.5143 529.5143 null] +>> endobj +2138 0 obj << +/D [2115 0 R /XYZ 129.5143 529.5143 null] +>> endobj +2139 0 obj << +/D [2115 0 R /XYZ 71.731 527.3575 null] +>> endobj +2140 0 obj << +/D [2115 0 R /XYZ 71.731 527.3575 null] +>> endobj +2141 0 obj << +/D [2115 0 R /XYZ 139.477 511.5816 null] +>> endobj +2142 0 obj << +/D [2115 0 R /XYZ 71.731 509.4247 null] +>> endobj +2143 0 obj << +/D [2115 0 R /XYZ 139.477 493.6488 null] +>> endobj +2144 0 obj << +/D [2115 0 R /XYZ 76.7123 475.716 null] +>> endobj +2145 0 obj << +/D [2115 0 R /XYZ 129.5143 457.7833 null] +>> endobj +2146 0 obj << +/D [2115 0 R /XYZ 129.5143 457.7833 null] +>> endobj +2147 0 obj << +/D [2115 0 R /XYZ 71.731 455.6265 null] +>> endobj +2148 0 obj << +/D [2115 0 R /XYZ 129.5143 439.8505 null] +>> endobj +2149 0 obj << +/D [2115 0 R /XYZ 129.5143 439.8505 null] +>> endobj +2150 0 obj << +/D [2115 0 R /XYZ 71.731 437.6937 null] +>> endobj +2151 0 obj << +/D [2115 0 R /XYZ 71.731 437.6937 null] +>> endobj +2152 0 obj << +/D [2115 0 R /XYZ 139.477 421.9178 null] +>> endobj +2153 0 obj << +/D [2115 0 R /XYZ 71.731 420.4782 null] +>> endobj +2154 0 obj << +/D [2115 0 R /XYZ 139.477 403.985 null] +>> endobj +2155 0 obj << +/D [2115 0 R /XYZ 71.731 366.127 null] +>> endobj +2156 0 obj << +/D [2115 0 R /XYZ 71.731 353.076 null] +>> endobj +2157 0 obj << +/D [2115 0 R /XYZ 71.731 351.8307 null] +>> endobj +2158 0 obj << +/D [2115 0 R /XYZ 129.5143 332.7522 null] +>> endobj +655 0 obj << +/D [2115 0 R /XYZ 71.731 325.9876 null] +>> endobj +138 0 obj << +/D [2115 0 R /XYZ 298.8174 282.5165 null] +>> endobj +2159 0 obj << +/D [2115 0 R /XYZ 71.731 259.0278 null] +>> endobj +2160 0 obj << +/D [2115 0 R /XYZ 161.0655 249.6398 null] +>> endobj +2161 0 obj << +/D [2115 0 R /XYZ 71.731 237.5204 null] +>> endobj +2162 0 obj << +/D [2115 0 R /XYZ 71.731 206.1545 null] +>> endobj +2163 0 obj << +/D [2115 0 R /XYZ 168.8063 195.1442 null] +>> endobj +2164 0 obj << +/D [2115 0 R /XYZ 71.731 168.0808 null] +>> endobj +2165 0 obj << +/D [2115 0 R /XYZ 71.731 141.8541 null] +>> endobj +2166 0 obj << +/D [2115 0 R /XYZ 71.731 108.421 null] +>> endobj +2167 0 obj << +/D [2115 0 R /XYZ 181.5683 97.4107 null] +>> endobj +2114 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2170 0 obj << +/Length 1044 +/Filter /FlateDecode +>> +stream +xÚÍXˎ£FÝ÷W°´¥¡RêA/"užš(µ&ÞeF-—ÛHZ€5ÊßçBñ( x,&JäØ>pÏ=÷Ô½ÄÃð!ž$H28ÐQÁ©ß°÷ +ýú@Zˆßb|ôÃéá»_öB +*¼ÓÅc¡@\žd)N”w:ÿuøñ½Uº8ú”ãEæøœF™®~¾˜¯OÏïÍÉ]]ósyü|úíáçSŸ3‰BAVIö¨9Mz +hŠ ¦Ià_NæI¬ ˜lxFç[’Ձô”ßžúuRRðó‘ðCTD7 ©•S¾„@N¤'8G8`ÂÉ·Gù6¬ã ¹HL¾³»Õ>QÊgq)…„uƝÝUsL¹tñˆîÕÕ! ®#ԐGSܲ*îqõnRòúzUIUIžÙÈ{¡ç v Ö„`å¶Cù6l–Ô^%ÔÁ……âc„θËÂvWÍyŒ…e! +¤Óx]Ìrp¨Ë¬´©¾IöÚéëõfnלW¹9ÞK½ì^L 8Ûr¯[soÛv¯#î÷Ny,¸×æU ڗ{¥_ª¿ßôË%Ñ©i?Á á("t9zѤ\1Ä&µa+&ía›&uÅÝaÒ§IG4 e¾yª_—KE}gIǚ%Y×>$Yr»ß̗O˜ãTGee¾¾åGÊ_uq¹§ð1¿Ö¡Zû^£G]ÓÐí/y;lâk”½öø¤lûMSñ#ëWËý… Ž˜ ·ú‹ [+]Û.#îžÒMy¸KgÓÈ`x-ôm†+åÏ4‰µKK#4,#sÖpëH’lékÁÖôí`Ûú:âîÑwÊí¯Mã¬Ë¸HޚîëX ¡ä7yÇóA< €3F +‡¼ ðQÃ4ÍV6*ˆ’€n´z¶Òê{Øf«wÅÝÑê]<¬fÝùbÄch<覹8Ä­ûXߎ¾7§xè?É¥-Ô=ŽuYBojK IˆÄ;ø\"©kJ@7­’"ªêݯT‡§ó‘@ᚠ+¿ÏÊ*‚9-,¥(–“íg‘WymÇþŠÁÝ~•‚ÅHhögW°>Ñz önX´M¾;7Â? î[ãÂàÁ@ОL׊ۘv9ÊÁöɜ-üPiÔøƒ`Ĥ°n`‹åj³¼ÔúG÷´jñ9않¯Iin½'ï§4m'Tk˜0šÊÍr¨ðß{Ö R"Q·îõ%lÃV–pÛ\®¸;–ðŒ‡{·6âñß> endobj +2171 0 obj << +/D [2169 0 R /XYZ 71.731 729.2652 null] +>> endobj +2172 0 obj << +/D [2169 0 R /XYZ 71.731 688.3288 null] +>> endobj +2173 0 obj << +/D [2169 0 R /XYZ 71.731 675.3674 null] +>> endobj +2174 0 obj << +/D [2169 0 R /XYZ 71.731 674.1221 null] +>> endobj +2175 0 obj << +/D [2169 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2176 0 obj << +/D [2169 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2177 0 obj << +/D [2169 0 R /XYZ 71.731 653.604 null] +>> endobj +2178 0 obj << +/D [2169 0 R /XYZ 71.731 653.604 null] +>> endobj +2179 0 obj << +/D [2169 0 R /XYZ 139.477 637.1108 null] +>> endobj +2180 0 obj << +/D [2169 0 R /XYZ 139.477 637.1108 null] +>> endobj +2181 0 obj << +/D [2169 0 R /XYZ 76.7123 619.1781 null] +>> endobj +2182 0 obj << +/D [2169 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2183 0 obj << +/D [2169 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2184 0 obj << +/D [2169 0 R /XYZ 71.731 599.8646 null] +>> endobj +2185 0 obj << +/D [2169 0 R /XYZ 71.731 599.8646 null] +>> endobj +2186 0 obj << +/D [2169 0 R /XYZ 139.477 583.3126 null] +>> endobj +2187 0 obj << +/D [2169 0 R /XYZ 139.477 583.3126 null] +>> endobj +2188 0 obj << +/D [2169 0 R /XYZ 71.731 581.1557 null] +>> endobj +2189 0 obj << +/D [2169 0 R /XYZ 139.477 565.3798 null] +>> endobj +2190 0 obj << +/D [2169 0 R /XYZ 139.477 565.3798 null] +>> endobj +2191 0 obj << +/D [2169 0 R /XYZ 71.731 563.223 null] +>> endobj +2192 0 obj << +/D [2169 0 R /XYZ 139.477 547.4471 null] +>> endobj +2193 0 obj << +/D [2169 0 R /XYZ 139.477 547.4471 null] +>> endobj +2194 0 obj << +/D [2169 0 R /XYZ 71.731 509.589 null] +>> endobj +2195 0 obj << +/D [2169 0 R /XYZ 71.731 496.5381 null] +>> endobj +2196 0 obj << +/D [2169 0 R /XYZ 71.731 495.2927 null] +>> endobj +2197 0 obj << +/D [2169 0 R /XYZ 129.5143 476.2142 null] +>> endobj +656 0 obj << +/D [2169 0 R /XYZ 71.731 469.4496 null] +>> endobj +142 0 obj << +/D [2169 0 R /XYZ 290.6398 425.9786 null] +>> endobj +2198 0 obj << +/D [2169 0 R /XYZ 71.731 405.8382 null] +>> endobj +2199 0 obj << +/D [2169 0 R /XYZ 161.0655 393.1018 null] +>> endobj +2200 0 obj << +/D [2169 0 R /XYZ 71.731 380.9824 null] +>> endobj +2201 0 obj << +/D [2169 0 R /XYZ 71.731 349.9527 null] +>> endobj +2202 0 obj << +/D [2169 0 R /XYZ 168.8063 338.6062 null] +>> endobj +2203 0 obj << +/D [2169 0 R /XYZ 71.731 311.5428 null] +>> endobj +2204 0 obj << +/D [2169 0 R /XYZ 71.731 296.9724 null] +>> endobj +2205 0 obj << +/D [2169 0 R /XYZ 71.731 264.1848 null] +>> endobj +2206 0 obj << +/D [2169 0 R /XYZ 181.5683 252.529 null] +>> endobj +2207 0 obj << +/D [2169 0 R /XYZ 71.731 242.4668 null] +>> endobj +2208 0 obj << +/D [2169 0 R /XYZ 71.731 210.8952 null] +>> endobj +2209 0 obj << +/D [2169 0 R /XYZ 71.731 197.9338 null] +>> endobj +2210 0 obj << +/D [2169 0 R /XYZ 71.731 196.6885 null] +>> endobj +2211 0 obj << +/D [2169 0 R /XYZ 129.5143 177.6099 null] +>> endobj +2212 0 obj << +/D [2169 0 R /XYZ 129.5143 177.6099 null] +>> endobj +2213 0 obj << +/D [2169 0 R /XYZ 71.731 176.1704 null] +>> endobj +2214 0 obj << +/D [2169 0 R /XYZ 71.731 176.1704 null] +>> endobj +2215 0 obj << +/D [2169 0 R /XYZ 139.477 159.6772 null] +>> endobj +2216 0 obj << +/D [2169 0 R /XYZ 139.477 159.6772 null] +>> endobj +2217 0 obj << +/D [2169 0 R /XYZ 76.7123 141.7444 null] +>> endobj +2218 0 obj << +/D [2169 0 R /XYZ 129.5143 123.8117 null] +>> endobj +2219 0 obj << +/D [2169 0 R /XYZ 129.5143 123.8117 null] +>> endobj +2168 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2222 0 obj << +/Length 1325 +/Filter /FlateDecode +>> +stream +xڍXÛn«8}ïWä‘H'Û\ })s՝#UÌ¼LG§µD â2mÿ~¶±M qå‚—½–×ÞÞ6 †Ù0‚˜š …t“ïðæš~¿#²Ó˜ úép÷Ão>Þ$(‰h´9œ6~¡æS‡$Þò¼Ÿ_Ó·–×Û ±G‘º>iÉÛoéQýÝ?|U7ßyûZåÍößÃw¿þÐg(‰dV䀺–IK&! +CÂ6 ÇÈ|Öë|ämW—Íý”{@G1 O±ïäP;f¸á ÃdÄ=À$÷¥á/¥ ŽP'ïôzÑaz9uX€C! ü±Q¶_T ˆºˆ“º6]–ñ¦9u…” c>†( 9Ø.dˆÅ¾7Q?ŒúÁ(èÎboŸo öò? ‘q=€-&`(¦¼“yÃ"‡ºj«öóß=bèõŒºïŽ‘¤Çïs=~/ø ‡8íÚW=F¶|= :iõ÷?ɟ0€R̼F´ü‹ÂœªÂԍÇO«7ÌN”/7>È,ˆhïCWæ¼n²ª6q;€µ<=ɲ`Ï^:’o¡©ÑÏËî|¼ü«t%Ló\Ȥ¹*‡Ï9Õ£—ÂôðuÚå"h¬´1‘oš*ikRKGî B T^™¤›Ëʈ#{e©[éa]ÓjÒBæß{Ÿ„ŸÍxj* ¤s& ôð(ªLUå¥y*»W*3d°ŠD(òYdù ëõú|ùe¶?ª[¬óÎYµÓ56,B´¶ÞìGY +C;x×ø<ÕáöٖqN?žË +üqU ¥"›}yùž~ˆsw¶Sãý_ «ýNõ#KËñ)Ž=â¥ä“’±6@$  `šó²a3`‹rñ®Еg€F2DÙ´)YUc¯ƒÄ( +hìÏ, ël<˜†Â‘󶿌!Þ7–üµ`sþز¿Þ5þNu¸ýµeÈw¦g œ$ël5c¸- äËø’…lÎB[¶ÐÁ»Æ©·…¶Œüò6îÚßà$Ål““¡6»^©’ ÿ†c¸™û(¤¿‡1‚—°dö“™…¹þbÒ–|ƒê?œ$7¿9ÿ¤Í¢rendstream +endobj +2221 0 obj << +/Type /Page +/Contents 2222 0 R +/Resources 2220 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2223 0 obj << +/D [2221 0 R /XYZ 71.731 729.2652 null] +>> endobj +658 0 obj << +/D [2221 0 R /XYZ 71.731 741.2204 null] +>> endobj +2224 0 obj << +/D [2221 0 R /XYZ 71.731 718.3063 null] +>> endobj +2225 0 obj << +/D [2221 0 R /XYZ 71.731 708.2442 null] +>> endobj +2226 0 obj << +/D [2221 0 R /XYZ 71.731 706.9988 null] +>> endobj +2227 0 obj << +/D [2221 0 R /XYZ 129.5143 687.9203 null] +>> endobj +657 0 obj << +/D [2221 0 R /XYZ 71.731 681.4994 null] +>> endobj +146 0 obj << +/D [2221 0 R /XYZ 188.2952 637.6847 null] +>> endobj +2228 0 obj << +/D [2221 0 R /XYZ 71.731 617.5443 null] +>> endobj +2229 0 obj << +/D [2221 0 R /XYZ 161.0655 604.8079 null] +>> endobj +2230 0 obj << +/D [2221 0 R /XYZ 71.731 592.6885 null] +>> endobj +2231 0 obj << +/D [2221 0 R /XYZ 71.731 561.6588 null] +>> endobj +2232 0 obj << +/D [2221 0 R /XYZ 168.8063 550.3123 null] +>> endobj +2233 0 obj << +/D [2221 0 R /XYZ 71.731 523.2489 null] +>> endobj +2234 0 obj << +/D [2221 0 R /XYZ 71.731 491.883 null] +>> endobj +2235 0 obj << +/D [2221 0 R /XYZ 71.731 448.6451 null] +>> endobj +2236 0 obj << +/D [2221 0 R /XYZ 71.731 420.6875 null] +>> endobj +2237 0 obj << +/D [2221 0 R /XYZ 71.731 389.1059 null] +>> endobj +2238 0 obj << +/D [2221 0 R /XYZ 181.5683 377.7594 null] +>> endobj +2239 0 obj << +/D [2221 0 R /XYZ 71.731 367.6972 null] +>> endobj +2240 0 obj << +/D [2221 0 R /XYZ 71.731 334.274 null] +>> endobj +2241 0 obj << +/D [2221 0 R /XYZ 71.731 323.1642 null] +>> endobj +2242 0 obj << +/D [2221 0 R /XYZ 71.731 321.9189 null] +>> endobj +2243 0 obj << +/D [2221 0 R /XYZ 129.5143 302.8403 null] +>> endobj +2244 0 obj << +/D [2221 0 R /XYZ 129.5143 302.8403 null] +>> endobj +2245 0 obj << +/D [2221 0 R /XYZ 71.731 301.4008 null] +>> endobj +2246 0 obj << +/D [2221 0 R /XYZ 71.731 301.4008 null] +>> endobj +2247 0 obj << +/D [2221 0 R /XYZ 139.477 284.9076 null] +>> endobj +2248 0 obj << +/D [2221 0 R /XYZ 139.477 284.9076 null] +>> endobj +2249 0 obj << +/D [2221 0 R /XYZ 76.7123 266.9748 null] +>> endobj +2250 0 obj << +/D [2221 0 R /XYZ 129.5143 249.0421 null] +>> endobj +2251 0 obj << +/D [2221 0 R /XYZ 129.5143 249.0421 null] +>> endobj +2252 0 obj << +/D [2221 0 R /XYZ 71.731 247.8631 null] +>> endobj +2253 0 obj << +/D [2221 0 R /XYZ 71.731 247.8631 null] +>> endobj +2254 0 obj << +/D [2221 0 R /XYZ 139.477 231.1093 null] +>> endobj +2255 0 obj << +/D [2221 0 R /XYZ 139.477 231.1093 null] +>> endobj +2256 0 obj << +/D [2221 0 R /XYZ 71.731 228.9525 null] +>> endobj +2257 0 obj << +/D [2221 0 R /XYZ 139.477 213.1766 null] +>> endobj +2258 0 obj << +/D [2221 0 R /XYZ 139.477 213.1766 null] +>> endobj +2259 0 obj << +/D [2221 0 R /XYZ 71.731 211.0198 null] +>> endobj +2260 0 obj << +/D [2221 0 R /XYZ 139.477 195.2438 null] +>> endobj +2261 0 obj << +/D [2221 0 R /XYZ 139.477 195.2438 null] +>> endobj +2262 0 obj << +/D [2221 0 R /XYZ 71.731 193.087 null] +>> endobj +2263 0 obj << +/D [2221 0 R /XYZ 139.477 177.3111 null] +>> endobj +2264 0 obj << +/D [2221 0 R /XYZ 139.477 177.3111 null] +>> endobj +2265 0 obj << +/D [2221 0 R /XYZ 71.731 175.1543 null] +>> endobj +2266 0 obj << +/D [2221 0 R /XYZ 139.477 159.3783 null] +>> endobj +2267 0 obj << +/D [2221 0 R /XYZ 139.477 159.3783 null] +>> endobj +2268 0 obj << +/D [2221 0 R /XYZ 71.731 121.5203 null] +>> endobj +2269 0 obj << +/D [2221 0 R /XYZ 71.731 108.4693 null] +>> endobj +2270 0 obj << +/D [2221 0 R /XYZ 71.731 107.224 null] +>> endobj +2220 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2273 0 obj << +/Length 1098 +/Filter /FlateDecode +>> +stream +xڝX]›8}Ÿ_Ác"¯?0¶ûP)ûÑUW»Õ¨ÍÛÎjDÁ™ ˜¢Qÿý^‚MLb>¶ÊC ûž{|®m † A‚ÁUˆÆœéé/ðè÷b ¡Á„.èçýÃOR1ƒý!`*F\D`INd°ÏþÞürL^[]oCÊñ†¢þÿ±HJÝþ™|ë/wŸúÆ_º=VY³ýgÿÇÃoû!>g) AfIFD¢ˆa„#E ÷¢Qˆs" ,‹˜’¡*€8“.™7Àºlž(å·ì¥ 4p´qoÿ¯§vö—®¿.Û¦‘òƝÖöºç1–) 1¦±]ú½×£.‡Ê‹`[¿Õ7/_¬¾YOýp£e \?í^˜DÆU¼ä^6ç^ [v¯'î÷Þò˜p¯Ëãvkòh-%ìBŽµ†Í~¼z÷âOûÇ(¢±Zò«›ó«…-ûÕw_=<œóõ«KãzüùêlHYçÁËfYOjCAáHEKµìÂf´`‹Úøâ®ÐÆÇã^›Qe:òXÇy«rŠb*—ªÏ…ÍTß[¬>_ÜÕwÇÃ_}#S'@O8Å8¾Yò’º¶§¬êðc•IY„bŗ*Ӆ͹Ï–Ý牻Æ}÷¹4œÐûÿ&ðDÌ ӁÍIcaËÒx⮑ÆÃÃ#KcT˜ÏEaÌôï9)Fg|kÏËÑ7„¢R”÷/b«È=OIÄg˜-´ ›)è¶Xо¸+ +ÚÇÃó<âqµÚ웭KÓ|Lj$‚75û©ÃÁÜéàT‰S©a¤ŽÓß-<ÿ‡ý´endstream +endobj +2272 0 obj << +/Type /Page +/Contents 2273 0 R +/Resources 2271 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2274 0 obj << +/D [2272 0 R /XYZ 71.731 729.2652 null] +>> endobj +2275 0 obj << +/D [2272 0 R /XYZ 71.731 741.2204 null] +>> endobj +2276 0 obj << +/D [2272 0 R /XYZ 129.5143 708.3437 null] +>> endobj +150 0 obj << +/D [2272 0 R /XYZ 260.5654 658.1081 null] +>> endobj +2277 0 obj << +/D [2272 0 R /XYZ 71.731 637.9677 null] +>> endobj +2278 0 obj << +/D [2272 0 R /XYZ 161.0655 625.2314 null] +>> endobj +2279 0 obj << +/D [2272 0 R /XYZ 71.731 613.1119 null] +>> endobj +2280 0 obj << +/D [2272 0 R /XYZ 71.731 582.0823 null] +>> endobj +2281 0 obj << +/D [2272 0 R /XYZ 168.8063 570.7357 null] +>> endobj +2282 0 obj << +/D [2272 0 R /XYZ 71.731 543.6723 null] +>> endobj +2283 0 obj << +/D [2272 0 R /XYZ 71.731 512.3064 null] +>> endobj +2284 0 obj << +/D [2272 0 R /XYZ 71.731 495.6688 null] +>> endobj +2285 0 obj << +/D [2272 0 R /XYZ 71.731 464.7328 null] +>> endobj +2286 0 obj << +/D [2272 0 R /XYZ 181.5683 453.0769 null] +>> endobj +2287 0 obj << +/D [2272 0 R /XYZ 71.731 443.0148 null] +>> endobj +2288 0 obj << +/D [2272 0 R /XYZ 71.731 409.5916 null] +>> endobj +2289 0 obj << +/D [2272 0 R /XYZ 71.731 398.4818 null] +>> endobj +2290 0 obj << +/D [2272 0 R /XYZ 71.731 397.2364 null] +>> endobj +2291 0 obj << +/D [2272 0 R /XYZ 129.5143 378.1579 null] +>> endobj +2292 0 obj << +/D [2272 0 R /XYZ 129.5143 378.1579 null] +>> endobj +2293 0 obj << +/D [2272 0 R /XYZ 71.731 376.7183 null] +>> endobj +2294 0 obj << +/D [2272 0 R /XYZ 71.731 376.7183 null] +>> endobj +2295 0 obj << +/D [2272 0 R /XYZ 139.477 360.2251 null] +>> endobj +2296 0 obj << +/D [2272 0 R /XYZ 139.477 360.2251 null] +>> endobj +2297 0 obj << +/D [2272 0 R /XYZ 76.7123 342.2924 null] +>> endobj +2298 0 obj << +/D [2272 0 R /XYZ 129.5143 324.3596 null] +>> endobj +2299 0 obj << +/D [2272 0 R /XYZ 129.5143 324.3596 null] +>> endobj +2300 0 obj << +/D [2272 0 R /XYZ 71.731 322.2028 null] +>> endobj +2301 0 obj << +/D [2272 0 R /XYZ 71.731 322.2028 null] +>> endobj +2302 0 obj << +/D [2272 0 R /XYZ 139.477 306.4269 null] +>> endobj +2303 0 obj << +/D [2272 0 R /XYZ 71.731 304.9873 null] +>> endobj +2304 0 obj << +/D [2272 0 R /XYZ 139.477 288.4941 null] +>> endobj +2305 0 obj << +/D [2272 0 R /XYZ 76.7123 270.5614 null] +>> endobj +2306 0 obj << +/D [2272 0 R /XYZ 129.5143 252.6286 null] +>> endobj +2307 0 obj << +/D [2272 0 R /XYZ 129.5143 252.6286 null] +>> endobj +2308 0 obj << +/D [2272 0 R /XYZ 71.731 250.4718 null] +>> endobj +2309 0 obj << +/D [2272 0 R /XYZ 71.731 250.4718 null] +>> endobj +2310 0 obj << +/D [2272 0 R /XYZ 139.477 234.6959 null] +>> endobj +2311 0 obj << +/D [2272 0 R /XYZ 71.731 233.2563 null] +>> endobj +2312 0 obj << +/D [2272 0 R /XYZ 139.477 216.7631 null] +>> endobj +2313 0 obj << +/D [2272 0 R /XYZ 71.731 178.9051 null] +>> endobj +2314 0 obj << +/D [2272 0 R /XYZ 71.731 165.8541 null] +>> endobj +2315 0 obj << +/D [2272 0 R /XYZ 71.731 164.6088 null] +>> endobj +2316 0 obj << +/D [2272 0 R /XYZ 129.5143 145.5303 null] +>> endobj +659 0 obj << +/D [2272 0 R /XYZ 71.731 139.1094 null] +>> endobj +2271 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2319 0 obj << +/Length 900 +/Filter /FlateDecode +>> +stream +xÚÅVÛnÛ8}ÏWèQ"–Qûævw‹ì¥û°- +E¢c!²dHôùûš¤L[Êå¥X0mi†çÌðÌ I„áC"A`°P‰hÎiTí®pô¯¾\g’:›44ú´¾úðÑD2§y´ÞDL戋,Œ¢‚“"Z×ÿğ·å^«!I)Ç1Ev½mËNé?Ë{ûwu{cü¥ô¶¯Çäûú÷«_×>gÉ@^%9YÍiR(á™áé#ƉLˆ#MŠ1äD¯†ãƒÞ~Þª*¡8~4t`„š TP,¢Ô„*r»ÇíÐë^?ïÕÇÉ£üê|SJPN +ytX9”Gý7Ìq `% ˜©ß"ÄüEÕÐìuÓwïE½Sú0t£Å$vi6vÕ[eFf½[»¾vï GÕé¦*µªí£ñPUj7‡¶}Nr_ÛǛ„óV;´‡§fTè½ñ­Ú¶O(Ÿ<Ò]ߪñÍPm¤e½k:Geß\‘eØSÔªÚ^¾“×mBx\åN¸-ŸP±„HÄ9QV† ”%ÅNVihf+#P³ÀÄ0˜ïf(|£”Ïp)9#t÷r=ñð^s¬RL ®8ÉØ9#‡…´Ñ aƒ`L>:•èáPé닢ä*-ƒšè)@c*ärb½UšKLýŸäÍ^L,>¦™\Ä}9±ÞkÎã<±L"ӉÎh˜î`âBvyŽò zíe~›îÁçw!­;»~?ՃÙº¦éÞÄÈ1*°äa³xYàLJ$Àøu}V¯ÈÛ[½©îÐwˆ{Ä)¡“BMçÕzÑ'OýΝÍـI¹@¢`ì˜JÊxîG u#æS[ÚÑÒ6£þôe¾žÚ¤1€ŒN`gCÇÅùh:¶}ÿ£©Â$b ²œ^°r㡜qfI݌å8öUzîÜqhçØ9Q—mL·mSÛ:hυï7C¿»ð.«ª?t-¿ûú¤ïßãus§À.7v™‰#Ž†MA œçìü½šü˺öã­|H`®4ò.p-á± +ú;! šÕÝכ¯_\ÉߜǤΓw9óO tëSŠ–â=™”íè’uïfÿ½?2UO ô"&ò7/§¢ù¿¯Ep?¸l2îv˜Ò._½6óÛ0§ @)§ "#/Þmÿ`Î[endstream +endobj +2318 0 obj << +/Type /Page +/Contents 2319 0 R +/Resources 2317 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2320 0 obj << +/D [2318 0 R /XYZ 71.731 729.2652 null] +>> endobj +154 0 obj << +/D [2318 0 R /XYZ 204.8052 705.7477 null] +>> endobj +2321 0 obj << +/D [2318 0 R /XYZ 71.731 685.6073 null] +>> endobj +2322 0 obj << +/D [2318 0 R /XYZ 161.0655 672.871 null] +>> endobj +2323 0 obj << +/D [2318 0 R /XYZ 71.731 660.7515 null] +>> endobj +2324 0 obj << +/D [2318 0 R /XYZ 71.731 574.89 null] +>> endobj +2325 0 obj << +/D [2318 0 R /XYZ 181.5683 563.8797 null] +>> endobj +2326 0 obj << +/D [2318 0 R /XYZ 71.731 553.8175 null] +>> endobj +2327 0 obj << +/D [2318 0 R /XYZ 71.731 520.3944 null] +>> endobj +2328 0 obj << +/D [2318 0 R /XYZ 71.731 509.2845 null] +>> endobj +2329 0 obj << +/D [2318 0 R /XYZ 71.731 508.0392 null] +>> endobj +2330 0 obj << +/D [2318 0 R /XYZ 129.5143 488.9607 null] +>> endobj +2331 0 obj << +/D [2318 0 R /XYZ 129.5143 488.9607 null] +>> endobj +2332 0 obj << +/D [2318 0 R /XYZ 71.731 487.5211 null] +>> endobj +2333 0 obj << +/D [2318 0 R /XYZ 71.731 487.5211 null] +>> endobj +2334 0 obj << +/D [2318 0 R /XYZ 139.477 471.0279 null] +>> endobj +2335 0 obj << +/D [2318 0 R /XYZ 139.477 471.0279 null] +>> endobj +2336 0 obj << +/D [2318 0 R /XYZ 71.731 433.1699 null] +>> endobj +2337 0 obj << +/D [2318 0 R /XYZ 71.731 420.1189 null] +>> endobj +2338 0 obj << +/D [2318 0 R /XYZ 71.731 418.8736 null] +>> endobj +2339 0 obj << +/D [2318 0 R /XYZ 129.5143 399.795 null] +>> endobj +660 0 obj << +/D [2318 0 R /XYZ 71.731 393.3742 null] +>> endobj +158 0 obj << +/D [2318 0 R /XYZ 216.3218 349.5594 null] +>> endobj +2340 0 obj << +/D [2318 0 R /XYZ 71.731 326.0706 null] +>> endobj +2341 0 obj << +/D [2318 0 R /XYZ 161.0655 316.6827 null] +>> endobj +2342 0 obj << +/D [2318 0 R /XYZ 71.731 304.5632 null] +>> endobj +2343 0 obj << +/D [2318 0 R /XYZ 71.731 273.1973 null] +>> endobj +2344 0 obj << +/D [2318 0 R /XYZ 168.8063 262.1871 null] +>> endobj +2345 0 obj << +/D [2318 0 R /XYZ 71.731 235.1236 null] +>> endobj +2346 0 obj << +/D [2318 0 R /XYZ 71.731 192.1015 null] +>> endobj +2347 0 obj << +/D [2318 0 R /XYZ 71.731 175.4639 null] +>> endobj +2348 0 obj << +/D [2318 0 R /XYZ 71.731 144.5278 null] +>> endobj +2349 0 obj << +/D [2318 0 R /XYZ 181.5683 132.872 null] +>> endobj +2350 0 obj << +/D [2318 0 R /XYZ 71.731 122.8098 null] +>> endobj +2317 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2353 0 obj << +/Length 1251 +/Filter /FlateDecode +>> +stream +xÚÅX]oœ8}ϯà­3RÇëŒí¼¥í¶û•(ªò¶©*gÆéŒB L«üû½ cÀ|¨»Š8ö=œ{}®DþH$ T!špmŸ/pô n}º ²q˜zwwñËG†#…TB“èî1b*A\đ`INdt·û{õ~¯_*S¬7”ãEõñ6ՙ©þÒõÏ«Ûßë“kSíó]¹þr÷Çůwm|ÎR‚L’lQCšTy4 Qˆs""%b1'ž·kÂWºÐÏؖ—} +í DBŠYB‹Úø°†\˜t(´0KážR>ˆK)p$4·<óhF y0I"‰O<@(NbÖ塏ÕÞòèéFc„m ¹¬óUVÅq[½íeю7YuØêêg>òX˜á6% Û 6>ì,,±åÙy 6*,)¦± +ƶ5äÑ–) Ñ¥qºÔP—'(‰añôõ=dß}²>×ӝΫ¼>K3^½,FPsÅ{FMÕ®C͗î0è’Êí‘)\Ä“yýziË8`$íj{ȚÂýsMùÊØõÿêní¬Î÷S0.˜.ÚÄa…e´±Ö&’Ú2>(èlÂ+¸ÄHR¢fäöaz·°YÁCq(âáÙf#y‡ÇYEâ´{t¥{ÜnMY>S—à'%ü”¿ HHë™cDON“f;„«wy^}2ÕM¾3L¥iÈk,€ݬÜy•W¯/æ²q®7vC Jˆ¬!êô÷˜ckep$à›f.?øSn‹Ã‹] ³á•_DÎ9v¦ªOr'æÎç¥ò£»†PŸluš‚SÔ?2x’·M‘oÓ㮽ãæό­øgt¶,[gùn!:=´ôÙ¯Ò4?Íkœ!}ÎSS.͉ÆÂHK{5# ¥æì·M¬¿6»þBq¬¿°åuxü?½š*Žd’Ìõj6Ñ«[Øl¯Å]Ы<‚½ºCã¿ëÕn„N×ڄúÕ­ô7ûg½}3žUÊ`ÿ:“6•…6Ÿ…@Ü%YèógÁ§ñÝP¨¼bR‰‰üv}µŽñê}×GÏ^÷d…ö{¾ÎvÃ4Y[—?ÁÃ*›QÿŒšß¡æµ]"}DXyƒ*¼—Š1âX¨±½ÔM«ðpónjÑSϗXñe›("%‰$3&îÃ&L¼…Íšx(îñl¢:ÇI’¨ÉoÊføI™S /2Jµ3YžŒŽ~ ü ^#%endstream +endobj +2352 0 obj << +/Type /Page +/Contents 2353 0 R +/Resources 2351 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2354 0 obj << +/D [2352 0 R /XYZ 71.731 729.2652 null] +>> endobj +2355 0 obj << +/D [2352 0 R /XYZ 71.731 718.3063 null] +>> endobj +2356 0 obj << +/D [2352 0 R /XYZ 71.731 708.2442 null] +>> endobj +2357 0 obj << +/D [2352 0 R /XYZ 71.731 706.9988 null] +>> endobj +2358 0 obj << +/D [2352 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2359 0 obj << +/D [2352 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2360 0 obj << +/D [2352 0 R /XYZ 71.731 686.4807 null] +>> endobj +2361 0 obj << +/D [2352 0 R /XYZ 71.731 686.4807 null] +>> endobj +2362 0 obj << +/D [2352 0 R /XYZ 139.477 669.9875 null] +>> endobj +2363 0 obj << +/D [2352 0 R /XYZ 139.477 669.9875 null] +>> endobj +2364 0 obj << +/D [2352 0 R /XYZ 76.7123 652.0548 null] +>> endobj +2365 0 obj << +/D [2352 0 R /XYZ 129.5143 634.122 null] +>> endobj +2366 0 obj << +/D [2352 0 R /XYZ 129.5143 634.122 null] +>> endobj +2367 0 obj << +/D [2352 0 R /XYZ 71.731 612.0399 null] +>> endobj +2368 0 obj << +/D [2352 0 R /XYZ 71.731 601.1458 null] +>> endobj +2369 0 obj << +/D [2352 0 R /XYZ 71.731 599.9004 null] +>> endobj +2370 0 obj << +/D [2352 0 R /XYZ 129.5143 580.8219 null] +>> endobj +661 0 obj << +/D [2352 0 R /XYZ 71.731 574.401 null] +>> endobj +162 0 obj << +/D [2352 0 R /XYZ 282.1874 530.5863 null] +>> endobj +2371 0 obj << +/D [2352 0 R /XYZ 71.731 510.4459 null] +>> endobj +2372 0 obj << +/D [2352 0 R /XYZ 161.0655 497.7096 null] +>> endobj +2373 0 obj << +/D [2352 0 R /XYZ 71.731 485.5901 null] +>> endobj +2374 0 obj << +/D [2352 0 R /XYZ 71.731 454.5605 null] +>> endobj +2375 0 obj << +/D [2352 0 R /XYZ 168.8063 443.2139 null] +>> endobj +2376 0 obj << +/D [2352 0 R /XYZ 71.731 431.0945 null] +>> endobj +2377 0 obj << +/D [2352 0 R /XYZ 71.731 399.7286 null] +>> endobj +2378 0 obj << +/D [2352 0 R /XYZ 181.5683 388.7183 null] +>> endobj +2379 0 obj << +/D [2352 0 R /XYZ 71.731 378.6561 null] +>> endobj +2380 0 obj << +/D [2352 0 R /XYZ 71.731 347.0845 null] +>> endobj +2381 0 obj << +/D [2352 0 R /XYZ 71.731 334.1231 null] +>> endobj +2382 0 obj << +/D [2352 0 R /XYZ 71.731 332.8778 null] +>> endobj +2383 0 obj << +/D [2352 0 R /XYZ 129.5143 313.7992 null] +>> endobj +2384 0 obj << +/D [2352 0 R /XYZ 129.5143 313.7992 null] +>> endobj +2385 0 obj << +/D [2352 0 R /XYZ 71.731 312.3597 null] +>> endobj +2386 0 obj << +/D [2352 0 R /XYZ 71.731 312.3597 null] +>> endobj +2387 0 obj << +/D [2352 0 R /XYZ 139.477 295.8665 null] +>> endobj +2388 0 obj << +/D [2352 0 R /XYZ 139.477 295.8665 null] +>> endobj +2389 0 obj << +/D [2352 0 R /XYZ 71.731 293.7097 null] +>> endobj +2390 0 obj << +/D [2352 0 R /XYZ 139.477 277.9337 null] +>> endobj +2391 0 obj << +/D [2352 0 R /XYZ 139.477 277.9337 null] +>> endobj +2392 0 obj << +/D [2352 0 R /XYZ 71.731 275.7769 null] +>> endobj +2393 0 obj << +/D [2352 0 R /XYZ 139.477 260.001 null] +>> endobj +2394 0 obj << +/D [2352 0 R /XYZ 139.477 260.001 null] +>> endobj +2395 0 obj << +/D [2352 0 R /XYZ 71.731 222.1429 null] +>> endobj +2396 0 obj << +/D [2352 0 R /XYZ 71.731 209.092 null] +>> endobj +2397 0 obj << +/D [2352 0 R /XYZ 71.731 207.8466 null] +>> endobj +2398 0 obj << +/D [2352 0 R /XYZ 129.5143 188.7681 null] +>> endobj +2399 0 obj << +/D [2352 0 R /XYZ 71.731 188.6686 null] +>> endobj +2400 0 obj << +/D [2352 0 R /XYZ 71.731 188.6686 null] +>> endobj +2401 0 obj << +/D [2352 0 R /XYZ 139.477 170.8354 null] +>> endobj +2402 0 obj << +/D [2352 0 R /XYZ 139.477 170.8354 null] +>> endobj +2403 0 obj << +/D [2352 0 R /XYZ 71.731 168.6785 null] +>> endobj +2404 0 obj << +/D [2352 0 R /XYZ 139.477 152.9026 null] +>> endobj +2405 0 obj << +/D [2352 0 R /XYZ 139.477 152.9026 null] +>> endobj +2406 0 obj << +/D [2352 0 R /XYZ 71.731 150.7458 null] +>> endobj +2407 0 obj << +/D [2352 0 R /XYZ 139.477 134.9698 null] +>> endobj +2408 0 obj << +/D [2352 0 R /XYZ 139.477 134.9698 null] +>> endobj +2409 0 obj << +/D [2352 0 R /XYZ 71.731 132.813 null] +>> endobj +2410 0 obj << +/D [2352 0 R /XYZ 139.477 117.0371 null] +>> endobj +2411 0 obj << +/D [2352 0 R /XYZ 139.477 117.0371 null] +>> endobj +2412 0 obj << +/D [2352 0 R /XYZ 71.731 114.8803 null] +>> endobj +2413 0 obj << +/D [2352 0 R /XYZ 71.731 114.8803 null] +>> endobj +2414 0 obj << +/D [2352 0 R /XYZ 149.4396 99.1043 null] +>> endobj +2415 0 obj << +/D [2352 0 R /XYZ 149.4396 99.1043 null] +>> endobj +2416 0 obj << +/D [2352 0 R /XYZ 71.731 96.9475 null] +>> endobj +2351 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2420 0 obj << +/Length 1511 +/Filter /FlateDecode +>> +stream +xÚ­™]s›8†ïó+¸‹=S«’ô.m÷£;›4Óæn»Ó!˜ÄLmð®'ÿ¾G aKˆív|دt^=H‡#L ‚Dš qd»+<ÃO\%Y)Íʽ}¸zý{ˆƒ%‚‡§ L"Ä DHQÌI<¬ÿY¼Û¤û6¯—+Êñ‚¢þx¿M˼ý;}ì/oî?ô'·y»©ÖÍò߇¿®~{âóP $† “&Ã$Fó(XQŒJ¸UEÂ1!`,8F! Å0š9N‹– *9–/”ò±7ÂxQ`ö§£Ž'ºÕ¥0b@±ÎÀõÜGÑ|Ý×Å.­_¤›Îùé.ppB©|Ós}¬ªmž–¯ú«Ml7y¢;ë.Šn×ӒàEš©ßŸªZ·(TÛ²Zç(³(ÁˆœLó7UnþƒÊËßuÿ vþg>`î«ú›>ã#úM[峂ÿùðÍûót½®ó¦qrŽ1õp4TµÊÏÑuDZ GÓG±· $!¢ '?ÜÏÃÇâŒ3>C5O«üø,QçàÛpà3}¬Ë†XR†ðÁ×]TO–Tðþî³jŸ×ߗ„/ »`‡Š؆j¶Vùa[¢Î=¶á€múØTM[¦»Ü¶è9â4¡È¿`Ž?îÛ¢*Ó-œ“þÛ?.­LIŒ"‘øò¨¡š`ªU~¦–¨s˜Žm8˜š> îÒæÿçQ݉"ÆH0áK¢†j¢Vù!Z¢Î8¶á€húxNÛü˜¾Ø!ÆIý’Tð¼ä ´¤|qìjƒpCõG˜'íš*7ðAån‹:ø… ;ð3²ôQÀ×bmá.bD¢Hœs‡²JA¿“¥“«Ô* ï¶ø‚1uçZ1ÇēkMÕa­ò¶DCxlÃAØô±K3[a#aWážÎ·7K†ïfUœE(a±'¹šª ˆZå‡h‰:â؆¢éCNSûü„¼Àq쟞iÓTY«~Ý_‹v3ÞœOakضayr°©š`­U~֖¨sXm8X›> £¿ºkò¬*×?S‹qBŽC_6T¸µÊÛuî± nÓÇãq[ìŠÖ>µ¡ sÍí·i¹>k=‡^lY"±'˚*7ÅAå¥h‹:ƒâ… ;Å3íË>ÿ‰I{cNÖ®¡ÄÍÑ3Rªëbÿ]wµ®‹¯àˆáIÀ¦j‚¯VùùZ¢Îá;¶áàkúØu/³,„CŽ©Ÿ1|¡ +ܾ++è%çÐ8m‹ìZ%zø/֛lo¿ ¿8aaÆQÈ©#[hÕʔYnÄEoÎ;R„)K¬qÝwB·ºôq~'ô„0m4eUÎMçÛ Õ¶»ø&Ÿs¹L¾ºÜ†ñ¸ã¼ ¾"X@Å «H–€qž¢É÷ž"^¼­ªö®j‹§—Ç8ôÔØlA7VéJ¾HQ¿\ï몭äz{3´8[µ]Q;VUŒ‚5§é“ÚÍ+=³š&}–…Â+,³í*‡}ь¾iól3þ®9ì÷UÝê 6ÇJÛ2Çñ>o²ºè6ÃS#½7h?’~£—–U·9 L?7,€”]Hû¯õ²P–ՏÕAŸª›Üíqú'lÙê.Su¶I÷{(þÕRÔób …ë¦(s$Ç“jE"…?ä >åí¡.•Yõ ÐÏúC–Áx:lÑ\Œ7ÛmO@›ùTmófîÜЯoçDº—,Ò:…$°ß\,hKŸCåN¨Ü$¹Þ·iÕʔI¥}·€/zs&*¡Ö¸îD¢[]ú8O$:¡ù gö#óé²cøC¶—û»,m‡¤Ò+uîÌÐ˽‘ëÝڐ¡MÙD†dÞ m‹;#C_ø°fè37ÀåÖõ¸ä°ˆ˜˜JÒ7¬æ#³­úã¡ÂV¦rõ&C­Éë ,ßë1 õ׋aDÉä¿c†æòÏ1Nc˜$I2ô$†Î¿º,cwAendstream +endobj +2419 0 obj << +/Type /Page +/Contents 2420 0 R +/Resources 2418 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2421 0 obj << +/D [2419 0 R /XYZ 71.731 729.2652 null] +>> endobj +2422 0 obj << +/D [2419 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2423 0 obj << +/D [2419 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2424 0 obj << +/D [2419 0 R /XYZ 71.731 706.1869 null] +>> endobj +2425 0 obj << +/D [2419 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2426 0 obj << +/D [2419 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2427 0 obj << +/D [2419 0 R /XYZ 71.731 688.2541 null] +>> endobj +2428 0 obj << +/D [2419 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2429 0 obj << +/D [2419 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2430 0 obj << +/D [2419 0 R /XYZ 71.731 670.3214 null] +>> endobj +2431 0 obj << +/D [2419 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2432 0 obj << +/D [2419 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2433 0 obj << +/D [2419 0 R /XYZ 71.731 652.3886 null] +>> endobj +2434 0 obj << +/D [2419 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2435 0 obj << +/D [2419 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2436 0 obj << +/D [2419 0 R /XYZ 71.731 634.4559 null] +>> endobj +2437 0 obj << +/D [2419 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2438 0 obj << +/D [2419 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2439 0 obj << +/D [2419 0 R /XYZ 71.731 616.5231 null] +>> endobj +2440 0 obj << +/D [2419 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2441 0 obj << +/D [2419 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2442 0 obj << +/D [2419 0 R /XYZ 71.731 598.5904 null] +>> endobj +2443 0 obj << +/D [2419 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2444 0 obj << +/D [2419 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2445 0 obj << +/D [2419 0 R /XYZ 71.731 581.3749 null] +>> endobj +2446 0 obj << +/D [2419 0 R /XYZ 149.4396 564.8817 null] +>> endobj +2447 0 obj << +/D [2419 0 R /XYZ 149.4396 564.8817 null] +>> endobj +2448 0 obj << +/D [2419 0 R /XYZ 71.731 562.7248 null] +>> endobj +2449 0 obj << +/D [2419 0 R /XYZ 149.4396 546.9489 null] +>> endobj +2450 0 obj << +/D [2419 0 R /XYZ 149.4396 546.9489 null] +>> endobj +2451 0 obj << +/D [2419 0 R /XYZ 71.731 545.5094 null] +>> endobj +2452 0 obj << +/D [2419 0 R /XYZ 149.4396 529.0162 null] +>> endobj +2453 0 obj << +/D [2419 0 R /XYZ 149.4396 529.0162 null] +>> endobj +2454 0 obj << +/D [2419 0 R /XYZ 71.731 526.8593 null] +>> endobj +2455 0 obj << +/D [2419 0 R /XYZ 149.4396 511.0834 null] +>> endobj +2456 0 obj << +/D [2419 0 R /XYZ 149.4396 511.0834 null] +>> endobj +2457 0 obj << +/D [2419 0 R /XYZ 71.731 509.6439 null] +>> endobj +2458 0 obj << +/D [2419 0 R /XYZ 149.4396 493.1507 null] +>> endobj +2459 0 obj << +/D [2419 0 R /XYZ 149.4396 493.1507 null] +>> endobj +2460 0 obj << +/D [2419 0 R /XYZ 71.731 490.9938 null] +>> endobj +2461 0 obj << +/D [2419 0 R /XYZ 149.4396 475.2179 null] +>> endobj +2462 0 obj << +/D [2419 0 R /XYZ 149.4396 475.2179 null] +>> endobj +2463 0 obj << +/D [2419 0 R /XYZ 76.7123 457.2852 null] +>> endobj +2464 0 obj << +/D [2419 0 R /XYZ 139.477 439.3524 null] +>> endobj +2465 0 obj << +/D [2419 0 R /XYZ 139.477 439.3524 null] +>> endobj +662 0 obj << +/D [2419 0 R /XYZ 71.731 416.4383 null] +>> endobj +166 0 obj << +/D [2419 0 R /XYZ 265.6609 371.184 null] +>> endobj +2466 0 obj << +/D [2419 0 R /XYZ 71.731 347.6953 null] +>> endobj +2467 0 obj << +/D [2419 0 R /XYZ 161.0655 338.3073 null] +>> endobj +2468 0 obj << +/D [2419 0 R /XYZ 71.731 326.1879 null] +>> endobj +2469 0 obj << +/D [2419 0 R /XYZ 71.731 294.822 null] +>> endobj +2470 0 obj << +/D [2419 0 R /XYZ 168.8063 283.8117 null] +>> endobj +2471 0 obj << +/D [2419 0 R /XYZ 71.731 256.7483 null] +>> endobj +2472 0 obj << +/D [2419 0 R /XYZ 71.731 240.3263 null] +>> endobj +2473 0 obj << +/D [2419 0 R /XYZ 71.731 210.5963 null] +>> endobj +2474 0 obj << +/D [2419 0 R /XYZ 181.5683 197.7345 null] +>> endobj +2475 0 obj << +/D [2419 0 R /XYZ 71.731 187.6723 null] +>> endobj +2476 0 obj << +/D [2419 0 R /XYZ 71.731 156.1007 null] +>> endobj +2477 0 obj << +/D [2419 0 R /XYZ 71.731 143.1393 null] +>> endobj +2478 0 obj << +/D [2419 0 R /XYZ 71.731 141.894 null] +>> endobj +2479 0 obj << +/D [2419 0 R /XYZ 129.5143 122.8154 null] +>> endobj +2480 0 obj << +/D [2419 0 R /XYZ 129.5143 122.8154 null] +>> endobj +2481 0 obj << +/D [2419 0 R /XYZ 71.731 121.3759 null] +>> endobj +2482 0 obj << +/D [2419 0 R /XYZ 71.731 121.3759 null] +>> endobj +2483 0 obj << +/D [2419 0 R /XYZ 139.477 104.8827 null] +>> endobj +2484 0 obj << +/D [2419 0 R /XYZ 139.477 104.8827 null] +>> endobj +2485 0 obj << +/D [2419 0 R /XYZ 71.731 102.7258 null] +>> endobj +2418 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2488 0 obj << +/Length 1281 +/Filter /FlateDecode +>> +stream +xÚ͘]o¤6†ïó+¸Û)㵍Mî²Û¯TM;ZM¯6UD&ƒ–À˜®òï{Œù0`>zSU¹&¯}^?¶ÇÃqA… õõ8u·ì¼Â¿~¾!µdWkv¦èÓáæãO.v|ä{Ôs'Çõ=Äs„K‘äD:‡ã×Íçsp)£|»£o(Ò×}¤Qù[ð¢ï÷úæ1*ÏÙ±ØþuøõæÇCŸ»ù‚ÌšdX"æI×ÙQŒ|J¸UE  N¨è]æŠv0Ôw"j 0˜V×ÊÔhž(åCw†‹)ó³Ã&îðÚùhZ}¸Ò‘Õc•×GLˆ¾¿ƒä)•énÀ³+}”êNC-Ê&èš>ºÅõrÉòÒÂWºˆH¹¯Ñ‡³ó¡Ǟ³Seˆðôžø•×<-î&‰s&c‚,7e3Ä[Ù"q[ÜÄm>:r-ñžŽ©až|a‰ôtMêYAUMߎ $¤ ¯lŽu¹ +F¸ªæ„Ü|ʲòÏË1(£êýfy+ +$)ýÙçY™•ï—è®mÑ-™ºíŽB²"RoÇA˜Êùæ8¸–çÛ®Žy®^ɱ€ÿ‹™]Ó·i懨óøRÆY:g²,÷¨¶sŸ$ٖòÍ÷¢Þâç¨+Žà 5¬¬ÊL_¯Õê (ëƺ§T?äQ˜åǺTþ#MÞ.yüäõ¯PGW5[–kÂ×ݼDfÀãí žk»ë,>ì«„Õ‚G÷Üj Ðaš•ý>Ãs¾Fà±ÑÃëÇž¹Õ¬+­ö2\v0DoÐÚÙjÑ7=}ɒ¨X»ŽRû"µFÚ«J8È(~£|&{P8¡éñ…ìaÊf²G+[̶¸+²Çȇ=_÷|¨mf;r0„ɨB»†MªiÏvª½ªÏÂ@í2SyÍ£ÉÃ&”ƒ½ùÄ)›9L´²ÅÄ-îŠÃÄȇõ0ѳq\ô¹w²f3ð½«yTkÓN5 Qù¢JÁ{½M?œß‚ðÃô,`‚\J–&¡SÍÍA­Zž‚qÐ5300aŸÃÃÿú,M r%ԘóäMÙ úV¶ÈÞwü‘+ýžÿê,M á”Ê… mÊf2t+[Ìж¸+2ôȇ=C÷|T(O±ª}֞ûtž^~êféCN'š[zZ´¼ðF×,»¾û¢ë ¼@!ù\”ª +³f\*‡§ŽÞ¶Wuhós݇^UD‰Å½kÈæ6²e„–¸k }Ø1š6êBôYÕ ªþ´á˜tåšEWcfIâù³Ÿ¡ Íø+4§*8Â7*Ùe“ß”-ÿ…Î2Bendstream +endobj +2487 0 obj << +/Type /Page +/Contents 2488 0 R +/Resources 2486 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2489 0 obj << +/D [2487 0 R /XYZ 71.731 729.2652 null] +>> endobj +2490 0 obj << +/D [2487 0 R /XYZ 139.477 708.3437 null] +>> endobj +2491 0 obj << +/D [2487 0 R /XYZ 139.477 708.3437 null] +>> endobj +2492 0 obj << +/D [2487 0 R /XYZ 71.731 706.1869 null] +>> endobj +2493 0 obj << +/D [2487 0 R /XYZ 139.477 690.4109 null] +>> endobj +2494 0 obj << +/D [2487 0 R /XYZ 139.477 690.4109 null] +>> endobj +2495 0 obj << +/D [2487 0 R /XYZ 76.7123 672.4782 null] +>> endobj +2496 0 obj << +/D [2487 0 R /XYZ 129.5143 654.5454 null] +>> endobj +2497 0 obj << +/D [2487 0 R /XYZ 129.5143 654.5454 null] +>> endobj +2498 0 obj << +/D [2487 0 R /XYZ 71.731 652.3886 null] +>> endobj +2499 0 obj << +/D [2487 0 R /XYZ 129.5143 636.6127 null] +>> endobj +2500 0 obj << +/D [2487 0 R /XYZ 129.5143 636.6127 null] +>> endobj +2501 0 obj << +/D [2487 0 R /XYZ 71.731 634.4559 null] +>> endobj +2502 0 obj << +/D [2487 0 R /XYZ 129.5143 618.6799 null] +>> endobj +2503 0 obj << +/D [2487 0 R /XYZ 129.5143 618.6799 null] +>> endobj +2504 0 obj << +/D [2487 0 R /XYZ 71.731 616.5231 null] +>> endobj +2505 0 obj << +/D [2487 0 R /XYZ 129.5143 600.7472 null] +>> endobj +2506 0 obj << +/D [2487 0 R /XYZ 129.5143 600.7472 null] +>> endobj +2507 0 obj << +/D [2487 0 R /XYZ 71.731 578.6651 null] +>> endobj +2508 0 obj << +/D [2487 0 R /XYZ 71.731 567.7709 null] +>> endobj +2509 0 obj << +/D [2487 0 R /XYZ 71.731 566.5256 null] +>> endobj +2510 0 obj << +/D [2487 0 R /XYZ 129.5143 547.4471 null] +>> endobj +663 0 obj << +/D [2487 0 R /XYZ 71.731 541.0262 null] +>> endobj +170 0 obj << +/D [2487 0 R /XYZ 255.3838 497.2114 null] +>> endobj +2511 0 obj << +/D [2487 0 R /XYZ 71.731 473.7227 null] +>> endobj +2512 0 obj << +/D [2487 0 R /XYZ 161.0655 464.3347 null] +>> endobj +2513 0 obj << +/D [2487 0 R /XYZ 71.731 452.2152 null] +>> endobj +2514 0 obj << +/D [2487 0 R /XYZ 71.731 420.8494 null] +>> endobj +2515 0 obj << +/D [2487 0 R /XYZ 168.8063 409.8391 null] +>> endobj +2516 0 obj << +/D [2487 0 R /XYZ 71.731 382.7757 null] +>> endobj +2517 0 obj << +/D [2487 0 R /XYZ 71.731 354.6974 null] +>> endobj +2518 0 obj << +/D [2487 0 R /XYZ 71.731 323.1159 null] +>> endobj +2519 0 obj << +/D [2487 0 R /XYZ 181.5683 312.1056 null] +>> endobj +2520 0 obj << +/D [2487 0 R /XYZ 71.731 302.0434 null] +>> endobj +2521 0 obj << +/D [2487 0 R /XYZ 71.731 270.4718 null] +>> endobj +2522 0 obj << +/D [2487 0 R /XYZ 71.731 257.5104 null] +>> endobj +2523 0 obj << +/D [2487 0 R /XYZ 71.731 256.2651 null] +>> endobj +2524 0 obj << +/D [2487 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2525 0 obj << +/D [2487 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2526 0 obj << +/D [2487 0 R /XYZ 71.731 235.747 null] +>> endobj +2527 0 obj << +/D [2487 0 R /XYZ 71.731 235.747 null] +>> endobj +2528 0 obj << +/D [2487 0 R /XYZ 139.477 219.2538 null] +>> endobj +2529 0 obj << +/D [2487 0 R /XYZ 139.477 219.2538 null] +>> endobj +2530 0 obj << +/D [2487 0 R /XYZ 71.731 217.097 null] +>> endobj +2531 0 obj << +/D [2487 0 R /XYZ 139.477 201.321 null] +>> endobj +2532 0 obj << +/D [2487 0 R /XYZ 139.477 201.321 null] +>> endobj +2533 0 obj << +/D [2487 0 R /XYZ 71.731 199.1642 null] +>> endobj +2534 0 obj << +/D [2487 0 R /XYZ 139.477 183.3883 null] +>> endobj +2535 0 obj << +/D [2487 0 R /XYZ 139.477 183.3883 null] +>> endobj +2536 0 obj << +/D [2487 0 R /XYZ 76.7123 165.4555 null] +>> endobj +2537 0 obj << +/D [2487 0 R /XYZ 129.5143 147.5228 null] +>> endobj +2538 0 obj << +/D [2487 0 R /XYZ 129.5143 147.5228 null] +>> endobj +2539 0 obj << +/D [2487 0 R /XYZ 71.731 146.3438 null] +>> endobj +2540 0 obj << +/D [2487 0 R /XYZ 71.731 146.3438 null] +>> endobj +2541 0 obj << +/D [2487 0 R /XYZ 139.477 129.59 null] +>> endobj +2542 0 obj << +/D [2487 0 R /XYZ 139.477 129.59 null] +>> endobj +2543 0 obj << +/D [2487 0 R /XYZ 71.731 127.4332 null] +>> endobj +2544 0 obj << +/D [2487 0 R /XYZ 139.477 111.6573 null] +>> endobj +2545 0 obj << +/D [2487 0 R /XYZ 139.477 111.6573 null] +>> endobj +2546 0 obj << +/D [2487 0 R /XYZ 71.731 110.2765 null] +>> endobj +2547 0 obj << +/D [2487 0 R /XYZ 71.731 110.2765 null] +>> endobj +2486 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2550 0 obj << +/Length 1216 +/Filter /FlateDecode +>> +stream +xÚ­˜[o£8Çßû)xk" ^_1ô-;ÝKWÓQ4ÍÛΪ¢ÁiPˆ€lÕo?‡‹‰ æ¢ÝQ€ôoŸ??ûÛÃq$A’Á…ˆz‚:Ûã v^á_ܐFâ6×ýº¹ùåw†õœÍÎa‡„äŽdù‚øÎ&ú{ñyž +•-]*ð‚¢úº>„‰*¾„/õãjýPß<ªbŸFùòŸÍ_7¿mÚø‚IødÔ$ |$°ð—bP"¬*ÂÄ¥„wÁ>bœÉö]hàHDÊ÷„wѲVU¾ËwJŵ7 x“žcö§£^_/.t«¾ æ;> õxeƒƒ àÚõìÞÓì­´RÙ¾ LjsÁ H©»«©æE'¯Ÿê‡§ó 4¯ïÃ(ÊTÞíßÝ  7‚ƒqŽ¦j˜c«šäh‹:ƒcφcÇG”äÔ‘r„ɇu_õî¥Ú¦Ifõãý×'ý{ö¤ÂnIáêÓ Ü†j·VMã¶DƒûÚÆnÓà&?÷)‹ÿ ¶àHpÁ'`ªØZ5 Ûuìk°MäÇ0ÿÿ5Bwb…È<ä*' ªˆZ5 ÑuÄkMÇj=²0d +Óz˜áªž­ðCñÿŽVè5ÒÛ¥Ð8,âím3»³ö?xí·§[hB‡øȓÁT6T#àUÓÃ`‰:g®m ƒéã%KÃhæ…e$¬õ8«_aµ\’ê[ýÃ¥»Y« ÆHr9U– Õ]­š¦k‰:‡îµº¦c¸µpþÃn˜ëãjÉñâó,ˆÂ‡-!áåÖT ClU“mQg@ìÙ°Cìøx õ~ØË­0ï§,p¯K±€@K*Ք®vÞvȂpæûEA«\SfAÞëm9ìù1å5î0sݪï£Ë\½i#Ï÷Ïû4/žß”»'‘  ŽsÿҖ€·$­˜&Íú÷ôg}Svß(JܪÜST±ׇî!=\¨?>êIðMç,Éïzp`D:\ +håÙÇD‹\Cu’²±BqÝ×àˆP +'BmA‡D7²™0Šƒž¦‰8)°¤¾ÄzK|Þna^ï·f˜ÀœDp@«ÆÖ@Òg¬BI™¨;^yX”þâ^T¡VQ9m‘¹N2‰|Š]yô”^½z¯³´H‹“ºk[\¦TÓÖ¥–ûfFéHF–Kux.öŸ:)úGzA¾2âê~M#÷*ßfñ©ˆÓdÌ +¼±ð¨i¥1&è¨š$ü†þú!׶¦X¤É¡¹‹ªÎ:}è®wYz¬ïŠ½Š›mG'ò|´! 쎘ôÌé>1æ ¹]U¯Î‡B×7ˆ—½Ç¹Bs)®‡Ú˜j¶Qß҃ÊçŽmã¤ñrŠçÆ\—f!ìÞT6’Ø„ $f™mÊFR»•Mæ¶-îŒäîùèV[ÝeÌ>½·º´ßvÊö*=nX恩> endobj +2551 0 obj << +/D [2549 0 R /XYZ 71.731 729.2652 null] +>> endobj +2552 0 obj << +/D [2549 0 R /XYZ 71.731 741.2204 null] +>> endobj +2553 0 obj << +/D [2549 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2554 0 obj << +/D [2549 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2555 0 obj << +/D [2549 0 R /XYZ 71.731 706.1869 null] +>> endobj +2556 0 obj << +/D [2549 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2557 0 obj << +/D [2549 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2558 0 obj << +/D [2549 0 R /XYZ 71.731 688.2541 null] +>> endobj +2559 0 obj << +/D [2549 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2560 0 obj << +/D [2549 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2561 0 obj << +/D [2549 0 R /XYZ 71.731 670.3214 null] +>> endobj +2562 0 obj << +/D [2549 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2563 0 obj << +/D [2549 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2564 0 obj << +/D [2549 0 R /XYZ 71.731 652.3886 null] +>> endobj +2565 0 obj << +/D [2549 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2566 0 obj << +/D [2549 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2567 0 obj << +/D [2549 0 R /XYZ 71.731 634.4559 null] +>> endobj +2568 0 obj << +/D [2549 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2569 0 obj << +/D [2549 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2570 0 obj << +/D [2549 0 R /XYZ 71.731 616.5231 null] +>> endobj +2571 0 obj << +/D [2549 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2572 0 obj << +/D [2549 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2573 0 obj << +/D [2549 0 R /XYZ 71.731 598.5904 null] +>> endobj +2574 0 obj << +/D [2549 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2575 0 obj << +/D [2549 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2576 0 obj << +/D [2549 0 R /XYZ 76.7123 564.8817 null] +>> endobj +2577 0 obj << +/D [2549 0 R /XYZ 139.477 546.9489 null] +>> endobj +2578 0 obj << +/D [2549 0 R /XYZ 139.477 546.9489 null] +>> endobj +2579 0 obj << +/D [2549 0 R /XYZ 71.731 509.0909 null] +>> endobj +2580 0 obj << +/D [2549 0 R /XYZ 71.731 496.0399 null] +>> endobj +2581 0 obj << +/D [2549 0 R /XYZ 71.731 494.7946 null] +>> endobj +2582 0 obj << +/D [2549 0 R /XYZ 129.5143 475.716 null] +>> endobj +664 0 obj << +/D [2549 0 R /XYZ 71.731 469.2952 null] +>> endobj +174 0 obj << +/D [2549 0 R /XYZ 235.1724 425.4804 null] +>> endobj +2583 0 obj << +/D [2549 0 R /XYZ 71.731 405.3401 null] +>> endobj +2584 0 obj << +/D [2549 0 R /XYZ 161.0655 392.6037 null] +>> endobj +2585 0 obj << +/D [2549 0 R /XYZ 71.731 380.4842 null] +>> endobj +2586 0 obj << +/D [2549 0 R /XYZ 71.731 349.4546 null] +>> endobj +2587 0 obj << +/D [2549 0 R /XYZ 168.8063 338.1081 null] +>> endobj +2588 0 obj << +/D [2549 0 R /XYZ 71.731 311.0446 null] +>> endobj +2589 0 obj << +/D [2549 0 R /XYZ 71.731 281.5303 null] +>> endobj +2590 0 obj << +/D [2549 0 R /XYZ 71.731 263.0412 null] +>> endobj +2591 0 obj << +/D [2549 0 R /XYZ 71.731 232.1051 null] +>> endobj +2592 0 obj << +/D [2549 0 R /XYZ 181.5683 220.4493 null] +>> endobj +2593 0 obj << +/D [2549 0 R /XYZ 71.731 210.3871 null] +>> endobj +2594 0 obj << +/D [2549 0 R /XYZ 71.731 176.9639 null] +>> endobj +2595 0 obj << +/D [2549 0 R /XYZ 71.731 165.8541 null] +>> endobj +2596 0 obj << +/D [2549 0 R /XYZ 71.731 164.6088 null] +>> endobj +2597 0 obj << +/D [2549 0 R /XYZ 129.5143 145.5303 null] +>> endobj +2598 0 obj << +/D [2549 0 R /XYZ 129.5143 145.5303 null] +>> endobj +2599 0 obj << +/D [2549 0 R /XYZ 71.731 144.0907 null] +>> endobj +2600 0 obj << +/D [2549 0 R /XYZ 71.731 144.0907 null] +>> endobj +2601 0 obj << +/D [2549 0 R /XYZ 139.477 127.5975 null] +>> endobj +2602 0 obj << +/D [2549 0 R /XYZ 139.477 127.5975 null] +>> endobj +2603 0 obj << +/D [2549 0 R /XYZ 76.7123 109.6647 null] +>> endobj +2548 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2606 0 obj << +/Length 981 +/Filter /FlateDecode +>> +stream +xÚÍWI£8½×¯à˜HÛûR·šÞÔ£)*åÖ5*1ÁéBJ ¢Vÿûù†˜Â,ÇQäÙïù}‹maøH¤<¨AT +Î8ú }{ ;LìƒþØ?|üÊpd‘TFûcČDBñH1Š´ :Ú§?6ŸÞ’KmËmLÞPÔ>w§$·õ_É¿íקÝ÷öåo[¿iµýgÿç×}Ï/˜BFɬHN4⠛(¦JDEˆAB‹Á1ÎT¿j"àQ˜4‹éq=¬YÍ ¥â½:B)ü ;Þ÷Ï»ŽnÔXӑS%¿é€% ÂÙPG’¦¥­ª×,mÔܤßã $’\ ài ­µY^pn·cÝÏ©Íëìc +1‚©¢XÂhÄM•lùžm}-óêq´öÎ%)œÉÏ}،ç=lÑóï +ÏC:îöžtÜ$λcû¬®‡z¼ž\0@ŸB€·ÆB!¥ƒŒ(íd D5Å ôæ³=ÙÚ>¥[‚7·Èì·o~_ì×rKñ¦8{¢ÍÒ«a¼veQ5Ìñ؏¸§”S‘67|§ÁñkÇßp{Éò‚N®õ›³¡K†2ñµ(_óälßý›¥0Œ„ǝ_øg[ÊìRgE>'A§‘Ô×î$&ù€½ýÒlߎ°$÷ۛû©ºØC[é`(º•.‚„&mØvßݔçäwûRä'÷v½¤ImstªŠcOš¹VXl©Øürj« Ш@¦¤_x yç,?6y’\OuG |寬²h­ýO§S+¬3ã¹8Ùj1‰´q]éœåNË%[˹Û±IJÈØ'fZ £¶¥ZŒ›i1=l±Å„xW´˜‘Žp[èhŠ+`@0¶óª.¯‡¾£wûg3¾é燤) y-íx,a¿œØ.;Pì¡î¶’æX0XŽCMº +‘Ç”›é´©Ý ‘ˆ¡§Ì ®Ô@Ã8Ҟ*&7J>r6ËvÎ =·Óµ]¸Ú¯ìdÞR8=aa–Ž#>l&o{ØbކxWäíHG8o:&v‚€å„JDá7:œ¸ŽUúA˜ÌX*‚™ôBÊú°™œía‹Iâ]‘µ!ž%.m2&Žk÷ìýÁ-숾dÓ5ç’C-›4&]ãÑXDÀ"OðNG&MU#11ª—ªÑ‡ÍTc[¬ÆïŠjéWã@Çÿîr@¸„(k¾ä¹›ó¼ƒ-{à]ãy@Gàr0бòràËt—j®œ.Íì½Û̯݂ €`ÝÏÔèarò ü¸·¬Eendstream +endobj +2605 0 obj << +/Type /Page +/Contents 2606 0 R +/Resources 2604 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2607 0 obj << +/D [2605 0 R /XYZ 71.731 729.2652 null] +>> endobj +2608 0 obj << +/D [2605 0 R /XYZ 71.731 741.2204 null] +>> endobj +2609 0 obj << +/D [2605 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2610 0 obj << +/D [2605 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2611 0 obj << +/D [2605 0 R /XYZ 71.731 675.3674 null] +>> endobj +2612 0 obj << +/D [2605 0 R /XYZ 71.731 674.1221 null] +>> endobj +2613 0 obj << +/D [2605 0 R /XYZ 129.5143 655.0436 null] +>> endobj +665 0 obj << +/D [2605 0 R /XYZ 71.731 648.6227 null] +>> endobj +178 0 obj << +/D [2605 0 R /XYZ 385.7203 604.8079 null] +>> endobj +2614 0 obj << +/D [2605 0 R /XYZ 71.731 581.3192 null] +>> endobj +2615 0 obj << +/D [2605 0 R /XYZ 161.0655 571.9312 null] +>> endobj +2616 0 obj << +/D [2605 0 R /XYZ 71.731 559.8118 null] +>> endobj +2617 0 obj << +/D [2605 0 R /XYZ 71.731 528.4459 null] +>> endobj +2618 0 obj << +/D [2605 0 R /XYZ 168.8063 517.4356 null] +>> endobj +2619 0 obj << +/D [2605 0 R /XYZ 71.731 490.3722 null] +>> endobj +2620 0 obj << +/D [2605 0 R /XYZ 71.731 459.0063 null] +>> endobj +2621 0 obj << +/D [2605 0 R /XYZ 71.731 442.3687 null] +>> endobj +2622 0 obj << +/D [2605 0 R /XYZ 71.731 411.4327 null] +>> endobj +2623 0 obj << +/D [2605 0 R /XYZ 181.5683 399.7768 null] +>> endobj +2624 0 obj << +/D [2605 0 R /XYZ 71.731 389.7146 null] +>> endobj +2625 0 obj << +/D [2605 0 R /XYZ 71.731 356.2915 null] +>> endobj +2626 0 obj << +/D [2605 0 R /XYZ 71.731 345.1816 null] +>> endobj +2627 0 obj << +/D [2605 0 R /XYZ 71.731 343.9363 null] +>> endobj +2628 0 obj << +/D [2605 0 R /XYZ 129.5143 324.8578 null] +>> endobj +2629 0 obj << +/D [2605 0 R /XYZ 129.5143 324.8578 null] +>> endobj +2630 0 obj << +/D [2605 0 R /XYZ 71.731 323.4182 null] +>> endobj +2631 0 obj << +/D [2605 0 R /XYZ 71.731 323.4182 null] +>> endobj +2632 0 obj << +/D [2605 0 R /XYZ 139.477 306.925 null] +>> endobj +2633 0 obj << +/D [2605 0 R /XYZ 139.477 306.925 null] +>> endobj +2634 0 obj << +/D [2605 0 R /XYZ 76.7123 288.9923 null] +>> endobj +2635 0 obj << +/D [2605 0 R /XYZ 129.5143 271.0595 null] +>> endobj +2636 0 obj << +/D [2605 0 R /XYZ 129.5143 271.0595 null] +>> endobj +2637 0 obj << +/D [2605 0 R /XYZ 71.731 268.9027 null] +>> endobj +2638 0 obj << +/D [2605 0 R /XYZ 71.731 268.9027 null] +>> endobj +2639 0 obj << +/D [2605 0 R /XYZ 139.477 253.1268 null] +>> endobj +2640 0 obj << +/D [2605 0 R /XYZ 71.731 250.9699 null] +>> endobj +2641 0 obj << +/D [2605 0 R /XYZ 139.477 235.194 null] +>> endobj +2642 0 obj << +/D [2605 0 R /XYZ 76.7123 217.2613 null] +>> endobj +2643 0 obj << +/D [2605 0 R /XYZ 129.5143 199.3285 null] +>> endobj +2644 0 obj << +/D [2605 0 R /XYZ 129.5143 199.3285 null] +>> endobj +2645 0 obj << +/D [2605 0 R /XYZ 71.731 177.9637 null] +>> endobj +2646 0 obj << +/D [2605 0 R /XYZ 71.731 166.3523 null] +>> endobj +2647 0 obj << +/D [2605 0 R /XYZ 71.731 165.1069 null] +>> endobj +2648 0 obj << +/D [2605 0 R /XYZ 129.5143 146.0284 null] +>> endobj +666 0 obj << +/D [2605 0 R /XYZ 71.731 139.6075 null] +>> endobj +2604 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2651 0 obj << +/Length 843 +/Filter /FlateDecode +>> +stream +xÚ½WÍoÚ0½÷¯È¤ÆóGüÕ]·iÓ&U·uB)1%$UbTí¿Ÿpˆ\6q0QžýžŸßÏvPÍ%NLƒ%ÀŒâd¹½É«yõåyHê1iºŸß|øL`"d˜%óUB$”g 'ŠD2/~M>®ó7­šiŠ)œ`àÚÇM^)ý=q³Ç¯îÏ¥×uÑNÏ¿Ý|šø)á@ +CrVä5”‰Q‚8ÀˆfVg7cÈB\îeb@„ÇÅäAm”V³bŠà¤hTÛΧ Nþ¼)+ˌ%ƒ)g y’Ú)sÆ÷c=6µ®µépwè!L¶'÷}SŒC‘wŒžM8¶½#ϐÂ|§×·î1w˜…}Q‹ºYTùVŠ¨K;²P݃j—Mù¦Ëº:§˜µd8Ô×z UOŠ{°z€Í,EŠ`„³}×'¥wMåQÈ5åʵín¹4#¬v?»•µ<ßm´Ç×z­š÷²uC_3¹ÙfSO1¼«Â ñToT{í:äŶ¬®¥zœ":É㾉·£3‹”"žd”žIÍ앆0—Y™˜> endobj +2652 0 obj << +/D [2650 0 R /XYZ 71.731 729.2652 null] +>> endobj +2653 0 obj << +/D [2650 0 R /XYZ 71.731 741.2204 null] +>> endobj +182 0 obj << +/D [2650 0 R /XYZ 274.3201 706.1179 null] +>> endobj +2654 0 obj << +/D [2650 0 R /XYZ 71.731 682.6291 null] +>> endobj +2655 0 obj << +/D [2650 0 R /XYZ 161.0655 673.2412 null] +>> endobj +2656 0 obj << +/D [2650 0 R /XYZ 71.731 661.1217 null] +>> endobj +2657 0 obj << +/D [2650 0 R /XYZ 71.731 575.2602 null] +>> endobj +2658 0 obj << +/D [2650 0 R /XYZ 71.731 544.3242 null] +>> endobj +2659 0 obj << +/D [2650 0 R /XYZ 181.5683 532.6683 null] +>> endobj +2660 0 obj << +/D [2650 0 R /XYZ 71.731 522.6062 null] +>> endobj +2661 0 obj << +/D [2650 0 R /XYZ 71.731 491.0346 null] +>> endobj +2662 0 obj << +/D [2650 0 R /XYZ 71.731 478.0732 null] +>> endobj +2663 0 obj << +/D [2650 0 R /XYZ 71.731 476.8278 null] +>> endobj +2664 0 obj << +/D [2650 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2665 0 obj << +/D [2650 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2666 0 obj << +/D [2650 0 R /XYZ 71.731 456.3097 null] +>> endobj +2667 0 obj << +/D [2650 0 R /XYZ 71.731 456.3097 null] +>> endobj +2668 0 obj << +/D [2650 0 R /XYZ 139.477 439.8165 null] +>> endobj +2669 0 obj << +/D [2650 0 R /XYZ 139.477 439.8165 null] +>> endobj +2670 0 obj << +/D [2650 0 R /XYZ 76.7123 421.8838 null] +>> endobj +2671 0 obj << +/D [2650 0 R /XYZ 129.5143 403.951 null] +>> endobj +2672 0 obj << +/D [2650 0 R /XYZ 129.5143 403.951 null] +>> endobj +2673 0 obj << +/D [2650 0 R /XYZ 71.731 401.7942 null] +>> endobj +2674 0 obj << +/D [2650 0 R /XYZ 71.731 401.7942 null] +>> endobj +2675 0 obj << +/D [2650 0 R /XYZ 139.477 386.0183 null] +>> endobj +2676 0 obj << +/D [2650 0 R /XYZ 71.731 383.8615 null] +>> endobj +2677 0 obj << +/D [2650 0 R /XYZ 139.477 368.0855 null] +>> endobj +2678 0 obj << +/D [2650 0 R /XYZ 71.731 330.2275 null] +>> endobj +2679 0 obj << +/D [2650 0 R /XYZ 71.731 317.1765 null] +>> endobj +2680 0 obj << +/D [2650 0 R /XYZ 71.731 315.9312 null] +>> endobj +2681 0 obj << +/D [2650 0 R /XYZ 129.5143 296.8527 null] +>> endobj +667 0 obj << +/D [2650 0 R /XYZ 71.731 290.4318 null] +>> endobj +186 0 obj << +/D [2650 0 R /XYZ 247.7568 246.617 null] +>> endobj +2682 0 obj << +/D [2650 0 R /XYZ 71.731 226.4767 null] +>> endobj +2683 0 obj << +/D [2650 0 R /XYZ 161.0655 213.7403 null] +>> endobj +2684 0 obj << +/D [2650 0 R /XYZ 71.731 201.6208 null] +>> endobj +2685 0 obj << +/D [2650 0 R /XYZ 71.731 170.5912 null] +>> endobj +2686 0 obj << +/D [2650 0 R /XYZ 168.8063 159.2447 null] +>> endobj +2687 0 obj << +/D [2650 0 R /XYZ 71.731 132.1812 null] +>> endobj +2649 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2690 0 obj << +/Length 999 +/Filter /FlateDecode +>> +stream +xÚíWKo¬6ÞçW°œ‘‚‹mŒ!»ÜÜ&JÕFQ4RMqÁ“Ae`ÄCQÿ}±ÍÓ3Ì®]T³°¾ãóù¼ÁŽ?ìpŒ8……DˆŒ8ÉñÆs>áÕÓ ÖWcÜ1èÛîæ§Gê9Š8»½C£1î;œ2:»ôÍÃ!>5¢Úº„y‚ÔúšÇ…h~¨Çû×gµùM4‡2­·î~¹ùy×ëg”£(%Iö¨%M9!Ð |IÃ[†}êp/DÔ§¼ãùû`òöòüòt§ØìY­v_Yž«]·µPÛæ 7©ÈE“•…z*÷jHQ¦BŸ“FԜü£,µ«›¸H^®ã┵7Ñ´U¡°>Ik©Û$u½oó[õÇ~‹Aw›7_Íê+«Õѝ)¹zëJñ@Yâ>ÏË-a›/‘ª#ÞÊ\Ôw½ø`I#M0 +puÒqz„[^©êu‹Ù&®â£€Q*Æ~Ç<Å0wXHQ„=jõ{rÇ0ãwˆ îáÎï‹Ó$…wBØB/!˜XõÎׁ‡‘Zò ¡-þ&<â¶9XÌF|äI rg¥j“æv–:R^M–ÄC(*d[‰å …€} ά†5(w  ‹eM˜\ÈÀÎœï?²ê=oX#µä15,Ïù”Æ=ØE•‹ud™kn߬ø4öµ˜õ¨ŽS™\ªUV…³ÑK=„1ÁkÑ;‚]Š^[^‹Þk¢wÎãLôŽyÂWGï`ÝoÓê×?—BVðy¥Ð5ð|‰ðy€BxZ1òvÁÈ=lÕÈ6½WÙÆc°[oä ¬0Y¶ h?ŽfÇ\Æ©LcÊT^ä{²ópó]ö/ñPûÇ,Õay|¶õ¤öíÉâ[Ÿ£x|VЫ²)›¿OâÚv1×môJÝÝÞ=æÉÚ¦ožòãÝóH.>²ôvè°²“|J1øû£¬>dD‚,¾¶}uRe'™å—¸Sq2æ®ûlÜó“ì>ÛjT0_ݟኳù¡>‰$“Óp'÷Ñ#Óó~&5éx¨Í+UyVü%ç1«Vý!sºfú±@7Ȏ|oiµŠª*+sóJVu9*Òÿ‡k…ÂA 7þJ…Ã.T¨¶Z¡lz¯¨P ö60áñï 1Ø¥ëøÊ3†]bzØêcÓ{ųàab&4þC ´zÄ%kÑ;‚]Š^[^‹Þk¢wÎãLôŽyt½eŸuÅbç€CËä³8zòÃZåÏR郮ÎWóëêlðyˆƒèâ7ø³üg$„T‹¢þ$I•†g?¨- +ÿÁŠÈ…endstream +endobj +2689 0 obj << +/Type /Page +/Contents 2690 0 R +/Resources 2688 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2691 0 obj << +/D [2689 0 R /XYZ 71.731 729.2652 null] +>> endobj +2692 0 obj << +/D [2689 0 R /XYZ 71.731 718.3063 null] +>> endobj +2693 0 obj << +/D [2689 0 R /XYZ 71.731 670.4852 null] +>> endobj +2694 0 obj << +/D [2689 0 R /XYZ 181.5683 658.8294 null] +>> endobj +2695 0 obj << +/D [2689 0 R /XYZ 71.731 648.7672 null] +>> endobj +2696 0 obj << +/D [2689 0 R /XYZ 71.731 617.1956 null] +>> endobj +2697 0 obj << +/D [2689 0 R /XYZ 71.731 604.2342 null] +>> endobj +2698 0 obj << +/D [2689 0 R /XYZ 71.731 602.9889 null] +>> endobj +2699 0 obj << +/D [2689 0 R /XYZ 129.5143 583.9103 null] +>> endobj +2700 0 obj << +/D [2689 0 R /XYZ 129.5143 583.9103 null] +>> endobj +2701 0 obj << +/D [2689 0 R /XYZ 71.731 582.4708 null] +>> endobj +2702 0 obj << +/D [2689 0 R /XYZ 71.731 582.4708 null] +>> endobj +2703 0 obj << +/D [2689 0 R /XYZ 139.477 565.9776 null] +>> endobj +2704 0 obj << +/D [2689 0 R /XYZ 139.477 565.9776 null] +>> endobj +2705 0 obj << +/D [2689 0 R /XYZ 76.7123 548.0448 null] +>> endobj +2706 0 obj << +/D [2689 0 R /XYZ 129.5143 530.1121 null] +>> endobj +2707 0 obj << +/D [2689 0 R /XYZ 129.5143 530.1121 null] +>> endobj +2708 0 obj << +/D [2689 0 R /XYZ 71.731 508.03 null] +>> endobj +2709 0 obj << +/D [2689 0 R /XYZ 71.731 497.1358 null] +>> endobj +2710 0 obj << +/D [2689 0 R /XYZ 71.731 495.8905 null] +>> endobj +2711 0 obj << +/D [2689 0 R /XYZ 129.5143 476.8119 null] +>> endobj +768 0 obj << +/D [2689 0 R /XYZ 71.731 470.3911 null] +>> endobj +190 0 obj << +/D [2689 0 R /XYZ 372.3613 426.5763 null] +>> endobj +2712 0 obj << +/D [2689 0 R /XYZ 71.731 403.0875 null] +>> endobj +2713 0 obj << +/D [2689 0 R /XYZ 161.0655 393.6996 null] +>> endobj +2714 0 obj << +/D [2689 0 R /XYZ 71.731 381.5801 null] +>> endobj +2715 0 obj << +/D [2689 0 R /XYZ 71.731 350.2143 null] +>> endobj +2716 0 obj << +/D [2689 0 R /XYZ 168.8063 339.204 null] +>> endobj +2717 0 obj << +/D [2689 0 R /XYZ 71.731 312.1405 null] +>> endobj +2718 0 obj << +/D [2689 0 R /XYZ 71.731 284.7079 null] +>> endobj +2719 0 obj << +/D [2689 0 R /XYZ 71.731 253.1263 null] +>> endobj +2720 0 obj << +/D [2689 0 R /XYZ 181.5683 241.4705 null] +>> endobj +2721 0 obj << +/D [2689 0 R /XYZ 71.731 231.4083 null] +>> endobj +2722 0 obj << +/D [2689 0 R /XYZ 71.731 199.8367 null] +>> endobj +2723 0 obj << +/D [2689 0 R /XYZ 71.731 186.8753 null] +>> endobj +2724 0 obj << +/D [2689 0 R /XYZ 71.731 185.63 null] +>> endobj +2725 0 obj << +/D [2689 0 R /XYZ 129.5143 166.5514 null] +>> endobj +2726 0 obj << +/D [2689 0 R /XYZ 129.5143 166.5514 null] +>> endobj +2727 0 obj << +/D [2689 0 R /XYZ 71.731 165.1119 null] +>> endobj +2728 0 obj << +/D [2689 0 R /XYZ 71.731 165.1119 null] +>> endobj +2729 0 obj << +/D [2689 0 R /XYZ 139.477 148.6187 null] +>> endobj +2730 0 obj << +/D [2689 0 R /XYZ 139.477 148.6187 null] +>> endobj +2731 0 obj << +/D [2689 0 R /XYZ 76.7123 130.6859 null] +>> endobj +2732 0 obj << +/D [2689 0 R /XYZ 129.5143 112.7532 null] +>> endobj +2733 0 obj << +/D [2689 0 R /XYZ 129.5143 112.7532 null] +>> endobj +2734 0 obj << +/D [2689 0 R /XYZ 71.731 110.5963 null] +>> endobj +2688 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2738 0 obj << +/Length 1114 +/Filter /FlateDecode +>> +stream +xÚ¥X[£6~Ÿ_Ác"5®/ø¼Mg;ÕVm5Zåm§Ñę H¹hµÿ¾lˆP«}À“ýìós3$Àð’ ÉàA#D§Ááò€ƒø¯_ˆ…ì,fç‚~Ú?üøÂp¡HPìO‹â2 $£Hq¢‚ýñëæù_+]lw”ã EæùšÆ™®~‹ÿ2>½~6‹ßuuΏåöÏý¯?ï{ûœI)02K2$ +… GÁŽbQ½(B"Ä9‘à Vˆ…LöÎÐ(;“Æ™×ÃoÞ(åcv„R¸vvÇϏnהSQEØò—9 ِG–õG‘××÷äøžïY|Ñ ¯Ö‰Û!#¬dc´ÙõhTN²Ê,rûZʪH²©_Ö²ˆ0 + ëÕ³Cí\ØMOÒŽëG»«'„¦aäµ{_Ïn——‡# ‹P(å(òƒ‘âÖ¬Zy­`GUÉÆù®J’ÂÁŠ.©äÀæTê`Ë*yì®QÉÃã’KÄɜP]‚!8‹rð—c¤pÄÛ¾èª.²òqâK—kDCØ6Ÿ¹.l&s{Øbæúì®È\GÃþ]ºcfUíOåUL=8Þ\±½íóiÎzQ’²ûÅà4Éþ޼鎩òÑÞr½ˆæ©‹"/ÚÎ Q +¹‚&ââÂV´é§¨G $˜nn.„¦5zjHÇuZY|„‹oI©Ñڗ÷”¦ù–òÍ·Îõ/yªËµ‘/I¶ÖÔë–p¢ 搙âC¡#D*T ÅDžÍŸ¶X||vWŸ ÿØ0àÑd¤G6"<š Öׇ®RõóY³¿i…' ².ôÝÎH%C˜/5F5Ó;Ôb[ô]ÑÇ$†šÚ¦èrxEÌÔêѕC~…0•½uÑ' sÜ  Ô¥¾·0%–Æ]6·l9n=v×Äí˜Ç¸uy´í㔴Í㳐(Ğ)׊ü¼Tágç»^XÀD³X؜ÌlYfÝ52yܑÙåáiȾK‘Ä’ý¿K…¡ˆÁŒ³Pn¨¹¢`QËEajtMQ˜’˜NÊ.ßubÕ‚(†˜RlA6#K[ÔÅgw…0>Se4Õï¥NÓïfùO§ƒ‰Ê Àÿz „"Âa€žOY6“²=l1e}vW¤¬‡ç:1à±ò:áÒ´sB…Ñì÷3ýÜ邱!Šú“>,ºûñÆcð_¾ù3ëendstream +endobj +2737 0 obj << +/Type /Page +/Contents 2738 0 R +/Resources 2736 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2739 0 obj << +/D [2737 0 R /XYZ 71.731 729.2652 null] +>> endobj +2740 0 obj << +/D [2737 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2741 0 obj << +/D [2737 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2742 0 obj << +/D [2737 0 R /XYZ 71.731 706.1869 null] +>> endobj +2743 0 obj << +/D [2737 0 R /XYZ 71.731 706.1869 null] +>> endobj +2744 0 obj << +/D [2737 0 R /XYZ 139.477 690.4109 null] +>> endobj +2745 0 obj << +/D [2737 0 R /XYZ 71.731 688.2541 null] +>> endobj +2746 0 obj << +/D [2737 0 R /XYZ 139.477 672.4782 null] +>> endobj +2747 0 obj << +/D [2737 0 R /XYZ 71.731 634.6202 null] +>> endobj +2748 0 obj << +/D [2737 0 R /XYZ 71.731 621.5692 null] +>> endobj +2749 0 obj << +/D [2737 0 R /XYZ 71.731 620.3239 null] +>> endobj +2750 0 obj << +/D [2737 0 R /XYZ 129.5143 601.2453 null] +>> endobj +769 0 obj << +/D [2737 0 R /XYZ 71.731 594.8244 null] +>> endobj +194 0 obj << +/D [2737 0 R /XYZ 321.0597 551.0097 null] +>> endobj +2751 0 obj << +/D [2737 0 R /XYZ 71.731 530.8693 null] +>> endobj +2752 0 obj << +/D [2737 0 R /XYZ 161.0655 518.133 null] +>> endobj +2753 0 obj << +/D [2737 0 R /XYZ 71.731 506.0135 null] +>> endobj +2754 0 obj << +/D [2737 0 R /XYZ 71.731 474.9839 null] +>> endobj +2755 0 obj << +/D [2737 0 R /XYZ 168.8063 463.6373 null] +>> endobj +2756 0 obj << +/D [2737 0 R /XYZ 71.731 436.5739 null] +>> endobj +2757 0 obj << +/D [2737 0 R /XYZ 71.731 410.3473 null] +>> endobj +2758 0 obj << +/D [2737 0 R /XYZ 71.731 377.5597 null] +>> endobj +2759 0 obj << +/D [2737 0 R /XYZ 181.5683 365.9038 null] +>> endobj +2760 0 obj << +/D [2737 0 R /XYZ 71.731 355.8417 null] +>> endobj +2761 0 obj << +/D [2737 0 R /XYZ 71.731 324.2701 null] +>> endobj +2762 0 obj << +/D [2737 0 R /XYZ 71.731 311.3087 null] +>> endobj +2763 0 obj << +/D [2737 0 R /XYZ 71.731 310.0633 null] +>> endobj +2764 0 obj << +/D [2737 0 R /XYZ 129.5143 290.9848 null] +>> endobj +2765 0 obj << +/D [2737 0 R /XYZ 129.5143 290.9848 null] +>> endobj +2766 0 obj << +/D [2737 0 R /XYZ 71.731 289.5452 null] +>> endobj +2767 0 obj << +/D [2737 0 R /XYZ 71.731 289.5452 null] +>> endobj +2768 0 obj << +/D [2737 0 R /XYZ 139.477 273.052 null] +>> endobj +2769 0 obj << +/D [2737 0 R /XYZ 139.477 273.052 null] +>> endobj +2770 0 obj << +/D [2737 0 R /XYZ 76.7123 255.1193 null] +>> endobj +2771 0 obj << +/D [2737 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2772 0 obj << +/D [2737 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2773 0 obj << +/D [2737 0 R /XYZ 71.731 235.0297 null] +>> endobj +2774 0 obj << +/D [2737 0 R /XYZ 129.5143 219.2538 null] +>> endobj +2775 0 obj << +/D [2737 0 R /XYZ 129.5143 219.2538 null] +>> endobj +2776 0 obj << +/D [2737 0 R /XYZ 71.731 217.097 null] +>> endobj +2777 0 obj << +/D [2737 0 R /XYZ 71.731 217.097 null] +>> endobj +2778 0 obj << +/D [2737 0 R /XYZ 139.477 201.321 null] +>> endobj +2779 0 obj << +/D [2737 0 R /XYZ 71.731 199.8815 null] +>> endobj +2780 0 obj << +/D [2737 0 R /XYZ 139.477 183.3883 null] +>> endobj +2781 0 obj << +/D [2737 0 R /XYZ 71.731 145.5303 null] +>> endobj +2782 0 obj << +/D [2737 0 R /XYZ 71.731 132.4793 null] +>> endobj +2783 0 obj << +/D [2737 0 R /XYZ 71.731 131.2339 null] +>> endobj +2784 0 obj << +/D [2737 0 R /XYZ 129.5143 112.1554 null] +>> endobj +770 0 obj << +/D [2737 0 R /XYZ 71.731 105.7345 null] +>> endobj +2736 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2787 0 obj << +/Length 891 +/Filter /FlateDecode +>> +stream +xÚµVÉnÛ0½û+t´ˆå"’RniÒiÚÂ|kŠ@‘蘨,¹ZøïKŠ¤,[òrh`À$¡™yoyPýÇàD-8˜Qì%ë ôÞÔ§¯dE|+ã÷…>/&Ÿî ô"1̼ÅÒ#”'„…Þ"ý5½]śZ”3S8ÅÀ¬ó,ÎEý=~5ǛùƒÙüõªH«ÙïŷɗE‡O Q¨@N’줆41òÑ@ótC +xÀyKƒ %ÇÃéÈD-n‹|y/3¡¹(QÏπƒCîùÚOΌyYÔE½ÝˆëN#T¬E´º>F€¡0j`ZÿŸ!…qS¯®Ì1Q_ž!ęx‘©úˆFØøÎxŸÍ¨’RnjYä—òyuSæ•AŽs»–e¼5ÛbiÖª.›¤®:†u,s™¿™s*Ô1sF^‹¦6Û¼HE§¡=zkÊX³s~k+[Ë1÷­Qi×j#©?ŠÔF«È³­öUUƒ”c”‘Ö±z%*繘ûÌ2³{µFþ6¢”"—fâ&ˊ¦ÓwúT(ë—&%N×2¿j>CTe,^«º* Dÿ!JWõˁA0z‹:)¿/fnQä©Æ!Ò †Ö4…gŒéc@„Gqק5äAÂ^ԐºëdŸ‡¾D#aÀA‹\÷Ëùê i}‘×2醑lJ1tÐQ  ±ñÀ:)¿/¶ ,Ò=iÏ!'v4°*ùÑ(îñÀ:­!ýÀ’èî¸GãFÅÅ4é‘èRX úÿa|Uwpñ ëژk÷ua֦ǫ@!C窷'vªzØùêÁ½¤zy©Þ>¶ñ-eÛöFâÌ8 ?¨c™»"¾=ÞÕ¬hªsÐ6²m˜¾¾:,:xÑìƒp¼†ìL"zR'òà¤Î¦aô‚,ŒØųKBŸÄ.žÈFͽM’ˆªZ6™MÍÞláSxHÔ-§Ê¡ÌMdoºxÔ­Zè¿íúñ±Hc3Ɵ‚öûÇÌD … ÷)¹ñ`@`Æè¸'œ @CÛv~¹ß>…VuÝ %úÍ·“‡6mÛÈJH;qš·7@UR]‹p6œŽæÝFn©­ÅMæf¡BÁ–ï²ÿc6è×¾Wƒ¨xD'ôžÌp>§8TÏ_u–4‡¶Gÿiæžendstream +endobj +2786 0 obj << +/Type /Page +/Contents 2787 0 R +/Resources 2785 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2788 0 obj << +/D [2786 0 R /XYZ 71.731 729.2652 null] +>> endobj +2789 0 obj << +/D [2786 0 R /XYZ 71.731 741.2204 null] +>> endobj +198 0 obj << +/D [2786 0 R /XYZ 235.3273 705.7477 null] +>> endobj +2790 0 obj << +/D [2786 0 R /XYZ 71.731 685.6073 null] +>> endobj +2791 0 obj << +/D [2786 0 R /XYZ 161.0655 672.871 null] +>> endobj +2792 0 obj << +/D [2786 0 R /XYZ 71.731 660.7515 null] +>> endobj +2793 0 obj << +/D [2786 0 R /XYZ 71.731 629.7219 null] +>> endobj +2794 0 obj << +/D [2786 0 R /XYZ 168.8063 618.3754 null] +>> endobj +2795 0 obj << +/D [2786 0 R /XYZ 71.731 606.2559 null] +>> endobj +2796 0 obj << +/D [2786 0 R /XYZ 71.731 563.2337 null] +>> endobj +2797 0 obj << +/D [2786 0 R /XYZ 181.5683 552.2234 null] +>> endobj +2798 0 obj << +/D [2786 0 R /XYZ 71.731 542.1612 null] +>> endobj +2799 0 obj << +/D [2786 0 R /XYZ 71.731 510.5896 null] +>> endobj +2800 0 obj << +/D [2786 0 R /XYZ 71.731 497.6282 null] +>> endobj +2801 0 obj << +/D [2786 0 R /XYZ 71.731 496.3829 null] +>> endobj +2802 0 obj << +/D [2786 0 R /XYZ 129.5143 477.3044 null] +>> endobj +2803 0 obj << +/D [2786 0 R /XYZ 129.5143 477.3044 null] +>> endobj +2804 0 obj << +/D [2786 0 R /XYZ 71.731 475.8648 null] +>> endobj +2805 0 obj << +/D [2786 0 R /XYZ 71.731 475.8648 null] +>> endobj +2806 0 obj << +/D [2786 0 R /XYZ 139.477 459.3716 null] +>> endobj +2807 0 obj << +/D [2786 0 R /XYZ 139.477 459.3716 null] +>> endobj +2808 0 obj << +/D [2786 0 R /XYZ 76.7123 441.4389 null] +>> endobj +2809 0 obj << +/D [2786 0 R /XYZ 129.5143 423.5061 null] +>> endobj +2810 0 obj << +/D [2786 0 R /XYZ 129.5143 423.5061 null] +>> endobj +2811 0 obj << +/D [2786 0 R /XYZ 71.731 401.424 null] +>> endobj +2812 0 obj << +/D [2786 0 R /XYZ 71.731 390.5299 null] +>> endobj +2813 0 obj << +/D [2786 0 R /XYZ 71.731 389.2845 null] +>> endobj +2814 0 obj << +/D [2786 0 R /XYZ 129.5143 370.206 null] +>> endobj +771 0 obj << +/D [2786 0 R /XYZ 71.731 363.7851 null] +>> endobj +202 0 obj << +/D [2786 0 R /XYZ 197.5229 319.9704 null] +>> endobj +2815 0 obj << +/D [2786 0 R /XYZ 71.731 296.4816 null] +>> endobj +2816 0 obj << +/D [2786 0 R /XYZ 161.0655 287.0937 null] +>> endobj +2817 0 obj << +/D [2786 0 R /XYZ 71.731 274.9742 null] +>> endobj +2818 0 obj << +/D [2786 0 R /XYZ 71.731 243.6083 null] +>> endobj +2819 0 obj << +/D [2786 0 R /XYZ 168.8063 232.598 null] +>> endobj +2820 0 obj << +/D [2786 0 R /XYZ 71.731 205.5346 null] +>> endobj +2821 0 obj << +/D [2786 0 R /XYZ 71.731 174.1687 null] +>> endobj +2822 0 obj << +/D [2786 0 R /XYZ 71.731 157.5311 null] +>> endobj +2823 0 obj << +/D [2786 0 R /XYZ 71.731 126.5951 null] +>> endobj +2824 0 obj << +/D [2786 0 R /XYZ 181.5683 114.9392 null] +>> endobj +2785 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2827 0 obj << +/Length 941 +/Filter /FlateDecode +>> +stream +xÚÍWÉnÛ0½ç+t´Šåp•rK· ]‚ 0ÐCSª-×B;°dùûMj³hI‡-r=rÞ<>GPüƒ@Ñ,&LI,/hð _]_€ƒ„¶Ao¯?pÄ$VL‹uÀcE¤æŒD¢`±ú6{»IžÊt?™¤3Fìó.O¶iù9ùi^ÝÝØÁ—´ÜìVÅüûâãÅûE_rM⃠’¬Q}š,"¤©„¡ øV‚à¦á‚ë#Ïdõ˜m_YO™”érㆇ“@^ÇŚœC7 MÎZÙµîæ gÉ>yL1óâò4$ AJJBWÞtjT؆Ué`ªšÂ1Þj†Âc²—1̘7îé³áQÍêóà‘O֏äPn<²1A¨‰` —Và¢Ü–å«G˜ùé¶Ì–I™í¶mäaŸö¬( hä¶B…mX#,«wª`g…ÅͧLÄ޸煭fõyt…å1Zwi\¡.ö´xԕŠ(ñTßlû«Ò×#ë£]ÎW»þ¼{)&$so 6äÞ +6î^OÜ)î=åqƽm¿Ó—™Oa. °ˆuζ•}?͙œ¥¦ +¼¸W+£ö¥ÌV‘ xHbÜÌNá¸OÑÖہŠ!J'ÎÀFó6l@ó6ª¹/îÍ}<kÍ;<Ái·v>,—iQ¬¹Ûä§ yÜÀPj¢#Ž§ZR¸´å‡!̝££Ù»4ÇrüÉlŠÝ™Å\ÑÙËSêÙ^ä1ªOªú~WîJœpYÏhüS] ˆ‚(>N¨"²&bd#óy ’šòæ²Ýâuÿ‚©—Ì»´Xî³'s~‡q¼“k*\eµßs «š ÉÑ£g‘X-¿Îa帿½¹½vŽ_l2·Ús–çv´LLÑ°KmÜ`eׅfç64©¦´8]HYèÐ,p\«ö™±Œym"%‡¼¬â ÅýsVØ¥§È~•ç;³£Ï©+•÷»<-¦ZâØeüí6‚á1Ð2#E¡ ( +5l´(øâN( +=þBÜáñoÚˆc¬J´mØ@QÃFÛ_Ü mD‡·èÐøÚP#Œ¸· po u¯/î÷öxøÝÛáaJûd÷6êöºˆÒÝVX&pu}Z/F»ì‰R£J7¨!¡j\ç~Ð)2÷Ix‡6‰‰}C›£û¬Á;.üòmaú¾’E¸“q\¯dø8ûë øÀ»…{endstream +endobj +2826 0 obj << +/Type /Page +/Contents 2827 0 R +/Resources 2825 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2828 0 obj << +/D [2826 0 R /XYZ 71.731 729.2652 null] +>> endobj +2829 0 obj << +/D [2826 0 R /XYZ 71.731 718.3063 null] +>> endobj +2830 0 obj << +/D [2826 0 R /XYZ 71.731 675.3674 null] +>> endobj +2831 0 obj << +/D [2826 0 R /XYZ 71.731 674.1221 null] +>> endobj +2832 0 obj << +/D [2826 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2833 0 obj << +/D [2826 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2834 0 obj << +/D [2826 0 R /XYZ 71.731 653.604 null] +>> endobj +2835 0 obj << +/D [2826 0 R /XYZ 71.731 653.604 null] +>> endobj +2836 0 obj << +/D [2826 0 R /XYZ 139.477 637.1108 null] +>> endobj +2837 0 obj << +/D [2826 0 R /XYZ 139.477 637.1108 null] +>> endobj +2838 0 obj << +/D [2826 0 R /XYZ 76.7123 619.1781 null] +>> endobj +2839 0 obj << +/D [2826 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2840 0 obj << +/D [2826 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2841 0 obj << +/D [2826 0 R /XYZ 71.731 579.1632 null] +>> endobj +2842 0 obj << +/D [2826 0 R /XYZ 71.731 568.2691 null] +>> endobj +2843 0 obj << +/D [2826 0 R /XYZ 71.731 567.0237 null] +>> endobj +2844 0 obj << +/D [2826 0 R /XYZ 129.5143 547.9452 null] +>> endobj +772 0 obj << +/D [2826 0 R /XYZ 71.731 541.5243 null] +>> endobj +206 0 obj << +/D [2826 0 R /XYZ 236.6705 497.7096 null] +>> endobj +2845 0 obj << +/D [2826 0 R /XYZ 71.731 474.2208 null] +>> endobj +2846 0 obj << +/D [2826 0 R /XYZ 161.0655 464.8329 null] +>> endobj +2847 0 obj << +/D [2826 0 R /XYZ 71.731 452.7134 null] +>> endobj +2848 0 obj << +/D [2826 0 R /XYZ 71.731 421.3475 null] +>> endobj +2849 0 obj << +/D [2826 0 R /XYZ 168.8063 410.3372 null] +>> endobj +2850 0 obj << +/D [2826 0 R /XYZ 71.731 383.2738 null] +>> endobj +2851 0 obj << +/D [2826 0 R /XYZ 71.731 351.9079 null] +>> endobj +2852 0 obj << +/D [2826 0 R /XYZ 71.731 335.2703 null] +>> endobj +2853 0 obj << +/D [2826 0 R /XYZ 71.731 304.3343 null] +>> endobj +2854 0 obj << +/D [2826 0 R /XYZ 181.5683 292.6784 null] +>> endobj +2855 0 obj << +/D [2826 0 R /XYZ 71.731 282.6163 null] +>> endobj +2856 0 obj << +/D [2826 0 R /XYZ 71.731 251.0447 null] +>> endobj +2857 0 obj << +/D [2826 0 R /XYZ 71.731 238.0833 null] +>> endobj +2858 0 obj << +/D [2826 0 R /XYZ 71.731 236.8379 null] +>> endobj +2859 0 obj << +/D [2826 0 R /XYZ 129.5143 217.7594 null] +>> endobj +2860 0 obj << +/D [2826 0 R /XYZ 129.5143 217.7594 null] +>> endobj +2861 0 obj << +/D [2826 0 R /XYZ 71.731 216.3198 null] +>> endobj +2862 0 obj << +/D [2826 0 R /XYZ 71.731 216.3198 null] +>> endobj +2863 0 obj << +/D [2826 0 R /XYZ 139.477 199.8266 null] +>> endobj +2864 0 obj << +/D [2826 0 R /XYZ 139.477 199.8266 null] +>> endobj +2865 0 obj << +/D [2826 0 R /XYZ 76.7123 181.8939 null] +>> endobj +2866 0 obj << +/D [2826 0 R /XYZ 129.5143 163.9611 null] +>> endobj +2867 0 obj << +/D [2826 0 R /XYZ 129.5143 163.9611 null] +>> endobj +2868 0 obj << +/D [2826 0 R /XYZ 71.731 141.879 null] +>> endobj +2869 0 obj << +/D [2826 0 R /XYZ 71.731 130.9849 null] +>> endobj +2870 0 obj << +/D [2826 0 R /XYZ 71.731 129.7396 null] +>> endobj +2871 0 obj << +/D [2826 0 R /XYZ 129.5143 110.661 null] +>> endobj +773 0 obj << +/D [2826 0 R /XYZ 71.731 104.2401 null] +>> endobj +2825 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2874 0 obj << +/Length 830 +/Filter /FlateDecode +>> +stream +xÚÅV]o›0}ϯà1HÅó¶qß²u«:­UTEÚÃ:MŒ8 Eû÷³cC @’‡MS¥ʽ÷ß#ê?äq8Ñ 3Š½d;ÞZzœ g8› mô~1y÷‰@OÁ0ó+(=N0ˆ(Š¼ÅòÛôÃ&Þ)Yú¦pŠ]çYœKõ%þi_gó'ûð,Õ¦XVþ÷ÅçÉÇEƒO "Ò I6V}šyˆŒhhxÖ;† Äő&!5äx4}™TòYVUì#8]ûþ•†“$Zû 9ˆ0ä^`öË?š—…*Ôo<"íÁŽÈÎ7À0YäÜZZÞ …ñ^mîìëÖ~û‘.õ4@$¨ã¶‰<È*)ӝJ‹ü¢ÏŒá6•Ê¢Æpû¢äv—ÅJP« áìèý*վ̝7²Kº²kµOhµÏܞVFÚxŸ)g_¨,ieCß²¿Y–>¦Óƒ\Ú¯E&«[U—Û4¿jî#:Ëx«Õ)-D;=€RĽrÀCAÓ³± +Úf6=…§S—Cdô£ +oÓ.ƀ„➯'µWŸ‰Zª!]D…¤Ëäå€l8Ð “{wäªÜ'êî¬Â¿ÌUšÄ&1ۖûRö7XS DˆÑaak« mv™bïl¨6V>ġĶöêóè +«¿†œwiÌ´.¶û ¨Ku•…º±žë›æëZßY·6œ-Ü®ûJŽg/$@Pt-yOV—r×Y]OÝ>è-™{Fb$q[$N=tT_zAßN{N—Fê7±žk¦L@Z‚N×pýp¼] +£P\Q¼mvAòÆìªæC¸7ˆ>Äã¤a£z‡Gš×`t ¸óèLèÀ´œˆè’ÖÁ0¡¬žÑ¬3£_¤:øXò×híüÍ!}ÄCm¼¡që9ñu~"×®ÿfT¨n7Gÿ¯>Ò²Í^_ž^]º/6©‹wH³Ì>%±é¶lÜÃÒ@7=¦pÇ×.=:di§}R3V›Xú‘ûW FûÝ0څáîƒadÚ±¸xnÙôï¿Gz + +ÑD2œC> endobj +2875 0 obj << +/D [2873 0 R /XYZ 71.731 729.2652 null] +>> endobj +210 0 obj << +/D [2873 0 R /XYZ 239.1835 706.1179 null] +>> endobj +2876 0 obj << +/D [2873 0 R /XYZ 71.731 682.3623 null] +>> endobj +2877 0 obj << +/D [2873 0 R /XYZ 161.0655 673.2412 null] +>> endobj +2878 0 obj << +/D [2873 0 R /XYZ 71.731 661.1217 null] +>> endobj +2879 0 obj << +/D [2873 0 R /XYZ 71.731 629.7558 null] +>> endobj +2880 0 obj << +/D [2873 0 R /XYZ 168.8063 618.7455 null] +>> endobj +2881 0 obj << +/D [2873 0 R /XYZ 71.731 591.6821 null] +>> endobj +2882 0 obj << +/D [2873 0 R /XYZ 71.731 575.2602 null] +>> endobj +2883 0 obj << +/D [2873 0 R /XYZ 71.731 544.3242 null] +>> endobj +2884 0 obj << +/D [2873 0 R /XYZ 181.5683 532.6683 null] +>> endobj +2885 0 obj << +/D [2873 0 R /XYZ 71.731 522.6062 null] +>> endobj +2886 0 obj << +/D [2873 0 R /XYZ 71.731 491.0346 null] +>> endobj +2887 0 obj << +/D [2873 0 R /XYZ 71.731 478.0732 null] +>> endobj +2888 0 obj << +/D [2873 0 R /XYZ 71.731 476.8278 null] +>> endobj +2889 0 obj << +/D [2873 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2890 0 obj << +/D [2873 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2891 0 obj << +/D [2873 0 R /XYZ 71.731 456.3097 null] +>> endobj +2892 0 obj << +/D [2873 0 R /XYZ 71.731 456.3097 null] +>> endobj +2893 0 obj << +/D [2873 0 R /XYZ 139.477 439.8165 null] +>> endobj +2894 0 obj << +/D [2873 0 R /XYZ 139.477 439.8165 null] +>> endobj +2895 0 obj << +/D [2873 0 R /XYZ 76.7123 421.8838 null] +>> endobj +2896 0 obj << +/D [2873 0 R /XYZ 129.5143 403.951 null] +>> endobj +2897 0 obj << +/D [2873 0 R /XYZ 129.5143 403.951 null] +>> endobj +2898 0 obj << +/D [2873 0 R /XYZ 71.731 381.8689 null] +>> endobj +2899 0 obj << +/D [2873 0 R /XYZ 71.731 370.9748 null] +>> endobj +2900 0 obj << +/D [2873 0 R /XYZ 71.731 369.7295 null] +>> endobj +2901 0 obj << +/D [2873 0 R /XYZ 129.5143 350.6509 null] +>> endobj +774 0 obj << +/D [2873 0 R /XYZ 71.731 344.23 null] +>> endobj +214 0 obj << +/D [2873 0 R /XYZ 295.2367 300.4153 null] +>> endobj +2902 0 obj << +/D [2873 0 R /XYZ 71.731 280.2749 null] +>> endobj +2903 0 obj << +/D [2873 0 R /XYZ 161.0655 267.5386 null] +>> endobj +2904 0 obj << +/D [2873 0 R /XYZ 71.731 255.4191 null] +>> endobj +2905 0 obj << +/D [2873 0 R /XYZ 71.731 224.3895 null] +>> endobj +2906 0 obj << +/D [2873 0 R /XYZ 168.8063 213.0429 null] +>> endobj +2907 0 obj << +/D [2873 0 R /XYZ 71.731 185.9795 null] +>> endobj +2908 0 obj << +/D [2873 0 R /XYZ 71.731 156.4652 null] +>> endobj +2909 0 obj << +/D [2873 0 R /XYZ 71.731 139.8276 null] +>> endobj +2872 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2912 0 obj << +/Length 878 +/Filter /FlateDecode +>> +stream +xÚÍWM›0½çWpL¤ÆõÆ°·´Û®¶jW«U¤º=PB6¨$¬ÀQÔß16ĨT©Õ ì¿ç7ãa †?⠂ƒ  8õ’ý {/ð¯»1¥Á,mлõìíG†½E ¼õÖcQ€¸ð=Á( +9 ½õæÛüý.~•i¹XRŽçéëcRù9þ¡®ïõ͗TîŠMµø¾þ4û°nù9( +dPd‹êˤ‘%“qN„'pˆ˜ÏD­s•çłòù)Ýh-OEžV7JJB|à«x³Ò’0ª£ãÍ>;´Ø3ײ+KD ©„Ïã2Þ§`Œ¦°wÛê C>õçn[Ô҆5»'&Ý¶0%á™RÞã¥ì ÔÉ{y=ëh¢ú:Xh¹F 'œø¬«#>ʝÃ6ê#¬äF§£’å1‘o. +Fŧ™%±ÌŠƒ<–iƒ‘‘ÈmlƒZÚ°³±D„ΆØUc!ù˜ú‘“÷º±MT_G×X!_ˆ®Œø¢“Ã] À‡széovxiüuغ×ËÕ÷²Ð×c•^­^."„þHõÚ°êma£ÕëâP½=îêíè8Àž\½gwRyZ»úç ü Œ_endstream +endobj +2911 0 obj << +/Type /Page +/Contents 2912 0 R +/Resources 2910 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2913 0 obj << +/D [2911 0 R /XYZ 71.731 729.2652 null] +>> endobj +776 0 obj << +/D [2911 0 R /XYZ 71.731 741.2204 null] +>> endobj +2914 0 obj << +/D [2911 0 R /XYZ 71.731 718.3063 null] +>> endobj +2915 0 obj << +/D [2911 0 R /XYZ 181.5683 708.3437 null] +>> endobj +2916 0 obj << +/D [2911 0 R /XYZ 71.731 698.2815 null] +>> endobj +2917 0 obj << +/D [2911 0 R /XYZ 71.731 666.7099 null] +>> endobj +2918 0 obj << +/D [2911 0 R /XYZ 71.731 653.7485 null] +>> endobj +2919 0 obj << +/D [2911 0 R /XYZ 71.731 652.5032 null] +>> endobj +2920 0 obj << +/D [2911 0 R /XYZ 129.5143 633.4246 null] +>> endobj +2921 0 obj << +/D [2911 0 R /XYZ 129.5143 633.4246 null] +>> endobj +2922 0 obj << +/D [2911 0 R /XYZ 71.731 631.9851 null] +>> endobj +2923 0 obj << +/D [2911 0 R /XYZ 71.731 631.9851 null] +>> endobj +2924 0 obj << +/D [2911 0 R /XYZ 139.477 615.4919 null] +>> endobj +2925 0 obj << +/D [2911 0 R /XYZ 139.477 615.4919 null] +>> endobj +2926 0 obj << +/D [2911 0 R /XYZ 76.7123 597.5591 null] +>> endobj +2927 0 obj << +/D [2911 0 R /XYZ 129.5143 579.6264 null] +>> endobj +2928 0 obj << +/D [2911 0 R /XYZ 129.5143 579.6264 null] +>> endobj +2929 0 obj << +/D [2911 0 R /XYZ 71.731 557.5443 null] +>> endobj +2930 0 obj << +/D [2911 0 R /XYZ 71.731 546.6501 null] +>> endobj +2931 0 obj << +/D [2911 0 R /XYZ 71.731 545.4048 null] +>> endobj +2932 0 obj << +/D [2911 0 R /XYZ 129.5143 526.3263 null] +>> endobj +775 0 obj << +/D [2911 0 R /XYZ 71.731 519.9054 null] +>> endobj +218 0 obj << +/D [2911 0 R /XYZ 273.1838 476.0906 null] +>> endobj +2933 0 obj << +/D [2911 0 R /XYZ 71.731 452.6019 null] +>> endobj +2934 0 obj << +/D [2911 0 R /XYZ 161.0655 443.2139 null] +>> endobj +2935 0 obj << +/D [2911 0 R /XYZ 71.731 431.0945 null] +>> endobj +2936 0 obj << +/D [2911 0 R /XYZ 71.731 399.7286 null] +>> endobj +2937 0 obj << +/D [2911 0 R /XYZ 168.8063 388.7183 null] +>> endobj +2938 0 obj << +/D [2911 0 R /XYZ 71.731 361.6549 null] +>> endobj +2939 0 obj << +/D [2911 0 R /XYZ 71.731 330.289 null] +>> endobj +2940 0 obj << +/D [2911 0 R /XYZ 71.731 313.6514 null] +>> endobj +2941 0 obj << +/D [2911 0 R /XYZ 71.731 282.7154 null] +>> endobj +2942 0 obj << +/D [2911 0 R /XYZ 181.5683 271.0595 null] +>> endobj +2943 0 obj << +/D [2911 0 R /XYZ 71.731 260.9973 null] +>> endobj +2944 0 obj << +/D [2911 0 R /XYZ 71.731 229.4257 null] +>> endobj +2945 0 obj << +/D [2911 0 R /XYZ 71.731 216.4643 null] +>> endobj +2946 0 obj << +/D [2911 0 R /XYZ 71.731 215.219 null] +>> endobj +2947 0 obj << +/D [2911 0 R /XYZ 129.5143 196.1405 null] +>> endobj +2948 0 obj << +/D [2911 0 R /XYZ 129.5143 196.1405 null] +>> endobj +2949 0 obj << +/D [2911 0 R /XYZ 71.731 194.7009 null] +>> endobj +2950 0 obj << +/D [2911 0 R /XYZ 71.731 194.7009 null] +>> endobj +2951 0 obj << +/D [2911 0 R /XYZ 139.477 178.2077 null] +>> endobj +2952 0 obj << +/D [2911 0 R /XYZ 139.477 178.2077 null] +>> endobj +2953 0 obj << +/D [2911 0 R /XYZ 76.7123 160.275 null] +>> endobj +2954 0 obj << +/D [2911 0 R /XYZ 129.5143 142.3422 null] +>> endobj +2955 0 obj << +/D [2911 0 R /XYZ 129.5143 142.3422 null] +>> endobj +2956 0 obj << +/D [2911 0 R /XYZ 71.731 120.2601 null] +>> endobj +2957 0 obj << +/D [2911 0 R /XYZ 71.731 109.366 null] +>> endobj +2958 0 obj << +/D [2911 0 R /XYZ 71.731 108.1206 null] +>> endobj +2910 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2961 0 obj << +/Length 996 +/Filter /FlateDecode +>> +stream +xÚ¥W[oÛ6}ϯУ T¯"Ù·´]Š ]~[†@µéX€,yº´è¿ßGS’)›– "%:äwxx/$ÂðC"Idð ÑDÐh{|ÀÑ|úü@:HÜabôaóðÛÑF:¡I´ÙGL'HHIF‘DE›Ýß«‡ôԘjSW¹çsž¦ù’~w>>ÿá^þ2Í¡ÜÕë6>ü¾ê &‘VPd’$' +q†uSŒ4%"ˆ"D#!ˆ„Á`…gr Õԑ˜ØÁ ¸fGóB©¸fG(¡‘ßa_÷úyáÑ· +ò¸ˆJ`Ȃp6æ‘Í;'qlïžu»ÝšºÞ·¹¥ }?‰@ n;‹…DR1/Q&’sgqe'FªÕ'“›Æ|-wæ©ZS¼*öý³{oO]Ÿ>?.‘¢䴓.Gï¹*›²ùu2ï‡ +Z$g]ۘ”¥Ï üº}M[ï<¦,pÚ6‡nÄ|}Ív¯eõz(ë¦HÆû²&bõfÛvû: êqÏħþÉÔÛ*;5YYL‘g`õ„:òß̱´eØ_¦v\RÒùmsoÍ¡ûW}2Ûìcjv×èó%v‰I‚&“®ZÓVE=3û"û5*mÞtøjW?³Ú ¥z<æy¹¦bõ³çø­ÌM½t^ÓÝ1+––z¶ú¥L,®Ä(g}"9Ö°é¹|û°‰|°Ù|‡ê.È÷ ¦<Ն|xX»d£a[ÁBÞwSÞTí¶_ †…Ô¶7E“mSkdÙVæv€¦ R8‘aa{TìÃ.»Cø`w……Éǔë`ÝûÂö­nyŒ…eq)Ç4A·ÉԐ2û×µ¾YñÖëõèºsÉ.ݳ­Í]÷2!¶Æ˜v¯›pï›uo¨î÷Þð»wÄ#°Bä&˜#‰%ë ;[·TUþÜ÷,Sc%æ<ëÁ¦<ÛÃæ=¨»Ä³ž$½g}—½þë°=d;kÃóÖQݗÎAXŠÙ8{°)izؼ4ºK¤ ðHãÓ…ó©Íó_îõß6ÍG«oÃ`*©âpJÂs©ôa©`³© Õ]ÊáTŽxØT^ŸŒB±$ °’äÿŒ& ¢Óiïù° ï °Yï…ê.ð^ˆÇ­÷F4B±|»Z%”r{¦çs õaS*õ°y•u—¨àPɧ1JhP¨Þ†Pú¢Â]NîNBÝq÷þiH‚Àms:¹>l"¹l6¹¡º ’â¸íx,¼íù4»;L…"‰ž¼Ô{˜Û;½ °­‡ž,ÎïÞÐÿW{³Üendstream +endobj +2960 0 obj << +/Type /Page +/Contents 2961 0 R +/Resources 2959 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +2962 0 obj << +/D [2960 0 R /XYZ 71.731 729.2652 null] +>> endobj +2963 0 obj << +/D [2960 0 R /XYZ 71.731 741.2204 null] +>> endobj +2964 0 obj << +/D [2960 0 R /XYZ 129.5143 708.3437 null] +>> endobj +222 0 obj << +/D [2960 0 R /XYZ 346.5386 658.1081 null] +>> endobj +2965 0 obj << +/D [2960 0 R /XYZ 71.731 634.6193 null] +>> endobj +2966 0 obj << +/D [2960 0 R /XYZ 161.0655 625.2314 null] +>> endobj +2967 0 obj << +/D [2960 0 R /XYZ 71.731 613.1119 null] +>> endobj +2968 0 obj << +/D [2960 0 R /XYZ 71.731 581.746 null] +>> endobj +2969 0 obj << +/D [2960 0 R /XYZ 168.8063 570.7357 null] +>> endobj +2970 0 obj << +/D [2960 0 R /XYZ 71.731 543.6723 null] +>> endobj +2971 0 obj << +/D [2960 0 R /XYZ 71.731 527.2504 null] +>> endobj +2972 0 obj << +/D [2960 0 R /XYZ 71.731 496.3144 null] +>> endobj +2973 0 obj << +/D [2960 0 R /XYZ 181.5683 484.6585 null] +>> endobj +2974 0 obj << +/D [2960 0 R /XYZ 71.731 474.5963 null] +>> endobj +2975 0 obj << +/D [2960 0 R /XYZ 71.731 443.0247 null] +>> endobj +2976 0 obj << +/D [2960 0 R /XYZ 71.731 430.0633 null] +>> endobj +2977 0 obj << +/D [2960 0 R /XYZ 71.731 428.818 null] +>> endobj +2978 0 obj << +/D [2960 0 R /XYZ 129.5143 409.7395 null] +>> endobj +2979 0 obj << +/D [2960 0 R /XYZ 129.5143 409.7395 null] +>> endobj +2980 0 obj << +/D [2960 0 R /XYZ 71.731 408.2999 null] +>> endobj +2981 0 obj << +/D [2960 0 R /XYZ 71.731 408.2999 null] +>> endobj +2982 0 obj << +/D [2960 0 R /XYZ 139.477 391.8067 null] +>> endobj +2983 0 obj << +/D [2960 0 R /XYZ 139.477 391.8067 null] +>> endobj +2984 0 obj << +/D [2960 0 R /XYZ 76.7123 373.874 null] +>> endobj +2985 0 obj << +/D [2960 0 R /XYZ 129.5143 355.9412 null] +>> endobj +2986 0 obj << +/D [2960 0 R /XYZ 129.5143 355.9412 null] +>> endobj +2987 0 obj << +/D [2960 0 R /XYZ 71.731 353.7844 null] +>> endobj +2988 0 obj << +/D [2960 0 R /XYZ 71.731 353.7844 null] +>> endobj +2989 0 obj << +/D [2960 0 R /XYZ 139.477 338.0085 null] +>> endobj +2990 0 obj << +/D [2960 0 R /XYZ 71.731 336.5689 null] +>> endobj +2991 0 obj << +/D [2960 0 R /XYZ 139.477 320.0757 null] +>> endobj +2992 0 obj << +/D [2960 0 R /XYZ 76.7123 302.1429 null] +>> endobj +2993 0 obj << +/D [2960 0 R /XYZ 129.5143 284.2102 null] +>> endobj +2994 0 obj << +/D [2960 0 R /XYZ 129.5143 284.2102 null] +>> endobj +2995 0 obj << +/D [2960 0 R /XYZ 71.731 282.0534 null] +>> endobj +2996 0 obj << +/D [2960 0 R /XYZ 71.731 282.0534 null] +>> endobj +2997 0 obj << +/D [2960 0 R /XYZ 139.477 266.2774 null] +>> endobj +2998 0 obj << +/D [2960 0 R /XYZ 71.731 264.1206 null] +>> endobj +2999 0 obj << +/D [2960 0 R /XYZ 139.477 248.3447 null] +>> endobj +3000 0 obj << +/D [2960 0 R /XYZ 71.731 210.4867 null] +>> endobj +3001 0 obj << +/D [2960 0 R /XYZ 71.731 197.4357 null] +>> endobj +3002 0 obj << +/D [2960 0 R /XYZ 71.731 196.1904 null] +>> endobj +3003 0 obj << +/D [2960 0 R /XYZ 129.5143 177.1118 null] +>> endobj +777 0 obj << +/D [2960 0 R /XYZ 71.731 170.6909 null] +>> endobj +2959 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3007 0 obj << +/Length 956 +/Filter /FlateDecode +>> +stream +xÚ½WM£8¼÷¯à˜HÇã¹õ|tkW»­h”9M¯ZlâtdÁh4ÿ~ŸcC›Ä„H+­r€ˆ²«\~e$Âð#‘ H0¸P‰hÊi´9Üáè =݉&öAŸÖwŽ$’)M£õ.b2E\$‘`eœdÑzûcñyŸµj–1åxA‘½®Ê¼Rúüoû÷aõ›½ùSé}½m—­¿ûºø9Hf@rU䀺”IID¢„'Fg¿b̑H„8ɤ(‘FœÈ_T©´z®·ê±YR¼¨«Ïߍ$˜GzËMÊ(Ql–+R;Ϫ©u­ÕÇaD#Ò±S‚R’ÉӟÍ2œxÁçÞßÛ¿<-¶¯uóº¯[]ååž7<8 HŒ{F_âÕnšâ¨‹ºº&’Áf¦ÔÙZÆü]’½ÛðÑ#X23þČ ž‘ô4Ís]ÅùöPTn¦CþËÞÔUéîºã6×j˜¦§Ôöª÷ªp¥Ô h`!)J™°,ߔ‚ØK±s£ºÍFµí®+}»%é»R;| ÍÏ¢UèV;ʲ^R¾ø©¶vŠou©Ú[·ÿdG¿•…»Ñj³¿•~µ$|‘7P2KëG‡‰8'"J(T»<û0A¬&FÁålF ¥ü‚—RÄBƒ¼ç×wý¨K,óœ$pN6Öaò°&ùèÊ@7ÝFߟ>f¼ªt±ÉM6|dרËö0œi’…íQ±{7–˜ƒh´ 6i,l>¦‰ òNۏºÔ16–IdŽÄ‘ŒðŞÌw9$/CÿÜߢzëý Øz°ÓÙj¯]ô[5Y½ Îl)%›©^v¥zØlõ†xo¨Þ áêéñ» NÀ‚ý.*w@֍¿“5Ë8d"MùLÍú°+5;Àfk6Ä{C͆tx–¸šÉG\ù=ï©bkÊðc +ýȤ5ðÞ#ŒÍÅه]³¦‡Í[à½Åš€Ž€5¾ŒQ8»²õþÓå¥uÇÓ/Ãp*1†>+›M¥»–Ê6ŸÊï-©<×1‘J_‡m¯AdšÑ‹Þ½K¸èàæKœ_ã®i™~Ó$îŒÌxíîx=Àf½ñÞàuH‡W—½×#ïîMvmn#Fí|̃PrØ8ÆS×Ðÿó†þÉ6ôÝñhçŸÃ3ÙÌ¿™Çî¼7!û/¼¿qîã&ÉtÝòêל‡¹ü˜ã4ƒ¶IÊa&CœðÉO³á¿üQ*endstream +endobj +3006 0 obj << +/Type /Page +/Contents 3007 0 R +/Resources 3005 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3008 0 obj << +/D [3006 0 R /XYZ 71.731 729.2652 null] +>> endobj +3009 0 obj << +/D [3006 0 R /XYZ 71.731 741.2204 null] +>> endobj +226 0 obj << +/D [3006 0 R /XYZ 288.5401 705.7477 null] +>> endobj +3010 0 obj << +/D [3006 0 R /XYZ 71.731 685.6073 null] +>> endobj +3011 0 obj << +/D [3006 0 R /XYZ 161.0655 672.871 null] +>> endobj +3012 0 obj << +/D [3006 0 R /XYZ 71.731 660.7515 null] +>> endobj +3013 0 obj << +/D [3006 0 R /XYZ 71.731 561.7976 null] +>> endobj +3014 0 obj << +/D [3006 0 R /XYZ 71.731 543.3084 null] +>> endobj +3015 0 obj << +/D [3006 0 R /XYZ 71.731 512.3724 null] +>> endobj +3016 0 obj << +/D [3006 0 R /XYZ 181.5683 500.7166 null] +>> endobj +3017 0 obj << +/D [3006 0 R /XYZ 71.731 490.6544 null] +>> endobj +3018 0 obj << +/D [3006 0 R /XYZ 71.731 457.2312 null] +>> endobj +3019 0 obj << +/D [3006 0 R /XYZ 71.731 446.1214 null] +>> endobj +3020 0 obj << +/D [3006 0 R /XYZ 71.731 444.8761 null] +>> endobj +3021 0 obj << +/D [3006 0 R /XYZ 129.5143 425.7975 null] +>> endobj +3022 0 obj << +/D [3006 0 R /XYZ 129.5143 425.7975 null] +>> endobj +3023 0 obj << +/D [3006 0 R /XYZ 71.731 424.358 null] +>> endobj +3024 0 obj << +/D [3006 0 R /XYZ 71.731 424.358 null] +>> endobj +3025 0 obj << +/D [3006 0 R /XYZ 139.477 407.8648 null] +>> endobj +3026 0 obj << +/D [3006 0 R /XYZ 139.477 407.8648 null] +>> endobj +3027 0 obj << +/D [3006 0 R /XYZ 76.7123 389.932 null] +>> endobj +3028 0 obj << +/D [3006 0 R /XYZ 129.5143 371.9993 null] +>> endobj +3029 0 obj << +/D [3006 0 R /XYZ 129.5143 371.9993 null] +>> endobj +3030 0 obj << +/D [3006 0 R /XYZ 71.731 369.8424 null] +>> endobj +3031 0 obj << +/D [3006 0 R /XYZ 71.731 369.8424 null] +>> endobj +3032 0 obj << +/D [3006 0 R /XYZ 139.477 354.0665 null] +>> endobj +3033 0 obj << +/D [3006 0 R /XYZ 71.731 352.627 null] +>> endobj +3034 0 obj << +/D [3006 0 R /XYZ 139.477 336.1338 null] +>> endobj +3035 0 obj << +/D [3006 0 R /XYZ 76.7123 318.201 null] +>> endobj +3036 0 obj << +/D [3006 0 R /XYZ 129.5143 300.2683 null] +>> endobj +3037 0 obj << +/D [3006 0 R /XYZ 129.5143 300.2683 null] +>> endobj +3038 0 obj << +/D [3006 0 R /XYZ 71.731 278.9034 null] +>> endobj +3039 0 obj << +/D [3006 0 R /XYZ 71.731 267.292 null] +>> endobj +3040 0 obj << +/D [3006 0 R /XYZ 71.731 266.0467 null] +>> endobj +3041 0 obj << +/D [3006 0 R /XYZ 129.5143 246.9681 null] +>> endobj +778 0 obj << +/D [3006 0 R /XYZ 71.731 240.5473 null] +>> endobj +230 0 obj << +/D [3006 0 R /XYZ 260.8062 196.7325 null] +>> endobj +3042 0 obj << +/D [3006 0 R /XYZ 71.731 173.2437 null] +>> endobj +3043 0 obj << +/D [3006 0 R /XYZ 161.0655 163.8558 null] +>> endobj +3044 0 obj << +/D [3006 0 R /XYZ 71.731 151.7363 null] +>> endobj +3045 0 obj << +/D [3006 0 R /XYZ 71.731 120.3704 null] +>> endobj +3046 0 obj << +/D [3006 0 R /XYZ 168.8063 109.3602 null] +>> endobj +3005 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3049 0 obj << +/Length 948 +/Filter /FlateDecode +>> +stream +xÚÝWKoÛ8¾çWè—ñ¡ÞÒv·è¢[…o›E ÊL,¬-…´ÿ~‡¢Þ¢-cET¬3¿™áŒH€á’ É`¡1¢‚Ó =Ýáà^}º#-$l1áô~w÷Û 1ŠÁî%`±@\Fd)NT°Ûÿ}ÿᐜ.7!åøž"·>“\›/Éw÷ïÃãg÷ð—6‡b_mþÙýy÷û®÷ϙD±'WIö¨%M +hŠÈÒ$𖓈+Ä"&žõQíh$¹[õ†ðûYe²üÕýòµØ·˜OeQŸ‘e +ÞCFWD4–²¼rSòÓ=짶Áhû"ïͽZs5"`ÒYû¦M]v‰[²·Vušêªz©[÷Ȁ‡úhZ|aº|Ë*Ýmt¶¡ —N†‡ã±ØP~ÿ¦÷Îķ⨫wýöAÆn7%H7»“ý)Ëouõh…HÊäڔÎÅ8è„@˜8‘ç1ª”7è=*ú CBHLš /¬Y +O”ò…_ +€ˆP¯ßù:ðèv-y0åK¾ ¤6l4BØz°wmÈMY§f;«»_ç&K“ùY—zyÀŽ‹Ô¬_׎Pƒ¬Ä^“ã´¨‹ªBä1bŸÓË¢v›$¦š²ERN8<€"î6ñèÊ¡¾"¸¨æÊB™wÊz=9sͳ)ÜZWúbÞF±Bœa¾’·cؕ¼ía«yëó{CÞ.xøóvÂÃÞ_ÏÍÕõœíŸ‹ò9‡jöNG‘ñTñ,7í5UŽCp1_#…¥ZIØ1ìJÆö°Õ”õù½!g}> endobj +3050 0 obj << +/D [3048 0 R /XYZ 71.731 729.2652 null] +>> endobj +3051 0 obj << +/D [3048 0 R /XYZ 71.731 718.3063 null] +>> endobj +3052 0 obj << +/D [3048 0 R /XYZ 71.731 669.8397 null] +>> endobj +3053 0 obj << +/D [3048 0 R /XYZ 71.731 638.9037 null] +>> endobj +3054 0 obj << +/D [3048 0 R /XYZ 181.5683 627.2478 null] +>> endobj +3055 0 obj << +/D [3048 0 R /XYZ 71.731 617.1856 null] +>> endobj +3056 0 obj << +/D [3048 0 R /XYZ 71.731 585.614 null] +>> endobj +3057 0 obj << +/D [3048 0 R /XYZ 71.731 572.6526 null] +>> endobj +3058 0 obj << +/D [3048 0 R /XYZ 71.731 571.4073 null] +>> endobj +3059 0 obj << +/D [3048 0 R /XYZ 129.5143 552.3288 null] +>> endobj +3060 0 obj << +/D [3048 0 R /XYZ 129.5143 552.3288 null] +>> endobj +3061 0 obj << +/D [3048 0 R /XYZ 71.731 550.8892 null] +>> endobj +3062 0 obj << +/D [3048 0 R /XYZ 71.731 550.8892 null] +>> endobj +3063 0 obj << +/D [3048 0 R /XYZ 139.477 534.396 null] +>> endobj +3064 0 obj << +/D [3048 0 R /XYZ 139.477 534.396 null] +>> endobj +3065 0 obj << +/D [3048 0 R /XYZ 76.7123 516.4633 null] +>> endobj +3066 0 obj << +/D [3048 0 R /XYZ 129.5143 498.5305 null] +>> endobj +3067 0 obj << +/D [3048 0 R /XYZ 129.5143 498.5305 null] +>> endobj +3068 0 obj << +/D [3048 0 R /XYZ 71.731 496.3737 null] +>> endobj +3069 0 obj << +/D [3048 0 R /XYZ 71.731 496.3737 null] +>> endobj +3070 0 obj << +/D [3048 0 R /XYZ 139.477 480.5978 null] +>> endobj +3071 0 obj << +/D [3048 0 R /XYZ 71.731 478.4409 null] +>> endobj +3072 0 obj << +/D [3048 0 R /XYZ 139.477 462.665 null] +>> endobj +3073 0 obj << +/D [3048 0 R /XYZ 71.731 424.807 null] +>> endobj +3074 0 obj << +/D [3048 0 R /XYZ 71.731 411.756 null] +>> endobj +3075 0 obj << +/D [3048 0 R /XYZ 71.731 410.5107 null] +>> endobj +3076 0 obj << +/D [3048 0 R /XYZ 129.5143 391.4321 null] +>> endobj +779 0 obj << +/D [3048 0 R /XYZ 71.731 385.0113 null] +>> endobj +234 0 obj << +/D [3048 0 R /XYZ 277.0745 341.1965 null] +>> endobj +3077 0 obj << +/D [3048 0 R /XYZ 71.731 321.0561 null] +>> endobj +3078 0 obj << +/D [3048 0 R /XYZ 161.0655 308.3198 null] +>> endobj +3079 0 obj << +/D [3048 0 R /XYZ 71.731 296.2003 null] +>> endobj +3080 0 obj << +/D [3048 0 R /XYZ 71.731 265.1707 null] +>> endobj +3081 0 obj << +/D [3048 0 R /XYZ 168.8063 253.8241 null] +>> endobj +3082 0 obj << +/D [3048 0 R /XYZ 71.731 226.7607 null] +>> endobj +3083 0 obj << +/D [3048 0 R /XYZ 71.731 195.3948 null] +>> endobj +3084 0 obj << +/D [3048 0 R /XYZ 71.731 168.9525 null] +>> endobj +3085 0 obj << +/D [3048 0 R /XYZ 71.731 136.1649 null] +>> endobj +3086 0 obj << +/D [3048 0 R /XYZ 181.5683 124.5091 null] +>> endobj +3087 0 obj << +/D [3048 0 R /XYZ 71.731 114.4469 null] +>> endobj +3047 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3090 0 obj << +/Length 1015 +/Filter /FlateDecode +>> +stream +xÚÍXMoã6½çWèh+–â‡rË~b‹na,|kŠ@µ™µ°²”J2ÒüûŽDJ¢,ZÒ­Er”Ç™Ç7Ã‰I€á‡’ ÉàAcD§Áá|‡ƒð§/wÄBB‹ ]ÐûýÝ/Ÿb *‚ýsÀb¸ŒÉ(Rœ¨`ücóᔼԺ܆”ã Eæ¹Ë’\׿%™_v_͇oº>Çjûçþ×»Oû>?gÅ +’Ì’ìQSš4vh#Ή $VˆEL¶o xùн:6Ú?bL¡™Aè TÆ`ɦÝIaÚÈw &ÏgúW)Jâ…¸°™ô°Å"øò®¨‚‡ÓJ»2Œx Š«Ý³µóåpÐUõ|Élq€ŸD”ð¶¦!—H*‚rŒ(㢠Foo ©6u͹­Ò´¶‘XŽ«±+‹º¨ß^ô}¿bð]R‚Q†º“¢eüˆ9nڙÝOã0°ÖSQ>ŠªÎá¶ñÐ »è.º:”éKs|ç1¸F5„¾%åOÛUí‘×ÍEõOZÕÐVS™ç±ÝƵFÅ‘ ®ˆt÷µêvCNöÝ9y3Š<{sc ™ºÕµ]|Ò©½Ý‹-å›×®á§µ®Pwœ®Ã/…½Â&߆HýN´I&…{Ö¬fKgNó%«-¾âåkZ™Ðkª÷ef‡Úêö½ÈtµÖYÉñœæ–ËKúnP~múµ +ĉYh0.l¦Áô°ÅãË»¢ÁLxøûüˆÇ3 P¨†Ä,ZP\Ø̀ÒÃ_Þʄ‡w@Ñø (þ‡PLª÷º°÷ö°E÷úò®p߽#žKÄ#7ÁF²É°bÛWéà¦g Œ<1ÜP žua3žía‹žõå]áYGëÙ ïøv5«ù¥ Cْ4lNš¶,'ïi<<<Ò¸4F‡óó%ënô¿/IfÔ±ÓµaãiøW›1Lá8škí7‘B0_ij_8˜éwœJ$8a}¤&i$o~àIø/Pكendstream +endobj +3089 0 obj << +/Type /Page +/Contents 3090 0 R +/Resources 3088 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3091 0 obj << +/D [3089 0 R /XYZ 71.731 729.2652 null] +>> endobj +781 0 obj << +/D [3089 0 R /XYZ 71.731 741.2204 null] +>> endobj +3092 0 obj << +/D [3089 0 R /XYZ 71.731 718.3063 null] +>> endobj +3093 0 obj << +/D [3089 0 R /XYZ 71.731 708.2442 null] +>> endobj +3094 0 obj << +/D [3089 0 R /XYZ 71.731 706.9988 null] +>> endobj +3095 0 obj << +/D [3089 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3096 0 obj << +/D [3089 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3097 0 obj << +/D [3089 0 R /XYZ 71.731 686.4807 null] +>> endobj +3098 0 obj << +/D [3089 0 R /XYZ 71.731 686.4807 null] +>> endobj +3099 0 obj << +/D [3089 0 R /XYZ 139.477 669.9875 null] +>> endobj +3100 0 obj << +/D [3089 0 R /XYZ 139.477 669.9875 null] +>> endobj +3101 0 obj << +/D [3089 0 R /XYZ 76.7123 652.0548 null] +>> endobj +3102 0 obj << +/D [3089 0 R /XYZ 129.5143 634.122 null] +>> endobj +3103 0 obj << +/D [3089 0 R /XYZ 129.5143 634.122 null] +>> endobj +3104 0 obj << +/D [3089 0 R /XYZ 71.731 612.7572 null] +>> endobj +3105 0 obj << +/D [3089 0 R /XYZ 71.731 601.1458 null] +>> endobj +3106 0 obj << +/D [3089 0 R /XYZ 71.731 599.9004 null] +>> endobj +3107 0 obj << +/D [3089 0 R /XYZ 129.5143 580.8219 null] +>> endobj +780 0 obj << +/D [3089 0 R /XYZ 71.731 574.401 null] +>> endobj +238 0 obj << +/D [3089 0 R /XYZ 209.5045 530.5863 null] +>> endobj +3108 0 obj << +/D [3089 0 R /XYZ 71.731 510.4459 null] +>> endobj +3109 0 obj << +/D [3089 0 R /XYZ 161.0655 497.7096 null] +>> endobj +3110 0 obj << +/D [3089 0 R /XYZ 71.731 485.5901 null] +>> endobj +3111 0 obj << +/D [3089 0 R /XYZ 71.731 454.5605 null] +>> endobj +3112 0 obj << +/D [3089 0 R /XYZ 168.8063 443.2139 null] +>> endobj +3113 0 obj << +/D [3089 0 R /XYZ 71.731 416.1505 null] +>> endobj +3114 0 obj << +/D [3089 0 R /XYZ 71.731 384.7846 null] +>> endobj +3115 0 obj << +/D [3089 0 R /XYZ 71.731 368.147 null] +>> endobj +3116 0 obj << +/D [3089 0 R /XYZ 71.731 337.211 null] +>> endobj +3117 0 obj << +/D [3089 0 R /XYZ 181.5683 325.5552 null] +>> endobj +3118 0 obj << +/D [3089 0 R /XYZ 71.731 315.493 null] +>> endobj +3119 0 obj << +/D [3089 0 R /XYZ 71.731 282.0698 null] +>> endobj +3120 0 obj << +/D [3089 0 R /XYZ 71.731 270.96 null] +>> endobj +3121 0 obj << +/D [3089 0 R /XYZ 71.731 269.7146 null] +>> endobj +3122 0 obj << +/D [3089 0 R /XYZ 129.5143 250.6361 null] +>> endobj +3123 0 obj << +/D [3089 0 R /XYZ 129.5143 250.6361 null] +>> endobj +3124 0 obj << +/D [3089 0 R /XYZ 71.731 249.1966 null] +>> endobj +3125 0 obj << +/D [3089 0 R /XYZ 71.731 249.1966 null] +>> endobj +3126 0 obj << +/D [3089 0 R /XYZ 139.477 232.7034 null] +>> endobj +3127 0 obj << +/D [3089 0 R /XYZ 139.477 232.7034 null] +>> endobj +3128 0 obj << +/D [3089 0 R /XYZ 76.7123 214.7706 null] +>> endobj +3129 0 obj << +/D [3089 0 R /XYZ 129.5143 196.8378 null] +>> endobj +3130 0 obj << +/D [3089 0 R /XYZ 129.5143 196.8378 null] +>> endobj +3131 0 obj << +/D [3089 0 R /XYZ 71.731 194.681 null] +>> endobj +3132 0 obj << +/D [3089 0 R /XYZ 71.731 194.681 null] +>> endobj +3133 0 obj << +/D [3089 0 R /XYZ 139.477 178.9051 null] +>> endobj +3134 0 obj << +/D [3089 0 R /XYZ 71.731 177.4655 null] +>> endobj +3135 0 obj << +/D [3089 0 R /XYZ 139.477 160.9723 null] +>> endobj +3136 0 obj << +/D [3089 0 R /XYZ 71.731 123.1143 null] +>> endobj +3137 0 obj << +/D [3089 0 R /XYZ 71.731 110.0633 null] +>> endobj +3138 0 obj << +/D [3089 0 R /XYZ 71.731 108.818 null] +>> endobj +3088 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3141 0 obj << +/Length 815 +/Filter /FlateDecode +>> +stream +xÚµV]oÚ0}çWä¤ÅóGÛ}ëÚmÚ´M¨¢OëTeÁ”H!A‰£ªÿ~×8 ˜i›x°ã{Žïõ5 0|H  ª9 ÒÍ/ð×ç i!a‹ ‡ ‹ÉûO  +©˜ÆÁb0#.¢@0Š$'2X,NïÖÉÖèjRŽ§¹qž'…6ߒßîëíü‹›|×f].ëÙ¯Å×ÉÇEÏϙ@JÉY‘‘(bX!ÅHQ½(BâœØ –ˆELô›¡*‰ÝLëav7O”òCu„R v¼‡ã^G·Ê«co*-s±±Ž¬0ïœeÄ Ùʍu“¦º®WMneB,Ð'˜Ù`!HHÆ`‚e<Þ£ˆ3{0BNïu®žß=¶«‡J"$Å`œ=^;!óª4¥yÛê›~…„ñŽ®]R‚b"ÕnÁža§÷ sœ4fÝîf›6ÏÙ~$ao(à^×i•mMVç$0H͘%Ԏ1i3òîÙåp8!#ˆKâ¼ùQa²ÜdE ß$onRy;[îÂõaº¸Æf­³6ûë X{£˜ Çò MSu'O´õh5#¾ÉM‹/¢zÍj®õì6ÏËåÓW½t!Ê\×מàΎvbtº¾–~>#|šTÉl«í¨žºÊcB"…ºPÇCؙ:îaëØÇ{Eé`ràd_Ç#6õ=¶ÑaË`!7m˜ªI»¢ï/L»^&K[CdSéã vb¨~ʉßØa{c‰í£ u°“ÆÂác)/ïic»UÇ:ÆÆ2…"!Æ2nÁ×L<îr¨¼úÔ¡¿YñÒùë±uã¹l/ÝØÔútöÂ!2®âKÙ;€ËÞv9{=¼×dÙ;ÔánkÃŒ#B%;¼ïYýíŸ-­ËOSx!Ø{1Œ8 +Ëñ…Ñ^§o + +ÌÕ¥Ž?„ñº‡]ôÚÇ{…×>žŽ?Òñ¯;~4îø3†§ÚÂÿlûº{ ö}øR鹬ž è óTûn$‚~®Î>m˜ã—-§.d¥úH–8’'ß©Â?˜¡€endstream +endobj +3140 0 obj << +/Type /Page +/Contents 3141 0 R +/Resources 3139 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3142 0 obj << +/D [3140 0 R /XYZ 71.731 729.2652 null] +>> endobj +3143 0 obj << +/D [3140 0 R /XYZ 71.731 741.2204 null] +>> endobj +3144 0 obj << +/D [3140 0 R /XYZ 129.5143 708.3437 null] +>> endobj +242 0 obj << +/D [3140 0 R /XYZ 202.8077 658.1081 null] +>> endobj +3145 0 obj << +/D [3140 0 R /XYZ 71.731 637.9677 null] +>> endobj +3146 0 obj << +/D [3140 0 R /XYZ 161.0655 625.2314 null] +>> endobj +3147 0 obj << +/D [3140 0 R /XYZ 71.731 613.1119 null] +>> endobj +3148 0 obj << +/D [3140 0 R /XYZ 71.731 581.746 null] +>> endobj +3149 0 obj << +/D [3140 0 R /XYZ 168.8063 570.7357 null] +>> endobj +3150 0 obj << +/D [3140 0 R /XYZ 71.731 543.6723 null] +>> endobj +3151 0 obj << +/D [3140 0 R /XYZ 71.731 514.158 null] +>> endobj +3152 0 obj << +/D [3140 0 R /XYZ 71.731 495.6688 null] +>> endobj +3153 0 obj << +/D [3140 0 R /XYZ 71.731 464.7328 null] +>> endobj +3154 0 obj << +/D [3140 0 R /XYZ 181.5683 453.0769 null] +>> endobj +3155 0 obj << +/D [3140 0 R /XYZ 71.731 443.0148 null] +>> endobj +3156 0 obj << +/D [3140 0 R /XYZ 71.731 409.5916 null] +>> endobj +3157 0 obj << +/D [3140 0 R /XYZ 71.731 398.4818 null] +>> endobj +3158 0 obj << +/D [3140 0 R /XYZ 71.731 397.2364 null] +>> endobj +3159 0 obj << +/D [3140 0 R /XYZ 129.5143 378.1579 null] +>> endobj +3160 0 obj << +/D [3140 0 R /XYZ 129.5143 378.1579 null] +>> endobj +3161 0 obj << +/D [3140 0 R /XYZ 71.731 376.7183 null] +>> endobj +3162 0 obj << +/D [3140 0 R /XYZ 71.731 376.7183 null] +>> endobj +3163 0 obj << +/D [3140 0 R /XYZ 139.477 360.2251 null] +>> endobj +3164 0 obj << +/D [3140 0 R /XYZ 139.477 360.2251 null] +>> endobj +3165 0 obj << +/D [3140 0 R /XYZ 76.7123 342.2924 null] +>> endobj +3166 0 obj << +/D [3140 0 R /XYZ 129.5143 324.3596 null] +>> endobj +3167 0 obj << +/D [3140 0 R /XYZ 129.5143 324.3596 null] +>> endobj +3168 0 obj << +/D [3140 0 R /XYZ 71.731 302.9948 null] +>> endobj +3169 0 obj << +/D [3140 0 R /XYZ 71.731 291.3834 null] +>> endobj +3170 0 obj << +/D [3140 0 R /XYZ 71.731 290.1381 null] +>> endobj +3171 0 obj << +/D [3140 0 R /XYZ 129.5143 271.0595 null] +>> endobj +782 0 obj << +/D [3140 0 R /XYZ 71.731 264.6386 null] +>> endobj +246 0 obj << +/D [3140 0 R /XYZ 203.2724 220.8239 null] +>> endobj +3172 0 obj << +/D [3140 0 R /XYZ 71.731 200.6835 null] +>> endobj +3173 0 obj << +/D [3140 0 R /XYZ 161.0655 187.9472 null] +>> endobj +3174 0 obj << +/D [3140 0 R /XYZ 71.731 175.8277 null] +>> endobj +3175 0 obj << +/D [3140 0 R /XYZ 71.731 144.4618 null] +>> endobj +3176 0 obj << +/D [3140 0 R /XYZ 168.8063 133.4515 null] +>> endobj +3139 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3179 0 obj << +/Length 1058 +/Filter /FlateDecode +>> +stream +xÚíWMoã6½çWèh1ËQ¤ö–v»Å]ÀØúցbѱ°²dHô¦ûï;IY¶(˧žŠÑ‡9o†#aø#‘ H0¸ÐфÓh{xÀÑüôÛq•Ã¬† Ÿ7?}b8JQšÐ$Úì"–&ˆ‹8Œ"ɉŒ6ù_‹_öÙQ«f¹¢/(²×u™UJÿ‘½Úǧõg{óEé}·Ë¿7¿?üºéãs&P*!ÈM’=jL“¦‘šIlhø•“˜EKÄb&:ž_²æ›%‘Uöª–„/þ)Z]ToöÍQù…d­½æªTZånYOeé†VºÐ…r g̱BoèÑ>¶e±U­{ø¶$.Òÿªªóþg¥·†û´«]ø÷}±ÝÛ[½/ÚkvþMv9›BgºXÒdñ}Ibˆâ‚`+BPÂÖ-þ½ð̳²­íÝ«ºX¢}ðF-Ã<ŸÐÃIPÂDÒùªô©©Э¨Ø9MN[ФݝJ·ð™=;•Úák½WÍ{ѪnênGÏÆ[¹Û•1žHì†ÂfÔKÊïžã׺Tí‡~øÙ~4EˆL»ÑY~(ª{C­ÍþeMv€µ76Äо„€á8QÝۃV”7/[`ҙ÷z.ÿ™R> +J)˜›ÐPÐë뙄4"Ád(ƒ†$ŒÙ‚Ña3¿|p›­›ÓV?^å¾oòf n­«!òÔ¨ñê<#F kêQ«!ì,*1Eíb=6©*l;¦qŒ;-«5æq©+KQ,Ä%'ÐÅÖŀºò+†’{­/”,¯o@փÎÖ—î§VMû–Hs.çŒ;€Ýr®‡Í[7÷ï^ó˜0)ž/EþR7/äq@jÉ‘òRé¢Ò—uÑJ?íVŒ§³f=£nyÕ¡æ­:zSÇ$ÎZôFp-œåÖçƒ(7Ö{Ƙ›)QbIOñœ*CØ Yzج.¡¸wâ1Væ‚ÆEBžÕñFƒÙaÊ»­G§|x^N'1áÌ4\·Ór»‘–=l6-CqïHˏpýyœM5Ù0¸T~Q»‡ã ɬ ”qۀÀŽpÓ© ¹øØõ)ë%ƒ¦1§w[WŸš%…L>üYèPþÇIŠÅÕÉßÔºÖ?Žê޾†6ÁtÁú.ќ¾›3W’Ô!+|gÔÂ÷º¬ßŠêå5kU×#ÞÙ­|Tí¶)Žæ8¸ÅšA3ŸÐÔYñP•¾›¾­…sÅ1:ª­Mò|ÈÝ5r°È9¼Y’k¡?ï®Àù|_[Õ®ìfþ<;¼ú¤ªw÷Dë[íP7¬š¦¾ê¤›.ÿol'*Áá4Ig*Ñv£õ°ÙJŠ{G%ñ7<þÓöÖ}oÇI2¡ªÿ$`Æ_äœJ —¦ýL†fœN~_þ ÒÊÌ endstream +endobj +3178 0 obj << +/Type /Page +/Contents 3179 0 R +/Resources 3177 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3180 0 obj << +/D [3178 0 R /XYZ 71.731 729.2652 null] +>> endobj +3181 0 obj << +/D [3178 0 R /XYZ 71.731 718.3063 null] +>> endobj +3182 0 obj << +/D [3178 0 R /XYZ 71.731 658.8289 null] +>> endobj +3183 0 obj << +/D [3178 0 R /XYZ 181.5683 647.1731 null] +>> endobj +3184 0 obj << +/D [3178 0 R /XYZ 71.731 637.1109 null] +>> endobj +3185 0 obj << +/D [3178 0 R /XYZ 71.731 605.5393 null] +>> endobj +3186 0 obj << +/D [3178 0 R /XYZ 71.731 592.5779 null] +>> endobj +3187 0 obj << +/D [3178 0 R /XYZ 71.731 591.3326 null] +>> endobj +3188 0 obj << +/D [3178 0 R /XYZ 129.5143 572.254 null] +>> endobj +3189 0 obj << +/D [3178 0 R /XYZ 129.5143 572.254 null] +>> endobj +3190 0 obj << +/D [3178 0 R /XYZ 71.731 570.8145 null] +>> endobj +3191 0 obj << +/D [3178 0 R /XYZ 71.731 570.8145 null] +>> endobj +3192 0 obj << +/D [3178 0 R /XYZ 139.477 554.3213 null] +>> endobj +3193 0 obj << +/D [3178 0 R /XYZ 139.477 554.3213 null] +>> endobj +3194 0 obj << +/D [3178 0 R /XYZ 76.7123 536.3885 null] +>> endobj +3195 0 obj << +/D [3178 0 R /XYZ 129.5143 518.4558 null] +>> endobj +3196 0 obj << +/D [3178 0 R /XYZ 129.5143 518.4558 null] +>> endobj +3197 0 obj << +/D [3178 0 R /XYZ 71.731 516.299 null] +>> endobj +3198 0 obj << +/D [3178 0 R /XYZ 71.731 516.299 null] +>> endobj +3199 0 obj << +/D [3178 0 R /XYZ 139.477 500.523 null] +>> endobj +3200 0 obj << +/D [3178 0 R /XYZ 71.731 499.0835 null] +>> endobj +3201 0 obj << +/D [3178 0 R /XYZ 139.477 482.5903 null] +>> endobj +3202 0 obj << +/D [3178 0 R /XYZ 71.731 444.7322 null] +>> endobj +3203 0 obj << +/D [3178 0 R /XYZ 71.731 431.6813 null] +>> endobj +3204 0 obj << +/D [3178 0 R /XYZ 71.731 430.4359 null] +>> endobj +3205 0 obj << +/D [3178 0 R /XYZ 129.5143 411.3574 null] +>> endobj +783 0 obj << +/D [3178 0 R /XYZ 71.731 404.9365 null] +>> endobj +250 0 obj << +/D [3178 0 R /XYZ 298.3181 361.1218 null] +>> endobj +3206 0 obj << +/D [3178 0 R /XYZ 71.731 340.9814 null] +>> endobj +3207 0 obj << +/D [3178 0 R /XYZ 161.0655 328.2451 null] +>> endobj +3208 0 obj << +/D [3178 0 R /XYZ 71.731 316.1256 null] +>> endobj +3209 0 obj << +/D [3178 0 R /XYZ 71.731 284.7597 null] +>> endobj +3210 0 obj << +/D [3178 0 R /XYZ 168.8063 273.7494 null] +>> endobj +3211 0 obj << +/D [3178 0 R /XYZ 71.731 246.686 null] +>> endobj +3212 0 obj << +/D [3178 0 R /XYZ 71.731 220.4593 null] +>> endobj +3213 0 obj << +/D [3178 0 R /XYZ 71.731 187.6718 null] +>> endobj +3214 0 obj << +/D [3178 0 R /XYZ 181.5683 176.0159 null] +>> endobj +3215 0 obj << +/D [3178 0 R /XYZ 71.731 165.9538 null] +>> endobj +3216 0 obj << +/D [3178 0 R /XYZ 71.731 134.3821 null] +>> endobj +3217 0 obj << +/D [3178 0 R /XYZ 71.731 121.4208 null] +>> endobj +3218 0 obj << +/D [3178 0 R /XYZ 71.731 120.1754 null] +>> endobj +3219 0 obj << +/D [3178 0 R /XYZ 129.5143 101.0969 null] +>> endobj +3220 0 obj << +/D [3178 0 R /XYZ 129.5143 101.0969 null] +>> endobj +3221 0 obj << +/D [3178 0 R /XYZ 71.731 99.6573 null] +>> endobj +3222 0 obj << +/D [3178 0 R /XYZ 71.731 99.6573 null] +>> endobj +3177 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3225 0 obj << +/Length 1134 +/Filter /FlateDecode +>> +stream +xÚÍXÁnã6½ç+t´˜IQ$sK»M±E »î©)Ŧ¶dP2¶û÷I¤LY´¨Å‹"ÉÎ#çññÍphÅð‡#Ž§ð ‘”‘h{¼‹£7ø×owØ@V³rA?oî~z¢q$‘LImö•)b<‰8%H0,¢ÍîïÅ/ïÙ©Vz¹",^Ô=ׇ¬PõÙk÷ñqý±{ùSÕïå®Zþ³ùýî×MŸQŽ¤€ “$“X $4Z‘I‚™…a +†@qÀӄò~1DFáf¡°˜×ÚÕ<®ÙaXnL¹Ú¸×Ï ;j̃ŠH€¨iÒò %œi<žë÷N«†LËü² ,Ei۷ЇNÙªÖyñvoô†áª¨ómVçeÑ}wì¦kßë²{ž+5Z,YæQÊ ðþ­èQ+vYò¸y4ÛM‘ åcâ{[d;jÌc(²Ý쏓ÒUY¼ä»—R¿¨c–Ç1onJCÁΘð4lJ Kã‰;G4.Aj®u~Ìô×îƒZµ¦kß³ÝN«ªºqŒxƒùèÀ¦òÑÂÂùè‰;'¯yÜÈG—G•×Êdã¡|ˋ—׬+P×*cA*¿/'™€S '¡œtaÆëaAãùâÎ0žÇØx—œü Ê~CN²4ABàPNº°)i,,,'îi<<<Ò¸49yQ§:ä[ózÒªQé߆,ƒùkÖ#KÖNòIÕg]T7s6‘Žj!9ëÂ&r¶‡sÖwFÎúx8:Úýð¸x ƒí”çíêÙþlUàÇtmmX1Ž¸  „²´Œ èm`8‹ê jµ^R¨’z‰ÙNê'½$ÞÇÏí.ëB‘ 1Úô§<ívz­Ëº¬¿žÔC?âR‡ÌØÁP®…l˜Èmoð¤m´vMÏ1‹3è­ÌŠÇýýc#ó}‘ÁH {ø®lx—ïUmu~j·)ÆpÀ°”¸Œ+ÓÛ½[/ŸÔ¶KôK·{ßÃÂBøv¦¡ÿ¸¿B»“å&tQš +œÙ–óøj{òz‚vö{;М‡Z—ÚL–év‹Á£)(e)mתۜS;ÔÿNZÊS7!~4A÷K Q·ÚàK ¦¿ä•Bs·êñp(—„-¾XÅ>•UÍõY¶;æ…uR>7æºÉ…Lƒ©àÒ5Qz° ˆ +¸,M—6QzzX°ôøâÎ(=#þvaÀ£ÉDl$A1]ŽÎ[[§úËhæ¹%uȳV7ÏFœBóÁXèòéÂ&ÎÆ<}qgœ#ÞËç€ÆÿàòÙê#CÞíASÎí@aߎ"ÎqíÁ Ï^ü¸ 'nk&§!—:°)—ZXØ¥ž¸s\êá1îà4¾õÂi~âJôÇ©œüÌÁŒcD@}‘²Ÿ©!Ãâ›?iyþüûqÕendstream +endobj +3224 0 obj << +/Type /Page +/Contents 3225 0 R +/Resources 3223 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3226 0 obj << +/D [3224 0 R /XYZ 71.731 729.2652 null] +>> endobj +3227 0 obj << +/D [3224 0 R /XYZ 139.477 708.3437 null] +>> endobj +3228 0 obj << +/D [3224 0 R /XYZ 139.477 708.3437 null] +>> endobj +3229 0 obj << +/D [3224 0 R /XYZ 76.7123 690.4109 null] +>> endobj +3230 0 obj << +/D [3224 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3231 0 obj << +/D [3224 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3232 0 obj << +/D [3224 0 R /XYZ 71.731 670.3214 null] +>> endobj +3233 0 obj << +/D [3224 0 R /XYZ 71.731 670.3214 null] +>> endobj +3234 0 obj << +/D [3224 0 R /XYZ 139.477 654.5454 null] +>> endobj +3235 0 obj << +/D [3224 0 R /XYZ 71.731 653.1059 null] +>> endobj +3236 0 obj << +/D [3224 0 R /XYZ 139.477 636.6127 null] +>> endobj +3237 0 obj << +/D [3224 0 R /XYZ 76.7123 618.6799 null] +>> endobj +3238 0 obj << +/D [3224 0 R /XYZ 129.5143 600.7472 null] +>> endobj +3239 0 obj << +/D [3224 0 R /XYZ 129.5143 600.7472 null] +>> endobj +3240 0 obj << +/D [3224 0 R /XYZ 71.731 598.5904 null] +>> endobj +3241 0 obj << +/D [3224 0 R /XYZ 71.731 598.5904 null] +>> endobj +3242 0 obj << +/D [3224 0 R /XYZ 139.477 582.8144 null] +>> endobj +3243 0 obj << +/D [3224 0 R /XYZ 71.731 581.3749 null] +>> endobj +3244 0 obj << +/D [3224 0 R /XYZ 139.477 564.8817 null] +>> endobj +3245 0 obj << +/D [3224 0 R /XYZ 71.731 527.0236 null] +>> endobj +3246 0 obj << +/D [3224 0 R /XYZ 71.731 513.9727 null] +>> endobj +3247 0 obj << +/D [3224 0 R /XYZ 71.731 512.7273 null] +>> endobj +3248 0 obj << +/D [3224 0 R /XYZ 129.5143 493.6488 null] +>> endobj +784 0 obj << +/D [3224 0 R /XYZ 71.731 487.2279 null] +>> endobj +254 0 obj << +/D [3224 0 R /XYZ 306.9429 443.4132 null] +>> endobj +3249 0 obj << +/D [3224 0 R /XYZ 71.731 423.2728 null] +>> endobj +3250 0 obj << +/D [3224 0 R /XYZ 161.0655 410.5365 null] +>> endobj +3251 0 obj << +/D [3224 0 R /XYZ 71.731 398.417 null] +>> endobj +3252 0 obj << +/D [3224 0 R /XYZ 71.731 367.0511 null] +>> endobj +3253 0 obj << +/D [3224 0 R /XYZ 168.8063 356.0408 null] +>> endobj +3254 0 obj << +/D [3224 0 R /XYZ 71.731 328.9774 null] +>> endobj +3255 0 obj << +/D [3224 0 R /XYZ 71.731 302.7507 null] +>> endobj +3256 0 obj << +/D [3224 0 R /XYZ 71.731 269.9632 null] +>> endobj +3257 0 obj << +/D [3224 0 R /XYZ 181.5683 258.3073 null] +>> endobj +3258 0 obj << +/D [3224 0 R /XYZ 71.731 248.2452 null] +>> endobj +3259 0 obj << +/D [3224 0 R /XYZ 71.731 214.822 null] +>> endobj +3260 0 obj << +/D [3224 0 R /XYZ 71.731 203.7122 null] +>> endobj +3261 0 obj << +/D [3224 0 R /XYZ 71.731 202.4668 null] +>> endobj +3262 0 obj << +/D [3224 0 R /XYZ 129.5143 183.3883 null] +>> endobj +3263 0 obj << +/D [3224 0 R /XYZ 129.5143 183.3883 null] +>> endobj +3264 0 obj << +/D [3224 0 R /XYZ 71.731 181.9487 null] +>> endobj +3265 0 obj << +/D [3224 0 R /XYZ 71.731 181.9487 null] +>> endobj +3266 0 obj << +/D [3224 0 R /XYZ 139.477 165.4555 null] +>> endobj +3267 0 obj << +/D [3224 0 R /XYZ 139.477 165.4555 null] +>> endobj +3268 0 obj << +/D [3224 0 R /XYZ 76.7123 147.5228 null] +>> endobj +3269 0 obj << +/D [3224 0 R /XYZ 129.5143 129.59 null] +>> endobj +3270 0 obj << +/D [3224 0 R /XYZ 129.5143 129.59 null] +>> endobj +3271 0 obj << +/D [3224 0 R /XYZ 71.731 127.4332 null] +>> endobj +3272 0 obj << +/D [3224 0 R /XYZ 71.731 127.4332 null] +>> endobj +3273 0 obj << +/D [3224 0 R /XYZ 139.477 111.6573 null] +>> endobj +3274 0 obj << +/D [3224 0 R /XYZ 71.731 110.2177 null] +>> endobj +3223 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3278 0 obj << +/Length 1091 +/Filter /FlateDecode +>> +stream +xÚ¥X]œ6}ß_ÁãŒ\`lïÛ&i«T4J¦OÝjEÀ›Aa`LÓý÷½Œ cVû³ß{||¿€þH  .T!s¤Ç;|…G¿Þ -&tAo÷w?ýÂp Ši쟦bÄEF‘äDûìÏÍ»CòÒêzRŽ7™ë®HJÝþž|1?vÌÍGݪ¬ÙþµÿíîçýàŸ3”'³$#,QK„#E ÷¢˜à$”<‹˜6CU é6 +›p¬ÛÍ#¥üšíb©À5Øû½¾^xô«¼<.¢¦P$ĘFÓÖyùõ³ÎIýj~èð˜ä…¹O²¬ÖÍDMB`gœˆ LK¿š*ta”ÀF§‰µ›:Q +; Ôë÷¶Nýª)& :ÅÑè¼F<š"OõSž=UõS™uÇéJ`)…o݂{#]^¶æ¦²‘kŸn©wÊ#Ä#-„œ › ¹¶r>¿+BÎÇcr# ˆ·Ï¦V¦L—mþˆ1… ¿© ‹QL¨XÒƁÍiÓÖµñø]£‡‡G—Æ(yúˆó`rØ%ÇHbÅÏË>éöT—ÍýÍå1GL(¹ .l&AØb‚úü®HPG¹þG<.aElH=ۄ;¥)¯çSasø Uýœí!HHf¥ŒÇgcÚO×a„ܼׅnõnË $Ö[Â7MUz’?HR v-KÄæ8wuÕVí닾V\êŒ]Rç/Õyu¦ëÎəý#æ89µ»·—ó#[‡tW¡@<|ÂÞ¼Ëç½nÒ:ióªœcÉcj}Lêo¶ XFº៼i»2fž¤iuêë\ҘkvÞJ†Îa‹Á(A\#ï l£·š™›V§û¿´wU•Å«kÍ"úØèânúAàÃY|Å¡‚§¶L—U6“vXœ÷e¿+ªÙ„‡ÜñèRÞ#&ãZÆ)íKß0ÿv뻎š&]²»ÈS­o6XŠ9ŠñÒ¸ë fÚkZ쮧+šë5‰±¦¶·º@óVàѕC +FðÂq­ì¥?x=s&Ϋ!üoÆ-‰¼ý(¾·.l&nØbÜúü®ˆÛ ܎xLû“Gm¥£×jÿè L8(^]ØL´°Åpõù]¯>ÓapDã2ÑtýòædÂÕ¥W5'ŒE-ë2uºF–) *‡ÿõÂj¿>DÁ$¢f?P8˜é÷ N%Ôa¥K33†y¿6xþ Ôéîendstream +endobj +3277 0 obj << +/Type /Page +/Contents 3278 0 R +/Resources 3276 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3279 0 obj << +/D [3277 0 R /XYZ 71.731 729.2652 null] +>> endobj +3280 0 obj << +/D [3277 0 R /XYZ 139.477 708.3437 null] +>> endobj +3281 0 obj << +/D [3277 0 R /XYZ 76.7123 690.4109 null] +>> endobj +3282 0 obj << +/D [3277 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3283 0 obj << +/D [3277 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3284 0 obj << +/D [3277 0 R /XYZ 71.731 670.3214 null] +>> endobj +3285 0 obj << +/D [3277 0 R /XYZ 71.731 670.3214 null] +>> endobj +3286 0 obj << +/D [3277 0 R /XYZ 139.477 654.5454 null] +>> endobj +3287 0 obj << +/D [3277 0 R /XYZ 71.731 653.1059 null] +>> endobj +3288 0 obj << +/D [3277 0 R /XYZ 139.477 636.6127 null] +>> endobj +3289 0 obj << +/D [3277 0 R /XYZ 71.731 598.7547 null] +>> endobj +3290 0 obj << +/D [3277 0 R /XYZ 71.731 585.7037 null] +>> endobj +3291 0 obj << +/D [3277 0 R /XYZ 71.731 584.4584 null] +>> endobj +3292 0 obj << +/D [3277 0 R /XYZ 129.5143 565.3798 null] +>> endobj +785 0 obj << +/D [3277 0 R /XYZ 71.731 558.9589 null] +>> endobj +258 0 obj << +/D [3277 0 R /XYZ 224.0515 515.1442 null] +>> endobj +3293 0 obj << +/D [3277 0 R /XYZ 71.731 495.0038 null] +>> endobj +3294 0 obj << +/D [3277 0 R /XYZ 161.0655 482.2675 null] +>> endobj +3295 0 obj << +/D [3277 0 R /XYZ 71.731 470.148 null] +>> endobj +3296 0 obj << +/D [3277 0 R /XYZ 71.731 438.7821 null] +>> endobj +3297 0 obj << +/D [3277 0 R /XYZ 168.8063 427.7718 null] +>> endobj +3298 0 obj << +/D [3277 0 R /XYZ 71.731 400.7084 null] +>> endobj +3299 0 obj << +/D [3277 0 R /XYZ 71.731 369.3425 null] +>> endobj +3300 0 obj << +/D [3277 0 R /XYZ 71.731 341.0486 null] +>> endobj +3301 0 obj << +/D [3277 0 R /XYZ 71.731 310.1126 null] +>> endobj +3302 0 obj << +/D [3277 0 R /XYZ 181.5683 298.4568 null] +>> endobj +3303 0 obj << +/D [3277 0 R /XYZ 71.731 288.3946 null] +>> endobj +3304 0 obj << +/D [3277 0 R /XYZ 71.731 254.9714 null] +>> endobj +3305 0 obj << +/D [3277 0 R /XYZ 71.731 243.8616 null] +>> endobj +3306 0 obj << +/D [3277 0 R /XYZ 71.731 242.6163 null] +>> endobj +3307 0 obj << +/D [3277 0 R /XYZ 129.5143 223.5377 null] +>> endobj +3308 0 obj << +/D [3277 0 R /XYZ 129.5143 223.5377 null] +>> endobj +3309 0 obj << +/D [3277 0 R /XYZ 71.731 222.0982 null] +>> endobj +3310 0 obj << +/D [3277 0 R /XYZ 71.731 222.0982 null] +>> endobj +3311 0 obj << +/D [3277 0 R /XYZ 139.477 205.605 null] +>> endobj +3312 0 obj << +/D [3277 0 R /XYZ 139.477 205.605 null] +>> endobj +3313 0 obj << +/D [3277 0 R /XYZ 76.7123 187.6722 null] +>> endobj +3314 0 obj << +/D [3277 0 R /XYZ 129.5143 169.7395 null] +>> endobj +3315 0 obj << +/D [3277 0 R /XYZ 129.5143 169.7395 null] +>> endobj +3316 0 obj << +/D [3277 0 R /XYZ 71.731 167.5826 null] +>> endobj +3317 0 obj << +/D [3277 0 R /XYZ 71.731 167.5826 null] +>> endobj +3318 0 obj << +/D [3277 0 R /XYZ 139.477 151.8067 null] +>> endobj +3319 0 obj << +/D [3277 0 R /XYZ 71.731 150.3672 null] +>> endobj +3320 0 obj << +/D [3277 0 R /XYZ 139.477 133.874 null] +>> endobj +3276 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3323 0 obj << +/Length 1085 +/Filter /FlateDecode +>> +stream +xڕX[£6}Ÿ_Ác"×WlæmÚíV[µR4Ê>uªMœ j®æß÷3bÀ\ªy€!Ç>ÇÇç³ $ÀðGIdp¡1¢‘ Ááú„ƒoðÓ¯OÄBB‹ ]ÐOû§?3Ä(ŽhìO‹#$$$£H ¢‚ýñÏÍÏçäVébR75×Ý%Étõ{òwóïËîKsó‡®Îù±Üþµÿíé—}Ç/˜D±’Y‘j,“ÆŽLBb$‘Ä +1Îd­óUW÷"+Ÿ‡Ü:RÐ=ÅÌËÝ¡BÖrÉI»ƒî7Jň—RG¨—wx}èh[yu8€C‚pÖבfÕÍDæ’žšky?tYžî#ú}Q"¸é,IÅÜ`D™ˆêÎ(ÊL·T›Oú¢+ýš_ôçbKñ&¿î¶ o DlÊ<³º¹DŠbðÓdIFÍ튼ʫ›~îZ(hÕ*lې‘¸Æ»¼À© ÃUè œÜ«³n÷ôøžïYrÕöé­n`Ÿëk’^ ñˆ [nWì']ŠôV¥y6'—AÍDÔÕ[6ìÕY[óoú¾aLõñ¡¶¹;Á°èF42Œ‰˜ÒÌÈî‹íúXòìòaûÔ[*6ÿÖ³óϖÀä ú­ôáÜÜ%™Õq/Ûº6ŠÊ¡$ós9hbziŸUCj»)S½]"Òl(vJ"ü1ú˜ö¦XK,¯-©‡ Ħó‹D(b2r—„…Š°a9EÉýRY|ã*¾§¥Fkór¹äf„ßÛy6Á-WF=9^Ó¬Ímº–rgŒI +ˆ<,Ñ3kãÂRхµÏ…ͬ}lqíóñ®XûF:˜rÜëÖ¾ž³xl£aÃ` Ïvê«â~hÊnë2íuV¥‡ÄT¼‹¼CpGl%P…‡eÔkl‹ +]ØÃXböäހZؤ±0ù˜òØË;mlÛj¬£o,‹—²/ã|i¶u»ªÃ‰aèoš}kýõØzmºkV¼[l&ÓKcŠ¨Œã…ôº°™ôv°ÅôúxW¤w¤ÃŸÞžŽÁæ±Z1D”ê; û½]¬ +×úÉ´RÉA£¤ iua3ií`‹iõñ®H«O‡s²iíÉxœ€^»$=šÖp1m D™¾TÈ.lΚ¶l‡w5k\½²¬Ý™¬7Š‘àj±ÞØ\½µ°åzó𮩷¡Ž‰zsuŒ†ž’‹cÄèpuûß5‡)lòÑbÍ9°¹`µ°å`yx×Ë£Ã,WÆ£æ¾vÊU5GG‘bK5çÂf¬é`‹ÖøxWXãÓ1¶¦'£Ws»"½&…=çê°]sô8 8‹ÖGØÊ&¦¢yS8æë^n aˆ -”¬ ›)Ù¶X²>Þ%ëÓáy¹íéXùrëÊ´Ÿ=¸Bð +Ï~q0ã#D˜ÀVÝ¢ŒA'?sxÿ^@#endstream +endobj +3322 0 obj << +/Type /Page +/Contents 3323 0 R +/Resources 3321 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3324 0 obj << +/D [3322 0 R /XYZ 71.731 729.2652 null] +>> endobj +3325 0 obj << +/D [3322 0 R /XYZ 71.731 741.2204 null] +>> endobj +3326 0 obj << +/D [3322 0 R /XYZ 71.731 718.3063 null] +>> endobj +3327 0 obj << +/D [3322 0 R /XYZ 71.731 708.2442 null] +>> endobj +3328 0 obj << +/D [3322 0 R /XYZ 71.731 706.9988 null] +>> endobj +3329 0 obj << +/D [3322 0 R /XYZ 129.5143 687.9203 null] +>> endobj +786 0 obj << +/D [3322 0 R /XYZ 71.731 681.4994 null] +>> endobj +262 0 obj << +/D [3322 0 R /XYZ 304.051 637.6847 null] +>> endobj +3330 0 obj << +/D [3322 0 R /XYZ 71.731 617.5443 null] +>> endobj +3331 0 obj << +/D [3322 0 R /XYZ 161.0655 604.8079 null] +>> endobj +3332 0 obj << +/D [3322 0 R /XYZ 71.731 592.6885 null] +>> endobj +3333 0 obj << +/D [3322 0 R /XYZ 71.731 561.3226 null] +>> endobj +3334 0 obj << +/D [3322 0 R /XYZ 168.8063 550.3123 null] +>> endobj +3335 0 obj << +/D [3322 0 R /XYZ 71.731 523.2489 null] +>> endobj +3336 0 obj << +/D [3322 0 R /XYZ 71.731 491.883 null] +>> endobj +3337 0 obj << +/D [3322 0 R /XYZ 71.731 465.4407 null] +>> endobj +3338 0 obj << +/D [3322 0 R /XYZ 71.731 432.6531 null] +>> endobj +3339 0 obj << +/D [3322 0 R /XYZ 181.5683 420.9972 null] +>> endobj +3340 0 obj << +/D [3322 0 R /XYZ 71.731 410.9351 null] +>> endobj +3341 0 obj << +/D [3322 0 R /XYZ 71.731 377.5119 null] +>> endobj +3342 0 obj << +/D [3322 0 R /XYZ 71.731 366.4021 null] +>> endobj +3343 0 obj << +/D [3322 0 R /XYZ 71.731 365.1567 null] +>> endobj +3344 0 obj << +/D [3322 0 R /XYZ 129.5143 346.0782 null] +>> endobj +3345 0 obj << +/D [3322 0 R /XYZ 129.5143 346.0782 null] +>> endobj +3346 0 obj << +/D [3322 0 R /XYZ 71.731 344.6387 null] +>> endobj +3347 0 obj << +/D [3322 0 R /XYZ 71.731 344.6387 null] +>> endobj +3348 0 obj << +/D [3322 0 R /XYZ 139.477 328.1454 null] +>> endobj +3349 0 obj << +/D [3322 0 R /XYZ 139.477 328.1454 null] +>> endobj +3350 0 obj << +/D [3322 0 R /XYZ 76.7123 310.2127 null] +>> endobj +3351 0 obj << +/D [3322 0 R /XYZ 129.5143 292.2799 null] +>> endobj +3352 0 obj << +/D [3322 0 R /XYZ 129.5143 292.2799 null] +>> endobj +3353 0 obj << +/D [3322 0 R /XYZ 71.731 290.1231 null] +>> endobj +3354 0 obj << +/D [3322 0 R /XYZ 71.731 290.1231 null] +>> endobj +3355 0 obj << +/D [3322 0 R /XYZ 139.477 274.3472 null] +>> endobj +3356 0 obj << +/D [3322 0 R /XYZ 71.731 272.9076 null] +>> endobj +3357 0 obj << +/D [3322 0 R /XYZ 139.477 256.4144 null] +>> endobj +3358 0 obj << +/D [3322 0 R /XYZ 76.7123 238.4817 null] +>> endobj +3359 0 obj << +/D [3322 0 R /XYZ 129.5143 220.5489 null] +>> endobj +3360 0 obj << +/D [3322 0 R /XYZ 129.5143 220.5489 null] +>> endobj +3361 0 obj << +/D [3322 0 R /XYZ 71.731 218.3921 null] +>> endobj +3362 0 obj << +/D [3322 0 R /XYZ 71.731 218.3921 null] +>> endobj +3363 0 obj << +/D [3322 0 R /XYZ 139.477 202.6162 null] +>> endobj +3364 0 obj << +/D [3322 0 R /XYZ 71.731 201.1766 null] +>> endobj +3365 0 obj << +/D [3322 0 R /XYZ 139.477 184.6834 null] +>> endobj +3366 0 obj << +/D [3322 0 R /XYZ 71.731 146.8254 null] +>> endobj +3367 0 obj << +/D [3322 0 R /XYZ 71.731 133.7744 null] +>> endobj +3368 0 obj << +/D [3322 0 R /XYZ 71.731 132.5291 null] +>> endobj +3369 0 obj << +/D [3322 0 R /XYZ 129.5143 113.4506 null] +>> endobj +787 0 obj << +/D [3322 0 R /XYZ 71.731 107.0297 null] +>> endobj +3321 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3372 0 obj << +/Length 926 +/Filter /FlateDecode +>> +stream +xÚµW]›:}ß_Ác"Û›¾m?Õê¶Zm#õ¡[­(q$˜®î¿ï8¶‰Ù˜$RUE +$œñ9s¦ùÙwsúʈ€=:ÏǑ41£³/ Â?¹Âendstream +endobj +3371 0 obj << +/Type /Page +/Contents 3372 0 R +/Resources 3370 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3373 0 obj << +/D [3371 0 R /XYZ 71.731 729.2652 null] +>> endobj +3374 0 obj << +/D [3371 0 R /XYZ 71.731 741.2204 null] +>> endobj +266 0 obj << +/D [3371 0 R /XYZ 203.7717 706.1179 null] +>> endobj +3375 0 obj << +/D [3371 0 R /XYZ 71.731 685.9775 null] +>> endobj +3376 0 obj << +/D [3371 0 R /XYZ 161.0655 673.2412 null] +>> endobj +3377 0 obj << +/D [3371 0 R /XYZ 71.731 661.1217 null] +>> endobj +3378 0 obj << +/D [3371 0 R /XYZ 71.731 562.1678 null] +>> endobj +3379 0 obj << +/D [3371 0 R /XYZ 71.731 533.8739 null] +>> endobj +3380 0 obj << +/D [3371 0 R /XYZ 71.731 501.0863 null] +>> endobj +3381 0 obj << +/D [3371 0 R /XYZ 181.5683 489.4305 null] +>> endobj +3382 0 obj << +/D [3371 0 R /XYZ 71.731 479.3683 null] +>> endobj +3383 0 obj << +/D [3371 0 R /XYZ 71.731 447.7967 null] +>> endobj +3384 0 obj << +/D [3371 0 R /XYZ 71.731 434.8353 null] +>> endobj +3385 0 obj << +/D [3371 0 R /XYZ 71.731 433.59 null] +>> endobj +3386 0 obj << +/D [3371 0 R /XYZ 129.5143 414.5114 null] +>> endobj +3387 0 obj << +/D [3371 0 R /XYZ 129.5143 414.5114 null] +>> endobj +3388 0 obj << +/D [3371 0 R /XYZ 71.731 413.0719 null] +>> endobj +3389 0 obj << +/D [3371 0 R /XYZ 71.731 413.0719 null] +>> endobj +3390 0 obj << +/D [3371 0 R /XYZ 139.477 396.5787 null] +>> endobj +3391 0 obj << +/D [3371 0 R /XYZ 139.477 396.5787 null] +>> endobj +3392 0 obj << +/D [3371 0 R /XYZ 76.7123 378.6459 null] +>> endobj +3393 0 obj << +/D [3371 0 R /XYZ 129.5143 360.7132 null] +>> endobj +3394 0 obj << +/D [3371 0 R /XYZ 129.5143 360.7132 null] +>> endobj +3395 0 obj << +/D [3371 0 R /XYZ 71.731 358.5564 null] +>> endobj +3396 0 obj << +/D [3371 0 R /XYZ 71.731 358.5564 null] +>> endobj +3397 0 obj << +/D [3371 0 R /XYZ 139.477 342.7804 null] +>> endobj +3398 0 obj << +/D [3371 0 R /XYZ 71.731 341.3409 null] +>> endobj +3399 0 obj << +/D [3371 0 R /XYZ 139.477 324.8477 null] +>> endobj +3400 0 obj << +/D [3371 0 R /XYZ 71.731 286.9896 null] +>> endobj +3401 0 obj << +/D [3371 0 R /XYZ 71.731 273.9387 null] +>> endobj +3402 0 obj << +/D [3371 0 R /XYZ 71.731 272.6933 null] +>> endobj +3403 0 obj << +/D [3371 0 R /XYZ 129.5143 253.6148 null] +>> endobj +788 0 obj << +/D [3371 0 R /XYZ 71.731 247.1939 null] +>> endobj +270 0 obj << +/D [3371 0 R /XYZ 232.4867 203.3792 null] +>> endobj +3404 0 obj << +/D [3371 0 R /XYZ 71.731 183.2388 null] +>> endobj +3405 0 obj << +/D [3371 0 R /XYZ 161.0655 170.5025 null] +>> endobj +3406 0 obj << +/D [3371 0 R /XYZ 71.731 158.383 null] +>> endobj +3407 0 obj << +/D [3371 0 R /XYZ 71.731 127.3534 null] +>> endobj +3408 0 obj << +/D [3371 0 R /XYZ 168.8063 116.0068 null] +>> endobj +3370 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3411 0 obj << +/Length 1058 +/Filter /FlateDecode +>> +stream +xÚÅWQœ6~¿_Á[v¥àbccÈÛ5i«TMuJ¶OMuò/‹Â +L·÷ï3›…Å «ªJuÒ­ßx>3ž°Àö8F<„’ 1⥇»Àû¯~¹ÃâŒ?ý¸»ûáç0ð”D$òvÏ^˜Dˆqêñ ˜áØÛenÞîÅQÉzëlê +QJõ›xêïÞ÷‹Rí«¬Ùþµûõî§ÝàŸ…%18Y$9 æ4IâÅ@3¢š&†· ÓÐãAŒBòŽçûrKƒÍß[Â6¢È3¡dÓsR{Ù/Ò¶®e©ú‡F6M^•HS÷>ŽPò¨Ûê£Tm]sÜÿäÏÆ®MS0}n‹Î´£vVÐ7K_+È£žÙ}QTšÖIfý«B6oóóɬ5Á(ÂqÒY‹ì—¯{ÃcnmãšG%Ó½Y–U&o%ö°Å V-ÜG cЙaî±8D BgÔ”?†Ù¨ADy€»¨ÍvÓ>Âf~ °bâô{ù{æa­æ<Âؕ=¢U{‡l„¢@{А7&TݦêõEâk{È­< +²jŒlk9? ¥1вÎ)¬EùcØYX¬oôä@vUX~@hâô{]Xk5ç16Lå|JÃ\3‡´4@˜&t&n^~1â~2¶ÝÃ×-6R'ìËu9iŒJã59G°%9-l]N‡ß[ä¼äá–sLãÒ¬¯±E”0ʗ½wdé¡ß®¯#ÕP^Œ…(´î'ýO¼˜Šøj˘ ì«®~ú\7¢k@€â¢:*£×ë +³žVêʶPWØj]qù½¡®¸xœÕòfÂ#/m©¸ÚGL$G³.ø>ãˆÇaØ JBÖ_&]A7`oÞÉŠö§\¹Š=å(&¿(öu¥*õr”·6ž‘‹Žñ瀺̙ó4ðâ1Ï«ú±¨¾äåã“h$`ð­ÝçlÒ:?êL\¢BjE¤§ôAÔ_M^šìí*Â?y£ Éϼ ÆäkÖ$3£ËΎ"M«¶TT™¸eu, â´7÷AÔÒvWeoÍá zæÔV˜—…YV¥±¬àæÕv“Ò7œ†étgQߊÎ8åEa¯ac¨<™w-….‰ÙÒa‡i 1{xû‡]ŠÒX5EžÚ9I4M•æBÙO9´Äéå¢f iÇ[¼é|ÿë™Êð{îêM[ ÁÑâòF~ϙ뿞¢pé]©vcØBµ`«ÕÎå÷†j7ãអ&<þŸ) +C‡„Ðñ•¶?†-´ý¶Úö]~ohû3ζ?¡ñýÚþõìÅq’µìÁ–²×ÂÖ³×á÷–ì½äq%{Ç<œÍ!8Æ Ñ(J¦Šçö˲ªÇ!¸<˜ù‡èÆ8J?ÖG˜ù·:#0â$vÒT½úåípø ñ˜Ñendstream +endobj +3410 0 obj << +/Type /Page +/Contents 3411 0 R +/Resources 3409 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3412 0 obj << +/D [3410 0 R /XYZ 71.731 729.2652 null] +>> endobj +3413 0 obj << +/D [3410 0 R /XYZ 71.731 718.3063 null] +>> endobj +3414 0 obj << +/D [3410 0 R /XYZ 71.731 671.6912 null] +>> endobj +3415 0 obj << +/D [3410 0 R /XYZ 181.5683 658.8294 null] +>> endobj +3416 0 obj << +/D [3410 0 R /XYZ 71.731 648.7672 null] +>> endobj +3417 0 obj << +/D [3410 0 R /XYZ 71.731 615.344 null] +>> endobj +3418 0 obj << +/D [3410 0 R /XYZ 71.731 604.2342 null] +>> endobj +3419 0 obj << +/D [3410 0 R /XYZ 71.731 602.9889 null] +>> endobj +3420 0 obj << +/D [3410 0 R /XYZ 129.5143 583.9103 null] +>> endobj +3421 0 obj << +/D [3410 0 R /XYZ 129.5143 583.9103 null] +>> endobj +3422 0 obj << +/D [3410 0 R /XYZ 71.731 582.4708 null] +>> endobj +3423 0 obj << +/D [3410 0 R /XYZ 71.731 582.4708 null] +>> endobj +3424 0 obj << +/D [3410 0 R /XYZ 139.477 565.9776 null] +>> endobj +3425 0 obj << +/D [3410 0 R /XYZ 139.477 565.9776 null] +>> endobj +3426 0 obj << +/D [3410 0 R /XYZ 71.731 563.8207 null] +>> endobj +3427 0 obj << +/D [3410 0 R /XYZ 139.477 548.0448 null] +>> endobj +3428 0 obj << +/D [3410 0 R /XYZ 139.477 548.0448 null] +>> endobj +3429 0 obj << +/D [3410 0 R /XYZ 71.731 510.1868 null] +>> endobj +3430 0 obj << +/D [3410 0 R /XYZ 71.731 497.1358 null] +>> endobj +3431 0 obj << +/D [3410 0 R /XYZ 71.731 495.8905 null] +>> endobj +3432 0 obj << +/D [3410 0 R /XYZ 129.5143 476.8119 null] +>> endobj +789 0 obj << +/D [3410 0 R /XYZ 71.731 470.3911 null] +>> endobj +274 0 obj << +/D [3410 0 R /XYZ 198.0388 426.5763 null] +>> endobj +3433 0 obj << +/D [3410 0 R /XYZ 71.731 406.4359 null] +>> endobj +3434 0 obj << +/D [3410 0 R /XYZ 161.0655 393.6996 null] +>> endobj +3435 0 obj << +/D [3410 0 R /XYZ 71.731 381.5801 null] +>> endobj +3436 0 obj << +/D [3410 0 R /XYZ 71.731 350.2143 null] +>> endobj +3437 0 obj << +/D [3410 0 R /XYZ 168.8063 339.204 null] +>> endobj +3438 0 obj << +/D [3410 0 R /XYZ 71.731 312.1405 null] +>> endobj +3439 0 obj << +/D [3410 0 R /XYZ 71.731 284.7079 null] +>> endobj +3440 0 obj << +/D [3410 0 R /XYZ 71.731 253.1263 null] +>> endobj +3441 0 obj << +/D [3410 0 R /XYZ 181.5683 241.4705 null] +>> endobj +3442 0 obj << +/D [3410 0 R /XYZ 71.731 231.4083 null] +>> endobj +3443 0 obj << +/D [3410 0 R /XYZ 71.731 199.8367 null] +>> endobj +3444 0 obj << +/D [3410 0 R /XYZ 71.731 186.8753 null] +>> endobj +3445 0 obj << +/D [3410 0 R /XYZ 71.731 185.63 null] +>> endobj +3446 0 obj << +/D [3410 0 R /XYZ 129.5143 166.5514 null] +>> endobj +3447 0 obj << +/D [3410 0 R /XYZ 129.5143 166.5514 null] +>> endobj +3448 0 obj << +/D [3410 0 R /XYZ 71.731 165.1119 null] +>> endobj +3449 0 obj << +/D [3410 0 R /XYZ 71.731 165.1119 null] +>> endobj +3450 0 obj << +/D [3410 0 R /XYZ 139.477 148.6187 null] +>> endobj +3451 0 obj << +/D [3410 0 R /XYZ 139.477 148.6187 null] +>> endobj +3452 0 obj << +/D [3410 0 R /XYZ 76.7123 130.6859 null] +>> endobj +3453 0 obj << +/D [3410 0 R /XYZ 129.5143 112.7532 null] +>> endobj +3454 0 obj << +/D [3410 0 R /XYZ 129.5143 112.7532 null] +>> endobj +3455 0 obj << +/D [3410 0 R /XYZ 71.731 110.5963 null] +>> endobj +3456 0 obj << +/D [3410 0 R /XYZ 71.731 110.5963 null] +>> endobj +3409 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3459 0 obj << +/Length 1040 +/Filter /FlateDecode +>> +stream +xڝW]£6}Ÿ_Ác"M\Ûà¯yËî¶ÕV­4ÚMŸ:Պ²A"òÑéüû^Ç@ 8€Vó3s|ϹÇ××âaø!ž Høð  +Q؝°÷þõëi!»³³A?ýâcO!Å)÷GÏW1x§H2"½Cü×æã)¼ÔI¹ÝQ†7™çsæIý{øj~Ý?6/$õ©ˆ«í߇ß~>ôüÌHI ™`‰.}oG1R”0'Š@F@ Àû/úd¨ò":QH¦Çõ0Í ¥l¬Ž@º˜ʳv¼ãçMG·Ê©ãf*ñ +„ÊHóúÑ8ö5­ó–ÆI^§/Sp{,±K†+Œ‚Õ‚56lƚ¶h‹w…5.Sk2ªºLóïwª,Ú×K™h—þÓb âQ93Œ$VÁ5ȗ¤nʼzšähÆP ’¸}ìP;vóQ l|œD»ë#¥°ù„:yïûØ­rê°|ì÷ÓÖq«1Òرµ²‰¢¤ªŽM¦eB,Ð'œ·@Û1„ô¡Ôg¦`)â׳/äæS’%uòUïǾ†ÍzÝR¼i`ŸL0[X ¤|Ô Epê¹,ê¢~¿$Oý + +ø•½]»£q"MEÜ%¼fó‚›úôhÕÉ·ÐÆ}Kc‡¾]Ggëû”TQ™^ê´ÈçúÐ+9µVFA}êJö’Dæ<Ǔ.ÊþO[Ê6ÿn ÛtMv ]«AL~åØÐҞÃwóR&ÿ4i™ŒÄDa–uuaž§P‡0Ü-u{²N£& Ûe‘uM*ïôÇãh¯-$¾š·7şURŽyönc» l:ãþ5ÅБbq´|¬æŒ-x;¥Ñéf@Zþ°ó霜_aYw½}^”<Ý©(âÊt¦Ý*h‚Õã0ҏf¶Ïi>NnmJan,3c›¾z GÜÜnÎ ½©Mø¸%@Üdu§Ò,ßÒÊŒ5çyŸe…–õÖÃ/PÍÕÚæjÃZ-—´}i*sE¯¡Ön„ex‹Ë™ Æ"ą 7’ ›¹‘zØâäâ]q#MtøÒr²¿‘:t›vØF„5ƒ†<µeP—MÔ]_ýt©×ë) +us¶‘M™Ü™(ÜB"àK#“ ›™zØâÈäâ]12Mt mG¦Œ=øb&o‡» N^CýØßېµwØz6á ªþ~õBKÕkÁ檷ƒ-W¯ƒwMõŽuÜ©^[‡=Y˜©Âá¶RˆK>4Ûöo=3œN2ãŒ!\ Geq¸%LêYÁ_Ø 6³=lq3\¼+6Ã¥Ã1Üt¬nm™í7p ŒQjö3ÙÂL¿’•Ð¯”ê#i=ŒÝýæuþzŽ´™endstream +endobj +3458 0 obj << +/Type /Page +/Contents 3459 0 R +/Resources 3457 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3460 0 obj << +/D [3458 0 R /XYZ 71.731 729.2652 null] +>> endobj +3461 0 obj << +/D [3458 0 R /XYZ 71.731 741.2204 null] +>> endobj +3462 0 obj << +/D [3458 0 R /XYZ 139.477 708.3437 null] +>> endobj +3463 0 obj << +/D [3458 0 R /XYZ 71.731 706.9041 null] +>> endobj +3464 0 obj << +/D [3458 0 R /XYZ 139.477 690.4109 null] +>> endobj +3465 0 obj << +/D [3458 0 R /XYZ 71.731 652.5529 null] +>> endobj +3466 0 obj << +/D [3458 0 R /XYZ 71.731 639.5019 null] +>> endobj +3467 0 obj << +/D [3458 0 R /XYZ 71.731 638.2566 null] +>> endobj +3468 0 obj << +/D [3458 0 R /XYZ 129.5143 619.1781 null] +>> endobj +790 0 obj << +/D [3458 0 R /XYZ 71.731 612.7572 null] +>> endobj +278 0 obj << +/D [3458 0 R /XYZ 278.038 568.9424 null] +>> endobj +3469 0 obj << +/D [3458 0 R /XYZ 71.731 548.8021 null] +>> endobj +3470 0 obj << +/D [3458 0 R /XYZ 161.0655 536.0657 null] +>> endobj +3471 0 obj << +/D [3458 0 R /XYZ 71.731 523.9463 null] +>> endobj +3472 0 obj << +/D [3458 0 R /XYZ 71.731 492.9166 null] +>> endobj +3473 0 obj << +/D [3458 0 R /XYZ 168.8063 481.5701 null] +>> endobj +3474 0 obj << +/D [3458 0 R /XYZ 71.731 454.5067 null] +>> endobj +3475 0 obj << +/D [3458 0 R /XYZ 71.731 423.1408 null] +>> endobj +3476 0 obj << +/D [3458 0 R /XYZ 71.731 383.1906 null] +>> endobj +3477 0 obj << +/D [3458 0 R /XYZ 71.731 352.2546 null] +>> endobj +3478 0 obj << +/D [3458 0 R /XYZ 181.5683 340.5987 null] +>> endobj +3479 0 obj << +/D [3458 0 R /XYZ 71.731 330.5366 null] +>> endobj +3480 0 obj << +/D [3458 0 R /XYZ 71.731 297.1134 null] +>> endobj +3481 0 obj << +/D [3458 0 R /XYZ 71.731 286.0036 null] +>> endobj +3482 0 obj << +/D [3458 0 R /XYZ 71.731 284.7582 null] +>> endobj +3483 0 obj << +/D [3458 0 R /XYZ 129.5143 265.6797 null] +>> endobj +3484 0 obj << +/D [3458 0 R /XYZ 129.5143 265.6797 null] +>> endobj +3485 0 obj << +/D [3458 0 R /XYZ 71.731 264.2401 null] +>> endobj +3486 0 obj << +/D [3458 0 R /XYZ 71.731 264.2401 null] +>> endobj +3487 0 obj << +/D [3458 0 R /XYZ 139.477 247.7469 null] +>> endobj +3488 0 obj << +/D [3458 0 R /XYZ 139.477 247.7469 null] +>> endobj +3489 0 obj << +/D [3458 0 R /XYZ 76.7123 229.8142 null] +>> endobj +3490 0 obj << +/D [3458 0 R /XYZ 129.5143 211.8814 null] +>> endobj +3491 0 obj << +/D [3458 0 R /XYZ 129.5143 211.8814 null] +>> endobj +3492 0 obj << +/D [3458 0 R /XYZ 71.731 190.5166 null] +>> endobj +3493 0 obj << +/D [3458 0 R /XYZ 71.731 178.9052 null] +>> endobj +3494 0 obj << +/D [3458 0 R /XYZ 71.731 177.6599 null] +>> endobj +3495 0 obj << +/D [3458 0 R /XYZ 129.5143 158.5813 null] +>> endobj +791 0 obj << +/D [3458 0 R /XYZ 71.731 152.1604 null] +>> endobj +3457 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3498 0 obj << +/Length 943 +/Filter /FlateDecode +>> +stream +xÚÍWю›8}Ÿ¯à1‘ŠkŒMßf·ª«ÝÕ¨Í[§Š(q$#c4Ú¿ßëØ“˜§Õj<ã{Ïµ/$ÂðG"NO` 9¢£Qy|ÀÑ/xõù8Hì0±úmóðþ)ÁQŽòŒfÑf%y†O#žP$Ñf÷}õû¡xÕR­cÊðŠ";>×E#õŸÅOûóñù‹ýç/©í®[ÿØüñði3æg G¹€$7IŽ¨kš”D„#JXjx+Æ ñ”óMŠ²ÄãbõQÖRËouUÊG­UõsMñª×r³ÎðêŸWiØAÈÜ[yʑ ˜G±Y9ÏlÈgÕêVÄã 3²77¦eDä§ ó‰…M|Òè3\ôúðÎþ,|äÖ¤ÛV»m«¶Mq”€%ºñÝ§ûQv¥ª^uÕ6·'°Çõ w–ˆ>8‚Ý«,«Œ©Ü¹fE¶È¤½‹Iêóìó«Ô½j\Lb‡jïõe)»nß×nñû5˜}­¾ê­êlè{VýX×횲ÕÛ@ök[ËîÞ+vǪ¹7Õóš°U¡`[ l +ßä„äˆ1£”q”ðœM>¢bfMžGPÃà:š¡ðB)»ÊK)JRBƒy/Ç3aÖ5Dxª(EFÒdÊÃø7 M6 äƒÛr­úR¿»8'Ì|Ùèª,Œ]}d¯äõ +IŽÒ4K¨؇…%æȘ,h€Í + ›išóÎ ;̺æ1Ö¼…ÃkBãt±gh@]U–Âñ|©oÕüô Èz´ál‰·vì;9ï^œ &°Xr¯»åÞ¶ìÞ@Þ{Ü{Écƽ>{ˆŽÛ€èÎË\dtªzÕhw`)f›{'Ȃs}Ø çŽ°Eç†òÞáÜ_ëÜ PęðÛÌmá,8ރÕÎXõtϨyá2Ž8aK%ïÃn 7À–… ä½G¸€p>Iß«Ý`VÈ á)„ŠFç©Ï_Q:½TP¶Pä>ìF‘°Å"å½£ÈC<é-c¸æ¸H¬ 4acw™^w—OÊlO{ü»ÝÉî¿è*ŸÔ,ÔIžÚ4ï4s˜àžÚN›7Ûºêôÿ®·ÜÃê–àf1ûù²¿DŸcU݀wuÑumYzôVAcߜ#ŠÙQ*Õ*¨°}ɩۅÍaîÂV§J“;tiy÷’ +$H–ßü(ó0×ßdŒ‚‰\\ÊdeÙìV á¿Há\ªendstream +endobj +3497 0 obj << +/Type /Page +/Contents 3498 0 R +/Resources 3496 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3499 0 obj << +/D [3497 0 R /XYZ 71.731 729.2652 null] +>> endobj +3500 0 obj << +/D [3497 0 R /XYZ 71.731 741.2204 null] +>> endobj +282 0 obj << +/D [3497 0 R /XYZ 317.1857 705.7477 null] +>> endobj +3501 0 obj << +/D [3497 0 R /XYZ 71.731 682.2589 null] +>> endobj +3502 0 obj << +/D [3497 0 R /XYZ 161.0655 672.871 null] +>> endobj +3503 0 obj << +/D [3497 0 R /XYZ 71.731 660.7515 null] +>> endobj +3504 0 obj << +/D [3497 0 R /XYZ 71.731 574.89 null] +>> endobj +3505 0 obj << +/D [3497 0 R /XYZ 71.731 543.954 null] +>> endobj +3506 0 obj << +/D [3497 0 R /XYZ 181.5683 532.2981 null] +>> endobj +3507 0 obj << +/D [3497 0 R /XYZ 71.731 522.236 null] +>> endobj +3508 0 obj << +/D [3497 0 R /XYZ 71.731 490.6644 null] +>> endobj +3509 0 obj << +/D [3497 0 R /XYZ 71.731 477.703 null] +>> endobj +3510 0 obj << +/D [3497 0 R /XYZ 71.731 476.4576 null] +>> endobj +3511 0 obj << +/D [3497 0 R /XYZ 129.5143 457.3791 null] +>> endobj +3512 0 obj << +/D [3497 0 R /XYZ 129.5143 457.3791 null] +>> endobj +3513 0 obj << +/D [3497 0 R /XYZ 71.731 455.9395 null] +>> endobj +3514 0 obj << +/D [3497 0 R /XYZ 71.731 455.9395 null] +>> endobj +3515 0 obj << +/D [3497 0 R /XYZ 139.477 439.4463 null] +>> endobj +3516 0 obj << +/D [3497 0 R /XYZ 139.477 439.4463 null] +>> endobj +3517 0 obj << +/D [3497 0 R /XYZ 76.7123 421.5136 null] +>> endobj +3518 0 obj << +/D [3497 0 R /XYZ 129.5143 403.5808 null] +>> endobj +3519 0 obj << +/D [3497 0 R /XYZ 129.5143 403.5808 null] +>> endobj +3520 0 obj << +/D [3497 0 R /XYZ 71.731 401.424 null] +>> endobj +3521 0 obj << +/D [3497 0 R /XYZ 71.731 401.424 null] +>> endobj +3522 0 obj << +/D [3497 0 R /XYZ 139.477 385.6481 null] +>> endobj +3523 0 obj << +/D [3497 0 R /XYZ 71.731 383.4913 null] +>> endobj +3524 0 obj << +/D [3497 0 R /XYZ 139.477 367.7153 null] +>> endobj +3525 0 obj << +/D [3497 0 R /XYZ 71.731 329.8573 null] +>> endobj +3526 0 obj << +/D [3497 0 R /XYZ 71.731 316.8063 null] +>> endobj +3527 0 obj << +/D [3497 0 R /XYZ 71.731 315.561 null] +>> endobj +3528 0 obj << +/D [3497 0 R /XYZ 129.5143 296.4825 null] +>> endobj +792 0 obj << +/D [3497 0 R /XYZ 71.731 290.0616 null] +>> endobj +286 0 obj << +/D [3497 0 R /XYZ 301.9676 246.2468 null] +>> endobj +3529 0 obj << +/D [3497 0 R /XYZ 71.731 226.1065 null] +>> endobj +3530 0 obj << +/D [3497 0 R /XYZ 161.0655 213.3701 null] +>> endobj +3531 0 obj << +/D [3497 0 R /XYZ 71.731 201.2507 null] +>> endobj +3532 0 obj << +/D [3497 0 R /XYZ 71.731 170.221 null] +>> endobj +3533 0 obj << +/D [3497 0 R /XYZ 168.8063 158.8745 null] +>> endobj +3534 0 obj << +/D [3497 0 R /XYZ 71.731 131.8111 null] +>> endobj +3496 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3538 0 obj << +/Length 1020 +/Filter /FlateDecode +>> +stream +xÚÍW]o¤6}ϯàqF +®?06û–v»«TmeGêÃfÑf‰@ +FÑþû^cØÁ´OU ñïáøsM $ š sì_opð}¾!ZLè‚~ÞÝüô‰á AILã`w X#.¢@0Š$'2ؾn~9¥o*«·!åxC‘¹>i™©ßÓ¿Ì¿w÷ææLªC³ý¶ûíæ×ÝPŸ3 EfI¨)MšhƑ¦Ià)' –ˆELt<Ÿ2ÕÖecxsɏæÚ´û}Ö4Ƕ¸5?·oÒ¶P_©SV¿çM†4õ®ÞY–ÐކZ›rwEQm)ß¼g3ÅSUd͇aø™n?š™t£ÓÃk^Z.o¹½iyeùÇ-ᛴN_3XSÖœˆÄ#‰Ä+ø€ +]X/8,†À¤|2›¦ðL)ŸÔ¥V„PoÝËë™G?jʃIߏx¤­:yd£º‚†|°6Pu»W·žÕã³RåûTåUé"Û:›¾ ¥À%…å¼â亰³°D‡Ñ}¡vUXX|L£Ä[÷º°ý¨)±°,A‘cw ‹É³G]£8‚­âRß¼üÞëë‘õÕL×Ý«jpýU÷ò(F"JĂ{]،{Ø¢{}uW¸wÂÃïޏ¦È÷ÙK~x©ê—âìÑZJÄc!ÇZ祲[WíŠݯT"Iâdɯlί=lÙ¯žºküêáqVdð«K±Öû¢5µ2´Ÿ1¦foõkC0’2Z̲›Ó¦‡-kã©»F6.Q2yzÇyÓ [¨\JŸ ›Iß[LŸ¯îŠôMxøÓ7âQV‡>|§ªQZŽ—"o”'…„Á÷Ç[^Z×éÄãKfÄ’/%Ӆ͸o€-ºÏWw…û|<¦îÑ8'óôþÁŒ`6ÂÙR0]؜4=lYOÝ5Òxxx¤qiŒ‚ù©- +k¦¿Û´0êØÏeoOÍj´”ë= BŽîvÀכAC.)f va3`‹öÕ]hGÎ~YG<ÎV»z°Ù~Q»Ý!» +Ɍ ”ñ¸› š!®ftÚÝÎy_6*fºQDIŠÅE¿^WªR?Þ²µ'„«»·yÆë¾õ¶ßr<#k³f_çozØ1瘺Äì¹)µâ:Ü)YøA™ƒ¬pÛ(‡ov7ן[B¡S|z¸øl7ÔÝ)·s¿çEaîö©nM×x²7Mc(Ñï½i?¤cԌªaêɁž–‰øvšteñÑL+ןô£‹þitÐçT€µ fÒ¸¸zl÷ü*PȄendstream +endobj +3537 0 obj << +/Type /Page +/Contents 3538 0 R +/Resources 3536 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3539 0 obj << +/D [3537 0 R /XYZ 71.731 729.2652 null] +>> endobj +3540 0 obj << +/D [3537 0 R /XYZ 71.731 741.2204 null] +>> endobj +3541 0 obj << +/D [3537 0 R /XYZ 71.731 718.3063 null] +>> endobj +3542 0 obj << +/D [3537 0 R /XYZ 71.731 631.9816 null] +>> endobj +3543 0 obj << +/D [3537 0 R /XYZ 71.731 620.8718 null] +>> endobj +3544 0 obj << +/D [3537 0 R /XYZ 71.731 619.6265 null] +>> endobj +3545 0 obj << +/D [3537 0 R /XYZ 129.5143 600.5479 null] +>> endobj +3546 0 obj << +/D [3537 0 R /XYZ 129.5143 600.5479 null] +>> endobj +3547 0 obj << +/D [3537 0 R /XYZ 71.731 599.1084 null] +>> endobj +3548 0 obj << +/D [3537 0 R /XYZ 71.731 599.1084 null] +>> endobj +3549 0 obj << +/D [3537 0 R /XYZ 139.477 582.6152 null] +>> endobj +3550 0 obj << +/D [3537 0 R /XYZ 139.477 582.6152 null] +>> endobj +3551 0 obj << +/D [3537 0 R /XYZ 76.7123 564.6824 null] +>> endobj +3552 0 obj << +/D [3537 0 R /XYZ 129.5143 546.7497 null] +>> endobj +3553 0 obj << +/D [3537 0 R /XYZ 129.5143 546.7497 null] +>> endobj +3554 0 obj << +/D [3537 0 R /XYZ 71.731 544.5928 null] +>> endobj +3555 0 obj << +/D [3537 0 R /XYZ 71.731 544.5928 null] +>> endobj +3556 0 obj << +/D [3537 0 R /XYZ 139.477 528.8169 null] +>> endobj +3557 0 obj << +/D [3537 0 R /XYZ 71.731 527.3774 null] +>> endobj +3558 0 obj << +/D [3537 0 R /XYZ 139.477 510.8842 null] +>> endobj +3559 0 obj << +/D [3537 0 R /XYZ 76.7123 492.9514 null] +>> endobj +3560 0 obj << +/D [3537 0 R /XYZ 129.5143 475.0187 null] +>> endobj +3561 0 obj << +/D [3537 0 R /XYZ 129.5143 475.0187 null] +>> endobj +3562 0 obj << +/D [3537 0 R /XYZ 71.731 472.8618 null] +>> endobj +3563 0 obj << +/D [3537 0 R /XYZ 71.731 472.8618 null] +>> endobj +3564 0 obj << +/D [3537 0 R /XYZ 139.477 457.0859 null] +>> endobj +3565 0 obj << +/D [3537 0 R /XYZ 71.731 455.6464 null] +>> endobj +3566 0 obj << +/D [3537 0 R /XYZ 139.477 439.1532 null] +>> endobj +3567 0 obj << +/D [3537 0 R /XYZ 71.731 401.2951 null] +>> endobj +3568 0 obj << +/D [3537 0 R /XYZ 71.731 388.2442 null] +>> endobj +3569 0 obj << +/D [3537 0 R /XYZ 71.731 386.9988 null] +>> endobj +3570 0 obj << +/D [3537 0 R /XYZ 129.5143 367.9203 null] +>> endobj +793 0 obj << +/D [3537 0 R /XYZ 71.731 361.4994 null] +>> endobj +290 0 obj << +/D [3537 0 R /XYZ 309.0082 317.6847 null] +>> endobj +3571 0 obj << +/D [3537 0 R /XYZ 71.731 297.5443 null] +>> endobj +3572 0 obj << +/D [3537 0 R /XYZ 161.0655 284.8079 null] +>> endobj +3573 0 obj << +/D [3537 0 R /XYZ 71.731 272.6885 null] +>> endobj +3574 0 obj << +/D [3537 0 R /XYZ 71.731 241.6588 null] +>> endobj +3575 0 obj << +/D [3537 0 R /XYZ 168.8063 230.3123 null] +>> endobj +3576 0 obj << +/D [3537 0 R /XYZ 71.731 203.2489 null] +>> endobj +3577 0 obj << +/D [3537 0 R /XYZ 71.731 173.7346 null] +>> endobj +3578 0 obj << +/D [3537 0 R /XYZ 71.731 157.097 null] +>> endobj +3579 0 obj << +/D [3537 0 R /XYZ 71.731 124.3094 null] +>> endobj +3580 0 obj << +/D [3537 0 R /XYZ 181.5683 112.6535 null] +>> endobj +3536 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3583 0 obj << +/Length 1026 +/Filter /FlateDecode +>> +stream +xÚÍXM¤6½Ï¯àØ-m;þ¶™Û$›D%ÒhÓ9e¢K3ÛH4´€Öhÿ} +°Á4æã°R¢9@×ó«çª$ÀðGEbp¡!¢RÐ ¾<àà+<úõÈÁ`.èÇãÿ0„(”TÇ·€… ÅÅ(҂èàxú{÷Ó9ºÖI¹?Pwu×ç,ʓú÷èK÷óéùSwóGRŸ‹SµÿçøÛÃÏÇ>¾` +…‚,’ìQSš4 4Д¼¡Ià© œ +kÄ8S-ÏètIó&p‹6u0·‡fSJvàç=»¨Œ. l­z¼çKDDR„9“^¾=êàÂ,_؋¤å;Y­¡ðB©˜Ä¥6D¨7îýuàaߚò`ڧۈGt«ÏÙ(G¸‰Ð@»äVuy‹ëw)oÞOò:£:-ry+“é-È5!Xû…µ¨ƒ „%—G²°Ya!ù˜òÐw^Xû֔ÇXX"®Ô˜ÆèҏºB"Éá¤Ýë›æ_­¾Y/Ýrí}]t×[•Ì»D¹`kîu`Kîµ°u÷zânqï=÷º<Ò¼ª#©Si*´¢ˆSÍ„þ3K㤻/f QÝ +4ð q8.$Ÿ°y¾PA)ùLÅràÂrÐÃVsà‹»!>ƒš}F<ÒÜbt|3âÝâ8©ª·[f2ü¢D´ =…”fpÊF”‰®Q$eÓd”Þ}L2(Ï]~¦™šbuW×Ë¢.êo×ä±cpm” ItؾàÆh9¿`›’fvT5O^ÓÓkQ¾æÐ.à1ÙÚd>&U\¦×ÆLKt4]I]:•9âgéº&qú‚1MN+ÔÚà M:ùþª Ÿ™j}ënŠ<3w§vyg -LÂÞÏi|‚C4/FebKÐå D°cÀ§ûXn„(wV°!†M9ñ£º˜šI£JA“„Âü/ړ¬ÉaM³u©²+ßcCOͱyOã4¨éLI·,¬œ +³½·=iÚhV[ò@µ|O«né-N{ʲbOÅîÝäs‘%ÕÖ3ÐNN†Ë5ýÐ÷•ò{OSKD0ôîåZèÂja[­…¾¸jᄇ¿xü7Óц"ÌW¦)¶0Mõ°ÕiÊwÃ45áᝦF4þÓ` ÌõŠ{]؂{{ت{}q7¸wÂÃïޏûnçÑ’"¤Òc­aWêNüy¿2Ž˜¢dͯlɯ¶îWOÜ-~õðp†"ëW—Æ0¹óå©ñ`ÛÈËym p²5mؒ6¶®'îm<<<Ú¸4æÆoë8—žùpÁ5‚ '\ü¶á`¦Ÿ6ÕPÃ°_©!"ôì‡ +OÀ—Ú!endstream +endobj +3582 0 obj << +/Type /Page +/Contents 3583 0 R +/Resources 3581 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3584 0 obj << +/D [3582 0 R /XYZ 71.731 729.2652 null] +>> endobj +3585 0 obj << +/D [3582 0 R /XYZ 71.731 718.3063 null] +>> endobj +3586 0 obj << +/D [3582 0 R /XYZ 71.731 675.3674 null] +>> endobj +3587 0 obj << +/D [3582 0 R /XYZ 71.731 674.1221 null] +>> endobj +3588 0 obj << +/D [3582 0 R /XYZ 129.5143 655.0436 null] +>> endobj +3589 0 obj << +/D [3582 0 R /XYZ 129.5143 655.0436 null] +>> endobj +3590 0 obj << +/D [3582 0 R /XYZ 71.731 653.604 null] +>> endobj +3591 0 obj << +/D [3582 0 R /XYZ 71.731 653.604 null] +>> endobj +3592 0 obj << +/D [3582 0 R /XYZ 139.477 637.1108 null] +>> endobj +3593 0 obj << +/D [3582 0 R /XYZ 139.477 637.1108 null] +>> endobj +3594 0 obj << +/D [3582 0 R /XYZ 76.7123 619.1781 null] +>> endobj +3595 0 obj << +/D [3582 0 R /XYZ 129.5143 601.2453 null] +>> endobj +3596 0 obj << +/D [3582 0 R /XYZ 129.5143 601.2453 null] +>> endobj +3597 0 obj << +/D [3582 0 R /XYZ 71.731 579.1632 null] +>> endobj +3598 0 obj << +/D [3582 0 R /XYZ 71.731 568.2691 null] +>> endobj +3599 0 obj << +/D [3582 0 R /XYZ 71.731 567.0237 null] +>> endobj +3600 0 obj << +/D [3582 0 R /XYZ 129.5143 547.9452 null] +>> endobj +794 0 obj << +/D [3582 0 R /XYZ 71.731 541.5243 null] +>> endobj +294 0 obj << +/D [3582 0 R /XYZ 206.6635 497.7096 null] +>> endobj +3601 0 obj << +/D [3582 0 R /XYZ 71.731 477.5692 null] +>> endobj +3602 0 obj << +/D [3582 0 R /XYZ 161.0655 464.8329 null] +>> endobj +3603 0 obj << +/D [3582 0 R /XYZ 71.731 452.7134 null] +>> endobj +3604 0 obj << +/D [3582 0 R /XYZ 71.731 421.6837 null] +>> endobj +3605 0 obj << +/D [3582 0 R /XYZ 168.8063 410.3372 null] +>> endobj +3606 0 obj << +/D [3582 0 R /XYZ 71.731 383.2738 null] +>> endobj +3607 0 obj << +/D [3582 0 R /XYZ 71.731 351.9079 null] +>> endobj +3608 0 obj << +/D [3582 0 R /XYZ 71.731 323.614 null] +>> endobj +3609 0 obj << +/D [3582 0 R /XYZ 71.731 292.678 null] +>> endobj +3610 0 obj << +/D [3582 0 R /XYZ 181.5683 281.0222 null] +>> endobj +3611 0 obj << +/D [3582 0 R /XYZ 71.731 270.96 null] +>> endobj +3612 0 obj << +/D [3582 0 R /XYZ 71.731 237.5368 null] +>> endobj +3613 0 obj << +/D [3582 0 R /XYZ 71.731 226.427 null] +>> endobj +3614 0 obj << +/D [3582 0 R /XYZ 71.731 225.1816 null] +>> endobj +3615 0 obj << +/D [3582 0 R /XYZ 129.5143 206.1031 null] +>> endobj +3616 0 obj << +/D [3582 0 R /XYZ 129.5143 206.1031 null] +>> endobj +3617 0 obj << +/D [3582 0 R /XYZ 71.731 204.6636 null] +>> endobj +3618 0 obj << +/D [3582 0 R /XYZ 71.731 204.6636 null] +>> endobj +3619 0 obj << +/D [3582 0 R /XYZ 139.477 188.1704 null] +>> endobj +3620 0 obj << +/D [3582 0 R /XYZ 139.477 188.1704 null] +>> endobj +3621 0 obj << +/D [3582 0 R /XYZ 76.7123 170.2376 null] +>> endobj +3622 0 obj << +/D [3582 0 R /XYZ 129.5143 152.3048 null] +>> endobj +3623 0 obj << +/D [3582 0 R /XYZ 129.5143 152.3048 null] +>> endobj +3624 0 obj << +/D [3582 0 R /XYZ 71.731 150.148 null] +>> endobj +3625 0 obj << +/D [3582 0 R /XYZ 71.731 150.148 null] +>> endobj +3626 0 obj << +/D [3582 0 R /XYZ 139.477 134.3721 null] +>> endobj +3627 0 obj << +/D [3582 0 R /XYZ 71.731 132.9325 null] +>> endobj +3628 0 obj << +/D [3582 0 R /XYZ 139.477 116.4393 null] +>> endobj +3581 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3631 0 obj << +/Length 1257 +/Filter /FlateDecode +>> +stream +xÚµX]oÛ6}ϯð£ ÔI‰Ê[ÖmE‡ Š¼5C¡HL#À‘‰F‘?Ê"eJº…bC$ׇ<‡‡çò2&;lþ‘ H$æA3D9£»âõロ¯>Ý 9ZÌÑýúpóË Þe(ã”ïžwIÆéN$IFäî¡üºÿø’¿iÕŽ”á=EÃóþ”×Jÿ•? ïî?/+ýҔÝះ?o~ùY"P& ɪȵ”I3O&!bŒˆÀ%i".:¿(}nëîvÎ=¢¹4ÓSœ€Ü#êè÷ùÉ„{„õ܏”²/¥F¡ ïüyÕáF:<ŒCŒ¤ÉTGUëÃFáQ=Ïî\ªëžÏ§^¦™Ë舖ö“™@B&‰yÁˆ&Œ_&£ˆ‹~»…ÜRú®<¼/[3‹êì$¾ T I±ñ¯ÏŽàÞܷnôû›ºGH3‚_XíØ#%ˆ“ì‚¿ð8Ž‹ðGÌp~Ö/vYùðí·GŒé©OeŠ÷ö«ö²ÿ—oÔ©ìÌ@È<:V_æoª+ÚêMWM*3?mVUmŸm›¿¯3^·çB[\ÑÔ:¯êªþ>|.•ùxr“<5g=Y¥êlµ}~¬~Øc;A÷¦Šê²üÒÉ*§X§Y°Éž©Ärd‰ìèRÕz˜¸í¬ÙåÎýUNW>™#׺­žïÏZ“Ô§÷ق‡¯¹.^F—ô‹rYð—ý£:†·'å'@•W׀¥Íb´p¡q”±ðy²k²6Æñîtj”í8‚/ÍIu[“™—¯UmÕ¿UöåÜMjE«ÂUTݔj«°ûa&<ù«2»°rÒ&™@L²ÈAë¡VÎY‡Š³é†Sv."‘ž½ã!ë‹èO#À0š"ÜÏßCnýªø0k‘ýø¾ Š¼?o|ä¹UËÕ9"3¦æåPGv5•ô½² ºj¶Ó4yöºQKS_“ ¥BLeÜ_†ëà.㈧æf2÷×Î_ÀÖ×aº!òÍX áܦ‰éƒ\ƂëÁ֒ë`ñè¼[²;ׯ¯Ãµçêr’.‘gS§Æf®ÓV`{@0À”™;eËïµ_‹Š§wIº%¼KÞÅËe×ÓÛã‚ê¥a«p¥#ÑZ÷`kf9XÜ-€w‹]€À/_Æôdôï³N¿:LF¥!¡cAG4Ÿ+èOJ @p5쏵”1-ÓÔÈ0xMu•~‡›Œ`)ŽÁÙ½ ¼‰ö°Åâ½0ûÉXàìs¨£<]Ì4•{¦ oØT7 +ÔᅎØ4–‰ŽI¿øh†Í`)"¡f{õâŠZ³Â¢âN,I·±ùà‰fcÍW,D"ÊD¬ð<ÔJá9T¼ðÖ-…7—(<_‡ëÕæ[È¢še0k£„¦ÑÂó`kis°xÜÞ-yt@óuüL3t "Ò\w2qÇC­˜ãPQoÒ Ö"g|ÿÑÅÁI9b”GŠÓG…‹sDE‹bÝPœ pqNt͹Ö-ÔSŒd–ðÿ£1*˒X}ú°µ:X<ƒï–: ú:¦ÇÿÕdØ‚ç$fǵæ†EÅÍX’nñb)²Â퍰9öçõT"Ix¶ú ¼‡YþÏÌ®`’eãL½&–Nÿ&5r{endstream +endobj +3630 0 obj << +/Type /Page +/Contents 3631 0 R +/Resources 3629 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3632 0 obj << +/D [3630 0 R /XYZ 71.731 729.2652 null] +>> endobj +3633 0 obj << +/D [3630 0 R /XYZ 71.731 718.3063 null] +>> endobj +3634 0 obj << +/D [3630 0 R /XYZ 71.731 708.2442 null] +>> endobj +3635 0 obj << +/D [3630 0 R /XYZ 71.731 706.9988 null] +>> endobj +3636 0 obj << +/D [3630 0 R /XYZ 129.5143 687.9203 null] +>> endobj +795 0 obj << +/D [3630 0 R /XYZ 71.731 681.4994 null] +>> endobj +298 0 obj << +/D [3630 0 R /XYZ 231.3506 637.6847 null] +>> endobj +3637 0 obj << +/D [3630 0 R /XYZ 71.731 617.5443 null] +>> endobj +3638 0 obj << +/D [3630 0 R /XYZ 161.0655 604.8079 null] +>> endobj +3639 0 obj << +/D [3630 0 R /XYZ 71.731 592.6885 null] +>> endobj +3640 0 obj << +/D [3630 0 R /XYZ 71.731 561.6588 null] +>> endobj +3641 0 obj << +/D [3630 0 R /XYZ 168.8063 550.3123 null] +>> endobj +3642 0 obj << +/D [3630 0 R /XYZ 71.731 538.1928 null] +>> endobj +3643 0 obj << +/D [3630 0 R /XYZ 71.731 483.5144 null] +>> endobj +3644 0 obj << +/D [3630 0 R /XYZ 181.5683 472.5041 null] +>> endobj +3645 0 obj << +/D [3630 0 R /XYZ 71.731 462.4419 null] +>> endobj +3646 0 obj << +/D [3630 0 R /XYZ 71.731 429.0187 null] +>> endobj +3647 0 obj << +/D [3630 0 R /XYZ 71.731 417.9089 null] +>> endobj +3648 0 obj << +/D [3630 0 R /XYZ 71.731 416.6636 null] +>> endobj +3649 0 obj << +/D [3630 0 R /XYZ 129.5143 397.585 null] +>> endobj +3650 0 obj << +/D [3630 0 R /XYZ 129.5143 397.585 null] +>> endobj +3651 0 obj << +/D [3630 0 R /XYZ 71.731 396.1455 null] +>> endobj +3652 0 obj << +/D [3630 0 R /XYZ 71.731 396.1455 null] +>> endobj +3653 0 obj << +/D [3630 0 R /XYZ 139.477 379.6523 null] +>> endobj +3654 0 obj << +/D [3630 0 R /XYZ 139.477 379.6523 null] +>> endobj +3655 0 obj << +/D [3630 0 R /XYZ 76.7123 361.7195 null] +>> endobj +3656 0 obj << +/D [3630 0 R /XYZ 129.5143 343.7868 null] +>> endobj +3657 0 obj << +/D [3630 0 R /XYZ 129.5143 343.7868 null] +>> endobj +3658 0 obj << +/D [3630 0 R /XYZ 71.731 341.63 null] +>> endobj +3659 0 obj << +/D [3630 0 R /XYZ 71.731 341.63 null] +>> endobj +3660 0 obj << +/D [3630 0 R /XYZ 139.477 325.854 null] +>> endobj +3661 0 obj << +/D [3630 0 R /XYZ 71.731 323.6972 null] +>> endobj +3662 0 obj << +/D [3630 0 R /XYZ 139.477 307.9213 null] +>> endobj +3663 0 obj << +/D [3630 0 R /XYZ 71.731 306.4817 null] +>> endobj +3664 0 obj << +/D [3630 0 R /XYZ 71.731 306.4817 null] +>> endobj +3665 0 obj << +/D [3630 0 R /XYZ 149.4396 289.9885 null] +>> endobj +3666 0 obj << +/D [3630 0 R /XYZ 149.4396 289.9885 null] +>> endobj +3667 0 obj << +/D [3630 0 R /XYZ 71.731 287.8317 null] +>> endobj +3668 0 obj << +/D [3630 0 R /XYZ 71.731 287.8317 null] +>> endobj +3669 0 obj << +/D [3630 0 R /XYZ 159.4023 272.0558 null] +>> endobj +3670 0 obj << +/D [3630 0 R /XYZ 71.731 269.899 null] +>> endobj +3671 0 obj << +/D [3630 0 R /XYZ 159.4023 254.123 null] +>> endobj +3672 0 obj << +/D [3630 0 R /XYZ 76.7123 236.1903 null] +>> endobj +3673 0 obj << +/D [3630 0 R /XYZ 149.4396 218.2575 null] +>> endobj +3674 0 obj << +/D [3630 0 R /XYZ 149.4396 218.2575 null] +>> endobj +3675 0 obj << +/D [3630 0 R /XYZ 71.731 216.1007 null] +>> endobj +3676 0 obj << +/D [3630 0 R /XYZ 71.731 216.1007 null] +>> endobj +3677 0 obj << +/D [3630 0 R /XYZ 159.4023 200.3248 null] +>> endobj +3678 0 obj << +/D [3630 0 R /XYZ 71.731 198.8852 null] +>> endobj +3679 0 obj << +/D [3630 0 R /XYZ 159.4023 182.392 null] +>> endobj +3680 0 obj << +/D [3630 0 R /XYZ 76.7123 164.4593 null] +>> endobj +3681 0 obj << +/D [3630 0 R /XYZ 149.4396 146.5265 null] +>> endobj +3682 0 obj << +/D [3630 0 R /XYZ 149.4396 146.5265 null] +>> endobj +3683 0 obj << +/D [3630 0 R /XYZ 71.731 144.3697 null] +>> endobj +3684 0 obj << +/D [3630 0 R /XYZ 71.731 144.3697 null] +>> endobj +3685 0 obj << +/D [3630 0 R /XYZ 159.4023 128.5938 null] +>> endobj +3686 0 obj << +/D [3630 0 R /XYZ 71.731 126.4369 null] +>> endobj +3687 0 obj << +/D [3630 0 R /XYZ 159.4023 110.661 null] +>> endobj +3629 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3690 0 obj << +/Length 1230 +/Filter /FlateDecode +>> +stream +xÚ½™KoÛF…÷þ\Ú@5÷#»4h‹)`4Ú5E Hr"À• ‰.ߑȡ.É;s'jdAÊ9ä=üx)‘¢áñŸhœ`NŅ LZ#›õ?7¼ùÿë×ÑK½fE?-o~üEñ&°`¥m– +–§§$óFøf¹ùëöÝ×ÕS»=Þ-¤á·’uËûÇÕ~Û¾_}î>¾½ÿ­[ùcÛ~=lNw/¿ùy9Ì7ʱà㐢I<3Üظæã|­P•Pi皅 œiÁÃp,24Ž‰óqÆcI²Au>–Rš©7¡Eôæl÷—¦N—Wi«¹ å‘Z}±¡£Èuìãq·ßª³‘‹éë ˆt”>Ž8«ÞtLOíq·ÿÒ­úó°:Wßú?=Œd³£KóŒ<°B5™y@B0îÙS +J22·â}¼°§"×Sí “Â=…ª|OÙSljEOg6ðžŽ|œÚU»}ݞjã˜ô†ê)”b8ÈÈbs+bˆù@b8ò1Ê܇ â´§ãáN˜Ûwûõ6Ï)æFIÕÊJœ’Œæ„Ì­á„øÀ8AT]¿]jWL{Kµ¨ +­M*ºµÈԚÖNmdZ }<boׇ V]ccãmø¨®ò†£©êBY!’ƒŒŒ$6·"’˜$’#£üÝ_8wë‰6Æ:f¥ º +e%0IFƒAæրA|`` ª«$+"eáâ­Å0x†UR- ìÊ*8Þ±ší-ËJJ¦´èÜ<«´ÕÜǸŸñFi„VcÇmû|ÜzØm»GoÂçg$Ò«qE;ÀÖÜö@ßïNí˜÷GÎåe—Oí¡[vÃ懝Œ¹HÍÄ+ Š;©P†Ds¶·,n%—: só¸ÓV¨Íþª<²q½hÅE­4ñx gž‡îtüy!tz“$·ÌIí©HY)’IFG™[IÄ`4œ+è¯ïóºÍGxÏ\Dn€ª›¤"Sƒ ­ÍÔĸ¢}f ‡õ®ý†}ëÕÌ-°[g_Êwý†81Cg‚¢Y‰Y’ÑА¹5Ô¦>plÐƪûýôi·Á¿xXíô˜Þnßb¿½v›í¾Ý].hÇpžÐÆúð¼oXu¤”-Eñº-NOi‚ò= +ÑK2š2·†ÞÔNÚ(¿´qvÕÏՇÃŽq+(–WU e¯¢I·րœ˜À9ågê/À(³C`âüŧŒ¨ +“ŠÄˆ ­À85b„ʏ<_€qöTªg¬=ó"óë6½Všù[e#=ã"„aOgc–gß#ÿQÄ«ñendstream +endobj +3689 0 obj << +/Type /Page +/Contents 3690 0 R +/Resources 3688 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3691 0 obj << +/D [3689 0 R /XYZ 71.731 729.2652 null] +>> endobj +3692 0 obj << +/D [3689 0 R /XYZ 76.7123 708.3437 null] +>> endobj +3693 0 obj << +/D [3689 0 R /XYZ 149.4396 690.4109 null] +>> endobj +3694 0 obj << +/D [3689 0 R /XYZ 149.4396 690.4109 null] +>> endobj +3695 0 obj << +/D [3689 0 R /XYZ 71.731 688.2541 null] +>> endobj +3696 0 obj << +/D [3689 0 R /XYZ 71.731 688.2541 null] +>> endobj +3697 0 obj << +/D [3689 0 R /XYZ 159.4023 672.4782 null] +>> endobj +3698 0 obj << +/D [3689 0 R /XYZ 71.731 670.3214 null] +>> endobj +3699 0 obj << +/D [3689 0 R /XYZ 159.4023 654.5454 null] +>> endobj +3700 0 obj << +/D [3689 0 R /XYZ 76.7123 636.6127 null] +>> endobj +3701 0 obj << +/D [3689 0 R /XYZ 149.4396 618.6799 null] +>> endobj +3702 0 obj << +/D [3689 0 R /XYZ 149.4396 618.6799 null] +>> endobj +3703 0 obj << +/D [3689 0 R /XYZ 71.731 616.5231 null] +>> endobj +3704 0 obj << +/D [3689 0 R /XYZ 71.731 616.5231 null] +>> endobj +3705 0 obj << +/D [3689 0 R /XYZ 159.4023 600.7472 null] +>> endobj +3706 0 obj << +/D [3689 0 R /XYZ 71.731 598.5904 null] +>> endobj +3707 0 obj << +/D [3689 0 R /XYZ 159.4023 582.8144 null] +>> endobj +3708 0 obj << +/D [3689 0 R /XYZ 76.7123 564.8817 null] +>> endobj +3709 0 obj << +/D [3689 0 R /XYZ 149.4396 546.9489 null] +>> endobj +3710 0 obj << +/D [3689 0 R /XYZ 149.4396 546.9489 null] +>> endobj +3711 0 obj << +/D [3689 0 R /XYZ 71.731 544.7921 null] +>> endobj +3712 0 obj << +/D [3689 0 R /XYZ 71.731 544.7921 null] +>> endobj +3713 0 obj << +/D [3689 0 R /XYZ 159.4023 529.0162 null] +>> endobj +3714 0 obj << +/D [3689 0 R /XYZ 71.731 526.8593 null] +>> endobj +3715 0 obj << +/D [3689 0 R /XYZ 159.4023 511.0834 null] +>> endobj +3716 0 obj << +/D [3689 0 R /XYZ 76.7123 493.1507 null] +>> endobj +3717 0 obj << +/D [3689 0 R /XYZ 149.4396 475.2179 null] +>> endobj +3718 0 obj << +/D [3689 0 R /XYZ 149.4396 475.2179 null] +>> endobj +3719 0 obj << +/D [3689 0 R /XYZ 71.731 473.0611 null] +>> endobj +3720 0 obj << +/D [3689 0 R /XYZ 71.731 473.0611 null] +>> endobj +3721 0 obj << +/D [3689 0 R /XYZ 159.4023 457.2852 null] +>> endobj +3722 0 obj << +/D [3689 0 R /XYZ 71.731 455.1283 null] +>> endobj +3723 0 obj << +/D [3689 0 R /XYZ 159.4023 439.3524 null] +>> endobj +3724 0 obj << +/D [3689 0 R /XYZ 76.7123 421.4197 null] +>> endobj +3725 0 obj << +/D [3689 0 R /XYZ 149.4396 403.4869 null] +>> endobj +3726 0 obj << +/D [3689 0 R /XYZ 149.4396 403.4869 null] +>> endobj +3727 0 obj << +/D [3689 0 R /XYZ 71.731 401.3301 null] +>> endobj +3728 0 obj << +/D [3689 0 R /XYZ 71.731 401.3301 null] +>> endobj +3729 0 obj << +/D [3689 0 R /XYZ 159.4023 385.5542 null] +>> endobj +3730 0 obj << +/D [3689 0 R /XYZ 71.731 383.3973 null] +>> endobj +3731 0 obj << +/D [3689 0 R /XYZ 159.4023 367.6214 null] +>> endobj +3732 0 obj << +/D [3689 0 R /XYZ 76.7123 313.8231 null] +>> endobj +3733 0 obj << +/D [3689 0 R /XYZ 129.5143 295.8904 null] +>> endobj +3734 0 obj << +/D [3689 0 R /XYZ 129.5143 295.8904 null] +>> endobj +3735 0 obj << +/D [3689 0 R /XYZ 71.731 293.7336 null] +>> endobj +3736 0 obj << +/D [3689 0 R /XYZ 71.731 293.7336 null] +>> endobj +3737 0 obj << +/D [3689 0 R /XYZ 139.477 277.9576 null] +>> endobj +3738 0 obj << +/D [3689 0 R /XYZ 71.731 240.0996 null] +>> endobj +3739 0 obj << +/D [3689 0 R /XYZ 71.731 227.0486 null] +>> endobj +3740 0 obj << +/D [3689 0 R /XYZ 71.731 225.8033 null] +>> endobj +3741 0 obj << +/D [3689 0 R /XYZ 129.5143 206.7248 null] +>> endobj +3742 0 obj << +/D [3689 0 R /XYZ 71.731 204.5679 null] +>> endobj +3743 0 obj << +/D [3689 0 R /XYZ 71.731 204.5679 null] +>> endobj +3744 0 obj << +/D [3689 0 R /XYZ 139.477 188.792 null] +>> endobj +3745 0 obj << +/D [3689 0 R /XYZ 139.477 188.792 null] +>> endobj +3746 0 obj << +/D [3689 0 R /XYZ 71.731 186.6352 null] +>> endobj +3747 0 obj << +/D [3689 0 R /XYZ 139.477 170.8593 null] +>> endobj +3748 0 obj << +/D [3689 0 R /XYZ 139.477 170.8593 null] +>> endobj +3749 0 obj << +/D [3689 0 R /XYZ 71.731 169.4197 null] +>> endobj +3750 0 obj << +/D [3689 0 R /XYZ 139.477 152.9265 null] +>> endobj +3751 0 obj << +/D [3689 0 R /XYZ 139.477 152.9265 null] +>> endobj +3752 0 obj << +/D [3689 0 R /XYZ 71.731 150.7697 null] +>> endobj +3753 0 obj << +/D [3689 0 R /XYZ 139.477 134.9938 null] +>> endobj +3754 0 obj << +/D [3689 0 R /XYZ 139.477 134.9938 null] +>> endobj +3755 0 obj << +/D [3689 0 R /XYZ 71.731 132.8369 null] +>> endobj +3756 0 obj << +/D [3689 0 R /XYZ 139.477 117.061 null] +>> endobj +3757 0 obj << +/D [3689 0 R /XYZ 139.477 117.061 null] +>> endobj +3758 0 obj << +/D [3689 0 R /XYZ 71.731 114.9042 null] +>> endobj +3759 0 obj << +/D [3689 0 R /XYZ 139.477 99.1283 null] +>> endobj +3760 0 obj << +/D [3689 0 R /XYZ 139.477 99.1283 null] +>> endobj +3761 0 obj << +/D [3689 0 R /XYZ 71.731 96.9714 null] +>> endobj +3688 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3764 0 obj << +/Length 1280 +/Filter /FlateDecode +>> +stream +xڕX]o¤6}ϯàqFʸ¶ñû–ݶ«­Z)ÚÎ[S­È@6H§«üûŒ.«<™cßããã{/›?I‚dl.4ATpÞîpôÝüôùŽôC9ø Ç»_~q” DP_¢8ˆKɘ"ʼnŠŽÙ?»O¯éEçõþ@9ÞQd¯ç´ÌõŸé³}|xüboþÊõk•5ûÜývâóX¢D™ ‹$Vˆ GŠQB QÄLÁ 3(ið1‹å°šD‘v¡f1n€µ«y¢”Ù³\LYùº¸ã덇5å«HQëxÄ bR†4Ò,«ó¦ù¦ß/ù·Â +Öñ¿m†Rˆ ©L°vÀ«oZ×éû^ðÝ}/¼Ç>´“Ù»"ËK]KeT=Ÿª – D•R Â>vÃí½›V’($d’¬)éÁ–”t°u%¸[”ó€•ôiø Ê~’"FM)ø¹ì7Ÿë0F’Iº’ë<ÔB®s¨õ\DݒëP®óyXŸõB +™úÙɐ™ÚcæULH‡§H¨¶–Kµûœë‡lOð®ó¸x7³)L"E±ªí¤°ýÁc]éªÿÃ0â¶÷ýØ%æ)»õ]¼>–êcu;ø„9N¯úµßÝ F¶µìܶ! »Ý¯s}­Ëî—üœ5f48Ëٞã_óæT]TåVÖ_»h=Ó´ô i3åËpà¯'ݸC^ê´(۝鞳Ü<žÝ$ÏÕUKõŒÜ÷Y_^–´°µ¾Ö\ò“-ù™#™…ÃÚ¬Õ¸í@̸ˆíIœ®!ÝÐU܇"õW¿i¶TË>ï)Þ]u>LWžßç$±·o©>½‚ê×Üy§×XáâÜ'ÝçÜ·NžT9jVß ÙÆd‚_"²Ñ¹çsµ§|÷ÃøZóf«‰Óì­({ö—¢¿¹6Á±ÒùɝÀ.t ±Ç¶?Hëô-7»` 9‘˜bĉŒ¨l{1Óx9ÔÁ‡ÝRq"±MœÙfs1¥¦ë&Œ;Ÿ‹Ý¨)°´¹ðhsÔx1„ɤ;0Çå~ôՎoOÚ)m”¼Öó=åm£¯u_>l¡g`«=wCÏ0áö £‹}Á„»/ÁÌ»ë|÷õÈúf§³Æ¯†ó0ï^ÚÖ\E×ÜëÁ–Üë`ëîânqï˜ÇŒ{}A©y)\Rw!˜# ¶gAîo_Á‚:Ñ÷)ãÿµEcÖØؤ²úªæ֌í`ëÆân16ÀÃÓÍÛ§ñÂÍô·D1¤ÔÜ«—ëo}Ô|; Vû[(ê†þ¢ô·£ÇöO³* –¬|ñðQ *9ÔºJ@Ô-*4 •|a¾›5wÂHLVlí„ù°…6ÀVOwà ƒxLOX@#,´~ç9mA琑6e/;ÇC-8ǡ֝DÝâœ10ëÎñy”¦qÛܳL28üä«þ;4S&ù‰dñSµ‡™~©æTbÆõÕdö»3ð¢NÏendstream +endobj +3763 0 obj << +/Type /Page +/Contents 3764 0 R +/Resources 3762 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3765 0 obj << +/D [3763 0 R /XYZ 71.731 729.2652 null] +>> endobj +3766 0 obj << +/D [3763 0 R /XYZ 139.477 708.3437 null] +>> endobj +3767 0 obj << +/D [3763 0 R /XYZ 139.477 708.3437 null] +>> endobj +3768 0 obj << +/D [3763 0 R /XYZ 71.731 706.1869 null] +>> endobj +3769 0 obj << +/D [3763 0 R /XYZ 71.731 706.1869 null] +>> endobj +3770 0 obj << +/D [3763 0 R /XYZ 149.4396 690.4109 null] +>> endobj +3771 0 obj << +/D [3763 0 R /XYZ 76.7123 672.4782 null] +>> endobj +3772 0 obj << +/D [3763 0 R /XYZ 139.477 654.5454 null] +>> endobj +3773 0 obj << +/D [3763 0 R /XYZ 139.477 654.5454 null] +>> endobj +3774 0 obj << +/D [3763 0 R /XYZ 71.731 652.3886 null] +>> endobj +3775 0 obj << +/D [3763 0 R /XYZ 139.477 636.6127 null] +>> endobj +3776 0 obj << +/D [3763 0 R /XYZ 139.477 636.6127 null] +>> endobj +3777 0 obj << +/D [3763 0 R /XYZ 71.731 634.4559 null] +>> endobj +3778 0 obj << +/D [3763 0 R /XYZ 139.477 618.6799 null] +>> endobj +3779 0 obj << +/D [3763 0 R /XYZ 139.477 618.6799 null] +>> endobj +3780 0 obj << +/D [3763 0 R /XYZ 71.731 616.5231 null] +>> endobj +3781 0 obj << +/D [3763 0 R /XYZ 71.731 616.5231 null] +>> endobj +3782 0 obj << +/D [3763 0 R /XYZ 149.4396 600.7472 null] +>> endobj +796 0 obj << +/D [3763 0 R /XYZ 71.731 559.9004 null] +>> endobj +302 0 obj << +/D [3763 0 R /XYZ 260.9266 514.6461 null] +>> endobj +3783 0 obj << +/D [3763 0 R /XYZ 71.731 491.1573 null] +>> endobj +3784 0 obj << +/D [3763 0 R /XYZ 161.0655 481.7693 null] +>> endobj +3785 0 obj << +/D [3763 0 R /XYZ 71.731 469.6499 null] +>> endobj +3786 0 obj << +/D [3763 0 R /XYZ 71.731 438.284 null] +>> endobj +3787 0 obj << +/D [3763 0 R /XYZ 168.8063 427.2737 null] +>> endobj +3788 0 obj << +/D [3763 0 R /XYZ 71.731 415.1542 null] +>> endobj +3789 0 obj << +/D [3763 0 R /XYZ 71.731 360.4758 null] +>> endobj +3790 0 obj << +/D [3763 0 R /XYZ 181.5683 349.4655 null] +>> endobj +3791 0 obj << +/D [3763 0 R /XYZ 71.731 339.4033 null] +>> endobj +3792 0 obj << +/D [3763 0 R /XYZ 71.731 305.9801 null] +>> endobj +3793 0 obj << +/D [3763 0 R /XYZ 71.731 294.8703 null] +>> endobj +3794 0 obj << +/D [3763 0 R /XYZ 71.731 293.625 null] +>> endobj +3795 0 obj << +/D [3763 0 R /XYZ 129.5143 274.5464 null] +>> endobj +3796 0 obj << +/D [3763 0 R /XYZ 129.5143 274.5464 null] +>> endobj +3797 0 obj << +/D [3763 0 R /XYZ 71.731 273.1069 null] +>> endobj +3798 0 obj << +/D [3763 0 R /XYZ 71.731 273.1069 null] +>> endobj +3799 0 obj << +/D [3763 0 R /XYZ 139.477 256.6137 null] +>> endobj +3800 0 obj << +/D [3763 0 R /XYZ 139.477 256.6137 null] +>> endobj +3801 0 obj << +/D [3763 0 R /XYZ 76.7123 238.6809 null] +>> endobj +3802 0 obj << +/D [3763 0 R /XYZ 129.5143 220.7482 null] +>> endobj +3803 0 obj << +/D [3763 0 R /XYZ 129.5143 220.7482 null] +>> endobj +3804 0 obj << +/D [3763 0 R /XYZ 71.731 218.5914 null] +>> endobj +3805 0 obj << +/D [3763 0 R /XYZ 71.731 218.5914 null] +>> endobj +3806 0 obj << +/D [3763 0 R /XYZ 139.477 202.8154 null] +>> endobj +3807 0 obj << +/D [3763 0 R /XYZ 71.731 200.6586 null] +>> endobj +3808 0 obj << +/D [3763 0 R /XYZ 71.731 200.6586 null] +>> endobj +3809 0 obj << +/D [3763 0 R /XYZ 149.4396 184.8827 null] +>> endobj +3810 0 obj << +/D [3763 0 R /XYZ 71.731 182.7258 null] +>> endobj +3811 0 obj << +/D [3763 0 R /XYZ 149.4396 166.9499 null] +>> endobj +3812 0 obj << +/D [3763 0 R /XYZ 76.7123 149.0172 null] +>> endobj +3813 0 obj << +/D [3763 0 R /XYZ 139.477 131.0844 null] +>> endobj +3814 0 obj << +/D [3763 0 R /XYZ 71.731 129.6449 null] +>> endobj +3815 0 obj << +/D [3763 0 R /XYZ 71.731 129.6449 null] +>> endobj +3816 0 obj << +/D [3763 0 R /XYZ 149.4396 113.1517 null] +>> endobj +3817 0 obj << +/D [3763 0 R /XYZ 149.4396 113.1517 null] +>> endobj +3818 0 obj << +/D [3763 0 R /XYZ 71.731 110.9948 null] +>> endobj +3819 0 obj << +/D [3763 0 R /XYZ 71.731 110.9948 null] +>> endobj +3762 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3822 0 obj << +/Length 1080 +/Filter /FlateDecode +>> +stream +xÚ¥˜]oœ8†ïó+¸L¤Ž×6þÌ]?v«V])êÎÝvÑ@¤ D iÕ¿‡±a 0i5€æÅç=çØ–Pø±D3¢S8pK¸’<¹{¼ É7øëýó’×ìBћýÅ¥4±Ä*®’ý}’ZE¤‰N91’™dŸÿ{ùö!{j‹æjÇ%½äÄoYU´Ÿ²¯îòõÍwòwÑ>Ôùñê¿ýNj?÷C|™jb Y5™C¤H“§Är&Q–0 +¹PCR‘ê!nMX—'ä2èY—ÌÎåÔ“ŒXIyØǝÏ>ú»Pg¦L‚ÊÓ±c۔շWž^ž7Åñè.ڟOÅÌaŸ‹²”Fm„L([!3È¢d°¸È`>2#YÓd?ŠúÞ_+…aµN”PMR଼hªTÓ±I ÈÙh…F]&Õß5·‘šÄ)%ÆO,ô‘9·„Û2ï,M›ÔJB°N형UëñúžFˆwšÅLQŒëX ²µìeñDân©AÄVƒ¡H±ÚŸ¼¨Úò ¥&ÆEPÌ¥m´YÙ¨^…ÄÝ +ñ +}à¥óì|¿I ‘Þ U˽;¨¢½‹EÝл3xïŽ|äÅñ®)ŸÚ²®¾UŒ(eô¸oÝ,m]/[*J©1†Åº7”­å ‹%wCQb>¢ùˆ,§³ •PÄ +ëßP¶†ª—ÅQ!q· B|`¨B/_l£ô˜%R“ZÎô½^µ egzVSGo6Ú"=ÎawÅ8w™^×ÜǸ‰aÛ*lMG>š¢}nªÛû²8¸-æDp“ŽÛØ!WòÒ#þTÛñ8MÝˆŽzíŽ.Ø<íޘԄ›…õ Ú…2¤Xg£-â†7ʅEã.ãîïB}Åê§î‘óā–KÈGRb¨•'Áç¡ãõbI¦F*¡ÖK2”­”ä ‹–$wCIb>Fý³ùÀúù®],œT9ÉHᄲ•ÂdÑÂÁân(œ™qŸúÂÙ¨²ÇéN.¥°AÙͯCÚP‡Ì(ƒÈÖ ö²8D$îˆS8ÄÐƯ¿lüÆnpÎùқܙîYµ׫âlçA· ˜ÀÉ~y'ø¢%†…Ô`6eòää„M0ѽC«(ã¦N”í¾ðhsù¾hßÔuûO›µ¶¸ M §Ýt ÛZí«ä¦©Ûº3q=ÜqÎÞß»ãóq¿üIš=·pdHÜ]?Œ‹ë¶|ïÎÙnìW ¿(W‹ûéìpp'߯¸„+¨ýÓeUçõWH 0]d«ëׇCÝ ú£ðc~®ÅqkYþXV¾žJò|„6´ß\´ÅÝëÀï¤ÖýWAaàÅDÙÕ‡fþÝPrC(ƒ¹´Wuþ_ü +ˆüJ#ŸŒendstream +endobj +3821 0 obj << +/Type /Page +/Contents 3822 0 R +/Resources 3820 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +3823 0 obj << +/D [3821 0 R /XYZ 71.731 729.2652 null] +>> endobj +3824 0 obj << +/D [3821 0 R /XYZ 159.4023 708.3437 null] +>> endobj +3825 0 obj << +/D [3821 0 R /XYZ 71.731 706.1869 null] +>> endobj +3826 0 obj << +/D [3821 0 R /XYZ 159.4023 690.4109 null] +>> endobj +3827 0 obj << +/D [3821 0 R /XYZ 76.7123 672.4782 null] +>> endobj +3828 0 obj << +/D [3821 0 R /XYZ 149.4396 654.5454 null] +>> endobj +3829 0 obj << +/D [3821 0 R /XYZ 149.4396 654.5454 null] +>> endobj +3830 0 obj << +/D [3821 0 R /XYZ 71.731 652.3886 null] +>> endobj +3831 0 obj << +/D [3821 0 R /XYZ 71.731 652.3886 null] +>> endobj +3832 0 obj << +/D [3821 0 R /XYZ 159.4023 636.6127 null] +>> endobj +3833 0 obj << +/D [3821 0 R /XYZ 71.731 634.4559 null] +>> endobj +3834 0 obj << +/D [3821 0 R /XYZ 159.4023 618.6799 null] +>> endobj +3835 0 obj << +/D [3821 0 R /XYZ 76.7123 600.7472 null] +>> endobj +3836 0 obj << +/D [3821 0 R /XYZ 149.4396 582.8144 null] +>> endobj +3837 0 obj << +/D [3821 0 R /XYZ 149.4396 582.8144 null] +>> endobj +3838 0 obj << +/D [3821 0 R /XYZ 71.731 580.6576 null] +>> endobj +3839 0 obj << +/D [3821 0 R /XYZ 71.731 580.6576 null] +>> endobj +3840 0 obj << +/D [3821 0 R /XYZ 159.4023 564.8817 null] +>> endobj +3841 0 obj << +/D [3821 0 R /XYZ 71.731 562.7248 null] +>> endobj +3842 0 obj << +/D [3821 0 R /XYZ 159.4023 546.9489 null] +>> endobj +3843 0 obj << +/D [3821 0 R /XYZ 76.7123 493.1507 null] +>> endobj +3844 0 obj << +/D [3821 0 R /XYZ 129.5143 475.2179 null] +>> endobj +3845 0 obj << +/D [3821 0 R /XYZ 129.5143 475.2179 null] +>> endobj +3846 0 obj << +/D [3821 0 R /XYZ 71.731 473.0611 null] +>> endobj +3847 0 obj << +/D [3821 0 R /XYZ 71.731 473.0611 null] +>> endobj +3848 0 obj << +/D [3821 0 R /XYZ 139.477 457.2852 null] +>> endobj +3849 0 obj << +/D [3821 0 R /XYZ 71.731 419.4271 null] +>> endobj +3850 0 obj << +/D [3821 0 R /XYZ 71.731 406.3762 null] +>> endobj +3851 0 obj << +/D [3821 0 R /XYZ 71.731 405.1308 null] +>> endobj +3852 0 obj << +/D [3821 0 R /XYZ 129.5143 386.0523 null] +>> endobj +3853 0 obj << +/D [3821 0 R /XYZ 71.731 383.8955 null] +>> endobj +3854 0 obj << +/D [3821 0 R /XYZ 71.731 383.8955 null] +>> endobj +3855 0 obj << +/D [3821 0 R /XYZ 139.477 368.1195 null] +>> endobj +3856 0 obj << +/D [3821 0 R /XYZ 139.477 368.1195 null] +>> endobj +3857 0 obj << +/D [3821 0 R /XYZ 71.731 365.9627 null] +>> endobj +3858 0 obj << +/D [3821 0 R /XYZ 139.477 350.1868 null] +>> endobj +3859 0 obj << +/D [3821 0 R /XYZ 139.477 350.1868 null] +>> endobj +3860 0 obj << +/D [3821 0 R /XYZ 71.731 348.03 null] +>> endobj +3861 0 obj << +/D [3821 0 R /XYZ 139.477 332.254 null] +>> endobj +3862 0 obj << +/D [3821 0 R /XYZ 139.477 332.254 null] +>> endobj +797 0 obj << +/D [3821 0 R /XYZ 71.731 309.34 null] +>> endobj +306 0 obj << +/D [3821 0 R /XYZ 234.3633 264.0857 null] +>> endobj +3863 0 obj << +/D [3821 0 R /XYZ 71.731 243.9453 null] +>> endobj +3864 0 obj << +/D [3821 0 R /XYZ 161.0655 231.2089 null] +>> endobj +3865 0 obj << +/D [3821 0 R /XYZ 71.731 219.0895 null] +>> endobj +3866 0 obj << +/D [3821 0 R /XYZ 71.731 188.0598 null] +>> endobj +3867 0 obj << +/D [3821 0 R /XYZ 168.8063 176.7133 null] +>> endobj +3868 0 obj << +/D [3821 0 R /XYZ 71.731 164.5938 null] +>> endobj +3869 0 obj << +/D [3821 0 R /XYZ 71.731 133.2279 null] +>> endobj +3870 0 obj << +/D [3821 0 R /XYZ 181.5683 122.2177 null] +>> endobj +3871 0 obj << +/D [3821 0 R /XYZ 71.731 112.1555 null] +>> endobj +3820 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3875 0 obj << +/Length 1257 +/Filter /FlateDecode +>> +stream +xÚÅXMoã6½çWèè5KR¢Hå–M»‹-Z ØÍ­)ŠLÇd)°d¤ù÷J¤BY£Ú"@äGÎãã›áÐ, ðÇɈ áÁÂcÁƒìxEƒgøê˳­Ål}Ч‡«Ÿ?‡4HHó8xØa!£@†œ(ÁTð°ûsswH_}ºÞrA7œtÏû"-uó{úÔ½½½ÿÚ½øC7‡jW_ÿõðÛÕ¯}|J’(2K²GiòÄ£ÉXB„`2T‘0 +eËóþš‰MzJØÖ7—úA±‚(œ†(…µõaŽ|")Pèa†Â#çb—sàÈ8÷òùÎÍóU @Š8jy€P‚EáGzn†Ç…n<"ÔD0›n¿êætʟ.vь×e“gi“W¥<ŸôxŽB ¡”¸°µõaïÂ2cÏÁ‚lRX0)åQ‚Ɲ֍ó +&$’rHãt鎨+bG<—úæå³Ó‘õØM×¾nªîy®[‘! L:r0£ DÑ$jgþ¦aʃ‹D)"¹`p6cð¶hp,î +ƒc<¼\w~ðHO§ô­«Ú#JªªÆ}œ6Úîp•„3ÑnðVH"U¶âòPts"©)qRm¾èæ®*÷ŸóB×ÈvG’(NAGS+elkЩjªæíEßô#Þ-eÇn9#1SI;`¤%üH5ùgW’Á·?)å…î¦Gtc¿>µfh¿ÑÅ®†Á áºu¡}®¿è:;å/ƊkÙZëÙ"aŒïԊº_A“æ%lN÷~§ámá&yªÎM3Ëx>Ÿ¼ôèV^ÛSçë~F”ö›ÜÎ[¿è,oUÙ9¶»!蛣&%H,âpÊX3¼ìŒ;“Ôm°Sm÷¥²|R_Λ6`é§k¡ÑýÄeñ¶¬¶´cÚd‡~ y#zý^ó¢è^=ißazw±ƛTD»<Ú¢1戬4ømQT×\l^]€oH³Öëé–}YíôÚ¨kېz—ˆAMŸ¯Ò>l¦J÷°Å*Å]Q¥G<ð6dÀãÿiCxBI¤b¹Ð†ø°™6¤‡-¶!XÜmȈچ hü·mê^."sÆÜëÃfÜÛÃ݋Å]áÞܽí!³‡ƒÙü3r¬µRD%4j!yÙ {LZ8„MT*Z²°›³°ƒ-[‰»Æ¯ƒsöià"YƒÞ}äĝ‘™†Q,Ö6'¢ƒ-‹ˆÄ]#"Âѧ1¬š~·pq´¨ÚÉ(\+8ÄA² ­BºœkRŸˆ™‹TŒFÖǍÓ¦p4Â$òh³·z-Ñä5…’AñA +åE7uÙ/ђ`Š›Â0QjëÃeG³MJ+@$,î´´nÊ󞔇Cƒ%;tVi./¬½„truŸ"ì×G@BFKJy°9¥lY)$R>¥»êÇų)gjMØBúú¨éôíQ‹é‹E]‘¾#xúx¼Tu“—pƒ/ŠÙkvTHD‹%‡áîʖœéÁæœé`ËÎDâ®q&Âs¦Ïc`Ãïín\Yu<ö÷e× js¯ùÛüÓY¤û÷›w·Qˆ¤ö·çš%'³?O{˜ñ¯Ó‚+¸8$I?“YCNþ֌ü*XÑendstream +endobj +3874 0 obj << +/Type /Page +/Contents 3875 0 R +/Resources 3873 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +3876 0 obj << +/D [3874 0 R /XYZ 71.731 729.2652 null] +>> endobj +3877 0 obj << +/D [3874 0 R /XYZ 71.731 718.3063 null] +>> endobj +3878 0 obj << +/D [3874 0 R /XYZ 71.731 708.2442 null] +>> endobj +3879 0 obj << +/D [3874 0 R /XYZ 71.731 706.9988 null] +>> endobj +3880 0 obj << +/D [3874 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3881 0 obj << +/D [3874 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3882 0 obj << +/D [3874 0 R /XYZ 71.731 686.4807 null] +>> endobj +3883 0 obj << +/D [3874 0 R /XYZ 71.731 686.4807 null] +>> endobj +3884 0 obj << +/D [3874 0 R /XYZ 139.477 669.9875 null] +>> endobj +3885 0 obj << +/D [3874 0 R /XYZ 139.477 669.9875 null] +>> endobj +3886 0 obj << +/D [3874 0 R /XYZ 71.731 632.1295 null] +>> endobj +3887 0 obj << +/D [3874 0 R /XYZ 71.731 619.0785 null] +>> endobj +3888 0 obj << +/D [3874 0 R /XYZ 71.731 617.8332 null] +>> endobj +3889 0 obj << +/D [3874 0 R /XYZ 129.5143 598.7547 null] +>> endobj +798 0 obj << +/D [3874 0 R /XYZ 71.731 591.6165 null] +>> endobj +310 0 obj << +/D [3874 0 R /XYZ 221.9338 548.519 null] +>> endobj +3890 0 obj << +/D [3874 0 R /XYZ 71.731 528.3787 null] +>> endobj +3891 0 obj << +/D [3874 0 R /XYZ 161.0655 515.6423 null] +>> endobj +3892 0 obj << +/D [3874 0 R /XYZ 71.731 503.5228 null] +>> endobj +3893 0 obj << +/D [3874 0 R /XYZ 71.731 472.4932 null] +>> endobj +3894 0 obj << +/D [3874 0 R /XYZ 168.8063 461.1467 null] +>> endobj +3895 0 obj << +/D [3874 0 R /XYZ 71.731 449.0272 null] +>> endobj +3896 0 obj << +/D [3874 0 R /XYZ 71.731 394.3488 null] +>> endobj +3897 0 obj << +/D [3874 0 R /XYZ 181.5683 383.3385 null] +>> endobj +3898 0 obj << +/D [3874 0 R /XYZ 71.731 373.2763 null] +>> endobj +3899 0 obj << +/D [3874 0 R /XYZ 71.731 340.4987 null] +>> endobj +3900 0 obj << +/D [3874 0 R /XYZ 71.731 328.7433 null] +>> endobj +3901 0 obj << +/D [3874 0 R /XYZ 71.731 327.498 null] +>> endobj +3902 0 obj << +/D [3874 0 R /XYZ 129.5143 308.4194 null] +>> endobj +3903 0 obj << +/D [3874 0 R /XYZ 129.5143 308.4194 null] +>> endobj +3904 0 obj << +/D [3874 0 R /XYZ 71.731 306.9799 null] +>> endobj +3905 0 obj << +/D [3874 0 R /XYZ 71.731 306.9799 null] +>> endobj +3906 0 obj << +/D [3874 0 R /XYZ 139.477 290.4867 null] +>> endobj +3907 0 obj << +/D [3874 0 R /XYZ 139.477 290.4867 null] +>> endobj +3908 0 obj << +/D [3874 0 R /XYZ 76.7123 272.5539 null] +>> endobj +3909 0 obj << +/D [3874 0 R /XYZ 129.5143 254.6212 null] +>> endobj +3910 0 obj << +/D [3874 0 R /XYZ 129.5143 254.6212 null] +>> endobj +3911 0 obj << +/D [3874 0 R /XYZ 71.731 252.4643 null] +>> endobj +3912 0 obj << +/D [3874 0 R /XYZ 71.731 252.4643 null] +>> endobj +3913 0 obj << +/D [3874 0 R /XYZ 139.477 236.6884 null] +>> endobj +3914 0 obj << +/D [3874 0 R /XYZ 71.731 234.5316 null] +>> endobj +3915 0 obj << +/D [3874 0 R /XYZ 139.477 218.7557 null] +>> endobj +3916 0 obj << +/D [3874 0 R /XYZ 71.731 217.3161 null] +>> endobj +3917 0 obj << +/D [3874 0 R /XYZ 71.731 217.3161 null] +>> endobj +3918 0 obj << +/D [3874 0 R /XYZ 149.4396 200.8229 null] +>> endobj +3919 0 obj << +/D [3874 0 R /XYZ 149.4396 200.8229 null] +>> endobj +3920 0 obj << +/D [3874 0 R /XYZ 71.731 198.6661 null] +>> endobj +3921 0 obj << +/D [3874 0 R /XYZ 71.731 198.6661 null] +>> endobj +3922 0 obj << +/D [3874 0 R /XYZ 159.4023 182.8902 null] +>> endobj +3923 0 obj << +/D [3874 0 R /XYZ 71.731 180.7333 null] +>> endobj +3924 0 obj << +/D [3874 0 R /XYZ 159.4023 164.9574 null] +>> endobj +3925 0 obj << +/D [3874 0 R /XYZ 76.7123 147.0246 null] +>> endobj +3926 0 obj << +/D [3874 0 R /XYZ 149.4396 129.0919 null] +>> endobj +3927 0 obj << +/D [3874 0 R /XYZ 149.4396 129.0919 null] +>> endobj +3928 0 obj << +/D [3874 0 R /XYZ 71.731 126.9351 null] +>> endobj +3929 0 obj << +/D [3874 0 R /XYZ 71.731 126.9351 null] +>> endobj +3930 0 obj << +/D [3874 0 R /XYZ 159.4023 111.1591 null] +>> endobj +3931 0 obj << +/D [3874 0 R /XYZ 71.731 109.0023 null] +>> endobj +3873 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3934 0 obj << +/Length 1429 +/Filter /FlateDecode +>> +stream +xÚÅZ]o¤6}ϯà1‘×ß6}Û®Új«­´Ró¶©"2C2¨ˆÒmÿ}MÀÄ _§É¨Š403g¸‡ãs1eÔý±Ì0b„Ûðœp­x¶y8£Ù½ûê—36B.GÌeúñêìûŸÍr’k®³«»Läš(#3#8±ŠÙìjûõüã®xìÊöâ’+zÎÉ°ý²/ê²û\Üo?|ù4ìüVv»f{¸øãê׳Ÿ®¦úJ’[W$JRXK”Ù%§$çL &s"Qw.Ô!…™Î…ç™!¬?Ow.n‚õ's͹:&Ç#¹¢< èëo_xø_<^4eÊñ \Ìym[ü3HÖÜ ÛC×VõýwÛßwå~?ìnš‡‡¢ÞoºfؖLÿÝ¿”›§®>,î¦qªêCWì÷³Ž1™6Üm-<t¢µ*±tbY£Áªëû_-i›Y'±–³¡žñ(Û¶io6۞ÌÑ ¸±ãÚ˜>#`”QÇÕqZž¡ç ¤3±’ˆyCXļ 5/T7Á¼À¼3owj5jYÔý£ÀÏ6j½Ù<µ‡u…&šqƒiÀb{®1P7Ec€¤qÈã$ñe÷]N)1Ò`‰ "‰áQxbUSã˜ÆJb„<ÛrÌ͕Ø0–0­Í)bCY7å2‰ÅF‹Xz‚¡–†ê&XâXzÆãíþ}l+¯°ÇE&ºI -‰µ K‹“ÖÃpiº)Ò< iC'I‹×©=6¶rx”i$$BÔzHL(4$ ª !± ‡ÄŒGÝl˛j¸Ä=©ˆƒòy¡ÐV‡ª&´ú‚Üê3›¦¾»¹«öýÝ ßÝÌ'©aï{ó€»Õ‰^´ÑX̧†û¨›âS€äӐÇËò7䶬»ªÿ¤l×%£šp®ÑÖ`1É< — ¨›"À’,ä½Ið6Çd†¡ÒÌ!j½™'ÚÌPՄf^Ѐ›yÆ㹏Ëö¡:œJÐåÿÏlmì)n 0ʼnäkëñèC= +ÕMð(ÄðèŒÇlɺÙ=4Ûkª(s/l\¸ÎŇu’È\a½Âb:y®P7E'€¤SÈ[í¿Vº±érK´ Hÿ õöõ ´{’ Í{Ìîݐġyj7%аNV£ó÷|(`|êFZb™Î£æ˜ås9Š[BYžOGê j¹ú” Pð_¯Ž/endstream +endobj +3933 0 obj << +/Type /Page +/Contents 3934 0 R +/Resources 3932 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +3935 0 obj << +/D [3933 0 R /XYZ 71.731 729.2652 null] +>> endobj +3936 0 obj << +/D [3933 0 R /XYZ 159.4023 708.3437 null] +>> endobj +3937 0 obj << +/D [3933 0 R /XYZ 76.7123 690.4109 null] +>> endobj +3938 0 obj << +/D [3933 0 R /XYZ 149.4396 672.4782 null] +>> endobj +3939 0 obj << +/D [3933 0 R /XYZ 149.4396 672.4782 null] +>> endobj +3940 0 obj << +/D [3933 0 R /XYZ 71.731 670.3214 null] +>> endobj +3941 0 obj << +/D [3933 0 R /XYZ 71.731 670.3214 null] +>> endobj +3942 0 obj << +/D [3933 0 R /XYZ 159.4023 654.5454 null] +>> endobj +3943 0 obj << +/D [3933 0 R /XYZ 71.731 652.3886 null] +>> endobj +3944 0 obj << +/D [3933 0 R /XYZ 159.4023 636.6127 null] +>> endobj +3945 0 obj << +/D [3933 0 R /XYZ 76.7123 618.6799 null] +>> endobj +3946 0 obj << +/D [3933 0 R /XYZ 149.4396 600.7472 null] +>> endobj +3947 0 obj << +/D [3933 0 R /XYZ 149.4396 600.7472 null] +>> endobj +3948 0 obj << +/D [3933 0 R /XYZ 71.731 598.5904 null] +>> endobj +3949 0 obj << +/D [3933 0 R /XYZ 71.731 598.5904 null] +>> endobj +3950 0 obj << +/D [3933 0 R /XYZ 159.4023 582.8144 null] +>> endobj +3951 0 obj << +/D [3933 0 R /XYZ 71.731 580.6576 null] +>> endobj +3952 0 obj << +/D [3933 0 R /XYZ 159.4023 564.8817 null] +>> endobj +3953 0 obj << +/D [3933 0 R /XYZ 76.7123 546.9489 null] +>> endobj +3954 0 obj << +/D [3933 0 R /XYZ 149.4396 529.0162 null] +>> endobj +3955 0 obj << +/D [3933 0 R /XYZ 149.4396 529.0162 null] +>> endobj +3956 0 obj << +/D [3933 0 R /XYZ 71.731 526.8593 null] +>> endobj +3957 0 obj << +/D [3933 0 R /XYZ 71.731 526.8593 null] +>> endobj +3958 0 obj << +/D [3933 0 R /XYZ 159.4023 511.0834 null] +>> endobj +3959 0 obj << +/D [3933 0 R /XYZ 71.731 509.6439 null] +>> endobj +3960 0 obj << +/D [3933 0 R /XYZ 159.4023 493.1507 null] +>> endobj +3961 0 obj << +/D [3933 0 R /XYZ 76.7123 475.2179 null] +>> endobj +3962 0 obj << +/D [3933 0 R /XYZ 149.4396 457.2852 null] +>> endobj +3963 0 obj << +/D [3933 0 R /XYZ 149.4396 457.2852 null] +>> endobj +3964 0 obj << +/D [3933 0 R /XYZ 71.731 455.1283 null] +>> endobj +3965 0 obj << +/D [3933 0 R /XYZ 71.731 455.1283 null] +>> endobj +3966 0 obj << +/D [3933 0 R /XYZ 159.4023 439.3524 null] +>> endobj +3967 0 obj << +/D [3933 0 R /XYZ 71.731 437.1956 null] +>> endobj +3968 0 obj << +/D [3933 0 R /XYZ 159.4023 421.4197 null] +>> endobj +3969 0 obj << +/D [3933 0 R /XYZ 76.7123 403.4869 null] +>> endobj +3970 0 obj << +/D [3933 0 R /XYZ 149.4396 385.5542 null] +>> endobj +3971 0 obj << +/D [3933 0 R /XYZ 149.4396 385.5542 null] +>> endobj +3972 0 obj << +/D [3933 0 R /XYZ 71.731 383.3973 null] +>> endobj +3973 0 obj << +/D [3933 0 R /XYZ 71.731 383.3973 null] +>> endobj +3974 0 obj << +/D [3933 0 R /XYZ 159.4023 367.6214 null] +>> endobj +3975 0 obj << +/D [3933 0 R /XYZ 71.731 365.4646 null] +>> endobj +3976 0 obj << +/D [3933 0 R /XYZ 159.4023 349.6887 null] +>> endobj +3977 0 obj << +/D [3933 0 R /XYZ 76.7123 331.7559 null] +>> endobj +3978 0 obj << +/D [3933 0 R /XYZ 149.4396 313.8231 null] +>> endobj +3979 0 obj << +/D [3933 0 R /XYZ 149.4396 313.8231 null] +>> endobj +3980 0 obj << +/D [3933 0 R /XYZ 71.731 311.6663 null] +>> endobj +3981 0 obj << +/D [3933 0 R /XYZ 71.731 311.6663 null] +>> endobj +3982 0 obj << +/D [3933 0 R /XYZ 159.4023 295.8904 null] +>> endobj +3983 0 obj << +/D [3933 0 R /XYZ 71.731 293.7336 null] +>> endobj +3984 0 obj << +/D [3933 0 R /XYZ 159.4023 277.9576 null] +>> endobj +3985 0 obj << +/D [3933 0 R /XYZ 76.7123 260.0249 null] +>> endobj +3986 0 obj << +/D [3933 0 R /XYZ 149.4396 242.0921 null] +>> endobj +3987 0 obj << +/D [3933 0 R /XYZ 149.4396 242.0921 null] +>> endobj +3988 0 obj << +/D [3933 0 R /XYZ 71.731 239.9353 null] +>> endobj +3989 0 obj << +/D [3933 0 R /XYZ 71.731 239.9353 null] +>> endobj +3990 0 obj << +/D [3933 0 R /XYZ 159.4023 224.1594 null] +>> endobj +3991 0 obj << +/D [3933 0 R /XYZ 71.731 222.0026 null] +>> endobj +3992 0 obj << +/D [3933 0 R /XYZ 159.4023 206.2266 null] +>> endobj +3993 0 obj << +/D [3933 0 R /XYZ 76.7123 188.2939 null] +>> endobj +3994 0 obj << +/D [3933 0 R /XYZ 149.4396 170.3611 null] +>> endobj +3995 0 obj << +/D [3933 0 R /XYZ 149.4396 170.3611 null] +>> endobj +3996 0 obj << +/D [3933 0 R /XYZ 71.731 168.2043 null] +>> endobj +3997 0 obj << +/D [3933 0 R /XYZ 71.731 168.2043 null] +>> endobj +3998 0 obj << +/D [3933 0 R /XYZ 159.4023 152.4284 null] +>> endobj +3999 0 obj << +/D [3933 0 R /XYZ 71.731 150.2715 null] +>> endobj +4000 0 obj << +/D [3933 0 R /XYZ 159.4023 134.4956 null] +>> endobj +4001 0 obj << +/D [3933 0 R /XYZ 76.7123 116.5629 null] +>> endobj +4002 0 obj << +/D [3933 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4003 0 obj << +/D [3933 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4004 0 obj << +/D [3933 0 R /XYZ 71.731 96.4733 null] +>> endobj +4005 0 obj << +/D [3933 0 R /XYZ 71.731 96.4733 null] +>> endobj +3932 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4008 0 obj << +/Length 1686 +/Filter /FlateDecode +>> +stream +xÚÍZÛnÛF|÷WèѪíÞ/yKƒ¶H‘Aâ·¦0h‰¶ˆJ¤@Ruó÷]Š»Ô’:ÜeÛ XŒ=âÎ Ï^H²ÂöY)‚³Ô *]m7xõlÿôó qµÃ¬CÐ÷7ßÿÄðÊ #©\Ý?­˜‘H(¾RŒ"-ˆ^Ýo»}³ËŽm^ß­©À·õŸï÷Y™·ï²Çþ¿¯ß¿í~ÍÛ]µmî~¿ÿåæÇû¡¾` +m‹DI2­‘àlµ¦J"Ü n‰ÚkÁ1ÎÔp-Ô¬"ÝuÚkp¬»˜O”Š)9"2ÓUxB_wúyáá¿ò¸hJ„å)óhÚº(Ÿ¿ëEûï³¶¸£âöÏ;"nóþ·Ç¬ÝõGUÙ¶;÷§Çªjû£&¯ûï8^vyí@Ÿ0¦{w¼ÉÜ)Ý/¶UWî¥ÜWÙ6ß^)ⵓ#N°I8Â"N °¤PÝN@<'F<²ºÎ>;Ÿœ¨ß¶9Ì^†R+)¸½[‡½q uˆ¬™žkÖn5ÖJ‚Uçñߺ¦ÁôJ[g$'$äQVÛü¹®NLJ¢ï(?EœjfKuèW½vEéįœè€¿f6ñL"I¨J%>€ÅïaéÄu—$à%>äa/ßeû]Ñ´ci:Íû£³òM¼/Ê?î¾µaì³^ùÌÍ(ϳª¤2É>ÀbªzXZU îUª!8g_Khw mnÂ=!DÍ÷„•ì PÕ=áŠÜF<²ýKö¹y8·Y›/í ¶#ïsßd#}ÁãæR,$GZ“Toa‘°dŠ¡º R ñR<âá$p±}½ïÂøÒý°ª;ÝÚ6?Ûq>‹²i³ýþzlË/§Ó¿pbŸÊÍ.+Ÿ#“Á%2\§šF‹Éíai¹ºKäx@r‡<æCø¿:à;!k–ê&*ÒM<*ÝM€ªKºÉ”ÆL7 y<ûüá܁V"$bŒÉq+駆ÉNâ`sÉæ†!"pª‘„°H²X2ÙPÝɆxÉñÍ¡7»çúø Lìâ¤êç¸vn<«’ˆ•ºÿCXL%K«Ô]¢ÀR)ä‘Z|ü3áˆABØFÎ1C\Ëá×Ìþ-·3 jèÕþmtÏì¿n” Za‰åÉ"€Å”÷°´ò@Ý%ÊOyÀʇ4¬V- º5cc"ùýØTûK°‡'3/š]uÚoÇO0\ô­¯Ñ)“š3¨ˆú•(º@û) PúCñ\VuÞõŸ‡sk†Âo×ʆOLJñÞÏÛ¹-×üÝ®Pj›Ço|.%ˆ²S{aR£D‹¹ãai{€ºKü™ò€ +iäeöèÒ9mJvxÇÊÄ|yS•ϧ:k ÿø/ôÇ· l3zp8+· vI%Sƒ@‹Éíai¹ºKäžò€åilªòéá¼( Í¥B«¹q -÷6/Ûâ¼tŸ_Ƒ1,ÕïCXLdK‹ Ô]"ò”,rHã¬ï1¯EÓX ¦Ó½_!•Ž®¸Õv²Úšœ–—(„%I©{AÅÄu¨´¶×E—H;!+phªS½6Yõ•4±9þ·÷ò€ÙDº ²¸a*b˜G% Š.0lJ4,äðo_øJkÝ»X\#Mf6iýëZæúm-A5ÂÄNå<ª»)fß½ +þ ’ã‰ìendstream +endobj +4007 0 obj << +/Type /Page +/Contents 4008 0 R +/Resources 4006 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +4009 0 obj << +/D [4007 0 R /XYZ 71.731 729.2652 null] +>> endobj +4010 0 obj << +/D [4007 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4011 0 obj << +/D [4007 0 R /XYZ 71.731 706.1869 null] +>> endobj +4012 0 obj << +/D [4007 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4013 0 obj << +/D [4007 0 R /XYZ 76.7123 672.4782 null] +>> endobj +4014 0 obj << +/D [4007 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4015 0 obj << +/D [4007 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4016 0 obj << +/D [4007 0 R /XYZ 71.731 652.3886 null] +>> endobj +4017 0 obj << +/D [4007 0 R /XYZ 71.731 652.3886 null] +>> endobj +4018 0 obj << +/D [4007 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4019 0 obj << +/D [4007 0 R /XYZ 71.731 634.4559 null] +>> endobj +4020 0 obj << +/D [4007 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4021 0 obj << +/D [4007 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4022 0 obj << +/D [4007 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4023 0 obj << +/D [4007 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4024 0 obj << +/D [4007 0 R /XYZ 71.731 580.6576 null] +>> endobj +4025 0 obj << +/D [4007 0 R /XYZ 71.731 580.6576 null] +>> endobj +4026 0 obj << +/D [4007 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4027 0 obj << +/D [4007 0 R /XYZ 71.731 562.7248 null] +>> endobj +4028 0 obj << +/D [4007 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4029 0 obj << +/D [4007 0 R /XYZ 76.7123 529.0162 null] +>> endobj +4030 0 obj << +/D [4007 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4031 0 obj << +/D [4007 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4032 0 obj << +/D [4007 0 R /XYZ 71.731 508.9266 null] +>> endobj +4033 0 obj << +/D [4007 0 R /XYZ 71.731 508.9266 null] +>> endobj +4034 0 obj << +/D [4007 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4035 0 obj << +/D [4007 0 R /XYZ 71.731 490.9938 null] +>> endobj +4036 0 obj << +/D [4007 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4037 0 obj << +/D [4007 0 R /XYZ 76.7123 421.4197 null] +>> endobj +4038 0 obj << +/D [4007 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4039 0 obj << +/D [4007 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4040 0 obj << +/D [4007 0 R /XYZ 71.731 401.3301 null] +>> endobj +4041 0 obj << +/D [4007 0 R /XYZ 71.731 401.3301 null] +>> endobj +4042 0 obj << +/D [4007 0 R /XYZ 139.477 385.5542 null] +>> endobj +4043 0 obj << +/D [4007 0 R /XYZ 71.731 347.6961 null] +>> endobj +4044 0 obj << +/D [4007 0 R /XYZ 71.731 334.6452 null] +>> endobj +4045 0 obj << +/D [4007 0 R /XYZ 71.731 333.3998 null] +>> endobj +4046 0 obj << +/D [4007 0 R /XYZ 129.5143 314.3213 null] +>> endobj +4047 0 obj << +/D [4007 0 R /XYZ 71.731 312.1645 null] +>> endobj +4048 0 obj << +/D [4007 0 R /XYZ 71.731 312.1645 null] +>> endobj +4049 0 obj << +/D [4007 0 R /XYZ 139.477 296.3885 null] +>> endobj +4050 0 obj << +/D [4007 0 R /XYZ 139.477 296.3885 null] +>> endobj +4051 0 obj << +/D [4007 0 R /XYZ 71.731 294.2317 null] +>> endobj +4052 0 obj << +/D [4007 0 R /XYZ 139.477 278.4558 null] +>> endobj +4053 0 obj << +/D [4007 0 R /XYZ 139.477 278.4558 null] +>> endobj +4054 0 obj << +/D [4007 0 R /XYZ 71.731 276.2989 null] +>> endobj +4055 0 obj << +/D [4007 0 R /XYZ 139.477 260.523 null] +>> endobj +4056 0 obj << +/D [4007 0 R /XYZ 139.477 260.523 null] +>> endobj +4057 0 obj << +/D [4007 0 R /XYZ 71.731 258.3662 null] +>> endobj +4058 0 obj << +/D [4007 0 R /XYZ 139.477 242.5903 null] +>> endobj +4059 0 obj << +/D [4007 0 R /XYZ 139.477 242.5903 null] +>> endobj +4060 0 obj << +/D [4007 0 R /XYZ 71.731 240.4334 null] +>> endobj +4061 0 obj << +/D [4007 0 R /XYZ 139.477 224.6575 null] +>> endobj +4062 0 obj << +/D [4007 0 R /XYZ 139.477 224.6575 null] +>> endobj +4063 0 obj << +/D [4007 0 R /XYZ 71.731 223.218 null] +>> endobj +4064 0 obj << +/D [4007 0 R /XYZ 139.477 206.7248 null] +>> endobj +4065 0 obj << +/D [4007 0 R /XYZ 139.477 206.7248 null] +>> endobj +4066 0 obj << +/D [4007 0 R /XYZ 71.731 204.5679 null] +>> endobj +4067 0 obj << +/D [4007 0 R /XYZ 139.477 188.792 null] +>> endobj +4068 0 obj << +/D [4007 0 R /XYZ 139.477 188.792 null] +>> endobj +4069 0 obj << +/D [4007 0 R /XYZ 71.731 186.6352 null] +>> endobj +4070 0 obj << +/D [4007 0 R /XYZ 139.477 170.8593 null] +>> endobj +4071 0 obj << +/D [4007 0 R /XYZ 139.477 170.8593 null] +>> endobj +4072 0 obj << +/D [4007 0 R /XYZ 71.731 168.7024 null] +>> endobj +4073 0 obj << +/D [4007 0 R /XYZ 139.477 152.9265 null] +>> endobj +4074 0 obj << +/D [4007 0 R /XYZ 139.477 152.9265 null] +>> endobj +4075 0 obj << +/D [4007 0 R /XYZ 71.731 150.7697 null] +>> endobj +4076 0 obj << +/D [4007 0 R /XYZ 139.477 134.9938 null] +>> endobj +4077 0 obj << +/D [4007 0 R /XYZ 139.477 134.9938 null] +>> endobj +4078 0 obj << +/D [4007 0 R /XYZ 71.731 132.8369 null] +>> endobj +4079 0 obj << +/D [4007 0 R /XYZ 139.477 117.061 null] +>> endobj +4080 0 obj << +/D [4007 0 R /XYZ 139.477 117.061 null] +>> endobj +4081 0 obj << +/D [4007 0 R /XYZ 71.731 114.9042 null] +>> endobj +4082 0 obj << +/D [4007 0 R /XYZ 139.477 99.1283 null] +>> endobj +4083 0 obj << +/D [4007 0 R /XYZ 139.477 99.1283 null] +>> endobj +4084 0 obj << +/D [4007 0 R /XYZ 71.731 96.9714 null] +>> endobj +4006 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4087 0 obj << +/Length 1400 +/Filter /FlateDecode +>> +stream +xÚ­Y]o¤6}ϯàq"í¸¶1ö-m·«­Z)ZEڇ¦ŠÈàÉPg£üû^1c†ËG«U¤3ßããsï5 (ü±@2"C8ð”ð8âÁîõ†/ðÕçÖA¶fëƒ~~¸ù鷐)Icû LcIȐ“$bIðÿµù吵jn·<¢Nìñ¾Ì*¥ÿȞíåÝý{ò§Ò‡:ooÿ~øýæÓC? +%I2KRЄˆ8 ƒ-§$å,BQ †ˆ˜”|(BÙO†§$ÌL&Óãz˜™Í#çÑ5;Ó¥\¤? ‹{}¼ðpwy„I€¨±8óS"¤ÒÈÊ·ì½}:óL+ÃçLþ²’ÁA zF´â>×u©²êC§yyËèæÍüƒ¡ìg™Öêõ¨í…®í±¨Z•¥½x¤”—Êž«[m¾ß²h£ªº·ÇSµ;dՋÊGR9Qã”Áhº°D>lf‰zØâaqW,шºDû¢TO/M}:"ëÅ$ Ãx¸>­nŠê¥[žÝá¥9>҈2øÇìgµü­‚d²#¼$ŸŸI€j‚P™ÆÀ6!Ì䁛È]¸]&›ÏJú®*Ý"„„$ §2ؚԕ±MÝû¦Öµ~?ªý—Iw÷n9#1KìœÏ¬!të Ñì¤ƞÑOg7™â è¦4JŸšêü*óö<ù1Ý­‹néÚ¤øUµ»¦8ꢮÖþzŽæÜß¹8kšì½S|ß/Íi禴«+¬•½Î\–nçú¤‘¹ö1r{²?'Þ©ÔmW¿ìg²ùՍÒÕ®8K”_ [ s1Àj[3bë‹ ׍‘é¾i»e©;™¯ÇP#d$¨'Mñ|Ë¡"hÕU•ïÓ½fzwè¥Õå՝^‡·ÂÕ£gåÛFå1‘9_ykRÓўÆHøÁÚÏÑZéỲ´Yî|…šÝ®µs–¿ÕÚP÷Fø¬É^èjC J&ƒâ1„ '¦È¢•Ú¶êR¨SIm¡¾k²NsMŽq,èt™v7H «´ë> SšÁL)e£ê –ÿpµa1÷›lÙe¦ìøÈS£&»_ ¨Û”/t?6ÓýzØb÷Ãâ®è~#h÷и]ìfï~±€}ât÷»Cd}µÃ ö&§VMû–› “KÆõ`sÎu°eë"q×x÷šÇ„y}Ê´ó'Øiè~OàëKJvµ Dº[á굫ò]yŸ´/3û¶´yóasöu°eû"q×Øáq©·¯O©3ç§év9)OaG.Ó¥Œ÷a3’õ°EÉ°¸+$ÃxŒ%ÐÖG¿ñ_uðÕn0)H$Àí¨Bh룁®ÇšÔG0x ”1uZwטÆ0YЀ‡á!½Ùí=íê\á%‘'ÐÅ©:ÊˉÜM΅7…–…С¶> Ñt4Ú¤¨ÈAÀâN‹êîByx¦‹€åáÇdVöûk·gÏÕ´NaBâdêaô¢“›ÓÉÁ–uBâ®Ñ áéäóø/mt.Ñ(l(Íè|Òz¨™¤u¨å¤E¢®IÚkIëó°¶Àv1""I"“›²,0*_JY6cŶhE,î ++b<+xü¿FÚO)ŽI*Ò¥\õas9ز@HÜ5!<0|?lóÑ% ¡‰XHR5¤=j1I±¨+’tDOҏúùµÓOæM¶ †ä8‘ØÓÆbªv°I3²0ót°`F6gF[6#w˜}ƒÇ²o‡Ì½6Z¤²‹0|§¢î {9´7Ÿíá&Dâî‘@)ŽÓÙß$<Ìø'‰ˆKø–&ýHfNq<ùð_“±²0endstream +endobj +4086 0 obj << +/Type /Page +/Contents 4087 0 R +/Resources 4085 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +4088 0 obj << +/D [4086 0 R /XYZ 71.731 729.2652 null] +>> endobj +4089 0 obj << +/D [4086 0 R /XYZ 139.477 708.3437 null] +>> endobj +4090 0 obj << +/D [4086 0 R /XYZ 139.477 708.3437 null] +>> endobj +4091 0 obj << +/D [4086 0 R /XYZ 71.731 706.1869 null] +>> endobj +4092 0 obj << +/D [4086 0 R /XYZ 139.477 690.4109 null] +>> endobj +4093 0 obj << +/D [4086 0 R /XYZ 139.477 690.4109 null] +>> endobj +799 0 obj << +/D [4086 0 R /XYZ 71.731 667.4969 null] +>> endobj +314 0 obj << +/D [4086 0 R /XYZ 199.9499 622.2426 null] +>> endobj +4094 0 obj << +/D [4086 0 R /XYZ 71.731 602.1022 null] +>> endobj +4095 0 obj << +/D [4086 0 R /XYZ 161.0655 589.3659 null] +>> endobj +4096 0 obj << +/D [4086 0 R /XYZ 71.731 577.2464 null] +>> endobj +4097 0 obj << +/D [4086 0 R /XYZ 71.731 546.2167 null] +>> endobj +4098 0 obj << +/D [4086 0 R /XYZ 168.8063 534.8702 null] +>> endobj +4099 0 obj << +/D [4086 0 R /XYZ 71.731 522.7507 null] +>> endobj +4100 0 obj << +/D [4086 0 R /XYZ 71.731 468.0723 null] +>> endobj +4101 0 obj << +/D [4086 0 R /XYZ 181.5683 457.062 null] +>> endobj +4102 0 obj << +/D [4086 0 R /XYZ 71.731 446.9998 null] +>> endobj +4103 0 obj << +/D [4086 0 R /XYZ 71.731 415.4282 null] +>> endobj +4104 0 obj << +/D [4086 0 R /XYZ 71.731 402.4668 null] +>> endobj +4105 0 obj << +/D [4086 0 R /XYZ 71.731 401.2215 null] +>> endobj +4106 0 obj << +/D [4086 0 R /XYZ 129.5143 382.143 null] +>> endobj +4107 0 obj << +/D [4086 0 R /XYZ 129.5143 382.143 null] +>> endobj +4108 0 obj << +/D [4086 0 R /XYZ 71.731 380.7034 null] +>> endobj +4109 0 obj << +/D [4086 0 R /XYZ 71.731 380.7034 null] +>> endobj +4110 0 obj << +/D [4086 0 R /XYZ 139.477 364.2102 null] +>> endobj +4111 0 obj << +/D [4086 0 R /XYZ 139.477 364.2102 null] +>> endobj +4112 0 obj << +/D [4086 0 R /XYZ 76.7123 346.2774 null] +>> endobj +4113 0 obj << +/D [4086 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4114 0 obj << +/D [4086 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4115 0 obj << +/D [4086 0 R /XYZ 71.731 326.1879 null] +>> endobj +4116 0 obj << +/D [4086 0 R /XYZ 71.731 326.1879 null] +>> endobj +4117 0 obj << +/D [4086 0 R /XYZ 139.477 310.4119 null] +>> endobj +4118 0 obj << +/D [4086 0 R /XYZ 71.731 308.2551 null] +>> endobj +4119 0 obj << +/D [4086 0 R /XYZ 139.477 292.4792 null] +>> endobj +4120 0 obj << +/D [4086 0 R /XYZ 71.731 291.0396 null] +>> endobj +4121 0 obj << +/D [4086 0 R /XYZ 71.731 291.0396 null] +>> endobj +4122 0 obj << +/D [4086 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4123 0 obj << +/D [4086 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4124 0 obj << +/D [4086 0 R /XYZ 71.731 272.3896 null] +>> endobj +4125 0 obj << +/D [4086 0 R /XYZ 71.731 272.3896 null] +>> endobj +4126 0 obj << +/D [4086 0 R /XYZ 159.4023 256.6137 null] +>> endobj +4127 0 obj << +/D [4086 0 R /XYZ 71.731 255.1741 null] +>> endobj +4128 0 obj << +/D [4086 0 R /XYZ 159.4023 238.6809 null] +>> endobj +4129 0 obj << +/D [4086 0 R /XYZ 76.7123 220.7482 null] +>> endobj +4130 0 obj << +/D [4086 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4131 0 obj << +/D [4086 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4132 0 obj << +/D [4086 0 R /XYZ 71.731 200.6586 null] +>> endobj +4133 0 obj << +/D [4086 0 R /XYZ 71.731 200.6586 null] +>> endobj +4134 0 obj << +/D [4086 0 R /XYZ 159.4023 184.8827 null] +>> endobj +4135 0 obj << +/D [4086 0 R /XYZ 71.731 183.4431 null] +>> endobj +4136 0 obj << +/D [4086 0 R /XYZ 159.4023 166.9499 null] +>> endobj +4137 0 obj << +/D [4086 0 R /XYZ 76.7123 149.0172 null] +>> endobj +4138 0 obj << +/D [4086 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4139 0 obj << +/D [4086 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4140 0 obj << +/D [4086 0 R /XYZ 71.731 128.9276 null] +>> endobj +4141 0 obj << +/D [4086 0 R /XYZ 71.731 128.9276 null] +>> endobj +4142 0 obj << +/D [4086 0 R /XYZ 159.4023 113.1517 null] +>> endobj +4143 0 obj << +/D [4086 0 R /XYZ 71.731 110.9948 null] +>> endobj +4085 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4146 0 obj << +/Length 1392 +/Filter /FlateDecode +>> +stream +xÚÍZ]oä4}ï¯Èc+1Æß±yƒå«hA+T‹ªt&Ó L“ÑLŠÔCìԞ\ÇÖ²h¥M:=ñ=>>÷ÄI‡Øü#EIPÉ́jD¥ Åúé +æWß\ YYÌÊ}qwõé× iIeq·-˜–H”¼(EJUÜm~½~³«}}¼YQ¯)ïöU[÷o«‡ñÇÏßݎ'ß×ý®Ûœn~»ûîê«»©¾`%ÒÊY$ɔB‚³bE1ҔD¸FÜ5sÁ +1ÎÊi.T%"Ã<Í\&Ü&óžRqNŽ‚´À´ðtuϏ¯<ÜU WM‰0<0e!êx¬^Fɺíx<õǦ}üdüáç]ՏgýË¡ÝÃïõÚþ¶9YÔΝÕ7T\ÿyCÄuÝZPµ>ۚ‹LÙì™áW–…,©9*xehå£ÍÏNJJ΍xª”`Õ¸äîª9 ¦ +e$—°bf61WZpãeÁöa ž`ICu3< ñ<ð0Ó·n½Ý¯5ï1¦.'œDƒèãÙ±>ºöÔ<ìí[§làX;bc¯¯Úáó—¸ÌL"Ih™’Ùƒ-Éì`i™º92< ™}°ñþ3å]‹cŒJ^¦âÂC-ąC¥ã¨šç4"qáóXWû=”#L¨ƒ;™s²PæžKx*0|؂“'XÒÉPÝ 'C<'<‚;ܛA߄?#w5çÔv½ÞLÒªcõd6*§¸Ä’#¥H*,|ؒÄ––¨›#1À’Øç‘ÚWü‹ªÛæfLJ‰L…ŠńJT5#(f4à xôÍSÿtO!AX±dDx°%ÿ:XÚ¿@Ýÿ< ÿú<^ïl_V}íîDkÌAikÑi{¼«£ûÞ¾ëþ°.ÝWëz2°í‹zݵëô“±µè§n±Cºõ.º\3DN¥‰[X –\ ¨nÆj@<€Õx,n=þ· d‹Q%Áã£âÁ3¡’ÁUÍž 8x“º] ?Ҙe§Ò üQóÇü‡˜ ©üñaKŽw°´ãº9Žx@Ž÷yäì¬GÝ/ùTÃ)Aœèd´x°%¡,-4P7Gh€$´ÏãŸj.§½ít¦‚'RÃGÅScB%Sªš‘3pj<žêÓ©z¬á× æ~‰‡&K$)I%‡[0ôKª›ahˆ`è€G°Íþ¶y܍g{ϋv罩Oëcsègd'bì%^TUs"•Jń[RÕÁÒªusTx@ªú©baãk!ŵÕþmsêÃ¥ùû™kï^ºô[™¡Ø|ڎ‘HHS”Û¡V> pñl´¨Ǖ嬗Û]òð\l£> G¡ýRWH©¿wáaæ_»Ô> endobj +4147 0 obj << +/D [4145 0 R /XYZ 71.731 729.2652 null] +>> endobj +4148 0 obj << +/D [4145 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4149 0 obj << +/D [4145 0 R /XYZ 76.7123 690.4109 null] +>> endobj +4150 0 obj << +/D [4145 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4151 0 obj << +/D [4145 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4152 0 obj << +/D [4145 0 R /XYZ 71.731 670.3214 null] +>> endobj +4153 0 obj << +/D [4145 0 R /XYZ 71.731 670.3214 null] +>> endobj +4154 0 obj << +/D [4145 0 R /XYZ 159.4023 654.5454 null] +>> endobj +4155 0 obj << +/D [4145 0 R /XYZ 71.731 652.3886 null] +>> endobj +4156 0 obj << +/D [4145 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4157 0 obj << +/D [4145 0 R /XYZ 76.7123 618.6799 null] +>> endobj +4158 0 obj << +/D [4145 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4159 0 obj << +/D [4145 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4160 0 obj << +/D [4145 0 R /XYZ 71.731 598.5904 null] +>> endobj +4161 0 obj << +/D [4145 0 R /XYZ 71.731 598.5904 null] +>> endobj +4162 0 obj << +/D [4145 0 R /XYZ 159.4023 582.8144 null] +>> endobj +4163 0 obj << +/D [4145 0 R /XYZ 71.731 580.6576 null] +>> endobj +4164 0 obj << +/D [4145 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4165 0 obj << +/D [4145 0 R /XYZ 76.7123 546.9489 null] +>> endobj +4166 0 obj << +/D [4145 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4167 0 obj << +/D [4145 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4168 0 obj << +/D [4145 0 R /XYZ 71.731 526.8593 null] +>> endobj +4169 0 obj << +/D [4145 0 R /XYZ 71.731 526.8593 null] +>> endobj +4170 0 obj << +/D [4145 0 R /XYZ 159.4023 511.0834 null] +>> endobj +4171 0 obj << +/D [4145 0 R /XYZ 71.731 508.9266 null] +>> endobj +4172 0 obj << +/D [4145 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4173 0 obj << +/D [4145 0 R /XYZ 76.7123 475.2179 null] +>> endobj +4174 0 obj << +/D [4145 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4175 0 obj << +/D [4145 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4176 0 obj << +/D [4145 0 R /XYZ 71.731 455.1283 null] +>> endobj +4177 0 obj << +/D [4145 0 R /XYZ 71.731 455.1283 null] +>> endobj +4178 0 obj << +/D [4145 0 R /XYZ 159.4023 439.3524 null] +>> endobj +4179 0 obj << +/D [4145 0 R /XYZ 71.731 437.1956 null] +>> endobj +4180 0 obj << +/D [4145 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4181 0 obj << +/D [4145 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4182 0 obj << +/D [4145 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4183 0 obj << +/D [4145 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4184 0 obj << +/D [4145 0 R /XYZ 71.731 383.3973 null] +>> endobj +4185 0 obj << +/D [4145 0 R /XYZ 71.731 383.3973 null] +>> endobj +4186 0 obj << +/D [4145 0 R /XYZ 159.4023 367.6214 null] +>> endobj +4187 0 obj << +/D [4145 0 R /XYZ 71.731 365.4646 null] +>> endobj +4188 0 obj << +/D [4145 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4189 0 obj << +/D [4145 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4190 0 obj << +/D [4145 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4191 0 obj << +/D [4145 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4192 0 obj << +/D [4145 0 R /XYZ 71.731 311.6663 null] +>> endobj +4193 0 obj << +/D [4145 0 R /XYZ 71.731 311.6663 null] +>> endobj +4194 0 obj << +/D [4145 0 R /XYZ 159.4023 295.8904 null] +>> endobj +4195 0 obj << +/D [4145 0 R /XYZ 71.731 294.4508 null] +>> endobj +4196 0 obj << +/D [4145 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4197 0 obj << +/D [4145 0 R /XYZ 76.7123 260.0249 null] +>> endobj +4198 0 obj << +/D [4145 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4199 0 obj << +/D [4145 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4200 0 obj << +/D [4145 0 R /XYZ 71.731 239.9353 null] +>> endobj +4201 0 obj << +/D [4145 0 R /XYZ 71.731 239.9353 null] +>> endobj +4202 0 obj << +/D [4145 0 R /XYZ 159.4023 224.1594 null] +>> endobj +4203 0 obj << +/D [4145 0 R /XYZ 71.731 222.0026 null] +>> endobj +4204 0 obj << +/D [4145 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4205 0 obj << +/D [4145 0 R /XYZ 76.7123 152.4284 null] +>> endobj +4206 0 obj << +/D [4145 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4207 0 obj << +/D [4145 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4208 0 obj << +/D [4145 0 R /XYZ 71.731 132.3388 null] +>> endobj +4209 0 obj << +/D [4145 0 R /XYZ 71.731 132.3388 null] +>> endobj +4210 0 obj << +/D [4145 0 R /XYZ 139.477 116.5629 null] +>> endobj +4144 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4213 0 obj << +/Length 1546 +/Filter /FlateDecode +>> +stream +xÚµYߏœ6~¿¿b÷¤¬‹ &o×$M¯m¢StU+5Չï- [`Ýß1¶YæG¢{XàÆ3ß7ž± Þxð‡7!F¡?$B$`d“œn¼Í3üëý Ö&;m³³~|¼ùá'ßÛD( +H°yäq!šß⽺½{¸WDs,ÓúöïÇ_nÞ=vñ™¢ˆCYÕ&‰,˜Gˆ1nB#Ÿúa‹ó“h.UQ¿Æî¬î‰ç;cwV;ÛÌĆ'¡‡{±;3û3!l—‡‰3îð÷ŠÃŒrâ°8†¦~G\Uñ‹R¢<¨ßº©.I3g†à“‡ÌMŠ±ÚÙfWR°Ì©c6I +d–GhäŒ;MŠ5Æáó RÚâð#Dðã_òæ))S!Á hd"œs#M_+ʲ¢y¥®Þ}½Ål+ŠFÝn±·•îÔ­ñé&–fFù±–Ù±Æl™XGÜ5Äq¸‰µaˆ¯@ÌS–:h¥ q®¥5Ká2ûìyÊÌ$Ÿ>E09–è¼Zͱ©­–É]Ã儛J C¹ÿG$ÍSórvåh€Q³¼O&Lë¬xÖ|þqŒ5•­‹ÞüW¾5ѵ¶:š+qKض¯F|Ï0Lˁ„yä/éa™Í b̖qÄ]#ɇ[†%SÝlMÝPÕ7`[-ËýÛÚ¥E=äY¤êÉþe^ž' +5‹8",˜(áÚhg[9”úš‚bYZgÔi!Ì(' ««Q€«>Ž¬˜î_,€~á…4´¬f²ÐX-&¡#节p¦ ¡€þ2Q_=ļ0šª¯÷vAíe t©®*QŸË¢Îö¹~p(+GÒi™òùË´”"ÊøRY°Íæ1fˊ8⮑dˆÃ­‰ #‰óÜ¡¡Èó¢h¦H¿‘¨Ÿ˜ùF„"É/©¬Êíí9®â¬Ìëi5¬ç [ZÜÙfsj³e5qר1ÄáVÆÑd'±Vëüx7Âä³®½­#­A×Lb²K6eùEːljèÒ‹¤,R-e ºiG¿¼ÿS»<—ÉqZ8ØØ°ˆ,-m³9áŒÙ²pŽ¸k„âp gÃ8Cޖ…»º1 ›?hÿ»º)§ß³¾ÑȃÅ؂,W£Q´Ñ¢$ãˆ+ pÊa8‰ºŽŸ…»Ñ@O¦3eíçìù¨®r‹X]éRQ'Uvn2£ŠQjí§c+$($áR_±Íæ¸7fËì;â®áˆÃ­€ £ºÅÌ©AZ^ ³µŸôØÅ+‰e…]j¶Ù±Æl™XGÜ5Äq¸‰µaȆýTÄNj™‡"ï;5mÞ9D³àcŽè]»€#pÚ–Y ÏÕB¾}/š_ÛñmríÝ몴µárwÕ怦hâ¬èVL©€ÛÜ8ٗ—fô¦µ>à¼?̐ÐÛL×g‘¨n”ÖÙ2\˽$2R2$PEÁ>©5ï&íâÞùÞ¤WeÛ@Rïo‰·½4¢sTä/ã÷WONq“;Þº…PŸo™™{aç„H$R¥cÇñÆ›#˜Œå=aç`™ˆ +üP5¿»ôd–m'#Ï¿QêŒ3G’|,‹],‡×ƒñW̖'€Ÿ™‹œ{ß +—ã•Sè.ϕCÁ§2õÚé߂Öüž3}q©{󻉩…ûðÔ ìA¾ˆÜ™¹5™>Ç˜¢ˆBMŸ?·ÍfNã;³ÅÓxWܧñ#ýÆc`‡¬¥›<ê90‰_ >¦Èñrþ'ñu¥,/ÕôÁs‚ûŃRËj¦Ÿ«Åv›A8›¹áQŸ˜Ügr çÖªwBOʝÞÔu3aø¦úåˆã šýÆfٌ?±1Âáu`kj¬$րO~0süöBh¢endstream +endobj +4212 0 obj << +/Type /Page +/Contents 4213 0 R +/Resources 4211 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4214 0 obj << +/D [4212 0 R /XYZ 71.731 729.2652 null] +>> endobj +4215 0 obj << +/D [4212 0 R /XYZ 71.731 718.3063 null] +>> endobj +4216 0 obj << +/D [4212 0 R /XYZ 71.731 708.2442 null] +>> endobj +4217 0 obj << +/D [4212 0 R /XYZ 71.731 706.9988 null] +>> endobj +4218 0 obj << +/D [4212 0 R /XYZ 129.5143 687.9203 null] +>> endobj +4219 0 obj << +/D [4212 0 R /XYZ 71.731 685.7635 null] +>> endobj +4220 0 obj << +/D [4212 0 R /XYZ 71.731 685.7635 null] +>> endobj +4221 0 obj << +/D [4212 0 R /XYZ 139.477 669.9875 null] +>> endobj +4222 0 obj << +/D [4212 0 R /XYZ 139.477 669.9875 null] +>> endobj +4223 0 obj << +/D [4212 0 R /XYZ 71.731 668.548 null] +>> endobj +4224 0 obj << +/D [4212 0 R /XYZ 139.477 652.0548 null] +>> endobj +4225 0 obj << +/D [4212 0 R /XYZ 139.477 652.0548 null] +>> endobj +4226 0 obj << +/D [4212 0 R /XYZ 71.731 650.6152 null] +>> endobj +4227 0 obj << +/D [4212 0 R /XYZ 139.477 634.122 null] +>> endobj +4228 0 obj << +/D [4212 0 R /XYZ 139.477 634.122 null] +>> endobj +4229 0 obj << +/D [4212 0 R /XYZ 71.731 631.9652 null] +>> endobj +4230 0 obj << +/D [4212 0 R /XYZ 139.477 616.1893 null] +>> endobj +4231 0 obj << +/D [4212 0 R /XYZ 139.477 616.1893 null] +>> endobj +4232 0 obj << +/D [4212 0 R /XYZ 71.731 614.0324 null] +>> endobj +4233 0 obj << +/D [4212 0 R /XYZ 71.731 614.0324 null] +>> endobj +4234 0 obj << +/D [4212 0 R /XYZ 149.4396 598.2565 null] +>> endobj +4235 0 obj << +/D [4212 0 R /XYZ 76.7123 580.3238 null] +>> endobj +4236 0 obj << +/D [4212 0 R /XYZ 139.477 562.391 null] +>> endobj +4237 0 obj << +/D [4212 0 R /XYZ 139.477 562.391 null] +>> endobj +4238 0 obj << +/D [4212 0 R /XYZ 71.731 560.2342 null] +>> endobj +4239 0 obj << +/D [4212 0 R /XYZ 139.477 544.4583 null] +>> endobj +4240 0 obj << +/D [4212 0 R /XYZ 139.477 544.4583 null] +>> endobj +4241 0 obj << +/D [4212 0 R /XYZ 71.731 542.3014 null] +>> endobj +4242 0 obj << +/D [4212 0 R /XYZ 139.477 526.5255 null] +>> endobj +4243 0 obj << +/D [4212 0 R /XYZ 139.477 526.5255 null] +>> endobj +4244 0 obj << +/D [4212 0 R /XYZ 71.731 524.3687 null] +>> endobj +4245 0 obj << +/D [4212 0 R /XYZ 139.477 508.5928 null] +>> endobj +4246 0 obj << +/D [4212 0 R /XYZ 139.477 508.5928 null] +>> endobj +4247 0 obj << +/D [4212 0 R /XYZ 71.731 506.4359 null] +>> endobj +4248 0 obj << +/D [4212 0 R /XYZ 139.477 490.66 null] +>> endobj +4249 0 obj << +/D [4212 0 R /XYZ 139.477 490.66 null] +>> endobj +4250 0 obj << +/D [4212 0 R /XYZ 71.731 488.5032 null] +>> endobj +4251 0 obj << +/D [4212 0 R /XYZ 139.477 472.7273 null] +>> endobj +4252 0 obj << +/D [4212 0 R /XYZ 139.477 472.7273 null] +>> endobj +4253 0 obj << +/D [4212 0 R /XYZ 71.731 471.2877 null] +>> endobj +4254 0 obj << +/D [4212 0 R /XYZ 139.477 454.7945 null] +>> endobj +4255 0 obj << +/D [4212 0 R /XYZ 139.477 454.7945 null] +>> endobj +800 0 obj << +/D [4212 0 R /XYZ 71.731 431.8804 null] +>> endobj +318 0 obj << +/D [4212 0 R /XYZ 184.1294 386.6261 null] +>> endobj +4256 0 obj << +/D [4212 0 R /XYZ 71.731 363.1373 null] +>> endobj +4257 0 obj << +/D [4212 0 R /XYZ 161.0655 353.7494 null] +>> endobj +4258 0 obj << +/D [4212 0 R /XYZ 71.731 341.6299 null] +>> endobj +4259 0 obj << +/D [4212 0 R /XYZ 71.731 310.2641 null] +>> endobj +4260 0 obj << +/D [4212 0 R /XYZ 168.8063 299.2538 null] +>> endobj +4261 0 obj << +/D [4212 0 R /XYZ 71.731 272.1903 null] +>> endobj +4262 0 obj << +/D [4212 0 R /XYZ 71.731 232.4559 null] +>> endobj +4263 0 obj << +/D [4212 0 R /XYZ 71.731 200.8743 null] +>> endobj +4264 0 obj << +/D [4212 0 R /XYZ 181.5683 189.864 null] +>> endobj +4265 0 obj << +/D [4212 0 R /XYZ 71.731 179.8018 null] +>> endobj +4266 0 obj << +/D [4212 0 R /XYZ 71.731 146.3786 null] +>> endobj +4267 0 obj << +/D [4212 0 R /XYZ 71.731 135.2688 null] +>> endobj +4268 0 obj << +/D [4212 0 R /XYZ 71.731 134.0235 null] +>> endobj +4269 0 obj << +/D [4212 0 R /XYZ 129.5143 114.9449 null] +>> endobj +4270 0 obj << +/D [4212 0 R /XYZ 129.5143 114.9449 null] +>> endobj +4271 0 obj << +/D [4212 0 R /XYZ 71.731 113.5054 null] +>> endobj +4272 0 obj << +/D [4212 0 R /XYZ 71.731 113.5054 null] +>> endobj +4273 0 obj << +/D [4212 0 R /XYZ 139.477 97.0122 null] +>> endobj +4274 0 obj << +/D [4212 0 R /XYZ 139.477 97.0122 null] +>> endobj +4211 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4278 0 obj << +/Length 1287 +/Filter /FlateDecode +>> +stream +xÚµYÛnã6|ÏWèÑj–<¼ˆÜ·Ý¢[´Ýyð>u‹ÀI”XX×d¥Eþ¾T$ʔuxIá @ä(#Íh4£‹+¨ýaEÉHÉí %¡¸ûûŠö_¿\±²0+ôi}õãgN CŒU¬ +n‘¥(JDK¦‹õýŸ‹Ÿ¶›§¶j–+t¤_^ï6ûªý²¹íÿüxýkÿᏪÝîË¿Ö¿]ý¼ù%/‰Ñ–$*R0M§¦XqmùGQŒ"%+‹•2”fñî`À–§¤¬;˜7º£ù ÏÕ1ƒÂß¡ã=_žt¸­æ:¸.´5U‰Wö%³3Ññ½z¹y¨w±VÍ«ôÓyŠ(f•ÓWè‡ÞÚMÓl^ú‡‡~YïÛaÅpzŽmó|×ΏÏ)(ˆRã•;ùʺMŽÇÁ‚¾ÚQå ûê¶BuœLbÜØÿ–S“f†M¥ RHû1€V> +±ã|_A7³(ÊvÃm…ÊðÜV†íïT‡=öz~_‚\TK&ƒ=õ}µoëo”BA<0¶‘ª4& Œƒ¥ƒðæсƗÑ7f0écÛ6õíèâ¹­úUA®¥h„(%¥(!!‰C¥#„°æDè\ÆôB5FÈ×ñTUÍMwµªï‘+•ê¬/ùôJ5»,e¶ÒñKmo?LjéP+†˜:Û[ÐUiý‘PÞ°«n+T‡—:iuPàS§b~î:yhªúq߯ø¾d4ÜÔÞÏÁßî܄]T‚hmï" =XÌEK»ˆð済èÀ\ôuà¹z/c‡–J{9£L%ï£ÂQÉÆc¬ŸÉÀ?Ñѕ½}yªº I,¦u·—Ðzÿ˜lü ƕ1B5O–ÞƒÅâê`é¸"¼9qEt`qõuô„nÈÎrÔa8a’¦ÊìÃ"¤;o†;˜ĝ‰Ž`dÞdØP,!KZ&Jê£Â%Qɒb¬%ÉÀK:ÑaKŠôÓ¾òðRð÷è§ýE¸„T?}X,–N ›“@D–@_G=_ÚW×PƉëN¼í*Òv‡J·aÍiû¹Œ@Û}Á7e.  —­:I´¡©ªû°HJGX2¥oFJ1HJ':þïWXãA•¥e·§3a‘‹Yä`i‹Þ‹˜E¾Žh‘ßæÚP-@¨DM}T¸¦#*YSŒ5£¦3xM':^¿ÕB{*(‘T_¸¦ ì{ŽIÖԃÅ2è`é "¼9Dt`ôuœw]½Ï¨"*Yd3ÑÁÒ&"¼9&":0}Ñ"_ÚW7c\a¤J Û|XdØ6’Ã6Œ7cØ6ӁÛ&:šª}nö7uµëg“gg£› æؼMÉÅàÿ—úØNÏÍë5´Ûãä¬ôdÁ‘ +cŠH©‘Š‹ŒTFXr¤‚ñfŒT0ó‘ÊDþEÂ0šh¦LtHíaæ3j šPf̸§ŽR™àÄ!üŠÛ¸endstream +endobj +4277 0 obj << +/Type /Page +/Contents 4278 0 R +/Resources 4276 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4279 0 obj << +/D [4277 0 R /XYZ 71.731 729.2652 null] +>> endobj +4280 0 obj << +/D [4277 0 R /XYZ 76.7123 708.3437 null] +>> endobj +4281 0 obj << +/D [4277 0 R /XYZ 129.5143 690.4109 null] +>> endobj +4282 0 obj << +/D [4277 0 R /XYZ 129.5143 690.4109 null] +>> endobj +4283 0 obj << +/D [4277 0 R /XYZ 71.731 688.2541 null] +>> endobj +4284 0 obj << +/D [4277 0 R /XYZ 71.731 688.2541 null] +>> endobj +4285 0 obj << +/D [4277 0 R /XYZ 139.477 672.4782 null] +>> endobj +4286 0 obj << +/D [4277 0 R /XYZ 71.731 670.3214 null] +>> endobj +4287 0 obj << +/D [4277 0 R /XYZ 71.731 670.3214 null] +>> endobj +4288 0 obj << +/D [4277 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4289 0 obj << +/D [4277 0 R /XYZ 76.7123 636.6127 null] +>> endobj +4290 0 obj << +/D [4277 0 R /XYZ 139.477 618.6799 null] +>> endobj +4291 0 obj << +/D [4277 0 R /XYZ 71.731 617.2404 null] +>> endobj +4292 0 obj << +/D [4277 0 R /XYZ 71.731 617.2404 null] +>> endobj +4293 0 obj << +/D [4277 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4294 0 obj << +/D [4277 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4295 0 obj << +/D [4277 0 R /XYZ 71.731 598.5904 null] +>> endobj +4296 0 obj << +/D [4277 0 R /XYZ 71.731 598.5904 null] +>> endobj +4297 0 obj << +/D [4277 0 R /XYZ 159.4023 582.8144 null] +>> endobj +4298 0 obj << +/D [4277 0 R /XYZ 71.731 580.6576 null] +>> endobj +4299 0 obj << +/D [4277 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4300 0 obj << +/D [4277 0 R /XYZ 76.7123 546.9489 null] +>> endobj +4301 0 obj << +/D [4277 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4302 0 obj << +/D [4277 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4303 0 obj << +/D [4277 0 R /XYZ 71.731 526.8593 null] +>> endobj +4304 0 obj << +/D [4277 0 R /XYZ 71.731 526.8593 null] +>> endobj +4305 0 obj << +/D [4277 0 R /XYZ 159.4023 511.0834 null] +>> endobj +4306 0 obj << +/D [4277 0 R /XYZ 71.731 508.9266 null] +>> endobj +4307 0 obj << +/D [4277 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4308 0 obj << +/D [4277 0 R /XYZ 76.7123 475.2179 null] +>> endobj +4309 0 obj << +/D [4277 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4310 0 obj << +/D [4277 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4311 0 obj << +/D [4277 0 R /XYZ 71.731 455.1283 null] +>> endobj +4312 0 obj << +/D [4277 0 R /XYZ 71.731 455.1283 null] +>> endobj +4313 0 obj << +/D [4277 0 R /XYZ 159.4023 439.3524 null] +>> endobj +4314 0 obj << +/D [4277 0 R /XYZ 71.731 437.1956 null] +>> endobj +4315 0 obj << +/D [4277 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4316 0 obj << +/D [4277 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4317 0 obj << +/D [4277 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4318 0 obj << +/D [4277 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4319 0 obj << +/D [4277 0 R /XYZ 71.731 383.3973 null] +>> endobj +4320 0 obj << +/D [4277 0 R /XYZ 71.731 383.3973 null] +>> endobj +4321 0 obj << +/D [4277 0 R /XYZ 159.4023 367.6214 null] +>> endobj +4322 0 obj << +/D [4277 0 R /XYZ 71.731 365.4646 null] +>> endobj +4323 0 obj << +/D [4277 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4324 0 obj << +/D [4277 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4325 0 obj << +/D [4277 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4326 0 obj << +/D [4277 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4327 0 obj << +/D [4277 0 R /XYZ 71.731 311.6663 null] +>> endobj +4328 0 obj << +/D [4277 0 R /XYZ 71.731 311.6663 null] +>> endobj +4329 0 obj << +/D [4277 0 R /XYZ 159.4023 295.8904 null] +>> endobj +4330 0 obj << +/D [4277 0 R /XYZ 71.731 293.7336 null] +>> endobj +4331 0 obj << +/D [4277 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4332 0 obj << +/D [4277 0 R /XYZ 76.7123 260.0249 null] +>> endobj +4333 0 obj << +/D [4277 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4334 0 obj << +/D [4277 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4335 0 obj << +/D [4277 0 R /XYZ 71.731 239.9353 null] +>> endobj +4336 0 obj << +/D [4277 0 R /XYZ 71.731 239.9353 null] +>> endobj +4337 0 obj << +/D [4277 0 R /XYZ 159.4023 224.1594 null] +>> endobj +4338 0 obj << +/D [4277 0 R /XYZ 71.731 222.0026 null] +>> endobj +4339 0 obj << +/D [4277 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4340 0 obj << +/D [4277 0 R /XYZ 76.7123 152.4284 null] +>> endobj +4341 0 obj << +/D [4277 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4342 0 obj << +/D [4277 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4343 0 obj << +/D [4277 0 R /XYZ 71.731 132.3388 null] +>> endobj +4344 0 obj << +/D [4277 0 R /XYZ 71.731 132.3388 null] +>> endobj +4345 0 obj << +/D [4277 0 R /XYZ 139.477 116.5629 null] +>> endobj +4276 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4348 0 obj << +/Length 1077 +/Filter /FlateDecode +>> +stream +xÚµ˜]œ6†ï÷Wp9#í¸þÀìݦm¢6´Š¦WÝjEfœFÀ4Úßc0Œó‘‹h/`™×>/‡ãcH€á’ Éà@#D§Ááõ'øéñ’Õì\Ñ»ýÝ/ï" *‚ý׀Eq’Q¤8QÁþøÏæ×s|©t±ÝQŽ75ǧ4ÎtõWü¥ù÷ñéæ䓮Îù±Üþ»ÿóî÷}Ÿ3‰"AfMvª±M96 ‰çD+ÄB&kŸŸuu-²òa»S ÓS̼±;ÕΕµ±áŠÄ¤»“™ØϔòQ\JÁ¡Þ¸ÃãÍG;ÊëÃa„8 YßG\ñ[ó$ò¯Í±¬Šë¡›k‡ ˜SIî‡Òªv®ì…˜œê™ie“P ³0 #oÜi(í¨±¦PDXû` +¥ìÛ¸h]¼$GãdÀ0ĈcA £{hx%Yuos\·Y_åÍñû99œí¥sR6g߶oô–ð%ÿE§yv*§‘s¸ª%äŽly+[FùЇ¹kã›~{©Þ.Úǜ#N#Úg9šd'‹ýã–òÏv&?L"xg–XÞTs(­j™ä8è~ŽŽÀè!ˆIpûÿ3âô:ƒ‘DTĖ8:²9­l™¤'î”C~–®‹.Ê<óN`µ‘bªü]þœBÀ#…(Kµ×•Í@ïd‹Ð}qW@ùðBïÙ0…ÀKœqÈrE¦ˆ289ê¬Jž1¦ð(&y*ŒeK…Õ•ÍñleË<=q×ðúðótmÔkÙ$Taf–t +ê{Ã3/trÊ&¶G¹¾WÍѶáÆ%¢„×.k¬úEÓ¯ "TXǦÐmšNQªÍ]}4!š8û­À¨ç¥oiHQ ˜é>¥hºº§"¯r³úïq[Oz>Lz°Ña2ZÙ¡¿ì³Ìxó®b“—®òZL¯òTJ2. +¤+›)l±@úâ®(#ÞÙ³ñ\š=¨o™H„°½îœ=X_›ézë?¼f~بš 3…dä)ñu;QŠ¢Pª—ܑÍ%x+[NpOÜ5 îñáىö|øw¢+ºüÑ +Ã%’Š±1mŸ3,0ámù¤Ë265ó´Ý™ÊùSW—:Øi¸¢Ü·ÉRÿøbÖдê͢ΊúËv r”ýJ*¤ˆˆf?ä8šñwNԑ(êf2Ö%žü*ã ø?Òû> endobj +4349 0 obj << +/D [4347 0 R /XYZ 71.731 729.2652 null] +>> endobj +4350 0 obj << +/D [4347 0 R /XYZ 71.731 718.3063 null] +>> endobj +4351 0 obj << +/D [4347 0 R /XYZ 71.731 708.2442 null] +>> endobj +4352 0 obj << +/D [4347 0 R /XYZ 71.731 706.9988 null] +>> endobj +4353 0 obj << +/D [4347 0 R /XYZ 129.5143 687.9203 null] +>> endobj +4354 0 obj << +/D [4347 0 R /XYZ 71.731 685.7635 null] +>> endobj +4355 0 obj << +/D [4347 0 R /XYZ 71.731 685.7635 null] +>> endobj +4356 0 obj << +/D [4347 0 R /XYZ 139.477 669.9875 null] +>> endobj +4357 0 obj << +/D [4347 0 R /XYZ 139.477 669.9875 null] +>> endobj +4358 0 obj << +/D [4347 0 R /XYZ 71.731 667.8307 null] +>> endobj +4359 0 obj << +/D [4347 0 R /XYZ 139.477 652.0548 null] +>> endobj +4360 0 obj << +/D [4347 0 R /XYZ 139.477 652.0548 null] +>> endobj +4361 0 obj << +/D [4347 0 R /XYZ 71.731 649.898 null] +>> endobj +4362 0 obj << +/D [4347 0 R /XYZ 139.477 634.122 null] +>> endobj +4363 0 obj << +/D [4347 0 R /XYZ 139.477 634.122 null] +>> endobj +4364 0 obj << +/D [4347 0 R /XYZ 71.731 631.9652 null] +>> endobj +4365 0 obj << +/D [4347 0 R /XYZ 139.477 616.1893 null] +>> endobj +4366 0 obj << +/D [4347 0 R /XYZ 139.477 616.1893 null] +>> endobj +4367 0 obj << +/D [4347 0 R /XYZ 71.731 614.0324 null] +>> endobj +4368 0 obj << +/D [4347 0 R /XYZ 139.477 598.2565 null] +>> endobj +4369 0 obj << +/D [4347 0 R /XYZ 139.477 598.2565 null] +>> endobj +4370 0 obj << +/D [4347 0 R /XYZ 71.731 596.0997 null] +>> endobj +4371 0 obj << +/D [4347 0 R /XYZ 139.477 580.3238 null] +>> endobj +4372 0 obj << +/D [4347 0 R /XYZ 139.477 580.3238 null] +>> endobj +801 0 obj << +/D [4347 0 R /XYZ 71.731 557.4097 null] +>> endobj +322 0 obj << +/D [4347 0 R /XYZ 223.2771 512.1554 null] +>> endobj +4373 0 obj << +/D [4347 0 R /XYZ 71.731 488.6666 null] +>> endobj +4374 0 obj << +/D [4347 0 R /XYZ 161.0655 479.2787 null] +>> endobj +4375 0 obj << +/D [4347 0 R /XYZ 71.731 467.1592 null] +>> endobj +4376 0 obj << +/D [4347 0 R /XYZ 71.731 435.7933 null] +>> endobj +4377 0 obj << +/D [4347 0 R /XYZ 168.8063 424.783 null] +>> endobj +4378 0 obj << +/D [4347 0 R /XYZ 71.731 412.6636 null] +>> endobj +4379 0 obj << +/D [4347 0 R /XYZ 71.731 381.2977 null] +>> endobj +4380 0 obj << +/D [4347 0 R /XYZ 181.5683 370.2874 null] +>> endobj +4381 0 obj << +/D [4347 0 R /XYZ 71.731 360.2252 null] +>> endobj +4382 0 obj << +/D [4347 0 R /XYZ 71.731 326.802 null] +>> endobj +4383 0 obj << +/D [4347 0 R /XYZ 71.731 315.6922 null] +>> endobj +4384 0 obj << +/D [4347 0 R /XYZ 71.731 314.4469 null] +>> endobj +4385 0 obj << +/D [4347 0 R /XYZ 129.5143 295.3684 null] +>> endobj +4386 0 obj << +/D [4347 0 R /XYZ 129.5143 295.3684 null] +>> endobj +4387 0 obj << +/D [4347 0 R /XYZ 71.731 293.9288 null] +>> endobj +4388 0 obj << +/D [4347 0 R /XYZ 71.731 293.9288 null] +>> endobj +4389 0 obj << +/D [4347 0 R /XYZ 139.477 277.4356 null] +>> endobj +4390 0 obj << +/D [4347 0 R /XYZ 139.477 277.4356 null] +>> endobj +4391 0 obj << +/D [4347 0 R /XYZ 71.731 239.5776 null] +>> endobj +4392 0 obj << +/D [4347 0 R /XYZ 71.731 226.5266 null] +>> endobj +4393 0 obj << +/D [4347 0 R /XYZ 71.731 225.2813 null] +>> endobj +4394 0 obj << +/D [4347 0 R /XYZ 129.5143 206.2027 null] +>> endobj +802 0 obj << +/D [4347 0 R /XYZ 71.731 199.0646 null] +>> endobj +326 0 obj << +/D [4347 0 R /XYZ 225.7901 155.9671 null] +>> endobj +4395 0 obj << +/D [4347 0 R /XYZ 71.731 132.2115 null] +>> endobj +4396 0 obj << +/D [4347 0 R /XYZ 161.0655 123.0904 null] +>> endobj +4397 0 obj << +/D [4347 0 R /XYZ 71.731 110.9709 null] +>> endobj +4346 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4400 0 obj << +/Length 1331 +/Filter /FlateDecode +>> +stream +xÚµY]o£8}ï¯Èc"5^`ƒç­û©YÍJ£QßvV#’¸-+B* ªúï×›^Â5¦£õhŽ}OαÃVÔþ±UÊH*ì…k•ä«ýñ†®íGÜ0Ù:Ì‚~¾¿ùéwAWšhÅÕêþa%´"2MV©à$“,[Ýþ^ÿò”?·¦Þl¹¤kNúëç2¯Lû)ßõwŸ?ö7™öéth6ÿÜÿyóÛýP_Š”èÌ™%9 ¦4¹4ÓDJ–®Rš‘ˆôÂóWÓìëâ¹-NՇ®þ¥Qf©¤käšo9#ŠeúÒä‹iÏuÕôÔóÊ]ë:íoOýµiëó¾u¸ý©jó¢*ªÇþù`ìcé;ٝÎm{4M“?šþ¡5Çç2oMãôûø0úö•R^¶¶ö²®ûæÙì‹îSsè†heÛ2;©Äeå‰F놅õ­¦<Æ +M’4Ó¸³ºô+¢®TD%x­¯ +¼¾ˆ¬Ç¾»>²§þznL퉦„)¦#÷°¨{±º Ü;ၻwÄÃÍÓߊË|9U:ÍT•Æ—Åaöëƒ[BNRN8×,âa›ñð‹z«»ÀðqÑêtëwH`•„+mX3™®U,÷6§™‡Å5Cê.Ñ áhiŒgI¸W¸ZÛ'T]gB¡„Âr -D!]÷Ô'av—š*´jXßjJcÙÄÒ°ûð1Så»Ò`³bB‰¤Ù8ª»“Ýø­ß°q›úÒã&ôXfoh`.ô¨-„!ºNz ++­D’r´nXXß +åŒ'-Ê؇“ͦÛÁíq•(%‰ÎXL%›SÉÃâ*!u—¨„ðÀT‚<ÂÞùá\ЄJˆ<Zˆ +‡v@EC‹U]Ú <´#~-Þ¹›‰æÖÁB†‰í[ëXl!lƐ,jH¬îCb<CŽx|çŠ:Œ‰gÄþ¬‰EÂæò°¸BHÝ% +!<0… ÿoâ"Æ5'š²H\!*׍+VuA\'4ð¸Žx 'È"+‰´ØVûÓǖÉba…°+°¨±º ¬ˆñ@¬8âö”WG¦„ + *„Í©ãaquºKÔAx`ê@ï +jP0,Îì°i,¤5RŠ‡©º$¤×4!…<šóî_Óÿ¾œn„m“² r*i4£6çB‹»©»Ä…̅GØrÍùxÌë× 8,“DP‹(„͈3À¢â`uˆƒñ@ÄñxWDCzù#!ÆD÷Ž%v< +a3L,zÀ„Õ]pÀ4á0x¸3õ‡âr¢Žœ/q’ðL`çKJ®¨ŸŠæêýÂøŒÞæõÅ®‡íÞw%ɘҳ¯ÄfúFLÚ=ev×éQã”ßo!ÿë&?Ðendstream +endobj +4399 0 obj << +/Type /Page +/Contents 4400 0 R +/Resources 4398 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4401 0 obj << +/D [4399 0 R /XYZ 71.731 729.2652 null] +>> endobj +4402 0 obj << +/D [4399 0 R /XYZ 71.731 718.3063 null] +>> endobj +4403 0 obj << +/D [4399 0 R /XYZ 168.8063 708.3437 null] +>> endobj +4404 0 obj << +/D [4399 0 R /XYZ 71.731 696.2242 null] +>> endobj +4405 0 obj << +/D [4399 0 R /XYZ 71.731 631.741 null] +>> endobj +4406 0 obj << +/D [4399 0 R /XYZ 181.5683 618.8792 null] +>> endobj +4407 0 obj << +/D [4399 0 R /XYZ 71.731 608.817 null] +>> endobj +4408 0 obj << +/D [4399 0 R /XYZ 71.731 576.0394 null] +>> endobj +4409 0 obj << +/D [4399 0 R /XYZ 71.731 564.284 null] +>> endobj +4410 0 obj << +/D [4399 0 R /XYZ 71.731 563.0387 null] +>> endobj +4411 0 obj << +/D [4399 0 R /XYZ 129.5143 543.9601 null] +>> endobj +4412 0 obj << +/D [4399 0 R /XYZ 129.5143 543.9601 null] +>> endobj +4413 0 obj << +/D [4399 0 R /XYZ 71.731 542.5206 null] +>> endobj +4414 0 obj << +/D [4399 0 R /XYZ 71.731 542.5206 null] +>> endobj +4415 0 obj << +/D [4399 0 R /XYZ 139.477 526.0274 null] +>> endobj +4416 0 obj << +/D [4399 0 R /XYZ 139.477 526.0274 null] +>> endobj +4417 0 obj << +/D [4399 0 R /XYZ 76.7123 508.0946 null] +>> endobj +4418 0 obj << +/D [4399 0 R /XYZ 129.5143 490.1619 null] +>> endobj +4419 0 obj << +/D [4399 0 R /XYZ 129.5143 490.1619 null] +>> endobj +4420 0 obj << +/D [4399 0 R /XYZ 71.731 488.0051 null] +>> endobj +4421 0 obj << +/D [4399 0 R /XYZ 71.731 488.0051 null] +>> endobj +4422 0 obj << +/D [4399 0 R /XYZ 139.477 472.2291 null] +>> endobj +4423 0 obj << +/D [4399 0 R /XYZ 71.731 470.0723 null] +>> endobj +4424 0 obj << +/D [4399 0 R /XYZ 139.477 454.2964 null] +>> endobj +4425 0 obj << +/D [4399 0 R /XYZ 71.731 452.8568 null] +>> endobj +4426 0 obj << +/D [4399 0 R /XYZ 71.731 452.8568 null] +>> endobj +4427 0 obj << +/D [4399 0 R /XYZ 149.4396 436.3636 null] +>> endobj +4428 0 obj << +/D [4399 0 R /XYZ 149.4396 436.3636 null] +>> endobj +4429 0 obj << +/D [4399 0 R /XYZ 71.731 434.2068 null] +>> endobj +4430 0 obj << +/D [4399 0 R /XYZ 71.731 434.2068 null] +>> endobj +4431 0 obj << +/D [4399 0 R /XYZ 159.4023 418.4309 null] +>> endobj +4432 0 obj << +/D [4399 0 R /XYZ 71.731 416.2741 null] +>> endobj +4433 0 obj << +/D [4399 0 R /XYZ 159.4023 400.4981 null] +>> endobj +4434 0 obj << +/D [4399 0 R /XYZ 76.7123 382.5654 null] +>> endobj +4435 0 obj << +/D [4399 0 R /XYZ 149.4396 364.6326 null] +>> endobj +4436 0 obj << +/D [4399 0 R /XYZ 149.4396 364.6326 null] +>> endobj +4437 0 obj << +/D [4399 0 R /XYZ 71.731 362.4758 null] +>> endobj +4438 0 obj << +/D [4399 0 R /XYZ 71.731 362.4758 null] +>> endobj +4439 0 obj << +/D [4399 0 R /XYZ 159.4023 346.6999 null] +>> endobj +4440 0 obj << +/D [4399 0 R /XYZ 71.731 344.543 null] +>> endobj +4441 0 obj << +/D [4399 0 R /XYZ 159.4023 328.7671 null] +>> endobj +4442 0 obj << +/D [4399 0 R /XYZ 76.7123 310.8344 null] +>> endobj +4443 0 obj << +/D [4399 0 R /XYZ 149.4396 292.9016 null] +>> endobj +4444 0 obj << +/D [4399 0 R /XYZ 149.4396 292.9016 null] +>> endobj +4445 0 obj << +/D [4399 0 R /XYZ 71.731 290.7448 null] +>> endobj +4446 0 obj << +/D [4399 0 R /XYZ 71.731 290.7448 null] +>> endobj +4447 0 obj << +/D [4399 0 R /XYZ 159.4023 274.9689 null] +>> endobj +4448 0 obj << +/D [4399 0 R /XYZ 71.731 272.812 null] +>> endobj +4449 0 obj << +/D [4399 0 R /XYZ 159.4023 257.0361 null] +>> endobj +4450 0 obj << +/D [4399 0 R /XYZ 76.7123 239.1034 null] +>> endobj +4451 0 obj << +/D [4399 0 R /XYZ 149.4396 221.1706 null] +>> endobj +4452 0 obj << +/D [4399 0 R /XYZ 149.4396 221.1706 null] +>> endobj +4453 0 obj << +/D [4399 0 R /XYZ 71.731 219.0138 null] +>> endobj +4454 0 obj << +/D [4399 0 R /XYZ 71.731 219.0138 null] +>> endobj +4455 0 obj << +/D [4399 0 R /XYZ 159.4023 203.2379 null] +>> endobj +4456 0 obj << +/D [4399 0 R /XYZ 71.731 201.081 null] +>> endobj +4457 0 obj << +/D [4399 0 R /XYZ 159.4023 185.3051 null] +>> endobj +4458 0 obj << +/D [4399 0 R /XYZ 76.7123 131.5068 null] +>> endobj +4459 0 obj << +/D [4399 0 R /XYZ 129.5143 113.5741 null] +>> endobj +4460 0 obj << +/D [4399 0 R /XYZ 129.5143 113.5741 null] +>> endobj +4461 0 obj << +/D [4399 0 R /XYZ 71.731 111.4173 null] +>> endobj +4462 0 obj << +/D [4399 0 R /XYZ 71.731 111.4173 null] +>> endobj +4398 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4465 0 obj << +/Length 936 +/Filter /FlateDecode +>> +stream +xڝWQo£8~ï¯à±‘ŠÏll÷­·{·ÚÕ^­òv=hâmÙ%Ùªÿþ†ˆ  SŒÛÏ3ß|όY@ñ‡’áš@, Øîohð‚útÃZHØbBôûææ·?#h¢cˆƒÍ÷ Ò1’2¢SÁf÷÷í‡×äP›r‚ ·@ìºÎ’ÜÔ_“g»}X¶™úµØU«6_nþØôþE$‰Vèd’$§ŠðXEA”h`‹bhB0Ž(‰øˆG²t kÅ`z\k¢y—ì†KëÀ5Øù½\Ï<ºS^gQY¤ —rH£ªË4iˆ !ĂÀx%Šjq|3õ±Ì«ûWD Ád£¤ŒQåרC….쬑–Ôj4²vU#dÏÀë÷ºFÝ)/G£î5à‘”eònóªønWÔí¸­Çäºã“ŠÍ$Ž ›Hœ6›8>¿ gÄ#RBQbî&΀†É“çÌì&rJ•}4¸{«×sQd&ÉïºÛYUɋ±›´²«cѯ)e8æ猦lJÓ6¯©ÇïM/yø5uiì­,ÿ¦>YELbŽ5q «½¾^Uw&¯Ó'JKæ5I…ŠHÄÐþ´¤.lBÒ6+©ÏïIG<¼’hÔfȒÚøòT– +êZò‹ I­æÄt`Sbv°y1=~—ˆyÉÃ/¦K£:>ÿ0¶êï<ãzqrVÇý>)ß[C‹$ØeOŽCF%Q7a¬‹?™"EÓò¥ºýdêGS¿­«qùÓiô—œÐPl=Í!cÛïÖeQõûÁÜ÷'ÎA·gC`$fJŸtÞØÀÛ)Š'*hr¬_qeÿagÎõÿÑTÛ2=Ôi‘/eÐv`ë3±K–Võ°!%Yf?~­@àkÈi›ŸÉÛ_ìmd)ã‡,+“o¦µø +y5KÞrOvû´+ú‡´ý8VX’8½½ë.Ööµý̋YÊk½bg™`<¦œ˜O@Qó™ùąMÌ'=lv>ñù]0ŸŒx ¯eW<š$ôÈœP6º’8¶Ü] ËÍù¦[l“&/]ä±¼^ï Â5›k.l¢Þõ°Ùzçó» Þxxë݀ÆêboüÿêÇYíík¿èïƒÀeóêÙ à|ÙÎ4ŽBÍ à.l"Á{Øl‚ûü.HpÏ>àáÀÏJ?ú‹Ü%õöñÉQ,֓ïS3~ž +Px³´î-5%\}lzþ |iendstream +endobj +4464 0 obj << +/Type /Page +/Contents 4465 0 R +/Resources 4463 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4466 0 obj << +/D [4464 0 R /XYZ 71.731 729.2652 null] +>> endobj +4467 0 obj << +/D [4464 0 R /XYZ 71.731 741.2204 null] +>> endobj +4468 0 obj << +/D [4464 0 R /XYZ 139.477 708.3437 null] +>> endobj +4469 0 obj << +/D [4464 0 R /XYZ 71.731 670.4857 null] +>> endobj +4470 0 obj << +/D [4464 0 R /XYZ 71.731 657.4347 null] +>> endobj +4471 0 obj << +/D [4464 0 R /XYZ 71.731 656.1894 null] +>> endobj +4472 0 obj << +/D [4464 0 R /XYZ 129.5143 637.1108 null] +>> endobj +4473 0 obj << +/D [4464 0 R /XYZ 71.731 634.954 null] +>> endobj +4474 0 obj << +/D [4464 0 R /XYZ 71.731 634.954 null] +>> endobj +4475 0 obj << +/D [4464 0 R /XYZ 139.477 619.1781 null] +>> endobj +4476 0 obj << +/D [4464 0 R /XYZ 139.477 619.1781 null] +>> endobj +4477 0 obj << +/D [4464 0 R /XYZ 71.731 617.0212 null] +>> endobj +4478 0 obj << +/D [4464 0 R /XYZ 139.477 601.2453 null] +>> endobj +4479 0 obj << +/D [4464 0 R /XYZ 139.477 601.2453 null] +>> endobj +4480 0 obj << +/D [4464 0 R /XYZ 71.731 599.0885 null] +>> endobj +4481 0 obj << +/D [4464 0 R /XYZ 139.477 583.3126 null] +>> endobj +4482 0 obj << +/D [4464 0 R /XYZ 139.477 583.3126 null] +>> endobj +4483 0 obj << +/D [4464 0 R /XYZ 71.731 581.1557 null] +>> endobj +4484 0 obj << +/D [4464 0 R /XYZ 139.477 565.3798 null] +>> endobj +4485 0 obj << +/D [4464 0 R /XYZ 139.477 565.3798 null] +>> endobj +803 0 obj << +/D [4464 0 R /XYZ 71.731 542.4657 null] +>> endobj +330 0 obj << +/D [4464 0 R /XYZ 281.8432 497.2114 null] +>> endobj +4486 0 obj << +/D [4464 0 R /XYZ 71.731 477.0711 null] +>> endobj +4487 0 obj << +/D [4464 0 R /XYZ 161.0655 464.3347 null] +>> endobj +4488 0 obj << +/D [4464 0 R /XYZ 71.731 452.2152 null] +>> endobj +4489 0 obj << +/D [4464 0 R /XYZ 71.731 421.1856 null] +>> endobj +4490 0 obj << +/D [4464 0 R /XYZ 168.8063 409.8391 null] +>> endobj +4491 0 obj << +/D [4464 0 R /XYZ 71.731 397.7196 null] +>> endobj +4492 0 obj << +/D [4464 0 R /XYZ 71.731 368.2053 null] +>> endobj +4493 0 obj << +/D [4464 0 R /XYZ 181.5683 355.3434 null] +>> endobj +4494 0 obj << +/D [4464 0 R /XYZ 71.731 345.2813 null] +>> endobj +4495 0 obj << +/D [4464 0 R /XYZ 71.731 311.8581 null] +>> endobj +4496 0 obj << +/D [4464 0 R /XYZ 71.731 300.7483 null] +>> endobj +4497 0 obj << +/D [4464 0 R /XYZ 71.731 299.5029 null] +>> endobj +4498 0 obj << +/D [4464 0 R /XYZ 129.5143 280.4244 null] +>> endobj +4499 0 obj << +/D [4464 0 R /XYZ 129.5143 280.4244 null] +>> endobj +4500 0 obj << +/D [4464 0 R /XYZ 71.731 278.9848 null] +>> endobj +4501 0 obj << +/D [4464 0 R /XYZ 71.731 278.9848 null] +>> endobj +4502 0 obj << +/D [4464 0 R /XYZ 139.477 262.4916 null] +>> endobj +4503 0 obj << +/D [4464 0 R /XYZ 139.477 262.4916 null] +>> endobj +4504 0 obj << +/D [4464 0 R /XYZ 71.731 224.6336 null] +>> endobj +4505 0 obj << +/D [4464 0 R /XYZ 71.731 211.5826 null] +>> endobj +4506 0 obj << +/D [4464 0 R /XYZ 71.731 210.3373 null] +>> endobj +4507 0 obj << +/D [4464 0 R /XYZ 129.5143 191.2588 null] +>> endobj +804 0 obj << +/D [4464 0 R /XYZ 71.731 184.1206 null] +>> endobj +4463 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4510 0 obj << +/Length 920 +/Filter /FlateDecode +>> +stream +xÚ½W]oã(}ï¯ðc"Õ,`c`Þº_Õ¬vGÕ(oÓÕȍic­cG6Þªÿ~/;8&i4Úåˆ/÷ž{8\€D~$âñ*͍¶û½À§ûâLbgûF?on~ú=Á‘D2£Y´yŽ™!Æӈ' FD´)¾¬~Ùå­ÚuL^Qdۇ*¯•þ3²Ã»‡¶ó—Ò»¦èÖoþ¸ùm3Åg GR@‹ '«%LJ"Â%,58nj1C<å|€IÏ 8.V÷JRúuMñªiÿÙ¬3¼z;¨x’^Â)G‚bÅ&ažYOm£ 3>L3ÌȆÐnnL ʈÃ„1qñ„‹70òˆÎ{½ƒ–Ä£CÁ¯ªÛ¶åA—M}-†ÏJ÷míb涩ÊNÛ^óì>T•íü»¦ Fea‡õ¾ýäߡkñÞUUc¾*çïsS©î]èy^ìËúÖÎ;”®Ów ¸¯ÜP«íÎuë¦P×âzXȲÍ÷ +lñøª$D"ƏRa‚Bªœ¬bß̪RF XŽ‰A°ôf > endobj +4511 0 obj << +/D [4509 0 R /XYZ 71.731 729.2652 null] +>> endobj +334 0 obj << +/D [4509 0 R /XYZ 259.7903 705.7477 null] +>> endobj +4512 0 obj << +/D [4509 0 R /XYZ 71.731 682.2589 null] +>> endobj +4513 0 obj << +/D [4509 0 R /XYZ 161.0655 672.871 null] +>> endobj +4514 0 obj << +/D [4509 0 R /XYZ 71.731 660.7515 null] +>> endobj +4515 0 obj << +/D [4509 0 R /XYZ 71.731 574.89 null] +>> endobj +4516 0 obj << +/D [4509 0 R /XYZ 181.5683 563.8797 null] +>> endobj +4517 0 obj << +/D [4509 0 R /XYZ 71.731 553.8175 null] +>> endobj +4518 0 obj << +/D [4509 0 R /XYZ 71.731 520.3944 null] +>> endobj +4519 0 obj << +/D [4509 0 R /XYZ 71.731 509.2845 null] +>> endobj +4520 0 obj << +/D [4509 0 R /XYZ 71.731 508.0392 null] +>> endobj +4521 0 obj << +/D [4509 0 R /XYZ 129.5143 488.9607 null] +>> endobj +4522 0 obj << +/D [4509 0 R /XYZ 129.5143 488.9607 null] +>> endobj +4523 0 obj << +/D [4509 0 R /XYZ 71.731 487.5211 null] +>> endobj +4524 0 obj << +/D [4509 0 R /XYZ 71.731 487.5211 null] +>> endobj +4525 0 obj << +/D [4509 0 R /XYZ 139.477 471.0279 null] +>> endobj +4526 0 obj << +/D [4509 0 R /XYZ 139.477 471.0279 null] +>> endobj +4527 0 obj << +/D [4509 0 R /XYZ 71.731 433.1699 null] +>> endobj +4528 0 obj << +/D [4509 0 R /XYZ 71.731 420.1189 null] +>> endobj +4529 0 obj << +/D [4509 0 R /XYZ 71.731 418.8736 null] +>> endobj +4530 0 obj << +/D [4509 0 R /XYZ 129.5143 399.795 null] +>> endobj +805 0 obj << +/D [4509 0 R /XYZ 71.731 392.6569 null] +>> endobj +338 0 obj << +/D [4509 0 R /XYZ 247.4128 349.5594 null] +>> endobj +4531 0 obj << +/D [4509 0 R /XYZ 71.731 326.0706 null] +>> endobj +4532 0 obj << +/D [4509 0 R /XYZ 161.0655 316.6827 null] +>> endobj +4533 0 obj << +/D [4509 0 R /XYZ 71.731 304.5632 null] +>> endobj +4534 0 obj << +/D [4509 0 R /XYZ 71.731 273.1973 null] +>> endobj +4535 0 obj << +/D [4509 0 R /XYZ 168.8063 262.1871 null] +>> endobj +4536 0 obj << +/D [4509 0 R /XYZ 71.731 250.0676 null] +>> endobj +4537 0 obj << +/D [4509 0 R /XYZ 71.731 195.3891 null] +>> endobj +4538 0 obj << +/D [4509 0 R /XYZ 181.5683 184.3788 null] +>> endobj +4539 0 obj << +/D [4509 0 R /XYZ 71.731 174.3167 null] +>> endobj +4540 0 obj << +/D [4509 0 R /XYZ 71.731 140.8935 null] +>> endobj +4541 0 obj << +/D [4509 0 R /XYZ 71.731 129.7837 null] +>> endobj +4542 0 obj << +/D [4509 0 R /XYZ 71.731 128.5383 null] +>> endobj +4543 0 obj << +/D [4509 0 R /XYZ 129.5143 109.4598 null] +>> endobj +4544 0 obj << +/D [4509 0 R /XYZ 129.5143 109.4598 null] +>> endobj +4545 0 obj << +/D [4509 0 R /XYZ 71.731 108.0202 null] +>> endobj +4546 0 obj << +/D [4509 0 R /XYZ 71.731 108.0202 null] +>> endobj +4508 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4549 0 obj << +/Length 1345 +/Filter /FlateDecode +>> +stream +xÚµYˎÛ6ÝÏWh9Ô,Iñ™]´E‹´ïš"plyÆÀŒ=°åEÿ¾Ôƒò¥uùðEv|ù³iŸ›ÓÃ?Ë?î~YNõe­‰5®H’¤ †eêjÁ)±œIÅÜ’ ‡Ò_‹ZO“á¶Ò„uu“™p¬›ÍWÎå5;æ¦K¹°Ð×½þ¼ððWÍyÔ¦2NT%zµ%BëÆûsû4hՑé™_nƒTD wh}7({j»ýãO£ÞîòfßîÖ«vwØ¿½ ÃõßÛÃðy>5³É2'‹dºRš;^¿ja‘­¦ƒÈ³Ñ¢"sî¦Ï8Z7.²¿jÎ#Ùßì€Çþ°i‡óë·íî¹óð\kcˆ±T…Z¯ŽÇÕ¿Ã×ÃvøÜíÛñ‡#¼³ßÎëv>sÏM +"…[CXÂÖ,kk¬n­1á¼­77#;W;ó3®qFТ‰®ÇŠ*$˜kKZ¡Uã +ù«P@!áh¸–òpzŒ!þ˹søÖ{t”kÓåú+¥|°+ª3Dik3TB#Êk„T-Ñ¡iy½•i¿zi¢9“Æ=¾˜Èå Â9›`ٜau r†ñ˜ç, 14ÿ0h\߸k÷í¨Tçßð0I%ˆ1,“2ˆŠ;hBe„U-pЌFØù½ƒ—οÞ°JA5 »þ¬SEºÙlzž€PÄ +‰¥G- Qu6ZTVé’”£uã²ú«PÀvÒñ ¼yüHóš&æ‚E™â9™,%“‡åeBê–È„ðÀd‚I§9IM¸‘¹¬BXJ!Ë+„Ô-Qá)yDms³h>ZœÁl.¦•ˆ©GåcŠT-‰é5HL!MsZw¯ýÎy´2¢”ÑÿK^iM„QÙ¼Xʍ–w#R·Ä̍GÞzWê£BÕFº]¹ÈÅÂBM°¬PXÝ¡0ˆP7Å6¥?ȨYM w¤E ,q,2Á²Ç"X݂c‘üX$àqlÚóqÿm»kž‡£º+Å»#njìLDÉûQàO»Sê߯^ºƒ#¨¡Xt¯Æ­ì`r{5KìÕ&Xv¯†Õ-Ø«a<æ{µ€Æ¥©¹–ËnïI‰¡Vö€/½B§wQKr·RRˌ%!,aÉ –µ$V·À’ Ñt¯ <ΩÃ4NÑ\˜œq,eË©[bœkèq@£Ûúí+–Pá:!·üքv#žü~dŒéÓîtù#옑å 3†hËÓ«Š/n<(»¶AJ,mȹ$mî½A˜ä.º*÷JÂv›`Y»au ì6ãÚ- Qtd2;1yó¦v’¢ÄÚ:—cK ëaya‘º%Â^óÀ……4ÛZjmâ-Ïí'ŸŒiBËiyA¥¤Qy%çEK„¼"ë8¬ûm÷'Ö߸jqÃv}<Á»´þüÔ·ÊÓk³î]¼W67·Nk ë&['Å[§e['R² u"Ö I ­s|å, 1,²góo¥fþRZrC(sAñ¨®žÑWÌHÁÿ.ïɕendstream +endobj +4548 0 obj << +/Type /Page +/Contents 4549 0 R +/Resources 4547 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4550 0 obj << +/D [4548 0 R /XYZ 71.731 729.2652 null] +>> endobj +4551 0 obj << +/D [4548 0 R /XYZ 139.477 708.3437 null] +>> endobj +4552 0 obj << +/D [4548 0 R /XYZ 139.477 708.3437 null] +>> endobj +4553 0 obj << +/D [4548 0 R /XYZ 76.7123 690.4109 null] +>> endobj +4554 0 obj << +/D [4548 0 R /XYZ 129.5143 672.4782 null] +>> endobj +4555 0 obj << +/D [4548 0 R /XYZ 129.5143 672.4782 null] +>> endobj +4556 0 obj << +/D [4548 0 R /XYZ 71.731 670.3214 null] +>> endobj +4557 0 obj << +/D [4548 0 R /XYZ 71.731 670.3214 null] +>> endobj +4558 0 obj << +/D [4548 0 R /XYZ 139.477 654.5454 null] +>> endobj +4559 0 obj << +/D [4548 0 R /XYZ 71.731 652.3886 null] +>> endobj +4560 0 obj << +/D [4548 0 R /XYZ 71.731 652.3886 null] +>> endobj +4561 0 obj << +/D [4548 0 R /XYZ 149.4396 636.6127 null] +>> endobj +4562 0 obj << +/D [4548 0 R /XYZ 71.731 634.4559 null] +>> endobj +4563 0 obj << +/D [4548 0 R /XYZ 149.4396 618.6799 null] +>> endobj +4564 0 obj << +/D [4548 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4565 0 obj << +/D [4548 0 R /XYZ 139.477 582.8144 null] +>> endobj +4566 0 obj << +/D [4548 0 R /XYZ 71.731 581.3749 null] +>> endobj +4567 0 obj << +/D [4548 0 R /XYZ 71.731 581.3749 null] +>> endobj +4568 0 obj << +/D [4548 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4569 0 obj << +/D [4548 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4570 0 obj << +/D [4548 0 R /XYZ 71.731 562.7248 null] +>> endobj +4571 0 obj << +/D [4548 0 R /XYZ 71.731 562.7248 null] +>> endobj +4572 0 obj << +/D [4548 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4573 0 obj << +/D [4548 0 R /XYZ 71.731 544.7921 null] +>> endobj +4574 0 obj << +/D [4548 0 R /XYZ 159.4023 529.0162 null] +>> endobj +4575 0 obj << +/D [4548 0 R /XYZ 76.7123 511.0834 null] +>> endobj +4576 0 obj << +/D [4548 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4577 0 obj << +/D [4548 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4578 0 obj << +/D [4548 0 R /XYZ 71.731 490.9938 null] +>> endobj +4579 0 obj << +/D [4548 0 R /XYZ 71.731 490.9938 null] +>> endobj +4580 0 obj << +/D [4548 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4581 0 obj << +/D [4548 0 R /XYZ 71.731 473.0611 null] +>> endobj +4582 0 obj << +/D [4548 0 R /XYZ 159.4023 457.2852 null] +>> endobj +4583 0 obj << +/D [4548 0 R /XYZ 76.7123 439.3524 null] +>> endobj +4584 0 obj << +/D [4548 0 R /XYZ 149.4396 421.4197 null] +>> endobj +4585 0 obj << +/D [4548 0 R /XYZ 149.4396 421.4197 null] +>> endobj +4586 0 obj << +/D [4548 0 R /XYZ 71.731 419.2628 null] +>> endobj +4587 0 obj << +/D [4548 0 R /XYZ 71.731 419.2628 null] +>> endobj +4588 0 obj << +/D [4548 0 R /XYZ 159.4023 403.4869 null] +>> endobj +4589 0 obj << +/D [4548 0 R /XYZ 71.731 401.3301 null] +>> endobj +4590 0 obj << +/D [4548 0 R /XYZ 159.4023 385.5542 null] +>> endobj +4591 0 obj << +/D [4548 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4592 0 obj << +/D [4548 0 R /XYZ 129.5143 313.8231 null] +>> endobj +4593 0 obj << +/D [4548 0 R /XYZ 129.5143 313.8231 null] +>> endobj +4594 0 obj << +/D [4548 0 R /XYZ 71.731 311.6663 null] +>> endobj +4595 0 obj << +/D [4548 0 R /XYZ 71.731 311.6663 null] +>> endobj +4596 0 obj << +/D [4548 0 R /XYZ 139.477 295.8904 null] +>> endobj +4597 0 obj << +/D [4548 0 R /XYZ 71.731 258.0324 null] +>> endobj +4598 0 obj << +/D [4548 0 R /XYZ 71.731 244.9814 null] +>> endobj +4599 0 obj << +/D [4548 0 R /XYZ 71.731 243.7361 null] +>> endobj +4600 0 obj << +/D [4548 0 R /XYZ 129.5143 224.6575 null] +>> endobj +4601 0 obj << +/D [4548 0 R /XYZ 71.731 222.5007 null] +>> endobj +4602 0 obj << +/D [4548 0 R /XYZ 71.731 222.5007 null] +>> endobj +4603 0 obj << +/D [4548 0 R /XYZ 139.477 206.7248 null] +>> endobj +4604 0 obj << +/D [4548 0 R /XYZ 139.477 206.7248 null] +>> endobj +4605 0 obj << +/D [4548 0 R /XYZ 71.731 204.5679 null] +>> endobj +4606 0 obj << +/D [4548 0 R /XYZ 71.731 204.5679 null] +>> endobj +4607 0 obj << +/D [4548 0 R /XYZ 149.4396 188.792 null] +>> endobj +4608 0 obj << +/D [4548 0 R /XYZ 76.7123 170.8593 null] +>> endobj +4609 0 obj << +/D [4548 0 R /XYZ 139.477 152.9265 null] +>> endobj +4610 0 obj << +/D [4548 0 R /XYZ 139.477 152.9265 null] +>> endobj +4611 0 obj << +/D [4548 0 R /XYZ 71.731 150.7697 null] +>> endobj +4612 0 obj << +/D [4548 0 R /XYZ 139.477 134.9938 null] +>> endobj +4613 0 obj << +/D [4548 0 R /XYZ 139.477 134.9938 null] +>> endobj +4614 0 obj << +/D [4548 0 R /XYZ 71.731 132.8369 null] +>> endobj +4615 0 obj << +/D [4548 0 R /XYZ 139.477 117.061 null] +>> endobj +4616 0 obj << +/D [4548 0 R /XYZ 139.477 117.061 null] +>> endobj +4617 0 obj << +/D [4548 0 R /XYZ 71.731 114.9042 null] +>> endobj +4618 0 obj << +/D [4548 0 R /XYZ 71.731 114.9042 null] +>> endobj +4619 0 obj << +/D [4548 0 R /XYZ 149.4396 99.1283 null] +>> endobj +4547 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4623 0 obj << +/Length 1363 +/Filter /FlateDecode +>> +stream +xÚµX]£6}Ÿ_ÁcF\Û û6ýZMÕ®F»óÖ©V$ j8Í¿ï5¶Á€ù¨Ô*äØ÷Üãs}1ÄÃð!'ˆp¡ ¢QH½Ãå{oð×ç;¢!¾Æø6èǗ»~ °— $¢‘÷rô‚$B!g(ŠC{/ٟ»ŸNéUäõ½OC¼£H]ŸÏi™‹ßÓ½úúøü¤nþÈũʚû¿^~»û奋%1Y$ÉpŒXžÄŸN)BúQ‚#8钡‰Ç‘‰B2®ƒÉl^) Ç줋)K<{Bw|íy˜QSAìÅ jÄZA‚çCYÞêâ*Šª”lZêý:DEQÌ!ŽÄ~RÒ6¢.Ê·õåK•åêî­®nWu;r㈒°%Ò*ÇãÀ8FD +-§§ˆÇrUy¼ûœ 9ñ—\¼ßS¼«ê¿;ÆQL1Ì"]Â#å’纕ø¸æŸº½z¬O!/+ìXDÇj³xÅ!Noâ¤3-Tö ï¯Ó³ô#Ã; ©sq«ËöŸüœ50qÐö E›·,~î%ÛJükM’ È.-õµ®Óu[ÕÖëvw¨Jq°¢„5T?e¹H‹³™g_݄º-ÕÒÊ»>mõCQBâGùSzț©_ŸŽý@kHÓK¥ëP ð¸æ‡¢•+“IƒÏ|†‘rDZfJØB/I›¥¼ê,á¶ÍR/¾°•£ŽPaêF/U¥÷‘´ó4h´yÆT@ ì¥5o"ï¦,Ïë\ʹ’¾¤âpR‹xqʍ; áÛ{q>«»}n{/Ïô¾øttZr(gÓË?É¡ lLu¿¬ÙhýÇ󹺧áîÝøZófk¤Ù¥(5ûk¡onÍ .E~°«øÁ˜ ¶'î>.Õ­ÙJöYŽHëô’ÃZ(’ƒœÀ^î1Ed®qo¡ú¾‘p¬úÆx®Ù¶A) +¡® ó]à š6 Ó¼lrWtFÂdÒ+ ®FÍYŽ—%yHÛa!ou>ÍÎ0ˆ´LWš± [hÆlµ»ânhÆÎf< ñº¨‡ºa„"ÏDó½øÑ!ëEM§Ê êªcÞ·4[@k^1®[r®­[×w‹wÇfԔư€ЀÃà‡]À…k«äòTŽ-“J©æI‚†‚Ü€I0³3”oúNf›6‰ääŠ;/¬åäa/˜CÿEv ÂÑ9Šq²&—[’ËÀÖårÄÝ"—ƒ‡K.›Çÿ´Ó™ÒÃðØ)OÌËel¡ÊØ ÖËØuKi̔±ÍC—°ë`턅ëQgµ„5lΖ$f(ŽéZÛ°[v°U[ºân°¥‹‡Ã–ƒgÂo·=è¬ÕʲNëóÚDJX²V²6lI[×Æw‹6.ml³†ùréš"A8f+õi£æë³C­Ö§+ê†úœÐp×ç€GÑ|¿ÖÅ%­?\§Žp0ªÐ}wóŠf¡D nև$@DV|hÁ–|h`ë>tÄÝâC—mZíº§fôÎÅè>×?ŽF]q2ïrÚwN£ÌôËvæ%‹ïã-Ìôu|Ç'L „ J¦ÀÃٗ뎀ÿqƒ·endstream +endobj +4622 0 obj << +/Type /Page +/Contents 4623 0 R +/Resources 4621 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4624 0 obj << +/D [4622 0 R /XYZ 71.731 729.2652 null] +>> endobj +4625 0 obj << +/D [4622 0 R /XYZ 76.7123 708.3437 null] +>> endobj +4626 0 obj << +/D [4622 0 R /XYZ 139.477 690.4109 null] +>> endobj +4627 0 obj << +/D [4622 0 R /XYZ 139.477 690.4109 null] +>> endobj +806 0 obj << +/D [4622 0 R /XYZ 71.731 667.4969 null] +>> endobj +342 0 obj << +/D [4622 0 R /XYZ 263.6811 622.2426 null] +>> endobj +4628 0 obj << +/D [4622 0 R /XYZ 71.731 602.1022 null] +>> endobj +4629 0 obj << +/D [4622 0 R /XYZ 161.0655 589.3659 null] +>> endobj +4630 0 obj << +/D [4622 0 R /XYZ 71.731 577.2464 null] +>> endobj +4631 0 obj << +/D [4622 0 R /XYZ 71.731 546.2167 null] +>> endobj +4632 0 obj << +/D [4622 0 R /XYZ 168.8063 534.8702 null] +>> endobj +4633 0 obj << +/D [4622 0 R /XYZ 71.731 522.7507 null] +>> endobj +4634 0 obj << +/D [4622 0 R /XYZ 71.731 468.0723 null] +>> endobj +4635 0 obj << +/D [4622 0 R /XYZ 181.5683 457.062 null] +>> endobj +4636 0 obj << +/D [4622 0 R /XYZ 71.731 446.9998 null] +>> endobj +4637 0 obj << +/D [4622 0 R /XYZ 71.731 413.5767 null] +>> endobj +4638 0 obj << +/D [4622 0 R /XYZ 71.731 402.4668 null] +>> endobj +4639 0 obj << +/D [4622 0 R /XYZ 71.731 401.2215 null] +>> endobj +4640 0 obj << +/D [4622 0 R /XYZ 129.5143 382.143 null] +>> endobj +4641 0 obj << +/D [4622 0 R /XYZ 129.5143 382.143 null] +>> endobj +4642 0 obj << +/D [4622 0 R /XYZ 71.731 380.7034 null] +>> endobj +4643 0 obj << +/D [4622 0 R /XYZ 71.731 380.7034 null] +>> endobj +4644 0 obj << +/D [4622 0 R /XYZ 139.477 364.2102 null] +>> endobj +4645 0 obj << +/D [4622 0 R /XYZ 139.477 364.2102 null] +>> endobj +4646 0 obj << +/D [4622 0 R /XYZ 76.7123 346.2774 null] +>> endobj +4647 0 obj << +/D [4622 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4648 0 obj << +/D [4622 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4649 0 obj << +/D [4622 0 R /XYZ 71.731 326.1879 null] +>> endobj +4650 0 obj << +/D [4622 0 R /XYZ 71.731 326.1879 null] +>> endobj +4651 0 obj << +/D [4622 0 R /XYZ 139.477 310.4119 null] +>> endobj +4652 0 obj << +/D [4622 0 R /XYZ 71.731 308.2551 null] +>> endobj +4653 0 obj << +/D [4622 0 R /XYZ 139.477 292.4792 null] +>> endobj +4654 0 obj << +/D [4622 0 R /XYZ 71.731 291.0396 null] +>> endobj +4655 0 obj << +/D [4622 0 R /XYZ 71.731 291.0396 null] +>> endobj +4656 0 obj << +/D [4622 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4657 0 obj << +/D [4622 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4658 0 obj << +/D [4622 0 R /XYZ 71.731 272.3896 null] +>> endobj +4659 0 obj << +/D [4622 0 R /XYZ 71.731 272.3896 null] +>> endobj +4660 0 obj << +/D [4622 0 R /XYZ 159.4023 256.6137 null] +>> endobj +4661 0 obj << +/D [4622 0 R /XYZ 71.731 255.1741 null] +>> endobj +4662 0 obj << +/D [4622 0 R /XYZ 159.4023 238.6809 null] +>> endobj +4663 0 obj << +/D [4622 0 R /XYZ 76.7123 220.7482 null] +>> endobj +4664 0 obj << +/D [4622 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4665 0 obj << +/D [4622 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4666 0 obj << +/D [4622 0 R /XYZ 71.731 200.6586 null] +>> endobj +4667 0 obj << +/D [4622 0 R /XYZ 71.731 200.6586 null] +>> endobj +4668 0 obj << +/D [4622 0 R /XYZ 159.4023 184.8827 null] +>> endobj +4669 0 obj << +/D [4622 0 R /XYZ 71.731 182.7258 null] +>> endobj +4670 0 obj << +/D [4622 0 R /XYZ 159.4023 166.9499 null] +>> endobj +4671 0 obj << +/D [4622 0 R /XYZ 76.7123 149.0172 null] +>> endobj +4672 0 obj << +/D [4622 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4673 0 obj << +/D [4622 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4674 0 obj << +/D [4622 0 R /XYZ 71.731 128.9276 null] +>> endobj +4675 0 obj << +/D [4622 0 R /XYZ 71.731 128.9276 null] +>> endobj +4676 0 obj << +/D [4622 0 R /XYZ 159.4023 113.1517 null] +>> endobj +4677 0 obj << +/D [4622 0 R /XYZ 71.731 110.9948 null] +>> endobj +4621 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4680 0 obj << +/Length 1361 +/Filter /FlateDecode +>> +stream +xÚ½š]oÛ6…ïó+tWX8~ŠÔîÒî«ÃšhîÖaP,%K¥-Ø¿/]‘ +i¿ÒËuÑ ÙõQÞ£GçH¦m–Qûeš-솄çŠg›ÝÍìK¿\0'¹tšËPôúöâûŸÍ +Rä<Ïnï3QäDi™iÁ‰QÌd·ÕŸ«7Ûòi¨÷ëK®èŠ“q{óX¶õð{y7>½ºy;>xWÛ®ê×ÝþvñÓí4_ M +c‡,šÆ%EvÉ))8S ˆÉ‚HkÔ 5DH¡§cáE¦ ;§=–I7ÉósulŽ)F +EyþA?÷xûâÃïúxaʔõA¹ˆ}”û}ù߈¬»·w]÷X—íwã³·ý¸¶õøàißìʽۧií¹_3º*7îõûnï÷hܾmWÕ'+¬­³\s»5ð‰ð¢ËP >þ[³„¥eetN'ì÷:µ!Lf,á\Fg:òQµ=;ø8:\z˜pü0bê‡}Ó>¸“á çÇÉNÍW҆WI$´¡l!´“ -47!´ ´‘‘€è#UUûºïcVQX¼~ïÖû×L­ìÅd–¢ÈIθÆ(²%Š^†Sæ¦P|@C³Ñ: X_QJ‰–«{ Z¨»Wáu¦¦ÔýØÆLÝCÛ®ÚrW•—Š(^ðs”^{£d+}([ˆë$Cã +ÍMˆ+äˆkä#ÊæªèOCÓµå£}ÌÆÿý5`cÊ%1†a­eK˜¼ ÇÌMÁø€0…>°V!9W5›[{»Ê‘Ú†ªùÚN*´¶ÐԄڞ؀kùؕ ±ÌMíÛÏs4–1B@Ȗ¢èex¹)Q|@Q }D¹{wµ–tõ&¾¥ÌÁ‘… LQ¬§¡lÎ$Cá@sà@>8‘¬§I¼\£¤Ò„…´3TÍ·sR¡í„¦&´óÄÜÎÈÇÝóc³kèžJ‰ÝEÆ µ«´žÍlü, ¡8ÖÍP¶?/ÃãÌM‰àŠ_èþ Úë²­ž›j؎O'Ð0ΈdZÌ@¶DÆËp2ÀÜ2€ˆLèÎʗÀrMƾßSie¨šoå¤B[ MMhå‰ ¸•‘»}WV›²‡z©()hq–®È5É9ÃÚÊ28ÉÐ Bs2ù2ùˆî×õð|ø„¥ÛtÐLܓn¦Â>ȍÁ:ʖxyÎ ˜›Â ðñ +}`7Óÿ‹Ð· b¸±Üä@µÐd¯Â› LMiò±™&‡>vŸ?-j,aܜeÉÊ ELA±‡²…XN24–Ð܄XB>€XF>¢ ^›È9æÓ¢¬&ÄI_­•²;—C³yc¶¯ÐUµÝ<½ú¼v›e«µµmӀ° dKl½ g ÌMa ø€Ø†>°Ê Ü®Ò\rB Ž\BÕüåaR¡—hjÂåáÄ|yˆ|´õ°+ûðÛo)•8ËõK»Z*ÐëC [Ê°—áæ¦dðe8ôöý?w–³ «£ ƒ¡9á> endobj +4681 0 obj << +/D [4679 0 R /XYZ 71.731 729.2652 null] +>> endobj +4682 0 obj << +/D [4679 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4683 0 obj << +/D [4679 0 R /XYZ 76.7123 690.4109 null] +>> endobj +4684 0 obj << +/D [4679 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4685 0 obj << +/D [4679 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4686 0 obj << +/D [4679 0 R /XYZ 71.731 670.3214 null] +>> endobj +4687 0 obj << +/D [4679 0 R /XYZ 71.731 670.3214 null] +>> endobj +4688 0 obj << +/D [4679 0 R /XYZ 159.4023 654.5454 null] +>> endobj +4689 0 obj << +/D [4679 0 R /XYZ 71.731 652.3886 null] +>> endobj +4690 0 obj << +/D [4679 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4691 0 obj << +/D [4679 0 R /XYZ 76.7123 618.6799 null] +>> endobj +4692 0 obj << +/D [4679 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4693 0 obj << +/D [4679 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4694 0 obj << +/D [4679 0 R /XYZ 71.731 598.5904 null] +>> endobj +4695 0 obj << +/D [4679 0 R /XYZ 71.731 598.5904 null] +>> endobj +4696 0 obj << +/D [4679 0 R /XYZ 159.4023 582.8144 null] +>> endobj +4697 0 obj << +/D [4679 0 R /XYZ 71.731 580.6576 null] +>> endobj +4698 0 obj << +/D [4679 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4699 0 obj << +/D [4679 0 R /XYZ 76.7123 546.9489 null] +>> endobj +4700 0 obj << +/D [4679 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4701 0 obj << +/D [4679 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4702 0 obj << +/D [4679 0 R /XYZ 71.731 526.8593 null] +>> endobj +4703 0 obj << +/D [4679 0 R /XYZ 71.731 526.8593 null] +>> endobj +4704 0 obj << +/D [4679 0 R /XYZ 159.4023 511.0834 null] +>> endobj +4705 0 obj << +/D [4679 0 R /XYZ 71.731 508.9266 null] +>> endobj +4706 0 obj << +/D [4679 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4707 0 obj << +/D [4679 0 R /XYZ 76.7123 475.2179 null] +>> endobj +4708 0 obj << +/D [4679 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4709 0 obj << +/D [4679 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4710 0 obj << +/D [4679 0 R /XYZ 71.731 455.1283 null] +>> endobj +4711 0 obj << +/D [4679 0 R /XYZ 71.731 455.1283 null] +>> endobj +4712 0 obj << +/D [4679 0 R /XYZ 159.4023 439.3524 null] +>> endobj +4713 0 obj << +/D [4679 0 R /XYZ 71.731 437.9129 null] +>> endobj +4714 0 obj << +/D [4679 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4715 0 obj << +/D [4679 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4716 0 obj << +/D [4679 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4717 0 obj << +/D [4679 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4718 0 obj << +/D [4679 0 R /XYZ 71.731 383.3973 null] +>> endobj +4719 0 obj << +/D [4679 0 R /XYZ 71.731 383.3973 null] +>> endobj +4720 0 obj << +/D [4679 0 R /XYZ 159.4023 367.6214 null] +>> endobj +4721 0 obj << +/D [4679 0 R /XYZ 71.731 365.4646 null] +>> endobj +4722 0 obj << +/D [4679 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4723 0 obj << +/D [4679 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4724 0 obj << +/D [4679 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4725 0 obj << +/D [4679 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4726 0 obj << +/D [4679 0 R /XYZ 71.731 311.6663 null] +>> endobj +4727 0 obj << +/D [4679 0 R /XYZ 71.731 311.6663 null] +>> endobj +4728 0 obj << +/D [4679 0 R /XYZ 159.4023 295.8904 null] +>> endobj +4729 0 obj << +/D [4679 0 R /XYZ 71.731 293.7336 null] +>> endobj +4730 0 obj << +/D [4679 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4731 0 obj << +/D [4679 0 R /XYZ 76.7123 260.0249 null] +>> endobj +4732 0 obj << +/D [4679 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4733 0 obj << +/D [4679 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4734 0 obj << +/D [4679 0 R /XYZ 71.731 239.9353 null] +>> endobj +4735 0 obj << +/D [4679 0 R /XYZ 71.731 239.9353 null] +>> endobj +4736 0 obj << +/D [4679 0 R /XYZ 159.4023 224.1594 null] +>> endobj +4737 0 obj << +/D [4679 0 R /XYZ 71.731 222.0026 null] +>> endobj +4738 0 obj << +/D [4679 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4739 0 obj << +/D [4679 0 R /XYZ 76.7123 188.2939 null] +>> endobj +4740 0 obj << +/D [4679 0 R /XYZ 149.4396 170.3611 null] +>> endobj +4741 0 obj << +/D [4679 0 R /XYZ 149.4396 170.3611 null] +>> endobj +4742 0 obj << +/D [4679 0 R /XYZ 71.731 168.2043 null] +>> endobj +4743 0 obj << +/D [4679 0 R /XYZ 71.731 168.2043 null] +>> endobj +4744 0 obj << +/D [4679 0 R /XYZ 159.4023 152.4284 null] +>> endobj +4745 0 obj << +/D [4679 0 R /XYZ 71.731 150.9888 null] +>> endobj +4746 0 obj << +/D [4679 0 R /XYZ 159.4023 134.4956 null] +>> endobj +4747 0 obj << +/D [4679 0 R /XYZ 76.7123 116.5629 null] +>> endobj +4748 0 obj << +/D [4679 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4749 0 obj << +/D [4679 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4750 0 obj << +/D [4679 0 R /XYZ 71.731 96.4733 null] +>> endobj +4751 0 obj << +/D [4679 0 R /XYZ 71.731 96.4733 null] +>> endobj +4678 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4754 0 obj << +/Length 1505 +/Filter /FlateDecode +>> +stream +xÚµšÛrÛ6†ïý¼‹4S¡8@îÜô”N’zßÕ-ѧ¶¤!éxüöD‚©ÅÁu=¾ ?±?>î‚ Z$Ãæd’ É́jDsA³åÃÎîÌW¿‘^²è5 WôÓåُ¿2œi¤sšg—·Ó9’g’Q¤QÙåêïهu±kËz¾ Ï(êŽ÷Ŧl?7ÝÛó‹Ý‹Ïe»Þ®šù?—œýr9ÄL"­L I¦œe Š‘¦D€"Â5âƨ™ Vˆq&‡¹PIDöó4stƒl?™+JÅÔiiæhãNGö,ÐǑ)Ʀlì£iëjs÷CíãEw,V«ºlšîÍö¶;6år»Yõs÷öç/_íçõ·93se¦ó±3Ï5Fœ`áèÊY”#7#äà8òQÔuñ<ö–h™1!e– n2Up˜l/Z¸*ìt,/Wn)™ƒQý\íY§6˜Ê”ášóñõu}T»½‹é%`ˆj±°—¼wq÷`ûUÂ{Uü©Êr”*c©êÈB©jeñT⦤*àJU×G0/½\ˆB¹ÔÑvd!.VçÄMáø€¸¸>^Zž’Êܳ”¤«ò—ä Š–$5¡$OlÀ%9òÑ>ïJ ()GøMJRä)Eb%éÊ©7È¢©ÅMH=Ȑz#£<;wo؇WWXàÝ¡^õ®Ú}ãï̇ÄŽçHs«YWgeqp@Üp€œë#V³¯fi ‘„‹µ£ +µUŋˆšRÔSž¢v}ÜmùdPžÖ5ÇHi–¿EesÍ8VÙ®, ƒ,š P܄…| :ò‘Þîêêahïæbf®ÈœŠÙӜ˜3žý¥@”ÈX•»²D+‹Câ¦@|@]¯j®_ʕh$„Y—9fˆ«ÜÃÕª®ìÈUKÜq=Í˕R³+#ŒëçjÏ:õ1.z³ÝÄliG>ê²}¬7×·Uyßm•'WCRÄ©bãÒï.F.f=üOUӎ‰_aL#v«î¶;vÁN§ÝcJRސª…+Òød4/nF¦\ƒqý¸íY wƒÒ-õ#ÇÅÐ d´T˜ù³ºb-‚¿„š÷ޔd„#F ‹¤¤+ ¤ä ‹¦$7!%!£áZ¹>àR\¶ÞÄ¡:GL)IWHœAM(nBâœø×iŸ8#7õ¶X-‹¦JÔäÆº9÷åù¥l+ݶþ·ûà8Zp73‘ +q!T ¯# áµ²8^ n +Þ©¯k£j®í=à+f“ðf»½/‹½ùØun]7œjӖõíáV³ì¿¿µ S»®ús7ÛUé¿9F‚²Ø8ªBü{UÿiÐú0|ÇÃÆdç>3Á¶“sA™ýõñƜž˜Åœ"¡q¢# Q´²8F n +Ç©¤kã¥Êj S6Ûû\Èè*ëÈB­,ˆ›pêèÚXmây¬µ~B÷™ò`w@„s$)®»Ž,ÜÊâÀ¸)À§>`஍õ¶i7Åô,‰›¶‰êPñïwðîÚj»)î÷ç¿;C‚T‰RHêX“é¨L­*Šš@tjêz0‹áCѼ~-µƒÀ¥iX…Ž-¤®,„ÐÊ⠁¸)§>`Š®ÿô$ä-6¢$AÍf!-½®,„ÜÊâȁ¸)ȧ>`䮍}ûÓw×Õ +ڈ*Dò\ŽÉ›ÖÊö¸ûöÉ×nUfì¶:ìIý«-aiÍb«­+ 1¶²8c n +㩘±kã¡XB ‚Y>0Q”þ|>çxö!­K Ä´Ë9‰Q<ªB{UœáiЄ0AÇÃ>Iáì4ë‚ÀRdz³hší²2e¿êÞ?Uízºg°´ÖˆìŸÌ„A;ªh«Š‚‚&€žšA»L#FÿÿFìåÿcïªÂRÄóÐþšÅќþ˜EPiºL†‘öþ¥ôþ4øÙ¬½óendstream +endobj +4753 0 obj << +/Type /Page +/Contents 4754 0 R +/Resources 4752 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4755 0 obj << +/D [4753 0 R /XYZ 71.731 729.2652 null] +>> endobj +4756 0 obj << +/D [4753 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4757 0 obj << +/D [4753 0 R /XYZ 71.731 706.1869 null] +>> endobj +4758 0 obj << +/D [4753 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4759 0 obj << +/D [4753 0 R /XYZ 76.7123 672.4782 null] +>> endobj +4760 0 obj << +/D [4753 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4761 0 obj << +/D [4753 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4762 0 obj << +/D [4753 0 R /XYZ 71.731 652.3886 null] +>> endobj +4763 0 obj << +/D [4753 0 R /XYZ 71.731 652.3886 null] +>> endobj +4764 0 obj << +/D [4753 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4765 0 obj << +/D [4753 0 R /XYZ 71.731 634.4559 null] +>> endobj +4766 0 obj << +/D [4753 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4767 0 obj << +/D [4753 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4768 0 obj << +/D [4753 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4769 0 obj << +/D [4753 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4770 0 obj << +/D [4753 0 R /XYZ 71.731 580.6576 null] +>> endobj +4771 0 obj << +/D [4753 0 R /XYZ 71.731 580.6576 null] +>> endobj +4772 0 obj << +/D [4753 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4773 0 obj << +/D [4753 0 R /XYZ 71.731 562.7248 null] +>> endobj +4774 0 obj << +/D [4753 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4775 0 obj << +/D [4753 0 R /XYZ 76.7123 529.0162 null] +>> endobj +4776 0 obj << +/D [4753 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4777 0 obj << +/D [4753 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4778 0 obj << +/D [4753 0 R /XYZ 71.731 508.9266 null] +>> endobj +4779 0 obj << +/D [4753 0 R /XYZ 71.731 508.9266 null] +>> endobj +4780 0 obj << +/D [4753 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4781 0 obj << +/D [4753 0 R /XYZ 71.731 490.9938 null] +>> endobj +4782 0 obj << +/D [4753 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4783 0 obj << +/D [4753 0 R /XYZ 76.7123 421.4197 null] +>> endobj +4784 0 obj << +/D [4753 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4785 0 obj << +/D [4753 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4786 0 obj << +/D [4753 0 R /XYZ 71.731 401.3301 null] +>> endobj +4787 0 obj << +/D [4753 0 R /XYZ 71.731 401.3301 null] +>> endobj +4788 0 obj << +/D [4753 0 R /XYZ 139.477 385.5542 null] +>> endobj +4789 0 obj << +/D [4753 0 R /XYZ 71.731 347.6961 null] +>> endobj +4790 0 obj << +/D [4753 0 R /XYZ 71.731 334.6452 null] +>> endobj +4791 0 obj << +/D [4753 0 R /XYZ 71.731 333.3998 null] +>> endobj +4792 0 obj << +/D [4753 0 R /XYZ 129.5143 314.3213 null] +>> endobj +4793 0 obj << +/D [4753 0 R /XYZ 71.731 312.1645 null] +>> endobj +4794 0 obj << +/D [4753 0 R /XYZ 71.731 312.1645 null] +>> endobj +4795 0 obj << +/D [4753 0 R /XYZ 139.477 296.3885 null] +>> endobj +4796 0 obj << +/D [4753 0 R /XYZ 139.477 296.3885 null] +>> endobj +4797 0 obj << +/D [4753 0 R /XYZ 71.731 294.2317 null] +>> endobj +4798 0 obj << +/D [4753 0 R /XYZ 139.477 278.4558 null] +>> endobj +4799 0 obj << +/D [4753 0 R /XYZ 139.477 278.4558 null] +>> endobj +4800 0 obj << +/D [4753 0 R /XYZ 71.731 276.2989 null] +>> endobj +4801 0 obj << +/D [4753 0 R /XYZ 139.477 260.523 null] +>> endobj +4802 0 obj << +/D [4753 0 R /XYZ 139.477 260.523 null] +>> endobj +4803 0 obj << +/D [4753 0 R /XYZ 71.731 258.3662 null] +>> endobj +4804 0 obj << +/D [4753 0 R /XYZ 139.477 242.5903 null] +>> endobj +4805 0 obj << +/D [4753 0 R /XYZ 139.477 242.5903 null] +>> endobj +4806 0 obj << +/D [4753 0 R /XYZ 71.731 240.4334 null] +>> endobj +4807 0 obj << +/D [4753 0 R /XYZ 139.477 224.6575 null] +>> endobj +4808 0 obj << +/D [4753 0 R /XYZ 139.477 224.6575 null] +>> endobj +4809 0 obj << +/D [4753 0 R /XYZ 71.731 222.5007 null] +>> endobj +4810 0 obj << +/D [4753 0 R /XYZ 139.477 206.7248 null] +>> endobj +4811 0 obj << +/D [4753 0 R /XYZ 139.477 206.7248 null] +>> endobj +4812 0 obj << +/D [4753 0 R /XYZ 71.731 204.5679 null] +>> endobj +4813 0 obj << +/D [4753 0 R /XYZ 139.477 188.792 null] +>> endobj +4814 0 obj << +/D [4753 0 R /XYZ 139.477 188.792 null] +>> endobj +4815 0 obj << +/D [4753 0 R /XYZ 71.731 186.6352 null] +>> endobj +4816 0 obj << +/D [4753 0 R /XYZ 139.477 170.8593 null] +>> endobj +4817 0 obj << +/D [4753 0 R /XYZ 139.477 170.8593 null] +>> endobj +4818 0 obj << +/D [4753 0 R /XYZ 71.731 168.7024 null] +>> endobj +4819 0 obj << +/D [4753 0 R /XYZ 139.477 152.9265 null] +>> endobj +4820 0 obj << +/D [4753 0 R /XYZ 139.477 152.9265 null] +>> endobj +4821 0 obj << +/D [4753 0 R /XYZ 71.731 151.487 null] +>> endobj +4822 0 obj << +/D [4753 0 R /XYZ 139.477 134.9938 null] +>> endobj +4823 0 obj << +/D [4753 0 R /XYZ 139.477 134.9938 null] +>> endobj +4824 0 obj << +/D [4753 0 R /XYZ 71.731 132.8369 null] +>> endobj +4825 0 obj << +/D [4753 0 R /XYZ 139.477 117.061 null] +>> endobj +4826 0 obj << +/D [4753 0 R /XYZ 139.477 117.061 null] +>> endobj +4827 0 obj << +/D [4753 0 R /XYZ 71.731 115.6215 null] +>> endobj +4828 0 obj << +/D [4753 0 R /XYZ 139.477 99.1283 null] +>> endobj +4829 0 obj << +/D [4753 0 R /XYZ 139.477 99.1283 null] +>> endobj +4830 0 obj << +/D [4753 0 R /XYZ 71.731 96.9714 null] +>> endobj +4752 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4833 0 obj << +/Length 1408 +/Filter /FlateDecode +>> +stream +xÚ½XˎÛ6ÝÏWh760fù)e7iš E ÒÙ5E ±4±Yr%zó÷½z&-êÑMá…õ8ä=÷ð>H‘Ï’ ÉàÆˆŠûã ~«O7d€ìÌν¼ùå#ÃAŒbAEðø°X Pò@2Š¢DÁcú×æ×CrRY½ÝÑo(êÿŠ¤ÌÔÉS{ÿð¹¿ø’©C•6Û¿¿ùíÑØ™DqFfIr!."ì(F1%¡E`Šp@IÀ3Τq†ÆD¤uœ18k½ùNix͎€»˜ò8°'Ôv¯ÿ/<ô¨1ˆ*xǃňKéÒxz-òc®Z&íËpŒ9ØhqïzYóRÝõWï“2}ÍSuèoÍ,Ž?ÚscÄ Žt´a3:Ø¢Ž>»+tñðêèÐPo§Ì#"åã8vElT—?ïӴΚ¦¿éf鮾ãgè'P·ùé…ßÂC2­±¤@+¢K[°95lYcÝ5_óðklÓ8v9íQ™…ˆÐˆ,« úûa*¯ÔÛ0„Á‰Ê÷·ý“ª6oð&=ìOf!€(!”ˆŽöŽ`(X’ƒ§"BDD¼cD‘ŒÛz%£Í§L}­Ò¬ñ%œDÅ2صEOŠ>?êJUmX¼3#.* cw” A¢>ã[rV‡Á·ÞüøŽ1-ÚBÊñfx^gê\—Ý›¬HË=›àNÛ³ ~Ț}ŸT^•stA{Šß:käþë:yô~6+xÞ«·¯J•ä¥YÁ4ƒÛBOòTÕÅÅfhŸŸ}n÷…lٜ²}Þùj>©‹˜!ØÎÛú ·#°¡`ƒyš•ªŸµnÜ:T*“cÖܹÏÛe•¤ ¦Ÿ¶oÎê2CY¼Y®ñ¨ýÁh¥¦ªØ¼æEÑ_=evdéE?wWÁ2©çˆŸ¡1ÝYÌ9ZšŽ@‚IÑÑù³:ZÞ]Íjz¾—<ÛÒpóªÍ? ï“ô˜— Zú÷EQ9ó|«Š¬Y›¨±A£S>\œ'/U¶·S÷NGdUnI¸y;Vçf-هvDRCèÁú÷$rN ð‡D   Ѩ »´‘X⾍Œf›l#”Âf„P¯Ýé6¢Gy¸mD·3‡G['zõ¸‡@:Þ]í-Ûñm‚êÙÈsMögF8q¸´²a3ýÙÀû³ÏîŠþ<âáíύ{ÐåËT!e¹äs=Ú#«Ý§Uerd2z¡Å¢ˆa¾½6l&z l1z}vWD?z]3{λ2>–YÇp`qdö´.ØÈ» ¨_ŠÑ³¶ME4E± mÃf"ÚÀ#ÚgwEDûx\„ÓíÐøÈÓq +&øDÖ òHt=פBV*¾×ê´Bz”—†¥p2wy\N„_Í>ÅÞÿL +CC„lŸç…±P3ÂhÔ²0«k„ñÐð cópjÛÇs¡7!ÿœ“ÂÙüè-ádžÁŽÎb)ÏlØLžØbžùì®È3qž94Ü>kïr¯ö­ÁD$A”±…,³QÓÁdP‹Á䳺"˜F4Ü¢¯ƒÉáQ$úq>¥‰Ê|ÍUHı$£o5Wg 5¹§ „ 1L&2T£v6Ì£êh¶IYC(ÄÔkwZV=ÊËà +»x`Ê\—âõ!ѱf€*׋Wؗ\ŸÅ ÂՃ˜¯[Ãô9µÎô"ùUe!b퇁U-؜ª¶¬ªÇîU=<|ªÚ<üqö =¤q åӅŠ`¦ ‚-֏Éåàšƒ¿Ø$^à×îW~³õíìü_[<û˜á{=‡ (ñì'} 3þ¢ÒNWqlfj Êhòû¼Çà¿a5“Sendstream +endobj +4832 0 obj << +/Type /Page +/Contents 4833 0 R +/Resources 4831 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4834 0 obj << +/D [4832 0 R /XYZ 71.731 729.2652 null] +>> endobj +4835 0 obj << +/D [4832 0 R /XYZ 139.477 708.3437 null] +>> endobj +4836 0 obj << +/D [4832 0 R /XYZ 139.477 708.3437 null] +>> endobj +4837 0 obj << +/D [4832 0 R /XYZ 71.731 706.9041 null] +>> endobj +4838 0 obj << +/D [4832 0 R /XYZ 139.477 690.4109 null] +>> endobj +4839 0 obj << +/D [4832 0 R /XYZ 139.477 690.4109 null] +>> endobj +4840 0 obj << +/D [4832 0 R /XYZ 71.731 688.2541 null] +>> endobj +4841 0 obj << +/D [4832 0 R /XYZ 139.477 672.4782 null] +>> endobj +4842 0 obj << +/D [4832 0 R /XYZ 139.477 672.4782 null] +>> endobj +807 0 obj << +/D [4832 0 R /XYZ 71.731 649.5641 null] +>> endobj +346 0 obj << +/D [4832 0 R /XYZ 196.1111 604.3098 null] +>> endobj +4843 0 obj << +/D [4832 0 R /XYZ 71.731 584.1694 null] +>> endobj +4844 0 obj << +/D [4832 0 R /XYZ 161.0655 571.4331 null] +>> endobj +4845 0 obj << +/D [4832 0 R /XYZ 71.731 559.3136 null] +>> endobj +4846 0 obj << +/D [4832 0 R /XYZ 71.731 528.284 null] +>> endobj +4847 0 obj << +/D [4832 0 R /XYZ 168.8063 516.9375 null] +>> endobj +4848 0 obj << +/D [4832 0 R /XYZ 71.731 489.874 null] +>> endobj +4849 0 obj << +/D [4832 0 R /XYZ 71.731 450.1395 null] +>> endobj +4850 0 obj << +/D [4832 0 R /XYZ 71.731 418.558 null] +>> endobj +4851 0 obj << +/D [4832 0 R /XYZ 181.5683 407.5477 null] +>> endobj +4852 0 obj << +/D [4832 0 R /XYZ 71.731 397.4855 null] +>> endobj +4853 0 obj << +/D [4832 0 R /XYZ 71.731 364.0623 null] +>> endobj +4854 0 obj << +/D [4832 0 R /XYZ 71.731 352.9525 null] +>> endobj +4855 0 obj << +/D [4832 0 R /XYZ 71.731 351.7072 null] +>> endobj +4856 0 obj << +/D [4832 0 R /XYZ 129.5143 332.6286 null] +>> endobj +4857 0 obj << +/D [4832 0 R /XYZ 129.5143 332.6286 null] +>> endobj +4858 0 obj << +/D [4832 0 R /XYZ 71.731 331.1891 null] +>> endobj +4859 0 obj << +/D [4832 0 R /XYZ 71.731 331.1891 null] +>> endobj +4860 0 obj << +/D [4832 0 R /XYZ 139.477 314.6959 null] +>> endobj +4861 0 obj << +/D [4832 0 R /XYZ 139.477 314.6959 null] +>> endobj +4862 0 obj << +/D [4832 0 R /XYZ 76.7123 296.7631 null] +>> endobj +4863 0 obj << +/D [4832 0 R /XYZ 129.5143 278.8304 null] +>> endobj +4864 0 obj << +/D [4832 0 R /XYZ 129.5143 278.8304 null] +>> endobj +4865 0 obj << +/D [4832 0 R /XYZ 71.731 276.6735 null] +>> endobj +4866 0 obj << +/D [4832 0 R /XYZ 71.731 276.6735 null] +>> endobj +4867 0 obj << +/D [4832 0 R /XYZ 139.477 260.8976 null] +>> endobj +4868 0 obj << +/D [4832 0 R /XYZ 71.731 258.7408 null] +>> endobj +4869 0 obj << +/D [4832 0 R /XYZ 71.731 258.7408 null] +>> endobj +4870 0 obj << +/D [4832 0 R /XYZ 149.4396 242.9649 null] +>> endobj +4871 0 obj << +/D [4832 0 R /XYZ 71.731 241.5253 null] +>> endobj +4872 0 obj << +/D [4832 0 R /XYZ 149.4396 225.0321 null] +>> endobj +4873 0 obj << +/D [4832 0 R /XYZ 76.7123 207.0994 null] +>> endobj +4874 0 obj << +/D [4832 0 R /XYZ 139.477 189.1666 null] +>> endobj +4875 0 obj << +/D [4832 0 R /XYZ 71.731 187.7271 null] +>> endobj +4876 0 obj << +/D [4832 0 R /XYZ 71.731 187.7271 null] +>> endobj +4877 0 obj << +/D [4832 0 R /XYZ 149.4396 171.2339 null] +>> endobj +4878 0 obj << +/D [4832 0 R /XYZ 149.4396 171.2339 null] +>> endobj +4879 0 obj << +/D [4832 0 R /XYZ 71.731 169.077 null] +>> endobj +4880 0 obj << +/D [4832 0 R /XYZ 71.731 169.077 null] +>> endobj +4881 0 obj << +/D [4832 0 R /XYZ 159.4023 153.3011 null] +>> endobj +4882 0 obj << +/D [4832 0 R /XYZ 71.731 151.1443 null] +>> endobj +4883 0 obj << +/D [4832 0 R /XYZ 159.4023 135.3684 null] +>> endobj +4884 0 obj << +/D [4832 0 R /XYZ 76.7123 117.4356 null] +>> endobj +4885 0 obj << +/D [4832 0 R /XYZ 149.4396 99.5029 null] +>> endobj +4886 0 obj << +/D [4832 0 R /XYZ 149.4396 99.5029 null] +>> endobj +4887 0 obj << +/D [4832 0 R /XYZ 71.731 97.346 null] +>> endobj +4888 0 obj << +/D [4832 0 R /XYZ 71.731 97.346 null] +>> endobj +4831 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4891 0 obj << +/Length 1369 +/Filter /FlateDecode +>> +stream +xÚÍZMoã6¼çWè˜ Ëo‘½ín›~`[,šÜš"Pbml¬#¥–ÓEþýR)Sö»uŠ"IÎØo8œá£±‚º?V”Œ”¸%\+^Ü=œÐâÞýëÇæ!çsƒÞ^|{!ha‰Õ\W a5Q¥,JÁ‰QÌW‹?Nß-«Çm½9;犞r2?¬«¦Þ¾¯n‡Ë7~N~­·ËvѝýyõËÉWc}%Jb+’$)Œ!JŠâœSb9S ˆIK¤#êÆB R”ãX¸-JÂúqº±Œ¸ÖæšsµOŽ)F¬¢¼ˆ0ÔÝ?îx„oNʸžÄ$Í5Í…FªšÍp4'<ëzsÓ´‹úfµÂ©K§mɦá\…Õ.‘Ì3g?¥%1†a±Œa û0Ô~PÝ ûA<ûMx¸á{£]ô뻩W÷ÍðA/¶×háúÆêšR6:•¶Ÿ•yù¤&V,½1,%_€áòusäx@òÅ<`C]ÑLÆ5 y„J„< ðUsB¾Oc&ä1eÛm›êê¾RÅ-î+­ LQ,æ1,áÓ†úª›áSˆàÓ IK¹xZ¯½B=UëÁ†‹áƒx`±JE8+±PÇ°”X†‹ÔÍ à‰óÀZòWéçcçFM„âH„cÔ|„Ga¨jF„hÀžðèVۙ-)QÔ·CKÎܐE£ÁRn 0܍@Ý7< 7Æ«¢¦„r‰-1,¥b€á*usTx@*Æ<þÕrñ… 9åÒÝãY,ó*‘ù€Â3TÍÉü>™ÌÇ<ºny³éª›Oõ3ôЏ»m2•§n÷Â5šû–rl€áŽêæ8à96æ1±çû±Ç|jÚÞvŸ½//ÚÝÙzÄ£§uÿpëyV?f áV`‰a ýFªT7C?ˆ ß„–øcIêóɔs;7HÖcÔ|ÖGšu¨jFÖhÀYŸð€3Î,¥¯‘q&$‘Vaa)îQ nŽGGc_ӂ²âÍ4Qš£ñŽ`)é —¨›#À’.æq¤†žPÓ¿u" 1læáKx1%¾—¢¸!”Y;þRO¿´³o™¿’U·¶endstream +endobj +4890 0 obj << +/Type /Page +/Contents 4891 0 R +/Resources 4889 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4892 0 obj << +/D [4890 0 R /XYZ 71.731 729.2652 null] +>> endobj +4893 0 obj << +/D [4890 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4894 0 obj << +/D [4890 0 R /XYZ 71.731 706.1869 null] +>> endobj +4895 0 obj << +/D [4890 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4896 0 obj << +/D [4890 0 R /XYZ 76.7123 672.4782 null] +>> endobj +4897 0 obj << +/D [4890 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4898 0 obj << +/D [4890 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4899 0 obj << +/D [4890 0 R /XYZ 71.731 652.3886 null] +>> endobj +4900 0 obj << +/D [4890 0 R /XYZ 71.731 652.3886 null] +>> endobj +4901 0 obj << +/D [4890 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4902 0 obj << +/D [4890 0 R /XYZ 71.731 634.4559 null] +>> endobj +4903 0 obj << +/D [4890 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4904 0 obj << +/D [4890 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4905 0 obj << +/D [4890 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4906 0 obj << +/D [4890 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4907 0 obj << +/D [4890 0 R /XYZ 71.731 580.6576 null] +>> endobj +4908 0 obj << +/D [4890 0 R /XYZ 71.731 580.6576 null] +>> endobj +4909 0 obj << +/D [4890 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4910 0 obj << +/D [4890 0 R /XYZ 71.731 562.7248 null] +>> endobj +4911 0 obj << +/D [4890 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4912 0 obj << +/D [4890 0 R /XYZ 76.7123 529.0162 null] +>> endobj +4913 0 obj << +/D [4890 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4914 0 obj << +/D [4890 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4915 0 obj << +/D [4890 0 R /XYZ 71.731 508.9266 null] +>> endobj +4916 0 obj << +/D [4890 0 R /XYZ 71.731 508.9266 null] +>> endobj +4917 0 obj << +/D [4890 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4918 0 obj << +/D [4890 0 R /XYZ 71.731 490.9938 null] +>> endobj +4919 0 obj << +/D [4890 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4920 0 obj << +/D [4890 0 R /XYZ 76.7123 457.2852 null] +>> endobj +4921 0 obj << +/D [4890 0 R /XYZ 149.4396 439.3524 null] +>> endobj +4922 0 obj << +/D [4890 0 R /XYZ 149.4396 439.3524 null] +>> endobj +4923 0 obj << +/D [4890 0 R /XYZ 71.731 437.1956 null] +>> endobj +4924 0 obj << +/D [4890 0 R /XYZ 71.731 437.1956 null] +>> endobj +4925 0 obj << +/D [4890 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4926 0 obj << +/D [4890 0 R /XYZ 71.731 419.9801 null] +>> endobj +4927 0 obj << +/D [4890 0 R /XYZ 159.4023 403.4869 null] +>> endobj +4928 0 obj << +/D [4890 0 R /XYZ 76.7123 385.5542 null] +>> endobj +4929 0 obj << +/D [4890 0 R /XYZ 149.4396 367.6214 null] +>> endobj +4930 0 obj << +/D [4890 0 R /XYZ 149.4396 367.6214 null] +>> endobj +4931 0 obj << +/D [4890 0 R /XYZ 71.731 365.4646 null] +>> endobj +4932 0 obj << +/D [4890 0 R /XYZ 71.731 365.4646 null] +>> endobj +4933 0 obj << +/D [4890 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4934 0 obj << +/D [4890 0 R /XYZ 71.731 347.5318 null] +>> endobj +4935 0 obj << +/D [4890 0 R /XYZ 159.4023 331.7559 null] +>> endobj +4936 0 obj << +/D [4890 0 R /XYZ 76.7123 313.8231 null] +>> endobj +4937 0 obj << +/D [4890 0 R /XYZ 149.4396 295.8904 null] +>> endobj +4938 0 obj << +/D [4890 0 R /XYZ 149.4396 295.8904 null] +>> endobj +4939 0 obj << +/D [4890 0 R /XYZ 71.731 293.7336 null] +>> endobj +4940 0 obj << +/D [4890 0 R /XYZ 71.731 293.7336 null] +>> endobj +4941 0 obj << +/D [4890 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4942 0 obj << +/D [4890 0 R /XYZ 71.731 275.8008 null] +>> endobj +4943 0 obj << +/D [4890 0 R /XYZ 159.4023 260.0249 null] +>> endobj +4944 0 obj << +/D [4890 0 R /XYZ 76.7123 242.0921 null] +>> endobj +4945 0 obj << +/D [4890 0 R /XYZ 149.4396 224.1594 null] +>> endobj +4946 0 obj << +/D [4890 0 R /XYZ 149.4396 224.1594 null] +>> endobj +4947 0 obj << +/D [4890 0 R /XYZ 71.731 222.0026 null] +>> endobj +4948 0 obj << +/D [4890 0 R /XYZ 71.731 222.0026 null] +>> endobj +4949 0 obj << +/D [4890 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4950 0 obj << +/D [4890 0 R /XYZ 71.731 204.0698 null] +>> endobj +4951 0 obj << +/D [4890 0 R /XYZ 159.4023 188.2939 null] +>> endobj +4952 0 obj << +/D [4890 0 R /XYZ 76.7123 170.3611 null] +>> endobj +4953 0 obj << +/D [4890 0 R /XYZ 149.4396 152.4284 null] +>> endobj +4954 0 obj << +/D [4890 0 R /XYZ 149.4396 152.4284 null] +>> endobj +4955 0 obj << +/D [4890 0 R /XYZ 71.731 150.2715 null] +>> endobj +4956 0 obj << +/D [4890 0 R /XYZ 71.731 150.2715 null] +>> endobj +4957 0 obj << +/D [4890 0 R /XYZ 159.4023 134.4956 null] +>> endobj +4958 0 obj << +/D [4890 0 R /XYZ 71.731 132.3388 null] +>> endobj +4959 0 obj << +/D [4890 0 R /XYZ 159.4023 116.5629 null] +>> endobj +4960 0 obj << +/D [4890 0 R /XYZ 76.7123 98.6301 null] +>> endobj +4889 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4963 0 obj << +/Length 1435 +/Filter /FlateDecode +>> +stream +xÚ½YÑnÛ6}ÏWè1jŽ¤H‘ì[ÚnÆv†ìiÕVb¡ŽdHrƒþý(‹”(ë’ÔŠ®Èƒeåˆ÷èèÜCÒ" Ö$‰TP…hÆi²}¾ÂɓþׯWÄ@6³qAoî¯~ú%ʼnB*£Yrÿ˜¤*C\°D¤INdr¿ûûúí>?vEs³¡_S4|ÞòªèÞ矆¯·w¿ Šn_ïڛî¿úù~¬ÏS”ÔE‚$S%ÇRÊ/¹F47‘%îx¶êåçÄÂ^µ¤‘ÊDjI3v¦Á4 ­ëœÇ.mSè]ÏçÌ}z™@ ‹¾V~=H[VÝpP›g‘7Mþ՜zœ0‹Û32…#XÁ¢ZÔƅª.FóÊʵ@S°®_V{ÈcRˆpÍÓtÎCßþ«AˆwZY£RµºòٜzÙÕpTÕ;s®¨ºÆˆùrCôeíðÅyH°ª‚j›ISՁ…Tµ°¸ª@Ý5ª< U]°Ï~”Ц³4C¡" .Ê #* PÕ‘° GŒdzVèdÌT*9ς¶kÊê)æõ.‘(*š,ä] ‹{¨»Æ»È».AãÕùçÞq—~”Ÿ ×í-h۝róÏç|»/«Â/'ÆH0’ÓÂâru×È ð€ätyx=öÿ*lú–g II"à¢ü0¢¢U]‘ pÌx‹¢y(¡Ãze$¿ï‚€³ )&cíïÂ~aQ¿BuWøâøuÆcš§î +»„íj;9•Û½5cÙ^ÎSŸŠC]=µ~õt0c’ź݅…Ô³°¸z@Ý5ê< õ\Á‰ÿ» j’©Ž#Íí¢üÍ=¢¢Í U]ÑÜ psÏxôJü¸æf‚#JD¬¹]XÀž#,jO¨î +{B<{ÎxL^üc4Y¹ÓëËò#ÆT»Ó« ˆJk]ÒÆÂâÚu×hð€´qy[w¥\D!Îõ̔J®˜G.‹Ú¸°I.%ð ×b4¯\”ê2¡`]¿\öª%yoê€ã„¥sMѝšêá±,Ï"÷Û!*Óy‹güÚÈú¾l»¹ägaûg99[Þ¶%¦wÿ% –Û¢6. pçb4¯Ü)E˜2ÖõËm¯y8î4‰<£1mKô@K¹¾Ž‘ÄŠŸžj_{-IU¦wE’G,é–aQKBuWXâáhdŸÕŒ¼Ô>m;¯q¨ˆq.#Æqa㌰¨q º+Œ³à1ïScœ¶hÛ²®à)T2ƒvɯl/r|»{.ÍuuøªO‘ËD´%Î_¾ÜP~N…_óLÏÝ:|#’O¨â|YtÞ$`¹ÇíI¯WÚµjÇãðîí_6 +÷¹ù߶®º¦>€ËFÏJ‘2Š¸Âix¥è¢ü+Å])BUW¬!NëÛEČ´®M‚3$(‹6¹ YÎÂâžê®1Ý%Øu.þÑ?5õéè1ß7ÎÅÓFä<øˆЖŞ)+Ÿ‰”H(¶¢ò;т¢FJ®ð!À°¡K"äB©ž¶3q¡ ¸p„E]Õ]áÂЅ3‡¼íNÇ]ð ÍbËö£~•KR*¥ = ‹? îšçpÉ~./EóÍSþíñ˜7…ÝH¿©ksôöÞ ¿žÆ‡&áŒÄžP!} *.ï²èu/HÀâ:zÿUE÷R7Ÿ=Y+SD¤Þnÿ׬Ճö6֏­Q4ggo‹UѻϽ¿)…H?3×ù3ׂ¢™ ”\‘¹ s]@æš7÷L"I2|¹ï`–ïö9•¥Æ‘úz{ßÔÿ> endobj +4964 0 obj << +/D [4962 0 R /XYZ 71.731 729.2652 null] +>> endobj +4965 0 obj << +/D [4962 0 R /XYZ 149.4396 708.3437 null] +>> endobj +4966 0 obj << +/D [4962 0 R /XYZ 149.4396 708.3437 null] +>> endobj +4967 0 obj << +/D [4962 0 R /XYZ 71.731 706.1869 null] +>> endobj +4968 0 obj << +/D [4962 0 R /XYZ 71.731 706.1869 null] +>> endobj +4969 0 obj << +/D [4962 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4970 0 obj << +/D [4962 0 R /XYZ 71.731 688.2541 null] +>> endobj +4971 0 obj << +/D [4962 0 R /XYZ 159.4023 672.4782 null] +>> endobj +4972 0 obj << +/D [4962 0 R /XYZ 76.7123 654.5454 null] +>> endobj +4973 0 obj << +/D [4962 0 R /XYZ 149.4396 636.6127 null] +>> endobj +4974 0 obj << +/D [4962 0 R /XYZ 149.4396 636.6127 null] +>> endobj +4975 0 obj << +/D [4962 0 R /XYZ 71.731 634.4559 null] +>> endobj +4976 0 obj << +/D [4962 0 R /XYZ 71.731 634.4559 null] +>> endobj +4977 0 obj << +/D [4962 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4978 0 obj << +/D [4962 0 R /XYZ 71.731 616.5231 null] +>> endobj +4979 0 obj << +/D [4962 0 R /XYZ 159.4023 600.7472 null] +>> endobj +4980 0 obj << +/D [4962 0 R /XYZ 76.7123 582.8144 null] +>> endobj +4981 0 obj << +/D [4962 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4982 0 obj << +/D [4962 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4983 0 obj << +/D [4962 0 R /XYZ 71.731 562.7248 null] +>> endobj +4984 0 obj << +/D [4962 0 R /XYZ 71.731 562.7248 null] +>> endobj +4985 0 obj << +/D [4962 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4986 0 obj << +/D [4962 0 R /XYZ 71.731 544.7921 null] +>> endobj +4987 0 obj << +/D [4962 0 R /XYZ 159.4023 529.0162 null] +>> endobj +4988 0 obj << +/D [4962 0 R /XYZ 76.7123 511.0834 null] +>> endobj +4989 0 obj << +/D [4962 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4990 0 obj << +/D [4962 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4991 0 obj << +/D [4962 0 R /XYZ 71.731 490.9938 null] +>> endobj +4992 0 obj << +/D [4962 0 R /XYZ 71.731 490.9938 null] +>> endobj +4993 0 obj << +/D [4962 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4994 0 obj << +/D [4962 0 R /XYZ 71.731 473.7784 null] +>> endobj +4995 0 obj << +/D [4962 0 R /XYZ 159.4023 457.2852 null] +>> endobj +4996 0 obj << +/D [4962 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4997 0 obj << +/D [4962 0 R /XYZ 129.5143 385.5542 null] +>> endobj +4998 0 obj << +/D [4962 0 R /XYZ 129.5143 385.5542 null] +>> endobj +4999 0 obj << +/D [4962 0 R /XYZ 71.731 383.3973 null] +>> endobj +5000 0 obj << +/D [4962 0 R /XYZ 71.731 383.3973 null] +>> endobj +5001 0 obj << +/D [4962 0 R /XYZ 139.477 367.6214 null] +>> endobj +5002 0 obj << +/D [4962 0 R /XYZ 71.731 329.7634 null] +>> endobj +5003 0 obj << +/D [4962 0 R /XYZ 71.731 316.7124 null] +>> endobj +5004 0 obj << +/D [4962 0 R /XYZ 71.731 315.4671 null] +>> endobj +5005 0 obj << +/D [4962 0 R /XYZ 129.5143 296.3885 null] +>> endobj +5006 0 obj << +/D [4962 0 R /XYZ 71.731 294.2317 null] +>> endobj +5007 0 obj << +/D [4962 0 R /XYZ 71.731 294.2317 null] +>> endobj +5008 0 obj << +/D [4962 0 R /XYZ 139.477 278.4558 null] +>> endobj +5009 0 obj << +/D [4962 0 R /XYZ 139.477 278.4558 null] +>> endobj +5010 0 obj << +/D [4962 0 R /XYZ 71.731 276.2989 null] +>> endobj +5011 0 obj << +/D [4962 0 R /XYZ 139.477 260.523 null] +>> endobj +5012 0 obj << +/D [4962 0 R /XYZ 139.477 260.523 null] +>> endobj +5013 0 obj << +/D [4962 0 R /XYZ 71.731 258.3662 null] +>> endobj +5014 0 obj << +/D [4962 0 R /XYZ 71.731 258.3662 null] +>> endobj +5015 0 obj << +/D [4962 0 R /XYZ 149.4396 242.5903 null] +>> endobj +5016 0 obj << +/D [4962 0 R /XYZ 76.7123 224.6575 null] +>> endobj +5017 0 obj << +/D [4962 0 R /XYZ 139.477 206.7248 null] +>> endobj +5018 0 obj << +/D [4962 0 R /XYZ 139.477 206.7248 null] +>> endobj +5019 0 obj << +/D [4962 0 R /XYZ 71.731 204.5679 null] +>> endobj +5020 0 obj << +/D [4962 0 R /XYZ 71.731 204.5679 null] +>> endobj +5021 0 obj << +/D [4962 0 R /XYZ 149.4396 188.792 null] +>> endobj +5022 0 obj << +/D [4962 0 R /XYZ 76.7123 170.8593 null] +>> endobj +5023 0 obj << +/D [4962 0 R /XYZ 139.477 152.9265 null] +>> endobj +5024 0 obj << +/D [4962 0 R /XYZ 139.477 152.9265 null] +>> endobj +5025 0 obj << +/D [4962 0 R /XYZ 71.731 150.7697 null] +>> endobj +5026 0 obj << +/D [4962 0 R /XYZ 139.477 134.9938 null] +>> endobj +5027 0 obj << +/D [4962 0 R /XYZ 139.477 134.9938 null] +>> endobj +5028 0 obj << +/D [4962 0 R /XYZ 71.731 132.8369 null] +>> endobj +5029 0 obj << +/D [4962 0 R /XYZ 139.477 117.061 null] +>> endobj +5030 0 obj << +/D [4962 0 R /XYZ 139.477 117.061 null] +>> endobj +5031 0 obj << +/D [4962 0 R /XYZ 71.731 114.9042 null] +>> endobj +5032 0 obj << +/D [4962 0 R /XYZ 71.731 114.9042 null] +>> endobj +5033 0 obj << +/D [4962 0 R /XYZ 149.4396 99.1283 null] +>> endobj +4961 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5037 0 obj << +/Length 1587 +/Filter /FlateDecode +>> +stream +xڝY]“›6}ß_áÇõL­JB"oùhÒtÒÎN²yj:km&\»ã_ $,°@$³¶Ùƒîѹ‡«+VPý¡UŒ@©œÌ(^eÇ;¸Ú«}¸C²1˜ zóx÷ëû®0ÌVÏ«(a€ÆdGpŠøêq÷÷ýÛCz’¢^o0…÷tŸEZ +ù)}ê~¾~øØ}ùSÈCµkÖÿ<þq÷ÛcŸF1H¸ +2K’@ãÑjqŸD^RCP¤þ¹a Á¤Ÿ NV1@z¢j2=®‡éÙ|؎Ù!5]ˆI²r´qǟWö®[_q%*#-($Ž‡4žªJn™J¡É´Ì¯i  `ι +£¡¯:eYçåþ—îÇu»½lÆL¨ŸzŒUlŽCB:°9!-,,¤'î!Ç<üBº4NBÔ۲ډm¾óHÉb@`æá×Ü¥qªjÙxWœ#žŒJGZ×éeÍè½ÑýSÞ½«g³0¾ýjÊD;®I€ÍÊ\*²ª,E&íã «[q }AL≢n@åIÉx¬ÉŒ¤Vî˜y£NgÄÞå¥qECuCÊד†¤ŒÎQ¨¸°Cö° !}qò†‡×M‘gº +øLI!H`ò£žlG4.«J¯'¬F  áɼÕ\Ô´ÕzTÐj¾¨ ¬æ£á±Ú€Ç¬ÕG¡µÜ…ÍYÍÂÂVóÄ]bµ1¿Õ\mZVeös]è7HáëÝ1/­µŠ‹º„º_ŸÓrW»ïÿ­1½O‹³©x{QŠ:í+ÝÓÅZRŒk£­›Ej=­)OfŒ$@j d̅Íd¬‡3拻 c7<¼ИîtÂ_þÎvRɘŒâкïÂ攴°°’ž¸K”óð+éÒø..‘ZõcÅø'MUùûÁ{¡÷—i‘i¬1ڝ¹°9‘-,,²'î‘Ç<ü"»4vê)ßfµ°=æíÎÞ¥}S[Ú¦(? +Ûߊ›=›òumjɋ–?µÕ•€?ŠzDq¨Ð»°¹çÅTû¬Ž0~´VÃêårVMKnh}¥°]usY»¤fÌ-ë²#N¥$°¡sQÓ]v +vÙ¾¨ ºl O—=à1×eGêÆy¨¸°Wö° +}q¸ò†‡×•MsØÖMºõwLyá¹6ûSßü~/+ÝI¿ ~ùòûõèÌÛv¨XjÊjAF´å§&U3©ºú ã1Þ-p¨öc~ÿAȇ·_}‰ÇPQÁcÖÍí¡®d%/'ñª¿ãª†¹w£Ê!CfÃeÇï{©ô,f¢§ì¼m+ýº@û@ÖBžë²ý(vMÛmÝÒÛØh.½w¢Éêü¤ŸÚ9‚”áŽàç6Zc×;·F 7Õ²>gòzv#Ó¼T9ë~ï„úYØAžª³=;îòg »¾­®ÌRy.séè¢UÒS5/\>>{4œõ5Èî«úÅ:oÓ©¶Q›?FYÔNtfný!–»WhL:*{îê0q*•‘ŸÖXÍNŠ~€Òž_pL¥nö£Vb8ӗ¼(ìRçZCì®"y&:òϤj7ôz7Òò;GËÒa€Eªzj:Îæá˜ö‡áÂv®©L‹춢ܤú¶ftߕ«3BOû*ïõüQäFL}Ö܀qy4ï Mt +öU¢ƒ¹}“H1%I?’ž9G“ï=ÿîŽ5endstream +endobj +5036 0 obj << +/Type /Page +/Contents 5037 0 R +/Resources 5035 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5038 0 obj << +/D [5036 0 R /XYZ 71.731 729.2652 null] +>> endobj +5039 0 obj << +/D [5036 0 R /XYZ 76.7123 708.3437 null] +>> endobj +5040 0 obj << +/D [5036 0 R /XYZ 139.477 690.4109 null] +>> endobj +5041 0 obj << +/D [5036 0 R /XYZ 139.477 690.4109 null] +>> endobj +5042 0 obj << +/D [5036 0 R /XYZ 71.731 688.2541 null] +>> endobj +5043 0 obj << +/D [5036 0 R /XYZ 139.477 672.4782 null] +>> endobj +5044 0 obj << +/D [5036 0 R /XYZ 139.477 672.4782 null] +>> endobj +5045 0 obj << +/D [5036 0 R /XYZ 71.731 670.3214 null] +>> endobj +5046 0 obj << +/D [5036 0 R /XYZ 139.477 654.5454 null] +>> endobj +5047 0 obj << +/D [5036 0 R /XYZ 139.477 654.5454 null] +>> endobj +5048 0 obj << +/D [5036 0 R /XYZ 71.731 652.3886 null] +>> endobj +5049 0 obj << +/D [5036 0 R /XYZ 139.477 636.6127 null] +>> endobj +5050 0 obj << +/D [5036 0 R /XYZ 139.477 636.6127 null] +>> endobj +5051 0 obj << +/D [5036 0 R /XYZ 71.731 635.1731 null] +>> endobj +5052 0 obj << +/D [5036 0 R /XYZ 139.477 618.6799 null] +>> endobj +5053 0 obj << +/D [5036 0 R /XYZ 139.477 618.6799 null] +>> endobj +5054 0 obj << +/D [5036 0 R /XYZ 71.731 616.5231 null] +>> endobj +5055 0 obj << +/D [5036 0 R /XYZ 71.731 616.5231 null] +>> endobj +5056 0 obj << +/D [5036 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5057 0 obj << +/D [5036 0 R /XYZ 76.7123 582.8144 null] +>> endobj +5058 0 obj << +/D [5036 0 R /XYZ 139.477 564.8817 null] +>> endobj +5059 0 obj << +/D [5036 0 R /XYZ 139.477 564.8817 null] +>> endobj +5060 0 obj << +/D [5036 0 R /XYZ 71.731 562.7248 null] +>> endobj +5061 0 obj << +/D [5036 0 R /XYZ 71.731 562.7248 null] +>> endobj +5062 0 obj << +/D [5036 0 R /XYZ 149.4396 546.9489 null] +>> endobj +5063 0 obj << +/D [5036 0 R /XYZ 76.7123 529.0162 null] +>> endobj +5064 0 obj << +/D [5036 0 R /XYZ 139.477 511.0834 null] +>> endobj +5065 0 obj << +/D [5036 0 R /XYZ 139.477 511.0834 null] +>> endobj +5066 0 obj << +/D [5036 0 R /XYZ 71.731 508.9266 null] +>> endobj +5067 0 obj << +/D [5036 0 R /XYZ 139.477 493.1507 null] +>> endobj +5068 0 obj << +/D [5036 0 R /XYZ 139.477 493.1507 null] +>> endobj +5069 0 obj << +/D [5036 0 R /XYZ 71.731 491.7111 null] +>> endobj +5070 0 obj << +/D [5036 0 R /XYZ 139.477 475.2179 null] +>> endobj +5071 0 obj << +/D [5036 0 R /XYZ 139.477 475.2179 null] +>> endobj +5072 0 obj << +/D [5036 0 R /XYZ 71.731 473.0611 null] +>> endobj +5073 0 obj << +/D [5036 0 R /XYZ 139.477 457.2852 null] +>> endobj +5074 0 obj << +/D [5036 0 R /XYZ 139.477 457.2852 null] +>> endobj +5075 0 obj << +/D [5036 0 R /XYZ 71.731 455.1283 null] +>> endobj +5076 0 obj << +/D [5036 0 R /XYZ 139.477 439.3524 null] +>> endobj +5077 0 obj << +/D [5036 0 R /XYZ 139.477 439.3524 null] +>> endobj +5078 0 obj << +/D [5036 0 R /XYZ 71.731 437.1956 null] +>> endobj +5079 0 obj << +/D [5036 0 R /XYZ 139.477 421.4197 null] +>> endobj +5080 0 obj << +/D [5036 0 R /XYZ 139.477 421.4197 null] +>> endobj +5081 0 obj << +/D [5036 0 R /XYZ 71.731 419.2628 null] +>> endobj +5082 0 obj << +/D [5036 0 R /XYZ 139.477 403.4869 null] +>> endobj +5083 0 obj << +/D [5036 0 R /XYZ 139.477 403.4869 null] +>> endobj +5084 0 obj << +/D [5036 0 R /XYZ 71.731 401.3301 null] +>> endobj +5085 0 obj << +/D [5036 0 R /XYZ 71.731 401.3301 null] +>> endobj +5086 0 obj << +/D [5036 0 R /XYZ 149.4396 385.5542 null] +>> endobj +5087 0 obj << +/D [5036 0 R /XYZ 76.7123 367.6214 null] +>> endobj +5088 0 obj << +/D [5036 0 R /XYZ 139.477 349.6887 null] +>> endobj +5089 0 obj << +/D [5036 0 R /XYZ 139.477 349.6887 null] +>> endobj +808 0 obj << +/D [5036 0 R /XYZ 71.731 326.7746 null] +>> endobj +350 0 obj << +/D [5036 0 R /XYZ 189.4142 281.5203 null] +>> endobj +5090 0 obj << +/D [5036 0 R /XYZ 71.731 261.3799 null] +>> endobj +5091 0 obj << +/D [5036 0 R /XYZ 161.0655 248.6436 null] +>> endobj +5092 0 obj << +/D [5036 0 R /XYZ 71.731 236.5241 null] +>> endobj +5093 0 obj << +/D [5036 0 R /XYZ 71.731 205.1582 null] +>> endobj +5094 0 obj << +/D [5036 0 R /XYZ 168.8063 194.1479 null] +>> endobj +5095 0 obj << +/D [5036 0 R /XYZ 71.731 167.0845 null] +>> endobj +5096 0 obj << +/D [5036 0 R /XYZ 71.731 127.35 null] +>> endobj +5035 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5099 0 obj << +/Length 1309 +/Filter /FlateDecode +>> +stream +xÚ½™_oÛ6Åßó)ü˜5Çÿû–ېa‚!{Z‡Aµ•X€c’‚bß~TD*—Ö¥ÈiÑ9î‘îÑ/çˆfÌ6Ôþc›‚‘BØ7„kÅ7»ç+ºy²ÿõËs’­Ól¡èLJ«~tcˆÑ\o7Âh¢ +¹)'¥båæaÿ×õ§Cuêîf˽æd:Þ«S=üV}™~¼½¿›^ü^‡vßßüýðëÕOó|% +bJ;dÕä¬ZÚäØdÌ¥X±)hI„Å«ÏÛã±½áêúk½Ÿ¼üÑëþãhåõüҞ¯åx¾»Ò–3¢Yi^Ï®öÏÍéÃtâ¹q/†zwp/Oí¾ž/õfeë¯5+ôääþ†©ëª«žkËmraÌöµDr©Q³j e†UPÀ˜e£…Ïœ«Å\Î--Æѹ—Ç7þ¬¥Q¨ÌþÊ“"ôQ½ —„ŽFÉÇ p?t/»áÃEžÆóëÓÐ쪡iOPùÒÕËô˜"Ò0ƒƒõª-”½ecQ‚ò²(Xû˧\tn¬?ké#+ ‘EÚ¸µ\¦®!t•&ZÚ_òmNOž/‚õyºÜüv:¾ôu4½ª0Ä”‰ôBÙJzgY2½Ø܌ô.|àé |œw/ÿ<6Çñé‡SfÖy@¹êºêßéeû8›ÓàÞè`~£áUÚ>–ŒÐ‰ðBÙJxgY2¼Ø܌ðb>À£Ú…7°CrѼÿô§{k?&ô3¥|Ò‚š¦šek°¼, ™› ñÀ‚6Âçâ`[üå†ÛfõôÖÈ'4´ê.Æ)yÉpBN´…*Ðåµ¢|$³+x¡Ñ©q>þ¬¥°¤ÒÚ°ŸQBö՝ìZ‹TT*¢¸á؃0¬$’H'[Ü ·@ RyúyÕÊ®‹«EÁ*‹HQŽÎƒõg¡>@ð”õA¹}+Æ\Kˆ%#Kwáu2P¶Bf–%É`s3È`>2h\²a¹BIe?™"QN¨Š—sV%ˉMÍ(çÂ^ÎÀǹk‡v׿o9¥Ð„i™*'”­EÐËÒDææDñEúÀóæq»÷kòäök}ï72‡a8÷óþæhwqqŒ¬$\°d“l £—¥1"ss0">0ŒÐGv“߇¬«ª(í§R­µ‡ªxígU²öØԌÚ/làµ|4g¤ðLnû…ZÚ"Ux([Iê,K&››‘TÌ’ÔÀË»{‡l¿ï꾏’š(JSU†²5@^–„ÌÍ„øÀAÙUN1óÅb”h¡R%ª•’zUº¤ÈԜ’^ڈ”úw· ö÷¡ãåÅʼØÆF¶º±Ú¥žv”H ”­$p–%ˆÍÍH æI`àãÿnbç›)¤Ýï™T9¡l —¥Ñ ssÐ >04ÐÇ;lù]•¸°¹¦2QK¨Š×rV%k‰MͨåÂ^ËÀÇ¡í‡ï¿Ÿåœû¡]¤2dkô²t‘¹9D|`„>ðÕâÆÉPA¨(“í²52^–&ƒÌÍ!ƒøÀÈ@ÙKg–+Óî–WË UñrΪd9±©å\ØÀËø蛡ÆMIíG‘ò}×Ìñ—4UJ([‰Þ,KF››=̽ÀÇÛ*pþaÿÇί‡º«/~:Û]5Ôû8LÁˆ EªÇP¶ÓËÒ0‘¹90Lècu•ýF|Ý7˲$%ÓfõËg Y~÷¬xI(3f¾ÒxC%~“Œ üÄßendstream +endobj +5098 0 obj << +/Type /Page +/Contents 5099 0 R +/Resources 5097 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5100 0 obj << +/D [5098 0 R /XYZ 71.731 729.2652 null] +>> endobj +5101 0 obj << +/D [5098 0 R /XYZ 71.731 718.3063 null] +>> endobj +5102 0 obj << +/D [5098 0 R /XYZ 181.5683 708.3437 null] +>> endobj +5103 0 obj << +/D [5098 0 R /XYZ 71.731 698.2815 null] +>> endobj +5104 0 obj << +/D [5098 0 R /XYZ 71.731 664.8583 null] +>> endobj +5105 0 obj << +/D [5098 0 R /XYZ 71.731 653.7485 null] +>> endobj +5106 0 obj << +/D [5098 0 R /XYZ 71.731 652.5032 null] +>> endobj +5107 0 obj << +/D [5098 0 R /XYZ 129.5143 633.4246 null] +>> endobj +5108 0 obj << +/D [5098 0 R /XYZ 129.5143 633.4246 null] +>> endobj +5109 0 obj << +/D [5098 0 R /XYZ 71.731 631.9851 null] +>> endobj +5110 0 obj << +/D [5098 0 R /XYZ 71.731 631.9851 null] +>> endobj +5111 0 obj << +/D [5098 0 R /XYZ 139.477 615.4919 null] +>> endobj +5112 0 obj << +/D [5098 0 R /XYZ 139.477 615.4919 null] +>> endobj +5113 0 obj << +/D [5098 0 R /XYZ 76.7123 597.5591 null] +>> endobj +5114 0 obj << +/D [5098 0 R /XYZ 129.5143 579.6264 null] +>> endobj +5115 0 obj << +/D [5098 0 R /XYZ 129.5143 579.6264 null] +>> endobj +5116 0 obj << +/D [5098 0 R /XYZ 71.731 577.4696 null] +>> endobj +5117 0 obj << +/D [5098 0 R /XYZ 71.731 577.4696 null] +>> endobj +5118 0 obj << +/D [5098 0 R /XYZ 139.477 561.6936 null] +>> endobj +5119 0 obj << +/D [5098 0 R /XYZ 71.731 559.5368 null] +>> endobj +5120 0 obj << +/D [5098 0 R /XYZ 139.477 543.7609 null] +>> endobj +5121 0 obj << +/D [5098 0 R /XYZ 71.731 542.3213 null] +>> endobj +5122 0 obj << +/D [5098 0 R /XYZ 71.731 542.3213 null] +>> endobj +5123 0 obj << +/D [5098 0 R /XYZ 149.4396 525.8281 null] +>> endobj +5124 0 obj << +/D [5098 0 R /XYZ 149.4396 525.8281 null] +>> endobj +5125 0 obj << +/D [5098 0 R /XYZ 71.731 523.6713 null] +>> endobj +5126 0 obj << +/D [5098 0 R /XYZ 71.731 523.6713 null] +>> endobj +5127 0 obj << +/D [5098 0 R /XYZ 159.4023 507.8954 null] +>> endobj +5128 0 obj << +/D [5098 0 R /XYZ 71.731 505.7386 null] +>> endobj +5129 0 obj << +/D [5098 0 R /XYZ 159.4023 489.9626 null] +>> endobj +5130 0 obj << +/D [5098 0 R /XYZ 76.7123 472.0299 null] +>> endobj +5131 0 obj << +/D [5098 0 R /XYZ 149.4396 454.0971 null] +>> endobj +5132 0 obj << +/D [5098 0 R /XYZ 149.4396 454.0971 null] +>> endobj +5133 0 obj << +/D [5098 0 R /XYZ 71.731 451.9403 null] +>> endobj +5134 0 obj << +/D [5098 0 R /XYZ 71.731 451.9403 null] +>> endobj +5135 0 obj << +/D [5098 0 R /XYZ 159.4023 436.1644 null] +>> endobj +5136 0 obj << +/D [5098 0 R /XYZ 71.731 434.0075 null] +>> endobj +5137 0 obj << +/D [5098 0 R /XYZ 159.4023 418.2316 null] +>> endobj +5138 0 obj << +/D [5098 0 R /XYZ 76.7123 400.2989 null] +>> endobj +5139 0 obj << +/D [5098 0 R /XYZ 149.4396 382.3661 null] +>> endobj +5140 0 obj << +/D [5098 0 R /XYZ 149.4396 382.3661 null] +>> endobj +5141 0 obj << +/D [5098 0 R /XYZ 71.731 380.2093 null] +>> endobj +5142 0 obj << +/D [5098 0 R /XYZ 71.731 380.2093 null] +>> endobj +5143 0 obj << +/D [5098 0 R /XYZ 159.4023 364.4334 null] +>> endobj +5144 0 obj << +/D [5098 0 R /XYZ 71.731 362.2765 null] +>> endobj +5145 0 obj << +/D [5098 0 R /XYZ 159.4023 346.5006 null] +>> endobj +5146 0 obj << +/D [5098 0 R /XYZ 76.7123 328.5679 null] +>> endobj +5147 0 obj << +/D [5098 0 R /XYZ 149.4396 310.6351 null] +>> endobj +5148 0 obj << +/D [5098 0 R /XYZ 149.4396 310.6351 null] +>> endobj +5149 0 obj << +/D [5098 0 R /XYZ 71.731 308.4783 null] +>> endobj +5150 0 obj << +/D [5098 0 R /XYZ 71.731 308.4783 null] +>> endobj +5151 0 obj << +/D [5098 0 R /XYZ 159.4023 292.7024 null] +>> endobj +5152 0 obj << +/D [5098 0 R /XYZ 71.731 291.2628 null] +>> endobj +5153 0 obj << +/D [5098 0 R /XYZ 159.4023 274.7696 null] +>> endobj +5154 0 obj << +/D [5098 0 R /XYZ 76.7123 256.8368 null] +>> endobj +5155 0 obj << +/D [5098 0 R /XYZ 149.4396 238.9041 null] +>> endobj +5156 0 obj << +/D [5098 0 R /XYZ 149.4396 238.9041 null] +>> endobj +5157 0 obj << +/D [5098 0 R /XYZ 71.731 236.7473 null] +>> endobj +5158 0 obj << +/D [5098 0 R /XYZ 71.731 236.7473 null] +>> endobj +5159 0 obj << +/D [5098 0 R /XYZ 159.4023 220.9713 null] +>> endobj +5160 0 obj << +/D [5098 0 R /XYZ 71.731 218.8145 null] +>> endobj +5161 0 obj << +/D [5098 0 R /XYZ 159.4023 203.0386 null] +>> endobj +5162 0 obj << +/D [5098 0 R /XYZ 76.7123 185.1058 null] +>> endobj +5163 0 obj << +/D [5098 0 R /XYZ 149.4396 167.1731 null] +>> endobj +5164 0 obj << +/D [5098 0 R /XYZ 149.4396 167.1731 null] +>> endobj +5165 0 obj << +/D [5098 0 R /XYZ 71.731 165.0163 null] +>> endobj +5166 0 obj << +/D [5098 0 R /XYZ 71.731 165.0163 null] +>> endobj +5167 0 obj << +/D [5098 0 R /XYZ 159.4023 149.2403 null] +>> endobj +5168 0 obj << +/D [5098 0 R /XYZ 71.731 147.8008 null] +>> endobj +5169 0 obj << +/D [5098 0 R /XYZ 159.4023 131.3076 null] +>> endobj +5170 0 obj << +/D [5098 0 R /XYZ 76.7123 113.3748 null] +>> endobj +5097 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5173 0 obj << +/Length 1394 +/Filter /FlateDecode +>> +stream +xÚ½šKoÛF…÷þ\:@5ç•]´…‹ +gՁ"іYH +Aÿ}G"‡º$ï<Ü …¢äù‡Ïå )±‚º?VhF´p/Ü®$/6/w´xvÿúíŽ ’Õ YAÑϏw?þ*ha‰U\O…°ŠH]Zpb$3ÅãöÏûw»õ©«š7+.é='ýëÇÃúXuï×_û·?}|è7>Tݮ޶oþzüýî—DZ¾šXãŠDM +kˆ¤R+N‰åL¢*&,)µvÇB ¥Ðã±p[hÂ.ÇéŽÅËFÕåX>s.çÞXɜ7­ +8ž¯:½¹ð{-mS‡T•W¥³á¸N}¼ÔÛêp1r5};ŽŽ0Ö¸Õ۞iÛ5ûãs¿]çaÝ4뿇ž&²ÅÑ õ•¥¤dÔâL½jeÔÅhAªÒñ‘”£uÃTý^¨'&ÊÅÔGOà‡!¡ï>õ=ë,Dš»ÈžBd1D^–F„ÔÍA„øÀAÁܼžÚÐ_J(¢×ñ^…ªp¯Žªd¯bU3zuaïՉÓºm¿ÕÍi×RcôӮ̥m²],–E/Kg©›“EÄ–EèÞ¹­šãú¥ +“¡”èR'»Èbd¼,M©›Cñ‘>²»4kh(©J—P–hN¨ +7ç¨J6'V5£96ðæœø8Ö]Õþ¿©,±¥Iu&”Eò7ʒùÃêfäóäoâc¶ûvS.ë½úÜöÔq@>e*Õ Päei@HÝ@ˆ ô‘jÐlfÌ)]–K© 7uñ¨ZAٍ™Õ´g¶-Ȍs·e­fæ÷Zú˜¶ªC%Y)¦>šª;7Ç/Oûê°ÅZö²LáFL[¶­äýöý¾í¦Ü?Sʯ#^ßuuÿÚ[¶7æ®iBòÇíU+(C"º-ˆÛÝOQ^Z´n·ß õ":\ '6n17ÓréŽGRb¨•WÁWBíÛ`$…2Ľ‘‰HBY$’£,I¬nF$1€‘?WxŸ7]08Â!dF™Dp ,œQ– V7#8 Ó>‚3±—Ëå®» +rlRÍ^˜Œ‡î´¡U8·Ê­FMâqT…Wá£*¹ +Ǫf¬Â1à:ê—eûc8x\Q?•; ŠÄΫ’©CŠf„nnÍô°?!ac‚p+YN‹?|¢¸Ý6Uۆ–œHK“,FÑËÒ‘º9ç>pÐÆisv½‹Ð’0nf4]Þæ(÷ÛêØí¯‹Á&̑—DI-S,ÆÑËÒ‘º9ç>pŽÐÆ®n»ïŸ½á(8Hªˆæeje1^–‰ÔÍ9÷ƒ„6Ú}Wá‰,]ÿSmC‰|€Aœ.-ݐýÖ·]ÕTó³Ê¡Þ¬»jDό!Úòy Š€÷ª$w¤hö¹ ”:ôpª›.ü4G¿vþîvä˸Ô~~ùZ5‹I½Zov·9zBÜì~¬6—Sâï0Ó<ÓîöJZŸæ¡*<͏ªä4U͘æ1È4?ñ›æ™(‰µ"uE€²X0½,L¤nN4ç>ðlBñïìtÎu5ý¥Ê€iBKѼ©b0Ušå²hʙ œ$ððï¾Pyõ¦µ—•CjÍT„^•DˆÍ@87"„⏽cYÌ}29ü` 4Ä0e£¿)šåO +$7„2kǑ.ƌþ@)øCƒ'ˆendstream +endobj +5172 0 obj << +/Type /Page +/Contents 5173 0 R +/Resources 5171 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5174 0 obj << +/D [5172 0 R /XYZ 71.731 729.2652 null] +>> endobj +809 0 obj << +/D [5172 0 R /XYZ 71.731 741.2204 null] +>> endobj +5175 0 obj << +/D [5172 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5176 0 obj << +/D [5172 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5177 0 obj << +/D [5172 0 R /XYZ 71.731 706.1869 null] +>> endobj +5178 0 obj << +/D [5172 0 R /XYZ 71.731 706.1869 null] +>> endobj +5179 0 obj << +/D [5172 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5180 0 obj << +/D [5172 0 R /XYZ 71.731 688.2541 null] +>> endobj +5181 0 obj << +/D [5172 0 R /XYZ 159.4023 672.4782 null] +>> endobj +5182 0 obj << +/D [5172 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5183 0 obj << +/D [5172 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5184 0 obj << +/D [5172 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5185 0 obj << +/D [5172 0 R /XYZ 71.731 634.4559 null] +>> endobj +5186 0 obj << +/D [5172 0 R /XYZ 71.731 634.4559 null] +>> endobj +5187 0 obj << +/D [5172 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5188 0 obj << +/D [5172 0 R /XYZ 71.731 616.5231 null] +>> endobj +5189 0 obj << +/D [5172 0 R /XYZ 159.4023 600.7472 null] +>> endobj +5190 0 obj << +/D [5172 0 R /XYZ 76.7123 582.8144 null] +>> endobj +5191 0 obj << +/D [5172 0 R /XYZ 149.4396 564.8817 null] +>> endobj +5192 0 obj << +/D [5172 0 R /XYZ 149.4396 564.8817 null] +>> endobj +5193 0 obj << +/D [5172 0 R /XYZ 71.731 562.7248 null] +>> endobj +5194 0 obj << +/D [5172 0 R /XYZ 71.731 562.7248 null] +>> endobj +5195 0 obj << +/D [5172 0 R /XYZ 159.4023 546.9489 null] +>> endobj +5196 0 obj << +/D [5172 0 R /XYZ 71.731 544.7921 null] +>> endobj +5197 0 obj << +/D [5172 0 R /XYZ 159.4023 529.0162 null] +>> endobj +5198 0 obj << +/D [5172 0 R /XYZ 76.7123 475.2179 null] +>> endobj +5199 0 obj << +/D [5172 0 R /XYZ 129.5143 457.2852 null] +>> endobj +5200 0 obj << +/D [5172 0 R /XYZ 129.5143 457.2852 null] +>> endobj +5201 0 obj << +/D [5172 0 R /XYZ 71.731 455.1283 null] +>> endobj +5202 0 obj << +/D [5172 0 R /XYZ 71.731 455.1283 null] +>> endobj +5203 0 obj << +/D [5172 0 R /XYZ 139.477 439.3524 null] +>> endobj +5204 0 obj << +/D [5172 0 R /XYZ 71.731 401.4944 null] +>> endobj +5205 0 obj << +/D [5172 0 R /XYZ 71.731 388.4434 null] +>> endobj +5206 0 obj << +/D [5172 0 R /XYZ 71.731 387.1981 null] +>> endobj +5207 0 obj << +/D [5172 0 R /XYZ 129.5143 368.1195 null] +>> endobj +5208 0 obj << +/D [5172 0 R /XYZ 71.731 365.9627 null] +>> endobj +5209 0 obj << +/D [5172 0 R /XYZ 71.731 365.9627 null] +>> endobj +5210 0 obj << +/D [5172 0 R /XYZ 139.477 350.1868 null] +>> endobj +5211 0 obj << +/D [5172 0 R /XYZ 139.477 350.1868 null] +>> endobj +5212 0 obj << +/D [5172 0 R /XYZ 71.731 348.03 null] +>> endobj +5213 0 obj << +/D [5172 0 R /XYZ 139.477 332.254 null] +>> endobj +5214 0 obj << +/D [5172 0 R /XYZ 139.477 332.254 null] +>> endobj +5215 0 obj << +/D [5172 0 R /XYZ 71.731 330.0972 null] +>> endobj +5216 0 obj << +/D [5172 0 R /XYZ 139.477 314.3213 null] +>> endobj +5217 0 obj << +/D [5172 0 R /XYZ 139.477 314.3213 null] +>> endobj +5218 0 obj << +/D [5172 0 R /XYZ 71.731 312.1645 null] +>> endobj +5219 0 obj << +/D [5172 0 R /XYZ 71.731 312.1645 null] +>> endobj +5220 0 obj << +/D [5172 0 R /XYZ 149.4396 296.3885 null] +>> endobj +5221 0 obj << +/D [5172 0 R /XYZ 76.7123 278.4558 null] +>> endobj +5222 0 obj << +/D [5172 0 R /XYZ 139.477 260.523 null] +>> endobj +5223 0 obj << +/D [5172 0 R /XYZ 139.477 260.523 null] +>> endobj +5224 0 obj << +/D [5172 0 R /XYZ 71.731 258.3662 null] +>> endobj +5225 0 obj << +/D [5172 0 R /XYZ 139.477 242.5903 null] +>> endobj +5226 0 obj << +/D [5172 0 R /XYZ 139.477 242.5903 null] +>> endobj +5227 0 obj << +/D [5172 0 R /XYZ 71.731 241.1507 null] +>> endobj +5228 0 obj << +/D [5172 0 R /XYZ 139.477 224.6575 null] +>> endobj +5229 0 obj << +/D [5172 0 R /XYZ 139.477 224.6575 null] +>> endobj +5230 0 obj << +/D [5172 0 R /XYZ 71.731 222.5007 null] +>> endobj +5231 0 obj << +/D [5172 0 R /XYZ 139.477 206.7248 null] +>> endobj +5232 0 obj << +/D [5172 0 R /XYZ 139.477 206.7248 null] +>> endobj +5233 0 obj << +/D [5172 0 R /XYZ 71.731 205.2852 null] +>> endobj +5234 0 obj << +/D [5172 0 R /XYZ 139.477 188.792 null] +>> endobj +5235 0 obj << +/D [5172 0 R /XYZ 139.477 188.792 null] +>> endobj +5236 0 obj << +/D [5172 0 R /XYZ 71.731 186.6352 null] +>> endobj +5237 0 obj << +/D [5172 0 R /XYZ 71.731 186.6352 null] +>> endobj +5238 0 obj << +/D [5172 0 R /XYZ 149.4396 170.8593 null] +>> endobj +5239 0 obj << +/D [5172 0 R /XYZ 76.7123 152.9265 null] +>> endobj +5240 0 obj << +/D [5172 0 R /XYZ 139.477 134.9938 null] +>> endobj +5241 0 obj << +/D [5172 0 R /XYZ 139.477 134.9938 null] +>> endobj +5242 0 obj << +/D [5172 0 R /XYZ 71.731 132.8369 null] +>> endobj +5243 0 obj << +/D [5172 0 R /XYZ 139.477 117.061 null] +>> endobj +5244 0 obj << +/D [5172 0 R /XYZ 139.477 117.061 null] +>> endobj +5245 0 obj << +/D [5172 0 R /XYZ 71.731 114.9042 null] +>> endobj +5246 0 obj << +/D [5172 0 R /XYZ 139.477 99.1283 null] +>> endobj +5247 0 obj << +/D [5172 0 R /XYZ 139.477 99.1283 null] +>> endobj +5171 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5250 0 obj << +/Length 1126 +/Filter /FlateDecode +>> +stream +xÚ¥˜]s£6†ïó+¸´g‚ªO$ö.í¶;m·3ž$wÝ^¬Z »“þúD„-À3™\ Ø¯tÞsx8’!†?I‚$ƒ MMòà Ž^à«/7dÄƒ&öE?>Þüð ÃQŠÒ„&ÑãsÄÒ É#É(R‚¨èqÿçæ§"{5ºÝÆTà EýuWeµ6_³§þ߻ݯýàmŠfßmÿzüíæçÇ1¾`¥ +‚,šU—6)‰ˆD”n}Ù$B!‚9ÙÇ̓jóE›Ý–áÖíçÌdÖ ¬z‰r‰Å2Šm¢2‘§vmcóöª?3ÌHN!‡¹1%(!éIoø§ä¿a³£)àJAc·†ô³îò¶|5eS/…epcÚǽ×æØÖ]³*;3 ›çá£&Ϫᣧ¿uî¾7EfúÑà÷U»ÛÚͱÚ÷ã<Ë ÝËz¸º%öëSÖ _gçÏM«Ë—zràä®êš~Ôú®Í–l\›Á˜TXˆ TY$ì”îdõºÙënjÎ噻ÛÑV?ø^”yáÄÚeYUeýr^·”½M[šÌ”[*6ÿn‰Ø¸uMãÒïFëÎL÷VçEÛÔ噽¥ÓÓUÞbm5@c J˜LN ?h}f¶<¼Vú kXô^?·º+vc +cÚEc£}Uišì±Ó{t-°wUÕ¯«^î›Jw«ŒêÙÍö‡²¾õª~eԝ­YÖf ­¨æ÷BR$‘ÐÁŠ…û˨Š}Yß_ÒzÄÄ:¸\ÍZøF©¸ˆK)bœÐ`Üóë»7ëÒS^ tAA8›ú°hÊF9Â6‚•|x3í17·g-ÚΔÊ܃©W[}™ ³ 0"ópa*öeï…%¶[Or²ÙÂÂÍǔ§Á¸ó…u³.}L ËRÄ¥œÚ¸ƒºôÛW ºžO;ãy}¡…¸úÊz藛t xØN},í^KF‘Â)÷{ûàÒ R¬îɖw²uÀq¯<à㽪ï<ø>zgI¤)†SW+$ú²GÙ*‰¡¸Wxá#HâÄÆCUæº PÈ8’IšL)ÌÚ6{Û&b3€øÕßOÏݸô4ÇÁ…dÏΜ&öDºž­4[UN _Øð!ç‹ê&…> endobj +5251 0 obj << +/D [5249 0 R /XYZ 71.731 729.2652 null] +>> endobj +354 0 obj << +/D [5249 0 R /XYZ 217.6127 658.1081 null] +>> endobj +5252 0 obj << +/D [5249 0 R /XYZ 71.731 637.9677 null] +>> endobj +5253 0 obj << +/D [5249 0 R /XYZ 161.0655 625.2314 null] +>> endobj +5254 0 obj << +/D [5249 0 R /XYZ 71.731 613.1119 null] +>> endobj +5255 0 obj << +/D [5249 0 R /XYZ 71.731 582.0823 null] +>> endobj +5256 0 obj << +/D [5249 0 R /XYZ 168.8063 570.7357 null] +>> endobj +5257 0 obj << +/D [5249 0 R /XYZ 71.731 543.6723 null] +>> endobj +5258 0 obj << +/D [5249 0 R /XYZ 71.731 515.5941 null] +>> endobj +5259 0 obj << +/D [5249 0 R /XYZ 71.731 484.0125 null] +>> endobj +5260 0 obj << +/D [5249 0 R /XYZ 181.5683 473.0022 null] +>> endobj +5261 0 obj << +/D [5249 0 R /XYZ 71.731 462.94 null] +>> endobj +5262 0 obj << +/D [5249 0 R /XYZ 71.731 429.5169 null] +>> endobj +5263 0 obj << +/D [5249 0 R /XYZ 71.731 418.407 null] +>> endobj +5264 0 obj << +/D [5249 0 R /XYZ 71.731 417.1617 null] +>> endobj +5265 0 obj << +/D [5249 0 R /XYZ 129.5143 398.0832 null] +>> endobj +5266 0 obj << +/D [5249 0 R /XYZ 129.5143 398.0832 null] +>> endobj +5267 0 obj << +/D [5249 0 R /XYZ 71.731 396.6436 null] +>> endobj +5268 0 obj << +/D [5249 0 R /XYZ 71.731 396.6436 null] +>> endobj +5269 0 obj << +/D [5249 0 R /XYZ 139.477 380.1504 null] +>> endobj +5270 0 obj << +/D [5249 0 R /XYZ 139.477 380.1504 null] +>> endobj +5271 0 obj << +/D [5249 0 R /XYZ 71.731 342.2924 null] +>> endobj +5272 0 obj << +/D [5249 0 R /XYZ 71.731 329.2414 null] +>> endobj +5273 0 obj << +/D [5249 0 R /XYZ 71.731 327.9961 null] +>> endobj +5274 0 obj << +/D [5249 0 R /XYZ 129.5143 308.9175 null] +>> endobj +5275 0 obj << +/D [5249 0 R /XYZ 71.731 308.818 null] +>> endobj +5276 0 obj << +/D [5249 0 R /XYZ 71.731 308.818 null] +>> endobj +5277 0 obj << +/D [5249 0 R /XYZ 139.477 290.9848 null] +>> endobj +5278 0 obj << +/D [5249 0 R /XYZ 139.477 290.9848 null] +>> endobj +5279 0 obj << +/D [5249 0 R /XYZ 71.731 288.828 null] +>> endobj +5280 0 obj << +/D [5249 0 R /XYZ 71.731 288.828 null] +>> endobj +5281 0 obj << +/D [5249 0 R /XYZ 149.4396 273.052 null] +>> endobj +5282 0 obj << +/D [5249 0 R /XYZ 76.7123 255.1193 null] +>> endobj +5283 0 obj << +/D [5249 0 R /XYZ 139.477 237.1865 null] +>> endobj +5284 0 obj << +/D [5249 0 R /XYZ 139.477 237.1865 null] +>> endobj +5285 0 obj << +/D [5249 0 R /XYZ 71.731 235.0297 null] +>> endobj +5286 0 obj << +/D [5249 0 R /XYZ 71.731 235.0297 null] +>> endobj +5287 0 obj << +/D [5249 0 R /XYZ 149.4396 219.2538 null] +>> endobj +5288 0 obj << +/D [5249 0 R /XYZ 76.7123 201.321 null] +>> endobj +5289 0 obj << +/D [5249 0 R /XYZ 139.477 183.3883 null] +>> endobj +5290 0 obj << +/D [5249 0 R /XYZ 139.477 183.3883 null] +>> endobj +5291 0 obj << +/D [5249 0 R /XYZ 71.731 181.2315 null] +>> endobj +5292 0 obj << +/D [5249 0 R /XYZ 71.731 181.2315 null] +>> endobj +5293 0 obj << +/D [5249 0 R /XYZ 149.4396 165.4555 null] +>> endobj +5294 0 obj << +/D [5249 0 R /XYZ 76.7123 147.5228 null] +>> endobj +5295 0 obj << +/D [5249 0 R /XYZ 139.477 129.59 null] +>> endobj +5296 0 obj << +/D [5249 0 R /XYZ 139.477 129.59 null] +>> endobj +5297 0 obj << +/D [5249 0 R /XYZ 71.731 127.4332 null] +>> endobj +5298 0 obj << +/D [5249 0 R /XYZ 71.731 127.4332 null] +>> endobj +5299 0 obj << +/D [5249 0 R /XYZ 149.4396 111.6573 null] +>> endobj +5248 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5302 0 obj << +/Length 897 +/Filter /FlateDecode +>> +stream +xÚµV]oœ8}ϯୠ¯¿?ú–mºÕVi4ªæm³Š˜ÁÉ ˆ€QÕß χTUó`<\ûœ{¸>×$Àð#"H1¨AT +lßnpð +¯¾Ü>$îcâiÐß뛿þa80ÈH*ƒõKÀŒDBñ@1Š´ :X§ÿ…ŸvÉ{c«(¦‡¹q•'…m’›Þ­þußl³+Ó:úýõæózÄL!£ä,IŽ5âR³ fð9óFØBxKƒ'،ÉP(DÚD!™1n k³y¢T³#.¦ÜÓ ÜãñÀcXµäÁt ATÉ;Ì ®ÔœÆc™ÚN¥Žôá g¦„6ê£5©ªäg$ExëæYݸ§òōy¹Mr÷X ;Ï3ì9( +£öË?ÅÓ(®Ç{”•øèJzQOË:¬òÒ8(E8Ѐ‚ó¨›j¿mLÆR`IBեš„+¬!ìrayp¯)¬cþšÒH7ÏMöf=¥Å1Íø¼´Òr¿Ém_WOXà{»‰(÷¯0!îïû¤I6ImÝìÅ6۝{œA® +Q":b1Á +i“XjD¤æ$xJgJ‡_l³Š­­?[؁b(Æ֊”tÉ­ª²)›Ÿïöã¸â G¿6¦ÔÐ8Ƙb²ov]vKÔxØdŠzoëm•½7YY\‹ûÝ6ûª¨{™vYÿô\>DB„ý¼^½öIÿWjŸ0¦…MÝ4+†=ú¶eѼÎW­>=?FL„wß>_›Ö]ž—áë{™Ûúb†.Á$}ˊÛCVǃ;µt-‡UDØÈÆaÏ΁“&ˆ +˜h¡N4„!*ž†έQ؝ÛÅn'Ï-¥ˆqB½¸§Ïí°jÉc~nÿ˜ñh«Ò×8Âd~fÇÝuÞv½-šl›´…:ÜWö¤!2Ɛ¢\\0ÄiØCÃ.¢÷ +C\ððâŒÆèân%u8'W|¡oV¼úzd}sÛ¹ƒYºq_w"à «½BÇ# ŸúÁ駚˜!òBOÃÎøv±À}¸W¸Ç¤5õ0ã1“µuåƒz›ˆPHiÆ:!)rè!lÙCZ©ÿt©çdb~Ï­#çÍÌ«î‹wolžÖ¿Óo¦®¿Çs¸iÎ^õ'1˛¾ |Řq§X‹“÷và/7]×endstream +endobj +5301 0 obj << +/Type /Page +/Contents 5302 0 R +/Resources 5300 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5303 0 obj << +/D [5301 0 R /XYZ 71.731 729.2652 null] +>> endobj +5304 0 obj << +/D [5301 0 R /XYZ 76.7123 708.3437 null] +>> endobj +5305 0 obj << +/D [5301 0 R /XYZ 139.477 690.4109 null] +>> endobj +5306 0 obj << +/D [5301 0 R /XYZ 139.477 690.4109 null] +>> endobj +5307 0 obj << +/D [5301 0 R /XYZ 71.731 688.2541 null] +>> endobj +5308 0 obj << +/D [5301 0 R /XYZ 71.731 688.2541 null] +>> endobj +5309 0 obj << +/D [5301 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5310 0 obj << +/D [5301 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5311 0 obj << +/D [5301 0 R /XYZ 139.477 636.6127 null] +>> endobj +5312 0 obj << +/D [5301 0 R /XYZ 139.477 636.6127 null] +>> endobj +810 0 obj << +/D [5301 0 R /XYZ 71.731 613.6986 null] +>> endobj +358 0 obj << +/D [5301 0 R /XYZ 227.1844 568.4443 null] +>> endobj +5313 0 obj << +/D [5301 0 R /XYZ 71.731 548.3039 null] +>> endobj +5314 0 obj << +/D [5301 0 R /XYZ 161.0655 535.5676 null] +>> endobj +5315 0 obj << +/D [5301 0 R /XYZ 71.731 523.4481 null] +>> endobj +5316 0 obj << +/D [5301 0 R /XYZ 71.731 492.4185 null] +>> endobj +5317 0 obj << +/D [5301 0 R /XYZ 168.8063 481.072 null] +>> endobj +5318 0 obj << +/D [5301 0 R /XYZ 71.731 468.9525 null] +>> endobj +5319 0 obj << +/D [5301 0 R /XYZ 71.731 437.5866 null] +>> endobj +5320 0 obj << +/D [5301 0 R /XYZ 181.5683 426.5763 null] +>> endobj +5321 0 obj << +/D [5301 0 R /XYZ 71.731 416.5141 null] +>> endobj +5322 0 obj << +/D [5301 0 R /XYZ 71.731 383.091 null] +>> endobj +5323 0 obj << +/D [5301 0 R /XYZ 71.731 371.9811 null] +>> endobj +5324 0 obj << +/D [5301 0 R /XYZ 71.731 370.7358 null] +>> endobj +5325 0 obj << +/D [5301 0 R /XYZ 129.5143 351.6573 null] +>> endobj +5326 0 obj << +/D [5301 0 R /XYZ 129.5143 351.6573 null] +>> endobj +5327 0 obj << +/D [5301 0 R /XYZ 71.731 350.2177 null] +>> endobj +5328 0 obj << +/D [5301 0 R /XYZ 71.731 350.2177 null] +>> endobj +5329 0 obj << +/D [5301 0 R /XYZ 139.477 333.7245 null] +>> endobj +5330 0 obj << +/D [5301 0 R /XYZ 139.477 333.7245 null] +>> endobj +5331 0 obj << +/D [5301 0 R /XYZ 71.731 295.8665 null] +>> endobj +5332 0 obj << +/D [5301 0 R /XYZ 71.731 282.8155 null] +>> endobj +5333 0 obj << +/D [5301 0 R /XYZ 71.731 281.5702 null] +>> endobj +5334 0 obj << +/D [5301 0 R /XYZ 129.5143 262.4916 null] +>> endobj +811 0 obj << +/D [5301 0 R /XYZ 71.731 255.3535 null] +>> endobj +362 0 obj << +/D [5301 0 R /XYZ 189.6208 212.256 null] +>> endobj +5335 0 obj << +/D [5301 0 R /XYZ 71.731 192.1156 null] +>> endobj +5336 0 obj << +/D [5301 0 R /XYZ 161.0655 179.3793 null] +>> endobj +5337 0 obj << +/D [5301 0 R /XYZ 71.731 167.2598 null] +>> endobj +5338 0 obj << +/D [5301 0 R /XYZ 71.731 135.8939 null] +>> endobj +5339 0 obj << +/D [5301 0 R /XYZ 168.8063 124.8837 null] +>> endobj +5300 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5342 0 obj << +/Length 1401 +/Filter /FlateDecode +>> +stream +xÚ½Y]oÛ6}ϯÐc Ô?E©oÙ°2ÀHݧu([i„*r Ë(òïw%Š2e]ŠJ‡}òÃŠEþ±H3¢\xJx¬x´{¾¢ÑWxt{ÅzȺǬ]Я۫_þ4JIó8Ú>F"‰Ò2҂“D±$Úîÿ¾þí){iòzµæŠ^sb®›2«òæ.{0?o6ÌÍ_yótØWÿlÿ¼ú};ÔWB“4"³$Ԕ&O£hƲ¥Éà©bRDš&DH¡;ž÷ysª«£á‘Uýµ®³Ws{x4×cSŸvMÛª&+ª¢új~ïsøYÚN§Æܾäy}ìÇþáÑþ­>ª/Ÿ)åå PÑ·=¾ä»¢}”ï-£ý1C±­ÖJ²¬#±ŠE7ÄbŸWéµî{9ÔN“î®Êžóã»ñÓÌ:Rˀš¦.Vœ^ŸšsUùêH`nŸ³f÷4hÖ<åæf¬Ä÷¢,ÍÝCÿ¼îÞP¾?눌р:Uórôª:á7ИH?z©s´€Ngµs"ÖýíºM„ŽÓnÊò°âêú»-p(óãû¡ùÙ©¶5‡²$íZgûç¢êÙW‡}¾´êfŘÞ.Hlª¹c B¡˜Ž”Ö„ %ш ¨µ ³ƒøiʺˆMzk)|æ\Mêrd­{y=ó°­¦; £1lqE(±.lN kƒÔ]¢ ÂÓÆ偻凎ZœÒöÿ^BÁtP3Á´¨p0‘ªK‚yIÃL—GL{®ºL&œæyÊÆZËN4“¡€º°°  ±º Lˆñ@L8âñ–3ì0¶7 eӅÍÉbaaYºKdAx`²¸<–¯¦¨R}”_³8Kåå€ +Æ«º –x,G<ºõòT—ÿs,Î"K6ç? û©»ÄÌ.Ù†Ÿîï.iö_peB§³yÌô¯âžÂ^Ç¢Z>Iìýb‹üD‹Â½endstream +endobj +5341 0 obj << +/Type /Page +/Contents 5342 0 R +/Resources 5340 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5343 0 obj << +/D [5341 0 R /XYZ 71.731 729.2652 null] +>> endobj +5344 0 obj << +/D [5341 0 R /XYZ 71.731 718.3063 null] +>> endobj +5345 0 obj << +/D [5341 0 R /XYZ 71.731 663.1647 null] +>> endobj +5346 0 obj << +/D [5341 0 R /XYZ 181.5683 652.1544 null] +>> endobj +5347 0 obj << +/D [5341 0 R /XYZ 71.731 642.0922 null] +>> endobj +5348 0 obj << +/D [5341 0 R /XYZ 71.731 609.3146 null] +>> endobj +5349 0 obj << +/D [5341 0 R /XYZ 71.731 597.5592 null] +>> endobj +5350 0 obj << +/D [5341 0 R /XYZ 71.731 596.3139 null] +>> endobj +5351 0 obj << +/D [5341 0 R /XYZ 129.5143 577.2354 null] +>> endobj +5352 0 obj << +/D [5341 0 R /XYZ 129.5143 577.2354 null] +>> endobj +5353 0 obj << +/D [5341 0 R /XYZ 71.731 575.7958 null] +>> endobj +5354 0 obj << +/D [5341 0 R /XYZ 71.731 575.7958 null] +>> endobj +5355 0 obj << +/D [5341 0 R /XYZ 139.477 559.3026 null] +>> endobj +5356 0 obj << +/D [5341 0 R /XYZ 139.477 559.3026 null] +>> endobj +5357 0 obj << +/D [5341 0 R /XYZ 76.7123 541.3699 null] +>> endobj +5358 0 obj << +/D [5341 0 R /XYZ 129.5143 523.4371 null] +>> endobj +5359 0 obj << +/D [5341 0 R /XYZ 129.5143 523.4371 null] +>> endobj +5360 0 obj << +/D [5341 0 R /XYZ 71.731 521.2803 null] +>> endobj +5361 0 obj << +/D [5341 0 R /XYZ 71.731 521.2803 null] +>> endobj +5362 0 obj << +/D [5341 0 R /XYZ 139.477 505.5044 null] +>> endobj +5363 0 obj << +/D [5341 0 R /XYZ 71.731 503.3475 null] +>> endobj +5364 0 obj << +/D [5341 0 R /XYZ 71.731 503.3475 null] +>> endobj +5365 0 obj << +/D [5341 0 R /XYZ 149.4396 487.5716 null] +>> endobj +5366 0 obj << +/D [5341 0 R /XYZ 71.731 486.1321 null] +>> endobj +5367 0 obj << +/D [5341 0 R /XYZ 149.4396 469.6388 null] +>> endobj +5368 0 obj << +/D [5341 0 R /XYZ 76.7123 451.7061 null] +>> endobj +5369 0 obj << +/D [5341 0 R /XYZ 139.477 433.7733 null] +>> endobj +5370 0 obj << +/D [5341 0 R /XYZ 71.731 432.3338 null] +>> endobj +5371 0 obj << +/D [5341 0 R /XYZ 71.731 432.3338 null] +>> endobj +5372 0 obj << +/D [5341 0 R /XYZ 149.4396 415.8406 null] +>> endobj +5373 0 obj << +/D [5341 0 R /XYZ 149.4396 415.8406 null] +>> endobj +5374 0 obj << +/D [5341 0 R /XYZ 71.731 413.6838 null] +>> endobj +5375 0 obj << +/D [5341 0 R /XYZ 71.731 413.6838 null] +>> endobj +5376 0 obj << +/D [5341 0 R /XYZ 159.4023 397.9078 null] +>> endobj +5377 0 obj << +/D [5341 0 R /XYZ 71.731 395.751 null] +>> endobj +5378 0 obj << +/D [5341 0 R /XYZ 159.4023 379.9751 null] +>> endobj +5379 0 obj << +/D [5341 0 R /XYZ 76.7123 362.0423 null] +>> endobj +5380 0 obj << +/D [5341 0 R /XYZ 149.4396 344.1096 null] +>> endobj +5381 0 obj << +/D [5341 0 R /XYZ 149.4396 344.1096 null] +>> endobj +5382 0 obj << +/D [5341 0 R /XYZ 71.731 341.9528 null] +>> endobj +5383 0 obj << +/D [5341 0 R /XYZ 71.731 341.9528 null] +>> endobj +5384 0 obj << +/D [5341 0 R /XYZ 159.4023 326.1768 null] +>> endobj +5385 0 obj << +/D [5341 0 R /XYZ 71.731 324.02 null] +>> endobj +5386 0 obj << +/D [5341 0 R /XYZ 159.4023 308.2441 null] +>> endobj +5387 0 obj << +/D [5341 0 R /XYZ 76.7123 290.3113 null] +>> endobj +5388 0 obj << +/D [5341 0 R /XYZ 149.4396 272.3786 null] +>> endobj +5389 0 obj << +/D [5341 0 R /XYZ 149.4396 272.3786 null] +>> endobj +5390 0 obj << +/D [5341 0 R /XYZ 71.731 270.2217 null] +>> endobj +5391 0 obj << +/D [5341 0 R /XYZ 71.731 270.2217 null] +>> endobj +5392 0 obj << +/D [5341 0 R /XYZ 159.4023 254.4458 null] +>> endobj +5393 0 obj << +/D [5341 0 R /XYZ 71.731 253.0063 null] +>> endobj +5394 0 obj << +/D [5341 0 R /XYZ 159.4023 236.5131 null] +>> endobj +5395 0 obj << +/D [5341 0 R /XYZ 76.7123 218.5803 null] +>> endobj +5396 0 obj << +/D [5341 0 R /XYZ 149.4396 200.6476 null] +>> endobj +5397 0 obj << +/D [5341 0 R /XYZ 149.4396 200.6476 null] +>> endobj +5398 0 obj << +/D [5341 0 R /XYZ 71.731 198.4907 null] +>> endobj +5399 0 obj << +/D [5341 0 R /XYZ 71.731 198.4907 null] +>> endobj +5400 0 obj << +/D [5341 0 R /XYZ 159.4023 182.7148 null] +>> endobj +5401 0 obj << +/D [5341 0 R /XYZ 71.731 180.558 null] +>> endobj +5402 0 obj << +/D [5341 0 R /XYZ 159.4023 164.7821 null] +>> endobj +5403 0 obj << +/D [5341 0 R /XYZ 76.7123 146.8493 null] +>> endobj +5404 0 obj << +/D [5341 0 R /XYZ 149.4396 128.9166 null] +>> endobj +5405 0 obj << +/D [5341 0 R /XYZ 149.4396 128.9166 null] +>> endobj +5406 0 obj << +/D [5341 0 R /XYZ 71.731 126.7597 null] +>> endobj +5407 0 obj << +/D [5341 0 R /XYZ 71.731 126.7597 null] +>> endobj +5408 0 obj << +/D [5341 0 R /XYZ 159.4023 110.9838 null] +>> endobj +5409 0 obj << +/D [5341 0 R /XYZ 71.731 108.827 null] +>> endobj +5340 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5413 0 obj << +/Length 1150 +/Filter /FlateDecode +>> +stream +xÚ½™Koã6…÷ùZÚ@Íò)’³›mÐ"‚wÕ)­Œ…É؁,·È¿ï•%ʔtI*è ÈB~ñ}¼”b–Qøc™fD 8pKx®x¶ývC³/ðÕí ë$«N³òE?­o~üUÐÌ›ó<[?fÂæDi™iÁ‰QÌdëÝ_‹Ÿ÷›çº¨–+®è‚“öxÿ´9õÝæsûöýýoí‹?Šzܝ–¯¿ùeÝ×WBk HÔ¤0†()²§Är¦P“–H0 +s¡†)t?n3MX3O˜K¯ëeÍd>q®Ææ˜bÄ*Ê3@Ww|¼úpg¡>®™2>(C›ªÚ¼´‘Ûã©®Ê׺| —xíŸî&Ι%J1å"'9ãOÌ©V¾ìš˜Õ´Ml2Z01Îa*Œ£uɹ³¦>„É $–Ë‹`D1à`à£*êsuxx,‹§–¯QΚɍ€Rú]›Ys®]¬w婦þ‰R~ñò®>¶Ç¶ØtÚÎ3$×Öâq;Õʗ!€NF Æ Ë‘riѺá¸ÝY¨P€j=´ÑÂ؁@ËÌGQb¨•Á‡KB§wA$•ÔDJÍHú²’½,‰$Vw’˜/#w­>ðE|ÞÖAp”{ǗEÀéeIp°º3À™ø®ÓœÃqW<”è +•Š€”¿v…6#vËóñØ5Å÷åvß-Ù}Ù}ûÜ÷L÷Éæ »QU֛º\rµøgÉÔ¢˜†ÔMƒ1¢ ËñkӉV¾ +¹4㱂WFÂîatŽV _wjÃÃÕí}å! ¦ÔŠèÐÜ{.=UK§JR‰åØʤïákñ"’ˆJ¾–ȯKF#€éå-À”Jm„ˆƒé«Â`öª$˜XÕ`b60>¢`r™i“"ӓÅÐt²4›HÝ9pŽ}àtú6ž‹êt<U9áƘ×z>Á o&pÝU‚Ì«(f'Js9-9Ë©ŒJÏD J‘·&*¥/‹@Ù˒Pbug@9ñB9°ÑpqØ|+ænぇ7ž"ÜO2“§–¶/‹¥èd鑺sRûÀSôm4)>œ«§ÿ™bô°Ÿ?åJ¦Â¼ªbYvªt”Ó¢s’™Àƒô<œžÊmè®ò¶Ô¾¶A^F|‹)˜$‚³Äæí«Â=²W%›$VuF—Äl mrà#Ö'¹6D*•Zá¾,Be/Kb‰ÕÁåÄ +æÀÜ["LÂS«ÐRÌZÜ·÷·hçÏåä3nN¡…¤%=U,ÚN•NvZtN°#x®ž‡íf[T5’¬Dç€àœd?~¼›&ی[6ÿôÙnêðÖÄ%'ÊÒd¸ž,–®“¥ãEêÎÉwìØ·q*ëïüœÞŒø•sIr¥7¾*ÜQ{U²£bUgtTÌÒQ>b•C´å .=UK§JR‰åØʤïár·TîðçtEõh“‡˜&K¾Ü‡vyÃ'£ét?HC ËmôWO3ý‘Dq × +v?§j<üÉ)øù –endstream +endobj +5412 0 obj << +/Type /Page +/Contents 5413 0 R +/Resources 5411 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5414 0 obj << +/D [5412 0 R /XYZ 71.731 729.2652 null] +>> endobj +5415 0 obj << +/D [5412 0 R /XYZ 71.731 741.2204 null] +>> endobj +5416 0 obj << +/D [5412 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5417 0 obj << +/D [5412 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5418 0 obj << +/D [5412 0 R /XYZ 129.5143 636.6127 null] +>> endobj +5419 0 obj << +/D [5412 0 R /XYZ 129.5143 636.6127 null] +>> endobj +5420 0 obj << +/D [5412 0 R /XYZ 71.731 634.4559 null] +>> endobj +5421 0 obj << +/D [5412 0 R /XYZ 71.731 634.4559 null] +>> endobj +5422 0 obj << +/D [5412 0 R /XYZ 139.477 618.6799 null] +>> endobj +5423 0 obj << +/D [5412 0 R /XYZ 71.731 580.8219 null] +>> endobj +5424 0 obj << +/D [5412 0 R /XYZ 71.731 567.7709 null] +>> endobj +5425 0 obj << +/D [5412 0 R /XYZ 71.731 566.5256 null] +>> endobj +5426 0 obj << +/D [5412 0 R /XYZ 129.5143 547.4471 null] +>> endobj +5427 0 obj << +/D [5412 0 R /XYZ 71.731 545.2902 null] +>> endobj +5428 0 obj << +/D [5412 0 R /XYZ 71.731 545.2902 null] +>> endobj +5429 0 obj << +/D [5412 0 R /XYZ 139.477 529.5143 null] +>> endobj +5430 0 obj << +/D [5412 0 R /XYZ 139.477 529.5143 null] +>> endobj +5431 0 obj << +/D [5412 0 R /XYZ 71.731 527.3575 null] +>> endobj +5432 0 obj << +/D [5412 0 R /XYZ 71.731 527.3575 null] +>> endobj +5433 0 obj << +/D [5412 0 R /XYZ 149.4396 511.5816 null] +>> endobj +5434 0 obj << +/D [5412 0 R /XYZ 76.7123 493.6488 null] +>> endobj +5435 0 obj << +/D [5412 0 R /XYZ 139.477 475.716 null] +>> endobj +5436 0 obj << +/D [5412 0 R /XYZ 139.477 475.716 null] +>> endobj +5437 0 obj << +/D [5412 0 R /XYZ 71.731 473.5592 null] +>> endobj +5438 0 obj << +/D [5412 0 R /XYZ 71.731 473.5592 null] +>> endobj +5439 0 obj << +/D [5412 0 R /XYZ 149.4396 457.7833 null] +>> endobj +5440 0 obj << +/D [5412 0 R /XYZ 76.7123 439.8505 null] +>> endobj +5441 0 obj << +/D [5412 0 R /XYZ 139.477 421.9178 null] +>> endobj +5442 0 obj << +/D [5412 0 R /XYZ 139.477 421.9178 null] +>> endobj +5443 0 obj << +/D [5412 0 R /XYZ 71.731 419.761 null] +>> endobj +5444 0 obj << +/D [5412 0 R /XYZ 71.731 419.761 null] +>> endobj +5445 0 obj << +/D [5412 0 R /XYZ 149.4396 403.985 null] +>> endobj +5446 0 obj << +/D [5412 0 R /XYZ 76.7123 386.0523 null] +>> endobj +5447 0 obj << +/D [5412 0 R /XYZ 139.477 368.1195 null] +>> endobj +5448 0 obj << +/D [5412 0 R /XYZ 139.477 368.1195 null] +>> endobj +5449 0 obj << +/D [5412 0 R /XYZ 71.731 365.9627 null] +>> endobj +5450 0 obj << +/D [5412 0 R /XYZ 139.477 350.1868 null] +>> endobj +5451 0 obj << +/D [5412 0 R /XYZ 139.477 350.1868 null] +>> endobj +5452 0 obj << +/D [5412 0 R /XYZ 71.731 348.03 null] +>> endobj +5453 0 obj << +/D [5412 0 R /XYZ 139.477 332.254 null] +>> endobj +5454 0 obj << +/D [5412 0 R /XYZ 139.477 332.254 null] +>> endobj +5455 0 obj << +/D [5412 0 R /XYZ 71.731 330.0972 null] +>> endobj +5456 0 obj << +/D [5412 0 R /XYZ 71.731 330.0972 null] +>> endobj +5457 0 obj << +/D [5412 0 R /XYZ 149.4396 314.3213 null] +>> endobj +5458 0 obj << +/D [5412 0 R /XYZ 76.7123 296.3885 null] +>> endobj +5459 0 obj << +/D [5412 0 R /XYZ 139.477 278.4558 null] +>> endobj +5460 0 obj << +/D [5412 0 R /XYZ 139.477 278.4558 null] +>> endobj +5461 0 obj << +/D [5412 0 R /XYZ 71.731 276.2989 null] +>> endobj +5462 0 obj << +/D [5412 0 R /XYZ 139.477 260.523 null] +>> endobj +5463 0 obj << +/D [5412 0 R /XYZ 139.477 260.523 null] +>> endobj +5464 0 obj << +/D [5412 0 R /XYZ 71.731 258.3662 null] +>> endobj +5465 0 obj << +/D [5412 0 R /XYZ 139.477 242.5903 null] +>> endobj +5466 0 obj << +/D [5412 0 R /XYZ 139.477 242.5903 null] +>> endobj +5467 0 obj << +/D [5412 0 R /XYZ 71.731 240.4334 null] +>> endobj +5468 0 obj << +/D [5412 0 R /XYZ 71.731 240.4334 null] +>> endobj +5469 0 obj << +/D [5412 0 R /XYZ 149.4396 224.6575 null] +>> endobj +5470 0 obj << +/D [5412 0 R /XYZ 76.7123 206.7248 null] +>> endobj +5471 0 obj << +/D [5412 0 R /XYZ 139.477 188.792 null] +>> endobj +5472 0 obj << +/D [5412 0 R /XYZ 139.477 188.792 null] +>> endobj +812 0 obj << +/D [5412 0 R /XYZ 71.731 165.8779 null] +>> endobj +5411 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5475 0 obj << +/Length 1376 +/Filter /FlateDecode +>> +stream +xÚµY]o£8}ï¯à1‘/6üuö£šÕ®Ívž¶« nƒD gGý÷{  \>V£Q áØ÷Üãs}MCþ¨#(\XDXÀ™sºÜ¹Î0Idåê 2W8«šIŽe¡ +õ~•º!Œê¨íØ£$ aTСdY‡¨óv¹ßÔù¾ùx­Ÿ}}v]–i }w×>)¥º•Í™%Œ£Ƀ‰i“üEV§2½ª´È—hz°–kh~®£µã¼½–eüÞܯ͵Råí¤ZÜ©ÈUœæiþÖ|N$|ÌÌ$/ÅM5·· +²l}ñéO¼þ2mÇVWyJëÌÃ("(êh:k°ÌÂJðÀ«SL™«fÖ²¥(û!y|‘ÕýðûØN‰Ò€”*ӗ=ƒïT?Cž½[É7·—XÎZê,%l ¾¥YÖܽHÛ 2éD²ÙeVÏ ¿ŽÆDôÁr.Ñ2tx"¨é|é³îÖNÉÓ¹Sâ}̦+S¹g|÷¯.J¹l)`}©dÖ@·ŽŸÆÓϤ={Dî°]‚ýð´]Ä*U«‡ä’æc-ò"‘ßG66ëŸNÅ-WÙº=ëNï3Fb…žÍW*ÌFÍ©C­ ‹ºÁHÃßiÀã%-žBOð³ÊdÇ_2±-«‹î{Ä ÙLiÔÁ†!’Nf›Õ”ƒ:ÎeXÜyMÍ(”‡¥.ó†<Åù1-ÞÊøzÞóÝû¼(ŒÊ×$é@K‚4 u9&·ˆ1a€IÑ3˜uÇmÚª7ÂB¥mÔ|v¨Õ +Ä¢n¨À ¼<^Ó²R_õ?0ðC- áÝí"”xúºì:¶à»¶ê<,îïa<÷ x Ìö˜ö/çíá߈ŽëÃ=x£‹ÖäéQKê´¨uq¦A·h3%Ic‘X«Ì­b™Â¢^i¼µ"µP EjPëEŠDÝR¤c3EjóÈâ…uIäF?¤YF ô±—=h¡> endobj +5476 0 obj << +/D [5474 0 R /XYZ 71.731 729.2652 null] +>> endobj +366 0 obj << +/D [5474 0 R /XYZ 210.6581 705.7477 null] +>> endobj +5477 0 obj << +/D [5474 0 R /XYZ 71.731 685.6073 null] +>> endobj +5478 0 obj << +/D [5474 0 R /XYZ 161.0655 672.871 null] +>> endobj +5479 0 obj << +/D [5474 0 R /XYZ 71.731 660.7515 null] +>> endobj +5480 0 obj << +/D [5474 0 R /XYZ 71.731 551.5774 null] +>> endobj +5481 0 obj << +/D [5474 0 R /XYZ 71.731 508.3396 null] +>> endobj +5482 0 obj << +/D [5474 0 R /XYZ 181.5683 497.3293 null] +>> endobj +5483 0 obj << +/D [5474 0 R /XYZ 71.731 487.2671 null] +>> endobj +5484 0 obj << +/D [5474 0 R /XYZ 71.731 453.8439 null] +>> endobj +5485 0 obj << +/D [5474 0 R /XYZ 71.731 442.7341 null] +>> endobj +5486 0 obj << +/D [5474 0 R /XYZ 71.731 441.4888 null] +>> endobj +5487 0 obj << +/D [5474 0 R /XYZ 129.5143 422.4102 null] +>> endobj +5488 0 obj << +/D [5474 0 R /XYZ 129.5143 422.4102 null] +>> endobj +5489 0 obj << +/D [5474 0 R /XYZ 71.731 420.9707 null] +>> endobj +5490 0 obj << +/D [5474 0 R /XYZ 71.731 420.9707 null] +>> endobj +5491 0 obj << +/D [5474 0 R /XYZ 139.477 404.4775 null] +>> endobj +5492 0 obj << +/D [5474 0 R /XYZ 139.477 404.4775 null] +>> endobj +5493 0 obj << +/D [5474 0 R /XYZ 76.7123 386.5447 null] +>> endobj +5494 0 obj << +/D [5474 0 R /XYZ 129.5143 368.612 null] +>> endobj +5495 0 obj << +/D [5474 0 R /XYZ 129.5143 368.612 null] +>> endobj +5496 0 obj << +/D [5474 0 R /XYZ 71.731 366.4552 null] +>> endobj +5497 0 obj << +/D [5474 0 R /XYZ 71.731 366.4552 null] +>> endobj +5498 0 obj << +/D [5474 0 R /XYZ 139.477 350.6792 null] +>> endobj +5499 0 obj << +/D [5474 0 R /XYZ 71.731 348.5224 null] +>> endobj +5500 0 obj << +/D [5474 0 R /XYZ 71.731 348.5224 null] +>> endobj +5501 0 obj << +/D [5474 0 R /XYZ 149.4396 332.7465 null] +>> endobj +5502 0 obj << +/D [5474 0 R /XYZ 71.731 331.3069 null] +>> endobj +5503 0 obj << +/D [5474 0 R /XYZ 149.4396 314.8137 null] +>> endobj +5504 0 obj << +/D [5474 0 R /XYZ 76.7123 296.881 null] +>> endobj +5505 0 obj << +/D [5474 0 R /XYZ 139.477 278.9482 null] +>> endobj +5506 0 obj << +/D [5474 0 R /XYZ 71.731 277.5087 null] +>> endobj +5507 0 obj << +/D [5474 0 R /XYZ 71.731 277.5087 null] +>> endobj +5508 0 obj << +/D [5474 0 R /XYZ 149.4396 261.0155 null] +>> endobj +5509 0 obj << +/D [5474 0 R /XYZ 149.4396 261.0155 null] +>> endobj +5510 0 obj << +/D [5474 0 R /XYZ 71.731 258.8586 null] +>> endobj +5511 0 obj << +/D [5474 0 R /XYZ 71.731 258.8586 null] +>> endobj +5512 0 obj << +/D [5474 0 R /XYZ 159.4023 243.0827 null] +>> endobj +5513 0 obj << +/D [5474 0 R /XYZ 71.731 240.9259 null] +>> endobj +5514 0 obj << +/D [5474 0 R /XYZ 159.4023 225.15 null] +>> endobj +5515 0 obj << +/D [5474 0 R /XYZ 76.7123 207.2172 null] +>> endobj +5516 0 obj << +/D [5474 0 R /XYZ 149.4396 189.2845 null] +>> endobj +5517 0 obj << +/D [5474 0 R /XYZ 149.4396 189.2845 null] +>> endobj +5518 0 obj << +/D [5474 0 R /XYZ 71.731 187.1276 null] +>> endobj +5519 0 obj << +/D [5474 0 R /XYZ 71.731 187.1276 null] +>> endobj +5520 0 obj << +/D [5474 0 R /XYZ 159.4023 171.3517 null] +>> endobj +5521 0 obj << +/D [5474 0 R /XYZ 71.731 169.1949 null] +>> endobj +5522 0 obj << +/D [5474 0 R /XYZ 159.4023 153.419 null] +>> endobj +5523 0 obj << +/D [5474 0 R /XYZ 76.7123 135.4862 null] +>> endobj +5524 0 obj << +/D [5474 0 R /XYZ 149.4396 117.5535 null] +>> endobj +5525 0 obj << +/D [5474 0 R /XYZ 149.4396 117.5535 null] +>> endobj +5526 0 obj << +/D [5474 0 R /XYZ 71.731 115.3966 null] +>> endobj +5527 0 obj << +/D [5474 0 R /XYZ 71.731 115.3966 null] +>> endobj +5528 0 obj << +/D [5474 0 R /XYZ 159.4023 99.6207 null] +>> endobj +5529 0 obj << +/D [5474 0 R /XYZ 71.731 97.4639 null] +>> endobj +5473 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5532 0 obj << +/Length 1338 +/Filter /FlateDecode +>> +stream +xÚ½š]oÛ6…ïó+t ÇO‘Ü]÷Ñ}`ŠÎwM(1“udC–7äߏªD…²_ñå†dÙî±Þ££ó”’kVPÿà +͈~Ã-á¥âÅÝÓ-ü_ý|ÁFÉÕ¨¹ŠE߯/¾}/ha‰-yY¬ï aK¢´,´àÄ(fŠõæÓåÕ¾síêŠ+zÉÉ°ý°­×ý^ÝOß}øuxð‡ëw›Ãêóú·‹ŸÖÓ|%4±ÆIšÆ%EqÅ)±œ)PĤ%ÒõÇB RèéX¸-4aýqúc™t“¬?˜kÎÕ©9¦±Šò"Þa˜{º}ñÞúxɔ)ïƒr1÷Qµmõà2½jšHJ‰–ƒ;R%à*n`jܧ6àŽ}tu·uÕ~mƚ9ÕÃ?‹(Ø£l© ÊøIŒíX–(è$C +ÍÍ((ä(èÌÇlýX¯„º 1ɔ’Ã0dcY*‘ Ãææ$ø€‰}`‹ìrH#=Ê7’²!1V-“8©P¡©$žÙ€Iœù8¶[€CfH)({#Ô”ÃH–j]á­ææ´ðµ.ö1«Ø/»° +쫇e¥„)ŠÁ˱L24hnF, –™ F$©‘"©4áF!Dƪe"'J$45ƒÈ30‘3¹¶¾¯ïª®Þ57_Ü3€§ñË$ãoA§ÿE„❱,Uà ÃkÌÍ©!àªaìcÖ¹îàºPºÃáïëÓ/à¾ôÏ܊©ËçåÀ8#’Y”ÛH– +,ÈðÀ€¹9> Àb·ÿ9ÑBaQJ"DǪe¢'J445ƒè30Ñ3®©n·à]¬¤DѓËÝÛÝnëª%9薚)ü-rɆr,K4s’¡Í„æf4ò4sæcŒ ¬ÕaLƹ1¾(y8#ÿ 4£7–¥2 +2<#`nNF€(£ØÇrsþ}l2&ˆáþàÓÀFª°A… LÍöÔÆ°±ýã®ùŸoO¹UÄXŠÑËMœdh¡¹M„|Mœù8¹óÒ¾g[7Dýõ¥æøtëÚ儴öÃý)EŠd©„‚ O˜›“àJ(öß®æ†6ÒÅ%'Ôr„ÔXµLê¤BI…¦fzf&uæcï\{³wíÁ_+×Ð +« ae©_÷sbÎ¥¿­±(¬‘,UŠëÌÍ©"àªbìãå“Í÷ýÅÛ®uõø:áÿ‚êkºúšR^©Â… K‘LKÂy‰’ÉRñ07'>À_ì#ùYñë%:¢É4%¢dæ±jóI…bMÍÀüÌŒùÌÇ×ûŠþž¸„ö+ŒÑo²&3ʼnäÃ<–%z:ÉОBs3z +ùz:ó1[^ÞÝÝíŽÍâ­\=¶õ®}Þw×TQÿ‡ /ÝïÚ§å…$Ò* ÷X–Š1Èð¹91> cØÂýÊɎ¨ÚñSÚ$õ‘hú B™Ff ê&>6‘ZÒý™â¥ßík,éã·"¤!†•6ùʼnHsþ½ Å ¡ÌÚiO½5c¿ ü¢ôXÕendstream +endobj +5531 0 obj << +/Type /Page +/Contents 5532 0 R +/Resources 5530 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5533 0 obj << +/D [5531 0 R /XYZ 71.731 729.2652 null] +>> endobj +5534 0 obj << +/D [5531 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5535 0 obj << +/D [5531 0 R /XYZ 76.7123 690.4109 null] +>> endobj +5536 0 obj << +/D [5531 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5537 0 obj << +/D [5531 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5538 0 obj << +/D [5531 0 R /XYZ 71.731 670.3214 null] +>> endobj +5539 0 obj << +/D [5531 0 R /XYZ 71.731 670.3214 null] +>> endobj +5540 0 obj << +/D [5531 0 R /XYZ 159.4023 654.5454 null] +>> endobj +5541 0 obj << +/D [5531 0 R /XYZ 71.731 652.3886 null] +>> endobj +5542 0 obj << +/D [5531 0 R /XYZ 159.4023 636.6127 null] +>> endobj +5543 0 obj << +/D [5531 0 R /XYZ 76.7123 618.6799 null] +>> endobj +5544 0 obj << +/D [5531 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5545 0 obj << +/D [5531 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5546 0 obj << +/D [5531 0 R /XYZ 71.731 598.5904 null] +>> endobj +5547 0 obj << +/D [5531 0 R /XYZ 71.731 598.5904 null] +>> endobj +5548 0 obj << +/D [5531 0 R /XYZ 159.4023 582.8144 null] +>> endobj +5549 0 obj << +/D [5531 0 R /XYZ 71.731 580.6576 null] +>> endobj +5550 0 obj << +/D [5531 0 R /XYZ 159.4023 564.8817 null] +>> endobj +5551 0 obj << +/D [5531 0 R /XYZ 76.7123 546.9489 null] +>> endobj +5552 0 obj << +/D [5531 0 R /XYZ 149.4396 529.0162 null] +>> endobj +5553 0 obj << +/D [5531 0 R /XYZ 149.4396 529.0162 null] +>> endobj +5554 0 obj << +/D [5531 0 R /XYZ 71.731 526.8593 null] +>> endobj +5555 0 obj << +/D [5531 0 R /XYZ 71.731 526.8593 null] +>> endobj +5556 0 obj << +/D [5531 0 R /XYZ 159.4023 511.0834 null] +>> endobj +5557 0 obj << +/D [5531 0 R /XYZ 71.731 508.9266 null] +>> endobj +5558 0 obj << +/D [5531 0 R /XYZ 159.4023 493.1507 null] +>> endobj +5559 0 obj << +/D [5531 0 R /XYZ 76.7123 475.2179 null] +>> endobj +5560 0 obj << +/D [5531 0 R /XYZ 149.4396 457.2852 null] +>> endobj +5561 0 obj << +/D [5531 0 R /XYZ 149.4396 457.2852 null] +>> endobj +5562 0 obj << +/D [5531 0 R /XYZ 71.731 455.1283 null] +>> endobj +5563 0 obj << +/D [5531 0 R /XYZ 71.731 455.1283 null] +>> endobj +5564 0 obj << +/D [5531 0 R /XYZ 159.4023 439.3524 null] +>> endobj +5565 0 obj << +/D [5531 0 R /XYZ 71.731 437.1956 null] +>> endobj +5566 0 obj << +/D [5531 0 R /XYZ 159.4023 421.4197 null] +>> endobj +5567 0 obj << +/D [5531 0 R /XYZ 76.7123 403.4869 null] +>> endobj +5568 0 obj << +/D [5531 0 R /XYZ 149.4396 385.5542 null] +>> endobj +5569 0 obj << +/D [5531 0 R /XYZ 149.4396 385.5542 null] +>> endobj +5570 0 obj << +/D [5531 0 R /XYZ 71.731 383.3973 null] +>> endobj +5571 0 obj << +/D [5531 0 R /XYZ 71.731 383.3973 null] +>> endobj +5572 0 obj << +/D [5531 0 R /XYZ 159.4023 367.6214 null] +>> endobj +5573 0 obj << +/D [5531 0 R /XYZ 71.731 366.1819 null] +>> endobj +5574 0 obj << +/D [5531 0 R /XYZ 159.4023 349.6887 null] +>> endobj +5575 0 obj << +/D [5531 0 R /XYZ 76.7123 331.7559 null] +>> endobj +5576 0 obj << +/D [5531 0 R /XYZ 149.4396 313.8231 null] +>> endobj +5577 0 obj << +/D [5531 0 R /XYZ 149.4396 313.8231 null] +>> endobj +5578 0 obj << +/D [5531 0 R /XYZ 71.731 311.6663 null] +>> endobj +5579 0 obj << +/D [5531 0 R /XYZ 71.731 311.6663 null] +>> endobj +5580 0 obj << +/D [5531 0 R /XYZ 159.4023 295.8904 null] +>> endobj +5581 0 obj << +/D [5531 0 R /XYZ 71.731 293.7336 null] +>> endobj +5582 0 obj << +/D [5531 0 R /XYZ 159.4023 277.9576 null] +>> endobj +5583 0 obj << +/D [5531 0 R /XYZ 76.7123 260.0249 null] +>> endobj +5584 0 obj << +/D [5531 0 R /XYZ 149.4396 242.0921 null] +>> endobj +5585 0 obj << +/D [5531 0 R /XYZ 149.4396 242.0921 null] +>> endobj +5586 0 obj << +/D [5531 0 R /XYZ 71.731 239.9353 null] +>> endobj +5587 0 obj << +/D [5531 0 R /XYZ 71.731 239.9353 null] +>> endobj +5588 0 obj << +/D [5531 0 R /XYZ 159.4023 224.1594 null] +>> endobj +5589 0 obj << +/D [5531 0 R /XYZ 71.731 222.0026 null] +>> endobj +5590 0 obj << +/D [5531 0 R /XYZ 159.4023 206.2266 null] +>> endobj +5591 0 obj << +/D [5531 0 R /XYZ 76.7123 188.2939 null] +>> endobj +5592 0 obj << +/D [5531 0 R /XYZ 149.4396 170.3611 null] +>> endobj +5593 0 obj << +/D [5531 0 R /XYZ 149.4396 170.3611 null] +>> endobj +5594 0 obj << +/D [5531 0 R /XYZ 71.731 168.2043 null] +>> endobj +5595 0 obj << +/D [5531 0 R /XYZ 71.731 168.2043 null] +>> endobj +5596 0 obj << +/D [5531 0 R /XYZ 159.4023 152.4284 null] +>> endobj +5597 0 obj << +/D [5531 0 R /XYZ 71.731 150.2715 null] +>> endobj +5598 0 obj << +/D [5531 0 R /XYZ 159.4023 134.4956 null] +>> endobj +5599 0 obj << +/D [5531 0 R /XYZ 76.7123 116.5629 null] +>> endobj +5600 0 obj << +/D [5531 0 R /XYZ 149.4396 98.6301 null] +>> endobj +5601 0 obj << +/D [5531 0 R /XYZ 149.4396 98.6301 null] +>> endobj +5602 0 obj << +/D [5531 0 R /XYZ 71.731 96.4733 null] +>> endobj +5603 0 obj << +/D [5531 0 R /XYZ 71.731 96.4733 null] +>> endobj +5530 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5606 0 obj << +/Length 1397 +/Filter /FlateDecode +>> +stream +xÚµ™Koã6…÷ùZÆ@Íò)’³ëô1h1‚Ö]u +C±•X¨c²2ÓþûR)Sòå#mŠ,l+GºGŸÎåÃ&6¤If^¨F´´Ø<ÝàâÑüëà ±’¥Õ,}ÑûÕÍ×?0\h¤KZ«‡‚é É É(R‚¨bµýýöÛ]õÜÕíbI¾¥hx½ÛW‡ºûXÝ¿¹ûqxósÝíŽÛÓâÕO7߯Æú‚I¤•)5ɔB‚³bI1ҔPD¸FÜ5÷‚bœÉñ^¨.$"ý}š{u£¬¿™O”Š¹9"ÒÓ¿ «;½øpg>.L‰0>0eSÍ¡ûj öÛɱm¶õ¡k>aL͑¹Gw7¥Æˆ¬l|Y„Í(K²êf°|l&>ª¶­þ,š×âbæÂR¥à&Q‚ô¬hé«XókYqs×J–`Õ0+wÖµ ¦ +eX•|úÌ|Ûª«×›¶6/ÛÞÏ p) _Ù×êÅïF˜–®% G•¨$T¦"èÉbt²tº9|@ô}\òö!k)¶Ã›®y²‡¾ìêƒýçfs|q\¿,ˆ9r>x¦I*¥N6´'‹Ñt²4M nMÀDÓ÷mèÿ °m[¡Ì\FxbðUá!`T%‡¨jÆpe&>žëº]7P÷sŒVoÛü¢äH)’j~_‰ë(Kƪ›WÈ׉K6ïj7ÙtGÈf³³‡vMàË8'Ý×ûãáñ¦ÇK¤¹J5»/‹Ñs²4= n=ÀDÏ÷mö7ê’„K5·§Š4·S¥›¨šÓÜsæö}|®Ûæ¡ÙT]s<¬ë¿ž›¶>N6ç¼õDÏ5CDàT¯û²HZGY2­P݌´B>€´N|¼zú¼ âÖ<”~Ýi˟ýlT÷Ç-Ûóû˳‚ÙJ(‘©‘À—ÅØ:Yš-P7‡-àbëûx‹iÿ¿â¶½m !&hbœðUáqbT%Ç ¨jÆ8qe'&>ꧪÙƒÙn3¥gk€S×6‡ÇäÐ`eÁSböl:9:x²X‚,` nN‚P‚}7wµÍSÕºÌ-ÏÀtÛ­‰^¤Õ1C\•ÉV÷d1PN–ÔÍø€@ù>‚éù·ìˆFB˜õcI!ìœjéË.ì´Ä»««ÙQŠ'¬fçκö1m]Ӎ‚p6õÑÖÝK{X?4õ~ Íí’"N›¶ð¼·ðÇæÔMùŸ¿é¯8Yn Å®oÛ# )jâvª¥/¢zuµ nF¦\ƒuøÝY /ªvÀžØ¸ jæBFK…¹‘ÂzI9:½ F’rŠ„Æ,I_‰ä(KFª›IȇÇÈ=«‰¸_6]08”rT +)Áñe‘àŒ²dp ºÁ¹ò1íSœ‰ûæ-¼*&Ðüj;ó}s|l«çÝ¢_¯ñáIÊU +Ÿ'‹ás²4> n¾¹Ÿoã¡iOÝúP™%Þ5EQ"ª”ŠPüÐ,¨°«A»4tׁ¥Ô4ÁÓSEp:U’&P4æÜÈÒ÷°¯"$1ÒXG@þj·(8iÆB¡YŠœ'‹¡s²4; n¼¹˜žoãŒïåyýÊüj#³mqce_Á~‘q.†-¨™ÊÔ¨éËb°, ¨›{î†íÛh{ð ‹a_"_»¨/mòãHk¦â›<_Þ䍪ä&ªš±Éƒlxӊ[íO|6dîùkH¿PŒ‡ÉSE²äTÉ(E3’47É÷Ð5ݾÎÍÑdÀ[-˜¸ugû·`ç +)؜¹_Í=Íõæ‚*„‰Öã•z' +þËë=endstream +endobj +5605 0 obj << +/Type /Page +/Contents 5606 0 R +/Resources 5604 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5607 0 obj << +/D [5605 0 R /XYZ 71.731 729.2652 null] +>> endobj +5608 0 obj << +/D [5605 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5609 0 obj << +/D [5605 0 R /XYZ 71.731 706.9041 null] +>> endobj +5610 0 obj << +/D [5605 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5611 0 obj << +/D [5605 0 R /XYZ 76.7123 672.4782 null] +>> endobj +5612 0 obj << +/D [5605 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5613 0 obj << +/D [5605 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5614 0 obj << +/D [5605 0 R /XYZ 71.731 652.3886 null] +>> endobj +5615 0 obj << +/D [5605 0 R /XYZ 71.731 652.3886 null] +>> endobj +5616 0 obj << +/D [5605 0 R /XYZ 159.4023 636.6127 null] +>> endobj +5617 0 obj << +/D [5605 0 R /XYZ 71.731 635.1731 null] +>> endobj +5618 0 obj << +/D [5605 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5619 0 obj << +/D [5605 0 R /XYZ 76.7123 600.7472 null] +>> endobj +5620 0 obj << +/D [5605 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5621 0 obj << +/D [5605 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5622 0 obj << +/D [5605 0 R /XYZ 71.731 580.6576 null] +>> endobj +5623 0 obj << +/D [5605 0 R /XYZ 71.731 580.6576 null] +>> endobj +5624 0 obj << +/D [5605 0 R /XYZ 159.4023 564.8817 null] +>> endobj +5625 0 obj << +/D [5605 0 R /XYZ 71.731 562.7248 null] +>> endobj +5626 0 obj << +/D [5605 0 R /XYZ 159.4023 546.9489 null] +>> endobj +5627 0 obj << +/D [5605 0 R /XYZ 76.7123 529.0162 null] +>> endobj +5628 0 obj << +/D [5605 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5629 0 obj << +/D [5605 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5630 0 obj << +/D [5605 0 R /XYZ 71.731 508.9266 null] +>> endobj +5631 0 obj << +/D [5605 0 R /XYZ 71.731 508.9266 null] +>> endobj +5632 0 obj << +/D [5605 0 R /XYZ 159.4023 493.1507 null] +>> endobj +5633 0 obj << +/D [5605 0 R /XYZ 71.731 490.9938 null] +>> endobj +5634 0 obj << +/D [5605 0 R /XYZ 159.4023 475.2179 null] +>> endobj +5635 0 obj << +/D [5605 0 R /XYZ 76.7123 457.2852 null] +>> endobj +5636 0 obj << +/D [5605 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5637 0 obj << +/D [5605 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5638 0 obj << +/D [5605 0 R /XYZ 71.731 437.1956 null] +>> endobj +5639 0 obj << +/D [5605 0 R /XYZ 71.731 437.1956 null] +>> endobj +5640 0 obj << +/D [5605 0 R /XYZ 159.4023 421.4197 null] +>> endobj +5641 0 obj << +/D [5605 0 R /XYZ 71.731 419.2628 null] +>> endobj +5642 0 obj << +/D [5605 0 R /XYZ 159.4023 403.4869 null] +>> endobj +5643 0 obj << +/D [5605 0 R /XYZ 76.7123 349.6887 null] +>> endobj +5644 0 obj << +/D [5605 0 R /XYZ 129.5143 331.7559 null] +>> endobj +5645 0 obj << +/D [5605 0 R /XYZ 129.5143 331.7559 null] +>> endobj +5646 0 obj << +/D [5605 0 R /XYZ 71.731 329.5991 null] +>> endobj +5647 0 obj << +/D [5605 0 R /XYZ 71.731 329.5991 null] +>> endobj +5648 0 obj << +/D [5605 0 R /XYZ 139.477 313.8231 null] +>> endobj +5649 0 obj << +/D [5605 0 R /XYZ 71.731 275.9651 null] +>> endobj +5650 0 obj << +/D [5605 0 R /XYZ 71.731 262.9141 null] +>> endobj +5651 0 obj << +/D [5605 0 R /XYZ 71.731 261.6688 null] +>> endobj +5652 0 obj << +/D [5605 0 R /XYZ 129.5143 242.5903 null] +>> endobj +5653 0 obj << +/D [5605 0 R /XYZ 71.731 240.4334 null] +>> endobj +5654 0 obj << +/D [5605 0 R /XYZ 71.731 240.4334 null] +>> endobj +5655 0 obj << +/D [5605 0 R /XYZ 139.477 224.6575 null] +>> endobj +5656 0 obj << +/D [5605 0 R /XYZ 139.477 224.6575 null] +>> endobj +5657 0 obj << +/D [5605 0 R /XYZ 71.731 222.5007 null] +>> endobj +5658 0 obj << +/D [5605 0 R /XYZ 139.477 206.7248 null] +>> endobj +5659 0 obj << +/D [5605 0 R /XYZ 139.477 206.7248 null] +>> endobj +5660 0 obj << +/D [5605 0 R /XYZ 71.731 204.5679 null] +>> endobj +5661 0 obj << +/D [5605 0 R /XYZ 139.477 188.792 null] +>> endobj +5662 0 obj << +/D [5605 0 R /XYZ 139.477 188.792 null] +>> endobj +5663 0 obj << +/D [5605 0 R /XYZ 71.731 186.6352 null] +>> endobj +5664 0 obj << +/D [5605 0 R /XYZ 139.477 170.8593 null] +>> endobj +5665 0 obj << +/D [5605 0 R /XYZ 139.477 170.8593 null] +>> endobj +5666 0 obj << +/D [5605 0 R /XYZ 71.731 168.7024 null] +>> endobj +5667 0 obj << +/D [5605 0 R /XYZ 139.477 152.9265 null] +>> endobj +5668 0 obj << +/D [5605 0 R /XYZ 139.477 152.9265 null] +>> endobj +5669 0 obj << +/D [5605 0 R /XYZ 71.731 150.7697 null] +>> endobj +5670 0 obj << +/D [5605 0 R /XYZ 71.731 150.7697 null] +>> endobj +5671 0 obj << +/D [5605 0 R /XYZ 149.4396 134.9938 null] +>> endobj +5672 0 obj << +/D [5605 0 R /XYZ 76.7123 117.061 null] +>> endobj +5673 0 obj << +/D [5605 0 R /XYZ 139.477 99.1283 null] +>> endobj +5674 0 obj << +/D [5605 0 R /XYZ 139.477 99.1283 null] +>> endobj +5675 0 obj << +/D [5605 0 R /XYZ 71.731 96.9714 null] +>> endobj +5604 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5678 0 obj << +/Length 1254 +/Filter /FlateDecode +>> +stream +xÚ­Xю£6}Ÿ¯à1‘6®mllÏÛ¶ÛݶÚJÑ*}êT#¼´" Íß×ÌrÁ¤ªæÈ|î9Ø&6$‰Ð\¨B4â48œpðbþõåtM‡Ù¸ Ÿw?}q Šh쾡Š,!E’쒿W¿ãs­Ëõ†r¼¢¨½n³8×õ×xß>~ÜþÞÞü©ëc‘Tëv<üºëëóP %M‘Y’ KÄ"Š‘¢„ƒ(b†à„”0ø…¢Ÿ U@¤™¨™LëaÍlž(åcvÄLS¦w@[w|}çaߺåÊ@Q#vå*ĄÒ¸”YÃâJù]"Qâ¦Bƒyl%­ê2Í_>´¿'Ýޝã}3;åHaÄV]،€=Ì+ Tw€7<@4~è·ç´m´‘ˆ #Š—eü¶ŽøªÓñkZÕí]ñ½½þX¼ÒkÂWoíi¢ó:}˜겺qÇIPs•p?[ÐÆE:Çš”™ã"U§e¶o4œæc††I€!4¯§»,ŒPD¨ðu™›ë2 ówPwI—yÀ]æÒÐy¼ÏtwÇB »l_™ŽsëÕ¸ê~Ö:oïœñ`E›Êë[6§¨…ùê.QtÌVÔ¥QeéAO8—›ÔÇê^ã^G¼Ç²#Á„ϲjƲå·,Pu‰ee]s–åCRŸe]ØLƒõ0oƒAu4Ø °Á4ÎÇ"×@sΡTbæÛº[ ãÐL·#\Ê/§½YúLªÉ"¤˜ôÙՅͩia~5ºKÔó€Õtiœµ.ŸÏÆMEnL È*$"Q4’Õt`§éçæƒZ”:}éðRÙ¥¤kÖÎ띳›¢Óš›L"êÓ܁Íina~́ºK4ó€5wi”æ#2µ¶áÈ@é½ٌxGBrB–!›OH5=ʛPÕ ÑrÀc.!™àˆáó´ ›é¯æí/¨î‚þºáö׀Ɯ91Û3#넝ÿ‚Ý;©%ˆJîóª ›ÓÒÂüZu—h9ækéÒHâZ?Jm.œ‘@ O†ã'óVgáéÚ¤ÿãØÝy:“H’H͹;˜ÛwN¥Yø+ՏÔÔVdòü(ø/_Lendstream +endobj +5677 0 obj << +/Type /Page +/Contents 5678 0 R +/Resources 5676 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5679 0 obj << +/D [5677 0 R /XYZ 71.731 729.2652 null] +>> endobj +5680 0 obj << +/D [5677 0 R /XYZ 139.477 708.3437 null] +>> endobj +5681 0 obj << +/D [5677 0 R /XYZ 139.477 708.3437 null] +>> endobj +5682 0 obj << +/D [5677 0 R /XYZ 71.731 706.1869 null] +>> endobj +5683 0 obj << +/D [5677 0 R /XYZ 139.477 690.4109 null] +>> endobj +5684 0 obj << +/D [5677 0 R /XYZ 139.477 690.4109 null] +>> endobj +5685 0 obj << +/D [5677 0 R /XYZ 71.731 688.2541 null] +>> endobj +5686 0 obj << +/D [5677 0 R /XYZ 71.731 688.2541 null] +>> endobj +5687 0 obj << +/D [5677 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5688 0 obj << +/D [5677 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5689 0 obj << +/D [5677 0 R /XYZ 139.477 636.6127 null] +>> endobj +5690 0 obj << +/D [5677 0 R /XYZ 139.477 636.6127 null] +>> endobj +5691 0 obj << +/D [5677 0 R /XYZ 71.731 635.1731 null] +>> endobj +5692 0 obj << +/D [5677 0 R /XYZ 139.477 618.6799 null] +>> endobj +5693 0 obj << +/D [5677 0 R /XYZ 139.477 618.6799 null] +>> endobj +5694 0 obj << +/D [5677 0 R /XYZ 71.731 616.5231 null] +>> endobj +5695 0 obj << +/D [5677 0 R /XYZ 71.731 616.5231 null] +>> endobj +5696 0 obj << +/D [5677 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5697 0 obj << +/D [5677 0 R /XYZ 76.7123 582.8144 null] +>> endobj +5698 0 obj << +/D [5677 0 R /XYZ 139.477 564.8817 null] +>> endobj +5699 0 obj << +/D [5677 0 R /XYZ 139.477 564.8817 null] +>> endobj +5700 0 obj << +/D [5677 0 R /XYZ 71.731 562.7248 null] +>> endobj +5701 0 obj << +/D [5677 0 R /XYZ 139.477 546.9489 null] +>> endobj +5702 0 obj << +/D [5677 0 R /XYZ 139.477 546.9489 null] +>> endobj +5703 0 obj << +/D [5677 0 R /XYZ 71.731 544.7921 null] +>> endobj +5704 0 obj << +/D [5677 0 R /XYZ 139.477 529.0162 null] +>> endobj +5705 0 obj << +/D [5677 0 R /XYZ 139.477 529.0162 null] +>> endobj +5706 0 obj << +/D [5677 0 R /XYZ 71.731 526.8593 null] +>> endobj +5707 0 obj << +/D [5677 0 R /XYZ 71.731 526.8593 null] +>> endobj +5708 0 obj << +/D [5677 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5709 0 obj << +/D [5677 0 R /XYZ 76.7123 493.1507 null] +>> endobj +5710 0 obj << +/D [5677 0 R /XYZ 139.477 475.2179 null] +>> endobj +5711 0 obj << +/D [5677 0 R /XYZ 139.477 475.2179 null] +>> endobj +5712 0 obj << +/D [5677 0 R /XYZ 71.731 473.7784 null] +>> endobj +5713 0 obj << +/D [5677 0 R /XYZ 139.477 457.2852 null] +>> endobj +5714 0 obj << +/D [5677 0 R /XYZ 139.477 457.2852 null] +>> endobj +5715 0 obj << +/D [5677 0 R /XYZ 71.731 455.8456 null] +>> endobj +5716 0 obj << +/D [5677 0 R /XYZ 139.477 439.3524 null] +>> endobj +5717 0 obj << +/D [5677 0 R /XYZ 139.477 439.3524 null] +>> endobj +5718 0 obj << +/D [5677 0 R /XYZ 71.731 437.1956 null] +>> endobj +5719 0 obj << +/D [5677 0 R /XYZ 71.731 437.1956 null] +>> endobj +5720 0 obj << +/D [5677 0 R /XYZ 149.4396 421.4197 null] +>> endobj +5721 0 obj << +/D [5677 0 R /XYZ 76.7123 403.4869 null] +>> endobj +5722 0 obj << +/D [5677 0 R /XYZ 139.477 385.5542 null] +>> endobj +5723 0 obj << +/D [5677 0 R /XYZ 139.477 385.5542 null] +>> endobj +5724 0 obj << +/D [5677 0 R /XYZ 71.731 383.3973 null] +>> endobj +5725 0 obj << +/D [5677 0 R /XYZ 139.477 367.6214 null] +>> endobj +5726 0 obj << +/D [5677 0 R /XYZ 139.477 367.6214 null] +>> endobj +813 0 obj << +/D [5677 0 R /XYZ 71.731 344.7073 null] +>> endobj +370 0 obj << +/D [5677 0 R /XYZ 190.3782 299.453 null] +>> endobj +5727 0 obj << +/D [5677 0 R /XYZ 71.731 279.3127 null] +>> endobj +5728 0 obj << +/D [5677 0 R /XYZ 161.0655 266.5763 null] +>> endobj +5729 0 obj << +/D [5677 0 R /XYZ 71.731 254.4568 null] +>> endobj +5730 0 obj << +/D [5677 0 R /XYZ 71.731 223.4272 null] +>> endobj +5731 0 obj << +/D [5677 0 R /XYZ 168.8063 212.0807 null] +>> endobj +5732 0 obj << +/D [5677 0 R /XYZ 71.731 199.9612 null] +>> endobj +5733 0 obj << +/D [5677 0 R /XYZ 71.731 168.5953 null] +>> endobj +5734 0 obj << +/D [5677 0 R /XYZ 181.5683 157.585 null] +>> endobj +5735 0 obj << +/D [5677 0 R /XYZ 71.731 147.5229 null] +>> endobj +5736 0 obj << +/D [5677 0 R /XYZ 71.731 114.0997 null] +>> endobj +5737 0 obj << +/D [5677 0 R /XYZ 71.731 102.9899 null] +>> endobj +5738 0 obj << +/D [5677 0 R /XYZ 71.731 101.7445 null] +>> endobj +5676 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5741 0 obj << +/Length 929 +/Filter /FlateDecode +>> +stream +xÚÅWËnÛ0¼ç+t´˜åS$sKŸhÑAê[SªM7B)hùû.õ2eђ.E‘åhȝw)aø#‘$H2¨F44Ú=]áè¼úpEZȦÅl|ÐëíÕ«÷ Gé˜ÆÑö1#!y$EJm÷ßVo“gkÊõ† +¼¢¨ï²$7ösò³ùy{÷±yøbìc±¯Öß·Ÿ®Þmûø‚I¤™$ɉBœam(FšD¢‘DB2X!ƙ쓡:‚8—Lëa.›JÅ9;B)ü»¸çã‰G7k̃©H¨1¯y@ʂp6ä‘í£ãQ“>íå»rÓHZÙò¸³×gB»ù&·é.±i‘ûÈciÆ ¶b' pPصña'a‰sŸP»(,øS®ƒq/ ÛÍó +Ë4âRi܂. êŠÅü}®ošÿêô ÈúÔ,W?Û¢U-2ì½;1Ì(0RXózå{»W7#=:KÆð@¤"3÷aïa³Å]`ð“ª'?ø<’²L^±ŠƒïÏËæÄQ.؜9=ؔ9;ؼ9q—˜óœG؜>lB·6«[(îÝF<‚º h”þ4t¢9FË3éÒÜúº5ÿÛ»cý€1…VÖ¬©H]¦Ž»!P©`nc"±jN2ôÁص<©VŒýjªÊ•…‰Åpd]ç”qSãïÊÂöåÙÜô3N‰¶s7” ˜¨¦xy!jÒX`Wèa$ ›n ?è[SíÊôٕ¯¥aÛrÕ6–fÈ͚ŠÕŸÖ‹>©ßk‚WfMĪ=Þéa0Jc{Y(Ú1/öfÔµL[Q«ãnËŽYö²ŽÅªÝ¹ƒ‹’3ÛÒ*`bù'­ Z*Äm–u]$g†jV“F’dÿ”æ-•çôÚˌ㎢5»Çk/żîœtI ¥nU=‚j¸.9×#|ØDèa³="wAñ_‚<þÏ%ˆ*¸/PÎg꥛¨—=l¶^†â.¨—#Áz9 ñŸ/AbÙ%ˆb¸.èÙ[¾›2x›7x îƒx.AY¿^ª¢¡v$$’Š±ZRÊDÜu#éu£ÔšêŸö¢:À µ©Tðæ‡k¦™”IJÞóúÉöU×·ümh¿D¹BŠÄzòcÕÌ¿UUP%àÖÔ¡iM/~yþBycendstream +endobj +5740 0 obj << +/Type /Page +/Contents 5741 0 R +/Resources 5739 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +5742 0 obj << +/D [5740 0 R /XYZ 71.731 729.2652 null] +>> endobj +5743 0 obj << +/D [5740 0 R /XYZ 129.5143 708.3437 null] +>> endobj +5744 0 obj << +/D [5740 0 R /XYZ 129.5143 708.3437 null] +>> endobj +5745 0 obj << +/D [5740 0 R /XYZ 71.731 706.9041 null] +>> endobj +5746 0 obj << +/D [5740 0 R /XYZ 71.731 706.9041 null] +>> endobj +5747 0 obj << +/D [5740 0 R /XYZ 139.477 690.4109 null] +>> endobj +5748 0 obj << +/D [5740 0 R /XYZ 139.477 690.4109 null] +>> endobj +5749 0 obj << +/D [5740 0 R /XYZ 71.731 652.5529 null] +>> endobj +5750 0 obj << +/D [5740 0 R /XYZ 71.731 639.5019 null] +>> endobj +5751 0 obj << +/D [5740 0 R /XYZ 71.731 638.2566 null] +>> endobj +5752 0 obj << +/D [5740 0 R /XYZ 129.5143 619.1781 null] +>> endobj +5753 0 obj << +/D [5740 0 R /XYZ 71.731 617.0212 null] +>> endobj +5754 0 obj << +/D [5740 0 R /XYZ 71.731 617.0212 null] +>> endobj +5755 0 obj << +/D [5740 0 R /XYZ 139.477 601.2453 null] +>> endobj +5756 0 obj << +/D [5740 0 R /XYZ 139.477 601.2453 null] +>> endobj +5757 0 obj << +/D [5740 0 R /XYZ 71.731 599.0885 null] +>> endobj +5758 0 obj << +/D [5740 0 R /XYZ 139.477 583.3126 null] +>> endobj +5759 0 obj << +/D [5740 0 R /XYZ 139.477 583.3126 null] +>> endobj +814 0 obj << +/D [5740 0 R /XYZ 71.731 560.3985 null] +>> endobj +374 0 obj << +/D [5740 0 R /XYZ 209.5216 515.1442 null] +>> endobj +5760 0 obj << +/D [5740 0 R /XYZ 71.731 495.0038 null] +>> endobj +5761 0 obj << +/D [5740 0 R /XYZ 161.0655 482.2675 null] +>> endobj +5762 0 obj << +/D [5740 0 R /XYZ 71.731 470.148 null] +>> endobj +5763 0 obj << +/D [5740 0 R /XYZ 71.731 439.1184 null] +>> endobj +5764 0 obj << +/D [5740 0 R /XYZ 168.8063 427.7718 null] +>> endobj +5765 0 obj << +/D [5740 0 R /XYZ 71.731 415.6524 null] +>> endobj +5766 0 obj << +/D [5740 0 R /XYZ 71.731 384.2865 null] +>> endobj +5767 0 obj << +/D [5740 0 R /XYZ 181.5683 373.2762 null] +>> endobj +5768 0 obj << +/D [5740 0 R /XYZ 71.731 363.214 null] +>> endobj +5769 0 obj << +/D [5740 0 R /XYZ 71.731 329.7908 null] +>> endobj +5770 0 obj << +/D [5740 0 R /XYZ 71.731 318.681 null] +>> endobj +5771 0 obj << +/D [5740 0 R /XYZ 71.731 317.4357 null] +>> endobj +5772 0 obj << +/D [5740 0 R /XYZ 129.5143 298.3571 null] +>> endobj +5773 0 obj << +/D [5740 0 R /XYZ 129.5143 298.3571 null] +>> endobj +5774 0 obj << +/D [5740 0 R /XYZ 71.731 296.9176 null] +>> endobj +5775 0 obj << +/D [5740 0 R /XYZ 71.731 296.9176 null] +>> endobj +5776 0 obj << +/D [5740 0 R /XYZ 139.477 280.4244 null] +>> endobj +5777 0 obj << +/D [5740 0 R /XYZ 139.477 280.4244 null] +>> endobj +5778 0 obj << +/D [5740 0 R /XYZ 71.731 242.5664 null] +>> endobj +5779 0 obj << +/D [5740 0 R /XYZ 71.731 229.5154 null] +>> endobj +5780 0 obj << +/D [5740 0 R /XYZ 71.731 228.2701 null] +>> endobj +5781 0 obj << +/D [5740 0 R /XYZ 129.5143 209.1915 null] +>> endobj +815 0 obj << +/D [5740 0 R /XYZ 71.731 202.0534 null] +>> endobj +378 0 obj << +/D [5740 0 R /XYZ 184.6453 158.9559 null] +>> endobj +5782 0 obj << +/D [5740 0 R /XYZ 71.731 138.8155 null] +>> endobj +5783 0 obj << +/D [5740 0 R /XYZ 161.0655 126.0792 null] +>> endobj +5784 0 obj << +/D [5740 0 R /XYZ 71.731 113.9597 null] +>> endobj +5739 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5788 0 obj << +/Length 1499 +/Filter /FlateDecode +>> +stream +xÚÕY]£6}Ÿ_‘ÇDš¸ØØ|ìÛ´Û­¦ÚV£é¬T©[­HðLDàh:ÿ¾&ØĆkÌH݇*äØ÷øøž‹mð*¼Š1ŠCy!)"#«ýñ&X½È¿~¹Á +²U˜­ úñéæ‡Oa°JQ‘hõô¼ +Ó±˜®â „ádõ”ÿµþ鐝o6[‚5Aýõ¡Ì*.>g»þëÝÃ}ó‡:o7?ýzóóÓŸ…1Jd–䀚Ò$©Aã1†ãU$(¤a|áù‘·û¦8‰¢®>tñ/Ù(¢]#Õ|K0Šp’^šÆ˜ä(iCVP[¦­,mزòë(|%„Mâ"½Ž w|½òЭ¦<ÂÄÐ˂Ã0 mÙYÙEA¡ƒ|0½r;ª†]ûÎ}û¬«J&òÜðé5Y£DV5PXÚš°«°¸+óր4Ì)¬œü€ÐŒëV·šò°… SDãئq'u韀º,B•¡±¾²‚h}Y}w½êÁ#îì 0JpB|ÙkÀæ²WÃüÙ Ä]’½cŽì5y\6ÏÅ¥ÆNeŽ0JSÌl™GKQ ûéÐOÅä·îQáÊhš„(Iõd´ ›ÉèæÍh(†x«•Ñw7!«º‹Jq¸^¶& +hܗS!*g_V|0ª[!Ý +¤a(D% ¹–´yH=”ÿæâÄ) Md¹MS0jFò D]" @ÆäaÕ¶«6mYìÕí©áFÿ¸ † Œz fÀæ ¦a~ƒq— à̤a?`͵çh5éÈ¢0¥ˆ챗‰rgрòfuAMhØÕ^g‘Å£ÌZñí|Ê3Á¡§j#Ä£UˤD9ÊØdxš@!’$kjÔքªNzsÊʤ@, `\·¬ºÈÃH;&y$´y\«ÖÇlØú蝙(Žê§W¹ ïdik”˜¯,›© E7SjÒO×­VZõÀåSodÚ¢ÒUàËï÷ªžOõþàž&wÅ,"¾Y1`s³¢aþYâ.™€4+&8Oÿ/¥Ëˆ\ÝÑ4ð•$5S’4Ê_’€¨KJҘ†£$™<º³…Åۧɚ>‡VPCð€Êåxì-Gl.ñ5̟ø@Ü%‰ð€ßäa­>õÉÄ5—µæ @$‘{+Â|•Á„Í4À¼Aqñ²x8³æ½š)cÉÿQÌähgMj¢Ü&P^“BQ˜tB6©Åãܔ€Gq‚¢ðû¸”t‡M$ò¹Ô„Í%¡†ù“ˆ»$ Pš<¬ŒûòøÙÖG¯ž²®"3¡»3ì>9½žPbÆ՘¢$¥Ø'¨›TÃü‚q— +ð€5yø\ýÝ4VÎÅq*·.‰§ +˜(wPÞ*E]P&4à*`ñ¸œÐƁˆÉ»oÀFAÊ|%À„Ídìóf,wAÆB<€Œµx¼û´c ŽBŸ›M؜6æ׈»D€¤Écvõþ¾Ã!Ĉ¤±Ï˜jƘå7&u‰1Ç4Æ4yð*ە|©1wu]rýžpƜ7 zKL”`ÇZ¿H60Ó÷Ȍ¨ã-ê(¦¡ó­0ð_Ã[ïPendstream +endobj +5787 0 obj << +/Type /Page +/Contents 5788 0 R +/Resources 5786 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +5789 0 obj << +/D [5787 0 R /XYZ 71.731 729.2652 null] +>> endobj +5790 0 obj << +/D [5787 0 R /XYZ 71.731 718.3063 null] +>> endobj +5791 0 obj << +/D [5787 0 R /XYZ 168.8063 708.3437 null] +>> endobj +5792 0 obj << +/D [5787 0 R /XYZ 71.731 696.2242 null] +>> endobj +5793 0 obj << +/D [5787 0 R /XYZ 71.731 641.5458 null] +>> endobj +5794 0 obj << +/D [5787 0 R /XYZ 181.5683 630.5355 null] +>> endobj +5795 0 obj << +/D [5787 0 R /XYZ 71.731 620.4733 null] +>> endobj +5796 0 obj << +/D [5787 0 R /XYZ 71.731 587.0501 null] +>> endobj +5797 0 obj << +/D [5787 0 R /XYZ 71.731 575.9403 null] +>> endobj +5798 0 obj << +/D [5787 0 R /XYZ 71.731 574.695 null] +>> endobj +5799 0 obj << +/D [5787 0 R /XYZ 129.5143 555.6164 null] +>> endobj +5800 0 obj << +/D [5787 0 R /XYZ 129.5143 555.6164 null] +>> endobj +5801 0 obj << +/D [5787 0 R /XYZ 71.731 554.1769 null] +>> endobj +5802 0 obj << +/D [5787 0 R /XYZ 71.731 554.1769 null] +>> endobj +5803 0 obj << +/D [5787 0 R /XYZ 139.477 537.6837 null] +>> endobj +5804 0 obj << +/D [5787 0 R /XYZ 139.477 537.6837 null] +>> endobj +5805 0 obj << +/D [5787 0 R /XYZ 76.7123 519.7509 null] +>> endobj +5806 0 obj << +/D [5787 0 R /XYZ 129.5143 501.8182 null] +>> endobj +5807 0 obj << +/D [5787 0 R /XYZ 129.5143 501.8182 null] +>> endobj +5808 0 obj << +/D [5787 0 R /XYZ 71.731 499.6613 null] +>> endobj +5809 0 obj << +/D [5787 0 R /XYZ 71.731 499.6613 null] +>> endobj +5810 0 obj << +/D [5787 0 R /XYZ 139.477 483.8854 null] +>> endobj +5811 0 obj << +/D [5787 0 R /XYZ 71.731 481.7286 null] +>> endobj +5812 0 obj << +/D [5787 0 R /XYZ 71.731 481.7286 null] +>> endobj +5813 0 obj << +/D [5787 0 R /XYZ 149.4396 465.9527 null] +>> endobj +5814 0 obj << +/D [5787 0 R /XYZ 71.731 464.5131 null] +>> endobj +5815 0 obj << +/D [5787 0 R /XYZ 149.4396 448.0199 null] +>> endobj +5816 0 obj << +/D [5787 0 R /XYZ 76.7123 430.0872 null] +>> endobj +5817 0 obj << +/D [5787 0 R /XYZ 139.477 412.1544 null] +>> endobj +5818 0 obj << +/D [5787 0 R /XYZ 71.731 410.7149 null] +>> endobj +5819 0 obj << +/D [5787 0 R /XYZ 71.731 410.7149 null] +>> endobj +5820 0 obj << +/D [5787 0 R /XYZ 149.4396 394.2217 null] +>> endobj +5821 0 obj << +/D [5787 0 R /XYZ 149.4396 394.2217 null] +>> endobj +5822 0 obj << +/D [5787 0 R /XYZ 71.731 392.0648 null] +>> endobj +5823 0 obj << +/D [5787 0 R /XYZ 71.731 392.0648 null] +>> endobj +5824 0 obj << +/D [5787 0 R /XYZ 159.4023 376.2889 null] +>> endobj +5825 0 obj << +/D [5787 0 R /XYZ 71.731 374.1321 null] +>> endobj +5826 0 obj << +/D [5787 0 R /XYZ 159.4023 358.3562 null] +>> endobj +5827 0 obj << +/D [5787 0 R /XYZ 76.7123 340.4234 null] +>> endobj +5828 0 obj << +/D [5787 0 R /XYZ 149.4396 322.4907 null] +>> endobj +5829 0 obj << +/D [5787 0 R /XYZ 149.4396 322.4907 null] +>> endobj +5830 0 obj << +/D [5787 0 R /XYZ 71.731 320.3338 null] +>> endobj +5831 0 obj << +/D [5787 0 R /XYZ 71.731 320.3338 null] +>> endobj +5832 0 obj << +/D [5787 0 R /XYZ 159.4023 304.5579 null] +>> endobj +5833 0 obj << +/D [5787 0 R /XYZ 71.731 302.4011 null] +>> endobj +5834 0 obj << +/D [5787 0 R /XYZ 159.4023 286.6252 null] +>> endobj +5835 0 obj << +/D [5787 0 R /XYZ 76.7123 268.6924 null] +>> endobj +5836 0 obj << +/D [5787 0 R /XYZ 149.4396 250.7596 null] +>> endobj +5837 0 obj << +/D [5787 0 R /XYZ 149.4396 250.7596 null] +>> endobj +5838 0 obj << +/D [5787 0 R /XYZ 71.731 248.6028 null] +>> endobj +5839 0 obj << +/D [5787 0 R /XYZ 71.731 248.6028 null] +>> endobj +5840 0 obj << +/D [5787 0 R /XYZ 159.4023 232.8269 null] +>> endobj +5841 0 obj << +/D [5787 0 R /XYZ 71.731 230.6701 null] +>> endobj +5842 0 obj << +/D [5787 0 R /XYZ 159.4023 214.8941 null] +>> endobj +5843 0 obj << +/D [5787 0 R /XYZ 76.7123 196.9614 null] +>> endobj +5844 0 obj << +/D [5787 0 R /XYZ 149.4396 179.0286 null] +>> endobj +5845 0 obj << +/D [5787 0 R /XYZ 149.4396 179.0286 null] +>> endobj +5846 0 obj << +/D [5787 0 R /XYZ 71.731 176.8718 null] +>> endobj +5847 0 obj << +/D [5787 0 R /XYZ 71.731 176.8718 null] +>> endobj +5848 0 obj << +/D [5787 0 R /XYZ 159.4023 161.0959 null] +>> endobj +5849 0 obj << +/D [5787 0 R /XYZ 71.731 159.6563 null] +>> endobj +5850 0 obj << +/D [5787 0 R /XYZ 159.4023 143.1631 null] +>> endobj +5851 0 obj << +/D [5787 0 R /XYZ 76.7123 125.2304 null] +>> endobj +5852 0 obj << +/D [5787 0 R /XYZ 149.4396 107.2976 null] +>> endobj +5853 0 obj << +/D [5787 0 R /XYZ 149.4396 107.2976 null] +>> endobj +5854 0 obj << +/D [5787 0 R /XYZ 71.731 105.1408 null] +>> endobj +5855 0 obj << +/D [5787 0 R /XYZ 71.731 105.1408 null] +>> endobj +5786 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5858 0 obj << +/Length 1412 +/Filter /FlateDecode +>> +stream +xÚÍZ]oÛ6}ϯÐc4œø)roÛºnÖ!ÀR À:²¥&l9°•4û÷£*R¦ì+^6K¶!’“cÝÃÃs.)E4ËíÍ +J +n̦$ËV›³<»±úéŒ:È¥Ã\† ï¯Ï¾yÃóÌ£˜Ê®?eÜ(" ‘œ-©Î®«?θ-ïºzwqÉd~ÎÈp¼Z—mÝýZ.‡ß]½NÞÕÝí¶Ú_üyýËُ×c}É b´-%ɵ&Rðì’åÄ0*A†KԎ%ׄ ^Œca&+íÇiÇ2âFX?˜ŒÉcrTRbdβð‚¾îññÀà äqДJË#g|Êc¹Ý®ë²}5¨ös¹N–uÝgu[.×uuÂՏJ™œšD£Ñh„¡Au4‚xMx”»]ù× Æö“Ó穲q[ (2%…u˜°jt¢ÑŽ¯5«™°£×…«Îkæ¿uJƒëL[͔˜Î]Èc½mošî¾ª{2G*K›ªÜô…z䷃`ÕöÞ +æTv!„w°Y7rEeæÆs£‡ánꦸà¹1ä1(àœ÷º^5›r=|8h>‘¬»u¿Ø7]D9ª‰* šãSÎÃp债)Ê< åB³vz61]"¥¶ËHºCÔ|ºGšn¨jBºOhÀéžðX—Ý\¸…$’öá–J­)î±èC- +ÕM°(Ä°è„Gď^ò'd[ +EŒÐX¶CXL8Åê¦ð€„ y|]¶Ÿ ¥#¥$׋v€ŠDÛ£ðhUS¢}Lc&Ú!Mù¸Ø¯›U½‡VnE˜¶ŠOÂÝ´šì3çNa8¡2ÇbÂ"îa¨;¡º î„xîœð°Ãw>|W>6›ûÍð¡½ß,ý WÊiïYv7I¨;k·Ž«]]Fº($a´ÀºA‹éía¸Þ@ݽÞ!؁ÿý¸à[á— i"!j¾‰Œ(´‰@UšÈ ¸‰Lx¬·7M»X–û:µ‰ì»]ÓÞ }ÄÁf­Í¨½m3h+ `1k{nm nŠµµCƒÎÊ¿VüâÙáônWÌsö8¯RΉР+m,¦’‡á*uSTx@*…> endobj +5859 0 obj << +/D [5857 0 R /XYZ 71.731 729.2652 null] +>> endobj +5860 0 obj << +/D [5857 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5861 0 obj << +/D [5857 0 R /XYZ 71.731 706.9041 null] +>> endobj +5862 0 obj << +/D [5857 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5863 0 obj << +/D [5857 0 R /XYZ 76.7123 672.4782 null] +>> endobj +5864 0 obj << +/D [5857 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5865 0 obj << +/D [5857 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5866 0 obj << +/D [5857 0 R /XYZ 71.731 652.3886 null] +>> endobj +5867 0 obj << +/D [5857 0 R /XYZ 71.731 652.3886 null] +>> endobj +5868 0 obj << +/D [5857 0 R /XYZ 159.4023 636.6127 null] +>> endobj +5869 0 obj << +/D [5857 0 R /XYZ 71.731 634.4559 null] +>> endobj +5870 0 obj << +/D [5857 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5871 0 obj << +/D [5857 0 R /XYZ 76.7123 600.7472 null] +>> endobj +5872 0 obj << +/D [5857 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5873 0 obj << +/D [5857 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5874 0 obj << +/D [5857 0 R /XYZ 71.731 580.6576 null] +>> endobj +5875 0 obj << +/D [5857 0 R /XYZ 71.731 580.6576 null] +>> endobj +5876 0 obj << +/D [5857 0 R /XYZ 159.4023 564.8817 null] +>> endobj +5877 0 obj << +/D [5857 0 R /XYZ 71.731 563.4421 null] +>> endobj +5878 0 obj << +/D [5857 0 R /XYZ 159.4023 546.9489 null] +>> endobj +5879 0 obj << +/D [5857 0 R /XYZ 76.7123 529.0162 null] +>> endobj +5880 0 obj << +/D [5857 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5881 0 obj << +/D [5857 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5882 0 obj << +/D [5857 0 R /XYZ 71.731 508.9266 null] +>> endobj +5883 0 obj << +/D [5857 0 R /XYZ 71.731 508.9266 null] +>> endobj +5884 0 obj << +/D [5857 0 R /XYZ 159.4023 493.1507 null] +>> endobj +5885 0 obj << +/D [5857 0 R /XYZ 71.731 491.7111 null] +>> endobj +5886 0 obj << +/D [5857 0 R /XYZ 159.4023 475.2179 null] +>> endobj +5887 0 obj << +/D [5857 0 R /XYZ 76.7123 457.2852 null] +>> endobj +5888 0 obj << +/D [5857 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5889 0 obj << +/D [5857 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5890 0 obj << +/D [5857 0 R /XYZ 71.731 437.1956 null] +>> endobj +5891 0 obj << +/D [5857 0 R /XYZ 71.731 437.1956 null] +>> endobj +5892 0 obj << +/D [5857 0 R /XYZ 159.4023 421.4197 null] +>> endobj +5893 0 obj << +/D [5857 0 R /XYZ 71.731 419.2628 null] +>> endobj +5894 0 obj << +/D [5857 0 R /XYZ 159.4023 403.4869 null] +>> endobj +5895 0 obj << +/D [5857 0 R /XYZ 76.7123 385.5542 null] +>> endobj +5896 0 obj << +/D [5857 0 R /XYZ 149.4396 367.6214 null] +>> endobj +5897 0 obj << +/D [5857 0 R /XYZ 149.4396 367.6214 null] +>> endobj +5898 0 obj << +/D [5857 0 R /XYZ 71.731 365.4646 null] +>> endobj +5899 0 obj << +/D [5857 0 R /XYZ 71.731 365.4646 null] +>> endobj +5900 0 obj << +/D [5857 0 R /XYZ 159.4023 349.6887 null] +>> endobj +5901 0 obj << +/D [5857 0 R /XYZ 71.731 347.5318 null] +>> endobj +5902 0 obj << +/D [5857 0 R /XYZ 159.4023 331.7559 null] +>> endobj +5903 0 obj << +/D [5857 0 R /XYZ 76.7123 313.8231 null] +>> endobj +5904 0 obj << +/D [5857 0 R /XYZ 149.4396 295.8904 null] +>> endobj +5905 0 obj << +/D [5857 0 R /XYZ 149.4396 295.8904 null] +>> endobj +5906 0 obj << +/D [5857 0 R /XYZ 71.731 293.7336 null] +>> endobj +5907 0 obj << +/D [5857 0 R /XYZ 71.731 293.7336 null] +>> endobj +5908 0 obj << +/D [5857 0 R /XYZ 159.4023 277.9576 null] +>> endobj +5909 0 obj << +/D [5857 0 R /XYZ 71.731 276.5181 null] +>> endobj +5910 0 obj << +/D [5857 0 R /XYZ 159.4023 260.0249 null] +>> endobj +5911 0 obj << +/D [5857 0 R /XYZ 76.7123 242.0921 null] +>> endobj +5912 0 obj << +/D [5857 0 R /XYZ 149.4396 224.1594 null] +>> endobj +5913 0 obj << +/D [5857 0 R /XYZ 149.4396 224.1594 null] +>> endobj +5914 0 obj << +/D [5857 0 R /XYZ 71.731 222.0026 null] +>> endobj +5915 0 obj << +/D [5857 0 R /XYZ 71.731 222.0026 null] +>> endobj +5916 0 obj << +/D [5857 0 R /XYZ 159.4023 206.2266 null] +>> endobj +5917 0 obj << +/D [5857 0 R /XYZ 71.731 204.0698 null] +>> endobj +5918 0 obj << +/D [5857 0 R /XYZ 159.4023 188.2939 null] +>> endobj +5919 0 obj << +/D [5857 0 R /XYZ 76.7123 170.3611 null] +>> endobj +5920 0 obj << +/D [5857 0 R /XYZ 149.4396 152.4284 null] +>> endobj +5921 0 obj << +/D [5857 0 R /XYZ 149.4396 152.4284 null] +>> endobj +5922 0 obj << +/D [5857 0 R /XYZ 71.731 150.2715 null] +>> endobj +5923 0 obj << +/D [5857 0 R /XYZ 71.731 150.2715 null] +>> endobj +5924 0 obj << +/D [5857 0 R /XYZ 159.4023 134.4956 null] +>> endobj +5925 0 obj << +/D [5857 0 R /XYZ 71.731 132.3388 null] +>> endobj +5926 0 obj << +/D [5857 0 R /XYZ 159.4023 116.5629 null] +>> endobj +5927 0 obj << +/D [5857 0 R /XYZ 76.7123 98.6301 null] +>> endobj +5856 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5930 0 obj << +/Length 1510 +/Filter /FlateDecode +>> +stream +xÚ­Y]oÛ6}ϯÐcÔI‰_}ëÚuëÐ A—Ö!-6àȆ%¯è¿e‘6%]’ +6äA²rÄ{xxîÕ¥D2lþH&¹9P…(g4Û<ßàìÉüëçb!+‹Yù n~xŸãL!Å)Ͼf¹âˆ‰"9E’™=Tݾݖ‡NïV”á[Š†ãý®lt÷±\?ßÜN~ÓÝv_µw?üzóÓÃ%>ËRÒ‰’Ì•D 3ž­(FŠ¢H®P!„™ –(/rq™ U™@¤Ÿ§™‹ƒ]Pý\¾PʦÜHA 7Á3<uz¼²pwÍiä2“FR^œi††ÑuÌã õñ±®z*gÚ×%(°‘@š=ìõ jÝtÃÉÞ®By<–ßí¥¯WÌlb64W+XN‡Zù0@ÏÙhAA™‘†a +Æ êîy\"ÌðÀ4ó0Óe©W»ýpü¶­7[{i[·ÃY[wz8[ëݾyjÃê jŒ$iJ=SÏÁÒêq—¨ð€ÔóyÀ~ú¿µ ÉsŽ8¡"žÜ>*œÜT2¹¡¨ ’{FNîr½>êê²ÓÕcS>k Ë¥)t\LÒ¼íŽuó”Ìt ڕHąJ&»‹ÙÕÁÒvâ.±+À²«ÏcPÀÚóM¯öe·ƒâS3º€µÂ‰B$SۃŴr°´V@Ü%Z< ­|AýùˆBŒ‘1ó0DŽäs¨•»Ê§䛍”Ró%Œ–ÏÝ5ç1Îeó_FŠ|Ì㨻ӱyüZëÝÐÕLDï«(•ù8‘Í9»µ¬Ûn¼_0¦çGuu6Ÿ¶#FÂ2/`¹jå÷ÎF Êmš@L Æ Ëíîyxnµ|DãZÚÌ@KY?Œ$VàÓY¡öuВ&MçŠY’>,bÉ ,iI(îKB<<ÜZxÀ}ÚtAãÔTb7qãø°ˆq.°¤q ¸ Œ3ã1ÎSkœ²ªŽºmMK %)'ˆs)^š¤vPÛUºéêsÞƒ­MsÓ7$¶-(ÜØ8P²¯B.hkžíÜÍ'í/œ#r.‘É–ð—‹øëKú Š»À_3 ¿F4›SÀ[f¿fô*^ê­û·Ÿ_à«ÜÔ@"¹ŒËG…uA%­E]à-ˆ`®¨»HrJò”» ݔ띾“j¹Þïwºl¬þ¿”­{Ûx~¼™3o‡ƒ©]û&P,GTJùâýÏf³?¹O‹ª$f¯ÎT¢Lú¨p¼ ’…Šº RB4€R9â«•$/Ry*a}XÌ`–vw‰Å¦<`ù4úzùj5MØë'„?.]ßFa%‰@˜“”WTLG‹JË8ºDÅ XDCÿi¤îNÔ$š‘«ýÉ5«ã;½©ŸKÛ&^Geí²§‹Rˆôï-ã{¨ˆÄ•”º@â) PbŸC»«7¡¾’xAÛ؏¸ Ú¯ì…D’pýïaæßᕳ]p¨ž­bÁ¯ê@ÀÅuxendstream +endobj +5929 0 obj << +/Type /Page +/Contents 5930 0 R +/Resources 5928 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +5931 0 obj << +/D [5929 0 R /XYZ 71.731 729.2652 null] +>> endobj +5932 0 obj << +/D [5929 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5933 0 obj << +/D [5929 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5934 0 obj << +/D [5929 0 R /XYZ 71.731 706.1869 null] +>> endobj +5935 0 obj << +/D [5929 0 R /XYZ 71.731 706.1869 null] +>> endobj +5936 0 obj << +/D [5929 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5937 0 obj << +/D [5929 0 R /XYZ 71.731 688.2541 null] +>> endobj +5938 0 obj << +/D [5929 0 R /XYZ 159.4023 672.4782 null] +>> endobj +5939 0 obj << +/D [5929 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5940 0 obj << +/D [5929 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5941 0 obj << +/D [5929 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5942 0 obj << +/D [5929 0 R /XYZ 71.731 634.4559 null] +>> endobj +5943 0 obj << +/D [5929 0 R /XYZ 71.731 634.4559 null] +>> endobj +5944 0 obj << +/D [5929 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5945 0 obj << +/D [5929 0 R /XYZ 71.731 616.5231 null] +>> endobj +5946 0 obj << +/D [5929 0 R /XYZ 159.4023 600.7472 null] +>> endobj +5947 0 obj << +/D [5929 0 R /XYZ 76.7123 546.9489 null] +>> endobj +5948 0 obj << +/D [5929 0 R /XYZ 129.5143 529.0162 null] +>> endobj +5949 0 obj << +/D [5929 0 R /XYZ 129.5143 529.0162 null] +>> endobj +5950 0 obj << +/D [5929 0 R /XYZ 71.731 526.8593 null] +>> endobj +5951 0 obj << +/D [5929 0 R /XYZ 71.731 526.8593 null] +>> endobj +5952 0 obj << +/D [5929 0 R /XYZ 139.477 511.0834 null] +>> endobj +5953 0 obj << +/D [5929 0 R /XYZ 71.731 473.2254 null] +>> endobj +5954 0 obj << +/D [5929 0 R /XYZ 71.731 460.1744 null] +>> endobj +5955 0 obj << +/D [5929 0 R /XYZ 71.731 458.9291 null] +>> endobj +5956 0 obj << +/D [5929 0 R /XYZ 129.5143 439.8505 null] +>> endobj +5957 0 obj << +/D [5929 0 R /XYZ 71.731 437.6937 null] +>> endobj +5958 0 obj << +/D [5929 0 R /XYZ 71.731 437.6937 null] +>> endobj +5959 0 obj << +/D [5929 0 R /XYZ 139.477 421.9178 null] +>> endobj +5960 0 obj << +/D [5929 0 R /XYZ 139.477 421.9178 null] +>> endobj +5961 0 obj << +/D [5929 0 R /XYZ 71.731 419.761 null] +>> endobj +5962 0 obj << +/D [5929 0 R /XYZ 71.731 419.761 null] +>> endobj +5963 0 obj << +/D [5929 0 R /XYZ 149.4396 403.985 null] +>> endobj +5964 0 obj << +/D [5929 0 R /XYZ 76.7123 386.0523 null] +>> endobj +5965 0 obj << +/D [5929 0 R /XYZ 139.477 368.1195 null] +>> endobj +5966 0 obj << +/D [5929 0 R /XYZ 139.477 368.1195 null] +>> endobj +5967 0 obj << +/D [5929 0 R /XYZ 71.731 365.9627 null] +>> endobj +5968 0 obj << +/D [5929 0 R /XYZ 71.731 365.9627 null] +>> endobj +5969 0 obj << +/D [5929 0 R /XYZ 149.4396 350.1868 null] +>> endobj +5970 0 obj << +/D [5929 0 R /XYZ 76.7123 332.254 null] +>> endobj +5971 0 obj << +/D [5929 0 R /XYZ 139.477 314.3213 null] +>> endobj +5972 0 obj << +/D [5929 0 R /XYZ 139.477 314.3213 null] +>> endobj +5973 0 obj << +/D [5929 0 R /XYZ 71.731 312.1645 null] +>> endobj +5974 0 obj << +/D [5929 0 R /XYZ 139.477 296.3885 null] +>> endobj +5975 0 obj << +/D [5929 0 R /XYZ 139.477 296.3885 null] +>> endobj +5976 0 obj << +/D [5929 0 R /XYZ 71.731 294.2317 null] +>> endobj +5977 0 obj << +/D [5929 0 R /XYZ 139.477 278.4558 null] +>> endobj +5978 0 obj << +/D [5929 0 R /XYZ 139.477 278.4558 null] +>> endobj +5979 0 obj << +/D [5929 0 R /XYZ 71.731 276.2989 null] +>> endobj +5980 0 obj << +/D [5929 0 R /XYZ 71.731 276.2989 null] +>> endobj +5981 0 obj << +/D [5929 0 R /XYZ 149.4396 260.523 null] +>> endobj +5982 0 obj << +/D [5929 0 R /XYZ 76.7123 242.5903 null] +>> endobj +5983 0 obj << +/D [5929 0 R /XYZ 139.477 224.6575 null] +>> endobj +5984 0 obj << +/D [5929 0 R /XYZ 139.477 224.6575 null] +>> endobj +5985 0 obj << +/D [5929 0 R /XYZ 71.731 222.5007 null] +>> endobj +5986 0 obj << +/D [5929 0 R /XYZ 139.477 206.7248 null] +>> endobj +5987 0 obj << +/D [5929 0 R /XYZ 139.477 206.7248 null] +>> endobj +5988 0 obj << +/D [5929 0 R /XYZ 71.731 205.2852 null] +>> endobj +5989 0 obj << +/D [5929 0 R /XYZ 139.477 188.792 null] +>> endobj +5990 0 obj << +/D [5929 0 R /XYZ 139.477 188.792 null] +>> endobj +5991 0 obj << +/D [5929 0 R /XYZ 71.731 186.6352 null] +>> endobj +5992 0 obj << +/D [5929 0 R /XYZ 71.731 186.6352 null] +>> endobj +5993 0 obj << +/D [5929 0 R /XYZ 149.4396 170.8593 null] +>> endobj +5994 0 obj << +/D [5929 0 R /XYZ 76.7123 152.9265 null] +>> endobj +5995 0 obj << +/D [5929 0 R /XYZ 139.477 134.9938 null] +>> endobj +5996 0 obj << +/D [5929 0 R /XYZ 139.477 134.9938 null] +>> endobj +5997 0 obj << +/D [5929 0 R /XYZ 71.731 133.5542 null] +>> endobj +5998 0 obj << +/D [5929 0 R /XYZ 139.477 117.061 null] +>> endobj +5999 0 obj << +/D [5929 0 R /XYZ 139.477 117.061 null] +>> endobj +6000 0 obj << +/D [5929 0 R /XYZ 71.731 114.9042 null] +>> endobj +6001 0 obj << +/D [5929 0 R /XYZ 139.477 99.1283 null] +>> endobj +6002 0 obj << +/D [5929 0 R /XYZ 139.477 99.1283 null] +>> endobj +6003 0 obj << +/D [5929 0 R /XYZ 71.731 96.9714 null] +>> endobj +6004 0 obj << +/D [5929 0 R /XYZ 71.731 96.9714 null] +>> endobj +5928 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6007 0 obj << +/Length 1628 +/Filter /FlateDecode +>> +stream +xÚµYߏ£6~ß¿"‰´q±ÁÆÜ۶׫¶j«ènOªÔ«"¼KR {·ÿ}Ç`æÇ©ªöŽ=ß|3¼òà¯BŒB.$B„Q²:žï¼Õ üë—;¬M¶Úfkýøt÷Ãß[E(b„­žžW~Ä ƒUèÄ)櫧ä¯õO§øR‰b³%Ô[Ô\wiœ‰ê·øÐü|Ø=67¿‹ê”'åæï§_ï~~jýS?D'“ ýˆ#êQ¶ÚES§ö#„!Äâqä~ØÆB¢Uˆ°Šb1f­•Šå !´ °…leÏg¼ö¯7f”ƍR ോCfÕ0Cqà¯XH8wSÔZmm3GôƒÙFÇ\{$ˆœ~ÇÃ7£†8|¾â> ì,t`œãoû2•¯¢¨ ¥ÇÈ1‚eû®©+ ì^WXüMž¯çæGv=LiæÏÍfÞº~Ý`ºVê‡Õ)®ÌÐv²ÒwRŇT?©òæz,D V£©¢¢ æRe™M¥Ê˜Í§ÊáwIªú8Ü©²aèT…+S”!Â9ÿ/™RÿŸ òb˜„s ²Ì¦dÌæäð»$A}îÙ0ÒüEfûC\Š¥ *«Bf/:GŸZŽëd4·—B|ñ<òmœVÌ £hŽVËlŠVc6O«ÃïZû8Ü´Ú0¨ª}S\‰«G…(ðF[Ôûؐg‰®Wy֏¾žDÖ¯o‘Uśþ÷ðҮîäÞ8ÐãÄ1ϒÒL’™´}þãñO=ß%?žÆ³çy( ÂÙ Æ2›Êž1›ÏžÃï’ìõq¸³gÃHãJV×ĵ$Š(‰H7uI~…Îb²'Žò§Ív¦Nã궨1ž)…ƒ¹ÝÁ6›à¹5›åÙåwÏNž;0d¹¿sòèê= áxò<q¦™ÞÕcS]ù¯R¨}»Ym£Ÿf˜ˆs<×Þm³)†Ù<ÿKîãp3løQì{ùý}胒@y!äË ãÈzŽT]ÞlÊfûUÇ Š>×øm³)Ù<á¿Kïãpnè wrxp8 £1²wÂ0i´Éד„.¬†,û)8ˆ4Ï^Êq®áÆÃl®MÛfS\³y®~—pÝÇáæچ…x•j‹ÛgñÙÕ®9œY8¥`Ô$µà¯'ê³lÍ 1†N•5 -qäc¹eaƛŽ͍«#nÈ׿ˆê“ÒD¸;lˆ·¾VN„ˆX…[ujY³pwE^åÕÛE¼kGÜØÐc·Ž:Xވ»:ˆ/õâkuº·¤Ú>¶ ÷j)§ê˜xkmVˆêZdõDš”0 v ß06ú÷¢<òRÉ<›ÂB”2ÒàÿX{3B]7œ¸(ⷞ诊ë±2'ϪXfM½ ø™¶j?¿VqÚJªî9Ï41›<ý®â!sü³w°˜šrƒ×Áϊ(Ë-†Ræ×´º ˓ºcëìÕ èz,E¥á=>/Èjwì$J=kÒãD.àߢÒAH½/@ÄÍÖPêRÊ ®¨›Œ~—nšŒÌ(±Á:¸s\OmÉ´œw¹ú*ÓÔôY{9ˆ¤G;4ȯ½PZ*]±Þ¨À¾©Â~~:e=…Ìx„ž²Úãç²y‰ásü­¹Ñ>ýpýÏUúá€*eøÜ\ۓ¶zVèg÷àU‰5Æl_p«"㨏Pgúz™”ÝãL> 3T.]\[¯L:_îXodqÛúÅkj³³/·Õ«E'Ä +Lõä,³¶ö´­‰h¤F/Xˆ·ù­ºvdz¡t–öè‡4ÍkÁlªì#hërév« 4A©o®egQ]l)šŠ .`·…%Ø è¨ :„‚¨ÅŒ">öÆÌm-«›¦‰B¯Ñ4ý¹F% !È0q9W4fÐDWÐaeƒP{´ƒ0€æHè™÷½·çj¼ê¿ÇXí¼¶åµ?a ÁþŒP´Í&„bk6+]~ŧPìÀx^š/ î—\,ƒ)‰è õÜL×ì×RŒ×-ü”ò¹ÂµÌ¦*ט͗®Ãï’Úíã)^‡-@”øx–õv:dC#Á,¢]ÊZC}æ趻F*ô‚Õ§Ž8L;ùýʲ~¾¢”8öx;“B±ÑQ‡ÿ߂uêendstream +endobj +6006 0 obj << +/Type /Page +/Contents 6007 0 R +/Resources 6005 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +6008 0 obj << +/D [6006 0 R /XYZ 71.731 729.2652 null] +>> endobj +6009 0 obj << +/D [6006 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6010 0 obj << +/D [6006 0 R /XYZ 76.7123 690.4109 null] +>> endobj +6011 0 obj << +/D [6006 0 R /XYZ 139.477 672.4782 null] +>> endobj +6012 0 obj << +/D [6006 0 R /XYZ 139.477 672.4782 null] +>> endobj +6013 0 obj << +/D [6006 0 R /XYZ 71.731 671.0386 null] +>> endobj +6014 0 obj << +/D [6006 0 R /XYZ 139.477 654.5454 null] +>> endobj +6015 0 obj << +/D [6006 0 R /XYZ 139.477 654.5454 null] +>> endobj +6016 0 obj << +/D [6006 0 R /XYZ 71.731 653.1059 null] +>> endobj +6017 0 obj << +/D [6006 0 R /XYZ 139.477 636.6127 null] +>> endobj +6018 0 obj << +/D [6006 0 R /XYZ 139.477 636.6127 null] +>> endobj +6019 0 obj << +/D [6006 0 R /XYZ 71.731 634.4559 null] +>> endobj +6020 0 obj << +/D [6006 0 R /XYZ 139.477 618.6799 null] +>> endobj +6021 0 obj << +/D [6006 0 R /XYZ 139.477 618.6799 null] +>> endobj +6022 0 obj << +/D [6006 0 R /XYZ 71.731 616.5231 null] +>> endobj +6023 0 obj << +/D [6006 0 R /XYZ 139.477 600.7472 null] +>> endobj +6024 0 obj << +/D [6006 0 R /XYZ 139.477 600.7472 null] +>> endobj +6025 0 obj << +/D [6006 0 R /XYZ 71.731 599.3076 null] +>> endobj +6026 0 obj << +/D [6006 0 R /XYZ 139.477 582.8144 null] +>> endobj +6027 0 obj << +/D [6006 0 R /XYZ 139.477 582.8144 null] +>> endobj +6028 0 obj << +/D [6006 0 R /XYZ 71.731 580.6576 null] +>> endobj +6029 0 obj << +/D [6006 0 R /XYZ 139.477 564.8817 null] +>> endobj +6030 0 obj << +/D [6006 0 R /XYZ 139.477 564.8817 null] +>> endobj +6031 0 obj << +/D [6006 0 R /XYZ 71.731 562.7248 null] +>> endobj +6032 0 obj << +/D [6006 0 R /XYZ 139.477 546.9489 null] +>> endobj +6033 0 obj << +/D [6006 0 R /XYZ 139.477 546.9489 null] +>> endobj +6034 0 obj << +/D [6006 0 R /XYZ 71.731 544.7921 null] +>> endobj +6035 0 obj << +/D [6006 0 R /XYZ 139.477 529.0162 null] +>> endobj +6036 0 obj << +/D [6006 0 R /XYZ 139.477 529.0162 null] +>> endobj +882 0 obj << +/D [6006 0 R /XYZ 71.731 506.1021 null] +>> endobj +382 0 obj << +/D [6006 0 R /XYZ 264.6446 460.8478 null] +>> endobj +6037 0 obj << +/D [6006 0 R /XYZ 71.731 440.7074 null] +>> endobj +6038 0 obj << +/D [6006 0 R /XYZ 161.0655 427.9711 null] +>> endobj +6039 0 obj << +/D [6006 0 R /XYZ 71.731 415.8516 null] +>> endobj +6040 0 obj << +/D [6006 0 R /XYZ 71.731 384.822 null] +>> endobj +6041 0 obj << +/D [6006 0 R /XYZ 168.8063 373.4754 null] +>> endobj +6042 0 obj << +/D [6006 0 R /XYZ 71.731 346.412 null] +>> endobj +6043 0 obj << +/D [6006 0 R /XYZ 71.731 295.0212 null] +>> endobj +6044 0 obj << +/D [6006 0 R /XYZ 71.731 251.7834 null] +>> endobj +6045 0 obj << +/D [6006 0 R /XYZ 181.5683 240.7731 null] +>> endobj +6046 0 obj << +/D [6006 0 R /XYZ 71.731 230.7109 null] +>> endobj +6047 0 obj << +/D [6006 0 R /XYZ 71.731 197.2877 null] +>> endobj +6048 0 obj << +/D [6006 0 R /XYZ 71.731 186.1779 null] +>> endobj +6049 0 obj << +/D [6006 0 R /XYZ 71.731 184.9326 null] +>> endobj +6050 0 obj << +/D [6006 0 R /XYZ 129.5143 165.854 null] +>> endobj +6051 0 obj << +/D [6006 0 R /XYZ 129.5143 165.854 null] +>> endobj +6052 0 obj << +/D [6006 0 R /XYZ 71.731 164.4145 null] +>> endobj +6053 0 obj << +/D [6006 0 R /XYZ 71.731 164.4145 null] +>> endobj +6054 0 obj << +/D [6006 0 R /XYZ 139.477 147.9213 null] +>> endobj +6055 0 obj << +/D [6006 0 R /XYZ 139.477 147.9213 null] +>> endobj +6056 0 obj << +/D [6006 0 R /XYZ 76.7123 129.9885 null] +>> endobj +6057 0 obj << +/D [6006 0 R /XYZ 129.5143 112.0558 null] +>> endobj +6058 0 obj << +/D [6006 0 R /XYZ 129.5143 112.0558 null] +>> endobj +6059 0 obj << +/D [6006 0 R /XYZ 71.731 109.899 null] +>> endobj +6060 0 obj << +/D [6006 0 R /XYZ 71.731 109.899 null] +>> endobj +6005 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6063 0 obj << +/Length 1341 +/Filter /FlateDecode +>> +stream +xÚÍZ]oÛ6}ϯУ Ì¿?úÖ Û°a +ÌoëP¨¶“°åÀV2ôߏšD™²®xÙÖ†‘“ëžsIFfõ_¬0Œá/Ü®/6‡;Z<ø?ýrÇzȪǬbÐë»ï´pÄi®‹õ}!œ&ÊÈÂN¬b¶XoÿZüøX>5»ÓrÅ]pÒ]ßïËz×ü^~ê~|ûþ×îÅ»]óxܞ—¯»ûi=ÔWÂg}‘$II-‘ÚŠbÅ)qœ)Åü-“e<^Ha†ÁpWÂځúÁ ¸֎æçêšóÃ¥\º"¾a¨{}½ðïy\DeÂi̘Fy:•Ÿ;Ɏ÷ݵª›ïºWî«Í®{Y6Í©ú´ätñÜô¿ª¶»º©>PÊý¤\$ŒY;J$£Q0†%`¨‚PÝ !SG4ÎÍéy{;•©hß…›î¯vb­b Ðõ½fõ‘Ìûßh°ê¼>á]SÂÖë£å4¤§á³;æQ—‡]ËãJL. m+´7T^ʪ~èÝØ0h› -W’(©$,h@­b èän³’*/Ž¢¬;/ixÈ#²œò<(cY)m>?õ¯Â<À¢ M4ã-‚¥D 0\4 nŽhH´˜Ç¬“n¡c ¥ÄHƒ…9B%ÂPx˜ª9a¾¦1æ˜Ç¹écµ-±ÖØq¤ýb‚æ¹ÅÌùRY¿` s Kør€¡¾„êføâørÄ\o“‹ë0-½ä m K‰`¸8@Ýq81ÜýIR¯>PÊo#(ÓH8cÔ|8N¨jF8'4àpŽxtá욗o\pL#Ú꧔1B­@SÁRF 0܈@Ý#< #Æ@ݜ‰x@óHv‘ÿãÜô½‚J„fH߉Qó}g@¡}ªšÑw&4à¾3â±Ý7§ê©©Ž5ÔwÑÚoý^á_Lq"¹ÅºO K˜~€¡¦‡êf˜â˜~Ä㫞]M¬D:…5Œ–Ò.Àp퀺9Ú< íb·z䖐³ÿ@‰´Ä2풟9‰0ӏœ(Š‰áN-gf?@ü‰ð´endstream +endobj +6062 0 obj << +/Type /Page +/Contents 6063 0 R +/Resources 6061 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +6064 0 obj << +/D [6062 0 R /XYZ 71.731 729.2652 null] +>> endobj +6065 0 obj << +/D [6062 0 R /XYZ 139.477 708.3437 null] +>> endobj +6066 0 obj << +/D [6062 0 R /XYZ 71.731 706.1869 null] +>> endobj +6067 0 obj << +/D [6062 0 R /XYZ 139.477 690.4109 null] +>> endobj +6068 0 obj << +/D [6062 0 R /XYZ 71.731 688.9714 null] +>> endobj +6069 0 obj << +/D [6062 0 R /XYZ 71.731 688.9714 null] +>> endobj +6070 0 obj << +/D [6062 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6071 0 obj << +/D [6062 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6072 0 obj << +/D [6062 0 R /XYZ 71.731 670.3214 null] +>> endobj +6073 0 obj << +/D [6062 0 R /XYZ 71.731 670.3214 null] +>> endobj +6074 0 obj << +/D [6062 0 R /XYZ 159.4023 654.5454 null] +>> endobj +6075 0 obj << +/D [6062 0 R /XYZ 71.731 652.3886 null] +>> endobj +6076 0 obj << +/D [6062 0 R /XYZ 159.4023 636.6127 null] +>> endobj +6077 0 obj << +/D [6062 0 R /XYZ 76.7123 618.6799 null] +>> endobj +6078 0 obj << +/D [6062 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6079 0 obj << +/D [6062 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6080 0 obj << +/D [6062 0 R /XYZ 71.731 598.5904 null] +>> endobj +6081 0 obj << +/D [6062 0 R /XYZ 71.731 598.5904 null] +>> endobj +6082 0 obj << +/D [6062 0 R /XYZ 159.4023 582.8144 null] +>> endobj +6083 0 obj << +/D [6062 0 R /XYZ 71.731 581.3749 null] +>> endobj +6084 0 obj << +/D [6062 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6085 0 obj << +/D [6062 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6086 0 obj << +/D [6062 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6087 0 obj << +/D [6062 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6088 0 obj << +/D [6062 0 R /XYZ 71.731 526.8593 null] +>> endobj +6089 0 obj << +/D [6062 0 R /XYZ 71.731 526.8593 null] +>> endobj +6090 0 obj << +/D [6062 0 R /XYZ 159.4023 511.0834 null] +>> endobj +6091 0 obj << +/D [6062 0 R /XYZ 71.731 509.6439 null] +>> endobj +6092 0 obj << +/D [6062 0 R /XYZ 159.4023 493.1507 null] +>> endobj +6093 0 obj << +/D [6062 0 R /XYZ 76.7123 475.2179 null] +>> endobj +6094 0 obj << +/D [6062 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6095 0 obj << +/D [6062 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6096 0 obj << +/D [6062 0 R /XYZ 71.731 455.1283 null] +>> endobj +6097 0 obj << +/D [6062 0 R /XYZ 71.731 455.1283 null] +>> endobj +6098 0 obj << +/D [6062 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6099 0 obj << +/D [6062 0 R /XYZ 71.731 437.1956 null] +>> endobj +6100 0 obj << +/D [6062 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6101 0 obj << +/D [6062 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6102 0 obj << +/D [6062 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6103 0 obj << +/D [6062 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6104 0 obj << +/D [6062 0 R /XYZ 71.731 383.3973 null] +>> endobj +6105 0 obj << +/D [6062 0 R /XYZ 71.731 383.3973 null] +>> endobj +6106 0 obj << +/D [6062 0 R /XYZ 159.4023 367.6214 null] +>> endobj +6107 0 obj << +/D [6062 0 R /XYZ 71.731 365.4646 null] +>> endobj +6108 0 obj << +/D [6062 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6109 0 obj << +/D [6062 0 R /XYZ 76.7123 331.7559 null] +>> endobj +6110 0 obj << +/D [6062 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6111 0 obj << +/D [6062 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6112 0 obj << +/D [6062 0 R /XYZ 71.731 311.6663 null] +>> endobj +6113 0 obj << +/D [6062 0 R /XYZ 71.731 311.6663 null] +>> endobj +6114 0 obj << +/D [6062 0 R /XYZ 159.4023 295.8904 null] +>> endobj +6115 0 obj << +/D [6062 0 R /XYZ 71.731 294.4508 null] +>> endobj +6116 0 obj << +/D [6062 0 R /XYZ 159.4023 277.9576 null] +>> endobj +6117 0 obj << +/D [6062 0 R /XYZ 76.7123 260.0249 null] +>> endobj +6118 0 obj << +/D [6062 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6119 0 obj << +/D [6062 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6120 0 obj << +/D [6062 0 R /XYZ 71.731 239.9353 null] +>> endobj +6121 0 obj << +/D [6062 0 R /XYZ 71.731 239.9353 null] +>> endobj +6122 0 obj << +/D [6062 0 R /XYZ 159.4023 224.1594 null] +>> endobj +6123 0 obj << +/D [6062 0 R /XYZ 71.731 222.0026 null] +>> endobj +6124 0 obj << +/D [6062 0 R /XYZ 159.4023 206.2266 null] +>> endobj +6125 0 obj << +/D [6062 0 R /XYZ 76.7123 188.2939 null] +>> endobj +6126 0 obj << +/D [6062 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6127 0 obj << +/D [6062 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6128 0 obj << +/D [6062 0 R /XYZ 71.731 168.2043 null] +>> endobj +6129 0 obj << +/D [6062 0 R /XYZ 71.731 168.2043 null] +>> endobj +6130 0 obj << +/D [6062 0 R /XYZ 159.4023 152.4284 null] +>> endobj +6131 0 obj << +/D [6062 0 R /XYZ 71.731 150.2715 null] +>> endobj +6132 0 obj << +/D [6062 0 R /XYZ 159.4023 134.4956 null] +>> endobj +6061 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6135 0 obj << +/Length 1369 +/Filter /FlateDecode +>> +stream +xÚ­X]o£8}ï¯à1‘/66¶ûÖýÍjfUÍæmgUф6H" Í¿ßklæcG«>@ÊÁ÷øÜc›{qÂ8F<‚ ‘ˆÄŒ‡ó]¼Á£wØ@v³sA?ïï~ú= +‰dLâ`ÿD2FŒÓ€G †E°?þ½ùå”\š´Úî 7éëSžió)yÑ?Ÿ>ê›Ïis*õöŸýw¿í»ø,âH +2K’bhÊ` ˆO#/ +c‰Ã<ØÅ2DÞN†Èâð«Ét¸¦fó•6d‡ AÅ$p´q‡×û֘G$¢Æ´åSf&ÓãQ¥Íµ*ž_³4×rµìo©àQ""¥ÐZݤª’ïۘmîõïOYÝè»òU_¿†!iGl5¥¾ê`ãi[b*þ¤t¨ »É•¯zÓ´°I¹Á]!¡ÒwZnû–—ÇM8IxÊû4ê¦ÊŠ7E,a0"JÖ¾´ +Õ#®‰BŒe‹–t`s–´°eKzâ®±¤‡‡£Q—+—‡vWÏN ÛõÐL‡‰EƜ7Ž ›1N[4Ž/î +ãŒxôש1NF‘œSÏê$…¡”ýÕ©Mf–æ_yvHͪmàÁ˖„›kcþÕ|¿˜;À¯oÌPÄ¥XÒׁÍékaËúzâ®ÑwÈï¯K£V2=gGÆ”!!¸èkœÍXàì˜MÖn}Õ´–”#J9^ÒҁÍiiaËZzâ®ÑrÈï¥KCk©ÝNó«*%ŠE¼BTk×élotv`s:ۛe=q×è<äá×Ù¥ñžäWï¦ Q$$ÿáMá}KØƎí×cÄ^Üo؜¶¶¬­'îm‡<üÚº4nîU[䄅)ŠÂÿ˜‡o;ï*7S¡˜Š¥؅Í(ÞÁ÷Å]¡øˆ‡Wñ¢<*9Ûªw0ãN=#< e7’â*ÅdßÝð_i³£qendstream +endobj +6134 0 obj << +/Type /Page +/Contents 6135 0 R +/Resources 6133 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6136 0 obj << +/D [6134 0 R /XYZ 71.731 729.2652 null] +>> endobj +6137 0 obj << +/D [6134 0 R /XYZ 76.7123 708.3437 null] +>> endobj +6138 0 obj << +/D [6134 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6139 0 obj << +/D [6134 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6140 0 obj << +/D [6134 0 R /XYZ 71.731 688.2541 null] +>> endobj +6141 0 obj << +/D [6134 0 R /XYZ 71.731 688.2541 null] +>> endobj +6142 0 obj << +/D [6134 0 R /XYZ 139.477 672.4782 null] +>> endobj +6143 0 obj << +/D [6134 0 R /XYZ 71.731 634.6202 null] +>> endobj +6144 0 obj << +/D [6134 0 R /XYZ 71.731 621.5692 null] +>> endobj +6145 0 obj << +/D [6134 0 R /XYZ 71.731 620.3239 null] +>> endobj +6146 0 obj << +/D [6134 0 R /XYZ 129.5143 601.2453 null] +>> endobj +6147 0 obj << +/D [6134 0 R /XYZ 71.731 599.0885 null] +>> endobj +6148 0 obj << +/D [6134 0 R /XYZ 71.731 599.0885 null] +>> endobj +6149 0 obj << +/D [6134 0 R /XYZ 139.477 583.3126 null] +>> endobj +6150 0 obj << +/D [6134 0 R /XYZ 139.477 583.3126 null] +>> endobj +6151 0 obj << +/D [6134 0 R /XYZ 71.731 581.1557 null] +>> endobj +6152 0 obj << +/D [6134 0 R /XYZ 139.477 565.3798 null] +>> endobj +6153 0 obj << +/D [6134 0 R /XYZ 139.477 565.3798 null] +>> endobj +6154 0 obj << +/D [6134 0 R /XYZ 71.731 563.9403 null] +>> endobj +6155 0 obj << +/D [6134 0 R /XYZ 139.477 547.4471 null] +>> endobj +6156 0 obj << +/D [6134 0 R /XYZ 139.477 547.4471 null] +>> endobj +6157 0 obj << +/D [6134 0 R /XYZ 71.731 546.0075 null] +>> endobj +6158 0 obj << +/D [6134 0 R /XYZ 139.477 529.5143 null] +>> endobj +6159 0 obj << +/D [6134 0 R /XYZ 139.477 529.5143 null] +>> endobj +6160 0 obj << +/D [6134 0 R /XYZ 71.731 527.3575 null] +>> endobj +6161 0 obj << +/D [6134 0 R /XYZ 139.477 511.5816 null] +>> endobj +6162 0 obj << +/D [6134 0 R /XYZ 139.477 511.5816 null] +>> endobj +6163 0 obj << +/D [6134 0 R /XYZ 71.731 509.4247 null] +>> endobj +6164 0 obj << +/D [6134 0 R /XYZ 139.477 493.6488 null] +>> endobj +6165 0 obj << +/D [6134 0 R /XYZ 139.477 493.6488 null] +>> endobj +6166 0 obj << +/D [6134 0 R /XYZ 71.731 492.2093 null] +>> endobj +6167 0 obj << +/D [6134 0 R /XYZ 139.477 475.716 null] +>> endobj +6168 0 obj << +/D [6134 0 R /XYZ 139.477 475.716 null] +>> endobj +6169 0 obj << +/D [6134 0 R /XYZ 71.731 473.5592 null] +>> endobj +6170 0 obj << +/D [6134 0 R /XYZ 139.477 457.7833 null] +>> endobj +6171 0 obj << +/D [6134 0 R /XYZ 139.477 457.7833 null] +>> endobj +883 0 obj << +/D [6134 0 R /XYZ 71.731 434.8692 null] +>> endobj +386 0 obj << +/D [6134 0 R /XYZ 303.7923 389.6149 null] +>> endobj +6172 0 obj << +/D [6134 0 R /XYZ 71.731 366.1261 null] +>> endobj +6173 0 obj << +/D [6134 0 R /XYZ 161.0655 356.7382 null] +>> endobj +6174 0 obj << +/D [6134 0 R /XYZ 71.731 344.6187 null] +>> endobj +6175 0 obj << +/D [6134 0 R /XYZ 71.731 313.2529 null] +>> endobj +6176 0 obj << +/D [6134 0 R /XYZ 168.8063 302.2426 null] +>> endobj +6177 0 obj << +/D [6134 0 R /XYZ 71.731 290.1231 null] +>> endobj +6178 0 obj << +/D [6134 0 R /XYZ 71.731 235.4446 null] +>> endobj +6179 0 obj << +/D [6134 0 R /XYZ 181.5683 224.4344 null] +>> endobj +6180 0 obj << +/D [6134 0 R /XYZ 71.731 214.3722 null] +>> endobj +6181 0 obj << +/D [6134 0 R /XYZ 71.731 180.949 null] +>> endobj +6182 0 obj << +/D [6134 0 R /XYZ 71.731 169.8392 null] +>> endobj +6183 0 obj << +/D [6134 0 R /XYZ 71.731 168.5938 null] +>> endobj +6184 0 obj << +/D [6134 0 R /XYZ 129.5143 149.5153 null] +>> endobj +6185 0 obj << +/D [6134 0 R /XYZ 129.5143 149.5153 null] +>> endobj +6186 0 obj << +/D [6134 0 R /XYZ 71.731 148.0758 null] +>> endobj +6187 0 obj << +/D [6134 0 R /XYZ 71.731 148.0758 null] +>> endobj +6188 0 obj << +/D [6134 0 R /XYZ 139.477 131.5826 null] +>> endobj +6189 0 obj << +/D [6134 0 R /XYZ 139.477 131.5826 null] +>> endobj +6190 0 obj << +/D [6134 0 R /XYZ 76.7123 113.6498 null] +>> endobj +6133 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6194 0 obj << +/Length 1345 +/Filter /FlateDecode +>> +stream +xÚÍZ]oÛ6}ϯÐcÌ?E²oÝ° Z Xó¶ê(‰GlCÿý(‹”¯¤+’-\ ÈƒûH÷ðÜs¯¨k³‚º?VhF´pn //¶ÏW´xtýqÅÜl¸¢×œ Ç»ª­»wÕçáß·þ^¼¯»§ýýñæßÛ¿®~»ã+¡‰5.H”¤d†HAm±á”XΊbÌ¥˜v‹¡†)ô¸n GSÖ/fč°~5Ÿ8WsvŒs`¼€ qçÇ3p֒‡0…q¢–òÄÃ-Y1)¦<ª®;4Ÿ_»ú®ûòRß=4»^cG촊sJSD«]Ìþ´7ƒÌÕáP}^î†cÓvþ Ÿª£ Ð>.Þ{ÝvËõ{†¥¥D2—T÷€Ú@ØYwÖ ®w„­êîlF¹´hÜuÝÃY( œ°Dj=¥ñÂ-ÈúËiîŽwpm +‘h~­U…$su£K4êºBá,”PH:®æ§<œ? B|Ü5ÛÚîd×N¯e‡·zßzïë¶k>QÊ £²)I”T2!@Ed ¨´lHÔÙ˜lÇàš¯T®­žëõjtí°Ô6Y«ÆKW#7§H5BC;òš½] +Õ[*ôEÔT”-uª*bª€J› +‰šcª9é]b4ä1»K4÷ÈÂJ"hɧ7ˆES[i|‹5zʸ“+åPC¤]\mU[åTR”£q×µ g¡<€÷”ãA¹˜ò¸pŸ×ZJb Ó)å,¦\€¥•Câæ(‡ðÀ”ƒ
+ Authentication + + The API should be accessed via XML-RPC over HTTPS. The API + supports the standard introspection calls system.listMethods, system.methodSignature, + and system.methodHelp, + and the standard batching call system.multicall. With the + exception of these calls, all PLCAPI calls take an + authentication structure as their first argument. All + authentication structures require the specification of + AuthMethod. If the documentation for a + call does not further specify the authentication structure, then + any of (but only) the following authentication structures may be + used: + + + + Session authentication. User sessions are typically + valid for 24 hours. Node sessions are valid until the next + reboot. Obtain a session key with GetSession using another form of + authentication, such as password or GnuPG + authentication. + + + + AuthMethodsession + sessionSession key + + + + + + Password authentication. + + + + AuthMethodpassword + UsernameUsername, typically an e-mail address + AuthStringAuthentication string, typically a password + + + + + + GnuPG authentication. Users may upload a GPG public key + using AddPersonKey. Peer + GPG keys should be added with AddPeer or UpdatePeer. + + + + + AuthMethodgpg + namePeer or user name + signatureGnuPG signature of + the canonicalized + XML-RPC + representation of the rest of the arguments to the + call. + + + + + + Anonymous authentication. + + + + AuthMethodanonymous + + + + + +
+ +
+ Roles + + Some functions may only be called by users with certain + roles (see GetRoles), and others + may return different information to different callers depending + on the role(s) of the caller. + + The node and + anonymous roles are pseudo-roles. A function + that allows the node role may be called by + automated scripts running on a node, such as the Boot and Node + Managers. A function that allows the + anonymous role may be called by anyone; an + API authentication structure must still be specified (see ). +
+ +
+ Filters + + Most of the Get functions take a + filter argument. Filters may be arrays of integer (and sometimes + string) identifiers, or a struct representing a filter on the + attributes of the entities being queried. For example, + + +# plcsh code fragment (see below) +GetNodes([1,2,3]) +GetNodes({'node_id': [1,2,3]}) +GetNodes({'node_id': 1}) + GetNodes({'node_id': 2}) + GetNodes({'node_id': 3}) + + + Would all be equivalent queries. Attributes that are + themselves arrays (such as nodenetwork_ids + and slice_ids for nodes) cannot be used in + filters. +
+ +
+ PlanetLab shell + + A command-line program called plcsh + simplifies authentication structure handling, and is useful for + scripting. This program is distributed as a Linux RPM called + PLCAPI and requires Python ≥2.4. + + +usage: plcsh [options] + +options: + -f CONFIG, --config=CONFIG + PLC configuration file + -h URL, --url=URL API URL + -c CACERT, --cacert=CACERT + API SSL certificate + -k INSECURE, --insecure=INSECURE + Do not check SSL certificate + -m METHOD, --method=METHOD + API authentication method + -s SESSION, --session=SESSION + API session key + -u USER, --user=USER API user name + -p PASSWORD, --password=PASSWORD + API password + -r ROLE, --role=ROLE API role + -x, --xmlrpc Use XML-RPC interface + --help show this help message and exit + + + Specify at least the API URL and your user name: + + +plcsh --url https://www.planet-lab.org/PLCAPI/ -u user@site.edu + + + You will be presented with a prompt. From here, you can + invoke API calls and omit the authentication structure, as it will + be filled in automatically. + + +user@site.edu connected using password authentication +Type "system.listMethods()" or "help(method)" for more information. +[user@site.edu]>>> AuthCheck() +1 +[user@site.edu]>>> GetNodes([121], ['node_id', 'hostname']) +[{'node_id': 121, 'hostname': 'planetlab-1.cs.princeton.edu'}] + + + As this program is actually a Python interpreter, you may + create variables, execute for loops, import other packages, etc., + directly on the command line as you would using the regular Python + shell. + + To use plcsh programmatically, import + the PLC.Shell module: + + +#!/usr/bin/python + +import sys + +# Default location that the PLCAPI RPM installs the PLC class +sys.path.append('/usr/share/plc_api') + +# Initialize shell environment. Shell() will define all PLCAPI methods +# in the specified namespace (specifying globals() will define them +# globally). +from PLC.Shell import Shell +plc = Shell(globals(), + url = "https://www.planet-lab.org/PLCAPI/", + user = "user@site.edu", + password = "password") + +# Both are equivalent +nodes = GetNodes([121], ['node_id', 'hostname']) +nodes = plc.GetNodes([121], ['node_id', 'hostname']) + +
+ + + + PlanetLab API Methods + + + &Methods; + + + + + + + diff --git a/migrations/001-down-subversion.sql b/migrations/001-down-subversion.sql new file mode 100644 index 0000000..5e3255c --- /dev/null +++ b/migrations/001-down-subversion.sql @@ -0,0 +1,3 @@ +-- you may also write downgrader scripts, though they are not - yet - supported + +ALTER TABLE plc_db_version DROP subversion; diff --git a/migrations/001-up-subversion.sql b/migrations/001-up-subversion.sql new file mode 100644 index 0000000..01046a5 --- /dev/null +++ b/migrations/001-up-subversion.sql @@ -0,0 +1,5 @@ +-- Add plc_db_version.subversion field +ALTER TABLE plc_db_version ADD subversion integer NOT NULL DEFAULT 0; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 1; diff --git a/migrations/002-up-slices.sql b/migrations/002-up-slices.sql new file mode 100644 index 0000000..4bf656d --- /dev/null +++ b/migrations/002-up-slices.sql @@ -0,0 +1,6 @@ +-- Remove NOT NULL constraint from creator_person_id in case the +-- creator is deleted. +ALTER TABLE slices ALTER creator_person_id DROP NOT NULL; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 2; diff --git a/migrations/003-down-network-settings.sql b/migrations/003-down-network-settings.sql new file mode 100644 index 0000000..796e4b4 --- /dev/null +++ b/migrations/003-down-network-settings.sql @@ -0,0 +1,24 @@ +-- IMPORTANT NOTICE +-- +-- this down script is provided for convenience only +-- DO NOT USE on an operational site +-- the change in migration 003 involves creating +-- the new view view_nodenetworks for fetching instances +-- of NodeNetworks +-- AND to alter NodeNetworks.py accordingly +-- so this change cannot be easily undone +-- unless you also revert the API itself + +DROP VIEW view_nodenetworks; + +DROP VIEW view_nodenetwork_settings; + +DROP VIEW nodenetwork_settings; + +DROP TABLE nodenetwork_setting; + +DROP TABLE nodenetwork_setting_types; + +-- deflate subversion +UPDATE plc_db_version SET subversion = 2; +SELECT subversion from plc_db_version; diff --git a/migrations/003-test.py b/migrations/003-test.py new file mode 100755 index 0000000..aed650b --- /dev/null +++ b/migrations/003-test.py @@ -0,0 +1,60 @@ +#!/usr/bin/env plcsh + +nnst = GetNodeNetworkSettingTypes(['interface_name']) +if nnst: + print 'NodeNetworkSettingType interface_name already defined' +else: + AddNodeNetworkSettingType({ + 'category':'general', + 'min_role_id':30, + 'name':'interface_name', + 'description':'allows to specify a custom interface name' + }) +nnst_ifname_id = GetNodeNetworkSettingTypes(['interface_name'])[0]['nodenetwork_setting_type_id'] + + +nnst = GetNodeNetworkSettingTypes(['ssid']) +if nnst: + print 'NodeNetworkSettingType ssid already defined' +else: + AddNodeNetworkSettingType({ + 'category':'wifi', + 'min_role_id':30, + 'name':'ssid', + 'description':'allows to set ESSID' + }) +nnst_ssid_id = GetNodeNetworkSettingTypes(['ssid'])[0]['nodenetwork_setting_type_id'] + +nodename = 'onelab2.inria.fr' + +nodenetwork_id=GetNodes(nodename)[0]['nodenetwork_ids'][0] + +####### +nns_ifname = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ifname_id}) +if nns_ifname: + print "interface name for %s already set (got %s - cat=%s)" %\ + (nodename,nns_ifname[0]['value'],nns_ifname[0]['category']) +else: + AddNodeNetworkSetting(nodenetwork_id, 'interface_name', 'custom-eth0') + +nns_ifname_id = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ifname_id})[0]['nodenetwork_setting_id'] +####### +nns_ssid = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ssid_id}) +if nns_ssid: + print "ssid for %s already set (got %s - cat=%s)" %\ + (nodename,nns_ifname[0]['value'],nns_ifname[0]['category']) +else: + AddNodeNetworkSetting(nodenetwork_id, 'ssid', 'init-onelab-g') + +nns_ssid_id = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ssid_id})[0]['nodenetwork_setting_id'] + +####### + +UpdateNodeNetworkSetting (nns_ssid_id,'onelab-g') + +DeleteNodeNetworkSetting (nns_ifname_id) + diff --git a/migrations/003-up-network-settings.sql b/migrations/003-up-network-settings.sql new file mode 100644 index 0000000..64b0ff6 --- /dev/null +++ b/migrations/003-up-network-settings.sql @@ -0,0 +1,86 @@ +-- +-- Thierry Parmentelat -- INRIA +-- +-- migration 003 +-- +-- purpose : provide a generic mechanism for assigning +-- nodenetworks (read, network interfaces) with +-- custom settings +-- +-- design +-- mimicks the way slice attributes are being handled, +-- not that this design is particularly attractive +-- but let's not add confusion here +-- i.e: +-- (*) nodenetwork_setting_types (see slice_attribute_types) +-- allows to define a new setting +-- e.g, define one such object for storing wifi SSID +-- +-- (*) nodenetwork_setting (see slice_attribute) +-- allow to associate a nodenetwork, a nodenetwork_setting_type, and a value +-- +-- NOTE. with slice_attributes there is a trick that allows to define +-- the attribute either on the slice globally or on a particular node only. +-- of course we do not need such a trick + +CREATE TABLE nodenetwork_setting_types ( + nodenetwork_setting_type_id serial PRIMARY KEY, + -- Setting Type Identifier + name text UNIQUE NOT NULL, -- Setting Name + description text, -- Optional Description + category text NOT NULL, -- Category, e.g. Wifi, or whatever + min_role_id integer references roles -- If set, minimal role required +) WITH OIDS; + +CREATE TABLE nodenetwork_setting ( + nodenetwork_setting_id serial PRIMARY KEY, -- Nodenetwork Setting Identifier + nodenetwork_id integer REFERENCES nodenetworks NOT NULL, + -- the nodenetwork this applies to + nodenetwork_setting_type_id integer REFERENCES nodenetwork_setting_types NOT NULL, + -- the setting type + value text +) WITH OIDS; + + +CREATE OR REPLACE VIEW nodenetwork_settings AS +SELECT nodenetwork_id, +array_accum(nodenetwork_setting_id) AS nodenetwork_setting_ids +FROM nodenetwork_setting +GROUP BY nodenetwork_id; + +CREATE OR REPLACE VIEW view_nodenetwork_settings AS +SELECT +nodenetwork_setting.nodenetwork_setting_id, +nodenetwork_setting.nodenetwork_id, +nodenetwork_setting_types.nodenetwork_setting_type_id, +nodenetwork_setting_types.name, +nodenetwork_setting_types.description, +nodenetwork_setting_types.category, +nodenetwork_setting_types.min_role_id, +nodenetwork_setting.value +FROM nodenetwork_setting +INNER JOIN nodenetwork_setting_types USING (nodenetwork_setting_type_id); + +CREATE VIEW view_nodenetworks AS +SELECT +nodenetworks.nodenetwork_id, +nodenetworks.node_id, +nodenetworks.is_primary, +nodenetworks.type, +nodenetworks.method, +nodenetworks.ip, +nodenetworks.mac, +nodenetworks.gateway, +nodenetworks.network, +nodenetworks.broadcast, +nodenetworks.netmask, +nodenetworks.dns1, +nodenetworks.dns2, +nodenetworks.bwlimit, +nodenetworks.hostname, +COALESCE((SELECT nodenetwork_setting_ids FROM nodenetwork_settings WHERE nodenetwork_settings.nodenetwork_id = nodenetworks.nodenetwork_id), '{}') AS nodenetwork_setting_ids +FROM nodenetworks; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 3; +SELECT subversion from plc_db_version; diff --git a/migrations/004-up-fix-site-nodes.sql b/migrations/004-up-fix-site-nodes.sql new file mode 100644 index 0000000..8bc9c58 --- /dev/null +++ b/migrations/004-up-fix-site-nodes.sql @@ -0,0 +1,16 @@ +-- +-- bugfix +-- the site_nodes should restrict to nodes where deleted is false +-- + +CREATE OR REPLACE VIEW site_nodes AS +SELECT site_id, +array_accum(node_id) AS node_ids +FROM nodes +WHERE deleted is false +GROUP BY site_id; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 4; +SELECT subversion from plc_db_version; + diff --git a/migrations/005-down-import-apr-2007.sql b/migrations/005-down-import-apr-2007.sql new file mode 100644 index 0000000..fa16b12 --- /dev/null +++ b/migrations/005-down-import-apr-2007.sql @@ -0,0 +1,112 @@ +-- revert migration 005 +-- +-- this is a rather complex example, so for next times, make sure that you +-- * first restore old columns or tables +-- * then create or replace views +-- * and only finally drop new columns and tables +-- otherwise the columns may refuse to get dropped if they are still used by views +-- + +---------- creations + +ALTER TABLE events ADD object_type text NOT NULL Default 'Unknown'; + +---------- view changes + +-- for some reason these views require to be dropped first +DROP VIEW view_events; +DROP VIEW event_objects; +DROP VIEW view_nodes; +DROP VIEW view_sites; + +CREATE OR REPLACE VIEW event_objects AS +SELECT event_id, +array_accum(object_id) AS object_ids +FROM event_object +GROUP BY event_id; + +CREATE OR REPLACE VIEW view_events AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.fault_code, +events.call_name, +events.call, +events.object_type, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +COALESCE((SELECT object_ids FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_ids +FROM events; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +CREATE OR REPLACE VIEW view_sites AS +SELECT +sites.site_id, +sites.login_base, +sites.name, +sites.abbreviated_name, +sites.deleted, +sites.enabled, +sites.is_public, +sites.max_slices, +sites.max_slivers, +sites.latitude, +sites.longitude, +sites.url, +CAST(date_part('epoch', sites.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', sites.last_updated) AS bigint) AS last_updated, +peer_site.peer_id, +peer_site.peer_site_id, +COALESCE((SELECT person_ids FROM site_persons WHERE site_persons.site_id = sites.site_id), '{}') AS person_ids, +COALESCE((SELECT node_ids FROM site_nodes WHERE site_nodes.site_id = sites.site_id), '{}') AS node_ids, +COALESCE((SELECT address_ids FROM site_addresses WHERE site_addresses.site_id = sites.site_id), '{}') AS address_ids, +COALESCE((SELECT slice_ids FROM site_slices WHERE site_slices.site_id = sites.site_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM site_pcus WHERE site_pcus.site_id = sites.site_id), '{}') AS pcu_ids +FROM sites +LEFT JOIN peer_site USING (site_id); + +---------- deletions + +ALTER TABLE sites DROP COLUMN ext_consortium_id; + +ALTER TABLE nodes DROP COLUMN last_contact; + +DROP INDEX initscripts_name_idx; +DROP TABLE initscripts; + +ALTER TABLE events DROP COLUMN auth_type; + +ALTER TABLE event_object DROP COLUMN object_type; + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 4; +SELECT subversion from plc_db_version; diff --git a/migrations/005-up-import-apr-2007.sql b/migrations/005-up-import-apr-2007.sql new file mode 100644 index 0000000..3a34f25 --- /dev/null +++ b/migrations/005-up-import-apr-2007.sql @@ -0,0 +1,154 @@ +-- +-- to apply changes from import done in april 2007 from the +-- planetlab-4_0-branch tag +-- +-- this is a rather complex example, so for next times, make sure that you +-- * first add new columns and new tables +-- * then create or replace views +-- * and only finally drop columns +-- otherwise the columns may refuse to get dropped if they are still used by views +-- + +---------- creations + +ALTER TABLE sites ADD ext_consortium_id integer; + +ALTER TABLE nodes ADD last_contact timestamp without time zone; + +-- Initscripts +CREATE TABLE initscripts ( + initscript_id serial PRIMARY KEY, -- Initscript identifier + name text NOT NULL, -- Initscript name + enabled bool NOT NULL DEFAULT true, -- Initscript is active + script text NOT NULL, -- Initscript + UNIQUE (name) +) WITH OIDS; +CREATE INDEX initscripts_name_idx ON initscripts (name); + +-- rather drop the tables altogether, +-- ALTER TABLE events ADD auth_type text; +-- ALTER TABLE event_object ADD COLUMN object_type text NOT NULL Default 'Unknown'; +-- CREATE INDEX event_object_object_type_idx ON event_object (object_type); + +-- for some reason these views require to be dropped first +DROP VIEW view_events; +DROP VIEW event_objects; +DROP VIEW view_nodes; +DROP VIEW view_sites; + +----dropping tables must be preceded by dropping views using those tables +----otherwise dependency problems +DROP TABLE event_object; +DROP TABLE events; + +CREATE TABLE events ( + event_id serial PRIMARY KEY, -- Event identifier + person_id integer REFERENCES persons, -- Person responsible for event, if any + node_id integer REFERENCES nodes, -- Node responsible for event, if any + auth_type text, -- Type of auth used. i.e. AuthMethod + fault_code integer NOT NULL DEFAULT 0, -- Did this event result in error + call_name text NOT NULL, -- Call responsible for this event + call text NOT NULL, -- Call responsible for this event, including parameters + message text, -- High level description of this event + runtime float DEFAULT 0, -- Event run time + time timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP -- Event timestamp +) WITH OIDS; + +-- Database object(s) that may have been affected by a particular event +CREATE TABLE event_object ( + event_id integer REFERENCES events NOT NULL, -- Event identifier + object_id integer NOT NULL, -- Object identifier + object_type text NOT NULL Default 'Unknown' -- What type of object is this event affecting +) WITH OIDS; +CREATE INDEX event_object_event_id_idx ON event_object (event_id); +CREATE INDEX event_object_object_id_idx ON event_object (object_id); +CREATE INDEX event_object_object_type_idx ON event_object (object_type); + +---------- view changes + +CREATE OR REPLACE VIEW event_objects AS +SELECT event_id, +array_accum(object_id) AS object_ids, +array_accum(object_type) AS object_types +FROM event_object +GROUP BY event_id; + +CREATE OR REPLACE VIEW view_events AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.auth_type, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +COALESCE((SELECT object_ids FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_ids, +COALESCE((SELECT object_types FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_types +FROM events; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +CREATE OR REPLACE VIEW view_sites AS +SELECT +sites.site_id, +sites.login_base, +sites.name, +sites.abbreviated_name, +sites.deleted, +sites.enabled, +sites.is_public, +sites.max_slices, +sites.max_slivers, +sites.latitude, +sites.longitude, +sites.url, +sites.ext_consortium_id, +CAST(date_part('epoch', sites.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', sites.last_updated) AS bigint) AS last_updated, +peer_site.peer_id, +peer_site.peer_site_id, +COALESCE((SELECT person_ids FROM site_persons WHERE site_persons.site_id = sites.site_id), '{}') AS person_ids, +COALESCE((SELECT node_ids FROM site_nodes WHERE site_nodes.site_id = sites.site_id), '{}') AS node_ids, +COALESCE((SELECT address_ids FROM site_addresses WHERE site_addresses.site_id = sites.site_id), '{}') AS address_ids, +COALESCE((SELECT slice_ids FROM site_slices WHERE site_slices.site_id = sites.site_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM site_pcus WHERE site_pcus.site_id = sites.site_id), '{}') AS pcu_ids +FROM sites +LEFT JOIN peer_site USING (site_id); + +---------- deletions +--dont need to drop this colum it doesn't exit anymore +-----ALTER TABLE events DROP COLUMN object_type; + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 5; +SELECT subversion from plc_db_version; diff --git a/migrations/006-down-slice-attribute-nodegroup.sql b/migrations/006-down-slice-attribute-nodegroup.sql new file mode 100644 index 0000000..0dc4bae --- /dev/null +++ b/migrations/006-down-slice-attribute-nodegroup.sql @@ -0,0 +1,25 @@ +---------- view changes + +DROP VIEW view_slice_attributes; + +CREATE OR REPLACE VIEW view_slice_attributes AS +SELECT +slice_attribute.slice_attribute_id, +slice_attribute.slice_id, +slice_attribute.node_id, +slice_attribute_types.attribute_type_id, +slice_attribute_types.name, +slice_attribute_types.description, +slice_attribute_types.min_role_id, +slice_attribute.value +FROM slice_attribute +INNER JOIN slice_attribute_types USING (attribute_type_id); + +---------- deletions +DROP INDEX slice_attribute_nodegroup_id_idx; +ALTER TABLE slice_attribute DROP COLUMN nodegroup_id; + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 5; +SELECT subversion from plc_db_version; diff --git a/migrations/006-up-slice-attribute-nodegroup.sql b/migrations/006-up-slice-attribute-nodegroup.sql new file mode 100644 index 0000000..801f2a0 --- /dev/null +++ b/migrations/006-up-slice-attribute-nodegroup.sql @@ -0,0 +1,29 @@ +---------- creations + +ALTER TABLE slice_attribute ADD nodegroup_id integer REFERENCES nodegroups; + +CREATE INDEX slice_attribute_nodegroup_id_idx ON slice_attribute (nodegroup_id); + +---------- view changes + +DROP VIEW view_slice_attributes; + +CREATE OR REPLACE VIEW view_slice_attributes AS +SELECT +slice_attribute.slice_attribute_id, +slice_attribute.slice_id, +slice_attribute.node_id, +slice_attribute.nodegroup_id, +slice_attribute_types.attribute_type_id, +slice_attribute_types.name, +slice_attribute_types.description, +slice_attribute_types.min_role_id, +slice_attribute.value +FROM slice_attribute +INNER JOIN slice_attribute_types USING (attribute_type_id); + + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 6; +SELECT subversion from plc_db_version; diff --git a/migrations/007-down-event-objects-view.sql b/migrations/007-down-event-objects-view.sql new file mode 100644 index 0000000..09b86f3 --- /dev/null +++ b/migrations/007-down-event-objects-view.sql @@ -0,0 +1,11 @@ +-- +-- migration 007 - revert +-- + +DROP VIEW view_event_objects; + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 6; +SELECT subversion from plc_db_version; + diff --git a/migrations/007-up-event-objects-view.sql b/migrations/007-up-event-objects-view.sql new file mode 100644 index 0000000..2ed47ee --- /dev/null +++ b/migrations/007-up-event-objects-view.sql @@ -0,0 +1,26 @@ +-- +-- migration 007 +-- change the way event objects are fetched, use a view for that purpose +-- + + +CREATE OR REPLACE VIEW view_event_objects AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +event_object.object_id, +event_object.object_type +FROM events LEFT JOIN event_object USING (event_id); + + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 7; +SELECT subversion from plc_db_version; diff --git a/migrations/008-down-import-aug-2007.sql b/migrations/008-down-import-aug-2007.sql new file mode 100644 index 0000000..9a3eaab --- /dev/null +++ b/migrations/008-down-import-aug-2007.sql @@ -0,0 +1,42 @@ + +DELETE from slice_instantiations WHERE instantiation='nm-controller'; + + + +DROP VIEW view_nodes; +DROP VIEW node_slices_whitelist; +DROP TABLE node_slice_whitelist; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 7; +SELECT subversion from plc_db_version; diff --git a/migrations/008-up-import-aug-2007.sql b/migrations/008-up-import-aug-2007.sql new file mode 100644 index 0000000..2220f8b --- /dev/null +++ b/migrations/008-up-import-aug-2007.sql @@ -0,0 +1,64 @@ +-- +-- migration 008 +-- import from Princeton codebase on august 2007 28 +-- slice instantiation 'nm-controller' +-- * white lists +-- + +INSERT INTO slice_instantiations (instantiation) VALUES ('nm-controller'); -- NM Controller + +-------------------------------------------------------------------------------- +-- Slice whitelist +-------------------------------------------------------------------------------- +-- slice whitelist on nodes +CREATE TABLE node_slice_whitelist ( + node_id integer REFERENCES nodes NOT NULL, -- Node id of whitelist + slice_id integer REFERENCES slices NOT NULL, -- Slice id thats allowd on this node + PRIMARY KEY (node_id, slice_id) +) WITH OIDS; +CREATE INDEX node_slice_whitelist_node_id_idx ON node_slice_whitelist (node_id); +CREATE INDEX node_slice_whitelist_slice_id_idx ON node_slice_whitelist (slice_id); + +-- Slices on each node +CREATE VIEW node_slices_whitelist AS +SELECT node_id, +array_accum(slice_id) AS slice_ids_whitelist +FROM node_slice_whitelist +GROUP BY node_id; + +DROP VIEW view_nodes; + + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT slice_ids_whitelist FROM node_slices_whitelist WHERE node_slices_whitelist.node_id = nodes.node_id), '{}') AS slice_ids_whitelist, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 8; +SELECT subversion from plc_db_version; diff --git a/migrations/009-down-pcu-types.sql b/migrations/009-down-pcu-types.sql new file mode 100644 index 0000000..1dbe9d2 --- /dev/null +++ b/migrations/009-down-pcu-types.sql @@ -0,0 +1,13 @@ +-- +-- 009 revert +-- + +DROP VIEW view_pcu_types; + +DROP VIEW pcu_type_ports; + +DROP TABLE pcu_type_port; + +DROP TABLE pcu_types; + +UPDATE plc_db_version SET subversion = 7; diff --git a/migrations/009-up-pcu-types.sql b/migrations/009-up-pcu-types.sql new file mode 100644 index 0000000..c7dd7b6 --- /dev/null +++ b/migrations/009-up-pcu-types.sql @@ -0,0 +1,41 @@ +-- +-- Tony Mack - PlanetLab +-- +-- migration 009 +-- +-- purpose: provide a means for storing details about pcu models +-- +-- + +CREATE TABLE pcu_types ( + pcu_type_id serial PRIMARY KEY, + model text NOT NULL, -- PCU model name + name text -- Full PCU model name +) WITH OIDS; +CREATE INDEX pcu_types_model_idx ON pcu_types (model); + +CREATE TABLE pcu_protocol_type ( + pcu_protocol_type_id serial PRIMARY KEY, + pcu_type_id integer REFERENCES pcu_types NOT NULL, -- PCU type identifier + port integer NOT NULL, -- PCU port + protocol text NOT NULL, -- Protocol + supported boolean NOT NULL DEFAULT True -- Does PLC support +) WITH OIDS; +CREATE INDEX pcu_protocol_type_pcu_type_id ON pcu_protocol_type (pcu_type_id); + + +CREATE OR REPLACE VIEW pcu_protocol_types AS +SELECT pcu_type_id, +array_accum(pcu_protocol_type_id) as pcu_protocol_type_ids +FROM pcu_protocol_type +GROUP BY pcu_type_id; + +CREATE OR REPLACE VIEW view_pcu_types AS +SELECT +pcu_types.pcu_type_id, +pcu_types.model, +pcu_types.name, +COALESCE((SELECT pcu_protocol_type_ids FROM pcu_protocol_types WHERE pcu_protocol_types.pcu_type_id = pcu_types.pcu_type_id), '{}') AS pcu_protocol_type_ids +FROM pcu_types; + +UPDATE plc_db_version SET subversion = 9; diff --git a/migrations/README.txt b/migrations/README.txt new file mode 100644 index 0000000..e8570bf --- /dev/null +++ b/migrations/README.txt @@ -0,0 +1,8 @@ +Store here migration scripts, named +-up-any-text. +with contiguous indices starting with 001 + +if the extension is .sql it is ran on the planetlab4 database +otherwise it is run as is + +See myplc/plc.d/db for how this is used diff --git a/php/.cvsignore b/php/.cvsignore new file mode 100644 index 0000000..dd89eef --- /dev/null +++ b/php/.cvsignore @@ -0,0 +1,2 @@ +methods.php +plc_api.php diff --git a/php/Makefile b/php/Makefile new file mode 100644 index 0000000..5498951 --- /dev/null +++ b/php/Makefile @@ -0,0 +1,25 @@ +# +# (Re)builds PHP API. PHP classes must be defined in a single file. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: Makefile,v 1.2 2006/10/27 15:40:37 mlhuang Exp $ +# + +all: plc_api.php + +methods.php: methods.py ../PLC/__init__.py ../PLC/Methods/__init__.py + PYTHONPATH=.. python $< > $@ + # Indent all lines by a couple of spaces + sed -i -e "s/^/ /" $@ + +plc_api.php: header.php methods.php footer.php + # Set timestamp + sed -e "s/@DATE@/$$(date)/" header.php > $@ + cat methods.php footer.php >> $@ + +clean: + rm -f plc_api.php methods.php + +.PHONY: all clean diff --git a/php/footer.php b/php/footer.php new file mode 100644 index 0000000..6212304 --- /dev/null +++ b/php/footer.php @@ -0,0 +1,9 @@ +} + +global $adm; + +$adm = new PLCAPI(array('AuthMethod' => "capability", + 'Username' => PLC_API_MAINTENANCE_USER, + 'AuthString' => PLC_API_MAINTENANCE_PASSWORD)); + +?> diff --git a/php/header.php b/php/header.php new file mode 100644 index 0000000..a073691 --- /dev/null +++ b/php/header.php @@ -0,0 +1,202 @@ + +// Copyright (C) 2005-2006 The Trustees of Princeton University +// +// $Id: header.php,v 1.5 2007/09/13 18:12:54 tmack Exp $ +// +// + +require_once 'plc_config.php'; + +class PLCAPI +{ + var $auth; + var $server; + var $port; + var $path; + var $errors; + var $trace; + var $calls; + var $multicall; + + function PLCAPI($auth = NULL, + $server = PLC_API_HOST, + $port = PLC_API_PORT, + $path = PLC_API_PATH, + $cainfo = NULL) + { + $this->auth = $auth; + $this->server = $server; + $this->port = $port; + $this->path = $path; + $this->cainfo = $cainfo; + $this->errors = array(); + $this->trace = array(); + $this->calls = array(); + $this->multicall = false; + } + + function error_log($error_msg, $backtrace_level = 1) + { + $backtrace = debug_backtrace(); + $file = $backtrace[$backtrace_level]['file']; + $line = $backtrace[$backtrace_level]['line']; + + $this->errors[] = 'PLCAPI error: ' . $error_msg . ' in ' . $file . ' on line ' . $line; + error_log(end($this->errors)); + } + + function error() + { + if (empty($this->trace)) { + return NULL; + } else { + $last_trace = end($this->trace); + return implode("\\n", $last_trace['errors']); + } + } + + function trace() + { + return $this->trace; + } + + function microtime_float() + { + list($usec, $sec) = explode(" ", microtime()); + return ((float) $usec + (float) $sec); + } + + function call($method, $args = NULL) + { + if ($this->multicall) { + $this->calls[] = array ('methodName' => $method, + 'params' => $args); + return NULL; + } else { + return $this->internal_call ($method, $args, 3); + } + } + + function internal_call($method, $args = NULL, $backtrace_level = 2) + { + $curl = curl_init(); + + // Verify peer certificate if talking over SSL + if ($this->port == 443) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 2); + if (!empty($this->cainfo)) { + curl_setopt($curl, CURLOPT_CAINFO, $this->cainfo); + } elseif (defined('PLC_API_CA_SSL_CRT')) { + curl_setopt($curl, CURLOPT_CAINFO, PLC_API_CA_SSL_CRT); + } + $url = 'https://'; + } else { + $url = 'http://'; + } + + // Set the URL for the request + $url .= $this->server . ':' . $this->port . '/' . $this->path; + curl_setopt($curl, CURLOPT_URL, $url); + + // Marshal the XML-RPC request as a POST variable. is an + // extension to the XML-RPC spec that is supported in our custom + // version of xmlrpc.so via the 'allow_null' output_encoding key. + $request = xmlrpc_encode_request($method, $args, array('allow_null' => TRUE)); + curl_setopt($curl, CURLOPT_POSTFIELDS, $request); + + // Construct the HTTP header + $header[] = 'Content-type: text/xml'; + $header[] = 'Content-length: ' . strlen($request); + curl_setopt($curl, CURLOPT_HTTPHEADER, $header); + + // Set some miscellaneous options + curl_setopt($curl, CURLOPT_TIMEOUT, 30); + + // Get the output of the request + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + $t0 = $this->microtime_float(); + $output = curl_exec($curl); + $t1 = $this->microtime_float(); + + if (curl_errno($curl)) { + $this->error_log('curl: ' . curl_error($curl), true); + $ret = NULL; + } else { + $ret = xmlrpc_decode($output); + if (is_array($ret) && xmlrpc_is_fault($ret)) { + $this->error_log('Fault Code ' . $ret['faultCode'] . ': ' . + $ret['faultString'], $backtrace_level, true); + $ret = NULL; + } + } + + curl_close($curl); + + $this->trace[] = array('method' => $method, + 'args' => $args, + 'runtime' => $t1 - $t0, + 'return' => $ret, + 'errors' => $this->errors); + $this->errors = array(); + + return $ret; + } + + function begin() + { + if (!empty($this->calls)) { + $this->error_log ('Warning: multicall already in progress'); + } + + $this->multicall = true; + } + + function commit() + { + if (!empty ($this->calls)) { + $ret = array(); + $results = $this->internal_call ('system.multicall', array ($this->calls)); + foreach ($results as $result) { + if (is_array($result)) { + if (xmlrpc_is_fault($result)) { + $this->error_log('Fault Code ' . $result['faultCode'] . ': ' . + $result['faultString'], 1, true); + $ret[] = NULL; + // Thierry - march 30 2007 + // using $adm->error() is broken with begin/commit style + // this is because error() uses last item in trace and checks for ['errors'] + // when using begin/commit we do run internal_call BUT internal_call checks for + // multicall's result globally, not individual results, so ['errors'] comes empty + // I considered hacking internal_call + // to *NOT* maintain this->trace at all when invoked with multicall + // but it is too complex to get all values right + // so let's go for the hacky way, and just record individual errors at the right place + $this->trace[count($this->trace)-1]['errors'][] = end($this->errors); + } else { + $ret[] = $result[0]; + } + } else { + $ret[] = $result; + } + } + } else { + $ret = NULL; + } + + $this->calls = array(); + $this->multicall = false; + + return $ret; + } + + // + // PLCAPI Methods + // + diff --git a/php/methods.py b/php/methods.py new file mode 100755 index 0000000..b41b1ba --- /dev/null +++ b/php/methods.py @@ -0,0 +1,111 @@ +#!/usr/bin/python +# +# Generates the PLCAPI interface for the website PHP code. +# +# Mark Huang +# Copyright (C) 2005 The Trustess of Princeton University +# +# $Id: methods.py,v 1.4 2006/11/29 19:43:17 mlhuang Exp $ +# + +import os, sys +import time + +from PLC.API import PLCAPI +from PLC.Method import * +from PLC.Auth import Auth + +try: + set +except NameError: + from sets import Set + set = Set + +def php_cast(value): + """ + Casts Python values to PHP values. + """ + + if value is None: + return "NULL" + elif isinstance(value, (list, tuple, set)): + return "array(%s)" % ", ".join([php_cast(v) for v in value]) + elif isinstance(value, dict): + items = ["%s => %s" % (php_cast(k), php_cast(v)) for (k, v) in value.items()] + return "array(%s)" % ", ".join(items) + elif isinstance(value, (int, long, bool, float)): + return str(value) + else: + unicode_repr = repr(unicode(value)) + # Truncate the leading 'u' prefix + return unicode_repr[1:] + +# Class functions +api = PLCAPI(None) + +api.methods.sort() +for method in api.methods: + # Skip system. methods + if "system." in method: + continue + + function = api.callable(method) + + # Commented documentation + lines = ["// " + line.strip() for line in function.__doc__.strip().split("\n")] + print "\n".join(lines) + print + + # Function declaration + print "function " + function.name, + + # PHP function arguments + args = [] + (min_args, max_args, defaults) = function.args() + parameters = zip(max_args, function.accepts, defaults) + + for name, expected, default in parameters: + # Skip auth structures (added automatically) + if isinstance(expected, Auth) or \ + (isinstance(expected, Mixed) and \ + filter(lambda sub: isinstance(sub, Auth), expected)): + continue + + # Declare parameter + arg = "$" + name + + # Set optional parameters to their defaults + if name not in min_args: + arg += " = " + php_cast(default) + + args.append(arg) + + # Write function declaration + print "(" + ", ".join(args) + ")" + + # Begin function body + print "{" + + # API function arguments + i = 0 + for name, expected, default in parameters: + # Automatically added auth structures + if isinstance(expected, Auth) or \ + (isinstance(expected, Mixed) and \ + filter(lambda sub: isinstance(sub, Auth), expected)): + print " $args[] = $this->auth;" + continue + + print " ", + if name not in min_args: + print "if (func_num_args() > %d)" % i, + print "$args[] = $%s;" % name + + i += 1 + + # Call API function + print " return $this->call('%s', $args);" % method + + # End function body + print "}" + print diff --git a/php/xmlrpc/CREDITS b/php/xmlrpc/CREDITS new file mode 100644 index 0000000..cfb14fa --- /dev/null +++ b/php/xmlrpc/CREDITS @@ -0,0 +1,2 @@ +xmlrpc +Dan Libby diff --git a/php/xmlrpc/EXPERIMENTAL b/php/xmlrpc/EXPERIMENTAL new file mode 100644 index 0000000..6443e99 --- /dev/null +++ b/php/xmlrpc/EXPERIMENTAL @@ -0,0 +1,5 @@ +this extension is experimental, +its functions may change their names +or move to extension all together +so do not rely to much on them +you have been warned! diff --git a/php/xmlrpc/Makefile b/php/xmlrpc/Makefile new file mode 100644 index 0000000..40c6887 --- /dev/null +++ b/php/xmlrpc/Makefile @@ -0,0 +1,26 @@ +# +# Build xmlrpc.so PHP extension +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +CC := gcc +CFLAGS := -g -O2 -I. -Ilibxmlrpc -fPIC +CFLAGS += $(shell php-config --includes) +CFLAGS += $(shell xml2-config --cflags) + +LDFLAGS := -shared --export-dynamic +LIBS := -lexpat + +all: xmlrpc.so + +xmlrpc.so: xmlrpc-epi-php.o $(patsubst %.c, %.o, $(wildcard libxmlrpc/*.c)) + $(LD) $(LDFLAGS) -o $@ $^ $(LIBS) + +clean: + rm -f *.o libxmlrpc/*.o *.so + +.PHONY: all clean diff --git a/php/xmlrpc/config.m4 b/php/xmlrpc/config.m4 new file mode 100644 index 0000000..f9cbdea --- /dev/null +++ b/php/xmlrpc/config.m4 @@ -0,0 +1,93 @@ +dnl +dnl $Id: config.m4,v 1.21 2003/10/01 02:53:15 sniper Exp $ +dnl + +sinclude(ext/xmlrpc/libxmlrpc/acinclude.m4) +sinclude(ext/xmlrpc/libxmlrpc/xmlrpc.m4) +sinclude(libxmlrpc/acinclude.m4) +sinclude(libxmlrpc/xmlrpc.m4) + +PHP_ARG_WITH(xmlrpc, for XMLRPC-EPI support, +[ --with-xmlrpc[=DIR] Include XMLRPC-EPI support.]) + +PHP_ARG_WITH(expat-dir, libexpat dir for XMLRPC-EPI, +[ --with-expat-dir=DIR XMLRPC-EPI: libexpat dir for XMLRPC-EPI.],no,no) + +PHP_ARG_WITH(iconv-dir, iconv dir for XMLRPC-EPI, +[ --with-iconv-dir=DIR XMLRPC-EPI: iconv dir for XMLRPC-EPI.],no,no) + +if test "$PHP_XMLRPC" != "no"; then + + PHP_SUBST(XMLRPC_SHARED_LIBADD) + AC_DEFINE(HAVE_XMLRPC,1,[ ]) + + testval=no + for i in $PHP_EXPAT_DIR $XMLRPC_DIR /usr/local /usr; do + if test -f $i/$PHP_LIBDIR/libexpat.a -o -f $i/$PHP_LIBDIR/libexpat.$SHLIB_SUFFIX_NAME; then + AC_DEFINE(HAVE_LIBEXPAT2,1,[ ]) + PHP_ADD_LIBRARY_WITH_PATH(expat, $i/$PHP_LIBDIR, XMLRPC_SHARED_LIBADD) + PHP_ADD_INCLUDE($i/include) + testval=yes + break + fi + done + + if test "$testval" = "no"; then + AC_MSG_ERROR(XML-RPC support requires libexpat. Use --with-expat-dir=
) + fi + + if test "$PHP_ICONV_DIR" != "no"; then + PHP_ICONV=$PHP_ICONV_DIR + fi + + if test "$PHP_ICONV" = "no"; then + PHP_ICONV=yes + fi + + PHP_SETUP_ICONV(XMLRPC_SHARED_LIBADD, [], [ + AC_MSG_ERROR([iconv not found, in order to build xmlrpc you need the iconv library]) + ]) +fi + + +if test "$PHP_XMLRPC" = "yes"; then + XMLRPC_CHECKS + PHP_NEW_EXTENSION(xmlrpc,xmlrpc-epi-php.c libxmlrpc/base64.c \ + libxmlrpc/simplestring.c libxmlrpc/xml_to_dandarpc.c \ + libxmlrpc/xmlrpc_introspection.c libxmlrpc/encodings.c \ + libxmlrpc/system_methods.c libxmlrpc/xml_to_xmlrpc.c \ + libxmlrpc/queue.c libxmlrpc/xml_element.c libxmlrpc/xmlrpc.c \ + libxmlrpc/xml_to_soap.c,$ext_shared,, + -I@ext_srcdir@/libxmlrpc -DVERSION="0.50") + PHP_ADD_BUILD_DIR($ext_builddir/libxmlrpc) + XMLRPC_MODULE_TYPE=builtin + +elif test "$PHP_XMLRPC" != "no"; then + + if test -r $PHP_XMLRPC/include/xmlrpc.h; then + XMLRPC_DIR=$PHP_XMLRPC/include + elif test -r $PHP_XMLRPC/include/xmlrpc-epi/xmlrpc.h; then +dnl some xmlrpc-epi header files have generic file names like +dnl queue.h or base64.h. Distributions have to create dir +dnl for xmlrpc-epi because of this. + XMLRPC_DIR=$PHP_XMLRPC/include/xmlrpc-epi + else + AC_MSG_CHECKING(for XMLRPC-EPI in default path) + for i in /usr/local /usr; do + if test -r $i/include/xmlrpc.h; then + XMLRPC_DIR=$i/include + AC_MSG_RESULT(found in $i) + break + fi + done + fi + + if test -z "$XMLRPC_DIR"; then + AC_MSG_RESULT(not found) + AC_MSG_ERROR(Please reinstall the XMLRPC-EPI distribution) + fi + + PHP_ADD_INCLUDE($XMLRPC_DIR) + PHP_ADD_LIBRARY_WITH_PATH(xmlrpc, $XMLRPC_DIR/$PHP_LIBDIR, XMLRPC_SHARED_LIBADD) +fi + diff --git a/php/xmlrpc/config.m4.lib64 b/php/xmlrpc/config.m4.lib64 new file mode 100644 index 0000000..5dc9995 --- /dev/null +++ b/php/xmlrpc/config.m4.lib64 @@ -0,0 +1,93 @@ +dnl +dnl $Id: config.m4,v 1.21 2003/10/01 02:53:15 sniper Exp $ +dnl + +sinclude(ext/xmlrpc/libxmlrpc/acinclude.m4) +sinclude(ext/xmlrpc/libxmlrpc/xmlrpc.m4) +sinclude(libxmlrpc/acinclude.m4) +sinclude(libxmlrpc/xmlrpc.m4) + +PHP_ARG_WITH(xmlrpc, for XMLRPC-EPI support, +[ --with-xmlrpc[=DIR] Include XMLRPC-EPI support.]) + +PHP_ARG_WITH(expat-dir, libexpat dir for XMLRPC-EPI, +[ --with-expat-dir=DIR XMLRPC-EPI: libexpat dir for XMLRPC-EPI.],no,no) + +PHP_ARG_WITH(iconv-dir, iconv dir for XMLRPC-EPI, +[ --with-iconv-dir=DIR XMLRPC-EPI: iconv dir for XMLRPC-EPI.],no,no) + +if test "$PHP_XMLRPC" != "no"; then + + PHP_SUBST(XMLRPC_SHARED_LIBADD) + AC_DEFINE(HAVE_XMLRPC,1,[ ]) + + testval=no + for i in $PHP_EXPAT_DIR $XMLRPC_DIR /usr/local /usr; do + if test -f $i/lib/libexpat.a -o -f $i/lib/libexpat.$SHLIB_SUFFIX_NAME; then + AC_DEFINE(HAVE_LIBEXPAT2,1,[ ]) + PHP_ADD_LIBRARY_WITH_PATH(expat, $i/lib, XMLRPC_SHARED_LIBADD) + PHP_ADD_INCLUDE($i/include) + testval=yes + break + fi + done + + if test "$testval" = "no"; then + AC_MSG_ERROR(XML-RPC support requires libexpat. Use --with-expat-dir=) + fi + + if test "$PHP_ICONV_DIR" != "no"; then + PHP_ICONV=$PHP_ICONV_DIR + fi + + if test "$PHP_ICONV" = "no"; then + PHP_ICONV=yes + fi + + PHP_SETUP_ICONV(XMLRPC_SHARED_LIBADD, [], [ + AC_MSG_ERROR([iconv not found, in order to build xmlrpc you need the iconv library]) + ]) +fi + + +if test "$PHP_XMLRPC" = "yes"; then + XMLRPC_CHECKS + PHP_NEW_EXTENSION(xmlrpc,xmlrpc-epi-php.c libxmlrpc/base64.c \ + libxmlrpc/simplestring.c libxmlrpc/xml_to_dandarpc.c \ + libxmlrpc/xmlrpc_introspection.c libxmlrpc/encodings.c \ + libxmlrpc/system_methods.c libxmlrpc/xml_to_xmlrpc.c \ + libxmlrpc/queue.c libxmlrpc/xml_element.c libxmlrpc/xmlrpc.c \ + libxmlrpc/xml_to_soap.c,$ext_shared,, + -I@ext_srcdir@/libxmlrpc -DVERSION="0.50") + PHP_ADD_BUILD_DIR($ext_builddir/libxmlrpc) + XMLRPC_MODULE_TYPE=builtin + +elif test "$PHP_XMLRPC" != "no"; then + + if test -r $PHP_XMLRPC/include/xmlrpc.h; then + XMLRPC_DIR=$PHP_XMLRPC/include + elif test -r $PHP_XMLRPC/include/xmlrpc-epi/xmlrpc.h; then +dnl some xmlrpc-epi header files have generic file names like +dnl queue.h or base64.h. Distributions have to create dir +dnl for xmlrpc-epi because of this. + XMLRPC_DIR=$PHP_XMLRPC/include/xmlrpc-epi + else + AC_MSG_CHECKING(for XMLRPC-EPI in default path) + for i in /usr/local /usr; do + if test -r $i/include/xmlrpc.h; then + XMLRPC_DIR=$i/include + AC_MSG_RESULT(found in $i) + break + fi + done + fi + + if test -z "$XMLRPC_DIR"; then + AC_MSG_RESULT(not found) + AC_MSG_ERROR(Please reinstall the XMLRPC-EPI distribution) + fi + + PHP_ADD_INCLUDE($XMLRPC_DIR) + PHP_ADD_LIBRARY_WITH_PATH(xmlrpc, $XMLRPC_DIR/lib, XMLRPC_SHARED_LIBADD) +fi + diff --git a/php/xmlrpc/config.w32 b/php/xmlrpc/config.w32 new file mode 100644 index 0000000..4001446 --- /dev/null +++ b/php/xmlrpc/config.w32 @@ -0,0 +1,14 @@ +// $Id: config.w32,v 1.2 2003/12/22 13:16:42 wez Exp $ +// vim:ft=javascript + +ARG_WITH("xmlrpc", "XMLRPC-EPI support", "no"); + +if (PHP_XMLRPC != "no") { + CHECK_HEADER_ADD_INCLUDE("xmlrpc.h", "CFLAGS_XMLRPC", configure_module_dirname + "/libxmlrpc"); + EXTENSION('xmlrpc', 'xmlrpc-epi-php.c', PHP_XMLRPC_SHARED, "-DVERSION=\"0.50\""); + ADD_SOURCES(configure_module_dirname + "/libxmlrpc", "base64.c simplestring.c xml_to_dandarpc.c \ + xmlrpc_introspection.c encodings.c system_methods.c xml_to_xmlrpc.c \ + queue.c xml_element.c xmlrpc.c xml_to_soap.c", "xmlrpc"); + ADD_EXTENSION_DEP('xmlrpc', 'libxml'); +} + diff --git a/php/xmlrpc/libxmlrpc/README b/php/xmlrpc/libxmlrpc/README new file mode 100644 index 0000000..323edfa --- /dev/null +++ b/php/xmlrpc/libxmlrpc/README @@ -0,0 +1,17 @@ +organization of this directory is moving towards this approach: + +.h -- public API and data types +_private.h -- protected API and data types +.c -- implementation and private API / types + +The rules are: +.c files may include *_private.h. +.h files may not include *_private.h + +This allows us to have a nicely encapsulated C api with opaque data types and private functions +that are nonetheless shared between source files without redundant extern declarations.. + + + + + diff --git a/php/xmlrpc/libxmlrpc/acinclude.m4 b/php/xmlrpc/libxmlrpc/acinclude.m4 new file mode 100644 index 0000000..49b6090 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/acinclude.m4 @@ -0,0 +1,32 @@ +# Local macros for automake & autoconf + +AC_DEFUN([XMLRPC_FUNCTION_CHECKS],[ + +# Standard XMLRPC list +AC_CHECK_FUNCS( \ + strtoul strtoull snprintf \ + strstr strpbrk strerror\ + memcpy memmove) + +]) + +AC_DEFUN([XMLRPC_HEADER_CHECKS],[ +AC_HEADER_STDC +AC_CHECK_HEADERS(xmlparse.h xmltok.h stdlib.h strings.h string.h) +]) + +AC_DEFUN([XMLRPC_TYPE_CHECKS],[ + +AC_REQUIRE([AC_C_CONST]) +AC_REQUIRE([AC_C_INLINE]) +AC_CHECK_SIZEOF(char, 1) + +AC_CHECK_SIZEOF(int, 4) +AC_CHECK_SIZEOF(long, 4) +AC_CHECK_SIZEOF(long long, 8) +AC_TYPE_SIZE_T +AC_HEADER_TIME +AC_TYPE_UID_T + + +]) diff --git a/php/xmlrpc/libxmlrpc/base64.c b/php/xmlrpc/libxmlrpc/base64.c new file mode 100644 index 0000000..e067038 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/base64.c @@ -0,0 +1,192 @@ +static const char rcsid[] = "#(@) $Id: base64.c,v 1.4 2004/04/27 17:33:59 iliaa Exp $"; + +/* + + Encode or decode file as MIME base64 (RFC 1341) + + by John Walker + http://www.fourmilab.ch/ + + This program is in the public domain. + +*/ +#include + +/* ENCODE -- Encode binary file into base64. */ +#include +#include + +#include "base64.h" + +static unsigned char dtable[512]; + +void buffer_new(struct buffer_st *b) +{ + b->length = 512; + b->data = malloc(sizeof(char)*(b->length)); + b->data[0] = 0; + b->ptr = b->data; + b->offset = 0; +} + +void buffer_add(struct buffer_st *b, char c) +{ + *(b->ptr++) = c; + b->offset++; + if (b->offset == b->length) { + b->length += 512; + b->data = realloc(b->data, b->length); + b->ptr = b->data + b->offset; + } +} + +void buffer_delete(struct buffer_st *b) +{ + free(b->data); + b->length = 0; + b->offset = 0; + b->ptr = NULL; + b->data = NULL; +} + +void base64_encode(struct buffer_st *b, const char *source, int length) +{ + int i, hiteof = 0; + int offset = 0; + int olen; + + olen = 0; + + buffer_new(b); + + /* Fill dtable with character encodings. */ + + for (i = 0; i < 26; i++) { + dtable[i] = 'A' + i; + dtable[26 + i] = 'a' + i; + } + for (i = 0; i < 10; i++) { + dtable[52 + i] = '0' + i; + } + dtable[62] = '+'; + dtable[63] = '/'; + + while (!hiteof) { + unsigned char igroup[3], ogroup[4]; + int c, n; + + igroup[0] = igroup[1] = igroup[2] = 0; + for (n = 0; n < 3; n++) { + c = *(source++); + offset++; + if (offset > length) { + hiteof = 1; + break; + } + igroup[n] = (unsigned char) c; + } + if (n > 0) { + ogroup[0] = dtable[igroup[0] >> 2]; + ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; + ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; + ogroup[3] = dtable[igroup[2] & 0x3F]; + + /* Replace characters in output stream with "=" pad + characters if fewer than three characters were + read from the end of the input stream. */ + + if (n < 3) { + ogroup[3] = '='; + if (n < 2) { + ogroup[2] = '='; + } + } + for (i = 0; i < 4; i++) { + buffer_add(b, ogroup[i]); + if (!(b->offset % 72)) { + /* buffer_add(b, '\r'); */ + buffer_add(b, '\n'); + } + } + } + } + /* buffer_add(b, '\r'); */ + buffer_add(b, '\n'); +} + +void base64_decode(struct buffer_st *bfr, const char *source, int length) +{ + int i; + int offset = 0; + int endoffile; + int count; + + buffer_new(bfr); + + for (i = 0; i < 255; i++) { + dtable[i] = 0x80; + } + for (i = 'A'; i <= 'Z'; i++) { + dtable[i] = 0 + (i - 'A'); + } + for (i = 'a'; i <= 'z'; i++) { + dtable[i] = 26 + (i - 'a'); + } + for (i = '0'; i <= '9'; i++) { + dtable[i] = 52 + (i - '0'); + } + dtable['+'] = 62; + dtable['/'] = 63; + dtable['='] = 0; + + endoffile = 0; + + /*CONSTANTCONDITION*/ + while (1) { + unsigned char a[4], b[4], o[3]; + + for (i = 0; i < 4; i++) { + int c; + while (1) { + c = *(source++); + offset++; + if (offset > length) endoffile = 1; + if (isspace(c) || c == '\n' || c == '\r') continue; + break; + } + + if (endoffile) { + /* + if (i > 0) { + fprintf(stderr, "Input file incomplete.\n"); + exit(1); + } + */ + return; + } + + if (dtable[c] & 0x80) { + /* + fprintf(stderr, "Offset %i length %i\n", offset, length); + fprintf(stderr, "character '%c:%x:%c' in input file.\n", c, c, dtable[c]); + exit(1); + */ + i--; + continue; + } + a[i] = (unsigned char) c; + b[i] = (unsigned char) dtable[c]; + } + o[0] = (b[0] << 2) | (b[1] >> 4); + o[1] = (b[1] << 4) | (b[2] >> 2); + o[2] = (b[2] << 6) | b[3]; + i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3); + count = 0; + while (count < i) { + buffer_add(bfr, o[count++]); + } + if (i < 3) { + return; + } + } +} diff --git a/php/xmlrpc/libxmlrpc/base64.h b/php/xmlrpc/libxmlrpc/base64.h new file mode 100644 index 0000000..4cf156a --- /dev/null +++ b/php/xmlrpc/libxmlrpc/base64.h @@ -0,0 +1,38 @@ +/* + + Encode or decode file as MIME base64 (RFC 1341) + + by John Walker + http://www.fourmilab.ch/ + + This program is in the public domain. + +*/ + + +struct buffer_st { + char *data; + int length; + char *ptr; + int offset; +}; + +void buffer_new(struct buffer_st *b); +void buffer_add(struct buffer_st *b, char c); +void buffer_delete(struct buffer_st *b); + +void base64_encode(struct buffer_st *b, const char *source, int length); +void base64_decode(struct buffer_st *b, const char *source, int length); + +/* +#define DEBUG_MALLOC + */ + +#ifdef DEBUG_MALLOC +void *_malloc_real(size_t s, char *file, int line); +void _free_real(void *p, char *file, int line); + +#define malloc(s) _malloc_real(s,__FILE__,__LINE__) +#define free(p) _free_real(p, __FILE__,__LINE__) +#endif + diff --git a/php/xmlrpc/libxmlrpc/encodings.c b/php/xmlrpc/libxmlrpc/encodings.c new file mode 100644 index 0000000..0bad3ee --- /dev/null +++ b/php/xmlrpc/libxmlrpc/encodings.c @@ -0,0 +1,118 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef PHP_WIN32 +#include +#else +#include +#include +#endif + +static const char rcsid[] = "#(@) $Id: encodings.c,v 1.7 2004/03/08 23:04:33 abies Exp $"; + +#include + +#ifdef HAVE_GICONV_H +#include +#else +#include +#endif + +#include "encodings.h" + +static char* convert(const char* src, int src_len, int *new_len, const char* from_enc, const char* to_enc) { + char* outbuf = 0; + + if(src && src_len && from_enc && to_enc) { + size_t outlenleft = src_len; + size_t inlenleft = src_len; + int outlen = src_len; + iconv_t ic = iconv_open(to_enc, from_enc); + char* out_ptr = 0; + + if(ic != (iconv_t)-1) { + size_t st; + outbuf = (char*)malloc(outlen + 1); + + if(outbuf) { + out_ptr = (char*)outbuf; + while(inlenleft) { + st = iconv(ic, (char**)&src, &inlenleft, &out_ptr, &outlenleft); + if(st == -1) { + if(errno == E2BIG) { + int diff = out_ptr - outbuf; + outlen += inlenleft; + outlenleft += inlenleft; + outbuf = (char*)realloc(outbuf, outlen + 1); + if(!outbuf) { + break; + } + out_ptr = outbuf + diff; + } + else { + free(outbuf); + outbuf = 0; + break; + } + } + } + } + iconv_close(ic); + } + outlen -= outlenleft; + + if(new_len) { + *new_len = outbuf ? outlen : 0; + } + if(outbuf) { + outbuf[outlen] = 0; + } + } + return outbuf; +} + +/* returns a new string that must be freed */ +char* utf8_encode(const char *s, int len, int *newlen, const char* encoding) +{ + return convert(s, len, newlen, encoding, "UTF-8"); +} + +/* returns a new string, possibly decoded */ +char* utf8_decode(const char *s, int len, int *newlen, const char* encoding) +{ + return convert(s, len, newlen, "UTF-8", encoding); +} + diff --git a/php/xmlrpc/libxmlrpc/encodings.h b/php/xmlrpc/libxmlrpc/encodings.h new file mode 100644 index 0000000..486360b --- /dev/null +++ b/php/xmlrpc/libxmlrpc/encodings.h @@ -0,0 +1,46 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +#ifndef __ENCODINGS__H +#define __ENCODINGS__H + +/* these defines are for legacy purposes. */ +#define encoding_utf_8 "UTF-8" +typedef const char* ENCODING_ID; +#define utf8_get_encoding_id_string(desired_enc) ((const char*)desired_enc) +#define utf8_get_encoding_id_from_string(id_string) ((ENCODING_ID)id_string) + +char* utf8_encode(const char *s, int len, int *newlen, ENCODING_ID encoding); +char* utf8_decode(const char *s, int len, int *newlen, ENCODING_ID encoding); + +#endif /* __ENCODINGS__H */ diff --git a/php/xmlrpc/libxmlrpc/queue.c b/php/xmlrpc/libxmlrpc/queue.c new file mode 100644 index 0000000..ca96034 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/queue.c @@ -0,0 +1,982 @@ +static const char rcsid[] = "#(@) $Id: queue.c,v 1.4 2002/07/05 04:43:53 danda Exp $"; + +/* + * Date last modified: Jan 2001 + * Modifications by Dan Libby (dan@libby.com), including: + * - various fixes, null checks, etc + * - addition of Q_Iter funcs, macros + */ + + +/*-************************************************************** + * + * File : q.c + * + * Author: Peter Yard [1993.01.02] -- 02 Jan 1993 + * + * Disclaimer: This code is released to the public domain. + * + * Description: + * Generic double ended queue (Deque pronounced DEK) for handling + * any data types, with sorting. + * + * By use of various functions in this module the caller + * can create stacks, queues, lists, doubly linked lists, + * sorted lists, indexed lists. All lists are dynamic. + * + * It is the responsibility of the caller to malloc and free + * memory for insertion into the queue. A pointer to the object + * is used so that not only can any data be used but various kinds + * of data can be pushed on the same queue if one so wished e.g. + * various length string literals mixed with pointers to structures + * or integers etc. + * + * Enhancements: + * A future improvement would be the option of multiple "cursors" + * so that multiple locations could occur in the one queue to allow + * placemarkers and additional flexibility. Perhaps even use queue + * itself to have a list of cursors. + * + * Usage: + * + * /x init queue x/ + * queue q; + * Q_Init(&q); + * + * To create a stack : + * + * Q_PushHead(&q, &mydata1); /x push x/ + * Q_PushHead(&q, &mydata2); + * ..... + * data_ptr = Q_PopHead(&q); /x pop x/ + * ..... + * data_ptr = Q_Head(&q); /x top of stack x/ + * + * To create a FIFO: + * + * Q_PushHead(&q, &mydata1); + * ..... + * data_ptr = Q_PopTail(&q); + * + * To create a double list: + * + * data_ptr = Q_Head(&q); + * .... + * data_ptr = Q_Next(&q); + * data_ptr = Q_Tail(&q); + * if (Q_IsEmpty(&q)) .... + * ..... + * data_ptr = Q_Previous(&q); + * + * To create a sorted list: + * + * Q_PushHead(&q, &mydata1); /x push x/ + * Q_PushHead(&q, &mydata2); + * ..... + * if (!Q_Sort(&q, MyFunction)) + * .. error .. + * + * /x fill in key field of mydata1. + * * NB: Q_Find does linear search + * x/ + * + * if (Q_Find(&q, &mydata1, MyFunction)) + * { + * /x found it, queue cursor now at correct record x/ + * /x can retrieve with x/ + * data_ptr = Q_Get(&q); + * + * /x alter data , write back with x/ + * Q_Put(&q, data_ptr); + * } + * + * /x Search with binary search x/ + * if (Q_Seek(&q, &mydata, MyFunction)) + * /x etc x/ + * + * + ****************************************************************/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include "queue.h" + + +static void QuickSort(void *list[], int low, int high, + int (*Comp)(const void *, const void *)); +static int Q_BSearch(queue *q, void *key, + int (*Comp)(const void *, const void *)); + +/* The index: a pointer to pointers */ + +static void **index; +static datanode **posn_index; + + +/*** + * + ** function : Q_Init + * + ** purpose : Initialise queue object and pointers. + * + ** parameters : 'queue' pointer. + * + ** returns : True_ if init successful else False_ + * + ** comments : + ***/ + +int Q_Init(queue *q) +{ + if(q) { + q->head = q->tail = NULL; + q->cursor = q->head; + q->size = 0; + q->sorted = False_; + } + + return True_; +} + +/*** + * + ** function : Q_AtHead + * + ** purpose : tests if cursor is at head of queue + * + ** parameters : 'queue' pointer. + * + ** returns : boolean - True_ is at head else False_ + * + ** comments : + * + ***/ + +int Q_AtHead(queue *q) +{ + return(q && q->cursor == q->head); +} + + +/*** + * + ** function : Q_AtTail + * + ** purpose : boolean test if cursor at tail of queue + * + ** parameters : 'queue' pointer to test. + * + ** returns : True_ or False_ + * + ** comments : + * + ***/ + +int Q_AtTail(queue *q) +{ + return(q && q->cursor == q->tail); +} + + +/*** + * + ** function : Q_IsEmpty + * + ** purpose : test if queue has nothing in it. + * + ** parameters : 'queue' pointer + * + ** returns : True_ if IsEmpty queue, else False_ + * + ** comments : + * + ***/ + +inline int Q_IsEmpty(queue *q) +{ + return(!q || q->size == 0); +} + +/*** + * + ** function : Q_Size + * + ** purpose : return the number of elements in the queue + * + ** parameters : queue pointer + * + ** returns : number of elements + * + ** comments : + * + ***/ + +int Q_Size(queue *q) +{ + return q ? q->size : 0; +} + + +/*** + * + ** function : Q_Head + * + ** purpose : position queue cursor to first element (head) of queue. + * + ** parameters : 'queue' pointer + * + ** returns : pointer to data at head. If queue is IsEmpty returns NULL + * + ** comments : + * + ***/ + +void *Q_Head(queue *q) +{ + if(Q_IsEmpty(q)) + return NULL; + + q->cursor = q->head; + + return q->cursor->data; +} + + +/*** + * + ** function : Q_Tail + * + ** purpose : locate cursor at tail of queue. + * + ** parameters : 'queue' pointer + * + ** returns : pointer to data at tail , if queue IsEmpty returns NULL + * + ** comments : + * + ***/ + +void *Q_Tail(queue *q) +{ + if(Q_IsEmpty(q)) + return NULL; + + q->cursor = q->tail; + + return q->cursor->data; +} + + +/*** + * + ** function : Q_PushHead + * + ** purpose : put a data pointer at the head of the queue + * + ** parameters : 'queue' pointer, void pointer to the data. + * + ** returns : True_ if success else False_ if unable to push data. + * + ** comments : + * + ***/ + +int Q_PushHead(queue *q, void *d) +{ + if(q && d) { + node *n; + datanode *p; + + p = malloc(sizeof(datanode)); + if(p == NULL) + return False_; + + n = q->head; + + q->head = (node*)p; + q->head->prev = NULL; + + if(q->size == 0) { + q->head->next = NULL; + q->tail = q->head; + } + else { + q->head->next = (datanode*)n; + n->prev = q->head; + } + + q->head->data = d; + q->size++; + + q->cursor = q->head; + + q->sorted = False_; + + return True_; + } + return False_; +} + + + +/*** + * + ** function : Q_PushTail + * + ** purpose : put a data element pointer at the tail of the queue + * + ** parameters : queue pointer, pointer to the data + * + ** returns : True_ if data pushed, False_ if data not inserted. + * + ** comments : + * + ***/ + +int Q_PushTail(queue *q, void *d) +{ + if(q && d) { + node *p; + datanode *n; + + n = malloc(sizeof(datanode)); + if(n == NULL) + return False_; + + p = q->tail; + q->tail = (node *)n; + + if(q->size == 0) { + q->tail->prev = NULL; + q->head = q->tail; + } + else { + q->tail->prev = (datanode *)p; + p->next = q->tail; + } + + q->tail->next = NULL; + + q->tail->data = d; + q->cursor = q->tail; + q->size++; + + q->sorted = False_; + + return True_; + } + return False_; +} + + + +/*** + * + ** function : Q_PopHead + * + ** purpose : remove and return the top element at the head of the + * queue. + * + ** parameters : queue pointer + * + ** returns : pointer to data element or NULL if queue is IsEmpty. + * + ** comments : + * + ***/ + +void *Q_PopHead(queue *q) +{ + datanode *n; + void *d; + + if(Q_IsEmpty(q)) + return NULL; + + d = q->head->data; + n = q->head->next; + free(q->head); + + q->size--; + + if(q->size == 0) + q->head = q->tail = q->cursor = NULL; + else { + q->head = (node *)n; + q->head->prev = NULL; + q->cursor = q->head; + } + + q->sorted = False_; + + return d; +} + + +/*** + * + ** function : Q_PopTail + * + ** purpose : remove element from tail of queue and return data. + * + ** parameters : queue pointer + * + ** returns : pointer to data element that was at tail. NULL if queue + * IsEmpty. + * + ** comments : + * + ***/ + +void *Q_PopTail(queue *q) +{ + datanode *p; + void *d; + + if(Q_IsEmpty(q)) + return NULL; + + d = q->tail->data; + p = q->tail->prev; + free(q->tail); + q->size--; + + if(q->size == 0) + q->head = q->tail = q->cursor = NULL; + else { + q->tail = (node *)p; + q->tail->next = NULL; + q->cursor = q->tail; + } + + q->sorted = False_; + + return d; +} + + + +/*** + * + ** function : Q_Next + * + ** purpose : Move to the next element in the queue without popping + * + ** parameters : queue pointer. + * + ** returns : pointer to data element of new element or NULL if end + * of the queue. + * + ** comments : This uses the cursor for the current position. Q_Next + * only moves in the direction from the head of the queue + * to the tail. + ***/ + +void *Q_Next(queue *q) +{ + if(!q) + return NULL; + + if(!q->cursor || q->cursor->next == NULL) + return NULL; + + q->cursor = (node *)q->cursor->next; + + return q->cursor->data ; +} + + + +/*** + * + ** function : Q_Previous + * + ** purpose : Opposite of Q_Next. Move to next element closer to the + * head of the queue. + * + ** parameters : pointer to queue + * + ** returns : pointer to data of new element else NULL if queue IsEmpty + * + ** comments : Makes cursor move towards the head of the queue. + * + ***/ + +void *Q_Previous(queue *q) +{ + if(!q) + return NULL; + + if(q->cursor->prev == NULL) + return NULL; + + q->cursor = (node *)q->cursor->prev; + + return q->cursor->data; +} + + +void *Q_Iter_Del(queue *q, q_iter iter) +{ + void *d; + datanode *n, *p; + + if(!q) + return NULL; + + if(iter == NULL) + return NULL; + + if(iter == (q_iter)q->head) + return Q_PopHead(q); + + if(iter == (q_iter)q->tail) + return Q_PopTail(q); + + n = ((node*)iter)->next; + p = ((node*)iter)->prev; + d = ((node*)iter)->data; + + free(iter); + + if(p) { + p->next = n; + } + if (q->cursor == (node*)iter) { + if (p) { + q->cursor = p; + } else { + q->cursor = n; + } + } + + + if (n != NULL) { + n->prev = p; + } + + q->size--; + + q->sorted = False_; + + return d; +} + + + +/*** + * + ** function : Q_DelCur + * + ** purpose : Delete the current queue element as pointed to by + * the cursor. + * + ** parameters : queue pointer + * + ** returns : pointer to data element. + * + ** comments : WARNING! It is the responsibility of the caller to + * free any memory. Queue cannot distinguish between + * pointers to literals and malloced memory. + * + ***/ + +void *Q_DelCur(queue* q) { + if(q) { + return Q_Iter_Del(q, (q_iter)q->cursor); + } + return 0; +} + + +/*** + * + ** function : Q_Destroy + * + ** purpose : Free all queue resources + * + ** parameters : queue pointer + * + ** returns : null. + * + ** comments : WARNING! It is the responsibility of the caller to + * free any memory. Queue cannot distinguish between + * pointers to literals and malloced memory. + * + ***/ + +void Q_Destroy(queue *q) +{ + while(!Q_IsEmpty(q)) { + Q_PopHead(q); + } +} + + +/*** + * + ** function : Q_Get + * + ** purpose : get the pointer to the data at the cursor location + * + ** parameters : queue pointer + * + ** returns : data element pointer + * + ** comments : + * + ***/ + +void *Q_Get(queue *q) +{ + if(!q) + return NULL; + + if(q->cursor == NULL) + return NULL; + return q->cursor->data; +} + + + +/*** + * + ** function : Q_Put + * + ** purpose : replace pointer to data with new pointer to data. + * + ** parameters : queue pointer, data pointer + * + ** returns : boolean- True_ if successful, False_ if cursor at NULL + * + ** comments : + * + ***/ + +int Q_Put(queue *q, void *data) +{ + if(q && data) { + if(q->cursor == NULL) + return False_; + + q->cursor->data = data; + return True_; + } + return False_; +} + + +/*** + * + ** function : Q_Find + * + ** purpose : Linear search of queue for match with key in *data + * + ** parameters : queue pointer q, data pointer with data containing key + * comparison function here called Comp. + * + ** returns : True_ if found , False_ if not in queue. + * + ** comments : Useful for small queues that are constantly changing + * and would otherwise need constant sorting with the + * Q_Seek function. + * For description of Comp see Q_Sort. + * Queue cursor left on position found item else at end. + * + ***/ + +int Q_Find(queue *q, void *data, + int (*Comp)(const void *, const void *)) +{ + void *d; + + if (q == NULL) { + return False_; + } + + d = Q_Head(q); + do { + if(Comp(d, data) == 0) + return True_; + d = Q_Next(q); + } while(!Q_AtTail(q)); + + if(Comp(d, data) == 0) + return True_; + + return False_; +} + +/*======== Sorted Queue and Index functions ========= */ + + +static void QuickSort(void *list[], int low, int high, + int (*Comp)(const void *, const void *)) +{ + int flag = 1, i, j; + void *key, *temp; + + if(low < high) { + i = low; + j = high + 1; + + key = list[ low ]; + + while(flag) { + i++; + while(Comp(list[i], key) < 0) + i++; + + j--; + while(Comp(list[j], key) > 0) + j--; + + if(i < j) { + temp = list[i]; + list[i] = list[j]; + list[j] = temp; + } + else flag = 0; + } + + temp = list[low]; + list[low] = list[j]; + list[j] = temp; + + QuickSort(list, low, j-1, Comp); + QuickSort(list, j+1, high, Comp); + } +} + + +/*** + * + ** function : Q_Sort + * + ** purpose : sort the queue and allow index style access. + * + ** parameters : queue pointer, comparison function compatible with + * with 'qsort'. + * + ** returns : True_ if sort succeeded. False_ if error occurred. + * + ** comments : Comp function supplied by caller must return + * -1 if data1 < data2 + * 0 if data1 == data2 + * +1 if data1 > data2 + * + * for Comp(data1, data2) + * + * If queue is already sorted it frees the memory of the + * old index and starts again. + * + ***/ + +int Q_Sort(queue *q, int (*Comp)(const void *, const void *)) +{ + int i; + void *d; + datanode *dn; + + /* if already sorted free memory for tag array */ + + if(q->sorted) { + free(index); + free(posn_index); + q->sorted = False_; + } + + /* Now allocate memory of array, array of pointers */ + + index = malloc(q->size * sizeof(q->cursor->data)); + if(index == NULL) + return False_; + + posn_index = malloc(q->size * sizeof(q->cursor)); + if(posn_index == NULL) { + free(index); + return False_; + } + + /* Walk queue putting pointers into array */ + + d = Q_Head(q); + for(i=0; i < q->size; i++) { + index[i] = d; + posn_index[i] = q->cursor; + d = Q_Next(q); + } + + /* Now sort the index */ + + QuickSort(index, 0, q->size - 1, Comp); + + /* Rearrange the actual queue into correct order */ + + dn = q->head; + i = 0; + while(dn != NULL) { + dn->data = index[i++]; + dn = dn->next; + } + + /* Re-position to original element */ + + if(d != NULL) + Q_Find(q, d, Comp); + else Q_Head(q); + + q->sorted = True_; + + return True_; +} + + +/*** + * + ** function : Q_BSearch + * + ** purpose : binary search of queue index for node containing key + * + ** parameters : queue pointer 'q', data pointer of key 'key', + * Comp comparison function. + * + ** returns : integer index into array of node pointers, + * or -1 if not found. + * + ** comments : see Q_Sort for description of 'Comp' function. + * + ***/ + +static int Q_BSearch( queue *q, void *key, + int (*Comp)(const void *, const void*)) +{ + int low, mid, hi, val; + + low = 0; + hi = q->size - 1; + + while(low <= hi) { + mid = (low + hi) / 2; + val = Comp(key, index[ mid ]); + + if(val < 0) + hi = mid - 1; + + else if(val > 0) + low = mid + 1; + + else /* Success */ + return mid; + } + + /* Not Found */ + + return -1; +} + + +/*** + * + ** function : Q_Seek + * + ** purpose : use index to locate data according to key in 'data' + * + ** parameters : queue pointer 'q', data pointer 'data', Comp comparison + * function. + * + ** returns : pointer to data or NULL if could not find it or could + * not sort queue. + * + ** comments : see Q_Sort for description of 'Comp' function. + * + ***/ + +void *Q_Seek(queue *q, void *data, int (*Comp)(const void *, const void *)) +{ + int idx; + + if (q == NULL) { + return NULL; + } + + if(!q->sorted) { + if(!Q_Sort(q, Comp)) + return NULL; + } + + idx = Q_BSearch(q, data, Comp); + + if(idx < 0) + return NULL; + + q->cursor = posn_index[idx]; + + return index[idx]; +} + + + +/*** + * + ** function : Q_Insert + * + ** purpose : Insert an element into an indexed queue + * + ** parameters : queue pointer 'q', data pointer 'data', Comp comparison + * function. + * + ** returns : pointer to data or NULL if could not find it or could + * not sort queue. + * + ** comments : see Q_Sort for description of 'Comp' function. + * WARNING! This code can be very slow since each new + * element means a new Q_Sort. Should only be used for + * the insertion of the odd element ,not the piecemeal + * building of an entire queue. + ***/ + +int Q_Insert(queue *q, void *data, int (*Comp)(const void *, const void *)) +{ + if (q == NULL) { + return False_; + } + + Q_PushHead(q, data); + + if(!Q_Sort(q, Comp)) + return False_; + + return True_; +} + +/* read only funcs for iterating through queue. above funcs modify queue */ +q_iter Q_Iter_Head(queue *q) { + return q ? (q_iter)q->head : NULL; +} + +q_iter Q_Iter_Tail(queue *q) { + return q ? (q_iter)q->tail : NULL; +} + +q_iter Q_Iter_Next(q_iter qi) { + return qi ? (q_iter)((node*)qi)->next : NULL; +} + +q_iter Q_Iter_Prev(q_iter qi) { + return qi ? (q_iter)((node*)qi)->prev : NULL; +} + +void * Q_Iter_Get(q_iter qi) { + return qi ? ((node*)qi)->data : NULL; +} + +int Q_Iter_Put(q_iter qi, void* data) { + if(qi) { + ((node*)qi)->data = data; + return True_; + } + return False_; +} diff --git a/php/xmlrpc/libxmlrpc/queue.h b/php/xmlrpc/libxmlrpc/queue.h new file mode 100644 index 0000000..be73f6d --- /dev/null +++ b/php/xmlrpc/libxmlrpc/queue.h @@ -0,0 +1,89 @@ +/* + * Date last modified: Jan 2001 + * Modifications by Dan Libby (dan@libby.com), including: + * - various fixes, null checks, etc + * - addition of Q_Iter funcs, macros + */ + +/* + * File : q.h + * + * Peter Yard 02 Jan 1993. + * + * Disclaimer: This code is released to the public domain. + */ + +#ifndef Q__H +#define Q__H + +#ifndef False_ + #define False_ 0 +#endif + +#ifndef True_ + #define True_ 1 +#endif + +typedef struct nodeptr datanode; + +typedef struct nodeptr { + void *data ; + datanode *prev, *next ; +} node ; + +/* For external use with Q_Iter* funcs */ +typedef struct nodeptr* q_iter; + +typedef struct { + node *head, *tail, *cursor; + int size, sorted, item_deleted; +} queue; + +typedef struct { + void *dataptr; + node *loc ; +} index_elt ; + + +int Q_Init(queue *q); +void Q_Destroy(queue *q); +int Q_IsEmpty(queue *q); +int Q_Size(queue *q); +int Q_AtHead(queue *q); +int Q_AtTail(queue *q); +int Q_PushHead(queue *q, void *d); +int Q_PushTail(queue *q, void *d); +void *Q_Head(queue *q); +void *Q_Tail(queue *q); +void *Q_PopHead(queue *q); +void *Q_PopTail(queue *q); +void *Q_Next(queue *q); +void *Q_Previous(queue *q); +void *Q_DelCur(queue *q); +void *Q_Get(queue *q); +int Q_Put(queue *q, void *data); +int Q_Sort(queue *q, int (*Comp)(const void *, const void *)); +int Q_Find(queue *q, void *data, + int (*Comp)(const void *, const void *)); +void *Q_Seek(queue *q, void *data, + int (*Comp)(const void *, const void *)); +int Q_Insert(queue *q, void *data, + int (*Comp)(const void *, const void *)); + +/* read only funcs for iterating through queue. above funcs modify queue */ +q_iter Q_Iter_Head(queue *q); +q_iter Q_Iter_Tail(queue *q); +q_iter Q_Iter_Next(q_iter qi); +q_iter Q_Iter_Prev(q_iter qi); +void* Q_Iter_Get(q_iter qi); +int Q_Iter_Put(q_iter qi, void* data); /* not read only! here for completeness. */ +void* Q_Iter_Del(queue *q, q_iter iter); /* not read only! here for completeness. */ + +/* Fast (macro'd) versions of above */ +#define Q_Iter_Head_F(q) (q ? (q_iter)((queue*)q)->head : NULL) +#define Q_Iter_Tail_F(q) (q ? (q_iter)((queue*)q)->tail : NULL) +#define Q_Iter_Next_F(qi) (qi ? (q_iter)((node*)qi)->next : NULL) +#define Q_Iter_Prev_F(qi) (qi ? (q_iter)((node*)qi)->prev : NULL) +#define Q_Iter_Get_F(qi) (qi ? ((node*)qi)->data : NULL) + +#endif /* Q__H */ diff --git a/php/xmlrpc/libxmlrpc/simplestring.c b/php/xmlrpc/libxmlrpc/simplestring.c new file mode 100644 index 0000000..68dab91 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/simplestring.c @@ -0,0 +1,251 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id: simplestring.c,v 1.4 2003/12/16 21:00:21 sniper Exp $"; + + +#define SIMPLESTRING_INCR 32 + +/****h* ABOUT/simplestring + * NAME + * simplestring + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 06/2000 + * HISTORY + * $Log: simplestring.c,v $ + * Revision 1.4 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.3 2002/08/22 01:25:50 sniper + * kill some compile warnings + * + * Revision 1.2 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.4 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.3 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * This code was written primarily for xmlrpc, but has found some other uses. + * + * simplestring is, as the name implies, a simple API for dealing with C strings. + * Why would I write yet another string API? Because I couldn't find any that were + * a) free / GPL, b) simple/lightweight, c) fast, not doing unneccesary strlens all + * over the place. So. It is simple, and it seems to work, and it is pretty fast. + * + * Oh, and it is also binary safe, ie it can handle strings with embedded NULLs, + * so long as the real length is passed in. + * + * And the masses rejoiced. + * + * BUGS + * there must be some. + ******/ + +#include +#include +#include "simplestring.h" + +#define my_free(thing) if(thing) {free(thing); thing = 0;} + +/*----------------------** +* Begin String Functions * +*-----------------------*/ + +/****f* FUNC/simplestring_init + * NAME + * simplestring_init + * SYNOPSIS + * void simplestring_init(simplestring* string) + * FUNCTION + * initialize string + * INPUTS + * string - pointer to a simplestring struct that will be initialized + * RESULT + * void + * NOTES + * SEE ALSO + * simplestring_free () + * simplestring_clear () + * SOURCE + */ +void simplestring_init(simplestring* string) { + memset(string, 0, sizeof(simplestring)); +} +/******/ + +static void simplestring_init_str(simplestring* string) { + string->str = (char*)malloc(SIMPLESTRING_INCR); + if(string->str) { + string->str[0] = 0; + string->len = 0; + string->size = SIMPLESTRING_INCR; + } + else { + string->size = 0; + } +} + +/****f* FUNC/simplestring_clear + * NAME + * simplestring_clear + * SYNOPSIS + * void simplestring_clear(simplestring* string) + * FUNCTION + * clears contents of a string + * INPUTS + * string - the string value to clear + * RESULT + * void + * NOTES + * This function is very fast as it does not de-allocate any memory. + * SEE ALSO + * + * SOURCE + */ +void simplestring_clear(simplestring* string) { + if(string->str) { + string->str[0] = 0; + } + string->len = 0; +} +/******/ + +/****f* FUNC/simplestring_free + * NAME + * simplestring_free + * SYNOPSIS + * void simplestring_free(simplestring* string) + * FUNCTION + * frees contents of a string, if any. Does *not* free the simplestring struct itself. + * INPUTS + * string - value containing string to be free'd + * RESULT + * void + * NOTES + * caller is responsible for allocating and freeing simplestring* struct itself. + * SEE ALSO + * simplestring_init () + * SOURCE + */ +void simplestring_free(simplestring* string) { + if(string && string->str) { + my_free(string->str); + string->len = 0; + } +} +/******/ + +/****f* FUNC/simplestring_addn + * NAME + * simplestring_addn + * SYNOPSIS + * void simplestring_addn(simplestring* string, const char* add, int add_len) + * FUNCTION + * copies n characters from source to target string + * INPUTS + * target - target string + * source - source string + * add_len - number of characters to copy + * RESULT + * void + * NOTES + * SEE ALSO + * simplestring_add () + * SOURCE + */ +void simplestring_addn(simplestring* target, const char* source, int add_len) { + if(target && source) { + if(!target->str) { + simplestring_init_str(target); + } + if(target->len + add_len + 1 > target->size) { + /* newsize is current length + new length */ + int newsize = target->len + add_len + 1; + int incr = target->size * 2; + + /* align to SIMPLESTRING_INCR increments */ + newsize = newsize - (newsize % incr) + incr; + target->str = (char*)realloc(target->str, newsize); + + target->size = target->str ? newsize : 0; + } + + if(target->str) { + if(add_len) { + memcpy(target->str + target->len, source, add_len); + } + target->len += add_len; + target->str[target->len] = 0; /* null terminate */ + } + } +} +/******/ + +/****f* FUNC/simplestring_add + * NAME + * simplestring_add + * SYNOPSIS + * void simplestring_add(simplestring* string, const char* add) + * FUNCTION + * appends a string of unknown length from source to target + * INPUTS + * target - the target string to append to + * source - the source string of unknown length + * RESULT + * void + * NOTES + * SEE ALSO + * simplestring_addn () + * SOURCE + */ +void simplestring_add(simplestring* target, const char* source) { + if(target && source) { + simplestring_addn(target, source, strlen(source)); + } +} +/******/ + + +/*---------------------- +* End String Functions * +*--------------------**/ diff --git a/php/xmlrpc/libxmlrpc/simplestring.h b/php/xmlrpc/libxmlrpc/simplestring.h new file mode 100644 index 0000000..c5d98cf --- /dev/null +++ b/php/xmlrpc/libxmlrpc/simplestring.h @@ -0,0 +1,76 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef __SIMPLESTRING_H__ + #define __SIMPLESTRING_H__ + +/*-******************************** +* begin simplestring header stuff * +**********************************/ + +#ifdef __cplusplus +extern "C" { +#endif + + /****s* struct/simplestring + * NAME + * simplestring + * NOTES + * represents a string efficiently for fast appending, etc. + * SOURCE + */ +typedef struct _simplestring { + char* str; /* string buf */ + int len; /* length of string/buf */ + int size; /* size of allocated buffer */ +} simplestring; +/******/ + +#ifndef NULL + #define NULL 0 +#endif + +void simplestring_init(simplestring* string); +void simplestring_clear(simplestring* string); +void simplestring_free(simplestring* string); +void simplestring_add(simplestring* string, const char* add); +void simplestring_addn(simplestring* string, const char* add, int add_len); + +#ifdef __cplusplus +} +#endif + +/*-****************************** +* end simplestring header stuff * +********************************/ + +#endif /* __SIMPLESTRING_H__ */ diff --git a/php/xmlrpc/libxmlrpc/system_methods.c b/php/xmlrpc/libxmlrpc/system_methods.c new file mode 100644 index 0000000..c3c2b88 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/system_methods.c @@ -0,0 +1,378 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +/****h* ABOUT/system_methods + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * HISTORY + * $Log: system_methods.c,v $ + * Revision 1.2 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.7 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 4/28/2001 -- danda -- adding system.multicall and separating out system methods. + * TODO + * NOTES + *******/ + + +#include "queue.h" +#include "xmlrpc.h" +#include "xmlrpc_private.h" +#include "xmlrpc_introspection_private.h" +#include "system_methods_private.h" +#include +#include +#include + + +static const char* xsm_introspection_xml = +"" + +"" + "" + + "" + "value identifier" + "value's xmlrpc or user-defined type" + "value's textual description " + "true if value is optional, else it is required " + "a child of this element. n/a for scalar types " + "" + + "" + "" + "" + + "" + "" + "" + + + "" + + "" + + "" + "" + "Dan Libby" + "fully describes the methods and types implemented by this XML-RPC server." + "1.1" + "" + "" + "" + "" + "a valid method name" + "" + "" + "" + "" + "" + "" + "method name" + "method version" + "method author" + "method purpose" + "" + "" + "parameter list" + "return value list" + "" + "" + "list of known bugs" + "list of possible errors and error codes" + "list of examples" + "list of modifications" + "list of notes" + "see also. list of related methods" + "list of unimplemented features" + "" + "" + "" + "a type description" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "enumerates the methods implemented by this XML-RPC server." + "1.0" + "" + "" + "" + "" + "name of a method implemented by the server." + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "provides documentation string for a single method" + "1.0" + "" + "" + "" + "name of the method for which documentation is desired" + "" + "" + "help text if defined for the method passed, otherwise an empty string" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "provides 1 or more signatures for a single method" + "1.0" + "" + "" + "" + "name of the method for which documentation is desired" + "" + "" + "" + "" + "a string indicating the xmlrpc type of a value. one of: string, int, double, base64, datetime, array, struct" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "executes multiple methods in sequence and returns the results" + "1.0" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "returns a list of capabilities supported by this server" + "1.0" + "spec url: http://groups.yahoo.com/group/xml-rpc/message/2897" + "" + "" + "" + "" + "" + "www address of the specification defining this capability" + "version of the spec that this server's implementation conforms to" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" +""; + + +/* forward declarations for static (non public, non api) funcs */ +static XMLRPC_VALUE xsm_system_multicall_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xsm_system_get_capabilities_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); + +/*-******************* +* System Methods API * +*********************/ + +static void xsm_lazy_doc_methods_cb(XMLRPC_SERVER server, void* userData) { + XMLRPC_VALUE xDesc = XMLRPC_IntrospectionCreateDescription(xsm_introspection_xml, NULL); + XMLRPC_ServerAddIntrospectionData(server, xDesc); + XMLRPC_CleanupValue(xDesc); +} + +void xsm_register(XMLRPC_SERVER server) { + xi_register_system_methods(server); + + XMLRPC_ServerRegisterMethod(server, xsm_token_system_multicall, xsm_system_multicall_cb); + XMLRPC_ServerRegisterMethod(server, xsm_token_system_get_capabilities, xsm_system_get_capabilities_cb); + + /* callback for documentation generation should it be requested */ + XMLRPC_ServerRegisterIntrospectionCallback(server, xsm_lazy_doc_methods_cb); +} + +XMLRPC_VALUE xsm_system_multicall_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xArray = XMLRPC_VectorRewind(XMLRPC_RequestGetData(input)); + XMLRPC_VALUE xReturn = XMLRPC_CreateVector(0, xmlrpc_vector_array); + + if (xArray) { + XMLRPC_VALUE xMethodIter = XMLRPC_VectorRewind(xArray); + + while (xMethodIter) { + XMLRPC_REQUEST request = XMLRPC_RequestNew(); + if(request) { + const char* methodName = XMLRPC_VectorGetStringWithID(xMethodIter, "methodName"); + XMLRPC_VALUE params = XMLRPC_VectorGetValueWithID(xMethodIter, "params"); + + if(methodName && params) { + XMLRPC_VALUE xRandomArray = XMLRPC_CreateVector(0, xmlrpc_vector_array); + XMLRPC_RequestSetMethodName(request, methodName); + XMLRPC_RequestSetData(request, params); + XMLRPC_RequestSetRequestType(request, xmlrpc_request_call); + + XMLRPC_AddValueToVector(xRandomArray, + XMLRPC_ServerCallMethod(server, request, userData)); + + XMLRPC_AddValueToVector(xReturn, xRandomArray); + } + XMLRPC_RequestFree(request, 1); + } + xMethodIter = XMLRPC_VectorNext(xArray); + } + } + return xReturn; +} + + +XMLRPC_VALUE xsm_system_get_capabilities_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xReturn = XMLRPC_CreateVector(0, xmlrpc_vector_struct); + XMLRPC_VALUE xFaults = XMLRPC_CreateVector("faults_interop", xmlrpc_vector_struct); + XMLRPC_VALUE xIntro = XMLRPC_CreateVector("introspection", xmlrpc_vector_struct); + + /* support for fault spec */ + XMLRPC_VectorAppendString(xFaults, "specURL", "http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php", 0); + XMLRPC_VectorAppendInt(xFaults, "specVersion", 20010516); + + /* support for introspection spec */ + XMLRPC_VectorAppendString(xIntro, "specURL", "http://xmlrpc-epi.sourceforge.net/specs/rfc.introspection.php", 0); + XMLRPC_VectorAppendInt(xIntro, "specVersion", 20010516); + + XMLRPC_AddValuesToVector(xReturn, + xFaults, + xIntro, + NULL); + + return xReturn; + +} + +/*-*********************** +* End System Methods API * +*************************/ + + + diff --git a/php/xmlrpc/libxmlrpc/system_methods_private.h b/php/xmlrpc/libxmlrpc/system_methods_private.h new file mode 100644 index 0000000..72408fd --- /dev/null +++ b/php/xmlrpc/libxmlrpc/system_methods_private.h @@ -0,0 +1,91 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Dan Libby, Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* IMPORTANT! + * + * only non-public things should be in this file. It is fine for any .c file + * in xmlrpc/src to include it, but users of the public API should never + * include it, and thus *.h files that are part of the public API should + * never include it, or they would break if this file is not present. + */ + + +#ifndef __SYSTEM_METHODS_PRIVATE_H +/* + * Avoid include redundancy. + */ +#define __SYSTEM_METHODS_PRIVATE_H + +/*---------------------------------------------------------------------------- + * system_methods_private.h + * + * Purpose: + * define non-public system.* methods + * Comments: + * xsm = xmlrpc system methods + */ + +/*---------------------------------------------------------------------------- + * Constants + */ +#define xsm_token_system_multicall "system.multiCall" +#define xsm_token_system_get_capabilities "system.getCapabilities" + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +void xsm_register(XMLRPC_SERVER server); +int xsm_is_system_method(XMLRPC_Callback cb); + +/*---------------------------------------------------------------------------- + * Macros + */ + + +#endif /* __SYSTEM_METHODS_PRIVATE_H */ + + + + diff --git a/php/xmlrpc/libxmlrpc/xml_element.c b/php/xmlrpc/libxmlrpc/xml_element.c new file mode 100644 index 0000000..a4ba37e --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_element.c @@ -0,0 +1,750 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id: xml_element.c,v 1.6 2004/06/01 20:16:06 iliaa Exp $"; + + + +/****h* ABOUT/xml_element + * NAME + * xml_element + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 06/2000 + * HISTORY + * $Log: xml_element.c,v $ + * Revision 1.6 2004/06/01 20:16:06 iliaa + * Fixed bug #28597 (xmlrpc_encode_request() incorrectly encodes chars in + * 200-210 range). + * Patch by: fernando dot nemec at folha dot com dot br + * + * Revision 1.5 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.4 2002/11/26 23:01:16 fmk + * removing unused variables + * + * Revision 1.3 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.9 2002/07/03 20:54:30 danda + * root element should not have a parent. patch from anon SF user + * + * Revision 1.8 2002/05/23 17:46:51 danda + * patch from mukund - fix non utf-8 encoding conversions + * + * Revision 1.7 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.6 2002/01/08 01:06:55 danda + * enable format for parsers that are very picky. + * + * Revision 1.5 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * TODO + * Nicer external API. Get rid of macros. Make opaque types, etc. + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * This code incorporates ideas from expat-ensor from http://xml.ensor.org. + * + * It was coded primarily to act as a go-between for expat and xmlrpc. To this + * end, it stores xml elements, their sub-elements, and their attributes in an + * in-memory tree. When expat is done parsing, the tree can be walked, thus + * retrieving the values. The code can also be used to build a tree via API then + * write out the tree to a buffer, thus "serializing" the xml. + * + * It turns out this is useful for other purposes, such as parsing config files. + * YMMV. + * + * Some Features: + * - output option for xml escaping data. Choices include no escaping, entity escaping, + * or CDATA sections. + * - output option for character encoding. Defaults to (none) utf-8. + * - output option for verbosity/readability. ultra-compact, newlines, pretty/level indented. + * + * BUGS + * there must be some. + ******/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include + +#include "xml_element.h" +#include "queue.h" +#include "expat.h" +#include "encodings.h" + +#define my_free(thing) if(thing) {free(thing); thing = NULL;} + +#define XML_DECL_START "" +#define XML_DECL_END_LEN sizeof(XML_DECL_END) - 1 +#define START_TOKEN_BEGIN "<" +#define START_TOKEN_BEGIN_LEN sizeof(START_TOKEN_BEGIN) - 1 +#define START_TOKEN_END ">" +#define START_TOKEN_END_LEN sizeof(START_TOKEN_END) - 1 +#define EMPTY_START_TOKEN_END "/>" +#define EMPTY_START_TOKEN_END_LEN sizeof(EMPTY_START_TOKEN_END) - 1 +#define END_TOKEN_BEGIN "" +#define END_TOKEN_END_LEN sizeof(END_TOKEN_END) - 1 +#define ATTR_DELIMITER "\"" +#define ATTR_DELIMITER_LEN sizeof(ATTR_DELIMITER) - 1 +#define CDATA_BEGIN "" +#define CDATA_END_LEN sizeof(CDATA_END) - 1 +#define EQUALS "=" +#define EQUALS_LEN sizeof(EQUALS) - 1 +#define WHITESPACE " " +#define WHITESPACE_LEN sizeof(WHITESPACE) - 1 +#define NEWLINE "\n" +#define NEWLINE_LEN sizeof(NEWLINE) - 1 +#define MAX_VAL_BUF 144 +#define SCALAR_STR "SCALAR" +#define SCALAR_STR_LEN sizeof(SCALAR_STR) - 1 +#define VECTOR_STR "VECTOR" +#define VECTOR_STR_LEN sizeof(VECTOR_STR) - 1 +#define RESPONSE_STR "RESPONSE" +#define RESPONSE_STR_LEN sizeof(RESPONSE_STR) - 1 + + +/*----------------------------- +- Begin xml_element Functions - +-----------------------------*/ + +/****f* xml_element/xml_elem_free_non_recurse + * NAME + * xml_elem_free_non_recurse + * SYNOPSIS + * void xml_elem_free_non_recurse(xml_element* root) + * FUNCTION + * free a single xml element. child elements will not be freed. + * INPUTS + * root - the element to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free_non_recurse(xml_element* root) { + if(root) { + xml_element_attr* attrs = Q_Head(&root->attrs); + while(attrs) { + my_free(attrs->key); + my_free(attrs->val); + my_free(attrs); + attrs = Q_Next(&root->attrs); + } + + Q_Destroy(&root->children); + Q_Destroy(&root->attrs); + if (root->name) { + free((char *)root->name); + root->name = NULL; + } + simplestring_free(&root->text); + my_free(root); + } +} +/******/ + +/****f* xml_element/xml_elem_free + * NAME + * xml_elem_free + * SYNOPSIS + * void xml_elem_free(xml_element* root) + * FUNCTION + * free an xml element and all of its child elements + * INPUTS + * root - the root of an xml tree you would like to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free_non_recurse () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free(xml_element* root) { + if(root) { + xml_element* kids = Q_Head(&root->children); + while(kids) { + xml_elem_free(kids); + kids = Q_Next(&root->children); + } + xml_elem_free_non_recurse(root); + } +} +/******/ + +/****f* xml_element/xml_elem_new + * NAME + * xml_elem_new + * SYNOPSIS + * xml_element* xml_elem_new() + * FUNCTION + * allocates and initializes a new xml_element + * INPUTS + * none + * RESULT + * xml_element* or NULL. NULL indicates an out-of-memory condition. + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_free_non_recurse () + * SOURCE + */ +xml_element* xml_elem_new() { + xml_element* elem = calloc(1, sizeof(xml_element)); + if(elem) { + Q_Init(&elem->children); + Q_Init(&elem->attrs); + simplestring_init(&elem->text); + + /* init empty string in case we don't find any char data */ + simplestring_addn(&elem->text, "", 0); + } + return elem; +} +/******/ + +static int xml_elem_writefunc(int (*fptr)(void *data, const char *text, int size), const char *text, void *data, int len) +{ + return fptr && text ? fptr(data, text, len ? len : strlen(text)) : 0; +} + + + +static int create_xml_escape(char *pString, unsigned char c) +{ + int counter = 0; + + pString[counter++] = '&'; + pString[counter++] = '#'; + if(c >= 100) { + pString[counter++] = c / 100 + '0'; + c = c % 100; + } + pString[counter++] = c / 10 + '0'; + c = c % 10; + + pString[counter++] = c + '0'; + pString[counter++] = ';'; + return counter; +} + +#define non_ascii(c) (c > 127) +#define non_print(c) (!isprint(c)) +#define markup(c) (c == '&' || c == '\"' || c == '>' || c == '<') +#define entity_length(c) ( (c >= 100) ? 3 : ((c >= 10) ? 2 : 1) ) + 3; /* "&#" + c + ";" */ + +/* + * xml_elem_entity_escape + * + * Purpose: + * escape reserved xml chars and non utf-8 chars as xml entities + * Comments: + * The return value may be a new string, or null if no + * conversion was performed. In the latter case, *newlen will + * be 0. + * Flags (to escape) + * xml_elem_no_escaping = 0x000, + * xml_elem_entity_escaping = 0x002, // escape xml special chars as entities + * xml_elem_non_ascii_escaping = 0x008, // escape chars above 127 + * xml_elem_cdata_escaping = 0x010, // wrap in cdata + */ +static char* xml_elem_entity_escape(const char* buf, int old_len, int *newlen, XML_ELEM_ESCAPING flags) { + char *pRetval = 0; + int iNewBufLen=0; + +#define should_escape(c, flag) ( ((flag & xml_elem_markup_escaping) && markup(c)) || \ + ((flag & xml_elem_non_ascii_escaping) && non_ascii(c)) || \ + ((flag & xml_elem_non_print_escaping) && non_print(c)) ) + + if(buf && *buf) { + const unsigned char *bufcopy; + char *NewBuffer; + int ToBeXmlEscaped=0; + int iLength; + bufcopy = buf; + iLength= old_len ? old_len : strlen(buf); + while(*bufcopy) { + if( should_escape(*bufcopy, flags) ) { + /* the length will increase by length of xml escape - the character length */ + iLength += entity_length(*bufcopy); + ToBeXmlEscaped=1; + } + bufcopy++; + } + + if(ToBeXmlEscaped) { + + NewBuffer= malloc(iLength+1); + if(NewBuffer) { + bufcopy=buf; + while(*bufcopy) { + if(should_escape(*bufcopy, flags)) { + iNewBufLen += create_xml_escape(NewBuffer+iNewBufLen,*bufcopy); + } + else { + NewBuffer[iNewBufLen++]=*bufcopy; + } + bufcopy++; + } + NewBuffer[iNewBufLen] = 0; + pRetval = NewBuffer; + } + } + } + + if(newlen) { + *newlen = iNewBufLen; + } + + return pRetval; +} + + +static void xml_element_serialize(xml_element *el, int (*fptr)(void *data, const char *text, int size), void *data, XML_ELEM_OUTPUT_OPTIONS options, int depth) +{ + int i; + static STRUCT_XML_ELEM_OUTPUT_OPTIONS default_opts = {xml_elem_pretty, xml_elem_markup_escaping | xml_elem_non_print_escaping, XML_DECL_ENCODING_DEFAULT}; + static char whitespace[] = " " + " " + " "; + depth++; + + if(!el) { + fprintf(stderr, "Nothing to write\n"); + return; + } + if(!options) { + options = &default_opts; + } + + /* print xml declaration if at root level */ + if(depth == 1) { + xml_elem_writefunc(fptr, XML_DECL_START, data, XML_DECL_START_LEN); + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_VERSION, data, XML_DECL_VERSION_LEN); + if(options->encoding && *options->encoding) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_ENCODING_ATTR, data, XML_DECL_ENCODING_ATTR_LEN); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, options->encoding, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + } + xml_elem_writefunc(fptr, XML_DECL_END, data, XML_DECL_END_LEN); + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + /* begin element */ + xml_elem_writefunc(fptr,START_TOKEN_BEGIN, data, START_TOKEN_BEGIN_LEN); + if(el->name) { + xml_elem_writefunc(fptr, el->name, data, 0); + + /* write attrs, if any */ + if(Q_Size(&el->attrs)) { + xml_element_attr* iter = Q_Head(&el->attrs); + while( iter ) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, iter->key, data, 0); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, iter->val, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + + iter = Q_Next(&el->attrs); + } + } + } + else { + xml_elem_writefunc(fptr, "None", data, 0); + } + /* if no text and no children, use abbreviated form, eg: */ + if(!el->text.len && !Q_Size(&el->children)) { + xml_elem_writefunc(fptr, EMPTY_START_TOKEN_END, data, EMPTY_START_TOKEN_END_LEN); + } + /* otherwise, print element contents */ + else { + xml_elem_writefunc(fptr, START_TOKEN_END, data, START_TOKEN_END_LEN); + + /* print text, if any */ + if(el->text.len) { + char* escaped_str = el->text.str; + int buflen = el->text.len; + + if(options->escaping && options->escaping != xml_elem_cdata_escaping) { + escaped_str = xml_elem_entity_escape(el->text.str, buflen, &buflen, options->escaping ); + if(!escaped_str) { + escaped_str = el->text.str; + } + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_BEGIN, data, CDATA_BEGIN_LEN); + } + + xml_elem_writefunc(fptr, escaped_str, data, buflen); + + if(escaped_str != el->text.str) { + my_free(escaped_str); + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_END, data, CDATA_END_LEN); + } + } + /* no text, so print child elems */ + else { + xml_element *kids = Q_Head(&el->children); + i = 0; + while( kids ) { + if(i++ == 0) { + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + xml_element_serialize(kids, fptr, data, options, depth); + kids = Q_Next(&el->children); + } + if(i) { + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + } + } + + xml_elem_writefunc(fptr, END_TOKEN_BEGIN, data, END_TOKEN_BEGIN_LEN); + xml_elem_writefunc(fptr,el->name ? el->name : "None", data, 0); + xml_elem_writefunc(fptr, END_TOKEN_END, data, END_TOKEN_END_LEN); + } + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } +} + +/* print buf to file */ +static int file_out_fptr(void *f, const char *text, int size) +{ + fputs(text, (FILE *)f); + return 0; +} + +/* print buf to simplestring */ +static int simplestring_out_fptr(void *f, const char *text, int size) +{ + simplestring* buf = (simplestring*)f; + if(buf) { + simplestring_addn(buf, text, size); + } + return 0; +} + +/****f* xml_element/xml_elem_serialize_to_string + * NAME + * xml_elem_serialize_to_string + * SYNOPSIS + * void xml_element_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) + * FUNCTION + * writes element tree as XML into a newly allocated buffer + * INPUTS + * el - root element of tree + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * buf_len - length of returned buffer, if not null. + * RESULT + * char* or NULL. Must be free'd by caller. + * NOTES + * SEE ALSO + * xml_elem_serialize_to_stream () + * xml_elem_parse_buf () + * SOURCE + */ +char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) +{ + simplestring buf; + simplestring_init(&buf); + + xml_element_serialize(el, simplestring_out_fptr, (void *)&buf, options, 0); + + if(buf_len) { + *buf_len = buf.len; + } + + return buf.str; +} +/******/ + +/****f* xml_element/xml_elem_serialize_to_stream + * NAME + * xml_elem_serialize_to_stream + * SYNOPSIS + * void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) + * FUNCTION + * writes element tree as XML into a stream (typically an opened file) + * INPUTS + * el - root element of tree + * output - stream handle + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_parse_buf () + * SOURCE + */ +void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) +{ + xml_element_serialize(el, file_out_fptr, (void *)output, options, 0); +} +/******/ + +/*--------------------------* +* End xml_element Functions * +*--------------------------*/ + + +/*---------------------- +* Begin Expat Handlers * +*---------------------*/ + +typedef struct _xml_elem_data { + xml_element* root; + xml_element* current; + XML_ELEM_INPUT_OPTIONS input_options; + int needs_enc_conversion; +} xml_elem_data; + + +/* expat start of element handler */ +static void startElement(void *userData, const char *name, const char **attrs) +{ + xml_element *c; + xml_elem_data* mydata = (xml_elem_data*)userData; + const char** p = attrs; + + if(mydata) { + c = mydata->current; + + mydata->current = xml_elem_new(); + mydata->current->name = (char*)strdup(name); + mydata->current->parent = c; + + /* init attrs */ + while(p && *p) { + xml_element_attr* attr = malloc(sizeof(xml_element_attr)); + if(attr) { + attr->key = strdup(*p); + attr->val = strdup(*(p+1)); + Q_PushTail(&mydata->current->attrs, attr); + + p += 2; + } + } + } +} + +/* expat end of element handler */ +static void endElement(void *userData, const char *name) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + + if(mydata && mydata->current && mydata->current->parent) { + Q_PushTail(&mydata->current->parent->children, mydata->current); + + mydata->current = mydata->current->parent; + } +} + +/* expat char data handler */ +static void charHandler(void *userData, + const char *s, + int len) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + if(mydata && mydata->current) { + + /* Check if we need to decode utf-8 parser output to another encoding */ + if(mydata->needs_enc_conversion && mydata->input_options->encoding) { + int new_len = 0; + char* add_text = utf8_decode(s, len, &new_len, mydata->input_options->encoding); + if(add_text) { + len = new_len; + simplestring_addn(&mydata->current->text, add_text, len); + free(add_text); + return; + } + } + simplestring_addn(&mydata->current->text, s, len); + } +} +/******/ + +/*-------------------* +* End Expat Handlers * +*-------------------*/ + +/*-------------------* +* xml_elem_parse_buf * +*-------------------*/ + +/****f* xml_element/xml_elem_parse_buf + * NAME + * xml_elem_parse_buf + * SYNOPSIS + * xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) + * FUNCTION + * parse a buffer containing XML into an xml_element in-memory tree + * INPUTS + * in_buf - buffer containing XML document + * len - length of buffer + * options - input options. optional + * error - error result data. optional. check if result is null. + * RESULT + * void + * NOTES + * The returned data must be free'd by caller + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_free () + * SOURCE + */ +xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) +{ + xml_element* xReturn = NULL; + char buf[100] = ""; + static STRUCT_XML_ELEM_INPUT_OPTIONS default_opts = {encoding_utf_8}; + + if(!options) { + options = &default_opts; + } + + if(in_buf) { + XML_Parser parser; + xml_elem_data mydata = {0}; + + parser = XML_ParserCreate(NULL); + + mydata.root = xml_elem_new(); + mydata.current = mydata.root; + mydata.input_options = options; + mydata.needs_enc_conversion = options->encoding && strcmp(options->encoding, encoding_utf_8); + + XML_SetElementHandler(parser, startElement, endElement); + XML_SetCharacterDataHandler(parser, charHandler); + + /* pass the xml_elem_data struct along */ + XML_SetUserData(parser, (void*)&mydata); + + if(!len) { + len = strlen(in_buf); + } + + /* parse the XML */ + if(XML_Parse(parser, in_buf, len, 1) == 0) { + enum XML_Error err_code = XML_GetErrorCode(parser); + int line_num = XML_GetCurrentLineNumber(parser); + int col_num = XML_GetCurrentColumnNumber(parser); + long byte_idx = XML_GetCurrentByteIndex(parser); + int byte_total = XML_GetCurrentByteCount(parser); + const char * error_str = XML_ErrorString(err_code); + if(byte_idx >= 0) { + snprintf(buf, + sizeof(buf), + "\n\tdata beginning %ld before byte index: %s\n", + byte_idx > 10 ? 10 : byte_idx, + in_buf + (byte_idx > 10 ? byte_idx - 10 : byte_idx)); + } + + fprintf(stderr, "expat reports error code %i\n" + "\tdescription: %s\n" + "\tline: %i\n" + "\tcolumn: %i\n" + "\tbyte index: %ld\n" + "\ttotal bytes: %i\n%s ", + err_code, error_str, line_num, + col_num, byte_idx, byte_total, buf); + + + /* error condition */ + if(error) { + error->parser_code = (long)err_code; + error->line = line_num; + error->column = col_num; + error->byte_index = byte_idx; + error->parser_error = error_str; + } + } + else { + xReturn = (xml_element*)Q_Head(&mydata.root->children); + xReturn->parent = NULL; + } + + XML_ParserFree(parser); + + + xml_elem_free_non_recurse(mydata.root); + } + + return xReturn; +} + +/******/ diff --git a/php/xmlrpc/libxmlrpc/xml_element.c.gcc4 b/php/xmlrpc/libxmlrpc/xml_element.c.gcc4 new file mode 100644 index 0000000..f1a23a9 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_element.c.gcc4 @@ -0,0 +1,747 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id: xml_element.c,v 1.6 2004/06/01 20:16:06 iliaa Exp $"; + + + +/****h* ABOUT/xml_element + * NAME + * xml_element + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 06/2000 + * HISTORY + * $Log: xml_element.c,v $ + * Revision 1.6 2004/06/01 20:16:06 iliaa + * Fixed bug #28597 (xmlrpc_encode_request() incorrectly encodes chars in + * 200-210 range). + * Patch by: fernando dot nemec at folha dot com dot br + * + * Revision 1.5 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.4 2002/11/26 23:01:16 fmk + * removing unused variables + * + * Revision 1.3 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.9 2002/07/03 20:54:30 danda + * root element should not have a parent. patch from anon SF user + * + * Revision 1.8 2002/05/23 17:46:51 danda + * patch from mukund - fix non utf-8 encoding conversions + * + * Revision 1.7 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.6 2002/01/08 01:06:55 danda + * enable format for parsers that are very picky. + * + * Revision 1.5 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * TODO + * Nicer external API. Get rid of macros. Make opaque types, etc. + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * This code incorporates ideas from expat-ensor from http://xml.ensor.org. + * + * It was coded primarily to act as a go-between for expat and xmlrpc. To this + * end, it stores xml elements, their sub-elements, and their attributes in an + * in-memory tree. When expat is done parsing, the tree can be walked, thus + * retrieving the values. The code can also be used to build a tree via API then + * write out the tree to a buffer, thus "serializing" the xml. + * + * It turns out this is useful for other purposes, such as parsing config files. + * YMMV. + * + * Some Features: + * - output option for xml escaping data. Choices include no escaping, entity escaping, + * or CDATA sections. + * - output option for character encoding. Defaults to (none) utf-8. + * - output option for verbosity/readability. ultra-compact, newlines, pretty/level indented. + * + * BUGS + * there must be some. + ******/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include + +#include "xml_element.h" +#include "queue.h" +#include "expat.h" +#include "encodings.h" + +#define my_free(thing) if(thing) {free(thing); thing = 0;} + +#define XML_DECL_START "" +#define XML_DECL_END_LEN sizeof(XML_DECL_END) - 1 +#define START_TOKEN_BEGIN "<" +#define START_TOKEN_BEGIN_LEN sizeof(START_TOKEN_BEGIN) - 1 +#define START_TOKEN_END ">" +#define START_TOKEN_END_LEN sizeof(START_TOKEN_END) - 1 +#define EMPTY_START_TOKEN_END "/>" +#define EMPTY_START_TOKEN_END_LEN sizeof(EMPTY_START_TOKEN_END) - 1 +#define END_TOKEN_BEGIN "" +#define END_TOKEN_END_LEN sizeof(END_TOKEN_END) - 1 +#define ATTR_DELIMITER "\"" +#define ATTR_DELIMITER_LEN sizeof(ATTR_DELIMITER) - 1 +#define CDATA_BEGIN "" +#define CDATA_END_LEN sizeof(CDATA_END) - 1 +#define EQUALS "=" +#define EQUALS_LEN sizeof(EQUALS) - 1 +#define WHITESPACE " " +#define WHITESPACE_LEN sizeof(WHITESPACE) - 1 +#define NEWLINE "\n" +#define NEWLINE_LEN sizeof(NEWLINE) - 1 +#define MAX_VAL_BUF 144 +#define SCALAR_STR "SCALAR" +#define SCALAR_STR_LEN sizeof(SCALAR_STR) - 1 +#define VECTOR_STR "VECTOR" +#define VECTOR_STR_LEN sizeof(VECTOR_STR) - 1 +#define RESPONSE_STR "RESPONSE" +#define RESPONSE_STR_LEN sizeof(RESPONSE_STR) - 1 + + +/*----------------------------- +- Begin xml_element Functions - +-----------------------------*/ + +/****f* xml_element/xml_elem_free_non_recurse + * NAME + * xml_elem_free_non_recurse + * SYNOPSIS + * void xml_elem_free_non_recurse(xml_element* root) + * FUNCTION + * free a single xml element. child elements will not be freed. + * INPUTS + * root - the element to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free_non_recurse(xml_element* root) { + if(root) { + xml_element_attr* attrs = Q_Head(&root->attrs); + while(attrs) { + my_free(attrs->key); + my_free(attrs->val); + my_free(attrs); + attrs = Q_Next(&root->attrs); + } + + Q_Destroy(&root->children); + Q_Destroy(&root->attrs); + my_free((char*)root->name); + simplestring_free(&root->text); + my_free(root); + } +} +/******/ + +/****f* xml_element/xml_elem_free + * NAME + * xml_elem_free + * SYNOPSIS + * void xml_elem_free(xml_element* root) + * FUNCTION + * free an xml element and all of its child elements + * INPUTS + * root - the root of an xml tree you would like to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free_non_recurse () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free(xml_element* root) { + if(root) { + xml_element* kids = Q_Head(&root->children); + while(kids) { + xml_elem_free(kids); + kids = Q_Next(&root->children); + } + xml_elem_free_non_recurse(root); + } +} +/******/ + +/****f* xml_element/xml_elem_new + * NAME + * xml_elem_new + * SYNOPSIS + * xml_element* xml_elem_new() + * FUNCTION + * allocates and initializes a new xml_element + * INPUTS + * none + * RESULT + * xml_element* or NULL. NULL indicates an out-of-memory condition. + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_free_non_recurse () + * SOURCE + */ +xml_element* xml_elem_new() { + xml_element* elem = calloc(1, sizeof(xml_element)); + if(elem) { + Q_Init(&elem->children); + Q_Init(&elem->attrs); + simplestring_init(&elem->text); + + /* init empty string in case we don't find any char data */ + simplestring_addn(&elem->text, "", 0); + } + return elem; +} +/******/ + +static int xml_elem_writefunc(int (*fptr)(void *data, const char *text, int size), const char *text, void *data, int len) +{ + return fptr && text ? fptr(data, text, len ? len : strlen(text)) : 0; +} + + + +static int create_xml_escape(char *pString, unsigned char c) +{ + int counter = 0; + + pString[counter++] = '&'; + pString[counter++] = '#'; + if(c >= 100) { + pString[counter++] = c / 100 + '0'; + c = c % 100; + } + pString[counter++] = c / 10 + '0'; + c = c % 10; + + pString[counter++] = c + '0'; + pString[counter++] = ';'; + return counter; +} + +#define non_ascii(c) (c > 127) +#define non_print(c) (!isprint(c)) +#define markup(c) (c == '&' || c == '\"' || c == '>' || c == '<') +#define entity_length(c) ( (c >= 100) ? 3 : ((c >= 10) ? 2 : 1) ) + 3; /* "&#" + c + ";" */ + +/* + * xml_elem_entity_escape + * + * Purpose: + * escape reserved xml chars and non utf-8 chars as xml entities + * Comments: + * The return value may be a new string, or null if no + * conversion was performed. In the latter case, *newlen will + * be 0. + * Flags (to escape) + * xml_elem_no_escaping = 0x000, + * xml_elem_entity_escaping = 0x002, // escape xml special chars as entities + * xml_elem_non_ascii_escaping = 0x008, // escape chars above 127 + * xml_elem_cdata_escaping = 0x010, // wrap in cdata + */ +static char* xml_elem_entity_escape(const char* buf, int old_len, int *newlen, XML_ELEM_ESCAPING flags) { + char *pRetval = 0; + int iNewBufLen=0; + +#define should_escape(c, flag) ( ((flag & xml_elem_markup_escaping) && markup(c)) || \ + ((flag & xml_elem_non_ascii_escaping) && non_ascii(c)) || \ + ((flag & xml_elem_non_print_escaping) && non_print(c)) ) + + if(buf && *buf) { + const unsigned char *bufcopy; + char *NewBuffer; + int ToBeXmlEscaped=0; + int iLength; + bufcopy = buf; + iLength= old_len ? old_len : strlen(buf); + while(*bufcopy) { + if( should_escape(*bufcopy, flags) ) { + /* the length will increase by length of xml escape - the character length */ + iLength += entity_length(*bufcopy); + ToBeXmlEscaped=1; + } + bufcopy++; + } + + if(ToBeXmlEscaped) { + + NewBuffer= malloc(iLength+1); + if(NewBuffer) { + bufcopy=buf; + while(*bufcopy) { + if(should_escape(*bufcopy, flags)) { + iNewBufLen += create_xml_escape(NewBuffer+iNewBufLen,*bufcopy); + } + else { + NewBuffer[iNewBufLen++]=*bufcopy; + } + bufcopy++; + } + NewBuffer[iNewBufLen] = 0; + pRetval = NewBuffer; + } + } + } + + if(newlen) { + *newlen = iNewBufLen; + } + + return pRetval; +} + + +static void xml_element_serialize(xml_element *el, int (*fptr)(void *data, const char *text, int size), void *data, XML_ELEM_OUTPUT_OPTIONS options, int depth) +{ + int i; + static STRUCT_XML_ELEM_OUTPUT_OPTIONS default_opts = {xml_elem_pretty, xml_elem_markup_escaping | xml_elem_non_print_escaping, XML_DECL_ENCODING_DEFAULT}; + static char whitespace[] = " " + " " + " "; + depth++; + + if(!el) { + fprintf(stderr, "Nothing to write\n"); + return; + } + if(!options) { + options = &default_opts; + } + + /* print xml declaration if at root level */ + if(depth == 1) { + xml_elem_writefunc(fptr, XML_DECL_START, data, XML_DECL_START_LEN); + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_VERSION, data, XML_DECL_VERSION_LEN); + if(options->encoding && *options->encoding) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_ENCODING_ATTR, data, XML_DECL_ENCODING_ATTR_LEN); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, options->encoding, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + } + xml_elem_writefunc(fptr, XML_DECL_END, data, XML_DECL_END_LEN); + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + /* begin element */ + xml_elem_writefunc(fptr,START_TOKEN_BEGIN, data, START_TOKEN_BEGIN_LEN); + if(el->name) { + xml_elem_writefunc(fptr, el->name, data, 0); + + /* write attrs, if any */ + if(Q_Size(&el->attrs)) { + xml_element_attr* iter = Q_Head(&el->attrs); + while( iter ) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, iter->key, data, 0); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, iter->val, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + + iter = Q_Next(&el->attrs); + } + } + } + else { + xml_elem_writefunc(fptr, "None", data, 0); + } + /* if no text and no children, use abbreviated form, eg: */ + if(!el->text.len && !Q_Size(&el->children)) { + xml_elem_writefunc(fptr, EMPTY_START_TOKEN_END, data, EMPTY_START_TOKEN_END_LEN); + } + /* otherwise, print element contents */ + else { + xml_elem_writefunc(fptr, START_TOKEN_END, data, START_TOKEN_END_LEN); + + /* print text, if any */ + if(el->text.len) { + char* escaped_str = el->text.str; + int buflen = el->text.len; + + if(options->escaping && options->escaping != xml_elem_cdata_escaping) { + escaped_str = xml_elem_entity_escape(el->text.str, buflen, &buflen, options->escaping ); + if(!escaped_str) { + escaped_str = el->text.str; + } + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_BEGIN, data, CDATA_BEGIN_LEN); + } + + xml_elem_writefunc(fptr, escaped_str, data, buflen); + + if(escaped_str != el->text.str) { + my_free(escaped_str); + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_END, data, CDATA_END_LEN); + } + } + /* no text, so print child elems */ + else { + xml_element *kids = Q_Head(&el->children); + i = 0; + while( kids ) { + if(i++ == 0) { + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + xml_element_serialize(kids, fptr, data, options, depth); + kids = Q_Next(&el->children); + } + if(i) { + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + } + } + + xml_elem_writefunc(fptr, END_TOKEN_BEGIN, data, END_TOKEN_BEGIN_LEN); + xml_elem_writefunc(fptr,el->name ? el->name : "None", data, 0); + xml_elem_writefunc(fptr, END_TOKEN_END, data, END_TOKEN_END_LEN); + } + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } +} + +/* print buf to file */ +static int file_out_fptr(void *f, const char *text, int size) +{ + fputs(text, (FILE *)f); + return 0; +} + +/* print buf to simplestring */ +static int simplestring_out_fptr(void *f, const char *text, int size) +{ + simplestring* buf = (simplestring*)f; + if(buf) { + simplestring_addn(buf, text, size); + } + return 0; +} + +/****f* xml_element/xml_elem_serialize_to_string + * NAME + * xml_elem_serialize_to_string + * SYNOPSIS + * void xml_element_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) + * FUNCTION + * writes element tree as XML into a newly allocated buffer + * INPUTS + * el - root element of tree + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * buf_len - length of returned buffer, if not null. + * RESULT + * char* or NULL. Must be free'd by caller. + * NOTES + * SEE ALSO + * xml_elem_serialize_to_stream () + * xml_elem_parse_buf () + * SOURCE + */ +char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) +{ + simplestring buf; + simplestring_init(&buf); + + xml_element_serialize(el, simplestring_out_fptr, (void *)&buf, options, 0); + + if(buf_len) { + *buf_len = buf.len; + } + + return buf.str; +} +/******/ + +/****f* xml_element/xml_elem_serialize_to_stream + * NAME + * xml_elem_serialize_to_stream + * SYNOPSIS + * void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) + * FUNCTION + * writes element tree as XML into a stream (typically an opened file) + * INPUTS + * el - root element of tree + * output - stream handle + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_parse_buf () + * SOURCE + */ +void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) +{ + xml_element_serialize(el, file_out_fptr, (void *)output, options, 0); +} +/******/ + +/*--------------------------* +* End xml_element Functions * +*--------------------------*/ + + +/*---------------------- +* Begin Expat Handlers * +*---------------------*/ + +typedef struct _xml_elem_data { + xml_element* root; + xml_element* current; + XML_ELEM_INPUT_OPTIONS input_options; + int needs_enc_conversion; +} xml_elem_data; + + +/* expat start of element handler */ +static void startElement(void *userData, const char *name, const char **attrs) +{ + xml_element *c; + xml_elem_data* mydata = (xml_elem_data*)userData; + const char** p = attrs; + + if(mydata) { + c = mydata->current; + + mydata->current = xml_elem_new(); + mydata->current->name = (char*)strdup(name); + mydata->current->parent = c; + + /* init attrs */ + while(p && *p) { + xml_element_attr* attr = malloc(sizeof(xml_element_attr)); + if(attr) { + attr->key = strdup(*p); + attr->val = strdup(*(p+1)); + Q_PushTail(&mydata->current->attrs, attr); + + p += 2; + } + } + } +} + +/* expat end of element handler */ +static void endElement(void *userData, const char *name) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + + if(mydata && mydata->current && mydata->current->parent) { + Q_PushTail(&mydata->current->parent->children, mydata->current); + + mydata->current = mydata->current->parent; + } +} + +/* expat char data handler */ +static void charHandler(void *userData, + const char *s, + int len) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + if(mydata && mydata->current) { + + /* Check if we need to decode utf-8 parser output to another encoding */ + if(mydata->needs_enc_conversion && mydata->input_options->encoding) { + int new_len = 0; + char* add_text = utf8_decode(s, len, &new_len, mydata->input_options->encoding); + if(add_text) { + len = new_len; + simplestring_addn(&mydata->current->text, add_text, len); + free(add_text); + return; + } + } + simplestring_addn(&mydata->current->text, s, len); + } +} +/******/ + +/*-------------------* +* End Expat Handlers * +*-------------------*/ + +/*-------------------* +* xml_elem_parse_buf * +*-------------------*/ + +/****f* xml_element/xml_elem_parse_buf + * NAME + * xml_elem_parse_buf + * SYNOPSIS + * xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) + * FUNCTION + * parse a buffer containing XML into an xml_element in-memory tree + * INPUTS + * in_buf - buffer containing XML document + * len - length of buffer + * options - input options. optional + * error - error result data. optional. check if result is null. + * RESULT + * void + * NOTES + * The returned data must be free'd by caller + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_free () + * SOURCE + */ +xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) +{ + xml_element* xReturn = NULL; + char buf[100] = ""; + static STRUCT_XML_ELEM_INPUT_OPTIONS default_opts = {encoding_utf_8}; + + if(!options) { + options = &default_opts; + } + + if(in_buf) { + XML_Parser parser; + xml_elem_data mydata = {0}; + + parser = XML_ParserCreate(NULL); + + mydata.root = xml_elem_new(); + mydata.current = mydata.root; + mydata.input_options = options; + mydata.needs_enc_conversion = options->encoding && strcmp(options->encoding, encoding_utf_8); + + XML_SetElementHandler(parser, startElement, endElement); + XML_SetCharacterDataHandler(parser, charHandler); + + /* pass the xml_elem_data struct along */ + XML_SetUserData(parser, (void*)&mydata); + + if(!len) { + len = strlen(in_buf); + } + + /* parse the XML */ + if(XML_Parse(parser, in_buf, len, 1) == 0) { + enum XML_Error err_code = XML_GetErrorCode(parser); + int line_num = XML_GetCurrentLineNumber(parser); + int col_num = XML_GetCurrentColumnNumber(parser); + long byte_idx = XML_GetCurrentByteIndex(parser); + int byte_total = XML_GetCurrentByteCount(parser); + const char * error_str = XML_ErrorString(err_code); + if(byte_idx >= 0) { + snprintf(buf, + sizeof(buf), + "\n\tdata beginning %ld before byte index: %s\n", + byte_idx > 10 ? 10 : byte_idx, + in_buf + (byte_idx > 10 ? byte_idx - 10 : byte_idx)); + } + + fprintf(stderr, "expat reports error code %i\n" + "\tdescription: %s\n" + "\tline: %i\n" + "\tcolumn: %i\n" + "\tbyte index: %ld\n" + "\ttotal bytes: %i\n%s ", + err_code, error_str, line_num, + col_num, byte_idx, byte_total, buf); + + + /* error condition */ + if(error) { + error->parser_code = (long)err_code; + error->line = line_num; + error->column = col_num; + error->byte_index = byte_idx; + error->parser_error = error_str; + } + } + else { + xReturn = (xml_element*)Q_Head(&mydata.root->children); + xReturn->parent = NULL; + } + + XML_ParserFree(parser); + + + xml_elem_free_non_recurse(mydata.root); + } + + return xReturn; +} + +/******/ diff --git a/php/xmlrpc/libxmlrpc/xml_element.h b/php/xmlrpc/libxmlrpc/xml_element.h new file mode 100644 index 0000000..cfe7ca2 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_element.h @@ -0,0 +1,202 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef __XML_ELEMENT_H__ + #define __XML_ELEMENT_H__ + +/* includes */ +#include +#include "queue.h" +#include "simplestring.h" +#include "encodings.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****d* enum/XML_ELEM_VERBOSITY + * NAME + * XML_ELEM_VERBOSITY + * NOTES + * verbosity/readability options for generated xml + * SEE ALSO + * XML_ELEM_OUTPUT_OPTIONS + * SOURCE + */ +typedef enum _xml_elem_verbosity { + xml_elem_no_white_space, /* compact xml with no white space */ + xml_elem_newlines_only, /* add newlines for enhanced readability */ + xml_elem_pretty /* add newlines and indent accordint to depth */ +} XML_ELEM_VERBOSITY; +/******/ + + +/****d* enum/XML_ELEM_ESCAPING + * NAME + * XML_ELEM_ESCAPING + * NOTES + * xml escaping options for generated xml + * SEE ALSO + * XML_ELEM_OUTPUT_OPTIONS + * SOURCE + */ +typedef enum _xml_elem_escaping { + xml_elem_no_escaping = 0x000, + xml_elem_markup_escaping = 0x002, /* entity escape xml special chars */ + xml_elem_non_ascii_escaping = 0x008, /* entity escape chars above 127 */ + xml_elem_non_print_escaping = 0x010, /* entity escape non print (illegal) chars */ + xml_elem_cdata_escaping = 0x020, /* wrap in cdata section */ +} XML_ELEM_ESCAPING; +/******/ + + +/****s* struct/XML_ELEM_OUTPUT_OPTIONS + * NAME + * XML_ELEM_OUTPUT_OPTIONS + * NOTES + * defines various output options + * SOURCE + */ +typedef struct _xml_output_options { + XML_ELEM_VERBOSITY verbosity; /* length/verbosity of xml */ + XML_ELEM_ESCAPING escaping; /* how to escape special chars */ + const char* encoding; /* " ?> */ +} STRUCT_XML_ELEM_OUTPUT_OPTIONS, *XML_ELEM_OUTPUT_OPTIONS; +/******/ + +/****s* struct/XML_ELEM_INPUT_OPTIONS + * NAME + * XML_ELEM_INPUT_OPTIONS + * NOTES + * defines various input options + * SOURCE + */ +typedef struct _xml_input_options { + ENCODING_ID encoding; /* which encoding to use. */ +} STRUCT_XML_ELEM_INPUT_OPTIONS, *XML_ELEM_INPUT_OPTIONS; +/******/ + +/****s* struct/XML_ELEM_ERROR + * NAME + * XML_ELEM_ERROR + * NOTES + * defines an xml parser error + * SOURCE + */ +typedef struct _xml_elem_error { + int parser_code; + const char* parser_error; + long line; + long column; + long byte_index; +} STRUCT_XML_ELEM_ERROR, *XML_ELEM_ERROR; +/******/ + + +/*-************************ +* begin xml element stuff * +**************************/ + +/****s* struct/xml_elem_attr + * NAME + * xml_elem_attr + * NOTES + * representation of an xml attribute, foo="bar" + * SOURCE + */ +typedef struct _xml_element_attr { + char* key; /* attribute key */ + char* val; /* attribute value */ +} xml_element_attr; +/******/ + +/****s* struct/xml_elem_attr + * NAME + * xml_elem_attr + * NOTES + * representation of an xml element, eg + * SOURCE + */ +typedef struct _xml_element { + const char* name; /* element identifier */ + simplestring text; /* text contained between element begin/end pairs */ + struct _xml_element* parent; /* element's parent */ + + queue attrs; /* attribute list */ + queue children; /* child element list */ +} xml_element; +/******/ + +void xml_elem_free(xml_element* root); +void xml_elem_free_non_recurse(xml_element* root); +xml_element* xml_elem_new(void); +char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len); +void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options); +xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error); + +/*-********************** +* end xml element stuff * +************************/ + +/*-********************** +* Begin xml_element API * +************************/ + +/****d* VALUE/XMLRPC_MACROS + * NAME + * Some Helpful Macros + * NOTES + * Some macros for making life easier. Should be self-explanatory. + * SEE ALSO + * XMLRPC_AddValueToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * SOURCE + */ +#define xml_elem_next_element(el) ((el) ? (xml_element *)Q_Next(&el->children) : NULL) +#define xml_elem_head_element(el) ((el) ? (xml_element *)Q_Head(&el->children) : NULL) +#define xml_elem_next_attr(el) ((el) ? (xml_element_attr *)Q_Next(&el->attrs) : NULL) +#define xml_elem_head_attr(el) ((el) ? (xml_element_attr *)Q_Head(&el->attrs) : NULL) +#define xml_elem_get_name(el) (char *)((el) ? el->name : NULL) +#define xml_elem_get_val(el) (char *)((el) ? el->text.str : NULL) +/******/ + + +/*-******************** +* End xml_element API * +**********************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_ELEMENT_H__ */ diff --git a/php/xmlrpc/libxmlrpc/xml_to_dandarpc.c b/php/xmlrpc/libxmlrpc/xml_to_dandarpc.c new file mode 100644 index 0000000..b51d991 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_to_dandarpc.c @@ -0,0 +1,319 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include "xml_to_dandarpc.h" +#include "base64.h" + +/* list of tokens used in vocab */ +#define ELEM_METHODCALL "methodCall" +#define ELEM_METHODNAME "methodName" +#define ELEM_METHODRESPONSE "methodResponse" +#define ELEM_ROOT "simpleRPC" + +#define ATTR_ARRAY "array" +#define ATTR_BASE64 "base64" +#define ATTR_BOOLEAN "boolean" +#define ATTR_DATETIME "dateTime.iso8601" +#define ATTR_DOUBLE "double" +#define ATTR_ID "id" +#define ATTR_INT "int" +#define ATTR_MIXED "mixed" +#define ATTR_SCALAR "scalar" +#define ATTR_STRING "string" +#define ATTR_STRUCT "struct" +#define ATTR_TYPE "type" +#define ATTR_VECTOR "vector" +#define ATTR_VERSION "version" + +#define VAL_VERSION_0_9 "0.9" + + +XMLRPC_VALUE xml_element_to_DANDARPC_REQUEST_worker(XMLRPC_REQUEST request, XMLRPC_VALUE xCurrent, xml_element* el) { + if(!xCurrent) { + xCurrent = XMLRPC_CreateValueEmpty(); + } + + if(el->name) { + const char* id = NULL; + const char* type = NULL; + xml_element_attr* attr_iter = Q_Head(&el->attrs); + + while(attr_iter) { + if(!strcmp(attr_iter->key, ATTR_ID)) { + id = attr_iter->val; + } + if(!strcmp(attr_iter->key, ATTR_TYPE)) { + type = attr_iter->val; + } + attr_iter = Q_Next(&el->attrs); + } + + if(id) { + XMLRPC_SetValueID_Case(xCurrent, id, 0, xmlrpc_case_exact); + } + + if(!strcmp(el->name, ATTR_SCALAR)) { + if(!type || !strcmp(type, ATTR_STRING)) { + XMLRPC_SetValueString(xCurrent, el->text.str, el->text.len); + } + else if(!strcmp(type, ATTR_INT)) { + XMLRPC_SetValueInt(xCurrent, atoi(el->text.str)); + } + else if(!strcmp(type, ATTR_BOOLEAN)) { + XMLRPC_SetValueBoolean(xCurrent, atoi(el->text.str)); + } + else if(!strcmp(type, ATTR_DOUBLE)) { + XMLRPC_SetValueDouble(xCurrent, atof(el->text.str)); + } + else if(!strcmp(type, ATTR_DATETIME)) { + XMLRPC_SetValueDateTime_ISO8601(xCurrent, el->text.str); + } + else if(!strcmp(type, ATTR_BASE64)) { + struct buffer_st buf; + base64_decode(&buf, el->text.str, el->text.len); + XMLRPC_SetValueBase64(xCurrent, buf.data, buf.offset); + buffer_delete(&buf); + } + } + else if(!strcmp(el->name, ATTR_VECTOR)) { + xml_element* iter = (xml_element*)Q_Head(&el->children); + + if(!type || !strcmp(type, ATTR_MIXED)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_mixed); + } + else if(!strcmp(type, ATTR_ARRAY)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_array); + } + else if(!strcmp(type, ATTR_STRUCT)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_struct); + } + while( iter ) { + XMLRPC_VALUE xNext = XMLRPC_CreateValueEmpty(); + xml_element_to_DANDARPC_REQUEST_worker(request, xNext, iter); + XMLRPC_AddValueToVector(xCurrent, xNext); + iter = (xml_element*)Q_Next(&el->children); + } + } + else { + xml_element* iter = (xml_element*)Q_Head(&el->children); + while( iter ) { + xml_element_to_DANDARPC_REQUEST_worker(request, xCurrent, iter); + iter = (xml_element*)Q_Next(&el->children); + } + + if(!strcmp(el->name, ELEM_METHODCALL)) { + if(request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_call); + } + } + else if(!strcmp(el->name, ELEM_METHODRESPONSE)) { + if(request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_response); + } + } + else if(!strcmp(el->name, ELEM_METHODNAME)) { + if(request) { + XMLRPC_RequestSetMethodName(request, el->text.str); + } + } + } + } + return xCurrent; +} + +XMLRPC_VALUE xml_element_to_DANDARPC_VALUE(xml_element* el) +{ + return xml_element_to_DANDARPC_REQUEST_worker(NULL, NULL, el); +} + +XMLRPC_VALUE xml_element_to_DANDARPC_REQUEST(XMLRPC_REQUEST request, xml_element* el) +{ + if(request) { + return XMLRPC_RequestSetData(request, xml_element_to_DANDARPC_REQUEST_worker(request, NULL, el)); + } + return NULL; +} + +xml_element* DANDARPC_to_xml_element_worker(XMLRPC_REQUEST request, XMLRPC_VALUE node) { +#define BUF_SIZE 512 + xml_element* root = NULL; + if(node) { + char buf[BUF_SIZE]; + const char* id = XMLRPC_GetValueID(node); + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(node); + XMLRPC_REQUEST_OUTPUT_OPTIONS output = XMLRPC_RequestGetOutputOptions(request); + int bNoAddType = (type == xmlrpc_string && request && output && output->xml_elem_opts.verbosity == xml_elem_no_white_space); + xml_element* elem_val = xml_elem_new(); + const char* pAttrType = NULL; + + xml_element_attr* attr_type = bNoAddType ? NULL : malloc(sizeof(xml_element_attr)); + + if(attr_type) { + attr_type->key = strdup(ATTR_TYPE); + attr_type->val = 0; + Q_PushTail(&elem_val->attrs, attr_type); + } + + elem_val->name = (type == xmlrpc_vector) ? strdup(ATTR_VECTOR) : strdup(ATTR_SCALAR); + + if(id && *id) { + xml_element_attr* attr_id = malloc(sizeof(xml_element_attr)); + if(attr_id) { + attr_id->key = strdup(ATTR_ID); + attr_id->val = strdup(id); + Q_PushTail(&elem_val->attrs, attr_id); + } + } + + switch(type) { + case xmlrpc_string: + pAttrType = ATTR_STRING; + simplestring_addn(&elem_val->text, XMLRPC_GetValueString(node), XMLRPC_GetValueStringLen(node)); + break; + case xmlrpc_int: + pAttrType = ATTR_INT; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueInt(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_boolean: + pAttrType = ATTR_BOOLEAN; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueBoolean(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_double: + pAttrType = ATTR_DOUBLE; + snprintf(buf, BUF_SIZE, "%f", XMLRPC_GetValueDouble(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_datetime: + pAttrType = ATTR_DATETIME; + simplestring_add(&elem_val->text, XMLRPC_GetValueDateTime_ISO8601(node)); + break; + case xmlrpc_base64: + { + struct buffer_st buf; + pAttrType = ATTR_BASE64; + base64_encode(&buf, XMLRPC_GetValueBase64(node), XMLRPC_GetValueStringLen(node)); + simplestring_addn(&elem_val->text, buf.data, buf.offset ); + buffer_delete(&buf); + } + break; + case xmlrpc_vector: + { + XMLRPC_VECTOR_TYPE my_type = XMLRPC_GetVectorType(node); + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + + switch(my_type) { + case xmlrpc_vector_array: + pAttrType = ATTR_ARRAY; + break; + case xmlrpc_vector_mixed: + pAttrType = ATTR_MIXED; + break; + case xmlrpc_vector_struct: + pAttrType = ATTR_STRUCT; + break; + default: + break; + } + + /* recurse through sub-elements */ + while( xIter ) { + xml_element* next_el = DANDARPC_to_xml_element_worker(request, xIter); + if(next_el) { + Q_PushTail(&elem_val->children, next_el); + } + xIter = XMLRPC_VectorNext(node); + } + } + break; + default: + break; + } + if(pAttrType && attr_type && !bNoAddType) { + attr_type->val = strdup(pAttrType); + } + root = elem_val; + } + return root; +} + +xml_element* DANDARPC_VALUE_to_xml_element(XMLRPC_VALUE node) { + return DANDARPC_to_xml_element_worker(NULL, node); +} + +xml_element* DANDARPC_REQUEST_to_xml_element(XMLRPC_REQUEST request) { + xml_element* wrapper = NULL; + xml_element* root = NULL; + if(request) { + XMLRPC_REQUEST_TYPE request_type = XMLRPC_RequestGetRequestType(request); + const char* pStr = NULL; + xml_element_attr* version = malloc(sizeof(xml_element_attr)); + version->key = strdup(ATTR_VERSION); + version->val = strdup(VAL_VERSION_0_9); + + wrapper = xml_elem_new(); + + if(request_type == xmlrpc_request_response) { + pStr = ELEM_METHODRESPONSE; + } + else if(request_type == xmlrpc_request_call) { + pStr = ELEM_METHODCALL; + } + if(pStr) { + wrapper->name = strdup(pStr); + } + + root = xml_elem_new(); + root->name = strdup(ELEM_ROOT); + Q_PushTail(&root->attrs, version); + Q_PushTail(&root->children, wrapper); + + pStr = XMLRPC_RequestGetMethodName(request); + + if(pStr) { + xml_element* method = xml_elem_new(); + method->name = strdup(ELEM_METHODNAME); + simplestring_add(&method->text, pStr); + Q_PushTail(&wrapper->children, method); + } + Q_PushTail(&wrapper->children, + DANDARPC_to_xml_element_worker(request, XMLRPC_RequestGetData(request))); + } + return root; +} + diff --git a/php/xmlrpc/libxmlrpc/xml_to_dandarpc.h b/php/xmlrpc/libxmlrpc/xml_to_dandarpc.h new file mode 100644 index 0000000..6facb55 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_to_dandarpc.h @@ -0,0 +1,44 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef XML_TO_DANDARPC_H + #define XML_TO_DANDARPC_H + +#include "time.h" +#include "xmlrpc.h" + +XMLRPC_VALUE xml_element_to_DANDARPC_VALUE(xml_element* el); +XMLRPC_VALUE xml_element_to_DANDARPC_REQUEST(XMLRPC_REQUEST request, xml_element* el); +xml_element* DANDARPC_VALUE_to_xml_element(XMLRPC_VALUE node); +xml_element* DANDARPC_REQUEST_to_xml_element(XMLRPC_REQUEST request); + +#endif /* XML_TO_DANDARPC_H */ diff --git a/php/xmlrpc/libxmlrpc/xml_to_soap.c b/php/xmlrpc/libxmlrpc/xml_to_soap.c new file mode 100644 index 0000000..8390f06 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_to_soap.c @@ -0,0 +1,670 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) +*/ + + +/*-********************************************************************** +* TODO: * +* - [SOAP-ENC:position] read sparse arrays (and write?) * +* - [SOAP-ENC:offset] read partially transmitted arrays (and write?) * +* - read "flattened" multi-dimensional arrays. (don't bother writing) * +* * +* BUGS: * +* - does not read schema. thus only knows soap pre-defined types. * +* - references (probably) do not work. untested. * +* - does not expose SOAP-ENV:Header to application at all. * +* - does not use namespaces correctly, thus: * +* - namespaces are hard-coded in comparison tokens * +* - if a sender uses another namespace identifer, it will break * +************************************************************************/ + + +static const char rcsid[] = "#(@) $Id:"; + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include "xml_to_soap.h" +#include "base64.h" + +/* list of tokens used in vocab */ +#define TOKEN_ANY "xsd:ur-type" +#define TOKEN_ARRAY "SOAP-ENC:Array" +#define TOKEN_ARRAY_TYPE "SOAP-ENC:arrayType" +#define TOKEN_BASE64 "SOAP-ENC:base64" +#define TOKEN_BOOLEAN "xsd:boolean" +#define TOKEN_DATETIME "xsd:timeInstant" +#define TOKEN_DOUBLE "xsd:double" +#define TOKEN_FLOAT "xsd:float" +#define TOKEN_ID "id" +#define TOKEN_INT "xsd:int" +#define TOKEN_NULL "xsi:null" +#define TOKEN_STRING "xsd:string" +#define TOKEN_STRUCT "xsd:struct" +#define TOKEN_TYPE "xsi:type" +#define TOKEN_FAULT "SOAP-ENV:Fault" +#define TOKEN_MUSTUNDERSTAND "SOAP-ENV:mustUnderstand" +#define TOKEN_ACTOR "SOAP-ENV:actor" +#define TOKEN_ACTOR_NEXT "http://schemas.xmlsoap.org/soap/actor/next" + +#define TOKEN_XMLRPC_FAULTCODE "faultCode" +#define TOKEN_XMLRPC_FAULTSTRING "faultString" +#define TOKEN_SOAP_FAULTCODE "faultcode" +#define TOKEN_SOAP_FAULTSTRING "faultstring" +#define TOKEN_SOAP_FAULTDETAILS "details" +#define TOKEN_SOAP_FAULTACTOR "actor" + + +/* determine if a string represents a soap type, as used in element names */ +static inline int is_soap_type(const char* soap_type) { + return(strstr(soap_type, "SOAP-ENC:") || strstr(soap_type, "xsd:")) ? 1 : 0; +} + +/* utility func to generate a new attribute. possibly should be in xml_element.c?? */ +static xml_element_attr* new_attr(const char* key, const char* val) { + xml_element_attr* attr = malloc(sizeof(xml_element_attr)); + if (attr) { + attr->key = key ? strdup(key) : NULL; + attr->val = val ? strdup(val) : NULL; + } + return attr; +} + +struct array_info { + char kids_type[30]; + unsigned long size; + /* ... ? */ +}; + + +/* parses soap arrayType attribute to generate an array_info structure. + * TODO: should deal with sparse, flattened, & multi-dimensional arrays + */ +static struct array_info* parse_array_type_info(const char* array_type) { + struct array_info* ai = NULL; + if (array_type) { + ai = (struct array_info*)calloc(1, sizeof(struct array_info)); + if (ai) { + char buf[128], *p; + snprintf(buf, sizeof(buf), "%s", array_type); + p = strchr(buf, '['); + if (p) { + *p = 0; + } + strcpy(ai->kids_type, buf); + } + } + return ai; +} + +/* performs heuristics on an xmlrpc_vector_array to determine + * appropriate soap arrayType string. + */ +static const char* get_array_soap_type(XMLRPC_VALUE node) { + XMLRPC_VALUE_TYPE_EASY type = xmlrpc_type_none; + + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + int loopCount = 0; + const char* soapType = TOKEN_ANY; + + type = XMLRPC_GetValueTypeEasy(xIter); + xIter = XMLRPC_VectorNext(node); + + while (xIter) { + /* 50 seems like a decent # of loops. That will likely + * cover most cases. Any more and we start to sacrifice + * performance. + */ + if ( (XMLRPC_GetValueTypeEasy(xIter) != type) || loopCount >= 50) { + type = xmlrpc_type_none; + break; + } + loopCount ++; + + xIter = XMLRPC_VectorNext(node); + } + switch (type) { + case xmlrpc_type_none: + soapType = TOKEN_ANY; + break; + case xmlrpc_type_empty: + soapType = TOKEN_NULL; + break; + case xmlrpc_type_int: + soapType = TOKEN_INT; + break; + case xmlrpc_type_double: + soapType = TOKEN_DOUBLE; + break; + case xmlrpc_type_boolean: + soapType = TOKEN_BOOLEAN; + break; + case xmlrpc_type_string: + soapType = TOKEN_STRING; + break; + case xmlrpc_type_base64: + soapType = TOKEN_BASE64; + break; + case xmlrpc_type_datetime: + soapType = TOKEN_DATETIME; + break; + case xmlrpc_type_struct: + soapType = TOKEN_STRUCT; + break; + case xmlrpc_type_array: + soapType = TOKEN_ARRAY; + break; + case xmlrpc_type_mixed: + soapType = TOKEN_STRUCT; + break; + } + return soapType; +} + +/* determines wether a node is a fault or not, and of which type: + * 0 = not a fault, + * 1 = xmlrpc style fault + * 2 = soap style fault. + */ +static inline int get_fault_type(XMLRPC_VALUE node) { + if (XMLRPC_VectorGetValueWithID(node, TOKEN_XMLRPC_FAULTCODE) && + XMLRPC_VectorGetValueWithID(node, TOKEN_XMLRPC_FAULTSTRING)) { + return 1; + } + else if (XMLRPC_VectorGetValueWithID(node, TOKEN_SOAP_FAULTCODE) && + XMLRPC_VectorGetValueWithID(node, TOKEN_SOAP_FAULTSTRING)) { + return 2; + } + return 0; +} + +/* input: an XMLRPC_VALUE representing a fault struct in xml-rpc style. + * output: an XMLRPC_VALUE representing a fault struct in soap style, + * with xmlrpc codes mapped to soap codes, and all other values preserved. + * note that the returned value is a completely new value, and must be freed. + * the input value is untouched. + */ +static XMLRPC_VALUE gen_fault_xmlrpc(XMLRPC_VALUE node, xml_element* el_target) { + XMLRPC_VALUE xDup = XMLRPC_DupValueNew(node); + XMLRPC_VALUE xCode = XMLRPC_VectorGetValueWithID(xDup, TOKEN_XMLRPC_FAULTCODE); + XMLRPC_VALUE xStr = XMLRPC_VectorGetValueWithID(xDup, TOKEN_XMLRPC_FAULTSTRING); + + XMLRPC_SetValueID(xCode, TOKEN_SOAP_FAULTCODE, 0); + XMLRPC_SetValueID(xStr, TOKEN_SOAP_FAULTSTRING, 0); + + /* rough mapping of xmlrpc fault codes to soap codes */ + switch (XMLRPC_GetValueInt(xCode)) { + case -32700: /* "parse error. not well formed", */ + case -32701: /* "parse error. unsupported encoding" */ + case -32702: /* "parse error. invalid character for encoding" */ + case -32600: /* "server error. invalid xml-rpc. not conforming to spec." */ + case -32601: /* "server error. requested method not found" */ + case -32602: /* "server error. invalid method parameters" */ + XMLRPC_SetValueString(xCode, "SOAP-ENV:Client", 0); + break; + case -32603: /* "server error. internal xml-rpc error" */ + case -32500: /* "application error" */ + case -32400: /* "system error" */ + case -32300: /* "transport error */ + XMLRPC_SetValueString(xCode, "SOAP-ENV:Server", 0); + break; + } + return xDup; +} + +/* returns a new XMLRPC_VALUE representing a soap fault, comprised of a struct with four keys. */ +static XMLRPC_VALUE gen_soap_fault(const char* fault_code, const char* fault_string, + const char* actor, const char* details) { + XMLRPC_VALUE xReturn = XMLRPC_CreateVector(TOKEN_FAULT, xmlrpc_vector_struct); + XMLRPC_AddValuesToVector(xReturn, + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTCODE, fault_code, 0), + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTSTRING, fault_string, 0), + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTACTOR, actor, 0), + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTDETAILS, details, 0), + NULL); + return xReturn; +} + +/* translates xml soap dom to native data structures. recursive. */ +XMLRPC_VALUE xml_element_to_SOAP_REQUEST_worker(XMLRPC_REQUEST request, + XMLRPC_VALUE xParent, + struct array_info* parent_array, + XMLRPC_VALUE xCurrent, + xml_element* el, + int depth) { + XMLRPC_REQUEST_TYPE rtype = xmlrpc_request_none; + + /* no current element on first call */ + if (!xCurrent) { + xCurrent = XMLRPC_CreateValueEmpty(); + } + + /* increment recursion depth guage */ + depth ++; + + /* safety first. must have a valid element */ + if (el && el->name) { + const char* id = NULL; + const char* type = NULL, *arrayType=NULL, *actor = NULL; + xml_element_attr* attr_iter = Q_Head(&el->attrs); + int b_must_understand = 0; + + /* in soap, types may be specified in either element name -or- with xsi:type attribute. */ + if (is_soap_type(el->name)) { + type = el->name; + } + /* if our parent node, by definition a vector, is not an array, then + our element name must be our key identifier. */ + else if (XMLRPC_GetVectorType(xParent) != xmlrpc_vector_array) { + id = el->name; + if(!strcmp(id, "item")) { + } + } + + /* iterate through element attributes, pick out useful stuff. */ + while (attr_iter) { + /* element's type */ + if (!strcmp(attr_iter->key, TOKEN_TYPE)) { + type = attr_iter->val; + } + /* array type */ + else if (!strcmp(attr_iter->key, TOKEN_ARRAY_TYPE)) { + arrayType = attr_iter->val; + } + /* must understand, sometimes present in headers. */ + else if (!strcmp(attr_iter->key, TOKEN_MUSTUNDERSTAND)) { + b_must_understand = strchr(attr_iter->val, '1') ? 1 : 0; + } + /* actor, used in conjuction with must understand. */ + else if (!strcmp(attr_iter->key, TOKEN_ACTOR)) { + actor = attr_iter->val; + } + attr_iter = Q_Next(&el->attrs); + } + + /* check if caller says we must understand something in a header. */ + if (b_must_understand) { + /* is must understand actually indended for us? + BUG: spec says we should also determine if actor is our URL, but + we do not have that information. */ + if (!actor || !strcmp(actor, TOKEN_ACTOR_NEXT)) { + /* TODO: implement callbacks or other mechanism for applications + to "understand" these headers. For now, we just bail if we + get a mustUnderstand header intended for us. */ + XMLRPC_RequestSetError(request, + gen_soap_fault("SOAP-ENV:MustUnderstand", + "SOAP Must Understand Error", + "", "")); + return xCurrent; + } + } + + /* set id (key) if one was found. */ + if (id) { + XMLRPC_SetValueID_Case(xCurrent, id, 0, xmlrpc_case_exact); + } + + /* according to soap spec, + depth 1 = Envelope, 2 = Header, Body & Fault, 3 = methodcall or response. */ + if (depth == 3) { + const char* methodname = el->name; + char* p = NULL; + + /* BUG: we determine request or response type using presence of "Response" in element name. + According to spec, this is only recommended, not required. Apparently, implementations + are supposed to know the type of action based on state, which strikes me as a bit lame. + Anyway, we don't have that state info, thus we use Response as a heuristic. */ + rtype = +#ifdef strcasestr + strcasestr(el->name, "response") ? xmlrpc_request_response : xmlrpc_request_call; +#else + strstr(el->name, "esponse") ? xmlrpc_request_response : xmlrpc_request_call; +#endif + XMLRPC_RequestSetRequestType(request, rtype); + + /* Get methodname. strip xml namespace crap. */ + p = strchr(el->name, ':'); + if (p) { + methodname = p + 1; + } + if (rtype == xmlrpc_request_call) { + XMLRPC_RequestSetMethodName(request, methodname); + } + } + + + /* Next, we begin to convert actual values. if no children, then must be a scalar value. */ + if (!Q_Size(&el->children)) { + if (!type && parent_array && parent_array->kids_type[0]) { + type = parent_array->kids_type; + } + if (!type || !strcmp(type, TOKEN_STRING)) { + XMLRPC_SetValueString(xCurrent, el->text.str, el->text.len); + } + else if (!strcmp(type, TOKEN_INT)) { + XMLRPC_SetValueInt(xCurrent, atoi(el->text.str)); + } + else if (!strcmp(type, TOKEN_BOOLEAN)) { + XMLRPC_SetValueBoolean(xCurrent, atoi(el->text.str)); + } + else if (!strcmp(type, TOKEN_DOUBLE) || + !strcmp(type, TOKEN_FLOAT)) { + XMLRPC_SetValueDouble(xCurrent, atof(el->text.str)); + } + else if (!strcmp(type, TOKEN_NULL)) { + /* already an empty val. do nothing. */ + } + else if (!strcmp(type, TOKEN_DATETIME)) { + XMLRPC_SetValueDateTime_ISO8601(xCurrent, el->text.str); + } + else if (!strcmp(type, TOKEN_BASE64)) { + struct buffer_st buf; + base64_decode(&buf, el->text.str, el->text.len); + XMLRPC_SetValueBase64(xCurrent, buf.data, buf.offset); + buffer_delete(&buf); + } + } + /* Element has children, thus a vector, or "compound type" in soap-speak. */ + else { + struct array_info* ai = NULL; + xml_element* iter = (xml_element*)Q_Head(&el->children); + + if (!type || !strcmp(type, TOKEN_STRUCT)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_struct); + } + else if (!strcmp(type, TOKEN_ARRAY) || arrayType != NULL) { + /* determine magic associated with soap array type. + this is passed down as we recurse, so our children have access to the info. */ + ai = parse_array_type_info(arrayType); // alloc'ed ai free'd below. + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_array); + } + else { + /* mixed is probably closest thing we have to compound type. */ + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_mixed); + } + /* Recurse, adding values as we go. Check for error during recursion + and if found, bail. this short-circuits us out of the recursion. */ + while ( iter && !XMLRPC_RequestGetError(request) ) { + XMLRPC_VALUE xNext = NULL; + /* top level elements don't actually represent values, so we just pass the + current value along until we are deep enough. */ + if ( depth <= 2 || + (rtype == xmlrpc_request_response && depth <= 3) ) { + xml_element_to_SOAP_REQUEST_worker(request, NULL, ai, xCurrent, iter, depth); + } + /* ready to do some actual de-serialization. create a new empty value and + pass that along to be init'd, then add it to our current vector. */ + else { + xNext = XMLRPC_CreateValueEmpty(); + xml_element_to_SOAP_REQUEST_worker(request, xCurrent, ai, xNext, iter, depth); + XMLRPC_AddValueToVector(xCurrent, xNext); + } + iter = (xml_element*)Q_Next(&el->children); + } + /* cleanup */ + if (ai) { + free(ai); + } + } + } + return xCurrent; +} + +/* Convert soap xml dom to XMLRPC_VALUE, sans request info. untested. */ +XMLRPC_VALUE xml_element_to_SOAP_VALUE(xml_element* el) +{ + return xml_element_to_SOAP_REQUEST_worker(NULL, NULL, NULL, NULL, el, 0); +} + +/* Convert soap xml dom to XMLRPC_REQUEST */ +XMLRPC_VALUE xml_element_to_SOAP_REQUEST(XMLRPC_REQUEST request, xml_element* el) +{ + if (request) { + return XMLRPC_RequestSetData(request, xml_element_to_SOAP_REQUEST_worker(request, NULL, NULL, NULL, el, 0)); + } + return NULL; +} + + +/* translates data structures to soap/xml. recursive */ +xml_element* SOAP_to_xml_element_worker(XMLRPC_REQUEST request, XMLRPC_VALUE node) { +#define BUF_SIZE 128 + xml_element* elem_val = NULL; + if (node) { + int bFreeNode = 0; /* sometimes we may need to free 'node' variable */ + char buf[BUF_SIZE]; + XMLRPC_VALUE_TYPE_EASY type = XMLRPC_GetValueTypeEasy(node); + char* pName = NULL, *pAttrType = NULL; + + /* create our return value element */ + elem_val = xml_elem_new(); + + switch (type) { + case xmlrpc_type_struct: + case xmlrpc_type_mixed: + case xmlrpc_type_array: + if (type == xmlrpc_type_array) { + /* array's are _very_ special in soap. + TODO: Should handle sparse/partial arrays here. */ + + /* determine soap array type. */ + const char* type = get_array_soap_type(node); + xml_element_attr* attr_array_type = NULL; + + /* specify array kids type and array size. */ + snprintf(buf, sizeof(buf), "%s[%i]", type, XMLRPC_VectorSize(node)); + attr_array_type = new_attr(TOKEN_ARRAY_TYPE, buf); + + Q_PushTail(&elem_val->attrs, attr_array_type); + + pAttrType = TOKEN_ARRAY; + } + /* check for fault, which is a rather special case. + (can't these people design anything consistent/simple/elegant?) */ + else if (type == xmlrpc_type_struct) { + int fault_type = get_fault_type(node); + if (fault_type) { + if (fault_type == 1) { + /* gen fault from xmlrpc style fault codes + notice that we get a new node, which must be freed herein. */ + node = gen_fault_xmlrpc(node, elem_val); + bFreeNode = 1; + } + pName = TOKEN_FAULT; + } + } + + { + /* recurse through sub-elements */ + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + while ( xIter ) { + xml_element* next_el = SOAP_to_xml_element_worker(request, xIter); + if (next_el) { + Q_PushTail(&elem_val->children, next_el); + } + xIter = XMLRPC_VectorNext(node); + } + } + + break; + + /* handle scalar types */ + case xmlrpc_type_empty: + pAttrType = TOKEN_NULL; + break; + case xmlrpc_type_string: + pAttrType = TOKEN_STRING; + simplestring_addn(&elem_val->text, XMLRPC_GetValueString(node), XMLRPC_GetValueStringLen(node)); + break; + case xmlrpc_type_int: + pAttrType = TOKEN_INT; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueInt(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_type_boolean: + pAttrType = TOKEN_BOOLEAN; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueBoolean(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_type_double: + pAttrType = TOKEN_DOUBLE; + snprintf(buf, BUF_SIZE, "%f", XMLRPC_GetValueDouble(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_type_datetime: + { + time_t tt = XMLRPC_GetValueDateTime(node); + struct tm *tm = localtime (&tt); + pAttrType = TOKEN_DATETIME; + if(strftime (buf, BUF_SIZE, "%Y-%m-%dT%H:%M:%SZ", tm)) { + simplestring_add(&elem_val->text, buf); + } + } + break; + case xmlrpc_type_base64: + { + struct buffer_st buf; + pAttrType = TOKEN_BASE64; + base64_encode(&buf, XMLRPC_GetValueBase64(node), XMLRPC_GetValueStringLen(node)); + simplestring_addn(&elem_val->text, buf.data, buf.offset ); + buffer_delete(&buf); + } + break; + break; + default: + break; + } + + /* determining element's name is a bit tricky, due to soap semantics. */ + if (!pName) { + /* if the value's type is known... */ + if (pAttrType) { + /* see if it has an id (key). If so, use that as name, and type as an attribute. */ + pName = (char*)XMLRPC_GetValueID(node); + if (pName) { + Q_PushTail(&elem_val->attrs, new_attr(TOKEN_TYPE, pAttrType)); + } + + /* otherwise, use the type as the name. */ + else { + pName = pAttrType; + } + } + /* if the value's type is not known... (a rare case?) */ + else { + /* see if it has an id (key). otherwise, default to generic "item" */ + pName = (char*)XMLRPC_GetValueID(node); + if (!pName) { + pName = "item"; + } + } + } + elem_val->name = strdup(pName); + + /* cleanup */ + if (bFreeNode) { + XMLRPC_CleanupValue(node); + } + } + return elem_val; +} + +/* convert XMLRPC_VALUE to soap xml dom. untested. */ +xml_element* SOAP_VALUE_to_xml_element(XMLRPC_VALUE node) { + return SOAP_to_xml_element_worker(NULL, node); +} + +/* convert XMLRPC_REQUEST to soap xml dom. */ +xml_element* SOAP_REQUEST_to_xml_element(XMLRPC_REQUEST request) { + xml_element* root = xml_elem_new(); + + /* safety first. */ + if (root) { + xml_element* body = xml_elem_new(); + root->name = strdup("SOAP-ENV:Envelope"); + + /* silly namespace stuff */ + Q_PushTail(&root->attrs, new_attr("xmlns:SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/")); + Q_PushTail(&root->attrs, new_attr("xmlns:xsi", "http://www.w3.org/1999/XMLSchema-instance")); + Q_PushTail(&root->attrs, new_attr("xmlns:xsd", "http://www.w3.org/1999/XMLSchema")); + Q_PushTail(&root->attrs, new_attr("xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/")); + Q_PushTail(&root->attrs, new_attr("xmlns:si", "http://soapinterop.org/xsd")); + Q_PushTail(&root->attrs, new_attr("xmlns:ns6", "http://testuri.org")); + Q_PushTail(&root->attrs, new_attr("SOAP-ENV:encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/")); + + /* Q_PushHead(&root->attrs, new_attr("xmlns:ks", "http://kitchen.sink.org/soap/everything/under/sun")); + JUST KIDDING!! :-) ----> ------------------------------------------------- */ + + if (body) { + /* go ahead and serialize first... */ + xml_element* el_serialized = + SOAP_to_xml_element_worker(request, + XMLRPC_RequestGetData(request)); + + /* check for fault, in which case, there is no intermediate element */ + if (el_serialized && !strcmp(el_serialized->name, TOKEN_FAULT)) { + Q_PushTail(&body->children, el_serialized); + } + /* usual case: not a fault. Add Response element in between. */ + else { + xml_element* rpc = xml_elem_new(); + + if (rpc) { + const char* methodname = XMLRPC_RequestGetMethodName(request); + XMLRPC_REQUEST_TYPE rtype = XMLRPC_RequestGetRequestType(request); + + /* if we are making a request, we want to use the methodname as is. */ + if (rtype == xmlrpc_request_call) { + if (methodname) { + rpc->name = strdup(methodname); + } + } + /* if it's a response, we append "Response". Also, given xmlrpc-epi + API/architecture, it's likely that we don't have a methodname for + the response, so we have to check that. */ + else { + char buf[128]; + snprintf(buf, sizeof(buf), "%s%s", + methodname ? methodname : "", + "Response"); + + rpc->name = strdup(buf); + } + + /* add serialized data to method call/response. + add method call/response to body element */ + if (rpc->name) { + if(el_serialized) { + if(Q_Size(&el_serialized->children) && rtype == xmlrpc_request_call) { + xml_element* iter = (xml_element*)Q_Head(&el_serialized->children); + while(iter) { + Q_PushTail(&rpc->children, iter); + iter = (xml_element*)Q_Next(&el_serialized->children); + } + xml_elem_free_non_recurse(el_serialized); + } + else { + Q_PushTail(&rpc->children, el_serialized); + } + } + + Q_PushTail(&body->children, rpc); + } + else { + /* no method name?! + TODO: fault here...? */ + } + } + } + body->name = strdup("SOAP-ENV:Body"); + Q_PushTail(&root->children, body); + } + } + + return root; +} + diff --git a/php/xmlrpc/libxmlrpc/xml_to_soap.h b/php/xmlrpc/libxmlrpc/xml_to_soap.h new file mode 100644 index 0000000..9ae9308 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_to_soap.h @@ -0,0 +1,44 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +#ifndef XML_TO_SOAP_H + #define XML_TO_SOAP_H + +#include "xmlrpc.h" + +XMLRPC_VALUE xml_element_to_SOAP_VALUE(xml_element* el); +XMLRPC_VALUE xml_element_to_SOAP_REQUEST(XMLRPC_REQUEST request, xml_element* el); +xml_element* SOAP_VALUE_to_xml_element(XMLRPC_VALUE node); +xml_element* SOAP_REQUEST_to_xml_element(XMLRPC_REQUEST request); + +#endif /* XML_TO_XMLRPC_H */ diff --git a/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.c b/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.c new file mode 100644 index 0000000..fb69963 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.c @@ -0,0 +1,413 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id: xml_to_xmlrpc.c,v 1.5 2004/04/27 17:33:59 iliaa Exp $"; + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include "xml_to_xmlrpc.h" +#include "base64.h" + +/* list of tokens used in vocab */ +#define ELEM_ARRAY "array" +#define ELEM_BASE64 "base64" +#define ELEM_BOOLEAN "boolean" +#define ELEM_DATA "data" +#define ELEM_DATETIME "dateTime.iso8601" +#define ELEM_DOUBLE "double" +#define ELEM_FAULT "fault" +#define ELEM_FAULTCODE "faultCode" +#define ELEM_FAULTSTRING "faultString" +#define ELEM_I4 "i4" +#define ELEM_INT "int" +#define ELEM_MEMBER "member" +#define ELEM_METHODCALL "methodCall" +#define ELEM_METHODNAME "methodName" +#define ELEM_METHODRESPONSE "methodResponse" +#define ELEM_NAME "name" +#define ELEM_NIL "nil" +#define ELEM_PARAM "param" +#define ELEM_PARAMS "params" +#define ELEM_STRING "string" +#define ELEM_STRUCT "struct" +#define ELEM_VALUE "value" + + +XMLRPC_VALUE xml_element_to_XMLRPC_REQUEST_worker(XMLRPC_REQUEST request, XMLRPC_VALUE parent_vector, XMLRPC_VALUE current_val, xml_element* el) { + if (!current_val) { + /* This should only be the case for the first element */ + current_val = XMLRPC_CreateValueEmpty(); + } + + if (el->name) { + + /* first, deal with the crazy/stupid fault format */ + if (!strcmp(el->name, ELEM_FAULT)) { + xml_element* fault_value = (xml_element*)Q_Head(&el->children); + XMLRPC_SetIsVector(current_val, xmlrpc_vector_struct); + + if(fault_value) { + xml_element* fault_struct = (xml_element*)Q_Head(&fault_value->children); + if(fault_struct) { + xml_element* iter = (xml_element*)Q_Head(&fault_struct->children); + + while (iter) { + XMLRPC_VALUE xNextVal = XMLRPC_CreateValueEmpty(); + xml_element_to_XMLRPC_REQUEST_worker(request, current_val, xNextVal, iter); + XMLRPC_AddValueToVector(current_val, xNextVal); + iter = (xml_element*)Q_Next(&fault_struct->children); + } + } + } + } + else if (!strcmp(el->name, ELEM_DATA) /* should be ELEM_ARRAY, but there is an extra level. weird */ + || (!strcmp(el->name, ELEM_PARAMS) && + (XMLRPC_RequestGetRequestType(request) == xmlrpc_request_call)) ) { /* this "PARAMS" concept is silly. dave?! */ + xml_element* iter = (xml_element*)Q_Head(&el->children); + XMLRPC_SetIsVector(current_val, xmlrpc_vector_array); + + while (iter) { + XMLRPC_VALUE xNextVal = XMLRPC_CreateValueEmpty(); + xml_element_to_XMLRPC_REQUEST_worker(request, current_val, xNextVal, iter); + XMLRPC_AddValueToVector(current_val, xNextVal); + iter = (xml_element*)Q_Next(&el->children); + } + } + else if (!strcmp(el->name, ELEM_STRUCT)) { + xml_element* iter = (xml_element*)Q_Head(&el->children); + XMLRPC_SetIsVector(current_val, xmlrpc_vector_struct); + + while ( iter ) { + XMLRPC_VALUE xNextVal = XMLRPC_CreateValueEmpty(); + xml_element_to_XMLRPC_REQUEST_worker(request, current_val, xNextVal, iter); + XMLRPC_AddValueToVector(current_val, xNextVal); + iter = (xml_element*)Q_Next(&el->children); + } + } + else if (!strcmp(el->name, ELEM_STRING) || + (!strcmp(el->name, ELEM_VALUE) && Q_Size(&el->children) == 0)) { + XMLRPC_SetValueString(current_val, el->text.str, el->text.len); + } + else if (!strcmp(el->name, ELEM_NAME)) { + XMLRPC_SetValueID_Case(current_val, el->text.str, 0, xmlrpc_case_exact); + } + else if (!strcmp(el->name, ELEM_INT) || !strcmp(el->name, ELEM_I4)) { + XMLRPC_SetValueInt(current_val, atoi(el->text.str)); + } + else if (!strcmp(el->name, ELEM_BOOLEAN)) { + XMLRPC_SetValueBoolean(current_val, atoi(el->text.str)); + } + else if (!strcmp(el->name, ELEM_DOUBLE)) { + XMLRPC_SetValueDouble(current_val, atof(el->text.str)); + } + else if (!strcmp(el->name, ELEM_DATETIME)) { + XMLRPC_SetValueDateTime_ISO8601(current_val, el->text.str); + } + else if (!strcmp(el->name, ELEM_BASE64)) { + struct buffer_st buf; + base64_decode(&buf, el->text.str, el->text.len); + XMLRPC_SetValueBase64(current_val, buf.data, buf.offset); + buffer_delete(&buf); + } + else { + xml_element* iter; + + if (!strcmp(el->name, ELEM_METHODCALL)) { + if (request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_call); + } + } + else if (!strcmp(el->name, ELEM_METHODRESPONSE)) { + if (request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_response); + } + } + else if (!strcmp(el->name, ELEM_METHODNAME)) { + if (request) { + XMLRPC_RequestSetMethodName(request, el->text.str); + } + } + + iter = (xml_element*)Q_Head(&el->children); + while ( iter ) { + xml_element_to_XMLRPC_REQUEST_worker(request, parent_vector, + current_val, iter); + iter = (xml_element*)Q_Next(&el->children); + } + } + } + return current_val; +} + +XMLRPC_VALUE xml_element_to_XMLRPC_VALUE(xml_element* el) +{ + return xml_element_to_XMLRPC_REQUEST_worker(NULL, NULL, NULL, el); +} + +XMLRPC_VALUE xml_element_to_XMLRPC_REQUEST(XMLRPC_REQUEST request, xml_element* el) +{ + if (request) { + return XMLRPC_RequestSetData(request, xml_element_to_XMLRPC_REQUEST_worker(request, NULL, NULL, el)); + } + return NULL; +} + +xml_element* XMLRPC_to_xml_element_worker(XMLRPC_VALUE current_vector, XMLRPC_VALUE node, + XMLRPC_REQUEST_TYPE request_type, int depth) { +#define BUF_SIZE 512 + xml_element* root = NULL; + if (node) { + char buf[BUF_SIZE]; + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(node); + XMLRPC_VECTOR_TYPE vtype = XMLRPC_GetVectorType(node); + xml_element* elem_val = xml_elem_new(); + + /* special case for when root element is not an array */ + if (depth == 0 && + !(type == xmlrpc_vector && + vtype == xmlrpc_vector_array && + request_type == xmlrpc_request_call) ) { + int bIsFault = (vtype == xmlrpc_vector_struct && XMLRPC_VectorGetValueWithID(node, ELEM_FAULTCODE)); + + xml_element* next_el = XMLRPC_to_xml_element_worker(NULL, node, request_type, depth + 1); + if (next_el) { + Q_PushTail(&elem_val->children, next_el); + } + elem_val->name = strdup(bIsFault ? ELEM_FAULT : ELEM_PARAMS); + } + else { + switch (type) { + case xmlrpc_empty: /* treat null value as empty string in xmlrpc. */ + case xmlrpc_nil: + elem_val->name = strdup(ELEM_NIL); + break; + case xmlrpc_string: + elem_val->name = strdup(ELEM_STRING); + simplestring_addn(&elem_val->text, XMLRPC_GetValueString(node), XMLRPC_GetValueStringLen(node)); + break; + case xmlrpc_int: + elem_val->name = strdup(ELEM_INT); + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueInt(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_boolean: + elem_val->name = strdup(ELEM_BOOLEAN); + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueBoolean(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_double: + elem_val->name = strdup(ELEM_DOUBLE); + snprintf(buf, BUF_SIZE, "%f", XMLRPC_GetValueDouble(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_datetime: + elem_val->name = strdup(ELEM_DATETIME); + simplestring_add(&elem_val->text, XMLRPC_GetValueDateTime_ISO8601(node)); + break; + case xmlrpc_base64: + { + struct buffer_st buf; + elem_val->name = strdup(ELEM_BASE64); + base64_encode(&buf, XMLRPC_GetValueBase64(node), XMLRPC_GetValueStringLen(node)); + simplestring_addn(&elem_val->text, buf.data, buf.offset ); + buffer_delete(&buf); + } + break; + case xmlrpc_vector: + { + XMLRPC_VECTOR_TYPE my_type = XMLRPC_GetVectorType(node); + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + xml_element* root_vector_elem = elem_val; + + switch (my_type) { + case xmlrpc_vector_array: + { + if(depth == 0) { + elem_val->name = strdup(ELEM_PARAMS); + } + else { + /* Hi my name is Dave and I like to make things as confusing + * as possible, thus I will throw in this 'data' element + * where it absolutely does not belong just so that people + * cannot code arrays and structs in a similar and straight + * forward manner. Have a good day. + * + * GRRRRRRRRR! + */ + xml_element* data = xml_elem_new(); + data->name = strdup(ELEM_DATA); + + elem_val->name = strdup(ELEM_ARRAY); + Q_PushTail(&elem_val->children, data); + root_vector_elem = data; + } + } + break; + case xmlrpc_vector_mixed: /* not officially supported */ + case xmlrpc_vector_struct: + elem_val->name = strdup(ELEM_STRUCT); + break; + default: + break; + } + + /* recurse through sub-elements */ + while ( xIter ) { + xml_element* next_el = XMLRPC_to_xml_element_worker(node, xIter, request_type, depth + 1); + if (next_el) { + Q_PushTail(&root_vector_elem->children, next_el); + } + xIter = XMLRPC_VectorNext(node); + } + } + break; + default: + break; + } + } + + { + XMLRPC_VECTOR_TYPE vtype = XMLRPC_GetVectorType(current_vector); + + if (depth == 1) { + xml_element* value = xml_elem_new(); + value->name = strdup(ELEM_VALUE); + + /* yet another hack for the "fault" crap */ + if (XMLRPC_VectorGetValueWithID(node, ELEM_FAULTCODE)) { + root = value; + } + else { + xml_element* param = xml_elem_new(); + param->name = strdup(ELEM_PARAM); + + Q_PushTail(¶m->children, value); + + root = param; + } + Q_PushTail(&value->children, elem_val); + } + else if (vtype == xmlrpc_vector_struct || vtype == xmlrpc_vector_mixed) { + xml_element* member = xml_elem_new(); + xml_element* name = xml_elem_new(); + xml_element* value = xml_elem_new(); + + member->name = strdup(ELEM_MEMBER); + name->name = strdup(ELEM_NAME); + value->name = strdup(ELEM_VALUE); + + simplestring_add(&name->text, XMLRPC_GetValueID(node)); + + Q_PushTail(&member->children, name); + Q_PushTail(&member->children, value); + Q_PushTail(&value->children, elem_val); + + root = member; + } + else if (vtype == xmlrpc_vector_array) { + xml_element* value = xml_elem_new(); + + value->name = strdup(ELEM_VALUE); + + Q_PushTail(&value->children, elem_val); + + root = value; + } + else if (vtype == xmlrpc_vector_none) { + /* no parent. non-op */ + root = elem_val; + } + else { + xml_element* value = xml_elem_new(); + + value->name = strdup(ELEM_VALUE); + + Q_PushTail(&value->children, elem_val); + + root = value; + } + } + } + return root; +} + +xml_element* XMLRPC_VALUE_to_xml_element(XMLRPC_VALUE node) { + return XMLRPC_to_xml_element_worker(NULL, node, xmlrpc_request_none, 0); +} + +xml_element* XMLRPC_REQUEST_to_xml_element(XMLRPC_REQUEST request) { + xml_element* wrapper = NULL; + if (request) { + const char* pStr = NULL; + XMLRPC_REQUEST_TYPE request_type = XMLRPC_RequestGetRequestType(request); + XMLRPC_VALUE xParams = XMLRPC_RequestGetData(request); + + wrapper = xml_elem_new(); + + if (request_type == xmlrpc_request_call) { + pStr = ELEM_METHODCALL; + } + else if (request_type == xmlrpc_request_response) { + pStr = ELEM_METHODRESPONSE; + } + if (pStr) { + wrapper->name = strdup(pStr); + } + + if(request_type == xmlrpc_request_call) { + pStr = XMLRPC_RequestGetMethodName(request); + + if (pStr) { + xml_element* method = xml_elem_new(); + method->name = strdup(ELEM_METHODNAME); + simplestring_add(&method->text, pStr); + Q_PushTail(&wrapper->children, method); + } + } + if (xParams) { + Q_PushTail(&wrapper->children, + XMLRPC_to_xml_element_worker(NULL, XMLRPC_RequestGetData(request), XMLRPC_RequestGetRequestType(request), 0)); + } + else { + /* Despite the spec, the xml-rpc list folk want me to send an empty params element */ + xml_element* params = xml_elem_new(); + params->name = strdup(ELEM_PARAMS); + Q_PushTail(&wrapper->children, params); + } + } + return wrapper; +} + diff --git a/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.h b/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.h new file mode 100644 index 0000000..234a153 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.h @@ -0,0 +1,45 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +#ifndef XML_TO_XMLRPC_H + #define XML_TO_XMLRPC_H + +#include "time.h" +#include "xmlrpc.h" + +XMLRPC_VALUE xml_element_to_XMLRPC_VALUE(xml_element* el); +XMLRPC_VALUE xml_element_to_XMLRPC_REQUEST(XMLRPC_REQUEST request, xml_element* el); +xml_element* XMLRPC_VALUE_to_xml_element(XMLRPC_VALUE node); +xml_element* XMLRPC_REQUEST_to_xml_element(XMLRPC_REQUEST request); + +#endif /* XML_TO_XMLRPC_H */ diff --git a/php/xmlrpc/libxmlrpc/xmlrpc.c b/php/xmlrpc/libxmlrpc/xmlrpc.c new file mode 100644 index 0000000..67242b8 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc.c @@ -0,0 +1,2963 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id: xmlrpc.c,v 1.6 2004/04/27 17:33:59 iliaa Exp $"; + + +/****h* ABOUT/xmlrpc + * NAME + * XMLRPC_VALUE + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 9/1999 - 10/2000 + * HISTORY + * $Log: xmlrpc.c,v $ + * Revision 1.6 2004/04/27 17:33:59 iliaa + * Removed C++ style comments. + * + * Revision 1.5 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.4 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.22 2002/03/09 23:15:44 danda + * add fault interrogation funcs + * + * Revision 1.21 2002/03/09 22:27:41 danda + * win32 build patches contributed by Jeff Lawson + * + * Revision 1.20 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.19 2001/10/12 23:25:54 danda + * default to writing xmlrpc + * + * Revision 1.18 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * 08/2000 -- danda -- PHP C extension that uses XMLRPC + * 08/2000 -- danda -- support for two vocabularies: danda-rpc and xml-rpc + * 09/1999 -- danda -- Initial API, before I even knew of standard XMLRPC vocab. Response only. + * 07/2000 -- danda -- wrote new implementation to be compatible with xmlrpc standard and + * incorporated some ideas from ensor, most notably the separation of + * xml dom from xmlrpc api. + * 06/2000 -- danda -- played with expat-ensor from www.ensor.org. Cool, but some flaws. + * TODO + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * Welcome to XMLRPC. For more info on the specification and history, see + * http://www.xmlrpc.org. + * + * This code aims to be a full-featured C implementation of XMLRPC. It does not + * have any networking code. Rather, it is intended to be plugged into apps + * or libraries with existing networking facilities, eg PHP, apache, perl, mozilla, + * home-brew application servers, etc. + * + * Usage Paradigm: + * The user of this library will typically be implementing either an XMLRPC server, + * an XMLRPC client, or both. The client will use the library to build an in-memory + * representation of a request, and then serialize (encode) that request into XML. The + * client will then send the XML to the server via external mechanism. The server will + * de-serialize the XML back into an binary representation, call the appropriate registered + * method -- thereby generating a response. The response will be serialized into XML and + * sent back to the client. The client will de-serialize it into memory, and can + * iterate through the results via API. + * + * Both the request and the response may consist of arbitrarily long, arbitrarily nested + * values. The values may be one of several types, as defined by XMLRPC_VALUE_TYPE. + * + * Features and Architecture: + * - The XML parsing (xml_element.c) is completely independent of the XMLRPC api. In fact, + * it can be used as a standalone dom implementation. + * - Because of this, the same XMLRPC data can be serialized into multiple xml vocabularies. + * It is simply a matter of writing a transport. So far, two transports have been defined. + * The default xmlrpc vocab (xml_to_xmlrpc.c), and simple-rpc (xml_to_dandarpc.c) which is + * proprietary, but imho more readable, and nice for proprietary legacy reasons. + * - Various output options, including: xml escaping via CDATA or entity, case folding, + * vocab version, and character encoding. + * - One to One mapping between C structures and actual values, unlike ensor which forces + * one to understand the arcana of the xmlrpc vocab. + * - support for mixed indexed/keyed vector types, making it more compatible with + * languages such as PHP. + * - quite speedy compared to implementations written in interpreted languages. Also, uses + * intelligent string handling, so not many strlen() calls, etc. + * - comprehensive API for manipulation of values + *******/ + + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include +#include +#include +#include + +#include "queue.h" +#include "xmlrpc.h" +#include "expat.h" +#include "base64.h" + +#include "xml_to_xmlrpc.h" +#include "xml_to_dandarpc.h" +#include "xml_to_soap.h" +#include "xml_element.h" +#include "xmlrpc_private.h" +#include "xmlrpc_introspection_private.h" +#include "system_methods_private.h" + + + +/*-********************* +* Begin Time Functions * +***********************/ + +static int date_from_ISO8601 (const char *text, time_t * value) { + struct tm tm; + int n; + int i; + char buf[18]; + + if (strchr (text, '-')) { + char *p = (char *) text, *p2 = buf; + while (p && *p) { + if (*p != '-') { + *p2 = *p; + p2++; + } + p++; + } + text = buf; + } + + + tm.tm_isdst = -1; + + if(strlen(text) < 17) { + return -1; + } + + n = 1000; + tm.tm_year = 0; + for(i = 0; i < 4; i++) { + tm.tm_year += (text[i]-'0')*n; + n /= 10; + } + n = 10; + tm.tm_mon = 0; + for(i = 0; i < 2; i++) { + tm.tm_mon += (text[i+4]-'0')*n; + n /= 10; + } + tm.tm_mon --; + + n = 10; + tm.tm_mday = 0; + for(i = 0; i < 2; i++) { + tm.tm_mday += (text[i+6]-'0')*n; + n /= 10; + } + + n = 10; + tm.tm_hour = 0; + for(i = 0; i < 2; i++) { + tm.tm_hour += (text[i+9]-'0')*n; + n /= 10; + } + + n = 10; + tm.tm_min = 0; + for(i = 0; i < 2; i++) { + tm.tm_min += (text[i+12]-'0')*n; + n /= 10; + } + + n = 10; + tm.tm_sec = 0; + for(i = 0; i < 2; i++) { + tm.tm_sec += (text[i+15]-'0')*n; + n /= 10; + } + + tm.tm_year -= 1900; + + *value = mktime(&tm); + + return 0; + +} + +static int date_to_ISO8601 (time_t value, char *buf, int length) { + struct tm *tm; + tm = localtime(&value); +#if 0 /* TODO: soap seems to favor this method. xmlrpc the latter. */ + return strftime (buf, length, "%Y-%m-%dT%H:%M:%SZ", tm); +#else + return strftime(buf, length, "%Y%m%dT%H:%M:%S", tm); +#endif +} + +/*-******************* +* End Time Functions * +*********************/ + + +/*-*************************** +* Begin XMLRPC_REQUEST funcs * +*****************************/ + +/****f* REQUEST/XMLRPC_RequestNew + * NAME + * XMLRPC_RequestNew + * SYNOPSIS + * XMLRPC_REQUEST XMLRPC_RequestNew() + * FUNCTION + * Creates a new XMLRPC_Request data struct + * INPUTS + * none + * SEE ALSO + * XMLRPC_RequestFree () + * SOURCE + */ +XMLRPC_REQUEST XMLRPC_RequestNew() { + XMLRPC_REQUEST xRequest = calloc(1, sizeof(STRUCT_XMLRPC_REQUEST)); + if(xRequest) { + simplestring_init(&xRequest->methodName); + } + return xRequest; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestFree + * NAME + * XMLRPC_RequestFree + * SYNOPSIS + * void XMLRPC_RequestFree(XMLRPC_REQUEST request, int bFreeIO) + * FUNCTION + * Free XMLRPC Request and all sub-values + * INPUTS + * request -- previously allocated request struct + * bFreeIO -- 1 = also free request value data, if any, 0 = ignore. + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_CleanupValue () + * SOURCE + */ +void XMLRPC_RequestFree(XMLRPC_REQUEST request, int bFreeIO) { + if(request) { + simplestring_free(&request->methodName); + + if(request->io && bFreeIO) { + XMLRPC_CleanupValue(request->io); + } + if(request->error) { + XMLRPC_CleanupValue(request->error); + } + my_free(request); + } +} + +/*******/ + +/* Set Method Name to call */ +/****f* REQUEST/XMLRPC_RequestSetMethodName + * NAME + * XMLRPC_RequestSetMethodName + * SYNOPSIS + * const char* XMLRPC_RequestSetMethodName(XMLRPC_REQUEST request, const char* methodName) + * FUNCTION + * Set name of method to call with this request. + * INPUTS + * request -- previously allocated request struct + * methodName -- name of method + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetMethodName () + * XMLRPC_RequestFree () + * SOURCE + */ +const char* XMLRPC_RequestSetMethodName(XMLRPC_REQUEST request, const char* methodName) { + if(request) { + simplestring_clear(&request->methodName); + simplestring_add(&request->methodName, methodName); + return request->methodName.str; + } + return NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetMethodName + * NAME + * XMLRPC_RequestGetMethodName + * SYNOPSIS + * const char* XMLRPC_RequestGetMethodName(XMLRPC_REQUEST request) + * FUNCTION + * Get name of method called by this request + * INPUTS + * request -- previously allocated request struct + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetMethodName () + * XMLRPC_RequestFree () + * SOURCE + */ +const char* XMLRPC_RequestGetMethodName(XMLRPC_REQUEST request) { + return request ? request->methodName.str : NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestSetRequestType + * NAME + * XMLRPC_RequestSetRequestType + * SYNOPSIS + * XMLRPC_REQUEST_TYPE XMLRPC_RequestSetRequestType(XMLRPC_REQUEST request, XMLRPC_REQUEST_TYPE type) + * FUNCTION + * A request struct may be allocated by a caller or by xmlrpc + * in response to a request. This allows setting the + * request type. + * INPUTS + * request -- previously allocated request struct + * type -- request type [xmlrpc_method_call | xmlrpc_method_response] + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetRequestType () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +XMLRPC_REQUEST_TYPE XMLRPC_RequestSetRequestType (XMLRPC_REQUEST request, + XMLRPC_REQUEST_TYPE type) { + if(request) { + request->request_type = type; + return request->request_type; + } + return xmlrpc_request_none; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetRequestType + * NAME + * XMLRPC_RequestGetRequestType + * SYNOPSIS + * XMLRPC_REQUEST_TYPE XMLRPC_RequestGetRequestType(XMLRPC_REQUEST request) + * FUNCTION + * A request struct may be allocated by a caller or by xmlrpc + * in response to a request. This allows setting the + * request type. + * INPUTS + * request -- previously allocated request struct + * RESULT + * type -- request type [xmlrpc_method_call | xmlrpc_method_response] + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetRequestType () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +XMLRPC_REQUEST_TYPE XMLRPC_RequestGetRequestType(XMLRPC_REQUEST request) { + return request ? request->request_type : xmlrpc_request_none; +} + +/*******/ + + +/****f* REQUEST/XMLRPC_RequestSetData + * NAME + * XMLRPC_RequestSetData + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestSetData(XMLRPC_REQUEST request, XMLRPC_VALUE data) + * FUNCTION + * Associates a block of xmlrpc data with the request. The + * data is *not* copied. A pointer is kept. The caller + * should be careful not to doubly free the data value, + * which may optionally be free'd by XMLRPC_RequestFree(). + * INPUTS + * request -- previously allocated request struct + * data -- previously allocated data struct + * RESULT + * XMLRPC_VALUE -- pointer to value stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetData () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestSetData(XMLRPC_REQUEST request, XMLRPC_VALUE data) { + if(request && data) { + if (request->io) { + XMLRPC_CleanupValue (request->io); + } + request->io = XMLRPC_CopyValue(data); + return request->io; + } + return NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetData + * NAME + * XMLRPC_RequestGetData + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestGetData(XMLRPC_REQUEST request) + * FUNCTION + * Returns data associated with request, if any. + * INPUTS + * request -- previously allocated request struct + * RESULT + * XMLRPC_VALUE -- pointer to value stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetData () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestGetData(XMLRPC_REQUEST request) { + return request ? request->io : NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestSetError + * NAME + * XMLRPC_RequestSetError + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestSetError(XMLRPC_REQUEST request, XMLRPC_VALUE error) + * FUNCTION + * Associates a block of xmlrpc data, representing an error + * condition, with the request. + * INPUTS + * request -- previously allocated request struct + * error -- previously allocated error code or struct + * RESULT + * XMLRPC_VALUE -- pointer to value stored, or NULL + * NOTES + * This is a private function for usage by internals only. + * SEE ALSO + * XMLRPC_RequestGetError () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestSetError (XMLRPC_REQUEST request, XMLRPC_VALUE error) { + if (request && error) { + if (request->error) { + XMLRPC_CleanupValue (request->error); + } + request->error = XMLRPC_CopyValue (error); + return request->error; + } + return NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetError + * NAME + * XMLRPC_RequestGetError + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestGetError(XMLRPC_REQUEST request) + * FUNCTION + * Returns error data associated with request, if any. + * INPUTS + * request -- previously allocated request struct + * RESULT + * XMLRPC_VALUE -- pointer to error value stored, or NULL + * NOTES + * This is a private function for usage by internals only. + * SEE ALSO + * XMLRPC_RequestSetError () + * XMLRPC_RequestFree () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestGetError (XMLRPC_REQUEST request) { + return request ? request->error : NULL; +} + +/*******/ + + +/****f* REQUEST/XMLRPC_RequestSetOutputOptions + * NAME + * XMLRPC_RequestSetOutputOptions + * SYNOPSIS + * XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output) + * FUNCTION + * Sets output options used for generating XML. The output struct + * is copied, and may be freed by the caller. + * INPUTS + * request -- previously allocated request struct + * output -- output options struct initialized by caller + * RESULT + * XMLRPC_REQUEST_OUTPUT_OPTIONS -- pointer to value stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetOutputOptions () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * SOURCE + */ +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output) { + if(request && output) { + memcpy (&request->output, output, + sizeof (STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS)); + return &request->output; + } + return NULL; +} + +/*******/ + + +/****f* REQUEST/XMLRPC_RequestGetOutputOptions + * NAME + * XMLRPC_RequestGetOutputOptions + * SYNOPSIS + * XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request) + * FUNCTION + * Gets a pointer to output options used for generating XML. + * INPUTS + * request -- previously allocated request struct + * RESULT + * XMLRPC_REQUEST_OUTPUT_OPTIONS -- pointer to options stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetOutputOptions () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * SOURCE + */ +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request) { + return request ? &request->output : NULL; +} + +/*******/ + +/*-************************* +* End XMLRPC_REQUEST funcs * +***************************/ + + +/*-*************************** +* Begin Serializiation funcs * +*****************************/ + +/****f* SERIALIZE/XMLRPC_VALUE_ToXML + * NAME + * XMLRPC_VALUE_ToXML + * SYNOPSIS + * char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val) + * FUNCTION + * encode XMLRPC_VALUE into XML buffer. Note that the generated + * buffer will not contain a methodCall. + * INPUTS + * val -- previously allocated XMLRPC_VALUE + * buf_len -- length of returned buffer, if not null + * RESULT + * char* -- newly allocated buffer containing XML. + * It is the caller's responsibility to free it. + * SEE ALSO + * XMLRPC_REQUEST_ToXML () + * XMLRPC_VALUE_FromXML () + * XMLRPC_Free () + * XMLRPC_VALUE + * SOURCE + */ +char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val, int* buf_len) { + xml_element *root_elem = XMLRPC_VALUE_to_xml_element(val); + char* pRet = NULL; + + if(root_elem) { + pRet = xml_elem_serialize_to_string(root_elem, NULL, buf_len); + xml_elem_free(root_elem); + } + return pRet; +} + +/*******/ + +/****f* SERIALIZE/XMLRPC_REQUEST_ToXML + * NAME + * XMLRPC_REQUEST_ToXML + * SYNOPSIS + * char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request) + * FUNCTION + * encode XMLRPC_REQUEST into XML buffer + * INPUTS + * request -- previously allocated XMLRPC_REQUEST + * buf_len -- size of returned buf, if not null + * RESULT + * char* -- newly allocated buffer containing XML. + * It is the caller's responsibility to free it. + * SEE ALSO + * XMLRPC_REQUEST_ToXML () + * XMLRPC_REQUEST_FromXML () + * XMLRPC_Free () + * XMLRPC_VALUE_ToXML () + * XMLRPC_REQUEST + * SOURCE + */ +char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request, int* buf_len) { + char* pRet = NULL; + if (request) { + xml_element *root_elem = NULL; + if (request->output.version == xmlrpc_version_simple) { + root_elem = DANDARPC_REQUEST_to_xml_element (request); + } + else if (request->output.version == xmlrpc_version_1_0 || + request->output.version == xmlrpc_version_none) { + root_elem = XMLRPC_REQUEST_to_xml_element (request); + } + else if (request->output.version == xmlrpc_version_soap_1_1) { + root_elem = SOAP_REQUEST_to_xml_element (request); + } + + if(root_elem) { + pRet = + xml_elem_serialize_to_string (root_elem, + &request->output.xml_elem_opts, + buf_len); + xml_elem_free(root_elem); + } + } + return pRet; +} + +/*******/ + +/****f* SERIALIZE/XMLRPC_VALUE_FromXML + * NAME + * XMLRPC_VALUE_FromXML + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VALUE_FromXML(const char* in_buf, int le + * FUNCTION + * Retrieve XMLRPC_VALUE from XML buffer. Note that this will + * ignore any methodCall. See XMLRPC_REQUEST_FromXML + * INPUTS + * in_buf -- character buffer containing XML + * len -- length of buffer + * RESULT + * XMLRPC_VALUE -- newly allocated data, or NULL if error. Should + * be free'd by caller. + * SEE ALSO + * XMLRPC_VALUE_ToXML () + * XMLRPC_REQUEST_FromXML () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VALUE_FromXML (const char *in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options) { + XMLRPC_VALUE xResponse = NULL; + XMLRPC_REQUEST req = XMLRPC_REQUEST_FromXML(in_buf, len, in_options); + + if(req) { + xResponse = req->io; + XMLRPC_RequestFree(req, 0); + } + return xResponse; +} + +/*******/ + +/* map parser errors to standard xml-rpc errors */ +static XMLRPC_VALUE map_expat_errors(XML_ELEM_ERROR error) { + XMLRPC_VALUE xReturn = NULL; + if(error) { + XMLRPC_ERROR_CODE code; + char buf[1024]; + snprintf(buf, sizeof(buf), + "error occurred at line %ld, column %ld, byte index %ld", + error->line, error->column, error->byte_index); + + /* expat specific errors */ + switch(error->parser_code) { + case XML_ERROR_UNKNOWN_ENCODING: + code = xmlrpc_error_parse_unknown_encoding; + break; + case XML_ERROR_INCORRECT_ENCODING: + code = xmlrpc_error_parse_bad_encoding; + break; + default: + code = xmlrpc_error_parse_xml_syntax; + break; + } + xReturn = XMLRPC_UtilityCreateFault(code, buf); + } + return xReturn; +} + +/****f* SERIALIZE/XMLRPC_REQUEST_FromXML + * NAME + * XMLRPC_REQUEST_FromXML + * SYNOPSIS + * XMLRPC_REQUEST XMLRPC_REQUEST_FromXML(const char* in_buf, int le + * FUNCTION + * Retrieve XMLRPC_REQUEST from XML buffer + * INPUTS + * in_buf -- character buffer containing XML + * len -- length of buffer + * RESULT + * XMLRPC_REQUEST -- newly allocated data, or NULL if error. Should + * be free'd by caller. + * SEE ALSO + * XMLRPC_REQUEST_ToXML () + * XMLRPC_VALUE_FromXML () + * XMLRPC_REQUEST + * SOURCE + */ +XMLRPC_REQUEST XMLRPC_REQUEST_FromXML (const char *in_buf, int len, + XMLRPC_REQUEST_INPUT_OPTIONS in_options) { + XMLRPC_REQUEST request = XMLRPC_RequestNew(); + STRUCT_XML_ELEM_ERROR error = {0}; + + if(request) { + xml_element *root_elem = + xml_elem_parse_buf (in_buf, len, + (in_options ? &in_options->xml_elem_opts : NULL), + &error); + + if(root_elem) { + if(!strcmp(root_elem->name, "simpleRPC")) { + request->output.version = xmlrpc_version_simple; + xml_element_to_DANDARPC_REQUEST(request, root_elem); + } + else if (!strcmp (root_elem->name, "SOAP-ENV:Envelope")) { + request->output.version = xmlrpc_version_soap_1_1; + xml_element_to_SOAP_REQUEST (request, root_elem); + } + else { + request->output.version = xmlrpc_version_1_0; + xml_element_to_XMLRPC_REQUEST(request, root_elem); + } + xml_elem_free(root_elem); + } + else { + if(error.parser_error) { + XMLRPC_RequestSetError (request, map_expat_errors (&error)); + } + } + } + + return request; +} + +/*******/ + +/*-************************ +* End Serialization Funcs * +**************************/ + + + +/****f* VALUE/XMLRPC_CreateValueEmpty + * NAME + * XMLRPC_CreateValueEmpty + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueEmpty () + * FUNCTION + * Create an XML value to be used/modified elsewhere. + * INPUTS + * RESULT + * XMLRPC_VALUE. The new value, or NULL on failure. + * SEE ALSO + * XMLRPC_CleanupValue () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueEmpty() { + XMLRPC_VALUE v = calloc(1, sizeof(STRUCT_XMLRPC_VALUE)); + if(v) { +#ifdef XMLRPC_DEBUG_REFCOUNT + printf ("calloc'd 0x%x\n", v); +#endif + v->type = xmlrpc_empty; + simplestring_init(&v->id); + simplestring_init(&v->str); + } + return v; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueID_Case + * NAME + * XMLRPC_SetValueID_Case + * SYNOPSIS + * const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case) + * FUNCTION + * Assign an ID (key) to an XMLRPC value. + * INPUTS + * value The xml value who's ID we will set. + * id The desired new id. + * len length of id string if known, or 0 if unknown. + * id_case one of XMLRPC_CASE + * RESULT + * const char* pointer to the newly allocated id string, or NULL + * SEE ALSO + * XMLRPC_SetValueID () + * XMLRPC_GetValueID () + * XMLRPC_VALUE + * XMLRPC_CASE + * SOURCE + */ +const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case) { + const char* pRetval = NULL; + if(value) { + if(id) { + simplestring_clear(&value->id); + (len > 0) ? simplestring_addn(&value->id, id, len) : + simplestring_add(&value->id, id); + + /* upper or lower case string in place if required. could be a seperate func. */ + if(id_case == xmlrpc_case_lower || id_case == xmlrpc_case_upper) { + int i; + for(i = 0; i < value->id.len; i++) { + value->id.str[i] = + (id_case == + xmlrpc_case_lower) ? tolower (value->id. + str[i]) : toupper (value-> + id. + str[i]); + } + } + + pRetval = value->id.str; + +#ifdef XMLRPC_DEBUG_REFCOUNT + printf("set value id: %s\n", pRetval); +#endif + } + } + + return pRetval; +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueString + * NAME + * XMLRPC_SetValueString + * SYNOPSIS + * const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* val, int len) + * FUNCTION + * Assign a string value to an XMLRPC_VALUE, and set it to type xmlrpc_string + * INPUTS + * value The xml value who's ID we will set. + * val The desired new string val. + * len length of val string if known, or 0 if unknown. + * RESULT + * const char* pointer to the newly allocated value string, or NULL + * SEE ALSO + * XMLRPC_GetValueString () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* val, int len) { + char *pRetval = NULL; + if(value && val) { + simplestring_clear(&value->str); + (len > 0) ? simplestring_addn(&value->str, val, len) : + simplestring_add(&value->str, val); + value->type = xmlrpc_string; + pRetval = (char *)value->str.str; + } + + return pRetval; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueInt + * NAME + * XMLRPC_SetValueInt + * SYNOPSIS + * void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val) + * FUNCTION + * Assign an int value to an XMLRPC_VALUE, and set it to type xmlrpc_int + * INPUTS + * value The xml value who's ID we will set. + * val The desired new integer value + * RESULT + * SEE ALSO + * XMLRPC_GetValueInt () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val) { + if(value) { + value->type = xmlrpc_int; + value->i = val; + } +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueBoolean + * NAME + * XMLRPC_SetValueBoolean + * SYNOPSIS + * void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val) + * FUNCTION + * Assign a boolean value to an XMLRPC_VALUE, and set it to type xmlrpc_boolean + * INPUTS + * value The xml value who's value we will set. + * val The desired new boolean value. [0 | 1] + * RESULT + * SEE ALSO + * XMLRPC_GetValueBoolean () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val) { + if(value) { + value->type = xmlrpc_boolean; + value->i = val ? 1 : 0; + } +} + +/*******/ + + +/****f* VECTOR/XMLRPC_SetIsVector + * NAME + * XMLRPC_SetIsVector + * SYNOPSIS + * int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type) + * FUNCTION + * Set the XMLRPC_VALUE to be a vector (list) type. The vector may be one of + * [xmlrpc_array | xmlrpc_struct | xmlrpc_mixed]. An array has only index values. + * A struct has key/val pairs. Mixed allows both index and key/val combinations. + * INPUTS + * value The xml value who's vector type we will set + * type New type of vector as enumerated by XMLRPC_VECTOR_TYPE + * RESULT + * int 1 if successful, 0 otherwise + * SEE ALSO + * XMLRPC_GetValueType () + * XMLRPC_GetVectorType () + * XMLRPC_VALUE + * XMLRPC_VECTOR_TYPE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type) { + int bSuccess = 0; + + if (value) { + /* we can change the type so long as nothing is currently stored. */ + if(value->type == xmlrpc_vector) { + if(value->v) { + if(!Q_Size(value->v->q)) { + value->v->type = type; + } + } + } + else { + value->v = calloc(1, sizeof(STRUCT_XMLRPC_VECTOR)); + if(value->v) { + value->v->q = (queue*)malloc(sizeof(queue)); + if(value->v->q) { + Q_Init(value->v->q); + value->v->type = type; + value->type = xmlrpc_vector; + bSuccess = 1; + } + } + } + } + + return bSuccess; +} + +/*******/ + +/****f* VECTOR/XMLRPC_CreateVector + * NAME + * XMLRPC_CreateVector + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateVector(const char* id, XMLRPC_VECTOR_TYPE type) + * FUNCTION + * Create a new vector and optionally set an id. + * INPUTS + * id The id of the vector, or NULL + * type New type of vector as enumerated by XMLRPC_VECTOR_TYPE + * RESULT + * XMLRPC_VALUE The new vector, or NULL on failure. + * SEE ALSO + * XMLRPC_CreateValueEmpty () + * XMLRPC_SetIsVector () + * XMLRPC_GetValueType () + * XMLRPC_GetVectorType () + * XMLRPC_VALUE + * XMLRPC_VECTOR_TYPE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateVector(const char* id, XMLRPC_VECTOR_TYPE type) { + XMLRPC_VALUE val = NULL; + + val = XMLRPC_CreateValueEmpty(); + if(val) { + if(XMLRPC_SetIsVector(val, type)) { + if(id) { + const char *pSVI = NULL; + + pSVI = XMLRPC_SetValueID(val, id, 0); + if(NULL == pSVI) { + val = NULL; + } + } + } + else { + val = NULL; + } + } + return val; +} + +/*******/ + + +/* Not yet implemented. + * + * This should use a hash to determine if a given target id has already + * been appended. + * + * Alternately, it could walk the entire vector, but that could be quite + * slow for very large lists. + */ +static int isDuplicateEntry(XMLRPC_VALUE target, XMLRPC_VALUE source) { + return 0; +} + +/****f* VECTOR/XMLRPC_AddValueToVector + * NAME + * XMLRPC_AddValueToVector + * SYNOPSIS + * int XMLRPC_AddValueToVector(XMLRPC_VALUE target, XMLRPC_VALUE source) + * FUNCTION + * Add (append) an existing XMLRPC_VALUE to a vector. + * INPUTS + * target The target vector + * source The source value to append + * RESULT + * int 1 if successful, else 0 + * SEE ALSO + * XMLRPC_AddValuesToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * NOTES + * The function will fail and return 0 if an attempt is made to add + * a value with an ID into a vector of type xmlrpc_vector_array. Such + * values can only be added to xmlrpc_vector_struct. + * SOURCE + */ +int XMLRPC_AddValueToVector(XMLRPC_VALUE target, XMLRPC_VALUE source) { + if(target && source) { + if(target->type == xmlrpc_vector && target->v && + target->v->q && target->v->type != xmlrpc_vector_none) { + + /* guard against putting value of unknown type into vector */ + switch(source->type) { + case xmlrpc_empty: + case xmlrpc_nil: + case xmlrpc_base64: + case xmlrpc_boolean: + case xmlrpc_datetime: + case xmlrpc_double: + case xmlrpc_int: + case xmlrpc_string: + case xmlrpc_vector: + /* Guard against putting a key/val pair into an array vector */ + if( !(source->id.len && target->v->type == xmlrpc_vector_array) ) { + if (isDuplicateEntry (target, source) + || Q_PushTail (target->v->q, XMLRPC_CopyValue (source))) { + return 1; + } + } + else { + fprintf (stderr, + "xmlrpc: attempted to add key/val pair to vector of type array\n"); + } + break; + default: + fprintf (stderr, + "xmlrpc: attempted to add value of unknown type to vector\n"); + break; + } + } + } + return 0; +} + +/*******/ + + +/****f* VECTOR/XMLRPC_AddValuesToVector + * NAME + * XMLRPC_AddValuesToVector + * SYNOPSIS + * XMLRPC_AddValuesToVector ( target, val1, val2, val3, val(n), 0 ) + * XMLRPC_AddValuesToVector( XMLRPC_VALUE, ... ) + * FUNCTION + * Add (append) a series of existing XMLRPC_VALUE to a vector. + * INPUTS + * target The target vector + * ... The source value(s) to append. The last item *must* be 0. + * RESULT + * int 1 if successful, else 0 + * SEE ALSO + * XMLRPC_AddValuesToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * NOTES + * This function may actually return failure after it has already modified + * or added items to target. You can not trust the state of target + * if this function returns failure. + * SOURCE + */ +int XMLRPC_AddValuesToVector(XMLRPC_VALUE target, ...) { + int iRetval = 0; + + if(target) { + if(target->type == xmlrpc_vector) { + XMLRPC_VALUE v = NULL; + va_list vl; + + va_start(vl, target); + + do { + v = va_arg(vl, XMLRPC_VALUE); + if(v) { + if(!XMLRPC_AddValueToVector(target, v)) { + iRetval = 0; + break; + } + } + } + while (v); + + va_end(vl); + + if(NULL == v) { + iRetval = 1; + } + } + } + return iRetval; +} + +/*******/ + + +/****f* VECTOR/XMLRPC_VectorGetValueWithID_Case + * NAME + * XMLRPC_VectorGetValueWithID_Case + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VectorGetValueWithID_Case(XMLRPC_VALUE vector, const char* id, XMLRPC_CASE_COMPARISON id_case) + * FUNCTION + * Get value from vector matching id (key) + * INPUTS + * vector The source vector + * id The key to find + * id_case Rule for how to match key + * RESULT + * int 1 if successful, else 0 + * SEE ALSO + * XMLRPC_SetValueID_Case () + * XMLRPC_VALUE + * XMLRPC_CASE_COMPARISON + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VectorGetValueWithID_Case (XMLRPC_VALUE vector, const char *id, + XMLRPC_CASE_COMPARISON id_case) { + if(vector && vector->v && vector->v->q) { + q_iter qi = Q_Iter_Head_F(vector->v->q); + + while(qi) { + XMLRPC_VALUE xIter = Q_Iter_Get_F(qi); + if(xIter && xIter->id.str) { + if(id_case == xmlrpc_case_sensitive) { + if(!strcmp(xIter->id.str, id)) { + return xIter; + } + } + else if(id_case == xmlrpc_case_insensitive) { + if(!strcasecmp(xIter->id.str, id)) { + return xIter; + } + } + } + qi = Q_Iter_Next_F(qi); + } + } + return NULL; +} + +/*******/ + + +int XMLRPC_VectorRemoveValue(XMLRPC_VALUE vector, XMLRPC_VALUE value) { + if(vector && vector->v && vector->v->q && value) { + q_iter qi = Q_Iter_Head_F(vector->v->q); + + while(qi) { + XMLRPC_VALUE xIter = Q_Iter_Get_F(qi); + if(xIter == value) { + XMLRPC_CleanupValue(xIter); + Q_Iter_Del(vector->v->q, qi); + return 1; + } + qi = Q_Iter_Next_F(qi); + } + } + return 0; +} + + +/****f* VALUE/XMLRPC_CreateValueString + * NAME + * XMLRPC_CreateValueString + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueString(const char* id, const char* val, int len) + * FUNCTION + * Create an XMLRPC_VALUE, and assign a string to it + * INPUTS + * id The id of the value, or NULL + * val The desired new string val. + * len length of val string if known, or 0 if unknown. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL + * SEE ALSO + * XMLRPC_GetValueString () + * XMLRPC_CreateValueEmpty () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueString(const char* id, const char* val, int len) { + XMLRPC_VALUE value = NULL; + if(val) { + value = XMLRPC_CreateValueEmpty(); + if(value) { + XMLRPC_SetValueString(value, val, len); + if(id) { + XMLRPC_SetValueID(value, id, 0); + } + } + } + return value; +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueInt + * NAME + * XMLRPC_CreateValueInt + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueInt(const char* id, int i) + * FUNCTION + * Create an XMLRPC_VALUE, and assign an int to it + * INPUTS + * id The id of the value, or NULL + * i The desired new int val. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL + * SEE ALSO + * XMLRPC_GetValueInt () + * XMLRPC_CreateValueEmpty () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueInt(const char* id, int i) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueInt(val, i); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueBoolean + * NAME + * XMLRPC_CreateValueBoolean + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueBoolean(const char* id, int i) + * FUNCTION + * Create an XMLRPC_VALUE, and assign an int to it + * INPUTS + * id The id of the value, or NULL + * i The desired new int val. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL + * SEE ALSO + * XMLRPC_GetValueBoolean () + * XMLRPC_CreateValueEmpty () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueBoolean(const char* id, int i) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueBoolean(val, i); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + + +/****f* VALUE/XMLRPC_CleanupValue + * NAME + * XMLRPC_CleanupValue + * SYNOPSIS + * void XMLRPC_CleanupValue(XMLRPC_VALUE value) + * FUNCTION + * Frees all memory allocated for an XMLRPC_VALUE and any of its children (if a vector) + * INPUTS + * value The id of the value to be cleaned up. + * RESULT + * void + * NOTES + * Normally this function will be called for the topmost vector, thus free-ing + * all children. If a child of a vector is free'd first, results are undefined. + * Failure to call this function *will* cause memory leaks. + * + * Also, this function is implemented using reference counting. Thus a value + * may be added and freed from multiple parents so long as a reference is added + * first using XMLRPC_CopyValue() + * SEE ALSO + * XMLRPC_RequestFree () + * XMLRPC_CreateValueEmpty () + * XMLRPC_CopyValue() + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_CleanupValue(XMLRPC_VALUE value) { + if(value) { + if(value->iRefCount > 0) { + value->iRefCount --; + } + +#ifdef XMLRPC_DEBUG_REFCOUNT + if(value->id.str) { + printf ("decremented refcount of %s, now %i\n", value->id.str, + value->iRefCount); + } + else { + printf ("decremented refcount of 0x%x, now %i\n", value, + value->iRefCount); + } +#endif + + if(value->type == xmlrpc_vector) { + if(value->v) { + if(value->iRefCount == 0) { + XMLRPC_VALUE cur = (XMLRPC_VALUE)Q_Head(value->v->q); + while( cur ) { + XMLRPC_CleanupValue(cur); + + /* Make sure some idiot didn't include a vector as a child of itself + * and thus it would have already free'd these. + */ + if(value->v && value->v->q) { + cur = Q_Next(value->v->q); + } + else { + break; + } + } + + Q_Destroy(value->v->q); + my_free(value->v->q); + my_free(value->v); + } + } + } + + + if(value->iRefCount == 0) { + + /* guard against freeing invalid types */ + switch(value->type) { + case xmlrpc_empty: + case xmlrpc_base64: + case xmlrpc_boolean: + case xmlrpc_datetime: + case xmlrpc_double: + case xmlrpc_int: + case xmlrpc_string: + case xmlrpc_vector: +#ifdef XMLRPC_DEBUG_REFCOUNT + if(value->id.str) { + printf("free'd %s\n", value->id.str); + } + else { + printf("free'd 0x%x\n", value); + } +#endif + simplestring_free(&value->id); + simplestring_free(&value->str); + + memset(value, 0, sizeof(STRUCT_XMLRPC_VALUE)); + my_free(value); + break; + default: + fprintf (stderr, + "xmlrpc: attempted to free value of invalid type\n"); + break; + } + } + } +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueDateTime + * NAME + * XMLRPC_SetValueDateTime + * SYNOPSIS + * void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time) + * FUNCTION + * Assign time value to XMLRPC_VALUE + * INPUTS + * value The target XMLRPC_VALUE + * time The desired new unix time value (time_t) + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDateTime () + * XMLRPC_SetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time) { + if(value) { + char timeBuf[30]; + value->type = xmlrpc_datetime; + value->i = time; + + timeBuf[0] = 0; + + date_to_ISO8601(time, timeBuf, sizeof(timeBuf)); + + if(timeBuf[0]) { + simplestring_clear(&value->str); + simplestring_add(&value->str, timeBuf); + } + } +} + +/*******/ + +/****f* VALUE/XMLRPC_CopyValue + * NAME + * XMLRPC_CopyValue + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value) + * FUNCTION + * Make a copy (reference) of an XMLRPC_VALUE + * INPUTS + * value The target XMLRPC_VALUE + * RESULT + * XMLRPC_VALUE -- address of the copy + * SEE ALSO + * XMLRPC_CleanupValue () + * XMLRPC_DupValueNew () + * NOTES + * This function is implemented via reference counting, so the + * returned value is going to be the same as the passed in value. + * The value must be freed the same number of times it is copied + * or there will be a memory leak. + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value) { + if(value) { + value->iRefCount ++; +#ifdef XMLRPC_DEBUG_REFCOUNT + if(value->id.str) { + printf ("incremented refcount of %s, now %i\n", value->id.str, + value->iRefCount); + } + else { + printf ("incremented refcount of 0x%x, now %i\n", value, + value->iRefCount); + } +#endif + } + return value; +} + +/*******/ + + +/****f* VALUE/XMLRPC_DupValueNew + * NAME + * XMLRPC_DupValueNew + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_DupValueNew(XMLRPC_VALUE value) + * FUNCTION + * Make a duplicate (non reference) of an XMLRPC_VALUE with newly allocated mem. + * INPUTS + * value The source XMLRPC_VALUE to duplicate + * RESULT + * XMLRPC_VALUE -- address of the duplicate value + * SEE ALSO + * XMLRPC_CleanupValue () + * XMLRPC_CopyValue () + * NOTES + * Use this when function when you need to modify the contents of + * the copied value seperately from the original. + * + * this function is recursive, thus the value and all of its children + * (if any) will be duplicated. + * SOURCE + */ +XMLRPC_VALUE XMLRPC_DupValueNew (XMLRPC_VALUE xSource) { + XMLRPC_VALUE xReturn = NULL; + if (xSource) { + xReturn = XMLRPC_CreateValueEmpty (); + if (xSource->id.len) { + XMLRPC_SetValueID (xReturn, xSource->id.str, xSource->id.len); + } + + switch (xSource->type) { + case xmlrpc_int: + case xmlrpc_boolean: + XMLRPC_SetValueInt (xReturn, xSource->i); + break; + case xmlrpc_string: + case xmlrpc_base64: + XMLRPC_SetValueString (xReturn, xSource->str.str, xSource->str.len); + break; + case xmlrpc_datetime: + XMLRPC_SetValueDateTime (xReturn, xSource->i); + break; + case xmlrpc_double: + XMLRPC_SetValueDouble (xReturn, xSource->d); + break; + case xmlrpc_vector: + { + q_iter qi = Q_Iter_Head_F (xSource->v->q); + XMLRPC_SetIsVector (xReturn, xSource->v->type); + + while (qi) { + XMLRPC_VALUE xIter = Q_Iter_Get_F (qi); + XMLRPC_AddValueToVector (xReturn, XMLRPC_DupValueNew (xIter)); + qi = Q_Iter_Next_F (qi); + } + } + break; + default: + break; + } + } + return xReturn; +} + +/*******/ + + + +/****f* VALUE/XMLRPC_CreateValueDateTime + * NAME + * XMLRPC_CreateValueDateTime + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time) + * FUNCTION + * Create new datetime value from time_t + * INPUTS + * id id of the new value, or NULL + * time The desired unix time value (time_t) + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDateTime () + * XMLRPC_SetValueDateTime () + * XMLRPC_CreateValueDateTime_ISO8601 () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueDateTime(val, time); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueDateTime_ISO8601 + * NAME + * XMLRPC_SetValueDateTime_ISO8601 + * SYNOPSIS + * void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s) + * FUNCTION + * Set datetime value from IS08601 encoded string + * INPUTS + * value The target XMLRPC_VALUE + * s The desired new time value + * RESULT + * void + * BUGS + * This function currently attempts to convert the time string to a valid unix time + * value before passing it. Behavior when the string is invalid or out of range + * is not well defined, but will probably result in Jan 1, 1970 (0) being passed. + * SEE ALSO + * XMLRPC_GetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s) { + if(value) { + time_t time_val = 0; + if(s) { + date_from_ISO8601(s, &time_val); + XMLRPC_SetValueDateTime(value, time_val); + } + } +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueDateTime_ISO8601 + * NAME + * XMLRPC_CreateValueDateTime_ISO8601 + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s) + * FUNCTION + * Create datetime value from IS08601 encoded string + * INPUTS + * id The id of the new value, or NULL + * s The desired new time value + * RESULT + * newly allocated XMLRPC_VALUE, or NULL if no value created. + * BUGS + * See XMLRPC_SetValueDateTime_ISO8601 () + * SEE ALSO + * XMLRPC_GetValueDateTime_ISO8601 () + * XMLRPC_SetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueDateTime_ISO8601(val, s); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueBase64 + * NAME + * XMLRPC_SetValueBase64 + * SYNOPSIS + * void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len) + * FUNCTION + * Set base64 value. Base64 is useful for transferring binary data, such as an image. + * INPUTS + * value The target XMLRPC_VALUE + * s The desired new binary value + * len The length of s, or NULL. If buffer is not null terminated, len *must* be passed. + * RESULT + * void + * NOTES + * Data is set/stored/retrieved as passed in, but is base64 encoded for XML transfer, and + * decoded on the other side. This is transparent to the caller. + * SEE ALSO + * XMLRPC_GetValueBase64 () + * XMLRPC_CreateValueBase64 () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len) { + if(value && s) { + simplestring_clear(&value->str); + (len > 0) ? simplestring_addn(&value->str, s, len) : + simplestring_add(&value->str, s); + value->type = xmlrpc_base64; + } +} + +/*******/ + + +/****f* VALUE/XMLRPC_CreateValueBase64 + * NAME + * XMLRPC_CreateValueBase64 + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len) + * FUNCTION + * Create base64 value. Base64 is useful for transferring binary data, such as an image. + * INPUTS + * id id of the new value, or NULL + * s The desired new binary value + * len The length of s, or NULL. If buffer is not null terminated, len *must* be passed. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL if error + * NOTES + * See XMLRPC_SetValueBase64 () + * SEE ALSO + * XMLRPC_GetValueBase64 () + * XMLRPC_SetValueBase64 () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueBase64(val, s, len); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueDouble + * NAME + * XMLRPC_SetValueDouble + * SYNOPSIS + * void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val) + * FUNCTION + * Set double (floating point) value. + * INPUTS + * value The target XMLRPC_VALUE + * val The desired new double value + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDouble () + * XMLRPC_CreateValueDouble () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val) { + if(value) { + value->type = xmlrpc_double; + value->d = val; + } +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueDouble + * NAME + * XMLRPC_CreateValueDouble + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double d) + * FUNCTION + * Create double (floating point) value. + * INPUTS + * id id of the newly created value, or NULL + * d The desired new double value + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDouble () + * XMLRPC_CreateValueDouble () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double d) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueDouble(val, d); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueString + * NAME + * XMLRPC_GetValueString + * SYNOPSIS + * const char* XMLRPC_GetValueString(XMLRPC_VALUE value) + * FUNCTION + * retrieve string value + * INPUTS + * value source XMLRPC_VALUE of type xmlrpc_string + * RESULT + * void + * SEE ALSO + * XMLRPC_SetValueString () + * XMLRPC_GetValueType () + * XMLRPC_VALUE + * SOURCE + */ +const char* XMLRPC_GetValueString(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_string) ? value->str.str : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueStringLen + * NAME + * XMLRPC_GetValueStringLen + * SYNOPSIS + * int XMLRPC_GetValueStringLen(XMLRPC_VALUE value) + * FUNCTION + * determine length of string value + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_string + * RESULT + * length of string, or 0 + * NOTES + * SEE ALSO + * XMLRPC_SetValueString () + * XMLRPC_GetValueString () + * SOURCE + */ +int XMLRPC_GetValueStringLen(XMLRPC_VALUE value) { + return ((value) ? value->str.len : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueInt + * NAME + * XMLRPC_GetValueInt + * SYNOPSIS + * int XMLRPC_GetValueInt(XMLRPC_VALUE value) + * FUNCTION + * retrieve integer value. + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_int + * RESULT + * integer value or 0 if value is not valid int + * NOTES + * use XMLRPC_GetValueType () to be sure if 0 is real return value or not + * SEE ALSO + * XMLRPC_SetValueInt () + * XMLRPC_CreateValueInt () + * SOURCE + */ +int XMLRPC_GetValueInt(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_int) ? value->i : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueBoolean + * NAME + * XMLRPC_GetValueBoolean + * SYNOPSIS + * int XMLRPC_GetValueBoolean(XMLRPC_VALUE value) + * FUNCTION + * retrieve boolean value. + * INPUTS + * XMLRPC_VALUE of type xmlrpc_boolean + * RESULT + * boolean value or 0 if value is not valid boolean + * NOTES + * use XMLRPC_GetValueType() to be sure if 0 is real value or not + * SEE ALSO + * XMLRPC_SetValueBoolean () + * XMLRPC_CreateValueBoolean () + * SOURCE + */ +int XMLRPC_GetValueBoolean(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_boolean) ? value->i : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueDouble + * NAME + * XMLRPC_GetValueDouble + * SYNOPSIS + * double XMLRPC_GetValueDouble(XMLRPC_VALUE value) + * FUNCTION + * retrieve double value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_double + * RESULT + * double value or 0 if value is not valid double. + * NOTES + * use XMLRPC_GetValueType() to be sure if 0 is real value or not + * SEE ALSO + * XMLRPC_SetValueDouble () + * XMLRPC_CreateValueDouble () + * SOURCE + */ +double XMLRPC_GetValueDouble(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_double) ? value->d : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueBase64 + * NAME + * XMLRPC_GetValueBase64 + * SYNOPSIS + * const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value) + * FUNCTION + * retrieve binary value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_base64 + * RESULT + * pointer to binary value or 0 if value is not valid. + * SEE ALSO + * XMLRPC_SetValueBase64 () + * XMLRPC_CreateValueBase64 () + * NOTES + * Call XMLRPC_GetValueStringLen() to retrieve real length of binary data. strlen() + * will not be accurate, as returned data may contain embedded nulls. + * SOURCE + */ +const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_base64) ? value->str.str : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueDateTime + * NAME + * XMLRPC_GetValueDateTime + * SYNOPSIS + * time_t XMLRPC_GetValueDateTime(XMLRPC_VALUE value) + * FUNCTION + * retrieve time_t value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_datetime + * RESULT + * time_t value or 0 if value is not valid datetime. + * NOTES + * use XMLRPC_GetValueType() to be sure if 0 is real value or not + * SEE ALSO + * XMLRPC_SetValueDateTime () + * XMLRPC_GetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * SOURCE + */ +time_t XMLRPC_GetValueDateTime(XMLRPC_VALUE value) { + return (time_t)((value && value->type == xmlrpc_datetime) ? value->i : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueDateTime_IOS8601 + * NAME + * XMLRPC_GetValueDateTime_IOS8601 + * SYNOPSIS + * const char* XMLRPC_GetValueDateTime_IOS8601(XMLRPC_VALUE value) + * FUNCTION + * retrieve ISO8601 formatted time value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_datetime + * RESULT + * const char* value or 0 if value is not valid datetime. + * SEE ALSO + * XMLRPC_SetValueDateTime_IOS8601 () + * XMLRPC_GetValueDateTime () + * XMLRPC_CreateValueDateTime_IOS8601 () + * SOURCE + */ +const char* XMLRPC_GetValueDateTime_ISO8601(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_datetime) ? value->str.str : 0); +} + +/*******/ + +/* Get ID (key) of value or NULL */ +/****f* VALUE/XMLRPC_GetValueID + * NAME + * XMLRPC_GetValueID + * SYNOPSIS + * const char* XMLRPC_GetValueID(XMLRPC_VALUE value) + * FUNCTION + * retrieve id (key) of value + * INPUTS + * XMLRPC_VALUE of any type + * RESULT + * const char* pointer to id of value, or NULL + * NOTES + * SEE ALSO + * XMLRPC_SetValueID() + * XMLRPC_CreateValueEmpty() + * SOURCE + */ +const char* XMLRPC_GetValueID(XMLRPC_VALUE value) { + return (const char*)((value && value->id.len) ? value->id.str : 0); +} + +/*******/ + + +/****f* VECTOR/XMLRPC_VectorSize + * NAME + * XMLRPC_VectorSize + * SYNOPSIS + * int XMLRPC_VectorSize(XMLRPC_VALUE value) + * FUNCTION + * retrieve size of vector + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * count of items in vector + * NOTES + * This is a cheap operation even on large vectors. Vector size is + * maintained by queue during add/remove ops. + * SEE ALSO + * XMLRPC_AddValueToVector () + * SOURCE + */ +int XMLRPC_VectorSize(XMLRPC_VALUE value) { + int size = 0; + if(value && value->type == xmlrpc_vector && value->v) { + size = Q_Size(value->v->q); + } + return size; +} + +/*******/ + +/****f* VECTOR/XMLRPC_VectorRewind + * NAME + * XMLRPC_VectorRewind + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VectorRewind(XMLRPC_VALUE value) + * FUNCTION + * reset vector to first item + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * first XMLRPC_VALUE in list, or NULL if empty or error. + * NOTES + * Be careful to rewind any vector passed in to you if you expect to + * iterate through the entire list. + * SEE ALSO + * XMLRPC_VectorNext () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VectorRewind(XMLRPC_VALUE value) { + XMLRPC_VALUE xReturn = NULL; + if(value && value->type == xmlrpc_vector && value->v) { + xReturn = (XMLRPC_VALUE)Q_Head(value->v->q); + } + return xReturn; +} + +/*******/ + +/****f* VECTOR/XMLRPC_VectorNext + * NAME + * XMLRPC_VectorNext + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VectorNext(XMLRPC_VALUE value) + * FUNCTION + * Iterate vector to next item in list. + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * Next XMLRPC_VALUE in vector, or NULL if at end. + * NOTES + * SEE ALSO + * XMLRPC_VectorRewind () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VectorNext(XMLRPC_VALUE value) { + XMLRPC_VALUE xReturn = NULL; + if(value && value->type == xmlrpc_vector && value->v) { + xReturn = (XMLRPC_VALUE)Q_Next(value->v->q); + } + return xReturn; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueType + * NAME + * XMLRPC_GetValueType + * SYNOPSIS + * XMLRPC_VALUE_TYPE XMLRPC_GetValueType(XMLRPC_VALUE value) + * FUNCTION + * determine data type of the XMLRPC_VALUE + * INPUTS + * XMLRPC_VALUE target of query + * RESULT + * data type of value as enumerated by XMLRPC_VALUE_TYPE + * NOTES + * all values are of type xmlrpc_empty until set. + * Deprecated for public use. See XMLRPC_GetValueTypeEasy + * SEE ALSO + * XMLRPC_SetValue* + * XMLRPC_CreateValue* + * XMLRPC_Append* + * XMLRPC_GetValueTypeEasy () + * SOURCE + */ +XMLRPC_VALUE_TYPE XMLRPC_GetValueType(XMLRPC_VALUE value) { + return value ? value->type : xmlrpc_empty; +} + +/*******/ + +/* Vector type accessor */ +/****f* VALUE/XMLRPC_GetVectorType + * NAME + * XMLRPC_GetVectorType + * SYNOPSIS + * XMLRPC_VECTOR_TYPE XMLRPC_GetVectorType(XMLRPC_VALUE value) + * FUNCTION + * determine vector type of the XMLRPC_VALUE + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * vector type of value as enumerated by XMLRPC_VECTOR_TYPE. + * xmlrpc_none if not a value. + * NOTES + * xmlrpc_none is returned if value is not a vector + * Deprecated for public use. See XMLRPC_GetValueTypeEasy + * SEE ALSO + * XMLRPC_SetIsVector () + * XMLRPC_GetValueType () + * XMLRPC_GetValueTypeEasy () + * SOURCE + */ +XMLRPC_VECTOR_TYPE XMLRPC_GetVectorType(XMLRPC_VALUE value) { + return(value && value->v) ? value->v->type : xmlrpc_none; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueTypeEasy + * NAME + * XMLRPC_GetValueTypeEasy + * SYNOPSIS + * XMLRPC_VALUE_TYPE_EASY XMLRPC_GetValueTypeEasy(XMLRPC_VALUE value) + * FUNCTION + * determine data type of the XMLRPC_VALUE. includes vector types. + * INPUTS + * XMLRPC_VALUE target of query + * RESULT + * data type of value as enumerated by XMLRPC_VALUE_TYPE_EASY + * xmlrpc_type_none if not a value. + * NOTES + * all values are of type xmlrpc_type_empty until set. + * SEE ALSO + * XMLRPC_SetValue* + * XMLRPC_CreateValue* + * XMLRPC_Append* + * SOURCE + */ +XMLRPC_VALUE_TYPE_EASY XMLRPC_GetValueTypeEasy (XMLRPC_VALUE value) { + if (value) { + switch (value->type) { + case xmlrpc_vector: + switch (value->v->type) { + case xmlrpc_vector_none: + return xmlrpc_type_none; + case xmlrpc_vector_struct: + return xmlrpc_type_struct; + case xmlrpc_vector_mixed: + return xmlrpc_type_mixed; + case xmlrpc_vector_array: + return xmlrpc_type_array; + } + default: + /* evil cast, but we know they are the same */ + return(XMLRPC_VALUE_TYPE_EASY) value->type; + } + } + return xmlrpc_none; +} + +/*******/ + + + +/*-******************* +* Begin Server Funcs * +*********************/ + + +/****f* VALUE/XMLRPC_ServerCreate + * NAME + * XMLRPC_ServerCreate + * SYNOPSIS + * XMLRPC_SERVER XMLRPC_ServerCreate() + * FUNCTION + * Allocate/Init XMLRPC Server Resources. + * INPUTS + * none + * RESULT + * newly allocated XMLRPC_SERVER + * NOTES + * SEE ALSO + * XMLRPC_ServerDestroy () + * XMLRPC_GetGlobalServer () + * SOURCE + */ +XMLRPC_SERVER XMLRPC_ServerCreate() { + XMLRPC_SERVER server = calloc(1, sizeof(STRUCT_XMLRPC_SERVER)); + if(server) { + Q_Init(&server->methodlist); + Q_Init(&server->docslist); + + /* register system methods */ + xsm_register(server); + } + return server; +} + +/*******/ + +/* Return global server. Not locking! Not Thread Safe! */ +/****f* VALUE/XMLRPC_GetGlobalServer + * NAME + * XMLRPC_GetGlobalServer + * SYNOPSIS + * XMLRPC_SERVER XMLRPC_GetGlobalServer() + * FUNCTION + * Allocates a global (process-wide) server, or returns pointer if pre-existing. + * INPUTS + * none + * RESULT + * pointer to global server, or 0 if error. + * NOTES + * ***WARNING*** This function is not thread safe. It is included only for the very lazy. + * Multi-threaded programs that use this may experience problems. + * BUGS + * There is currently no way to cleanup the global server gracefully. + * SEE ALSO + * XMLRPC_ServerCreate () + * SOURCE + */ +XMLRPC_SERVER XMLRPC_GetGlobalServer() { + static XMLRPC_SERVER xsServer = 0; + if(!xsServer) { + xsServer = XMLRPC_ServerCreate(); + } + return xsServer; +} + +/*******/ + +/****f* VALUE/XMLRPC_ServerDestroy + * NAME + * XMLRPC_ServerDestroy + * SYNOPSIS + * void XMLRPC_ServerDestroy(XMLRPC_SERVER server) + * FUNCTION + * Free Server Resources + * INPUTS + * server The server to be free'd + * RESULT + * void + * NOTES + * This frees the server struct and any methods that have been added. + * SEE ALSO + * XMLRPC_ServerCreate () + * SOURCE + */ +void XMLRPC_ServerDestroy(XMLRPC_SERVER server) { + if(server) { + doc_method* dm = Q_Head(&server->docslist); + server_method* sm = Q_Head(&server->methodlist); + while( dm ) { + my_free(dm); + dm = Q_Next(&server->docslist); + } + while( sm ) { + if(sm->name) { + my_free(sm->name); + } + if(sm->desc) { + XMLRPC_CleanupValue(sm->desc); + } + my_free(sm); + sm = Q_Next(&server->methodlist); + } + if(server->xIntrospection) { + XMLRPC_CleanupValue(server->xIntrospection); + } + + Q_Destroy(&server->methodlist); + Q_Destroy(&server->docslist); + my_free(server); + } +} + +/*******/ + + +/****f* VALUE/XMLRPC_ServerRegisterMethod + * NAME + * XMLRPC_ServerRegisterMethod + * SYNOPSIS + * void XMLRPC_ServerRegisterMethod(XMLRPC_SERVER server, const char *name, XMLRPC_Callback cb) + * FUNCTION + * Register new XMLRPC method with server + * INPUTS + * server The XMLRPC_SERVER to register the method with + * name public name of the method + * cb C function that implements the method + * RESULT + * int - 1 if success, else 0 + * NOTES + * A C function must be registered for every "method" that the server recognizes. The + * method name is equivalent to method name in the + * XML syntax. + * SEE ALSO + * XMLRPC_ServerFindMethod () + * XMLRPC_ServerCallMethod () + * SOURCE + */ +int XMLRPC_ServerRegisterMethod(XMLRPC_SERVER server, const char *name, XMLRPC_Callback cb) { + if(server && name && cb) { + + server_method* sm = malloc(sizeof(server_method)); + + if(sm) { + sm->name = strdup(name); + sm->method = cb; + sm->desc = NULL; + + return Q_PushTail(&server->methodlist, sm); + } + } + return 0; +} + +/*******/ + +server_method* find_method(XMLRPC_SERVER server, const char* name) { + server_method* sm; + + q_iter qi = Q_Iter_Head_F(&server->methodlist); + + while( qi ) { + sm = Q_Iter_Get_F(qi); + if(sm && !strcmp(sm->name, name)) { + return sm; + } + qi = Q_Iter_Next_F(qi); + } + return NULL; +} + + +const char* type_to_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype) { + switch(type) { + case xmlrpc_none: + return "none"; + case xmlrpc_empty: + return "empty"; + case xmlrpc_nil: + return "nil"; + case xmlrpc_base64: + return "base64"; + case xmlrpc_boolean: + return "boolean"; + case xmlrpc_datetime: + return "datetime"; + case xmlrpc_double: + return "double"; + case xmlrpc_int: + return "int"; + case xmlrpc_string: + return "string"; + case xmlrpc_vector: + switch(vtype) { + case xmlrpc_vector_none: + return "none"; + case xmlrpc_vector_array: + return "array"; + case xmlrpc_vector_mixed: + return "mixed vector (struct)"; + case xmlrpc_vector_struct: + return "struct"; + } + } + return "unknown"; +} + +/****f* VALUE/XMLRPC_ServerFindMethod + * NAME + * XMLRPC_ServerFindMethod + * SYNOPSIS + * XMLRPC_Callback XMLRPC_ServerFindMethod(XMLRPC_SERVER server, const char* callName) + * FUNCTION + * retrieve C callback associated with a given method name. + * INPUTS + * server The XMLRPC_SERVER the method is registered with + * callName the method to find + * RESULT + * previously registered XMLRPC_Callback, or NULL + * NOTES + * Typically, this is used to determine if a requested method exists, without actually calling it. + * SEE ALSO + * XMLRPC_ServerCallMethod () + * XMLRPC_ServerRegisterMethod () + * SOURCE + */ +XMLRPC_Callback XMLRPC_ServerFindMethod(XMLRPC_SERVER server, const char* callName) { + if(server && callName) { + q_iter qi = Q_Iter_Head_F(&server->methodlist); + while( qi ) { + server_method* sm = Q_Iter_Get_F(qi); + if(sm && !strcmp(sm->name, callName)) { + return sm->method; + } + qi = Q_Iter_Next_F(qi); + } + } + return NULL; +} + +/*******/ + + +/* Call method specified in request */ +/****f* VALUE/XMLRPC_ServerCallMethod + * NAME + * XMLRPC_ServerCallMethod + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_ServerCallMethod(XMLRPC_SERVER server, XMLRPC_REQUEST request, void* userData) + * FUNCTION + * + * INPUTS + * server The XMLRPC_SERVER the method is registered with + * request the request to handle + * userData any additional data to pass to the C callback, or NULL + * RESULT + * XMLRPC_VALUE allocated by the callback, or NULL + * NOTES + * It is typically the caller's responsibility to free the returned value. + * + * Often the caller will want to serialize the result as XML, via + * XMLRPC_VALUE_To_XML () or XMLRPC_REQUEST_To_XML () + * SEE ALSO + * XMLRPC_ServerFindMethod () + * XMLRPC_ServerRegisterMethod () + * XMLRPC_CleanupValue () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_ServerCallMethod(XMLRPC_SERVER server, XMLRPC_REQUEST request, void* userData) { + XMLRPC_VALUE xReturn = NULL; + + /* check for error set during request parsing / generation */ + if(request && request->error) { + xReturn = XMLRPC_CopyValue(request->error); + } + else if (server && request) { + XMLRPC_Callback cb = + XMLRPC_ServerFindMethod (server, request->methodName.str); + if(cb) { + xReturn = cb(server, request, userData); + } + else { + xReturn = + XMLRPC_UtilityCreateFault (xmlrpc_error_unknown_method, + request->methodName.str); + } + } + return xReturn; +} + +/*******/ + +/*-***************** +* End server funcs * +*******************/ + + +/*-*********************************** +* Begin XMLRPC General Options funcs * +*************************************/ + +/* For options used by XMLRPC_VALUE funcs that otherwise do not have + * parameters for options. Kind of gross. :( + */ +typedef struct _xmlrpc_options { + XMLRPC_CASE id_case; + XMLRPC_CASE_COMPARISON id_case_compare; +} +STRUCT_XMLRPC_OPTIONS, *XMLRPC_OPTIONS; + +static XMLRPC_OPTIONS XMLRPC_GetDefaultOptions() { + static STRUCT_XMLRPC_OPTIONS options = { + xmlrpc_case_exact, + xmlrpc_case_sensitive + }; + return &options; +} + +/****f* VALUE/XMLRPC_GetDefaultIdCase + * NAME + * XMLRPC_GetDefaultIdCase + * SYNOPSIS + * XMLRPC_CASE XMLRPC_GetDefaultIdCase() + * FUNCTION + * Gets default case options used by XMLRPC_VALUE funcs + * INPUTS + * none + * RESULT + * XMLRPC_CASE + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_SetDefaultIdCase () + * SOURCE + */ +XMLRPC_CASE XMLRPC_GetDefaultIdCase() { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + return options->id_case; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetDefaultIdCase + * NAME + * XMLRPC_SetDefaultIdCase + * SYNOPSIS + * XMLRPC_CASE XMLRPC_SetDefaultIdCase(XMLRPC_CASE id_case) + * FUNCTION + * Sets default case options used by XMLRPC_VALUE funcs + * INPUTS + * id_case case options as enumerated by XMLRPC_CASE + * RESULT + * XMLRPC_CASE -- newly set option + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_GetDefaultIdCase () + * SOURCE + */ +XMLRPC_CASE XMLRPC_SetDefaultIdCase(XMLRPC_CASE id_case) { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + options->id_case = id_case; + return options->id_case; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetDefaultIdCaseComparison + * NAME + * XMLRPC_GetDefaultIdCaseComparison + * SYNOPSIS + * XMLRPC_CASE XMLRPC_GetDefaultIdCaseComparison( ) + * FUNCTION + * Gets default case comparison options used by XMLRPC_VALUE funcs + * INPUTS + * none + * RESULT + * XMLRPC_CASE_COMPARISON default + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_SetDefaultIdCaseComparison () + * SOURCE + */ +XMLRPC_CASE_COMPARISON XMLRPC_GetDefaultIdCaseComparison() { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + return options->id_case_compare; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetDefaultIdCaseComparison + * NAME + * XMLRPC_SetDefaultIdCaseComparison + * SYNOPSIS + * XMLRPC_CASE XMLRPC_SetDefaultIdCaseComparison( XMLRPC_CASE_COMPARISON id_case_compare ) + * FUNCTION + * Gets default case comparison options used by XMLRPC_VALUE funcs + * INPUTS + * id_case_compare case comparison rule to set as default + * RESULT + * XMLRPC_CASE_COMPARISON newly set default + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_GetDefaultIdCaseComparison () + * SOURCE + */ +XMLRPC_CASE_COMPARISON XMLRPC_SetDefaultIdCaseComparison(XMLRPC_CASE_COMPARISON id_case_compare) { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + options->id_case_compare = id_case_compare; + return options->id_case_compare; +} + +/*******/ + +/*-********************************* +* End XMLRPC General Options funcs * +***********************************/ + + +/*-****************** +* Fault API funcs * +********************/ + +/****f* UTILITY/XMLRPC_UtilityCreateFault + * NAME + * XMLRPC_UtilityCreateFault + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_UtilityCreateFault( int fault_code, const char* fault_string ) + * FUNCTION + * generates a struct containing a string member with id "faultString" and an int member + * with id "faultCode". When using the xmlrpc xml serialization, these will be translated + * to ... format. + * INPUTS + * fault_code application specific error code. can be 0. + * fault_string application specific error string. cannot be null. + * RESULT + * XMLRPC_VALUE a newly created struct vector representing the error, or null on error. + * NOTES + * This is a utility function. xmlrpc "faults" are not directly represented in this xmlrpc + * API or data structures. It is the author's view, that this API is intended for simple + * data types, and a "fault" is a complex data type consisting of multiple simple data + * types. This function is provided for convenience only, the same result could be + * achieved directly by the application. + * + * This function now supports some "standardized" fault codes, as specified at. + * http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php. + * If one of these fault codes is received, the description string will automatically + * be prefixed with a standard error string and 2 newlines. + * + * The actual transformation between this complex type and the xml "" element takes + * place in the xmlrpc to xml serialization layer. This step is not performed when using the + * simplerpc serialization, meaning that there will be no "" element in that + * serialization. There will simply be a standard struct with 2 child elements. + * imho, the "" element is unnecessary and/or out of place as part of the standard API. + * + * SOURCE + */ +XMLRPC_VALUE XMLRPC_UtilityCreateFault(int fault_code, const char* fault_string) { + XMLRPC_VALUE xOutput = NULL; + + char* string = NULL; + simplestring description; + simplestring_init(&description); + + switch (fault_code) { + case xmlrpc_error_parse_xml_syntax: + string = xmlrpc_error_parse_xml_syntax_str; + break; + case xmlrpc_error_parse_unknown_encoding: + string = xmlrpc_error_parse_unknown_encoding_str; + break; + case xmlrpc_error_parse_bad_encoding: + string = xmlrpc_error_parse_bad_encoding_str; + break; + case xmlrpc_error_invalid_xmlrpc: + string = xmlrpc_error_invalid_xmlrpc_str; + break; + case xmlrpc_error_unknown_method: + string = xmlrpc_error_unknown_method_str; + break; + case xmlrpc_error_invalid_params: + string = xmlrpc_error_invalid_params_str; + break; + case xmlrpc_error_internal_server: + string = xmlrpc_error_internal_server_str; + break; + case xmlrpc_error_application: + string = xmlrpc_error_application_str; + break; + case xmlrpc_error_system: + string = xmlrpc_error_system_str; + break; + case xmlrpc_error_transport: + string = xmlrpc_error_transport_str; + break; + } + + simplestring_add(&description, string); + + if(string && fault_string) { + simplestring_add(&description, "\n\n"); + } + simplestring_add(&description, fault_string); + + + if(description.len) { + xOutput = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + + XMLRPC_VectorAppendString (xOutput, "faultString", description.str, + description.len); + XMLRPC_VectorAppendInt(xOutput, "faultCode", fault_code); + } + + simplestring_free(&description); + + return xOutput; +} + +/*******/ + + +/****f* FAULT/XMLRPC_ValueIsFault + * NAME + * XMLRPC_ValueIsFault + * SYNOPSIS + * int XMLRPC_ValueIsFault (XMLRPC_VALUE value) + * FUNCTION + * Determines if a value encapsulates a fault "object" + * INPUTS + * value any XMLRPC_VALUE + * RESULT + * 1 if it is a fault, else 0 + * SEE ALSO + * XMLRPC_ResponseIsFault () + * SOURCE + */ +int XMLRPC_ValueIsFault (XMLRPC_VALUE value) { + if( XMLRPC_VectorGetValueWithID(value, "faultCode") && + XMLRPC_VectorGetValueWithID(value, "faultString") ) { + return 1; + } + return 0; +} +/*******/ + + +/****f* FAULT/XMLRPC_ResponseIsFault + * NAME + * XMLRPC_ResponseIsFault + * SYNOPSIS + * int XMLRPC_ResponseIsFault (XMLRPC_REQUEST response) + * FUNCTION + * Determines if a response contains an encapsulated fault "object" + * INPUTS + * value any XMLRPC_REQUEST. typically of type xmlrpc_request_response + * RESULT + * 1 if it contains a fault, else 0 + * SEE ALSO + * XMLRPC_ValueIsFault () + * SOURCE + */ +int XMLRPC_ResponseIsFault(XMLRPC_REQUEST response) { + return XMLRPC_ValueIsFault( XMLRPC_RequestGetData(response) ); +} + +/*******/ + +/****f* FAULT/XMLRPC_GetValueFaultCode + * NAME + * XMLRPC_GetValueFaultCode + * SYNOPSIS + * int XMLRPC_GetValueFaultCode (XMLRPC_VALUE value) + * FUNCTION + * returns fault code from a struct, if any + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_vector_struct. + * RESULT + * fault code, else 0. + * BUGS + * impossible to distinguish faultCode == 0 from faultCode not present. + * SEE ALSO + * XMLRPC_GetResponseFaultCode () + * SOURCE + */ +int XMLRPC_GetValueFaultCode (XMLRPC_VALUE value) { + return XMLRPC_VectorGetIntWithID(value, "faultCode"); +} + +/*******/ + +/****f* FAULT/XMLRPC_GetResponseFaultCode + * NAME + * XMLRPC_GetResponseFaultCode + * SYNOPSIS + * int XMLRPC_GetResponseFaultCode(XMLRPC_REQUEST response) + * FUNCTION + * returns fault code from a response, if any + * INPUTS + * response XMLRPC_REQUEST. typically of type xmlrpc_request_response. + * RESULT + * fault code, else 0. + * BUGS + * impossible to distinguish faultCode == 0 from faultCode not present. + * SEE ALSO + * XMLRPC_GetValueFaultCode () + * SOURCE + */ +int XMLRPC_GetResponseFaultCode(XMLRPC_REQUEST response) { + return XMLRPC_GetValueFaultCode( XMLRPC_RequestGetData(response) ); +} + +/*******/ + + +/****f* FAULT/XMLRPC_GetValueFaultString + * NAME + * XMLRPC_GetValueFaultString + * SYNOPSIS + * const char* XMLRPC_GetValueFaultString (XMLRPC_VALUE value) + * FUNCTION + * returns fault string from a struct, if any + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_vector_struct. + * RESULT + * fault string, else 0. + * SEE ALSO + * XMLRPC_GetResponseFaultString () + * SOURCE + */ +const char* XMLRPC_GetValueFaultString (XMLRPC_VALUE value) { + return XMLRPC_VectorGetStringWithID(value, "faultString"); +} + +/*******/ + +/****f* FAULT/XMLRPC_GetResponseFaultString + * NAME + * XMLRPC_GetResponseFaultString + * SYNOPSIS + * const char* XMLRPC_GetResponseFaultString (XMLRPC_REQUEST response) + * FUNCTION + * returns fault string from a response, if any + * INPUTS + * response XMLRPC_REQUEST. typically of type xmlrpc_request_response. + * RESULT + * fault string, else 0. + * SEE ALSO + * XMLRPC_GetValueFaultString () + * SOURCE + */ +const char* XMLRPC_GetResponseFaultString (XMLRPC_REQUEST response) { + return XMLRPC_GetValueFaultString( XMLRPC_RequestGetData(response) ); +} + +/*******/ + + +/*-****************** +* Utility API funcs * +********************/ + + +/****f* UTILITY/XMLRPC_Free + * NAME + * XMLRPC_Free + * SYNOPSIS + * void XMLRPC_Free(void* mem) + * FUNCTION + * frees a block of memory allocated by xmlrpc. + * INPUTS + * mem memory to free + * RESULT + * void + * NOTES + * Useful for OS's where memory must be free'd + * in the same library in which it is allocated. + * SOURCE + */ +void XMLRPC_Free(void* mem) { + my_free(mem); +} + +/*******/ + + +/****f* UTILITY/XMLRPC_GetVersionString + * NAME + * XMLRPC_GetVersionString + * SYNOPSIS + * const char* XMLRPC_GetVersionString() + * FUNCTION + * returns library version string + * INPUTS + * + * RESULT + * const char* + * NOTES + * SOURCE + */ +const char* XMLRPC_GetVersionString() { + return XMLRPC_VERSION_STR; +} + +/*******/ + + +/*-********************** +* End Utility API funcs * +************************/ diff --git a/php/xmlrpc/libxmlrpc/xmlrpc.h b/php/xmlrpc/libxmlrpc/xmlrpc.h new file mode 100644 index 0000000..eead11c --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc.h @@ -0,0 +1,455 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef XMLRPC_ALREADY_INCLUDED +#define XMLRPC_ALREADY_INCLUDED 1 + +/* includes */ +#include "xml_element.h" +#include /* for time_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* allow version to be specified via compile line define */ +#ifndef XMLRPC_LIB_VERSION + #define XMLRPC_LIB_VERSION "0.51" +#endif + +/* this number, representing the date, must be increased each time the API changes */ +#define XMLRPC_API_NO 20020623 + +/* this string should be changed with each packaged release */ +#define XMLRPC_VERSION_STR "xmlrpc-epi v. " XMLRPC_LIB_VERSION + +/* where to find more info. shouldn't need to change much */ +#define XMLRPC_HOME_PAGE_STR "http://xmlprc-epi.sourceforge.net/" + + +/****d* VALUE/XMLRPC_VALUE_TYPE + * NAME + * XMLRPC_VALUE_TYPE + * NOTES + * Defines data types for XMLRPC_VALUE + * Deprecated for public use. See XMLRPC_VALUE_TYPE_EASY + * SEE ALSO + * XMLRPC_VECTOR_TYPE + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +typedef enum _XMLRPC_VALUE_TYPE { + xmlrpc_none, /* not a value */ + xmlrpc_empty, /* empty value */ + xmlrpc_nil, /* null value, eg NULL */ + xmlrpc_base64, /* base64 value, eg binary data */ + xmlrpc_boolean, /* boolean [0 | 1] */ + xmlrpc_datetime, /* datetime [ISO8601 | time_t] */ + xmlrpc_double, /* double / floating point */ + xmlrpc_int, /* integer */ + xmlrpc_string, /* string */ + xmlrpc_vector /* vector, aka list, array */ +} XMLRPC_VALUE_TYPE; +/*******/ + +/****d* VALUE/XMLRPC_VECTOR_TYPE + * NAME + * XMLRPC_VECTOR_TYPE + * NOTES + * Defines data types for XMLRPC_VECTOR. + * Deprecated for public use. See XMLRPC_VALUE_TYPE_EASY + * SEE ALSO + * XMLRPC_VALUE_TYPE + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +typedef enum _XMLRPC_VECTOR_TYPE { + xmlrpc_vector_none, /* not an array */ + xmlrpc_vector_array, /* no values may have key names */ + xmlrpc_vector_mixed, /* some values may have key names */ + xmlrpc_vector_struct /* all values must have key names */ +} XMLRPC_VECTOR_TYPE; +/*******/ + +/****d* VALUE/XMLRPC_VALUE_TYPE_EASY + * NAME + * XMLRPC_VALUE_TYPE_EASY + * NOTES + * Defines data types for XMLRPC_VALUE, including vector types. + * SEE ALSO + * XMLRPC_VECTOR_TYPE + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +typedef enum _XMLRPC_VALUE_TYPE_EASY { + xmlrpc_type_none, /* not a value */ + xmlrpc_type_empty, /* empty value, eg NULL */ + xmlrpc_type_base64, /* base64 value, eg binary data */ + xmlrpc_type_boolean, /* boolean [0 | 1] */ + xmlrpc_type_datetime, /* datetime [ISO8601 | time_t] */ + xmlrpc_type_double, /* double / floating point */ + xmlrpc_type_int, /* integer */ + xmlrpc_type_string, /* string */ +/* -- IMPORTANT: identical to XMLRPC_VALUE_TYPE to this point. -- */ + xmlrpc_type_array, /* vector array */ + xmlrpc_type_mixed, /* vector mixed */ + xmlrpc_type_struct /* vector struct */ +} XMLRPC_VALUE_TYPE_EASY; +/*******/ + + +/****d* VALUE/XMLRPC_REQUEST_TYPE + * NAME + * XMLRPC_REQUEST_TYPE + * NOTES + * Defines data types for XMLRPC_REQUEST + * SEE ALSO + * XMLRPC_VALUE_TYPE + * XMLRPC_VECTOR_TYPE + * SOURCE + */ +typedef enum _xmlrpc_request_type { + xmlrpc_request_none, /* not a valid request */ + xmlrpc_request_call, /* calling/invoking a method */ + xmlrpc_request_response, /* responding to a method call */ +} XMLRPC_REQUEST_TYPE; +/*******/ + +/****d* VALUE/XMLRPC_ERROR_CODE + * NAME + * XMLRPC_ERROR_CODE + * NOTES + * All existing error codes + * SEE ALSO + * XMLRPC_REQUEST_ERROR + * SOURCE + */ +typedef enum _xmlrpc_error_code { + xmlrpc_error_none = 0, /* not an error */ + xmlrpc_error_parse_xml_syntax = -32700, + xmlrpc_error_parse_unknown_encoding = -32701, + xmlrpc_error_parse_bad_encoding = -32702, + xmlrpc_error_invalid_xmlrpc = -32600, + xmlrpc_error_unknown_method = -32601, + xmlrpc_error_invalid_params = -32602, + xmlrpc_error_internal_server = -32603, + xmlrpc_error_application = -32500, + xmlrpc_error_system = -32400, + xmlrpc_error_transport = -32300 +} XMLRPC_ERROR_CODE; +/******/ + +#define xmlrpc_error_parse_xml_syntax_str "parse error. not well formed." +#define xmlrpc_error_parse_unknown_encoding_str "parse error. unknown encoding" +#define xmlrpc_error_parse_bad_encoding_str "parse error. invalid character for encoding" +#define xmlrpc_error_invalid_xmlrpc_str "server error. xml-rpc not conforming to spec" +#define xmlrpc_error_unknown_method_str "server error. method not found." +#define xmlrpc_error_invalid_params_str "server error. invalid method parameters" +#define xmlrpc_error_internal_server_str "server error. internal xmlrpc library error" +#define xmlrpc_error_application_str "application error." +#define xmlrpc_error_system_str "system error." +#define xmlrpc_error_transport_str "transport error." + + + +/****d* VALUE/XMLRPC_VERSION + * NAME + * XMLRPC_VERSION + * NOTES + * Defines xml vocabulary used for generated xml + * SEE ALSO + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * XMLRPC_REQUEST_To_XML () + * SOURCE + */ +typedef enum _xmlrpc_version { + xmlrpc_version_none = 0, /* not a recognized vocabulary */ + xmlrpc_version_1_0 = 1, /* xmlrpc 1.0 standard vocab */ + xmlrpc_version_simple = 2, /* alt more readable vocab */ + xmlrpc_version_danda = 2, /* same as simple. legacy */ + xmlrpc_version_soap_1_1 = 3 /* SOAP. version 1.1 */ +} XMLRPC_VERSION; +/******/ + +/****s* VALUE/XMLRPC_REQUEST_OUTPUT_OPTIONS + * NAME + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * NOTES + * Defines output options for generated xml + * SEE ALSO + * XMLRPC_VERSION + * XML_ELEM_OUTPUT_OPTIONS + * XMLRPC_REQUEST_To_XML () + * SOURCE + */ +typedef struct _xmlrpc_request_output_options { + STRUCT_XML_ELEM_OUTPUT_OPTIONS xml_elem_opts; /* xml_element specific output options */ + XMLRPC_VERSION version; /* xml vocabulary to use */ +} STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS, *XMLRPC_REQUEST_OUTPUT_OPTIONS; +/******/ + +/****s* VALUE/XMLRPC_REQUEST_INPUT_OPTIONS + * NAME + * XMLRPC_REQUEST_INPUT_OPTIONS + * NOTES + * Defines options for reading in xml data + * SEE ALSO + * XMLRPC_VERSION + * XML_ELEM_INPUT_OPTIONS + * XMLRPC_REQUEST_From_XML () + * SOURCE + */ +typedef struct _xmlrpc_request_input_options { + STRUCT_XML_ELEM_INPUT_OPTIONS xml_elem_opts; /* xml_element specific output options */ +} STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS, *XMLRPC_REQUEST_INPUT_OPTIONS; +/******/ + +/****s* VALUE/XMLRPC_ERROR + * NAME + * XMLRPC_ERROR + * NOTES + * For the reporting and handling of errors + * SOURCE + */ +typedef struct _xmlrpc_error { + XMLRPC_ERROR_CODE code; + STRUCT_XML_ELEM_ERROR xml_elem_error; /* xml_element errors (parser errors) */ +} STRUCT_XMLRPC_ERROR, *XMLRPC_ERROR; +/******/ + + +/****d* VALUE/XMLRPC_CASE_COMPARISON + * NAME + * XMLRPC_CASE_COMPARISON + * NOTES + * Defines case comparison options for XMLRPC_VALUE/VECTOR API's + * SEE ALSO + * XMLRPC_CASE + * XMLRPC_VALUE + * SOURCE + */ +typedef enum _xmlrpc_case_comparison { + xmlrpc_case_insensitive, /* use case-insensitive compare */ + xmlrpc_case_sensitive /* use case-sensitive compare */ +} XMLRPC_CASE_COMPARISON; +/******/ + +/****d* VALUE/XMLRPC_CASE + * NAME + * XMLRPC_CASE + * NOTES + * Defines case behavior when setting IDs in XMLRPC_VALUE API's + * SEE ALSO + * XMLRPC_CASE_COMPARISON + * XMLRPC_VALUE + * SOURCE + */ +typedef enum _xmlrpc_case { + xmlrpc_case_exact, /* leave case alone */ + xmlrpc_case_lower, /* lower-case id */ + xmlrpc_case_upper /* upper-case id */ +} XMLRPC_CASE; +/******/ + +/* if you don't like these defaults, you can set them with XMLRPC_SetDefaultIdCase*() */ +#define XMLRPC_DEFAULT_ID_CASE XMLRPC_GetDefaultIdCase() +#define XMLRPC_DEFAULT_ID_CASE_SENSITIVITY XMLRPC_GetDefaultIdCaseComparison() + +/* opaque (non-public) types. defined locally in xmlrpc.c */ +typedef struct _xmlrpc_request* XMLRPC_REQUEST; +typedef struct _xmlrpc_server* XMLRPC_SERVER; +typedef struct _xmlrpc_value* XMLRPC_VALUE; + +/****d* VALUE/XMLRPC_Callback + * NAME + * XMLRPC_Callback + * NOTES + * Function prototype for user defined method handlers (callbacks). + * SEE ALSO + * XMLRPC_ServerRegisterMethod () + * XMLRPC_ServerCallMethod () + * XMLRPC_REQUEST + * XMLRPC_VALUE + * SOURCE + */ +typedef XMLRPC_VALUE (*XMLRPC_Callback)(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +/******/ + +/* ID Case Defaults */ +XMLRPC_CASE XMLRPC_GetDefaultIdCase(void); +XMLRPC_CASE XMLRPC_SetDefaultIdCase(XMLRPC_CASE id_case); +XMLRPC_CASE_COMPARISON XMLRPC_GetDefaultIdCaseComparison(void); +XMLRPC_CASE_COMPARISON XMLRPC_SetDefaultIdCaseComparison(XMLRPC_CASE_COMPARISON id_case); + +/* Vector manipulation */ +int XMLRPC_VectorSize(XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_VectorRewind(XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_VectorNext(XMLRPC_VALUE value); +int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type); +int XMLRPC_AddValueToVector(XMLRPC_VALUE target, XMLRPC_VALUE source); +int XMLRPC_AddValuesToVector(XMLRPC_VALUE target, ...); +int XMLRPC_VectorRemoveValue(XMLRPC_VALUE vector, XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_VectorGetValueWithID_Case(XMLRPC_VALUE vector, const char* id, XMLRPC_CASE_COMPARISON id_case); + + +/* Create values */ +XMLRPC_VALUE XMLRPC_CreateValueBoolean(const char* id, int truth); +XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len); +XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time); +XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s); +XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double f); +XMLRPC_VALUE XMLRPC_CreateValueInt(const char* id, int i); +XMLRPC_VALUE XMLRPC_CreateValueString(const char* id, const char* s, int len); +XMLRPC_VALUE XMLRPC_CreateValueEmpty(void); +XMLRPC_VALUE XMLRPC_CreateVector(const char* id, XMLRPC_VECTOR_TYPE type); + +/* Cleanup values */ +void XMLRPC_CleanupValue(XMLRPC_VALUE value); + +/* Request error */ +XMLRPC_VALUE XMLRPC_RequestSetError (XMLRPC_REQUEST request, XMLRPC_VALUE error); +XMLRPC_VALUE XMLRPC_RequestGetError (XMLRPC_REQUEST request); + +/* Copy values */ +XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_DupValueNew(XMLRPC_VALUE xSource); + +/* Set Values */ +void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time); +void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s); +void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val); +void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val); +void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val); +const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* s, int len); +void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len); +const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case); +#define XMLRPC_SetValueID(value, id, len) XMLRPC_SetValueID_Case(value, id, len, XMLRPC_DEFAULT_ID_CASE) + +/* Get Values */ +const char* XMLRPC_GetValueString(XMLRPC_VALUE value); +int XMLRPC_GetValueStringLen(XMLRPC_VALUE value); +int XMLRPC_GetValueInt(XMLRPC_VALUE value); +int XMLRPC_GetValueBoolean(XMLRPC_VALUE value); +double XMLRPC_GetValueDouble(XMLRPC_VALUE value); +const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value); +time_t XMLRPC_GetValueDateTime(XMLRPC_VALUE value); +const char* XMLRPC_GetValueDateTime_ISO8601(XMLRPC_VALUE value); +const char* XMLRPC_GetValueID(XMLRPC_VALUE value); + +/* Type introspection */ +XMLRPC_VALUE_TYPE XMLRPC_GetValueType(XMLRPC_VALUE v); +XMLRPC_VALUE_TYPE_EASY XMLRPC_GetValueTypeEasy(XMLRPC_VALUE v); +XMLRPC_VECTOR_TYPE XMLRPC_GetVectorType(XMLRPC_VALUE v); + +/* Parsing and Creating XML */ +XMLRPC_REQUEST XMLRPC_REQUEST_FromXML(const char* in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options); +XMLRPC_VALUE XMLRPC_VALUE_FromXML(const char* in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options); +char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request, int *buf_len); +char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val, int* buf_len); + +/* Request manipulation funcs */ +const char* XMLRPC_RequestSetMethodName(XMLRPC_REQUEST request, const char* methodName); +const char* XMLRPC_RequestGetMethodName(XMLRPC_REQUEST request); +XMLRPC_REQUEST XMLRPC_RequestNew(void); +void XMLRPC_RequestFree(XMLRPC_REQUEST request, int bFreeIO); +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output); +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request); +XMLRPC_VALUE XMLRPC_RequestSetData(XMLRPC_REQUEST request, XMLRPC_VALUE data); +XMLRPC_VALUE XMLRPC_RequestGetData(XMLRPC_REQUEST request); +XMLRPC_REQUEST_TYPE XMLRPC_RequestSetRequestType(XMLRPC_REQUEST request, XMLRPC_REQUEST_TYPE type); +XMLRPC_REQUEST_TYPE XMLRPC_RequestGetRequestType(XMLRPC_REQUEST request); + +/* Server Creation/Destruction; Method Registration and Invocation */ +XMLRPC_SERVER XMLRPC_ServerCreate(void); +XMLRPC_SERVER XMLRPC_GetGlobalServer(void); /* better to use XMLRPC_ServerCreate if you can */ +void XMLRPC_ServerDestroy(XMLRPC_SERVER server); +int XMLRPC_ServerRegisterMethod(XMLRPC_SERVER server, const char *name, XMLRPC_Callback cb); +XMLRPC_Callback XMLRPC_ServerFindMethod(XMLRPC_SERVER server, const char* callName); +XMLRPC_VALUE XMLRPC_ServerCallMethod(XMLRPC_SERVER server, XMLRPC_REQUEST request, void* userData); + +#include "xmlrpc_introspection.h" + +/* Fault interrogation funcs */ +int XMLRPC_ValueIsFault (XMLRPC_VALUE value); +int XMLRPC_ResponseIsFault(XMLRPC_REQUEST response); +int XMLRPC_GetValueFaultCode (XMLRPC_VALUE value); +int XMLRPC_GetResponseFaultCode(XMLRPC_REQUEST response); +const char* XMLRPC_GetValueFaultString (XMLRPC_VALUE value); +const char* XMLRPC_GetResponseFaultString (XMLRPC_REQUEST response); + + +/* Public Utility funcs */ +XMLRPC_VALUE XMLRPC_UtilityCreateFault(int fault_code, const char* fault_string); +void XMLRPC_Free(void* mem); +const char* XMLRPC_GetVersionString(void); + +/****d* VALUE/XMLRPC_MACROS + * NAME + * Some Helpful Macros + * NOTES + * Some macros for making life easier. Should be self-explanatory. + * SEE ALSO + * XMLRPC_AddValueToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * SOURCE + */ + +/* Append values to vector */ +#define XMLRPC_VectorAppendString(vector, id, s, len) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueString(id, s, len)) +#define XMLRPC_VectorAppendBase64(vector, id, s, len) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueBase64(id, s, len)) +#define XMLRPC_VectorAppendDateTime(vector, id, time) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDateTime(id, time)) +#define XMLRPC_VectorAppendDateTime_ISO8601(vector, id, s) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDateTime_ISO8601(id, s)) +#define XMLRPC_VectorAppendDouble(vector, id, f) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDouble(id, f)) +#define XMLRPC_VectorAppendInt(vector, id, i) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueInt(id, i)) +#define XMLRPC_VectorAppendBoolean(vector, id, i) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueBoolean(id, i)) + +/* Get named values from vector */ +#define XMLRPC_VectorGetValueWithID(vector, id) XMLRPC_VectorGetValueWithID_Case(vector, id, XMLRPC_DEFAULT_ID_CASE_SENSITIVITY) +#define XMLRPC_VectorGetStringWithID(vector, id) XMLRPC_GetValueString(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetBase64WithID(vector, id) XMLRPC_GetValueBase64(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetDateTimeWithID(vector, id) XMLRPC_GetValueDateTime(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetDoubleWithID(vector, id) XMLRPC_GetValueDouble(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetIntWithID(vector, id) XMLRPC_GetValueInt(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetBooleanWithID(vector, id) XMLRPC_GetValueBoolean(XMLRPC_VectorGetValueWithID(vector, id)) + +/******/ + + +#ifdef __cplusplus +} +#endif + +#endif /* not XMLRPC_ALREADY_INCLUDED */ + + + diff --git a/php/xmlrpc/libxmlrpc/xmlrpc.m4 b/php/xmlrpc/libxmlrpc/xmlrpc.m4 new file mode 100644 index 0000000..87da92d --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc.m4 @@ -0,0 +1,12 @@ +AC_DEFUN([XMLRPC_CHECKS],[ + +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_LN_S]) +AC_REQUIRE([AC_PROG_RANLIB]) + +AC_DEFINE(UNDEF_THREADS_HACK,,[ ]) + +XMLRPC_HEADER_CHECKS +XMLRPC_TYPE_CHECKS +XMLRPC_FUNCTION_CHECKS +]) diff --git a/php/xmlrpc/libxmlrpc/xmlrpc_introspection.c b/php/xmlrpc/libxmlrpc/xmlrpc_introspection.c new file mode 100644 index 0000000..589ff8e --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc_introspection.c @@ -0,0 +1,604 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +/****h* ABOUT/xmlrpc_introspection + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * HISTORY + * $Log: xmlrpc_introspection.c,v $ + * Revision 1.4 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.3 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.9 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 4/10/2001 -- danda -- initial introspection support + * TODO + * NOTES + *******/ + + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include "queue.h" +#include "xmlrpc.h" +#include "xmlrpc_private.h" +#include "xmlrpc_introspection_private.h" +#include +#include +#include + + +/* forward declarations for static (non public, non api) funcs */ +static XMLRPC_VALUE xi_system_describe_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xi_system_list_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xi_system_method_signature_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xi_system_method_help_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); + + +/*-********************************** +* Introspection Callbacks (methods) * +************************************/ + +/* iterates through a list of structs and finds the one with key "name" matching + * needle. slow, would benefit from a struct key hash. + */ +inline XMLRPC_VALUE find_named_value(XMLRPC_VALUE list, const char* needle) { + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(list); + while(xIter) { + const char* name = XMLRPC_VectorGetStringWithID(xIter, xi_token_name); + if(name && !strcmp(name, needle)) { + return xIter; + } + xIter = XMLRPC_VectorNext(list); + } + return NULL; +} + + +/* iterates through docs callbacks and calls any that have not yet been called */ +static void check_docs_loaded(XMLRPC_SERVER server, void* userData) { + if(server) { + q_iter qi = Q_Iter_Head_F(&server->docslist); + while( qi ) { + doc_method* dm = Q_Iter_Get_F(qi); + if(dm && !dm->b_called) { + dm->method(server, userData); + dm->b_called = 1; + } + qi = Q_Iter_Next_F(qi); + } + } +} + + +/* utility function for xi_system_describe_methods_cb */ +inline void describe_method(XMLRPC_SERVER server, XMLRPC_VALUE vector, const char* method) { + if(method) { + server_method* sm = find_method(server, method); + if(sm) { + XMLRPC_AddValueToVector(vector, sm->desc); + } + } +} + + + +/* system.describeMethods() callback */ +static XMLRPC_VALUE xi_system_describe_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xParams = XMLRPC_VectorRewind(XMLRPC_RequestGetData(input)); + XMLRPC_VALUE xResponse = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + XMLRPC_VALUE xMethodList = XMLRPC_CreateVector("methodList", xmlrpc_vector_array); + XMLRPC_VALUE xTypeList = NULL; + int bAll = 1; + + /* lazy loading of introspection data */ + check_docs_loaded(server, userData); + + xTypeList = XMLRPC_VectorGetValueWithID(server->xIntrospection, "typeList"); + + XMLRPC_AddValueToVector(xResponse, xTypeList); + XMLRPC_AddValueToVector(xResponse, xMethodList); + + /* check if we have any param */ + if(xParams) { + /* check if string or vector (1 or n) */ + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(xParams); + if(type == xmlrpc_string) { + /* just one. spit it out. */ + describe_method(server, xMethodList, XMLRPC_GetValueString(xParams)); + bAll = 0; + } + else if(type == xmlrpc_vector) { + /* multiple. spit all out */ + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(xParams); + while(xIter) { + describe_method(server, xMethodList, XMLRPC_GetValueString(xIter)); + xIter = XMLRPC_VectorNext(xParams); + } + bAll = 0; + } + } + + /* otherwise, default to sending all methods */ + if(bAll) { + q_iter qi = Q_Iter_Head_F(&server->methodlist); + while( qi ) { + server_method* sm = Q_Iter_Get_F(qi); + if(sm) { + XMLRPC_AddValueToVector(xMethodList, sm->desc); + } + qi = Q_Iter_Next_F(qi); + } + } + + return xResponse; +} + +/* this complies with system.listMethods as defined at http://xmlrpc.usefulinc.com/doc/reserved.html */ +static XMLRPC_VALUE xi_system_list_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xResponse = XMLRPC_CreateVector(NULL, xmlrpc_vector_array); + + q_iter qi = Q_Iter_Head_F(&server->methodlist); + while( qi ) { + server_method* sm = Q_Iter_Get_F(qi); + if(sm) { + XMLRPC_VectorAppendString(xResponse, 0, sm->name, 0); + } + qi = Q_Iter_Next_F(qi); + } + return xResponse; +} + +/* this complies with system.methodSignature as defined at + * http://xmlrpc.usefulinc.com/doc/sysmethodsig.html + */ +static XMLRPC_VALUE xi_system_method_signature_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + const char* method = XMLRPC_GetValueString(XMLRPC_VectorRewind(XMLRPC_RequestGetData(input))); + XMLRPC_VALUE xResponse = NULL; + + /* lazy loading of introspection data */ + check_docs_loaded(server, userData); + + if(method) { + server_method* sm = find_method(server, method); + if(sm && sm->desc) { + XMLRPC_VALUE xTypesArray = XMLRPC_CreateVector(NULL, xmlrpc_vector_array); + XMLRPC_VALUE xIter, xParams, xSig, xSigIter; + const char* type; + + /* array of possible signatures. */ + xResponse = XMLRPC_CreateVector(NULL, xmlrpc_vector_array); + + /* find first signature */ + xSig = XMLRPC_VectorGetValueWithID(sm->desc, xi_token_signatures); + xSigIter = XMLRPC_VectorRewind( xSig ); + + /* iterate through sigs */ + while(xSigIter) { + /* first type is the return value */ + type = XMLRPC_VectorGetStringWithID(XMLRPC_VectorRewind( + XMLRPC_VectorGetValueWithID(xSigIter, xi_token_returns)), + xi_token_type); + XMLRPC_AddValueToVector(xTypesArray, + XMLRPC_CreateValueString(NULL, + type ? type : type_to_str(xmlrpc_none, 0), + 0)); + + /* the rest are parameters */ + xParams = XMLRPC_VectorGetValueWithID(xSigIter, xi_token_params); + xIter = XMLRPC_VectorRewind(xParams); + + /* iter through params, adding to types array */ + while(xIter) { + XMLRPC_AddValueToVector(xTypesArray, + XMLRPC_CreateValueString(NULL, + XMLRPC_VectorGetStringWithID(xIter, xi_token_type), + 0)); + xIter = XMLRPC_VectorNext(xParams); + } + + /* add types for this signature */ + XMLRPC_AddValueToVector(xResponse, xTypesArray); + + xSigIter = XMLRPC_VectorNext( xSig ); + } + } + } + + return xResponse; +} + +/* this complies with system.methodHelp as defined at + * http://xmlrpc.usefulinc.com/doc/sysmethhelp.html + */ +static XMLRPC_VALUE xi_system_method_help_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + const char* method = XMLRPC_GetValueString(XMLRPC_VectorRewind(XMLRPC_RequestGetData(input))); + XMLRPC_VALUE xResponse = NULL; + + /* lazy loading of introspection data */ + check_docs_loaded(server, userData); + + if(method) { + server_method* sm = find_method(server, method); + if(sm && sm->desc) { + const char* help = XMLRPC_VectorGetStringWithID(sm->desc, xi_token_purpose); + + /* returns a documentation string, or empty string */ + xResponse = XMLRPC_CreateValueString(NULL, help ? help : xi_token_empty, 0); + } + } + + return xResponse; +} + +/*-************************************** +* End Introspection Callbacks (methods) * +****************************************/ + + +/*-************************ +* Introspection Utilities * +**************************/ + +/* performs registration of introspection methods */ +void xi_register_system_methods(XMLRPC_SERVER server) { + XMLRPC_ServerRegisterMethod(server, xi_token_system_list_methods, xi_system_list_methods_cb); + XMLRPC_ServerRegisterMethod(server, xi_token_system_method_help, xi_system_method_help_cb); + XMLRPC_ServerRegisterMethod(server, xi_token_system_method_signature, xi_system_method_signature_cb); + XMLRPC_ServerRegisterMethod(server, xi_token_system_describe_methods, xi_system_describe_methods_cb); +} + +/* describe a value (param, return, type) */ +static XMLRPC_VALUE describeValue_worker(const char* type, const char* id, const char* desc, int optional, const char* default_val, XMLRPC_VALUE sub_params) { + XMLRPC_VALUE xParam = NULL; + if(id || desc) { + xParam = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + XMLRPC_VectorAppendString(xParam, xi_token_name, id, 0); + XMLRPC_VectorAppendString(xParam, xi_token_type, type, 0); + XMLRPC_VectorAppendString(xParam, xi_token_description, desc, 0); + if(optional != 2) { + XMLRPC_VectorAppendInt(xParam, xi_token_optional, optional); + } + if(optional == 1 && default_val) { + XMLRPC_VectorAppendString(xParam, xi_token_default, default_val, 0); + } + XMLRPC_AddValueToVector(xParam, sub_params); + } + return xParam; +} + + +/* convert an xml tree conforming to spec to XMLRPC_VALUE + * suitable for use with XMLRPC_ServerAddIntrospectionData + */ +XMLRPC_VALUE xml_element_to_method_description(xml_element* el, XMLRPC_ERROR err) { + XMLRPC_VALUE xReturn = NULL; + + if(el->name) { + const char* name = NULL; + const char* type = NULL; + const char* basetype = NULL; + const char* desc = NULL; + const char* def = NULL; + int optional = 0; + xml_element_attr* attr_iter = Q_Head(&el->attrs); + + /* grab element attributes up front to save redundant while loops */ + while(attr_iter) { + if(!strcmp(attr_iter->key, "name")) { + name = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "type")) { + type = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "basetype")) { + basetype = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "desc")) { + desc = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "optional")) { + if(attr_iter->val && !strcmp(attr_iter->val, "yes")) { + optional = 1; + } + } + else if(!strcmp(attr_iter->key, "default")) { + def = attr_iter->val; + } + attr_iter = Q_Next(&el->attrs); + } + + /* value and typeDescription behave about the same */ + if(!strcmp(el->name, "value") || !strcmp(el->name, "typeDescription")) { + XMLRPC_VALUE xSubList = NULL; + const char* ptype = !strcmp(el->name, "value") ? type : basetype; + if(ptype) { + if(Q_Size(&el->children) && + (!strcmp(ptype, "array") || !strcmp(ptype, "struct") || !strcmp(ptype, "mixed"))) { + xSubList = XMLRPC_CreateVector("member", xmlrpc_vector_array); + + if(xSubList) { + xml_element* elem_iter = Q_Head(&el->children); + while(elem_iter) { + XMLRPC_AddValueToVector(xSubList, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + } + xReturn = describeValue_worker(ptype, name, (desc ? desc : (xSubList ? NULL : el->text.str)), optional, def, xSubList); + } + } + + /* these three kids are about equivalent */ + else if(!strcmp(el->name, "params") || + !strcmp(el->name, "returns") || + !strcmp(el->name, "signature")) { + if(Q_Size(&el->children)) { + xml_element* elem_iter = Q_Head(&el->children); + xReturn = XMLRPC_CreateVector(!strcmp(el->name, "signature") ? NULL : el->name, xmlrpc_vector_struct); + + + while(elem_iter) { + XMLRPC_AddValueToVector(xReturn, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + } + + + else if(!strcmp(el->name, "methodDescription")) { + xml_element* elem_iter = Q_Head(&el->children); + xReturn = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + + XMLRPC_VectorAppendString(xReturn, xi_token_name, name, 0); + + while(elem_iter) { + XMLRPC_AddValueToVector(xReturn, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + + /* items are slightly special */ + else if(!strcmp(el->name, "item")) { + xReturn = XMLRPC_CreateValueString(name, el->text.str, el->text.len); + } + + /* sure. we'll let any ol element with children through */ + else if(Q_Size(&el->children)) { + xml_element* elem_iter = Q_Head(&el->children); + xReturn = XMLRPC_CreateVector(el->name, xmlrpc_vector_mixed); + + while(elem_iter) { + XMLRPC_AddValueToVector(xReturn, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + + /* or anything at all really, so long as its got some text. + * no reason being all snotty about a spec, right? + */ + else if(el->name && el->text.len) { + xReturn = XMLRPC_CreateValueString(el->name, el->text.str, el->text.len); + } + } + + return xReturn; +} + +/*-**************************** +* End Introspection Utilities * +******************************/ + + + +/*-****************** +* Introspection API * +********************/ + + +/****f* VALUE/XMLRPC_IntrospectionCreateDescription + * NAME + * XMLRPC_IntrospectionCreateDescription + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_IntrospectionCreateDescription(const char* xml, XMLRPC_ERROR err) + * FUNCTION + * converts raw xml describing types and methods into an + * XMLRPC_VALUE suitable for use with XMLRPC_ServerAddIntrospectionData() + * INPUTS + * xml - xml data conforming to introspection spec at + * err - optional pointer to error struct. filled in if error occurs and not NULL. + * RESULT + * XMLRPC_VALUE - newly created value, or NULL if fatal error. + * BUGS + * Currently does little or no validation of xml. + * Only parse errors are currently reported in err, not structural errors. + * SEE ALSO + * XMLRPC_ServerAddIntrospectionData () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_IntrospectionCreateDescription(const char* xml, XMLRPC_ERROR err) { + XMLRPC_VALUE xReturn = NULL; + xml_element* root = xml_elem_parse_buf(xml, 0, 0, err ? &err->xml_elem_error : NULL); + + if(root) { + xReturn = xml_element_to_method_description(root, err); + + xml_elem_free(root); + } + + return xReturn; + +} +/*******/ + + +/****f* SERVER/XMLRPC_ServerAddIntrospectionData + * NAME + * XMLRPC_ServerAddIntrospectionData + * SYNOPSIS + * int XMLRPC_ServerAddIntrospectionData(XMLRPC_SERVER server, XMLRPC_VALUE desc) + * FUNCTION + * updates server with additional introspection data + * INPUTS + * server - target server + * desc - introspection data, should be a struct generated by + * XMLRPC_IntrospectionCreateDescription () + * RESULT + * int - 1 if success, else 0 + * NOTES + * - function will fail if neither typeList nor methodList key is present in struct. + * - if method or type already exists, it will be replaced. + * - desc is never freed by the server. caller is responsible for cleanup. + * BUGS + * - horribly slow lookups. prime candidate for hash improvements. + * - uglier and more complex than I like to see for API functions. + * SEE ALSO + * XMLRPC_ServerAddIntrospectionData () + * XMLRPC_ServerRegisterIntrospectionCallback () + * XMLRPC_CleanupValue () + * SOURCE + */ +int XMLRPC_ServerAddIntrospectionData(XMLRPC_SERVER server, XMLRPC_VALUE desc) { + int bSuccess = 0; + if(server && desc) { + XMLRPC_VALUE xNewTypes = XMLRPC_VectorGetValueWithID(desc, "typeList"); + XMLRPC_VALUE xNewMethods = XMLRPC_VectorGetValueWithID(desc, "methodList"); + XMLRPC_VALUE xServerTypes = XMLRPC_VectorGetValueWithID(server->xIntrospection, "typeList"); + + if(xNewMethods) { + XMLRPC_VALUE xMethod = XMLRPC_VectorRewind(xNewMethods); + + while(xMethod) { + const char* name = XMLRPC_VectorGetStringWithID(xMethod, xi_token_name); + server_method* sm = find_method(server, name); + + if(sm) { + if(sm->desc) { + XMLRPC_CleanupValue(sm->desc); + } + sm->desc = XMLRPC_CopyValue(xMethod); + bSuccess = 1; + } + + xMethod = XMLRPC_VectorNext(xNewMethods); + } + } + if(xNewTypes) { + if(!xServerTypes) { + if(!server->xIntrospection) { + server->xIntrospection = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + } + + XMLRPC_AddValueToVector(server->xIntrospection, xNewTypes); + bSuccess = 1; + } + else { + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(xNewTypes); + while(xIter) { + /* get rid of old values */ + XMLRPC_VALUE xPrev = find_named_value(xServerTypes, XMLRPC_VectorGetStringWithID(xIter, xi_token_name)); + if(xPrev) { + XMLRPC_VectorRemoveValue(xServerTypes, xPrev); + } + XMLRPC_AddValueToVector(xServerTypes, xIter); + bSuccess = 1; + xIter = XMLRPC_VectorNext(xNewTypes); + } + } + } + } + return bSuccess; +} +/*******/ + + +/****f* SERVER/XMLRPC_ServerRegisterIntrospectionCallback + * NAME + * XMLRPC_ServerRegisterIntrospectionCallback + * SYNOPSIS + * int XMLRPC_ServerRegisterIntrospectionCallback(XMLRPC_SERVER server, XMLRPC_IntrospectionCallback cb) + * FUNCTION + * registers a callback for lazy generation of introspection data + * INPUTS + * server - target server + * cb - callback that will generate introspection data + * RESULT + * int - 1 if success, else 0 + * NOTES + * parsing xml and generating introspection data is fairly expensive, thus a + * server may wish to wait until this data is actually requested before generating + * it. Any number of callbacks may be registered at any time. A given callback + * will only ever be called once, the first time an introspection request is + * processed after the time of callback registration. + * SEE ALSO + * XMLRPC_ServerAddIntrospectionData () + * XMLRPC_IntrospectionCreateDescription () + * SOURCE + */ +int XMLRPC_ServerRegisterIntrospectionCallback(XMLRPC_SERVER server, XMLRPC_IntrospectionCallback cb) { + int bSuccess = 0; + if(server && cb) { + + doc_method* dm = calloc(1, sizeof(doc_method)); + + if(dm) { + dm->method = cb; + dm->b_called = 0; + + if(Q_PushTail(&server->docslist, dm)) { + bSuccess = 1; + } + else { + my_free(dm); + } + } + } + return 0; +} +/*******/ + +/*-********************** +* End Introspection API * +************************/ + + + diff --git a/php/xmlrpc/libxmlrpc/xmlrpc_introspection.h b/php/xmlrpc/libxmlrpc/xmlrpc_introspection.h new file mode 100644 index 0000000..656e441 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc_introspection.h @@ -0,0 +1,101 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* IMPORTANT! + * + * only public (official API) things should be in this file. Anything else + * should go in _private.h, or in the appropriate .c file. + */ + + +#ifndef __XI_INTROSPECTION_H +/* + * Avoid include redundancy. + */ +#define __XI_INTROSPECTION_H + +/*---------------------------------------------------------------------------- + * xmlrpc_introspection.h + * + * Purpose: + * define public introspection API + * Comments: + */ + +/*---------------------------------------------------------------------------- + * Constants + */ + #define xi_token_params "params" + #define xi_token_returns "returns" + #define xi_token_related "related" + #define xi_token_sub "sub" + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ + + /****d* VALUE/XMLRPC_IntrospectionCallback + * NAME + * XMLRPC_IntrospectionCallback + * NOTES + * Function prototype for lazy documentation generation (not generated until requested). + * SOURCE + */ +typedef void (*XMLRPC_IntrospectionCallback)(XMLRPC_SERVER server, void* userData); +/******/ + + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +XMLRPC_VALUE XMLRPC_IntrospectionCreateDescription(const char* xml, XMLRPC_ERROR error); +int XMLRPC_ServerAddIntrospectionData(XMLRPC_SERVER server, XMLRPC_VALUE desc); +int XMLRPC_ServerRegisterIntrospectionCallback(XMLRPC_SERVER server, XMLRPC_IntrospectionCallback cb); + +/*---------------------------------------------------------------------------- + * Macros + */ + + +#endif /* __XI_INTROSPECTION_H */ + + + diff --git a/php/xmlrpc/libxmlrpc/xmlrpc_introspection_private.h b/php/xmlrpc/libxmlrpc/xmlrpc_introspection_private.h new file mode 100644 index 0000000..7b97fa7 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc_introspection_private.h @@ -0,0 +1,106 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Dan Libby, Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* IMPORTANT! + * + * only non-public things should be in this file. It is fine for any .c file + * in xmlrpc/src to include it, but users of the public API should never + * include it, and thus *.h files that are part of the public API should + * never include it, or they would break if this file is not present. + */ + + +#ifndef __XI_INTROSPECTION_PRIVATE_H +/* + * Avoid include redundancy. + */ +#define __XI_INTROSPECTION_PRIVATE_H + +/*---------------------------------------------------------------------------- + * xmlrpc_introspection_private.h + * + * Purpose: + * define non-public introspection routines + * Comments: + */ + +/*---------------------------------------------------------------------------- + * Constants + */ +#define xi_token_default "default" +#define xi_token_description "description" +#define xi_token_name "name" +#define xi_token_optional "optional" +#define xi_token_params "params" +#define xi_token_purpose "purpose" +#define xi_token_returns "returns" +#define xi_token_signatures "signatures" +#define xi_token_type "type" +#define xi_token_version "version" +#define xi_token_empty "" +#define xi_token_system_describe_methods "system.describeMethods" +#define xi_token_system_list_methods "system.listMethods" +#define xi_token_system_method_help "system.methodHelp" +#define xi_token_system_method_signature "system.methodSignature" + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ +typedef struct _doc_method { + XMLRPC_IntrospectionCallback method; + int b_called; +} doc_method; + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +void xi_register_system_methods(XMLRPC_SERVER server); + +/*---------------------------------------------------------------------------- + * Macros + */ + + +#endif /* __XI_INTROSPECTION_PRIVATE_H */ + + + + diff --git a/php/xmlrpc/libxmlrpc/xmlrpc_private.h b/php/xmlrpc/libxmlrpc/xmlrpc_private.h new file mode 100644 index 0000000..65c6b13 --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc_private.h @@ -0,0 +1,178 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* only non-public things should be in this file. It is fine for any .c file + * in xmlrpc/src to include it, but users of the public API should never + * include it, and thus *.h files that are part of the public API should + * never include it, or they would break if this file is not present. + */ + +#ifndef XMLRPC_PRIVATE_ALREADY_INCLUDED +/* + * Avoid include redundancy. + */ +#define XMLRPC_PRIVATE_ALREADY_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + + +/*---------------------------------------------------------------------------- + * xmlrpc_private.h + * + * Purpose: + * define non-public intra-library routines & data + * Comments: + */ + +/*---------------------------------------------------------------------------- + * Constants + */ + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ + +/* Some of these are typedef'd in xmlrpc.h for public use */ + +typedef struct _xmlrpc_vector* XMLRPC_VECTOR; + +/****s* VALUE/XMLRPC_VALUE + * NAME + * XMLRPC_VALUE + * NOTES + * A value of variable data type. The most important object in this API. :) + * + * This struct is opaque to callers and should be accessed only via accessor functions. + * SEE ALSO + * XMLRPC_REQUEST + * XMLRPC_CreateValueEmpty () + * XMLRPC_CleanupValue () + * SOURCE + */ +typedef struct _xmlrpc_value { + XMLRPC_VALUE_TYPE type; /* data type of this value */ + XMLRPC_VECTOR v; /* vector type specific info */ + simplestring str; /* string value buffer */ + simplestring id; /* id of this value. possibly empty. */ + int i; /* integer value. */ + double d; /* double value */ + int iRefCount; /* So we know when we can delete the value . */ +} STRUCT_XMLRPC_VALUE; +/******/ + +/****s* VALUE/XMLRPC_REQUEST + * NAME + * XMLRPC_REQUEST + * NOTES + * Internal representation of an XML request. + * + * This struct is opaque to callers and should be accessed only via accessor functions. + * + * SEE ALSO + * XMLRPC_VALUE + * XMLRPC_RequestNew () + * XMLRPC_RequestFree () + * SOURCE + */ +typedef struct _xmlrpc_request { + XMLRPC_VALUE io; /* data associated with this request */ + simplestring methodName; /* name of method being called */ + XMLRPC_REQUEST_TYPE request_type; /* type of request */ + STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS output; /* xml output options */ + XMLRPC_VALUE error; /* error codes */ +} STRUCT_XMLRPC_REQUEST; +/******/ + +/* Vector type. Used by XMLRPC_VALUE. Never visible to users of the API. */ +typedef struct _xmlrpc_vector { + XMLRPC_VECTOR_TYPE type; /* vector type */ + queue *q; /* list of child values */ +} STRUCT_XMLRPC_VECTOR; +/******/ + +/****s* VALUE/XMLRPC_SERVER + * NAME + * XMLRPC_SERVER + * NOTES + * internal representation of an xmlrpc server + * + * This struct is opaque to callers and should be accessed only via accessor functions. + * + * SEE ALSO + * XMLRPC_ServerCreate () + * XMLRPC_ServerDestroy () + * SOURCE + */ +typedef struct _xmlrpc_server { + queue methodlist; /* list of callback methods */ + queue docslist; /* list of introspection callbacks */ + XMLRPC_VALUE xIntrospection; +} STRUCT_XMLRPC_SERVER; +/******/ + +typedef struct _server_method { + char* name; + XMLRPC_VALUE desc; + XMLRPC_Callback method; +} server_method; + + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +server_method* find_method(XMLRPC_SERVER server, const char* name); +const char* type_to_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype); + +/*---------------------------------------------------------------------------- + * Macros + */ +#define my_free(thing) if(thing) {free(thing); thing = 0;} + + +#ifdef __cplusplus +} +#endif + + +#endif /* XMLRPC_PRIVATE_ALREADY_INCLUDED */ + diff --git a/php/xmlrpc/libxmlrpc/xmlrpc_win32.h b/php/xmlrpc/libxmlrpc/xmlrpc_win32.h new file mode 100644 index 0000000..58c54bb --- /dev/null +++ b/php/xmlrpc/libxmlrpc/xmlrpc_win32.h @@ -0,0 +1,11 @@ +#ifndef _XMLRPC_WIN32_H +#define _XMLRPC_WIN32_H +/* just some things needed to compile win32 */ +#include +#include +#define inline __inline +#define snprintf _snprintf +#define strcasecmp(s1, s2) stricmp(s1, s2) + + +#endif \ No newline at end of file diff --git a/php/xmlrpc/php_xmlrpc.h b/php/xmlrpc/php_xmlrpc.h new file mode 100644 index 0000000..b56f844 --- /dev/null +++ b/php/xmlrpc/php_xmlrpc.h @@ -0,0 +1,132 @@ +/* + This file is part of, or distributed with, libXMLRPC - a C library for + xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* auto-generated portions of this file are also subject to the php license */ + +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2004 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Dan Libby | + +----------------------------------------------------------------------+ + */ + +/* $Id: php_xmlrpc.h,v 1.10 2004/01/08 17:33:00 sniper Exp $ */ + +#ifndef _PHP_XMLRPC_H +#define _PHP_XMLRPC_H + +/* You should tweak config.m4 so this symbol (or some else suitable) + gets defined. +*/ +#if 1 /* HAVE_XMLRPC */ + +extern zend_module_entry xmlrpc_module_entry; +#define phpext_xmlrpc_ptr &xmlrpc_module_entry + +#ifdef PHP_WIN32 +#define PHP_XMLRPC_API __declspec(dllexport) +#else +#define PHP_XMLRPC_API +#endif + +PHP_MINIT_FUNCTION(xmlrpc); +PHP_MSHUTDOWN_FUNCTION(xmlrpc); +PHP_RINIT_FUNCTION(xmlrpc); +PHP_RSHUTDOWN_FUNCTION(xmlrpc); +PHP_MINFO_FUNCTION(xmlrpc); + +PHP_FUNCTION(xmlrpc_encode); +PHP_FUNCTION(xmlrpc_decode); +PHP_FUNCTION(xmlrpc_decode_request); +PHP_FUNCTION(xmlrpc_encode_request); +PHP_FUNCTION(xmlrpc_get_type); +PHP_FUNCTION(xmlrpc_set_type); +PHP_FUNCTION(xmlrpc_is_fault); +PHP_FUNCTION(xmlrpc_server_create); +PHP_FUNCTION(xmlrpc_server_destroy); +PHP_FUNCTION(xmlrpc_server_register_method); +PHP_FUNCTION(xmlrpc_server_call_method); +PHP_FUNCTION(xmlrpc_parse_method_descriptions); +PHP_FUNCTION(xmlrpc_server_add_introspection_data); +PHP_FUNCTION(xmlrpc_server_register_introspection_callback); + +/* Fill in this structure and use entries in it + for thread safety instead of using true globals. +*/ +ZEND_BEGIN_MODULE_GLOBALS(xmlrpc) + long allow_null; +ZEND_END_MODULE_GLOBALS(xmlrpc) + +/* In every function that needs to use variables in zend_xmlrpc_globals, + do call XMLRPCLS_FETCH(); after declaring other variables used by + that function, and always refer to them as XMLRPCG(variable). + You are encouraged to rename these macros something shorter, see + examples in any other php module directory. +*/ + +#ifdef ZTS +#define XMLRPCG(v) TSRMG(xmlrpc_globals_id, zend_xmlrpc_globals *, v) +#define XMLRPCLS_FETCH() zend_xmlrpc_globals *xmlrpc_globals = ts_resource(xmlrpc_globals_id) +#else +#define XMLRPCG(v) (xmlrpc_globals.v) +#define XMLRPCLS_FETCH() +#endif + +ZEND_EXTERN_MODULE_GLOBALS(xmlrpc) + +#else + +#define phpext_xmlrpc_ptr NULL + +#endif + +#endif /* _PHP_XMLRPC_H */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ diff --git a/php/xmlrpc/xmlrpc-epi-php.c b/php/xmlrpc/xmlrpc-epi-php.c new file mode 100644 index 0000000..7e19c7e --- /dev/null +++ b/php/xmlrpc/xmlrpc-epi-php.c @@ -0,0 +1,1528 @@ +/* + This file is part of, or distributed with, libXMLRPC - a C library for + xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* auto-generated portions of this file are also subject to the php license */ + +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2004 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Dan Libby | + +----------------------------------------------------------------------+ + */ + +/* $Id: xmlrpc-epi-php.c,v 1.37 2004/01/08 08:17:47 andi Exp $ */ + +/********************************************************************** +* BUGS: * +* - when calling a php user function, there appears to be no way to * +* distinguish between a return value of null, and no return value * +* at all. The xml serialization layer(s) will then return a value * +* of null, when the right thing may be no value at all. (SOAP) * +**********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "ext/standard/info.h" +#include "php_ini.h" +#include "php_xmlrpc.h" +#include "xmlrpc.h" + +#define PHP_EXT_VERSION "0.51" + +/* You should tweak config.m4 so this symbol (or some else suitable) + gets defined. */ + +ZEND_DECLARE_MODULE_GLOBALS(xmlrpc) + +static int le_xmlrpc_server; + +function_entry xmlrpc_functions[] = { + PHP_FE(xmlrpc_encode, NULL) + PHP_FE(xmlrpc_decode, NULL) + PHP_FE(xmlrpc_decode_request, second_arg_force_ref) + PHP_FE(xmlrpc_encode_request, NULL) + PHP_FE(xmlrpc_get_type, NULL) + PHP_FE(xmlrpc_set_type, first_arg_force_ref) + PHP_FE(xmlrpc_is_fault, NULL) + PHP_FE(xmlrpc_server_create, NULL) + PHP_FE(xmlrpc_server_destroy, NULL) + PHP_FE(xmlrpc_server_register_method, NULL) + PHP_FE(xmlrpc_server_call_method, NULL) + PHP_FE(xmlrpc_parse_method_descriptions, NULL) + PHP_FE(xmlrpc_server_add_introspection_data, NULL) + PHP_FE(xmlrpc_server_register_introspection_callback, NULL) + {NULL, NULL, NULL} +}; + +zend_module_entry xmlrpc_module_entry = { + STANDARD_MODULE_HEADER, + "xmlrpc", + xmlrpc_functions, + PHP_MINIT(xmlrpc), + PHP_MSHUTDOWN(xmlrpc), + PHP_RINIT(xmlrpc), /* Replace with NULL if there's nothing to do at request start */ + PHP_RSHUTDOWN(xmlrpc), /* Replace with NULL if there's nothing to do at request end */ + PHP_MINFO(xmlrpc), + PHP_EXT_VERSION, + STANDARD_MODULE_PROPERTIES +}; + +#ifdef COMPILE_DL_XMLRPC +ZEND_GET_MODULE(xmlrpc) +# ifdef PHP_WIN32 +# include "zend_arg_defs.c" +# endif +#endif + +PHP_INI_BEGIN() +STD_PHP_INI_BOOLEAN("xmlrpc.allow_null", "0", PHP_INI_ALL, OnUpdateBool, allow_null, zend_xmlrpc_globals, xmlrpc_globals) +PHP_INI_END() + +static void php_xmlrpc_init_globals(zend_xmlrpc_globals *xmlrpc_globals) +{ + memset(xmlrpc_globals, 0, sizeof(zend_xmlrpc_globals)); +} + +/******************************* +* local structures and defines * +*******************************/ + +/* per server data */ +typedef struct _xmlrpc_server_data { + zval* method_map; + zval* introspection_map; + XMLRPC_SERVER server_ptr; +} xmlrpc_server_data; + + +/* how to format output */ +typedef struct _php_output_options { + int b_php_out; + int b_auto_version; + int b_allow_null; + STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS xmlrpc_out; +} php_output_options; + +/* data passed to C callback */ +typedef struct _xmlrpc_callback_data { + zval* xmlrpc_method; + zval* php_function; + zval* caller_params; + zval* return_data; + xmlrpc_server_data* server; + char php_executed; +} xmlrpc_callback_data; + +/* output options */ +#define OUTPUT_TYPE_KEY "output_type" +#define OUTPUT_TYPE_KEY_LEN (sizeof(OUTPUT_TYPE_KEY) - 1) +#define OUTPUT_TYPE_VALUE_PHP "php" +#define OUTPUT_TYPE_VALUE_XML "xml" + +#define ALLOW_NULL_KEY "allow_null" +#define ALLOW_NULL_KEY_LEN (sizeof(ALLOW_NULL_KEY) - 1) + +#define VERBOSITY_KEY "verbosity" +#define VERBOSITY_KEY_LEN (sizeof(VERBOSITY_KEY) - 1) +#define VERBOSITY_VALUE_NO_WHITE_SPACE "no_white_space" +#define VERBOSITY_VALUE_NEWLINES_ONLY "newlines_only" +#define VERBOSITY_VALUE_PRETTY "pretty" + +#define ESCAPING_KEY "escaping" +#define ESCAPING_KEY_LEN (sizeof(ESCAPING_KEY) - 1) +#define ESCAPING_VALUE_CDATA "cdata" +#define ESCAPING_VALUE_NON_ASCII "non-ascii" +#define ESCAPING_VALUE_NON_PRINT "non-print" +#define ESCAPING_VALUE_MARKUP "markup" + +#define VERSION_KEY "version" +#define VERSION_KEY_LEN (sizeof(VERSION_KEY) - 1) +#define VERSION_VALUE_SIMPLE "simple" +#define VERSION_VALUE_XMLRPC "xmlrpc" +#define VERSION_VALUE_SOAP11 "soap 1.1" +#define VERSION_VALUE_AUTO "auto" + +#define ENCODING_KEY "encoding" +#define ENCODING_KEY_LEN (sizeof(ENCODING_KEY) - 1) +#define ENCODING_DEFAULT "iso-8859-1" + +/* value types */ +#define OBJECT_TYPE_ATTR "xmlrpc_type" +#define OBJECT_VALUE_ATTR "scalar" +#define OBJECT_VALUE_TS_ATTR "timestamp" + +/* faults */ +#define FAULT_CODE "faultCode" +#define FAULT_CODE_LEN (sizeof(FAULT_CODE) - 1) +#define FAULT_STRING "faultString" +#define FAULT_STRING_LEN (sizeof(FAULT_STRING) - 1) + +/*********************** +* forward declarations * +***********************/ +XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(php_output_options* out, zval* value, zval** newvalue); +static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data); +int sset_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE type); +zval* decode_request_worker(zval* xml_in, zval* encoding_in, zval* method_name_out); +const char* xmlrpc_type_as_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype); +XMLRPC_VALUE_TYPE xmlrpc_str_as_type(const char* str); +XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str); +int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE type); + +/********************* +* startup / shutdown * +*********************/ + +static void destroy_server_data(xmlrpc_server_data *server) +{ + if (server) { + XMLRPC_ServerDestroy(server->server_ptr); + + zval_dtor(server->method_map); + FREE_ZVAL(server->method_map); + + zval_dtor(server->introspection_map); + FREE_ZVAL(server->introspection_map); + + efree(server); + } +} + +/* called when server is being destructed. either when xmlrpc_server_destroy + * is called, or when request ends. */ +static void xmlrpc_server_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC) +{ + if (rsrc && rsrc->ptr) { + destroy_server_data((xmlrpc_server_data*) rsrc->ptr); + } +} + +/* module init */ +PHP_MINIT_FUNCTION(xmlrpc) +{ + ZEND_INIT_MODULE_GLOBALS(xmlrpc, php_xmlrpc_init_globals, NULL); + + REGISTER_INI_ENTRIES(); + + le_xmlrpc_server = zend_register_list_destructors_ex(xmlrpc_server_destructor, NULL, "xmlrpc server", module_number); + + return SUCCESS; +} + +/* module shutdown */ +PHP_MSHUTDOWN_FUNCTION(xmlrpc) +{ + return SUCCESS; +} + +/* Remove if there's nothing to do at request start */ +PHP_RINIT_FUNCTION(xmlrpc) +{ + return SUCCESS; +} + +/* Remove if there's nothing to do at request end */ +PHP_RSHUTDOWN_FUNCTION(xmlrpc) +{ + return SUCCESS; +} + +/* display info in phpinfo() */ +PHP_MINFO_FUNCTION(xmlrpc) +{ + php_info_print_table_start(); + php_info_print_table_row(2, "core library version", XMLRPC_GetVersionString()); + php_info_print_table_row(2, "php extension version", PHP_EXT_VERSION); + php_info_print_table_row(2, "author", "Dan Libby"); + php_info_print_table_row(2, "homepage", "http://xmlrpc-epi.sourceforge.net"); + php_info_print_table_row(2, "open sourced by", "Epinions.com"); + php_info_print_table_end(); +} + +/******************* +* random utilities * +*******************/ + +/* Utility functions for adding data types to arrays, with or without key (assoc, non-assoc). + * Could easily be further generalized to work with objects. + */ +#if 0 +static int add_long(zval* list, char* id, int num) { + if(id) return add_assoc_long(list, id, num); + else return add_next_index_long(list, num); +} + +static int add_double(zval* list, char* id, double num) { + if(id) return add_assoc_double(list, id, num); + else return add_next_index_double(list, num); +} + +static int add_string(zval* list, char* id, char* string, int duplicate) { + if(id) return add_assoc_string(list, id, string, duplicate); + else return add_next_index_string(list, string, duplicate); +} + +static int add_stringl(zval* list, char* id, char* string, uint length, int duplicate) { + if(id) return add_assoc_stringl(list, id, string, length, duplicate); + else return add_next_index_stringl(list, string, length, duplicate); +} + +#endif + +static int add_zval(zval* list, const char* id, zval** val) +{ + if (list && val) { + if (id) { + return zend_hash_update(Z_ARRVAL_P(list), (char*) id, strlen(id) + 1, (void *) val, sizeof(zval **), NULL); + } else { + return zend_hash_next_index_insert(Z_ARRVAL_P(list), (void *) val, sizeof(zval **), NULL); + } + } + /* what is the correct return on error? */ + return 0; +} + +#define my_zend_hash_get_current_key(ht, my_key, num_index) zend_hash_get_current_key(ht, my_key, num_index, 0) + + +/************************* +* input / output options * +*************************/ + +/* parse an array (user input) into output options suitable for use by xmlrpc engine + * and determine whether to return data as xml or php vars */ +static void set_output_options(php_output_options* options, zval* output_opts) +{ + XMLRPCLS_FETCH(); + + if (options) { + + /* defaults */ + options->b_php_out = 0; + options->b_auto_version = 1; + options->b_allow_null = 0; + options->xmlrpc_out.version = xmlrpc_version_1_0; + options->xmlrpc_out.xml_elem_opts.encoding = ENCODING_DEFAULT; + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_pretty; + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping | xml_elem_non_ascii_escaping | xml_elem_non_print_escaping; + + if (output_opts && Z_TYPE_P(output_opts) == IS_ARRAY) { + zval** val; + + /* marshal NULL */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), ALLOW_NULL_KEY, ALLOW_NULL_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_BOOL) { + if (Z_LVAL_PP(val)) { + options->b_allow_null = 1; + } else { + options->b_allow_null = 0; + } + } + } + + /* type of output (xml/php) */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), OUTPUT_TYPE_KEY, OUTPUT_TYPE_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_STRING) { + if (!strcmp(Z_STRVAL_PP(val), OUTPUT_TYPE_VALUE_PHP)) { + options->b_php_out = 1; + } else if (!strcmp(Z_STRVAL_PP(val), OUTPUT_TYPE_VALUE_XML)) { + options->b_php_out = 0; + } + } + } + + /* verbosity of generated xml */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), VERBOSITY_KEY, VERBOSITY_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_STRING) { + if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_NO_WHITE_SPACE)) { + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_no_white_space; + } else if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_NEWLINES_ONLY)) { + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_newlines_only; + } else if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_PRETTY)) { + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_pretty; + } + } + } + + /* version of xml to output */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), VERSION_KEY, VERSION_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_STRING) { + options->b_auto_version = 0; + if (!strcmp(Z_STRVAL_PP(val), VERSION_VALUE_XMLRPC)) { + options->xmlrpc_out.version = xmlrpc_version_1_0; + } else if (!strcmp(Z_STRVAL_PP(val), VERSION_VALUE_SIMPLE)) { + options->xmlrpc_out.version = xmlrpc_version_simple; + } else if (!strcmp((*val)->value.str.val, VERSION_VALUE_SOAP11)) { + options->xmlrpc_out.version = xmlrpc_version_soap_1_1; + } else { /* if(!strcmp((*val)->value.str.val, VERSION_VALUE_AUTO)) { */ + options->b_auto_version = 1; + } + } + } + + /* encoding code set */ + if(zend_hash_find(Z_ARRVAL_P(output_opts), + ENCODING_KEY, ENCODING_KEY_LEN + 1, + (void**)&val) == SUCCESS) { + if(Z_TYPE_PP(val) == IS_STRING) { + options->xmlrpc_out.xml_elem_opts.encoding = estrdup(Z_STRVAL_PP(val)); + } + } + + /* escaping options */ + if(zend_hash_find(Z_ARRVAL_P(output_opts), + ESCAPING_KEY, ESCAPING_KEY_LEN + 1, + (void**)&val) == SUCCESS) { + /* multiple values allowed. check if array */ + if(Z_TYPE_PP(val) == IS_ARRAY) { + zval** iter_val; + zend_hash_internal_pointer_reset(Z_ARRVAL_PP(val)); + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_no_escaping; + while(1) { + if(zend_hash_get_current_data(Z_ARRVAL_PP(val), (void**)&iter_val) == SUCCESS) { + if(Z_TYPE_PP(iter_val) == IS_STRING && Z_STRVAL_PP(iter_val)) { + if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_CDATA)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_cdata_escaping; + } + else if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_ASCII)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_ascii_escaping; + } + else if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_PRINT)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_print_escaping; + } + else if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_MARKUP)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_markup_escaping; + } + } + } + else { + break; + } + + zend_hash_move_forward(Z_ARRVAL_PP(val)); + } + } + /* else, check for single value */ + else if(Z_TYPE_PP(val) == IS_STRING) { + if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_CDATA)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_cdata_escaping; + } + else if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_NON_ASCII)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_ascii_escaping; + } + else if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_NON_PRINT)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_print_escaping; + } + else if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_MARKUP)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping; + } + } + } + } + } +} + + +/****************** +* encode / decode * +******************/ + +/* php arrays have no distinction between array and struct types. + * they even allow mixed. Thus, we determine the type by iterating + * through the entire array and figuring out each element. + * room for some optimation here if we stop after a specific # of elements. + */ +static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) +{ + int bArray = 0, bStruct = 0, bMixed = 0; + unsigned long num_index; + char* my_key; + + zend_hash_internal_pointer_reset(ht); + while(1) { + int res = my_zend_hash_get_current_key(ht, &my_key, &num_index); + if(res == HASH_KEY_IS_LONG) { + if(bStruct) { + bMixed = 1; + break; + } + bArray = 1; + } + else if(res == HASH_KEY_NON_EXISTANT) { + break; + } + else if(res == HASH_KEY_IS_STRING) { + if(bArray) { + bMixed = 1; + break; + } + bStruct = 1; + } + + zend_hash_move_forward(ht); + } + return bMixed ? xmlrpc_vector_mixed : (bStruct ? xmlrpc_vector_struct : xmlrpc_vector_array); +} + +/* recursively convert php values into xmlrpc values */ +static XMLRPC_VALUE PHP_to_XMLRPC_worker (php_output_options* out, const char* key, zval* in_val, int depth) +{ + XMLRPC_VALUE xReturn = NULL; + if(in_val) { + zval* val = NULL; + XMLRPC_VALUE_TYPE type = get_zval_xmlrpc_type(out, in_val, &val); + if(val) { + switch(type) { + case xmlrpc_nil: + xReturn = XMLRPC_CreateValueEmpty(); + XMLRPC_SetValueID(xReturn, key, 0); + break; + case xmlrpc_base64: + xReturn = XMLRPC_CreateValueBase64(key, Z_STRVAL_P(val), Z_STRLEN_P(val)); + break; + case xmlrpc_datetime: + convert_to_string(val); + xReturn = XMLRPC_CreateValueDateTime_ISO8601(key, Z_STRVAL_P(val)); + break; + case xmlrpc_boolean: + convert_to_boolean(val); + xReturn = XMLRPC_CreateValueBoolean(key, Z_LVAL_P(val)); + break; + case xmlrpc_int: + convert_to_long(val); + xReturn = XMLRPC_CreateValueInt(key, Z_LVAL_P(val)); + break; + case xmlrpc_double: + convert_to_double(val); + xReturn = XMLRPC_CreateValueDouble(key, Z_DVAL_P(val)); + break; + case xmlrpc_string: + convert_to_string(val); + xReturn = XMLRPC_CreateValueString(key, Z_STRVAL_P(val), Z_STRLEN_P(val)); + break; + case xmlrpc_vector: + { + unsigned long num_index; + zval** pIter; + char* my_key; + + convert_to_array(val); + + xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val))); + + zend_hash_internal_pointer_reset(Z_ARRVAL_P(val)); + while(1) { + int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val), &my_key, &num_index); + if(res == HASH_KEY_IS_LONG) { + if(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) { + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(out, 0, *pIter, depth++)); + } + } + else if(res == HASH_KEY_NON_EXISTANT) { + break; + } + else if(res == HASH_KEY_IS_STRING) { + if(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) { + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(out, my_key, *pIter, depth++)); + } + } + + zend_hash_move_forward(Z_ARRVAL_P(val)); + } + } + break; + default: + break; + } + } + } + return xReturn; +} + +static XMLRPC_VALUE PHP_to_XMLRPC(php_output_options* out, zval* root_val) +{ + return PHP_to_XMLRPC_worker(out, NULL, root_val, 0); +} + +/* recursively convert xmlrpc values into php values */ +static zval* XMLRPC_to_PHP(XMLRPC_VALUE el) +{ + zval* elem = NULL; + const char* pStr; + + if(el) { + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(el); + + MAKE_STD_ZVAL(elem); /* init. very important. spent a frustrating day finding this out. */ + + switch(type) { + case xmlrpc_empty: + case xmlrpc_nil: + Z_TYPE_P(elem) = IS_NULL; + break; + case xmlrpc_string: + pStr = XMLRPC_GetValueString(el); + if(pStr) { + Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); + Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem)); + Z_TYPE_P(elem) = IS_STRING; + } + break; + case xmlrpc_int: + Z_LVAL_P(elem) = XMLRPC_GetValueInt(el); + Z_TYPE_P(elem) = IS_LONG; + break; + case xmlrpc_boolean: + Z_LVAL_P(elem) = XMLRPC_GetValueBoolean(el); + Z_TYPE_P(elem) = IS_BOOL; + break; + case xmlrpc_double: + Z_DVAL_P(elem) = XMLRPC_GetValueDouble(el); + Z_TYPE_P(elem) = IS_DOUBLE; + break; + case xmlrpc_datetime: + Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); + Z_STRVAL_P(elem) = estrndup(XMLRPC_GetValueDateTime_ISO8601(el), Z_STRLEN_P(elem)); + Z_TYPE_P(elem) = IS_STRING; + break; + case xmlrpc_base64: + pStr = XMLRPC_GetValueBase64(el); + if(pStr) { + Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); + Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem)); + Z_TYPE_P(elem) = IS_STRING; + } + break; + case xmlrpc_vector: + array_init(elem); + { + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(el); + + while( xIter ) { + zval *val = XMLRPC_to_PHP(xIter); + if (val) { + add_zval(elem, XMLRPC_GetValueID(xIter), &val); + } + xIter = XMLRPC_VectorNext(el); + } + } + break; + default: + break; + } + set_zval_xmlrpc_type(elem, type); + } + return elem; +} + +/* {{{ proto string xmlrpc_encode_request(string method, mixed params) + Generates XML for a method request */ +PHP_FUNCTION(xmlrpc_encode_request) +{ + XMLRPC_REQUEST xRequest = NULL; + zval **method, **vals, **out_opts; + char* outBuf; + php_output_options out; + + if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 3 || (zend_get_parameters_ex(ZEND_NUM_ARGS(), &method, &vals, &out_opts) == FAILURE)) { + WRONG_PARAM_COUNT; /* prints/logs a warning and returns */ + } + + set_output_options(&out, (ZEND_NUM_ARGS() == 3) ? *out_opts : 0); + + if(return_value_used) { + xRequest = XMLRPC_RequestNew(); + + if(xRequest) { + XMLRPC_RequestSetOutputOptions(xRequest, &out.xmlrpc_out); + if (Z_TYPE_PP(method) == IS_NULL) { + XMLRPC_RequestSetRequestType(xRequest, xmlrpc_request_response); + } else { + XMLRPC_RequestSetMethodName(xRequest, Z_STRVAL_PP(method)); + XMLRPC_RequestSetRequestType(xRequest, xmlrpc_request_call); + } + if (Z_TYPE_PP(vals) != IS_NULL) { + XMLRPC_RequestSetData(xRequest, PHP_to_XMLRPC(&out, *vals)); + } + + outBuf = XMLRPC_REQUEST_ToXML(xRequest, 0); + if(outBuf) { + RETVAL_STRING(outBuf, 1); + free(outBuf); + } + XMLRPC_RequestFree(xRequest, 1); + } + } +} +/* }}} */ + +/* {{{ proto string xmlrpc_encode(mixed value) + Generates XML for a PHP value */ +PHP_FUNCTION(xmlrpc_encode) +{ + XMLRPC_VALUE xOut = NULL; + zval **arg1; + char *outBuf; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + if( return_value_used ) { + /* convert native php type to xmlrpc type */ + xOut = PHP_to_XMLRPC(NULL, *arg1); + + /* generate raw xml from xmlrpc data */ + outBuf = XMLRPC_VALUE_ToXML(xOut, 0); + + if(xOut) { + if(outBuf) { + RETVAL_STRING(outBuf, 1); + free(outBuf); + } + /* cleanup */ + XMLRPC_CleanupValue(xOut); + } + } +} +/* }}} */ + + +zval* decode_request_worker (zval* xml_in, zval* encoding_in, zval* method_name_out) +{ + zval* retval = NULL; + XMLRPC_REQUEST response; + STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS opts = {{0}}; + opts.xml_elem_opts.encoding = encoding_in ? utf8_get_encoding_id_from_string(Z_STRVAL_P(encoding_in)) : ENCODING_DEFAULT; + + /* generate XMLRPC_REQUEST from raw xml */ + response = XMLRPC_REQUEST_FromXML(Z_STRVAL_P(xml_in), Z_STRLEN_P(xml_in), &opts); + if(response) { + /* convert xmlrpc data to native php types */ + retval = XMLRPC_to_PHP(XMLRPC_RequestGetData(response)); + + if(XMLRPC_RequestGetRequestType(response) == xmlrpc_request_call) { + if(method_name_out) { + convert_to_string(method_name_out); + Z_TYPE_P(method_name_out) = IS_STRING; + Z_STRVAL_P(method_name_out) = estrdup(XMLRPC_RequestGetMethodName(response)); + Z_STRLEN_P(method_name_out) = strlen(Z_STRVAL_P(method_name_out)); + } + } + + /* dust, sweep, and mop */ + XMLRPC_RequestFree(response, 1); + } + return retval; +} + +/* {{{ proto array xmlrpc_decode_request(string xml, string& method [, string encoding]) + Decodes XML into native PHP types */ +PHP_FUNCTION(xmlrpc_decode_request) +{ + zval **xml, **method, **encoding = NULL; + int argc = ZEND_NUM_ARGS(); + + if (argc < 2 || argc > 3 || (zend_get_parameters_ex(argc, &xml, &method, &encoding) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(xml); + convert_to_string_ex(method); + if(argc == 3) { + convert_to_string_ex(encoding); + } + + if(return_value_used) { + zval* retval = decode_request_worker(*xml, encoding ? *encoding : NULL, *method); + if(retval) { + *return_value = *retval; + FREE_ZVAL(retval); + } + } +} +/* }}} */ + + +/* {{{ proto array xmlrpc_decode(string xml [, string encoding]) + Decodes XML into native PHP types */ +PHP_FUNCTION(xmlrpc_decode) +{ + zval **arg1, **arg2 = NULL; + int argc = ZEND_NUM_ARGS(); + + if (argc < 1 || argc > 2 || (zend_get_parameters_ex(argc, &arg1, &arg2) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(arg1); + if(argc == 2) { + convert_to_string_ex(arg2); + } + + if(return_value_used) { + zval* retval = decode_request_worker(*arg1, arg2 ? *arg2 : NULL, NULL); + if(retval) { + *return_value = *retval; + FREE_ZVAL(retval); + } + } +} +/* }}} */ + + +/************************* +* server related methods * +*************************/ + +/* {{{ proto resource xmlrpc_server_create(void) + Creates an xmlrpc server */ +PHP_FUNCTION(xmlrpc_server_create) +{ + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if(return_value_used) { + zval *method_map, *introspection_map; + xmlrpc_server_data *server = emalloc(sizeof(xmlrpc_server_data)); + MAKE_STD_ZVAL(method_map); + MAKE_STD_ZVAL(introspection_map); + + array_init(method_map); + array_init(introspection_map); + + /* allocate server data. free'd in destroy_server_data() */ + server->method_map = method_map; + server->introspection_map = introspection_map; + server->server_ptr = XMLRPC_ServerCreate(); + + XMLRPC_ServerRegisterIntrospectionCallback(server->server_ptr, php_xmlrpc_introspection_callback); + + /* store for later use */ + ZEND_REGISTER_RESOURCE(return_value,server, le_xmlrpc_server); + } +} +/* }}} */ + +/* {{{ proto int xmlrpc_server_destroy(resource server) + Destroys server resources */ +PHP_FUNCTION(xmlrpc_server_destroy) +{ + zval **arg1; + int bSuccess = FAILURE; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + if(Z_TYPE_PP(arg1) == IS_RESOURCE) { + int type; + + xmlrpc_server_data *server = zend_list_find(Z_LVAL_PP(arg1), &type); + + if(server && type == le_xmlrpc_server) { + bSuccess = zend_list_delete(Z_LVAL_PP(arg1)); + + /* called by hashtable destructor + * destroy_server_data(server); + */ + } + } + RETVAL_LONG(bSuccess == SUCCESS); +} +/* }}} */ + + +/* called by xmlrpc C engine as method handler for all registered methods. + * it then calls the corresponding PHP function to handle the method. + */ +static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRequest, void* data) +{ + xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; + zval* xmlrpc_params; + zval* callback_params[3]; + TSRMLS_FETCH(); + + /* convert xmlrpc to native php types */ + xmlrpc_params = XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest)); + + /* setup data hoojum */ + callback_params[0] = pData->xmlrpc_method; + callback_params[1] = xmlrpc_params; + callback_params[2] = pData->caller_params; + + /* Use same C function for all methods */ + + /* php func prototype: function user_func($method_name, $xmlrpc_params, $user_params) */ + call_user_function(CG(function_table), NULL, pData->php_function, pData->return_data, 3, callback_params TSRMLS_CC); + + pData->php_executed = 1; + + zval_dtor(xmlrpc_params); + FREE_ZVAL(xmlrpc_params); + + return NULL; +} + +/* called by the C server when it first receives an introspection request. We pass this on to + * our PHP listeners, if any + */ +static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data) +{ + zval *retval_ptr, **php_function; + zval* callback_params[1]; + xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; + TSRMLS_FETCH(); + + MAKE_STD_ZVAL(retval_ptr); + Z_TYPE_P(retval_ptr) = IS_NULL; + + /* setup data hoojum */ + callback_params[0] = pData->caller_params; + + /* loop through and call all registered callbacks */ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(pData->server->introspection_map)); + while(1) { + if(zend_hash_get_current_data(Z_ARRVAL_P(pData->server->introspection_map), + (void**)&php_function) == SUCCESS) { + + /* php func prototype: function string user_func($user_params) */ + if(call_user_function(CG(function_table), NULL, *php_function, + retval_ptr, 1, callback_params TSRMLS_CC) == SUCCESS) { + XMLRPC_VALUE xData; + STRUCT_XMLRPC_ERROR err = {0}; + + /* return value should be a string */ + convert_to_string(retval_ptr); + + xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL_P(retval_ptr), &err); + + if(xData) { + if(!XMLRPC_ServerAddIntrospectionData(server, xData)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s(), improper element structure", Z_STRVAL_PP(php_function)); + } + XMLRPC_CleanupValue(xData); + } + else { + /* could not create description */ + if(err.xml_elem_error.parser_code) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to add introspection data returned from %s()", + err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error, Z_STRVAL_PP(php_function)); + } + else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", + Z_STRVAL_PP(php_function)); + } + } + } + else { + /* user func failed */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user introspection callback: %s()", Z_STRVAL_PP(php_function)); + } + } + else { + break; + } + + zend_hash_move_forward(Z_ARRVAL_P(pData->server->introspection_map)); + } + + /* so we don't call the same callbacks ever again */ + zend_hash_clean(Z_ARRVAL_P(pData->server->introspection_map)); +} + +/* {{{ proto bool xmlrpc_server_register_method(resource server, string method_name, string function) + Register a PHP function to handle method matching method_name */ +PHP_FUNCTION(xmlrpc_server_register_method) +{ + zval **method_key, **method_name, **handle, *method_name_save; + int type; + xmlrpc_server_data* server; + + if (ZEND_NUM_ARGS() != 3 || (zend_get_parameters_ex(3, &handle, &method_key, &method_name) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if(type == le_xmlrpc_server) { + /* register with C engine. every method just calls our standard callback, + * and it then dispatches to php as necessary + */ + if(XMLRPC_ServerRegisterMethod(server->server_ptr, Z_STRVAL_PP(method_key), php_xmlrpc_callback)) { + /* save for later use */ + MAKE_STD_ZVAL(method_name_save); + *method_name_save = **method_name; + zval_copy_ctor(method_name_save); + + /* register our php method */ + add_zval(server->method_map, Z_STRVAL_PP(method_key), &method_name_save); + + RETURN_BOOL(1); + } + } + RETURN_BOOL(0); +} +/* }}} */ + + +/* {{{ proto bool xmlrpc_server_register_introspection_callback(resource server, string function) + Register a PHP function to generate documentation */ +PHP_FUNCTION(xmlrpc_server_register_introspection_callback) +{ + zval **method_name, **handle, *method_name_save; + int type; + xmlrpc_server_data* server; + + if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &handle, &method_name) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if(type == le_xmlrpc_server) { + /* save for later use */ + MAKE_STD_ZVAL(method_name_save); + *method_name_save = **method_name; + zval_copy_ctor(method_name_save); + + /* register our php method */ + add_zval(server->introspection_map, NULL, &method_name_save); + + RETURN_BOOL(1); + } + RETURN_BOOL(0); +} +/* }}} */ + + +/* this function is itchin for a re-write */ + +/* {{{ proto mixed xmlrpc_server_call_method(resource server, string xml, mixed user_data [, array output_options]) + Parses XML requests and call methods */ +PHP_FUNCTION(xmlrpc_server_call_method) +{ + xmlrpc_callback_data data = {0}; + XMLRPC_REQUEST xRequest; + STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS input_opts; + xmlrpc_server_data* server; + zval **rawxml, **caller_params, **handle, **output_opts = NULL; + int type; + php_output_options out; + int argc =ZEND_NUM_ARGS(); + + if (argc < 3 || argc > 4 || (zend_get_parameters_ex(argc, &handle, &rawxml, &caller_params, &output_opts) != SUCCESS)) { + WRONG_PARAM_COUNT; + } + /* user output options */ + if (argc == 3) { + set_output_options(&out, NULL); + } + else { + set_output_options(&out, *output_opts); + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if(type == le_xmlrpc_server) { + /* HACK: use output encoding for now */ + input_opts.xml_elem_opts.encoding = utf8_get_encoding_id_from_string(out.xmlrpc_out.xml_elem_opts.encoding); + + /* generate an XMLRPC_REQUEST from the raw xml input */ + xRequest = XMLRPC_REQUEST_FromXML(Z_STRVAL_PP(rawxml), Z_STRLEN_PP(rawxml), &input_opts); + + if(xRequest) { + const char* methodname = XMLRPC_RequestGetMethodName(xRequest); + zval **php_function; + XMLRPC_VALUE xAnswer = NULL; + MAKE_STD_ZVAL(data.xmlrpc_method); /* init. very important. spent a frustrating day finding this out. */ + MAKE_STD_ZVAL(data.return_data); + Z_TYPE_P(data.return_data) = IS_NULL; /* in case value is never init'd, we don't dtor to think it is a string or something */ + Z_TYPE_P(data.xmlrpc_method) = IS_NULL; + + if (!methodname) { + methodname = ""; + } + + /* setup some data to pass to the callback function */ + Z_STRVAL_P(data.xmlrpc_method) = estrdup(methodname); + Z_STRLEN_P(data.xmlrpc_method) = strlen(methodname); + Z_TYPE_P(data.xmlrpc_method) = IS_STRING; + data.caller_params = *caller_params; + data.php_executed = 0; + data.server = server; + + /* check if the called method has been previous registered */ + if(zend_hash_find(Z_ARRVAL_P(server->method_map), + Z_STRVAL_P(data.xmlrpc_method), + Z_STRLEN_P(data.xmlrpc_method) + 1, + (void**)&php_function) == SUCCESS) { + + data.php_function = *php_function; + } + + /* We could just call the php method directly ourselves at this point, but we do this + * with a C callback in case the xmlrpc library ever implements some cool usage stats, + * or somesuch. + */ + xAnswer = XMLRPC_ServerCallMethod(server->server_ptr, xRequest, &data); + if(xAnswer && out.b_php_out) { + zval_dtor(data.return_data); + FREE_ZVAL(data.return_data); + data.return_data = XMLRPC_to_PHP(xAnswer); + } else if(data.php_executed && !out.b_php_out) { + xAnswer = PHP_to_XMLRPC(&out, data.return_data); + } + + /* should we return data as xml? */ + if(!out.b_php_out) { + XMLRPC_REQUEST xResponse = XMLRPC_RequestNew(); + if(xResponse) { + char *outBuf = 0; + int buf_len = 0; + + /* automagically determine output serialization type from request type */ + if (out.b_auto_version) { + XMLRPC_REQUEST_OUTPUT_OPTIONS opts = XMLRPC_RequestGetOutputOptions(xRequest); + if (opts) { + out.xmlrpc_out.version = opts->version; + } + } + /* set some required request hoojum */ + XMLRPC_RequestSetOutputOptions(xResponse, &out.xmlrpc_out); + XMLRPC_RequestSetRequestType(xResponse, xmlrpc_request_response); + XMLRPC_RequestSetData(xResponse, xAnswer); + XMLRPC_RequestSetMethodName(xResponse, methodname); + + /* generate xml */ + outBuf = XMLRPC_REQUEST_ToXML(xResponse, &buf_len); + if(outBuf) { + RETVAL_STRINGL(outBuf, buf_len, 1); + free(outBuf); + } + /* cleanup after ourselves. what a sty! */ + XMLRPC_RequestFree(xResponse, 0); + } + } else { /* or as native php types? */ + *return_value = *data.return_data; + zval_copy_ctor(return_value); + } + + /* cleanup after ourselves. what a sty! */ + zval_dtor(data.xmlrpc_method); + FREE_ZVAL(data.xmlrpc_method); + zval_dtor(data.return_data); + FREE_ZVAL(data.return_data); + + if(xAnswer) { + XMLRPC_CleanupValue(xAnswer); + } + + XMLRPC_RequestFree(xRequest, 1); + } + } +} +/* }}} */ + + +/* {{{ proto int xmlrpc_server_add_introspection_data(resource server, array desc) + Adds introspection documentation */ +PHP_FUNCTION(xmlrpc_server_add_introspection_data) +{ + zval **handle, **desc; + int type; + xmlrpc_server_data* server; + + if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &handle, &desc) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if (type == le_xmlrpc_server) { + XMLRPC_VALUE xDesc = PHP_to_XMLRPC(NULL, *desc); + if (xDesc) { + int retval = XMLRPC_ServerAddIntrospectionData(server->server_ptr, xDesc); + XMLRPC_CleanupValue(xDesc); + RETURN_LONG(retval); + } + } + RETURN_LONG(0); +} +/* }}} */ + + +/* {{{ proto array xmlrpc_parse_method_descriptions(string xml) + Decodes XML into a list of method descriptions */ +PHP_FUNCTION(xmlrpc_parse_method_descriptions) +{ + zval **arg1, *retval; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(arg1); + + if(return_value_used) { + STRUCT_XMLRPC_ERROR err = {0}; + XMLRPC_VALUE xVal = XMLRPC_IntrospectionCreateDescription(Z_STRVAL_PP(arg1), &err); + if(xVal) { + retval = XMLRPC_to_PHP(xVal); + + if(retval) { + *return_value = *retval; + zval_copy_ctor(return_value); + } + /* dust, sweep, and mop */ + XMLRPC_CleanupValue(xVal); + } else { + /* could not create description */ + if(err.xml_elem_error.parser_code) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to create introspection data", + err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid xml structure. Unable to create introspection data"); + } + + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error. no method description created"); + } + } +} +/* }}} */ + + +/************ +* type data * +************/ + +#define XMLRPC_TYPE_COUNT 10 +#define XMLRPC_VECTOR_TYPE_COUNT 4 +#define TYPE_STR_MAP_SIZE (XMLRPC_TYPE_COUNT + XMLRPC_VECTOR_TYPE_COUNT) + +/* return a string matching a given xmlrpc type */ +static const char** get_type_str_mapping(void) +{ + static const char* str_mapping[TYPE_STR_MAP_SIZE]; + static int first = 1; + if (first) { + /* warning. do not add/delete without changing size define */ + str_mapping[xmlrpc_none] = "none"; + str_mapping[xmlrpc_empty] = "empty"; + str_mapping[xmlrpc_nil] = "nil"; + str_mapping[xmlrpc_base64] = "base64"; + str_mapping[xmlrpc_boolean] = "boolean"; + str_mapping[xmlrpc_datetime] = "datetime"; + str_mapping[xmlrpc_double] = "double"; + str_mapping[xmlrpc_int] = "int"; + str_mapping[xmlrpc_string] = "string"; + str_mapping[xmlrpc_vector] = "vector"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_none] = "none"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_array] = "array"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_mixed] = "mixed"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_struct] = "struct"; + first = 0; + } + return (const char**)str_mapping; +} + +/* map an xmlrpc type to a string */ +const char* xmlrpc_type_as_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype) +{ + const char** str_mapping = get_type_str_mapping(); + + if (vtype == xmlrpc_vector_none) { + return str_mapping[type]; + } else { + return str_mapping[XMLRPC_TYPE_COUNT + vtype]; + } +} + +/* map a string to an xmlrpc type */ +XMLRPC_VALUE_TYPE xmlrpc_str_as_type(const char* str) +{ + const char** str_mapping = get_type_str_mapping(); + int i; + + if (str) { + for (i = 0; i < XMLRPC_TYPE_COUNT; i++) { + if (!strcmp(str_mapping[i], str)) { + return (XMLRPC_VALUE_TYPE) i; + } + } + } + return xmlrpc_none; +} + +/* map a string to an xmlrpc vector type */ +XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str) +{ + const char** str_mapping = get_type_str_mapping(); + int i; + + if (str) { + for (i = XMLRPC_TYPE_COUNT; i < TYPE_STR_MAP_SIZE; i++) { + if (!strcmp(str_mapping[i], str)) { + return (XMLRPC_VECTOR_TYPE) (i - XMLRPC_TYPE_COUNT); + } + } + } + return xmlrpc_none; +} + + +/* set a given value to a particular type. + * note: this only works on strings, and only for date and base64, + * which do not have native php types. black magic lies herein. + */ +int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) +{ + int bSuccess = FAILURE; + TSRMLS_FETCH(); + + /* we only really care about strings because they can represent + * base64 and datetime. all other types have corresponding php types + */ + if (Z_TYPE_P(value) == IS_STRING) { + if (newtype == xmlrpc_base64 || newtype == xmlrpc_datetime) { + const char* typestr = xmlrpc_type_as_str(newtype, xmlrpc_vector_none); + zval* type; + + MAKE_STD_ZVAL(type); + + Z_TYPE_P(type) = IS_STRING; + Z_STRVAL_P(type) = estrdup(typestr); + Z_STRLEN_P(type) = strlen(typestr); + + if(newtype == xmlrpc_datetime) { + XMLRPC_VALUE v = XMLRPC_CreateValueDateTime_ISO8601(NULL, value->value.str.val); + if(v) { + time_t timestamp = XMLRPC_GetValueDateTime(v); + if(timestamp) { + pval* ztimestamp; + + MAKE_STD_ZVAL(ztimestamp); + + ztimestamp->type = IS_LONG; + ztimestamp->value.lval = timestamp; + + convert_to_object(value); + if(SUCCESS == zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL)) { + bSuccess = zend_hash_update(Z_OBJPROP_P(value), OBJECT_VALUE_TS_ATTR, sizeof(OBJECT_VALUE_TS_ATTR), (void *) &ztimestamp, sizeof(zval *), NULL); + } + } + XMLRPC_CleanupValue(v); + } + } + else { + convert_to_object(value); + bSuccess = zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL); + } + } + } + + return bSuccess; +} + +/* return xmlrpc type of a php value */ +XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(php_output_options* out, zval* value, zval** newvalue) +{ + XMLRPC_VALUE_TYPE type = xmlrpc_none; + TSRMLS_FETCH(); + XMLRPCLS_FETCH(); + + if (value) { + switch (Z_TYPE_P(value)) { + case IS_NULL: + if (XMLRPCG(allow_null) || (out && out->b_allow_null)) { + type = xmlrpc_nil; + } else { + type = xmlrpc_string; + } + break; +#ifndef BOOL_AS_LONG + + /* Right thing to do, but it breaks some legacy code. */ + case IS_BOOL: + type = xmlrpc_boolean; + break; +#else + case IS_BOOL: +#endif + case IS_LONG: + case IS_RESOURCE: + type = xmlrpc_int; + break; + case IS_DOUBLE: + type = xmlrpc_double; + break; + case IS_CONSTANT: + type = xmlrpc_string; + break; + case IS_STRING: + type = xmlrpc_string; + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: + type = xmlrpc_vector; + break; + case IS_OBJECT: + { + zval** attr; + type = xmlrpc_vector; + + if (zend_hash_find(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void**) &attr) == SUCCESS) { + if (Z_TYPE_PP(attr) == IS_STRING) { + type = xmlrpc_str_as_type(Z_STRVAL_PP(attr)); + } + } + break; + } + } + + /* if requested, return an unmolested (magic removed) copy of the value */ + if (newvalue) { + zval** val; + + if ((type == xmlrpc_base64 && Z_TYPE_P(value) != IS_NULL) || type == xmlrpc_datetime) { + if (zend_hash_find(Z_OBJPROP_P(value), OBJECT_VALUE_ATTR, sizeof(OBJECT_VALUE_ATTR), (void**) &val) == SUCCESS) { + *newvalue = *val; + } + } else { + *newvalue = value; + } + } + } + + return type; +} + + +/* {{{ proto bool xmlrpc_set_type(string value, string type) + Sets xmlrpc type, base64 or datetime or nil, for a PHP string value */ +PHP_FUNCTION(xmlrpc_set_type) +{ + zval **arg, **type; + XMLRPC_VALUE_TYPE vtype; + + if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &arg, &type) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(type); + vtype = xmlrpc_str_as_type(Z_STRVAL_PP(type)); + if (vtype != xmlrpc_none) { + if (set_zval_xmlrpc_type(*arg, vtype) == SUCCESS) { + RETURN_TRUE; + } + } else { + zend_error(E_WARNING,"invalid type '%s' passed to xmlrpc_set_type()", Z_STRVAL_PP(type)); + } + RETURN_FALSE; +} +/* }}} */ + +/* {{{ proto string xmlrpc_get_type(mixed value) + Gets xmlrpc type for a PHP value. Especially useful for base64 and datetime strings */ +PHP_FUNCTION(xmlrpc_get_type) +{ + zval **arg; + XMLRPC_VALUE_TYPE type; + XMLRPC_VECTOR_TYPE vtype = xmlrpc_vector_none; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + type = get_zval_xmlrpc_type(NULL, *arg, 0); + if (type == xmlrpc_vector) { + vtype = determine_vector_type(Z_ARRVAL_PP(arg)); + } + + RETURN_STRING((char*) xmlrpc_type_as_str(type, vtype), 1); +} +/* }}} */ + +/* {{{ proto bool xmlrpc_is_fault(array) + Determines if an array value represents an XMLRPC fault. */ +PHP_FUNCTION(xmlrpc_is_fault) +{ + zval **arg, **val; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + if (Z_TYPE_PP(arg) != IS_ARRAY) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array argument expected"); + } else { + /* The "correct" way to do this would be to call the xmlrpc + * library XMLRPC_ValueIsFault() func. However, doing that + * would require us to create an xmlrpc value from the php + * array, which is rather expensive, especially if it was + * a big array. Thus, we resort to this not so clever hackery. + */ + if (zend_hash_find(Z_ARRVAL_PP(arg), FAULT_CODE, FAULT_CODE_LEN + 1, (void**) &val) == SUCCESS && + zend_hash_find(Z_ARRVAL_PP(arg), FAULT_STRING, FAULT_STRING_LEN + 1, (void**) &val) == SUCCESS) { + RETURN_TRUE; + } + } + + RETURN_FALSE; +} +/* }}} */ + + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + diff --git a/php/xmlrpc/xmlrpc.dsp b/php/xmlrpc/xmlrpc.dsp new file mode 100644 index 0000000..8c455d3 --- /dev/null +++ b/php/xmlrpc/xmlrpc.dsp @@ -0,0 +1,211 @@ +# Microsoft Developer Studio Project File - Name="xmlrpc" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=xmlrpc - Win32 Debug_TS +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "xmlrpc.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "xmlrpc.mak" CFG="xmlrpc - Win32 Debug_TS" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "xmlrpc - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "xmlrpc - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "xmlrpc - Win32 Debug_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug_TS" +# PROP BASE Intermediate_Dir "Debug_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_TS" +# PROP Intermediate_Dir "Debug_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "libxmlrpc" /I "..\..\bundle\expat" /D HAVE_XMLRPC=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D ZEND_DEBUG=1 /D ZTS=1 /D COMPILE_DL_XMLRPC=1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /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 /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 php5ts_debug.lib expat.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 /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_xmlrpc.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" + +!ELSEIF "$(CFG)" == "xmlrpc - Win32 Release_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_TS" +# PROP BASE Intermediate_Dir "Release_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_TS" +# PROP Intermediate_Dir "Release_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "libxmlrpc" /I "..\..\bundle\expat" /D HAVE_XMLRPC=1 /D "ZEND_WIN32" /D ZEND_DEBUG=0 /D "PHP_WIN32" /D ZTS=1 /D COMPILE_DL_XMLRPC=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /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 /nologo /dll /machine:I386 +# ADD LINK32 php5ts.lib expat.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 /dll /machine:I386 /out:"..\..\Release_TS/php_xmlrpc.dll" /libpath:"..\..\Release_TS" + +!ENDIF + +# Begin Target + +# Name "xmlrpc - Win32 Debug_TS" +# Name "xmlrpc - Win32 Release_TS" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=".\xmlrpc-epi-php.c" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\php_xmlrpc.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Group "libxmlrpc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\libxmlrpc\base64.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\base64.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\encodings.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\encodings.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\queue.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\queue.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\simplestring.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\simplestring.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\system_methods.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\system_methods_private.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_element.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_element.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_dandarpc.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_dandarpc.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_soap.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_soap.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_xmlrpc.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_xmlrpc.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_introspection.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_introspection.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_introspection_private.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_private.h +# End Source File +# End Group +# End Target +# End Project diff --git a/planetlab4.sql b/planetlab4.sql new file mode 100644 index 0000000..a879d24 --- /dev/null +++ b/planetlab4.sql @@ -0,0 +1,1152 @@ +-- +-- PlanetLab Central database schema +-- Version 4, PostgreSQL +-- +-- Aaron Klingaman +-- Reid Moran +-- Mark Huang +-- Tony Mack +-- +-- Copyright (C) 2006 The Trustees of Princeton University +-- +-- $Id: planetlab4.sql 6903 2007-11-12 22:45:01Z tmack $ +-- + +SET client_encoding = 'UNICODE'; + +-------------------------------------------------------------------------------- +-- Aggregates and store procedures +-------------------------------------------------------------------------------- + +-- Like MySQL GROUP_CONCAT(), this function aggregates values into a +-- PostgreSQL array. +CREATE AGGREGATE array_accum ( + sfunc = array_append, + basetype = anyelement, + stype = anyarray, + initcond = '{}' +); + +-------------------------------------------------------------------------------- +-- Version +-------------------------------------------------------------------------------- + +-- Database version +CREATE TABLE plc_db_version ( + version integer NOT NULL, + subversion integer NOT NULL DEFAULT 0 +) WITH OIDS; + +INSERT INTO plc_db_version (version, subversion) VALUES (4, 9); + +-------------------------------------------------------------------------------- +-- Accounts +-------------------------------------------------------------------------------- + +-- Accounts +CREATE TABLE persons ( + -- Mandatory + person_id serial PRIMARY KEY, -- Account identifier + email text NOT NULL, -- E-mail address + first_name text NOT NULL, -- First name + last_name text NOT NULL, -- Last name + deleted boolean NOT NULL DEFAULT false, -- Has been deleted + enabled boolean NOT NULL DEFAULT false, -- Has been disabled + + -- Password + password text NOT NULL DEFAULT 'nopass', -- Password (md5crypted) + verification_key text, -- Reset password key + verification_expires timestamp without time zone, + + -- Optional + title text, -- Honorific + phone text, -- Telephone number + url text, -- Home page + bio text, -- Biography + + -- Timestamps + date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP +) WITH OIDS; +CREATE INDEX persons_email_idx ON persons (email) WHERE deleted IS false; + +-------------------------------------------------------------------------------- +-- Sites +-------------------------------------------------------------------------------- + +-- Sites +CREATE TABLE sites ( + -- Mandatory + site_id serial PRIMARY KEY, -- Site identifier + login_base text NOT NULL, -- Site slice prefix + name text NOT NULL, -- Site name + abbreviated_name text NOT NULL, -- Site abbreviated name + enabled boolean NOT NULL Default true, -- Is this site enabled + deleted boolean NOT NULL DEFAULT false, -- Has been deleted + is_public boolean NOT NULL DEFAULT true, -- Shows up in public lists + max_slices integer NOT NULL DEFAULT 0, -- Maximum number of slices + max_slivers integer NOT NULL DEFAULT 1000, -- Maximum number of instantiated slivers + + -- Optional + latitude real, + longitude real, + url text, + ext_consortium_id integer, -- external consortium id + + -- Timestamps + date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP +) WITH OIDS; +CREATE INDEX sites_login_base_idx ON sites (login_base) WHERE deleted IS false; + +-- Account site membership +CREATE TABLE person_site ( + person_id integer REFERENCES persons NOT NULL, -- Account identifier + site_id integer REFERENCES sites NOT NULL, -- Site identifier + is_primary boolean NOT NULL DEFAULT false, -- Is the primary site for this account + PRIMARY KEY (person_id, site_id) +); +CREATE INDEX person_site_person_id_idx ON person_site (person_id); +CREATE INDEX person_site_site_id_idx ON person_site (site_id); + +-- Ordered by primary site first +CREATE VIEW person_site_ordered AS +SELECT person_id, site_id +FROM person_site +ORDER BY is_primary DESC; + +-- Sites that each person is a member of +CREATE VIEW person_sites AS +SELECT person_id, +array_accum(site_id) AS site_ids +FROM person_site_ordered +GROUP BY person_id; + +-- Accounts at each site +CREATE VIEW site_persons AS +SELECT site_id, +array_accum(person_id) AS person_ids +FROM person_site +GROUP BY site_id; + +-------------------------------------------------------------------------------- +-- Mailing Addresses +-------------------------------------------------------------------------------- + +CREATE TABLE address_types ( + address_type_id serial PRIMARY KEY, -- Address type identifier + name text UNIQUE NOT NULL, -- Address type + description text -- Address type description +) WITH OIDS; + +INSERT INTO address_types (name) VALUES ('Personal'); +INSERT INTO address_types (name) VALUES ('Shipping'); +-- XXX Used to be Site +INSERT INTO address_types (name) VALUES ('Billing'); + +-- Mailing addresses +CREATE TABLE addresses ( + address_id serial PRIMARY KEY, -- Address identifier + line1 text NOT NULL, -- Address line 1 + line2 text, -- Address line 2 + line3 text, -- Address line 3 + city text NOT NULL, -- City + state text NOT NULL, -- State or province + postalcode text NOT NULL, -- Postal code + country text NOT NULL -- Country +) WITH OIDS; + +-- Each mailing address can be one of several types +CREATE TABLE address_address_type ( + address_id integer REFERENCES addresses NOT NULL, -- Address identifier + address_type_id integer REFERENCES address_types NOT NULL, -- Address type + PRIMARY KEY (address_id, address_type_id) +) WITH OIDS; +CREATE INDEX address_address_type_address_id_idx ON address_address_type (address_id); +CREATE INDEX address_address_type_address_type_id_idx ON address_address_type (address_type_id); + +CREATE VIEW address_address_types AS +SELECT address_id, +array_accum(address_type_id) AS address_type_ids, +array_accum(address_types.name) AS address_types +FROM address_address_type +LEFT JOIN address_types USING (address_type_id) +GROUP BY address_id; + +CREATE TABLE site_address ( + site_id integer REFERENCES sites NOT NULL, -- Site identifier + address_id integer REFERENCES addresses NOT NULL, -- Address identifier + PRIMARY KEY (site_id, address_id) +) WITH OIDS; +CREATE INDEX site_address_site_id_idx ON site_address (site_id); +CREATE INDEX site_address_address_id_idx ON site_address (address_id); + +CREATE VIEW site_addresses AS +SELECT site_id, +array_accum(address_id) AS address_ids +FROM site_address +GROUP BY site_id; + +-------------------------------------------------------------------------------- +-- Authentication Keys +-------------------------------------------------------------------------------- + +-- Valid key types +CREATE TABLE key_types ( + key_type text PRIMARY KEY -- Key type +) WITH OIDS; +INSERT INTO key_types (key_type) VALUES ('ssh'); + +-- Authentication keys +CREATE TABLE keys ( + key_id serial PRIMARY KEY, -- Key identifier + key_type text REFERENCES key_types NOT NULL, -- Key type + key text NOT NULL, -- Key material + is_blacklisted boolean NOT NULL DEFAULT false -- Has been blacklisted +) WITH OIDS; + +-- Account authentication key(s) +CREATE TABLE person_key ( + key_id integer REFERENCES keys PRIMARY KEY, -- Key identifier + person_id integer REFERENCES persons NOT NULL -- Account identifier +) WITH OIDS; +CREATE INDEX person_key_person_id_idx ON person_key (person_id); + +CREATE VIEW person_keys AS +SELECT person_id, +array_accum(key_id) AS key_ids +FROM person_key +GROUP BY person_id; + +-------------------------------------------------------------------------------- +-- Account roles +-------------------------------------------------------------------------------- + +-- Valid account roles +CREATE TABLE roles ( + role_id integer PRIMARY KEY, -- Role identifier + name text UNIQUE NOT NULL -- Role symbolic name +) WITH OIDS; +INSERT INTO roles (role_id, name) VALUES (10, 'admin'); +INSERT INTO roles (role_id, name) VALUES (20, 'pi'); +INSERT INTO roles (role_id, name) VALUES (30, 'user'); +INSERT INTO roles (role_id, name) VALUES (40, 'tech'); + +CREATE TABLE person_role ( + person_id integer REFERENCES persons NOT NULL, -- Account identifier + role_id integer REFERENCES roles NOT NULL, -- Role identifier + PRIMARY KEY (person_id, role_id) +) WITH OIDS; +CREATE INDEX person_role_person_id_idx ON person_role (person_id); + +-- Account roles +CREATE VIEW person_roles AS +SELECT person_id, +array_accum(role_id) AS role_ids, +array_accum(roles.name) AS roles +FROM person_role +LEFT JOIN roles USING (role_id) +GROUP BY person_id; + +-------------------------------------------------------------------------------- +-- Nodes +-------------------------------------------------------------------------------- + +-- Valid node boot states +CREATE TABLE boot_states ( + boot_state text PRIMARY KEY +) WITH OIDS; +INSERT INTO boot_states (boot_state) VALUES ('boot'); +INSERT INTO boot_states (boot_state) VALUES ('dbg'); +INSERT INTO boot_states (boot_state) VALUES ('inst'); +INSERT INTO boot_states (boot_state) VALUES ('rins'); +INSERT INTO boot_states (boot_state) VALUES ('rcnf'); +INSERT INTO boot_states (boot_state) VALUES ('new'); + +-- Nodes +CREATE TABLE nodes ( + -- Mandatory + node_id serial PRIMARY KEY, -- Node identifier + hostname text NOT NULL, -- Node hostname + site_id integer REFERENCES sites NOT NULL, -- At which site + + boot_state text REFERENCES boot_states NOT NULL DEFAULT 'inst', -- Node boot state + deleted boolean NOT NULL DEFAULT false, -- Is deleted + + -- Optional + model text, -- Hardware make and model + boot_nonce text, -- Random nonce updated by Boot Manager + version text, -- Boot CD version string updated by Boot Manager + ssh_rsa_key text, -- SSH host key updated by Boot Manager + key text, -- Node key generated by API when configuration file is downloaded + + -- Timestamps + date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_contact timestamp without time zone +) WITH OIDS; +CREATE INDEX nodes_hostname_idx ON nodes (hostname) WHERE deleted IS false; +CREATE INDEX nodes_site_id_idx ON nodes (site_id) WHERE deleted IS false; + +-- Nodes at each site +CREATE VIEW site_nodes AS +SELECT site_id, +array_accum(node_id) AS node_ids +FROM nodes +WHERE deleted IS false +GROUP BY site_id; + +-------------------------------------------------------------------------------- +-- Node groups +-------------------------------------------------------------------------------- + +-- Node groups +CREATE TABLE nodegroups ( + nodegroup_id serial PRIMARY KEY, -- Group identifier + name text UNIQUE NOT NULL, -- Group name + description text -- Group description +) WITH OIDS; + +-- Node group membership +CREATE TABLE nodegroup_node ( + nodegroup_id integer REFERENCES nodegroups NOT NULL, -- Group identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + PRIMARY KEY (nodegroup_id, node_id) +) WITH OIDS; +CREATE INDEX nodegroup_node_nodegroup_id_idx ON nodegroup_node (nodegroup_id); +CREATE INDEX nodegroup_node_node_id_idx ON nodegroup_node (node_id); + +-- Nodes in each node group +CREATE VIEW nodegroup_nodes AS +SELECT nodegroup_id, +array_accum(node_id) AS node_ids +FROM nodegroup_node +GROUP BY nodegroup_id; + +-- Node groups that each node is a member of +CREATE VIEW node_nodegroups AS +SELECT node_id, +array_accum(nodegroup_id) AS nodegroup_ids +FROM nodegroup_node +GROUP BY node_id; + +-------------------------------------------------------------------------------- +-- Node configuration files +-------------------------------------------------------------------------------- + +CREATE TABLE conf_files ( + conf_file_id serial PRIMARY KEY, -- Configuration file identifier + enabled bool NOT NULL DEFAULT true, -- Configuration file is active + source text NOT NULL, -- Relative path on the boot server where file can be downloaded + dest text NOT NULL, -- Absolute path where file should be installed + file_permissions text NOT NULL DEFAULT '0644', -- chmod(1) permissions + file_owner text NOT NULL DEFAULT 'root', -- chown(1) owner + file_group text NOT NULL DEFAULT 'root', -- chgrp(1) owner + preinstall_cmd text, -- Shell command to execute prior to installing + postinstall_cmd text, -- Shell command to execute after installing + error_cmd text, -- Shell command to execute if any error occurs + ignore_cmd_errors bool NOT NULL DEFAULT false, -- Install file anyway even if an error occurs + always_update bool NOT NULL DEFAULT false -- Always attempt to install file even if unchanged +); + +CREATE TABLE conf_file_node ( + conf_file_id integer REFERENCES conf_files NOT NULL, -- Configuration file identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + PRIMARY KEY (conf_file_id, node_id) +); +CREATE INDEX conf_file_node_conf_file_id_idx ON conf_file_node (conf_file_id); +CREATE INDEX conf_file_node_node_id_idx ON conf_file_node (node_id); + +-- Nodes linked to each configuration file +CREATE VIEW conf_file_nodes AS +SELECT conf_file_id, +array_accum(node_id) AS node_ids +FROM conf_file_node +GROUP BY conf_file_id; + +-- Configuration files linked to each node +CREATE VIEW node_conf_files AS +SELECT node_id, +array_accum(conf_file_id) AS conf_file_ids +FROM conf_file_node +GROUP BY node_id; + +CREATE TABLE conf_file_nodegroup ( + conf_file_id integer REFERENCES conf_files NOT NULL, -- Configuration file identifier + nodegroup_id integer REFERENCES nodegroups NOT NULL, -- Node group identifier + PRIMARY KEY (conf_file_id, nodegroup_id) +); +CREATE INDEX conf_file_nodegroup_conf_file_id_idx ON conf_file_nodegroup (conf_file_id); +CREATE INDEX conf_file_nodegroup_nodegroup_id_idx ON conf_file_nodegroup (nodegroup_id); + +-- Node groups linked to each configuration file +CREATE VIEW conf_file_nodegroups AS +SELECT conf_file_id, +array_accum(nodegroup_id) AS nodegroup_ids +FROM conf_file_nodegroup +GROUP BY conf_file_id; + +-- Configuration files linked to each node group +CREATE VIEW nodegroup_conf_files AS +SELECT nodegroup_id, +array_accum(conf_file_id) AS conf_file_ids +FROM conf_file_nodegroup +GROUP BY nodegroup_id; + +-------------------------------------------------------------------------------- +-- Node network interfaces +-------------------------------------------------------------------------------- + +-- Valid network addressing schemes +CREATE TABLE network_types ( + type text PRIMARY KEY -- Addressing scheme +) WITH OIDS; +INSERT INTO network_types (type) VALUES ('ipv4'); + +-- Valid network configuration methods +CREATE TABLE network_methods ( + method text PRIMARY KEY -- Configuration method +) WITH OIDS; +INSERT INTO network_methods (method) VALUES ('static'); +INSERT INTO network_methods (method) VALUES ('dhcp'); +INSERT INTO network_methods (method) VALUES ('proxy'); +INSERT INTO network_methods (method) VALUES ('tap'); +INSERT INTO network_methods (method) VALUES ('ipmi'); +INSERT INTO network_methods (method) VALUES ('unknown'); + +-- Node network interfaces +CREATE TABLE nodenetworks ( + -- Mandatory + nodenetwork_id serial PRIMARY KEY, -- Network interface identifier + node_id integer REFERENCES nodes NOT NULL, -- Which node + is_primary boolean NOT NULL DEFAULT false, -- Is the primary interface for this node + type text REFERENCES network_types NOT NULL, -- Addressing scheme + method text REFERENCES network_methods NOT NULL, -- Configuration method + + -- Optional, depending on type and method + ip text, -- IP address + mac text, -- MAC address + gateway text, -- Default gateway address + network text, -- Network address + broadcast text, -- Network broadcast address + netmask text, -- Network mask + dns1 text, -- Primary DNS server + dns2 text, -- Secondary DNS server + bwlimit integer, -- Bandwidth limit in bps + hostname text -- Hostname of this interface +) WITH OIDS; +CREATE INDEX nodenetworks_node_id_idx ON nodenetworks (node_id); + +-- Ordered by primary interface first +CREATE VIEW nodenetworks_ordered AS +SELECT node_id, nodenetwork_id +FROM nodenetworks +ORDER BY is_primary DESC; + +-- Network interfaces on each node +CREATE VIEW node_nodenetworks AS +SELECT node_id, +array_accum(nodenetwork_id) AS nodenetwork_ids +FROM nodenetworks_ordered +GROUP BY node_id; + +-------------------------------------------------------------------------------- +-- Nodenetwork setting types and nodenetworks settings +-------------------------------------------------------------------------------- + +CREATE TABLE nodenetwork_setting_types ( + nodenetwork_setting_type_id serial PRIMARY KEY, + -- Setting Type Identifier + name text UNIQUE NOT NULL, -- Setting Name + description text, -- Optional Description + category text NOT NULL, -- Category, e.g. Wifi, or whatever + min_role_id integer references roles -- If set, minimal role required +) WITH OIDS; + +CREATE TABLE nodenetwork_setting ( + nodenetwork_setting_id serial PRIMARY KEY, -- Nodenetwork Setting Identifier + nodenetwork_id integer REFERENCES nodenetworks NOT NULL, + -- the nodenetwork this applies to + nodenetwork_setting_type_id integer REFERENCES nodenetwork_setting_types NOT NULL, + -- the setting type + value text +) WITH OIDS; + +CREATE OR REPLACE VIEW nodenetwork_settings AS +SELECT nodenetwork_id, +array_accum(nodenetwork_setting_id) AS nodenetwork_setting_ids +FROM nodenetwork_setting +GROUP BY nodenetwork_id; + +CREATE OR REPLACE VIEW view_nodenetwork_settings AS +SELECT +nodenetwork_setting.nodenetwork_setting_id, +nodenetwork_setting.nodenetwork_id, +nodenetwork_setting_types.nodenetwork_setting_type_id, +nodenetwork_setting_types.name, +nodenetwork_setting_types.description, +nodenetwork_setting_types.category, +nodenetwork_setting_types.min_role_id, +nodenetwork_setting.value +FROM nodenetwork_setting +INNER JOIN nodenetwork_setting_types USING (nodenetwork_setting_type_id); + +CREATE OR REPLACE VIEW view_nodenetworks AS +SELECT +nodenetworks.nodenetwork_id, +nodenetworks.node_id, +nodenetworks.is_primary, +nodenetworks.type, +nodenetworks.method, +nodenetworks.ip, +nodenetworks.mac, +nodenetworks.gateway, +nodenetworks.network, +nodenetworks.broadcast, +nodenetworks.netmask, +nodenetworks.dns1, +nodenetworks.dns2, +nodenetworks.bwlimit, +nodenetworks.hostname, +COALESCE((SELECT nodenetwork_setting_ids FROM nodenetwork_settings WHERE nodenetwork_settings.nodenetwork_id = nodenetworks.nodenetwork_id), '{}') AS nodenetwork_setting_ids +FROM nodenetworks; + +-------------------------------------------------------------------------------- +-- Power control units (PCUs) +-------------------------------------------------------------------------------- + +CREATE TABLE pcus ( + -- Mandatory + pcu_id serial PRIMARY KEY, -- PCU identifier + site_id integer REFERENCES sites NOT NULL, -- Site identifier + hostname text, -- Hostname, not necessarily unique (multiple logical sites could use the same PCU) + ip text NOT NULL, -- IP, not necessarily unique + + -- Optional + protocol text, -- Protocol, e.g. ssh or https or telnet + username text, -- Username, if applicable + "password" text, -- Password, if applicable + model text, -- Model, e.g. BayTech or iPal + notes text -- Random notes +) WITH OIDS; +CREATE INDEX pcus_site_id_idx ON pcus (site_id); + +CREATE VIEW site_pcus AS +SELECT site_id, +array_accum(pcu_id) AS pcu_ids +FROM pcus +GROUP BY site_id; + +CREATE TABLE pcu_node ( + pcu_id integer REFERENCES pcus NOT NULL, -- PCU identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + port integer NOT NULL, -- Port number + PRIMARY KEY (pcu_id, node_id), -- The same node cannot be controlled by different ports + UNIQUE (pcu_id, port) -- The same port cannot control multiple nodes +); +CREATE INDEX pcu_node_pcu_id_idx ON pcu_node (pcu_id); +CREATE INDEX pcu_node_node_id_idx ON pcu_node (node_id); + +CREATE VIEW node_pcus AS +SELECT node_id, +array_accum(pcu_id) AS pcu_ids, +array_accum(port) AS ports +FROM pcu_node +GROUP BY node_id; + +CREATE VIEW pcu_nodes AS +SELECT pcu_id, +array_accum(node_id) AS node_ids, +array_accum(port) AS ports +FROM pcu_node +GROUP BY pcu_id; + +-------------------------------------------------------------------------------- +-- Slices +-------------------------------------------------------------------------------- + +CREATE TABLE slice_instantiations ( + instantiation text PRIMARY KEY +) WITH OIDS; +INSERT INTO slice_instantiations (instantiation) VALUES ('not-instantiated'); -- Placeholder slice +INSERT INTO slice_instantiations (instantiation) VALUES ('plc-instantiated'); -- Instantiated by Node Manager +INSERT INTO slice_instantiations (instantiation) VALUES ('delegated'); -- Manually instantiated +INSERT INTO slice_instantiations (instantiation) VALUES ('nm-controller'); -- NM Controller + +-- Slices +CREATE TABLE slices ( + slice_id serial PRIMARY KEY, -- Slice identifier + site_id integer REFERENCES sites NOT NULL, -- Site identifier + + name text NOT NULL, -- Slice name + instantiation text REFERENCES slice_instantiations NOT NULL DEFAULT 'plc-instantiated', -- Slice state, e.g. plc-instantiated + url text, -- Project URL + description text, -- Project description + + max_nodes integer NOT NULL DEFAULT 100, -- Maximum number of nodes that can be assigned to this slice + + creator_person_id integer REFERENCES persons, -- Creator + created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Creation date + expires timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + '2 weeks', -- Expiration date + + is_deleted boolean NOT NULL DEFAULT false +) WITH OIDS; +CREATE INDEX slices_site_id_idx ON slices (site_id) WHERE is_deleted IS false; +CREATE INDEX slices_name_idx ON slices (name) WHERE is_deleted IS false; + +-- Slivers +CREATE TABLE slice_node ( + slice_id integer REFERENCES slices NOT NULL, -- Slice identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + PRIMARY KEY (slice_id, node_id) +) WITH OIDS; +CREATE INDEX slice_node_slice_id_idx ON slice_node (slice_id); +CREATE INDEX slice_node_node_id_idx ON slice_node (node_id); + +-- Synonym for slice_node +CREATE VIEW slivers AS +SELECT * FROM slice_node; + +-- Nodes in each slice +CREATE VIEW slice_nodes AS +SELECT slice_id, +array_accum(node_id) AS node_ids +FROM slice_node +GROUP BY slice_id; + +-- Slices on each node +CREATE VIEW node_slices AS +SELECT node_id, +array_accum(slice_id) AS slice_ids +FROM slice_node +GROUP BY node_id; + +-- Slices at each site +CREATE VIEW site_slices AS +SELECT site_id, +array_accum(slice_id) AS slice_ids +FROM slices +WHERE is_deleted is false +GROUP BY site_id; + +-- Slice membership +CREATE TABLE slice_person ( + slice_id integer REFERENCES slices NOT NULL, -- Slice identifier + person_id integer REFERENCES persons NOT NULL, -- Account identifier + PRIMARY KEY (slice_id, person_id) +) WITH OIDS; +CREATE INDEX slice_person_slice_id_idx ON slice_person (slice_id); +CREATE INDEX slice_person_person_id_idx ON slice_person (person_id); + +-- Members of the slice +CREATE VIEW slice_persons AS +SELECT slice_id, +array_accum(person_id) AS person_ids +FROM slice_person +GROUP BY slice_id; + +-- Slices of which each person is a member +CREATE VIEW person_slices AS +SELECT person_id, +array_accum(slice_id) AS slice_ids +FROM slice_person +GROUP BY person_id; + +-------------------------------------------------------------------------------- +-- Slice whitelist +-------------------------------------------------------------------------------- +-- slice whitelist on nodes +CREATE TABLE node_slice_whitelist ( + node_id integer REFERENCES nodes NOT NULL, -- Node id of whitelist + slice_id integer REFERENCES slices NOT NULL, -- Slice id thats allowd on this node + PRIMARY KEY (node_id, slice_id) +) WITH OIDS; +CREATE INDEX node_slice_whitelist_node_id_idx ON node_slice_whitelist (node_id); +CREATE INDEX node_slice_whitelist_slice_id_idx ON node_slice_whitelist (slice_id); + +-- Slices on each node +CREATE VIEW node_slices_whitelist AS +SELECT node_id, +array_accum(slice_id) AS slice_ids_whitelist +FROM node_slice_whitelist +GROUP BY node_id; + +-------------------------------------------------------------------------------- +-- Slice attributes +-------------------------------------------------------------------------------- + +-- Slice attribute types +CREATE TABLE slice_attribute_types ( + attribute_type_id serial PRIMARY KEY, -- Attribute type identifier + name text UNIQUE NOT NULL, -- Attribute name + description text, -- Attribute description + min_role_id integer REFERENCES roles DEFAULT 10 -- If set, minimum (least powerful) role that can set or change this attribute +) WITH OIDS; + +-- Slice/sliver attributes +CREATE TABLE slice_attribute ( + slice_attribute_id serial PRIMARY KEY, -- Slice attribute identifier + slice_id integer REFERENCES slices NOT NULL, -- Slice identifier + node_id integer REFERENCES nodes, -- Sliver attribute if set + nodegroup_id integer REFERENCES nodegroups, -- Node group attribute if set + attribute_type_id integer REFERENCES slice_attribute_types NOT NULL, -- Attribute type identifier + value text +) WITH OIDS; +CREATE INDEX slice_attribute_slice_id_idx ON slice_attribute (slice_id); +CREATE INDEX slice_attribute_node_id_idx ON slice_attribute (node_id); +CREATE INDEX slice_attribute_nodegroup_id_idx ON slice_attribute (nodegroup_id); + +CREATE VIEW slice_attributes AS +SELECT slice_id, +array_accum(slice_attribute_id) AS slice_attribute_ids +FROM slice_attribute +GROUP BY slice_id; + +-------------------------------------------------------------------------------- +-- Initscripts +-------------------------------------------------------------------------------- + +-- Initscripts +CREATE TABLE initscripts ( + initscript_id serial PRIMARY KEY, -- Initscript identifier + name text NOT NULL, -- Initscript name + enabled bool NOT NULL DEFAULT true, -- Initscript is active + script text NOT NULL, -- Initscript + UNIQUE (name) +) WITH OIDS; +CREATE INDEX initscripts_name_idx ON initscripts (name); + + +-------------------------------------------------------------------------------- +-- Peers +-------------------------------------------------------------------------------- + +-- Peers +CREATE TABLE peers ( + peer_id serial PRIMARY KEY, -- Peer identifier + peername text NOT NULL, -- Peer name + peer_url text NOT NULL, -- (HTTPS) URL of the peer PLCAPI interface + cacert text, -- (SSL) Public certificate of peer API server + key text, -- (GPG) Public key used for authentication + deleted boolean NOT NULL DEFAULT false +) WITH OIDS; +CREATE INDEX peers_peername_idx ON peers (peername) WHERE deleted IS false; + +-- Objects at each peer +CREATE TABLE peer_site ( + site_id integer REFERENCES sites PRIMARY KEY, -- Local site identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_site_id integer NOT NULL, -- Foreign site identifier at peer + UNIQUE (peer_id, peer_site_id) -- The same foreign site should not be cached twice +) WITH OIDS; +CREATE INDEX peer_site_peer_id_idx ON peers (peer_id); + +CREATE VIEW peer_sites AS +SELECT peer_id, +array_accum(site_id) AS site_ids, +array_accum(peer_site_id) AS peer_site_ids +FROM peer_site +GROUP BY peer_id; + +CREATE TABLE peer_person ( + person_id integer REFERENCES persons PRIMARY KEY, -- Local user identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_person_id integer NOT NULL, -- Foreign user identifier at peer + UNIQUE (peer_id, peer_person_id) -- The same foreign user should not be cached twice +) WITH OIDS; +CREATE INDEX peer_person_peer_id_idx ON peer_person (peer_id); + +CREATE VIEW peer_persons AS +SELECT peer_id, +array_accum(person_id) AS person_ids, +array_accum(peer_person_id) AS peer_person_ids +FROM peer_person +GROUP BY peer_id; + +CREATE TABLE peer_key ( + key_id integer REFERENCES keys PRIMARY KEY, -- Local key identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_key_id integer NOT NULL, -- Foreign key identifier at peer + UNIQUE (peer_id, peer_key_id) -- The same foreign key should not be cached twice +) WITH OIDS; +CREATE INDEX peer_key_peer_id_idx ON peer_key (peer_id); + +CREATE VIEW peer_keys AS +SELECT peer_id, +array_accum(key_id) AS key_ids, +array_accum(peer_key_id) AS peer_key_ids +FROM peer_key +GROUP BY peer_id; + +CREATE TABLE peer_node ( + node_id integer REFERENCES nodes PRIMARY KEY, -- Local node identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_node_id integer NOT NULL, -- Foreign node identifier + UNIQUE (peer_id, peer_node_id) -- The same foreign node should not be cached twice +) WITH OIDS; +CREATE INDEX peer_node_peer_id_idx ON peer_node (peer_id); + +CREATE VIEW peer_nodes AS +SELECT peer_id, +array_accum(node_id) AS node_ids, +array_accum(peer_node_id) AS peer_node_ids +FROM peer_node +GROUP BY peer_id; + +CREATE TABLE peer_slice ( + slice_id integer REFERENCES slices PRIMARY KEY, -- Local slice identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_slice_id integer NOT NULL, -- Slice identifier at peer + UNIQUE (peer_id, peer_slice_id) -- The same foreign slice should not be cached twice +) WITH OIDS; +CREATE INDEX peer_slice_peer_id_idx ON peer_slice (peer_id); + +CREATE VIEW peer_slices AS +SELECT peer_id, +array_accum(slice_id) AS slice_ids, +array_accum(peer_slice_id) AS peer_slice_ids +FROM peer_slice +GROUP BY peer_id; + +-------------------------------------------------------------------------------- +-- Authenticated sessions +-------------------------------------------------------------------------------- + +-- Authenticated sessions +CREATE TABLE sessions ( + session_id text PRIMARY KEY, -- Session identifier + expires timestamp without time zone +) WITH OIDS; + +-- People can have multiple sessions +CREATE TABLE person_session ( + person_id integer REFERENCES persons NOT NULL, -- Account identifier + session_id text REFERENCES sessions NOT NULL, -- Session identifier + PRIMARY KEY (person_id, session_id), + UNIQUE (session_id) -- Sessions are unique +) WITH OIDS; +CREATE INDEX person_session_person_id_idx ON person_session (person_id); + +-- Nodes can have only one session +CREATE TABLE node_session ( + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + session_id text REFERENCES sessions NOT NULL, -- Session identifier + UNIQUE (node_id), -- Nodes can have only one session + UNIQUE (session_id) -- Sessions are unique +) WITH OIDS; + + + +------------------------------------------------------------------------------- +-- PCU Types +------------------------------------------------------------------------------ +CREATE TABLE pcu_types ( + pcu_type_id serial PRIMARY KEY, + model text NOT NULL , -- PCU model name + name text -- Full PCU model name +) WITH OIDS; +CREATE INDEX pcu_types_model_idx ON pcu_types (model); + +CREATE TABLE pcu_protocol_type ( + pcu_protocol_type_id serial PRIMARY KEY, + pcu_type_id integer REFERENCES pcu_types NOT NULL, -- PCU type identifier + port integer NOT NULL, -- PCU port + protocol text NOT NULL, -- Protocol + supported boolean NOT NULL DEFAULT True -- Does PLC support +) WITH OIDS; +CREATE INDEX pcu_protocol_type_pcu_type_id ON pcu_protocol_type (pcu_type_id); + + +CREATE OR REPLACE VIEW pcu_protocol_types AS +SELECT pcu_type_id, +array_accum(pcu_protocol_type_id) as pcu_protocol_type_ids +FROM pcu_protocol_type +GROUP BY pcu_type_id; + +-------------------------------------------------------------------------------- +-- Message templates +-------------------------------------------------------------------------------- + +CREATE TABLE messages ( + message_id text PRIMARY KEY, -- Message name + subject text, -- Message summary + template text, -- Message template + enabled bool NOT NULL DEFAULT true -- Whether message is enabled +) WITH OIDS; + +-------------------------------------------------------------------------------- +-- Events +-------------------------------------------------------------------------------- + +-- Events +CREATE TABLE events ( + event_id serial PRIMARY KEY, -- Event identifier + person_id integer REFERENCES persons, -- Person responsible for event, if any + node_id integer REFERENCES nodes, -- Node responsible for event, if any + auth_type text, -- Type of auth used. i.e. AuthMethod + fault_code integer NOT NULL DEFAULT 0, -- Did this event result in error + call_name text NOT NULL, -- Call responsible for this event + call text NOT NULL, -- Call responsible for this event, including parameters + message text, -- High level description of this event + runtime float DEFAULT 0, -- Event run time + time timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP -- Event timestamp +) WITH OIDS; + +-- Database object(s) that may have been affected by a particular event +CREATE TABLE event_object ( + event_id integer REFERENCES events NOT NULL, -- Event identifier + object_id integer NOT NULL, -- Object identifier + object_type text NOT NULL Default 'Unknown' -- What type of object is this event affecting +) WITH OIDS; +CREATE INDEX event_object_event_id_idx ON event_object (event_id); +CREATE INDEX event_object_object_id_idx ON event_object (object_id); +CREATE INDEX event_object_object_type_idx ON event_object (object_type); + +CREATE OR REPLACE VIEW event_objects AS +SELECT event_id, +array_accum(object_id) AS object_ids, +array_accum(object_type) AS object_types +FROM event_object +GROUP BY event_id; + +-------------------------------------------------------------------------------- +-- Useful views +-------------------------------------------------------------------------------- +CREATE OR REPLACE VIEW view_pcu_types AS +SELECT +pcu_types.pcu_type_id, +pcu_types.model, +pcu_types.name, +COALESCE((SELECT pcu_protocol_type_ids FROM pcu_protocol_types WHERE pcu_protocol_types.pcu_type_id = pcu_types.pcu_type_id), '{}') AS pcu_protocol_type_ids +FROM pcu_types; + +CREATE OR REPLACE VIEW view_events AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.auth_type, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +COALESCE((SELECT object_ids FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_ids, +COALESCE((SELECT object_types FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_types +FROM events; + +CREATE OR REPLACE VIEW view_event_objects AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +event_object.object_id, +event_object.object_type +FROM events LEFT JOIN event_object USING (event_id); + +CREATE OR REPLACE VIEW view_persons AS +SELECT +persons.person_id, +persons.email, +persons.first_name, +persons.last_name, +persons.deleted, +persons.enabled, +persons.password, +persons.verification_key, +CAST(date_part('epoch', persons.verification_expires) AS bigint) AS verification_expires, +persons.title, +persons.phone, +persons.url, +persons.bio, +CAST(date_part('epoch', persons.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', persons.last_updated) AS bigint) AS last_updated, +peer_person.peer_id, +peer_person.peer_person_id, +COALESCE((SELECT role_ids FROM person_roles WHERE person_roles.person_id = persons.person_id), '{}') AS role_ids, +COALESCE((SELECT roles FROM person_roles WHERE person_roles.person_id = persons.person_id), '{}') AS roles, +COALESCE((SELECT site_ids FROM person_sites WHERE person_sites.person_id = persons.person_id), '{}') AS site_ids, +COALESCE((SELECT key_ids FROM person_keys WHERE person_keys.person_id = persons.person_id), '{}') AS key_ids, +COALESCE((SELECT slice_ids FROM person_slices WHERE person_slices.person_id = persons.person_id), '{}') AS slice_ids +FROM persons +LEFT JOIN peer_person USING (person_id); + +CREATE OR REPLACE VIEW view_peers AS +SELECT +peers.*, +COALESCE((SELECT site_ids FROM peer_sites WHERE peer_sites.peer_id = peers.peer_id), '{}') AS site_ids, +COALESCE((SELECT peer_site_ids FROM peer_sites WHERE peer_sites.peer_id = peers.peer_id), '{}') AS peer_site_ids, +COALESCE((SELECT person_ids FROM peer_persons WHERE peer_persons.peer_id = peers.peer_id), '{}') AS person_ids, +COALESCE((SELECT peer_person_ids FROM peer_persons WHERE peer_persons.peer_id = peers.peer_id), '{}') AS peer_person_ids, +COALESCE((SELECT key_ids FROM peer_keys WHERE peer_keys.peer_id = peers.peer_id), '{}') AS key_ids, +COALESCE((SELECT peer_key_ids FROM peer_keys WHERE peer_keys.peer_id = peers.peer_id), '{}') AS peer_key_ids, +COALESCE((SELECT node_ids FROM peer_nodes WHERE peer_nodes.peer_id = peers.peer_id), '{}') AS node_ids, +COALESCE((SELECT peer_node_ids FROM peer_nodes WHERE peer_nodes.peer_id = peers.peer_id), '{}') AS peer_node_ids, +COALESCE((SELECT slice_ids FROM peer_slices WHERE peer_slices.peer_id = peers.peer_id), '{}') AS slice_ids, +COALESCE((SELECT peer_slice_ids FROM peer_slices WHERE peer_slices.peer_id = peers.peer_id), '{}') AS peer_slice_ids +FROM peers; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT slice_ids_whitelist FROM node_slices_whitelist WHERE node_slices_whitelist.node_id = nodes.node_id), '{}') AS slice_ids_whitelist, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +CREATE OR REPLACE VIEW view_nodegroups AS +SELECT +nodegroups.*, +COALESCE((SELECT node_ids FROM nodegroup_nodes WHERE nodegroup_nodes.nodegroup_id = nodegroups.nodegroup_id), '{}') AS node_ids, +COALESCE((SELECT conf_file_ids FROM nodegroup_conf_files WHERE nodegroup_conf_files.nodegroup_id = nodegroups.nodegroup_id), '{}') AS conf_file_ids +FROM nodegroups; + +CREATE OR REPLACE VIEW view_conf_files AS +SELECT +conf_files.*, +COALESCE((SELECT node_ids FROM conf_file_nodes WHERE conf_file_nodes.conf_file_id = conf_files.conf_file_id), '{}') AS node_ids, +COALESCE((SELECT nodegroup_ids FROM conf_file_nodegroups WHERE conf_file_nodegroups.conf_file_id = conf_files.conf_file_id), '{}') AS nodegroup_ids +FROM conf_files; + +CREATE OR REPLACE VIEW view_pcus AS +SELECT +pcus.*, +COALESCE((SELECT node_ids FROM pcu_nodes WHERE pcu_nodes.pcu_id = pcus.pcu_id), '{}') AS node_ids, +COALESCE((SELECT ports FROM pcu_nodes WHERE pcu_nodes.pcu_id = pcus.pcu_id), '{}') AS ports +FROM pcus; + +CREATE OR REPLACE VIEW view_sites AS +SELECT +sites.site_id, +sites.login_base, +sites.name, +sites.abbreviated_name, +sites.deleted, +sites.enabled, +sites.is_public, +sites.max_slices, +sites.max_slivers, +sites.latitude, +sites.longitude, +sites.url, +sites.ext_consortium_id, +CAST(date_part('epoch', sites.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', sites.last_updated) AS bigint) AS last_updated, +peer_site.peer_id, +peer_site.peer_site_id, +COALESCE((SELECT person_ids FROM site_persons WHERE site_persons.site_id = sites.site_id), '{}') AS person_ids, +COALESCE((SELECT node_ids FROM site_nodes WHERE site_nodes.site_id = sites.site_id), '{}') AS node_ids, +COALESCE((SELECT address_ids FROM site_addresses WHERE site_addresses.site_id = sites.site_id), '{}') AS address_ids, +COALESCE((SELECT slice_ids FROM site_slices WHERE site_slices.site_id = sites.site_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM site_pcus WHERE site_pcus.site_id = sites.site_id), '{}') AS pcu_ids +FROM sites +LEFT JOIN peer_site USING (site_id); + +CREATE OR REPLACE VIEW view_addresses AS +SELECT +addresses.*, +COALESCE((SELECT address_type_ids FROM address_address_types WHERE address_address_types.address_id = addresses.address_id), '{}') AS address_type_ids, +COALESCE((SELECT address_types FROM address_address_types WHERE address_address_types.address_id = addresses.address_id), '{}') AS address_types +FROM addresses; + +CREATE OR REPLACE VIEW view_keys AS +SELECT +keys.*, +person_key.person_id, +peer_key.peer_id, +peer_key.peer_key_id +FROM keys +LEFT JOIN person_key USING (key_id) +LEFT JOIN peer_key USING (key_id); + +CREATE OR REPLACE VIEW view_slices AS +SELECT +slices.slice_id, +slices.site_id, +slices.name, +slices.instantiation, +slices.url, +slices.description, +slices.max_nodes, +slices.creator_person_id, +slices.is_deleted, +CAST(date_part('epoch', slices.created) AS bigint) AS created, +CAST(date_part('epoch', slices.expires) AS bigint) AS expires, +peer_slice.peer_id, +peer_slice.peer_slice_id, +COALESCE((SELECT node_ids FROM slice_nodes WHERE slice_nodes.slice_id = slices.slice_id), '{}') AS node_ids, +COALESCE((SELECT person_ids FROM slice_persons WHERE slice_persons.slice_id = slices.slice_id), '{}') AS person_ids, +COALESCE((SELECT slice_attribute_ids FROM slice_attributes WHERE slice_attributes.slice_id = slices.slice_id), '{}') AS slice_attribute_ids +FROM slices +LEFT JOIN peer_slice USING (slice_id); + +CREATE OR REPLACE VIEW view_slice_attributes AS +SELECT +slice_attribute.slice_attribute_id, +slice_attribute.slice_id, +slice_attribute.node_id, +slice_attribute.nodegroup_id, +slice_attribute_types.attribute_type_id, +slice_attribute_types.name, +slice_attribute_types.description, +slice_attribute_types.min_role_id, +slice_attribute.value +FROM slice_attribute +INNER JOIN slice_attribute_types USING (attribute_type_id); + +CREATE OR REPLACE VIEW view_sessions AS +SELECT +sessions.session_id, +CAST(date_part('epoch', sessions.expires) AS bigint) AS expires, +person_session.person_id, +node_session.node_id +FROM sessions +LEFT JOIN person_session USING (session_id) +LEFT JOIN node_session USING (session_id); + +-------------------------------------------------------------------------------- +-- Built-in maintenance account and default site +-------------------------------------------------------------------------------- + +INSERT INTO persons +(first_name, last_name, email, password, enabled) +VALUES +('Maintenance', 'Account', 'maint@localhost.localdomain', 'nopass', true); + +INSERT INTO person_role (person_id, role_id) VALUES (1, 10); +INSERT INTO person_role (person_id, role_id) VALUES (1, 20); +INSERT INTO person_role (person_id, role_id) VALUES (1, 30); +INSERT INTO person_role (person_id, role_id) VALUES (1, 40); + +INSERT INTO sites +(login_base, name, abbreviated_name, max_slices) +VALUES +('pl', 'PlanetLab Central', 'PLC', 100); diff --git a/plcsh b/plcsh new file mode 100755 index 0000000..54fc0b9 --- /dev/null +++ b/plcsh @@ -0,0 +1,151 @@ +#!/usr/bin/python +# +# Interactive shell for testing PLCAPI +# +# Mark Huang +# Copyright (C) 2005 The Trustees of Princeton University +# +# $Id: plcsh,v 1.6 2007/02/08 21:49:41 mlhuang Exp $ +# + +import os +import sys +from socket import gethostname +from optparse import OptionParser +from getpass import getpass +from traceback import print_exc + +sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0]))) +from PLC.Shell import Shell + +parser = OptionParser(add_help_option = False) +parser.add_option("-f", "--config", help = "PLC configuration file") +parser.add_option("-h", "--url", help = "API URL") +parser.add_option("-c", "--cacert", help = "API SSL certificate") +parser.add_option("-k", "--insecure", help = "Do not check SSL certificate") +parser.add_option("-m", "--method", help = "API authentication method") +parser.add_option("-s", "--session", help = "API session key") +parser.add_option("-u", "--user", help = "API user name") +parser.add_option("-p", "--password", help = "API password") +parser.add_option("-r", "--role", help = "API role") +parser.add_option("-x", "--xmlrpc", action = "store_true", default = False, help = "Use XML-RPC interface") +parser.add_option("--help", action = "help", help = "show this help message and exit") +(options, args) = parser.parse_args() + +# If user is specified but password is not +if options.user is not None and options.password is None: + try: + options.password = getpass() + except (EOFError, KeyboardInterrupt): + print + sys.exit(0) + +# Initialize a single global instance (scripts may re-initialize +# this instance and/or create additional instances). +try: + shell = Shell(globals = globals(), + config = options.config, + url = options.url, xmlrpc = options.xmlrpc, cacert = options.cacert, + method = options.method, role = options.role, + user = options.user, password = options.password, + session = options.session) + # Register a few more globals for backward compatibility + auth = shell.auth + api = shell.api + config = shell.config +except Exception, err: + print "Error:", err + print + parser.print_help() + sys.exit(1) + +# If called by a script +if len(sys.argv) > 1 and os.path.exists(sys.argv[1]): + # Pop us off the argument stack + sys.argv.pop(0) + execfile(sys.argv[0]) + +# Otherwise, run an interactive shell environment +else: + if shell.server is None: + print "PlanetLab Central Direct API Access" + prompt = "" + elif shell.auth['AuthMethod'] == "anonymous": + prompt = "[anonymous]" + print "Connected anonymously" + elif shell.auth['AuthMethod'] == "session": + # XXX No way to tell node and user sessions apart from the + # client point of view. + prompt = "[%s]" % gethostname() + print "%s connected using session authentication" % gethostname() + else: + prompt = "[%s]" % shell.auth['Username'] + print "%s connected using %s authentication" % \ + (shell.auth['Username'], shell.auth['AuthMethod']) + + # Readline and tab completion support + import atexit + import readline + import rlcompleter + + print 'Type "system.listMethods()" or "help(method)" for more information.' + # Load command history + history_path = os.path.join(os.environ["HOME"], ".plcapi_history") + try: + file(history_path, 'a').close() + readline.read_history_file(history_path) + atexit.register(readline.write_history_file, history_path) + except IOError: + pass + + # Enable tab completion + readline.parse_and_bind("tab: complete") + + try: + while True: + command = "" + while True: + # Get line + try: + if command == "": + sep = ">>> " + else: + sep = "... " + line = raw_input(prompt + sep) + # Ctrl-C + except KeyboardInterrupt: + command = "" + print + break + + # Build up multi-line command + command += line + + # Blank line or first line does not end in : + if line == "" or (command == line and line[-1] != ':'): + break + + command += os.linesep + + # Blank line + if command == "": + continue + # Quit + elif command in ["q", "quit", "exit"]: + break + + try: + try: + # Try evaluating as an expression and printing the result + result = eval(command) + if result is not None: + print result + except SyntaxError: + # Fall back to executing as a statement + exec command + except Exception, err: + print_exc() + + except EOFError: + print + pass diff --git a/psycopg2/AUTHORS b/psycopg2/AUTHORS new file mode 100644 index 0000000..44c77fc --- /dev/null +++ b/psycopg2/AUTHORS @@ -0,0 +1,8 @@ +Main authors: + Federico Di Gregorio + +For the win32 port: + Jason Erickson (most of his changes are still in 2.0) + +Additional Help: + diff --git a/psycopg2/ChangeLog b/psycopg2/ChangeLog new file mode 100644 index 0000000..b273e20 --- /dev/null +++ b/psycopg2/ChangeLog @@ -0,0 +1,1219 @@ +2006-09-02 Federico Di Gregorio + + * Release 2.0.5.1. + + * psycopg/cursor_type.c: applied patch from Jason Erickson to + build on MSVC and older gcc. + +2006-09-01 Federico Di Gregorio + + * Release 2.0.5. + + * Fixed patch from #119, see tracker for details. + + * Preparing release 2.0.5. + + * psycopg/psycopgmodule.c: fixed filling of connection errors + to include OperationalError. + + * setup.py: removed pydatetime option from initialize_options + to make sure that the value in setup.cfg is used. + + * psycopg/psycopgmodule.c: applied patch from jdahlin (#120) + to have .connect() accept either a string or int as the port + parameter. + + * psycopg/adapter_binary.c: applied patch from jdahlin (#119) + to fix the segfault on empty binary buffers. + + * psycopg/connection_type.c: added .status attribute to expose + the internal status. + + * psycopg/pqpath.c: applied patch from intgr (#117) to fix + segfault on null queries. + + * psycopg/cursor_type.c: applied patch from intgr (#116) to + fix bad keyword naming and segfault in .executemany(). + + * ZPsycopgDA/DA.py: applied ImageFile patch from Charlie + Clark. + + * lib/pool.py: applied logging patch from Charlie Clark. + It will probably get a makeup and be moved to the top-level + module later. + +2006-08-02 Federico Di Gregorio + + * Release 2.0.4. + + * Fixed bug in float conversion (check for NULL string was + erroneously removed in 2.0.3!) + +2006-07-31 Federico Di Gregorio + + * Release 2.0.3. + + * psycopg/cursor_type.c: applied patch from jbellis (#113) to + allow column selection in .copy_from(). + + * psycopg/psycopgmodule.c: fixed memory leak in custom exceptions + (applied patch from #114). + +2006-07-26 Federico Di Gregorio + + * psycopg/adapter_datetime.c (pydatetime_str): fixed error + in conversion of microseconds for intervals and better algo + (thanks to Mario Frasca.) + +2006-06-18 Federico Di Gregorio + + * psycopg/adapter_binary.c: same as below. + + * psycopg/adapter_qstring.c: does not segfault anymore if + .getquoted() is called without preparing the qstring with + the connection. + +2006-06-15 Federico Di Gregorio + + * psycopg/typecast_basic.c: fixed problem with bogus + conversion when importing gtk (that was crazy, I didn't + understand why it happened but the new code just fixes it.) + + * ZPsycopgDA/db.py: better type analisys, using an hash + instead of a series of if (variation on patch from Charlie + Clark.) + +2006-06-11 Federico Di Gregorio + + * Release 2.0.2. + + * psycopg/typecast_array.c (typecast_array_cleanup): fixed a + problem with typecast_array_cleanup always returning the new + string length shorter by 1 (Closes: #93). + + * psycopg/adapter_binary.c: as below. + + * psycopg/adapter_qstring.c: wrapped #warning in #ifdef __GCC__ + because other compilers don't have it and it will just break + compilation (patch from jason, our great win32 builder). + + * psycopg/adapter_list.c: applied patch to adapt an empty list + into an empty array and not to NULL (from iGGy, closes: #108). + + * psycopg/cursor_type.c: applied patch from wkv to avoid + under-allocating query space when the parameters are not of the + right type (Closes: #110). + + * psycopg/connection_int.c: applied patch from wkv to avoid off + by one allocation of connection encoding string (Closes: #109). + +2006-06-09 Federico Di Gregorio + + * Release 2.0.1. + + * Fixed some buglets in ZPsycopgDA (was unable to load due + to shorter version number in psycopg module.) + +2006-06-08 Federico Di Gregorio + + * Release 2.0. + + * ZPsycopgDA/DA.py: removed Browse table for 2.0 release; we'll + add it back later. + +2006-05-26 Federico Di Gregorio + + * Applied better PostgreSQL patch from AA. + +2006-05-24 Federico Di Gregorio + + * Enabled 8.1.4 security fix only when the version is >= 8.1.4, fall + back to old code otherwise. + + * psycopg/adapter_qstring.c: now quote using PQescapeStringConn if + available. + + * psycopg/adapter_binary.c: now quote using PQescapeByteaConn if + available. + +2006-04-38 Federico Di Gregorio + + * setup.py: fixed little problem with mx_include_dir as suggested + by kvc (this closes #102). + +2006-04-24 Federico Di Gregorio + + * psycopg/adapter_pboolean.c: added the possibility to format boolean + values as "true" and "false" instead of "'t'" and "'f'". + +2006-03-08 Federico Di Gregorio + + * lib/extras.py: added .next() to DictCursot to support iteration. + +2006-03-02 Federico Di Gregorio + + * psycopg/typecast_array.c (typecast_array_tokenize): removed cast + to build without warnings on 64 bit arches. + +2006-02-11 Federico Di Gregorio + + * Release 2.0 beta 8. + + * psycopg/config.h: applied patch from Jason to fix handle leak on + win32, as documented in #92. + +2006-02-11 Federico Di Gregorio + + * Release 2.0 beta 7. + + * psycopg/psycopgmodule.c: applied fix for memory overflow in + connect() (reported by solt, #91.) + + * setup.py: applied patch from lbruno. + +2006-01-11 Federico Di Gregorio + + * setup.py: does not report an error in pg_config unless the pg_config + was explicitly set (allows for building with old options.) + +2006-01-06 Daniele Varrazzo + + * setup.py: libpq.dll not used anymore. win32 setup uses pg_config too. + +2006-01-05 Federico Di Gregorio + + * psycopg/psycopgmodule.c (psyco_set_error): added function to set extra + parameters on ProgrammingError instances. Also modified all occurances of + PyErr_SetString(ProgrammingError,...) to psycopg_set_error(). + + * setup.{cfg,py}: we now use pg_config to locate PostgreSQL libraries + and headers (modified patch from lbruno, see #70.) + +2006-01-01 Federico Di Gregorio + + * Preparing release 2 beta 7. + + * MANIFEST.in: we now distrbute pre-built documentation (still need + to add to setup.py the code necessary to build docs as part of the + build process.) + + * psycopg/connection_int.c: PostgreSQL encoding names are now force + uppercase (after all PostgreSQL documentation reports them this way.) + +2005-12-11 Federico Di Gregorio + + * psycopg/typecast_array.c (typecast_array_cleanup): added functio + to cleanup the "[...]=" part of an array result. This probably will + need some more work for nested arrays but it fixed every test I was + able to write. (Closes: #80) + +2005-12-11 Federico Di Gregorio + + * setup.py: half-applied patch from Tavis to specify mx_include_dir + in setup.cfg. + + * psycopg/typecast.c (typecast_parse_time): cz limit in the while + loop is 6, not 5. This solve the problem with "fractionary" time zones + and fixes #78. + +2005-12-06 Federico Di Gregorio + + * lib/extras.py: added .callproc() to DictCursor as suggested + by Philip Semanchuk. + +2005-11-29 Federico Di Gregorio + + * MANIFEST.in: added docs/async.txt. (Closes: #75) + +2005-11-26 Daniele Varrazzo + + * psycopg/psycopgmodule.c: fixed exceptions refcount. + + * Fixed lots of doctrings and added Epydoc-generated docs support. + +2005-11-24 Federico Di Gregorio + + * sandbox: added all the test and creash-me files to the repository. + + * psycopg/typecast.c (typecast_dealloc): now directly calls + PyObject_Del to avoid to segfault. + +2005-11-20 Federico Di Gregorio + + * psycopg/typecast.c: fixed problem with microseconds conversion by + applying slightly modified patch from Ronnie Mackay. + +2005-11-19 Federico Di Gregorio + + * lib/extensions.py: COMMITED -> COMMITTED. (Closes: #73) + + * doc/extensions.rst: included Daniele's work after minor cosmetic changes + like using the new constants instead of numbers for transaction isolation + levels. + +2005-11-17 Federico Di Gregorio + + * ZPsycopgDA/pool.py: fixed connections leak by using the new name + (PersistentConnectionPool) for the old connection pool class. + +2005-11-16 Federico Di Gregorio + + * Preparing release 2.0 beta 6. + + * psycopg/adapter_mxdatetime.c: fixed all problems with mx conversions. + + * psycopg/typecast.c: now the timezone is set correctly even if there + are no microseconds and/or the offset is 0; + + * examples/encoding.py: fixed example by using python utf8 encoding for + the whole file. + + * lib/__init__.py: very nice hack from Harald Armin Massa to allow + py2exe and similar tools to do their work without problems. + +2005-11-15 Federico Di Gregorio + + * psycopg/psycopgmodule.c: now bails out with correct exception when one + of the needed modules can't be imported (should fix #32.) + +2005-11-14 Federico Di Gregorio + + * psycopg/typecast.c: added typecast_parse_date and typecast_parse_time + functions to do locale-safe date/time parsing. This would probably also + speed-up psycopg a little bit. + +2005-11-07 Federico Di Gregorio + + * psycopg/pqpath.c: fixed problem with uninitialized value (all this was + started by replacing calloc() calls with PyMem_Malloc().) + +2005-11-04 Federico Di Gregorio + + * psycopg/typecast.c: a lot of changes: + - made typecast a new-style type + - removed coerce code and implemented the richcompare protocol that + allows to compare objects of different types + - much better __cmp__ method that allows to compare two typecast + objects and returns True if any two of the mapped oids match + - any object that can be used as an int works as right-hand operand + in __cmp__ operations + + * psycopg/typecast_datetime.c: now typecast_PYINTERVAL_cast limit the + scan to 'len' characters in the string (should fix #65.) + +2005-11-03 Federico Di Gregorio + + * Applied patch from Daniele Varazzo to enable Decimal on Python + 2.3 when the module is available (run-time check, nice.) + +2005-10-26 Federico Di Gregorio + + * setup.cfg: added include_dirs line for SUSE 9.3. + +2005-10-22 Federico Di Gregorio + + * psycopg/cursor_type.c: added support for named cursors: + - .fetchXXX() methods now execute a FETCH if the cursor is named + - .execute() executes a DECLARE if the cursor is named + - .execute() fails if a named cursor is used in autocommit + - .executemany() can't be called on named cursors + - .scroll() executes a MOVE if the cursor is named + - .close() executes a CLOSE if the cursor is named + Also, a "transaction mark" was added to both the connection and the + cursor and an exception is raised when using a named cursor unless the + two marks correspond. + + * psycopg/connection_int.c: snprintf->PyOS_snprintf. + + * psycopg/psycopgmodule.c: snprintf->PyOS_snprintf. + + * psycopg/cursor_type.c: changed self->query type from C string to + PyObject* to better manage queries in named cursors. + + * psycopg/psycopgmodule.c: cleaned up exception names (now the errors + is printed as psycopg2.Error and not as the confusing + psycopg2._psycopg.Error.) + +2005-10-20 Federico Di Gregorio + + * lib/pool.py: renamed ThreadedConnectionPool to PersistentConnectionPool + and added a connection pool that allows multiple connections per thread + as ThreadedConnectionPool (courtesy of Daniele Varrazzo.) + +2005-10-19 Federico Di Gregorio + + * Releasing 2.0 beta 5. + + * psycopg/adapter_mxdatetime.c: reverted to old strftime method to format + mx.DateTime objects; the new method didn't worked in some corner-cases. + This makes impossible to have more than 2 decimal places for seconds but + at least we get the time right every time. + +2005-10-18 Federico Di Gregorio + + * NOTIFY is back end working. + + * psycopg/connection_type.c: fixed problem with initialization of + notifies list (also fixed small memory leak in connection dealloc.) + + * examples/notify.py: added NOTIFY example. + + * psycopg/cursor_type.c: added per-cursor type-casters dictionaries. + +2005-10-18 Federico Di Gregorio + + * psycopg/typecast.c: temporary fix to typecasting objects to return + False for any comparaison except an integer in self.values (i.e., we + don't raise an exception anymore on a coerce error.) Epydoc is now + happy. + + * psycopg/config.h: ZETA config.h patch from Charlie Clark. + + * examples/threads.py: fixed small typo: psycopg -> psycopg2. + + * Big cleanup of unsigned chars to tame gcc 4. + + * Big cleanup of module names (i.e., psycopg2._psycopg everywhere.) + + * psycopg/config.h: added fake localtime_r for platforms missing it + + * psycopg/cursor_type.c: cursors now have a FixedOffsetTimezone + tzinfo_factory by default. + + * psycopg/adapter_datetime.c: added tzinfo argument to psycopg2.Time and + psycopg2.Timestamp. Also now TimestampFromTicks sets the tzinfo object + to psycopg2.tz.LOCAL. + +2005-10-17 Federico Di Gregorio + + * psycopg/adapter_datetime.c: we now use localtime() instead of gmtime() + to accound for the local time-zone in timestamps. + + * psycopg/connection_type.c: fixed docstring for .cursor(). + + * psycopg/psycopgmodule.c: added useful docstring for .connect(). + +2005-10-08 Federico Di Gregorio + + * psycopg/connection_type.c: isolation level upper bound set to 2. + + * lib/psycopg1.py: explicitly set isolation level to 2 on .connect() + to mimic psycopg 1 behaviour. + + * psycopg/connection_int.c: now set isolation level from + default_transaction_isolation backend environment value. + + * psycopg/pqpath.c: removed serialization level 3: now everybody + (except me) has to use the mnemonics defined in psycopg2.extensions. + + * lib/extensions.py: Added mnemonics for serialization levels. + +2005-10-02 Federico Di Gregorio + + * psycopg/cursor_type.c (psyco_curs_callproc): applied callproc + patch from Matt Goodall (added a check on _psyco_curs_execute + return value and substituted malloc/free with PyMem versions.) + +2005-10-01 Federico Di Gregorio + + * psycopg/connection_int.c: fixed segfault by moving PyErr_Format + after GIL acquisition (closes: #50). + + * psycopg/connection_type.c: applied patch from Matt Goodall to + fix some doc strings. + +2005-09-23 Federico Di Gregorio + + * lib/pool.py: applied patch from piro to avoid the scan of the + whole connection array on getconn(). + +2005-09-12 Federico Di Gregorio + + * lib/pool.py: Applied psycopg->psycopg2 patch to from bug #35. + + * ZpsycopgDA/db.py: fixed problem with OperationalError that + resulted in cryptic message to Zope users ("'OperationalError' is + not defined".) + +2005-08-23 Federico Di Gregorio + + * setup.py: applied patch from Daniele Varrazzo to avoid segfaults + when compiling with migw for Python 2.4.x. + + * psycopg/adapter_mxdatetime.c (mxdatetime_str): ported code from 1.1.x + to convert mxDateTime object preserving the precision of fractional + seconds. + +2005-08-22 Federico Di Gregorio + + * ZPsycopgDA/*.py: psycopg -> psycopg2. + + * setup.py: modified to install the module components under + psycopg2 on windows too (thanks to Daniele Varrazzo.) + +2005-08-07 Federico Di Gregorio + + * psycopg/config.h: added __sun__ to the symbols checked for round() + +2005-07-21 Federico Di Gregorio + + * psycopg/adapter_datetime.c (psyco_XXXFromTicks): fixed the 1900 + years offset reported by Jeroen van Dongen (see ticket #33). + +2005-07-17 Federico Di Gregorio + + * Release 2.0 beta 4. + + * lib/extras.py (DictConnection.cursor): added DictConnection to + make easier to retrieve data in DictRows. + +2005-06-24 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_PYINTERVAL_cast): applied patch + from Geert Jansen to fix interval bug due to overflow. + +2005-06-18 Federico Di Gregorio + + * setup.cfg: some clarifications and include_dirs example for Mandrake. + + * ZPsycopgDA/DA.py: DTMLFile -> HTMLFile everywhere to fix zope + cut&paste problems. + + * MANIFEST.in: added missing files to do bdist_rpm. + + * lib/psycopg1.py: fixed .dictfetchrow() to return None if fetchone() + returns None instead of raising an exception. + + * ZPsycopgDA/icons: replaced corrupted icons with good ones. + +2005-06-13 Federico Di Gregorio + + * psycopg/psycopgmodule.c (psyco_connect): changed the port keyword + parameter type to int (instead of string); this should fix #23. + + * psycopg/cursor_type.c (_psyco_curs_execute): now checks for + empty queries and raise a ProgrammingError if appropriate (closes: + #24). + + * setup.py: psycopg module renamed to psycopg2. + +2005-06-02 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_execute): fixed segfault when + not passing string or unicode to .execute(). + +2005-06-01 Federico Di Gregorio + + * examples/fetch.py: added example about using DECLARE CURSOR. + + * psycopg/adapter_datetime.c (psyco_TimestampFromTicks): "Hmmm, + looks like someone forgot that C expects months to start counting + from 0, but the Python date routines start counting from 1." That + was me: fixed. + +2005-05-31 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_execute): if a + UnicodeEncodeError is raised during the converion of a unicode + query we let it propagate insead of segfaulting. + +2005-5-27 Federico Di Gregorio, + + * tests/types_basic.py: fixed float and binary tests. + +2005-05-26 Federico Di Gregorio + + * Release 2.0b3. + + * ZPsycopgDA/db.py (DB.convert_description): isolated description + conversion (and fixed the conversion as per #18). + + * ZPsycopgDA/DA.py: fixed again; this time Zope should work for + real. :/ Also fixed the type-casters (psycopg 2 added the extra + cursor parameter) as reported in #18. + + * psycopg/psycopgmodule.c (init_psycopg): fixed Python 2.2 build. + +2005-05-19 Federico Di Gregorio + + * Release 2.0b2. + + * lib/extras.py (DictRow): Some extra methods for DictRow. + + * psycopg/cursor_type.c (_psyco_curs_execute): added explict check + to avoid using None as bound variables (very importand for cursor + subclasses calling cursor.execute(self, query, None). + +2005-05-18 Federico Di Gregorio + + * ZPsycopgDA/DA.py (ALLOWED_PSYCOPG_VERSIONS): updated to work + with 2.0b2 only (will support only the exact version untill final + 2.0 release.) + + * setup.py: Applied combined patch from Daniele Varrazzo and Jason + Erickson to build on win32 using MSVC or mingw. + +2005-05-15 Federico Di Gregorio + + * psycopg/microprotocols.c (microprotocols_adapt): fixed memory + leak on None as suggested by gh (closes: #16). + +2005-05-10 Federico Di Gregorio + + * lib/extras.py (DictRow): we now save a reference to the index + itself and not to the cursor to avoid problems while accessing + DictRow objects after reusing the cursor for a different query + (using Kevin Jacobs db_row would be much better but DictRow is + just an example, right?) + +2005-05-09 Federico Di Gregorio + + * Release 2.0 beta 1. + + * psycopg/typecast_datetime.c (typecast_PYDATETIME_cast): fixed a + typo (pyDateTimeModuleP->pyDateTimeTypeP) that was causing errors + with infinite datetime values. + + * psycopg/adapter_binary.c (binary_str): Py_XINCREF on the buffer + that can be NULL on error. + + * psycopg/typecast_binary.*: applied slightly modified + chunk/buffer object patch to allow round-trip of buffer objects + (BYTEA columns.) + + * psycopg/cursor_type.c (psyco_curs_executemany): applied slightly + fixed patch from wrobell to allow iterators in .executemany(). + +2005-04-18 Federico Di Gregorio + + * MANIFEST.in: included debian directory. + +2005-04-10 Federico Di Gregorio + + * psycopg/adapter_list.*: added list adapter. + + * psycopg/microprotocols.c (microprotocol_getquoted): moved + _mogrify_getquoted into utility function in the microprotocols + library. + + * setup.py: Added extensive error message on missing datetime + headers. + + * Applied mingw patch from Daniele Varazzo. + +2005-04-03 Federico Di Gregorio + + * lib/psycopg1.py (connection.autocommit): added compatibility + .autocommit() method. + + * psycopg/psycopgmodule.c (psyco_connect): factory -> + connection_factory. + + * lib/psycopg1.py: added psycopg 1.1.x compatibility module. + +2005-03-29 Federico Di Gregorio + + * Applied patch to fix tuple count. + + * psycopg/pqpath.c (pq_is_busy): Staring from bug report from + Jason Erickson fixed segfaults due to calling Python function + without holding the GIL. + +2005-03-24 Federico Di Gregorio + + * psycopg/adapter_binary.c (binary_escape): propagated Andrea's + fix to binary adapter. + + * psycopg/adapter_qstring.c (qstring_quote): applied patch from + Andrea Arcangeli to fix allocation failures (>4Gb) on 64 bit + arches. + + * psycopg/typecast_array.c (typecast_array_tokenize): much better + tokenization code. + +2005-03-23 Federico Di Gregorio + + * psycopg/typecast_basic.c: all the basic casters now respect the + passed string length. + + * psycopg/typecast.c (typecast_cast): set curs->caster to self + during the type-casting. + + * psycopg/cursor_type.c: added "typecaster" attribute to the + cursor (this is safe, cursors can't be shared among threads and + the attribute is RO.) + +2005-03-22 Federico Di Gregorio + + * psycopg/typecast_array.c: added some more structure to implement + array typecasting. + + * scripts/buildtypes.py: new version to include array data. + +2005-03-15 Federico Di Gregorio + + * lib/extensions.py: Added AsIs import. + +2005-03-12 Federico Di Gregorio + + * psycopg/cursor.h: removed "qattr", not used anymore and added + "cast", holding the typecaster currently in use. + + * Release 1.99.13. + + * psycopg/cursor_type.c (psyco_curs_executemany): implemented as a + wrapper to extract python arguments and then call + _psyco_curs_execute(). + + * psycopg/cursor_type.c (_psyco_curs_execute): splitted away + python argument parsing from the real execute code, to later allow + for .executemany(). + + * psycopg/cursor_type.c (_psyco_curs_buildrow_fill): modified to + call typecast_cast(). + + * psycopg/typecast.c (typecast_call/typecast_cast): modified + typecast_call to use the new typecast_cast that avoids one string + conversion on every cast. + +2005-03-04 Federico Di Gregorio + + * Release 1.99.12.1. + + * psycopg/adapter_asis.c (asis_str): changed call to PyObject_Repr + to PyObject_Str to avoid problems with long integers. + +2005-03-03 Federico Di Gregorio + + * psycopg/typecast.h: added array casting functions. + + * scripts/maketypes.sh: does not generate pgversion.h anymore. + + * Updated all examples for the release. + +2005-03-02 Federico Di Gregorio + + * Release 1.99.12. + + * psycopg/adapter_*.c: added __conform__ to all adapters. + + * psycopg/adapter_qstring.c (qstring_quote): we now use + PyString_AsStringAndSize() instead of strlen() that would stop at + the first embedded \0 (but note that libpq quoting function will + truncate the string anyway!) + + * COPY TO implemented using both old and new (v3) protocol. + + * psycopg/pqpath.c (_pq_copy_out_v3): implemented and working. + + * psycopg/cursor_type.c (psyco_curs_copy_to): added cursor object + interface for copy_to. + + * COPY FROM implemented using both old and new (v3) protocol. + + * psycopg/config.h (Dprintf): declaration for asprintf is gone. + + * psycopg/pqpath.c (_pq_copy_in_v3): implemented. + +2005-03-01 Federico Di Gregorio + + * setup.py: now we generate a slighly more verbose version string + that embeds some of the compile options, to facilitate users' bug + reports. + + * psycopg/cursor_type.c (psyco_curs_copy_from): we now use + PyOS_snprintf instead of asprintf. On some platforms this can be + bad (win32).. if that's your case, get a better platform. :/ + + * psycopg/microprotocols.c (microprotocols_adapt): fixed small + typo that made adaptation using __conform__ impossible. + +2005-02-28 Federico Di Gregorio + + * lib/extras.py: removed AsIs adapter (now a built-in); also + removed prepare() method from the adapters that don't use it to + avoid an extra method call at mogrification time. + + * psycopg/psycopgmodule.c (psyco_adapters_init): added + initialization of the AsIs adapter (adapts int, long, float and + *wonder* None!) + + * psycopg/cursor_type.c (_mogrify_getquoted): reorganized the code + to adapt and then call .getquoted() to obtain the quoted data into + this new function. + +2005-2-27 Federico Di Gregorio + + * examples/myfirstrecipe.py: fixed adapter registration. + +2005-2-7 Federico Di Gregorio + + * setup.py: added patch by Valentino Volonghi to build on MacOS X. + +2005-01-29 Federico Di Gregorio + + * psycopg/pqpath.c (_pq_fetch_tuples): fixed scale-related + segfault (*fourth* mail from Andrea. Another couple like this and + psycopg 2 will exit alpha at warp speed.) + + * psycopg/pqpath.c (pq_fetch): _pq_copy_out_3 -> _pq_copy_out_v3 + (second and third mail from Andrea. :/) + + * psycopg/cursor_type.c (_psyco_curs_has_write_check): added check + on .write() attribute, fixed compilation problems (first mail from + Andrea Arcangeli.) + +2005-01-20 Federico Di Gregorio + + * lib/extensions.py (register_adapter): added register_adapter + function, exported ISQLQuote in psycopg.extensions. + +2005-01-18 Federico Di Gregorio + + * psycopg/pqpath.c (_pq_fetch_tuples): ported scale/precision fix + from psycopg 1.1. + + * LICENSE: detailed licensing information. Re-licensed some parts + under BSD-like to allow integration is pysqlite. + +2005-01-13 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.query + ): ported ZPsycopgDA connection fix + from psycopg 1.1. + + * lib/*.py: added pydoc-friendly messages. + +2005-01-12 Federico Di Gregorio + + * Added debian directory (thanks to W. Borgert who sent initial + patch based on cdbs.) + +2004-12-20 Federico Di Gregorio + + * psycopg/pqpath.c (pq_execute): removed multiple calls to + pq_fetch in syncronous DBAPI compatibility mode to solve rowcount + problem. + +2004-12-14 Federico Di Gregorio + + * Mm.. release 1.99.11. + + * psycopg/cursor_type.c (_psyco_curs_prefetch): fixed bug in + interaction between the .isready() method and + _psyco_curs_prefetch: isready now store away the pgres but leave + prefetch do its work. + + * psycopg/*.c: changed the names of most of the psycopg's built-in + types to replect their position in the psycopg._psycopg module. + +2004-12-10 Federico Di Gregorio + + * psycopg/cursor_type.c: now *all* write or async accesses to the + connection object are arbitrated using the connection lock. + + * psycopg/cursor_type.c (psyco_curs_isready): now we reset the + current async cursor if it is ready, to allow other cursors to + .execute() without raising the "transaction in progress" error. + + * psycopg/pqpath.c (pq_is_busy): gained status of high-level + function with its own blocking and locking. + + * psycopg/cursor.h (EXC_IF_CURS_CLOSED): also checks the + connection (a closed connection implies a closed cursor.) + + * psycopg/cursor_type.c: cursor's connection is correctly + INCREFfed and DECREFfed. + + * psycopg/connection_type.c: removed the cursors list from the + connection object. It is not necessary anymore for the connection + to know about the cursors and the reference counting will keep the + connection alive (but possibly closed) until all cursors are + garbage collected. + +2004-11-20 Federico Di Gregorio + + * psycopg/cursor_type.c (_mogrify): ported %% fix from 1.1.15. + +2004-11-20 Federico Di Gregorio + + * psycopg/cursor_type.c (psyco_curs_execute): added check to raise an + exception if a cursor tries to .execute() while an async query is + already in execution froma different cursor. + +2004-11-20 Federico Di Gregorio + + * psycopg/connection_type.c (psyco_conn_cursor): renamed 'cursor' + argument to 'cursor_factory'. + +2004-11-19 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_buildrow_fill): now standard + tuples are filled using PyTuple_SET_ITEM while extended types + (created via row_factory) are filled using PySequence_SetItem. + + * psycopg/cursor_type.c: changed cursor attribute name from + tuple_factory to row_factory. + +2004-10-14 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_buildrow_fill): now we use + PySequence_SetItem to avoid problems with containers created from + cursor's .tuple_factory attribute. + + * lib/extras.py (DictCursor.execute): fixed stupid bug with cursor + setting self.tuplefactory instead of self.tuple_factory. + +2004-10-02 Federico Di Gregorio + + * Release 1.99.10. + + * psycopg/cursor_type.c (_psyco_curs_buildrow_*): unified normal + and factory code into the _psyco_curs_buildrow_fill function; no + more memory leaks here. + + * psycopg/config.h (round): added check for __FreeBSD__ (that + should be defined when compiling with gcc, I hope.) + + * setup.py: removed a lot of code now in setup.cfg. + +2004-09-24 Federico Di Gregorio + + * psycopg/cursor_type.c (cursor_dealloc): fixed small memory leak + due to missing disposal of self->pgres. + +2004-9-14 Federico Di Gregorio + + * examples/dialtone.py: Added adapt() example by Valentino + Volonghi. + +2004-09-14 Federico Di Gregorio + + * psycopg/microprotocols.c (microprotocols_adapt): lots of changes + to the microprotocols layer (it is not micro anymore); + implementing almost all the PEP 246. The adapter registry is now + indexed by (type, protocol) and not by type alone. + +2004-09-13 Federico Di Gregorio + + * psycopg/cursor_type.c (_mogrify): and qattr is gone. + +2004-09-05 Federico Di Gregorio + + * Release 1.99.9 (or, the "twisting by the pool" release). + + * psycopg/pqpath.c (_pq_fetch_tuples): changed to "static void" + instead of "static int", no ways for this function to fail. + +2004-09-04 Federico Di Gregorio + + * psycopg/pqpath.c (_pq_fetch_tuples): ported rowcount fix from + 1.1.15. + + * ZPsycopgDA/*: ZPsycopgDA back in action, using the new pooling + code. + +2004-08-29 Federico Di Gregorio + + * psycopg/typecast_basic.c (typecast_DECIMAL_cast): added DECIMAL + typecaster; it even works :). + + * scripts/buildtypes.py (basic_types): added DECIMAL typecaster + for the NUMERIC oid. + + * examples/threads.py: updated threads example to use pooling code. + + * lib/pool.py: added very simple and thread-safe connection + pooling class. + + * psycopg/cursor_type.c (psyco_curs_fetchmany): fixed problem with + .fetchall() and .fetchmany() returning None instead of [] on empty + result sets. + + * Release 1.99.8. + +2004-08-28 Federico Di Gregorio + + * psycopg/cursor_type.c (psyco_curs_execute): added processing of + unicode queries. + + * examples/encoding.py: much better encoding example, also using + the new UNICODE typecaster. + + * psycopg/typecast_basic.c (typecast_UNICODE_cast): added UNICODE + typecaster. + + * lib/extensions.py: the encodings dictionary is not available by + default but can be accessed from the psycopg.extensions module. + + * psycopg/adapter_qstring.h: remove encoding information from + qstring adapter and moved it into psycopg module. + +2004-08-26 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_prefetch): added check for + asynchronous fetch by wrong cursor. + + * psycopg/pqpath.c (pq_fetch): fixed backend status message (bug + reported by Daniele Varrazzo.) + +2004-07-29 Federico Di Gregorio + + * psycopg/typecast_basic.c (typecast_BINARY_cast): reverted to + using strings instead of buffers when converting postgresql binary + objects (should *temporarily* fix corruption bug reported on + win32.) + +2004-07-21 Federico Di Gregorio + + * psycopg/cursor_type.c: removed __iter__ and next methods from + object methods and moved them where they do belong (tp_iter and + tp_iternext.) Bug reported by Daniele Varrazzo (again!) + +2004-07-19 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_PYINTERVAL_cast): replaced + round() with micro() when rounding seconds (fixes bugs reported by + Daniele Varrazzo.) + +2004-07-16 Federico Di Gregorio + + * psycopg/pqpath.c (pq_set_critical): allow for a custom message + insted of the one from PQerrorMessage. + (pq_resolve_critical): added argument to specify if connection is + to be closed (used to not close it during COPY FROM/TO criticals.) + + * psycopg/cursor_type.c (psyco_curs_fileno, psyco_curs_isready): + added extension methods related to async queries. + +2004-07-15 Federico Di Gregorio + + * Release 1.99.7. + + * examples/tz.py: added example about time zones. + + * psycopg/typecast_datetime.c (typecast_PYDATETIME_cast): create + FixedOffsetTimezone for postgresql "timestamp with time zone" + types. + + * lib/tz.py: added (even more than) needed tzinfo classes. + + * psycopg/typecast.c (typecast_call): changed typecast call code + to take the additional cursor parameter, needed for + cursor-dependent type casting (tzinfo & friends.) + + * psycopg/cursor_type.c (_psyco_curs_buildrow_with_factory): added + use of tuple factories to fetcXXX methods. + + * lib/extras.py: little extra goodies for psycopg. + +2004-07-14 Federico Di Gregorio + + * Release 1.99.6. + + * psycopg/connection_type.c: added .dsn attribute to connection + objects. + + * psycopg/cursor_type.c (psyco_curs_mogrify): added .mogrify() + method. + + * psycopg/adapter_qstring.c: copy the connection encoding only if + wrapped object is unicode and added table of encodings. + +2004-07-13 Federico Di Gregorio + + * psycopg/cursor_type.c (_mogrify): moved Dprintf statement to + avoid dereferencing empty pointer (from 1.1.x) + (psyco_curs_execute): now we save the query in self->query instead + of freeing the memory ASAP. + (cursorObject_members): and we finally export the saved query + through the cursor members interface. that's all folks. + + * lib/extensions.py: added extensions module to clearly separate + psycopg own extensions from DBAPI-2.0 + +2004-07-10 Federico Di Gregorio + + * psycopg/typecast_datetime.c: ported interval fix from 1.1.x. + +2004-05-16 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_*_cast): fixed Value error + when seconds > 59 by setting minutes += 1 and seconds -= 60 + (reported by Marcel Gsteiger.) + +2004-04-24 Federico Di Gregorio + + * ported time interval patch by Ross Cohen from 1.1.12. + +2004-04-19 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_PYDATE_cast): applied + patch from Jason Erickson: min and max taken from datetime.Date + type. + +2004-04-18 Federico Di Gregorio + + * Applied changes from Jason Erickson to build on win32; see his + (slightly edited) entry below. (Still builds on Linux :) + + * psycopg/*.c: removed inclusion of pthread.h from all files + except psycopg/config.h to build on win32 without faking the file. + +2004-04-15 Jason Erickson + + * setup.py: Various changes. The critical ones: + - Make an empty pthread.h file so all the code doing an + #include will find something. + - Appended the winsock2 library and the PostgreSQL library to + the library path. + - Setup the include path. + - Have the PSYCOPG_VERSION macro be included with quotes. + + * config.h: Added/Cleaned up Win32 includes, defines, stub functions. + + * typecast.h: Removed ';' after PyObject_HEAD in the + typecastObject structure since Microsoft Visual Studio does not + like it. + +2004-04-15 Federico Di Gregorio + + * Release 1.99.5 (bug-fixing and reorganization) + + * setup.py et al.: moved psycopg to psycopg._psycopg to make + easier to provide high level python-only utilities (like the + promised pooling code). psycopg/__init__.py imports _psycopg and + make all the default DBAPI-2.0 stuff available. + +2004-04-14 Federico Di Gregorio + + * psycopg/psycopgmodule.c (initpsycopg): wrapped initialization of + date/time adapters in #ifdefs to have psycopg compile without mx + or builtin datetime. + +2004-04-10 Federico Di Gregorio + + * Release 1.99.4. + +2004-04-09 Federico Di Gregorio + + * psycopg/typecast_builtins.c: changed DATE to not include + DATETIME types anymore. + + * psycopg/adapter_datetime.c (pydatetime_str): switched from + strftime to isoformat to preserve fractional seconds. + +2004-04-08 Federico Di Gregorio + + * psycopg/psycopgmodule.c (psyco_connect): ported sslmode + parameter from 1.1 branch. + + * psycopg/adapter_datetime.*: added python built-in datetime + adapters. also added the datetime typecasters (still using mx as + default). + + * psycopg/typecast.h: removed aliases, they now live in the right + typecast_xxx.c file. + +2004-03-08 Federico Di Gregorio + + * Release 1.99.3 (alpha 4). + + * examples/lastrowid.py: and the .lastrowid example is in. + + * psycopg/cursor_type.c (_mogrify): added call to .prepare() + method in both dict and sequence path. + + * psycopg/connection_int.c (conn_set_client_encoding): added + encoding-change code. + + * psycopg/adapter_qstring.c (qstring_quote): added hard-coded + support for utf8 and latin1 encodings. + +2004-03-01 Federico Di Gregorio + + * psycopg/connection_int.c (conn_close): does not use libpq + functions on NULL pgconn (this can happen when conn_close is + called after a failed PQconnect.) + +2004-02-29 Federico Di Gregorio + + * Release 1.99.2 (alpha 3). + + * psycopg/cursor_type.c: added .rownumber and .connection + attributes. Also added .scroll(), .next() and .__iter__() methods + (see DBAPI2-.0 extensions on PEP.) + + * psycopg/connection_type.c (psyco_conn_set_isolation_level): + added connection method .set_isolation_level(). Also added all + error objects to the connection (see DBAPI2-.0 extensions on PEP.) + + * psycopg/connection_int.c (conn_switch_isolation_level): added + isolation level switching code. + + * setup.py: removed all references to PSYCOPG_NEWSTYLE: support + for python < 2.2 has been dropped. + + * typecast_basic.c (typecast_BINARY_cast): now binary objects are + returned as true buffers. + + * adapter_binary.*: added adapter for buffers and binary (bytea) + objects. + + * Release 1.99.1 (alpha 2). + + * adapter_mxdatetime.*: added adapters for all mx.DateTime types. + +2004-02-28 Federico Di Gregorio + + * cursor_type.c (_mogrify): complete rework of the mogrification + code to use the microprotocols_adapt function. + + * typecast_basic.c (typecast_BOOLEAN_cast): we now return real + Py_True and Py_False values. + + * microprotocols.h: added very simple microprotocols + implementation to allow for python->postgresql types registry. + +2004-01-05 Federico Di Gregorio + + * connection_int.c (conn_commit/conn_rollback): added code to + commit/rollback and connection methods. + +2004-01-04 Federico Di Gregorio + + * cursor_type.c (psyco_curs_fetchone): added fetchone method. + +2004-01-03 Federico Di Gregorio + + * added (empty) INSTALL file. + + * cursor_type.c (cursor_dealloc): added qattr for custom object + quoting using a callable attribute. + (_mogrify): ported new, fixed mogrification code from 1.1.12. + +2003-08-01 Federico Di Gregorio + + * cursor_type.c (_mogrify_sequence): added sequence mogrification, + can be done better, on the dict model. + +2003-07-28 Federico Di Gregorio + + * typeobj_qstring.c: added quoted strings (can use both own code, + like psycopg 1.x or PQescapeString from lipq.) + +2003-07-21 Federico Di Gregorio + + * connection_type.c (psyco_conn_close): added .close() + method. wow. + + * cursor_*.c: added basic cursor interface (new-style.) + +2003-07-20 Federico Di Gregorio + + * psycopg/*: beginning of new source layout. if you think this + changelog is somewhat empty, you're right. look at + doc/ChangeLog-1.x for psycopg 1.x changelog just before the + branch. + + diff --git a/psycopg2/INSTALL b/psycopg2/INSTALL new file mode 100644 index 0000000..873dbfa --- /dev/null +++ b/psycopg2/INSTALL @@ -0,0 +1,48 @@ +Compiling and installing psycopg +******************************** + +** Important note: if you plan to use psyopg2 in a multithreaed application + make sure that your libpq has been compiled with the --with-thread-safety + option. psycopg2 will work correctly even with a non-thread-safe libpq but + libpq will leak memory. + +While psycopg 1.x used autoconf for its build process psycopg 2 switched to +the more pythoning setup.py. Currently both psycopg's author and distutils +have some limitations so the file setup.cfg is almost unused and most build +options are hidden in setup.py. Before building psycopg look at setup.cfg file +and change any settings to follow your system (or taste); then: + + python setup.py build + +to build in the local directory; and: + + python setup.py install + +to install system-wide. + + +Using setuptools and EasyInstall +================================ + +If setuptools are installed on your system you can easily create an egg for +psycopg and install it. Download the source distribution (if you're reading +this file you probably already have) and then edit setup.cfg to your taste +and build from the source distribution top-level directory using: + + easy_install . + + +Compiling under Windows with mingw32 +==================================== + +You can compile psycopg under Windows platform with mingw32 +(http://www.mingw.org/) compiler. MinGW is also shipped with IDEs such as +Dev-C++ (http://www.bloodshed.net/devcpp.html) and Code::Blocks +(http://www.codeblocks.org). gcc binaries should be in your PATH. + +You need a PostgreSQL with include and libary files installed. At least v8.0 is required. + +First you need to create a libpython2X.a as described in +http://starship.python.net/crew/kernr/mingw32/Notes.html. Then run: + + python setup.py build_ext --compiler=mingw32 install diff --git a/psycopg2/LICENSE b/psycopg2/LICENSE new file mode 100644 index 0000000..b20b282 --- /dev/null +++ b/psycopg2/LICENSE @@ -0,0 +1,60 @@ +psycopg and the GPL +=================== + +psycopg 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. See file COPYING for details. + +As a special exception, specific permission is granted for the GPLed +code in this distribition to be linked to OpenSSL and PostgreSQL libpq +without invoking GPL clause 2(b). + +Note that the GPL was chosen to avoid proprietary adapters based on +psycopg code. Using psycopg in a proprietary product (even bundling +psycopg with the proprietary product) is fine as long as: + + 1. psycopg is called from Python only using only the provided API + (i.e., no linking with C code and no C modules based on it); and + + 2. all the other points of the GPL are respected (you offer a copy + of psycopg's source code, and so on.) + +Alternative licenses +==================== + +If you prefer you can use the Zope Database Adapter ZPsycopgDA (i.e., +every file inside the ZPsycopgDA directory) user the ZPL license as +published on the Zope web site, http://www.zope.org/Resources/ZPL. + +Also, the following BSD-like license applies (at your option) to the +files following the pattern psycopg/adapter*.{h,c} and +psycopg/microprotocol*.{h,c}: + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product documentation + would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + +psycopg 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. + +Proprietary licenses +==================== + +A non-exclusive license is available for companies that want to include +psycopg in their proprietary products without respecting the spirit of the +GPL. The price of the license is one day of development done by the author, +at the consulting fee he applies to his usual customers at the day of the +request. diff --git a/psycopg2/MANIFEST b/psycopg2/MANIFEST new file mode 100644 index 0000000..c8538ea --- /dev/null +++ b/psycopg2/MANIFEST @@ -0,0 +1,222 @@ +AUTHORS +ChangeLog +INSTALL +LICENSE +MANIFEST +MANIFEST.in +README +setup.cfg +setup.py +ZPsycopgDA/DA.py +ZPsycopgDA/__init__.py +ZPsycopgDA/db.py +ZPsycopgDA/pool.py +ZPsycopgDA/dtml/add.dtml +ZPsycopgDA/dtml/browse.dtml +ZPsycopgDA/dtml/edit.dtml +ZPsycopgDA/dtml/table_info.dtml +ZPsycopgDA/icons/bin.gif +ZPsycopgDA/icons/date.gif +ZPsycopgDA/icons/datetime.gif +ZPsycopgDA/icons/field.gif +ZPsycopgDA/icons/float.gif +ZPsycopgDA/icons/int.gif +ZPsycopgDA/icons/stable.gif +ZPsycopgDA/icons/table.gif +ZPsycopgDA/icons/text.gif +ZPsycopgDA/icons/time.gif +ZPsycopgDA/icons/view.gif +ZPsycopgDA/icons/what.gif +debian/changelog +debian/control +debian/copyright +debian/rules +doc/ChangeLog-1.x +doc/HACKING +doc/SUCCESS +doc/TODO +doc/api-screen.css +doc/async.txt +doc/extensions.html +doc/extensions.rst +doc/api/epydoc.css +doc/api/index.html +doc/api/private/__builtin__.list-class.html +doc/api/private/__builtin__.object-class.html +doc/api/private/__builtin__.type-class.html +doc/api/private/datetime.tzinfo-class.html +doc/api/private/epydoc.css +doc/api/private/exceptions.Exception-class.html +doc/api/private/exceptions.StandardError-class.html +doc/api/private/frames.html +doc/api/private/help.html +doc/api/private/index.html +doc/api/private/indices.html +doc/api/private/psycopg2-module.html +doc/api/private/psycopg2.DataError-class.html +doc/api/private/psycopg2.DatabaseError-class.html +doc/api/private/psycopg2.Error-class.html +doc/api/private/psycopg2.IntegrityError-class.html +doc/api/private/psycopg2.InterfaceError-class.html +doc/api/private/psycopg2.InternalError-class.html +doc/api/private/psycopg2.NotSupportedError-class.html +doc/api/private/psycopg2.OperationalError-class.html +doc/api/private/psycopg2.ProgrammingError-class.html +doc/api/private/psycopg2.Warning-class.html +doc/api/private/psycopg2._psycopg-module.html +doc/api/private/psycopg2._psycopg.ISQLQuote-class.html +doc/api/private/psycopg2._psycopg.connection-class.html +doc/api/private/psycopg2._psycopg.cursor-class.html +doc/api/private/psycopg2.extensions-module.html +doc/api/private/psycopg2.extras-module.html +doc/api/private/psycopg2.extras.DictConnection-class.html +doc/api/private/psycopg2.extras.DictCursor-class.html +doc/api/private/psycopg2.extras.DictRow-class.html +doc/api/private/psycopg2.extras.SQL_IN-class.html +doc/api/private/psycopg2.pool-module.html +doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html +doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html +doc/api/private/psycopg2.pool.PoolError-class.html +doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html +doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html +doc/api/private/psycopg2.psycopg1-module.html +doc/api/private/psycopg2.psycopg1.connection-class.html +doc/api/private/psycopg2.psycopg1.cursor-class.html +doc/api/private/psycopg2.tz-module.html +doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html +doc/api/private/psycopg2.tz.LocalTimezone-class.html +doc/api/private/toc-everything.html +doc/api/private/toc-psycopg2-module.html +doc/api/private/toc-psycopg2._psycopg-module.html +doc/api/private/toc-psycopg2.extensions-module.html +doc/api/private/toc-psycopg2.extras-module.html +doc/api/private/toc-psycopg2.pool-module.html +doc/api/private/toc-psycopg2.psycopg1-module.html +doc/api/private/toc-psycopg2.tz-module.html +doc/api/private/toc.html +doc/api/private/trees.html +doc/api/public/__builtin__.list-class.html +doc/api/public/__builtin__.object-class.html +doc/api/public/__builtin__.type-class.html +doc/api/public/datetime.tzinfo-class.html +doc/api/public/epydoc.css +doc/api/public/exceptions.Exception-class.html +doc/api/public/exceptions.StandardError-class.html +doc/api/public/frames.html +doc/api/public/help.html +doc/api/public/index.html +doc/api/public/indices.html +doc/api/public/psycopg2-module.html +doc/api/public/psycopg2.DataError-class.html +doc/api/public/psycopg2.DatabaseError-class.html +doc/api/public/psycopg2.Error-class.html +doc/api/public/psycopg2.IntegrityError-class.html +doc/api/public/psycopg2.InterfaceError-class.html +doc/api/public/psycopg2.InternalError-class.html +doc/api/public/psycopg2.NotSupportedError-class.html +doc/api/public/psycopg2.OperationalError-class.html +doc/api/public/psycopg2.ProgrammingError-class.html +doc/api/public/psycopg2.Warning-class.html +doc/api/public/psycopg2._psycopg-module.html +doc/api/public/psycopg2.extensions-module.html +doc/api/public/psycopg2.extras-module.html +doc/api/public/psycopg2.extras.DictConnection-class.html +doc/api/public/psycopg2.extras.DictCursor-class.html +doc/api/public/psycopg2.extras.DictRow-class.html +doc/api/public/psycopg2.extras.SQL_IN-class.html +doc/api/public/psycopg2.pool-module.html +doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html +doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html +doc/api/public/psycopg2.pool.PoolError-class.html +doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html +doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html +doc/api/public/psycopg2.psycopg1-module.html +doc/api/public/psycopg2.psycopg1.connection-class.html +doc/api/public/psycopg2.psycopg1.cursor-class.html +doc/api/public/psycopg2.tz-module.html +doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html +doc/api/public/psycopg2.tz.LocalTimezone-class.html +doc/api/public/toc-everything.html +doc/api/public/toc-psycopg2-module.html +doc/api/public/toc-psycopg2._psycopg-module.html +doc/api/public/toc-psycopg2.extensions-module.html +doc/api/public/toc-psycopg2.extras-module.html +doc/api/public/toc-psycopg2.pool-module.html +doc/api/public/toc-psycopg2.psycopg1-module.html +doc/api/public/toc-psycopg2.tz-module.html +doc/api/public/toc.html +doc/api/public/trees.html +examples/binary.py +examples/copy_from.py +examples/copy_to.py +examples/cursor.py +examples/dialtone.py +examples/dict.py +examples/dt.py +examples/encoding.py +examples/fetch.py +examples/lastrowid.py +examples/mogrify.py +examples/myfirstrecipe.py +examples/notify.py +examples/simple.py +examples/somehackers.jpg +examples/threads.py +examples/tz.py +examples/usercast.py +examples/whereareyou.jpg +lib/__init__.py +lib/extensions.py +lib/extras.py +lib/pool.py +lib/psycopg1.py +lib/tz.py +psycopg/adapter_asis.c +psycopg/adapter_asis.h +psycopg/adapter_binary.c +psycopg/adapter_binary.h +psycopg/adapter_datetime.c +psycopg/adapter_datetime.h +psycopg/adapter_list.c +psycopg/adapter_list.h +psycopg/adapter_mxdatetime.c +psycopg/adapter_mxdatetime.h +psycopg/adapter_pboolean.c +psycopg/adapter_pboolean.h +psycopg/adapter_qstring.c +psycopg/adapter_qstring.h +psycopg/config.h +psycopg/connection.h +psycopg/connection_int.c +psycopg/connection_type.c +psycopg/cursor.h +psycopg/cursor_int.c +psycopg/cursor_type.c +psycopg/microprotocols.c +psycopg/microprotocols.h +psycopg/microprotocols_proto.c +psycopg/microprotocols_proto.h +psycopg/pgtypes.h +psycopg/pgversion.h +psycopg/pqpath.c +psycopg/pqpath.h +psycopg/psycopg.h +psycopg/psycopgmodule.c +psycopg/python.h +psycopg/typecast.c +psycopg/typecast.h +psycopg/typecast_array.c +psycopg/typecast_basic.c +psycopg/typecast_binary.c +psycopg/typecast_binary.h +psycopg/typecast_builtins.c +psycopg/typecast_datetime.c +psycopg/typecast_mxdatetime.c +scripts/buildtypes.py +scripts/ext2html.py +scripts/makedocs.py +scripts/maketypes.sh +tests/dbapi20.py +tests/extras_dictcursor.py +tests/test_psycopg2_dbapi20.py +tests/types_basic.py diff --git a/psycopg2/MANIFEST.in b/psycopg2/MANIFEST.in new file mode 100644 index 0000000..457004c --- /dev/null +++ b/psycopg2/MANIFEST.in @@ -0,0 +1,12 @@ +recursive-include psycopg *.c *.h +recursive-include lib *.py +recursive-include tests *.py +recursive-include ZPsycopgDA *.py *.gif *.dtml +recursive-include examples *.py somehackers.jpg whereareyou.jpg +recursive-include debian * +recursive-include doc TODO HACKING SUCCESS ChangeLog-1.x async.txt +recursive-include scripts *.py *.sh +include scripts/maketypes.sh scripts/buildtypes.py +include AUTHORS README INSTALL LICENSE ChangeLog +include PKG-INFO MANIFEST.in MANIFEST setup.py setup.cfg +recursive-include doc *.rst *.css *.html diff --git a/psycopg2/PKG-INFO b/psycopg2/PKG-INFO new file mode 100644 index 0000000..2fab953 --- /dev/null +++ b/psycopg2/PKG-INFO @@ -0,0 +1,35 @@ +Metadata-Version: 1.0 +Name: psycopg2 +Version: 2.0.5.1 +Summary: Python-PostgreSQL Database Adapter +Home-page: http://initd.org/tracker/psycopg +Author: Federico Di Gregorio +Author-email: fog@initd.org +License: GPL with exceptions or ZPL +Download-URL: http://initd.org/pub/software/psycopg2 +Description: psycopg is a PostgreSQL database adapter for the Python programming + language. This is version 2, a complete rewrite of the original code to + provide new-style classes for connection and cursor objects and other sweet + candies. Like the original, psycopg 2 was written with the aim of being + very small and fast, and stable as a rock. + + psycopg is different from the other database adapter because it was + designed for heavily multi-threaded applications that create and destroy + lots of cursors and make a conspicuous number of concurrent INSERTs or + UPDATEs. psycopg 2 also provide full asycronous operations for the really + brave programmer. + +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU General Public License (GPL) +Classifier: License :: OSI Approved :: Zope Public License +Classifier: Programming Language :: Python +Classifier: Programming Language :: C +Classifier: Programming Language :: SQL +Classifier: Topic :: Database +Classifier: Topic :: Database :: Front-Ends +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: Unix diff --git a/psycopg2/README b/psycopg2/README new file mode 100644 index 0000000..4e4a0e9 --- /dev/null +++ b/psycopg2/README @@ -0,0 +1,39 @@ +psycopg - Python-PostgreSQL Database Adapter +******************************************** + +psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other +sweet candies. Like the original, psycopg 2 was written with the aim of +being very small and fast, and stable as a rock. + +psycopg is different from the other database adapter because it was +designed for heavily multi-threaded applications that create and destroy +lots of cursors and make a conspicuous number of concurrent INSERTs or +UPDATEs. psycopg 2 also provide full asycronous operations for the really +brave programmer. + +There are confirmed reports of psycopg 1.x compiling and running on Linux +and FreeBSD on i386, Solaris, MacOS X and win32 architectures. psycopg 2 +does not introduce build-wise incompatible changes so it should be able to +compile on all architectures just as its predecessor did. + +Now go read the INSTALL file. More information about psycopg extensions to +the DBAPI-2.0 is available in the files located in the doc/ direcory. + +psycopg is free software ("free as in freedom" but I like beer too.) +Licensing information is available in the LICENSE file. + + +Contributors +------------ + +A short list of contributors to psycopg2 follows (if you feel you belong +to this list and you can't find yourself here just drop me a mail): + + * Kudos to piro for all the documentation work. + + * Peter Fein contributed a logging connection/cursor class that even if it + was not used directly heavily influenced the implementation currently in + psycopg2.extras. + diff --git a/psycopg2/ZPsycopgDA/DA.py b/psycopg2/ZPsycopgDA/DA.py new file mode 100644 index 0000000..2a0f4dd --- /dev/null +++ b/psycopg2/ZPsycopgDA/DA.py @@ -0,0 +1,375 @@ +# ZPsycopgDA/DA.py - ZPsycopgDA Zope product: Database Connection +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + + +ALLOWED_PSYCOPG_VERSIONS = ('2.0.1', '2.0.2', '2.0.3', '2.0.4', '2.0.5') + +import sys +import time +import db +import re + +import Acquisition +import Shared.DC.ZRDB.Connection + +from db import DB +from Globals import HTMLFile +from ExtensionClass import Base +from App.Dialogs import MessageDialog +from DateTime import DateTime + +# Build Zope version in a float for later cheks +import App +zope_version = App.version_txt.getZopeVersion() +zope_version = float("%s.%s" %(zope_version[:2])) + +# ImageFile is deprecated in Zope >= 2.9 +if zope_version < 2.9: + from ImageFile import ImageFile +else: + from App.ImageFile import ImageFile + +# import psycopg and functions/singletons needed for date/time conversions + +import psycopg2 +from psycopg2 import NUMBER, STRING, ROWID, DATETIME +from psycopg2.extensions import INTEGER, LONGINTEGER, FLOAT, BOOLEAN, DATE +from psycopg2.extensions import TIME, INTERVAL +from psycopg2.extensions import new_type, register_type + + +# add a new connection to a folder + +manage_addZPsycopgConnectionForm = HTMLFile('dtml/add',globals()) + +def manage_addZPsycopgConnection(self, id, title, connection_string, + zdatetime=None, tilevel=2, + check=None, REQUEST=None): + """Add a DB connection to a folder.""" + self._setObject(id, Connection(id, title, connection_string, + zdatetime, check, tilevel)) + if REQUEST is not None: return self.manage_main(self, REQUEST) + + +# the connection object + +class Connection(Shared.DC.ZRDB.Connection.Connection): + """ZPsycopg Connection.""" + _isAnSQLConnection = 1 + + id = 'Psycopg2_database_connection' + database_type = 'Psycopg2' + meta_type = title = 'Z Psycopg 2 Database Connection' + icon = 'misc_/conn' + + def __init__(self, id, title, connection_string, + zdatetime, check=None, tilevel=2, encoding=''): + self.zdatetime = zdatetime + self.id = str(id) + self.edit(title, connection_string, zdatetime, + check=check, tilevel=tilevel, encoding=encoding) + + def factory(self): + return DB + + ## connection parameters editing ## + + def edit(self, title, connection_string, + zdatetime, check=None, tilevel=2, encoding=''): + self.title = title + self.connection_string = connection_string + self.zdatetime = zdatetime + self.tilevel = tilevel + self.encoding = encoding + + self.set_type_casts() + + if check: self.connect(self.connection_string) + + manage_properties = HTMLFile('dtml/edit', globals()) + + def manage_edit(self, title, connection_string, + zdatetime=None, check=None, tilevel=2, encoding='UTF-8', + REQUEST=None): + """Edit the DB connection.""" + self.edit(title, connection_string, zdatetime, + check=check, tilevel=tilevel, encoding=encoding) + if REQUEST is not None: + msg = "Connection edited." + return self.manage_main(self,REQUEST,manage_tabs_message=msg) + + def connect(self, s): + try: + self._v_database_connection.close() + except: + pass + + # check psycopg version and raise exception if does not match + if psycopg2.__version__[:5] not in ALLOWED_PSYCOPG_VERSIONS: + raise ImportError("psycopg version mismatch (imported %s)" % + psycopg2.__version__) + + self.set_type_casts() + self._v_connected = '' + dbf = self.factory() + + # TODO: let the psycopg exception propagate, or not? + self._v_database_connection = dbf( + self.connection_string, self.tilevel, self.encoding) + self._v_database_connection.open() + self._v_connected = DateTime() + + return self + + def set_type_casts(self): + # note that in both cases order *is* important + if self.zdatetime: + # use zope internal datetime routines + register_type(ZDATETIME) + register_type(ZDATE) + register_type(ZTIME) + else: + # use the standard + register_type(DATETIME) + register_type(DATE) + register_type(TIME) + + ## browsing and table/column management ## + + manage_options = Shared.DC.ZRDB.Connection.Connection.manage_options + # + ( + # {'label': 'Browse', 'action':'manage_browse'},) + + #manage_tables = HTMLFile('dtml/tables', globals()) + #manage_browse = HTMLFile('dtml/browse', globals()) + + info = None + + def table_info(self): + return self._v_database_connection.table_info() + + + def __getitem__(self, name): + if name == 'tableNamed': + if not hasattr(self, '_v_tables'): self.tpValues() + return self._v_tables.__of__(self) + raise KeyError, name + + def tpValues(self): + res = [] + conn = self._v_database_connection + for d in conn.tables(rdb=0): + try: + name = d['TABLE_NAME'] + b = TableBrowser() + b.__name__ = name + b._d = d + b._c = c + try: + b.icon = table_icons[d['TABLE_TYPE']] + except: + pass + r.append(b) + except: + pass + return res + + +## database connection registration data ## + +classes = (Connection,) + +meta_types = ({'name':'Z Psycopg 2 Database Connection', + 'action':'manage_addZPsycopgConnectionForm'},) + +folder_methods = { + 'manage_addZPsycopgConnection': manage_addZPsycopgConnection, + 'manage_addZPsycopgConnectionForm': manage_addZPsycopgConnectionForm} + +__ac_permissions__ = ( + ('Add Z Psycopg Database Connections', + ('manage_addZPsycopgConnectionForm', 'manage_addZPsycopgConnection')),) + +# add icons + +misc_={'conn': ImageFile('Shared/DC/ZRDB/www/DBAdapterFolder_icon.gif')} + +for icon in ('table', 'view', 'stable', 'what', 'field', 'text', 'bin', + 'int', 'float', 'date', 'time', 'datetime'): + misc_[icon] = ImageFile('icons/%s.gif' % icon, globals()) + + +## zope-specific psycopg typecasters ## + +# convert an ISO timestamp string from postgres to a Zope DateTime object +def _cast_DateTime(iso, curs): + if iso: + return DateTime(re.split("GMT\+?|GMT-?", iso)[0]) + + # this will split us into [date, time, GMT/AM/PM(if there)] + # dt = str.split(' ') + # if len(dt) > 1: + # # we now should split out any timezone info + # dt[1] = dt[1].split('-')[0] + # dt[1] = dt[1].split('+')[0] + # return DateTime(' '.join(dt[:2])) + # else: + # return DateTime(dt[0]) + +# convert an ISO date string from postgres to a Zope DateTime object +def _cast_Date(iso, curs): + if iso: + return DateTime(iso) + +# Convert a time string from postgres to a Zope DateTime object. +# NOTE: we set the day as today before feeding to DateTime so +# that it has the same DST settings. +def _cast_Time(iso, curs): + if iso: + return DateTime(time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(time.time())[:3]+ + time.strptime(iso[:8], "%H:%M:%S")[3:])) + +# NOTE: we don't cast intervals anymore because they are passed +# untouched to Zope. +def _cast_Interval(iso, curs): + return iso + +ZDATETIME = new_type((1184, 1114), "ZDATETIME", _cast_DateTime) +ZINTERVAL = new_type((1186,), "ZINTERVAL", _cast_Interval) +ZDATE = new_type((1082,), "ZDATE", _cast_Date) +ZTIME = new_type((1083,), "ZTIME", _cast_Time) + + +## table browsing helpers ## + +class TableBrowserCollection(Acquisition.Implicit): + pass + +class Browser(Base): + def __getattr__(self, name): + try: + return self._d[name] + except KeyError: + raise AttributeError, name + +class values: + def len(self): + return 1 + + def __getitem__(self, i): + try: + return self._d[i] + except AttributeError: + pass + self._d = self._f() + return self._d[i] + +class TableBrowser(Browser, Acquisition.Implicit): + icon = 'what' + Description = check = '' + info = HTMLFile('table_info', globals()) + menu = HTMLFile('table_menu', globals()) + + def tpValues(self): + v = values() + v._f = self.tpValues_ + return v + + def tpValues_(self): + r=[] + tname=self.__name__ + for d in self._c.columns(tname): + b=ColumnBrowser() + b._d=d + try: b.icon=field_icons[d['Type']] + except: pass + b.TABLE_NAME=tname + r.append(b) + return r + + def tpId(self): return self._d['TABLE_NAME'] + def tpURL(self): return "Table/%s" % self._d['TABLE_NAME'] + def Name(self): return self._d['TABLE_NAME'] + def Type(self): return self._d['TABLE_TYPE'] + + manage_designInput=HTMLFile('designInput',globals()) + def manage_buildInput(self, id, source, default, REQUEST=None): + "Create a database method for an input form" + args=[] + values=[] + names=[] + columns=self._columns + for i in range(len(source)): + s=source[i] + if s=='Null': continue + c=columns[i] + d=default[i] + t=c['Type'] + n=c['Name'] + names.append(n) + if s=='Argument': + values.append("'" % + (n, vartype(t))) + a='%s%s' % (n, boboType(t)) + if d: a="%s=%s" % (a,d) + args.append(a) + elif s=='Property': + values.append("'" % + (n, vartype(t))) + else: + if isStringType(t): + if find(d,"\'") >= 0: d=join(split(d,"\'"),"''") + values.append("'%s'" % d) + elif d: + values.append(str(d)) + else: + raise ValueError, ( + 'no default was given for %s' % n) + +class ColumnBrowser(Browser): + icon='field' + + def check(self): + return ('\t' % + (self.TABLE_NAME, self._d['Name'])) + def tpId(self): return self._d['Name'] + def tpURL(self): return "Column/%s" % self._d['Name'] + def Description(self): + d=self._d + if d['Scale']: + return " %(Type)s(%(Precision)s,%(Scale)s) %(Nullable)s" % d + else: + return " %(Type)s(%(Precision)s) %(Nullable)s" % d + +table_icons={ + 'TABLE': 'table', + 'VIEW':'view', + 'SYSTEM_TABLE': 'stable', + } + +field_icons={ + NUMBER.name: 'i', + STRING.name: 'text', + DATETIME.name: 'date', + INTEGER.name: 'int', + FLOAT.name: 'float', + BOOLEAN.name: 'bin', + ROWID.name: 'int' + } diff --git a/psycopg2/ZPsycopgDA/__init__.py b/psycopg2/ZPsycopgDA/__init__.py new file mode 100644 index 0000000..0af0ceb --- /dev/null +++ b/psycopg2/ZPsycopgDA/__init__.py @@ -0,0 +1,31 @@ +# ZPsycopgDA/__init__.py - ZPsycopgDA Zope product +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + +__doc__ = "ZPsycopg Database Adapter Registration." +__version__ = '2.0' + +import DA + +def initialize(context): + context.registerClass( + DA.Connection, + permission = 'Add Z Psycopg 2 Database Connections', + constructors = (DA.manage_addZPsycopgConnectionForm, + DA.manage_addZPsycopgConnection), + icon = SOFTWARE_HOME + '/Shared/DC/ZRDB/www/DBAdapterFolder_icon.gif') diff --git a/psycopg2/ZPsycopgDA/db.py b/psycopg2/ZPsycopgDA/db.py new file mode 100644 index 0000000..9a0b4b0 --- /dev/null +++ b/psycopg2/ZPsycopgDA/db.py @@ -0,0 +1,206 @@ +# ZPsycopgDA/db.py - query execution +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + +from Shared.DC.ZRDB.TM import TM +from Shared.DC.ZRDB import dbi_db + +from ZODB.POSException import ConflictError + +import site +import pool + +import psycopg2 +from psycopg2.extensions import INTEGER, LONGINTEGER, FLOAT, BOOLEAN, DATE, TIME +from psycopg2 import NUMBER, STRING, ROWID, DATETIME + + +# the DB object, managing all the real query work + +class DB(TM, dbi_db.DB): + + _p_oid = _p_changed = _registered = None + + def __init__(self, dsn, tilevel, enc='utf-8'): + self.dsn = dsn + self.tilevel = tilevel + self.encoding = enc + self.failures = 0 + self.calls = 0 + self.make_mappings() + + def getconn(self, create=True): + conn = pool.getconn(self.dsn) + conn.set_isolation_level(int(self.tilevel)) + return conn + + def putconn(self, close=False): + try: + conn = pool.getconn(self.dsn, False) + except AttributeError: + pass + pool.putconn(self.dsn, conn, close) + + def getcursor(self): + conn = self.getconn() + return conn.cursor() + + def _finish(self, *ignored): + try: + conn = self.getconn(False) + conn.commit() + self.putconn() + except AttributeError: + pass + + def _abort(self, *ignored): + try: + conn = self.getconn(False) + conn.rollback() + self.putconn() + except AttributeError: + pass + + def open(self): + # this will create a new pool for our DSN if not already existing, + # then get and immediately release a connection + self.getconn() + self.putconn() + + def close(self): + # FIXME: if this connection is closed we flush all the pool associated + # with the current DSN; does this makes sense? + pool.flushpool(self.dsn) + + def sortKey(self): + return 1 + + def make_mappings(self): + """Generate the mappings used later by self.convert_description().""" + self.type_mappings = {} + for t, s in [(INTEGER,'i'), (LONGINTEGER, 'i'), (NUMBER, 'n'), + (BOOLEAN,'n'), (ROWID, 'i'), + (DATETIME, 'd'), (DATE, 'd'), (TIME, 'd')]: + for v in t.values: + self.type_mappings[v] = (t, s) + + def convert_description(self, desc, use_psycopg_types=False): + """Convert DBAPI-2.0 description field to Zope format.""" + items = [] + for name, typ, width, ds, p, scale, null_ok in desc: + m = self.type_mappings.get(typ, (STRING, 's')) + items.append({ + 'name': name, + 'type': use_psycopg_types and m[0] or m[1], + 'width': width, + 'precision': p, + 'scale': scale, + 'null': null_ok, + }) + return items + + ## tables and rows ## + + def tables(self, rdb=0, _care=('TABLE', 'VIEW')): + self._register() + c = self.getcursor() + c.execute( + "SELECT t.tablename AS NAME, 'TABLE' AS TYPE " + " FROM pg_tables t WHERE tableowner <> 'postgres' " + "UNION SELECT v.viewname AS NAME, 'VIEW' AS TYPE " + " FROM pg_views v WHERE viewowner <> 'postgres' " + "UNION SELECT t.tablename AS NAME, 'SYSTEM_TABLE\' AS TYPE " + " FROM pg_tables t WHERE tableowner = 'postgres' " + "UNION SELECT v.viewname AS NAME, 'SYSTEM_TABLE' AS TYPE " + "FROM pg_views v WHERE viewowner = 'postgres'") + res = [] + for name, typ in c.fetchall(): + if typ in _care: + res.append({'TABLE_NAME': name, 'TABLE_TYPE': typ}) + self.putconn() + return res + + def columns(self, table_name): + self._register() + c = self.getcursor() + try: + r = c.execute('SELECT * FROM "%s" WHERE 1=0' % table_name) + except: + return () + self.putconn() + return self.convert_description(c.description, True) + + ## query execution ## + + def query(self, query_string, max_rows=None, query_data=None): + self._register() + self.calls = self.calls+1 + + desc = () + res = [] + nselects = 0 + + c = self.getcursor() + + try: + for qs in [x for x in query_string.split('\0') if x]: + if type(qs) == unicode: + if self.encoding: + qs = qs.encode(self.encoding) + try: + if query_data: + c.execute(qs, query_data) + else: + c.execute(qs) + except psycopg2.OperationalError, e: + try: + self.close() + except: + pass + self.open() + try: + if query_data: + c.execute(qs, query_data) + else: + c.execute(qs) + except (psycopg2.ProgrammingError, + psycopg2.IntegrityError), e: + if e.args[0].find("concurrent update") > -1: + raise ConflictError + raise e + except (psycopg2.ProgrammingError, psycopg2.IntegrityError), e: + if e.args[0].find("concurrent update") > -1: + raise ConflictError + raise e + if c.description is not None: + nselects += 1 + if c.description != desc and nselects > 1: + raise psycopg2.ProgrammingError( + 'multiple selects in single query not allowed') + if max_rows: + res = c.fetchmany(max_rows) + else: + res = c.fetchall() + desc = c.description + self.failures = 0 + + except StandardError, err: + self._abort() + raise err + + return self.convert_description(desc), res diff --git a/psycopg2/ZPsycopgDA/dtml/add.dtml b/psycopg2/ZPsycopgDA/dtml/add.dtml new file mode 100644 index 0000000..c718ded --- /dev/null +++ b/psycopg2/ZPsycopgDA/dtml/add.dtml @@ -0,0 +1,96 @@ + + + + +

+A Zope Psycopg 2 Database Connection is used to connect and execute +queries on a PostgreSQL database. +

+ +

+In the form below Connection String (also called the Data Source Name +or DSN for short) is a string... (TODO: finish docs) +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Id +
+
+ +
+
+ Title +
+
+ +
+
+ Connection string +
+
+ +
+
+ Connect immediately +
+
+ +
+
+ Use Zope's internal DateTime +
+
+ +
+
+ Transaction isolation level +
+
+ +
+
+ +
+
+
+ + diff --git a/psycopg2/ZPsycopgDA/dtml/browse.dtml b/psycopg2/ZPsycopgDA/dtml/browse.dtml new file mode 100644 index 0000000..deffd0a --- /dev/null +++ b/psycopg2/ZPsycopgDA/dtml/browse.dtml @@ -0,0 +1,11 @@ + + <dtml-var title_or_id >tables + + + + <dtml-var Type> + + + + diff --git a/psycopg2/ZPsycopgDA/dtml/edit.dtml b/psycopg2/ZPsycopgDA/dtml/edit.dtml new file mode 100644 index 0000000..7cb371f --- /dev/null +++ b/psycopg2/ZPsycopgDA/dtml/edit.dtml @@ -0,0 +1,67 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ Title +
+
+ +
+
+ Connection string +
+
+ +
+
+ Use Zope's internal DateTime +
+
+ checked="YES" /> +
+
+ Transaction isolation level +
+
+ +
+
+ +
+
+
+ + diff --git a/psycopg2/ZPsycopgDA/dtml/table_info.dtml b/psycopg2/ZPsycopgDA/dtml/table_info.dtml new file mode 100644 index 0000000..639c23f --- /dev/null +++ b/psycopg2/ZPsycopgDA/dtml/table_info.dtml @@ -0,0 +1,7 @@ + + + + owned by +
+ + diff --git a/psycopg2/ZPsycopgDA/icons/bin.gif b/psycopg2/ZPsycopgDA/icons/bin.gif new file mode 100644 index 0000000..e469126 Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/bin.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/date.gif b/psycopg2/ZPsycopgDA/icons/date.gif new file mode 100644 index 0000000..0d88a57 Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/date.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/datetime.gif b/psycopg2/ZPsycopgDA/icons/datetime.gif new file mode 100644 index 0000000..faa540b Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/datetime.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/field.gif b/psycopg2/ZPsycopgDA/icons/field.gif new file mode 100644 index 0000000..9bf8692 Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/field.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/float.gif b/psycopg2/ZPsycopgDA/icons/float.gif new file mode 100644 index 0000000..dd42729 Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/float.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/int.gif b/psycopg2/ZPsycopgDA/icons/int.gif new file mode 100644 index 0000000..ef2c5e3 Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/int.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/stable.gif b/psycopg2/ZPsycopgDA/icons/stable.gif new file mode 100644 index 0000000..acdd37d Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/stable.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/table.gif b/psycopg2/ZPsycopgDA/icons/table.gif new file mode 100644 index 0000000..cce83be Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/table.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/text.gif b/psycopg2/ZPsycopgDA/icons/text.gif new file mode 100644 index 0000000..a2e5aab Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/text.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/time.gif b/psycopg2/ZPsycopgDA/icons/time.gif new file mode 100644 index 0000000..6d08915 Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/time.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/view.gif b/psycopg2/ZPsycopgDA/icons/view.gif new file mode 100644 index 0000000..71b30de Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/view.gif differ diff --git a/psycopg2/ZPsycopgDA/icons/what.gif b/psycopg2/ZPsycopgDA/icons/what.gif new file mode 100644 index 0000000..8b5516e Binary files /dev/null and b/psycopg2/ZPsycopgDA/icons/what.gif differ diff --git a/psycopg2/ZPsycopgDA/pool.py b/psycopg2/ZPsycopgDA/pool.py new file mode 100644 index 0000000..05af0a5 --- /dev/null +++ b/psycopg2/ZPsycopgDA/pool.py @@ -0,0 +1,51 @@ +# ZPsycopgDA/pool.py - ZPsycopgDA Zope product: connection pooling +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + +# all the connections are held in a pool of pools, directly accessible by the +# ZPsycopgDA code in db.py + +import threading +import psycopg2.pool + +_connections_pool = {} +_connections_lock = threading.Lock() + +def getpool(dsn, create=True): + _connections_lock.acquire() + try: + if not _connections_pool.has_key(dsn) and create: + _connections_pool[dsn] = \ + psycopg2.pool.PersistentConnectionPool(4, 200, dsn) + finally: + _connections_lock.release() + return _connections_pool[dsn] + +def flushpool(dsn): + _connections_lock.acquire() + try: + _connections_pool[dsn].closeall() + del _connections_pool[dsn] + finally: + _connections_lock.release() + +def getconn(dsn, create=True): + return getpool(dsn, create=create).getconn() + +def putconn(dsn, conn, close=False): + getpool(dsn).putconn(conn, close=close) diff --git a/psycopg2/debian/changelog b/psycopg2/debian/changelog new file mode 100644 index 0000000..44d83dc --- /dev/null +++ b/psycopg2/debian/changelog @@ -0,0 +1,12 @@ +psycopg2 (1.99.12.1-1) experimental; urgency=low + + * Adapted from patches sent by W. Borgert. + * Renamed source package to psycopg2. + + -- Federico Di Gregorio Fri, 4 Mar 2005 13:11:43 +0100 + +psycopg2 (1.99.11-0.1) unstable; urgency=low + + * Experimental package. + + -- W. Borgert Sun, 09 Jan 2005 10:14:09 +0000 diff --git a/psycopg2/debian/control b/psycopg2/debian/control new file mode 100644 index 0000000..9c63676 --- /dev/null +++ b/psycopg2/debian/control @@ -0,0 +1,51 @@ +Source: psycopg2 +Section: python +Priority: optional +Build-depends: postgresql-dev, debhelper (>> 3), python2.3-dev, cdbs +Maintainer: Federico Di Gregorio +Standards-Version: 3.6.1.1 + +Package: python-psycopg2 +Architecture: any +Section: python +Depends: python (>= 2.3), python (<< 2.4), python2.3-psycopg2 +Description: Python module for PostgreSQL [dummy package] + psycopg is a PostgreSQL database adapter for the Python programming + language. It was written from scratch with the aim of being very small + and fast, and stable as a rock. The main advantages of psycopg are that + it supports the full Python DBAPI-2.0 and being thread safe at level 2. + . + psycopg 2 is the next generation psycopg, implementing a much better + type system and even more DBAPI extensions: + . + * support for Python datetime and Decimal types; + * complete implementation of adapt() from PEP 246 to convert Python + types to PostgreSQL ones; + * COPY FROM/COPY TO support; + * inehritable connection and cursor objects and support for connection + and cursor factories; + * automatic encoding conversion and support for unicode queries. + . + This dummy package just depends on the right, default version of Python + and psycopg 2. + +Package: python2.3-psycopg2 +Architecture: any +Section: python +Depends: ${shlibs:Depends}, python2.3 +Description: Python 2.3 module for PostgreSQL + psycopg is a PostgreSQL database adapter for the Python programming + language. It was written from scratch with the aim of being very small + and fast, and stable as a rock. The main advantages of psycopg are that + it supports the full Python DBAPI-2.0 and being thread safe at level 2. + . + psycopg 2 is the next generation psycopg, implementing a much better + type system and even more DBAPI extensions: + . + * support for Python datetime and Decimal types; + * complete implementation of adapt() from PEP 246 to convert Python + types to PostgreSQL ones; + * COPY FROM/COPY TO support; + * inehritable connection and cursor objects and support for connection + and cursor factories; + * automatic encoding conversion and support for unicode queries. diff --git a/psycopg2/debian/copyright b/psycopg2/debian/copyright new file mode 100644 index 0000000..c631915 --- /dev/null +++ b/psycopg2/debian/copyright @@ -0,0 +1,10 @@ +psycopg 2 can be downloaded from: + + http://initd.org/pub/software/psycopg/ALPHA/ + +Copyright (c) 2001-2005 Federico Di Gregorio + +This program is distributed under the GNU GPL. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License can be found in '/usr/share/common-licenses/GPL'. diff --git a/psycopg2/debian/rules b/psycopg2/debian/rules new file mode 100755 index 0000000..98ad46f --- /dev/null +++ b/psycopg2/debian/rules @@ -0,0 +1,4 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/python-distutils.mk diff --git a/psycopg2/doc/ChangeLog-1.x b/psycopg2/doc/ChangeLog-1.x new file mode 100644 index 0000000..dadfc1b --- /dev/null +++ b/psycopg2/doc/ChangeLog-1.x @@ -0,0 +1,1744 @@ +2003-07-26 Federico Di Gregorio + + * Release 1.1.7. + + * ZPsycopgDA/db.py: added _cursor method that checks for self.db + before returning a new cursor. Should fix problem reported with + Zope 2.7. + +2003-07-23 Federico Di Gregorio + + * cursor.c: applied notify and fileno patch from Vsevolod Lobko. + +2003-07-20 Federico Di Gregorio + + * cursor.c (_mogrify_dict): applied (slightly modofied) patch from + Tobias Sargeant: now .execute() accept not only dictionaries but + every type that has a __getitem__ method. + +2003-07-13 Federico Di Gregorio + + * Release 1.1.6. + + * cursor.c (psyco_curs_scroll): added scroll method, patch from + Jason D.Hildebrand. + + * typemod.c (new_psyco_quotedstringobject): discard NUL characters + (\0) in quoted strings (fix problem reported by Richard Taylor.) + +2003-07-10 Federico Di Gregorio + + * Added python-taylor.txt in doc directory: very nice introduction + to DBAPI programming by Richard Taylor. + +2003-07-09 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): another MT problem exposed and + fixed by Sebastien Bigaret (self->keeper->status still LOCKED + after a fatal error during PQexec call.) + +2003-06-23 Federico Di Gregorio + + * Release 1.1.5.1. + + * ZPsycopgDA/db.py (DB.query): stupid error making ZPsycopgDA + unusable fixed (else->except). + +2003-06-22 Federico Di Gregorio + + * Release 1.1.5 candidate. + + * cursor.c (psyco_curs_copy_to): now any object with the write + method can be used as a copy_to target. + +2003-06-20 Federico Di Gregorio + + * cursor.c (psyco_curs_copy_from): applied patch to allow copy_to + from any object having a "readline" attribute (patch from Lex + Berezhny.) (psyco_curs_copy_from): another patch from Lex to make + psycopg raise an error on COPY FROM errors. + + * ZPsycopgDA/db.py (DB.query): if a query raise an exception, + first self._abort() is called to rollback current + "sub-transaction". this is a backward-compatible change for + people that think continuing to work in the same zope transaction + after an exception is a Good Thing (TM). + + * finally updated check_types.expected. checked by hand the + conversions work the right way. + + * doc/examples/work.py: fixed example. note that it is a long time + (at least two releases) that psycopg does not END a transaction + initiated explicitly by the user while in autocommit mode. + +2003-06-19 Federico Di Gregorio + + * cursor.c (_mogrify_dict): fixed dictionary mogrification (patch + by Vsevolod Lobko.) (_psyco_curs_execute): fixed keeper status + trashing problem by letting only one thread at time play with + keeper->status (as suggested by Sebastien Bigaret.) + +2003-05-07 Federico Di Gregorio + + * Release 1.1.4. + + * cursor.c: Added "statusmessage" attribute that holds the backend + message (modified lots of functions, look for self->status). + +2003-05-06 Federico Di Gregorio + + * typemod.c (new_psyco_datetimeobject): moved Py_INCREF into + XXX_FromMx functions, to fix memory leak reported by Jim Crumpler. + +2003-04-11 Federico Di Gregorio + + * module.h (PyObject_TypeCheck): fixed leak in python 2.1 + (Guido van Rossum). + +2003-04-08 Federico Di Gregorio + + * buildtypes.py (basic_types): removed LXTEXT (never user, does + not exists anymore.) + +2003-04-07 Federico Di Gregorio + + * setup.py: added very lame setup.py script. + +2003-04-02 Federico Di Gregorio + + * Release 1.3. + + * psycopg.spec: Added (but modified) spec file by William + K. Volkman (again, this change was lost somewhere in time...) + +2003-04-01 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): psycopg was reporting everything + as IntegrityError; reported and fix suggested by Amin Abdulghani. + +2003-03-21 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): debug statements sometimes made + psycopg segfault: fixed by a patch by Ken Simpson. + +2003-03-18 Federico Di Gregorio + + * cursor.c (alloc_keeper): patch from Dieter Maurer to unlock GIL + whaile calling PQconnectdb(). + +2003-03-05 Federico Di Gregorio + + * Release 1.1.2. + + * Applied cygwin patch from Hajime Nakagami. + +2003-02-25 Federico Di Gregorio + + * Release 1.1.2pre1. + + * cursor.c: added .lastrowid attribute to cursors (lastoid is + deprecated and will be removed sometime in the future.) + + * cursor.c (begin_pgconn): implemented various isolation levels + (also, in abort_pgconn, commit_pgconn.) + + * Added keyword parameters to psycopg.connect(): all take strings + (even port): database, host, port, user, password. + + * configure.in: fixed test for postgres version > 7.2. + + * cursor.c (_psyco_curs_execute): removed if on pgerr in default + case (if we enter default pgerr can't be one of the cased ones.) + Also applied slightly modified patch from William K. Volkman. + +2003-02-24 Federico Di Gregorio + + * Merged in changes from 1.0.15.1 (see below for merged + ChangeLog.) + +2003-02-14 Federico Di Gregorio + + * Release 1.0.15.1. + + * cursor.c (_mogrify_fmt): in some cases we where removing one + character too much from the format string, resulting in BIG BAD + BUG. Fixed. + +2003-02-13 Federico Di Gregorio + + * Release 1.0.15. + + * connection.c (_psyco_conn_close): now call dispose_pgconn on all + cursors, to make sure all phisical connections to the db are + closed (problem first reported by Amin Abdulghani.) + + * DBAPI-2.0 fixed mainly due to Stuart Bishop: + - cursor.c (psyco_curs_setinputsizes): removed PARSEARGS, as + this method does nothing. + - cursor.c (psyco_curs_setoutputsize): .setoutputsize was + spelled .setoutputsizes! fixed. Also removed PARSEARGS, as this + method does nothing. + +2003-02-12 Federico Di Gregorio + + * module.h (Dprintf): check on __APPLE__ to avoid variadic macros + on macos x (as reported by Stuart Bishop, btw, why gcc seems to + not support them on macos?) + + * cursor.c (_mogrify_fmt): non-alphabetic characters are dropped + after the closing ")" until a real alphabetic, formatting one is + found. (Fix bug reported by Randall Randall.) + +2003-02-05 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): patched again to take into + account leading zeroes. + +2003-02-02 Federico Di Gregorio + + * Makefile.pre.in: applied patch from Albert Chin-A-Young to + define BLDSHARED. + + * README: added explicit permission to link with OpenSSL. + +2003-01-30 Federico Di Gregorio + + * config.h.in: applied patch from Albert Chin-A-Young to fix + asprintf prototype. + +2003-01-29 Federico Di Gregorio + + * cursor.c (_mogrify_seq): fixed little refcount leak, as + suggested by Yves Bastide. + +2003-01-24 Federico Di Gregorio + + * Merged-in changes from 1.0.14.2 (emacs diff mode is great..) + + * Release 1.0.14.2. + + * ZPsycopgDA/db.py (DB.query): back to allowing up to 1000 db + errors before trying to reopen the connection by ourselves. + + * ZPsycopgDA/db.py: a false (None preferred, 0 allowed) max_rows + value now means "fetch all results". + +2003-01-22 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): fixed little memory leak + reported by Dieter Maurer. + +2003-01-20 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.tables/columns): added registration with + Zope's transaction machinery. + + * Release 1.0.14.1. + + * ZPsycopgDA/db.py: applied some fixes and cleanups by Dieter + Maurer (serialization problem were no more correctly detected!) + + * Release 1.0.14. + + * Merged in 1.0.14. + + * Import of 1.1.1 done. + + * Moved everything to cvs HEAD. + +2003-01-20 Federico Di Gregorio + + * ZPsycopgDA/connectionAdd.dtml: fixed typo (thanks to Andrew + Veitch.) + + * typeobj.c (psyco_INTERVAL_cast): applied patch from Karl Putland + to fix problems with fractional seconds. + +2002-12-03 Federico Di Gregorio + + * Release 1.0.14-pre2. + + * module.h: added macro for PyObject_TypeCheck if python version <2.2. + + * typeobj.c (psyco_DBAPITypeObject_coerce): added error message to + coercion errors. + +2002-12-02 Federico Di Gregorio + + * Release 1.0.14-pre1. + + * ZPsycopgDA/db.py (DB.sortKey): added sortKey(). + + * ZPsycopgDA/DA.py: applied a patch that was lost on hard disk + (sic), if you sent me a patch names psycopg-1.0.13.diff modifying + DA.py imports and want your name here, send me an email. :) + [btw, the patch fix the ImageFile import, getting it from Globals + as it is right.] + + * typeobj.c (psyco_DBAPITypeObject_coerce): Fixed coerce segfault + by checking explicitly for all the allowed types. + +2002-11-25 Federico Di Gregorio + + * doc/examples/*.py: added .rollback() to all exceptions before + deleteing the old table. + + * cursor.c: Apllied patch from John Goerzen (fix memory leak in + executemany). + +2002-10-25 Federico Di Gregorio + + * Release 1.0.13. + + * connection.c (_psyco_conn_close): remove cursors from the list + starting from last and moving backward (as suggested by Jeremy + Hylton; this is not such a big gain because python lists are + *linked* lists, but not removing the element 0 makes the code a + little bit clear.) + + * cursor.c (_psyco_curs_execute): now IntegrityError is raised + instead of ProgrammingError when adding NULL values to a non-NULL + column (suggested by Edmund Lian) and on referential integrity + violation (as per debian bug #165791.) + + * typeobj.c (psyco_DATE_cast): now we use 999999 instead of + 5867440 for very large (both signs) dates. This allow to re-insert + the DateTime object into postgresql (suggested by Zahid Malik.) + +2002-09-13 Federico Di Gregorio + + * Release 1.0.12. + + * Removed code to support COPY FROM/TO, will be added to new 1.1 + branch to be released next week. + + * cursor.c (_mogrify_seq): Fixed memory leak reported by Menno + Smits (values obtained by calling PySequence_GetItem are *new* + references!) + +2002-09-07 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): Added skeleton to support COPY + FROM/TO. + +2002-09-06 Federico Di Gregorio + + * configure.in: if libcrypt can't be found we probably are on + MacOS X: check for libcrypto, as suggested by Aparajita Fishman. + +2002-09-03 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.columns): Applied patch from Dieter Maurer + to allow the DA-browser to work with mixed case table names. + +2002-08-30 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_DateTime): Applied patch from Yury to fix + timestamps (before they were returned with time always set to 0.) + +2002-08-26 Federico Di Gregorio + + * Release 1.0.11.1 (to fix a %&£$"! bug in ZPsycopgDA not + accepting psycopg 1.0.11 as a valid version. + + * Release 1.0.11. + +2002-08-22 Federico Di Gregorio + + * Release 1.0.11pre2. + + * cursor.c (_psyco_curs_execute): fixed IntegrityError as reported + by Andy Dustman. (psyco_curs_execute): converting TypeError to + ProgrammingError on wrong number of % and/or aeguments. + + * doc/examples/integrity.py: added example and check for + IntegrityError. + +2002-08-08 Federico Di Gregorio + + * Release 1.0.11pre1. + +2002-08-06 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_DateTime): patched as suggested by Tom + Jenkins; now it shouldwork with time zones too. + +2002-08-01 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_DateTime): fixed problem with missing + AM/PM, as reported by Tom Jenkins. + +2002-07-23 Federico Di Gregorio + + * Fixed buglets reported by Mike Coleman. + +2002-07-22 Federico Di Gregorio + + * Release 1.0.10. + +2002-07-14 Federico Di Gregorio + + * Release 1.0.10pre2. + + * typeobj.c (psyco_LONGINTEGER_cast): fixed bad segfault by + INCREFfing Py_None when it is the result of a NULL conversion. + +2002-07-04 Federico Di Gregorio + + * Release 1.0.10pre1. + + * buildtypes.py (basic_types): added TIMESTAMPTZ to the types + converted by the DATE builtin. + + * ZPsycopgDA/DA.py (Connection.connect): Added version check. + +2002-07-03 Federico Di Gregorio + + * typeobj.c (psyco_XXX_cast): fixed bug reported by multiple users + by appliying Matt patch. + +2002-06-30 Federico Di Gregorio + + * ZPsycopgDA/DA.py (Connection.set_type_casts): applied patch from + Tom Jenkins to parse dates with TZ. + +2002-06-20 Federico Di Gregorio + + * Preparing for release 1.0.9. + + * Makefile.pre.in (dist): now we really include psycopg.spec. + +2002-06-17 Federico Di Gregorio + + * ZPsycopgDA/db.py (_finish, _abort): fixed problem with + connection left in invalid state by applying Tom Jenkins patch. + +2002-06-06 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB._abort): fixed exception raising after an + error in execute triggerer deletion of self.db. + +2002-05-16 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): None values passed to the + internal typecasters. + + * typeobj.c: added management of None to all the builtin + typecasters. + +2002-04-29 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_Time): applied 'seconds as a float' patch + from Jelle. + +2002-04-23 Federico Di Gregorio + + * Release 1.0.8. + + * Makefile.pre.in: we now include win32 related files in the + distribution. + + * connection.c (psyco_conn_destroy): fixed segfault reported by + Scott Leerssen (we were double calling _psyco_conn_close().) + + * typemod.c (new_psyco_quotedstringobject): fixed memory stomping + catched by assert(); thanks to Matt Hoskins for reporting this + one. + +2002-04-22 Federico Di Gregorio + + * configure.in: grmpf. we need a VERSION file for windows, we'll + use it for configue and debian/rules too. + + * Integrated win32 changes from Jason Erickson. Moved his + Readme.txt to README.win32, removed VERSION and DATE, patched + source where required. Renamed HISTORY to ChangeLog.win32, hoping + Jason will start adding changes to the real ChangeLog file. + +2002-04-07 Federico Di Gregorio + + * Release 1.0.7.1. + + * configure.in: fixed little bug as reported by ron. + +2002-04-05 Federico Di Gregorio + + * Release 1.0.7? + + * typemod.c (new_psyco_bufferobject): fixed encoding problem (0xff + now encoded as \377 and not \777.) Also encoding *all* chars as + quoted octal values to prevent "Invalid UNICODE character sequence + found" errors. + + * Release 1.0.7. (Real this time.) (Ok, it was a joke....) + +2002-04-03 Federico Di Gregorio + + * configure.in: fixed problem with postgres versions in the format + 7.2.x (sic.) + + * connection.c (psyco_conn_destroy): moved most of the destroy + stuff into its own function (_psyco_conn_close) and added a call + to it from psyco_conn_close. This should fix the "psycopg does not + release postgres connections on .close()" problem. + +2002-03-29 Federico Di Gregorio + + * Release 1.0.7. Delayed. + + * buildtypes.py (basic_types): added TIMESTAMPTZ postgres type to + the list of valid DATETIME types (incredible luck, no changes to + the parse are needed!) + + * typeobj.c (psyco_DATE_cast): fixed wrong managment of sign in + infinity. + +2002-03-27 Federico Di Gregorio + + * configure.in (INSTALLOPTS): added AC_PROG_CPP test, now uses + AC_TRY_CPP to test for _all_ required mx includes. + +2002-03-19 Federico Di Gregorio + + * configure.in: added check for both pg_config.h and config.h to + detect postgres version. + + * cursor.c: now None values are correctly handled when the format + string is not %s but %d, etc. + +2002-03-08 Federico Di Gregorio + + * ZPsycopgDA/DA.py: added MessageDialog import suggested by + Guido. + +2002-03-07 Federico Di Gregorio + + * psycopg.spec: added RPM specs by William K. Volkman. + + * Release 1.0.6. + + * configure.in: imported changes to allow postgres 7.2 builds from + unstable branch. + +2002-03-04 Federico Di Gregorio + + * Release 1.0.5. + + * applied table browser patch from Andy Dustman. + +2002-02-26 Federico Di Gregorio + + * typeobj.c (psyco_DATE_cast): added management of infinity + values, this can be done in a better way, by accessing the + MaxDateTime and MinDateTime constants of the mx.DateTime module. + +2002-02-20 Federico Di Gregorio + + * configure.in: Release 1.0.4. + +2002-02-12 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.columns): fixed select to reenable column + expansion in table browsing. + + * ZPsycopgDA/__init__.py: removed code that made psycopg think + double. + +2002-02-11 Federico Di Gregorio + + * cursor.c (_mogrify_dict): removed Py_DECREF of Py_None, + references returned by PyDict_Next() are borrowed (thanks to + Michael Lausch for this one.) + +2002-02-08 Federico Di Gregorio + + * A little bug slipped in ZPsycopgDA, releasing 1.0.3 immediately. + + * Release 1.0.2. + + * tests/check_types.py (TYPES): added check for hundredths of a + second. + +2002-02-07 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): patched to correct wrong + interpretation of hundredths of a second (patch from + A. R. Beresford, kudos!) + +2002-01-31 Federico Di Gregorio + + * FAQ: added. + +2002-01-16 Federico Di Gregorio + + * Preparing for release 1.0.1. + + * cursor.c (alloc_keeper): removed ALLOW_THREADS wrapper around + PQconnectdb: libpq calls crypt() that is *not* reentrant. + +2001-12-19 Federico Di Gregorio + + * typeobj.c (psyco_DBAPITypeObject_cmp): added check to simply + return false when two type objects are compared (type objects are + meaned to be compared to integers!) + + * typeobj.c: fixed the memory leak reported by the guys at + racemi, for real this time. (added about 5 DECREFS and 2 INCREFS, + ouch!) + +2001-12-17 Federico Di Gregorio + + * typeobj.c (psyco_DBAPITypeObject_cmp): fixed memory leak by + using PyTuple_GET_ITEM (we are sure the tuple has at least one + element, we built it, after all...) (many thanks to Scott Leerssen + for reporting the *exact line* for this one.) + +2001-12-13 Federico Di Gregorio + + * cursor.c: fixed memory leak due to extra strdup (thanks + to Leonardo Rochael Almeida.) + +2001-11-14 Federico Di Gregorio + + * Release 1.0. + + * doc/README: added explanation about guide work in progess but + examples working. + + * debian/*: lots of changes to release 1.0 in debian too. + +2001-11-12 Federico Di Gregorio + + * RELEASE-1.0: added release file, to celebrate 1.0. + + * tests/zope/typecheck.zexp: regression test on types for zope. + +2001-11-11 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_Interval): removed typecast of interval + into zope DateTime. intervals are reported as strings when using + zope DateTime and as DateTimeDeltas when using mx. + +2001-11-09 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): complete rewrite of the + interval parsing code. now we don't use sscanf anymore and all is + done with custom code in a very tight and fast loop. + +2001-11-08 Federico Di Gregorio + + * ZPsycopgDA/DA.py (Connection.set_type_casts): added mx INTERVAL + type restore. + + * ZPsycopgDA/db.py (DB.query): now we return column names even if + there are no rows in the result set. also, cleaned up a little bit + the code. + +2001-11-7 Federico Di Gregorio, + + * Makefile.pre.in: fixed small problem with zcat on True64 + (thank you stefan.) + +2001-11-06 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.query): added fix for concurrent update + from Chris Kratz. + +2001-11-05 Federico Di Gregorio + + * cursor.c: now we include postgres.h if InvalidOid is still + undefined after all other #includes. + + * README: clarified use of configure args related to python + versions. + + * aclocal.m4: patched to work with symlinks installations (thanks + to Stuart Bishop.) + + * cursor.c (_psyco_curs_execute): now reset the keeper's status to + the old value and not to BEGIN (solve problem with autocommit not + switching back.) + +2001-11-01 Federico Di Gregorio + + * doc/examples/dt.py: added example on how to use the date and + time constructors. + + * Makefile.pre.in (dist-zope): removed dependencies on GNU install + and tar commands. Also a little general cleanup on various targets. + + * ZPsycopgDA/DA.py: fixed mx.DateTime importing. + +2001-10-31 Federico Di Gregorio + + * typemod.c (psyco_xxxFromMx): fixed bug in argument parsing (we + weren't usigng the right type object.) + + * aclocal.m4: now builds OPT and LDFLAGS on the values of the env + variables instead of overwriting them. + + * Makefile.pre.in (CFLAGS): removed -Wall, you can add it back at + compile time with OPT="-Wall" ./configure ... + + * Setup.in (OPT): removed -Wall. + +2001-10-30 Michele Comitini + + * module.h: ANSI C compatibility patch from Daniel Plagge. + +2001-10-30 Federico Di Gregorio + + * README: added common building problems and solutions. + + * configure.in: removed check for install command, already done by + james's aclocal.m4 for python. removed install-sh. removed -s from + INSTALLOPTS. + +2001-10-29 Federico Di Gregorio + + * Makefile.pre.in (dist): removed examples/ directory from + distribution. + + * merge with cvs head. preparing to fork again on PSYCOPG-1-0 (i + admit BRANCH_1_0 was quite a silly name.) + + * doc/examples/usercast.py: now works. + + * connection.c (curs_rollbackall): fixed little bug (exposed by + the deadlock below) by changing KEEPER_READY to KEEPER_READY. + + * doc/examples/commit.py: deadlock problem solved, was the + example script, _not_ psycopg. pew... :) + + * examples/*: removed the examples moved to doc/examples/. + + * doc/examples/commit.py,dictfetch.py: moved from examples/ and + changed to work for 1.0. unfortunately commit.py locks psycopg!!! + +2001-10-24 Federico Di Gregorio + + * modified all files neede for the 1.0 release. + + * configure.in (MXFLAGS): removed electric fence support. + + * Makefile.pre.in (dist): now we remove CVS working files before + packing the tarball. + + * tests: files in this directory are not coding examples, but + regression tests. we need a sufficient number of tests to follow + every single code path in psycopg at least once. first test is + about datatypes. + + * doc/examples: moved new example code to examples directory, old + tests and code samples will stay in examples/ until the manual will + be finished. + +2001-10-16 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): completely revised interval + casting code. (psyco_TIME_cast): we use the unix epoch when the + date is undefined. + + * cursor.c (psyco_curs_executemany): modified sanity check to + accept sequences of tuples too and not just dictionaries. + +2001-10-15 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): fixed bug caused by wrong + parsing on '1 day' (no hours, minutes and seconds.) + +2001-10-15 Michele Comitini + + * cursor.c (_execute): use the correct cast functions even on + retrival of binary cursors. + +2001-10-12 Federico Di Gregorio + + * typemod.c (new_psyco_bufferobject): space not quoted anymore, + smarter formula to calculate realloc size. + + * cursor.c (psyco_curs_fetchone): removed static tuple (using + static variable in multithreaded code is *crazy*, why did i do it? + who knows...) + + * typeobj.c (psyco_init_types): exports the binary converter (will + be used in cursor.c:_execute.) + + * typeobj.h: added export of psyco_binary_cast object. + +2001-10-05 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): added missing Py_XDECREF on + casts list. + + * Makefile.pre.in (dist): added install-sh file to the + distribution. + + * replaced PyMem_DEL with PyObject_Del where necessary. + + * connection.c (psyco_conn_destroy): added missing + pthread_mutex_destroy on keeper lock. + +2001-10-01 Michele Comitini + + * typemod.c(new_psyco_bufferobject()): using unsigned char for + binary objects to avoid too many chars escaped. A quick and + simple formula to avoid memory wasting and too much reallocating + for the converted object. Needs _testing_, but it is faster. + + * cursor.c: #include + + * module.h: now debugging should be active only when asked by + ./configure --enable-devel + +2001-09-29 Federico Di Gregorio + + * cursor.c (new_psyco_cursobject): added locking of connection, + still unsure if necessary. + +2001-09-26 Federico Di Gregorio + + * configure.in: changed DEBUG into PSYCOTIC_DEBUG, to allow other + includes (postgres.h) to use the former. better compiler checks: + inline, ansi, gcc specific extensions. removed MXMODULE: we don't + need it anymore. + + * general #include cleanup, should compile on MacOS X too. + + * typeobj.c (psyco_DATE_cast): uses sscanf. should be faster too. + (psyco_TIME_cast): dixit. + + * applied patch from Daniel Plagge (SUN cc changes.) + +2001-09-22 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB._finish, DB._begin): fix for the + self.db == None problem. + +2001-09-19 Michele Comitini + + * typemod.c (new_psyco_bufferobject): better memory managment + (now it allocates only needed space dinamically). + + * typeobj.c (psyco_BINARY_cast): ripped a useless check, now + it assumes that binary streams come out from the db correctly + escaped. Should be a lot faster. + +2001-09-18 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): fixed interval conversion + (hours were incorrectly converted into seconds.) + +2001-09-17 Federico Di Gregorio + + * cursor.c (_mogrify_seq, _mogrify_dict): added check for None + value and conversion of None -> NULL (fixes bug reported by Hamish + Lawson.) + +2001-09-12 Federico Di Gregorio + + * module.c: added handles to new date and time conversion + functions (see below.) + + * typemod.c (psyco_XXXFromMx): added conversion functions that + simply wrap the mxDateTime objects instead of creating + them. DBAPI-2.0 extension, off-curse. + +2001-09-10 Federico Di Gregorio + + * buildtypes.py: solved hidden bug by changing from dictionary to + list, to maintain ordering of types. sometimes (and just + sometimes) the type definitions were printed unsorted, resulting + is psycopg initializing the type system using the type objects in + the wrong order. you were getting float values from an int4 + column? be happy, this is now fixed... + + * cursor.c (psyco_curs_lastoid): added method to get oid of the + last inserted row (it was sooo easy, it even works...) + +2001-09-08 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): added casting function for the + postgres INTERVAL and TINTERVAL types (create a DateTimeDelta + object.) + +2001-09-05 Federico Di Gregorio + + * cursor.c: moved all calls to begin_pgconn to a single call in + _psyco_curs_execute, to leave the connection in a not-idle status + after a commit or a rollback. this should free a lot of resources + on the backend side. kudos to the webware-discuss mailing list + members and to Clark C. Evans who suggested a nice solution. + + * connection.c (curs_rollbackall, curs_commitall): removed calls + to begin_pgconn, see above. + + * module.c (initpsycopg): cleaned up mxDateTime importing; we now + use the right function from mxDateTime.h. Is not necessary anymore + to include our own mx headers. This makes psycopg to depend on + mxDateTime >= 2.0.0. + +2001-09-04 Federico Di Gregorio + + * doc/*.tex: added documentation directory and skeleton of the + psycopg guide. + +2001-09-03 Federico Di Gregorio + + * merged in changes from HEAD (mostly mcm fixes to binary + objects.) + + * preparing for release 0.99.6. + +2001-09-03 Michele Comitini + + * typemod.c: much faster Binary encoding routine. + + * typeobj.c: much faster Binary decoding routine. + +2001-08-28 Michele Comitini + + * typemod.c: Working binary object to feed data to bytea type + fields. + + * typeobj.c: Added BINARY typecast to extract data from + bytea type fields. + + * cursor.c: Added handling for SQL binary cursors. + +2001-08-3 Michele Comitini + + * cursor.c: fixed DATESTYLE problem thanx to Steve Drees. + +2001-07-26 Federico Di Gregorio + + * Makefile.pre.in: applied change suggested by Stefan H. Holek to + clobber and distclean targets. + +2001-07-23 Federico Di Gregorio + + * ZPsycopgDA/db.py: fixed little bugs exposed by multiple select + changes, not we correctly import ListType and we don't override + the type() function with a variable. + +2001-07-17 Federico Di Gregorio + + * configure.in: Release 0.99.5. + +2001-07-12 Federico Di Gregorio + + * debian/* fixed some little packaging problems. + +2001-07-11 Federico Di Gregorio + + * cursor.c, typeobj.c: removed some Py_INCREF on PyDict_SetItem + keys and values to avoid memory leaks. + +2001-07-03 Federico Di Gregorio + + * cursor.c (_mogrify_dict): added dictionary mogrification: all + Strings in the dictionary are translated into QuotedStrings. it + even works... (_mogrify_seq): added sequence mogrification and + code to automagically mogrify all strings passed to .execute(). + +2001-07-02 Federico Di Gregorio + + * Release 0.99.4. + + * typemod.c: added QuotedString class and methods. + + * module.c: added QuotedString method to module psycopg. + + * typemod.c: changed Binary objects into something usefull. now + the buffer object quotes the input by translatin every char into + its octal representation. this consumes 4x memory but guarantees + that even binary data containing '\0' can go into the Binary + object. + + * typemod.h: added definition of QuotedString object. + +2001-06-28 Federico Di Gregorio + + * ZPsycopgDA/db.py, ZPsycopgDA/DABase.py: applied patch sent by + yury to fix little buglet. + +2001-06-22 Federico Di Gregorio + + * Release 0.99.3. + + * connection.c (new_psyco_connobject): now we strdup dsn, as a fix + for the problem reported by Jack Moffitt. + + * Ok, this will be the stable branch from now on... + + * Merged in stuff from 0.99.3. About to re-branch with a better + name (BRANCH_1_0) + +2001-06-20 Federico Di Gregorio + + * Release 0.99.3. Showstoppers for 1.0 are: + - documentation + - mxDateTime module loading + - bug reported by Yury. + + * Integrated patches from Michele: + - searching for libcrypt in configure now works + - removed memory leak in asprintf.c + +2001-06-15 Federico Di Gregorio + + * ZPsycopgDA/__init__.py (initialize): applied patch from Jelle to + resolve problem with Zope 2.4.0a1. + +2001-06-14 Federico Di Gregorio + + * configure.in: added code to check for missing functions (only + asprintf at now.) + + * asprintf.c: added compatibility code for oses that does not have + the asprintf() function. + +2001-06-10 Federico Di Gregorio + + * Branched PSYCOPG_0_99_3. Development will continue on the cvs + HEAD, final adjustements and bugfixing should go to this newly + created branch. + +2001-06-08 Michele Comitini + + * ZPsycopgDA/DA.py: DateTime casts simplified and corrected + as suggested by Yury. + +2001-06-05 Federico Di Gregorio + + * Release 0.99.2. + + * Makefile.pre.in (dist): added typemod.h and typemod.c to + distribution. + + * cursor.c (commit_pgconn, abort_pgconn, begin_pgconn): resolved + segfault reported by Andre by changing PyErr_SetString invokations + into pgconn_set_critical. the problem was that the python + interpreter simply segfaults when we touch its internal data (like + exception message) inside an ALLOW_THREADS wrapper. + + * now that we are 100% DBAPI-2.0 compliant is time for the + one-dot-o release (at last!) Para-pa-pa! This one is tagged + PSYCOPG_0_99_1 but you can call it 1.0pre1, if you better like. + (A very long text just to say 'Release 0.99.1') + + * typemod.[ch]: to reach complete DBAPI-2.0 compliance we + introduce some new objects returned by the constructors Date(), + Time(), Binary(), etc. Those objects are module-to-database only, + the type system still takes care of the database-to-python + conversion. + +2001-06-01 Federico Di Gregorio + + * Release 0.5.5. + + * module.h: better error message when trying to commit on a + cursor derived from serialized connection. + + * ZPsycopgDA/db.py (DB.close): now self.cursor is set to None when + the connection is closed. + + * module.c (initpsycopg): added missing (sic) DBAPI module + parameters (paramstyle, apilevel, threadsafety, etc...) + +2001-05-24 Michele Comitini + + * ZPsycopgDA: Support for Zope's internal DateTime, option + to leave mxDateTime is available on the management interface so + to switch with little effort :). + + * cursor.c: more aggressive cleanup of postgres results + to avoid the risk of memory leaking. + + * typeobj.c, connection.c: deleted some Py_INCREF which + wasted memory. + +2001-05-18 Federico Di Gregorio + + * Release 0.5.4. + +2001-05-17 Michele Comitini + + * ZPsycopgDA/db.py: The connection closed by the management + interface of zope now raises error instead of reopening itself. + + * cursor.c (psyco_curs_close): does not try to free the cursor + list, as it caused a segfault on subsequent operations on the same + cursor. + +2001-05-07 Federico Di Gregorio + + * Release 0.5.3. + + * Merged in changes from me and mcm. + +2001-05-06 Michele Comitini + + * ZPsycopgDA/db.py (DB.close): Fixes a bug report by Andre + Shubert, which was still open since there was a tiny typo in + method definition. + + * ZPsycopgDA/DA.py (Connection.sql_quote__): overriding standard + sql_quote__ method to provide correct quoting (thank to Philip + Mayers and Casey Duncan for this bug report). + +2001-05-04 Federico Di Gregorio + + * ZPsycopgDA/db.py: added .close() method (as suffested by Andre + Schubert.) + +2001-05-04 Michele Comitini + + * module.h: working on a closed object now raises an + InterfaceError. + + * ZPsycopgDA/db.py: fixed problems with dead connections detection. + + * ZPsycopgDA/__init__.py: corrected SOFTWARE_HOME bug for zope + icon. + +2001-05-04 Federico Di Gregorio + + * examples/thread_test.py: now that the serialization bug is + fixed, it is clear that thread_test.py is bugged! added a commit() + after the creation of the first table to avoid loosing it on the + exception raised by the CREATE of an existing table_b. + +2001-05-03 Federico Di Gregorio + + * connection.c (psyco_conn_cursor): reverted to old locking + policy, the new caused a nasty deadlock. apparently the multiple + connection problem has been solved as a side-effect of the other + fixes... (?!) + + * module.h: removes stdkeeper field from connobject, we don't need + it anymore. + + * cursor.c (dispose_pgconn): now sets self->keeper to NULL to + avoid decrementing the keeper refcnt two times when the cursor is + first closed and then destroyed. + + * connection.c (psyco_conn_cursor): fixed little bug in cursor + creation: now the connection is locked for the entire duration of + the cursor creation, to avoid a new cursor to be created with a + new keeper due to a delay in assigning the stdmanager cursor. + + * cursor.c: added calls to pgconn_set_critical() and to + EXC_IFCRITICAL() where we expect problems. Still segfaults but at + least raise an exception... + + * cursor.c (psyco_curs_autocommit): added exception if the + cursor's keeper is shared between more than 1 cursor. + + * module.h (EXC_IFCRITICAL): added this macro that call + pgconn_resolve_critical) on critical errors. + + * cursor.c (alloc_keeper): added check for pgres == NULL. + + * cursor.c (psyco_curs_destroy): merged psyco_curs_destroy() and + psyco_curs_close(): now both call _psyco_curs_close() and destroy + does only some extra cleanup. + +2001-05-03 Michele Comitini + + * ZPsycopgDA/db.py: Some cleanup to bring the zope product up to + date with the python module. Some bugs found thanks to Andre + Schubert. Now the ZDA should rely on the new serialized version + of psycopg. + + * cursor.c: while looking for problems in the ZDA some come out + here, with the inability to handle dropping connection correctly. + This leads to segfaults and is not fixed yet for lack of time. + Some problems found in cursors not willing to share the same + connection even if they should. Hopefully it should be fixed + soon. + +2001-04-26 Federico Di Gregorio + + * fixed bug reported by Andre Schubert by adding a new cast + function for long integers (int8 postgresql type.) at now they are + converted to python LongIntegers: not sure f simply convert to + floats. + + * michele applied patch from Ivo van der Wijk to make zpsycopgda + behave better when INSTANCE_HOME != SOFTWARE_HOME. + + * cursor.c (_psyco_curs_execute): also fill the 'columns' field. + + * module.h: added a 'columns' field to cursobject, to better + support the new dictionary fetch functions (dictfetchone(), + dictfetchmany(), dictfetchall().) + + * cursor.c: added the afore-mentioned functions (function names + are not definitive, they will follow decisions on the DBAPI SIG.) + +2001-04-03 Federico Di Gregorio + + * Release 0.5.1. + + * mcm fixed a nasty bug by correcting a typo in module.h. + +2001-03-30 Federico Di Gregorio + + * module.c (psyco_connect): added `serialized' named argument to + the .connect() method (takes 1 or 0 and initialize the connection + to the right serialization state.) + + * Makefile.pre.in (dist): fixed little bug, a missing -f argument + to rm. + + * examples/thread_test.py: removed all extension cruft. + + * examples/thread_test_x.py: this one uses extensions like the + per-cursor commit, autocommit, etc. + + * README (psycopg): added explanation on how .serialize() works. + + * connection.c (psyco_conn_serialize): added cursor serialization + and .serialize() method on the connection object. now we are + definitely DBAPI-2.0 compliant. + +2001-03-20 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): replaced some fields in + description with None, as suggested on the DB-SIG ML. + + * something like one hundred of little changes to allow cursors + share the same postgres connection. added connkeeper object and + pthread mutexes (both in connobject and connkeeper.) apparently it + works. this one will be 0.5.0, i think. + +2001-03-19 Michele Comitini + + * cursor.c: added mutexes, they do not interact well with python + threads :(. + +2001-03-16 Michele Comitini + + * ZPsycopgDA/db.py (ZDA): some fixes in table browsing. + +2001-03-16 Federico Di Gregorio + + * suite/tables.postgresql (TABLE_DESCRIPTIONS): fixed some typos + introduced by copying by hand the type values from pg_type.h. + + * suite/*: added some (badly) structured code to test for + DBAPI-2.0 compliance. + + * cursor.c (pgconn_notice_callback): now the NOTICE processor only + prints NOTICEs when psycopg has been compiled with the + --enable-devel switch. + + * connection.c: removed 'autocommit' attribute, now is a method as + specified in the DBAPI-2.0 document. + +2001-03-15 Federico Di Gregorio + + * connection.c (curs_commitall): splitted for cycle in two to + avoid the "bad snapshot" problem. + +2001-03-14 Federico Di Gregorio + + * Release 0.4.6. + + * cursor.c (_psyco_curs_execute): fixed nasty bug, there was an + free(query) left from before the execute/callproc split. + + * Preparing for 0.4.6. + +2001-03-13 Federico Di Gregorio + + * cursor.c (psyco_curs_execute): fixed some memory leaks in + argument parsing (the query string was not free()ed.) + (psyco_curs_callproc): implemented callproc() method on cursors. + (_psyco_curs_execute): this is the function that does the real + stuff for callproc() and execute(). + (pgconn_notice_*): added translation of notices into python + exceptions (do we really want that?) + + * configure.in: removed some cruft (old comments and strncasecmp() + check) + +2001-03-12 Federico Di Gregorio + + * examples/thread_test.py: added moronic argument parsing: now you + can give the dsn string on the command line... :( + + * Release 0.4.5. + +2001-03-10 Federico Di Gregorio + + * cursor.c (request_pgconn): added code to set datestyle to ISO on + new connections (many thanks to Yury for the code, + i changed it just a little bit to raise an exception on error.) + +2001-03-09 Federico Di Gregorio + + * Release 0.4.4. + + * ZPsycopgDA/db.py: michele fixed a nasty bug here. + +2001-03-08 Federico Di Gregorio + + * Release 0.4.3. + +2001-03-07 Federico Di Gregorio + + * Makefile.pre.in (dist): typeobj_builtins.c included for people + without pg_type.h. if you encounter type-casting problems like + results cast to the wrong type, simply "rm typeobj_builtins.c" and + rebuild. + + * typeobj.c (psyco_*_cast): removed RETURNIFNULL() macro from all + the builtin casting functions. (psyco_STRING_cast) does not create + a new string anymore, simply Py_INCREF its argument and return it. + + * cursor.c (psyco_curs_fetchone): removed strdup() call. added + PQgetisnull() test to differentiate between real NULLs and empty + strings. + + * Removed cursor.py (mcm, put tests in examples) and fixed some + typos in the dtml code. + +2001-03-04 Michele Comitini + + * examples/commit_test.py: Modifications to test argument passing + and string substitution to cursor functions, nothing more. + + * ZPsycopgDA/db.py: now it exploits some of the good features of + the psycopg driver, such as connection reusage and type + comparison. Code is smaller although it handles (and + reports) errors much better. + + * cursor.c: corrected a bug that left a closed cursor in the + cursor list of the connection. Now cursors are removed from the + lists either when they are close or when they are destroyed. + Better connection (TCP) error reporting and handling. + + +2001-03-02 Federico Di Gregorio + + * examples commit_test.py: added code to test autocommit. + + * examples/thread_test.py (ab_select): modified select thread to + test autocommit mode. + + * Release 0.4.1. + + * module.h, connection.c, cursor.c: added autocommit support. + +2001-02-28 Federico Di Gregorio + + * Release 0.4. + +2001-02-27 Michele Comitini + + * cursor.py: cut some unuseful code in psyco_curs_fetchmany() and + psyco_curs_fetchall() inserted an assert in case someting goes + wrong. + +2001-02-27 Federico Di Gregorio + + * debian/*: various changes to build both the python module and + the zope db adapter in different packages (respectively + python-psycopg and zope-psycopgda.) + + * examples/type_test.py: better and more modular tests. + + * typeobj.c: added DATE, TIME, DATETIME, BOOLEAN, BINARY and ROWID + types. (RETURNIFNULL) added NULL-test to builtin conversion + functions (using the RETURNIFNULL macro.) + +2001-02-26 Federico Di Gregorio + + * releasing 0.3 (added NEWS file.) + +2001-02-26 Michele Comitini + + * cursor.c: fetchmany() some cleanup done. + + * ZPsycopgDA/db.py, ZPsycopgDA/__init__.py, : fixes to make the + ZDA work some way. WARNING WARNING WARNING the zda is still + alpha code, but we need some feed back on it so please give it + a try. + +2001-02-26 Federico Di Gregorio + + * typeobj.c (psyco_STRING_cast): fixed bad bad bad bug. we + returned the string without coping it and the type-system was more + than happy to Py_DECREF() it and trash the whole system. fixed at + last! + + * module.h (Dprintf): added pid to every Dprintf() call, to + facilitate multi-threaded debug. + +2001-02-26 Michele Comitini + + * module.c: added code so that DateTime package need not to be + loaded to have mxDateTime. This should avoid clashing with + DateTime from the zope distribution. + + * cursor.c: setting error message in fetchmany when no more tuples + are left. This has to be fixed in fetch and fetchall to. + +2001-02-26 Federico Di Gregorio + + * configure.in: stepped up version to 0.3, ready to release + tomorrow morning. added check for path to DateTime module. + + * examples/usercast_test.py: generate some random boxes and + points, select the boxes with at least one point inside and print + them converting the PostgeSQL output using a user-specified cast + object. nice. + +2001-02-24 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): now an error in the python + callback when typecasting results raise the correct exception. + + * typeobj.c (psyco_DBAPITypeObject_call): removed extra Py_INCREF(). + +2001-02-23 Federico Di Gregorio + + * replaced every single instance of the string 'pgpy' with 'psyco' + (this was part of the general cleanup.) + + * type_test.py: added this little test program to the distribution + (use the new_type() method to create new instances of the type + objects.) + + * typeobj.c: general cleanup. fixed some bugs related to + refcounting (again!) + + * cursor.c: general cleanup. (request_pgconn) simplified by adding + a support function (_extract_pgconn.) + + * connection.c: general cleanup. replaced some ifs with asserts() + in utility functions when errors depend on programming errors and + not on runtime exceptions. (pgpy_conn_destroy) fixed little bug + when deleting available connections from the list. + + * module.h: general cleanup. + + * typeobj.h: general cleanup, better comments, made some function + declarations extern. + + * module.c: general cleanup, double-checked every function for + memory leaks. (pgpy_connect) removed unused variable 'connection'. + +2001-02-22 Federico Di Gregorio + + * typeobj.c: fixed lots of bugs, added NUMBER type object. now the + basic tests in type_test.py work pretty well. + + * cursor.c (pgpy_curs_fetchmany): fixed little bug, fetchmany() + reported one less row than available. + + * fixed lots of bugs in typeobj.c, typeobj.h, cursor.c. apparently + now the type system works. it is time to clean up things a little + bit. + +2001-02-21 Federico Di Gregorio + + * typeobj.c: separated type objects stuff from module.c + + * typeobj.h: separated type objects stuff from module.h + +2001-02-19 Federico Di Gregorio + + * cursor.c (pgpy_curs_fetchmany): now check size and adjust it to + be lesser or equal than the nuber of available rows. + +2001-02-18 Michele Comitini + + * module.c, module.h: added optional args maxconn and minconn to + connection functions + + * cursor.c: better error checking in request_pgconn. + + * connection.c: changed new_connect_obj to take as optional args + maxconn and minconn. Added the corresponding ro attributes to + connection objects. + + * cursor.py: added some code to stress test cursor reusage. + + * cursor.c: some fixes on closed cursors. + + * connection.c: corrections on some assert calls. + +2001-02-16 Federico Di Gregorio + + * configure.in: added --enable-priofile sqitch. changed VERSION to + 0.2: preparing for a new release. + + * cursor.c: added a couple of asserts. + +2001-02-16 Michele Comitini + + * cursor.c, connection.c: fixed the assert problem: assert must + take just the value to be tested! no assignemente must be done in + the argument of assert() otherwise is wiped when NDEBUG is set. + + * module.h: some syntax error fixed. Error in allocating a tuple + corrected in macro DBAPITypeObject_NEW(). + + * module.c: pgpy_DBAPITypeObject_init() is not declared static anymore. + + * cursor.c: executemany() now does not create and destroy tuples + for each list item, so it is much faster. + +2001-02-14 Michele Comitini + + * cursor.c: added again Py_DECREF on the cpcon after disposing + it. assert() with -DNDEBUG makes the driver segfault while it + should not. + + +2001-02-13 Federico Di Gregorio + + * some of the memory leak were memprof errors, bleah. resumed some + old code, fixed segfault, fixed other bugs, improved speed. almost + ready for a new release. + + * connection.c (pgpy_conn_destroy): replaced some impossible ifs + with aseert()s. + + * cursor.c (pgpy_curs_close): added Py_DECREF() to + self->descritpion to prevent a memory leak after an execute(). + + * connection.c (pgpy_conn_destroy): always access first element of + lists inside for cycles because removing items from the list makes + higher indices invalid. + + * cursor.c (dispose_pgconn): fixed memory leak, there was a + missing Py_DECREF() after the addition of the C object wrapping + the postgresql connection to the list of available connections. + + * cursor.c (dispose_pgconn): fixed another memory leak: an + orphaned cursor should call PQfinish() on its postgresql + connection because it has no python connection to give the + postgresql ine back. + + * cursor.c (pgpy_curs_execute): added Py_DECREF() of description + tuple after adding it to self->description. this one fixes the + execute() memory leak. + + * cursor.c (pgpy_curs_fetchall): added missing Py_DECREF() on row + data (obtained from fetchone().) this fixes the last memory leak. + (thread_test.py now runs without leaking memory!) + +2001-02-12 Federico Di Gregorio + + * INSTALL: removed wok cruft from head of this file. + + * debian/rules: debianized the sources. python-psycopg is about to + enter debian. mxDateTime header locally included until the + maintainer of python-mxdatetime includes them in his package + (where they do belong.) + + * autogen.sh: added option --dont-run-configure. + +2001-02-09 Federico Di Gregorio + + * module.c (initpsycopg): changed name of init function to match + new module name (also changed all the exception definitions.) + + * README: updated psycopg description (we have a new name!) + + * Ready for 0.1 release. + +2001-02-07 Michele Comitini + + * cursor.c: now executemany takes sequences and not just + tuples + +2001-02-07 Federico Di Gregorio + + * Makefile.pre.in: now dist target includes test programs + (thread_test.py) and README and INSTALL files. + + * configure.in: changed --with-devel to --enable-devel. little + cosmetical fixes to the option management. + + * connection.c, module.c, cursor.c, module.h: removed 'postgres/' + from #include directive. it is ./configure task to find the right + directory. + + * thread_test.py: added thread testing program. + +2001-02-07 Michele Comitini + + * cursor.c: added code to allow threads during PQexec() calls. + + * cursor.c: added begin_pgconn to rollback() and commit() + so that the cursror is not in autocommit mode. + + * cursor.c: added rollback() and commit() methods to cursor + objects. + + +2001-02-07 Federico Di Gregorio + + * connection.c (pgpy_conn_destroy): always delete item at index + 0 and not i (because items shift in the list while deleting and + accessing items at len(list)/2 segfaults.) + +2001-02-07 Michele Comitini + + * connection.c: added some more checking to avoid + clearing of already cleared pgresults. Calling curs_closall() + in conn_destroy() since cursors have to live even without + their parent connection, otherwise explicit deletion of + object referencing to those cursors can cause arbitrary code + to be executed. + + * cursor.c: some more checking to avoid trying to close + already close pgconnections. + +2001-02-06 Federico Di Gregorio + + * Makefile.pre.in (CFLAGS): added -Wall to catch bad programming + habits. + + * cursor.c, connection.c: lots of fixes to the destroy stuff. now + all the cursor are destroyed *before* the connection goes away. + + * cursor.c (request_pgconn): another idiot error done by not + replacing dsn with owner_conn->dsn. fixed. + (dispose_pgconn): commented if to guarantee that the connection is + returned to the pool of available connections. + + * merged changes done by mcm. + + * cursor.c: general cleanup and better debugging/error + messages. changed xxx_conn into xxx_pgconn where still + missing. some pretty big changes to the way pgconn_request() + allocates new connections. + + * connection.c: removed all 'register' integers. obsolete, gcc + does a much better job optimizing cycles than a programmer + specifying how to use registers. + + * module.h: some general cleanup and better definition of DPrintf + macro. now the DEBUG variable can be specified at configure time by + the --with-devel switch to ./configure. + +2001-02-02 Michele Comitini + + * cursor.c (Repository): Added functions for managing a connection + pool. Segfaults. + + * configure.in (Repository): removed check for mxdatetime headers. + +2001-01-24 Federico Di Gregorio + + * first checkout from shinning new init.d cvs. + + * autotoolized build system. note that the mx headers are missing + from the cvs, you should get them someplace else (this is the + right way to do it, just require the headers in the configure + script.) + +2001-01-21 Michele Comitini + + * cursor.c (Repository): commit, abort, begin functions now check + the right exit status of the command. + + * connection.c (Repository): working commit() and rollback() + methods. + +2001-01-20 Michele Comitini + + * module.h (Repository): added member to cursor struct to handle + queries without output tuples. + + * cursor.c (Repository): new working methods: executemany, + fetchone, fetchmany, fetchall. + +2001-01-18 Michele Comitini + + * cursor.c (Repository): close working. destroy calling close. + close frees pg structures correctly. + + * connection.c (Repository): close method working. destroy seems + working. + +2001-01-17 Michele Comitini + + * cursor.c (Repository): now each python cursor has its own + connection. Each cursor works in a transaction block. + + * connection.c (Repository): added cursor list to connection + object + +2001-01-14 Michele Comitini + + * cursor.c (Repository): Beginning of code to implement cursor + functionalities as specified in DBA API 2.0, through the use of + transactions not cursors. + + * connection.c (Repository): Added some error checking code for pg + connection (will be moved to cursor?). + +2001-01-13 Michele Comitini + + * connection.c (Repository): Added error checking in connection + code to fail if connection to the db could not be opened. + + * module.h (Repository): New macro to help creating + DBAPITypeObjects. + + * module.c (Repository): DBAPITypeObject __cmp__ function is now + very simplified using recursion. + + * module.h (Repository): "DBAPIObject" changed to + "DBAPITypeObject". + + * module.c (Repository): Fixes for coerce function of DBAPIObjects + by Federico Di Gregorio . + (Repository): Clean up and better naming for DBAPITypeObjects. + +2001-01-08 Michele Comitini + + * module.c (Repository): Corrected the exception hierarcy + + * connection.c (Repository): Begun to use the connection objects + of libpq + +2001-01-07 Michele Comitini + + * module.c (Repository): Added the Date/Time functions. + +2001-01-06 Michele Comitini + + * cursor.c (Repository): Skeleton of cursor interface. All + methods and attributes of cursor objects are now available + in python. They do nothing now. + +2001-01-05 Michele Comitini + + * module.c (Repository): Test version; module loaded with + exception defined. + +2001-01-05 Michele Comitini + + * Setup.in (Repository): Setup file. + + * Makefile.pre.in (Repository): from the python source. + +2001-01-05 Michele Comitini + + * module.c: Written some code for defining exceptions. + + * module.h: Static variable for exceptions. + +2001-01-04 Michele Comitini + + * Changelog: pre-release just a few prototypes to get started. + + diff --git a/psycopg2/doc/HACKING b/psycopg2/doc/HACKING new file mode 100644 index 0000000..f60474c --- /dev/null +++ b/psycopg2/doc/HACKING @@ -0,0 +1,43 @@ +General information +******************* + +Some help to people wanting to hack on psycopg. First of all, note that +*every* function in the psycopg module source code is prefixed by one of the +following words: + + psyco is used for function directly callable from python (i.e., functions + in the psycopg module itself.) the only notable exception is the + source code for the module itself, that uses "psyco" even for C-only + functions. + + conn is used for functions related to connection objects. + + curs is used for functions related to cursor objects. + + typecast is used for typecasters and utility function related to + typecaster creation and registration. + +Pythonic definition of types and functions available from python are defined +in *_type.c files. Internal functions, callable only from C are located in +*_int.c files and extensions to the DBAPI can be found in the *_ext.c files. + + +Patches +******* + +If you submit a patch, please send a diff generated with the "-u" switch. +Also note that I don't like that much cosmetic changes (like renaming +already existing variables) and I will rewrap the patch to 78 columns +anyway, so it is much better if you do that beforehand. + + +The type system +*************** + +Simple types, like integers and strings, are converted to python base types +(the conversion functions are in typecast_base.c). Complex types are +converted to ad-hoc types, defined in the typeobj_*.{c,h} files. The +conversion function are in the other typecast_*.c files. typecast.c defines +the basic utility functions (available through the psycopg module) used when +defining new typecasters from C and python. + diff --git a/psycopg2/doc/SUCCESS b/psycopg2/doc/SUCCESS new file mode 100644 index 0000000..9ae91f5 --- /dev/null +++ b/psycopg2/doc/SUCCESS @@ -0,0 +1,114 @@ +From: Jack Moffitt +To: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 22 Oct 2001 11:16:21 -0600 + +www.vorbis.com is serving from 5-10k pages per day with psycopg serving +data for most of that. + +I plan to use it for several of our other sites, so that number will +increase. + +I've never had a single problem (that wasn't my fault) besides those +segfaults, and those are now gone as well, and I've been using psycopg +since June (around 0.99.2?). + +jack. + + +From: Yury Don +To: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 09:53:11 +0600 + +We use psycopg and psycopg zope adapter since fisrt public +release (it seems version 0.4). Now it works on 3 our sites and in intranet +applications. We had few problems, but all problems were quckly +solved. The strong side of psycopg is that it's code is well organized +and easy to understand. When I found a problem with non-ISO datestyle in first +version of psycopg, it took for me 15 or 20 minutes to learn code and +to solve the problem, even thouth my knowledge of c were poor. + +BTW, segfault with dictfetchall on particular data set (see [Psycopg] +dictfetchXXX() problems) disappeared in 0.99.8pre2. + +-- +Best regards, +Yury Don + + +From: Tom Jenkins +To: Federico Di Gregorio +Cc: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 08:25:52 -0400 + +The US Govt Department of Labor's Office of Disability Employment +Policy's DisabilityDirect website is run on zope and zpsycopg. + + +From: Scott Leerssen +To: Federico Di Gregorio +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 09:56:10 -0400 + +Racemi's load management software infrastructure uses psycopg to handle +complex server allocation decisions, plus storage and access of +environmental conditions and accounting records for potentially +thousands of servers. Psycopg has, to this point, been the only +Python/PostGreSQL interface that could handle the scaling required for +our multithreaded applications. + +Scott + + +From: Andre Schubert +To: Federico Di Gregorio +Cc: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 11:46:07 +0200 + +i have changed the psycopg version to 0.99.8pre2 on all devel-machines +and all segfaults are gone. after my holiday i wil change to 0.99.8pre2 +or 1.0 on our production-server. +this server contains several web-sites which are all connected to +postgres over ZPsycopgDA. + +thanks as + + +From: Fred Wilson Horch +To: +Subject: [Psycopg] Success story for psycopg +Date: 23 Oct 2001 10:59:17 -0400 + +Due to various quirks of PyGreSQL and PoPy, EcoAccess has been looking for +a reliable, fast and relatively bug-free Python-PostgreSQL interface for +our project. + +Binary support in psycopg, along with the umlimited tuple size in +PostgreSQL 7.1, allowed us to quickly prototype a database-backed file +storage web application, which we're using for file sharing among our +staff and volunteers. Using a database backend instead of a file system +allows us to easily enrich the meta-information associated with each file +and simplifies our data handling routines. + +We've been impressed by the responsiveness of the psycopg team to bug +reports and feature requests, and we're looking forward to using psycopg +as the Python interface for additional database-backed web applications. + +Keep up the good work! +-- +Fred Wilson Horch mailto:fhorch@ecoaccess.org +Executive Director, EcoAccess http://ecoaccess.org/ + + +From: Damon Fasching +To: Michele Comitini +Cc: fog@debian.org +Subject: Re: How does one create a database within Python using psycopg? +Date: 25 Feb 2002 17:39:41 -0800 + +[snip] +btw I checked out 4 different Python-PostgreSQL packages. psycopg is the +only one which built and imported w/o any trouble! (At least for me.) diff --git a/psycopg2/doc/TODO b/psycopg2/doc/TODO new file mode 100644 index 0000000..b20b276 --- /dev/null +++ b/psycopg2/doc/TODO @@ -0,0 +1,33 @@ +TODO list for psycopg 2 or later +******************************** + +Move items to the DONE section only after writing a test for the +implementation. Also add a note on how the item was resolved. +(Obviously I was joking about the test..) + +* Find a better way to compile the type-casting code instead of including it + in typecast.c directy. (Including is not that bad, but the need to touch + psycopg/typecast.c every time is bad bad bad.) + +* executemany() should _not_ take the async flag, remove it and force multiple + queries to be synchronous. + +* Fix all the docstrings. + +* Support the protocols API fully. + +* Unify the common code in typecast_datetime.c and typecast_mxdatetime.c. + +* Port typecasters to new-style classes. + +* Write a complete postgresql<->python encodings table. + +* Implement binary typecasters (should be easy, but it will take time.) + +DONE +==== + +* Convert type-casters to new-style types in Python 2.2+. + +* callproc() never worked, fix it or remove it and raise right exception. + [Removed callproc code, now an exception is raised.] diff --git a/psycopg2/doc/api-screen.css b/psycopg2/doc/api-screen.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/psycopg2/doc/api-screen.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/psycopg2/doc/api/epydoc.css b/psycopg2/doc/api/epydoc.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/psycopg2/doc/api/epydoc.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/psycopg2/doc/api/index.html b/psycopg2/doc/api/index.html new file mode 100644 index 0000000..419bbcf --- /dev/null +++ b/psycopg2/doc/api/index.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/psycopg2/doc/api/private/__builtin__.list-class.html b/psycopg2/doc/api/private/__builtin__.list-class.html new file mode 100644 index 0000000..c8217a7 --- /dev/null +++ b/psycopg2/doc/api/private/__builtin__.list-class.html @@ -0,0 +1,817 @@ + + + + + __builtin__.list + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class list +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type list

+ +
+object --+
+         |
+        list
+

+ +
Known Subclasses:
+
+ DictRow
+ +
+ +

list() -> new list +list(sequence) -> new list initialized from sequence's items

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getitem__(x, + y) +
+Return x[y]...
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__add__(x, + y) +
(Addition operator) +

+
+
Returns:
+
+
+x+y
+
+
+
+
+
+ + +
+

__contains__(x, + y) +
(In operator) +

+
+
Returns:
+
+
+y in x
+
+
+
+
+
+ + +
+

__delitem__(x, + y) +
(Index deletion operator) +

+
+
Returns:
+
+
+del x[y]
+
+
+
+
+
+ + +
+

__delslice__(x, + i, + j) +
(Slice deletion operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+del x[i:j]
+
+
+
+
+
+ + +
+

__eq__(x, + y) +
(Equality operator) +

+
+
Returns:
+
+
+x==y
+
+
+
+
+
+ + +
+

__ge__(x, + y) +
(Greater-than-or-equals operator) +

+
+
Returns:
+
+
+x>=y
+
+
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__getitem__(x, + y) +
(Indexing operator) +

+
+
Returns:
+
+
+x[y]
+
+
+
+
+
+ + +
+

__getslice__(x, + i, + j) +
(Slicling operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]
+
+
+
+
+
+ + +
+

__gt__(x, + y) +
(Greater-than operator) +

+
+
Returns:
+
+
+x>y
+
+
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__iadd__(x, + y) +

+
+
Returns:
+
+
+x+=y
+
+
+
+
+
+ + +
+

__imul__(x, + y) +

+
+
Returns:
+
+
+x*=y
+
+
+
+
+
+ + +
+

__iter__(x) +

+
+
Returns:
+
+
+iter(x)
+
+
+
+
+
+ + +
+

__le__(x, + y) +
(Less-than-or-equals operator) +

+
+
Returns:
+
+
+x<=y
+
+
+
+
+
+ + +
+

__len__(x) +
(Length operator) +

+
+
Returns:
+
+
+len(x)
+
+
+
+
+
+ + +
+

__lt__(x, + y) +
(Less-than operator) +

+
+
Returns:
+
+
+x<y
+
+
+
+
+
+ + +
+

__mul__(x, + n) +

+
+
Returns:
+
+
+x*n
+
+
+
+
+
+ + +
+

__ne__(x, + y) +
(Inequality operator) +

+
+
Returns:
+
+
+x!=y
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__rmul__(x, + n) +

+
+
Returns:
+
+
+n*x
+
+
+
+
+
+ + +
+

__setitem__(x, + i, + y) +
(Index assignment operator) +

+
+
Returns:
+
+
+x[i]=y
+
+
+
+
+
+ + +
+

__setslice__(x, + i, + j, + y) +
(Slice assignment operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]=y
+
+
+
+
+
+ + +
+

append(L, + object) +

+

append object to end

+
+
+
+ + +
+

count(L, + value) +

+

return number of occurrences of value

+
+
Returns:
+
+
+integer
+
+
+
+
+
+ + +
+

extend(L, + iterable) +

+

extend list by appending elements from the iterable

+
+
+
+ + +
+

index(...) +

+

L.index(value, [start, [stop]]) -> integer -- return first index of value

+
+
+
+ + +
+

insert(L, + index, + object) +

+

insert object before index

+
+
+
+ + +
+

pop(L, + index=...) +

+

remove and return item at index (default last)

+
+
Returns:
+
+
+item
+
+
+
+
+
+ + +
+

remove(L, + value) +

+

remove first occurrence of value

+
+
+
+ + +
+

reverse(L) +

+

reverse IN PLACE

+
+
+
+ + +
+

sort(L, + cmpfunc=None) +

+

stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/__builtin__.object-class.html b/psycopg2/doc/api/private/__builtin__.object-class.html new file mode 100644 index 0000000..08d0af6 --- /dev/null +++ b/psycopg2/doc/api/private/__builtin__.object-class.html @@ -0,0 +1,270 @@ + + + + + __builtin__.object + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class object +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type object

+ +
Known Subclasses:
+
+ AbstractConnectionPool, + list, + SQL_IN, + type, + tzinfo, + connection, + cursor, + ISQLQuote
+ +
+ +

The most base type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + +
Class Variable Summary
type__class__ = __builtin__.type

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
+
+ + +
+

__reduce__(...) +

+

helper for pickle

+
+
+
+ + +
+

__reduce_ex__(...) +

+

helper for pickle

+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/__builtin__.type-class.html b/psycopg2/doc/api/private/__builtin__.type-class.html new file mode 100644 index 0000000..b388e76 --- /dev/null +++ b/psycopg2/doc/api/private/__builtin__.type-class.html @@ -0,0 +1,384 @@ + + + + + __builtin__.type + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class type +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type type

+ +
+object --+
+         |
+        type
+

+ +
+ +

type(object) -> the object's type +type(name, bases, dict) -> a new type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __call__(x, + ...) +
+Return x(...)...
 __cmp__(x, + y) +
+Return cmp(x,y)...
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
list of immediate subclasses__subclasses__() +
listmro() +
+return a type's method resolution order
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + + + + +
Property Summary
 __base__
 __basicsize__
 __dictoffset__
 __flags__
 __itemsize__
 __mro__
 __weakrefoffset__

+ + + + + + + + + + +
Class Variable Summary
tuple__bases__ = (<type 'object'>,) +
str__name__ = 'type' +

+ + + + + + +
Method Details
+ + +
+

__call__(x, + ...) +
(Call operator) +

+
+
Returns:
+
+
+x(...)
+
+
+
+
+
+ + +
+

__cmp__(x, + y) +
(Comparison operator) +

+
+
Returns:
+
+
+cmp(x,y)
+
+
+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
Overrides:
+
__builtin__.object.__delattr__
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
Overrides:
+
__builtin__.object.__setattr__
+
+
+
+ + +
+

__subclasses__() +

+
+
Returns:
+
+list of immediate subclasses
+
+
+
+ + +
+

mro() +

+

return a type's method resolution order

+
+
Returns:
+
+list
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

__bases__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'object'>,)                                                     
+
+
+
+
+
+ +

__name__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'type'                                                                 
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/datetime.tzinfo-class.html b/psycopg2/doc/api/private/datetime.tzinfo-class.html new file mode 100644 index 0000000..337ac1a --- /dev/null +++ b/psycopg2/doc/api/private/datetime.tzinfo-class.html @@ -0,0 +1,239 @@ + + + + + datetime.tzinfo + + + + + + + + + + + + + + + + + + + +
+ + Module datetime :: + Class tzinfo +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type tzinfo

+ +
+object --+
+         |
+        tzinfo
+

+ +
Known Subclasses:
+
+ FixedOffsetTimezone, + LocalTimezone
+ +
+ +

Abstract base class for time zone info objects.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 dst(...) +
+datetime -> DST offset in minutes east of UTC.
 fromutc(...) +
+datetime in UTC -> datetime in local time.
 tzname(...) +
+datetime -> string name of time zone.
 utcoffset(...) +
+datetime -> minutes east of UTC (negative for west of UTC).
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__reduce__(...) +

+

-> (cls, state)

+
+
Overrides:
+
__builtin__.object.__reduce__
+
+
+
+ + +
+

dst(...) +

+

datetime -> DST offset in minutes east of UTC.

+
+
+
+ + +
+

fromutc(...) +

+

datetime in UTC -> datetime in local time.

+
+
+
+ + +
+

tzname(...) +

+

datetime -> string name of time zone.

+
+
+
+ + +
+

utcoffset(...) +

+

datetime -> minutes east of UTC (negative for west of UTC).

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/epydoc.css b/psycopg2/doc/api/private/epydoc.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/psycopg2/doc/api/private/epydoc.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/psycopg2/doc/api/private/exceptions.Exception-class.html b/psycopg2/doc/api/private/exceptions.Exception-class.html new file mode 100644 index 0000000..3064c51 --- /dev/null +++ b/psycopg2/doc/api/private/exceptions.Exception-class.html @@ -0,0 +1,128 @@ + + + + + exceptions.Exception + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class Exception +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Exception

+ +
Known Subclasses:
+
+ StandardError
+ +
+ +

Common base class for all exceptions.

+
+ + + + + + + + + + + + +
Method Summary
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+
+
+
+ + +
+

__getitem__(...) +
(Indexing operator) +

+
+
+
+ + +
+

__str__(...) +
(Informal representation operator) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/exceptions.StandardError-class.html b/psycopg2/doc/api/private/exceptions.StandardError-class.html new file mode 100644 index 0000000..1b491dd --- /dev/null +++ b/psycopg2/doc/api/private/exceptions.StandardError-class.html @@ -0,0 +1,102 @@ + + + + + exceptions.StandardError + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class StandardError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class StandardError

+ +
+Exception --+
+            |
+           StandardError
+

+ +
Known Subclasses:
+
+ Error, + Warning
+ +
+ +

Base class for all standard Python exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/frames.html b/psycopg2/doc/api/private/frames.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/psycopg2/doc/api/private/frames.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/psycopg2/doc/api/private/help.html b/psycopg2/doc/api/private/help.html new file mode 100644 index 0000000..21f2560 --- /dev/null +++ b/psycopg2/doc/api/private/help.html @@ -0,0 +1,231 @@ + + + + + Help + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains:

+
    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +
+ +

Each Module Documentation page contains:

+
    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +
+ +

Each Class Documentation page contains:

+
    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +
+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies:

+
    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +
+ +

The Index page contains indices of terms and + identifiers:

+
    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +
+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ + + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
  +

+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/index.html b/psycopg2/doc/api/private/index.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/psycopg2/doc/api/private/index.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/psycopg2/doc/api/private/indices.html b/psycopg2/doc/api/private/indices.html new file mode 100644 index 0000000..6a224a1 --- /dev/null +++ b/psycopg2/doc/api/private/indices.html @@ -0,0 +1,666 @@ + + + + + Index + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Identifier Index
__add__Method in class __builtin__.list
__base__member_descriptor in class __builtin__.type
__bases__Variable in class __builtin__.type
__basicsize__member_descriptor in class __builtin__.type
__build_dictMethod in class psycopg2.psycopg1.cursor
__call__Method in class __builtin__.type
typeClass in module __builtin__
__cmp__Method in class __builtin__.type
__contains__Method in class __builtin__.list
__delattr__Method in class __builtin__.object
__delattr__Method in class __builtin__.type
__delitem__Method in class __builtin__.list
__delslice__Method in class __builtin__.list
__dictoffset__member_descriptor in class __builtin__.type
__eq__Method in class __builtin__.list
__flags__member_descriptor in class __builtin__.type
__ge__Method in class __builtin__.list
__getattribute__Method in class __builtin__.list
__getattribute__Method in class __builtin__.object
__getattribute__Method in class __builtin__.type
__getattribute__Method in class datetime.tzinfo
__getitem__Method in class __builtin__.list
__getitem__Method in class exceptions.Exception
__getitem__Method in class psycopg2.extras.DictRow
__getslice__Method in class __builtin__.list
__gt__Method in class __builtin__.list
__hash__Method in class __builtin__.list
__hash__Method in class __builtin__.object
__hash__Method in class __builtin__.type
__iadd__Method in class __builtin__.list
__imul__Method in class __builtin__.list
__init__Method in class __builtin__.list
__init__Method in class __builtin__.object
__init__Method in class exceptions.Exception
__init__Method in class psycopg2._psycopg.ISQLQuote
__init__Method in class psycopg2._psycopg.connection
__init__Method in class psycopg2._psycopg.cursor
__init__Method in class psycopg2.extras.DictRow
__init__Method in class psycopg2.extras.SQL_IN
__init__Method in class psycopg2.pool.AbstractConnectionPool
__init__Method in class psycopg2.pool.PersistentConnectionPool
__init__Method in class psycopg2.pool.ThreadedConnectionPool
__init__Method in class psycopg2.tz.FixedOffsetTimezone
__itemsize__member_descriptor in class __builtin__.type
__iter__Method in class __builtin__.list
__iter__Method in class psycopg2._psycopg.cursor
__le__Method in class __builtin__.list
__len__Method in class __builtin__.list
__lt__Method in class __builtin__.list
__mro__member_descriptor in class __builtin__.type
__mul__Method in class __builtin__.list
__name__Variable in class __builtin__.type
__ne__Method in class __builtin__.list
__new__Method in class __builtin__.list
__new__Method in class __builtin__.object
__new__Method in class __builtin__.type
__new__Method in class datetime.tzinfo
__new__Method in class psycopg2._psycopg.ISQLQuote
__new__Method in class psycopg2._psycopg.connection
__new__Method in class psycopg2._psycopg.cursor
__reduce__Method in class __builtin__.object
__reduce__Method in class datetime.tzinfo
__reduce_ex__Method in class __builtin__.object
__repr__Method in class __builtin__.list
__repr__Method in class __builtin__.object
__repr__Method in class __builtin__.type
__repr__Method in class psycopg2._psycopg.connection
__repr__Method in class psycopg2._psycopg.cursor
__rmul__Method in class __builtin__.list
__setattr__Method in class __builtin__.object
__setattr__Method in class __builtin__.type
__setitem__Method in class __builtin__.list
__setslice__Method in class __builtin__.list
__str__Method in class __builtin__.object
__str__Method in class exceptions.Exception
__str__Method in class psycopg2._psycopg.connection
__str__Method in class psycopg2._psycopg.cursor
__subclasses__Method in class __builtin__.type
__version__Variable in module psycopg2._psycopg
__weakrefoffset__member_descriptor in class __builtin__.type
_build_indexMethod in class psycopg2.extras.DictCursor
_C_APIVariable in module psycopg2._psycopg
_closeallMethod in class psycopg2.pool.AbstractConnectionPool
_connectMethod in class psycopg2.pool.AbstractConnectionPool
__query_executedVariable in class psycopg2.extras.DictCursor
_getconnMethod in class psycopg2.pool.AbstractConnectionPool
_getkeyMethod in class psycopg2.pool.AbstractConnectionPool
_isdstMethod in class psycopg2.tz.LocalTimezone
_nameVariable in class psycopg2.tz.FixedOffsetTimezone
_offsetVariable in class psycopg2.tz.FixedOffsetTimezone
_psycopgModule in package psycopg2
_putconnMethod in class psycopg2.pool.AbstractConnectionPool
_wrappedmember_descriptor in class psycopg2._psycopg.ISQLQuote
AbstractConnectionPoolClass in module psycopg2.pool
adaptFunction in module psycopg2.extensions
adaptersVariable in module psycopg2._psycopg
apilevelVariable in module psycopg2._psycopg
appendMethod in class __builtin__.list
arraysizemember_descriptor in class psycopg2._psycopg.cursor
AsIsFunction in module psycopg2.extensions
autocommitMethod in class psycopg2.psycopg1.connection
BinaryFunction in package psycopg2
BINARYVariable in module psycopg2._psycopg
binary_typesVariable in module psycopg2._psycopg
binary_typesmember_descriptor in class psycopg2._psycopg.cursor
BINARYARRAYVariable in module psycopg2._psycopg
BOOLEANVariable in module psycopg2._psycopg
BooleanFunction in module psycopg2.extensions
BOOLEANARRAYVariable in module psycopg2._psycopg
callprocMethod in class psycopg2._psycopg.cursor
callprocMethod in class psycopg2.extras.DictCursor
closeMethod in class psycopg2._psycopg.connection
closeMethod in class psycopg2._psycopg.cursor
closeallMethod in class psycopg2.pool.PersistentConnectionPool
closeallMethod in class psycopg2.pool.ThreadedConnectionPool
closedmember_descriptor in class psycopg2._psycopg.connection
commitMethod in class psycopg2._psycopg.connection
connectFunction in package psycopg2
connectFunction in module psycopg2.psycopg1
connectionClass in module psycopg2._psycopg
connectionmember_descriptor in class psycopg2._psycopg.cursor
connectionClass in module psycopg2.psycopg1
copy_fromMethod in class psycopg2._psycopg.cursor
copy_toMethod in class psycopg2._psycopg.cursor
countMethod in class __builtin__.list
cursorMethod in class psycopg2._psycopg.connection
cursorClass in module psycopg2._psycopg
cursorMethod in class psycopg2.extras.DictConnection
cursorMethod in class psycopg2.psycopg1.connection
cursorClass in module psycopg2.psycopg1
DatabaseErrorClass in package psycopg2
DatabaseErrormember_descriptor in class psycopg2._psycopg.connection
DataErrorClass in package psycopg2
DataErrormember_descriptor in class psycopg2._psycopg.connection
DateFunction in package psycopg2
DATEVariable in module psycopg2._psycopg
DATEARRAYVariable in module psycopg2._psycopg
DateFromPyFunction in module psycopg2.extensions
DateFromTicksFunction in package psycopg2
DATETIMEVariable in module psycopg2._psycopg
DATETIMEARRAYVariable in module psycopg2._psycopg
dbgFunction in module psycopg2.pool
DECIMALVariable in module psycopg2._psycopg
DECIMALARRAYVariable in module psycopg2._psycopg
descriptionmember_descriptor in class psycopg2._psycopg.cursor
DictConnectionClass in module psycopg2.extras
DictCursorClass in module psycopg2.extras
dictfetchallMethod in class psycopg2.psycopg1.cursor
dictfetchmanyMethod in class psycopg2.psycopg1.cursor
dictfetchoneMethod in class psycopg2.psycopg1.cursor
DictRowClass in module psycopg2.extras
dsnmember_descriptor in class psycopg2._psycopg.connection
dstMethod in class datetime.tzinfo
dstMethod in class psycopg2.tz.FixedOffsetTimezone
dstMethod in class psycopg2.tz.LocalTimezone
DSTDIFFVariable in module psycopg2.tz
encodingmember_descriptor in class psycopg2._psycopg.connection
encodingsVariable in module psycopg2._psycopg
ErrorClass in package psycopg2
Errormember_descriptor in class psycopg2._psycopg.connection
ExceptionClass in module exceptions
executeMethod in class psycopg2._psycopg.cursor
executeMethod in class psycopg2.extras.DictCursor
executemanyMethod in class psycopg2._psycopg.cursor
extendMethod in class __builtin__.list
extensionsModule in package psycopg2
extrasModule in package psycopg2
fetchallMethod in class psycopg2._psycopg.cursor
fetchallMethod in class psycopg2.extras.DictCursor
fetchmanyMethod in class psycopg2._psycopg.cursor
fetchmanyMethod in class psycopg2.extras.DictCursor
fetchoneMethod in class psycopg2._psycopg.cursor
fetchoneMethod in class psycopg2.extras.DictCursor
filenoMethod in class psycopg2._psycopg.cursor
FixedOffsetTimezoneClass in module psycopg2.tz
FLOATVariable in module psycopg2._psycopg
FLOATARRAYVariable in module psycopg2._psycopg
fromutcMethod in class datetime.tzinfo
getMethod in class psycopg2.extras.DictRow
getbinaryMethod in class psycopg2._psycopg.ISQLQuote
getbufferMethod in class psycopg2._psycopg.ISQLQuote
getconnMethod in class psycopg2.pool.PersistentConnectionPool
getconnMethod in class psycopg2.pool.ThreadedConnectionPool
getquotedMethod in class psycopg2._psycopg.ISQLQuote
getquotedMethod in class psycopg2.extras.SQL_IN
has_keyMethod in class psycopg2.extras.DictRow
indexMethod in class __builtin__.list
insertMethod in class __builtin__.list
INTEGERVariable in module psycopg2._psycopg
INTEGERARRAYVariable in module psycopg2._psycopg
IntegrityErrorClass in package psycopg2
IntegrityErrormember_descriptor in class psycopg2._psycopg.connection
InterfaceErrorClass in package psycopg2
InterfaceErrormember_descriptor in class psycopg2._psycopg.connection
InternalErrorClass in package psycopg2
InternalErrormember_descriptor in class psycopg2._psycopg.connection
INTERVALVariable in module psycopg2._psycopg
INTERVALARRAYVariable in module psycopg2._psycopg
IntervalFromPyFunction in module psycopg2.extensions
isolation_levelmember_descriptor in class psycopg2._psycopg.connection
ISOLATION_LEVEL_AUTOCOMMITVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_COMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_UNCOMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_REPEATABLE_READVariable in module psycopg2.extensions
ISOLATION_LEVEL_SERIALIZABLEVariable in module psycopg2.extensions
ISQLQuoteClass in module psycopg2._psycopg
isreadyMethod in class psycopg2._psycopg.cursor
itemsMethod in class psycopg2.extras.DictRow
keysMethod in class psycopg2.extras.DictRow
lastrowidmember_descriptor in class psycopg2._psycopg.cursor
listClass in module __builtin__
ListFunction in module psycopg2._psycopg
LOCALVariable in module psycopg2.tz
LocalTimezoneClass in module psycopg2.tz
LONGINTEGERVariable in module psycopg2._psycopg
LONGINTEGERARRAYVariable in module psycopg2._psycopg
mogrifyMethod in class psycopg2._psycopg.cursor
mroMethod in class __builtin__.type
namemember_descriptor in class psycopg2._psycopg.cursor
new_typeFunction in module psycopg2.extensions
nextMethod in class psycopg2._psycopg.cursor
nextsetMethod in class psycopg2._psycopg.cursor
noticesmember_descriptor in class psycopg2._psycopg.connection
notifiesmember_descriptor in class psycopg2._psycopg.connection
NotSupportedErrorClass in package psycopg2
NotSupportedErrormember_descriptor in class psycopg2._psycopg.connection
NUMBERVariable in module psycopg2._psycopg
objectClass in module __builtin__
OperationalErrorClass in package psycopg2
OperationalErrormember_descriptor in class psycopg2._psycopg.connection
paramstyleVariable in module psycopg2._psycopg
PersistentConnectionPoolClass in module psycopg2.pool
poolModule in package psycopg2
PoolErrorClass in module psycopg2.pool
popMethod in class __builtin__.list
ProgrammingErrorClass in package psycopg2
ProgrammingErrormember_descriptor in class psycopg2._psycopg.connection
psycopg1Module in package psycopg2
psycopg2Package
putconnMethod in class psycopg2.pool.PersistentConnectionPool
putconnMethod in class psycopg2.pool.ThreadedConnectionPool
PYDATEVariable in module psycopg2._psycopg
PYDATETIMEVariable in module psycopg2._psycopg
PYINTERVALVariable in module psycopg2._psycopg
PYTIMEVariable in module psycopg2._psycopg
querymember_descriptor in class psycopg2._psycopg.cursor
QuotedStringFunction in module psycopg2.extensions
register_adapterFunction in module psycopg2.extensions
register_typeFunction in module psycopg2.extensions
removeMethod in class __builtin__.list
reverseMethod in class __builtin__.list
rollbackMethod in class psycopg2._psycopg.connection
row_factorymember_descriptor in class psycopg2._psycopg.cursor
rowcountmember_descriptor in class psycopg2._psycopg.cursor
ROWIDVariable in module psycopg2._psycopg
ROWIDARRAYVariable in module psycopg2._psycopg
rownumbermember_descriptor in class psycopg2._psycopg.cursor
scrollMethod in class psycopg2._psycopg.cursor
set_client_encodingMethod in class psycopg2._psycopg.connection
set_isolation_levelMethod in class psycopg2._psycopg.connection
setinputsizesMethod in class psycopg2._psycopg.cursor
setoutputsizeMethod in class psycopg2._psycopg.cursor
SimpleConnectionPoolClass in module psycopg2.pool
sortMethod in class __builtin__.list
SQL_INClass in module psycopg2.extras
StandardErrorClass in module exceptions
statusmessagemember_descriptor in class psycopg2._psycopg.cursor
STDOFFSETVariable in module psycopg2.tz
STRINGVariable in module psycopg2._psycopg
string_typesmember_descriptor in class psycopg2._psycopg.cursor
string_typesVariable in module psycopg2._psycopg
STRINGARRAYVariable in module psycopg2._psycopg
ThreadedConnectionPoolClass in module psycopg2.pool
threadsafetyVariable in module psycopg2._psycopg
TimeFunction in package psycopg2
TIMEVariable in module psycopg2._psycopg
TIMEARRAYVariable in module psycopg2._psycopg
TimeFromPyFunction in module psycopg2.extensions
TimeFromTicksFunction in package psycopg2
TimestampFunction in package psycopg2
TimestampFromPyFunction in module psycopg2.extensions
TimestampFromTicksFunction in package psycopg2
typeClass in module __builtin__
typecastermember_descriptor in class psycopg2._psycopg.cursor
tzModule in package psycopg2
tzinfoClass in module datetime
tzinfo_factorymember_descriptor in class psycopg2._psycopg.cursor
tznameMethod in class datetime.tzinfo
tznameMethod in class psycopg2.tz.FixedOffsetTimezone
tznameMethod in class psycopg2.tz.LocalTimezone
UNICODEVariable in module psycopg2._psycopg
UNICODEARRAYVariable in module psycopg2._psycopg
utcoffsetMethod in class datetime.tzinfo
utcoffsetMethod in class psycopg2.tz.FixedOffsetTimezone
utcoffsetMethod in class psycopg2.tz.LocalTimezone
valuesMethod in class psycopg2.extras.DictRow
WarningClass in package psycopg2
Warningmember_descriptor in class psycopg2._psycopg.connection
ZEROVariable in module psycopg2.tz
+
+ + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2-module.html b/psycopg2/doc/api/private/psycopg2-module.html new file mode 100644 index 0000000..dd7e92d --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2-module.html @@ -0,0 +1,336 @@ + + + + + psycopg2 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Package psycopg2

+ +

A Python driver for PostgreSQL

+

psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being very +small and fast, and stable as a rock.

+

Homepage: http://initd.org/projects/psycopg2

+
+ + + + + + +
Submodules
    +
  • extensions: psycopg extensions to the DBAPI-2.0
  • +
  • extras: Miscellaneous goodies for psycopg2
  • +
  • pool: Connection pooling for psycopg2
  • +
  • psycopg1: psycopg 1.1.x compatibility module
  • +
  • tz: tzinfo implementations for psycopg2
  • +
  • _psycopg: psycopg PostgreSQL driver
  • +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Exceptions
+ DatabaseErrorError related to the database engine.
+ DataErrorError related to problems with the processed data.
+ ErrorBase class for error exceptions.
+ IntegrityErrorError related to database integrity.
+ InterfaceErrorError related to the database interface.
+ InternalErrorThe database encountered an internal error.
+ NotSupportedErrorA not supported datbase API was called.
+ OperationalErrorError related to database operation (disconnect, memory allocation etc).
+ ProgrammingErrorError related to database programming (SQL error, table not found etc).
+ WarningA database warning.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
    Connections creation
extensions.connectionconnect(dsn, + ...) +
+Create a new database connection.
    Value objects constructors
new binary objectBinary(buffer) +
+Build an object capable to hold a bynary string value.
new dateDate(year, + month, + day) +
+Build an object holding a date value.
new dateDateFromTicks(ticks) +
+Build an object holding a date value from the given ticks value.
new timeTime(hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a time value.
new timeTimeFromTicks(ticks) +
+Build an object holding a time value from the given ticks value.
new timestampTimestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a timestamp value.
new timestampTimestampFromTicks(ticks) +
+Build an object holding a timestamp value from the given ticks value.

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+

Create a new database connection.

+

This function supports two different but equivalent sets of arguments. +A single data source name or dsn string can be used to specify the +connection parameters, as follows:

+
+psycopg2.connect("dbname=xxx user=xxx ...")
+
+

If dsn is not provided it is possible to pass the parameters as +keyword arguments; e.g.:

+
+psycopg2.connect(database='xxx', user='xxx', ...)
+
+

The full list of available parameters is:

+
    +
  • dbname -- database name (only in 'dsn')
  • +
  • database -- database name (only as keyword argument)
  • +
  • host -- host address (defaults to UNIX socket if not provided)
  • +
  • port -- port number (defaults to 5432 if not provided)
  • +
  • user -- user name used to authenticate
  • +
  • password -- password used to authenticate
  • +
  • sslmode -- SSL mode (see PostgreSQL documentation)
  • +
+

If the connection_factory keyword argument is not provided this +function always return an instance of the connection class. +Else the given sub-class of extensions.connection will be used to +instantiate the connection object.

+
+
Returns:
+
+New database connection
           + (type=extensions.connection) +
+
+
+
+ + +
+

Binary(buffer) +

+

Build an object capable to hold a bynary string value.

+
+
Returns:
+
+new binary object
+
+
+
+ + +
+

Date(year, + month, + day) +

+

Build an object holding a date value.

+
+
Returns:
+
+new date
+
+
+
+ + +
+

DateFromTicks(ticks) +

+

Build an object holding a date value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new date
+
+
+
+ + +
+

Time(hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a time value.

+
+
Returns:
+
+new time
+
+
+
+ + +
+

TimeFromTicks(ticks) +

+

Build an object holding a time value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new time
+
+
+
+ + +
+

Timestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a timestamp value.

+
+
Returns:
+
+new timestamp
+
+
+
+ + +
+

TimestampFromTicks(ticks) +

+

Build an object holding a timestamp value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new timestamp
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.DataError-class.html b/psycopg2/doc/api/private/psycopg2.DataError-class.html new file mode 100644 index 0000000..5805400 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.DataError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.DataError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DataError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DataError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       DataError
+

+ +
+ +

Error related to problems with the processed data.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.DatabaseError-class.html b/psycopg2/doc/api/private/psycopg2.DatabaseError-class.html new file mode 100644 index 0000000..adc28d4 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.DatabaseError-class.html @@ -0,0 +1,110 @@ + + + + + psycopg2.DatabaseError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DatabaseError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DatabaseError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   DatabaseError
+

+ +
Known Subclasses:
+
+ DataError, + IntegrityError, + InternalError, + NotSupportedError, + OperationalError, + ProgrammingError
+ +
+ +

Error related to the database engine.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.Error-class.html b/psycopg2/doc/api/private/psycopg2.Error-class.html new file mode 100644 index 0000000..33bff57 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.Error-class.html @@ -0,0 +1,105 @@ + + + + + psycopg2.Error + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Error +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Error

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Error
+

+ +
Known Subclasses:
+
+ DatabaseError, + InterfaceError, + PoolError
+ +
+ +

Base class for error exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.IntegrityError-class.html b/psycopg2/doc/api/private/psycopg2.IntegrityError-class.html new file mode 100644 index 0000000..c1804f6 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.IntegrityError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.IntegrityError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class IntegrityError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class IntegrityError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       IntegrityError
+

+ +
+ +

Error related to database integrity.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.InterfaceError-class.html b/psycopg2/doc/api/private/psycopg2.InterfaceError-class.html new file mode 100644 index 0000000..099ee90 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.InterfaceError-class.html @@ -0,0 +1,101 @@ + + + + + psycopg2.InterfaceError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InterfaceError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InterfaceError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   InterfaceError
+

+ +
+ +

Error related to the database interface.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.InternalError-class.html b/psycopg2/doc/api/private/psycopg2.InternalError-class.html new file mode 100644 index 0000000..5390de5 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.InternalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.InternalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InternalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InternalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       InternalError
+

+ +
+ +

The database encountered an internal error.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.NotSupportedError-class.html b/psycopg2/doc/api/private/psycopg2.NotSupportedError-class.html new file mode 100644 index 0000000..c677f5b --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.NotSupportedError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.NotSupportedError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class NotSupportedError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class NotSupportedError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       NotSupportedError
+

+ +
+ +

A not supported datbase API was called.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.OperationalError-class.html b/psycopg2/doc/api/private/psycopg2.OperationalError-class.html new file mode 100644 index 0000000..6cca463 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.OperationalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.OperationalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class OperationalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class OperationalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       OperationalError
+

+ +
+ +

Error related to database operation (disconnect, memory allocation etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.ProgrammingError-class.html b/psycopg2/doc/api/private/psycopg2.ProgrammingError-class.html new file mode 100644 index 0000000..9fcd4ef --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.ProgrammingError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.ProgrammingError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class ProgrammingError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class ProgrammingError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       ProgrammingError
+

+ +
+ +

Error related to database programming (SQL error, table not found etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.Warning-class.html b/psycopg2/doc/api/private/psycopg2.Warning-class.html new file mode 100644 index 0000000..741c9a7 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.Warning-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.Warning + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Warning +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Warning

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Warning
+

+ +
+ +

A database warning.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2._psycopg-module.html b/psycopg2/doc/api/private/psycopg2._psycopg-module.html new file mode 100644 index 0000000..6e4cb25 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2._psycopg-module.html @@ -0,0 +1,1072 @@ + + + + + psycopg2._psycopg + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2._psycopg

+ +

psycopg PostgreSQL driver

+
+ + + + + + + + + + + +
Classes
+ connectionconnection(dsn, ...) -> new connection object
+ cursorA database cursor.
+ ISQLQuoteAbstract ISQLQuote protocol

+ + + + + + + + +
Function Summary
new quoted listList(list, + enc) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Summary
str__version__ = '2.0b7 (dt ext pq3)' +
PyCObject_C_API = <PyCObject object at 0x0076A320> +
dictadapters = {(<type 'bool'>, <type 'psycopg2._psycopg.ISQ... +
strapilevel = '2.0' +
typeBINARY = <psycopg2._psycopg.type object at 0x00847A00> +
dictbinary_types = {} +
typeBINARYARRAY = <psycopg2._psycopg.type object at 0x00847C... +
typeBOOLEAN = <psycopg2._psycopg.type object at 0x00847880> +
typeBOOLEANARRAY = <psycopg2._psycopg.type object at 0x00847... +
typeDATE = <psycopg2._psycopg.type object at 0x00847960> +
typeDATEARRAY = <psycopg2._psycopg.type object at 0x00847C20... +
typeDATETIME = <psycopg2._psycopg.type object at 0x008478C0> +
typeDATETIMEARRAY = <psycopg2._psycopg.type object at 0x0084... +
typeDECIMAL = <psycopg2._psycopg.type object at 0x008477A0> +
typeDECIMALARRAY = <psycopg2._psycopg.type object at 0x00847... +
dictencodings = {'UTF8': 'utf_8', 'LATIN-1': 'latin_1', 'SQL... +
typeFLOAT = <psycopg2._psycopg.type object at 0x00847740> +
typeFLOATARRAY = <psycopg2._psycopg.type object at 0x00847AE... +
typeINTEGER = <psycopg2._psycopg.type object at 0x00847700> +
typeINTEGERARRAY = <psycopg2._psycopg.type object at 0x00847... +
typeINTERVAL = <psycopg2._psycopg.type object at 0x008479A0> +
typeINTERVALARRAY = <psycopg2._psycopg.type object at 0x0084... +
typeLONGINTEGER = <psycopg2._psycopg.type object at 0x008476... +
typeLONGINTEGERARRAY = <psycopg2._psycopg.type object at 0x0... +
typeNUMBER = <psycopg2._psycopg.type object at 0x00847680> +
strparamstyle = 'pyformat' +
typePYDATE = <psycopg2._psycopg.type object at 0x00847DC0> +
typePYDATETIME = <psycopg2._psycopg.type object at 0x00847D2... +
typePYINTERVAL = <psycopg2._psycopg.type object at 0x00847DE... +
typePYTIME = <psycopg2._psycopg.type object at 0x00847D60> +
typeROWID = <psycopg2._psycopg.type object at 0x00847A60> +
typeROWIDARRAY = <psycopg2._psycopg.type object at 0x00847CC... +
typeSTRING = <psycopg2._psycopg.type object at 0x00847820> +
dictstring_types = {1028: <psycopg2._psycopg.type object at ... +
typeSTRINGARRAY = <psycopg2._psycopg.type object at 0x00847B... +
intthreadsafety = 2                                                                     
typeTIME = <psycopg2._psycopg.type object at 0x00847900> +
typeTIMEARRAY = <psycopg2._psycopg.type object at 0x00847BE0... +
typeUNICODE = <psycopg2._psycopg.type object at 0x008477E0> +
typeUNICODEARRAY = <psycopg2._psycopg.type object at 0x00847... +

+ + + + + + +
Function Details
+ + +
+

List(list, + enc) +

+
+
Returns:
+
+new quoted list
+
+
+
+
+ + + + + + +
Variable Details
+
+ +

__version__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0b7 (dt ext pq3)'                                                   
+
+
+
+
+
+ +

_C_API

+
+
+
+
+
Type:
+
+ PyCObject + +
+
Value:
+
+
+<PyCObject object at 0x0076A320>                                       
+
+
+
+
+
+ +

adapters

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{(<type 'datetime.timedelta'>, <type 'psycopg2._psycopg.ISQLQuote'>): \
+<built-in function IntervalFromPy>,
+ (<type 'datetime.date'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function DateFromPy>,
+ (<type 'datetime.time'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function TimeFromPy>,
+ (<type 'datetime.datetime'>, <type 'psycopg2._psycopg.ISQLQuote'>): <\
+built-in function TimestampFromPy>,
+...                                                                    
+
+
+
+
+
+ +

apilevel

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0'                                                                  
+
+
+
+
+
+ +

BINARY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847A00>                          
+
+
+
+
+
+ +

binary_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{}                                                                     
+
+
+
+
+
+ +

BINARYARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847CA0>                          
+
+
+
+
+
+ +

BOOLEAN

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847880>                          
+
+
+
+
+
+ +

BOOLEANARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847BA0>                          
+
+
+
+
+
+ +

DATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847960>                          
+
+
+
+
+
+ +

DATEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847C20>                          
+
+
+
+
+
+ +

DATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008478C0>                          
+
+
+
+
+
+ +

DATETIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847BC0>                          
+
+
+
+
+
+ +

DECIMAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008477A0>                          
+
+
+
+
+
+ +

DECIMALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847B20>                          
+
+
+
+
+
+ +

encodings

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'LATIN-1': 'latin_1',
+ 'LATIN1': 'latin_1',
+ 'SQL_ASCII': 'ascii',
+ 'UNICODE': 'utf_8',
+ 'UTF8': 'utf_8'}                                                      
+
+
+
+
+
+ +

FLOAT

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847740>                          
+
+
+
+
+
+ +

FLOATARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847AE0>                          
+
+
+
+
+
+ +

INTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847700>                          
+
+
+
+
+
+ +

INTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847AC0>                          
+
+
+
+
+
+ +

INTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008479A0>                          
+
+
+
+
+
+ +

INTERVALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847C60>                          
+
+
+
+
+
+ +

LONGINTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008476C0>                          
+
+
+
+
+
+ +

LONGINTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847AA0>                          
+
+
+
+
+
+ +

NUMBER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847680>                          
+
+
+
+
+
+ +

paramstyle

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'pyformat'                                                             
+
+
+
+
+
+ +

PYDATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847DC0>                          
+
+
+
+
+
+ +

PYDATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847D20>                          
+
+
+
+
+
+ +

PYINTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847DE0>                          
+
+
+
+
+
+ +

PYTIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847D60>                          
+
+
+
+
+
+ +

ROWID

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847A60>                          
+
+
+
+
+
+ +

ROWIDARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847CC0>                          
+
+
+
+
+
+ +

STRING

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847820>                          
+
+
+
+
+
+ +

string_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{16: <psycopg2._psycopg.type object at 0x00847880>,
+ 17: <psycopg2._psycopg.type object at 0x00847A00>,
+ 18: <psycopg2._psycopg.type object at 0x00847820>,
+ 19: <psycopg2._psycopg.type object at 0x00847820>,
+ 20: <psycopg2._psycopg.type object at 0x008476C0>,
+ 21: <psycopg2._psycopg.type object at 0x00847700>,
+ 23: <psycopg2._psycopg.type object at 0x00847700>,
+ 25: <psycopg2._psycopg.type object at 0x00847820>,
+...                                                                    
+
+
+
+
+
+ +

STRINGARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847B60>                          
+
+
+
+
+
+ +

threadsafety

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

TIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847900>                          
+
+
+
+
+
+ +

TIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847BE0>                          
+
+
+
+
+
+ +

UNICODE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008477E0>                          
+
+
+
+
+
+ +

UNICODEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847B40>                          
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2._psycopg.ISQLQuote-class.html b/psycopg2/doc/api/private/psycopg2._psycopg.ISQLQuote-class.html new file mode 100644 index 0000000..3a7db8e --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2._psycopg.ISQLQuote-class.html @@ -0,0 +1,221 @@ + + + + + psycopg2._psycopg.ISQLQuote + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg :: + Class ISQLQuote +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ISQLQuote

+ +
+object --+
+         |
+        ISQLQuote
+

+ +
+ +

Abstract ISQLQuote protocol

+

An object conform to this protocol should expose a getquoted() method +returning the SQL representation of the object.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 getbinary() +
+return SQL-quoted binary representation of this object
 getbuffer() +
+return this object
 getquoted() +
+return SQL-quoted representation of this object
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + +
Property Summary
 _wrapped

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

getbinary() +

+

return SQL-quoted binary representation of this object

+
+
+
+ + +
+

getbuffer() +

+

return this object

+
+
+
+ + +
+

getquoted() +

+

return SQL-quoted representation of this object

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2._psycopg.connection-class.html b/psycopg2/doc/api/private/psycopg2._psycopg.connection-class.html new file mode 100644 index 0000000..0b6076e --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2._psycopg.connection-class.html @@ -0,0 +1,405 @@ + + + + + psycopg2._psycopg.connection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg :: + Class connection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type connection

+ +
+object --+
+         |
+        connection
+

+ +
Known Subclasses:
+
+ connection, + DictConnection
+ +
+ +

connection(dsn, ...) -> new connection object

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the connection.
 commit() +
+Commit all changes to database.
extensions.cursorcursor(cursor_factory) +
+new cursor
 rollback() +
+Roll back all changes done to database.
 set_client_encoding(encoding) +
+Set client encoding to encoding.
 set_isolation_level(level) +
+Switch isolation level to level.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Property Summary
 closed: True if the connection is closed.
 dsn: The current connection string.
 encoding: The current client encoding.
 isolation_level: The current isolation level.
 notices
 notifies
    DBAPI-2.0 errors
 Error: Base class for error exceptions.
 Warning: A database warning.
 InterfaceError: Error related to the database interface.
 DatabaseError: Error related to the database engine.
 InternalError: The database encountered an internal error.
 OperationalError: Error related to database operation (disconnect, memory allocation etc).
 ProgrammingError: Error related to database programming (SQL error, table not found etc).
 IntegrityError: Error related to database integrity.
 DataError: Error related to problems with the processed data.
 NotSupportedError: A not supported datbase API was called.

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+ + +
+

close() +

+

Close the connection.

+
+
+
+ + +
+

commit() +

+

Commit all changes to database.

+
+
+
+ + +
+

cursor(cursor_factory=extensions.cursor) +

+

new cursor

+

Return a new cursor.

+

The cursor_factory argument can be used to +create non-standard cursors by passing a class different from the +default. Note that the new class should be a sub-class of +extensions.cursor.

+
+
Returns:
+
+extensions.cursor
+
+
+
+ + +
+

rollback() +

+

Roll back all changes done to database.

+
+
+
+ + +
+

set_client_encoding(encoding) +

+

Set client encoding to encoding.

+
+
+
+ + +
+

set_isolation_level(level) +

+

Switch isolation level to level.

+
+
+
+
+ + + + + + +
Property Details
+
+ + +

Error

+

Base class for error exceptions.

+
+ + +

Warning

+

A database warning.

+
+ + +

InterfaceError

+

Error related to the database interface.

+
+ + +

DatabaseError

+

Error related to the database engine.

+
+ + +

InternalError

+

The database encountered an internal error.

+
+ + +

OperationalError

+

Error related to database operation (disconnect, memory allocation etc).

+
+ + +

ProgrammingError

+

Error related to database programming (SQL error, table not found etc).

+
+ + +

IntegrityError

+

Error related to database integrity.

+
+ + +

DataError

+

Error related to problems with the processed data.

+
+ + +

NotSupportedError

+

A not supported datbase API was called.

+
+ + +

closed

+

True if the connection is closed.

+
+ + +

dsn

+

The current connection string.

+
+ + +

encoding

+

The current client encoding.

+
+ + +

isolation_level

+

The current isolation level.

+

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2._psycopg.cursor-class.html b/psycopg2/doc/api/private/psycopg2._psycopg.cursor-class.html new file mode 100644 index 0000000..d3947aa --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2._psycopg.cursor-class.html @@ -0,0 +1,599 @@ + + + + + psycopg2._psycopg.cursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg :: + Class cursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type cursor

+ +
+object --+
+         |
+        cursor
+

+ +
Known Subclasses:
+
+ cursor, + DictCursor
+ +
+ +

A database cursor.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __iter__(x) +
+Return iter(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 callproc(procname, + parameters, + async) +
+Execute stored procedure.
 close() +
+Close the cursor.
 copy_from(file, + table, + sep, + null) +
+Copy table from file.
 copy_to(file, + table, + sep, + null) +
+Copy table to file.
 execute(query, + vars, + async) +
+Execute query with bound vars.
 executemany(query, + vars_list, + async) +
+Execute many queries with bound vars.
list of tuplefetchall() +
+Return all the remaining rows of a query result set.
list of tuplefetchmany(size) +
+Return the next size rows of a query result set in the form of a list +of tuples (by default) or using the sequence factory previously set in +the row_factory attribute.
tuple or Nonefetchone() +
+Return the next row of a query result set in the form of a tuple (by +default) or using the sequence factory previously set in the +row_factory attribute.
intfileno() +
+Return file descriptor associated to database connection.
boolisready() +
+Return True if data is ready after an async query.
strmogrify(query, + vars) +
+Return query after vars binding.
 next(x) +
+Return the next value, or raise StopIteration...
 nextset() +
+Skip to next set of data.
 scroll(value, + mode) +
+Scroll to new position according to mode.
 setinputsizes(sizes) +
+Set memory areas before execute.
 setoutputsize(size, + column) +
+Set column buffer size.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + +
Property Summary
 arraysize: Number of records fetchmany() must fetch if not explicitely specified.
 binary_types
 connection: The connection where the cursor comes from.
 description: Cursor description as defined in DBAPI-2.0.
 lastrowid: The oid of the last row inserted by the cursor.
 name
 query: The last query text sent to the backend.
 row_factory
 rowcount: Number of rows read from the backend in the last command.
 rownumber: The current row position.
 statusmessage: The return message of the last command.
 string_types
 typecaster
 tzinfo_factory

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__iter__(x) +

+
+
Returns:
+
+
+iter(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+ + +
+

callproc(procname, + parameters=None, + async=0) +

+

Execute stored procedure.

+
+
+
+ + +
+

close() +

+

Close the cursor.

+
+
+
+ + +
+

copy_from(file, + table, + sep='\t', + null='\N') +

+

Copy table from file.

+
+
+
+ + +
+

copy_to(file, + table, + sep='\t', + null='\N') +

+

Copy table to file.

+
+
+
+ + +
+

execute(query, + vars=None, + async=0) +

+

Execute query with bound vars.

+
+
+
+ + +
+

executemany(query, + vars_list=(), + async=0) +

+

Execute many queries with bound vars.

+
+
+
+ + +
+

fetchall() +

+

Return all the remaining rows of a query result set.

+

Rows are returned in the form of a list of tuples (by default) or using +the sequence factory previously set in the row_factory attribute. +Return None when no more data is available.

+
+
Returns:
+
+list of tuple
+
+
+
+ + +
+

fetchmany(size=self.arraysize) +

+

Return the next size rows of a query result set in the form of a list +of tuples (by default) or using the sequence factory previously set in +the row_factory attribute. Return None when no more data is available.

+
+
Returns:
+
+list of tuple
+
+
+
+ + +
+

fetchone() +

+

Return the next row of a query result set in the form of a tuple (by +default) or using the sequence factory previously set in the +row_factory attribute. Return None when no more data is available.

+
+
Returns:
+
+tuple or None
+
+
+
+ + +
+

fileno() +

+

Return file descriptor associated to database connection.

+
+
Returns:
+
+int
+
+
+
+ + +
+

isready() +

+

Return True if data is ready after an async query.

+
+
Returns:
+
+bool
+
+
+
+ + +
+

mogrify(query, + vars=None) +

+

Return query after vars binding.

+
+
Returns:
+
+str
+
+
+
+ + +
+

next(x) +

+
+
Returns:
+
+
+the next value, or raise StopIteration
+
+
+
+
+
+ + +
+

nextset() +

+

Skip to next set of data.

+

This method is not supported (PostgreSQL does not have multiple data +sets) and will raise a NotSupportedError exception.

+
+
+
+ + +
+

scroll(value, + mode='relative') +

+

Scroll to new position according to mode.

+
+
+
+ + +
+

setinputsizes(sizes) +

+

Set memory areas before execute.

+

This method currently does nothing but it is safe to call it.

+
+
+
+ + +
+

setoutputsize(size, + column=None) +

+

Set column buffer size.

+

This method currently does nothing but it is safe to call it.

+
+
+
+
+ + + + + + +
Property Details
+
+ + +

arraysize

+

Number of records fetchmany() must fetch if not explicitely specified.

+
+ + +

connection

+

The connection where the cursor comes from.

+
+ + +

description

+

Cursor description as defined in DBAPI-2.0.

+
+ + +

lastrowid

+

The oid of the last row inserted by the cursor.

+
+ + +

query

+

The last query text sent to the backend.

+
+ + +

rowcount

+

Number of rows read from the backend in the last command.

+
+ + +

rownumber

+

The current row position.

+
+ + +

statusmessage

+

The return message of the last command.

+

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.extensions-module.html b/psycopg2/doc/api/private/psycopg2.extensions-module.html new file mode 100644 index 0000000..a78fd66 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.extensions-module.html @@ -0,0 +1,418 @@ + + + + + psycopg2.extensions + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extensions +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extensions

+ +

psycopg extensions to the DBAPI-2.0

+

This module holds all the extensions to the DBAPI-2.0 provided by psycopg.

+
    +
  • connection -- the new-type inheritable connection class
  • +
  • cursor -- the new-type inheritable cursor class
  • +
  • adapt() -- exposes the PEP-246 compatible adapting mechanism used +by psycopg to adapt Python types to PostgreSQL ones
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
objectadapt(obj, + protocol, + alternate) +
+adapt obj to given protocol
new AsIs wrapper objectAsIs(obj) +
new boolean valueBoolean(obj) +
new wrapperDateFromPy(datetime.date) +
new wrapperIntervalFromPy(datetime.timedelta) +
new type objectnew_type(oids, + name, + adapter) +
+Create a new binding object.
new quoted stringQuotedString(str, + enc) +
 register_adapter(typ, + callable) +
+Register 'callable' as an ISQLQuote adapter for type 'typ'.
Noneregister_type(obj) +
+register obj with psycopg type system
new wrapperTimeFromPy(datetime.time) +
new wrapperTimestampFromPy(datetime.datetime) +

+ + + + + + + + + + + + + + + + +
Variable Summary
intISOLATION_LEVEL_AUTOCOMMIT = 0                                                                     
intISOLATION_LEVEL_READ_COMMITTED = 1                                                                     
intISOLATION_LEVEL_READ_UNCOMMITTED = 1                                                                     
intISOLATION_LEVEL_REPEATABLE_READ = 2                                                                     
intISOLATION_LEVEL_SERIALIZABLE = 2                                                                     

+ + + + + + +
Function Details
+ + +
+

adapt(obj, + protocol, + alternate) +

+

adapt obj to given protocol

+
+
Returns:
+
+object
+
+
+
+ + +
+

AsIs(obj) +

+
+
Returns:
+
+new AsIs wrapper object
+
+
+
+ + +
+

Boolean(obj) +

+
+
Returns:
+
+new boolean value
+
+
+
+ + +
+

DateFromPy(datetime.date) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

IntervalFromPy(datetime.timedelta) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

new_type(oids, + name, + adapter) +

+

Create a new binding object. The object can be used with the +register_type() function to bind PostgreSQL objects to python objects.

+
+
Parameters:
+
oids - + Tuple of oid of the PostgreSQL types to convert. +
+
name - + Name for the new type +
+
adapter - + Callable to perform type conversion. +It must have the signature fun(value, cur) where value is +the string representation returned by PostgreSQL (None if NULL) +and cur is the cursor from which data are read. +
+
+
Returns:
+
+new type object
+
+
+
+ + +
+

QuotedString(str, + enc) +

+
+
Returns:
+
+new quoted string
+
+
+
+ + +
+

register_adapter(typ, + callable) +

+

Register 'callable' as an ISQLQuote adapter for type 'typ'.

+
+
+
+ + +
+

register_type(obj) +

+

register obj with psycopg type system

+
+
Parameters:
+
obj - + A type adapter created by new_type() +
+
+
Returns:
+
+None
+
+
+
+ + +
+

TimeFromPy(datetime.time) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

TimestampFromPy(datetime.datetime) +

+
+
Returns:
+
+new wrapper
+
+
+
+
+ + + + + + +
Variable Details
+
+ +

ISOLATION_LEVEL_AUTOCOMMIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_COMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_UNCOMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_REPEATABLE_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_SERIALIZABLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.extras-module.html b/psycopg2/doc/api/private/psycopg2.extras-module.html new file mode 100644 index 0000000..463fc22 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.extras-module.html @@ -0,0 +1,91 @@ + + + + + psycopg2.extras + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extras

+ +

Miscellaneous goodies for psycopg2

+

This module is a generic place used to hold little helper functions +and classes untill a better place in the distribution is found.

+
+ + + + + + + + + + + + + +
Classes
+ DictConnectionA connection that uses DictCursor automatically.
+ DictCursorA cursor that keeps a list of column name -> index mappings.
+ DictRowA row object that allow by-colun-name access to data.
+ SQL_INAdapt any iterable to an SQL quotable object.

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.extras.DictConnection-class.html b/psycopg2/doc/api/private/psycopg2.extras.DictConnection-class.html new file mode 100644 index 0000000..73989b5 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.extras.DictConnection-class.html @@ -0,0 +1,202 @@ + + + + + psycopg2.extras.DictConnection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictConnection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictConnection

+ +
+object --+    
+         |    
+connection --+
+             |
+            DictConnection
+

+ +
+ +

A connection that uses DictCursor automatically.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 cursor(self) +
    Inherited from connection
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the connection.
 commit() +
+Commit all changes to database.
 rollback() +
+Roll back all changes done to database.
 set_client_encoding(encoding) +
+Set client encoding to encoding.
 set_isolation_level(level) +
+Switch isolation level to level.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from connection
 closed: True if the connection is closed.
 DatabaseError: Error related to the database engine.
 DataError: Error related to problems with the processed data.
 dsn: The current connection string.
 encoding: The current client encoding.
 Error: Base class for error exceptions.
 IntegrityError: Error related to database integrity.
 InterfaceError: Error related to the database interface.
 InternalError: The database encountered an internal error.
 isolation_level: The current isolation level.
 notices
 notifies
 NotSupportedError: A not supported datbase API was called.
 OperationalError: Error related to database operation (disconnect, memory allocation etc).
 ProgrammingError: Error related to database programming (SQL error, table not found etc).
 Warning: A database warning.

+ + + + + + +
Method Details
+ + +
+

cursor(self) +

+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.extras.DictCursor-class.html b/psycopg2/doc/api/private/psycopg2.extras.DictCursor-class.html new file mode 100644 index 0000000..80a05c9 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.extras.DictCursor-class.html @@ -0,0 +1,359 @@ + + + + + psycopg2.extras.DictCursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictCursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictCursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            DictCursor
+

+ +
+ +

A cursor that keeps a list of column name -> index mappings.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 callproc(self, + procname, + vars) +
 execute(self, + query, + vars, + async) +
 fetchall(self) +
 fetchmany(self, + size) +
 fetchone(self) +
 _build_index(self) +
    Inherited from cursor
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __iter__(x) +
+Return iter(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the cursor.
 copy_from(file, + table, + sep, + null) +
+Copy table from file.
 copy_to(file, + table, + sep, + null) +
+Copy table to file.
 executemany(query, + vars_list, + async) +
+Execute many queries with bound vars.
intfileno() +
+Return file descriptor associated to database connection.
boolisready() +
+Return True if data is ready after an async query.
strmogrify(query, + vars) +
+Return query after vars binding.
 next(x) +
+Return the next value, or raise StopIteration...
 nextset() +
+Skip to next set of data.
 scroll(value, + mode) +
+Scroll to new position according to mode.
 setinputsizes(sizes) +
+Set memory areas before execute.
 setoutputsize(size, + column) +
+Set column buffer size.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from cursor
 arraysize: Number of records fetchmany() must fetch if not explicitely specified.
 binary_types
 connection: The connection where the cursor comes from.
 description: Cursor description as defined in DBAPI-2.0.
 lastrowid: The oid of the last row inserted by the cursor.
 name
 query: The last query text sent to the backend.
 row_factory
 rowcount: Number of rows read from the backend in the last command.
 rownumber: The current row position.
 statusmessage: The return message of the last command.
 string_types
 typecaster
 tzinfo_factory

+ + + + + + + + +
Class Variable Summary
int_DictCursor__query_executed = 0                                                                     

+ + + + + + +
Method Details
+ + +
+

callproc(self, + procname, + vars=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.callproc
+
+
+
+ + +
+

execute(self, + query, + vars=None, + async=0) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.execute
+
+
+
+ + +
+

fetchall(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchall
+
+
+
+ + +
+

fetchmany(self, + size=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchmany
+
+
+
+ + +
+

fetchone(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchone
+
+
+
+ + +
+

_build_index(self) +

+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

_DictCursor__query_executed

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.extras.DictRow-class.html b/psycopg2/doc/api/private/psycopg2.extras.DictRow-class.html new file mode 100644 index 0000000..db74990 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.extras.DictRow-class.html @@ -0,0 +1,376 @@ + + + + + psycopg2.extras.DictRow + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictRow +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictRow

+ +
+object --+    
+         |    
+      list --+
+             |
+            DictRow
+

+ +
+ +

A row object that allow by-colun-name access to data.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + cursor) +
 __getitem__(self, + x) +
 get(self, + x, + default) +
 has_key(self, + x) +
 items(self) +
 keys(self) +
 values(self) +
    Inherited from list
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + cursor) +
(Constructor) +

+
+
Overrides:
+
__builtin__.list.__init__
+
+
+
+ + +
+

__getitem__(self, + x) +
(Indexing operator) +

+
+
Overrides:
+
__builtin__.list.__getitem__
+
+
+
+ + +
+

get(self, + x, + default=None) +

+
+
+
+ + +
+

has_key(self, + x) +

+
+
+
+ + +
+

items(self) +

+
+
+
+ + +
+

keys(self) +

+
+
+
+ + +
+

values(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.extras.SQL_IN-class.html b/psycopg2/doc/api/private/psycopg2.extras.SQL_IN-class.html new file mode 100644 index 0000000..6b7009b --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.extras.SQL_IN-class.html @@ -0,0 +1,171 @@ + + + + + psycopg2.extras.SQL_IN + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class SQL_IN +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SQL_IN

+ +
+object --+
+         |
+        SQL_IN
+

+ +
+ +

Adapt any iterable to an SQL quotable object.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + seq) +
 __str__(self) +
 getquoted(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

__init__(self, + seq) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+
+
+
+ + +
+

getquoted(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.pool-module.html b/psycopg2/doc/api/private/psycopg2.pool-module.html new file mode 100644 index 0000000..64e53c1 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.pool-module.html @@ -0,0 +1,126 @@ + + + + + psycopg2.pool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.pool

+ +

Connection pooling for psycopg2

+

This module implements thread-safe (and not) connection pools.

+
+ + + + + + + + + + + + + +
Classes
+ AbstractConnectionPoolGeneric key-based pooling code.
+ PersistentConnectionPoolA pool that assigns persistent connections to different threads.
+ SimpleConnectionPoolA connection pool that can't be shared across different threads.
+ ThreadedConnectionPoolA connection pool that works with the threading module.

+ + + + + + + + +
Exceptions
+ PoolError 

+ + + + + + + + +
Function Summary
 dbg(*args) +

+ + + + + + +
Function Details
+ + +
+

dbg(*args) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html b/psycopg2/doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html new file mode 100644 index 0000000..be79964 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html @@ -0,0 +1,247 @@ + + + + + psycopg2.pool.AbstractConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class AbstractConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type AbstractConnectionPool

+ +
+object --+
+         |
+        AbstractConnectionPool
+

+ +
Known Subclasses:
+
+ PersistentConnectionPool, + SimpleConnectionPool, + ThreadedConnectionPool
+ +
+ +

Generic key-based pooling code.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the connection pool.

+

New 'minconn' connections are created immediately calling 'connfunc' +with given parameters. The connection pool will support a maximum of +about 'maxconn' connections.

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

_closeall(self) +

+

Close all connections.

+

Note that this can lead to some code fail badly when trying to use +an already closed connection. If you call .closeall() make sure +your code can deal with it.

+
+
+
+ + +
+

_connect(self, + key=None) +

+

Create a new connection and assign it to 'key' if not None.

+
+
+
+ + +
+

_getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

_getkey(self) +

+

Return a new unique key.

+
+
+
+ + +
+

_putconn(self, + conn, + key=None, + close=False) +

+

Put away a connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html b/psycopg2/doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html new file mode 100644 index 0000000..4656713 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html @@ -0,0 +1,237 @@ + + + + + psycopg2.pool.PersistentConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PersistentConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PersistentConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        PersistentConnectionPool
+

+ +
+ +

A pool that assigns persistent connections to different threads.

+

Note that this connection pool generates by itself the required keys +using the current thread id. This means that untill a thread put away +a connection it will always get the same connection object by successive +.getconn() calls. This also means that a thread can't use more than one +single connection from the pool.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self) +
+Generate thread id and return a connection.
 putconn(self, + conn, + close) +
+Put away an unused connection.
    Inherited from AbstractConnectionPool
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self) +

+

Generate thread id and return a connection.

+
+
+
+ + +
+

putconn(self, + conn=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.pool.PoolError-class.html b/psycopg2/doc/api/private/psycopg2.pool.PoolError-class.html new file mode 100644 index 0000000..83a85cf --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.pool.PoolError-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.pool.PoolError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PoolError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class PoolError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   PoolError
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html b/psycopg2/doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html new file mode 100644 index 0000000..06c9bb6 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html @@ -0,0 +1,222 @@ + + + + + psycopg2.pool.SimpleConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class SimpleConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SimpleConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        SimpleConnectionPool
+

+ +
+ +

A connection pool that can't be shared across different threads.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 closeall(self) +
+Close all connections.
 getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from AbstractConnectionPool
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

closeall(self) +

+

Close all connections.

+

Note that this can lead to some code fail badly when trying to use +an already closed connection. If you call .closeall() make sure +your code can deal with it.

+
+
+
+ + +
+

getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

putconn(self, + conn, + key=None, + close=False) +

+

Put away a connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html b/psycopg2/doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html new file mode 100644 index 0000000..1ad34cb --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html @@ -0,0 +1,236 @@ + + + + + psycopg2.pool.ThreadedConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class ThreadedConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ThreadedConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        ThreadedConnectionPool
+

+ +
+ +

A connection pool that works with the threading module.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 putconn(self, + conn, + key, + close) +
+Put away an unused connection.
    Inherited from AbstractConnectionPool
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

putconn(self, + conn=None, + key=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.psycopg1-module.html b/psycopg2/doc/api/private/psycopg2.psycopg1-module.html new file mode 100644 index 0000000..f535cb9 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.psycopg1-module.html @@ -0,0 +1,121 @@ + + + + + psycopg2.psycopg1 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.psycopg1

+ +

psycopg 1.1.x compatibility module

+

This module uses the new style connection and cursor types to build a psycopg +1.1.1.x compatibility layer. It should be considered a temporary hack to run +old code while porting to psycopg 2. Import it as follows:

+
+from psycopg2 import psycopg1 as psycopg
+
+
+ + + + + + + + + +
Classes
+ connectionpsycopg 1.1.x connection.
+ cursorpsycopg 1.1.x cursor.

+ + + + + + + + +
Function Summary
new psycopg 1.1.x compatible connection objectconnect(dsn, + ...) +

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+
+
Returns:
+
+new psycopg 1.1.x compatible connection object
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.psycopg1.connection-class.html b/psycopg2/doc/api/private/psycopg2.psycopg1.connection-class.html new file mode 100644 index 0000000..6d52ff8 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.psycopg1.connection-class.html @@ -0,0 +1,221 @@ + + + + + psycopg2.psycopg1.connection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class connection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type connection

+ +
+object --+    
+         |    
+connection --+
+             |
+            connection
+

+ +
+ +

psycopg 1.1.x connection.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
switch autocommit on (1) or off (0)autocommit(on_off) +
new psycopg 1.1.x compatible cursor objectcursor() +
    Inherited from connection
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the connection.
 commit() +
+Commit all changes to database.
 rollback() +
+Roll back all changes done to database.
 set_client_encoding(encoding) +
+Set client encoding to encoding.
 set_isolation_level(level) +
+Switch isolation level to level.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from connection
 closed: True if the connection is closed.
 DatabaseError: Error related to the database engine.
 DataError: Error related to problems with the processed data.
 dsn: The current connection string.
 encoding: The current client encoding.
 Error: Base class for error exceptions.
 IntegrityError: Error related to database integrity.
 InterfaceError: Error related to the database interface.
 InternalError: The database encountered an internal error.
 isolation_level: The current isolation level.
 notices
 notifies
 NotSupportedError: A not supported datbase API was called.
 OperationalError: Error related to database operation (disconnect, memory allocation etc).
 ProgrammingError: Error related to database programming (SQL error, table not found etc).
 Warning: A database warning.

+ + + + + + +
Method Details
+ + +
+

autocommit(on_off=1) +

+
+
Returns:
+
+switch autocommit on (1) or off (0)
+
+
+
+ + +
+

cursor() +

+
+
Returns:
+
+new psycopg 1.1.x compatible cursor object
+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.psycopg1.cursor-class.html b/psycopg2/doc/api/private/psycopg2.psycopg1.cursor-class.html new file mode 100644 index 0000000..17d22e0 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.psycopg1.cursor-class.html @@ -0,0 +1,308 @@ + + + + + psycopg2.psycopg1.cursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class cursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type cursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            cursor
+

+ +
+ +

psycopg 1.1.x cursor.

+

Note that this cursor implements the exact procedure used by psycopg 1 to +build dictionaries out of result rows. The DictCursor in the +psycopg.extras modules implements a much better and faster algorithm.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dictfetchall(self) +
 dictfetchmany(self, + size) +
 dictfetchone(self) +
 __build_dict(self, + row) +
    Inherited from cursor
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __iter__(x) +
+Return iter(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 callproc(procname, + parameters, + async) +
+Execute stored procedure.
 close() +
+Close the cursor.
 copy_from(file, + table, + sep, + null) +
+Copy table from file.
 copy_to(file, + table, + sep, + null) +
+Copy table to file.
 execute(query, + vars, + async) +
+Execute query with bound vars.
 executemany(query, + vars_list, + async) +
+Execute many queries with bound vars.
list of tuplefetchall() +
+Return all the remaining rows of a query result set.
list of tuplefetchmany(size) +
+Return the next size rows of a query result set in the form of a list +of tuples (by default) or using the sequence factory previously set in +the row_factory attribute.
tuple or Nonefetchone() +
+Return the next row of a query result set in the form of a tuple (by +default) or using the sequence factory previously set in the +row_factory attribute.
intfileno() +
+Return file descriptor associated to database connection.
boolisready() +
+Return True if data is ready after an async query.
strmogrify(query, + vars) +
+Return query after vars binding.
 next(x) +
+Return the next value, or raise StopIteration...
 nextset() +
+Skip to next set of data.
 scroll(value, + mode) +
+Scroll to new position according to mode.
 setinputsizes(sizes) +
+Set memory areas before execute.
 setoutputsize(size, + column) +
+Set column buffer size.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from cursor
 arraysize: Number of records fetchmany() must fetch if not explicitely specified.
 binary_types
 connection: The connection where the cursor comes from.
 description: Cursor description as defined in DBAPI-2.0.
 lastrowid: The oid of the last row inserted by the cursor.
 name
 query: The last query text sent to the backend.
 row_factory
 rowcount: Number of rows read from the backend in the last command.
 rownumber: The current row position.
 statusmessage: The return message of the last command.
 string_types
 typecaster
 tzinfo_factory

+ + + + + + +
Method Details
+ + +
+

dictfetchall(self) +

+
+
+
+ + +
+

dictfetchmany(self, + size) +

+
+
+
+ + +
+

dictfetchone(self) +

+
+
+
+ + +
+

__build_dict(self, + row) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.tz-module.html b/psycopg2/doc/api/private/psycopg2.tz-module.html new file mode 100644 index 0000000..9b8244a --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.tz-module.html @@ -0,0 +1,193 @@ + + + + + psycopg2.tz + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.tz

+ +

tzinfo implementations for psycopg2

+

This module holds two different tzinfo implementations that can be used as +the 'tzinfo' argument to datetime constructors, directly passed to psycopg +functions or used to set the .tzinfo_factory attribute in cursors.

+
+ + + + + + + + + +
Classes
+ FixedOffsetTimezoneFixed offset in minutes east from UTC.
+ LocalTimezonePlatform idea of local timezone.

+ + + + + + + + + + + + + + +
Variable Summary
timedeltaDSTDIFF = datetime.timedelta(0, 3600) +
LocalTimezoneLOCAL = <psycopg2.tz.LocalTimezone object at 0x00847090> +
timedeltaSTDOFFSET = datetime.timedelta(0, 3600) +
timedeltaZERO = datetime.timedelta(0) +

+ + + + + + +
Variable Details
+
+ +

DSTDIFF

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

LOCAL

+
+
+
+
+
Type:
+
+ LocalTimezone + +
+
Value:
+
+
+<psycopg2.tz.LocalTimezone object at 0x00847090>                       
+
+
+
+
+
+ +

STDOFFSET

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

ZERO

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0)                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html b/psycopg2/doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html new file mode 100644 index 0000000..4e6d658 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html @@ -0,0 +1,273 @@ + + + + + psycopg2.tz.FixedOffsetTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class FixedOffsetTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type FixedOffsetTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            FixedOffsetTimezone
+

+ +
+ +

Fixed offset in minutes east from UTC.

+

This is exactly the implementation found in Python 2.3.x documentation, +with a small change to the __init__ method to allow for pickling and a +default name in the form 'sHH:MM' ('s' is the sign.)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + offset, + name) +
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + +
Class Variable Summary
NoneType_name = None                                                                  
timedelta_offset = datetime.timedelta(0) +

+ + + + + + +
Method Details
+ + +
+

__init__(self, + offset=None, + name=None) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

_name

+
+
+
+
+
Type:
+
+ NoneType + +
+
Value:
+
+
+None                                                                  
+
+
+
+
+
+ +

_offset

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0)                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/psycopg2.tz.LocalTimezone-class.html b/psycopg2/doc/api/private/psycopg2.tz.LocalTimezone-class.html new file mode 100644 index 0000000..0954549 --- /dev/null +++ b/psycopg2/doc/api/private/psycopg2.tz.LocalTimezone-class.html @@ -0,0 +1,209 @@ + + + + + psycopg2.tz.LocalTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class LocalTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type LocalTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            LocalTimezone
+

+ +
+ +

Platform idea of local timezone.

+

This is the exact implementation from the Pyhton 2.3 documentation.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
 _isdst(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+ + +
+

_isdst(self, + dt) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/private/toc-everything.html b/psycopg2/doc/api/private/toc-everything.html new file mode 100644 index 0000000..2b60e36 --- /dev/null +++ b/psycopg2/doc/api/private/toc-everything.html @@ -0,0 +1,134 @@ + + + + + Everything + + + + +

Everything

+
+ + +

All Classes

+

psycopg2._psycopg.connection

+

psycopg2._psycopg.cursor

+

psycopg2._psycopg.ISQLQuote

+

psycopg2.extras.DictConnection

+

psycopg2.extras.DictCursor

+

psycopg2.extras.DictRow

+

psycopg2.extras.SQL_IN

+

psycopg2.pool.AbstractConnectionPool

+

psycopg2.pool.PersistentConnectionPool

+

psycopg2.pool.SimpleConnectionPool

+

psycopg2.pool.ThreadedConnectionPool

+

psycopg2.psycopg1.connection

+

psycopg2.psycopg1.cursor

+

psycopg2.tz.FixedOffsetTimezone

+

psycopg2.tz.LocalTimezone

+ + +

All Exceptions

+

psycopg2.DatabaseError

+

psycopg2.DataError

+

psycopg2.Error

+

psycopg2.IntegrityError

+

psycopg2.InterfaceError

+

psycopg2.InternalError

+

psycopg2.NotSupportedError

+

psycopg2.OperationalError

+

psycopg2.pool.PoolError

+

psycopg2.ProgrammingError

+

psycopg2.Warning

+ + +

All Functions

+

adapt

+

AsIs

+

Binary

+

Boolean

+

connect

+

connect

+

Date

+

DateFromPy

+

DateFromTicks

+

dbg

+

IntervalFromPy

+

List

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

Time

+

TimeFromPy

+

TimeFromTicks

+

Timestamp

+

TimestampFromPy

+

TimestampFromTicks

+ + +

All Variables

+

__version__

+

_C_API

+

adapters

+

apilevel

+

BINARY

+

binary_types

+

BINARYARRAY

+

BOOLEAN

+

BOOLEANARRAY

+

DATE

+

DATEARRAY

+

DATETIME

+

DATETIMEARRAY

+

DECIMAL

+

DECIMALARRAY

+

DSTDIFF

+

encodings

+

FLOAT

+

FLOATARRAY

+

INTEGER

+

INTEGERARRAY

+

INTERVAL

+

INTERVALARRAY

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+

LOCAL

+

LONGINTEGER

+

LONGINTEGERARRAY

+

NUMBER

+

paramstyle

+

PYDATE

+

PYDATETIME

+

PYINTERVAL

+

PYTIME

+

ROWID

+

ROWIDARRAY

+

STDOFFSET

+

STRING

+

string_types

+

STRINGARRAY

+

threadsafety

+

TIME

+

TIMEARRAY

+

UNICODE

+

UNICODEARRAY

+

ZERO

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc-psycopg2-module.html b/psycopg2/doc/api/private/toc-psycopg2-module.html new file mode 100644 index 0000000..e07c73c --- /dev/null +++ b/psycopg2/doc/api/private/toc-psycopg2-module.html @@ -0,0 +1,58 @@ + + + + + psycopg2 + + + + +

psycopg2

+
+ + +

Modules

+

_psycopg

+

extensions

+

extras

+

pool

+

psycopg1

+

tz

+ + +

Exceptions

+

DatabaseError

+

DataError

+

Error

+

IntegrityError

+

InterfaceError

+

InternalError

+

NotSupportedError

+

OperationalError

+

ProgrammingError

+

Warning

+ + +

Functions

+

Binary

+

connect

+

Date

+

DateFromTicks

+

Time

+

TimeFromTicks

+

Timestamp

+

TimestampFromTicks

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc-psycopg2._psycopg-module.html b/psycopg2/doc/api/private/toc-psycopg2._psycopg-module.html new file mode 100644 index 0000000..49975f5 --- /dev/null +++ b/psycopg2/doc/api/private/toc-psycopg2._psycopg-module.html @@ -0,0 +1,78 @@ + + + + + psycopg2._psycopg + + + + +

_psycopg

+
+ + +

Classes

+

connection

+

cursor

+

ISQLQuote

+ + +

Functions

+

List

+ + +

Variables

+

__version__

+

_C_API

+

adapters

+

apilevel

+

BINARY

+

binary_types

+

BINARYARRAY

+

BOOLEAN

+

BOOLEANARRAY

+

DATE

+

DATEARRAY

+

DATETIME

+

DATETIMEARRAY

+

DECIMAL

+

DECIMALARRAY

+

encodings

+

FLOAT

+

FLOATARRAY

+

INTEGER

+

INTEGERARRAY

+

INTERVAL

+

INTERVALARRAY

+

LONGINTEGER

+

LONGINTEGERARRAY

+

NUMBER

+

paramstyle

+

PYDATE

+

PYDATETIME

+

PYINTERVAL

+

PYTIME

+

ROWID

+

ROWIDARRAY

+

STRING

+

string_types

+

STRINGARRAY

+

threadsafety

+

TIME

+

TIMEARRAY

+

UNICODE

+

UNICODEARRAY

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc-psycopg2.extensions-module.html b/psycopg2/doc/api/private/toc-psycopg2.extensions-module.html new file mode 100644 index 0000000..2e7c983 --- /dev/null +++ b/psycopg2/doc/api/private/toc-psycopg2.extensions-module.html @@ -0,0 +1,47 @@ + + + + + psycopg2.extensions + + + + +

extensions

+
+ + +

Functions

+

adapt

+

AsIs

+

Boolean

+

DateFromPy

+

IntervalFromPy

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

TimeFromPy

+

TimestampFromPy

+ + +

Variables

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc-psycopg2.extras-module.html b/psycopg2/doc/api/private/toc-psycopg2.extras-module.html new file mode 100644 index 0000000..505d1d8 --- /dev/null +++ b/psycopg2/doc/api/private/toc-psycopg2.extras-module.html @@ -0,0 +1,32 @@ + + + + + psycopg2.extras + + + + +

extras

+
+ + +

Classes

+

DictConnection

+

DictCursor

+

DictRow

+

SQL_IN

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc-psycopg2.pool-module.html b/psycopg2/doc/api/private/toc-psycopg2.pool-module.html new file mode 100644 index 0000000..2b2a8cc --- /dev/null +++ b/psycopg2/doc/api/private/toc-psycopg2.pool-module.html @@ -0,0 +1,40 @@ + + + + + psycopg2.pool + + + + +

pool

+
+ + +

Classes

+

AbstractConnectionPool

+

PersistentConnectionPool

+

SimpleConnectionPool

+

ThreadedConnectionPool

+ + +

Exceptions

+

PoolError

+ + +

Functions

+

dbg

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc-psycopg2.psycopg1-module.html b/psycopg2/doc/api/private/toc-psycopg2.psycopg1-module.html new file mode 100644 index 0000000..20971b2 --- /dev/null +++ b/psycopg2/doc/api/private/toc-psycopg2.psycopg1-module.html @@ -0,0 +1,34 @@ + + + + + psycopg2.psycopg1 + + + + +

psycopg1

+
+ + +

Classes

+

connection

+

cursor

+ + +

Functions

+

connect

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc-psycopg2.tz-module.html b/psycopg2/doc/api/private/toc-psycopg2.tz-module.html new file mode 100644 index 0000000..fce1191 --- /dev/null +++ b/psycopg2/doc/api/private/toc-psycopg2.tz-module.html @@ -0,0 +1,37 @@ + + + + + psycopg2.tz + + + + +

tz

+
+ + +

Classes

+

FixedOffsetTimezone

+

LocalTimezone

+ + +

Variables

+

DSTDIFF

+

LOCAL

+

STDOFFSET

+

ZERO

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/toc.html b/psycopg2/doc/api/private/toc.html new file mode 100644 index 0000000..1e31df5 --- /dev/null +++ b/psycopg2/doc/api/private/toc.html @@ -0,0 +1,39 @@ + + + + + Table of Contents + + + + +

Table of Contents

+
+

Everything

+ + +

Packages

+

psycopg2

+ + +

Modules

+

psycopg2._psycopg

+

psycopg2.extensions

+

psycopg2.extras

+

psycopg2.pool

+

psycopg2.psycopg1

+

psycopg2.tz

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/private/trees.html b/psycopg2/doc/api/private/trees.html new file mode 100644 index 0000000..5907cfa --- /dev/null +++ b/psycopg2/doc/api/private/trees.html @@ -0,0 +1,196 @@ + + + + + Module and Class Hierarchies + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ + +

Module Hierarchy

+
    +
  • psycopg2: A Python driver for PostgreSQL
      +
    • _psycopg: psycopg PostgreSQL driver
    • +
    • extensions: psycopg extensions to the DBAPI-2.0
    • +
    • extras: Miscellaneous goodies for psycopg2
    • +
    • pool: Connection pooling for psycopg2
    • +
    • psycopg1: psycopg 1.1.x compatibility module
    • +
    • tz: tzinfo implementations for psycopg2
    • +
    +
  • +
+ + +

Class Hierarchy

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/__builtin__.list-class.html b/psycopg2/doc/api/public/__builtin__.list-class.html new file mode 100644 index 0000000..4ede43e --- /dev/null +++ b/psycopg2/doc/api/public/__builtin__.list-class.html @@ -0,0 +1,817 @@ + + + + + __builtin__.list + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class list +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type list

+ +
+object --+
+         |
+        list
+

+ +
Known Subclasses:
+
+ DictRow
+ +
+ +

list() -> new list +list(sequence) -> new list initialized from sequence's items

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getitem__(x, + y) +
+Return x[y]...
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__add__(x, + y) +
(Addition operator) +

+
+
Returns:
+
+
+x+y
+
+
+
+
+
+ + +
+

__contains__(x, + y) +
(In operator) +

+
+
Returns:
+
+
+y in x
+
+
+
+
+
+ + +
+

__delitem__(x, + y) +
(Index deletion operator) +

+
+
Returns:
+
+
+del x[y]
+
+
+
+
+
+ + +
+

__delslice__(x, + i, + j) +
(Slice deletion operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+del x[i:j]
+
+
+
+
+
+ + +
+

__eq__(x, + y) +
(Equality operator) +

+
+
Returns:
+
+
+x==y
+
+
+
+
+
+ + +
+

__ge__(x, + y) +
(Greater-than-or-equals operator) +

+
+
Returns:
+
+
+x>=y
+
+
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__getitem__(x, + y) +
(Indexing operator) +

+
+
Returns:
+
+
+x[y]
+
+
+
+
+
+ + +
+

__getslice__(x, + i, + j) +
(Slicling operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]
+
+
+
+
+
+ + +
+

__gt__(x, + y) +
(Greater-than operator) +

+
+
Returns:
+
+
+x>y
+
+
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__iadd__(x, + y) +

+
+
Returns:
+
+
+x+=y
+
+
+
+
+
+ + +
+

__imul__(x, + y) +

+
+
Returns:
+
+
+x*=y
+
+
+
+
+
+ + +
+

__iter__(x) +

+
+
Returns:
+
+
+iter(x)
+
+
+
+
+
+ + +
+

__le__(x, + y) +
(Less-than-or-equals operator) +

+
+
Returns:
+
+
+x<=y
+
+
+
+
+
+ + +
+

__len__(x) +
(Length operator) +

+
+
Returns:
+
+
+len(x)
+
+
+
+
+
+ + +
+

__lt__(x, + y) +
(Less-than operator) +

+
+
Returns:
+
+
+x<y
+
+
+
+
+
+ + +
+

__mul__(x, + n) +

+
+
Returns:
+
+
+x*n
+
+
+
+
+
+ + +
+

__ne__(x, + y) +
(Inequality operator) +

+
+
Returns:
+
+
+x!=y
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__rmul__(x, + n) +

+
+
Returns:
+
+
+n*x
+
+
+
+
+
+ + +
+

__setitem__(x, + i, + y) +
(Index assignment operator) +

+
+
Returns:
+
+
+x[i]=y
+
+
+
+
+
+ + +
+

__setslice__(x, + i, + j, + y) +
(Slice assignment operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]=y
+
+
+
+
+
+ + +
+

append(L, + object) +

+

append object to end

+
+
+
+ + +
+

count(L, + value) +

+

return number of occurrences of value

+
+
Returns:
+
+
+integer
+
+
+
+
+
+ + +
+

extend(L, + iterable) +

+

extend list by appending elements from the iterable

+
+
+
+ + +
+

index(...) +

+

L.index(value, [start, [stop]]) -> integer -- return first index of value

+
+
+
+ + +
+

insert(L, + index, + object) +

+

insert object before index

+
+
+
+ + +
+

pop(L, + index=...) +

+

remove and return item at index (default last)

+
+
Returns:
+
+
+item
+
+
+
+
+
+ + +
+

remove(L, + value) +

+

remove first occurrence of value

+
+
+
+ + +
+

reverse(L) +

+

reverse IN PLACE

+
+
+
+ + +
+

sort(L, + cmpfunc=None) +

+

stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/__builtin__.object-class.html b/psycopg2/doc/api/public/__builtin__.object-class.html new file mode 100644 index 0000000..e9638da --- /dev/null +++ b/psycopg2/doc/api/public/__builtin__.object-class.html @@ -0,0 +1,267 @@ + + + + + __builtin__.object + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class object +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type object

+ +
Known Subclasses:
+
+ AbstractConnectionPool, + list, + SQL_IN, + type, + tzinfo
+ +
+ +

The most base type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + +
Class Variable Summary
type__class__ = __builtin__.type

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
+
+ + +
+

__reduce__(...) +

+

helper for pickle

+
+
+
+ + +
+

__reduce_ex__(...) +

+

helper for pickle

+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/__builtin__.type-class.html b/psycopg2/doc/api/public/__builtin__.type-class.html new file mode 100644 index 0000000..7af340f --- /dev/null +++ b/psycopg2/doc/api/public/__builtin__.type-class.html @@ -0,0 +1,384 @@ + + + + + __builtin__.type + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class type +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type type

+ +
+object --+
+         |
+        type
+

+ +
+ +

type(object) -> the object's type +type(name, bases, dict) -> a new type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __call__(x, + ...) +
+Return x(...)...
 __cmp__(x, + y) +
+Return cmp(x,y)...
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
list of immediate subclasses__subclasses__() +
listmro() +
+return a type's method resolution order
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + + + + +
Property Summary
 __base__
 __basicsize__
 __dictoffset__
 __flags__
 __itemsize__
 __mro__
 __weakrefoffset__

+ + + + + + + + + + +
Class Variable Summary
tuple__bases__ = (<type 'object'>,) +
str__name__ = 'type' +

+ + + + + + +
Method Details
+ + +
+

__call__(x, + ...) +
(Call operator) +

+
+
Returns:
+
+
+x(...)
+
+
+
+
+
+ + +
+

__cmp__(x, + y) +
(Comparison operator) +

+
+
Returns:
+
+
+cmp(x,y)
+
+
+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
Overrides:
+
__builtin__.object.__delattr__
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
Overrides:
+
__builtin__.object.__setattr__
+
+
+
+ + +
+

__subclasses__() +

+
+
Returns:
+
+list of immediate subclasses
+
+
+
+ + +
+

mro() +

+

return a type's method resolution order

+
+
Returns:
+
+list
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

__bases__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'object'>,)                                                     
+
+
+
+
+
+ +

__name__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'type'                                                                 
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/datetime.tzinfo-class.html b/psycopg2/doc/api/public/datetime.tzinfo-class.html new file mode 100644 index 0000000..080afa2 --- /dev/null +++ b/psycopg2/doc/api/public/datetime.tzinfo-class.html @@ -0,0 +1,239 @@ + + + + + datetime.tzinfo + + + + + + + + + + + + + + + + + + + +
+ + Module datetime :: + Class tzinfo +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type tzinfo

+ +
+object --+
+         |
+        tzinfo
+

+ +
Known Subclasses:
+
+ FixedOffsetTimezone, + LocalTimezone
+ +
+ +

Abstract base class for time zone info objects.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 dst(...) +
+datetime -> DST offset in minutes east of UTC.
 fromutc(...) +
+datetime in UTC -> datetime in local time.
 tzname(...) +
+datetime -> string name of time zone.
 utcoffset(...) +
+datetime -> minutes east of UTC (negative for west of UTC).
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__reduce__(...) +

+

-> (cls, state)

+
+
Overrides:
+
__builtin__.object.__reduce__
+
+
+
+ + +
+

dst(...) +

+

datetime -> DST offset in minutes east of UTC.

+
+
+
+ + +
+

fromutc(...) +

+

datetime in UTC -> datetime in local time.

+
+
+
+ + +
+

tzname(...) +

+

datetime -> string name of time zone.

+
+
+
+ + +
+

utcoffset(...) +

+

datetime -> minutes east of UTC (negative for west of UTC).

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/epydoc.css b/psycopg2/doc/api/public/epydoc.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/psycopg2/doc/api/public/epydoc.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/psycopg2/doc/api/public/exceptions.Exception-class.html b/psycopg2/doc/api/public/exceptions.Exception-class.html new file mode 100644 index 0000000..d7e7ba4 --- /dev/null +++ b/psycopg2/doc/api/public/exceptions.Exception-class.html @@ -0,0 +1,128 @@ + + + + + exceptions.Exception + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class Exception +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Exception

+ +
Known Subclasses:
+
+ StandardError
+ +
+ +

Common base class for all exceptions.

+
+ + + + + + + + + + + + +
Method Summary
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+
+
+
+ + +
+

__getitem__(...) +
(Indexing operator) +

+
+
+
+ + +
+

__str__(...) +
(Informal representation operator) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/exceptions.StandardError-class.html b/psycopg2/doc/api/public/exceptions.StandardError-class.html new file mode 100644 index 0000000..ab0a1c3 --- /dev/null +++ b/psycopg2/doc/api/public/exceptions.StandardError-class.html @@ -0,0 +1,102 @@ + + + + + exceptions.StandardError + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class StandardError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class StandardError

+ +
+Exception --+
+            |
+           StandardError
+

+ +
Known Subclasses:
+
+ Error, + Warning
+ +
+ +

Base class for all standard Python exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/frames.html b/psycopg2/doc/api/public/frames.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/psycopg2/doc/api/public/frames.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/psycopg2/doc/api/public/help.html b/psycopg2/doc/api/public/help.html new file mode 100644 index 0000000..0e9a1cf --- /dev/null +++ b/psycopg2/doc/api/public/help.html @@ -0,0 +1,231 @@ + + + + + Help + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains:

+
    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +
+ +

Each Module Documentation page contains:

+
    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +
+ +

Each Class Documentation page contains:

+
    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +
+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies:

+
    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +
+ +

The Index page contains indices of terms and + identifiers:

+
    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +
+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ + + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
  +

+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/index.html b/psycopg2/doc/api/public/index.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/psycopg2/doc/api/public/index.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/psycopg2/doc/api/public/indices.html b/psycopg2/doc/api/public/indices.html new file mode 100644 index 0000000..a6d0fad --- /dev/null +++ b/psycopg2/doc/api/public/indices.html @@ -0,0 +1,418 @@ + + + + + Index + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Identifier Index
__add__Method in class __builtin__.list
__base__member_descriptor in class __builtin__.type
__bases__Variable in class __builtin__.type
__basicsize__member_descriptor in class __builtin__.type
__call__Method in class __builtin__.type
typeClass in module __builtin__
__cmp__Method in class __builtin__.type
__contains__Method in class __builtin__.list
__delattr__Method in class __builtin__.object
__delattr__Method in class __builtin__.type
__delitem__Method in class __builtin__.list
__delslice__Method in class __builtin__.list
__dictoffset__member_descriptor in class __builtin__.type
__eq__Method in class __builtin__.list
__flags__member_descriptor in class __builtin__.type
__ge__Method in class __builtin__.list
__getattribute__Method in class __builtin__.list
__getattribute__Method in class __builtin__.object
__getattribute__Method in class __builtin__.type
__getattribute__Method in class datetime.tzinfo
__getitem__Method in class __builtin__.list
__getitem__Method in class exceptions.Exception
__getitem__Method in class psycopg2.extras.DictRow
__getslice__Method in class __builtin__.list
__gt__Method in class __builtin__.list
__hash__Method in class __builtin__.list
__hash__Method in class __builtin__.object
__hash__Method in class __builtin__.type
__iadd__Method in class __builtin__.list
__imul__Method in class __builtin__.list
__init__Method in class __builtin__.list
__init__Method in class __builtin__.object
__init__Method in class exceptions.Exception
__init__Method in class psycopg2.extras.DictRow
__init__Method in class psycopg2.extras.SQL_IN
__init__Method in class psycopg2.pool.AbstractConnectionPool
__init__Method in class psycopg2.pool.PersistentConnectionPool
__init__Method in class psycopg2.pool.ThreadedConnectionPool
__init__Method in class psycopg2.tz.FixedOffsetTimezone
__itemsize__member_descriptor in class __builtin__.type
__iter__Method in class __builtin__.list
__le__Method in class __builtin__.list
__len__Method in class __builtin__.list
__lt__Method in class __builtin__.list
__mro__member_descriptor in class __builtin__.type
__mul__Method in class __builtin__.list
__name__Variable in class __builtin__.type
__ne__Method in class __builtin__.list
__new__Method in class __builtin__.list
__new__Method in class __builtin__.object
__new__Method in class __builtin__.type
__new__Method in class datetime.tzinfo
__reduce__Method in class __builtin__.object
__reduce__Method in class datetime.tzinfo
__reduce_ex__Method in class __builtin__.object
__repr__Method in class __builtin__.list
__repr__Method in class __builtin__.object
__repr__Method in class __builtin__.type
__rmul__Method in class __builtin__.list
__setattr__Method in class __builtin__.object
__setattr__Method in class __builtin__.type
__setitem__Method in class __builtin__.list
__setslice__Method in class __builtin__.list
__str__Method in class __builtin__.object
__str__Method in class exceptions.Exception
__subclasses__Method in class __builtin__.type
__weakrefoffset__member_descriptor in class __builtin__.type
AbstractConnectionPoolClass in module psycopg2.pool
adaptFunction in module psycopg2.extensions
appendMethod in class __builtin__.list
AsIsFunction in module psycopg2.extensions
autocommitMethod in class psycopg2.psycopg1.connection
BinaryFunction in package psycopg2
BooleanFunction in module psycopg2.extensions
callprocMethod in class psycopg2.extras.DictCursor
closeallMethod in class psycopg2.pool.PersistentConnectionPool
closeallMethod in class psycopg2.pool.ThreadedConnectionPool
connectFunction in package psycopg2
connectFunction in module psycopg2.psycopg1
connectionClass in module psycopg2.psycopg1
countMethod in class __builtin__.list
cursorMethod in class psycopg2.extras.DictConnection
cursorMethod in class psycopg2.psycopg1.connection
cursorClass in module psycopg2.psycopg1
DatabaseErrorClass in package psycopg2
DataErrorClass in package psycopg2
DateFunction in package psycopg2
DateFromPyFunction in module psycopg2.extensions
DateFromTicksFunction in package psycopg2
dbgFunction in module psycopg2.pool
DictConnectionClass in module psycopg2.extras
DictCursorClass in module psycopg2.extras
dictfetchallMethod in class psycopg2.psycopg1.cursor
dictfetchmanyMethod in class psycopg2.psycopg1.cursor
dictfetchoneMethod in class psycopg2.psycopg1.cursor
DictRowClass in module psycopg2.extras
dstMethod in class datetime.tzinfo
dstMethod in class psycopg2.tz.FixedOffsetTimezone
dstMethod in class psycopg2.tz.LocalTimezone
DSTDIFFVariable in module psycopg2.tz
ErrorClass in package psycopg2
ExceptionClass in module exceptions
executeMethod in class psycopg2.extras.DictCursor
extendMethod in class __builtin__.list
extensionsModule in package psycopg2
extrasModule in package psycopg2
fetchallMethod in class psycopg2.extras.DictCursor
fetchmanyMethod in class psycopg2.extras.DictCursor
fetchoneMethod in class psycopg2.extras.DictCursor
FixedOffsetTimezoneClass in module psycopg2.tz
fromutcMethod in class datetime.tzinfo
getMethod in class psycopg2.extras.DictRow
getconnMethod in class psycopg2.pool.PersistentConnectionPool
getconnMethod in class psycopg2.pool.ThreadedConnectionPool
getquotedMethod in class psycopg2.extras.SQL_IN
has_keyMethod in class psycopg2.extras.DictRow
indexMethod in class __builtin__.list
insertMethod in class __builtin__.list
IntegrityErrorClass in package psycopg2
InterfaceErrorClass in package psycopg2
InternalErrorClass in package psycopg2
IntervalFromPyFunction in module psycopg2.extensions
ISOLATION_LEVEL_AUTOCOMMITVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_COMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_UNCOMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_REPEATABLE_READVariable in module psycopg2.extensions
ISOLATION_LEVEL_SERIALIZABLEVariable in module psycopg2.extensions
itemsMethod in class psycopg2.extras.DictRow
keysMethod in class psycopg2.extras.DictRow
listClass in module __builtin__
LOCALVariable in module psycopg2.tz
LocalTimezoneClass in module psycopg2.tz
mroMethod in class __builtin__.type
new_typeFunction in module psycopg2.extensions
NotSupportedErrorClass in package psycopg2
objectClass in module __builtin__
OperationalErrorClass in package psycopg2
PersistentConnectionPoolClass in module psycopg2.pool
poolModule in package psycopg2
PoolErrorClass in module psycopg2.pool
popMethod in class __builtin__.list
ProgrammingErrorClass in package psycopg2
psycopg1Module in package psycopg2
psycopg2Package
putconnMethod in class psycopg2.pool.PersistentConnectionPool
putconnMethod in class psycopg2.pool.ThreadedConnectionPool
QuotedStringFunction in module psycopg2.extensions
register_adapterFunction in module psycopg2.extensions
register_typeFunction in module psycopg2.extensions
removeMethod in class __builtin__.list
reverseMethod in class __builtin__.list
SimpleConnectionPoolClass in module psycopg2.pool
sortMethod in class __builtin__.list
SQL_INClass in module psycopg2.extras
StandardErrorClass in module exceptions
STDOFFSETVariable in module psycopg2.tz
ThreadedConnectionPoolClass in module psycopg2.pool
TimeFunction in package psycopg2
TimeFromPyFunction in module psycopg2.extensions
TimeFromTicksFunction in package psycopg2
TimestampFunction in package psycopg2
TimestampFromPyFunction in module psycopg2.extensions
TimestampFromTicksFunction in package psycopg2
typeClass in module __builtin__
tzModule in package psycopg2
tzinfoClass in module datetime
tznameMethod in class datetime.tzinfo
tznameMethod in class psycopg2.tz.FixedOffsetTimezone
tznameMethod in class psycopg2.tz.LocalTimezone
utcoffsetMethod in class datetime.tzinfo
utcoffsetMethod in class psycopg2.tz.FixedOffsetTimezone
utcoffsetMethod in class psycopg2.tz.LocalTimezone
valuesMethod in class psycopg2.extras.DictRow
WarningClass in package psycopg2
ZEROVariable in module psycopg2.tz
+
+ + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2-module.html b/psycopg2/doc/api/public/psycopg2-module.html new file mode 100644 index 0000000..052c338 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2-module.html @@ -0,0 +1,335 @@ + + + + + psycopg2 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Package psycopg2

+ +

A Python driver for PostgreSQL

+

psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being very +small and fast, and stable as a rock.

+

Homepage: http://initd.org/projects/psycopg2

+
+ + + + + + +
Submodules
    +
  • extensions: psycopg extensions to the DBAPI-2.0
  • +
  • extras: Miscellaneous goodies for psycopg2
  • +
  • pool: Connection pooling for psycopg2
  • +
  • psycopg1: psycopg 1.1.x compatibility module
  • +
  • tz: tzinfo implementations for psycopg2
  • +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Exceptions
+ DatabaseErrorError related to the database engine.
+ DataErrorError related to problems with the processed data.
+ ErrorBase class for error exceptions.
+ IntegrityErrorError related to database integrity.
+ InterfaceErrorError related to the database interface.
+ InternalErrorThe database encountered an internal error.
+ NotSupportedErrorA not supported datbase API was called.
+ OperationalErrorError related to database operation (disconnect, memory allocation etc).
+ ProgrammingErrorError related to database programming (SQL error, table not found etc).
+ WarningA database warning.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
    Connections creation
extensions.connectionconnect(dsn, + ...) +
+Create a new database connection.
    Value objects constructors
new binary objectBinary(buffer) +
+Build an object capable to hold a bynary string value.
new dateDate(year, + month, + day) +
+Build an object holding a date value.
new dateDateFromTicks(ticks) +
+Build an object holding a date value from the given ticks value.
new timeTime(hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a time value.
new timeTimeFromTicks(ticks) +
+Build an object holding a time value from the given ticks value.
new timestampTimestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a timestamp value.
new timestampTimestampFromTicks(ticks) +
+Build an object holding a timestamp value from the given ticks value.

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+

Create a new database connection.

+

This function supports two different but equivalent sets of arguments. +A single data source name or dsn string can be used to specify the +connection parameters, as follows:

+
+psycopg2.connect("dbname=xxx user=xxx ...")
+
+

If dsn is not provided it is possible to pass the parameters as +keyword arguments; e.g.:

+
+psycopg2.connect(database='xxx', user='xxx', ...)
+
+

The full list of available parameters is:

+
    +
  • dbname -- database name (only in 'dsn')
  • +
  • database -- database name (only as keyword argument)
  • +
  • host -- host address (defaults to UNIX socket if not provided)
  • +
  • port -- port number (defaults to 5432 if not provided)
  • +
  • user -- user name used to authenticate
  • +
  • password -- password used to authenticate
  • +
  • sslmode -- SSL mode (see PostgreSQL documentation)
  • +
+

If the connection_factory keyword argument is not provided this +function always return an instance of the connection class. +Else the given sub-class of extensions.connection will be used to +instantiate the connection object.

+
+
Returns:
+
+New database connection
           + (type=extensions.connection) +
+
+
+
+ + +
+

Binary(buffer) +

+

Build an object capable to hold a bynary string value.

+
+
Returns:
+
+new binary object
+
+
+
+ + +
+

Date(year, + month, + day) +

+

Build an object holding a date value.

+
+
Returns:
+
+new date
+
+
+
+ + +
+

DateFromTicks(ticks) +

+

Build an object holding a date value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new date
+
+
+
+ + +
+

Time(hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a time value.

+
+
Returns:
+
+new time
+
+
+
+ + +
+

TimeFromTicks(ticks) +

+

Build an object holding a time value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new time
+
+
+
+ + +
+

Timestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a timestamp value.

+
+
Returns:
+
+new timestamp
+
+
+
+ + +
+

TimestampFromTicks(ticks) +

+

Build an object holding a timestamp value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new timestamp
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.DataError-class.html b/psycopg2/doc/api/public/psycopg2.DataError-class.html new file mode 100644 index 0000000..48749b9 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.DataError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.DataError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DataError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DataError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       DataError
+

+ +
+ +

Error related to problems with the processed data.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.DatabaseError-class.html b/psycopg2/doc/api/public/psycopg2.DatabaseError-class.html new file mode 100644 index 0000000..154af85 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.DatabaseError-class.html @@ -0,0 +1,110 @@ + + + + + psycopg2.DatabaseError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DatabaseError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DatabaseError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   DatabaseError
+

+ +
Known Subclasses:
+
+ DataError, + IntegrityError, + InternalError, + NotSupportedError, + OperationalError, + ProgrammingError
+ +
+ +

Error related to the database engine.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.Error-class.html b/psycopg2/doc/api/public/psycopg2.Error-class.html new file mode 100644 index 0000000..ed0b9fa --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.Error-class.html @@ -0,0 +1,105 @@ + + + + + psycopg2.Error + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Error +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Error

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Error
+

+ +
Known Subclasses:
+
+ DatabaseError, + InterfaceError, + PoolError
+ +
+ +

Base class for error exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.IntegrityError-class.html b/psycopg2/doc/api/public/psycopg2.IntegrityError-class.html new file mode 100644 index 0000000..f2e2752 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.IntegrityError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.IntegrityError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class IntegrityError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class IntegrityError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       IntegrityError
+

+ +
+ +

Error related to database integrity.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.InterfaceError-class.html b/psycopg2/doc/api/public/psycopg2.InterfaceError-class.html new file mode 100644 index 0000000..40667fa --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.InterfaceError-class.html @@ -0,0 +1,101 @@ + + + + + psycopg2.InterfaceError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InterfaceError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InterfaceError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   InterfaceError
+

+ +
+ +

Error related to the database interface.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.InternalError-class.html b/psycopg2/doc/api/public/psycopg2.InternalError-class.html new file mode 100644 index 0000000..13290d4 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.InternalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.InternalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InternalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InternalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       InternalError
+

+ +
+ +

The database encountered an internal error.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.NotSupportedError-class.html b/psycopg2/doc/api/public/psycopg2.NotSupportedError-class.html new file mode 100644 index 0000000..842c79f --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.NotSupportedError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.NotSupportedError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class NotSupportedError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class NotSupportedError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       NotSupportedError
+

+ +
+ +

A not supported datbase API was called.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.OperationalError-class.html b/psycopg2/doc/api/public/psycopg2.OperationalError-class.html new file mode 100644 index 0000000..e52e8b1 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.OperationalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.OperationalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class OperationalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class OperationalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       OperationalError
+

+ +
+ +

Error related to database operation (disconnect, memory allocation etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.ProgrammingError-class.html b/psycopg2/doc/api/public/psycopg2.ProgrammingError-class.html new file mode 100644 index 0000000..ea995a5 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.ProgrammingError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.ProgrammingError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class ProgrammingError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class ProgrammingError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       ProgrammingError
+

+ +
+ +

Error related to database programming (SQL error, table not found etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.Warning-class.html b/psycopg2/doc/api/public/psycopg2.Warning-class.html new file mode 100644 index 0000000..86631fe --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.Warning-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.Warning + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Warning +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Warning

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Warning
+

+ +
+ +

A database warning.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2._psycopg-module.html b/psycopg2/doc/api/public/psycopg2._psycopg-module.html new file mode 100644 index 0000000..034827e --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2._psycopg-module.html @@ -0,0 +1,1001 @@ + + + + + psycopg2._psycopg + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2._psycopg

+ +

psycopg PostgreSQL driver

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Summary
str__version__ = '2.0b7 (dt ext pq3)' +
dictadapters = {(<type 'bool'>, <type 'psycopg2._psycopg.ISQ... +
strapilevel = '2.0' +
typeBINARY = <psycopg2._psycopg.type object at 0x009558C0> +
dictbinary_types = {} +
typeBINARYARRAY = <psycopg2._psycopg.type object at 0x00955B... +
typeBOOLEAN = <psycopg2._psycopg.type object at 0x00955760> +
typeBOOLEANARRAY = <psycopg2._psycopg.type object at 0x00955... +
typeDATE = <psycopg2._psycopg.type object at 0x009558A0> +
typeDATEARRAY = <psycopg2._psycopg.type object at 0x00955AA0... +
typeDATETIME = <psycopg2._psycopg.type object at 0x009557C0> +
typeDATETIMEARRAY = <psycopg2._psycopg.type object at 0x0095... +
typeDECIMAL = <psycopg2._psycopg.type object at 0x00955680> +
typeDECIMALARRAY = <psycopg2._psycopg.type object at 0x00955... +
dictencodings = {'UTF8': 'utf_8', 'LATIN-1': 'latin_1', 'SQL... +
typeFLOAT = <psycopg2._psycopg.type object at 0x00955660> +
typeFLOATARRAY = <psycopg2._psycopg.type object at 0x009559E... +
typeINTEGER = <psycopg2._psycopg.type object at 0x00955620> +
typeINTEGERARRAY = <psycopg2._psycopg.type object at 0x00955... +
typeINTERVAL = <psycopg2._psycopg.type object at 0x00955860> +
typeINTERVALARRAY = <psycopg2._psycopg.type object at 0x0095... +
typeLONGINTEGER = <psycopg2._psycopg.type object at 0x009555... +
typeLONGINTEGERARRAY = <psycopg2._psycopg.type object at 0x0... +
typeNUMBER = <psycopg2._psycopg.type object at 0x00955540> +
strparamstyle = 'pyformat' +
typePYDATE = <psycopg2._psycopg.type object at 0x00955D00> +
typePYDATETIME = <psycopg2._psycopg.type object at 0x00955C0... +
typePYINTERVAL = <psycopg2._psycopg.type object at 0x00955CE... +
typePYTIME = <psycopg2._psycopg.type object at 0x00955C40> +
typeROWID = <psycopg2._psycopg.type object at 0x009559A0> +
typeROWIDARRAY = <psycopg2._psycopg.type object at 0x00955BE... +
typeSTRING = <psycopg2._psycopg.type object at 0x00955720> +
dictstring_types = {1028: <psycopg2._psycopg.type object at ... +
typeSTRINGARRAY = <psycopg2._psycopg.type object at 0x00955A... +
intthreadsafety = 2                                                                     
typeTIME = <psycopg2._psycopg.type object at 0x00955840> +
typeTIMEARRAY = <psycopg2._psycopg.type object at 0x00955B00... +
typeUNICODE = <psycopg2._psycopg.type object at 0x009556C0> +
typeUNICODEARRAY = <psycopg2._psycopg.type object at 0x00955... +

+ + + + + + +
Variable Details
+
+ +

__version__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0b7 (dt ext pq3)'                                                   
+
+
+
+
+
+ +

adapters

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{(<type 'datetime.timedelta'>, <type 'psycopg2._psycopg.ISQLQuote'>): \
+<built-in function IntervalFromPy>,
+ (<type 'datetime.date'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function DateFromPy>,
+ (<type 'datetime.time'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function TimeFromPy>,
+ (<type 'datetime.datetime'>, <type 'psycopg2._psycopg.ISQLQuote'>): <\
+built-in function TimestampFromPy>,
+...                                                                    
+
+
+
+
+
+ +

apilevel

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0'                                                                  
+
+
+
+
+
+ +

BINARY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009558C0>                          
+
+
+
+
+
+ +

binary_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{}                                                                     
+
+
+
+
+
+ +

BINARYARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955B60>                          
+
+
+
+
+
+ +

BOOLEAN

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955760>                          
+
+
+
+
+
+ +

BOOLEANARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A20>                          
+
+
+
+
+
+ +

DATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009558A0>                          
+
+
+
+
+
+ +

DATEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955AA0>                          
+
+
+
+
+
+ +

DATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009557C0>                          
+
+
+
+
+
+ +

DATETIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955AC0>                          
+
+
+
+
+
+ +

DECIMAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955680>                          
+
+
+
+
+
+ +

DECIMALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955260>                          
+
+
+
+
+
+ +

encodings

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'LATIN-1': 'latin_1',
+ 'LATIN1': 'latin_1',
+ 'SQL_ASCII': 'ascii',
+ 'UNICODE': 'utf_8',
+ 'UTF8': 'utf_8'}                                                      
+
+
+
+
+
+ +

FLOAT

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955660>                          
+
+
+
+
+
+ +

FLOATARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009559E0>                          
+
+
+
+
+
+ +

INTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955620>                          
+
+
+
+
+
+ +

INTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A00>                          
+
+
+
+
+
+ +

INTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955860>                          
+
+
+
+
+
+ +

INTERVALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955BA0>                          
+
+
+
+
+
+ +

LONGINTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009555C0>                          
+
+
+
+
+
+ +

LONGINTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955960>                          
+
+
+
+
+
+ +

NUMBER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955540>                          
+
+
+
+
+
+ +

paramstyle

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'pyformat'                                                             
+
+
+
+
+
+ +

PYDATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955D00>                          
+
+
+
+
+
+ +

PYDATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955C00>                          
+
+
+
+
+
+ +

PYINTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955CE0>                          
+
+
+
+
+
+ +

PYTIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955C40>                          
+
+
+
+
+
+ +

ROWID

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009559A0>                          
+
+
+
+
+
+ +

ROWIDARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955BE0>                          
+
+
+
+
+
+ +

STRING

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955720>                          
+
+
+
+
+
+ +

string_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{16: <psycopg2._psycopg.type object at 0x00955760>,
+ 17: <psycopg2._psycopg.type object at 0x009558C0>,
+ 18: <psycopg2._psycopg.type object at 0x00955720>,
+ 19: <psycopg2._psycopg.type object at 0x00955720>,
+ 20: <psycopg2._psycopg.type object at 0x009555C0>,
+ 21: <psycopg2._psycopg.type object at 0x00955620>,
+ 23: <psycopg2._psycopg.type object at 0x00955620>,
+ 25: <psycopg2._psycopg.type object at 0x00955720>,
+...                                                                    
+
+
+
+
+
+ +

STRINGARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A80>                          
+
+
+
+
+
+ +

threadsafety

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

TIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955840>                          
+
+
+
+
+
+ +

TIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955B00>                          
+
+
+
+
+
+ +

UNICODE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009556C0>                          
+
+
+
+
+
+ +

UNICODEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A40>                          
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.extensions-module.html b/psycopg2/doc/api/public/psycopg2.extensions-module.html new file mode 100644 index 0000000..4e97448 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.extensions-module.html @@ -0,0 +1,418 @@ + + + + + psycopg2.extensions + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extensions +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extensions

+ +

psycopg extensions to the DBAPI-2.0

+

This module holds all the extensions to the DBAPI-2.0 provided by psycopg.

+
    +
  • connection -- the new-type inheritable connection class
  • +
  • cursor -- the new-type inheritable cursor class
  • +
  • adapt() -- exposes the PEP-246 compatible adapting mechanism used +by psycopg to adapt Python types to PostgreSQL ones
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
objectadapt(obj, + protocol, + alternate) +
+adapt obj to given protocol
new AsIs wrapper objectAsIs(obj) +
new boolean valueBoolean(obj) +
new wrapperDateFromPy(datetime.date) +
new wrapperIntervalFromPy(datetime.timedelta) +
new type objectnew_type(oids, + name, + adapter) +
+Create a new binding object.
new quoted stringQuotedString(str, + enc) +
 register_adapter(typ, + callable) +
+Register 'callable' as an ISQLQuote adapter for type 'typ'.
Noneregister_type(obj) +
+register obj with psycopg type system
new wrapperTimeFromPy(datetime.time) +
new wrapperTimestampFromPy(datetime.datetime) +

+ + + + + + + + + + + + + + + + +
Variable Summary
intISOLATION_LEVEL_AUTOCOMMIT = 0                                                                     
intISOLATION_LEVEL_READ_COMMITTED = 1                                                                     
intISOLATION_LEVEL_READ_UNCOMMITTED = 1                                                                     
intISOLATION_LEVEL_REPEATABLE_READ = 2                                                                     
intISOLATION_LEVEL_SERIALIZABLE = 2                                                                     

+ + + + + + +
Function Details
+ + +
+

adapt(obj, + protocol, + alternate) +

+

adapt obj to given protocol

+
+
Returns:
+
+object
+
+
+
+ + +
+

AsIs(obj) +

+
+
Returns:
+
+new AsIs wrapper object
+
+
+
+ + +
+

Boolean(obj) +

+
+
Returns:
+
+new boolean value
+
+
+
+ + +
+

DateFromPy(datetime.date) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

IntervalFromPy(datetime.timedelta) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

new_type(oids, + name, + adapter) +

+

Create a new binding object. The object can be used with the +register_type() function to bind PostgreSQL objects to python objects.

+
+
Parameters:
+
oids - + Tuple of oid of the PostgreSQL types to convert. +
+
name - + Name for the new type +
+
adapter - + Callable to perform type conversion. +It must have the signature fun(value, cur) where value is +the string representation returned by PostgreSQL (None if NULL) +and cur is the cursor from which data are read. +
+
+
Returns:
+
+new type object
+
+
+
+ + +
+

QuotedString(str, + enc) +

+
+
Returns:
+
+new quoted string
+
+
+
+ + +
+

register_adapter(typ, + callable) +

+

Register 'callable' as an ISQLQuote adapter for type 'typ'.

+
+
+
+ + +
+

register_type(obj) +

+

register obj with psycopg type system

+
+
Parameters:
+
obj - + A type adapter created by new_type() +
+
+
Returns:
+
+None
+
+
+
+ + +
+

TimeFromPy(datetime.time) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

TimestampFromPy(datetime.datetime) +

+
+
Returns:
+
+new wrapper
+
+
+
+
+ + + + + + +
Variable Details
+
+ +

ISOLATION_LEVEL_AUTOCOMMIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_COMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_UNCOMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_REPEATABLE_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_SERIALIZABLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.extras-module.html b/psycopg2/doc/api/public/psycopg2.extras-module.html new file mode 100644 index 0000000..c99a0ce --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.extras-module.html @@ -0,0 +1,91 @@ + + + + + psycopg2.extras + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extras

+ +

Miscellaneous goodies for psycopg2

+

This module is a generic place used to hold little helper functions +and classes untill a better place in the distribution is found.

+
+ + + + + + + + + + + + + +
Classes
+ DictConnectionA connection that uses DictCursor automatically.
+ DictCursorA cursor that keeps a list of column name -> index mappings.
+ DictRowA row object that allow by-colun-name access to data.
+ SQL_INAdapt any iterable to an SQL quotable object.

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.extras.DictConnection-class.html b/psycopg2/doc/api/public/psycopg2.extras.DictConnection-class.html new file mode 100644 index 0000000..988bd79 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.extras.DictConnection-class.html @@ -0,0 +1,137 @@ + + + + + psycopg2.extras.DictConnection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictConnection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictConnection

+ +
+object --+    
+         |    
+connection --+
+             |
+            DictConnection
+

+ +
+ +

A connection that uses DictCursor automatically.

+
+ + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 cursor(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

cursor(self) +

+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.extras.DictCursor-class.html b/psycopg2/doc/api/public/psycopg2.extras.DictCursor-class.html new file mode 100644 index 0000000..d546d3a --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.extras.DictCursor-class.html @@ -0,0 +1,205 @@ + + + + + psycopg2.extras.DictCursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictCursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictCursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            DictCursor
+

+ +
+ +

A cursor that keeps a list of column name -> index mappings.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 callproc(self, + procname, + vars) +
 execute(self, + query, + vars, + async) +
 fetchall(self) +
 fetchmany(self, + size) +
 fetchone(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

callproc(self, + procname, + vars=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.callproc
+
+
+
+ + +
+

execute(self, + query, + vars=None, + async=0) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.execute
+
+
+
+ + +
+

fetchall(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchall
+
+
+
+ + +
+

fetchmany(self, + size=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchmany
+
+
+
+ + +
+

fetchone(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchone
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.extras.DictRow-class.html b/psycopg2/doc/api/public/psycopg2.extras.DictRow-class.html new file mode 100644 index 0000000..e278ca3 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.extras.DictRow-class.html @@ -0,0 +1,376 @@ + + + + + psycopg2.extras.DictRow + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictRow +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictRow

+ +
+object --+    
+         |    
+      list --+
+             |
+            DictRow
+

+ +
+ +

A row object that allow by-colun-name access to data.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + cursor) +
 __getitem__(self, + x) +
 get(self, + x, + default) +
 has_key(self, + x) +
 items(self) +
 keys(self) +
 values(self) +
    Inherited from list
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + cursor) +
(Constructor) +

+
+
Overrides:
+
__builtin__.list.__init__
+
+
+
+ + +
+

__getitem__(self, + x) +
(Indexing operator) +

+
+
Overrides:
+
__builtin__.list.__getitem__
+
+
+
+ + +
+

get(self, + x, + default=None) +

+
+
+
+ + +
+

has_key(self, + x) +

+
+
+
+ + +
+

items(self) +

+
+
+
+ + +
+

keys(self) +

+
+
+
+ + +
+

values(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.extras.SQL_IN-class.html b/psycopg2/doc/api/public/psycopg2.extras.SQL_IN-class.html new file mode 100644 index 0000000..0b05cd2 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.extras.SQL_IN-class.html @@ -0,0 +1,171 @@ + + + + + psycopg2.extras.SQL_IN + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class SQL_IN +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SQL_IN

+ +
+object --+
+         |
+        SQL_IN
+

+ +
+ +

Adapt any iterable to an SQL quotable object.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + seq) +
 __str__(self) +
 getquoted(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

__init__(self, + seq) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+
+
+
+ + +
+

getquoted(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.pool-module.html b/psycopg2/doc/api/public/psycopg2.pool-module.html new file mode 100644 index 0000000..34fbebd --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.pool-module.html @@ -0,0 +1,126 @@ + + + + + psycopg2.pool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.pool

+ +

Connection pooling for psycopg2

+

This module implements thread-safe (and not) connection pools.

+
+ + + + + + + + + + + + + +
Classes
+ AbstractConnectionPoolGeneric key-based pooling code.
+ PersistentConnectionPoolA pool that assigns persistent connections to different threads.
+ SimpleConnectionPoolA connection pool that can't be shared across different threads.
+ ThreadedConnectionPoolA connection pool that works with the threading module.

+ + + + + + + + +
Exceptions
+ PoolError 

+ + + + + + + + +
Function Summary
 dbg(*args) +

+ + + + + + +
Function Details
+ + +
+

dbg(*args) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html b/psycopg2/doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html new file mode 100644 index 0000000..41d63b9 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html @@ -0,0 +1,169 @@ + + + + + psycopg2.pool.AbstractConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class AbstractConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type AbstractConnectionPool

+ +
+object --+
+         |
+        AbstractConnectionPool
+

+ +
Known Subclasses:
+
+ PersistentConnectionPool, + SimpleConnectionPool, + ThreadedConnectionPool
+ +
+ +

Generic key-based pooling code.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the connection pool.

+

New 'minconn' connections are created immediately calling 'connfunc' +with given parameters. The connection pool will support a maximum of +about 'maxconn' connections.

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html b/psycopg2/doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html new file mode 100644 index 0000000..954b8b5 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html @@ -0,0 +1,210 @@ + + + + + psycopg2.pool.PersistentConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PersistentConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PersistentConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        PersistentConnectionPool
+

+ +
+ +

A pool that assigns persistent connections to different threads.

+

Note that this connection pool generates by itself the required keys +using the current thread id. This means that untill a thread put away +a connection it will always get the same connection object by successive +.getconn() calls. This also means that a thread can't use more than one +single connection from the pool.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self) +
+Generate thread id and return a connection.
 putconn(self, + conn, + close) +
+Put away an unused connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self) +

+

Generate thread id and return a connection.

+
+
+
+ + +
+

putconn(self, + conn=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.pool.PoolError-class.html b/psycopg2/doc/api/public/psycopg2.pool.PoolError-class.html new file mode 100644 index 0000000..89cd4f7 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.pool.PoolError-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.pool.PoolError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PoolError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class PoolError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   PoolError
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html b/psycopg2/doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html new file mode 100644 index 0000000..ea8f605 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html @@ -0,0 +1,139 @@ + + + + + psycopg2.pool.SimpleConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class SimpleConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SimpleConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        SimpleConnectionPool
+

+ +
+ +

A connection pool that can't be shared across different threads.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
    Inherited from AbstractConnectionPool
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html b/psycopg2/doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html new file mode 100644 index 0000000..64c95a9 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html @@ -0,0 +1,209 @@ + + + + + psycopg2.pool.ThreadedConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class ThreadedConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ThreadedConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        ThreadedConnectionPool
+

+ +
+ +

A connection pool that works with the threading module.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 putconn(self, + conn, + key, + close) +
+Put away an unused connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

putconn(self, + conn=None, + key=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.psycopg1-module.html b/psycopg2/doc/api/public/psycopg2.psycopg1-module.html new file mode 100644 index 0000000..18a9a75 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.psycopg1-module.html @@ -0,0 +1,121 @@ + + + + + psycopg2.psycopg1 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.psycopg1

+ +

psycopg 1.1.x compatibility module

+

This module uses the new style connection and cursor types to build a psycopg +1.1.1.x compatibility layer. It should be considered a temporary hack to run +old code while porting to psycopg 2. Import it as follows:

+
+from psycopg2 import psycopg1 as psycopg
+
+
+ + + + + + + + + +
Classes
+ connectionpsycopg 1.1.x connection.
+ cursorpsycopg 1.1.x cursor.

+ + + + + + + + +
Function Summary
new psycopg 1.1.x compatible connection objectconnect(dsn, + ...) +

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+
+
Returns:
+
+new psycopg 1.1.x compatible connection object
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.psycopg1.connection-class.html b/psycopg2/doc/api/public/psycopg2.psycopg1.connection-class.html new file mode 100644 index 0000000..9b5b429 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.psycopg1.connection-class.html @@ -0,0 +1,156 @@ + + + + + psycopg2.psycopg1.connection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class connection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type connection

+ +
+object --+    
+         |    
+connection --+
+             |
+            connection
+

+ +
+ +

psycopg 1.1.x connection.

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
switch autocommit on (1) or off (0)autocommit(on_off) +
new psycopg 1.1.x compatible cursor objectcursor() +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

autocommit(on_off=1) +

+
+
Returns:
+
+switch autocommit on (1) or off (0)
+
+
+
+ + +
+

cursor() +

+
+
Returns:
+
+new psycopg 1.1.x compatible cursor object
+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.psycopg1.cursor-class.html b/psycopg2/doc/api/public/psycopg2.psycopg1.cursor-class.html new file mode 100644 index 0000000..f80677d --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.psycopg1.cursor-class.html @@ -0,0 +1,161 @@ + + + + + psycopg2.psycopg1.cursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class cursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type cursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            cursor
+

+ +
+ +

psycopg 1.1.x cursor.

+

Note that this cursor implements the exact procedure used by psycopg 1 to +build dictionaries out of result rows. The DictCursor in the +psycopg.extras modules implements a much better and faster algorithm.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dictfetchall(self) +
 dictfetchmany(self, + size) +
 dictfetchone(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

dictfetchall(self) +

+
+
+
+ + +
+

dictfetchmany(self, + size) +

+
+
+
+ + +
+

dictfetchone(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.tz-module.html b/psycopg2/doc/api/public/psycopg2.tz-module.html new file mode 100644 index 0000000..192ac5e --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.tz-module.html @@ -0,0 +1,193 @@ + + + + + psycopg2.tz + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.tz

+ +

tzinfo implementations for psycopg2

+

This module holds two different tzinfo implementations that can be used as +the 'tzinfo' argument to datetime constructors, directly passed to psycopg +functions or used to set the .tzinfo_factory attribute in cursors.

+
+ + + + + + + + + +
Classes
+ FixedOffsetTimezoneFixed offset in minutes east from UTC.
+ LocalTimezonePlatform idea of local timezone.

+ + + + + + + + + + + + + + +
Variable Summary
timedeltaDSTDIFF = datetime.timedelta(0, 3600) +
LocalTimezoneLOCAL = <psycopg2.tz.LocalTimezone object at 0x00847090> +
timedeltaSTDOFFSET = datetime.timedelta(0, 3600) +
timedeltaZERO = datetime.timedelta(0) +

+ + + + + + +
Variable Details
+
+ +

DSTDIFF

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

LOCAL

+
+
+
+
+
Type:
+
+ LocalTimezone + +
+
Value:
+
+
+<psycopg2.tz.LocalTimezone object at 0x00847090>                       
+
+
+
+
+
+ +

STDOFFSET

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

ZERO

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0)                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html b/psycopg2/doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html new file mode 100644 index 0000000..71145dd --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html @@ -0,0 +1,213 @@ + + + + + psycopg2.tz.FixedOffsetTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class FixedOffsetTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type FixedOffsetTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            FixedOffsetTimezone
+

+ +
+ +

Fixed offset in minutes east from UTC.

+

This is exactly the implementation found in Python 2.3.x documentation, +with a small change to the __init__ method to allow for pickling and a +default name in the form 'sHH:MM' ('s' is the sign.)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + offset, + name) +
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + offset=None, + name=None) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/psycopg2.tz.LocalTimezone-class.html b/psycopg2/doc/api/public/psycopg2.tz.LocalTimezone-class.html new file mode 100644 index 0000000..7f95294 --- /dev/null +++ b/psycopg2/doc/api/public/psycopg2.tz.LocalTimezone-class.html @@ -0,0 +1,196 @@ + + + + + psycopg2.tz.LocalTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class LocalTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type LocalTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            LocalTimezone
+

+ +
+ +

Platform idea of local timezone.

+

This is the exact implementation from the Pyhton 2.3 documentation.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/api/public/toc-everything.html b/psycopg2/doc/api/public/toc-everything.html new file mode 100644 index 0000000..a13c502 --- /dev/null +++ b/psycopg2/doc/api/public/toc-everything.html @@ -0,0 +1,90 @@ + + + + + Everything + + + + +

Everything

+
+ + +

All Classes

+

psycopg2.extras.DictConnection

+

psycopg2.extras.DictCursor

+

psycopg2.extras.DictRow

+

psycopg2.extras.SQL_IN

+

psycopg2.pool.AbstractConnectionPool

+

psycopg2.pool.PersistentConnectionPool

+

psycopg2.pool.SimpleConnectionPool

+

psycopg2.pool.ThreadedConnectionPool

+

psycopg2.psycopg1.connection

+

psycopg2.psycopg1.cursor

+

psycopg2.tz.FixedOffsetTimezone

+

psycopg2.tz.LocalTimezone

+ + +

All Exceptions

+

psycopg2.DatabaseError

+

psycopg2.DataError

+

psycopg2.Error

+

psycopg2.IntegrityError

+

psycopg2.InterfaceError

+

psycopg2.InternalError

+

psycopg2.NotSupportedError

+

psycopg2.OperationalError

+

psycopg2.pool.PoolError

+

psycopg2.ProgrammingError

+

psycopg2.Warning

+ + +

All Functions

+

adapt

+

AsIs

+

Binary

+

Boolean

+

connect

+

connect

+

Date

+

DateFromPy

+

DateFromTicks

+

dbg

+

IntervalFromPy

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

Time

+

TimeFromPy

+

TimeFromTicks

+

Timestamp

+

TimestampFromPy

+

TimestampFromTicks

+ + +

All Variables

+

DSTDIFF

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+

LOCAL

+

STDOFFSET

+

ZERO

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc-psycopg2-module.html b/psycopg2/doc/api/public/toc-psycopg2-module.html new file mode 100644 index 0000000..fa15e9b --- /dev/null +++ b/psycopg2/doc/api/public/toc-psycopg2-module.html @@ -0,0 +1,57 @@ + + + + + psycopg2 + + + + +

psycopg2

+
+ + +

Modules

+

extensions

+

extras

+

pool

+

psycopg1

+

tz

+ + +

Exceptions

+

DatabaseError

+

DataError

+

Error

+

IntegrityError

+

InterfaceError

+

InternalError

+

NotSupportedError

+

OperationalError

+

ProgrammingError

+

Warning

+ + +

Functions

+

Binary

+

connect

+

Date

+

DateFromTicks

+

Time

+

TimeFromTicks

+

Timestamp

+

TimestampFromTicks

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc-psycopg2._psycopg-module.html b/psycopg2/doc/api/public/toc-psycopg2._psycopg-module.html new file mode 100644 index 0000000..6e8fa49 --- /dev/null +++ b/psycopg2/doc/api/public/toc-psycopg2._psycopg-module.html @@ -0,0 +1,73 @@ + + + + + psycopg2._psycopg + + + + +

_psycopg

+
+ + +

Classes

+ + +

Functions

+ + +

Variables

+

__version__

+

adapters

+

apilevel

+

BINARY

+

binary_types

+

BINARYARRAY

+

BOOLEAN

+

BOOLEANARRAY

+

DATE

+

DATEARRAY

+

DATETIME

+

DATETIMEARRAY

+

DECIMAL

+

DECIMALARRAY

+

encodings

+

FLOAT

+

FLOATARRAY

+

INTEGER

+

INTEGERARRAY

+

INTERVAL

+

INTERVALARRAY

+

LONGINTEGER

+

LONGINTEGERARRAY

+

NUMBER

+

paramstyle

+

PYDATE

+

PYDATETIME

+

PYINTERVAL

+

PYTIME

+

ROWID

+

ROWIDARRAY

+

STRING

+

string_types

+

STRINGARRAY

+

threadsafety

+

TIME

+

TIMEARRAY

+

UNICODE

+

UNICODEARRAY

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc-psycopg2.extensions-module.html b/psycopg2/doc/api/public/toc-psycopg2.extensions-module.html new file mode 100644 index 0000000..abf93eb --- /dev/null +++ b/psycopg2/doc/api/public/toc-psycopg2.extensions-module.html @@ -0,0 +1,47 @@ + + + + + psycopg2.extensions + + + + +

extensions

+
+ + +

Functions

+

adapt

+

AsIs

+

Boolean

+

DateFromPy

+

IntervalFromPy

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

TimeFromPy

+

TimestampFromPy

+ + +

Variables

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc-psycopg2.extras-module.html b/psycopg2/doc/api/public/toc-psycopg2.extras-module.html new file mode 100644 index 0000000..f193b47 --- /dev/null +++ b/psycopg2/doc/api/public/toc-psycopg2.extras-module.html @@ -0,0 +1,32 @@ + + + + + psycopg2.extras + + + + +

extras

+
+ + +

Classes

+

DictConnection

+

DictCursor

+

DictRow

+

SQL_IN

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc-psycopg2.pool-module.html b/psycopg2/doc/api/public/toc-psycopg2.pool-module.html new file mode 100644 index 0000000..0736019 --- /dev/null +++ b/psycopg2/doc/api/public/toc-psycopg2.pool-module.html @@ -0,0 +1,40 @@ + + + + + psycopg2.pool + + + + +

pool

+
+ + +

Classes

+

AbstractConnectionPool

+

PersistentConnectionPool

+

SimpleConnectionPool

+

ThreadedConnectionPool

+ + +

Exceptions

+

PoolError

+ + +

Functions

+

dbg

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc-psycopg2.psycopg1-module.html b/psycopg2/doc/api/public/toc-psycopg2.psycopg1-module.html new file mode 100644 index 0000000..69b1f79 --- /dev/null +++ b/psycopg2/doc/api/public/toc-psycopg2.psycopg1-module.html @@ -0,0 +1,34 @@ + + + + + psycopg2.psycopg1 + + + + +

psycopg1

+
+ + +

Classes

+

connection

+

cursor

+ + +

Functions

+

connect

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc-psycopg2.tz-module.html b/psycopg2/doc/api/public/toc-psycopg2.tz-module.html new file mode 100644 index 0000000..6f617fe --- /dev/null +++ b/psycopg2/doc/api/public/toc-psycopg2.tz-module.html @@ -0,0 +1,37 @@ + + + + + psycopg2.tz + + + + +

tz

+
+ + +

Classes

+

FixedOffsetTimezone

+

LocalTimezone

+ + +

Variables

+

DSTDIFF

+

LOCAL

+

STDOFFSET

+

ZERO

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/toc.html b/psycopg2/doc/api/public/toc.html new file mode 100644 index 0000000..89021cc --- /dev/null +++ b/psycopg2/doc/api/public/toc.html @@ -0,0 +1,38 @@ + + + + + Table of Contents + + + + +

Table of Contents

+
+

Everything

+ + +

Packages

+

psycopg2

+ + +

Modules

+

psycopg2.extensions

+

psycopg2.extras

+

psycopg2.pool

+

psycopg2.psycopg1

+

psycopg2.tz

+ +
+[show private | hide private] + + diff --git a/psycopg2/doc/api/public/trees.html b/psycopg2/doc/api/public/trees.html new file mode 100644 index 0000000..44573d9 --- /dev/null +++ b/psycopg2/doc/api/public/trees.html @@ -0,0 +1,174 @@ + + + + + Module and Class Hierarchies + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ + +

Module Hierarchy

+
    +
  • psycopg2: A Python driver for PostgreSQL
      +
    • extensions: psycopg extensions to the DBAPI-2.0
    • +
    • extras: Miscellaneous goodies for psycopg2
    • +
    • pool: Connection pooling for psycopg2
    • +
    • psycopg1: psycopg 1.1.x compatibility module
    • +
    • tz: tzinfo implementations for psycopg2
    • +
    +
  • +
+ + +

Class Hierarchy

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/psycopg2/doc/async.txt b/psycopg2/doc/async.txt new file mode 100644 index 0000000..518d5fe --- /dev/null +++ b/psycopg2/doc/async.txt @@ -0,0 +1,67 @@ +psycopg asynchronous API +************************ + +** Important: async quaeries are not enabled for 2.0 ** + +Program code can initiate an asynchronous query by passing an 'async=1' flag +to the .execute() method. A very simple example, from the connection to the +query: + + conn = psycopg.connect(database='test') + curs = conn.cursor() + curs.execute("SEECT * from test WHERE fielda > %s", (1971,), async=1) + +From then on any query on other cursors derived from the same connection is +doomed to fail (and raise an exception) until the original cursor (the one +executing the query) complete the asynchronous operation. This can happen in +a number of different ways: + + 1) one of the .fetchXXX() methods is called, effectively blocking untill + data has been sent from the backend to the client, terminating the + query. + + 2) .cancel() is called. This method tries to abort the current query and + will block until the query is aborted or fully executed. The return + value is True if the query was successfully aborted or False if it + was executed. Query result are discarded in both cases. + + 3) .execute() is called again on the same cursor (.execute() on a + different cursor will simply raise an exception.) This waits for the + complete execution of the current query, discard any data and execute + the new one. + +Note that calling .execute() two times in a row will not abort the former +query and will temporarily go to synchronous mode until the first of the two +queries is executed. + +Cursors now have some extra methods that make them usefull during +asynchronous queries: + + .fileno() + Returns the file descriptor associated with the current connection and + make possible to use a cursor in a context where a file object would be + expected (like in a select() call.) + + .isbusy() + Returns True if the backend is still processing the query or false if + data is ready to be fetched (by one of the .fetchXXX() methods.) + +A code snippet that shows how to use the cursor object in a select() call: + + import psycopg + import select + + conn = psycopg.connect(database='test') + curs = conn.cursor() + curs.execute("SEECT * from test WHERE fielda > %s", (1971,), async=1) + + # wait for input with a maximum timeout of 5 seconds + query_ended = False + while not query_ended: + rread, rwrite, rspec = select([cursor, another_file], [], [], 5) + if not cursor.isbusy(): + query_ended = True + # manage input from other sources like other_file, etc. + print "Query Results:" + for row in cursor: + print row diff --git a/psycopg2/doc/extensions.html b/psycopg2/doc/extensions.html new file mode 100644 index 0000000..cb71200 --- /dev/null +++ b/psycopg2/doc/extensions.html @@ -0,0 +1,219 @@ + + + + + + +psycopg 2 extensions to the DBAPI 2.0 + + + +
+

psycopg 2 extensions to the DBAPI 2.0

+

This document is a short summary of the extensions built in psycopg 2.0.x over +the standard Python Database API Specification 2.0, usually called simply +DBAPI-2.0 or even PEP-249. Before reading on this document please make sure +you already know how to program in Python using a DBAPI-2.0 compliant driver: +basic concepts like opening a connection, executing queries and commiting or +rolling back a transaction will not be explained but just used.

+

Many objects and extension functions are defined in the psycopg2.extensions +module.

+
+

Connection and cursor factories

+

psycopg 2 exposes two new-style classes that can be sub-classed and expanded to +adapt them to the needs of the programmer: cursor and connection. The +connection class is usually sub-classed only to provide a . cursor is much +more interesting, because it is the class where query building, execution and +result type-casting into Python variables happens.

+ + +
+
+

Setting transaction isolation levels

+

psycopg2 connection objects hold informations about the PostgreSQL transaction +isolation level. The current transaction level can be read from the +.isolation_level attribute. The default isolation level is READ +COMMITTED. A different isolation level con be set through the +.set_isolation_level() method. The level can be set to one of the following +constants, defined in psycopg2.extensions:

+
+
ISOLATION_LEVEL_AUTOCOMMIT
+
No transaction is started when command are issued and no +.commit()/.rollback() is required. Some PostgreSQL command such as +CREATE DATABASE can't run into a transaction: to run such command use +.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT).
+
`ISOLATION_LEVEL_READ_COMMITTED`
+
+

System Message: ERROR/3 (../doc/extensions.rst, line 54); backlink

+Can't find 'ISOLATION_LEVEL_READ_COMMITTED' in any provided module.
+

This is the default value. A new transaction is started at the first +.execute() command on a cursor and at each new .execute() after a +.commit() or a .rollback(). The transaction runs in the PostgreSQL +READ COMMITTED isolation level.

+
+
ISOLATION_LEVEL_SERIALIZABLE
+
Transactions are run at a SERIALIZABLE isolation level.
+
+
+
+

Adaptation of Python values to SQL types

+

psycopg2 casts Python variables to SQL literals by type. Standard Python types +are already adapted to the proper SQL literal.

+

Example: the Python function:

+
+curs.execute("""INSERT INTO atable (anint, adate, astring)
+                 VALUES (%s, %s, %s)""",
+             (10, datetime.date(2005, 11, 18), "O'Reilly"))
+
+

is converted into the SQL command:

+
+INSERT INTO atable (anint, adate, astring)
+ VALUES (10, '2005-11-18', 'O''Reilly');
+
+

Named arguments are supported too with %(name)s placeholders. Notice that:

+
+
    +
  • The Python string operator % is not used: the .execute() function +accepts the values tuple or dictionary as second parameter.
  • +
  • The variables placeholder must always be a %s, even if a different +placeholder (such as a %d for an integer) may look more appropriate.
  • +
  • For positional variables binding, the second argument must always be a +tuple, even if it contains a single variable.
  • +
  • Only variable values should be bound via this method: it shouldn't be used +to set table or field names. For these elements, ordinary string formatting +should be used before running .execute().
  • +
+
+
+

Adapting new types

+

Any Python class or type can be adapted to an SQL string. Adaptation mechanism +is similar to the Object Adaptation proposed in the PEP-246 and is exposed +by the adapt() function.

+

psycopg2 .execute() method adapts its vars arguments to the ISQLQuote +protocol. Objects that conform to this protocol expose a getquoted() method +returning the SQL representation of the object as a string.

+

The easiest way to adapt an object to an SQL string is to register an adapter +function via the register_adapter() function. The adapter function must take +the value to be adapted as argument and return a conform object. A convenient +object is the AsIs wrapper, whose getquoted() result is simply the +str()ingification of the wrapped object.

+

Example: mapping of a Point class into the point PostgreSQL geometric +type:

+
+from psycopg2.extensions import adapt, register_adapter, AsIs
+
+class Point(object):
+    def __init__(self, x=0.0, y=0.0):
+        self.x = x
+        self.y = y
+
+def adapt_point(point):
+    return AsIs("'(%s,%s)'" % (adapt(point.x), adapt(point.y)))
+    
+register_adapter(Point, adapt_point)
+
+curs.execute("INSERT INTO atable (apoint) VALUES (%s)", 
+             (Point(1.23, 4.56),))
+
+

The above function call results in the SQL command:

+
+INSERT INTO atable (apoint) VALUES ((1.23, 4.56));
+
+
+
+
+

Type casting of SQL types into Python values

+

PostgreSQL objects read from the database can be adapted to Python objects +through an user-defined adapting function. An adapter function takes two +argments: the object string representation as returned by PostgreSQL and the +cursor currently being read, and should return a new Python object. For +example, the following function parses a PostgreSQL point into the +previously defined Point class:

+
+def cast_point(value, curs):
+    if value is not None:
+            # Convert from (f1, f2) syntax using a regular expression.
+        m = re.match("\((.*),(.*)\)", value) 
+        if m:
+            return Point(float(m.group(1)), float(m.group(2)))
+
+

To create a mapping from the PostgreSQL type (either standard or user-defined), +its oid must be known. It can be retrieved either by the second column of +the cursor description:

+
+curs.execute("SELECT NULL::point")
+point_oid = curs.description[0][1]   # usually returns 600
+
+

or by querying the system catalogs for the type name and namespace (the +namespace for system objects is pg_catalog):

+
+curs.execute("""
+    SELECT pg_type.oid
+      FROM pg_type JOIN pg_namespace
+             ON typnamespace = pg_namespace.oid
+     WHERE typname = %(typename)s
+       AND nspname = %(namespace)s""",
+            {'typename': 'point', 'namespace': 'pg_catalog'})
+    
+point_oid = curs.fetchone()[0]
+
+

After you know the object oid, you must can and register the new type:

+
+POINT = psycopg2.extensions.new_type((point_oid,), "POINT", cast_point)
+psycopg2.extensions.register_type(POINT)
+
+

The new_type() function binds the object oids (more than one can be +specified) to the adapter function. register_type() completes the spell. +Conversion is automatically performed when a column whose type is a registered +oid is read:

+
+curs.execute("SELECT '(10.2,20.3)'::point")
+point = curs.fetchone()[0]
+print type(point), point.x, point.y
+# Prints: "<class '__main__.Point'> 10.2 20.3"
+
+
+ + +
+

Using COPY TO and COPY FROM

+

psycopg2 cursor object provides an interface to the efficient PostgreSQL +COPY command to move data from files to tables and back.

+

The .copy_to(file, table) method writes the content of the table +named table to the file-like object file. file must have a +write() method.

+

The .copy_from(file, table) reads data from the file-like object +file appending them to the table named table. file must have both +read() and readline() method.

+

Both methods accept two optional arguments: sep (defaulting to a tab) is +the columns separator and null (defaulting to \N) represents NULL +values in the file.

+
+
+

PostgreSQL status message and executed query

+

cursor objects have two special fields related to the last executed query:

+
+
    +
  • .query is the textual representation (str or unicode, depending on what +was passed to .execute() as first argument) of the query after argument +binding and mogrification has been applied. To put it another way, .query +is the exact query that was sent to the PostgreSQL backend.
  • +
  • .statusmessage is the status message that the backend sent upon query +execution. It usually contains the basic type of the query (SELECT, +INSERT, UPDATE, ...) and some additional information like the number of +rows updated and so on. Refer to the PostgreSQL manual for more +information.
  • +
+
+
+
+ + diff --git a/psycopg2/doc/extensions.rst b/psycopg2/doc/extensions.rst new file mode 100644 index 0000000..3bdc680 --- /dev/null +++ b/psycopg2/doc/extensions.rst @@ -0,0 +1,260 @@ +======================================= + psycopg 2 extensions to the DBAPI 2.0 +======================================= + +This document is a short summary of the extensions built in psycopg 2.0.x over +the standard `Python Database API Specification 2.0`__, usually called simply +DBAPI-2.0 or even PEP-249. Before reading on this document please make sure +you already know how to program in Python using a DBAPI-2.0 compliant driver: +basic concepts like opening a connection, executing queries and commiting or +rolling back a transaction will not be explained but just used. + +.. __: http://www.python.org/peps/pep-0249.html + +Many objects and extension functions are defined in the `psycopg2.extensions` +module. + + +Connection and cursor factories +=============================== + +psycopg 2 exposes two new-style classes that can be sub-classed and expanded to +adapt them to the needs of the programmer: `cursor` and `connection`. The +`connection` class is usually sub-classed only to provide an easy way to create +customized cursors but other uses are possible. `cursor` is much more +interesting, because it is the class where query building, execution and result +type-casting into Python variables happens. + +An example of cursor subclass performing logging is:: + + import psycopg2 + import psycopg2.extensions + import logging + + class LoggingCursor(psycopg2.extensions.cursor): + def execute(self, sql, args=None): + logger = logging.getLogger('sql_debug') + logger.info(self.mogrify(sql, args)) + + try: + psycopg2.extensions.cursor.execute(self, sql, args) + except Exception, exc: + logger.error("%s: %s" % (exc.__class__.__name__, exc)) + raise + + conn = psycopg2.connect(DSN) + curs = conn.cursor(cursor_factory=LoggingCursor) + curs.execute("INSERT INTO mytable VALUES (%s, %s, %s);", + (10, 20, 30)) + + +Row factories +------------- + +tzinfo factories +---------------- + + +Setting transaction isolation levels +==================================== + +psycopg2 connection objects hold informations about the PostgreSQL `transaction +isolation level`_. The current transaction level can be read from the +`.isolation_level` attribute. The default isolation level is ``READ +COMMITTED``. A different isolation level con be set through the +`.set_isolation_level()` method. The level can be set to one of the following +constants, defined in `psycopg2.extensions`: + +`ISOLATION_LEVEL_AUTOCOMMIT` + No transaction is started when command are issued and no + `.commit()`/`.rollback()` is required. Some PostgreSQL command such as + ``CREATE DATABASE`` can't run into a transaction: to run such command use + `.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)`. + +`ISOLATION_LEVEL_READ_COMMITTED` + This is the default value. A new transaction is started at the first + `.execute()` command on a cursor and at each new `.execute()` after a + `.commit()` or a `.rollback()`. The transaction runs in the PostgreSQL + ``READ COMMITTED`` isolation level. + +`ISOLATION_LEVEL_SERIALIZABLE` + Transactions are run at a ``SERIALIZABLE`` isolation level. + + +.. _transaction isolation level: + http://www.postgresql.org/docs/8.1/static/transaction-iso.html + + +Adaptation of Python values to SQL types +======================================== + +psycopg2 casts Python variables to SQL literals by type. Standard Python types +are already adapted to the proper SQL literal. + +Example: the Python function:: + + curs.execute("""INSERT INTO atable (anint, adate, astring) + VALUES (%s, %s, %s)""", + (10, datetime.date(2005, 11, 18), "O'Reilly")) + +is converted into the SQL command:: + + INSERT INTO atable (anint, adate, astring) + VALUES (10, '2005-11-18', 'O''Reilly'); + +Named arguments are supported too with ``%(name)s`` placeholders. Notice that: + + - The Python string operator ``%`` is not used: the `.execute()` function + accepts the values tuple or dictionary as second parameter. + + - The variables placeholder must always be a ``%s``, even if a different + placeholder (such as a ``%d`` for an integer) may look more appropriate. + + - For positional variables binding, the second argument must always be a + tuple, even if it contains a single variable. + + - Only variable values should be bound via this method: it shouldn't be used + to set table or field names. For these elements, ordinary string formatting + should be used before running `.execute()`. + + +Adapting new types +------------------ + +Any Python class or type can be adapted to an SQL string. Adaptation mechanism +is similar to the Object Adaptation proposed in the `PEP-246`_ and is exposed +by the `adapt()` function. + +psycopg2 `.execute()` method adapts its ``vars`` arguments to the `ISQLQuote` +protocol. Objects that conform to this protocol expose a ``getquoted()`` method +returning the SQL representation of the object as a string. + +The easiest way to adapt an object to an SQL string is to register an adapter +function via the `register_adapter()` function. The adapter function must take +the value to be adapted as argument and return a conform object. A convenient +object is the `AsIs` wrapper, whose ``getquoted()`` result is simply the +``str()``\ ingification of the wrapped object. + +Example: mapping of a ``Point`` class into the ``point`` PostgreSQL geometric +type:: + + from psycopg2.extensions import adapt, register_adapter, AsIs + + class Point(object): + def __init__(self, x=0.0, y=0.0): + self.x = x + self.y = y + + def adapt_point(point): + return AsIs("'(%s,%s)'" % (adapt(point.x), adapt(point.y))) + + register_adapter(Point, adapt_point) + + curs.execute("INSERT INTO atable (apoint) VALUES (%s)", + (Point(1.23, 4.56),)) + +The above function call results in the SQL command:: + + INSERT INTO atable (apoint) VALUES ((1.23, 4.56)); + + +.. _PEP-246: http://www.python.org/peps/pep-0246.html + + +Type casting of SQL types into Python values +============================================ + +PostgreSQL objects read from the database can be adapted to Python objects +through an user-defined adapting function. An adapter function takes two +argments: the object string representation as returned by PostgreSQL and the +cursor currently being read, and should return a new Python object. For +example, the following function parses a PostgreSQL ``point`` into the +previously defined ``Point`` class:: + + def cast_point(value, curs): + if value is not None: + # Convert from (f1, f2) syntax using a regular expression. + m = re.match("\((.*),(.*)\)", value) + if m: + return Point(float(m.group(1)), float(m.group(2))) + +To create a mapping from the PostgreSQL type (either standard or user-defined), +its ``oid`` must be known. It can be retrieved either by the second column of +the cursor description:: + + curs.execute("SELECT NULL::point") + point_oid = curs.description[0][1] # usually returns 600 + +or by querying the system catalogs for the type name and namespace (the +namespace for system objects is ``pg_catalog``):: + + curs.execute(""" + SELECT pg_type.oid + FROM pg_type JOIN pg_namespace + ON typnamespace = pg_namespace.oid + WHERE typname = %(typename)s + AND nspname = %(namespace)s""", + {'typename': 'point', 'namespace': 'pg_catalog'}) + + point_oid = curs.fetchone()[0] + +After you know the object ``oid``, you must can and register the new type:: + + POINT = psycopg2.extensions.new_type((point_oid,), "POINT", cast_point) + psycopg2.extensions.register_type(POINT) + +The `new_type()` function binds the object oids (more than one can be +specified) to the adapter function. `register_type()` completes the spell. +Conversion is automatically performed when a column whose type is a registered +``oid`` is read:: + + curs.execute("SELECT '(10.2,20.3)'::point") + point = curs.fetchone()[0] + print type(point), point.x, point.y + # Prints: " 10.2 20.3" + + +Working with times and dates +============================ + + +Receiving NOTIFYs +================= + + +Using COPY TO and COPY FROM +=========================== + +psycopg2 `cursor` object provides an interface to the efficient `PostgreSQL +COPY command`__ to move data from files to tables and back. + +The `.copy_to(file, table)` method writes the content of the table +named ``table`` *to* the file-like object ``file``. ``file`` must have a +``write()`` method. + +The `.copy_from(file, table)` reads data *from* the file-like object +``file`` appending them to the table named ``table``. ``file`` must have both +``read()`` and ``readline()`` method. + +Both methods accept two optional arguments: ``sep`` (defaulting to a tab) is +the columns separator and ``null`` (defaulting to ``\N``) represents ``NULL`` +values in the file. + +.. __: http://www.postgresql.org/docs/8.1/static/sql-copy.html + + +PostgreSQL status message and executed query +============================================ + +`cursor` objects have two special fields related to the last executed query: + + - `.query` is the textual representation (str or unicode, depending on what + was passed to `.execute()` as first argument) of the query *after* argument + binding and mogrification has been applied. To put it another way, `.query` + is the *exact* query that was sent to the PostgreSQL backend. + + - `.statusmessage` is the status message that the backend sent upon query + execution. It usually contains the basic type of the query (SELECT, + INSERT, UPDATE, ...) and some additional information like the number of + rows updated and so on. Refer to the PostgreSQL manual for more + information. diff --git a/psycopg2/examples/binary.py b/psycopg2/examples/binary.py new file mode 100644 index 0000000..eaa8f1e --- /dev/null +++ b/psycopg2/examples/binary.py @@ -0,0 +1,89 @@ +# binary.py - working with binary data +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_binary (id int4, name text, img bytea)") +except: + conn.rollback() + curs.execute("DROP TABLE test_binary") + curs.execute("CREATE TABLE test_binary (id int4, name text, img bytea)") +conn.commit() + +# first we try two inserts, one with an explicit Binary call and the other +# using a buffer on a file object. + +data1 = {'id':1, 'name':'somehackers.jpg', + 'img':psycopg2.Binary(open('somehackers.jpg').read())} +data2 = {'id':2, 'name':'whereareyou.jpg', + 'img':buffer(open('whereareyou.jpg').read())} + +curs.execute("""INSERT INTO test_binary + VALUES (%(id)s, %(name)s, %(img)s)""", data1) +curs.execute("""INSERT INTO test_binary + VALUES (%(id)s, %(name)s, %(img)s)""", data2) + +# now we try to extract the images as simple text strings + +print "Extracting the images as strings..." +curs.execute("SELECT * FROM test_binary") + +for row in curs.fetchall(): + name, ext = row[1].split('.') + new_name = name + '_S.' + ext + print " writing %s to %s ..." % (name+'.'+ext, new_name), + open(new_name, 'wb').write(row[2]) + print "done" + print " python type of image data is", type(row[2]) + +# extract exactly the same data but using a binary cursor + +print "Extracting the images using a binary cursor:" + +curs.execute("""DECLARE zot CURSOR FOR + SELECT img, name FROM test_binary FOR READ ONLY""") +curs.execute("""FETCH ALL FROM zot""") + +for row in curs.fetchall(): + name, ext = row[1].split('.') + new_name = name + '_B.' + ext + print " writing %s to %s ..." % (name+'.'+ext, new_name), + open(new_name, 'wb').write(row[0]) + print "done" + print " python type of image data is", type(row[0]) + +# this rollback is requires because we can't drop a table with a binary cusor +# declared and still open +conn.rollback() + +curs.execute("DROP TABLE test_binary") +conn.commit() + +print "\nNow try to load the new images, to check it worked!" diff --git a/psycopg2/examples/copy_from.py b/psycopg2/examples/copy_from.py new file mode 100644 index 0000000..edd3294 --- /dev/null +++ b/psycopg2/examples/copy_from.py @@ -0,0 +1,178 @@ +# copy_from.py -- example about copy_from +# +# Copyright (C) 2002 Tom Jenkins +# Copyright (C) 2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import os +import StringIO +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +except: + conn.rollback() + curs.execute("DROP TABLE test_copy") + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +conn.commit() + +# copy_from with default arguments, from open file + +io = open('copy_from.txt', 'wr') +data = ['Tom\tJenkins\t37\n', + 'Madonna\t\N\t45\n', + 'Federico\tDi Gregorio\t\N\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy') +print "1) Copy %d records from file object " % len(data) + \ + "using defaults (sep: \\t and null = \\N)" +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# copy_from using custom separator, from open file + +io = open('copy_from.txt', 'wr') +data = ['Tom:Jenkins:37\n', + 'Madonna:\N:45\n', + 'Federico:Di Gregorio:\N\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy', ':') +print "2) Copy %d records from file object using sep = :" % len(data) +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# copy_from using custom null identifier, from open file + +io = open('copy_from.txt', 'wr') +data = ['Tom\tJenkins\t37\n', + 'Madonna\tNULL\t45\n', + 'Federico\tDi Gregorio\tNULL\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy', null='NULL') +print "3) Copy %d records from file object using null = NULL" % len(data) +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select using cursor returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# copy_from using custom separator and null identifier + +io = open('copy_from.txt', 'wr') +data = ['Tom:Jenkins:37\n', 'Madonna:NULL:45\n', 'Federico:Di Gregorio:NULL\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy', ':', 'NULL') +print "4) Copy %d records from file object " % len(data) + \ + "using sep = : and null = NULL" +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select using cursor returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# anything can be used as a file if it has .read() and .readline() methods + +data = StringIO.StringIO() +data.write('\n'.join(['Tom\tJenkins\t37', + 'Madonna\t\N\t45', + 'Federico\tDi Gregorio\t\N'])) +data.seek(0) + +curs.copy_from(data, 'test_copy') +print "5) Copy 3 records from StringIO object using defaults" + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select using cursor returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# simple error test + +print "6) About to raise an error" +data = StringIO.StringIO() +data.write('\n'.join(['Tom\tJenkins\t37', + 'Madonna\t\N\t45', + 'Federico\tDi Gregorio\taaa'])) +data.seek(0) + +try: + curs.copy_from(data, 'test_copy') +except StandardError, err: + conn.rollback() + print " Catched error (as expected):\n", err + +conn.rollback() + +curs.execute("DROP TABLE test_copy") +os.unlink('copy_from.txt') +conn.commit() + + + diff --git a/psycopg2/examples/copy_to.py b/psycopg2/examples/copy_to.py new file mode 100644 index 0000000..5570fbc --- /dev/null +++ b/psycopg2/examples/copy_to.py @@ -0,0 +1,104 @@ +# copy_to.py -- example about copy_to +# +# Copyright (C) 2002 Tom Jenkins +# Copyright (C) 2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import os +import StringIO +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +except: + conn.rollback() + curs.execute("DROP TABLE test_copy") + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +conn.commit() + +# demostrate copy_to functionality +data = [('Tom', 'Jenkins', '37'), + ('Madonna', None, '45'), + ('Federico', 'Di Gregorio', None)] +query = "INSERT INTO test_copy VALUES (%s, %s, %s)" +curs.executemany(query, data) +conn.commit() + +# copy_to using defaults +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy') +print "1) Copy %d records into file object using defaults: " % len (data) + \ + "sep = \\t and null = \\N" +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +# copy_to using custom separator +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy', ':') +print "2) Copy %d records into file object using sep = :" % len(data) +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +# copy_to using custom null identifier +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy', null='NULL') +print "3) Copy %d records into file object using null = NULL" % len(data) +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +# copy_to using custom separator and null identifier +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy', ':', 'NULL') +print "4) Copy %d records into file object using sep = : and null ) NULL" % \ + len(data) +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +curs.execute("DROP TABLE test_copy") +os.unlink('copy_to.txt') +conn.commit() diff --git a/psycopg2/examples/cursor.py b/psycopg2/examples/cursor.py new file mode 100644 index 0000000..54cb5e7 --- /dev/null +++ b/psycopg2/examples/cursor.py @@ -0,0 +1,63 @@ +# cursor.py - how to subclass the cursor type +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extensions + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dsn:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + + +class NoDataError(psycopg2.ProgrammingError): + """Exception that will be raised by our cursor.""" + pass + +class Cursor(psycopg2.extensions.cursor): + """A custom cursor.""" + + def fetchone(self): + """Like fetchone but raise an exception if no data is available. + + Note that to have .fetchmany() and .fetchall() to raise the same + exception we'll have to override them too; even if internally psycopg + uses the same function to fetch rows, the code path from Python is + different. + """ + d = psycopg2.extensions.cursor.fetchone(self) + if d is None: + raise NoDataError("no more data") + return d + +curs = conn.cursor(cursor_factory=Cursor) +curs.execute("SELECT 1 AS foo") +print "Result of fetchone():", curs.fetchone() + +# now let's raise the exception +try: + curs.fetchone() +except NoDataError, err: + print "Exception caugth:", err + +conn.rollback() diff --git a/psycopg2/examples/dialtone.py b/psycopg2/examples/dialtone.py new file mode 100644 index 0000000..3a55686 --- /dev/null +++ b/psycopg2/examples/dialtone.py @@ -0,0 +1,144 @@ +""" +This example/recipe has been contributed by Valentino Volonghi (dialtone) + +Mapping arbitrary objects to a PostgreSQL database with psycopg2 + +- Problem + +You need to store arbitrary objects in a PostgreSQL database without being +intrusive for your classes (don't want inheritance from an 'Item' or +'Persistent' object). + +- Solution +""" + +from datetime import datetime + +import psycopg2 +from psycopg2.extensions import adapt, register_adapter + +try: + sorted() +except: + def sorted(seq): + seq.sort() + return seq + +# Here is the adapter for every object that we may ever need to +# insert in the database. It receives the original object and does +# its job on that instance + +class ObjectMapper(object): + def __init__(self, orig, curs=None): + self.orig = orig + self.tmp = {} + self.items, self.fields = self._gatherState() + + def _gatherState(self): + adaptee_name = self.orig.__class__.__name__ + fields = sorted([(field, getattr(self.orig, field)) + for field in persistent_fields[adaptee_name]]) + items = [] + for item, value in fields: + items.append(item) + return items, fields + + def getTableName(self): + return self.orig.__class__.__name__ + + def getMappedValues(self): + tmp = [] + for i in self.items: + tmp.append("%%(%s)s"%i) + return ", ".join(tmp) + + def getValuesDict(self): + return dict(self.fields) + + def getFields(self): + return self.items + + def generateInsert(self): + qry = "INSERT INTO" + qry += " " + self.getTableName() + " (" + qry += ", ".join(self.getFields()) + ") VALUES (" + qry += self.getMappedValues() + ")" + return qry, self.getValuesDict() + +# Here are the objects +class Album(object): + id = 0 + def __init__(self): + self.creation_time = datetime.now() + self.album_id = self.id + Album.id = Album.id + 1 + self.binary_data = buffer('12312312312121') + +class Order(object): + id = 0 + def __init__(self): + self.items = ['rice','chocolate'] + self.price = 34 + self.order_id = self.id + Order.id = Order.id + 1 + +register_adapter(Album, ObjectMapper) +register_adapter(Order, ObjectMapper) + +# Describe what is needed to save on each object +# This is actually just configuration, you can use xml with a parser if you +# like to have plenty of wasted CPU cycles ;P. + +persistent_fields = {'Album': ['album_id', 'creation_time', 'binary_data'], + 'Order': ['order_id', 'items', 'price'] + } + +print adapt(Album()).generateInsert() +print adapt(Album()).generateInsert() +print adapt(Album()).generateInsert() +print adapt(Order()).generateInsert() +print adapt(Order()).generateInsert() +print adapt(Order()).generateInsert() + +""" +- Discussion + +Psycopg 2 has a great new feature: adaptation. The big thing about +adaptation is that it enable the programmer to glue most of the +code out there without many difficulties. + +This recipe tries to focus the attention on a way to generate SQL queries to +insert completely new objects inside a database. As you can see objects do +not know anything about the code that is handling them. We specify all the +fields that we need for each object through the persistent_fields dict. + +The most important lines of this recipe are: + register_adapter(Album, ObjectMapper) + register_adapter(Order, ObjectMapper) + +In these line we notify the system that when we call adapt with an Album instance +as an argument we want it to istantiate ObjectMapper passing the Album instance +as argument (self.orig in the ObjectMapper class). + +The output is something like this (for each call to generateInsert): + +('INSERT INTO Album (album_id, binary_data, creation_time) VALUES + (%(album_id)s, %(binary_data)s, %(creation_time)s)', + + {'binary_data': , + 'creation_time': datetime.datetime(2004, 9, 10, 20, 48, 29, 633728), + 'album_id': 1} +) + +This is a tuple of {SQL_QUERY, FILLING_DICT}, and all the quoting/converting +stuff (from python's datetime to postgres s and from python's buffer to +postgres' blob) is handled with the same adaptation process hunder the hood +by psycopg2. + +At last, just notice that ObjectMapper is working for both Album and Order +instances without any glitches at all, and both classes could have easily been +coming from closed source libraries or C coded ones (which are not easily +modified), whereas a common pattern in todays ORMs or OODBs is to provide +a basic 'Persistent' object that already knows how to store itself in the +database. +""" diff --git a/psycopg2/examples/dict.py b/psycopg2/examples/dict.py new file mode 100644 index 0000000..37dc74a --- /dev/null +++ b/psycopg2/examples/dict.py @@ -0,0 +1,45 @@ +# dict.py - using DictCUrsor/DictRow +# +# Copyright (C) 2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extras + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dsn:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + + +curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) +curs.execute("SELECT 1 AS foo, 'cip' AS bar, date(now()) as zot") + +data = curs.fetchone() +print "Some data accessed both as tuple and dict:" +print " ", data['foo'], data['bar'], data['zot'] +print " ", data[0], data[1], data[2] + +# execute another query and demostrate we can still access the row +curs.execute("SELECT 2 AS foo") +print "Some more data accessed both as tuple and dict:" +print " ", data['foo'], data['bar'], data['zot'] +print " ", data[0], data[1], data[2] diff --git a/psycopg2/examples/dt.py b/psycopg2/examples/dt.py new file mode 100644 index 0000000..76f0c78 --- /dev/null +++ b/psycopg2/examples/dt.py @@ -0,0 +1,99 @@ +# datetime.py - example of using date and time types +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 +import mx.DateTime +import datetime + +from psycopg2.extensions import adapt + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("""CREATE TABLE test_dt ( + k int4, d date, t time, dt timestamp, z interval)""") +except: + conn.rollback() + curs.execute("DROP TABLE test_dt") + curs.execute("""CREATE TABLE test_dt ( + k int4, d date, t time, dt timestamp, z interval)""") +conn.commit() + +# build and insert some data using mx.DateTime +mx1 = ( + 1, + mx.DateTime.Date(2004, 10, 19), + mx.DateTime.Time(0, 11, 17.015), + mx.DateTime.Timestamp(2004, 10, 19, 0, 11, 17.5), + mx.DateTime.DateTimeDelta(13, 15, 17, 59.9)) + +from psycopg2.extensions import adapt +import psycopg2.extras +print adapt(mx1) + +print "Inserting mx.DateTime values..." +curs.execute("INSERT INTO test_dt VALUES (%s, %s, %s, %s, %s)", mx1) + +# build and insert some values using the datetime adapters +dt1 = ( + 2, + datetime.date(2004, 10, 19), + datetime.time(0, 11, 17, 15000), + datetime.datetime(2004, 10, 19, 0, 11, 17, 500000), + datetime.timedelta(13, 15*3600+17*60+59, 900000)) + +print "Inserting Python datetime values..." +curs.execute("INSERT INTO test_dt VALUES (%s, %s, %s, %s, %s)", dt1) + +# now extract the row from database and print them +print "Extracting values inserted with mx.DateTime wrappers:" +curs.execute("SELECT d, t, dt, z FROM test_dt WHERE k = 1") +for n, x in zip(mx1[1:], curs.fetchone()): + try: + # this will work only is psycopg has been compiled with datetime + # as the default typecaster for date/time values + s = repr(n) + "\n -> " + str(adapt(n)) + \ + "\n -> " + repr(x) + "\n -> " + x.isoformat() + except: + s = repr(n) + "\n -> " + str(adapt(n)) + \ + "\n -> " + repr(x) + "\n -> " + str(x) + print s +print + +print "Extracting values inserted with Python datetime wrappers:" +curs.execute("SELECT d, t, dt, z FROM test_dt WHERE k = 2") +for n, x in zip(dt1[1:], curs.fetchone()): + try: + # this will work only is psycopg has been compiled with datetime + # as the default typecaster for date/time values + s = repr(n) + "\n -> " + repr(x) + "\n -> " + x.isoformat() + except: + s = repr(n) + "\n -> " + repr(x) + "\n -> " + str(x) + print s +print + +curs.execute("DROP TABLE test_dt") +conn.commit() diff --git a/psycopg2/examples/encoding.py b/psycopg2/examples/encoding.py new file mode 100644 index 0000000..da57bcf --- /dev/null +++ b/psycopg2/examples/encoding.py @@ -0,0 +1,105 @@ +# enkoding.py - show to change client enkoding (and test it works) +# -*- encoding: utf8 -*- +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extensions + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Initial encoding for this connection is", conn.encoding + +print "\n** This example is supposed to be run in a UNICODE terminal! **\n" + +print "Available encodings:" +encs = psycopg2.extensions.encodings.items() +encs.sort() +for a, b in encs: + print " ", a, "<->", b + +print "Using STRING typecaster" +print "Setting backend encoding to LATIN1 and executing queries:" +conn.set_client_encoding('LATIN1') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", ('àèìòù',)) +x = curs.fetchone()[0] +print " ->", unicode(x, 'latin-1').encode('utf-8'), type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", unicode(x, 'latin-1').encode('utf-8'), type(x) + +print "Setting backend encoding to UTF8 and executing queries:" +conn.set_client_encoding('UNICODE') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù'.encode('utf-8'),)) +x = curs.fetchone()[0] +print " ->", x, type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x, type(x) + +print "Using UNICODE typecaster" +psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) + +print "Setting backend encoding to LATIN1 and executing queries:" +conn.set_client_encoding('LATIN1') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", ('àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) + +print "Setting backend encoding to UTF8 and executing queries:" +conn.set_client_encoding('UNICODE') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù'.encode('utf-8'),)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) + +print "Executing full UNICODE queries" + +print "Setting backend encoding to LATIN1 and executing queries:" +conn.set_client_encoding('LATIN1') +curs = conn.cursor() +curs.execute(u"SELECT %s::TEXT AS foo", ('àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute(u"SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) + +print "Setting backend encoding to UTF8 and executing queries:" +conn.set_client_encoding('UNICODE') +curs = conn.cursor() +curs.execute(u"SELECT %s::TEXT AS foo", (u'àèìòù'.encode('utf-8'),)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute(u"SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) diff --git a/psycopg2/examples/fetch.py b/psycopg2/examples/fetch.py new file mode 100644 index 0000000..dab0a41 --- /dev/null +++ b/psycopg2/examples/fetch.py @@ -0,0 +1,81 @@ +# fetch.py -- example about declaring cursors +# +# Copyright (C) 2001-2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_fetch (val int4)") +except: + conn.rollback() + curs.execute("DROP TABLE test_fetch") + curs.execute("CREATE TABLE test_fetch (val int4)") +conn.commit() + +# we use this function to format the output + +def flatten(l): + """Flattens list of tuples l.""" + return map(lambda x: x[0], l) + +# insert 20 rows in the table + +for i in range(20): + curs.execute("INSERT INTO test_fetch VALUES(%s)", (i,)) +conn.commit() + +# does some nice tricks with the transaction and postgres cursors +# (remember to always commit or rollback before a DECLARE) +# +# we don't need to DECLARE ourselves, psycopg now support named +# cursors (but we leave the code here, comments, as an example of +# what psycopg is doing under the hood) +# +#curs.execute("DECLARE crs CURSOR FOR SELECT * FROM test_fetch") +#curs.execute("FETCH 10 FROM crs") +#print "First 10 rows:", flatten(curs.fetchall()) +#curs.execute("MOVE -5 FROM crs") +#print "Moved back cursor by 5 rows (to row 5.)" +#curs.execute("FETCH 10 FROM crs") +#print "Another 10 rows:", flatten(curs.fetchall()) +#curs.execute("FETCH 10 FROM crs") +#print "The remaining rows:", flatten(curs.fetchall()) + +ncurs = conn.cursor("crs") +ncurs.execute("SELECT * FROM test_fetch") +print "First 10 rows:", flatten(ncurs.fetchmany(10)) +ncurs.scroll(-5) +print "Moved back cursor by 5 rows (to row 5.)" +print "Another 10 rows:", flatten(ncurs.fetchmany(10)) +print "Another one:", list(ncurs.fetchone()) +print "The remaining rows:", flatten(ncurs.fetchall()) +conn.rollback() + +curs.execute("DROP TABLE test_fetch") +conn.commit() diff --git a/psycopg2/examples/lastrowid.py b/psycopg2/examples/lastrowid.py new file mode 100644 index 0000000..205ef6c --- /dev/null +++ b/psycopg2/examples/lastrowid.py @@ -0,0 +1,59 @@ +# lastrowid.py - example of using .lastrowid attribute +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys, psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("CREATE TABLE test_oid (name text, surname text)") +except: + conn.rollback() + curs.execute("DROP TABLE test_oid") + curs.execute("CREATE TABLE test_oid (name text, surname text)") +conn.commit() + +data = ({'name':'Federico', 'surname':'Di Gregorio'}, + {'name':'Pierluigi', 'surname':'Di Nunzio'}) + +curs.execute("""INSERT INTO test_oid + VALUES (%(name)s, %(surname)s)""", data[0]) + +foid = curs.lastrowid +print "Oid for %(name)s %(surname)s" % data[0], "is", foid + +curs.execute("""INSERT INTO test_oid + VALUES (%(name)s, %(surname)s)""", data[1]) +moid = curs.lastrowid +print "Oid for %(name)s %(surname)s" % data[1], "is", moid + +curs.execute("SELECT * FROM test_oid WHERE oid = %s", (foid,)) +print "Oid", foid, "selected %s %s" % curs.fetchone() + +curs.execute("SELECT * FROM test_oid WHERE oid = %s", (moid,)) +print "Oid", moid, "selected %s %s" % curs.fetchone() + +curs.execute("DROP TABLE test_oid") +conn.commit() diff --git a/psycopg2/examples/mogrify.py b/psycopg2/examples/mogrify.py new file mode 100644 index 0000000..480c491 --- /dev/null +++ b/psycopg2/examples/mogrify.py @@ -0,0 +1,47 @@ +# mogrify.py - test all possible simple type mogrifications +# -*- encoding: latin1 -*- +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys, psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN + +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +curs.execute("SELECT %(foo)s AS foo", {'foo':'bar'}) +curs.execute("SELECT %(foo)s AS foo", {'foo':None}) +curs.execute("SELECT %(foo)s AS foo", {'foo':True}) +curs.execute("SELECT %(foo)s AS foo", {'foo':42}) +curs.execute("SELECT %(foo)s AS foo", {'foo':u'yatt�!'}) +curs.execute("SELECT %(foo)s AS foo", {'foo':u'bar'}) + +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':'bar'}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':None}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':True}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':42}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':u'yatt�!'}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':u'bar'}) + +conn.rollback() diff --git a/psycopg2/examples/myfirstrecipe.py b/psycopg2/examples/myfirstrecipe.py new file mode 100644 index 0000000..4ddc65e --- /dev/null +++ b/psycopg2/examples/myfirstrecipe.py @@ -0,0 +1,122 @@ +""" +Using a tuple as a bound variable in "SELECT ... IN (...)" clauses +in PostgreSQL using psycopg 2 + +Some time ago someone asked on the psycopg mailing list how to have a +bound variable expand to the right SQL for an SELECT IN clause: + + SELECT * FROM atable WHERE afield IN (value1, value2, value3) + +with the values to be used in the IN clause to be passed to the cursor +.execute() method in a tuple as a bound variable, i.e.: + + in_values = ("value1", "value2", "value3") + curs.execute("SELECT ... IN %s", (in_values,)) + +psycopg 1 does support typecasting from Python to PostgreSQL (and back) +only for simple types and this problem has no elegant solution (short or +writing a wrapper class returning the pre-quoted text in an __str__ +method. + +But psycopg 2 offers a simple and elegant solution by partially +implementing the Object Adaptation from PEP 246. psycopg 2 (still in +beta and currently labeled as 1.99.9) moves the type-casting logic into +external adapters and a somehow broken adapt() function. + +While the original adapt() takes 3 arguments, psycopg's one only takes +1: the bound variable to be adapted. The result is an object supporting +a not-yet well defined protocol that we can call IPsycopgSQLQuote: + + class IPsycopgSQLQuote: + + def getquoted(self): + "Returns a quoted string representing the bound variable." + + def getbinary(self): + "Returns a binary quoted string representing the bound variable." + + def getbuffer(self): + "Returns the wrapped object itself." + + __str__ = getquoted + +Then one of the functions (usually .getquoted()) is called by psycopg at +the right time to obtain the right, sql-quoted representation for the +corresponding bound variable. + +The nice part is that the default, built-in adapters, derived from +psycopg 1 tyecasting code can be overridden by the programmer, simply +replacing them in the psycopg.extensions.adapters dictionary. + +Then the solution to the original problem is now obvious: write an +adapter that adapts tuple objects into the right SQL string, by calling +recursively adapt() on each element. + +Note: psycopg 2 adapter code is still very young and will probably move +to a more 'standard' (3 arguments) implementation for the adapt() +function; as long as that does not slow down too much query execution. + +Psycopg 2 development can be tracked on the psycopg mailing list: + + http://lists.initd.org/mailman/listinfo/psycopg + +and on the psycopg 2 wiki: + + http://wiki.initd.org/Projects/Psycopg2 + +""" + +import psycopg2 +import psycopg2.extensions +from psycopg2.extensions import adapt as psycoadapt +from psycopg2.extensions import register_adapter + +class AsIs(object): + """An adapter that just return the object 'as is'. + + psycopg 1.99.9 has some optimizations that make impossible to call + adapt() without adding some basic adapters externally. This limitation + will be lifted in a future release. + """ + def __init__(self, obj): + self.__obj = obj + def getquoted(self): + return self.__obj + +class SQL_IN(object): + """Adapt a tuple to an SQL quotable object.""" + + def __init__(self, seq): + self._seq = seq + + def prepare(self, conn): + pass + + def getquoted(self): + # this is the important line: note how every object in the + # list is adapted and then how getquoted() is called on it + + qobjs = [str(psycoadapt(o).getquoted()) for o in self._seq] + + return '(' + ', '.join(qobjs) + ')' + + __str__ = getquoted + + +# add our new adapter class to psycopg list of adapters +register_adapter(tuple, SQL_IN) +register_adapter(float, AsIs) +register_adapter(int, AsIs) + +# usually we would call: +# +# conn = psycopg.connect("...") +# curs = conn.cursor() +# curs.execute("SELECT ...", (("this", "is", "the", "tuple"),)) +# +# but we have no connection to a database right now, so we just check +# the SQL_IN class by calling psycopg's adapt() directly: + +if __name__ == '__main__': + print "Note how the string will be SQL-quoted, but the number will not:" + print psycoadapt(("this is an 'sql quoted' str\\ing", 1, 2.0)) diff --git a/psycopg2/examples/notify.py b/psycopg2/examples/notify.py new file mode 100644 index 0000000..83761b9 --- /dev/null +++ b/psycopg2/examples/notify.py @@ -0,0 +1,43 @@ +# notify.py - example of getting notifies +# +# Copyright (C) 2001-2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 +import select + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +conn.set_isolation_level(0) +curs = conn.cursor() + +curs.execute("listen test") + +print "Waiting for 'NOTIFY test'" +while 1: + if select.select([curs],[],[],5)==([],[],[]): + print "Timeout" + else: + if curs.isready(): + print "Got NOTIFY: %s" % str(curs.connection.notifies.pop()) diff --git a/psycopg2/examples/simple.py b/psycopg2/examples/simple.py new file mode 100644 index 0000000..2306be1 --- /dev/null +++ b/psycopg2/examples/simple.py @@ -0,0 +1,53 @@ +# simple.py - very simple example of plain DBAPI-2.0 usage +# currently used as test-me-stress-me script for psycopg 2.0 +# +# Copyright (C) 2001-2003 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +class SimpleQuoter(object): + def sqlquote(x=None): + return "'bar'" + +import sys +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +curs.execute("SELECT 1 AS foo") +print curs.fetchone() +curs.execute("SELECT 1 AS foo") +print curs.fetchmany() +curs.execute("SELECT 1 AS foo") +print curs.fetchall() + +conn.rollback() + +sys.exit(0) + +curs.execute("SELECT 1 AS foo", async=1) + +curs.execute("SELECT %(foo)s AS foo", {'foo':'bar'}) +curs.execute("SELECT %(foo)s AS foo", {'foo':None}) +curs.execute("SELECT %(foo)f AS foo", {'foo':42}) +curs.execute("SELECT %(foo)s AS foo", {'foo':SimpleQuoter()}) diff --git a/psycopg2/examples/somehackers.jpg b/psycopg2/examples/somehackers.jpg new file mode 100644 index 0000000..8bb6e01 Binary files /dev/null and b/psycopg2/examples/somehackers.jpg differ diff --git a/psycopg2/examples/threads.py b/psycopg2/examples/threads.py new file mode 100644 index 0000000..5477aa8 --- /dev/null +++ b/psycopg2/examples/threads.py @@ -0,0 +1,160 @@ +# threads.py -- example of multiple threads using psycopg +# -*- encoding: latin1 -*- +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## some others parameters +INSERT_THREADS = ('A', 'B', 'C') +SELECT_THREADS = ('1', '2') + +ROWS = 1000 + +COMMIT_STEP = 20 +SELECT_SIZE = 10000 +SELECT_STEP = 500 +SELECT_DIV = 250 + +# the available modes are: +# 0 - one connection for all insert and one for all select threads +# 1 - connections generated using the connection pool + +MODE = 1 + +## don't modify anything below tis line (except for experimenting) + +import sys, psycopg2, threading +from psycopg2.pool import ThreadedConnectionPool + +if len(sys.argv) > 1: + DSN = sys.argv[1] +if len(sys.argv) > 2: + MODE = int(sys.argv[2]) + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("""CREATE TABLE test_threads ( + name text, value1 int4, value2 float)""") +except: + conn.rollback() + curs.execute("DROP TABLE test_threads") + curs.execute("""CREATE TABLE test_threads ( + name text, value1 int4, value2 float)""") +conn.commit() + + +## this function inserts a big number of rows and creates and destroys +## a large number of cursors + +def insert_func(conn_or_pool, rows): + name = threading.currentThread().getName() + + if MODE == 0: + conn = conn_or_pool + else: + conn = conn_or_pool.getconn() + + for i in range(rows): + if divmod(i, COMMIT_STEP)[1] == 0: + conn.commit() + if MODE == 1: + conn_or_pool.putconn(conn) + s = name + ": COMMIT STEP " + str(i) + print s + if MODE == 1: + conn = conn_or_pool.getconn() + c = conn.cursor() + try: + c.execute("INSERT INTO test_threads VALUES (%s, %s, %s)", + (str(i), i, float(i))) + except psycopg2.ProgrammingError, err: + print name, ": an error occurred; skipping this insert" + print err + conn.commit() + +## a nice select function that prints the current number of rows in the +## database (and transefer them, putting some pressure on the network) + +def select_func(conn_or_pool, z): + name = threading.currentThread().getName() + + if MODE == 0: + conn = conn_or_pool + conn.set_isolation_level(0) + + for i in range(SELECT_SIZE): + if divmod(i, SELECT_STEP)[1] == 0: + try: + if MODE == 1: + conn = conn_or_pool.getconn() + conn.set_isolation_level(0) + c = conn.cursor() + c.execute("SELECT * FROM test_threads WHERE value2 < %s", + (int(i/z),)) + l = c.fetchall() + if MODE == 1: + conn_or_pool.putconn(conn) + s = name + ": number of rows fetched: " + str(len(l)) + print s + except psycopg2.ProgrammingError, err: + print name, ": an error occurred; skipping this select" + print err + +## create the connection pool or the connections +if MODE == 0: + conn_insert = psycopg2.connect(DSN) + conn_select = psycopg2.connect(DSN) +else: + m = len(INSERT_THREADS) + len(SELECT_THREADS) + n = m/2 + conn_insert = conn_select = ThreadedConnectionPool(n, m, DSN) + +## create the threads +threads = [] + +print "Creating INSERT threads:" +for name in INSERT_THREADS: + t = threading.Thread(None, insert_func, 'Thread-'+name, + (conn_insert, ROWS)) + t.setDaemon(0) + threads.append(t) + +print "Creating SELECT threads:" +for name in SELECT_THREADS: + t = threading.Thread(None, select_func, 'Thread-'+name, + (conn_select, SELECT_DIV)) + t.setDaemon(0) + threads.append(t) + +## really start the threads now +for t in threads: + t.start() + +# and wait for them to finish +for t in threads: + t.join() + print t.getName(), "exited OK" + + +conn.commit() +curs.execute("SELECT count(name) FROM test_threads") +print "Inserted", curs.fetchone()[0], "rows." + +curs.execute("DROP TABLE test_threads") +conn.commit() diff --git a/psycopg2/examples/tz.py b/psycopg2/examples/tz.py new file mode 100644 index 0000000..c27bf30 --- /dev/null +++ b/psycopg2/examples/tz.py @@ -0,0 +1,69 @@ +# tz.py - example of datetime objects with time zones +# -*- encoding: utf8 -*- +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import datetime + +from psycopg2.tz import ZERO, LOCAL, FixedOffsetTimezone + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("CREATE TABLE test_tz (t timestamp with time zone)") +except: + conn.rollback() + curs.execute("DROP TABLE test_tz") + curs.execute("CREATE TABLE test_tz (t timestamp with time zone)") +conn.commit() + +d = datetime.datetime(1971, 10, 19, 22, 30, 0, tzinfo=LOCAL) +curs.execute("INSERT INTO test_tz VALUES (%s)", (d,)) +print "Inserted timestamp with timezone:", d +print "Time zone:", d.tzinfo.tzname(d), "offset:", d.tzinfo.utcoffset(d) + +tz = FixedOffsetTimezone(-5*60, "EST") +d = datetime.datetime(1971, 10, 19, 22, 30, 0, tzinfo=tz) +curs.execute("INSERT INTO test_tz VALUES (%s)", (d,)) +print "Inserted timestamp with timezone:", d +print "Time zone:", d.tzinfo.tzname(d), "offset:", d.tzinfo.utcoffset(d) + +curs.execute("SELECT * FROM test_tz") +d = curs.fetchone()[0] +curs.execute("INSERT INTO test_tz VALUES (%s)", (d,)) +print "Inserted SELECTed timestamp:", d +print "Time zone:", d.tzinfo.tzname(d), "offset:", d.tzinfo.utcoffset(d) + +curs.execute("SELECT * FROM test_tz") +for d in curs: + u = d[0].utcoffset() or ZERO + print "UTC time: ", d[0] - u + print "Local time:", d[0] + print "Time zone:", d[0].tzinfo.tzname(d[0]), d[0].tzinfo.utcoffset(d[0]) + + +curs.execute("DROP TABLE test_tz") +conn.commit() diff --git a/psycopg2/examples/usercast.py b/psycopg2/examples/usercast.py new file mode 100644 index 0000000..5c8031f --- /dev/null +++ b/psycopg2/examples/usercast.py @@ -0,0 +1,126 @@ +# usercast.py -- example of user defined typecasters +# -*- encoding: latin-1 -*- +# +# Copyright (C) 2001-2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extensions +import whrandom + +# importing psycopg.extras will give us a nice tuple adapter: this is wrong +# because the adapter is meant to be used in SQL IN clauses while we use +# tuples to represent points but it works and the example is about Rect, not +# "Point" +import psycopg2.extras + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Initial encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_cast (p1 point, p2 point, b box)") +except: + conn.rollback() + curs.execute("DROP TABLE test_cast") + curs.execute("CREATE TABLE test_cast (p1 point, p2 point, b box)") +conn.commit() + +# this is the callable object we use as a typecast (the typecast is +# usually a function, but we use a class, just to demonstrate the +# flexibility of the psycopg casting system + +class Rect(object): + """Very simple rectangle. + + Note that we use this type as a data holder, as an adapter of itself for + the ISQLQuote protocol used by psycopg's adapt() (see __confrom__ below) + and eventually as a type-caster for the data extracted from the database + (that's why __init__ takes the curs argument.) + """ + + def __init__(self, s=None, curs=None): + """Init the rectangle from the optional string s.""" + self.x = self.y = self.width = self.height = 0.0 + if s: self.from_string(s) + + def __conform__(self, proto): + """This is a terrible hack, just ignore proto and return self.""" + if proto == psycopg2.extensions.ISQLQuote: + return self + + def from_points(self, x0, y0, x1, y1): + """Init the rectangle from points.""" + if x0 > x1: (x0, x1) = (x1, x0) + if y0 > y1: (y0, y1) = (y1, y0) + self.x = x0 + self.y = y0 + self.width = x1 - x0 + self.height = y1 - y0 + + def from_string(self, s): + """Init the rectangle from a string.""" + seq = eval(s) + self.from_points(seq[0][0], seq[0][1], seq[1][0], seq[1][1]) + + def getquoted(self): + """Format self as a string usable by the db to represent a box.""" + s = "'((%d,%d),(%d,%d))'" % ( + self.x, self.y, self.x + self.width, self.y + self.height) + return s + + def show(self): + """Format a description of the box.""" + s = "X: %d\tY: %d\tWidth: %d\tHeight: %d" % ( + self.x, self.y, self.width, self.height) + return s + +# here we select from the empty table, just to grab the description +curs.execute("SELECT b FROM test_cast WHERE 0=1") +boxoid = curs.description[0][1] +print "Oid for the box datatype is", boxoid + +# and build the user cast object +BOX = psycopg2.extensions.new_type((boxoid,), "BOX", Rect) +psycopg2.extensions.register_type(BOX) + +# now insert 100 random data (2 points and a box in each row) +for i in range(100): + p1 = (whrandom.randint(0,100), whrandom.randint(0,100)) + p2 = (whrandom.randint(0,100), whrandom.randint(0,100)) + b = Rect() + b.from_points(whrandom.randint(0,100), whrandom.randint(0,100), + whrandom.randint(0,100), whrandom.randint(0,100)) + curs.execute("INSERT INTO test_cast VALUES ('%(p1)s', '%(p2)s', %(box)s)", + {'box':b, 'p1':p1, 'p2':p2}) +print "Added 100 boxed to the database" + +# select and print all boxes with at least one point inside +curs.execute("SELECT b FROM test_cast WHERE p1 @ b OR p2 @ b") +boxes = curs.fetchall() +print "Found %d boxes with at least a point inside:" % len(boxes) +for box in boxes: + print " ", box[0].show() + +curs.execute("DROP TABLE test_cast") +conn.commit() diff --git a/psycopg2/examples/whereareyou.jpg b/psycopg2/examples/whereareyou.jpg new file mode 100644 index 0000000..f508c0b Binary files /dev/null and b/psycopg2/examples/whereareyou.jpg differ diff --git a/psycopg2/lib/__init__.py b/psycopg2/lib/__init__.py new file mode 100644 index 0000000..e40caa3 --- /dev/null +++ b/psycopg2/lib/__init__.py @@ -0,0 +1,72 @@ +"""A Python driver for PostgreSQL + +psycopg is a PostgreSQL_ database adapter for the Python_ programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being very +small and fast, and stable as a rock. + +Homepage: http://initd.org/projects/psycopg2 + +.. _PostgreSQL: http://www.postgresql.org/ +.. _Python: http://www.python.org/ + +:Groups: + * `Connections creation`: connect + * `Value objects constructors`: Binary, Date, DateFromTicks, Time, + TimeFromTicks, Timestamp, TimestampFromTicks +""" +# psycopg/__init__.py - initialization of the psycopg module +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +# Import modules needed by _psycopg to allow tools like py2exe to do +# their work without bothering about the module dependencies. +# +# TODO: we should probably use the Warnings framework to signal a missing +# module instead of raising an exception (in case we're running a thin +# embedded Python or something even more devious.) + +import sys, warnings +if sys.version_info[0] >= 2 and sys.version_info[1] >= 3: + try: + import datetime as _psycopg_needs_datetime + except: + warnings.warn( + "can't import datetime module probably needed by _psycopg", + RuntimeWarning) +if sys.version_info[0] >= 2 and sys.version_info[1] >= 4: + try: + import decimal as _psycopg_needs_decimal + except: + warnings.warn( + "can't import decimal module probably needed by _psycopg", + RuntimeWarning) +from psycopg2 import tz +del sys, warnings + +# Import the DBAPI-2.0 stuff into top-level module. + +from _psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID + +from _psycopg import Binary, Date, Time, Timestamp +from _psycopg import DateFromTicks, TimeFromTicks, TimestampFromTicks + +from _psycopg import Error, Warning, DataError, DatabaseError, ProgrammingError +from _psycopg import IntegrityError, InterfaceError, InternalError +from _psycopg import NotSupportedError, OperationalError + +from _psycopg import connect, apilevel, threadsafety, paramstyle +from _psycopg import __version__ + +__all__ = [ k for k in locals().keys() if not k.startswith('_') ] diff --git a/psycopg2/lib/extensions.py b/psycopg2/lib/extensions.py new file mode 100644 index 0000000..9233d1d --- /dev/null +++ b/psycopg2/lib/extensions.py @@ -0,0 +1,69 @@ +"""psycopg extensions to the DBAPI-2.0 + +This module holds all the extensions to the DBAPI-2.0 provided by psycopg. + +- `connection` -- the new-type inheritable connection class +- `cursor` -- the new-type inheritable cursor class +- `adapt()` -- exposes the PEP-246_ compatible adapting mechanism used + by psycopg to adapt Python types to PostgreSQL ones + +.. _PEP-246: http://www.python.org/peps/pep-0246.html +""" +# psycopg/extensions.py - DBAPI-2.0 extensions specific to psycopg +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +from _psycopg import UNICODE, INTEGER, LONGINTEGER, BOOLEAN, FLOAT +from _psycopg import TIME, DATE, INTERVAL + +from _psycopg import Boolean, QuotedString, AsIs +try: + from _psycopg import DateFromMx, TimeFromMx, TimestampFromMx + from _psycopg import IntervalFromMx +except: + pass +try: + from _psycopg import DateFromPy, TimeFromPy, TimestampFromPy + from _psycopg import IntervalFromPy +except: + pass + +from _psycopg import adapt, adapters, encodings, connection, cursor +from _psycopg import string_types, binary_types, new_type, register_type +from _psycopg import ISQLQuote + +"""Isolation level values.""" +ISOLATION_LEVEL_AUTOCOMMIT = 0 +ISOLATION_LEVEL_READ_COMMITTED = 1 +ISOLATION_LEVEL_SERIALIZABLE = 2 + +# PostgreSQL maps the the other standard values to already defined levels +ISOLATION_LEVEL_REPEATABLE_READ = ISOLATION_LEVEL_SERIALIZABLE +ISOLATION_LEVEL_READ_UNCOMMITTED = ISOLATION_LEVEL_READ_COMMITTED + +"""Transaction status values.""" +STATUS_SETUP = 0 +STATUS_READY = 1 +STATUS_BEGIN = 2 +STATUS_SYNC = 3 +STATUS_ASYNC = 4 + +# This is a usefull mnemonic to check if the connection is in a transaction +STATUS_IN_TRANSACTION = STATUS_BEGIN + + +def register_adapter(typ, callable): + """Register 'callable' as an ISQLQuote adapter for type 'typ'.""" + adapters[(typ, ISQLQuote)] = callable + +__all__ = [ k for k in locals().keys() if not k.startswith('_') ] diff --git a/psycopg2/lib/extras.py b/psycopg2/lib/extras.py new file mode 100644 index 0000000..847bdb7 --- /dev/null +++ b/psycopg2/lib/extras.py @@ -0,0 +1,235 @@ +"""Miscellaneous goodies for psycopg2 + +This module is a generic place used to hold little helper functions +and classes untill a better place in the distribution is found. +""" +# psycopg/extras.py - miscellaneous extra goodies for psycopg +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import os +import time + +try: + import logging +except: + logging = None + +from psycopg2.extensions import cursor as _cursor +from psycopg2.extensions import connection as _connection +from psycopg2.extensions import register_adapter as _RA +from psycopg2.extensions import adapt as _A + + +class DictConnection(_connection): + """A connection that uses DictCursor automatically.""" + def cursor(self): + return _connection.cursor(self, cursor_factory=DictCursor) + +class DictCursor(_cursor): + """A cursor that keeps a list of column name -> index mappings.""" + + __query_executed = 0 + + def execute(self, query, vars=None, async=0): + self.row_factory = DictRow + self.index = {} + self.__query_executed = 1 + return _cursor.execute(self, query, vars, async) + + def callproc(self, procname, vars=None): + self.row_factory = DictRow + self.index = {} + self.__query_executed = 1 + return _cursor.callproc(self, procname, vars) + + def _build_index(self): + if self.__query_executed == 1 and self.description: + for i in range(len(self.description)): + self.index[self.description[i][0]] = i + self.__query_executed = 0 + + def fetchone(self): + res = _cursor.fetchone(self) + if self.__query_executed: + self._build_index() + return res + + def fetchmany(self, size=None): + res = _cursor.fetchmany(self, size) + if self.__query_executed: + self._build_index() + return res + + def fetchall(self): + res = _cursor.fetchall(self) + if self.__query_executed: + self._build_index() + return res + + def next(self): + res = _cursor.fetchone(self) + if res is None: + raise StopIteration() + if self.__query_executed: + self._build_index() + return res + +class DictRow(list): + """A row object that allow by-colun-name access to data.""" + + def __init__(self, cursor): + self._index = cursor.index + self[:] = [None] * len(cursor.description) + + def __getitem__(self, x): + if type(x) != int: + x = self._index[x] + return list.__getitem__(self, x) + + def items(self): + res = [] + for n, v in self._index.items(): + res.append((n, list.__getitem__(self, v))) + return res + + def keys(self): + return self._index.keys() + + def values(self): + return tuple(self[:]) + + def has_key(self, x): + return self._index.has_key(x) + + def get(self, x, default=None): + try: + return self[x] + except: + return default + + +class SQL_IN(object): + """Adapt any iterable to an SQL quotable object.""" + + def __init__(self, seq): + self._seq = seq + + def prepare(self, conn): + self._conn = conn + + def getquoted(self): + # this is the important line: note how every object in the + # list is adapted and then how getquoted() is called on it + pobjs = [_A(o) for o in self._seq] + for obj in pobjs: + if hasattr(obj, 'prepare'): + obj.prepare(self._conn) + qobjs = [str(o.getquoted()) for o in pobjs] + return '(' + ', '.join(qobjs) + ')' + + __str__ = getquoted + +_RA(tuple, SQL_IN) + + +class LoggingConnection(_connection): + """A connection that logs all queries to a file or logger object.""" + + def initialize(self, logobj): + """Initialize the connection to log to `logobj`. + + The `logobj` parameter can be an open file object or a Logger instance + from the standard logging module. + """ + self._logobj = logobj + if logging and isinstance(logobj, logging.Logger): + self.log = self._logtologger + else: + self.log = self._logtofile + + def filter(self, msg, curs): + """Filter the query before logging it. + + This is the method to overwrite to filter unwanted queries out of the + log or to add some extra data to the output. The default implementation + just does nothing. + """ + return msg + + def _logtofile(self, msg, curs): + msg = self.filter(msg, curs) + if msg: self._logobj.write(msg + os.linesep) + + def _logtologger(self, msg, curs): + msg = self.filter(msg, curs) + if msg: self._logobj.debug(msg) + + def _check(self): + if not hasattr(self, '_logobj'): + raise self.ProgrammingError( + "LoggingConnection object has not been initialize()d") + + def cursor(self): + self._check() + return _connection.cursor(self, cursor_factory=LoggingCursor) + +class LoggingCursor(_cursor): + """A cursor that logs queries using its connection logging facilities.""" + + def execute(self, query, vars=None, async=0): + try: + return _cursor.execute(self, query, vars, async) + finally: + self.connection.log(self.query, self) + + def callproc(self, procname, vars=None): + try: + return _cursor.callproc(self, procname, vars) + finally: + self.connection.log(self.query, self) + + +class MinTimeLoggingConnection(LoggingConnection): + """A connection that logs queries based on execution time. + + This is just an example of how to sub-class LoggingConnection to provide + some extra filtering for the logged queries. Both the `.inizialize()` and + `.filter()` methods are overwritten to make sure that only queries + executing for more than `mintime` ms are logged. + + Note that this connection uses the specialized cursor MinTimeLoggingCursor. + """ + def initialize(self, logobj, mintime=0): + LoggingConnection.initialize(self, logobj) + self._mintime = mintime + + def filter(self, msg, curs): + t = (time.time() - curs.timestamp) * 1000 + if t > self._mintime: + return msg + os.linesep + " (execution time: %d ms)" % t + + def cursor(self): + self._check() + return _connection.cursor(self, cursor_factory=MinTimeLoggingCursor) + +class MinTimeLoggingCursor(LoggingCursor): + """The cursor sub-class companion to MinTimeLoggingConnection.""" + + def execute(self, query, vars=None, async=0): + self.timestamp = time.time() + return LoggingCursor.execute(self, query, vars, async) + + def callproc(self, procname, vars=None): + self.timestamp = time.time() + return LoggingCursor.execute(self, procname, var) diff --git a/psycopg2/lib/pool.py b/psycopg2/lib/pool.py new file mode 100644 index 0000000..0468db6 --- /dev/null +++ b/psycopg2/lib/pool.py @@ -0,0 +1,236 @@ +"""Connection pooling for psycopg2 + +This module implements thread-safe (and not) connection pools. +""" +# psycopg/pool.py - pooling code for psycopg +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import psycopg2 + +try: + import logging + # do basic initialization if the module is not already initialized + logging.basicConfig(level=logging.INFO, + format='%(asctime)s %(levelname)s %(message)s') + # create logger object for psycopg2 module and sub-modules + _logger = logging.getLogger("psycopg2") + def dbg(*args): + _logger.debug("psycopg2", ' '.join([str(x) for x in args])) + try: + import App # does this make sure that we're running in Zope? + _logger.info("installed. Logging using Python logging module") + except: + _logger.debug("installed. Logging using Python logging module") + +except ImportError: + from zLOG import LOG, DEBUG, INFO + def dbg(*args): + LOG('ZPsycopgDA', DEBUG, "", + ' '.join([str(x) for x in args])+'\n') + LOG('ZPsycopgDA', INFO, "Installed", "Logging using Zope's zLOG\n") + +except: + import sys + def dbg(*args): + sys.stderr.write(' '.join(args)+'\n') + + +class PoolError(psycopg2.Error): + pass + + +class AbstractConnectionPool(object): + """Generic key-based pooling code.""" + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the connection pool. + + New 'minconn' connections are created immediately calling 'connfunc' + with given parameters. The connection pool will support a maximum of + about 'maxconn' connections. + """ + self.minconn = minconn + self.maxconn = maxconn + self.closed = False + + self._args = args + self._kwargs = kwargs + + self._pool = [] + self._used = {} + self._rused = {} # id(conn) -> key map + self._keys = 0 + + for i in range(self.minconn): + self._connect() + + def _connect(self, key=None): + """Create a new connection and assign it to 'key' if not None.""" + conn = psycopg2.connect(*self._args, **self._kwargs) + if key is not None: + self._used[key] = conn + self._rused[id(conn)] = key + else: + self._pool.append(conn) + return conn + + def _getkey(self): + """Return a new unique key.""" + self._keys += 1 + return self._keys + + def _getconn(self, key=None): + """Get a free connection and assign it to 'key' if not None.""" + if self.closed: raise PoolError("connection pool is closed") + if key is None: key = self._getkey() + + if self._used.has_key(key): + return self._used[key] + + if self._pool: + self._used[key] = conn = self._pool.pop() + self._rused[id(conn)] = key + return conn + else: + if len(self._used) == self.maxconn: + raise PoolError("connection pool exausted") + return self._connect(key) + + def _putconn(self, conn, key=None, close=False): + """Put away a connection.""" + if self.closed: raise PoolError("connection pool is closed") + if key is None: key = self._rused[id(conn)] + + if not key: + raise PoolError("trying to put unkeyed connection") + + if len(self._pool) < self.minconn and not close: + self._pool.append(conn) + else: + conn.close() + + # here we check for the presence of key because it can happen that a + # thread tries to put back a connection after a call to close + if not self.closed or key in self._used: + del self._used[key] + del self._rused[id(conn)] + + def _closeall(self): + """Close all connections. + + Note that this can lead to some code fail badly when trying to use + an already closed connection. If you call .closeall() make sure + your code can deal with it. + """ + if self.closed: raise PoolError("connection pool is closed") + for conn in self._pool + list(self._used.values()): + try: + print "Closing connection", conn + conn.close() + except: + pass + self.closed = True + + +class SimpleConnectionPool(AbstractConnectionPool): + """A connection pool that can't be shared across different threads.""" + + getconn = AbstractConnectionPool._getconn + putconn = AbstractConnectionPool._putconn + closeall = AbstractConnectionPool._closeall + + +class ThreadedConnectionPool(AbstractConnectionPool): + """A connection pool that works with the threading module.""" + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the threading lock.""" + import threading + AbstractConnectionPool.__init__( + self, minconn, maxconn, *args, **kwargs) + self._lock = threading.Lock() + + def getconn(self, key=None): + """Get a free connection and assign it to 'key' if not None.""" + self._lock.acquire() + try: + return self._getconn(key) + finally: + self._lock.release() + + def putconn(self, conn=None, key=None, close=False): + """Put away an unused connection.""" + self._lock.acquire() + try: + self._putconn(conn, key, close) + finally: + self._lock.release() + + def closeall(self): + """Close all connections (even the one currently in use.)""" + self._lock.acquire() + try: + self._closeall() + finally: + self._lock.release() + + +class PersistentConnectionPool(AbstractConnectionPool): + """A pool that assigns persistent connections to different threads. + + Note that this connection pool generates by itself the required keys + using the current thread id. This means that untill a thread put away + a connection it will always get the same connection object by successive + .getconn() calls. This also means that a thread can't use more than one + single connection from the pool. + """ + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the threading lock.""" + import threading + AbstractConnectionPool.__init__( + self, minconn, maxconn, *args, **kwargs) + self._lock = threading.Lock() + + # we we'll need the thread module, to determine thread ids, so we + # import it here and copy it in an instance variable + import thread + self.__thread = thread + + def getconn(self): + """Generate thread id and return a connection.""" + key = self.__thread.get_ident() + self._lock.acquire() + try: + return self._getconn(key) + finally: + self._lock.release() + + def putconn(self, conn=None, close=False): + """Put away an unused connection.""" + key = self.__thread.get_ident() + self._lock.acquire() + try: + if not conn: conn = self._used[key] + self._putconn(conn, key, close) + finally: + self._lock.release() + + def closeall(self): + """Close all connections (even the one currently in use.)""" + self._lock.acquire() + try: + self._closeall() + finally: + self._lock.release() diff --git a/psycopg2/lib/psycopg1.py b/psycopg2/lib/psycopg1.py new file mode 100644 index 0000000..d539888 --- /dev/null +++ b/psycopg2/lib/psycopg1.py @@ -0,0 +1,87 @@ +"""psycopg 1.1.x compatibility module + +This module uses the new style connection and cursor types to build a psycopg +1.1.1.x compatibility layer. It should be considered a temporary hack to run +old code while porting to psycopg 2. Import it as follows:: + + from psycopg2 import psycopg1 as psycopg +""" +# psycopg/psycopg1.py - psycopg 1.1.x compatibility module +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import _psycopg as _2psycopg +from psycopg2.extensions import cursor as _2cursor +from psycopg2.extensions import connection as _2connection + +from psycopg2 import * +del connect + + +def connect(*args, **kwargs): + """connect(dsn, ...) -> new psycopg 1.1.x compatible connection object""" + kwargs['connection_factory'] = connection + conn = _2psycopg.connect(*args, **kwargs) + conn.set_isolation_level(2) + return conn + +class connection(_2connection): + """psycopg 1.1.x connection.""" + + def cursor(self): + """cursor() -> new psycopg 1.1.x compatible cursor object""" + return _2connection.cursor(self, cursor_factory=cursor) + + def autocommit(self, on_off=1): + """autocommit(on_off=1) -> switch autocommit on (1) or off (0)""" + if on_off > 0: + self.set_isolation_level(0) + else: + self.set_isolation_level(2) + + +class cursor(_2cursor): + """psycopg 1.1.x cursor. + + Note that this cursor implements the exact procedure used by psycopg 1 to + build dictionaries out of result rows. The DictCursor in the + psycopg.extras modules implements a much better and faster algorithm. + """ + + def __build_dict(self, row): + res = {} + for i in range(len(self.description)): + res[self.description[i][0]] = row[i] + return res + + def dictfetchone(self): + row = _2cursor.fetchone(self) + if row: + return self.__build_dict(row) + else: + return row + + def dictfetchmany(self, size): + res = [] + rows = _2cursor.fetchmany(self, size) + for row in rows: + res.append(self.__build_dict(row)) + return res + + def dictfetchall(self): + res = [] + rows = _2cursor.fetchall(self) + for row in rows: + res.append(self.__build_dict(row)) + return res + diff --git a/psycopg2/lib/tz.py b/psycopg2/lib/tz.py new file mode 100644 index 0000000..e521b6d --- /dev/null +++ b/psycopg2/lib/tz.py @@ -0,0 +1,100 @@ +"""tzinfo implementations for psycopg2 + +This module holds two different tzinfo implementations that can be used as +the 'tzinfo' argument to datetime constructors, directly passed to psycopg +functions or used to set the .tzinfo_factory attribute in cursors. +""" +# psycopg/tz.py - tzinfo implementation +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import datetime +import time + + +ZERO = datetime.timedelta(0) + +class FixedOffsetTimezone(datetime.tzinfo): + """Fixed offset in minutes east from UTC. + + This is exactly the implementation found in Python 2.3.x documentation, + with a small change to the __init__ method to allow for pickling and a + default name in the form 'sHH:MM' ('s' is the sign.) + """ + _name = None + _offset = ZERO + + def __init__(self, offset=None, name=None): + if offset is not None: + self._offset = datetime.timedelta(minutes = offset) + if name is not None: + self._name = name + + def utcoffset(self, dt): + return self._offset + + def tzname(self, dt): + if self._name is not None: + return self._name + else: + seconds = self._offset.seconds + self._offset.days * 86400 + hours, seconds = divmod(seconds, 3600) + minutes = seconds/60 + if minutes: + return "%+03d:%d" % (hours, minutes) + else: + return "%+03d" % hours + + def dst(self, dt): + return ZERO + + +STDOFFSET = datetime.timedelta(seconds = -time.timezone) +if time.daylight: + DSTOFFSET = datetime.timedelta(seconds = -time.altzone) +else: + DSTOFFSET = STDOFFSET +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(datetime.tzinfo): + """Platform idea of local timezone. + + This is the exact implementation from the Pyhton 2.3 documentation. + """ + + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = time.mktime(tt) + tt = time.localtime(stamp) + return tt.tm_isdst > 0 + +LOCAL = LocalTimezone() + +# TODO: pre-generate some interesting time zones? diff --git a/psycopg2/psycopg/adapter_asis.c b/psycopg2/psycopg/adapter_asis.c new file mode 100644 index 0000000..75ee0e4 --- /dev/null +++ b/psycopg2/psycopg/adapter_asis.c @@ -0,0 +1,227 @@ +/* adapter_asis.c - adapt types as they are + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_asis.h" +#include "psycopg/microprotocols_proto.h" + +/** the AsIs object **/ + +static PyObject * +asis_str(asisObject *self) +{ + if (self->wrapped == Py_None) { + return PyString_FromString("NULL"); + } + else { + return PyObject_Str(self->wrapped); + } +} + +PyObject * +asis_getquoted(asisObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return asis_str(self); +} + +PyObject * +asis_conform(asisObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the AsIs object */ + +/* object member list */ + +static struct PyMemberDef asisObject_members[] = { + {"adapted", T_OBJECT, offsetof(asisObject, wrapped), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef asisObject_methods[] = { + {"getquoted", (PyCFunction)asis_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted string"}, + {"__conform__", (PyCFunction)asis_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +asis_setup(asisObject *self, PyObject *obj) +{ + Dprintf("asis_setup: init asis object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("asis_setup: good asis object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +asis_dealloc(PyObject* obj) +{ + asisObject *self = (asisObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("asis_dealloc: deleted asis object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +asis_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *o; + + if (!PyArg_ParseTuple(args, "O", &o)) + return -1; + + return asis_setup((asisObject *)obj, o); +} + +static PyObject * +asis_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +asis_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +asis_repr(asisObject *self) +{ + return PyString_FromFormat("", self); +} + + +/* object type */ + +#define asisType_doc \ +"AsIs(str) -> new AsIs adapter object" + +PyTypeObject asisType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.AsIs", + sizeof(asisObject), + 0, + asis_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + + (reprfunc)asis_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)asis_str, /*tp_str*/ + + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + asisType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + asisObject_methods, /*tp_methods*/ + asisObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + asis_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + asis_new, /*tp_new*/ + (freefunc)asis_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_AsIs(PyObject *module, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O", &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&asisType, "O", obj); +} diff --git a/psycopg2/psycopg/adapter_asis.h b/psycopg2/psycopg/adapter_asis.h new file mode 100644 index 0000000..9495c58 --- /dev/null +++ b/psycopg2/psycopg/adapter_asis.h @@ -0,0 +1,51 @@ +/* adapter_asis.h - definition for the psycopg AsIs type wrapper + * + * Copyright (C) 2003-2005 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_ASIS_H +#define PSYCOPG_ASIS_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject asisType; + +typedef struct { + PyObject HEAD; + + /* this is the real object we wrap */ + PyObject *wrapped; + +} asisObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_AsIs(PyObject *module, PyObject *args); +#define psyco_AsIs_doc \ + "AsIs(obj) -> new AsIs wrapper object" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_ASIS_H) */ diff --git a/psycopg2/psycopg/adapter_binary.c b/psycopg2/psycopg/adapter_binary.c new file mode 100644 index 0000000..0fc8101 --- /dev/null +++ b/psycopg2/psycopg/adapter_binary.c @@ -0,0 +1,382 @@ +/* adapter_binary.c - Binary objects + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/adapter_binary.h" +#include "psycopg/microprotocols_proto.h" + +/** the quoting code */ + +#ifndef PSYCOPG_OWN_QUOTING +static unsigned char * +binary_escape(unsigned char *from, unsigned int from_length, + unsigned int *to_length, PGconn *conn) +{ +#if PG_MAJOR_VERSION > 8 || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION > 1) || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION == 1 && PG_PATCH_VERSION >= 4) + if (conn) + return PQescapeByteaConn(conn, from, from_length, to_length); + else +#endif + return PQescapeBytea(from, from_length, to_length); +} +#else +static unsigned char * +binary_escape(unsigned char *from, unsigned int from_length, + unsigned int *to_length, PGconn *conn) +{ + unsigneed char *quoted, *chptr, *newptr; + int i, space, new_space; + + space = from_length + 2; + + Py_BEGIN_ALLOW_THREADS; + + quoted = (unsigned char*)calloc(space, sizeof(char)); + if (quoted == NULL) return NULL; + + chptr = quoted; + + for (i=0; i < len; i++) { + if (chptr - quoted > space - 6) { + new_space = space * ((space) / (i + 1)) + 2 + 6; + if (new_space - space < 1024) space += 1024; + else space = new_space; + newptr = (unsigned char *)realloc(quoted, space); + if (newptr == NULL) { + free(quoted); + return NULL; + } + /* chptr has to be moved to the new location*/ + chptr = newptr + (chptr - quoted); + quoted = newptr; + Dprintf("binary_escape: reallocated %i bytes at %p", space,quoted); + } + if (from[i]) { + if (from[i] >= ' ' && from[i] <= '~') { + if (from[i] == '\'') { + *chptr = '\''; + chptr++; + *chptr = '\''; + chptr++; + } + else if (from[i] == '\\') { + memcpy(chptr, "\\\\\\\\", 4); + chptr += 4; + } + else { + /* leave it as it is if ascii printable */ + *chptr = from[i]; + chptr++; + } + } + else { + unsigned char c; + + /* escape to octal notation \nnn */ + *chptr++ = '\\'; + *chptr++ = '\\'; + c = from[i]; + *chptr = ((c >> 6) & 0x07) + 0x30; chptr++; + *chptr = ((c >> 3) & 0x07) + 0x30; chptr++; + *chptr = ( c & 0x07) + 0x30; chptr++; + } + } + else { + /* escape null as \\000 */ + memcpy(chptr, "\\\\000", 5); + chptr += 5; + } + } + *chptr = '\0'; + + Py_END_ALLOW_THREADS; + + *to_size = chptr - quoted + 1; + return quoted; +} +#endif + +/* binary_quote - do the quote process on plain and unicode strings */ + +static PyObject * +binary_quote(binaryObject *self) +{ + char *to; + const char *buffer; + int buffer_len; + size_t len = 0; + + /* if we got a plain string or a buffer we escape it and save the buffer */ + if (PyString_Check(self->wrapped) || PyBuffer_Check(self->wrapped)) { + /* escape and build quoted buffer */ + PyObject_AsCharBuffer(self->wrapped, &buffer, &buffer_len); + + to = (char *)binary_escape((unsigned char*)buffer, buffer_len, &len, + self->conn ? ((connectionObject*)self->conn)->pgconn : NULL); + if (to == NULL) { + PyErr_NoMemory(); + return NULL; + } + + if (len > 0) + self->buffer = PyString_FromFormat("'%s'", to); + else + self->buffer = PyString_FromString("''"); + PQfreemem(to); + } + + /* if the wrapped object is not a string or a buffer, this is an error */ + else { + PyErr_SetString(PyExc_TypeError, "can't escape non-string object"); + return NULL; + } + + return self->buffer; +} + +/* binary_str, binary_getquoted - return result of quoting */ + +static PyObject * +binary_str(binaryObject *self) +{ + if (self->buffer == NULL) { + binary_quote(self); + } + Py_XINCREF(self->buffer); + return self->buffer; +} + +PyObject * +binary_getquoted(binaryObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return binary_str(self); +} + +PyObject * +binary_prepare(binaryObject *self, PyObject *args) +{ + connectionObject *conn; + + if (!PyArg_ParseTuple(args, "O", &conn)) + return NULL; + + Py_XDECREF(self->conn); + if (conn) { + self->conn = (PyObject*)conn; + Py_INCREF(self->conn); + } + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject * +binary_conform(binaryObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the Binary object **/ + +/* object member list */ + +static struct PyMemberDef binaryObject_members[] = { + {"adapted", T_OBJECT, offsetof(binaryObject, wrapped), RO}, + {"buffer", T_OBJECT, offsetof(binaryObject, buffer), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef binaryObject_methods[] = { + {"getquoted", (PyCFunction)binary_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted binary string"}, + {"prepare", (PyCFunction)binary_prepare, METH_VARARGS, + "prepare(conn) -> prepare for binary encoding using conn"}, + {"__conform__", (PyCFunction)binary_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +binary_setup(binaryObject *self, PyObject *str) +{ + Dprintf("binary_setup: init binary object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->buffer = NULL; + self->conn = NULL; + self->wrapped = str; + Py_INCREF(self->wrapped); + + Dprintf("binary_setup: good binary object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +binary_dealloc(PyObject* obj) +{ + binaryObject *self = (binaryObject *)obj; + + Py_XDECREF(self->wrapped); + Py_XDECREF(self->buffer); + Py_XDECREF(self->conn); + + Dprintf("binary_dealloc: deleted binary object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +binary_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *str; + + if (!PyArg_ParseTuple(args, "O", &str)) + return -1; + + return binary_setup((binaryObject *)obj, str); +} + +static PyObject * +binary_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +binary_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +binary_repr(binaryObject *self) +{ + return PyString_FromFormat("", self); +} + +/* object type */ + +#define binaryType_doc \ +"Binary(buffer) -> new binary object" + +PyTypeObject binaryType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.Binary", + sizeof(binaryObject), + 0, + binary_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)binary_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)binary_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + binaryType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + binaryObject_methods, /*tp_methods*/ + binaryObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + binary_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + binary_new, /*tp_new*/ + (freefunc)binary_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_Binary(PyObject *module, PyObject *args) +{ + PyObject *str; + + if (!PyArg_ParseTuple(args, "O", &str)) + return NULL; + + return PyObject_CallFunction((PyObject *)&binaryType, "O", str); +} diff --git a/psycopg2/psycopg/adapter_binary.h b/psycopg2/psycopg/adapter_binary.h new file mode 100644 index 0000000..262a72d --- /dev/null +++ b/psycopg2/psycopg/adapter_binary.h @@ -0,0 +1,53 @@ +/* adapter_binary.h - definition for the Binary type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_BINARY_H +#define PSYCOPG_BINARY_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject binaryType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + PyObject *buffer; + PyObject *conn; +} binaryObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_Binary(PyObject *module, PyObject *args); +#define psyco_Binary_doc \ + "Binary(buffer) -> new binary object\n\n" \ + "Build an object capable to hold a bynary string value." + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_BINARY_H) */ diff --git a/psycopg2/psycopg/adapter_datetime.c b/psycopg2/psycopg/adapter_datetime.c new file mode 100644 index 0000000..6409cef --- /dev/null +++ b/psycopg2/psycopg/adapter_datetime.c @@ -0,0 +1,461 @@ +/* adapter_datetime.c - python date/time objects + * + * Copyright (C) 2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_datetime.h" +#include "psycopg/microprotocols_proto.h" + + +/* the pointer to the datetime module API is initialized by the module init + code, we just need to grab it */ +extern PyObject* pyDateTimeModuleP; +extern PyObject *pyDateTypeP; +extern PyObject *pyTimeTypeP; +extern PyObject *pyDateTimeTypeP; +extern PyObject *pyDeltaTypeP; + +extern PyObject *pyPsycopgTzModule; +extern PyObject *pyPsycopgTzLOCAL; + +/* datetime_str, datetime_getquoted - return result of quoting */ + +static PyObject * +pydatetime_str(pydatetimeObject *self) +{ + if (self->type <= PSYCO_DATETIME_TIMESTAMP) { + PyObject *res = NULL; + PyObject *iso = PyObject_CallMethod(self->wrapped, "isoformat", NULL); + if (iso) { + res = PyString_FromFormat("'%s'", PyString_AsString(iso)); + Py_DECREF(iso); + } + return res; + } + else { + PyDateTime_Delta *obj = (PyDateTime_Delta*)self->wrapped; + + char buffer[8]; + int i; + int a = obj->microseconds; + + for (i=0; i < 6 ; i++) { + buffer[5-i] = '0' + (a % 10); + a /= 10; + } + buffer[6] = '\0'; + + return PyString_FromFormat("'%d days %d.%s seconds'", + obj->days, obj->seconds, buffer); + } +} + +PyObject * +pydatetime_getquoted(pydatetimeObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return pydatetime_str(self); +} + +PyObject * +pydatetime_conform(pydatetimeObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the DateTime wrapper object **/ + +/* object member list */ + +static struct PyMemberDef pydatetimeObject_members[] = { + {"adapted", T_OBJECT, offsetof(pydatetimeObject, wrapped), RO}, + {"type", T_INT, offsetof(pydatetimeObject, type), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef pydatetimeObject_methods[] = { + {"getquoted", (PyCFunction)pydatetime_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL date/time"}, + {"__conform__", (PyCFunction)pydatetime_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +pydatetime_setup(pydatetimeObject *self, PyObject *obj, int type) +{ + Dprintf("pydatetime_setup: init datetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->type = type; + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("pydatetime_setup: good pydatetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +pydatetime_dealloc(PyObject* obj) +{ + pydatetimeObject *self = (pydatetimeObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("mpydatetime_dealloc: deleted pydatetime object at %p, " + "refcnt = %d", obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +pydatetime_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *dt; + int type = -1; /* raise an error if type was not passed! */ + + if (!PyArg_ParseTuple(args, "O|i", &dt, &type)) + return -1; + + return pydatetime_setup((pydatetimeObject *)obj, dt, type); +} + +static PyObject * +pydatetime_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +pydatetime_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +pydatetime_repr(pydatetimeObject *self) +{ + return PyString_FromFormat("", + self); +} + +/* object type */ + +#define pydatetimeType_doc \ +"datetime(datetime, type) -> new datetime wrapper object" + +PyTypeObject pydatetimeType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.datetime", + sizeof(pydatetimeObject), + 0, + pydatetime_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)pydatetime_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)pydatetime_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + pydatetimeType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + pydatetimeObject_methods, /*tp_methods*/ + pydatetimeObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + pydatetime_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + pydatetime_new, /*tp_new*/ + (freefunc)pydatetime_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +#ifdef PSYCOPG_DEFAULT_PYDATETIME + +PyObject * +psyco_Date(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + int year, month, day; + + PyObject* obj = NULL; + + if (!PyArg_ParseTuple(args, "iii", &year, &month, &day)) + return NULL; + + obj = PyObject_CallFunction(pyDateTypeP, "iii", year, month, day); + + if (obj) { + res = PyObject_CallFunction((PyObject *)&pydatetimeType, + "Oi", obj, PSYCO_DATETIME_DATE); + Py_DECREF(obj); + } + + return res; +} + +PyObject * +psyco_Time(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + PyObject *tzinfo = NULL; + int hours, minutes=0; + double micro, seconds=0.0; + + PyObject* obj = NULL; + + if (!PyArg_ParseTuple(args, "iid|O", &hours, &minutes, &seconds, + &tzinfo)) + return NULL; + + micro = (seconds - floor(seconds)) * 1000000.0; + + if (tzinfo == NULL) + obj = PyObject_CallFunction(pyTimeTypeP, "iiii", + hours, minutes, (int)round(seconds), (int)round(micro)); + else + obj = PyObject_CallFunction(pyTimeTypeP, "iiiiO", + hours, minutes, (int)round(seconds), (int)round(micro), tzinfo); + + if (obj) { + res = PyObject_CallFunction((PyObject *)&pydatetimeType, + "Oi", obj, PSYCO_DATETIME_TIME); + Py_DECREF(obj); + } + + return res; +} + +PyObject * +psyco_Timestamp(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + PyObject *tzinfo = NULL; + int year, month, day; + int hour=0, minute=0; /* default to midnight */ + double micro, second=0.0; + + PyObject* obj = NULL; + + if (!PyArg_ParseTuple(args, "lii|iidO", &year, &month, &day, + &hour, &minute, &second, &tzinfo)) + return NULL; + + micro = (second - floor(second)) * 1000000.0; + + if (tzinfo == NULL) + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiii", + year, month, day, hour, minute, (int)round(second), + (int)round(micro)); + else + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiiiO", + year, month, day, hour, minute, (int)round(second), + (int)round(micro), tzinfo); + + if (obj) { + res = PyObject_CallFunction((PyObject *)&pydatetimeType, + "Oi", obj, PSYCO_DATETIME_TIMESTAMP); + Py_DECREF(obj); + } + + return res; +} + +PyObject * +psyco_DateFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + struct tm tm; + time_t t; + double ticks; + + if (!PyArg_ParseTuple(args, "d", &ticks)) + return NULL; + + t = (time_t)round(ticks); + if (localtime_r(&t, &tm)) { + args = Py_BuildValue("iii", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday); + if (args) { + res = psyco_Date(self, args); + Py_DECREF(args); + } + } + return res; +} + +PyObject * +psyco_TimeFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + struct tm tm; + time_t t; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + t = (time_t)round(ticks); + if (localtime_r(&t, &tm)) { + args = Py_BuildValue("iid", tm.tm_hour, tm.tm_min, (double)tm.tm_sec); + if (args) { + res = psyco_Time(self, args); + Py_DECREF(args); + } + } + return res; +} + +PyObject * +psyco_TimestampFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + struct tm tm; + time_t t; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + t = (time_t)round(ticks); + if (localtime_r(&t, &tm)) { + args = Py_BuildValue("iiiiidO", + tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, + tm.tm_hour, tm.tm_min, (double)tm.tm_sec, + pyPsycopgTzLOCAL); + if (args) { + res = psyco_Timestamp(self, args); + Py_DECREF(args); + } + } + return res; +} + +#endif + +PyObject * +psyco_DateFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyDateTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_DATE); +} + +PyObject * +psyco_TimeFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyTimeTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_TIME); +} + +PyObject * +psyco_TimestampFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyDateTimeTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_TIMESTAMP); +} + +PyObject * +psyco_IntervalFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyDeltaTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_INTERVAL); +} diff --git a/psycopg2/psycopg/adapter_datetime.h b/psycopg2/psycopg/adapter_datetime.h new file mode 100644 index 0000000..a32bb8d --- /dev/null +++ b/psycopg2/psycopg/adapter_datetime.h @@ -0,0 +1,107 @@ +/* adapter_datetime.h - definition for the python date/time types + * + * Copyright (C) 2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_DATETIME_H +#define PSYCOPG_DATETIME_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject pydatetimeType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + int type; +#define PSYCO_DATETIME_TIME 0 +#define PSYCO_DATETIME_DATE 1 +#define PSYCO_DATETIME_TIMESTAMP 2 +#define PSYCO_DATETIME_INTERVAL 3 + +} pydatetimeObject; + + +/* functions exported to psycopgmodule.c */ +#ifdef PSYCOPG_DEFAULT_PYDATETIME + +extern PyObject *psyco_Date(PyObject *module, PyObject *args); +#define psyco_Date_doc \ + "Date(year, month, day) -> new date\n\n" \ + "Build an object holding a date value." + +extern PyObject *psyco_Time(PyObject *module, PyObject *args); +#define psyco_Time_doc \ + "Time(hour, minutes, seconds, tzinfo=None) -> new time\n\n" \ + "Build an object holding a time value." + +extern PyObject *psyco_Timestamp(PyObject *module, PyObject *args); +#define psyco_Timestamp_doc \ + "Timestamp(year, month, day, hour, minutes, seconds, tzinfo=None) -> new timestamp\n\n" \ + "Build an object holding a timestamp value." + +extern PyObject *psyco_DateFromTicks(PyObject *module, PyObject *args); +#define psyco_DateFromTicks_doc \ + "DateFromTicks(ticks) -> new date\n\n" \ + "Build an object holding a date value from the given ticks value.\n\n" \ + "Ticks are the number of seconds since the epoch; see the documentation " \ + "of the standard Python time module for details)." + +extern PyObject *psyco_TimeFromTicks(PyObject *module, PyObject *args); +#define psyco_TimeFromTicks_doc \ + "TimeFromTicks(ticks) -> new time\n\n" \ + "Build an object holding a time value from the given ticks value.\n\n" \ + "Ticks are the number of seconds since the epoch; see the documentation " \ + "of the standard Python time module for details)." + +extern PyObject *psyco_TimestampFromTicks(PyObject *module, PyObject *args); +#define psyco_TimestampFromTicks_doc \ + "TimestampFromTicks(ticks) -> new timestamp\n\n" \ + "Build an object holding a timestamp value from the given ticks value.\n\n" \ + "Ticks are the number of seconds since the epoch; see the documentation " \ + "of the standard Python time module for details)." + +#endif /* PSYCOPG_DEFAULT_PYDATETIME */ + +extern PyObject *psyco_DateFromPy(PyObject *module, PyObject *args); +#define psyco_DateFromPy_doc \ + "DateFromPy(datetime.date) -> new wrapper" + +extern PyObject *psyco_TimeFromPy(PyObject *module, PyObject *args); +#define psyco_TimeFromPy_doc \ + "TimeFromPy(datetime.time) -> new wrapper" + +extern PyObject *psyco_TimestampFromPy(PyObject *module, PyObject *args); +#define psyco_TimestampFromPy_doc \ + "TimestampFromPy(datetime.datetime) -> new wrapper" + +extern PyObject *psyco_IntervalFromPy(PyObject *module, PyObject *args); +#define psyco_IntervalFromPy_doc \ + "IntervalFromPy(datetime.timedelta) -> new wrapper" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_DATETIME_H) */ diff --git a/psycopg2/psycopg/adapter_list.c b/psycopg2/psycopg/adapter_list.c new file mode 100644 index 0000000..29ef116 --- /dev/null +++ b/psycopg2/psycopg/adapter_list.c @@ -0,0 +1,297 @@ +/* adapter_list.c - python list objects + * + * Copyright (C) 2004-2005 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_list.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" + + +/* list_str, list_getquoted - return result of quoting */ + +static PyObject * +list_quote(listObject *self) +{ + /* adapt the list by calling adapt() recursively and then wrapping + everything into "ARRAY[]" */ + PyObject *tmp = NULL, *str = NULL, *joined = NULL, *res = NULL; + int i, len; + + len = PyList_GET_SIZE(self->wrapped); + + /* empty arrays are converted to NULLs (still searching for a way to + insert an empty array in postgresql */ + if (len == 0) return PyString_FromString("'{}'"); + + tmp = PyTuple_New(len); + + for (i=0; iwrapped, i), + (connectionObject*)self->connection); + if (quoted == NULL) goto error; + + /* here we don't loose a refcnt: SET_ITEM does not change the + reference count and we are just transferring ownership of the tmp + object to the tuple */ + PyTuple_SET_ITEM(tmp, i, quoted); + } + + /* now that we have a tuple of adapted objects we just need to join them + and put "ARRAY[] around the result */ + str = PyString_FromString(", "); + joined = PyObject_CallMethod(str, "join", "(O)", tmp); + if (joined == NULL) goto error; + + res = PyString_FromFormat("ARRAY[%s]", PyString_AsString(joined)); + + error: + Py_XDECREF(tmp); + Py_XDECREF(str); + Py_XDECREF(joined); + return res; +} + +PyObject * +list_str(listObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return list_quote(self); +} + +PyObject * +list_getquoted(listObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return list_quote(self); +} + +PyObject * +list_prepare(listObject *self, PyObject *args) +{ + connectionObject *conn; + + if (!PyArg_ParseTuple(args, "O", &conn)) + return NULL; + + /* note that we don't copy the encoding from the connection, but take a + reference to it; we'll need it during the recursive adapt() call (the + encoding is here for a future expansion that will make .getquoted() + work even without a connection to the backend. */ + Py_XDECREF(self->connection); + self->connection = (PyObject*)conn; + Py_INCREF(self->connection); + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject * +list_conform(listObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the DateTime wrapper object **/ + +/* object member list */ + +static struct PyMemberDef listObject_members[] = { + {"adapted", T_OBJECT, offsetof(listObject, wrapped), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef listObject_methods[] = { + {"getquoted", (PyCFunction)list_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL date/time"}, + {"prepare", (PyCFunction)list_prepare, METH_VARARGS, + "prepare(conn) -> set encoding to conn->encoding"}, + {"__conform__", (PyCFunction)list_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +list_setup(listObject *self, PyObject *obj, char *enc) +{ + Dprintf("list_setup: init list object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + if (!PyList_Check(obj)) + return -1; + + /* FIXME: remove this orrible strdup */ + if (enc) self->encoding = strdup(enc); + + self->connection = NULL; + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("list_setup: good list object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +list_dealloc(PyObject* obj) +{ + listObject *self = (listObject *)obj; + + Py_XDECREF(self->wrapped); + Py_XDECREF(self->connection); + if (self->encoding) free(self->encoding); + + Dprintf("list_dealloc: deleted list object at %p, " + "refcnt = %d", obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +list_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *l; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &l, &enc)) + return -1; + + return list_setup((listObject *)obj, l, enc); +} + +static PyObject * +list_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +list_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +list_repr(listObject *self) +{ + return PyString_FromFormat("", self); +} + +/* object type */ + +#define listType_doc \ +"List(list) -> new list wrapper object" + +PyTypeObject listType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.List", + sizeof(listObject), + 0, + list_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)list_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)list_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + listType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + listObject_methods, /*tp_methods*/ + listObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + list_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + list_new, /*tp_new*/ + (freefunc)list_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_List(PyObject *module, PyObject *args) +{ + PyObject *str; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &str, &enc)) + return NULL; + + return PyObject_CallFunction((PyObject *)&listType, "Os", str, enc); +} diff --git a/psycopg2/psycopg/adapter_list.h b/psycopg2/psycopg/adapter_list.h new file mode 100644 index 0000000..71b4286 --- /dev/null +++ b/psycopg2/psycopg/adapter_list.h @@ -0,0 +1,49 @@ +/* adapter_list.h - definition for the python list types + * + * Copyright (C) 2004-2005 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_LIST_H +#define PSYCOPG_LIST_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject listType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + PyObject *connection; + char *encoding; +} listObject; + +extern PyObject *psyco_List(PyObject *module, PyObject *args); +#define psyco_List_doc \ + "List(list, enc) -> new quoted list" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_LIST_H) */ diff --git a/psycopg2/psycopg/adapter_mxdatetime.c b/psycopg2/psycopg/adapter_mxdatetime.c new file mode 100644 index 0000000..3b23148 --- /dev/null +++ b/psycopg2/psycopg/adapter_mxdatetime.c @@ -0,0 +1,446 @@ +/* adapter_mxdatetime.c - mx date/time objects + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_mxdatetime.h" +#include "psycopg/microprotocols_proto.h" + +/* the pointer to the mxDateTime API is initialized by the module init code, + we just need to grab it */ +extern mxDateTimeModule_APIObject *mxDateTimeP; + + +/* mxdatetime_str, mxdatetime_getquoted - return result of quoting */ + +static PyObject * +mxdatetime_str(mxdatetimeObject *self) +{ + PyObject *str = NULL, *res = NULL; + + switch (self->type) { + + case PSYCO_MXDATETIME_DATE: + case PSYCO_MXDATETIME_TIMESTAMP: + str = PyObject_Str(self->wrapped); + + /* given the limitation of the mx.DateTime module that uses the same + type for both date and timestamp values we need to do some black + magic and make sure we're not using an adapt()ed timestamp as a + simple date */ + if (strncmp(&(PyString_AsString(str)[11]), "00:00:00.000", 12) == 0) { + PyObject *tmp = + PyString_FromStringAndSize(PyString_AsString(str), 10); + Py_DECREF(str); + str = tmp; + } + break; + + case PSYCO_MXDATETIME_TIME: + case PSYCO_MXDATETIME_INTERVAL: + str = PyObject_Str(self->wrapped); + + /* given the limitation of the mx.DateTime module that uses the same + type for both time and delta values we need to do some black magic + and make sure we're not using an adapt()ed interval as a simple + time */ + if (PyString_Size(str) > 8 && PyString_AsString(str)[8] == ':') { + mxDateTimeDeltaObject *obj = (mxDateTimeDeltaObject*)self->wrapped; + + char buffer[8]; + int i, j, x; + + double ss = obj->hour*3600.0 + obj->minute*60.0 + obj->second; + int us = (int)((ss - floor(ss))*1000000); + + for (i=1000000, j=0; i > 0 ; i /= 10) { + x = us/i; + us -= x*i; + buffer[j++] = '0'+x; + } + buffer[j] = '\0'; + + res = PyString_FromFormat("'%ld days %d.%s seconds'", + obj->day, (int)round(ss), buffer); + } + break; + } + + if (str != NULL && res == NULL) { + res = PyString_FromFormat("'%s'", PyString_AsString(str)); + } + Py_XDECREF(str); + + return res; +} + +PyObject * +mxdatetime_getquoted(mxdatetimeObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return mxdatetime_str(self); +} + +PyObject * +mxdatetime_conform(mxdatetimeObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the MxDateTime object **/ + +/* object member list */ + +static struct PyMemberDef mxdatetimeObject_members[] = { + {"adapted", T_OBJECT, offsetof(mxdatetimeObject, wrapped), RO}, + {"type", T_INT, offsetof(mxdatetimeObject, type), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef mxdatetimeObject_methods[] = { + {"getquoted", (PyCFunction)mxdatetime_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL date/time"}, + {"__conform__", (PyCFunction)mxdatetime_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +mxdatetime_setup(mxdatetimeObject *self, PyObject *obj, int type) +{ + Dprintf("mxdatetime_setup: init mxdatetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->type = type; + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("mxdatetime_setup: good mxdatetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +mxdatetime_dealloc(PyObject* obj) +{ + mxdatetimeObject *self = (mxdatetimeObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("mxdatetime_dealloc: deleted mxdatetime object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +mxdatetime_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *mx; + int type = -1; /* raise an error if type was not passed! */ + + if (!PyArg_ParseTuple(args, "O|i", &mx, &type)) + return -1; + + return mxdatetime_setup((mxdatetimeObject *)obj, mx, type); +} + +static PyObject * +mxdatetime_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +mxdatetime_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +mxdatetime_repr(mxdatetimeObject *self) +{ + return PyString_FromFormat("", + self); +} + +/* object type */ + +#define mxdatetimeType_doc \ +"MxDateTime(mx, type) -> new mx.DateTime wrapper object" + +PyTypeObject mxdatetimeType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.MxDateTime", + sizeof(mxdatetimeObject), + 0, + mxdatetime_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)mxdatetime_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)mxdatetime_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + mxdatetimeType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + mxdatetimeObject_methods, /*tp_methods*/ + mxdatetimeObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + mxdatetime_init, /*tp_init*/ + PyType_GenericAlloc, /*tp_alloc*/ + mxdatetime_new, /*tp_new*/ + (freefunc)mxdatetime_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +#ifdef PSYCOPG_DEFAULT_MXDATETIME + +PyObject * +psyco_Date(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + int year, month, day; + + if (!PyArg_ParseTuple(args, "iii", &year, &month, &day)) + return NULL; + + mx = mxDateTimeP->DateTime_FromDateAndTime(year, month, day, 0, 0, 0.0); + if (mx == NULL) return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_DATE); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_Time(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + int hours, minutes=0; + double seconds=0.0; + + if (!PyArg_ParseTuple(args, "iid", &hours, &minutes, &seconds)) + return NULL; + + mx = mxDateTimeP->DateTimeDelta_FromTime(hours, minutes, seconds); + if (mx == NULL) return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIME); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_Timestamp(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + int year, month, day; + int hour=0, minute=0; /* default to midnight */ + double second=0.0; + + if (!PyArg_ParseTuple(args, "lii|iid", &year, &month, &day, + &hour, &minute, &second)) + return NULL; + + mx = mxDateTimeP->DateTime_FromDateAndTime(year, month, day, + hour, minute, second); + if (mx == NULL) return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIMESTAMP); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_DateFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + if (!(mx = mxDateTimeP->DateTime_FromTicks(ticks))) + return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_DATE); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_TimeFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res, *mx, *dt; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + if (!(dt = mxDateTimeP->DateTime_FromTicks(ticks))) + return NULL; + + if (!(mx = mxDateTimeP->DateTimeDelta_FromDaysAndSeconds( + 0, ((mxDateTimeObject*)dt)->abstime))) + { + Py_DECREF(dt); + return NULL; + } + + Py_DECREF(dt); + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIME); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_TimestampFromTicks(PyObject *self, PyObject *args) +{ + PyObject *mx, *res; + double ticks; + + if (!PyArg_ParseTuple(args, "d", &ticks)) + return NULL; + + if (!(mx = mxDateTimeP->DateTime_FromTicks(ticks))) + return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIMESTAMP); + Py_DECREF(mx); + return res; +} + +#endif + +PyObject * +psyco_DateFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTime_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_DATE); +} + +PyObject * +psyco_TimeFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTimeDelta_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIME); +} + +PyObject * +psyco_TimestampFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTime_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIMESTAMP); +} + +PyObject * +psyco_IntervalFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTime_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_INTERVAL); +} diff --git a/psycopg2/psycopg/adapter_mxdatetime.h b/psycopg2/psycopg/adapter_mxdatetime.h new file mode 100644 index 0000000..c485707 --- /dev/null +++ b/psycopg2/psycopg/adapter_mxdatetime.h @@ -0,0 +1,94 @@ +/* adapter_mxdatetime.h - definition for the mx date/time types + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_MXDATETIME_H +#define PSYCOPG_MXDATETIME_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject mxdatetimeType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + int type; +#define PSYCO_MXDATETIME_TIME 0 +#define PSYCO_MXDATETIME_DATE 1 +#define PSYCO_MXDATETIME_TIMESTAMP 2 +#define PSYCO_MXDATETIME_INTERVAL 3 + +} mxdatetimeObject; + +/* functions exported to psycopgmodule.c */ +#ifdef PSYCOPG_DEFAULT_MXDATETIME + +extern PyObject *psyco_Date(PyObject *module, PyObject *args); +#define psyco_Date_doc \ + "Date(year, month, day) -> new date" + +extern PyObject *psyco_Time(PyObject *module, PyObject *args); +#define psyco_Time_doc \ + "Time(hour, minutes, seconds) -> new time" + +extern PyObject *psyco_Timestamp(PyObject *module, PyObject *args); +#define psyco_Timestamp_doc \ + "Time(year, month, day, hour, minutes, seconds) -> new timestamp" + +extern PyObject *psyco_DateFromTicks(PyObject *module, PyObject *args); +#define psyco_DateFromTicks_doc \ + "DateFromTicks(ticks) -> new date" + +extern PyObject *psyco_TimeFromTicks(PyObject *module, PyObject *args); +#define psyco_TimeFromTicks_doc \ + "TimeFromTicks(ticks) -> new time" + +extern PyObject *psyco_TimestampFromTicks(PyObject *module, PyObject *args); +#define psyco_TimestampFromTicks_doc \ + "TimestampFromTicks(ticks) -> new timestamp" + +#endif /* PSYCOPG_DEFAULT_MXDATETIME */ + +extern PyObject *psyco_DateFromMx(PyObject *module, PyObject *args); +#define psyco_DateFromMx_doc \ + "DateFromMx(mx) -> new date" + +extern PyObject *psyco_TimeFromMx(PyObject *module, PyObject *args); +#define psyco_TimeFromMx_doc \ + "TimeFromMx(mx) -> new time" + +extern PyObject *psyco_TimestampFromMx(PyObject *module, PyObject *args); +#define psyco_TimestampFromMx_doc \ + "TimestampFromMx(mx) -> new timestamp" + +extern PyObject *psyco_IntervalFromMx(PyObject *module, PyObject *args); +#define psyco_IntervalFromMx_doc \ + "IntervalFromMx(mx) -> new interval" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_MXDATETIME_H) */ diff --git a/psycopg2/psycopg/adapter_pboolean.c b/psycopg2/psycopg/adapter_pboolean.c new file mode 100644 index 0000000..fa70ad0 --- /dev/null +++ b/psycopg2/psycopg/adapter_pboolean.c @@ -0,0 +1,238 @@ +/* adapter_pboolean.c - psycopg boolean type wrapper implementation + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_pboolean.h" +#include "psycopg/microprotocols_proto.h" + + +/** the Boolean object **/ + +static PyObject * +pboolean_str(pbooleanObject *self) +{ +#ifdef PSYCOPG_NEW_BOOLEAN + if (PyObject_IsTrue(self->wrapped)) { + return PyString_FromString("true"); + } + else { + return PyString_FromString("false"); + } +#else + if (PyObject_IsTrue(self->wrapped)) { + return PyString_FromString("'t'"); + } + else { + return PyString_FromString("'f'"); + } +#endif +} + +PyObject * +pboolean_getquoted(pbooleanObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return pboolean_str(self); +} + +PyObject * +pboolean_conform(pbooleanObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the Boolean object */ + +/* object member list */ + +static struct PyMemberDef pbooleanObject_members[] = { + {"adapted", T_OBJECT, offsetof(pbooleanObject, wrapped), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef pbooleanObject_methods[] = { + {"getquoted", (PyCFunction)pboolean_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted string"}, + {"__conform__", (PyCFunction)pboolean_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +pboolean_setup(pbooleanObject *self, PyObject *obj) +{ + Dprintf("pboolean_setup: init pboolean object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("pboolean_setup: good pboolean object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +pboolean_dealloc(PyObject* obj) +{ + pbooleanObject *self = (pbooleanObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("pboolean_dealloc: deleted pboolean object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +pboolean_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *o; + + if (!PyArg_ParseTuple(args, "O", &o)) + return -1; + + return pboolean_setup((pbooleanObject *)obj, o); +} + +static PyObject * +pboolean_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +pboolean_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +pboolean_repr(pbooleanObject *self) +{ + return PyString_FromFormat("", + self); +} + + +/* object type */ + +#define pbooleanType_doc \ +"Boolean(str) -> new Boolean adapter object" + +PyTypeObject pbooleanType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.Boolean", + sizeof(pbooleanObject), + 0, + pboolean_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + + (reprfunc)pboolean_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)pboolean_str, /*tp_str*/ + + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + pbooleanType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + pbooleanObject_methods, /*tp_methods*/ + pbooleanObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + pboolean_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + pboolean_new, /*tp_new*/ + (freefunc)pboolean_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_Boolean(PyObject *module, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O", &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pbooleanType, "O", obj); +} diff --git a/psycopg2/psycopg/adapter_pboolean.h b/psycopg2/psycopg/adapter_pboolean.h new file mode 100644 index 0000000..efdfe56 --- /dev/null +++ b/psycopg2/psycopg/adapter_pboolean.h @@ -0,0 +1,51 @@ +/* adapter_pboolean.h - definition for the psycopg boolean type wrapper + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_PBOOLEAN_H +#define PSYCOPG_PBOOLEAN_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject pbooleanType; + +typedef struct { + PyObject HEAD; + + /* this is the real object we wrap */ + PyObject *wrapped; + +} pbooleanObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_Boolean(PyObject *module, PyObject *args); +#define psyco_Boolean_doc \ + "Boolean(obj) -> new boolean value" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_PBOOLEAN_H) */ diff --git a/psycopg2/psycopg/adapter_qstring.c b/psycopg2/psycopg/adapter_qstring.c new file mode 100644 index 0000000..2eaf7f3 --- /dev/null +++ b/psycopg2/psycopg/adapter_qstring.c @@ -0,0 +1,393 @@ +/* adapter_qstring.c - QuotedString objects + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/adapter_qstring.h" +#include "psycopg/microprotocols_proto.h" + + +/** the quoting code */ + +#ifndef PSYCOPG_OWN_QUOTING +static size_t +qstring_escape(char *to, char *from, size_t len, PGconn *conn) +{ +#if PG_MAJOR_VERSION > 8 || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION > 1) || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION == 1 && PG_PATCH_VERSION >= 4) + int err; + if (conn) + return PQescapeStringConn(conn, to, from, len, &err); + else +#endif + return PQescapeString(to, from, len); +} +#else +static size_t +qstring_escape(char *to, char *from, size_t len, PGconn *conn) +{ + int i, j; + + for (i=0, j=0; iencoding but if the encoding is not specified we don't know what + to do and we raise an exception */ + + /* TODO: we need a real translation table from postgres encoding names to + python ones here */ + + if (PyUnicode_Check(self->wrapped) && self->encoding) { + PyObject *enc = PyDict_GetItemString(psycoEncodings, self->encoding); + /* note that pgenc is a borrowed reference */ + + if (enc) { + char *s = PyString_AsString(enc); + Dprintf("qstring_quote: encoding unicode object to %s", s); + str = PyUnicode_AsEncodedString(self->wrapped, s, NULL); + Dprintf("qstring_quote: got encoded object at %p", str); + if (str == NULL) return NULL; + } + else { + /* can't find the right encoder, raise exception */ + PyErr_Format(InterfaceError, + "can't encode unicode string to %s", self->encoding); + return NULL; + } + } + + /* if the wrapped object is a simple string, we don't know how to + (re)encode it, so we pass it as-is */ + else if (PyString_Check(self->wrapped)) { + str = self->wrapped; + /* INCREF to make it ref-wise identical to unicode one */ + Py_INCREF(str); + } + + /* if the wrapped object is not a string, this is an error */ + else { + PyErr_SetString(PyExc_TypeError, + "can't quote non-string object (or missing encoding)"); + return NULL; + } + + /* encode the string into buffer */ + PyString_AsStringAndSize(str, &s, &len); + + buffer = (char *)PyMem_Malloc((len*2+3) * sizeof(char)); + if (buffer == NULL) { + Py_DECREF(str); + PyErr_NoMemory(); + return NULL; + } + + Py_BEGIN_ALLOW_THREADS; + len = qstring_escape(buffer+1, s, len, + self->conn ? ((connectionObject*)self->conn)->pgconn : NULL); + buffer[0] = '\'' ; buffer[len+1] = '\''; + Py_END_ALLOW_THREADS; + + self->buffer = PyString_FromStringAndSize(buffer, len+2); + PyMem_Free(buffer); + Py_DECREF(str); + + return self->buffer; +} + +/* qstring_str, qstring_getquoted - return result of quoting */ + +static PyObject * +qstring_str(qstringObject *self) +{ + if (self->buffer == NULL) { + qstring_quote(self); + } + Py_XINCREF(self->buffer); + return self->buffer; +} + +PyObject * +qstring_getquoted(qstringObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return qstring_str(self); +} + +PyObject * +qstring_prepare(qstringObject *self, PyObject *args) +{ + connectionObject *conn; + + if (!PyArg_ParseTuple(args, "O", &conn)) + return NULL; + + /* we bother copying the encoding only if the wrapped string is unicode, + we don't need the encoding if that's not the case */ + if (PyUnicode_Check(self->wrapped)) { + if (self->encoding) free(self->encoding); + self->encoding = strdup(conn->encoding); + Dprintf("qstring_prepare: set encoding to %s", conn->encoding); + } + + Py_XDECREF(self->conn); + if (conn) { + self->conn = (PyObject*)conn; + Py_INCREF(self->conn); + } + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject * +qstring_conform(qstringObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the QuotedString object **/ + +/* object member list */ + +static struct PyMemberDef qstringObject_members[] = { + {"adapted", T_OBJECT, offsetof(qstringObject, wrapped), RO}, + {"buffer", T_OBJECT, offsetof(qstringObject, buffer), RO}, + {"encoding", T_STRING, offsetof(qstringObject, encoding), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef qstringObject_methods[] = { + {"getquoted", (PyCFunction)qstring_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted string"}, + {"prepare", (PyCFunction)qstring_prepare, METH_VARARGS, + "prepare(conn) -> set encoding to conn->encoding and store conn"}, + {"__conform__", (PyCFunction)qstring_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +qstring_setup(qstringObject *self, PyObject *str, char *enc) +{ + Dprintf("qstring_setup: init qstring object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->buffer = NULL; + self->conn = NULL; + + /* FIXME: remove this orrible strdup */ + if (enc) self->encoding = strdup(enc); + + self->wrapped = str; + Py_INCREF(self->wrapped); + + Dprintf("qstring_setup: good qstring object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +qstring_dealloc(PyObject* obj) +{ + qstringObject *self = (qstringObject *)obj; + + Py_XDECREF(self->wrapped); + Py_XDECREF(self->buffer); + Py_XDECREF(self->conn); + + if (self->encoding) free(self->encoding); + + Dprintf("qstring_dealloc: deleted qstring object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +qstring_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *str; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &str, &enc)) + return -1; + + return qstring_setup((qstringObject *)obj, str, enc); +} + +static PyObject * +qstring_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +qstring_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +qstring_repr(qstringObject *self) +{ + return PyString_FromFormat("", + self); +} + +/* object type */ + +#define qstringType_doc \ +"QuotedString(str, enc) -> new quoted object with 'enc' encoding" + +PyTypeObject qstringType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.QuotedString", + sizeof(qstringObject), + 0, + qstring_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)qstring_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)qstring_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + qstringType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + qstringObject_methods, /*tp_methods*/ + qstringObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + qstring_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + qstring_new, /*tp_new*/ + (freefunc)qstring_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_QuotedString(PyObject *module, PyObject *args) +{ + PyObject *str; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &str, &enc)) + return NULL; + + return PyObject_CallFunction((PyObject *)&qstringType, "Os", str, enc); +} diff --git a/psycopg2/psycopg/adapter_qstring.h b/psycopg2/psycopg/adapter_qstring.h new file mode 100644 index 0000000..544b32b --- /dev/null +++ b/psycopg2/psycopg/adapter_qstring.h @@ -0,0 +1,53 @@ +/* adapter_qstring.h - definition for the QuotedString type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_QSTRING_H +#define PSYCOPG_QSTRING_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject qstringType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + PyObject *buffer; + char *encoding; + + PyObject *conn; +} qstringObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_QuotedString(PyObject *module, PyObject *args); +#define psyco_QuotedString_doc \ + "QuotedString(str, enc) -> new quoted string" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_QSTRING_H) */ diff --git a/psycopg2/psycopg/config.h b/psycopg2/psycopg/config.h new file mode 100644 index 0000000..649fee8 --- /dev/null +++ b/psycopg2/psycopg/config.h @@ -0,0 +1,118 @@ +/* config.h - general config and Dprintf macro + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_CONFIG_H +#define PSYCOPG_CONFIG_H 1 + +/* debug printf-like function */ +#if defined( __GNUC__) && !defined(__APPLE__) +#ifdef PSYCOPG_DEBUG +#include +#include +#define Dprintf(fmt, args...) \ + fprintf(stderr, "[%d] " fmt "\n", getpid() , ## args) +#else +#define Dprintf(fmt, args...) +#endif +#else /* !__GNUC__ or __APPLE__ */ +#ifdef PSYCOPG_DEBUG +#include +static void Dprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + printf("\n"); +} +#else +static void Dprintf(const char *fmt, ...) {} +#endif +#endif + +/* pthreads work-arounds for mutilated operating systems */ +#if defined(_WIN32) || defined(__BEOS__) + +#ifdef _WIN32 +#include +#define pthread_mutex_t HANDLE +#define pthread_condvar_t HANDLE +#define pthread_mutex_lock(object) WaitForSingleObject(object, INFINITE) +#define pthread_mutex_unlock(object) ReleaseMutex(object) +#define pthread_mutex_destroy(ref) (CloseHandle(*(ref))) +/* convert pthread mutex to native mutex */ +static int pthread_mutex_init(pthread_mutex_t *mutex, void* fake) +{ + *mutex = CreateMutex(NULL, FALSE, NULL); + return 0; +} +#endif /* _WIN32 */ + +#ifdef __BEOS__ +#include +#define pthread_mutex_t sem_id +#define pthread_mutex_lock(object) acquire_sem(object) +#define pthread_mutex_unlock(object) release_sem(object) +#define pthread_mutex_destroy(ref) delete_sem(*ref) +static int pthread_mutex_init(pthread_mutex_t *mutex, void* fake) +{ + *mutex = create_sem(1, "psycopg_mutex"); + if (*mutex < B_OK) + return *mutex; + return 0; +} +#endif /* __BEOS__ */ + +#else /* pthread is available */ +#include +#endif + +/* to work around the fact that Windows does not have a gmtime_r function, or + a proper gmtime function */ +#ifdef _WIN32 +static struct tm *gmtime_r(time_t *t, struct tm *tm) +{ + tm = gmtime(t); + return tm; +} +static struct tm *localtime_r(time_t *t, struct tm *tm) +{ + tm = localtime(t); + return tm; +} +/* remove the inline keyword, since it doesn't work unless C++ file */ +#define inline +#endif + +#if defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__) +/* what's this, we have no round function either? */ +static double round(double num) +{ + return (num >= 0) ? floor(num + 0.5) : ceil(num - 0.5); +} +#endif + +/* postgresql < 7.4 does not have PQfreemem */ +#ifndef HAVE_PQFREEMEM +#define PQfreemem free +#endif + +#endif /* !defined(PSYCOPG_CONFIG_H) */ diff --git a/psycopg2/psycopg/connection.h b/psycopg2/psycopg/connection.h new file mode 100644 index 0000000..7010120 --- /dev/null +++ b/psycopg2/psycopg/connection.h @@ -0,0 +1,97 @@ +/* connection.h - definition for the psycopg connection type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_CONNECTION_H +#define PSYCOPG_CONNECTION_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* connection status */ +#define CONN_STATUS_READY 1 +#define CONN_STATUS_BEGIN 2 +#define CONN_STATUS_SYNC 3 +#define CONN_STATUS_ASYNC 4 + +extern PyTypeObject connectionType; + +typedef struct { + PyObject HEAD; + + pthread_mutex_t lock; /* the global connection lock */ + + char *dsn; /* data source name */ + char *critical; /* critical error on this connection */ + char *encoding; /* current backend encoding */ + + long int closed; /* 2 means connection has been closed */ + long int isolation_level; /* isolation level for this connection */ + long int mark; /* number of commits/rollbacks done so far */ + int status; /* status of the connection */ + int protocol; /* protocol version */ + + PGconn *pgconn; /* the postgresql connection */ + + PyObject *async_cursor; + + /* notice processing */ + PyObject *notice_list; + PyObject *notice_filter; + + /* notifies */ + PyObject *notifies; + + /* errors (DBAPI-2.0 extension) */ + PyObject *exc_Error; + PyObject *exc_Warning; + PyObject *exc_InterfaceError; + PyObject *exc_DatabaseError; + PyObject *exc_InternalError; + PyObject *exc_OperationalError; + PyObject *exc_ProgrammingError; + PyObject *exc_IntegrityError; + PyObject *exc_DataError; + PyObject *exc_NotSupportedError; + +} connectionObject; + +/* C-callable functions in connection_int.c and connection_ext.c */ +extern int conn_connect(connectionObject *self); +extern void conn_close(connectionObject *self); +extern int conn_commit(connectionObject *self); +extern int conn_rollback(connectionObject *self); +extern int conn_switch_isolation_level(connectionObject *self, int level); +extern int conn_set_client_encoding(connectionObject *self, char *enc); + +/* exception-raising macros */ +#define EXC_IF_CONN_CLOSED(self) if ((self)->closed > 0) { \ + PyErr_SetString(InterfaceError, "connection already closed"); \ + return NULL; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_CONNECTION_H) */ diff --git a/psycopg2/psycopg/connection_int.c b/psycopg2/psycopg/connection_int.c new file mode 100644 index 0000000..3e61ddf --- /dev/null +++ b/psycopg2/psycopg/connection_int.c @@ -0,0 +1,303 @@ +/* connection_int.c - code used by the connection object + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" +#include "psycopg/pqpath.h" + +/* conn_notice_callback - process notices */ + +void +conn_notice_callback(void *args, const char *message) +{ + connectionObject *self = (connectionObject *)args; + + Dprintf("conn_notice_callback: %s", message); + + /* unfortunately the old protocl return COPY FROM errors only as notices, + so we need to filter them looking for such errors */ + if (strncmp(message, "ERROR", 5) == 0) + pq_set_critical(self, message); + else + PyList_Append(self->notice_list, PyString_FromString(message)); +} + +/* conn_connect - execute a connection to the dataabase */ + +int +conn_connect(connectionObject *self) +{ + PGconn *pgconn; + PGresult *pgres; + char *data, *tmp; + int i; + + /* we need the initial date style to be ISO, for typecasters; if the user + later change it, she must know what she's doing... */ + const char *datestyle = "SET DATESTYLE TO 'ISO'"; + const char *encoding = "SHOW client_encoding"; + const char *isolevel = "SHOW default_transaction_isolation"; + + const char *lvl1a = "read uncommitted"; + const char *lvl1b = "read committed"; + const char *lvl2a = "repeatable read"; + const char *lvl2b = "serializable"; + + Py_BEGIN_ALLOW_THREADS; + pgconn = PQconnectdb(self->dsn); + Py_END_ALLOW_THREADS; + + Dprintf("conn_connect: new postgresql connection at %p", pgconn); + + if (pgconn == NULL) + { + Dprintf("conn_connect: PQconnectdb(%s) FAILED", self->dsn); + PyErr_SetString(OperationalError, "PQconnectdb() failed"); + return -1; + } + else if (PQstatus(pgconn) == CONNECTION_BAD) + { + Dprintf("conn_connect: PQconnectdb(%s) returned BAD", self->dsn); + PyErr_SetString(OperationalError, PQerrorMessage(pgconn)); + PQfinish(pgconn); + return -1; + } + + PQsetNoticeProcessor(pgconn, conn_notice_callback, (void*)self); + + Py_BEGIN_ALLOW_THREADS; + pgres = PQexec(pgconn, datestyle); + Py_END_ALLOW_THREADS; + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_COMMAND_OK ) { + PyErr_SetString(OperationalError, "can't set datestyle to ISO"); + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + CLEARPGRES(pgres); + + Py_BEGIN_ALLOW_THREADS; + pgres = PQexec(pgconn, encoding); + Py_END_ALLOW_THREADS; + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_TUPLES_OK) { + PyErr_SetString(OperationalError, "can't fetch client_encoding"); + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + tmp = PQgetvalue(pgres, 0, 0); + self->encoding = PyMem_Malloc(strlen(tmp)+1); + if (self->encoding == NULL) { + /* exception already set by PyMem_Malloc() */ + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + for (i=0 ; i < strlen(tmp) ; i++) + self->encoding[i] = toupper(tmp[i]); + self->encoding[i] = '\0'; + CLEARPGRES(pgres); + + Py_BEGIN_ALLOW_THREADS; + pgres = PQexec(pgconn, isolevel); + Py_END_ALLOW_THREADS; + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_TUPLES_OK) { + PyErr_SetString(OperationalError, + "can't fetch default_isolation_level"); + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + data = PQgetvalue(pgres, 0, 0); + if ((strncmp(lvl1a, data, strlen(lvl1a)) == 0) + || (strncmp(lvl1b, data, strlen(lvl1b)) == 0)) + self->isolation_level = 1; + else if ((strncmp(lvl2a, data, strlen(lvl2a)) == 0) + || (strncmp(lvl2b, data, strlen(lvl2b)) == 0)) + self->isolation_level = 2; + else + self->isolation_level = 2; + CLEARPGRES(pgres); + + if (PQsetnonblocking(pgconn, 1) != 0) { + Dprintf("conn_connect: PQsetnonblocking() FAILED"); + PyErr_SetString(OperationalError, "PQsetnonblocking() failed"); + PQfinish(pgconn); + return -1; + } + +#ifdef HAVE_PQPROTOCOL3 + self->protocol = PQprotocolVersion(pgconn); +#else + self->protocol = 2; +#endif + Dprintf("conn_connect: using protocol %d", self->protocol); + + self->pgconn = pgconn; + return 0; +} + +/* conn_close - do anything needed to shut down the connection */ + +void +conn_close(connectionObject *self) +{ + /* sets this connection as closed even for other threads; also note that + we need to check the value of pgconn, because we get called even when + the connection fails! */ + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + self->closed = 1; + + /* execute a forced rollback on the connection (but don't check the + result, we're going to close the pq connection anyway */ + if (self->pgconn) { + pq_abort(self); + PQfinish(self->pgconn); + Dprintf("conn_close: PQfinish called"); + self->pgconn = NULL; + } + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + +} + +/* conn_commit - commit on a connection */ + +int +conn_commit(connectionObject *self) +{ + int res; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + res = pq_commit(self); + self->mark++; + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + return res; +} + +/* conn_rollback - rollback a connection */ + +int +conn_rollback(connectionObject *self) +{ + int res; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + res = pq_abort(self); + self->mark++; + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + return res; +} + +/* conn_switch_isolation_level - switch isolation level on the connection */ + +int +conn_switch_isolation_level(connectionObject *self, int level) +{ + int res = 0; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + /* if the current isolation level is > 0 we need to abort the current + transaction before changing; that all folks! */ + if (self->isolation_level != level && self->isolation_level > 0) { + res = pq_abort(self); + } + self->isolation_level = level; + self->mark++; + + Dprintf("conn_switch_isolation_level: switched to level %d", level); + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + return res; +} + +/* conn_set_client_encoding - switch client encoding on connection */ + +int +conn_set_client_encoding(connectionObject *self, char *enc) +{ + PGresult *pgres; + char query[48]; + int res = 0; + + /* TODO: check for async query here and raise error if necessary */ + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + /* set encoding, no encoding string is longer than 24 bytes */ + PyOS_snprintf(query, 47, "SET client_encoding = '%s'", enc); + + /* abort the current transaction, to set the encoding ouside of + transactions */ + res = pq_abort(self); + + if (res == 0) { + pgres = PQexec(self->pgconn, query); + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_COMMAND_OK ) { + res = -1; + } + else { + /* no error, we can proceeed and store the new encoding */ + if (self->encoding) free(self->encoding); + self->encoding = strdup(enc); + } + + IFCLEARPGRES(pgres); + } + + Dprintf("conn_set_client_encoding: set encoding to %s", self->encoding); + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + if (res == -1) + PyErr_Format(OperationalError, "can't set encoding to %s", enc); + + return res; +} diff --git a/psycopg2/psycopg/connection_type.c b/psycopg2/psycopg/connection_type.c new file mode 100644 index 0000000..f8cbd80 --- /dev/null +++ b/psycopg2/psycopg/connection_type.c @@ -0,0 +1,422 @@ +/* connection_type.c - python interface to connection objects + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" + +/** DBAPI methods **/ + +/* cursor method - allocate a new cursor */ + +#define psyco_conn_cursor_doc \ +"cursor(cursor_factory=extensions.cursor) -- new cursor\n\n" \ +"Return a new cursor.\n\nThe ``cursor_factory`` argument can be used to\n" \ +"create non-standard cursors by passing a class different from the\n" \ +"default. Note that the new class *should* be a sub-class of\n" \ +"`extensions.cursor`.\n\n" \ +":rtype: `extensions.cursor`" + +static PyObject * +psyco_conn_cursor(connectionObject *self, PyObject *args, PyObject *keywds) +{ + char *name = NULL; + PyObject *obj, *factory = NULL; + + static char *kwlist[] = {"name", "cursor_factory", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, keywds, "|sO", kwlist, + &name, &factory)) { + return NULL; + } + + EXC_IF_CONN_CLOSED(self); + + Dprintf("psyco_conn_cursor: new cursor for connection at %p", self); + Dprintf("psyco_conn_cursor: parameters: name = %s", name); + + if (factory == NULL) factory = (PyObject *)&cursorType; + if (name) + obj = PyObject_CallFunction(factory, "Os", self, name); + else + obj = PyObject_CallFunction(factory, "O", self); + + if (obj == NULL) return NULL; + if (PyObject_IsInstance(obj, (PyObject *)&cursorType) == 0) { + PyErr_SetString(PyExc_TypeError, + "cursor factory must be subclass of psycopg2._psycopg.cursor"); + Py_DECREF(obj); + return NULL; + } + + Dprintf("psyco_conn_cursor: new cursor at %p: refcnt = %d", + obj, obj->ob_refcnt); + return obj; +} + + +/* close method - close the connection and all related cursors */ + +#define psyco_conn_close_doc "close() -- Close the connection." + +static PyObject * +psyco_conn_close(connectionObject *self, PyObject *args) +{ + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "")) return NULL; + + Dprintf("psyco_conn_close: closing connection at %p", self); + conn_close(self); + Dprintf("psyco_conn_close: connection at %p closed", self); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* commit method - commit all changes to the database */ + +#define psyco_conn_commit_doc "commit() -- Commit all changes to database." + +static PyObject * +psyco_conn_commit(connectionObject *self, PyObject *args) +{ + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "")) return NULL; + + /* FIXME: check return status? */ + conn_commit(self); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* rollback method - roll back all changes done to the database */ + +#define psyco_conn_rollback_doc \ +"rollback() -- Roll back all changes done to database." + +static PyObject * +psyco_conn_rollback(connectionObject *self, PyObject *args) +{ + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "")) return NULL; + + /* FIXME: check return status? */ + conn_rollback(self); + + Py_INCREF(Py_None); + return Py_None; +} + + +#ifdef PSYCOPG_EXTENSIONS +/* set_isolation_level method - switch connection isolation level */ + +#define psyco_conn_set_isolation_level_doc \ +"set_isolation_level(level) -- Switch isolation level to ``level``." + +static PyObject * +psyco_conn_set_isolation_level(connectionObject *self, PyObject *args) +{ + int level = 1; + + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "i", &level)) return NULL; + + if (level < 0 || level > 2) { + PyErr_SetString(PyExc_ValueError, + "isolation level out of bounds (0,3)"); + return NULL; + } + + /* FIXME: check return status? */ + conn_switch_isolation_level(self, level); + + Py_INCREF(Py_None); + return Py_None; +} + + + +/* set_isolation_level method - switch connection isolation level */ + +#define psyco_conn_set_client_encoding_doc \ +"set_client_encoding(encoding) -- Set client encoding to ``encoding``." + +static PyObject * +psyco_conn_set_client_encoding(connectionObject *self, PyObject *args) +{ + char *enc = NULL; + + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "s", &enc)) return NULL; + + if (conn_set_client_encoding(self, enc) == 0) { + Py_INCREF(Py_None); + return Py_None; + } + else { + return NULL; + } +} +#endif + + +/** the connection object **/ + + +/* object method list */ + +static struct PyMethodDef connectionObject_methods[] = { + {"cursor", (PyCFunction)psyco_conn_cursor, + METH_VARARGS|METH_KEYWORDS, psyco_conn_cursor_doc}, + {"close", (PyCFunction)psyco_conn_close, + METH_VARARGS, psyco_conn_close_doc}, + {"commit", (PyCFunction)psyco_conn_commit, + METH_VARARGS, psyco_conn_commit_doc}, + {"rollback", (PyCFunction)psyco_conn_rollback, + METH_VARARGS, psyco_conn_rollback_doc}, +#ifdef PSYCOPG_EXTENSIONS + {"set_isolation_level", (PyCFunction)psyco_conn_set_isolation_level, + METH_VARARGS, psyco_conn_set_isolation_level_doc}, + {"set_client_encoding", (PyCFunction)psyco_conn_set_client_encoding, + METH_VARARGS, psyco_conn_set_client_encoding_doc}, +#endif + {NULL} +}; + +/* object member list */ + +static struct PyMemberDef connectionObject_members[] = { + /* DBAPI-2.0 extensions (exception objects) */ + {"Error", T_OBJECT, + offsetof(connectionObject, exc_Error), RO, Error_doc}, + {"Warning", + T_OBJECT, offsetof(connectionObject, exc_Warning), RO, Warning_doc}, + {"InterfaceError", T_OBJECT, + offsetof(connectionObject, exc_InterfaceError), RO, + InterfaceError_doc}, + {"DatabaseError", T_OBJECT, + offsetof(connectionObject, exc_DatabaseError), RO, DatabaseError_doc}, + {"InternalError", T_OBJECT, + offsetof(connectionObject, exc_InternalError), RO, InternalError_doc}, + {"OperationalError", T_OBJECT, + offsetof(connectionObject, exc_OperationalError), RO, + OperationalError_doc}, + {"ProgrammingError", T_OBJECT, + offsetof(connectionObject, exc_ProgrammingError), RO, + ProgrammingError_doc}, + {"IntegrityError", T_OBJECT, + offsetof(connectionObject, exc_IntegrityError), RO, + IntegrityError_doc}, + {"DataError", T_OBJECT, + offsetof(connectionObject, exc_DataError), RO, DataError_doc}, + {"NotSupportedError", T_OBJECT, + offsetof(connectionObject, exc_NotSupportedError), RO, + NotSupportedError_doc}, +#ifdef PSYCOPG_EXTENSIONS + {"closed", T_LONG, offsetof(connectionObject, closed), RO, + "True if the connection is closed."}, + {"isolation_level", T_LONG, + offsetof(connectionObject, isolation_level), RO, + "The current isolation level."}, + {"encoding", T_STRING, offsetof(connectionObject, encoding), RO, + "The current client encoding."}, + {"notices", T_OBJECT, offsetof(connectionObject, notice_list), RO}, + {"notifies", T_OBJECT, offsetof(connectionObject, notifies), RO}, + {"dsn", T_STRING, offsetof(connectionObject, dsn), RO, + "The current connection string."}, + {"status", T_LONG, + offsetof(connectionObject, status), RO, + "The current transaction status."}, +#endif + {NULL} +}; + +/* initialization and finalization methods */ + +static int +connection_setup(connectionObject *self, char *dsn) +{ + Dprintf("connection_setup: init connection object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->dsn = strdup(dsn); + self->notice_list = PyList_New(0); + self->notifies = PyList_New(0); + self->closed = 0; + self->status = CONN_STATUS_READY; + self->critical = NULL; + self->async_cursor = NULL; + self->pgconn = NULL; + self->mark = 0; + + pthread_mutex_init(&(self->lock), NULL); + + if (conn_connect(self) != 0) { + pthread_mutex_destroy(&(self->lock)); + Dprintf("connection_init: FAILED"); + return -1; + } + + Dprintf("connection_setup: good connection object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +connection_dealloc(PyObject* obj) +{ + connectionObject *self = (connectionObject *)obj; + + if (self->closed == 0) conn_close(self); + + if (self->dsn) free(self->dsn); + if (self->encoding) PyMem_Free(self->encoding); + if (self->critical) free(self->critical); + + Py_XDECREF(self->notice_list); + Py_XDECREF(self->notifies); + Py_XDECREF(self->async_cursor); + + pthread_mutex_destroy(&(self->lock)); + + Dprintf("connection_dealloc: deleted connection object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +connection_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + char *dsn; + + if (!PyArg_ParseTuple(args, "s", &dsn)) + return -1; + + return connection_setup((connectionObject *)obj, dsn); +} + +static PyObject * +connection_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +connection_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +connection_repr(connectionObject *self) +{ + return PyString_FromFormat( + "", + self, self->dsn, self->closed); +} + + +/* object type */ + +#define connectionType_doc \ +"connection(dsn, ...) -> new connection object\n\n" \ +":Groups:\n" \ +" * `DBAPI-2.0 errors`: Error, Warning, InterfaceError,\n" \ +" DatabaseError, InternalError, OperationalError,\n" \ +" ProgrammingError, IntegrityError, DataError, NotSupportedError" + +PyTypeObject connectionType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.connection", + sizeof(connectionObject), + 0, + connection_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + (reprfunc)connection_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)connection_repr, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + connectionType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + connectionObject_methods, /*tp_methods*/ + connectionObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + connection_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + connection_new, /*tp_new*/ + (freefunc)connection_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; diff --git a/psycopg2/psycopg/cursor.h b/psycopg2/psycopg/cursor.h new file mode 100644 index 0000000..5aab172 --- /dev/null +++ b/psycopg2/psycopg/cursor.h @@ -0,0 +1,103 @@ +/* cursor.h - definition for the psycopg cursor type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_CURSOR_H +#define PSYCOPG_CURSOR_H 1 + +#include +#include + +#include "psycopg/connection.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject cursorType; + +typedef struct { + PyObject HEAD; + + connectionObject *conn; /* connection owning the cursor */ + + int closed:1; /* 1 if the cursor is closed */ + int notuples:1; /* 1 if the command was not a SELECT query */ + int needsfetch:1; /* 1 if a call to pq_fetch is pending */ + + long int rowcount; /* number of rows affected by last execute */ + long int columns; /* number of columns fetched from the db */ + long int arraysize; /* how many rows should fetchmany() return */ + long int row; /* the row counter for fetch*() operations */ + long int mark; /* transaction marker, copied from conn */ + + PyObject *description; /* read-only attribute: sequence of 7-item + sequences.*/ + + /* postgres connection stuff */ + PGresult *pgres; /* result of last query */ + PyObject *pgstatus; /* last message from the server after an execute */ + Oid lastoid; /* last oid from an insert or InvalidOid */ + + PyObject *casts; /* an array (tuple) of typecast functions */ + PyObject *caster; /* the current typecaster object */ + + PyObject *copyfile; /* file-like used during COPY TO/FROM ops */ + long int copysize; /* size of the copy buffer during COPY TO/FROM ops */ +#define DEFAULT_COPYSIZE 16384 + + PyObject *tuple_factory; /* factory for result tuples */ + PyObject *tzinfo_factory; /* factory for tzinfo objects */ + + PyObject *query; /* last query executed */ + + char *qattr; /* quoting attr, used when quoting strings */ + char *notice; /* a notice from the backend */ + char *name; /* this cursor name */ + + PyObject *string_types; /* a set of typecasters for string types */ + PyObject *binary_types; /* a set of typecasters for binary types */ + +} cursorObject; + +/* C-callable functions in cursor_int.c and cursor_ext.c */ +extern void curs_reset(cursorObject *self); + +/* exception-raising macros */ +#define EXC_IF_CURS_CLOSED(self) \ +if ((self)->closed || ((self)->conn && (self)->conn->closed)) { \ + PyErr_SetString(InterfaceError, "cursor already closed"); \ + return NULL; } + +#define EXC_IF_NO_TUPLES(self) \ +if ((self)->notuples && (self)->name == NULL) { \ + PyErr_SetString(ProgrammingError, "no results to fetch"); \ + return NULL; } + +#define EXC_IF_NO_MARK(self) \ +if ((self)->mark != (self)->conn->mark) { \ + PyErr_SetString(ProgrammingError, "named cursor isn't valid anymore"); \ + return NULL; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_CURSOR_H) */ diff --git a/psycopg2/psycopg/cursor_int.c b/psycopg2/psycopg/cursor_int.c new file mode 100644 index 0000000..8036268 --- /dev/null +++ b/psycopg2/psycopg/cursor_int.c @@ -0,0 +1,47 @@ +/* cursor_int.c - code used by the cursor object + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/psycopg.h" +#include "psycopg/cursor.h" +#include "psycopg/pqpath.h" + +/* curs_reset - reset the cursor to a clean state */ + +void +curs_reset(cursorObject *self) +{ + /* initialize some variables to default values */ + self->notuples = 1; + self->rowcount = -1; + self->row = 0; + + Py_XDECREF(self->description); + Py_INCREF(Py_None); + self->description = Py_None; + + Py_XDECREF(self->casts); + self->casts = NULL; +} diff --git a/psycopg2/psycopg/cursor_type.c b/psycopg2/psycopg/cursor_type.c new file mode 100644 index 0000000..73e4de6 --- /dev/null +++ b/psycopg2/psycopg/cursor_type.c @@ -0,0 +1,1553 @@ +/* cursor_type.c - python interface to cursor objects + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public Likcense + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/cursor.h" +#include "psycopg/connection.h" +#include "psycopg/pqpath.h" +#include "psycopg/typecast.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" +#include "pgversion.h" + +extern PyObject *pyPsycopgTzFixedOffsetTimezone; + + +/** DBAPI methods **/ + +/* close method - close the cursor */ + +#define psyco_curs_close_doc \ +"close() -- Close the cursor." + +static PyObject * +psyco_curs_close(cursorObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + EXC_IF_CURS_CLOSED(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "CLOSE %s", self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + } + + self->closed = 1; + Dprintf("psyco_curs_close: cursor at %p closed", self); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* execute method - executes a query */ + +/* mogrify a query string and build argument array or dict */ + +static int +_mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new) +{ + PyObject *key, *value, *n, *item; + char *d, *c; + int index = 0, force = 0; + + /* from now on we'll use n and replace its value in *new only at the end, + just before returning. we also init *new to NULL to exit with an error + if we can't complete the mogrification */ + n = *new = NULL; + c = PyString_AsString(fmt); + + while(*c) { + /* handle plain percent symbol in format string */ + if (c[0] == '%' && c[1] == '%') { + c+=2; force = 1; + } + + /* if we find '%(' then this is a dictionary, we: + 1/ find the matching ')' and extract the key name + 2/ locate the value in the dictionary (or return an error) + 3/ mogrify the value into something usefull (quoting)... + 4/ ...and add it to the new dictionary to be used as argument + */ + else if (c[0] == '%' && c[1] == '(') { + + /* let's have d point the end of the argument */ + for (d = c + 2; *d && *d != ')'; d++); + + if (*d == ')') { + key = PyString_FromStringAndSize(c+2, d-c-2); + value = PyObject_GetItem(var, key); + /* key has refcnt 1, value the original value + 1 */ + + /* if value is NULL we did not find the key (or this is not a + dictionary): let python raise a KeyError */ + if (value == NULL) { + Py_DECREF(key); /* destroy key */ + Py_XDECREF(n); /* destroy n */ + return -1; + } + + Dprintf("_mogrify: value refcnt: %d (+1)", value->ob_refcnt); + + if (n == NULL) { + n = PyDict_New(); + } + + if ((item = PyObject_GetItem(n, key)) == NULL) { + PyObject *t = NULL; + + PyErr_Clear(); + + /* None is always converted to NULL; this is an + optimization over the adapting code and can go away in + the future if somebody finds a None adapter usefull. */ + if (value == Py_None) { + t = PyString_FromString("NULL"); + PyDict_SetItem(n, key, t); + /* t is a new object, refcnt = 1, key is at 2 */ + + /* if the value is None we need to substitute the + formatting char with 's' (FIXME: this should not be + necessary if we drop support for formats other than + %s!) */ + while (*d && !isalpha(*d)) d++; + if (*d) *d = 's'; + } + else { + t = microprotocol_getquoted(value, conn); + + if (t != NULL) { + PyDict_SetItem(n, key, t); + /* both key and t refcnt +1, key is at 2 now */ + } + else { + /* no adapter found, raise a BIG exception */ + Py_XDECREF(value); + Py_DECREF(n); + return -1; + } + } + + Py_XDECREF(t); /* t dies here */ + /* after the DECREF value has the original refcnt plus 1 + if it was added to the dictionary directly; good */ + Py_XDECREF(value); + } + else { + /* we have an item with one extra refcnt here, zap! */ + Py_DECREF(item); + } + Py_DECREF(key); /* key has the original refcnt now */ + Dprintf("_mogrify: after value refcnt: %d",value->ob_refcnt); + } + c = d; + } + + else if (c[0] == '%' && c[1] != '(') { + /* this is a format that expects a tuple; it is much easier, + because we don't need to check the old/new dictionary for + keys */ + + value = PySequence_GetItem(var, index); + /* value has refcnt inc'ed by 1 here */ + + /* if value is NULL this is not a sequence or the index is wrong; + anyway we let python set its own exception */ + if (value == NULL) { + Py_XDECREF(n); + return -1; + } + + if (n == NULL) { + n = PyTuple_New(PyObject_Length(var)); + } + + /* let's have d point just after the '%' */ + d = c+1; + + if (value == Py_None) { + PyTuple_SET_ITEM(n, index, PyString_FromString("NULL")); + while (*d && !isalpha(*d)) d++; + if (*d) *d = 's'; + Py_DECREF(value); + } + else { + PyObject *t = microprotocol_getquoted(value, conn); + + if (t != NULL) { + PyTuple_SET_ITEM(n, index, t); + Py_DECREF(value); + } + else { + Py_DECREF(n); + Py_DECREF(value); + return -1; + } + } + c = d; + index += 1; + } + else { + c++; + } + } + + if (force && n == NULL) + n = PyTuple_New(0); + *new = n; + + return 0; +} + +#define psyco_curs_execute_doc \ +"execute(query, vars=None, async=0) -- Execute query with bound vars." + +static int +_psyco_curs_execute(cursorObject *self, + PyObject *operation, PyObject *vars, long int async) +{ + int res; + PyObject *fquery, *cvt = NULL, *uoperation = NULL; + + pthread_mutex_lock(&(self->conn->lock)); + if (self->conn->async_cursor != NULL + && self->conn->async_cursor != (PyObject*)self) { + pthread_mutex_unlock(&(self->conn->lock)); + psyco_set_error(ProgrammingError, (PyObject*)self, + "asynchronous query already in execution", NULL, NULL); + return 0; + } + pthread_mutex_unlock(&(self->conn->lock)); + + if (!PyObject_IsTrue(operation)) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't execute an empty query", NULL, NULL); + return 0; + } + + if (PyUnicode_Check(operation)) { + PyObject *enc = PyDict_GetItemString(psycoEncodings, + self->conn->encoding); + /* enc is a borrowed reference, we won't decref it */ + + if (enc) { + operation = PyUnicode_AsEncodedString( + operation, PyString_AsString(enc), NULL); + + /* if there was an error during the encoding from unicode to the + target encoding we just let the exception propagate */ + if (operation == NULL) return 0; + + /* we clone operation in uoperation to be sure to free it later */ + uoperation = operation; + } + else { + PyErr_Format(InterfaceError, "can't encode unicode query to %s", + self->conn->encoding); + return 0; + } + } + else if (!PyString_Check(operation)) { + /* the operation is not unicode or string, raise an error */ + PyErr_SetString(PyExc_TypeError, + "argument 1 must be a string or unicode object"); + return 0; + } + + IFCLEARPGRES(self->pgres); + + if (self->query) { + Py_DECREF(self->query); + self->query = NULL; + } + + Dprintf("psyco_curs_execute: starting execution of new query"); + + /* here we are, and we have a sequence or a dictionary filled with + objects to be substituted (bound variables). we try to be smart and do + the right thing (i.e., what the user expects) */ + + if (vars && vars != Py_None) + { + if(_mogrify(vars, operation, self->conn, &cvt) == -1) { + Py_XDECREF(uoperation); + return 0; + } + } + + if (vars && cvt) { + /* if PyString_Format() return NULL an error occured: if the error is + a TypeError we need to check the exception.args[0] string for the + values: + + "not enough arguments for format string" + "not all arguments converted" + + and return the appropriate ProgrammingError. we do that by grabbing + the curren exception (we will later restore it if the type or the + strings do not match.) */ + + if (!(fquery = PyString_Format(operation, cvt))) { + PyObject *err, *arg, *trace; + int pe = 0; + + PyErr_Fetch(&err, &arg, &trace); + + if (err && PyErr_GivenExceptionMatches(err, PyExc_TypeError)) { + Dprintf("psyco_curs_execute: TypeError exception catched"); + PyErr_NormalizeException(&err, &arg, &trace); + + if (PyObject_HasAttrString(arg, "args")) { + PyObject *args = PyObject_GetAttrString(arg, "args"); + PyObject *str = PySequence_GetItem(args, 0); + char *s = PyString_AS_STRING(str); + + Dprintf("psyco_curs_execute: -> %s", s); + + if (!strcmp(s, "not enough arguments for format string") + || !strcmp(s, "not all arguments converted")) { + Dprintf("psyco_curs_execute: -> got a match"); + psyco_set_error(ProgrammingError, (PyObject*)self, + s, NULL, NULL); + pe = 1; + } + + Py_DECREF(args); + Py_DECREF(str); + } + } + + /* if we did not manage our own exception, restore old one */ + if (pe == 1) { + Py_XDECREF(err); Py_XDECREF(arg); Py_XDECREF(trace); + } + else { + PyErr_Restore(err, arg, trace); + } + Py_XDECREF(uoperation); + return 0; + } + + if (self->name != NULL) { + self->query = PyString_FromFormat( + "DECLARE %s CURSOR WITHOUT HOLD FOR %s", + self->name, PyString_AS_STRING(fquery)); + Py_DECREF(fquery); + } + else { + self->query = fquery; + } + + Dprintf("psyco_curs_execute: cvt->refcnt = %d", cvt->ob_refcnt); + Py_DECREF(cvt); + } + else { + if (self->name != NULL) { + self->query = PyString_FromFormat( + "DECLARE %s CURSOR WITHOUT HOLD FOR %s", + self->name, PyString_AS_STRING(operation)); + } + else { + Py_INCREF(operation); + self->query = operation; + } + } + + res = pq_execute(self, PyString_AS_STRING(self->query), async); + + Dprintf("psyco_curs_execute: res = %d, pgres = %p", res, self->pgres); + + Py_XDECREF(uoperation); + + return res == -1 ? 0 : 1; +} + +static PyObject * +psyco_curs_execute(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + long int async = 0; + PyObject *vars = NULL, *operation = NULL; + + static char *kwlist[] = {"query", "vars", "async", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi", kwlist, + &operation, &vars, &async)) { + return NULL; + } + + if (self->name != NULL) { + if (self->query != Py_None) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't call .execute() on named cursors more than once", + NULL, NULL); + return NULL; + } + if (self->conn->isolation_level == 0) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't use a named cursor outside of transactions", NULL, NULL); + return NULL; + } + if (self->conn->mark != self->mark) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "named cursor isn't valid anymore", NULL, NULL); + return NULL; + } + } + + EXC_IF_CURS_CLOSED(self); + + if (_psyco_curs_execute(self, operation, vars, async)) { + Py_INCREF(Py_None); + return Py_None; + } + else { + return NULL; + } +} + +#define psyco_curs_executemany_doc \ +"executemany(query, vars_list) -- Execute many queries with bound vars." + +static PyObject * +psyco_curs_executemany(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *operation = NULL, *vars = NULL; + PyObject *v, *iter = NULL; + + static char *kwlist[] = {"query", "vars_list", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO", kwlist, + &operation, &vars)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (self->name != NULL) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't call .executemany() on named cursors", NULL, NULL); + return NULL; + } + + if (!PyIter_Check(vars)) { + vars = iter = PyObject_GetIter(vars); + if (iter == NULL) return NULL; + } + + while ((v = PyIter_Next(vars)) != NULL) { + if (_psyco_curs_execute(self, operation, v, 0) == 0) { + Py_DECREF(v); + return NULL; + } + else { + Py_DECREF(v); + } + } + Py_XDECREF(iter); + + Py_INCREF(Py_None); + return Py_None; +} + + +#ifdef PSYCOPG_EXTENSIONS +#define psyco_curs_mogrify_doc \ +"mogrify(query, vars=None) -> str -- Return query after vars binding." + +static PyObject * +psyco_curs_mogrify(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *vars = NULL, *cvt = NULL, *operation = NULL; + PyObject *fquery; + + static char *kwlist[] = {"query", "vars", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", kwlist, + &operation, &vars)) { + return NULL; + } + + if (PyUnicode_Check(operation)) { + PyErr_SetString(NotSupportedError, + "unicode queries not yet supported"); + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + IFCLEARPGRES(self->pgres); + + /* note that we don't overwrite the last query executed on the cursor, we + just *return* the new query with bound variables + + TODO: refactor the common mogrification code (see psycopg_curs_execute + for comments, the code is amost identical) */ + + if (vars) + { + if(_mogrify(vars, operation, self->conn, &cvt) == -1) return NULL; + } + + if (vars && cvt) { + if (!(fquery = PyString_Format(operation, cvt))) { + PyObject *err, *arg, *trace; + int pe = 0; + + PyErr_Fetch(&err, &arg, &trace); + + if (err && PyErr_GivenExceptionMatches(err, PyExc_TypeError)) { + Dprintf("psyco_curs_execute: TypeError exception catched"); + PyErr_NormalizeException(&err, &arg, &trace); + + if (PyObject_HasAttrString(arg, "args")) { + PyObject *args = PyObject_GetAttrString(arg, "args"); + PyObject *str = PySequence_GetItem(args, 0); + char *s = PyString_AS_STRING(str); + + Dprintf("psyco_curs_execute: -> %s", s); + + if (!strcmp(s, "not enough arguments for format string") + || !strcmp(s, "not all arguments converted")) { + Dprintf("psyco_curs_execute: -> got a match"); + psyco_set_error(ProgrammingError, (PyObject*)self, + s, NULL, NULL); + pe = 1; + } + + Py_DECREF(args); + Py_DECREF(str); + } + } + + /* if we did not manage our own exception, restore old one */ + if (pe == 1) { + Py_XDECREF(err); Py_XDECREF(arg); Py_XDECREF(trace); + } + else { + PyErr_Restore(err, arg, trace); + } + return NULL; + } + + Dprintf("psyco_curs_execute: cvt->refcnt = %d, fquery->refcnt = %d", + cvt->ob_refcnt, fquery->ob_refcnt); + Py_DECREF(cvt); + } + else { + fquery = operation; + Py_INCREF(operation); + } + + return fquery; +} +#endif + + +/* fetchone method - fetch one row of results */ + +#define psyco_curs_fetchone_doc \ +"fetchone() -> tuple or None\n\n" \ +"Return the next row of a query result set in the form of a tuple (by\n" \ +"default) or using the sequence factory previously set in the\n" \ +"`row_factory` attribute. Return `None` when no more data is available.\n" + +static int +_psyco_curs_prefetch(cursorObject *self) +{ + int i = 0; + + /* check if the fetching cursor is the one that did the asynchronous query + and raise an exception if not */ + pthread_mutex_lock(&(self->conn->lock)); + if (self->conn->async_cursor != NULL + && self->conn->async_cursor != (PyObject*)self) { + pthread_mutex_unlock(&(self->conn->lock)); + psyco_set_error(ProgrammingError, (PyObject*)self, + "asynchronous fetch by wrong cursor", NULL, NULL); + return -2; + } + pthread_mutex_unlock(&(self->conn->lock)); + + if (self->pgres == NULL || self->needsfetch) { + self->needsfetch = 0; + Dprintf("_psyco_curs_prefetch: trying to fetch data"); + do { + i = pq_fetch(self); + Dprintf("_psycopg_curs_prefetch: result = %d", i); + } while(i == 1); + } + + Dprintf("_psyco_curs_prefetch: result = %d", i); + return i; +} + +static PyObject * +_psyco_curs_buildrow_fill(cursorObject *self, PyObject *res, + int row, int n, int istuple) +{ + int i, len; + unsigned char *str; + PyObject *val; + + for (i=0; i < n; i++) { + if (PQgetisnull(self->pgres, row, i)) { + str = NULL; + len = 0; + } + else { + str = (unsigned char*)PQgetvalue(self->pgres, row, i); + len = PQgetlength(self->pgres, row, i); + } + + Dprintf("_psyco_curs_buildrow: row %ld, element %d, len %i", + self->row, i, len); + + val = typecast_cast(PyTuple_GET_ITEM(self->casts, i), (char*)str, len, + (PyObject*)self); + + if (val) { + Dprintf("_psyco_curs_buildrow: val->refcnt = %d", val->ob_refcnt); + if (istuple) { + PyTuple_SET_ITEM(res, i, val); + } + else { + PySequence_SetItem(res, i, val); + Py_DECREF(val); + } + } + else { + /* an error occurred in the type system, we return NULL to raise + an exception. the typecast code should already have set the + exception type and text */ + Py_DECREF(res); + res = NULL; + break; + } + } + return res; +} + +static PyObject * +_psyco_curs_buildrow(cursorObject *self, int row) +{ + int n; + + n = PQnfields(self->pgres); + return _psyco_curs_buildrow_fill(self, PyTuple_New(n), row, n, 1); +} + +static PyObject * +_psyco_curs_buildrow_with_factory(cursorObject *self, int row) +{ + int n; + PyObject *res; + + n = PQnfields(self->pgres); + if ((res = PyObject_CallFunction(self->tuple_factory, "O", self))== NULL) + return NULL; + + return _psyco_curs_buildrow_fill(self, res, row, n, 0); +} + +PyObject * +psyco_curs_fetchone(cursorObject *self, PyObject *args) +{ + PyObject *res; + + if (args && !PyArg_ParseTuple(args, "")) return NULL; + + EXC_IF_CURS_CLOSED(self) + if (_psyco_curs_prefetch(self) < 0) return NULL; + EXC_IF_NO_TUPLES(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "FETCH FORWARD 1 FROM %s", self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + Dprintf("psyco_curs_fetchone: fetching row %ld", self->row); + Dprintf("psyco_curs_fetchone: rowcount = %ld", self->rowcount); + + if (self->row >= self->rowcount) { + /* we exausted available data: return None */ + Py_INCREF(Py_None); + return Py_None; + } + + if (self->tuple_factory == Py_None) + res = _psyco_curs_buildrow(self, self->row); + else + res = _psyco_curs_buildrow_with_factory(self, self->row); + + self->row++; /* move the counter to next line */ + + /* if the query was async aggresively free pgres, to allow + successive requests to reallocate it */ + if (self->row >= self->rowcount + && self->conn->async_cursor == (PyObject*)self) + IFCLEARPGRES(self->pgres); + + return res; +} + + +/* fetch many - fetch some results */ + +#define psyco_curs_fetchmany_doc \ +"fetchmany(size=self.arraysize) -> list of tuple\n\n" \ +"Return the next `size` rows of a query result set in the form of a list\n" \ +"of tuples (by default) or using the sequence factory previously set in\n" \ +"the `row_factory` attribute. Return `None` when no more data is available.\n" + +PyObject * +psyco_curs_fetchmany(cursorObject *self, PyObject *args, PyObject *kwords) +{ + int i; + PyObject *list, *res; + + long int size = self->arraysize; + static char *kwlist[] = {"size", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwords, "|l", kwlist, &size)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + if (_psyco_curs_prefetch(self) < 0) return NULL; + EXC_IF_NO_TUPLES(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "FETCH FORWARD %d FROM %s", + (int)size, self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + /* make sure size is not > than the available number of rows */ + if (size > self->rowcount - self->row || size < 0) { + size = self->rowcount - self->row; + } + + Dprintf("psyco_curs_fetchmany: size = %ld", size); + + if (size <= 0) { + return PyList_New(0); + } + + list = PyList_New(size); + + for (i = 0; i < size; i++) { + if (self->tuple_factory == Py_None) + res = _psyco_curs_buildrow(self, self->row); + else + res = _psyco_curs_buildrow_with_factory(self, self->row); + + self->row++; + + if (res == NULL) { + Py_DECREF(list); + return NULL; + } + + PyList_SET_ITEM(list, i, res); + } + + /* if the query was async aggresively free pgres, to allow + successive requests to reallocate it */ + if (self->row >= self->rowcount + && self->conn->async_cursor == (PyObject*)self) + IFCLEARPGRES(self->pgres); + + return list; +} + + +/* fetch all - fetch all results */ + +#define psyco_curs_fetchall_doc \ +"fetchall() -> list of tuple\n\n" \ +"Return all the remaining rows of a query result set.\n\n" \ +"Rows are returned in the form of a list of tuples (by default) or using\n" \ +"the sequence factory previously set in the `row_factory` attribute.\n" \ +"Return `None` when no more data is available.\n" + +PyObject * +psyco_curs_fetchall(cursorObject *self, PyObject *args) +{ + int i, size; + PyObject *list, *res; + + if (!PyArg_ParseTuple(args, "")) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + if (_psyco_curs_prefetch(self) < 0) return NULL; + EXC_IF_NO_TUPLES(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "FETCH FORWARD ALL FROM %s", self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + size = self->rowcount - self->row; + + if (size <= 0) { + return PyList_New(0); + } + + list = PyList_New(size); + + for (i = 0; i < size; i++) { + if (self->tuple_factory == Py_None) + res = _psyco_curs_buildrow(self, self->row); + else + res = _psyco_curs_buildrow_with_factory(self, self->row); + + self->row++; + + if (res == NULL) { + Py_DECREF(list); + return NULL; + } + + PyList_SET_ITEM(list, i, res); + } + + /* if the query was async aggresively free pgres, to allow + successive requests to reallocate it */ + if (self->row >= self->rowcount + && self->conn->async_cursor == (PyObject*)self) + IFCLEARPGRES(self->pgres); + + return list; +} + + +/* callproc method - execute a stored procedure */ + +#define psyco_curs_callproc_doc \ +"callproc(procname, parameters=None, async=0) -- Execute stored procedure." + +static PyObject * +psyco_curs_callproc(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + char *procname = NULL, *sql = NULL; + long int async = 0; + int i, nparameters = 0, sl = 0; + PyObject *parameters = NULL; + PyObject *operation = NULL; + PyObject *res = NULL; + + if (!PyArg_ParseTuple(args, "s|Oi", &procname, ¶meters, &async)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (self->name != NULL) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't call .callproc() on named cursors", NULL, NULL); + return NULL; + } + + if(parameters && parameters != Py_None) { + nparameters = PyObject_Length(parameters); + if (nparameters < 0) nparameters = 0; + } + + /* allocate some memory, build the SQL and create a PyString from it */ + sl = strlen(procname) + 10 + nparameters*3 - (nparameters ? 1 : 0); + sql = (char*)PyMem_Malloc(sl); + if (sql == NULL) return NULL; + + sprintf(sql, "SELECT %s(", procname); + for(i=0; iname == NULL) { + if (strcmp(mode, "relative") == 0) { + newpos = self->row + value; + } else if (strcmp( mode, "absolute") == 0) { + newpos = value; + } else { + psyco_set_error(ProgrammingError, (PyObject*)self, + "scroll mode must be 'relative' or 'absolute'", NULL, NULL); + return NULL; + } + + if (newpos < 0 || newpos >= self->rowcount ) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "scroll destination out of bounds", NULL, NULL); + return NULL; + } + + self->row = newpos; + } + + else { + char buffer[128]; + + EXC_IF_NO_MARK(self); + + if (strcmp(mode, "absolute") == 0) { + PyOS_snprintf(buffer, 127, "MOVE ABSOLUTE %d FROM %s", + value, self->name); + } + else { + PyOS_snprintf(buffer, 127, "MOVE %d FROM %s", value, self->name); + } + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + + +#ifdef PSYCOPG_EXTENSIONS + +/* extension: copy_from - implements COPY FROM */ + +#define psyco_curs_copy_from_doc \ +"copy_from(file, table, sep='\\t', null='\\N', columns=None) -- Copy table from file." + +static int +_psyco_curs_has_read_check(PyObject* o, void* var) +{ + if (PyObject_HasAttrString(o, "readline") + && PyObject_HasAttrString(o, "read")) { + Py_INCREF(o); + *((PyObject**)var) = o; + return 1; + } + else { + PyErr_SetString(PyExc_TypeError, + "argument 1 must have both .read() and .readline() methods"); + return 0; + } +} + +static PyObject * +psyco_curs_copy_from(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + char query[1024]; + char *table_name; + char *sep = "\t", *null = NULL; + long int bufsize = DEFAULT_COPYSIZE; + PyObject *file, *columns = NULL, *res = NULL; + char columnlist[1024] = ""; + + static char *kwlist[] = {"file", "table", "sep", "null", "size", + "columns", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&s|ssiO", kwlist, + _psyco_curs_has_read_check, &file, + &table_name, &sep, &null, &bufsize, + &columns)) { + return NULL; + } + + if (columns != NULL && columns != Py_None) { + PyObject* collistiter = PyObject_GetIter(columns); + PyObject* col; + int collistlen = 2; + int colitemlen; + char* colname; + if (collistiter == NULL) { + return NULL; + } + strcpy(columnlist, " ("); + while ((col = PyIter_Next(collistiter)) != NULL) { + if (!PyString_Check(col)) { + Py_DECREF(col); + Py_DECREF(collistiter); + PyErr_SetString(PyExc_ValueError, + "Elements in column list must be strings"); + return NULL; + } + PyString_AsStringAndSize(col, &colname, &colitemlen); + if (collistlen + colitemlen > 1022) { + Py_DECREF(col); + Py_DECREF(collistiter); + PyErr_SetString(PyExc_ValueError, "Column list too long"); + return NULL; + } + strncpy(&columnlist[collistlen], colname, colitemlen); + collistlen += colitemlen; + columnlist[collistlen++] = ','; + Py_DECREF(col); + } + Py_DECREF(collistiter); + + if (collistlen == 2) { /* empty list; we printed no comma */ + collistlen++; + } + + columnlist[collistlen - 1] = ')'; + columnlist[collistlen] = '\0'; + } + + if (PyErr_Occurred()) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (null) { + PyOS_snprintf(query, 1023, "COPY %s%s FROM stdin USING DELIMITERS '%s'" + " WITH NULL AS '%s'", table_name, columnlist, sep, null); + } + else { + PyOS_snprintf(query, 1023, "COPY %s%s FROM stdin USING DELIMITERS '%s'", + table_name, columnlist, sep); + } + Dprintf("psyco_curs_copy_from: query = %s", query); + + self->copysize = bufsize; + self->copyfile = file; + + if (pq_execute(self, query, 0) == 1) { + res = Py_None; + Py_INCREF(Py_None); + } + + self->copyfile =NULL; + + return res; +} + +#define psyco_curs_copy_to_doc \ +"copy_to(file, table, sep='\\t', null='\\N') -- Copy table to file." + +static int +_psyco_curs_has_write_check(PyObject* o, void* var) +{ + if (PyObject_HasAttrString(o, "write")) { + Py_INCREF(o); + *((PyObject**)var) = o; + return 1; + } + else { + PyErr_SetString(PyExc_TypeError, + "argument 1 must have a .write() method"); + return 0; + } +} + +static PyObject * +psyco_curs_copy_to(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + char query[256]; + char *table_name; + char *sep = "\t", *null = NULL; + PyObject *file, *res = NULL; + + static char *kwlist[] = {"file", "table", "sep", "null", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&s|ss", kwlist, + _psyco_curs_has_write_check, &file, + &table_name, &sep, &null)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (null) { + PyOS_snprintf(query, 255, "COPY %s TO stdout USING DELIMITERS '%s'" + " WITH NULL AS '%s'", table_name, sep, null); + } + else { + PyOS_snprintf(query, 255, "COPY %s TO stdout USING DELIMITERS '%s'", + table_name, sep); + } + + self->copysize = 0; + self->copyfile = file; + + if (pq_execute(self, query, 0) == 1) { + res = Py_None; + Py_INCREF(Py_None); + } + + self->copyfile = NULL; + + return res; +} +/* extension: fileno - return the file descripor of the connection */ + +#define psyco_curs_fileno_doc \ +"fileno() -> int -- Return file descriptor associated to database connection." + +static PyObject * +psyco_curs_fileno(cursorObject *self, PyObject *args) +{ + long int socket; + + if (!PyArg_ParseTuple(args, "")) return NULL; + EXC_IF_CURS_CLOSED(self); + + /* note how we call PQflush() to make sure the user will use + select() in the safe way! */ + pthread_mutex_lock(&(self->conn->lock)); + Py_BEGIN_ALLOW_THREADS; + PQflush(self->conn->pgconn); + socket = (long int)PQsocket(self->conn->pgconn); + Py_END_ALLOW_THREADS; + pthread_mutex_unlock(&(self->conn->lock)); + + return PyInt_FromLong(socket); +} + +/* extension: isready - return true if data from async execute is ready */ + +#define psyco_curs_isready_doc \ +"isready() -> bool -- Return True if data is ready after an async query." + +static PyObject * +psyco_curs_isready(cursorObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + EXC_IF_CURS_CLOSED(self); + + /* pq_is_busy does its own locking, we don't need anything special but if + the cursor is ready we need to fetch the result and free the connection + for the next query. */ + + if (pq_is_busy(self->conn)) { + Py_INCREF(Py_False); + return Py_False; + } + else { + IFCLEARPGRES(self->pgres); + pthread_mutex_lock(&(self->conn->lock)); + self->pgres = PQgetResult(self->conn->pgconn); + self->conn->async_cursor = NULL; + pthread_mutex_unlock(&(self->conn->lock)); + self->needsfetch = 1; + Py_INCREF(Py_True); + return Py_True; + } +} + +#endif + + +/** the cursor object **/ + +/* iterator protocol */ + +static PyObject * +cursor_iter(PyObject *self) +{ + EXC_IF_CURS_CLOSED((cursorObject*)self); + Py_INCREF(self); + return self; +} + +static PyObject * +cursor_next(PyObject *self) +{ + PyObject *res; + + /* we don't parse arguments: psyco_curs_fetchone will do that for us */ + res = psyco_curs_fetchone((cursorObject*)self, NULL); + + /* convert a None to NULL to signal the end of iteration */ + if (res && res == Py_None) { + Py_DECREF(res); + res = NULL; + } + return res; +} + +/* object method list */ + +static struct PyMethodDef cursorObject_methods[] = { + /* DBAPI-2.0 core */ + {"close", (PyCFunction)psyco_curs_close, + METH_VARARGS, psyco_curs_close_doc}, + {"execute", (PyCFunction)psyco_curs_execute, + METH_VARARGS|METH_KEYWORDS, psyco_curs_execute_doc}, + {"executemany", (PyCFunction)psyco_curs_executemany, + METH_VARARGS|METH_KEYWORDS, psyco_curs_executemany_doc}, + {"fetchone", (PyCFunction)psyco_curs_fetchone, + METH_VARARGS, psyco_curs_fetchone_doc}, + {"fetchmany", (PyCFunction)psyco_curs_fetchmany, + METH_VARARGS|METH_KEYWORDS, psyco_curs_fetchmany_doc}, + {"fetchall", (PyCFunction)psyco_curs_fetchall, + METH_VARARGS, psyco_curs_fetchall_doc}, + {"callproc", (PyCFunction)psyco_curs_callproc, + METH_VARARGS, psyco_curs_callproc_doc}, + {"nextset", (PyCFunction)psyco_curs_nextset, + METH_VARARGS, psyco_curs_nextset_doc}, + {"setinputsizes", (PyCFunction)psyco_curs_setinputsizes, + METH_VARARGS, psyco_curs_setinputsizes_doc}, + {"setoutputsize", (PyCFunction)psyco_curs_setoutputsize, + METH_VARARGS, psyco_curs_setoutputsize_doc}, + /* DBAPI-2.0 extensions */ + {"scroll", (PyCFunction)psyco_curs_scroll, + METH_VARARGS|METH_KEYWORDS, psyco_curs_scroll_doc}, + /* psycopg extensions */ +#ifdef PSYCOPG_EXTENSIONS + {"mogrify", (PyCFunction)psyco_curs_mogrify, + METH_VARARGS|METH_KEYWORDS, psyco_curs_mogrify_doc}, + {"fileno", (PyCFunction)psyco_curs_fileno, + METH_VARARGS, psyco_curs_fileno_doc}, + {"isready", (PyCFunction)psyco_curs_isready, + METH_VARARGS, psyco_curs_isready_doc}, + {"copy_from", (PyCFunction)psyco_curs_copy_from, + METH_VARARGS|METH_KEYWORDS, psyco_curs_copy_from_doc}, + {"copy_to", (PyCFunction)psyco_curs_copy_to, + METH_VARARGS|METH_KEYWORDS, psyco_curs_copy_to_doc}, +#endif + {NULL} +}; + +/* object member list */ + +#define OFFSETOF(x) offsetof(cursorObject, x) + +static struct PyMemberDef cursorObject_members[] = { + /* DBAPI-2.0 basics */ + {"rowcount", T_LONG, OFFSETOF(rowcount), RO, + "Number of rows read from the backend in the last command."}, + {"arraysize", T_LONG, OFFSETOF(arraysize), 0, + "Number of records `fetchmany()` must fetch if not explicitely " \ + "specified."}, + {"description", T_OBJECT, OFFSETOF(description), RO, + "Cursor description as defined in DBAPI-2.0."}, + {"lastrowid", T_LONG, OFFSETOF(lastoid), RO, + "The ``oid`` of the last row inserted by the cursor."}, + /* DBAPI-2.0 extensions */ + {"rownumber", T_LONG, OFFSETOF(row), RO, + "The current row position."}, + {"connection", T_OBJECT, OFFSETOF(conn), RO, + "The connection where the cursor comes from."}, +#ifdef PSYCOPG_EXTENSIONS + {"name", T_STRING, OFFSETOF(name), RO}, + {"statusmessage", T_OBJECT, OFFSETOF(pgstatus), RO, + "The return message of the last command."}, + {"query", T_OBJECT, OFFSETOF(query), RO, + "The last query text sent to the backend."}, + {"row_factory", T_OBJECT, OFFSETOF(tuple_factory), 0}, + {"tzinfo_factory", T_OBJECT, OFFSETOF(tzinfo_factory), 0}, + {"typecaster", T_OBJECT, OFFSETOF(caster), RO}, + {"string_types", T_OBJECT, OFFSETOF(string_types), 0}, + {"binary_types", T_OBJECT, OFFSETOF(binary_types), 0}, +#endif + {NULL} +}; + +/* initialization and finalization methods */ + +static int +cursor_setup(cursorObject *self, connectionObject *conn, char *name) +{ + Dprintf("cursor_setup: init cursor object at %p", self); + Dprintf("cursor_setup: parameters: name = %s, conn = %p", name, conn); + + if (name) { + self->name = PyMem_Malloc(strlen(name)+1); + if (self->name == NULL) return 1; + strncpy(self->name, name, strlen(name)+1); + } + + /* FIXME: why does this raise an excpetion on the _next_ line of code? + if (PyObject_IsInstance((PyObject*)conn, + (PyObject *)&connectionType) == 0) { + PyErr_SetString(PyExc_TypeError, + "argument 1 must be subclass of psycopg2._psycopg.connection"); + return 1; + } */ + self->conn = conn; + Py_INCREF((PyObject*)self->conn); + + self->closed = 0; + self->mark = conn->mark; + self->pgres = NULL; + self->notuples = 1; + self->arraysize = 1; + self->rowcount = -1; + self->lastoid = InvalidOid; + + self->casts = NULL; + self->notice = NULL; + + self->string_types = NULL; + self->binary_types = NULL; + + self->description = Py_None; + Py_INCREF(Py_None); + self->pgstatus = Py_None; + Py_INCREF(Py_None); + self->tuple_factory = Py_None; + Py_INCREF(Py_None); + self->query = Py_None; + Py_INCREF(Py_None); + + /* default tzinfo factory */ + self->tzinfo_factory = pyPsycopgTzFixedOffsetTimezone; + Py_INCREF(self->tzinfo_factory); + + Dprintf("cursor_setup: good cursor object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +cursor_dealloc(PyObject* obj) +{ + cursorObject *self = (cursorObject *)obj; + + if (self->name) PyMem_Free(self->name); + + Py_XDECREF((PyObject*)self->conn); + Py_XDECREF(self->casts); + Py_XDECREF(self->description); + Py_XDECREF(self->pgstatus); + Py_XDECREF(self->tuple_factory); + Py_XDECREF(self->tzinfo_factory); + Py_XDECREF(self->query); + + IFCLEARPGRES(self->pgres); + + Dprintf("cursor_dealloc: deleted cursor object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +cursor_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + char *name = NULL; + PyObject *conn; + + if (!PyArg_ParseTuple(args, "O|s", &conn, &name)) + return -1; + + return cursor_setup((cursorObject *)obj, (connectionObject *)conn, name); +} + +static PyObject * +cursor_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +cursor_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +cursor_repr(cursorObject *self) +{ + return PyString_FromFormat( + "", self, self->closed); +} + + +/* object type */ + +#define cursorType_doc \ +"A database cursor." + +PyTypeObject cursorType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.cursor", + sizeof(cursorObject), + 0, + cursor_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + (reprfunc)cursor_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)cursor_repr, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ + cursorType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + cursor_iter, /*tp_iter*/ + cursor_next, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + cursorObject_methods, /*tp_methods*/ + cursorObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + cursor_init, /*tp_init*/ + 0, /*tp_alloc Will be set to PyType_GenericAlloc in module init*/ + cursor_new, /*tp_new*/ + (freefunc)cursor_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; diff --git a/psycopg2/psycopg/microprotocols.c b/psycopg2/psycopg/microprotocols.c new file mode 100644 index 0000000..73abbfc --- /dev/null +++ b/psycopg2/psycopg/microprotocols.c @@ -0,0 +1,161 @@ +/* microprotocols.c - minimalist and non-validating protocols implementation + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/cursor.h" +#include "psycopg/connection.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" + + +/** the adapters registry **/ + +PyObject *psyco_adapters; + +/* microprotocols_init - initialize the adapters dictionary */ + +int +microprotocols_init(PyObject *dict) +{ + /* create adapters dictionary and put it in module namespace */ + if ((psyco_adapters = PyDict_New()) == NULL) { + return -1; + } + + PyDict_SetItemString(dict, "adapters", psyco_adapters); + + return 0; +} + + +/* microprotocols_add - add a reverse type-caster to the dictionary */ + +int +microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast) +{ + if (proto == NULL) proto = (PyObject*)&isqlquoteType; + + Dprintf("microprotocols_add: cast %p for (%s, ?)", cast, type->tp_name); + + PyDict_SetItem(psyco_adapters, + Py_BuildValue("(OO)", (PyObject*)type, proto), + cast); + return 0; +} + +/* microprotocols_adapt - adapt an object to the built-in protocol */ + +PyObject * +microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) +{ + PyObject *adapter, *key; + + /* we don't check for exact type conformance as specified in PEP 246 + because the ISQLQuote type is abstract and there is no way to get a + quotable object to be its instance */ + + Dprintf("microprotocols_adapt: trying to adapt %s", obj->ob_type->tp_name); + + /* look for an adapter in the registry */ + key = Py_BuildValue("(OO)", (PyObject*)obj->ob_type, proto); + adapter = PyDict_GetItem(psyco_adapters, key); + Py_DECREF(key); + if (adapter) { + PyObject *adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL); + return adapted; + } + + /* try to have the protocol adapt this object*/ + if (PyObject_HasAttrString(proto, "__adapt__")) { + PyObject *adapted = PyObject_CallMethod(proto, "__adapt__", "O", obj); + if (adapted && adapted != Py_None) return adapted; + Py_XDECREF(adapted); + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) + return NULL; + } + + /* and finally try to have the object adapt itself */ + if (PyObject_HasAttrString(obj, "__conform__")) { + PyObject *adapted = PyObject_CallMethod(obj, "__conform__","O", proto); + if (adapted && adapted != Py_None) return adapted; + Py_XDECREF(adapted); + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) + return NULL; + } + + /* else set the right exception and return NULL */ + psyco_set_error(ProgrammingError, NULL, "can't adapt", NULL, NULL); + return NULL; +} + +/* microprotocol_getquoted - utility function that adapt and call getquoted */ + +PyObject * +microprotocol_getquoted(PyObject *obj, connectionObject *conn) +{ + PyObject *res = NULL; + PyObject *tmp = microprotocols_adapt( + obj, (PyObject*)&isqlquoteType, NULL); + + if (tmp != NULL) { + Dprintf("microprotocol_getquoted: adapted to %s", + tmp->ob_type->tp_name); + + /* if requested prepare the object passing it the connection */ + if (PyObject_HasAttrString(tmp, "prepare") && conn) { + res = PyObject_CallMethod(tmp, "prepare", "O", (PyObject*)conn); + if (res == NULL) { + Py_DECREF(tmp); + return NULL; + } + else { + Py_DECREF(res); + } + } + + /* call the getquoted method on tmp (that should exist because we + adapted to the right protocol) */ + res = PyObject_CallMethod(tmp, "getquoted", NULL); + Py_DECREF(tmp); + } + + /* we return res with one extra reference, the caller shall free it */ + return res; +} + + +/** module-level functions **/ + +PyObject * +psyco_microprotocols_adapt(cursorObject *self, PyObject *args) +{ + PyObject *obj, *alt = NULL; + PyObject *proto = (PyObject*)&isqlquoteType; + + if (!PyArg_ParseTuple(args, "O|OO", &obj, &proto, &alt)) return NULL; + return microprotocols_adapt(obj, proto, alt); +} diff --git a/psycopg2/psycopg/microprotocols.h b/psycopg2/psycopg/microprotocols.h new file mode 100644 index 0000000..5501a7c --- /dev/null +++ b/psycopg2/psycopg/microprotocols.h @@ -0,0 +1,60 @@ +/* microprotocols.c - definitions for minimalist and non-validating protocols + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_MICROPROTOCOLS_H +#define PSYCOPG_MICROPROTOCOLS_H 1 + +#include +#include "psycopg/connection.h" +#include "psycopg/cursor.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** adapters registry **/ + +extern PyObject *psyco_adapters; + +/** the names of the three mandatory methods **/ + +#define MICROPROTOCOLS_GETQUOTED_NAME "getquoted" +#define MICROPROTOCOLS_GETSTRING_NAME "getstring" +#define MICROPROTOCOLS_GETBINARY_NAME "getbinary" + +/** exported functions **/ + +/* used by module.c to init the microprotocols system */ +extern int microprotocols_init(PyObject *dict); +extern int microprotocols_add( + PyTypeObject *type, PyObject *proto, PyObject *cast); + +extern PyObject *microprotocols_adapt( + PyObject *obj, PyObject *proto, PyObject *alt); +extern PyObject *microprotocol_getquoted( + PyObject *obj, connectionObject *conn); + +extern PyObject * + psyco_microprotocols_adapt(cursorObject *self, PyObject *args); +#define psyco_microprotocols_adapt_doc \ + "adapt(obj, protocol, alternate) -> object -- adapt obj to given protocol" + +#endif /* !defined(PSYCOPG_MICROPROTOCOLS_H) */ diff --git a/psycopg2/psycopg/microprotocols_proto.c b/psycopg2/psycopg/microprotocols_proto.c new file mode 100644 index 0000000..72c3a7e --- /dev/null +++ b/psycopg2/psycopg/microprotocols_proto.c @@ -0,0 +1,216 @@ +/* microprotocol_proto.c - psycopg protocols + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/microprotocols_proto.h" + + +/** void protocol implementation **/ + + +/* getquoted - return quoted representation for object */ + +#define psyco_isqlquote_getquoted_doc \ +"getquoted() -- return SQL-quoted representation of this object" + +static PyObject * +psyco_isqlquote_getquoted(isqlquoteObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + Py_INCREF(Py_None); + return Py_None; +} + +/* getbinary - return quoted representation for object */ + +#define psyco_isqlquote_getbinary_doc \ +"getbinary() -- return SQL-quoted binary representation of this object" + +static PyObject * +psyco_isqlquote_getbinary(isqlquoteObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + Py_INCREF(Py_None); + return Py_None; +} + +/* getbuffer - return quoted representation for object */ + +#define psyco_isqlquote_getbuffer_doc \ +"getbuffer() -- return this object" + +static PyObject * +psyco_isqlquote_getbuffer(isqlquoteObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + Py_INCREF(Py_None); + return Py_None; +} + + + +/** the ISQLQuote object **/ + + +/* object method list */ + +static struct PyMethodDef isqlquoteObject_methods[] = { + {"getquoted", (PyCFunction)psyco_isqlquote_getquoted, + METH_VARARGS, psyco_isqlquote_getquoted_doc}, + {"getbinary", (PyCFunction)psyco_isqlquote_getbinary, + METH_VARARGS, psyco_isqlquote_getbinary_doc}, + {"getbuffer", (PyCFunction)psyco_isqlquote_getbuffer, + METH_VARARGS, psyco_isqlquote_getbuffer_doc}, + /* {"prepare", (PyCFunction)psyco_isqlquote_prepare, + METH_VARARGS, psyco_isqlquote_prepare_doc}, */ + {NULL} +}; + +/* object member list */ + +static struct PyMemberDef isqlquoteObject_members[] = { + /* DBAPI-2.0 extensions (exception objects) */ + {"_wrapped", T_OBJECT, offsetof(isqlquoteObject, wrapped), RO}, + {NULL} +}; + +/* initialization and finalization methods */ + +static int +isqlquote_setup(isqlquoteObject *self, PyObject *wrapped) +{ + self->wrapped = wrapped; + Py_INCREF(wrapped); + + return 0; +} + +static void +isqlquote_dealloc(PyObject* obj) +{ + isqlquoteObject *self = (isqlquoteObject *)obj; + + Py_XDECREF(self->wrapped); + + obj->ob_type->tp_free(obj); +} + +static int +isqlquote_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *wrapped = NULL; + + if (!PyArg_ParseTuple(args, "O", &wrapped)) + return -1; + + return isqlquote_setup((isqlquoteObject *)obj, wrapped); +} + +static PyObject * +isqlquote_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +isqlquote_del(PyObject* self) +{ + PyObject_Del(self); +} + + +/* object type */ + +#define isqlquoteType_doc \ +"Abstract ISQLQuote protocol\n\n" \ +"An object conform to this protocol should expose a ``getquoted()`` method\n" \ +"returning the SQL representation of the object.\n\n" + +PyTypeObject isqlquoteType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.ISQLQuote", + sizeof(isqlquoteObject), + 0, + isqlquote_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + isqlquoteType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + isqlquoteObject_methods, /*tp_methods*/ + isqlquoteObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + isqlquote_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + isqlquote_new, /*tp_new*/ + (freefunc)isqlquote_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; diff --git a/psycopg2/psycopg/microprotocols_proto.h b/psycopg2/psycopg/microprotocols_proto.h new file mode 100644 index 0000000..c671264 --- /dev/null +++ b/psycopg2/psycopg/microprotocols_proto.h @@ -0,0 +1,45 @@ +/* microporotocols_proto.h - definiton for psycopg's protocols + * + * Copyright (C) 2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_ISQLQUOTE_H +#define PSYCOPG_ISQLQUOTE_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject isqlquoteType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + +} isqlquoteObject; + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_ISQLQUOTE_H) */ diff --git a/psycopg2/psycopg/pgtypes.h b/psycopg2/psycopg/pgtypes.h new file mode 100644 index 0000000..1fdbda9 --- /dev/null +++ b/psycopg2/psycopg/pgtypes.h @@ -0,0 +1,65 @@ +#define BOOLOID 16 +#define BYTEAOID 17 +#define CHAROID 18 +#define NAMEOID 19 +#define INT8OID 20 +#define INT2OID 21 +#define INT2VECTOROID 22 +#define INT4OID 23 +#define REGPROCOID 24 +#define TEXTOID 25 +#define OIDOID 26 +#define TIDOID 27 +#define XIDOID 28 +#define CIDOID 29 +#define OIDVECTOROID 30 +#define PG_TYPE_RELTYPE_OID 71 +#define PG_ATTRIBUTE_RELTYPE_OID 75 +#define PG_PROC_RELTYPE_OID 81 +#define PG_CLASS_RELTYPE_OID 83 +#define POINTOID 600 +#define LSEGOID 601 +#define PATHOID 602 +#define BOXOID 603 +#define POLYGONOID 604 +#define LINEOID 628 +#define FLOAT4OID 700 +#define FLOAT8OID 701 +#define ABSTIMEOID 702 +#define RELTIMEOID 703 +#define TINTERVALOID 704 +#define UNKNOWNOID 705 +#define CIRCLEOID 718 +#define CASHOID 790 +#define MACADDROID 829 +#define INETOID 869 +#define CIDROID 650 +#define INT4ARRAYOID 1007 +#define ACLITEMOID 1033 +#define BPCHAROID 1042 +#define VARCHAROID 1043 +#define DATEOID 1082 +#define TIMEOID 1083 +#define TIMESTAMPOID 1114 +#define TIMESTAMPTZOID 1184 +#define INTERVALOID 1186 +#define TIMETZOID 1266 +#define BITOID 1560 +#define VARBITOID 1562 +#define NUMERICOID 1700 +#define REFCURSOROID 1790 +#define REGPROCEDUREOID 2202 +#define REGOPEROID 2203 +#define REGOPERATOROID 2204 +#define REGCLASSOID 2205 +#define REGTYPEOID 2206 +#define RECORDOID 2249 +#define CSTRINGOID 2275 +#define ANYOID 2276 +#define ANYARRAYOID 2277 +#define VOIDOID 2278 +#define TRIGGEROID 2279 +#define LANGUAGE_HANDLEROID 2280 +#define INTERNALOID 2281 +#define OPAQUEOID 2282 +#define ANYELEMENTOID 2283 diff --git a/psycopg2/psycopg/pgversion.h b/psycopg2/psycopg/pgversion.h new file mode 100644 index 0000000..f874a9a --- /dev/null +++ b/psycopg2/psycopg/pgversion.h @@ -0,0 +1,2 @@ +#define PG_VERSION_MAJOR 7 +#define PG_VERSION_MINOR 4 diff --git a/psycopg2/psycopg/pqpath.c b/psycopg2/psycopg/pqpath.c new file mode 100644 index 0000000..1ebb569 --- /dev/null +++ b/psycopg2/psycopg/pqpath.c @@ -0,0 +1,883 @@ +/* pqpath.c - single path into libpq + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* IMPORTANT NOTE: no function in this file do its own connection locking + except for pg_execute and pq_fetch (that are somehow high-level. This means + that all the othe functions should be called while holding a lock to the + connection. +*/ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/pqpath.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" +#include "psycopg/typecast.h" +#include "psycopg/pgtypes.h" +#include "psycopg/pgversion.h" + +/* pq_raise - raise a python exception of the right kind + + This function should be called while holding the GIL. */ + +void +pq_raise(connectionObject *conn, cursorObject *curs, PyObject *exc, char *msg) +{ + PyObject *pgc = (PyObject*)curs; + + char *err = NULL; + char *err2 = NULL; + char *code = NULL; + char *buf = NULL; + + if ((conn == NULL && curs == NULL) || (curs != NULL && conn == NULL)) { + PyErr_SetString(Error, "psycopg went psycotic and raised a null error"); + return; + } + + if (curs && curs->pgres) { + err = PQresultErrorMessage(curs->pgres); +#ifdef HAVE_PQPROTOCOL3 + if (err != NULL && conn->protocol == 3) { + code = PQresultErrorField(curs->pgres, PG_DIAG_SQLSTATE); + } +#endif + } + if (err == NULL) + err = PQerrorMessage(conn->pgconn); + + /* if the is no error message we probably called pq_raise without reason: + we need to set an exception anyway because the caller will probably + raise and a meaningful message is better than an empty one */ + if (err == NULL) { + PyErr_SetString(Error, "psycopg went psycotic without error set"); + return; + } + + /* if exc is NULL, analyze the message and try to deduce the right + exception kind (only if we have a pgres, obviously) */ + if (exc == NULL) { + if (curs && curs->pgres) { + if (conn->protocol == 3) { +#ifdef HAVE_PQPROTOCOL3 + char *pgstate = + PQresultErrorField(curs->pgres, PG_DIAG_SQLSTATE); + if (pgstate != NULL && !strncmp(pgstate, "23", 2)) + exc = IntegrityError; + else + exc = ProgrammingError; +#endif + } + } + } + + /* if exc is still NULL psycopg was not built with HAVE_PQPROTOCOL3 or the + connection is using protocol 2: in both cases we default to comparing + error messages */ + if (exc == NULL) { + if (!strncmp(err, "ERROR: Cannot insert a duplicate key", 37) + || !strncmp(err, "ERROR: ExecAppend: Fail to add null", 36) + || strstr(err, "referential integrity violation")) + exc = IntegrityError; + else + exc = ProgrammingError; + } + + /* try to remove the initial "ERROR: " part from the postgresql error */ + if (err && strlen(err) > 8) err2 = &(err[8]); + else err2 = err; + + /* if msg is not NULL, add it to the error message, after a '\n' */ + if (msg && code) { + int len = strlen(code) + strlen(err) + strlen(msg) + 5; + if ((buf = PyMem_Malloc(len))) { + snprintf(buf, len, "[%s] %s\n%s", code, err2, msg); + psyco_set_error(exc, pgc, buf, err, code); + } + } + else if (msg) { + int len = strlen(err) + strlen(msg) + 2; + if ((buf = PyMem_Malloc(len))) { + snprintf(buf, len, "%s\n%s", err2, msg); + psyco_set_error(exc, pgc, buf, err, code); + } + } + else { + psyco_set_error(exc, pgc, err2, err, code); + } + + if (buf != NULL) PyMem_Free(buf); +} + +/* pq_set_critical, pq_resolve_critical - manage critical errors + + this function is invoked when a PQexec() call returns NULL, meaning a + critical condition like out of memory or lost connection. it save the error + message and mark the connection as 'wanting cleanup'. + + both functions do not call any Py_*_ALLOW_THREADS macros. + pq_resolve_critical should be called while holding the GIL. */ + +void +pq_set_critical(connectionObject *conn, const char *msg) +{ + if (msg == NULL) + msg = PQerrorMessage(conn->pgconn); + if (conn->critical) free(conn->critical); + if (msg && msg[0] != '\0') conn->critical = strdup(msg); + else conn->critical = NULL; +} + +PyObject * +pq_resolve_critical(connectionObject *conn, int close) +{ + Dprintf("pq_resolve_critical: resolving %s", conn->critical); + + if (conn->critical) { + char *msg = &(conn->critical[6]); + Dprintf("pq_resolve_critical: error = %s", msg); + /* we can't use pq_raise because the error has already been cleared + from the connection, so we just raise an OperationalError with the + critical message */ + PyErr_SetString(OperationalError, msg); + + /* we don't want to destroy this connection but just close it */ + if (close == 1) conn_close(conn); + } + return NULL; +} + +/* pq_clear_async - clear the effects of a previous async query + + note that this function does block because it needs to wait for the full + result sets of the previous query to clear them. + + + this function does not call any Py_*_ALLOW_THREADS macros */ + +void +pq_clear_async(connectionObject *conn) +{ + PGresult *pgres; + + do { + pgres = PQgetResult(conn->pgconn); + Dprintf("pq_clear_async: clearing PGresult at %p", pgres); + IFCLEARPGRES(pgres); + } while (pgres != NULL); +} + +/* pq_begin - send a BEGIN WORK, if necessary + + this function does not call any Py_*_ALLOW_THREADS macros */ + +int +pq_begin(connectionObject *conn) +{ + const char *query[] = { + NULL, + "BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED", + "BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"}; + + int pgstatus, retvalue = -1; + PGresult *pgres = NULL; + + Dprintf("pq_begin: pgconn = %p, isolevel = %ld, status = %d", + conn->pgconn, conn->isolation_level, conn->status); + + if (conn->isolation_level == 0 || conn->status != CONN_STATUS_READY) { + Dprintf("pq_begin: transaction in progress"); + return 0; + } + + pq_clear_async(conn); + pgres = PQexec(conn->pgconn, query[conn->isolation_level]); + if (pgres == NULL) { + Dprintf("pq_begin: PQexec() failed"); + pq_set_critical(conn, NULL); + goto cleanup; + } + + pgstatus = PQresultStatus(pgres); + if (pgstatus != PGRES_COMMAND_OK ) { + Dprintf("pq_begin: result is NOT OK"); + pq_set_critical(conn, NULL); + goto cleanup; + } + Dprintf("pq_begin: issued '%s' command", query[conn->isolation_level]); + + retvalue = 0; + conn->status = CONN_STATUS_BEGIN; + + cleanup: + IFCLEARPGRES(pgres); + return retvalue; +} + +/* pq_commit - send an END, if necessary + + this function does not call any Py_*_ALLOW_THREADS macros */ + +int +pq_commit(connectionObject *conn) +{ + const char *query = "END"; + int pgstatus, retvalue = -1; + PGresult *pgres = NULL; + + Dprintf("pq_commit: pgconn = %p, isolevel = %ld, status = %d", + conn->pgconn, conn->isolation_level, conn->status); + + if (conn->isolation_level == 0 || conn->status != CONN_STATUS_BEGIN) { + Dprintf("pq_commit: no transaction to commit"); + return 0; + } + + pq_clear_async(conn); + pgres = PQexec(conn->pgconn, query); + if (pgres == NULL) { + Dprintf("pq_commit: PQexec() failed"); + pq_set_critical(conn, NULL); + goto cleanup; + } + + pgstatus = PQresultStatus(pgres); + if (pgstatus != PGRES_COMMAND_OK ) { + Dprintf("pq_commit: result is NOT OK"); + pq_set_critical(conn, NULL); + goto cleanup; + } + Dprintf("pq_commit: issued '%s' command", query); + + retvalue = 0; + conn->status = CONN_STATUS_READY; + + cleanup: + IFCLEARPGRES(pgres); + return retvalue; +} + +/* pq_abort - send an ABORT, if necessary + + this function does not call any Py_*_ALLOW_THREADS macros */ + +int +pq_abort(connectionObject *conn) +{ + const char *query = "ABORT"; + int pgstatus, retvalue = -1; + PGresult *pgres = NULL; + + Dprintf("pq_abort: pgconn = %p, isolevel = %ld, status = %d", + conn->pgconn, conn->isolation_level, conn->status); + + if (conn->isolation_level == 0 || conn->status != CONN_STATUS_BEGIN) { + Dprintf("pq_abort: no transaction to abort"); + return 0; + } + + pq_clear_async(conn); + pgres = PQexec(conn->pgconn, query); + if (pgres == NULL) { + Dprintf("pq_abort: PQexec() failed"); + pq_set_critical(conn, NULL); + goto cleanup; + } + + pgstatus = PQresultStatus(pgres); + if (pgstatus != PGRES_COMMAND_OK ) { + Dprintf("pq_abort: result is NOT OK"); + pq_set_critical(conn, NULL); + goto cleanup; + } + Dprintf("pq_abort: issued '%s' command", query); + + retvalue = 0; + conn->status = CONN_STATUS_READY; + + cleanup: + IFCLEARPGRES(pgres); + return retvalue; +} + +/* pq_is_busy - consume input and return connection status + + a status of 1 means that a call to pq_fetch will block, while a status of 0 + means that there is data available to be collected. -1 means an error, the + exception will be set accordingly. + + this fucntion locks the connection object + this function call Py_*_ALLOW_THREADS macros */ + +int +pq_is_busy(connectionObject *conn) +{ + PGnotify *pgn; + + Dprintf("pq_is_busy: consuming input"); + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&(conn->lock)); + + if (PQconsumeInput(conn->pgconn) == 0) { + Dprintf("pq_is_busy: PQconsumeInput() failed"); + pthread_mutex_unlock(&(conn->lock)); + Py_BLOCK_THREADS; + PyErr_SetString(OperationalError, PQerrorMessage(conn->pgconn)); + return -1; + } + + pthread_mutex_unlock(&(conn->lock)); + Py_END_ALLOW_THREADS; + + /* now check for notifies */ + while ((pgn = PQnotifies(conn->pgconn)) != NULL) { + PyObject *notify; + + Dprintf("curs_is_busy: got NOTIFY from pid %d, msg = %s", + pgn->be_pid, pgn->relname); + + notify = PyTuple_New(2); + PyTuple_SET_ITEM(notify, 0, PyInt_FromLong((long)pgn->be_pid)); + PyTuple_SET_ITEM(notify, 1, PyString_FromString(pgn->relname)); + PyList_Append(conn->notifies, notify); + free(pgn); + } + + return PQisBusy(conn->pgconn); +} + +/* pq_execute - execute a query, possibly asyncronously + + this fucntion locks the connection object + this function call Py_*_ALLOW_THREADS macros */ + +int +pq_execute(cursorObject *curs, const char *query, int async) +{ + /* if the status of the connection is critical raise an exception and + definitely close the connection */ + if (curs->conn->critical) { + pq_resolve_critical(curs->conn, 1); + return -1; + } + + /* check status of connection, raise error if not OK */ + if (PQstatus(curs->conn->pgconn) != CONNECTION_OK) { + Dprintf("pq_execute: connection NOT OK"); + PyErr_SetString(OperationalError, PQerrorMessage(curs->conn->pgconn)); + return -1; + } + Dprintf("curs_execute: pg connection at %p OK", curs->conn->pgconn); + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&(curs->conn->lock)); + + pq_begin(curs->conn); + + if (async == 0) { + IFCLEARPGRES(curs->pgres); + Dprintf("pq_execute: executing SYNC query:"); + Dprintf(" %-.200s", query); + curs->pgres = PQexec(curs->conn->pgconn, query); + } + + else if (async == 1) { + /* first of all, let see if the previous query has already ended, if + not what should we do? just block and discard data or execute + another query? */ + pq_clear_async(curs->conn); + + Dprintf("pq_execute: executing ASYNC query:"); + Dprintf(" %-.200s", query); + + /* then we can go on and send a new query without fear */ + IFCLEARPGRES(curs->pgres); + if (PQsendQuery(curs->conn->pgconn, query) == 0) { + pthread_mutex_unlock(&(curs->conn->lock)); + Py_BLOCK_THREADS; + PyErr_SetString(OperationalError, + PQerrorMessage(curs->conn->pgconn)); + return -1; + } + Dprintf("pq_execute: async query sent to backend"); + } + + pthread_mutex_unlock(&(curs->conn->lock)); + Py_END_ALLOW_THREADS; + + /* if the execute was sync, we call pq_fetch() immediately, + to respect the old DBAPI-2.0 compatible behaviour */ + if (async == 0) { + Dprintf("pq_execute: entering syncronous DBAPI compatibility mode"); + if (pq_fetch(curs) == -1) return -1; + } + else { + curs->conn->async_cursor = (PyObject*)curs; + } + + return 1-async; +} + + +/* pq_fetch - fetch data after a query + + this fucntion locks the connection object + this function call Py_*_ALLOW_THREADS macros + + return value: + -1 - some error occurred while calling libpq + 0 - no result from the backend but no libpq errors + 1 - result from backend (possibly data is ready) +*/ + +static void +_pq_fetch_tuples(cursorObject *curs) +{ + int i, *dsize = NULL; + + int pgnfields = PQnfields(curs->pgres); + int pgbintuples = PQbinaryTuples(curs->pgres); + + curs->notuples = 0; + + /* create the tuple for description and typecasting */ + Py_XDECREF(curs->description); + Py_XDECREF(curs->casts); + curs->description = PyTuple_New(pgnfields); + curs->casts = PyTuple_New(pgnfields); + curs->columns = pgnfields; + + /* calculate the display size for each column (cpu intensive, can be + switched off at configuration time) */ +#ifdef PSYCOPG_DISPLAY_SIZE + dsize = (int *)PyMem_Malloc(pgnfields * sizeof(int)); + if (dsize != NULL) { + int j, len; + for (i=0; i < pgnfields; i++) { + dsize[i] = -1; + } + for (j = 0; j < curs->rowcount; j++) { + for (i = 0; i < pgnfields; i++) { + len = PQgetlength(curs->pgres, j, i); + if (len > dsize[i]) dsize[i] = len; + } + } + } +#endif + + /* calculate various parameters and typecasters */ + for (i = 0; i < pgnfields; i++) { + Oid ftype = PQftype(curs->pgres, i); + int fsize = PQfsize(curs->pgres, i); + int fmod = PQfmod(curs->pgres, i); + + PyObject *dtitem = PyTuple_New(7); + PyObject *type = PyInt_FromLong(ftype); + PyObject *cast = NULL; + + PyTuple_SET_ITEM(curs->description, i, dtitem); + + /* fill the right cast function by accessing the global dictionary of + casting objects. if we got no defined cast use the default + one */ + if (!(cast = PyDict_GetItem(curs->casts, type))) { + Dprintf("_pq_fetch_tuples: cast %d not in per-cursor dict", ftype); + if (!(cast = PyDict_GetItem(psyco_types, type))) { + Dprintf("_pq_fetch_tuples: cast %d not found, using default", + PQftype(curs->pgres,i)); + cast = psyco_default_cast; + } + } + /* else if we got binary tuples and if we got a field that + is binary use the default cast + FIXME: what the hell am I trying to do here? This just can't work.. + */ + else if (pgbintuples && cast == psyco_default_binary_cast) { + Dprintf("_pq_fetch_tuples: Binary cursor and " + "binary field: %i using default cast", + PQftype(curs->pgres,i)); + cast = psyco_default_cast; + } + Dprintf("_pq_fetch_tuples: using cast at %p (%s) for type %d", + cast, PyString_AS_STRING(((typecastObject*)cast)->name), + PQftype(curs->pgres,i)); + Py_INCREF(cast); + PyTuple_SET_ITEM(curs->casts, i, cast); + + + /* 1/ fill the other fields */ + PyTuple_SET_ITEM(dtitem, 0, + PyString_FromString(PQfname(curs->pgres, i))); + PyTuple_SET_ITEM(dtitem, 1, type); + + /* 2/ display size is the maximum size of this field result tuples. */ + if (dsize && dsize[i] >= 0) { + PyTuple_SET_ITEM(dtitem, 2, PyInt_FromLong(dsize[i])); + } + else { + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 2, Py_None); + } + + /* 3/ size on the backend */ + if (fmod > 0) fmod = fmod - sizeof(int); + if (fsize == -1) { + if (ftype == NUMERICOID) { + PyTuple_SET_ITEM(dtitem, 3, + PyInt_FromLong((fmod >> 16) & 0xFFFF)); + } + else { /* If variable length record, return maximum size */ + PyTuple_SET_ITEM(dtitem, 3, PyInt_FromLong(fmod)); + } + } + else { + PyTuple_SET_ITEM(dtitem, 3, PyInt_FromLong(fsize)); + } + + /* 4,5/ scale and precision */ + if (ftype == NUMERICOID) { + PyTuple_SET_ITEM(dtitem, 4, PyInt_FromLong((fmod >> 16) & 0xFFFF)); + PyTuple_SET_ITEM(dtitem, 5, PyInt_FromLong((fmod & 0xFFFF) - 4)); + } + else { + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 4, Py_None); + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 5, Py_None); + } + + /* 6/ FIXME: null_ok??? */ + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 6, Py_None); + } + + if (dsize) PyMem_Free(dsize); +} + +#ifdef HAVE_PQPROTOCOL3 +static int +_pq_copy_in_v3(cursorObject *curs) +{ + /* COPY FROM implementation when protocol 3 is available: this function + uses the new PQputCopyData() and can detect errors and set the correct + exception */ + PyObject *o; + int length = 0, error = 0; + + while (1) { + o = PyObject_CallMethod(curs->copyfile, "read", "i", curs->copysize); + if (!o || !PyString_Check(o) || (length = PyString_Size(o)) == -1) { + error = 1; + } + if (length == 0 || error == 1) break; + + Py_BEGIN_ALLOW_THREADS; + if (PQputCopyData(curs->conn->pgconn, + PyString_AS_STRING(o), length) == -1) { + error = 2; + } + Py_END_ALLOW_THREADS; + + if (error == 2) break; + + Py_DECREF(o); + } + + Py_XDECREF(o); + + if (error == 0 || error == 2) + /* 0 means that the copy went well, 2 that there was an error on the + backend: in both cases we'll get the error message from the + PQresult */ + PQputCopyEnd(curs->conn->pgconn, NULL); + else + PQputCopyEnd(curs->conn->pgconn, "error during .read() call"); + + /* and finally we grab the operation result from the backend */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + + return 1; +} +#endif +static int +_pq_copy_in(cursorObject *curs) +{ + /* COPY FROM implementation when protocol 3 is not available: this + function can't fail but the backend will send an ERROR notice that will + be catched by our notice collector */ + PyObject *o; + + while (1) { + o = PyObject_CallMethod(curs->copyfile, "readline", NULL); + if (!o || o == Py_None || PyString_GET_SIZE(o) == 0) break; + if (PQputline(curs->conn->pgconn, PyString_AS_STRING(o)) != 0) { + Py_DECREF(o); + return -1; + } + Py_DECREF(o); + } + Py_XDECREF(o); + PQputline(curs->conn->pgconn, "\\.\n"); + PQendcopy(curs->conn->pgconn); + + /* if for some reason we're using a protocol 3 libpq to connect to a + protocol 2 backend we still need to cycle on the result set */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + + return 1; +} + +#ifdef HAVE_PQPROTOCOL3 +static int +_pq_copy_out_v3(cursorObject *curs) +{ + char *buffer; + int len; + + while (1) { + Py_BEGIN_ALLOW_THREADS; + len = PQgetCopyData(curs->conn->pgconn, &buffer, 0); + Py_END_ALLOW_THREADS; + + if (len > 0 && buffer) { + PyObject_CallMethod(curs->copyfile, "write", "s#", buffer, len); + PQfreemem(buffer); + } + /* we break on len == 0 but note that that should *not* happen, + because we are not doing an async call (if it happens blame + postgresql authors :/) */ + else if (len <= 0) break; + } + + if (len == -2) { + pq_raise(curs->conn, NULL, NULL, NULL); + return -1; + } + + /* and finally we grab the operation result from the backend */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + return 1; +} +#endif + +static int +_pq_copy_out(cursorObject *curs) +{ + char buffer[4096]; + int status, len; + + while (1) { + Py_BEGIN_ALLOW_THREADS; + status = PQgetline(curs->conn->pgconn, buffer, 4096); + Py_END_ALLOW_THREADS; + if (status == 0) { + if (buffer[0] == '\\' && buffer[1] == '.') break; + + len = strlen(buffer); + buffer[len++] = '\n'; + } + else if (status == 1) { + len = 4096-1; + } + else { + return -1; + } + + PyObject_CallMethod(curs->copyfile, "write", "s#", buffer, len); + } + + status = 1; + if (PQendcopy(curs->conn->pgconn) != 0) + status = -1; + + /* if for some reason we're using a protocol 3 libpq to connect to a + protocol 2 backend we still need to cycle on the result set */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + + return status; +} + +int +pq_fetch(cursorObject *curs) +{ + int pgstatus, ex = -1; + + /* even if we fail, we remove any information about the previous query */ + curs_reset(curs); + + /* we check the result from the previous execute; if the result is not + already there, we need to consume some input and go to sleep until we + get something edible to eat */ + if (!curs->pgres) { + + Dprintf("pq_fetch: no data: entering polling loop"); + + while (pq_is_busy(curs->conn) > 0) { + fd_set rfds; + struct timeval tv; + int sval, sock; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&(curs->conn->lock)); + + sock = PQsocket(curs->conn->pgconn); + FD_ZERO(&rfds); + FD_SET(sock, &rfds); + + /* set a default timeout of 5 seconds + TODO: make use of the timeout, maybe allowing the user to + make a non-blocking (timeouted) call to fetchXXX */ + tv.tv_sec = 5; + tv.tv_usec = 0; + + Dprintf("pq_fetch: entering PDflush() loop"); + while (PQflush(curs->conn->pgconn) != 0); + sval = select(sock+1, &rfds, NULL, NULL, &tv); + + pthread_mutex_unlock(&(curs->conn->lock)); + Py_END_ALLOW_THREADS; + } + + Dprintf("pq_fetch: data is probably ready"); + IFCLEARPGRES(curs->pgres); + curs->pgres = PQgetResult(curs->conn->pgconn); + } + + /* check for PGRES_FATAL_ERROR result */ + /* FIXME: I am not sure we need to check for critical error here. + if (curs->pgres == NULL) { + Dprintf("pq_fetch: got a NULL pgres, checking for critical"); + pq_set_critical(curs->conn); + if (curs->conn->critical) { + pq_resolve_critical(curs->conn); + return -1; + } + else { + return 0; + } + } + */ + + if (curs->pgres == NULL) return 0; + + pgstatus = PQresultStatus(curs->pgres); + Dprintf("pq_fetch: pgstatus = %s", PQresStatus(pgstatus)); + + /* backend status message */ + Py_XDECREF(curs->pgstatus); + curs->pgstatus = PyString_FromString(PQcmdStatus(curs->pgres)); + + switch(pgstatus) { + + case PGRES_COMMAND_OK: + Dprintf("pq_fetch: command returned OK (no tuples)"); + curs->rowcount = atoi(PQcmdTuples(curs->pgres)); + curs->lastoid = PQoidValue(curs->pgres); + CLEARPGRES(curs->pgres); + ex = 1; + break; + + case PGRES_COPY_OUT: + Dprintf("pq_fetch: data from a COPY TO (no tuples)"); +#ifdef HAVE_PQPROTOCOL3 + if (curs->conn->protocol == 3) + ex = _pq_copy_out_v3(curs); + else +#endif + ex = _pq_copy_out(curs); + curs->rowcount = -1; + /* error caught by out glorious notice handler */ + if (PyErr_Occurred()) ex = -1; + IFCLEARPGRES(curs->pgres); + break; + + case PGRES_COPY_IN: + Dprintf("pq_fetch: data from a COPY FROM (no tuples)"); +#ifdef HAVE_PQPROTOCOL3 + if (curs->conn->protocol == 3) + ex = _pq_copy_in_v3(curs); + else +#endif + ex = _pq_copy_in(curs); + curs->rowcount = -1; + /* error caught by out glorious notice handler */ + if (PyErr_Occurred()) ex = -1; + IFCLEARPGRES(curs->pgres); + break; + + case PGRES_TUPLES_OK: + Dprintf("pq_fetch: data from a SELECT (got tuples)"); + curs->rowcount = PQntuples(curs->pgres); + _pq_fetch_tuples(curs); ex = 0; + /* don't clear curs->pgres, because it contains the results! */ + break; + + default: + Dprintf("pq_fetch: uh-oh, something FAILED"); + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + ex = -1; + break; + } + + Dprintf("pq_fetch: fetching done; check for critical errors"); + + /* error checking, close the connection if necessary (some critical errors + are not really critical, like a COPY FROM error: if that's the case we + raise the exception but we avoid to close the connection) */ + if (curs->conn->critical) { + if (ex == -1) { + pq_resolve_critical(curs->conn, 1); + } + else { + pq_resolve_critical(curs->conn, 0); + } + return -1; + } + + return ex; +} diff --git a/psycopg2/psycopg/pqpath.h b/psycopg2/psycopg/pqpath.h new file mode 100644 index 0000000..64d113e --- /dev/null +++ b/psycopg2/psycopg/pqpath.h @@ -0,0 +1,41 @@ +/* pqpath.h - definitions for pqpath.c + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_PQPATH_H +#define PSYCOPG_PQPATH_H 1 + +#include "psycopg/cursor.h" +#include "psycopg/connection.h" + +/* macros to clean the pg result */ +#define IFCLEARPGRES(pgres) if (pgres) {PQclear(pgres); pgres = NULL;} +#define CLEARPGRES(pgres) PQclear(pgres); pgres = NULL + +/* exported functions */ +extern int pq_fetch(cursorObject *curs); +extern int pq_execute(cursorObject *curs, const char *query, int async); +extern int pq_begin(connectionObject *conn); +extern int pq_commit(connectionObject *conn); +extern int pq_abort(connectionObject *conn); +extern int pq_is_busy(connectionObject *conn); +extern void pq_set_critical(connectionObject *conn, const char *msg); + +#endif /* !defined(PSYCOPG_PQPATH_H) */ diff --git a/psycopg2/psycopg/psycopg.h b/psycopg2/psycopg/psycopg.h new file mode 100644 index 0000000..a689ea4 --- /dev/null +++ b/psycopg2/psycopg/psycopg.h @@ -0,0 +1,142 @@ +/* psycopg.h - definitions for the psycopg python module + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_H +#define PSYCOPG_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* DBAPI compliance parameters */ +#define APILEVEL "2.0" +#define THREADSAFETY 2 +#define PARAMSTYLE "pyformat" + +/* C API functions */ +#define psyco_errors_fill_NUM 0 +#define psyco_errors_fill_RETURN void +#define psyco_errors_fill_PROTO (PyObject *dict) +#define psyco_errors_set_NUM 1 +#define psyco_errors_set_RETURN void +#define psyco_errors_set_PROTO (PyObject *type) + +/* Total number of C API pointers */ +#define PSYCOPG_API_pointers 2 + +#ifdef PSYCOPG_MODULE + /** This section is used when compiling psycopgmodule.c & co. **/ +extern psyco_errors_fill_RETURN psyco_errors_fill psyco_errors_fill_PROTO; +extern psyco_errors_set_RETURN psyco_errors_set psyco_errors_set_PROTO; + +/* global excpetions */ +extern PyObject *Error, *Warning, *InterfaceError, *DatabaseError, + *InternalError, *OperationalError, *ProgrammingError, + *IntegrityError, *DataError, *NotSupportedError; + +/* python versions and compatibility stuff */ +#ifndef PyMODINIT_FUNC +#define PyMODINIT_FUNC void +#endif + +#else + /** This section is used in modules that use psycopg's C API **/ + +static void **PSYCOPG_API; + +#define psyco_errors_fill \ + (*(psyco_errors_fill_RETURN (*)psyco_errors_fill_PROTO) \ + PSYCOPG_API[psyco_errors_fill_NUM]) +#define psyco_errors_set \ + (*(psyco_errors_set_RETURN (*)psyco_errors_set_PROTO) \ + PSYCOPG_API[psyco_errors_set_NUM]) + +/* Return -1 and set exception on error, 0 on success. */ +static int +import_psycopg(void) +{ + PyObject *module = PyImport_ImportModule("psycopg"); + + if (module != NULL) { + PyObject *c_api_object = PyObject_GetAttrString(module, "_C_API"); + if (c_api_object == NULL) return -1; + if (PyCObject_Check(c_api_object)) + PSYCOPG_API = (void **)PyCObject_AsVoidPtr(c_api_object); + Py_DECREF(c_api_object); + } + return 0; +} + +#endif + +/* postgresql<->python encoding map */ +extern PyObject *psycoEncodings; + +typedef struct { + char *pgenc; + char *pyenc; +} encodingPair; + +/* the Decimal type, used by the DECIMAL typecaster */ +extern PyObject *decimalType; + +/* some utility functions */ +extern void psyco_set_error(PyObject *exc, PyObject *curs, char *msg, + char *pgerror, char *pgcode); + +/* Exceptions docstrings */ +#define Error_doc \ +"Base class for error exceptions." + +#define Warning_doc \ +"A database warning." + +#define InterfaceError_doc \ +"Error related to the database interface." + +#define DatabaseError_doc \ +"Error related to the database engine." + +#define InternalError_doc \ +"The database encountered an internal error." + +#define OperationalError_doc \ +"Error related to database operation (disconnect, memory allocation etc)." + +#define ProgrammingError_doc \ +"Error related to database programming (SQL error, table not found etc)." + +#define IntegrityError_doc \ +"Error related to database integrity." + +#define DataError_doc \ +"Error related to problems with the processed data." + +#define NotSupportedError_doc \ +"A not supported datbase API was called." + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_H) */ diff --git a/psycopg2/psycopg/psycopgmodule.c b/psycopg2/psycopg/psycopgmodule.c new file mode 100644 index 0000000..426fb27 --- /dev/null +++ b/psycopg2/psycopg/psycopgmodule.c @@ -0,0 +1,672 @@ +/* psycopgmodule.c - psycopg module (will import other C classes) + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" +#include "psycopg/typecast.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" + +#include "psycopg/adapter_qstring.h" +#include "psycopg/adapter_binary.h" +#include "psycopg/adapter_pboolean.h" +#include "psycopg/adapter_asis.h" +#include "psycopg/adapter_list.h" +#include "psycopg/typecast_binary.h" + +#ifdef HAVE_MXDATETIME +#include +#include "psycopg/adapter_mxdatetime.h" +mxDateTimeModule_APIObject *mxDateTimeP = NULL; +#endif + +/* some module-level variables, like the datetime module */ +#ifdef HAVE_PYDATETIME +#include +#include "psycopg/adapter_datetime.h" +PyObject *pyDateTimeModuleP = NULL; +PyObject *pyDateTypeP = NULL; +PyObject *pyTimeTypeP = NULL; +PyObject *pyDateTimeTypeP = NULL; +PyObject *pyDeltaTypeP = NULL; +#endif + +/* pointers to the psycopg.tz classes */ +PyObject *pyPsycopgTzModule = NULL; +PyObject *pyPsycopgTzLOCAL = NULL; +PyObject *pyPsycopgTzFixedOffsetTimezone = NULL; + +PyObject *psycoEncodings = NULL; +PyObject *decimalType = NULL; + +/** connect module-level function **/ +#define psyco_connect_doc \ +"connect(dsn, ...) -- Create a new database connection.\n\n" \ +"This function supports two different but equivalent sets of arguments.\n" \ +"A single data source name or ``dsn`` string can be used to specify the\n" \ +"connection parameters, as follows::\n\n" \ +" psycopg2.connect(\"dbname=xxx user=xxx ...\")\n\n" \ +"If ``dsn`` is not provided it is possible to pass the parameters as\n" \ +"keyword arguments; e.g.::\n\n" \ +" psycopg2.connect(database='xxx', user='xxx', ...)\n\n" \ +"The full list of available parameters is:\n\n" \ +"- ``dbname`` -- database name (only in 'dsn')\n" \ +"- ``database`` -- database name (only as keyword argument)\n" \ +"- ``host`` -- host address (defaults to UNIX socket if not provided)\n" \ +"- ``port`` -- port number (defaults to 5432 if not provided)\n" \ +"- ``user`` -- user name used to authenticate\n" \ +"- ``password`` -- password used to authenticate\n" \ +"- ``sslmode`` -- SSL mode (see PostgreSQL documentation)\n\n" \ +"If the ``connection_factory`` keyword argument is not provided this\n" \ +"function always return an instance of the `connection` class.\n" \ +"Else the given sub-class of `extensions.connection` will be used to\n" \ +"instantiate the connection object.\n\n" \ +":return: New database connection\n" \ +":rtype: `extensions.connection`" + +static int +_psyco_connect_fill_dsn(char *dsn, char *kw, char *v, int i) +{ + strcpy(&dsn[i], kw); i += strlen(kw); + strcpy(&dsn[i], v); i += strlen(v); + return i; +} + +static void +_psyco_connect_fill_exc(connectionObject *conn) +{ + /* fill the connection object with the exceptions */ + conn->exc_Error = Error; + Py_INCREF(Error); + conn->exc_Warning = Warning; + Py_INCREF(Warning); + conn->exc_InterfaceError = InterfaceError; + Py_INCREF(InterfaceError); + conn->exc_DatabaseError = DatabaseError; + Py_INCREF(DatabaseError); + conn->exc_InternalError = InternalError; + Py_INCREF(InternalError); + conn->exc_ProgrammingError = ProgrammingError; + Py_INCREF(ProgrammingError); + conn->exc_IntegrityError = IntegrityError; + Py_INCREF(IntegrityError); + conn->exc_DataError = DataError; + Py_INCREF(DataError); + conn->exc_NotSupportedError = NotSupportedError; + Py_INCREF(NotSupportedError); + conn->exc_OperationalError = OperationalError; + Py_INCREF(OperationalError); +} + +static PyObject * +psyco_connect(PyObject *self, PyObject *args, PyObject *keywds) +{ + PyObject *conn, *factory = NULL; + PyObject *pyport = NULL; + + int idsn=-1, iport=-1; + char *dsn=NULL, *database=NULL, *user=NULL, *password=NULL; + char *host=NULL, *sslmode=NULL; + char port[16]; + + static char *kwlist[] = {"dsn", "database", "host", "port", + "user", "password", "sslmode", + "connection_factory", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, keywds, "|sssOsssO", kwlist, + &dsn, &database, &host, &pyport, + &user, &password, &sslmode, &factory)) { + return NULL; + } + + if (pyport && PyString_Check(pyport)) { + PyObject *pyint = PyInt_FromString(PyString_AsString(pyport), NULL, 10); + if (!pyint) return NULL; + iport = PyInt_AsLong(pyint); + } + else if (pyport && PyInt_Check(pyport)) { + iport = PyInt_AsLong(pyport); + } + else if (pyport != NULL) { + PyErr_SetString(PyExc_TypeError, "port must be a string or int"); + return NULL; + } + + if (iport > 0) + PyOS_snprintf(port, 16, "%d", iport); + + if (dsn == NULL) { + int l = 45; /* len("dbname= user= password= host= port= sslmode=\0") */ + + if (database) l += strlen(database); + if (host) l += strlen(host); + if (iport > 0) l += strlen(port); + if (user) l += strlen(user); + if (password) l += strlen(password); + if (sslmode) l += strlen(sslmode); + + dsn = malloc(l*sizeof(char)); + if (dsn == NULL) { + PyErr_SetString(InterfaceError, "dynamic dsn allocation failed"); + return NULL; + } + + idsn = 0; + if (database) + idsn = _psyco_connect_fill_dsn(dsn, " dbname=", database, idsn); + if (host) + idsn = _psyco_connect_fill_dsn(dsn, " host=", host, idsn); + if (iport > 0) + idsn = _psyco_connect_fill_dsn(dsn, " port=", port, idsn); + if (user) + idsn = _psyco_connect_fill_dsn(dsn, " user=", user, idsn); + if (password) + idsn = _psyco_connect_fill_dsn(dsn, " password=", password, idsn); + if (sslmode) + idsn = _psyco_connect_fill_dsn(dsn, " sslmode=", sslmode, idsn); + + if (idsn > 0) { + dsn[idsn] = '\0'; + memmove(dsn, &dsn[1], idsn); + } + else { + free(dsn); + PyErr_SetString(InterfaceError, "missing dsn and no parameters"); + return NULL; + } + } + + Dprintf("psyco_connect: dsn = '%s'", dsn); + + /* allocate connection, fill with errors and return it */ + if (factory == NULL) factory = (PyObject *)&connectionType; + conn = PyObject_CallFunction(factory, "s", dsn); + if (conn) _psyco_connect_fill_exc((connectionObject*)conn); + + return conn; +} + +/** type registration **/ +#define psyco_register_type_doc \ +"register_type(obj) -> None -- register obj with psycopg type system\n\n" \ +":Parameters:\n" \ +" * `obj`: A type adapter created by `new_type()`" + +#define typecast_from_python_doc \ +"new_type(oids, name, adapter) -> new type object\n\n" \ +"Create a new binding object. The object can be used with the\n" \ +"`register_type()` function to bind PostgreSQL objects to python objects.\n\n" \ +":Parameters:\n" \ +" * `oids`: Tuple of ``oid`` of the PostgreSQL types to convert.\n" \ +" * `name`: Name for the new type\n" \ +" * `adapter`: Callable to perform type conversion.\n" \ +" It must have the signature ``fun(value, cur)`` where ``value`` is\n" \ +" the string representation returned by PostgreSQL (`None` if ``NULL``)\n" \ +" and ``cur`` is the cursor from which data are read." + +static PyObject * +psyco_register_type(PyObject *self, PyObject *args) +{ + PyObject *type; + + if (!PyArg_ParseTuple(args, "O!", &typecastType, &type)) { + return NULL; + } + + typecast_add(type, 0); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* default adapters */ + +static void +psyco_adapters_init(PyObject *mod) +{ + PyObject *call; + + microprotocols_add(&PyFloat_Type, NULL, (PyObject*)&asisType); + microprotocols_add(&PyInt_Type, NULL, (PyObject*)&asisType); + microprotocols_add(&PyLong_Type, NULL, (PyObject*)&asisType); + + microprotocols_add(&PyString_Type, NULL, (PyObject*)&qstringType); + microprotocols_add(&PyUnicode_Type, NULL, (PyObject*)&qstringType); + microprotocols_add(&PyBuffer_Type, NULL, (PyObject*)&binaryType); + microprotocols_add(&PyList_Type, NULL, (PyObject*)&listType); + +#ifdef HAVE_MXDATETIME + /* the module has already been initialized, so we can obtain the callable + objects directly from its dictionary :) */ + call = PyMapping_GetItemString(mod, "TimestampFromMx"); + microprotocols_add(mxDateTimeP->DateTime_Type, NULL, call); + call = PyMapping_GetItemString(mod, "TimeFromMx"); + microprotocols_add(mxDateTimeP->DateTimeDelta_Type, NULL, call); +#endif + +#ifdef HAVE_PYDATETIME + /* as above, we use the callable objects from the psycopg module */ + call = PyMapping_GetItemString(mod, "DateFromPy"); + microprotocols_add((PyTypeObject*)pyDateTypeP, NULL, call); + call = PyMapping_GetItemString(mod, "TimeFromPy"); + microprotocols_add((PyTypeObject*)pyTimeTypeP, NULL, call); + call = PyMapping_GetItemString(mod, "TimestampFromPy"); + microprotocols_add((PyTypeObject*)pyDateTimeTypeP, NULL, call); + call = PyMapping_GetItemString(mod, "IntervalFromPy"); + microprotocols_add((PyTypeObject*)pyDeltaTypeP, NULL, call); +#endif + +#ifdef HAVE_PYBOOL + microprotocols_add(&PyBool_Type, NULL, (PyObject*)&pbooleanType); +#endif + +#ifdef HAVE_DECIMAL + microprotocols_add((PyTypeObject*)decimalType, NULL, (PyObject*)&asisType); +#endif +} + +/* psyco_encodings_fill + + Fill the module's postgresql<->python encoding table */ + +static encodingPair encodings[] = { + {"SQL_ASCII", "ascii"}, + {"LATIN1", "latin_1"}, + {"UNICODE", "utf_8"}, + {"UTF8", "utf_8"}, + + /* some compatibility stuff */ + {"LATIN-1", "latin_1"}, + + {NULL, NULL} +}; +static void psyco_encodings_fill(PyObject *dict) +{ + encodingPair *enc; + + for (enc = encodings; enc->pgenc != NULL; enc++) { + PyObject *value = PyString_FromString(enc->pyenc); + PyDict_SetItemString(dict, enc->pgenc, value); + Py_DECREF(value); + } +} + +/* psyco_errors_init, psyco_errors_fill (callable from C) + + Initialize the module's exceptions and after that a dictionary with a full + set of exceptions. */ + +PyObject *Error, *Warning, *InterfaceError, *DatabaseError, + *InternalError, *OperationalError, *ProgrammingError, + *IntegrityError, *DataError, *NotSupportedError; + +/* mapping between exception names and their PyObject */ +static struct { + char *name; + PyObject **exc; + PyObject **base; + char *docstr; +} exctable[] = { + { "psycopg2.Error", &Error, 0, Error_doc }, + { "psycopg2.Warning", &Warning, 0, Warning_doc }, + { "psycopg2.InterfaceError", &InterfaceError, &Error, InterfaceError_doc }, + { "psycopg2.DatabaseError", &DatabaseError, &Error, DatabaseError_doc }, + { "psycopg2.InternalError", &InternalError, &DatabaseError, InternalError_doc }, + { "psycopg2.OperationalError", &OperationalError, &DatabaseError, + OperationalError_doc }, + { "psycopg2.ProgrammingError", &ProgrammingError, &DatabaseError, + ProgrammingError_doc }, + { "psycopg2.IntegrityError", &IntegrityError, &DatabaseError, + IntegrityError_doc }, + { "psycopg2.DataError", &DataError, &DatabaseError, DataError_doc }, + { "psycopg2.NotSupportedError", &NotSupportedError, &DatabaseError, + NotSupportedError_doc }, + {NULL} /* Sentinel */ +}; + +static void +psyco_errors_init(void) +{ + /* the names of the exceptions here reflect the oranization of the + psycopg2 module and not the fact the the original error objects + live in _psycopg */ + + int i; + PyObject *dict; + PyObject *base; + PyObject *str; + + for (i=0; exctable[i].name; i++) { + dict = PyDict_New(); + + if (exctable[i].docstr) { + str = PyString_FromString(exctable[i].docstr); + PyDict_SetItemString(dict, "__doc__", str); + } + + if (exctable[i].base == 0) + base = PyExc_StandardError; + else + base = *exctable[i].base; + + *exctable[i].exc = PyErr_NewException(exctable[i].name, base, dict); + } +} + +void +psyco_errors_fill(PyObject *dict) +{ + PyDict_SetItemString(dict, "Error", Error); + PyDict_SetItemString(dict, "Warning", Warning); + PyDict_SetItemString(dict, "InterfaceError", InterfaceError); + PyDict_SetItemString(dict, "DatabaseError", DatabaseError); + PyDict_SetItemString(dict, "InternalError", InternalError); + PyDict_SetItemString(dict, "OperationalError", OperationalError); + PyDict_SetItemString(dict, "ProgrammingError", ProgrammingError); + PyDict_SetItemString(dict, "IntegrityError", IntegrityError); + PyDict_SetItemString(dict, "DataError", DataError); + PyDict_SetItemString(dict, "NotSupportedError", NotSupportedError); +} + +void +psyco_errors_set(PyObject *type) +{ + PyObject_SetAttrString(type, "Error", Error); + PyObject_SetAttrString(type, "Warning", Warning); + PyObject_SetAttrString(type, "InterfaceError", InterfaceError); + PyObject_SetAttrString(type, "DatabaseError", DatabaseError); + PyObject_SetAttrString(type, "InternalError", InternalError); + PyObject_SetAttrString(type, "OperationalError", OperationalError); + PyObject_SetAttrString(type, "ProgrammingError", ProgrammingError); + PyObject_SetAttrString(type, "IntegrityError", IntegrityError); + PyObject_SetAttrString(type, "DataError", DataError); + PyObject_SetAttrString(type, "NotSupportedError", NotSupportedError); +} + +/* psyco_error_new + + Create a new error of the given type with extra attributes. */ + +void +psyco_set_error(PyObject *exc, PyObject *curs, char *msg, + char *pgerror, char *pgcode) +{ + PyObject *t; + + PyObject *err = PyObject_CallFunction(exc, "s", msg); + + if (err) { + if (pgerror) { + t = PyString_FromString(pgerror); + } + else { + t = Py_None ; Py_INCREF(t); + } + PyObject_SetAttrString(err, "pgerror", t); + Py_DECREF(t); + + if (pgcode) { + t = PyString_FromString(pgcode); + } + else { + t = Py_None ; Py_INCREF(t); + } + PyObject_SetAttrString(err, "pgcode", t); + Py_DECREF(t); + + if (curs) + PyObject_SetAttrString(err, "cursor", curs); + else + PyObject_SetAttrString(err, "cursor", Py_None); + + PyErr_SetObject(exc, err); + Py_DECREF(err); + } +} + +/* psyco_decimal_init + + Initialize the module's pointer to the decimal type. */ + +void +psyco_decimal_init(void) +{ +#ifdef HAVE_DECIMAL + PyObject *decimal = PyImport_ImportModule("decimal"); + if (decimal) { + decimalType = PyObject_GetAttrString(decimal, "Decimal"); + } + else { + PyErr_Clear(); + decimalType = (PyObject *)&PyFloat_Type; + Py_INCREF(decimalType); + } +#endif +} + + +/** method table and module initialization **/ + +static PyMethodDef psycopgMethods[] = { + {"connect", (PyCFunction)psyco_connect, + METH_VARARGS|METH_KEYWORDS, psyco_connect_doc}, + {"adapt", (PyCFunction)psyco_microprotocols_adapt, + METH_VARARGS, psyco_microprotocols_adapt_doc}, + + {"register_type", (PyCFunction)psyco_register_type, + METH_VARARGS, psyco_register_type_doc}, + {"new_type", (PyCFunction)typecast_from_python, + METH_VARARGS|METH_KEYWORDS, typecast_from_python_doc}, + + {"AsIs", (PyCFunction)psyco_AsIs, + METH_VARARGS, psyco_AsIs_doc}, + {"QuotedString", (PyCFunction)psyco_QuotedString, + METH_VARARGS, psyco_QuotedString_doc}, + {"Boolean", (PyCFunction)psyco_Boolean, + METH_VARARGS, psyco_Boolean_doc}, + {"Binary", (PyCFunction)psyco_Binary, + METH_VARARGS, psyco_Binary_doc}, + {"Date", (PyCFunction)psyco_Date, + METH_VARARGS, psyco_Date_doc}, + {"Time", (PyCFunction)psyco_Time, + METH_VARARGS, psyco_Time_doc}, + {"Timestamp", (PyCFunction)psyco_Timestamp, + METH_VARARGS, psyco_Timestamp_doc}, + {"DateFromTicks", (PyCFunction)psyco_DateFromTicks, + METH_VARARGS, psyco_DateFromTicks_doc}, + {"TimeFromTicks", (PyCFunction)psyco_TimeFromTicks, + METH_VARARGS, psyco_TimeFromTicks_doc}, + {"TimestampFromTicks", (PyCFunction)psyco_TimestampFromTicks, + METH_VARARGS, psyco_TimestampFromTicks_doc}, + {"List", (PyCFunction)psyco_List, + METH_VARARGS, psyco_List_doc}, + +#ifdef HAVE_MXDATETIME + {"DateFromMx", (PyCFunction)psyco_DateFromMx, + METH_VARARGS, psyco_DateFromMx_doc}, + {"TimeFromMx", (PyCFunction)psyco_TimeFromMx, + METH_VARARGS, psyco_TimeFromMx_doc}, + {"TimestampFromMx", (PyCFunction)psyco_TimestampFromMx, + METH_VARARGS, psyco_TimestampFromMx_doc}, + {"IntervalFromMx", (PyCFunction)psyco_IntervalFromMx, + METH_VARARGS, psyco_IntervalFromMx_doc}, +#endif + +#ifdef HAVE_PYDATETIME + {"DateFromPy", (PyCFunction)psyco_DateFromPy, + METH_VARARGS, psyco_DateFromPy_doc}, + {"TimeFromPy", (PyCFunction)psyco_TimeFromPy, + METH_VARARGS, psyco_TimeFromPy_doc}, + {"TimestampFromPy", (PyCFunction)psyco_TimestampFromPy, + METH_VARARGS, psyco_TimestampFromPy_doc}, + {"IntervalFromPy", (PyCFunction)psyco_IntervalFromPy, + METH_VARARGS, psyco_IntervalFromPy_doc}, +#endif + + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +PyMODINIT_FUNC +init_psycopg(void) +{ + static void *PSYCOPG_API[PSYCOPG_API_pointers]; + + PyObject *module, *dict; + PyObject *c_api_object; + + Dprintf("initpsycopg: initializing psycopg %s", PSYCOPG_VERSION); + + /* initialize all the new types and then the module */ + connectionType.ob_type = &PyType_Type; + cursorType.ob_type = &PyType_Type; + typecastType.ob_type = &PyType_Type; + qstringType.ob_type = &PyType_Type; + binaryType.ob_type = &PyType_Type; + isqlquoteType.ob_type = &PyType_Type; + asisType.ob_type = &PyType_Type; + listType.ob_type = &PyType_Type; + chunkType.ob_type = &PyType_Type; + + if (PyType_Ready(&connectionType) == -1) return; + if (PyType_Ready(&cursorType) == -1) return; + if (PyType_Ready(&typecastType) == -1) return; + if (PyType_Ready(&qstringType) == -1) return; + if (PyType_Ready(&binaryType) == -1) return; + if (PyType_Ready(&isqlquoteType) == -1) return; + if (PyType_Ready(&asisType) == -1) return; + if (PyType_Ready(&listType) == -1) return; + if (PyType_Ready(&chunkType) == -1) return; + +#ifdef HAVE_PYBOOL + pbooleanType.ob_type = &PyType_Type; + if (PyType_Ready(&pbooleanType) == -1) return; +#endif + + /* import mx.DateTime module, if necessary */ +#ifdef HAVE_MXDATETIME + mxdatetimeType.ob_type = &PyType_Type; + if (PyType_Ready(&mxdatetimeType) == -1) return; + if (mxDateTime_ImportModuleAndAPI() != 0) { + Dprintf("initpsycopg: why marc hide mx.DateTime again?!"); + PyErr_SetString(PyExc_ImportError, "can't import mx.DateTime module"); + return; + } + mxDateTimeP = &mxDateTime; +#endif + + /* import python builtin datetime module, if available */ +#ifdef HAVE_PYDATETIME + pyDateTimeModuleP = PyImport_ImportModule("datetime"); + if (pyDateTimeModuleP == NULL) { + Dprintf("initpsycopg: can't import datetime module"); + PyErr_SetString(PyExc_ImportError, "can't import datetime module"); + return; + } + pydatetimeType.ob_type = &PyType_Type; + if (PyType_Ready(&pydatetimeType) == -1) return; + + /* now we define the datetime types, this is crazy because python should + be doing that, not us! */ + pyDateTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "date"); + pyTimeTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "time"); + pyDateTimeTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "datetime"); + pyDeltaTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "timedelta"); +#endif + + /* import psycopg2.tz anyway (TODO: replace with C-level module?) */ + pyPsycopgTzModule = PyImport_ImportModule("psycopg2.tz"); + if (pyPsycopgTzModule == NULL) { + Dprintf("initpsycopg: can't import psycopg2.tz module"); + PyErr_SetString(PyExc_ImportError, "can't import psycopg2.tz module"); + return; + } + pyPsycopgTzLOCAL = + PyObject_GetAttrString(pyPsycopgTzModule, "LOCAL"); + pyPsycopgTzFixedOffsetTimezone = + PyObject_GetAttrString(pyPsycopgTzModule, "FixedOffsetTimezone"); + + /* initialize the module and grab module's dictionary */ + module = Py_InitModule("_psycopg", psycopgMethods); + dict = PyModule_GetDict(module); + + /* initialize all the module's exported functions */ + /* PyBoxer_API[PyBoxer_Fake_NUM] = (void *)PyBoxer_Fake; */ + + /* Create a CObject containing the API pointer array's address */ + c_api_object = PyCObject_FromVoidPtr((void *)PSYCOPG_API, NULL); + if (c_api_object != NULL) + PyModule_AddObject(module, "_C_API", c_api_object); + + /* other mixed initializations of module-level variables */ + psycoEncodings = PyDict_New(); + psyco_encodings_fill(psycoEncodings); + psyco_decimal_init(); + + /* set some module's parameters */ + PyModule_AddStringConstant(module, "__version__", PSYCOPG_VERSION); + PyModule_AddStringConstant(module, "__doc__", "psycopg PostgreSQL driver"); + PyModule_AddObject(module, "apilevel", PyString_FromString(APILEVEL)); + PyModule_AddObject(module, "threadsafety", PyInt_FromLong(THREADSAFETY)); + PyModule_AddObject(module, "paramstyle", PyString_FromString(PARAMSTYLE)); + + /* put new types in module dictionary */ + PyModule_AddObject(module, "connection", (PyObject*)&connectionType); + PyModule_AddObject(module, "cursor", (PyObject*)&cursorType); + PyModule_AddObject(module, "ISQLQuote", (PyObject*)&isqlquoteType); + + /* encodings dictionary in module dictionary */ + PyModule_AddObject(module, "encodings", psycoEncodings); + + /* initialize default set of typecasters */ + typecast_init(dict); + + /* initialize microprotocols layer */ + microprotocols_init(dict); + psyco_adapters_init(dict); + + /* create a standard set of exceptions and add them to the module's dict */ + psyco_errors_init(); + psyco_errors_fill(dict); + + /* Solve win32 build issue about non-constant initializer element */ + cursorType.tp_alloc = PyType_GenericAlloc; + binaryType.tp_alloc = PyType_GenericAlloc; + isqlquoteType.tp_alloc = PyType_GenericAlloc; + pbooleanType.tp_alloc = PyType_GenericAlloc; + connectionType.tp_alloc = PyType_GenericAlloc; + asisType.tp_alloc = PyType_GenericAlloc; + qstringType.tp_alloc = PyType_GenericAlloc; + listType.tp_alloc = PyType_GenericAlloc; + chunkType.tp_alloc = PyType_GenericAlloc; + +#ifdef HAVE_PYDATETIME + pydatetimeType.tp_alloc = PyType_GenericAlloc; +#endif + + Dprintf("initpsycopg: module initialization complete"); +} diff --git a/psycopg2/psycopg/python.h b/psycopg2/psycopg/python.h new file mode 100644 index 0000000..1c2b96d --- /dev/null +++ b/psycopg2/psycopg/python.h @@ -0,0 +1,43 @@ +/* python.h - python version compatibility stuff + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_PYTHON_H +#define PSYCOPG_PYTHON_H 1 + +#include +#include + +/* python < 2.2 does not have PyMemeberDef */ +#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 2 +#define PyMemberDef memberlist +#endif + +/* PyObject_TypeCheck introduced in 2.2 */ +#ifndef PyObject_TypeCheck +#define PyObject_TypeCheck(o, t) ((o)->ob_type == (t)) +#endif + +/* python 2.2 does not have freefunc (it has destructor instead) */ +#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 3 +#define freefunc destructor +#endif + +#endif /* !defined(PSYCOPG_PYTHON_H) */ diff --git a/psycopg2/psycopg/typecast.c b/psycopg2/psycopg/typecast.c new file mode 100644 index 0000000..ef91bfd --- /dev/null +++ b/psycopg2/psycopg/typecast.c @@ -0,0 +1,563 @@ +/* typecast.c - basic utility functions related to typecasting + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/psycopg.h" +#include "psycopg/python.h" +#include "psycopg/typecast.h" +#include "psycopg/cursor.h" + +/* usefull function used by some typecasters */ + +static char * +skip_until_space(char *s) +{ + while (*s && *s != ' ') s++; + return s; +} + +static char * +skip_until_space2(char *s, int *len) +{ + while (*len > 0 && *s && *s != ' ') { + s++; (*len)--; + } + return s; +} + +static int +typecast_parse_date(char* s, char** t, int* len, + int* year, int* month, int* day) +{ + int acc = -1, cz = 0; + + Dprintf("typecast_parse_date: len = %d, s = %s", *len, s); + + while (cz < 3 && *len > 0 && *s) { + switch (*s) { + case '-': + case ' ': + case 'T': + if (cz == 0) *year = acc; + else if (cz == 1) *month = acc; + else if (cz == 2) *day = acc; + acc = -1; cz++; + break; + default: + acc = (acc == -1 ? 0 : acc*10) + ((int)*s - (int)'0'); + break; + } + + s++; (*len)--; + } + + if (acc != -1) { + *day = acc; + cz += 1; + } + if (t != NULL) *t = s; + + return cz; +} + +static int +typecast_parse_time(char* s, char** t, int* len, + int* hh, int* mm, int* ss, int* us, int* tz) +{ + int acc = -1, cz = 0; + int tzs = 1, tzhh = 0, tzmm = 0; + int usd = 0; + + /* sets microseconds and timezone to 0 because they may be missing */ + *us = *tz = 0; + + Dprintf("typecast_parse_time: len = %d, s = %s", *len, s); + + while (cz < 6 && *len > 0 && *s) { + switch (*s) { + case ':': + if (cz == 0) *hh = acc; + else if (cz == 1) *mm = acc; + else if (cz == 2) *ss = acc; + else if (cz == 3) *us = acc; + else if (cz == 4) tzhh = acc; + acc = -1; cz++; + break; + case '.': + /* we expect seconds and if we don't get them we return an error */ + if (cz != 2) return -1; + *ss = acc; + acc = -1; cz++; + break; + case '+': + case '-': + /* seconds or microseconds here, anything else is an error */ + if (cz < 2 || cz > 3) return -1; + if (*s == '-') tzs = -1; + if (cz == 2) *ss = acc; + else if (cz == 3) *us = acc; + acc = -1; cz = 4; + break; + default: + acc = (acc == -1 ? 0 : acc*10) + ((int)*s - (int)'0'); + if (cz == 3) usd += 1; + break; + } + + s++; (*len)--; + } + + if (acc != -1) { + if (cz == 2) { *ss = acc; cz += 1; } + else if (cz == 3) { *us = acc; cz += 1; } + else if (cz == 4) { tzhh = acc; cz += 1; } + else if (cz == 5) tzmm = acc; + } + if (t != NULL) *t = s; + + *tz = tzs * tzhh*60 + tzmm; + + if (*us != 0.0) { + while (usd++ < 6) *us *= 10.0; + } + + return cz; +} + +/** include casting objects **/ +#include "psycopg/typecast_basic.c" +#include "psycopg/typecast_binary.c" + +#ifdef HAVE_MXDATETIME +#include "psycopg/typecast_mxdatetime.c" +#endif + +#ifdef HAVE_PYDATETIME +#include "psycopg/typecast_datetime.c" +#endif + +#include "psycopg/typecast_array.c" +#include "psycopg/typecast_builtins.c" + + +/* a list of initializers, used to make the typecasters accessible anyway */ +#ifdef HAVE_PYDATETIME +typecastObject_initlist typecast_pydatetime[] = { + {"PYDATETIME", typecast_DATETIME_types, typecast_PYDATETIME_cast}, + {"PYTIME", typecast_TIME_types, typecast_PYTIME_cast}, + {"PYDATE", typecast_DATE_types, typecast_PYDATE_cast}, + {"PYINTERVAL", typecast_INTERVAL_types, typecast_PYINTERVAL_cast}, + {NULL, NULL, NULL} +}; +#endif + +/* a list of initializers, used to make the typecasters accessible anyway */ +#ifdef HAVE_MXDATETIME +typecastObject_initlist typecast_mxdatetime[] = { + {"MXDATETIME", typecast_DATETIME_types, typecast_MXDATE_cast}, + {"MXTIME", typecast_TIME_types, typecast_MXTIME_cast}, + {"MXDATE", typecast_DATE_types, typecast_MXDATE_cast}, + {"MXINTERVAL", typecast_INTERVAL_types, typecast_MXINTERVAL_cast}, + {NULL, NULL, NULL} +}; +#endif + + +/** the type dictionary and associated functions **/ + +PyObject *psyco_types; +PyObject *psyco_default_cast; +PyObject *psyco_binary_types; +PyObject *psyco_default_binary_cast; + +static long int typecast_default_DEFAULT[] = {0}; +static typecastObject_initlist typecast_default = { + "DEFAULT", typecast_default_DEFAULT, typecast_STRING_cast}; + + +/* typecast_init - initialize the dictionary and create default types */ + +int +typecast_init(PyObject *dict) +{ + int i; + + /* create type dictionary and put it in module namespace */ + psyco_types = PyDict_New(); + psyco_binary_types = PyDict_New(); + + if (!psyco_types || !psyco_binary_types) { + Py_XDECREF(psyco_types); + Py_XDECREF(psyco_binary_types); + return -1; + } + + PyDict_SetItemString(dict, "string_types", psyco_types); + PyDict_SetItemString(dict, "binary_types", psyco_binary_types); + + /* insert the cast types into the 'types' dictionary and register them in + the module dictionary */ + for (i = 0; typecast_builtins[i].name != NULL; i++) { + typecastObject *t; + + Dprintf("typecast_init: initializing %s", typecast_builtins[i].name); + + t = (typecastObject *)typecast_from_c(&(typecast_builtins[i]), dict); + if (t == NULL) return -1; + if (typecast_add((PyObject *)t, 0) != 0) return -1; + + PyDict_SetItem(dict, t->name, (PyObject *)t); + + /* export binary object */ + if (typecast_builtins[i].values == typecast_BINARY_types) { + psyco_default_binary_cast = (PyObject *)t; + } + } + + /* create and save a default cast object (but does not register it) */ + psyco_default_cast = typecast_from_c(&typecast_default, dict); + + /* register the date/time typecasters with their original names */ +#ifdef HAVE_MXDATETIME + for (i = 0; typecast_mxdatetime[i].name != NULL; i++) { + typecastObject *t; + Dprintf("typecast_init: initializing %s", typecast_mxdatetime[i].name); + t = (typecastObject *)typecast_from_c(&(typecast_mxdatetime[i]), dict); + if (t == NULL) return -1; + PyDict_SetItem(dict, t->name, (PyObject *)t); + } +#endif +#ifdef HAVE_PYDATETIME + for (i = 0; typecast_pydatetime[i].name != NULL; i++) { + typecastObject *t; + Dprintf("typecast_init: initializing %s", typecast_pydatetime[i].name); + t = (typecastObject *)typecast_from_c(&(typecast_pydatetime[i]), dict); + if (t == NULL) return -1; + PyDict_SetItem(dict, t->name, (PyObject *)t); + } +#endif + + return 0; +} + +/* typecast_add - add a type object to the dictionary */ +int +typecast_add(PyObject *obj, int binary) +{ + PyObject *val; + int len, i; + + typecastObject *type = (typecastObject *)obj; + + Dprintf("typecast_add: object at %p, values refcnt = %d", + obj, type->values->ob_refcnt); + + len = PyTuple_Size(type->values); + for (i = 0; i < len; i++) { + val = PyTuple_GetItem(type->values, i); + Dprintf("typecast_add: adding val: %ld", PyInt_AsLong(val)); + if (binary) { + PyDict_SetItem(psyco_binary_types, val, obj); + } + else { + PyDict_SetItem(psyco_types, val, obj); + } + } + + Dprintf("typecast_add: base caster: %p", type->bcast); + + return 0; +} + + +/** typecast type **/ + +#define OFFSETOF(x) offsetof(typecastObject, x) + +static int +typecast_cmp(PyObject *obj1, PyObject* obj2) +{ + typecastObject *self = (typecastObject*)obj1; + typecastObject *other = NULL; + PyObject *number = NULL; + int i, j, res = -1; + + if (PyObject_TypeCheck(obj2, &typecastType)) { + other = (typecastObject*)obj2; + } + else { + number = PyNumber_Int(obj2); + } + + Dprintf("typecast_cmp: other = %p, number = %p", other, number); + + for (i=0; i < PyObject_Length(self->values) && res == -1; i++) { + long int val = PyInt_AsLong(PyTuple_GET_ITEM(self->values, i)); + + if (other != NULL) { + for (j=0; j < PyObject_Length(other->values); j++) { + if (PyInt_AsLong(PyTuple_GET_ITEM(other->values, j)) == val) { + res = 0; break; + } + } + } + + else if (number != NULL) { + if (PyInt_AsLong(number) == val) { + res = 0; break; + } + } + } + + Py_XDECREF(number); + return res; +} + +static PyObject* +typecast_richcompare(PyObject *obj1, PyObject* obj2, int opid) +{ + PyObject *result = NULL; + int res = typecast_cmp(obj1, obj2); + + if (PyErr_Occurred()) return NULL; + + if ((opid == Py_EQ && res == 0) || (opid != Py_EQ && res != 0)) + result = Py_True; + else + result = Py_False; + + Py_INCREF(result); + return result; +} + +static struct PyMemberDef typecastObject_members[] = { + {"name", T_OBJECT, OFFSETOF(name), RO}, + {"values", T_OBJECT, OFFSETOF(values), RO}, + {NULL} +}; + +static void +typecast_dealloc(PyObject *obj) +{ + typecastObject *self = (typecastObject*)obj; + + Py_XDECREF(self->values); + Py_XDECREF(self->name); + Py_XDECREF(self->pcast); + + PyObject_Del(self); +} + +static PyObject * +typecast_call(PyObject *obj, PyObject *args, PyObject *kwargs) +{ + PyObject *string, *cursor; + + if (!PyArg_ParseTuple(args, "OO", &string, &cursor)) { + return NULL; + } + + return typecast_cast(obj, + PyString_AsString(string), PyString_Size(string), + cursor); +} + +PyTypeObject typecastType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.type", + sizeof(typecastObject), + 0, + + typecast_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + typecast_cmp, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + typecast_call, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_HAVE_RICHCOMPARE, /*tp_flags*/ + "psycopg type-casting object", /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + typecast_richcompare, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + 0, /*tp_methods*/ + typecastObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + 0, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + 0, /*tp_new*/ + 0, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + +static PyObject * +typecast_new(PyObject *name, PyObject *values, PyObject *cast, PyObject *base) +{ + typecastObject *obj; + + obj = PyObject_NEW(typecastObject, &typecastType); + if (obj == NULL) return NULL; + + Dprintf("typecast_new: new type at = %p, refcnt = %d", obj, obj->ob_refcnt); + + Py_INCREF(values); + obj->values = values; + + if (name) { + Py_INCREF(name); + obj->name = name; + } + else { + Py_INCREF(Py_None); + obj->name = Py_None; + } + + obj->pcast = NULL; + obj->ccast = NULL; + obj->bcast = base; + + if (obj->bcast) Py_INCREF(obj->bcast); + + /* FIXME: raise an exception when None is passed as Python caster */ + if (cast && cast != Py_None) { + Py_INCREF(cast); + obj->pcast = cast; + } + + Dprintf("typecast_new: typecast object created at %p", obj); + + return (PyObject *)obj; +} + +PyObject * +typecast_from_python(PyObject *self, PyObject *args, PyObject *keywds) +{ + PyObject *v, *name, *cast = NULL, *base = NULL; + + static char *kwlist[] = {"values", "name", "castobj", "baseobj", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, keywds, "O!|O!OO", kwlist, + &PyTuple_Type, &v, + &PyString_Type, &name, + &cast, &base)) { + return NULL; + } + + return typecast_new(name, v, cast, base); +} + +PyObject * +typecast_from_c(typecastObject_initlist *type, PyObject *dict) +{ + PyObject *tuple, *base = NULL; + typecastObject *obj; + int i, len = 0; + + /* before doing anything else we look for the base */ + if (type->base) { + /* NOTE: base is a borrowed reference! */ + base = PyDict_GetItemString(dict, type->base); + if (!base) { + PyErr_Format(Error, "typecast base not found: %s", type->base); + return NULL; + } + } + + while (type->values[len] != 0) len++; + + tuple = PyTuple_New(len); + if (!tuple) return NULL; + + for (i = 0; i < len ; i++) { + PyTuple_SET_ITEM(tuple, i, PyInt_FromLong(type->values[i])); + } + + + obj = (typecastObject *) + typecast_new(PyString_FromString(type->name), tuple, NULL, base); + + if (obj) { + obj->ccast = type->cast; + obj->pcast = NULL; + } + return (PyObject *)obj; +} + +PyObject * +typecast_cast(PyObject *obj, char *str, int len, PyObject *curs) +{ + PyObject *old, *res = NULL; + typecastObject *self = (typecastObject *)obj; + + /* we don't incref, the caster *can't* die at this point */ + old = ((cursorObject*)curs)->caster; + ((cursorObject*)curs)->caster = obj; + + if (self->ccast) { + res = self->ccast(str, len, curs); + } + else if (self->pcast) { + res = PyObject_CallFunction(self->pcast, "s#O", str, len, curs); + } + else { + PyErr_SetString(Error, "internal error: no casting function found"); + } + + ((cursorObject*)curs)->caster = old; + + return res; +} diff --git a/psycopg2/psycopg/typecast.h b/psycopg2/psycopg/typecast.h new file mode 100644 index 0000000..ec77e5c --- /dev/null +++ b/psycopg2/psycopg/typecast.h @@ -0,0 +1,85 @@ +/* typecast.h - definitions for typecasters + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_TYPECAST_H +#define PSYCOPG_TYPECAST_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* type of type-casting functions (both C and Python) */ +typedef PyObject *(*typecast_function)(char *, int len, PyObject *); + +/** typecast type **/ + +extern PyTypeObject typecastType; + +typedef struct { + PyObject_HEAD + + PyObject *name; /* the name of this type */ + PyObject *values; /* the different types this instance can match */ + + typecast_function ccast; /* the C casting function */ + PyObject *pcast; /* the python casting function */ + PyObject *bcast; /* base cast, used by array typecasters */ +} typecastObject; + +/* the initialization values are stored here */ + +typedef struct { + char *name; + long int *values; + typecast_function cast; + + /* base is the base typecaster for arrays */ + char *base; +} typecastObject_initlist; + +/* the type dictionary, much faster to access it globally */ +extern PyObject *psyco_types; +extern PyObject *psyco_binary_types; + +/* the default casting objects, used when no other objects are available */ +extern PyObject *psyco_default_cast; +extern PyObject *psyco_default_binary_cast; + +/** exported functions **/ + +/* used by module.c to init the type system and register types */ +extern int typecast_init(PyObject *dict); +extern int typecast_add(PyObject *obj, int binary); + +/* the C callable typecastObject creator function */ +extern PyObject *typecast_from_c(typecastObject_initlist *type, PyObject *d); + +/* the python callable typecast creator function */ +extern PyObject *typecast_from_python( + PyObject *self, PyObject *args, PyObject *keywds); + +/* the function used to dispatch typecasting calls */ +extern PyObject *typecast_cast( + PyObject *self, char *str, int len, PyObject *curs); + +#endif /* !defined(PSYCOPG_TYPECAST_H) */ diff --git a/psycopg2/psycopg/typecast_array.c b/psycopg2/psycopg/typecast_array.c new file mode 100644 index 0000000..7dcb3a3 --- /dev/null +++ b/psycopg2/psycopg/typecast_array.c @@ -0,0 +1,258 @@ +/* typecast_array.c - array typecasters + * + * Copyright (C) 2005 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define MAX_DIMENSIONS 16 + +/** typecast_array_cleanup - remove the horrible [...]= stuff **/ + +static int +typecast_array_cleanup(char **str, int *len) +{ + int i, depth = 1; + + if ((*str)[0] != '[') return -1; + + for (i=1 ; depth > 0 && i < *len ; i++) { + if ((*str)[i] == '[') + depth += 1; + else if ((*str)[i] == ']') + depth -= 1; + } + if ((*str)[i] != '=') return -1; + + *str = &((*str)[i+1]); + *len = *len - i - 1; + return 0; +} + +/** typecast_array_scan - scan a string looking for array items **/ + +#define ASCAN_ERROR -1 +#define ASCAN_EOF 0 +#define ASCAN_BEGIN 1 +#define ASCAN_END 2 +#define ASCAN_TOKEN 3 +#define ASCAN_QUOTED 4 + +static int +typecast_array_tokenize(char *str, int strlength, + int *pos, char** token, int *length) +{ + /* FORTRAN glory */ + int i, j, q, b, l, res; + + Dprintf("typecast_array_tokenize: '%s', %d/%d", + &str[*pos], *pos, strlength); + + /* we always get called with pos pointing at the start of a token, so a + fast check is enough for ASCAN_EOF, ASCAN_BEGIN and ASCAN_END */ + if (*pos == strlength) { + return ASCAN_EOF; + } + else if (str[*pos] == '{') { + *pos += 1; + return ASCAN_BEGIN; + } + else if (str[*pos] == '}') { + *pos += 1; + if (str[*pos] == ',') + *pos += 1; + return ASCAN_END; + } + + /* now we start looking for the first unquoted ',' or '}', the only two + tokens that can limit an array element */ + q = 0; /* if q is odd we're inside quotes */ + b = 0; /* if b is 1 we just encountered a backslash */ + res = ASCAN_TOKEN; + + for (i = *pos ; i < strlength ; i++) { + switch (str[i]) { + case '"': + if (b == 0) + q += 1; + else + b = 0; + break; + + case '\\': + res = ASCAN_QUOTED; + if (b == 0) + b = 1; + else + /* we're backslashing a backslash */ + b = 0; + break; + + case '}': + case ',': + if (b == 0 && ((q&1) == 0)) + goto tokenize; + break; + + default: + /* reset the backslash counter */ + b = 0; + break; + } + } + + tokenize: + /* remove initial quoting character and calculate raw length */ + l = i - *pos; + if (str[*pos] == '"') { + *pos += 1; + l -= 2; + } + + if (res == ASCAN_QUOTED) { + char *buffer = PyMem_Malloc(l+1); + if (buffer == NULL) return ASCAN_ERROR; + + *token = buffer; + + for (j = *pos; j < *pos+l; j++) { + if (str[j] != '\\' + || (j > *pos && str[j-1] == '\\')) + *(buffer++) = str[j]; + } + + *buffer = '\0'; + *length = buffer - *token; + } + else { + *token = &str[*pos]; + *length = l; + } + + *pos = i; + + /* skip the comma and set position to the start of next token */ + if (str[i] == ',') *pos += 1; + + return res; +} + +static int +typecast_array_scan(char *str, int strlength, + PyObject *curs, PyObject *base, PyObject *array) +{ + int state, length = 0, pos = 0; + char *token; + + PyObject *stack[MAX_DIMENSIONS]; + int stack_index = 0; + + while (1) { + token = NULL; + state = typecast_array_tokenize(str, strlength, &pos, &token, &length); + Dprintf("typecast_array_scan: state = %d, length = %d, token = '%s'", + state, length, token); + if (state == ASCAN_TOKEN || state == ASCAN_QUOTED) { + PyObject *obj = typecast_cast(base, token, length, curs); + + /* before anything else we free the memory */ + if (state == ASCAN_QUOTED) PyMem_Free(token); + if (obj == NULL) return 0; + + PyList_Append(array, obj); + Py_DECREF(obj); + } + + else if (state == ASCAN_BEGIN) { + PyObject *sub = PyList_New(0); + if (sub == NULL) return 0; + + PyList_Append(array, sub); + Py_DECREF(sub); + + if (stack_index == MAX_DIMENSIONS) + return 0; + + stack[stack_index++] = array; + array = sub; + } + + else if (state == ASCAN_ERROR) { + return 0; + } + + else if (state == ASCAN_END) { + if (--stack_index < 0) + return 0; + array = stack[stack_index]; + } + + else if (state == ASCAN_EOF) + break; + } + + return 1; +} + + +/** GENERIC - a generic typecaster that can be used when no special actions + have to be taken on the single items **/ + +static PyObject * +typecast_GENERIC_ARRAY_cast(char *str, int len, PyObject *curs) +{ + PyObject *obj = NULL; + PyObject *base = ((typecastObject*)((cursorObject*)curs)->caster)->bcast; + + Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s', len = %d", str, len); + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + if (str[0] == '[') + typecast_array_cleanup(&str, &len); + if (str[0] != '{') { + PyErr_SetString(Error, "array does not start with '{'"); + return NULL; + } + + Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s', len = %d", str, len); + + obj = PyList_New(0); + + /* scan the array skipping the first level of {} */ + if (typecast_array_scan(&str[1], len-2, curs, base, obj) == 0) { + Py_DECREF(obj); + obj = NULL; + } + + return obj; +} + +/** almost all the basic array typecasters are derived from GENERIC **/ + +#define typecast_LONGINTEGERARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_INTEGERARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_FLOATARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_DECIMALARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_STRINGARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_UNICODEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_BOOLEANARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_DATETIMEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_DATEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_TIMEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_INTERVALARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_BINARYARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_ROWIDARRAY_cast typecast_GENERIC_ARRAY_cast diff --git a/psycopg2/psycopg/typecast_basic.c b/psycopg2/psycopg/typecast_basic.c new file mode 100644 index 0000000..e9ac7f4 --- /dev/null +++ b/psycopg2/psycopg/typecast_basic.c @@ -0,0 +1,141 @@ +/* pgcasts_basic.c - basic typecasting functions to python types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** INTEGER - cast normal integers (4 bytes) to python int **/ + +static PyObject * +typecast_INTEGER_cast(char *s, int len, PyObject *curs) +{ + char buffer[12]; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + if (s[len] != '\0') { + strncpy(buffer, s, len); buffer[len] = '\0'; + s = buffer; + } + return PyInt_FromString(s, NULL, 0); +} + +/** LONGINTEGER - cast long integers (8 bytes) to python long **/ + +static PyObject * +typecast_LONGINTEGER_cast(char *s, int len, PyObject *curs) +{ + char buffer[24]; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + if (s[len] != '\0') { + strncpy(buffer, s, len); buffer[len] = '\0'; + s = buffer; + } + return PyLong_FromString(s, NULL, 0); +} + +/** FLOAT - cast floating point numbers to python float **/ + +static PyObject * +typecast_FLOAT_cast(char *s, int len, PyObject *curs) +{ + PyObject *str = NULL, *flo = NULL; + char *pend; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + str = PyString_FromStringAndSize(s, len); + flo = PyFloat_FromString(str, &pend); + Py_DECREF(str); + return flo; +} + +/** STRING - cast strings of any type to python string **/ + +static PyObject * +typecast_STRING_cast(char *s, int len, PyObject *curs) +{ + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + return PyString_FromStringAndSize(s, len); +} + +/** UNICODE - cast strings of any type to a python unicode object **/ + +static PyObject * +typecast_UNICODE_cast(char *s, int len, PyObject *curs) +{ + PyObject *enc; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + enc = PyDict_GetItemString(psycoEncodings, + ((cursorObject*)curs)->conn->encoding); + if (enc) { + return PyUnicode_Decode(s, len, PyString_AsString(enc), NULL); + } + else { + PyErr_Format(InterfaceError, + "can't decode into unicode string from %s", + ((cursorObject*)curs)->conn->encoding); + return NULL; + } +} + +/** BOOLEAN - cast boolean value into right python object **/ + +static PyObject * +typecast_BOOLEAN_cast(char *s, int len, PyObject *curs) +{ + PyObject *res; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + if (s[0] == 't') + res = Py_True; + else + res = Py_False; + + Py_INCREF(res); + return res; +} + +/** DECIMAL - cast any kind of number into a Python Decimal object **/ + +#ifdef HAVE_DECIMAL +static PyObject * +typecast_DECIMAL_cast(char *s, int len, PyObject *curs) +{ + PyObject *res = NULL; + char *buffer; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + if ((buffer = PyMem_Malloc(len+1)) == NULL) + PyErr_NoMemory(); + strncpy(buffer, s, len); buffer[len] = '\0'; + res = PyObject_CallFunction(decimalType, "s", buffer); + PyMem_Free(buffer); + + return res; +} +#else +#define typecast_DECIMAL_cast typecast_FLOAT_cast +#endif + +/* some needed aliases */ +#define typecast_NUMBER_cast typecast_FLOAT_cast +#define typecast_ROWID_cast typecast_INTEGER_cast diff --git a/psycopg2/psycopg/typecast_binary.c b/psycopg2/psycopg/typecast_binary.c new file mode 100644 index 0000000..d490bc7 --- /dev/null +++ b/psycopg2/psycopg/typecast_binary.c @@ -0,0 +1,191 @@ +/* typecast_binary.c - binary typecasting functions to python types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "typecast_binary.h" + +#include +#include + + +/* Python object holding a memory chunk. The memory is deallocated when + the object is destroyed. This type is used to let users directly access + memory chunks holding unescaped binary data through the buffer interface. + */ + +static void +chunk_dealloc(chunkObject *self) +{ + Dprintf("chunk_dealloc: deallocating memory at %p, size %d", + self->base, self->len); + free(self->base); + self->ob_type->tp_free((PyObject *) self); +} + +static PyObject * +chunk_repr(chunkObject *self) +{ + return PyString_FromFormat("", + self->base, self->len); +} + +static int +chunk_getreadbuffer(chunkObject *self, int segment, void **ptr) +{ + if (segment != 0) + { + PyErr_SetString(PyExc_SystemError, + "acessing non-existant buffer segment"); + return -1; + } + *ptr = self->base; + return self->len; +} + +static int +chunk_getsegcount(chunkObject *self, int *lenp) +{ + if (lenp != NULL) + *lenp = self->len; + return 1; +} + +static PyBufferProcs chunk_as_buffer = +{ + (getreadbufferproc) chunk_getreadbuffer, + (getwritebufferproc) NULL, + (getsegcountproc) chunk_getsegcount, + (getcharbufferproc) NULL +}; + +#define chunk_doc "memory chunk" + +PyTypeObject chunkType = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "psycopg2._psycopg.chunk", /* tp_name */ + sizeof(chunkObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) chunk_dealloc, /* tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc) chunk_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + &chunk_as_buffer, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ + chunk_doc /* tp_doc */ +}; + +/* the function typecast_BINARY_cast_unescape is used when libpq does not + provide PQunescapeBytea: it convert all the \xxx octal sequences to the + proper byte value */ + +#ifdef PSYCOPG_OWN_QUOTING +static unsigned char * +typecast_BINARY_cast_unescape(unsigned char *str, size_t *to_length) +{ + char *dstptr, *dststr; + int len, i; + + len = strlen(str); + dststr = (char*)calloc(len, sizeof(char)); + dstptr = dststr; + + if (dststr == NULL) return NULL; + + Py_BEGIN_ALLOW_THREADS; + + for (i = 0; i < len; i++) { + if (str[i] == '\\') { + if ( ++i < len) { + if (str[i] == '\\') { + *dstptr = '\\'; + } + else { + *dstptr = 0; + *dstptr |= (str[i++] & 7) << 6; + *dstptr |= (str[i++] & 7) << 3; + *dstptr |= (str[i] & 7); + } + } + } + else { + *dstptr = str[i]; + } + dstptr++; + } + + Py_END_ALLOW_THREADS; + + *to_length = (size_t)(dstptr-dststr); + + return dststr; +} + +#define PQunescapeBytea typecast_BINARY_cast_unescape +#endif + +static PyObject * +typecast_BINARY_cast(char *s, int l, PyObject *curs) +{ + chunkObject *chunk; + PyObject *res; + char *str, *buffer = NULL; + size_t len; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + /* PQunescapeBytea absolutely wants a 0-terminated string and we don't + want to copy the whole buffer, right? Wrong, but there isn't any other + way */ + if (s[l] != '\0') { + if ((buffer = PyMem_Malloc(l+1)) == NULL) + PyErr_NoMemory(); + strncpy(buffer, s, l); + buffer[l] = '\0'; + s = buffer; + } + str = (char*)PQunescapeBytea((unsigned char*)s, &len); + Dprintf("typecast_BINARY_cast: unescaped %d bytes", len); + if (buffer) PyMem_Free(buffer); + + chunk = (chunkObject *) PyObject_New(chunkObject, &chunkType); + if (chunk == NULL) return NULL; + + chunk->base = str; + chunk->len = len; + if ((res = PyBuffer_FromObject((PyObject *)chunk, 0, len)) == NULL) + return NULL; + + /* PyBuffer_FromObject() created a new reference. Release our reference so + that the memory can be freed once the buffer is garbage collected. */ + Py_DECREF(chunk); + + return res; +} diff --git a/psycopg2/psycopg/typecast_binary.h b/psycopg2/psycopg/typecast_binary.h new file mode 100644 index 0000000..cf985bb --- /dev/null +++ b/psycopg2/psycopg/typecast_binary.h @@ -0,0 +1,47 @@ +/* typecast_binary.h - definitions for binary typecaster + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_TYPECAST_BINARY_H +#define PSYCOPG_TYPECAST_BINARY_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** chunk type **/ + +extern PyTypeObject chunkType; + +typedef struct { + PyObject_HEAD + + void *base; /* Pointer to the memory chunk. */ + int len; /* Size in bytes of the memory chunk. */ + +} chunkObject; + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_TYPECAST_BINARY_H) */ diff --git a/psycopg2/psycopg/typecast_builtins.c b/psycopg2/psycopg/typecast_builtins.c new file mode 100644 index 0000000..0fc109d --- /dev/null +++ b/psycopg2/psycopg/typecast_builtins.c @@ -0,0 +1,60 @@ +static long int typecast_NUMBER_types[] = {20, 23, 21, 701, 700, 1700, 0}; +static long int typecast_LONGINTEGER_types[] = {20, 0}; +static long int typecast_INTEGER_types[] = {23, 21, 0}; +static long int typecast_FLOAT_types[] = {701, 700, 0}; +static long int typecast_DECIMAL_types[] = {1700, 0}; +static long int typecast_UNICODE_types[] = {19, 18, 25, 1042, 1043, 0}; +static long int typecast_STRING_types[] = {19, 18, 25, 1042, 1043, 0}; +static long int typecast_BOOLEAN_types[] = {16, 0}; +static long int typecast_DATETIME_types[] = {1114, 1184, 704, 1186, 0}; +static long int typecast_TIME_types[] = {1083, 1266, 0}; +static long int typecast_DATE_types[] = {1082, 0}; +static long int typecast_INTERVAL_types[] = {704, 1186, 0}; +static long int typecast_BINARY_types[] = {17, 0}; +static long int typecast_ROWID_types[] = {26, 0}; +static long int typecast_LONGINTEGERARRAY_types[] = {1016, 0}; +static long int typecast_INTEGERARRAY_types[] = {1005, 1006, 1007, 0}; +static long int typecast_FLOATARRAY_types[] = {1017, 1021, 1022, 0}; +static long int typecast_DECIMALARRAY_types[] = {1231, 0}; +static long int typecast_UNICODEARRAY_types[] = {1002, 1003, 1009, 1014, 1015, 0}; +static long int typecast_STRINGARRAY_types[] = {1002, 1003, 1009, 1014, 1015, 0}; +static long int typecast_BOOLEANARRAY_types[] = {1000, 0}; +static long int typecast_DATETIMEARRAY_types[] = {1115, 1185, 0}; +static long int typecast_TIMEARRAY_types[] = {1183, 1270, 0}; +static long int typecast_DATEARRAY_types[] = {1182, 0}; +static long int typecast_INTERVALARRAY_types[] = {1187, 0}; +static long int typecast_BINARYARRAY_types[] = {1001, 0}; +static long int typecast_ROWIDARRAY_types[] = {1028, 1013, 0}; + + +typecastObject_initlist typecast_builtins[] = { + {"NUMBER", typecast_NUMBER_types, typecast_NUMBER_cast, NULL}, + {"LONGINTEGER", typecast_LONGINTEGER_types, typecast_LONGINTEGER_cast, NULL}, + {"INTEGER", typecast_INTEGER_types, typecast_INTEGER_cast, NULL}, + {"FLOAT", typecast_FLOAT_types, typecast_FLOAT_cast, NULL}, + {"DECIMAL", typecast_DECIMAL_types, typecast_DECIMAL_cast, NULL}, + {"UNICODE", typecast_UNICODE_types, typecast_UNICODE_cast, NULL}, + {"STRING", typecast_STRING_types, typecast_STRING_cast, NULL}, + {"BOOLEAN", typecast_BOOLEAN_types, typecast_BOOLEAN_cast, NULL}, + {"DATETIME", typecast_DATETIME_types, typecast_DATETIME_cast, NULL}, + {"TIME", typecast_TIME_types, typecast_TIME_cast, NULL}, + {"DATE", typecast_DATE_types, typecast_DATE_cast, NULL}, + {"INTERVAL", typecast_INTERVAL_types, typecast_INTERVAL_cast, NULL}, + {"BINARY", typecast_BINARY_types, typecast_BINARY_cast, NULL}, + {"ROWID", typecast_ROWID_types, typecast_ROWID_cast, NULL}, + {"LONGINTEGERARRAY", typecast_LONGINTEGERARRAY_types, typecast_LONGINTEGERARRAY_cast, "LONGINTEGER"}, + {"INTEGERARRAY", typecast_INTEGERARRAY_types, typecast_INTEGERARRAY_cast, "INTEGER"}, + {"FLOATARRAY", typecast_FLOATARRAY_types, typecast_FLOATARRAY_cast, "FLOAT"}, + {"DECIMALARRAY", typecast_DECIMALARRAY_types, typecast_DECIMALARRAY_cast, "DECIMAL"}, + {"UNICODEARRAY", typecast_UNICODEARRAY_types, typecast_UNICODEARRAY_cast, "UNICODE"}, + {"STRINGARRAY", typecast_STRINGARRAY_types, typecast_STRINGARRAY_cast, "STRING"}, + {"BOOLEANARRAY", typecast_BOOLEANARRAY_types, typecast_BOOLEANARRAY_cast, "BOOLEAN"}, + {"DATETIMEARRAY", typecast_DATETIMEARRAY_types, typecast_DATETIMEARRAY_cast, "DATETIME"}, + {"TIMEARRAY", typecast_TIMEARRAY_types, typecast_TIMEARRAY_cast, "TIME"}, + {"DATEARRAY", typecast_DATEARRAY_types, typecast_DATEARRAY_cast, "DATE"}, + {"INTERVALARRAY", typecast_INTERVALARRAY_types, typecast_INTERVALARRAY_cast, "INTERVAL"}, + {"BINARYARRAY", typecast_BINARYARRAY_types, typecast_BINARYARRAY_cast, "BINARY"}, + {"ROWIDARRAY", typecast_ROWIDARRAY_types, typecast_ROWIDARRAY_cast, "ROWID"}, + {NULL, NULL, NULL, NULL} +}; + diff --git a/psycopg2/psycopg/typecast_datetime.c b/psycopg2/psycopg/typecast_datetime.c new file mode 100644 index 0000000..3a09f07 --- /dev/null +++ b/psycopg2/psycopg/typecast_datetime.c @@ -0,0 +1,279 @@ +/* typecast_datetime.c - date and time typecasting functions to python types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include "datetime.h" + + +/* the pointer to the datetime module API is initialized by the module init + code, we just need to grab it */ +extern PyObject* pyDateTimeModuleP; +extern PyObject *pyDateTypeP; +extern PyObject *pyTimeTypeP; +extern PyObject *pyDateTimeTypeP; +extern PyObject *pyDeltaTypeP; + +/** DATE - cast a date into a date python object **/ + +static PyObject * +typecast_PYDATE_cast(char *str, int len, PyObject *curs) +{ + PyObject* obj = NULL; + int n, y=0, m=0, d=0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + if (!strcmp(str, "infinity") || !strcmp(str, "-infinity")) { + if (str[0] == '-') { + obj = PyObject_GetAttrString(pyDateTypeP, "min"); + } + else { + obj = PyObject_GetAttrString(pyDateTypeP, "max"); + } + } + + else { + n = typecast_parse_date(str, NULL, &len, &y, &m, &d); + Dprintf("typecast_PYDATE_cast: " + "n = %d, len = %d, y = %d, m = %d, d = %d", + n, len, y, m, d); + if (n != 3) { + PyErr_SetString(DataError, "unable to parse date"); + } + else { + obj = PyObject_CallFunction(pyDateTypeP, "iii", y, m, d); + } + } + return obj; +} + +/** DATETIME - cast a timestamp into a datetime python object **/ + +static PyObject * +typecast_PYDATETIME_cast(char *str, int len, PyObject *curs) +{ + PyObject* obj = NULL; + int n, y=0, m=0, d=0; + int hh=0, mm=0, ss=0, us=0, tz=0; + char *tp = NULL; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + /* check for infinity */ + if (!strcmp(str, "infinity") || !strcmp(str, "-infinity")) { + if (str[0] == '-') { + obj = PyObject_GetAttrString(pyDateTimeTypeP, "min"); + } + else { + obj = PyObject_GetAttrString(pyDateTimeTypeP, "max"); + } + } + + else { + Dprintf("typecast_PYDATETIME_cast: s = %s", str); + n = typecast_parse_date(str, &tp, &len, &y, &m, &d); + Dprintf("typecast_PYDATE_cast: tp = %p " + "n = %d, len = %d, y = %d, m = %d, d = %d", + tp, n, len, y, m, d); + if (n != 3) { + PyErr_SetString(DataError, "unable to parse date"); + } + + if (len > 0) { + n = typecast_parse_time(tp, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_PYDATETIME_cast: n = %d, len = %d, " + "hh = %d, mm = %d, ss = %d, us = %d, tz = %d", + n, len, hh, mm, ss, us, tz); + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + } + } + + if (ss > 59) { + mm += 1; + ss -= 60; + } + + if (n == 5 && ((cursorObject*)curs)->tzinfo_factory != Py_None) { + /* we have a time zone, calculate minutes and create + appropriate tzinfo object calling the factory */ + PyObject *tzinfo; + Dprintf("typecast_PYDATETIME_cast: UTC offset = %dm", tz); + tzinfo = PyObject_CallFunction( + ((cursorObject*)curs)->tzinfo_factory, "i", tz); + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiiiO", + y, m, d, hh, mm, ss, us, tzinfo); + Dprintf("typecast_PYDATETIME_cast: tzinfo: %p, refcnt = %d", + tzinfo, tzinfo->ob_refcnt); + Py_XDECREF(tzinfo); + } + else { + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiii", + y, m, d, hh, mm, ss, us); + } + } + return obj; +} + +/** TIME - parse time into a time object **/ + +static PyObject * +typecast_PYTIME_cast(char *str, int len, PyObject *curs) +{ + PyObject* obj = NULL; + int n, hh=0, mm=0, ss=0, us=0, tz=0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + n = typecast_parse_time(str, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_PYTIME_cast: n = %d, len = %d, " + "hh = %d, mm = %d, ss = %d, us = %d, tz = %d", + n, len, hh, mm, ss, us, tz); + + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + } + else { + if (ss > 59) { + mm += 1; + ss -= 60; + } + obj = PyObject_CallFunction(pyTimeTypeP, "iiii", hh, mm, ss, us); + } + return obj; +} + +/** INTERVAL - parse an interval into a timedelta object **/ + +static PyObject * +typecast_PYINTERVAL_cast(char *str, int len, PyObject *curs) +{ + long years = 0, months = 0, days = 0; + double hours = 0.0, minutes = 0.0, seconds = 0.0, hundredths = 0.0; + double v = 0.0, sign = 1.0, denominator = 1.0; + int part = 0, sec; + double micro; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_PYINTERVAL_cast: s = %s", str); + + while (len-- > 0 && *str) { + switch (*str) { + + case '-': + sign = -1.0; + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + v = v*10 + (double)*str - (double)'0'; + if (part == 6){ + denominator *= 10; + } + break; + + case 'y': + if (part == 0) { + years = (long)(v*sign); + str = skip_until_space2(str, &len); + v = 0.0; sign = 1.0; part = 1; + } + break; + + case 'm': + if (part <= 1) { + months = (long)(v*sign); + str = skip_until_space2(str, &len); + v = 0.0; sign = 1.0; part = 2; + } + break; + + case 'd': + if (part <= 2) { + days = (long)(v*sign); + str = skip_until_space2(str, &len); + v = 0.0; sign = 1.0; part = 3; + } + break; + + case ':': + if (part <= 3) { + hours = v; + v = 0.0; part = 4; + } + else if (part == 4) { + minutes = v; + v = 0.0; part = 5; + } + break; + + case '.': + if (part == 5) { + seconds = v; + v = 0.0; part = 6; + } + break; + + default: + break; + } + + str++; + } + + /* manage last value, be it minutes or seconds or hundredths of a second */ + if (part == 4) { + minutes = v; + } + else if (part == 5) { + seconds = v; + } + else if (part == 6) { + hundredths = v; + hundredths = hundredths/denominator; + } + + /* calculates seconds */ + if (sign < 0.0) { + seconds = - (hundredths + seconds + minutes*60 + hours*3600); + } + else { + seconds += hundredths + minutes*60 + hours*3600; + } + + /* calculates days */ + days += years*365 + months*30; + + micro = (seconds - floor(seconds)) * 1000000.0; + sec = (int)floor(seconds); + return PyObject_CallFunction(pyDeltaTypeP, "iii", + days, sec, (int)round(micro)); +} + +/* psycopg defaults to using python datetime types */ + +#ifdef PSYCOPG_DEFAULT_PYDATETIME +#define typecast_DATE_cast typecast_PYDATE_cast +#define typecast_TIME_cast typecast_PYTIME_cast +#define typecast_INTERVAL_cast typecast_PYINTERVAL_cast +#define typecast_DATETIME_cast typecast_PYDATETIME_cast +#endif diff --git a/psycopg2/psycopg/typecast_mxdatetime.c b/psycopg2/psycopg/typecast_mxdatetime.c new file mode 100644 index 0000000..52b1ce7 --- /dev/null +++ b/psycopg2/psycopg/typecast_mxdatetime.c @@ -0,0 +1,231 @@ +/* typecast_mxdatetime.c - date and time typecasting functions to mx types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "mxDateTime.h" + +/* the pointer to the mxDateTime API is initialized by the module init code, + we just need to grab it */ +extern mxDateTimeModule_APIObject *mxDateTimeP; + +/** DATE - cast a date into mx.DateTime python object **/ + +static PyObject * +typecast_MXDATE_cast(char *str, int len, PyObject *curs) +{ + int n, y=0, m=0, d=0; + int hh=0, mm=0, ss=0, us=0, tz=0; + char *tp = NULL; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_MXDATE_cast: s = %s", str); + + /* check for infinity */ + if (!strcmp(str, "infinity") || !strcmp(str, "-infinity")) { + if (str[0] == '-') { + return mxDateTimeP->DateTime_FromDateAndTime(-999998,1,1, 0,0,0); + } + else { + return mxDateTimeP->DateTime_FromDateAndTime(999999,12,31, 0,0,0); + } + } + + n = typecast_parse_date(str, &tp, &len, &y, &m, &d); + Dprintf("typecast_MXDATE_cast: tp = %p n = %d, len = %d, " + "y = %d, m = %d, d = %d", tp, n, len, y, m, d); + if (n != 3) { + PyErr_SetString(DataError, "unable to parse date"); + } + + if (len > 0) { + n = typecast_parse_time(tp, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_MXDATE_cast: n = %d, len = %d, " + "hh = %d, mm = %d, ss = %d, us = %d, tz = %d", + n, len, hh, mm, ss, us, tz); + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + } + } + + Dprintf("typecast_MXDATE_cast: fractionary seconds: %lf", + (double)ss + (double)us/(double)1000000.0); + return mxDateTimeP->DateTime_FromDateAndTime(y, m, d, hh, mm, + (double)ss + (double)us/(double)1000000.0); +} + +/** TIME - parse time into an mx.DateTime object **/ + +static PyObject * +typecast_MXTIME_cast(char *str, int len, PyObject *curs) +{ + int n, hh=0, mm=0, ss=0, us=0, tz=0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_MXTIME_cast: s = %s", str); + + n = typecast_parse_time(str, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_MXTIME_cast: time parsed, %d components", n); + Dprintf("typecast_MXTIME_cast: hh = %d, mm = %d, ss = %d, us = %d", + hh, mm, ss, us); + + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + return NULL; + } + + Dprintf("typecast_MXTIME_cast: fractionary seconds: %lf", + (double)ss + (double)us/(double)1000000.0); + return mxDateTimeP->DateTimeDelta_FromTime(hh, mm, + (double)ss + (double)us/(double)1000000.0); +} + +/** INTERVAL - parse an interval into an mx.DateTimeDelta **/ + +static PyObject * +typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs) +{ + long years = 0, months = 0, days = 0, denominator = 1; + double hours = 0.0, minutes = 0.0, seconds = 0.0, hundredths = 0.0; + double v = 0.0, sign = 1.0; + int part = 0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_MXINTERVAL_cast: s = %s", str); + + while (*str) { + switch (*str) { + + case '-': + sign = -1.0; + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + v = v*10 + (double)*str - (double)'0'; + Dprintf("typecast_MXINTERVAL_cast: v = %f", v); + if (part == 6){ + denominator *= 10; + Dprintf("typecast_MXINTERVAL_cast: denominator = %ld", + denominator); + } + break; + + case 'y': + if (part == 0) { + years = (long)(v*sign); + str = skip_until_space(str); + Dprintf("typecast_MXINTERVAL_cast: years = %ld, rest = %s", + years, str); + v = 0.0; sign = 1.0; part = 1; + } + break; + + case 'm': + if (part <= 1) { + months = (long)(v*sign); + str = skip_until_space(str); + Dprintf("typecast_MXINTERVAL_cast: months = %ld, rest = %s", + months, str); + v = 0.0; sign = 1.0; part = 2; + } + break; + + case 'd': + if (part <= 2) { + days = (long)(v*sign); + str = skip_until_space(str); + Dprintf("typecast_MXINTERVAL_cast: days = %ld, rest = %s", + days, str); + v = 0.0; sign = 1.0; part = 3; + } + break; + + case ':': + if (part <= 3) { + hours = v; + Dprintf("typecast_MXINTERVAL_cast: hours = %f", hours); + v = 0.0; part = 4; + } + else if (part == 4) { + minutes = v; + Dprintf("typecast_MXINTERVAL_cast: minutes = %f", minutes); + v = 0.0; part = 5; + } + break; + + case '.': + if (part == 5) { + seconds = v; + Dprintf("typecast_MXINTERVAL_cast: seconds = %f", seconds); + v = 0.0; part = 6; + } + break; + + default: + break; + } + + str++; + } + + /* manage last value, be it minutes or seconds or hundredths of a second */ + if (part == 4) { + minutes = v; + Dprintf("typecast_MXINTERVAL_cast: minutes = %f", minutes); + } + else if (part == 5) { + seconds = v; + Dprintf("typecast_MXINTERVAL_cast: seconds = %f", seconds); + } + else if (part == 6) { + hundredths = v; + Dprintf("typecast_MXINTERVAL_cast: hundredths = %f", hundredths); + hundredths = hundredths/denominator; + Dprintf("typecast_MXINTERVAL_cast: fractions = %.20f", hundredths); + } + + /* calculates seconds */ + if (sign < 0.0) { + seconds = - (hundredths + seconds + minutes*60 + hours*3600); + } + else { + seconds += hundredths + minutes*60 + hours*3600; + } + + /* calculates days */ + days += years*365 + months*30; + + Dprintf("typecast_MXINTERVAL_cast: days = %ld, seconds = %f", + days, seconds); + return mxDateTimeP->DateTimeDelta_FromDaysAndSeconds(days, seconds); +} + +/* psycopg defaults to using mx types */ + +#ifdef PSYCOPG_DEFAULT_MXDATETIME +#define typecast_DATE_cast typecast_MXDATE_cast +#define typecast_TIME_cast typecast_MXTIME_cast +#define typecast_INTERVAL_cast typecast_MXINTERVAL_cast +#define typecast_DATETIME_cast typecast_MXDATE_cast +#endif + diff --git a/psycopg2/scripts/buildtypes.py b/psycopg2/scripts/buildtypes.py new file mode 100644 index 0000000..197272f --- /dev/null +++ b/psycopg2/scripts/buildtypes.py @@ -0,0 +1,124 @@ +# -*- python -*- +# +# Copyright (C) 2001-2003 Federico Di Gregorio +# +# This file is part of the psycopg module. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2, +# or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# this a little script that analyze a file with (TYPE, NUMBER) tuples +# and write out C code ready for inclusion in psycopg. the generated +# code defines the DBAPITypeObject fundamental types and warns for +# undefined types. + +import sys, os, string, copy +from string import split, join, strip + + +# here is the list of the foundamental types we want to import from +# postgresql header files + +basic_types = (['NUMBER', ['INT8', 'INT4', 'INT2', 'FLOAT8', 'FLOAT4', + 'NUMERIC']], + ['LONGINTEGER', ['INT8']], + ['INTEGER', ['INT4', 'INT2']], + ['FLOAT', ['FLOAT8', 'FLOAT4']], + ['DECIMAL', ['NUMERIC']], + ['UNICODE', ['NAME', 'CHAR', 'TEXT', 'BPCHAR', + 'VARCHAR']], + ['STRING', ['NAME', 'CHAR', 'TEXT', 'BPCHAR', + 'VARCHAR']], + ['BOOLEAN', ['BOOL']], + ['DATETIME', ['TIMESTAMP', 'TIMESTAMPTZ', + 'TINTERVAL', 'INTERVAL']], + ['TIME', ['TIME', 'TIMETZ']], + ['DATE', ['DATE']], + ['INTERVAL', ['TINTERVAL', 'INTERVAL']], + ['BINARY', ['BYTEA']], + ['ROWID', ['OID']]) + +# unfortunately we don't have a nice way to extract array information +# from postgresql headers; we'll have to do it hard-coding :/ +array_types = (['LONGINTEGER', [1016]], + ['INTEGER', [1005, 1006, 1007]], + ['FLOAT', [1017, 1021, 1022]], + ['DECIMAL', [1231]], + ['UNICODE', [1002, 1003, 1009, 1014, 1015]], + ['STRING', [1002, 1003, 1009, 1014, 1015]], + ['BOOLEAN', [1000]], + ['DATETIME', [1115, 1185]], + ['TIME', [1183, 1270]], + ['DATE', [1182]], + ['INTERVAL', [1187]], + ['BINARY', [1001]], + ['ROWID', [1028, 1013]]) + +# this is the header used to compile the data in the C module +HEADER = """ +typecastObject_initlist typecast_builtins[] = { +""" + +# then comes the footer +FOOTER = """ {NULL, NULL, NULL, NULL}\n};\n""" + + +# usefull error reporting function +def error(msg): + """Report an error on stderr.""" + sys.stderr.write(msg+'\n') + + +# read couples from stdin and build list +read_types = [] +for l in sys.stdin.readlines(): + oid, val = split(l) + read_types.append((strip(oid)[:-3], strip(val))) + +# look for the wanted types in the read touples +found_types = {} + +for t in basic_types: + k = t[0] + found_types[k] = [] + for v in t[1]: + found = filter(lambda x, y=v: x[0] == y, read_types) + if len(found) == 0: + error(v+': value not found') + elif len(found) > 1: + error(v+': too many values') + else: + found_types[k].append(int(found[0][1])) + +# now outputs to stdout the right C-style definitions +stypes = "" ; sstruct = "" +for t in basic_types: + k = t[0] + s = str(found_types[k]) + s = '{' + s[1:-1] + ', 0}' + stypes = stypes + ('static long int typecast_%s_types[] = %s;\n' % (k, s)) + sstruct += (' {"%s", typecast_%s_types, typecast_%s_cast, NULL},\n' + % (k, k, k)) +for t in array_types: + kt = t[0] + ka = t[0]+'ARRAY' + s = str(t[1]) + s = '{' + s[1:-1] + ', 0}' + stypes = stypes + ('static long int typecast_%s_types[] = %s;\n' % (ka, s)) + sstruct += (' {"%s", typecast_%s_types, typecast_%s_cast, "%s"},\n' + % (ka, ka, ka, kt)) +sstruct = HEADER + sstruct + FOOTER + +print stypes +print sstruct diff --git a/psycopg2/scripts/ext2html.py b/psycopg2/scripts/ext2html.py new file mode 100755 index 0000000..f7c95d8 --- /dev/null +++ b/psycopg2/scripts/ext2html.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python + +# Author: Daniele Varrazzo +# Contact: daniele dot varrazzo at gmail dot com +# Revision: $Revision: 711 $ +# Date: $Date$ +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing HTML. + +Output can refer to Epydoc-generated APIs through the iterpreted text role +"api". +""" + +import types +import sys + +# The url fragment where the api "index.html" resides w.r.t. the generated docs +api_root = "api/" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description +from docutils.parsers.rst.roles import register_canonical_role +from docutils import nodes, utils + +# api references are searched for in these modules +api_modules = [ + 'psycopg2', + 'psycopg2._psycopg', + 'psycopg2.extensions', +] + +# name starting with a dot are looking as those objects attributes. +searched_objects = [ + # module_name, object_name + ('psycopg2.extensions', 'connection'), + ('psycopg2.extensions', 'cursor'), +] + +# import all the referenced modules +for modname in api_modules: + __import__(modname) + +class EpydocTarget: + """Representation of an element language.""" + def __init__(self, name, element): + self.name = name + + # The python object described + self.element = element + + # The base name of the page + self.page = None + + # The url fragment + self.fragment = None + + def get_url(self): + # is it a private element? + components = self.page.split('.') + if self.fragment: components.append(self.fragment) + + for component in components: + if component.startswith('_'): + private = True + break + else: + private = False + + ref = api_root + (private and "private/" or "public/") \ + + self.page + "-" + self.get_type() + ".html" + if self.fragment: + ref = ref + "#" + self.fragment + + return ref + + def get_type(self): + # detect the element type + if isinstance(self.element, types.TypeType): + return 'class' + elif isinstance(self.element, types.ModuleType): + return 'module' + else: + raise ValueError("Can't choose a type for '%s'." % self.name) + +def filter_par(name): + """Filter parenthesis away from a name.""" + if name.endswith(")"): + return name.split("(")[0] + else: + return name + +def get_element_target(name): + """Return the life, the death, the miracles about a package element.""" + + name = filter_par(name) + + if name.startswith('.'): + for modname, objname in searched_objects: + if hasattr(getattr(sys.modules[modname], objname), name[1:]): + name = objname + name + break + + # is the element a module? + if name in api_modules: + out = EpydocTarget(name, sys.modules[name]) + out.page = name + return out + + # look for the element in some module + for modname in api_modules: + element = getattr(sys.modules[modname], name, None) + if element is not None: + + # Check if it is a function defined in a module + if isinstance(element, + (int, types.FunctionType, types.BuiltinFunctionType)): + out = EpydocTarget(name, sys.modules[modname]) + out.page = modname + out.fragment = name + else: + out = EpydocTarget(name, element) + out.page = modname + '.' + name + + return out + + # maybe a qualified name? + if '.' in name: + out = get_element_target('.'.join(name.split('.')[:-1])) + if out is not None: + out.fragment = filter_par(name.split('.')[-1]) + return out + + raise ValueError("Can't find '%s' in any provided module." % name) + +def api_role(role, rawtext, text, lineno, inliner, + options={}, content=[]): + try: + target = get_element_target(text) + except Exception, exc: + msg = inliner.reporter.error(str(exc), line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + + ref = target.get_url() + node2 = nodes.literal(rawtext, utils.unescape(text)) + node = nodes.reference(rawtext, '', node2, refuri=ref, + **options) + return [node], [] + + +register_canonical_role('api', api_role) + +# Register the 'api' role as canonical role +from docutils.parsers.rst import roles +roles.DEFAULT_INTERPRETED_ROLE = 'api' + + +description = ('Generates (X)HTML documents from standalone reStructuredText ' + 'sources with links to Epydoc API. ' + default_description) + + +publish_cmdline(writer_name='html', description=description) diff --git a/psycopg2/scripts/makedocs.py b/psycopg2/scripts/makedocs.py new file mode 100755 index 0000000..dcaa940 --- /dev/null +++ b/psycopg2/scripts/makedocs.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +"""Build documentation and api.""" + +import os + +EPYDOC = "python c:/programmi/python23/scripts/epydoc.py" +PSYCOPG = "c:/programmi/python23/lib/site-packages/psycopg2" + +os.system("python ext2html.py ../doc/extensions.rst > ../doc/extensions.html") +os.system("%s " + "-o ../doc/api " + "--css ../doc/api-screen.css " + "--docformat restructuredtext " + "%s" + % (EPYDOC,PSYCOPG,)) diff --git a/psycopg2/scripts/maketypes.sh b/psycopg2/scripts/maketypes.sh new file mode 100755 index 0000000..ab133c1 --- /dev/null +++ b/psycopg2/scripts/maketypes.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +SCRIPTSDIR="`dirname $0`" +SRCDIR="`dirname $SCRIPTSDIR`/psycopg" + +if [ -z "$1" ] ; then + echo Usage: $0 '' + exit 1 +fi + +echo -n checking for pg_type.h ... +if [ -f "$1/catalog/pg_type.h" ] ; then + PGTYPE="$1/catalog/pg_type.h" +else + if [ -f "$1/server/catalog/pg_type.h" ] ; then + PGTYPE="$1/server/catalog/pg_type.h" + else + echo + echo "error: can't find pg_type.h under $1" + exit 2 + fi +fi +echo " found" + +PGVERSION="`sed -n -e 's/.*PG_VERSION \"\([0-9]\.[0-9]\).*\"/\1/p' $1/pg_config.h`" +PGMAJOR="`echo $PGVERSION | cut -d. -f1`" +PGMINOR="`echo $PGVERSION | cut -d. -f2`" + +echo checking for postgresql major: $PGMAJOR +echo checking for postgresql minor: $PGMINOR + +echo -n generating pgtypes.h ... +awk '/#define .+OID/ {print "#define " $2 " " $3}' "$PGTYPE" \ + > $SRCDIR/pgtypes.h +echo " done" +echo -n generating typecast_builtins.c ... +awk '/#define .+OID/ {print $2 " " $3}' "$PGTYPE" | \ + python $SCRIPTSDIR/buildtypes.py >$SRCDIR/typecast_builtins.c +echo " done" + + diff --git a/psycopg2/setup.cfg b/psycopg2/setup.cfg new file mode 100644 index 0000000..9c32951 --- /dev/null +++ b/psycopg2/setup.cfg @@ -0,0 +1,46 @@ +[build_ext] +define=PSYCOPG_EXTENSIONS,PSYCOPG_DISPLAY_SIZE,PSYCOPG_NEW_BOOLEAN,HAVE_PQFREEMEM,HAVE_PQPROTOCOL3 +# PSYCOPG_EXTENSIONS enables extensions to PEP-249 (you really want this) +# PSYCOPG_DISPLAY_SIZE enable display size calculation (a little slower) +# HAVE_PQFREEMEM should be defined on PostgreSQL >= 7.3 +# HAVE_PQPROTOCOL3 should be defined on PostgreSQL >= 7.4 +# PSYCOPG_DEBUG can be added to enable verbose debug information +# PSYCOPG_OWN_QUOTING can be added, but it is deprecated (will go away in 2.1) +# PSYCOPG_NEW_BOOLEAN to format booleans as true/false vs 't'/'f' + +# Set to 1 to use Python datatime objects for default date/time representation +use_pydatetime=1 + +# Set to 1 if you want to enable "Decimal" type on python 2.3. +# If the "decimal" module is found in the PYTHONPATH it will be used, else +# fall back on the float type (this is disabled by default to be compatible +# with old versions of psycopg 1 and pre-beta versions of psycopg 2.) +use_decimal=0 + +# If the build system does not find the mx.DateTime headers, try +# uncommenting the following line and setting its value to the right path. +#mx_include_dir= + +# "pg_config" is the preferred method to locate PostgreSQL headers and +# libraries needed to build psycopg2. If pg_config is not in the path or +# is installed under a different name uncomment the following option and +# set it to the pg_config full path. +#pg_config= + +# If "pg_config" is not available, "include_dirs" can be used to locate +# postgresql headers and libraries. Some extra checks on sys.platform will +# still be done in setup.py. +# The next line is the default as used on psycopg author Debian laptop: +#include_dirs=/usr/include/postgresql:/usr/include/postgresql/server + +# Uncomment next line on Mandrake 10.x (and comment previous ones): +#include_dirs=/usr/include/pgsql/8.0:/usr/include/pgsql/8.0/server + +# Uncomment next line on SUSE 9.3 (and comment previous ones): +#include_dirs=/usr/include/pgsql:/usr/include/pgsql/server + +# If postgresql is installed somewhere weird (i.e., not in your runtime library +# path like /usr/lib), just add the right path in "library_dirs" and any extra +# libraries required to link in "libraries". +#library_dirs= +#libraries= diff --git a/psycopg2/setup.py b/psycopg2/setup.py new file mode 100644 index 0000000..45daed7 --- /dev/null +++ b/psycopg2/setup.py @@ -0,0 +1,293 @@ +# setup.py - distutils packaging +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +"""Python-PostgreSQL Database Adapter + +psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being +very small and fast, and stable as a rock. + +psycopg is different from the other database adapter because it was +designed for heavily multi-threaded applications that create and destroy +lots of cursors and make a conspicuous number of concurrent INSERTs or +UPDATEs. psycopg 2 also provide full asycronous operations for the really +brave programmer. +""" + +classifiers = """\ +Development Status :: 4 - Beta +Intended Audience :: Developers +License :: OSI Approved :: GNU General Public License (GPL) +License :: OSI Approved :: Zope Public License +Programming Language :: Python +Programming Language :: C +Programming Language :: SQL +Topic :: Database +Topic :: Database :: Front-Ends +Topic :: Software Development +Topic :: Software Development :: Libraries :: Python Modules +Operating System :: Microsoft :: Windows +Operating System :: Unix +""" + +import os +import sys +import popen2 +from distutils.core import setup, Extension +from distutils.errors import DistutilsFileError +from distutils.command.build_ext import build_ext +from distutils.sysconfig import get_python_inc +from distutils.ccompiler import get_default_compiler + +PSYCOPG_VERSION = '2.0.5.1' +version_flags = [] + +# to work around older distutil limitations +if sys.version < '2.2.3': + from distutils.dist import DistributionMetadata + DistributionMetadata.classifiers = None + DistributionMetadata.download_url = None + +def get_pg_config(kind, pg_config="pg_config"): + p = popen2.popen3(pg_config + " --" + kind) + r = p[0].readline().strip() + if not r: + raise Warning(p[2].readline()) + return r + +class psycopg_build_ext(build_ext): + """Conditionally complement the setup.cfg options file. + + This class configures the include_dirs, libray_dirs, libraries + options as required by the system. Most of the configuration happens + in finalize_options() method. + + If you want to set up the build step for a peculiar platform, add a + method finalize_PLAT(), where PLAT matches your sys.platform. + """ + user_options = build_ext.user_options[:] + user_options.extend([ + ('use-pydatetime', None, + "Use Python datatime objects for date and time representation."), + ('pg-config=', None, + "The name of the pg_config binary and/or full path to find it"), + ('use-decimal', None, + "Use Decimal type even on Python 2.3 if the module is provided."), + ]) + + boolean_options = build_ext.boolean_options[:] + boolean_options.extend(('use-pydatetime', 'use-decimal')) + + DEFAULT_PG_CONFIG = "pg_config" + + def initialize_options(self): + build_ext.initialize_options(self) + self.use_pg_dll = 1 + self.pgdir = None + self.pg_config = self.DEFAULT_PG_CONFIG + self.mx_include_dir = None + + def get_compiler(self): + """Return the c compiler to compile extensions. + + If a compiler was not explicitely set (on the command line, for + example), fall back on the default compiler. + """ + return self.compiler or get_default_compiler() + + def get_pg_config(self, kind): + return get_pg_config(kind, self.pg_config) + + def build_extensions(self): + # Linking against this library causes psycopg2 to crash + # on Python >= 2.4. Maybe related to strdup calls, cfr. + # http://mail.python.org/pipermail/distutils-sig/2005-April/004433.html + if self.get_compiler().compiler_type == "mingw32" \ + and 'msvcr71' in self.compiler.dll_libraries: + self.compiler.dll_libraries.remove('msvcr71') + + build_ext.build_extensions(self) + + def finalize_win32(self): + """Finalize build system configuration on win32 platform.""" + self.libraries.append("ws2_32") + self.libraries.append("advapi32") + if self.get_compiler() == "msvc": + # MSVC requires an explicit "libpq" + self.libraries.remove("pq") + self.libraries.append("libpq") + self.libraries.append("shfolder") + for path in self.library_dirs: + if os.path.isfile(os.path.join(path, "ms", "libpq.lib")): + self.library_dirs.append(os.path.join(path, "ms")) + break + + def finalize_darwin(self): + """Finalize build system configuration on darwin platform.""" + self.libraries.append('ssl') + self.libraries.append('crypto') + + def finalize_options(self): + """Complete the build system configuation.""" + build_ext.finalize_options(self) + + self.include_dirs.append(".") + self.libraries.append("pq") + + try: + self.library_dirs.append(self.get_pg_config("libdir")) + self.include_dirs.append(self.get_pg_config("includedir")) + self.include_dirs.append(self.get_pg_config("includedir-server")) + try: + # Here we take a conservative approach: we suppose that + # *at least* PostgreSQL 7.4 is available (this is the only + # 7.x series supported by psycopg 2) + pgversion = self.get_pg_config("version").split()[1] + pgmajor, pgminor, pgpatch = pgversion.split('.') + except: + pgmajor, pgminor, pgpatch = 7, 4, 0 + define_macros.append(("PG_MAJOR_VERSION", pgmajor)) + define_macros.append(("PG_MINOR_VERSION", pgminor)) + define_macros.append(("PG_PATCH_VERSION", pgpatch)) + except Warning, w: + if self.pg_config == self.DEFAULT_PG_CONFIG: + sys.stderr.write("Warning: %s" % str(w)) + else: + sys.stderr.write("Error: %s" % str(w)) + sys.exit(1) + + if hasattr(self, "finalize_" + sys.platform): + getattr(self, "finalize_" + sys.platform)() + +# let's start with macro definitions (the ones not already in setup.cfg) +define_macros = [] +include_dirs = [] + +# python version +define_macros.append(('PY_MAJOR_VERSION', str(sys.version_info[0]))) +define_macros.append(('PY_MINOR_VERSION', str(sys.version_info[1]))) + +# some macros related to python versions and features +if sys.version_info[0] >= 2 and sys.version_info[1] >= 3: + define_macros.append(('HAVE_PYBOOL','1')) + +# gather information to build the extension module +ext = [] ; data_files = [] + +# sources + +sources = [ + 'psycopgmodule.c', 'pqpath.c', 'typecast.c', + 'microprotocols.c', 'microprotocols_proto.c', + 'connection_type.c', 'connection_int.c', 'cursor_type.c', 'cursor_int.c', + 'adapter_qstring.c', 'adapter_pboolean.c', 'adapter_binary.c', + 'adapter_asis.c', 'adapter_list.c'] + +from ConfigParser import ConfigParser +parser = ConfigParser() +parser.read('setup.cfg') + +# Choose if to use Decimal type +use_decimal = int(parser.get('build_ext', 'use_decimal')) +if sys.version_info[0] >= 2 and ( + sys.version_info[1] >= 4 or (sys.version_info[1] == 3 and use_decimal)): + define_macros.append(('HAVE_DECIMAL','1')) + version_flags.append('dec') + +# Choose a datetime module +have_pydatetime = False +have_mxdatetime = False +use_pydatetime = int(parser.get('build_ext', 'use_pydatetime')) + +# check for mx package +if parser.has_option('build_ext', 'mx_include_dir'): + mxincludedir = parser.get('build_ext', 'mx_include_dir') +else: + mxincludedir = os.path.join(get_python_inc(plat_specific=1), "mx") +if os.path.exists(mxincludedir): + include_dirs.append(mxincludedir) + define_macros.append(('HAVE_MXDATETIME','1')) + sources.append('adapter_mxdatetime.c') + have_mxdatetime = True + version_flags.append('mx') + +# check for python datetime package +if os.path.exists(os.path.join(get_python_inc(plat_specific=1),"datetime.h")): + define_macros.append(('HAVE_PYDATETIME','1')) + sources.append('adapter_datetime.c') + have_pydatetime = True + version_flags.append('dt') + +# now decide which package will be the default for date/time typecasts +if have_pydatetime and use_pydatetime \ + or have_pydatetime and not have_mxdatetime: + define_macros.append(('PSYCOPG_DEFAULT_PYDATETIME','1')) +elif have_mxdatetime: + define_macros.append(('PSYCOPG_DEFAULT_MXDATETIME','1')) +else: + def e(msg): + sys.stderr.write("error: " + msg + "\n") + e("psycopg requires a datetime module:") + e(" mx.DateTime module not found") + e(" python datetime module not found") + e("Note that psycopg needs the module headers and not just the module") + e("itself. If you installed Python or mx.DateTime from a binary package") + e("you probably need to install its companion -dev or -devel package.") + sys.exit(1) + +# generate a nice version string to avoid confusion when users report bugs +for have in parser.get('build_ext', 'define').split(','): + if have == 'PSYCOPG_EXTENSIONS': + version_flags.append('ext') + elif have == 'HAVE_PQPROTOCOL3': + version_flags.append('pq3') +if version_flags: + PSYCOPG_VERSION_EX = PSYCOPG_VERSION + " (%s)" % ' '.join(version_flags) +else: + PSYCOPG_VERSION_EX = PSYCOPG_VERSION + +if sys.platform != 'win32': + define_macros.append(('PSYCOPG_VERSION', '"'+PSYCOPG_VERSION_EX+'"')) +else: + define_macros.append(('PSYCOPG_VERSION', '\\"'+PSYCOPG_VERSION_EX+'\\"')) + +# build the extension + +sources = map(lambda x: os.path.join('psycopg', x), sources) + +ext.append(Extension("psycopg2._psycopg", sources, + define_macros=define_macros, + include_dirs=include_dirs, + undef_macros=[])) + +setup(name="psycopg2", + version=PSYCOPG_VERSION, + maintainer="Federico Di Gregorio", + maintainer_email="fog@initd.org", + author="Federico Di Gregorio", + author_email="fog@initd.org", + url="http://initd.org/tracker/psycopg", + download_url = "http://initd.org/pub/software/psycopg2", + license="GPL with exceptions or ZPL", + platforms = ["any"], + description=__doc__.split("\n")[0], + long_description="\n".join(__doc__.split("\n")[2:]), + classifiers=filter(None, classifiers.split("\n")), + data_files=data_files, + package_dir={'psycopg2':'lib'}, + packages=['psycopg2'], + cmdclass={ 'build_ext': psycopg_build_ext }, + ext_modules=ext) diff --git a/psycopg2/tests/dbapi20.py b/psycopg2/tests/dbapi20.py new file mode 100644 index 0000000..4fc8c0c --- /dev/null +++ b/psycopg2/tests/dbapi20.py @@ -0,0 +1,850 @@ +#!/usr/bin/env python +''' Python DB API 2.0 driver compliance unit test suite. + + This software is Public Domain and may be used without restrictions. + + "Now we have booze and barflies entering the discussion, plus rumours of + DBAs on drugs... and I won't tell you what flashes through my mind each + time I read the subject line with 'Anal Compliance' in it. All around + this is turning out to be a thoroughly unwholesome unit test." + + -- Ian Bicking +''' + +__rcs_id__ = '$Id: dbapi20.py,v 1.10 2003/10/09 03:14:14 zenzen Exp $' +__version__ = '$Revision: 1.10 $'[11:-2] +__author__ = 'Stuart Bishop ' + +import unittest +import time + +# $Log: dbapi20.py,v $ +# Revision 1.10 2003/10/09 03:14:14 zenzen +# Add test for DB API 2.0 optional extension, where database exceptions +# are exposed as attributes on the Connection object. +# +# Revision 1.9 2003/08/13 01:16:36 zenzen +# Minor tweak from Stefan Fleiter +# +# Revision 1.8 2003/04/10 00:13:25 zenzen +# Changes, as per suggestions by M.-A. Lemburg +# - Add a table prefix, to ensure namespace collisions can always be avoided +# +# Revision 1.7 2003/02/26 23:33:37 zenzen +# Break out DDL into helper functions, as per request by David Rushby +# +# Revision 1.6 2003/02/21 03:04:33 zenzen +# Stuff from Henrik Ekelund: +# added test_None +# added test_nextset & hooks +# +# Revision 1.5 2003/02/17 22:08:43 zenzen +# Implement suggestions and code from Henrik Eklund - test that cursor.arraysize +# defaults to 1 & generic cursor.callproc test added +# +# Revision 1.4 2003/02/15 00:16:33 zenzen +# Changes, as per suggestions and bug reports by M.-A. Lemburg, +# Matthew T. Kromer, Federico Di Gregorio and Daniel Dittmar +# - Class renamed +# - Now a subclass of TestCase, to avoid requiring the driver stub +# to use multiple inheritance +# - Reversed the polarity of buggy test in test_description +# - Test exception heirarchy correctly +# - self.populate is now self._populate(), so if a driver stub +# overrides self.ddl1 this change propogates +# - VARCHAR columns now have a width, which will hopefully make the +# DDL even more portible (this will be reversed if it causes more problems) +# - cursor.rowcount being checked after various execute and fetchXXX methods +# - Check for fetchall and fetchmany returning empty lists after results +# are exhausted (already checking for empty lists if select retrieved +# nothing +# - Fix bugs in test_setoutputsize_basic and test_setinputsizes +# + +class DatabaseAPI20Test(unittest.TestCase): + ''' Test a database self.driver for DB API 2.0 compatibility. + This implementation tests Gadfly, but the TestCase + is structured so that other self.drivers can subclass this + test case to ensure compiliance with the DB-API. It is + expected that this TestCase may be expanded in the future + if ambiguities or edge conditions are discovered. + + The 'Optional Extensions' are not yet being tested. + + self.drivers should subclass this test, overriding setUp, tearDown, + self.driver, connect_args and connect_kw_args. Class specification + should be as follows: + + import dbapi20 + class mytest(dbapi20.DatabaseAPI20Test): + [...] + + Don't 'import DatabaseAPI20Test from dbapi20', or you will + confuse the unit tester - just 'import dbapi20'. + ''' + + # The self.driver module. This should be the module where the 'connect' + # method is to be found + driver = None + connect_args = () # List of arguments to pass to connect + connect_kw_args = {} # Keyword arguments for connect + table_prefix = 'dbapi20test_' # If you need to specify a prefix for tables + + ddl1 = 'create table %sbooze (name varchar(20))' % table_prefix + ddl2 = 'create table %sbarflys (name varchar(20))' % table_prefix + xddl1 = 'drop table %sbooze' % table_prefix + xddl2 = 'drop table %sbarflys' % table_prefix + + lowerfunc = 'lower' # Name of stored procedure to convert string->lowercase + + # Some drivers may need to override these helpers, for example adding + # a 'commit' after the execute. + def executeDDL1(self,cursor): + cursor.execute(self.ddl1) + + def executeDDL2(self,cursor): + cursor.execute(self.ddl2) + + def setUp(self): + ''' self.drivers should override this method to perform required setup + if any is necessary, such as creating the database. + ''' + pass + + def tearDown(self): + ''' self.drivers should override this method to perform required cleanup + if any is necessary, such as deleting the test database. + The default drops the tables that may be created. + ''' + con = self._connect() + try: + cur = con.cursor() + for ddl in (self.xddl1,self.xddl2): + try: + cur.execute(ddl) + con.commit() + except self.driver.Error: + # Assume table didn't exist. Other tests will check if + # execute is busted. + pass + finally: + con.close() + + def _connect(self): + try: + return self.driver.connect( + *self.connect_args,**self.connect_kw_args + ) + except AttributeError: + self.fail("No connect method found in self.driver module") + + def test_connect(self): + con = self._connect() + con.close() + + def test_apilevel(self): + try: + # Must exist + apilevel = self.driver.apilevel + # Must equal 2.0 + self.assertEqual(apilevel,'2.0') + except AttributeError: + self.fail("Driver doesn't define apilevel") + + def test_threadsafety(self): + try: + # Must exist + threadsafety = self.driver.threadsafety + # Must be a valid value + self.failUnless(threadsafety in (0,1,2,3)) + except AttributeError: + self.fail("Driver doesn't define threadsafety") + + def test_paramstyle(self): + try: + # Must exist + paramstyle = self.driver.paramstyle + # Must be a valid value + self.failUnless(paramstyle in ( + 'qmark','numeric','named','format','pyformat' + )) + except AttributeError: + self.fail("Driver doesn't define paramstyle") + + def test_Exceptions(self): + # Make sure required exceptions exist, and are in the + # defined heirarchy. + self.failUnless(issubclass(self.driver.Warning,StandardError)) + self.failUnless(issubclass(self.driver.Error,StandardError)) + self.failUnless( + issubclass(self.driver.InterfaceError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.DatabaseError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.OperationalError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.IntegrityError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.InternalError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.ProgrammingError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.NotSupportedError,self.driver.Error) + ) + + def test_ExceptionsAsConnectionAttributes(self): + # OPTIONAL EXTENSION + # Test for the optional DB API 2.0 extension, where the exceptions + # are exposed as attributes on the Connection object + # I figure this optional extension will be implemented by any + # driver author who is using this test suite, so it is enabled + # by default. + con = self._connect() + drv = self.driver + self.failUnless(con.Warning is drv.Warning) + self.failUnless(con.Error is drv.Error) + self.failUnless(con.InterfaceError is drv.InterfaceError) + self.failUnless(con.DatabaseError is drv.DatabaseError) + self.failUnless(con.OperationalError is drv.OperationalError) + self.failUnless(con.IntegrityError is drv.IntegrityError) + self.failUnless(con.InternalError is drv.InternalError) + self.failUnless(con.ProgrammingError is drv.ProgrammingError) + self.failUnless(con.NotSupportedError is drv.NotSupportedError) + + + def test_commit(self): + con = self._connect() + try: + # Commit must work, even if it doesn't do anything + con.commit() + finally: + con.close() + + def test_rollback(self): + con = self._connect() + # If rollback is defined, it should either work or throw + # the documented exception + if hasattr(con,'rollback'): + try: + con.rollback() + except self.driver.NotSupportedError: + pass + + def test_cursor(self): + con = self._connect() + try: + cur = con.cursor() + finally: + con.close() + + def test_cursor_isolation(self): + con = self._connect() + try: + # Make sure cursors created from the same connection have + # the documented transaction isolation level + cur1 = con.cursor() + cur2 = con.cursor() + self.executeDDL1(cur1) + cur1.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + cur2.execute("select name from %sbooze" % self.table_prefix) + booze = cur2.fetchall() + self.assertEqual(len(booze),1) + self.assertEqual(len(booze[0]),1) + self.assertEqual(booze[0][0],'Victoria Bitter') + finally: + con.close() + + def test_description(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + self.assertEqual(cur.description,None, + 'cursor.description should be none after executing a ' + 'statement that can return no rows (such as DDL)' + ) + cur.execute('select name from %sbooze' % self.table_prefix) + self.assertEqual(len(cur.description),1, + 'cursor.description describes too many columns' + ) + self.assertEqual(len(cur.description[0]),7, + 'cursor.description[x] tuples must have 7 elements' + ) + self.assertEqual(cur.description[0][0].lower(),'name', + 'cursor.description[x][0] must return column name' + ) + self.assertEqual(cur.description[0][1],self.driver.STRING, + 'cursor.description[x][1] must return column type. Got %r' + % cur.description[0][1] + ) + + # Make sure self.description gets reset + self.executeDDL2(cur) + self.assertEqual(cur.description,None, + 'cursor.description not being set to None when executing ' + 'no-result statements (eg. DDL)' + ) + finally: + con.close() + + def test_rowcount(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + self.assertEqual(cur.rowcount,-1, + 'cursor.rowcount should be -1 after executing no-result ' + 'statements' + ) + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.failUnless(cur.rowcount in (-1,1), + 'cursor.rowcount should == number or rows inserted, or ' + 'set to -1 after executing an insert statement' + ) + cur.execute("select name from %sbooze" % self.table_prefix) + self.failUnless(cur.rowcount in (-1,1), + 'cursor.rowcount should == number of rows returned, or ' + 'set to -1 after executing a select statement' + ) + self.executeDDL2(cur) + self.assertEqual(cur.rowcount,-1, + 'cursor.rowcount not being reset to -1 after executing ' + 'no-result statements' + ) + finally: + con.close() + + lower_func = 'lower' + def test_callproc(self): + con = self._connect() + try: + cur = con.cursor() + if self.lower_func and hasattr(cur,'callproc'): + r = cur.callproc(self.lower_func,('FOO',)) + self.assertEqual(len(r),1) + self.assertEqual(r[0],'FOO') + r = cur.fetchall() + self.assertEqual(len(r),1,'callproc produced no result set') + self.assertEqual(len(r[0]),1, + 'callproc produced invalid result set' + ) + self.assertEqual(r[0][0],'foo', + 'callproc produced invalid results' + ) + finally: + con.close() + + def test_close(self): + con = self._connect() + try: + cur = con.cursor() + finally: + con.close() + + # cursor.execute should raise an Error if called after connection + # closed + self.assertRaises(self.driver.Error,self.executeDDL1,cur) + + # connection.commit should raise an Error if called after connection' + # closed.' + self.assertRaises(self.driver.Error,con.commit) + + # connection.close should raise an Error if called more than once + self.assertRaises(self.driver.Error,con.close) + + def test_execute(self): + con = self._connect() + try: + cur = con.cursor() + self._paraminsert(cur) + finally: + con.close() + + def _paraminsert(self,cur): + self.executeDDL1(cur) + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.failUnless(cur.rowcount in (-1,1)) + + if self.driver.paramstyle == 'qmark': + cur.execute( + 'insert into %sbooze values (?)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'numeric': + cur.execute( + 'insert into %sbooze values (:1)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'named': + cur.execute( + 'insert into %sbooze values (:beer)' % self.table_prefix, + {'beer':"Cooper's"} + ) + elif self.driver.paramstyle == 'format': + cur.execute( + 'insert into %sbooze values (%%s)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'pyformat': + cur.execute( + 'insert into %sbooze values (%%(beer)s)' % self.table_prefix, + {'beer':"Cooper's"} + ) + else: + self.fail('Invalid paramstyle') + self.failUnless(cur.rowcount in (-1,1)) + + cur.execute('select name from %sbooze' % self.table_prefix) + res = cur.fetchall() + self.assertEqual(len(res),2,'cursor.fetchall returned too few rows') + beers = [res[0][0],res[1][0]] + beers.sort() + self.assertEqual(beers[0],"Cooper's", + 'cursor.fetchall retrieved incorrect data, or data inserted ' + 'incorrectly' + ) + self.assertEqual(beers[1],"Victoria Bitter", + 'cursor.fetchall retrieved incorrect data, or data inserted ' + 'incorrectly' + ) + + def test_executemany(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + largs = [ ("Cooper's",) , ("Boag's",) ] + margs = [ {'beer': "Cooper's"}, {'beer': "Boag's"} ] + if self.driver.paramstyle == 'qmark': + cur.executemany( + 'insert into %sbooze values (?)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'numeric': + cur.executemany( + 'insert into %sbooze values (:1)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'named': + cur.executemany( + 'insert into %sbooze values (:beer)' % self.table_prefix, + margs + ) + elif self.driver.paramstyle == 'format': + cur.executemany( + 'insert into %sbooze values (%%s)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'pyformat': + cur.executemany( + 'insert into %sbooze values (%%(beer)s)' % ( + self.table_prefix + ), + margs + ) + else: + self.fail('Unknown paramstyle') + self.failUnless(cur.rowcount in (-1,2), + 'insert using cursor.executemany set cursor.rowcount to ' + 'incorrect value %r' % cur.rowcount + ) + cur.execute('select name from %sbooze' % self.table_prefix) + res = cur.fetchall() + self.assertEqual(len(res),2, + 'cursor.fetchall retrieved incorrect number of rows' + ) + beers = [res[0][0],res[1][0]] + beers.sort() + self.assertEqual(beers[0],"Boag's",'incorrect data retrieved') + self.assertEqual(beers[1],"Cooper's",'incorrect data retrieved') + finally: + con.close() + + def test_fetchone(self): + con = self._connect() + try: + cur = con.cursor() + + # cursor.fetchone should raise an Error if called before + # executing a select-type query + self.assertRaises(self.driver.Error,cur.fetchone) + + # cursor.fetchone should raise an Error if called after + # executing a query that cannnot return rows + self.executeDDL1(cur) + self.assertRaises(self.driver.Error,cur.fetchone) + + cur.execute('select name from %sbooze' % self.table_prefix) + self.assertEqual(cur.fetchone(),None, + 'cursor.fetchone should return None if a query retrieves ' + 'no rows' + ) + self.failUnless(cur.rowcount in (-1,0)) + + # cursor.fetchone should raise an Error if called after + # executing a query that cannnot return rows + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.assertRaises(self.driver.Error,cur.fetchone) + + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchone() + self.assertEqual(len(r),1, + 'cursor.fetchone should have retrieved a single row' + ) + self.assertEqual(r[0],'Victoria Bitter', + 'cursor.fetchone retrieved incorrect data' + ) + self.assertEqual(cur.fetchone(),None, + 'cursor.fetchone should return None if no more rows available' + ) + self.failUnless(cur.rowcount in (-1,1)) + finally: + con.close() + + samples = [ + 'Carlton Cold', + 'Carlton Draft', + 'Mountain Goat', + 'Redback', + 'Victoria Bitter', + 'XXXX' + ] + + def _populate(self): + ''' Return a list of sql commands to setup the DB for the fetch + tests. + ''' + populate = [ + "insert into %sbooze values ('%s')" % (self.table_prefix,s) + for s in self.samples + ] + return populate + + def test_fetchmany(self): + con = self._connect() + try: + cur = con.cursor() + + # cursor.fetchmany should raise an Error if called without + #issuing a query + self.assertRaises(self.driver.Error,cur.fetchmany,4) + + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchmany() + self.assertEqual(len(r),1, + 'cursor.fetchmany retrieved incorrect number of rows, ' + 'default of arraysize is one.' + ) + cur.arraysize=10 + r = cur.fetchmany(3) # Should get 3 rows + self.assertEqual(len(r),3, + 'cursor.fetchmany retrieved incorrect number of rows' + ) + r = cur.fetchmany(4) # Should get 2 more + self.assertEqual(len(r),2, + 'cursor.fetchmany retrieved incorrect number of rows' + ) + r = cur.fetchmany(4) # Should be an empty sequence + self.assertEqual(len(r),0, + 'cursor.fetchmany should return an empty sequence after ' + 'results are exhausted' + ) + self.failUnless(cur.rowcount in (-1,6)) + + # Same as above, using cursor.arraysize + cur.arraysize=4 + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchmany() # Should get 4 rows + self.assertEqual(len(r),4, + 'cursor.arraysize not being honoured by fetchmany' + ) + r = cur.fetchmany() # Should get 2 more + self.assertEqual(len(r),2) + r = cur.fetchmany() # Should be an empty sequence + self.assertEqual(len(r),0) + self.failUnless(cur.rowcount in (-1,6)) + + cur.arraysize=6 + cur.execute('select name from %sbooze' % self.table_prefix) + rows = cur.fetchmany() # Should get all rows + self.failUnless(cur.rowcount in (-1,6)) + self.assertEqual(len(rows),6) + self.assertEqual(len(rows),6) + rows = [r[0] for r in rows] + rows.sort() + + # Make sure we get the right data back out + for i in range(0,6): + self.assertEqual(rows[i],self.samples[i], + 'incorrect data retrieved by cursor.fetchmany' + ) + + rows = cur.fetchmany() # Should return an empty list + self.assertEqual(len(rows),0, + 'cursor.fetchmany should return an empty sequence if ' + 'called after the whole result set has been fetched' + ) + self.failUnless(cur.rowcount in (-1,6)) + + self.executeDDL2(cur) + cur.execute('select name from %sbarflys' % self.table_prefix) + r = cur.fetchmany() # Should get empty sequence + self.assertEqual(len(r),0, + 'cursor.fetchmany should return an empty sequence if ' + 'query retrieved no rows' + ) + self.failUnless(cur.rowcount in (-1,0)) + + finally: + con.close() + + def test_fetchall(self): + con = self._connect() + try: + cur = con.cursor() + # cursor.fetchall should raise an Error if called + # without executing a query that may return rows (such + # as a select) + self.assertRaises(self.driver.Error, cur.fetchall) + + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + # cursor.fetchall should raise an Error if called + # after executing a a statement that cannot return rows + self.assertRaises(self.driver.Error,cur.fetchall) + + cur.execute('select name from %sbooze' % self.table_prefix) + rows = cur.fetchall() + self.failUnless(cur.rowcount in (-1,len(self.samples))) + self.assertEqual(len(rows),len(self.samples), + 'cursor.fetchall did not retrieve all rows' + ) + rows = [r[0] for r in rows] + rows.sort() + for i in range(0,len(self.samples)): + self.assertEqual(rows[i],self.samples[i], + 'cursor.fetchall retrieved incorrect rows' + ) + rows = cur.fetchall() + self.assertEqual( + len(rows),0, + 'cursor.fetchall should return an empty list if called ' + 'after the whole result set has been fetched' + ) + self.failUnless(cur.rowcount in (-1,len(self.samples))) + + self.executeDDL2(cur) + cur.execute('select name from %sbarflys' % self.table_prefix) + rows = cur.fetchall() + self.failUnless(cur.rowcount in (-1,0)) + self.assertEqual(len(rows),0, + 'cursor.fetchall should return an empty list if ' + 'a select query returns no rows' + ) + + finally: + con.close() + + def test_mixedfetch(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + cur.execute('select name from %sbooze' % self.table_prefix) + rows1 = cur.fetchone() + rows23 = cur.fetchmany(2) + rows4 = cur.fetchone() + rows56 = cur.fetchall() + self.failUnless(cur.rowcount in (-1,6)) + self.assertEqual(len(rows23),2, + 'fetchmany returned incorrect number of rows' + ) + self.assertEqual(len(rows56),2, + 'fetchall returned incorrect number of rows' + ) + + rows = [rows1[0]] + rows.extend([rows23[0][0],rows23[1][0]]) + rows.append(rows4[0]) + rows.extend([rows56[0][0],rows56[1][0]]) + rows.sort() + for i in range(0,len(self.samples)): + self.assertEqual(rows[i],self.samples[i], + 'incorrect data retrieved or inserted' + ) + finally: + con.close() + + def help_nextset_setUp(self,cur): + ''' Should create a procedure called deleteme + that returns two result sets, first the + number of rows in booze then "name from booze" + ''' + raise NotImplementedError,'Helper not implemented' + #sql=""" + # create procedure deleteme as + # begin + # select count(*) from booze + # select name from booze + # end + #""" + #cur.execute(sql) + + def help_nextset_tearDown(self,cur): + 'If cleaning up is needed after nextSetTest' + raise NotImplementedError,'Helper not implemented' + #cur.execute("drop procedure deleteme") + + def test_nextset(self): + con = self._connect() + try: + cur = con.cursor() + if not hasattr(cur,'nextset'): + return + + try: + self.executeDDL1(cur) + sql=self._populate() + for sql in self._populate(): + cur.execute(sql) + + self.help_nextset_setUp(cur) + + cur.callproc('deleteme') + numberofrows=cur.fetchone() + assert numberofrows[0]== len(self.samples) + assert cur.nextset() + names=cur.fetchall() + assert len(names) == len(self.samples) + s=cur.nextset() + assert s == None,'No more return sets, should return None' + finally: + self.help_nextset_tearDown(cur) + + finally: + con.close() + + def test_nextset(self): + raise NotImplementedError,'Drivers need to override this test' + + def test_arraysize(self): + # Not much here - rest of the tests for this are in test_fetchmany + con = self._connect() + try: + cur = con.cursor() + self.failUnless(hasattr(cur,'arraysize'), + 'cursor.arraysize must be defined' + ) + finally: + con.close() + + def test_setinputsizes(self): + con = self._connect() + try: + cur = con.cursor() + cur.setinputsizes( (25,) ) + self._paraminsert(cur) # Make sure cursor still works + finally: + con.close() + + def test_setoutputsize_basic(self): + # Basic test is to make sure setoutputsize doesn't blow up + con = self._connect() + try: + cur = con.cursor() + cur.setoutputsize(1000) + cur.setoutputsize(2000,0) + self._paraminsert(cur) # Make sure the cursor still works + finally: + con.close() + + def test_setoutputsize(self): + # Real test for setoutputsize is driver dependant + raise NotImplementedError,'Driver need to override this test' + + def test_None(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + cur.execute('insert into %sbooze values (NULL)' % self.table_prefix) + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchall() + self.assertEqual(len(r),1) + self.assertEqual(len(r[0]),1) + self.assertEqual(r[0][0],None,'NULL value not returned as None') + finally: + con.close() + + def test_Date(self): + d1 = self.driver.Date(2002,12,25) + d2 = self.driver.DateFromTicks(time.mktime((2002,12,25,0,0,0,0,0,0))) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(d1),str(d2)) + + def test_Time(self): + t1 = self.driver.Time(13,45,30) + t2 = self.driver.TimeFromTicks(time.mktime((2001,1,1,13,45,30,0,0,0))) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(t1),str(t2)) + + def test_Timestamp(self): + t1 = self.driver.Timestamp(2002,12,25,13,45,30) + t2 = self.driver.TimestampFromTicks( + time.mktime((2002,12,25,13,45,30,0,0,0)) + ) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(t1),str(t2)) + + def test_Binary(self): + b = self.driver.Binary('Something') + b = self.driver.Binary('') + + def test_STRING(self): + self.failUnless(hasattr(self.driver,'STRING'), + 'module.STRING must be defined' + ) + + def test_BINARY(self): + self.failUnless(hasattr(self.driver,'BINARY'), + 'module.BINARY must be defined.' + ) + + def test_NUMBER(self): + self.failUnless(hasattr(self.driver,'NUMBER'), + 'module.NUMBER must be defined.' + ) + + def test_DATETIME(self): + self.failUnless(hasattr(self.driver,'DATETIME'), + 'module.DATETIME must be defined.' + ) + + def test_ROWID(self): + self.failUnless(hasattr(self.driver,'ROWID'), + 'module.ROWID must be defined.' + ) + diff --git a/psycopg2/tests/extras_dictcursor.py b/psycopg2/tests/extras_dictcursor.py new file mode 100644 index 0000000..270d37f --- /dev/null +++ b/psycopg2/tests/extras_dictcursor.py @@ -0,0 +1,47 @@ +# extras_dictcursor - test if DictCursor extension class works +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import psycopg2 +import psycopg2.extras +from unittest import TestCase, TestSuite, main + + +class ExtrasDictCursorTests(TestCase): + """Test if DictCursor extension class works.""" + + def setUp(self): + self.conn = psycopg2.connect("dbname=test") + curs = self.conn.cursor() + curs.execute("CREATE TABLE ExtrasDictCursorTests (foo text)") + + def testDictCursor(self): + curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor) + curs.execute("INSERT INTO ExtrasDictCursorTests VALUES ('bar')") + curs.execute("SELECT * FROM ExtrasDictCursorTests") + row = curs.fetchone() + self.failUnless(row['foo'] == 'bar') + self.failUnless(row[0] == 'bar') + +class ExtrasDictCursorSuite(TestSuite): + """Build a suite of all tests.""" + + def __init__(self): + """Build a list of tests.""" + self.tests = [x for x in dir(ExtrasDictCursorTests) + if x.startswith('test')] + TestSuite.__init__(self, map(TestModule, self.tests)) + + +if __name__ == "__main__": + main() diff --git a/psycopg2/tests/test_psycopg2_dbapi20.py b/psycopg2/tests/test_psycopg2_dbapi20.py new file mode 100644 index 0000000..028b718 --- /dev/null +++ b/psycopg2/tests/test_psycopg2_dbapi20.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +import dbapi20 +import unittest +import psycopg2 +import popen2 + +class test_Psycopg(dbapi20.DatabaseAPI20Test): + driver = psycopg2 + connect_args = () + connect_kw_args = {'dsn': 'dbname=dbapi20_test'} + + lower_func = 'lower' # For stored procedure test + + def setUp(self): + # Call superclass setUp In case this does something in the + # future + dbapi20.DatabaseAPI20Test.setUp(self) + + try: + con = self._connect() + con.close() + except: + cmd = "psql -c 'create database dbapi20_test' template1" + cout,cin = popen2.popen2(cmd) + cin.close() + cout.read() + + def tearDown(self): + dbapi20.DatabaseAPI20Test.tearDown(self) + + def test_nextset(self): pass + def test_setoutputsize(self): pass + +if __name__ == '__main__': + unittest.main() diff --git a/psycopg2/tests/types_basic.py b/psycopg2/tests/types_basic.py new file mode 100644 index 0000000..446ad15 --- /dev/null +++ b/psycopg2/tests/types_basic.py @@ -0,0 +1,87 @@ +# types_basic.py - tests for basic types conversions +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import sys +try: + import decimal +except: + pass +import psycopg2 +from unittest import TestCase, TestSuite, main + + +class TypesBasicTests(TestCase): + """Test presence of mandatory attributes and methods.""" + + def setUp(self): + self.conn = psycopg2.connect("dbname=test") + + def execute(self, *args): + curs = self.conn.cursor() + curs.execute(*args) + return curs.fetchone()[0] + + def testQuoting(self): + s = "Quote'this\\! ''ok?''" + self.failUnless(self.execute("SELECT %s AS foo", (s,)) == s, + "wrong quoting: " + s) + + def testUnicode(self): + s = u"Quote'this\\! ''ok?''" + self.failUnless(self.execute("SELECT %s AS foo", (s,)) == s, + "wrong unicode quoting: " + s) + + def testNumber(self): + s = self.execute("SELECT %s AS foo", (1971,)) + self.failUnless(s == 1971, "wrong integer quoting: " + str(s)) + s = self.execute("SELECT %s AS foo", (1971L,)) + self.failUnless(s == 1971L, "wrong integer quoting: " + str(s)) + # Python 2.4 defaults to Decimal? + if sys.version_info[0] >= 2 and sys.version_info[1] >= 4: + s = self.execute("SELECT %s AS foo", (19.10,)) + self.failUnless(s - decimal.Decimal("19.10") == 0, + "wrong decimal quoting: " + str(s)) + else: + s = self.execute("SELECT %s AS foo", (19.10,)) + self.failUnless(abs(s - 19.10) < 0.001, + "wrong float quoting: " + str(s)) + + def testBinary(self): + s = ''.join([chr(x) for x in range(256)]) + b = psycopg2.Binary(s) + r = str(self.execute("SELECT %s::bytea AS foo", (b,))) + self.failUnless(r == s, "wrong binary quoting") + # test to make sure an empty Binary is converted to an empty string + b = psycopg2.Binary('') + self.assertEqual(str(b), "''") + + def testArray(self): + s = self.execute("SELECT %s AS foo", ([[1,2],[3,4]],)) + self.failUnless(s == [[1,2],[3,4]], "wrong array quoting " + str(s)) + s = self.execute("SELECT %s AS foo", (['one', 'two', 'three'],)) + self.failUnless(s == ['one', 'two', 'three'], + "wrong array quoting " + str(s)) + + +class TypesBasicSuite(TestSuite): + """Build a suite of all tests.""" + + def __init__(self): + """Build a list of tests.""" + self.tests = [x for x in dir(TypesBasicTests) if x.startswith('test')] + TestSuite.__init__(self, map(TestModule, self.tests)) + + +if __name__ == "__main__": + main() diff --git a/refresh-peer.py b/refresh-peer.py new file mode 100644 index 0000000..484d257 --- /dev/null +++ b/refresh-peer.py @@ -0,0 +1,38 @@ +#!/usr/bin/env plcsh +# $Id: refresh-peer.py,v 1.1 2007/07/02 19:27:43 tmack Exp $ + +import sys,os,time + +def Run (peername): + timestring=time.strftime("%Y-%m-%d-%H-%M-%S") + print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',peername + print 'RefreshPeer on %s - starting on %s'%(peername,timestring) + print 'xxxxxxxxxx' + sys.stdout.flush() + start=time.time() + result=RefreshPeer(peername) + finish=time.time() + + print 'Total duration',finish-start + print 'xxxxxxxxxx timers:' + keys=result.keys() + keys.sort() + for key in keys: + print key,result[key] + sys.stdout.flush() + sys.stderr.flush() + +def RunInLog (peername): + logname="/var/log/refresh-peer-%s.log"%(peername) + sys.stdout=open(logname,'a') + sys.stderr=sys.stdout + Run(peername) + sys.stderr.close() + sys.stdout.close() + +if __name__ == "__main__": + + for peername in sys.argv[1:]: + RunInLog (peername) + + diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..3f6ba5c --- /dev/null +++ b/setup.py @@ -0,0 +1,20 @@ +#!/usr/bin/python +# +# Setup script for PLCAPI +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: setup.py,v 1.10 2007/10/01 20:51:46 tmack Exp $ +# + +from distutils.core import setup +from glob import glob + +setup(py_modules = ['ModPython'], + packages = ['PLC', 'PLC/Methods', 'PLC/Methods/system'], + scripts = ['plcsh', 'Server.py'], + data_files = [('', ['planetlab4.sql']), + ('php', ['php/plc_api.php']), + ('migrations', ['migrations/README.txt'] + glob('migrations/[0-9][0-9][0-9]*')), + ]) diff --git a/tools/dzombie.py b/tools/dzombie.py new file mode 100755 index 0000000..e3c170a --- /dev/null +++ b/tools/dzombie.py @@ -0,0 +1,122 @@ +#!/usr/bin/python +# +# Tool that removes zombie records from database tables# +import sys +import os +import getopt +import pgdb +from pprint import pprint + +schema_file = None +config_file = "/etc/planetlab/plc_config" +config = {} +execfile(config_file, config) + +def usage(): + print "Usage: %s SCHEMA_FILE " % sys.argv[0] + sys.exit(1) + +try: + schema_file = sys.argv[1] +except IndexError: + print "Error: too few arguments" + usage() + +# all foreing keys exist as primary kyes in another table +# will represent all foreign keys as +# { 'table.foreign_key': 'table.primary_key'} +foreign_keys = {} +foreign_keys_ordered = [] +zombie_keys = {} +# parse the schema for foreign keys +try: + file = open(schema_file, 'r') + index = 0 + lines = file.readlines() + while index < len(lines): + line = lines[index].strip() + # find all created objects + if line.startswith("CREATE"): + line_parts = line.split(" ") + if line_parts[1:3] == ['OR', 'REPLACE']: + line_parts = line_parts[2:] + item_type = line_parts[1].strip() + item_name = line_parts[2].strip() + if item_type.upper() in ['TABLE']: + while index < len(lines): + index = index + 1 + nextline =lines[index].strip() + if nextline.find("--") > -1: + nextline = nextline[0:nextline.index("--")].replace(',', '') + if nextline.upper().find("REFERENCES") > -1: + nextline_parts = nextline.split(" ") + foreign_key_name = nextline_parts[0].strip() + foreign_key_table = nextline_parts[nextline_parts.index("REFERENCES")+1].strip() + foreign_key = item_name + "."+ foreign_key_name + primary_key = foreign_key_table +"."+ foreign_key_name + foreign_keys[foreign_key] = primary_key + foreign_keys_ordered.append(foreign_key) + elif nextline.find(";") >= 0: + break + index = index + 1 +except: + raise + +db = pgdb.connect(user = config['PLC_DB_USER'], + database = config['PLC_DB_NAME']) +cursor = db.cursor() +try: + for foreign_key in foreign_keys_ordered: + primary_key = foreign_keys[foreign_key] + sql = "SELECT distinct %s from %s" + + # get all foreign keys in this table + foreign_key_parts = foreign_key.split(".") + + # do not delete from primary tables + if foreign_key_parts[0] in ['addresses', 'boot_states', 'conf_files', \ + 'keys', 'messages', 'nodegroups', 'nodenetworks', 'nodes', 'pcus', 'peers' \ + 'persons', 'roles', 'sessions', 'sites', 'slices']: + #print "skipping table %s" % foreign_key_parts[0] + continue + + cursor.execute(sql % (foreign_key_parts[1], foreign_key_parts[0])) + foreign_rows = cursor.fetchall() + + # get all the primary keys from this foreign key's primary table + primary_key_parts = primary_key.split(".") + # foreign key name may not match primary key name. must rename these + if primary_key_parts[1] == 'creator_person_id': + primary_key_parts[1] = 'person_id' + elif primary_key_parts[1] == 'min_role_id': + primary_key_parts[1] = 'role_id' + sql = sql % (primary_key_parts[1], primary_key_parts[0]) + + # determin which primary records are deleted + desc = os.popen('psql planetlab4 postgres -c "\d %s;"' % primary_key_parts[0]) + result = desc.readlines() + if primary_key_parts[0] in ['slices']: + sql = sql + " where name not like '%_deleted'" + elif filter(lambda line: line.find("deleted") > -1, result): + sql = sql + " where deleted = false" + + cursor.execute(sql) + primary_key_rows = cursor.fetchall() + + # if foreign key isnt present in primay_key query, it either doesnt exist or marked as deleted + # also, ignore null foreign keys, not considered zombied + zombie_keys_func = lambda key: key not in primary_key_rows and not key == [None] + zombie_keys_list = [zombie_key[0] for zombie_key in filter(zombie_keys_func, foreign_rows)] + print zombie_keys_list + # delete these zombie records + if zombie_keys_list: + print " -> Deleting %d zombie record(s) from %s after checking %s" % \ + (len(zombie_keys_list), foreign_key_parts[0], primary_key_parts[0]) + sql_delete = 'DELETE FROM %s WHERE %s IN %s' % \ + (foreign_key_parts[0], foreign_key_parts[1], tuple(zombie_keys_list)) + cursor.execute(sql_delete) + db.commit() + #zombie_keys[foreign_key] = zombie_keys_list + print "done" +except pgdb.DatabaseError: + raise diff --git a/tools/planetlab3_dump.sh b/tools/planetlab3_dump.sh new file mode 100755 index 0000000..e6a86e3 --- /dev/null +++ b/tools/planetlab3_dump.sh @@ -0,0 +1,119 @@ +#!/bin/bash +# +# Dumps the planetlab3 database on zulu, fixing a few things on the way +# +# Mark Huang +# Copyright (C) 2007 The Trustees of Princeton University +# +# $Id$ +# + +tables=( +node_bootstates +nodes +nodenetworks +node_nodenetworks +nodegroups +nodegroup_nodes +override_bootscripts +pod_hash +conf_file +conf_assoc +address_types +addresses +organizations +sites +roles +capabilities +persons +person_roles +person_capabilities +person_address +key_types +keys +person_keys +person_site +node_root_access +authorized_subnets +site_authorized_subnets +event_classes +dslice03_states +dslice03_attributetypes +dslice03_slices +dslice03_attributes +dslice03_sliceattribute +dslice03_slicenode +dslice03_sliceuser +dslice03_siteinfo +pcu +pcu_ports +join_request +whatsnew +node_hostnames +blacklist +dslice03_initscripts +dslice03_defaultattribute +peered_mas +sessions +) + +# Dump tables +for table in "${tables[@]}" ; do + pg_dump -U postgres -t $table planetlab3 +done | + +# Do some manual cleanup +sed -f <(cat < +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: slice_attributes.py,v 1.5 2007/02/04 04:34:26 mlhuang Exp $ +# + +import re +import base64 + +# Convert nm_net_{exempt_,}{min,max}_rate (bps) to +# net_{i2_,}{min,max}_rate and net_{i2_,}{min,max}_rate (kbps) +rename = {'nm_net_min_rate': 'net_min_rate', + 'nm_net_max_rate': 'net_max_rate', + 'nm_net_exempt_min_rate': 'net_i2_min_rate', + 'nm_net_exempt_max_rate': 'net_i2_max_rate'} +for slice_attribute in GetSliceAttributes({'name': rename.keys()}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Convert bps to kbps + bps = int(slice_attribute['value']) + kbps = bps / 1000 + + # Add the new attribute + if GetSlices([slice_id]): + AddSliceAttribute(slice_id, rename[name], str(kbps)) + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Convert nm_net_{exempt_,}avg_rate to +# net_{i2_,}max_kbyte and net_{i2_,}thresh_kbyte +rename = {'nm_net_avg_rate': {'max': 'net_max_kbyte', + 'thresh': 'net_thresh_kbyte'}, + 'nm_net_exempt_avg_rate': {'max': 'net_i2_max_kbyte', + 'thresh': 'net_i2_thresh_kbyte'}} +for slice_attribute in GetSliceAttributes({'name': rename.keys()}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Convert bps to 80% and 100% of max bytes per day + bps = int(slice_attribute['value']) + max_kbyte = bps * 24 * 60 * 60 / 8 / 1000 + thresh_kbyte = int(0.8 * max_kbyte) + + # Add the new attribute + if GetSlices([slice_id]): + AddSliceAttribute(slice_id, rename[name]['max'], str(max_kbyte)) + AddSliceAttribute(slice_id, rename[name]['thresh'], str(thresh_kbyte)) + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Convert plc_slice_state +for slice_attribute in GetSliceAttributes({'name': 'plc_slice_state'}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Add the new attribute + if GetSlices([slice_id]): + if slice_attribute['value'] == "suspended": + AddSliceAttribute(slice_id, 'enabled', "0") + else: + AddSliceAttribute(slice_id, 'enabled', "1") + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Straight renames +rename = {'nm_cpu_share': 'cpu_share', + 'nm_disk_quota': 'disk_max', + 'nm_net_share': 'net_share', + 'nm_net_exempt_share': 'net_i2_share', + 'nm_net_max_byte': 'net_max_kbyte', + 'nm_net_max_thresh_byte': 'net_thresh_kbyte', + 'nm_net_max_exempt_byte': 'net_i2_max_kbyte', + 'nm_net_max_thresh_exempt_byte': 'net_i2_thresh_kbyte'} +for slice_attribute in GetSliceAttributes({'name': rename.keys()}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Pass straight through + value = slice_attribute['value'] + + # Add the new attribute + if GetSlices([slice_id]): + AddSliceAttribute(slice_id, rename[name], value) + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Update plc_ticket_pubkey attribute +for slice_attribute in GetSliceAttributes({'name': "plc_ticket_pubkey"}): + id = slice_attribute['slice_attribute_id'] + + UpdateSliceAttribute(id, """ +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKXa72MEKDAnVyzEpKOB1ot2eW +xG/TG2aa7q/2oy1xf5XMmU9H9uKwO+GoUeinp1BSxgkVRF0VhEGGaqKR9kYQzX0k +ht4+P2hAr+UyU4cp0NxV4xfmyAbrNKuHVjawMUCu5BH0IkBUC/89ckxk71oROnak +FbI7ojUezSGr4aVabQIDAQAB +""".lstrip()) + +# Delete _deleted and deprecated slice attributes and types +for attribute_type in GetSliceAttributeTypes(): + id = attribute_type['attribute_type_id'] + name = attribute_type['name'] + + if name == 'general_prop_share' or \ + re.match('nm_', name) or \ + re.search('_deleted$', name): + DeleteSliceAttributeType(id) + # N.B. Automatically deletes all slice attributes of this type + +# Add Proper ops +proper_ops = [ + # give Stork permission to mount and unmount client dirs + ('arizona_stork', 'mount_dir'), + ('arizona_stork', 'set_file_flags pass, "1"'), + ('arizona_stork', 'set_file_flags_list "1"'), + ('arizona_stork', 'bind_socket sockname=64?:*'), + ('arizona_stork2', 'mount_dir'), + ('arizona_stork2', 'set_file_flags pass, "1"'), + ('arizona_stork2', 'set_file_flags_list "1"'), + ('arizona_stork2', 'bind_socket sockname=64?:*'), + + # give CoMon the necessary permissions to run slicestat + ('princeton_slicestat', 'exec "root", pass, "/usr/local/planetlab/bin/pl-ps", none'), + ('princeton_slicestat', 'exec "root", pass, "/usr/sbin/vtop", "bn1", none'), + ('princeton_slicestat', 'open_file file=/proc/virtual/*/cacct'), + ('princeton_slicestat', 'open_file file=/proc/virtual/*/limit'), + ('princeton_comon', 'open_file file=/var/log/secure'), + ('princeton_comon', 'exec "root", pass, "/bin/df", "/vservers", none'), + + # give pl_slicedir access to /etc/passwd + ('pl_slicedir', 'open_file pass, "/etc/passwd"'), + + # nyu_d are building a DNS demux so give them access to port 53 + ('nyu_d', 'bind_socket'), + ('nyu_oasis', 'bind_socket'), + + # QA slices need to be able to create and delete bind-mounts + ('pl_qa_0', 'mount_dir'), + ('pl_qa_1', 'mount_dir'), + + # irb_snort needs packet sockets for tcpdump + ('irb_snort', 'create_socket'), + + # uw_ankur is using netlink sockets to do the same thing as netflow + ('uw_ankur', 'create_socket'), + + # cornell_codons gets access to port 53 for now + ('cornell_codons', 'create_socket'), + + # give Mic Bowman's conf-monitor service read-only access to root fs + # and the ability to run df + ('idsl_monitor', 'mount_dir "root:/", pass, "ro"'), + ('idsl_monitor', 'unmount'), + ('idsl_monitor', 'exec "root", pass, "/bin/df", "-P", "/", "/vservers", none'), + + # give Shark access to port 111 to run portmap + # and port 955 to run mount + ('nyu_shkr', 'bind_socket'), + ('nyu_shkr', 'mount_dir "nfs:**:**"'), + ('nyu_shkr', 'exec "root", pass, "/bin/umount", "-l", "/vservers/nyu_shkr/**", none'), + + # give tsinghua_lgh access to restricted ports + ('tsinghua_lgh', 'bind_socket'), + + # CoDeeN needs port 53 too + ('princeton_codeen', 'bind_socket sockname=53:*'), + + # give ucin_load access to /var/log/wtmp + ('ucin_load', 'open_file file=/var/log/wtmp*'), + + # give google_highground permission to bind port 81 (and raw sockets) + ('google_highground', 'bind_socket'), + + # pl_conf needs access to port 814 + ('pl_conf', 'bind_socket sockname=814:*'), + ('pl_conf', 'open file=/home/*/.ssh/authorized_keys'), + + # give princeton_visp permission to read all packets sent through the + # tap0 device + ('princeton_visp', 'open file=/dev/net/tun, flags=rw'), + + # The PLB group needs the BGP port + ('princeton_iias', 'bind_socket sockname=179:*'), + ('princeton_visp', 'bind_socket sockname=179:*'), + ('mit_rcp', 'bind_socket sockname=179:*'), + ('princeton_bgpmux', 'bind_socket sockname=179:*'), + ('princeton_bgpmux2', 'bind_socket sockname=179:*'), + + # PL-VINI group + ('mit_rcp', 'exec "root", pass, "/usr/bin/chrt"'), + ('princeton_iias', 'exec "root", pass, "/usr/bin/chrt"'), + + # Tycoon needs access to /etc/passwd to determine Slicename->XID mappings + ('hplabs_tycoon_aucd', 'open_file file=/etc/passwd'), +] + +for slice, op in proper_ops: + try: + AddSliceAttribute(slice, 'proper_op', op) + except Exception, err: + print "Warning: %s:" % slice, err + +initscripts = dict([(initscript['initscript_id'], initscript) for initscript in [{'initscript_id': 8, 'script': 'IyEgL2Jpbi9zaA0KDQojIDxQcm9ncmFtIE5hbWU+DQojICAgIGJpbmRzY3JpcHQNCiMNCiMgPEF1dGhvcj4NCiMgICAgSmVmZnJ5IEpvaG5zdG9uIGFuZCBKZXJlbXkgUGxpY2h0YQ0KIw0KIyA8UHVycG9zZT4NCiMgICAgRG93bmxvYWRzIGFuZCBpbnN0YWxscyBzdG9yayBvbiBhIG5vZGUuDQoNCiMgc2F2ZSBvcmlnaW5hbCBQV0QNCk9MRFBXRD0kUFdEDQoNCiMgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9uDQplcnJvcigpDQp7DQogICBlY2hvDQogICBlY2hvICJQbGVhc2UgRS1tYWlsIHN0b3JrLXN1cHBvcnRAY3MuYXJpem9uYS5lZHUgaWYgeW91IGJlbGlldmUgeW91IGhhdmUiIA0KICAgZWNobyAicmVjZWl2ZWQgdGhpcyBtZXNzYWdlIGluIGVycm9yLiINCg0KICAgIyBnZXQgcmlkIG9mIENFUlQgZmlsZQ0KICAgaWYgWyAtZiAkQ0VSVCBdDQogICB0aGVuDQogICAgICBybSAtZiAkQ0VSVCA+IC9kZXYvbnVsbA0KICAgZmkNCg0KICAgIyByZXN0b3JlIG9yaWdpbmFsIFBXRA0KICAgY2QgJE9MRFBXRA0KICAgZXhpdCAxDQp9DQoNCkNFUlQ9YHB3ZGAvdGVtcGNydGZpbGUNCg0KI2Z1bmN0aW9ucw0KDQojIyMNCiMjIyBjcmVhdGVDZXJ0aWZpY2F0ZSgpDQojIyMgICAgcHJpbnRzIG91dCB0aGUgZXF1aWZheCBjZXJ0aWZpY2F0ZSB0byB1c2UgYW5kIHN0b3Jlcw0KIyMjICAgIHRoZSBmaWxlIG5hbWUgaW4gJENFUlQNCiMjIw0KZnVuY3Rpb24gY3JlYXRlQ2VydGlmaWNhdGUoKXsNCmNhdCA+ICRDRVJUIDw8RVFVSUZBWA0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDa0RDQ0FmbWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURCYU1Rc3dDUVlEVlFRR0V3SlYNClV6RWNNQm9HQTFVRUNoTVRSWEYxYVdaaGVDQlRaV04xY21VZ1NXNWpMakV0TUNzR0ExVUVBeE1rUlhGMQ0KYVdaaGVDQlRaV04xY21VZ1IyeHZZbUZzSUdWQ2RYTnBibVZ6Y3lCRFFTMHhNQjRYRFRrNU1EWXlNVEEwDQpNREF3TUZvWERUSXdNRFl5TVRBME1EQXdNRm93V2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIREFhQmdOVkJBb1QNCkUwVnhkV2xtWVhnZ1UyVmpkWEpsSUVsdVl5NHhMVEFyQmdOVkJBTVRKRVZ4ZFdsbVlYZ2dVMlZqZFhKbA0KSUVkc2IySmhiQ0JsUW5WemFXNWxjM01nUTBFdE1UQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3DQpnWWtDZ1lFQXV1Y1hrQUpsc1RSVlBFbkNVZFhmcDlFM2o5SG5nWE5CVW1DYm5hRVhKbml0eDdIb0pwUXkNCnRkNHpqVG92Mi9LYWVscHptS05jNmZ1S2N4dGM1OE8vZ0d6TnFmVFdLOEQzK1ptcVk2S3hSd0lQMU9SUg0KT2hJOGJJcGFWSVJ3MjhIRmtNOXlSY3VvV2NETk01MC9vNWJyaFRNaEhENGVQbUJ1ZHB4bmhjWEl3MkVDDQpBd0VBQWFObU1HUXdFUVlKWUlaSUFZYjRRZ0VCQkFRREFnQUhNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcNCkh3WURWUjBqQkJnd0ZvQVV2cWlnZEhKUWEwUzN5U1BZKzZqL3MxZHJhR3d3SFFZRFZSME9CQllFRkw2bw0Kb0hSeVVHdEV0OGtqMlB1by83TlhhMmhzTUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUREaUFWR3F4K3BmDQoycm5RWlE4dzFqN2FEUlJKYnBHVEp4UXg3OFQzTFVYNDdNZS9va0VOSTdTUytSa0FaNzBCcjgzZ2NmeGENCnoyVEU0SmFZMEtOQTRnR0s3eWNIOFdVQmlrUXRCbVYxVXNDR0VDQWhYMnhyRDJ5dUNSeXY4cUlZTk1SMQ0KcEhNYzhZM2M3NjM1czNhMGtyL2NsUkFldnN2SU8xcUVZQmxXbEtsVg0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSANCkVRVUlGQVgNCn0NCg0KIyMjDQojIyMgb3ZlcldyaXRlQ29uZigpDQojIyMJb3ZlcndyaXRlIHRoZSBkZWZhdWx0IHN0b3JrLmNvbmYgZmlsZQ0KIyMjICAgICB0aGF0IHdhcyBpbnN0YWxsZWQgYnkgdGhlIHJwbSBwYWNrYWdlLg0KIyMjICAgICB0aGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgYmVjYXVzZSBJIG5lZWQNCiMjIyAgICAgdG8gY2hhbmdlIHRoZSBuZXN0cG9ydCBhbmQgSSBkb250IGtub3cNCiMjIyAgICAgZW5vdWdoIHRvIHJlcGFja2FnZSB0aGUgcnBtIHdpdGggdGhlDQojIyMgICAgIGNvcnJlY3Qgc2V0dGluZ3MNCmZ1bmN0aW9uIG92ZXJXcml0ZUNvbmYoKXsNCmNhdCA+IC91c3IvbG9jYWwvc3RvcmsvZXRjL3N0b3JrLmNvbmYgPDxFTkRPRkZJTEUNCnBhY21hbj0vdXNyL2xvY2FsL3N0b3JrL2Jpbi9wYWNtYW4NCmR0ZC1wYWNrYWdlcz0vdXNyL2xvY2FsL3N0b3JrL2Jpbi9wYWNrYWdlcy5kdGQNCmR0ZC1ncm91cHM9L3Vzci9sb2NhbC9zdG9yay9iaW4vZ3JvdXBzLmR0ZA0Kc3RvcmtuZXN0dXBkYXRlbGlzdGVuZXJwb3J0PTY0OQ0KDQojYml0dG9ycmVudHRyYWNrZXJob3N0PXF1YWRydXMuY3MuYXJpem9uYS5lZHUNCmJpdHRvcnJlbnR0cmFja2VyaG9zdD1ucjA2LmNzLmFyaXpvbmEuZWR1DQoNCmJpdHRvcnJlbnR0cmFja2VycG9ydD02ODgwDQpiaXR0b3JyZW50dXBsb2FkcmF0ZT0wDQpiaXR0b3JyZW50c2VlZGxvb2t1cHRpbWVvdXQ9MzANCg0KI3BhY2thZ2VyZXBvc2l0b3J5ID0gcXVhZHJ1cy5jcy5hcml6b25hLmVkdS9QbGFuZXRMYWIvVjN8ZGlzdCwgc3RhYmxlDQpwYWNrYWdlcmVwb3NpdG9yeSA9IG5yMDYuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzfGRpc3QsIHN0YWJsZQ0KI3BhY2thZ2VpbmZvcmVwb3NpdG9yeSA9IHF1YWRydXMuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzL3N0b3JrLmluZm8NCnBhY2thZ2VpbmZvcmVwb3NpdG9yeSA9IG5yMDYuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzL3N0b3JrLmluZm8NCg0KdXNlcm5hbWUgPSBQbGFuZXRMYWINCnB1YmxpY2tleWZpbGUgPSAvdXNyL2xvY2FsL3N0b3JrL3Zhci9rZXlzL1BsYW5ldExhYi5wdWJsaWNrZXkNCnBhY2thZ2VtYW5hZ2VycyA9IG5lc3RycG0sIHJwbSwgdGFyZ3oNCnRyYW5zZmVybWV0aG9kPSBuZXN0LGJpdHRvcnJlbnQsY29ibGl0eixjb3JhbCxodHRwLGZ0cA0KbmVzdHBvcnQ9NjAwMA0KdGFycGFja2luZm9wYXRoPS91c3IvbG9jYWwvc3RvcmsvdmFyL3RhcmluZm8NCkVORE9GRklMRQ0KfSANCg0KDQojIyMNCiMjIyBkb3dubG9hZE5SMDYoKQ0KIyMjICAgIGRvd25sb2FkIGEgZmlsZSBmcm9tIG5yMDYgdXNpbmcgY3VybA0KIyMjDQojIyMgYXJnczogDQojIyMgICAgICAgLSB0aGUgcGF0aCBvZiB0aGUgZmlsZSB5b3Ugd2lzaCB0byBkb3dubG9hZA0KIyMjICAgICAgICAgcmVsYXRpdmUgZnJvbSBodHRwczovL25yMDYuY3MuYXJpem9uYS5lZHUNCiMjIyAgICAgICAtIHRoZSBmaWxlIHRvIHNhdmUgaXQgdG8NCiMjIyAgICAgICAtIHJldHVybmVkIHZhbHVlIGFzIHNwZWNpZmllZCBpbiB2ZXJpZnlEb3dubG9hZA0KZnVuY3Rpb24gZG93bmxvYWROUjA2KCl7DQogICAgY3VybCAtLWNhY2VydCAkQ0VSVCBodHRwczovL25yMDYuY3MuYXJpem9uYS5lZHUvJDEgLW8gJDIgMj4vZGV2L251bGwNCiAgICB2ZXJpZnlEb3dubG9hZCAkMiAkMw0KfQ0KDQojIyMNCiMjIyB2ZXJpZnlEb3dubG9hZCgpDQojIyMgICAgIHZlcmlmeSB0aGF0IGEgZmlsZSB0aGF0IHdhcyBqdXN0IGRvd25sb2FkIHdpdGggZG93bmxvYWROUjA2DQojIyMgICAgIHdhcyBkb3dubG9hZCBjb3JyZWN0bHkuIFNpbmNlIHdlIGFyZSBnZXR0aW5nIHN0dWZmIGZyb20gYQ0KIyMjICAgICBodHRwIHNlcnZlciB3ZSBhcmUgYXNzdW1pbmcgdGhhdCBpZiB3ZSBnZXQgYSA0MDQgcmVzcG9uc2UNCiMjIyAgICAgdGhhdCB0aGUgcGFnZSB3ZSB3YW50IGRvZXMgbm90IGV4aXN0LiBBbHNvLCBpZiB0aGUgb3V0cHV0IGZpbGUNCiMjIyAgICAgZG9lcyBub3QgZXhpc3QgdGhhdCBtZWFucyB0aGF0IG9ubHkgaGVhZGVycyB3ZXJlIHJldHVybmVkDQojIyMgICAgIHdpdGhvdXQgYW55IGNvbnRlbnQuIHRoaXMgdG9vIGlzIGEgaW52YWxpZCBmaWxlIGRvd25sb2FkDQojIyMNCiMjIyBhcmdzOg0KIyMjICAgICAgIC0gdGhlIGZpbGUgdG8gdmVyaWZ5DQojIyMgICAgICAgLSByZXR1cm4gdmFyaWFibGUsIHdpbGwgaGF2ZSAxIGlmIGZhaWwgMCBpZiBnb29kDQojIyMNCmZ1bmN0aW9uIHZlcmlmeURvd25sb2FkKCl7DQogICAgZXZhbCAiJDI9MCINCiAgICBpZiBbICEgLWYgJDEgXTsNCiAgICB0aGVuDQogICAgICAgIGV2YWwgIiQyPTEiDQogICAgZWxpZiBncmVwICc0MDQgTm90IEZvdW5kJyAkMSA+IC9kZXYvbnVsbA0KICAgIHRoZW4NCglybSAtZiAkMQ0KICAgICAgICBldmFsICIkMj0xIg0KICAgIGVsc2UNCiAgICAgICAgZXZhbCAiJDI9MCINCiAgICBmaQ0KfQ0KDQoNCiMgY2hlY2sgZm9yIHJvb3QgdXNlcg0KaWYgWyAkVUlEIC1uZSAiMCIgXQ0KdGhlbg0KICAgZWNobyAiWW91IG11c3QgcnVuIHRoaXMgcHJvZ3JhbSB3aXRoIHJvb3QgcGVybWlzc2lvbnMuLi4iDQogICBlcnJvcg0KZmkgICANCiANCiMgY2xlYW4gdXAgaW4gY2FzZSB0aGlzIHNjcmlwdCB3YXMgcnVuIGJlZm9yZSBhbmQgZmFpbGVkDQpybSAtcmYgL3RtcC9zdG9yayAmPiAvZGV2L251bGwNCg0KIyBjcmVhdGUgL3RtcC9zdG9yayBkaXJlY3RvcnkNCm1rZGlyIC90bXAvc3RvcmsgDQppZiBbICQ/IC1uZSAiMCIgXQ0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiQ291bGQgbm90IGNyZWF0ZSB0aGUgL3RtcC9zdG9yayBkaXJlY3RvcnkuLi4iDQogICBlcnJvcg0KZmkNCg0KIyBleHBvcnQgb3VyIHJvb3QgZGlyZWN0b3J5IHRvIFN0b3JrDQplY2hvICJhcml6b25hX3N0b3JrMiIgPiAvLmV4cG9ydGRpcg0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgdGhlIC8uZXhwb3J0ZGlyIGZpbGUuLi4iDQogICBlcnJvcg0KZmkNCiANCiMgdGVsbCBzdG9yayB0aGF0IHdlIHdhbnQgdG8gYmUgc2VydmVkDQppZiBbIC1mIC9ldGMvc2xpY2VuYW1lIF0NCnRoZW4NCiAgIFNMSUNFTkFNRT1gY2F0IC9ldGMvc2xpY2VuYW1lYA0KZWxzZSANCiAgIFNMSUNFTkFNRT0kVVNFUg0KZmkNCndnZXQgLU8gL3RtcC9zdG9yay8kU0xJQ0VOQU1FICJodHRwOi8vbG9jYWxob3N0OjY0OC8kU0xJQ0VOQU1FXCRiaW5kc2NyaXB0Ig0KDQojIHZlcmlmeSB0aGF0IHRoZSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bA0KaWYgWyAhIC1mIC90bXAvc3RvcmsvJFNMSUNFTkFNRSAtbyAkPyAtbmUgMCBdDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJTdG9yayBkb2Vzbid0IHNlZW0gdG8gYmUgcnVubmluZyBvbiB0aGlzIG5vZGUuLi4iDQogICBlcnJvcg0KZmkNCg0KIyB3YWl0IGZvciBzdG9yayBzbGljZSANCmVjaG8gIldhaXRpbmcgZm9yIFN0b3JrIHRvIGFjY2VwdCBvdXIgYmluZGluZy4uLiINCndoaWxlIFsgISAtZiAvdG1wL3N0b3JrL3N0b3JrX3NheXNfZ28gXQ0KZG8NCiAgIHNsZWVwIDENCmRvbmUNCg0KIyBjaGFuZ2UgUFdEIHRvIHRoZSAvdG1wL3N0b3JrIGRpcmVjdG9yeSANCmNkIC90bXAvc3RvcmsNCmlmIFsgJD8gLW5lICIwIiBdDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJDb3VsZCBub3QgYWNjZXNzIHRoZSAvdG1wL3N0b3JrIGRpcmVjdG9yeS4uLiINCiAgIGVycm9yDQpmaQ0KDQojIGNvbmZpcm0gdGhhdCBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQgYWN0dWFsbHkgZXhpc3QNCmlmIGVjaG8gKi5ycG0gfCBncmVwICcqJyA+IC9kZXYvbnVsbA0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiRXJyb3I6IFN0b3JrIHBhY2thZ2UgZG93bmxvYWQgZmFpbGVkLi4uIg0KICAgZXJyb3INCmZpDQoNCiMgcmVtb3ZlIFN0b3JrIHBhY2thZ2VzIGFuZCBmaWxlcw0KZWNobw0KZWNobyAiUmVtb3ZpbmcgU3RvcmsgZmlsZXMuLi4iDQoNCiMgYnVpbGQgYSBsaXN0IG9mIHBhY2thZ2VzIHRvIHJlbW92ZQ0KcGFja2FnZXM9IiINCmZvciBmaWxlbmFtZSBpbiAqLnJwbQ0KZG8NCiAgIyBjb252ZXJ0IGZpbGVuYW1lIHRvIGEgcGFja2FnZSBuYW1lDQogIHBhY2s9YHJwbSAtcXAgLS1xZiAiJXtOQU1FfVxuIiAkZmlsZW5hbWVgDQogIGlmIFsgJD8gLWVxICIwIiBdDQogIHRoZW4NCiAgICBwYWNrYWdlcz0iJHBhY2thZ2VzICRwYWNrIg0KICBmaQ0KZG9uZSAgIA0KDQojIHJlbW92ZSBvbGQgU3RvcmsgcGFja2FnZXMNCnJwbSAtZSAkcGFja2FnZXMgJj4gL2Rldi9udWxsDQoNCiMgcmVtb3ZlIGFueXRoaW5nIGxlZnQgaW4gL3Vzci9sb2NhbC9zdG9yay9iaW4NCnJtIC1yZiAvdXNyL2xvY2FsL3N0b3JrL2Jpbi8qICY+IC9kZXYvbnVsbCANCg0KIyBpbnN0YWxsIFN0b3JrIHBhY2thZ2VzDQplY2hvDQplY2hvICJJbnN0YWxsaW5nIHBhY2thZ2VzLi4uIiANCg0KIyBidWlsZCBhIGxpc3Qgb2YgcGFja2FnZXMgdG8gaW5zdGFsbA0KcGFja2FnZXM9IiINCmZvciBmaWxlbmFtZSBpbiAqLnJwbQ0KZG8NCiAgcGFja2FnZXM9IiRwYWNrYWdlcyAkZmlsZW5hbWUiDQpkb25lICAgDQoNCiMgaW5zdGFsbCB0aGUgbmV3IHN0b3JrIHBhY2thZ2VzDQpycG0gLWkgJHBhY2thZ2VzDQoNCiMgcmVwb3J0IHBhY2thZ2UgaW5zdGFsbGF0aW9uIGVycm9ycw0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgZWNobyAiV2FybmluZzogUG9zc2libGUgZXJyb3IgaW5zdGFsbGluZyBTdG9yayBwYWNrYWdlcy4uLiINCmZpDQoNCiMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCmNkICRPTERQV0QNCg0KIyBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMNCnJtIC1yZiAvdG1wL3N0b3JrICY+IC9kZXYvbnVsbA0KDQojIFNFRSBUTy1ETyAxDQojY3JlYXRlIHRoZSBlcXVpZmF4IGNlcnRpZmljYXRlIHRvIHVzZSBmb3IgY3VybA0KI2NyZWF0ZUNlcnRpZmljYXRlDQoNCiMgVE8tRE8gMQ0KIyBpbXBsZW1lbnQgdGhlIGJlbG93IGluIHRoZSBiZWdnaW5pbmcgb2Ygc3RvcmsucHkNCiNhdHRlbXB0IHRvIGRvd25sb2FkIHRoZSB1c2VycyBwdWJsaWMga2V5IGZyb20gdGhlIHJlcG9zaXRvcnkNCiNkb3dubG9hZE5SMDYgInVzZXItdXBsb2FkL3B1YmtleXMvJFNMSUNFTkFNRS5wdWJsaWNrZXkiICIvdXNyL2xvY2FsL3N0b3JrL3Zhci8kU0xJQ0VOQU1FLnB1YmxpY2tleSIgUkVUDQoNCiNpZiBbICRSRVQgLW5lIDAgXTsNCiN0aGVuDQojICAgZWNobw0KIyAgIGVjaG8gIkNvdWxkIG5vdCBmZXRjaCB5b3VyIHB1YmxpYyBrZXkgZnJvbSB0aGUgcmVwb3NpdG9yeS4iDQojICAgZWNobyAiSWYgeW91IHdhbnQgdG8gdXBsb2FkIG9uZSBmb3IgdGhlIG5leHQgdGltZSB5b3UgcnVuIg0KIyAgIGVjaG8gInRoZSBpbml0c2NyaXB0IHBsZWFzZSB2aXNpdCINCiMgICBlY2hvICJodHRwOi8vbnIwNi5jcy5hcml6b25hLmVkdS90ZXN0cGhwL3VwbG9hZC5waHAiDQojICAgZWNobw0KI2ZpDQoNCiNhdHRlbXB0IHRvIGRvd25sb2FkIHRoZSB1c2VycyBzdG9yay5jb25mIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQ0KI2Rvd25sb2FkTlIwNiAidXNlci11cGxvYWQvY29uZi8kU0xJQ0VOQU1FLnN0b3JrLmNvbmYiICIvdXNyL2xvY2FsL3N0b3JrL2V0Yy9zdG9yay5jb25mLnVzZXJzIiBSRVQNCg0KI2lmIFsgJFJFVCAtbmUgMCBdOw0KI3RoZW4NCiMgICBlY2hvDQojICAgZWNobyAiQ291bGQgbm90IGZldGNoIHlvdXIgc3RvcmsuY29uZiBmaWxlIGZyb20gdGhlIHJlcG9zaXRvcnkuIg0KIyAgIGVjaG8gIklmIHlvdSB3YW50IHRvIHVwbG9hZCBvbmUgZm9yIHRoZSBuZXh0IHRpbWUgeW91IHJ1biINCiMgICBlY2hvICJ0aGUgaW5pdHNjcmlwdCBwbGVhc2UgdmlzaXQiDQojICAgZWNobyAiaHR0cDovL25yMDYuY3MuYXJpem9uYS5lZHUvdGVzdHBocC91cGxvYWQucGhwIg0KIyAgIGVjaG8gIlN0b3JrIHdpbGwgd29yayB3aXRob3V0IGEgY29uZmlndXJhdGlvbiBmaWxlIGJ1dCB0byBtYWtlIG9uZSINCiMgICBlY2hvICJwbGVhc2UgcGxhY2UgYSBmaWxlIG5hbWVkIHN0b3JrLmNvbmYgaW4gL3Vzci9sb2NhbC9zdG9yay9ldGMiDQojICAgZWNobyAicmVmZXIgdG8gdGhlIG1hbnVhbCBmb3IgbW9yZSBkaXJlY3Rpb25zIG9yIGVtYWlsOiINCiMgICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIg0KIyAgIGVjaG8NCiNmaQ0KDQojZG9udCBuZWVkIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBjb25mIGZpbGUNCiNiZWNhdXNlIGl0IHNob3VsZCBiZSBmaXhlZCBpbiB0aGUgbmV3IHJwbXMNCiNvdmVyV3JpdGVDb25mDQoNCiMgcnVuIHN0b3JrIHRvIHVwZGF0ZSBrZXlmaWxlcyBhbmQgZG93bmxvYWQgcGFja2FnZSBsaXN0cw0KZWNobw0KZWNobyAiQXR0ZW1wdGluZyB0byBjb21tdW5pY2F0ZSB3aXRoIHN0b3JrLi4uIg0KaWYgc3RvcmsgDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJDb25ncmF0dWxhdGlvbnMsIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBib3VuZCB0byBzdG9yayEiDQogICBlY2hvDQogICBlY2hvICJGb3IgaGVscCwgeW91IG1heSB0eXBlIHN0b3JrIC0taGVscCINCiAgIGVjaG8NCiAgICNlY2hvICJUaGVyZSBpcyBhbHNvIGEgc3RvcmtxdWVyeSBjb21tYW5kIHRoYXQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIg0KICAgI2VjaG8gImFib3V0IHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LiINCiAgIGVjaG8NCiAgIGVjaG8gIkZvciBtb3JlIGhlbHAsIHZpc2l0IHRoZSBzdG9yayBwcm9qZWN0IG9ubGluZSBhdCINCiAgIGVjaG8gImh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvc3RvcmsvLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIiANCiAgICNybSAtZiAkQ0VSVCA+IC9kZXYvbnVsbA0KZWxzZQ0KICAgZWNobw0KICAgZWNobyAiQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluc3RhbGwgZmluYWxpemF0aW9uLi4uICBQbGVhc2UgY29udGFjdCINCiAgIGVjaG8gInN0b3JrLXN1cHBvcnRAY3MuYXJpem9uYS5lZHUgZm9yIGFzc2lzdGFuY2UuIg0KICAgI3JtIC1mICRDRVJUID4gL2Rldi9udWxsDQogICBleGl0IDENCmZpDQoNCiMgZG9uZQ0KZXhpdCAwDQo=', 'name': 'arizona_stork_2', 'encoding': 'base64'}, {'initscript_id': 9, 'script': 'IyEvYmluL2Jhc2gNCmNkIC8NCnJtIC1mIHN0YXJ0X3B1cnBsZQ0Kd2dldCBodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRlaXNlbnN0L3B1cnBsZS9zdGFydF9wdXJwbGUNCmNobW9kIDc1NSBzdGFydF9wdXJwbGUNCnN1IHByaW5jZXRvbl9wdXJwbGUgLWMgJy4vc3RhcnRfcHVycGxlJw0K', 'name': 'princeton_purple', 'encoding': 'base64'}, {'initscript_id': 6, 'script': 'IyEgL2Jpbi9zaA0KDQojIHNhdmUgb3JpZ2luYWwgUFdEDQpPTERQV0Q9JFBXRA0KDQojIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbg0KZXJyb3IoKQ0Kew0KICAgZWNobw0KICAgZWNobyAiUGxlYXNlIEUtbWFpbCBzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGlmIHlvdSBiZWxpZXZlIHlvdSBoYXZlIiANCiAgIGVjaG8gInJlY2VpdmVkIHRoaXMgbWVzc2FnZSBpbiBlcnJvci4iDQoNCiAgICMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCiAgIGNkICRPTERQV0QNCiAgIGV4aXQgMQ0KfQ0KDQojIGNoZWNrIGZvciByb290IHVzZXINCmlmIFsgJFVJRCAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8gJ1lvdSBtdXN0IGJlIHJvb3QgdG8gcnVuIHRoaXMgcHJvZ3JhbS4uLicNCiAgIGVycm9yDQpmaSAgIA0KIA0KIyBDbGVhbiB1cCBpbiBjYXNlIEkgcmFuIHRoaXMgYmVmb3JlDQpybSAtZiAvdG1wL3N0b3JrKiA+IC9kZXYvbnVsbCAyPiYxDQoNCiMgRmlyc3Qgb2YgYWxsIGV4cG9ydCBvdXIgcm9vdCBkaXJlY3RvcnkgdG8gU3RvcmsNCmVjaG8gImFyaXpvbmFfc3RvcmsiID4gLy5leHBvcnRkaXINCiANCiMgTm93IHRlbGwgc3RvcmsgdGhhdCB3ZSB3YW50IHRvIGJlIHNlcnZlZA0KaWYgWyAtZiAvZXRjL3NsaWNlbmFtZSBdDQp0aGVuDQogICBTTElDRU5BTUU9YGNhdCAvZXRjL3NsaWNlbmFtZWANCmVsc2UgDQogICBTTElDRU5BTUU9JFVTRVINCmZpDQoNCndnZXQgaHR0cDovL2xvY2FsaG9zdDo2NDAvJFNMSUNFTkFNRQ0KDQojIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwNCmlmIFsgISAtZiAkU0xJQ0VOQU1FIC1vICQ/IC1uZSAwIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIlN0b3JrIGRvZXNuJ3Qgc2VlbSB0byBiZSBydW5uaW5nIG9uIHRoaXMgbm9kZS4uLiINCiAgIGVycm9yDQpmaQ0KDQojIHdhaXQgZm9yIHN0b3JrIHNsaWNlIA0KZWNobyAiV2FpdGluZyBmb3IgU3RvcmsgdG8gYWNjZXB0IG91ciBiaW5kaW5nLi4uIg0Kd2hpbGUgWyAhIC1mIC90bXAvc3Rvcmtfc2F5c19nbyBdDQpkbw0KICAgc2xlZXAgMQ0KZG9uZQ0KDQojIGNoYW5nZSBQV0QgdG8gdGhlIC90bXAgZGlyZWN0b3J5IA0KY2QgL3RtcA0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIkNvdWxkIG5vdCBhY2Nlc3MgdGhlIC90bXAgZGlyZWN0b3J5Li4uIg0KICAgZXJyb3INCmZpDQoNCiMgY29uZmlybSB0aGF0IHBhY2thZ2VzIHRvIGJlIGluc3RhbGxlZCBhY3R1YWxseSBleGlzdA0KaWYgZWNobyAqLnJwbSB8IGdyZXAgJyonID4gL2Rldi9udWxsDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJFcnJvcjogU3RvcmsgcGFja2FnZSBkb3dubG9hZCBmYWlsZWQuLi4iDQogICBlcnJvcg0KZmkNCg0KIyBpbnN0YWxsIFN0b3JrIHBhY2thZ2VzDQplY2hvICJJbnN0YWxsaW5nIHBhY2thZ2VzLi4uIiANCmZvciBwYWNrIGluICoucnBtDQpkbw0KICAgIyByZW1vdmUgdGhlIG9sZCBzdG9yayBwYWNrYWdlLCBpZiBhbnkNCiAgIHJwbSAtZSBgcnBtIC1xcCAtLXFmICIle05BTUV9XG4iICRwYWNrYCA+IC9kZXYvbnVsbCAyPiYxDQoNCiAgICMgcmVtb3ZlIGFueXRoaW5nIGxlZnQgaW4gL3Vzci9sb2NhbC9zdG9yay9iaW4NCiAgIHJtIC1yZiAvdXNyL2xvY2FsL3N0b3JrL2Jpbi8qID4gL2Rldi9udWxsIDI+JjENCg0KICAgIyBpbnN0YWxsIHRoZSBuZXcgc3RvcmsgcGFja2FnZQ0KICAgcnBtIC1pICRwYWNrDQoNCiAgICMgcmVwb3J0IHBhY2thZ2UgaW5zdGFsbGF0aW9uIGVycm9ycw0KICAgaWYgWyAkPyAtbmUgIjAiIF0NCiAgIHRoZW4NCiAgICAgZWNobyAiV2FybmluZzogUG9zc2libGUgZXJyb3IgaW5zdGFsbGluZyBTdG9yayBwYWNrYWdlOiAkcGFjay4uLiINCiAgIGZpDQpkb25lDQoNCiMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCmNkICRPTERQV0QNCg0KIyBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMNCnJtIC1mIC90bXAvc3RvcmsqID4gL2Rldi9udWxsIDI+JjENCnJtICRTTElDRU5BTUUqIA0KDQojIHJ1biBzdG9yayB0byB1cGRhdGUga2V5ZmlsZXMgYW5kIGRvd25sb2FkIHBhY2thZ2UgbGlzdHMNCmVjaG8gIkF0dGVtcHRpbmcgdG8gY29tbXVuaWNhdGUgd2l0aCBzdG9yay4uLiINCmlmIHN0b3JrIA0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiQ29uZ3JhdHVsYXRpb25zLCB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgYm91bmQgdG8gc3RvcmshIg0KICAgZWNobw0KICAgZWNobyAiRm9yIGhlbHAsIHlvdSBtYXkgdHlwZSBzdG9yayAtLWhlbHAgIg0KICAgZWNobw0KICAgZWNobyAiVGhlcmUgaXMgYWxzbyBhIHN0b3JrcXVlcnkgY29tbWFuZCB0aGF0IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiINCiAgIGVjaG8gImFib3V0IHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LiINCiAgIGVjaG8NCiAgIGVjaG8gIkZvciBtb3JlIGhlbHAsIHZpc2l0IHRoZSBzdG9yayBwcm9qZWN0IG9ubGluZSBhdCINCiAgIGVjaG8gImh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvc3RvcmsvLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIiANCmVsc2UNCiAgIGVjaG8NCiAgIGVjaG8gIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBpbnN0YWxsIGZpbmFsaXphdGlvbi4uLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhc3Npc3RhbmNlLiINCiAgIGV4aXQgMQ0KZmkNCg0KIw0KIyBIZWxsbyBXb3JsZCBkZW1vIGNvZGUNCiMNCg0KIyBQdWJsaWMga2V5IGZvciB0aGlzIGRlbW8NCmNhdCA+L3Vzci9sb2NhbC9zdG9yay92YXIva2V5cy9oZWxsby5wdWJsaWNrZXkgPDwiRU9GIg0KLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0NCk1Gd3dEUVlKS29aSWh2Y05BUUVCQlFBRFN3QXdTQUpCQU1XcVE3K2VxQVljNlRPSUJPbkJyRnZqYjlnRVViaWgNCkkxd0Nyeld4a09aa01BcXFmY1RuMW9tcCtLMGd0cUtBK3VaNEIzRGlQRXI0Q0V0Myt5MmJlMGtDQXdFQUFRPT0NCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ0KRU9GDQpzZWQgLWkgLWUgJ3MvXnVzZXJuYW1lLiovdXNlcm5hbWUgPSBoZWxsby8nIC91c3IvbG9jYWwvc3RvcmsvZXRjL3N0b3JrLmNvbmYNCg0KIyBJbnN0YWxsIFJQTQ0Kc3RvcmsgdXBncmFkZSBoZWxsbw0KDQojIGVuZA0KZXhpdCAwDQo=', 'name': 'princeton_hello_stork', 'encoding': 'base64'}, {'initscript_id': 10, 'script': 'IyEvYmluL2Jhc2gNCg0KIyBJbml0IHNjcmlwdCBmb3IgdGhlIFBsYW5ldExhYiAiSGVsbG8gV29ybGQiIGRlbW8gdXNpbmcgR29vZ2xlIEVhcnRoLg0KIyBJbnN0YWxscyBhIGNyb250YWIgZW50cnkgb24gdGhlIG5vZGUgdGhhdCBwaG9uZXMgaG9tZSB0byB0aGUgc2VydmVyDQojIGV2ZXJ5IHRocmVlIG1pbnV0ZXMuDQoNClNFUlZFUj0xMjguMTEyLjEzOS43Mzo4MDQyCQkjIHBsYW5ldGxhYi0zLmNzLnByaW5jZXRvbi5lZHUNCg0KL3Vzci9iaW4vY3VybCAtcyBodHRwOi8vJFNFUlZFUi8NCmVjaG8gIiovNSAqICogKiAqIC91c3IvYmluL2N1cmwgLXMgaHR0cDovLyRTRVJWRVIvIiB8IGNyb250YWIgLQ0KL3NiaW4vY2hrY29uZmlnIGNyb25kIG9uDQo=', 'name': 'princeton_hello', 'encoding': 'base64'}]]) + +# Convert plc_initscript.initscript_id to raw initscript attribute +for slice_attribute in GetSliceAttributes({'name': 'plc_initscript'}): + id = slice_attribute['slice_attribute_id'] + slice_id = slice_attribute['slice_id'] + initscript_id = int(slice_attribute['value']) + + # Delete old attribute + DeleteSliceAttribute(id) + + if initscript_id not in initscripts: + print "Warning: Missing initscript %d" % initscript_id + continue + + initscript = base64.b64decode(initscripts[initscript_id]['script']) + + # Add as initscript attribute + AddSliceAttribute(slice_id, 'initscript', initscript) + +# Add our custom yum.conf entries +conf_file_id = AddConfFile({ + 'enabled': True, + 'source': 'PlanetLabConf/yum.conf.php?gpgcheck=1&alpha', + 'dest': '/etc/yum.conf', + 'file_permissions': '644', + 'file_owner': 'root', + 'file_group': 'root', + 'preinstall_cmd': '', + 'postinstall_cmd': '', + 'error_cmd': '', + 'ignore_cmd_errors': False, + 'always_update': False}) +AddConfFileToNodeGroup(conf_file_id, 'Alpha') + +conf_file_id = AddConfFile({ + 'enabled': True, + 'source': 'PlanetLabConf/yum.conf.php?gpgcheck=1&beta', + 'dest': '/etc/yum.conf', + 'file_permissions': '644', + 'file_owner': 'root', + 'file_group': 'root', + 'preinstall_cmd': '', + 'postinstall_cmd': '', + 'error_cmd': '', + 'ignore_cmd_errors': False, + 'always_update': False}) +AddConfFileToNodeGroup(conf_file_id, 'Beta') + +conf_file_id = AddConfFile({ + 'enabled': True, + 'source': 'PlanetLabConf/yum.conf.php?gpgcheck=1&rollout', + 'dest': '/etc/yum.conf', + 'file_permissions': '644', + 'file_owner': 'root', + 'file_group': 'root', + 'preinstall_cmd': '', + 'postinstall_cmd': '', + 'error_cmd': '', + 'ignore_cmd_errors': False, + 'always_update': False}) +AddConfFileToNodeGroup(conf_file_id, 'Rollout') + +# Add OneLab as a peer +onelab = {'peername': u'OneLab', 'peer_url': u'https://onelab-plc.inria.fr/PLCAPI/', 'key': u'-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1.4.5 (GNU/Linux)\n\nmQGiBEW0kJMRBACaTlrW0eYlQwkzRuMFfEYMwyqBT9Bm6R4g68SJ5GdjCRu3XCnd\nGTGCFF4ewOu6IcUmZDv39eqxShBWyx+JqBogYPGNvPrj07jXXKaSBCM7TPk+9kMW\nPziIxSClvO15XaPKv89c6kFaEBe0z1xsoMB/TNoLmhFUxmc24O7JnEqmYwCgjzIS\nHP7u9KIOYk1ZlTdOtwyRxVkD/1uYbPzD0Qigf8uF9ADzx7I4F1ATd2ezYq0EfzhD\nTDa15FPWwA7jm+Mye//ovT01Ju6JQtCU4N9wRsV2Yy2tWcWFZiYt+BISPVS0lJDx\nQ2Cd2+kEWyl9ByL9/ACHmCUz0OOaz9j1x+GpJLArjUdZSJOs68kPw90F62mrLHfg\nYCHpA/0ZcdJQG9QYNZ67KMFqNPho+uRww5/7kxQ4wkSyP7EK3QUVgXG5OWZ/1mPZ\njon9N04nnjrL9qoQv7m04ih3rmqyGy1MsicNCoys0RNh1eavPdAsXD1ZEXnWPA7z\naC37hxUaRPP3hH+1ifjPpAWQX1E89MK2y2zQpZipvEOAO2Lw8LRCT25lTGFiIENl\nbnRyYWwgKGh0dHA6Ly9vbmVsYWItcGxjLmlucmlhLmZyLykgPHN1cHBvcnRAb25l\nLWxhYi5vcmc+iGAEExECACAFAkW0kJMCGyMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX\ngAAKCRBuu7E0vzFd9fvbAJ9QB2neTSbAN5HuoigIbuKzTUCTjQCeM/3h7/OmjD+z\n6yXtWD4Fzyfr7fSIYAQTEQIAIAUCRbibbAIbIwYLCQgHAwIEFQIIAwQWAgMBAh4B\nAheAAAoJEG67sTS/MV31w3AAn2t6qb94HIPmqCoD/ptK34Dv+VW0AJ4782ffPPnk\nbVXHU/Sx31QCoFmj34hgBBMRAgAgBQJFtJJBAhsjBgsJCAcDAgQVAggDBBYCAwEC\nHgECF4AACgkQbruxNL8xXfU5UQCeKqXWeNzTqdMqj/qHPkp1JCb+isEAn2AzDnde\nITF0aYd02RAKsU4sKePEtEJPbmVMYWIgQ2VudHJhbCAoaHR0cDovL29uZWxhYi1w\nbGMuaW5yaWEuZnIvKSA8c3VwcG9ydEBvbmUtbGFiLm9yZz6IYAQTEQIAIAUCRbi2\npgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEG67sTS/MV31W4AAn0rW5yjR\n2a8jPP/V44gw1JhqnE8jAKCMAEh0nPjvle5oLEGectC3Es9Pm7kBDQRFtJCUEAQA\nhp38fNVy/aJiPg2lUKKnA6KjrRm3LxD66N8MSWfxGCIYzQRJHhmZWnS+m1DDOjdu\nFG9FM6QrsCRRcEQuvhKI2ORFfK75D24lj4QaXzw7vfBbAibTaDsYa0b5LxfR5pGj\nYPCQ5LrRex+Ws3DrB3acJE5/XnYJZ+rUO1ZJlm00FTMAAwUD/Ai4ZUunVB8F0VqS\nhJgDYQF08/OlAnDAcbL//P5dtXdztUNSgXZM4wW/XFnDvAsBuRnbfkT/3BeptM9L\neEbdrMi4eThLstSl13ITOsZbSL3i/2OO9sPAxupWzRWOXcQILpqR2YMRK1EapO+M\nNhjrgxU9JpMXz24FESocczSyywDXiEkEGBECAAkFAkW0kJQCGwwACgkQbruxNL8x\nXfXGxQCfZqzSqinohParWaHv+4XNoIz2B7IAn2Ge0O5wjYZeV/joulkTXfPKm7Iu\n=SsZg\n-----END PGP PUBLIC KEY BLOCK-----\n', 'cacert': u'Certificate:\r\n Data:\r\n Version: 3 (0x2)\r\n Serial Number: 67109883 (0x40003fb)\r\n Signature Algorithm: sha1WithRSAEncryption\r\n Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=G\r\n Validity\r\n Not Before: Mar 14 20:30:00 2006 GMT\r\n Not After : Mar 14 23:59:00 2013 GMT\r\n Subject: C=BE, O=Cybertrust, OU=Educational CA, CN=Cybertrust Educationa\r\n Subject Public Key Info:\r\n Public Key Algorithm: rsaEncryption\r\n RSA Public Key: (2048 bit)\r\n Modulus (2048 bit):\r\n 00:95:22:a1:10:1d:4a:46:60:6e:05:91:9b:df:83:\r\n c2:ed:12:b2:5a:7c:f8:ab:e1:f8:50:5c:28:2c:7e:\r\n 7e:00:38:93:b0:8b:4a:f1:c2:4c:3c:10:2c:3c:ef:\r\n b0:ec:a1:69:2f:b9:fc:cc:08:14:6b:8d:4f:18:f3:\r\n 83:d2:fa:a9:37:08:20:aa:5c:aa:80:60:a2:d5:a5:\r\n 22:00:cf:5a:e5:b4:97:df:ba:1e:be:5c:8e:17:19:\r\n 66:fd:af:9f:7c:7b:89:b2:0e:24:d8:c7:ab:63:c4:\r\n 95:32:8d:48:e6:63:59:7d:04:b8:33:a8:bd:d7:5d:\r\n 64:bc:63:b5:f7:4d:28:fd:f9:06:72:31:5c:ba:45:\r\n 94:65:a3:d2:b4:58:ec:3b:61:58:44:a3:2f:62:b3:\r\n 9b:80:b4:82:fd:d5:c7:cc:51:25:e5:95:3f:47:2f:\r\n 30:7b:ac:c8:78:6e:e2:e1:6d:27:eb:3d:cc:01:82:\r\n e8:35:77:8d:ab:58:bb:55:d1:d5:a4:81:56:8d:1c:\r\n d0:14:b1:b0:06:de:a0:91:22:f3:f0:a8:34:17:47:\r\n c6:e0:3e:f6:0c:5a:ac:7e:50:4b:cd:e1:69:6e:06:\r\n fc:06:7e:6a:4d:b4:95:99:a0:59:5c:35:66:ec:d9:\r\n 49:d4:17:e0:60:b0:5d:a5:d7:1a:e2:2a:6e:66:f2:\r\n af:1d\r\n Exponent: 65537 (0x10001)\r\n X509v3 extensions:\r\n X509v3 CRL Distribution Points: \r\n URI:http://www.public-trust.com/cgi-bin/CRL/2018/cdp.crl\r\n\r\n X509v3 Subject Key Identifier: \r\n 65:65:A3:3D:D7:3B:11:A3:0A:07:25:37:C9:42:4A:5B:76:77:50:E1\r\n X509v3 Certificate Policies: \r\n Policy: 1.3.6.1.4.1.6334.1.0\r\n CPS: http://www.public-trust.com/CPS/OmniRoot.html\r\n\r\n X509v3 Authority Key Identifier: \r\n DirName:/C=US/O=GTE Corporation/OU=GTE CyberTrust Solutions, Inc\r\n serial:01:A5\r\n\r\n X509v3 Key Usage: critical\r\n Certificate Sign, CRL Sign\r\n X509v3 Basic Constraints: critical\r\n CA:TRUE, pathlen:0\r\n Signature Algorithm: sha1WithRSAEncryption\r\n 43:b3:45:83:54:71:c4:1f:dc:b2:3c:6b:4e:bf:26:f2:4e:f2:\r\n ad:9a:5b:fa:86:37:88:e8:14:6c:41:18:42:5f:ef:65:3e:eb:\r\n 03:77:a0:b7:9e:75:7a:51:7c:bb:15:5b:b8:af:91:a0:34:92:\r\n 53:ed:7f:2a:49:84:ac:b9:80:4b:b5:c7:b2:23:22:fb:eb:d8:\r\n fb:6e:c9:3c:f3:d2:d1:bb:be:c9:1c:ff:6d:01:db:69:80:0e:\r\n 99:a5:ea:9e:7b:97:98:8f:b7:cf:22:9c:b3:b8:5d:e5:a9:33:\r\n 17:74:c6:97:37:0f:b4:e9:26:82:5f:61:0b:3f:1e:3d:64:e9:\r\n 2b:9b\r\n-----BEGIN CERTIFICATE-----\r\nMIIEQjCCA6ugAwIBAgIEBAAD+zANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV\r\nUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\r\ncnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\r\nb2JhbCBSb290MB4XDTA2MDMxNDIwMzAwMFoXDTEzMDMxNDIzNTkwMFowXzELMAkG\r\nA1UEBhMCQkUxEzARBgNVBAoTCkN5YmVydHJ1c3QxFzAVBgNVBAsTDkVkdWNhdGlv\r\nbmFsIENBMSIwIAYDVQQDExlDeWJlcnRydXN0IEVkdWNhdGlvbmFsIENBMIIBIjAN\r\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlSKhEB1KRmBuBZGb34PC7RKyWnz4\r\nq+H4UFwoLH5+ADiTsItK8cJMPBAsPO+w7KFpL7n8zAgUa41PGPOD0vqpNwggqlyq\r\ngGCi1aUiAM9a5bSX37oevlyOFxlm/a+ffHuJsg4k2MerY8SVMo1I5mNZfQS4M6i9\r\n111kvGO1900o/fkGcjFcukWUZaPStFjsO2FYRKMvYrObgLSC/dXHzFEl5ZU/Ry8w\r\ne6zIeG7i4W0n6z3MAYLoNXeNq1i7VdHVpIFWjRzQFLGwBt6gkSLz8Kg0F0fG4D72\r\nDFqsflBLzeFpbgb8Bn5qTbSVmaBZXDVm7NlJ1BfgYLBdpdca4ipuZvKvHQIDAQAB\r\no4IBbzCCAWswRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL3d3dy5wdWJsaWMtdHJ1\r\nc3QuY29tL2NnaS1iaW4vQ1JMLzIwMTgvY2RwLmNybDAdBgNVHQ4EFgQUZWWjPdc7\r\nEaMKByU3yUJKW3Z3UOEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEF\r\nBQcCARYtaHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL0NQUy9PbW5pUm9vdC5o\r\ndG1sMIGJBgNVHSMEgYEwf6F5pHcwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dU\r\nRSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25z\r\nLCBJbmMuMSMwIQYDVQQDExpHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdIICAaUw\r\nDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQEF\r\nBQADgYEAQ7NFg1RxxB/csjxrTr8m8k7yrZpb+oY3iOgUbEEYQl/vZT7rA3egt551\r\nelF8uxVbuK+RoDSSU+1/KkmErLmAS7XHsiMi++vY+27JPPPS0bu+yRz/bQHbaYAO\r\nmaXqnnuXmI+3zyKcs7hd5akzF3TGlzcPtOkmgl9hCz8ePWTpK5s=\r\n-----END CERTIFICATE-----\r\nCertificate:\r\n Data:\r\n Version: 1 (0x0)\r\n Serial Number: 421 (0x1a5)\r\n Signature Algorithm: md5WithRSAEncryption\r\n Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root\r\n Validity\r\n Not Before: Aug 13 00:29:00 1998 GMT\r\n Not After : Aug 13 23:59:00 2018 GMT\r\n Subject: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root\r\n Subject Public Key Info:\r\n Public Key Algorithm: rsaEncryption\r\n RSA Public Key: (1024 bit)\r\n Modulus (1024 bit):\r\n 00:95:0f:a0:b6:f0:50:9c:e8:7a:c7:88:cd:dd:17:\r\n 0e:2e:b0:94:d0:1b:3d:0e:f6:94:c0:8a:94:c7:06:\r\n c8:90:97:c8:b8:64:1a:7a:7e:6c:3c:53:e1:37:28:\r\n 73:60:7f:b2:97:53:07:9f:53:f9:6d:58:94:d2:af:\r\n 8d:6d:88:67:80:e6:ed:b2:95:cf:72:31:ca:a5:1c:\r\n 72:ba:5c:02:e7:64:42:e7:f9:a9:2c:d6:3a:0d:ac:\r\n 8d:42:aa:24:01:39:e6:9c:3f:01:85:57:0d:58:87:\r\n 45:f8:d3:85:aa:93:69:26:85:70:48:80:3f:12:15:\r\n c7:79:b4:1f:05:2f:3b:62:99\r\n Exponent: 65537 (0x10001)\r\n Signature Algorithm: md5WithRSAEncryption\r\n 6d:eb:1b:09:e9:5e:d9:51:db:67:22:61:a4:2a:3c:48:77:e3:\r\n a0:7c:a6:de:73:a2:14:03:85:3d:fb:ab:0e:30:c5:83:16:33:\r\n 81:13:08:9e:7b:34:4e:df:40:c8:74:d7:b9:7d:dc:f4:76:55:\r\n 7d:9b:63:54:18:e9:f0:ea:f3:5c:b1:d9:8b:42:1e:b9:c0:95:\r\n 4e:ba:fa:d5:e2:7c:f5:68:61:bf:8e:ec:05:97:5f:5b:b0:d7:\r\n a3:85:34:c4:24:a7:0d:0f:95:93:ef:cb:94:d8:9e:1f:9d:5c:\r\n 85:6d:c7:aa:ae:4f:1f:22:b5:cd:95:ad:ba:a7:cc:f9:ab:0b:\r\n 7a:7f\r\n-----BEGIN CERTIFICATE-----\r\nMIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD\r\nVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\r\nbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\r\nb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV\r\nUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\r\ncnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\r\nb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH\r\niM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS\r\nr41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4\r\n04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r\r\nGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9\r\n3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P\r\nlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\r\n-----END CERTIFICATE-----\r\n'} + +AddPeer(onelab) diff --git a/tools/upgrade-db.py b/tools/upgrade-db.py new file mode 100755 index 0000000..b7614f0 --- /dev/null +++ b/tools/upgrade-db.py @@ -0,0 +1,457 @@ +#!/usr/bin/python +# +# Tool for upgrading/converting a db +# Requirements: +# 1) Databse Schema - schema for the new database you what to upgrade to +# 2) Config File - the config file that describes how to convert the db +# +# Notes: +# 1) Will attempt to convert the db defined in /etc/planetlab/plc_config +# 2) Does not automatically drop archived database. They must be removed +# manually + +import sys +import os +import getopt +import pgdb + +config = {} +config_file = "/etc/planetlab/plc_config" +execfile(config_file, config) +upgrade_config_file = "plcdb.3-4.conf" +schema_file = "planetlab4.sql" +temp_dir = "/tmp" + + +def usage(): + print "Usage: %s [OPTION] UPGRADE_CONFIG_FILE " % sys.argv[0] + print "Options:" + print " -s, --schema=FILE Upgraded Database Schema" + print " -t, --temp-dir=DIR Temp Directory" + print " --help This message" + sys.exit(1) + +try: + (opts, argv) = getopt.getopt(sys.argv[1:], + "s:d:", + ["schema=", + "temp-dir=", + "help"]) +except getopt.GetoptError, err: + print "Error: ", err.msg + usage() + +for (opt, optval) in opts: + if opt == "-s" or opt == "--schema": + schema_file = optval + elif opt == "-d" or opt == "--temp-dir": + temp_dir = optval + elif opt == "--help": + usage() +try: + upgrade_config_file = argv[0] +except IndexError: + print "Error: too few arguments" + usage() + +schema = {} +inserts = [] +schema_items_ordered = [] +sequences = {} +temp_tables = {} + + +# load conf file for this upgrade +try: + upgrade_config = {} + execfile(upgrade_config_file, upgrade_config) + upgrade_config.pop('__builtins__') + db_version_previous = upgrade_config['DB_VERSION_PREVIOUS'] + db_version_new = upgrade_config['DB_VERSION_NEW'] + +except IOError, fault: + print "Error: upgrade config file (%s) not found. Exiting" % \ + (fault) + sys.exit(1) +except KeyError, fault: + print "Error: %s not set in upgrade confing (%s). Exiting" % \ + (fault, upgrade_config_file) + sys.exit(1) + + + + +def connect(): + db = pgdb.connect(user = config['PLC_DB_USER'], + database = config['PLC_DB_NAME']) + return db + +def archive_db(database, archived_database): + + archive_db = " dropdb -U postgres %s > /dev/null 2>&1;" \ + " psql template1 postgres -qc " \ + " 'ALTER DATABASE %s RENAME TO %s;';" % \ + (archived_database, database, archived_database) + exit_status = os.system(archive_db) + if exit_status: + print "Error: unable to archive database. Upgrade failed" + sys.exit(1) + #print "Status: %s has been archived. now named %s" % (database, archived_database) + + +def encode_utf8(inputfile_name, outputfile_name): + # rewrite a iso-8859-1 encoded file in utf8 + try: + inputfile = open(inputfile_name, 'r') + outputfile = open(outputfile_name, 'w') + for line in inputfile: + if line.upper().find('SET CLIENT_ENCODING') > -1: + continue + outputfile.write(unicode(line, 'iso-8859-1').encode('utf8')) + inputfile.close() + outputfile.close() + except: + print 'error encoding file' + raise + +def create_item_from_schema(item_name): + + try: + (type, body_list) = schema[item_name] + exit_status = os.system('psql %s %s -qc "%s" > /dev/null 2>&1' % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'],"".join(body_list) ) ) + if exit_status: + raise Exception + except Exception, fault: + print 'Error: create %s failed. Check schema.' % item_name + sys.exit(1) + raise fault + + except KeyError: + print "Error: cannot create %s. definition not found in %s" % \ + (key, schema_file) + return False + +def fix_row(row, table_name, table_fields): + + if table_name in ['nodenetworks']: + # convert str bwlimit to bps int + bwlimit_index = table_fields.index('bwlimit') + if isinstance(row[bwlimit_index], int): + pass + elif row[bwlimit_index].find('mbit') > -1: + row[bwlimit_index] = int(row[bwlimit_index].split('mbit')[0]) \ + * 1000000 + elif row[bwlimit_index].find('kbit') > -1: + row[bwlimit_index] = int(row[bwlimit_index].split('kbit')[0]) \ + * 1000 + elif table_name in ['slice_attribute']: + # modify some invalid foreign keys + attribute_type_index = table_fields.index('attribute_type_id') + if row[attribute_type_index] == 10004: + row[attribute_type_index] = 10016 + elif row[attribute_type_index] == 10006: + row[attribute_type_index] = 10017 + elif row[attribute_type_index] in [10031, 10033]: + row[attribute_type_index] = 10037 + elif row[attribute_type_index] in [10034, 10035]: + row[attribute_type_index] = 10036 + elif table_name in ['slice_attribute_types']: + type_id_index = table_fields.index('attribute_type_id') + if row[type_id_index] in [10004, 10006, 10031, 10033, 10034, 10035]: + return None + return row + +def fix_table(table, table_name, table_fields): + if table_name in ['slice_attribute_types']: + # remove duplicate/redundant primary keys + type_id_index = table_fields.index('attribute_type_id') + for row in table: + if row[type_id_index] in [10004, 10006, 10031, 10033, 10034, 10035]: + table.remove(row) + return table + +def remove_temp_tables(): + # remove temp_tables + try: + for temp_table in temp_tables: + os.remove(temp_tables[temp_table]) + except: + raise + +def generate_temp_table(table_name, db): + cursor = db.cursor() + try: + # get upgrade directions + table_def = upgrade_config[table_name].replace('(', '').replace(')', '').split(',') + table_fields, old_fields, joins, wheres = [], [], set(), set() + for field in table_def: + field_parts = field.strip().split(':') + table_fields.append(field_parts[0]) + old_fields.append(field_parts[1]) + if field_parts[2:]: + joins.update(set(filter(lambda x: not x.find('=') > -1, field_parts[2:]))) + wheres.update(set(filter(lambda x: x.find('=') > -1, field_parts[2:]))) + + # get indices of fields that cannot be null + (type, body_list) = schema[table_name] + not_null_indices = [] + for field in table_fields: + for body_line in body_list: + if body_line.find(field) > -1 and \ + body_line.upper().find("NOT NULL") > -1: + not_null_indices.append(table_fields.index(field)) + # get index of primary key + primary_key_indices = [] + for body_line in body_list: + if body_line.find("PRIMARY KEY") > -1: + primary_key = body_line + for field in table_fields: + if primary_key.find(" "+field+" ") > -1: + primary_key_indices.append(table_fields.index(field)) + #break + + # get old data + get_old_data = "SELECT DISTINCT %s FROM %s" % \ + (", ".join(old_fields), old_fields[0].split(".")[0]) + for join in joins: + get_old_data = get_old_data + " INNER JOIN %s USING (%s) " % \ + (join.split('.')[0], join.split('.')[1]) + if wheres: + get_old_data = get_old_data + " WHERE " + for where in wheres: + get_old_data = get_old_data + " %s" % where + cursor.execute(get_old_data) + rows = cursor.fetchall() + + # write data to a temp file + temp_file_name = '%s/%s.tmp' % (temp_dir, table_name) + temp_file = open(temp_file_name, 'w') + for row in rows: + # attempt to make any necessary fixes to data + row = fix_row(row, table_name, table_fields) + # do not attempt to write null rows + if row == None: + continue + # do not attempt to write rows with null primary keys + if filter(lambda x: row[x] == None, primary_key_indices): + continue + for i in range(len(row)): + # convert nulls into something pg can understand + if row[i] == None: + if i in not_null_indices: + # XX doesnt work if column is int type + row[i] = "" + else: + row[i] = "\N" + if isinstance(row[i], int) or isinstance(row[i], float): + row[i] = str(row[i]) + # escape whatever can mess up the data format + if isinstance(row[i], str): + row[i] = row[i].replace('\t', '\\t') + row[i] = row[i].replace('\n', '\\n') + row[i] = row[i].replace('\r', '\\r') + data_row = "\t".join(row) + temp_file.write(data_row + "\n") + temp_file.write("\.\n") + temp_file.close() + temp_tables[table_name] = temp_file_name + + except KeyError: + #print "WARNING: cannot upgrade %s. upgrade def not found. skipping" % \ + # (table_name) + return False + except IndexError, fault: + print "Error: error found in upgrade config file. " \ + "check %s configuration. Aborting " % \ + (table_name) + sys.exit(1) + except: + print "Error: configuration for %s doesnt match db schema. " \ + " Aborting" % (table_name) + try: + db.rollback() + except: + pass + raise + + +# Connect to current db +db = connect() +cursor = db.cursor() + +# determin current db version +try: + cursor.execute("SELECT relname from pg_class where relname = 'plc_db_version'") + rows = cursor.fetchall() + if not rows: + print "Warning: current db has no version. Unable to validate config file." + else: + cursor.execute("SELECT version FROM plc_db_version") + rows = cursor.fetchall() + if not rows or not rows[0]: + print "Warning: current db has no version. Unable to validate config file." + elif rows[0][0] == db_version_new: + print "Status: Versions are the same. No upgrade necessary." + sys.exit() + elif not rows[0][0] == db_version_previous: + print "Stauts: DB_VERSION_PREVIOUS in config file (%s) does not" \ + " match current db version %d" % (upgrade_config_file, rows[0][0]) + sys.exit() + else: + print "STATUS: attempting upgrade from %d to %d" % \ + (db_version_previous, db_version_new) + + # check db encoding + sql = " SELECT pg_catalog.pg_encoding_to_char(d.encoding)" \ + " FROM pg_catalog.pg_database d " \ + " WHERE d.datname = '%s' " % config['PLC_DB_NAME'] + cursor.execute(sql) + rows = cursor.fetchall() + if rows[0][0] not in ['UTF8', 'UNICODE']: + print "WARNING: db encoding is not utf8. Attempting to encode" + db.close() + # generate db dump + dump_file = '%s/dump.sql' % (temp_dir) + dump_file_encoded = dump_file + ".utf8" + dump_cmd = 'pg_dump -i %s -U postgres -f %s > /dev/null 2>&1' % \ + (config['PLC_DB_NAME'], dump_file) + if os.system(dump_cmd): + print "ERROR: during db dump. Exiting." + sys.exit(1) + # encode dump to utf8 + print "Status: encoding database dump" + encode_utf8(dump_file, dump_file_encoded) + # archive original db + archive_db(config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_sqlascii_archived') + # create a utf8 database and upload encoded data + recreate_cmd = 'createdb -U postgres -E UTF8 %s > /dev/null; ' \ + 'psql -a -U %s %s < %s > /dev/null 2>&1;' % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'], \ + config['PLC_DB_NAME'], dump_file_encoded) + print "Status: recreating database as utf8" + if os.system(recreate_cmd): + print "Error: database encoding failed. Aborting" + sys.exit(1) + + os.remove(dump_file_encoded) + os.remove(dump_file) +except: + raise + + +db = connect() +cursor = db.cursor() + +# parse the schema user wishes to upgrade to +try: + file = open(schema_file, 'r') + index = 0 + lines = file.readlines() + while index < len(lines): + line = lines[index] + if line.find("--") > -1: + line_parts = line.split("--") + line = line_parts[0] + # find all created objects + if line.startswith("CREATE"): + line_parts = line.split(" ") + if line_parts[1:3] == ['OR', 'REPLACE']: + line_parts = line_parts[2:] + item_type = line_parts[1] + item_name = line_parts[2] + schema_items_ordered.append(item_name) + if item_type in ['INDEX']: + schema[item_name] = (item_type, line) + + # functions, tables, views span over multiple lines + # handle differently than indexes + elif item_type in ['AGGREGATE', 'TABLE', 'VIEW']: + fields = [line] + while index < len(lines): + index = index + 1 + nextline =lines[index] + if nextline.find("--") > -1: + new_line_parts = nextline.split("--") + nextline = new_line_parts[0] + # look for any sequences + if item_type in ['TABLE'] and nextline.find('serial') > -1: + sequences[item_name] = nextline.strip().split()[0] + fields.append(nextline) + if nextline.find(";") >= 0: + break + schema[item_name] = (item_type, fields) + else: + print "Error: unknown type %s" % item_type + elif line.startswith("INSERT"): + inserts.append(line) + index = index + 1 + +except: + raise + +print "Status: generating temp tables" +# generate all temp tables +for key in schema_items_ordered: + (type, body_list) = schema[key] + if type == 'TABLE': + generate_temp_table(key, db) + +# disconenct from current database and archive it +cursor.close() +db.close() + +print "Status: archiving database" +archive_db(config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_archived') +os.system('createdb -U postgres -E UTF8 %s > /dev/null; ' % config['PLC_DB_NAME']) + +print "Status: upgrading database" +# attempt to create and load all items from schema into temp db +try: + for key in schema_items_ordered: + (type, body_list) = schema[key] + create_item_from_schema(key) + if type == 'TABLE': + if upgrade_config.has_key(key): + # attempt to populate with temp table data + table_def = upgrade_config[key].replace('(', '').replace(')', '').split(',') + table_fields = [field.strip().split(':')[0] for field in table_def] + insert_cmd = "psql %s %s -c " \ + " 'COPY %s (%s) FROM stdin;' < %s " % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'], key, + ", ".join(table_fields), temp_tables[key] ) + exit_status = os.system(insert_cmd) + if exit_status: + print "Error: upgrade %s failed" % key + sys.exit(1) + # update the primary key sequence + if sequences.has_key(key): + sequence = key +"_"+ sequences[key] +"_seq" + update_seq = "psql %s %s -c " \ + " \"select setval('%s', max(%s)) FROM %s;\" > /dev/null" % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'], sequence, + sequences[key], key) + exit_status = os.system(update_seq) + if exit_status: + print "Error: sequence %s update failed" % sequence + sys.exit(1) + else: + # check if there are any insert stmts in schema for this table + print "Warning: %s has no temp data file. Unable to populate with old data" % key + for insert_stmt in inserts: + if insert_stmt.find(key) > -1: + insert_cmd = 'psql %s postgres -qc "%s;" > /dev/null 2>&1' % \ + (config['PLC_DB_NAME'], insert_stmt) + os.system(insert_cmd) +except: + print "Error: failed to populate db. Unarchiving original database and aborting" + undo_command = "dropdb -U postgres %s > /dev/null; psql template1 postgres -qc" \ + " 'ALTER DATABASE %s RENAME TO %s;'; > /dev/null" % \ + (config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_archived', config['PLC_DB_NAME']) + os.system(undo_command) + #remove_temp_tables() + raise + +#remove_temp_tables() + +print "upgrade complete" diff --git a/trunk/Makefile b/trunk/Makefile new file mode 100644 index 0000000..6dab495 --- /dev/null +++ b/trunk/Makefile @@ -0,0 +1,143 @@ +# +# (Re)builds Python metafiles (__init__.py) and documentation +# +# Mark Huang +# Copyright (C) 2005 The Trustees of Princeton University +# +# $Id$ +# + +# Metafiles +init := PLC/__init__.py PLC/Methods/__init__.py + +# Python modules +#modules := psycopg2 +modules := pycurl + +# Temporarily until we can kill the Fedora Core 2 build +curl_vernum := $(shell printf %d 0x$(shell curl-config --vernum)) +pycurl_vernum := $(shell printf %d 0x070d01) # 7.13.1 +pycurl_incompatnum := $(shell printf %d 0x071000) # 7.16.0 +ifeq ($(shell test $(curl_vernum) -ge $(pycurl_vernum) && echo 1),1) +ifeq ($(shell test $(curl_vernum) -ge $(pycurl_incompatnum) && echo 0),1) +modules += pycurl +endif +endif + +modules-install := $(foreach module, $(modules), $(module)-install) +modules-clean := $(foreach module, $(modules), $(module)-clean) + +# Other stuff +subdirs := doc php php/xmlrpc + +# autoconf compatible variables +DESTDIR := /plc/root +datadir := /usr/share +bindir := /usr/bin + +PWD := $(shell pwd) + +all: $(init) $(subdirs) $(modules) + python setup.py build + +install: $(modules-install) + python setup.py install \ + --install-purelib=$(DESTDIR)/$(datadir)/plc_api \ + --install-scripts=$(DESTDIR)/$(datadir)/plc_api \ + --install-data=$(DESTDIR)/$(datadir)/plc_api + install -D -m 755 php/xmlrpc/xmlrpc.so $(DESTDIR)/$(shell php-config --extension-dir)/xmlrpc.so + install -D -m 755 refresh-peer.py $(DESTDIR)/$(bindir)/refresh-peer.py + +$(subdirs): $(init) $(modules) + +$(subdirs): %: + $(MAKE) -C $@ + +$(modules): + # Install in the current directory so that we can import it while developing + cd $@ && \ + python setup.py build && \ + python setup.py install_lib --install-dir=$(PWD) + +$(modules-install): %-install: + cd $* && \ + python setup.py install_lib --install-dir=$(DESTDIR)/$(datadir)/plc_api + +$(modules-clean): %-clean: + cd $* && python setup.py clean && rm -rf build + +clean: $(modules-clean) + find . -name '*.pyc' | xargs rm -f + rm -f $(INIT) + for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir clean ; done + python setup.py clean && rm -rf build + +index: $(init) + +index-clean: + rm $(init) + +tags: + find . '(' -name '*.py' -o -name '*.sql' -o -name '*.php' -o -name Makefile ')' | xargs etags + +########## make sync PLCHOST=hostname +ifdef PLCHOST +PLCSSH:=root@$(PLCHOST) +endif + +LOCAL_RSYNC_EXCLUDES := --exclude '*.pyc' +RSYNC_EXCLUDES := --exclude .svn --exclude CVS --exclude '*~' --exclude TAGS $(LOCAL_RSYNC_EXCLUDES) +RSYNC_COND_DRY_RUN := $(if $(findstring n,$(MAKEFLAGS)),--dry-run,) +RSYNC := rsync -a -v $(RSYNC_COND_DRY_RUN) $(RSYNC_EXCLUDES) + +sync: +ifeq (,$(PLCSSH)) + echo "sync: You must define target host as PLCHOST on the command line" + echo " e.g. make sync PLCHOST=private.one-lab.org" ; exit 1 +else + +$(RSYNC) PLC planetlab4.sql migrations $(PLCSSH):/plc/root/usr/share/plc_api/ + ssh $(PLCSSH) chroot /plc/root apachectl graceful +endif + +#################### +# All .py files in PLC/ + +# the current content of __init__.py +PLC_now := $(sort $(shell fgrep -v '"' PLC/__init__.py 2>/dev/null)) +# what should be declared +PLC_paths := $(filter-out %/__init__.py, $(wildcard PLC/*.py)) +PLC_files := $(sort $(notdir $(PLC_paths:.py=))) + +ifneq ($(PLC_now),$(PLC_files)) +PLC/__init__.py: force +endif +PLC/__init__.py: + (echo 'all = """' ; cd PLC; ls -1 *.py | grep -v __init__ | sed -e 's,.py$$,,' ; echo '""".split()') > $@ + + +# the current content of __init__.py +METHODS_now := $(sort $(shell fgrep -v '"' PLC/Methods/__init__.py 2>/dev/null)) +# what should be declared +METHODS_paths := $(filter-out %/__init__.py, $(wildcard PLC/Methods/*.py PLC/Methods/system/*.py)) +METHODS_files := $(sort $(notdir $(subst system/, system., $(METHODS_paths:.py=)))) + +ifneq ($(METHODS_now),$(METHODS_files)) +PLC/Methods/__init__.py: force +endif +PLC/Methods/__init__.py: + (echo 'methods = """' ; cd PLC/Methods; ls -1 *.py system/*.py | grep -v __init__ | sed -e 's,.py$$,,' -e 's,system/,system.,' ; echo '""".split()') > $@ + +force: + +.PHONY: all install force clean index tags $(subdirs) $(modules) + +#################### convenience, for debugging only +# make +foo : prints the value of $(foo) +# make ++foo : idem but verbose, i.e. foo=$(foo) +++%: varname=$(subst +,,$@) +++%: + @echo "$(varname)=$($(varname))" ++%: varname=$(subst +,,$@) ++%: + @echo "$($(varname))" + diff --git a/trunk/ModPython.py b/trunk/ModPython.py new file mode 100644 index 0000000..c722114 --- /dev/null +++ b/trunk/ModPython.py @@ -0,0 +1,62 @@ +# +# Apache mod_python interface +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# $Id$ +# + +import sys +import traceback +import xmlrpclib +from mod_python import apache + +from PLC.Debug import log + +from PLC.API import PLCAPI +api = PLCAPI() + +def handler(req): + try: + if req.method != "POST": + req.content_type = "text/html" + req.send_http_header() + req.write(""" + +PLCAPI XML-RPC/SOAP Interface + +

PLCAPI XML-RPC/SOAP Interface

+

Please use XML-RPC or SOAP to access the PLCAPI.

+ +""") + return apache.OK + + # Read request + request = req.read(int(req.headers_in['content-length'])) + + # mod_python < 3.2: The IP address portion of remote_addr is + # incorrect (always 0.0.0.0) when IPv6 is enabled. + # http://issues.apache.org/jira/browse/MODPYTHON-64?page=all + (remote_ip, remote_port) = req.connection.remote_addr + remote_addr = (req.connection.remote_ip, remote_port) + + # Handle request + response = api.handle(remote_addr, request) + + # Shut down database connection, otherwise up to MaxClients DB + # connections will remain open. + api.db.close() + + # Write response + req.content_type = "text/xml; charset=" + api.encoding + req.send_http_header() + req.write(response) + + return apache.OK + + except Exception, err: + # Log error in /var/log/httpd/(ssl_)?error_log + print >> log, err, traceback.format_exc() + return apache.HTTP_INTERNAL_SERVER_ERROR diff --git a/trunk/PLC/.cvsignore b/trunk/PLC/.cvsignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/trunk/PLC/.cvsignore @@ -0,0 +1 @@ +*.pyc diff --git a/trunk/PLC/API.py b/trunk/PLC/API.py new file mode 100644 index 0000000..7fcfa09 --- /dev/null +++ b/trunk/PLC/API.py @@ -0,0 +1,174 @@ +# +# PLCAPI XML-RPC and SOAP interfaces +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# $Id$ +# + +import sys +import traceback +import string + +import xmlrpclib + +# See "2.2 Characters" in the XML specification: +# +# #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] +# avoiding +# [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF] + +invalid_xml_ascii = map(chr, range(0x0, 0x8) + [0xB, 0xC] + range(0xE, 0x1F)) +xml_escape_table = string.maketrans("".join(invalid_xml_ascii), "?" * len(invalid_xml_ascii)) + +def xmlrpclib_escape(s, replace = string.replace): + """ + xmlrpclib does not handle invalid 7-bit control characters. This + function augments xmlrpclib.escape, which by default only replaces + '&', '<', and '>' with entities. + """ + + # This is the standard xmlrpclib.escape function + s = replace(s, "&", "&") + s = replace(s, "<", "<") + s = replace(s, ">", ">",) + + # Replace invalid 7-bit control characters with '?' + return s.translate(xml_escape_table) + +def xmlrpclib_dump(self, value, write): + """ + xmlrpclib cannot marshal instances of subclasses of built-in + types. This function overrides xmlrpclib.Marshaller.__dump so that + any value that is an instance of one of its acceptable types is + marshalled as that type. + + xmlrpclib also cannot handle invalid 7-bit control characters. See + above. + """ + + # Use our escape function + args = [self, value, write] + if isinstance(value, (str, unicode)): + args.append(xmlrpclib_escape) + + try: + # Try for an exact match first + f = self.dispatch[type(value)] + except KeyError: + # Try for an isinstance() match + for Type, f in self.dispatch.iteritems(): + if isinstance(value, Type): + f(*args) + return + raise TypeError, "cannot marshal %s objects" % type(value) + else: + f(*args) + +# You can't hide from me! +xmlrpclib.Marshaller._Marshaller__dump = xmlrpclib_dump + +# SOAP support is optional +try: + import SOAPpy + from SOAPpy.Parser import parseSOAPRPC + from SOAPpy.Types import faultType + from SOAPpy.NS import NS + from SOAPpy.SOAPBuilder import buildSOAP +except ImportError: + SOAPpy = None + +from PLC.Config import Config +from PLC.Faults import * +import PLC.Methods + +class PLCAPI: + methods = PLC.Methods.methods + + def __init__(self, config = "/etc/planetlab/plc_config", encoding = "utf-8"): + self.encoding = encoding + + # Better just be documenting the API + if config is None: + return + + # Load configuration + self.config = Config(config) + + # Initialize database connection + if self.config.PLC_DB_TYPE == "postgresql": + from PLC.PostgreSQL import PostgreSQL + self.db = PostgreSQL(self) + + else: + raise PLCAPIError, "Unsupported database type " + self.config.PLC_DB_TYPE + + def callable(self, method): + """ + Return a new instance of the specified method. + """ + + # Look up method + if method not in self.methods: + raise PLCInvalidAPIMethod, method + + # Get new instance of method + try: + classname = method.split(".")[-1] + module = __import__("PLC.Methods." + method, globals(), locals(), [classname]) + return getattr(module, classname)(self) + except ImportError, AttributeError: + raise PLCInvalidAPIMethod, method + + def call(self, source, method, *args): + """ + Call the named method from the specified source with the + specified arguments. + """ + + function = self.callable(method) + function.source = source + return function(*args) + + def handle(self, source, data): + """ + Handle an XML-RPC or SOAP request from the specified source. + """ + + # Parse request into method name and arguments + try: + interface = xmlrpclib + (args, method) = xmlrpclib.loads(data) + methodresponse = True + except Exception, e: + if SOAPpy is not None: + interface = SOAPpy + (r, header, body, attrs) = parseSOAPRPC(data, header = 1, body = 1, attrs = 1) + method = r._name + args = r._aslist() + # XXX Support named arguments + else: + raise e + + try: + result = self.call(source, method, *args) + except PLCFault, fault: + # Handle expected faults + if interface == xmlrpclib: + result = fault + methodresponse = None + elif interface == SOAPpy: + result = faultParameter(NS.ENV_T + ":Server", "Method Failed", method) + result._setDetail("Fault %d: %s" % (fault.faultCode, fault.faultString)) + + # Return result + if interface == xmlrpclib: + if not isinstance(result, PLCFault): + result = (result,) + data = xmlrpclib.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1) + elif interface == SOAPpy: + data = buildSOAP(kw = {'%sResponse' % method: {'Result': result}}, encoding = self.encoding) + + return data diff --git a/trunk/PLC/AddressTypes.py b/trunk/PLC/AddressTypes.py new file mode 100644 index 0000000..dd6afff --- /dev/null +++ b/trunk/PLC/AddressTypes.py @@ -0,0 +1,66 @@ +# +# Functions for interacting with the address_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from types import StringTypes +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table + +class AddressType(Row): + """ + Representation of a row in the address_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'address_types' + primary_key = 'address_type_id' + join_tables = ['address_address_type'] + fields = { + 'address_type_id': Parameter(int, "Address type identifier"), + 'name': Parameter(str, "Address type", max = 20), + 'description': Parameter(str, "Address type description", max = 254), + } + + def validate_name(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Address type must be specified" + + # Make sure address type does not already exist + conflicts = AddressTypes(self.api, [name]) + for address_type_id in conflicts: + if 'address_type_id' not in self or self['address_type_id'] != address_type_id: + raise PLCInvalidArgument, "Address type name already in use" + + return name + +class AddressTypes(Table): + """ + Representation of the address_types table in the database. + """ + + def __init__(self, api, address_type_filter = None, columns = None): + Table.__init__(self, api, AddressType, columns) + + sql = "SELECT %s FROM address_types WHERE True" % \ + ", ".join(self.columns) + + if address_type_filter is not None: + if isinstance(address_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), address_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), address_type_filter) + address_type_filter = Filter(AddressType.fields, {'address_type_id': ints, 'name': strs}) + sql += " AND (%s) %s" % address_type_filter.sql(api, "OR") + elif isinstance(address_type_filter, dict): + address_type_filter = Filter(AddressType.fields, address_type_filter) + sql += " AND (%s) %s" % address_type_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/trunk/PLC/Addresses.py b/trunk/PLC/Addresses.py new file mode 100644 index 0000000..36c0d1d --- /dev/null +++ b/trunk/PLC/Addresses.py @@ -0,0 +1,99 @@ +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter +from PLC.AddressTypes import AddressType, AddressTypes + +class Address(Row): + """ + Representation of a row in the addresses table. To use, instantiate + with a dict of values. + """ + + table_name = 'addresses' + primary_key = 'address_id' + join_tables = ['address_address_type', 'site_address'] + fields = { + 'address_id': Parameter(int, "Address identifier"), + 'line1': Parameter(str, "Address line 1", max = 254), + 'line2': Parameter(str, "Address line 2", max = 254, nullok = True), + 'line3': Parameter(str, "Address line 3", max = 254, nullok = True), + 'city': Parameter(str, "City", max = 254), + 'state': Parameter(str, "State or province", max = 254), + 'postalcode': Parameter(str, "Postal code", max = 64), + 'country': Parameter(str, "Country", max = 128), + 'address_type_ids': Parameter([int], "Address type identifiers"), + 'address_types': Parameter([str], "Address types"), + } + + def add_address_type(self, address_type, commit = True): + """ + Add address type to existing address. + """ + + assert 'address_id' in self + assert isinstance(address_type, AddressType) + assert 'address_type_id' in address_type + + address_id = self['address_id'] + address_type_id = address_type['address_type_id'] + + if address_type_id not in self['address_type_ids']: + assert address_type['name'] not in self['address_types'] + + self.api.db.do("INSERT INTO address_address_type (address_id, address_type_id)" \ + " VALUES(%(address_id)d, %(address_type_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['address_type_ids'].append(address_type_id) + self['address_types'].append(address_type['name']) + + def remove_address_type(self, address_type, commit = True): + """ + Add address type to existing address. + """ + + assert 'address_id' in self + assert isinstance(address_type, AddressType) + assert 'address_type_id' in address_type + + address_id = self['address_id'] + address_type_id = address_type['address_type_id'] + + if address_type_id in self['address_type_ids']: + assert address_type['name'] in self['address_types'] + + self.api.db.do("DELETE FROM address_address_type" \ + " WHERE address_id = %(address_id)d" \ + " AND address_type_id = %(address_type_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['address_type_ids'].remove(address_type_id) + self['address_types'].remove(address_type['name']) + +class Addresses(Table): + """ + Representation of row(s) from the addresses table in the + database. + """ + + def __init__(self, api, address_filter = None, columns = None): + Table.__init__(self, api, Address, columns) + + sql = "SELECT %s FROM view_addresses WHERE True" % \ + ", ".join(self.columns) + + if address_filter is not None: + if isinstance(address_filter, (list, tuple, set)): + address_filter = Filter(Address.fields, {'address_id': address_filter}) + elif isinstance(address_filter, dict): + address_filter = Filter(Address.fields, address_filter) + sql += " AND (%s) %s" % address_filter.sql(api) + + self.selectall(sql) diff --git a/trunk/PLC/Auth.py b/trunk/PLC/Auth.py new file mode 100644 index 0000000..f62b511 --- /dev/null +++ b/trunk/PLC/Auth.py @@ -0,0 +1,332 @@ +# +# PLCAPI authentication parameters +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import crypt +import sha +import hmac +import time + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Persons +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Sessions import Session, Sessions +from PLC.Peers import Peer, Peers +from PLC.Boot import notify_owners + +class Auth(Parameter): + """ + Base class for all API authentication methods, as well as a class + that can be used to represent all supported API authentication + methods. + """ + + def __init__(self, auth = None): + if auth is None: + auth = {'AuthMethod': Parameter(str, "Authentication method to use", optional = False)} + Parameter.__init__(self, auth, "API authentication structure") + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert 'AuthMethod' in auth + + if auth['AuthMethod'] == "session": + expected = SessionAuth() + elif auth['AuthMethod'] == "password" or \ + auth['AuthMethod'] == "capability": + expected = PasswordAuth() + elif auth['AuthMethod'] == "gpg": + expected = GPGAuth() + elif auth['AuthMethod'] == "hmac": + expected = BootAuth() + elif auth['AuthMethod'] == "anonymous": + expected = AnonymousAuth() + else: + raise PLCInvalidArgument("must be 'session', 'password', 'gpg', 'hmac', or 'anonymous'", "AuthMethod") + + # Re-check using the specified authentication method + method.type_check("auth", auth, expected, (auth,) + args) + +class GPGAuth(Auth): + """ + Proposed PlanetLab federation authentication structure. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'gpg'", optional = False), + 'name': Parameter(str, "Peer or user name", optional = False), + 'signature': Parameter(str, "Message signature", optional = False) + }) + + def check(self, method, auth, *args): + try: + peers = Peers(method.api, [auth['name']]) + if peers: + if 'peer' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = peer = peers[0] + keys = [peer['key']] + else: + persons = Persons(method.api, {'email': auth['name'], 'enabled': True, 'peer_id': None}) + if not persons: + raise PLCAuthenticationFailure, "No such user '%s'" % auth['name'] + + if not set(person['roles']).intersection(method.roles): + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = person = persons[0] + keys = Keys(method.api, {'key_id': person['key_ids'], 'key_type': "gpg", 'peer_id': None}) + + if not keys: + raise PLCAuthenticationFailure, "No GPG key on record for peer or user '%s'" + + for key in keys: + try: + from PLC.GPG import gpg_verify + gpg_verify(args, key, auth['signature'], method.name) + return + except PLCAuthenticationFailure, fault: + pass + + raise fault + + except PLCAuthenticationFailure, fault: + # XXX Send e-mail + raise fault + +class SessionAuth(Auth): + """ + Secondary authentication method. After authenticating with a + primary authentication method, call GetSession() to generate a + session key that may be used for subsequent calls. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'session'", optional = False), + 'session': Parameter(str, "Session key", optional = False) + }) + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert auth.has_key('session') + + # Get session record + sessions = Sessions(method.api, [auth['session']], expires = None) + if not sessions: + raise PLCAuthenticationFailure, "No such session" + session = sessions[0] + + try: + if session['node_id'] is not None: + nodes = Nodes(method.api, {'node_id': session['node_id'], 'peer_id': None}) + if not nodes: + raise PLCAuthenticationFailure, "No such node" + node = nodes[0] + + if 'node' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = node + + elif session['person_id'] is not None and session['expires'] > time.time(): + persons = Persons(method.api, {'person_id': session['person_id'], 'enabled': True, 'peer_id': None}) + if not persons: + raise PLCAuthenticationFailure, "No such account" + person = persons[0] + + if not set(person['roles']).intersection(method.roles): + raise PLCPermissionDenied, "Not allowed to call method" + + method.caller = persons[0] + + else: + raise PLCAuthenticationFailure, "Invalid session" + + except PLCAuthenticationFailure, fault: + session.delete() + raise fault + +class BootAuth(Auth): + """ + PlanetLab version 3.x node authentication structure. Used by the + Boot Manager to make authenticated calls to the API based on a + unique node key or boot nonce value. + + The original parameter serialization code did not define the byte + encoding of strings, or the string encoding of all other types. We + define the byte encoding to be UTF-8, and the string encoding of + all other types to be however Python version 2.3 unicode() encodes + them. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'hmac'", optional = False), + 'node_id': Parameter(int, "Node identifier", optional = False), + 'value': Parameter(str, "HMAC of node key and method call", optional = False) + }) + + def canonicalize(self, args): + values = [] + + for arg in args: + if isinstance(arg, list) or isinstance(arg, tuple): + # The old implementation did not recursively handle + # lists of lists. But neither did the old API itself. + values += self.canonicalize(arg) + elif isinstance(arg, dict): + # Yes, the comments in the old implementation are + # misleading. Keys of dicts are not included in the + # hash. + values += self.canonicalize(arg.values()) + else: + # We use unicode() instead of str(). + values.append(unicode(arg)) + + return values + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert auth.has_key('node_id') + + if 'node' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method" + + try: + nodes = Nodes(method.api, {'node_id': auth['node_id'], 'peer_id': None}) + if not nodes: + raise PLCAuthenticationFailure, "No such node" + node = nodes[0] + + if node['key']: + key = node['key'] + elif node['boot_nonce']: + # Allow very old nodes that do not have a node key in + # their configuration files to use their "boot nonce" + # instead. The boot nonce is a random value generated + # by the node itself and POSTed by the Boot CD when it + # requests the Boot Manager. This is obviously not + # very secure, so we only allow it to be used if the + # requestor IP is the same as the IP address we have + # on record for the node. + key = node['boot_nonce'] + + nodenetwork = None + if node['nodenetwork_ids']: + nodenetworks = NodeNetworks(method.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + break + + if not nodenetwork or not nodenetwork['is_primary']: + raise PLCAuthenticationFailure, "No primary network interface on record" + + if method.source is None: + raise PLCAuthenticationFailure, "Cannot determine IP address of requestor" + + if nodenetwork['ip'] != method.source[0]: + raise PLCAuthenticationFailure, "Requestor IP %s does not match node IP %s" % \ + (method.source[0], nodenetwork['ip']) + else: + raise PLCAuthenticationFailure, "No node key or boot nonce" + + # Yes, this is the "canonicalization" method used. + args = self.canonicalize(args) + args.sort() + msg = "[" + "".join(args) + "]" + + # We encode in UTF-8 before calculating the HMAC, which is + # an 8-bit algorithm. + digest = hmac.new(key, msg.encode('utf-8'), sha).hexdigest() + + if digest != auth['value']: + raise PLCAuthenticationFailure, "Call could not be authenticated" + + method.caller = node + + except PLCAuthenticationFailure, fault: + if nodes: + notify_owners(method, node, 'authfail', include_pis = True, include_techs = True, fault = fault) + raise fault + +class AnonymousAuth(Auth): + """ + PlanetLab version 3.x anonymous authentication structure. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'anonymous'", False), + }) + + def check(self, method, auth, *args): + if 'anonymous' not in method.roles: + raise PLCAuthenticationFailure, "Not allowed to call method anonymously" + + method.caller = None + +class PasswordAuth(Auth): + """ + PlanetLab version 3.x password authentication structure. + """ + + def __init__(self): + Auth.__init__(self, { + 'AuthMethod': Parameter(str, "Authentication method to use, always 'password' or 'capability'", optional = False), + 'Username': Parameter(str, "PlanetLab username, typically an e-mail address", optional = False), + 'AuthString': Parameter(str, "Authentication string, typically a password", optional = False), + }) + + def check(self, method, auth, *args): + # Method.type_check() should have checked that all of the + # mandatory fields were present. + assert auth.has_key('Username') + + # Get record (must be enabled) + persons = Persons(method.api, {'email': auth['Username'].lower(), 'enabled': True, 'peer_id': None}) + if len(persons) != 1: + raise PLCAuthenticationFailure, "No such account" + + person = persons[0] + + if auth['Username'] == method.api.config.PLC_API_MAINTENANCE_USER: + # "Capability" authentication, whatever the hell that was + # supposed to mean. It really means, login as the special + # "maintenance user" using password authentication. Can + # only be used on particular machines (those in a list). + sources = method.api.config.PLC_API_MAINTENANCE_SOURCES.split() + if method.source is not None and method.source[0] not in sources: + raise PLCAuthenticationFailure, "Not allowed to login to maintenance account" + + # Not sure why this is not stored in the DB + password = method.api.config.PLC_API_MAINTENANCE_PASSWORD + + if auth['AuthString'] != password: + raise PLCAuthenticationFailure, "Maintenance account password verification failed" + else: + # Compare encrypted plaintext against encrypted password stored in the DB + plaintext = auth['AuthString'].encode(method.api.encoding) + password = person['password'] + + # Protect against blank passwords in the DB + if password is None or password[:12] == "" or \ + crypt.crypt(plaintext, password[:12]) != password: + raise PLCAuthenticationFailure, "Password verification failed" + + if not set(person['roles']).intersection(method.roles): + raise PLCAuthenticationFailure, "Not allowed to call method" + + method.caller = person diff --git a/trunk/PLC/Boot.py b/trunk/PLC/Boot.py new file mode 100644 index 0000000..cd3a738 --- /dev/null +++ b/trunk/PLC/Boot.py @@ -0,0 +1,61 @@ +# +# Boot Manager support +# +# Mark Huang +# Copyright (C) 2007 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Debug import log +from PLC.Messages import Message, Messages +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.sendmail import sendmail + +def notify_owners(method, node, message_id, + include_pis = False, include_techs = False, include_support = False, + fault = None): + messages = Messages(method.api, [message_id], enabled = True) + if not messages: + print >> log, "No such message template '%s'" % message_id + return 1 + message = messages[0] + + To = [] + + if method.api.config.PLC_MAIL_BOOT_ADDRESS: + To.append(("Boot Messages", method.api.config.PLC_MAIL_BOOT_ADDRESS)) + + if include_support and method.api.config.PLC_MAIL_SUPPORT_ADDRESS: + To.append(("%s Support" % method.api.config.PLC_NAME, + method.api.config.PLC_MAIL_SUPPORT_ADDRESS)) + + if include_pis or include_techs: + sites = Sites(method.api, [node['site_id']]) + if not sites: + raise PLCAPIError, "No site associated with node" + site = sites[0] + + persons = Persons(method.api, site['person_ids']) + for person in persons: + if include_pis and 'pi' in person['roles'] or \ + include_techs and 'tech' in person['roles']: + To.append(("%s %s" % (person['first_name'], person['last_name']), person['email'])) + + # Send email + params = {'node_id': node['node_id'], + 'hostname': node['hostname'], + 'PLC_WWW_HOST': method.api.config.PLC_WWW_HOST, + 'PLC_WWW_SSL_PORT': method.api.config.PLC_WWW_SSL_PORT, + 'fault': fault} + + sendmail(method.api, To = To, + Subject = message['subject'] % params, + Body = message['template'] % params) + + # Logging variables + method.object_type = "Node" + method.object_ids = [node['node_id']] + method.message = "Sent message %s" % message_id diff --git a/trunk/PLC/BootStates.py b/trunk/PLC/BootStates.py new file mode 100644 index 0000000..f1bfcf9 --- /dev/null +++ b/trunk/PLC/BootStates.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the boot_states table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class BootState(Row): + """ + Representation of a row in the boot_states table. To use, + instantiate with a dict of values. + """ + + table_name = 'boot_states' + primary_key = 'boot_state' + join_tables = ['nodes'] + fields = { + 'boot_state': Parameter(str, "Boot state", max = 20), + } + + def validate_boot_state(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Boot state must be specified" + + # Make sure boot state does not alredy exist + conflicts = BootStates(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Boot state name already in use" + + return name + +class BootStates(Table): + """ + Representation of the boot_states table in the database. + """ + + def __init__(self, api, boot_states = None): + Table.__init__(self, api, BootState) + + sql = "SELECT %s FROM boot_states" % \ + ", ".join(BootState.fields) + + if boot_states: + sql += " WHERE boot_state IN (%s)" % ", ".join(map(api.db.quote, boot_states)) + + self.selectall(sql) diff --git a/trunk/PLC/ConfFiles.py b/trunk/PLC/ConfFiles.py new file mode 100644 index 0000000..63474e3 --- /dev/null +++ b/trunk/PLC/ConfFiles.py @@ -0,0 +1,155 @@ +# +# Functions for interacting with the conf_files table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Nodes import Node, Nodes +from PLC.NodeGroups import NodeGroup, NodeGroups + +class ConfFile(Row): + """ + Representation of a row in the conf_files table. To use, + instantiate with a dict of values. + """ + + table_name = 'conf_files' + primary_key = 'conf_file_id' + join_tables = ['conf_file_node', 'conf_file_nodegroup'] + fields = { + 'conf_file_id': Parameter(int, "Configuration file identifier"), + 'enabled': Parameter(bool, "Configuration file is active"), + 'source': Parameter(str, "Relative path on the boot server where file can be downloaded", max = 255), + 'dest': Parameter(str, "Absolute path where file should be installed", max = 255), + 'file_permissions': Parameter(str, "chmod(1) permissions", max = 20), + 'file_owner': Parameter(str, "chown(1) owner", max = 50), + 'file_group': Parameter(str, "chgrp(1) owner", max = 50), + 'preinstall_cmd': Parameter(str, "Shell command to execute prior to installing", max = 1024, nullok = True), + 'postinstall_cmd': Parameter(str, "Shell command to execute after installing", max = 1024, nullok = True), + 'error_cmd': Parameter(str, "Shell command to execute if any error occurs", max = 1024, nullok = True), + 'ignore_cmd_errors': Parameter(bool, "Install file anyway even if an error occurs"), + 'always_update': Parameter(bool, "Always attempt to install file even if unchanged"), + 'node_ids': Parameter(int, "List of nodes linked to this file"), + 'nodegroup_ids': Parameter(int, "List of node groups linked to this file"), + } + + def add_node(self, node, commit = True): + """ + Add configuration file to node. + """ + + assert 'conf_file_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + conf_file_id = self['conf_file_id'] + node_id = node['node_id'] + + if node_id not in self['node_ids']: + self.api.db.do("INSERT INTO conf_file_node (conf_file_id, node_id)" \ + " VALUES(%(conf_file_id)d, %(node_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].append(node_id) + node['conf_file_ids'].append(conf_file_id) + + def remove_node(self, node, commit = True): + """ + Remove configuration file from node. + """ + + assert 'conf_file_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + conf_file_id = self['conf_file_id'] + node_id = node['node_id'] + + if node_id in self['node_ids']: + self.api.db.do("DELETE FROM conf_file_node" \ + " WHERE conf_file_id = %(conf_file_id)d" \ + " AND node_id = %(node_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].remove(node_id) + node['conf_file_ids'].remove(conf_file_id) + + def add_nodegroup(self, nodegroup, commit = True): + """ + Add configuration file to node group. + """ + + assert 'conf_file_id' in self + assert isinstance(nodegroup, NodeGroup) + assert 'nodegroup_id' in nodegroup + + conf_file_id = self['conf_file_id'] + nodegroup_id = nodegroup['nodegroup_id'] + + if nodegroup_id not in self['nodegroup_ids']: + self.api.db.do("INSERT INTO conf_file_nodegroup (conf_file_id, nodegroup_id)" \ + " VALUES(%(conf_file_id)d, %(nodegroup_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['nodegroup_ids'].append(nodegroup_id) + nodegroup['conf_file_ids'].append(conf_file_id) + + def remove_nodegroup(self, nodegroup, commit = True): + """ + Remove configuration file from node group. + """ + + assert 'conf_file_id' in self + assert isinstance(nodegroup, NodeGroup) + assert 'nodegroup_id' in nodegroup + + conf_file_id = self['conf_file_id'] + nodegroup_id = nodegroup['nodegroup_id'] + + if nodegroup_id in self['nodegroup_ids']: + self.api.db.do("DELETE FROM conf_file_nodegroup" \ + " WHERE conf_file_id = %(conf_file_id)d" \ + " AND nodegroup_id = %(nodegroup_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['nodegroup_ids'].remove(nodegroup_id) + nodegroup['conf_file_ids'].remove(conf_file_id) + +class ConfFiles(Table): + """ + Representation of the conf_files table in the database. + """ + + def __init__(self, api, conf_file_filter = None, columns = None): + Table.__init__(self, api, ConfFile, columns) + + sql = "SELECT %s FROM view_conf_files WHERE True" % \ + ", ".join(self.columns) + + if conf_file_filter is not None: + if isinstance(conf_file_filter, (list, tuple, set)): + conf_file_filter = Filter(ConfFile.fields, {'conf_file_id': conf_file_filter}) + elif isinstance(conf_file_filter, dict): + conf_file_filter = Filter(ConfFile.fields, conf_file_filter) + sql += " AND (%s) %s" % conf_file_filter.sql(api) + + self.selectall(sql) diff --git a/trunk/PLC/Config.py b/trunk/PLC/Config.py new file mode 100644 index 0000000..6a4a7e2 --- /dev/null +++ b/trunk/PLC/Config.py @@ -0,0 +1,96 @@ +#!/usr/bin/python +# +# PLCAPI configuration store. Supports XML-based configuration file +# format exported by MyPLC. +# +# Mark Huang +# Copyright (C) 2004-2006 The Trustees of Princeton University +# +# $Id$ +# + +import os +import sys + +from PLC.Faults import * +from PLC.Debug import profile + +# If we have been checked out into a directory at the same +# level as myplc, where plc_config.py lives. If we are in a +# MyPLC environment, plc_config.py has already been installed +# in site-packages. +myplc = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + \ + os.sep + "myplc" + +class Config: + """ + Parse the bash/Python/PHP version of the configuration file. Very + fast but no type conversions. + """ + + def __init__(self, file = "/etc/planetlab/plc_config"): + # Load plc_config + try: + execfile(file, self.__dict__) + except: + # Try myplc directory + try: + execfile(myplc + os.sep + "plc_config", self.__dict__) + except: + raise PLCAPIError("Could not find plc_config in " + \ + file + ", " + \ + myplc + os.sep + "plc_config") + +class XMLConfig: + """ + Parse the XML configuration file directly. Takes longer but is + presumably more accurate. + """ + + def __init__(self, file = "/etc/planetlab/plc_config.xml"): + try: + from plc_config import PLCConfiguration + except: + sys.path.append(myplc) + from plc_config import PLCConfiguration + + # Load plc_config.xml + try: + cfg = PLCConfiguration(file) + except: + # Try myplc directory + try: + cfg = PLCConfiguration(myplc + os.sep + "plc_config.xml") + except: + raise PLCAPIError("Could not find plc_config.xml in " + \ + file + ", " + \ + myplc + os.sep + "plc_config.xml") + + for (category, variablelist) in cfg.variables().values(): + for variable in variablelist.values(): + # Try to cast each variable to an appropriate Python + # type. + if variable['type'] == "int": + value = int(variable['value']) + elif variable['type'] == "double": + value = float(variable['value']) + elif variable['type'] == "boolean": + if variable['value'] == "true": + value = True + else: + value = False + else: + value = variable['value'] + + # Variables are split into categories such as + # "plc_api", "plc_db", etc. Within each category are + # variables such as "host", "port", etc. For backward + # compatibility, refer to variables by their shell + # names. + shell_name = category['id'].upper() + "_" + variable['id'].upper() + setattr(self, shell_name, value) + +if __name__ == '__main__': + import pprint + pprint = pprint.PrettyPrinter() + pprint.pprint(Config().__dict__.items()) diff --git a/trunk/PLC/Debug.py b/trunk/PLC/Debug.py new file mode 100644 index 0000000..b8dac85 --- /dev/null +++ b/trunk/PLC/Debug.py @@ -0,0 +1,54 @@ +import time +import sys +import syslog + +class unbuffered: + """ + Write to /var/log/httpd/error_log. See + + http://www.modpython.org/FAQ/faqw.py?req=edit&file=faq02.003.htp + """ + + def write(self, data): + sys.stderr.write(data) + sys.stderr.flush() + +log = unbuffered() + +def profile(callable): + """ + Prints the runtime of the specified callable. Use as a decorator, e.g., + + @profile + def foo(...): + ... + + Or, equivalently, + + def foo(...): + ... + foo = profile(foo) + + Or inline: + + result = profile(foo)(...) + """ + + def wrapper(*args, **kwds): + start = time.time() + result = callable(*args, **kwds) + end = time.time() + args = map(str, args) + args += ["%s = %s" % (name, str(value)) for (name, value) in kwds.items()] + print >> log, "%s (%s): %f s" % (callable.__name__, ", ".join(args), end - start) + return result + + return wrapper + +if __name__ == "__main__": + def sleep(seconds = 1): + time.sleep(seconds) + + sleep = profile(sleep) + + sleep(1) diff --git a/trunk/PLC/EventObjects.py b/trunk/PLC/EventObjects.py new file mode 100644 index 0000000..1c6c4bb --- /dev/null +++ b/trunk/PLC/EventObjects.py @@ -0,0 +1,63 @@ +# +# Functions for interacting with the events table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table + +class EventObject(Row): + """ + Representation of a row in the event_object table. + """ + + table_name = 'event_object' + primary_key = 'event_id' + fields = { + 'event_id': Parameter(int, "Event identifier"), + 'person_id': Parameter(int, "Identifier of person responsible for event, if any"), + 'node_id': Parameter(int, "Identifier of node responsible for event, if any"), + 'fault_code': Parameter(int, "Event fault code"), + 'call_name': Parameter(str, "Call responsible for this event"), + 'call': Parameter(str, "Call responsible for this event, including paramters"), + 'message': Parameter(str, "High level description of this event"), + 'runtime': Parameter(float, "Runtime of event"), + 'time': Parameter(int, "Date and time that the event took place, in seconds since UNIX epoch", ro = True), + 'object_id': Parameter(int, "ID of objects affected by this event"), + 'object_type': Parameter(str, "What type of object is this event affecting") + } + +class EventObjects(Table): + """ + Representation of row(s) from the event_object table in the database. + """ + + def __init__(self, api, event_filter = None, columns = None): + Table.__init__(self, api, EventObject, columns) + + sql = "SELECT %s FROM view_event_objects WHERE True" % \ + ", ".join(self.columns) + + if event_filter is not None: + if isinstance(event_filter, (list, tuple, set)): + event_filter = Filter(EventObject.fields, {'event_id': event_filter}) + sql += " AND (%s) %s" % event_filter.sql(api, "OR") + elif isinstance(event_filter, dict): + event_filter = Filter(EventObject.fields, event_filter) + sql += " AND (%s) %s" % event_filter.sql(api, "AND") + elif isinstance (event_filter, int): + event_filter = Filter(EventObject.fields, {'event_id':[event_filter]}) + sql += " AND (%s) %s" % event_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong event object filter %r"%event_filter +# with new filtering, caller needs to set this explicitly +# sql += " ORDER BY %s" % EventObject.primary_key + + self.selectall(sql) diff --git a/trunk/PLC/Events.py b/trunk/PLC/Events.py new file mode 100644 index 0000000..c01f589 --- /dev/null +++ b/trunk/PLC/Events.py @@ -0,0 +1,79 @@ +# +# Functions for interacting with the events table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table + +class Event(Row): + """ + Representation of a row in the events table. + """ + + table_name = 'events' + primary_key = 'event_id' + fields = { + 'event_id': Parameter(int, "Event identifier"), + 'person_id': Parameter(int, "Identifier of person responsible for event, if any"), + 'node_id': Parameter(int, "Identifier of node responsible for event, if any"), + 'auth_type': Parameter(int, "Type of auth used. i.e. AuthMethod"), + 'fault_code': Parameter(int, "Event fault code"), + 'call_name': Parameter(str, "Call responsible for this event"), + 'call': Parameter(str, "Call responsible for this event, including paramters"), + 'message': Parameter(str, "High level description of this event"), + 'runtime': Parameter(float, "Runtime of event"), + 'time': Parameter(int, "Date and time that the event took place, in seconds since UNIX epoch", ro = True), + 'object_ids': Parameter([int], "IDs of objects affected by this event"), + 'object_types': Parameter([str], "What type of object were affected by this event") + } + + def add_object(self, object_type, object_id, commit = True): + """ + Relate object to this event. + """ + + assert 'event_id' in self + + event_id = self['event_id'] + + if 'object_ids' not in self: + self['object_ids'] = [] + + if object_id not in self['object_ids']: + self.api.db.do("INSERT INTO event_object (event_id, object_id, object_type)" \ + " VALUES(%(event_id)d, %(object_id)d, %(object_type)s)", + locals()) + + if commit: + self.api.db.commit() + + self['object_ids'].append(object_id) + +class Events(Table): + """ + Representation of row(s) from the events table in the database. + """ + + def __init__(self, api, event_filter = None, columns = None): + Table.__init__(self, api, Event, columns) + + sql = "SELECT %s FROM view_events WHERE True" % \ + ", ".join(self.columns) + + if event_filter is not None: + if isinstance(event_filter, (list, tuple, set)): + event_filter = Filter(Event.fields, {'event_id': event_filter}) + elif isinstance(event_filter, dict): + event_filter = Filter(Event.fields, event_filter) + sql += " AND (%s) %s" % event_filter.sql(api) +# with new filtering, caller needs to set this explicitly +# sql += " ORDER BY %s" % Event.primary_key + self.selectall(sql) diff --git a/trunk/PLC/Faults.py b/trunk/PLC/Faults.py new file mode 100644 index 0000000..3c9328e --- /dev/null +++ b/trunk/PLC/Faults.py @@ -0,0 +1,67 @@ +# +# PLCAPI XML-RPC faults +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# $Id$ +# + +import xmlrpclib + +class PLCFault(xmlrpclib.Fault): + def __init__(self, faultCode, faultString, extra = None): + if extra: + faultString += ": " + extra + xmlrpclib.Fault.__init__(self, faultCode, faultString) + +class PLCInvalidAPIMethod(PLCFault): + def __init__(self, method, role = None, extra = None): + faultString = "Invalid method " + method + if role: + faultString += " for role " + role + PLCFault.__init__(self, 100, faultString, extra) + +class PLCInvalidArgumentCount(PLCFault): + def __init__(self, got, min, max = min, extra = None): + if min != max: + expected = "%d-%d" % (min, max) + else: + expected = "%d" % min + faultString = "Expected %s arguments, got %d" % \ + (expected, got) + PLCFault.__init__(self, 101, faultString, extra) + +class PLCInvalidArgument(PLCFault): + def __init__(self, extra = None, name = None): + if name is not None: + faultString = "Invalid %s value" % name + else: + faultString = "Invalid argument" + PLCFault.__init__(self, 102, faultString, extra) + +class PLCAuthenticationFailure(PLCFault): + def __init__(self, extra = None): + faultString = "Failed to authenticate call" + PLCFault.__init__(self, 103, faultString, extra) + +class PLCDBError(PLCFault): + def __init__(self, extra = None): + faultString = "Database error" + PLCFault.__init__(self, 106, faultString, extra) + +class PLCPermissionDenied(PLCFault): + def __init__(self, extra = None): + faultString = "Permission denied" + PLCFault.__init__(self, 108, faultString, extra) + +class PLCNotImplemented(PLCFault): + def __init__(self, extra = None): + faultString = "Not fully implemented" + PLCFault.__init__(self, 109, faultString, extra) + +class PLCAPIError(PLCFault): + def __init__(self, extra = None): + faultString = "Internal API error" + PLCFault.__init__(self, 111, faultString, extra) diff --git a/trunk/PLC/Filter.py b/trunk/PLC/Filter.py new file mode 100644 index 0000000..4063496 --- /dev/null +++ b/trunk/PLC/Filter.py @@ -0,0 +1,203 @@ +from types import StringTypes +try: + set +except NameError: + from sets import Set + set = Set + +import time + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed, python_type + +class Filter(Parameter, dict): + """ + A type of parameter that represents a filter on one or more + columns of a database table. + Special features provide support for negation, upper and lower bounds, + as well as sorting and clipping. + + + fields should be a dictionary of field names and types + Only filters on non-sequence type fields are supported. + example : fields = {'node_id': Parameter(int, "Node identifier"), + 'hostname': Parameter(int, "Fully qualified hostname", max = 255), + ...} + + + filter should be a dictionary of field names and values + representing the criteria for filtering. + example : filter = { 'hostname' : '*.edu' , site_id : [34,54] } + Whether the filter represents an intersection (AND) or a union (OR) + of these criteria is determined by the join_with argument + provided to the sql method below + + Special features: + + * a field starting with the ~ character means negation. + example : filter = { '~peer_id' : None } + + * a field starting with < [ ] or > means lower than or greater than + < > uses strict comparison + [ ] is for using <= or >= instead + example : filter = { ']event_id' : 2305 } + example : filter = { '>time' : 1178531418 } + in this example the integer value denotes a unix timestamp + + * if a value is a sequence type, then it should represent + a list of possible values for that field + example : filter = { 'node_id' : [12,34,56] } + + * a (string) value containing either a * or a % character is + treated as a (sql) pattern; * are replaced with % that is the + SQL wildcard character. + example : filter = { 'hostname' : '*.jp' } + + * fields starting with - are special and relate to row selection, i.e. sorting and clipping + * '-SORT' : a field name, or an ordered list of field names that are used for sorting + * these fields may start with + (default) or - for denoting increasing or decreasing order + example : filter = { '-SORT' : [ '+node_id', '-hostname' ] } + * '-OFFSET' : the number of first rows to be ommitted + * '-LIMIT' : the amount of rows to be returned + example : filter = { '-OFFSET' : 100, '-PAGE':25} + + A realistic example would read + GetNodes ( { 'hostname' : '*.edu' , '-SORT' : 'hostname' , '-OFFSET' : 30 , '-PAGE' : 25 } ) + and that would return nodes matching '*.edu' in alphabetical order from 31th to 55th + """ + + def __init__(self, fields = {}, filter = {}, doc = "Attribute filter"): + # Store the filter in our dict instance + dict.__init__(self, filter) + + # Declare ourselves as a type of parameter that can take + # either a value or a list of values for each of the specified + # fields. + self.fields = {} + + for field, expected in fields.iteritems(): + # Cannot filter on sequences + if python_type(expected) in (list, tuple, set): + continue + + # Accept either a value or a list of values of the specified type + self.fields[field] = Mixed(expected, [expected]) + + # Null filter means no filter + Parameter.__init__(self, self.fields, doc = doc, nullok = True) + + # this code is not used anymore + # at some point the select in the DB for event objects was done on + # the events table directly, that is stored as a timestamp, thus comparisons + # needed to be done based on SQL timestamps as well + def unix2timestamp (self,unix): + s = time.gmtime(unix) + return "TIMESTAMP'%04d-%02d-%02d %02d:%02d:%02d'" % (s.tm_year,s.tm_mon,s.tm_mday, + s.tm_hour,s.tm_min,s.tm_sec) + + def sql(self, api, join_with = "AND"): + """ + Returns a SQL conditional that represents this filter. + """ + + # So that we always return something + if join_with == "AND": + conditionals = ["True"] + elif join_with == "OR": + conditionals = ["False"] + else: + assert join_with in ("AND", "OR") + + # init + sorts = [] + clips = [] + + for field, value in self.iteritems(): + # handle negation, numeric comparisons + # simple, 1-depth only mechanism + + modifiers={'~' : False, + '<' : False, '>' : False, + '[' : False, ']' : False, + '-' : False, + } + + for char in modifiers.keys(): + if field[0] == char: + modifiers[char]=True; + field = field[1:] + break + + # filter on fields + if not modifiers['-']: + if field not in self.fields: + raise PLCInvalidArgument, "Invalid filter field '%s'" % field + + if isinstance(value, (list, tuple, set)): + # Turn empty list into (NULL) instead of invalid () + if not value: + value = [None] + + operator = "IN" + value = map(str, map(api.db.quote, value)) + value = "(%s)" % ", ".join(value) + else: + if value is None: + operator = "IS" + value = "NULL" + elif isinstance(value, StringTypes) and \ + (value.find("*") > -1 or value.find("%") > -1): + operator = "LIKE" + value = str(api.db.quote(value.replace("*", "%"))) + else: + operator = "=" + if modifiers['<']: + operator='<' + if modifiers['>']: + operator='>' + if modifiers['[']: + operator='<=' + if modifiers[']']: + operator='>=' + else: + value = str(api.db.quote(value)) + + clause = "%s %s %s" % (field, operator, value) + + if modifiers['~']: + clause = " ( NOT %s ) " % (clause) + + conditionals.append(clause) + # sorting and clipping + else: + if field not in ('SORT','OFFSET','LIMIT'): + raise PLCInvalidArgument, "Invalid filter, unknown sort and clip field %r"%field + # sorting + if field == 'SORT': + if not isinstance(value,(list,tuple,set)): + value=[value] + for field in value: + order = 'ASC' + if field[0] == '+': + field = field[1:] + elif field[0] == '-': + field = field[1:] + order = 'DESC' + if field not in self.fields: + raise PLCInvalidArgument, "Invalid field %r in SORT filter"%field + sorts.append("%s %s"%(field,order)) + # clipping + elif field == 'OFFSET': + clips.append("OFFSET %d"%value) + # clipping continued + elif field == 'LIMIT' : + clips.append("LIMIT %d"%value) + + where_part = (" %s " % join_with).join(conditionals) + clip_part = "" + if sorts: + clip_part += " ORDER BY " + ",".join(sorts) + if clips: + clip_part += " " + " ".join(clips) +# print 'where_part=',where_part,'clip_part',clip_part + return (where_part,clip_part) diff --git a/trunk/PLC/GPG.py b/trunk/PLC/GPG.py new file mode 100644 index 0000000..2499bab --- /dev/null +++ b/trunk/PLC/GPG.py @@ -0,0 +1,183 @@ +# +# Python "binding" for GPG. I'll write GPGME bindings eventually. The +# intent is to use GPG to sign method calls, as a way of identifying +# and authenticating peers. Calls should still go over an encrypted +# transport such as HTTPS, with certificate checking. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import os +import xmlrpclib +import shutil +from types import StringTypes +from StringIO import StringIO +from xml.dom import minidom +from xml.dom.ext import Canonicalize +from subprocess import Popen, PIPE, call +from tempfile import NamedTemporaryFile, mkdtemp + +from PLC.Faults import * + +def canonicalize(args, methodname = None, methodresponse = False): + """ + Returns a canonicalized XML-RPC representation of the specified + method call (methodname != None) or response (methodresponse = + True). + """ + + xml = xmlrpclib.dumps(args, methodname, methodresponse, encoding = 'utf-8', allow_none = 1) + dom = minidom.parseString(xml) + + # Canonicalize(), though it claims to, does not encode unicode + # nodes to UTF-8 properly and throws an exception unless you write + # the stream to a file object, so just encode it ourselves. + buf = StringIO() + Canonicalize(dom, output = buf) + xml = buf.getvalue().encode('utf-8') + + return xml + +def gpg_export(keyring, armor = True): + """ + Exports the specified public keyring file. + """ + + homedir = mkdtemp() + args = ["gpg", "--batch", "--no-tty", + "--homedir", homedir, + "--no-default-keyring", + "--keyring", keyring, + "--export"] + if armor: + args.append("--armor") + + p = Popen(args, stdin = PIPE, stdout = PIPE, stderr = PIPE, close_fds = True) + export = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + # Clean up + shutil.rmtree(homedir) + + if rc: + raise PLCAuthenticationFailure, "GPG export failed with return code %d: %s" % (rc, err) + + return export + +def gpg_sign(args, secret_keyring, keyring, methodname = None, methodresponse = False, detach_sign = True): + """ + Signs the specified method call (methodname != None) or response + (methodresponse == True) using the specified GPG keyring files. If + args is not a tuple representing the arguments to the method call + or the method response value, then it should be a string + representing a generic message to sign (detach_sign == True) or + sign/encrypt (detach_sign == False) specified). Returns the + detached signature (detach_sign == True) or signed/encrypted + message (detach_sign == False). + """ + + # Accept either an opaque string blob or a Python tuple + if isinstance(args, StringTypes): + message = args + elif isinstance(args, tuple): + message = canonicalize(args, methodname, methodresponse) + + # Use temporary trustdb + homedir = mkdtemp() + + cmd = ["gpg", "--batch", "--no-tty", + "--homedir", homedir, + "--no-default-keyring", + "--secret-keyring", secret_keyring, + "--keyring", keyring, + "--armor"] + + if detach_sign: + cmd.append("--detach-sign") + else: + cmd.append("--sign") + + p = Popen(cmd, stdin = PIPE, stdout = PIPE, stderr = PIPE) + p.stdin.write(message) + p.stdin.close() + signature = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + # Clean up + shutil.rmtree(homedir) + + if rc: + raise PLCAuthenticationFailure, "GPG signing failed with return code %d: %s" % (rc, err) + + return signature + +def gpg_verify(args, key, signature = None, methodname = None, methodresponse = False): + """ + Verifies the signature of the specified method call (methodname != + None) or response (methodresponse = True) using the specified + public key material. If args is not a tuple representing the + arguments to the method call or the method response value, then it + should be a string representing a generic message to verify (if + signature is specified) or verify/decrypt (if signature is not + specified). + """ + + # Accept either an opaque string blob or a Python tuple + if isinstance(args, StringTypes): + message = args + else: + message = canonicalize(args, methodname, methodresponse) + + # Write public key to temporary file + if os.path.exists(key): + keyfile = None + keyfilename = key + else: + keyfile = NamedTemporaryFile(suffix = '.pub') + keyfile.write(key) + keyfile.flush() + keyfilename = keyfile.name + + # Import public key into temporary keyring + homedir = mkdtemp() + call(["gpg", "--batch", "--no-tty", "--homedir", homedir, "--import", keyfilename], + stdin = PIPE, stdout = PIPE, stderr = PIPE) + + cmd = ["gpg", "--batch", "--no-tty", + "--homedir", homedir] + + if signature is not None: + # Write detached signature to temporary file + sigfile = NamedTemporaryFile() + sigfile.write(signature) + sigfile.flush() + cmd += ["--verify", sigfile.name, "-"] + else: + # Implicit signature + sigfile = None + cmd.append("--decrypt") + + p = Popen(cmd, stdin = PIPE, stdout = PIPE, stderr = PIPE) + p.stdin.write(message) + p.stdin.close() + if signature is None: + message = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + # Clean up + shutil.rmtree(homedir) + if sigfile: + sigfile.close() + if keyfile: + keyfile.close() + + if rc: + raise PLCAuthenticationFailure, "GPG verification failed with return code %d: %s" % (rc, err) + + return message diff --git a/trunk/PLC/InitScripts.py b/trunk/PLC/InitScripts.py new file mode 100644 index 0000000..9f864d2 --- /dev/null +++ b/trunk/PLC/InitScripts.py @@ -0,0 +1,66 @@ +# +# Functions for interacting with the initscripts table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# + +from types import StringTypes +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table + +class InitScript(Row): + """ + Representation of a row in the initscripts table. To use, + instantiate with a dict of values. + """ + + table_name = 'initscripts' + primary_key = 'initscript_id' + join_tables = [] + fields = { + 'initscript_id': Parameter(int, "Initscript identifier"), + 'name': Parameter(str, "Initscript name", max = 254), + 'enabled': Parameter(bool, "Initscript is active"), + 'script': Parameter(str, "Initscript"), + } + + def validate_name(self, name): + """ + validates the script name + """ + + conflicts = InitScripts(self.api, [name]) + for initscript in conflicts: + if 'initscript_id' not in self or self['initscript_id'] != initscript['initscript_id']: + raise PLCInvalidArgument, "Initscript name already in use" + + return name + + +class InitScripts(Table): + """ + Representation of the initscipts table in the database. + """ + + def __init__(self, api, initscript_filter = None, columns = None): + Table.__init__(self, api, InitScript, columns) + + sql = "SELECT %s FROM initscripts WHERE True" % \ + ", ".join(self.columns) + + if initscript_filter is not None: + if isinstance(initscript_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), initscript_filter) + strs = filter(lambda x: isinstance(x, StringTypes), initscript_filter) + initscript_filter = Filter(InitScript.fields, {'initscript_id': ints, 'name': strs }) + sql += " AND (%s) %s" % initscript_filter.sql(api, "OR") + elif isinstance(initscript_filter, dict): + initscript_filter = Filter(InitScript.fields, initscript_filter) + sql += " AND (%s) %s" % initscript_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/trunk/PLC/KeyTypes.py b/trunk/PLC/KeyTypes.py new file mode 100644 index 0000000..34df019 --- /dev/null +++ b/trunk/PLC/KeyTypes.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the key_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class KeyType(Row): + """ + Representation of a row in the key_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'key_types' + primary_key = 'key_type' + join_tables = ['keys'] + fields = { + 'key_type': Parameter(str, "Key type", max = 20), + } + + def validate_key_type(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Key type must be specified" + + # Make sure key type does not alredy exist + conflicts = KeyTypes(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Key type name already in use" + + return name + +class KeyTypes(Table): + """ + Representation of the key_types table in the database. + """ + + def __init__(self, api, key_types = None): + Table.__init__(self, api, KeyType) + + sql = "SELECT %s FROM key_types" % \ + ", ".join(KeyType.fields) + + if key_types: + sql += " WHERE key_type IN (%s)" % ", ".join(map(api.db.quote, key_types)) + + self.selectall(sql) diff --git a/trunk/PLC/Keys.py b/trunk/PLC/Keys.py new file mode 100644 index 0000000..8d22dc2 --- /dev/null +++ b/trunk/PLC/Keys.py @@ -0,0 +1,122 @@ +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.KeyTypes import KeyType, KeyTypes + +class Key(Row): + """ + Representation of a row in the keys table. To use, instantiate with a + dict of values. Update as you would a dict. Commit to the database + with sync(). + """ + + table_name = 'keys' + primary_key = 'key_id' + join_tables = ['person_key', 'peer_key'] + fields = { + 'key_id': Parameter(int, "Key identifier"), + 'key_type': Parameter(str, "Key type"), + 'key': Parameter(str, "Key value", max = 4096), + 'person_id': Parameter(int, "User to which this key belongs", nullok = True), + 'peer_id': Parameter(int, "Peer to which this key belongs", nullok = True), + 'peer_key_id': Parameter(int, "Foreign key identifier at peer", nullok = True), + } + + # for Cache + class_key= 'key' + foreign_fields = ['key_type'] + foreign_xrefs = [] + + def validate_key_type(self, key_type): + key_types = [row['key_type'] for row in KeyTypes(self.api)] + if key_type not in key_types: + raise PLCInvalidArgument, "Invalid key type" + return key_type + + def validate_key(self, key): + # Key must not be blacklisted + rows = self.api.db.selectall("SELECT 1 from keys" \ + " WHERE key = %(key)s" \ + " AND is_blacklisted IS True", + locals()) + if rows: + raise PLCInvalidArgument, "Key is blacklisted and cannot be used" + + return key + + def validate(self): + # Basic validation + Row.validate(self) + + assert 'key' in self + key = self['key'] + + if self['key_type'] == 'ssh': + # Accept only SSH version 2 keys without options. From + # sshd(8): + # + # Each protocol version 2 public key consists of: options, + # keytype, base64 encoded key, comment. The options field + # is optional...The comment field is not used for anything + # (but may be convenient for the user to identify the + # key). For protocol version 2 the keytype is ``ssh-dss'' + # or ``ssh-rsa''. + + good_ssh_key = r'^.*(?:ssh-dss|ssh-rsa)[ ]+[A-Za-z0-9+/=]+(?: .*)?$' + if not re.match(good_ssh_key, key, re.IGNORECASE): + raise PLCInvalidArgument, "Invalid SSH version 2 public key" + + def blacklist(self, commit = True): + """ + Permanently blacklist key (and all other identical keys), + preventing it from ever being added again. Because this could + affect multiple keys associated with multiple accounts, it + should be admin only. + """ + + assert 'key_id' in self + assert 'key' in self + + # Get all matching keys + rows = self.api.db.selectall("SELECT key_id FROM keys WHERE key = %(key)s", + self) + key_ids = [row['key_id'] for row in rows] + assert key_ids + assert self['key_id'] in key_ids + + # Keep the keys in the table + self.api.db.do("UPDATE keys SET is_blacklisted = True" \ + " WHERE key_id IN (%s)" % ", ".join(map(str, key_ids))) + + # But disassociate them from all join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE key_id IN (%s)" % \ + (table, ", ".join(map(str, key_ids)))) + + if commit: + self.api.db.commit() + +class Keys(Table): + """ + Representation of row(s) from the keys table in the + database. + """ + + def __init__(self, api, key_filter = None, columns = None): + Table.__init__(self, api, Key, columns) + + sql = "SELECT %s FROM view_keys WHERE is_blacklisted IS False" % \ + ", ".join(self.columns) + + if key_filter is not None: + if isinstance(key_filter, (list, tuple, set)): + key_filter = Filter(Key.fields, {'key_id': key_filter}) + elif isinstance(key_filter, dict): + key_filter = Filter(Key.fields, key_filter) + sql += " AND (%s) %s" % key_filter.sql(api) + + self.selectall(sql) diff --git a/trunk/PLC/Messages.py b/trunk/PLC/Messages.py new file mode 100644 index 0000000..3ec310f --- /dev/null +++ b/trunk/PLC/Messages.py @@ -0,0 +1,50 @@ +# +# Functions for interacting with the messages table in the database +# +# Tony Mack +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter + +class Message(Row): + """ + Representation of a row in the messages table. + """ + + table_name = 'messages' + primary_key = 'message_id' + fields = { + 'message_id': Parameter(str, "Message identifier"), + 'subject': Parameter(str, "Message summary", nullok = True), + 'template': Parameter(str, "Message template", nullok = True), + 'enabled': Parameter(bool, "Message is enabled"), + } + +class Messages(Table): + """ + Representation of row(s) from the messages table in the database. + """ + + def __init__(self, api, message_filter = None, columns = None, enabled = None): + Table.__init__(self, api, Message, columns) + + sql = "SELECT %s from messages WHERE True" % \ + ", ".join(self.columns) + + if enabled is not None: + sql += " AND enabled IS %s" % enabled + + if message_filter is not None: + if isinstance(message_filter, (list, tuple, set)): + message_filter = Filter(Message.fields, {'message_id': message_filter}) + sql += " AND (%s) %s" % message_filter.sql(api, "OR") + elif isinstance(message_filter, dict): + message_filter = Filter(Message.fields, message_filter) + sql += " AND (%s) %s" % message_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/trunk/PLC/Method.py b/trunk/PLC/Method.py new file mode 100644 index 0000000..74dc862 --- /dev/null +++ b/trunk/PLC/Method.py @@ -0,0 +1,372 @@ +# +# Base class for all PLCAPI functions +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import xmlrpclib +from types import * +import textwrap +import os +import time +import pprint + +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed, python_type, xmlrpc_type +from PLC.Auth import Auth +from PLC.Debug import profile, log +from PLC.Events import Event, Events +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons + +class Method: + """ + Base class for all PLCAPI functions. At a minimum, all PLCAPI + functions must define: + + roles = [list of roles] + accepts = [Parameter(arg1_type, arg1_doc), Parameter(arg2_type, arg2_doc), ...] + returns = Parameter(return_type, return_doc) + call(arg1, arg2, ...): method body + + Argument types may be Python types (e.g., int, bool, etc.), typed + values (e.g., 1, True, etc.), a Parameter, or lists or + dictionaries of possibly mixed types, values, and/or Parameters + (e.g., [int, bool, ...] or {'arg1': int, 'arg2': bool}). + + Once function decorators in Python 2.4 are fully supported, + consider wrapping calls with accepts() and returns() functions + instead of performing type checking manually. + """ + + # Defaults. Could implement authentication and type checking with + # decorators, but they are not supported in Python 2.3 and it + # would be hard to generate documentation without writing a code + # parser. + + roles = [] + accepts = [] + returns = bool + status = "current" + + def call(self, *args): + """ + Method body for all PLCAPI functions. Must override. + """ + + return True + + def __init__(self, api): + self.name = self.__class__.__name__ + self.api = api + + # Auth may set this to a Person instance (if an anonymous + # method, will remain None). + self.caller = None + + # API may set this to a (addr, port) tuple if known + self.source = None + + def __call__(self, *args, **kwds): + """ + Main entry point for all PLCAPI functions. Type checks + arguments, authenticates, and executes call(). + """ + + try: + start = time.time() + (min_args, max_args, defaults) = self.args() + + # Check that the right number of arguments were passed in + if len(args) < len(min_args) or len(args) > len(max_args): + raise PLCInvalidArgumentCount(len(args), len(min_args), len(max_args)) + + for name, value, expected in zip(max_args, args, self.accepts): + self.type_check(name, value, expected, args) + + result = self.call(*args, **kwds) + runtime = time.time() - start + + if self.api.config.PLC_API_DEBUG or hasattr(self, 'message'): + self.log(None, runtime, *args) + + return result + + except PLCFault, fault: + + caller = "" + if isinstance(self.caller, Person): + caller = 'person_id %s' % self.caller['person_id'] + elif isinstance(self.caller, Node): + caller = 'node_id %s' % self.caller['node_id'] + + # Prepend caller and method name to expected faults + fault.faultString = caller + ": " + self.name + ": " + fault.faultString + runtime = time.time() - start + self.log(fault, runtime, *args) + raise fault + + def log(self, fault, runtime, *args): + """ + Log the transaction + """ + + # Do not log system or Get calls + #if self.name.startswith('system') or self.name.startswith('Get'): + # return False + + # Create a new event + event = Event(self.api) + event['fault_code'] = 0 + if fault: + event['fault_code'] = fault.faultCode + event['runtime'] = runtime + + # Redact passwords and sessions + if args and isinstance(args[0], dict): + # what type of auth this is + if args[0].has_key('AuthMethod'): + auth_methods = ['session', 'password', 'capability', 'gpg', 'hmac','anonymous'] + auth_method = args[0]['AuthMethod'] + if auth_method in auth_methods: + event['auth_type'] = auth_method + for password in 'AuthString', 'session': + if args[0].has_key(password): + auth = args[0].copy() + auth[password] = "Removed by API" + args = (auth,) + args[1:] + + # Log call representation + # XXX Truncate to avoid DoS + event['call'] = self.name + pprint.saferepr(args) + event['call_name'] = self.name + + # Both users and nodes can call some methods + if isinstance(self.caller, Person): + event['person_id'] = self.caller['person_id'] + elif isinstance(self.caller, Node): + event['node_id'] = self.caller['node_id'] + + event.sync(commit = False) + + if hasattr(self, 'event_objects') and isinstance(self.event_objects, dict): + for key in self.event_objects.keys(): + for object_id in self.event_objects[key]: + event.add_object(key, object_id, commit = False) + + + # Set the message for this event + if fault: + event['message'] = fault.faultString + elif hasattr(self, 'message'): + event['message'] = self.message + + # Commit + event.sync() + + def help(self, indent = " "): + """ + Text documentation for the method. + """ + + (min_args, max_args, defaults) = self.args() + + text = "%s(%s) -> %s\n\n" % (self.name, ", ".join(max_args), xmlrpc_type(self.returns)) + + text += "Description:\n\n" + lines = [indent + line.strip() for line in self.__doc__.strip().split("\n")] + text += "\n".join(lines) + "\n\n" + + text += "Allowed Roles:\n\n" + if not self.roles: + roles = ["any"] + else: + roles = self.roles + text += indent + ", ".join(roles) + "\n\n" + + def param_text(name, param, indent, step): + """ + Format a method parameter. + """ + + text = indent + + # Print parameter name + if name: + param_offset = 32 + text += name.ljust(param_offset - len(indent)) + else: + param_offset = len(indent) + + # Print parameter type + param_type = python_type(param) + text += xmlrpc_type(param_type) + "\n" + + # Print parameter documentation right below type + if isinstance(param, Parameter): + wrapper = textwrap.TextWrapper(width = 70, + initial_indent = " " * param_offset, + subsequent_indent = " " * param_offset) + text += "\n".join(wrapper.wrap(param.doc)) + "\n" + param = param.type + + text += "\n" + + # Indent struct fields and mixed types + if isinstance(param, dict): + for name, subparam in param.iteritems(): + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, Mixed): + for subparam in param: + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, (list, tuple, set)): + for subparam in param: + text += param_text("", subparam, indent + step, step) + + return text + + text += "Parameters:\n\n" + for name, param in zip(max_args, self.accepts): + text += param_text(name, param, indent, indent) + + text += "Returns:\n\n" + text += param_text("", self.returns, indent, indent) + + return text + + def args(self): + """ + Returns a tuple: + + ((arg1_name, arg2_name, ...), + (arg1_name, arg2_name, ..., optional1_name, optional2_name, ...), + (None, None, ..., optional1_default, optional2_default, ...)) + + That represents the minimum and maximum sets of arguments that + this function accepts and the defaults for the optional arguments. + """ + + # Inspect call. Remove self from the argument list. + max_args = self.call.func_code.co_varnames[1:self.call.func_code.co_argcount] + defaults = self.call.func_defaults + if defaults is None: + defaults = () + + min_args = max_args[0:len(max_args) - len(defaults)] + defaults = tuple([None for arg in min_args]) + defaults + + return (min_args, max_args, defaults) + + def type_check(self, name, value, expected, args): + """ + Checks the type of the named value against the expected type, + which may be a Python type, a typed value, a Parameter, a + Mixed type, or a list or dictionary of possibly mixed types, + values, Parameters, or Mixed types. + + Extraneous members of lists must be of the same type as the + last specified type. For example, if the expected argument + type is [int, bool], then [1, False] and [14, True, False, + True] are valid, but [1], [False, 1] and [14, True, 1] are + not. + + Extraneous members of dictionaries are ignored. + """ + + # If any of a number of types is acceptable + if isinstance(expected, Mixed): + for item in expected: + try: + self.type_check(name, value, item, args) + return + except PLCInvalidArgument, fault: + pass + raise fault + + # If an authentication structure is expected, save it and + # authenticate after basic type checking is done. + if isinstance(expected, Auth): + auth = expected + else: + auth = None + + # Get actual expected type from within the Parameter structure + if isinstance(expected, Parameter): + min = expected.min + max = expected.max + nullok = expected.nullok + expected = expected.type + else: + min = None + max = None + nullok = False + + expected_type = python_type(expected) + + # If value can be NULL + if value is None and nullok: + return + + # Strings are a special case. Accept either unicode or str + # types if a string is expected. + if expected_type in StringTypes and isinstance(value, StringTypes): + pass + + # Integers and long integers are also special types. Accept + # either int or long types if an int or long is expected. + elif expected_type in (IntType, LongType) and isinstance(value, (IntType, LongType)): + pass + + elif not isinstance(value, expected_type): + raise PLCInvalidArgument("expected %s, got %s" % \ + (xmlrpc_type(expected_type), + xmlrpc_type(type(value))), + name) + + # If a minimum or maximum (length, value) has been specified + if expected_type in StringTypes: + if min is not None and \ + len(value.encode(self.api.encoding)) < min: + raise PLCInvalidArgument, "%s must be at least %d bytes long" % (name, min) + if max is not None and \ + len(value.encode(self.api.encoding)) > max: + raise PLCInvalidArgument, "%s must be at most %d bytes long" % (name, max) + elif expected_type in (list, tuple, set): + if min is not None and len(value) < min: + raise PLCInvalidArgument, "%s must contain at least %d items" % (name, min) + if max is not None and len(value) > max: + raise PLCInvalidArgument, "%s must contain at most %d items" % (name, max) + else: + if min is not None and value < min: + raise PLCInvalidArgument, "%s must be > %s" % (name, str(min)) + if max is not None and value > max: + raise PLCInvalidArgument, "%s must be < %s" % (name, str(max)) + + # If a list with particular types of items is expected + if isinstance(expected, (list, tuple, set)): + for i in range(len(value)): + if i >= len(expected): + j = len(expected) - 1 + else: + j = i + self.type_check(name + "[]", value[i], expected[j], args) + + # If a struct with particular (or required) types of items is + # expected. + elif isinstance(expected, dict): + for key in value.keys(): + if key in expected: + self.type_check(name + "['%s']" % key, value[key], expected[key], args) + for key, subparam in expected.iteritems(): + if isinstance(subparam, Parameter) and \ + subparam.optional is not None and \ + not subparam.optional and key not in value.keys(): + raise PLCInvalidArgument("'%s' not specified" % key, name) + + if auth is not None: + auth.check(self, *args) diff --git a/trunk/PLC/Methods/.cvsignore b/trunk/PLC/Methods/.cvsignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/trunk/PLC/Methods/.cvsignore @@ -0,0 +1 @@ +*.pyc diff --git a/trunk/PLC/Methods/AddAddressType.py b/trunk/PLC/Methods/AddAddressType.py new file mode 100644 index 0000000..9fc771b --- /dev/null +++ b/trunk/PLC/Methods/AddAddressType.py @@ -0,0 +1,36 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in ['address_type_id'] + +class AddAddressType(Method): + """ + Adds a new address type. Fields specified in address_type_fields + are used. + + Returns the new address_type_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + address_type_fields = dict(filter(can_update, AddressType.fields.items())) + + accepts = [ + Auth(), + address_type_fields + ] + + returns = Parameter(int, 'New address_type_id (> 0) if successful') + + + def call(self, auth, address_type_fields): + address_type_fields = dict(filter(can_update, address_type_fields.items())) + address_type = AddressType(self.api, address_type_fields) + address_type.sync() + + self.event_objects = {'AddressType' : [address_type['address_type_id']]} + + return address_type['address_type_id'] diff --git a/trunk/PLC/Methods/AddAddressTypeToAddress.py b/trunk/PLC/Methods/AddAddressTypeToAddress.py new file mode 100644 index 0000000..d69e627 --- /dev/null +++ b/trunk/PLC/Methods/AddAddressTypeToAddress.py @@ -0,0 +1,47 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class AddAddressTypeToAddress(Method): + """ + Adds an address type to the specified address. + + PIs may only update addresses of their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']), + Address.fields['address_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_type_id_or_name, address_id): + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.add_address_type(address_type) + self.event_objects = {'Address': [address['address_id']]} + + return 1 diff --git a/trunk/PLC/Methods/AddBootState.py b/trunk/PLC/Methods/AddBootState.py new file mode 100644 index 0000000..fc75254 --- /dev/null +++ b/trunk/PLC/Methods/AddBootState.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.BootStates import BootState, BootStates +from PLC.Auth import Auth + +class AddBootState(Method): + """ + Adds a new node boot state. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + BootState.fields['boot_state'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + boot_state = BootState(self.api) + boot_state['boot_state'] = name + boot_state.sync(insert = True) + + return 1 diff --git a/trunk/PLC/Methods/AddConfFile.py b/trunk/PLC/Methods/AddConfFile.py new file mode 100644 index 0000000..5604cef --- /dev/null +++ b/trunk/PLC/Methods/AddConfFile.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['conf_file_id', 'node_ids', 'nodegroup_ids'] + +class AddConfFile(Method): + """ + Adds a new node configuration file. Any fields specified in + conf_file_fields are used, otherwise defaults are used. + + Returns the new conf_file_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + conf_file_fields = dict(filter(can_update, ConfFile.fields.items())) + + accepts = [ + Auth(), + conf_file_fields + ] + + returns = Parameter(int, 'New conf_file_id (> 0) if successful') + + + def call(self, auth, conf_file_fields): + conf_file_fields = dict(filter(can_update, conf_file_fields.items())) + conf_file = ConfFile(self.api, conf_file_fields) + conf_file.sync() + + self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} + + return conf_file['conf_file_id'] diff --git a/trunk/PLC/Methods/AddConfFileToNode.py b/trunk/PLC/Methods/AddConfFileToNode.py new file mode 100644 index 0000000..2d1542c --- /dev/null +++ b/trunk/PLC/Methods/AddConfFileToNode.py @@ -0,0 +1,51 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class AddConfFileToNode(Method): + """ + Adds a configuration file to the specified node. If the node is + already linked to the configuration file, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, conf_file_id, node_id_or_hostname): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Link configuration file to node + if node['node_id'] not in conf_file['node_ids']: + conf_file.add_node(node) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'Node': [node['node_id']] } + + return 1 diff --git a/trunk/PLC/Methods/AddConfFileToNodeGroup.py b/trunk/PLC/Methods/AddConfFileToNodeGroup.py new file mode 100644 index 0000000..6ff642c --- /dev/null +++ b/trunk/PLC/Methods/AddConfFileToNodeGroup.py @@ -0,0 +1,50 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +class AddConfFileToNodeGroup(Method): + """ + Adds a configuration file to the specified node group. If the node + group is already linked to the configuration file, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, conf_file_id, nodegroup_id_or_name): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get node + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such node group" + nodegroup = nodegroups[0] + + # Link configuration file to node + if nodegroup['nodegroup_id'] not in conf_file['nodegroup_ids']: + conf_file.add_nodegroup(nodegroup) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'NodeGroup': [nodegroup['nodegroup_id']] } + + return 1 diff --git a/trunk/PLC/Methods/AddInitScript.py b/trunk/PLC/Methods/AddInitScript.py new file mode 100644 index 0000000..8c247cb --- /dev/null +++ b/trunk/PLC/Methods/AddInitScript.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['initscript_id'] + +class AddInitScript(Method): + """ + Adds a new initscript. Any fields specified in initscript_fields + are used, otherwise defaults are used. + + Returns the new initscript_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + initscript_fields = dict(filter(can_update, InitScript.fields.items())) + + accepts = [ + Auth(), + initscript_fields + ] + + returns = Parameter(int, 'New initscript_id (> 0) if successful') + + + def call(self, auth, initscript_fields): + initscript_fields = dict(filter(can_update, initscript_fields.items())) + initscript = InitScript(self.api, initscript_fields) + initscript.sync() + + self.event_objects = {'InitScript': [initscript['initscript_id']]} + + return initscript['initscript_id'] diff --git a/trunk/PLC/Methods/AddKeyType.py b/trunk/PLC/Methods/AddKeyType.py new file mode 100644 index 0000000..b3690a8 --- /dev/null +++ b/trunk/PLC/Methods/AddKeyType.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import Auth + +class AddKeyType(Method): + """ + Adds a new key type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + KeyType.fields['key_type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + key_type = KeyType(self.api) + key_type['key_type'] = name + key_type.sync(insert = True) + + return 1 diff --git a/trunk/PLC/Methods/AddMessage.py b/trunk/PLC/Methods/AddMessage.py new file mode 100644 index 0000000..62a2da7 --- /dev/null +++ b/trunk/PLC/Methods/AddMessage.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +class AddMessage(Method): + """ + Adds a new message template. Any values specified in + message_fields are used, otherwise defaults are used. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Message.fields, + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, message_fields): + message = Message(self.api, message_fields) + message.sync(insert = True) + + return 1 diff --git a/trunk/PLC/Methods/AddNetworkMethod.py b/trunk/PLC/Methods/AddNetworkMethod.py new file mode 100644 index 0000000..11f3845 --- /dev/null +++ b/trunk/PLC/Methods/AddNetworkMethod.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import Auth + +class AddNetworkMethod(Method): + """ + Adds a new network method. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkMethod.fields['method'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_method = NetworkMethod(self.api) + network_method['method'] = name + network_method.sync(insert = True) + + return 1 diff --git a/trunk/PLC/Methods/AddNetworkType.py b/trunk/PLC/Methods/AddNetworkType.py new file mode 100644 index 0000000..6533053 --- /dev/null +++ b/trunk/PLC/Methods/AddNetworkType.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import Auth + +class AddNetworkType(Method): + """ + Adds a new network type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkType.fields['type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_type = NetworkType(self.api) + network_type['type'] = name + network_type.sync(insert = True) + + return 1 diff --git a/trunk/PLC/Methods/AddNode.py b/trunk/PLC/Methods/AddNode.py new file mode 100644 index 0000000..8d253df --- /dev/null +++ b/trunk/PLC/Methods/AddNode.py @@ -0,0 +1,66 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['hostname', 'boot_state', 'model', 'version'] + +class AddNode(Method): + """ + Adds a new node. Any values specified in node_fields are used, + otherwise defaults are used. + + PIs and techs may only add nodes to their own sites. Admins may + add nodes to any site. + + Returns the new node_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + node_fields = dict(filter(can_update, Node.fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + node_fields + ] + + returns = Parameter(int, 'New node_id (> 0) if successful') + + def call(self, auth, site_id_or_login_base, node_fields): + node_fields = dict(filter(can_update, node_fields.items())) + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site. + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + assert self.caller['person_id'] not in site['person_ids'] + raise PLCPermissionDenied, "Not allowed to add nodes to specified site" + else: + assert self.caller['person_id'] in site['person_ids'] + + node = Node(self.api, node_fields) + node['site_id'] = site['site_id'] + node.sync() + + self.event_objects = {'Site': [site['site_id']], + 'Node': [node['node_id']]} + self.message = "Node %s created" % node['node_id'] + + return node['node_id'] diff --git a/trunk/PLC/Methods/AddNodeGroup.py b/trunk/PLC/Methods/AddNodeGroup.py new file mode 100644 index 0000000..34f5f97 --- /dev/null +++ b/trunk/PLC/Methods/AddNodeGroup.py @@ -0,0 +1,39 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description'] + +class AddNodeGroup(Method): + """ + Adds a new node group. Any values specified in nodegroup_fields + are used, otherwise defaults are used. + + Returns the new nodegroup_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + nodegroup_fields = dict(filter(can_update, NodeGroup.fields.items())) + + accepts = [ + Auth(), + nodegroup_fields + ] + + returns = Parameter(int, 'New nodegroup_id (> 0) if successful') + + + def call(self, auth, nodegroup_fields): + nodegroup_fields = dict(filter(can_update, nodegroup_fields.items())) + nodegroup = NodeGroup(self.api, nodegroup_fields) + nodegroup.sync() + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']]} + self.message = 'Node group %d created' % nodegroup['nodegroup_id'] + + return nodegroup['nodegroup_id'] diff --git a/trunk/PLC/Methods/AddNodeNetwork.py b/trunk/PLC/Methods/AddNodeNetwork.py new file mode 100644 index 0000000..6e24bce --- /dev/null +++ b/trunk/PLC/Methods/AddNodeNetwork.py @@ -0,0 +1,73 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in ['nodenetwork_id', 'node_id'] + +class AddNodeNetwork(Method): + """ + + Adds a new network for a node. Any values specified in + nodenetwork_fields are used, otherwise defaults are + used. Acceptable values for method may be retrieved via + GetNetworkMethods. Acceptable values for type may be retrieved via + GetNetworkTypes. + + If type is static, ip, gateway, network, broadcast, netmask, and + dns1 must all be specified in nodenetwork_fields. If type is dhcp, + these parameters, even if specified, are ignored. + + PIs and techs may only add networks to their own nodes. Admins may + add networks to any node. + + Returns the new nodenetwork_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + nodenetwork_fields + ] + + returns = Parameter(int, 'New nodenetwork_id (> 0) if successful') + + + def call(self, auth, node_id_or_hostname, nodenetwork_fields): + nodenetwork_fields = dict(filter(can_update, nodenetwork_fields.items())) + + # Check if node exists + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site where the node exists. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to add node network for specified node" + + # Add node network + nodenetwork = NodeNetwork(self.api, nodenetwork_fields) + nodenetwork['node_id'] = node['node_id'] + # if this is the first node network, make it primary + if not node['nodenetwork_ids']: + nodenetwork['is_primary'] = True + nodenetwork.sync() + + # Logging variables + self.object_ids = [node['node_id'], nodenetwork['nodenetwork_id']] + self.messgage = "Node network %d added" % nodenetwork['nodenetwork_id'] + + return nodenetwork['nodenetwork_id'] diff --git a/trunk/PLC/Methods/AddNodeNetworkSetting.py b/trunk/PLC/Methods/AddNodeNetworkSetting.py new file mode 100644 index 0000000..b31aed2 --- /dev/null +++ b/trunk/PLC/Methods/AddNodeNetworkSetting.py @@ -0,0 +1,89 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +from PLC.Nodes import Nodes +from PLC.Sites import Sites + +class AddNodeNetworkSetting(Method): + """ + Sets the specified setting for the specified nodenetwork + to the specified value. + + In general only tech(s), PI(s) and of course admin(s) are allowed to + do the change, but this is defined in the nodenetwork setting type object. + + Returns the new nodenetwork_setting_id (> 0) if successful, faults + otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + # no other way to refer to a nodenetwork + NodeNetworkSetting.fields['nodenetwork_id'], + Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name']), + NodeNetworkSetting.fields['value'], + ] + + returns = Parameter(int, 'New nodenetwork_setting_id (> 0) if successful') + + object_type = 'NodeNetwork' + + + def call(self, auth, nodenetwork_id, nodenetwork_setting_type_id_or_name, value): + nodenetworks = NodeNetworks(self.api, [nodenetwork_id]) + if not nodenetworks: + raise PLCInvalidArgument, "No such nodenetwork %r"%nodenetwork_id + nodenetwork = nodenetworks[0] + + nodenetwork_setting_types = NodeNetworkSettingTypes(self.api, [nodenetwork_setting_type_id_or_name]) + if not nodenetwork_setting_types: + raise PLCInvalidArgument, "No such nodenetwork setting type %r"%nodenetwork_setting_type_id_or_name + nodenetwork_setting_type = nodenetwork_setting_types[0] + + # checks for existence - does not allow several different settings + conflicts = NodeNetworkSettings(self.api, + {'nodenetwork_id':nodenetwork['nodenetwork_id'], + 'nodenetwork_setting_type_id':nodenetwork_setting_type['nodenetwork_setting_type_id']}) + + if len(conflicts) : + raise PLCInvalidArgument, "Nodenetwork %d already has setting %d"%(nodenetwork['nodenetwork_id'], + nodenetwork_setting_type['nodenetwork_setting_type_id']) + + # check permission : it not admin, is the user affiliated with the right site + if 'admin' not in self.caller['roles']: + # locate node + node = Nodes (self.api,[nodenetwork['node_id']])[0] + # locate site + site = Sites (self.api, [node['site_id']])[0] + # check caller is affiliated with this site + if self.caller['person_id'] not in site['person_ids']: + raise PLCPermissionDenied, "Not a member of the hosting site %s"%site['abbreviated_site'] + + required_min_role = nodenetwork_setting_type ['min_role_id'] + if required_min_role is not None and \ + min(self.caller['role_ids']) > required_min_role: + raise PLCPermissionDenied, "Not allowed to modify the specified nodenetwork setting, requires role %d",required_min_role + + nodenetwork_setting = NodeNetworkSetting(self.api) + nodenetwork_setting['nodenetwork_id'] = nodenetwork['nodenetwork_id'] + nodenetwork_setting['nodenetwork_setting_type_id'] = nodenetwork_setting_type['nodenetwork_setting_type_id'] + nodenetwork_setting['value'] = value + + nodenetwork_setting.sync() + self.object_ids = [nodenetwork_setting['nodenetwork_setting_id']] + + return nodenetwork_setting['nodenetwork_setting_id'] diff --git a/trunk/PLC/Methods/AddNodeNetworkSettingType.py b/trunk/PLC/Methods/AddNodeNetworkSettingType.py new file mode 100644 index 0000000..35a3ca0 --- /dev/null +++ b/trunk/PLC/Methods/AddNodeNetworkSettingType.py @@ -0,0 +1,45 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# + + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'category', 'min_role_id'] + +class AddNodeNetworkSettingType(Method): + """ + Adds a new type of nodenetwork setting. + Any fields specified are used, otherwise defaults are used. + + Returns the new nodenetwork_setting_id (> 0) if successful, + faults otherwise. + """ + + roles = ['admin'] + + nodenetwork_setting_type_fields = dict(filter(can_update, NodeNetworkSettingType.fields.items())) + + accepts = [ + Auth(), + nodenetwork_setting_type_fields + ] + + returns = Parameter(int, 'New nodenetwork_setting_id (> 0) if successful') + + + def call(self, auth, nodenetwork_setting_type_fields): + nodenetwork_setting_type_fields = dict(filter(can_update, nodenetwork_setting_type_fields.items())) + nodenetwork_setting_type = NodeNetworkSettingType(self.api, nodenetwork_setting_type_fields) + nodenetwork_setting_type.sync() + + self.object_ids = [nodenetwork_setting_type['nodenetwork_setting_type_id']] + + return nodenetwork_setting_type['nodenetwork_setting_type_id'] diff --git a/trunk/PLC/Methods/AddNodeToNodeGroup.py b/trunk/PLC/Methods/AddNodeToNodeGroup.py new file mode 100644 index 0000000..a552b11 --- /dev/null +++ b/trunk/PLC/Methods/AddNodeToNodeGroup.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class AddNodeToNodeGroup(Method): + """ + Add a node to the specified node group. If the node is + already a member of the nodegroup, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, node_id_or_hostname, nodegroup_id_or_name): + # Get node info + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Get nodegroup info + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + + nodegroup = nodegroups[0] + + # add node to nodegroup + if node['node_id'] not in nodegroup['node_ids']: + nodegroup.add_node(node) + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']], + 'Node': [node['node_id']]} + self.message = 'Node %d added to node group %d' % \ + (node['node_id'], nodegroup['nodegroup_id']) + return 1 diff --git a/trunk/PLC/Methods/AddNodeToPCU.py b/trunk/PLC/Methods/AddNodeToPCU.py new file mode 100644 index 0000000..c0d5eff --- /dev/null +++ b/trunk/PLC/Methods/AddNodeToPCU.py @@ -0,0 +1,74 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AddNodeToPCU(Method): + """ + Adds a node to a port on a PCU. Faults if the node has already + been added to the PCU or if the port is already in use. + + Non-admins may only update PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + PCU.fields['pcu_id'], + Parameter(int, 'PCU port number') + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname, pcu_id, port): + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Get PCU + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + ok = False + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + if pcu['pcu_id'] in site['pcu_ids']: + ok = True + break + if not ok: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + # Add node to PCU + if node['node_id'] in pcu['node_ids']: + raise PLCInvalidArgument, "Node already controlled by PCU" + + if node['site_id'] != pcu['site_id']: + raise PLCInvalidArgument, "Node is at a different site than this PCU" + + if port in pcu['ports']: + raise PLCInvalidArgument, "PCU port already in use" + + pcu.add_node(node, port) + + # Logging variables + self.event_objects = {'Node': [node['node_id']], + 'PCU': [pcu['pcu_id']]} + self.message = 'Node %d added to pcu %d on port %d' % \ + (node['node_id'], pcu['pcu_id'], port) + return 1 diff --git a/trunk/PLC/Methods/AddPCU.py b/trunk/PLC/Methods/AddPCU.py new file mode 100644 index 0000000..3c46194 --- /dev/null +++ b/trunk/PLC/Methods/AddPCU.py @@ -0,0 +1,61 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +can_update = lambda (field, value): field in \ + ['ip', 'hostname', 'protocol', + 'username', 'password', + 'model', 'notes'] + +class AddPCU(Method): + """ + Adds a new power control unit (PCU) to the specified site. Any + fields specified in pcu_fields are used, otherwise defaults are + used. + + PIs and technical contacts may only add PCUs to their own sites. + + Returns the new pcu_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + pcu_fields = dict(filter(can_update, PCU.fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + pcu_fields + ] + + returns = Parameter(int, 'New pcu_id (> 0) if successful') + + + def call(self, auth, site_id_or_login_base, pcu_fields): + pcu_fields = dict(filter(can_update, pcu_fields.items())) + + # Get associated site details + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to add a PCU to that site" + + pcu = PCU(self.api, pcu_fields) + pcu['site_id'] = site['site_id'] + pcu.sync() + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'PCU': [pcu['pcu_id']]} + self.message = 'PCU %d added site %s' % \ + (pcu['pcu_id'], site['site_id']) + + return pcu['pcu_id'] diff --git a/trunk/PLC/Methods/AddPCUProtocolType.py b/trunk/PLC/Methods/AddPCUProtocolType.py new file mode 100644 index 0000000..76dad3b --- /dev/null +++ b/trunk/PLC/Methods/AddPCUProtocolType.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['pcu_type_id', 'port', 'protocol', 'supported'] + +class AddPCUProtocolType(Method): + """ + Adds a new pcu protocol type. + + Returns the new pcu_protocol_type_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + protocol_type_fields = dict(filter(can_update, PCUProtocolType.fields.items())) + + accepts = [ + Auth(), + Mixed(PCUType.fields['pcu_type_id'], + PCUType.fields['model']), + protocol_type_fields + ] + + returns = Parameter(int, 'New pcu_protocol_type_id (> 0) if successful') + + def call(self, auth, pcu_type_id_or_model, protocol_type_fields): + + # Check if pcu type exists + pcu_types = PCUTypes(self.api, [pcu_type_id_or_model]) + if not pcu_types: + raise PLCInvalidArgument, "No such pcu type" + pcu_type = pcu_types[0] + + + # Check if this port is already used + if 'port' not in protocol_type_fields: + raise PLCInvalidArgument, "Must specify a port" + else: + protocol_types = PCUProtocolTypes(self.api, {'pcu_type_id': pcu_type['pcu_type_id']}) + for protocol_type in protocol_types: + if protocol_type['port'] == protocol_type_fields['port']: + raise PLCInvalidArgument, "Port alreay in use" + + protocol_type_fields = dict(filter(can_update, protocol_type_fields.items())) + protocol_type = PCUProtocolType(self.api, protocol_type_fields) + protocol_type['pcu_type_id'] = pcu_type['pcu_type_id'] + protocol_type.sync() + self.event_object = {'PCUProtocolType': [protocol_type['pcu_protocol_type_id']]} + + return protocol_type['pcu_protocol_type_id'] diff --git a/trunk/PLC/Methods/AddPCUType.py b/trunk/PLC/Methods/AddPCUType.py new file mode 100644 index 0000000..106791a --- /dev/null +++ b/trunk/PLC/Methods/AddPCUType.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['model', 'name'] + +class AddPCUType(Method): + """ + Adds a new pcu type. + + Returns the new pcu_type_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + pcu_type_fields = dict(filter(can_update, PCUType.fields.items())) + + accepts = [ + Auth(), + pcu_type_fields + ] + + returns = Parameter(int, 'New pcu_type_id (> 0) if successful') + + + def call(self, auth, pcu_type_fields): + pcu_type_fields = dict(filter(can_update, pcu_type_fields.items())) + pcu_type = PCUType(self.api, pcu_type_fields) + pcu_type.sync() + self.event_object = {'PCUType': [pcu_type['pcu_type_id']]} + + return pcu_type['pcu_type_id'] diff --git a/trunk/PLC/Methods/AddPeer.py b/trunk/PLC/Methods/AddPeer.py new file mode 100644 index 0000000..d6dc576 --- /dev/null +++ b/trunk/PLC/Methods/AddPeer.py @@ -0,0 +1,36 @@ +# +# Thierry Parmentelat - INRIA +# + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Peers import Peer, Peers + +can_update = lambda (field, value): field in \ + ['peername', 'peer_url', 'key', 'cacert'] + +class AddPeer(Method): + """ + Adds a new peer. + + Returns the new peer_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + peer_fields = dict(filter(can_update, Peer.fields.items())) + + accepts = [ + Auth(), + peer_fields + ] + + returns = Parameter(int, "New peer_id (> 0) if successful") + + def call(self, auth, peer_fields): + peer = Peer(self.api, peer_fields); + peer.sync() + self.event_objects = {'Peer': [peer['peer_id']]} + + return peer['peer_id'] diff --git a/trunk/PLC/Methods/AddPerson.py b/trunk/PLC/Methods/AddPerson.py new file mode 100644 index 0000000..cb0aa71 --- /dev/null +++ b/trunk/PLC/Methods/AddPerson.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['first_name', 'last_name', 'title', + 'email', 'password', 'phone', 'url', 'bio'] + +class AddPerson(Method): + """ + Adds a new account. Any fields specified in person_fields are + used, otherwise defaults are used. + + Accounts are disabled by default. To enable an account, use + UpdatePerson(). + + Returns the new person_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + person_fields = dict(filter(can_update, Person.fields.items())) + + accepts = [ + Auth(), + person_fields + ] + + returns = Parameter(int, 'New person_id (> 0) if successful') + + def call(self, auth, person_fields): + person_fields = dict(filter(can_update, person_fields.items())) + person_fields['enabled'] = False + person = Person(self.api, person_fields) + person.sync() + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = 'Person %d added' % person['person_id'] + + return person['person_id'] diff --git a/trunk/PLC/Methods/AddPersonKey.py b/trunk/PLC/Methods/AddPersonKey.py new file mode 100644 index 0000000..aa4ed00 --- /dev/null +++ b/trunk/PLC/Methods/AddPersonKey.py @@ -0,0 +1,59 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +can_update = lambda (field, value): field in ['key_type','key'] + +class AddPersonKey(Method): + """ + Adds a new key to the specified account. + + Non-admins can only modify their own keys. + + Returns the new key_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + key_fields = dict(filter(can_update, Key.fields.items())) + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + key_fields + ] + + returns = Parameter(int, 'New key_id (> 0) if successful') + + def call(self, auth, person_id_or_email, key_fields): + key_fields = dict(filter(can_update, key_fields.items())) + + # Get account details + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # If we are not admin, make sure caller is adding a key to their account + if 'admin' not in self.caller['roles']: + if person['person_id'] != self.caller['person_id']: + raise PLCPermissionDenied, "You may only modify your own keys" + + key = Key(self.api, key_fields) + key.sync(commit = False) + person.add_key(key, commit = True) + + # Logging variables + self.event_objects = {'Person': [person['person_id']], + 'Key': [key['key_id']]} + self.message = 'Key %d added to person %d' % \ + (key['key_id'], person['person_id']) + + return key['key_id'] diff --git a/trunk/PLC/Methods/AddPersonToSite.py b/trunk/PLC/Methods/AddPersonToSite.py new file mode 100644 index 0000000..7d5ac10 --- /dev/null +++ b/trunk/PLC/Methods/AddPersonToSite.py @@ -0,0 +1,56 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AddPersonToSite(Method): + """ + Adds the specified person to the specified site. If the person is + already a member of the site, no errors are returned. Does not + change the person's primary site. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, site_id_or_login_base): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + if site['site_id'] not in person['site_ids']: + site.add_person(person) + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'Person': [person['person_id']]} + self.message = 'Person %d added to site %d' % \ + (person['person_id'], site['site_id']) + return 1 diff --git a/trunk/PLC/Methods/AddPersonToSlice.py b/trunk/PLC/Methods/AddPersonToSlice.py new file mode 100644 index 0000000..e3392eb --- /dev/null +++ b/trunk/PLC/Methods/AddPersonToSlice.py @@ -0,0 +1,61 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class AddPersonToSlice(Method): + """ + Adds the specified person to the specified slice. If the person is + already a member of the slice, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, slice_id_or_name): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # N.B. Allow foreign users to be added to local slices and + # local users to be added to foreign slices (and, of course, + # local users to be added to local slices). + if person['peer_id'] is not None and slice['peer_id'] is not None: + raise PLCInvalidArgument, "Cannot add foreign users to foreign slices" + + # If we are not admin, make sure the caller is a PI + # of the site associated with the slice + if 'admin' not in self.caller['roles']: + if slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to add users to this slice" + + if slice['slice_id'] not in person['slice_ids']: + slice.add_person(person) + + # Logging variables + self.event_objects = {'Person': [person['person_id']], + 'Slice': [slice['slice_id']]} + self.object_ids = [slice['slice_id']] + + return 1 diff --git a/trunk/PLC/Methods/AddRole.py b/trunk/PLC/Methods/AddRole.py new file mode 100644 index 0000000..7266180 --- /dev/null +++ b/trunk/PLC/Methods/AddRole.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Roles import Role, Roles +from PLC.Auth import Auth + +class AddRole(Method): + """ + Adds a new role. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Role.fields['role_id'], + Role.fields['name'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, role_id, name): + role = Role(self.api) + role['role_id'] = role_id + role['name'] = name + role.sync(insert = True) + self.event_objects = {'Role': [role['role_id']]} + + return 1 diff --git a/trunk/PLC/Methods/AddRoleToPerson.py b/trunk/PLC/Methods/AddRoleToPerson.py new file mode 100644 index 0000000..5a8e241 --- /dev/null +++ b/trunk/PLC/Methods/AddRoleToPerson.py @@ -0,0 +1,66 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Roles import Role, Roles + +class AddRoleToPerson(Method): + """ + Grants the specified role to the person. + + PIs can only grant the tech and user roles to users and techs at + their sites. Admins can grant any role to any user. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Role.fields['role_id'], + Role.fields['name']), + Mixed(Person.fields['person_id'], + Person.fields['email']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, role_id_or_name, person_id_or_email): + # Get role + roles = Roles(self.api, [role_id_or_name]) + if not roles: + raise PLCInvalidArgument, "Invalid role '%s'" % unicode(role_id_or_name) + role = roles[0] + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Can only grant lesser (higher) roles to others + if 'admin' not in self.caller['roles'] and \ + role['role_id'] <= min(self.caller['role_ids']): + raise PLCInvalidArgument, "Not allowed to grant that role" + + if role['role_id'] not in person['role_ids']: + person.add_role(role) + + self.event_objects = {'Person': [person['person_id']], + 'Role': [role['role_id']]} + self.message = "Role %d granted to person %d" % \ + (role['role_id'], person['person_id']) + + return 1 diff --git a/trunk/PLC/Methods/AddSession.py b/trunk/PLC/Methods/AddSession.py new file mode 100644 index 0000000..6f5bc88 --- /dev/null +++ b/trunk/PLC/Methods/AddSession.py @@ -0,0 +1,37 @@ +import time + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Sessions import Session, Sessions +from PLC.Persons import Person, Persons + +class AddSession(Method): + """ + Creates and returns a new session key for the specified user. + (Used for website 'user sudo') + """ + + roles = ['admin'] + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + returns = Session.fields['session_id'] + + + def call(self, auth, person_id_or_email): + + persons = Persons(self.api, [person_id_or_email], ['person_id', 'email']) + + if not persons: + raise PLCInvalidArgument, "No such person" + + person = persons[0] + session = Session(self.api) + session['expires'] = int(time.time()) + (24 * 60 * 60) + session.sync(commit = False) + session.add_person(person, commit = True) + + return session['session_id'] diff --git a/trunk/PLC/Methods/AddSite.py b/trunk/PLC/Methods/AddSite.py new file mode 100644 index 0000000..475c8b1 --- /dev/null +++ b/trunk/PLC/Methods/AddSite.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'abbreviated_name', 'login_base', + 'is_public', 'latitude', 'longitude', 'url', + 'max_slices', 'max_slivers', 'enabled'] + +class AddSite(Method): + """ + Adds a new site, and creates a node group for that site. Any + fields specified in site_fields are used, otherwise defaults are + used. + + Returns the new site_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + site_fields = dict(filter(can_update, Site.fields.items())) + + accepts = [ + Auth(), + site_fields + ] + + returns = Parameter(int, 'New site_id (> 0) if successful') + + def call(self, auth, site_fields): + site_fields = dict(filter(can_update, site_fields.items())) + site = Site(self.api, site_fields) + site.sync() + + # Logging variables + self.event_objects = {'Site': [site['site_id']]} + self.message = 'Site %d created' % site['site_id'] + + return site['site_id'] diff --git a/trunk/PLC/Methods/AddSiteAddress.py b/trunk/PLC/Methods/AddSiteAddress.py new file mode 100644 index 0000000..a3a4eff --- /dev/null +++ b/trunk/PLC/Methods/AddSiteAddress.py @@ -0,0 +1,58 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +can_update = lambda (field, value): field in \ + ['line1', 'line2', 'line3', + 'city', 'state', 'postalcode', 'country'] + +class AddSiteAddress(Method): + """ + Adds a new address to a site. Fields specified in + address_fields are used; some are not optional. + + PIs may only add addresses to their own sites. + + Returns the new address_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + address_fields = dict(filter(can_update, Address.fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + address_fields + ] + + returns = Parameter(int, 'New address_id (> 0) if successful') + + def call(self, auth, site_id_or_login_base, address_fields): + address_fields = dict(filter(can_update, address_fields.items())) + + # Get associated site details + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address = Address(self.api, address_fields) + address.sync(commit = False) + site.add_address(address, commit = True) + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'Address': [address['address_id']]} + self.message = 'Address %d assigned to Site %d' % \ + (address['address_id'], site['site_id']) + + return address['address_id'] diff --git a/trunk/PLC/Methods/AddSlice.py b/trunk/PLC/Methods/AddSlice.py new file mode 100644 index 0000000..6cc056c --- /dev/null +++ b/trunk/PLC/Methods/AddSlice.py @@ -0,0 +1,80 @@ +import re + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +can_update = lambda (field, value): field in \ + ['name', 'instantiation', 'url', 'description', 'max_nodes'] + +class AddSlice(Method): + """ + Adds a new slice. Any fields specified in slice_fields are used, + otherwise defaults are used. + + Valid slice names are lowercase and begin with the login_base + (slice prefix) of a valid site, followed by a single + underscore. Thereafter, only letters, numbers, or additional + underscores may be used. + + PIs may only add slices associated with their own sites (i.e., + slice prefixes must always be the login_base of one of their + sites). + + Returns the new slice_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + slice_fields = dict(filter(can_update, Slice.fields.items())) + + accepts = [ + Auth(), + slice_fields + ] + + returns = Parameter(int, 'New slice_id (> 0) if successful') + + def call(self, auth, slice_fields): + slice_fields = dict(filter(can_update, slice_fields.items())) + + # 1. Lowercase. + # 2. Begins with login_base (letters or numbers). + # 3. Then single underscore after login_base. + # 4. Then letters, numbers, or underscores. + name = slice_fields['name'] + good_name = r'^[a-z0-9]+_[a-zA-Z0-9_]+$' + if not name or \ + not re.match(good_name, name): + raise PLCInvalidArgument, "Invalid slice name" + + # Get associated site details + login_base = name.split("_")[0] + sites = Sites(self.api, [login_base]) + if not sites: + raise PLCInvalidArgument, "Invalid slice prefix %s in %s"%(login_base,name) + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Slice prefix %s must be the same as the login_base of one of your sites"%login_base + + if len(site['slice_ids']) >= site['max_slices']: + raise PLCInvalidArgument, "Site %s has reached (%d) its maximum allowable slice count (%d)"%(site['name'], + len(site['slice_ids']), + site['max_slices']) + + if not site['enabled']: + raise PLCInvalidArgument, "Site %s is disabled can cannot create slices" % (site['name']) + + slice = Slice(self.api, slice_fields) + slice['creator_person_id'] = self.caller['person_id'] + slice['site_id'] = site['site_id'] + slice.sync() + + self.event_objects = {'Slice': [slice['slice_id']]} + + return slice['slice_id'] diff --git a/trunk/PLC/Methods/AddSliceAttribute.py b/trunk/PLC/Methods/AddSliceAttribute.py new file mode 100644 index 0000000..c5183bc --- /dev/null +++ b/trunk/PLC/Methods/AddSliceAttribute.py @@ -0,0 +1,113 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class AddSliceAttribute(Method): + """ + Sets the specified attribute of the slice (or sliver, if + node_id_or_hostname is specified) to the specified value. + + Attributes may require the caller to have a particular role in + order to be set or changed. Users may only set attributes of + slices or slivers of which they are members. PIs may only set + attributes of slices or slivers at their sites, or of which they + are members. Admins may set attributes of any slice or sliver. + + Returns the new slice_attribute_id (> 0) if successful, faults + otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(SliceAttribute.fields['slice_id'], + SliceAttribute.fields['name']), + Mixed(SliceAttribute.fields['attribute_type_id'], + SliceAttribute.fields['name']), + Mixed(SliceAttribute.fields['value'], + InitScript.fields['initscript_id']), + Mixed(Node.fields['node_id'], + Node.fields['hostname'], + None), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, 'New slice_attribute_id (> 0) if successful') + + def call(self, auth, slice_id_or_name, attribute_type_id_or_name, value, node_id_or_hostname = None, nodegroup_id_or_name = None): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + attribute_types = SliceAttributeTypes(self.api, [attribute_type_id_or_name]) + if not attribute_types: + raise PLCInvalidArgument, "No such slice attribute type" + attribute_type = attribute_types[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if attribute_type['min_role_id'] is not None and \ + min(self.caller['role_ids']) > attribute_type['min_role_id']: + raise PLCPermissionDenied, "Not allowed to set the specified slice attribute" + + # if initscript is specified, validate value + if attribute_type['name'] in ['plc_initscript_id']: + initscripts = InitScripts(self.api, {'enabled': True, 'initscript_id': int(value)}) + if not initscripts: + raise PLCInvalidArgument, "No such plc initscript" + + slice_attribute = SliceAttribute(self.api) + slice_attribute['slice_id'] = slice['slice_id'] + slice_attribute['attribute_type_id'] = attribute_type['attribute_type_id'] + slice_attribute['value'] = value + + # Sliver attribute if node is specified + if node_id_or_hostname is not None: + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['node_id'] not in slice['node_ids']: + raise PLCInvalidArgument, "Node not in the specified slice" + slice_attribute['node_id'] = node['node_id'] + + # Sliver attribute shared accross nodes if nodegroup is sepcified + if nodegroup_id_or_name is not None: + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + nodegroup = nodegroups[0] + + slice_attribute['nodegroup_id'] = nodegroup['nodegroup_id'] + + # Check if slice attribute alreay exists + slice_attributes_check = SliceAttributes(self.api, {'slice_id': slice['slice_id'], 'name': attribute_type['name'], 'value': value}) + for slice_attribute_check in slice_attributes_check: + if 'node_id' in slice_attribute and slice_attribute['node_id'] == slice_attribute_check['node_id']: + raise PLCInvalidArgument, "Sliver attribute already exists" + if 'nodegroup_id' in slice_attribute and slice_attribute['nodegroup_id'] == slice_attribute_check['nodegroup_id']: + raise PLCInvalidArgument, "Slice attribute already exists for this nodegroup" + if node_id_or_hostname is None and nodegroup_id_or_name is None: + raise PLCInvalidArgument, "Slice attribute already exists" + + slice_attribute.sync() + self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]} + + return slice_attribute['slice_attribute_id'] diff --git a/trunk/PLC/Methods/AddSliceAttributeType.py b/trunk/PLC/Methods/AddSliceAttributeType.py new file mode 100644 index 0000000..095ae83 --- /dev/null +++ b/trunk/PLC/Methods/AddSliceAttributeType.py @@ -0,0 +1,38 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'min_role_id'] + +class AddSliceAttributeType(Method): + """ + Adds a new type of slice attribute. Any fields specified in + attribute_type_fields are used, otherwise defaults are used. + + Returns the new attribute_type_id (> 0) if successful, faults + otherwise. + """ + + roles = ['admin'] + + attribute_type_fields = dict(filter(can_update, SliceAttributeType.fields.items())) + + accepts = [ + Auth(), + attribute_type_fields + ] + + returns = Parameter(int, 'New attribute_id (> 0) if successful') + + + def call(self, auth, attribute_type_fields): + attribute_type_fields = dict(filter(can_update, attribute_type_fields.items())) + attribute_type = SliceAttributeType(self.api, attribute_type_fields) + attribute_type.sync() + + self.event_objects = {'AttributeType': [attribute_type['attribute_type_id']]} + + return attribute_type['attribute_type_id'] diff --git a/trunk/PLC/Methods/AddSliceInstantiation.py b/trunk/PLC/Methods/AddSliceInstantiation.py new file mode 100644 index 0000000..0374957 --- /dev/null +++ b/trunk/PLC/Methods/AddSliceInstantiation.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Auth import Auth + +class AddSliceInstantiation(Method): + """ + Adds a new slice instantiation state. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + SliceInstantiation.fields['instantiation'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + slice_instantiation = SliceInstantiation(self.api) + slice_instantiation['instantiation'] = name + slice_instantiation.sync(insert = True) + + return 1 diff --git a/trunk/PLC/Methods/AddSliceToNodes.py b/trunk/PLC/Methods/AddSliceToNodes.py new file mode 100644 index 0000000..d5a2c8c --- /dev/null +++ b/trunk/PLC/Methods/AddSliceToNodes.py @@ -0,0 +1,69 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AddSliceToNodes(Method): + """ + Adds the specified slice to the specified nodes. Nodes may be + either local or foreign nodes. + + If the slice is already associated with a node, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + # Get specified nodes, add them to the slice + nodes = Nodes(self.api, node_id_or_hostname_list, ['node_id', 'hostname', 'slice_ids', 'slice_ids_whitelist', 'site_id']) + + for node in nodes: + # check the slice whitelist on each node first + # allow users at site to add node to slice, ignoring whitelist + if node['slice_ids_whitelist'] and \ + slice['slice_id'] not in node['slice_ids_whitelist'] and \ + not set(self.caller['site_ids']).intersection([node['site_id']]): + raise PLCInvalidArgument, "%s is not allowed on %s (not on the whitelist)" % \ + (slice['name'], node['hostname']) + if slice['slice_id'] not in node['slice_ids']: + slice.add_node(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/trunk/PLC/Methods/AddSliceToNodesWhitelist.py b/trunk/PLC/Methods/AddSliceToNodesWhitelist.py new file mode 100644 index 0000000..a6b4bd1 --- /dev/null +++ b/trunk/PLC/Methods/AddSliceToNodesWhitelist.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class AddSliceToNodesWhitelist(Method): + """ + Adds the specified slice to the whitelist on the specified nodes. Nodes may be + either local or foreign nodes. + + If the slice is already associated with a node, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + # Get specified nodes, add them to the slice + nodes = Nodes(self.api, node_id_or_hostname_list) + for node in nodes: + if node['peer_id'] is not None: + raise PLCInvalidArgument, "%s not a local node" % node['hostname'] + if slice['slice_id'] not in node['slice_ids_whitelist']: + slice.add_to_node_whitelist(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/trunk/PLC/Methods/AdmAddAddressType.py b/trunk/PLC/Methods/AdmAddAddressType.py new file mode 100644 index 0000000..e0cd09d --- /dev/null +++ b/trunk/PLC/Methods/AdmAddAddressType.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth +from PLC.Methods.AddAddressType import AddAddressType + +class AdmAddAddressType(AddAddressType): + """ + Deprecated. See AddAddressType. + """ + + status = "deprecated" + + accepts = [ + Auth(), + AddressType.fields['name'] + ] + + def call(self, auth, name): + return AddAddressType.call(self, auth, {'name': name}) diff --git a/trunk/PLC/Methods/AdmAddNode.py b/trunk/PLC/Methods/AdmAddNode.py new file mode 100644 index 0000000..dda5c99 --- /dev/null +++ b/trunk/PLC/Methods/AdmAddNode.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Sites import Site, Sites +from PLC.Auth import Auth +from PLC.Methods.AddNode import AddNode + +can_update = lambda (field, value): field in \ + ['model', 'version'] + +class AdmAddNode(AddNode): + """ + Deprecated. See AddNode. + """ + + status = "deprecated" + + node_fields = dict(filter(can_update, Node.fields.items())) + + accepts = [ + Auth(), + Site.fields['site_id'], + Node.fields['hostname'], + Node.fields['boot_state'], + node_fields + ] + + def call(self, auth, site_id, hostname, boot_state, node_fields = {}): + node_fields['site_id'] = site_id + node_fields['hostname'] = hostname + node_fields['boot_state'] = boot_state + return AddNode.call(self, auth, node_fields) diff --git a/trunk/PLC/Methods/AdmAddNodeGroup.py b/trunk/PLC/Methods/AdmAddNodeGroup.py new file mode 100644 index 0000000..6bbb59e --- /dev/null +++ b/trunk/PLC/Methods/AdmAddNodeGroup.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth +from PLC.Methods.AddNodeGroup import AddNodeGroup + +class AdmAddNodeGroup(AddNodeGroup): + """ + Deprecated. See AddNodeGroup. + """ + + status = "deprecated" + + accepts = [ + Auth(), + NodeGroup.fields['name'], + NodeGroup.fields['description'] + ] + + def call(self, auth, name, description): + return AddNodeGroup.call(self, auth, {'name': name, 'description': description}) diff --git a/trunk/PLC/Methods/AdmAddNodeNetwork.py b/trunk/PLC/Methods/AdmAddNodeNetwork.py new file mode 100644 index 0000000..c309a77 --- /dev/null +++ b/trunk/PLC/Methods/AdmAddNodeNetwork.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth +from PLC.Methods.AddNodeNetwork import AddNodeNetwork + +can_update = lambda (field, value): field not in ['nodenetwork_id', 'node_id', 'method', 'type'] + +class AdmAddNodeNetwork(AddNodeNetwork): + """ + Deprecated. See AddNodeNetwork. + """ + + status = "deprecated" + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Auth(), + NodeNetwork.fields['node_id'], + NodeNetwork.fields['method'], + NodeNetwork.fields['type'], + nodenetwork_fields + ] + + def call(self, auth, node_id, method, type, nodenetwork_fields = {}): + nodenetwork_fields['node_id'] = node_id + nodenetwork_fields['method'] = method + nodenetwork_fields['type'] = type + return AddNodeNetwork.call(self, auth, nodenetwork_fields) diff --git a/trunk/PLC/Methods/AdmAddNodeToNodeGroup.py b/trunk/PLC/Methods/AdmAddNodeToNodeGroup.py new file mode 100644 index 0000000..dc7eab4 --- /dev/null +++ b/trunk/PLC/Methods/AdmAddNodeToNodeGroup.py @@ -0,0 +1,8 @@ +from PLC.Methods.AddNodeToNodeGroup import AddNodeToNodeGroup + +class AdmAddNodeToNodeGroup(AddNodeToNodeGroup): + """ + Deprecated. See AddNodeToNodeGroup. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmAddPerson.py b/trunk/PLC/Methods/AdmAddPerson.py new file mode 100644 index 0000000..2b90f61 --- /dev/null +++ b/trunk/PLC/Methods/AdmAddPerson.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Methods.AddPerson import AddPerson + +can_update = lambda (field, value): field in \ + ['title', 'email', 'password', 'phone', 'url', 'bio'] + +class AdmAddPerson(AddPerson): + """ + Deprecated. See AddPerson. + """ + + status = "deprecated" + + person_fields = dict(filter(can_update, Person.fields.items())) + + accepts = [ + Auth(), + Person.fields['first_name'], + Person.fields['last_name'], + person_fields + ] + + def call(self, auth, first_name, last_name, person_fields = {}): + person_fields['first_name'] = first_name + person_fields['last_name'] = last_name + return AddPerson.call(self, auth, person_fields) diff --git a/trunk/PLC/Methods/AdmAddPersonKey.py b/trunk/PLC/Methods/AdmAddPersonKey.py new file mode 100644 index 0000000..05d0a69 --- /dev/null +++ b/trunk/PLC/Methods/AdmAddPersonKey.py @@ -0,0 +1,28 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Methods.AddPersonKey import AddPersonKey + +class AdmAddPersonKey(AddPersonKey): + """ + Deprecated. See AddPersonKey. Keys can no longer be marked as + primary, i.e. the is_primary argument does nothing. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Key.fields['key_type'], + Key.fields['key'], + Parameter(int, "Make this key the primary key") + ] + + def call(self, auth, person_id_or_email, key_type, key_value, is_primary): + key_fields = {'key_type': key_type, 'key_value': key_value} + return AddPersonKey.call(self, auth, person_id_or_email, key_fields) diff --git a/trunk/PLC/Methods/AdmAddPersonToSite.py b/trunk/PLC/Methods/AdmAddPersonToSite.py new file mode 100644 index 0000000..948b06f --- /dev/null +++ b/trunk/PLC/Methods/AdmAddPersonToSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.AddPersonToSite import AddPersonToSite + +class AdmAddPersonToSite(AddPersonToSite): + """ + Deprecated. See AddPersonToSite. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmAddSite.py b/trunk/PLC/Methods/AdmAddSite.py new file mode 100644 index 0000000..929c0a7 --- /dev/null +++ b/trunk/PLC/Methods/AdmAddSite.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth +from PLC.Methods.AddSite import AddSite + +can_update = lambda (field, value): field in \ + ['is_public', 'latitude', 'longitude', 'url'] + +class AdmAddSite(AddSite): + """ + Deprecated. See AddSite. + """ + + status = "deprecated" + + site_fields = dict(filter(can_update, Site.fields.items())) + + accepts = [ + Auth(), + Site.fields['name'], + Site.fields['abbreviated_name'], + Site.fields['login_base'], + site_fields + ] + + def call(self, auth, name, abbreviated_name, login_base, site_fields = {}): + site_fields['name'] = name + site_fields['abbreviated_name'] = abbreviated_name + site_fields['login_base'] = login_base + return AddSite.call(self, auth, site_fields) diff --git a/trunk/PLC/Methods/AdmAddSitePowerControlUnit.py b/trunk/PLC/Methods/AdmAddSitePowerControlUnit.py new file mode 100644 index 0000000..e9e452e --- /dev/null +++ b/trunk/PLC/Methods/AdmAddSitePowerControlUnit.py @@ -0,0 +1,8 @@ +from PLC.Methods.AddPCU import AddPCU + +class AdmAddSitePowerControlUnit(AddPCU): + """ + Deprecated. See AddPCU. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmAssociateNodeToPowerControlUnitPort.py b/trunk/PLC/Methods/AdmAssociateNodeToPowerControlUnitPort.py new file mode 100644 index 0000000..9e955be --- /dev/null +++ b/trunk/PLC/Methods/AdmAssociateNodeToPowerControlUnitPort.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth +from PLC.Methods.AddNodeToPCU import AddNodeToPCU + +class AdmAssociateNodeToPowerControlUnitPort(AddNodeToPCU): + """ + Deprecated. See AddNodeToPCU. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + Parameter(int, 'PCU port number'), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_id, port, node_id_or_hostname): + return AddNodeToPCU(self, auth, node_id_or_hostname, pcu_id, port) diff --git a/trunk/PLC/Methods/AdmAuthCheck.py b/trunk/PLC/Methods/AdmAuthCheck.py new file mode 100644 index 0000000..63defa5 --- /dev/null +++ b/trunk/PLC/Methods/AdmAuthCheck.py @@ -0,0 +1,8 @@ +from PLC.Methods.AuthCheck import AuthCheck + +class AdmAuthCheck(AuthCheck): + """ + Deprecated. See AuthCheck. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmDeleteAddressType.py b/trunk/PLC/Methods/AdmDeleteAddressType.py new file mode 100644 index 0000000..12f0625 --- /dev/null +++ b/trunk/PLC/Methods/AdmDeleteAddressType.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteAddressType import DeleteAddressType + +class AdmDeleteAddressType(DeleteAddressType): + """ + Deprecated. See DeleteAddressType. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmDeleteAllPersonKeys.py b/trunk/PLC/Methods/AdmDeleteAllPersonKeys.py new file mode 100644 index 0000000..9f038f9 --- /dev/null +++ b/trunk/PLC/Methods/AdmDeleteAllPersonKeys.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class AdmDeleteAllPersonKeys(Method): + """ + Deprecated. Functionality can be implemented with GetPersons and + DeleteKey. + + Deletes all of the keys associated with an account. Non-admins may + only delete their own keys. + + Non-admins may only delete their own keys. + + Returns 1 if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to update specified account" + + key_ids = person['key_ids'] + if not key_ids: + return 1 + + # Get associated key details + keys = Keys(self.api, key_ids) + + for key in keys: + key.delete() + + return 1 diff --git a/trunk/PLC/Methods/AdmDeleteNode.py b/trunk/PLC/Methods/AdmDeleteNode.py new file mode 100644 index 0000000..2ec9ff1 --- /dev/null +++ b/trunk/PLC/Methods/AdmDeleteNode.py @@ -0,0 +1,9 @@ +from PLC.Methods.DeleteNode import DeleteNode + +class AdmDeleteNode(DeleteNode): + """ + Deprecated. See DeleteNode. + """ + + status = "deprecated" + diff --git a/trunk/PLC/Methods/AdmDeleteNodeGroup.py b/trunk/PLC/Methods/AdmDeleteNodeGroup.py new file mode 100644 index 0000000..b5b2cb6 --- /dev/null +++ b/trunk/PLC/Methods/AdmDeleteNodeGroup.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteNodeGroup import DeleteNodeGroup + +class AdmDeleteNodeGroup(DeleteNodeGroup): + """ + Deprecated. See DeleteNodeGroup. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmDeleteNodeNetwork.py b/trunk/PLC/Methods/AdmDeleteNodeNetwork.py new file mode 100644 index 0000000..d566504 --- /dev/null +++ b/trunk/PLC/Methods/AdmDeleteNodeNetwork.py @@ -0,0 +1,24 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Methods.DeleteNodeNetwork import DeleteNodeNetwork + +class AdmDeleteNodeNetwork(DeleteNodeNetwork): + """ + Deprecated. See DeleteNodeNetwork. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + NodeNetwork.fields['nodenetwork_id'] + ] + + def call(self, auth, node_id_or_hostname, nodenetwork_id): + return DeleteNodeNetwork.call(self, auth, nodenetwork_id) diff --git a/trunk/PLC/Methods/AdmDeletePerson.py b/trunk/PLC/Methods/AdmDeletePerson.py new file mode 100644 index 0000000..ff29e8b --- /dev/null +++ b/trunk/PLC/Methods/AdmDeletePerson.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeletePerson import DeletePerson + +class AdmDeletePerson(DeletePerson): + """ + Deprecated. See DeletePerson. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmDeletePersonKeys.py b/trunk/PLC/Methods/AdmDeletePersonKeys.py new file mode 100644 index 0000000..fd24eef --- /dev/null +++ b/trunk/PLC/Methods/AdmDeletePersonKeys.py @@ -0,0 +1,56 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class AdmDeletePersonKeys(Method): + """ + Deprecated. Functionality can be implemented with GetPersons and + DeleteKey. + + Deletes the specified keys. Non-admins may only delete their own + keys. + + Returns 1 if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + [Key.fields['key_id']] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, key_ids): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to update specified account" + + key_ids = set(key_ids).intersection(person['key_ids']) + if not key_ids: + return 1 + + # Get associated key details + keys = Keys(self.api, key_ids) + + for key in keys: + key.delete() + + return 1 diff --git a/trunk/PLC/Methods/AdmDeleteSite.py b/trunk/PLC/Methods/AdmDeleteSite.py new file mode 100644 index 0000000..7501ad5 --- /dev/null +++ b/trunk/PLC/Methods/AdmDeleteSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteSite import DeleteSite + +class AdmDeleteSite(DeleteSite): + """ + Deprecated. See DeleteSite. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmDeleteSitePowerControlUnit.py b/trunk/PLC/Methods/AdmDeleteSitePowerControlUnit.py new file mode 100644 index 0000000..2865224 --- /dev/null +++ b/trunk/PLC/Methods/AdmDeleteSitePowerControlUnit.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeletePCU import DeletePCU + +class AdmDeleteSitePowerControlUnit(DeletePCU): + """ + Deprecated. See DeletePCU. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmDisassociatePowerControlUnitPort.py b/trunk/PLC/Methods/AdmDisassociatePowerControlUnitPort.py new file mode 100644 index 0000000..5f7c448 --- /dev/null +++ b/trunk/PLC/Methods/AdmDisassociatePowerControlUnitPort.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth +from PLC.Methods.DeleteNodeFromPCU import DeleteNodeFromPCU + +class AdmDisassociatePowerControlUnitPort(DeleteNodeFromPCU): + """ + Deprecated. See DeleteNodeFromPCU. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + Parameter(int, 'PCU port number'), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_id, port): + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + + pcu = pcus[0] + + ports = dict(zip(pcu['ports'], pcu['node_ids'])) + if port not in ports: + raise PLCInvalidArgument, "No node on that port or no such port" + + return DeleteNodeFromPCU(self, auth, ports[port], pcu_id) diff --git a/trunk/PLC/Methods/AdmGenerateNodeConfFile.py b/trunk/PLC/Methods/AdmGenerateNodeConfFile.py new file mode 100644 index 0000000..85789bd --- /dev/null +++ b/trunk/PLC/Methods/AdmGenerateNodeConfFile.py @@ -0,0 +1,110 @@ +import random +import base64 + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +class AdmGenerateNodeConfFile(Method): + """ + Deprecated. Functionality can be implemented with GetNodes, + GetNodeNetworks, and UpdateNode. + + Creates a new node configuration file if all network settings are + present. This function will generate a new node key for the + specified node, effectively invalidating any old configuration + files. + + Non-admins can only generate files for nodes at their sites. + + Returns the contents of the file if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(str, "Node configuration file") + + def call(self, auth, node_id_or_hostname): + # Get node information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to generate a configuration file for that node" + + # Get node networks for this node + primary = None + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + primary = nodenetwork + break + if primary is None: + raise PLCInvalidArgument, "No primary network configured" + + # Split hostname into host and domain parts + parts = node['hostname'].split(".", 1) + if len(parts) < 2: + raise PLCInvalidArgument, "Node hostname is invalid" + host = parts[0] + domain = parts[1] + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + node['key'] = base64.b64encode("".join(map(chr, bytes))) + # XXX Boot Manager cannot handle = in the key + node['key'] = node['key'].replace("=", "") + # Save it + node.sync() + + # Generate node configuration file suitable for BootCD + file = "" + + file += 'NODE_ID="%d"\n' % node['node_id'] + file += 'NODE_KEY="%s"\n' % node['key'] + + if primary['mac']: + file += 'NET_DEVICE="%s"\n' % primary['mac'].lower() + + file += 'IP_METHOD="%s"\n' % primary['method'] + + if primary['method'] == 'static': + file += 'IP_ADDRESS="%s"\n' % primary['ip'] + file += 'IP_GATEWAY="%s"\n' % primary['gateway'] + file += 'IP_NETMASK="%s"\n' % primary['netmask'] + file += 'IP_NETADDR="%s"\n' % primary['network'] + file += 'IP_BROADCASTADDR="%s"\n' % primary['broadcast'] + file += 'IP_DNS1="%s"\n' % primary['dns1'] + file += 'IP_DNS2="%s"\n' % (primary['dns2'] or "") + + file += 'HOST_NAME="%s"\n' % host + file += 'DOMAIN_NAME="%s"\n' % domain + + for nodenetwork in nodenetworks: + if nodenetwork['method'] == 'ipmi': + file += 'IPMI_ADDRESS="%s"\n' % nodenetwork['ip'] + if nodenetwork['mac']: + file += 'IPMI_MAC="%s"\n' % nodenetwork['mac'].lower() + break + + return file diff --git a/trunk/PLC/Methods/AdmGetAllAddressTypes.py b/trunk/PLC/Methods/AdmGetAllAddressTypes.py new file mode 100644 index 0000000..ca4748b --- /dev/null +++ b/trunk/PLC/Methods/AdmGetAllAddressTypes.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetAddressTypes import GetAddressTypes + +class AdmGetAllAddressTypes(GetAddressTypes): + """ + Deprecated. See GetAddressTypes. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmGetAllKeyTypes.py b/trunk/PLC/Methods/AdmGetAllKeyTypes.py new file mode 100644 index 0000000..4383f84 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetAllKeyTypes.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetKeyTypes import GetKeyTypes + +class AdmGetAllKeyTypes(GetKeyTypes): + """ + Deprecated. See GetKeyTypes. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmGetAllNodeNetworks.py b/trunk/PLC/Methods/AdmGetAllNodeNetworks.py new file mode 100644 index 0000000..c00bdec --- /dev/null +++ b/trunk/PLC/Methods/AdmGetAllNodeNetworks.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth +from PLC.Methods.GetNodeNetworks import GetNodeNetworks + +class AdmGetAllNodeNetworks(GetNodeNetworks): + """ + Deprecated. Functionality can be implemented with GetNodes and + GetNodeNetworks. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = [NodeNetwork.fields] + + def call(self, auth, node_id_or_hostname): + # Get node information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if not node['nodenetwork_ids']: + return [] + + return GetNodeNetworks.call(self, auth, node['nodenetwork_ids']) diff --git a/trunk/PLC/Methods/AdmGetAllRoles.py b/trunk/PLC/Methods/AdmGetAllRoles.py new file mode 100644 index 0000000..2b88714 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetAllRoles.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter +from PLC.Auth import Auth +from PLC.Methods.GetRoles import GetRoles + +class AdmGetAllRoles(GetRoles): + """ + Deprecated. See GetRoles. + + Return all possible roles as a struct: + + {'10': 'admin', '20': 'pi', '30': 'user', '40': 'tech'} + + Note that because of XML-RPC marshalling limitations, the keys to + this struct are string representations of the integer role + identifiers. + """ + + status = "deprecated" + + returns = dict + + def call(self, auth): + roles_list = GetRoles.call(self, auth) + + roles_dict = {} + for role in roles_list: + # Stringify the keys! + roles_dict[str(role['role_id'])] = role['name'] + + return roles_dict diff --git a/trunk/PLC/Methods/AdmGetNodeGroupNodes.py b/trunk/PLC/Methods/AdmGetNodeGroupNodes.py new file mode 100644 index 0000000..51c392a --- /dev/null +++ b/trunk/PLC/Methods/AdmGetNodeGroupNodes.py @@ -0,0 +1,36 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.NodeGroups import NodeGroup, NodeGroups + +class AdmGetNodeGroupNodes(Method): + """ + Deprecated. See GetNodeGroups. + + Returns a list of node_ids for the node group specified. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = NodeGroup.fields['node_ids'] + + def call(self, auth, nodegroup_id_or_name): + # Get nodes in this nodegroup + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such node group" + + # Get the info for the node group specified + nodegroup = nodegroups[0] + + # Return the list of node_ids + return nodegroup['node_ids'] diff --git a/trunk/PLC/Methods/AdmGetNodeGroups.py b/trunk/PLC/Methods/AdmGetNodeGroups.py new file mode 100644 index 0000000..fa1ad59 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetNodeGroups.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetNodeGroups import GetNodeGroups + +class AdmGetNodeGroups(GetNodeGroups): + """ + Deprecated. See GetNodeGroups. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmGetNodes.py b/trunk/PLC/Methods/AdmGetNodes.py new file mode 100644 index 0000000..74d8489 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetNodes.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetNodes import GetNodes + +class AdmGetNodes(GetNodes): + """ + Deprecated. See GetNodes. All fields are now always returned. + """ + + status = "deprecated" + + def call(self, auth, node_id_or_hostname_list = None, return_fields = None): + return GetNodes.call(self, auth, node_id_or_hostname_list) diff --git a/trunk/PLC/Methods/AdmGetPersonKeys.py b/trunk/PLC/Methods/AdmGetPersonKeys.py new file mode 100644 index 0000000..946230a --- /dev/null +++ b/trunk/PLC/Methods/AdmGetPersonKeys.py @@ -0,0 +1,40 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth +from PLC.Methods.GetKeys import GetKeys + +class AdmGetPersonKeys(GetKeys): + """ + Deprecated. Functionality can be implemented with GetPersons and + GetKeys. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + [Key.fields['key_id']] + ] + + returns = [Key.fields] + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to view keys for specified account" + + return GetKeys.call(self, auth, person['key_ids']) diff --git a/trunk/PLC/Methods/AdmGetPersonRoles.py b/trunk/PLC/Methods/AdmGetPersonRoles.py new file mode 100644 index 0000000..024b93c --- /dev/null +++ b/trunk/PLC/Methods/AdmGetPersonRoles.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmGetPersonRoles(Method): + """ + Deprecated. See GetPersons. + + Return the roles that the specified person has as a struct: + + {'10': 'admin', '30': 'user', '20': 'pi', '40': 'tech'} + + Admins can get the roles for any user. PIs can only get the roles + for members of their sites. All others may only get their own + roles. + + Note that because of XML-RPC marshalling limitations, the keys to + this struct are string representations of the integer role + identifiers. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = dict + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + # Authenticated function + assert self.caller is not None + + # Check if we can view this account + if not self.caller.can_view(person): + raise PLCPermissionDenied, "Not allowed to view specified account" + + # Stringify the keys! + role_ids = map(str, person['role_ids']) + roles = person['roles'] + + return dict(zip(role_ids, roles)) diff --git a/trunk/PLC/Methods/AdmGetPersonSites.py b/trunk/PLC/Methods/AdmGetPersonSites.py new file mode 100644 index 0000000..79324f8 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetPersonSites.py @@ -0,0 +1,47 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetPersonSites(Method): + """ + Deprecated. See GetPersons. + + Returns the sites that the specified person is associated with as + an array of site identifiers. + + Admins may retrieve details about anyone. Users and techs may only + retrieve details about themselves. PIs may retrieve details about + themselves and others at their sites. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = Person.fields['site_ids'] + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + + person = persons[0] + + # Authenticated function + assert self.caller is not None + + # Check if we can view this account + if not self.caller.can_view(person): + raise PLCPermissionDenied, "Not allowed to view specified account" + + return person['site_ids'] diff --git a/trunk/PLC/Methods/AdmGetPersons.py b/trunk/PLC/Methods/AdmGetPersons.py new file mode 100644 index 0000000..35e94a0 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetPersons.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetPersons import GetPersons + +class AdmGetPersons(GetPersons): + """ + Deprecated. See GetPersons. + """ + + status = "deprecated" + + def call(self, auth, person_id_or_email_list = None, return_fields = None): + return GetPersons.call(self, auth, person_id_or_email_list) diff --git a/trunk/PLC/Methods/AdmGetPowerControlUnitNodes.py b/trunk/PLC/Methods/AdmGetPowerControlUnitNodes.py new file mode 100644 index 0000000..af298ee --- /dev/null +++ b/trunk/PLC/Methods/AdmGetPowerControlUnitNodes.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class AdmGetPowerControlUnitNodes(Method): + """ + Deprecated. See GetPCUs. + + Returns a list of the nodes, and the ports they are assigned to, + on the specified PCU. + + Admin may query all PCUs. Non-admins may only query the PCUs at + their sites. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'] + ] + + returns = [{'node_id': Parameter(int, "Node identifier"), + 'port_number': Parameter(int, "Port number")}] + + def call(self, auth, pcu_id): + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + if pcu['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to view that PCU" + + return [{'node_id': node_id, 'port_number': port} \ + for (node_id, port) in zip(pcu['node_ids'], pcu['ports'])] diff --git a/trunk/PLC/Methods/AdmGetPowerControlUnits.py b/trunk/PLC/Methods/AdmGetPowerControlUnits.py new file mode 100644 index 0000000..8f7e0c7 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetPowerControlUnits.py @@ -0,0 +1,8 @@ +from PLC.Methods.GetPCUs import GetPCUs + +class AdmGetPowerControlUnits(GetPCUs): + """ + Deprecated. See GetPCUs. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmGetSiteNodes.py b/trunk/PLC/Methods/AdmGetSiteNodes.py new file mode 100644 index 0000000..b366c80 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetSiteNodes.py @@ -0,0 +1,44 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetSiteNodes(Method): + """ + Deprecated. See GetSites. + + Return a struct containing an array of node_ids for each of the + sites specified. Note that the keys of the struct are strings, not + integers, because of XML-RPC marshalling limitations. + + Admins may retrieve details about all nodes on a site by not specifying + site_id_or_name or by specifying an empty list. Users and + techs may only retrieve details about themselves. PIs may retrieve + details about themselves and others at their sites. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + [Mixed(Site.fields['site_id'], + Site.fields['name'])], + ] + + returns = dict + + def call(self, auth, site_id_or_name_list = None): + # Get site information + sites = Sites(self.api, site_id_or_name_list) + if not sites: + raise PLCInvalidArgument, "No such site" + + # Convert to {str(site_id): [node_id]} + site_nodes = {} + for site in sites: + site_nodes[str(site['site_id'])] = site['node_ids'] + + return site_nodes diff --git a/trunk/PLC/Methods/AdmGetSitePIs.py b/trunk/PLC/Methods/AdmGetSitePIs.py new file mode 100644 index 0000000..d35ee88 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetSitePIs.py @@ -0,0 +1,44 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmGetSitePIs(Method): + """ + Deprecated. Functionality can be implemented with GetSites and + GetPersons. + + Return a list of person_ids of the PIs for the site specified. + """ + + status = "deprecated" + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Site.fields['person_ids'] + + def call(self, auth, site_id_or_login_base): + # Authenticated function + assert self.caller is not None + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + persons = Persons(self.api, site['person_ids']) + + has_pi_role = lambda person: 'pi' in person['roles'] + pis = filter(has_pi_role, persons) + + return [pi['person_id'] for pi in pis] diff --git a/trunk/PLC/Methods/AdmGetSitePersons.py b/trunk/PLC/Methods/AdmGetSitePersons.py new file mode 100644 index 0000000..8122528 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetSitePersons.py @@ -0,0 +1,44 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetSitePersons(Method): + """ + Deprecated. See GetSites. + + Return a list of person_ids for the site specified. + + PIs may only retrieve the person_ids of accounts at their + site. Admins may retrieve the person_ids of accounts at any site. + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Site.fields['person_ids'] + + def call(self, auth, site_id_or_login_base): + # Authenticated function + assert self.caller is not None + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to view accounts at that site" + + return site['person_ids'] diff --git a/trunk/PLC/Methods/AdmGetSitePowerControlUnits.py b/trunk/PLC/Methods/AdmGetSitePowerControlUnits.py new file mode 100644 index 0000000..b95f298 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetSitePowerControlUnits.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class AdmGetSitePowerControlUnits(Method): + """ + Deprecated. Functionality can be implemented with GetSites and GetPCUs. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = [PCU.fields] + + def call(self, auth, site_id_or_login_base): + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to view the PCUs at that site" + + return PCUs(self.api, site['pcu_ids']) diff --git a/trunk/PLC/Methods/AdmGetSiteTechContacts.py b/trunk/PLC/Methods/AdmGetSiteTechContacts.py new file mode 100644 index 0000000..f531db5 --- /dev/null +++ b/trunk/PLC/Methods/AdmGetSiteTechContacts.py @@ -0,0 +1,45 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmGetSiteTechContacts(Method): + """ + Deprecated. Functionality can be implemented with GetSites and + GetPersons. + + Return a list of person_ids of the technical contacts for the site + specified. + """ + + status = "deprecated" + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Site.fields['person_ids'] + + def call(self, auth, site_id_or_login_base): + # Authenticated function + assert self.caller is not None + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + + site = sites[0] + + persons = Persons(self.api, site['person_ids']) + + has_tech_role = lambda person: 'tech' in person['roles'] + techs = filter(has_tech_role, persons) + + return [tech['person_id'] for tech in techs] diff --git a/trunk/PLC/Methods/AdmGetSites.py b/trunk/PLC/Methods/AdmGetSites.py new file mode 100644 index 0000000..cf5b0cd --- /dev/null +++ b/trunk/PLC/Methods/AdmGetSites.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetSites import GetSites + +class AdmGetSites(GetSites): + """ + Deprecated. See GetSites. + """ + + status = "deprecated" + + def call(self, auth, site_id_or_login_base_list = None, return_fields = None): + return GetSites.call(self, auth, site_id_or_login_base_list) diff --git a/trunk/PLC/Methods/AdmGrantRoleToPerson.py b/trunk/PLC/Methods/AdmGrantRoleToPerson.py new file mode 100644 index 0000000..36e2e25 --- /dev/null +++ b/trunk/PLC/Methods/AdmGrantRoleToPerson.py @@ -0,0 +1,11 @@ +from PLC.Methods.AddRoleToPerson import AddRoleToPerson + +class AdmGrantRoleToPerson(AddRoleToPerson): + """ + Deprecated. See AddRoleToPerson. + """ + + status = "deprecated" + + def call(self, auth, person_id_or_email, role_id_or_name): + return AddRoleToPerson.call(self, auth, role_id_or_name, person_id_or_email) diff --git a/trunk/PLC/Methods/AdmIsPersonInRole.py b/trunk/PLC/Methods/AdmIsPersonInRole.py new file mode 100644 index 0000000..b32ab03 --- /dev/null +++ b/trunk/PLC/Methods/AdmIsPersonInRole.py @@ -0,0 +1,67 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Roles import Role, Roles + +class AdmIsPersonInRole(Method): + """ + Deprecated. Functionality can be implemented with GetPersons. + + Returns 1 if the specified account has the specified role, 0 + otherwise. This function differs from AdmGetPersonRoles() in that + any authorized user can call it. It is currently restricted to + verifying PI roles. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Parameter(int, "Role identifier"), + Parameter(str, "Role name")) + ] + + returns = Parameter(int, "1 if account has role, 0 otherwise") + + def call(self, auth, person_id_or_email, role_id_or_name): + # This is a totally fucked up function. I have no idea why it + # exists or who calls it, but here is how it is supposed to + # work. + + # Only allow PI roles to be checked + roles = {} + for role in Roles(self.api): + roles[role['role_id']] = role['name'] + roles[role['name']] = role['role_id'] + + if role_id_or_name not in roles: + raise PLCInvalidArgument, "Invalid role identifier or name" + + if isinstance(role_id_or_name, int): + role_id = role_id_or_name + else: + role_id = roles[role_id_or_name] + + if roles[role_id] != "pi": + raise PLCInvalidArgument, "Only the PI role may be checked" + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + + # Rather than raise an error, and indicate whether or not + # the person is real, return 0. + if not persons: + return 0 + + person = persons[0] + + if role_id in person['role_ids']: + return 1 + + return 0 diff --git a/trunk/PLC/Methods/AdmQueryConfFile.py b/trunk/PLC/Methods/AdmQueryConfFile.py new file mode 100644 index 0000000..6cf5d99 --- /dev/null +++ b/trunk/PLC/Methods/AdmQueryConfFile.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +class AdmQueryConfFile(Method): + """ + Deprecated. See GetConfFiles. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'node_id': Node.fields['node_id']} + ] + + returns = [ConfFile.fields['conf_file_id']] + + def call(self, auth, search_vals): + if 'node_id' in search_vals: + conf_files = ConfFiles(self.api) + + conf_files = filter(lambda conf_file: \ + search_vals['node_id'] in conf_file['node_ids'], + conf_files) + + if conf_files: + return [conf_file['conf_file_id'] for conf_file in conf_files] + + return [] diff --git a/trunk/PLC/Methods/AdmQueryNode.py b/trunk/PLC/Methods/AdmQueryNode.py new file mode 100644 index 0000000..f41d04f --- /dev/null +++ b/trunk/PLC/Methods/AdmQueryNode.py @@ -0,0 +1,67 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks, valid_ip +from PLC.Auth import Auth + +class AdmQueryNode(Method): + """ + Deprecated. Functionality can be implemented with GetNodes and + GetNodeNetworks. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'node_hostname': Node.fields['hostname'], + 'nodenetwork_ip': NodeNetwork.fields['ip'], + 'nodenetwork_mac': NodeNetwork.fields['mac'], + 'nodenetwork_method': NodeNetwork.fields['method']} + ] + + returns = [Node.fields['node_id']] + + def call(self, auth, search_vals): + # Get possible nodenetworks + if 'node_hostname' in search_vals: + nodes = Nodes(self.api, [search_vals['node_hostname']]) + if not nodes: + return [] + + # No network interface filters specified + if 'nodenetwork_ip' not in search_vals and \ + 'nodenetwork_mac' not in search_vals and \ + 'nodenetwork_method' not in search_vals: + return [nodes[0]['node_id']] + + if nodes[0]['nodenetwork_ids']: + nodenetworks = NodeNetworks(self.api, nodes[0]['nodenetwork_ids']) + else: + nodenetworks = [] + else: + nodenetworks = NodeNetworks(self.api) + + if 'nodenetwork_ip' in search_vals: + if not valid_ip(search_vals['nodenetwork_ip']): + raise PLCInvalidArgument, "Invalid IP address" + nodenetworks = filter(lambda nodenetwork: \ + socket.inet_aton(nodenetwork['ip']) == socket.inet_aton(search_vals['nodenetwork_ip']), + nodenetworks) + + if 'nodenetwork_mac' in search_vals: + nodenetworks = filter(lambda nodenetwork: \ + nodenetwork['mac'].lower() == search_vals['nodenetwork_mac'].lower(), + nodenetworks) + + if 'nodenetwork_method' in search_vals: + nodenetworks = filter(lambda nodenetwork: \ + nodenetwork['method'].lower() == search_vals['nodenetwork_method'].lower(), + nodenetworks) + + return [nodenetwork['node_id'] for nodenetwork in nodenetworks] diff --git a/trunk/PLC/Methods/AdmQueryPerson.py b/trunk/PLC/Methods/AdmQueryPerson.py new file mode 100644 index 0000000..b41d0a5 --- /dev/null +++ b/trunk/PLC/Methods/AdmQueryPerson.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class AdmQueryPerson(Method): + """ + Deprecated. See GetPersons. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'email': Person.fields['email']} + ] + + returns = [Person.fields['person_id']] + + def call(self, auth, search_vals): + if 'email' in search_vals: + persons = Persons(self.api, [search_vals['email']]) + if persons: + return [persons[0]['person_id']] + + return [] diff --git a/trunk/PLC/Methods/AdmQueryPowerControlUnit.py b/trunk/PLC/Methods/AdmQueryPowerControlUnit.py new file mode 100644 index 0000000..8fc2f42 --- /dev/null +++ b/trunk/PLC/Methods/AdmQueryPowerControlUnit.py @@ -0,0 +1,59 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks, valid_ip +from PLC.Auth import Auth + +class AdmQueryPowerControlUnit(Method): + """ + Deprecated. Functionality can be implemented with GetPCUs or + GetNodes. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'pcu_hostname': PCU.fields['hostname'], + 'pcu_ip': PCU.fields['ip'], + 'node_hostname': Node.fields['hostname'], + 'node_id': Node.fields['node_id']} + ] + + returns = [PCU.fields['pcu_id']] + + def call(self, auth, search_vals): + # Get all PCUs. This is a stupid function. The API should not + # be used for DB mining. + pcus = PCUs(self.api) + + if 'pcu_hostname' in search_vals: + pcus = filter(lambda pcu: \ + pcu['hostname'].lower() == search_vals['pcu_hostname'].lower(), + pcus) + + if 'pcu_ip' in search_vals: + if not valid_ip(search_vals['pcu_ip']): + raise PLCInvalidArgument, "Invalid IP address" + pcus = filter(lambda pcu: \ + socket.inet_aton(pcu['ip']) == socket.inet_aton(search_vals['pcu_ip']), + pcus) + + if 'node_id' in search_vals: + pcus = filter(lambda pcu: \ + search_vals['node_id'] in pcu['node_ids'], + pcus) + + if 'node_hostname' in search_vals: + pcus = filter(lambda pcu: \ + search_vals['node_hostname'] in \ + [node['hostname'] for node in Nodes(self.api, pcu['node_ids'])], + pcus) + + return [pcu['pcu_id'] for pcu in pcus] diff --git a/trunk/PLC/Methods/AdmQuerySite.py b/trunk/PLC/Methods/AdmQuerySite.py new file mode 100644 index 0000000..cad6b8c --- /dev/null +++ b/trunk/PLC/Methods/AdmQuerySite.py @@ -0,0 +1,87 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks, valid_ip +from PLC.Auth import Auth + +class AdmQuerySite(Method): + """ + Deprecated. Functionality can be implemented with GetSites and + GetNodes. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + {'site_name': Site.fields['name'], + 'site_abbreviatedname': Site.fields['abbreviated_name'], + 'site_loginbase': Site.fields['login_base'], + 'node_hostname': Node.fields['hostname'], + 'node_id': Node.fields['node_id'], + 'nodenetwork_ip': NodeNetwork.fields['ip'], + 'nodenetwork_mac': NodeNetwork.fields['mac']} + ] + + returns = [Site.fields['site_id']] + + def call(self, auth, search_vals): + if 'site_loginbase' in search_vals: + sites = Sites(self.api, [search_vals['site_loginbase']]) + else: + sites = Sites(self.api) + + if 'site_name' in search_vals: + sites = filter(lambda site: \ + site['name'] == search_vals['site_name'], + sites) + + if 'site_abbreviatedname' in search_vals: + sites = filter(lambda site: \ + site['abbreviatedname'] == search_vals['site_abbreviatedname'], + sites) + + if 'node_id' in search_vals: + sites = filter(lambda site: \ + search_vals['node_id'] in site['node_ids'], + sites) + + if 'node_hostname' in search_vals or \ + 'nodenetwork_ip' in search_vals or \ + 'nodenetwork_mac' in search_vals: + for site in sites: + site['hostnames'] = [] + site['ips'] = [] + site['macs'] = [] + if site['node_ids']: + nodes = Nodes(self.api, site['node_ids']) + for node in nodes: + site['hostnames'].append(node['hostname']) + if 'nodenetwork_ip' in search_vals or \ + 'nodenetwork_mac' in search_vals: + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + site['ips'] += [nodenetwork['ip'] for nodenetwork in nodenetworks] + site['macs'] += [nodenetwork['mac'] for nodenetwork in nodenetworks] + + if 'node_hostname' in search_vals: + sites = filter(lambda site: \ + search_vals['node_hostname'] in site['hostnames'], + sites) + + if 'nodenetwork_ip' in search_vals: + sites = filter(lambda site: \ + search_vals['nodenetwork_ip'] in site['ips'], + sites) + + if 'nodenetwork_mac' in search_vals: + sites = filter(lambda site: \ + search_vals['nodenetwork_mac'] in site['macs'], + sites) + + return [site['site_id'] for site in sites] diff --git a/trunk/PLC/Methods/AdmRebootNode.py b/trunk/PLC/Methods/AdmRebootNode.py new file mode 100644 index 0000000..c8368e3 --- /dev/null +++ b/trunk/PLC/Methods/AdmRebootNode.py @@ -0,0 +1,8 @@ +from PLC.Methods.RebootNode import RebootNode + +class AdmRebootNode(RebootNode): + """ + Deprecated. See RebootNode. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmRemoveNodeFromNodeGroup.py b/trunk/PLC/Methods/AdmRemoveNodeFromNodeGroup.py new file mode 100644 index 0000000..f905a16 --- /dev/null +++ b/trunk/PLC/Methods/AdmRemoveNodeFromNodeGroup.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeleteNodeFromNodeGroup import DeleteNodeFromNodeGroup + +class AdmRemoveNodeFromNodeGroup(DeleteNodeFromNodeGroup): + """ + Deprecated. See DeleteNodeFromNodeGroup. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmRemovePersonFromSite.py b/trunk/PLC/Methods/AdmRemovePersonFromSite.py new file mode 100644 index 0000000..54d3f1d --- /dev/null +++ b/trunk/PLC/Methods/AdmRemovePersonFromSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.DeletePersonFromSite import DeletePersonFromSite + +class AdmRemovePersonFromSite(DeletePersonFromSite): + """ + Deprecated. See DeletePersonFromSite. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmRevokeRoleFromPerson.py b/trunk/PLC/Methods/AdmRevokeRoleFromPerson.py new file mode 100644 index 0000000..2631a3a --- /dev/null +++ b/trunk/PLC/Methods/AdmRevokeRoleFromPerson.py @@ -0,0 +1,11 @@ +from PLC.Methods.DeleteRoleFromPerson import DeleteRoleFromPerson + +class AdmRevokeRoleFromPerson(DeleteRoleFromPerson): + """ + Deprecated. See DeleteRoleFromPerson. + """ + + status = "deprecated" + + def call(self, auth, person_id_or_email, role_id_or_name): + return DeleteRoleFromPerson.call(self, auth, role_id_or_name, person_id_or_email) diff --git a/trunk/PLC/Methods/AdmSetPersonEnabled.py b/trunk/PLC/Methods/AdmSetPersonEnabled.py new file mode 100644 index 0000000..2009f00 --- /dev/null +++ b/trunk/PLC/Methods/AdmSetPersonEnabled.py @@ -0,0 +1,23 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Methods.UpdatePerson import UpdatePerson + +class AdmSetPersonEnabled(UpdatePerson): + """ + Deprecated. See UpdatePerson. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Person.fields['enabled'] + ] + + def call(self, auth, person_id_or_email, enabled): + return UpdatePerson.call(self, auth, person_id_or_email, {'enabled': enabled}) diff --git a/trunk/PLC/Methods/AdmSetPersonPrimarySite.py b/trunk/PLC/Methods/AdmSetPersonPrimarySite.py new file mode 100644 index 0000000..c631a95 --- /dev/null +++ b/trunk/PLC/Methods/AdmSetPersonPrimarySite.py @@ -0,0 +1,8 @@ +from PLC.Methods.SetPersonPrimarySite import SetPersonPrimarySite + +class AdmSetPersonPrimarySite(SetPersonPrimarySite): + """ + Deprecated. See SetPersonPrimarySite. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmUpdateNode.py b/trunk/PLC/Methods/AdmUpdateNode.py new file mode 100644 index 0000000..ba4b3f1 --- /dev/null +++ b/trunk/PLC/Methods/AdmUpdateNode.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdateNode import UpdateNode + +class AdmUpdateNode(UpdateNode): + """ + Deprecated. See UpdateNode. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmUpdateNodeGroup.py b/trunk/PLC/Methods/AdmUpdateNodeGroup.py new file mode 100644 index 0000000..b53198a --- /dev/null +++ b/trunk/PLC/Methods/AdmUpdateNodeGroup.py @@ -0,0 +1,27 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth +from PLC.Methods.UpdateNodeGroup import UpdateNodeGroup + +class AdmUpdateNodeGroup(UpdateNodeGroup): + """ + Deprecated. See UpdateNodeGroup. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + NodeGroup.fields['name'], + NodeGroup.fields['description'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodegroup_id_or_name, name, description): + return UpdateNodeGroup.call(self, auth, nodegroup_id_or_name, + {'name': name, 'description': description}) diff --git a/trunk/PLC/Methods/AdmUpdateNodeNetwork.py b/trunk/PLC/Methods/AdmUpdateNodeNetwork.py new file mode 100644 index 0000000..a85d62a --- /dev/null +++ b/trunk/PLC/Methods/AdmUpdateNodeNetwork.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdateNodeNetwork import UpdateNodeNetwork + +class AdmUpdateNodeNetwork(UpdateNodeNetwork): + """ + Deprecated. See UpdateNodeNetwork. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmUpdatePerson.py b/trunk/PLC/Methods/AdmUpdatePerson.py new file mode 100644 index 0000000..066fe6d --- /dev/null +++ b/trunk/PLC/Methods/AdmUpdatePerson.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdatePerson import UpdatePerson + +class AdmUpdatePerson(UpdatePerson): + """ + Deprecated. See UpdatePerson. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmUpdateSite.py b/trunk/PLC/Methods/AdmUpdateSite.py new file mode 100644 index 0000000..0b6c26a --- /dev/null +++ b/trunk/PLC/Methods/AdmUpdateSite.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdateSite import UpdateSite + +class AdmUpdateSite(UpdateSite): + """ + Deprecated. See UpdateSite. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AdmUpdateSitePowerControlUnit.py b/trunk/PLC/Methods/AdmUpdateSitePowerControlUnit.py new file mode 100644 index 0000000..ed564fb --- /dev/null +++ b/trunk/PLC/Methods/AdmUpdateSitePowerControlUnit.py @@ -0,0 +1,8 @@ +from PLC.Methods.UpdatePCU import UpdatePCU + +class AdmUpdateSitePowerControlUnit(UpdatePCU): + """ + Deprecated. See UpdatePCU. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/AnonAdmGetNodeGroups.py b/trunk/PLC/Methods/AnonAdmGetNodeGroups.py new file mode 100644 index 0000000..b223e1e --- /dev/null +++ b/trunk/PLC/Methods/AnonAdmGetNodeGroups.py @@ -0,0 +1,11 @@ +from PLC.Methods.GetNodeGroups import GetNodeGroups + +class AnonAdmGetNodeGroups(GetNodeGroups): + """ + Deprecated. See GetNodeGroups. All fields are now always returned + """ + + status = "deprecated" + + def call(self, auth, nodegroup_id_or_name_list = None, return_fields = None): + return GetNodeGroups.call(self, auth, nodegroup_id_or_name_list) diff --git a/trunk/PLC/Methods/AuthCheck.py b/trunk/PLC/Methods/AuthCheck.py new file mode 100644 index 0000000..0a4c260 --- /dev/null +++ b/trunk/PLC/Methods/AuthCheck.py @@ -0,0 +1,16 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth, BootAuth + +class AuthCheck(Method): + """ + Returns 1 if the user or node authenticated successfully, faults + otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + accepts = [Auth()] + returns = Parameter(int, '1 if successful') + + def call(self, auth): + return 1 diff --git a/trunk/PLC/Methods/BlacklistKey.py b/trunk/PLC/Methods/BlacklistKey.py new file mode 100644 index 0000000..7953e7a --- /dev/null +++ b/trunk/PLC/Methods/BlacklistKey.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class BlacklistKey(Method): + """ + Blacklists a key, disassociating it and all others identical to it + from all accounts and preventing it from ever being added again. + + WARNING: Identical keys associated with other accounts with also + be blacklisted. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Key.fields['key_id'], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, key_id): + # Get associated key details + keys = Keys(self.api, [key_id]) + if not keys: + raise PLCInvalidArgument, "No such key" + key = keys[0] + + # N.B.: Can blacklist any key, even foreign ones + + key.blacklist() + + # Logging variables + self.event_objects = {'Key': [key['key_id']]} + self.message = 'Key %d blacklisted' % key['key_id'] + + return 1 diff --git a/trunk/PLC/Methods/BootCheckAuthentication.py b/trunk/PLC/Methods/BootCheckAuthentication.py new file mode 100644 index 0000000..ea9b098 --- /dev/null +++ b/trunk/PLC/Methods/BootCheckAuthentication.py @@ -0,0 +1,8 @@ +from PLC.Methods.AuthCheck import AuthCheck + +class BootCheckAuthentication(AuthCheck): + """ + Deprecated. See AuthCheck. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/BootGetNodeDetails.py b/trunk/PLC/Methods/BootGetNodeDetails.py new file mode 100644 index 0000000..2f5056d --- /dev/null +++ b/trunk/PLC/Methods/BootGetNodeDetails.py @@ -0,0 +1,55 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import BootAuth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Sessions import Session, Sessions + +class BootGetNodeDetails(Method): + """ + Returns a set of details about the calling node, including a new + node session value. + """ + + roles = ['node'] + + accepts = [BootAuth()] + + returns = { + 'hostname': Node.fields['hostname'], + 'boot_state': Node.fields['boot_state'], + 'model': Node.fields['model'], + 'networks': [NodeNetwork.fields], + 'session': Session.fields['session_id'], + } + + def call(self, auth): + details = { + 'hostname': self.caller['hostname'], + 'boot_state': self.caller['boot_state'], + # XXX Boot Manager cannot unmarshal None + 'model': self.caller['model'] or "", + } + + # Generate a new session value + session = Session(self.api) + session.sync(commit = False) + session.add_node(self.caller, commit = True) + + details['session'] = session['session_id'] + + if self.caller['nodenetwork_ids']: + details['networks'] = NodeNetworks(self.api, self.caller['nodenetwork_ids']) + # XXX Boot Manager cannot unmarshal None + for network in details['networks']: + for field in network: + if network[field] is None: + if isinstance(network[field], (int, long)): + network[field] = -1 + else: + network[field] = "" + + self.messge = "Node request boot_state (%s) and networks" % \ + (details['boot_state']) + return details + diff --git a/trunk/PLC/Methods/BootNotifyOwners.py b/trunk/PLC/Methods/BootNotifyOwners.py new file mode 100644 index 0000000..c1da332 --- /dev/null +++ b/trunk/PLC/Methods/BootNotifyOwners.py @@ -0,0 +1,32 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth, BootAuth +from PLC.Nodes import Node, Nodes +from PLC.Messages import Message, Messages + +from PLC.Boot import notify_owners + +class BootNotifyOwners(Method): + """ + Notify the owners of the node, and/or support about an event that + happened on the machine. + + Returns 1 if successful. + """ + + roles = ['node'] + + accepts = [ + BootAuth(), + Message.fields['message_id'], + Parameter(int, "Notify PIs"), + Parameter(int, "Notify technical contacts"), + Parameter(int, "Notify support") + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, message_id, include_pis, include_techs, include_support): + assert isinstance(self.caller, Node) + notify_owners(self, self.caller, message_id, include_pis, include_techs, include_support) + return 1 diff --git a/trunk/PLC/Methods/BootUpdateNode.py b/trunk/PLC/Methods/BootUpdateNode.py new file mode 100644 index 0000000..52381cb --- /dev/null +++ b/trunk/PLC/Methods/BootUpdateNode.py @@ -0,0 +1,64 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth, BootAuth, SessionAuth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +can_update = lambda (field, value): field in \ + ['method', 'mac', 'gateway', 'network', + 'broadcast', 'netmask', 'dns1', 'dns2'] + +class BootUpdateNode(Method): + """ + Allows the calling node to update its own record. Only the primary + network can be updated, and the node IP cannot be changed. + + Returns 1 if updated successfully. + """ + + roles = ['node'] + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Mixed(BootAuth(), SessionAuth()), + {'boot_state': Node.fields['boot_state'], + 'primary_network': nodenetwork_fields, + 'ssh_host_key': Node.fields['ssh_rsa_key']} + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_fields): + # Update node state + if node_fields.has_key('boot_state'): + self.caller['boot_state'] = node_fields['boot_state'] + if node_fields.has_key('ssh_host_key'): + self.caller['ssh_rsa_key'] = node_fields['ssh_host_key'] + + # Update primary node network state + if node_fields.has_key('primary_network'): + primary_network = node_fields['primary_network'] + + if 'nodenetwork_id' not in primary_network: + raise PLCInvalidArgument, "Node network not specified" + if primary_network['nodenetwork_id'] not in self.caller['nodenetwork_ids']: + raise PLCInvalidArgument, "Node network not associated with calling node" + + nodenetworks = NodeNetworks(self.api, [primary_network['nodenetwork_id']]) + if not nodenetworks: + raise PLCInvalidArgument, "No such node network" + nodenetwork = nodenetworks[0] + + if not nodenetwork['is_primary']: + raise PLCInvalidArgument, "Not the primary node network on record" + + nodenetwork_fields = dict(filter(can_update, primary_network.items())) + nodenetwork.update(nodenetwork_fields) + nodenetwork.sync(commit = False) + + self.caller.sync(commit = True) + self.message = "Node updated: %s" % ", ".join(node_fields.keys()) + + return 1 diff --git a/trunk/PLC/Methods/DeleteAddress.py b/trunk/PLC/Methods/DeleteAddress.py new file mode 100644 index 0000000..d4f98bc --- /dev/null +++ b/trunk/PLC/Methods/DeleteAddress.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class DeleteAddress(Method): + """ + Deletes an address. + + PIs may only delete addresses from their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Address.fields['address_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_id): + # Get associated address details + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.delete() + + # Logging variables + self.event_objects = {'Address': [address['address_id']]} + self.message = 'Address %d deleted' % address['address_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeleteAddressType.py b/trunk/PLC/Methods/DeleteAddressType.py new file mode 100644 index 0000000..4fd1d9b --- /dev/null +++ b/trunk/PLC/Methods/DeleteAddressType.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +class DeleteAddressType(Method): + """ + Deletes an address type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_type_id_or_name): + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + address_type.delete() + self.event_objects = {'AddressType': [address_type['address_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteAddressTypeFromAddress.py b/trunk/PLC/Methods/DeleteAddressTypeFromAddress.py new file mode 100644 index 0000000..d4ea928 --- /dev/null +++ b/trunk/PLC/Methods/DeleteAddressTypeFromAddress.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class DeleteAddressTypeFromAddress(Method): + """ + Deletes an address type from the specified address. + + PIs may only update addresses of their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']), + Address.fields['address_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, address_type_id_or_name, address_id): + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.remove_address_type(address_type) + self.event_objects = {'Address' : [address['address_id']], + 'AddressType': [address_type['address_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteBootState.py b/trunk/PLC/Methods/DeleteBootState.py new file mode 100644 index 0000000..507fc7b --- /dev/null +++ b/trunk/PLC/Methods/DeleteBootState.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.BootStates import BootState, BootStates +from PLC.Auth import Auth + +class DeleteBootState(Method): + """ + Deletes a node boot state. + + WARNING: This will cause the deletion of all nodes in this boot + state. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + BootState.fields['boot_state'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + boot_states = BootStates(self.api, [name]) + if not boot_states: + raise PLCInvalidArgument, "No such boot state" + boot_state = boot_states[0] + + boot_state.delete() + + return 1 diff --git a/trunk/PLC/Methods/DeleteConfFile.py b/trunk/PLC/Methods/DeleteConfFile.py new file mode 100644 index 0000000..f05ae43 --- /dev/null +++ b/trunk/PLC/Methods/DeleteConfFile.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +class DeleteConfFile(Method): + """ + Returns an array of structs containing details about node + configuration files. If conf_file_ids is specified, only the + specified configuration files will be queried. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, conf_file_id): + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + + conf_file = conf_files[0] + conf_file.delete() + self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteConfFileFromNode.py b/trunk/PLC/Methods/DeleteConfFileFromNode.py new file mode 100644 index 0000000..50b08e6 --- /dev/null +++ b/trunk/PLC/Methods/DeleteConfFileFromNode.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class DeleteConfFileFromNode(Method): + """ + Deletes a configuration file from the specified node. If the node + is not linked to the configuration file, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, conf_file_id, node_id_or_hostname): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + # Link configuration file to node + if node['node_id'] in conf_file['node_ids']: + conf_file.remove_node(node) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'Node': [node['node_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteConfFileFromNodeGroup.py b/trunk/PLC/Methods/DeleteConfFileFromNodeGroup.py new file mode 100644 index 0000000..5504b0f --- /dev/null +++ b/trunk/PLC/Methods/DeleteConfFileFromNodeGroup.py @@ -0,0 +1,49 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +class DeleteConfFileFromNodeGroup(Method): + """ + Deletes a configuration file from the specified nodegroup. If the nodegroup + is not linked to the configuration file, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, conf_file_id, nodegroup_id_or_name): + # Get configuration file + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + conf_file = conf_files[0] + + # Get nodegroup + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + nodegroup = nodegroups[0] + + # Link configuration file to nodegroup + if nodegroup['nodegroup_id'] in conf_file['nodegroup_ids']: + conf_file.remove_nodegroup(nodegroup) + + # Log affected objects + self.event_objects = {'ConfFile': [conf_file_id], + 'NodeGroup': [nodegroup['nodegroup_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteInitScript.py b/trunk/PLC/Methods/DeleteInitScript.py new file mode 100644 index 0000000..47a9993 --- /dev/null +++ b/trunk/PLC/Methods/DeleteInitScript.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class DeleteInitScript(Method): + """ + Deletes an existing initscript. + + Returns 1 if successfuli, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + InitScript.fields['initscript_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, initscript_id): + initscripts = InitScripts(self.api, [initscript_id]) + if not initscripts: + raise PLCInvalidArgument, "No such initscript" + + initscript = initscripts[0] + initscript.delete() + self.event_objects = {'InitScript': [initscript['initscript_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteKey.py b/trunk/PLC/Methods/DeleteKey.py new file mode 100644 index 0000000..86c16a5 --- /dev/null +++ b/trunk/PLC/Methods/DeleteKey.py @@ -0,0 +1,46 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class DeleteKey(Method): + """ + Deletes a key. + + Non-admins may only delete their own keys. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + Key.fields['key_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, key_id): + # Get associated key details + keys = Keys(self.api, [key_id]) + if not keys: + raise PLCInvalidArgument, "No such key" + key = keys[0] + + if key['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local key" + + if 'admin' not in self.caller['roles']: + if key['key_id'] not in self.caller['key_ids']: + raise PLCPermissionDenied, "Key must be associated with your account" + + key.delete() + + # Logging variables + self.event_objects = {'Key': [key['key_id']]} + self.message = 'Key %d deleted' % key['key_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeleteKeyType.py b/trunk/PLC/Methods/DeleteKeyType.py new file mode 100644 index 0000000..e09e5c5 --- /dev/null +++ b/trunk/PLC/Methods/DeleteKeyType.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import Auth + +class DeleteKeyType(Method): + """ + Deletes a key type. + + WARNING: This will cause the deletion of all keys of this type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + KeyType.fields['key_type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + key_types = KeyTypes(self.api, [name]) + if not key_types: + raise PLCInvalidArgument, "No such key type" + key_type = key_types[0] + + key_type.delete() + + return 1 diff --git a/trunk/PLC/Methods/DeleteMessage.py b/trunk/PLC/Methods/DeleteMessage.py new file mode 100644 index 0000000..4989942 --- /dev/null +++ b/trunk/PLC/Methods/DeleteMessage.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +class DeleteMessage(Method): + """ + Deletes a message template. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Message.fields['message_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, message_id): + # Get message information + messages = Messages(self.api, [message_id]) + if not messages: + raise PLCInvalidArgument, "No such message" + message = messages[0] + + message.delete() + self.event_objects = {'Message': [message['message_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteNetworkMethod.py b/trunk/PLC/Methods/DeleteNetworkMethod.py new file mode 100644 index 0000000..d0f982e --- /dev/null +++ b/trunk/PLC/Methods/DeleteNetworkMethod.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import Auth + +class DeleteNetworkMethod(Method): + """ + Deletes a network method. + + WARNING: This will cause the deletion of all network interfaces + that use this method. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkMethod.fields['method'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_methods = NetworkMethods(self.api, [name]) + if not network_methods: + raise PLCInvalidArgument, "No such network method" + network_method = network_methods[0] + + network_method.delete() + + return 1 diff --git a/trunk/PLC/Methods/DeleteNetworkType.py b/trunk/PLC/Methods/DeleteNetworkType.py new file mode 100644 index 0000000..a02f6e0 --- /dev/null +++ b/trunk/PLC/Methods/DeleteNetworkType.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import Auth + +class DeleteNetworkType(Method): + """ + Deletes a network type. + + WARNING: This will cause the deletion of all network interfaces + that use this type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + NetworkType.fields['type'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, name): + network_types = NetworkTypes(self.api, [name]) + if not network_types: + raise PLCInvalidArgument, "No such network type" + network_type = network_types[0] + + network_type.delete() + + return 1 diff --git a/trunk/PLC/Methods/DeleteNode.py b/trunk/PLC/Methods/DeleteNode.py new file mode 100644 index 0000000..bc92718 --- /dev/null +++ b/trunk/PLC/Methods/DeleteNode.py @@ -0,0 +1,52 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes + +class DeleteNode(Method): + """ + Mark an existing node as deleted. + + PIs and techs may only delete nodes at their own sites. ins may + delete nodes at any site. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname): + # Get account information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + # Authenticated function + assert self.caller is not None + + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete nodes from specified site" + + node.delete() + + # Logging variables + self.event_objects = {'Node': [node['node_id']]} + self.message = "Node %d deleted" % node['node_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeleteNodeFromNodeGroup.py b/trunk/PLC/Methods/DeleteNodeFromNodeGroup.py new file mode 100644 index 0000000..2bc6770 --- /dev/null +++ b/trunk/PLC/Methods/DeleteNodeFromNodeGroup.py @@ -0,0 +1,53 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class DeleteNodeFromNodeGroup(Method): + """ + Removes a node from the specified node group. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, node_id_or_hostname, nodegroup_id_or_name): + # Get node info + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + + node = nodes[0] + + # Get nodegroup info + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + + nodegroup = nodegroups[0] + + # Remove node from nodegroup + if node['node_id'] in nodegroup['node_ids']: + nodegroup.remove_node(node) + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']], + 'Node': [node['node_id']]} + self.message = 'node %d deleted from node group %d' % \ + (node['node_id'], nodegroup['nodegroup_id']) + + return 1 diff --git a/trunk/PLC/Methods/DeleteNodeFromPCU.py b/trunk/PLC/Methods/DeleteNodeFromPCU.py new file mode 100644 index 0000000..8e728ef --- /dev/null +++ b/trunk/PLC/Methods/DeleteNodeFromPCU.py @@ -0,0 +1,65 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class DeleteNodeFromPCU(Method): + """ + Deletes a node from a PCU. + + Non-admins may only update PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + PCU.fields['pcu_id'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname, pcu_id): + # Get node + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + + node = nodes[0] + + # Get PCU + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + ok = False + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + if pcu['pcu_id'] in site['pcu_ids']: + ok = True + break + if not ok: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + # Removed node from PCU + + if node['node_id'] in pcu['node_ids']: + pcu.remove_node(node) + + # Logging variables + self.event_objects = {'PCU': [pcu['pcu_id']], + 'Node': [node['node_id']]} + self.message = 'Node %d removed from PCU %d' % \ + (node['node_id'], pcu['pcu_id']) + + return 1 diff --git a/trunk/PLC/Methods/DeleteNodeGroup.py b/trunk/PLC/Methods/DeleteNodeGroup.py new file mode 100644 index 0000000..7650150 --- /dev/null +++ b/trunk/PLC/Methods/DeleteNodeGroup.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.NodeGroups import NodeGroup, NodeGroups + +class DeleteNodeGroup(Method): + """ + Delete an existing Node Group. + + ins may delete any node group + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, node_group_id_or_name): + # Get account information + nodegroups = NodeGroups(self.api, [node_group_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such node group" + + nodegroup = nodegroups[0] + + nodegroup.delete() + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']]} + self.message = 'Node group %d deleted' % nodegroup['nodegroup_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeleteNodeNetwork.py b/trunk/PLC/Methods/DeleteNodeNetwork.py new file mode 100644 index 0000000..4bdda21 --- /dev/null +++ b/trunk/PLC/Methods/DeleteNodeNetwork.py @@ -0,0 +1,57 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +class DeleteNodeNetwork(Method): + """ + Deletes an existing node network interface. + + Admins may delete any node network. PIs and techs may only delete + node network interfaces associated with nodes at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + NodeNetwork.fields['nodenetwork_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, nodenetwork_id): + + # Get node network information + nodenetworks = NodeNetworks(self.api, [nodenetwork_id]) + if not nodenetworks: + raise PLCInvalidArgument, "No such node network" + nodenetwork = nodenetworks[0] + + # Get node information + nodes = Nodes(self.api, [nodenetwork['node_id']]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + # Authenticated functino + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete this node network" + + nodenetwork.delete() + + # Logging variables + self.event_objects = {'NodeNetwork': [nodenetwork['nodenetwork_id']]} + self.message = "Node network %d deleted" % nodenetwork['nodenetwork_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeleteNodeNetworkSetting.py b/trunk/PLC/Methods/DeleteNodeNetworkSetting.py new file mode 100644 index 0000000..eae2112 --- /dev/null +++ b/trunk/PLC/Methods/DeleteNodeNetworkSetting.py @@ -0,0 +1,73 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +from PLC.Nodes import Node, Nodes +from PLC.Sites import Site, Sites + +class DeleteNodeNetworkSetting(Method): + """ + Deletes the specified nodenetwork setting + + Attributes may require the caller to have a particular role in order + to be deleted, depending on the related nodenetwork setting type. + Admins may delete attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + NodeNetworkSetting.fields['nodenetwork_setting_id'] + ] + + returns = Parameter(int, '1 if successful') + + object_type = 'NodeNetwork' + + + def call(self, auth, nodenetwork_setting_id): + nodenetwork_settings = NodeNetworkSettings(self.api, [nodenetwork_setting_id]) + if not nodenetwork_settings: + raise PLCInvalidArgument, "No such nodenetwork setting %r"%nodenetwork_setting_id + nodenetwork_setting = nodenetwork_settings[0] + + ### reproducing a check from UpdateSliceAttribute, looks dumb though + nodenetworks = NodeNetworks(self.api, [nodenetwork_setting['nodenetwork_id']]) + if not nodenetworks: + raise PLCInvalidArgument, "No such nodenetwork %r"%nodenetwork_setting['nodenetwork_id'] + nodenetwork = nodenetworks[0] + + assert nodenetwork_setting['nodenetwork_setting_id'] in nodenetwork['nodenetwork_setting_ids'] + + # check permission : it not admin, is the user affiliated with the right site + if 'admin' not in self.caller['roles']: + # locate node + node = Nodes (self.api,[nodenetwork['node_id']])[0] + # locate site + site = Sites (self.api, [node['site_id']])[0] + # check caller is affiliated with this site + if self.caller['person_id'] not in site['person_ids']: + raise PLCPermissionDenied, "Not a member of the hosting site %s"%site['abbreviated_site'] + + required_min_role = nodenetwork_setting_type ['min_role_id'] + if required_min_role is not None and \ + min(self.caller['role_ids']) > required_min_role: + raise PLCPermissionDenied, "Not allowed to modify the specified nodenetwork setting, requires role %d",required_min_role + + nodenetwork_setting.delete() + self.object_ids = [nodenetwork_setting['nodenetwork_setting_id']] + + return 1 diff --git a/trunk/PLC/Methods/DeleteNodeNetworkSettingType.py b/trunk/PLC/Methods/DeleteNodeNetworkSettingType.py new file mode 100644 index 0000000..dc52d10 --- /dev/null +++ b/trunk/PLC/Methods/DeleteNodeNetworkSettingType.py @@ -0,0 +1,39 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.Auth import Auth + +class DeleteNodeNetworkSettingType(Method): + """ + Deletes the specified nodenetwork setting type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, nodenetwork_setting_type_id_or_name): + nodenetwork_setting_types = NodeNetworkSettingTypes(self.api, [nodenetwork_setting_type_id_or_name]) + if not nodenetwork_setting_types: + raise PLCInvalidArgument, "No such nodenetwork settnig type" + nodenetwork_setting_type = nodenetwork_setting_types[0] + + nodenetwork_setting_type.delete() + self.object_ids = [nodenetwork_setting_type['nodenetwork_setting_type_id']] + + return 1 diff --git a/trunk/PLC/Methods/DeletePCU.py b/trunk/PLC/Methods/DeletePCU.py new file mode 100644 index 0000000..944882b --- /dev/null +++ b/trunk/PLC/Methods/DeletePCU.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class DeletePCU(Method): + """ + Deletes a PCU. + + Non-admins may only delete PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, pcu_id): + # Get associated PCU details + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + if pcu['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + pcu.delete() + + # Logging variables + self.event_objects = {'PCU': [pcu['pcu_id']]} + self.message = 'PCU %d deleted' % pcu['pcu_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeletePCUProtocolType.py b/trunk/PLC/Methods/DeletePCUProtocolType.py new file mode 100644 index 0000000..ab66520 --- /dev/null +++ b/trunk/PLC/Methods/DeletePCUProtocolType.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.Auth import Auth + +class DeletePCUProtocolType(Method): + """ + Deletes a PCU protocol type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + PCUProtocolType.fields['pcu_protocol_type_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, protocol_type_id): + protocol_types = PCUProtocolTypes(self.api, [protocol_type_id]) + if not protocol_types: + raise PLCInvalidArgument, "No such pcu protocol type" + + protocol_type = protocol_types[0] + protocol_type.delete() + self.event_objects = {'PCUProtocolType': [protocol_type['pcu_protocol_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeletePCUType.py b/trunk/PLC/Methods/DeletePCUType.py new file mode 100644 index 0000000..d73c204 --- /dev/null +++ b/trunk/PLC/Methods/DeletePCUType.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +class DeletePCUType(Method): + """ + Deletes a PCU type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + PCUType.fields['pcu_type_id'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, pcu_type_id): + pcu_types = PCUTypes(self.api, [pcu_type_id]) + if not pcu_types: + raise PLCInvalidArgument, "No such pcu type" + + pcu_type = pcu_types[0] + pcu_type.delete() + self.event_objects = {'PCUType': [pcu_type['pcu_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeletePeer.py b/trunk/PLC/Methods/DeletePeer.py new file mode 100644 index 0000000..4260d25 --- /dev/null +++ b/trunk/PLC/Methods/DeletePeer.py @@ -0,0 +1,38 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Peers import Peer, Peers + +class DeletePeer(Method): + """ + Mark an existing peer as deleted. All entities (e.g., slices, + keys, nodes, etc.) for which this peer is authoritative will also + be deleted or marked as deleted. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Peer.fields['peer_id'], + Peer.fields['peername']) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, auth, peer_id_or_name): + # Get account information + peers = Peers(self.api, [peer_id_or_name]) + if not peers: + raise PLCInvalidArgument, "No such peer" + + peer = peers[0] + peer.delete() + + # Log affected objects + self.event_objects = {'Peer': [peer['peer_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeletePerson.py b/trunk/PLC/Methods/DeletePerson.py new file mode 100644 index 0000000..448f808 --- /dev/null +++ b/trunk/PLC/Methods/DeletePerson.py @@ -0,0 +1,51 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class DeletePerson(Method): + """ + Mark an existing account as deleted. + + Users and techs can only delete themselves. PIs can only delete + themselves and other non-PIs at their sites. ins can delete + anyone. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to delete specified account" + + person.delete() + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = 'Person %d deleted' % person['person_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeletePersonFromSite.py b/trunk/PLC/Methods/DeletePersonFromSite.py new file mode 100644 index 0000000..db2af2d --- /dev/null +++ b/trunk/PLC/Methods/DeletePersonFromSite.py @@ -0,0 +1,56 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class DeletePersonFromSite(Method): + """ + Removes the specified person from the specified site. If the + person is not a member of the specified site, no error is + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, site_id_or_login_base): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + if site['site_id'] in person['site_ids']: + site.remove_person(person) + + # Logging variables + self.event_objects = {'Site': [site['site_id']], + 'Person': [person['person_id']]} + self.message = 'Person %d deleted from site %d ' % \ + (person['person_id'], site['site_id']) + return 1 diff --git a/trunk/PLC/Methods/DeletePersonFromSlice.py b/trunk/PLC/Methods/DeletePersonFromSlice.py new file mode 100644 index 0000000..c990ccd --- /dev/null +++ b/trunk/PLC/Methods/DeletePersonFromSlice.py @@ -0,0 +1,59 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeletePersonFromSlice(Method): + """ + Deletes the specified person from the specified slice. If the person is + not a member of the slice, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, slice_id_or_name): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # N.B. Allow foreign users to be added to local slices and + # local users to be added to foreign slices (and, of course, + # local users to be added to local slices). + if person['peer_id'] is not None and slice['peer_id'] is not None: + raise PLCInvalidArgument, "Cannot delete foreign users from foreign slices" + + # If we are not admin, make sure the caller is a pi + # of the site associated with the slice + if 'admin' not in self.caller['roles']: + if slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete users from this slice" + + if slice['slice_id'] in person['slice_ids']: + slice.remove_person(person) + + self.event_objects = {'Slice': [slice['slice_id']], + 'Person': [person['person_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteRole.py b/trunk/PLC/Methods/DeleteRole.py new file mode 100644 index 0000000..f707280 --- /dev/null +++ b/trunk/PLC/Methods/DeleteRole.py @@ -0,0 +1,38 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Roles import Role, Roles +from PLC.Auth import Auth + +class DeleteRole(Method): + """ + Deletes a role. + + WARNING: This will remove the specified role from all accounts + that possess it, and from all node and slice attributes that refer + to it. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Role.fields['role_id'], + Role.fields['name']) + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, role_id_or_name): + roles = Roles(self.api, [role_id_or_name]) + if not roles: + raise PLCInvalidArgument, "No such role" + role = roles[0] + + role.delete() + self.event_objects = {'Role': [role['role_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteRoleFromPerson.py b/trunk/PLC/Methods/DeleteRoleFromPerson.py new file mode 100644 index 0000000..151ba25 --- /dev/null +++ b/trunk/PLC/Methods/DeleteRoleFromPerson.py @@ -0,0 +1,67 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth +from PLC.Roles import Role, Roles + +class DeleteRoleFromPerson(Method): + """ + Deletes the specified role from the person. + + PIs can only revoke the tech and user roles from users and techs + at their sites. ins can revoke any role from any user. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Mixed(Role.fields['role_id'], + Role.fields['name']), + Mixed(Person.fields['person_id'], + Person.fields['email']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, role_id_or_name, person_id_or_email): + # Get role + roles = Roles(self.api, [role_id_or_name]) + if not roles: + raise PLCInvalidArgument, "Invalid role '%s'" % unicode(role_id_or_name) + role = roles[0] + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Can only revoke lesser (higher) roles from others + if 'admin' not in self.caller['roles'] and \ + role['role_id'] <= min(self.caller['role_ids']): + raise PLCPermissionDenied, "Not allowed to revoke that role" + + if role['role_id'] in person['role_ids']: + person.remove_role(role) + + # Logging variables + self.event_objects = {'Person': [person['person_id']], + 'Role': [role['role_id']]} + self.message = "Role %d revoked from person %d" % \ + (role['role_id'], person['person_id']) + + return 1 diff --git a/trunk/PLC/Methods/DeleteSession.py b/trunk/PLC/Methods/DeleteSession.py new file mode 100644 index 0000000..3898f51 --- /dev/null +++ b/trunk/PLC/Methods/DeleteSession.py @@ -0,0 +1,30 @@ +import time + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import SessionAuth +from PLC.Sessions import Session, Sessions + +class DeleteSession(Method): + """ + Invalidates the current session. + + Returns 1 if successful. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + accepts = [SessionAuth()] + returns = Parameter(int, '1 if successful') + + + def call(self, auth): + assert auth.has_key('session') + + sessions = Sessions(self.api, [auth['session']]) + if not sessions: + raise PLCAPIError, "No such session" + session = sessions[0] + + session.delete() + + return 1 diff --git a/trunk/PLC/Methods/DeleteSite.py b/trunk/PLC/Methods/DeleteSite.py new file mode 100644 index 0000000..c23fff4 --- /dev/null +++ b/trunk/PLC/Methods/DeleteSite.py @@ -0,0 +1,46 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class DeleteSite(Method): + """ + Mark an existing site as deleted. The accounts of people who are + not members of at least one other non-deleted site will also be + marked as deleted. Nodes, PCUs, and slices associated with the + site will be deleted. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, site_id_or_login_base): + # Get account information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + site.delete() + + # Logging variables + self.event_objects = {'Site': [site['site_id']]} + self.message = 'Site %d deleted' % site['site_id'] + + return 1 diff --git a/trunk/PLC/Methods/DeleteSlice.py b/trunk/PLC/Methods/DeleteSlice.py new file mode 100644 index 0000000..297f8a9 --- /dev/null +++ b/trunk/PLC/Methods/DeleteSlice.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeleteSlice(Method): + """ + Deletes the specified slice. + + Users may only delete slices of which they are members. PIs may + delete any of the slices at their sites, or any slices of which + they are members. Admins may delete any slice. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + slice.delete() + self.event_objects = {'Slice': [slice['slice_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteSliceAttribute.py b/trunk/PLC/Methods/DeleteSliceAttribute.py new file mode 100644 index 0000000..06a99f3 --- /dev/null +++ b/trunk/PLC/Methods/DeleteSliceAttribute.py @@ -0,0 +1,59 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +class DeleteSliceAttribute(Method): + """ + Deletes the specified slice or sliver attribute. + + Attributes may require the caller to have a particular role in + order to be deleted. Users may only delete attributes of + slices or slivers of which they are members. PIs may only delete + attributes of slices or slivers at their sites, or of which they + are members. Admins may delete attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + SliceAttribute.fields['slice_attribute_id'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_attribute_id): + slice_attributes = SliceAttributes(self.api, [slice_attribute_id]) + if not slice_attributes: + raise PLCInvalidArgument, "No such slice attribute" + slice_attribute = slice_attributes[0] + + slices = Slices(self.api, [slice_attribute['slice_id']]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + assert slice_attribute['slice_attribute_id'] in slice['slice_attribute_ids'] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if slice_attribute['min_role_id'] is not None and \ + min(self.caller['role_ids']) > slice_attribute['min_role_id']: + raise PLCPermissioinDenied, "Not allowed to delete the specified attribute" + + slice_attribute.delete() + self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteSliceAttributeType.py b/trunk/PLC/Methods/DeleteSliceAttributeType.py new file mode 100644 index 0000000..e6c1a8a --- /dev/null +++ b/trunk/PLC/Methods/DeleteSliceAttributeType.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Auth import Auth + +class DeleteSliceAttributeType(Method): + """ + Deletes the specified slice attribute. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(SliceAttributeType.fields['attribute_type_id'], + SliceAttributeType.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, attribute_type_id_or_name): + attribute_types = SliceAttributeTypes(self.api, [attribute_type_id_or_name]) + if not attribute_types: + raise PLCInvalidArgument, "No such slice attribute type" + attribute_type = attribute_types[0] + + attribute_type.delete() + self.event_objects = {'AttributeType': [attribute_type['attribute_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteSliceFromNodes.py b/trunk/PLC/Methods/DeleteSliceFromNodes.py new file mode 100644 index 0000000..2390be5 --- /dev/null +++ b/trunk/PLC/Methods/DeleteSliceFromNodes.py @@ -0,0 +1,58 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeleteSliceFromNodes(Method): + """ + Deletes the specified slice from the specified nodes. If the slice is + not associated with a node, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + # Remove slice from all nodes found + + # Get specified nodes + nodes = Nodes(self.api, node_id_or_hostname_list) + for node in nodes: + if slice['peer_id'] is not None and node['peer_id'] is not None: + raise PLCPermissionDenied, "Not allowed to remove peer slice from peer node" + if slice['slice_id'] in node['slice_ids']: + slice.remove_node(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteSliceFromNodesWhitelist.py b/trunk/PLC/Methods/DeleteSliceFromNodesWhitelist.py new file mode 100644 index 0000000..8899d88 --- /dev/null +++ b/trunk/PLC/Methods/DeleteSliceFromNodesWhitelist.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class DeleteSliceFromNodesWhitelist(Method): + """ + Deletes the specified slice from the whitelist on the specified nodes. Nodes may be + either local or foreign nodes. + + If the slice is already associated with a node, no errors are + returned. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [Mixed(Node.fields['node_id'], + Node.fields['hostname'])] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, node_id_or_hostname_list): + # Get slice information + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + # Get specified nodes, add them to the slice + nodes = Nodes(self.api, node_id_or_hostname_list) + for node in nodes: + if node['peer_id'] is not None: + raise PLCInvalidArgument, "%s not a local node" % node['hostname'] + if slice['slice_id'] in node['slice_ids_whitelist']: + slice.delete_from_node_whitelist(node, commit = False) + + slice.sync() + + self.event_objects = {'Node': [node['node_id'] for node in nodes], + 'Slice': [slice['slice_id']]} + + return 1 diff --git a/trunk/PLC/Methods/DeleteSliceInstantiation.py b/trunk/PLC/Methods/DeleteSliceInstantiation.py new file mode 100644 index 0000000..5098a9d --- /dev/null +++ b/trunk/PLC/Methods/DeleteSliceInstantiation.py @@ -0,0 +1,34 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Auth import Auth + +class DeleteSliceInstantiation(Method): + """ + Deletes a slice instantiation state. + + WARNING: This will cause the deletion of all slices of this instantiation. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + SliceInstantiation.fields['instantiation'] + ] + + returns = Parameter(int, '1 if successful') + + + def call(self, auth, instantiation): + slice_instantiations = SliceInstantiations(self.api, [instantiation]) + if not slice_instantiations: + raise PLCInvalidArgument, "No such slice instantiation state" + slice_instantiation = slice_instantiations[0] + + slice_instantiation.delete() + + return 1 diff --git a/trunk/PLC/Methods/GenerateNodeConfFile.py b/trunk/PLC/Methods/GenerateNodeConfFile.py new file mode 100644 index 0000000..0b5cf8e --- /dev/null +++ b/trunk/PLC/Methods/GenerateNodeConfFile.py @@ -0,0 +1,107 @@ +import random +import base64 + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +class GenerateNodeConfFile(Method): + """ + Creates a new node configuration file if all network settings are + present. This function will generate a new node key for the + specified node, effectively invalidating any old configuration + files. + + Non-admins can only generate files for nodes at their sites. + + Returns the contents of the file if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Parameter(bool, "True if you want to regenerate node key") + ] + + returns = Parameter(str, "Node configuration file") + + def call(self, auth, node_id_or_hostname, regenerate_node_key = True): + # Get node information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to generate a configuration file for that node" + + # Get node networks for this node + primary = None + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + primary = nodenetwork + break + if primary is None: + raise PLCInvalidArgument, "No primary network configured" + + # Split hostname into host and domain parts + parts = node['hostname'].split(".", 1) + if len(parts) < 2: + raise PLCInvalidArgument, "Node hostname is invalid" + host = parts[0] + domain = parts[1] + + if regenerate_node_key: + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + node['key'] = base64.b64encode("".join(map(chr, bytes))) + # XXX Boot Manager cannot handle = in the key + node['key'] = node['key'].replace("=", "") + # Save it + node.sync() + + # Generate node configuration file suitable for BootCD + file = "" + + file += 'NODE_ID="%d"\n' % node['node_id'] + file += 'NODE_KEY="%s"\n' % node['key'] + + if primary['mac']: + file += 'NET_DEVICE="%s"\n' % primary['mac'].lower() + + file += 'IP_METHOD="%s"\n' % primary['method'] + + if primary['method'] == 'static': + file += 'IP_ADDRESS="%s"\n' % primary['ip'] + file += 'IP_GATEWAY="%s"\n' % primary['gateway'] + file += 'IP_NETMASK="%s"\n' % primary['netmask'] + file += 'IP_NETADDR="%s"\n' % primary['network'] + file += 'IP_BROADCASTADDR="%s"\n' % primary['broadcast'] + file += 'IP_DNS1="%s"\n' % primary['dns1'] + file += 'IP_DNS2="%s"\n' % (primary['dns2'] or "") + + file += 'HOST_NAME="%s"\n' % host + file += 'DOMAIN_NAME="%s"\n' % domain + + for nodenetwork in nodenetworks: + if nodenetwork['method'] == 'ipmi': + file += 'IPMI_ADDRESS="%s"\n' % nodenetwork['ip'] + if nodenetwork['mac']: + file += 'IPMI_MAC="%s"\n' % nodenetwork['mac'].lower() + break + + return file diff --git a/trunk/PLC/Methods/GetAddressTypes.py b/trunk/PLC/Methods/GetAddressTypes.py new file mode 100644 index 0000000..d10be73 --- /dev/null +++ b/trunk/PLC/Methods/GetAddressTypes.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +class GetAddressTypes(Method): + """ + Returns an array of structs containing details about address + types. If address_type_filter is specified and is an array of + address type identifiers, or a struct of address type attributes, + only address types matching the filter will be returned. If + return_fields is specified, only the specified details will be + returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name'])], + Filter(AddressType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [AddressType.fields] + + + def call(self, auth, address_type_filter = None, return_fields = None): + return AddressTypes(self.api, address_type_filter, return_fields) diff --git a/trunk/PLC/Methods/GetAddresses.py b/trunk/PLC/Methods/GetAddresses.py new file mode 100644 index 0000000..b299295 --- /dev/null +++ b/trunk/PLC/Methods/GetAddresses.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +class GetAddresses(Method): + """ + Returns an array of structs containing details about addresses. If + address_filter is specified and is an array of address + identifiers, or a struct of address attributes, only addresses + matching the filter will be returned. If return_fields is + specified, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Address.fields['address_id']], + Filter(Address.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Address.fields] + + + def call(self, auth, address_filter = None, return_fields = None): + return Addresses(self.api, address_filter, return_fields) diff --git a/trunk/PLC/Methods/GetBootMedium.py b/trunk/PLC/Methods/GetBootMedium.py new file mode 100644 index 0000000..5daac9b --- /dev/null +++ b/trunk/PLC/Methods/GetBootMedium.py @@ -0,0 +1,400 @@ +import random +import base64 +import os +import os.path + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings + +# +# xxx todo +# Thierry on june 5 2007 +# +# it turns out that having either apache (when invoked through xmlrpc) +# or root (when running plcsh directly) run this piece of code is +# problematic. In fact although we try to create intermediate dirs +# with mode 777, what happens is that root's umask in the plc chroot +# jail is set to 0022. +# +# the bottom line is, depending on who (apache or root) runs this for +# the first time, we can access denied issued (when root comes first) +# so probably we'd better implement a scheme where files are stored +# directly under /var/tmp or something +# +# in addition the sequels of a former run (e.g. with a non-empty +# filename) can prevent subsequent runs if the file is not properly +# cleaned up after use, which is generally the case if someone invokes +# this through plcsh and does not clean up +# so maybe a dedicated cleanup method could be useful just in case +# + +# could not define this in the class.. +boot_medium_actions = [ 'node-preview', + 'node-floppy', + 'node-iso', + 'node-usb', + 'generic-iso', + 'generic-usb', + ] + +class GetBootMedium(Method): + """ + This method is a redesign based on former, supposedly dedicated, + AdmGenerateNodeConfFile + + As compared with its ancestor, this method provides a much more detailed + detailed interface, that allows to + (*) either just preview the node config file (in which case + the node key is NOT recomputed, and NOT provided in the output + (*) or regenerate the node config file for storage on a floppy + that is, exactly what the ancestor method used todo, + including renewing the node's key + (*) or regenerate the config file and bundle it inside an ISO or USB image + (*) or just provide the generic ISO or USB boot images + in which case of course the node_id_or_hostname parameter is not used + + action is expected among the following string constants + (*) node-preview + (*) node-floppy + (*) node-iso + (*) node-usb + (*) generic-iso + (*) generic-usb + + Apart for the preview mode, this method generates a new node key for the + specified node, effectively invalidating any old boot medium. + + Non-admins can only generate files for nodes at their sites. + + In addition, two return mechanisms are supported. + (*) The default behaviour is that the file's content is returned as a + base64-encoded string. This is how the ancestor method used to work. + To use this method, pass an empty string as the file parameter. + + (*) Or, for efficiency -- this makes sense only when the API is used + by the web pages that run on the same host -- the caller may provide + a filename, in which case the resulting file is stored in that location instead. + The filename argument can use the following markers, that are expanded + within the method + - %d : default root dir (some builtin dedicated area under /var/tmp/) + Using this is recommended, and enforced for non-admin users + - %n : the node's name when this makes sense, or a mktemp-like name when + generic media is requested + - %s : a file suffix appropriate in the context (.txt, .iso or the like) + - %v : the bootcd version string (e.g. 4.0) + - %p : the PLC name + With the file-based return mechanism, the method returns the full pathname + of the result file; it is the caller's responsability to remove + this file after use. + + Security: + When the user's role is not admin, the provided directory *must* be under + the %d area + + Housekeeping: + Whenever needed, the method stores intermediate files in a + private area, typically not located under the web server's + accessible area, and are cleaned up by the method. + + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + Parameter (str, "Action mode, expected in " + "|".join(boot_medium_actions)), + Parameter (str, "Empty string for verbatim result, resulting file full path otherwise"), + ] + + returns = Parameter(str, "Node boot medium, either inlined, or filename, depending to the filename parameter") + + BOOTCDDIR = "/usr/share/bootcd/" + BOOTCUSTOM = "/usr/share/bootcd/bootcustom.sh" + GENERICDIR = "/var/www/html/download/" + NODEDIR = "/var/tmp/bootmedium/results" + WORKDIR = "/var/tmp/bootmedium/work" + DEBUG = False + # uncomment this to preserve temporary area and bootcustom logs + #DEBUG = True + + ### returns (host, domain) : + # 'host' : host part of the hostname + # 'domain' : domain part of the hostname + def split_hostname (self, node): + # Split hostname into host and domain parts + parts = node['hostname'].split(".", 1) + if len(parts) < 2: + raise PLCInvalidArgument, "Node hostname %s is invalid"%node['hostname'] + return parts + + # plnode.txt content + def floppy_contents (self, node, renew_key): + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to generate a configuration file for %s"%node['hostname'] + + # Get node networks for this node + primary = None + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary']: + primary = nodenetwork + break + if primary is None: + raise PLCInvalidArgument, "No primary network configured on %s"%node['hostname'] + + ( host, domain ) = self.split_hostname (node) + + if renew_key: + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + node['key'] = base64.b64encode("".join(map(chr, bytes))) + # XXX Boot Manager cannot handle = in the key + node['key'] = node['key'].replace("=", "") + # Save it + node.sync() + + # Generate node configuration file suitable for BootCD + file = "" + + if renew_key: + file += 'NODE_ID="%d"\n' % node['node_id'] + file += 'NODE_KEY="%s"\n' % node['key'] + + if primary['mac']: + file += 'NET_DEVICE="%s"\n' % primary['mac'].lower() + + file += 'IP_METHOD="%s"\n' % primary['method'] + + if primary['method'] == 'static': + file += 'IP_ADDRESS="%s"\n' % primary['ip'] + file += 'IP_GATEWAY="%s"\n' % primary['gateway'] + file += 'IP_NETMASK="%s"\n' % primary['netmask'] + file += 'IP_NETADDR="%s"\n' % primary['network'] + file += 'IP_BROADCASTADDR="%s"\n' % primary['broadcast'] + file += 'IP_DNS1="%s"\n' % primary['dns1'] + file += 'IP_DNS2="%s"\n' % (primary['dns2'] or "") + + file += 'HOST_NAME="%s"\n' % host + file += 'DOMAIN_NAME="%s"\n' % domain + + # define various nodenetwork settings attached to the primary nodenetwork + settings = NodeNetworkSettings (self.api, {'nodenetwork_id':nodenetwork['nodenetwork_id']}) + + categories = set() + for setting in settings: + if setting['category'] is not None: + categories.add(setting['category']) + + for category in categories: + category_settings = NodeNetworkSettings(self.api,{'nodenetwork_id':nodenetwork['nodenetwork_id'], + 'category':category}) + if category_settings: + file += '### Category : %s\n'%category + for setting in category_settings: + file += '%s_%s="%s"\n'%(category.upper(),setting['name'].upper(),setting['value']) + + for nodenetwork in nodenetworks: + if nodenetwork['method'] == 'ipmi': + file += 'IPMI_ADDRESS="%s"\n' % nodenetwork['ip'] + if nodenetwork['mac']: + file += 'IPMI_MAC="%s"\n' % nodenetwork['mac'].lower() + break + + return file + + def bootcd_version (self): + try: + f = open (self.BOOTCDDIR + "/build/version.txt") + version=f.readline().strip() + finally: + f.close() + return version + + def cleandir (self,tempdir): + if not self.DEBUG: + os.system("rm -rf %s"%tempdir) + + def call(self, auth, node_id_or_hostname, action, filename): + + ### check action + if action not in boot_medium_actions: + raise PLCInvalidArgument, "Unknown action %s"%action + + ### compute file suffix + if action.find("-iso") >= 0 : + suffix=".iso" + elif action.find("-usb") >= 0: + suffix=".usb" + else: + suffix=".txt" + + ### compute a 8 bytes random number + tempbytes = random.sample (xrange(0,256), 8); + def hexa2 (c): + return chr((c>>4)+65) + chr ((c&16)+65) + temp = "".join(map(hexa2,tempbytes)) + + ### check node if needed + if action.find("node-") == 0: + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node %r"%node_id_or_hostname + node = nodes[0] + nodename = node['hostname'] + + else: + node = None + nodename = temp + + ### handle filename + filename = filename.replace ("%d",self.NODEDIR) + filename = filename.replace ("%n",nodename) + filename = filename.replace ("%s",suffix) + filename = filename.replace ("%p",self.api.config.PLC_NAME) + # only if filename contains "%v", bootcd is maybe not avail ? + if filename.find("%v") >=0: + filename = filename.replace ("%v",self.bootcd_version()) + + ### Check filename location + if filename != '': + if 'admin' not in self.caller['roles']: + if ( filename.index(self.NODEDIR) != 0): + raise PLCInvalidArgument, "File %s not under %s"%(filename,self.NODEDIR) + + ### output should not exist (concurrent runs ..) + if os.path.exists(filename): + raise PLCInvalidArgument, "Resulting file %s already exists"%filename + + ### we can now safely create the file, + ### either we are admin or under a controlled location + if not os.path.exists(os.path.dirname(filename)): + try: + os.makedirs (os.path.dirname(filename),0777) + except: + raise PLCPermissionDenied, "Could not create dir %s"%os.path.dirname(filename) + + + ### generic media + if action == 'generic-iso' or action == 'generic-usb': + # this raises an exception if bootcd is missing + version = self.bootcd_version() + generic_name = "%s-BootCD-%s%s"%(self.api.config.PLC_NAME, + version, + suffix) + generic_path = "%s/%s" % (self.GENERICDIR,generic_name) + + if filename: + ret=os.system ("cp %s %s"%(generic_path,filename)) + if ret==0: + return filename + else: + raise PLCPermissionDenied, "Could not copy %s into"%(generic_path,filename) + else: + ### return the generic medium content as-is, just base64 encoded + return base64.b64encode(file(generic_path).read()) + + ### floppy preview + if action == 'node-preview': + floppy = self.floppy_contents (node,False) + if filename: + try: + file(filename,'w').write(floppy) + except: + raise PLCPermissionDenied, "Could not write into %s"%filename + return filename + else: + return floppy + + if action == 'node-floppy': + floppy = self.floppy_contents (node,True) + if filename: + try: + file(filename,'w').write(floppy) + except: + raise PLCPermissionDenied, "Could not write into %s"%filename + return filename + else: + return floppy + + ### we're left with node-iso and node-usb + if action == 'node-iso' or action == 'node-usb': + + ### check we've got required material + version = self.bootcd_version() + generic_name = "%s-BootCD-%s%s"%(self.api.config.PLC_NAME, + version, + suffix) + generic_path = "%s/%s" % (self.GENERICDIR,generic_name) + if not os.path.isfile(generic_path): + raise PLCAPIError, "Cannot locate generic medium %s"%generic_path + + if not os.path.isfile(self.BOOTCUSTOM): + raise PLCAPIError, "Cannot locate bootcustom script %s"%self.BOOTCUSTOM + + # need a temporary area + tempdir = "%s/%s"%(self.WORKDIR,nodename) + if not os.path.isdir(tempdir): + try: + os.makedirs(tempdir,0777) + except: + raise PLCPermissionDenied, "Could not create dir %s"%tempdir + + try: + # generate floppy config + floppy = self.floppy_contents(node,True) + # store it + node_floppy = "%s/%s"%(tempdir,nodename) + try: + file(node_floppy,"w").write(floppy) + except: + raise PLCPermissionDenied, "Could not write into %s"%node_floppy + + # invoke bootcustom + bootcustom_command = 'sudo %s -C "%s" "%s" "%s"'%(self.BOOTCUSTOM, + tempdir, + generic_path, + node_floppy) + if self.DEBUG: + print 'bootcustom command:',bootcustom_command + ret=os.system(bootcustom_command) + if ret != 0: + raise PLCPermissionDenied,"bootcustom.sh failed to create node-specific medium" + + node_image = "%s/%s%s"%(tempdir,nodename,suffix) + if not os.path.isfile (node_image): + raise PLCAPIError,"Unexpected location of bootcustom output - %s"%node_image + + # cache result + if filename: + ret=os.system("mv %s %s"%(node_image,filename)) + if ret != 0: + raise PLCAPIError, "Could not move node image %s into %s"%(node_image,filename) + self.cleandir(tempdir) + return filename + else: + result = file(node_image).read() + self.cleandir(tempdir) + return base64.b64encode(result) + except: + self.cleandir(tempdir) + raise + + # we're done here, or we missed something + raise PLCAPIError,'Unhandled action %s'%action + diff --git a/trunk/PLC/Methods/GetBootStates.py b/trunk/PLC/Methods/GetBootStates.py new file mode 100644 index 0000000..4cd31be --- /dev/null +++ b/trunk/PLC/Methods/GetBootStates.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.BootStates import BootState, BootStates +from PLC.Auth import Auth + +class GetBootStates(Method): + """ + Returns an array of all valid node boot states. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [BootState.fields['boot_state']] + + + def call(self, auth): + return [boot_state['boot_state'] for boot_state in BootStates(self.api)] diff --git a/trunk/PLC/Methods/GetConfFiles.py b/trunk/PLC/Methods/GetConfFiles.py new file mode 100644 index 0000000..89d5250 --- /dev/null +++ b/trunk/PLC/Methods/GetConfFiles.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +class GetConfFiles(Method): + """ + Returns an array of structs containing details about configuration + files. If conf_file_filter is specified and is an array of + configuration file identifiers, or a struct of configuration file + attributes, only configuration files matching the filter will be + returned. If return_fields is specified, only the specified + details will be returned. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed([ConfFile.fields['conf_file_id']], + Filter(ConfFile.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [ConfFile.fields] + + + def call(self, auth, conf_file_filter = None, return_fields = None): + return ConfFiles(self.api, conf_file_filter, return_fields) diff --git a/trunk/PLC/Methods/GetEventObjects.py b/trunk/PLC/Methods/GetEventObjects.py new file mode 100644 index 0000000..02bcd68 --- /dev/null +++ b/trunk/PLC/Methods/GetEventObjects.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.EventObjects import EventObject, EventObjects +from PLC.Auth import Auth + +class GetEventObjects(Method): + """ + Returns an array of structs containing details about events and + faults. If event_filter is specified and is an array of event + identifiers, or a struct of event attributes, only events matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Filter(EventObject.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [EventObject.fields] + + def call(self, auth, event_filter = None, return_fields = None): + return EventObjects(self.api, event_filter, return_fields) + diff --git a/trunk/PLC/Methods/GetEvents.py b/trunk/PLC/Methods/GetEvents.py new file mode 100644 index 0000000..2bc989c --- /dev/null +++ b/trunk/PLC/Methods/GetEvents.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Events import Event, Events +from PLC.Auth import Auth + +class GetEvents(Method): + """ + Returns an array of structs containing details about events and + faults. If event_filter is specified and is an array of event + identifiers, or a struct of event attributes, only events matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed([Event.fields['event_id']], + Filter(Event.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Event.fields] + + def call(self, auth, event_filter = None, return_fields = None): + return Events(self.api, event_filter, return_fields) + diff --git a/trunk/PLC/Methods/GetInitScripts.py b/trunk/PLC/Methods/GetInitScripts.py new file mode 100644 index 0000000..d8bb0f5 --- /dev/null +++ b/trunk/PLC/Methods/GetInitScripts.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class GetInitScripts(Method): + """ + Returns an array of structs containing details about initscripts. + If initscript_filter is specified and is an array of initscript + identifiers, or a struct of initscript attributes, only initscripts + matching the filter will be returned. If return_fields is specified, + only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(InitScript.fields['initscript_id'], + InitScript.fields['name'])], + Filter(InitScript.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [InitScript.fields] + + + def call(self, auth, initscript_filter = None, return_fields = None): + return InitScripts(self.api, initscript_filter, return_fields) diff --git a/trunk/PLC/Methods/GetKeyTypes.py b/trunk/PLC/Methods/GetKeyTypes.py new file mode 100644 index 0000000..32bb658 --- /dev/null +++ b/trunk/PLC/Methods/GetKeyTypes.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import Auth + +class GetKeyTypes(Method): + """ + Returns an array of all valid key types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [KeyType.fields['key_type']] + + + def call(self, auth): + return [key_type['key_type'] for key_type in KeyTypes(self.api)] diff --git a/trunk/PLC/Methods/GetKeys.py b/trunk/PLC/Methods/GetKeys.py new file mode 100644 index 0000000..2d7550c --- /dev/null +++ b/trunk/PLC/Methods/GetKeys.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +class GetKeys(Method): + """ + Returns an array of structs containing details about keys. If + key_filter is specified and is an array of key identifiers, or a + struct of key attributes, only keys matching the filter will be + returned. If return_fields is specified, only the specified + details will be returned. + + Admin may query all keys. Non-admins may only query their own + keys. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Key.fields['key_id'])], + Filter(Key.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Key.fields] + + + def call(self, auth, key_filter = None, return_fields = None): + keys = Keys(self.api, key_filter, return_fields) + + # If we are not admin, make sure to only return our own keys + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + keys = filter(lambda key: key['key_id'] in self.caller['key_ids'], keys) + + return keys diff --git a/trunk/PLC/Methods/GetMessages.py b/trunk/PLC/Methods/GetMessages.py new file mode 100644 index 0000000..b0eb44e --- /dev/null +++ b/trunk/PLC/Methods/GetMessages.py @@ -0,0 +1,31 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +class GetMessages(Method): + """ + Returns an array of structs containing details about message + templates. If message template_filter is specified and is an array + of message template identifiers, or a struct of message template + attributes, only message templates matching the filter will be + returned. If return_fields is specified, only the specified + details will be returned. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed([Message.fields['message_id']], + Filter(Message.fields)), + Parameter([str], "List of fields to return", nullok = True), + ] + + returns = [Message.fields] + + + def call(self, auth, message_filter = None, return_fields = None): + return Messages(self.api, message_filter, return_fields) diff --git a/trunk/PLC/Methods/GetNetworkMethods.py b/trunk/PLC/Methods/GetNetworkMethods.py new file mode 100644 index 0000000..cee914a --- /dev/null +++ b/trunk/PLC/Methods/GetNetworkMethods.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +from PLC.Auth import Auth + +class GetNetworkMethods(Method): + """ + Returns a list of all valid network methods. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [NetworkMethod.fields['method']] + + + def call(self, auth): + return [network_method['method'] for network_method in NetworkMethods(self.api)] diff --git a/trunk/PLC/Methods/GetNetworkTypes.py b/trunk/PLC/Methods/GetNetworkTypes.py new file mode 100644 index 0000000..dbddd9f --- /dev/null +++ b/trunk/PLC/Methods/GetNetworkTypes.py @@ -0,0 +1,22 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.Auth import Auth + +class GetNetworkTypes(Method): + """ + Returns a list of all valid network types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [NetworkType.fields['type']] + + + def call(self, auth): + return [network_type['type'] for network_type in NetworkTypes(self.api)] diff --git a/trunk/PLC/Methods/GetNodeGroups.py b/trunk/PLC/Methods/GetNodeGroups.py new file mode 100644 index 0000000..f4927ef --- /dev/null +++ b/trunk/PLC/Methods/GetNodeGroups.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.NodeGroups import NodeGroup, NodeGroups + +class GetNodeGroups(Method): + """ + Returns an array of structs containing details about node groups. + If nodegroup_filter is specified and is an array of node group + identifiers or names, or a struct of node group attributes, only + node groups matching the filter will be returned. If return_fields + is specified, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name'])], + Filter(NodeGroup.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeGroup.fields] + + def call(self, auth, nodegroup_filter = None, return_fields = None): + return NodeGroups(self.api, nodegroup_filter, return_fields) diff --git a/trunk/PLC/Methods/GetNodeNetworkSettingTypes.py b/trunk/PLC/Methods/GetNodeNetworkSettingTypes.py new file mode 100644 index 0000000..10d7b39 --- /dev/null +++ b/trunk/PLC/Methods/GetNodeNetworkSettingTypes.py @@ -0,0 +1,33 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes + +class GetNodeNetworkSettingTypes(Method): + """ + Returns an array of structs containing details about + nodenetwork setting types. + + The usual filtering scheme applies on this method. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name'])], + Filter(NodeNetworkSettingType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeNetworkSettingType.fields] + + def call(self, auth, nodenetwork_setting_type_filter = None, return_fields = None): + return NodeNetworkSettingTypes(self.api, nodenetwork_setting_type_filter, return_fields) diff --git a/trunk/PLC/Methods/GetNodeNetworkSettings.py b/trunk/PLC/Methods/GetNodeNetworkSettings.py new file mode 100644 index 0000000..42359ce --- /dev/null +++ b/trunk/PLC/Methods/GetNodeNetworkSettings.py @@ -0,0 +1,45 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.Sites import Site, Sites +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +class GetNodeNetworkSettings(Method): + """ + Returns an array of structs containing details about + nodenetworks and related settings. + + If nodenetwork_setting_filter is specified and is an array of + nodenetwork setting identifiers, only nodenetwork settings matching + the filter will be returned. If return_fields is specified, only + the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([NodeNetworkSetting.fields['nodenetwork_setting_id']], + Parameter(int,"Nodenetwork setting id"), + Filter(NodeNetworkSetting.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeNetworkSetting.fields] + + + def call(self, auth, nodenetwork_setting_filter = None, return_fields = None): + + nodenetwork_settings = NodeNetworkSettings(self.api, nodenetwork_setting_filter, return_fields) + + return nodenetwork_settings diff --git a/trunk/PLC/Methods/GetNodeNetworks.py b/trunk/PLC/Methods/GetNodeNetworks.py new file mode 100644 index 0000000..150f87d --- /dev/null +++ b/trunk/PLC/Methods/GetNodeNetworks.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +class GetNodeNetworks(Method): + """ + Returns an array of structs containing details about node network + interfacess. If nodenetworks_filter is specified and is an array + of node network identifiers, or a struct of node network + fields and values, only node network interfaces matching the filter + will be returned. + + If return_fields is given, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([NodeNetwork.fields['nodenetwork_id']], + Parameter (int, "nodenetwork id"), + Filter(NodeNetwork.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [NodeNetwork.fields] + + def call(self, auth, nodenetwork_filter = None, return_fields = None): + return NodeNetworks(self.api, nodenetwork_filter, return_fields) diff --git a/trunk/PLC/Methods/GetNodes.py b/trunk/PLC/Methods/GetNodes.py new file mode 100644 index 0000000..8e2931a --- /dev/null +++ b/trunk/PLC/Methods/GetNodes.py @@ -0,0 +1,79 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class GetNodes(Method): + """ + Returns an array of structs containing details about nodes. If + node_filter is specified and is an array of node identifiers or + hostnames, or a struct of node attributes, only nodes matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Some fields may only be viewed by admins. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(Node.fields['node_id'], + Node.fields['hostname'])], + Parameter(str,"hostname"), + Parameter(int,"node_id"), + Filter(Node.fields)), + Parameter([str], "List of fields to return", nullok = True), + ] + + returns = [Node.fields] + + + def call(self, auth, node_filter = None, return_fields = None): + + # Must query at least slice_ids_whitelist + if return_fields is not None: + added_fields = set(['slice_ids_whitelist', 'site_id']).difference(return_fields) + return_fields += added_fields + else: + added_fields =[] + + # Get node information + nodes = Nodes(self.api, node_filter, return_fields) + + # Remove admin only fields + if not isinstance(self.caller, Person) or \ + 'admin' not in self.caller['roles']: + slice_ids = set() + site_ids = set() + if self.caller: + slice_ids.update(self.caller['slice_ids']) + site_ids.update(self.caller['site_ids']) + + # if node has whitelist, only return it if users is at + # the same site or user has a slice on the whitelist + for node in nodes[:]: + if 'site_id' in node and \ + site_ids.intersection([node['site_id']]): + continue + if 'slice_ids_whitelist' in node and \ + node['slice_ids_whitelist'] and \ + not slice_ids.intersection(node['slice_ids_whitelist']): + nodes.remove(node) + + # remove remaining admin only fields + for node in nodes: + for field in ['boot_nonce', 'key', 'session', 'root_person_ids']: + if field in node: + del node[field] + + # remove added fields if not specified + if added_fields: + for node in nodes: + for field in added_fields: + del node[field] + + return nodes diff --git a/trunk/PLC/Methods/GetPCUProtocolTypes.py b/trunk/PLC/Methods/GetPCUProtocolTypes.py new file mode 100644 index 0000000..44f9380 --- /dev/null +++ b/trunk/PLC/Methods/GetPCUProtocolTypes.py @@ -0,0 +1,40 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.Auth import Auth +from PLC.Filter import Filter + +class GetPCUProtocolTypes(Method): + """ + Returns an array of PCU Types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([PCUProtocolType.fields['pcu_type_id']], + Filter(PCUProtocolType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [PCUProtocolType.fields] + + + def call(self, auth, protocol_type_filter = None, return_fields = None): + + #Must query at least pcu_type_id + if return_fields is not None and 'pcu_protocol_type_id' not in return_fields: + return_fields.append('pcu_protocol_type_id') + added_fields = ['pcu_protocol_type_id'] + else: + added_fields = [] + + protocol_types = PCUProtocolTypes(self.api, protocol_type_filter, return_fields) + + for added_field in added_fields: + for protocol_type in protocol_types: + del protocol_type[added_field] + + return protocol_types diff --git a/trunk/PLC/Methods/GetPCUTypes.py b/trunk/PLC/Methods/GetPCUTypes.py new file mode 100644 index 0000000..cf0d689 --- /dev/null +++ b/trunk/PLC/Methods/GetPCUTypes.py @@ -0,0 +1,48 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth +from PLC.Filter import Filter + +class GetPCUTypes(Method): + """ + Returns an array of PCU Types. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([PCUType.fields['pcu_type_id'], + PCUType.fields['model']], + Filter(PCUType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [PCUType.fields] + + + def call(self, auth, pcu_type_filter = None, return_fields = None): + + #Must query at least pcu_type_id + if return_fields is not None: + added_fields = [] + if 'pcu_type_id' not in return_fields: + return_fields.append('pcu_type_id') + added_fields.append('pcu_type_id') + if 'pcu_protocol_types' in return_fields and \ + 'pcu_protocol_type_ids' not in return_fields: + return_fields.append('pcu_protocol_type_ids') + added_fields.append('pcu_protocol_type_ids') + else: + added_fields = [] + + pcu_types = PCUTypes(self.api, pcu_type_filter, return_fields) + + # remove added fields and protocol_types + for added_field in added_fields: + for pcu_type in pcu_types: + del pcu_type[added_field] + + return pcu_types diff --git a/trunk/PLC/Methods/GetPCUs.py b/trunk/PLC/Methods/GetPCUs.py new file mode 100644 index 0000000..ee9ab4d --- /dev/null +++ b/trunk/PLC/Methods/GetPCUs.py @@ -0,0 +1,73 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +class GetPCUs(Method): + """ + Returns an array of structs containing details about power control + units (PCUs). If pcu_filter is specified and is an array of PCU + identifiers, or a struct of PCU attributes, only PCUs matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Admin may query all PCUs. Non-admins may only query the PCUs at + their sites. + """ + + roles = ['admin', 'pi', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([PCU.fields['pcu_id']], + Filter(PCU.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [PCU.fields] + + def call(self, auth, pcu_filter = None, return_fields = None): + # If we are not admin + if not (isinstance(self.caller, Person) and 'admin' in self.caller['roles']): + # Return only the PCUs at our site + valid_pcu_ids = [] + + if isinstance(self.caller, Person): + site_ids = self.caller['site_ids'] + elif isinstance(self.caller, Node): + site_ids = [self.caller['site_id']] + + for site in Sites(self.api, site_ids): + valid_pcu_ids += site['pcu_ids'] + + if not valid_pcu_ids: + return [] + + if pcu_filter is None: + pcu_filter = valid_pcu_ids + + # Must query at least slice_id (see below) + if return_fields is not None and 'pcu_id' not in return_fields: + return_fields.append('pcu_id') + added_fields = True + else: + added_fields = False + + pcus = PCUs(self.api, pcu_filter, return_fields) + + # Filter out PCUs that are not viewable + if not (isinstance(self.caller, Person) and 'admin' in self.caller['roles']): + pcus = filter(lambda pcu: pcu['pcu_id'] in valid_pcu_ids, pcus) + + # Remove pcu_id if not specified + if added_fields: + for pcu in pcus: + if 'pcu_id' in pcu: + del pcu['pcu_id'] + + return pcus diff --git a/trunk/PLC/Methods/GetPeerData.py b/trunk/PLC/Methods/GetPeerData.py new file mode 100644 index 0000000..113fe86 --- /dev/null +++ b/trunk/PLC/Methods/GetPeerData.py @@ -0,0 +1,87 @@ +# +# Thierry Parmentelat - INRIA +# +# $Id$ + +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.Peers import Peer, Peers + +from PLC.Sites import Site, Sites +from PLC.Keys import Key, Keys +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.SliceAttributes import SliceAttributes + +class GetPeerData(Method): + """ + Returns lists of local objects that a peer should cache in its + database as foreign objects. Also returns the list of foreign + nodes in this database, for which the calling peer is + authoritative, to assist in synchronization of slivers. + + See the implementation of RefreshPeer for how this data is used. + """ + + roles = ['admin', 'peer'] + + accepts = [Auth()] + + returns = { + 'Sites': Parameter([dict], "List of local sites"), + 'Keys': Parameter([dict], "List of local keys"), + 'Nodes': Parameter([dict], "List of local nodes"), + 'Persons': Parameter([dict], "List of local users"), + 'Slices': Parameter([dict], "List of local slices"), + 'db_time': Parameter(float, "(Debug) Database fetch time"), + } + + def call (self, auth): + start = time.time() + + # Filter out various secrets + node_fields = filter(lambda field: field not in \ + ['boot_nonce', 'key', 'session', 'root_person_ids'], + Node.fields) + nodes = Nodes(self.api, {'peer_id': None}, node_fields); + # filter out whitelisted nodes + nodes = [ n for n in nodes if not n['slice_ids_whitelist']] + + + person_fields = filter(lambda field: field not in \ + ['password', 'verification_key', 'verification_expires'], + Person.fields) + + # XXX Optimize to return only those Persons, Keys, and Slices + # necessary for slice creation on the calling peer's nodes. + + # filter out special person + persons = Persons(self.api, {'~email':[self.api.config.PLC_API_MAINTENANCE_USER, + self.api.config.PLC_ROOT_USER], + 'peer_id': None}, person_fields) + + # filter out system slices + system_slice_ids = SliceAttributes(self.api, {'name': 'system', 'value': '1'}).dict('slice_id') + slices = Slices(self.api, {'peer_id': None, + '~slice_id':system_slice_ids.keys()}) + + result = { + 'Sites': Sites(self.api, {'peer_id': None}), + 'Keys': Keys(self.api, {'peer_id': None}), + 'Nodes': nodes, + 'Persons': persons, + 'Slices': slices, + } + + if isinstance(self.caller, Peer): + result['PeerNodes'] = Nodes(self.api, {'peer_id': self.caller['peer_id']}) + + result['db_time'] = time.time() - start + + return result diff --git a/trunk/PLC/Methods/GetPeerName.py b/trunk/PLC/Methods/GetPeerName.py new file mode 100644 index 0000000..30fbd94 --- /dev/null +++ b/trunk/PLC/Methods/GetPeerName.py @@ -0,0 +1,19 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter +from PLC.Auth import Auth + +from PLC.Peers import Peer, Peers + +class GetPeerName (Method): + """ + Returns this peer's name, as defined in the config as PLC_NAME + """ + + roles = ['admin', 'peer', 'node'] + + accepts = [Auth()] + + returns = Peer.fields['peername'] + + def call (self, auth): + return self.api.config.PLC_NAME diff --git a/trunk/PLC/Methods/GetPeers.py b/trunk/PLC/Methods/GetPeers.py new file mode 100644 index 0000000..e93fe36 --- /dev/null +++ b/trunk/PLC/Methods/GetPeers.py @@ -0,0 +1,47 @@ +# +# Thierry Parmentelat - INRIA +# + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth + +from PLC.Persons import Person +from PLC.Peers import Peer, Peers + +class GetPeers (Method): + """ + Returns an array of structs containing details about peers. If + person_filter is specified and is an array of peer identifiers or + peer names, or a struct of peer attributes, only peers matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin', 'node','pi','user'] + + accepts = [ + Auth(), + Mixed([Mixed(Peer.fields['peer_id'], + Peer.fields['peername'])], + Filter(Peer.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Peer.fields] + + def call (self, auth, peer_filter = None, return_fields = None): + + peers = Peers(self.api, peer_filter, return_fields) + + # Remove admin only fields + if not isinstance(self.caller, Person) or \ + 'admin' not in self.caller['roles']: + for peer in peers: + for field in ['key', 'cacert']: + if field in peer: + del peer[field] + + return peers diff --git a/trunk/PLC/Methods/GetPersons.py b/trunk/PLC/Methods/GetPersons.py new file mode 100644 index 0000000..5228933 --- /dev/null +++ b/trunk/PLC/Methods/GetPersons.py @@ -0,0 +1,87 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +hidden_fields = ['password', 'verification_key', 'verification_expires'] + +class GetPersons(Method): + """ + Returns an array of structs containing details about users. If + person_filter is specified and is an array of user identifiers or + usernames, or a struct of user attributes, only users matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Users and techs may only retrieve details about themselves. PIs + may retrieve details about themselves and others at their + sites. Admins and nodes may retrieve details about all accounts. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Person.fields['person_id'], + Person.fields['email'])], + Parameter(str,"email"), + Parameter(int,"person_id"), + Filter(Person.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + # Filter out password field + return_fields = dict(filter(lambda (field, value): field not in hidden_fields, + Person.fields.items())) + returns = [return_fields] + + def call(self, auth, person_filter = None, return_fields = None): + # If we are not admin, make sure to only return viewable accounts + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get accounts that we are able to view + valid_person_ids = [self.caller['person_id']] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_person_ids += site['person_ids'] + + if not valid_person_ids: + return [] + + if person_filter is None: + person_filter = valid_person_ids + + # Filter out password field + if return_fields: + return_fields = filter(lambda field: field not in hidden_fields, + return_fields) + else: + return_fields = self.return_fields.keys() + + # Must query at least person_id, site_ids, and role_ids (see + # Person.can_view() and below). + if return_fields is not None: + added_fields = set(['person_id', 'site_ids', 'role_ids']).difference(return_fields) + return_fields += added_fields + else: + added_fields = [] + + persons = Persons(self.api, person_filter, return_fields) + + # Filter out accounts that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + persons = filter(self.caller.can_view, persons) + + # Remove added fields if not specified + if added_fields: + for person in persons: + for field in added_fields: + if field in person: + del person[field] + + return persons diff --git a/trunk/PLC/Methods/GetPlcRelease.py b/trunk/PLC/Methods/GetPlcRelease.py new file mode 100644 index 0000000..7df66aa --- /dev/null +++ b/trunk/PLC/Methods/GetPlcRelease.py @@ -0,0 +1,57 @@ +from PLC.Method import Method +from PLC.Auth import Auth +from PLC.Faults import * + +import re + +comment_regexp = '\A\s*#.|\A\s*\Z|\Axxxxx' + +regexps = { 'build' : '\A[bB]uild\s+(?P[^:]+)\s*:\s*(?P.*)\Z', + 'tags' : '\A(?P[^:]+)\s*:=\s*(?P.*)\Z'} + +class GetPlcRelease(Method): + """ + Returns various information about the current myplc installation. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + ] + + # for now only return /etc/myplc-release verbatim + returns = { 'build' : 'information about the build', + 'tags' : 'describes the codebase location and tags used for building', + 'rpms' : 'details the rpm installed in the myplc chroot jail' } + + def call(self, auth): + + comment_matcher = re.compile(comment_regexp) + + matchers = {} + result = {} + for field in regexps.keys(): + matchers[field] = re.compile(regexps[field]) + result[field]={} + result['rpms']="Not implemented yet" + + try: + release = open('/etc/myplc-release') + for line in release.readlines(): + line=line.strip() + if comment_matcher.match(line): + continue + for field in regexps.keys(): + m=matchers[field].match(line) + if m: + (key,value)=m.groups(['key','value']) + result[field][key]=value + break + else: + if not result.has_key('unexpected'): + result['unexpected']="" + result['unexpected'] += (line+"\n") + except: + raise PLCNotImplemented, 'Cannot open /etc/myplc-release' + return result diff --git a/trunk/PLC/Methods/GetRoles.py b/trunk/PLC/Methods/GetRoles.py new file mode 100644 index 0000000..0456662 --- /dev/null +++ b/trunk/PLC/Methods/GetRoles.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Roles import Role, Roles +from PLC.Auth import Auth + +class GetRoles(Method): + """ + Get an array of structs containing details about all roles. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [Role.fields] + + def call(self, auth): + return Roles(self.api) diff --git a/trunk/PLC/Methods/GetSession.py b/trunk/PLC/Methods/GetSession.py new file mode 100644 index 0000000..ae75219 --- /dev/null +++ b/trunk/PLC/Methods/GetSession.py @@ -0,0 +1,39 @@ +import time + +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Sessions import Session, Sessions +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons + +class GetSession(Method): + """ + Returns a new session key if a user or node authenticated + successfully, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + accepts = [Auth()] + returns = Session.fields['session_id'] + + + def call(self, auth): + # Authenticated with a session key, just return it + if auth.has_key('session'): + return auth['session'] + + session = Session(self.api) + + if isinstance(self.caller, Person): + # XXX Make this configurable + session['expires'] = int(time.time()) + (24 * 60 * 60) + + session.sync(commit = False) + + if isinstance(self.caller, Node): + session.add_node(self.caller, commit = True) + elif isinstance(self.caller, Person): + session.add_person(self.caller, commit = True) + + return session['session_id'] diff --git a/trunk/PLC/Methods/GetSessions.py b/trunk/PLC/Methods/GetSessions.py new file mode 100644 index 0000000..a72553c --- /dev/null +++ b/trunk/PLC/Methods/GetSessions.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Sessions import Session, Sessions +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class GetSessions(Method): + """ + Returns an array of structs containing details about users sessions. If + session_filter is specified and is an array of user identifiers or + session_keys, or a struct of session attributes, only sessions matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed([Mixed(Session.fields['person_id'], + Session.fields['session_id'])], + Filter(Session.fields)) + ] + + returns = [Session.fields] + + def call(self, auth, session_filter = None): + + sessions = Sessions(self.api, session_filter) + + return sessions diff --git a/trunk/PLC/Methods/GetSites.py b/trunk/PLC/Methods/GetSites.py new file mode 100644 index 0000000..c0f198e --- /dev/null +++ b/trunk/PLC/Methods/GetSites.py @@ -0,0 +1,31 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +class GetSites(Method): + """ + Returns an array of structs containing details about sites. If + site_filter is specified and is an array of site identifiers or + hostnames, or a struct of site attributes, only sites matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(Site.fields['site_id'], + Site.fields['login_base'])], + Parameter(str,"login_base"), + Parameter(int,"site_id"), + Filter(Site.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Site.fields] + + def call(self, auth, site_filter = None, return_fields = None): + return Sites(self.api, site_filter, return_fields) diff --git a/trunk/PLC/Methods/GetSliceAttributeTypes.py b/trunk/PLC/Methods/GetSliceAttributeTypes.py new file mode 100644 index 0000000..bc8f1ed --- /dev/null +++ b/trunk/PLC/Methods/GetSliceAttributeTypes.py @@ -0,0 +1,30 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes + +class GetSliceAttributeTypes(Method): + """ + Returns an array of structs containing details about slice + attribute types. If attribute_type_filter is specified and + is an array of slice attribute type identifiers, or a + struct of slice attribute type attributes, only slice attribute + types matching the filter will be returned. If return_fields is + specified, only the specified details will be returned. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(SliceAttributeType.fields['attribute_type_id'], + SliceAttributeType.fields['name'])], + Filter(SliceAttributeType.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [SliceAttributeType.fields] + + def call(self, auth, attribute_type_filter = None, return_fields = None): + return SliceAttributeTypes(self.api, attribute_type_filter, return_fields) diff --git a/trunk/PLC/Methods/GetSliceAttributes.py b/trunk/PLC/Methods/GetSliceAttributes.py new file mode 100644 index 0000000..b8a0a11 --- /dev/null +++ b/trunk/PLC/Methods/GetSliceAttributes.py @@ -0,0 +1,88 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth + +class GetSliceAttributes(Method): + """ + Returns an array of structs containing details about slice and + sliver attributes. An attribute is a sliver attribute if the + node_id field is set. If slice_attribute_filter is specified and + is an array of slice attribute identifiers, or a struct of slice + attribute attributes, only slice attributes matching the filter + will be returned. If return_fields is specified, only the + specified details will be returned. + + Users may only query attributes of slices or slivers of which they + are members. PIs may only query attributes of slices or slivers at + their sites, or of which they are members. Admins may query + attributes of any slice or sliver. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([SliceAttribute.fields['slice_attribute_id']], + Filter(SliceAttribute.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [SliceAttribute.fields] + + + def call(self, auth, slice_attribute_filter = None, return_fields = None): + # If we are not admin, make sure to only return our own slice + # and sliver attributes. + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + # Get slice attributes that we are able to view + valid_slice_attribute_ids = [] + slices = Slices(self.api, valid_slice_ids) + for slice in slices: + valid_slice_attribute_ids += slice['slice_attribute_ids'] + + if not valid_slice_attribute_ids: + return [] + + if slice_attribute_filter is None: + slice_attribute_filter = valid_slice_attribute_ids + + # Must query at least slice_attribute_id (see below) + if return_fields is not None and 'slice_attribute_id' not in return_fields: + return_fields.append('slice_attribute_id') + added_fields = True + else: + added_fields = False + + slice_attributes = SliceAttributes(self.api, slice_attribute_filter, return_fields) + + # Filter out slice attributes that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + slice_attributes = filter(lambda slice_attribute: \ + slice_attribute['slice_attribute_id'] in valid_slice_attribute_ids, + slice_attributes) + + # Remove slice_attribute_id if not specified + if added_fields: + for slice_attribute in slice_attributes: + if 'slice_attribute_id' in slice_attribute: + del slice_attribute['slice_attribute_id'] + + return slice_attributes diff --git a/trunk/PLC/Methods/GetSliceInstantiations.py b/trunk/PLC/Methods/GetSliceInstantiations.py new file mode 100644 index 0000000..174c209 --- /dev/null +++ b/trunk/PLC/Methods/GetSliceInstantiations.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Auth import Auth + +class GetSliceInstantiations(Method): + """ + Returns an array of all valid slice instantiation states. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth() + ] + + returns = [SliceInstantiation.fields['instantiation']] + + def call(self, auth): + return [slice_instantiation['instantiation'] for slice_instantiation in SliceInstantiations(self.api)] diff --git a/trunk/PLC/Methods/GetSliceKeys.py b/trunk/PLC/Methods/GetSliceKeys.py new file mode 100644 index 0000000..4029c83 --- /dev/null +++ b/trunk/PLC/Methods/GetSliceKeys.py @@ -0,0 +1,134 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Slices import Slice, Slices +from PLC.Keys import Key, Keys + +class GetSliceKeys(Method): + """ + Returns an array of structs containing public key info for users in + the specified slices. If slice_filter is specified and is an array + of slice identifiers or slice names, or a struct of slice + attributes, only slices matching the filter will be returned. If + return_fields is specified, only the specified details will be + returned. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins and nodes may query + any slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Slice.fields['slice_id'], + Slice.fields['name'])], + Filter(Slice.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [ + { + 'slice_id': Slice.fields['slice_id'], + 'name': Slice.fields['name'], + 'person_id': Person.fields['person_id'], + 'email': Person.fields['email'], + 'key': Key.fields['key'] + }] + + def call(self, auth, slice_filter = None, return_fields = None): + slice_fields = ['slice_id', 'name'] + person_fields = ['person_id', 'email'] + key_fields = ['key'] + + # If we are not admin, make sure to return only viewable + # slices. + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + if slice_filter is None: + slice_filter = valid_slice_ids + + if return_fields: + slice_return_fields = filter(lambda field: field in slice_fields, return_fields) + person_return_fields = filter(lambda field: field in person_fields, return_fields) + key_return_fields = filter(lambda field: field in key_fields, return_fields) + else: + slice_return_fields = slice_fields + person_return_fields = person_fields + key_return_fields = key_fields + + # Must query at least Slice.slice_id, Slice.person_ids, + # and Person.person_id and Person.key_ids so we can join data correctly + slice_added_fields = set(['slice_id', 'person_ids']).difference(slice_return_fields) + slice_return_fields += slice_added_fields + person_added_fields = set(['person_id', 'key_ids']).difference(person_return_fields) + person_return_fields += person_added_fields + key_added_fields = set(['key_id']).difference(key_return_fields) + key_return_fields += key_added_fields + + # Get the slices + all_slices = Slices(self.api, slice_filter, slice_return_fields).dict('slice_id') + slice_ids = all_slices.keys() + slices = all_slices.values() + + # Filter out slices that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + # Get the persons + person_ids = set() + for slice in slices: + person_ids.update(slice['person_ids']) + + all_persons = Persons(self.api, list(person_ids), person_return_fields).dict('person_id') + person_ids = all_persons.keys() + persons = all_persons.values() + + # Get the keys + key_ids = set() + for person in persons: + key_ids.update(person['key_ids']) + + all_keys = Keys(self.api, list(key_ids), key_return_fields).dict('key_id') + key_ids = all_keys.keys() + keys = all_keys.values() + + # Create slice_keys list + slice_keys = [] + slice_fields = list(set(slice_return_fields).difference(slice_added_fields)) + person_fields = list(set(person_return_fields).difference(person_added_fields)) + key_fields = list(set(key_return_fields).difference(key_added_fields)) + + for slice in slices: + slice_key = dict.fromkeys(slice_fields + person_fields + key_fields) + if not slice['person_ids']: + continue + for person_id in slice['person_ids']: + person = all_persons[person_id] + if not person['key_ids']: + continue + for key_id in person['key_ids']: + key = all_keys[key_id] + slice_key.update(dict(filter(lambda (k, v): k in slice_fields, slice.items()))) + slice_key.update(dict(filter(lambda (k, v): k in person_fields, person.items()))) + slice_key.update(dict(filter(lambda (k, v): k in key_fields, key.items()))) + slice_keys.append(slice_key.copy()) + + return slice_keys + diff --git a/trunk/PLC/Methods/GetSliceTicket.py b/trunk/PLC/Methods/GetSliceTicket.py new file mode 100644 index 0000000..cd73f7b --- /dev/null +++ b/trunk/PLC/Methods/GetSliceTicket.py @@ -0,0 +1,77 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.GPG import gpg_sign, gpg_verify +from PLC.InitScripts import InitScript, InitScripts + +from PLC.Methods.GetSlivers import get_slivers + +class GetSliceTicket(Method): + """ + Returns a ticket for, or signed representation of, the specified + slice. Slice tickets may be used to manually instantiate or update + a slice on a node. Present this ticket to the local Node Manager + interface to redeem it. + + If the slice has not been added to a node with AddSliceToNodes, + and the ticket is redeemed on that node, it will be deleted the + next time the Node Manager contacts the API. + + Users may only obtain tickets for slices of which they are + members. PIs may obtain tickets for any of the slices at their + sites, or any slices of which they are members. Admins may obtain + tickets for any slice. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'peer'] + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + ] + + returns = Parameter(str, 'Signed slice ticket') + + def call(self, auth, slice_id_or_name): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # Allow peers to obtain tickets for their own slices + if slice['peer_id'] is not None: + if not isinstance(self.caller, Peer): + raise PLCInvalidArgument, "Not a local slice" + elif slice['peer_id'] != self.caller['peer_id']: + raise PLCInvalidArgument, "Only the authoritative peer may obtain tickets for that slice" + + # Tickets are the canonicalized XML-RPC methodResponse + # representation of a partial GetSlivers() response, i.e., + + initscripts = InitScripts(self.api, {'enabled': True}) + + data = { + 'timestamp': int(time.time()), + 'initscripts': initscripts, + 'slivers': get_slivers(self.api, [slice['slice_id']]), + } + + # Sign ticket + signed_ticket = gpg_sign((data,), + self.api.config.PLC_ROOT_GPG_KEY, + self.api.config.PLC_ROOT_GPG_KEY_PUB, + methodresponse = True, + detach_sign = False) + + # Verify ticket + gpg_verify(signed_ticket, + self.api.config.PLC_ROOT_GPG_KEY_PUB) + + return signed_ticket diff --git a/trunk/PLC/Methods/GetSlices.py b/trunk/PLC/Methods/GetSlices.py new file mode 100644 index 0000000..63dc0b4 --- /dev/null +++ b/trunk/PLC/Methods/GetSlices.py @@ -0,0 +1,75 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Slices import Slice, Slices + +class GetSlices(Method): + """ + Returns an array of structs containing details about slices. If + slice_filter is specified and is an array of slice identifiers or + slice names, or a struct of slice attributes, only slices matching + the filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins and nodes may query + any slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + roles = ['admin', 'pi', 'user', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Slice.fields['slice_id'], + Slice.fields['name'])], + Parameter(str,"name"), + Parameter(int,"slice_id"), + Filter(Slice.fields)), + Parameter([str], "List of fields to return", nullok = True) + ] + + returns = [Slice.fields] + + def call(self, auth, slice_filter = None, return_fields = None): + # If we are not admin, make sure to return only viewable + # slices. + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + if slice_filter is None: + slice_filter = valid_slice_ids + + # Must query at least slice_id (see below) + if return_fields is not None and 'slice_id' not in return_fields: + return_fields.append('slice_id') + added_fields = True + else: + added_fields = False + + slices = Slices(self.api, slice_filter, return_fields) + + # Filter out slices that are not viewable + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + # Remove slice_id if not specified + if added_fields: + for slice in slices: + if 'slice_id' in slice: + del slice['slice_id'] + + return slices diff --git a/trunk/PLC/Methods/GetSlicesMD5.py b/trunk/PLC/Methods/GetSlicesMD5.py new file mode 100644 index 0000000..b7e4cde --- /dev/null +++ b/trunk/PLC/Methods/GetSlicesMD5.py @@ -0,0 +1,30 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +class GetSlicesMD5(Method): + """ + Returns the current md5 hash of slices.xml file + (slices-0.5.xml.md5) + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node'] + + accepts = [ + Auth(), + ] + + returns = Parameter(str, "MD5 hash of slices.xml") + + + def call(self, auth): + try: + file_path = '/var/www/html/xml/slices-0.5.xml.md5' + slices_md5 = file(file_path).readline().strip() + if slices_md5 <> "": + return slices_md5 + raise PLCInvalidArgument, "File is empty" + except IOError: + raise PLCInvalidArgument, "No such file" + diff --git a/trunk/PLC/Methods/GetSlivers.py b/trunk/PLC/Methods/GetSlivers.py new file mode 100644 index 0000000..d3c5471 --- /dev/null +++ b/trunk/PLC/Methods/GetSlivers.py @@ -0,0 +1,226 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.InitScripts import InitScript, InitScripts + +def get_slivers(api, slice_filter, node = None): + # Get slice information + slices = Slices(api, slice_filter, ['slice_id', 'name', 'instantiation', 'expires', 'person_ids', 'slice_attribute_ids']) + + # Build up list of users and slice attributes + person_ids = set() + slice_attribute_ids = set() + for slice in slices: + person_ids.update(slice['person_ids']) + slice_attribute_ids.update(slice['slice_attribute_ids']) + + # Get user information + all_persons = Persons(api, {'person_id':person_ids,'enabled':True}, ['person_id', 'enabled', 'key_ids']).dict() + + # Build up list of keys + key_ids = set() + for person in all_persons.values(): + key_ids.update(person['key_ids']) + + # Get user account keys + all_keys = Keys(api, key_ids, ['key_id', 'key', 'key_type']).dict() + + # Get slice attributes + all_slice_attributes = SliceAttributes(api, slice_attribute_ids).dict() + + slivers = [] + for slice in slices: + keys = [] + for person_id in slice['person_ids']: + if person_id in all_persons: + person = all_persons[person_id] + if not person['enabled']: + continue + for key_id in person['key_ids']: + if key_id in all_keys: + key = all_keys[key_id] + keys += [{'key_type': key['key_type'], + 'key': key['key']}] + + attributes = [] + + # All (per-node and global) attributes for this slice + slice_attributes = [] + for slice_attribute_id in slice['slice_attribute_ids']: + if slice_attribute_id in all_slice_attributes: + slice_attributes.append(all_slice_attributes[slice_attribute_id]) + + # Per-node sliver attributes take precedence over global + # slice attributes, so set them first. + # Then comes nodegroup slice attributes + # Followed by global slice attributes + sliver_attributes = [] + + if node is not None: + for sliver_attribute in filter(lambda a: a['node_id'] == node['node_id'], slice_attributes): + sliver_attributes.append(sliver_attribute['name']) + attributes.append({'name': sliver_attribute['name'], + 'value': sliver_attribute['value']}) + + # set nodegroup slice attributes + for slice_attribute in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_attributes): + # Do not set any nodegroup slice attributes for + # which there is at least one sliver attribute + # already set. + if slice_attribute['name'] not in slice_attributes: + attributes.append({'name': slice_attribute['name'], + 'value': slice_attribute['value']}) + + for slice_attribute in filter(lambda a: a['node_id'] is None, slice_attributes): + # Do not set any global slice attributes for + # which there is at least one sliver attribute + # already set. + if slice_attribute['name'] not in sliver_attributes: + attributes.append({'name': slice_attribute['name'], + 'value': slice_attribute['value']}) + + slivers.append({ + 'name': slice['name'], + 'slice_id': slice['slice_id'], + 'instantiation': slice['instantiation'], + 'expires': slice['expires'], + 'keys': keys, + 'attributes': attributes + }) + + return slivers + +class GetSlivers(Method): + """ + Returns a struct containing information about the specified node + (or calling node, if called by a node and node_id_or_hostname is + not specified), including the current set of slivers bound to the + node. + + All of the information returned by this call can be gathered from + other calls, e.g. GetNodes, GetNodeNetworks, GetSlices, etc. This + function exists almost solely for the benefit of Node Manager. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + ] + + returns = { + 'timestamp': Parameter(int, "Timestamp of this call, in seconds since UNIX epoch"), + 'node_id': Node.fields['node_id'], + 'hostname': Node.fields['hostname'], + 'networks': [NodeNetwork.fields], + 'groups': [NodeGroup.fields['name']], + 'conf_files': [ConfFile.fields], + 'initscripts': [InitScript.fields], + 'slivers': [{ + 'name': Slice.fields['name'], + 'slice_id': Slice.fields['slice_id'], + 'instantiation': Slice.fields['instantiation'], + 'expires': Slice.fields['expires'], + 'keys': [{ + 'key_type': Key.fields['key_type'], + 'key': Key.fields['key'] + }], + 'attributes': [{ + 'name': SliceAttribute.fields['name'], + 'value': SliceAttribute.fields['value'] + }] + }] + } + + def call(self, auth, node_id_or_hostname = None): + timestamp = int(time.time()) + + # Get node + if node_id_or_hostname is None: + if isinstance(self.caller, Node): + node = self.caller + else: + raise PLCInvalidArgument, "'node_id_or_hostname' not specified" + else: + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Get nodenetwork information + networks = NodeNetworks(self.api, node['nodenetwork_ids']) + + # Get node group information + nodegroups = NodeGroups(self.api, node['nodegroup_ids']).dict('name') + groups = nodegroups.keys() + + # Get all (enabled) configuration files + all_conf_files = ConfFiles(self.api, {'enabled': True}).dict() + conf_files = {} + + # Global configuration files are the default. If multiple + # entries for the same global configuration file exist, it is + # undefined which one takes precedence. + for conf_file in all_conf_files.values(): + if not conf_file['node_ids'] and not conf_file['nodegroup_ids']: + conf_files[conf_file['dest']] = conf_file + + # Node group configuration files take precedence over global + # ones. If a node belongs to multiple node groups for which + # the same configuration file is defined, it is undefined + # which one takes precedence. + for nodegroup in nodegroups.values(): + for conf_file_id in nodegroup['conf_file_ids']: + if conf_file_id in all_conf_files: + conf_files[conf_file['dest']] = all_conf_files[conf_file_id] + + # Node configuration files take precedence over node group + # configuration files. + for conf_file_id in node['conf_file_ids']: + if conf_file_id in all_conf_files: + conf_files[conf_file['dest']] = all_conf_files[conf_file_id] + + + # Get all (enabled) initscripts + initscripts = InitScripts(self.api, {'enabled': True}) + + # Get system slices + system_slice_attributes = SliceAttributes(self.api, {'name': 'system', 'value': '1'}).dict('slice_id') + system_slice_ids = system_slice_attributes.keys() + + # Get nm-controller slices + controller_and_delegated_slices = Slices(self.api, {'instantiation': ['nm-controller', 'delegated']}, ['slice_id']).dict('slice_id') + controller_and_delegated_slice_ids = controller_and_delegated_slices.keys() + slice_ids = system_slice_ids + controller_and_delegated_slice_ids + node['slice_ids'] + + slivers = get_slivers(self.api, slice_ids, node) + + node.update_last_contact() + + return { + 'timestamp': timestamp, + 'node_id': node['node_id'], + 'hostname': node['hostname'], + 'networks': networks, + 'groups': groups, + 'conf_files': conf_files.values(), + 'initscripts': initscripts, + 'slivers': slivers + } diff --git a/trunk/PLC/Methods/GetWhitelist.py b/trunk/PLC/Methods/GetWhitelist.py new file mode 100644 index 0000000..11251f8 --- /dev/null +++ b/trunk/PLC/Methods/GetWhitelist.py @@ -0,0 +1,73 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +class GetWhitelist(Method): + """ + Returns an array of structs containing details about the specified nodes + whitelists. If node_filter is specified and is an array of node identifiers or + hostnames, or a struct of node attributes, only nodes matching the + filter will be returned. If return_fields is specified, only the + specified details will be returned. + + Some fields may only be viewed by admins. + """ + + roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous'] + + accepts = [ + Auth(), + Mixed([Mixed(Node.fields['node_id'], + Node.fields['hostname'])], + Filter(Node.fields)), + Parameter([str], "List of fields to return", nullok = True), + ] + + returns = [Node.fields] + + + def call(self, auth, node_filter = None, return_fields = None): + + # Must query at least slice_ids_whitelist + if return_fields is not None: + added_fields = set(['slice_ids_whitelist']).difference(return_fields) + return_fields += added_fields + else: + added_fields =[] + + # Get node information + nodes = Nodes(self.api, node_filter, return_fields) + + # Remove all nodes without a whitelist + for node in nodes[:]: + if not node['slice_ids_whitelist']: + nodes.remove(node) + + # Remove admin only fields + if not isinstance(self.caller, Person) or \ + 'admin' not in self.caller['roles']: + slice_ids = set() + if self.caller: + slice_ids.update(self.caller['slice_ids']) + #if node has whitelist, make sure the user has a slice on the whitelist + for node in nodes[:]: + if 'slice_ids_whitelist' in node and \ + node['slice_ids_whitelist'] and \ + not slice_ids.intersection(node['slice_ids_whitelist']): + nodes.remove(node) + for node in nodes: + for field in ['boot_nonce', 'key', 'session', 'root_person_ids']: + if field in node: + del node[field] + + # remove added fields if not specified + if added_fields: + for node in nodes: + for field in added_fields: + del node[field] + + return nodes diff --git a/trunk/PLC/Methods/NotifyPersons.py b/trunk/PLC/Methods/NotifyPersons.py new file mode 100644 index 0000000..70c273d --- /dev/null +++ b/trunk/PLC/Methods/NotifyPersons.py @@ -0,0 +1,48 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.sendmail import sendmail + +class NotifyPersons(Method): + """ + Sends an e-mail message to the specified users. If person_filter + is specified and is an array of user identifiers or usernames, or + a struct of user attributes, only users matching the filter will + receive the message. + + Returns 1 if successful. + """ + + roles = ['admin', 'node'] + + accepts = [ + Auth(), + Mixed([Mixed(Person.fields['person_id'], + Person.fields['email'])], + Filter(Person.fields)), + Parameter(str, "E-mail subject"), + Parameter(str, "E-mail body") + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_filter, subject, body): + persons = Persons(self.api, person_filter, + ['person_id', 'first_name', 'last_name', 'email']) + if not persons: + raise PLCInvalidArgument, "No such user(s)" + + # Send email + sendmail(self.api, + To = [("%s %s" % (person['first_name'], person['last_name']), + person['email']) for person in persons], + Subject = subject, + Body = body) + + # Logging variables + self.event_objects = {'Person': [person['person_id'] for person in persons]} + self.message = subject + + return 1 diff --git a/trunk/PLC/Methods/NotifySupport.py b/trunk/PLC/Methods/NotifySupport.py new file mode 100644 index 0000000..99ec318 --- /dev/null +++ b/trunk/PLC/Methods/NotifySupport.py @@ -0,0 +1,36 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.sendmail import sendmail + +class NotifySupport(Method): + """ + Sends an e-mail message to the configured support address. + + Returns 1 if successful. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Parameter(str, "E-mail subject"), + Parameter(str, "E-mail body") + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, subject, body): + to_name="%s Support"%self.api.config.PLC_NAME + to_address=self.api.config.PLC_MAIL_SUPPORT_ADDRESS + + # Send email + sendmail(self.api, To=(to_name,to_address), + Subject = subject, + Body = body) + + # Logging variables + #self.event_objects = {'Person': [person['person_id'] for person in persons]} + self.message = subject + + return 1 diff --git a/trunk/PLC/Methods/RebootNode.py b/trunk/PLC/Methods/RebootNode.py new file mode 100644 index 0000000..bea6b89 --- /dev/null +++ b/trunk/PLC/Methods/RebootNode.py @@ -0,0 +1,73 @@ +import socket + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth +from PLC.POD import udp_pod + +class RebootNode(Method): + """ + Sends the specified node a specially formatted UDP packet which + should cause it to reboot immediately. + + Admins can reboot any node. Techs and PIs can only reboot nodes at + their site. + + Returns 1 if the packet was successfully sent (which only whether + the packet was sent, not whether the reboot was successful). + """ + + roles = ['admin', 'pi', 'tech'] + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname): + # Get account information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + + node = nodes[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete nodes from specified site" + + session = node['session'] + if not session: + raise PLCInvalidArgument, "No session key on record for that node (i.e., has never successfully booted)" + session = session.strip() + + # Only use the hostname as a backup, try to use the primary ID + # address instead. + host = node['hostname'] + nodenetworks = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in nodenetworks: + if nodenetwork['is_primary'] == 1: + host = nodenetwork['ip'] + break + + try: + udp_pod(host, session) + except socket.error, e: + # Ignore socket errors + pass + + self.event_objects = {'Node': [node['node_id']]} + self.message = "RebootNode called" + + return 1 diff --git a/trunk/PLC/Methods/RefreshPeer.py b/trunk/PLC/Methods/RefreshPeer.py new file mode 100644 index 0000000..40fb1e2 --- /dev/null +++ b/trunk/PLC/Methods/RefreshPeer.py @@ -0,0 +1,476 @@ +# +# Thierry Parmentelat - INRIA +# +# $Id$ + +import time + +from PLC.Debug import log +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.Peers import Peer, Peers +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Keys import Key, Keys +from PLC.BootStates import BootState, BootStates +from PLC.Nodes import Node, Nodes +from PLC.SliceInstantiations import SliceInstantiations +from PLC.Slices import Slice, Slices + +verbose=False + +class RefreshPeer(Method): + """ + Fetches site, node, slice, person and key data from the specified peer + and caches it locally; also deletes stale entries. + Upon successful completion, returns a dict reporting various timers. + Faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Peer.fields['peer_id'], + Peer.fields['peername']), + ] + + returns = Parameter(int, "1 if successful") + + def call(self, auth, peer_id_or_peername): + # Get peer + peers = Peers(self.api, [peer_id_or_peername]) + if not peers: + raise PLCInvalidArgument, "No such peer '%s'" % unicode(peer_id_or_peername) + peer = peers[0] + peer_id = peer['peer_id'] + + # Connect to peer API + peer.connect() + + timers = {} + + # Get peer data + start = time.time() + print >>log, 'Issuing GetPeerData' + peer_tables = peer.GetPeerData() + timers['transport'] = time.time() - start - peer_tables['db_time'] + timers['peer_db'] = peer_tables['db_time'] + if verbose: + print >>log, 'GetPeerData returned -> db=%d transport=%d'%(timers['peer_db'],timers['transport']) + + def sync(objects, peer_objects, classobj): + """ + Synchronizes two dictionaries of objects. objects should + be a dictionary of local objects keyed on their foreign + identifiers. peer_objects should be a dictionary of + foreign objects keyed on their local (i.e., foreign to us) + identifiers. Returns a final dictionary of local objects + keyed on their foreign identifiers. + """ + + if verbose: + print >>log, 'Entering sync on',classobj(self.api).__class__.__name__ + + synced = {} + + # Delete stale objects + for peer_object_id, object in objects.iteritems(): + if peer_object_id not in peer_objects: + object.delete(commit = False) + print >> log, peer['peername'],classobj(self.api).__class__.__name__, object[object.primary_key],"deleted" + + # Add/update new/existing objects + for peer_object_id, peer_object in peer_objects.iteritems(): + if peer_object_id in objects: + # Update existing object + object = objects[peer_object_id] + + # Replace foreign identifier with existing local + # identifier temporarily for the purposes of + # comparison. + peer_object[object.primary_key] = object[object.primary_key] + + # Must use __eq__() instead of == since + # peer_object may be a raw dict instead of a Peer + # object. + if not object.__eq__(peer_object): + # Only update intrinsic fields + object.update(object.db_fields(peer_object)) + sync = True + dbg = "changed" + else: + sync = False + dbg = None + + # Restore foreign identifier + peer_object[object.primary_key] = peer_object_id + else: + # Add new object + object = classobj(self.api, peer_object) + # Replace foreign identifier with new local identifier + del object[object.primary_key] + sync = True + dbg = "added" + + if sync: + try: + object.sync(commit = False) + except PLCInvalidArgument, err: + # Skip if validation fails + # XXX Log an event instead of printing to logfile + print >> log, "Warning: Skipping invalid", \ + peer['peername'], object.__class__.__name__, \ + ":", peer_object, ":", err + continue + + synced[peer_object_id] = object + + if dbg: + print >> log, peer['peername'], classobj(self.api).__class__.__name__, object[object.primary_key], dbg + + if verbose: + print >>log, 'Exiting sync on',classobj(self.api).__class__.__name__ + + return synced + + # + # Synchronize foreign sites + # + + start = time.time() + + print >>log, 'Dealing with Sites' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Sites']: + columns = peer_tables['Sites'][0].keys() + else: + columns = None + + # Keyed on foreign site_id + old_peer_sites = Sites(self.api, {'peer_id': peer_id}, columns).dict('peer_site_id') + sites_at_peer = dict([(site['site_id'], site) for site in peer_tables['Sites']]) + + # Synchronize new set (still keyed on foreign site_id) + peer_sites = sync(old_peer_sites, sites_at_peer, Site) + + for peer_site_id, site in peer_sites.iteritems(): + # Bind any newly cached sites to peer + if peer_site_id not in old_peer_sites: + peer.add_site(site, peer_site_id, commit = False) + site['peer_id'] = peer_id + site['peer_site_id'] = peer_site_id + + timers['site'] = time.time() - start + + # + # XXX Synchronize foreign key types + # + + print >>log, 'Dealing with Keys' + + key_types = KeyTypes(self.api).dict() + + # + # Synchronize foreign keys + # + + start = time.time() + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Keys']: + columns = peer_tables['Keys'][0].keys() + else: + columns = None + + # Keyed on foreign key_id + old_peer_keys = Keys(self.api, {'peer_id': peer_id}, columns).dict('peer_key_id') + keys_at_peer = dict([(key['key_id'], key) for key in peer_tables['Keys']]) + + # Fix up key_type references + for peer_key_id, key in keys_at_peer.items(): + if key['key_type'] not in key_types: + # XXX Log an event instead of printing to logfile + print >> log, "Warning: Skipping invalid %s key:" % peer['peername'], \ + key, ": invalid key type", key['key_type'] + del keys_at_peer[peer_key_id] + continue + + # Synchronize new set (still keyed on foreign key_id) + peer_keys = sync(old_peer_keys, keys_at_peer, Key) + for peer_key_id, key in peer_keys.iteritems(): + # Bind any newly cached keys to peer + if peer_key_id not in old_peer_keys: + peer.add_key(key, peer_key_id, commit = False) + key['peer_id'] = peer_id + key['peer_key_id'] = peer_key_id + + timers['keys'] = time.time() - start + + # + # Synchronize foreign users + # + + start = time.time() + + print >>log, 'Dealing with Persons' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Persons']: + columns = peer_tables['Persons'][0].keys() + else: + columns = None + + # Keyed on foreign person_id + old_peer_persons = Persons(self.api, {'peer_id': peer_id}, columns).dict('peer_person_id') + + # artificially attach the persons returned by GetPeerData to the new peer + # this is because validate_email needs peer_id to be correct when checking for duplicates + for person in peer_tables['Persons']: + person['peer_id']=peer_id + persons_at_peer = dict([(peer_person['person_id'], peer_person) \ + for peer_person in peer_tables['Persons']]) + + # XXX Do we care about membership in foreign site(s)? + + # Synchronize new set (still keyed on foreign person_id) + peer_persons = sync(old_peer_persons, persons_at_peer, Person) + + # transcoder : retrieve a local key_id from a peer_key_id + key_transcoder = dict ( [ (key['key_id'],peer_key_id) \ + for peer_key_id,key in peer_keys.iteritems()]) + + for peer_person_id, person in peer_persons.iteritems(): + # Bind any newly cached users to peer + if peer_person_id not in old_peer_persons: + peer.add_person(person, peer_person_id, commit = False) + person['peer_id'] = peer_id + person['peer_person_id'] = peer_person_id + person['key_ids'] = [] + + # User as viewed by peer + peer_person = persons_at_peer[peer_person_id] + + # Foreign keys currently belonging to the user + old_person_key_ids = [key_transcoder[key_id] for key_id in person['key_ids'] \ + if key_transcoder[key_id] in peer_keys] + + # Foreign keys that should belong to the user + # this is basically peer_person['key_ids'], we just check it makes sense + # (e.g. we might have failed importing it) + person_key_ids = [ key_id for key_id in peer_person['key_ids'] if key_id in peer_keys] + + # Remove stale keys from user + for key_id in (set(old_person_key_ids) - set(person_key_ids)): + person.remove_key(peer_keys[key_id], commit = False) + print >> log, peer['peername'], 'Key', key_id, 'removed from', person['email'] + + # Add new keys to user + for key_id in (set(person_key_ids) - set(old_person_key_ids)): + person.add_key(peer_keys[key_id], commit = False) + print >> log, peer['peername'], 'Key', key_id, 'added into', person['email'] + + timers['persons'] = time.time() - start + + # + # XXX Synchronize foreign boot states + # + + boot_states = BootStates(self.api).dict() + + # + # Synchronize foreign nodes + # + + start = time.time() + + print >>log, 'Dealing with Nodes' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Nodes']: + columns = peer_tables['Nodes'][0].keys() + else: + columns = None + + # Keyed on foreign node_id + old_peer_nodes = Nodes(self.api, {'peer_id': peer_id}, columns).dict('peer_node_id') + nodes_at_peer = dict([(node['node_id'], node) \ + for node in peer_tables['Nodes']]) + + # Fix up site_id and boot_states references + for peer_node_id, node in nodes_at_peer.items(): + errors = [] + if node['site_id'] not in peer_sites: + errors.append("invalid site %d" % node['site_id']) + if node['boot_state'] not in boot_states: + errors.append("invalid boot state %s" % node['boot_state']) + if errors: + # XXX Log an event instead of printing to logfile + print >> log, "Warning: Skipping invalid %s node:" % peer['peername'], \ + node, ":", ", ".join(errors) + del nodes_at_peer[peer_node_id] + continue + else: + node['site_id'] = peer_sites[node['site_id']]['site_id'] + + # Synchronize new set + peer_nodes = sync(old_peer_nodes, nodes_at_peer, Node) + + for peer_node_id, node in peer_nodes.iteritems(): + # Bind any newly cached foreign nodes to peer + if peer_node_id not in old_peer_nodes: + peer.add_node(node, peer_node_id, commit = False) + node['peer_id'] = peer_id + node['peer_node_id'] = peer_node_id + + timers['nodes'] = time.time() - start + + # + # Synchronize local nodes + # + + start = time.time() + + # Keyed on local node_id + local_nodes = Nodes(self.api).dict() + + for node in peer_tables['PeerNodes']: + # Foreign identifier for our node as maintained by peer + peer_node_id = node['node_id'] + # Local identifier for our node as cached by peer + node_id = node['peer_node_id'] + if node_id in local_nodes: + # Still a valid local node, add it to the synchronized + # set of local node objects keyed on foreign node_id. + peer_nodes[peer_node_id] = local_nodes[node_id] + + timers['local_nodes'] = time.time() - start + + # + # XXX Synchronize foreign slice instantiation states + # + + slice_instantiations = SliceInstantiations(self.api).dict() + + # + # Synchronize foreign slices + # + + start = time.time() + + print >>log, 'Dealing with Slices' + + # Compare only the columns returned by the GetPeerData() call + if peer_tables['Slices']: + columns = peer_tables['Slices'][0].keys() + else: + columns = None + + # Keyed on foreign slice_id + old_peer_slices = Slices(self.api, {'peer_id': peer_id}, columns).dict('peer_slice_id') + slices_at_peer = dict([(slice['slice_id'], slice) \ + for slice in peer_tables['Slices']]) + + # Fix up site_id, instantiation, and creator_person_id references + for peer_slice_id, slice in slices_at_peer.items(): + errors = [] + if slice['site_id'] not in peer_sites: + errors.append("invalid site %d" % slice['site_id']) + if slice['instantiation'] not in slice_instantiations: + errors.append("invalid instantiation %s" % slice['instantiation']) + if slice['creator_person_id'] not in peer_persons: + # Just NULL it out + slice['creator_person_id'] = None + else: + slice['creator_person_id'] = peer_persons[slice['creator_person_id']]['person_id'] + if errors: + print >> log, "Warning: Skipping invalid %s slice:" % peer['peername'], \ + slice, ":", ", ".join(errors) + del slices_at_peer[peer_slice_id] + continue + else: + slice['site_id'] = peer_sites[slice['site_id']]['site_id'] + + # Synchronize new set + peer_slices = sync(old_peer_slices, slices_at_peer, Slice) + + # transcoder : retrieve a local node_id from a peer_node_id + node_transcoder = dict ( [ (node['node_id'],peer_node_id) \ + for peer_node_id,node in peer_nodes.iteritems()]) + person_transcoder = dict ( [ (person['person_id'],peer_person_id) \ + for peer_person_id,person in peer_persons.iteritems()]) + + for peer_slice_id, slice in peer_slices.iteritems(): + # Bind any newly cached foreign slices to peer + if peer_slice_id not in old_peer_slices: + peer.add_slice(slice, peer_slice_id, commit = False) + slice['peer_id'] = peer_id + slice['peer_slice_id'] = peer_slice_id + slice['node_ids'] = [] + slice['person_ids'] = [] + + # Slice as viewed by peer + peer_slice = slices_at_peer[peer_slice_id] + + # Nodes that are currently part of the slice + old_slice_node_ids = [ node_transcoder[node_id] for node_id in slice['node_ids'] \ + if node_transcoder[node_id] in peer_nodes] + + # Nodes that should be part of the slice + slice_node_ids = [ node_id for node_id in peer_slice['node_ids'] if node_id in peer_nodes] + + # Remove stale nodes from slice + for node_id in (set(old_slice_node_ids) - set(slice_node_ids)): + slice.remove_node(peer_nodes[node_id], commit = False) + print >> log, peer['peername'], 'Node', peer_nodes[node_id]['hostname'], 'removed from', slice['name'] + + # Add new nodes to slice + for node_id in (set(slice_node_ids) - set(old_slice_node_ids)): + slice.add_node(peer_nodes[node_id], commit = False) + print >> log, peer['peername'], 'Node', peer_nodes[node_id]['hostname'], 'added into', slice['name'] + + # N.B.: Local nodes that may have been added to the slice + # by hand, are removed. In other words, don't do this. + + # Foreign users that are currently part of the slice + #old_slice_person_ids = [ person_transcoder[person_id] for person_id in slice['person_ids'] \ + # if person_transcoder[person_id] in peer_persons] + # An issue occurred with a user who registered on both sites (same email) + # So the remote person could not get cached locally + # The one-line map/filter style is nicer but ineffective here + old_slice_person_ids = [] + for person_id in slice['person_ids']: + if not person_transcoder.has_key(person_id): + print >> log, 'WARNING : person_id %d in %s not transcodable (1) - skipped'%(person_id,slice['name']) + elif person_transcoder[person_id] not in peer_persons: + print >> log, 'WARNING : person_id %d in %s not transcodable (2) - skipped'%(person_id,slice['name']) + else: + old_slice_person_ids += [person_transcoder[person_id]] + + # Foreign users that should be part of the slice + slice_person_ids = [ person_id for person_id in peer_slice['person_ids'] if person_id in peer_persons ] + + # Remove stale users from slice + for person_id in (set(old_slice_person_ids) - set(slice_person_ids)): + slice.remove_person(peer_persons[person_id], commit = False) + print >> log, peer['peername'], 'User', peer_persons[person_id]['email'], 'removed from', slice['name'] + + # Add new users to slice + for person_id in (set(slice_person_ids) - set(old_slice_person_ids)): + slice.add_person(peer_persons[person_id], commit = False) + print >> log, peer['peername'], 'User', peer_persons[person_id]['email'], 'added into', slice['name'] + + # N.B.: Local users that may have been added to the slice + # by hand, are not touched. + + timers['slices'] = time.time() - start + + # Update peer itself and commit + peer.sync(commit = True) + + return timers diff --git a/trunk/PLC/Methods/ResetPassword.py b/trunk/PLC/Methods/ResetPassword.py new file mode 100644 index 0000000..0e2d2a9 --- /dev/null +++ b/trunk/PLC/Methods/ResetPassword.py @@ -0,0 +1,128 @@ +import random +import base64 +import time +import urllib + +from types import StringTypes + +from PLC.Debug import log +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Messages import Message, Messages +from PLC.Auth import Auth +from PLC.sendmail import sendmail + +class ResetPassword(Method): + """ + If verification_key is not specified, then a new verification_key + will be generated and stored with the user's account. The key will + be e-mailed to the user in the form of a link to a web page. + + The web page should verify the key by calling this function again + and specifying verification_key. If the key matches what has been + stored in the user's account, a new random password will be + e-mailed to the user. + + Returns 1 if verification_key was not specified, or was specified + and is valid, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Person.fields['verification_key'], + Person.fields['verification_expires'] + ] + + returns = Parameter(int, '1 if verification_key is valid') + + def call(self, auth, person_id_or_email, verification_key = None, verification_expires = None): + # Get account information + # we need to search in local objects only + if isinstance (person_id_or_email,StringTypes): + filter={'email':person_id_or_email} + else: + filter={'person_id':person_id_or_email} + filter['peer_id']=None + persons = Persons(self.api, filter) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + if not person['enabled']: + raise PLCInvalidArgument, "Account must be enabled" + + # Be paranoid and deny password resets for admins + if 'admin' in person['roles']: + raise PLCInvalidArgument, "Cannot reset admin passwords" + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + random_key = base64.b64encode("".join(map(chr, bytes))) + + if verification_key is not None: + if person['verification_key'] is None or \ + person['verification_expires'] is None or \ + person['verification_expires'] < time.time(): + raise PLCPermissionDenied, "Verification key has expired" + elif person['verification_key'] != verification_key: + raise PLCPermissionDenied, "Verification key incorrect" + else: + # Reset password to random string + person['password'] = random_key + person['verification_key'] = None + person['verification_expires'] = None + person.sync() + + message_id = 'Password reset' + else: + # Only allow one reset at a time + if person['verification_expires'] is not None and \ + person['verification_expires'] > time.time(): + raise PLCPermissionDenied, "Password reset request already pending" + + if verification_expires is None: + verification_expires = int(time.time() + (24 * 60 * 60)) + + person['verification_key'] = random_key + person['verification_expires'] = verification_expires + person.sync() + + message_id = 'Password reset requested' + + messages = Messages(self.api, [message_id]) + if messages: + # Send password to user + message = messages[0] + + params = {'PLC_NAME': self.api.config.PLC_NAME, + 'PLC_MAIL_SUPPORT_ADDRESS': self.api.config.PLC_MAIL_SUPPORT_ADDRESS, + 'PLC_WWW_HOST': self.api.config.PLC_WWW_HOST, + 'PLC_WWW_SSL_PORT': self.api.config.PLC_WWW_SSL_PORT, + 'person_id': person['person_id'], + # Will be used in a URL, so must quote appropriately + 'verification_key': urllib.quote_plus(random_key), + 'password': random_key, + 'email': person['email']} + + sendmail(self.api, + To = ("%s %s" % (person['first_name'], person['last_name']), person['email']), + Subject = message['subject'] % params, + Body = message['template'] % params) + else: + print >> log, "Warning: No message template '%s'" % message_id + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = message_id + + return 1 diff --git a/trunk/PLC/Methods/SetPersonPrimarySite.py b/trunk/PLC/Methods/SetPersonPrimarySite.py new file mode 100644 index 0000000..644826b --- /dev/null +++ b/trunk/PLC/Methods/SetPersonPrimarySite.py @@ -0,0 +1,62 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +class SetPersonPrimarySite(Method): + """ + Makes the specified site the person's primary site. The person + must already be a member of the site. + + Admins may update anyone. All others may only update themselves. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Mixed(Site.fields['site_id'], + Site.fields['login_base']) + ] + + returns = Parameter(int, '1 if successful') + + object_type = 'Person' + + def call(self, auth, person_id_or_email, site_id_or_login_base): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Non-admins can only update their own primary site + if 'admin' not in self.caller['roles'] and \ + self.caller['person_id'] != person['person_id']: + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + if site['site_id'] not in person['site_ids']: + raise PLCInvalidArgument, "Not a member of the specified site" + + person.set_primary_site(site) + + return 1 diff --git a/trunk/PLC/Methods/SliceCreate.py b/trunk/PLC/Methods/SliceCreate.py new file mode 100644 index 0000000..cc30b52 --- /dev/null +++ b/trunk/PLC/Methods/SliceCreate.py @@ -0,0 +1,25 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Methods.AddSlice import AddSlice + +class SliceCreate(AddSlice): + """ + Deprecated. See AddSlice. + """ + + status = "deprecated" + + accepts = [ + Auth(), + Slice.fields['name'], + AddSlice.accepts[1] + ] + + returns = Parameter(int, 'New slice_id (> 0) if successful') + + def call(self, auth, name, slice_fields = {}): + slice_fields['name'] = name + return AddSlice.call(self, auth, slice_fields) diff --git a/trunk/PLC/Methods/SliceDelete.py b/trunk/PLC/Methods/SliceDelete.py new file mode 100644 index 0000000..70f6696 --- /dev/null +++ b/trunk/PLC/Methods/SliceDelete.py @@ -0,0 +1,29 @@ +import re + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.DeleteSlice import DeleteSlice + +class SliceDelete(DeleteSlice): + """ + Deprecated. See DeleteSlice. + + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Slice.fields['name'] + ] + + returns = Parameter(int, 'Returns 1 if successful, a fault otherwise.') + + def call(self, auth, slice_name): + + return DeleteSlice.call(self, auth, slice_name) diff --git a/trunk/PLC/Methods/SliceExtendedInfo.py b/trunk/PLC/Methods/SliceExtendedInfo.py new file mode 100644 index 0000000..1211610 --- /dev/null +++ b/trunk/PLC/Methods/SliceExtendedInfo.py @@ -0,0 +1,84 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Sites import Site, Sites +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons + +class SliceExtendedInfo(Method): + """ + Deprecated. Can be implemented with GetSlices. + + Returns an array of structs containing details about slices. + The summary can optionally include the list of nodes in and + users of each slice. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + [Slice.fields['name']], + Parameter(bool, "Whether or not to return users for the slices", nullok = True), + Parameter(bool, "Whether or not to return nodes for the slices", nullok = True) + ] + + returns = [Slice.fields] + + + def call(self, auth, slice_name_list=None, return_users=None, return_nodes=None, return_attributes=None): + # If we are not admin, make sure to return only viewable + # slices. + slice_filter = slice_name_list + slices = Slices(self.api, slice_filter) + if not slices: + raise PLCInvalidArgument, "No such slice" + + if 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + for slice in slices: + index = slices.index(slice) + node_ids = slices[index].pop('node_ids') + person_ids = slices[index].pop('person_ids') + attribute_ids = slices[index].pop('slice_attribute_ids') + if return_users or return_users is None: + persons = Persons(self.api, person_ids) + person_info = [{'email': person['email'], + 'person_id': person['person_id']} \ + for person in persons] + slices[index]['users'] = person_info + if return_nodes or return_nodes is None: + nodes = Nodes(self.api, node_ids) + node_info = [{'hostname': node['hostname'], + 'node_id': node['node_id']} \ + for node in nodes] + slices[index]['nodes'] = node_info + if return_attributes or return_attributes is None: + attributes = SliceAttributes(self.api, attribute_ids) + attribute_info = [{'name': attribute['name'], + 'value': attribute['value']} \ + for attribute in attributes] + slices[index]['attributes'] = attribute_info + + return slices diff --git a/trunk/PLC/Methods/SliceGetTicket.py b/trunk/PLC/Methods/SliceGetTicket.py new file mode 100644 index 0000000..64413c9 --- /dev/null +++ b/trunk/PLC/Methods/SliceGetTicket.py @@ -0,0 +1,249 @@ +import os +import sys +from subprocess import Popen, PIPE, call +from tempfile import NamedTemporaryFile +from xml.sax.saxutils import escape, quoteattr, XMLGenerator + +from PLC.Faults import * +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Persons import Person, Persons +from PLC.SliceAttributes import SliceAttribute, SliceAttributes + +from PLC.Methods.GetSliceTicket import GetSliceTicket + +class PrettyXMLGenerator(XMLGenerator): + """ + Adds indentation to the beginning and newlines to the end of + opening and closing tags. + """ + + def __init__(self, out = sys.stdout, encoding = "utf-8", indent = "", addindent = "", newl = ""): + XMLGenerator.__init__(self, out, encoding) + # XMLGenerator does not export _write() + self.write = self.ignorableWhitespace + self.indents = [indent] + self.addindent = addindent + self.newl = newl + + def startDocument(self): + XMLGenerator.startDocument(self) + + def startElement(self, name, attrs, indent = True, newl = True): + if indent: + self.ignorableWhitespace("".join(self.indents)) + self.indents.append(self.addindent) + + XMLGenerator.startElement(self, name, attrs) + + if newl: + self.ignorableWhitespace(self.newl) + + def characters(self, content): + # " to " + # ' to ' + self.write(escape(content, { + '"': '"', + "'": ''', + })) + + def endElement(self, name, indent = True, newl = True): + self.indents.pop() + if indent: + self.ignorableWhitespace("".join(self.indents)) + + XMLGenerator.endElement(self, name) + + if newl: + self.ignorableWhitespace(self.newl) + + def simpleElement(self, name, attrs = {}, indent = True, newl = True): + if indent: + self.ignorableWhitespace("".join(self.indents)) + + self.write('<' + name) + for (name, value) in attrs.items(): + self.write(' %s=%s' % (name, quoteattr(value))) + self.write('/>') + + if newl: + self.ignorableWhitespace(self.newl) + +class SliceGetTicket(GetSliceTicket): + """ + Deprecated. See GetSliceTicket. + + Warning: This function exists solely for backward compatibility + with the old public PlanetLab 3.0 Node Manager, which will be + removed from service by 2007. This call is not intended to be used + by any other PLC except the public PlanetLab. + """ + + status = "deprecated" + + def call(self, auth, slice_id_or_name): + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + # Allow peers to obtain tickets for their own slices + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if slice['instantiation'] != 'delegated': + raise PLCInvalidArgument, "Not in delegated state" + + nodes = Nodes(self.api, slice['node_ids']).dict() + persons = Persons(self.api, slice['person_ids']).dict() + slice_attributes = SliceAttributes(self.api, slice['slice_attribute_ids']).dict() + + ticket = NamedTemporaryFile() + + xml = PrettyXMLGenerator(out = ticket, encoding = self.api.encoding, indent = "", addindent = " ", newl = "\n") + xml.startDocument() + + # + xml.startElement('ticket', {}) + + # + xml.startElement('slice', + {'id': str(slice['slice_id']), + 'name': unicode(slice['name']), + 'expiry': unicode(int(slice['expires']))}) + + # + xml.startElement('nodes', {}) + for node_id in slice['node_ids']: + if not nodes.has_key(node_id): + continue + node = nodes[node_id] + # + xml.simpleElement('node', + {'id': str(node['node_id']), + 'hostname': unicode(node['hostname'])}) + # + xml.endElement('nodes') + + # + xml.startElement('users', {}) + for person_id in slice['person_ids']: + if not persons.has_key(person_id): + continue + user = persons[person_id] + # + xml.simpleElement('user', + {'person_id': unicode(user['person_id']), + 'email': unicode(user['email'])}) + # + xml.endElement('users') + + # + xml.startElement('rspec', {}) + for slice_attribute_id in slice['slice_attribute_ids']: + if not slice_attributes.has_key(slice_attribute_id): + continue + slice_attribute = slice_attributes[slice_attribute_id] + + name = slice_attribute['name'] + value = slice_attribute['value'] + + def kbps_to_bps(kbps): + bps = int(kbps) * 1000 + return bps + + def max_kbyte_to_bps(max_kbyte): + bps = int(max_kbyte) * 1000 * 8 / 24 / 60 / 60 + return bps + + # XXX Used to support multiple named values for each attribute type + name_type_cast = { + 'cpu_share': ('nm_cpu_share', 'cpu_share', 'integer', int), + + 'net_share': ('nm_net_share', 'rate', 'integer', int), + 'net_min_rate': ('nm_net_min_rate', 'rate', 'integer', int), + 'net_max_rate': ('nm_net_max_rate', 'rate', 'integer', int), + 'net_max_kbyte': ('nm_net_avg_rate', 'rate', 'integer', max_kbyte_to_bps), + + 'net_i2_share': ('nm_net_exempt_share', 'rate', 'integer', int), + 'net_i2_min_rate': ('nm_net_exempt_min_rate', 'rate', 'integer', kbps_to_bps), + 'net_i2_max_rate': ('nm_net_exempt_max_rate', 'rate', 'integer', kbps_to_bps), + 'net_i2_max_kbyte': ('nm_net_exempt_avg_rate', 'rate', 'integer', max_kbyte_to_bps), + + 'disk_max': ('nm_disk_quota', 'quota', 'integer', int), + 'plc_agent_version': ('plc_agent_version', 'version', 'string', str), + 'plc_slice_type': ('plc_slice_type', 'type', 'string', str), + 'plc_ticket_pubkey': ('plc_ticket_pubkey', 'key', 'string', str), + } + + if name == 'initscript': + (attribute_name, value_name, type) = ('initscript', 'initscript_id', 'integer') + value = slice_attribute['slice_attribute_id'] + elif name in name_type_cast: + (attribute_name, value_name, type, cast) = name_type_cast[name] + value = cast(value) + else: + attribute_name = value_name = name + type = "string" + + # + xml.startElement('resource', {'name': unicode(attribute_name)}) + + # + xml.startElement('value', + {'name': unicode(value_name), + 'type': type}, + newl = False) + # element value + xml.characters(unicode(value)) + # + xml.endElement('value', indent = False) + + # + xml.endElement('resource') + # + xml.endElement('rspec') + + # + xml.endElement('slice') + + # Add signature template + xml.startElement('Signature', {'xmlns': "http://www.w3.org/2000/09/xmldsig#"}) + xml.startElement('SignedInfo', {}) + xml.simpleElement('CanonicalizationMethod', {'Algorithm': "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"}) + xml.simpleElement('SignatureMethod', {'Algorithm': "http://www.w3.org/2000/09/xmldsig#rsa-sha1"}) + xml.startElement('Reference', {'URI': ""}) + xml.startElement('Transforms', {}) + xml.simpleElement('Transform', {'Algorithm': "http://www.w3.org/2000/09/xmldsig#enveloped-signature"}) + xml.endElement('Transforms') + xml.simpleElement('DigestMethod', {'Algorithm': "http://www.w3.org/2000/09/xmldsig#sha1"}) + xml.simpleElement('DigestValue', {}) + xml.endElement('Reference') + xml.endElement('SignedInfo') + xml.simpleElement('SignatureValue', {}) + xml.endElement('Signature') + + xml.endElement('ticket') + xml.endDocument() + + if not hasattr(self.api.config, 'PLC_API_TICKET_KEY') or \ + not os.path.exists(self.api.config.PLC_API_TICKET_KEY): + raise PLCAPIError, "Slice ticket signing key not found" + + ticket.flush() + + # Sign the ticket + p = Popen(["xmlsec1", "--sign", + "--privkey-pem", self.api.config.PLC_API_TICKET_KEY, + ticket.name], + stdin = PIPE, stdout = PIPE, stderr = PIPE, close_fds = True) + signed_ticket = p.stdout.read() + err = p.stderr.read() + rc = p.wait() + + ticket.close() + + if rc: + raise PLCAPIError, err + + return signed_ticket diff --git a/trunk/PLC/Methods/SliceInfo.py b/trunk/PLC/Methods/SliceInfo.py new file mode 100644 index 0000000..9645f99 --- /dev/null +++ b/trunk/PLC/Methods/SliceInfo.py @@ -0,0 +1,75 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Faults import * +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes + +class SliceInfo(Method): + """ + Deprecated. Can be implemented with GetSlices. + + Returns an array of structs containing details about slices. + The summary can optionally include the list of nodes in and + users of each slice. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + [Mixed(Slice.fields['name'])], + Parameter(bool, "Whether or not to return users for the slices", nullok = True), + Parameter(bool, "Whether or not to return nodes for the slices", nullok = True) + ] + + returns = [Slice.fields] + + + def call(self, auth, slice_name_list=None, return_users=None, return_nodes=None): + # If we are not admin, make sure to return only viewable + # slices. + slice_filter = slice_name_list + slices = Slices(self.api, slice_filter) + if not slices: + raise PLCInvalidArgument, "No such slice" + + if 'admin' not in self.caller['roles']: + # Get slices that we are able to view + valid_slice_ids = self.caller['slice_ids'] + if 'pi' in self.caller['roles'] and self.caller['site_ids']: + sites = Sites(self.api, self.caller['site_ids']) + for site in sites: + valid_slice_ids += site['slice_ids'] + + if not valid_slice_ids: + return [] + + slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) + + + for slice in slices: + index = slices.index(slice) + node_ids = slices[index].pop('node_ids') + person_ids = slices[index].pop('person_ids') + if return_users or return_users is None: + persons = Persons(self.api, person_ids) + emails = [person['email'] for person in persons] + slices[index]['users'] = emails + if return_nodes or return_nodes is None: + nodes = Nodes(self.api, node_ids) + hostnames = [node['hostname'] for node in nodes] + slices[index]['nodes'] = hostnames + + + return slices diff --git a/trunk/PLC/Methods/SliceListNames.py b/trunk/PLC/Methods/SliceListNames.py new file mode 100644 index 0000000..4d94933 --- /dev/null +++ b/trunk/PLC/Methods/SliceListNames.py @@ -0,0 +1,45 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Methods.GetSlices import GetSlices + +class SliceListNames(GetSlices): + """ + Deprecated. Can be implemented with GetSlices. + + List the names of registered slices. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Parameter(str, "Slice prefix", nullok = True) + ] + + returns = [Slice.fields['name']] + + + def call(self, auth, prefix=None): + + slice_filter = None + if prefix: + slice_filter = {'name': prefix+'*'} + + slices = GetSlices.call(self, auth, slice_filter) + + if not slices: + raise PLCInvalidArgument, "No such slice" + + slice_names = [slice['name'] for slice in slices] + + return slice_names diff --git a/trunk/PLC/Methods/SliceListUserSlices.py b/trunk/PLC/Methods/SliceListUserSlices.py new file mode 100644 index 0000000..9e054ed --- /dev/null +++ b/trunk/PLC/Methods/SliceListUserSlices.py @@ -0,0 +1,47 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Methods.GetSlices import GetSlices +from PLC.Methods.GetPersons import GetPersons + +class SliceListUserSlices(GetSlices, GetPersons): + """ + Deprecated. Can be implemented with GetPersons and GetSlices. + + Return the slices the specified user (by email address) is a member of. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified in + slice_filter, details about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Person.fields['email'] + ] + + returns = [Slice.fields['name']] + + + def call(self, auth, email): + + persons = GetPersons.call(self, auth, [email]) + if not persons: + return [] + person = persons[0] + slice_ids = person['slice_ids'] + if not slice_ids: + return [] + + slices = GetSlices.call(self, auth, slice_ids) + slice_names = [slice['name'] for slice in slices] + + return slice_names diff --git a/trunk/PLC/Methods/SliceNodesAdd.py b/trunk/PLC/Methods/SliceNodesAdd.py new file mode 100644 index 0000000..35ccabe --- /dev/null +++ b/trunk/PLC/Methods/SliceNodesAdd.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.AddSliceToNodes import AddSliceToNodes + +class SliceNodesAdd(AddSliceToNodes): + """ + Deprecated. See AddSliceToNodes. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Node.fields['hostname']] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, nodes_list): + + return AddSliceToNodes.call(self, auth, slice_name, nodes_list) diff --git a/trunk/PLC/Methods/SliceNodesDel.py b/trunk/PLC/Methods/SliceNodesDel.py new file mode 100644 index 0000000..66c0ed2 --- /dev/null +++ b/trunk/PLC/Methods/SliceNodesDel.py @@ -0,0 +1,29 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.DeleteSliceFromNodes import DeleteSliceFromNodes + +class SliceNodesDel(DeleteSliceFromNodes): + """ + Deprecated. See DeleteSliceFromNodes. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Node.fields['hostname']] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, nodes_list): + + return DeleteSliceFromNodes.call(self, auth, slice_name, nodes_list) diff --git a/trunk/PLC/Methods/SliceNodesList.py b/trunk/PLC/Methods/SliceNodesList.py new file mode 100644 index 0000000..0c44f66 --- /dev/null +++ b/trunk/PLC/Methods/SliceNodesList.py @@ -0,0 +1,40 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Methods.GetSlices import GetSlices +from PLC.Methods.GetNodes import GetNodes + +class SliceNodesList(GetSlices, GetNodes): + """ + Deprecated. Can be implemented with GetSlices and GetNodes. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'] + ] + + returns = [Node.fields['hostname']] + + + def call(self, auth, slice_name): + slices = GetSlices.call(self, auth, [slice_name]) + if not slices: + return [] + + slice = slices[0] + nodes = GetNodes.call(self, auth, slice['node_ids']) + if not nodes: + return [] + + node_hostnames = [node['hostname'] for node in nodes] + + return node_hostnames diff --git a/trunk/PLC/Methods/SliceRenew.py b/trunk/PLC/Methods/SliceRenew.py new file mode 100644 index 0000000..4ac6f89 --- /dev/null +++ b/trunk/PLC/Methods/SliceRenew.py @@ -0,0 +1,34 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.UpdateSlice import UpdateSlice + +class SliceRenew(UpdateSlice): + """ + Deprecated. See UpdateSlice. + + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + Slice.fields['expires'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, slice_expires): + + slice_fields = {} + slice_fields['expires'] = slice_expires + + return UpdateSlice.call(self, auth, slice_name, slice_fields) + diff --git a/trunk/PLC/Methods/SliceTicketGet.py b/trunk/PLC/Methods/SliceTicketGet.py new file mode 100644 index 0000000..5b2b786 --- /dev/null +++ b/trunk/PLC/Methods/SliceTicketGet.py @@ -0,0 +1,13 @@ +from PLC.Methods.SliceGetTicket import SliceGetTicket + +class SliceTicketGet(SliceGetTicket): + """ + Deprecated. See GetSliceTicket. + + Warning: This function exists solely for backward compatibility + with the old public PlanetLab 3.0 Node Manager, which will be + removed from service by 2007. This call is not intended to be used + by any other PLC except the public PlanetLab. + """ + + status = "deprecated" diff --git a/trunk/PLC/Methods/SliceUpdate.py b/trunk/PLC/Methods/SliceUpdate.py new file mode 100644 index 0000000..9e82d3a --- /dev/null +++ b/trunk/PLC/Methods/SliceUpdate.py @@ -0,0 +1,37 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.UpdateSlice import UpdateSlice + +class SliceUpdate(UpdateSlice): + """ + Deprecated. See UpdateSlice. + + """ + + status = 'deprecated' + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'], + Slice.fields['url'], + Slice.fields['description'], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, url, description): + + slice_fields = {} + slice_fields['url'] = url + slice_fields['description'] = description + + return UpdateSlice.call(self, auth, slice_name, slice_fields) + + return 1 diff --git a/trunk/PLC/Methods/SliceUserAdd.py b/trunk/PLC/Methods/SliceUserAdd.py new file mode 100644 index 0000000..560a66a --- /dev/null +++ b/trunk/PLC/Methods/SliceUserAdd.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Methods.AddPersonToSlice import AddPersonToSlice + +class SliceUserAdd(AddPersonToSlice): + """ + Deprecated. See AddPersonToSlice. + + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Person.fields['email']], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, user_list): + + for user in user_list: + AddPersonToSlice.call(self, auth, user, slice_name) + + return 1 diff --git a/trunk/PLC/Methods/SliceUserDel.py b/trunk/PLC/Methods/SliceUserDel.py new file mode 100644 index 0000000..0b41b15 --- /dev/null +++ b/trunk/PLC/Methods/SliceUserDel.py @@ -0,0 +1,35 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Persons import Person, Persons +from PLC.Slices import Slice, Slices +from PLC.Methods.DeletePersonFromSlice import DeletePersonFromSlice + +class SliceUserDel(Method): + """ + Deprecated. Can be implemented with DeletePersonFromSlice. + + Removes the specified users from the specified slice. If the person is + already a member of the slice, no errors are returned. + + Returns 1 if successful, faults otherwise. + """ + + status = "deprecated" + + roles = ['admin', 'pi'] + + accepts = [ + Auth(), + Slice.fields['name'], + [Person.fields['email']], + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_name, user_list): + for user in user_list: + DeletePersonFromSlice.call(self, auth, user, slice_name) + + return 1 diff --git a/trunk/PLC/Methods/SliceUsersList.py b/trunk/PLC/Methods/SliceUsersList.py new file mode 100644 index 0000000..e3eb1e4 --- /dev/null +++ b/trunk/PLC/Methods/SliceUsersList.py @@ -0,0 +1,45 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Auth import Auth +from PLC.Slices import Slice, Slices +from PLC.Persons import Person, Persons +from PLC.Methods.GetSlices import GetSlices +from PLC.Methods.GetPersons import GetPersons + +class SliceUsersList(GetSlices, GetPersons): + """ + Deprecated. Can be implemented with GetSlices and GetPersons. + + List users that are members of the named slice. + + Users may only query slices of which they are members. PIs may + query any of the slices at their sites. Admins may query any + slice. If a slice that cannot be queried is specified details + about that slice will not be returned. + """ + + status = "deprecated" + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + Slice.fields['name'] + ] + + returns = [Person.fields['email']] + + + def call(self, auth, slice_name): + + slice_filter = [slice_name] + slices = GetSlices.call(self, auth, slice_filter) + if not slices: + return [] + slice = slices[0] + + persons = GetPersons.call(self, auth, slice['person_ids']) + person_emails = [person['email'] for person in persons] + + return person_emails diff --git a/trunk/PLC/Methods/UpdateAddress.py b/trunk/PLC/Methods/UpdateAddress.py new file mode 100644 index 0000000..ed2fd43 --- /dev/null +++ b/trunk/PLC/Methods/UpdateAddress.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Addresses import Address, Addresses +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['line1', 'line2', 'line3', + 'city', 'state', 'postalcode', 'country'] + +class UpdateAddress(Method): + """ + Updates the parameters of an existing address with the values in + address_fields. + + PIs may only update addresses of their own sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + address_fields = dict(filter(can_update, Address.fields.items())) + + accepts = [ + Auth(), + Address.fields['address_id'], + address_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, address_id, address_fields): + address_fields = dict(filter(can_update, address_fields.items())) + + # Get associated address details + addresses = Addresses(self.api, [address_id]) + if not addresses: + raise PLCInvalidArgument, "No such address" + address = addresses[0] + + if 'admin' not in self.caller['roles']: + if address['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Address must be associated with one of your sites" + + address.update(address_fields) + address.sync() + + # Logging variables + self.event_objects = {'Address': [address['address_id']]} + self.message = 'Address %d updated: %s' % \ + (address['address_id'], ", ".join(address_fields.keys())) + + return 1 diff --git a/trunk/PLC/Methods/UpdateAddressType.py b/trunk/PLC/Methods/UpdateAddressType.py new file mode 100644 index 0000000..922c940 --- /dev/null +++ b/trunk/PLC/Methods/UpdateAddressType.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.AddressTypes import AddressType, AddressTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in ['name', 'description'] + +class UpdateAddressType(Method): + """ + Updates the parameters of an existing address type with the values + in address_type_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + address_type_fields = dict(filter(can_update, AddressType.fields.items())) + + accepts = [ + Auth(), + Mixed(AddressType.fields['address_type_id'], + AddressType.fields['name']), + address_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, address_type_id_or_name, address_type_fields): + address_type_fields = dict(filter(can_update, address_type_fields.items())) + + address_types = AddressTypes(self.api, [address_type_id_or_name]) + if not address_types: + raise PLCInvalidArgument, "No such address type" + address_type = address_types[0] + + address_type.update(address_type_fields) + address_type.sync() + self.event_objects = {'AddressType': [address_type['address_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/UpdateConfFile.py b/trunk/PLC/Methods/UpdateConfFile.py new file mode 100644 index 0000000..6fd0e2a --- /dev/null +++ b/trunk/PLC/Methods/UpdateConfFile.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.ConfFiles import ConfFile, ConfFiles +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['conf_file_id', 'node_ids', 'nodegroup_ids'] + +class UpdateConfFile(Method): + """ + Updates a node configuration file. Only the fields specified in + conf_file_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + conf_file_fields = dict(filter(can_update, ConfFile.fields.items())) + + accepts = [ + Auth(), + ConfFile.fields['conf_file_id'], + conf_file_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, conf_file_id, conf_file_fields): + conf_file_fields = dict(filter(can_update, conf_file_fields.items())) + + conf_files = ConfFiles(self.api, [conf_file_id]) + if not conf_files: + raise PLCInvalidArgument, "No such configuration file" + + conf_file = conf_files[0] + conf_file.update(conf_file_fields) + conf_file.sync() + self.event_objects = {'ConfFile': [conf_file['conf_file_id']]} + + return 1 diff --git a/trunk/PLC/Methods/UpdateInitScript.py b/trunk/PLC/Methods/UpdateInitScript.py new file mode 100644 index 0000000..bb0f1f0 --- /dev/null +++ b/trunk/PLC/Methods/UpdateInitScript.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['initscript_id'] + +class UpdateInitScript(Method): + """ + Updates an initscript. Only the fields specified in + initscript_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + initscript_fields = dict(filter(can_update, InitScript.fields.items())) + + accepts = [ + Auth(), + InitScript.fields['initscript_id'], + initscript_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, initscript_id, initscript_fields): + initscript_fields = dict(filter(can_update, initscript_fields.items())) + + initscripts = InitScripts(self.api, [initscript_id]) + if not initscripts: + raise PLCInvalidArgument, "No such initscript" + + initscript = initscripts[0] + initscript.update(initscript_fields) + initscript.sync() + self.event_objects = {'InitScript': [initscript['initscript_id']]} + + return 1 diff --git a/trunk/PLC/Methods/UpdateKey.py b/trunk/PLC/Methods/UpdateKey.py new file mode 100644 index 0000000..0fb560b --- /dev/null +++ b/trunk/PLC/Methods/UpdateKey.py @@ -0,0 +1,55 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Keys import Key, Keys +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['key_type', 'key'] + +class UpdateKey(Method): + """ + Updates the parameters of an existing key with the values in + key_fields. + + Non-admins may only update their own keys. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + key_fields = dict(filter(can_update, Key.fields.items())) + + accepts = [ + Auth(), + Key.fields['key_id'], + key_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, key_id, key_fields): + key_fields = dict(filter(can_update, key_fields.items())) + + # Get key information + keys = Keys(self.api, [key_id]) + if not keys: + raise PLCInvalidArgument, "No such key" + key = keys[0] + + if key['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local key" + + if 'admin' not in self.caller['roles']: + if key['key_id'] not in self.caller['key_ids']: + raise PLCPermissionDenied, "Key must be associated with one of your accounts" + + key.update(key_fields) + key.sync() + + # Logging variables + self.event_objects = {'Key': [key['key_id']]} + self.message = 'key %d updated: %s' % \ + (key['key_id'], ", ".join(key_fields.keys())) + return 1 diff --git a/trunk/PLC/Methods/UpdateMessage.py b/trunk/PLC/Methods/UpdateMessage.py new file mode 100644 index 0000000..e44dca4 --- /dev/null +++ b/trunk/PLC/Methods/UpdateMessage.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Messages import Message, Messages +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['template', 'enabled'] + +class UpdateMessage(Method): + """ + Updates the parameters of an existing message template with the + values in message_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + message_fields = dict(filter(can_update, Message.fields.items())) + + accepts = [ + Auth(), + Message.fields['message_id'], + message_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, message_id, message_fields): + message_fields = dict(filter(can_update, message_fields.items())) + + # Get message information + messages = Messages(self.api, [message_id]) + if not messages: + raise PLCInvalidArgument, "No such message" + message = messages[0] + + message.update(message_fields) + message.sync() + self.event_objects = {'Message': [message['message_id']]} + + return 1 diff --git a/trunk/PLC/Methods/UpdateNode.py b/trunk/PLC/Methods/UpdateNode.py new file mode 100644 index 0000000..d5cdb0d --- /dev/null +++ b/trunk/PLC/Methods/UpdateNode.py @@ -0,0 +1,81 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.Auth import Auth + +related_fields = Node.related_fields.keys() +can_update = lambda (field, value): field in \ + ['hostname', 'boot_state', 'model', 'version', + 'key', 'session', 'boot_nonce'] + \ + related_fields + +class UpdateNode(Method): + """ + Updates a node. Only the fields specified in node_fields are + updated, all other fields are left untouched. + + PIs and techs can update only the nodes at their sites. Only + admins can update the key, session, and boot_nonce fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + node_fields = dict(filter(can_update, Node.fields.items() + Node.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Node.fields['node_id'], + Node.fields['hostname']), + node_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, node_id_or_hostname, node_fields): + node_fields = dict(filter(can_update, node_fields.items())) + + # Remove admin only fields + if 'admin' not in self.caller['roles']: + for key in 'key', 'session', 'boot_nonce': + if node_fields.has_key(key): + del node_fields[key] + + # Get account information + nodes = Nodes(self.api, [node_id_or_hostname]) + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local node" + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site at which the node is located. + if 'admin' not in self.caller['roles']: + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to delete nodes from specified site" + + # Make requested associations + for field in related_fields: + if field in node_fields: + node.associate(auth, field, node_fields[field]) + node_fields.pop(field) + + node.update(node_fields) + node.update_last_updated(False) + node.sync() + + # Logging variables + self.event_objects = {'Node': [node['node_id']]} + self.message = 'Node %d updated: %s.' % \ + (node['node_id'], ", ".join(node_fields.keys())) + if 'boot_state' in node_fields.keys(): + self.message += ' boot_state updated to %s' % node_fields['boot_state'] + + return 1 diff --git a/trunk/PLC/Methods/UpdateNodeGroup.py b/trunk/PLC/Methods/UpdateNodeGroup.py new file mode 100644 index 0000000..c84c7f1 --- /dev/null +++ b/trunk/PLC/Methods/UpdateNodeGroup.py @@ -0,0 +1,54 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Auth import Auth + +related_fields = NodeGroup.related_fields.keys() +can_update = lambda (field, value): field in \ + ['name', 'description'] + \ + related_fields + +class UpdateNodeGroup(Method): + """ + Updates a custom node group. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + nodegroup_fields = dict(filter(can_update, NodeGroup.fields.items() + NodeGroup.related_fields.items())) + + accepts = [ + Auth(), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']), + nodegroup_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodegroup_id_or_name, nodegroup_fields): + nodegroup_fields = dict(filter(can_update, nodegroup_fields.items())) + + # Get nodegroup information + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + nodegroup = nodegroups[0] + + # Make requested associations + for field in related_fields: + if field in nodegroup_fields: + nodegroup.associate(auth, field, nodegroup_fields[field]) + nodegroup_fields.pop(field) + + nodegroup.update(nodegroup_fields) + nodegroup.sync() + + # Logging variables + self.event_objects = {'NodeGroup': [nodegroup['nodegroup_id']]} + self.message = 'Node group %d updated: %s' % \ + (nodegroup['nodegroup_id'], ", ".join(nodegroup_fields.keys())) + return 1 diff --git a/trunk/PLC/Methods/UpdateNodeNetwork.py b/trunk/PLC/Methods/UpdateNodeNetwork.py new file mode 100644 index 0000000..dc1e65a --- /dev/null +++ b/trunk/PLC/Methods/UpdateNodeNetwork.py @@ -0,0 +1,69 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Nodes import Node, Nodes +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['nodenetwork_id','node_id'] + +class UpdateNodeNetwork(Method): + """ + Updates an existing node network. Any values specified in + nodenetwork_fields are used, otherwise defaults are + used. Acceptable values for method are dhcp and static. If type is + static, then ip, gateway, network, broadcast, netmask, and dns1 + must all be specified in nodenetwork_fields. If type is dhcp, + these parameters, even if specified, are ignored. + + PIs and techs may only update networks associated with their own + nodes. Admins may update any node network. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + nodenetwork_fields = dict(filter(can_update, NodeNetwork.fields.items())) + + accepts = [ + Auth(), + NodeNetwork.fields['nodenetwork_id'], + nodenetwork_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodenetwork_id, nodenetwork_fields): + nodenetwork_fields = dict(filter(can_update, nodenetwork_fields.items())) + + # Get node network information + nodenetworks = NodeNetworks(self.api, [nodenetwork_id]) + if not nodenetworks: + raise PLCInvalidArgument, "No such node network" + + nodenetwork = nodenetworks[0] + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site where the node exists. + if 'admin' not in self.caller['roles']: + nodes = Nodes(self.api, [nodenetwork['node_id']]) + if not nodes: + raise PLCPermissionDenied, "Node network is not associated with a node" + node = nodes[0] + if node['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to update node network" + + # Update node network + nodenetwork.update(nodenetwork_fields) + nodenetwork.sync() + + self.event_objects = {'NodeNetwork': [nodenetwork['nodenetwork_id']]} + self.message = "Node network %d updated: %s " % \ + (nodenetwork['nodenetwork_id'], ", ".join(nodenetwork_fields.keys())) + + return 1 diff --git a/trunk/PLC/Methods/UpdateNodeNetworkSetting.py b/trunk/PLC/Methods/UpdateNodeNetworkSetting.py new file mode 100644 index 0000000..bd59879 --- /dev/null +++ b/trunk/PLC/Methods/UpdateNodeNetworkSetting.py @@ -0,0 +1,72 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth + +from PLC.NodeNetworkSettings import NodeNetworkSetting, NodeNetworkSettings +from PLC.NodeNetworks import NodeNetwork, NodeNetworks + +from PLC.Nodes import Nodes +from PLC.Sites import Sites + +class UpdateNodeNetworkSetting(Method): + """ + Updates the value of an existing nodenetwork setting + + Access rights depend on the nodenetwork setting type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech', 'user'] + + accepts = [ + Auth(), + NodeNetworkSetting.fields['nodenetwork_setting_id'], + NodeNetworkSetting.fields['value'] + ] + + returns = Parameter(int, '1 if successful') + + object_type = 'NodeNetwork' + + def call(self, auth, nodenetwork_setting_id, value): + nodenetwork_settings = NodeNetworkSettings(self.api, [nodenetwork_setting_id]) + if not nodenetwork_settings: + raise PLCInvalidArgument, "No such nodenetwork setting %r"%nodenetwork_setting_id + nodenetwork_setting = nodenetwork_settings[0] + + ### reproducing a check from UpdateSliceAttribute, looks dumb though + nodenetworks = NodeNetworks(self.api, [nodenetwork_setting['nodenetwork_id']]) + if not nodenetworks: + raise PLCInvalidArgument, "No such nodenetwork %r"%nodenetwork_setting['nodenetwork_id'] + nodenetwork = nodenetworks[0] + + assert nodenetwork_setting['nodenetwork_setting_id'] in nodenetwork['nodenetwork_setting_ids'] + + # check permission : it not admin, is the user affiliated with the right site + if 'admin' not in self.caller['roles']: + # locate node + node = Nodes (self.api,[nodenetwork['node_id']])[0] + # locate site + site = Sites (self.api, [node['site_id']])[0] + # check caller is affiliated with this site + if self.caller['person_id'] not in site['person_ids']: + raise PLCPermissionDenied, "Not a member of the hosting site %s"%site['abbreviated_site'] + + required_min_role = nodenetwork_setting_type ['min_role_id'] + if required_min_role is not None and \ + min(self.caller['role_ids']) > required_min_role: + raise PLCPermissionDenied, "Not allowed to modify the specified nodenetwork setting, requires role %d",required_min_role + + nodenetwork_setting['value'] = value + nodenetwork_setting.sync() + + self.object_ids = [nodenetwork_setting['nodenetwork_setting_id']] + return 1 diff --git a/trunk/PLC/Methods/UpdateNodeNetworkSettingType.py b/trunk/PLC/Methods/UpdateNodeNetworkSettingType.py new file mode 100644 index 0000000..5501c11 --- /dev/null +++ b/trunk/PLC/Methods/UpdateNodeNetworkSettingType.py @@ -0,0 +1,48 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'category', 'min_role_id'] + +class UpdateNodeNetworkSettingType(Method): + """ + Updates the parameters of an existing setting type + with the values in nodenetwork_setting_type_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + nodenetwork_setting_type_fields = dict(filter(can_update, NodeNetworkSettingType.fields.items())) + + accepts = [ + Auth(), + Mixed(NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + NodeNetworkSettingType.fields['name']), + nodenetwork_setting_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, nodenetwork_setting_type_id_or_name, nodenetwork_setting_type_fields): + nodenetwork_setting_type_fields = dict(filter(can_update, nodenetwork_setting_type_fields.items())) + + nodenetwork_setting_types = NodeNetworkSettingTypes(self.api, [nodenetwork_setting_type_id_or_name]) + if not nodenetwork_setting_types: + raise PLCInvalidArgument, "No such setting type" + nodenetwork_setting_type = nodenetwork_setting_types[0] + + nodenetwork_setting_type.update(nodenetwork_setting_type_fields) + nodenetwork_setting_type.sync() + self.object_ids = [nodenetwork_setting_type['nodenetwork_setting_type_id']] + + return 1 diff --git a/trunk/PLC/Methods/UpdatePCU.py b/trunk/PLC/Methods/UpdatePCU.py new file mode 100644 index 0000000..8916684 --- /dev/null +++ b/trunk/PLC/Methods/UpdatePCU.py @@ -0,0 +1,52 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUs import PCU, PCUs +from PLC.Auth import Auth + +can_update = lambda (field, value): field not in \ + ['pcu_id', 'site_id'] + +class UpdatePCU(Method): + """ + Updates the parameters of an existing PCU with the values in + pcu_fields. + + Non-admins may only update PCUs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'tech'] + + update_fields = dict(filter(can_update, PCU.fields.items())) + + accepts = [ + Auth(), + PCU.fields['pcu_id'], + update_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_id, pcu_fields): + pcu_fields = dict(filter(can_update, pcu_fields.items())) + + # Get associated PCU details + pcus = PCUs(self.api, [pcu_id]) + if not pcus: + raise PLCInvalidArgument, "No such PCU" + pcu = pcus[0] + + if 'admin' not in self.caller['roles']: + if pcu['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to update that PCU" + + pcu.update(pcu_fields) + pcu.sync() + + # Logging variables + self.event_objects = {'PCU': [pcu['pcu_id']]} + self.message = 'PCU %d updated: %s' % \ + (pcu['pcu_id'], ", ".join(pcu_fields.keys())) + return 1 diff --git a/trunk/PLC/Methods/UpdatePCUProtocolType.py b/trunk/PLC/Methods/UpdatePCUProtocolType.py new file mode 100644 index 0000000..b1a30bc --- /dev/null +++ b/trunk/PLC/Methods/UpdatePCUProtocolType.py @@ -0,0 +1,41 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUProtocolTypes import PCUProtocolType, PCUProtocolTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['pcu_type_id', 'port', 'protocol', 'supported'] + +class UpdatePCUProtocolType(Method): + """ + Updates a pcu protocol type. Only the fields specified in + port_typee_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + protocol_type_fields = dict(filter(can_update, PCUProtocolType.fields.items())) + + accepts = [ + Auth(), + PCUProtocolType.fields['pcu_protocol_type_id'], + protocol_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, protocol_type_id, protocol_type_fields): + protocol_type_fields = dict(filter(can_update, protocol_type_fields.items())) + + protocol_types = PCUProtocolTypes(self.api, [protocol_type_id]) + if not protocol_types: + raise PLCInvalidArgument, "No such pcu protocol type" + + protocol_type = protocol_types[0] + protocol_type.update(protocol_type_fields) + protocol_type.sync() + self.event_objects = {'PCUProtocolType': [protocol_type['pcu_protocol_type_id']]} + return 1 diff --git a/trunk/PLC/Methods/UpdatePCUType.py b/trunk/PLC/Methods/UpdatePCUType.py new file mode 100644 index 0000000..fc4e886 --- /dev/null +++ b/trunk/PLC/Methods/UpdatePCUType.py @@ -0,0 +1,42 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.PCUTypes import PCUType, PCUTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['model', 'name'] + +class UpdatePCUType(Method): + """ + Updates a PCU type. Only the fields specified in + pcu_typee_fields are updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + pcu_type_fields = dict(filter(can_update, PCUType.fields.items())) + + accepts = [ + Auth(), + PCUType.fields['pcu_type_id'], + pcu_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, pcu_type_id, pcu_type_fields): + pcu_type_fields = dict(filter(can_update, pcu_type_fields.items())) + + pcu_types = PCUTypes(self.api, [pcu_type_id]) + if not pcu_types: + raise PLCInvalidArgument, "No such pcu type" + + pcu_type = pcu_types[0] + pcu_type.update(pcu_type_fields) + pcu_type.sync() + self.event_objects = {'PCUType': [pcu_type['pcu_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/UpdatePeer.py b/trunk/PLC/Methods/UpdatePeer.py new file mode 100644 index 0000000..8586a48 --- /dev/null +++ b/trunk/PLC/Methods/UpdatePeer.py @@ -0,0 +1,50 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import Auth +from PLC.Peers import Peer, Peers + +can_update = lambda (field, value): field in \ + ['peername', 'peer_url', 'key', 'cacert'] + +class UpdatePeer(Method): + """ + Updates a peer. Only the fields specified in peer_fields are + updated, all other fields are left untouched. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + peer_fields = dict(filter(can_update, Peer.fields.items())) + + accepts = [ + Auth(), + Mixed(Peer.fields['peer_id'], + Peer.fields['peername']), + peer_fields + ] + + returns = Parameter(int, "1 if successful") + + def call(self, auth, peer_id_or_name, peer_fields): + peer_fields = dict(filter(can_update, peer_fields.items())) + + # Get account information + peers = Peers(self.api, [peer_id_or_name]) + if not peers: + raise PLCInvalidArgument, "No such peer" + peer = peers[0] + + if isinstance(self.caller, Peer): + if self.caller['peer_id'] != peer['peer_id']: + raise PLCPermissionDenied, "Not allowed to update specified peer" + + peer.update(peer_fields) + peer.sync() + + # Log affected objects + self.event_objects = {'Peer': [peer['peer_id']]} + + return 1 diff --git a/trunk/PLC/Methods/UpdatePerson.py b/trunk/PLC/Methods/UpdatePerson.py new file mode 100644 index 0000000..8f74fc0 --- /dev/null +++ b/trunk/PLC/Methods/UpdatePerson.py @@ -0,0 +1,77 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Auth import Auth + +related_fields = Person.related_fields.keys() +can_update = lambda (field, value): field in \ + ['first_name', 'last_name', 'title', 'email', + 'password', 'phone', 'url', 'bio', 'accepted_aup', + 'enabled'] + related_fields + +class UpdatePerson(Method): + """ + Updates a person. Only the fields specified in person_fields are + updated, all other fields are left untouched. + + Users and techs can only update themselves. PIs can only update + themselves and other non-PIs at their sites. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + person_fields = dict(filter(can_update, Person.fields.items() + Person.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + person_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, person_id_or_email, person_fields): + person_fields = dict(filter(can_update, person_fields.items())) + + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account" + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account" + + # Authenticated function + assert self.caller is not None + + # Check if we can update this account + if not self.caller.can_update(person): + raise PLCPermissionDenied, "Not allowed to update specified account" + + # Make requested associations + for field in related_fields: + if field in person_fields: + person.associate(auth, field, person_fields[field]) + person_fields.pop(field) + + person.update(person_fields) + person.update_last_updated(False) + person.sync() + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + + # Redact password + if 'password' in person_fields: + person_fields['password'] = "Removed by API" + self.message = 'Person %d updated: %s.' % \ + (person['person_id'], person_fields.keys()) + if 'enabled' in person_fields: + self.message += ' Person enabled' + + return 1 diff --git a/trunk/PLC/Methods/UpdateSite.py b/trunk/PLC/Methods/UpdateSite.py new file mode 100644 index 0000000..6a33c5e --- /dev/null +++ b/trunk/PLC/Methods/UpdateSite.py @@ -0,0 +1,79 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Sites import Site, Sites +from PLC.Auth import Auth + +related_fields = Site.related_fields.keys() +can_update = lambda (field, value): field in \ + ['name', 'abbreviated_name', 'login_base', + 'is_public', 'latitude', 'longitude', 'url', + 'max_slices', 'max_slivers', 'enabled', 'ext_consortium_id'] + \ + related_fields + +class UpdateSite(Method): + """ + Updates a site. Only the fields specified in update_fields are + updated, all other fields are left untouched. + + PIs can only update sites they are a member of. Only admins can + update max_slices, max_slivers, and login_base. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi'] + + site_fields = dict(filter(can_update, Site.fields.items() + Site.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Site.fields['site_id'], + Site.fields['login_base']), + site_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, site_id_or_login_base, site_fields): + site_fields = dict(filter(can_update, site_fields.items())) + + # Get site information + sites = Sites(self.api, [site_id_or_login_base]) + if not sites: + raise PLCInvalidArgument, "No such site" + site = sites[0] + + if site['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local site" + + # Authenticated function + assert self.caller is not None + + # If we are not an admin, make sure that the caller is a + # member of the site. + if 'admin' not in self.caller['roles']: + if site['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Not allowed to modify specified site" + + # Remove admin only fields + for key in 'max_slices', 'max_slivers', 'login_base': + if key in site_fields: + del site_fields[key] + + # Make requested associations + for field in related_fields: + if field in site_fields: + site.associate(auth, field, site_fields[field]) + site_fields.pop(field) + + site.update(site_fields) + site.update_last_updated(False) + site.sync() + + # Logging variables + self.event_objects = {'Site': [site['site_id']]} + self.message = 'Site %d updated: %s' % \ + (site['site_id'], ", ".join(site_fields.keys())) + + return 1 diff --git a/trunk/PLC/Methods/UpdateSlice.py b/trunk/PLC/Methods/UpdateSlice.py new file mode 100644 index 0000000..de4a023 --- /dev/null +++ b/trunk/PLC/Methods/UpdateSlice.py @@ -0,0 +1,101 @@ +import time + +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Slices import Slice, Slices +from PLC.Auth import Auth +from PLC.Sites import Site, Sites + +related_fields = Slice.related_fields.keys() +can_update = lambda (field, value): field in \ + ['instantiation', 'url', 'description', 'max_nodes', 'expires'] + \ + related_fields + + +class UpdateSlice(Method): + """ + Updates the parameters of an existing slice with the values in + slice_fields. + + Users may only update slices of which they are members. PIs may + update any of the slices at their sites, or any slices of which + they are members. Admins may update any slice. + + Only PIs and admins may update max_nodes. Slices cannot be renewed + (by updating the expires parameter) more than 8 weeks into the + future. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + slice_fields = dict(filter(can_update, Slice.fields.items() + Slice.related_fields.items())) + + accepts = [ + Auth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + slice_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, slice_fields): + slice_fields = dict(filter(can_update, slice_fields.items())) + + slices = Slices(self.api, [slice_id_or_name]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + # Renewing + if 'expires' in slice_fields and slice_fields['expires'] > slice['expires']: + sites = Sites(self.api, [slice['site_id']]) + assert sites + site = sites[0] + + if site['max_slices'] < 0: + raise PLCInvalidArgument, "Slice creation and renewal have been disabled for the site" + + # Maximum expiration date is 8 weeks from now + # XXX Make this configurable + max_expires = time.time() + (8 * 7 * 24 * 60 * 60) + + if 'admin' not in self.caller['roles'] and slice_fields['expires'] > max_expires: + raise PLCInvalidArgument, "Cannot renew a slice beyond 8 weeks from now" + + if 'max_nodes' in slice_fields and slice_fields['max_nodes'] != slice['max_nodes']: + if 'admin' not in self.caller['roles'] and \ + 'pi' not in self.caller['roles']: + raise PLCInvalidArgument, "Only admins and PIs may update max_nodes" + + # XXX Make this a configurable policy + if slice['description'] is None or not slice['description'].strip() or \ + slice['url'] is None or not slice['url'].strip(): + raise PLCInvalidArgument, "Cannot renew a slice with an empty description or URL" + + # Make requested associations + for field in related_fields: + if field in slice_fields: + slice.associate(auth, field, slice_fields[field]) + slice_fields.pop(field) + + slice.update(slice_fields) + slice.sync() + + self.event_objects = {'Slice': [slice['slice_id']]} + + return 1 diff --git a/trunk/PLC/Methods/UpdateSliceAttribute.py b/trunk/PLC/Methods/UpdateSliceAttribute.py new file mode 100644 index 0000000..43cf1f3 --- /dev/null +++ b/trunk/PLC/Methods/UpdateSliceAttribute.py @@ -0,0 +1,68 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth + +class UpdateSliceAttribute(Method): + """ + Updates the value of an existing slice or sliver attribute. + + Users may only update attributes of slices or slivers of which + they are members. PIs may only update attributes of slices or + slivers at their sites, or of which they are members. Admins may + update attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + Auth(), + SliceAttribute.fields['slice_attribute_id'], + Mixed(SliceAttribute.fields['value'], + InitScript.fields['initscript_id']) + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_attribute_id, value): + slice_attributes = SliceAttributes(self.api, [slice_attribute_id]) + if not slice_attributes: + raise PLCInvalidArgument, "No such slice attribute" + slice_attribute = slice_attributes[0] + + slices = Slices(self.api, [slice_attribute['slice_id']]) + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if slice['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local slice" + + assert slice_attribute['slice_attribute_id'] in slice['slice_attribute_ids'] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if slice_attribute['min_role_id'] is not None and \ + min(self.caller['role_ids']) > slice_attribute['min_role_id']: + raise PLCPermissionDenied, "Not allowed to update the specified attribute" + + if slice_attribute['name'] in ['plc_initscript_id']: + initscripts = InitScripts(self.api, {'enabled': True, 'initscript_id': int(value)}) + if not initscripts: + raise PLCInvalidArgument, "No such plc initscript" + + slice_attribute['value'] = unicode(value) + slice_attribute.sync() + self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]} + return 1 diff --git a/trunk/PLC/Methods/UpdateSliceAttributeType.py b/trunk/PLC/Methods/UpdateSliceAttributeType.py new file mode 100644 index 0000000..145a51d --- /dev/null +++ b/trunk/PLC/Methods/UpdateSliceAttributeType.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.Auth import Auth + +can_update = lambda (field, value): field in \ + ['name', 'description', 'min_role_id'] + +class UpdateSliceAttributeType(Method): + """ + Updates the parameters of an existing attribute with the values in + attribute_type_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + attribute_type_fields = dict(filter(can_update, SliceAttributeType.fields.items())) + + accepts = [ + Auth(), + Mixed(SliceAttributeType.fields['attribute_type_id'], + SliceAttributeType.fields['name']), + attribute_type_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, attribute_type_id_or_name, attribute_type_fields): + attribute_type_fields = dict(filter(can_update, attribute_type_fields.items())) + + attribute_types = SliceAttributeTypes(self.api, [attribute_type_id_or_name]) + if not attribute_types: + raise PLCInvalidArgument, "No such attribute" + attribute_type = attribute_types[0] + + attribute_type.update(attribute_type_fields) + attribute_type.sync() + self.event_objects = {'AttributeType': [attribute_type['attribute_type_id']]} + + return 1 diff --git a/trunk/PLC/Methods/VerifyPerson.py b/trunk/PLC/Methods/VerifyPerson.py new file mode 100644 index 0000000..9dd784b --- /dev/null +++ b/trunk/PLC/Methods/VerifyPerson.py @@ -0,0 +1,156 @@ +import random +import base64 +import time +import urllib + +from PLC.Debug import log +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Persons import Person, Persons +from PLC.Sites import Site, Sites +from PLC.Messages import Message, Messages +from PLC.Auth import Auth +from PLC.sendmail import sendmail + +class VerifyPerson(Method): + """ + Verify a new (must be disabled) user's e-mail address and registration. + + If verification_key is not specified, then a new verification_key + will be generated and stored with the user's account. The key will + be e-mailed to the user in the form of a link to a web page. + + The web page should verify the key by calling this function again + and specifying verification_key. If the key matches what has been + stored in the user's account, then an e-mail will be sent to the + user's PI (and support if the user is requesting a PI role), + asking the PI (or support) to enable the account. + + Returns 1 if the verification key if valid. + """ + + roles = ['admin'] + + accepts = [ + Auth(), + Mixed(Person.fields['person_id'], + Person.fields['email']), + Person.fields['verification_key'], + Person.fields['verification_expires'] + ] + + returns = Parameter(int, '1 if verification_key is valid') + + def call(self, auth, person_id_or_email, verification_key = None, verification_expires = None): + # Get account information + persons = Persons(self.api, [person_id_or_email]) + if not persons: + raise PLCInvalidArgument, "No such account %r"%person_id_or_email + person = persons[0] + + if person['peer_id'] is not None: + raise PLCInvalidArgument, "Not a local account %r"%person_id_or_email + + if person['enabled']: + raise PLCInvalidArgument, "Account %r must be new (disabled)"%person_id_or_email + + # Get the primary site name + person_sites = Sites(self.api, person['site_ids']) + if person_sites: + site_name = person_sites[0]['name'] + else: + site_name = "No Site" + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + random_key = base64.b64encode("".join(map(chr, bytes))) + + if verification_key is None or \ + (verification_key is not None and person['verification_expires'] and \ + person['verification_expires'] < time.time()): + # Only allow one verification at a time + if person['verification_expires'] is not None and \ + person['verification_expires'] > time.time(): + raise PLCPermissionDenied, "Verification request already pending" + + if verification_expires is None: + verification_expires = int(time.time() + (24 * 60 * 60)) + + person['verification_key'] = random_key + person['verification_expires'] = verification_expires + person.sync() + + # Send e-mail to user + To = ("%s %s" % (person['first_name'], person['last_name']), person['email']) + Cc = None + + message_id = 'Verify account' + + + elif verification_key is not None: + if person['verification_key'] is None or \ + person['verification_expires'] is None: + raise PLCPermissionDenied, "Invalid Verification key" + elif person['verification_key'] != verification_key: + raise PLCPermissionDenied, "Verification key incorrect" + else: + person['verification_key'] = None + person['verification_expires'] = None + person.sync() + + # Get the PI(s) of each site that the user is registering with + person_ids = set() + for site in person_sites: + person_ids.update(site['person_ids']) + persons = Persons(self.api, person_ids) + pis = filter(lambda person: 'pi' in person['roles'] and person['enabled'], persons) + + # Send e-mail to PI(s) and copy the user + To = [("%s %s" % (pi['first_name'], pi['last_name']), pi['email']) for pi in pis] + Cc = ("%s %s" % (person['first_name'], person['last_name']), person['email']) + + if 'pi' in person['roles']: + # And support if user is requesting a PI role + To.append(("%s Support" % self.api.config.PLC_NAME, + self.api.config.PLC_MAIL_SUPPORT_ADDRESS)) + message_id = 'New PI account' + else: + message_id = 'New account' + + messages = Messages(self.api, [message_id]) + if messages: + # Send message to user + message = messages[0] + + params = {'PLC_NAME': self.api.config.PLC_NAME, + 'PLC_MAIL_SUPPORT_ADDRESS': self.api.config.PLC_MAIL_SUPPORT_ADDRESS, + 'PLC_WWW_HOST': self.api.config.PLC_WWW_HOST, + 'PLC_WWW_SSL_PORT': self.api.config.PLC_WWW_SSL_PORT, + 'person_id': person['person_id'], + # Will be used in a URL, so must quote appropriately + 'verification_key': urllib.quote_plus(random_key), + 'site_name': site_name, + 'first_name': person['first_name'], + 'last_name': person['last_name'], + 'email': person['email'], + 'roles': ", ".join(person['roles'])} + + sendmail(self.api, + To = To, + Cc = Cc, + Subject = message['subject'] % params, + Body = message['template'] % params) + else: + print >> log, "Warning: No message template '%s'" % message_id + + # Logging variables + self.event_objects = {'Person': [person['person_id']]} + self.message = message_id + + if verification_key is not None and person['verification_expires'] and \ + person['verification_expires'] < time.time(): + raise PLCPermissionDenied, "Verification key has expired. Another email has been sent." + + return 1 diff --git a/trunk/PLC/Methods/__init__.py b/trunk/PLC/Methods/__init__.py new file mode 100644 index 0000000..45c9228 --- /dev/null +++ b/trunk/PLC/Methods/__init__.py @@ -0,0 +1,231 @@ +methods = """ +AddAddressType +AddAddressTypeToAddress +AddBootState +AddConfFile +AddConfFileToNodeGroup +AddConfFileToNode +AddInitScript +AddKeyType +AddMessage +AddNetworkMethod +AddNetworkType +AddNodeGroup +AddNodeNetwork +AddNodeNetworkSetting +AddNodeNetworkSettingType +AddNode +AddNodeToNodeGroup +AddNodeToPCU +AddPCUProtocolType +AddPCU +AddPCUType +AddPeer +AddPersonKey +AddPerson +AddPersonToSite +AddPersonToSlice +AddRole +AddRoleToPerson +AddSession +AddSiteAddress +AddSite +AddSliceAttribute +AddSliceAttributeType +AddSliceInstantiation +AddSlice +AddSliceToNodes +AddSliceToNodesWhitelist +AdmAddAddressType +AdmAddNodeGroup +AdmAddNodeNetwork +AdmAddNode +AdmAddNodeToNodeGroup +AdmAddPersonKey +AdmAddPerson +AdmAddPersonToSite +AdmAddSitePowerControlUnit +AdmAddSite +AdmAssociateNodeToPowerControlUnitPort +AdmAuthCheck +AdmDeleteAddressType +AdmDeleteAllPersonKeys +AdmDeleteNodeGroup +AdmDeleteNodeNetwork +AdmDeleteNode +AdmDeletePersonKeys +AdmDeletePerson +AdmDeleteSitePowerControlUnit +AdmDeleteSite +AdmDisassociatePowerControlUnitPort +AdmGenerateNodeConfFile +AdmGetAllAddressTypes +AdmGetAllKeyTypes +AdmGetAllNodeNetworks +AdmGetAllRoles +AdmGetNodeGroupNodes +AdmGetNodeGroups +AdmGetNodes +AdmGetPersonKeys +AdmGetPersonRoles +AdmGetPersonSites +AdmGetPersons +AdmGetPowerControlUnitNodes +AdmGetPowerControlUnits +AdmGetSiteNodes +AdmGetSitePersons +AdmGetSitePIs +AdmGetSitePowerControlUnits +AdmGetSites +AdmGetSiteTechContacts +AdmGrantRoleToPerson +AdmIsPersonInRole +AdmQueryConfFile +AdmQueryNode +AdmQueryPerson +AdmQueryPowerControlUnit +AdmQuerySite +AdmRebootNode +AdmRemoveNodeFromNodeGroup +AdmRemovePersonFromSite +AdmRevokeRoleFromPerson +AdmSetPersonEnabled +AdmSetPersonPrimarySite +AdmUpdateNodeGroup +AdmUpdateNodeNetwork +AdmUpdateNode +AdmUpdatePerson +AdmUpdateSitePowerControlUnit +AdmUpdateSite +AnonAdmGetNodeGroups +AuthCheck +BlacklistKey +BootCheckAuthentication +BootGetNodeDetails +BootNotifyOwners +BootUpdateNode +DeleteAddress +DeleteAddressTypeFromAddress +DeleteAddressType +DeleteBootState +DeleteConfFileFromNodeGroup +DeleteConfFileFromNode +DeleteConfFile +DeleteInitScript +DeleteKey +DeleteKeyType +DeleteMessage +DeleteNetworkMethod +DeleteNetworkType +DeleteNodeFromNodeGroup +DeleteNodeFromPCU +DeleteNodeGroup +DeleteNodeNetwork +DeleteNodeNetworkSetting +DeleteNodeNetworkSettingType +DeleteNode +DeletePCUProtocolType +DeletePCU +DeletePCUType +DeletePeer +DeletePersonFromSite +DeletePersonFromSlice +DeletePerson +DeleteRoleFromPerson +DeleteRole +DeleteSession +DeleteSite +DeleteSliceAttribute +DeleteSliceAttributeType +DeleteSliceFromNodes +DeleteSliceFromNodesWhitelist +DeleteSliceInstantiation +DeleteSlice +GenerateNodeConfFile +GetAddresses +GetAddressTypes +GetBootMedium +GetBootStates +GetConfFiles +GetEventObjects +GetEvents +GetInitScripts +GetKeys +GetKeyTypes +GetMessages +GetNetworkMethods +GetNetworkTypes +GetNodeGroups +GetNodeNetworkSettings +GetNodeNetworkSettingTypes +GetNodeNetworks +GetNodes +GetPCUProtocolTypes +GetPCUs +GetPCUTypes +GetPeerData +GetPeerName +GetPeers +GetPersons +GetPlcRelease +GetRoles +GetSession +GetSessions +GetSites +GetSliceAttributes +GetSliceAttributeTypes +GetSliceInstantiations +GetSliceKeys +GetSlicesMD5 +GetSlices +GetSliceTicket +GetSlivers +GetWhitelist +NotifyPersons +NotifySupport +RebootNode +RefreshPeer +ResetPassword +SetPersonPrimarySite +SliceCreate +SliceDelete +SliceExtendedInfo +SliceGetTicket +SliceInfo +SliceListNames +SliceListUserSlices +SliceNodesAdd +SliceNodesDel +SliceNodesList +SliceRenew +SliceTicketGet +SliceUpdate +SliceUserAdd +SliceUserDel +SliceUsersList +system.listMethods +system.methodHelp +system.methodSignature +system.multicall +UpdateAddress +UpdateAddressType +UpdateConfFile +UpdateInitScript +UpdateKey +UpdateMessage +UpdateNodeGroup +UpdateNodeNetwork +UpdateNodeNetworkSetting +UpdateNodeNetworkSettingType +UpdateNode +UpdatePCUProtocolType +UpdatePCU +UpdatePCUType +UpdatePeer +UpdatePerson +UpdateSite +UpdateSliceAttribute +UpdateSliceAttributeType +UpdateSlice +VerifyPerson +""".split() diff --git a/trunk/PLC/Methods/system/.cvsignore b/trunk/PLC/Methods/system/.cvsignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/trunk/PLC/Methods/system/.cvsignore @@ -0,0 +1 @@ +*.pyc diff --git a/trunk/PLC/Methods/system/__init__.py b/trunk/PLC/Methods/system/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trunk/PLC/Methods/system/listMethods.py b/trunk/PLC/Methods/system/listMethods.py new file mode 100644 index 0000000..c8cfa37 --- /dev/null +++ b/trunk/PLC/Methods/system/listMethods.py @@ -0,0 +1,20 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter +import PLC.Methods + +class listMethods(Method): + """ + This method lists all the methods that the XML-RPC server knows + how to dispatch. + """ + + roles = [] + accepts = [] + returns = Parameter(list, 'List of methods') + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.listMethods" + + def call(self): + return self.api.methods diff --git a/trunk/PLC/Methods/system/methodHelp.py b/trunk/PLC/Methods/system/methodHelp.py new file mode 100644 index 0000000..22a0dc1 --- /dev/null +++ b/trunk/PLC/Methods/system/methodHelp.py @@ -0,0 +1,20 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter + +class methodHelp(Method): + """ + Returns help text if defined for the method passed, otherwise + returns an empty string. + """ + + roles = [] + accepts = [Parameter(str, 'Method name')] + returns = Parameter(str, 'Method help') + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.methodHelp" + + def call(self, method): + function = self.api.callable(method) + return function.help() diff --git a/trunk/PLC/Methods/system/methodSignature.py b/trunk/PLC/Methods/system/methodSignature.py new file mode 100644 index 0000000..4b049a1 --- /dev/null +++ b/trunk/PLC/Methods/system/methodSignature.py @@ -0,0 +1,60 @@ +from PLC.Parameter import Parameter, Mixed +from PLC.Method import Method, xmlrpc_type + +class methodSignature(Method): + """ + Returns an array of known signatures (an array of arrays) for the + method name passed. If no signatures are known, returns a + none-array (test for type != array to detect missing signature). + """ + + roles = [] + accepts = [Parameter(str, "Method name")] + returns = [Parameter([str], "Method signature")] + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.methodSignature" + + def possible_signatures(self, signature, arg): + """ + Return a list of the possible new signatures given a current + signature and the next argument. + """ + + if isinstance(arg, Mixed): + arg_types = [xmlrpc_type(mixed_arg) for mixed_arg in arg] + else: + arg_types = [xmlrpc_type(arg)] + + return [signature + [arg_type] for arg_type in arg_types] + + def signatures(self, returns, args): + """ + Returns a list of possible signatures given a return value and + a set of arguments. + """ + + signatures = [[xmlrpc_type(returns)]] + + for arg in args: + # Create lists of possible new signatures for each current + # signature. Reduce the list of lists back down to a + # single list. + signatures = reduce(lambda a, b: a + b, + [self.possible_signatures(signature, arg) \ + for signature in signatures]) + + return signatures + + def call(self, method): + function = self.api.callable(method) + (min_args, max_args, defaults) = function.args() + + signatures = [] + + assert len(max_args) >= len(min_args) + for num_args in range(len(min_args), len(max_args) + 1): + signatures += self.signatures(function.returns, function.accepts[:num_args]) + + return signatures diff --git a/trunk/PLC/Methods/system/multicall.py b/trunk/PLC/Methods/system/multicall.py new file mode 100644 index 0000000..64563ef --- /dev/null +++ b/trunk/PLC/Methods/system/multicall.py @@ -0,0 +1,54 @@ +import sys +import xmlrpclib + +from PLC.Parameter import Parameter, Mixed +from PLC.Method import Method + +class multicall(Method): + """ + Process an array of calls, and return an array of results. Calls + should be structs of the form + + {'methodName': string, 'params': array} + + Each result will either be a single-item array containg the result + value, or a struct of the form + + {'faultCode': int, 'faultString': string} + + This is useful when you need to make lots of small calls without + lots of round trips. + """ + + roles = [] + accepts = [[{'methodName': Parameter(str, "Method name"), + 'params': Parameter(list, "Method arguments")}]] + returns = Mixed([Mixed()], + {'faultCode': Parameter(int, "XML-RPC fault code"), + 'faultString': Parameter(int, "XML-RPC fault detail")}) + + def __init__(self, api): + Method.__init__(self, api) + self.name = "system.multicall" + + def call(self, calls): + # Some error codes, borrowed from xmlrpc-c. + REQUEST_REFUSED_ERROR = -507 + + results = [] + for call in calls: + try: + name = call['methodName'] + params = call['params'] + if name == 'system.multicall': + errmsg = "Recursive system.multicall forbidden" + raise xmlrpclib.Fault(REQUEST_REFUSED_ERROR, errmsg) + result = [self.api.call(self.source, name, *params)] + except xmlrpclib.Fault, fault: + result = {'faultCode': fault.faultCode, + 'faultString': fault.faultString} + except: + errmsg = "%s:%s" % (sys.exc_type, sys.exc_value) + result = {'faultCode': 1, 'faultString': errmsg} + results.append(result) + return results diff --git a/trunk/PLC/NetworkMethods.py b/trunk/PLC/NetworkMethods.py new file mode 100644 index 0000000..41ccfab --- /dev/null +++ b/trunk/PLC/NetworkMethods.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the network_methods table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class NetworkMethod(Row): + """ + Representation of a row in the network_methods table. To use, + instantiate with a dict of values. + """ + + table_name = 'network_methods' + primary_key = 'method' + join_tables = ['nodenetworks'] + fields = { + 'method': Parameter(str, "Network method", max = 20), + } + + def validate_method(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Network method must be specified" + + # Make sure network method does not alredy exist + conflicts = NetworkMethods(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Network method name already in use" + + return name + +class NetworkMethods(Table): + """ + Representation of the network_methods table in the database. + """ + + def __init__(self, api, methods = None): + Table.__init__(self, api, NetworkMethod) + + sql = "SELECT %s FROM network_methods" % \ + ", ".join(NetworkMethod.fields) + + if methods: + sql += " WHERE method IN (%s)" % ", ".join(map(api.db.quote, methods)) + + self.selectall(sql) diff --git a/trunk/PLC/NetworkTypes.py b/trunk/PLC/NetworkTypes.py new file mode 100644 index 0000000..f3a032f --- /dev/null +++ b/trunk/PLC/NetworkTypes.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the network_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class NetworkType(Row): + """ + Representation of a row in the network_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'network_types' + primary_key = 'type' + join_tables = ['nodenetworks'] + fields = { + 'type': Parameter(str, "Network type", max = 20), + } + + def validate_type(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Network type must be specified" + + # Make sure network type does not alredy exist + conflicts = NetworkTypes(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Network type name already in use" + + return name + +class NetworkTypes(Table): + """ + Representation of the network_types table in the database. + """ + + def __init__(self, api, types = None): + Table.__init__(self, api, NetworkType) + + sql = "SELECT %s FROM network_types" % \ + ", ".join(NetworkType.fields) + + if types: + sql += " WHERE type IN (%s)" % ", ".join(map(api.db.quote, types)) + + self.selectall(sql) diff --git a/trunk/PLC/NodeGroups.py b/trunk/PLC/NodeGroups.py new file mode 100644 index 0000000..a2b19d7 --- /dev/null +++ b/trunk/PLC/NodeGroups.py @@ -0,0 +1,182 @@ +# +# Functions for interacting with the nodegroups table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.Nodes import Node, Nodes + +class NodeGroup(Row): + """ + Representation of a row in the nodegroups table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'nodegroups' + primary_key = 'nodegroup_id' + join_tables = ['nodegroup_node', 'conf_file_nodegroup'] + fields = { + 'nodegroup_id': Parameter(int, "Node group identifier"), + 'name': Parameter(str, "Node group name", max = 50), + 'description': Parameter(str, "Node group description", max = 200, nullok = True), + 'node_ids': Parameter([int], "List of nodes in this node group"), + 'conf_file_ids': Parameter([int], "List of configuration files specific to this node group"), + } + related_fields = { + 'conf_files': [Parameter(int, "ConfFile identifier")], + 'nodes': [Mixed(Parameter(int, "Node identifier"), + Parameter(str, "Fully qualified hostname"))] + } + + def validate_name(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Invalid node group name" + + # Make sure node group does not alredy exist + conflicts = NodeGroups(self.api, [name]) + for nodegroup in conflicts: + if 'nodegroup_id' not in self or self['nodegroup_id'] != nodegroup['nodegroup_id']: + raise PLCInvalidArgument, "Node group name already in use" + + return name + + def add_node(self, node, commit = True): + """ + Add node to existing nodegroup. + """ + + assert 'nodegroup_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + node_id = node['node_id'] + nodegroup_id = self['nodegroup_id'] + + if node_id not in self['node_ids']: + assert nodegroup_id not in node['nodegroup_ids'] + + self.api.db.do("INSERT INTO nodegroup_node (nodegroup_id, node_id)" \ + " VALUES(%(nodegroup_id)d, %(node_id)d)", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].append(node_id) + node['nodegroup_ids'].append(nodegroup_id) + + def remove_node(self, node, commit = True): + """ + Remove node from existing nodegroup. + """ + + assert 'nodegroup_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + node_id = node['node_id'] + nodegroup_id = self['nodegroup_id'] + + if node_id in self['node_ids']: + assert nodegroup_id in node['nodegroup_ids'] + + self.api.db.do("DELETE FROM nodegroup_node" \ + " WHERE nodegroup_id = %(nodegroup_id)d" \ + " AND node_id = %(node_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].remove(node_id) + node['nodegroup_ids'].remove(nodegroup_id) + + def associate_nodes(self, auth, field, value): + """ + Adds nodes found in value list to this nodegroup (using AddNodeToNodeGroup). + Deletes nodes not found in value list from this slice (using DeleteNodeFromNodeGroup). + """ + + assert 'node_ids' in self + assert 'nodegroup_id' in self + assert isinstance(value, list) + + (node_ids, hostnames) = self.separate_types(value)[0:2] + + # Translate hostnames into node_ids + if hostnames: + nodes = Nodes(self.api, hostnames, ['node_id']).dict('node_id') + node_ids += nodes.keys() + + # Add new ids, remove stale ids + if self['node_ids'] != node_ids: + from PLC.Methods.AddNodeToNodeGroup import AddNodeToNodeGroup + from PLC.Methods.DeleteNodeFromNodeGroup import DeleteNodeFromNodeGroup + new_nodes = set(node_ids).difference(self['node_ids']) + stale_nodes = set(self['node_ids']).difference(node_ids) + + for new_node in new_nodes: + AddNodeToNodeGroup.__call__(AddNodeToNodeGroup(self.api), auth, new_node, self['nodegroup_id']) + for stale_node in stale_nodes: + DeleteNodeFromNodeGroup.__call__(DeleteNodeFromNodeGroup(self.api), auth, stale_node, self['nodegroup_id']) + + def associate_conf_files(self, auth, field, value): + """ + Add conf_files found in value list (AddConfFileToNodeGroup) + Delets conf_files not found in value list (DeleteConfFileFromNodeGroup) + """ + + assert 'conf_file_ids' in self + assert 'nodegroup_id' in self + assert isinstance(value, list) + + conf_file_ids = self.separate_types(value)[0] + + if self['conf_file_ids'] != conf_file_ids: + from PLC.Methods.AddConfFileToNodeGroup import AddConfFileToNodeGroup + from PLC.Methods.DeleteConfFileFromNodeGroup import DeleteConfFileFromNodeGroup + new_conf_files = set(conf_file_ids).difference(self['conf_file_ids']) + stale_conf_files = set(self['conf_file_ids']).difference(conf_file_ids) + + for new_conf_file in new_conf_files: + AddConfFileToNodeGroup.__call__(AddConfFileToNodeGroup(self.api), auth, new_conf_file, self['nodegroup_id']) + for stale_conf_file in stale_conf_files: + DeleteConfFileFromNodeGroup.__call__(DeleteConfFileFromNodeGroup(self.api), auth, stale_conf_file, self['nodegroup_id']) + + +class NodeGroups(Table): + """ + Representation of row(s) from the nodegroups table in the + database. + """ + + def __init__(self, api, nodegroup_filter = None, columns = None): + Table.__init__(self, api, NodeGroup, columns) + + sql = "SELECT %s FROM view_nodegroups WHERE True" % \ + ", ".join(self.columns) + + if nodegroup_filter is not None: + if isinstance(nodegroup_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), nodegroup_filter) + strs = filter(lambda x: isinstance(x, StringTypes), nodegroup_filter) + nodegroup_filter = Filter(NodeGroup.fields, {'nodegroup_id': ints, 'name': strs}) + sql += " AND (%s) %s" % nodegroup_filter.sql(api, "OR") + elif isinstance(nodegroup_filter, dict): + nodegroup_filter = Filter(NodeGroup.fields, nodegroup_filter) + sql += " AND (%s) %s" % nodegroup_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/trunk/PLC/NodeNetworkSettingTypes.py b/trunk/PLC/NodeNetworkSettingTypes.py new file mode 100644 index 0000000..f25d074 --- /dev/null +++ b/trunk/PLC/NodeNetworkSettingTypes.py @@ -0,0 +1,83 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Roles import Role, Roles + +class NodeNetworkSettingType (Row): + + """ + Representation of a row in the nodenetwork_setting_types table. + """ + + table_name = 'nodenetwork_setting_types' + primary_key = 'nodenetwork_setting_type_id' + join_tables = ['nodenetwork_setting'] + fields = { + 'nodenetwork_setting_type_id': Parameter(int, "Nodenetwork setting type identifier"), + 'name': Parameter(str, "Nodenetwork setting type name", max = 100), + 'description': Parameter(str, "Nodenetwork setting type description", max = 254), + 'category' : Parameter (str, "Nodenetwork setting category", max=64), + 'min_role_id': Parameter(int, "Minimum (least powerful) role that can set or change this attribute"), + } + + # for Cache + class_key = 'name' + foreign_fields = ['category','description','min_role_id'] + foreign_xrefs = [] + + def validate_name(self, name): + if not len(name): + raise PLCInvalidArgument, "nodenetwork setting type name must be set" + + conflicts = NodeNetworkSettingTypes(self.api, [name]) + for setting_type in conflicts: + if 'nodenetwork_setting_type_id' not in self or \ + self['nodenetwork_setting_type_id'] != setting_type['nodenetwork_setting_type_id']: + raise PLCInvalidArgument, "nodenetwork setting type name already in use" + + return name + + def validate_min_role_id(self, role_id): + roles = [row['role_id'] for row in Roles(self.api)] + if role_id not in roles: + raise PLCInvalidArgument, "Invalid role" + + return role_id + +class NodeNetworkSettingTypes(Table): + """ + Representation of row(s) from the nodenetwork_setting_types table + in the database. + """ + + def __init__(self, api, nodenetwork_setting_type_filter = None, columns = None): + Table.__init__(self, api, NodeNetworkSettingType, columns) + + sql = "SELECT %s FROM nodenetwork_setting_types WHERE True" % \ + ", ".join(self.columns) + + if nodenetwork_setting_type_filter is not None: + if isinstance(nodenetwork_setting_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), nodenetwork_setting_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), nodenetwork_setting_type_filter) + nodenetwork_setting_type_filter = Filter(NodeNetworkSettingType.fields, {'nodenetwork_setting_type_id': ints, 'name': strs}) + sql += " AND (%s) %s" % nodenetwork_setting_type_filter.sql(api, "OR") + elif isinstance(nodenetwork_setting_type_filter, dict): + nodenetwork_setting_type_filter = Filter(NodeNetworkSettingType.fields, nodenetwork_setting_type_filter) + sql += " AND (%s) %s" % nodenetwork_setting_type_filter.sql(api, "AND") + elif isinstance (nodenetwork_setting_type_filter, StringTypes): + nodenetwork_setting_type_filter = Filter(NodeNetworkSettingType.fields, {'name':[nodenetwork_setting_type_filter]}) + sql += " AND (%s) %s" % nodenetwork_setting_type_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong nodenetwork setting type filter %r"%nodenetwork_setting_type_filter + + self.selectall(sql) diff --git a/trunk/PLC/NodeNetworkSettings.py b/trunk/PLC/NodeNetworkSettings.py new file mode 100644 index 0000000..c85bae5 --- /dev/null +++ b/trunk/PLC/NodeNetworkSettings.py @@ -0,0 +1,57 @@ +# +# Thierry Parmentelat - INRIA +# +# $Revision$ +# +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.NodeNetworkSettingTypes import NodeNetworkSettingType, NodeNetworkSettingTypes + +class NodeNetworkSetting(Row): + """ + Representation of a row in the nodenetwork_setting. + To use, instantiate with a dict of values. + """ + + table_name = 'nodenetwork_setting' + primary_key = 'nodenetwork_setting_id' + fields = { + 'nodenetwork_setting_id': Parameter(int, "Nodenetwork setting identifier"), + 'nodenetwork_id': Parameter(int, "NodeNetwork identifier"), + 'nodenetwork_setting_type_id': NodeNetworkSettingType.fields['nodenetwork_setting_type_id'], + 'name': NodeNetworkSettingType.fields['name'], + 'description': NodeNetworkSettingType.fields['description'], + 'category': NodeNetworkSettingType.fields['category'], + 'min_role_id': NodeNetworkSettingType.fields['min_role_id'], + 'value': Parameter(str, "Nodenetwork setting value"), + ### relations + + } + +class NodeNetworkSettings(Table): + """ + Representation of row(s) from the nodenetwork_setting table in the + database. + """ + + def __init__(self, api, nodenetwork_setting_filter = None, columns = None): + Table.__init__(self, api, NodeNetworkSetting, columns) + + sql = "SELECT %s FROM view_nodenetwork_settings WHERE True" % \ + ", ".join(self.columns) + + if nodenetwork_setting_filter is not None: + if isinstance(nodenetwork_setting_filter, (list, tuple, set)): + nodenetwork_setting_filter = Filter(NodeNetworkSetting.fields, {'nodenetwork_setting_id': nodenetwork_setting_filter}) + elif isinstance(nodenetwork_setting_filter, dict): + nodenetwork_setting_filter = Filter(NodeNetworkSetting.fields, nodenetwork_setting_filter) + elif isinstance(nodenetwork_setting_filter, int): + nodenetwork_setting_filter = Filter(NodeNetworkSetting.fields, {'nodenetwork_setting_id': [nodenetwork_setting_filter]}) + else: + raise PLCInvalidArgument, "Wrong nodenetwork setting filter %r"%nodenetwork_setting_filter + sql += " AND (%s) %s" % nodenetwork_setting_filter.sql(api) + + + self.selectall(sql) diff --git a/trunk/PLC/NodeNetworks.py b/trunk/PLC/NodeNetworks.py new file mode 100644 index 0000000..47e091d --- /dev/null +++ b/trunk/PLC/NodeNetworks.py @@ -0,0 +1,226 @@ +# +# Functions for interacting with the nodenetworks table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from types import StringTypes +import socket +import struct + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.NetworkTypes import NetworkType, NetworkTypes +from PLC.NetworkMethods import NetworkMethod, NetworkMethods +import PLC.Nodes + +def valid_ip(ip): + try: + ip = socket.inet_ntoa(socket.inet_aton(ip)) + return True + except socket.error: + return False + +def in_same_network(address1, address2, netmask): + """ + Returns True if two IPv4 addresses are in the same network. Faults + if an address is invalid. + """ + + address1 = struct.unpack('>L', socket.inet_aton(address1))[0] + address2 = struct.unpack('>L', socket.inet_aton(address2))[0] + netmask = struct.unpack('>L', socket.inet_aton(netmask))[0] + + return (address1 & netmask) == (address2 & netmask) + +class NodeNetwork(Row): + """ + Representation of a row in the nodenetworks table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'nodenetworks' + primary_key = 'nodenetwork_id' + join_tables = ['nodenetwork_setting'] + fields = { + 'nodenetwork_id': Parameter(int, "Node interface identifier"), + 'method': Parameter(str, "Addressing method (e.g., 'static' or 'dhcp')"), + 'type': Parameter(str, "Address type (e.g., 'ipv4')"), + 'ip': Parameter(str, "IP address", nullok = True), + 'mac': Parameter(str, "MAC address", nullok = True), + 'gateway': Parameter(str, "IP address of primary gateway", nullok = True), + 'network': Parameter(str, "Subnet address", nullok = True), + 'broadcast': Parameter(str, "Network broadcast address", nullok = True), + 'netmask': Parameter(str, "Subnet mask", nullok = True), + 'dns1': Parameter(str, "IP address of primary DNS server", nullok = True), + 'dns2': Parameter(str, "IP address of secondary DNS server", nullok = True), + 'bwlimit': Parameter(int, "Bandwidth limit", min = 0, nullok = True), + 'hostname': Parameter(str, "(Optional) Hostname", nullok = True), + 'node_id': Parameter(int, "Node associated with this interface"), + 'is_primary': Parameter(bool, "Is the primary interface for this node"), + 'nodenetwork_setting_ids' : Parameter([int], "List of nodenetwork settings"), + } + + def validate_method(self, method): + network_methods = [row['method'] for row in NetworkMethods(self.api)] + if method not in network_methods: + raise PLCInvalidArgument, "Invalid addressing method %s"%method + return method + + def validate_type(self, type): + network_types = [row['type'] for row in NetworkTypes(self.api)] + if type not in network_types: + raise PLCInvalidArgument, "Invalid address type %s"%type + return type + + def validate_ip(self, ip): + if ip and not valid_ip(ip): + raise PLCInvalidArgument, "Invalid IP address %s"%ip + return ip + + def validate_mac(self, mac): + if not mac: + return mac + + try: + bytes = mac.split(":") + if len(bytes) < 6: + raise Exception + for i, byte in enumerate(bytes): + byte = int(byte, 16) + if byte < 0 or byte > 255: + raise Exception + bytes[i] = "%02x" % byte + mac = ":".join(bytes) + except: + raise PLCInvalidArgument, "Invalid MAC address %s"%mac + + return mac + + validate_gateway = validate_ip + validate_network = validate_ip + validate_broadcast = validate_ip + validate_netmask = validate_ip + validate_dns1 = validate_ip + validate_dns2 = validate_ip + + def validate_bwlimit(self, bwlimit): + if not bwlimit: + return bwlimit + + if bwlimit < 500000: + raise PLCInvalidArgument, 'Minimum bw is 500 kbs' + + return bwlimit + + def validate_hostname(self, hostname): + # Optional + if not hostname: + return hostname + + if not PLC.Nodes.valid_hostname(hostname): + raise PLCInvalidArgument, "Invalid hostname %s"%hostname + + return hostname + + def validate_node_id(self, node_id): + nodes = PLC.Nodes.Nodes(self.api, [node_id]) + if not nodes: + raise PLCInvalidArgument, "No such node %d"%node_id + + return node_id + + def validate_is_primary(self, is_primary): + """ + Set this interface to be the primary one. + """ + + if is_primary: + nodes = PLC.Nodes.Nodes(self.api, [self['node_id']]) + if not nodes: + raise PLCInvalidArgument, "No such node %d"%node_id + node = nodes[0] + + if node['nodenetwork_ids']: + conflicts = NodeNetworks(self.api, node['nodenetwork_ids']) + for nodenetwork in conflicts: + if ('nodenetwork_id' not in self or \ + self['nodenetwork_id'] != nodenetwork['nodenetwork_id']) and \ + nodenetwork['is_primary']: + raise PLCInvalidArgument, "Can only set one primary interface per node" + + return is_primary + + def validate(self): + """ + Flush changes back to the database. + """ + + # Basic validation + Row.validate(self) + + assert 'method' in self + method = self['method'] + + if method == "proxy" or method == "tap": + if 'mac' in self and self['mac']: + raise PLCInvalidArgument, "For %s method, mac should not be specified" % method + if 'ip' not in self or not self['ip']: + raise PLCInvalidArgument, "For %s method, ip is required" % method + if method == "tap" and ('gateway' not in self or not self['gateway']): + raise PLCInvalidArgument, "For tap method, gateway is required and should be " \ + "the IP address of the node that proxies for this address" + # Should check that the proxy address is reachable, but + # there's no way to tell if the only primary interface is + # DHCP! + + elif method == "static": + for key in ['ip', 'gateway', 'network', 'broadcast', 'netmask', 'dns1']: + if key not in self or not self[key]: + raise PLCInvalidArgument, "For static method, %s is required" % key + globals()[key] = self[key] + if not in_same_network(ip, network, netmask): + raise PLCInvalidArgument, "IP address %s is inconsistent with network %s/%s" % \ + (ip, network, netmask) + if not in_same_network(broadcast, network, netmask): + raise PLCInvalidArgument, "Broadcast address %s is inconsistent with network %s/%s" % \ + (broadcast, network, netmask) + if not in_same_network(ip, gateway, netmask): + raise PLCInvalidArgument, "Gateway %s is not reachable from %s/%s" % \ + (gateway, ip, netmask) + + elif method == "ipmi": + if 'ip' not in self or not self['ip']: + raise PLCInvalidArgument, "For ipmi method, ip is required" + +class NodeNetworks(Table): + """ + Representation of row(s) from the nodenetworks table in the + database. + """ + + def __init__(self, api, nodenetwork_filter = None, columns = None): + Table.__init__(self, api, NodeNetwork, columns) + + sql = "SELECT %s FROM view_nodenetworks WHERE True" % \ + ", ".join(self.columns) + + if nodenetwork_filter is not None: + if isinstance(nodenetwork_filter, (list, tuple, set)): + nodenetwork_filter = Filter(NodeNetwork.fields, {'nodenetwork_id': nodenetwork_filter}) + elif isinstance(nodenetwork_filter, dict): + nodenetwork_filter = Filter(NodeNetwork.fields, nodenetwork_filter) + elif isinstance(nodenetwork_filter, int): + nodenetwork_filter = Filter(NodeNetwork.fields, {'nodenetwork_id': [nodenetwork_filter]}) + else: + raise PLCInvalidArgument, "Wrong node network filter %r"%nodenetwork_filter + sql += " AND (%s) %s" % nodenetwork_filter.sql(api) + + self.selectall(sql) diff --git a/trunk/PLC/Nodes.py b/trunk/PLC/Nodes.py new file mode 100644 index 0000000..08612f6 --- /dev/null +++ b/trunk/PLC/Nodes.py @@ -0,0 +1,326 @@ +# +# Functions for interacting with the nodes table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from types import StringTypes +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.NodeNetworks import NodeNetwork, NodeNetworks +from PLC.BootStates import BootStates + +def valid_hostname(hostname): + # 1. Each part begins and ends with a letter or number. + # 2. Each part except the last can contain letters, numbers, or hyphens. + # 3. Each part is between 1 and 64 characters, including the trailing dot. + # 4. At least two parts. + # 5. Last part can only contain between 2 and 6 letters. + good_hostname = r'^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+' \ + r'[a-z]{2,6}$' + return hostname and \ + re.match(good_hostname, hostname, re.IGNORECASE) + +class Node(Row): + """ + Representation of a row in the nodes table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'nodes' + primary_key = 'node_id' + # Thierry -- we use delete on nodenetworks so the related NodeNetworkSettings get deleted too + join_tables = ['nodegroup_node', 'conf_file_node', 'pcu_node', 'slice_node', 'slice_attribute', 'node_session', 'peer_node','node_slice_whitelist'] + fields = { + 'node_id': Parameter(int, "Node identifier"), + 'hostname': Parameter(str, "Fully qualified hostname", max = 255), + 'site_id': Parameter(int, "Site at which this node is located"), + 'boot_state': Parameter(str, "Boot state", max = 20), + 'model': Parameter(str, "Make and model of the actual machine", max = 255, nullok = True), + 'boot_nonce': Parameter(str, "(Admin only) Random value generated by the node at last boot", max = 128), + 'version': Parameter(str, "Apparent Boot CD version", max = 64), + 'ssh_rsa_key': Parameter(str, "Last known SSH host key", max = 1024), + 'date_created': Parameter(int, "Date and time when node entry was created", ro = True), + 'last_updated': Parameter(int, "Date and time when node entry was created", ro = True), + 'last_contact': Parameter(int, "Date and time when node last contacted plc", ro = True), + 'key': Parameter(str, "(Admin only) Node key", max = 256), + 'session': Parameter(str, "(Admin only) Node session value", max = 256, ro = True), + 'nodenetwork_ids': Parameter([int], "List of network interfaces that this node has"), + 'nodegroup_ids': Parameter([int], "List of node groups that this node is in"), + 'conf_file_ids': Parameter([int], "List of configuration files specific to this node"), + # 'root_person_ids': Parameter([int], "(Admin only) List of people who have root access to this node"), + 'slice_ids': Parameter([int], "List of slices on this node"), + 'slice_ids_whitelist': Parameter([int], "List of slices allowed on this node"), + 'pcu_ids': Parameter([int], "List of PCUs that control this node"), + 'ports': Parameter([int], "List of PCU ports that this node is connected to"), + 'peer_id': Parameter(int, "Peer to which this node belongs", nullok = True), + 'peer_node_id': Parameter(int, "Foreign node identifier at peer", nullok = True), + } + related_fields = { + 'nodenetworks': [Mixed(Parameter(int, "NodeNetwork identifier"), + Filter(NodeNetwork.fields))], + 'nodegroups': [Mixed(Parameter(int, "NodeGroup identifier"), + Parameter(str, "NodeGroup name"))], + 'conf_files': [Parameter(int, "ConfFile identifier")], + 'slices': [Mixed(Parameter(int, "Slice identifier"), + Parameter(str, "Slice name"))], + 'slices_whitelist': [Mixed(Parameter(int, "Slice identifier"), + Parameter(str, "Slice name"))] + } + # for Cache + class_key = 'hostname' + foreign_fields = ['boot_state','model','version'] + # forget about these ones, they are read-only anyway + # handling them causes Cache to re-sync all over again + # 'date_created','last_updated' + foreign_xrefs = [ + # in this case, we dont need the 'table' but Cache will look it up, so... + {'field' : 'site_id' , 'class' : 'Site' , 'table' : 'unused-on-direct-refs' } , + ] + + def validate_hostname(self, hostname): + if not valid_hostname(hostname): + raise PLCInvalidArgument, "Invalid hostname" + + conflicts = Nodes(self.api, [hostname]) + for node in conflicts: + if 'node_id' not in self or self['node_id'] != node['node_id']: + raise PLCInvalidArgument, "Hostname already in use" + + return hostname + + def validate_boot_state(self, boot_state): + boot_states = [row['boot_state'] for row in BootStates(self.api)] + if boot_state not in boot_states: + raise PLCInvalidArgument, "Invalid boot state" + + return boot_state + + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp + validate_last_contact = Row.validate_timestamp + + def update_last_contact(self, commit = True): + """ + Update last_contact field with current time + """ + + assert 'node_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_contact = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where node_id = %d" % ( self['node_id']) ) + self.sync(commit) + + + def update_last_updated(self, commit = True): + """ + Update last_updated field with current time + """ + + assert 'node_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_updated = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where node_id = %d" % (self['node_id']) ) + self.sync(commit) + + def associate_nodenetworks(self, auth, field, value): + """ + Delete nodenetworks not found in value list (using DeleteNodeNetwor)k + Add nodenetworks found in value list (using AddNodeNetwork) + Updates nodenetworks found w/ nodenetwork_id in value list (using UpdateNodeNetwork) + """ + + assert 'nodenetworkp_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + (nodenetwork_ids, blank, nodenetworks) = self.separate_types(value) + + if self['nodenetwork_ids'] != nodenetwork_ids: + from PLC.Methods.DeleteNodeNetwork import DeleteNodeNetwork + + stale_nodenetworks = set(self['nodenetwork_ids']).difference(nodenetwork_ids) + + for stale_nodenetwork in stale_nodenetworks: + DeleteNodeNetwork.__call__(DeleteNodeNetwork(self.api), auth, stale_nodenetwork['nodenetwork_id']) + + def associate_nodegroups(self, auth, field, value): + """ + Add node to nodegroups found in value list (AddNodeToNodegroup) + Delete node from nodegroup not found in value list (DeleteNodeFromNodegroup) + """ + + from PLC.NodeGroups import NodeGroups + + assert 'nodegroup_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + (nodegroup_ids, nodegroup_names) = self.separate_types(value)[0:2] + + if nodegroup_names: + nodegroups = NodeGroups(self.api, nodegroup_names, ['nodegroup_id']).dict('nodegroup_id') + nodegroup_ids += nodegroups.keys() + + if self['nodegroup_ids'] != nodegroup_ids: + from PLC.Methods.AddNodeToNodeGroup import AddNodeToNodeGroup + from PLC.Methods.DeleteNodeFromNodeGroup import DeleteNodeFromNodeGroup + + new_nodegroups = set(nodegroup_ids).difference(self['nodegroup_ids']) + stale_nodegroups = set(self['nodegroup_ids']).difference(nodegroup_ids) + + for new_nodegroup in new_nodegroups: + AddNodeToNodeGroup.__call__(AddNodeToNodeGroup(self.api), auth, self['node_id'], new_nodegroup) + for stale_nodegroup in stale_nodegroups: + DeleteNodeFromNodeGroup.__call__(DeleteNodeFromNodeGroup(self.api), auth, self['node_id'], stale_nodegroup) + + + + def associate_conf_files(self, auth, field, value): + """ + Add conf_files found in value list (AddConfFileToNode) + Delets conf_files not found in value list (DeleteConfFileFromNode) + """ + + assert 'conf_file_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + conf_file_ids = self.separate_types(value)[0] + + if self['conf_file_ids'] != conf_file_ids: + from PLC.Methods.AddConfFileToNode import AddConfFileToNode + from PLC.Methods.DeleteConfFileFromNode import DeleteConfFileFromNode + new_conf_files = set(conf_file_ids).difference(self['conf_file_ids']) + stale_conf_files = set(self['conf_file_ids']).difference(conf_file_ids) + + for new_conf_file in new_conf_files: + AddConfFileToNode.__call__(AddConfFileToNode(self.api), auth, new_conf_file, self['node_id']) + for stale_conf_file in stale_conf_files: + DeleteConfFileFromNode.__call__(DeleteConfFileFromNode(self.api), auth, stale_conf_file, self['node_id']) + + + def associate_slices(self, auth, field, value): + """ + Add slices found in value list to (AddSliceToNode) + Delete slices not found in value list (DeleteSliceFromNode) + """ + + from PLC.Slices import Slices + + assert 'slice_ids' in self + assert 'node_id' in self + assert isinstance(value, list) + + (slice_ids, slice_names) = self.separate_types(value)[0:2] + + if slice_names: + slices = Slices(self.api, slice_names, ['slice_id']).dict('slice_id') + slice_ids += slices.keys() + + if self['slice_ids'] != slice_ids: + from PLC.Methods.AddSliceToNodes import AddSliceToNodes + from PLC.Methods.DeleteSliceFromNodes import DeleteSliceFromNodes + new_slices = set(slice_ids).difference(self['slice_ids']) + stale_slices = set(self['slice_ids']).difference(slice_ids) + + for new_slice in new_slices: + AddSliceToNodes.__call__(AddSliceToNodes(self.api), auth, new_slice, [self['node_id']]) + for stale_slice in stale_slices: + DeleteSliceFromNodes.__call__(DeleteSliceFromNodes(self.api), auth, stale_slice, [self['node_id']]) + + def associate_slices_whitelist(self, auth, field, value): + """ + Add slices found in value list to whitelist (AddSliceToNodesWhitelist) + Delete slices not found in value list from whitelist (DeleteSliceFromNodesWhitelist) + """ + + from PLC.Slices import Slices + + assert 'slice_ids_whitelist' in self + assert 'node_id' in self + assert isinstance(value, list) + + (slice_ids, slice_names) = self.separate_types(value)[0:2] + + if slice_names: + slices = Slices(self.api, slice_names, ['slice_id']).dict('slice_id') + slice_ids += slices.keys() + + if self['slice_ids_whitelist'] != slice_ids: + from PLC.Methods.AddSliceToNodesWhitelist import AddSliceToNodesWhitelist + from PLC.Methods.DeleteSliceFromNodesWhitelist import DeleteSliceFromNodesWhitelist + new_slices = set(slice_ids).difference(self['slice_ids_whitelist']) + stale_slices = set(self['slice_ids_whitelist']).difference(slice_ids) + + for new_slice in new_slices: + AddSliceToNodesWhitelist.__call__(AddSliceToNodesWhitelist(self.api), auth, new_slice, [self['node_id']]) + for stale_slice in stale_slices: + DeleteSliceFromNodesWhitelist.__call__(DeleteSliceFromNodesWhitelist(self.api), auth, stale_slice, [self['node_id']]) + + + def delete(self, commit = True): + """ + Delete existing node. + """ + + assert 'node_id' in self + assert 'nodenetwork_ids' in self + + # we need to clean up NodeNetworkSettings, so handling nodenetworks as part of join_tables does not work + for nodenetwork in NodeNetworks(self.api,self['nodenetwork_ids']): + nodenetwork.delete() + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE node_id = %d" % \ + (table, self['node_id'])) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + + +class Nodes(Table): + """ + Representation of row(s) from the nodes table in the + database. + """ + + def __init__(self, api, node_filter = None, columns = None): + Table.__init__(self, api, Node, columns) + + sql = "SELECT %s FROM view_nodes WHERE deleted IS False" % \ + ", ".join(self.columns) + + if node_filter is not None: + if isinstance(node_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), node_filter) + strs = filter(lambda x: isinstance(x, StringTypes), node_filter) + node_filter = Filter(Node.fields, {'node_id': ints, 'hostname': strs}) + sql += " AND (%s) %s" % node_filter.sql(api, "OR") + elif isinstance(node_filter, dict): + node_filter = Filter(Node.fields, node_filter) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + elif isinstance (node_filter, StringTypes): + node_filter = Filter(Node.fields, {'hostname':[node_filter]}) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + elif isinstance (node_filter, int): + node_filter = Filter(Node.fields, {'node_id':[node_filter]}) + sql += " AND (%s) %s" % node_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong node filter %r"%node_filter + + self.selectall(sql) diff --git a/trunk/PLC/PCUProtocolTypes.py b/trunk/PLC/PCUProtocolTypes.py new file mode 100644 index 0000000..30ef459 --- /dev/null +++ b/trunk/PLC/PCUProtocolTypes.py @@ -0,0 +1,75 @@ +# +# Functions for interacting with the pcu_type_port table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter + +class PCUProtocolType(Row): + """ + Representation of a row in the pcu_protocol_type table. To use, + instantiate with a dict of values. + """ + + table_name = 'pcu_protocol_type' + primary_key = 'pcu_protocol_type_id' + join_tables = [] + fields = { + 'pcu_protocol_type_id': Parameter(int, "PCU protocol type identifier"), + 'pcu_type_id': Parameter(int, "PCU type identifier"), + 'port': Parameter(int, "PCU port", max = 254), + 'protocol': Parameter(str, "Protocol", max = 254), + 'supported': Parameter(bool, "Is the port/protocol supported by PLC") + } + + def validate_port(self, port): + # make sure port is not blank + + if not port: + raise PLCInvalidArgument, "Port must be specified" + + return port + + def validate_protocol(self, protocol): + # make sure port is not blank + if not len(protocol): + raise PLCInvalidArgument, "protocol must be specified" + + return protocol + +class PCUProtocolTypes(Table): + """ + Representation of the pcu_protocol_types table in the database. + """ + + def __init__(self, api, protocol_type_filter = None, columns = None): + Table.__init__(self, api, PCUProtocolType, columns) + + sql = "SELECT %s FROM pcu_protocol_type WHERE True" % \ + ", ".join(self.columns) + + if protocol_type_filter is not None: + if isinstance(protocol_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), protocol_type_filter) + protocol_type_filter = Filter(PCUProtocolType.fields, {'pcu_protocol_type_id': ints}) + sql += " AND (%s) %s" % protocol_type_filter.sql(api, "OR") + elif isinstance(protocol_type_filter, dict): + protocol_type_filter = Filter(PCUProtocolType.fields, protocol_type_filter) + sql += " AND (%s) %s" % protocol_type_filter.sql(api, "AND") + elif isinstance (protocol_type_filter, int): + protocol_type_filter = Filter(PCUProtocolType.fields, {'pcu_protocol_type_id':[protocol_type_filter]}) + + sql += " AND (%s) %s" % protocol_type_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong pcu_protocol_type filter %r"%protocol_type_filter + + + self.selectall(sql) diff --git a/trunk/PLC/PCUTypes.py b/trunk/PLC/PCUTypes.py new file mode 100644 index 0000000..d1f650c --- /dev/null +++ b/trunk/PLC/PCUTypes.py @@ -0,0 +1,104 @@ +# +# Functions for interacting with the pcu_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: +# +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table +from PLC.Filter import Filter + +class PCUType(Row): + """ + Representation of a row in the pcu_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'pcu_types' + primary_key = 'pcu_type_id' + join_tables = ['pcu_port_type'] + fields = { + 'pcu_type_id': Parameter(int, "PCU Type Identifier"), + 'model': Parameter(str, "PCU model", max = 254), + 'name': Parameter(str, "PCU full name", max = 254), + 'pcu_protocol_type_ids': Parameter([int], "PCU Protocol Type Identifiers"), + 'pcu_protocol_types': Parameter([dict], "PCU Protocol Type List") + } + + def validate_model(self, model): + # Make sure name is not blank + if not len(model): + raise PLCInvalidArgument, "Model must be specified" + + # Make sure boot state does not alredy exist + conflicts = PCUTypes(self.api, [model]) + for pcu_type in conflicts: + if 'pcu_type_id' not in self or self['pcu_type_id'] != pcu_type['pcu_type_id']: + raise PLCInvalidArgument, "Model already in use" + + return model + +class PCUTypes(Table): + """ + Representation of the pcu_types table in the database. + """ + + def __init__(self, api, pcu_type_filter = None, columns = None): + + # Remove pcu_protocol_types from query since its not really a field + # in the db. We will add it later + if columns == None: + columns = PCUType.fields.keys() + if 'pcu_protocol_types' in columns: + removed_fields = ['pcu_protocol_types'] + columns.remove('pcu_protocol_types') + else: + removed_fields = [] + + Table.__init__(self, api, PCUType, columns) + + sql = "SELECT %s FROM view_pcu_types WHERE True" % \ + ", ".join(self.columns) + + if pcu_type_filter is not None: + if isinstance(pcu_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), pcu_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), pcu_type_filter) + pcu_type_filter = Filter(PCUType.fields, {'pcu_type_id': ints, 'model': strs}) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "OR") + elif isinstance(pcu_type_filter, dict): + pcu_type_filter = Filter(PCUType.fields, pcu_type_filter) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "AND") + elif isinstance (pcu_type_filter, StringTypes): + pcu_type_filter = Filter(PCUType.fields, {'model':[pcu_type_filter]}) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "AND") + elif isinstance (pcu_type_filter, int): + pcu_type_filter = Filter(PCUType.fields, {'pcu_type_id':[pcu_type_filter]}) + sql += " AND (%s) %s" % pcu_type_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong pcu_type filter %r"%pcu_type_filter + + + self.selectall(sql) + + # return a list of protocol type objects for each port type + if 'pcu_protocol_types' in removed_fields: + from PLC.PCUProtocolTypes import PCUProtocolTypes + protocol_type_ids = set() + for pcu_type in self: + protocol_type_ids.update(pcu_type['pcu_protocol_type_ids']) + + protocol_return_fields = ['pcu_protocol_type_id', 'port', 'protocol', 'supported'] + all_protocol_types = PCUProtocolTypes(self.api, list(protocol_type_ids), \ + protocol_return_fields).dict('pcu_protocol_type_id') + + for pcu_type in self: + pcu_type['pcu_protocol_types'] = [] + for protocol_type_id in pcu_type['pcu_protocol_type_ids']: + pcu_type['pcu_protocol_types'].append(all_protocol_types[protocol_type_id]) diff --git a/trunk/PLC/PCUs.py b/trunk/PLC/PCUs.py new file mode 100644 index 0000000..563acf9 --- /dev/null +++ b/trunk/PLC/PCUs.py @@ -0,0 +1,116 @@ +# +# Functions for interacting with the pcus table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.NodeNetworks import valid_ip, NodeNetwork, NodeNetworks +from PLC.Nodes import Node, Nodes + +class PCU(Row): + """ + Representation of a row in the pcus table. To use, + instantiate with a dict of values. + """ + + table_name = 'pcus' + primary_key = 'pcu_id' + join_tables = ['pcu_node'] + fields = { + 'pcu_id': Parameter(int, "PCU identifier"), + 'site_id': Parameter(int, "Identifier of site where PCU is located"), + 'hostname': Parameter(str, "PCU hostname", max = 254), + 'ip': Parameter(str, "PCU IP address", max = 254), + 'protocol': Parameter(str, "PCU protocol, e.g. ssh, https, telnet", max = 16, nullok = True), + 'username': Parameter(str, "PCU username", max = 254, nullok = True), + 'password': Parameter(str, "PCU username", max = 254, nullok = True), + 'notes': Parameter(str, "Miscellaneous notes", max = 254, nullok = True), + 'model': Parameter(str, "PCU model string", max = 32, nullok = True), + 'node_ids': Parameter([int], "List of nodes that this PCU controls"), + 'ports': Parameter([int], "List of the port numbers that each node is connected to"), + } + + def validate_ip(self, ip): + if not valid_ip(ip): + raise PLCInvalidArgument, "Invalid IP address " + ip + return ip + + def add_node(self, node, port, commit = True): + """ + Add node to existing PCU. + """ + + assert 'pcu_id' in self + assert isinstance(node, Node) + assert isinstance(port, (int, long)) + assert 'node_id' in node + + pcu_id = self['pcu_id'] + node_id = node['node_id'] + + if node_id not in self['node_ids'] and port not in self['ports']: + self.api.db.do("INSERT INTO pcu_node (pcu_id, node_id, port)" \ + " VALUES(%(pcu_id)d, %(node_id)d, %(port)d)", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].append(node_id) + self['ports'].append(port) + + def remove_node(self, node, commit = True): + """ + Remove node from existing PCU. + """ + + assert 'pcu_id' in self + assert isinstance(node, Node) + assert 'node_id' in node + + pcu_id = self['pcu_id'] + node_id = node['node_id'] + + if node_id in self['node_ids']: + i = self['node_ids'].index(node_id) + port = self['ports'][i] + + self.api.db.do("DELETE FROM pcu_node" \ + " WHERE pcu_id = %(pcu_id)d" \ + " AND node_id = %(node_id)d", + locals()) + + if commit: + self.api.db.commit() + + self['node_ids'].remove(node_id) + self['ports'].remove(port) + +class PCUs(Table): + """ + Representation of row(s) from the pcus table in the + database. + """ + + def __init__(self, api, pcu_filter = None, columns = None): + Table.__init__(self, api, PCU, columns) + + sql = "SELECT %s FROM view_pcus WHERE True" % \ + ", ".join(self.columns) + + if pcu_filter is not None: + if isinstance(pcu_filter, (list, tuple, set)): + pcu_filter = Filter(PCU.fields, {'pcu_id': pcu_filter}) + elif isinstance(pcu_filter, dict): + pcu_filter = Filter(PCU.fields, pcu_filter) + sql += " AND (%s) %s" % pcu_filter.sql(api) + + self.selectall(sql) diff --git a/trunk/PLC/POD.py b/trunk/PLC/POD.py new file mode 100644 index 0000000..01a7ddd --- /dev/null +++ b/trunk/PLC/POD.py @@ -0,0 +1,90 @@ +# Marc E. Fiuczynski +# Copyright (C) 2004 The Trustees of Princeton University +# +# Client ping of death program for both udp & icmp +# +# modified for inclusion by api by Aaron K + +import struct +import os +import array +import getopt +from socket import * + +UPOD_PORT = 664 + +def _in_cksum(packet): + """THE RFC792 states: 'The 16 bit one's complement of + the one's complement sum of all 16 bit words in the header.' + Generates a checksum of a (ICMP) packet. Based on in_chksum found + in ping.c on FreeBSD. + """ + + # add byte if not dividable by 2 + if len(packet) & 1: + packet = packet + '\0' + + # split into 16-bit word and insert into a binary array + words = array.array('h', packet) + sum = 0 + + # perform ones complement arithmetic on 16-bit words + for word in words: + sum += (word & 0xffff) + + hi = sum >> 16 + lo = sum & 0xffff + sum = hi + lo + sum = sum + (sum >> 16) + + return (~sum) & 0xffff # return ones complement + +def _construct(id, data): + """Constructs a ICMP IPOD packet + """ + ICMP_TYPE = 6 # ping of death code used by PLK + ICMP_CODE = 0 + ICMP_CHECKSUM = 0 + ICMP_ID = 0 + ICMP_SEQ_NR = 0 + + header = struct.pack('bbHHh', ICMP_TYPE, ICMP_CODE, ICMP_CHECKSUM, \ + ICMP_ID, ICMP_SEQ_NR+id) + + packet = header + data # ping packet without checksum + checksum = _in_cksum(packet) # make checksum + + # construct header with correct checksum + header = struct.pack('bbHHh', ICMP_TYPE, ICMP_CODE, checksum, ICMP_ID, \ + ICMP_SEQ_NR+id) + + # ping packet *with* checksum + packet = header + data + + # a perfectly formatted ICMP echo packet + return packet + +def icmp_pod(host,key): + uid = os.getuid() + if uid <> 0: + print "must be root to send icmp pod" + return + + s = socket(AF_INET, SOCK_RAW, getprotobyname("icmp")) + packet = _construct(0, key) # make a ping packet + addr = (host,1) + print 'pod sending icmp-based reboot request to %s' % host + for i in range(1,10): + s.sendto(packet, addr) + +def udp_pod(host,key,fromaddr=('', 0)): + addr = host, UPOD_PORT + s = socket(AF_INET, SOCK_DGRAM) + s.bind(fromaddr) + packet = key + print 'pod sending udp-based reboot request to %s' % host + for i in range(1,10): + s.sendto(packet, addr) + +def noop_pod(host,key): + pass diff --git a/trunk/PLC/Parameter.py b/trunk/PLC/Parameter.py new file mode 100644 index 0000000..fc25b93 --- /dev/null +++ b/trunk/PLC/Parameter.py @@ -0,0 +1,105 @@ +# +# Shared type definitions +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from types import * +from PLC.Faults import * + +class Parameter: + """ + Typed value wrapper. Use in accepts and returns to document method + parameters. Set the optional and default attributes for + sub-parameters (i.e., dict fields). + """ + + def __init__(self, type, doc = "", + min = None, max = None, + optional = None, + ro = False, + nullok = False): + # Basic type of the parameter. Must be a builtin type + # that can be marshalled by XML-RPC. + self.type = type + + # Documentation string for the parameter + self.doc = doc + + # Basic value checking. For numeric types, the minimum and + # maximum possible values, inclusive. For string types, the + # minimum and maximum possible UTF-8 encoded byte lengths. + self.min = min + self.max = max + + # Whether the sub-parameter is optional or not. If None, + # unknown whether it is optional. + self.optional = optional + + # Whether the DB field is read-only. + self.ro = ro + + # Whether the DB field can be NULL. + self.nullok = nullok + + def type(self): + return self.type + + def __repr__(self): + return repr(self.type) + +class Mixed(tuple): + """ + A list (technically, a tuple) of types. Use in accepts and returns + to document method parameters that may return mixed types. + """ + + def __new__(cls, *types): + return tuple.__new__(cls, types) + + +def python_type(arg): + """ + Returns the Python type of the specified argument, which may be a + Python type, a typed value, or a Parameter. + """ + + if isinstance(arg, Parameter): + arg = arg.type + + if isinstance(arg, type): + return arg + else: + return type(arg) + +def xmlrpc_type(arg): + """ + Returns the XML-RPC type of the specified argument, which may be a + Python type, a typed value, or a Parameter. + """ + + arg_type = python_type(arg) + + if arg_type == NoneType: + return "nil" + elif arg_type == IntType or arg_type == LongType: + return "int" + elif arg_type == bool: + return "boolean" + elif arg_type == FloatType: + return "double" + elif arg_type in StringTypes: + return "string" + elif arg_type == ListType or arg_type == TupleType: + return "array" + elif arg_type == DictType: + return "struct" + elif arg_type == Mixed: + # Not really an XML-RPC type but return "mixed" for + # documentation purposes. + return "mixed" + else: + raise PLCAPIError, "XML-RPC cannot marshal %s objects" % arg_type diff --git a/trunk/PLC/Peers.py b/trunk/PLC/Peers.py new file mode 100644 index 0000000..0973c3d --- /dev/null +++ b/trunk/PLC/Peers.py @@ -0,0 +1,235 @@ +# +# Thierry Parmentelat - INRIA +# + +import re +from types import StringTypes +from urlparse import urlparse + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Table import Row, Table +import PLC.Auth + +from PLC.Sites import Site, Sites +from PLC.Persons import Person, Persons +from PLC.Keys import Key, Keys +from PLC.Nodes import Node, Nodes +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices + +class Peer(Row): + """ + Stores the list of peering PLCs in the peers table. + See the Row class for more details + """ + + table_name = 'peers' + primary_key = 'peer_id' + join_tables = ['peer_site', 'peer_person', 'peer_key', 'peer_node', + 'peer_slice_attribute_type', 'peer_slice_attribute', 'peer_slice'] + fields = { + 'peer_id': Parameter (int, "Peer identifier"), + 'peername': Parameter (str, "Peer name"), + 'peer_url': Parameter (str, "Peer API URL"), + 'key': Parameter(str, "Peer GPG public key"), + 'cacert': Parameter(str, "Peer SSL public certificate"), + ### cross refs + 'site_ids': Parameter([int], "List of sites for which this peer is authoritative"), + 'person_ids': Parameter([int], "List of users for which this peer is authoritative"), + 'key_ids': Parameter([int], "List of keys for which this peer is authoritative"), + 'node_ids': Parameter([int], "List of nodes for which this peer is authoritative"), + 'slice_ids': Parameter([int], "List of slices for which this peer is authoritative"), + } + + def validate_peername(self, peername): + if not len(peername): + raise PLCInvalidArgument, "Peer name must be specified" + + conflicts = Peers(self.api, [peername]) + for peer in conflicts: + if 'peer_id' not in self or self['peer_id'] != peer['peer_id']: + raise PLCInvalidArgument, "Peer name already in use" + + return peername + + def validate_peer_url(self, url): + """ + Validate URL. Must be HTTPS. + """ + + (scheme, netloc, path, params, query, fragment) = urlparse(url) + if scheme != "https": + raise PLCInvalidArgument, "Peer URL scheme must be https" + + return url + + def delete(self, commit = True): + """ + Deletes this peer and all related entities. + """ + + assert 'peer_id' in self + + # Remove all related entities + for obj in \ + Slices(self.api, self['slice_ids']) + \ + Keys(self.api, self['key_ids']) + \ + Persons(self.api, self['person_ids']) + \ + Nodes(self.api, self['node_ids']) + \ + Sites(self.api, self['site_ids']): + assert obj['peer_id'] == self['peer_id'] + obj.delete(commit = False) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + + def add_site(self, site, peer_site_id, commit = True): + """ + Associate a local site entry with this peer. + """ + + add = Row.add_object(Site, 'peer_site') + add(self, site, + {'peer_id': self['peer_id'], + 'site_id': site['site_id'], + 'peer_site_id': peer_site_id}, + commit = commit) + + def add_person(self, person, peer_person_id, commit = True): + """ + Associate a local user entry with this peer. + """ + + add = Row.add_object(Person, 'peer_person') + add(self, person, + {'peer_id': self['peer_id'], + 'person_id': person['person_id'], + 'peer_person_id': peer_person_id}, + commit = commit) + + def add_key(self, key, peer_key_id, commit = True): + """ + Associate a local key entry with this peer. + """ + + add = Row.add_object(Key, 'peer_key') + add(self, key, + {'peer_id': self['peer_id'], + 'key_id': key['key_id'], + 'peer_key_id': peer_key_id}, + commit = commit) + + def add_node(self, node, peer_node_id, commit = True): + """ + Associate a local node entry with this peer. + """ + + add = Row.add_object(Node, 'peer_node') + add(self, node, + {'peer_id': self['peer_id'], + 'node_id': node['node_id'], + 'peer_node_id': peer_node_id}, + commit = commit) + + def add_slice(self, slice, peer_slice_id, commit = True): + """ + Associate a local slice entry with this peer. + """ + + add = Row.add_object(Slice, 'peer_slice') + add(self, slice, + {'peer_id': self['peer_id'], + 'slice_id': slice['slice_id'], + 'peer_slice_id': peer_slice_id}, + commit = commit) + + def connect(self, **kwds): + """ + Connect to this peer via XML-RPC. + """ + + import xmlrpclib + from PLC.PyCurl import PyCurlTransport + self.server = xmlrpclib.ServerProxy(self['peer_url'], + PyCurlTransport(self['peer_url'], self['cacert']), + allow_none = 1, **kwds) + + def add_auth(self, function, methodname, **kwds): + """ + Sign the specified XML-RPC call and add an auth struct as the + first argument of the call. + """ + + def wrapper(*args, **kwds): + from PLC.GPG import gpg_sign + signature = gpg_sign(args, + self.api.config.PLC_ROOT_GPG_KEY, + self.api.config.PLC_ROOT_GPG_KEY_PUB, + methodname) + + auth = {'AuthMethod': "gpg", + 'name': self.api.config.PLC_NAME, + 'signature': signature} + + # Automagically add auth struct to every call + args = (auth,) + args + + return function(*args) + + return wrapper + + def __getattr__(self, attr): + """ + Returns a callable API function if attr is the name of a + PLCAPI function; otherwise, returns the specified attribute. + """ + + try: + # Figure out if the specified attribute is the name of a + # PLCAPI function. If so and the function requires an + # authentication structure as its first argument, return a + # callable that automagically adds an auth struct to the + # call. + methodname = attr + api_function = self.api.callable(methodname) + if api_function.accepts and \ + (isinstance(api_function.accepts[0], PLC.Auth.Auth) or \ + (isinstance(api_function.accepts[0], Mixed) and \ + filter(lambda param: isinstance(param, Auth), api_function.accepts[0]))): + function = getattr(self.server, methodname) + return self.add_auth(function, methodname) + except Exception, err: + pass + + if hasattr(self, attr): + return getattr(self, attr) + else: + raise AttributeError, "type object 'Peer' has no attribute '%s'" % attr + +class Peers (Table): + """ + Maps to the peers table in the database + """ + + def __init__ (self, api, peer_filter = None, columns = None): + Table.__init__(self, api, Peer, columns) + + sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \ + ", ".join(self.columns) + + if peer_filter is not None: + if isinstance(peer_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), peer_filter) + strs = filter(lambda x: isinstance(x, StringTypes), peer_filter) + peer_filter = Filter(Peer.fields, {'peer_id': ints, 'peername': strs}) + sql += " AND (%s) %s" % peer_filter.sql(api, "OR") + elif isinstance(peer_filter, dict): + peer_filter = Filter(Peer.fields, peer_filter) + sql += " AND (%s) %s" % peer_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/trunk/PLC/Persons.py b/trunk/PLC/Persons.py new file mode 100644 index 0000000..8eb882c --- /dev/null +++ b/trunk/PLC/Persons.py @@ -0,0 +1,501 @@ +# +# Functions for interacting with the persons table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from types import StringTypes +from datetime import datetime +import md5 +import time +from random import Random +import re +import crypt + +from PLC.Faults import * +from PLC.Debug import log +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Roles import Role, Roles +from PLC.Keys import Key, Keys +from PLC.Messages import Message, Messages + +class Person(Row): + """ + Representation of a row in the persons table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'persons' + primary_key = 'person_id' + join_tables = ['person_key', 'person_role', 'person_site', 'slice_person', 'person_session', 'peer_person'] + fields = { + 'person_id': Parameter(int, "User identifier"), + 'first_name': Parameter(str, "Given name", max = 128), + 'last_name': Parameter(str, "Surname", max = 128), + 'title': Parameter(str, "Title", max = 128, nullok = True), + 'email': Parameter(str, "Primary e-mail address", max = 254), + 'phone': Parameter(str, "Telephone number", max = 64, nullok = True), + 'url': Parameter(str, "Home page", max = 254, nullok = True), + 'bio': Parameter(str, "Biography", max = 254, nullok = True), + 'enabled': Parameter(bool, "Has been enabled"), + 'password': Parameter(str, "Account password in crypt() form", max = 254), + 'verification_key': Parameter(str, "Reset password key", max = 254, nullok = True), + 'verification_expires': Parameter(int, "Date and time when verification_key expires", nullok = True), + 'last_updated': Parameter(int, "Date and time of last update", ro = True), + 'date_created': Parameter(int, "Date and time when account was created", ro = True), + 'role_ids': Parameter([int], "List of role identifiers"), + 'roles': Parameter([str], "List of roles"), + 'site_ids': Parameter([int], "List of site identifiers"), + 'key_ids': Parameter([int], "List of key identifiers"), + 'slice_ids': Parameter([int], "List of slice identifiers"), + 'peer_id': Parameter(int, "Peer to which this user belongs", nullok = True), + 'peer_person_id': Parameter(int, "Foreign user identifier at peer", nullok = True), + } + related_fields = { + 'roles': [Mixed(Parameter(int, "Role identifier"), + Parameter(str, "Role name"))], + 'sites': [Mixed(Parameter(int, "Site identifier"), + Parameter(str, "Site name"))], + 'keys': [Mixed(Parameter(int, "Key identifier"), + Filter(Key.fields))], + 'slices': [Mixed(Parameter(int, "Slice identifier"), + Parameter(str, "Slice name"))] + } + + + + # for Cache + class_key = 'email' + foreign_fields = ['first_name', 'last_name', 'title', 'email', 'phone', 'url', + 'bio', 'enabled', 'password', ] + # forget about these ones, they are read-only anyway + # handling them causes Cache to re-sync all over again + # 'last_updated', 'date_created' + foreign_xrefs = [ + {'field' : 'key_ids', 'class': 'Key', 'table' : 'person_key' } , + {'field' : 'site_ids', 'class': 'Site', 'table' : 'person_site'}, +# xxx this is not handled by Cache yet +# 'role_ids': Parameter([int], "List of role identifiers"), +] + + def validate_email(self, email): + """ + Validate email address. Stolen from Mailman. + """ + + invalid_email = PLCInvalidArgument("Invalid e-mail address") + email_badchars = r'[][()<>|;^,\200-\377]' + + # Pretty minimal, cheesy check. We could do better... + if not email or email.count(' ') > 0: + raise invalid_email + if re.search(email_badchars, email) or email[0] == '-': + raise invalid_email + + email = email.lower() + at_sign = email.find('@') + if at_sign < 1: + raise invalid_email + user = email[:at_sign] + rest = email[at_sign+1:] + domain = rest.split('.') + + # This means local, unqualified addresses, are not allowed + if not domain: + raise invalid_email + if len(domain) < 2: + raise invalid_email + + # check only against users on the same peer + if 'peer_id' in self: + namespace_peer_id = self['peer_id'] + else: + namespace_peer_id = None + + conflicts = Persons(self.api, {'email':email,'peer_id':namespace_peer_id}) + + for person in conflicts: + if 'person_id' not in self or self['person_id'] != person['person_id']: + raise PLCInvalidArgument, "E-mail address already in use" + + return email + + def validate_password(self, password): + """ + Encrypt password if necessary before committing to the + database. + """ + + magic = "$1$" + + if len(password) > len(magic) and \ + password[0:len(magic)] == magic: + return password + else: + # Generate a somewhat unique 8 character salt string + salt = str(time.time()) + str(Random().random()) + salt = md5.md5(salt).hexdigest()[:8] + return crypt.crypt(password.encode(self.api.encoding), magic + salt + "$") + + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp + validate_verification_expires = Row.validate_timestamp + + def can_update(self, person): + """ + Returns true if we can update the specified person. We can + update a person if: + + 1. We are the person. + 2. We are an admin. + 3. We are a PI and the person is a user or tech or at + one of our sites. + """ + + assert isinstance(person, Person) + + if self['person_id'] == person['person_id']: + return True + + if 'admin' in self['roles']: + return True + + if 'pi' in self['roles']: + if set(self['site_ids']).intersection(person['site_ids']): + # Can update people with higher role IDs + return min(self['role_ids']) < min(person['role_ids']) + + return False + + def can_view(self, person): + """ + Returns true if we can view the specified person. We can + view a person if: + + 1. We are the person. + 2. We are an admin. + 3. We are a PI and the person is at one of our sites. + """ + + assert isinstance(person, Person) + + if self.can_update(person): + return True + + if 'pi' in self['roles']: + if set(self['site_ids']).intersection(person['site_ids']): + # Can view people with equal or higher role IDs + return min(self['role_ids']) <= min(person['role_ids']) + + return False + + add_role = Row.add_object(Role, 'person_role') + remove_role = Row.remove_object(Role, 'person_role') + + add_key = Row.add_object(Key, 'person_key') + remove_key = Row.remove_object(Key, 'person_key') + + def set_primary_site(self, site, commit = True): + """ + Set the primary site for an existing user. + """ + + assert 'person_id' in self + assert 'site_id' in site + + person_id = self['person_id'] + site_id = site['site_id'] + self.api.db.do("UPDATE person_site SET is_primary = False" \ + " WHERE person_id = %(person_id)d", + locals()) + self.api.db.do("UPDATE person_site SET is_primary = True" \ + " WHERE person_id = %(person_id)d" \ + " AND site_id = %(site_id)d", + locals()) + + if commit: + self.api.db.commit() + + assert 'site_ids' in self + assert site_id in self['site_ids'] + + # Make sure that the primary site is first in the list + self['site_ids'].remove(site_id) + self['site_ids'].insert(0, site_id) + + def update_last_updated(self, commit = True): + """ + Update last_updated field with current time + """ + + assert 'person_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_updated = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where person_id = %d" % (self['person_id']) ) + self.sync(commit) + + def associate_roles(self, auth, field, value): + """ + Adds roles found in value list to this person (using AddRoleToPerson). + Deletes roles not found in value list from this person (using DeleteRoleFromPerson). + """ + + assert 'role_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (role_ids, roles_names) = self.separate_types(value)[0:2] + + # Translate roles into role_ids + if roles_names: + roles = Roles(self.api, role_names, ['role_id']).dict('role_id') + role_ids += roles.keys() + + # Add new ids, remove stale ids + if self['role_ids'] != role_ids: + from PLC.Methods.AddRoleToPerson import AddRoleToPerson + from PLC.Methods.DeleteRoleFromPerson import DeleteRoleFromPerson + new_roles = set(role_ids).difference(self['role_ids']) + stale_roles = set(self['role_ids']).difference(role_ids) + + for new_role in new_roles: + AddRoleToPerson.__call__(AddRoleToPerson(self.api), auth, new_role, self['person_id']) + for stale_role in stale_roles: + DeleteRoleFromPerson.__call__(DeleteRoleFromPerson(self.api), auth, stale_role, self['person_id']) + + + def associate_sites(self, auth, field, value): + """ + Adds person to sites found in value list (using AddPersonToSite). + Deletes person from site not found in value list (using DeletePersonFromSite). + """ + + from PLC.Sites import Sites + + assert 'site_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (site_ids, site_names) = self.separate_types(value)[0:2] + + # Translate roles into role_ids + if site_names: + sites = Sites(self.api, site_names, ['site_id']).dict('site_id') + site_ids += sites.keys() + + # Add new ids, remove stale ids + if self['site_ids'] != site_ids: + from PLC.Methods.AddPersonToSite import AddPersonToSite + from PLC.Methods.DeletePersonFromSite import DeletePersonFromSite + new_sites = set(site_ids).difference(self['site_ids']) + stale_sites = set(self['site_ids']).difference(site_ids) + + for new_site in new_sites: + AddPersonToSite.__call__(AddPersonToSite(self.api), auth, self['person_id'], new_site) + for stale_site in stale_sites: + DeletePersonFromSite.__call__(DeletePersonFromSite(self.api), auth, self['person_id'], stale_site) + + + def associate_keys(self, auth, field, value): + """ + Deletes key_ids not found in value list (using DeleteKey). + Adds key if key_fields w/o key_id is found (using AddPersonKey). + Updates key if key_fields w/ key_id is found (using UpdateKey). + """ + assert 'key_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (key_ids, blank, keys) = self.separate_types(value) + + if self['key_ids'] != key_ids: + from PLC.Methods.DeleteKey import DeleteKey + stale_keys = set(self['key_ids']).difference(key_ids) + + for stale_key in stale_keys: + DeleteKey.__call__(DeleteKey(self.api), auth, stale_key) + + if keys: + from PLC.Methods.AddPersonKey import AddPersonKey + from PLC.Methods.UpdateKey import UpdateKey + updated_keys = filter(lambda key: 'key_id' in key, keys) + added_keys = filter(lambda key: 'key_id' not in key, keys) + + for key in added_keys: + AddPersonKey.__call__(AddPersonKey(self.api), auth, self['person_id'], key) + for key in updated_keys: + key_id = key.pop('key_id') + UpdateKey.__call__(UpdateKey(self.api), auth, key_id, key) + + + def associate_slices(self, auth, field, value): + """ + Adds person to slices found in value list (using AddPersonToSlice). + Deletes person from slices found in value list (using DeletePersonFromSlice). + """ + + from PLC.Slices import Slices + + assert 'slice_ids' in self + assert 'person_id' in self + assert isinstance(value, list) + + (slice_ids, slice_names) = self.separate_types(value)[0:2] + + # Translate roles into role_ids + if slice_names: + slices = Slices(self.api, slice_names, ['slice_id']).dict('slice_id') + slice_ids += slices.keys() + + # Add new ids, remove stale ids + if self['slice_ids'] != slice_ids: + from PLC.Methods.AddPersonToSlice import AddPersonToSlice + from PLC.Methods.DeletePersonFromSlice import DeletePersonFromSlice + new_slices = set(slice_ids).difference(self['slice_ids']) + stale_slices = set(self['slice_ids']).difference(slice_ids) + + for new_slice in new_slices: + AddPersonToSlice.__call__(AddPersonToSlice(self.api), auth, self['person_id'], new_slice) + for stale_slice in stale_slices: + DeletePersonFromSlice.__call__(DeletePersonFromSlice(self.api), auth, self['person_id'], stale_slice) + + + def delete(self, commit = True): + """ + Delete existing user. + """ + + # Delete all keys + keys = Keys(self.api, self['key_ids']) + for key in keys: + key.delete(commit = False) + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE person_id = %d" % \ + (table, self['person_id'])) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + +class Persons(Table): + """ + Representation of row(s) from the persons table in the + database. + """ + + def __init__(self, api, person_filter = None, columns = None): + Table.__init__(self, api, Person, columns) + #sql = "SELECT %s FROM view_persons WHERE deleted IS False" % \ + # ", ".join(self.columns) + foreign_fields = {'role_ids': ('role_id', 'person_role'), + 'roles': ('name', 'roles'), + 'site_ids': ('site_id', 'person_site'), + 'key_ids': ('key_id', 'person_key'), + 'slice_ids': ('slice_id', 'slice_person') + } + foreign_keys = {} + db_fields = filter(lambda field: field not in foreign_fields.keys(), Person.fields.keys()) + all_fields = db_fields + [value[0] for value in foreign_fields.values()] + fields = [] + _select = "SELECT " + _from = " FROM persons " + _join = " LEFT JOIN peer_person USING (person_id) " + _where = " WHERE deleted IS False " + + if not columns: + # include all columns + fields = all_fields + tables = [value[1] for value in foreign_fields.values()] + tables.sort() + for key in foreign_fields.keys(): + foreign_keys[foreign_fields[key][0]] = key + for table in tables: + if table in ['roles']: + _join += " LEFT JOIN roles USING(role_id) " + else: + _join += " LEFT JOIN %s USING (person_id) " % (table) + else: + tables = set() + columns = filter(lambda column: column in db_fields+foreign_fields.keys(), columns) + columns.sort() + for column in columns: + if column in foreign_fields.keys(): + (field, table) = foreign_fields[column] + foreign_keys[field] = column + fields += [field] + tables.add(table) + if column in ['roles']: + _join += " LEFT JOIN roles USING(role_id) " + else: + _join += " LEFT JOIN %s USING (person_id)" % \ + (foreign_fields[column][1]) + + else: + fields += [column] + + # postgres will return timestamps as datetime objects. + # XMLPRC cannot marshal datetime so convert to int + timestamps = ['date_created', 'last_updated', 'verification_expires'] + for field in fields: + if field in timestamps: + fields[fields.index(field)] = \ + "CAST(date_part('epoch', %s) AS bigint) AS %s" % (field, field) + + _select += ", ".join(fields) + sql = _select + _from + _join + _where + + # deal with filter + if person_filter is not None: + if isinstance(person_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), person_filter) + strs = filter(lambda x: isinstance(x, StringTypes), person_filter) + person_filter = Filter(Person.fields, {'person_id': ints, 'email': strs}) + sql += " AND (%s) %s" % person_filter.sql(api, "OR") + elif isinstance(person_filter, dict): + person_filter = Filter(Person.fields, person_filter) + sql += " AND (%s) %s" % person_filter.sql(api, "AND") + elif isinstance (person_filter, StringTypes): + person_filter = Filter(Person.fields, {'email':[person_filter]}) + sql += " AND (%s) %s" % person_filter.sql(api, "AND") + elif isinstance (person_filter, int): + person_filter = Filter(Person.fields, {'person_id':[person_filter]}) + sql += " AND (%s) %s" % person_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong person filter %r"%person_filter + + # aggregate data + all_persons = {} + for row in self.api.db.selectall(sql): + person_id = row['person_id'] + + if all_persons.has_key(person_id): + for (key, key_list) in foreign_keys.items(): + data = row.pop(key) + row[key_list] = [data] + if data and data not in all_persons[person_id][key_list]: + all_persons[person_id][key_list].append(data) + else: + for key in foreign_keys.keys(): + value = row.pop(key) + if value: + row[foreign_keys[key]] = [value] + else: + row[foreign_keys[key]] = [] + if row: + all_persons[person_id] = row + + # populate self + for row in all_persons.values(): + obj = self.classobj(self.api, row) + self.append(obj) + diff --git a/trunk/PLC/PostgreSQL.py b/trunk/PLC/PostgreSQL.py new file mode 100644 index 0000000..597077a --- /dev/null +++ b/trunk/PLC/PostgreSQL.py @@ -0,0 +1,240 @@ +# +# PostgreSQL database interface. Sort of like DBI(3) (Database +# independent interface for Perl). +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import psycopg2 +import psycopg2.extensions +psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) +# UNICODEARRAY not exported yet +psycopg2.extensions.register_type(psycopg2._psycopg.UNICODEARRAY) + +import pgdb +from types import StringTypes, NoneType +import traceback +import commands +import re +from pprint import pformat + +from PLC.Debug import profile, log +from PLC.Faults import * + +if not psycopg2: + is8bit = re.compile("[\x80-\xff]").search + + def unicast(typecast): + """ + pgdb returns raw UTF-8 strings. This function casts strings that + appear to contain non-ASCII characters to unicode objects. + """ + + def wrapper(*args, **kwds): + value = typecast(*args, **kwds) + + # pgdb always encodes unicode objects as UTF-8 regardless of + # the DB encoding (and gives you no option for overriding + # the encoding), so always decode 8-bit objects as UTF-8. + if isinstance(value, str) and is8bit(value): + value = unicode(value, "utf-8") + + return value + + return wrapper + + pgdb.pgdbTypeCache.typecast = unicast(pgdb.pgdbTypeCache.typecast) + +class PostgreSQL: + def __init__(self, api): + self.api = api + self.debug = False + self.connection = None + + def cursor(self): + if self.connection is None: + # (Re)initialize database connection + if psycopg2: + try: + # Try UNIX socket first + self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + database = self.api.config.PLC_DB_NAME) + except psycopg2.OperationalError: + # Fall back on TCP + self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + database = self.api.config.PLC_DB_NAME, + host = self.api.config.PLC_DB_HOST, + port = self.api.config.PLC_DB_PORT) + self.connection.set_client_encoding("UNICODE") + else: + self.connection = pgdb.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + host = "%s:%d" % (api.config.PLC_DB_HOST, api.config.PLC_DB_PORT), + database = self.api.config.PLC_DB_NAME) + + (self.rowcount, self.description, self.lastrowid) = \ + (None, None, None) + + return self.connection.cursor() + + def close(self): + if self.connection is not None: + self.connection.close() + self.connection = None + + def quote(self, value): + """ + Returns quoted version of the specified value. + """ + + # The pgdb._quote function is good enough for general SQL + # quoting, except for array types. + if isinstance(value, (list, tuple, set)): + return "ARRAY[%s]" % ", ".join(map, self.quote, value) + else: + return pgdb._quote(value) + + quote = classmethod(quote) + + def param(self, name, value): + # None is converted to the unquoted string NULL + if isinstance(value, NoneType): + conversion = "s" + # True and False are also converted to unquoted strings + elif isinstance(value, bool): + conversion = "s" + elif isinstance(value, float): + conversion = "f" + elif not isinstance(value, StringTypes): + conversion = "d" + else: + conversion = "s" + + return '%(' + name + ')' + conversion + + param = classmethod(param) + + def begin_work(self): + # Implicit in pgdb.connect() + pass + + def commit(self): + self.connection.commit() + + def rollback(self): + self.connection.rollback() + + def do(self, query, params = None): + cursor = self.execute(query, params) + cursor.close() + return self.rowcount + + def last_insert_id(self, table_name, primary_key): + if isinstance(self.lastrowid, int): + sql = "SELECT %s FROM %s WHERE oid = %d" % \ + (primary_key, table_name, self.lastrowid) + rows = self.selectall(sql, hashref = False) + if rows: + return rows[0][0] + + return None + + def execute(self, query, params = None): + return self.execute_array(query, (params,)) + + def execute_array(self, query, param_seq): + cursor = self.cursor() + try: + if self.debug: + for params in param_seq: + if params: + print >> log, query % params + else: + print >> log, query + + # psycopg2 requires %()s format for all parameters, + # regardless of type. + if psycopg2: + query = re.sub(r'(%\([^)]*\)|%)[df]', r'\1s', query) + + cursor.executemany(query, param_seq) + (self.rowcount, self.description, self.lastrowid) = \ + (cursor.rowcount, cursor.description, cursor.lastrowid) + except Exception, e: + try: + self.rollback() + except: + pass + uuid = commands.getoutput("uuidgen") + print >> log, "Database error %s:" % uuid + print >> log, e + print >> log, "Query:" + print >> log, query + print >> log, "Params:" + print >> log, pformat(param_seq[0]) + raise PLCDBError("Please contact " + \ + self.api.config.PLC_NAME + " Support " + \ + "<" + self.api.config.PLC_MAIL_SUPPORT_ADDRESS + ">" + \ + " and reference " + uuid) + + return cursor + + def selectall(self, query, params = None, hashref = True, key_field = None): + """ + Return each row as a dictionary keyed on field name (like DBI + selectrow_hashref()). If key_field is specified, return rows + as a dictionary keyed on the specified field (like DBI + selectall_hashref()). + + If params is specified, the specified parameters will be bound + to the query. + """ + + cursor = self.execute(query, params) + rows = cursor.fetchall() + cursor.close() + + if hashref or key_field is not None: + # Return each row as a dictionary keyed on field name + # (like DBI selectrow_hashref()). + labels = [column[0] for column in self.description] + rows = [dict(zip(labels, row)) for row in rows] + + if key_field is not None and key_field in labels: + # Return rows as a dictionary keyed on the specified field + # (like DBI selectall_hashref()). + return dict([(row[key_field], row) for row in rows]) + else: + return rows + + def fields(self, table, notnull = None, hasdef = None): + """ + Return the names of the fields of the specified table. + """ + + if hasattr(self, 'fields_cache'): + if self.fields_cache.has_key((table, notnull, hasdef)): + return self.fields_cache[(table, notnull, hasdef)] + else: + self.fields_cache = {} + + sql = "SELECT attname FROM pg_attribute, pg_class" \ + " WHERE pg_class.oid = attrelid" \ + " AND attnum > 0 AND relname = %(table)s" + + if notnull is not None: + sql += " AND attnotnull is %(notnull)s" + + if hasdef is not None: + sql += " AND atthasdef is %(hasdef)s" + + rows = self.selectall(sql, locals(), hashref = False) + + self.fields_cache[(table, notnull, hasdef)] = [row[0] for row in rows] + + return self.fields_cache[(table, notnull, hasdef)] diff --git a/trunk/PLC/PyCurl.py b/trunk/PLC/PyCurl.py new file mode 100644 index 0000000..f0d4005 --- /dev/null +++ b/trunk/PLC/PyCurl.py @@ -0,0 +1,80 @@ +# +# Replacement for xmlrpclib.SafeTransport, which does not validate +# SSL certificates. Requires PyCurl. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import os +import xmlrpclib +import pycurl +from tempfile import NamedTemporaryFile + +class PyCurlTransport(xmlrpclib.Transport): + def __init__(self, uri, cert = None, timeout = 300): + self.curl = pycurl.Curl() + + # Suppress signals + self.curl.setopt(pycurl.NOSIGNAL, 1) + + # Follow redirections + self.curl.setopt(pycurl.FOLLOWLOCATION, 1) + + # Set URL + self.url = uri + self.curl.setopt(pycurl.URL, str(uri)) + + # Set certificate path + if cert is not None: + if os.path.exists(cert): + cert_path = str(cert) + else: + # Keep a reference so that it does not get deleted + self.cert = NamedTemporaryFile(prefix = "cert") + self.cert.write(cert) + self.cert.flush() + cert_path = self.cert.name + self.curl.setopt(pycurl.CAINFO, cert_path) + self.curl.setopt(pycurl.SSL_VERIFYPEER, 2) + + # Set connection timeout + if timeout: + self.curl.setopt(pycurl.CONNECTTIMEOUT, timeout) + self.curl.setopt(pycurl.TIMEOUT, timeout) + + # Set request callback + self.body = "" + def body(buf): + self.body += buf + self.curl.setopt(pycurl.WRITEFUNCTION, body) + + def request(self, host, handler, request_body, verbose = 1): + # Set verbosity + self.curl.setopt(pycurl.VERBOSE, verbose) + + # Post request + self.curl.setopt(pycurl.POST, 1) + self.curl.setopt(pycurl.POSTFIELDS, request_body) + + try: + self.curl.perform() + errcode = self.curl.getinfo(pycurl.HTTP_CODE) + response = self.body + self.body = "" + except pycurl.error, err: + (errcode, errmsg) = err + + if errcode == 60: + raise Exception, "PyCurl: SSL certificate validation failed" + elif errcode != 200: + raise Exception, "PyCurl: HTTP error %d -- %r" % (errcode,errmsg) + + # Parse response + p, u = self.getparser() + p.feed(response) + p.close() + + return u.close() diff --git a/trunk/PLC/Roles.py b/trunk/PLC/Roles.py new file mode 100644 index 0000000..400b344 --- /dev/null +++ b/trunk/PLC/Roles.py @@ -0,0 +1,72 @@ +# +# Functions for interacting with the roles table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from types import StringTypes +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table + +class Role(Row): + """ + Representation of a row in the roles table. To use, + instantiate with a dict of values. + """ + + table_name = 'roles' + primary_key = 'role_id' + join_tables = ['person_role', ('slice_attribute_types', 'min_role_id')] + fields = { + 'role_id': Parameter(int, "Role identifier"), + 'name': Parameter(str, "Role", max = 100), + } + + def validate_role_id(self, role_id): + # Make sure role does not already exist + conflicts = Roles(self.api, [role_id]) + if conflicts: + raise PLCInvalidArgument, "Role ID already in use" + + return role_id + + def validate_name(self, name): + # Make sure name is not blank + if not len(name): + raise PLCInvalidArgument, "Role must be specified" + + # Make sure role does not already exist + conflicts = Roles(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Role name already in use" + + return name + +class Roles(Table): + """ + Representation of the roles table in the database. + """ + + def __init__(self, api, role_filter = None): + Table.__init__(self, api, Role) + + sql = "SELECT %s FROM roles WHERE True" % \ + ", ".join(Role.fields) + + if role_filter is not None: + if isinstance(role_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), role_filter) + strs = filter(lambda x: isinstance(x, StringTypes), role_filter) + role_filter = Filter(Role.fields, {'role_id': ints, 'name': strs}) + sql += " AND (%s) %s" % role_filter.sql(api, "OR") + elif isinstance(role_filter, dict): + role_filter = Filter(Role.fields, role_filter) + sql += " AND (%s) %s" % role_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/trunk/PLC/Sessions.py b/trunk/PLC/Sessions.py new file mode 100644 index 0000000..e0a57b3 --- /dev/null +++ b/trunk/PLC/Sessions.py @@ -0,0 +1,91 @@ +from types import StringTypes +import random +import base64 +import time + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.Persons import Person, Persons +from PLC.Nodes import Node, Nodes + +class Session(Row): + """ + Representation of a row in the sessions table. To use, instantiate + with a dict of values. + """ + + table_name = 'sessions' + primary_key = 'session_id' + join_tables = ['person_session', 'node_session'] + fields = { + 'session_id': Parameter(str, "Session key"), + 'person_id': Parameter(int, "Account identifier, if applicable"), + 'node_id': Parameter(int, "Node identifier, if applicable"), + 'expires': Parameter(int, "Date and time when session expires, in seconds since UNIX epoch"), + } + + def validate_expires(self, expires): + if expires < time.time(): + raise PLCInvalidArgument, "Expiration date must be in the future" + + return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(expires)) + + add_person = Row.add_object(Person, 'person_session') + + def add_node(self, node, commit = True): + # Nodes can have only one session at a time + self.api.db.do("DELETE FROM node_session WHERE node_id = %d" % \ + node['node_id']) + + add = Row.add_object(Node, 'node_session') + add(self, node, commit = commit) + + def sync(self, commit = True, insert = None): + if not self.has_key('session_id'): + # Before a new session is added, delete expired sessions + expired = Sessions(self.api, expires = -int(time.time())) + for session in expired: + session.delete(commit) + + # Generate 32 random bytes + bytes = random.sample(xrange(0, 256), 32) + # Base64 encode their string representation + self['session_id'] = base64.b64encode("".join(map(chr, bytes))) + # Force insert + insert = True + + Row.sync(self, commit, insert) + +class Sessions(Table): + """ + Representation of row(s) from the session table in the database. + """ + + def __init__(self, api, session_filter = None, expires = int(time.time())): + Table.__init__(self, api, Session) + + sql = "SELECT %s FROM view_sessions WHERE True" % \ + ", ".join(Session.fields) + + if session_filter is not None: + if isinstance(session_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), session_filter) + strs = filter(lambda x: isinstance(x, StringTypes), session_filter) + session_filter = Filter(Session.fields, {'person_id': ints, 'session_id': strs}) + sql += " AND (%s) %s" % session_filter.sql(api, "OR") + elif isinstance(session_filter, dict): + session_filter = Filter(Session.fields, session_filter) + sql += " AND (%s) %s" % session_filter.sql(api, "AND") + + if expires is not None: + if expires >= 0: + sql += " AND expires > %(expires)d" + else: + expires = -expires + sql += " AND expires < %(expires)d" + + self.selectall(sql, locals()) diff --git a/trunk/PLC/Shell.py b/trunk/PLC/Shell.py new file mode 100644 index 0000000..6e4a77b --- /dev/null +++ b/trunk/PLC/Shell.py @@ -0,0 +1,260 @@ +#!/usr/bin/python +# +# Interactive shell for testing PLCAPI +# +# Mark Huang +# Copyright (C) 2005 The Trustees of Princeton University +# +# $Id$ +# + +import os +import pydoc +import xmlrpclib + +from PLC.API import PLCAPI +from PLC.Parameter import Mixed +from PLC.Auth import Auth +from PLC.Config import Config +from PLC.Method import Method +from PLC.PyCurl import PyCurlTransport +import PLC.Methods + +class Callable: + """ + Wrapper to call a method either directly or remotely and + automagically add the authentication structure if necessary. + """ + + def __init__(self, shell, name, func, auth = None): + self.shell = shell + self.name = name + self.func = func + self.auth = auth + + def __call__(self, *args, **kwds): + """ + Automagically add the authentication structure if the function + requires it and it has not been specified. + """ + + if self.auth and \ + (not args or not isinstance(args[0], dict) or \ + (not args[0].has_key('AuthMethod') and \ + not args[0].has_key('session'))): + args = (self.auth,) + args + + if self.shell.multi: + self.shell.calls.append({'methodName': self.name, 'params': list(args)}) + return None + else: + return self.func(*args, **kwds) + +class Shell: + def __init__(self, + # Add API functions to global scope + globals = None, + # Configuration file + config = None, + # XML-RPC server + url = None, xmlrpc = False, cacert = None, + # API authentication method + method = None, + # Password authentication + role = None, user = None, password = None, + # Session authentication + session = None): + """ + Initialize a new shell instance. Re-initializes globals. + """ + + try: + # If any XML-RPC options have been specified, do not try + # connecting directly to the DB. + if (url, method, user, password, role, cacert, xmlrpc) != \ + (None, None, None, None, None, None, False): + raise Exception + + # Otherwise, first try connecting directly to the DB. This + # absolutely requires a configuration file; the API + # instance looks for one in a default location if one is + # not specified. If this fails, try connecting to the API + # server via XML-RPC. + if config is None: + self.api = PLCAPI() + else: + self.api = PLCAPI(config) + self.config = self.api.config + self.url = None + self.server = None + except Exception, err: + # Try connecting to the API server via XML-RPC + self.api = PLCAPI(None) + + try: + if config is None: + self.config = Config() + else: + self.config = Config(config) + except Exception, err: + # Try to continue if no configuration file is available + self.config = None + + if url is None: + if self.config is None: + raise Exception, "Must specify API URL" + + url = "https://" + self.config.PLC_API_HOST + \ + ":" + str(self.config.PLC_API_PORT) + \ + "/" + self.config.PLC_API_PATH + "/" + + if cacert is None: + cacert = self.config.PLC_API_CA_SSL_CRT + + self.url = url + if cacert is not None: + self.server = xmlrpclib.ServerProxy(url, PyCurlTransport(url, cacert), allow_none = 1) + else: + self.server = xmlrpclib.ServerProxy(url, allow_none = 1) + + # Set up authentication structure + + # Default is to use session or capability authentication + if (method, user, password) == (None, None, None): + if session is not None or os.path.exists("/etc/planetlab/session"): + method = "session" + if session is None: + session = "/etc/planetlab/session" + else: + method = "capability" + + if method == "capability": + # Load defaults from configuration file if using capability + # authentication. + if user is None and self.config is not None: + user = self.config.PLC_API_MAINTENANCE_USER + if password is None and self.config is not None: + password = self.config.PLC_API_MAINTENANCE_PASSWORD + if role is None: + role = "admin" + elif method is None: + # Otherwise, default to password authentication + method = "password" + + if role == "anonymous" or method == "anonymous": + self.auth = {'AuthMethod': "anonymous"} + elif method == "session": + if session is None: + raise Exception, "Must specify session" + + if os.path.exists(session): + session = file(session).read() + + self.auth = {'AuthMethod': "session", 'session': session} + else: + if user is None: + raise Exception, "Must specify username" + + if password is None: + raise Exception, "Must specify password" + + self.auth = {'AuthMethod': method, + 'Username': user, + 'AuthString': password} + + if role is not None: + self.auth['Role'] = role + + for method in PLC.Methods.methods: + api_function = self.api.callable(method) + + if self.server is None: + # Can just call it directly + func = api_function + else: + func = getattr(self.server, method) + + # If the function requires an authentication structure as + # its first argument, automagically add an auth struct to + # the call. + if api_function.accepts and \ + (isinstance(api_function.accepts[0], Auth) or \ + (isinstance(api_function.accepts[0], Mixed) and \ + filter(lambda param: isinstance(param, Auth), api_function.accepts[0]))): + auth = self.auth + else: + auth = None + + callable = Callable(self, method, func, auth) + + # Add to ourself and the global environment. Add dummy + # subattributes to support tab completion of methods with + # dots in their names (e.g., system.listMethods). + class Dummy: pass + paths = method.split(".") + if len(paths) > 1: + first = paths.pop(0) + + if not hasattr(self, first): + obj = Dummy() + setattr(self, first, obj) + # Also add to global environment if specified + if globals is not None: + globals[first] = obj + + obj = getattr(self, first) + + for path in paths: + if not hasattr(obj, path): + if path == paths[-1]: + setattr(obj, path, callable) + else: + setattr(obj, path, Dummy()) + obj = getattr(obj, path) + else: + setattr(self, method, callable) + # Also add to global environment if specified + if globals is not None: + globals[method] = callable + + # Override help(), begin(), and commit() + if globals is not None: + globals['help'] = self.help + globals['begin'] = self.begin + globals['commit'] = self.commit + + # Multicall support + self.calls = [] + self.multi = False + + def help(self, topic = None): + if isinstance(topic, Callable): + pydoc.pager(self.system.methodHelp(topic.name)) + else: + pydoc.help(topic) + + def begin(self): + if self.calls: + raise Exception, "multicall already in progress" + + self.multi = True + + def commit(self): + if self.calls: + ret = [] + self.multi = False + results = self.system.multicall(self.calls) + for result in results: + if type(result) == type({}): + raise xmlrpclib.Fault(result['faultCode'], result['faultString']) + elif type(result) == type([]): + ret.append(result[0]) + else: + raise ValueError, "unexpected type in multicall result" + else: + ret = None + + self.calls = [] + self.multi = False + + return ret diff --git a/trunk/PLC/Sites.py b/trunk/PLC/Sites.py new file mode 100644 index 0000000..6035bb7 --- /dev/null +++ b/trunk/PLC/Sites.py @@ -0,0 +1,271 @@ +from types import StringTypes +import string + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.Slices import Slice, Slices +from PLC.PCUs import PCU, PCUs +from PLC.Nodes import Node, Nodes +from PLC.Addresses import Address, Addresses +from PLC.Persons import Person, Persons + +class Site(Row): + """ + Representation of a row in the sites table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + table_name = 'sites' + primary_key = 'site_id' + join_tables = ['person_site', 'site_address', 'peer_site'] + fields = { + 'site_id': Parameter(int, "Site identifier"), + 'name': Parameter(str, "Full site name", max = 254), + 'abbreviated_name': Parameter(str, "Abbreviated site name", max = 50), + 'login_base': Parameter(str, "Site slice prefix", max = 20), + 'is_public': Parameter(bool, "Publicly viewable site"), + 'enabled': Parameter(bool, "Has been enabled"), + 'latitude': Parameter(float, "Decimal latitude of the site", min = -90.0, max = 90.0, nullok = True), + 'longitude': Parameter(float, "Decimal longitude of the site", min = -180.0, max = 180.0, nullok = True), + 'url': Parameter(str, "URL of a page that describes the site", max = 254, nullok = True), + 'date_created': Parameter(int, "Date and time when site entry was created, in seconds since UNIX epoch", ro = True), + 'last_updated': Parameter(int, "Date and time when site entry was last updated, in seconds since UNIX epoch", ro = True), + 'max_slices': Parameter(int, "Maximum number of slices that the site is able to create"), + 'max_slivers': Parameter(int, "Maximum number of slivers that the site is able to create"), + 'person_ids': Parameter([int], "List of account identifiers"), + 'slice_ids': Parameter([int], "List of slice identifiers"), + 'address_ids': Parameter([int], "List of address identifiers"), + 'pcu_ids': Parameter([int], "List of PCU identifiers"), + 'node_ids': Parameter([int], "List of site node identifiers"), + 'peer_id': Parameter(int, "Peer to which this site belongs", nullok = True), + 'peer_site_id': Parameter(int, "Foreign site identifier at peer", nullok = True), + 'ext_consortium_id': Parameter(int, "external consortium id", nullok = True) + } + related_fields = { + 'persons': [Mixed(Parameter(int, "Person identifier"), + Parameter(str, "Email address"))], + 'addresses': [Mixed(Parameter(int, "Address identifer"), + Filter(Address.fields))] + } + # for Cache + class_key = 'login_base' + foreign_fields = ['abbreviated_name', 'name', 'is_public', 'latitude', 'longitude', + 'url', 'max_slices', 'max_slivers', + ] + # forget about these ones, they are read-only anyway + # handling them causes Cache to re-sync all over again + # 'last_updated', 'date_created' + foreign_xrefs = [] + + def validate_name(self, name): + if not len(name): + raise PLCInvalidArgument, "Name must be specified" + + return name + + validate_abbreviated_name = validate_name + + def validate_login_base(self, login_base): + if not len(login_base): + raise PLCInvalidArgument, "Login base must be specified" + + if not set(login_base).issubset(string.lowercase + string.digits): + raise PLCInvalidArgument, "Login base must consist only of lowercase ASCII letters or numbers" + + conflicts = Sites(self.api, [login_base]) + for site in conflicts: + if 'site_id' not in self or self['site_id'] != site['site_id']: + raise PLCInvalidArgument, "login_base already in use" + + return login_base + + def validate_latitude(self, latitude): + if not self.has_key('longitude') or \ + self['longitude'] is None: + raise PLCInvalidArgument, "Longitude must also be specified" + + return latitude + + def validate_longitude(self, longitude): + if not self.has_key('latitude') or \ + self['latitude'] is None: + raise PLCInvalidArgument, "Latitude must also be specified" + + return longitude + + validate_date_created = Row.validate_timestamp + validate_last_updated = Row.validate_timestamp + + add_person = Row.add_object(Person, 'person_site') + remove_person = Row.remove_object(Person, 'person_site') + + add_address = Row.add_object(Address, 'site_address') + remove_address = Row.remove_object(Address, 'site_address') + + def update_last_updated(self, commit = True): + """ + Update last_updated field with current time + """ + + assert 'site_id' in self + assert self.table_name + + self.api.db.do("UPDATE %s SET last_updated = CURRENT_TIMESTAMP " % (self.table_name) + \ + " where site_id = %d" % (self['site_id']) ) + self.sync(commit) + + + def associate_persons(self, auth, field, value): + """ + Adds persons found in value list to this site (using AddPersonToSite). + Deletes persons not found in value list from this site (using DeletePersonFromSite). + """ + + assert 'person_ids' in self + assert 'site_id' in self + assert isinstance(value, list) + + (person_ids, emails) = self.separate_types(value)[0:2] + + # Translate emails into person_ids + if emails: + persons = Persons(self.api, emails, ['person_id']).dict('person_id') + person_ids += persons.keys() + + # Add new ids, remove stale ids + if self['person_ids'] != person_ids: + from PLC.Methods.AddPersonToSite import AddPersonToSite + from PLC.Methods.DeletePersonFromSite import DeletePersonFromSite + new_persons = set(person_ids).difference(self['person_ids']) + stale_persons = set(self['person_ids']).difference(person_ids) + + for new_person in new_persons: + AddPersonToSite.__call__(AddPersonToSite(self.api), auth, new_person, self['site_id']) + for stale_person in stale_persons: + DeletePersonFromSite.__call__(DeletePersonFromSite(self.api), auth, stale_person, self['site_id']) + + def associate_addresses(self, auth, field, value): + """ + Deletes addresses_ids not found in value list (using DeleteAddress). + Adds address if slice_fields w/o address_id found in value list (using AddSiteAddress). + Update address if slice_fields w/ address_id found in value list (using UpdateAddress). + """ + + assert 'address_ids' in self + assert 'site_id' in self + assert isinstance(value, list) + + (address_ids, blank, addresses) = self.separate_types(value) + + for address in addresses: + if 'address_id' in address: + address_ids.append(address['address_id']) + + # Add new ids, remove stale ids + if self['address_ids'] != address_ids: + from PLC.Methods.DeleteAddress import DeleteAddress + stale_addresses = set(self['address_ids']).difference(address_ids) + + for stale_address in stale_addresses: + DeleteAddress.__call__(DeleteAddress(self.api), auth, stale_address) + + if addresses: + from PLC.Methods.AddSiteAddress import AddSiteAddress + from PLC.Methods.UpdateAddress import UpdateAddress + + updated_addresses = filter(lambda address: 'address_id' in address, addresses) + added_addresses = filter(lambda address: 'address_id' not in address, addresses) + + for address in added_addresses: + AddSiteAddress.__call__(AddSiteAddress(self.api), auth, self['site_id'], address) + for address in updated_addresses: + address_id = address.pop('address_id') + UpdateAddress.__call__(UpdateAddress(self.api), auth, address_id, address) + + def delete(self, commit = True): + """ + Delete existing site. + """ + + assert 'site_id' in self + + # Delete accounts of all people at the site who are not + # members of at least one other non-deleted site. + persons = Persons(self.api, self['person_ids']) + for person in persons: + delete = True + + person_sites = Sites(self.api, person['site_ids']) + for person_site in person_sites: + if person_site['site_id'] != self['site_id']: + delete = False + break + + if delete: + person.delete(commit = False) + + # Delete all site addresses + addresses = Addresses(self.api, self['address_ids']) + for address in addresses: + address.delete(commit = False) + + # Delete all site slices + slices = Slices(self.api, self['slice_ids']) + for slice in slices: + slice.delete(commit = False) + + # Delete all site PCUs + pcus = PCUs(self.api, self['pcu_ids']) + for pcu in pcus: + pcu.delete(commit = False) + + # Delete all site nodes + nodes = Nodes(self.api, self['node_ids']) + for node in nodes: + node.delete(commit = False) + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE site_id = %d" % \ + (table, self['site_id'])) + + # Mark as deleted + self['deleted'] = True + self.sync(commit) + +class Sites(Table): + """ + Representation of row(s) from the sites table in the + database. + """ + + def __init__(self, api, site_filter = None, columns = None): + Table.__init__(self, api, Site, columns) + + sql = "SELECT %s FROM view_sites WHERE deleted IS False" % \ + ", ".join(self.columns) + + if site_filter is not None: + if isinstance(site_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), site_filter) + strs = filter(lambda x: isinstance(x, StringTypes), site_filter) + site_filter = Filter(Site.fields, {'site_id': ints, 'login_base': strs}) + sql += " AND (%s) %s" % site_filter.sql(api, "OR") + elif isinstance(site_filter, dict): + site_filter = Filter(Site.fields, site_filter) + sql += " AND (%s) %s" % site_filter.sql(api, "AND") + elif isinstance (site_filter, StringTypes): + site_filter = Filter(Site.fields, {'login_base':[site_filter]}) + sql += " AND (%s) %s" % site_filter.sql(api, "AND") + elif isinstance (site_filter, int): + site_filter = Filter(Site.fields, {'site_id':[site_filter]}) + sql += " AND (%s) %s" % site_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong site filter %r"%site_filter + + self.selectall(sql) diff --git a/trunk/PLC/SliceAttributeTypes.py b/trunk/PLC/SliceAttributeTypes.py new file mode 100644 index 0000000..5884fe0 --- /dev/null +++ b/trunk/PLC/SliceAttributeTypes.py @@ -0,0 +1,72 @@ +from types import StringTypes + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.Roles import Role, Roles + +class SliceAttributeType(Row): + """ + Representation of a row in the slice_attribute_types table. To + use, instantiate with a dict of values. + """ + + table_name = 'slice_attribute_types' + primary_key = 'attribute_type_id' + join_tables = ['slice_attribute'] + fields = { + 'attribute_type_id': Parameter(int, "Slice attribute type identifier"), + 'name': Parameter(str, "Slice attribute type name", max = 100), + 'description': Parameter(str, "Slice attribute type description", max = 254), + 'min_role_id': Parameter(int, "Minimum (least powerful) role that can set or change this attribute"), + } + + # for Cache + class_key = 'name' + foreign_fields = ['description','min_role_id'] + foreign_xrefs = [] + + def validate_name(self, name): + if not len(name): + raise PLCInvalidArgument, "Slice attribute type name must be set" + + conflicts = SliceAttributeTypes(self.api, [name]) + for attribute in conflicts: + if 'attribute_type_id' not in self or \ + self['attribute_type_id'] != attribute['attribute_type_id']: + raise PLCInvalidArgument, "Slice attribute type name already in use" + + return name + + def validate_min_role_id(self, role_id): + roles = [row['role_id'] for row in Roles(self.api)] + if role_id not in roles: + raise PLCInvalidArgument, "Invalid role" + + return role_id + +class SliceAttributeTypes(Table): + """ + Representation of row(s) from the slice_attribute_types table in the + database. + """ + + def __init__(self, api, attribute_type_filter = None, columns = None): + Table.__init__(self, api, SliceAttributeType, columns) + + sql = "SELECT %s FROM slice_attribute_types WHERE True" % \ + ", ".join(self.columns) + + if attribute_type_filter is not None: + if isinstance(attribute_type_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), attribute_type_filter) + strs = filter(lambda x: isinstance(x, StringTypes), attribute_type_filter) + attribute_type_filter = Filter(SliceAttributeType.fields, {'attribute_type_id': ints, 'name': strs}) + sql += " AND (%s) %s" % attribute_type_filter.sql(api, "OR") + elif isinstance(attribute_type_filter, dict): + attribute_type_filter = Filter(SliceAttributeType.fields, attribute_type_filter) + sql += " AND (%s) %s" % attribute_type_filter.sql(api, "AND") + + self.selectall(sql) diff --git a/trunk/PLC/SliceAttributes.py b/trunk/PLC/SliceAttributes.py new file mode 100644 index 0000000..9f0b1fb --- /dev/null +++ b/trunk/PLC/SliceAttributes.py @@ -0,0 +1,46 @@ +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Filter import Filter +from PLC.Table import Row, Table +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes + +class SliceAttribute(Row): + """ + Representation of a row in the slice_attribute table. To use, + instantiate with a dict of values. + """ + + table_name = 'slice_attribute' + primary_key = 'slice_attribute_id' + fields = { + 'slice_attribute_id': Parameter(int, "Slice attribute identifier"), + 'slice_id': Parameter(int, "Slice identifier"), + 'node_id': Parameter(int, "Node identifier, if a sliver attribute"), + 'nodegroup_id': Parameter(int, "Nodegroup identifier, if a sliver attribute"), + 'attribute_type_id': SliceAttributeType.fields['attribute_type_id'], + 'name': SliceAttributeType.fields['name'], + 'description': SliceAttributeType.fields['description'], + 'min_role_id': SliceAttributeType.fields['min_role_id'], + 'value': Parameter(str, "Slice attribute value"), + } + +class SliceAttributes(Table): + """ + Representation of row(s) from the slice_attribute table in the + database. + """ + + def __init__(self, api, slice_attribute_filter = None, columns = None): + Table.__init__(self, api, SliceAttribute, columns) + + sql = "SELECT %s FROM view_slice_attributes WHERE True" % \ + ", ".join(self.columns) + + if slice_attribute_filter is not None: + if isinstance(slice_attribute_filter, (list, tuple, set)): + slice_attribute_filter = Filter(SliceAttribute.fields, {'slice_attribute_id': slice_attribute_filter}) + elif isinstance(slice_attribute_filter, dict): + slice_attribute_filter = Filter(SliceAttribute.fields, slice_attribute_filter) + sql += " AND (%s) %s" % slice_attribute_filter.sql(api) + + self.selectall(sql) diff --git a/trunk/PLC/SliceInstantiations.py b/trunk/PLC/SliceInstantiations.py new file mode 100644 index 0000000..4996a1e --- /dev/null +++ b/trunk/PLC/SliceInstantiations.py @@ -0,0 +1,53 @@ +# +# Functions for interacting with the slice_instantiations table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class SliceInstantiation(Row): + """ + Representation of a row in the slice_instantiations table. To use, + instantiate with a dict of values. + """ + + table_name = 'slice_instantiations' + primary_key = 'instantiation' + join_tables = ['slices'] + fields = { + 'instantiation': Parameter(str, "Slice instantiation state", max = 100), + } + + def validate_instantiation(self, instantiation): + # Make sure name is not blank + if not len(instantiation): + raise PLCInvalidArgument, "Slice instantiation state name must be specified" + + # Make sure slice instantiation does not alredy exist + conflicts = SliceInstantiations(self.api, [instantiation]) + if conflicts: + raise PLCInvalidArgument, "Slice instantiation state name already in use" + + return instantiation + +class SliceInstantiations(Table): + """ + Representation of the slice_instantiations table in the database. + """ + + def __init__(self, api, instantiations = None): + Table.__init__(self, api, SliceInstantiation) + + sql = "SELECT %s FROM slice_instantiations" % \ + ", ".join(SliceInstantiation.fields) + + if instantiations: + sql += " WHERE instantiation IN (%s)" % ", ".join(map(api.db.quote, instantiations)) + + self.selectall(sql) diff --git a/trunk/PLC/Slices.py b/trunk/PLC/Slices.py new file mode 100644 index 0000000..1a1786c --- /dev/null +++ b/trunk/PLC/Slices.py @@ -0,0 +1,296 @@ +from types import StringTypes +import time +import re + +from PLC.Faults import * +from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Debug import profile +from PLC.Table import Row, Table +from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations +from PLC.Nodes import Node +from PLC.Persons import Person, Persons +from PLC.SliceAttributes import SliceAttribute + +class Slice(Row): + """ + Representation of a row in the slices table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync().To use, instantiate + with a dict of values. + """ + + table_name = 'slices' + primary_key = 'slice_id' + join_tables = ['slice_node', 'slice_person', 'slice_attribute', 'peer_slice', 'node_slice_whitelist'] + fields = { + 'slice_id': Parameter(int, "Slice identifier"), + 'site_id': Parameter(int, "Identifier of the site to which this slice belongs"), + 'name': Parameter(str, "Slice name", max = 32), + 'instantiation': Parameter(str, "Slice instantiation state"), + 'url': Parameter(str, "URL further describing this slice", max = 254, nullok = True), + 'description': Parameter(str, "Slice description", max = 2048, nullok = True), + 'max_nodes': Parameter(int, "Maximum number of nodes that can be assigned to this slice"), + 'creator_person_id': Parameter(int, "Identifier of the account that created this slice"), + 'created': Parameter(int, "Date and time when slice was created, in seconds since UNIX epoch", ro = True), + 'expires': Parameter(int, "Date and time when slice expires, in seconds since UNIX epoch"), + 'node_ids': Parameter([int], "List of nodes in this slice", ro = True), + 'person_ids': Parameter([int], "List of accounts that can use this slice", ro = True), + 'slice_attribute_ids': Parameter([int], "List of slice attributes", ro = True), + 'peer_id': Parameter(int, "Peer to which this slice belongs", nullok = True), + 'peer_slice_id': Parameter(int, "Foreign slice identifier at peer", nullok = True), + } + related_fields = { + 'persons': [Mixed(Parameter(int, "Person identifier"), + Parameter(str, "Email address"))], + 'nodes': [Mixed(Parameter(int, "Node identifier"), + Parameter(str, "Fully qualified hostname"))] + } + # for Cache + class_key = 'name' + foreign_fields = ['instantiation', 'url', 'description', 'max_nodes', 'expires'] + foreign_xrefs = [ + {'field': 'node_ids' , 'class': 'Node', 'table': 'slice_node' }, + {'field': 'person_ids', 'class': 'Person', 'table': 'slice_person'}, + {'field': 'creator_person_id', 'class': 'Person', 'table': 'unused-on-direct-refs'}, + {'field': 'site_id', 'class': 'Site', 'table': 'unused-on-direct-refs'}, + ] + # forget about this one, it is read-only anyway + # handling it causes Cache to re-sync all over again + # 'created' + + def validate_name(self, name): + # N.B.: Responsibility of the caller to ensure that login_base + # portion of the slice name corresponds to a valid site, if + # desired. + + # 1. Lowercase. + # 2. Begins with login_base (letters or numbers). + # 3. Then single underscore after login_base. + # 4. Then letters, numbers, or underscores. + good_name = r'^[a-z0-9]+_[a-zA-Z0-9_]+$' + if not name or \ + not re.match(good_name, name): + raise PLCInvalidArgument, "Invalid slice name" + + conflicts = Slices(self.api, [name]) + for slice in conflicts: + if 'slice_id' not in self or self['slice_id'] != slice['slice_id']: + raise PLCInvalidArgument, "Slice name already in use, %s"%name + + return name + + def validate_instantiation(self, instantiation): + instantiations = [row['instantiation'] for row in SliceInstantiations(self.api)] + if instantiation not in instantiations: + raise PLCInvalidArgument, "No such instantiation state" + + return instantiation + + validate_created = Row.validate_timestamp + + def validate_expires(self, expires): + # N.B.: Responsibility of the caller to ensure that expires is + # not too far into the future. + check_future = not ('is_deleted' in self and self['is_deleted']) + return Row.validate_timestamp(self, expires, check_future = check_future) + + add_person = Row.add_object(Person, 'slice_person') + remove_person = Row.remove_object(Person, 'slice_person') + + add_node = Row.add_object(Node, 'slice_node') + remove_node = Row.remove_object(Node, 'slice_node') + + add_to_node_whitelist = Row.add_object(Node, 'node_slice_whitelist') + delete_from_node_whitelist = Row.remove_object(Node, 'node_slice_whitelist') + + def associate_persons(self, auth, field, value): + """ + Adds persons found in value list to this slice (using AddPersonToSlice). + Deletes persons not found in value list from this slice (using DeletePersonFromSlice). + """ + + assert 'person_ids' in self + assert 'slice_id' in self + assert isinstance(value, list) + + (person_ids, emails) = self.separate_types(value)[0:2] + + # Translate emails into person_ids + if emails: + persons = Persons(self.api, emails, ['person_id']).dict('person_id') + person_ids += persons.keys() + + # Add new ids, remove stale ids + if self['person_ids'] != person_ids: + from PLC.Methods.AddPersonToSlice import AddPersonToSlice + from PLC.Methods.DeletePersonFromSlice import DeletePersonFromSlice + new_persons = set(person_ids).difference(self['person_ids']) + stale_persons = set(self['person_ids']).difference(person_ids) + + for new_person in new_persons: + AddPersonToSlice.__call__(AddPersonToSlice(self.api), auth, new_person, self['slice_id']) + for stale_person in stale_persons: + DeletePersonFromSlice.__call__(DeletePersonFromSlice(self.api), auth, stale_person, self['slice_id']) + + def associate_nodes(self, auth, field, value): + """ + Adds nodes found in value list to this slice (using AddSliceToNodes). + Deletes nodes not found in value list from this slice (using DeleteSliceFromNodes). + """ + + from PLC.Nodes import Nodes + + assert 'node_ids' in self + assert 'slice_id' in self + assert isinstance(value, list) + + (node_ids, hostnames) = self.separate_types(value)[0:2] + + # Translate hostnames into node_ids + if hostnames: + nodes = Nodes(self.api, hostnames, ['node_id']).dict('node_id') + node_ids += nodes.keys() + + # Add new ids, remove stale ids + if self['node_ids'] != node_ids: + from PLC.Methods.AddSliceToNodes import AddSliceToNodes + from PLC.Methods.DeleteSliceFromNodes import DeleteSliceFromNodes + new_nodes = set(node_ids).difference(self['node_ids']) + stale_nodes = set(self['node_ids']).difference(node_ids) + + if new_nodes: + AddSliceToNodes.__call__(AddSliceToNodes(self.api), auth, self['slice_id'], list(new_nodes)) + if stale_nodes: + DeleteSliceFromNodes.__call__(DeleteSliceFromNodes(self.api), auth, self['slice_id'], list(stale_nodes)) + def associate_slice_attributes(self, auth, fields, value): + """ + Deletes slice_attribute_ids not found in value list (using DeleteSliceAttribute). + Adds slice_attributes if slice_fields w/o slice_id is found (using AddSliceAttribute). + Updates slice_attribute if slice_fields w/ slice_id is found (using UpdateSlceiAttribute). + """ + + assert 'slice_attribute_ids' in self + assert isinstance(value, list) + + (attribute_ids, blank, attributes) = self.separate_types(value) + + # There is no way to add attributes by id. They are + # associated with a slice when they are created. + # So we are only looking to delete here + if self['slice_attribute_ids'] != attribute_ids: + from PLC.Methods.DeleteSliceAttribute import DeleteSliceAttribute + stale_attributes = set(self['slice_attribute_ids']).difference(attribute_ids) + + for stale_attribute in stale_attributes: + DeleteSliceAttribute.__call__(DeleteSliceAttribute(self.api), auth, stale_attribute['slice_attribute_id']) + + # If dictionary exists, we are either adding new + # attributes or updating existing ones. + if attributes: + from PLC.Methods.AddSliceAttribute import AddSliceAttribute + from PLC.Methods.UpdateSliceAttribute import UpdateSliceAttribute + + added_attributes = filter(lambda x: 'slice_attribute_id' not in x, attributes) + updated_attributes = filter(lambda x: 'slice_attribute_id' in x, attributes) + + for added_attribute in added_attributes: + if 'attribute_type' in added_attribute: + type = added_attribute['attribute_type'] + elif 'attribute_type_id' in added_attribute: + type = added_attribute['attribute_type_id'] + else: + raise PLCInvalidArgument, "Must specify attribute_type or attribute_type_id" + + if 'value' in added_attribute: + value = added_attribute['value'] + else: + raise PLCInvalidArgument, "Must specify a value" + + if 'node_id' in added_attribute: + node_id = added_attribute['node_id'] + else: + node_id = None + + if 'nodegroup_id' in added_attribute: + nodegroup_id = added_attribute['nodegroup_id'] + else: + nodegroup_id = None + + AddSliceAttribute.__call__(AddSliceAttribute(self.api), auth, self['slice_id'], type, value, node_id, nodegroup_id) + for updated_attribute in updated_attributes: + attribute_id = updated_attribute.pop('slice_attribute_id') + if attribute_id not in self['slice_attribute_ids']: + raise PLCInvalidArgument, "Attribute doesnt belong to this slice" + else: + UpdateSliceAttribute.__call__(UpdateSliceAttribute(self.api), auth, attribute_id, updated_attribute) + + def sync(self, commit = True): + """ + Add or update a slice. + """ + + # Before a new slice is added, delete expired slices + if 'slice_id' not in self: + expired = Slices(self.api, expires = -int(time.time())) + for slice in expired: + slice.delete(commit) + + Row.sync(self, commit) + + def delete(self, commit = True): + """ + Delete existing slice. + """ + + assert 'slice_id' in self + + # Clean up miscellaneous join tables + for table in self.join_tables: + self.api.db.do("DELETE FROM %s WHERE slice_id = %d" % \ + (table, self['slice_id'])) + + # Mark as deleted + self['is_deleted'] = True + self.sync(commit) + + +class Slices(Table): + """ + Representation of row(s) from the slices table in the + database. + """ + + def __init__(self, api, slice_filter = None, columns = None, expires = int(time.time())): + Table.__init__(self, api, Slice, columns) + + sql = "SELECT %s FROM view_slices WHERE is_deleted IS False" % \ + ", ".join(self.columns) + + if expires is not None: + if expires >= 0: + sql += " AND expires > %d" % expires + else: + expires = -expires + sql += " AND expires < %d" % expires + + if slice_filter is not None: + if isinstance(slice_filter, (list, tuple, set)): + # Separate the list into integers and strings + ints = filter(lambda x: isinstance(x, (int, long)), slice_filter) + strs = filter(lambda x: isinstance(x, StringTypes), slice_filter) + slice_filter = Filter(Slice.fields, {'slice_id': ints, 'name': strs}) + sql += " AND (%s) %s" % slice_filter.sql(api, "OR") + elif isinstance(slice_filter, dict): + slice_filter = Filter(Slice.fields, slice_filter) + sql += " AND (%s) %s" % slice_filter.sql(api, "AND") + elif isinstance (slice_filter, StringTypes): + slice_filter = Filter(Slice.fields, {'name':[slice_filter]}) + sql += " AND (%s) %s" % slice_filter.sql(api, "AND") + elif isinstance (slice_filter, int): + slice_filter = Filter(Slice.fields, {'slice_id':[slice_filter]}) + sql += " AND (%s) %s" % slice_filter.sql(api, "AND") + else: + raise PLCInvalidArgument, "Wrong slice filter %r"%slice_filter + + self.selectall(sql) diff --git a/trunk/PLC/Table.py b/trunk/PLC/Table.py new file mode 100644 index 0000000..2362d61 --- /dev/null +++ b/trunk/PLC/Table.py @@ -0,0 +1,322 @@ +from types import StringTypes +import time +import calendar + +from PLC.Faults import * +from PLC.Parameter import Parameter + +class Row(dict): + """ + Representation of a row in a database table. To use, optionally + instantiate with a dict of values. Update as you would a + dict. Commit to the database with sync(). + """ + + # Set this to the name of the table that stores the row. + table_name = None + + # Set this to the name of the primary key of the table. It is + # assumed that the this key is a sequence if it is not set when + # sync() is called. + primary_key = None + + # Set this to the names of tables that reference this table's + # primary key. + join_tables = [] + + # Set this to a dict of the valid fields of this object and their + # types. Not all fields (e.g., joined fields) may be updated via + # sync(). + fields = {} + + def __init__(self, api, fields = {}): + dict.__init__(self, fields) + self.api = api + + def validate(self): + """ + Validates values. Will validate a value with a custom function + if a function named 'validate_[key]' exists. + """ + + # Warn about mandatory fields + mandatory_fields = self.api.db.fields(self.table_name, notnull = True, hasdef = False) + for field in mandatory_fields: + if not self.has_key(field) or self[field] is None: + raise PLCInvalidArgument, field + " must be specified and cannot be unset in class %s"%self.__class__.__name__ + + # Validate values before committing + for key, value in self.iteritems(): + if value is not None and hasattr(self, 'validate_' + key): + validate = getattr(self, 'validate_' + key) + self[key] = validate(value) + + def separate_types(self, items): + """ + Separate a list of different typed objects. + Return a list for each type (ints, strs and dicts) + """ + + if isinstance(items, (list, tuple, set)): + ints = filter(lambda x: isinstance(x, (int, long)), items) + strs = filter(lambda x: isinstance(x, StringTypes), items) + dicts = filter(lambda x: isinstance(x, dict), items) + return (ints, strs, dicts) + else: + raise PLCInvalidArgument, "Can only separate list types" + + + def associate(self, *args): + """ + Provides a means for high lvl api calls to associate objects + using low lvl calls. + """ + + if len(args) < 3: + raise PLCInvalidArgumentCount, "auth, field, value must be specified" + elif hasattr(self, 'associate_' + args[1]): + associate = getattr(self, 'associate_'+args[1]) + associate(*args) + else: + raise PLCInvalidArguemnt, "No such associate function associate_%s" % args[1] + + def validate_timestamp(self, timestamp, check_future = False): + """ + Validates the specified GMT timestamp string (must be in + %Y-%m-%d %H:%M:%S format) or number (seconds since UNIX epoch, + i.e., 1970-01-01 00:00:00 GMT). If check_future is True, + raises an exception if timestamp is not in the future. Returns + a GMT timestamp string. + """ + + time_format = "%Y-%m-%d %H:%M:%S" + + if isinstance(timestamp, StringTypes): + # calendar.timegm() is the inverse of time.gmtime() + timestamp = calendar.timegm(time.strptime(timestamp, time_format)) + + # Human readable timestamp string + human = time.strftime(time_format, time.gmtime(timestamp)) + + if check_future and timestamp < time.time(): + raise PLCInvalidArgument, "'%s' not in the future" % human + + return human + + def add_object(self, classobj, join_table, columns = None): + """ + Returns a function that can be used to associate this object + with another. + """ + + def add(self, obj, columns = None, commit = True): + """ + Associate with the specified object. + """ + + # Various sanity checks + assert isinstance(self, Row) + assert self.primary_key in self + assert join_table in self.join_tables + assert isinstance(obj, classobj) + assert isinstance(obj, Row) + assert obj.primary_key in obj + assert join_table in obj.join_tables + + # By default, just insert the primary keys of each object + # into the join table. + if columns is None: + columns = {self.primary_key: self[self.primary_key], + obj.primary_key: obj[obj.primary_key]} + + params = [] + for name, value in columns.iteritems(): + params.append(self.api.db.param(name, value)) + + self.api.db.do("INSERT INTO %s (%s) VALUES(%s)" % \ + (join_table, ", ".join(columns), ", ".join(params)), + columns) + + if commit: + self.api.db.commit() + + return add + + add_object = classmethod(add_object) + + def remove_object(self, classobj, join_table): + """ + Returns a function that can be used to disassociate this + object with another. + """ + + def remove(self, obj, commit = True): + """ + Disassociate from the specified object. + """ + + assert isinstance(self, Row) + assert self.primary_key in self + assert join_table in self.join_tables + assert isinstance(obj, classobj) + assert isinstance(obj, Row) + assert obj.primary_key in obj + assert join_table in obj.join_tables + + self_id = self[self.primary_key] + obj_id = obj[obj.primary_key] + + self.api.db.do("DELETE FROM %s WHERE %s = %s AND %s = %s" % \ + (join_table, + self.primary_key, self.api.db.param('self_id', self_id), + obj.primary_key, self.api.db.param('obj_id', obj_id)), + locals()) + + if commit: + self.api.db.commit() + + return remove + + remove_object = classmethod(remove_object) + + def db_fields(self, obj = None): + """ + Return only those fields that can be set or updated directly + (i.e., those fields that are in the primary table (table_name) + for this object, and are not marked as a read-only Parameter. + """ + + if obj is None: + obj = self + + db_fields = self.api.db.fields(self.table_name) + return dict(filter(lambda (key, value): \ + key in db_fields and \ + (key not in self.fields or \ + not isinstance(self.fields[key], Parameter) or \ + not self.fields[key].ro), + obj.items())) + + def __eq__(self, y): + """ + Compare two objects. + """ + + # Filter out fields that cannot be set or updated directly + # (and thus would not affect equality for the purposes of + # deciding if we should sync() or not). + x = self.db_fields() + y = self.db_fields(y) + return dict.__eq__(x, y) + + def sync(self, commit = True, insert = None): + """ + Flush changes back to the database. + """ + + # Validate all specified fields + self.validate() + + # Filter out fields that cannot be set or updated directly + db_fields = self.db_fields() + + # Parameterize for safety + keys = db_fields.keys() + values = [self.api.db.param(key, value) for (key, value) in db_fields.items()] + + # If the primary key (usually an auto-incrementing serial + # identifier) has not been specified, or the primary key is the + # only field in the table, or insert has been forced. + if not self.has_key(self.primary_key) or \ + keys == [self.primary_key] or \ + insert is True: + # Insert new row + sql = "INSERT INTO %s (%s) VALUES (%s)" % \ + (self.table_name, ", ".join(keys), ", ".join(values)) + else: + # Update existing row + columns = ["%s = %s" % (key, value) for (key, value) in zip(keys, values)] + sql = "UPDATE %s SET " % self.table_name + \ + ", ".join(columns) + \ + " WHERE %s = %s" % \ + (self.primary_key, + self.api.db.param(self.primary_key, self[self.primary_key])) + + self.api.db.do(sql, db_fields) + + if not self.has_key(self.primary_key): + self[self.primary_key] = self.api.db.last_insert_id(self.table_name, self.primary_key) + + if commit: + self.api.db.commit() + + def delete(self, commit = True): + """ + Delete row from its primary table, and from any tables that + reference it. + """ + + assert self.primary_key in self + + for table in self.join_tables + [self.table_name]: + if isinstance(table, tuple): + key = table[1] + table = table[0] + else: + key = self.primary_key + + sql = "DELETE FROM %s WHERE %s = %s" % \ + (table, key, + self.api.db.param(self.primary_key, self[self.primary_key])) + + self.api.db.do(sql, self) + + if commit: + self.api.db.commit() + +class Table(list): + """ + Representation of row(s) in a database table. + """ + + def __init__(self, api, classobj, columns = None): + self.api = api + self.classobj = classobj + self.rows = {} + + if columns is None: + columns = classobj.fields + else: + columns = filter(lambda x: x in classobj.fields, columns) + if not columns: + raise PLCInvalidArgument, "No valid return fields specified" + + self.columns = columns + + def sync(self, commit = True): + """ + Flush changes back to the database. + """ + + for row in self: + row.sync(commit) + + def selectall(self, sql, params = None): + """ + Given a list of rows from the database, fill ourselves with + Row objects. + """ + + for row in self.api.db.selectall(sql, params): + obj = self.classobj(self.api, row) + self.append(obj) + + def dict(self, key_field = None): + """ + Return ourself as a dict keyed on key_field. + """ + + if key_field is None: + key_field = self.classobj.primary_key + + return dict([(obj[key_field], obj) for obj in self]) diff --git a/trunk/PLC/Test.py b/trunk/PLC/Test.py new file mode 100644 index 0000000..05796a6 --- /dev/null +++ b/trunk/PLC/Test.py @@ -0,0 +1,1460 @@ +#!/usr/bin/python +# +# Test script utility class +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from pprint import pprint +from string import letters, digits, punctuation +from traceback import print_exc +from optparse import OptionParser +import socket +import base64 +import struct +import os +import xmlrpclib + +from PLC.Shell import Shell + +from random import Random +random = Random() + +def randfloat(min = 0.0, max = 1.0): + return float(min) + (random.random() * (float(max) - float(min))) + +def randint(min = 0, max = 1): + return int(randfloat(min, max + 1)) + +# See "2.2 Characters" in the XML specification: +# +# #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] +# avoiding +# [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF] +# + +ascii_xml_chars = map(unichr, [0x9, 0xA]) +# xmlrpclib uses xml.parsers.expat, which always converts either '\r' +# (#xD) or '\n' (#xA) to '\n'. So avoid using '\r', too, if this is +# still the case. +if xmlrpclib.loads(xmlrpclib.dumps(('\r',)))[0][0] == '\r': + ascii_xml_chars.append('\r') +ascii_xml_chars += map(unichr, xrange(0x20, 0x7F - 1)) +low_xml_chars = list(ascii_xml_chars) +low_xml_chars += map(unichr, xrange(0x84 + 1, 0x86 - 1)) +low_xml_chars += map(unichr, xrange(0x9F + 1, 0xFF)) +valid_xml_chars = list(low_xml_chars) +valid_xml_chars += map(unichr, xrange(0xFF + 1, 0xD7FF)) +valid_xml_chars += map(unichr, xrange(0xE000, 0xFDD0 - 1)) +valid_xml_chars += map(unichr, xrange(0xFDDF + 1, 0xFFFD)) + +def randstr(length, pool = valid_xml_chars, encoding = "utf-8"): + sample = random.sample(pool, min(length, len(pool))) + while True: + s = u''.join(sample) + bytes = len(s.encode(encoding)) + if bytes > length: + sample.pop() + elif bytes < length: + sample += random.sample(pool, min(length - bytes, len(pool))) + random.shuffle(sample) + else: + break + return s + +def randhostname(): + # 1. Each part begins and ends with a letter or number. + # 2. Each part except the last can contain letters, numbers, or hyphens. + # 3. Each part is between 1 and 64 characters, including the trailing dot. + # 4. At least two parts. + # 5. Last part can only contain between 2 and 6 letters. + hostname = 'a' + randstr(61, letters + digits + '-') + '1.' + \ + 'b' + randstr(61, letters + digits + '-') + '2.' + \ + 'c' + randstr(5, letters) + return hostname + +def randpath(length): + parts = [] + for i in range(randint(1, 10)): + parts.append(randstr(randint(1, 30), ascii_xml_chars)) + return u'/'.join(parts)[0:length] + +def randemail(): + return (randstr(100, letters + digits) + "@" + randhostname()).lower() + +def randkey(bits = 2048): + ssh_key_types = ["ssh-dss", "ssh-rsa"] + key_type = random.sample(ssh_key_types, 1)[0] + return ' '.join([key_type, + base64.b64encode(''.join(randstr(bits / 8).encode("utf-8"))), + randemail()]) + +def random_site(): + return { + 'name': randstr(254), + 'abbreviated_name': randstr(50), + 'login_base': randstr(20, letters).lower(), + 'latitude': int(randfloat(-90.0, 90.0) * 1000) / 1000.0, + 'longitude': int(randfloat(-180.0, 180.0) * 1000) / 1000.0, + } + +def random_address_type(): + return { + 'name': randstr(20), + 'description': randstr(254), + } + +def random_address(): + return { + 'line1': randstr(254), + 'line2': randstr(254), + 'line3': randstr(254), + 'city': randstr(254), + 'state': randstr(254), + 'postalcode': randstr(64), + 'country': randstr(128), + } + +def random_person(): + return { + 'first_name': randstr(128), + 'last_name': randstr(128), + 'email': randemail(), + 'bio': randstr(254), + # Accounts are disabled by default + 'enabled': False, + 'password': randstr(254), + } + +def random_key(key_types): + return { + 'key_type': random.sample(key_types, 1)[0], + 'key': randkey() + } + +def random_nodegroup(): + return { + 'name': randstr(50), + 'description': randstr(200), + } + +def random_node(boot_states): + return { + 'hostname': randhostname(), + 'boot_state': random.sample(boot_states, 1)[0], + 'model': randstr(255), + 'version': randstr(64), + } + +def random_nodenetwork(method, type): + nodenetwork_fields = { + 'method': method, + 'type': type, + 'bwlimit': randint(500000, 10000000), + } + + if method != 'dhcp': + ip = randint(0, 0xffffffff) + netmask = (0xffffffff << randint(2, 31)) & 0xffffffff + network = ip & netmask + broadcast = ((ip & netmask) | ~netmask) & 0xffffffff + gateway = randint(network + 1, broadcast - 1) + dns1 = randint(0, 0xffffffff) + + for field in 'ip', 'netmask', 'network', 'broadcast', 'gateway', 'dns1': + nodenetwork_fields[field] = socket.inet_ntoa(struct.pack('>L', locals()[field])) + + return nodenetwork_fields + +def random_pcu(): + return { + 'hostname': randhostname(), + 'ip': socket.inet_ntoa(struct.pack('>L', randint(0, 0xffffffff))), + 'protocol': randstr(16), + 'username': randstr(254), + 'password': randstr(254), + 'notes': randstr(254), + 'model': randstr(32), + } + +def random_conf_file(): + return { + 'enabled': bool(randint()), + 'source': randpath(255), + 'dest': randpath(255), + 'file_permissions': "%#o" % randint(0, 512), + 'file_owner': randstr(32, letters + '_' + digits), + 'file_group': randstr(32, letters + '_' + digits), + 'preinstall_cmd': randpath(100), + 'postinstall_cmd': randpath(100), + 'error_cmd': randpath(100), + 'ignore_cmd_errors': bool(randint()), + 'always_update': bool(randint()), + } + +def random_attribute_type(role_ids): + return { + 'name': randstr(100), + 'description': randstr(254), + 'min_role_id': random.sample(role_ids, 1)[0], + } + +def random_slice(login_base): + return { + 'name': login_base + "_" + randstr(11, letters).lower(), + 'url': "http://" + randhostname() + "/", + 'description': randstr(2048), + } + +class Test: + tiny = { + 'sites': 1, + 'address_types': 1, + 'addresses_per_site': 1, + 'persons_per_site': 1, + 'keys_per_person': 1, + 'nodegroups': 1, + 'nodes_per_site': 1, + 'nodenetworks_per_node': 1, + 'pcus_per_site': 1, + 'conf_files': 1, + 'attribute_types': 1, + 'slices_per_site': 1, + 'attributes_per_slice': 1, + } + + default = { + 'sites': 10, + 'address_types': 2, + 'addresses_per_site': 2, + 'persons_per_site': 10, + 'keys_per_person': 2, + 'nodegroups': 10, + 'nodes_per_site': 2, + 'nodenetworks_per_node': 1, + 'pcus_per_site': 1, + 'conf_files': 10, + 'attribute_types': 10, + 'slices_per_site': 10, + 'attributes_per_slice': 2, + } + + def __init__(self, api, check = True, verbose = True): + self.api = api + self.check = check + self.verbose = verbose + + self.site_ids = [] + self.address_type_ids = [] + self.address_ids = [] + self.person_ids = [] + self.key_ids = [] + self.nodegroup_ids = [] + self.node_ids = [] + self.nodenetwork_ids = [] + self.pcu_ids = [] + self.conf_file_ids = [] + self.attribute_type_ids = [] + self.slice_ids = [] + self.slice_attribute_ids = [] + + def Run(self, **kwds): + """ + Run a complete database and API consistency test. Populates + the database with a set of random entities, updates them, then + deletes them. Examples: + + test.Run() # Defaults + test.Run(**Test.default) # Defaults + test.Run(**Test.tiny) # Tiny set + test.Run(sites = 123, slices_per_site = 4) # Defaults with overrides + """ + + try: + self.Add(**kwds) + self.Update() + finally: + self.Delete() + + def Add(self, **kwds): + """ + Populate the database with a set of random entities. Examples: + + test.populate() # Defaults + test.populate(Test.tiny) # Tiny set + test.populate(sites = 123, slices_per_site = 4) # Defaults with overrides + """ + + params = self.default.copy() + params.update(kwds) + + self.AddSites(params['sites']) + self.AddAddressTypes(params['address_types']) + self.AddAddresses(params['addresses_per_site']) + self.AddPersons(params['persons_per_site']) + self.AddKeys(params['keys_per_person']) + self.AddNodeGroups(params['nodegroups']) + self.AddNodes(params['nodes_per_site']) + self.AddNodeNetworks(params['nodenetworks_per_node']) + self.AddPCUs(params['pcus_per_site']) + self.AddConfFiles(params['conf_files']) + self.AddSliceAttributeTypes(params['attribute_types']) + self.AddSlices(params['slices_per_site']) + self.AddSliceAttributes(params['attributes_per_slice']) + + def Update(self): + self.UpdateSites() + self.UpdateAddressTypes() + self.UpdateAddresses() + self.UpdatePersons() + self.UpdateKeys() + self.UpdateNodeGroups() + self.UpdateNodes() + self.UpdateNodeNetworks() + self.UpdatePCUs() + self.UpdateConfFiles() + self.UpdateSliceAttributeTypes() + self.UpdateSlices() + self.UpdateSliceAttributes() + + def Delete(self): + self.DeleteSliceAttributes() + self.DeleteSlices() + self.DeleteSliceAttributeTypes() + self.DeleteKeys() + self.DeleteConfFiles() + self.DeletePCUs() + self.DeleteNodeNetworks() + self.DeleteNodes() + self.DeletePersons() + self.DeleteNodeGroups() + self.DeleteAddresses() + self.DeleteAddressTypes() + self.DeleteSites() + + def AddSites(self, n = 10): + """ + Add a number of random sites. + """ + + for i in range(n): + # Add site + site_fields = random_site() + site_id = self.api.AddSite(site_fields) + + # Should return a unique site_id + assert site_id not in self.site_ids + self.site_ids.append(site_id) + + # Enable slice creation + site_fields['max_slices'] = randint(1, 10) + self.api.UpdateSite(site_id, site_fields) + + if self.check: + # Check site + site = self.api.GetSites([site_id])[0] + for field in site_fields: + assert site[field] == site_fields[field] + + if self.verbose: + print "Added site", site_id + + def UpdateSites(self): + """ + Make random changes to any sites we may have added. + """ + + for site_id in self.site_ids: + # Update site + site_fields = random_site() + # Do not change login_base + if 'login_base' in site_fields: + del site_fields['login_base'] + self.api.UpdateSite(site_id, site_fields) + + if self.check: + # Check site + site = self.api.GetSites([site_id])[0] + for field in site_fields: + assert site[field] == site_fields[field] + + if self.verbose: + print "Updated site", site_id + + def DeleteSites(self): + """ + Delete any random sites we may have added. + """ + + for site_id in self.site_ids: + self.api.DeleteSite(site_id) + + if self.check: + assert not self.api.GetSites([site_id]) + + if self.verbose: + print "Deleted site", site_id + + if self.check: + assert not self.api.GetSites(self.site_ids) + + self.site_ids = [] + + def AddAddressTypes(self, n = 2): + """ + Add a number of random address types. + """ + + for i in range(n): + address_type_fields = random_address_type() + address_type_id = self.api.AddAddressType(address_type_fields) + + # Should return a unique address_type_id + assert address_type_id not in self.address_type_ids + self.address_type_ids.append(address_type_id) + + if self.check: + # Check address type + address_type = self.api.GetAddressTypes([address_type_id])[0] + for field in address_type_fields: + assert address_type[field] == address_type_fields[field] + + if self.verbose: + print "Added address type", address_type_id + + def UpdateAddressTypes(self): + """ + Make random changes to any address types we may have added. + """ + + for address_type_id in self.address_type_ids: + # Update address_type + address_type_fields = random_address_type() + self.api.UpdateAddressType(address_type_id, address_type_fields) + + if self.check: + # Check address type + address_type = self.api.GetAddressTypes([address_type_id])[0] + for field in address_type_fields: + assert address_type[field] == address_type_fields[field] + + if self.verbose: + print "Updated address_type", address_type_id + + def DeleteAddressTypes(self): + """ + Delete any random address types we may have added. + """ + + for address_type_id in self.address_type_ids: + self.api.DeleteAddressType(address_type_id) + + if self.check: + assert not self.api.GetAddressTypes([address_type_id]) + + if self.verbose: + print "Deleted address type", address_type_id + + if self.check: + assert not self.api.GetAddressTypes(self.address_type_ids) + + self.address_type_ids = [] + + def AddAddresses(self, per_site = 2): + """ + Add a number of random addresses to each site. + """ + + for site_id in self.site_ids: + for i in range(per_site): + address_fields = random_address() + address_id = self.api.AddSiteAddress(site_id, address_fields) + + # Should return a unique address_id + assert address_id not in self.address_ids + self.address_ids.append(address_id) + + # Add random address type + if self.address_type_ids: + for address_type_id in random.sample(self.address_type_ids, 1): + self.api.AddAddressTypeToAddress(address_type_id, address_id) + + if self.check: + # Check address + address = self.api.GetAddresses([address_id])[0] + for field in address_fields: + assert address[field] == address_fields[field] + + if self.verbose: + print "Added address", address_id, "to site", site_id + + def UpdateAddresses(self): + """ + Make random changes to any addresses we may have added. + """ + + for address_id in self.address_ids: + # Update address + address_fields = random_address() + self.api.UpdateAddress(address_id, address_fields) + + if self.check: + # Check address + address = self.api.GetAddresses([address_id])[0] + for field in address_fields: + assert address[field] == address_fields[field] + + if self.verbose: + print "Updated address", address_id + + def DeleteAddresses(self): + """ + Delete any random addresses we may have added. + """ + + for address_id in self.address_ids: + # Remove address types + address = self.api.GetAddresses([address_id])[0] + for address_type_id in address['address_type_ids']: + self.api.DeleteAddressTypeFromAddress(address_type_id, address_id) + + if self.check: + address = self.api.GetAddresses([address_id])[0] + assert not address['address_type_ids'] + + self.api.DeleteAddress(address_id) + + if self.check: + assert not self.api.GetAddresses([address_id]) + + if self.verbose: + print "Deleted address", address_id + + if self.check: + assert not self.api.GetAddresses(self.address_ids) + + self.address_ids = [] + + def AddPersons(self, per_site = 10): + """ + Add a number of random users to each site. + """ + + for site_id in self.site_ids: + for i in range(per_site): + # Add user + person_fields = random_person() + person_id = self.api.AddPerson(person_fields) + + # Should return a unique person_id + assert person_id not in self.person_ids + self.person_ids.append(person_id) + + if self.check: + # Check user + person = self.api.GetPersons([person_id])[0] + for field in person_fields: + if field != 'password': + assert person[field] == person_fields[field] + + auth = {'AuthMethod': "password", + 'Username': person_fields['email'], + 'AuthString': person_fields['password']} + + if self.check: + # Check that user is disabled + try: + assert not self.api.AuthCheck(auth) + except: + pass + + # Add random set of roles + role_ids = random.sample([20, 30, 40], randint(1, 3)) + for role_id in role_ids: + self.api.AddRoleToPerson(role_id, person_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert set(role_ids) == set(person['role_ids']) + + # Enable user + self.api.UpdatePerson(person_id, {'enabled': True}) + + if self.check: + # Check that user is enabled + assert self.api.AuthCheck(auth) + + # Associate user with site + self.api.AddPersonToSite(person_id, site_id) + self.api.SetPersonPrimarySite(person_id, site_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert person['site_ids'][0] == site_id + + if self.verbose: + print "Added user", person_id, "to site", site_id + + def UpdatePersons(self): + """ + Make random changes to any users we may have added. + """ + + for person_id in self.person_ids: + # Update user + person_fields = random_person() + # Keep them enabled + person_fields['enabled'] = True + self.api.UpdatePerson(person_id, person_fields) + + if self.check: + # Check user + person = self.api.GetPersons([person_id])[0] + for field in person_fields: + if field != 'password': + assert person[field] == person_fields[field] + + if self.verbose: + print "Updated person", person_id + + person = self.api.GetPersons([person_id])[0] + + # Associate user with a random set of sites + site_ids = random.sample(self.site_ids, randint(0, len(self.site_ids))) + for site_id in (set(site_ids) - set(person['site_ids'])): + self.api.AddPersonToSite(person_id, site_id) + for site_id in (set(person['site_ids']) - set(site_ids)): + self.api.DeletePersonFromSite(person_id, site_id) + + if site_ids: + self.api.SetPersonPrimarySite(person_id, site_ids[0]) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert set(site_ids) == set(person['site_ids']) + + if self.verbose: + print "Updated person", person_id, "to sites", site_ids + + def DeletePersons(self): + """ + Delete any random users we may have added. + """ + + for person_id in self.person_ids: + # Remove from site + person = self.api.GetPersons([person_id])[0] + for site_id in person['site_ids']: + self.api.DeletePersonFromSite(person_id, site_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert not person['site_ids'] + + # Revoke roles + for role_id in person['role_ids']: + self.api.DeleteRoleFromPerson(role_id, person_id) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert not person['role_ids'] + + # Disable account + self.api.UpdatePerson(person_id, {'enabled': False}) + + if self.check: + person = self.api.GetPersons([person_id])[0] + assert not person['enabled'] + + # Delete account + self.api.DeletePerson(person_id) + + if self.check: + assert not self.api.GetPersons([person_id]) + + if self.verbose: + print "Deleted user", person_id + + if self.check: + assert not self.api.GetPersons(self.person_ids) + + self.person_ids = [] + + def AddKeys(self, per_person = 2): + """ + Add a number of random keys to each user. + """ + + key_types = self.api.GetKeyTypes() + if not key_types: + raise Exception, "No key types" + + for person_id in self.person_ids: + for i in range(per_person): + # Add key + key_fields = random_key(key_types) + key_id = self.api.AddPersonKey(person_id, key_fields) + + # Should return a unique key_id + assert key_id not in self.key_ids + self.key_ids.append(key_id) + + if self.check: + # Check key + key = self.api.GetKeys([key_id])[0] + for field in key_fields: + assert key[field] == key_fields[field] + + # Add and immediately blacklist a key + key_fields = random_key(key_types) + key_id = self.api.AddPersonKey(person_id, key_fields) + + self.api.BlacklistKey(key_id) + + # Is effectively deleted + assert not self.api.GetKeys([key_id]) + + # Cannot be added again + try: + key_id = self.api.AddPersonKey(person_id, key_fields) + assert False + except Exception, e: + pass + + if self.verbose: + print "Added key", key_id, "to user", person_id + + def UpdateKeys(self): + """ + Make random changes to any keys we may have added. + """ + + key_types = self.api.GetKeyTypes() + if not key_types: + raise Exception, "No key types" + + for key_id in self.key_ids: + # Update key + key_fields = random_key(key_types) + self.api.UpdateKey(key_id, key_fields) + + if self.check: + # Check key + key = self.api.GetKeys([key_id])[0] + for field in key_fields: + assert key[field] == key_fields[field] + + if self.verbose: + print "Updated key", key_id + + def DeleteKeys(self): + """ + Delete any random keys we may have added. + """ + + for key_id in self.key_ids: + self.api.DeleteKey(key_id) + + if self.check: + assert not self.api.GetKeys([key_id]) + + if self.verbose: + print "Deleted key", key_id + + if self.check: + assert not self.api.GetKeys(self.key_ids) + + self.key_ids = [] + + def AddNodeGroups(self, n = 10): + """ + Add a number of random node groups. + """ + + for i in range(n): + # Add node group + nodegroup_fields = random_nodegroup() + nodegroup_id = self.api.AddNodeGroup(nodegroup_fields) + + # Should return a unique nodegroup_id + assert nodegroup_id not in self.nodegroup_ids + self.nodegroup_ids.append(nodegroup_id) + + if self.check: + # Check node group + nodegroup = self.api.GetNodeGroups([nodegroup_id])[0] + for field in nodegroup_fields: + assert nodegroup[field] == nodegroup_fields[field] + + if self.verbose: + print "Added node group", nodegroup_id + + def UpdateNodeGroups(self): + """ + Make random changes to any node groups we may have added. + """ + + for nodegroup_id in self.nodegroup_ids: + # Update nodegroup + nodegroup_fields = random_nodegroup() + self.api.UpdateNodeGroup(nodegroup_id, nodegroup_fields) + + if self.check: + # Check nodegroup + nodegroup = self.api.GetNodeGroups([nodegroup_id])[0] + for field in nodegroup_fields: + assert nodegroup[field] == nodegroup_fields[field] + + if self.verbose: + print "Updated node group", nodegroup_id + + def DeleteNodeGroups(self): + """ + Delete any random node groups we may have added. + """ + + for nodegroup_id in self.nodegroup_ids: + self.api.DeleteNodeGroup(nodegroup_id) + + if self.check: + assert not self.api.GetNodeGroups([nodegroup_id]) + + if self.verbose: + print "Deleted node group", nodegroup_id + + if self.check: + assert not self.api.GetNodeGroups(self.nodegroup_ids) + + self.nodegroup_ids = [] + + def AddNodes(self, per_site = 2): + """ + Add a number of random nodes to each site. Each node will also + be added to a random node group if AddNodeGroups() was + previously run. + """ + + boot_states = self.api.GetBootStates() + if not boot_states: + raise Exception, "No boot states" + + for site_id in self.site_ids: + for i in range(per_site): + # Add node + node_fields = random_node(boot_states) + node_id = self.api.AddNode(site_id, node_fields) + + # Should return a unique node_id + assert node_id not in self.node_ids + self.node_ids.append(node_id) + + # Add to a random set of node groups + nodegroup_ids = random.sample(self.nodegroup_ids, randint(0, len(self.nodegroup_ids))) + for nodegroup_id in nodegroup_ids: + self.api.AddNodeToNodeGroup(node_id, nodegroup_id) + + if self.check: + # Check node + node = self.api.GetNodes([node_id])[0] + for field in node_fields: + assert node[field] == node_fields[field] + + if self.verbose: + print "Added node", node_id + + def UpdateNodes(self): + """ + Make random changes to any nodes we may have added. + """ + + boot_states = self.api.GetBootStates() + if not boot_states: + raise Exception, "No boot states" + + for node_id in self.node_ids: + # Update node + node_fields = random_node(boot_states) + self.api.UpdateNode(node_id, node_fields) + + node = self.api.GetNodes([node_id])[0] + + # Add to a random set of node groups + nodegroup_ids = random.sample(self.nodegroup_ids, randint(0, len(self.nodegroup_ids))) + for nodegroup_id in (set(nodegroup_ids) - set(node['nodegroup_ids'])): + self.api.AddNodeToNodeGroup(node_id, nodegroup_id) + for nodegroup_id in (set(node['nodegroup_ids']) - set(nodegroup_ids)): + self.api.DeleteNodeFromNodeGroup(node_id, nodegroup_id) + + if self.check: + # Check node + node = self.api.GetNodes([node_id])[0] + for field in node_fields: + assert node[field] == node_fields[field] + assert set(nodegroup_ids) == set(node['nodegroup_ids']) + + if self.verbose: + print "Updated node", node_id + print "Added node", node_id, "to node groups", nodegroup_ids + + def DeleteNodes(self): + """ + Delete any random nodes we may have added. + """ + + for node_id in self.node_ids: + # Remove from node groups + node = self.api.GetNodes([node_id])[0] + for nodegroup_id in node['nodegroup_ids']: + self.api.DeleteNodeFromNodeGroup(node_id, nodegroup_id) + + if self.check: + node = self.api.GetNodes([node_id])[0] + assert not node['nodegroup_ids'] + + self.api.DeleteNode(node_id) + + if self.check: + assert not self.api.GetNodes([node_id]) + + if self.verbose: + print "Deleted node", node_id + + if self.check: + assert not self.api.GetNodes(self.node_ids) + + self.node_ids = [] + + def AddNodeNetworks(self, per_node = 1): + """ + Add a number of random network interfaces to each node. + """ + + network_methods = self.api.GetNetworkMethods() + if not network_methods: + raise Exception, "No network methods" + + network_types = self.api.GetNetworkTypes() + if not network_types: + raise Exception, "No network types" + + for node_id in self.node_ids: + for i in range(per_node): + method = random.sample(network_methods, 1)[0] + type = random.sample(network_types, 1)[0] + + # Add node network + nodenetwork_fields = random_nodenetwork(method, type) + nodenetwork_id = self.api.AddNodeNetwork(node_id, nodenetwork_fields) + + # Should return a unique nodenetwork_id + assert nodenetwork_id not in self.nodenetwork_ids + self.nodenetwork_ids.append(nodenetwork_id) + + if self.check: + # Check node network + nodenetwork = self.api.GetNodeNetworks([nodenetwork_id])[0] + for field in nodenetwork_fields: + assert nodenetwork[field] == nodenetwork_fields[field] + + if self.verbose: + print "Added node network", nodenetwork_id, "to node", node_id + + def UpdateNodeNetworks(self): + """ + Make random changes to any network interfaces we may have added. + """ + + network_methods = self.api.GetNetworkMethods() + if not network_methods: + raise Exception, "No network methods" + + network_types = self.api.GetNetworkTypes() + if not network_types: + raise Exception, "No network types" + + for nodenetwork_id in self.nodenetwork_ids: + method = random.sample(network_methods, 1)[0] + type = random.sample(network_types, 1)[0] + + # Update nodenetwork + nodenetwork_fields = random_nodenetwork(method, type) + self.api.UpdateNodeNetwork(nodenetwork_id, nodenetwork_fields) + + if self.check: + # Check nodenetwork + nodenetwork = self.api.GetNodeNetworks([nodenetwork_id])[0] + for field in nodenetwork_fields: + assert nodenetwork[field] == nodenetwork_fields[field] + + if self.verbose: + print "Updated node network", nodenetwork_id + + def DeleteNodeNetworks(self): + """ + Delete any random network interfaces we may have added. + """ + + for nodenetwork_id in self.nodenetwork_ids: + self.api.DeleteNodeNetwork(nodenetwork_id) + + if self.check: + assert not self.api.GetNodeNetworks([nodenetwork_id]) + + if self.verbose: + print "Deleted node network", nodenetwork_id + + if self.check: + assert not self.api.GetNodeNetworks(self.nodenetwork_ids) + + self.nodenetwork_ids = [] + + def AddPCUs(self, per_site = 1): + """ + Add a number of random PCUs to each site. Each node at the + site will be added to a port on the PCU if AddNodes() was + previously run. + """ + + for site_id in self.site_ids: + for i in range(per_site): + # Add PCU + pcu_fields = random_pcu() + pcu_id = self.api.AddPCU(site_id, pcu_fields) + + # Should return a unique pcu_id + assert pcu_id not in self.pcu_ids + self.pcu_ids.append(pcu_id) + + # Add each node at this site to a different port on this PCU + site = self.api.GetSites([site_id])[0] + port = randint(1, 10) + for node_id in site['node_ids']: + self.api.AddNodeToPCU(node_id, pcu_id, port) + port += 1 + + if self.check: + # Check PCU + pcu = self.api.GetPCUs([pcu_id])[0] + for field in pcu_fields: + assert pcu[field] == pcu_fields[field] + + if self.verbose: + print "Added PCU", pcu_id, "to site", site_id + + def UpdatePCUs(self): + """ + Make random changes to any PCUs we may have added. + """ + + for pcu_id in self.pcu_ids: + # Update PCU + pcu_fields = random_pcu() + self.api.UpdatePCU(pcu_id, pcu_fields) + + if self.check: + # Check PCU + pcu = self.api.GetPCUs([pcu_id])[0] + for field in pcu_fields: + assert pcu[field] == pcu_fields[field] + + if self.verbose: + print "Updated PCU", pcu_id + + def DeletePCUs(self): + """ + Delete any random nodes we may have added. + """ + + for pcu_id in self.pcu_ids: + # Remove nodes from PCU + pcu = self.api.GetPCUs([pcu_id])[0] + for node_id in pcu['node_ids']: + self.api.DeleteNodeFromPCU(node_id, pcu_id) + + if self.check: + pcu = self.api.GetPCUs([pcu_id])[0] + assert not pcu['node_ids'] + + self.api.DeletePCU(pcu_id) + + if self.check: + assert not self.api.GetPCUs([pcu_id]) + + if self.verbose: + print "Deleted PCU", pcu_id + + if self.check: + assert not self.api.GetPCUs(self.pcu_ids) + + self.pcu_ids = [] + + def AddConfFiles(self, n = 10): + """ + Add a number of random global configuration files. + """ + + conf_files = [] + + for i in range(n): + # Add a random configuration file + conf_files.append(random_conf_file()) + + if n: + # Add a nodegroup override file + nodegroup_conf_file = conf_files[0].copy() + nodegroup_conf_file['source'] = randpath(255) + conf_files.append(nodegroup_conf_file) + + # Add a node override file + node_conf_file = conf_files[0].copy() + node_conf_file['source'] = randpath(255) + conf_files.append(node_conf_file) + + for conf_file_fields in conf_files: + conf_file_id = self.api.AddConfFile(conf_file_fields) + + # Should return a unique conf_file_id + assert conf_file_id not in self.conf_file_ids + self.conf_file_ids.append(conf_file_id) + + # Add to nodegroup + if conf_file_fields == nodegroup_conf_file and self.nodegroup_ids: + nodegroup_id = random.sample(self.nodegroup_ids, 1)[0] + self.api.AddConfFileToNodeGroup(conf_file_id, nodegroup_id) + else: + nodegroup_id = None + + # Add to node + if conf_file_fields == node_conf_file and self.node_ids: + node_id = random.sample(self.node_ids, 1)[0] + self.api.AddConfFileToNode(conf_file_id, node_id) + else: + node_id = None + + if self.check: + # Check configuration file + conf_file = self.api.GetConfFiles([conf_file_id])[0] + for field in conf_file_fields: + assert conf_file[field] == conf_file_fields[field] + + if self.verbose: + print "Added configuration file", conf_file_id, + if nodegroup_id is not None: + print "to node group", nodegroup_id, + elif node_id is not None: + print "to node", node_id, + print + + def UpdateConfFiles(self): + """ + Make random changes to any configuration files we may have added. + """ + + for conf_file_id in self.conf_file_ids: + # Update configuration file + conf_file_fields = random_conf_file() + # Do not update dest so that it remains an override if set + if 'dest' in conf_file_fields: + del conf_file_fields['dest'] + self.api.UpdateConfFile(conf_file_id, conf_file_fields) + + if self.check: + # Check configuration file + conf_file = self.api.GetConfFiles([conf_file_id])[0] + for field in conf_file_fields: + assert conf_file[field] == conf_file_fields[field] + + if self.verbose: + print "Updated configuration file", conf_file_id + + def DeleteConfFiles(self): + """ + Delete any random configuration files we may have added. + """ + + for conf_file_id in self.conf_file_ids: + self.api.DeleteConfFile(conf_file_id) + + if self.check: + assert not self.api.GetConfFiles([conf_file_id]) + + if self.verbose: + print "Deleted configuration file", conf_file_id + + if self.check: + assert not self.api.GetConfFiles(self.conf_file_ids) + + self.conf_file_ids = [] + + def AddSliceAttributeTypes(self, n = 10): + """ + Add a number of random slice attribute types. + """ + + roles = self.api.GetRoles() + if not roles: + raise Exception, "No roles" + role_ids = [role['role_id'] for role in roles] + + for i in range(n): + attribute_type_fields = random_attribute_type(role_ids) + attribute_type_id = self.api.AddSliceAttributeType(attribute_type_fields) + + # Should return a unique attribute_type_id + assert attribute_type_id not in self.attribute_type_ids + self.attribute_type_ids.append(attribute_type_id) + + if self.check: + # Check slice attribute type + attribute_type = self.api.GetSliceAttributeTypes([attribute_type_id])[0] + for field in attribute_type_fields: + assert attribute_type[field] == attribute_type_fields[field] + + if self.verbose: + print "Added slice attribute type", attribute_type_id + + def UpdateSliceAttributeTypes(self): + """ + Make random changes to any slice attribute types we may have added. + """ + + roles = self.api.GetRoles() + if not roles: + raise Exception, "No roles" + role_ids = [role['role_id'] for role in roles] + + for attribute_type_id in self.attribute_type_ids: + # Update slice attribute type + attribute_type_fields = random_attribute_type(role_ids) + self.api.UpdateSliceAttributeType(attribute_type_id, attribute_type_fields) + + if self.check: + # Check slice attribute type + attribute_type = self.api.GetSliceAttributeTypes([attribute_type_id])[0] + for field in attribute_type_fields: + assert attribute_type[field] == attribute_type_fields[field] + + if self.verbose: + print "Updated slice attribute type", attribute_type_id + + def DeleteSliceAttributeTypes(self): + """ + Delete any random slice attribute types we may have added. + """ + + for attribute_type_id in self.attribute_type_ids: + self.api.DeleteSliceAttributeType(attribute_type_id) + + if self.check: + assert not self.api.GetSliceAttributeTypes([attribute_type_id]) + + if self.verbose: + print "Deleted slice attribute type", attribute_type_id + + if self.check: + assert not self.api.GetSliceAttributeTypes(self.attribute_type_ids) + + self.attribute_type_ids = [] + + def AddSlices(self, per_site = 10): + """ + Add a number of random slices per site. + """ + + for site in self.api.GetSites(self.site_ids): + for i in range(min(per_site, site['max_slices'])): + # Add slice + slice_fields = random_slice(site['login_base']) + slice_id = self.api.AddSlice(slice_fields) + + # Should return a unique slice_id + assert slice_id not in self.slice_ids + self.slice_ids.append(slice_id) + + # Add slice to a random set of nodes + node_ids = random.sample(self.node_ids, randint(0, len(self.node_ids))) + if node_ids: + self.api.AddSliceToNodes(slice_id, node_ids) + + # Add random set of site users to slice + person_ids = random.sample(site['person_ids'], randint(0, len(site['person_ids']))) + for person_id in person_ids: + self.api.AddPersonToSlice(person_id, slice_id) + + if self.check: + # Check slice + slice = self.api.GetSlices([slice_id])[0] + for field in slice_fields: + assert slice[field] == slice_fields[field] + + assert set(node_ids) == set(slice['node_ids']) + assert set(person_ids) == set(slice['person_ids']) + + if self.verbose: + print "Added slice", slice_id, "to site", site['site_id'], + if node_ids: + print "and nodes", node_ids, + print + if person_ids: + print "Added users", site['person_ids'], "to slice", slice_id + + def UpdateSlices(self): + """ + Make random changes to any slices we may have added. + """ + + for slice_id in self.slice_ids: + # Update slice + slice_fields = random_slice("unused") + # Cannot change slice name + if 'name' in slice_fields: + del slice_fields['name'] + self.api.UpdateSlice(slice_id, slice_fields) + + slice = self.api.GetSlices([slice_id])[0] + + # Add slice to a random set of nodes + node_ids = random.sample(self.node_ids, randint(0, len(self.node_ids))) + self.api.AddSliceToNodes(slice_id, list(set(node_ids) - set(slice['node_ids']))) + self.api.DeleteSliceFromNodes(slice_id, list(set(slice['node_ids']) - set(node_ids))) + + # Add random set of users to slice + person_ids = random.sample(self.person_ids, randint(0, len(self.person_ids))) + for person_id in (set(person_ids) - set(slice['person_ids'])): + self.api.AddPersonToSlice(person_id, slice_id) + for person_id in (set(slice['person_ids']) - set(person_ids)): + self.api.DeletePersonFromSlice(person_id, slice_id) + + if self.check: + slice = self.api.GetSlices([slice_id])[0] + for field in slice_fields: + assert slice[field] == slice_fields[field] + assert set(node_ids) == set(slice['node_ids']) + assert set(person_ids) == set(slice['person_ids']) + + if self.verbose: + print "Updated slice", slice_id + print "Added nodes", node_ids, "to slice", slice_id + print "Added persons", person_ids, "to slice", slice_id + + def DeleteSlices(self): + """ + Delete any random slices we may have added. + """ + + for slice_id in self.slice_ids: + self.api.DeleteSlice(slice_id) + + if self.check: + assert not self.api.GetSlices([slice_id]) + + if self.verbose: + print "Deleted slice", slice_id + + if self.check: + assert not self.api.GetSlices(self.slice_ids) + + self.slice_ids = [] + + def AddSliceAttributes(self, per_slice = 2): + """ + Add a number of random slices per site. + """ + + if not self.attribute_type_ids: + return + + for slice_id in self.slice_ids: + slice = self.api.GetSlices([slice_id])[0] + + for i in range(per_slice): + # Set a random slice/sliver attribute + for attribute_type_id in random.sample(self.attribute_type_ids, 1): + value = randstr(16, letters + '_' + digits) + # Make it a sliver attribute with 50% probability + if slice['node_ids']: + node_id = random.sample(slice['node_ids'] + [None] * len(slice['node_ids']), 1)[0] + else: + node_id = None + + # Add slice attribute + if node_id is None: + slice_attribute_id = self.api.AddSliceAttribute(slice_id, attribute_type_id, value) + else: + slice_attribute_id = self.api.AddSliceAttribute(slice_id, attribute_type_id, value, node_id) + + # Should return a unique slice_attribute_id + assert slice_attribute_id not in self.slice_attribute_ids + self.slice_attribute_ids.append(slice_attribute_id) + + if self.check: + # Check slice attribute + slice_attribute = self.api.GetSliceAttributes([slice_attribute_id])[0] + for field in 'attribute_type_id', 'slice_id', 'node_id', 'slice_attribute_id', 'value': + assert slice_attribute[field] == locals()[field] + + if self.verbose: + print "Added slice attribute", slice_attribute_id, "of type", attribute_type_id, + if node_id is not None: + print "to node", node_id, + print + + def UpdateSliceAttributes(self): + """ + Make random changes to any slice attributes we may have added. + """ + + for slice_attribute_id in self.slice_attribute_ids: + # Update slice attribute + value = randstr(16, letters + '_' + digits) + self.api.UpdateSliceAttribute(slice_attribute_id, value) + + # Check slice attribute again + slice_attribute = self.api.GetSliceAttributes([slice_attribute_id])[0] + assert slice_attribute['value'] == value + + if self.verbose: + print "Updated slice attribute", slice_attribute_id + + def DeleteSliceAttributes(self): + """ + Delete any random slice attributes we may have added. + """ + + for slice_attribute_id in self.slice_attribute_ids: + self.api.DeleteSliceAttribute(slice_attribute_id) + + if self.check: + assert not self.api.GetSliceAttributes([slice_attribute_id]) + + if self.verbose: + print "Deleted slice attribute", slice_attribute_id + + if self.check: + assert not self.api.GetSliceAttributes(self.slice_attribute_ids) + + self.slice_attribute_ids = [] + +def main(): + parser = OptionParser() + parser.add_option("-c", "--check", action = "store_true", default = False, help = "Check most actions (default: %default)") + parser.add_option("-q", "--quiet", action = "store_true", default = False, help = "Be quiet (default: %default)") + parser.add_option("-t", "--tiny", action = "store_true", default = False, help = "Run a tiny test (default: %default)") + (options, args) = parser.parse_args() + + test = Test(api = Shell(), + check = options.check, + verbose = not options.quiet) + + if options.tiny: + params = Test.tiny + else: + params = Test.default + + test.Run(**params) + +if __name__ == "__main__": + main() diff --git a/trunk/PLC/__init__.py b/trunk/PLC/__init__.py new file mode 100644 index 0000000..d5ddda8 --- /dev/null +++ b/trunk/PLC/__init__.py @@ -0,0 +1,48 @@ +all = """ +Addresses +AddressTypes +API +Auth +Boot +BootStates +ConfFiles +Config +Debug +EventObjects +Events +Faults +Filter +GPG +InitScripts +Keys +KeyTypes +Messages +Method +NetworkMethods +NetworkTypes +NodeGroups +NodeNetworkSettings +NodeNetworkSettingTypes +NodeNetworks +Nodes +Parameter +PCUProtocolTypes +PCUs +PCUTypes +Peers +Persons +POD +PostgreSQL +PyCurl +Roles +sendmail +Sessions +Shell +Sites +SliceAttributes +SliceAttributeTypes +SliceInstantiations +Slices +Table +Test +""".split() diff --git a/trunk/PLC/sendmail.py b/trunk/PLC/sendmail.py new file mode 100644 index 0000000..cab0ae6 --- /dev/null +++ b/trunk/PLC/sendmail.py @@ -0,0 +1,98 @@ +import os +import sys +import pprint +from types import StringTypes +from email.MIMEText import MIMEText +from email.Header import Header +from smtplib import SMTP + +from PLC.Debug import log +from PLC.Faults import * + +def sendmail(api, To, Subject, Body, From = None, Cc = None, Bcc = None): + """ + Uses sendmail (must be installed and running locally) to send a + message to the specified recipients. If the API is running under + mod_python, the apache user must be listed in e.g., + /etc/mail/trusted-users. + + To, Cc, and Bcc may be addresses or lists of addresses. Each + address may be either a plain text address or a tuple of (name, + address). + """ + + # Fix up defaults + if not isinstance(To, list): + To = [To] + if Cc is not None and not isinstance(Cc, list): + Cc = [Cc] + if Bcc is not None and not isinstance(Bcc, list): + Bcc = [Bcc] + if From is None: + From = ("%s Support" % api.config.PLC_NAME, + api.config.PLC_MAIL_SUPPORT_ADDRESS) + + # Create a MIME-encoded UTF-8 message + msg = MIMEText(Body.encode(api.encoding), _charset = api.encoding) + + # Unicode subject headers are automatically encoded correctly + msg['Subject'] = Subject + + def encode_addresses(addresses, header_name = None): + """ + Unicode address headers are automatically encoded by + email.Header, but not correctly. The correct way is to put the + textual name inside quotes and the address inside brackets: + + To: "=?utf-8?b?encoded" + + Each address in addrs may be a tuple of (name, address) or + just an address. Returns a tuple of (header, addrlist) + representing the encoded header text and the list of plain + text addresses. + """ + + header = [] + addrs = [] + + for addr in addresses: + if isinstance(addr, tuple): + (name, addr) = addr + try: + name = name.encode('ascii') + header.append('%s <%s>' % (name, addr)) + except: + h = Header(name, charset = api.encoding, header_name = header_name) + header.append('"%s" <%s>' % (h.encode(), addr)) + else: + header.append(addr) + addrs.append(addr) + + return (", ".join(header), addrs) + + (msg['From'], from_addrs) = encode_addresses([From], 'From') + (msg['To'], to_addrs) = encode_addresses(To, 'To') + + if Cc is not None: + (msg['Cc'], cc_addrs) = encode_addresses(Cc, 'Cc') + to_addrs += cc_addrs + + if Bcc is not None: + (unused, bcc_addrs) = encode_addresses(Bcc, 'Bcc') + to_addrs += bcc_addrs + + # Needed to pass some spam filters + msg['Reply-To'] = msg['From'] + msg['X-Mailer'] = "Python/" + sys.version.split(" ")[0] + + if not api.config.PLC_MAIL_ENABLED: + print >> log, "From: %(From)s, To: %(To)s, Subject: %(Subject)s" % msg + return + + s = SMTP() + s.connect() + rejected = s.sendmail(from_addrs[0], to_addrs, msg.as_string(), rcpt_options = ["NOTIFY=NEVER"]) + s.close() + + if rejected: + raise PLCAPIError, "Error sending message to " + ", ".join(rejected.keys()) diff --git a/trunk/PLCAPI.spec b/trunk/PLCAPI.spec new file mode 100644 index 0000000..02ab40b --- /dev/null +++ b/trunk/PLCAPI.spec @@ -0,0 +1,102 @@ +# +# $Id$ +# + +%define url $URL$ + +%define name PLCAPI +%define version 4.2 +%define subversion 0 + +%define release %{subversion}%{?pldistro:.%{pldistro}}%{?date:.%{date}} + +Summary: PlanetLab Central API +Name: %{name} +Version: %{version} +Release: %{release} +License: PlanetLab +Group: System Environment/Daemons +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root +URL: %(echo %{url} | cut -d ' ' -f 2) + +Obsoletes: plcapilib + +# We use set everywhere +Requires: python >= 2.4 + +# We use psycopg2 +BuildRequires: postgresql-devel + +# Standard xmlrpc.so that ships with PHP does not marshal NULL +BuildRequires: php-devel +Obsoletes: php-xmlrpc +Provides: php-xmlrpc + +# OpenJade does not honor XML catalog files and tries to access +# www.oasis-open.org even if DTDs are locally installed. Disable +# documentation generation for now. +# BuildRequires: docbook-dtds, docbook-utils-pdf + +# PostgreSQL and SOAPpy are necessary to run the API server, but not +# plcsh. Since the only supported method of running the server is via +# MyPLC anyway, don't be so stringent about binary requirements, in +# case people want to install this package just for plcsh. +# Requires: postgresql-server, SOAPpy +AutoReqProv: no + +%description +The PLCAPI package provides an XML-RPC and SOAP API for accessing the +PlanetLab Central (PLC) database. The API may be accessed directly via +the Python shell program plcsh, through a toy standalone server, or +through Apache mod_python. + +%prep +%setup -q + +%build +# Build __init__.py metafiles and PHP API. +%{__make} %{?_smp_mflags} subdirs="php php/xmlrpc" +# Build documentation +# beware that making the pdf file somehow overwrites the html +%{__make} -C doc PLCAPI.pdf +rm -f doc/PLCAPI.html +%{__make} -C doc PLCAPI.html + +%install +rm -rf $RPM_BUILD_ROOT +%{__make} %{?_smp_mflags} install DESTDIR="$RPM_BUILD_ROOT" datadir="%{_datadir}" bindir="%{_bindir}" +#someone out there skips doc installation - we DO want this installed +for doc in PLCAPI.html PLCAPI.pdf ; do + install -D -m 644 doc/$doc $RPM_BUILD_ROOT/"%{_datadir}"/plc_api/doc/$doc +done + +# Install shell symlink +mkdir -p $RPM_BUILD_ROOT/%{_bindir} +ln -s %{_datadir}/plc_api/plcsh $RPM_BUILD_ROOT/%{_bindir}/plcsh + +mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/php.d +cat > $RPM_BUILD_ROOT/%{_sysconfdir}/php.d/xmlrpc.ini < - +- Initial build. diff --git a/trunk/Server.py b/trunk/Server.py new file mode 100755 index 0000000..40a68ab --- /dev/null +++ b/trunk/Server.py @@ -0,0 +1,105 @@ +#!/usr/bin/python +# +# Simple standalone HTTP server for testing PLCAPI +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import os +import sys +import getopt +import traceback +import BaseHTTPServer + +# Append PLC to the system path +sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0]))) + +from PLC.API import PLCAPI + +class PLCAPIRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): + """ + Simple standalone HTTP request handler for testing PLCAPI. + """ + + def do_POST(self): + try: + # Read request + request = self.rfile.read(int(self.headers["Content-length"])) + + # Handle request + response = self.server.api.handle(self.client_address, request) + + # Write response + self.send_response(200) + self.send_header("Content-type", "text/xml") + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + + self.wfile.flush() + self.connection.shutdown(1) + + except Exception, e: + # Log error + sys.stderr.write(traceback.format_exc()) + sys.stderr.flush() + + def do_GET(self): + self.send_response(200) + self.send_header("Content-type", 'text/html') + self.end_headers() + self.wfile.write(""" + +PLCAPI XML-RPC/SOAP Interface + +

PLCAPI XML-RPC/SOAP Interface

+

Please use XML-RPC or SOAP to access the PLCAPI.

+ +""") + +class PLCAPIServer(BaseHTTPServer.HTTPServer): + """ + Simple standalone HTTP server for testing PLCAPI. + """ + + def __init__(self, addr, config): + self.api = PLCAPI(config) + self.allow_reuse_address = 1 + BaseHTTPServer.HTTPServer.__init__(self, addr, PLCAPIRequestHandler) + +# Defaults +addr = "0.0.0.0" +port = 8000 +config = "/etc/planetlab/plc_config" + +def usage(): + print "Usage: %s [OPTION]..." % sys.argv[0] + print "Options:" + print " -p PORT, --port=PORT TCP port number to listen on (default: %d)" % port + print " -f FILE, --config=FILE PLC configuration file (default: %s)" % config + print " -h, --help This message" + sys.exit(1) + +# Get options +try: + (opts, argv) = getopt.getopt(sys.argv[1:], "p:f:h", ["port=", "config=", "help"]) +except getopt.GetoptError, err: + print "Error: " + err.msg + usage() + +for (opt, optval) in opts: + if opt == "-p" or opt == "--port": + try: + port = int(optval) + except ValueError: + usage() + elif opt == "-f" or opt == "--config": + config = optval + elif opt == "-h" or opt == "--help": + usage() + +# Start server +PLCAPIServer((addr, port), config).serve_forever() diff --git a/trunk/TODO b/trunk/TODO new file mode 100644 index 0000000..95ccdec --- /dev/null +++ b/trunk/TODO @@ -0,0 +1,31 @@ +* Event logging + * In the current API, every call is logged and certain interesting + events are logged in the events table. I haven't implemented event + logging yet in the new API. + +* Tests + * With Shell.py, it should be easy to write a large set of tests. I've + thought about writing a SQLite DB backend so that MyPLC/PostgreSQL + doesn't have to be setup in order for the tests to be run. But there + are some technical limitations to SQLite. It would probably be best + to run the testsuite against MyPLC for now. + +* Authentication + * Need to implement node and certificate/federation authentication. + * Need to (re)implement "capability" (i.e. trusted host) + authentication. Maybe implement it in the same way as node + authentication. + +* Anonymous functions + * Implement anonymous functions for now for backward compatibility, + but get rid of them as soon as possible + +* Hierarchical layout + * Probably need to organize the functions inside PLC/Methods/ + +* Deletion + * Need to come up with a sane, consistent principal deletion policy. + +* Validation + * Need to come up with a policy (truncation? fault?) for dealing with + variable length strings. diff --git a/trunk/Test.py b/trunk/Test.py new file mode 100755 index 0000000..8ff3ad2 --- /dev/null +++ b/trunk/Test.py @@ -0,0 +1,281 @@ +#!/usr/bin/python +# +# Test script for peer caching +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +""" +Test script for peer caching. Intended for testing multiple PLCs +running on the same machine in different chroots. Here is how I set +things up after installing and configuring MyPLC: + +# Shut down MyPLC +service plc stop + +# Copy to /plc2 +cp -ra /plc /plc2 +ln -sf plc /etc/init.d/plc2 +echo 'PLC_ROOT=/plc2/root' > /etc/sysconfig/plc2 +echo 'PLC_DATA=/plc2/data' >> /etc/sysconfig/plc2 + +# Edit /plc2/data/etc/planetlab/plc_config.xml and change at least the +# following so that they do not conflict with the defaults: +# +# PLC_NAME (e.g., PlanetLab Two) +# PLC_SLICE_PREFIX (e.g., two) +# PLC_ROOT_USER (e.g., root@planetlab.two) +# PLC_API_MAINTENANCE_USER (e.g., maint@planetlab.two) +# PLC_DB_PORT (e.g., 5433) +# PLC_WWW_PORT (e.g., 81) +# PLC_WWW_SSL_PORT (e.g., 444) +# PLC_API_PORT (must be the same as PLC_WWW_SSL_PORT, e.g., 444) +# PLC_BOOT_SSL_PORT (must be the same as PLC_WWW_SSL_PORT, e.g., 444) +# PLC_BOOT_PORT (may be the same as PLC_WWW_PORT, e.g., 81) + +# Start up both MyPLC instances +service plc start +service plc2 start + +# Run test +./Test.py -f /etc/planetlab/plc_config -f /plc2/data/etc/planetlab/plc_config + +# If the test fails and your databases are corrupt and/or you want to +# start over, you can always just blow the databases away. +service plc stop +rm -rf /plc/data/var/lib/pgsql/data +service plc start + +service plc2 stop +rm -rf /plc2/data/var/lib/pgsql/data +service plc2 start +""" + +import re +from optparse import OptionParser + +from PLC.Config import Config +from PLC.GPG import gpg_export +from PLC.Shell import Shell +from PLC.Test import Test + +def todict(list_of_dicts, key): + """ + Turn a list of dicts into a dict keyed on key. + """ + + return dict([(d[key], d) for d in list_of_dicts]) + +def RefreshPeers(plcs): + """ + Refresh each peer with each other. + """ + + for plc in plcs: + for peer in plcs: + if peer == plc: + continue + + print plc.config.PLC_NAME, "refreshing", peer.config.PLC_NAME + plc.RefreshPeer(peer.config.PLC_NAME) + + peer_id = plc.GetPeers([peer.config.PLC_NAME])[0]['peer_id'] + + peer_sites = todict(plc.GetSites({'peer_id': peer_id}), 'site_id') + sites_at_peer = todict(peer.GetSites(), 'site_id') + + peer_keys = todict(plc.GetKeys({'peer_id': peer_id}), 'key_id') + keys_at_peer = todict(peer.GetKeys(), 'key_id') + + peer_persons = todict(plc.GetPersons({'peer_id': peer_id}), 'person_id') + persons_at_peer = todict(peer.GetPersons(), 'person_id') + + peer_nodes = todict(plc.GetNodes({'peer_id': peer_id}), 'node_id') + nodes_at_peer = todict(peer.GetNodes(), 'node_id') + + our_nodes = todict(plc.GetNodes({'peer_id': None}), 'node_id') + our_peer_id_at_peer = peer.GetPeers([plc.config.PLC_NAME])[0]['peer_id'] + our_nodes_at_peer = todict(peer.GetNodes({'peer_id': our_peer_id_at_peer, + 'peer_node_id': our_nodes.keys()}), 'peer_node_id') + + peer_slices = todict(plc.GetSlices({'peer_id': peer_id}), 'peer_slice_id') + slices_at_peer = todict(peer.GetSlices(), 'slice_id') + + for site_id, site in peer_sites.iteritems(): + # Verify that this site exists at the peer + peer_site_id = site['peer_site_id'] + assert peer_site_id in sites_at_peer + peer_site = sites_at_peer[peer_site_id] + + # And is the same + for field in ['name', 'abbreviated_name', 'login_base', 'is_public', + 'latitude', 'longitude', 'url', + 'max_slices', 'max_slivers',]: + assert site[field] == peer_site[field] + + for key_id, key in peer_keys.iteritems(): + # Verify that this key exists at the peer + peer_key_id = key['peer_key_id'] + assert peer_key_id in keys_at_peer + peer_key = keys_at_peer[peer_key_id] + + # And is the same + for field in ['key_type', 'key']: + assert key[field] == peer_key[field] + + for person_id, person in peer_persons.iteritems(): + # Verify that this user exists at the peer + peer_person_id = person['peer_person_id'] + assert peer_person_id in persons_at_peer + peer_person = persons_at_peer[peer_person_id] + + # And is the same + for field in ['first_name', 'last_name', 'title', 'email', 'phone', + 'url', 'bio', 'enabled']: + assert person[field] == peer_person[field] + + for key_id in person['key_ids']: + # Verify that the user is not associated with any local keys + assert key_id in peer_keys + key = peer_keys[key_id] + peer_key_id = key['peer_key_id'] + + # Verify that this key exists at the peer + assert peer_key_id in keys_at_peer + peer_key = keys_at_peer[peer_key_id] + + # And is related to the same user at the peer + assert peer_key['key_id'] in peer_person['key_ids'] + + for node_id, node in peer_nodes.iteritems(): + # Verify that this node exists at the peer + peer_node_id = node['peer_node_id'] + assert peer_node_id in nodes_at_peer + peer_node = nodes_at_peer[peer_node_id] + + # And is the same + for field in ['boot_state', 'ssh_rsa_key', 'hostname', + 'version', 'model']: + assert node[field] == peer_node[field] + + # Verify that the node is not associated with any local sites + assert node['site_id'] in peer_sites + site = peer_sites[node['site_id']] + + # Verify that this site exists at the peer + peer_site_id = site['peer_site_id'] + assert peer_site_id in sites_at_peer + peer_site = sites_at_peer[peer_site_id] + + # And is related to the same node at the peer + assert peer_site['site_id'] == peer_node['site_id'] + + for slice_id, slice in peer_slices.iteritems(): + # Verify that this slice exists at the peer + peer_slice_id = slice['peer_slice_id'] + assert peer_slice_id in slices_at_peer + peer_slice = slices_at_peer[peer_slice_id] + + # And is the same + for field in ['name', 'instantiation', 'url', 'description', + 'max_nodes', 'expires']: + assert slice[field] == peer_slice[field] + + for node_id in slice['node_ids']: + # Verify that the slice is associated only with + # the peer's own nodes, or with our nodes as + # last cached by the peer. + assert node_id in peer_nodes or node_id in our_nodes_at_peer + if node_id in peer_nodes: + node = peer_nodes[node_id] + peer_node_id = node['peer_node_id'] + elif node_id in our_nodes_at_peer: + peer_node = our_nodes_at_peer[node_id] + peer_node_id = peer_node['node_id'] + + # Verify that this node exists at the peer + assert peer_node_id in nodes_at_peer + + # And is related to the same slice at the peer + assert peer_node_id in peer_slice['node_ids'] + +def TestPeers(plcs, check = True, verbose = True, tiny = False): + # Register each peer with each other + for plc in plcs: + for peer in plcs: + if peer == plc: + continue + + key = gpg_export(peer.chroot + peer.config.PLC_ROOT_GPG_KEY_PUB) + cacert = file(peer.chroot + peer.config.PLC_API_CA_SSL_CRT).read() + + if plc.GetPeers([peer.config.PLC_NAME]): + print plc.config.PLC_NAME, "updating peer", peer.config.PLC_NAME + plc.UpdatePeer(peer.config.PLC_NAME, + {'peer_url': peer.url, 'key': key, 'cacert': cacert}) + else: + print plc.config.PLC_NAME, "adding peer", peer.config.PLC_NAME + plc.AddPeer({'peername': peer.config.PLC_NAME, + 'peer_url': peer.url, 'key': key, 'cacert': cacert}) + + # Populate the DB + plc.test = Test(api = plc, check = check, verbose = verbose) + + if tiny: + params = Test.tiny + else: + params = Test.default + + print "Populating", plc.config.PLC_NAME + plc.test.Add(**params) + + # Refresh each other + RefreshPeers(plcs) + + # Change some things + for plc in plcs: + print "Updating", plc.config.PLC_NAME + plc.test.Update() + + # Refresh each other again + RefreshPeers(plcs) + +def main(): + parser = OptionParser() + parser.add_option("-f", "--config", dest = "configs", action = "append", default = [], help = "Configuration file (default: %default)") + parser.add_option("-c", "--check", action = "store_true", default = False, help = "Verify actions (default: %default)") + parser.add_option("-q", "--quiet", action = "store_true", default = False, help = "Be quiet (default: %default)") + parser.add_option("-t", "--tiny", action = "store_true", default = False, help = "Run a tiny test (default: %default)") + (options, args) = parser.parse_args() + + # Test single peer by default + if not options.configs: + options.configs = ["/etc/planetlab/plc_config"] + + plcs = [] + for path in options.configs: + # Load configuration file + config = Config(path) + + # Determine path to chroot + m = re.match(r'(.*)/etc/planetlab', path) + if m is not None: + chroot = m.group(1) + else: + chroot = "" + + # Fix up path to SSL certificate + cacert = chroot + config.PLC_API_CA_SSL_CRT + + # Always connect with XML-RPC + plc = Shell(config = path, cacert = cacert, xmlrpc = True) + plc.chroot = chroot + plcs.append(plc) + + TestPeers(plcs, check = options.check, verbose = not options.quiet, tiny = options.tiny) + +if __name__ == "__main__": + main() diff --git a/trunk/doc/.cvsignore b/trunk/doc/.cvsignore new file mode 100644 index 0000000..6cf3622 --- /dev/null +++ b/trunk/doc/.cvsignore @@ -0,0 +1,9 @@ +*.dvi +*.man +*.ps +*.rtf +*.tex +*.texi +*.txt +*.xml.valid +Methods.xml diff --git a/trunk/doc/DocBook.py b/trunk/doc/DocBook.py new file mode 100755 index 0000000..3434ce5 --- /dev/null +++ b/trunk/doc/DocBook.py @@ -0,0 +1,199 @@ +#!/usr/bin/python +# +# Generates a DocBook section documenting all PLCAPI methods on +# stdout. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import xml.dom.minidom +from xml.dom.minidom import Element, Text +import codecs + +from PLC.Method import * +import DocBookLocal +import groups + +# xml.dom.minidom.Text.writexml adds surrounding whitespace to textual +# data when pretty-printing. Override this behavior. +class TrimText(Text): + """text""" + def __init__(self, text = None): + self.data = unicode(text) + + def writexml(self, writer, indent="", addindent="", newl=""): + Text.writexml(self, writer, "", "", "") + +class TrimTextElement(Element): + """text""" + def __init__(self, tagName, text = None): + Element.__init__(self, tagName) + if text is not None: + self.appendChild(TrimText(text)) + + def writexml(self, writer, indent="", addindent="", newl=""): + writer.write(indent) + Element.writexml(self, writer, "", "", "") + writer.write(newl) + +class simpleElement(TrimTextElement): pass + +class paraElement(simpleElement): + """text""" + def __init__(self, text = None): + simpleElement.__init__(self, 'para', text) + +class blockquoteElement(Element): + """
text......text
""" + def __init__(self, text = None): + Element.__init__(self, 'blockquote') + if text is not None: + # Split on blank lines + lines = [line.strip() for line in text.strip().split("\n")] + lines = "\n".join(lines) + paragraphs = lines.split("\n\n") + + for paragraph in paragraphs: + self.appendChild(paraElement(paragraph)) + +def param_type(param): + """Return the XML-RPC type of a parameter.""" + if isinstance(param, Mixed) and len(param): + subtypes = [param_type(subparam) for subparam in param] + return " or ".join(subtypes) + elif isinstance(param, (list, tuple, set)) and len(param): + return "array of " + " or ".join([param_type(subparam) for subparam in param]) + else: + return xmlrpc_type(python_type(param)) + +class paramElement(Element): + """An optionally named parameter.""" + def __init__(self, name, param): + # + Element.__init__(self, 'listitem') + + description = Element('para') + + if name: + description.appendChild(simpleElement('parameter', name)) + description.appendChild(TrimText(": ")) + + description.appendChild(TrimText(param_type(param))) + + if isinstance(param, (list, tuple, set)) and len(param) == 1: + param = param[0] + + if isinstance(param, Parameter): + description.appendChild(TrimText(", " + param.doc)) + param = param.type + + self.appendChild(description) + + if isinstance(param, dict): + itemizedlist = Element('itemizedlist') + self.appendChild(itemizedlist) + for name, subparam in param.iteritems(): + itemizedlist.appendChild(paramElement(name, subparam)) + + elif isinstance(param, (list, tuple, set)) and len(param): + itemizedlist = Element('itemizedlist') + self.appendChild(itemizedlist) + for subparam in param: + itemizedlist.appendChild(paramElement(None, subparam)) + + +def get_method_doc(func): + + method = func.name + + if func.status == "deprecated": + return + + (min_args, max_args, defaults) = func.args() + + section = Element('section') + section.setAttribute('id', func.name) + section.appendChild(simpleElement('title', func.name)) + + prototype = "%s (%s)" % (method, ", ".join(max_args)) + para = paraElement('Prototype:') + para.appendChild(blockquoteElement(prototype)) + section.appendChild(para) + + para = paraElement('Description:') + para.appendChild(blockquoteElement(func.__doc__)) + section.appendChild(para) + + para = paraElement('Allowed Roles:') + para.appendChild(blockquoteElement(", ".join(func.roles))) + section.appendChild(para) + + section.appendChild(paraElement('Parameters:')) + params = Element('itemizedlist') + if func.accepts: + for name, param, default in zip(max_args, func.accepts, defaults): + params.appendChild(paramElement(name, param)) + else: + listitem = Element('listitem') + listitem.appendChild(paraElement('None')) + params.appendChild(listitem) + section.appendChild(params) + + section.appendChild(paraElement('Returns:')) + returns = Element('itemizedlist') + returns.appendChild(paramElement(None, func.returns)) + section.appendChild(returns) + + #print section.toprettyxml(encoding = "UTF-8") + return section + + +def get_section(fields, field_list = None): + if not field_list: + field_list = fields.keys() + field_list.sort() + + for field in field_list: + value = fields[field] + section = Element('section') + section.setAttribute('id', field.title()) + section.appendChild(simpleElement('title', field.title())) + # if list of methods, append method docs + # else if dict, make a new section group + if isinstance(value, dict): + section.appendChild(get_section(value)) + elif isinstance(value, list): + methods = DocBookLocal.get_func_list(value) + for method in methods: + method_doc = get_method_doc(method) + section.appendChild(method_doc) + + return section + +# write full list of methods to Methods.xml +#api_func_list = DocBookLocal.get_func_list() +#methods_xml = file('Methods.xml', 'w') +#for func in api_func_list: +# section = get_method_doc(func) +# if section: +# methods_xml.write(section) +#methods_xml.close() + +# write methods grouped into interfaces +interfaces = ['Registry_Interface', 'Management_Interface', 'Slice_Interface'] +for interface in interfaces: + interface_file = file(interface+'.xml', 'w') + interface_methods = groups.interfaces[interface] + section = get_section(interface_methods, ['public', 'admin']) + if section: + interface_file.write(section.toprettyxml(encoding = "UTF-8")) + interface_file.close() + + + + + + diff --git a/trunk/doc/DocBookLocal.py b/trunk/doc/DocBookLocal.py new file mode 100644 index 0000000..a01ad6c --- /dev/null +++ b/trunk/doc/DocBookLocal.py @@ -0,0 +1,8 @@ + +from PLC.API import PLCAPI + +def get_func_list(methods = None): + api = PLCAPI(None) + if not methods: + methods = api.methods + return [api.callable(method) for method in methods] diff --git a/trunk/doc/Makefile b/trunk/doc/Makefile new file mode 100644 index 0000000..3adaa1f --- /dev/null +++ b/trunk/doc/Makefile @@ -0,0 +1,45 @@ +# +# (Re)builds API documentation +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +all: PLCAPI.pdf + +.PLCAPI.xml.valid: Methods.xml + +Methods.xml: DocBook.py ../PLC/__init__.py ../PLC/Methods/__init__.py + PYTHONPATH=.. python $< > $@ + +# +# Documentation +# + +# Validate the XML +.%.xml.valid: %.xml + xmllint --valid --output $@ $< + +# Remove the temporary output file after compilation +.SECONDARY: .%.xml.valid + +# Compile it into other formats +FORMATS := dvi html man ps pdf rtf tex texi txt + +DOCBOOK2FLAGS := -V biblio-number=1 + +define docbook2 +%.$(1): %.xml .%.xml.valid + docbook2$(1) --nochunks $$(DOCBOOK2FLAGS) $$< +endef + +$(foreach format,$(FORMATS),$(eval $(call docbook2,$(format)))) + +clean: + rm -f $(patsubst %,*.%,$(FORMATS)) .*.xml.valid Methods.xml + +force: + +.PHONY: force clean docclean diff --git a/trunk/doc/PLCAPI.html b/trunk/doc/PLCAPI.html new file mode 100644 index 0000000..e69de29 diff --git a/trunk/doc/PLCAPI.pdf b/trunk/doc/PLCAPI.pdf new file mode 100644 index 0000000..4c3abd0 --- /dev/null +++ b/trunk/doc/PLCAPI.pdf @@ -0,0 +1,37971 @@ +%PDF-1.4 +1 0 obj +<< /S /GoTo /D (1.0) >> +endobj +4 0 obj +(PlanetLab Central API Documentation) +endobj +5 0 obj +<< /S /GoTo /D (2.0) >> +endobj +8 0 obj +(Table of Contents) +endobj +9 0 obj +<< /S /GoTo /D (3.0) >> +endobj +12 0 obj +(Chapter 1. Introduction) +endobj +13 0 obj +<< /S /GoTo /D (3.1.1) >> +endobj +16 0 obj +(1.1. Authentication) +endobj +17 0 obj +<< /S /GoTo /D (3.2.1) >> +endobj +20 0 obj +(1.2. Roles) +endobj +21 0 obj +<< /S /GoTo /D (3.3.1) >> +endobj +24 0 obj +(1.3. Filters) +endobj +25 0 obj +<< /S /GoTo /D (3.4.1) >> +endobj +28 0 obj +(1.4. PlanetLab shell) +endobj +29 0 obj +<< /S /GoTo /D (4.0) >> +endobj +32 0 obj +(Chapter 2. PlanetLab API Methods) +endobj +33 0 obj +<< /S /GoTo /D (4.5.1) >> +endobj +36 0 obj +(2.1. AddAddressType) +endobj +37 0 obj +<< /S /GoTo /D (4.6.1) >> +endobj +40 0 obj +(2.2. AddAddressTypeToAddress) +endobj +41 0 obj +<< /S /GoTo /D (4.7.1) >> +endobj +44 0 obj +(2.3. AddBootState) +endobj +45 0 obj +<< /S /GoTo /D (4.8.1) >> +endobj +48 0 obj +(2.4. AddConfFile) +endobj +49 0 obj +<< /S /GoTo /D (4.9.1) >> +endobj +52 0 obj +(2.5. AddConfFileToNodeGroup) +endobj +53 0 obj +<< /S /GoTo /D (4.10.1) >> +endobj +56 0 obj +(2.6. AddConfFileToNode) +endobj +57 0 obj +<< /S /GoTo /D (4.11.1) >> +endobj +60 0 obj +(2.7. AddKeyType) +endobj +61 0 obj +<< /S /GoTo /D (4.12.1) >> +endobj +64 0 obj +(2.8. AddMessage) +endobj +65 0 obj +<< /S /GoTo /D (4.13.1) >> +endobj +68 0 obj +(2.9. AddNetworkMethod) +endobj +69 0 obj +<< /S /GoTo /D (4.14.1) >> +endobj +72 0 obj +(2.10. AddNetworkType) +endobj +73 0 obj +<< /S /GoTo /D (4.15.1) >> +endobj +76 0 obj +(2.11. AddNodeGroup) +endobj +77 0 obj +<< /S /GoTo /D (4.16.1) >> +endobj +80 0 obj +(2.12. AddNodeNetwork) +endobj +81 0 obj +<< /S /GoTo /D (4.17.1) >> +endobj +84 0 obj +(2.13. AddNode) +endobj +85 0 obj +<< /S /GoTo /D (4.18.1) >> +endobj +88 0 obj +(2.14. AddNodeToNodeGroup) +endobj +89 0 obj +<< /S /GoTo /D (4.19.1) >> +endobj +92 0 obj +(2.15. AddNodeToPCU) +endobj +93 0 obj +<< /S /GoTo /D (4.20.1) >> +endobj +96 0 obj +(2.16. AddPCU) +endobj +97 0 obj +<< /S /GoTo /D (4.21.1) >> +endobj +100 0 obj +(2.17. AddPeer) +endobj +101 0 obj +<< /S /GoTo /D (4.22.1) >> +endobj +104 0 obj +(2.18. AddPersonKey) +endobj +105 0 obj +<< /S /GoTo /D (4.23.1) >> +endobj +108 0 obj +(2.19. AddPerson) +endobj +109 0 obj +<< /S /GoTo /D (4.24.1) >> +endobj +112 0 obj +(2.20. AddPersonToSite) +endobj +113 0 obj +<< /S /GoTo /D (4.25.1) >> +endobj +116 0 obj +(2.21. AddPersonToSlice) +endobj +117 0 obj +<< /S /GoTo /D (4.26.1) >> +endobj +120 0 obj +(2.22. AddRole) +endobj +121 0 obj +<< /S /GoTo /D (4.27.1) >> +endobj +124 0 obj +(2.23. AddRoleToPerson) +endobj +125 0 obj +<< /S /GoTo /D (4.28.1) >> +endobj +128 0 obj +(2.24. AddSiteAddress) +endobj +129 0 obj +<< /S /GoTo /D (4.29.1) >> +endobj +132 0 obj +(2.25. AddSite) +endobj +133 0 obj +<< /S /GoTo /D (4.30.1) >> +endobj +136 0 obj +(2.26. AddSliceAttribute) +endobj +137 0 obj +<< /S /GoTo /D (4.31.1) >> +endobj +140 0 obj +(2.27. AddSliceAttributeType) +endobj +141 0 obj +<< /S /GoTo /D (4.32.1) >> +endobj +144 0 obj +(2.28. AddSliceInstantiation) +endobj +145 0 obj +<< /S /GoTo /D (4.33.1) >> +endobj +148 0 obj +(2.29. AddSlice) +endobj +149 0 obj +<< /S /GoTo /D (4.34.1) >> +endobj +152 0 obj +(2.30. AddSliceToNodes) +endobj +153 0 obj +<< /S /GoTo /D (4.35.1) >> +endobj +156 0 obj +(2.31. AuthCheck) +endobj +157 0 obj +<< /S /GoTo /D (4.36.1) >> +endobj +160 0 obj +(2.32. BlacklistKey) +endobj +161 0 obj +<< /S /GoTo /D (4.37.1) >> +endobj +164 0 obj +(2.33. BootGetNodeDetails) +endobj +165 0 obj +<< /S /GoTo /D (4.38.1) >> +endobj +168 0 obj +(2.34. BootNotifyOwners) +endobj +169 0 obj +<< /S /GoTo /D (4.39.1) >> +endobj +172 0 obj +(2.35. BootUpdateNode) +endobj +173 0 obj +<< /S /GoTo /D (4.40.1) >> +endobj +176 0 obj +(2.36. DeleteAddress) +endobj +177 0 obj +<< /S /GoTo /D (4.41.1) >> +endobj +180 0 obj +(2.37. DeleteAddressTypeFromAddress) +endobj +181 0 obj +<< /S /GoTo /D (4.42.1) >> +endobj +184 0 obj +(2.38. DeleteAddressType) +endobj +185 0 obj +<< /S /GoTo /D (4.43.1) >> +endobj +188 0 obj +(2.39. DeleteBootState) +endobj +189 0 obj +<< /S /GoTo /D (4.44.1) >> +endobj +192 0 obj +(2.40. DeleteConfFileFromNodeGroup) +endobj +193 0 obj +<< /S /GoTo /D (4.45.1) >> +endobj +196 0 obj +(2.41. DeleteConfFileFromNode) +endobj +197 0 obj +<< /S /GoTo /D (4.46.1) >> +endobj +200 0 obj +(2.42. DeleteConfFile) +endobj +201 0 obj +<< /S /GoTo /D (4.47.1) >> +endobj +204 0 obj +(2.43. DeleteKey) +endobj +205 0 obj +<< /S /GoTo /D (4.48.1) >> +endobj +208 0 obj +(2.44. DeleteKeyType) +endobj +209 0 obj +<< /S /GoTo /D (4.49.1) >> +endobj +212 0 obj +(2.45. DeleteMessage) +endobj +213 0 obj +<< /S /GoTo /D (4.50.1) >> +endobj +216 0 obj +(2.46. DeleteNetworkMethod) +endobj +217 0 obj +<< /S /GoTo /D (4.51.1) >> +endobj +220 0 obj +(2.47. DeleteNetworkType) +endobj +221 0 obj +<< /S /GoTo /D (4.52.1) >> +endobj +224 0 obj +(2.48. DeleteNodeFromNodeGroup) +endobj +225 0 obj +<< /S /GoTo /D (4.53.1) >> +endobj +228 0 obj +(2.49. DeleteNodeFromPCU) +endobj +229 0 obj +<< /S /GoTo /D (4.54.1) >> +endobj +232 0 obj +(2.50. DeleteNodeGroup) +endobj +233 0 obj +<< /S /GoTo /D (4.55.1) >> +endobj +236 0 obj +(2.51. DeleteNodeNetwork) +endobj +237 0 obj +<< /S /GoTo /D (4.56.1) >> +endobj +240 0 obj +(2.52. DeleteNode) +endobj +241 0 obj +<< /S /GoTo /D (4.57.1) >> +endobj +244 0 obj +(2.53. DeletePCU) +endobj +245 0 obj +<< /S /GoTo /D (4.58.1) >> +endobj +248 0 obj +(2.54. DeletePeer) +endobj +249 0 obj +<< /S /GoTo /D (4.59.1) >> +endobj +252 0 obj +(2.55. DeletePersonFromSite) +endobj +253 0 obj +<< /S /GoTo /D (4.60.1) >> +endobj +256 0 obj +(2.56. DeletePersonFromSlice) +endobj +257 0 obj +<< /S /GoTo /D (4.61.1) >> +endobj +260 0 obj +(2.57. DeletePerson) +endobj +261 0 obj +<< /S /GoTo /D (4.62.1) >> +endobj +264 0 obj +(2.58. DeleteRoleFromPerson) +endobj +265 0 obj +<< /S /GoTo /D (4.63.1) >> +endobj +268 0 obj +(2.59. DeleteRole) +endobj +269 0 obj +<< /S /GoTo /D (4.64.1) >> +endobj +272 0 obj +(2.60. DeleteSession) +endobj +273 0 obj +<< /S /GoTo /D (4.65.1) >> +endobj +276 0 obj +(2.61. DeleteSite) +endobj +277 0 obj +<< /S /GoTo /D (4.66.1) >> +endobj +280 0 obj +(2.62. DeleteSliceAttribute) +endobj +281 0 obj +<< /S /GoTo /D (4.67.1) >> +endobj +284 0 obj +(2.63. DeleteSliceAttributeType) +endobj +285 0 obj +<< /S /GoTo /D (4.68.1) >> +endobj +288 0 obj +(2.64. DeleteSliceFromNodes) +endobj +289 0 obj +<< /S /GoTo /D (4.69.1) >> +endobj +292 0 obj +(2.65. DeleteSliceInstantiation) +endobj +293 0 obj +<< /S /GoTo /D (4.70.1) >> +endobj +296 0 obj +(2.66. DeleteSlice) +endobj +297 0 obj +<< /S /GoTo /D (4.71.1) >> +endobj +300 0 obj +(2.67. GetAddresses) +endobj +301 0 obj +<< /S /GoTo /D (4.72.1) >> +endobj +304 0 obj +(2.68. GetAddressTypes) +endobj +305 0 obj +<< /S /GoTo /D (4.73.1) >> +endobj +308 0 obj +(2.69. GetBootStates) +endobj +309 0 obj +<< /S /GoTo /D (4.74.1) >> +endobj +312 0 obj +(2.70. GetConfFiles) +endobj +313 0 obj +<< /S /GoTo /D (4.75.1) >> +endobj +316 0 obj +(2.71. GetEvents) +endobj +317 0 obj +<< /S /GoTo /D (4.76.1) >> +endobj +320 0 obj +(2.72. GetKeys) +endobj +321 0 obj +<< /S /GoTo /D (4.77.1) >> +endobj +324 0 obj +(2.73. GetKeyTypes) +endobj +325 0 obj +<< /S /GoTo /D (4.78.1) >> +endobj +328 0 obj +(2.74. GetMessages) +endobj +329 0 obj +<< /S /GoTo /D (4.79.1) >> +endobj +332 0 obj +(2.75. GetNetworkMethods) +endobj +333 0 obj +<< /S /GoTo /D (4.80.1) >> +endobj +336 0 obj +(2.76. GetNetworkTypes) +endobj +337 0 obj +<< /S /GoTo /D (4.81.1) >> +endobj +340 0 obj +(2.77. GetNodeGroups) +endobj +341 0 obj +<< /S /GoTo /D (4.82.1) >> +endobj +344 0 obj +(2.78. GetNodeNetworks) +endobj +345 0 obj +<< /S /GoTo /D (4.83.1) >> +endobj +348 0 obj +(2.79. GetNodes) +endobj +349 0 obj +<< /S /GoTo /D (4.84.1) >> +endobj +352 0 obj +(2.80. GetPCUs) +endobj +353 0 obj +<< /S /GoTo /D (4.85.1) >> +endobj +356 0 obj +(2.81. GetPeerData) +endobj +357 0 obj +<< /S /GoTo /D (4.86.1) >> +endobj +360 0 obj +(2.82. GetPeerName) +endobj +361 0 obj +<< /S /GoTo /D (4.87.1) >> +endobj +364 0 obj +(2.83. GetPeers) +endobj +365 0 obj +<< /S /GoTo /D (4.88.1) >> +endobj +368 0 obj +(2.84. GetPersons) +endobj +369 0 obj +<< /S /GoTo /D (4.89.1) >> +endobj +372 0 obj +(2.85. GetRoles) +endobj +373 0 obj +<< /S /GoTo /D (4.90.1) >> +endobj +376 0 obj +(2.86. GetSession) +endobj +377 0 obj +<< /S /GoTo /D (4.91.1) >> +endobj +380 0 obj +(2.87. GetSites) +endobj +381 0 obj +<< /S /GoTo /D (4.92.1) >> +endobj +384 0 obj +(2.88. GetSliceAttributes) +endobj +385 0 obj +<< /S /GoTo /D (4.93.1) >> +endobj +388 0 obj +(2.89. GetSliceAttributeTypes) +endobj +389 0 obj +<< /S /GoTo /D (4.94.1) >> +endobj +392 0 obj +(2.90. GetSliceInstantiations) +endobj +393 0 obj +<< /S /GoTo /D (4.95.1) >> +endobj +396 0 obj +(2.91. GetSlices) +endobj +397 0 obj +<< /S /GoTo /D (4.96.1) >> +endobj +400 0 obj +(2.92. GetSliceTicket) +endobj +401 0 obj +<< /S /GoTo /D (4.97.1) >> +endobj +404 0 obj +(2.93. GetSlivers) +endobj +405 0 obj +<< /S /GoTo /D (4.98.1) >> +endobj +408 0 obj +(2.94. NotifyPersons) +endobj +409 0 obj +<< /S /GoTo /D (4.99.1) >> +endobj +412 0 obj +(2.95. RebootNode) +endobj +413 0 obj +<< /S /GoTo /D (4.100.1) >> +endobj +416 0 obj +(2.96. RefreshPeer) +endobj +417 0 obj +<< /S /GoTo /D (4.101.1) >> +endobj +420 0 obj +(2.97. ResetPassword) +endobj +421 0 obj +<< /S /GoTo /D (4.102.1) >> +endobj +424 0 obj +(2.98. SetPersonPrimarySite) +endobj +425 0 obj +<< /S /GoTo /D (4.103.1) >> +endobj +428 0 obj +(2.99. UpdateAddress) +endobj +429 0 obj +<< /S /GoTo /D (4.104.1) >> +endobj +432 0 obj +(2.100. UpdateAddressType) +endobj +433 0 obj +<< /S /GoTo /D (4.105.1) >> +endobj +436 0 obj +(2.101. UpdateConfFile) +endobj +437 0 obj +<< /S /GoTo /D (4.106.1) >> +endobj +440 0 obj +(2.102. UpdateKey) +endobj +441 0 obj +<< /S /GoTo /D (4.107.1) >> +endobj +444 0 obj +(2.103. UpdateMessage) +endobj +445 0 obj +<< /S /GoTo /D (4.108.1) >> +endobj +448 0 obj +(2.104. UpdateNodeGroup) +endobj +449 0 obj +<< /S /GoTo /D (4.109.1) >> +endobj +452 0 obj +(2.105. UpdateNodeNetwork) +endobj +453 0 obj +<< /S /GoTo /D (4.110.1) >> +endobj +456 0 obj +(2.106. UpdateNode) +endobj +457 0 obj +<< /S /GoTo /D (4.111.1) >> +endobj +460 0 obj +(2.107. UpdatePCU) +endobj +461 0 obj +<< /S /GoTo /D (4.112.1) >> +endobj +464 0 obj +(2.108. UpdatePeer) +endobj +465 0 obj +<< /S /GoTo /D (4.113.1) >> +endobj +468 0 obj +(2.109. UpdatePerson) +endobj +469 0 obj +<< /S /GoTo /D (4.114.1) >> +endobj +472 0 obj +(2.110. UpdateSite) +endobj +473 0 obj +<< /S /GoTo /D (4.115.1) >> +endobj +476 0 obj +(2.111. UpdateSliceAttribute) +endobj +477 0 obj +<< /S /GoTo /D (4.116.1) >> +endobj +480 0 obj +(2.112. UpdateSliceAttributeType) +endobj +481 0 obj +<< /S /GoTo /D (4.117.1) >> +endobj +484 0 obj +(2.113. UpdateSlice) +endobj +485 0 obj +<< /S /GoTo /D (4.118.1) >> +endobj +488 0 obj +(2.114. VerifyPerson) +endobj +489 0 obj +<< /S /GoTo /D (4.119.1) >> +endobj +492 0 obj +(2.115. system.listMethods) +endobj +493 0 obj +<< /S /GoTo /D (4.120.1) >> +endobj +496 0 obj +(2.116. system.methodHelp) +endobj +497 0 obj +<< /S /GoTo /D (4.121.1) >> +endobj +500 0 obj +(2.117. system.methodSignature) +endobj +501 0 obj +<< /S /GoTo /D (4.122.1) >> +endobj +504 0 obj +(2.118. system.multicall) +endobj +505 0 obj +<< /S /GoTo /D [506 0 R /Fit ] >> +endobj +508 0 obj << +/Length 160 +/Filter /FlateDecode +>> +stream +xڍŽ;Â0 „÷ü +t¨‰Ý6NFÞ1tȆB)© •ÿO¤Vˆy8Ÿ>Ëw:J…²)ªVi¸G´S4äÆ d¢ùAÓ"t– ¤ßO–^Í·LÀ9ŠƒˆDkdfð×Ó¬lBWÇpIR;[ÕÝð Íhå~\Ö}õj# ã?¨ÿ¤Oõs‹–Œû¿ýý7Èendstream +endobj +506 0 obj << +/Type /Page +/Contents 508 0 R +/Resources 507 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +>> endobj +509 0 obj << +/D [506 0 R /XYZ 71.731 729.2652 null] +>> endobj +510 0 obj << +/D [506 0 R /XYZ 71.731 718.3063 null] +>> endobj +511 0 obj << +/D [506 0 R /XYZ 71.731 718.3063 null] +>> endobj +2 0 obj << +/D [506 0 R /XYZ 528.0019 700.222 null] +>> endobj +507 0 obj << +/Font << /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +518 0 obj << +/Length 158 +/Filter /FlateDecode +>> +stream +xÚ3T0BCsC=sc ed©gdfj¤œËe ”rç2„*113Ó3254r°Èêš›ëYZ™)è"âÂ¥ïfd¨`©gi” IƒÛd`¡glbl®’­“˜—Zⓘ¤©kdn¡áœšWR”˜á8xB.ùÉ¥¹@™Ä’Ìü<ÍØ/.׸õPSM,ô, Í,‰w>@Ã8endstream +endobj +517 0 obj << +/Type /Page +/Contents 518 0 R +/Resources 516 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +>> endobj +519 0 obj << +/D [517 0 R /XYZ 71.731 729.2652 null] +>> endobj +516 0 obj << +/Font << /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +522 0 obj << +/Length 53930 +/Filter /FlateDecode +>> +stream +xڔÝM“kW~ù¹>‡ä@h¼$È¡¬h)Ün9íêQGÊ*ÊRtu±¢ŠŠ}û>y/öÚȵqÖ³h;B’yjýP€Š¼—ÌçÓÇíÿž~x?Þ/Û9ηëù‡þÿæøÃÿÜþÐ?þÍéñÈÛív8_O·íxñGÿözy?|ÜÏ·þöyä?ýîoþ—8Ÿ~8·ëýúÃïþEÔñr8_n?üîÿ׏¿ûé~üñ÷ÿã§ÓñÇ?þüÓߞßï?þò/ßÿëßÿò§_þÓ¯ýéÿþÝÿö7ÿëïäN‡ëõôþÃí~;œ®——¯IýíÓSß_Òý‡ÃÇm{¹Û+Z¶>_Óé°½€ëñÇÿü§_ÿòÓi{Aø÷þõß~ùÓòBî—Ãõ~J¯ãx8Ÿ?ÞwÞ·ÏýýtÄ×8{~‡õÅÜ—ãéíÕ«y!?&Ù6wäûáýã\Âߟ%÷ëâköãt8ßÏï;Ø7wäËáýýR¾Õãa’msGÞþƒxkáïϒûuq‡Ý>ë[ûV?&Ø6_Êçãö¼m´‘õp–—Íyû@¶?Iuð÷gÉýº¸ÃnŸÇùö^º‡ ¶Íyû@Nïí[ýx˜dÛ|-Ÿ¶äxïàdzàÚâ{9Ü>îåG<&Ø6wäíÞ?Ê·z“ó¥|·ÇÃ$Û掼ýÁÓ[ùn‡I¶ÍyûLŽ×s)?&Ù6_Ëo§ÃñãZ¾Ûãa}sGþü÷­|·ÇÃ$ÛæŽ|;ßßËw{çVÉãa}sGÞ>“·ò·z˜dÛܑ·ÏäòQ¾Ûãa’msGÞ>“˱}·“l›¯åÛö™œOå»=Ù7wäí39Ê_Œ‡I¶ÍyûLŽçòÝ“l›;òýðöqißíÇÃ$Ûækùýxø¸_Êw{< ²oîȗÃÛû[ùn‡I¶Íùºý+®§R~“·[ùn‡AöÍyûL.ïå»=&Ù6wäí3ÙޞR~Þ?ÊˏgÁµÅör8ßß[÷ñ0Á¶¹#_ïï÷K)?&Ù6wäûá|û(áïϒûuñ5{Ù>kû‡öÍyû@®Çò­“l›;òö¼•¶~&Ø6_ËoÛr>—oõxdßܑ·äÔÂߟ%÷ëâ»}ÇòŸ‡éa‚msG¾Noí¿ãÇÃ$Ûækùz<ÜîoåŸAÆà ûæŽ|9œÞ¯å»=&Ù6wäëáv»•ïöx˜dÛܑ·ÏäÚþùz“Ëý\ʏ‡I¶ÍyûLÎ÷òÝ“l›;òö™œ>Úwûñ0ɶùZ~ß>“Ó±|·Çà û掼}&Çcùn‡I¶Íùz¸~œÊ_ۏ‡I¶Íù~8ÞÏí»ýx˜dÛ|-ߏ‡ëû¹|·Çà ûæŽ|9o—òÝ“l›;òö™\ßÊw{“·sùn‡I¶ÍyûL.çöÝ~îïåOÑêa’msG¾.·÷òÝ“l›;òö™”ÿ¼yž%÷ëâ{=œ?ʲDl›;òûáýÞþ¯Öx˜dÛ|-ߎ‡sû§­Ç³àÚâ{>¼ßʟŸÕÃÛ掼} ײ,ÑÃ$Û掼} õ¿åïϒûuñ5û~ü¬îJw< °oîÈÛr.Ë=L²mîÈÛr*xV“l›;òö‘ïí»ýx˜dÛ|-ߏ‡ÓG—èa}sG>n÷ò‡gõ0ɶ¹#_§{™˜èa’msG~?ÜÞËžÕÃ$ÛækùcûLneb¢‡AöÍyûL®eb¢‡I¶ÍyûLÞÊžÕÃ$Û掼}&—Kûn?&Ù6_Ê×ãö™œËžÕÃY^6wäí39•‰‰&Ù6wäí39–‰‰&Ù6wä÷Ãõã־ۏ‡I¶Í×òéx8ÞËÄDƒì›;òùp}/xV“l›;òõp¼•‰‰&Ù6wäí3¹~´ïöãa’móµ|Þ>“·ò‡gõ0Ⱦ¹#oŸÉ[™˜èa’msGÞ>“Kùóz˜dÛܑ·Ïä|jßíÇÃ$Ûækù²}&§ò§*õ0Ⱦ¹#oŸÉñ‡)¾ýӏ½ƒ—Ãñˆ¿Ny<öõW…§õÕ<®ƒ¤s—·í-ýü5ÙöŸÞËÛùíõÁŒ·ËáíÛ?HÛ~ßq?mëu}<Ÿx<¦§¾õg=þîßýןÿôë¿ýóï_õ8oÿQ:>‹–'Ã_ÉgÄv»ï¼{O s|™³a~~!b~ñ‚RÅ ¸¯BÇÜá +™÷UH™;\-3ྠ+5s…Ïœ9ãË*Í®¢p_…¦¹Ã55w¸ºfÀ}Êæ +ŸisƗUˆ›;\u3ྠ+}s‡+pÜW!qîp5΀û*TÎ>3çŒ/«:w¸JgÀ}ZçWì ¸¯BîÜáê÷U(ž+|&Ï_V!zîpUπû*tÏ®ðp_…ô¹ÃÕ>î«P?Wø̟3¾¬BÝá* ÷Uh ;\4ྠ+t‡«ƒÜW¡„®ð™Bg|Y…ºÃUCî«ÐCw¸‚hÀ}’èW ¸¯B]á3‹Îø² +at‡«ŒÜW¡îpÅрû*äÑ®>p_…BºÁŸ鈯«Iw¸*iÀ}:éW( ¸¯B*Ýáj¥÷U¨¥+|æÒ_Vs0ÝÙ£˜Ú6¡™îhEÓ`û*dÓ®np_Íåte+Î´oB<ÝѪ§ÁöUè§;\5ྚêÎ 5ж uEό:ÛË*„Ô®’p_Í-ug˜hۄœº£ÕSƒí«PTWøLª3¾¬æ¨º³GU ´mBWÝÑ +«ÁöUH«;\m5ྠ+uu…ϼ:ãË*Ö®Âp_…ƺÃYYw¸:kÀ}Jë +Ÿ©uƗUˆ­;\µ5ྠ+½u‡+¸ÜW!¹îp5׀û*T×>³ëŒ/«^w¸ÊkÀ}ÚëW| ¸¯B~Ýáê¯÷U(°+|&Ø_V!ÂîpU؀û*tØ®p_…»ÃÕbî«PcWø̱3¾¬BÝá*²÷Uh²;\Q6ྠ+Yv‡«ËÜW¡Ìnð§4;âë*ÄÙ®:p_…>»Ãhhw¸mÀ}*í +Ÿ™vƗUµ;\¥6ྠ+­v‡+ÖÜW!×îpõڀû*Û>“íŒ/«mw¸ªmÀ}ºíW¸ ¸¯BºÝáj·÷U¨·+|æÛ_V!àîp܀û*4Ü®ˆp_ÍwgŽhۄ’»¢gʝíebîWÍ ¸¯Æž»£A7À_!éî`5Ý@û*TÝ>³îŒ/«9ìîìQvm›Ðvw´ân°}òîWß ¸¯æ»²•xgÚ7!òîhUÞ`û*tÞ®Ðp_Í©wgÖhۄڻ¢gîíe‚ïWñ ¸¯BóÝኾ÷UȾ;\Ý7ྠ+åw…Ïô;ãË*Äß®úp_…þ»Ã€€w¸pÀ}*ð +ŸxƗUÁ;\%8ྠ+-x‡+ÜW!ïpõà€û*á þ”„G|]…(¼ÃU…î«Ð…w¸ÂpÀ}ÒðW¸¯B^á3Ïø² +x‡«ÜW¡ïpEâ€û*dâ®Np_…R¼Âg*žñebñW-¸¯B/Þá +Æ÷UHÆ;\Í8ྠ+Õx…Ïl<ãË*„ã¡}nËqxA#ÿÒhï·ãá=Ç㏿Ÿãñëçß ÛþӗãññÔ÷xüüˆÇÿ_þøó_ýežî—Ï$ÿô/zù¾Oם÷ísaû÷÷Ž¯n<÷ååÖt;\ŽŸÿ@ãÅ z?žFÜWwðûáýãÜÚßFÚ6_ËÛu?¿—ôxšìeu¿Þß/í{>žFÜWwðÛá|«íï#m›;òöÉ\ßê÷üñ4Ú¾úº:9nÍÛç߆ip= øººƒoÍçÏXvö÷‡‘¶Íyûdη÷–~<¶¯îàÛGsz¯ßóÇӈûêkü´}4Ÿÿ”¸²í›;òåpû¸·÷xm_ÝÁo‡Óý£}ÏÇӈûê~?Üê·üÛ³]ܹþ1ΣTð<º’éeŽ®t¸Ž®î«pt¥Ãutp_…£+®£+€û*]©ðyt%ãË*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÂçѕŒ/«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VáèJ‡ëè +ྠ+GW:\GW÷U8ºÒá:º¸¯Âѕ +ŸGW2¾¬Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥Ãutp_…£+>®d|Y…£+®£+€û*]ép]ÜWáèJ‡ëè +ྠ+GW*|]Éø² +GW:\GW÷U8ºÒá:º¸¯Âѕ×ÑÀ}Ž®4øÓѕˆ¯«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VóѕÎGW€¶M8ºÒÑ:º¶¯Âѕ×ÑÀ}5]©l]É´oÂѕŽÖÑ°}Ž®t¸Ž®î«ùèJg£+@Û&]©èyt%ÛË*]ép]ÜWóѕÎGW€¶M8ºÒÑ:º¶¯Âѕ +ŸGW2¾¬æ£+=Ž®m›pt¥£utl_…£+®£+€û*]©ðyt%ãË*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÂçѕŒ/«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VáèJ‡ëè +ྠ+GW:\GW÷U8ºÒá:º¸¯Âѕ +ŸGW2¾¬Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥Ãutp_…£+ þtt%âë*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÂçѕŒ/«pt¥Ãutp_…£+®£+€û*]ép]ÜWáèJ…Ï£+_VáèJ‡ëè +ྠ+GW:\GW÷Õ|t¥³ÇÑ mŽ®Tô<º’íeŽ®t¸Ž®î«ñèJG?Ž®üuŽ®t°Ž®í«pt¥ÂçѕŒ/«ùèJg£+@Û&]éh]ÛWáèJ‡ëè +ྚ®T¶Ž®dÚ7áèJGëè +ؾ +GW:\GW÷Õ|t¥³ÇÑ mŽ®Tô<º’íeŽ®t¸Ž®î«pt¥Ãutp_…£+®£+€û*]©ðyt%ãË*]ép]ÜWáèJ‡ëè +ྠ+GW:\GW÷U8ºRáóèJƗU8ºÒá:º¸¯Âѕ×ÑÀ}Ž®t¸Ž®î«pt¥ÁŸŽ®D|]…£+®£+€û*]ép]ÜWáèJ‡ëè +ྠ+GW*|]Éø² +GW:\GW÷U8ºÒá:º¸¯Âѕ×ÑÀ}Ž®Tø<º’ñeŽ®t¸Ž®î«pt¥Ãutp_…£+®£+€û*]©ðyt%ãË*]‰ÇCº£+ð‚ÆѕçtÞ?º^Ðrtå +GWÞÞÇ÷w8º2žú~tåò8ºòÿöÇ_þË__^9¹}þRñiÜ_Âùðv9½íž]×GòË×Gž_^¸>òâå¤ë#Ù^VáúH‡ëúྚ¯tö¸>´mÂõ‘ŽÖõ°}®4øÓõ‘ˆ¯«ùúHgë#@Û&\éh]ÛWáúH‡ëúྚ¯T¶®dÚ7áúHGëúؾ +×G:\×G÷Õx}¤£×Gþº×G*x^Éô² +×G:\×G÷U¸>Òáº>¸¯Âõ‘×õÀ}®Tø¼>’ñe®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>RáóúHƗU¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«p}¤Ãu}p_…ë#®ë#€û*\ép]ÜWáúH…Ïë#_VáúH‡ëúྠ+×G:\×G÷U¸>Òáº>¸¯Âõ‘ +Ÿ×G2¾¬Âõ‘×õÀ}®t¸®î«p}¤Ãu}p_…ë#>¯d|Y…ë#®ë#€û*\ép]ÜWáúH‡ëúྠ+×GüéúHÄ×U¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«ùúHgë#@Û&\éh]ÛWáúH‡ëúྚ¯T¶®dÚ7áúHGëúؾ +×G:\×G÷Õ|}¤³Çõ m®Tô¼>’íe®t¸®î«ùúHgë#@Û&\éh]ÛWáúH…Ïë#_Vóõ‘Î×G€¶M¸>ÒѺ>¶¯Âõ‘×õÀ}®Tø¼>’ñe®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>RáóúHƗU¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«p}¤Ãu}p_…ë#®ë#€û*\ép]ÜWáúH…Ïë#_VáúH‡ëúྠ+×G:\×G÷U¸>Òáº>¸¯Âõ‘º>ñu®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>RáóúHƗU¸>Òáº>¸¯Âõ‘×õÀ}®t¸®î«p}¤Âçõ‘Œ/«p}¤Ãu}p_…ë#®ë#€ûj¾>ÒÙãúж ×G*z^Éö² +×G:\×G÷Õx}¤£×Gþº×G:X×G€öU¸>RáóúHƗÕ|}¤³Çõ m®t´®€í«p}¤Ãu}p_Í×G*[×G2í›p}¤£u}l_…ë#®ë#€ûj¾>ÒÙãúж ×G*z^Éö² +×G:\×G÷U¸>Òáº>¸¯Âõ‘×õÀ}®Tø¼>’ñe®t¸®î«p}¤Ãu}p_…ë#®ë#€û*\©ðy}$ãË*\ép]ÜWáúH‡ëúྠ+×G:\×G÷U¸>ÒàO×G"¾®Âõ‘×õÀ}®t¸®î«p}¤Ãu}p_…ë#>¯d|Y…ë#®ë#€û*\ép]ÜWáúH‡ëúྠ+×G*|^Éø² +×G:\×G÷U¸>Òáº>¸¯Âõ‘×õÀ}®Tø¼>’ñe®„íõxAãúÈó +×G Z®¼Áõ‘Ëi{êvë#ã©ï×GÞ×GþÛÿ§Ÿýßÿ?¾ÿýןÿøǵ[Þþbvüü!â'É_ÏgxûØyŸ*îøbgÅýüjCÅý⥊p_…Š»ÃUqî«PqWø¬¸3¾¬BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅ]á³âÎø² +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe*îWÅ ¸¯BÅÝ᪸÷U¨¸;\7ྠ+w…ÏŠ;ãË*TÜ®Šp_…Š»ÃUqî«Pqw¸*nÀ}*î +ŸwƗU¨¸;\7ྠ+w‡«âÜW¡âîpU܀û*TÜ>+îŒ/«Pqw¸*nÀ}*îWÅ ¸¯BÅÝ᪸÷U¨¸ü©âŽøº +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe5Wܝ=*n m*îŽVÅ ¶¯BÅÝ᪸÷Õ\qW¶*îLû&TÜ­Šl_…Š»ÃUqâîìQqm›PqWô¬¸³½¬BÅÝ᪸÷Õ\qwö¨¸¶M¨¸;Z7ؾ +w…ÏŠ;ãËj®¸;{TÜ@Û&TÜ­Šl_…Š»ÃUqî«PqWø¬¸3¾¬BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅ]á³âÎø² +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe*îWÅ ¸¯BÅÝ᪸÷U¨¸;\7ྠ+w…ÏŠ;ãË*TÜ®Šp_…Š»ÃUqî«Pqw¸*nÀ}*#¾®BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅ]á³âÎø² +w‡«âÜW¡âîpU܀û*TÜ®Šp_…Š»Âgŝñe*îWÅ ¸¯BÅÝ᪸÷Õ\qwö¨¸¶M¨¸+zVÜÙ^V¡âîpU܀ûj¬¸;úQqüu*îVÅ ´¯BÅ]á³âÎø²š+îÎ7ж wG«âÛW¡âîpU܀ûj®¸+[w¦}*îŽVÅ ¶¯BÅÝ᪸÷Õ\qwö¨¸¶M¨¸+zVÜÙ^V¡âîpU܀û*TÜ®Šp_…Š»ÃUqî«PqWø¬¸3¾¬BÅÝ᪸÷U¨¸;\7ྠ+w‡«âÜW¡â®ðYqg|Y…Š»ÃUqî«Pqw¸*nÀ}*îWÅ ¸¯BÅÝàOwÄ×U¨¸;\7ྠ+w‡«âÜW¡âîpU܀û*TÜ>+îŒ/«Pqw¸*nÀ}*îWÅ ¸¯BÅÝ᪸÷U¨¸+|VÜ_V¡âîpU܀û*TÜ®Šp_…Š»ÃUqî«PqWø¬¸3¾¬BÅòã¶â†4*îç*îð‚þöít?¼]>ÿ±ýöêËÛöoóeÅ}úØþC÷íǾO·í/6—û|i÷çŒ{<§Ç¾½´×÷ßý·ÿüý¿ù§Ÿý×_þð×W!ïñÛ_מÌõ½mÞ ºgÜ_öŒ{Ÿ_vˆ{_¼ ÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ>ãތ/«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_V!îípŽ€û*Ľ®¸p_…¸·Ã÷î«÷VøŒ{3¾¬BÜÛáŠ{÷Uˆ{;\q/ྠ+qo‡+îÜW!î­ð÷f|Y…¸·Ã÷î«÷v¸â^À}âÞWÜ ¸¯BÜ[á3îÍø² +qo‡+îÜW!îípŽ€û*Ľ®¸p_…¸·ÁŸâވ¯«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_VsÜÛÙ#îÚ6!îíhŽ`û*Ľ®¸p_Íqoe+îÍ´oBÜÛъ{ÁöUˆ{;\q/ྚãÞÎq/ж qoEϸ7ÛË*Ľ®¸p_Íqog¸hۄ¸·£÷‚í«÷VøŒ{3¾¬æ¸·³GÜ ´mBÜÛъ{ÁöUˆ{;\q/ྠ+qo…ϸ7ãË*Ľ®¸p_…¸·Ã÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ>ãތ/«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_V!îípŽ€û*Ľ®¸p_…¸·Ã÷î«÷VøŒ{3¾¬BÜÛáŠ{÷Uˆ{;\q/ྠ+qo‡+îÜW!îmð§¸7âë*Ľ®¸p_…¸·Ã÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ>ãތ/«÷v¸â^À}âÞWÜ ¸¯BÜÛáŠ{÷Uˆ{+|ƽ_V!îípŽ€û*Ľ®¸p_Íqog¸hۄ¸·¢gܛíeâÞWÜ ¸¯Æ¸·£q/À_!îí`Ž@û*Ľ>ãތ/«9îíì÷m›÷v´â^°}âÞWÜ ¸¯æ¸·²÷fÚ7!îíhŽ`û*Ľ®¸p_Íqog¸hۄ¸·¢gܛíeâÞWÜ ¸¯BÜÛáŠ{÷Uˆ{;\q/ྠ+qo…ϸ7ãË*Ľ®¸p_…¸·Ã÷î«÷v¸â^À}âÞ +ŸqoƗUˆ{;\q/ྠ+qo‡+îÜW!îípŽ€û*Ľ þ÷F|]…¸·Ã÷î«÷v¸â^À}âÞWÜ ¸¯BÜ[á3îÍø² +qo‡+îÜW!îípŽ€û*Ľ®¸p_…¸·ÂgܛñeâÞWÜ ¸¯BÜÛáŠ{÷Uˆ{;\q/ྠ+qo…ϸ7ãË*Ľ1Eíâ^xA#î}~A×ý¸7¼ ç¯hNq¯¾¢ùxÚ~Óz¢¯hO}O{O¸÷ïþð‡íÿýåç¿þõw?ݏ?þǟ^ Öãáòþù³´OÎú&nOÜv{^}Sp|©ó›‚Ÿ_kø¦à/(ÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&®ðg|Y…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø² +1q‡+&ÜW!&îpÅĀû*ÄÄ®˜p_…˜¸ÂgLœñebâWL ¸¯BLÜ኉÷Uˆ‰;\11ྠ+1q…Ϙ8ãË*ÄÄ®˜p_…˜¸Ãî«w¸bbÀ}bâ +Ÿ1qƗUˆ‰;\11ྠ+1q‡+&ÜW!&îpÅĀû*ÄÄ þG|]…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø²šcâÎ11ж 1qG+&ÛW!&îpÅĀûjŽ‰+[1q¦}bâŽVL ¶¯BLÜ኉÷Õwöˆ‰¶Mˆ‰+zÆÄÙ^V!&îpÅĀûjŽ‰;{ÄÄ@Û&ÄÄ­˜l_…˜¸ÂgLœñe5Çĝ=bb mbâŽVL ¶¯BLÜ኉÷Uˆ‰+|ÆÄ_V!&îpÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&®ðg|Y…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø² +1q‡+&ÜW!&îpÅĀû*ÄÄ®˜p_…˜¸ÂgLœñebâWL ¸¯BLÜ኉÷Uˆ‰;\11ྠ+1qƒ?ÅÄ_W!&îpÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&®ðg|Y…˜¸Ãî«w¸bbÀ}bâWL ¸¯BL\á3&Îø² +1q‡+&ÜW!&îpÅĀûjŽ‰;{ÄÄ@Û&ÄÄ=câl/«w¸bbÀ}5ÆÄýˆ‰þº1q+&ÚW!&®ðg|YÍ1qg˜hۄ˜¸£ƒí«w¸bbÀ}5Çĕ­˜8Ó¾ 1qG+&ÛW!&îpÅĀûjŽ‰;{ÄÄ@Û&ÄÄ=câl/«w¸bbÀ}bâWL ¸¯BLÜ኉÷Uˆ‰+|ÆÄ_V!&îpÅĀû*ÄÄ®˜p_…˜¸Ãî«WøŒ‰3¾¬BLÜ኉÷Uˆ‰;\11ྠ+1q‡+&ÜW!&nð§˜8âë*ÄÄ®˜p_…˜¸Ãî«w¸bbÀ}bâ +Ÿ1qƗUˆ‰;\11ྠ+1q‡+&ÜW!&îpÅĀû*ÄÄ>câŒ/«w¸bbÀ}bâWL ¸¯BLÜ኉÷Uˆ‰+|ÆÄ_V!&Žlà 1ñó +1qxAÏ1ñãïãǘøz¿.Û¯hsL¬§¾ÇÄçݘøÛýåñÿù*ü9lQ}F×wtû_‹®X)P~ÕzîËËÞO^½œî«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9ªð™e|]Í)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|Y)Pi?R ¢m3§@%=R ²}5§@%>R Â}5¦@=R  }3§@%=R ²}5§@%>R Â}5¦@¥ýHˆ¶Íœu´R °—Õœ•øH÷՘•ö#"Ú6s +TÒ#"ÛWs +ÔáJ_Vc +TڏˆhÛÌ)PIˆl_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P‡+|YÍ)P‰ˆp_Í)P‰ˆp_Í)P‰ˆp_Í)P…Ï(ãëjNJ|¤@„ûjNJ|¤@„ûjNJ|¤@„ûjN:\)àËjNJ|¤@„ûjNJ|¤@„ûjNJ|¤@„ûjN:\)àËjNJ|¤@„ûjNJ|¤@„ûjNJ|¤@„ûjN:\)àËjNJ|¤@„ûjNJ|¤@„ûjLJû‘m›9êh¥@`/«9*ñ‘î«)*éï)Á_s +TÂ#"ÚWs +ÔáJ_Vc +TڏˆhÛÌ)PIˆl_Í)P‰ˆp_)PghßÌ)PIˆl_Í)P‰ˆp_)Pi?R ¢m3§@­ìe5§@%>R Â}5§@%>R Â}5§@%>R Â}5§@®ðe5§@%>R Â}5§@%>R Â}5§@%>R Â}5§@®ðe5§@%>R Â}5§@%>R Â}5§@%>R Â}5§@>S Œ¯«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9*ñ‘î«9*ñ‘î«9*ñ‘î«9êp¥@€/«9ÊáJ•Ñ z¤@_^Ð~ +”^ÐoNÞ?ÿFÜý +)Ðxê{ +t™)Ðúå—_ÿû¯¿ÿuýFÁí?֗ëç>= þ:NŸ?äû¾Wþœî‡oÿd0¾ÄÇS_^áúùçÓáôþù‹×/f…ÇÓD/«;øåp».-þxq_ÝÁo‡Óõó¯þxq_ÝÁ·Ïæí\¿í§÷՝ïQ||Ñd‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–øøúJÂ}5}e‰¯¯$ÜWó×W–øøúJÂ}5}e‡ëë+_Vó×W–¸šuÀ}šõW³¸¯B³ÞájÖ÷UhÖ+|6ë_V¡Yïp5ë€û*4ë®fp_…f½ÃÕ¬î«Ð¬WølÖ3¾¬B³ÞájÖ÷UhÖ;\Í:ྠ+Íz‡«YÜW¡Yoð§f=âë*4ë®fp_…f½ÃÕ¬î«Ð¬w¸šuÀ}šõ +ŸÍzƗÕܬwöhց¶MhÖ;ZÍ:ؾ +Íz‡«YÜWs³^ÙjÖ3í›Ð¬w´šu°}šõW³¸¯æf½³G³´mB³^ѳYÏö² +Íz‡«YÜWs³ÞÙ£YÚ6¡Yïh5ë`û*4ë>›õŒ/«¹YïìѬm›Ð¬w´šu°}šõW³¸¯B³^á³YÏø² +Íz‡«YÜW¡Yïp5ë€û*4ë®fp_…f½Âg³žñešõW³¸¯B³ÞájÖ÷UhÖ;\Í:ྠ+Íz…Ïf=ãË*4ë®fp_…f½ÃÕ¬î«Ð¬w¸šuÀ}šõ +ŸÍzƗUhÖ;\Í:ྠ+Íz‡«YÜW¡Yïp5ë€û*4ë>›õŒ/«Ð¬w¸šuÀ}šõW³¸¯B³ÞájÖ÷UhÖü©Yøº +Íz‡«YÜW¡Yïp5ë€û*4ë®fp_…f½Âg³žñešõW³¸¯B³ÞájÖ÷UhÖ;\Í:ྠ+Íz…Ïf=ãË*4ë®fp_…f½ÃÕ¬î«Ð¬w¸šuÀ}šõ +ŸÍzƗUhÖ;\Í:ྠ+Íz‡«YÜWs³ÞÙ£YÚ6¡Y¯èÙ¬g{Y…f½ÃÕ¬YïèG³ð×EhÖ;XÍ:о +Íz…Ïf=ãËjnÖ;{4ë@Û&4ë­fl_…f½ÃÕ¬Y¯l5ë™öMhÖ;ZÍ:ؾ +Íz‡«YÜWs³ÞÙ£YÚ6¡Y¯èÙ¬g{Y…f½ÃÕ¬î«Ð¬w¸šuÀ}šõW³¸¯B³^á³YÏø² +Íz‡«YÜW¡Yïp5ë€û*4ë®fp_…f½Âg³žñešõW³¸¯B³ÞájÖ÷UhÖ;\Í:ྠ+Ízƒ?5ë_W¡Yïp5ë€û*4ë®fp_…f½ÃÕ¬î«Ð¬WølÖ3¾¬B³ÞájÖ÷UhÖ;\Í:ྠ+Íz‡«YÜW¡Y¯ðÙ¬g|Y…f½ÃÕ¬î«Ð¬w¸šuÀ}šõW³¸¯B³^á³YÏø² +Ízˆ®Ûf^Ðh֟_Ðm¿Y/è77ëÛoßNï'hÖÇSߛõ·Ù¬ÿý/ú—ø·?¾HÖ?sœž÷×7ï|úØ/Ö/‡ÛÇ·¿¥_âã¹Û×׸þHþé¶ýòõóî/^Ð üñ4⾺ƒïê;úQêüuJý +ž¥~¦—U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿Âg©ŸñeJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý*õ#¾®B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|YÍ¥~gRhۄR¿£Uêƒí«Pêw¸J}À}5—ú•­R?Ó¾ ¥~G«ÔÛW¡Ôïp•ú€ûj.õ;{”ú@Û&”ú=Kýl/«Pêw¸J}À}5—ú=J} mJýŽV©¶¯B©_á³ÔÏø²šKýÎ¥>ж ¥~G«ÔÛW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿ÁŸJýˆ¯«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}5—ú=J} mJýŠž¥~¶—U(õ;\¥>à¾KýŽ~”ú]„R¿ƒUêí«PêWø,õ3¾¬æR¿³G©´mB©ßÑ*õÁöU(õ;\¥>ྚKýÊV©Ÿi߄R¿£Uêƒí«Pêw¸J}À}5—ú=J} mJýŠž¥~¶—U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«Pê7øS©ñuJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«PêÇؼ+õáRÿù½ï—úá-¥þJý·í¿¹Þ ÔO}/õ¯k©ÿ»ŸîÇù¯¿üáçüË/ÿþçWÁÑûg®ðÄ­ïåéóçúwÂýÙ ÅW<¤ç—¤/(5H€û*4H® p_…©ÃÕ î«Ð Uøl2¾¬BƒÔáj÷Uh:\ ྠ+ R‡«AÜW¡AªðÙ e|Y…©ÃÕ î«Ð u¸$À}¤Wƒ¸¯BƒÔàO RÄ×Uh:\ ྠ+ R‡«AÜW¡Aêp5H€û*4H>¤Œ/«¹AêìÑ m›Ð u´$°}¤Wƒ¸¯æ©²Õ eÚ7¡Aêh5H`û*4H® p_Í Rg hۄ©¢gƒ”íe¤Wƒ¸¯æ©³Gƒ´mBƒÔÑjÀöUh*|6H_VsƒÔÙ£AÚ6¡Aêh5H`û*4H® p_…©Âgƒ”ñe¤Wƒ¸¯BƒÔáj÷Uh:\ ྠ+ R…Ï)ãË*4H® p_…©ÃÕ î«Ð u¸$À}¤ +Ÿ RƗUh:\ ྠ+ R‡«AÜW¡Aêp5H€û*4H>¤Œ/«Ð u¸$À}¤Wƒ¸¯BƒÔáj÷Uh*|6H_V¡Aêp5H€û*4H® p_…©ÃÕ î«Ð 5øSƒñu¤Wƒ¸¯BƒÔáj÷Uh:\ ྠ+ R…Ï)ãË*4H® p_…©ÃÕ î«Ð u¸$À}¤ +Ÿ RƗUh:\ ྠ+ R‡«AÜW¡Aêp5H€û*4H>¤Œ/«Ð u¸$À}¤Wƒ¸¯æ©³Gƒ´mBƒTѳAÊö² + R‡«AÜWcƒÔя ோРu°$ }¤ +Ÿ RƗÕÜ uöh€¶Mh:Z ؾ + R‡«AÜWsƒTÙj2í›Ð u´$°}¤Wƒ¸¯æ©³Gƒ´mBƒTѳAÊö² + R‡«AÜW¡Aêp5H€û*4H® p_…©Âgƒ”ñe¤Wƒ¸¯BƒÔáj÷Uh:\ ྠ+ R…Ï)ãË*4H® p_…©ÃÕ î«Ð u¸$À}¤j"¾®BƒÔáj÷Uh:\ ྠ+ R‡«AÜW¡AªðÙ e|Y…©ÃÕ î«Ð u¸$À}¤Wƒ¸¯BƒTá³AÊø² + R‡«AÜW¡Aêp5H€û*4H® p_…©Âgƒ”ñe¤ØÍt ¼ Ñ =¿ û~ƒ^Ðoþ¶ÐËí°=t†i<õ½Aº¥iýRµëárþüÇ8OÔú>¾o¿®ßëæ·¼ÅW;¿åíùå†oy{ñ‚Ò·¼î«ð-o>¿å-ãË*|Ë[‡ë[Þ÷Uø–·×·¼î«ð-o®oyÜWá[Þ*|~Ë[ƗUø–·×·¼î«ð-o®oyÜWá[Þ:\ßò¸¯Â·¼Uø,,3¾¬BaÙá*,÷U(,;\…%ྠ+…e‡«°ÜW¡°¬ðYXf|Y…²ÃUXî«PXv¸ +KÀ} +ËWa ¸¯BaYá³°Ìø² +…e‡«°ÜW¡°ìp–€û*–®Âp_…²ÁŸ +ˈ¯«PXv¸ +KÀ} +ËWa ¸¯BaÙá*,÷U(,+|–_VsaÙÙ£°Ú6¡°ìh–`û*–®Âp_ͅee«°Ì´oBaÙÑ*,ÁöU(,;\…%ྚ ËÎ…%ж …eEÏÂ2ÛË*–®Âp_ͅegÂhۄ²£UX‚í«PXVø,,3¾¬æ²³Ga ´mBaÙÑ*,ÁöU(,;\…%ྠ+…e…ÏÂ2ãË*–®Âp_…²ÃUXî«PXv¸ +KÀ} +Ë +Ÿ…eƗU(,;\…%ྠ+…e‡«°ÜW¡°ìp–€û*–> ˌ/«PXv¸ +KÀ} +ËWa ¸¯BaÙá*,÷U(,+|–_V¡°ìp–€û*–®Âp_…²ÃUXî«PXVø,,3¾¬BaÙá*,÷U(,;\…%ྠ+…e‡«°ÜW¡°lð§Â2âë*–®Âp_…²ÃUXî«PXv¸ +KÀ} +Ë +Ÿ…eƗU(,;\…%ྠ+…e‡«°ÜW¡°ìp–€û*–> ˌ/«PXv¸ +KÀ} +ËWa ¸¯BaÙá*,÷U(,+|–_V¡°ìp–€û*–®Âp_ͅegÂhۄ²¢ga™íe +ËWa ¸¯Æ²£…%À_¡°ì`–@û*–> ˌ/«¹°ììQXm›PXv´ +K°} +ËWa ¸¯æ²²UXfÚ7¡°ìh–`û*–®Âp_ͅegÂhۄ²¢ga™íe +ËWa ¸¯BaÙá*,÷U(,;\…%ྠ+…e…ÏÂ2ãË*–®Âp_…²ÃUXî«PXv¸ +KÀ} +Ë +Ÿ…eƗU(,;\…%ྠ+…e‡«°ÜW¡°ìp–€û*– þTXF|]…²ÃUXî«PXv¸ +KÀ} +ËWa ¸¯BaYá³°Ìø² +…e‡«°ÜW¡°ìp–€û*–®Âp_…²Âga™ñe +ËWa ¸¯BaÙá*,÷U(,;\…%ྠ+…e…ÏÂ2ãË*–± ì +KxA£°|~Aû…exA¿¹°<_×Ûù…åxê{aù> ËÿòÓùúãÏ?®?þÇ·Èò?þ¼&–§Ë#”x²üçí/y{‰åé¶ýÚóÛ¯ÎãËÕs_^ïúãù§ûáöúå¼ ¿=‹ð×Å×ìùt8½þ +º‚ÇÓD/«;øåp».-þxq_ÝÁ·Ïåúù+è<¸¯îàÛgóv®ßöÇӈûêkü²}:—Kû¶§ _VwðíÓ9_Ú·}<¸¯îàÛ§szkßöñ4⾺ƒoŸÎñznñÇӈûêNÁ}:?®íÛ>ž&|YÝÁ·?z¿µoûxq_ÝÁGâÞá +ç÷Uç;\á<ྠ+á|…Ïp>ãË*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗUç;\á<ྠ+á|‡+œÜW!œïp…ó€û*„ó>ÃùŒ/«Îw¸ÂyÀ}ÂùW8¸¯B8ßá +ç÷Uç+|†ó_V!œïp…ó€û*„ó®pp_…p¾ÃÎî«ÎWø ç3¾¬B8ßá +ç÷Uç;\á<ྠ+á|‡+œÜW!œoð§p>âë*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗÕÎwö灶Mç;Zá<ؾ +á|‡+œÜWs8_Ù +ç3í›Îw´Ây°}ÂùW8¸¯æp¾³G8´mB8_Ñ3œÏö² +á|‡+œÜWs8ßÙ#œÚ6!œïh…ó`û*„ó>ÃùŒ/«9œïìÎm›Îw´Ây°}ÂùW8¸¯B8_á3œÏø² +á|‡+œÜW!œïp…ó€û*„ó®pp_…p¾Âg8ŸñeÂùW8¸¯B8ßá +ç÷Uç;\á<ྠ+á|…Ïp>ãË*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗUç;\á<ྠ+á|‡+œÜW!œïp…ó€û*„ó>ÃùŒ/«Îw¸ÂyÀ}ÂùW8¸¯B8ßá +ç÷Uçü)œøº +á|‡+œÜW!œïp…ó€û*„ó®pp_…p¾Âg8ŸñeÂùW8¸¯B8ßá +ç÷Uç;\á<ྠ+á|…Ïp>ãË*„ó®pp_…p¾ÃÎî«Îw¸ÂyÀ}Âù +Ÿá|ƗUç;\á<ྠ+á|‡+œÜWs8ßÙ#œÚ6!œ¯èÎg{Y…p¾ÃÎî«1œïèG8ð×Eç;Xá<о +á|…Ïp>ãËjç;{„ó@Û&„ó­pl_…p¾ÃÎî«9œ¯l…ó™öMç;Zá<ؾ +á|‡+œÜWs8ßÙ#œÚ6!œ¯èÎg{Y…p¾ÃÎî«Îw¸ÂyÀ}ÂùW8¸¯B8_á3œÏø² +á|‡+œÜW!œïp…ó€û*„ó®pp_…p¾Âg8ŸñeÂùW8¸¯B8ßá +ç÷Uç;\á<ྠ+á|ƒ?…ó_W!œïp…ó€û*„ó®pp_…p¾ÃÎî«ÎWø ç3¾¬B8ßá +ç÷Uç;\á<ྠ+á|‡+œÜW!œ¯ðÎg|Y…p¾ÃÎî«Îw¸ÂyÀ}ÂùW8¸¯B8_á3œÏø² +á|è½Ûp^ÐçŸ_Pçà ZÂù+„ó§ÏØìΏ§¾‡ó÷ÎÿÓÏýëïÿç‹Xþóo(ŸN?<ï¿ø>âûûm7–¿nßþ–Z|‰zîËk|ˏ¦þÅ J¥>à¾KýŽ~”ú]„R¿‚g©ŸéeJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ô¯ðYêg|Y…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿ÁŸJýˆ¯«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_Vs©ßÙ£ÔÚ6¡Ôïh•ú`û*”ú®Rp_Í¥~e«ÔÏ´oB©ßÑ*õÁöU(õ;\¥>ྚKýÎ¥>ж ¥~EÏR?ÛË*”ú®Rp_Í¥~gRhۄR¿£Uêƒí«PêWø,õ3¾¬æR¿³G©´mB©ßÑ*õÁöU(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_…R¿ÃUêî«PêWø,õ3¾¬B©ßá*õ÷U(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôoð§R?âë*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú>KýŒ/«Pêw¸J}À}JýW©¸¯B©ßá*õ÷U(õ+|–ú_V¡Ôïp•ú€û*”ú®Rp_Í¥~gRhۄR¿¢g©ŸíeJýW©¸¯ÆR¿£¥>À_¡Ôï`•ú@û*”ú>KýŒ/«¹ÔïìQêm›Pêw´J}°}JýW©¸¯æR¿²UêgÚ7¡Ôïh•ú`û*”ú®Rp_Í¥~gRhۄR¿¢g©ŸíeJýW©¸¯B©ßá*õ÷U(õ;\¥>ྠ+¥~…ÏR?ãË*”ú®Rp_…R¿ÃUêî«Pêw¸J}À}Jý +Ÿ¥~ƗU(õ;\¥>ྠ+¥~‡«ÔÜW¡Ôïp•ú€û*”ú þTêG|]…R¿ÃUêî«Pêw¸J}À}JýW©¸¯B©_á³ÔÏø² +¥~‡«ÔÜW¡Ôïp•ú€û*”ú®Rp_…R¿Âg©ŸñeJýW©¸¯B©ßá*õ÷U(õcrzõóýp<ñ¯nôܗt:îëáýÖozÿö›ë†Ç`]O}Ö?f°þ_þõÿûétüñ—¿ü?ÿôó¯ÿúË^÷ÏèòYzñ=ï۟~vÊue†ùµê¹//v?3|õzBfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°Âgf˜ñu5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5f†¥ýÈ ‰¶Íœ–ôÈ Éö՜–øÈ ÷՘vöÈ ö͜–ôÈ Éö՜–øÈ ÷՘–ö#3$Ú6sfØÑÊ Á^VsfXâ#3$ÜWcfXڏ̐hÛ̙aIÌl_͙a‡+3|Y™ai?2C¢m3g†%=2C²}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†®Ìðe5g†%>2CÂ}5g†%>2CÂ}5g†%>2CÂ}5g†>3̯«93,ñ‘î«93,ñ‘î«93,ñ‘î«93ìpe†€/«93,ñ‘î«93,ñ‘î«93,ñ‘î«93ìpe†€/«93,ñ‘î«93,ñ‘î«93,ñ‘î«93ìpe†€/«93,ñ‘î«93,ñ‘î«13,íGfH´mæÌ°£•‚½¬æÌ°ÄGfH¸¯¦Ì°¤¿g†]̙a Ìh_͙a‡+3|Y™ai?2C¢m3g†%=2C²}5g†%>2CÂ}5f†=2C }3g†%=2C²}5g†%>2CÂ}5f†¥ýÈ ‰¶Íœv´2C°—Õœ–øÈ ÷՜–øÈ ÷՜–øÈ ÷՜v¸2CÀ—Õœ–øÈ ÷՜–øÈ ÷՜–øÈ ÷՜v¸2CÀ—Õœ–øÈ ÷՜–øÈ ÷՜–øÈ ÷՜VøÌ 3¾®æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æ̰Õ¾¬æÌ°ÄGfH¸¯æÌ°ÄGfH¸¯æÌ0åqefH/èñܗt:íf†éýæÌðþöù‹Ê+d†ã©ï™áöç‹Wáï~ºü?¯_’»½ð·ÛÇÓ̋—ôùś»ß‘«ï‘Ì/WÏ}y½ûß#ùêõ„ï‘|YÍß#Yâã{$ ÷Õü=’%®Àp_…À³Ãxî«xVø <3¾¬BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|Y…À³Ãxî«xv¸OÀ}ÏWà ¸¯BàYá3ðÌø² +g‡+ðÜW!ðìpž€û*ž®Àp_…À³Âgà™ñeÏWà ¸¯BàÙá +<÷U<;\'ྠ+g…ÏÀ3ãË*ž®Àp_…À³Ãxî«xv¸OÀ}Ï +<#¾®BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|ÝggÀhۄÀ³£x‚í«xv¸OÀ}5ž•­À3Ó¾ gG+ðÛW!ðìpž€ûj<;{ž@Û&ž=Ïl/«xv¸OÀ}5ž=O mώVà ¶¯BàYá3ðÌø²šÏ΁'ж gG+ðÛW!ðìpž€û*ž>ό/«xv¸OÀ}ÏWà ¸¯BàÙá +<÷U<+|ž_V!ðìpž€û*ž®Àp_…À³Ãxî«xVø <3¾¬BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|Y…À³Ãxî«xv¸OÀ}ÏWà ¸¯BàYá3ðÌø² +g‡+ðÜW!ðìpž€û*ž®Àp_…À³ÁŸψ¯«xv¸OÀ}ÏWà ¸¯BàÙá +<÷U<+|ž_V!ðìpž€û*ž®Àp_…À³Ãxî«xVø <3¾¬BàÙá +<÷U<;\'ྠ+g‡+ðÜW!ð¬ðxf|Y…À³Ãxî«xv¸OÀ}5ž=O mϊžg¶—U<;\'à¾ώ~ž]„À³ƒxí«xVø <3¾¬æÀ³³Gà ´mBàÙÑ +<ÁöU<;\'ྚÏÊVà™i߄À³£x‚í«xv¸OÀ}5ž=O mϊžg¶—U<;\'ྠ+g‡+ðÜW!ðìpž€û*ž>ό/«xv¸OÀ}ÏWà ¸¯BàÙá +<÷U<+|ž_V!ðìpž€û*ž®Àp_…À³Ãxî«x6øSàñuÏWà ¸¯BàÙá +<÷U<;\'ྠ+g…ÏÀ3ãË*ž®Àp_…À³Ãxî«xv¸OÀ}Ï +ŸgƗU<;\'ྠ+g‡+ðÜW!ð Ubx çó :÷ÏðŠ–Àó +çûéð~}‡¾óñÐ#ï<=坿üáçüË/ÿþç5êÜþ÷ëöY(L`m:·Ûî×G^>“Ïo¿ïM/Q=¿ÆõçÒ/—Ãíüù—ÔõÕ¼“l›;òm{Ã>£Vɏ‡I¶ÍyÔ®•¬„6˶ m#Ï~6ʾ õl%+žÍ²mB:[É*g³l›ÐÍV²²Ù,Û&D³<›Ù(û&³•¬`6˶ ¹l%«–ͲmB+[ÉJe³l›Ê6òìd£ì›PÉV²"Ù,Û&$²•¬B6˶ }l%+Í²mBÛȳ²oB[É +c³l›ÅV²ªØ,Û&4±•¬$6˶ Al#Ï6ʾ 5l%+†Í²mB +[É*a³l›ÐÁV²2Ø,Û&D°<Ø(û&°•¬6˶ ùk%«~ͲmBûZÉJ_³l›¾òS÷šäeª×JVôšeۄ䵒U¼fÙ6¡w­då®Y¶Mˆ]y¶®QöÍ\ºVð]³ûu2×ÊUåšaۄƵ’•¸fÙ6sàÚÀê[£k‹P·V®âÖ Û&¤­•¬²5˶™»Ö +Ykv¿.BÔÚ¸³i°oBÑZÉ +Z³l›9g­àQ³f÷ë"´¬•«”5ö !k#ώ5ʾ™+Ö +kv¿.BÂZ¹*X3l›Ð¯V²òÕ,Û&Ä«<ÛÕ(û&”«•¬p5˶ Ùj%«ZͲmB³ZÉJV³l›¬6òìU£ì›P«V²bÕ,Û&¤ª•¬R5˶ j%+SͲmB¤ÚȳQ²oB¡ZÉ +T³l›§V²êÔ,Û&´©•¬45˶ aj#Ï.5ʾ Uj%+JͲmB’ZÉ*R³l›Ð£V²rÔ,Û&Ĩ<[Ô(û&”¨•¬5˶ j%«BͲmBƒZÉJP³l› òSšäeêÓJV|šeۄô´’UžfÙ6¡;­de§Y¶MˆNy6§QöM(N+YÁi–mrÓJVmšeۄִ’•šfÙ6!4mäٙFÙ7¡2­dE¦Y¶MHL+Y…i–múÒJV^šeۄ¸´‘g[e߄²´’–fÙ6!+­dU¥Y¶ÍܔVðHJ³ûu‚ÒƝ=i„}jÒJVLšeی)iå>JÒ¬~كŽ´R•‘f×6!"mäِFÙ7sAZÁ# Íî×EÈG+Wõh†mÚÑJV:šeÛÌáh«®-B5Z¹ŠF3l›ŒV²ŠÑ,ÛfîE+xä¢Ùýº±hãÎV4¾ ¥h%+ͲmB&ZɪD³l›ÐˆV²Ñ,Û&¢<ûÐ(û&Ô¡•¬84˶ ih%« ͲmBZÉÊB³l›…6òlB£ì›P„V²‚Ð,Û&䠕¬4˶ -h%+ͲmBZÈOh’—M¨@+Yh–mÐJVšeۄþ³’•fÙ6!þläÙ~FÙ7¡ü¬d…ŸY¶MÈ>+YÕg–mšÏJVò™eۄ೑gïe߄ڳ’{fÙ6!õ¬d•žY¶Mè<÷CÅ6ó̯fTžO¯&Ežû/ç7‰çõ¾ýžözƒÈs<õ¨<Ï_+ϧ/ò\KÏÃåýiáeëùþÙJ³Œ/uF€Ï¯5T€/^PÊ÷U;\% ྠ+-`‡+ÜW!¬ðÙf|Y…"°Ã•î«v¸ª@À}ºÀW¸¯BXá³ Ìø² +u`‡+ÜW!ìp‚€û*4‚®Hp_…L°Âg'˜ñeJÁW*¸¯B,Øáª÷Uè;\Á ྠ+É`…Ïf0ãË*Tƒ®lp_…p°ÃUî«Ðv¸âAÀ}òÁ +Ÿý`ƗU(;\ !ྠ+a‡«"ÜW¡#ìp…„€û*¤„ þÔF|]…š°Ã•î«v¸ŠBÀ}šÂWT¸¯BVXá³+Ìø²šËÂÎi!ж qaG«.ÛW¡/ìp†€ûjN +[a¦}*ÎVf¶¯BhØá* ÷ÕÜvöˆ ¶MÈ +zö†Ù^V¡8ìp%‡€ûjŽ;{T‡@Û&t‡­ðl_…ô°Âg{˜ñe5ׇ=òC mĎV¶¯BƒØáŠ÷UÈ+|vˆ_V¡Dìp¥ˆ€û*Ĉ®p_…±Ã$$Vøl3¾¬B•ØáÊ÷U;\e"ྠ+mb‡+NÜW!O¬ðÙ'f|Y…B±Ã•(î«)v¸*EÀ}:ÅW¨¸¯BªXá³UÌø² +µb‡+WÜW!Xìp‹€û*4‹®hp_…l±Âg·˜ñeÊÅWº¸¯B¼Øáª÷Uè;\#ྠ+ cƒ?5Œ_W¡bìpeŒ€û*„Œ®’p_…–±Ã33Vøì3¾¬BÑØáJ÷Uˆ;\U#ྠ+]c‡+lÜW!m¬ðÙ6f|Y…º±Ã•7î«8v¸ +GÀ}ÇW丯BæXá³sÌø² +¥c‡+uÜW!vìpՎ€ûjî;{@Û&$=›Çl/«P=v¸²GÀ}5†ý(þºíc+~ÚW!¬ðÙ?f|YÍdghۄ²£UA‚í«ÐAv¸BHÀ}5§•­2Ó¾ 5dG+‡ÛW!ˆìp‘€ûjn";{D‘@Û&d‘=»Èl/«PFv¸ÒHÀ}âÈW ¸¯BÙá +$÷UH$+|6’_V¡’ìpe’€û*„’®Rp_…V²ÃKKVøì%3¾¬B1ÙáJ&÷Uˆ&;\Õ$ྠ+Ýd‡+œÜW!lð§v2âë*ԓ®|p_…€²ÃUPî«ÐPv¸"JÀ}2Ê +ŸeƗU();\)%ྠ+1e‡«¦ÜW¡§ìp•€û*$•>›ÊŒ/«PUv¸²JÀ}ÂÊWY ¸¯B[ÊÀ6®„4êÊçtºìç•áýæ¾òíó‡|ßÎÐWŽ§}ååk_¹üøñmûóøç+}Z_«ÊÛçßxÝ©*·ÃùüíïåŨ羼Âõçҏ÷Ãûéó7 /^Ð üñ4â¾ú?çϦQُ‡‰öÍùr¸}Üo-ýxm_ÝÁoÛ¯›?Ú÷|<¸¯îà÷í~Ë¿=‹ð×Å×ìùt8½Û7|—ëçï:üñ4⾺ƒoŸÍÛ¹~ÛO#î«;ßU;¾Å·ÂçWg|Y…/îp};0ྠ+ßÜáú‚`À}¾"¸ÃõÁ€û*|Kp…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€ +Ÿ'2¾¬Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|Y…®€û*œèpÜWáD@‡ëDྠ+'*|žÈø² +':\'÷U8Ðá:¸¯Â‰€׉À}NTø<ñeNt¸Nî«p" Ãu"p_…®€û*œ¨ðy" ãË*œèpÜWáD@‡ëDྠ+':\'÷U8ÐàO'"¾®Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|YÍ':{œÚ6áD@GëDؾ +':\'÷Õ|" ²u" Ó¾ ':Z'ÀöU8Ðá:¸¯æ=Nm›p" ¢ç‰€l/«p" Ãu"p_Í':{œÚ6áD@GëDؾ +'*|žÈø²šOtö8´m‰€ŽÖ‰°}Nt¸Nî«p" Â牀Œ/«p" Ãu"p_…®€û*œèpÜWáD@…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€ +Ÿ'2¾¬Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|Y…®€û*œèpÜWáD@‡ëDྠ+'*|žÈø² +':\'÷U8Ðá:¸¯Â‰€׉À}N4øӉ€ˆ¯«p" Ãu"p_…®€û*œèpÜWáD@…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€ +Ÿ'2¾¬Â‰€׉À}Nt¸Nî«p" Ãu"p_…>Od|Y…®€û*œèpÜWó‰€Î'€¶M8PÑóD@¶—U8Ðá:¸¯Æý8ð×E8ÐÁ:´¯Â‰€ +Ÿ'2¾¬æ=Nm›p" £u"l_…®€ûj>PÙ:i߄­`û*œèpÜWó‰€Î'€¶M8PÑóD@¶—U8Ðá:¸¯Â‰€׉À}Nt¸Nî«p" Â牀Œ/«p" Ãu"p_…®€û*œèpÜWáD@…Ï_VáD@‡ëDྠ+':\'÷U8Ðá:¸¯Â‰€:ñuNt¸Nî«p" Ãu"p_…®€û*œ¨ðy" ãË*œèpÜWáD@‡ëDྠ+':\'÷U8PáóD@ƗU8Ðá:¸¯Â‰€׉À}N„̽=/hœx~A§·ýáýæ—í©ãù'ÆSo_Oüî§ûñÇ_>ÿ»üË/ÿþçW¡ÕÇéó'3ž°õbÀõó§…v.|ïš>èõê¹//8ôO/^PêŸ÷UèŸ:\ýྠ+ýS…Ïþ)ãË*ôO®þ p_…þ©ÃÕ?î«Ð?u¸ú'À}ú§ +ŸýSƗUèŸ:\ýྠ+ýS‡«ÜW¡êpõO€û*ôO>û§Œ/«Ð?u¸ú'À}ú§Wÿ¸¯BÿÔáêŸ÷UèŸü©Šøº +ýS‡«ÜW¡êpõO€û*ôO®þ p_…þ©Âgÿ”ñe5÷O=ú' mú§ŽVÿ¶¯BÿÔáêŸ÷ÕÜ?U¶ú§Lû&ôO­þ l_…þ©ÃÕ?êìÑ?m›Ð?Uô쟲½¬BÿÔáêŸ÷ÕÜ?uö蟀¶MèŸ:Zýؾ +ýS…Ïþ)ãËjîŸ:{ôO@Û&ôO­þ l_…þ©ÃÕ?î«Ð?UøìŸ2¾¬BÿÔáêŸ÷UèŸ:\ýྠ+ýS‡«ÜW¡ªðÙ?e|Y…þ©ÃÕ?î«Ð?u¸ú'À}ú§Wÿ¸¯BÿTá³Êø² +ýS‡«ÜW¡êpõO€û*ôO®þ p_…þ©Âgÿ”ñeú§Wÿ¸¯BÿÔáêŸ÷UèŸ:\ýྠ+ýS…Ïþ)ãË*ôO®þ p_…þ©ÃÕ?î«Ð?u¸ú'À}ú§êŸ"¾®BÿÔáêŸ÷UèŸ:\ýྠ+ýS‡«ÜW¡ªðÙ?e|Y…þ©ÃÕ?î«Ð?u¸ú'À}ú§Wÿ¸¯BÿTá³Êø² +ýS‡«ÜW¡êpõO€û*ôO®þ p_…þ©Âgÿ”ñeú§Wÿ¸¯BÿÔáêŸ÷ÕÜ?uö蟀¶MèŸ*zöOÙ^V¡êpõO€ûjìŸ:úÑ?üuú§Vÿ´¯BÿTá³Êø²šû§Îýж ýSG«ÛW¡êpõO€ûjîŸ*[ýS¦}ú§ŽVÿ¶¯BÿÔáêŸ÷ÕÜ?uö蟀¶MèŸ*zöOÙ^V¡êpõO€û*ôO®þ p_…þ©ÃÕ?î«Ð?UøìŸ2¾¬BÿÔáêŸ÷UèŸ:\ýྠ+ýS‡«ÜW¡ªðÙ?e|Y…þ©ÃÕ?î«Ð?u¸ú'À}ú§Wÿ¸¯BÿÔàOýSÄ×UèŸ:\ýྠ+ýS‡«ÜW¡êpõO€û*ôO>û§Œ/«Ð?u¸ú'À}ú§Wÿ¸¯BÿÔáêŸ÷UèŸ*|öO_V¡êpõO€û*ôO®þ p_…þ)D;mÿ/hôOÏ/ètÝïŸÂ+Zú§+ôO§Ï§.Ð?§ýÓõUÿôßþþÿ\¿ÇîípþöýŠOÌZ>ݯ—Ýòi~±^|¥ó‹õž_jøb½/(}±ྠ+_¬Wáó‹õ2¾¬Âëu¸¾Xp_…/Öëp}±ྠ+_¬×áúb=À}¾X¯Âçëe|Y…/Öëp}±ྠ+_¬×áúb=À}¾X¯ÃõÅz€û*|±^…Ï/ÖËø² +_¬×áúb=À}ÂÒWX +¸¯BXÚá +K÷UK+|†¥_V!,íp…¥€û*„¥®°p_…°´Ã–î«–Vø K3¾¬BXÚá +K÷UK;\a)ྠ+ai‡+,ÜW!,­ð–f|Y…°´Ã–î«–v¸ÂRÀ}ÂÒWX +¸¯BXÚàOaiÄ×UK;\a)ྠ+ai‡+,ÜW!,íp…¥€û*„¥>ÃҌ/«9,íì–m›–v´ÂR°}ÂÒWX +¸¯æ°´²–fÚ7!,íh…¥`û*„¥®°p_Íaig°hۄ°´¢gXšíeÂÒWX +¸¯æ°´³GX +´mBXÚÑ +KÁöUK+|†¥_VsXÚÙ#,Ú6!,íh…¥`û*„¥®°p_…°´ÂgXšñeÂÒWX +¸¯BXÚá +K÷UK;\a)ྠ+ai…Ï°4ãË*„¥®°p_…°´Ã–î«–v¸ÂRÀ}ÂÒ +ŸaiƗUK;\a)ྠ+ai‡+,ÜW!,íp…¥€û*„¥>ÃҌ/«–v¸ÂRÀ}ÂÒWX +¸¯BXÚá +K÷UK+|†¥_V!,íp…¥€û*„¥®°p_…°´Ã–î«–6øSXñuÂÒWX +¸¯BXÚá +K÷UK;\a)ྠ+ai…Ï°4ãË*„¥®°p_…°´Ã–î«–v¸ÂRÀ}ÂÒ +ŸaiƗUK;\a)ྠ+ai‡+,ÜW!,íp…¥€û*„¥>ÃҌ/«–v¸ÂRÀ}ÂÒWX +¸¯æ°´³GX +´mBXZÑ3,Íö² +ai‡+,ÜWcXÚя°ோ–v°ÂR }ÂÒ +ŸaiƗÕ–vöK¶MK;Za)ؾ +ai‡+,ÜWsXZÙ +K3í›–v´ÂR°}ÂÒWX +¸¯æ°´³GX +´mBXZÑ3,Íö² +ai‡+,ÜW!,íp…¥€û*„¥®°p_…°´ÂgXšñeÂÒWX +¸¯BXÚá +K÷UK;\a)ྠ+ai…Ï°4ãË*„¥®°p_…°´Ã–î«–v¸ÂRÀ}ÂÒ +K#¾®BXÚá +K÷UK;\a)ྠ+ai‡+,ÜW!,­ð–f|Y…°´Ã–î«–v¸ÂRÀ}ÂÒWX +¸¯BXZá3,Íø² +ai‡+,ÜW!,íp…¥€û*„¥¡‰lÃRxA#,}~A§Û~X^Ñoþb½ãíð±ýKÇS°ô6ÃÒW9éö§ñ·ÓçßÅ_sÒËyû3ýNNz¼Þ¿ý€S|yã±//oý¡ô폞ϟ¿ïÅËyA?žFÛWwðûáýôùە<¸¯¾ÆO§ÃyçsXíÇÃDûæŽ|9Ü>~<¶¯îà·íWìí{>žFÜWwðûáV¿åߞEøëâkö|:œÞí>ž&zYÝÁ·Ïå[?ÞᏧ÷Õ|û\®Ÿ¿KéðÇӈûê¾}6oçúm<¸¯îTòÛ§s¹´oûxšðeuß>ó¥}ÛÇӈûê>Ît¸Žî«pœ Ãuœp_…ã>d|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç *|'Èø² +Ç :\Ç ÷U8NÐá:N¸¯Âq‚×qÀ}ŽTøNÐÙã8ж Ç :ZÇ ÀöU8NÐá:N¸¯Âq‚ +ŸÇ 2¾¬Âq‚×qÀ}Žt¸Žî«pœ Ãuœp_…ã>d|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç *|'Èø² +Ç :\Ç ÷U8NÐá:N¸¯Âq‚×qÀ}ŽTød|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç *|'Èø² +Ç :\Ç ÷U8NÐá:N¸¯Âq‚×qÀ}ŽTød|Y…ã®ã€û*'èp'ÜWá8A‡ë8ྠ+Ç üé8AÄ×U8NÐá:N¸¯Âq‚×qÀ}Žt¸Žî«pœ Âçq‚Œ/«pœ Ãuœp_…ã®ã€û*'èp'ÜWá8A…Ïã_Vá8A‡ë8ྠ+Ç :\Ç ÷U8N +ûö8¼ qœàùÞ÷„Wô[|>~Ü~‰“<žzÇ ÞŸŽüüó_Ö"ÿxx¿¼ÏÙË·îz¼ï~×õñtØþ"tÑë{ۋôÏ}y/.|?bðêõìF Ú6óa„’‡ÈöÕ|¡ÄÇaÂ}5Fèìqhß̇JzF ÛWóa„‡÷Õt¡¤¿F øëb>ŒÐÁ:Œô²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒPáó0BÆ×Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õx¡´‡ˆ¶Í|¡¤Ça²}5F(ñqp_‡:{FÚ7óa„’‡ÈöÕ|¡ÄÇaÂ}5F(íÇa¢m3FèhF{Y͇J|F ÜWãa„Ò~F Ú6óa„’‡ÈöÕ|¡Ãuðe5F(íÇa¢m3F(éql_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„×aÀ—Õ|¡ÄÇaÂ}5F(ñqp_͇J|F ÜWóa„ +Ÿ‡2¾®æÃ%>#î«ù0B‰Ã„ûj>ŒPâã0ᾚ#t¸#¾¬æÃ%>#î«ù0B‰Ã„ûj>ŒPâã0ᾚ#t¸#¾¬æÃ%>#î«ù0B‰Ã„ûj>ŒPâã0ᾚ#t¸#¾¬æÃ%>#î«ù0B‰Ã„ûj<ŒPڏÃDÛf>ŒÐÑ:Œö²š#”ø8Œ@¸¯¦Ã%ýý0Á_óa„‡ˆöÕ|¡Ãuðe5F(íÇa¢m3F(éql_͇J|F ÜWãa„·€öÍ|¡¤Ça²}5F(ñqp_‡JûqhÛ̇:Z‡À^Vóa„‡÷Õ|¡ÄÇaÂ}5F(ñqp_͇:\‡_Vóa„‡÷Õ|¡ÄÇaÂ}5F(ñqp_͇:\‡_Vóa„‡÷Õ|¡ÄÇaÂ}5F(ñqp_͇*|FÈøºš#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B‰Ã„ûj>ŒÐá:Œø²š#”ø8Œ@¸¯æÃ%>#î«ù0B®û«Ãô‚Ï}yA§ûîa„ôŠ~óa„ûg–øw=Î"ܟÏ"ü寿üé¿üt¾þøóO§ëÿñ*¾\?ÿ!ù„ü՜·ß5ŸÞ÷n$Ì 7½ÔÙó>½Öó®¯&Õ¼QöMhy+Y)o–mBÞJVǛeۄŠ·’ñfÙ6!ámäYðFÙ7¡ß­då»Y¶Mˆw+Yín–mÊÝJV¸›eۄl·‘gµe߄f·’•ìfÙ6!Ø­dõºY¶M¨u+Y±n–mRÝFž¥n”}:ÝJV¦›eۄH·’ÕèfÙ6¡Ð­dºY¶MÈsyÖ¹QöMhs+Yin–mÂÜJV—›eۄ*·’åfÙ6!ÉmäYäFÙ7¡Ç­då¸Y¶Mˆq+Y-n–mJÜJVˆ›eۄ ·‘g…e߄·’•àfÙ6!À­dõ·Y¶M¨o+Yñm–mÒÛB~*o“¼lBw[ÉÊn³l›ÝV²šÛ,Û&·•¬à6˶ ¹m#ÏÚ6ʾ™[Û +©mv¿.Bh[¹êl3l›PÙV²"Û,ÛfNlX…mtmúÚÊU^›aۄ¸¶’ÕÖfÙ6sY[Á#¬Íî×EÈjwVµöMhj+YIm–m3µ¾Aöå×ûý5×ËÓ­º4ßÈ<>a¾‘ùú ‡odþâq¦od»Wᙞod¼WÇodvôå™þ¼ßȬàýÌ3}¬Â72;<ßÈ x¯Â72;<ßÈ x¯Â72;<7འ+ ·ÂwÃ=ãÇ*TÜOÆ x¯BÈíð”Ü€÷*´ÜOÌ x¯BέðÝsÏø± +E·Ã“tÞ«u;Üá ÄïUHľñ?VçJÜÙ+º6!wtJq°{Zq‡'¼Wç\\ÙéÅgº7¡wt’q°{¢q‡§¼WçnÜÙ+º6!WônÇgûX…zÜáÉÇïÕ9 wö*ȁ®Mhȝˆì^…Œ\á»#Ÿñcu.ɝ½Rr kbrG§&»W¡'wx‚rÀ{’r…ï¦|ƏU¨Êž¬ð^…°Üá)ËïUhËž¸ð^…¼\á»/Ÿñc +s‡'1¼W!2wx*sÀ{:s‡'4¼W!5WønÍgüX…ÚÜáÉÍïUΞâð^…æÜá‰ÎïUÈξ»ó?V¡¼W¡?wxtÀ{t…ï}ƏU¨Ðž ð^…Ýá)ÑïUhÑžð^…ÝàW=úˆŸ«P¤;ãÇ*ÔéOžx¯B îðê€÷*4êO¤x¯B¦®ðÝ©Ïø± +¥ºÃ“ªÞ««;<µ:འ+½ºÃ¬Þ«¬+|7ë3~¬Bµîðdë€÷*„ëO¹x¯Îíº³W¼tmB¾®èݯÏö± +»Ã“°Þ«cÄîèKÅðçEèØœè^…”]á»eŸñcu®Ù½rv k‚vG§h»W¡iwx¢vÀ{uÎڕ®}¦{ÊvG'm»W!nwxêvÀ{uî۝½w kwEïÆ}¶U¨ÜžÌð^…ÐÝá)ÝïUhÝžØð^…Ü]á»wŸñcŠw‡'y¼W!zwxªwÀ{ºw‡'|¼W!}WønßgüX…úÝáÉßïUàžð^…Þá‰àïUÈà ~ÕÁø¹ +%¼Ã“ÂÞ«Ã;<5<འ+=¼ÃÄÞ«Ä+|7ñ3~¬Bïðdñ€÷*„ñOx¯BïðÄñ€÷*äñ +ß}üŒ«PÈ;<‰<འ+‘¼ÃSÉÞ«Ðɵ· åáV)ÿ©Hÿv;•žèw·òïf½ÿþô­üoŸº¿´òïÿÝ©Vþ_þôö폿þó/?œ)çG-ðñ—œkã˟ãýÇoïnTó»-½š˜ÚÒë§ÚÒ/hjKïUhK¾ÛÒ?V¡-uxÚRÀ{ÚR‡§-¼W¡-uxÚRÀ{ÚR…ï¶tƏUhKž¶ð^…¶ÔáiKïUhKž¶ð^…¶Tá»-ñcÚR‡§-¼W¡-uxÚRÀ{ÚR‡§-¼W¡-UønKgüX…¶ÔáiKïUhKž¶ð^…¶ÔáiKïUhK¾ÛÒ?V¡-uxÚRÀ{ÚR‡§-¼W¡-uxÚRÀ{ÚR…ï¶tƏUhKž¶ð^…¶ÔáiKïUhKž¶ð^…¶ÔàWm鈟«Ð–:V¡-uxÚRÀ{ulK}iKþ¼m©ƒÓ–ݫЖ*|·¥3~¬Îm©³W[ +tmB[êè´¥`÷*´¥O[ +x¯Îm©²Ó–ÎtoB[êè´¥`÷*´¥O[ +x¯Îm©³W[ +tmB[ªèݖÎö± +m©ÃӖޫЖ:ÜN,‡'ú݉åÃ÷÷?³¾ÿQ}N,ק.‰åÃN,ÿ¯_ÿzV•ßîïޞ?þ>ùj½Ÿáý#oïÿ„½QU~{¼{ýÇNãó­}z¾ó­ôo/ïüñ~_<ÎôåÓh÷ê üíîõþãÏ+¿|ñ^ý¿¿¿{øö&íˇ‰îÍòãÝË÷·K_>v¯ÞÀ_>¾ÖþÌקïÕøÛ݋þ‘ÿã³^üš}¸¿»ýfàëÓD«7ð÷_——{û_ŸF¼Woàï¿.ÏLqøåӈ÷ê üý×æéAÿØ/ŸF¼Wo|ñû¯Îã£ý±¯O~¬ÞÀßuí}}ñ^½¯¯jvx¾ð^…/€vx¾ð^…/€Vø¾N0ãÇ*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«pÀá¹Nx¯Âu…ïë3~¬Âu‡ç:འ+× žë€÷*\'px®Þ«p@áû:ÁŒ«pÀá¹Nx¯Âu‡ç:འ+× žë€÷*\'Pø¾N0ãÇ*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«pÀá¹Nx¯Âuƒ_]'ñs®8<× ïU¸Nàð\'¼Wá:Ãsð^…ë +ß× füX¯8{]'º6á:£sì^…ëÏuÀ{u¾N ì\'˜éބëŽÎu°{®8<× ïÕù:³×u k®(z_'˜íc®8<× ïÕù:³×u k®8:× ÀîU¸N ð}`ƏÕù:³×u k®8:× ÀîU¸Nàð\'¼Wá:Â÷u‚?Vá:Ãsð^…ëÏuÀ{®8<× ïU¸N ð}`ƏU¸Nàð\'¼Wá:Ãsð^…ëÏuÀ{®(|_'˜ñc®8<× ïU¸Nàð\'¼Wá:Ãsð^…ë +ß× füX…ëÏuÀ{®8<× ïU¸Nàð\'¼Wá:Â÷u‚?Vá:Ãsð^…ëÏuÀ{®8<× ïU¸N`ð«ë#~®Âu‡ç:འ+× žë€÷*\'px®Þ«p@áû:ÁŒ«pÀá¹Nx¯Âu‡ç:འ+× žë€÷*\'Pø¾N0ãÇ*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«óug¯ë@×&\'Pô¾N0ÛÇ*\'px®Þ«ãuG_®üy®88× €îU¸N ð}`ƏÕù:³×u k®8:× ÀîU¸Nàð\'¼WçëÊÎu‚™îM¸Nàè\'»Wá:Ãsð^¯8{]'º6á:¢÷u‚Ù>Vá:Ãsð^…ëÏuÀ{®8<× ïU¸N ð}`ƏU¸Nàð\'¼Wá:Ãsð^…ëÏuÀ{®(|_'˜ñc®8<× ïU¸Nàð\'¼Wá:Ãsð^…뿺N0âç*\'px®Þ«pÀá¹Nx¯Âu‡ç:འ+× ¾¯Ìø± +× žë€÷*\'px®Þ«pÀá¹Nx¯Âu…ïë3~¬Âu‡ç:འ+× žë€÷*\' +{{h]'øt`¸N0<Ñï¾Npÿr÷øjÍ× ~ûÔÛºNðøù:Áo_ÿüÛWAŸ)ç÷S +O{ãëKϏÏüýÏWSayý´CaùÅM…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Baið«ÂrÄÏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñcu.,½ +K k +KG§°»W¡°tx +KÀ{u.,•Âr¦{ +KG§°»W¡°tx +KÀ{u.,½ +K k +KEïÂr¶U(,žÂð^ Kg¯ÂèڄÂÒÑ),ÁîU(,¾ Ë?VçÂÒÙ«°º6¡°tt +K°{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(, ~UXŽø¹ +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷ê\X:{–@×&–ŠÞ…ål«PX:<…%à½:–Ž¾–^„ÂÒÁ),îU(,¾ Ë?VçÂÒÙ«°º6¡°tt +K°{ +K‡§°¼WçÂRÙ),gº7¡°tt +K°{ +K‡§°¼WçÂÒÙ«°º6¡°Tô.,gûX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂÒàW…刟«PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…åPÚÂh–Ÿ:ÆÇۅåðD¿»°üxÃøíí +Ëõ©Kaù´ Ëþåç÷ÿó·ÿû—_Oúöñöòҏòp÷ôt3®Üß:>çþÖÐë¾5ô‹š¾5ð^…o ux¾5ð^…o UønZgüX…¦ÕáiZïUhZž¦ð^…¦ÕáiZïUhZ¾›Ö?V¡iuxšVÀ{šV‡§i¼W¡iuxšVÀ{šV…ï¦uƏUhZž¦ð^…¦ÕáiZïUhZž¦ð^…¦Uá»iñcšV‡§i¼W¡iuxšVÀ{šV‡§i¼W¡iUønZgüX…¦ÕáiZïUhZž¦ð^…¦ÕáiZïUhZ¾›Ö?V¡iuxšVÀ{šV‡§i¼W¡iuxšVÀ{šVƒ_5­#~®BÓêð4­€÷*4­OÓ +x¯BÓêð4­€÷*4­ +ßM댫sÓêìÕ´]›Ð´::M+ؽ +M«ÃÓ´Þ«sÓªì4­3ݛд::M+ؽ +M«ÃÓ´Þ«sÓêìÕ´]›Ð´*z7­³}¬BÓêð4­€÷êÜ´:{5­@×&4­ŽNÓ +v¯BÓªðÝ´Îø±:7­Î^M+е M«£Ó´‚ݫд:ÝnZ‡'ú½MëÇ+í¯ÙŽIëúÐ¥h}þ\´ösÞÿȯžïÿpµ}þà>Þøú÷1ðúüñ÷§óÓ­]?ÞùJú·û»÷ž=~õ4çéëó|lސï^_$üÛgÉý¼xƒ}¹{xxy•îåÃ×æ ùýäþÕþ¨/&¹6¿–ïßA¾½9øòYpkñûx÷òýMþ¯\›7ä—÷?”|—?êõa’kó†üöþg1éþ㣤~ÚûÚ|¸¿»ý&ÎëÃàöæ ùýWãå^þœ×‡I®Íòû¯Æóû¾œ|ù0ɵyC~ÿyz°?íˇI®ÍÙÿû¯Éã£üi¯ƒÜ›7äËQ'¯K ×æ|gÁÉëÌȵ9Ypòº±rmΔœ ³Ü›óy'¯ë + ×æ|[ÁÉë´ȵ9Vpòº«rmÎW”œ£ +³Ü›óI'¯‹ + ×æ|OÁÉëœȵ9Spòº¥rmΗ”œC +³Ü›ó'¯+ + ×æ|CÁÉë„ȵ9PpòºŸrmÎ×”œã ³Ü›óé'¯Ë ×æ|7ÁÉëlȵ9Mpòº™rmΔœƒ ³Ü›ó¹'¯k ×æ|+ÁÉëTȵ9Jpòº“rmÎW”œ# ³Ü›ó‰'¯ ×æ|ÁÉë<ȵ9GpòºrmΗŒ¼#Œò±9ŸEpòºŠrmÎ7œ¼N"€\›óA'¯{ ×æ| AÉ9†0˽9žBpð帟ç;Î]g®Íù‚“× ks¼€ àuavkq>àÜuýàڜo8y>¹6ÇþÜ=÷óâ|õ@¹9z0ý9ŸP0ÊÇæ|žÀÉë:ȵ9ß&pò:Mrm· œ¼î€\›óU%ç(Á,÷æ|’ÀÉë"ȵ9ß#pò:GrmÎÇœ¼n€\›ó%%çÁ,÷æ|†ÀÉë +ȵ9ß pò:ArmÎœ¼î€\›óõ%çøÀ,÷æ|zÀÉëòȵ9ßpò:;rmŽG|¹9îçÅùâ€rsp`†{s>7àäumäڜn 8÷·S ~ڛ 8uÝ·6ç+JΑYîÍñĀƒ/Àý¼8ßpî:/pmÎÇœ¼n €\›ãe¯Ã³[‹óY箫×æ|SÀÉë¤Èµ9pð垸ŸçkÊÍ1îÍù”€“×%ks¾#àäuFäڜ8yݹ6ç J΁YîÍù|€“×õks¾àäu:äڜ8yÝ ¹6ç«JÎрYîÍùd€“×Őks¾àäu.äڜ8yÝ +¹6çKFއFù؜Ï8y] ¹6çN^'@®Íù@€“×}ks¾ ä˜åޜO8y]¹6ç»N^g@®Íù(€“×Mks¾ ä˜åޜÏ8y]¹6ç[N^§@®ÍùÀ˜³«;ð4—}ªíŸo^çwxÿmáûoV^à +ÀúÔå ÀËÕ€¿þò¯?þÓϟûåÿùÓ÷?þ¯ó(ÀGøúø‘y\Yç÷[?¾<Üú1^u€ããîðúy‡ð‹šR@À{b@‡§¼W¡tx‚@À{’@…ï&pƏU¨ž,ð^…0Ðá)ïUhž8ð^…V¡|txÒGÀ{uŒ}©þ¼ý£ƒ@Ý«@*|73~¬Î¤³W tmBé蔐`÷*´O x¯Î9¤²ÓCÎtoBéè$‘`÷*D‘O x¯Î]¤³W tmB©èÝFÎö± +u¤Ã“GÞ«H:<…$འ+¤ÃIÞ«I*|w’3~¬B)é𤒀÷*ĒO- x¯B/éð“€÷*$“ +ßÍ䌫PM:<Ù$འ+á¤ÃSNÞ«ÐN:<ñ$འ+ù¤Á¯úÉ?W¡ txJÀ{"J‡§¢¼W¡£txBJÀ{RJ…ï–rƏU¨)žœð^… Òá)*ïUh*ž¨ð^…¬RừœñcÊJ‡'­¼W!®txêJÀ{úÊ¡ ´%<Ð*,?•Œ/·Ë቎Æò˗÷?>ÝCc¹>ui,_§Æò_þôöíÿñï?¾Š½>þ¦õJ<ž÷ïÿµ¸QZîük|è]?õ}ñ@Sþ5ãÇ*ä_Oþx¯Bþåðä_€÷*ä_Oþx¯Bþ¥ðÍø± +ù—ÓÞ«9<ùའ+ù—ÓÞ«)|ç_3~¬Bþåðä_€÷*ä_Oþx¯Bþåðä_€÷*ä_ +ßù׌«9<ùའ+ù—ÓÞ«9<ùའ+ù—Á¯ò¯?W!ÿrxò/À{ò/‡'ÿ¼W!ÿrxò/À{ò/…ïükƏÕ9ÿröÊ¿€®MÈ¿ü ì^…üËáÉ¿ïÕ9ÿRvò¯™îMÈ¿ü ì^…üËáÉ¿ïÕ9ÿröÊ¿€®MÈ¿½ó¯Ù>V!ÿrxò/À{uò/ kò/G'ÿ»W!ÿRøοfüXó/g¯ü èڄüËÑÉ¿ÀîUÈ¿žü ð^…üKá;ÿšñcò/‡'ÿ¼W!ÿrxò/À{ò/‡'ÿ¼W!ÿRøοfüX…üËáÉ¿ïUÈ¿žü ð^…üËáÉ¿ïUÈ¿¾ó¯?V!ÿrxò/À{ò/‡'ÿ¼W!ÿrxò/À{ò/…ïükƏUÈ¿žü ð^…üËáÉ¿ïUÈ¿žü ð^…üKá;ÿšñcò/‡'ÿ¼W!ÿrxò/À{ò/‡'ÿ¼W!ÿ2øUþ5âç*ä_Oþx¯Bþåðä_€÷*ä_Oþx¯Bþ¥ðÍø± +ù—ÓÞ«9<ùའ+ù—ÓÞ«)|ç_3~¬Bþåðä_€÷*ä_Oþx¯Bþåðä_€÷*ä_ +ßù׌«9<ùའ+ù—ÓÞ«sþåì•]›)zç_³}¬Bþåðä_€÷ê˜9ú’üyò/'ÿºW!ÿRøοfüXó/g¯ü èڄüËÑÉ¿ÀîUÈ¿žü ð^ó/e'ÿšéބüËÑÉ¿ÀîUÈ¿žü ð^ó/g¯ü èڄüKÑ;ÿšícò/‡'ÿ¼W!ÿrxò/À{ò/‡'ÿ¼W!ÿRøοfüX…üËáÉ¿ïUÈ¿žü ð^…üËáÉ¿ïUÈ¿¾ó¯?V!ÿrxò/À{ò/‡'ÿ¼W!ÿrxò/À{ò/ƒ_å_#~®Bþåðä_€÷*ä_Oþx¯Bþåðä_€÷*ä_ +ßù׌«9<ùའ+ù—ÓÞ«9<ùའ+ù—Âwþ5ãÇ*ä_Oþx¯Bþåðä_€÷*ä_c®äò/x •}Š¬^oç_Ãýî¯Ø{¾¿{~{x…ük}ê’½Uþõ¿ÿÛßþùß~þò矿üúogöõþ;ö׏O~e?ɼˆx+üÊ7ž»¿ñìúy‡o<û⁦o<¼WáÏžä ð^…äMá;y›ñc’7‡'y¼W!ysx’7À{’7‡'y¼W!ySøNÞfüX…äÍáIÞïUHÞžä ð^…äÍáIÞïUHÞ¾“·?V!ysx’7À{’7‡'y¼W!ysx’7À{’7…ïämƏUHÞžä ð^…äÍáIÞïUHÞžä ð^…äÍàWÉۈŸ«¼9<Éའ+ɛÓ¼Þ«¼9<Éའ+ɛÂwò6ãÇꜼ9{%o@×&$oŽNòv¯Bòæð$o€÷Ꜽ);ÉÛL÷&$oŽNòv¯Bòæð$o€÷Ꜽ9{%o@×&$oŠÞÉÛl«¼9<Éà½:'oÎ^Éе ɛ£“¼Ý«¼)|'o3~¬Îɛ³WòtmBòæè$o`÷*$oOòx¯Bò¦ð¼Íø± +ɛÓ¼Þ«¼9<Éའ+ɛÓ¼Þ«¼)|'o3~¬Bòæð$o€÷*$oOòx¯Bòæð$o€÷*$o +ßÉی«¼9<Éའ+ɛÓ¼Þ«¼9<Éའ+ɛÂwò6ãÇ*$oOòx¯Bòæð$o€÷*$oOòx¯Bò¦ð¼Íø± +ɛÓ¼Þ«¼9<Éའ+ɛÓ¼Þ«¼ü*yñs’7‡'y¼W!ysx’7À{’7‡'y¼W!ySøNÞfüX…äÍáIÞïUHÞžä ð^…äÍáIÞïUHÞ¾“·?V!ysx’7À{’7‡'y¼W!ysx’7À{’7…ïämƏUHÞžä ð^…äÍáIÞïÕ9ysöJހ®MHÞ½“·Ù>V!ysx’7À{uLÞ}IÞþ¼ɛƒ“¼Ý«¼)|'o3~¬Îɛ³WòtmBòæè$o`÷*$oOòx¯Îɛ²“¼ÍtoBòæè$o`÷*$oOòx¯Îɛ³WòtmBò¦è¼Íö± +ɛÓ¼Þ«¼9<Éའ+ɛÓ¼Þ«¼)|'o3~¬Bòæð$o€÷*$oOòx¯Bòæð$o€÷*$o +ßÉی«¼9<Éའ+ɛÓ¼Þ«¼9<Éའ+ɛÁ¯’·?W!ysx’7À{’7‡'y¼W!ysx’7À{’7…ïämƏUHÞžä ð^…äÍáIÞïUHÞžä ð^…äMá;y›ñc’7‡'y¼W!ysx’7À{’·1ÔrÉ<ÐJÞ>…eo·“·á‰~wòöøöþ›÷?ªÏÉÛúÔ%yû^ÉÛñøÇ¿>yþøßÕÕüW•Ûëͯ7ûöx÷úWœÆ\ûô€çkéß^î>þÆï‹Çù‚¾|í^½¿Ý½ÞüÅá—O#Þ«_ã÷÷wÿ>Eٗݛ7äÇ»—ïo/–¾|í^½¿¼ÿžý»ý™¯O#Þ«7ð÷ÿTÿÈÿñY„?/~Í>ÜßÝ¿~³?ðõi¢Õøû¯Ë˽ý¯O#Þ«7ð÷_—ç?§8üòiÄ{õþþŸ>=èûåӈ÷ê×øãû¯Îã£ý±¯O~¬ÞÀßuí}}ñ^½¿ÿêÜ?Ùûú4â½zÿO¿=?XüòiÄ{õküéþîÛ÷gûc_Ÿ&üX½?¾ÿÖãÅþØקïÕøËÝ·×Wûc_ŸF¼WoàowÏ/¯úÇ~ù4â½z£“ÿÕ¹õû©/:ù˧ ?Voà됀Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O`ð«ó#~®Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«óyg¯ó@×&œ'pt΀ݫpžÀá9Ox¯Îç ”ó3ݛpžÀÑ9Ov¯Ây‡ç<à½:Ÿ'pö:OtmÂyEïó³}¬Ây‡ç<à½:Ÿ'pö:OtmÂyGç<ؽ +ç ¾ÏÌø±:Ÿ'pö:OtmÂyGç<ؽ +ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ~už`ÄÏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{u>OàìužèڄóŠÞç fûX…óÏyÀ{uO0ÛÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pžÀàWç Fü\…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…ócaïÎÀ­óŸŽ|¿}ž`x¢ã<Á3œ'xÿi¼¼¾ÿ÷`>O°>õÛy‚Çoužà_þôö폿þÓ¯ùñ÷/Sηwi¯¤~ž‡»§ûû›— +va9>ì.,¯Ÿv(,¿x ©°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(, ~UXŽø¹ +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Î…¥³Wa tmBaéè–`÷*–Oa x¯Î…¥²SXÎtoBaéè–`÷*–Oa x¯Î…¥³Wa tmBa©è]XÎö± +…¥ÃSXÞ«saéìUX]›PX::…%ؽ +…¥Âwa9ãÇê\X:{–@×&–ŽNa v¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Baéð–€÷*– +߅匫PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Á¯ +Ë?W¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^ Kg¯ÂèڄÂRÑ»°œíc +K‡§°¼WÇÂÒїÂàϋPX:8…%н +…¥Âwa9ãÇê\X:{–@×&–ŽNa v¯Baéð–€÷ê\X*;…åL÷&–ŽNa v¯Baéð–€÷ê\X:{–@×&–ŠÞ…ål«PX:<…%འ+…¥ÃSXÞ«PX:<…%འ+…¥Âwa9ãÇ*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PXüª°ñs +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°Tø.,güX…ÂÒá),ïU(,žÂð^…ÂÒá),ïU(,¾ Ë?V¡°tx +KÀ{ +K‡§°¼W¡°Ê@[X­Âòú¿Ý.,‡'úÝ_}ÿñÛé·'(,ק.…åý*,ÿ×Ïÿñ¿ýÿú?¿üâáçstµÿEWùtë§wõ•Àã#~Æá+¿x é+ïÕñ+}ùJ`€?/ÂW+x%ðL«ð•ÀÏWÞ«ð•ÀÏWÞ«ð•ÀÏWÞ«ð•À +ß_ <ãÇ*|%°Ãó•À€÷*|%°Ãó•À€÷*|%°Ãó•À€÷*|%°Âw°>ãÇ*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:འ+ÁºÃ¬Þ«¬+|ë3~¬B°îðë€÷*ëO°x¯B°îðë€÷*ë +ßÁúŒ«¬;<Á:འ+ÁºÃ¬Þ«¬;<Á:འ+ÁºÂw°>ãÇ*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:འ+ÁºÃ¬Þ«¬ü*Xñs‚u‡'X¼W!Xwx‚uÀ{‚u‡'X¼W!XWøÖgüXƒug¯`èڄ`ÝÑ ÖÁîUÖž`ð^ƒue'XŸéބ`ÝÑ ÖÁîUÖž`ð^ƒug¯`èڄ`]Ñ;XŸíc‚u‡'X¼Wç`ÝÙ+Xº6!Xwt‚u°{‚u…ï`}ƏÕ9Xwö +ց®M֝`ì^…`Ýá ÖïUÖ¾ƒõ?V!Xwx‚uÀ{‚u‡'X¼W!Xwx‚uÀ{‚u…ï`}ƏUÖž`ð^…`Ýá ÖïUÖž`ð^…`]á;XŸñc‚u‡'X¼W!Xwx‚uÀ{‚u‡'X¼W!XWøÖgüX…`Ýá ÖïUÖž`ð^…`Ýá ÖïUÖ¾ƒõ?V!Xwx‚uÀ{‚u‡'X¼W!Xwx‚uÀ{‚uƒ_ë#~®B°îðë€÷*ëO°x¯B°îðë€÷*ë +ßÁúŒ«¬;<Á:འ+ÁºÃ¬Þ«¬;<Á:འ+ÁºÂw°>ãÇ*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:à½:ëÎ^Á:е Áº¢w°>ÛÇ*ëO°x¯ŽÁº£/Á:ÀŸ!Xwp‚u {‚u…ï`}ƏÕ9Xwö +ց®M֝`ì^…`Ýá ÖïÕ9XWv‚õ™îM֝`ì^…`Ýá ÖïÕ9Xwö +ց®MÖ½ƒõÙ>V!Xwx‚uÀ{‚u‡'X¼W!Xwx‚uÀ{‚u…ï`}ƏUÖž`ð^…`Ýá ÖïUÖž`ð^…`]á;XŸñc‚u‡'X¼W!Xwx‚uÀ{‚u‡'X¼W!X7øU°>âç*ëO°x¯B°îðë€÷*ëO°x¯B°®ð¬Ïø± +ÁºÃ¬Þ«¬;<Á:འ+ÁºÃ¬Þ«¬+|ë3~¬B°îðë€÷*ëO°x¯B°>$×6X‡ZÁúõMÁúðD¿7Xwï^__ç^}}蒫?\rõÿü×?ÿëÿüë/ÿùüéáù?þtÿüÇÿ8[í÷ã·Ç×?\Aý4ôËãÍpý·€{|Ðˇ®Ÿóv¾ýœ õöìöæÜn;y¥Û ×æn;yuÛ ×æ\m;yEÛ ×æœl+9Åö,÷æÜk;yåÚ ×æk;yµÚ ×æ\j;y…Ú ×æœi+9•ö,÷æÜh;y%Ú ×æh;yõÙ ×æ\g;yÅÙ ×æœf+9eö,÷æÜe;yeÙ ×æe;y5Ù ×æ\d;yÙ ×æœc+95ö,÷æÜb;y¥Ø ×æb;yuØ ×æ\a;yEØ ×æœ`+9ö,÷æÜ_;yå× ×æ_;yµ× ×æ\^;y…× ×æœ]+9Õõ,÷æÜ\;y%× ×æ\;yõÖ ×æ\[;yÅÖ ×æœZ+9¥õ,÷æÜY;yeÖ ×æY;y5Ö ×æ\X;yÖ ×æœWy×Õ£|lÎmµ“WZ rmÎaµ“WW rmÎUµ“WT rmÎIµ’STÏroŽ=µƒ/95¸Ÿç˜Ú¹«¥¸6ç’ÚÉ+¤¹6njZÁ«¢žÝZœj箄àڜj'¯~äÚëi_âip?/Îé´rSNÏpoÎÝ´“W6 rmŽÑ´ƒ/Í4¸ŸçbÚ¹+˜¸6ç\ZÉ©¥g¹7ÇVÚÁ—TÜϋs(íÜÕI\›s%íäIƒ\›s"­äҳܛsíä•Gƒ\›síäÕFƒ\›síäFƒ\›s­äTѳܛsíä•Dƒ\›síäÕCƒ\›s íäCƒ\›s +­ä”гܛsíä•Aƒ\›síäÕ@ƒ\›síä@ƒ\›sþ¬äÔϳܛsûìä•>ƒ\›søìäÕ=ƒ\›sõìä=ƒ\›sò¬äϳܛsïìä•;ƒ\›sììäÕ:ƒ\›séìä:ƒ\›sælä]9ò±97ÎN^‰3ȵ9ÎN^}3ȵ9×ÍN^q3ȵ9§ÍJNÙ<˽9wÍN^Y3ȵ9GÍN^M3ȵ9ÍN^A3ȵ9çÌJNÍ<˽9·ÌN^)3ȵ9‡ÌN^3ȵ9WÌN^3ȵ9'ÌJNÁ<˽9÷ËN^ù2ȵ9ÇËN^í2ȵ9–˾„Ëà~^œ³eå¦Zžáޜ›e'¯däڜ‚eçþÖ+ƒúio®•ºbepksN••œRy–{sì”|ɔÁý¼8GÊÎ]2Àµ9ÊN^2ȵ9æÉ +^uòìÖâÜ&;w¥É×æ&;yuÉ ×æX%;ø%ƒûyqN’•›"y†{s¼rdksŽ‘¼Zdks.‘¼Bdksΐ•œ +y–{sn¼dks¼úcks®¼âcksN•œòx–{s¼²cksŽŽ¼šcks.Ž¼‚cks΍¼kãQ>6çÖØÉ+5¹6çÐØÉ«3¹6çÊØÉ+2¹6çÄXÉ)Œg¹7ç¾ØÉ+/¹6ç¸ØÉ«-¹6ç²ØÉ+,¹6ç¬XÉ©Šg¹7ç¦ØÉ+)¹6ç ØÉ«'¹6çšxÈ`eL OsùØõÓ<ÞßL‰‡Ç9Jâg(‰ß^Þÿÿü )ñúÔ¥%~\-ñ¯¿þüo?~þÓ¯ùñ_~üüó/ýûY }¿{zúxMç +:Sâ—û§ï·R⇍Ϻë°ë‡ò°/hêÃïU(ÄžD ð^…HÌá©ÄïUèľC±?V!sxZ1À{j1‡'¼W!sxŠ1À{š1…ïhlƏUÈÆžn ð^…rÌáIÇïUˆÇžz ð^…~Lá; ›ñc2‡§!¼W¡"sx22À{B2‡§$¼W¡%SøŽÉfüX…œÌáéÉïU(Êž¤ ð^…¨Ìá©ÊïUèÊ ~–ø¹ +i™ÃӖÞ«P—9V¡ptx +GÀ{u.½ +G k +GG§p»W¡pTø.güX Gg¯ÂèڄÂÑÑ)ÁîU(žÂð^…ÂQá»pœñc +G‡§p¼W¡ptx +GÀ{ +G‡§p¼W¡pTø.güX…ÂÑá)ïU(žÂð^…ÂÑá)ïU(¾ Ç?V¡ptx +GÀ{ +G‡§p¼W¡ptx +GÀ{ +G…ïÂqƏU(žÂð^…ÂÑá)ïU(žÂð^…ÂQá»pœñc +G‡§p¼W¡ptx +GÀ{ +G‡§p¼W¡p4øUá8âç*ŽOáx¯BáèðŽ€÷*ŽOáx¯Bá¨ð]8Îø± +…£ÃS8Þ«P8:<…#འ+…£ÃS8Þ«P8*|Ž3~¬BáèðŽ€÷*ŽOáx¯BáèðŽ€÷*Ž +߅㌫P8:<…#འ+…£ÃS8Þ«sáèìU8]›P8*zŽ³}¬BáèðŽ€÷êX8:úR8üy +G§pºW¡pTø.güX Gg¯ÂèڄÂÑÑ)ÁîU(žÂð^ Ge§pœéބÂÑÑ)ÁîU(žÂð^ Gg¯ÂèڄÂQÑ»pœíc +G‡§p¼W¡ptx +GÀ{ +G‡§p¼W¡pTø.güX…ÂÑá)ïU(žÂð^…ÂÑá)ïU(¾ Ç?V¡ptx +GÀ{ +G‡§p¼W¡ptx +GÀ{ +Gƒ_Ž#~®BáèðŽ€÷*ŽOáx¯BáèðŽ€÷*Ž +߅㌫P8:<…#འ+…£ÃS8Þ«P8:<…#འ+…£Âwá8ãÇ*ŽOáx¯BáèðŽ€÷*ŽCœg Gx U8^?ÐããíÂqx¢ß]8¾ÿÙíûÃÃ+ŽëS—Âñùªpü¿ÿý/þùã㏷Áß?÷òñ§+ãü >ü–öFÞøørwÿ? ™Ï}zÎóíôÇ·÷çy~øò¾À/ŸF¼Woä÷wß¾üãEáëӄ«7ðÕ:~|_<ÎôåÓh÷ꍠõþîþññQâëӄ«7ðÇ÷ŸòÇo(~ù4â½z_ůÃÓÞ«Ð;<1འ+±ÂwG<ãÇ*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1འ+±ÃÓÞ«Ð+|wÄ3~¬BGìðtĀ÷*tÄOG x¯BGìðtĀ÷*tÄ +ßñŒ«Ð;<1འ+±ÃÓÞ«Ð;<1འ+±ÂwG<ãÇ*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1འ+±ÃÓÞ«Ðüª#ñs:b‡§#¼W¡#vx:bÀ{:b‡§#¼W¡#VøîˆgüX;bg¯ŽèڄŽØÑéˆÁîU舞Žð^;be§#žéބŽØÑéˆÁîU舞Žð^;bg¯ŽèڄŽXÑ»#žíc:b‡§#¼WçŽØÙ«#º6¡#vt:b°{:b…ïŽxƏչ#vöꈁ®M舝Žì^…ŽØáéˆïU舾;â?V¡#vx:bÀ{:b‡§#¼W¡#vx:bÀ{:b…ïŽxƏU舞Žð^…ŽØáéˆïU舞Žð^…ŽXá»#žñc:b‡§#¼W¡#vx:bÀ{:b‡§#¼W¡#VøîˆgüX…ŽØáéˆïU舞Žð^…ŽØáéˆïU舾;â?V¡#vx:bÀ{:b‡§#¼W¡#vx:bÀ{:bƒ_uÄ#~®BGìðtĀ÷*tÄOG x¯BGìðtĀ÷*tÄ +ßñŒ«Ð;<1འ+±ÃÓÞ«Ð;<1འ+±ÂwG<ãÇ*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1à½:wÄÎ^1е ±¢wG<ÛÇ*tÄOG x¯Ž±£/1ÀŸ¡#vp:b {:b…ïŽxƏչ#vöꈁ®M舝Žì^…ŽØáéˆïÕ¹#Vv:â™îM舝Žì^…ŽØáéˆïÕ¹#vöꈁ®M舽;âÙ>V¡#vx:bÀ{:b‡§#¼W¡#vx:bÀ{:b…ïŽxƏU舞Žð^…ŽØáéˆïU舞Žð^…ŽXá»#žñc:b‡§#¼W¡#vx:bÀ{:b‡§#¼W¡#6øUG<âç*tÄOG x¯BGìðtĀ÷*tÄOG x¯BG¬ðÝÏø± +±ÃÓÞ«Ð;<1འ+±ÃÓÞ«Ð+|wÄ3~¬BGìðtĀ÷*tÄOG x¯BGß'úÝßNûøü¿AG¼>uéˆ_¿êˆÿåOoßþøÿþã¿þí×ÿ÷VZüýíîéñãßl\±ýpïyx¸ñC½zm{|òýÚöõ£¯mñ@Ókۀ÷*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶­ðýÚöŒ«ókÛÎ^¯m]›ðÚ¶£óÚ6ؽ +¯m;<¯mÞ«ókÛÊÎkÛ3ݛðÚ¶£óÚ6ؽ +¯m;<¯mÞ«ókÛÎ^¯m]›ðÚ¶¢÷kÛ³}¬ÂkÛÏkۀ÷êüÚ¶³×kÛ@×&¼¶í輶 v¯ÂkÛ +߯mÏø±:¿¶íìõÚ6е ¯m;:¯mƒÝ«ðÚ¶ÃóÚ6འ+¯m+|¿¶=ãÇ*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛ +߯mÏø± +¯m;<¯mÞ«ðÚ¶ÃóÚ6འ+¯m;<¯mÞ«ðÚ¶Â÷kÛ3~¬ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶­ðýÚöŒ«ðÚ¶ÃóÚ6འ+¯m;<¯mÞ«ðÚ¶ÃóÚ6འ+¯m+|¿¶=ãÇ*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛ¿zm{ÄÏUxmÛáymð^…׶ž×¶ïUxmÛáymð^…׶¾_۞ñc^Ûvx^Û¼Wáµm‡çµmÀ{^Ûvx^Û¼Wáµm…ï׶güX…׶ž×¶ïUxmÛáymð^…׶ž×¶ïUxm[áûµí?Váµm‡çµmÀ{^Ûvx^Û¼Wç׶½^Ûº6áµmEï׶gûX…׶ž×¶ïÕñµmG_^Ûøó"¼¶í༶ t¯ÂkÛ +߯mÏø±:¿¶íìõÚ6е ¯m;:¯mƒÝ«ðÚ¶ÃóÚ6à½:¿¶­ì¼¶=Ó½ ¯m;:¯mƒÝ«ðÚ¶ÃóÚ6à½:¿¶íìõÚ6е ¯m+z¿¶=ÛÇ*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛ +߯mÏø± +¯m;<¯mÞ«ðÚ¶ÃóÚ6འ+¯m;<¯mÞ«ðÚ¶Â÷kÛ3~¬ÂkÛÏkۀ÷*¼¶í𼶠x¯ÂkÛÏkۀ÷*¼¶mð«×¶Gü\…׶ž×¶ïUxmÛáymð^…׶ž×¶ïUxm[áûµí?Váµm‡çµmÀ{^Ûvx^Û¼Wáµm‡çµmÀ{^ÛVø~m{ƏUxmÛáymð^…׶ž×¶ïUxm{xÃؾ¶ ´^Û¾~ Ç—Û¯mOô»_Û~ÿ¥xÿ_À¼¶½>uymûmzmûü>–§»‡oÿÎôÊ:¿êíõñæ×@í/ˆwAÌõó_óÅM_x¯ÂÄ(|Ǎ«ð1ÏÄÞ«ð1ÏÄÞ«ð1ÏÄÞ«ð1 +ß_3ãÇ*|AŒÃó1€÷*|AŒÃó1€÷*|AŒÃó1€÷*|AŒÂ÷ÄÌø± +_ãð|A འ+_ãð|A འ+_ãð|A འ+_£ðý13~¬ÂÄ8<_x¯ÂÄ8<_x¯ÂÄ8<_x¯ÂÄ(|Ǎ«ð1ÏÄÞ«ð1ÏÄÞ«ð1ÏÄÞ«ð1¿* Gü\…ÒÐá) ïU( žÒð^…ÒÐá) ïU( ¾KÃ?VçÒÐÙ«4º6¡4ttJC°{JC‡§4¼WçÒPÙ) gº7¡4ttJC°{JC‡§4¼WçÒÐÙ«4º6¡4Tô. gûX…ÒÐá) ïÕ¹4tö* ®M( Òì^…ÒPá»4œñcu. ½JC kJCG§4»W¡4txJCÀ{JC…ïÒpƏU( žÒð^…ÒÐá) ïU( žÒð^…ÒPá»4œñcJC‡§4¼W¡4txJCÀ{JC‡§4¼W¡4Tø. güX…ÒÐá) ïU( žÒð^…ÒÐá) ïU( ¾KÃ?V¡4txJCÀ{JC‡§4¼W¡4txJCÀ{JC…ïÒpƏU( žÒð^…ÒÐá) ïU( žÒð^…ÒÐàW¥áˆŸ«P:<¥!འ+¥¡ÃSÞ«P:<¥!འ+¥¡Âwi8ãÇ*”†Oix¯Biè𔆀÷*”†Oix¯Bi¨ð]Îø± +¥¡ÃSÞ«P:<¥!འ+¥¡ÃSÞ«P*|—†3~¬Biè𔆀÷*”†Oix¯Î¥¡³WitmBi¨è]Îö± +¥¡ÃSÞ«cièèKiðçE( œÒè^…ÒPá»4œñcu. ½JC kJCG§4»W¡4txJCÀ{u. •Òp¦{JCG§4»W¡4txJCÀ{u. ½JC kJCEïÒp¶U( žÒð^…ÒÐá) ïU( žÒð^…ÒPá»4œñcJC‡§4¼W¡4txJCÀ{JC‡§4¼W¡4Tø. güX…ÒÐá) ïU( žÒð^…ÒÐá) ïU( ~UŽø¹ +¥¡ÃSÞ«P:<¥!འ+¥¡ÃSÞ«P*|—†3~¬Biè𔆀÷*”†Oix¯Biè𔆀÷*”† +ߥጫP:<¥!འ+¥¡ÃSÞ«P}œ- áVixý@Si8<ÑQ>CiøíûÝýýËw( ק.¥á÷O¥áþõןÿüóÏ?ÏÆðñþý·N©}¥|ñ}0Oï?æáããÝËÃ?þ™9>h>÷éIÏ÷Ó_Þÿӏ?6}ñ@_à—O#Þ«7𷻗oÏ¿|ñ^½QWÞß}ûþü]âëӄ«7ðÇ»ç·ûc_ŸF¼Woà+?ux¢VÀ{¢V‡'j¼W!jUøŽZgüX…¨Õá‰ZïUˆZž¨ð^…¨Õá‰ZïUˆZ¾£Ö?V!jux¢VÀ{¢V‡'j¼W!jux¢VÀ{¢V…ï¨uƏUˆZž¨ð^…¨Õá‰ZïUˆZž¨ð^…¨Uá;jñc¢V‡'j¼W!jux¢VÀ{¢V‡'j¼W!jUøŽZgüX…¨Õá‰ZïUˆZž¨ð^…¨Õá‰ZïUˆZ ~µŽø¹ +Q«ÃµÞ«µ:þã7!wo×OõøíÓS}ÿÇÓÇol~ûÔÇCýòË/7Ÿêjm‰ÿ?ZŸ6endstream +endobj +521 0 obj << +/Type /Page +/Contents 522 0 R +/Resources 520 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 524 0 R 528 0 R 529 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R ] +>> endobj +524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.5554 685.0373 184.5772 694.0135] +/Subtype /Link +/A << /S /GoTo /D (0:Introduction) >> +>> endobj +528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 685.0373 538.9788 694.0135] +/Subtype /Link +/A << /S /GoTo /D (0:Introduction) >> +>> endobj +529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 669.7148 221.1101 678.5614] +/Subtype /Link +/A << /S /GoTo /D (0:Authentication) >> +>> endobj +533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 669.7148 538.9788 678.5614] +/Subtype /Link +/A << /S /GoTo /D (0:Authentication) >> +>> endobj +534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 656.7633 184.5875 665.61] +/Subtype /Link +/A << /S /GoTo /D (0:Roles) >> +>> endobj +535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 656.7633 538.9788 665.61] +/Subtype /Link +/A << /S /GoTo /D (0:Roles) >> +>> endobj +536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 643.8119 187.3568 652.6585] +/Subtype /Link +/A << /S /GoTo /D (0:Filters) >> +>> endobj +537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 643.8119 538.9788 652.6585] +/Subtype /Link +/A << /S /GoTo /D (0:Filters) >> +>> endobj +538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 630.8605 223.6007 639.7071] +/Subtype /Link +/A << /S /GoTo /D (0:90) >> +>> endobj +539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 630.8605 538.9788 639.7071] +/Subtype /Link +/A << /S /GoTo /D (0:90) >> +>> endobj +540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.5554 615.4981 234.0115 624.4743] +/Subtype /Link +/A << /S /GoTo /D (0:Methods) >> +>> endobj +541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 615.4981 538.9788 624.4743] +/Subtype /Link +/A << /S /GoTo /D (0:Methods) >> +>> endobj +542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 598.1183 231.372 609.0222] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressType) >> +>> endobj +543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 598.1183 538.9788 609.0222] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressType) >> +>> endobj +544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 585.1668 274.2907 596.0708] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressTypeToAddress) >> +>> endobj +545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 585.1668 538.9788 596.0708] +/Subtype /Link +/A << /S /GoTo /D (0:AddAddressTypeToAddress) >> +>> endobj +546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 574.2727 218.3506 583.1193] +/Subtype /Link +/A << /S /GoTo /D (0:AddBootState) >> +>> endobj +547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 574.2727 538.9788 583.1193] +/Subtype /Link +/A << /S /GoTo /D (0:AddBootState) >> +>> endobj +548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 561.3213 214.4752 570.1679] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFile) >> +>> endobj +549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 561.3213 538.9788 570.1679] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFile) >> +>> endobj +550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 546.3125 271.7802 557.2165] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNodeGroup) >> +>> endobj +551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 546.3125 538.9788 557.2165] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNodeGroup) >> +>> endobj +552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 535.2988 246.3258 544.265] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNode) >> +>> endobj +553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 535.2988 538.9788 544.265] +/Subtype /Link +/A << /S /GoTo /D (0:AddConfFileToNode) >> +>> endobj +554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 520.4097 214.924 531.3136] +/Subtype /Link +/A << /S /GoTo /D (0:AddKeyType) >> +>> endobj +555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [532.005 520.4097 538.9788 531.3136] +/Subtype /Link +/A << /S /GoTo /D (0:AddKeyType) >> +>> endobj +556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 507.4582 213.9073 518.3622] +/Subtype /Link +/A << /S /GoTo /D (0:AddMessage) >> +>> endobj +557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 507.4582 538.9788 518.3622] +/Subtype /Link +/A << /S /GoTo /D (0:AddMessage) >> +>> endobj +558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 496.4445 244.8014 505.4107] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkMethod) >> +>> endobj +559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 496.4445 538.9788 505.4107] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkMethod) >> +>> endobj +560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 481.5554 238.4655 492.4593] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkType) >> +>> endobj +561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 481.5554 538.9788 492.4593] +/Subtype /Link +/A << /S /GoTo /D (0:AddNetworkType) >> +>> endobj +562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 468.6039 231.0633 479.5079] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeGroup) >> +>> endobj +563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 468.6039 538.9788 479.5079] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeGroup) >> +>> endobj +564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 457.7098 240.3683 466.5564] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeNetwork) >> +>> endobj +565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 457.7098 538.9788 466.5564] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeNetwork) >> +>> endobj +566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 444.7584 205.6089 453.605] +/Subtype /Link +/A << /S /GoTo /D (0:AddNode) >> +>> endobj +567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 444.7584 538.9788 453.605] +/Subtype /Link +/A << /S /GoTo /D (0:AddNode) >> +>> endobj +568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 429.7496 262.9139 440.6536] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToNodeGroup) >> +>> endobj +569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 429.7496 538.9788 440.6536] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToNodeGroup) >> +>> endobj +570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 418.8555 235.2576 427.7021] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToPCU) >> +>> endobj +571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 418.8555 538.9788 427.7021] +/Subtype /Link +/A << /S /GoTo /D (0:AddNodeToPCU) >> +>> endobj +572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 405.9041 203.407 414.7507] +/Subtype /Link +/A << /S /GoTo /D (0:AddPCU) >> +>> endobj +573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 405.9041 538.9788 414.7507] +/Subtype /Link +/A << /S /GoTo /D (0:AddPCU) >> +>> endobj +574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 392.9526 201.7333 401.7993] +/Subtype /Link +/A << /S /GoTo /D (0:AddPeer) >> +>> endobj +575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 392.9526 538.9788 401.7993] +/Subtype /Link +/A << /S /GoTo /D (0:AddPeer) >> +>> endobj +576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 377.9439 227.3472 388.8479] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonKey) >> +>> endobj +577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 377.9439 538.9788 388.8479] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonKey) >> +>> endobj +578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 366.9302 211.1479 375.8964] +/Subtype /Link +/A << /S /GoTo /D (0:AddPerson) >> +>> endobj +579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 366.9302 538.9788 375.8964] +/Subtype /Link +/A << /S /GoTo /D (0:AddPerson) >> +>> endobj +580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 354.0983 236.921 362.945] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSite) >> +>> endobj +581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 354.0983 538.9788 362.945] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSite) >> +>> endobj +582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 341.1469 241.3443 349.9936] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSlice) >> +>> endobj +583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 341.1469 538.9788 349.9936] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonToSlice) >> +>> endobj +584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 328.1955 202.8491 337.0421] +/Subtype /Link +/A << /S /GoTo /D (0:AddRole) >> +>> endobj +585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 328.1955 538.9788 337.0421] +/Subtype /Link +/A << /S /GoTo /D (0:AddRole) >> +>> endobj +586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 315.244 240.2386 324.0907] +/Subtype /Link +/A << /S /GoTo /D (0:AddRoleToPerson) >> +>> endobj +587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 315.244 538.9788 324.0907] +/Subtype /Link +/A << /S /GoTo /D (0:AddRoleToPerson) >> +>> endobj +588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 302.2926 232.1786 311.1393] +/Subtype /Link +/A << /S /GoTo /D (0:AddSiteAddress) >> +>> endobj +589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 302.2926 538.9788 311.1393] +/Subtype /Link +/A << /S /GoTo /D (0:AddSiteAddress) >> +>> endobj +590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 289.3412 199.5314 298.1878] +/Subtype /Link +/A << /S /GoTo /D (0:AddSite) >> +>> endobj +591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 289.3412 538.9788 298.1878] +/Subtype /Link +/A << /S /GoTo /D (0:AddSite) >> +>> endobj +592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 276.3897 239.7301 285.2364] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttribute) >> +>> endobj +593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 276.3897 538.9788 285.2364] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttribute) >> +>> endobj +594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 261.381 259.4063 272.285] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttributeType) >> +>> endobj +595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 261.381 538.9788 272.285] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceAttributeType) >> +>> endobj +596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 250.4869 253.7672 259.3335] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceInstantiation) >> +>> endobj +597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 250.4869 538.9788 259.3335] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceInstantiation) >> +>> endobj +598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 237.4158 203.9548 246.3821] +/Subtype /Link +/A << /S /GoTo /D (0:AddSlice) >> +>> endobj +599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 237.4158 538.9788 246.3821] +/Subtype /Link +/A << /S /GoTo /D (0:AddSlice) >> +>> endobj +600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 224.584 239.6806 233.4307] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceToNodes) >> +>> endobj +601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 224.584 538.9788 233.4307] +/Subtype /Link +/A << /S /GoTo /D (0:AddSliceToNodes) >> +>> endobj +602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 211.6326 212.2537 220.4792] +/Subtype /Link +/A << /S /GoTo /D (0:AuthCheck) >> +>> endobj +603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 211.6326 538.9788 220.4792] +/Subtype /Link +/A << /S /GoTo /D (0:AuthCheck) >> +>> endobj +604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 196.6239 218.4999 207.5278] +/Subtype /Link +/A << /S /GoTo /D (0:BlacklistKey) >> +>> endobj +605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 196.6239 538.9788 207.5278] +/Subtype /Link +/A << /S /GoTo /D (0:BlacklistKey) >> +>> endobj +606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 185.7297 250.4398 194.5764] +/Subtype /Link +/A << /S /GoTo /D (0:BootGetNodeDetails) >> +>> endobj +607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 185.7297 538.9788 194.5764] +/Subtype /Link +/A << /S /GoTo /D (0:BootGetNodeDetails) >> +>> endobj +608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 170.721 243.2471 181.6249] +/Subtype /Link +/A << /S /GoTo /D (0:BootNotifyOwners) >> +>> endobj +609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 170.721 538.9788 181.6249] +/Subtype /Link +/A << /S /GoTo /D (0:BootNotifyOwners) >> +>> endobj +610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 157.7696 236.6022 168.6735] +/Subtype /Link +/A << /S /GoTo /D (0:BootUpdateNode) >> +>> endobj +611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 157.7696 538.9788 168.6735] +/Subtype /Link +/A << /S /GoTo /D (0:BootUpdateNode) >> +>> endobj +612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 146.8754 225.5235 155.7221] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddress) >> +>> endobj +613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 146.8754 538.9788 155.7221] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddress) >> +>> endobj +614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 131.8667 299.4358 142.7706] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressTypeFromAddress) >> +>> endobj +615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 131.8667 538.9788 142.7706] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressTypeFromAddress) >> +>> endobj +616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 118.9153 245.1997 129.8192] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressType) >> +>> endobj +617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 118.9153 538.9788 129.8192] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteAddressType) >> +>> endobj +618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 107.9015 232.1783 116.8678] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteBootState) >> +>> endobj +619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 107.9015 538.9788 116.8678] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteBootState) >> +>> endobj +523 0 obj << +/D [521 0 R /XYZ 71.731 729.2652 null] +>> endobj +6 0 obj << +/D [521 0 R /XYZ 244.3315 703.236 null] +>> endobj +520 0 obj << +/Font << /F21 514 0 R /F28 527 0 R /F29 532 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +670 0 obj << +/Length 55961 +/Filter /FlateDecode +>> +stream +xڔÝM¬Wz¥ç¹~‡ÅÂù1lË.Á6Zh¸«G†j»]誢À¢Ðпw2öڑë‰X÷"4( Ü\×æ¥s2óÆ{üîåú?Çïޏ‡÷óõ?NŸ‡ÓÛåôÝ¿üåï^¾ûï׿ôw¼y}{;œ.Ç·ëÿñà¯þýùóõp9½¼}÷÷§—Ãçéxyxêøz>¼¾¾ûû÷—ÃùõüþíÔÿú‡¿û_~úüîóðùvzûîÿí»uL§þðÇÿçw§ÃëËáû¿?]^~÷¿ýðç~þá~üëûýŸþüÃïúñ/ÿôãøǟ~ü·ýþÿýÃÿùwÿûDž>/×ë|~wúµ®Ë—ÓñÉ?Øéóú7~tgûréƒßçüòrøx?¾?¼Ð|ªë4àsõ ~>œßN¯-~;¸¯>Á/‡ËùØâ·ÓˆûêüöWKüvq_}Œ¯ŸÎùµ}ìë4ácõ ~ýtN—Öþõ0Ò¶ùD¾~4ÇKûÌ×i´}õ ~ý«/oõ3¿FÜWã×_ß?ÛðÛa¢}ó‰|>œ>Þkúvm_}‚_ïï翝FÜWŸà×ß»>[û×ÃHÛæcù|ýd.õǽN“=VŸà׏æòÒ>óuq_}‚_?š×öWôÛa¤mó‰|ýdÎׯFJúvm_}Œ_¿y?Úg¾N>VŸà׏æXÛ¿FÚ6ŸÈ×OæåÜ>óum_}‚ŽŸ¯õ?÷í4â¾ú¿¼Þ>^Û_\ÖiÂÇêü|8¾_ÚǾN#î«OðËáíí­}ìë4â¾ú¿~:—ú×ôuq_}Œ¿]?×÷ö±¯Ó„Õ'øõÓ9œZüvq_}‚_?ÓGûØ×iÄ}õ ~ýtŽŸõc¿FÜWãï×OçøÒ>öušð±ú¿~://íc_§÷Õ'øåpù<¶ß&¬Óˆûêüãðòqªûí4â¾úÿx9\ÞOíc_§ «OðóáåíÜ>öuq_}‚_?ËkûØ×iÄ}õ ~ýt^_?Züvq_}Œ^?ëoB%¾N>VŸà×OçôÖ>öuq_}‚_?ã[ûØ×iÄ}õ ~ýt^ÞëÇ~;¸¯>Ä__^¯Ÿå7+: ø\}‚ŸŸ-~;¸¯>Á/‡×÷ÏK‹ßN#î«Oð÷ÃçûKýØo§÷ÕÇøñúé¼½´}&|¬>Á¯ŸÎåøÚâ·Óˆûêüú鼞ÚǾN#î«Oðë§s>Տývq_}ŒŸ®ŸÎéÜ>öušð±ú¿~:ÇöODtq_}‚_?—×÷¿FÜWŸàÏKýØo§÷ÕÇøùåpþxkû:MøX}‚Ÿïoíc_§÷Õ'øåp~{oû:¸¯>Á¯ŸÎ¥ýóÛa¤mó±üzýh^?Úg¾N“=VŸà׏æüÙ>óuq_}‚_?šsKÿrᯋOØëÇrz©øí4Ò¾ú¿\?—cûgž:MøX}‚_?—öÖa¤mó‰|9œ>Oí3_§ÑöÕ'øûáý£þoÚ:¸¯>Æß^§úµÛa¢}ó‰|:¼¿½¾µôí4Ú¾ú¿~4—KûÌ×iÄ}õ ~ýhúð_#m›å÷ë's~kéušì±ú¿~4§÷ö™¯ÓˆûêüúÑß?[üvq_}‚_?œ—ú±ßN#ñ—Ãñó³}ìë4ácõ ~:¼}|¶}FÜWŸà—Ãñã¥}ìë4â¾ú?¼½ÛßÍÖiÄ}õ1þyýtގíc_§ «Oðë§s9µ}FÜWŸà×Oçú}‹ßN#î«Oðë§s>׏ývq_}ˆ_^®ŸÎéµü³'|®>Á¯ŸÎñrjñÛiÄ}õ ~ýt^.Ÿ-~;¸¯>Áß—Ï·ú±ßN#ñãËáåã½}ìë4ácõ ~:\Þß?Züvq_}‚_/oíc_§÷Õ'øõÓ¹|֏ývq_}ŒŸ®ŸÎëgûØ×iÂÇêüúé¼¾´}FÜWŸà×Oç|<¶øí4â¾ú¿~:§ãGüñæÛ¿¡xüã͗ÓÇáåÈ_Ýèܗ ?ƍÎï‡Ï'¿Ï>øiñõÇÙñ§Åß®¿Ó?OçüÓâ:uûiñcüiññƒâ×ï^¿}³rÍGyy¹þÿ“Ÿ¿.|~œ?è¾:÷å‡y¡ó· ]^è~;¸¯>Á/׿årlñÛiÄ}õ þqx½\>Züvq_}Œ_¿‡ø¼~Ï\âë4ácõ ~ýtÎïíc_§÷Õ'ø·Tâ½}ìë4â¾ú¿~:Ǐ׿FÜWã×ï!>_>ÛǾN>VŸàçë_ýlû:¸¯>Á/‡Ï—ö±¯Óˆûêü–Ì”ø +q÷ÕâTøq2>WsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆÓá +q«1Ä)í[ˆC´m槤WˆC¶¯æ§ÄWˆC¸¯Æ§³Wˆ´o槤WˆC¶¯æ§ÄWˆC¸¯Æ§´o!Ѷ™CœŽVˆöXÍ!N‰¯‡p_!NißB¢m3‡8%½B²}5‡8®ð±CœÒ¾…8DÛfqJz…8dûjqJ|…8„ûjq:\!àc5‡8%¾BÂ}5‡8%¾BÂ}5‡8%¾BÂ}5‡8®ð±šCœ_!ᾚCœ_!ᾚCœ_!ᾚCœWˆøXÍ!N‰¯‡p_Í!N‰¯‡p_Í!N‰¯‡p_Í!N‡+Ä|¬æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§Ãâ>VsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSá;ÄÉø\Í!N‰¯‡p_Í!N‰¯‡p_Í!N‰¯‡p_Í!N‡+Ä|¬æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§ÄWˆC¸¯æ§Ãâ>VsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆSâ+Ä!ÜWsˆÓá +q«9Ä)ñâî«9Ä)ñâî«1Ä)í[ˆC´m槣â€=VsˆSâ+Ä!ÜWSˆSÒ¿†8]Ì!N ¯‡h_Í!N‡+Ä|¬Æ§´o!Ѷ™Cœ’^!Ù¾šCœ_!á¾CœÎ^!о™Cœ’^!Ù¾šCœ_!á¾CœÒ¾…8DÛfq:Z!Øc5‡8%¾BÂ}5‡8%¾BÂ}5‡8%¾BÂ}5‡8®ð±šCœ_!ᾚCœ_!ᾚCœ_!ᾚCœWˆøXÍ!N‰¯‡p_Í!N‰¯‡p_Í!N‰¯‡p_Í!N…ï'ãs5‡8%¾BÂ}5‡8%¾BÂ}5‡8%¾BÂ}5‡8®ð±šCœ_!ᾚCœ_!ᾚCœ_!ᾚCœWˆøXÍ!N‰¯‡p_Í!N‰¯‡p_Í!N®Gª‡.t;÷åBçϧ!NºÑqൠo×/­^__> ÄY§n!Îéaˆ3~üúÏ/ßþ íñ«çóõÝ'ÎõѼ½þòÅB¼§Î}¹èüñôóñp<ûùÁ…&¾N>VŸàçÃÛéÛoë~;¸¯>ÁßÇãë[‹ßN#î«Oðë§ór9µøí4â¾ú=^>/íc_§ «OðóáòñÖ>öuq_}‚¿^ÞßÛǾN#î«OðÃåí½~ì·Óˆûêcürýt.ß~[¯ðušð±ú¿~:¯Ÿíc_§÷Õ'øõÓ9¶}FÜWŸà×OçüR?öÛiÄ}õ1þvýtNÇö±¯Ó„Õ'øõÓ9~ûb¡Ão§÷Õ'øõÓy9µ}FÜWŸàׯÎõc¿FÜWŸd¥«»­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æmð»š7âsjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãc5×¼½j^ mjގVÍ ¶¯BÍÛáªy÷Õ\óV¶jÞLû&Ô¼­šl_…š·ÃUóæíìUóm›PóVô®y³=V¡æípÕ¼€ûj®y;{Õ¼@Û&Ô¼­šl_…š·Âw͛ñ±škÞÎ^5/ж 5oG«æÛW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼¾kތU¨y;\5/ྠ+5o‡«æÜW¡æípÕ¼€û*Ô¼ ~WóF|®BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྚkÞÎ^5/ж 5oEïš7ÛcjÞWÍ ¸¯Æš·£o5/À_¡æí`Õ¼@û*Ô¼¾kތÕ\óvöªy¶M¨y;Z5/ؾ +5o‡«æÜWsÍ[Ùªy3í›Póv´j^°}jÞWÍ ¸¯æš·³WÍ ´mBÍ[Ñ»æÍöX…š·ÃUóî«Póv¸j^À}jÞWÍ ¸¯BÍ[á»æÍøX…š·ÃUóî«Póv¸j^À}jÞWÍ ¸¯BÍ[á»æÍøX…š·ÃUóî«Póv¸j^À}jÞWÍ ¸¯BÍÛàw5oÄç*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«P󆵭yáB«æ½¿PªyÍ~ókõÞ>¯Ÿ¯Pó®S·š÷ü¥æý¿¾?]~÷Ã÷ÇËïþ}ü@øËõŸíýۗwÎ|Šoçg=ïuàýøË·ñ¦:÷åªóԏÇÃéÛ¿_xpißí›OäóáíóÛWï};¶¯>Áß®_Ã>ùà·ÓˆûêüãðV?ò_Î"üuñ1{:Žï/í_§‰«Oðëçòvlø:¸¯>Á¯ŸËåÛ×í~;¸¯>ÁWXßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõü.׏ø\…\¿Ã•ëëw¸r}À}rýW®¸¯B®_á;×ÏøX͹~g¯\hۄ\¿£•ëƒí«ëw¸r}À}5çú•­\?Ó¾ ¹~G+×ÛW!×ïpåú€ûjÎõ;{åú@Û&äú½sýlUÈõ;\¹>ྚsýÎ^¹>ж ¹~G+×ÛW!ׯðëg|¬æ\¿³W®´mB®ßÑÊõÁöUÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~…ï\?ãcrýW®¸¯B®ßáÊõ÷UÈõ;\¹>ྠ+¹~ƒßåúŸ«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯B®ßáÊõ÷UÈõ+|çú«ëw¸r}À}rýW®¸¯æ\¿³W®´mB®_Ñ;×ÏöX…\¿Ã•ëî«1×ïè[®ð×EÈõ;X¹>о +¹~…ï\?ãc5çú½r} mrýŽV®¶¯B®ßáÊõ÷՜ëW¶rýLû&äú­\l_…\¿Ã•ëî«9×ïì•ëm›ëWôÎõ³=V!×ïpåú€û*äú®\p_…\¿Ã•ëëWøÎõ3>V!×ïpåú€û*äú®\p_…\¿Ã•ëëWøÎõ3>V!×ïpåú€û*äú®\p_…\¿Ã•ëë7ø]®ñ¹ +¹~‡+×ÜW!×ïpåú€û*äú®\p_…\¿Âw®Ÿñ± +¹~‡+×ÜW!×ïpåú€û*äú®\p_…\¿Âw®Ÿñ± +¹~‡+×ÜW!×ïpåú€û*äú14ïr}¸ÐÊõï/ôúò<×7ú͹þåíp9Ó»·o‡n±þë³Xÿß¼üîßÿõá[¸ß/ßþõÝÖæ£üøx?òK¸Ó}wÔ{wáÐôÎÛ¤¤7ʾ Ao%«çͲmBÍ[Ɋy³l›òV²JÞ,Û&t¼¼3Þ(û&D¼•¬†7˶ o%+àͲmB¾[ɪw³l›Ðî6òNw£ì›îV²ºÝ,Û&T»•¬h7˶ Én%«ØͲmB¯ÛÈ;׍²oB¬[Éju³l›PêV²BÝ,Û&dº•¬J7˶ n#ïD7ʾ n%«ÏͲmB[Ɋs³l›æV²ÊÜ,Û&t¹¼³Ü(û&D¹•¬&7˶ En%+ÈͲmBŽ[ɪq³l›Ðâ6òNq£ì›âV²:Ü,Û&T¸•¬7˶ n%«ÀͲmB[Èwùm’Ç&Ä·•¬ö6˶ åm%+¼Í²mBv[ɪn³l›ÐÜ6òNn£ì›9¸­àÕÛf÷ë"Ô¶•«Ø6ö ©m%«´Í²mæ恕ÙF×!²­\5¶¶M(l+Ym–m3çµ¼êÚì~]„¶¶qwZa߄°¶’ÕÕfÙ6sU[Á+ªÍî×EHj+WEm†mzÚFÞ9m”}3Ç´¼ZÚì~]„’¶rÒfØ6!£­dU´Y¶Mhhy'´QöMh+Yýl–mêÙJV<›eۄt¶’UÎfÙ6¡›mäÍFÙ7!š­d5³Y¶M(f+YÁl–mrÙJV-›eۄV¶‘w*e߄P¶’ÕÉfÙ6¡’­dE²Y¶MHd+Y…l–múØFÞyl”}âØJV›eۄ2¶’ÆfÙ6!‹­dU±Y¶Mhby'±QöMb+Y=l–mjØJV ›eۄ¶’UÂfÙ6¡ƒ-ä» 6Éc"ØJV›eۄ¶’ÀfÙ6!­dÕ¯Y¶Mh_y§¯QöM_+YÝk–mª×JVôšeۄ䵒U¼fÙ6¡wm䝻FÙ7!v­dµ®Y¶M(]+Y¡k–m2×JVåšeۄƵ‘wâe߄Àµ’Õ·fÙ6¡n­dÅ­Y¶Íœ¶Vð*[³ûuºÖÆÝYk„}¢ÖJVӚeیEkåނ֬~كœµRU³f×6¡em䝲FÙ7sÈZÁ«cÍî×E¨X+Wk†mÖJVÁšeÛÌýj+_®-B¼Z¹jW3l›P®V²ÂÕ,ÛfÎV+xU«ÙýºÍjãîd5¾ Áj%«WͲmB­ZɊU³l›ªV²JÕ,Û&tª¼3Õ(û&Dª•¬F5˶ …j%+PͲmBžZɪS³l›Ð¦6òNS£ì›¦V²ºÔ,Û&T©•¬(5˶ Ij%«HͲmBZÈw9j’Ç&Ĩ•¬5˶ %j%+DͲmB†ZɪP³l›Ð 6òNP£ì› V²úÓ,Û&Ô§•¬ø4˶ éi%«<ͲmBwÚÈ;;²oBtZÉjN³l›PœV²‚Ó,Û&ä¦)‘ìjÓ|››ÞÝæõø¼5}~‘š^ 5ýµ`»@kºNÝbÓ˗Øô?þð·¿ýóÿáÑ jßÏßþ]ŝá79>_ž¿z¦ñš;1½¿ghL\(E¦«™v¸:SÀ}JÓWj +¸¯BlÚáªM÷UèM+|§«œv¸šSÀ}ªÓWv +¸¯BxÚá*O÷UhO+|ǧ«Ÿv¸úSÀ} +ÔW‚ +¸¯B„ÚáªP÷UèP+|‡¨«¢v¸ZTÀ}jÔWŽ +¸¯BÚá*R÷UhR+|G©«¥v¸ºTÀ}ÊÔWš +¸¯BœÚáªS÷UèS+|ª«¨v¸UÀ}*ÕW¦ +¸¯B¨Úá*U÷UhU+|Ǫ««v¸zUÀ}ŠÕW² +¸¯B´ÚáªV÷UèVü.\ø\…tµÃÕ®î«P¯v¸òUÀ}ÖWÁ +¸¯BÃZá;bÍøXÍkg¯Žhۄ’µ£•²‚í«³v¸jVÀ}5÷¬•­ 5Ó¾ IkG«iÛW¡jípe­€ûj[;{•­@Û&´­½ãÖlUÈ[;\}+ྚ ×Î^‰+ж ‘kG«rÛW¡s­ðºf|¬æÔµ³Wë +´mBíÚÑÊ]ÁöU^;\Å+ྠ+Ík…ïè5ãc²×W÷ +¸¯BùÚáJ_÷Uˆ_;\õ+ྠ+ýk…ï6ãcØW ¸¯BÛáÊ`÷Ua;\%,ྠ+-l…ï6ãcrØW ¸¯BÛáJb÷Uˆb;\U,ྠ+]l…ï06ãcÒØW ¸¯BÛáÊc÷Ud;\…,ྠ+l…ïH6ãc2ÙW' ¸¯B)ÛáJe÷Uˆe;\µ,ྠ+½lƒß³Ÿ«Ìv¸šYÀ}ªÙW6 ¸¯B8Ûá*g÷Uhg+|dz«Ïv¸úYÀ} +ÚWB ¸¯BDÛáªh÷Uèh+|‡´«Òv¸ZZÀ}jÚWN ¸¯BPÛá*j÷Uhj+|Gµ«Õv¸ºZÀ}ÊÚWZ ¸¯æ¸¶³W] ´mB_[Ñ;°ÍöX…ĶÃÕØ²íè[f ð×Em;X¥-о +­m…ïØ6ãc5綝½z[ mŠÛŽVr ¶¯BtÛáªn÷ÕÜÝV¶ÂÛLû&¤·­öl_…ú¶Ã•ßî«9ÀíìUàm›ÐàVôŽp³=V!Ãípu¸€û*”¸®p_…·ÃUãî«ÐãVør3>V!Éíp5¹€û*T¹®,p_…0·ÃUæî«ÐæVøŽs3>V!Ïípõ¹€û*º®Dp_…H·ÃUéî«Ðé6ø]¨ñ¹ +©n‡«ÕÜW¡Öíp庀û*»®bp_…f·Âw´›ñ± +Ùn‡«ÛÜW¡Üíp¥»€û*Ä»®zp_…~·ÂwÀ›ñ± + o‡«áÜW¡âípe¼€û*„¼!EmK^¸ÐJyï/”ZÞp£ßüÞØóËõ7›ËbÞuêó¾}‰yÿ釟ÿç÷ǗßýøÓÿø?üüÿýøǙy}ûíÛ¿²½Ó¼8öóýíYÖ»Ó¯xá~Ýß8¤_.”Ò¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_ ~—~E|®BúÕáJ¿÷UH¿:\éྠ+éW‡+ýÜW!ýªð~e|¬æô«³Wú´mBúÕÑJ¿ÀöUH¿:\éྚӯÊVú•i߄ô«£•~í«~u¸Ò/À}5§_½Ò/ mÒ¯ŠÞéW¶Ç*¤_®ô p_ÍéWg¯ô hۄô«£•~í«~UøN¿2>VsúÕÙ+ýÚ6!ýêh¥_`û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«ÁïÒ¯ˆÏUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒUH¿:\éྠ+éW‡+ýÜWsúÕÙ+ýÚ6!ýªè~e{¬BúÕáJ¿÷՘~uô-ýøë"¤_¬ô h_…ô«Âwú•ñ±šÓ¯Î^éж éWG+ýÛW!ýêp¥_€ûjN¿*[éW¦}Ò¯ŽVú¶¯BúÕáJ¿÷՜~uöJ¿€¶MH¿*z§_Ù«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿ü.ýŠø\…ô«Ã•~~u¸Ò/À}Ò¯Wú¸¯BúUá;ýÊøX…ô«Ã•~~u¸Ò/À}Ò¯Wú¸¯BúUá;ýÊøX…ô«Ã•~~u¸Ò/À}Ò¯˜+ué\h¥_÷z==O¿Â~súuý/áÛÇùÒ¯uê–~½?K¿þðýÇËïþý_xôR¹óñÛÏÄÜy~«Óõ›©ÓùYüµßõ¯¼ßõvçð®·JïzËøX…w½u¸Þõ¸¯Â»Þ:\ïzÜWá]o®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯ÁˆÏUþ:\Áྠ+Á_‡+øÜW!øëp€û*¾ƒ¿ŒÕüuö +þ€¶Mþ:ZÁؾ +Á_‡+øÜWsðWÙ +þ2í›üu´‚?°}‚¿Wð¸¯æ௳Wð´mBðWÑ;øËöX…à¯Ãüî«9øëìüm›üu´‚?°}‚¿ +ßÁ_ÆÇjþ:{@Û&­àl_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«üUøþ2>V!øëp€û*®àp_…à¯Ãüî«ü5ø]ðñ¹ +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€û*®àp_…à¯Âwð—ñ± +Á_‡+øÜW!øëp€ûjþ:{@Û&½ƒ¿lUþ:\Áྃ¿Ž¾]„௃üí«üUøþ2>Vsð×Ù+øÚ6!øëh`û*®àp_ÍÁ_e+øË´oBð×Ñ +þÀöUþ:\Áྚƒ¿Î^Áж Á_Eïà/Ûc‚¿Wð¸¯Bð×á +þ÷Uþ:\Áྠ+Á_…ïà/ãc‚¿Wð¸¯Bð×á +þ÷Uþ:\Áྠ+Á_…ïà/ãc‚¿Wð¸¯Bð×á +þ÷Uþ:\Áྠ+Á_ƒßŸ«üu¸‚?À}‚¿Wð¸¯Bð×á +þ÷Uþ*|«üu¸‚?À}‚¿Wð¸¯Bð×á +þ÷Uþ*|«üu¸‚?À}‚¿Wð¸¯Bðµ6øƒ ­àïþB¯ççÁ_¸Ñoþ^^ïçÓ‚¿uêü}| þ~üã¿ÿéÇ¿|ûÏüéÇûיœ®¿À|ûó€;Íït<œ¿µOr¿FÄ ï0âþÆ!Œxp¡Fî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ¿ #">W!Œèp…€û*„®0p_…0¢ÃFî«FTø#2>VsÑÙ+ŒÚ6!Œèh…`û*„®0p_ÍaDe+ŒÈ´oBÑÑ +#ÀöU#:\aྚÈÎ^aж aDEï0"ÛcˆW¸¯æ0¢³W´mBÑÑ +#ÀöU#*|‡«9ŒèìFm›Ft´Â°}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BQá;ŒÈøX…0¢ÃFî«Ft¸ÂÀ}ˆW¸¯BÑàwaDÄç*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«Ft¸ÂÀ}ˆ +ßaDÆÇ*„®0p_…0¢ÃFî«9ŒèìFm›FTô#²=V!Œèp…€ûj #:úFüuˆV´¯BQá;ŒÈøXÍaDg¯0hۄ0¢£F€í«Ft¸ÂÀ}5‡•­0"Ó¾ aDG+ŒÛW!Œèp…€ûj#:{…@Û&„½ÃˆlU#:\aྠ+aD‡+ŒÜW!Œèp…€û*„¾ÃˆŒU#:\aྠ+aD‡+ŒÜW!Œèp…€û*„¾ÃˆŒU#:\aྠ+aD‡+ŒÜW!Œèp…€û*„ ~FD|®BÑá +#÷U#:\aྠ+aD‡+ŒÜW!Œ¨ðFd|¬BÑá +#÷U#:\aྠ+aD‡+ŒÜW!Œ¨ðFd|¬BÑá +#÷U#:\aྠ+aDøaþ6Œ€ ­0âþB¯¯ÏÈp£F\rqù<^¿m|ùÈa„N݈χaÄú‡ÿ2ß|ózx=]¾»gfñv|ý|VDèM<ù¦:÷åªÏßÄóèBáM<„ûj~O‡ëM<€Õü&ž_oâ!ÜWó›xJ|½‰‡p_Íoâ)ñõ&Â}5¿‰§Ãõ&ÀÇj~O‰¯7ñî«ùM<%¾ÞÄC¸¯æ7ñ”øzᾚßÄÓázàc5¿‰§ÄWpF¸¯æà¬ÄWpF¸¯æà¬ÄWpF¸¯æà¬Ãœ>VspVâ+8#ÜWspVâ+8#ÜWspVâ+8#ÜWspVá;8Ëø\ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‡+8|¬Æ଴oÁѶ™ƒ³’^ÁÙ¾šƒ³_Áᾃ³Î^Áо™ƒ³’^ÁÙ¾šƒ³_Áᾃ³Ò¾gDÛfÎ:ZÁØc5g%¾‚3Â}5g¥} Έ¶Íœ•ô +ÎÈöÕœu¸‚3ÀÇj ÎJûœm›98+霑í«98+ñœî«98ëpg€Õœ•ø +Î÷Õœ•ø +Î÷Õœ•ø +Î÷Õœu¸‚3ÀÇjÎJ|g„ûjÎJ|g„ûjÎJ|g„ûjÎ:\Áàc5g%¾‚3Â}5g%¾‚3Â}5g%¾‚3Â}5g®à 𱚃³_Áᾚƒ³_Áᾚƒ³_Áᾚƒ³WpøXÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY…ïà,ãs5g%¾‚3Â}5g%¾‚3Â}5g%¾‚3Â}5g®à 𱚃³_Áᾚƒ³_Áᾚƒ³_Áᾚƒ³WpøXÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‰¯àŒp_ÍÁY‡+8|¬æà¬ÄWpF¸¯æà¬ÄWpF¸¯Æ଴oÁѶ™ƒ³ŽVpöXÍÁY‰¯àŒp_MÁYIÿœüu1g%¼‚3¢}5g®à 𱃳ҾgDÛfÎJzgdûjÎJ|g„ûj Î:{g@ûfÎJzgdûjÎJ|g„ûj ÎJûœm›98ëhg`Õœ•ø +Î÷Õœ•ø +Î÷Õœ•ø +Î÷Õœu¸‚3ÀÇjÎJ|g„ûjÎJ|g„ûjÎJ|g„ûjÎ:\Áàc5g%¾‚3Â}5g%¾‚3Â}5g%¾‚3Â}5g¾ƒ³ŒÏÕœ•ø +Î÷Õœ•ø +Î÷Õœ•ø +Î÷Õœu¸‚3ÀÇjÎJ|g„ûjÎJ|g„ûjÎJ|g„ûjÎ:\Áàc5g%¾‚3Â}5g%¾‚3Â}5g©•*ƒ3ºÐíܗ …à,Ýè·¾‰çòþqø8}¾Bp¶Nýœ]¿½÷àìñx·Ïã·[z§ø]Nׯ®N¯Ïz³×ãáåó—_¼ãEuîËMçϧ_ÿy.ß¾syp¡øí4â¾ú;¼¼¿ŸZüvq_}‚.oïŸ-~;¸¯>Éü®ŸÎåãRâë4ácõ ~ýt^?ÛǾN#î«OðÕAv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]ÙàwueÄç*ԕ®ºp_…º²ÃUWî«PWv¸êJÀ}êÊ +ßueÆÇj®+;{Օ@Û&ԕ­ºl_…º²ÃUW®¬lՕ™öM¨+;Zu%ؾ +ue‡«®ÜWs]ÙÙ«®Ú6¡®¬è]Wf{¬B]Ùáª+÷Õ\Wvöª+¶M¨+;Zu%ؾ +ue…ïº2ãc5ו½êJ mêʎV] ¶¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨+ü®®Œø\…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}5ו½êJ mêʊÞue¶Ç*ԕ®ºp_ueGßêJ€¿.B]ÙÁª+öU¨++|ו«¹®ììUWm›PWv´êJ°}êÊW] ¸¯æº²²UWfÚ7¡®ìhՕ`û*ԕ®ºp_Íueg¯ºhۄº²¢w]™í± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²ÁïêʈÏU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+;\u%ྠ+ue‡«®ÜW¡® e`[W…V]y¡×Ëóº2Üè7ו×oa>Þém~¿º~Ù{‹+#®ü§~þŸß_~÷ãOÿãQ×wúå'ö×ÊÃy¾þžû4±Tëw7‘Z¿ûû†ÖïÁ…Rë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯ÁïZ¿ˆÏUhý:\­ྠ+­_‡«õÜW¡õëpµ~€û*´~¾[¿ŒÕÜúuöjý€¶Mhý:Z­ؾ +­_‡«õÜWsëWÙjý2í›Ðúu´Z?°}Z¿W븯æÖ¯³Wë´mBëWÑ»õËöX…Ö¯ÃÕúõëìÕúm›Ðúu´Z?°}Z¿ +ß­_ÆÇjný:{µ~@Û&´~­Öl_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«ÐúUøný2>V¡õëpµ~€û*´~®Öp_…Ö¯ÃÕúî«Ðú5ø]ëñ¹ +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€û*´~®Öp_…Ö¯Âwë—ñ± +­_‡«õÜW¡õëpµ~€ûjný:{µ~@Û&´~½[¿lUhý:\­à¾[¿Ž¾µ~]„Ö¯ƒÕúí«ÐúUøný2>Vsë×Ù«õÚ6¡õëhµ~`û*´~®Öp_Í­_e«õË´oBë×ÑjýÀöUhý:\­ྚ[¿Î^­ж ­_EïÖ/ÛcZ¿W븯Bë×ájý÷Uhý:\­ྠ+­_…ïÖ/ãcZ¿W븯Bë×ájý÷Uhý:\­ྠ+­_…ïÖ/ãcZ¿W븯Bë×ájý÷Uhý:\­ྠ+­_ƒßµ~Ÿ«Ðúu¸Z?À}Z¿W븯Bë×ájý÷Uhý*|·~«Ðúu¸Z?À}Z¿W븯Bë×ájý÷Uhý*|·~«Ðúu¸Z?À}Z¿W븯Bëµ®õƒ ­ÖïþB¯oÏ[¿p£ßÜú]¿_þ<]áɱß:u‹ýN#ö? ~¼þß~1½ÛŸOïtþ|{ø]Þ>ùª8^Qç¾ÜqþdúñíúUÜ·¯_\è~;¸¯>Á?ßþ^GÿrᯋÙÓñp|y+áušè±ú¿~.oÇö¯Óˆûêüú¹\ŽŸ-~;¸¯>Á¯ŸÍë©~ì·Óˆûêcü|ýtÎçö±¯Ó„Õ'øõÓ9ÛǾN#î«Oðë§s|mû:¸¯>Á¯ŸÎËåÔâ·Óˆûꓷ¤®×ÈVø~9mÆÇ*¼œ¶ÃõrZÀ}^NÛáz9-ྠ+/§ípë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*ë ~¬G|®B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬æ`½³W°´mB°ÞÑ +ÖÁöUÖ;\Á:ྚƒõÊV°ži߄`½£¬ƒí«¬w¸‚uÀ}5락‚u m‚õŠÞÁz¶Ç*ë®`p_ÍÁzg¯`hۄ`½£¬ƒí«¬WøÖ3>Vs°ÞÙ+XÚ6!Xïhë`û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Âw°žñ± +Áz‡+XÜW!Xïpë€û*ë®`p_…`½Áï‚õˆÏUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜWs°ÞÙ+XÚ6!X¯è¬g{¬B°Þá +Ö÷Õ¬wô-Xøë"ë¬`h_…`½Âw°žñ±šƒõÎ^Á:ж ÁzG+XÛW!Xïpë€ûjÖ+[Áz¦}‚õŽV°¶¯B°Þá +Ö÷Õ¬wö +ց¶MÖ+zëÙ«¬w¸‚uÀ}‚õW°¸¯B°Þá +Ö÷UÖ+|뫬w¸‚uÀ}‚õW°¸¯B°Þá +Ö÷UÖ+|뫬w¸‚uÀ}‚õW°¸¯B°Þá +Ö÷UÖü.Xø\…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õ˜\wÁ:\hë÷z}¬‡ýæ`ý|½ÈûåÁú:u ÖÏ_‚õÿôÿe&ÚÇëwFïwçƒ[œ¯¯×ûa°¯¸ƒõû;†`ýÁ…R°¸¯Æ`½£oÁ:À_!X¯à¬gz¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!Xoð»`=âs‚õW°¸¯B°Þá +Ö÷UÖ;\Á:ྠ+Áz…ï`=ãc5락‚u m‚õŽV°¶¯B°Þá +Ö÷Õ¬W¶‚õLû&ë­`l_…`½Ã¬î«9Xïì¬m›¬WôÖ³=V!Xïpë€ûjÖ;{ë@Û&ë­`l_…`½Âw°žñ±šƒõÎ^Á:ж ÁzG+XÛW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*뾃õŒUÖ;\Á:ྠ+Áz‡+XÜW!Xïpë€û*ë ~¬G|®B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྠ+Áz‡+XÜW!X¯ð¬g|¬B°Þá +Ö÷UÖ;\Á:ྚƒõÎ^Á:ж ÁzEï`=Ûc‚õW°¸¯Æ`½£oÁ:À_!Xï`ë@û*뾃õŒÕ¬wö +ց¶MÖ;ZÁ:ؾ +Áz‡+XÜWs°^Ù +Ö3훬w´‚u°}‚õW°¸¯æ`½³W°´mB°^Ñ;XÏöX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°^á;XÏøX…`½Ã¬î«¬w¸‚uÀ}‚õW°¸¯B°ÞàwÁzÄç*ë®`p_…`½Ã¬î«¬w¸‚uÀ}‚õ +ßÁzÆÇ*ë®`p_…`½Ã¬î«¬w¸‚uÀ}‚õ +ßÁzÆÇ*ë®`p_…`½Ã¬î«¬‡äº ÖáB+X¿¿ÐëÇó`=Üè7ë×̗Óù‚õ_O½­`ýõk°þÃ?Ÿù<\>¾ý©îú[\ãxx;½>Åúñpúå_Ü-ÓcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|ƒßÅòŸ«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«9–ïìËm›Ëw´by°}bùW,¸¯æX¾²ËgÚ7!–ïhÅò`û*Äò®Xp_ͱ|g¯XhۄX¾¢w,Ÿí± +±|‡+–ÜWs,ßÙ+–Ú6!–ïhÅò`û*Äò¾cùŒÕËwöŠå¶Mˆå;Z±<ؾ +±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–¯ðËg|¬B,ßáŠå÷Uˆå;\±<ྠ+±|‡+–ÜW!–oð»X>âsbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷Uˆå;\±<ྠ+±|…ïX>ãcbùW,¸¯B,ßáŠå÷ÕËwöŠå¶Mˆå+zÇòÙ«Ëw¸byÀ}5Æò}‹åþº±|+–ÚW!–¯ðËg|¬æX¾³W,´mB,ßъåÁöUˆå;\±<ྚcùÊV,Ÿi߄X¾£˃í«Ëw¸byÀ}5Çò½by mbùŠÞ±|¶Ç*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù +ß±|ÆÇ*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù +ß±|ÆÇ*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù¿‹å#>W!–ïpÅò€û*Äò®Xp_…X¾ÃËî«ËWøŽå3>V!–ïpÅò€û*Äò®Xp_…X¾ÃËî«ËWøŽå3>V!–ïpÅò€û*Äò®Xp_…X>ÔÞm,Z±üý…R,nô›cùãëáåýt‚X~ºÅò‹åúۏýýO?þå?ÿéçfß~bÿŽzô¢÷Ó³y×}ÅÛîîëþº¡ûzp¡Ô}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûjð»î+âsº¯W÷¸¯B÷Õáê¾÷Uè¾:\Ýྠ+ÝW…ïî+ãc5w_½º/ mº¯ŽV÷¶¯B÷Õáê¾÷ÕÜ}U¶º¯Lû&t_­î l_…î«ÃÕ}ûêìÕ}m›Ð}Uôî¾²=V¡ûêpu_€ûjî¾:{u_@Û&t_­î l_…î«Âw÷•ñ±š»¯Î^Ýж ÝWG«ûÛW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_¾»¯ŒUè¾:\Ýྠ+ÝW‡«ûÜW¡ûêpu_€û*t_ ~×}E|®B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྠ+ÝW‡«ûÜW¡ûªðÝ}e|¬B÷Õáê¾÷Uè¾:\Ýྚ»¯Î^Ýж ÝWEïî+Ûcº¯W÷¸¯Æî«£oÝÀ_¡ûê`u_@û*t_¾»¯ŒÕÜ}uö꾀¶Mè¾:ZÝؾ +ÝW‡«ûÜWs÷UÙê¾2í›Ð}u´º/°}º¯W÷¸¯æW÷´mB÷UÑ»ûÊöX…î«ÃÕ}î«Ð}u¸º/À}º¯W÷¸¯B÷Uá»ûÊøX…î«ÃÕ}î«Ð}u¸º/À}º¯W÷¸¯B÷Uá»ûÊøX…î«ÃÕ}î«Ð}u¸º/À}º¯W÷¸¯B÷ÕàwÝWÄç*t_®î p_…î«ÃÕ}î«Ð}u¸º/À}º¯ +ßÝWÆÇ*t_®î p_…î«ÃÕ}î«Ð}u¸º/À}º¯ +ßÝWÆÇ*t_®î p_…î«ÃÕ}î«Ð}…\©í¾àB«ûº¿Ðëçóî+Üè7w_/Çë¯÷/Ð}­S·îëíY÷õç?ýË ¿®ßþ%ÝYóI^^>_Ÿ…_»½Š×ÝíÕý}C{õàB©½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÁïÚ«ˆÏUh¯:\íྠ+íU‡«½ÜW¡½êpµW€û*´W¾Û«ŒÕÜ^uöj¯€¶Mh¯:Zíؾ +íU‡«½ÜWs{UÙj¯2í›Ð^u´Ú+°}Ú«W{¸¯æöª³W{´mB{UÑ»½ÊöX…öªÃÕ^½êìÕ^m›Ð^u´Ú+°}Ú« +ßíUÆÇjn¯:{µW@Û&´W­ö +l_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^Uøn¯2>V¡½êpµW€û*´W®ö +p_…öªÃÕ^î«Ð^5ø]{ñ¹ +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€û*´W®ö +p_…öªÂw{•ñ± +íU‡«½ÜW¡½êpµW€ûjn¯:{µW@Û&´W½Û«lUh¯:\íà¾Û«Ž¾µW]„öªƒÕ^í«Ð^Uøn¯2>Vs{ÕÙ«½Ú6¡½êhµW`û*´W®ö +p_ÍíUe«½Ê´oB{ÕÑj¯ÀöUh¯:\íྚ۫Î^íж íUEïö*ÛcÚ«W{¸¯B{Õáj¯÷Uh¯:\íྠ+íU…ïö*ãcÚ«W{¸¯B{Õáj¯÷Uh¯:\íྠ+íU…ïö*ãcÚ«W{¸¯B{Õáj¯÷Uh¯:\íྠ+íUƒßµWŸ«Ð^u¸Ú+À}Ú«W{¸¯B{Õáj¯÷Uh¯*|·W«Ð^u¸Ú+À}Ú«W{¸¯B{Õáj¯÷Uh¯*|·W«Ð^u¸Ú+À}Ú«W{¸¯B{‹¡®½‚ ­öêþB——çíU¸Ñom¯^?>®¿Ç¾æöêvê¼Ú«÷íÕøYðãÇáóÛÓÑßüð][Ç÷ÓåYruºþs¾ûG¹ŸxðóáëܗkÎN?ooÇóà =Ào§÷Õ'øÛáx¹~-Uâ·ÓˆûêüãðözzkñÛiÄ}õ1~¾~:çsûØ×iÂÇêüúéœÎíc_§÷Õ'øõÓ9¾¶}FÜWŸà×OçårjñÛiÄ}õ1þz<¼|^ÚǾN>VŸàçÃåã­}ìë4â¾ú;¼¼¿·}FÜWŸà‡ËÛ{ýØo§÷ÕÇøåúé\®_Kuø:MøX}‚_?ë·Œ-~;¸¯>Á¯ŸÎù³}ìë4â¾ú¿½h²Ä×ë+ ÷ÕüúÊWB øXÍ u‰¯„šp_Í u‰¯„šp_Í u‰¯„šp_Í u‡+¡|¬æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÃ•P>VsB]â+¡&ÜWsB]â+¡&ÜWsB]â+¡&ÜWsBÝáJ¨«9¡.ñ•Pî«9¡.ñ•Pî«9¡.ñ•Pî«9¡®ðPg|®æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÃ•P>VcB]Ú·„šhÛÌ uI¯„šl_Í u‰¯„šp_ ug¯„hßÌ uI¯„šl_Í u‰¯„šp_ uißj¢m3'Ô­„챚ê_ 5á¾êÒ¾%ÔDÛfN¨Kz%ÔdûjN¨;\ 5àc5&Ô¥}K¨‰¶ÍœP—ôJ¨Éö՜P—øJ¨ ÷՜Pw¸jÀÇjN¨K|%ԄûjN¨K|%ԄûjN¨K|%ԄûjN¨;\ 5àc5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô®„ð±šê_ 5ᾚê_ 5ᾚê_ 5ᾚêWB øXÍ u‰¯„šp_Í u‰¯„šp_Í u‰¯„šp_Í u‡+¡|¬æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÂwBñ¹šê_ 5ᾚê_ 5ᾚê_ 5ᾚêWB øXÍ u‰¯„šp_Í u‰¯„šp_Í u‰¯„šp_Í u‡+¡|¬æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÄWBM¸¯æ„ºÃ•P>VsB]â+¡&ÜWsB]â+¡&ÜWcB]Ú·„šhÛÌ uG+¡{¬æ„ºÄWBM¸¯¦„º¤M¨ þº˜ê^ 5ѾšêWB øX uißj¢m3'Ô%½j²}5'Ô%¾jÂ}5&ԝ½j }3'Ô%½j²}5'Ô%¾jÂ}5&Ô¥}K¨‰¶ÍœPw´j°ÇjN¨K|%ԄûjN¨K|%ԄûjN¨K|%ԄûjN¨;\ 5àc5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô®„ð±šê_ 5ᾚê_ 5ᾚê_ 5ᾚê +ß uÆçjN¨K|%ԄûjN¨K|%ԄûjN¨K|%ԄûjN¨;\ 5àc5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô%¾jÂ}5'Ô®„ð±šê_ 5ᾚê_ 5ᾚêT— 5]èvî˅.ǧ uºÑoN¨×W´9¡^§n õǗ„úÿþñÏ?|{y哔úòyx}y»û’üÁ…Žß~Ý?âÛ+ómwzuݐ^=¸PJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½jð»ô*âsÒ«Wz¸¯BzÕáJ¯÷UH¯:\éྠ+éU…ïô*ãc5§W½Ò+ mÒ«ŽVz¶¯BzÕáJ¯÷՜^U¶Ò«Lû&¤W­ô +l_…ôªÃ•^î«9½êì•^m›^UôN¯²=V!½êp¥W€ûjN¯:{¥W@Û&¤W­ô +l_…ôªÂwz•ñ±šÓ«Î^éж éUG+½ÛW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W¾Ó«ŒUH¯:\éྠ+éU‡+½ÜW!½êp¥W€û*¤W ~—^E|®BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྠ+éU‡+½ÜW!½ªð^e|¬BzÕáJ¯÷UH¯:\éྚӫÎ^éж éUEïô*ÛcÒ«Wz¸¯Æôª£oéÀ_!½ê`¥W@û*¤W¾Ó«ŒÕœ^uöJ¯€¶MH¯:Zéؾ +éU‡+½ÜWszUÙJ¯2훐^u´Ò+°}Ò«Wz¸¯æôª³Wz´mBzUÑ;½ÊöX…ôªÃ•^^u¸Ò+À}Ò«Wz¸¯BzUá;½ÊøX…ôªÃ•^^u¸Ò+À}Ò«Wz¸¯BzUá;½ÊøX…ôªÃ•^^u¸Ò+À}Ò«Wz¸¯BzÕàwéUÄç*¤W®ô +p_…ôªÃ•^^u¸Ò+À}Ò« +ßéUÆÇ*¤W®ô +p_…ôªÃ•^^u¸Ò+À}Ò« +ßéUÆÇ*¤W®ô +p_…ôªÃ•^^…b¨M¯àB+½º¿Ðåô<½ +7úÍéÕõû§ÓÛõžœ^­S·ôês¤Wóݕ/‡·ÏÏ»¿õá㻼||< ®ŽÇÃé—e¯¸Ž}¹âüÁôãùzo_;?¸Îúvm_}‚¿]¿‚üöµs‡ßN#î«OðÃÛGKÿrᯋO^˜¹Þ(ZÁû=¥™«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZáû=¥«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZáû=¥«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZáû=¥«ðžÒ×{J÷UxOi‡ë=¥€û*¼§´ÃõžRÀ}ÞSZá;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,ßàw±|Äç*Äò®Xp_…X¾ÃËî«Ëw¸byÀ}bù +ß±|ÆÇjŽå;{Åò@Û&Äò­Xl_…X¾ÃËî«9–¯lÅò™öMˆå;Z±<ؾ +±|‡+–ÜWs,ßÙ+–Ú6!–¯èËg{¬B,ßáŠå÷ÕËwöŠå¶Mˆå;Z±<ؾ +±|…ïX>ãc5Çò½by mbùŽV,¶¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆå+|Çò«Ëw¸byÀ}bùW,¸¯B,ßáŠå÷Uˆåü.–ø\…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}bùW,¸¯B,_á;–ÏøX…X¾ÃËî«Ëw¸byÀ}5Çò½by mbùŠÞ±|¶Ç*Äò®Xp_±|Gßby€¿.B,ßÁŠåöUˆå+|Çò«9–ïìËm›Ëw´by°}bùW,¸¯æX¾²ËgÚ7!–ïhÅò`û*Äò®Xp_ͱ|g¯XhۄX¾¢w,Ÿí± +±|‡+–ÜW!–ïpÅò€û*Äò®Xp_…X¾Âw,Ÿñ± +±|‡+–ÜW!–ïpÅò€û*Äò®Xp_…X¾Âw,Ÿñ± +±|‡+–ÜW!–ïpÅò€û*Äò®Xp_…X¾ÁïbùˆÏUˆå;\±<ྠ+±|‡+–ÜW!–ïpÅò€û*Äò¾cùŒUˆå;\±<ྠ+±|‡+–ÜW!–ïpÅò€û*Äò¾cùŒUˆå;\±<ྠ+±|‡+–ÜW!–µwËÅV,¡ˇýæXþõóú­úå±ü:õk,ý~ï>–ÿÏ?üíozð‚Òë§|>}ûÆ;c¾ ô|¾þšû¤—ßs¼æΘïï2æJ3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!cnð»Œ9âs2æWÆ ¸¯BÆÜáʘ÷UȘ;\3ྠ+s…ïŒ9ãc5g̝½2f m2æŽVÆ ¶¯BÆÜáʘ÷՜1W¶2æLû&dÌ­Œl_…Œ¹Ã•1î«9cîì•1m›1WôΘ³=V!cîpèûjΘ;{eÌ@Û&dÌ­Œl_…Œ¹ÂwƜñ±š3æÎ^3ж sG+cÛW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*d̾3挏UȘ;\3ྠ+s‡+cÜW!cîpèû*dÌ ~—1G|®BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྠ+s‡+cÜW!c®ð1g|¬BÆÜáʘ÷UȘ;\3ྚ3æÎ^3ж sEïŒ9Ûc2æWÆ ¸¯ÆŒ¹£o3À_!cî`eÌ@û*d̾3挏՜1wöʘ¶MȘ;Z3ؾ +s‡+cÜWsÆ\Ùʘ3훐1w´2f°}2æWÆ ¸¯æŒ¹³WÆ ´mBÆ\Ñ;cÎöX…Œ¹Ã•11w¸2fÀ}2æWÆ ¸¯BÆ\á;cÎøX…Œ¹Ã•11w¸2fÀ}2æWÆ ¸¯BÆ\á;cÎøX…Œ¹Ã•11w¸2fÀ}2æWÆ ¸¯BÆÜàwsÄç*dÌ®Œp_…Œ¹Ã•11w¸2fÀ}2æ +ßsÆÇ*dÌ®Œp_…Œ¹Ã•11w¸2fÀ}2æ +ßsÆÇ*dÌ®Œp_…Œ¹Ã•11‡·Í˜áB+c¾¿Ðåüá}ã™öMxßxGë}ã`û*¼o¼Ãõ¾qÀ}5¾o¼£oïøë"¼o¼‚÷ûÆ3=Vá}ã®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý¿ õ#>W!Ôïp…ú€û*„ú®Pp_…P¿Ãêî«êWøõ3>Vs¨ßÙ+ÔÚ6!Ôïh…ú`û*„ú®Pp_Í¡~e+ÔÏ´oB¨ßÑ +õÁöUõ;\¡>ྚCýÎ^¡>ж ¡~EïP?ÛcBýW¨¸¯æP¿³W¨´mB¨ßÑ +õÁöUõ+|‡ú«9Ôïìêm›êw´B}°}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨_á;ÔÏøX…P¿Ãêî«êw¸B}À}BýW¨¸¯B¨ßàw¡~Äç*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«êw¸B}À}Bý +ß¡~ÆÇ*„ú®Pp_…P¿Ãêî«9Ôïìêm›êWôõ³=V!Ôïp…ú€ûj õ;úêüuBýV¨´¯B¨_á;ÔÏøXÍ¡~g¯PhۄP¿£êƒí«êw¸B}À}5‡ú•­P?Ó¾ ¡~G+ÔÛW!Ôïp…ú€ûjõ;{…ú@Û&„ú½CýlUõ;\¡>ྠ+¡~‡+ÔÜW!Ôïp…ú€û*„ú¾CýŒUõ;\¡>ྠ+¡~‡+ÔÜW!Ôïp…ú€û*„ú¾CýŒUõ;\¡>ྠ+¡~‡+ÔÜW!Ôïp…ú€û*„ú ~êG|®B¨ßá +õ÷Uõ;\¡>ྠ+¡~‡+ÔÜW!Ô¯ðêg|¬B¨ßá +õ÷Uõ;\¡>ྠ+¡~‡+ÔÜW!Ô¯ðêg|¬B¨ßá +õ÷Uõ;\¡>ྠ+¡~(ÍÛP.´Býû ]^Ÿ‡úáF¿ù}ã§ëÿr< Ô_§n¡þék¨ÿç?ýËÿáçŸúÓýþôò»{í¿^æÇ·z»ãæÃüüx{–íïÞ/Þx÷~÷W½ßƒ ¥Þ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_ƒßõ~Ÿ«Ðûu¸z?À}z¿W︯Bï×áêý÷Uèý*|÷~«¹÷ëìÕûm›Ðûu´z?°}z¿W︯æÞ¯²ÕûeÚ7¡÷ëhõ~`û*ô~®Þp_ͽ_g¯Þhۄޯ¢wï—í± +½_‡«÷ÜWsï×Ù«÷Ú6¡÷ëhõ~`û*ô~¾{¿ŒÕÜûuöêý€¶Mèý:Z½ؾ +½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷«ðÝûe|¬Bï×áêý÷Uèý:\½ྠ+½_‡«÷ÜW¡÷kð»Þ/âsz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷Uèý:\½ྠ+½_…ïÞ/ãcz¿W︯Bï×áêý÷ÕÜûuöêý€¶Mèý*z÷~Ù«Ðûu¸z?À}5ö~}ëýþº½_«÷ÚW¡÷«ðÝûe|¬æÞ¯³Wï´mBï×ÑêýÀöUèý:\½ྚ{¿ÊVï—i߄ޯ£Õûí«Ðûu¸z?À}5÷~½z? mz¿ŠÞ½_¶Ç*ô~®Þp_…Þ¯ÃÕûî«Ðûu¸z?À}z¿ +ß½_ÆÇ*ô~®Þp_…Þ¯ÃÕûî«Ðûu¸z?À}z¿ +ß½_ÆÇ*ô~®Þp_…Þ¯ÃÕûî«Ðûu¸z?À}z¿¿ëý">W¡÷ëpõ~€û*ô~®Þp_…Þ¯ÃÕûî«ÐûUøîý2>V¡÷ëpõ~€û*ô~®Þp_…Þ¯ÃÕûî«ÐûUøîý2>V¡÷ëpõ~€û*ô~®Þp_…Þ/&j]ïZ½ßý….—ç½_¸Ñoîý֟¸çÞoºõ~gèýþðýÇËïþý_g÷wý®åtùöËÜ;_×{ýæâéëzwo¾{ û«‡èÁ…R”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Áïz ˆÏUè:\=ྠ+=P‡«ÜW¡êpõ@€û*ô@¾{ ŒÕÜuöꁀ¶Mè:Z=ؾ +=P‡«ÜWsTÙê2í›Ðu´z °}z W¸¯æ¨³W´mBTÑ»ÊöX…¨ÃÕêìÕm›Ðu´z °}z  +ß=PÆÇjî:{õ@@Û&ô@­l_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«ÐUøî2>V¡êpõ@€û*ô@®p_…¨ÃÕî«Ð5ø]ñ¹ +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€û*ô@®p_…¨Âw”ñ± +=P‡«ÜW¡êpõ@€ûjî:{õ@@Û&ô@½{ lUè:\=à¾{ Ž¾õ@]„¨ƒÕí«ÐUøî2>VsÔÙ«Ú6¡êhõ@`û*ô@®p_Í=Pe«Ê´oBÔÑêÀöUè:\=ྚ{ Î^=ж =PEï(Ûcz W¸¯BÔáê÷Uè:\=ྠ+=P…ï(ãcz W¸¯BÔáê÷Uè:\=ྠ+=P…ï(ãcz W¸¯BÔáê÷Uè:\=ྠ+=Pƒßõ@Ÿ«Ðu¸z À}z W¸¯BÔáê÷Uè*|÷@«Ðu¸z À}z W¸¯BÔáê÷Uè*|÷@«Ðu¸z À}z W¸¯Bҕ¶‚ ­èþB© +7=Ð%÷@çëo6——ë×u±Ò©[ô:{ ßÿôã_þéÇ?þð·Gï|úxý8~wOù…N‡ãûùø´Z¯bÊ·Õ¹/×}þ*¦G +¯b"ÜWó«˜J|½Š‰p_ͯb*ñ•^î«9½êp¥W€Õœ^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^u¸Ò+ÀÇjN¯J|¥W„ûjN¯J|¥W„ûjN¯J|¥W„ûjN¯:\éàc5§W%¾Ò+Â}5§W%¾Ò+Â}5§W%¾Ò+Â}5§W¾Ó«ŒÏ՜^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^u¸Ò+ÀÇjL¯Jû–^m›9½*é•^‘í«9½*ñ•^î«1½êì•^í›9½*é•^‘í«9½*ñ•^î«1½*í[zE´mæôª£•^=VszUâ+½"ÜWczUÚ·ôŠhÛÌéUI¯ôŠl_ÍéU‡+½|¬Æôª´oéѶ™Ó«’^éÙ¾šÓ«_éᾚӫWzøXÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‡+½|¬æôªÄWzE¸¯æôªÄWzE¸¯æôªÄWzE¸¯æôªÃ•^>VszUâ+½"ÜWszUâ+½"ÜWszUâ+½"ÜWszÕáJ¯«9½*ñ•^î«9½*ñ•^î«9½*ñ•^î«9½êp¥W€Õœ^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^UøN¯2>WszUâ+½"ÜWszUâ+½"ÜWszUâ+½"ÜWszÕáJ¯«9½*ñ•^î«9½*ñ•^î«9½*ñ•^î«9½êp¥W€Õœ^•øJ¯÷՜^•øJ¯÷՜^•øJ¯÷՜^u¸Ò+ÀÇjN¯J|¥W„ûjN¯J|¥W„ûjL¯Jû–^m›9½êh¥W`Õœ^•øJ¯÷Ք^•ô¯éÁ_szUÂ+½"ÚWszÕáJ¯«1½*í[zE´mæôª¤WzE¶¯æôªÄWzE¸¯Æôª³Wz´oæôª¤WzE¶¯æôªÄWzE¸¯Æôª´oéѶ™Ó«ŽVzöXÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‡+½|¬æôªÄWzE¸¯æôªÄWzE¸¯æôªÄWzE¸¯æôªÃ•^>VszUâ+½"ÜWszUâ+½"ÜWszUâ+½"ÜWszUá;½Êø\ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‰¯ôŠp_ÍéU‡+½|¬æôªÄWzE¸¯æôªÄWzE¸¯æôªÄWzE¸¯æôªÃ•^>VszUâ+½"ÜWszUâ+½"ÜWsz•Š¡2½¢ ÝÎ}¹Ðåíiz•nô[_Åtþ¸¿\¿¢ÍéÕ:uK¯.3½ú?þú·Ÿÿù¯?ÿéŸþӏÍÏñú û·/Úï¸ù +¦Ïëo<Ïò+PñÆ»€º¿r( \(P€û*P® +p_…ªÂw•ñ± +T‡«€ÜW¡€êpP€û*P® +p_…ªÂw•ñ± +T‡«€ÜW¡€êpP€û*P® +p_…ªÂw•ñ± +T‡«€ÜW¡€êpP€û*P® +p_…ªÁï +¨ˆÏU( :\ྠ+T‡«€ÜW¡€êpP€û*P¾ ¨ŒÕ\@uö* €¶M( :Zؾ +T‡«€ÜWsUÙ* 2í›P@u´ +(°} +¨W¸¯æª³W´mBUÑ»€ÊöX…ªÃU@€êìU@m›P@u´ +(°} +¨ +ßTÆÇj. :{P@Û&P­ +l_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@Uø. 2>V¡€êpP€û*P® +p_…ªÃU@î«P@5ø]õÿWv7˵^ivo¥š™~Îpš–l«áÂa•/ #Š’+,+’´u÷ȽæÚ{.ìwŒÓÿ8Ÿ/€d‡Äx÷ˆŸ«P@9<འ+”ÃS@Þ«P@9<འ+”Âw5ãÇ*POx¯BåðP€÷*POx¯B¥ð]@Íø± +”ÃS@Þ«P@9<འ+”ÃS@Þ«P@)|P3~¬BåðP€÷*POx¯Î”³WtmB¥è]@Íö± +”ÃS@Þ«cåèKðí"PNt¯B¥ð]@Íø±:PÎ^е ”£S@Ý«P@9<à½:PÊN5Ó½ ”£S@Ý«P@9<à½:PÎ^е ”¢w5ÛÇ*POx¯BåðP€÷*POx¯B¥ð]@Íø± +”ÃS@Þ«P@9<འ+”ÃS@Þ«P@)|P3~¬BåðP€÷*POx¯BåðP€÷*P¿* Fü\…Êá) ïU( ž +ð^…Êá) ïU( ¾ ¨?V¡€rx +(À{ +(‡§€¼W¡€rx +(À{ +(…ïjƏU( ž +ð^…Êá) ïU( †hÇPðB«€º~¡ïo÷ ¨á~º€z{zx}|ýÔzêR@½žÔñ«àOOÿüœ+á«èéåí^ôôôòðú㏟‹Ç—Ìs7oyþnúÓëÇÏqŸ?Á~ñB_à—§ïÕ;øûÃçÄsôÏ"|»ø5ûüôðôöø*áõ4ÑÇêüãûòúd¿àëiÄ{õþñ}ùþôÃ◧ïÕ;øÇ÷æÛ³þ²_žF¼W¿Æ_>¾;//ö˾ž&üX½ƒ|wž_ì—}=x¯ÞÁ?¾;Oßì—}=x¯ÞÁ?¾;ßŸ-~yñ^ýÿöôðøã»ý²¯§ ?Vïà/ßß_í—}=x¯ÞÁ_ßÞì—}=x¯ÞÁß¾¿¾é/ûåiÄ{õküûÇwçûçÏ® +_O~¬ÞÁ?¾;ß~Ø/ûzñ^½ƒ|w^~Ø/ûzñ^½ƒ|w^õ—ýò4â½z§^¯©ðý¡3~¬Â‡v:<É:འ+ɺÓ¬Þ«¬;<É:འ+ɺÂw²>ãÇ*$ëO²x¯B²îð$ë€÷*$ëO²x¯B²®ð¬Ïø± +ɺÓ¬Þ«¬;<É:འ+ɺÓ¬Þ«¬+|'ë3~¬B²îð$ë€÷*$ëO²x¯B²îð$ë€÷*$ë¿JÖGü\…dÝáIÖïUHÖždð^…dÝáIÖïUHÖ¾“õ?VçdÝÙ+Yº6!Ywt’u°{’u‡'Y¼Wçd]ÙIÖgº7!Ywt’u°{’u‡'Y¼WçdÝÙ+Yº6!YWôNÖgûX…dÝáIÖïÕ9YwöJց®MH֝dì^…d]á;YŸñcuN֝½’u k’uG'Y»W!Ywx’uÀ{’u…ïd}ƏUHÖždð^…dÝáIÖïUHÖždð^…d]á;YŸñc’u‡'Y¼W!Ywx’uÀ{’u‡'Y¼W!YWøNÖgüX…dÝáIÖïUHÖždð^…dÝáIÖïUHÖ¾“õ?V!Ywx’uÀ{’u‡'Y¼W!Ywx’uÀ{’u…ïd}ƏUHÖždð^…dÝáIÖïUHÖždð^…dÝàWÉúˆŸ«¬;<É:འ+ɺÓ¬Þ«¬;<É:འ+ɺÂw²>ãÇ*$ëO²x¯B²îð$ë€÷*$ëO²x¯B²®ð¬Ïø± +ɺÓ¬Þ«¬;<É:འ+ɺÓ¬Þ«¬+|'ë3~¬B²îð$ë€÷*$ëO²x¯Îɺ³W²tmB²®è¬Ïö± +ɺÓ¬Þ«c²îèK²ðí"$ëN²t¯B²®ð¬Ïø±:'ëÎ^É:е ɺ£“¬ƒÝ«¬;<É:à½:'ëÊN²>Ó½ ɺ£“¬ƒÝ«¬;<É:à½:'ëÎ^É:е ɺ¢w²>ÛÇ*$ëO²x¯B²îð$ë€÷*$ëO²x¯B²®ð¬Ïø± +ɺÓ¬Þ«¬;<É:འ+ɺÓ¬Þ«¬+|'ë3~¬B²îð$ë€÷*$ëO²x¯B²îð$ë€÷*$ë¿JÖGü\…dÝáIÖïUHÖždð^…dÝáIÖïUHÖ¾“õ?V!Ywx’uÀ{’u‡'Y¼W!Ywx’uÀ{’u…ïd}ƏUHÖždð^…dÝáIÖïUHևäÚ&ëðB+Y¿~¡ïï÷“õፎdý;$ëßß?þ1KÅúå¡K°þv ÖÿÃ/¿ÿ/ÿôOÿå·ß~ùí«Xúùñó_è·x~øöù~w‚õ0O¯¸ æ«wæóm¦~y–kêe%'^žåڄtÙÈ»\åބnYÉɖg¹6!ZVršåY®M(–•œ`y–kre#ïZy”{Ze%'UžåڄPYÉé”g¹6¡RVr"åY®MH”¼ åQîM蓕œ}¢wÚÚÝŽ/»Äë· +Ä/^hJgüX…Ñá©ïUèžð^…ÑáiïU¨¾sÄ?V!HtxŠDÀ{šD‡'J¼W!KtxºDÀ{ÊD…ï4qƏUˆž:ð^…>Ñá ïUHžFð^…JQá;SœñcBE‡§T¼W¡UtxbEÀ{rE‡§W¼W¡XTøNgüX…hÑá©ïUèžpð^…tÑáiïU¨¾óÅ?V!`tx +FÀ{F‡'b¼W!ctx:FÀ{JFƒ_¥Œ#~®BÌèðԌ€÷*ôŒOÐx¯BÒèð4€÷*T +ßY㌫sØèìU6]›Ð6::q#ؽ +y£ÃÓ7Þ«sá¨ì$Ž3ݛ9::•#ؽ +£Ã:Þ«sêèìÕ:]›P;*z玳}¬Bðèð€÷êÜ<:{E@×&dŽN÷v¯Bù¨ð>Îø±:ǏÎ^õ#е ý££@‚Ý«@:< $འ+¤Âw9ãÇ*„O x¯B éðЀ÷*äO x¯B©ðDÎø± +Q¤ÃSEÞ«ÐE:¼ûø¹nN¨×S—„úi'ÔÿÛÿëÓ÷¿üò/¿Ÿ õÇÿ§=ÿñ»¬WÆÙP{ÿö~¯¡~|ÿ°þø3Áøšyîæ=ÏßNzzxþü _¼Ïi_&º7ïÈ/¯?>twôåi´{õþúñ쏋_žF¼Wïàï¯úKþdzß.މÆWU¯àÝêÏô± +­¾ÃÓêÞ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê+|·ú3~¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷*´úO«x¯B«¯ðÝêÏø± +­¾ÃÓêÞ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê+|·ú3~¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷*´úO«x¯B«oð«VÄÏUhõžVð^…VßáiõïUhõžVð^…V_á»ÕŸñcunõ½Z} kZ}G§Õ»W¡ÕwxZ}À{unõ•V¦{Z}G§Õ»W¡ÕwxZ}À{unõ½Z} kZ}EïV¶UhõžVð^[}g¯VèڄVßÑiõÁîUhõ¾[ý?VçVßÙ«Õº6¡ÕwtZ}°{Z}‡§Õ¼W¡ÕWønõgüX…VßáiõïUhõžVð^…VßáiõïUhõ¾[ý?V¡ÕwxZ}À{Z}‡§Õ¼W¡ÕwxZ}À{Z}…ïVƏUhõžVð^…VßáiõïUhõžVð^…V_á»ÕŸñcZ}‡§Õ¼W¡ÕwxZ}À{Z}‡§Õ¼W¡ÕWønõgüX…VßáiõïUhõžVð^…VßáiõïUhõ ~Õêø¹ +­¾ÃÓêÞ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê+|·ú3~¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷êÜê;{µú@×&´úŠÞ­þl«Ðê;<­>à½:¶úŽ¾´úß.B«ïà´ú@÷*´ú +ß­þŒ«s«ïìÕê]›Ðê;:­>ؽ +­¾ÃÓêÞ«s«¯ì´ú3ݛÐê;:­>ؽ +­¾ÃÓêÞ«s«ïìÕê]›Ðê+z·ú³}¬B«ïð´ú€÷*´úO«x¯B«ïð´ú€÷*´ú +ß­þŒ«Ðê;<­>འ+­¾ÃÓêÞ«Ðê;<­>འ+­¾Âw«?ãÇ*´úO«x¯B«ïð´ú€÷*´úO«x¯B«oð«VÄÏUhõžVð^…VßáiõïUhõžVð^…V_á»ÕŸñcZ}‡§Õ¼W¡ÕwxZ}À{Z}‡§Õ¼W¡ÕWønõgüX…VßáiõïUhõžVð^…V(Ím«/´Zýëz}½ßêoô³­þço•¿ÿøø‰vlõóÔ¥ÕÞ­þÿñ×çïùå³×ÿ·/jýLJ——¿½®•ókøããoÁ»µþÓÃÇ?^èEóÜ͛ž¿Ÿþøòðöòúåû|aÿù0ÒµyG~}x~~}³ôåi´{õ~¹e ñu!ð^/$8{]Hº7ç ’^ÈîÕùB‚ÄׅÂ{uº é?/$|»8_Hpp.$}¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_HPø¾0ãçê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇêx!Aڗ D×æ|!AÒëBÙ½:_Høº@x¯Žœ½.$ݛó…I¯ d÷ê|!AâëBá½:^HöåBѵ9_Hpt.$€}¬Î$¾.$Þ«ã…i_.$]›ó…I¯ d÷ê|!ÁṐø±:^HöåBѵ9_Hôº@v¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó…‡çBàÇê|!AâëBá½:_Høº@x¯Î$¾.$Þ«ó……ï 3~®Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷ê|!AâëBá½:_Hpx.$~¬Î$¾.$ޫ󅉯 „÷êx!Aڗ D×æ|!Áѹö±:_Høº@x¯N$ýç…‚oç ^ˆîÕùB‚Ãs!ðcu¼ í˅¢ks¾ éu!ì^/$H|]H ¼WÇ Î^€îÍùB‚¤×…²{u¾ ñu!ð^/$Hûr!èڜ/$8:À>Vç _ïÕùB‚ÄׅÂ{u¾ ñu!ð^/$8<?Vç _ïÕùB‚ÄׅÂ{u¾ ñu!ð^/$8<?Vç _ïÕùB‚ÄׅÂ{u¾ ñu!ð^/$(|_H˜ñsu¾ ñu!ð^/$H|]H ¼Wç _ïÕùB‚Ãs!ðcu¾ ñu!ð^/$H|]H ¼Wç _ïÕùB‚Ãs!ðcu¾ ñu!ð^/$H|]H ¼Wç sݯ.$Ð ]ž»y¡×÷»¦7:.$|‡ f ßàBÂzêr!áåË ÿø×÷Ç¿üÛ¿þr^JøüÛÓç¿è¼Òúžž>þn¸w)a×Ôã ïšúú‡šú‹šjjÀ{jj‡§¦¼W¡¦vxjjÀ{jj…ïšzƏU¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^…šÚá©©ïU¨©¾kê?V¡¦vxjjÀ{jj‡§¦¼W¡¦vxjjÀ{jj…ïšzƏU¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^…šÚá©©ïU¨© ~USø¹ +5µÃSSÞ«PS;<55འ+5µÃSSÞ«PS+|×Ô3~¬Î5µ³WM tmBMíèÔÔ`÷*ÔÔOM x¯Î5µ²SSÏtoBMíèÔÔ`÷*ÔÔOM x¯Î5µ³WM tmBM­è]SÏö± +5µÃSSÞ«sMíìUS]›PS;:55ؽ +5µÂwM=ãÇê\S;{ÕÔ@×&ÔԎNM v¯BMíðÔԀ÷*ÔÔ +ß5õŒ«PS;<55འ+5µÃSSÞ«PS;<55འ+5µÂwM=ãÇ*ÔÔOM x¯BMíðÔԀ÷*ÔÔOM x¯BM­ð]SÏø± +5µÃSSÞ«PS;<55འ+5µÃSSÞ«PS+|×Ô3~¬BMíðÔԀ÷*ÔÔOM x¯BMíðÔԀ÷*ÔÔ +ß5õŒ«PS;<55འ+5µÃSSÞ«PS;<55འ+5µÁ¯jê?W¡¦vxjjÀ{jj‡§¦¼W¡¦vxjjÀ{jj…ïšzƏU¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^kjg¯šèڄšZÑ»¦žícjj‡§¦¼WǚÚїšàÛE¨©œšè^…šZỦžñcu®©½jj kjjG§¦»W¡¦vxjjÀ{u®©•šz¦{jjG§¦»W¡¦vxjjÀ{u®©½jj kjjEïšz¶U¨©žšð^…šÚá©©ïU¨©žšð^…šZỦžñcjj‡§¦¼W¡¦vxjjÀ{jj‡§¦¼W¡¦Vø®©güX…šÚá©©ïU¨©žšð^…šÚá©©ïU¨© ~USø¹ +5µÃSSÞ«PS;<55འ+5µÃSSÞ«PS+|×Ô3~¬BMíðÔԀ÷*ÔÔOM x¯BMíðÔԀ÷*ÔÔ +ß5õŒ«PS;<55འ+5µÃSSÞ«PS°­©á…VM}ýBo÷kêá~úóæ?þñãÇwˆ©/]Zêo»¥þ¿üöÛßþëýôÓûÿ«¾çûžžÞ>¬§§ÜñôÕíôù6S:=˵ ᴒÓMÏrmB5­äDÓ³\›LyӣܛÐK+9¹ô,×&ÄÒJN+=˵ ¥´’JÏrmB&mä]IroB#­ä$Ò³\›H+9}ô,×&ÔÑJN=˵ i´‘w=ʽ ]´’“EÏrmB­ä4ѳ\›PD+9Aô,×&äÐFÞ5ô(÷&´ÐJN +=˵ !´’ÓAÏrmB­äDг\›@yУܛÐ?+9ùó,×&ÄÏJNû<˵ 峒>ÏrmBölä]=roBó¬ä$ϳ\›<+9½ó,×&ÔÎJNì<˵ ©³‘wé<ʽ ³’“9ÏrmBä¬ä4γ\›P8+9ó,×&äÍB¾ª›'ù؄¶YÉI›g¹6!lVrºæY®M¨š•œ¨y–k’f#ï¢y”{sræÙ½]„˜Y¹i™g¸6¡dVrBæY®Í9c6p*æÑ­Eh˜•›„y†kf%§_žåڜëe¯xyvo!]6î.—G¸7¡[Vr²åY®Í9ZVðj–g÷vŠeå&Xžáڄ\ÙÈ»Våޜ[e¯Tyvo!TVn:å®M¨”•œHy–ke#ïBy”{úd%'Ožåڄ8YÉi“g¹6¡LVrÂäY®MȒ¼«äQîMh’•œ$y–k‚d%§GžåڄYɉ‘g¹6!E6ò.‘G¹7¡CVr2äY®Mˆ•œy–k +d%'@žåڄüØÈ»>åބöXÉIg¹6!~{y…”w=uiy¿ï–÷?ýòûÿøëÓã_~ýûÿûùýÿùõŸÎª÷ۏ‡÷ŸÿFùÊúâS‘__¿Ýëzw6¾îÄ®ßw(ľx¡)¼W!sx*1À{:1‡'¼W!SønÅfüX…ZÌáÉÅïUÆžb ð^…fÌá‰ÆïUÈƾ»±?V¡sxÒ1À{â1‡§¼W¡sx2À{2…ï†lƏU¨ÈžŒ ð^…Ìá)ÉïUhÉž˜ ð^…œLá»'›ñcŠ2‡')¼W!*sxª2À{º2‡',¼W!-3øU[6âç*ÔeO^x¯B`æðf€÷*4fOdx¯Bf¦ðݙÍø±:—fÎ^©е ±™£S›Ý«Ð›9<Áà½:'gÊNs6Ó½ ՙ£“Ý«ž9<åà½:·gÎ^ñе ù™¢w6ÛÇ*hO‚x¯Îš³W…tmB‡æè„h`÷*¤h +ß-ڌ«sæ앣]›¤9:Eؽ +MšÃ¥Þ«¥)|wi3~¬B™æð¤i€÷*ÄiOx¯BŸæðj€÷*$j +ߍڌ«P©9<™འ+¡šÃSªޫЪ9<±འ+¹šÂw¯6ãÇ*kO²x¯B´æðTk€÷*tkO¸x¯Bº¦ðÝ®Íø± +õšÃ“¯Þ«°9<འ+ ›Ã±Þ«±)|wl3~¬BÉæð¤l€÷*ÄlOÍx¯BÏæðm€÷*$m¿jÚFü\…ªÍáÉÚïUÛž² ð^…¶Íá‰ÛïUÈÛ¾û¶?V¡psx7À{"7‡§r¼W¡ssxB7À{R7…ïÖmƏU¨ÝžÜ ð^…àÍá)ÞïUhÞžè ð^…ìMá»{›ñcÊ7‡'}¼W!~sxê7À{uîߜ½8 k8Eïn¶U¨àž ð^C8G_J8€o¡…spb8 {r8…ïnƏչˆsöJ‮Mˆâ*ì^….Îá ãïÕ9SvÚ¸™îM¨ã<ì^…@Îá)äïÕ¹‘söŠä€®MÈä½;¹Ù>V¡”sxR9À{b9‡§–¼W¡—sx‚9À{’9…ïfnƏU¨æžlð^…pÎá)çïUhçžxð^…|Nở›ñc +:‡'¡¼W!¢sx*:À{::‡'¤¼W!¥3øUK7âç*ÔtONx¯BPçðu€÷*4uOTx¯BV§ðÝÕÍø± +eÃ“ÖÞ«×9õï‹š>öoƏUøà?‡ç“ÿïUøì?‡çÃÿïUøø?‡çóÿïUø@…ïÄsƏUH<žÄð^…ÄÓáI<ïUH<žÄð^…ÄSá;ñœñcO‡'ñ¼W!ñtxOÀ{O‡'ñ¼W!ñTøNV!ñtxOÀ{uL<}I<¾]„ÄÓÁI<îUH<¾Ï?VçÄÓÙ+ñº6!ñttO°{O‡'ñ¼WçÄSÙIV¡°tx +KÀ{ +K‡§°¼W¡°tx +KÀ{ +K…ïÂrƏU(,žÂð^…ÂÒá),ïU(,žÂð^…ÂRá»°œñc +K‡§°¼W¡°tx +KÀ{ +K‡§°¼W¡°4øUa9âç*–Oa x¯Baéð–€÷*–Oa x¯Ba©ð]XÎø± +…¥ÃSXÞ«PX:<…%འ+…¥ÃSXÞ«PX*|–3~¬Baéð–€÷*–Oa x¯Ba9–®°„Z…åõ ½}¿_XoôӅåãËÇÏò?Ñ΅åŸO½¯ÂòÇmayf•ÿ_úöô~õ~ùÅûþøñ·Þ¬òñõáùù™w5ñÅçn^ñüÅôÇ÷úüSÃ/ô~yñ^ýzzxþüʾVáF€Ãs#ð^o8úr#àÛE¸ààܺWáF€Â÷€?VçÎ^7€®M¸àèÜ»WáF€Ãs#ð^o(;7fº7áF€£s#ì^…ύÀ{u¾àìu#èڄŠÞ7fûX…ύÀ{n8<7ïU¸àðܼWáF€Â÷€?VáF€Ãs#ð^…ύÀ{n8<7ïU¸ ð}#`ƏU¸àðܼWáF€Ãs#ð^…ύÀ{nüêFÀˆŸ«p#Àá¹x¯Â‡çFའ+7ž€÷*ÜPø¾0ãÇ*ÜpxnÞ«p#Àá¹x¯Â‡çFའ+7¾oÌø± +7ž€÷*ÜpxnÞ«p#`ÌÜݍx¡u#àú…ÞÞïßÞègo<}ü3þùýõÛ|# Oýy#àãgÁÜø?ÿýÿýʼn€Ï éãñëõók÷üùk÷N¼<¼}þ†Óü~뱛÷ûâ@ÀåŽÀW¯3\' »Wçë_× ïÕñ:³×u {s¾N éu€ì^¯H|]' ¼W§ë’þó:Á·‹óuç:ÐÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu…ïë3~®Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Ž× ¤}¹N@tmÎ× $½®Ý«óu‰¯ë„÷êxÀÙë:н9_'ôºN@v¯Î× $¾®Þ«ãui_®]›óuGç:ØÇê|@âë:á½:^'öå:ѵ9_'ôºN@v¯Î× žë€«ãui_®]›óuI¯ëd÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'px®~¬Î× $¾®Þ«óu‰¯ë„÷ê|@âë:á½:_'Pø¾N0ãçê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Î× $¾®Þ«óu‡ç:àÇê|@âë:á½:_'øºN@x¯Ž× ¤}¹N@tmÎ× ë`«óu‰¯ë„÷êt@Ò^' øvq¾N áu€è^¯8<× ?VÇëÒ¾\' º6çë’^× ÈîÕù:Ä×uÂ{u¼Nàìuèޜ¯Hz]' »Wçë_× ïÕñ:´/× ˆ®Íù:£sìcu¾N ñu€ð^¯H|]' ¼Wçë_× ïÕù:Ãsðcu¾N ñu€ð^¯H|]' ¼Wçë_× ïÕù:Ãsðcu¾N ñu€ð^¯H|]' ¼Wçë_× ïÕù:Â÷u‚?Wçë_× ïÕù:Ä×uÂ{u¾N ñu€ð^¯8<× ?Vçë_× ïÕù:Ä×uÂ{u¾N ñu€ð^¯8<× ?Vçë_× ïÕù:Ä×uÂ{u¾N0öê:½Ð幛zº{`z£Ÿ¾NðñCåËËw8Npyèr›àéê6Á/¿üýýÛïûª{ûümνß/ñôðãó—“îœ'XÝöô~+Û¾z½¡Ú>ßdŠ¶G·7!ÙVrŠíY®M赕œ\{–kbm%§ÕžåڄRÛÈ;ÔåބL[É©´g¹6¡ÑVríY®M´•œ>{–kêl#ï8{”{Òl%§Ìžåڄ.[Éɲg¹6!ÊVršìY®M(²¼ƒìQîMȱ•œ{–kZl%'Şåڄ[Éé°g¹6¡Â6òŽ°G¹7!ÁVr +ìY®M试œüz–kâk%§½žåڄòÚÈ;¼åބìZÉ©®g¹6¡¹Vr’ëY®M®•œÞz–kjk#ïØz”{Rk%§´žåڄÎZÉɬg¹6!²VrëY®M(¬¼ëQîMÈ«•œºz–kÚj%'­žåڄ°ZÉéªg¹6¡ªòUT=ÉÇ&$ÕJNQ=˵ =µ’“SÏrmBL­ä´Ô³\›PRy‡Ô£Ü›sF­àUQÏîí"4ÔÊMB=õ µ’ÓOÏrmÎõ´On-B:­Ü”Ó3\›ÐM+9Ùô,×æM+x5Ó³{»Å´qw0=½ ¹´’SKÏrmέ´‚W*=»·‹J+7ô ×&TÒFޑô(÷æœH+xÒ³{»}´r“GÏpmB­ä´Ñ³\›PFy‡Ñ£Ü›E+9Uô,×&4ÑJN=˵ A´’ÓCÏrmB mäCroB +­ä”г\›ÐA+9ô,×&DÐJN=˵ ´‘w=ʽ ù³’S?ÏrmBû¬ä¤Ï³\›>+9Ýó,×&TÏFÞÑó(÷&$ÏJNñ<˵ ½³’“;ÏrmBì¬ä´Î³\›P:y‡Î£Ü›9+9•ó,×&4ÎJNâ<˵ ³’Ó7ÏrmBÝ,䫸y’MH›•œ²y–kºf%'kžåڄ¨YÉišg¹6¡h6òšG¹7!gVrjæY®Mh™•œ”y–kBf%§cžåڄŠÙÈ;båބ„YÉ)˜g¹6¡_VròåY®Mˆ—•œvy–kÊe#ïpy”{²e%§ZžåڄfYÉI–g¹6ç`YÁ«WžÝÛE¨•»cåîMH••œRy–ks씕{ɔgõf"e¥¦QžÝڄBÙÈ;Påޜód¯:yvo¡MVnÒä®M“•œ.y–ks®’ œ(ytk’då¦HžáڄYÉɑg¹6çYÁ«EžÝÛE(‘»CäîMȐ•œ +y–kd%'AžåڄYÉég¹6¡>6òŽG¹7!=VrÊãY®M莕œìx–k¢c%§9žåڄâØÈ;8åބÜXÉ©g¹6¡5VrRãY®M•œÎx–k*c!_EƓ|lBb¬äƳ\›Ð+9yñ,×&ÄÅJN[<˵ e±‘wX<ʽ Y±’SÏrmBS¬ä$ų\›+9=ñ,×&ÔÄFÞ1ñ(÷&¤ÄJNI<˵ ±’“ÏrmBD|?ƒµ ñü6+!¾z›÷o÷ âû¯óÓñ뷇—÷—W(ˆÿ|* ñómBüŸþöÿýòU¸ûöýóüÖ_ûÓ ñnj¯&¦¨öú-‡ªö‹š²ZÀ{ÂZ‡§¬¼W¡­UøŽkgüX…¼ÖáékïU(lžÄð^…ÈÖá©lïUèl¾CÛ?V!µuxZ[À{j[‡'·¼W!¸uxŠ[À{š[…ïèvƏUÈnžîð^…òÖáIoïUˆožúð^…þVá;Àñc\‡§Á¼W¡Âux2\À{B\‡§Ä¼W¡ÅUøŽqgüX…×áéqïU(rž$ð^…(×á©rïUèr¾ÃÜ?V!ÍuxÚ\À{ê\‡'ϼW!Ðux +]À{]…ïHwƏUÈtžNð^…R×áIuïUˆužZð^…^×àWÁ«ì:<Í.འ+ծÓíÞ«î:<å.འ+í®Âw¼;ãÇêœï:{õ»@×&¼ŽN v¯BÄëðT¼€÷êÜñ*;!ïL÷&¤¼ŽNË v¯BÍëð伀÷êô:{½@×&4½ŠÞQïl«õ:<]/à½:—½Î^i/е q¯£S÷‚Ý«Ð÷*|¾3~¬Î‰¯³Wã tmBåëèd¾`÷*„¾Oé x¯Bë«ðûÎø± +¹¯ÃÓûÞ«Pü:<É/འ+ѯÃSýÞ«Ðý*|‡¿3~¬Búë𴿀÷*Ô¿Oþ x¯BìðÀ€÷*4À +ßðŒ«;<0འ+%°Ã“Þ«;<50འ+=°Âw<ãÇ*$ÁO x¯BìðdÁ€÷*„ÁO x¯B¬ðÏø± +y°ÃÓÞ«P;<‰0འ+‘°ÃS Þ«Ð ü*ñsRa‡§¼W¡vxraÀ{‚a‡§¼W¡VøŽ†güX…lØáé†ïU(‡žtð^…xØᩇïU臾â?V!!vxbÀ{*b‡'#¼W!$vxJbÀ{Zb…ï˜xƏUȉžžð^…¢ØáIŠïÕ9*vöªŠ®M芽ÃâÙ>V!-vxÚbÀ{u¬‹}ɋ¾]„ÀØÁ)ŒîUhŒ¾#ã?VçÌØÙ«3º6¡4vtRc°{bc‡§6¼WçÞXÙ Žgº7!9vtšc°{ªc‡';¼WçðØÙ«<º6¡=VôŽgûX…üØáéïU(žð^…ÙᩐïU萾Cä?V!EvxZdÀ{jd‡'G¼W!HvxŠdÀ{šd…ï(yƏUȒž.ð^…2ÙáI“ïUˆ“ž:ð^…>ÙàWòˆŸ«(;<2འ+•²Ã“)Þ«*;<¥2འ+­²Âw¬<ãÇ*äÊO¯ x¯B±ìð$ˀ÷*DËOµ x¯B·¬ð.Ïø± +é²ÃÓ.Þ«P/;<ù2འ+óáڂ^h%Ì×/ôþý~Ã<¼ÑOGÌߟ>þA÷ózê1¿ÜFÌ¿¿þøôðþG]{5Ìï?^¾Ý+˜_Þþø§ñ×c7/xþZúãëÃóóç¿ñûâu¾ /O£Ý«wð÷‡·§Ï?°8üò4â½ú5þôôðüùßS”}y˜èÞ¼#¿<¼þxµôåi´{õþúñ3ûû5_O#Þ«wð??›Ûїûøv>î[Áûó¾gúX…OüvxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'0øÕy‚?Wá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏÕù<³×y kÎ8:ç ÀîU8Oàðœ'¼WçóÊÎy‚™îM8Oàèœ'»Wá<Ãsžð^Ï8{'º6á<¢÷y‚Ù>Vá<Ãsžð^Ï8{'º6á<£sžì^…ó +ßç füXÏ8{'º6á<£sžì^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó¿:O0âç*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<à½:Ÿ'pö:OtmÂyEïó³}¬Ây‡ç<à½:ž'pôå<À·‹pžÀÁ9Ot¯Ây…ïó3~¬Îç œ½Î]›pžÀÑ9Ov¯Ây‡ç<à½:Ÿ'PvÎÌtoÂyGç<ؽ +ç žó€÷ê|žÀÙë<е ç ½ÏÌö± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'0øÕy‚?Wá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<ÁPØÛóðBë<Áõ Mç †7úéó/ï?Û½Áy‚õÔå<Á·ëóÿí×ùíË.þûÛÕ_úÅkÓÇ*ëO±x¯B±îðë€÷*ëO±x¯B±®ð]¬Ïø± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«P¬;<Å:འ+źÂw±>ãÇ*ëO±x¯B±îðë€÷*ëO±x¯B±®ð]¬Ïø± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«P¬;<Å:འ+źÁ¯Šõ?W¡XwxŠuÀ{Šu‡§X¼W¡XwxŠuÀ{Šu…ïb}ƏչXwö*ց®M(֝bì^…bÝá)ÖïÕ¹XWvŠõ™îM(֝bì^…bÝá)ÖïÕ¹Xwö*ց®M(Ö½‹õÙ>V¡XwxŠuÀ{u.֝½Šu kŠuG§X»W¡XWø.ÖgüX‹ug¯bèڄbÝÑ)ÖÁîU(Öžbð^…b]á»XŸñcŠu‡§X¼W¡XwxŠuÀ{Šu‡§X¼W¡XWø.ÖgüX…bÝá)ÖïU(Öžbð^…bÝá)ÖïU(Ö¾‹õ?V¡XwxŠuÀ{Šu‡§X¼W¡XwxŠuÀ{Šu…ïb}ƏU(Öžbð^…bÝá)ÖïU(Öžbð^…b]á»XŸñcŠu‡§X¼W¡XwxŠuÀ{Šu‡§X¼W¡X7øU±>âç*ëO±x¯B±îðë€÷*ëO±x¯B±®ð]¬Ïø± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«s±îìU¬]›P¬+zë³}¬B±îðë€÷êX¬;úR¬|»źƒS¬Ý«P¬+|ë3~¬Îź³W±tmB±îèë`÷*ëO±x¯Îź²S¬ÏtoB±îèë`÷*ëO±x¯Îź³W±tmB±®è]¬Ïö± +źÃS¬Þ«P¬;<Å:འ+źÃS¬Þ«P¬+|ë3~¬B±îðë€÷*ëO±x¯B±îðë€÷*ë +ßÅúŒ«P¬;<Å:འ+źÃS¬Þ«P¬;<Å:འ+źÁ¯Šõ?W¡XwxŠuÀ{Šu‡§X¼W¡XwxŠuÀ{Šu…ïb}ƏU(Öžbð^…bÝá)ÖïU(Öžbð^…b]á»XŸñcŠu‡§X¼W¡XwxŠuÀ{Šõ!¹¶Å:¼Ð*Ö¯_èýí~±>¼ÑOë_ïÏ?×ÍÅúzêR¬ßÅúÿõëûåìÕ?ÿóÉ÷ÏßÒ¿š?¿xooo¯÷zõǗ‡·?~Åi|ÁõØÍ ~ñ™ö¯ÏϟÿÆï‹×ù‚¾<v¯ÞÁßޞ>ÿÀâðËӈ÷êTþéáùó¿§(ûò0ѽyG^‡ó`÷*œ'pxÎÞ«ãyG_Î|»ç ¼ÏÌô± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ¾ÏÌø± +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ~už`ÄÏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcu>OàìužèڄóŽÎy°{Î8<ç ïÕù<²sž`¦{Î8:ç ÀîU8Oàðœ'¼WçóÎ^ç €®M8O è}ž`¶U8Oàðœ'¼WçóÎ^ç €®M8Oàèœ'»Wá<Â÷y‚?VçóÎ^ç €®M8Oàèœ'»Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Â÷y‚?Vá<Ãsžð^…óÏyÀ{Î8<ç ïU8O ð}ž`ƏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8Oàðœ'¼Wá<Á¯ÎŒø¹ +ç žó€÷*œ'pxÎÞ«pžÀá9Ox¯Ây…ïó3~¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Îç œ½Î]›pž@Ñû<Ál«pžÀá9Ox¯Žç }9Oðí"œ'ppÎÝ«pž@áû<ÁŒ«óyg¯ó@×&œ'pt΀ݫpžÀá9Ox¯Îç ”ó3ݛpžÀÑ9Ov¯Ây‡ç<à½:Ÿ'pö:OtmÂyEïó³}¬Ây‡ç<འ+ç žó€÷*œ'pxÎÞ«pž@áû<ÁŒ«pžÀá9Ox¯Ây‡ç<འ+ç žó€÷*œ'Pø>O0ãÇ*œ'pxÎÞ«pžÀá9Ox¯Ây‡ç<འ+ç ~už`ÄÏU8Oàðœ'¼Wá<Ãsžð^…óÏyÀ{Î(|Ÿ'˜ñcÎ8<ç ïU8Oàðœ'¼Wá<Ãsžð^…ó +ßç füX…óÏyÀ{Î8<ç ïU8O0öî<¼Ð:OpýB?žîŸ'Þè8Oðά¿ýæóë©Ëy‚×}žà?ÿòÛoÿü뿜öãÇ«?®þÒ{_¾÷{ +ˏ¯˜Xþú‡Xþ‹×™by°{by‡'–¼WÇXÞїXàÛEˆå¼cù™>V!–wxbyÀ{by‡'–¼W!–wxbyÀ{by…ïX~ƏUˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^…XÞá‰åïUˆå¾cù?V!–wxbyÀ{by‡'–¼W!–wxbyÀ{by…ïX~ƏUˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^…XÞá‰åïUˆå ~ˏø¹ +±¼ÃËÞ«Ë;<±<འ+±¼ÃËÞ«Ë+|Çò3~¬Î±¼³W,tmB,ïèÄò`÷*ÄòO,x¯Î±¼²ËÏtoB,ïèÄò`÷*ÄòO,x¯Î±¼³W,tmB,¯èËÏö± +±¼ÃËÞ«s,ïìË]›Ë;:±<ؽ +±¼Âw,?ãÇêË;{Åò@×&ÄòŽN,v¯B,ïðÄò€÷*Äò +ß±üŒ«Ë;<±<འ+±¼ÃËÞ«Ë;<±<འ+±¼Âw,?ãÇ*ÄòO,x¯B,ïðÄò€÷*ÄòO,x¯B,¯ðËÏø± +±¼ÃËÞ«Ë;<±<འ+±¼ÃËÞ«Ë+|Çò3~¬B,ïðÄò€÷*ÄòO,x¯B,ïðÄò€÷*Äò +ß±üŒ«Ë;<±<འ+±¼ÃËÞ«Ë;<±<འ+±¼Á¯bù?W!–wxbyÀ{by‡'–¼W!–wxbyÀ{by…ïX~ƏUˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^cyg¯XèڄX^Ñ;–Ÿícby‡'–¼WÇXÞїXàÛEˆåœXè^…X^á;–ŸñcuŽå½by kbyG'–»W!–wxbyÀ{uŽå•X~¦{byG'–»W!–wxbyÀ{uŽå½by kbyEïX~¶UˆåžXð^…XÞá‰åïUˆåžXð^…X^á;–Ÿñcby‡'–¼W!–wxbyÀ{by‡'–¼W!–WøŽågüX…XÞá‰åïUˆåžXð^…XÞá‰åïUˆå ~ˏø¹ +±¼ÃËÞ«Ë;<±<འ+±¼ÃËÞ«Ë+|Çò3~¬B,ïðÄò€÷*ÄòO,x¯B,ïðÄò€÷*Äò +ß±üŒ«Ë;<±<འ+±¼ÃËÞ«ËSí-byx¡Ë_¿Ðçû±üðFG,ÿmŽåüxøxos+¿º¤òoW©ü?ÿþËoý¢OŸÏ{|û‡«ñ~ƒ§‡×Ǐ?¾ÜéäŸ>þô¯—Ç®ßïüôǗ‡·—ׯ^æ øÏgɽ]¼Ã¾>> Üܘáޜ/8y¹6dz¾\÷vq¾9àÜuràڜ(9÷f¹7Çk¾÷vq>5àÜuiàڜï 8y¹6ç#J΍YîÍù€“ׁks>/àäu]äڜo 8y¹6çÃJÎ]YîÍùª€“×Qks>)àäuQäڜï 8y¹6çcJÎ-YîÍù’€“×!ks>#àäuEäڜo8y¹6çJÎý€YîÍùz€“×ñks>àäu9äڜï8y ¹6ç£JÎ̀YîÍùb€“×Áks>àäu-äڜo8y +¹6çCFÞwFù؜¯8y ¹6çN^@®Íù>€“×yks> äܘåޜ/8y¹6ç³N^W@®Íù&€“×Iks> äܘåޜ¯8y¹6çSN^—@®Íù€“אks> äܘåޜ/8y¹6çüßÉ«þ¹6ÇößÁ—ôÜÛÅ9üWnºÿî͹úwòŠþA®Í)ùwîŸÅ?¨7{sïïԕûƒ[›sì¯ä´þ³Ü›céïàKèîíâœù;wUþ×æÜø;y%þ ×æø+xõý³[‹sÝïÜ÷\›sÚïäUöƒ\›c×ïàKÖîíâõ+7Mÿ ÷æ\ô;yý ×æœó;yÕü ×æÜò;y¥ü ×æò+9ÿ,÷æ\ñ;yEü ×æœð;yü ×æÜï;yåû ×æï+9íþ,÷æ\î;y…û ×æœí;yUû ×æÜì;y%û ×æìy÷ú£|lε¾“W¬rmΩ¾“W©rmΝ¾“W¦rmΑ¾’ÓèÏro΅¾“W rmÎy¾“WrmÎm¾“WšrmÎa¾’ÓåÏroÎU¾“W”rmÎI¾“W‘rmÎ=þ•ËÞæòØõÛ 1þð:?ô¿~ü1âó7•>þ”üþøãë®{zx{ù㇊‡÷§×y­—Çë×úüű÷oÿ°žú|­þïw_ëjlÿhÃendstream +endobj +669 0 obj << +/Type /Page +/Contents 670 0 R +/Resources 668 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 672 0 R 673 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R ] +>> endobj +672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 705.1906 296.9253 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNodeGroup) >> +>> endobj +673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 705.1906 538.9788 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNodeGroup) >> +>> endobj +674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 694.1769 271.4708 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNode) >> +>> endobj +675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 694.1769 538.9788 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFileFromNode) >> +>> endobj +676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 681.2254 228.303 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFile) >> +>> endobj +677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 681.2254 538.9788 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteConfFile) >> +>> endobj +678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 666.3363 209.0756 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKey) >> +>> endobj +679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 666.3363 538.9788 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKey) >> +>> endobj +680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 653.3849 228.7518 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKeyType) >> +>> endobj +681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 653.3849 538.9788 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteKeyType) >> +>> endobj +682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 640.4334 227.7351 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteMessage) >> +>> endobj +683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 640.4334 538.9788 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteMessage) >> +>> endobj +684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 629.5393 258.6292 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkMethod) >> +>> endobj +685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 629.5393 538.9788 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkMethod) >> +>> endobj +686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 614.5306 247.3119 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkType) >> +>> endobj +687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 614.5306 538.9788 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNetworkType) >> +>> endobj +688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 601.5791 283.0776 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromNodeGroup) >> +>> endobj +689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 601.5791 538.9788 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromNodeGroup) >> +>> endobj +690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 590.5654 255.4213 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromPCU) >> +>> endobj +691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 590.5654 538.9788 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeFromPCU) >> +>> endobj +692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 575.6763 239.9098 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeGroup) >> +>> endobj +693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 575.6763 538.9788 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeGroup) >> +>> endobj +694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 564.7821 249.2147 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeNetwork) >> +>> endobj +695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 564.7821 538.9788 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNodeNetwork) >> +>> endobj +696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 551.8307 214.4553 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNode) >> +>> endobj +697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 551.8307 538.9788 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteNode) >> +>> endobj +698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 538.8793 212.2535 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePCU) >> +>> endobj +699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 538.8793 538.9788 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePCU) >> +>> endobj +700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 525.9278 210.5797 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePeer) >> +>> endobj +701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 525.9278 538.9788 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePeer) >> +>> endobj +702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 512.8568 257.0847 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSite) >> +>> endobj +703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 512.8568 538.9788 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSite) >> +>> endobj +704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 500.025 261.5081 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSlice) >> +>> endobj +705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 500.025 538.9788 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePersonFromSlice) >> +>> endobj +706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 487.0735 219.9943 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePerson) >> +>> endobj +707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 487.0735 538.9788 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:DeletePerson) >> +>> endobj +708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 474.1221 260.4024 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRoleFromPerson) >> +>> endobj +709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 474.1221 538.9788 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRoleFromPerson) >> +>> endobj +710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 461.0511 211.6955 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRole) >> +>> endobj +711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 461.0511 538.9788 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteRole) >> +>> endobj +712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 448.2192 223.3217 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSession) >> +>> endobj +713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 448.2192 538.9788 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSession) >> +>> endobj +714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 435.2678 208.3778 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSite) >> +>> endobj +715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 435.2678 538.9788 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSite) >> +>> endobj +716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 422.3164 248.5765 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttribute) >> +>> endobj +717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 422.3164 538.9788 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttribute) >> +>> endobj +718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 407.3077 268.2527 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttributeType) >> +>> endobj +719 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 407.3077 538.9788 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceAttributeType) >> +>> endobj +720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 396.4135 259.8444 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceFromNodes) >> +>> endobj +721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 396.4135 538.9788 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceFromNodes) >> +>> endobj +722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 383.4621 262.6136 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceInstantiation) >> +>> endobj +723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 383.4621 538.9788 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSliceInstantiation) >> +>> endobj +724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 370.5107 212.8012 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSlice) >> +>> endobj +725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 370.5107 538.9788 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:DeleteSlice) >> +>> endobj +726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 357.4396 222.206 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddresses) >> +>> endobj +727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 357.4396 538.9788 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddresses) >> +>> endobj +728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 342.5505 237.4589 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddressTypes) >> +>> endobj +729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 342.5505 538.9788 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:GetAddressTypes) >> +>> endobj +730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 331.5368 224.4375 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:GetBootStates) >> +>> endobj +731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 331.5368 538.9788 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:GetBootStates) >> +>> endobj +732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 318.7049 220.5621 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:GetConfFiles) >> +>> endobj +733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 318.7049 538.9788 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:GetConfFiles) >> +>> endobj +734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 305.7535 208.2288 314.6001] +/Subtype /Link +/A << /S /GoTo /D (0:GetEvents) >> +>> endobj +735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 305.7535 538.9788 314.6001] +/Subtype /Link +/A << /S /GoTo /D (0:GetEvents) >> +>> endobj +736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 290.7448 201.3347 301.6487] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeys) >> +>> endobj +737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 290.7448 538.9788 301.6487] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeys) >> +>> endobj +738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 277.7933 221.0109 288.6973] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeyTypes) >> +>> endobj +739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 277.7933 538.9788 288.6973] +/Subtype /Link +/A << /S /GoTo /D (0:GetKeyTypes) >> +>> endobj +740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 264.8419 219.9942 275.7458] +/Subtype /Link +/A << /S /GoTo /D (0:GetMessages) >> +>> endobj +741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 264.8419 538.9788 275.7458] +/Subtype /Link +/A << /S /GoTo /D (0:GetMessages) >> +>> endobj +742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 253.9478 250.8883 262.7944] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkMethods) >> +>> endobj +743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 253.9478 538.9788 262.7944] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkMethods) >> +>> endobj +744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 238.939 239.571 249.843] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkTypes) >> +>> endobj +745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 238.939 538.9788 249.843] +/Subtype /Link +/A << /S /GoTo /D (0:GetNetworkTypes) >> +>> endobj +746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 225.9876 232.1689 236.8915] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeGroups) >> +>> endobj +747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 225.9876 538.9788 236.8915] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeGroups) >> +>> endobj +748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 215.0935 241.4738 223.9401] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeNetworks) >> +>> endobj +749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 215.0935 538.9788 223.9401] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodeNetworks) >> +>> endobj +750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 202.0224 206.7144 210.9887] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodes) >> +>> endobj +751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 202.0224 538.9788 210.9887] +/Subtype /Link +/A << /S /GoTo /D (0:GetNodes) >> +>> endobj +752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 189.1906 204.5126 198.0373] +/Subtype /Link +/A << /S /GoTo /D (0:GetPCUs) >> +>> endobj +753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 189.1906 538.9788 198.0373] +/Subtype /Link +/A << /S /GoTo /D (0:GetPCUs) >> +>> endobj +754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 176.2392 217.7727 185.0858] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerData) >> +>> endobj +755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 176.2392 538.9788 185.0858] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerData) >> +>> endobj +756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 163.2877 222.754 172.1344] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerName) >> +>> endobj +757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 163.2877 538.9788 172.1344] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeerName) >> +>> endobj +758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 150.3363 202.8388 159.183] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeers) >> +>> endobj +759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 150.3363 538.9788 159.183] +/Subtype /Link +/A << /S /GoTo /D (0:GetPeers) >> +>> endobj +760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 137.3849 212.2535 146.2315] +/Subtype /Link +/A << /S /GoTo /D (0:GetPersons) >> +>> endobj +761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 137.3849 538.9788 146.2315] +/Subtype /Link +/A << /S /GoTo /D (0:GetPersons) >> +>> endobj +762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 124.3138 203.9546 133.2801] +/Subtype /Link +/A << /S /GoTo /D (0:GetRoles) >> +>> endobj +763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 124.3138 538.9788 133.2801] +/Subtype /Link +/A << /S /GoTo /D (0:GetRoles) >> +>> endobj +764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 111.3624 211.7055 120.3287] +/Subtype /Link +/A << /S /GoTo /D (0:GetSession) >> +>> endobj +765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 111.3624 538.9788 120.3287] +/Subtype /Link +/A << /S /GoTo /D (0:GetSession) >> +>> endobj +766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 98.411 200.637 107.3772] +/Subtype /Link +/A << /S /GoTo /D (0:GetSites) >> +>> endobj +767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 98.411 538.9788 107.3772] +/Subtype /Link +/A << /S /GoTo /D (0:GetSites) >> +>> endobj +671 0 obj << +/D [669 0 R /XYZ 71.731 729.2652 null] +>> endobj +668 0 obj << +/Font << /F29 532 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +818 0 obj << +/Length 35243 +/Filter /FlateDecode +>> +stream +xڔÝMlW~¥÷¹>‡ä@áŒÈŒ|Ê ·` +Võ¨áAIuÕ&Z],”õí—Œ½väúG¬g]ô@hÔ®õÛuNÕe^ò>8Çïž.ÿïøÝÛñðö|ù?§Ãéõ|úî_ÿÇß=}÷ß.ÿÒ?þÝñzäåõõp:_/ÿŸ;ÿêß?¼Χ§×ïþþôtø8ÏwO_ž/¯§ïþþíéýðüòüöõÔÿúÇ¿û_þóé㻏ÃÇëéõ»?þÛwë˜NýñÏÿõûÓáýýðÃߟÎOßÿã—_ÿùßü×/ÿðë¯?ÿø/?œž¾ÿ_¿üòÃÿóÇÿãïþ·?J;=Þ/÷úîó+/ÿ¡^ÏþC^Ž‡§óÝWç>]ø0.tùu~}½{¡;øõ4â¾ú=<½½Züzq_}€¿ίo-~=¸¯ÞÇϗ·s~?—ø:MøX}€_ÞÎËGûØ×iÄ}õ~y;Ïíc_§÷Õøåíöušð±ú¿¼ãñ½Å¯§÷Õøåí<ÚǾN#î«ð÷ÃËÇsýد§÷ÕûøÛå¯<ïÏíc_§ «ðË_²Þ^ÚǾN#î«ðóåßr>¶øõ4â¾ú¿¼ó¹~ì×ӈûê}üýòv^^ÛǾN>Và—·óüÖ>öuq_}€_ÞÎå)µøõ4â¾ú¿¼ãûK‹_O#î«÷ñËÛyúhû:MøX}€?.íkû:¸¯>Àχ÷§ö±¯Óˆûêüò¯¾ëÇ~=¸¯ÞşŸžïoÇ·×iÀçêüòv^O/-~=¸¯>À/oçü|lñëiÄ}õ~ýWKüzq_½/oçù¥}ìë4ácõ~y;íOQë0Ò¶ù@¾¼šã¹}æë4Ú¾ú¿ü«O¯õ3¿žFÜWï㧧ÃÛGûüz˜hß| ?Nïo5}=¶¯>Àχ··÷ç¿žFÜWàï‡ÓëGkÿ~iÛ¼/?_Þ̹~Ýë4Ùcõ~y5ç§ö™¯Óˆûêüòj^Ú_ѯ‡‘¶ÍòåÍ<_[úzm_½¿\^ÍéÔ>óušð±ú¿¼šcmÿ~iÛ| _ÞÌÓsûÌ×i´}õþ~8~¼Ôÿ¹¯§÷ÕûøùéðúþÒþâ²N>VàχãÛ¹}ìë4â¾ú?^__ÛǾN#î«ðËÛ9׿¦¯Óˆûê}üõòv^ÞÚǾN>Và—·óü~jñëiÄ}õ~y;§÷ö±¯ÓˆûêüòvŽõc¿žFÜWïão—·s|jû:MøX}€_ÞÎÓSûØ×iÄ}õ~>œ?ŽíoÖiÄ}õþ~xz?Տýzq_½¿?Îo§ö±¯Ó„Õøóáéõ¹}ìë4â¾ú¿¼óKûØ×iÄ}õ~y;//ï-~=¸¯ÞÇ?.oçò¡_§ «ðËÛ9½¶}FÜWà—·s|mû:¸¯>À/oçé­~ì×ӈûê]üåééðòñ^þfE§Ÿ«ðÓáãýý½Å¯§÷ÕøùðòöqnñëiÄ}õþvøx{ªûõ4â¾z?^ÞÎëSûØ×iÂÇêüòvÎǗ¿žFÜWà—·órjû:¸¯>À/oçùT?öëiÄ}õ>~º¼ÓsûØ×iÂÇêüòvŽíßÑiÄ}õ~y;O/o-~=¸¯>Àßïçú±_O#î«÷ñç§ÃóûkûØ×iÂÇêütx{mû:¸¯>Àχç×·ö±¯ÓˆûêüòvÚ^¾#m›÷å—Ë«yyoŸù:MöX}€Ÿÿq¼;øõ4â¾ú¿¼šç–þí,Ÿ°—×rzªøõ4Ò¾z?_Þ˱ý{ž:MøX}€_ÞKû·Öa¤mó|>œ>Ní3_§ÑöÕøÛáí½þoÚ:¸¯ÞÇ_Ÿ§úµëa¢}ó|:¼½¾¼¶ôõ4Ú¾ú¿¼šó¹}æë4â¾ú¿¼šþ?ø¶ÍûòÛåÍ<·šX§É«ðË«9½µÏ|FÜWà—Wslÿ4±N#î«ðËËyz¯ûõ4â¾z:?>ÚǾN>Và§Ãë{û§‰uq_}€ŸÇ÷§ö±¯ÓˆûêüíðúÖþibFÜWïã—·ózlû:MøX}€_ÞÎùÔ>öuq_}€_ÞÎKû§‰uq_}€_ÞÎósýد§÷Õ»øùéòvNíŸ&ÖiÀçêüòvŽçS‹_O#î«ðËÛy:´øõ4â¾ú;œ?^ëÇ~=¸¯ÞǏO‡§÷6ÐÑiÂÇêüt8¿µšX§÷ÕøùðôÚ::¸¯>À/oçüQ?öëiÄ}õ>~º¼—öOë4ácõ~y;/m £ÓˆûêüòvžÛ?M¬ÓˆûêüòvNuèúO(çÓûáéÈ?Ýèܧ }¼Ž=¿>ÞüuöNd¹þvvŒ,_/¥{þ8=çÈR§®‘åGŠ,ÿøÃûÓ÷ûëØòüq¸ü/îõ»[tƖ—_ˆ¤;ÂÊ÷Ö¹OaÝ»Pˆ°÷Õa•øŠ°÷Õa•øŠ°÷Õau¸",ÀÇjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°:\àc5GX%¾",Â}5GX%¾",Â}5GX%¾",Â}5GX® ð±š#¬_ᾚ#¬_ᾚ#¬_ᾚ#¬ +ßVÆçjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°:\àc5FX¥}°ˆ¶Ía•ôŠ°ÈöÕa•øŠ°÷ÕauöŠ°€öÍa•ôŠ°ÈöÕa•øŠ°÷Õa•ö5Â"Ú6s„Õъ°À«9Â*ñaî«1Â*ík„E´m櫤W„E¶¯æ«Ãa>Vc„UÚ׋hÛÌVI¯‹l_ÍV‰¯‹p_ÍV‡+Â|¬æ«ÄW„E¸¯æ«ÄW„E¸¯æ«ÄW„E¸¯æ«Ãa>Vs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Õኰ«9Â*ñaî«9Â*ñaî«9Â*ñaî«9ÂêpEX€Õa•øŠ°÷Õa•øŠ°÷Õa•øŠ°÷Õau¸",ÀÇjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°*|GXŸ«9Â*ñaî«9Â*ñaî«9Â*ñaî«9ÂêpEX€Õa•øŠ°÷Õa•øŠ°÷Õa•øŠ°÷Õau¸",ÀÇjŽ°J|EX„ûjŽ°J|EX„ûjŽ°J|EX„ûjŽ°:\àc5GX%¾",Â}5GX%¾",Â}5FX¥}°ˆ¶Íau´",°ÇjŽ°J|EX„ûjŠ°Jú÷‹àϋ9Â*áaí«9ÂêpEX€Õa•ö5Â"Ú6s„UÒ+Â"ÛWs„Uâ+Â"ÜWc„ÕÙ+ÂÚ7s„UÒ+Â"ÛWs„Uâ+Â"ÜWc„UÚ׋hÛÌVG+Â{¬æ«ÄW„E¸¯æ«ÄW„E¸¯æ«ÄW„E¸¯æ«Ãa>Vs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Õኰ«9Â*ñaî«9Â*ñaî«9Â*ñaî«9ªðae|®æ«ÄW„E¸¯æ«ÄW„E¸¯æ«ÄW„E¸¯æ«Ãa>Vs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Uâ+Â"ÜWs„Õኰ«9Â*ñaî«9Â*ñaî«9ÂJÅPaх®ç>]èãýa„•n4",øÒÝëåG«——§wˆ°Ö©ß#¬ËÏŸ#¬ÿý/¿üú§¿üúãŸ~ýñ§¿ürï#cïo_q»ÁüJ§ËÏ/â+}û+ßWç>]øñ·¿î](|û‹p_Íßþêðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;kð›ì,âs²³Wv¸¯BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY…ïì,ãc5gg½²3 m²³ŽVv¶¯BvÖáÊÎ÷՜U¶²³Lû&dg­ì l_…ì¬Ã•î«9;ë앝m›UôÎβ=V!;ëpeg€ûjÎÎ:{eg@Û&dg­ì l_…ì¬Âwv–ñ±š³³Î^Ùж ÙYG+;ÛW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg¾³³ŒUÈÎ:\Ùྠ+ÙY‡+;ÜW!;ëpeg€û*dg ~“E|®BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྠ+ÙY‡+;ÜW!;«ðe|¬BvÖáÊÎ÷UÈÎ:\Ùྚ³³Î^Ùж ÙYEïì,Ûc²³Wv¸¯Æ쬣¯ÙÀŸ!;ë`eg@û*dg¾³³ŒÕœuöÊ΀¶MÈÎ:ZÙؾ +ÙY‡+;ÜWsvVÙÊÎ2훐u´²3°}²³Wv¸¯æ쬳Wv´mBvVÑ;;ËöX…ì¬Ã•u¸²3À}²³Wv¸¯BvVá;;ËøX…ì¬Ã•u¸²3À}²³Wv¸¯BvVá;;ËøX…ì¬Ã•u¸²3À}²³Wv¸¯BvÖà7ÙYÄç*dg®ì p_…ì¬Ã•u¸²3À}²³ +ßÙYÆÇ*dg®ì p_…ì¬Ã•u¸²3À}²³ +ßÙYÆÇ*dg¡‚øêùðôÌ?Ýèܧ Ÿž×WáJßü ¬×ÃËûÇ ÔWëÔµ¾:Z}5ƒ«§—Ë¿¾þíśý{ÁÕéá×®ž^§ÓoS+^Qç>Ýqþí§÷ÃÛñëOÏw.t¿žFÜWïãÇãáôõoîWöõ0Ѿù@~>¼~|ý/WG_O£í«ð×ːí3_§÷Õøûáµ~保Eøóâ}öt<ߞÚ¾N=Và—÷òzlø:¸¯>À/ïåüõ‡æ¿žFÜWà—wórªûõ4â¾z¾¼ççö±¯Ó„Õøå휞ÛǾN#î«ðËÛ9¾´}FÜWà—·ót>µøõ4â¾z9ž>Îíc_§ «ðçÃùýµ}ìë4â¾ú=<½½µ}FÜWàï‡óë[ýد§÷ÕÑöå휿þÐ\áë4ácõ~y;/íc_§÷ÕøªÚ;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•oð›V>âsZùW+¸¯B+ßájå÷Uhå;\­<ྠ+­|…ïV>ãc5·ò½Zy mZùŽV+¶¯B+ßájå÷ÕÜÊW¶ZùLû&´ò­Vl_…V¾ÃÕÊ•ïìÕÊm›ÐÊWônå³=V¡•ïpµò€ûjnå;{µò@Û&´ò­Vl_…V¾Âw+Ÿñ±š[ùÎ^­<ж ­|G«•ÛW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò¾[ùŒUhå;\­<ྠ+­|‡«•ÜW¡•ïpµò€û*´ò ~ÓÊG|®B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྠ+­|‡«•ÜW¡•¯ðÝÊg|¬B+ßájå÷Uhå;\­<ྚ[ùÎ^­<ж ­|EïV>ÛcZùW+¸¯ÆV¾£¯­<ÀŸ¡•ï`µò@û*´ò¾[ùŒÕÜÊwöj偶Mhå;Z­<ؾ +­|‡«•ÜWs+_Ùjå3í›ÐÊw´Zy°}ZùW+¸¯æV¾³W+´mB+_Ñ»•ÏöX…V¾ÃÕÊî«ÐÊw¸ZyÀ}ZùW+¸¯B+_ổÏøX…V¾ÃÕÊî«ÐÊw¸ZyÀ}ZùW+¸¯B+_ổÏøX…V¾ÃÕÊî«ÐÊw¸ZyÀ}ZùW+¸¯B+ßà7­|Äç*´ò®Vp_…V¾ÃÕÊî«ÐÊw¸ZyÀ}Zù +ß­|ÆÇ*´ò®Vp_…V¾ÃÕÊî«ÐÊw¸ZyÀ}Zù +ß­|ÆÇ*´ò!ön[y¸Ðjåo/[ùp¥onåϯ‡ó3}¨ôzèZʟ¬”ÿãÏçïü×ÿþÃñéû/¿ÎŒõüõÏü~wCÍùq¾üdû šßYmºì®jon¢Úy›ÔÔfÙ6¡¨mäÔFÙ7!§­dÕ´Y¶Mhi+Y)m–mBÚJVG›eۄŠ¶‘wDe߄„¶’UÐfÙ6¡Ÿ­då³Y¶Mˆg+Yíl–mÊÙFÞál”}²ÙJV5›eۄf¶’•ÌfÙ6!˜­dõ²Y¶M¨eyDzQöMHe+Y¥l–m:ÙJV&›eۄH¶’ÕÈfÙ6¡mäÈFÙ7!­dÕ±Y¶Mhc+Yil–mÂØJV›eۄ*¶‘we߄$¶’UÄfÙ6¡‡­då°Y¶Mˆa+Y-l–mJØFÞ!l”}2ØJV›eۄ¶’•ÀfÙ6!€­dõ¯Y¶M¨_ ù&~Mò؄ôµ’U¾fÙ6¡{­de¯Y¶Mˆ^+YÍk–mŠ×FÞÁk”}3箼j×ì~^„Öµr•ºfØ6!t­du®Y¶Í\¹6°"×èÚ"$®•«Â5ö }k%+oͲm渵‚WۚÝϋP¶6î[#원µV²ªÖ,ÛfnZ+x%­Ùý¼AkåªgÍ°mBÍÚÈ;f²o攵‚WɚÝϋбV®2Ö Û&D¬•¬†5˶ k#ï€5ʾ ùj%«^ͲmB»ZÉJW³l›®V²ºÕ,Û&T«¼£Õ(û&$«•¬b5˶ ½j%+WͲmB¬ZÉjU³l›Pª6òU£ì›©V²*Õ,Û&4ª•¬D5˶ j%«OͲmBÚÈ;N²oBšZÉ*S³l›Ð¥V²²Ô,Û&D©•¬&5˶ Ej#ï 5ʾ 9j%«FͲmB‹ZÉJQ³l›¢V²:Ô,Û&T¨…|¡&ylB‚ZÉ*P³l›ÐŸV²òÓ,Û&ħ•¬ö4˶ åi#ïð4ʾ Ùi%«:ͲmBsZÉJN³l›œV²zÓ,Û&Ô¦¼cÓ(û&¤¦•¬Ò4˶ i%+3ͲmBdZÉjL³l›P˜6òL£ì›—V²êÒ,Û&´¥•¬´4˶™ÃÒ +^]iv?/BUÚ¸;*°oBRZÉ*J³l›±'­ÜkNšÕO{“VªZÒìÚ&”¤¼CÒ(ûfÎH+xU¤Ùý¼ iå*!Í°mB@ZÉêG³l›¹m`ţѵEHG+Wåh†mºÑJV6šeÛÌÑh¯f4»Ÿ¡mÜŒFØ7!­dÕ¢Y¶MhE+Y©h–mBÑJV'šeۄJ´‘w$e߄D´’UˆfÙ6¡­då¡Y¶MˆC+Ymh–mÊÐFÞah”}²ÐJVšeۄ&´’•„fÙ6!­dõ Y¶M¨A ù&Mò؄´’U‚fÙ6¡­de Y¶Mˆ@+Y h–m +ÐFÞh”}òÏJVý™eۄö³’•~fÙ6!ü¬duŸY¶M¨>yGŸQöMH>S¨ØŸù6+ø¼¹Íñéùqïùø>#÷S ¸¯ÆÏwôõ3Å^„ÏWðþLq¦Ç*|¦¸Ãõ™bÀ}>SÜáê©÷U(ª;\I5ྠ+Qu…ïª:ãcºêWX ¸¯BZÝáj«÷U¨«;\y5ྠ+u…ïÂ:ãcëWd ¸¯BfÝáê¬÷U(­;\©5ྠ+±u…ïÚ:ãczëWp ¸¯BrÝáj®÷U¨®;\Ù5ྠ+áu…ïò:ãcÚëW| ¸¯B~Ýáê¯÷U(°;\ 6ྠ+v…ï +;ãc:ìWˆ ¸¯BŠÝáj±÷U¨±;\96ྠ+Av…ï";ãcšìW” ¸¯B–Ýáê²÷U(³;\i6ྠ+qv…ï:;ãcúìW  ¸¯B¢Ýáj´÷U¨´;\™6ྠ+¡vƒß”ÚŸ«Ðjw¸bmÀ}ríW¯ ¸¯B±ÝáJ¶÷Uˆ¶+|WÛ«¹Ûîìnm›nw´Úm°}êíW¾ ¸¯æ€»²UpgÚ7¡áîhEÜ`û*dÜ®Žp_Í%wg¯”hۄ˜»¢wÍí± +=w‡+èÜWsÒÝÙ«éÚ6¡êîheÝ`û*„ݾËÕÜvwöŠ»¶MÈ»;Z}7ؾ +…w‡+ñÜW!ò®ð]yg|¬BçÝá +½÷UH½;\­7ྠ+µw‡+÷ÜW!ø®ð]|g|¬BóÝኾ÷UȾ;\Ý7ྠ+åw‡+ýÜW!þ®ð]g|¬BÿÝá +À÷UHÀ;\ 8ྠ+x‡+ÜW!¯ð]‚g|¬B ÞáŠÁ÷UÈÁ;\=8ྠ+Ex‡+ ÜW! +¯ð]…g|¬BÞá +Ã÷UHÃ;\m8ྠ+ux‡+ÜW!oð›B<âsñW$¸¯B&ÞáêÄ÷U(Å;\©8ྠ+±x…ïZ<ãczñW0¸¯B2ÞájÆ÷U¨Æ;\Ù8ྠ+áx…ïr<ãcÚñW<¸¯B>ÞáêÇ÷U(È;\ 9ྠ+y…ïŠ<ãc:òWH¸¯BJÞájÉ÷Õ\“wöÊɁ¶MÊ+zå٫Дw¸¢rÀ}5få}íÊþ¼ey+-ÚW!.¯ð]—g|¬æ¾¼³W`´mBbÞÑjÌÁöU¨Ì;\™9ྚCóÊViži߄ּ£›ƒí«›w¸zsÀ}5睽’s m¢óŠÞÕy¶Ç*tç®ðp_…ô¼Ã՞î«PŸw¸òsÀ}ô +ßzÆÇ*4è®p_… ½ÃÕ¡î«P¢w¸RtÀ}bô +ß5zÆÇ*ôè® p_…$½ÃÕ¤î«P¥w¸²tÀ}Âô¿)Ó#>W¡MïpÅé€û*äé®>p_…B½Ã•¨î«©Wø®Ô3>V¡Sïp…ê€û*¤ê®Vp_…Z½Ã•«î«¬Wø.Ö3>V¡Y½u­Ã…Vµ~{¡ãÓËãl=\é›?Süütù5÷|„n}ºvë/×nýŸ~úõÇûÛ¾üüËO™Éú徿ýG†7Æ|„o_ÿ7ðèŪyã5wÍ{{ÏPóÞ¹Pªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5oƒßÔ¼Ÿ«Póv¸j^À}jÞWÍ ¸¯BÍÛáªy÷U¨y+|×¼«¹æíìUóm›Póv´j^°}jÞWÍ ¸¯æš·²UófÚ7¡æíhÕ¼`û*Ô¼®šp_Í5og¯šhۄš·¢wÍ›í± +5o‡«æÜWsÍÛÙ«æÚ6¡æíhÕ¼`û*Ô¼¾kތÕ\óvöªy¶M¨y;Z5/ؾ +5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æ­ð]óf|¬BÍÛáªy÷U¨y;\5/ྠ+5o‡«æÜW¡æmð›š7âsjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷U¨y;\5/ྠ+5o…ïš7ãcjÞWÍ ¸¯BÍÛáªy÷Õ\óvöªy¶M¨y+z×¼Ù«Póv¸j^À}5Ö¼}­yþ¼5o«æÚW¡æ­ð]óf|¬æš·³WÍ ´mBÍÛѪyÁöU¨y;\5/ྚkÞÊV͛i߄š·£Uó‚í«Póv¸j^À}5×¼½j^ mjފÞ5o¶Ç*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ +ß5oÆÇ*Ô¼®šp_…š·ÃUóî«Póv¸j^À}jÞ¿©y#>W¡æípÕ¼€û*Ô¼®šp_…š·ÃUóî«PóVø®y3>V¡æípÕ¼€û*Ô¼®šp_…š·ÃUóî«PóVø®y3>V¡æ)jWó…VÍ{{¡ãÓëãš7\é›kÞË»x}~ƒšwºÖ¼çkÍûù—Ÿ~úõŸ~úó—{_=>=ýç7€_ãtxy9>üúôúq¼áúñíÃçˆï\&}Ž8Óc>GÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`nð›€9âsæWÀ ¸¯BÀÜá +˜÷U˜;\3ྠ+s…ï€9ãc5̝½f mæŽVÀ ¶¯BÀÜá +˜÷Õ0W¶æLû&Ì­€l_…€¹Ã0î«9`îì0m›0Wô˜³=V!`îp̀ûj˜;{Ì@Û&Ì­€l_…€¹ÂwÀœñ±šæÎ^3ж sG+`ÛW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*̾挏U˜;\3ྠ+s‡+`ÜW!`îp̀û*Ì ~0G|®BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྠ+s‡+`ÜW!`®ð0g|¬BÀÜá +˜÷U˜;\3ྚæÎ^3ж sEï€9ÛcæWÀ ¸¯Æ€¹£¯3ÀŸ!`î`Ì@û*̾挏Õ0wö +˜¶M˜;Z3ؾ +s‡+`ÜWsÀ\Ù +˜3í›0w´f°}æWÀ ¸¯æ€¹³WÀ ´mBÀ\Ñ;`ÎöX…€¹Ã0î«0w¸fÀ}æWÀ ¸¯BÀ\á;`ÎøX…€¹Ã0î«0w¸fÀ}æWÀ ¸¯BÀ\á;`ÎøX…€¹Ã0î«0w¸fÀ}æWÀ ¸¯BÀÜà7sÄç*Ì®€p_…€¹Ã0î«0w¸fÀ}æ +ßsÆÇ*Ì®€p_…€¹Ã0î«0w¸fÀ}æ +ßsÆÇ*Ì!Àmf¸Ð +˜o/t|úx0‡+}sÀüôrx{>=CÀ¼N]æWÌÿöó—_þß?|ùòó,˜/÷xýúÍn¿Çñðúõ—ÜGóëåçß~B‹—Ô¹O·œDûš:ß¹ÎãxàϋOWðŽ§3=V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«O7øM<ñ¹ +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÂw<ñ±šãéÎ^ñ4ж ñtG+žÛW!žîpÅӀûjŽ§+[ñt¦}âéŽV< ¶¯B<Ýኧ÷ÕOwöŠ§¶Mˆ§+zÇÓÙ«Ow¸âiÀ}5Çӝ½âi mâéŽV< ¶¯B<]á;žÎøXÍñtg¯xhۄxº£Oƒí«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇ*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}â鿉§#>W!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_…xºÃOî«OWøŽ§3>V!žîpÅӀû*ÄÓ®xp_Íñtg¯xhۄxº¢w<í± +ñt‡+žÜWc<ÝÑ×xàϋOw°âi }âé +ßñtÆÇjŽ§;{ÅÓ@Û&ÄÓ­xl_…xºÃOî«9ž®lÅәöMˆ§;Zñ4ؾ +ñt‡+žÜWs<ÝÙ+žÚ6!ž®èOg{¬B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt‡+žÜW!ž®ðOg|¬B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt‡+žÜW!ž®ðOg|¬B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt‡+žÜW!žnð›x:âsâéW< ¸¯B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt…ïx:ãcâéW< ¸¯B<Ýኧ÷Uˆ§;\ñ4ྠ+ñt…ïx:ãcâéÐþ¶ñ4\hÅÓ·:ŸÇÓáJ#ž>çxúüq¼üîéé=ÇÓ:u§ßOÿòå×?üp<ÿ§_~ùŸ?Ÿ¾ÿéç?ώõ|¹ÈÍÈÝ'yùëãQE­®6ßVç>]÷qW{ïB¡«%ÜWsWÛáêj«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj;\]-àc5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ®®𱚻Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»ÚWW øXÍ]m‰¯®–p_Í]m‰¯®–p_Í]m‰¯®–p_Í]m‡««|¬æ®¶ÄWWK¸¯æ®¶ÄWWK¸¯æ®¶ÄWWK¸¯æ®¶ÂwW›ñ¹š»Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»ÚWW øX]mi_»Z¢m3wµ%½ºZ²}5wµ%¾ºZÂ}5vµ½ºZ }3wµ%½ºZ²}5wµ%¾ºZÂ}5vµ¥}íj‰¶ÍÜÕv´ºZ°ÇjîjK|uµ„ûjìjKûÚÕm›¹«-éÕÕ’í«¹«ípuµ€ÕØՖöµ«%Ú6sW[Ò««%ÛWsW[â««%ÜWsWÛáêj«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj;\]-àc5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ®®𱚻Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»Ú +ß]mÆçjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj;\]-àc5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ%¾ºZÂ}5wµ®®𱚻Ú_]-ᾚ»Ú_]-ᾚ»Ú_]-ᾚ»ÚWW øXÍ]m‰¯®–p_Í]m‰¯®–p_]mi_»Z¢m3wµ­®챚»Ú_]-ᾚºÚ’þ½«%øóbîjKxuµDûjîj;\]-àc5vµ¥}íj‰¶ÍÜՖôêjÉöÕÜՖøêj ÷ÕØÕvöêjöÍÜՖôêjÉöÕÜՖøêj ÷ÕØՖöµ«%Ú6sWÛÑêjÁ«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjK|uµ„ûjîjK|uµ„ûjîjK|uµ„ûjîj+|wµŸ«¹«-ñÕÕ«-ñÕÕ«-ñÕÕ«ípuµ€ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜՖøêj ÷ÕÜÕv¸ºZÀÇjîjs Zuµt¡ë¹O:»Út¥oý(ñùíýòÛåèjשkWû~íjÿù˯øòó/?ýå?ÿø?þôóßþùÇ_¿Ü‹¼žO_ÿ‰Â 5Ÿäéôôò¨«ÝáW¼í¿n¯¯;Jáྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üjð›ð+âs¯Wø¸¯BøÕá +¿÷U¿:\áྠ+áW…ïð+ãc5‡_½Â/ m¯ŽVø¶¯BøÕá +¿÷Õ~U¶Â¯Lû&„_­ð l_…ð«Ã~î«9üêì~m›~Uô¿²=V!üêp…_€ûj¿:{…_@Û&„_­ð l_…ð«Âwø•ñ±šÃ¯Î^áж áWG+üÛW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_¾Ã¯ŒU¿:\áྠ+áW‡+üÜW!üêp…_€û*„_ ~~E|®BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྠ+áW‡+üÜW!üªð~e|¬BøÕá +¿÷U¿:\áྚïÎ^áж áWEïð+Ûc¯Wø¸¯Æ𫣯áÀŸ!üê`…_@û*„_¾Ã¯ŒÕ~uö +¿€¶M¿:Záؾ +áW‡+üÜWsøUÙ +¿2í›~u´Â/°}¯Wø¸¯æð«³Wø´mBøUÑ;üÊöX…ð«Ã~î«~u¸Â/À}¯Wø¸¯BøUá;üÊøX…ð«Ã~î«~u¸Â/À}¯Wø¸¯BøUá;üÊøX…ð«Ã~î«~u¸Â/À}¯Wø¸¯BøÕà7áWÄç*„_®ð p_…ð«Ã~î«~u¸Â/À}¯ +ßáWÆÇ*„_®ð p_…ð«Ã~î«~u¸Â/À}¯ +ßáWÆÇ*„_1WêÂ/¸Ð +¿n/ïp¥o¿.?É¿¿Ñ÷;tùéïÚ}}\»¯ÿò×?ÿé×/ÿðç?ÿüå—_æw ß.¿)üúGõ׿ûÎEŽ‡çËo~HQß2¼™Hß2¼½gø–ᝠ¥of|¬Â· ;\ß2ÜWá[†®oî«ð-Ã×· ÷Uø–a…ïof|¬Â· ;\ß2ÜWá[†®oî«ð-Ã×· ÷Uø–a…ïof|¬Â· ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­ ~“´F|®BÒÚáJZ÷UHZ;\I+ྠ+Ik‡+iÜW!i­ð´f|¬æ¤µ³WÒ +´mBÒÚÑJZÁöUHZ;\I+ྚ“ÖÊVҚi߄¤µ£•´‚í«´v¸’VÀ}5'­½’V m’ÖŠÞIk¶Ç*$­®¤p_ÍIkg¯¤hۄ¤µ£•´‚í«´VøNZ3>VsÒÚÙ+iÚ6!iíh%­`û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÂwҚñ± +Ik‡+iÜW!iíp%­€û*$­®¤p_…¤µÁo’ÖˆÏUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜW!iíp%­€û*$­¾“ÖŒUHZ;\I+ྠ+Ik‡+iÜWsÒÚÙ+iÚ6!i­è´f{¬BÒÚáJZ÷՘´vô5iøó"$­¬¤h_…¤µÂwҚñ±š“ÖÎ^I+ж IkG+iÛW!iíp%­€ûjNZ+[Ik¦}’ÖŽVÒ +¶¯BÒÚáJZ÷՜´vöJZ¶MHZ+z'­Ù«´v¸’VÀ}’ÖWÒ +¸¯BÒÚáJZ÷UHZ+|'­«´v¸’VÀ}’ÖWÒ +¸¯BÒÚáJZ÷UHZ+|'­«´v¸’VÀ}’ÖWÒ +¸¯BÒÚáJZ÷UHZü&iø\…¤µÃ•´´v¸’VÀ}’ÖWÒ +¸¯BÒZá;iÍøX…¤µÃ•´´v¸’VÀ}’ÖWÒ +¸¯BÒZá;iÍøX…¤5™mÒ +ZIë텎ÇÓã¤5\雓ÖËo?N—ÿýå¦uú½i=^~­¼µþñ‡÷§ïÿö×/÷³óןÙo°·ž?.Gðk†ñ¾;ýº½pH¿î\(¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«ÁoÒ¯ˆÏUH¿:\éྠ+éW‡+ýÜW!ýêp¥_€û*¤_¾Ó¯ŒÕœ~uöJ¿€¶MH¿:Zéؾ +éW‡+ýÜWsúUÙJ¿2훐~u´Ò/°}Ò¯Wú¸¯æô«³Wú´mBúUÑ;ýÊöX…ô«Ã•~î«9ýêì•~m›~u´Ò/°}Ò¯ +ßéWÆÇjN¿:{¥_@Û&¤_­ô l_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~UøN¿2>V!ýêp¥_€û*¤_®ô p_…ô«Ã•~~5øMúñ¹ +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€û*¤_®ô p_…ô«Âwú•ñ± +éW‡+ýÜW!ýêp¥_€ûjN¿:{¥_@Û&¤_½Ó¯lUH¿:\éà¾Ó¯Ž¾¦_^„ô«ƒ•~í«~UøN¿2>VsúÕÙ+ýÚ6!ýêh¥_`û*¤_®ô p_ÍéWe+ýÊ´oBúÕÑJ¿ÀöUH¿:\éྚӯÎ^éж éWEïô+ÛcÒ¯Wú¸¯BúÕáJ¿÷UH¿:\éྠ+éW…ïô+ãcÒ¯Wú¸¯BúÕáJ¿÷UH¿:\éྠ+éW…ïô+ãcÒ¯Wú¸¯BúÕáJ¿÷UH¿:\éྠ+éWƒß¤_Ÿ«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~u¸Ò/À}Ò¯Wú¸¯BúÕáJ¿÷UH¿*|§_«~…\©M¿àB+ýº½Ðå7‘Ó¯p¥oN¿ž/7y;!ýZ§Vúuü”~ý§ŸþòoÿùÇŸÍ×óå¿eç¯ÿ¿Qfóõt~}Ô|í/ëŋî/ëÝÞ4|Yï΅җõ÷Uø²^…ï/ëe|¬Â—õ:\_ÖÜWáËz®/ëî«ðe½חõ÷Uø²^…ï/ëe|¬Â—õ:\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*ä• ~“WF|®B^ÙáÊ+÷UÈ+;\y%ྠ+ye‡+¯ÜW!¯¬ðWf|¬æ¼²³W^ ´mB^ÙÑÊ+ÁöUÈ+;\y%ྚóÊÊV^™i߄¼²£•W‚í«Wv¸òJÀ}5畝½òJ mòʊÞye¶Ç*ä•®¼p_Íyeg¯¼hۄ¼²£•W‚í«WVøÎ+3>Vs^ÙÙ+¯Ú6!¯ìhå•`û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²Âw^™ñ± +ye‡+¯ÜW!¯ìp啀û*ä•®¼p_…¼²ÁoòʈÏUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜW!¯ìp啀û*䕾óʌUÈ+;\y%ྠ+ye‡+¯ÜWs^ÙÙ+¯Ú6!¯¬èWf{¬B^ÙáÊ+÷՘Wvô5¯øó"䕬¼h_…¼²Âw^™ñ±šóÊÎ^y%ж yeG+¯ÛW!¯ìp啀ûjÎ++[ye¦}òʎV^ ¶¯B^ÙáÊ+÷՜WvöÊ+¶MÈ++zç•Ù«Wv¸òJÀ}òÊW^ ¸¯B^ÙáÊ+÷UÈ++|ç•«Wv¸òJÀ}òÊW^ ¸¯B^ÙáÊ+÷UÈ++|ç•«Wv¸òJÀ}òÊW^ ¸¯B^ÙáÊ+÷UÈ+ü&¯Œø\…¼²Ã•WWv¸òJÀ}òÊW^ ¸¯B^Yá;¯ÌøX…¼²Ã•WWv¸òJÀ}òÊW^ ¸¯B^Yá;¯ÌøX…¼2”m^ Zyå텎ǗÇye¸Ò7畧·ÃÓéù òÊßO½*¯<}Ê+ÿÏNçï¿üp<ÿ·ñ£¿þÑÊç¯~zMÜ}ŽÏç÷G…åñõòcÈo?¨ÝLÜùÃÒëܧËÎ?©}|?|ý§Jw®s‡þí,Ÿﳧãáøöõ‡© +^§‰«ðçÃëëñ¹Å¯§÷Õø彜¿þ0Õá×ӈûêüòn^Nõc¿žFÜWļ—·óüÜ>öušð±ú¿¼ÓsûØ×iÄ}õ¾jçWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨ü¦¡Žø\…†ºÃÕPî«ÐPw¸jÀ}êWC ¸¯BC]ỡÎøXÍ ug¯†hۄ†º£ÕPƒí«ÐPw¸jÀ}57ԕ­†:Ó¾ uG«¡ÛW¡¡îp5Ԁûjn¨;{5Ô@Û&4Ô½êlUh¨;\ 5ྚêÎ^ 5ж uG«¡ÛW¡¡®ðÝPg|¬æ†º³WC ´mBCÝÑj¨ÁöUh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ u…ï†:ãcêWC ¸¯BCÝáj¨÷Uh¨;\ 5ྠ+ uƒß4ÔŸ«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯BCÝáj¨÷Uh¨+|7Ô«ÐPw¸jÀ}êWC ¸¯æ†º³WC ´mBC]Ñ»¡ÎöX…†ºÃÕP¡îèkC ðçEh¨;X 5о + u…ï†:ãc57ԝ½j mêŽVC ¶¯BCÝáj¨÷ÕÜPW¶êLû&4Ô­†l_…†ºÃÕP¡îìÕPm›ÐPWôn¨³=V¡¡îp5Ԁû*4Ô®†p_…†ºÃÕPî«ÐPWøn¨3>V¡¡îp5Ԁû*4Ô®†p_…†ºÃÕPî«ÐPWøn¨3>V¡¡îp5Ԁû*4Ô®†p_…†ºÃÕPî«ÐP7øMCñ¹ + u‡«¡ÜW¡¡îp5Ԁû*4Ô®†p_…†ºÂwCñ± + u‡«¡ÜW¡¡îp5Ԁû*4Ô®†p_…†ºÂwCñ± + ul»†.´êÛ çÇ u¸Ò77ÔǗÃÓÛé õ:µêçO õÿõå—_þôßî|¡öåðòÛO/7ÈüBíëé卿Pï¹ëÊۋ†ºò΅R] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Ùà7ueÄç*ԕ®ºp_…º²ÃUWî«PWv¸êJÀ}êÊ +ßueÆÇj®+;{Օ@Û&ԕ­ºl_…º²ÃUW®¬lՕ™öM¨+;Zu%ؾ +ue‡«®ÜWs]ÙÙ«®Ú6¡®¬è]Wf{¬B]Ùáª+÷Õ\Wvöª+¶M¨+;Zu%ؾ +ue…ïº2ãc5ו½êJ mêʎV] ¶¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨++|ו«PWv¸êJÀ}êÊW] ¸¯B]Ùáª+÷U¨+ü¦®Œø\…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}êÊW] ¸¯B]Yá»®ÌøX…º²ÃUWî«PWv¸êJÀ}5ו½êJ mêʊÞue¶Ç*ԕ®ºp_ueG_ëJ€?/B]ÙÁª+öU¨++|ו«¹®ììUWm›PWv´êJ°}êÊW] ¸¯æº²²UWfÚ7¡®ìhՕ`û*ԕ®ºp_Íueg¯ºhۄº²¢w]™í± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²Âw]™ñ± +ue‡«®ÜW¡®ìpՕ€û*ԕ®ºp_…º²ÁoêʈÏU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+;\u%ྠ+ue‡«®ÜW¡®ìpՕ€û*ԕ¾ëʌU¨+CØ֕p¡UWÞ^èx|}\W†+}s]ùt¼ü²÷ôuå:µêʗOuå?ýôç/ÿøóOÿñ×{]Ýëo¿I¹af_ùñtùíۃ¾rçnñ¦;w»½jÈÝî\(ån«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝü&w‹ø\…ܭÕ»»u¸r7À}r·WBîVá;wËøX͹[g¯Ü hۄܭ£•»í«»u¸r7À}5çn•­Ü-Ó¾ ¹[G+wÛW!wëpån€ûjÎÝ:{ån@Û&än½s·lUÈÝ:\¹ྚs·Î^¹ж ¹[G+wÛW!w«ð»e|¬æÜ­³Wî´mBîÖÑÊÝÀöUÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[…ïÜ-ãcr·WBîÖáÊÝ÷UÈÝ:\¹ྠ+¹[ƒßänŸ«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WBîÖáÊÝ÷UÈÝ*|çn«»u¸r7À}r·WæÜ­³Wî´mBîVÑ;wËöX…ܭÕ»î«1wëèkîðçEÈÝ:X¹о +¹[…ïÜ-ãc5çn½r7 mr·ŽVBîÖáÊÝ÷՜»U¶r·Lû&än­Ü l_…ܭÕ»î«9wë앻m›»UôÎݲ=V!wëpån€û*än®Ü p_…ܭÕ»»UøÎÝ2>V!wëpån€û*än®Ü p_…ܭÕ»»UøÎÝ2>V!wëpån€û*än®Ü p_…ܭÕ»»5øMîñ¹ +¹[‡+wÜW!wëpån€û*än®Ü p_…Ü­Âwî–ñ± +¹[‡+wÜW!wëpån€û*än®Ü p_…Ü­Âwî–ñ± +¹[µÚÜ .´r·Û os·p¥oÍÝ^Þß/©ûxɹÛõÔ³r·óÈÝþé˯ÿó‡ãÓ÷?ýüßgìôµ•ø8ÏòéíéåQô¦úêv"ÔWŸ.ü¸¾ºw¡P_¾êpÕW€Õ\_•øª¯÷Õ\_•øª¯÷Õ\_•øª¯÷Õ\_u¸ê+ÀÇj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯:\õàc5×W%¾ê+Â}5×W%¾ê+Â}5×W%¾ê+Â}5×W®ú +ð±šë«_õᾚë«_õᾚë«_õá¾šë« +ßõUÆçj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯:\õàc5ÖW¥}­¯ˆ¶Í\_•ôª¯ÈöÕ\_•øª¯÷ÕX_uöª¯€öÍ\_•ôª¯ÈöÕ\_•øª¯÷ÕX_•öµ¾"Ú6s}ÕѪ¯À«¹¾*ñU_¾*ík}E´mæúª¤W}E¶¯æúªÃU_>Vc}UÚ×úŠhÛÌõUI¯úŠl_ÍõU‰¯úŠp_ÍõU‡«¾|¬æúªÄW}E¸¯æúªÄW}E¸¯æúªÄW}E¸¯æúªÃU_>Vs}U⫾"ÜWs}U⫾"ÜWs}U⫾"ÜWs}Õ᪯«¹¾*ñU_¾*ñU_¾*ñU_¾êpÕW€Õ\_•øª¯÷Õ\_•øª¯÷Õ\_•øª¯÷Õ\_u¸ê+ÀÇj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯*|×WŸ«¹¾*ñU_¾*ñU_¾*ñU_¾êpÕW€Õ\_•øª¯÷Õ\_•øª¯÷Õ\_•øª¯÷Õ\_u¸ê+ÀÇj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯J|ÕW„ûj®¯:\õàc5×W%¾ê+Â}5×W%¾ê+Â}5ÖW¥}­¯ˆ¶Í\_u´ê+°Çj®¯J|ÕW„ûjª¯Jú÷úŠàϋ¹¾*áU_í«¹¾êpÕW€ÕX_•öµ¾"Ú6s}UÒ«¾"ÛWs}U⫾"ÜWc}ÕÙ«¾Ú7s}UÒ«¾"ÛWs}U⫾"ÜWc}UÚ×úŠhÛÌõUG«¾{¬æúªÄW}E¸¯æúªÄW}E¸¯æúªÄW}E¸¯æúªÃU_>Vs}U⫾"ÜWs}U⫾"ÜWs}U⫾"ÜWs}Õ᪯«¹¾*ñU_¾*ñU_¾*ñU_¾ªð]_e|®æúªÄW}E¸¯æúªÄW}E¸¯æúªÄW}E¸¯æúªÃU_>Vs}U⫾"ÜWs}U⫾"ÜWs}U⫾"ÜWs}Õ᪯«¹¾ÊÅPU_х®ç>]èx|X_¥+}s}µ~°ËõÕ:µê«×Q_?}:^þ-O7?Þ¹ÇéðrùŸÁ£äêò`^_ûMw¼¤Î}ºåü#Ú§×Ãñüõ/êw.t¿žFÜWàï‡×—¯ï®Ã¯§÷Õûøóñp|~~.ñušð±ú¿¼ÓsûØ×iÄ}õ~y;Ǘö±¯ÓˆûêüòvžÎ§¿žFÜWïã/ÇÃÓǹ}ìë4ácõþ|8¿¿¶}FÜWே§··ö±¯ÓˆûêüúÍÃ__R$ÜWó—;\_R|¬æ/)–øú’"ᾚ¿¤Xâjy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-oƒß´¼Ÿ«Ðòv¸Z^À}ZÞWË ¸¯BËÛájy÷Uhy+|·¼«¹åíìÕòm›Ðòv´Z^°}ZÞWË ¸¯æ–·²ÕòfÚ7¡åíhµ¼`û*´¼®–p_Í-og¯–hۄ–·¢wË›í± +-o‡«åÜWsËÛÙ«åÚ6¡åíhµ¼`û*´¼¾[ތÕÜòvöjy¶Mhy;Z-/ؾ +-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡å­ðÝòf|¬BËÛájy÷Uhy;\-/ྠ+-o‡«åÜW¡åmð›–7âsZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷Uhy;\-/ྠ+-o…ï–7ãcZÞWË ¸¯BËÛájy÷ÕÜòvöjy¶Mhy+z·¼Ù«Ðòv¸Z^À}5¶¼}myþ¼-o«åÚW¡å­ðÝòf|¬æ–·³WË ´mBËÛÑjyÁöUhy;\-/ྚ[ÞÊV˛i߄–·£Õò‚í«Ðòv¸Z^À}5·¼½Z^ mZފÞ-o¶Ç*´¼®–p_…–·ÃÕòî«Ðòv¸Z^À}ZÞ +ß-oÆÇ*´¼®–p_…–·ÃÕòî«Ðòv¸Z^À}ZÞ +ß-oÆÇ*´¼®–p_…–·ÃÕòî«Ðòv¸Z^À}ZÞ¿iy#>W¡åípµ¼€û*´¼®–p_…–·ÃÕòî«ÐòVøny3>V¡åípµ¼€û*´¼®–p_…–·ÃÕòî«ÐòVøny3>V¡å )jÛò…VË{{¡ãñãqË®ôÍ-ïå·§×ËÿþrË»N­–÷íSËû‡ÿô_ƈ>~žž¾þ »`¦¼Ç×ÓóÔ÷x8¾ýöcJ¼£Î}ºäšv¿w.”:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆü¦#Žø\…Ž¸ÃÕî«Ðw¸:bÀ}:âWG ¸¯BG\á»#ÎøXÍqg¯ŽhۄŽ¸£Õƒí«Ðw¸:bÀ}5wĕ­Ž8Ó¾ qG«#ÛW¡#îpuĀûjîˆ;{uÄ@Û&tĽ;âlUèˆ;\1ྚ;âÎ^1ж qG«#ÛW¡#®ðÝg|¬æŽ¸³WG ´mBGÜÑêˆÁöUèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+q…ïŽ8ãc:âWG ¸¯BGÜáêˆ÷Uèˆ;\1ྠ+qƒßtÄŸ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯BGÜáêˆ÷Uèˆ+|wÄ«Ðw¸:bÀ}:âWG ¸¯æŽ¸³WG ´mBG\Ñ»#ÎöX…Ž¸ÃÕ#îèkG ðçEèˆ;X1о +q…ïŽ8ãc5wĝ½:b m:âŽVG ¶¯BGÜáêˆ÷ÕÜW¶:âLû&tÄ­Žl_…Ž¸ÃÕ#îìÕm›ÐWô=V¡#îpuĀû*tÄ®Žp_…Ž¸ÃÕî«ÐWøîˆ3>V¡#îpuĀû*tÄ®Žp_…Ž¸ÃÕî«ÐWøîˆ3>V¡#îpuĀû*tÄ®Žp_…Ž¸ÃÕî«Ð7øMGñ¹ +q‡«#ÜW¡#îpuĀû*tÄ®Žp_…Ž¸ÂwGœñ± +q‡«#ÜW¡#îpuĀû*tÄ®Žp_…Ž¸ÂwGœñ± +qè`ێ.´:âÛ OO;âp¥oîˆ_>.¿c=¡#^§VGüþ¹#þòåç¿žŸ¿þzz#ø=Ž‡Ë‰ó£øø~øíŸÅ+^O}ºááÞŠoï\&̙«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜ü¦`Žø\…‚¹ÃU0î«P0w¸ +fÀ} +æWÁ ¸¯BÁ\á»`ÎøXÍsg¯‚hۄ‚¹£U0ƒí«P0w¸ +fÀ}5̕­‚9Ó¾ sG«`ÛW¡`îp̀ûj.˜;{Ì@Û&̽ ælU(˜;\3ྚ æÎ^3ж sG«`ÛW¡`®ð]0g|¬æ‚¹³WÁ ´mBÁÜÑ*˜ÁöU(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+s…ï‚9ãc +æWÁ ¸¯BÁÜá*˜÷U(˜;\3ྠ+sƒßÌŸ«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯BÁÜá*˜÷U(˜+|Ì«P0w¸ +fÀ} +æWÁ ¸¯æ‚¹³WÁ ´mBÁ\Ñ»`ÎöX…‚¹ÃU0`îèkÁ ðçE(˜;X3о +s…ï‚9ãc5̝½ +f m +æŽVÁ ¶¯BÁÜá*˜÷Õ\0W¶ +æLû&Ì­‚l_…‚¹ÃU0`îìU0m›P0Wô.˜³=V¡`îp̀û*Ì®‚p_…‚¹ÃU0î«P0Wø.˜3>V¡`îp̀û*Ì®‚p_…‚¹ÃU0î«P0Wø.˜3>V¡`îp̀û*Ì®‚p_…‚¹ÃU0î«P07øMÁñ¹ +s‡«`ÜW¡`îp̀û*Ì®‚p_…‚¹ÂwÁœñ± +s‡«`ÜW¡`îp̀û*Ì®‚p_…‚¹ÂwÁœñ± +spۂ.´ +æÛ OÇÇs¸Ò(˜ÏP0?¿ž_Ÿ_¡`^§VÁüaóÏ¿üô—{ñìÛo֍1æ÷ç—‡CVÓ¯¹›ÖÛ{†¦õ΅RӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÁošÖˆÏUhZ;\M+ྠ+Mk‡«iÜW¡iíp5­€û*4­¾›ÖŒÕÜ´vöjZ¶MhZ;ZM+ؾ +Mk‡«iÜWsÓZÙjZ3í›Ð´v´šV°}šÖWÓ +¸¯æ¦µ³WÓ +´mBÓZÑ»iÍöX…¦µÃÕ´iíìÕ´m›Ð´v´šV°}šÖ +ßMkÆÇjnZ;{5­@Û&4­­¦l_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´VønZ3>V¡iíp5­€û*4­®¦p_…¦µÃÕ´î«Ð´6øMÓñ¹ +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€û*4­®¦p_…¦µÂwӚñ± +Mk‡«iÜW¡iíp5­€ûjnZ;{5­@Û&4­½›ÖlUhZ;\M+ྛ֎¾6­^„¦µƒÕ´í«Ð´VønZ3>VsÓÚÙ«iÚ6¡iíh5­`û*4­®¦p_ÍMke«iÍ´oBÓÚÑjZÁöUhZ;\M+ྚ›ÖÎ^M+ж MkEï¦5ÛcšÖWÓ +¸¯BÓÚájZ÷UhZ;\M+ྠ+Mk…ï¦5ãcšÖWÓ +¸¯BÓÚájZ÷UhZ;\M+ྠ+Mk…ï¦5ãcšÖWÓ +¸¯BÓÚájZ÷UhZ;\M+ྠ+Mkƒß4­Ÿ«Ð´v¸šVÀ}šÖWÓ +¸¯BÓÚájZ÷UhZ+|7­«Ð´v¸šVÀ}šÖWÓ +¸¯BÓÚájZ÷UhZ+|7­«Ð´† ³mZáB«i½½ÐñtzÜ´†+}óWy/ú˃¦uº6­—ÿÝÜ6­ÿüã¯_æWy/¿ª<ý=á0‹Ö§óåÇéG_å}½üüñÛOhñ’:÷é–óh_?ß{ç:? ðçEø pïgz¬Â;\ÜWáƒÀ®î«ðAàW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<Ýà7ñtÄç*ÄÓ®xp_…xºÃOî«Ow¸âiÀ}âé +ßñtÆÇjŽ§;{ÅÓ@Û&ÄÓ­xl_…xºÃOî«9ž®lÅәöMˆ§;Zñ4ؾ +ñt‡+žÜWs<ÝÙ+žÚ6!ž®èOg{¬B<Ýኧ÷ÕOwöŠ§¶Mˆ§;Zñ4ؾ +ñt…ïx:ãc5Çӝ½âi mâéŽV< ¶¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§+|ÇÓ«Ow¸âiÀ}âéW< ¸¯B<Ýኧ÷Uˆ§ü&žŽø\…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}âéW< ¸¯B<]á;žÎøX…xºÃOî«Ow¸âiÀ}5Çӝ½âi mâéŠÞñt¶Ç*ÄÓ®xp_ñtG_ãi€?/B<ÝÁŠ§öUˆ§+|ÇÓ«9žîìOm›Ow´âi°}âéW< ¸¯æxº²OgÚ7!žîhÅÓ`û*ÄÓ®xp_Íñtg¯xhۄxº¢w<í± +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÂw<ñ± +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÂw<ñ± +ñt‡+žÜW!žîpÅӀû*ÄÓ®xp_…xºÁoâéˆÏUˆ§;\ñ4ྠ+ñt‡+žÜW!žîpÅӀû*ÄÓ¾ã錏Uˆ§;\ñ4ྠ+ñt‡+žÜW!žîpÅӀû*ÄÓ¾ã錏Uˆ§CûÛÆÓp¡Oß^èxz~O‡+}s<½þÆsŽ§×©O?ÇÓÿþã¿~ù‡_ýùÇùáôôýÜI©Ï_ÿ†À׿Å|ãÍÇyù)ïü(¥ÞV¼ò°nï¬;Jྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+VƒßXŸ«`u¸,À}¬W€¸¯B€Õá +°÷U°*|X«9Àêì`m›`u´,°}¬W€¸¯æ«²`eÚ7!ÀêhX`û*X® p_ÍVg¯ hۄ«¢w€•í± +V‡+ÀÜWs€ÕÙ+ÀÚ6!ÀêhX`û*X¾¬ŒÕ`uö +°€¶M°:Zؾ +V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àªð`e|¬B€Õá +°÷U°:\ྠ+V‡+ÀÜW!Àjð›+âs¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷U°:\ྠ+V…ï+ãc¬W€¸¯B€Õá +°÷Õ`uö +°€¶M°*zXÙ«`u¸,À}5X} °þ¼V+ÀÚW!Àªð`e|¬æ«³W€´mB€ÕÑ +°ÀöU°:\ྚ¬ÊV€•i߄«£`í«`u¸,À}5X½, m¬ŠÞV¶Ç*X® p_…«Ã`î«`u¸,À}¬ +ßVÆÇ*X® p_…«Ã`î«`u¸,À}¬ +ßVÆÇ*X® p_…«Ã`î«`u¸,À}¬¿ °">W!ÀêpX€û*X® p_…«Ã`î«`Uø°2>V!ÀêpX€û*X® p_…«Ã`î«`Uø°2>V!ÀŠÅP`Á…V€u{¡Ë/E¬p¥`s€õ|ù5÷ütùñ&X:µ¬Xüáýéû¿ýõ˽ãééíõ»[w>֏óÛÃoZþ^àÕuîÓÝ÷. Â}5®@𱚍_ᾚ_ᾚ_ᾚW øX́F‰¯@ƒp_́F‰¯@ƒp_́F‰¯@ƒp_́F…ï@#ãs5%¾ Â}5%¾ Â}5%¾ Â}5®@ð±Ò¾DÛf4Jzdûj4J|„ûj 4:{@ûf4Jzdûj4J|„ûj 4Jûhm›9Ðèh`Õh”ø +4÷Õh”ö5Ð Ú6s QÒ+Ð ÛWs Ñá +4«1Ð(ík A´mæ@£¤W A¶¯æ@£ÄW A¸¯æ@£Ãh>Vs Qâ+Ð ÜWs Qâ+Ð ÜWs Qâ+Ð ÜWs Ñá +4«9Ð(ñhî«9Ð(ñhî«9Ð(ñhî«9Ðèp€Õh”ø +4÷Õh”ø +4÷Õh”ø +4÷Õht¸ ÀÇj4J|„ûj4J|„ûj4J|„ûj4:\àc5%¾ Â}5%¾ Â}5%¾ Â}5¾ŒÏÕh”ø +4÷Õh”ø +4÷Õh”ø +4÷Õht¸ ÀÇj4J|„ûj4J|„ûj4J|„ûj4:\àc5%¾ Â}5%¾ Â}5%¾ Â}5®@𱚍_ᾚ_á¾Ò¾DÛf4:ZØc5%¾ Â}5%ý{ AðçÅh”ð +4ˆöÕht¸ ÀÇj 4Jûhm›9Ð(éhí«9Ð(ñhî«1Ðèìhí›9Ð(éhí«9Ð(ñhî«1Ð(ík A´mæ@££h€=Vs Qâ+Ð ÜWs Qâ+Ð ÜWs Qâ+Ð ÜWs Ñá +4«9Ð(ñhî«9Ð(ñhî«9Ð(ñhî«9Ðèp€Õh”ø +4÷Õh”ø +4÷Õh”ø +4÷ÕhTø42>Ws Qâ+Ð ÜWs Qâ+Ð ÜWs Qâ+Ð ÜWs Ñá +4«9Ð(ñhî«9Ð(ñhî«9Ð(ñhî«9Ðèp€Õh䒠 +4èB×sŸ.t<éJßú…œç÷Ëñóå»h¬S+ÐxžÆø#ÑǏ˿çõ»[Áïq¼üª÷ò0Å8Ç·ß~N‰—Ô¹O·œDûòœ__¿þÞü΅îà×ӈûêüõp<ý‰¢Ã¯§÷ÕøûáõåôÚâ×ӈûê}üùòvžŸÛǾN>Và—·sznû:¸¯>À/oçë½Küzq_}€_ÞÎÓùÔâ×ӈûêÿ_ÙݬVš¤W¾퉐R©¿;ðÄ`0ô¼±ÓvAö•Ù†¾û–ÊŠG;tÞµjþ±WÔ§¢tTœ‡ø<þõîæöåÁ¾öõ4ŏÕ+ñû›‡çGûÚ×ÓïÕ+ñǛۧ'ûÚ×ÓïÕ+ñ盇Ç'ýÚߟÆx¯^¹rìõ§óðö‰BÅ×Ó?V¯Ä_:__ìk_Oc¼W¯Äßïd“ñuÓÅ{u¾éMÆ×MoïÕù¦7ÏMo?Vç›Þd|ÝôFñ^oz“ñuÓÅ{u¾éMÆ×MoïÕù¦7ÏMo?Vç›Þd|ÝôFñ^oz“ñuÓÅ{ ±‹C¼W«ø†ÄsüXHìâÄïU€Ä.H ñ^HìâÄïU€Ä*¾!ñ?V»x 1Ä{ ±‹C¼W»x 1Ä{ ±‰_@â1~®$vñ@bˆ÷*@b$†x¯$vñ@bˆ÷*@bߐxŽ«3$ví‰!]›‰]:Ú½ +Øʼn!Þ«3$Ví@â9ݛ‰]:Ú½ +Øʼn!Þ«3$ví‰!]›‰UzCâ¹}¬$vñ@bˆ÷ê ‰]{AbH×&@b—$†v¯$Vñ ‰çø±:Cb×^Òµ Ø¥‰¡Ý«‰]<â½ +XÅ7$žãÇ*@b$†x¯$vñ@bˆ÷*@b$†x¯$Vñ ‰çø± +Øʼn!Þ«‰]<â½ +Øʼn!Þ«‰U|Câ9~¬$vñ@bˆ÷*@b$†x¯$vñ@bˆ÷*@bߐxŽ«‰]<â½ +Øʼn!Þ«‰]<â½ +XÅ7$žãÇ*@b$†x¯$vñ@bˆ÷*@b$†x¯$6ñ H<ÆÏU€Ä.H ñ^HìâÄïU€Ä.H ñ^H¬âÏñc ±‹C¼W»x 1Ä{ ±‹C¼W«ø†ÄsüXHìâÄïU€Ä.H ñ^HìâÄïU€Ä*¾!ñ?V»x 1Ä{ ±‹C¼WgHìÚ Cº6«ô†ÄsûXHìâÄïÕ»ô;$†ðÇE€Ä.H é^H¬âÏñcu†Ä®½ 1¤k ±KC»W»x 1Ä{u†ÄªH<§{ ±KC»W»x 1Ä{u†Ä®½ 1¤k ±JoH<·U€Ä.H ñ^HìâÄïU€Ä.H ñ^H¬âÏñc ±‹C¼W»x 1Ä{ ±‹C¼W«ø†ÄsüXHìâÄïU€Ä.H ñ^HìâÄïU€Ä&~‰Çø¹ +Øʼn!Þ«‰]<â½ +Øʼn!Þ«‰U|Câ9~¬$vñ@bˆ÷*@b$†x¯$vñ@bˆ÷*@bߐxŽ«‰k!1hAâËÝ}y¼‰‡#ýnHütwóxûøx=µ ñ×wHü‡¹»»ûço¿þòßÿ÷o¿þø˟OÄúöÿœÞ¾Îz:ßãÓóõ«Ý6éϺIïåaÒûɁ&Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Ò«â›ôÎñcH¯‹‡ôB¼WôºxH/Ä{H¯‹‡ôB¼Wôªø&½süXÒëâ!½ïU ½.Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Ò«â›ôÎñcH¯‹‡ôB¼WôºxH/Ä{H¯‹‡ôB¼Wôšøéãç*^é…x¯éuñ^ˆ÷*^é…x¯éUñMzçø±:“^×^¤Òµ ¤×¥Cz¡Ý«@z]<¤â½:“^ÕéÓ½ ¤×¥Cz¡Ý«@z]<¤â½:“^×^¤Òµ ¤W¥7éÛÇ*^é…x¯Î¤×µé…tméué^h÷*^ߤwŽ«3éuíEz!]›@z]:¤Ú½ +¤×ÅCz!Þ«@zU|“Þ9~¬éuñ^ˆ÷*^é…x¯éuñ^ˆ÷*^ߤwŽ«@z]<¤â½ +¤×ÅCz!Þ«@z]<¤â½ +¤WÅ7éãÇ*^é…x¯éuñ^ˆ÷*^é…x¯éUñMzçø± +¤×ÅCz!Þ«@z]<¤â½ +¤×ÅCz!Þ«@zU|“Þ9~¬éuñ^ˆ÷*^é…x¯éuñ^ˆ÷*^¿ ½cü\Òëâ!½ïU ½.Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Ò«â›ôÎñcH¯‹‡ôB¼WôºxH/Ä{u&½®½H/¤kH¯JoÒ;·U ½.Ò ñ^I¯K¿“^\ÒëÂ!½îU ½*¾Iï?VgÒëڋôBº6ôºtH/´{H¯‹‡ôB¼WgÒ«Ú!½sº7ôºtH/´{H¯‹‡ôB¼WgÒëڋôBº6ôªô&½sûXÒëâ!½ïU ½.Ò ñ^Òëâ!½ïU ½*¾Iï?VôºxH/Ä{H¯‹‡ôB¼WôºxH/Ä{H¯ŠoÒ;ǏU ½.Ò ñ^Òëâ!½ïU ½.Ò ñ^Òkâ¤wŒŸ«@z]<¤â½ +¤×ÅCz!Þ«@z]<¤â½ +¤WÅ7éãÇ*^é…x¯éuñ^ˆ÷*^é…x¯éUñMzçø± +¤w¤¨Žôé½<Ðݗ§ë¤w8ÒAz€ô><¿þ¶!Ñûþнï ÷Çßüüö§›ï¿üøùoß~þï_þëÇg¶íöéí[ë»óÉ[|~y¸z7w›NºµÛÅQìvžf²nc¹7Aº©r Û\®M`nªå6—kŒ›*‡¸ÍåÚàfÊÛ·åÞݦÊÁms¹6¶©rdÛ\®MpmªÖ6—kP›)oÓ6–{D›*´ÍåÚΦÊÑls¹6Á²©r(Û\®M€l¦¼ÛXîMPlªÄ6—k›*G°ÍåÚ¿¦Êáks¹6¯™ò¶kc¹7A®©ràÚ\®M`kªµ6—k̚*‡¬ÍåÚ°&Ê^m*› ÕT9Xm.×&P5UŽT›Ëµ NM•ÃÔærmR3åmÔÆroÎBM…P›»§©ntÚ®M°iªš6—ks†i&—6vkTšê¥ÍáÚ’¦Êis¹6g¦Â‹£Íݏ‹€ÑLw[´1ܛ ÑT9m.×æÌÐTx)´¹ûq šê† ÍáÚ€fÊ۟åޜõ™ +/|6w?.=SÝȳ9\›àÎT9ìl.×& 3SÞæl,÷&ˆ3U8›Ëµ ÜL•£Íærm‚5SåP³¹\›ÍLy;³±Ü› ÌT9Èl.×&3UŽ0›Ëµ ¾L•ÃËærm.3åmËÆro‚,SåÀ²¹\›ÀÊT9ªl.×&˜2U)›Ëµ  Ì”·'˽ šL•ƒÉærm%SåH²¹\›àÈT9Œl.×& 2Sކl,÷&2U ›Ëµ |L•£Çærm‚Såб¹\›ÇDùMåcԘ*ÍåÚ2¦Êcs¹6Á‹©r¸Ø\®MÀb¦¼­ØXîMbª(6—k˜˜*G‰ÍåÚ#¦Ê!bs¹6ˆ™òöac¹7A‡©rpØ\®M aª6—k\˜*‡…ÍåÚfÊۄåÞ¦Êas¹6ƒ©r4Ø\®Íق©ð¢`s÷ã"@0ÓÝl ÷&(0U›Ëµ90Õ}`sõÃø/U ÿš»µ ø˔·ý˽9Ë/^ðkî~\ö¥ºQ_s¸6Á|©rÈ×\®Í|™p¼×Ø­EÐ^ªì5‡k¨—*GzÍåڜ— +/æ5w?.ò2Ým¼Æpo‚ðR对\›À»T9ºk.×&Ø.UíšËµ °Ë”·ë˽ ªK•ƒºærméR刮¹\›à¹T9œk.×&`.Sޖk,÷&H.UäšËµ ŒK•£¸ærm‚áR容\›¸DùÂoMåcô–*oÍåÚº¥Ê‘[s¹6Ám©rØÖ\®M@[¦¼ÍÖXîM[ª°5—k¸–*GkÍåÚ«¥Ê¡Zs¹6j™òvZc¹7Ai¼H!­ù4Ëh]œæîËóu¢uý<¿ûÒÅõ’™h­§–Ñzüh´þô›Ïú×oßÿz2×O¼Ïoïð"ôÉ¥‹¯ÿæ_!ZJGÝRêò¬•úä<“•‚x¯‚–rñp)ˆ÷*€)˜‚x¯‚™Rñ¦æø± +lÊÅ㦠ޫ §\é×þþ4Æ{õÊíOëz,ߗnÍñc.Ýrñ\ºñ^…K·\<—nA¼WáÒ-Ï¥[ïU¸tKÅ÷¥[süX…K·\<—nA¼WáÒ-Ï¥[ïU¸tËÅséÄ{.ÝRñmçø± +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÅc!Þ«`U|Ç9~¬‚qtñGˆ÷*Gq„x¯‚qtñGˆ÷*GßÆqŽ«`]<Æâ½ +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÄ/Œã?WÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£Šoã8ǏÕÙ8ºö2Ž®M0Ž.ãí^ãèâ1ŽïÕÙ8ªvŒãœîM0Ž.ãí^ãèâ1ŽïÕÙ8ºö2Ž®M0Ž*½ãÜ>VÁ8ºxŒ#Ä{u6Ž®½Œ#¤kŒ£KÇ8B»WÁ8ªø6ŽsüX£k/ãéÚãèÒ1ŽÐîU0Ž.ãñ^ã¨âÛ8ÎñcŒ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ªø6ŽsüXãèâ1ŽïU0Ž.ãñ^ãèâ1ŽïU0Ž*¾ã?VÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£Šoã8ǏU0Ž.ãñ^ãèâ1ŽïU0Ž.ãñ^ã¨âÛ8ÎñcŒ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8šø…qãç*Gq„x¯‚qtñGˆ÷*Gq„x¯‚qTñmçø± +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÅc!Þ«`U|Ç9~¬‚qtñGˆ÷*Gq„x¯‚qtñGˆ÷*GßÆqŽ«`]<Æâ½ +ÆÑÅc!Þ«³qtíe!]›`Uzǹ}¬‚qtñGˆ÷êh]úÝ8Bøã"GŽq„t¯‚qTñmçø±:G×^ÆÒµ ÆÑ¥c¡Ý«`]<Æâ½:GՎqœÓ½ ÆÑ¥c¡Ý«`]<Æâ½:G×^ÆÒµ ÆQ¥·qœÛÇ*Gq„x¯‚qtñGˆ÷*Gq„x¯‚qTñmçø± +ÆÑÅc!Þ«`]<Æâ½ +ÆÑÅc!Þ«`U|Ç9~¬‚qtñGˆ÷*Gq„x¯‚qtñGˆ÷*G¿0Žcü\ãèâ1ŽïU0Ž.ãñ^ãèâ1ŽïU0Ž*¾ã?VÁ8ºxŒ#Ä{Œ£‹Ç8B¼WÁ8ºxŒ#Ä{Œ£Šoã8ǏU0ŽγÆ´Œãåîîo¯ÇáH¯£_?š¿}/)8ã³Çžînžîû}|ó|÷ø’£Ýß^íþþÿPë©·“ýßÕs]l­Þ?Ml­—endstream +endobj +817 0 obj << +/Type /Page +/Contents 818 0 R +/Resources 816 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R ] +>> endobj +820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 707.1283 240.8357 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributes) >> +>> endobj +821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 707.1283 538.9788 716.0945] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributes) >> +>> endobj +822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 692.2392 260.5119 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributeTypes) >> +>> endobj +823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.0237 692.2392 538.9788 703.1431] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceAttributeTypes) >> +>> endobj +824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 681.2254 254.8727 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceInstantiations) >> +>> endobj +825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 681.2254 538.9788 690.1917] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceInstantiations) >> +>> endobj +826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 668.274 205.0603 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlices) >> +>> endobj +827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 668.274 538.9788 677.2402] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlices) >> +>> endobj +828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 655.3226 226.1909 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceTicket) >> +>> endobj +829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 655.3226 538.9788 664.2888] +/Subtype /Link +/A << /S /GoTo /D (0:GetSliceTicket) >> +>> endobj +830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 642.3711 208.5374 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlivers) >> +>> endobj +831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 642.3711 538.9788 651.3374] +/Subtype /Link +/A << /S /GoTo /D (0:GetSlivers) >> +>> endobj +832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 627.482 223.8798 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:NotifyPersons) >> +>> endobj +833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 627.482 538.9788 638.3859] +/Subtype /Link +/A << /S /GoTo /D (0:NotifyPersons) >> +>> endobj +834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 616.4683 217.2351 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:RebootNode) >> +>> endobj +835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 616.4683 538.9788 625.4345] +/Subtype /Link +/A << /S /GoTo /D (0:RebootNode) >> +>> endobj +836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 603.5168 215.561 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:RefreshPeer) >> +>> endobj +837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 603.5168 538.9788 612.4831] +/Subtype /Link +/A << /S /GoTo /D (0:RefreshPeer) >> +>> endobj +838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 590.5654 226.9482 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:ResetPassword) >> +>> endobj +839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 590.5654 538.9788 599.5316] +/Subtype /Link +/A << /S /GoTo /D (0:ResetPassword) >> +>> endobj +840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 575.6763 254.325 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:SetPersonPrimarySite) >> +>> endobj +841 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 575.6763 538.9788 586.5802] +/Subtype /Link +/A << /S /GoTo /D (0:SetPersonPrimarySite) >> +>> endobj +842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 562.7248 228.2933 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddress) >> +>> endobj +843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 562.7248 538.9788 573.6288] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddress) >> +>> endobj +844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 549.7734 252.9508 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddressType) >> +>> endobj +845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 549.7734 538.9788 560.6774] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateAddressType) >> +>> endobj +846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 536.822 236.0541 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateConfFile) >> +>> endobj +847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 536.822 538.9788 547.7259] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateConfFile) >> +>> endobj +848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 523.8706 216.8267 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateKey) >> +>> endobj +849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 523.8706 538.9788 534.7745] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateKey) >> +>> endobj +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 510.9191 235.4862 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateMessage) >> +>> endobj +851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 510.9191 538.9788 521.8231] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateMessage) >> +>> endobj +852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 497.9677 247.6609 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeGroup) >> +>> endobj +853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 497.9677 538.9788 508.8716] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeGroup) >> +>> endobj +854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 485.0163 256.9658 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeNetwork) >> +>> endobj +855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 485.0163 538.9788 495.9202] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNodeNetwork) >> +>> endobj +856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 472.0648 222.2064 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNode) >> +>> endobj +857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 472.0648 538.9788 482.9688] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateNode) >> +>> endobj +858 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 459.1134 220.0046 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePCU) >> +>> endobj +859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 459.1134 538.9788 470.0173] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePCU) >> +>> endobj +860 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 446.162 218.3308 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePeer) >> +>> endobj +861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 446.162 538.9788 457.0659] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePeer) >> +>> endobj +862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 433.2105 227.7454 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePerson) >> +>> endobj +863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 433.2105 538.9788 444.1145] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePerson) >> +>> endobj +864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 420.2591 216.1289 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSite) >> +>> endobj +865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 420.2591 538.9788 431.163] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSite) >> +>> endobj +866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 407.3077 256.3276 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttribute) >> +>> endobj +867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 407.3077 538.9788 418.2116] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttribute) >> +>> endobj +868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 394.3562 276.0038 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttributeType) >> +>> endobj +869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 394.3562 538.9788 405.2602] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSliceAttributeType) >> +>> endobj +870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 381.4048 220.5523 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSlice) >> +>> endobj +871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 381.4048 538.9788 392.3087] +/Subtype /Link +/A << /S /GoTo /D (0:UpdateSlice) >> +>> endobj +872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 368.4534 223.8699 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:VerifyPerson) >> +>> endobj +873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 368.4534 538.9788 379.3573] +/Subtype /Link +/A << /S /GoTo /D (0:VerifyPerson) >> +>> endobj +874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 355.5019 249.0747 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:system.listMethods) >> +>> endobj +875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 355.5019 538.9788 366.4059] +/Subtype /Link +/A << /S /GoTo /D (0:system.listMethods) >> +>> endobj +876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 342.5505 251.2768 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodHelp) >> +>> endobj +877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 342.5505 538.9788 353.4544] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodHelp) >> +>> endobj +878 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 329.5991 270.096 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodSignature) >> +>> endobj +879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 329.5991 538.9788 340.503] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodSignature) >> +>> endobj +880 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4658 316.6476 237.4483 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:system.multicall) >> +>> endobj +881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.0424 316.6476 538.9788 327.5516] +/Subtype /Link +/A << /S /GoTo /D (0:system.multicall) >> +>> endobj +819 0 obj << +/D [817 0 R /XYZ 71.731 729.2652 null] +>> endobj +816 0 obj << +/Font << /F29 532 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +915 0 obj << +/Length 1659 +/Filter /FlateDecode +>> +stream +xڝX[“£D~Ÿ_ÁcR5´}åâÛ8¥³««¦œXZåú@€L( D.;ο÷4twšK`´¶fðqîç;ˆƒáq|‚|"ê êÄç;ì¼À­§;¢ Üó㋙»®`> +ê9®-ä›ýÝWßQâPŒ<g4ª0C”yÎ>ùcóxŠ.MZm]ê‚úãÇ¢©¶oʤ›¬,¶î¿Y¡¢Ð= Šû( Øw\"ƨè„íO)x³Ë£"m>E‡þò1QÞ_<ì>ö'Ÿ±À»Op g¤ÿ-«ûc£%eXwܼ‰âTß«ÊöåÔ_¼ž²ø4zfI{5Ñ!ªSéDÏ%…‚ðÎüúT¶yÒãJVÇi]§êרP'ç ƒ¿4AýÆuãžv¥5OÞF†¾¦‡:kÒûáí¢LÒzô[Ô6å9j´¤:®²K£AÒª;}6ô³`@¥ÃZÚ^|j/öcYB™üu(Ûƒw?µUºbÎó,Nmûº“<¯úSÈIÖdi=ç\^&qÓIDª0‰C|D‰à²2]Sš\@×pÖÉ H÷ց ,ˆ£Õò¦(ð=XÞ&Çëó%‹ú“ßüäþ²{TØ±ù"ÿÓñø°ßïžoÖRÝ^.eՌ›£n ´Q•˜V©Êú’š–Ç1Žò¼–7î¾Ýö #†wcà>¸:G1åÚ°žbì¸M¥uõV7éåYÝü˜6§2™XA!‚‚ŒE+ jŊ©4iÅýD)¥H`®(Õ¨5¥i–ëçÎíç쥈š¶Jǖ0 iŸC©.ZbP+–L¥õîÛd1ÐÎ)ò0]Ó®QkÚ'Ò&qøæ—±ÂO‰e# jň©´Q–é5ñ)+^ºr¦ˆû$˜öÒ¤•˜‡8 ˆ#(A˜6ßJåÚ°™VšH³ãØ撽¦6P,ÇÁ² µbÃTš´AÑÔo[¤ÓŒ§o*iíŸ8½\‡Gy4˜Z¡:.ÒùÈÕpî·  ‹þ’ €æ׌D›ÃU+ØXTƒ9n™óB2Ì\teѬқ¦U­Æ[TmI°yiÏ \yú  \Ô©äVéßmV¥ã +^ΤûQˆK7zXà²J»ùň‡˜å²'Í}•=iΌ)Á^  Êڏ×h« +ö1‚í‘׃¤Œ;-{`æ+?¯9P·Ôӱ­®ã¼sï8žÓ‹áº7àÂ$*çmX2rI<È]Toe‘¿]÷EíãhÒˬårŸö½ù6×(׆郅ÝǤkó‰4éÀgJÅD/pã„Îê¯vè§fí°è^ |lhÇ3¬2×pBUm¿Ö¦z¬^+M ¼]:¦R¡ý"ÓåY2*9Êû#lTU­dÿÛå¢ì‘°ŒË £èÙ©Ñ­z(KÝä?ä:¨ÿÚö^qеD_%÷é7àû°ÿp ?ðè<ýj”kÃfèw"Múð”6:-“5hsY»A­hgŒ ç´·õµ¥ +k¡—ï ÃÖ–‹~1hõëZT÷ìD1AA@†ät‰êúU¼ÔCY×ÉSÑîžæëQŠAsÊÈqo–B9¶èVŽY"àÕ¡çÐúÙQ8\ƒ„m…6=û—`Þ.žo•Ì-aBšŒ×HĆ-ˆ­’ÈœÞwÈœ3$2°c'#0Ièbö`í >ûÏÙëÊFjXO_Ï’½Šè tz„™ËûYêқGêÂûj·y9–P{ÅH’J¾_wõ=_6Ò«ç¦êz)„W‡î‡™ù€‰1sŠû¶Q¼5èž[…Ge{3/\)<¶Px¶ZxszßQxsvÌÞÀŽ®0³k<úÛK^FÉ` (”kÃæ>Œ¥™ƒScÕákª5jM5ìò Ã݁êrªÕ‡bE©­éËê(±û 8ç0# Óeݵ¢|*­/¢ž4ýaÏ'ÿ¿\^Þ?Äû@ˆÀĪ_½r´fÅíp£¨¨ê°#äF_)ˆkaºx0l¿Ë1†0&ÌHê>[Žµ™oý3úþ4¨ã endstream +endobj +914 0 obj << +/Type /Page +/Contents 915 0 R +/Resources 913 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 515 0 R +/Annots [ 918 0 R 919 0 R 920 0 R 921 0 R 929 0 R 943 0 R 944 0 R 945 0 R ] +>> endobj +918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3072 530.8136 218.5188 541.7176] +/Subtype /Link +/A << /S /GoTo /D (0:system.listMethods) >> +>> endobj +919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.5076 530.8136 321.7405 541.7176] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodSignature) >> +>> endobj +920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.606 530.8136 423.0197 541.7176] +/Subtype /Link +/A << /S /GoTo /D (0:system.methodHelp) >> +>> endobj +921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.4318 517.8622 203.0171 528.7661] +/Subtype /Link +/A << /S /GoTo /D (0:system.multicall) >> +>> endobj +929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.0771 445.6331 329.9009 456.537] +/Subtype /Link +/A << /S /GoTo /D (0:GetSession) >> +>> endobj +943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.1896 228.1838 456.6551 239.0878] +/Subtype /Link +/A << /S /GoTo /D (0:AddPersonKey) >> +>> endobj +944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.9595 215.2324 252.8111 226.1363] +/Subtype /Link +/A << /S /GoTo /D (0:AddPeer) >> +>> endobj +945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.0987 215.2324 312.5665 226.1363] +/Subtype /Link +/A << /S /GoTo /D (0:UpdatePeer) >> +>> endobj +623 0 obj << +/D [914 0 R /XYZ 71.731 718.3063 null] +>> endobj +10 0 obj << +/D [914 0 R /XYZ 298.5799 703.236 null] +>> endobj +916 0 obj << +/D [914 0 R /XYZ 71.731 672.5787 null] +>> endobj +624 0 obj << +/D [914 0 R /XYZ 71.731 622.8923 null] +>> endobj +14 0 obj << +/D [914 0 R /XYZ 225.2223 579.7949 null] +>> endobj +917 0 obj << +/D [914 0 R /XYZ 71.731 559.6545 null] +>> endobj +922 0 obj << +/D [914 0 R /XYZ 435.9113 508.0639 null] +>> endobj +926 0 obj << +/D [914 0 R /XYZ 71.731 480.0042 null] +>> endobj +927 0 obj << +/D [914 0 R /XYZ 71.731 478.7588 null] +>> endobj +928 0 obj << +/D [914 0 R /XYZ 129.5143 461.7376 null] +>> endobj +930 0 obj << +/D [914 0 R /XYZ 71.731 433.6779 null] +>> endobj +931 0 obj << +/D [914 0 R /XYZ 71.731 423.7153 null] +>> endobj +932 0 obj << +/D [914 0 R /XYZ 71.731 423.7153 null] +>> endobj +936 0 obj << +/D [914 0 R /XYZ 76.7123 370.9133 null] +>> endobj +937 0 obj << +/D [914 0 R /XYZ 129.5143 352.9806 null] +>> endobj +938 0 obj << +/D [914 0 R /XYZ 71.731 352.881 null] +>> endobj +939 0 obj << +/D [914 0 R /XYZ 71.731 342.9184 null] +>> endobj +940 0 obj << +/D [914 0 R /XYZ 71.731 342.9184 null] +>> endobj +941 0 obj << +/D [914 0 R /XYZ 76.7123 249.2697 null] +>> endobj +942 0 obj << +/D [914 0 R /XYZ 129.5143 231.3369 null] +>> endobj +946 0 obj << +/D [914 0 R /XYZ 71.731 216.2286 null] +>> endobj +947 0 obj << +/D [914 0 R /XYZ 71.731 206.266 null] +>> endobj +948 0 obj << +/D [914 0 R /XYZ 71.731 206.266 null] +>> endobj +913 0 obj << +/Font << /F21 514 0 R /F29 532 0 R /F38 925 0 R /F40 935 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +951 0 obj << +/Length 1378 +/Filter /FlateDecode +>> +stream +xÚ­X[ÓF~ß_a©Ä*žÌÅcé ²¢b+D#µ ÊkO²Ž|!Ъÿ½gn^ß²@U­´vâ3çúïœ˜xþˆ3¸ÐшS/;^a¯ˆ ¬L0z¶»Ú¾`ØKPÑÈÛí½0dˆã8öbF‘àDx»üíæù]zêdã”ã Aæú²ê?ä›:ï³®¨+ÿýŸwƒEÎb”Pû [ƒÔÒ1šŒ#àÇ@”Dˆ iÇÚâP¥]ßH? c²¹®ú××Æ¿Ñ3õ±Þ›kw'•§ 0B„óÐ E '\+ÌÒª®Š,-‹¿d®å°µÀ;Ìñ]םžl·çóُøªŸˆÍa»{³ý|,ƒµƒ +8LŒܼ +Þ¼~>ä—,€Î攡¬>nۓ̴š<5²•U—êz,ÂÖ7 Ñ­gd¦-51õGPØZÉz¦ U¢yá Iç$öx"ˆZ-ü ŒÅ\á1&ºð m:I”ò…]J ]µ;¿ÞûáN­ú1 ÀRæ~<¸ø„o¾ëÞ&)í!=U RUÐÙñ ­B/ !Âqh°ûändwWkœm_„Ø`- + Ü-:±©˜1&´(…`cD ײ–HhÌ¡‡àGQÕ©±Ø¼©KéNŽC +c$(† +¨^£Xû­>ÚâîûJ7¶ë˜~±¸©J{w;‚´‹ùÎ>ë[Ùؓ碻³‚²éÒÂB³Ñné[…ùVÊyE™„”-{ñ¯"i +ÆbË +.µ©x¯e7ägl;¤aJã‡mR_±½Ôf[<¶¨©lþj@O3Oy#È4ÃB¸˜£0&Óf͋½Oùf/€ž9STûº9Ž¨Àu. ³šË“¬ò¢:¸rÏÒ¥ vOg –1 +}äå¸e ²¡œ9èõ(àóUËЪÂI24Æj÷DÆÔzóŒµqŒ씍™º±qjeŸ×~dßÓi{¸ÈS›Kˆ¼Vù=·z»˜hÕP|O°Ê‰0.t  +#@ TÌh½ïj@…n³¦89~oúªZÔ=5å¡ÅjÛg¶ŸÓvV÷guÝÍý« +MßݤUz˜ýŸyœ Ïïªõ·åÒF£Y¾®äOÃ&ˆ×/×hß&ªk`7VcïFoÛe9µª{ñcêL_àÄa2Ã0Qððt‹­Lµ…6=ä¨"‘…Q;£_ñÁI}͇…6ǍhuÜ%ÁšjÃ…IÙiÇì´{Q”jW…r}óÌ»©/ìD3°……4v‚ɱb€1L¬Ìl†véŸàœt–*z9¬×ãµË6Š‰¨½×´iÒ/íÔý¢ê¤ÊÀÁiU`:²…ßGÇu€Rhúa© "¨Ó¾*r…m Ϧµ4P7“0 Øݼ²›èÀ&«±.FKځ/·>…õ¡“í…Ù¢Ôv…{|+{Ù2wYS p>êl|N§Hl•E(A‰Žö?ˆ0p™µwæ6Ó$¦îöMz8êÁ©>¹&ÕneYŸ'Ë9èäshQL¨†&~KÓÇìý·ˆþýHïŸEþè‰1bÏþóŸsLßÿh.ÊÓï”gƒ[³®˜Íÿß}…íË| ú)¦åǾPÜÿIýKËaO1È +ZFóÃÑ.çØÊò“‚Àý|¿o]ÃñH[⃩^éxZW²;×Í~fCDˆ—”€%j[dzùܖE&/h5làîÊփ¸ùUUn +»„Â6ž;j˜vb»øýfßÙ %¾LÉ,ß%pÆ`{!lФœ¦_¬Øû?endstream +endobj +950 0 obj << +/Type /Page +/Contents 951 0 R +/Resources 949 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +/Annots [ 958 0 R 964 0 R ] +>> endobj +958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.946 438.6014 426.0189 449.5054] +/Subtype /Link +/A << /S /GoTo /D (0:GetRoles) >> +>> endobj +964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.5554 354.2926 165.3794 364.8229] +/Subtype /Link +/A << /S /GoTo /D (0:Authentication) >> +>> endobj +952 0 obj << +/D [950 0 R /XYZ 76.7123 592.7771 null] +>> endobj +953 0 obj << +/D [950 0 R /XYZ 129.5143 574.8443 null] +>> endobj +954 0 obj << +/D [950 0 R /XYZ 71.731 572.6875 null] +>> endobj +955 0 obj << +/D [950 0 R /XYZ 71.731 562.7249 null] +>> endobj +956 0 obj << +/D [950 0 R /XYZ 71.731 562.7249 null] +>> endobj +625 0 obj << +/D [950 0 R /XYZ 71.731 519.8856 null] +>> endobj +18 0 obj << +/D [950 0 R /XYZ 152.1087 474.6313 null] +>> endobj +957 0 obj << +/D [950 0 R /XYZ 71.731 454.4909 null] +>> endobj +959 0 obj << +/D [950 0 R /XYZ 71.731 406.721 null] +>> endobj +960 0 obj << +/D [950 0 R /XYZ 137.5342 395.9264 null] +>> endobj +961 0 obj << +/D [950 0 R /XYZ 178.4208 395.9264 null] +>> endobj +962 0 obj << +/D [950 0 R /XYZ 427.4646 395.9264 null] +>> endobj +963 0 obj << +/D [950 0 R /XYZ 119.5517 370.0235 null] +>> endobj +626 0 obj << +/D [950 0 R /XYZ 71.731 354.0435 null] +>> endobj +22 0 obj << +/D [950 0 R /XYZ 156.6362 310.5725 null] +>> endobj +965 0 obj << +/D [950 0 R /XYZ 71.731 290.4321 null] +>> endobj +966 0 obj << +/D [950 0 R /XYZ 167.9796 277.6957 null] +>> endobj +967 0 obj << +/D [950 0 R /XYZ 71.731 252.6248 null] +>> endobj +968 0 obj << +/D [950 0 R /XYZ 71.731 187.0522 null] +>> endobj +969 0 obj << +/D [950 0 R /XYZ 432.4945 175.2798 null] +>> endobj +970 0 obj << +/D [950 0 R /XYZ 119.5517 162.3284 null] +>> endobj +627 0 obj << +/D [950 0 R /XYZ 71.731 159.2998 null] +>> endobj +949 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F40 935 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +974 0 obj << +/Length 1461 +/Filter /FlateDecode +>> +stream +xڝioÛ6ô{~…×}ˆD´¨[\,K.ƒ“¶‹mHƒA‘i›ˆ®’ÒcØßã!ùˆêµC‘šz|÷ɇ{üý£À;B¶ïÙ½$;³z+¸úx†5Š©qÌ}¤ŸçgƒÇêE(òm¿7_ö\×Až½À±Qèá°7_<ö¯×qYf˜¶gõ1R¿·yÅ ×ë‹:©h‘Oó_ÏFóV¢ç( +íIµZ¬·ŠÙ¸‡dcÏš56Z>Â8ˆ¤^¹B™ ìOÒ8'Õ8~VŸ|MÒT(\¢}óÚVÐ3…uH.Wʞ¤È²8_˜)͉‚”¬X±8Ó×qš’…æîñÄÀËöììÜÊ4áëѶ‹|'°5§Y™Òϖe®øÇuµ&yE“X:SÂxÅÀ·5Óú¬A=Ðnu¡)ò…:PÍ¢ædY§ê¼,˜P¢gbÏGaEp²QäaWÉO-+ृ9_7LŒn€ +ªÐgÃ!ÑbãFsõ3¦yýªŽÓÉ݁Óäy2¾¾šÜ©Îȗš²Æ“mµV‰4¸EwÎs|a×uµ÷>[¶×áânj[ä†Äq­^8¾L#Ó ,FŽÝ3mŒ|¬©æñŠ\¦oY:€òøX”"üIºÒ9Øö$¾»”wØBAc`êùŽÄ0—ŠÍõÃýÍíÇ õašI‘/éj¨ Š‡Èñ||HS$Š f:3hIS¢ãÛIkj >Mǭܚ¥Cø6Lǂo Ò˜wÀ!ÑÊ_]¦óòqBX5TÐÊ·ìg³±¶èèRä÷iÍ_úíýltýi:j%Ӝ“jaØܜþ¡PTyQiák’¼üO…2…~7šÿòð¡U'#«‹¡‚~‹#Ž \À““Ò¹Öz4›Ý>Ü·â9áØ 5ü[Ð$êã…lOŠ­urÌFÓ]q†b@/ÙO!q¡g¤3›Ju?¹šÍ~{˜îÜXƜo +¶67ßbICtÒ­Ñôa¼Ë!V¤d( Lj‹N½_[Ú×,e¥* +ð ' +þûÝ؜Nt¡Ò¦ä*¤“• C ÜÉX¬‹¢©dç'u­Ò‚‹†¤óFôJq ¯´êèzfÛ{\yŽ6+IB—[Ým+õ›’˜ë#¤¢:´-Yv†ƒÞ¼-jÖ}ñ½ìh«–n§a´7w}GXU%¿ 6› *åÀ6Óøl5PÃa Iê]ZýÄiEYÔ–[&ÿa`lõ‹Z)º¡©ž„Ïí4'ê¯GZ­æ ¾¬¬ô<¼=t #­Cš±¦4Í ×êÿ%æbñb€øc¯ŠȏüZdô8 +G½¡ÉžýÝ<.‡oÃê­½âq±›¾4o%Y,$¥éÖð½>:Íf8™H9I¤/U à%qTš]=¯£*æÛRçù;¾åÉP +o;Ùùg˳à¿S….éw¢RĝjŸ{Ë%+ij€™”ºx<0ïéýû÷Šî +T¿S£Q¢‹Ǐ¤º/DZõˆmü¤[Ëãyà?éâ\ÎׯD¥?}Mðãß-‘~¶Ã7äúê\Ԛ‰QÂQÉhž +úÿóôŸ¥uś|=ùJŒ!AeZ헕~Óé$„þu(v ¨›ã²ÊbMš0"†²> endobj +26 0 obj << +/D [973 0 R /XYZ 231.5225 706.1179 null] +>> endobj +975 0 obj << +/D [973 0 R /XYZ 71.731 685.9775 null] +>> endobj +976 0 obj << +/D [973 0 R /XYZ 251.8044 673.2412 null] +>> endobj +980 0 obj << +/D [973 0 R /XYZ 71.731 648.1703 null] +>> endobj +981 0 obj << +/D [973 0 R /XYZ 71.731 385.6198 null] +>> endobj +982 0 obj << +/D [973 0 R /XYZ 71.731 360.5489 null] +>> endobj +983 0 obj << +/D [973 0 R /XYZ 71.731 319.4679 null] +>> endobj +984 0 obj << +/D [973 0 R /XYZ 71.731 281.4456 null] +>> endobj +985 0 obj << +/D [973 0 R /XYZ 71.731 182.0831 null] +>> endobj +986 0 obj << +/D [973 0 R /XYZ 71.731 134.0981 null] +>> endobj +987 0 obj << +/D [973 0 R /XYZ 148.0846 123.3035 null] +>> endobj +988 0 obj << +/D [973 0 R /XYZ 291.6145 123.3035 null] +>> endobj +989 0 obj << +/D [973 0 R /XYZ 71.731 111.1841 null] +>> endobj +972 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F28 527 0 R /F14 979 0 R /F40 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +992 0 obj << +/Length 596 +/Filter /FlateDecode +>> +stream +xÚ¥T]o›0}ϯ@é‰T æ›I“¶v[•i›ª5oYT¹àKÆfØ4ê~ýlLiX4iâËññ¹ç^_ -O=ÐJ Hõò3àǑoåÕ̳öjén{ŠÓsœ1éf=s?ž•,öck½³Â0‘—$Vø `j­‹Íâ¶DµÄÍÒñ#oy¯˜l–a´àE›KÂÙr»þ<û¸2FA²TÉ^´5°Î…ž•*cq¨A˜(‚‰g1ˆÓ$쌑ªæ\:±ç-ċД¬ã €º E¹2«ðµ´§Rž£Îr÷%K$6Áý—Û÷÷+¿ÿj„D”Šs® rŠÄ`BGqÐYPÎ@d P]cVüð"Ïv[Ѹ¢D vkš?¢šØ +‡*X1" ¢äWŸW”˜RböLÎ*Ì$0ȃ^ԉ:Ñ:#½À;ÂztÇ%WX–¼˜¬åê؋W]5ÎɎàÂ|2TaQ£¼_ÕN ㅰ½Áö”?!*þŤÊR]0c”è‹–S¼]ë¡Jðð§qãù1ðÄnu>†ñöUo_UpÝmŽC5§Iz*Ñ6ôDb^JY‹7®{8@MÃÒ¡è ðfpç×S^Z¡ñ’FÞ "1ÀE;½©VsyàMqºñˆÎ‡¹sïfü¢q“o¸,û‘iúcÁ?[òŒ¨šº©¬ŒXœ¤¼Ãò›uÃ6ЇÛkƒolÍ}$…ÝvɅÔ#doÇ?ÅeuuLà2Œï®þ² SÂ8»xŸŽ8ç×iÀó`0(iëá_oʉ|¿ endstream +endobj +991 0 obj << +/Type /Page +/Contents 992 0 R +/Resources 990 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +990 0 obj << +/Font << /F30 622 0 R /F40 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +995 0 obj << +/Length 890 +/Filter /FlateDecode +>> +stream +xÚ½W]›8}Ÿ_Ác"-®?ðW*¥Ý¶Új·UyëT#œRF@Tí¿ï56Ä †¤Òj5Àøúžããsí’`ø#‰$H2xP¨à4Ù=ßáä }¼#>$QN|DFSÎ$ҊŠ$ “¼ÝÞ½ú@IB1\ñd»¡0C”‰d[|]½{Ê_:Ó¬S*Պ"÷¼?ä•éþο»ÏÍý_îåÓ=ÕE»þ¶ýÔ§&QÂ3›8A‚Ù/HKñ¹6ŚàUáiÛíZàÕ¿/ƧщFZ{ȒI¤(–IÊ(RRÈ>×}Swu^3Ì=®Ÿ›R'J÷6Ày(å RÊñêsœ»§?ÜgîbmêÇŒ©9-бtÀ ‰ýiÚ]S¾te]-QcqAGj­GwÊ¬)_ý,-ä^?”–š{o_Ì®ìÙîeµ°?ÔxŽ­)¥j÷‹Ø/élðÅtǦŸÌ<9—¿,N’¾q¯¸—ÎQÚ{®Çݦì/ùޚ ?:TTó³l ºUóÍáP÷¤†å©¦½Õyñ rÝu¿&¤ËŸ ˆƒ¸{¿ˎ8'2aʖS´pÓ1( ¢\eêªVbbñ'¹,þ¥|J)b¡1ÐËç‰Ä0iB‚©@0‡';#aë%"ͶùmÈk¿Ù]sÜu~£Ý‘a]óMՕ»Ü–IylÌtuÁÕzFÓ!* ÃN¢{Ɲ­g›U¶ÓLGqçefMyœëÊ4ʤ<§±]ÜqQ—Cef2›è[V?}#²>»t®„ë±àç} údŒÉkÆ Â–œ;„]·n÷ï^ò˜1oÈãìÌÚ»St*7Á’X²˜Ÿç-Jâ Á‡ž¢– ꣮ûs +z‹=/HÄÝp¨à̛)z¬õ’-//°Yù¨fp+ªk†-8†]U0†{ƒ„Q Ïh§î ¢¥€[I(ù[Zöoi“TÁ¾é º@ŒÖYxÏßYԖ•m֖k? [¨ý1ìjíÇpo¨ý ~G„<Êj¸Œ>ÿgmL¬óM¹DR1Öïe\ú˜^m€ûî´þǎxÀ<¶Ô—ÅcÝ<Úsáb´,†Ž9ÜoÿC#SH¡£&ó!iã + ‡!cpä6f²‹™¸küýÁû_ð$Õendstream +endobj +994 0 obj << +/Type /Page +/Contents 995 0 R +/Resources 993 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +628 0 obj << +/D [994 0 R /XYZ 71.731 718.3063 null] +>> endobj +30 0 obj << +/D [994 0 R /XYZ 408.0688 703.236 null] +>> endobj +996 0 obj << +/D [994 0 R /XYZ 71.731 672.5787 null] +>> endobj +629 0 obj << +/D [994 0 R /XYZ 71.731 672.5787 null] +>> endobj +34 0 obj << +/D [994 0 R /XYZ 246.3801 631.6006 null] +>> endobj +997 0 obj << +/D [994 0 R /XYZ 71.731 608.1118 null] +>> endobj +998 0 obj << +/D [994 0 R /XYZ 161.0655 598.7239 null] +>> endobj +999 0 obj << +/D [994 0 R /XYZ 71.731 586.6044 null] +>> endobj +1000 0 obj << +/D [994 0 R /XYZ 71.731 555.2385 null] +>> endobj +1001 0 obj << +/D [994 0 R /XYZ 168.8063 544.2282 null] +>> endobj +1002 0 obj << +/D [994 0 R /XYZ 71.731 517.1648 null] +>> endobj +1003 0 obj << +/D [994 0 R /XYZ 71.731 500.7429 null] +>> endobj +1004 0 obj << +/D [994 0 R /XYZ 71.731 469.1613 null] +>> endobj +1005 0 obj << +/D [994 0 R /XYZ 181.5683 458.151 null] +>> endobj +1006 0 obj << +/D [994 0 R /XYZ 71.731 448.0889 null] +>> endobj +1007 0 obj << +/D [994 0 R /XYZ 71.731 416.5173 null] +>> endobj +1008 0 obj << +/D [994 0 R /XYZ 71.731 403.5559 null] +>> endobj +1009 0 obj << +/D [994 0 R /XYZ 71.731 402.3105 null] +>> endobj +1010 0 obj << +/D [994 0 R /XYZ 129.5143 383.232 null] +>> endobj +1011 0 obj << +/D [994 0 R /XYZ 129.5143 383.232 null] +>> endobj +1012 0 obj << +/D [994 0 R /XYZ 71.731 381.7924 null] +>> endobj +1013 0 obj << +/D [994 0 R /XYZ 71.731 381.7924 null] +>> endobj +1014 0 obj << +/D [994 0 R /XYZ 139.477 365.2992 null] +>> endobj +1015 0 obj << +/D [994 0 R /XYZ 139.477 365.2992 null] +>> endobj +1016 0 obj << +/D [994 0 R /XYZ 76.7123 347.3665 null] +>> endobj +1017 0 obj << +/D [994 0 R /XYZ 129.5143 329.4337 null] +>> endobj +1018 0 obj << +/D [994 0 R /XYZ 129.5143 329.4337 null] +>> endobj +1019 0 obj << +/D [994 0 R /XYZ 71.731 328.053 null] +>> endobj +1020 0 obj << +/D [994 0 R /XYZ 71.731 328.053 null] +>> endobj +1021 0 obj << +/D [994 0 R /XYZ 139.477 311.501 null] +>> endobj +1022 0 obj << +/D [994 0 R /XYZ 139.477 311.501 null] +>> endobj +1023 0 obj << +/D [994 0 R /XYZ 71.731 309.3442 null] +>> endobj +1024 0 obj << +/D [994 0 R /XYZ 139.477 293.5682 null] +>> endobj +1025 0 obj << +/D [994 0 R /XYZ 139.477 293.5682 null] +>> endobj +1026 0 obj << +/D [994 0 R /XYZ 71.731 255.7102 null] +>> endobj +1027 0 obj << +/D [994 0 R /XYZ 71.731 242.6592 null] +>> endobj +1028 0 obj << +/D [994 0 R /XYZ 71.731 241.4139 null] +>> endobj +1029 0 obj << +/D [994 0 R /XYZ 129.5143 222.3354 null] +>> endobj +630 0 obj << +/D [994 0 R /XYZ 71.731 215.1972 null] +>> endobj +38 0 obj << +/D [994 0 R /XYZ 334.7464 172.0997 null] +>> endobj +1030 0 obj << +/D [994 0 R /XYZ 71.731 148.611 null] +>> endobj +1031 0 obj << +/D [994 0 R /XYZ 161.0655 139.223 null] +>> endobj +1032 0 obj << +/D [994 0 R /XYZ 71.731 127.1035 null] +>> endobj +993 0 obj << +/Font << /F21 514 0 R /F29 532 0 R /F38 925 0 R /F30 622 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1035 0 obj << +/Length 924 +/Filter /FlateDecode +>> +stream +xÚÍW]o›0}ï¯à±‘Š‡mlCßÒ}©Ó&U]ÞÖ)¢Ám‘ˆÀ¨Ú¿ßu0Äó!íeê„ûŽÏµ/Ø à{#AáBbD8#Þîpx¯ð¯¯WØ@|ƒñmÐÝæêÃx1Š9áÞæÅ£1GL„ž E GÞ&ýuýñ-9*Y®|‚k‚šëÃ>É¥úž<7?×÷ÍÍ©ÞŠ´ZýÞ|»ú¼éø(Ž€dRd‡Ê$±%ã1†…'‚ѐŠ“ÎO²Ú•ÙQeE~«ùOƒ"ÄC=È ÷)¼"‡ÿè!뤞t'¹¹¦i)+óPý9JsW˜ë›yPå.{ +"ÓÞ@¤™ám|Š‹0?Ñ<ܛ ɟæ¦È÷æ®>¦‰’½9¤A/ifì/V„]¿­U¦ä™sÄ©h¥ªËÜLƒ›Kff«êÝH^êýMóàe…ºÞ«–øÊ÷¬’¨sñl½ßÙ ¼q~½ß7ÂZ3‹½¬¦`ÄqÔ,B’²Üh9fK9V˜]'erÍ†Ë\†œÅÎÀu(߆µƒ0Š÷×Á´„'B؀—H$&NÞËëYG;j¨ƒF–}ʂáöu$µzsØFBh ¹5k¯Êz§n.jV—¹Êv‰®Y—rø‚FB QØSœÆ¶(߆Åz3²_¨ƒ ‹0vòŽێêèKc +ї±_šýÌá.ƒr a«¼ô7Ë_[¶šéz{J]ÉÑô†#TõtzmØDz;Ølz]¼ Ò;ÐáNoO‡Ùô¶z³Ýfé¶(·9TµÃrL8"p*ô=Ïreö­Ò^„ñ܆P4ŒçrkÁ¦rÛÂæsëà]’[‡˒6·¶ p¤ û4ËRËÓéUŽûnã€ÌÖ·›ò©…Íûäà]â“C‡Ã'[F¿ZVÕ$D(Ÿ«I6Q“l¶&]¼ jr Ã]“=mMfã;ß° +]F^&Íó9ŒÆàAï07ýÊø)N¡k‹)”þŒçlÊó6﹃w‰çö>Öznë8;8Ú°™Å}ÌN è3Yp£5 Bt£."XÝÞ¥wE¡~*Ýi4„3⢿* Uè:XÚÆÁºŸINŸèÞ¼–ÞÕá^Úáý[?o8å©/5?ŠÔ({¡íarÿóÚN¦ùŽ #ñ䧞…~é1à19Ϥ5ðÑÏ6ß_ ÛV8endstream +endobj +1034 0 obj << +/Type /Page +/Contents 1035 0 R +/Resources 1033 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +1036 0 obj << +/D [1034 0 R /XYZ 71.731 729.2652 null] +>> endobj +1037 0 obj << +/D [1034 0 R /XYZ 71.731 741.2204 null] +>> endobj +1038 0 obj << +/D [1034 0 R /XYZ 71.731 718.3063 null] +>> endobj +1039 0 obj << +/D [1034 0 R /XYZ 168.8063 708.3437 null] +>> endobj +1040 0 obj << +/D [1034 0 R /XYZ 71.731 681.2803 null] +>> endobj +1041 0 obj << +/D [1034 0 R /XYZ 71.731 649.9144 null] +>> endobj +1042 0 obj << +/D [1034 0 R /XYZ 71.731 633.2768 null] +>> endobj +1043 0 obj << +/D [1034 0 R /XYZ 71.731 602.3408 null] +>> endobj +1044 0 obj << +/D [1034 0 R /XYZ 181.5683 590.6849 null] +>> endobj +1045 0 obj << +/D [1034 0 R /XYZ 71.731 580.6227 null] +>> endobj +1046 0 obj << +/D [1034 0 R /XYZ 71.731 547.1996 null] +>> endobj +1047 0 obj << +/D [1034 0 R /XYZ 71.731 536.0897 null] +>> endobj +1048 0 obj << +/D [1034 0 R /XYZ 71.731 534.8444 null] +>> endobj +1049 0 obj << +/D [1034 0 R /XYZ 129.5143 515.7659 null] +>> endobj +1050 0 obj << +/D [1034 0 R /XYZ 129.5143 515.7659 null] +>> endobj +1051 0 obj << +/D [1034 0 R /XYZ 71.731 514.3263 null] +>> endobj +1052 0 obj << +/D [1034 0 R /XYZ 71.731 514.3263 null] +>> endobj +1053 0 obj << +/D [1034 0 R /XYZ 139.477 497.8331 null] +>> endobj +1054 0 obj << +/D [1034 0 R /XYZ 139.477 497.8331 null] +>> endobj +1055 0 obj << +/D [1034 0 R /XYZ 76.7123 479.9004 null] +>> endobj +1056 0 obj << +/D [1034 0 R /XYZ 129.5143 461.9676 null] +>> endobj +1057 0 obj << +/D [1034 0 R /XYZ 129.5143 461.9676 null] +>> endobj +1058 0 obj << +/D [1034 0 R /XYZ 71.731 459.8108 null] +>> endobj +1059 0 obj << +/D [1034 0 R /XYZ 71.731 459.8108 null] +>> endobj +1060 0 obj << +/D [1034 0 R /XYZ 139.477 444.0349 null] +>> endobj +1061 0 obj << +/D [1034 0 R /XYZ 71.731 441.878 null] +>> endobj +1062 0 obj << +/D [1034 0 R /XYZ 139.477 426.1021 null] +>> endobj +1063 0 obj << +/D [1034 0 R /XYZ 76.7123 408.1694 null] +>> endobj +1064 0 obj << +/D [1034 0 R /XYZ 129.5143 390.2366 null] +>> endobj +1065 0 obj << +/D [1034 0 R /XYZ 129.5143 390.2366 null] +>> endobj +1066 0 obj << +/D [1034 0 R /XYZ 71.731 368.8718 null] +>> endobj +1067 0 obj << +/D [1034 0 R /XYZ 71.731 357.2604 null] +>> endobj +1068 0 obj << +/D [1034 0 R /XYZ 71.731 356.015 null] +>> endobj +1069 0 obj << +/D [1034 0 R /XYZ 129.5143 336.9365 null] +>> endobj +631 0 obj << +/D [1034 0 R /XYZ 71.731 330.5156 null] +>> endobj +42 0 obj << +/D [1034 0 R /XYZ 219.8168 286.7009 null] +>> endobj +1070 0 obj << +/D [1034 0 R /XYZ 71.731 266.5605 null] +>> endobj +1071 0 obj << +/D [1034 0 R /XYZ 161.0655 253.8241 null] +>> endobj +1072 0 obj << +/D [1034 0 R /XYZ 71.731 241.7047 null] +>> endobj +1073 0 obj << +/D [1034 0 R /XYZ 71.731 210.675 null] +>> endobj +1074 0 obj << +/D [1034 0 R /XYZ 168.8063 199.3285 null] +>> endobj +1075 0 obj << +/D [1034 0 R /XYZ 71.731 172.2651 null] +>> endobj +1076 0 obj << +/D [1034 0 R /XYZ 71.731 157.6947 null] +>> endobj +1077 0 obj << +/D [1034 0 R /XYZ 71.731 124.9071 null] +>> endobj +1078 0 obj << +/D [1034 0 R /XYZ 181.5683 113.2513 null] +>> endobj +1033 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1081 0 obj << +/Length 1140 +/Filter /FlateDecode +>> +stream +xÚÍX]£6}Ÿ_Ác"5®mðóPivÛ­ZµÒh7oÕŠ‚3A"Ñtÿ}¯Á€æãa«­"Å$¸Ççž{m †ñA‡†ˆrF½øò€½W8õë1ƒÁlлãÏ|ì…(ä”{Ǔç‡1x§H2"½cò×îý9ºÖªÜ(Ã;ŠÚñ9‹rUÿýÝþ|zþ­=øSÕç"©öŸ¿?ürìã3_ PBE’=jJ“†žš<Ð4 œe$ð=%ò_4<£ä’æ:pƒ&u0‡=)Á[ðóž°]TFS«Ç| Œ3†pàs'ßu°a_˜‹À¤á;¹›¦ðB)›Ä¥&D¨3îxxtWMyøҥۏèVŸ²ÑaACÛäVuy‹ëF)×׫¼Nã¨N‹ÜFÞJ5`GrM–na;ÔÁ† Âíå» u°Ya!ù˜¡3î¼°ÝUS÷Âú! +„¸§ñº´åàP—qĨ´±¾iþÚéëõÒÞ®9®‹v¼UjÞ½˜ 0ͽlɽlݽŽ¸[Ü;æ1ã^›G%¼Ù½ƒºïŠ¢îþŽêæÐ |˜ô¸S|Tàã|¡E°´ +fZÚ ² [¹‡­ŠìŠ»AdA·^ä;iÞU=i‡ôdĻűªªÓ-39~QšŒ˜@BúPÆ #곶ßPèEDÈÝS²'x—¼/òӇ4s¥HHŠÅ¨w—E]Ô_¯ê±¿bpI×ì)AœÈ°­ÄdˆÑÐ~Á ë¶e&ÃÉ//ÓL5ƒÊ’ + dëbò³ªâ2½ê:]¢äÃâÊiO©2í³rµ§l÷f~‰ê©iF¯·Òj-U³?åz)û:œÑìMv®*N›¿LÏHóù 6¥êÛJbä) •oieÎ$ê¤ÓݲںHÖ~Gœñ¶4õ-Pž/¸]R¦•C›aš Yû©=ÄMzf¬hhYöÓ@[óú”eEéÓïc‘©j«ëþ“ý…†Ë@¬4¶ÐlzØj³qÅÝÐl&<ÜýŽÇ÷ُPÐD0®ìGlØÂ~¤‡­îG\q7ìG&<œû‘;ÿƒý‘>’8.»×†-¸·‡­º×wƒ{'<Üî½ãÑ4®¬4ðÕ´Õ©ÖRÂ: ¤Ë˳ö$œ¡žVìiÃìÙÃVí銻ÁžN{ÞÑh4+ÞrxÒtۓ¾`Ïøܶê\¯dXÌ¿í]ÝÒXãµÊ·aKÒv°uiq·H;æá–Ö¦q-ª:Ía£›e_⋫üÁÁ,àlAßOg•eÝÚ|¹Dù¨ì•^ÀþÑ_*¾ÕfINý‹n8Ÿ#,%]K„[JD[O„#î–DŒy¸aÓPeY”3)`ðPÃÿÖ)è¶G‘½Mlx˜úˆã[YÍç„PD ÖrbÁ–rÒÁÖs∻%'cîœØ4®¥Z® !á°MûƉ¹–i—ƒ7_#æõµ$<\|Ãga¦/ø(Å}8îPzJböm#Þ¿e„®Ùendstream +endobj +1080 0 obj << +/Type /Page +/Contents 1081 0 R +/Resources 1079 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 971 0 R +>> endobj +1082 0 obj << +/D [1080 0 R /XYZ 71.731 729.2652 null] +>> endobj +1083 0 obj << +/D [1080 0 R /XYZ 71.731 718.3063 null] +>> endobj +1084 0 obj << +/D [1080 0 R /XYZ 71.731 675.3674 null] +>> endobj +1085 0 obj << +/D [1080 0 R /XYZ 71.731 674.1221 null] +>> endobj +1086 0 obj << +/D [1080 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1087 0 obj << +/D [1080 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1088 0 obj << +/D [1080 0 R /XYZ 71.731 653.604 null] +>> endobj +1089 0 obj << +/D [1080 0 R /XYZ 71.731 653.604 null] +>> endobj +1090 0 obj << +/D [1080 0 R /XYZ 139.477 637.1108 null] +>> endobj +1091 0 obj << +/D [1080 0 R /XYZ 139.477 637.1108 null] +>> endobj +1092 0 obj << +/D [1080 0 R /XYZ 76.7123 619.1781 null] +>> endobj +1093 0 obj << +/D [1080 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1094 0 obj << +/D [1080 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1095 0 obj << +/D [1080 0 R /XYZ 71.731 579.1632 null] +>> endobj +1096 0 obj << +/D [1080 0 R /XYZ 71.731 568.2691 null] +>> endobj +1097 0 obj << +/D [1080 0 R /XYZ 71.731 567.0237 null] +>> endobj +1098 0 obj << +/D [1080 0 R /XYZ 129.5143 547.9452 null] +>> endobj +632 0 obj << +/D [1080 0 R /XYZ 71.731 541.5243 null] +>> endobj +46 0 obj << +/D [1080 0 R /XYZ 207.3873 497.7096 null] +>> endobj +1099 0 obj << +/D [1080 0 R /XYZ 71.731 477.5692 null] +>> endobj +1100 0 obj << +/D [1080 0 R /XYZ 161.0655 464.8329 null] +>> endobj +1101 0 obj << +/D [1080 0 R /XYZ 71.731 452.7134 null] +>> endobj +1102 0 obj << +/D [1080 0 R /XYZ 71.731 421.6837 null] +>> endobj +1103 0 obj << +/D [1080 0 R /XYZ 168.8063 410.3372 null] +>> endobj +1104 0 obj << +/D [1080 0 R /XYZ 71.731 383.2738 null] +>> endobj +1105 0 obj << +/D [1080 0 R /XYZ 71.731 357.0471 null] +>> endobj +1106 0 obj << +/D [1080 0 R /XYZ 71.731 323.9503 null] +>> endobj +1107 0 obj << +/D [1080 0 R /XYZ 181.5683 312.6037 null] +>> endobj +1108 0 obj << +/D [1080 0 R /XYZ 71.731 302.5415 null] +>> endobj +1109 0 obj << +/D [1080 0 R /XYZ 71.731 270.9699 null] +>> endobj +1110 0 obj << +/D [1080 0 R /XYZ 71.731 258.0085 null] +>> endobj +1111 0 obj << +/D [1080 0 R /XYZ 71.731 256.7632 null] +>> endobj +1112 0 obj << +/D [1080 0 R /XYZ 129.5143 237.6847 null] +>> endobj +1113 0 obj << +/D [1080 0 R /XYZ 129.5143 237.6847 null] +>> endobj +1114 0 obj << +/D [1080 0 R /XYZ 71.731 236.2451 null] +>> endobj +1115 0 obj << +/D [1080 0 R /XYZ 71.731 236.2451 null] +>> endobj +1116 0 obj << +/D [1080 0 R /XYZ 139.477 219.7519 null] +>> endobj +1117 0 obj << +/D [1080 0 R /XYZ 139.477 219.7519 null] +>> endobj +1118 0 obj << +/D [1080 0 R /XYZ 76.7123 201.8192 null] +>> endobj +1119 0 obj << +/D [1080 0 R /XYZ 129.5143 183.8864 null] +>> endobj +1120 0 obj << +/D [1080 0 R /XYZ 129.5143 183.8864 null] +>> endobj +1121 0 obj << +/D [1080 0 R /XYZ 71.731 182.7074 null] +>> endobj +1122 0 obj << +/D [1080 0 R /XYZ 71.731 182.7074 null] +>> endobj +1123 0 obj << +/D [1080 0 R /XYZ 139.477 165.9537 null] +>> endobj +1124 0 obj << +/D [1080 0 R /XYZ 139.477 165.9537 null] +>> endobj +1125 0 obj << +/D [1080 0 R /XYZ 71.731 163.7968 null] +>> endobj +1126 0 obj << +/D [1080 0 R /XYZ 139.477 148.0209 null] +>> endobj +1127 0 obj << +/D [1080 0 R /XYZ 139.477 148.0209 null] +>> endobj +1128 0 obj << +/D [1080 0 R /XYZ 71.731 145.8641 null] +>> endobj +1129 0 obj << +/D [1080 0 R /XYZ 139.477 130.0882 null] +>> endobj +1130 0 obj << +/D [1080 0 R /XYZ 139.477 130.0882 null] +>> endobj +1131 0 obj << +/D [1080 0 R /XYZ 71.731 127.9313 null] +>> endobj +1132 0 obj << +/D [1080 0 R /XYZ 139.477 112.1554 null] +>> endobj +1133 0 obj << +/D [1080 0 R /XYZ 139.477 112.1554 null] +>> endobj +1134 0 obj << +/D [1080 0 R /XYZ 71.731 109.9986 null] +>> endobj +1079 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1137 0 obj << +/Length 1450 +/Filter /FlateDecode +>> +stream +xڍYю£6}Ÿ¯àq"m¼¶Á6ìC¥é¶»Úª]VóÖ­"œ•@d £ùûÚ`ŒA#M<ÌÁ÷øœë{ A”?(`°P~à`Jp]`p’ÿúú€4d¯1{ôëËÃÇ/! PLƒ—c&,Ä &(^ò¿?ŸÓkËÅn |Ä`ø|.ӊ·¦¯ÃŸOÏ߆Á_¼=×y³ûç叇ß_Æø$d ‰e/ÉÆ ¢qì1 FĉBr +‚"‰bF!ƒ“€¤*3âF˜ZÍOŒÉ”’Ë…8J{Bwúyãaîšó㠖¢Ò¨ç& bìžFΛVÑè9ß À€0Idú4hÚ´¢¨N´Ò¯M]v-þº¦íy½¹ÐBˆK=nÎuWæÃøU_+ª¦M˒ç3Œb4 B0YÑ߆yôa«ú»ânÐÆéÿâTՂ²K~àBÔ¢q˜‘„ ‰½7ãµ®KžVڍoƒ”sÝÓj‡ÈãûÛÉñûpï0yüO]ç•vâ8¢„¢2 ë,ëD³ìÃrQ1^sȂù2°u‡q·84åávȦÁ«ôUçèėYâóås])7NHÛ¢®æþV>k‹›-Ër“ˆDkr[0ŸÜ¶.·#<ÜrÛ4ŽEÉW..EÓHÅ\û!Ž¡,ö§ì|©óŸ@$!]¢îçtËR@fkòZ0Ÿ¼¶.¯#îy§<ÜòÚ4šºwˆF€Ñ„zDýÁËô.I'•ß¤w{æãVhõ<\ ÷o“ÈLý1"¯U¸·ª¬ÓÜ×&P (KVۄóÙf`ë¶9ân±mÊÃm›M#-ßÒ÷æÐ]ó´u¹§ +–O)z*UЍÀT¶å—«6©­ïÚòܞå¾ÑUÙ9­N>‹ ,b«}‚ù,2°u‹q·X4åá¶È¦Ñ®“¨»«ÃBA†Ô[²Nâ:)Y:û宑3Êã˜Ä’ † éçúÁÛNTͧ™HjE ˆÍ©¼AímØMù„ÁAùÙl‹Êc,O—;ã.+oîrò¸é8fÀ¢jµŠßû}ӒÖÕñ0$ð¡ÈM>øË0„7¡M7]–ñ¦9v¥öP®‡ùÐÛ¾' °8 {pHh¢žEXüø”«Í•Ëžü"“áeK ¿×9ÿ*vX™1c( P:ŒUúYÔmݾ_ù§ñŽ[öé{÷ɲõá)w†U!Çe§]{þàRF_¬ä-js÷9,/jq¨Ò ïešß6ñßx“‰âªÎ:>ê²#ŠGꦍäüg&S¨ÆFÓ\yV(Ï­¥ô£~1úYñÛqrß69‘•‚§¹>2—Eõ¯2טQ˜’Vªý(¡z·ôKŶNÚ&¢é‰¢ßÓ<ã4²ƒ‡ŒÚ~@.æ¯sìË}W¶_KÂâ­h8ØêèSYeÈ,ý‡l*ÍÖ¼LóKQm õ¬²/2åäc¾§¢a9ÀDVdE³ažŠ6ÂV+š+6ãqßKL!»ã¡öêÂc9š5‘.3åo|ý¡îçU[d֐X~ºÀPÖ<¶PžmP«ÚtCƒž’pög›Ã“Tdx)änÏ4b‘ïu‡CÐË0Ý]A辘·ˆBVòֆyòv„­æ­+ñpç폾±ô'¡Â¥3e ‚l’Á·î½þ´œ+úJ/–e–-•`¼Vl˜Of[—Ùw‹ÌS 2ێ¸[rðphdÓ¸«N¡LêÙDõKþ(1¢‰÷{ 3ÿ€„!€…ãLŠR¼øNßïÖ¢Œendstream +endobj +1136 0 obj << +/Type /Page +/Contents 1137 0 R +/Resources 1135 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1138 0 obj << +/D [1136 0 R /XYZ 71.731 729.2652 null] +>> endobj +1139 0 obj << +/D [1136 0 R /XYZ 71.731 741.2204 null] +>> endobj +1140 0 obj << +/D [1136 0 R /XYZ 139.477 708.3437 null] +>> endobj +1141 0 obj << +/D [1136 0 R /XYZ 139.477 708.3437 null] +>> endobj +1142 0 obj << +/D [1136 0 R /XYZ 71.731 706.1869 null] +>> endobj +1143 0 obj << +/D [1136 0 R /XYZ 139.477 690.4109 null] +>> endobj +1144 0 obj << +/D [1136 0 R /XYZ 139.477 690.4109 null] +>> endobj +1145 0 obj << +/D [1136 0 R /XYZ 71.731 688.2541 null] +>> endobj +1146 0 obj << +/D [1136 0 R /XYZ 139.477 672.4782 null] +>> endobj +1147 0 obj << +/D [1136 0 R /XYZ 139.477 672.4782 null] +>> endobj +1148 0 obj << +/D [1136 0 R /XYZ 71.731 670.3214 null] +>> endobj +1149 0 obj << +/D [1136 0 R /XYZ 139.477 654.5454 null] +>> endobj +1150 0 obj << +/D [1136 0 R /XYZ 139.477 654.5454 null] +>> endobj +1151 0 obj << +/D [1136 0 R /XYZ 71.731 652.3886 null] +>> endobj +1152 0 obj << +/D [1136 0 R /XYZ 139.477 636.6127 null] +>> endobj +1153 0 obj << +/D [1136 0 R /XYZ 139.477 636.6127 null] +>> endobj +1154 0 obj << +/D [1136 0 R /XYZ 71.731 634.4559 null] +>> endobj +1155 0 obj << +/D [1136 0 R /XYZ 139.477 618.6799 null] +>> endobj +1156 0 obj << +/D [1136 0 R /XYZ 139.477 618.6799 null] +>> endobj +1157 0 obj << +/D [1136 0 R /XYZ 71.731 616.5231 null] +>> endobj +1158 0 obj << +/D [1136 0 R /XYZ 139.477 600.7472 null] +>> endobj +1159 0 obj << +/D [1136 0 R /XYZ 139.477 600.7472 null] +>> endobj +1160 0 obj << +/D [1136 0 R /XYZ 71.731 562.8892 null] +>> endobj +1161 0 obj << +/D [1136 0 R /XYZ 71.731 549.8382 null] +>> endobj +1162 0 obj << +/D [1136 0 R /XYZ 71.731 548.5928 null] +>> endobj +1163 0 obj << +/D [1136 0 R /XYZ 129.5143 529.5143 null] +>> endobj +633 0 obj << +/D [1136 0 R /XYZ 71.731 522.7498 null] +>> endobj +50 0 obj << +/D [1136 0 R /XYZ 321.3874 479.2787 null] +>> endobj +1164 0 obj << +/D [1136 0 R /XYZ 71.731 455.7899 null] +>> endobj +1165 0 obj << +/D [1136 0 R /XYZ 161.0655 446.402 null] +>> endobj +1166 0 obj << +/D [1136 0 R /XYZ 71.731 434.2825 null] +>> endobj +1167 0 obj << +/D [1136 0 R /XYZ 71.731 402.9166 null] +>> endobj +1168 0 obj << +/D [1136 0 R /XYZ 168.8063 391.9063 null] +>> endobj +1169 0 obj << +/D [1136 0 R /XYZ 71.731 364.8429 null] +>> endobj +1170 0 obj << +/D [1136 0 R /XYZ 71.731 337.4102 null] +>> endobj +1171 0 obj << +/D [1136 0 R /XYZ 71.731 305.8287 null] +>> endobj +1172 0 obj << +/D [1136 0 R /XYZ 181.5683 294.1728 null] +>> endobj +1173 0 obj << +/D [1136 0 R /XYZ 71.731 284.1107 null] +>> endobj +1174 0 obj << +/D [1136 0 R /XYZ 71.731 252.539 null] +>> endobj +1175 0 obj << +/D [1136 0 R /XYZ 71.731 239.5777 null] +>> endobj +1176 0 obj << +/D [1136 0 R /XYZ 71.731 238.3323 null] +>> endobj +1177 0 obj << +/D [1136 0 R /XYZ 129.5143 219.2538 null] +>> endobj +1178 0 obj << +/D [1136 0 R /XYZ 129.5143 219.2538 null] +>> endobj +1179 0 obj << +/D [1136 0 R /XYZ 71.731 217.8142 null] +>> endobj +1180 0 obj << +/D [1136 0 R /XYZ 71.731 217.8142 null] +>> endobj +1181 0 obj << +/D [1136 0 R /XYZ 139.477 201.321 null] +>> endobj +1182 0 obj << +/D [1136 0 R /XYZ 139.477 201.321 null] +>> endobj +1183 0 obj << +/D [1136 0 R /XYZ 76.7123 183.3883 null] +>> endobj +1184 0 obj << +/D [1136 0 R /XYZ 129.5143 165.4555 null] +>> endobj +1185 0 obj << +/D [1136 0 R /XYZ 129.5143 165.4555 null] +>> endobj +1186 0 obj << +/D [1136 0 R /XYZ 71.731 163.2987 null] +>> endobj +1187 0 obj << +/D [1136 0 R /XYZ 129.5143 147.5228 null] +>> endobj +1188 0 obj << +/D [1136 0 R /XYZ 129.5143 147.5228 null] +>> endobj +1189 0 obj << +/D [1136 0 R /XYZ 71.731 145.3659 null] +>> endobj +1190 0 obj << +/D [1136 0 R /XYZ 71.731 145.3659 null] +>> endobj +1191 0 obj << +/D [1136 0 R /XYZ 139.477 129.59 null] +>> endobj +1192 0 obj << +/D [1136 0 R /XYZ 71.731 127.4332 null] +>> endobj +1193 0 obj << +/D [1136 0 R /XYZ 139.477 111.6573 null] +>> endobj +1135 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1197 0 obj << +/Length 975 +/Filter /FlateDecode +>> +stream +xڍW[›8}Ÿ_Ác"5®/؆yËÎvªV»«Q•·ÎjÄg‚ÊÀԀªþûý †˜àš'™cŸããïb“à $A’Á@cD§Áñí¯ð¯ÏwÄBv³sAî>>2Ä(T‡SÀb¸ É(Š8‰‚Cú}ópNÞk¥·;Êñ†¢n|ʓBÕ%ÿu_÷O_º«ú\¦ÕößÃ×»O‡Ÿ3‰âHfE¨©L;2 ‰çDBr +ÙÊü¦êFÕý5õÌ9Â!^êµsa=5Ȓ˜Œ©{˜á~¦”Ox)E,$ÔË{=^tô³¼: À NB6֑õ‡îH7d§n¬šãQUթɍLX ôID Íb;.‘ŒƒQÆ»Å(æ°e´Ù§[‚7éCYœ³\¶ޔÿ”©²‹¹ÂB‰"ŠÁGBҞ͓.ë²þý®î‡Ì-»»£ ·ø}ê#kwòŒ9Nšúl÷yØË3Æ4W/Yj, ß^Jýr.«ºHÞL#µ»žÜUû§ªŽ:{¯³²˜ÓË WWw2è2ª^˜uzíFg÷¹.íx¶?TïꘄJ/»°Ùöåt.?²ž7×*Iw_ò¬øaŽ¬_jB6#oð°•Ö¥nóÒ .X»çDÛÅt›y*EJ Á¤pÓr!*-éɈNš¼¶øë_Y¥ÐÚ³Ûçy¹¥|ó«ßú·2WÕbØEÝ1&é[V¬¥zÚ&@pAuœ©;, Mv‘…ºãÂfêÎ[¬;>Þug¢ƒEŽkCÝé0 鱍†¹·G^ëæØ©¡k˜ùª¨³£²ÑjºÁ^Ð¥0óÛ£v.ìb,1íp´¡vÓX8|LÃØË{ÛØ~ÖTÇØX£PʱŒ=øÒuT»²,„f}íoV¼öþzl}ë–•…¦R7£—Æzr-D¯ ›‰Þ¶½>ÞÑ;ÑáÞ‘Ž¶‡œ²¶ƒx|…X^Åñ¥Ó>,Uú,5gÐVv}Ûfɾq-r\¾ æL¶¨e§¤k,¾qÃaG„§{|&* +–lb´íڍð›EÂ}œX* +.l¦( °Å¢àã]Q|:KlQɸ„ÞåV4cÃfàzM"Á—¬q`sÖô°ek<¼k¬ñèðXãÊU¿Ç&Ïí}èg“䣻•†À ËRÞ]#‡ëÞDpÓe!g]ØLҰŬõñ®H[ŸÏ{b¤cå{•iša„""âÙ·¨ƒ™>E9ƒú V2zâ›ïJßÿ¡¯téendstream +endobj +1196 0 obj << +/Type /Page +/Contents 1197 0 R +/Resources 1195 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1198 0 obj << +/D [1196 0 R /XYZ 71.731 729.2652 null] +>> endobj +1199 0 obj << +/D [1196 0 R /XYZ 71.731 741.2204 null] +>> endobj +1200 0 obj << +/D [1196 0 R /XYZ 71.731 675.3674 null] +>> endobj +1201 0 obj << +/D [1196 0 R /XYZ 71.731 674.1221 null] +>> endobj +1202 0 obj << +/D [1196 0 R /XYZ 129.5143 655.0436 null] +>> endobj +634 0 obj << +/D [1196 0 R /XYZ 71.731 648.6227 null] +>> endobj +54 0 obj << +/D [1196 0 R /XYZ 270.0858 604.8079 null] +>> endobj +1203 0 obj << +/D [1196 0 R /XYZ 71.731 584.6676 null] +>> endobj +1204 0 obj << +/D [1196 0 R /XYZ 161.0655 571.9312 null] +>> endobj +1205 0 obj << +/D [1196 0 R /XYZ 71.731 559.8118 null] +>> endobj +1206 0 obj << +/D [1196 0 R /XYZ 71.731 528.7821 null] +>> endobj +1207 0 obj << +/D [1196 0 R /XYZ 168.8063 517.4356 null] +>> endobj +1208 0 obj << +/D [1196 0 R /XYZ 71.731 490.3722 null] +>> endobj +1209 0 obj << +/D [1196 0 R /XYZ 71.731 464.1455 null] +>> endobj +1210 0 obj << +/D [1196 0 R /XYZ 71.731 431.3579 null] +>> endobj +1211 0 obj << +/D [1196 0 R /XYZ 181.5683 419.7021 null] +>> endobj +1212 0 obj << +/D [1196 0 R /XYZ 71.731 409.6399 null] +>> endobj +1213 0 obj << +/D [1196 0 R /XYZ 71.731 378.0683 null] +>> endobj +1214 0 obj << +/D [1196 0 R /XYZ 71.731 365.1069 null] +>> endobj +1215 0 obj << +/D [1196 0 R /XYZ 71.731 363.8616 null] +>> endobj +1216 0 obj << +/D [1196 0 R /XYZ 129.5143 344.7831 null] +>> endobj +1217 0 obj << +/D [1196 0 R /XYZ 129.5143 344.7831 null] +>> endobj +1218 0 obj << +/D [1196 0 R /XYZ 71.731 343.3435 null] +>> endobj +1219 0 obj << +/D [1196 0 R /XYZ 71.731 343.3435 null] +>> endobj +1220 0 obj << +/D [1196 0 R /XYZ 139.477 326.8503 null] +>> endobj +1221 0 obj << +/D [1196 0 R /XYZ 139.477 326.8503 null] +>> endobj +1222 0 obj << +/D [1196 0 R /XYZ 76.7123 308.9175 null] +>> endobj +1223 0 obj << +/D [1196 0 R /XYZ 129.5143 290.9848 null] +>> endobj +1224 0 obj << +/D [1196 0 R /XYZ 129.5143 290.9848 null] +>> endobj +1225 0 obj << +/D [1196 0 R /XYZ 71.731 288.828 null] +>> endobj +1226 0 obj << +/D [1196 0 R /XYZ 129.5143 273.052 null] +>> endobj +1227 0 obj << +/D [1196 0 R /XYZ 129.5143 273.052 null] +>> endobj +1228 0 obj << +/D [1196 0 R /XYZ 71.731 270.8952 null] +>> endobj +1229 0 obj << +/D [1196 0 R /XYZ 71.731 270.8952 null] +>> endobj +1230 0 obj << +/D [1196 0 R /XYZ 139.477 255.1193 null] +>> endobj +1231 0 obj << +/D [1196 0 R /XYZ 71.731 253.6797 null] +>> endobj +1232 0 obj << +/D [1196 0 R /XYZ 139.477 237.1865 null] +>> endobj +1233 0 obj << +/D [1196 0 R /XYZ 71.731 199.3285 null] +>> endobj +1234 0 obj << +/D [1196 0 R /XYZ 71.731 186.2775 null] +>> endobj +1235 0 obj << +/D [1196 0 R /XYZ 71.731 185.0322 null] +>> endobj +1236 0 obj << +/D [1196 0 R /XYZ 129.5143 165.9537 null] +>> endobj +635 0 obj << +/D [1196 0 R /XYZ 71.731 159.5328 null] +>> endobj +1195 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1239 0 obj << +/Length 807 +/Filter /FlateDecode +>> +stream +xÚÝVێ›0}߯à1‘×lã}K¯êMŠVyëV N‚J ÓÕþ}mlˆ äòRUª"Å!ÌÌ9s<ž1 + þ €#À‰^°˜Q¬÷w0ØêWî3 Mè½^ݽzO` €`˜«M@”G'ÄÅÁ*ý6{³KJVóS8ÃÀ®Ë<)¤ú’ü´‹åGûã«T»2­çßWŸîÞ­z|J8±¹H²·ÓÄ(@`D#óË2€-M ¸áÆãÙ"#8K?ϝIóõ²š38{9HCKÇ^Ê1†<Mʜñ6Ö²*U©´ÃCïkւ;ß#ÀPlÁ©†ÃG¸Øµ’—·²^WÙAeeq‰ Ñ;ÇpϦ¶`‰Ã”†Ü³}øeÔ±Dí&Q`Bë]ŒpÖÆy”ª© + +Ù%ÛصnÖkYכ&wymLؤɕ³/ÕNVÏYmCߒé"Ï˖§LmˆÇ2—õ­[¤û¬¸jiÒO*½º²-„_® @)âAD9à‘ “åÚ[…¾™-WèRæãh†ÂÆt„‹1 “¸§ë‘Gç5æAbO5¤Eò0¥9!Ž4ÆäÁm¹ªšµº?9ñÆ_*['¦D}˦’ã; +D€1:-lgúfGa‘9üƒ„:³³Âê͇8“¸ç…í¼Æ<†Âê·çC ­‹í†êR}Ê"ÝhOõ͊m§ï„¬{ÎÚÒ®M-ÏW/$@Pt­xV—j×Y]/Ý1è-•{BâLáz$L½¹nºzmúØýÚ期v +×Ï·B!`Š+*ûfdîÍ®ê<…{ƒÐS<ŽêõJxdEwêÏ·ƒ)š6}Œu0L(ss:Îé¯:Bb~mça;™þân±¶Óƒyoßýx‚Ë<­ÿéÞûD•ÜòDIw÷Z^ùþ6NIÞH¬>ÈuÖ¦àEVL§ç°+Ù÷‘ôþdrÛÇTžŽöÓtsðϙ»bF±éèââÚ³_©)ŽuC¢d<{AžüÙ7ʘendstream +endobj +1238 0 obj << +/Type /Page +/Contents 1239 0 R +/Resources 1237 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1240 0 obj << +/D [1238 0 R /XYZ 71.731 729.2652 null] +>> endobj +58 0 obj << +/D [1238 0 R /XYZ 208.7305 706.1179 null] +>> endobj +1241 0 obj << +/D [1238 0 R /XYZ 71.731 682.6291 null] +>> endobj +1242 0 obj << +/D [1238 0 R /XYZ 161.0655 673.2412 null] +>> endobj +1243 0 obj << +/D [1238 0 R /XYZ 71.731 661.1217 null] +>> endobj +1244 0 obj << +/D [1238 0 R /XYZ 71.731 575.2602 null] +>> endobj +1245 0 obj << +/D [1238 0 R /XYZ 71.731 544.3242 null] +>> endobj +1246 0 obj << +/D [1238 0 R /XYZ 181.5683 532.6683 null] +>> endobj +1247 0 obj << +/D [1238 0 R /XYZ 71.731 522.6062 null] +>> endobj +1248 0 obj << +/D [1238 0 R /XYZ 71.731 491.0346 null] +>> endobj +1249 0 obj << +/D [1238 0 R /XYZ 71.731 478.0732 null] +>> endobj +1250 0 obj << +/D [1238 0 R /XYZ 71.731 476.8278 null] +>> endobj +1251 0 obj << +/D [1238 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1252 0 obj << +/D [1238 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1253 0 obj << +/D [1238 0 R /XYZ 71.731 456.3097 null] +>> endobj +1254 0 obj << +/D [1238 0 R /XYZ 71.731 456.3097 null] +>> endobj +1255 0 obj << +/D [1238 0 R /XYZ 139.477 439.8165 null] +>> endobj +1256 0 obj << +/D [1238 0 R /XYZ 139.477 439.8165 null] +>> endobj +1257 0 obj << +/D [1238 0 R /XYZ 76.7123 421.8838 null] +>> endobj +1258 0 obj << +/D [1238 0 R /XYZ 129.5143 403.951 null] +>> endobj +1259 0 obj << +/D [1238 0 R /XYZ 129.5143 403.951 null] +>> endobj +1260 0 obj << +/D [1238 0 R /XYZ 71.731 381.8689 null] +>> endobj +1261 0 obj << +/D [1238 0 R /XYZ 71.731 370.9748 null] +>> endobj +1262 0 obj << +/D [1238 0 R /XYZ 71.731 369.7295 null] +>> endobj +1263 0 obj << +/D [1238 0 R /XYZ 129.5143 350.6509 null] +>> endobj +636 0 obj << +/D [1238 0 R /XYZ 71.731 344.23 null] +>> endobj +62 0 obj << +/D [1238 0 R /XYZ 211.2435 300.4153 null] +>> endobj +1264 0 obj << +/D [1238 0 R /XYZ 71.731 276.6597 null] +>> endobj +1265 0 obj << +/D [1238 0 R /XYZ 161.0655 267.5386 null] +>> endobj +1266 0 obj << +/D [1238 0 R /XYZ 71.731 255.4191 null] +>> endobj +1267 0 obj << +/D [1238 0 R /XYZ 71.731 224.0532 null] +>> endobj +1268 0 obj << +/D [1238 0 R /XYZ 168.8063 213.0429 null] +>> endobj +1269 0 obj << +/D [1238 0 R /XYZ 71.731 185.9795 null] +>> endobj +1270 0 obj << +/D [1238 0 R /XYZ 71.731 169.5576 null] +>> endobj +1271 0 obj << +/D [1238 0 R /XYZ 71.731 138.6216 null] +>> endobj +1272 0 obj << +/D [1238 0 R /XYZ 181.5683 126.9657 null] +>> endobj +1273 0 obj << +/D [1238 0 R /XYZ 71.731 116.9035 null] +>> endobj +1237 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1276 0 obj << +/Length 1027 +/Filter /FlateDecode +>> +stream +xÚÍXËnÛ8Ýç+´´šåC|e—¶3ƒ)Ú"(¼kŦµ²H2‚þ}¯ž¦$Jf3E²#žÃÃCÞ+‘à $A’Á…jD§Áá|ƒƒ'ø×_7¤…ìZÌνÛß¼ý“á@#-¨ö§€i¸ É(Rœ¨`ü¶yÿ½”&ßî(ÇŠšë}¥¦ü=6_ïîÿn>|6åsv,¶ÿì?Þü±ïù9“H+ YÙ£¦2©¶d¢çD+ÄB&k÷[Â7Q ¨-nÇú›„Š™SBÚÙ°Nü"1Hèa•„Jù„—RÐH¨“w|½êèîšê`*P`…k`'!êˆ.ås¥cä ®*Èm³^E™_å›Ñ*V÷›´ŒQg©¼äf:ÁN‚*%¹Ûص³aWcIÏÁ„:ج±RLCíä7¶»kªch,Ó(”r(ã|iîp— $BØGùÏj 8v0Â2„ÒÁ1±0H5ÄW?]è¥BMáŠxʑ [¨G=Ì[\¼+*’K‡ÕVv+>Ч]{DÚÝ|êì;ÀÎÓ%i—ôID ¯WnÇ%’Š±ÚPʸ¨£HW ´T›»ã–àÍñ‹)_·o²üÇlcBÑ£l¬ºr)Ún7Ïʬüùbnû;®±iïÝQ‚T‰¦w96dÄ&«'ò€9®:¾vš)tÐðq(ÙuÛJ>˜âÇ/UK³¤…Á£… ½–¶ÐD-§ÙR¾yí¾ô2í ÕAÅ°žpú2)ì„z¨Ù©5º$e‹Ï Ë_ã µs½K’¬VjZï¾B)-Ö.At<ÇéZªµ3DSøÀ´g Ú°…-Øü[ÐÅ»b Nt¸»ÂŽÿçq†È J¨§ˆØ°…*ÒüeÄÅ»¢ŽLt8 É@Æoð8C˜B’séK¯[Joó§×Á»&½c3éµuTçéêô^Ýýâ>›jÍLþzb¨Åjݾû RDèÅ×CfúvˆS’µîGªH ™}×ã ü‰œ6öendstream +endobj +1275 0 obj << +/Type /Page +/Contents 1276 0 R +/Resources 1274 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1277 0 obj << +/D [1275 0 R /XYZ 71.731 729.2652 null] +>> endobj +638 0 obj << +/D [1275 0 R /XYZ 71.731 741.2204 null] +>> endobj +1278 0 obj << +/D [1275 0 R /XYZ 71.731 718.3063 null] +>> endobj +1279 0 obj << +/D [1275 0 R /XYZ 71.731 708.2442 null] +>> endobj +1280 0 obj << +/D [1275 0 R /XYZ 71.731 706.9988 null] +>> endobj +1281 0 obj << +/D [1275 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1282 0 obj << +/D [1275 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1283 0 obj << +/D [1275 0 R /XYZ 71.731 686.4807 null] +>> endobj +1284 0 obj << +/D [1275 0 R /XYZ 71.731 686.4807 null] +>> endobj +1285 0 obj << +/D [1275 0 R /XYZ 139.477 669.9875 null] +>> endobj +1286 0 obj << +/D [1275 0 R /XYZ 139.477 669.9875 null] +>> endobj +1287 0 obj << +/D [1275 0 R /XYZ 76.7123 652.0548 null] +>> endobj +1288 0 obj << +/D [1275 0 R /XYZ 129.5143 634.122 null] +>> endobj +1289 0 obj << +/D [1275 0 R /XYZ 129.5143 634.122 null] +>> endobj +1290 0 obj << +/D [1275 0 R /XYZ 71.731 632.7413 null] +>> endobj +1291 0 obj << +/D [1275 0 R /XYZ 71.731 632.7413 null] +>> endobj +1292 0 obj << +/D [1275 0 R /XYZ 139.477 616.1893 null] +>> endobj +1293 0 obj << +/D [1275 0 R /XYZ 139.477 616.1893 null] +>> endobj +1294 0 obj << +/D [1275 0 R /XYZ 71.731 614.0324 null] +>> endobj +1295 0 obj << +/D [1275 0 R /XYZ 139.477 598.2565 null] +>> endobj +1296 0 obj << +/D [1275 0 R /XYZ 139.477 598.2565 null] +>> endobj +1297 0 obj << +/D [1275 0 R /XYZ 71.731 596.0997 null] +>> endobj +1298 0 obj << +/D [1275 0 R /XYZ 139.477 580.3238 null] +>> endobj +1299 0 obj << +/D [1275 0 R /XYZ 139.477 580.3238 null] +>> endobj +1300 0 obj << +/D [1275 0 R /XYZ 71.731 578.1669 null] +>> endobj +1301 0 obj << +/D [1275 0 R /XYZ 139.477 562.391 null] +>> endobj +1302 0 obj << +/D [1275 0 R /XYZ 139.477 562.391 null] +>> endobj +1303 0 obj << +/D [1275 0 R /XYZ 71.731 524.533 null] +>> endobj +1304 0 obj << +/D [1275 0 R /XYZ 71.731 511.482 null] +>> endobj +1305 0 obj << +/D [1275 0 R /XYZ 71.731 510.2367 null] +>> endobj +1306 0 obj << +/D [1275 0 R /XYZ 129.5143 491.1581 null] +>> endobj +637 0 obj << +/D [1275 0 R /XYZ 71.731 484.7373 null] +>> endobj +66 0 obj << +/D [1275 0 R /XYZ 267.2967 440.9225 null] +>> endobj +1307 0 obj << +/D [1275 0 R /XYZ 71.731 420.7821 null] +>> endobj +1308 0 obj << +/D [1275 0 R /XYZ 161.0655 408.0458 null] +>> endobj +1309 0 obj << +/D [1275 0 R /XYZ 71.731 395.9263 null] +>> endobj +1310 0 obj << +/D [1275 0 R /XYZ 71.731 364.8967 null] +>> endobj +1311 0 obj << +/D [1275 0 R /XYZ 168.8063 353.5502 null] +>> endobj +1312 0 obj << +/D [1275 0 R /XYZ 71.731 326.4867 null] +>> endobj +1313 0 obj << +/D [1275 0 R /XYZ 71.731 311.9164 null] +>> endobj +1314 0 obj << +/D [1275 0 R /XYZ 71.731 279.1288 null] +>> endobj +1315 0 obj << +/D [1275 0 R /XYZ 181.5683 267.473 null] +>> endobj +1316 0 obj << +/D [1275 0 R /XYZ 71.731 257.4108 null] +>> endobj +1317 0 obj << +/D [1275 0 R /XYZ 71.731 225.8392 null] +>> endobj +1318 0 obj << +/D [1275 0 R /XYZ 71.731 212.8778 null] +>> endobj +1319 0 obj << +/D [1275 0 R /XYZ 71.731 211.6324 null] +>> endobj +1320 0 obj << +/D [1275 0 R /XYZ 129.5143 192.5539 null] +>> endobj +1321 0 obj << +/D [1275 0 R /XYZ 129.5143 192.5539 null] +>> endobj +1322 0 obj << +/D [1275 0 R /XYZ 71.731 191.1144 null] +>> endobj +1323 0 obj << +/D [1275 0 R /XYZ 71.731 191.1144 null] +>> endobj +1324 0 obj << +/D [1275 0 R /XYZ 139.477 174.6212 null] +>> endobj +1325 0 obj << +/D [1275 0 R /XYZ 139.477 174.6212 null] +>> endobj +1326 0 obj << +/D [1275 0 R /XYZ 76.7123 156.6884 null] +>> endobj +1327 0 obj << +/D [1275 0 R /XYZ 129.5143 138.7557 null] +>> endobj +1328 0 obj << +/D [1275 0 R /XYZ 129.5143 138.7557 null] +>> endobj +1329 0 obj << +/D [1275 0 R /XYZ 71.731 116.6735 null] +>> endobj +1330 0 obj << +/D [1275 0 R /XYZ 71.731 105.7794 null] +>> endobj +1331 0 obj << +/D [1275 0 R /XYZ 71.731 104.5341 null] +>> endobj +1274 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1334 0 obj << +/Length 862 +/Filter /FlateDecode +>> +stream +xÚÅWێ›0}ÏWðH¤Åõc{*¥·U«v­òÖ­*œ *ˆKWû÷µ±!8$RWªò` Ç3gÎxfyPýÇ`D-XQì­w3è=©¿îfÈB‹ † w«Ù›OzˆGÞjãÊB 8EÜ[%ßý÷Ûx_Ër` +} ̺Ìâ\Ö_ã_æv±ül.¾Éz[$ÕüÇêËìãª÷O ‚+'“$CÄAH ð Àˆ:Q @)b*È ëƒÁÂS~D:˜×Ãt4Ócvc@Øìü¯Ý.'ƒ¨H…LQHÆ<Ò¼¾1’!³¤³VÍz-«jÓdš¦²¥ø1 Äµ±€2À8!êLhÔÃAÆýE2GÐOîeý<ÇÐ/Êß«yý—½´æ†ÔB8†JIof˲¨‹Zm¸íwpµ#jýÛ½F B\´‰q‡¬;nܵÑÈj]¦û:-ò)6DÛ÷l*ã,¶>åSÿ¹»é‰š:P M«¤(aFÓY7e^]ȑk£mÆMV[|QoeùœVÆô5‘.²¬hyÊĘx(2Y]›‚8Ù¥ùµ®–sDý¸T©Pem\Œª¡«› +Õ4Ä¥*Â&ª°‡]¬B—ß+ªð„áÕú*ñÐGÓ!Ô4äÖ¦¼.›uW²}»Óûe^§ëXÑ!²)åi€–p1·°*ÂÂ"ÝLJõ°³ÂªäC +§ßóÂv»NyŒ…%„Œi,”.f8Ô¥ªÊB5eŽõMó§N_‡¬;cÎmaÖ¦’gO/¡}0¦Oï6qz{ØÅÓëò{Åé=áá>½#º›^}zêÞ»z`ÛBTèÇýÂvÂó‚@¬2ŠÐ%©°)©;Øe©~¯‘ÚÁÃ1®G<^{\££q]$ò®lv³ýA}˜Ó­íÃ9Õ¿z6> endobj +1335 0 obj << +/D [1333 0 R /XYZ 71.731 729.2652 null] +>> endobj +1336 0 obj << +/D [1333 0 R /XYZ 129.5143 708.3437 null] +>> endobj +70 0 obj << +/D [1333 0 R /XYZ 254.8155 658.1081 null] +>> endobj +1337 0 obj << +/D [1333 0 R /XYZ 71.731 634.6193 null] +>> endobj +1338 0 obj << +/D [1333 0 R /XYZ 161.0655 625.2314 null] +>> endobj +1339 0 obj << +/D [1333 0 R /XYZ 71.731 613.1119 null] +>> endobj +1340 0 obj << +/D [1333 0 R /XYZ 71.731 581.746 null] +>> endobj +1341 0 obj << +/D [1333 0 R /XYZ 168.8063 570.7357 null] +>> endobj +1342 0 obj << +/D [1333 0 R /XYZ 71.731 543.6723 null] +>> endobj +1343 0 obj << +/D [1333 0 R /XYZ 71.731 527.2504 null] +>> endobj +1344 0 obj << +/D [1333 0 R /XYZ 71.731 496.3144 null] +>> endobj +1345 0 obj << +/D [1333 0 R /XYZ 181.5683 484.6585 null] +>> endobj +1346 0 obj << +/D [1333 0 R /XYZ 71.731 474.5963 null] +>> endobj +1347 0 obj << +/D [1333 0 R /XYZ 71.731 443.0247 null] +>> endobj +1348 0 obj << +/D [1333 0 R /XYZ 71.731 430.0633 null] +>> endobj +1349 0 obj << +/D [1333 0 R /XYZ 71.731 428.818 null] +>> endobj +1350 0 obj << +/D [1333 0 R /XYZ 129.5143 409.7395 null] +>> endobj +1351 0 obj << +/D [1333 0 R /XYZ 129.5143 409.7395 null] +>> endobj +1352 0 obj << +/D [1333 0 R /XYZ 71.731 408.2999 null] +>> endobj +1353 0 obj << +/D [1333 0 R /XYZ 71.731 408.2999 null] +>> endobj +1354 0 obj << +/D [1333 0 R /XYZ 139.477 391.8067 null] +>> endobj +1355 0 obj << +/D [1333 0 R /XYZ 139.477 391.8067 null] +>> endobj +1356 0 obj << +/D [1333 0 R /XYZ 76.7123 373.874 null] +>> endobj +1357 0 obj << +/D [1333 0 R /XYZ 129.5143 355.9412 null] +>> endobj +1358 0 obj << +/D [1333 0 R /XYZ 129.5143 355.9412 null] +>> endobj +1359 0 obj << +/D [1333 0 R /XYZ 71.731 333.8591 null] +>> endobj +1360 0 obj << +/D [1333 0 R /XYZ 71.731 322.965 null] +>> endobj +1361 0 obj << +/D [1333 0 R /XYZ 71.731 321.7196 null] +>> endobj +1362 0 obj << +/D [1333 0 R /XYZ 129.5143 302.6411 null] +>> endobj +639 0 obj << +/D [1333 0 R /XYZ 71.731 296.2202 null] +>> endobj +74 0 obj << +/D [1333 0 R /XYZ 242.4379 252.4055 null] +>> endobj +1363 0 obj << +/D [1333 0 R /XYZ 71.731 228.9167 null] +>> endobj +1364 0 obj << +/D [1333 0 R /XYZ 161.0655 219.5287 null] +>> endobj +1365 0 obj << +/D [1333 0 R /XYZ 71.731 207.4093 null] +>> endobj +1366 0 obj << +/D [1333 0 R /XYZ 71.731 176.0434 null] +>> endobj +1367 0 obj << +/D [1333 0 R /XYZ 168.8063 165.0331 null] +>> endobj +1368 0 obj << +/D [1333 0 R /XYZ 71.731 137.9697 null] +>> endobj +1369 0 obj << +/D [1333 0 R /XYZ 71.731 121.5478 null] +>> endobj +1332 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1372 0 obj << +/Length 1185 +/Filter /FlateDecode +>> +stream +xڝX]o«8}ï¯à1‘_lcîÕ²_W]íVÕUÞ¶«Š€Ó %iÕ¿clÀ€óÑ«<`ÂØsæ̙±{>ü°'0.$B„3â%‡;ß{…Gßï°1Y›•môËæîËÔ÷"q½ÍΣGLž … ‡Þ&ýgñë>>6²Z®óéëS²ù+ÞêÛõӃü-›}™ÖË7Þý¾éý3*P‚“‹ {«9LY01ŽcXx ¨hq®ó¼\¶x—©Æò£ÌeýUAiç‡0Ÿj¾YiE0â8ŒÚÙqzȊÞvðµêŒ%‚kWOKÌq$£]ØÑöø8¥( wFÛ[­l³.Z`Bøxmo¦ <Âf~ :0qú^ݬ9Z¬aÈ ÃãˆOÍÞA ¯<(“¯:uS’æ~"5_M–ÄMV¶å©’ó;˜¡ ‘›ØÎje› ÄbU £€:³³ÄBò}DN¿ç‰ífÍqŒ‰¥ +„ÃX/º˜ì2Žxu:å7+^;~´ôrí¸)õõT˳êe"Bà0¸¢^Ûì‚z{³«êuù½A½3nõŽpe*_«òt|Ùe2×}kÂu"ÆEèÒòYy2%¢üŠ¡L×A¸=N‰p±N—R¦ù(›÷%ñeõŸC @!ñÅä8R•MÙ|孇u:¸ÂÚU£Úï" þ—²zٗu£ªÔzR ³_ž}Ÿ¨þÙsã!ê·A —pS8’rÒã®Í±Áàåmή¬Æրڜ_ׅÊð‡¾yS‹ÄùIšÅë£L²6$“û¬¸¶ñRÉ~SM Q%lÃÕ{VË®(wjn|Êk’*O_ÕâŒÓ6Rµ„‚ðÅ”ulâm.õý-Üë(aÐïïjèÁÖ̪$tŒ–­7¹4voY¬ßecÉÁã?‹@ipðïkkxp¡Q‰ÈL¦Æh6ËÐ_ÀҀǬI¡—…X—у)Aã\¥«Ëc§ŸÄd";šÁëÀ7F8*KÎ÷3 ™¶U§I\7ƒÅ!®»§qa §EmZÂáT7æaž›5äya9X:'3£Ýó§û¤‹t׉îØ¿©˜gñŤ ï'¢Î^‹²R¢¥@o#Oõ„ŽF&{󟖢ª…"7£8Mgt×ãƒ)àÏLõê·:«;"Öêmê况c»øuSè²k*¸½7öp\g’¨Ïî†ãiO蛺µ—þ仯õêk ³û!Ó Ú|DBµ]üÎ`ÙÌ?3Àþ o‡pLì¬ +LÏ~4p8üËendstream +endobj +1371 0 obj << +/Type /Page +/Contents 1372 0 R +/Resources 1370 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1194 0 R +>> endobj +1373 0 obj << +/D [1371 0 R /XYZ 71.731 729.2652 null] +>> endobj +1374 0 obj << +/D [1371 0 R /XYZ 71.731 718.3063 null] +>> endobj +1375 0 obj << +/D [1371 0 R /XYZ 181.5683 708.3437 null] +>> endobj +1376 0 obj << +/D [1371 0 R /XYZ 71.731 698.2815 null] +>> endobj +1377 0 obj << +/D [1371 0 R /XYZ 71.731 666.7099 null] +>> endobj +1378 0 obj << +/D [1371 0 R /XYZ 71.731 653.7485 null] +>> endobj +1379 0 obj << +/D [1371 0 R /XYZ 71.731 652.5032 null] +>> endobj +1380 0 obj << +/D [1371 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1381 0 obj << +/D [1371 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1382 0 obj << +/D [1371 0 R /XYZ 71.731 631.9851 null] +>> endobj +1383 0 obj << +/D [1371 0 R /XYZ 71.731 631.9851 null] +>> endobj +1384 0 obj << +/D [1371 0 R /XYZ 139.477 615.4919 null] +>> endobj +1385 0 obj << +/D [1371 0 R /XYZ 139.477 615.4919 null] +>> endobj +1386 0 obj << +/D [1371 0 R /XYZ 76.7123 597.5591 null] +>> endobj +1387 0 obj << +/D [1371 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1388 0 obj << +/D [1371 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1389 0 obj << +/D [1371 0 R /XYZ 71.731 578.2456 null] +>> endobj +1390 0 obj << +/D [1371 0 R /XYZ 71.731 578.2456 null] +>> endobj +1391 0 obj << +/D [1371 0 R /XYZ 139.477 561.6936 null] +>> endobj +1392 0 obj << +/D [1371 0 R /XYZ 139.477 561.6936 null] +>> endobj +1393 0 obj << +/D [1371 0 R /XYZ 71.731 559.5368 null] +>> endobj +1394 0 obj << +/D [1371 0 R /XYZ 139.477 543.7609 null] +>> endobj +1395 0 obj << +/D [1371 0 R /XYZ 139.477 543.7609 null] +>> endobj +1396 0 obj << +/D [1371 0 R /XYZ 71.731 505.9029 null] +>> endobj +1397 0 obj << +/D [1371 0 R /XYZ 71.731 492.8519 null] +>> endobj +1398 0 obj << +/D [1371 0 R /XYZ 71.731 491.6065 null] +>> endobj +1399 0 obj << +/D [1371 0 R /XYZ 129.5143 472.528 null] +>> endobj +640 0 obj << +/D [1371 0 R /XYZ 71.731 465.3899 null] +>> endobj +78 0 obj << +/D [1371 0 R /XYZ 258.7062 422.2924 null] +>> endobj +1400 0 obj << +/D [1371 0 R /XYZ 71.731 402.152 null] +>> endobj +1401 0 obj << +/D [1371 0 R /XYZ 161.0655 389.4157 null] +>> endobj +1402 0 obj << +/D [1371 0 R /XYZ 71.731 377.2962 null] +>> endobj +1403 0 obj << +/D [1371 0 R /XYZ 71.731 346.2666 null] +>> endobj +1404 0 obj << +/D [1371 0 R /XYZ 168.8063 334.92 null] +>> endobj +1405 0 obj << +/D [1371 0 R /XYZ 71.731 307.8566 null] +>> endobj +1406 0 obj << +/D [1371 0 R /XYZ 71.731 253.1781 null] +>> endobj +1407 0 obj << +/D [1371 0 R /XYZ 71.731 209.9403 null] +>> endobj +1408 0 obj << +/D [1371 0 R /XYZ 71.731 193.3027 null] +>> endobj +1409 0 obj << +/D [1371 0 R /XYZ 71.731 162.0574 null] +>> endobj +1410 0 obj << +/D [1371 0 R /XYZ 181.5683 150.7108 null] +>> endobj +1411 0 obj << +/D [1371 0 R /XYZ 71.731 140.6487 null] +>> endobj +1370 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1414 0 obj << +/Length 1520 +/Filter /FlateDecode +>> +stream +xÚ­™]oÛ6†ïó+|¨9~Jb/¤íºeX³`ÍÝ:Š¥ÄÂlɓäù÷;²D›–ŽH­+ra9~¥óêá!yH²…?6  |pMx øl½»¢³gøéç+ÖI–fi‹Þ=\ýðQЙ&:àÁìái&t@T(g¡à$R,š=$Îßoâ}–‹%WtÎIûy¿ó´þ-~l¿ÞÜ߶ŸÒzS$Õ⯇_¯~z8ÅW"$:‚ N“'ÕÐ&זMÆ4QŠ…³FDH}Þ/˜šÇe¼KÁmõ¶oátSANjá¤ZÚ2cþRvaá$k,|á\ ârGãö?Ï>Ì]C"šE€"GJ1).}ćzÓøèqã’Ð&B#yÛ¶WU—‡uý¦×ŠÍýi^gë¸ÎŠÜVÊtø‚ÆB¡¢Pá`jiËÎ`Y“ž/dd£`!I)—;ÖÜ5ôq Vh"ÃðÒÆ pi3¡«Hè<}¾Yþlø"XwíãŽ×uÑ~ªt<{…$¾ä=«\¹Û©ü©; :%s{&F×2‘IºÊ’UQ®6EUçЗЌJÒP\’Îòº½(Jýx¶²€°H _¶Z2W¶™?[‘¸S²ña!1ÙjÛ"]âÝ׎RÒ$àJ9Œèch”ŽW¯#Û2š“Ì‹‹; æcˆæÂÆE·üxØn_ÛËñ¶¥ÓuI; Ñþ¨HwÍ<ýÑR9ú£Qyû#tBì›Àû£m¢é0Í¿åß«§,ݶ{°ÖDpd܃Ùb<ä$RE¾ÎgË\fdþ CâNÉ°¾tª¸°ÑaCxIJ¤„Òf|žø|x„Û»©8IÊ´ªÆIr(Ù¸òöUKæ"id~’HÜ)$û>p’¶¬ZíËl—¯Ø¤*z3ÁcQlÓ8ï`ÞVÝäºé†@ó03k¤åӂèu÷û“™@êMÖÝÛôƒñ€"TiùZÀ’¹ZÀÈü-€ÄÒ}x Ø6’¼b#å$Õڑȷ÷—IÜÎÏOH;|¸ûÜݟ–_›BÞ1=IMIxpŸE؝ȋzqèž³eÀQðH½A»FŒ/TÑß÷MUoᚵÿýelò:½ÈIÈCß0lË\4Ìω;…hßÎÔ¶±‹×XA ËÛq Ÿn’ÎßOƒ¥‚‚TKßlË\Ì‰;cߎѶñø²ÍvYÏfLj9¨Å;Žïâ> endobj +1415 0 obj << +/D [1413 0 R /XYZ 71.731 729.2652 null] +>> endobj +1416 0 obj << +/D [1413 0 R /XYZ 71.731 741.2204 null] +>> endobj +1417 0 obj << +/D [1413 0 R /XYZ 71.731 718.3063 null] +>> endobj +1418 0 obj << +/D [1413 0 R /XYZ 71.731 708.2442 null] +>> endobj +1419 0 obj << +/D [1413 0 R /XYZ 71.731 706.9988 null] +>> endobj +1420 0 obj << +/D [1413 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1421 0 obj << +/D [1413 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1422 0 obj << +/D [1413 0 R /XYZ 71.731 686.4807 null] +>> endobj +1423 0 obj << +/D [1413 0 R /XYZ 71.731 686.4807 null] +>> endobj +1424 0 obj << +/D [1413 0 R /XYZ 139.477 669.9875 null] +>> endobj +1425 0 obj << +/D [1413 0 R /XYZ 139.477 669.9875 null] +>> endobj +1426 0 obj << +/D [1413 0 R /XYZ 76.7123 652.0548 null] +>> endobj +1427 0 obj << +/D [1413 0 R /XYZ 129.5143 634.122 null] +>> endobj +1428 0 obj << +/D [1413 0 R /XYZ 129.5143 634.122 null] +>> endobj +1429 0 obj << +/D [1413 0 R /XYZ 71.731 631.9652 null] +>> endobj +1430 0 obj << +/D [1413 0 R /XYZ 71.731 631.9652 null] +>> endobj +1431 0 obj << +/D [1413 0 R /XYZ 139.477 616.1893 null] +>> endobj +1432 0 obj << +/D [1413 0 R /XYZ 71.731 614.7497 null] +>> endobj +1433 0 obj << +/D [1413 0 R /XYZ 139.477 598.2565 null] +>> endobj +1434 0 obj << +/D [1413 0 R /XYZ 76.7123 580.3238 null] +>> endobj +1435 0 obj << +/D [1413 0 R /XYZ 129.5143 562.391 null] +>> endobj +1436 0 obj << +/D [1413 0 R /XYZ 129.5143 562.391 null] +>> endobj +1437 0 obj << +/D [1413 0 R /XYZ 71.731 561.212 null] +>> endobj +1438 0 obj << +/D [1413 0 R /XYZ 71.731 561.212 null] +>> endobj +1439 0 obj << +/D [1413 0 R /XYZ 139.477 544.4583 null] +>> endobj +1440 0 obj << +/D [1413 0 R /XYZ 139.477 544.4583 null] +>> endobj +1441 0 obj << +/D [1413 0 R /XYZ 71.731 542.3014 null] +>> endobj +1442 0 obj << +/D [1413 0 R /XYZ 139.477 526.5255 null] +>> endobj +1443 0 obj << +/D [1413 0 R /XYZ 139.477 526.5255 null] +>> endobj +1444 0 obj << +/D [1413 0 R /XYZ 71.731 524.3687 null] +>> endobj +1445 0 obj << +/D [1413 0 R /XYZ 139.477 508.5928 null] +>> endobj +1446 0 obj << +/D [1413 0 R /XYZ 139.477 508.5928 null] +>> endobj +1447 0 obj << +/D [1413 0 R /XYZ 71.731 506.4359 null] +>> endobj +1448 0 obj << +/D [1413 0 R /XYZ 139.477 490.66 null] +>> endobj +1449 0 obj << +/D [1413 0 R /XYZ 139.477 490.66 null] +>> endobj +1450 0 obj << +/D [1413 0 R /XYZ 71.731 488.5032 null] +>> endobj +1451 0 obj << +/D [1413 0 R /XYZ 139.477 472.7273 null] +>> endobj +1452 0 obj << +/D [1413 0 R /XYZ 139.477 472.7273 null] +>> endobj +1453 0 obj << +/D [1413 0 R /XYZ 71.731 470.5704 null] +>> endobj +1454 0 obj << +/D [1413 0 R /XYZ 139.477 454.7945 null] +>> endobj +1455 0 obj << +/D [1413 0 R /XYZ 139.477 454.7945 null] +>> endobj +1456 0 obj << +/D [1413 0 R /XYZ 71.731 453.355 null] +>> endobj +1457 0 obj << +/D [1413 0 R /XYZ 139.477 436.8618 null] +>> endobj +1458 0 obj << +/D [1413 0 R /XYZ 139.477 436.8618 null] +>> endobj +1459 0 obj << +/D [1413 0 R /XYZ 71.731 434.7049 null] +>> endobj +1460 0 obj << +/D [1413 0 R /XYZ 139.477 418.929 null] +>> endobj +1461 0 obj << +/D [1413 0 R /XYZ 139.477 418.929 null] +>> endobj +1462 0 obj << +/D [1413 0 R /XYZ 71.731 416.7722 null] +>> endobj +1463 0 obj << +/D [1413 0 R /XYZ 139.477 400.9962 null] +>> endobj +1464 0 obj << +/D [1413 0 R /XYZ 139.477 400.9962 null] +>> endobj +1465 0 obj << +/D [1413 0 R /XYZ 71.731 398.8394 null] +>> endobj +1466 0 obj << +/D [1413 0 R /XYZ 139.477 383.0635 null] +>> endobj +1467 0 obj << +/D [1413 0 R /XYZ 139.477 383.0635 null] +>> endobj +1468 0 obj << +/D [1413 0 R /XYZ 71.731 380.9067 null] +>> endobj +1469 0 obj << +/D [1413 0 R /XYZ 139.477 365.1307 null] +>> endobj +1470 0 obj << +/D [1413 0 R /XYZ 139.477 365.1307 null] +>> endobj +1471 0 obj << +/D [1413 0 R /XYZ 71.731 362.9739 null] +>> endobj +1472 0 obj << +/D [1413 0 R /XYZ 139.477 347.198 null] +>> endobj +1473 0 obj << +/D [1413 0 R /XYZ 139.477 347.198 null] +>> endobj +1474 0 obj << +/D [1413 0 R /XYZ 71.731 345.0412 null] +>> endobj +1475 0 obj << +/D [1413 0 R /XYZ 139.477 329.2652 null] +>> endobj +1476 0 obj << +/D [1413 0 R /XYZ 139.477 329.2652 null] +>> endobj +1477 0 obj << +/D [1413 0 R /XYZ 71.731 291.4072 null] +>> endobj +1478 0 obj << +/D [1413 0 R /XYZ 71.731 278.3562 null] +>> endobj +1479 0 obj << +/D [1413 0 R /XYZ 71.731 277.1109 null] +>> endobj +1480 0 obj << +/D [1413 0 R /XYZ 129.5143 258.0324 null] +>> endobj +641 0 obj << +/D [1413 0 R /XYZ 71.731 251.2678 null] +>> endobj +82 0 obj << +/D [1413 0 R /XYZ 191.1362 207.7967 null] +>> endobj +1481 0 obj << +/D [1413 0 R /XYZ 71.731 187.6564 null] +>> endobj +1482 0 obj << +/D [1413 0 R /XYZ 161.0655 174.92 null] +>> endobj +1483 0 obj << +/D [1413 0 R /XYZ 71.731 162.8006 null] +>> endobj +1484 0 obj << +/D [1413 0 R /XYZ 71.731 131.4347 null] +>> endobj +1485 0 obj << +/D [1413 0 R /XYZ 168.8063 120.4244 null] +>> endobj +1412 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1489 0 obj << +/Length 1325 +/Filter /FlateDecode +>> +stream +xÚ¥X]›8}Ÿ_ÁãDšx±?èÃJi»­fµ­Fݼí¬"&8´²@ڝ_l0`>¤U0áØ÷øø^ßkCϗ?è1–D òŽ—;ß{•Ÿ>ßA ÙjÌÖ½ßßýò û^BŠ¨·?y8¤€°ÀcN ÷öñ_÷ÎѵÅf‹ˆ@ó|J£LTD/Íëîé±i|Õ9ËÍßûßï~Û·ö f äÒÈ,É5¦‰BKš4P4¡üJ`€=æs€Ìjž»XÚ­IDÍ#Dîè—<šû.Û@rÿÖ¼|W˜(½ Ý·¼ŠcòìûHÄÍIÖ p¨?¤­B4[)⇦™WgQüHJý%§ ”È[Z¹:%”œüC@8¤õDž 4Ó*q<ëÿ.‘&žg©nEqÜQÔ°*×ϳHôÒåµz6eR‰Òè_’l8üÜ ‘- ©¤€bÖL㛨n…Wò˜X”C¢ =ûÄÿµiú² µü'mæv<Š²<ÝR-ôP×VøšLí1cous«›Qí0iÚhb–ú[žŠò]Û½s8ÓA@!ëޑRMs¹&ÝB­5ÿ¤DŒŠè"dt5f퐁P:9Ì#Œ8w†L‹ÚÚ022œ˜ë¦(<#DFv‘9íŸÓkÌsWèöxD·Ê% +€¯,(È;íUq;Vƒ]GõY•£*É3y“Ñ6š ¡€ w<·®´µP¬Pm¦½éhÔ¤ªrå}„.£Ó¢šN#}MqÆzvR‘f/vèJd”r›*›d¯FY‡ —f¸ÞN ÷°I¿ BöɂßÚ°¿ma‹~ë²»ÂoG<Ü~Ûã¡ö>¹òâæ¯Ivx‰A‚CH@@iØW<É*½uöLúkÀ}@BÆֆÍxl [tY—Ý>ëâaI¢¶GC*¢ðO©¬V)VŽX'ÞbZŠ¥dI™5'ŒF-ë26ºF–1 ‡*‡^`vº”irÔÍk!”>ÿM‡"¢€…áb(Z°¹P4°åPtØ]ŠC¡hó¨K‰SRgã¤2qSÎ\¹dÚ§dqÉ©LÖ NeÁæ¼ÊÀ–ÝÊaw_ y8sDÆKžW‡²Š*áN2=ó™$ñ^v7ë1œBâÐ!t´P32Ô¢Š£+D’pjhs¸H·K]¥K0ٌz_¢T+¥~3`“NƒÚ9’õL”šBýxN²Ñ¾ђêlNv[ÖÝawðCnåmßeÕ¬Š“±ø`ÎÖ7׫<‡™üÛ9ò‡æT(kón|·Â„Ÿò¥¤cÃæ6°e…v×(<äáVئqÎË*“ç—Ä¢‰?ÝRs@ýWzmïLmìm©,ŽH@d•ëîëý\Ÿ§EˆcÀ1¡ 9͆Íä´¶˜Ó\vWä4+ï7èñèÊ¡¯ÿûÔ¬×PN„I½è[Âã×Ê#cÉàQ7ŒßïbµEÅ_¥Áý†ËIµ>$›·«Ë-àÈgƒƒn‘WyõvkÖ»xdR™k竎{=-TnœÊú¢¢øUõÕõ¹iåý£(ErUg 9î˜BQ˽ ¥h ¯d&®š:lMZ_Ï<Ó@KÌEQZˆ(~뾈ˋ¹µËCqZÁš§(Š¼°.«ÌՎ\ Bq=É¢N}}eG‰¾f d‘åqgî&ÒŒ/" âòè†íHÊ*$“׊ƒ?AõÜÆendstream +endobj +1488 0 obj << +/Type /Page +/Contents 1489 0 R +/Resources 1487 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1490 0 obj << +/D [1488 0 R /XYZ 71.731 729.2652 null] +>> endobj +1491 0 obj << +/D [1488 0 R /XYZ 71.731 741.2204 null] +>> endobj +1492 0 obj << +/D [1488 0 R /XYZ 71.731 718.3063 null] +>> endobj +1493 0 obj << +/D [1488 0 R /XYZ 71.731 669.8397 null] +>> endobj +1494 0 obj << +/D [1488 0 R /XYZ 71.731 638.5943 null] +>> endobj +1495 0 obj << +/D [1488 0 R /XYZ 181.5683 627.2478 null] +>> endobj +1496 0 obj << +/D [1488 0 R /XYZ 71.731 617.1856 null] +>> endobj +1497 0 obj << +/D [1488 0 R /XYZ 71.731 583.7625 null] +>> endobj +1498 0 obj << +/D [1488 0 R /XYZ 71.731 572.6526 null] +>> endobj +1499 0 obj << +/D [1488 0 R /XYZ 71.731 571.4073 null] +>> endobj +1500 0 obj << +/D [1488 0 R /XYZ 129.5143 552.3288 null] +>> endobj +1501 0 obj << +/D [1488 0 R /XYZ 129.5143 552.3288 null] +>> endobj +1502 0 obj << +/D [1488 0 R /XYZ 71.731 550.8892 null] +>> endobj +1503 0 obj << +/D [1488 0 R /XYZ 71.731 550.8892 null] +>> endobj +1504 0 obj << +/D [1488 0 R /XYZ 139.477 534.396 null] +>> endobj +1505 0 obj << +/D [1488 0 R /XYZ 139.477 534.396 null] +>> endobj +1506 0 obj << +/D [1488 0 R /XYZ 76.7123 516.4633 null] +>> endobj +1507 0 obj << +/D [1488 0 R /XYZ 129.5143 498.5305 null] +>> endobj +1508 0 obj << +/D [1488 0 R /XYZ 129.5143 498.5305 null] +>> endobj +1509 0 obj << +/D [1488 0 R /XYZ 71.731 496.3737 null] +>> endobj +1510 0 obj << +/D [1488 0 R /XYZ 71.731 496.3737 null] +>> endobj +1511 0 obj << +/D [1488 0 R /XYZ 139.477 480.5978 null] +>> endobj +1512 0 obj << +/D [1488 0 R /XYZ 71.731 479.1582 null] +>> endobj +1513 0 obj << +/D [1488 0 R /XYZ 139.477 462.665 null] +>> endobj +1514 0 obj << +/D [1488 0 R /XYZ 76.7123 444.7322 null] +>> endobj +1515 0 obj << +/D [1488 0 R /XYZ 129.5143 426.7995 null] +>> endobj +1516 0 obj << +/D [1488 0 R /XYZ 129.5143 426.7995 null] +>> endobj +1517 0 obj << +/D [1488 0 R /XYZ 71.731 425.6205 null] +>> endobj +1518 0 obj << +/D [1488 0 R /XYZ 71.731 425.6205 null] +>> endobj +1519 0 obj << +/D [1488 0 R /XYZ 139.477 408.8667 null] +>> endobj +1520 0 obj << +/D [1488 0 R /XYZ 139.477 408.8667 null] +>> endobj +1521 0 obj << +/D [1488 0 R /XYZ 71.731 406.7099 null] +>> endobj +1522 0 obj << +/D [1488 0 R /XYZ 139.477 390.934 null] +>> endobj +1523 0 obj << +/D [1488 0 R /XYZ 139.477 390.934 null] +>> endobj +1524 0 obj << +/D [1488 0 R /XYZ 71.731 388.7772 null] +>> endobj +1525 0 obj << +/D [1488 0 R /XYZ 139.477 373.0012 null] +>> endobj +1526 0 obj << +/D [1488 0 R /XYZ 139.477 373.0012 null] +>> endobj +1527 0 obj << +/D [1488 0 R /XYZ 71.731 370.8444 null] +>> endobj +1528 0 obj << +/D [1488 0 R /XYZ 139.477 355.0685 null] +>> endobj +1529 0 obj << +/D [1488 0 R /XYZ 139.477 355.0685 null] +>> endobj +1530 0 obj << +/D [1488 0 R /XYZ 71.731 317.2105 null] +>> endobj +1531 0 obj << +/D [1488 0 R /XYZ 71.731 304.1595 null] +>> endobj +1532 0 obj << +/D [1488 0 R /XYZ 71.731 302.9142 null] +>> endobj +1533 0 obj << +/D [1488 0 R /XYZ 129.5143 283.8356 null] +>> endobj +642 0 obj << +/D [1488 0 R /XYZ 71.731 277.0711 null] +>> endobj +86 0 obj << +/D [1488 0 R /XYZ 305.1364 233.6 null] +>> endobj +1534 0 obj << +/D [1488 0 R /XYZ 71.731 210.1112 null] +>> endobj +1535 0 obj << +/D [1488 0 R /XYZ 161.0655 200.7233 null] +>> endobj +1536 0 obj << +/D [1488 0 R /XYZ 71.731 188.6038 null] +>> endobj +1537 0 obj << +/D [1488 0 R /XYZ 71.731 157.2379 null] +>> endobj +1538 0 obj << +/D [1488 0 R /XYZ 168.8063 146.2276 null] +>> endobj +1539 0 obj << +/D [1488 0 R /XYZ 71.731 119.1642 null] +>> endobj +1487 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1542 0 obj << +/Length 1054 +/Filter /FlateDecode +>> +stream +xÚÍX]£6}Ÿ_Ác"m\Ûàö-ÝvªVíj´Ê>uª<$)­æß×L0U_ªy€Œï=ßc®AT(`°P]p 0%88_`ð¦†~y@r0˜ƒ úñôðÃcƒÄÓàô„1„E 1àñà”þ¹ûtInRTû&p‡Aw}ʓBÈߓoÝÏãÓ¯ÝÍB^Ê´ÞÿuúíáçSŸŸ„ Ä\%Y$Ù£¦4qpE“Fš&R£EaÀ a²–ç!›ª¨;¨»d¯ÝµnÎgQׯMþ¡ûÇëÁ]ÒäÒàKyÕ÷¬@Soó ²ÌíAËÂh—î˜çå“Ýw‘v!¾”¹¨?öÓºv6F€"·³“ôš[S=íÙ%Urjº®¸)9b…ˆÅ^q{ÔÁ…Yq•ð ¢VÜI4Mác2ɋ±RaoÞûëÀÃΚò¹o‘G<’F^<²á@AC>š%—Us–îêSÏ…ÌΉÌÊÂE6•˜> ¡@8VK7Sµ=êàÂa‘6žû@=lVXµøG±7ï¼°v֔ÇXØ0ccG¥Kç]º„©má^߬x³úzd½váÚ{Yvצ³ÕK" +X³•êua ÕÛÃV«×—wCõNxø«wÄ£(Sñ’¥/eõr)kY(G{äF0 ²p¬wVH³UUîÌ×,æ€#¯Õ¬[ªY [¯YOÞ-5ëááHbkÖ¥¡1å÷YéjTJu>CˆÕkVçѪؒ4¶.'ïi<<<Ò¸4Fæ|lòü½»ý»IòNcL· ½®ŒQ[+_s¥ [pe[u¥/ïWNxø]9â¡]ùV•ÍÍXsΖJ`Èúo¶ŒSQȚ-]ØBíõ°ÕÚóåÝP{>ÓÚÑðÙ²•÷_84R ×ê–T²°u•Oç`FnçF Øe%ÕL´õdñ“¨ÏUvÓMÛÝP )îéš3S2PwyÉ@ÆìÅh@=¤9F>¶'›áf×Ou“÷Á/‰M›W"IÍ í›6všŠ»n³Ò«j7éIžkv—F;jÃJ¨-»¾›v’æ€èì‡OCê1endstream +endobj +1541 0 obj << +/Type /Page +/Contents 1542 0 R +/Resources 1540 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1543 0 obj << +/D [1541 0 R /XYZ 71.731 729.2652 null] +>> endobj +1544 0 obj << +/D [1541 0 R /XYZ 71.731 741.2204 null] +>> endobj +1545 0 obj << +/D [1541 0 R /XYZ 71.731 718.3063 null] +>> endobj +1546 0 obj << +/D [1541 0 R /XYZ 71.731 633.8332 null] +>> endobj +1547 0 obj << +/D [1541 0 R /XYZ 71.731 620.8718 null] +>> endobj +1548 0 obj << +/D [1541 0 R /XYZ 71.731 619.6265 null] +>> endobj +1549 0 obj << +/D [1541 0 R /XYZ 129.5143 600.5479 null] +>> endobj +1550 0 obj << +/D [1541 0 R /XYZ 129.5143 600.5479 null] +>> endobj +1551 0 obj << +/D [1541 0 R /XYZ 71.731 599.1084 null] +>> endobj +1552 0 obj << +/D [1541 0 R /XYZ 71.731 599.1084 null] +>> endobj +1553 0 obj << +/D [1541 0 R /XYZ 139.477 582.6152 null] +>> endobj +1554 0 obj << +/D [1541 0 R /XYZ 139.477 582.6152 null] +>> endobj +1555 0 obj << +/D [1541 0 R /XYZ 76.7123 564.6824 null] +>> endobj +1556 0 obj << +/D [1541 0 R /XYZ 129.5143 546.7497 null] +>> endobj +1557 0 obj << +/D [1541 0 R /XYZ 129.5143 546.7497 null] +>> endobj +1558 0 obj << +/D [1541 0 R /XYZ 71.731 544.5928 null] +>> endobj +1559 0 obj << +/D [1541 0 R /XYZ 71.731 544.5928 null] +>> endobj +1560 0 obj << +/D [1541 0 R /XYZ 139.477 528.8169 null] +>> endobj +1561 0 obj << +/D [1541 0 R /XYZ 71.731 527.3774 null] +>> endobj +1562 0 obj << +/D [1541 0 R /XYZ 139.477 510.8842 null] +>> endobj +1563 0 obj << +/D [1541 0 R /XYZ 76.7123 492.9514 null] +>> endobj +1564 0 obj << +/D [1541 0 R /XYZ 129.5143 475.0187 null] +>> endobj +1565 0 obj << +/D [1541 0 R /XYZ 129.5143 475.0187 null] +>> endobj +1566 0 obj << +/D [1541 0 R /XYZ 71.731 472.8618 null] +>> endobj +1567 0 obj << +/D [1541 0 R /XYZ 71.731 472.8618 null] +>> endobj +1568 0 obj << +/D [1541 0 R /XYZ 139.477 457.0859 null] +>> endobj +1569 0 obj << +/D [1541 0 R /XYZ 71.731 454.9291 null] +>> endobj +1570 0 obj << +/D [1541 0 R /XYZ 139.477 439.1532 null] +>> endobj +1571 0 obj << +/D [1541 0 R /XYZ 71.731 401.2951 null] +>> endobj +1572 0 obj << +/D [1541 0 R /XYZ 71.731 388.2442 null] +>> endobj +1573 0 obj << +/D [1541 0 R /XYZ 71.731 386.9988 null] +>> endobj +1574 0 obj << +/D [1541 0 R /XYZ 129.5143 367.9203 null] +>> endobj +643 0 obj << +/D [1541 0 R /XYZ 71.731 361.4994 null] +>> endobj +90 0 obj << +/D [1541 0 R /XYZ 247.1379 317.6847 null] +>> endobj +1575 0 obj << +/D [1541 0 R /XYZ 71.731 297.5443 null] +>> endobj +1576 0 obj << +/D [1541 0 R /XYZ 161.0655 284.8079 null] +>> endobj +1577 0 obj << +/D [1541 0 R /XYZ 71.731 272.6885 null] +>> endobj +1578 0 obj << +/D [1541 0 R /XYZ 71.731 241.3226 null] +>> endobj +1579 0 obj << +/D [1541 0 R /XYZ 168.8063 230.3123 null] +>> endobj +1580 0 obj << +/D [1541 0 R /XYZ 71.731 203.2489 null] +>> endobj +1581 0 obj << +/D [1541 0 R /XYZ 71.731 162.0783 null] +>> endobj +1582 0 obj << +/D [1541 0 R /XYZ 71.731 143.5891 null] +>> endobj +1583 0 obj << +/D [1541 0 R /XYZ 71.731 112.6531 null] +>> endobj +1584 0 obj << +/D [1541 0 R /XYZ 181.5683 100.9973 null] +>> endobj +1540 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1587 0 obj << +/Length 1123 +/Filter /FlateDecode +>> +stream +xÚÅX]o¤6}ϯàqFʸþÀ6ä¡ÒtÛ]íj[VÓ§¦Š8 ³|h•_ƒm0àžºÊŒrì{îñ¹ö5ȃòyNä‡3Š½ør½Wù¯OwHCs°A¿ï~ùH ‚aæ_<2@¹ïq‚A@Qà“vÞ¢k-ÊýS¸Ã@=OY”‹úkô¬~OŸÕ˟¢~+’jÿïùËÝç>>%„ ²H²GÍiâÐ $Mæ·4‘ü/E>ñ8 ñ ïxFÉ%Íïkª_j¿µdº†DúõÐ&ʙšà´Gt•ÑEÈt«‡iɨqQ + O˜3‡u°a&™‡¨Ëa6[Kác:‹‹±LagÜésàaFÍyÀ¥åˆGÔÔ.Ù°`¡…<(«ºlâú~bƒv¼Èë4Žê´ÈmdSŠy‚†‚\„`àÖ 6lµþ%d`7…•‹±:ãÞ֌šó KBàs>¦q”º¨q¨K`¾¬¾©¾iþjôuÈzQÓ)·êÙTâ¶{!اdͽlɽ¶î^GÜ-îò¸á^›G^$â)MžŠòé­¨ê\V´Cn}À!'c½Ó¼V/Ei/ÀMÏҀ‚0[ñ¬ [ðl[õ¬+îϺxX’hώhHE´ýþ’ºj•’Ö†by0ܔ†Q@x¸VÎ6lI[—Æw‹4il£âüØdÙ»zýÞD™RG¦mCgUR“ærUÚ°…ªìa«U銻¡*g<ÜU9âqY”ŽB$ àYj]OþÞ`º>u„ ÐÚálք4°u!q·9åqCH›Çµ(ëm‡³CÄnp÷–7—g%¤lƒˆÌ}臔»¿ yZç O€ä¯hmôîa«Z»ânÐÚÅÃ*p£õˆÇ  Ғ¾èc¡‰cQU/M¦—Bòã#Ú-܁rÀÒîn`BÕÂa€XÛ?ó`wLöî’vYæ+és`È'ÝiYÔEý~ýˆÁ(¦Å0„ª×H’~Õ!…mO¦s©ÒڐYñšæOÏQ%Lë,Ë´«±,©ä0´µ{þ]Tq™^ÛÆd‰!‘7 †{†•îµ%ÅÓÝãÔyÄE^—E¦œ<­‡ÌdšÓQ$;%ìUģ͸Í^_cŽyÛ󿛩TÖ7†¥ù\ ;}ߕÜwÛŒ2µ÷’Mù#­4./íòGMV»¦f +bUý鳁æÉp·Ée/˜ E±™ð鬊ܜJQ’ô›A5+Õ:+ÕóAªª§#Ý+»Yfo­Ç ¨6ü~™~U¯pX«y1iNåéõ[íxÌ2íÍà[‘‰jkíüowI$5õI¸vîÛ°…-´‡­n¡®¸¶Ð÷q5âñsî’a(dkm¹…Zh= jµótÝÐxNI8¯‘6‡Ÿw‹ÔŸ‘üÈm)\üÒdaæš(ærsD¤Ÿ©åŠøÍÏFŽ€ÿ&uWendstream +endobj +1586 0 obj << +/Type /Page +/Contents 1587 0 R +/Resources 1585 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1588 0 obj << +/D [1586 0 R /XYZ 71.731 729.2652 null] +>> endobj +1589 0 obj << +/D [1586 0 R /XYZ 71.731 686.4773 null] +>> endobj +1590 0 obj << +/D [1586 0 R /XYZ 71.731 675.3674 null] +>> endobj +1591 0 obj << +/D [1586 0 R /XYZ 71.731 674.1221 null] +>> endobj +1592 0 obj << +/D [1586 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1593 0 obj << +/D [1586 0 R /XYZ 129.5143 655.0436 null] +>> endobj +1594 0 obj << +/D [1586 0 R /XYZ 71.731 653.604 null] +>> endobj +1595 0 obj << +/D [1586 0 R /XYZ 71.731 653.604 null] +>> endobj +1596 0 obj << +/D [1586 0 R /XYZ 139.477 637.1108 null] +>> endobj +1597 0 obj << +/D [1586 0 R /XYZ 139.477 637.1108 null] +>> endobj +1598 0 obj << +/D [1586 0 R /XYZ 76.7123 619.1781 null] +>> endobj +1599 0 obj << +/D [1586 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1600 0 obj << +/D [1586 0 R /XYZ 129.5143 601.2453 null] +>> endobj +1601 0 obj << +/D [1586 0 R /XYZ 71.731 599.0885 null] +>> endobj +1602 0 obj << +/D [1586 0 R /XYZ 71.731 599.0885 null] +>> endobj +1603 0 obj << +/D [1586 0 R /XYZ 139.477 583.3126 null] +>> endobj +1604 0 obj << +/D [1586 0 R /XYZ 71.731 581.873 null] +>> endobj +1605 0 obj << +/D [1586 0 R /XYZ 139.477 565.3798 null] +>> endobj +1606 0 obj << +/D [1586 0 R /XYZ 76.7123 547.4471 null] +>> endobj +1607 0 obj << +/D [1586 0 R /XYZ 129.5143 529.5143 null] +>> endobj +1608 0 obj << +/D [1586 0 R /XYZ 129.5143 529.5143 null] +>> endobj +1609 0 obj << +/D [1586 0 R /XYZ 71.731 528.0748 null] +>> endobj +1610 0 obj << +/D [1586 0 R /XYZ 129.5143 511.5816 null] +>> endobj +1611 0 obj << +/D [1586 0 R /XYZ 129.5143 511.5816 null] +>> endobj +1612 0 obj << +/D [1586 0 R /XYZ 71.731 489.4994 null] +>> endobj +1613 0 obj << +/D [1586 0 R /XYZ 71.731 478.6053 null] +>> endobj +1614 0 obj << +/D [1586 0 R /XYZ 71.731 477.36 null] +>> endobj +1615 0 obj << +/D [1586 0 R /XYZ 129.5143 458.2814 null] +>> endobj +644 0 obj << +/D [1586 0 R /XYZ 71.731 451.8606 null] +>> endobj +94 0 obj << +/D [1586 0 R /XYZ 184.4394 408.0458 null] +>> endobj +1616 0 obj << +/D [1586 0 R /XYZ 71.731 387.9054 null] +>> endobj +1617 0 obj << +/D [1586 0 R /XYZ 161.0655 375.1691 null] +>> endobj +1618 0 obj << +/D [1586 0 R /XYZ 71.731 363.0496 null] +>> endobj +1619 0 obj << +/D [1586 0 R /XYZ 71.731 331.6837 null] +>> endobj +1620 0 obj << +/D [1586 0 R /XYZ 168.8063 320.6735 null] +>> endobj +1621 0 obj << +/D [1586 0 R /XYZ 71.731 293.61 null] +>> endobj +1622 0 obj << +/D [1586 0 R /XYZ 71.731 252.4394 null] +>> endobj +1623 0 obj << +/D [1586 0 R /XYZ 71.731 233.9502 null] +>> endobj +1624 0 obj << +/D [1586 0 R /XYZ 71.731 202.3687 null] +>> endobj +1625 0 obj << +/D [1586 0 R /XYZ 181.5683 191.3584 null] +>> endobj +1626 0 obj << +/D [1586 0 R /XYZ 71.731 181.2962 null] +>> endobj +1627 0 obj << +/D [1586 0 R /XYZ 71.731 147.873 null] +>> endobj +1628 0 obj << +/D [1586 0 R /XYZ 71.731 136.7632 null] +>> endobj +1629 0 obj << +/D [1586 0 R /XYZ 71.731 135.5179 null] +>> endobj +1630 0 obj << +/D [1586 0 R /XYZ 129.5143 116.4393 null] +>> endobj +1631 0 obj << +/D [1586 0 R /XYZ 129.5143 116.4393 null] +>> endobj +1632 0 obj << +/D [1586 0 R /XYZ 71.731 114.9998 null] +>> endobj +1633 0 obj << +/D [1586 0 R /XYZ 71.731 114.9998 null] +>> endobj +1634 0 obj << +/D [1586 0 R /XYZ 139.477 98.5066 null] +>> endobj +1635 0 obj << +/D [1586 0 R /XYZ 139.477 98.5066 null] +>> endobj +1585 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1638 0 obj << +/Length 1225 +/Filter /FlateDecode +>> +stream +xÚ¥˜[£6ÇßçSð˜H×÷˺«Æ>˜Ž4@•üê–,,æÎG™VvŸ&û¼ØgùkzÚŽK[»®âvKˆKi f}Ùcƒ9=UÍ oïKYééu¼°.´¢ˆ+íÇÞ«6®ì”Ô™s·N6 òSn¼q§vWy}8H˜_Õ½ ò®Añm)%öT¥ÏSHßI4‚#Á¡qdsh:Y'î44®&7FtÊ,=´ÃsakJÿŒÌö%•)•1¡‚tdsÙÉÂ鉻¤ ‡>& +Òõq>\ö/©Íš‡×€«ˆj=(Bàz9TӉ…1R\kΑÍ%V' '–'î’Äú¸gÖ%–kãRÚâ¿ù[\ A »%âîýŸÍÀÅ RhèF„‡*ԕ̀ìeA¾¸ @Ž|xAÞÙ8y•òìÛ@v³´ß[ôÚ6ë²<¶ß«ê\¶ãÊfЧ©KŽ´†j PwdsÔ;Y˜º'îêC~ꮍôìë· Q#ÈÞvÍgœ$…-Ëi’\"õ ‘tds$;Y˜¤'î’C~’®S^Yßc<3mÔ Ìiy°Y½™Ì/eóU?™& 0‘¡§ª+›ƒÙÉÂ0=q—ÀúðÃtmó²úö§ª;‹$!k|ª:²9, Òw È¡?H×Æ[žØìeeO±™bÉ›†ˆÀ¡Ç¥+›ÁÙ˂8}qàùðâ¼³qŽËòK^$þ¼ÔZé¯íöõnš`ý^*0Ò؈ëõŸlu)Nåãän”S‚ xó»QW6³íeÁݨ/î‚ݨχÓpú{îú¸½Îün×T¬¾´-6©iҌŸ±Àß7C cÒ¾ó¼´ô/‡4¥—KW°…(×¼ +)ÍؘDBÒÞGÛ~ⶠÝa¯- +±B׬Åps%’LI7]ÛMÕÑN\ÿÕ÷­¥ðR߈ø’Um„B_ÒÒ¢¥8¶Y–_ÍØÖÁ§<³åÒ;'oéii¨ÝšˆU\@}W¶˜©`Bb„É@»²™ +îeÁ +öÅ]PÁ#þ÷É;u"ûš‡Nï{|78I«¯¯/qÇ®òRLwu‚47¬mȕʹ¡^lC¾¸ ÚÐȇ· ÝÙØ—æ”Ñÿž.¹â3hëÁúÖL×pÞ÷©ábÛ3T®¡gI3{ÌêhƧ¬‚jÈcú™j¯DOž™zþ­ráendstream +endobj +1637 0 obj << +/Type /Page +/Contents 1638 0 R +/Resources 1636 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1639 0 obj << +/D [1637 0 R /XYZ 71.731 729.2652 null] +>> endobj +1640 0 obj << +/D [1637 0 R /XYZ 76.7123 708.3437 null] +>> endobj +1641 0 obj << +/D [1637 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1642 0 obj << +/D [1637 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1643 0 obj << +/D [1637 0 R /XYZ 71.731 688.2541 null] +>> endobj +1644 0 obj << +/D [1637 0 R /XYZ 71.731 688.2541 null] +>> endobj +1645 0 obj << +/D [1637 0 R /XYZ 139.477 672.4782 null] +>> endobj +1646 0 obj << +/D [1637 0 R /XYZ 71.731 671.0386 null] +>> endobj +1647 0 obj << +/D [1637 0 R /XYZ 139.477 654.5454 null] +>> endobj +1648 0 obj << +/D [1637 0 R /XYZ 76.7123 636.6127 null] +>> endobj +1649 0 obj << +/D [1637 0 R /XYZ 129.5143 618.6799 null] +>> endobj +1650 0 obj << +/D [1637 0 R /XYZ 129.5143 618.6799 null] +>> endobj +1651 0 obj << +/D [1637 0 R /XYZ 71.731 617.2992 null] +>> endobj +1652 0 obj << +/D [1637 0 R /XYZ 71.731 617.2992 null] +>> endobj +1653 0 obj << +/D [1637 0 R /XYZ 139.477 600.7472 null] +>> endobj +1654 0 obj << +/D [1637 0 R /XYZ 139.477 600.7472 null] +>> endobj +1655 0 obj << +/D [1637 0 R /XYZ 71.731 598.5904 null] +>> endobj +1656 0 obj << +/D [1637 0 R /XYZ 139.477 582.8144 null] +>> endobj +1657 0 obj << +/D [1637 0 R /XYZ 139.477 582.8144 null] +>> endobj +1658 0 obj << +/D [1637 0 R /XYZ 71.731 580.6576 null] +>> endobj +1659 0 obj << +/D [1637 0 R /XYZ 139.477 564.8817 null] +>> endobj +1660 0 obj << +/D [1637 0 R /XYZ 139.477 564.8817 null] +>> endobj +1661 0 obj << +/D [1637 0 R /XYZ 71.731 562.7248 null] +>> endobj +1662 0 obj << +/D [1637 0 R /XYZ 139.477 546.9489 null] +>> endobj +1663 0 obj << +/D [1637 0 R /XYZ 139.477 546.9489 null] +>> endobj +1664 0 obj << +/D [1637 0 R /XYZ 71.731 544.7921 null] +>> endobj +1665 0 obj << +/D [1637 0 R /XYZ 139.477 529.0162 null] +>> endobj +1666 0 obj << +/D [1637 0 R /XYZ 139.477 529.0162 null] +>> endobj +1667 0 obj << +/D [1637 0 R /XYZ 71.731 526.8593 null] +>> endobj +1668 0 obj << +/D [1637 0 R /XYZ 139.477 511.0834 null] +>> endobj +1669 0 obj << +/D [1637 0 R /XYZ 139.477 511.0834 null] +>> endobj +1670 0 obj << +/D [1637 0 R /XYZ 71.731 508.9266 null] +>> endobj +1671 0 obj << +/D [1637 0 R /XYZ 139.477 493.1507 null] +>> endobj +1672 0 obj << +/D [1637 0 R /XYZ 139.477 493.1507 null] +>> endobj +1673 0 obj << +/D [1637 0 R /XYZ 71.731 455.2926 null] +>> endobj +1674 0 obj << +/D [1637 0 R /XYZ 71.731 442.2417 null] +>> endobj +1675 0 obj << +/D [1637 0 R /XYZ 71.731 440.9963 null] +>> endobj +1676 0 obj << +/D [1637 0 R /XYZ 129.5143 421.9178 null] +>> endobj +645 0 obj << +/D [1637 0 R /XYZ 71.731 414.7796 null] +>> endobj +98 0 obj << +/D [1637 0 R /XYZ 184.904 371.6822 null] +>> endobj +1677 0 obj << +/D [1637 0 R /XYZ 71.731 351.5418 null] +>> endobj +1678 0 obj << +/D [1637 0 R /XYZ 161.0655 338.8055 null] +>> endobj +1679 0 obj << +/D [1637 0 R /XYZ 71.731 326.686 null] +>> endobj +1680 0 obj << +/D [1637 0 R /XYZ 71.731 295.3201 null] +>> endobj +1681 0 obj << +/D [1637 0 R /XYZ 168.8063 284.3098 null] +>> endobj +1682 0 obj << +/D [1637 0 R /XYZ 71.731 257.2464 null] +>> endobj +1683 0 obj << +/D [1637 0 R /XYZ 71.731 240.8245 null] +>> endobj +1684 0 obj << +/D [1637 0 R /XYZ 71.731 209.2429 null] +>> endobj +1685 0 obj << +/D [1637 0 R /XYZ 181.5683 198.2326 null] +>> endobj +1686 0 obj << +/D [1637 0 R /XYZ 71.731 188.1704 null] +>> endobj +1687 0 obj << +/D [1637 0 R /XYZ 71.731 156.5988 null] +>> endobj +1688 0 obj << +/D [1637 0 R /XYZ 71.731 143.6374 null] +>> endobj +1689 0 obj << +/D [1637 0 R /XYZ 71.731 142.3921 null] +>> endobj +1690 0 obj << +/D [1637 0 R /XYZ 129.5143 123.3136 null] +>> endobj +1691 0 obj << +/D [1637 0 R /XYZ 129.5143 123.3136 null] +>> endobj +1692 0 obj << +/D [1637 0 R /XYZ 71.731 121.874 null] +>> endobj +1693 0 obj << +/D [1637 0 R /XYZ 71.731 121.874 null] +>> endobj +1694 0 obj << +/D [1637 0 R /XYZ 139.477 105.3808 null] +>> endobj +1695 0 obj << +/D [1637 0 R /XYZ 139.477 105.3808 null] +>> endobj +1636 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1698 0 obj << +/Length 1176 +/Filter /FlateDecode +>> +stream +xÚ¥X[o£8}ï¯à1‘ŠÛ؆>¬”½U»ÛEÌÓvT1àLÑ$qѨÿ~?&˜ËjÔœæØßñù®;üaG`$(&Žy ¶;|^yè]c4p•û ¸2Ãp™)‹×c*O­X ÷«#8Fœ )ìC«mYu\ÉëãA¾ìÒö(ׄ]EÃ*:nÈjؤh#ñC«ÝiÑô®1[Ñhߊ[ßä»E+p3Àx¨Uš}½ï‚Uêð}Ü?¶‹Kýå”ÆíúÛ{¹Åló>-.óó™¿$®›WÖŵØ]#]\“FŲ¨,úR òUú~üø4ÖW›¾x‰£JN+L9☈%… ؜¶¬°Åî…‡<ì +›4TÊgÑYZ4öb$$«4ÖGØU„ÊE.©hÀæTÔ°e-vר8äaWѤÑκ8ý Š}Çúôü¤ŽR9ƒ ˜ã2^Øfų¬ê"+F×ͅùù¾À ­Ê„Í´ª¶ØªlvW´*£”jÇßðH³ª“ïƒÜ¶ùÞ¥¸rDš´^<æýÜ.=Xãv™;Ôq,ËòXk¯ÁE"˜5nv™@" ´QžPÖf AàuØ.‚Í.Q:Ùo)ÔéBê2ÏþVÏkÕ†‚@ñ@x5ÉÞ¹/ò*¯Þ/ò¡ßq ¶n¯K õ⠍µ]’ìeÑ#½±þ¾Q]½Ýk- +Ôx͋WyŽÒÓý¨·¼ª¨ú}£Ï˜²«˜”“e\¤—*ͳ9ÒPf'=é²5uÃôšÙìšTy÷|“³.2nʵì|Åq^gjÒÄc±óÆ؇kßðP‰j‘øÈöû~Ð"Ô~™U)Ì/‡&².¦[1a0%[hÅ&l¦÷°ÅVl³»¢xX[ñ èÒþà³¨Ë {}ø-9݌wYÏíq7• ¢~2z1§ÈçKÁk fbW£C×btEäIØ×$1î*‡ u†–ÝU°Â~:VÕèD=º«l.V5l9V-v×Ī…‡1ÅèX5i\‡˜O¥žÓD…_ÓêŠiiˆ@,‹ilÀæ¤Ñ°ei,v×Hcáa‘Ƥq;!é9*ºv-Ý&èÚ"˜$4Ë!ßîŒ  ÂÙwOfüꉑª1Ìø¥˜ápòE’Åà?•Iendstream +endobj +1697 0 obj << +/Type /Page +/Contents 1698 0 R +/Resources 1696 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1486 0 R +>> endobj +1699 0 obj << +/D [1697 0 R /XYZ 71.731 729.2652 null] +>> endobj +1700 0 obj << +/D [1697 0 R /XYZ 76.7123 708.3437 null] +>> endobj +1701 0 obj << +/D [1697 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1702 0 obj << +/D [1697 0 R /XYZ 129.5143 690.4109 null] +>> endobj +1703 0 obj << +/D [1697 0 R /XYZ 71.731 689.0302 null] +>> endobj +1704 0 obj << +/D [1697 0 R /XYZ 71.731 689.0302 null] +>> endobj +1705 0 obj << +/D [1697 0 R /XYZ 139.477 672.4782 null] +>> endobj +1706 0 obj << +/D [1697 0 R /XYZ 139.477 672.4782 null] +>> endobj +1707 0 obj << +/D [1697 0 R /XYZ 71.731 670.3214 null] +>> endobj +1708 0 obj << +/D [1697 0 R /XYZ 139.477 654.5454 null] +>> endobj +1709 0 obj << +/D [1697 0 R /XYZ 139.477 654.5454 null] +>> endobj +1710 0 obj << +/D [1697 0 R /XYZ 71.731 652.3886 null] +>> endobj +1711 0 obj << +/D [1697 0 R /XYZ 139.477 636.6127 null] +>> endobj +1712 0 obj << +/D [1697 0 R /XYZ 139.477 636.6127 null] +>> endobj +1713 0 obj << +/D [1697 0 R /XYZ 71.731 634.4559 null] +>> endobj +1714 0 obj << +/D [1697 0 R /XYZ 139.477 618.6799 null] +>> endobj +1715 0 obj << +/D [1697 0 R /XYZ 139.477 618.6799 null] +>> endobj +1716 0 obj << +/D [1697 0 R /XYZ 71.731 580.8219 null] +>> endobj +1717 0 obj << +/D [1697 0 R /XYZ 71.731 567.7709 null] +>> endobj +1718 0 obj << +/D [1697 0 R /XYZ 71.731 566.5256 null] +>> endobj +1719 0 obj << +/D [1697 0 R /XYZ 129.5143 547.4471 null] +>> endobj +646 0 obj << +/D [1697 0 R /XYZ 71.731 540.3089 null] +>> endobj +102 0 obj << +/D [1697 0 R /XYZ 236.7399 497.2114 null] +>> endobj +1720 0 obj << +/D [1697 0 R /XYZ 71.731 473.7227 null] +>> endobj +1721 0 obj << +/D [1697 0 R /XYZ 161.0655 464.3347 null] +>> endobj +1722 0 obj << +/D [1697 0 R /XYZ 71.731 452.2152 null] +>> endobj +1723 0 obj << +/D [1697 0 R /XYZ 71.731 420.8494 null] +>> endobj +1724 0 obj << +/D [1697 0 R /XYZ 168.8063 409.8391 null] +>> endobj +1725 0 obj << +/D [1697 0 R /XYZ 71.731 382.7757 null] +>> endobj +1726 0 obj << +/D [1697 0 R /XYZ 71.731 351.4098 null] +>> endobj +1727 0 obj << +/D [1697 0 R /XYZ 71.731 334.7722 null] +>> endobj +1728 0 obj << +/D [1697 0 R /XYZ 71.731 303.1906 null] +>> endobj +1729 0 obj << +/D [1697 0 R /XYZ 181.5683 292.1803 null] +>> endobj +1730 0 obj << +/D [1697 0 R /XYZ 71.731 282.1181 null] +>> endobj +1731 0 obj << +/D [1697 0 R /XYZ 71.731 248.695 null] +>> endobj +1732 0 obj << +/D [1697 0 R /XYZ 71.731 237.5851 null] +>> endobj +1733 0 obj << +/D [1697 0 R /XYZ 71.731 236.3398 null] +>> endobj +1734 0 obj << +/D [1697 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1735 0 obj << +/D [1697 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1736 0 obj << +/D [1697 0 R /XYZ 71.731 215.8217 null] +>> endobj +1737 0 obj << +/D [1697 0 R /XYZ 71.731 215.8217 null] +>> endobj +1738 0 obj << +/D [1697 0 R /XYZ 139.477 199.3285 null] +>> endobj +1739 0 obj << +/D [1697 0 R /XYZ 139.477 199.3285 null] +>> endobj +1740 0 obj << +/D [1697 0 R /XYZ 76.7123 181.3958 null] +>> endobj +1741 0 obj << +/D [1697 0 R /XYZ 129.5143 163.463 null] +>> endobj +1742 0 obj << +/D [1697 0 R /XYZ 129.5143 163.463 null] +>> endobj +1743 0 obj << +/D [1697 0 R /XYZ 71.731 161.3062 null] +>> endobj +1744 0 obj << +/D [1697 0 R /XYZ 71.731 161.3062 null] +>> endobj +1745 0 obj << +/D [1697 0 R /XYZ 139.477 145.5303 null] +>> endobj +1746 0 obj << +/D [1697 0 R /XYZ 71.731 144.0907 null] +>> endobj +1747 0 obj << +/D [1697 0 R /XYZ 139.477 127.5975 null] +>> endobj +1748 0 obj << +/D [1697 0 R /XYZ 76.7123 109.6647 null] +>> endobj +1696 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1751 0 obj << +/Length 1263 +/Filter /FlateDecode +>> +stream +xڝ˜ËŽ£8†÷õ,+RÅã Æv-FJϥ箨'³š•¨àTPˆ¸t«Þ~llˆP­, ÉoŸßŸí(€êƒ†#ê‚ÀÅÁþtƒWõ×Ç;d%k«Y»¢»»ï~&0@D8 +v‡€ˆPŒ`À)âÁ.ù÷þ‡c|®e¹Zc +ï10×mç²þ#~1_7Û_Í͟²>Iµúo÷ÛÝO»>>% ®‚Lš !"XcFÔ«BHJSƒ°~0X*ƒH¦×õ2=š'ŒéÐÂX Ü»¸ÃëÅG×jìƒð€+¨QØúPC¦($×>>Ë·çC*3êµ~™̹Pq´ôÑ ­ê²Ù×cï¶÷H@"ÏˬS­]مÒÉázíe7™©8Þ¸·™u­Æ>®™BÆ®mhdõÛYz€…P,ðXš¿>˜/¿¯0½—+DïßÌ]O~˜ «øÏÁtdS0;Ùü0] +¦‡£Z2„)ÇïàøEÿgM 3X«XXˆ(XS8´í蓬›2¯Gãî–hÀ!%3 ޕM,ø^6»à}q,xŸb?ﮏ4¯-¿¤FöÕ|ù¼BÐò|NóÛ¤ð{s Õ=2·éÁNG³ß˪:4™@5ÔnÙNöš2À8!í`B£68ŠjÎøý&Ñ“튨¸¥\¹oI1À1TÐõYÀ"³kmË¢.ôÊyì[\ò̶]c"Ä͚Ý$ÉV–:B?²¸©–Ĺýëù B¬wÂv¬c'ë®c×ɏ²Ú—é¹N‹|Ê QZ„{/•‰›KîND¼ßM^Ûóm“;)Þù³üÏrŸ¶?ÙéJsïhl·¥47M%;ì¢>ÊòkZÙyÐS7YíkڅÕX ™ Ý·C}’VñKÖ{y°ÃÛ­¸²aîe®›ØŽò+½ sóÏ9‰ki&TO¥ž°ÞŠ@DXä.x»Ó¥‡·¥õޜ·–†Äz¤`im²¬hít´>™¬–æuœœÒ¼ËâtiÌ­Nª¸ŒORTÛ!Vå¤b®þqeÛa/›Ý}ql‡#þúçʇÞ<Øp òÕ=ƒBS·—yîc½¸Ê¦¼}®cJŸ9×]ÙĹÞËfÏu_Üçúȇ÷\¿²±Q\Lî¯+£PÕ÷·÷ëÉtgÖrqÙnf¯>Ž"4w˜»²©ìídóÙ뉻${‡>nd¯ëÃn^7 x]iaNÞUÀ#¡Š/ÌéLnº²‰Üìe³¹é‹» 7G>¼¹yeã%-|5'Wç†gÑ_’òCZ¼–ñù¸Ò'òM|"èÜÒveSø:Ù<>OÜ%ø†>üø\‡´¬êç\7ùŏ©>î¾è#HڕÝõåFdŽçE5…ÓªæiŽƒ.90ágéxÈ⠒(&@þ­J›Ipúi”ÀYrŽl +]'›g牻ÞЇŸžk£Në̇Ny&\° v»¡÷]k?=ÌlvtdSô:Ù<=OÜ%ô†>üô\M™}Ó6øKq²…ô9~PáÙ@G6°“ÍôÄ]pèÃеq>ù·¦S<™4=˜=°9½¨çàÁ¨ìûҐõÄ%&_©:šñUŠ¹*h…è{jŸÆáÍ÷£ž€ÿþfèäendstream +endobj +1750 0 obj << +/Type /Page +/Contents 1751 0 R +/Resources 1749 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1752 0 obj << +/D [1750 0 R /XYZ 71.731 729.2652 null] +>> endobj +1753 0 obj << +/D [1750 0 R /XYZ 129.5143 708.3437 null] +>> endobj +1754 0 obj << +/D [1750 0 R /XYZ 129.5143 708.3437 null] +>> endobj +1755 0 obj << +/D [1750 0 R /XYZ 71.731 706.9629 null] +>> endobj +1756 0 obj << +/D [1750 0 R /XYZ 71.731 706.9629 null] +>> endobj +1757 0 obj << +/D [1750 0 R /XYZ 139.477 690.4109 null] +>> endobj +1758 0 obj << +/D [1750 0 R /XYZ 139.477 690.4109 null] +>> endobj +1759 0 obj << +/D [1750 0 R /XYZ 71.731 688.2541 null] +>> endobj +1760 0 obj << +/D [1750 0 R /XYZ 139.477 672.4782 null] +>> endobj +1761 0 obj << +/D [1750 0 R /XYZ 139.477 672.4782 null] +>> endobj +1762 0 obj << +/D [1750 0 R /XYZ 71.731 634.6202 null] +>> endobj +1763 0 obj << +/D [1750 0 R /XYZ 71.731 621.5692 null] +>> endobj +1764 0 obj << +/D [1750 0 R /XYZ 71.731 620.3239 null] +>> endobj +1765 0 obj << +/D [1750 0 R /XYZ 129.5143 601.2453 null] +>> endobj +647 0 obj << +/D [1750 0 R /XYZ 71.731 594.1072 null] +>> endobj +106 0 obj << +/D [1750 0 R /XYZ 205.6832 551.0097 null] +>> endobj +1766 0 obj << +/D [1750 0 R /XYZ 71.731 530.8693 null] +>> endobj +1767 0 obj << +/D [1750 0 R /XYZ 161.0655 518.133 null] +>> endobj +1768 0 obj << +/D [1750 0 R /XYZ 71.731 506.0135 null] +>> endobj +1769 0 obj << +/D [1750 0 R /XYZ 71.731 474.6476 null] +>> endobj +1770 0 obj << +/D [1750 0 R /XYZ 168.8063 463.6373 null] +>> endobj +1771 0 obj << +/D [1750 0 R /XYZ 71.731 436.5739 null] +>> endobj +1772 0 obj << +/D [1750 0 R /XYZ 71.731 405.208 null] +>> endobj +1773 0 obj << +/D [1750 0 R /XYZ 71.731 388.5704 null] +>> endobj +1774 0 obj << +/D [1750 0 R /XYZ 71.731 356.9889 null] +>> endobj +1775 0 obj << +/D [1750 0 R /XYZ 181.5683 345.9786 null] +>> endobj +1776 0 obj << +/D [1750 0 R /XYZ 71.731 335.9164 null] +>> endobj +1777 0 obj << +/D [1750 0 R /XYZ 71.731 302.4932 null] +>> endobj +1778 0 obj << +/D [1750 0 R /XYZ 71.731 291.3834 null] +>> endobj +1779 0 obj << +/D [1750 0 R /XYZ 71.731 290.1381 null] +>> endobj +1780 0 obj << +/D [1750 0 R /XYZ 129.5143 271.0595 null] +>> endobj +1781 0 obj << +/D [1750 0 R /XYZ 129.5143 271.0595 null] +>> endobj +1782 0 obj << +/D [1750 0 R /XYZ 71.731 269.62 null] +>> endobj +1783 0 obj << +/D [1750 0 R /XYZ 71.731 269.62 null] +>> endobj +1784 0 obj << +/D [1750 0 R /XYZ 139.477 253.1268 null] +>> endobj +1785 0 obj << +/D [1750 0 R /XYZ 139.477 253.1268 null] +>> endobj +1786 0 obj << +/D [1750 0 R /XYZ 76.7123 235.194 null] +>> endobj +1787 0 obj << +/D [1750 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1788 0 obj << +/D [1750 0 R /XYZ 129.5143 217.2613 null] +>> endobj +1789 0 obj << +/D [1750 0 R /XYZ 71.731 215.8805 null] +>> endobj +1790 0 obj << +/D [1750 0 R /XYZ 71.731 215.8805 null] +>> endobj +1791 0 obj << +/D [1750 0 R /XYZ 139.477 199.3285 null] +>> endobj +1792 0 obj << +/D [1750 0 R /XYZ 139.477 199.3285 null] +>> endobj +1793 0 obj << +/D [1750 0 R /XYZ 71.731 197.1717 null] +>> endobj +1794 0 obj << +/D [1750 0 R /XYZ 139.477 181.3958 null] +>> endobj +1795 0 obj << +/D [1750 0 R /XYZ 139.477 181.3958 null] +>> endobj +1796 0 obj << +/D [1750 0 R /XYZ 71.731 179.2389 null] +>> endobj +1797 0 obj << +/D [1750 0 R /XYZ 139.477 163.463 null] +>> endobj +1798 0 obj << +/D [1750 0 R /XYZ 139.477 163.463 null] +>> endobj +1799 0 obj << +/D [1750 0 R /XYZ 71.731 161.3062 null] +>> endobj +1800 0 obj << +/D [1750 0 R /XYZ 139.477 145.5303 null] +>> endobj +1801 0 obj << +/D [1750 0 R /XYZ 139.477 145.5303 null] +>> endobj +1802 0 obj << +/D [1750 0 R /XYZ 71.731 143.3734 null] +>> endobj +1803 0 obj << +/D [1750 0 R /XYZ 139.477 127.5975 null] +>> endobj +1804 0 obj << +/D [1750 0 R /XYZ 139.477 127.5975 null] +>> endobj +1805 0 obj << +/D [1750 0 R /XYZ 71.731 125.4407 null] +>> endobj +1806 0 obj << +/D [1750 0 R /XYZ 139.477 109.6647 null] +>> endobj +1807 0 obj << +/D [1750 0 R /XYZ 139.477 109.6647 null] +>> endobj +1808 0 obj << +/D [1750 0 R /XYZ 71.731 107.5079 null] +>> endobj +1749 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1812 0 obj << +/Length 1196 +/Filter /FlateDecode +>> +stream +xÚ¥Xßo«6~ï_ÁÛéÆÃ6Æv&u»Ût§mŠî²§uª(8-R•!êúßï€m☦ªâG>Îùüù;>Åð‡#Ž§p ‘”‘(?ÞÅÑ üô󶐍Ål|Ð÷»»o¢q$‘LIíö•)b<‰8%H0,¢]ñ×ê‡×ì­Uz½!,^dŽÛCV©ö×ìÙ\>l¿˜“ßTûZÍúïÝ/w?î†üŒr$$™$™Ä%© Ñ†ÄĤ( !NÅOʇÁq„»Â`ÜëFóH»f‡a¸1Idäty¯gî©1*"¢¦IσJ”p~Iã-kš÷Z•ž÷y†„à’tÀ{£kÓê²zùdÕÎóúTµæ¢´Æñª‹Öß)+sÌõÇ[û³þ±¹µ¯õq4z§S*c”àXΨîÃ&T`³ª‡ò.P}Ä#¨ú uÌÊC@ràL…ä’ouyÌô‡¹P›>Nž…VMox00Ä×nXŒD,“>ÚW՞tÕ܏†A(†!œ`.pXv‡Úø°³ì’ÇFöQ´›²6Ä$˜÷¶ìî© ³’çé÷y”Ukuü]­ [½[ë*ÝÔÕSi}ÛYõ;sêY¶ÜÛé8å9½?¹ „¡p‹D?ÝÆ”öÚÊL• <ÎÅê¡èj¤Ø®)̟^c¶‚Ô»µ€ºù£lU¨9$å»Å§&âV×mÝ~¼©ûታç쳂QŠ…±ÜCQlûaz¹†Ñf§öõӕOµ~ê}jhà {ûP¿”ÕÓsÖ¨^ž1åcàSþ¬š\—omYWS¤),ý)H7&{ûjé6o*/㘨Â'lQõº…m_öW`?Rióf­²ÂÖ[fGu|v}¨¾Ò%°ŠU–ÒºÖ.žî§Ì %…R–Ò~ º/NUXjŸkÕ¸vyÍ_³êE³fà"{Ç_Ì`]º¥”§þZ`P7ým‡±ï ›­Åא^¿— ½d懺/77 _ëƒj–:7+ŽÐI¦Úv•éì¨`«0±ØQh‚s6³Øù°‰Ån€Í.v¡¼ »Ëã» ]Q‡zL‚b<ê0§Ü­ŒÃª{^Um™g]Éúȓ1q°yèsR$b¦yû°‰æ=Àf›w(ï‚æ=âlÞ4@³½ ¨Ë ÊعNlš²M¸‹5ìÔ¨›î%Œ!¸ 3îõaî`³î å]àޏ°{/xŒûP@m ûr­vév¤µöå¿íXx'À"Ûäû°)Ç:ؼcy—86ÀÃÛ÷8Çú4Î۞?׸ʢ3aßõmiÀ"„ÑÙbö`SÒ8ؼ4¼K¤ ðHãÓøϛë`=bAaã.æêчMÔ㛭ÇPÞõ8â®Ç Áí_ $1fðîœÊÿW“8…(ŒÍÕ¤›0ޛ5^(ïã…xŒwAã\“ç­ø¢šÄð>À™«I6%ƒÍKÈ»Dš€4>‹š<«ÓÊÜí{µêTúǼíBÝH(h÷ºË&_wí¨D S9ùÊÌ?Q1"`%å©ÏÃ7?8þ ‘cendstream +endobj +1811 0 obj << +/Type /Page +/Contents 1812 0 R +/Resources 1810 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1813 0 obj << +/D [1811 0 R /XYZ 71.731 729.2652 null] +>> endobj +1814 0 obj << +/D [1811 0 R /XYZ 139.477 708.3437 null] +>> endobj +1815 0 obj << +/D [1811 0 R /XYZ 139.477 708.3437 null] +>> endobj +1816 0 obj << +/D [1811 0 R /XYZ 71.731 706.1869 null] +>> endobj +1817 0 obj << +/D [1811 0 R /XYZ 139.477 690.4109 null] +>> endobj +1818 0 obj << +/D [1811 0 R /XYZ 139.477 690.4109 null] +>> endobj +1819 0 obj << +/D [1811 0 R /XYZ 71.731 652.5529 null] +>> endobj +1820 0 obj << +/D [1811 0 R /XYZ 71.731 639.5019 null] +>> endobj +1821 0 obj << +/D [1811 0 R /XYZ 71.731 638.2566 null] +>> endobj +1822 0 obj << +/D [1811 0 R /XYZ 129.5143 619.1781 null] +>> endobj +648 0 obj << +/D [1811 0 R /XYZ 71.731 612.0399 null] +>> endobj +110 0 obj << +/D [1811 0 R /XYZ 256.9159 568.9424 null] +>> endobj +1823 0 obj << +/D [1811 0 R /XYZ 71.731 548.8021 null] +>> endobj +1824 0 obj << +/D [1811 0 R /XYZ 161.0655 536.0657 null] +>> endobj +1825 0 obj << +/D [1811 0 R /XYZ 71.731 523.9463 null] +>> endobj +1826 0 obj << +/D [1811 0 R /XYZ 71.731 492.5804 null] +>> endobj +1827 0 obj << +/D [1811 0 R /XYZ 168.8063 481.5701 null] +>> endobj +1828 0 obj << +/D [1811 0 R /XYZ 71.731 454.5067 null] +>> endobj +1829 0 obj << +/D [1811 0 R /XYZ 71.731 426.4285 null] +>> endobj +1830 0 obj << +/D [1811 0 R /XYZ 71.731 395.4924 null] +>> endobj +1831 0 obj << +/D [1811 0 R /XYZ 181.5683 383.8366 null] +>> endobj +1832 0 obj << +/D [1811 0 R /XYZ 71.731 373.7744 null] +>> endobj +1833 0 obj << +/D [1811 0 R /XYZ 71.731 342.2028 null] +>> endobj +1834 0 obj << +/D [1811 0 R /XYZ 71.731 329.2414 null] +>> endobj +1835 0 obj << +/D [1811 0 R /XYZ 71.731 327.9961 null] +>> endobj +1836 0 obj << +/D [1811 0 R /XYZ 129.5143 308.9175 null] +>> endobj +1837 0 obj << +/D [1811 0 R /XYZ 129.5143 308.9175 null] +>> endobj +1838 0 obj << +/D [1811 0 R /XYZ 71.731 307.478 null] +>> endobj +1839 0 obj << +/D [1811 0 R /XYZ 71.731 307.478 null] +>> endobj +1840 0 obj << +/D [1811 0 R /XYZ 139.477 290.9848 null] +>> endobj +1841 0 obj << +/D [1811 0 R /XYZ 139.477 290.9848 null] +>> endobj +1842 0 obj << +/D [1811 0 R /XYZ 76.7123 273.052 null] +>> endobj +1843 0 obj << +/D [1811 0 R /XYZ 129.5143 255.1193 null] +>> endobj +1844 0 obj << +/D [1811 0 R /XYZ 129.5143 255.1193 null] +>> endobj +1845 0 obj << +/D [1811 0 R /XYZ 71.731 252.9625 null] +>> endobj +1846 0 obj << +/D [1811 0 R /XYZ 71.731 252.9625 null] +>> endobj +1847 0 obj << +/D [1811 0 R /XYZ 139.477 237.1865 null] +>> endobj +1848 0 obj << +/D [1811 0 R /XYZ 71.731 235.747 null] +>> endobj +1849 0 obj << +/D [1811 0 R /XYZ 139.477 219.2538 null] +>> endobj +1850 0 obj << +/D [1811 0 R /XYZ 76.7123 201.321 null] +>> endobj +1851 0 obj << +/D [1811 0 R /XYZ 129.5143 183.3883 null] +>> endobj +1852 0 obj << +/D [1811 0 R /XYZ 129.5143 183.3883 null] +>> endobj +1853 0 obj << +/D [1811 0 R /XYZ 71.731 181.2315 null] +>> endobj +1854 0 obj << +/D [1811 0 R /XYZ 71.731 181.2315 null] +>> endobj +1855 0 obj << +/D [1811 0 R /XYZ 139.477 165.4555 null] +>> endobj +1856 0 obj << +/D [1811 0 R /XYZ 71.731 164.016 null] +>> endobj +1857 0 obj << +/D [1811 0 R /XYZ 139.477 147.5228 null] +>> endobj +1858 0 obj << +/D [1811 0 R /XYZ 71.731 109.6647 null] +>> endobj +1859 0 obj << +/D [1811 0 R /XYZ 71.731 96.6138 null] +>> endobj +1810 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1862 0 obj << +/Length 1038 +/Filter /FlateDecode +>> +stream +xÚ¥X[£6}Ÿ_Ác"׌í}K¯Úª•¢Ýô©SØàì ˆ Ñjÿ}?À&&q©šÈpìïøøÛ@" $ ªM9Žç}…G¿¿ ‰-&öA?^~üáH!•Ò4:œ"¦RÄE F‘äDF‡üŸÍÏïÙ¥ÕfSŽ7 ×}™Uºý3û2üÜí?7éö½Î›í¿‡?^~=Œõ9HI(2K2!% «(¦)JxEˆBœƒÁ±„‰q0TEPG`Ò fč°n4¯”ò{v„Rùºº÷××*Èã&*!s’°)¢j$#Ã¥8 ×æz<ê¦9]ˎ&ôü1’®³˜ $$cpƒe<í;£ð¼›!7»|Kð&ßoÞÀ¤¾iê강xS.‹£¶ú$Å g7ë"øíMÝÖí÷‹þ0¶Ð"íYض1TM‰T}ƒ]žïµ¹+֏èsœ]Ûw;ÞKz+ò·Ú¼ésV”öAÓ5±ÿ¯²³†v$@7vÕ}º¿èæhŠK[ÔÕaþNéH¸ +·ï–isÑÇâcªsŸ«EÕKè~6 Owh¿«ÂÎJ£³ü»ý1\ÎúüÅ¥­¾ï¤¯`åª,mLm\‡¦Ÿ`0(Ä¥lfÝa‹ëN¨îŠu灓ž|ãº3áÑ1 Mî*tvî[s=ºEj\à»öºj‹cÖeÍG^ïMè(HŒÇIXX‡Š}ØMXÒí\“9ØSaaò1MT°îsa]«GSa™B‰S;ÐeØüêrˆ[ûê½¾EõÕéõÛ äïÆm8Eޙ°ßÓÌsià“µf6'ƒ-K¨»Fš€4>I4÷¦8gÆnÒ:îM7,…yn`s|šG*(Ü°¥<ú°™<Ž°Å<†ê®Èãp'<îl4J G.!ÿ_)OPJÉR}،åFØ¢åBuWX.ÄãÑr·4z'çUq¤p¨M¥\Š£›ÓÆÁ–µ Ô]£M€G@ŸÆ$Žž<ÎqÐ=ô@ùðV$±âþÁöùq¤%œ/½fú°™€Ž°Å€†ê®hˆGà5sÂcåk¦OÓ~*H$’$U³_<ÌãÇNáØI”{êßTéÓO‚ÿ|[Ðâendstream +endobj +1861 0 obj << +/Type /Page +/Contents 1862 0 R +/Resources 1860 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1863 0 obj << +/D [1861 0 R /XYZ 71.731 729.2652 null] +>> endobj +1864 0 obj << +/D [1861 0 R /XYZ 71.731 741.2204 null] +>> endobj +1865 0 obj << +/D [1861 0 R /XYZ 71.731 718.3063 null] +>> endobj +1866 0 obj << +/D [1861 0 R /XYZ 129.5143 708.3437 null] +>> endobj +649 0 obj << +/D [1861 0 R /XYZ 71.731 701.9228 null] +>> endobj +114 0 obj << +/D [1861 0 R /XYZ 265.5406 658.1081 null] +>> endobj +1867 0 obj << +/D [1861 0 R /XYZ 71.731 637.9677 null] +>> endobj +1868 0 obj << +/D [1861 0 R /XYZ 161.0655 625.2314 null] +>> endobj +1869 0 obj << +/D [1861 0 R /XYZ 71.731 613.1119 null] +>> endobj +1870 0 obj << +/D [1861 0 R /XYZ 71.731 581.746 null] +>> endobj +1871 0 obj << +/D [1861 0 R /XYZ 168.8063 570.7357 null] +>> endobj +1872 0 obj << +/D [1861 0 R /XYZ 71.731 543.6723 null] +>> endobj +1873 0 obj << +/D [1861 0 R /XYZ 71.731 517.4456 null] +>> endobj +1874 0 obj << +/D [1861 0 R /XYZ 71.731 484.6581 null] +>> endobj +1875 0 obj << +/D [1861 0 R /XYZ 181.5683 473.0022 null] +>> endobj +1876 0 obj << +/D [1861 0 R /XYZ 71.731 462.94 null] +>> endobj +1877 0 obj << +/D [1861 0 R /XYZ 71.731 429.5169 null] +>> endobj +1878 0 obj << +/D [1861 0 R /XYZ 71.731 418.407 null] +>> endobj +1879 0 obj << +/D [1861 0 R /XYZ 71.731 417.1617 null] +>> endobj +1880 0 obj << +/D [1861 0 R /XYZ 129.5143 398.0832 null] +>> endobj +1881 0 obj << +/D [1861 0 R /XYZ 129.5143 398.0832 null] +>> endobj +1882 0 obj << +/D [1861 0 R /XYZ 71.731 396.6436 null] +>> endobj +1883 0 obj << +/D [1861 0 R /XYZ 71.731 396.6436 null] +>> endobj +1884 0 obj << +/D [1861 0 R /XYZ 139.477 380.1504 null] +>> endobj +1885 0 obj << +/D [1861 0 R /XYZ 139.477 380.1504 null] +>> endobj +1886 0 obj << +/D [1861 0 R /XYZ 76.7123 362.2177 null] +>> endobj +1887 0 obj << +/D [1861 0 R /XYZ 129.5143 344.2849 null] +>> endobj +1888 0 obj << +/D [1861 0 R /XYZ 129.5143 344.2849 null] +>> endobj +1889 0 obj << +/D [1861 0 R /XYZ 71.731 342.1281 null] +>> endobj +1890 0 obj << +/D [1861 0 R /XYZ 71.731 342.1281 null] +>> endobj +1891 0 obj << +/D [1861 0 R /XYZ 139.477 326.3522 null] +>> endobj +1892 0 obj << +/D [1861 0 R /XYZ 71.731 324.9126 null] +>> endobj +1893 0 obj << +/D [1861 0 R /XYZ 139.477 308.4194 null] +>> endobj +1894 0 obj << +/D [1861 0 R /XYZ 76.7123 290.4867 null] +>> endobj +1895 0 obj << +/D [1861 0 R /XYZ 129.5143 272.5539 null] +>> endobj +1896 0 obj << +/D [1861 0 R /XYZ 129.5143 272.5539 null] +>> endobj +1897 0 obj << +/D [1861 0 R /XYZ 71.731 270.3971 null] +>> endobj +1898 0 obj << +/D [1861 0 R /XYZ 71.731 270.3971 null] +>> endobj +1899 0 obj << +/D [1861 0 R /XYZ 139.477 254.6212 null] +>> endobj +1900 0 obj << +/D [1861 0 R /XYZ 71.731 253.1816 null] +>> endobj +1901 0 obj << +/D [1861 0 R /XYZ 139.477 236.6884 null] +>> endobj +1902 0 obj << +/D [1861 0 R /XYZ 71.731 198.8304 null] +>> endobj +1903 0 obj << +/D [1861 0 R /XYZ 71.731 185.7794 null] +>> endobj +1904 0 obj << +/D [1861 0 R /XYZ 71.731 184.5341 null] +>> endobj +1905 0 obj << +/D [1861 0 R /XYZ 129.5143 165.4555 null] +>> endobj +650 0 obj << +/D [1861 0 R /XYZ 71.731 159.0347 null] +>> endobj +1860 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1908 0 obj << +/Length 916 +/Filter /FlateDecode +>> +stream +xÚµWKo£0¾÷Wp$Rñú±é-ûªºÚ•¢*·íªbÁiˆ€¨Ú¿clÀò¸T9Øàof>ŒÇâaøO$ 4F4âÔK÷wØ{ƒ¥Ç;b!Å.èóúîÓw†½Å¼õÆcq„¸=Á(’œHoýö¿l“C£ªE@9ö)2ãj—ªù™ü5ËՓ™üRͶÌêşõ»oë>>gÅ‚\$Ù£¦4)ñˆ@”ðPóìvŒ#Dˆˆ[šіœþ2[ìgÏåNi"`;› ’ /Л‘h­WUٔͿƒzè-$XDm8kP‚""M¸efü·»~Á'Çf{o+XxÍ3ûT${2C%è<»T¾ª:­òC“—Å%2 >UD{2µ –ؘjA¹ÿ>ÐAÚ¨ELD­Ù³jŽUa-‰òëcšªºÞwv­irÜ5_6[U½çµq}ËƖ»]ÙÒR™q¡¬o<Éöyqk¨Õ‚p?©@yÈ\ÂMGBbÄ9^ÈaÌfÓ±G.̤cìAª +L4ƒ©7Má…R>‰ )ÊBBg㞎ÎjʃIG5‡†“y輜‘†ëò`?ySÓæþäDk{U4yšèŒt‘ÇJM7ØQ`1’$âóÂv¨À… Â}¸Gê`g……iÏÆ=/lg5å1VC!Æ4– ‹©v3êr8e!ÒS}óâ­ÓwFÖ½q×ΛҌÇZÏ^ÌPÌɵäP—r×¢®§î4è-™{BâLâ:$l+àq,ÇÚæE—¸CUÎ3-ð Æn¯s2ÁA×*€ » b»*ã\Ütœð˜rÄC_@7W€!C»ë‚ÂW§%Ö^çk+´ ’^Sց]R¶ƒ]Wv&î-ÊÎðÄ”uy Ywöö´ÂÚ—@×gÉ þqŒ(ã¢k`Ø´Y/$ܵ«Ã>d1ÜjuY|tSccÂÍÙU¦ù絬^urÙ·‡ÖÀ¾Wû$ß}pÛóX%E׎@5µÒTj}6×Ôk÷½#ˆC}7Ú=iÇ,òÓ¤0“²Øý3³7×L+=QéÖ̒"3(ݺkf¼¥`ݵìb}b }tïÿye¦uÞ¨™ùR7C§Zð +RÅÒµ8Áenhrît‹èVÛÀ‡RߧñÅ,fú‡…S E,Ž{OíAbgÿ~Ìüˆšxendstream +endobj +1907 0 obj << +/Type /Page +/Contents 1908 0 R +/Resources 1906 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1909 0 obj << +/D [1907 0 R /XYZ 71.731 729.2652 null] +>> endobj +118 0 obj << +/D [1907 0 R /XYZ 185.4033 706.1179 null] +>> endobj +1910 0 obj << +/D [1907 0 R /XYZ 71.731 685.9775 null] +>> endobj +1911 0 obj << +/D [1907 0 R /XYZ 161.0655 673.2412 null] +>> endobj +1912 0 obj << +/D [1907 0 R /XYZ 71.731 661.1217 null] +>> endobj +1913 0 obj << +/D [1907 0 R /XYZ 71.731 577.1118 null] +>> endobj +1914 0 obj << +/D [1907 0 R /XYZ 71.731 544.3242 null] +>> endobj +1915 0 obj << +/D [1907 0 R /XYZ 181.5683 532.6683 null] +>> endobj +1916 0 obj << +/D [1907 0 R /XYZ 71.731 522.6062 null] +>> endobj +1917 0 obj << +/D [1907 0 R /XYZ 71.731 491.0346 null] +>> endobj +1918 0 obj << +/D [1907 0 R /XYZ 71.731 478.0732 null] +>> endobj +1919 0 obj << +/D [1907 0 R /XYZ 71.731 476.8278 null] +>> endobj +1920 0 obj << +/D [1907 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1921 0 obj << +/D [1907 0 R /XYZ 129.5143 457.7493 null] +>> endobj +1922 0 obj << +/D [1907 0 R /XYZ 71.731 456.3097 null] +>> endobj +1923 0 obj << +/D [1907 0 R /XYZ 71.731 456.3097 null] +>> endobj +1924 0 obj << +/D [1907 0 R /XYZ 139.477 439.8165 null] +>> endobj +1925 0 obj << +/D [1907 0 R /XYZ 139.477 439.8165 null] +>> endobj +1926 0 obj << +/D [1907 0 R /XYZ 76.7123 421.8838 null] +>> endobj +1927 0 obj << +/D [1907 0 R /XYZ 129.5143 403.951 null] +>> endobj +1928 0 obj << +/D [1907 0 R /XYZ 129.5143 403.951 null] +>> endobj +1929 0 obj << +/D [1907 0 R /XYZ 71.731 402.5115 null] +>> endobj +1930 0 obj << +/D [1907 0 R /XYZ 129.5143 386.0183 null] +>> endobj +1931 0 obj << +/D [1907 0 R /XYZ 129.5143 386.0183 null] +>> endobj +1932 0 obj << +/D [1907 0 R /XYZ 71.731 363.9362 null] +>> endobj +1933 0 obj << +/D [1907 0 R /XYZ 71.731 353.042 null] +>> endobj +1934 0 obj << +/D [1907 0 R /XYZ 71.731 351.7967 null] +>> endobj +1935 0 obj << +/D [1907 0 R /XYZ 129.5143 332.7182 null] +>> endobj +651 0 obj << +/D [1907 0 R /XYZ 71.731 326.2973 null] +>> endobj +122 0 obj << +/D [1907 0 R /XYZ 262.6488 282.4825 null] +>> endobj +1936 0 obj << +/D [1907 0 R /XYZ 71.731 262.3422 null] +>> endobj +1937 0 obj << +/D [1907 0 R /XYZ 161.0655 249.6058 null] +>> endobj +1938 0 obj << +/D [1907 0 R /XYZ 71.731 237.4863 null] +>> endobj +1939 0 obj << +/D [1907 0 R /XYZ 71.731 206.1205 null] +>> endobj +1940 0 obj << +/D [1907 0 R /XYZ 168.8063 195.1102 null] +>> endobj +1941 0 obj << +/D [1907 0 R /XYZ 71.731 168.0468 null] +>> endobj +1942 0 obj << +/D [1907 0 R /XYZ 71.731 136.6809 null] +>> endobj +1943 0 obj << +/D [1907 0 R /XYZ 71.731 120.0433 null] +>> endobj +1906 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1946 0 obj << +/Length 1053 +/Filter /FlateDecode +>> +stream +xÚ­X]›8}Ÿ_Ác"M¼þĸ+UJÛíª«])êfŸ:«ˆÏ ˆªù÷{Á†˜Ä|¬Tå®}Ï=>Ç\‡>$Iª  Ž§¼À£ßˆ ÙؘôaÿðËg†…THÃ`ÿ0"!y E‘ Q°O¾­>¾ÆçZ—ë xE‘¹î²8×õŸñwóu»ûbnþÒõk‘Të÷<ü¶ïó &‘Š É$È>ê&ULB‚È@â1Îd‹s›eŚŠÕ,_‹LWï(íøƇ¼ogÚP‚B©vtœœÒüÑ <§ý kÒM7ªáF†&çnMÄ*.㓆L.·ìhÈ┇޲û¨֕ ”HLe÷a „'JÅ]^JB½yo¯Wݨ{,rè#°8‚p6Ä_êWm”#ÜdhBÞz«º¼ëÇå4ãu^§Ç¸N‹Ü¼”ú¾Àˆ+¢üÄvQ7ìJ,i,1(¨ %S®¼yljíFÝãËâRalã*»"D!ÃÞò›æ/¿ZOfºö¾.ÌõRéQõ +©$ä3êuÃ&ÔۇͪחwzïpøÕ;ÀQÂ^qH“CQrp³‡êˆ!EC¦Ó¼67EéR?ªVŽ£X8£V7lB­}جZ}y¨Õ‡Ãم­Z0€‘ÇëîkYJ>aLá-2J gH†xÎÈnØ5]Ø<5ž¼K¨ñàðPãÂزegÔoX¢H‰Y¿9aS~ëÂæýæÉ»Äo·8Füæâ8Ãë²È­ãô)N3å”BŒÞînÿ×s<²N Ë ›V6+,_ÞÂòá¸ÖÆÕsÿT]Ÿ¶Ès\6Y՜çÜ°)jº°yjéêX¦ç¦›BËàøÒ­Å›K®ÛÓÍP²ƒ.¾aiŸÓ©ýù¬fGHºÔ_˜ýµÔ}g˜üj§(Núæi^tÛq[]œ¡ÖFŠ!HDÄ,úõ[ÿyöÖ§àÐ7UAÿšÚ]͜ïòk™UŸ@'Ìd躵>άõUïÍ-nvDçV ύZãKVÛ$d)¤•FKñ³O«îaû> endobj +1947 0 obj << +/D [1945 0 R /XYZ 71.731 729.2652 null] +>> endobj +1948 0 obj << +/D [1945 0 R /XYZ 71.731 718.3063 null] +>> endobj +1949 0 obj << +/D [1945 0 R /XYZ 181.5683 708.3437 null] +>> endobj +1950 0 obj << +/D [1945 0 R /XYZ 71.731 698.2815 null] +>> endobj +1951 0 obj << +/D [1945 0 R /XYZ 71.731 664.8583 null] +>> endobj +1952 0 obj << +/D [1945 0 R /XYZ 71.731 653.7485 null] +>> endobj +1953 0 obj << +/D [1945 0 R /XYZ 71.731 652.5032 null] +>> endobj +1954 0 obj << +/D [1945 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1955 0 obj << +/D [1945 0 R /XYZ 129.5143 633.4246 null] +>> endobj +1956 0 obj << +/D [1945 0 R /XYZ 71.731 631.9851 null] +>> endobj +1957 0 obj << +/D [1945 0 R /XYZ 71.731 631.9851 null] +>> endobj +1958 0 obj << +/D [1945 0 R /XYZ 139.477 615.4919 null] +>> endobj +1959 0 obj << +/D [1945 0 R /XYZ 139.477 615.4919 null] +>> endobj +1960 0 obj << +/D [1945 0 R /XYZ 76.7123 597.5591 null] +>> endobj +1961 0 obj << +/D [1945 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1962 0 obj << +/D [1945 0 R /XYZ 129.5143 579.6264 null] +>> endobj +1963 0 obj << +/D [1945 0 R /XYZ 71.731 577.4696 null] +>> endobj +1964 0 obj << +/D [1945 0 R /XYZ 71.731 577.4696 null] +>> endobj +1965 0 obj << +/D [1945 0 R /XYZ 139.477 561.6936 null] +>> endobj +1966 0 obj << +/D [1945 0 R /XYZ 71.731 560.2541 null] +>> endobj +1967 0 obj << +/D [1945 0 R /XYZ 139.477 543.7609 null] +>> endobj +1968 0 obj << +/D [1945 0 R /XYZ 76.7123 525.8281 null] +>> endobj +1969 0 obj << +/D [1945 0 R /XYZ 129.5143 507.8954 null] +>> endobj +1970 0 obj << +/D [1945 0 R /XYZ 129.5143 507.8954 null] +>> endobj +1971 0 obj << +/D [1945 0 R /XYZ 71.731 505.7386 null] +>> endobj +1972 0 obj << +/D [1945 0 R /XYZ 71.731 505.7386 null] +>> endobj +1973 0 obj << +/D [1945 0 R /XYZ 139.477 489.9626 null] +>> endobj +1974 0 obj << +/D [1945 0 R /XYZ 71.731 488.5231 null] +>> endobj +1975 0 obj << +/D [1945 0 R /XYZ 139.477 472.0299 null] +>> endobj +1976 0 obj << +/D [1945 0 R /XYZ 71.731 434.1718 null] +>> endobj +1977 0 obj << +/D [1945 0 R /XYZ 71.731 421.1209 null] +>> endobj +1978 0 obj << +/D [1945 0 R /XYZ 71.731 419.8755 null] +>> endobj +1979 0 obj << +/D [1945 0 R /XYZ 129.5143 400.797 null] +>> endobj +652 0 obj << +/D [1945 0 R /XYZ 71.731 394.3761 null] +>> endobj +126 0 obj << +/D [1945 0 R /XYZ 248.3767 350.5614 null] +>> endobj +1980 0 obj << +/D [1945 0 R /XYZ 71.731 330.421 null] +>> endobj +1981 0 obj << +/D [1945 0 R /XYZ 161.0655 317.6847 null] +>> endobj +1982 0 obj << +/D [1945 0 R /XYZ 71.731 305.5652 null] +>> endobj +1983 0 obj << +/D [1945 0 R /XYZ 71.731 274.1993 null] +>> endobj +1984 0 obj << +/D [1945 0 R /XYZ 168.8063 263.189 null] +>> endobj +1985 0 obj << +/D [1945 0 R /XYZ 71.731 236.1256 null] +>> endobj +1986 0 obj << +/D [1945 0 R /XYZ 71.731 204.7597 null] +>> endobj +1987 0 obj << +/D [1945 0 R /XYZ 71.731 188.1221 null] +>> endobj +1988 0 obj << +/D [1945 0 R /XYZ 71.731 156.8768 null] +>> endobj +1989 0 obj << +/D [1945 0 R /XYZ 181.5683 145.5303 null] +>> endobj +1990 0 obj << +/D [1945 0 R /XYZ 71.731 135.4681 null] +>> endobj +1944 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1993 0 obj << +/Length 1255 +/Filter /FlateDecode +>> +stream +xÚ­˜]o¤6†ïó+¸L¤Ž‹ þÊE¥tû¡VmíÎ]SE,x$#`ºÍ¿¯mƀÁ´Zå'yÍyýøcF±ü…€&ò8@£(»‰£ù¯Ÿo ‘ŒæàŠ¾?Þ|ûSGp‚Ht<þ¢¿‹þµ)º»¿Ž¿Þüxãã„ÎdM“£jiqÇ&„` iDc’4¡ƒÏÇ;ˆo³6{Òmw?·0v"LFAqâµ0ª®ÌZ¡1œXeÊÂBx!é"oÜùóêÃöZúHXÄ$ +’>$( Ódê#»ô¯ÊnjJA¬"(ɽž¯®o/yÿÍlUQ÷ežõeS»ÊK+–´ˆ Å(öƒµªƒ+»‚…*='²²U°2Ic”roÜu°¶×ÒÇlÂAJéÔƃä¢3ÜC@RYWÍKY?Î4ŠÅ€A*gfʺ¬{ÝhZþz¾B ãI(_ÙV¾ZY8_=q÷ä«Ç‡ƒÄæ«kC1©÷I’5” +•‚OqŒäš¾†s&¡RvehFY/î4>K4“¼Òéª27Ís+¥VK™éJÑQm”¢UKÑtG)ÎMøKÑ5‘E+ºîùTŠJÏgT),fÈ÷9YO«4)f¡Šse[ieeá´òÄݓVsÞ/ÄÄF^öïþ//Å)Üø6|0ýܐܗ!,GG¶ÅÍÊÂÜü(]Šüš0á:L,Vž†FW¶ÓÊÂ0=q÷ÀœûðÃtmt}֋ÿóÓÐs²!>·:$ÿ]Öùú1.M`†–KW¶ÅÔÊÂL=q÷0ûð3umœIµÊ›Bøqˆ1¶öqè®Ûö%сÊ~0U·òƒs={…<1×— Á€ Æ›HW¶±‹eÁm¤/îŽ}¤Ï‡³Ñ¶“>ñq=„ü!î¾ýbî̳4‡ß§Çßéf,ÛМVNf.y.Õ§Ke¦LŽ…Jàx˜å¦€²døˆ”`½¨#¹ÛW×U”É…åÆ·Å°Ï÷l1äVÅ +3ŒsÔ6}Ó¿ŸÅýØãšV¦ïA@ ¦\»®Ç5u‰b>œk‡#—ÜKƒ[š8Øwº&~]ޖgu]°eC&·Ü»>ÌšéGíRWNŒ©¬6äóVȕbÖIåõÐzi›ËY7Ové_³þú>s%øP«µåÝЃ5ª³Èõ‘³°Guc ã-Ha¬6ý«h¿”ú.@椬 @0џ›BœÔäf—ª÷½Œ} %n]ÚшRÿ99ß¹¡Ñ?Ø;ñUÕ f,±M%º`*š’ËŠ7IxVûæ +8e€AÂ7o‰Íò’#bÈùø¦¡Öðꕯ'à¿Z=endstream +endobj +1992 0 obj << +/Type /Page +/Contents 1993 0 R +/Resources 1991 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 1809 0 R +>> endobj +1994 0 obj << +/D [1992 0 R /XYZ 71.731 729.2652 null] +>> endobj +1995 0 obj << +/D [1992 0 R /XYZ 71.731 718.3063 null] +>> endobj +1996 0 obj << +/D [1992 0 R /XYZ 71.731 708.2442 null] +>> endobj +1997 0 obj << +/D [1992 0 R /XYZ 71.731 706.9988 null] +>> endobj +1998 0 obj << +/D [1992 0 R /XYZ 129.5143 687.9203 null] +>> endobj +1999 0 obj << +/D [1992 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2000 0 obj << +/D [1992 0 R /XYZ 71.731 686.4807 null] +>> endobj +2001 0 obj << +/D [1992 0 R /XYZ 71.731 686.4807 null] +>> endobj +2002 0 obj << +/D [1992 0 R /XYZ 139.477 669.9875 null] +>> endobj +2003 0 obj << +/D [1992 0 R /XYZ 139.477 669.9875 null] +>> endobj +2004 0 obj << +/D [1992 0 R /XYZ 76.7123 652.0548 null] +>> endobj +2005 0 obj << +/D [1992 0 R /XYZ 129.5143 634.122 null] +>> endobj +2006 0 obj << +/D [1992 0 R /XYZ 129.5143 634.122 null] +>> endobj +2007 0 obj << +/D [1992 0 R /XYZ 71.731 631.9652 null] +>> endobj +2008 0 obj << +/D [1992 0 R /XYZ 71.731 631.9652 null] +>> endobj +2009 0 obj << +/D [1992 0 R /XYZ 139.477 616.1893 null] +>> endobj +2010 0 obj << +/D [1992 0 R /XYZ 71.731 614.7497 null] +>> endobj +2011 0 obj << +/D [1992 0 R /XYZ 139.477 598.2565 null] +>> endobj +2012 0 obj << +/D [1992 0 R /XYZ 76.7123 580.3238 null] +>> endobj +2013 0 obj << +/D [1992 0 R /XYZ 129.5143 562.391 null] +>> endobj +2014 0 obj << +/D [1992 0 R /XYZ 129.5143 562.391 null] +>> endobj +2015 0 obj << +/D [1992 0 R /XYZ 71.731 561.212 null] +>> endobj +2016 0 obj << +/D [1992 0 R /XYZ 71.731 561.212 null] +>> endobj +2017 0 obj << +/D [1992 0 R /XYZ 139.477 544.4583 null] +>> endobj +2018 0 obj << +/D [1992 0 R /XYZ 139.477 544.4583 null] +>> endobj +2019 0 obj << +/D [1992 0 R /XYZ 71.731 542.3014 null] +>> endobj +2020 0 obj << +/D [1992 0 R /XYZ 139.477 526.5255 null] +>> endobj +2021 0 obj << +/D [1992 0 R /XYZ 139.477 526.5255 null] +>> endobj +2022 0 obj << +/D [1992 0 R /XYZ 71.731 524.3687 null] +>> endobj +2023 0 obj << +/D [1992 0 R /XYZ 139.477 508.5928 null] +>> endobj +2024 0 obj << +/D [1992 0 R /XYZ 139.477 508.5928 null] +>> endobj +2025 0 obj << +/D [1992 0 R /XYZ 71.731 506.4359 null] +>> endobj +2026 0 obj << +/D [1992 0 R /XYZ 139.477 490.66 null] +>> endobj +2027 0 obj << +/D [1992 0 R /XYZ 139.477 490.66 null] +>> endobj +2028 0 obj << +/D [1992 0 R /XYZ 71.731 488.5032 null] +>> endobj +2029 0 obj << +/D [1992 0 R /XYZ 139.477 472.7273 null] +>> endobj +2030 0 obj << +/D [1992 0 R /XYZ 139.477 472.7273 null] +>> endobj +2031 0 obj << +/D [1992 0 R /XYZ 71.731 470.5704 null] +>> endobj +2032 0 obj << +/D [1992 0 R /XYZ 139.477 454.7945 null] +>> endobj +2033 0 obj << +/D [1992 0 R /XYZ 139.477 454.7945 null] +>> endobj +2034 0 obj << +/D [1992 0 R /XYZ 71.731 452.6377 null] +>> endobj +2035 0 obj << +/D [1992 0 R /XYZ 139.477 436.8618 null] +>> endobj +2036 0 obj << +/D [1992 0 R /XYZ 139.477 436.8618 null] +>> endobj +2037 0 obj << +/D [1992 0 R /XYZ 71.731 399.0037 null] +>> endobj +2038 0 obj << +/D [1992 0 R /XYZ 71.731 385.9527 null] +>> endobj +2039 0 obj << +/D [1992 0 R /XYZ 71.731 384.7074 null] +>> endobj +2040 0 obj << +/D [1992 0 R /XYZ 129.5143 365.6289 null] +>> endobj +653 0 obj << +/D [1992 0 R /XYZ 71.731 358.8643 null] +>> endobj +130 0 obj << +/D [1992 0 R /XYZ 179.6704 315.3932 null] +>> endobj +2041 0 obj << +/D [1992 0 R /XYZ 71.731 295.2529 null] +>> endobj +2042 0 obj << +/D [1992 0 R /XYZ 161.0655 282.5165 null] +>> endobj +2043 0 obj << +/D [1992 0 R /XYZ 71.731 270.3971 null] +>> endobj +2044 0 obj << +/D [1992 0 R /XYZ 71.731 239.3674 null] +>> endobj +2045 0 obj << +/D [1992 0 R /XYZ 168.8063 228.0209 null] +>> endobj +2046 0 obj << +/D [1992 0 R /XYZ 71.731 200.9575 null] +>> endobj +2047 0 obj << +/D [1992 0 R /XYZ 71.731 174.7308 null] +>> endobj +2048 0 obj << +/D [1992 0 R /XYZ 71.731 141.6339 null] +>> endobj +2049 0 obj << +/D [1992 0 R /XYZ 181.5683 130.2874 null] +>> endobj +2050 0 obj << +/D [1992 0 R /XYZ 71.731 120.2252 null] +>> endobj +1991 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2053 0 obj << +/Length 1548 +/Filter /FlateDecode +>> +stream +xÚµY]oÛ6}ϯð£ ÄI‰"ՇÞºnÚ!hÓ§e0h‹‰ÈR¦´ý÷#%R¢$꣆ò?5¿îÞ7EyÉ¢b÷ÏýŸ7¿Ý·ñ‰GAÈdY’-jL‡M„B@¢ +ð|Ö<ïvˆlyίB²-Þ )´ƒ&£`è9)´¨½ 3ä_(D= +-LQxÀ˜Œâb,9"ìŒ;üìx˜QcÛ0)Eà×<¤Pù^Ÿ¯Ê‹â1Ð ûª +ò¦ÉWQæÕ¹¼dQiŸyg©¬r1^ ¡ÈPŒ·°µ·a°HÙ³· ›Všb?tƝ֌óè ë…À§´Oã uiîP— ðåæê§OF_‡¬×fºú¹ÌšÏªÓîõ| ͱdÞ5ç]Z¶î8èçHL×"QÄ¥8>Æ"i*È@à@ÚÜeàiO¢ zKž´`sž4°eO:â®ñ䐇ۓ6T¼‰½Ãpƍïª$Ñ–²7Of2§–$d“`iÛ°-[Ø¢–®¸+´ñpjÙ£Qå‰CJÄ@à9 +g'å—Oš‡ìQÐæã™?iaË /›§Hç<>‰ÂüCXI˜”žAàa¹€é-؜ô¶,½#îé‡<ÜÒÛ4DÊO‰pÕUéÀɧ,KOµþp­æI]W­ù܊²L…hIÐ5§§F-Ë9ºFÍ ·˜‡$KŸâ²Š\u@˜QVI­´–oÅ9¾r]º™zö^iZß>aKµ×†Í‰l`Ë*;⮑yÈí³M#‘|BgŸ‚C¼Zh3ÓktÆòԎÉb]¶`s:زΎ¸ktòpëlÓ¸òoÇ"‰Ï¢pŸ»0c¬¯tœšCíGþ-¾VWÝߪëÉ\eŒÈzâA™îKßÌ©Aª°ôlç\ð¹Ék + ñbõ¶`s 2°å9â®IА‡;A6${ŠÓã‰bm‚zýós«q ÝOôYéÜ©å®›|o~{‰…ÊÌײµž-ü>ñ ý¥ÂoÃæ6°e…q×(<äáVئÁO§\¼ÄÒfÑqâ¢Ãd +è\u9¨Ij××MÝy$UYÒüP½&“Ùc0l8|e•§3/”<æI +(X¸“Û°™Ky [¼•»â®¸–»xX—c‡®Âü¥]ڊxŒµ¢ÀŸ›G(Ÿ‘.¦ðTgÙe‹ÇÊÜ°äB(ÀˆÔÉß +(óê&°Gš¨ÈC€NÙö©}}VíáPÊìžvn«Òyô¢€a¨ǀÑ@¿̳2+¿?‹7íˆÎ{zìËê*/ÖÍ»žÈ­]©zEvkõ,)Ã1Ëk“ê?s{àQ…c^”˜<©ÌïiÔ%+J…¬¥/ro8ۋ|[ß-ŸÕÛ¥¹ezòhàf™ŸE9º‰>˓©j½f¯ð±ãj׸•W ×òÌôXßO³<Îv2k¥ÁèО>‰H¿zÿR´»¥œ¥¦¨ÁzÁHº™ú°cÁ®°;oƒ_/ñùÒÉ#!:87ª]…:zæ˂÷ó|Ç&{-C¾CÛî(ç.)TÑ*nû“½ve‡è§ÃÅ­ZO­Ù­Í3±qÙ¶FF<ØÍiàÕ´W¤ëòÔ¯F?Z³µ\õá¤JLÉÈdÄük\4›lM…:$IVs3ûô“ÜãÞª¿®ò;6œýFËŒ¿Ð"XöÙÖۙê¶L~=åø'°bendstream +endobj +2052 0 obj << +/Type /Page +/Contents 2053 0 R +/Resources 2051 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2054 0 obj << +/D [2052 0 R /XYZ 71.731 729.2652 null] +>> endobj +2055 0 obj << +/D [2052 0 R /XYZ 71.731 741.2204 null] +>> endobj +2056 0 obj << +/D [2052 0 R /XYZ 71.731 718.3063 null] +>> endobj +2057 0 obj << +/D [2052 0 R /XYZ 71.731 708.2442 null] +>> endobj +2058 0 obj << +/D [2052 0 R /XYZ 71.731 706.9988 null] +>> endobj +2059 0 obj << +/D [2052 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2060 0 obj << +/D [2052 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2061 0 obj << +/D [2052 0 R /XYZ 71.731 686.4807 null] +>> endobj +2062 0 obj << +/D [2052 0 R /XYZ 71.731 686.4807 null] +>> endobj +2063 0 obj << +/D [2052 0 R /XYZ 139.477 669.9875 null] +>> endobj +2064 0 obj << +/D [2052 0 R /XYZ 139.477 669.9875 null] +>> endobj +2065 0 obj << +/D [2052 0 R /XYZ 76.7123 652.0548 null] +>> endobj +2066 0 obj << +/D [2052 0 R /XYZ 129.5143 634.122 null] +>> endobj +2067 0 obj << +/D [2052 0 R /XYZ 129.5143 634.122 null] +>> endobj +2068 0 obj << +/D [2052 0 R /XYZ 71.731 632.943 null] +>> endobj +2069 0 obj << +/D [2052 0 R /XYZ 71.731 632.943 null] +>> endobj +2070 0 obj << +/D [2052 0 R /XYZ 139.477 616.1893 null] +>> endobj +2071 0 obj << +/D [2052 0 R /XYZ 139.477 616.1893 null] +>> endobj +2072 0 obj << +/D [2052 0 R /XYZ 71.731 614.0324 null] +>> endobj +2073 0 obj << +/D [2052 0 R /XYZ 139.477 598.2565 null] +>> endobj +2074 0 obj << +/D [2052 0 R /XYZ 139.477 598.2565 null] +>> endobj +2075 0 obj << +/D [2052 0 R /XYZ 71.731 596.0997 null] +>> endobj +2076 0 obj << +/D [2052 0 R /XYZ 139.477 580.3238 null] +>> endobj +2077 0 obj << +/D [2052 0 R /XYZ 139.477 580.3238 null] +>> endobj +2078 0 obj << +/D [2052 0 R /XYZ 71.731 578.8842 null] +>> endobj +2079 0 obj << +/D [2052 0 R /XYZ 139.477 562.391 null] +>> endobj +2080 0 obj << +/D [2052 0 R /XYZ 139.477 562.391 null] +>> endobj +2081 0 obj << +/D [2052 0 R /XYZ 71.731 560.2342 null] +>> endobj +2082 0 obj << +/D [2052 0 R /XYZ 139.477 544.4583 null] +>> endobj +2083 0 obj << +/D [2052 0 R /XYZ 139.477 544.4583 null] +>> endobj +2084 0 obj << +/D [2052 0 R /XYZ 71.731 543.0187 null] +>> endobj +2085 0 obj << +/D [2052 0 R /XYZ 139.477 526.5255 null] +>> endobj +2086 0 obj << +/D [2052 0 R /XYZ 139.477 526.5255 null] +>> endobj +2087 0 obj << +/D [2052 0 R /XYZ 71.731 525.086 null] +>> endobj +2088 0 obj << +/D [2052 0 R /XYZ 139.477 508.5928 null] +>> endobj +2089 0 obj << +/D [2052 0 R /XYZ 139.477 508.5928 null] +>> endobj +2090 0 obj << +/D [2052 0 R /XYZ 71.731 506.4359 null] +>> endobj +2091 0 obj << +/D [2052 0 R /XYZ 139.477 490.66 null] +>> endobj +2092 0 obj << +/D [2052 0 R /XYZ 139.477 490.66 null] +>> endobj +2093 0 obj << +/D [2052 0 R /XYZ 71.731 489.2205 null] +>> endobj +2094 0 obj << +/D [2052 0 R /XYZ 139.477 472.7273 null] +>> endobj +2095 0 obj << +/D [2052 0 R /XYZ 139.477 472.7273 null] +>> endobj +2096 0 obj << +/D [2052 0 R /XYZ 71.731 470.5704 null] +>> endobj +2097 0 obj << +/D [2052 0 R /XYZ 139.477 454.7945 null] +>> endobj +2098 0 obj << +/D [2052 0 R /XYZ 139.477 454.7945 null] +>> endobj +2099 0 obj << +/D [2052 0 R /XYZ 71.731 416.9365 null] +>> endobj +2100 0 obj << +/D [2052 0 R /XYZ 71.731 403.8855 null] +>> endobj +2101 0 obj << +/D [2052 0 R /XYZ 71.731 402.6402 null] +>> endobj +2102 0 obj << +/D [2052 0 R /XYZ 129.5143 383.5616 null] +>> endobj +654 0 obj << +/D [2052 0 R /XYZ 71.731 376.7971 null] +>> endobj +134 0 obj << +/D [2052 0 R /XYZ 259.6697 333.326 null] +>> endobj +2103 0 obj << +/D [2052 0 R /XYZ 71.731 313.1856 null] +>> endobj +2104 0 obj << +/D [2052 0 R /XYZ 161.0655 300.4493 null] +>> endobj +2105 0 obj << +/D [2052 0 R /XYZ 71.731 288.3298 null] +>> endobj +2106 0 obj << +/D [2052 0 R /XYZ 71.731 256.9639 null] +>> endobj +2107 0 obj << +/D [2052 0 R /XYZ 168.8063 245.9537 null] +>> endobj +2108 0 obj << +/D [2052 0 R /XYZ 71.731 218.8902 null] +>> endobj +2109 0 obj << +/D [2052 0 R /XYZ 71.731 187.5243 null] +>> endobj +2110 0 obj << +/D [2052 0 R /XYZ 71.731 147.5742 null] +>> endobj +2111 0 obj << +/D [2052 0 R /XYZ 71.731 116.3288 null] +>> endobj +2112 0 obj << +/D [2052 0 R /XYZ 181.5683 104.9823 null] +>> endobj +2051 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2116 0 obj << +/Length 1187 +/Filter /FlateDecode +>> +stream +xÚ­XˎÛ6ÝÏWhic–ñ¡Yp)Z´Å õ® KŽh¤©%'˜¿/)R2e]‹ +daNtÈ{îá=—I„õ?I‚$Ó?4ATpí_îpôI?úíŽ8ÈÆa6>è§ÝÝ*¢Ý!b‰@\Ƒd)NT´Ëþ]ý|L_Ûü´ÞPŽWÙßÇ2­òöÏô£ýsûø»ü•·Ç:kÖvÜýºâs&Q¢tY’jJ“&‘Ò4Elhý”“˜E+Äb&;žiöRT÷–ÆkáçF3×dº.‰nÜpc•Â.ð¸&|•žÒ—\§Û<\ç@ˆŽÊ‰ŒçÇL€9 ¨ësÐùILº&« +O”òI\Ju’„‚q¯/<úYSLAZŽx¤çöÈFc„My°7íé¼oï¯ÊÀÌÏ«¶Ø§mQW>ò|ʧ öôþ‚,lÚø°‹°ÄÔ÷(¡vSX½ù˜Æ ÷¶°ý¬)±°,A±”c[­‹µ .HÄÚ}×úÕ§^_@Ö»\7në¡êoW/&ˆÆœ…ª×ƒÍUo W/wIõ^ó¸Q½>¦,öùs‘=קçJÛÐZ)ąTc­‹ªµƒú䋳^¹bˆ*õêÃfêu€ëŠ» ^!EúzÑЊ¸ÒûÇhêdÊL >aLmo…µ1™„¼ìÃæ´éaam€¸K´xÚø4FÎôäI[ýàãšj¶î¿Ú·W7êË´&ïӝ·¦›±æ ZŠ»Àš°5G<¬8Z˜g£É¼G úu@Ðo4)!ˆ+4©›+Ä.D î’Bx…èÓM:[…‹'LŸG*ä`6#Ü +Å] Äc*܈Æ÷wpÌ%’Š…ìÃf<À‚†â.pð„ìàÏiy†ÜªÁL%jæíe^áÏkªß¾ÝÚ°¸zÇ<$®›·‡…Åâ.÷šÇ q}UõMñX7í­Æˆc$±dßÖcJPBdÐßlÎß=,ìo î<û4.ño­ë×´>ÌôÉÃCÊ\PsÂ8TX—iÐ%²LIªxF–|w.Ë7;üV÷1á Ž¨W¥Ü”)œÄÝZïsý=WÍ|*3ÍSrJ–õa3–`AËBqXâá©Ùo鈇Wd¹ia_œùºoQŸÓƶϞ0Ç?Ú!Öcâ*óàfž÷û¼içÒY_ç%%¼ë›¾› ŒÛ« Š¨473R­¶ÙšàUÖ5Û­~·xeŽ±iC‰%RË«ëSÝÖæÜ{f\ÚW¢í&ˆJìÇmFU6ꐹ¹¸ŽûFØU`™5. /n~ɛý©x5ßÄs\õë$tàÚ8îX÷7ïrÚ×o;Òî:l[™»£·>I›‚›ùšïG¾*ª`òpʇÏùÌ)V·Çüô¥hܓ,?˜ÝNÏeëM2†ÅÆ_HpaOm³$˜¾…]ÞÇP úµ•ìØ_“²AK·z[–uG­Wó}]æÓä®;c…ôKr2{#êa¦¢\ÛJp†•:³É›×›@Àÿ5éªendstream +endobj +2115 0 obj << +/Type /Page +/Contents 2116 0 R +/Resources 2114 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2117 0 obj << +/D [2115 0 R /XYZ 71.731 729.2652 null] +>> endobj +2118 0 obj << +/D [2115 0 R /XYZ 71.731 741.2204 null] +>> endobj +2119 0 obj << +/D [2115 0 R /XYZ 71.731 718.3063 null] +>> endobj +2120 0 obj << +/D [2115 0 R /XYZ 71.731 675.3674 null] +>> endobj +2121 0 obj << +/D [2115 0 R /XYZ 71.731 674.1221 null] +>> endobj +2122 0 obj << +/D [2115 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2123 0 obj << +/D [2115 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2124 0 obj << +/D [2115 0 R /XYZ 71.731 653.604 null] +>> endobj +2125 0 obj << +/D [2115 0 R /XYZ 71.731 653.604 null] +>> endobj +2126 0 obj << +/D [2115 0 R /XYZ 139.477 637.1108 null] +>> endobj +2127 0 obj << +/D [2115 0 R /XYZ 139.477 637.1108 null] +>> endobj +2128 0 obj << +/D [2115 0 R /XYZ 76.7123 619.1781 null] +>> endobj +2129 0 obj << +/D [2115 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2130 0 obj << +/D [2115 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2131 0 obj << +/D [2115 0 R /XYZ 71.731 599.0885 null] +>> endobj +2132 0 obj << +/D [2115 0 R /XYZ 71.731 599.0885 null] +>> endobj +2133 0 obj << +/D [2115 0 R /XYZ 139.477 583.3126 null] +>> endobj +2134 0 obj << +/D [2115 0 R /XYZ 71.731 581.873 null] +>> endobj +2135 0 obj << +/D [2115 0 R /XYZ 139.477 565.3798 null] +>> endobj +2136 0 obj << +/D [2115 0 R /XYZ 76.7123 547.4471 null] +>> endobj +2137 0 obj << +/D [2115 0 R /XYZ 129.5143 529.5143 null] +>> endobj +2138 0 obj << +/D [2115 0 R /XYZ 129.5143 529.5143 null] +>> endobj +2139 0 obj << +/D [2115 0 R /XYZ 71.731 527.3575 null] +>> endobj +2140 0 obj << +/D [2115 0 R /XYZ 71.731 527.3575 null] +>> endobj +2141 0 obj << +/D [2115 0 R /XYZ 139.477 511.5816 null] +>> endobj +2142 0 obj << +/D [2115 0 R /XYZ 71.731 509.4247 null] +>> endobj +2143 0 obj << +/D [2115 0 R /XYZ 139.477 493.6488 null] +>> endobj +2144 0 obj << +/D [2115 0 R /XYZ 76.7123 475.716 null] +>> endobj +2145 0 obj << +/D [2115 0 R /XYZ 129.5143 457.7833 null] +>> endobj +2146 0 obj << +/D [2115 0 R /XYZ 129.5143 457.7833 null] +>> endobj +2147 0 obj << +/D [2115 0 R /XYZ 71.731 455.6265 null] +>> endobj +2148 0 obj << +/D [2115 0 R /XYZ 129.5143 439.8505 null] +>> endobj +2149 0 obj << +/D [2115 0 R /XYZ 129.5143 439.8505 null] +>> endobj +2150 0 obj << +/D [2115 0 R /XYZ 71.731 437.6937 null] +>> endobj +2151 0 obj << +/D [2115 0 R /XYZ 71.731 437.6937 null] +>> endobj +2152 0 obj << +/D [2115 0 R /XYZ 139.477 421.9178 null] +>> endobj +2153 0 obj << +/D [2115 0 R /XYZ 71.731 420.4782 null] +>> endobj +2154 0 obj << +/D [2115 0 R /XYZ 139.477 403.985 null] +>> endobj +2155 0 obj << +/D [2115 0 R /XYZ 71.731 366.127 null] +>> endobj +2156 0 obj << +/D [2115 0 R /XYZ 71.731 353.076 null] +>> endobj +2157 0 obj << +/D [2115 0 R /XYZ 71.731 351.8307 null] +>> endobj +2158 0 obj << +/D [2115 0 R /XYZ 129.5143 332.7522 null] +>> endobj +655 0 obj << +/D [2115 0 R /XYZ 71.731 325.9876 null] +>> endobj +138 0 obj << +/D [2115 0 R /XYZ 298.8174 282.5165 null] +>> endobj +2159 0 obj << +/D [2115 0 R /XYZ 71.731 259.0278 null] +>> endobj +2160 0 obj << +/D [2115 0 R /XYZ 161.0655 249.6398 null] +>> endobj +2161 0 obj << +/D [2115 0 R /XYZ 71.731 237.5204 null] +>> endobj +2162 0 obj << +/D [2115 0 R /XYZ 71.731 206.1545 null] +>> endobj +2163 0 obj << +/D [2115 0 R /XYZ 168.8063 195.1442 null] +>> endobj +2164 0 obj << +/D [2115 0 R /XYZ 71.731 168.0808 null] +>> endobj +2165 0 obj << +/D [2115 0 R /XYZ 71.731 141.8541 null] +>> endobj +2166 0 obj << +/D [2115 0 R /XYZ 71.731 108.421 null] +>> endobj +2167 0 obj << +/D [2115 0 R /XYZ 181.5683 97.4107 null] +>> endobj +2114 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2170 0 obj << +/Length 1044 +/Filter /FlateDecode +>> +stream +xÚÍXˎ£FÝ÷W°´¥¡RêA/"užš(µ&ÞeF-—ÛHZ€5ÊßçBñ( x,&JäØ>pÏ=÷Ô½ÄÃð!ž$H28ÐQÁ©ß°÷ +ýú@Zˆßb|ôÃéá»_öB +*¼ÓÅc¡@\žd)N”w:ÿuøñ½Uº8ú”ãEæøœF™®~¾˜¯OÏïÍÉ]]ósyü|úíáçSŸ3‰BAVIö¨9Mz +hŠ ¦Ià_NæI¬ ˜lxFç[’Ձô”ßžúuRRðó‘ðCTD7 ©•S¾„@N¤'8G8`ÂÉ·Gù6¬ã ¹HL¾³»Õ>QÊgq)…„uƝÝUsL¹tñˆîÕÕ! ®#ԐGSܲ*îqõnRòúzUIUIžÙÈ{¡ç v Ö„`å¶Cù6l–Ô^%ÔÁ……âc„θËÂvWÍyŒ…e! +¤Óx]Ìrp¨Ë¬´©¾IöÚéëõfnלW¹9ÞK½ì^L 8Ûr¯[soÛv¯#î÷Ny,¸×æU ڗ{¥_ª¿ßôË%Ñ©i?Á á("t9zѤ\1Ä&µa+&ía›&uÅÝaÒ§IG4 e¾yª_—KE}gIǚ%Y×>$Yr»ß̗O˜ãTGee¾¾åGÊ_uq¹§ð1¿Ö¡Zû^£G]ÓÐí/y;lâk”½öø¤lûMSñ#ëWËý… Ž˜ ·ú‹ [+]Û.#îžÒMy¸KgÓÈ`x-ôm†+åÏ4‰µKK#4,#sÖpëH’lékÁÖôí`Ûú:âîÑwÊí¯Mã¬Ë¸HޚîëX ¡ä7yÇóA< €3F +‡¼ ðQÃ4ÍV6*ˆ’€n´z¶Òê{Øf«wÅÝÑê]<¬fÝùbÄch<覹8Ä­ûXߎ¾7§xè?É¥-Ô=ŽuYBojK IˆÄ;ø\"©kJ@7­’"ªêݯT‡§ó‘@ᚠ+¿ÏÊ*‚9-,¥(–“íg‘WymÇþŠÁÝ~•‚ÅHhögW°>Ñz önX´M¾;7Â? î[ãÂàÁ@ОL׊ۘv9ÊÁöɜ-üPiÔøƒ`Ĥ°n`‹åj³¼ÔúG÷´jñ9않¯Iin½'ï§4m'Tk˜0šÊÍr¨ðß{Ö R"Q·îõ%lÃV–pÛ\®¸;–ðŒ‡{·6âñß> endobj +2171 0 obj << +/D [2169 0 R /XYZ 71.731 729.2652 null] +>> endobj +2172 0 obj << +/D [2169 0 R /XYZ 71.731 688.3288 null] +>> endobj +2173 0 obj << +/D [2169 0 R /XYZ 71.731 675.3674 null] +>> endobj +2174 0 obj << +/D [2169 0 R /XYZ 71.731 674.1221 null] +>> endobj +2175 0 obj << +/D [2169 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2176 0 obj << +/D [2169 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2177 0 obj << +/D [2169 0 R /XYZ 71.731 653.604 null] +>> endobj +2178 0 obj << +/D [2169 0 R /XYZ 71.731 653.604 null] +>> endobj +2179 0 obj << +/D [2169 0 R /XYZ 139.477 637.1108 null] +>> endobj +2180 0 obj << +/D [2169 0 R /XYZ 139.477 637.1108 null] +>> endobj +2181 0 obj << +/D [2169 0 R /XYZ 76.7123 619.1781 null] +>> endobj +2182 0 obj << +/D [2169 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2183 0 obj << +/D [2169 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2184 0 obj << +/D [2169 0 R /XYZ 71.731 599.8646 null] +>> endobj +2185 0 obj << +/D [2169 0 R /XYZ 71.731 599.8646 null] +>> endobj +2186 0 obj << +/D [2169 0 R /XYZ 139.477 583.3126 null] +>> endobj +2187 0 obj << +/D [2169 0 R /XYZ 139.477 583.3126 null] +>> endobj +2188 0 obj << +/D [2169 0 R /XYZ 71.731 581.1557 null] +>> endobj +2189 0 obj << +/D [2169 0 R /XYZ 139.477 565.3798 null] +>> endobj +2190 0 obj << +/D [2169 0 R /XYZ 139.477 565.3798 null] +>> endobj +2191 0 obj << +/D [2169 0 R /XYZ 71.731 563.223 null] +>> endobj +2192 0 obj << +/D [2169 0 R /XYZ 139.477 547.4471 null] +>> endobj +2193 0 obj << +/D [2169 0 R /XYZ 139.477 547.4471 null] +>> endobj +2194 0 obj << +/D [2169 0 R /XYZ 71.731 509.589 null] +>> endobj +2195 0 obj << +/D [2169 0 R /XYZ 71.731 496.5381 null] +>> endobj +2196 0 obj << +/D [2169 0 R /XYZ 71.731 495.2927 null] +>> endobj +2197 0 obj << +/D [2169 0 R /XYZ 129.5143 476.2142 null] +>> endobj +656 0 obj << +/D [2169 0 R /XYZ 71.731 469.4496 null] +>> endobj +142 0 obj << +/D [2169 0 R /XYZ 290.6398 425.9786 null] +>> endobj +2198 0 obj << +/D [2169 0 R /XYZ 71.731 405.8382 null] +>> endobj +2199 0 obj << +/D [2169 0 R /XYZ 161.0655 393.1018 null] +>> endobj +2200 0 obj << +/D [2169 0 R /XYZ 71.731 380.9824 null] +>> endobj +2201 0 obj << +/D [2169 0 R /XYZ 71.731 349.9527 null] +>> endobj +2202 0 obj << +/D [2169 0 R /XYZ 168.8063 338.6062 null] +>> endobj +2203 0 obj << +/D [2169 0 R /XYZ 71.731 311.5428 null] +>> endobj +2204 0 obj << +/D [2169 0 R /XYZ 71.731 296.9724 null] +>> endobj +2205 0 obj << +/D [2169 0 R /XYZ 71.731 264.1848 null] +>> endobj +2206 0 obj << +/D [2169 0 R /XYZ 181.5683 252.529 null] +>> endobj +2207 0 obj << +/D [2169 0 R /XYZ 71.731 242.4668 null] +>> endobj +2208 0 obj << +/D [2169 0 R /XYZ 71.731 210.8952 null] +>> endobj +2209 0 obj << +/D [2169 0 R /XYZ 71.731 197.9338 null] +>> endobj +2210 0 obj << +/D [2169 0 R /XYZ 71.731 196.6885 null] +>> endobj +2211 0 obj << +/D [2169 0 R /XYZ 129.5143 177.6099 null] +>> endobj +2212 0 obj << +/D [2169 0 R /XYZ 129.5143 177.6099 null] +>> endobj +2213 0 obj << +/D [2169 0 R /XYZ 71.731 176.1704 null] +>> endobj +2214 0 obj << +/D [2169 0 R /XYZ 71.731 176.1704 null] +>> endobj +2215 0 obj << +/D [2169 0 R /XYZ 139.477 159.6772 null] +>> endobj +2216 0 obj << +/D [2169 0 R /XYZ 139.477 159.6772 null] +>> endobj +2217 0 obj << +/D [2169 0 R /XYZ 76.7123 141.7444 null] +>> endobj +2218 0 obj << +/D [2169 0 R /XYZ 129.5143 123.8117 null] +>> endobj +2219 0 obj << +/D [2169 0 R /XYZ 129.5143 123.8117 null] +>> endobj +2168 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2222 0 obj << +/Length 1325 +/Filter /FlateDecode +>> +stream +xڍXÛn«8}ïWä‘H'Û\ })s՝#UÌ¼LG§µD â2mÿ~¶±M qå‚—½–×ÞÞ6 †Ù0‚˜š …t“ïðæš~¿#²Ó˜ úép÷Ão>Þ$(‰h´9œ6~¡æS‡$Þò¼Ÿ_Ó·–×Û ±G‘º>iÉÛoéQýÝ?|U7ßyûZåÍößÃw¿þÐg(‰dV䀺–IK&! +CÂ6 ÇÈ|Öë|ämW—Íý”{@G1 O±ïäP;f¸á ÃdÄ=À$÷¥á/¥ ŽP'ïôzÑaz9uX€C! ü±Q¶_T ˆºˆ“º6]–ñ¦9u…” c>†( 9Ø.dˆÅ¾7Q?ŒúÁ(èÎboŸo öò? ‘q=€-&`(¦¼“yÃ"‡ºj«öóß=bèõŒºïŽ‘¤Çïs=~/ø ‡8íÚW=F¶|= :iõ÷?ɟ0€R̼F´ü‹ÂœªÂԍÇO«7ÌN”/7>È,ˆhïCWæ¼n²ª6q;€µ<=ɲ`Ï^:’o¡©ÑÏËî|¼ü«t%Ló\Ȥ¹*‡Ï9Õ£—ÂôðuÚå"h¬´1‘oš*ikRKGî B T^™¤›Ëʈ#{e©[éa]ÓjÒBæß{Ÿ„ŸÍxj* ¤s& ôð(ªLUå¥y*»W*3d°ŠD(òYdù ëõú|ùe¶?ª[¬óÎYµÓ56,B´¶ÞìGY +C;x×ø<ÕáöٖqN?žË +üqU ¥"›}yùž~ˆsw¶Sãý_ «ýNõ#KËñ)Ž=â¥ä“’±6@$  `šó²a3`‹rñ®Еg€F2DÙ´)YUc¯ƒÄ( +hìÏ, ël<˜†Â‘󶿌!Þ7–üµ`sþز¿Þ5þNu¸ýµeÈw¦g œ$ël5c¸- äËø’…lÎB[¶ÐÁ»Æ©·…¶Œüò6îÚßà$Ål““¡6»^©’ ÿ†c¸™û(¤¿‡1‚—°dö“™…¹þbÒ–|ƒê?œ$7¿9ÿ¤Í¢rendstream +endobj +2221 0 obj << +/Type /Page +/Contents 2222 0 R +/Resources 2220 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2223 0 obj << +/D [2221 0 R /XYZ 71.731 729.2652 null] +>> endobj +658 0 obj << +/D [2221 0 R /XYZ 71.731 741.2204 null] +>> endobj +2224 0 obj << +/D [2221 0 R /XYZ 71.731 718.3063 null] +>> endobj +2225 0 obj << +/D [2221 0 R /XYZ 71.731 708.2442 null] +>> endobj +2226 0 obj << +/D [2221 0 R /XYZ 71.731 706.9988 null] +>> endobj +2227 0 obj << +/D [2221 0 R /XYZ 129.5143 687.9203 null] +>> endobj +657 0 obj << +/D [2221 0 R /XYZ 71.731 681.4994 null] +>> endobj +146 0 obj << +/D [2221 0 R /XYZ 188.2952 637.6847 null] +>> endobj +2228 0 obj << +/D [2221 0 R /XYZ 71.731 617.5443 null] +>> endobj +2229 0 obj << +/D [2221 0 R /XYZ 161.0655 604.8079 null] +>> endobj +2230 0 obj << +/D [2221 0 R /XYZ 71.731 592.6885 null] +>> endobj +2231 0 obj << +/D [2221 0 R /XYZ 71.731 561.6588 null] +>> endobj +2232 0 obj << +/D [2221 0 R /XYZ 168.8063 550.3123 null] +>> endobj +2233 0 obj << +/D [2221 0 R /XYZ 71.731 523.2489 null] +>> endobj +2234 0 obj << +/D [2221 0 R /XYZ 71.731 491.883 null] +>> endobj +2235 0 obj << +/D [2221 0 R /XYZ 71.731 448.6451 null] +>> endobj +2236 0 obj << +/D [2221 0 R /XYZ 71.731 420.6875 null] +>> endobj +2237 0 obj << +/D [2221 0 R /XYZ 71.731 389.1059 null] +>> endobj +2238 0 obj << +/D [2221 0 R /XYZ 181.5683 377.7594 null] +>> endobj +2239 0 obj << +/D [2221 0 R /XYZ 71.731 367.6972 null] +>> endobj +2240 0 obj << +/D [2221 0 R /XYZ 71.731 334.274 null] +>> endobj +2241 0 obj << +/D [2221 0 R /XYZ 71.731 323.1642 null] +>> endobj +2242 0 obj << +/D [2221 0 R /XYZ 71.731 321.9189 null] +>> endobj +2243 0 obj << +/D [2221 0 R /XYZ 129.5143 302.8403 null] +>> endobj +2244 0 obj << +/D [2221 0 R /XYZ 129.5143 302.8403 null] +>> endobj +2245 0 obj << +/D [2221 0 R /XYZ 71.731 301.4008 null] +>> endobj +2246 0 obj << +/D [2221 0 R /XYZ 71.731 301.4008 null] +>> endobj +2247 0 obj << +/D [2221 0 R /XYZ 139.477 284.9076 null] +>> endobj +2248 0 obj << +/D [2221 0 R /XYZ 139.477 284.9076 null] +>> endobj +2249 0 obj << +/D [2221 0 R /XYZ 76.7123 266.9748 null] +>> endobj +2250 0 obj << +/D [2221 0 R /XYZ 129.5143 249.0421 null] +>> endobj +2251 0 obj << +/D [2221 0 R /XYZ 129.5143 249.0421 null] +>> endobj +2252 0 obj << +/D [2221 0 R /XYZ 71.731 247.8631 null] +>> endobj +2253 0 obj << +/D [2221 0 R /XYZ 71.731 247.8631 null] +>> endobj +2254 0 obj << +/D [2221 0 R /XYZ 139.477 231.1093 null] +>> endobj +2255 0 obj << +/D [2221 0 R /XYZ 139.477 231.1093 null] +>> endobj +2256 0 obj << +/D [2221 0 R /XYZ 71.731 228.9525 null] +>> endobj +2257 0 obj << +/D [2221 0 R /XYZ 139.477 213.1766 null] +>> endobj +2258 0 obj << +/D [2221 0 R /XYZ 139.477 213.1766 null] +>> endobj +2259 0 obj << +/D [2221 0 R /XYZ 71.731 211.0198 null] +>> endobj +2260 0 obj << +/D [2221 0 R /XYZ 139.477 195.2438 null] +>> endobj +2261 0 obj << +/D [2221 0 R /XYZ 139.477 195.2438 null] +>> endobj +2262 0 obj << +/D [2221 0 R /XYZ 71.731 193.087 null] +>> endobj +2263 0 obj << +/D [2221 0 R /XYZ 139.477 177.3111 null] +>> endobj +2264 0 obj << +/D [2221 0 R /XYZ 139.477 177.3111 null] +>> endobj +2265 0 obj << +/D [2221 0 R /XYZ 71.731 175.1543 null] +>> endobj +2266 0 obj << +/D [2221 0 R /XYZ 139.477 159.3783 null] +>> endobj +2267 0 obj << +/D [2221 0 R /XYZ 139.477 159.3783 null] +>> endobj +2268 0 obj << +/D [2221 0 R /XYZ 71.731 121.5203 null] +>> endobj +2269 0 obj << +/D [2221 0 R /XYZ 71.731 108.4693 null] +>> endobj +2270 0 obj << +/D [2221 0 R /XYZ 71.731 107.224 null] +>> endobj +2220 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2273 0 obj << +/Length 1098 +/Filter /FlateDecode +>> +stream +xڝX]›8}Ÿ_Ác"¯?0¶ûP)ûÑUW»Õ¨ÍÛÎjDÁ™ ˜¢Qÿý^‚MLb>¶ÊC ûž{|®m † A‚ÁUˆÆœéé/ðè÷b ¡Á„.èçýÃOR1ƒý!`*F\D`INd°ÏþÞürL^[]oCÊñ†¢þÿ±HJÝþ™|ë/wŸúÆ_º=VY³ýgÿÇÃoû!>g) AfIFD¢ˆa„#E ÷¢Qˆs" ,‹˜’¡*€8“.™7Àºlž(å·ì¥ 4p´qoÿ¯§vö—®¿.Û¦‘òƝÖöºç1–) 1¦±]ú½×£.‡Ê‹`[¿Õ7/_¬¾YOýp£e \?í^˜DÆU¼ä^6ç^ [v¯'î÷Þò˜p¯Ëãvkòh-%ìBŽµ†Í~¼z÷âOûÇ(¢±Zò«›ó«…-ûÕw_=<œóõ«KãzüùêlHYçÁËfYOjCAáHEKµìÂf´`‹Úøâ®ÐÆÇã^›Qe:òXÇy«rŠb*—ªÏ…ÍTß[¬>_ÜÕwÇÃ_}#S'@O8Å8¾Yò’º¶§¬êðc•IY„bŗ*Ӆ͹Ï–Ý牻Æ}÷¹4œÐûÿ&ðDÌ ӁÍIcaËÒx⮑ÆÃÃ#KcT˜ÏEaÌôï9)Fg|kÏËÑ7„¢R”÷/b«È=OIÄg˜-´ ›)è¶Xо¸+ +ÚÇÃó<âqµÚ웭KÓ|Lj$‚75û©ÃÁÜéàT‰S©a¤ŽÓß-<ÿ‡ý´endstream +endobj +2272 0 obj << +/Type /Page +/Contents 2273 0 R +/Resources 2271 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2274 0 obj << +/D [2272 0 R /XYZ 71.731 729.2652 null] +>> endobj +2275 0 obj << +/D [2272 0 R /XYZ 71.731 741.2204 null] +>> endobj +2276 0 obj << +/D [2272 0 R /XYZ 129.5143 708.3437 null] +>> endobj +150 0 obj << +/D [2272 0 R /XYZ 260.5654 658.1081 null] +>> endobj +2277 0 obj << +/D [2272 0 R /XYZ 71.731 637.9677 null] +>> endobj +2278 0 obj << +/D [2272 0 R /XYZ 161.0655 625.2314 null] +>> endobj +2279 0 obj << +/D [2272 0 R /XYZ 71.731 613.1119 null] +>> endobj +2280 0 obj << +/D [2272 0 R /XYZ 71.731 582.0823 null] +>> endobj +2281 0 obj << +/D [2272 0 R /XYZ 168.8063 570.7357 null] +>> endobj +2282 0 obj << +/D [2272 0 R /XYZ 71.731 543.6723 null] +>> endobj +2283 0 obj << +/D [2272 0 R /XYZ 71.731 512.3064 null] +>> endobj +2284 0 obj << +/D [2272 0 R /XYZ 71.731 495.6688 null] +>> endobj +2285 0 obj << +/D [2272 0 R /XYZ 71.731 464.7328 null] +>> endobj +2286 0 obj << +/D [2272 0 R /XYZ 181.5683 453.0769 null] +>> endobj +2287 0 obj << +/D [2272 0 R /XYZ 71.731 443.0148 null] +>> endobj +2288 0 obj << +/D [2272 0 R /XYZ 71.731 409.5916 null] +>> endobj +2289 0 obj << +/D [2272 0 R /XYZ 71.731 398.4818 null] +>> endobj +2290 0 obj << +/D [2272 0 R /XYZ 71.731 397.2364 null] +>> endobj +2291 0 obj << +/D [2272 0 R /XYZ 129.5143 378.1579 null] +>> endobj +2292 0 obj << +/D [2272 0 R /XYZ 129.5143 378.1579 null] +>> endobj +2293 0 obj << +/D [2272 0 R /XYZ 71.731 376.7183 null] +>> endobj +2294 0 obj << +/D [2272 0 R /XYZ 71.731 376.7183 null] +>> endobj +2295 0 obj << +/D [2272 0 R /XYZ 139.477 360.2251 null] +>> endobj +2296 0 obj << +/D [2272 0 R /XYZ 139.477 360.2251 null] +>> endobj +2297 0 obj << +/D [2272 0 R /XYZ 76.7123 342.2924 null] +>> endobj +2298 0 obj << +/D [2272 0 R /XYZ 129.5143 324.3596 null] +>> endobj +2299 0 obj << +/D [2272 0 R /XYZ 129.5143 324.3596 null] +>> endobj +2300 0 obj << +/D [2272 0 R /XYZ 71.731 322.2028 null] +>> endobj +2301 0 obj << +/D [2272 0 R /XYZ 71.731 322.2028 null] +>> endobj +2302 0 obj << +/D [2272 0 R /XYZ 139.477 306.4269 null] +>> endobj +2303 0 obj << +/D [2272 0 R /XYZ 71.731 304.9873 null] +>> endobj +2304 0 obj << +/D [2272 0 R /XYZ 139.477 288.4941 null] +>> endobj +2305 0 obj << +/D [2272 0 R /XYZ 76.7123 270.5614 null] +>> endobj +2306 0 obj << +/D [2272 0 R /XYZ 129.5143 252.6286 null] +>> endobj +2307 0 obj << +/D [2272 0 R /XYZ 129.5143 252.6286 null] +>> endobj +2308 0 obj << +/D [2272 0 R /XYZ 71.731 250.4718 null] +>> endobj +2309 0 obj << +/D [2272 0 R /XYZ 71.731 250.4718 null] +>> endobj +2310 0 obj << +/D [2272 0 R /XYZ 139.477 234.6959 null] +>> endobj +2311 0 obj << +/D [2272 0 R /XYZ 71.731 233.2563 null] +>> endobj +2312 0 obj << +/D [2272 0 R /XYZ 139.477 216.7631 null] +>> endobj +2313 0 obj << +/D [2272 0 R /XYZ 71.731 178.9051 null] +>> endobj +2314 0 obj << +/D [2272 0 R /XYZ 71.731 165.8541 null] +>> endobj +2315 0 obj << +/D [2272 0 R /XYZ 71.731 164.6088 null] +>> endobj +2316 0 obj << +/D [2272 0 R /XYZ 129.5143 145.5303 null] +>> endobj +659 0 obj << +/D [2272 0 R /XYZ 71.731 139.1094 null] +>> endobj +2271 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2319 0 obj << +/Length 900 +/Filter /FlateDecode +>> +stream +xÚÅVÛnÛ8}ÏWèQ"–Qûævw‹ì¥û°- +E¢c!²dHôùûš¤L[Êå¥X0mi†çÌðÌ I„áC"A`°P‰hÎiTí®pô¯¾\g’:›44ú´¾úðÑD2§y´ÞDL戋,Œ¢‚“"Z×ÿğ·å^«!I)Ç1Ev½mËNé?Ë{ûwu{cü¥ô¶¯Çäûú÷«_×>gÉ@^%9YÍiR(á™áé#ƉLˆ#MŠ1äD¯†ãƒÞ~Þª*¡8~4t`„š TP,¢Ô„*r»ÇíÐë^?ïÕÇÉ£üê|SJPN +ytX9”Gý7Ìq `% ˜©ß"ÄüEÕÐìuÓwïE½Sú0t£Å$vi6vÕ[eFf½[»¾vï GÕé¦*µªí£ñPUj7‡¶}Nr_ÛǛ„óV;´‡§fTè½ñ­Ú¶O(Ÿ<Ò]ߪñÍPm¤e½k:Geß\‘eØSÔªÚ^¾“×mBx\åN¸-ŸP±„HÄ9QV† ”%ÅNVihf+#P³ÀÄ0˜ïf(|£”Ïp)9#t÷r=ñð^s¬RL ®8ÉØ9#‡…´Ñ aƒ`L>:•èáPé닢ä*-ƒšè)@c*ärb½UšKLýŸäÍ^L,>¦™\Ä}9±ÞkÎã<±L"ӉÎh˜î`âBvyŽò zíe~›îÁçw!­;»~?ՃÙº¦éÞÄÈ1*°äa³xYàLJ$Àøu}V¯ÈÛ[½©îÐwˆ{Ä)¡“BMçÕzÑ'OýΝÍـI¹@¢`ì˜JÊxîG u#æS[ÚÑÒ6£þôe¾žÚ¤1€ŒN`gCÇÅùh:¶}ÿ£©Â$b ²œ^°r㡜qfI݌å8öUzîÜqhçØ9Q—mL·mSÛ:hυï7C¿»ð.«ª?t-¿ûú¤ïßãus§À.7v™‰#Ž†MA œçìü½šü˺öã­|H`®4ò.p-á± +ú;! šÕÝכ¯_\ÉߜǤΓw9óO tëSŠ–â=™”íè’uïfÿ½?2UO ô"&ò7/§¢ù¿¯Ep?¸l2îv˜Ò._½6óÛ0§ @)§ "#/Þmÿ`Î[endstream +endobj +2318 0 obj << +/Type /Page +/Contents 2319 0 R +/Resources 2317 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2113 0 R +>> endobj +2320 0 obj << +/D [2318 0 R /XYZ 71.731 729.2652 null] +>> endobj +154 0 obj << +/D [2318 0 R /XYZ 204.8052 705.7477 null] +>> endobj +2321 0 obj << +/D [2318 0 R /XYZ 71.731 685.6073 null] +>> endobj +2322 0 obj << +/D [2318 0 R /XYZ 161.0655 672.871 null] +>> endobj +2323 0 obj << +/D [2318 0 R /XYZ 71.731 660.7515 null] +>> endobj +2324 0 obj << +/D [2318 0 R /XYZ 71.731 574.89 null] +>> endobj +2325 0 obj << +/D [2318 0 R /XYZ 181.5683 563.8797 null] +>> endobj +2326 0 obj << +/D [2318 0 R /XYZ 71.731 553.8175 null] +>> endobj +2327 0 obj << +/D [2318 0 R /XYZ 71.731 520.3944 null] +>> endobj +2328 0 obj << +/D [2318 0 R /XYZ 71.731 509.2845 null] +>> endobj +2329 0 obj << +/D [2318 0 R /XYZ 71.731 508.0392 null] +>> endobj +2330 0 obj << +/D [2318 0 R /XYZ 129.5143 488.9607 null] +>> endobj +2331 0 obj << +/D [2318 0 R /XYZ 129.5143 488.9607 null] +>> endobj +2332 0 obj << +/D [2318 0 R /XYZ 71.731 487.5211 null] +>> endobj +2333 0 obj << +/D [2318 0 R /XYZ 71.731 487.5211 null] +>> endobj +2334 0 obj << +/D [2318 0 R /XYZ 139.477 471.0279 null] +>> endobj +2335 0 obj << +/D [2318 0 R /XYZ 139.477 471.0279 null] +>> endobj +2336 0 obj << +/D [2318 0 R /XYZ 71.731 433.1699 null] +>> endobj +2337 0 obj << +/D [2318 0 R /XYZ 71.731 420.1189 null] +>> endobj +2338 0 obj << +/D [2318 0 R /XYZ 71.731 418.8736 null] +>> endobj +2339 0 obj << +/D [2318 0 R /XYZ 129.5143 399.795 null] +>> endobj +660 0 obj << +/D [2318 0 R /XYZ 71.731 393.3742 null] +>> endobj +158 0 obj << +/D [2318 0 R /XYZ 216.3218 349.5594 null] +>> endobj +2340 0 obj << +/D [2318 0 R /XYZ 71.731 326.0706 null] +>> endobj +2341 0 obj << +/D [2318 0 R /XYZ 161.0655 316.6827 null] +>> endobj +2342 0 obj << +/D [2318 0 R /XYZ 71.731 304.5632 null] +>> endobj +2343 0 obj << +/D [2318 0 R /XYZ 71.731 273.1973 null] +>> endobj +2344 0 obj << +/D [2318 0 R /XYZ 168.8063 262.1871 null] +>> endobj +2345 0 obj << +/D [2318 0 R /XYZ 71.731 235.1236 null] +>> endobj +2346 0 obj << +/D [2318 0 R /XYZ 71.731 192.1015 null] +>> endobj +2347 0 obj << +/D [2318 0 R /XYZ 71.731 175.4639 null] +>> endobj +2348 0 obj << +/D [2318 0 R /XYZ 71.731 144.5278 null] +>> endobj +2349 0 obj << +/D [2318 0 R /XYZ 181.5683 132.872 null] +>> endobj +2350 0 obj << +/D [2318 0 R /XYZ 71.731 122.8098 null] +>> endobj +2317 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2353 0 obj << +/Length 1251 +/Filter /FlateDecode +>> +stream +xÚÅX]oœ8}ϯà­3RÇëŒí¼¥í¶û•(ªò¶©*gÆéŒB L«üû½ cÀ|¨»Š8ö=œ{}®DþH$ T!špmŸ/pô n}º ²q˜zwwñËG†#…TB“èî1b*A\đ`INdt·û{õ~¯_*S¬7”ãEõñ6ՙ©þÒõÏ«Ûßë“kSíó]¹þr÷Çůwm|ÎR‚L’lQCšTy4 Qˆs""%b1'ž·kÂWºÐÏؖ—} +í DBŠYB‹Úø°†\˜t(´0KážR>ˆK)p$4·<óhF y0I"‰O<@(NbÖ塏ÕÞòèéFc„m ¹¬óUVÅq[½íeю7YuØêêg>òX˜á6% Û 6>ì,,±åÙy 6*,)¦± +ƶ5äÑ–) Ñ¥qºÔP—'(‰añôõ=dß}²>×ӝΫ¼>K3^½,FPsÅ{FMÕ®C͗î0è’Êí‘)\Ä“yýziË8`$íj{ȚÂýsMùÊØõÿêní¬Î÷S0.˜.ÚÄa…e´±Ö&’Ú2>(èlÂ+¸ÄHR¢fäöaz·°YÁCq(âáÙf#y‡ÇYEâ´{t¥{ÜnMY>S—à'%ü”¿ HHë™cDON“f;„«wy^}2ÕM¾3L¥iÈk,€ݬÜy•W¯/æ²q®7vC Jˆ¬!êô÷˜ckep$à›f.?øSn‹Ã‹] ³á•_DÎ9v¦ªOr'æÎç¥ò£»†PŸluš‚SÔ?2x’·M‘oÓ㮽ãæό­øgt¶,[gùn!:=´ôÙ¯Ò4?Íkœ!}ÎSS.͉ÆÂHK{5# ¥æì·M¬¿6»þBq¬¿°åuxü?½š*Žd’Ìõj6Ñ«[Øl¯Å]Ы<‚½ºCã¿ëÕn„N×ڄúÕ­ô7ûg½}3žUÊ`ÿ:“6•…6Ÿ…@Ü%YèógÁ§ñÝP¨¼bR‰‰üv}µŽñê}×GÏ^÷d…ö{¾ÎvÃ4Y[—?ÁÃ*›QÿŒšß¡æµ]"}DXyƒ*¼—Š1âX¨±½ÔM«ðpónjÑSϗXñe›("%‰$3&îÃ&L¼…Íšx(îñl¢:ÇI’¨ÉoÊføI™S /2Jµ3YžŒŽ~ ü ^#%endstream +endobj +2352 0 obj << +/Type /Page +/Contents 2353 0 R +/Resources 2351 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2354 0 obj << +/D [2352 0 R /XYZ 71.731 729.2652 null] +>> endobj +2355 0 obj << +/D [2352 0 R /XYZ 71.731 718.3063 null] +>> endobj +2356 0 obj << +/D [2352 0 R /XYZ 71.731 708.2442 null] +>> endobj +2357 0 obj << +/D [2352 0 R /XYZ 71.731 706.9988 null] +>> endobj +2358 0 obj << +/D [2352 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2359 0 obj << +/D [2352 0 R /XYZ 129.5143 687.9203 null] +>> endobj +2360 0 obj << +/D [2352 0 R /XYZ 71.731 686.4807 null] +>> endobj +2361 0 obj << +/D [2352 0 R /XYZ 71.731 686.4807 null] +>> endobj +2362 0 obj << +/D [2352 0 R /XYZ 139.477 669.9875 null] +>> endobj +2363 0 obj << +/D [2352 0 R /XYZ 139.477 669.9875 null] +>> endobj +2364 0 obj << +/D [2352 0 R /XYZ 76.7123 652.0548 null] +>> endobj +2365 0 obj << +/D [2352 0 R /XYZ 129.5143 634.122 null] +>> endobj +2366 0 obj << +/D [2352 0 R /XYZ 129.5143 634.122 null] +>> endobj +2367 0 obj << +/D [2352 0 R /XYZ 71.731 612.0399 null] +>> endobj +2368 0 obj << +/D [2352 0 R /XYZ 71.731 601.1458 null] +>> endobj +2369 0 obj << +/D [2352 0 R /XYZ 71.731 599.9004 null] +>> endobj +2370 0 obj << +/D [2352 0 R /XYZ 129.5143 580.8219 null] +>> endobj +661 0 obj << +/D [2352 0 R /XYZ 71.731 574.401 null] +>> endobj +162 0 obj << +/D [2352 0 R /XYZ 282.1874 530.5863 null] +>> endobj +2371 0 obj << +/D [2352 0 R /XYZ 71.731 510.4459 null] +>> endobj +2372 0 obj << +/D [2352 0 R /XYZ 161.0655 497.7096 null] +>> endobj +2373 0 obj << +/D [2352 0 R /XYZ 71.731 485.5901 null] +>> endobj +2374 0 obj << +/D [2352 0 R /XYZ 71.731 454.5605 null] +>> endobj +2375 0 obj << +/D [2352 0 R /XYZ 168.8063 443.2139 null] +>> endobj +2376 0 obj << +/D [2352 0 R /XYZ 71.731 431.0945 null] +>> endobj +2377 0 obj << +/D [2352 0 R /XYZ 71.731 399.7286 null] +>> endobj +2378 0 obj << +/D [2352 0 R /XYZ 181.5683 388.7183 null] +>> endobj +2379 0 obj << +/D [2352 0 R /XYZ 71.731 378.6561 null] +>> endobj +2380 0 obj << +/D [2352 0 R /XYZ 71.731 347.0845 null] +>> endobj +2381 0 obj << +/D [2352 0 R /XYZ 71.731 334.1231 null] +>> endobj +2382 0 obj << +/D [2352 0 R /XYZ 71.731 332.8778 null] +>> endobj +2383 0 obj << +/D [2352 0 R /XYZ 129.5143 313.7992 null] +>> endobj +2384 0 obj << +/D [2352 0 R /XYZ 129.5143 313.7992 null] +>> endobj +2385 0 obj << +/D [2352 0 R /XYZ 71.731 312.3597 null] +>> endobj +2386 0 obj << +/D [2352 0 R /XYZ 71.731 312.3597 null] +>> endobj +2387 0 obj << +/D [2352 0 R /XYZ 139.477 295.8665 null] +>> endobj +2388 0 obj << +/D [2352 0 R /XYZ 139.477 295.8665 null] +>> endobj +2389 0 obj << +/D [2352 0 R /XYZ 71.731 293.7097 null] +>> endobj +2390 0 obj << +/D [2352 0 R /XYZ 139.477 277.9337 null] +>> endobj +2391 0 obj << +/D [2352 0 R /XYZ 139.477 277.9337 null] +>> endobj +2392 0 obj << +/D [2352 0 R /XYZ 71.731 275.7769 null] +>> endobj +2393 0 obj << +/D [2352 0 R /XYZ 139.477 260.001 null] +>> endobj +2394 0 obj << +/D [2352 0 R /XYZ 139.477 260.001 null] +>> endobj +2395 0 obj << +/D [2352 0 R /XYZ 71.731 222.1429 null] +>> endobj +2396 0 obj << +/D [2352 0 R /XYZ 71.731 209.092 null] +>> endobj +2397 0 obj << +/D [2352 0 R /XYZ 71.731 207.8466 null] +>> endobj +2398 0 obj << +/D [2352 0 R /XYZ 129.5143 188.7681 null] +>> endobj +2399 0 obj << +/D [2352 0 R /XYZ 71.731 188.6686 null] +>> endobj +2400 0 obj << +/D [2352 0 R /XYZ 71.731 188.6686 null] +>> endobj +2401 0 obj << +/D [2352 0 R /XYZ 139.477 170.8354 null] +>> endobj +2402 0 obj << +/D [2352 0 R /XYZ 139.477 170.8354 null] +>> endobj +2403 0 obj << +/D [2352 0 R /XYZ 71.731 168.6785 null] +>> endobj +2404 0 obj << +/D [2352 0 R /XYZ 139.477 152.9026 null] +>> endobj +2405 0 obj << +/D [2352 0 R /XYZ 139.477 152.9026 null] +>> endobj +2406 0 obj << +/D [2352 0 R /XYZ 71.731 150.7458 null] +>> endobj +2407 0 obj << +/D [2352 0 R /XYZ 139.477 134.9698 null] +>> endobj +2408 0 obj << +/D [2352 0 R /XYZ 139.477 134.9698 null] +>> endobj +2409 0 obj << +/D [2352 0 R /XYZ 71.731 132.813 null] +>> endobj +2410 0 obj << +/D [2352 0 R /XYZ 139.477 117.0371 null] +>> endobj +2411 0 obj << +/D [2352 0 R /XYZ 139.477 117.0371 null] +>> endobj +2412 0 obj << +/D [2352 0 R /XYZ 71.731 114.8803 null] +>> endobj +2413 0 obj << +/D [2352 0 R /XYZ 71.731 114.8803 null] +>> endobj +2414 0 obj << +/D [2352 0 R /XYZ 149.4396 99.1043 null] +>> endobj +2415 0 obj << +/D [2352 0 R /XYZ 149.4396 99.1043 null] +>> endobj +2416 0 obj << +/D [2352 0 R /XYZ 71.731 96.9475 null] +>> endobj +2351 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2420 0 obj << +/Length 1511 +/Filter /FlateDecode +>> +stream +xÚ­™]s›8†ïó+¸‹=S«’ô.m÷£;›4Óæn»Ó!˜ÄLmð®'ÿ¾G aKˆív|دt^=H‡#L ‚Dš qd»+<ÃO\%Y)Íʽ}¸zý{ˆƒ%‚‡§ L"Ä DHQÌI<¬ÿY¼Û¤û6¯—+Êñ‚¢þx¿M˼ý;}ì/oî?ô'·y»©ÖÍò߇¿®~{âóP $† “&Ã$Fó(XQŒJ¸UEÂ1!`,8F! Å0š9N‹– *9–/”ò±7ÂxQ`ö§£Ž'ºÕ¥0b@±ÎÀõÜGÑ|Ý×Å.­_¤›Îùé.ppB©|Ós}¬ªmž–¯ú«Ml7y¢;ë.Šn×ӒàEš©ßŸªZ·(TÛ²Zç(³(ÁˆœLó7UnþƒÊËßuÿ vþg>`î«ú›>ã#úM[峂ÿùðÍûót½®ó¦qrŽ1õp4TµÊÏÑuDZ GÓG±· $!¢ '?ÜÏÃÇâŒ3>C5O«üø,QçàÛpà3}¬Ë†XR†ðÁ×]TO–Tðþî³jŸ×ߗ„/ »`‡Š؆j¶Vùa[¢Î=¶á€múØTM[¦»Ü¶è9â4¡È¿`Ž?îÛ¢*Ó-œ“þÛ?.­LIŒ"‘øò¨¡š`ªU~¦–¨s˜Žm8˜š> îÒæÿçQ݉"ÆH0áK¢†j¢Vù!Z¢Î8¶á€húxNÛü˜¾Ø!ÆIý’Tð¼ä ´¤|qìjƒpCõG˜'íš*7ðAån‹:ø… ;ð3²ôQÀ×bmá.bD¢Hœs‡²JA¿“¥“«Ô* ï¶ø‚1uçZ1ÇēkMÕa­ò¶DCxlÃAØô±K3[a#aWážÎ·7K†ïfUœE(a±'¹šª ˆZå‡h‰:â؆¢éCNSûü„¼Àq쟞iÓTY«~Ý_‹v3ÞœOakضayr°©š`­U~֖¨sXm8X›> £¿ºkò¬*×?S‹qBŽC_6T¸µÊÛuî± nÓÇãq[ìŠÖ>µ¡ sÍí·i¹>k=‡^lY"±'˚*7ÅAå¥h‹:ƒâ… ;Å3íË>ÿ‰I{cNÖ®¡ÄÍÑ3Rªëbÿ]wµ®‹¯àˆáIÀ¦j‚¯VùùZ¢Îá;¶áàkúØu/³,„CŽ©Ÿ1|¡ +ܾ++è%çÐ8m‹ìZ%zø/֛lo¿ ¿8aaÆQÈ©#[hÕʔYnÄEoÎ;R„)K¬qÝwB·ºôq~'ô„0m4eUÎMçÛ Õ¶»ø&Ÿs¹L¾ºÜ†ñ¸ã¼ ¾"X@Å «H–€qž¢É÷ž"^¼­ªö®j‹§—Ç8ôÔØlA7VéJ¾HQ¿\ï몭äz{3´8[µ]Q;VUŒ‚5§é“ÚÍ+=³š&}–…Â+,³í*‡}ь¾iól3þ®9ì÷UÝê 6ÇJÛ2Çñ>o²ºè6ÃS#½7h?’~£—–U·9 L?7,€”]Hû¯õ²P–ՏÕAŸª›Üíqú'lÙê.Su¶I÷{(þÕRÔób …ë¦(s$Ç“jE"…?ä >åí¡.•Yõ ÐÏúC–Áx:lÑ\Œ7ÛmO@›ùTmófîÜЯoçDº—,Ò:…$°ß\,hKŸCåN¨Ü$¹Þ·iÕʔI¥}·€/zs&*¡Ö¸îD¢[]ú8O$:¡ù gö#óé²cøC¶—û»,m‡¤Ò+uîÌÐ˽‘ëÝڐ¡MÙD†dÞ m‹;#C_ø°fè37ÀåÖõ¸ä°ˆ˜˜JÒ7¬æ#³­úã¡ÂV¦rõ&C­Éë ,ßë1 õ׋aDÉä¿c†æòÏ1Nc˜$I2ô$†Î¿º,cwAendstream +endobj +2419 0 obj << +/Type /Page +/Contents 2420 0 R +/Resources 2418 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2421 0 obj << +/D [2419 0 R /XYZ 71.731 729.2652 null] +>> endobj +2422 0 obj << +/D [2419 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2423 0 obj << +/D [2419 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2424 0 obj << +/D [2419 0 R /XYZ 71.731 706.1869 null] +>> endobj +2425 0 obj << +/D [2419 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2426 0 obj << +/D [2419 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2427 0 obj << +/D [2419 0 R /XYZ 71.731 688.2541 null] +>> endobj +2428 0 obj << +/D [2419 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2429 0 obj << +/D [2419 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2430 0 obj << +/D [2419 0 R /XYZ 71.731 670.3214 null] +>> endobj +2431 0 obj << +/D [2419 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2432 0 obj << +/D [2419 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2433 0 obj << +/D [2419 0 R /XYZ 71.731 652.3886 null] +>> endobj +2434 0 obj << +/D [2419 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2435 0 obj << +/D [2419 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2436 0 obj << +/D [2419 0 R /XYZ 71.731 634.4559 null] +>> endobj +2437 0 obj << +/D [2419 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2438 0 obj << +/D [2419 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2439 0 obj << +/D [2419 0 R /XYZ 71.731 616.5231 null] +>> endobj +2440 0 obj << +/D [2419 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2441 0 obj << +/D [2419 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2442 0 obj << +/D [2419 0 R /XYZ 71.731 598.5904 null] +>> endobj +2443 0 obj << +/D [2419 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2444 0 obj << +/D [2419 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2445 0 obj << +/D [2419 0 R /XYZ 71.731 581.3749 null] +>> endobj +2446 0 obj << +/D [2419 0 R /XYZ 149.4396 564.8817 null] +>> endobj +2447 0 obj << +/D [2419 0 R /XYZ 149.4396 564.8817 null] +>> endobj +2448 0 obj << +/D [2419 0 R /XYZ 71.731 562.7248 null] +>> endobj +2449 0 obj << +/D [2419 0 R /XYZ 149.4396 546.9489 null] +>> endobj +2450 0 obj << +/D [2419 0 R /XYZ 149.4396 546.9489 null] +>> endobj +2451 0 obj << +/D [2419 0 R /XYZ 71.731 545.5094 null] +>> endobj +2452 0 obj << +/D [2419 0 R /XYZ 149.4396 529.0162 null] +>> endobj +2453 0 obj << +/D [2419 0 R /XYZ 149.4396 529.0162 null] +>> endobj +2454 0 obj << +/D [2419 0 R /XYZ 71.731 526.8593 null] +>> endobj +2455 0 obj << +/D [2419 0 R /XYZ 149.4396 511.0834 null] +>> endobj +2456 0 obj << +/D [2419 0 R /XYZ 149.4396 511.0834 null] +>> endobj +2457 0 obj << +/D [2419 0 R /XYZ 71.731 509.6439 null] +>> endobj +2458 0 obj << +/D [2419 0 R /XYZ 149.4396 493.1507 null] +>> endobj +2459 0 obj << +/D [2419 0 R /XYZ 149.4396 493.1507 null] +>> endobj +2460 0 obj << +/D [2419 0 R /XYZ 71.731 490.9938 null] +>> endobj +2461 0 obj << +/D [2419 0 R /XYZ 149.4396 475.2179 null] +>> endobj +2462 0 obj << +/D [2419 0 R /XYZ 149.4396 475.2179 null] +>> endobj +2463 0 obj << +/D [2419 0 R /XYZ 76.7123 457.2852 null] +>> endobj +2464 0 obj << +/D [2419 0 R /XYZ 139.477 439.3524 null] +>> endobj +2465 0 obj << +/D [2419 0 R /XYZ 139.477 439.3524 null] +>> endobj +662 0 obj << +/D [2419 0 R /XYZ 71.731 416.4383 null] +>> endobj +166 0 obj << +/D [2419 0 R /XYZ 265.6609 371.184 null] +>> endobj +2466 0 obj << +/D [2419 0 R /XYZ 71.731 347.6953 null] +>> endobj +2467 0 obj << +/D [2419 0 R /XYZ 161.0655 338.3073 null] +>> endobj +2468 0 obj << +/D [2419 0 R /XYZ 71.731 326.1879 null] +>> endobj +2469 0 obj << +/D [2419 0 R /XYZ 71.731 294.822 null] +>> endobj +2470 0 obj << +/D [2419 0 R /XYZ 168.8063 283.8117 null] +>> endobj +2471 0 obj << +/D [2419 0 R /XYZ 71.731 256.7483 null] +>> endobj +2472 0 obj << +/D [2419 0 R /XYZ 71.731 240.3263 null] +>> endobj +2473 0 obj << +/D [2419 0 R /XYZ 71.731 210.5963 null] +>> endobj +2474 0 obj << +/D [2419 0 R /XYZ 181.5683 197.7345 null] +>> endobj +2475 0 obj << +/D [2419 0 R /XYZ 71.731 187.6723 null] +>> endobj +2476 0 obj << +/D [2419 0 R /XYZ 71.731 156.1007 null] +>> endobj +2477 0 obj << +/D [2419 0 R /XYZ 71.731 143.1393 null] +>> endobj +2478 0 obj << +/D [2419 0 R /XYZ 71.731 141.894 null] +>> endobj +2479 0 obj << +/D [2419 0 R /XYZ 129.5143 122.8154 null] +>> endobj +2480 0 obj << +/D [2419 0 R /XYZ 129.5143 122.8154 null] +>> endobj +2481 0 obj << +/D [2419 0 R /XYZ 71.731 121.3759 null] +>> endobj +2482 0 obj << +/D [2419 0 R /XYZ 71.731 121.3759 null] +>> endobj +2483 0 obj << +/D [2419 0 R /XYZ 139.477 104.8827 null] +>> endobj +2484 0 obj << +/D [2419 0 R /XYZ 139.477 104.8827 null] +>> endobj +2485 0 obj << +/D [2419 0 R /XYZ 71.731 102.7258 null] +>> endobj +2418 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2488 0 obj << +/Length 1281 +/Filter /FlateDecode +>> +stream +xÚ͘]o¤6†ïó+¸Û)㵍Mî²Û¯TM;ZM¯6UD&ƒ–À˜®òï{Œù0`>zSU¹&¯}^?¶ÇÃqA… õõ8u·ì¼Â¿~¾!µdWkv¦èÓáæãO.v|ä{Ôs'Çõ=Äs„K‘äD:‡ã×Íçsp)£|»£o(Ò×}¤Qù[ð¢ï÷úæ1*ÏÙ±ØþuøõæÇCŸ»ù‚ÌšdX"æI×ÙQŒ|J¸UE  N¨è]æŠv0Ôw"j 0˜V×ÊÔhž(åCw†‹)ó³Ã&îðÚùhZ}¸Ò‘Õc•×GLˆ¾¿ƒä)•énÀ³+}”êNC-Ê&èš>ºÅõrÉòÒÂWºˆH¹¯Ñ‡³ó¡Ǟ³Seˆðôžø•×<-î&‰s&c‚,7e3Ä[Ù"q[ÜÄm>:r-ñžŽ©až|a‰ôtMêYAUMߎ $¤ ¯lŽu¹ +F¸ªæ„Ü|ʲòÏË1(£êýfy+ +$)ýÙçY™•ï—è®mÑ-™ºíŽB²"RoÇA˜Êùæ8¸–çÛ®Žy®^ɱ€ÿ‹™]Ó·i懨óøRÆY:g²,÷¨¶sŸ$ٖòÍ÷¢Þâç¨+Žà 5¬¬ÊL_¯Õê (ëƺ§T?äQ˜åǺTþ#MÞ.yüäõ¯PGW5[–kÂ×ݼDfÀãí žk»ë,>ì«„Õ‚G÷Üj Ðaš•ý>Ãs¾Fà±ÑÃëÇž¹Õ¬+­ö2\v0DoÐÚÙjÑ7=}ɒ¨X»ŽRû"µFÚ«J8È(~£|&{P8¡éñ…ìaÊf²G+[̶¸+²Çȇ=_÷|¨mf;r0„ɨB»†MªiÏvª½ªÏÂ@í2SyÍ£ÉÃ&”ƒ½ùÄ)›9L´²ÅÄ-îŠÃÄȇõ0ѳq\ô¹w²f3ð½«yTkÓN5 Qù¢JÁ{½M?œß‚ðÃô,`‚\J–&¡SÍÍA­Zž‚qÐ5300aŸÃÃÿú,M r%ԘóäMÙ úV¶ÈÞwü‘+ýžÿê,M á”Ê… mÊf2t+[Ìж¸+2ôȇ=C÷|T(O±ª}֞ûtž^~êféCN'š[zZ´¼ðF×,»¾û¢ë ¼@!ù\”ª +³f\*‡§ŽÞ¶Wuhós݇^UD‰Å½kÈæ6²e„–¸k }Ø1š6êBôYÕ ªþ´á˜tåšEWcfIâù³Ÿ¡ Íø+4§*8Â7*Ùe“ß”-ÿ…Î2Bendstream +endobj +2487 0 obj << +/Type /Page +/Contents 2488 0 R +/Resources 2486 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2489 0 obj << +/D [2487 0 R /XYZ 71.731 729.2652 null] +>> endobj +2490 0 obj << +/D [2487 0 R /XYZ 139.477 708.3437 null] +>> endobj +2491 0 obj << +/D [2487 0 R /XYZ 139.477 708.3437 null] +>> endobj +2492 0 obj << +/D [2487 0 R /XYZ 71.731 706.1869 null] +>> endobj +2493 0 obj << +/D [2487 0 R /XYZ 139.477 690.4109 null] +>> endobj +2494 0 obj << +/D [2487 0 R /XYZ 139.477 690.4109 null] +>> endobj +2495 0 obj << +/D [2487 0 R /XYZ 76.7123 672.4782 null] +>> endobj +2496 0 obj << +/D [2487 0 R /XYZ 129.5143 654.5454 null] +>> endobj +2497 0 obj << +/D [2487 0 R /XYZ 129.5143 654.5454 null] +>> endobj +2498 0 obj << +/D [2487 0 R /XYZ 71.731 652.3886 null] +>> endobj +2499 0 obj << +/D [2487 0 R /XYZ 129.5143 636.6127 null] +>> endobj +2500 0 obj << +/D [2487 0 R /XYZ 129.5143 636.6127 null] +>> endobj +2501 0 obj << +/D [2487 0 R /XYZ 71.731 634.4559 null] +>> endobj +2502 0 obj << +/D [2487 0 R /XYZ 129.5143 618.6799 null] +>> endobj +2503 0 obj << +/D [2487 0 R /XYZ 129.5143 618.6799 null] +>> endobj +2504 0 obj << +/D [2487 0 R /XYZ 71.731 616.5231 null] +>> endobj +2505 0 obj << +/D [2487 0 R /XYZ 129.5143 600.7472 null] +>> endobj +2506 0 obj << +/D [2487 0 R /XYZ 129.5143 600.7472 null] +>> endobj +2507 0 obj << +/D [2487 0 R /XYZ 71.731 578.6651 null] +>> endobj +2508 0 obj << +/D [2487 0 R /XYZ 71.731 567.7709 null] +>> endobj +2509 0 obj << +/D [2487 0 R /XYZ 71.731 566.5256 null] +>> endobj +2510 0 obj << +/D [2487 0 R /XYZ 129.5143 547.4471 null] +>> endobj +663 0 obj << +/D [2487 0 R /XYZ 71.731 541.0262 null] +>> endobj +170 0 obj << +/D [2487 0 R /XYZ 255.3838 497.2114 null] +>> endobj +2511 0 obj << +/D [2487 0 R /XYZ 71.731 473.7227 null] +>> endobj +2512 0 obj << +/D [2487 0 R /XYZ 161.0655 464.3347 null] +>> endobj +2513 0 obj << +/D [2487 0 R /XYZ 71.731 452.2152 null] +>> endobj +2514 0 obj << +/D [2487 0 R /XYZ 71.731 420.8494 null] +>> endobj +2515 0 obj << +/D [2487 0 R /XYZ 168.8063 409.8391 null] +>> endobj +2516 0 obj << +/D [2487 0 R /XYZ 71.731 382.7757 null] +>> endobj +2517 0 obj << +/D [2487 0 R /XYZ 71.731 354.6974 null] +>> endobj +2518 0 obj << +/D [2487 0 R /XYZ 71.731 323.1159 null] +>> endobj +2519 0 obj << +/D [2487 0 R /XYZ 181.5683 312.1056 null] +>> endobj +2520 0 obj << +/D [2487 0 R /XYZ 71.731 302.0434 null] +>> endobj +2521 0 obj << +/D [2487 0 R /XYZ 71.731 270.4718 null] +>> endobj +2522 0 obj << +/D [2487 0 R /XYZ 71.731 257.5104 null] +>> endobj +2523 0 obj << +/D [2487 0 R /XYZ 71.731 256.2651 null] +>> endobj +2524 0 obj << +/D [2487 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2525 0 obj << +/D [2487 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2526 0 obj << +/D [2487 0 R /XYZ 71.731 235.747 null] +>> endobj +2527 0 obj << +/D [2487 0 R /XYZ 71.731 235.747 null] +>> endobj +2528 0 obj << +/D [2487 0 R /XYZ 139.477 219.2538 null] +>> endobj +2529 0 obj << +/D [2487 0 R /XYZ 139.477 219.2538 null] +>> endobj +2530 0 obj << +/D [2487 0 R /XYZ 71.731 217.097 null] +>> endobj +2531 0 obj << +/D [2487 0 R /XYZ 139.477 201.321 null] +>> endobj +2532 0 obj << +/D [2487 0 R /XYZ 139.477 201.321 null] +>> endobj +2533 0 obj << +/D [2487 0 R /XYZ 71.731 199.1642 null] +>> endobj +2534 0 obj << +/D [2487 0 R /XYZ 139.477 183.3883 null] +>> endobj +2535 0 obj << +/D [2487 0 R /XYZ 139.477 183.3883 null] +>> endobj +2536 0 obj << +/D [2487 0 R /XYZ 76.7123 165.4555 null] +>> endobj +2537 0 obj << +/D [2487 0 R /XYZ 129.5143 147.5228 null] +>> endobj +2538 0 obj << +/D [2487 0 R /XYZ 129.5143 147.5228 null] +>> endobj +2539 0 obj << +/D [2487 0 R /XYZ 71.731 146.3438 null] +>> endobj +2540 0 obj << +/D [2487 0 R /XYZ 71.731 146.3438 null] +>> endobj +2541 0 obj << +/D [2487 0 R /XYZ 139.477 129.59 null] +>> endobj +2542 0 obj << +/D [2487 0 R /XYZ 139.477 129.59 null] +>> endobj +2543 0 obj << +/D [2487 0 R /XYZ 71.731 127.4332 null] +>> endobj +2544 0 obj << +/D [2487 0 R /XYZ 139.477 111.6573 null] +>> endobj +2545 0 obj << +/D [2487 0 R /XYZ 139.477 111.6573 null] +>> endobj +2546 0 obj << +/D [2487 0 R /XYZ 71.731 110.2765 null] +>> endobj +2547 0 obj << +/D [2487 0 R /XYZ 71.731 110.2765 null] +>> endobj +2486 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2550 0 obj << +/Length 1216 +/Filter /FlateDecode +>> +stream +xÚ­˜[o£8Çßû)xk" ^_1ô-;ÝKWÓQ4ÍÛΪ¢ÁiPˆ€lÕo?‡‹‰ æ¢ÝQ€ôoŸ??ûÛÃq$A’Á…ˆz‚:Ûã v^á_ܐFâ6×ýº¹ùåw†õœÍÎa‡„äŽdù‚øÎ&ú{ñyž +•-]*ð‚¢úº>„‰*¾„/õãjýPß<ªbŸFùòŸÍ_7¿mÚø‚IødÔ$ |$°ð—bP"¬*ÂÄ¥„wÁ>bœÉö]hàHDÊ÷„wѲVU¾ËwJŵ7 x“žcö§£^_/.t«¾ æ;> õxeƒƒ àÚõìÞÓì­´RÙ¾ LjsÁ H©»«©æE'¯Ÿê‡§ó 4¯ïÃ(ÊTÞíßÝ  7‚ƒqŽ¦j˜c«šäh‹:ƒcφcÇG”äÔ‘r„ɇu_õî¥Ú¦Ifõãý×'ý{ö¤ÂnIáêÓ Ü†j·VMã¶DƒûÚÆnÓà&?÷)‹ÿ ¶àHpÁ'`ªØZ5 Ûuìk°MäÇ0ÿÿ5Bwb…È<ä*' ªˆZ5 ÑuÄkMÇj=²0d +Óz˜áªž­ðCñÿŽVè5ÒÛ¥Ð8,âím3»³ö?xí·§[hB‡øȓÁT6T#àUÓÃ`‰:g®m ƒéã%KÃhæ…e$¬õ8«_aµ\’ê[ýÃ¥»Y« ÆHr9U– Õ]­š¦k‰:‡îµº¦c¸µpþÃn˜ëãjÉñâó,ˆÂ‡-!áåÖT ClU“mQg@ìÙ°Cìøx õ~ØË­0ï§,p¯K±€@K*Ք®vÞvȂpæûEA«\SfAÞëm9ìù1å5î0sݪï£Ë\½i#Ï÷Ïû4/žß”»'‘  ŽsÿҖ€·$­˜&Íú÷ôg}Svß(JܪÜST±ׇî!=\¨?>êIðMç,Éïzp`D:\ +håÙÇD‹\Cu’²±BqÝ×àˆP +'BmA‡D7²™0Šƒž¦‰8)°¤¾ÄzK|Þna^ï·f˜ÀœDp@«ÆÖ@Òg¬BI™¨;^yX”þâ^T¡VQ9m‘¹N2‰|Š]yô”^½z¯³´H‹“ºk[\¦TÓÖ¥–ûfFéHF–Kux.öŸ:)úGzA¾2âê~M#÷*ßfñ©ˆÓdÌ +¼±ð¨i¥1&è¨š$ü†þú!׶¦X¤É¡¹‹ªÎ:}è®wYz¬ïŠ½Š›mG'ò|´! 쎘ôÌé>1æ ¹]U¯Î‡B×7ˆ—½Ç¹Bs)®‡Ú˜j¶Qß҃ÊçŽmã¤ñrŠçÆ\—f!ìÞT6’Ø„ $f™mÊFR»•Mæ¶-îŒäîùèV[ÝeÌ>½·º´ßvÊö*=nX恩> endobj +2551 0 obj << +/D [2549 0 R /XYZ 71.731 729.2652 null] +>> endobj +2552 0 obj << +/D [2549 0 R /XYZ 71.731 741.2204 null] +>> endobj +2553 0 obj << +/D [2549 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2554 0 obj << +/D [2549 0 R /XYZ 149.4396 708.3437 null] +>> endobj +2555 0 obj << +/D [2549 0 R /XYZ 71.731 706.1869 null] +>> endobj +2556 0 obj << +/D [2549 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2557 0 obj << +/D [2549 0 R /XYZ 149.4396 690.4109 null] +>> endobj +2558 0 obj << +/D [2549 0 R /XYZ 71.731 688.2541 null] +>> endobj +2559 0 obj << +/D [2549 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2560 0 obj << +/D [2549 0 R /XYZ 149.4396 672.4782 null] +>> endobj +2561 0 obj << +/D [2549 0 R /XYZ 71.731 670.3214 null] +>> endobj +2562 0 obj << +/D [2549 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2563 0 obj << +/D [2549 0 R /XYZ 149.4396 654.5454 null] +>> endobj +2564 0 obj << +/D [2549 0 R /XYZ 71.731 652.3886 null] +>> endobj +2565 0 obj << +/D [2549 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2566 0 obj << +/D [2549 0 R /XYZ 149.4396 636.6127 null] +>> endobj +2567 0 obj << +/D [2549 0 R /XYZ 71.731 634.4559 null] +>> endobj +2568 0 obj << +/D [2549 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2569 0 obj << +/D [2549 0 R /XYZ 149.4396 618.6799 null] +>> endobj +2570 0 obj << +/D [2549 0 R /XYZ 71.731 616.5231 null] +>> endobj +2571 0 obj << +/D [2549 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2572 0 obj << +/D [2549 0 R /XYZ 149.4396 600.7472 null] +>> endobj +2573 0 obj << +/D [2549 0 R /XYZ 71.731 598.5904 null] +>> endobj +2574 0 obj << +/D [2549 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2575 0 obj << +/D [2549 0 R /XYZ 149.4396 582.8144 null] +>> endobj +2576 0 obj << +/D [2549 0 R /XYZ 76.7123 564.8817 null] +>> endobj +2577 0 obj << +/D [2549 0 R /XYZ 139.477 546.9489 null] +>> endobj +2578 0 obj << +/D [2549 0 R /XYZ 139.477 546.9489 null] +>> endobj +2579 0 obj << +/D [2549 0 R /XYZ 71.731 509.0909 null] +>> endobj +2580 0 obj << +/D [2549 0 R /XYZ 71.731 496.0399 null] +>> endobj +2581 0 obj << +/D [2549 0 R /XYZ 71.731 494.7946 null] +>> endobj +2582 0 obj << +/D [2549 0 R /XYZ 129.5143 475.716 null] +>> endobj +664 0 obj << +/D [2549 0 R /XYZ 71.731 469.2952 null] +>> endobj +174 0 obj << +/D [2549 0 R /XYZ 235.1724 425.4804 null] +>> endobj +2583 0 obj << +/D [2549 0 R /XYZ 71.731 405.3401 null] +>> endobj +2584 0 obj << +/D [2549 0 R /XYZ 161.0655 392.6037 null] +>> endobj +2585 0 obj << +/D [2549 0 R /XYZ 71.731 380.4842 null] +>> endobj +2586 0 obj << +/D [2549 0 R /XYZ 71.731 349.4546 null] +>> endobj +2587 0 obj << +/D [2549 0 R /XYZ 168.8063 338.1081 null] +>> endobj +2588 0 obj << +/D [2549 0 R /XYZ 71.731 311.0446 null] +>> endobj +2589 0 obj << +/D [2549 0 R /XYZ 71.731 281.5303 null] +>> endobj +2590 0 obj << +/D [2549 0 R /XYZ 71.731 263.0412 null] +>> endobj +2591 0 obj << +/D [2549 0 R /XYZ 71.731 232.1051 null] +>> endobj +2592 0 obj << +/D [2549 0 R /XYZ 181.5683 220.4493 null] +>> endobj +2593 0 obj << +/D [2549 0 R /XYZ 71.731 210.3871 null] +>> endobj +2594 0 obj << +/D [2549 0 R /XYZ 71.731 176.9639 null] +>> endobj +2595 0 obj << +/D [2549 0 R /XYZ 71.731 165.8541 null] +>> endobj +2596 0 obj << +/D [2549 0 R /XYZ 71.731 164.6088 null] +>> endobj +2597 0 obj << +/D [2549 0 R /XYZ 129.5143 145.5303 null] +>> endobj +2598 0 obj << +/D [2549 0 R /XYZ 129.5143 145.5303 null] +>> endobj +2599 0 obj << +/D [2549 0 R /XYZ 71.731 144.0907 null] +>> endobj +2600 0 obj << +/D [2549 0 R /XYZ 71.731 144.0907 null] +>> endobj +2601 0 obj << +/D [2549 0 R /XYZ 139.477 127.5975 null] +>> endobj +2602 0 obj << +/D [2549 0 R /XYZ 139.477 127.5975 null] +>> endobj +2603 0 obj << +/D [2549 0 R /XYZ 76.7123 109.6647 null] +>> endobj +2548 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2606 0 obj << +/Length 981 +/Filter /FlateDecode +>> +stream +xÚÍWI£8½×¯à˜HÛûR·šÞÔ£)*åÖ5*1ÁéBJ ¢Vÿûù†˜Â,ÇQäÙïù}‹maøH¤<¨AT +Î8ú }{ ;LìƒþØ?|üÊpd‘TFûcČDBñH1Š´ :Ú§?6ŸÞ’KmËmLÞPÔ>w§$·õ_É¿íקÝ÷öåo[¿iµýgÿç×}Ï/˜BFɬHN4⠛(¦JDEˆAB‹Á1ÎT¿j"àQ˜4‹éq=¬YÍ ¥â½:B)ü ;Þ÷Ï»ŽnÔXӑS%¿é€% ÂÙPG’¦¥­ª×,mÔܤßã $’\ ài ­µY^pn·cÝÏ©Íëìc +1‚©¢XÂhÄM•lùžm}-óêq´öÎ%)œÉÏ}،ç=lÑóï +ÏC:îöžtÜ$λcû¬®‡z¼ž\0@ŸB€·ÆB!¥ƒŒ(íd D5Å ôæ³=ÙÚ>¥[‚7·Èì·o~_ì×rKñ¦8{¢ÍÒ«a¼veQ5Ìñ؏¸§”S‘67|§ÁñkÇßp{Éò‚N®õ›³¡K†2ñµ(_óälßý›¥0Œ„ǝ_øg[ÊìRgE>'A§‘Ô×î$&ù€½ýÒlߎ°$÷ۛû©ºØC[é`(º•.‚„&mØvßݔçäwûRä'÷v½¤ImstªŠcOš¹VXl©Øürj« Ш@¦¤_x yç,?6y’\OuG |寬²h­ýO§S+¬3ã¹8Ùj1‰´q]éœåNË%[˹Û±IJÈØ'fZ £¶¥ZŒ›i1=l±Å„xW´˜‘Žp[èhŠ+`@0¶óª.¯‡¾£wûg3¾é燤) y-íx,a¿œØ.;Pì¡î¶’æX0XŽCMº +‘Ç”›é´©Ý ‘ˆ¡§Ì ®Ô@Ã8Ҟ*&7J>r6ËvÎ =·Óµ]¸Ú¯ìdÞR8=aa–Ž#>l&o{ØbކxWäíHG8o:&v‚€å„JDá7:œ¸ŽUúA˜ÌX*‚™ôBÊú°™œía‹Iâ]‘µ!ž%.m2&Žk÷ìýÁ-숾dÓ5ç’C-›4&]ãÑXDÀ"OðNG&MU#11ª—ªÑ‡ÍTc[¬ÆïŠjéWã@Çÿîr@¸„(k¾ä¹›ó¼ƒ-{à]ãy@Gàr0бòràËt—j®œ.Íì½Û̯݂ €`ÝÏÔèarò ü¸·¬Eendstream +endobj +2605 0 obj << +/Type /Page +/Contents 2606 0 R +/Resources 2604 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2417 0 R +>> endobj +2607 0 obj << +/D [2605 0 R /XYZ 71.731 729.2652 null] +>> endobj +2608 0 obj << +/D [2605 0 R /XYZ 71.731 741.2204 null] +>> endobj +2609 0 obj << +/D [2605 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2610 0 obj << +/D [2605 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2611 0 obj << +/D [2605 0 R /XYZ 71.731 675.3674 null] +>> endobj +2612 0 obj << +/D [2605 0 R /XYZ 71.731 674.1221 null] +>> endobj +2613 0 obj << +/D [2605 0 R /XYZ 129.5143 655.0436 null] +>> endobj +665 0 obj << +/D [2605 0 R /XYZ 71.731 648.6227 null] +>> endobj +178 0 obj << +/D [2605 0 R /XYZ 385.7203 604.8079 null] +>> endobj +2614 0 obj << +/D [2605 0 R /XYZ 71.731 581.3192 null] +>> endobj +2615 0 obj << +/D [2605 0 R /XYZ 161.0655 571.9312 null] +>> endobj +2616 0 obj << +/D [2605 0 R /XYZ 71.731 559.8118 null] +>> endobj +2617 0 obj << +/D [2605 0 R /XYZ 71.731 528.4459 null] +>> endobj +2618 0 obj << +/D [2605 0 R /XYZ 168.8063 517.4356 null] +>> endobj +2619 0 obj << +/D [2605 0 R /XYZ 71.731 490.3722 null] +>> endobj +2620 0 obj << +/D [2605 0 R /XYZ 71.731 459.0063 null] +>> endobj +2621 0 obj << +/D [2605 0 R /XYZ 71.731 442.3687 null] +>> endobj +2622 0 obj << +/D [2605 0 R /XYZ 71.731 411.4327 null] +>> endobj +2623 0 obj << +/D [2605 0 R /XYZ 181.5683 399.7768 null] +>> endobj +2624 0 obj << +/D [2605 0 R /XYZ 71.731 389.7146 null] +>> endobj +2625 0 obj << +/D [2605 0 R /XYZ 71.731 356.2915 null] +>> endobj +2626 0 obj << +/D [2605 0 R /XYZ 71.731 345.1816 null] +>> endobj +2627 0 obj << +/D [2605 0 R /XYZ 71.731 343.9363 null] +>> endobj +2628 0 obj << +/D [2605 0 R /XYZ 129.5143 324.8578 null] +>> endobj +2629 0 obj << +/D [2605 0 R /XYZ 129.5143 324.8578 null] +>> endobj +2630 0 obj << +/D [2605 0 R /XYZ 71.731 323.4182 null] +>> endobj +2631 0 obj << +/D [2605 0 R /XYZ 71.731 323.4182 null] +>> endobj +2632 0 obj << +/D [2605 0 R /XYZ 139.477 306.925 null] +>> endobj +2633 0 obj << +/D [2605 0 R /XYZ 139.477 306.925 null] +>> endobj +2634 0 obj << +/D [2605 0 R /XYZ 76.7123 288.9923 null] +>> endobj +2635 0 obj << +/D [2605 0 R /XYZ 129.5143 271.0595 null] +>> endobj +2636 0 obj << +/D [2605 0 R /XYZ 129.5143 271.0595 null] +>> endobj +2637 0 obj << +/D [2605 0 R /XYZ 71.731 268.9027 null] +>> endobj +2638 0 obj << +/D [2605 0 R /XYZ 71.731 268.9027 null] +>> endobj +2639 0 obj << +/D [2605 0 R /XYZ 139.477 253.1268 null] +>> endobj +2640 0 obj << +/D [2605 0 R /XYZ 71.731 250.9699 null] +>> endobj +2641 0 obj << +/D [2605 0 R /XYZ 139.477 235.194 null] +>> endobj +2642 0 obj << +/D [2605 0 R /XYZ 76.7123 217.2613 null] +>> endobj +2643 0 obj << +/D [2605 0 R /XYZ 129.5143 199.3285 null] +>> endobj +2644 0 obj << +/D [2605 0 R /XYZ 129.5143 199.3285 null] +>> endobj +2645 0 obj << +/D [2605 0 R /XYZ 71.731 177.9637 null] +>> endobj +2646 0 obj << +/D [2605 0 R /XYZ 71.731 166.3523 null] +>> endobj +2647 0 obj << +/D [2605 0 R /XYZ 71.731 165.1069 null] +>> endobj +2648 0 obj << +/D [2605 0 R /XYZ 129.5143 146.0284 null] +>> endobj +666 0 obj << +/D [2605 0 R /XYZ 71.731 139.6075 null] +>> endobj +2604 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2651 0 obj << +/Length 843 +/Filter /FlateDecode +>> +stream +xÚ½WÍoÚ0½÷¯È¤ÆóGüÕ]·iÓ&U·uB)1%$UbTí¿Ÿpˆ\6q0QžýžŸßÏvPÍ%NLƒ%ÀŒâd¹½É«yõåyHê1iºŸß|øL`"d˜%óUB$”g 'ŠD2/~M>®ó7­šiŠ)œ`àÚÇM^)ý=q³Ç¯îÏ¥×uÑNÏ¿Ý|šø)á@ +CrVä5”‰Q‚8ÀˆfVg7cÈB\îeb@„ÇÅäAm”V³bŠà¤hTÛΧ Nþ¼)+ˌ%ƒ)g y’Ú)sÆ÷c=6µ®µépwè!L¶'÷}SŒC‘wŒžM8¶½#ϐÂ|§×·î1w˜…}Q‹ºYTùVŠ¨K;²P݃j—Mù¦Ëº:§˜µd8Ô×z UOŠ{°z€Í,EŠ`„³}×'¥wMåQÈ5åʵín¹4#¬v?»•µ<ßm´Ç×z­š÷²uC_3¹ÙfSO1¼«Â ñToT{í:äŶ¬®¥zœ":É㾉·£3‹”"žd”žIÍ앆0—Y™˜> endobj +2652 0 obj << +/D [2650 0 R /XYZ 71.731 729.2652 null] +>> endobj +2653 0 obj << +/D [2650 0 R /XYZ 71.731 741.2204 null] +>> endobj +182 0 obj << +/D [2650 0 R /XYZ 274.3201 706.1179 null] +>> endobj +2654 0 obj << +/D [2650 0 R /XYZ 71.731 682.6291 null] +>> endobj +2655 0 obj << +/D [2650 0 R /XYZ 161.0655 673.2412 null] +>> endobj +2656 0 obj << +/D [2650 0 R /XYZ 71.731 661.1217 null] +>> endobj +2657 0 obj << +/D [2650 0 R /XYZ 71.731 575.2602 null] +>> endobj +2658 0 obj << +/D [2650 0 R /XYZ 71.731 544.3242 null] +>> endobj +2659 0 obj << +/D [2650 0 R /XYZ 181.5683 532.6683 null] +>> endobj +2660 0 obj << +/D [2650 0 R /XYZ 71.731 522.6062 null] +>> endobj +2661 0 obj << +/D [2650 0 R /XYZ 71.731 491.0346 null] +>> endobj +2662 0 obj << +/D [2650 0 R /XYZ 71.731 478.0732 null] +>> endobj +2663 0 obj << +/D [2650 0 R /XYZ 71.731 476.8278 null] +>> endobj +2664 0 obj << +/D [2650 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2665 0 obj << +/D [2650 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2666 0 obj << +/D [2650 0 R /XYZ 71.731 456.3097 null] +>> endobj +2667 0 obj << +/D [2650 0 R /XYZ 71.731 456.3097 null] +>> endobj +2668 0 obj << +/D [2650 0 R /XYZ 139.477 439.8165 null] +>> endobj +2669 0 obj << +/D [2650 0 R /XYZ 139.477 439.8165 null] +>> endobj +2670 0 obj << +/D [2650 0 R /XYZ 76.7123 421.8838 null] +>> endobj +2671 0 obj << +/D [2650 0 R /XYZ 129.5143 403.951 null] +>> endobj +2672 0 obj << +/D [2650 0 R /XYZ 129.5143 403.951 null] +>> endobj +2673 0 obj << +/D [2650 0 R /XYZ 71.731 401.7942 null] +>> endobj +2674 0 obj << +/D [2650 0 R /XYZ 71.731 401.7942 null] +>> endobj +2675 0 obj << +/D [2650 0 R /XYZ 139.477 386.0183 null] +>> endobj +2676 0 obj << +/D [2650 0 R /XYZ 71.731 383.8615 null] +>> endobj +2677 0 obj << +/D [2650 0 R /XYZ 139.477 368.0855 null] +>> endobj +2678 0 obj << +/D [2650 0 R /XYZ 71.731 330.2275 null] +>> endobj +2679 0 obj << +/D [2650 0 R /XYZ 71.731 317.1765 null] +>> endobj +2680 0 obj << +/D [2650 0 R /XYZ 71.731 315.9312 null] +>> endobj +2681 0 obj << +/D [2650 0 R /XYZ 129.5143 296.8527 null] +>> endobj +667 0 obj << +/D [2650 0 R /XYZ 71.731 290.4318 null] +>> endobj +186 0 obj << +/D [2650 0 R /XYZ 247.7568 246.617 null] +>> endobj +2682 0 obj << +/D [2650 0 R /XYZ 71.731 226.4767 null] +>> endobj +2683 0 obj << +/D [2650 0 R /XYZ 161.0655 213.7403 null] +>> endobj +2684 0 obj << +/D [2650 0 R /XYZ 71.731 201.6208 null] +>> endobj +2685 0 obj << +/D [2650 0 R /XYZ 71.731 170.5912 null] +>> endobj +2686 0 obj << +/D [2650 0 R /XYZ 168.8063 159.2447 null] +>> endobj +2687 0 obj << +/D [2650 0 R /XYZ 71.731 132.1812 null] +>> endobj +2649 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2690 0 obj << +/Length 999 +/Filter /FlateDecode +>> +stream +xÚíWKo¬6ÞçW°œ‘‚‹mŒ!»ÜÜ&JÕFQ4RMqÁ“Ae`ÄCQÿ}±ÍÓ3Ì®]T³°¾ãóù¼ÁŽ?ìpŒ8……DˆŒ8ÉñÆs>áÕÓ ÖWcÜ1èÛîæ§Gê9Š8»½C£1î;œ2:»ôÍÃ!>5¢Úº„y‚ÔúšÇ…h~¨Çû×gµùM4‡2­·î~¹ùy×ëg”£(%Iö¨%M9!Ð |IÃ[†}êp/DÔ§¼ãùû`òöòüòt§ØìY­v_Yž«]·µPÛæ 7©ÈE“•…z*÷jHQ¦BŸ“FԜü£,µ«›¸H^®ã┵7Ñ´U¡°>Ik©Û$u½oó[õÇ~‹Aw›7_Íê+«Õѝ)¹zëJñ@Yâ>ÏË-a›/‘ª#ÞÊ\Ôw½ø`I#M0 +puÒqz„[^©êu‹Ù&®â£€Q*Æ~Ç<Å0wXHQ„=jõ{rÇ0ãwˆ îáÎï‹Ó$…wBØB/!˜XõÎׁ‡‘Zò ¡-þ&<â¶9XÌF|äI rg¥j“æv–:R^M–ÄC(*d[‰å …€} ά†5(w  ‹eM˜\ÈÀÎœï?²ê=oX#µä15,Ïù”Æ=ØE•‹ud™kn߬ø4öµ˜õ¨ŽS™\ªUV…³ÑK=„1ÁkÑ;‚]Š^[^‹Þk¢wÎãLôŽyÂWGï`ÝoÓê×?—BVðy¥Ð5ð|‰ðy€BxZ1òvÁÈ=lÕÈ6½WÙÆc°[oä ¬0Y¶ h?ŽfÇ\Æ©LcÊT^ä{²ópó]ö/ñPûÇ,Õay|¶õ¤öíÉâ[Ÿ£x|VЫ²)›¿OâÚv1×môJÝÝÞ=æÉÚ¦ožòãÝóH.>²ôvè°²“|J1øû£¬>dD‚,¾¶}uRe'™å—¸Sq2æ®ûlÜó“ì>ÛjT0_ݟኳù¡>‰$“Óp'÷Ñ#Óó~&5éx¨Í+UyVü%ç1«Vý!sºfú±@7Ȏ|oiµŠª*+sóJVu9*Òÿ‡k…ÂA 7þJ…Ã.T¨¶Z¡lz¯¨P ö60áñï 1Ø¥ëøÊ3†]bzØêcÓ{ųàab&4þC ´zÄ%kÑ;‚]Š^[^‹Þk¢wÎãLôŽyt½eŸuÅbç€CËä³8zòÃZåÏR郮ÎWóëêlðyˆƒèâ7ø³üg$„T‹¢þ$I•†g?¨- +ÿÁŠÈ…endstream +endobj +2689 0 obj << +/Type /Page +/Contents 2690 0 R +/Resources 2688 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2691 0 obj << +/D [2689 0 R /XYZ 71.731 729.2652 null] +>> endobj +2692 0 obj << +/D [2689 0 R /XYZ 71.731 718.3063 null] +>> endobj +2693 0 obj << +/D [2689 0 R /XYZ 71.731 670.4852 null] +>> endobj +2694 0 obj << +/D [2689 0 R /XYZ 181.5683 658.8294 null] +>> endobj +2695 0 obj << +/D [2689 0 R /XYZ 71.731 648.7672 null] +>> endobj +2696 0 obj << +/D [2689 0 R /XYZ 71.731 617.1956 null] +>> endobj +2697 0 obj << +/D [2689 0 R /XYZ 71.731 604.2342 null] +>> endobj +2698 0 obj << +/D [2689 0 R /XYZ 71.731 602.9889 null] +>> endobj +2699 0 obj << +/D [2689 0 R /XYZ 129.5143 583.9103 null] +>> endobj +2700 0 obj << +/D [2689 0 R /XYZ 129.5143 583.9103 null] +>> endobj +2701 0 obj << +/D [2689 0 R /XYZ 71.731 582.4708 null] +>> endobj +2702 0 obj << +/D [2689 0 R /XYZ 71.731 582.4708 null] +>> endobj +2703 0 obj << +/D [2689 0 R /XYZ 139.477 565.9776 null] +>> endobj +2704 0 obj << +/D [2689 0 R /XYZ 139.477 565.9776 null] +>> endobj +2705 0 obj << +/D [2689 0 R /XYZ 76.7123 548.0448 null] +>> endobj +2706 0 obj << +/D [2689 0 R /XYZ 129.5143 530.1121 null] +>> endobj +2707 0 obj << +/D [2689 0 R /XYZ 129.5143 530.1121 null] +>> endobj +2708 0 obj << +/D [2689 0 R /XYZ 71.731 508.03 null] +>> endobj +2709 0 obj << +/D [2689 0 R /XYZ 71.731 497.1358 null] +>> endobj +2710 0 obj << +/D [2689 0 R /XYZ 71.731 495.8905 null] +>> endobj +2711 0 obj << +/D [2689 0 R /XYZ 129.5143 476.8119 null] +>> endobj +768 0 obj << +/D [2689 0 R /XYZ 71.731 470.3911 null] +>> endobj +190 0 obj << +/D [2689 0 R /XYZ 372.3613 426.5763 null] +>> endobj +2712 0 obj << +/D [2689 0 R /XYZ 71.731 403.0875 null] +>> endobj +2713 0 obj << +/D [2689 0 R /XYZ 161.0655 393.6996 null] +>> endobj +2714 0 obj << +/D [2689 0 R /XYZ 71.731 381.5801 null] +>> endobj +2715 0 obj << +/D [2689 0 R /XYZ 71.731 350.2143 null] +>> endobj +2716 0 obj << +/D [2689 0 R /XYZ 168.8063 339.204 null] +>> endobj +2717 0 obj << +/D [2689 0 R /XYZ 71.731 312.1405 null] +>> endobj +2718 0 obj << +/D [2689 0 R /XYZ 71.731 284.7079 null] +>> endobj +2719 0 obj << +/D [2689 0 R /XYZ 71.731 253.1263 null] +>> endobj +2720 0 obj << +/D [2689 0 R /XYZ 181.5683 241.4705 null] +>> endobj +2721 0 obj << +/D [2689 0 R /XYZ 71.731 231.4083 null] +>> endobj +2722 0 obj << +/D [2689 0 R /XYZ 71.731 199.8367 null] +>> endobj +2723 0 obj << +/D [2689 0 R /XYZ 71.731 186.8753 null] +>> endobj +2724 0 obj << +/D [2689 0 R /XYZ 71.731 185.63 null] +>> endobj +2725 0 obj << +/D [2689 0 R /XYZ 129.5143 166.5514 null] +>> endobj +2726 0 obj << +/D [2689 0 R /XYZ 129.5143 166.5514 null] +>> endobj +2727 0 obj << +/D [2689 0 R /XYZ 71.731 165.1119 null] +>> endobj +2728 0 obj << +/D [2689 0 R /XYZ 71.731 165.1119 null] +>> endobj +2729 0 obj << +/D [2689 0 R /XYZ 139.477 148.6187 null] +>> endobj +2730 0 obj << +/D [2689 0 R /XYZ 139.477 148.6187 null] +>> endobj +2731 0 obj << +/D [2689 0 R /XYZ 76.7123 130.6859 null] +>> endobj +2732 0 obj << +/D [2689 0 R /XYZ 129.5143 112.7532 null] +>> endobj +2733 0 obj << +/D [2689 0 R /XYZ 129.5143 112.7532 null] +>> endobj +2734 0 obj << +/D [2689 0 R /XYZ 71.731 110.5963 null] +>> endobj +2688 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2738 0 obj << +/Length 1114 +/Filter /FlateDecode +>> +stream +xÚ¥X[£6~Ÿ_Ác"5®/ø¼Mg;ÕVm5Zåm§Ñę H¹hµÿ¾lˆP«}À“ýìós3$Àð’ ÉàA#D§Ááò€ƒø¯_ˆ…ì,fç‚~Ú?üøÂp¡HPìO‹â2 $£Hq¢‚ýñëæù_+]lw”ã EæùšÆ™®~‹ÿ2>½~6‹ßuuΏåöÏý¯?ï{ûœI)02K2$ +… GÁŽbQ½(B"Ä9‘à Vˆ…LöÎÐ(;“Æ™×ÃoÞ(åcv„R¸vvÇϏnהSQEØò—9 ِG–õG‘××÷äøžïY|Ñ ¯Ö‰Û!#¬dc´ÙõhTN²Ê,rûZʪH²©_Ö²ˆ0 + ëÕ³Cí\ØMOÒŽëG»«'„¦aäµ{_Ïn——‡# ‹P(å(òƒ‘âÖ¬Zy­`GUÉÆù®J’ÂÁŠ.©äÀæTê`Ë*yì®QÉÃã’KÄɜP]‚!8‹rð—c¤pÄÛ¾èª.²òqâK—kDCØ6Ÿ¹.l&s{Øbæúì®È\GÃþ]ºcfUíOåUL=8Þ\±½íóiÎzQ’²ûÅà4Éþ޼鎩òÑÞr½ˆæ©‹"/ÚÎ Q +¹‚&ââÂV´é§¨G $˜nn.„¦5zjHÇuZY|„‹oI©Ñڗ÷”¦ù–òÍ·Îõ/yªËµ‘/I¶ÖÔë–p¢ 搙âC¡#D*T ÅDžÍŸ¶X||vWŸ ÿØ0àÑd¤G6"<š Öׇ®RõóY³¿i…' ².ôÝÎH%C˜/5F5Ó;Ôb[ô]ÑÇ$†šÚ¦èrxEÌÔêѕC~…0•½uÑ' sÜ  Ô¥¾·0%–Æ]6·l9n=v×Äí˜Ç¸uy´í㔴Í㳐(Ğ)׊ü¼Tágç»^XÀD³X؜ÌlYfÝ52yܑÙåáiȾK‘Ä’ý¿K…¡ˆÁŒ³Pn¨¹¢`QËEajtMQ˜’˜NÊ.ßubÕ‚(†˜RlA6#K[ÔÅgw…0>Se4Õï¥NÓïfùO§ƒ‰Ê Àÿz „"Âa€žOY6“²=l1e}vW¤¬‡ç:1à±ò:áÒ´sB…Ñì÷3ýÜ邱!Šú“>,ºûñÆcð_¾ù3ëendstream +endobj +2737 0 obj << +/Type /Page +/Contents 2738 0 R +/Resources 2736 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2739 0 obj << +/D [2737 0 R /XYZ 71.731 729.2652 null] +>> endobj +2740 0 obj << +/D [2737 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2741 0 obj << +/D [2737 0 R /XYZ 129.5143 708.3437 null] +>> endobj +2742 0 obj << +/D [2737 0 R /XYZ 71.731 706.1869 null] +>> endobj +2743 0 obj << +/D [2737 0 R /XYZ 71.731 706.1869 null] +>> endobj +2744 0 obj << +/D [2737 0 R /XYZ 139.477 690.4109 null] +>> endobj +2745 0 obj << +/D [2737 0 R /XYZ 71.731 688.2541 null] +>> endobj +2746 0 obj << +/D [2737 0 R /XYZ 139.477 672.4782 null] +>> endobj +2747 0 obj << +/D [2737 0 R /XYZ 71.731 634.6202 null] +>> endobj +2748 0 obj << +/D [2737 0 R /XYZ 71.731 621.5692 null] +>> endobj +2749 0 obj << +/D [2737 0 R /XYZ 71.731 620.3239 null] +>> endobj +2750 0 obj << +/D [2737 0 R /XYZ 129.5143 601.2453 null] +>> endobj +769 0 obj << +/D [2737 0 R /XYZ 71.731 594.8244 null] +>> endobj +194 0 obj << +/D [2737 0 R /XYZ 321.0597 551.0097 null] +>> endobj +2751 0 obj << +/D [2737 0 R /XYZ 71.731 530.8693 null] +>> endobj +2752 0 obj << +/D [2737 0 R /XYZ 161.0655 518.133 null] +>> endobj +2753 0 obj << +/D [2737 0 R /XYZ 71.731 506.0135 null] +>> endobj +2754 0 obj << +/D [2737 0 R /XYZ 71.731 474.9839 null] +>> endobj +2755 0 obj << +/D [2737 0 R /XYZ 168.8063 463.6373 null] +>> endobj +2756 0 obj << +/D [2737 0 R /XYZ 71.731 436.5739 null] +>> endobj +2757 0 obj << +/D [2737 0 R /XYZ 71.731 410.3473 null] +>> endobj +2758 0 obj << +/D [2737 0 R /XYZ 71.731 377.5597 null] +>> endobj +2759 0 obj << +/D [2737 0 R /XYZ 181.5683 365.9038 null] +>> endobj +2760 0 obj << +/D [2737 0 R /XYZ 71.731 355.8417 null] +>> endobj +2761 0 obj << +/D [2737 0 R /XYZ 71.731 324.2701 null] +>> endobj +2762 0 obj << +/D [2737 0 R /XYZ 71.731 311.3087 null] +>> endobj +2763 0 obj << +/D [2737 0 R /XYZ 71.731 310.0633 null] +>> endobj +2764 0 obj << +/D [2737 0 R /XYZ 129.5143 290.9848 null] +>> endobj +2765 0 obj << +/D [2737 0 R /XYZ 129.5143 290.9848 null] +>> endobj +2766 0 obj << +/D [2737 0 R /XYZ 71.731 289.5452 null] +>> endobj +2767 0 obj << +/D [2737 0 R /XYZ 71.731 289.5452 null] +>> endobj +2768 0 obj << +/D [2737 0 R /XYZ 139.477 273.052 null] +>> endobj +2769 0 obj << +/D [2737 0 R /XYZ 139.477 273.052 null] +>> endobj +2770 0 obj << +/D [2737 0 R /XYZ 76.7123 255.1193 null] +>> endobj +2771 0 obj << +/D [2737 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2772 0 obj << +/D [2737 0 R /XYZ 129.5143 237.1865 null] +>> endobj +2773 0 obj << +/D [2737 0 R /XYZ 71.731 235.0297 null] +>> endobj +2774 0 obj << +/D [2737 0 R /XYZ 129.5143 219.2538 null] +>> endobj +2775 0 obj << +/D [2737 0 R /XYZ 129.5143 219.2538 null] +>> endobj +2776 0 obj << +/D [2737 0 R /XYZ 71.731 217.097 null] +>> endobj +2777 0 obj << +/D [2737 0 R /XYZ 71.731 217.097 null] +>> endobj +2778 0 obj << +/D [2737 0 R /XYZ 139.477 201.321 null] +>> endobj +2779 0 obj << +/D [2737 0 R /XYZ 71.731 199.8815 null] +>> endobj +2780 0 obj << +/D [2737 0 R /XYZ 139.477 183.3883 null] +>> endobj +2781 0 obj << +/D [2737 0 R /XYZ 71.731 145.5303 null] +>> endobj +2782 0 obj << +/D [2737 0 R /XYZ 71.731 132.4793 null] +>> endobj +2783 0 obj << +/D [2737 0 R /XYZ 71.731 131.2339 null] +>> endobj +2784 0 obj << +/D [2737 0 R /XYZ 129.5143 112.1554 null] +>> endobj +770 0 obj << +/D [2737 0 R /XYZ 71.731 105.7345 null] +>> endobj +2736 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2787 0 obj << +/Length 891 +/Filter /FlateDecode +>> +stream +xÚµVÉnÛ0½û+t´ˆå"’RniÒiÚÂ|kŠ@‘蘨,¹ZøïKŠ¤,[òrh`À$¡™yoyPýÇàD-8˜Qì%ë ôÞÔ§¯dE|+ã÷…>/&Ÿî ô"1̼ÅÒ#”'„…Þ"ý5½]śZ”3S8ÅÀ¬ó,ÎEý=~5ǛùƒÙüõªH«ÙïŷɗE‡O Q¨@N’줆41òÑ@ótC +xÀyKƒ %ÇÃéÈD-n‹|y/3¡¹(QÏπƒCîùÚOΌyYÔE½ÝˆëN#T¬E´º>F€¡0j`ZÿŸ!…qS¯®Ì1Q_ž!ęx‘©úˆFØøÎxŸÍ¨’RnjYä—òyuSæ•AŽs»–e¼5ÛbiÖª.›¤®:†u,s™¿™s*Ô1sF^‹¦6Û¼HE§¡=zkÊX³s~k+[Ë1÷­Qi×j#©?ŠÔF«È³­öUUƒ”c”‘Ö±z%*繘ûÌ2³{µFþ6¢”"—fâ&ˊ¦ÓwúT(ë—&%N×2¿j>CTe,^«º* Dÿ!JWõˁA0z‹:)¿/fnQä©Æ!Ò †Ö4…gŒéc@„Gqק5äAÂ^ԐºëdŸ‡¾D#aÀA‹\÷Ëùê i}‘×2醑lJ1tÐQ  ±ñÀ:)¿/¶ ,Ò=iÏ!'v4°*ùÑ(îñÀ:­!ýÀ’èî¸GãFÅÅ4é‘èRX úÿa|Uwpñ ëژk÷ua֦ǫ@!C窷'vªzØùêÁ½¤zy©Þ>¶ñ-eÛöFâÌ8 ?¨c™»"¾=ÞÕ¬hªsÐ6²m˜¾¾:,:xÑìƒp¼†ìL"zR'òà¤Î¦aô‚,ŒØųKBŸÄ.žÈFͽM’ˆªZ6™MÍÞláSxHÔ-§Ê¡ÌMdoºxÔ­Zè¿íúñ±Hc3Ɵ‚öûÇÌD … ÷)¹ñ`@`Æè¸'œ @CÛv~¹ß>…VuÝ %úÍ·“‡6mÛÈJH;qš·7@UR]‹p6œŽæÝFn©­ÅMæf¡BÁ–ï²ÿc6è×¾Wƒ¨xD'ôžÌp>§8TÏ_u–4‡¶Gÿiæžendstream +endobj +2786 0 obj << +/Type /Page +/Contents 2787 0 R +/Resources 2785 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2788 0 obj << +/D [2786 0 R /XYZ 71.731 729.2652 null] +>> endobj +2789 0 obj << +/D [2786 0 R /XYZ 71.731 741.2204 null] +>> endobj +198 0 obj << +/D [2786 0 R /XYZ 235.3273 705.7477 null] +>> endobj +2790 0 obj << +/D [2786 0 R /XYZ 71.731 685.6073 null] +>> endobj +2791 0 obj << +/D [2786 0 R /XYZ 161.0655 672.871 null] +>> endobj +2792 0 obj << +/D [2786 0 R /XYZ 71.731 660.7515 null] +>> endobj +2793 0 obj << +/D [2786 0 R /XYZ 71.731 629.7219 null] +>> endobj +2794 0 obj << +/D [2786 0 R /XYZ 168.8063 618.3754 null] +>> endobj +2795 0 obj << +/D [2786 0 R /XYZ 71.731 606.2559 null] +>> endobj +2796 0 obj << +/D [2786 0 R /XYZ 71.731 563.2337 null] +>> endobj +2797 0 obj << +/D [2786 0 R /XYZ 181.5683 552.2234 null] +>> endobj +2798 0 obj << +/D [2786 0 R /XYZ 71.731 542.1612 null] +>> endobj +2799 0 obj << +/D [2786 0 R /XYZ 71.731 510.5896 null] +>> endobj +2800 0 obj << +/D [2786 0 R /XYZ 71.731 497.6282 null] +>> endobj +2801 0 obj << +/D [2786 0 R /XYZ 71.731 496.3829 null] +>> endobj +2802 0 obj << +/D [2786 0 R /XYZ 129.5143 477.3044 null] +>> endobj +2803 0 obj << +/D [2786 0 R /XYZ 129.5143 477.3044 null] +>> endobj +2804 0 obj << +/D [2786 0 R /XYZ 71.731 475.8648 null] +>> endobj +2805 0 obj << +/D [2786 0 R /XYZ 71.731 475.8648 null] +>> endobj +2806 0 obj << +/D [2786 0 R /XYZ 139.477 459.3716 null] +>> endobj +2807 0 obj << +/D [2786 0 R /XYZ 139.477 459.3716 null] +>> endobj +2808 0 obj << +/D [2786 0 R /XYZ 76.7123 441.4389 null] +>> endobj +2809 0 obj << +/D [2786 0 R /XYZ 129.5143 423.5061 null] +>> endobj +2810 0 obj << +/D [2786 0 R /XYZ 129.5143 423.5061 null] +>> endobj +2811 0 obj << +/D [2786 0 R /XYZ 71.731 401.424 null] +>> endobj +2812 0 obj << +/D [2786 0 R /XYZ 71.731 390.5299 null] +>> endobj +2813 0 obj << +/D [2786 0 R /XYZ 71.731 389.2845 null] +>> endobj +2814 0 obj << +/D [2786 0 R /XYZ 129.5143 370.206 null] +>> endobj +771 0 obj << +/D [2786 0 R /XYZ 71.731 363.7851 null] +>> endobj +202 0 obj << +/D [2786 0 R /XYZ 197.5229 319.9704 null] +>> endobj +2815 0 obj << +/D [2786 0 R /XYZ 71.731 296.4816 null] +>> endobj +2816 0 obj << +/D [2786 0 R /XYZ 161.0655 287.0937 null] +>> endobj +2817 0 obj << +/D [2786 0 R /XYZ 71.731 274.9742 null] +>> endobj +2818 0 obj << +/D [2786 0 R /XYZ 71.731 243.6083 null] +>> endobj +2819 0 obj << +/D [2786 0 R /XYZ 168.8063 232.598 null] +>> endobj +2820 0 obj << +/D [2786 0 R /XYZ 71.731 205.5346 null] +>> endobj +2821 0 obj << +/D [2786 0 R /XYZ 71.731 174.1687 null] +>> endobj +2822 0 obj << +/D [2786 0 R /XYZ 71.731 157.5311 null] +>> endobj +2823 0 obj << +/D [2786 0 R /XYZ 71.731 126.5951 null] +>> endobj +2824 0 obj << +/D [2786 0 R /XYZ 181.5683 114.9392 null] +>> endobj +2785 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2827 0 obj << +/Length 941 +/Filter /FlateDecode +>> +stream +xÚÍWÉnÛ0½ç+t´Šåp•rK· ]‚ 0ÐCSª-×B;°dùûMj³hI‡-r=rÞ<>GPüƒ@Ñ,&LI,/hð _]_€ƒ„¶Ao¯?pÄ$VL‹uÀcE¤æŒD¢`±ú6{»IžÊt?™¤3Fìó.O¶iù9ùi^ÝÝØÁ—´ÜìVÅüûâãÅûE_rM⃠’¬Q}š,"¤©„¡ øV‚à¦á‚ë#Ïdõ˜m_YO™”érㆇ“@^ÇŚœC7 MÎZÙµîæ gÉ>yL1óâò4$ AJJBWÞtjT؆Ué`ªšÂ1Þj†Âc²—1̘7îé³áQÍêóà‘O֏äPn<²1A¨‰` —Và¢Ü–å«G˜ùé¶Ì–I™í¶mäaŸö¬( hä¶B…mX#,«wª`g…ÅͧLÄ޸煭fõyt…å1Zwi\¡.ö´xԕŠ(ñTßlû«Ò×#ë£]ÎW»þ¼{)&$so 6äÞ +6î^OÜ)î=åqƽm¿Ó—™Oa. °ˆuζ•}?͙œ¥¦ +¼¸W+£ö¥ÌV‘ xHbÜÌNá¸OÑÖہŠ!J'ÎÀFó6l@ó6ª¹/îÍ}<kÍ;<Ái·v>,—iQ¬¹Ûä§ yÜÀPj¢#Ž§ZR¸´å‡!̝££Ù»4ÇrüÉlŠÝ™Å\ÑÙËSêÙ^ä1ªOªú~WîJœpYÏhüS] ˆ‚(>N¨"²&bd#óy ’šòæ²Ýâuÿ‚©—Ì»´Xî³'s~‡q¼“k*\eµßs «š ÉÑ£g‘X-¿Îa帿½¹½vŽ_l2·Ús–çv´LLÑ°KmÜ`eׅfç64©¦´8]HYèÐ,p\«ö™±Œym"%‡¼¬â ÅýsVØ¥§È~•ç;³£Ï©+•÷»<-¦ZâØeüí6‚á1Ð2#E¡ ( +5l´(øâN( +=þBÜáñoÚˆc¬J´mØ@QÃFÛ_Ü mD‡·èÐøÚP#Œ¸· po u¯/î÷öxøÝÛáaJûd÷6êöºˆÒÝVX&pu}Z/F»ì‰R£J7¨!¡j\ç~Ð)2÷Ix‡6‰‰}C›£û¬Á;.üòmaú¾’E¸“q\¯dø8ûë øÀ»…{endstream +endobj +2826 0 obj << +/Type /Page +/Contents 2827 0 R +/Resources 2825 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2828 0 obj << +/D [2826 0 R /XYZ 71.731 729.2652 null] +>> endobj +2829 0 obj << +/D [2826 0 R /XYZ 71.731 718.3063 null] +>> endobj +2830 0 obj << +/D [2826 0 R /XYZ 71.731 675.3674 null] +>> endobj +2831 0 obj << +/D [2826 0 R /XYZ 71.731 674.1221 null] +>> endobj +2832 0 obj << +/D [2826 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2833 0 obj << +/D [2826 0 R /XYZ 129.5143 655.0436 null] +>> endobj +2834 0 obj << +/D [2826 0 R /XYZ 71.731 653.604 null] +>> endobj +2835 0 obj << +/D [2826 0 R /XYZ 71.731 653.604 null] +>> endobj +2836 0 obj << +/D [2826 0 R /XYZ 139.477 637.1108 null] +>> endobj +2837 0 obj << +/D [2826 0 R /XYZ 139.477 637.1108 null] +>> endobj +2838 0 obj << +/D [2826 0 R /XYZ 76.7123 619.1781 null] +>> endobj +2839 0 obj << +/D [2826 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2840 0 obj << +/D [2826 0 R /XYZ 129.5143 601.2453 null] +>> endobj +2841 0 obj << +/D [2826 0 R /XYZ 71.731 579.1632 null] +>> endobj +2842 0 obj << +/D [2826 0 R /XYZ 71.731 568.2691 null] +>> endobj +2843 0 obj << +/D [2826 0 R /XYZ 71.731 567.0237 null] +>> endobj +2844 0 obj << +/D [2826 0 R /XYZ 129.5143 547.9452 null] +>> endobj +772 0 obj << +/D [2826 0 R /XYZ 71.731 541.5243 null] +>> endobj +206 0 obj << +/D [2826 0 R /XYZ 236.6705 497.7096 null] +>> endobj +2845 0 obj << +/D [2826 0 R /XYZ 71.731 474.2208 null] +>> endobj +2846 0 obj << +/D [2826 0 R /XYZ 161.0655 464.8329 null] +>> endobj +2847 0 obj << +/D [2826 0 R /XYZ 71.731 452.7134 null] +>> endobj +2848 0 obj << +/D [2826 0 R /XYZ 71.731 421.3475 null] +>> endobj +2849 0 obj << +/D [2826 0 R /XYZ 168.8063 410.3372 null] +>> endobj +2850 0 obj << +/D [2826 0 R /XYZ 71.731 383.2738 null] +>> endobj +2851 0 obj << +/D [2826 0 R /XYZ 71.731 351.9079 null] +>> endobj +2852 0 obj << +/D [2826 0 R /XYZ 71.731 335.2703 null] +>> endobj +2853 0 obj << +/D [2826 0 R /XYZ 71.731 304.3343 null] +>> endobj +2854 0 obj << +/D [2826 0 R /XYZ 181.5683 292.6784 null] +>> endobj +2855 0 obj << +/D [2826 0 R /XYZ 71.731 282.6163 null] +>> endobj +2856 0 obj << +/D [2826 0 R /XYZ 71.731 251.0447 null] +>> endobj +2857 0 obj << +/D [2826 0 R /XYZ 71.731 238.0833 null] +>> endobj +2858 0 obj << +/D [2826 0 R /XYZ 71.731 236.8379 null] +>> endobj +2859 0 obj << +/D [2826 0 R /XYZ 129.5143 217.7594 null] +>> endobj +2860 0 obj << +/D [2826 0 R /XYZ 129.5143 217.7594 null] +>> endobj +2861 0 obj << +/D [2826 0 R /XYZ 71.731 216.3198 null] +>> endobj +2862 0 obj << +/D [2826 0 R /XYZ 71.731 216.3198 null] +>> endobj +2863 0 obj << +/D [2826 0 R /XYZ 139.477 199.8266 null] +>> endobj +2864 0 obj << +/D [2826 0 R /XYZ 139.477 199.8266 null] +>> endobj +2865 0 obj << +/D [2826 0 R /XYZ 76.7123 181.8939 null] +>> endobj +2866 0 obj << +/D [2826 0 R /XYZ 129.5143 163.9611 null] +>> endobj +2867 0 obj << +/D [2826 0 R /XYZ 129.5143 163.9611 null] +>> endobj +2868 0 obj << +/D [2826 0 R /XYZ 71.731 141.879 null] +>> endobj +2869 0 obj << +/D [2826 0 R /XYZ 71.731 130.9849 null] +>> endobj +2870 0 obj << +/D [2826 0 R /XYZ 71.731 129.7396 null] +>> endobj +2871 0 obj << +/D [2826 0 R /XYZ 129.5143 110.661 null] +>> endobj +773 0 obj << +/D [2826 0 R /XYZ 71.731 104.2401 null] +>> endobj +2825 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2874 0 obj << +/Length 830 +/Filter /FlateDecode +>> +stream +xÚÅV]o›0}ϯà1HÅó¶qß²u«:­UTEÚÃ:MŒ8 Eû÷³cC @’‡MS¥ʽ÷ß#ê?äq8Ñ 3Š½d;ÞZzœ g8› mô~1y÷‰@OÁ0ó+(=N0ˆ(Š¼ÅòÛôÃ&Þ)Yú¦pŠ]çYœKõ%þi_gó'ûð,Õ¦XVþ÷ÅçÉÇEƒO "Ò I6V}šyˆŒhhxÖ;† Äő&!5äx4}™TòYVUì#8]ûþ•†“$Zû 9ˆ0ä^`öË?š—…*Ôo<"íÁŽÈÎ7À0YäÜZZÞ …ñ^mîìëÖ~û‘.õ4@$¨ã¶‰<È*)ӝJ‹ü¢ÏŒá6•Ê¢Æpû¢äv—ÅJP« áìèý*վ̝7²Kº²kµOhµÏܞVFÚxŸ)g_¨,ieCß²¿Y–>¦Óƒ\Ú¯E&«[U—Û4¿jî#:Ëx«Õ)-D;=€RĽrÀCAÓ³± +Úf6=…§S—Cdô£ +oÓ.ƀ„➯'µWŸ‰Zª!]D…¤Ëäå€l8Ð “{wäªÜ'êî¬Â¿ÌUšÄ&1ۖûRö7XS DˆÑaak« mv™bïl¨6V>ġĶöêóè +«¿†œwiÌ´.¶û ¨Ku•…º±žë›æëZßY·6œ-Ü®ûJŽg/$@Pt-yOV—r×Y]OÝ>è-™{Fb$q[$N=tT_zAßN{N—Fê7±žk¦L@Z‚N×pýp¼] +£P\Q¼mvAòÆìªæC¸7ˆ>Äã¤a£z‡Gš×`t ¸óèLèÀ´œˆè’ÖÁ0¡¬žÑ¬3£_¤:øXò×híüÍ!}ÄCm¼¡që9ñu~"×®ÿfT¨n7Gÿ¯>Ò²Í^_ž^]º/6©‹wH³Ì>%±é¶lÜÃÒ@7=¦pÇ×.=:di§}R3V›Xú‘ûW FûÝ0څáîƒadÚ±¸xnÙôï¿Gz + +ÑD2œC> endobj +2875 0 obj << +/D [2873 0 R /XYZ 71.731 729.2652 null] +>> endobj +210 0 obj << +/D [2873 0 R /XYZ 239.1835 706.1179 null] +>> endobj +2876 0 obj << +/D [2873 0 R /XYZ 71.731 682.3623 null] +>> endobj +2877 0 obj << +/D [2873 0 R /XYZ 161.0655 673.2412 null] +>> endobj +2878 0 obj << +/D [2873 0 R /XYZ 71.731 661.1217 null] +>> endobj +2879 0 obj << +/D [2873 0 R /XYZ 71.731 629.7558 null] +>> endobj +2880 0 obj << +/D [2873 0 R /XYZ 168.8063 618.7455 null] +>> endobj +2881 0 obj << +/D [2873 0 R /XYZ 71.731 591.6821 null] +>> endobj +2882 0 obj << +/D [2873 0 R /XYZ 71.731 575.2602 null] +>> endobj +2883 0 obj << +/D [2873 0 R /XYZ 71.731 544.3242 null] +>> endobj +2884 0 obj << +/D [2873 0 R /XYZ 181.5683 532.6683 null] +>> endobj +2885 0 obj << +/D [2873 0 R /XYZ 71.731 522.6062 null] +>> endobj +2886 0 obj << +/D [2873 0 R /XYZ 71.731 491.0346 null] +>> endobj +2887 0 obj << +/D [2873 0 R /XYZ 71.731 478.0732 null] +>> endobj +2888 0 obj << +/D [2873 0 R /XYZ 71.731 476.8278 null] +>> endobj +2889 0 obj << +/D [2873 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2890 0 obj << +/D [2873 0 R /XYZ 129.5143 457.7493 null] +>> endobj +2891 0 obj << +/D [2873 0 R /XYZ 71.731 456.3097 null] +>> endobj +2892 0 obj << +/D [2873 0 R /XYZ 71.731 456.3097 null] +>> endobj +2893 0 obj << +/D [2873 0 R /XYZ 139.477 439.8165 null] +>> endobj +2894 0 obj << +/D [2873 0 R /XYZ 139.477 439.8165 null] +>> endobj +2895 0 obj << +/D [2873 0 R /XYZ 76.7123 421.8838 null] +>> endobj +2896 0 obj << +/D [2873 0 R /XYZ 129.5143 403.951 null] +>> endobj +2897 0 obj << +/D [2873 0 R /XYZ 129.5143 403.951 null] +>> endobj +2898 0 obj << +/D [2873 0 R /XYZ 71.731 381.8689 null] +>> endobj +2899 0 obj << +/D [2873 0 R /XYZ 71.731 370.9748 null] +>> endobj +2900 0 obj << +/D [2873 0 R /XYZ 71.731 369.7295 null] +>> endobj +2901 0 obj << +/D [2873 0 R /XYZ 129.5143 350.6509 null] +>> endobj +774 0 obj << +/D [2873 0 R /XYZ 71.731 344.23 null] +>> endobj +214 0 obj << +/D [2873 0 R /XYZ 295.2367 300.4153 null] +>> endobj +2902 0 obj << +/D [2873 0 R /XYZ 71.731 280.2749 null] +>> endobj +2903 0 obj << +/D [2873 0 R /XYZ 161.0655 267.5386 null] +>> endobj +2904 0 obj << +/D [2873 0 R /XYZ 71.731 255.4191 null] +>> endobj +2905 0 obj << +/D [2873 0 R /XYZ 71.731 224.3895 null] +>> endobj +2906 0 obj << +/D [2873 0 R /XYZ 168.8063 213.0429 null] +>> endobj +2907 0 obj << +/D [2873 0 R /XYZ 71.731 185.9795 null] +>> endobj +2908 0 obj << +/D [2873 0 R /XYZ 71.731 156.4652 null] +>> endobj +2909 0 obj << +/D [2873 0 R /XYZ 71.731 139.8276 null] +>> endobj +2872 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2912 0 obj << +/Length 878 +/Filter /FlateDecode +>> +stream +xÚÍWM›0½çWpL¤ÆõÆ°·´Û®¶jW«U¤º=PB6¨$¬ÀQÔß16ĨT©Õ ì¿ç7ãa †?⠂ƒ  8õ’ý {/ð¯»1¥Á,mлõìíG†½E ¼õÖcQ€¸ð=Á( +9 ½õæÛüý.~•i¹XRŽçéëcRù9þ¡®ïõ͗TîŠMµø¾þ4û°nù9( +dPd‹êˤ‘%“qN„'pˆ˜ÏD­s•çłòù)Ýh-OEžV7JJB|à«x³Ò’0ª£ãÍ>;´Ø3ײ+KD ©„Ïã2Þ§`Œ¦°wÛê C>õçn[Ô҆5»'&Ý¶0%á™RÞã¥ì ÔÉ{y=ëh¢ú:Xh¹F 'œø¬«#>ʝÃ6ê#¬äF§£’å1‘o. +Fŧ™%±ÌŠƒ<–iƒ‘‘ÈmlƒZÚ°³±D„ΆØUc!ù˜ú‘“÷º±MT_G×X!_ˆ®Œø¢“Ã] À‡széovxiüuغ×ËÕ÷²Ð×c•^­^."„þHõÚ°êma£ÕëâP½=îêíè8Àž\½gwRyZ»úç ü Œ_endstream +endobj +2911 0 obj << +/Type /Page +/Contents 2912 0 R +/Resources 2910 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 2735 0 R +>> endobj +2913 0 obj << +/D [2911 0 R /XYZ 71.731 729.2652 null] +>> endobj +776 0 obj << +/D [2911 0 R /XYZ 71.731 741.2204 null] +>> endobj +2914 0 obj << +/D [2911 0 R /XYZ 71.731 718.3063 null] +>> endobj +2915 0 obj << +/D [2911 0 R /XYZ 181.5683 708.3437 null] +>> endobj +2916 0 obj << +/D [2911 0 R /XYZ 71.731 698.2815 null] +>> endobj +2917 0 obj << +/D [2911 0 R /XYZ 71.731 666.7099 null] +>> endobj +2918 0 obj << +/D [2911 0 R /XYZ 71.731 653.7485 null] +>> endobj +2919 0 obj << +/D [2911 0 R /XYZ 71.731 652.5032 null] +>> endobj +2920 0 obj << +/D [2911 0 R /XYZ 129.5143 633.4246 null] +>> endobj +2921 0 obj << +/D [2911 0 R /XYZ 129.5143 633.4246 null] +>> endobj +2922 0 obj << +/D [2911 0 R /XYZ 71.731 631.9851 null] +>> endobj +2923 0 obj << +/D [2911 0 R /XYZ 71.731 631.9851 null] +>> endobj +2924 0 obj << +/D [2911 0 R /XYZ 139.477 615.4919 null] +>> endobj +2925 0 obj << +/D [2911 0 R /XYZ 139.477 615.4919 null] +>> endobj +2926 0 obj << +/D [2911 0 R /XYZ 76.7123 597.5591 null] +>> endobj +2927 0 obj << +/D [2911 0 R /XYZ 129.5143 579.6264 null] +>> endobj +2928 0 obj << +/D [2911 0 R /XYZ 129.5143 579.6264 null] +>> endobj +2929 0 obj << +/D [2911 0 R /XYZ 71.731 557.5443 null] +>> endobj +2930 0 obj << +/D [2911 0 R /XYZ 71.731 546.6501 null] +>> endobj +2931 0 obj << +/D [2911 0 R /XYZ 71.731 545.4048 null] +>> endobj +2932 0 obj << +/D [2911 0 R /XYZ 129.5143 526.3263 null] +>> endobj +775 0 obj << +/D [2911 0 R /XYZ 71.731 519.9054 null] +>> endobj +218 0 obj << +/D [2911 0 R /XYZ 273.1838 476.0906 null] +>> endobj +2933 0 obj << +/D [2911 0 R /XYZ 71.731 452.6019 null] +>> endobj +2934 0 obj << +/D [2911 0 R /XYZ 161.0655 443.2139 null] +>> endobj +2935 0 obj << +/D [2911 0 R /XYZ 71.731 431.0945 null] +>> endobj +2936 0 obj << +/D [2911 0 R /XYZ 71.731 399.7286 null] +>> endobj +2937 0 obj << +/D [2911 0 R /XYZ 168.8063 388.7183 null] +>> endobj +2938 0 obj << +/D [2911 0 R /XYZ 71.731 361.6549 null] +>> endobj +2939 0 obj << +/D [2911 0 R /XYZ 71.731 330.289 null] +>> endobj +2940 0 obj << +/D [2911 0 R /XYZ 71.731 313.6514 null] +>> endobj +2941 0 obj << +/D [2911 0 R /XYZ 71.731 282.7154 null] +>> endobj +2942 0 obj << +/D [2911 0 R /XYZ 181.5683 271.0595 null] +>> endobj +2943 0 obj << +/D [2911 0 R /XYZ 71.731 260.9973 null] +>> endobj +2944 0 obj << +/D [2911 0 R /XYZ 71.731 229.4257 null] +>> endobj +2945 0 obj << +/D [2911 0 R /XYZ 71.731 216.4643 null] +>> endobj +2946 0 obj << +/D [2911 0 R /XYZ 71.731 215.219 null] +>> endobj +2947 0 obj << +/D [2911 0 R /XYZ 129.5143 196.1405 null] +>> endobj +2948 0 obj << +/D [2911 0 R /XYZ 129.5143 196.1405 null] +>> endobj +2949 0 obj << +/D [2911 0 R /XYZ 71.731 194.7009 null] +>> endobj +2950 0 obj << +/D [2911 0 R /XYZ 71.731 194.7009 null] +>> endobj +2951 0 obj << +/D [2911 0 R /XYZ 139.477 178.2077 null] +>> endobj +2952 0 obj << +/D [2911 0 R /XYZ 139.477 178.2077 null] +>> endobj +2953 0 obj << +/D [2911 0 R /XYZ 76.7123 160.275 null] +>> endobj +2954 0 obj << +/D [2911 0 R /XYZ 129.5143 142.3422 null] +>> endobj +2955 0 obj << +/D [2911 0 R /XYZ 129.5143 142.3422 null] +>> endobj +2956 0 obj << +/D [2911 0 R /XYZ 71.731 120.2601 null] +>> endobj +2957 0 obj << +/D [2911 0 R /XYZ 71.731 109.366 null] +>> endobj +2958 0 obj << +/D [2911 0 R /XYZ 71.731 108.1206 null] +>> endobj +2910 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2961 0 obj << +/Length 996 +/Filter /FlateDecode +>> +stream +xÚ¥W[oÛ6}ϯУ T¯"Ù·´]Š ]~[†@µéX€,yº´è¿ßGS’)›– "%:äwxx/$ÂðC"Idð ÑDÐh{|ÀÑ|úü@:HÜabôaóðÛÑF:¡I´ÙGL'HHIF‘DE›Ýß«‡ôԘjSW¹çsž¦ù’~w>>ÿá^þ2Í¡ÜÕë6>ü¾ê &‘VPd’$' +q†uSŒ4%"ˆ"D#!ˆ„Á`…gr Õԑ˜ØÁ ¸fGóB©¸fG(¡‘ßa_÷úyáÑ· +ò¸ˆJ`Ȃp6æ‘Í;'qlïžu»ÝšºÞ·¹¥ }?‰@ n;‹…DR1/Q&’sgqe'FªÕ'“›Æ|-wæ©ZS¼*öý³{oO]Ÿ>?.‘¢䴓.Gï¹*›²ùu2ï‡ +Z$g]ۘ”¥Ï üº}M[ï<¦,pÚ6‡nÄ|}Ív¯eõz(ë¦HÆû²&bõfÛvû: êqÏħþÉÔÛ*;5YYL‘g`õ„:òß̱´eØ_¦v\RÒùmsoÍ¡ûW}2Ûìcjv×èó%v‰I‚&“®ZÓVE=3û"û5*mÞtøjW?³Ú ¥z<æy¹¦bõ³çø­ÌM½t^ÓÝ1+––z¶ú¥L,®Ä(g}"9Ö°é¹|û°‰|°Ù|‡ê.È÷ ¦<Ն|xX»d£a[ÁBÞwSÞTí¶_ †…Ô¶7E“mSkdÙVæv€¦ R8‘aa{TìÃ.»Cø`w……Éǔë`ÝûÂö­nyŒ…eq)Ç4A·ÉԐ2û×µ¾YñÖëõèºsÉ.ݳ­Í]÷2!¶Æ˜v¯›pï›uo¨î÷Þð»wÄ#°Bä&˜#‰%ë ;[·TUþÜ÷,Sc%æ<ëÁ¦<ÛÃæ=¨»Ä³ž$½g}—½þë°=d;kÃóÖQݗÎAXŠÙ8{°)izؼ4ºK¤ ðHãÓ…ó©Íó_îõß6ÍG«oÃ`*©âpJÂs©ôa©`³© Õ]ÊáTŽxØT^ŸŒB±$ °’äÿŒ& ¢Óiïù° ï °Yï…ê.ð^ˆÇ­÷F4B±|»Z%”r{¦çs õaS*õ°y•u—¨àPɧ1JhP¨Þ†Pú¢Â]NîNBÝq÷þiH‚Àms:¹>l"¹l6¹¡º ’â¸íx,¼íù4»;L…"‰ž¼Ô{˜Û;½ °­‡ž,ÎïÞÐÿW{³Üendstream +endobj +2960 0 obj << +/Type /Page +/Contents 2961 0 R +/Resources 2959 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +2962 0 obj << +/D [2960 0 R /XYZ 71.731 729.2652 null] +>> endobj +2963 0 obj << +/D [2960 0 R /XYZ 71.731 741.2204 null] +>> endobj +2964 0 obj << +/D [2960 0 R /XYZ 129.5143 708.3437 null] +>> endobj +222 0 obj << +/D [2960 0 R /XYZ 346.5386 658.1081 null] +>> endobj +2965 0 obj << +/D [2960 0 R /XYZ 71.731 634.6193 null] +>> endobj +2966 0 obj << +/D [2960 0 R /XYZ 161.0655 625.2314 null] +>> endobj +2967 0 obj << +/D [2960 0 R /XYZ 71.731 613.1119 null] +>> endobj +2968 0 obj << +/D [2960 0 R /XYZ 71.731 581.746 null] +>> endobj +2969 0 obj << +/D [2960 0 R /XYZ 168.8063 570.7357 null] +>> endobj +2970 0 obj << +/D [2960 0 R /XYZ 71.731 543.6723 null] +>> endobj +2971 0 obj << +/D [2960 0 R /XYZ 71.731 527.2504 null] +>> endobj +2972 0 obj << +/D [2960 0 R /XYZ 71.731 496.3144 null] +>> endobj +2973 0 obj << +/D [2960 0 R /XYZ 181.5683 484.6585 null] +>> endobj +2974 0 obj << +/D [2960 0 R /XYZ 71.731 474.5963 null] +>> endobj +2975 0 obj << +/D [2960 0 R /XYZ 71.731 443.0247 null] +>> endobj +2976 0 obj << +/D [2960 0 R /XYZ 71.731 430.0633 null] +>> endobj +2977 0 obj << +/D [2960 0 R /XYZ 71.731 428.818 null] +>> endobj +2978 0 obj << +/D [2960 0 R /XYZ 129.5143 409.7395 null] +>> endobj +2979 0 obj << +/D [2960 0 R /XYZ 129.5143 409.7395 null] +>> endobj +2980 0 obj << +/D [2960 0 R /XYZ 71.731 408.2999 null] +>> endobj +2981 0 obj << +/D [2960 0 R /XYZ 71.731 408.2999 null] +>> endobj +2982 0 obj << +/D [2960 0 R /XYZ 139.477 391.8067 null] +>> endobj +2983 0 obj << +/D [2960 0 R /XYZ 139.477 391.8067 null] +>> endobj +2984 0 obj << +/D [2960 0 R /XYZ 76.7123 373.874 null] +>> endobj +2985 0 obj << +/D [2960 0 R /XYZ 129.5143 355.9412 null] +>> endobj +2986 0 obj << +/D [2960 0 R /XYZ 129.5143 355.9412 null] +>> endobj +2987 0 obj << +/D [2960 0 R /XYZ 71.731 353.7844 null] +>> endobj +2988 0 obj << +/D [2960 0 R /XYZ 71.731 353.7844 null] +>> endobj +2989 0 obj << +/D [2960 0 R /XYZ 139.477 338.0085 null] +>> endobj +2990 0 obj << +/D [2960 0 R /XYZ 71.731 336.5689 null] +>> endobj +2991 0 obj << +/D [2960 0 R /XYZ 139.477 320.0757 null] +>> endobj +2992 0 obj << +/D [2960 0 R /XYZ 76.7123 302.1429 null] +>> endobj +2993 0 obj << +/D [2960 0 R /XYZ 129.5143 284.2102 null] +>> endobj +2994 0 obj << +/D [2960 0 R /XYZ 129.5143 284.2102 null] +>> endobj +2995 0 obj << +/D [2960 0 R /XYZ 71.731 282.0534 null] +>> endobj +2996 0 obj << +/D [2960 0 R /XYZ 71.731 282.0534 null] +>> endobj +2997 0 obj << +/D [2960 0 R /XYZ 139.477 266.2774 null] +>> endobj +2998 0 obj << +/D [2960 0 R /XYZ 71.731 264.1206 null] +>> endobj +2999 0 obj << +/D [2960 0 R /XYZ 139.477 248.3447 null] +>> endobj +3000 0 obj << +/D [2960 0 R /XYZ 71.731 210.4867 null] +>> endobj +3001 0 obj << +/D [2960 0 R /XYZ 71.731 197.4357 null] +>> endobj +3002 0 obj << +/D [2960 0 R /XYZ 71.731 196.1904 null] +>> endobj +3003 0 obj << +/D [2960 0 R /XYZ 129.5143 177.1118 null] +>> endobj +777 0 obj << +/D [2960 0 R /XYZ 71.731 170.6909 null] +>> endobj +2959 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3007 0 obj << +/Length 956 +/Filter /FlateDecode +>> +stream +xÚ½WM£8¼÷¯à˜HÇã¹õ|tkW»­h”9M¯ZlâtdÁh4ÿ~ŸcC›Ä„H+­r€ˆ²«\~e$Âð#‘ H0¸P‰hÊi´9Üáè =݉&öAŸÖwŽ$’)M£õ.b2E\$‘`eœdÑzûcñyŸµj–1åxA‘½®Ê¼Rúüoû÷aõ›½ùSé}½m—­¿ûºø9Hf@rU䀺”IID¢„'Fg¿b̑H„8ɤ(‘FœÈ_T©´z®·ê±YR¼¨«Ïߍ$˜GzËMÊ(Ql–+R;Ϫ©u­ÕÇaD#Ò±S‚R’ÉӟÍ2œxÁçÞßÛ¿<-¶¯uóº¯[]ååž7<8 HŒ{F_âÕnšâ¨‹ºº&’Áf¦ÔÙZÆü]’½ÛðÑ#X23þČ ž‘ô4Ís]ÅùöPTn¦CþËÞÔUéîºã6×j˜¦§Ôöª÷ªp¥Ô h`!)J™°,ߔ‚ØK±s£ºÍFµí®+}»%é»R;| ÍÏ¢UèV;ʲ^R¾ø©¶vŠou©Ú[·ÿdG¿•…»Ñj³¿•~µ$|‘7P2KëG‡‰8'"J(T»<û0A¬&FÁålF ¥ü‚—RÄBƒ¼ç×wý¨K,óœ$pN6Öaò°&ùèÊ@7ÝFߟ>f¼ªt±ÉM6|dרËö0œi’…íQ±{7–˜ƒh´ 6i,l>¦‰ òNۏºÔ16–IdŽÄ‘ŒðŞÌw9$/CÿÜߢzëý Øz°ÓÙj¯]ô[5Y½ Îl)%›©^v¥zØlõ†xo¨Þ áêéñ» NÀ‚ý.*w@֍¿“5Ë8d"MùLÍú°+5;Àfk6Ä{C͆tx–¸šÉG\ù=ï©bkÊðc +ýȤ5ðÞ#ŒÍÅه]³¦‡Í[à½Åš€Ž€5¾ŒQ8»²õþÓå¥uÇÓ/Ãp*1†>+›M¥»–Ê6ŸÊï-©<×1‘J_‡m¯AdšÑ‹Þ½K¸èàæKœ_ã®i™~Ó$îŒÌxíîx=Àf½ñÞàuH‡W—½×#ïîMvmn#Fí|̃PrØ8ÆS×Ðÿó†þÉ6ôÝñhçŸÃ3ÙÌ¿™Çî¼7!û/¼¿qîã&ÉtÝòêל‡¹ü˜ã4ƒ¶IÊa&CœðÉO³á¿üQ*endstream +endobj +3006 0 obj << +/Type /Page +/Contents 3007 0 R +/Resources 3005 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3008 0 obj << +/D [3006 0 R /XYZ 71.731 729.2652 null] +>> endobj +3009 0 obj << +/D [3006 0 R /XYZ 71.731 741.2204 null] +>> endobj +226 0 obj << +/D [3006 0 R /XYZ 288.5401 705.7477 null] +>> endobj +3010 0 obj << +/D [3006 0 R /XYZ 71.731 685.6073 null] +>> endobj +3011 0 obj << +/D [3006 0 R /XYZ 161.0655 672.871 null] +>> endobj +3012 0 obj << +/D [3006 0 R /XYZ 71.731 660.7515 null] +>> endobj +3013 0 obj << +/D [3006 0 R /XYZ 71.731 561.7976 null] +>> endobj +3014 0 obj << +/D [3006 0 R /XYZ 71.731 543.3084 null] +>> endobj +3015 0 obj << +/D [3006 0 R /XYZ 71.731 512.3724 null] +>> endobj +3016 0 obj << +/D [3006 0 R /XYZ 181.5683 500.7166 null] +>> endobj +3017 0 obj << +/D [3006 0 R /XYZ 71.731 490.6544 null] +>> endobj +3018 0 obj << +/D [3006 0 R /XYZ 71.731 457.2312 null] +>> endobj +3019 0 obj << +/D [3006 0 R /XYZ 71.731 446.1214 null] +>> endobj +3020 0 obj << +/D [3006 0 R /XYZ 71.731 444.8761 null] +>> endobj +3021 0 obj << +/D [3006 0 R /XYZ 129.5143 425.7975 null] +>> endobj +3022 0 obj << +/D [3006 0 R /XYZ 129.5143 425.7975 null] +>> endobj +3023 0 obj << +/D [3006 0 R /XYZ 71.731 424.358 null] +>> endobj +3024 0 obj << +/D [3006 0 R /XYZ 71.731 424.358 null] +>> endobj +3025 0 obj << +/D [3006 0 R /XYZ 139.477 407.8648 null] +>> endobj +3026 0 obj << +/D [3006 0 R /XYZ 139.477 407.8648 null] +>> endobj +3027 0 obj << +/D [3006 0 R /XYZ 76.7123 389.932 null] +>> endobj +3028 0 obj << +/D [3006 0 R /XYZ 129.5143 371.9993 null] +>> endobj +3029 0 obj << +/D [3006 0 R /XYZ 129.5143 371.9993 null] +>> endobj +3030 0 obj << +/D [3006 0 R /XYZ 71.731 369.8424 null] +>> endobj +3031 0 obj << +/D [3006 0 R /XYZ 71.731 369.8424 null] +>> endobj +3032 0 obj << +/D [3006 0 R /XYZ 139.477 354.0665 null] +>> endobj +3033 0 obj << +/D [3006 0 R /XYZ 71.731 352.627 null] +>> endobj +3034 0 obj << +/D [3006 0 R /XYZ 139.477 336.1338 null] +>> endobj +3035 0 obj << +/D [3006 0 R /XYZ 76.7123 318.201 null] +>> endobj +3036 0 obj << +/D [3006 0 R /XYZ 129.5143 300.2683 null] +>> endobj +3037 0 obj << +/D [3006 0 R /XYZ 129.5143 300.2683 null] +>> endobj +3038 0 obj << +/D [3006 0 R /XYZ 71.731 278.9034 null] +>> endobj +3039 0 obj << +/D [3006 0 R /XYZ 71.731 267.292 null] +>> endobj +3040 0 obj << +/D [3006 0 R /XYZ 71.731 266.0467 null] +>> endobj +3041 0 obj << +/D [3006 0 R /XYZ 129.5143 246.9681 null] +>> endobj +778 0 obj << +/D [3006 0 R /XYZ 71.731 240.5473 null] +>> endobj +230 0 obj << +/D [3006 0 R /XYZ 260.8062 196.7325 null] +>> endobj +3042 0 obj << +/D [3006 0 R /XYZ 71.731 173.2437 null] +>> endobj +3043 0 obj << +/D [3006 0 R /XYZ 161.0655 163.8558 null] +>> endobj +3044 0 obj << +/D [3006 0 R /XYZ 71.731 151.7363 null] +>> endobj +3045 0 obj << +/D [3006 0 R /XYZ 71.731 120.3704 null] +>> endobj +3046 0 obj << +/D [3006 0 R /XYZ 168.8063 109.3602 null] +>> endobj +3005 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3049 0 obj << +/Length 948 +/Filter /FlateDecode +>> +stream +xÚÝWKoÛ8¾çWè—ñ¡ÞÒv·è¢[…o›E ÊL,¬-…´ÿ~‡¢Þ¢-cET¬3¿™áŒH€á’ É`¡1¢‚Ó =Ýáà^}º#-$l1áô~w÷Û 1ŠÁî%`±@\Fd)NT°Ûÿ}ÿᐜ.7!åøž"·>“\›/Éw÷ïÃãg÷ð—6‡b_mþÙýy÷û®÷ϙD±'WIö¨%M +hŠÈÒ$𖓈+Ä"&žõQíh$¹[õ†ðûYe²üÕýòµØ·˜OeQŸ‘e +ÞCFWD4–²¼rSòÓ=짶Áhû"ïͽZs5"`ÒYû¦M]v‰[²·Vušêªz©[÷Ȁ‡úhZ|aº|Ë*Ýmt¶¡ —N†‡ã±ØP~ÿ¦÷Îķ⨫wýöAÆn7%H7»“ý)Ëouõh…HÊäڔÎÅ8è„@˜8‘ç1ª”7è=*ú CBHLš /¬Y +O”ò…_ +€ˆP¯ßù:ðèv-y0åK¾ ¤6l4BØz°wmÈMY§f;«»_ç&K“ùY—zyÀŽ‹Ô¬_׎Pƒ¬Ä^“ã´¨‹ªBä1bŸÓË¢v›$¦š²ERN8<€"î6ñèÊ¡¾"¸¨æÊB™wÊz=9sͳ)ÜZWúbÞF±Bœa¾’·cؕ¼ía«yëó{CÞ.xøóvÂÃÞ_ÏÍÕõœíŸ‹ò9‡jöNG‘ñTñ,7í5UŽCp1_#…¥ZIØ1ìJÆö°Õ”õù½!g}> endobj +3050 0 obj << +/D [3048 0 R /XYZ 71.731 729.2652 null] +>> endobj +3051 0 obj << +/D [3048 0 R /XYZ 71.731 718.3063 null] +>> endobj +3052 0 obj << +/D [3048 0 R /XYZ 71.731 669.8397 null] +>> endobj +3053 0 obj << +/D [3048 0 R /XYZ 71.731 638.9037 null] +>> endobj +3054 0 obj << +/D [3048 0 R /XYZ 181.5683 627.2478 null] +>> endobj +3055 0 obj << +/D [3048 0 R /XYZ 71.731 617.1856 null] +>> endobj +3056 0 obj << +/D [3048 0 R /XYZ 71.731 585.614 null] +>> endobj +3057 0 obj << +/D [3048 0 R /XYZ 71.731 572.6526 null] +>> endobj +3058 0 obj << +/D [3048 0 R /XYZ 71.731 571.4073 null] +>> endobj +3059 0 obj << +/D [3048 0 R /XYZ 129.5143 552.3288 null] +>> endobj +3060 0 obj << +/D [3048 0 R /XYZ 129.5143 552.3288 null] +>> endobj +3061 0 obj << +/D [3048 0 R /XYZ 71.731 550.8892 null] +>> endobj +3062 0 obj << +/D [3048 0 R /XYZ 71.731 550.8892 null] +>> endobj +3063 0 obj << +/D [3048 0 R /XYZ 139.477 534.396 null] +>> endobj +3064 0 obj << +/D [3048 0 R /XYZ 139.477 534.396 null] +>> endobj +3065 0 obj << +/D [3048 0 R /XYZ 76.7123 516.4633 null] +>> endobj +3066 0 obj << +/D [3048 0 R /XYZ 129.5143 498.5305 null] +>> endobj +3067 0 obj << +/D [3048 0 R /XYZ 129.5143 498.5305 null] +>> endobj +3068 0 obj << +/D [3048 0 R /XYZ 71.731 496.3737 null] +>> endobj +3069 0 obj << +/D [3048 0 R /XYZ 71.731 496.3737 null] +>> endobj +3070 0 obj << +/D [3048 0 R /XYZ 139.477 480.5978 null] +>> endobj +3071 0 obj << +/D [3048 0 R /XYZ 71.731 478.4409 null] +>> endobj +3072 0 obj << +/D [3048 0 R /XYZ 139.477 462.665 null] +>> endobj +3073 0 obj << +/D [3048 0 R /XYZ 71.731 424.807 null] +>> endobj +3074 0 obj << +/D [3048 0 R /XYZ 71.731 411.756 null] +>> endobj +3075 0 obj << +/D [3048 0 R /XYZ 71.731 410.5107 null] +>> endobj +3076 0 obj << +/D [3048 0 R /XYZ 129.5143 391.4321 null] +>> endobj +779 0 obj << +/D [3048 0 R /XYZ 71.731 385.0113 null] +>> endobj +234 0 obj << +/D [3048 0 R /XYZ 277.0745 341.1965 null] +>> endobj +3077 0 obj << +/D [3048 0 R /XYZ 71.731 321.0561 null] +>> endobj +3078 0 obj << +/D [3048 0 R /XYZ 161.0655 308.3198 null] +>> endobj +3079 0 obj << +/D [3048 0 R /XYZ 71.731 296.2003 null] +>> endobj +3080 0 obj << +/D [3048 0 R /XYZ 71.731 265.1707 null] +>> endobj +3081 0 obj << +/D [3048 0 R /XYZ 168.8063 253.8241 null] +>> endobj +3082 0 obj << +/D [3048 0 R /XYZ 71.731 226.7607 null] +>> endobj +3083 0 obj << +/D [3048 0 R /XYZ 71.731 195.3948 null] +>> endobj +3084 0 obj << +/D [3048 0 R /XYZ 71.731 168.9525 null] +>> endobj +3085 0 obj << +/D [3048 0 R /XYZ 71.731 136.1649 null] +>> endobj +3086 0 obj << +/D [3048 0 R /XYZ 181.5683 124.5091 null] +>> endobj +3087 0 obj << +/D [3048 0 R /XYZ 71.731 114.4469 null] +>> endobj +3047 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3090 0 obj << +/Length 1015 +/Filter /FlateDecode +>> +stream +xÚÍXMoã6½çWèh+–â‡rË~b‹na,|kŠ@µ™µ°²”J2ÒüûŽDJ¢,ZÒ­Er”Ç™Ç7Ã‰I€á‡’ ÉàAcD§Áá|‡ƒð§/wÄBB‹ ]ÐûýÝ/Ÿb *‚ýsÀb¸ŒÉ(Rœ¨`ücóᔼԺ܆”ã Eæ¹Ë’\׿%™_v_͇oº>Çjûçþ×»Oû>?gÅ +’Ì’ìQSš4vh#Ή $VˆEL¶o xùн:6Ú?bL¡™Aè TÆ`ɦÝIaÚÈw &ÏgúW)Jâ…¸°™ô°Å"øò®¨‚‡ÓJ»2Œx Š«Ý³µóåpÐUõ|Élq€ŸD”ð¶¦!—H*‚rŒ(㢠Foo ©6u͹­Ò´¶‘XŽ«±+‹º¨ß^ô}¿bð]R‚Q†º“¢eüˆ9nڙÝOã0°ÖSQ>ŠªÎá¶ñÐ »è.º:”éKs|ç1¸F5„¾%åOÛUí‘×ÍEõOZÕÐVS™ç±ÝƵFÅ‘ ®ˆt÷µêvCNöÝ9y3Š<{sc ™ºÕµ]|Ò©½Ý‹-å›×®á§µ®Pwœ®Ã/…½Â&߆HýN´I&…{Ö¬fKgNó%«-¾âåkZ™Ðkª÷ef‡Úêö½ÈtµÖYÉñœæ–ËKúnP~múµ +ĉYh0.l¦Áô°ÅãË»¢ÁLxøûüˆÇ3 P¨†Ä,ZP\Ø̀ÒÃ_Þʄ‡w@Ñø (þ‡PLª÷º°÷ö°E÷úò®p߽#žKÄ#7ÁF²É°bÛWéà¦g Œ<1ÜP žua3žía‹žõå]áYGëÙ ïøv5«ù¥ Cْ4lNš¶,'ïi<<<Ò¸4F‡óó%ënô¿/IfÔ±ÓµaãiøW›1Lá8škí7‘B0_ij_8˜éwœJ$8a}¤&i$o~àIø/Pكendstream +endobj +3089 0 obj << +/Type /Page +/Contents 3090 0 R +/Resources 3088 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3091 0 obj << +/D [3089 0 R /XYZ 71.731 729.2652 null] +>> endobj +781 0 obj << +/D [3089 0 R /XYZ 71.731 741.2204 null] +>> endobj +3092 0 obj << +/D [3089 0 R /XYZ 71.731 718.3063 null] +>> endobj +3093 0 obj << +/D [3089 0 R /XYZ 71.731 708.2442 null] +>> endobj +3094 0 obj << +/D [3089 0 R /XYZ 71.731 706.9988 null] +>> endobj +3095 0 obj << +/D [3089 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3096 0 obj << +/D [3089 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3097 0 obj << +/D [3089 0 R /XYZ 71.731 686.4807 null] +>> endobj +3098 0 obj << +/D [3089 0 R /XYZ 71.731 686.4807 null] +>> endobj +3099 0 obj << +/D [3089 0 R /XYZ 139.477 669.9875 null] +>> endobj +3100 0 obj << +/D [3089 0 R /XYZ 139.477 669.9875 null] +>> endobj +3101 0 obj << +/D [3089 0 R /XYZ 76.7123 652.0548 null] +>> endobj +3102 0 obj << +/D [3089 0 R /XYZ 129.5143 634.122 null] +>> endobj +3103 0 obj << +/D [3089 0 R /XYZ 129.5143 634.122 null] +>> endobj +3104 0 obj << +/D [3089 0 R /XYZ 71.731 612.7572 null] +>> endobj +3105 0 obj << +/D [3089 0 R /XYZ 71.731 601.1458 null] +>> endobj +3106 0 obj << +/D [3089 0 R /XYZ 71.731 599.9004 null] +>> endobj +3107 0 obj << +/D [3089 0 R /XYZ 129.5143 580.8219 null] +>> endobj +780 0 obj << +/D [3089 0 R /XYZ 71.731 574.401 null] +>> endobj +238 0 obj << +/D [3089 0 R /XYZ 209.5045 530.5863 null] +>> endobj +3108 0 obj << +/D [3089 0 R /XYZ 71.731 510.4459 null] +>> endobj +3109 0 obj << +/D [3089 0 R /XYZ 161.0655 497.7096 null] +>> endobj +3110 0 obj << +/D [3089 0 R /XYZ 71.731 485.5901 null] +>> endobj +3111 0 obj << +/D [3089 0 R /XYZ 71.731 454.5605 null] +>> endobj +3112 0 obj << +/D [3089 0 R /XYZ 168.8063 443.2139 null] +>> endobj +3113 0 obj << +/D [3089 0 R /XYZ 71.731 416.1505 null] +>> endobj +3114 0 obj << +/D [3089 0 R /XYZ 71.731 384.7846 null] +>> endobj +3115 0 obj << +/D [3089 0 R /XYZ 71.731 368.147 null] +>> endobj +3116 0 obj << +/D [3089 0 R /XYZ 71.731 337.211 null] +>> endobj +3117 0 obj << +/D [3089 0 R /XYZ 181.5683 325.5552 null] +>> endobj +3118 0 obj << +/D [3089 0 R /XYZ 71.731 315.493 null] +>> endobj +3119 0 obj << +/D [3089 0 R /XYZ 71.731 282.0698 null] +>> endobj +3120 0 obj << +/D [3089 0 R /XYZ 71.731 270.96 null] +>> endobj +3121 0 obj << +/D [3089 0 R /XYZ 71.731 269.7146 null] +>> endobj +3122 0 obj << +/D [3089 0 R /XYZ 129.5143 250.6361 null] +>> endobj +3123 0 obj << +/D [3089 0 R /XYZ 129.5143 250.6361 null] +>> endobj +3124 0 obj << +/D [3089 0 R /XYZ 71.731 249.1966 null] +>> endobj +3125 0 obj << +/D [3089 0 R /XYZ 71.731 249.1966 null] +>> endobj +3126 0 obj << +/D [3089 0 R /XYZ 139.477 232.7034 null] +>> endobj +3127 0 obj << +/D [3089 0 R /XYZ 139.477 232.7034 null] +>> endobj +3128 0 obj << +/D [3089 0 R /XYZ 76.7123 214.7706 null] +>> endobj +3129 0 obj << +/D [3089 0 R /XYZ 129.5143 196.8378 null] +>> endobj +3130 0 obj << +/D [3089 0 R /XYZ 129.5143 196.8378 null] +>> endobj +3131 0 obj << +/D [3089 0 R /XYZ 71.731 194.681 null] +>> endobj +3132 0 obj << +/D [3089 0 R /XYZ 71.731 194.681 null] +>> endobj +3133 0 obj << +/D [3089 0 R /XYZ 139.477 178.9051 null] +>> endobj +3134 0 obj << +/D [3089 0 R /XYZ 71.731 177.4655 null] +>> endobj +3135 0 obj << +/D [3089 0 R /XYZ 139.477 160.9723 null] +>> endobj +3136 0 obj << +/D [3089 0 R /XYZ 71.731 123.1143 null] +>> endobj +3137 0 obj << +/D [3089 0 R /XYZ 71.731 110.0633 null] +>> endobj +3138 0 obj << +/D [3089 0 R /XYZ 71.731 108.818 null] +>> endobj +3088 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3141 0 obj << +/Length 815 +/Filter /FlateDecode +>> +stream +xÚµV]oÚ0}çWä¤ÅóGÛ}ëÚmÚ´M¨¢OëTeÁ”H!A‰£ªÿ~×8 ˜i›x°ã{Žïõ5 0|H  ª9 ÒÍ/ð×ç i!a‹ ‡ ‹ÉûO  +©˜ÆÁb0#.¢@0Š$'2X,NïÖÉÖèjRŽ§¹qž'…6ߒßîëíü‹›|×f].ëÙ¯Å×ÉÇEÏϙ@JÉY‘‘(bX!ÅHQ½(BâœØ –ˆELô›¡*‰ÝLëav7O”òCu„R v¼‡ã^G·Ê«co*-s±±Ž¬0ïœeÄ Ùʍu“¦º®WMneB,Ð'˜Ù`!HHÆ`‚e<Þ£ˆ3{0BNïu®žß=¶«‡J"$Å`œ=^;!óª4¥yÛê›~…„ñŽ®]R‚b"ÕnÁža§÷ sœ4fÝîf›6ÏÙ~$ao(à^×i•mMVç$0H͘%Ԏ1i3òîÙåp8!#ˆKâ¼ùQa²ÜdE ß$onRy;[îÂõaº¸Æf­³6ûë X{£˜ Çò MSu'O´õh5#¾ÉM‹/¢zÍj®õì6ÏËåÓW½t!Ê\×מàΎvbtº¾–~>#|šTÉl«í¨žºÊcB"…ºPÇCؙ:îaëØÇ{Eé`ràd_Ç#6õ=¶ÑaË`!7m˜ªI»¢ï/L»^&K[CdSéã vb¨~ʉßØa{c‰í£ u°“ÆÂác)/ïic»UÇ:ÆÆ2…"!Æ2nÁ×L<îr¨¼úÔ¡¿YñÒùë±uã¹l/ÝØÔútöÂ!2®âKÙ;€ËÞv9{=¼×dÙ;ÔánkÃŒ#B%;¼ïYýíŸ-­ËOSx!Ø{1Œ8 +Ëñ…Ñ^§o + +ÌÕ¥Ž?„ñº‡]ôÚÇ{…×>žŽ?Òñ¯;~4îø3†§ÚÂÿlûº{ ö}øR鹬ž è óTûn$‚~®Î>m˜ã—-§.d¥úH–8’'ß©Â?˜¡€endstream +endobj +3140 0 obj << +/Type /Page +/Contents 3141 0 R +/Resources 3139 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3142 0 obj << +/D [3140 0 R /XYZ 71.731 729.2652 null] +>> endobj +3143 0 obj << +/D [3140 0 R /XYZ 71.731 741.2204 null] +>> endobj +3144 0 obj << +/D [3140 0 R /XYZ 129.5143 708.3437 null] +>> endobj +242 0 obj << +/D [3140 0 R /XYZ 202.8077 658.1081 null] +>> endobj +3145 0 obj << +/D [3140 0 R /XYZ 71.731 637.9677 null] +>> endobj +3146 0 obj << +/D [3140 0 R /XYZ 161.0655 625.2314 null] +>> endobj +3147 0 obj << +/D [3140 0 R /XYZ 71.731 613.1119 null] +>> endobj +3148 0 obj << +/D [3140 0 R /XYZ 71.731 581.746 null] +>> endobj +3149 0 obj << +/D [3140 0 R /XYZ 168.8063 570.7357 null] +>> endobj +3150 0 obj << +/D [3140 0 R /XYZ 71.731 543.6723 null] +>> endobj +3151 0 obj << +/D [3140 0 R /XYZ 71.731 514.158 null] +>> endobj +3152 0 obj << +/D [3140 0 R /XYZ 71.731 495.6688 null] +>> endobj +3153 0 obj << +/D [3140 0 R /XYZ 71.731 464.7328 null] +>> endobj +3154 0 obj << +/D [3140 0 R /XYZ 181.5683 453.0769 null] +>> endobj +3155 0 obj << +/D [3140 0 R /XYZ 71.731 443.0148 null] +>> endobj +3156 0 obj << +/D [3140 0 R /XYZ 71.731 409.5916 null] +>> endobj +3157 0 obj << +/D [3140 0 R /XYZ 71.731 398.4818 null] +>> endobj +3158 0 obj << +/D [3140 0 R /XYZ 71.731 397.2364 null] +>> endobj +3159 0 obj << +/D [3140 0 R /XYZ 129.5143 378.1579 null] +>> endobj +3160 0 obj << +/D [3140 0 R /XYZ 129.5143 378.1579 null] +>> endobj +3161 0 obj << +/D [3140 0 R /XYZ 71.731 376.7183 null] +>> endobj +3162 0 obj << +/D [3140 0 R /XYZ 71.731 376.7183 null] +>> endobj +3163 0 obj << +/D [3140 0 R /XYZ 139.477 360.2251 null] +>> endobj +3164 0 obj << +/D [3140 0 R /XYZ 139.477 360.2251 null] +>> endobj +3165 0 obj << +/D [3140 0 R /XYZ 76.7123 342.2924 null] +>> endobj +3166 0 obj << +/D [3140 0 R /XYZ 129.5143 324.3596 null] +>> endobj +3167 0 obj << +/D [3140 0 R /XYZ 129.5143 324.3596 null] +>> endobj +3168 0 obj << +/D [3140 0 R /XYZ 71.731 302.9948 null] +>> endobj +3169 0 obj << +/D [3140 0 R /XYZ 71.731 291.3834 null] +>> endobj +3170 0 obj << +/D [3140 0 R /XYZ 71.731 290.1381 null] +>> endobj +3171 0 obj << +/D [3140 0 R /XYZ 129.5143 271.0595 null] +>> endobj +782 0 obj << +/D [3140 0 R /XYZ 71.731 264.6386 null] +>> endobj +246 0 obj << +/D [3140 0 R /XYZ 203.2724 220.8239 null] +>> endobj +3172 0 obj << +/D [3140 0 R /XYZ 71.731 200.6835 null] +>> endobj +3173 0 obj << +/D [3140 0 R /XYZ 161.0655 187.9472 null] +>> endobj +3174 0 obj << +/D [3140 0 R /XYZ 71.731 175.8277 null] +>> endobj +3175 0 obj << +/D [3140 0 R /XYZ 71.731 144.4618 null] +>> endobj +3176 0 obj << +/D [3140 0 R /XYZ 168.8063 133.4515 null] +>> endobj +3139 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3179 0 obj << +/Length 1058 +/Filter /FlateDecode +>> +stream +xÚíWMoã6½çWèh1ËQ¤ö–v»Å]ÀØúցbѱ°²dHô¦ûï;IY¶(˧žŠÑ‡9o†#aø#‘ H0¸ÐфÓh{xÀÑüôÛq•Ã¬† Ÿ7?}b8JQšÐ$Úì"–&ˆ‹8Œ"ɉŒ6ù_‹_öÙQ«f¹¢/(²×u™UJÿ‘½Úǧõg{óEé}·Ë¿7¿?üºéãs&P*!ÈM’=jL“¦‘šIlhø•“˜EKÄb&:ž_²æ›%‘Uöª–„/þ)Z]ToöÍQù…d­½æªTZånYOeé†VºÐ…r g̱BoèÑ>¶e±U­{ø¶$.Òÿªªóþg¥·†û´«]ø÷}±ÝÛ[½/ÚkvþMv9›BgºXÒdñ}Ibˆâ‚`+BPÂÖ-þ½ð̳²­íÝ«ºX¢}ðF-Ã<ŸÐÃIPÂDÒùªô©©Э¨Ø9MN[ФݝJ·ð™=;•Úák½WÍ{ѪnênGÏÆ[¹Û•1žHì†ÂfÔKÊïžã׺Tí‡~øÙ~4EˆL»ÑY~(ª{C­ÍþeMv€µ76Äо„€á8QÝۃV”7/[`ҙ÷z.ÿ™R> +J)˜›ÐPÐë뙄4"Ád(ƒ†$ŒÙ‚Ña3¿|p›­›ÓV?^å¾oòf n­«!òÔ¨ñê<#F kêQ«!ì,*1Eíb=6©*l;¦qŒ;-«5æq©+KQ,Ä%'ÐÅÖŀºò+†’{­/”,¯o@փÎÖ—î§VMû–Hs.çŒ;€Ýr®‡Í[7÷ï^ó˜0)ž/EþR7/äq@jÉ‘òRé¢Ò—uÑJ?íVŒ§³f=£nyÕ¡æ­:zSÇ$ÎZôFp-œåÖçƒ(7Ö{Ƙ›)QbIOñœ*CØ Yzج.¡¸wâ1Væ‚ÆEBžÕñFƒÙaÊ»­G§|x^N'1áÌ4\·Ór»‘–=l6-CqïHˏpýyœM5Ù0¸T~Q»‡ã ɬ ”qۀÀŽpÓ© ¹øØõ)ë%ƒ¦1§w[WŸš%…L>üYèPþÇIŠÅÕÉßÔºÖ?Žê޾†6ÁtÁú.ќ¾›3W’Ô!+|gÔÂ÷º¬ßŠêå5kU×#ÞÙ­|Tí¶)Žæ8¸ÅšA3ŸÐÔYñP•¾›¾­…sÅ1:ª­Mò|ÈÝ5r°È9¼Y’k¡?ï®Àù|_[Õ®ìfþ<;¼ú¤ªw÷Dë[íP7¬š¦¾ê¤›.ÿol'*Áá4Ig*Ñv£õ°ÙJŠ{G%ñ7<þÓöÖ}oÇI2¡ªÿ$`Æ_äœJ —¦ýL†fœN~_þ ÒÊÌ endstream +endobj +3178 0 obj << +/Type /Page +/Contents 3179 0 R +/Resources 3177 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3004 0 R +>> endobj +3180 0 obj << +/D [3178 0 R /XYZ 71.731 729.2652 null] +>> endobj +3181 0 obj << +/D [3178 0 R /XYZ 71.731 718.3063 null] +>> endobj +3182 0 obj << +/D [3178 0 R /XYZ 71.731 658.8289 null] +>> endobj +3183 0 obj << +/D [3178 0 R /XYZ 181.5683 647.1731 null] +>> endobj +3184 0 obj << +/D [3178 0 R /XYZ 71.731 637.1109 null] +>> endobj +3185 0 obj << +/D [3178 0 R /XYZ 71.731 605.5393 null] +>> endobj +3186 0 obj << +/D [3178 0 R /XYZ 71.731 592.5779 null] +>> endobj +3187 0 obj << +/D [3178 0 R /XYZ 71.731 591.3326 null] +>> endobj +3188 0 obj << +/D [3178 0 R /XYZ 129.5143 572.254 null] +>> endobj +3189 0 obj << +/D [3178 0 R /XYZ 129.5143 572.254 null] +>> endobj +3190 0 obj << +/D [3178 0 R /XYZ 71.731 570.8145 null] +>> endobj +3191 0 obj << +/D [3178 0 R /XYZ 71.731 570.8145 null] +>> endobj +3192 0 obj << +/D [3178 0 R /XYZ 139.477 554.3213 null] +>> endobj +3193 0 obj << +/D [3178 0 R /XYZ 139.477 554.3213 null] +>> endobj +3194 0 obj << +/D [3178 0 R /XYZ 76.7123 536.3885 null] +>> endobj +3195 0 obj << +/D [3178 0 R /XYZ 129.5143 518.4558 null] +>> endobj +3196 0 obj << +/D [3178 0 R /XYZ 129.5143 518.4558 null] +>> endobj +3197 0 obj << +/D [3178 0 R /XYZ 71.731 516.299 null] +>> endobj +3198 0 obj << +/D [3178 0 R /XYZ 71.731 516.299 null] +>> endobj +3199 0 obj << +/D [3178 0 R /XYZ 139.477 500.523 null] +>> endobj +3200 0 obj << +/D [3178 0 R /XYZ 71.731 499.0835 null] +>> endobj +3201 0 obj << +/D [3178 0 R /XYZ 139.477 482.5903 null] +>> endobj +3202 0 obj << +/D [3178 0 R /XYZ 71.731 444.7322 null] +>> endobj +3203 0 obj << +/D [3178 0 R /XYZ 71.731 431.6813 null] +>> endobj +3204 0 obj << +/D [3178 0 R /XYZ 71.731 430.4359 null] +>> endobj +3205 0 obj << +/D [3178 0 R /XYZ 129.5143 411.3574 null] +>> endobj +783 0 obj << +/D [3178 0 R /XYZ 71.731 404.9365 null] +>> endobj +250 0 obj << +/D [3178 0 R /XYZ 298.3181 361.1218 null] +>> endobj +3206 0 obj << +/D [3178 0 R /XYZ 71.731 340.9814 null] +>> endobj +3207 0 obj << +/D [3178 0 R /XYZ 161.0655 328.2451 null] +>> endobj +3208 0 obj << +/D [3178 0 R /XYZ 71.731 316.1256 null] +>> endobj +3209 0 obj << +/D [3178 0 R /XYZ 71.731 284.7597 null] +>> endobj +3210 0 obj << +/D [3178 0 R /XYZ 168.8063 273.7494 null] +>> endobj +3211 0 obj << +/D [3178 0 R /XYZ 71.731 246.686 null] +>> endobj +3212 0 obj << +/D [3178 0 R /XYZ 71.731 220.4593 null] +>> endobj +3213 0 obj << +/D [3178 0 R /XYZ 71.731 187.6718 null] +>> endobj +3214 0 obj << +/D [3178 0 R /XYZ 181.5683 176.0159 null] +>> endobj +3215 0 obj << +/D [3178 0 R /XYZ 71.731 165.9538 null] +>> endobj +3216 0 obj << +/D [3178 0 R /XYZ 71.731 134.3821 null] +>> endobj +3217 0 obj << +/D [3178 0 R /XYZ 71.731 121.4208 null] +>> endobj +3218 0 obj << +/D [3178 0 R /XYZ 71.731 120.1754 null] +>> endobj +3219 0 obj << +/D [3178 0 R /XYZ 129.5143 101.0969 null] +>> endobj +3220 0 obj << +/D [3178 0 R /XYZ 129.5143 101.0969 null] +>> endobj +3221 0 obj << +/D [3178 0 R /XYZ 71.731 99.6573 null] +>> endobj +3222 0 obj << +/D [3178 0 R /XYZ 71.731 99.6573 null] +>> endobj +3177 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3225 0 obj << +/Length 1134 +/Filter /FlateDecode +>> +stream +xÚÍXÁnã6½ç+t´˜IQ$sK»M±E »î©)Ŧ¶dP2¶û÷I¤LY´¨Å‹"ÉÎ#çññÍphÅð‡#Ž§ð ‘”‘h{¼‹£7ø×owØ@V³rA?oî~z¢q$‘LImö•)b<‰8%H0,¢ÍîïÅ/ïÙ©Vz¹",^Ô=ׇ¬PõÙk÷ñqý±{ùSÕïå®Zþ³ùýî×MŸQŽ¤€ “$“X $4Z‘I‚™…a +†@qÀӄò~1DFáf¡°˜×ÚÕ<®ÙaXnL¹Ú¸×Ï ;j̃ŠH€¨iÒò %œi<žë÷N«†LËü² ,Ei۷ЇNÙªÖyñvoô†áª¨ómVçeÑ}wì¦kßë²{ž+5Z,YæQÊ ðþ­èQ+vYò¸y4ÛM‘ åcâ{[d;jÌc(²Ý쏓ÒUY¼ä»—R¿¨c–Ç1onJCÁΘð4lJ Kã‰;G4.Aj®u~Ìô×îƒZµ¦kß³ÝN«ªºqŒxƒùèÀ¦òÑÂÂùè‰;'¯yÜÈG—G•×Êdã¡|ˋ—׬+P×*cA*¿/'™€S '¡œtaÆëaAãùâÎ0žÇØx—œü Ê~CN²4ABàPNº°)i,,,'îi<<<Ò¸49yQ§:ä[ózÒªQé߆,ƒùkÖ#KÖNòIÕg]T7s6‘Žj!9ëÂ&r¶‡sÖwFÎúx8:Úýð¸x ƒí”çíêÙþlUàÇtmmX1Ž¸  „²´Œ èm`8‹ê jµ^R¨’z‰ÙNê'½$ÞÇÏí.ëB‘ 1Úô§<ívz­Ëº¬¿žÔC?âR‡ÌØÁP®…l˜Èmoð¤m´vMÏ1‹3è­ÌŠÇýýc#ó}‘ÁH {ø®lx—ïUmu~j·)ÆpÀ°”¸Œ+ÓÛ½[/ŸÔ¶KôK·{ßÃÂBøv¦¡ÿ¸¿B»“å&tQš +œÙ–óøj{òz‚vö{;М‡Z—ÚL–év‹Á£)(e)mתۜS;ÔÿNZÊS7!~4A÷K Q·ÚàK ¦¿ä•Bs·êñp(—„-¾XÅ>•UÍõY¶;æ…uR>7æºÉ…Lƒ©àÒ5Qz° ˆ +¸,M—6QzzX°ôøâÎ(=#þvaÀ£ÉDl$A1]ŽÎ[[§úËhæ¹%uȳV7ÏFœBóÁXèòéÂ&ÎÆ<}qgœ#ÞËç€ÆÿàòÙê#CÞíASÎí@aߎ"ÎqíÁ Ï^ü¸ 'nk&§!—:°)—ZXØ¥ž¸s\êá1îà4¾õÂi~âJôÇ©œüÌÁŒcD@}‘²Ÿ©!Ãâ›?iyþüûqÕendstream +endobj +3224 0 obj << +/Type /Page +/Contents 3225 0 R +/Resources 3223 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3226 0 obj << +/D [3224 0 R /XYZ 71.731 729.2652 null] +>> endobj +3227 0 obj << +/D [3224 0 R /XYZ 139.477 708.3437 null] +>> endobj +3228 0 obj << +/D [3224 0 R /XYZ 139.477 708.3437 null] +>> endobj +3229 0 obj << +/D [3224 0 R /XYZ 76.7123 690.4109 null] +>> endobj +3230 0 obj << +/D [3224 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3231 0 obj << +/D [3224 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3232 0 obj << +/D [3224 0 R /XYZ 71.731 670.3214 null] +>> endobj +3233 0 obj << +/D [3224 0 R /XYZ 71.731 670.3214 null] +>> endobj +3234 0 obj << +/D [3224 0 R /XYZ 139.477 654.5454 null] +>> endobj +3235 0 obj << +/D [3224 0 R /XYZ 71.731 653.1059 null] +>> endobj +3236 0 obj << +/D [3224 0 R /XYZ 139.477 636.6127 null] +>> endobj +3237 0 obj << +/D [3224 0 R /XYZ 76.7123 618.6799 null] +>> endobj +3238 0 obj << +/D [3224 0 R /XYZ 129.5143 600.7472 null] +>> endobj +3239 0 obj << +/D [3224 0 R /XYZ 129.5143 600.7472 null] +>> endobj +3240 0 obj << +/D [3224 0 R /XYZ 71.731 598.5904 null] +>> endobj +3241 0 obj << +/D [3224 0 R /XYZ 71.731 598.5904 null] +>> endobj +3242 0 obj << +/D [3224 0 R /XYZ 139.477 582.8144 null] +>> endobj +3243 0 obj << +/D [3224 0 R /XYZ 71.731 581.3749 null] +>> endobj +3244 0 obj << +/D [3224 0 R /XYZ 139.477 564.8817 null] +>> endobj +3245 0 obj << +/D [3224 0 R /XYZ 71.731 527.0236 null] +>> endobj +3246 0 obj << +/D [3224 0 R /XYZ 71.731 513.9727 null] +>> endobj +3247 0 obj << +/D [3224 0 R /XYZ 71.731 512.7273 null] +>> endobj +3248 0 obj << +/D [3224 0 R /XYZ 129.5143 493.6488 null] +>> endobj +784 0 obj << +/D [3224 0 R /XYZ 71.731 487.2279 null] +>> endobj +254 0 obj << +/D [3224 0 R /XYZ 306.9429 443.4132 null] +>> endobj +3249 0 obj << +/D [3224 0 R /XYZ 71.731 423.2728 null] +>> endobj +3250 0 obj << +/D [3224 0 R /XYZ 161.0655 410.5365 null] +>> endobj +3251 0 obj << +/D [3224 0 R /XYZ 71.731 398.417 null] +>> endobj +3252 0 obj << +/D [3224 0 R /XYZ 71.731 367.0511 null] +>> endobj +3253 0 obj << +/D [3224 0 R /XYZ 168.8063 356.0408 null] +>> endobj +3254 0 obj << +/D [3224 0 R /XYZ 71.731 328.9774 null] +>> endobj +3255 0 obj << +/D [3224 0 R /XYZ 71.731 302.7507 null] +>> endobj +3256 0 obj << +/D [3224 0 R /XYZ 71.731 269.9632 null] +>> endobj +3257 0 obj << +/D [3224 0 R /XYZ 181.5683 258.3073 null] +>> endobj +3258 0 obj << +/D [3224 0 R /XYZ 71.731 248.2452 null] +>> endobj +3259 0 obj << +/D [3224 0 R /XYZ 71.731 214.822 null] +>> endobj +3260 0 obj << +/D [3224 0 R /XYZ 71.731 203.7122 null] +>> endobj +3261 0 obj << +/D [3224 0 R /XYZ 71.731 202.4668 null] +>> endobj +3262 0 obj << +/D [3224 0 R /XYZ 129.5143 183.3883 null] +>> endobj +3263 0 obj << +/D [3224 0 R /XYZ 129.5143 183.3883 null] +>> endobj +3264 0 obj << +/D [3224 0 R /XYZ 71.731 181.9487 null] +>> endobj +3265 0 obj << +/D [3224 0 R /XYZ 71.731 181.9487 null] +>> endobj +3266 0 obj << +/D [3224 0 R /XYZ 139.477 165.4555 null] +>> endobj +3267 0 obj << +/D [3224 0 R /XYZ 139.477 165.4555 null] +>> endobj +3268 0 obj << +/D [3224 0 R /XYZ 76.7123 147.5228 null] +>> endobj +3269 0 obj << +/D [3224 0 R /XYZ 129.5143 129.59 null] +>> endobj +3270 0 obj << +/D [3224 0 R /XYZ 129.5143 129.59 null] +>> endobj +3271 0 obj << +/D [3224 0 R /XYZ 71.731 127.4332 null] +>> endobj +3272 0 obj << +/D [3224 0 R /XYZ 71.731 127.4332 null] +>> endobj +3273 0 obj << +/D [3224 0 R /XYZ 139.477 111.6573 null] +>> endobj +3274 0 obj << +/D [3224 0 R /XYZ 71.731 110.2177 null] +>> endobj +3223 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3278 0 obj << +/Length 1091 +/Filter /FlateDecode +>> +stream +xÚ¥X]œ6}ß_ÁãŒ\`lïÛ&i«T4J¦OÝjEÀ›Aa`LÓý÷½Œ cVû³ß{||¿€þH  .T!s¤Ç;|…G¿Þ -&tAo÷w?ýÂp Ši쟦bÄEF‘äDûìÏÍ»CòÒêzRŽ7™ë®HJÝþž|1?vÌÍGݪ¬ÙþµÿíîçýàŸ3”'³$#,QK„#E ÷¢˜à$”<‹˜6CU é6 +›p¬ÛÍ#¥üšíb©À5Øû½¾^xô«¼<.¢¦P$ĘFÓÖyùõ³ÎIýj~èð˜ä…¹O²¬ÖÍDMB`gœˆ LK¿š*ta”ÀF§‰µ›:Q +; Ôë÷¶Nýª)& :ÅÑè¼F<š"OõSž=UõS™uÇéJ`)…o݂{#]^¶æ¦²‘kŸn©wÊ#Ä#-„œ › ¹¶r>¿+BÎÇcr# ˆ·Ï¦V¦L—mþˆ1… ¿© ‹QL¨XÒƁÍiÓÖµñø]£‡‡G—Æ(yúˆó`rØ%ÇHbÅÏË>éöT—ÍýÍå1GL(¹ .l&AØb‚úü®HPG¹þG<.aElH=ۄ;¥)¯çSasø Uýœí!HHf¥ŒÇgcÚO×a„ܼׅnõnË $Ö[Â7MUz’?HR v-KÄæ8wuÕVí닾V\êŒ]Rç/Õyu¦ëÎəý#æ89µ»·—ó#[‡tW¡@<|ÂÞ¼Ëç½nÒ:ióªœcÉcj}Lêo¶ XFº៼i»2fž¤iuêë\ҘkvÞJ†Îa‹Á(A\#ï l£·š™›V§û¿´wU•Å«kÍ"úØèânúAàÃY|Å¡‚§¶L—U6“vXœ÷e¿+ªÙ„‡ÜñèRÞ#&ãZÆ)íKß0ÿv뻎š&]²»ÈS­o6XŠ9ŠñÒ¸ë fÚkZ쮧+šë5‰±¦¶·º@óVàѕC +FðÂq­ì¥?x=s&Ϋ!üoÆ-‰¼ý(¾·.l&nØbÜúü®ˆÛ ܎xLû“Gm¥£×jÿè L8(^]ØL´°Åpõù]¯>ÓapDã2ÑtýòædÂÕ¥W5'ŒE-ë2uºF–) *‡ÿõÂj¿>DÁ$¢f?P8˜é÷ N%Ôa¥K33†y¿6xþ Ôéîendstream +endobj +3277 0 obj << +/Type /Page +/Contents 3278 0 R +/Resources 3276 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3279 0 obj << +/D [3277 0 R /XYZ 71.731 729.2652 null] +>> endobj +3280 0 obj << +/D [3277 0 R /XYZ 139.477 708.3437 null] +>> endobj +3281 0 obj << +/D [3277 0 R /XYZ 76.7123 690.4109 null] +>> endobj +3282 0 obj << +/D [3277 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3283 0 obj << +/D [3277 0 R /XYZ 129.5143 672.4782 null] +>> endobj +3284 0 obj << +/D [3277 0 R /XYZ 71.731 670.3214 null] +>> endobj +3285 0 obj << +/D [3277 0 R /XYZ 71.731 670.3214 null] +>> endobj +3286 0 obj << +/D [3277 0 R /XYZ 139.477 654.5454 null] +>> endobj +3287 0 obj << +/D [3277 0 R /XYZ 71.731 653.1059 null] +>> endobj +3288 0 obj << +/D [3277 0 R /XYZ 139.477 636.6127 null] +>> endobj +3289 0 obj << +/D [3277 0 R /XYZ 71.731 598.7547 null] +>> endobj +3290 0 obj << +/D [3277 0 R /XYZ 71.731 585.7037 null] +>> endobj +3291 0 obj << +/D [3277 0 R /XYZ 71.731 584.4584 null] +>> endobj +3292 0 obj << +/D [3277 0 R /XYZ 129.5143 565.3798 null] +>> endobj +785 0 obj << +/D [3277 0 R /XYZ 71.731 558.9589 null] +>> endobj +258 0 obj << +/D [3277 0 R /XYZ 224.0515 515.1442 null] +>> endobj +3293 0 obj << +/D [3277 0 R /XYZ 71.731 495.0038 null] +>> endobj +3294 0 obj << +/D [3277 0 R /XYZ 161.0655 482.2675 null] +>> endobj +3295 0 obj << +/D [3277 0 R /XYZ 71.731 470.148 null] +>> endobj +3296 0 obj << +/D [3277 0 R /XYZ 71.731 438.7821 null] +>> endobj +3297 0 obj << +/D [3277 0 R /XYZ 168.8063 427.7718 null] +>> endobj +3298 0 obj << +/D [3277 0 R /XYZ 71.731 400.7084 null] +>> endobj +3299 0 obj << +/D [3277 0 R /XYZ 71.731 369.3425 null] +>> endobj +3300 0 obj << +/D [3277 0 R /XYZ 71.731 341.0486 null] +>> endobj +3301 0 obj << +/D [3277 0 R /XYZ 71.731 310.1126 null] +>> endobj +3302 0 obj << +/D [3277 0 R /XYZ 181.5683 298.4568 null] +>> endobj +3303 0 obj << +/D [3277 0 R /XYZ 71.731 288.3946 null] +>> endobj +3304 0 obj << +/D [3277 0 R /XYZ 71.731 254.9714 null] +>> endobj +3305 0 obj << +/D [3277 0 R /XYZ 71.731 243.8616 null] +>> endobj +3306 0 obj << +/D [3277 0 R /XYZ 71.731 242.6163 null] +>> endobj +3307 0 obj << +/D [3277 0 R /XYZ 129.5143 223.5377 null] +>> endobj +3308 0 obj << +/D [3277 0 R /XYZ 129.5143 223.5377 null] +>> endobj +3309 0 obj << +/D [3277 0 R /XYZ 71.731 222.0982 null] +>> endobj +3310 0 obj << +/D [3277 0 R /XYZ 71.731 222.0982 null] +>> endobj +3311 0 obj << +/D [3277 0 R /XYZ 139.477 205.605 null] +>> endobj +3312 0 obj << +/D [3277 0 R /XYZ 139.477 205.605 null] +>> endobj +3313 0 obj << +/D [3277 0 R /XYZ 76.7123 187.6722 null] +>> endobj +3314 0 obj << +/D [3277 0 R /XYZ 129.5143 169.7395 null] +>> endobj +3315 0 obj << +/D [3277 0 R /XYZ 129.5143 169.7395 null] +>> endobj +3316 0 obj << +/D [3277 0 R /XYZ 71.731 167.5826 null] +>> endobj +3317 0 obj << +/D [3277 0 R /XYZ 71.731 167.5826 null] +>> endobj +3318 0 obj << +/D [3277 0 R /XYZ 139.477 151.8067 null] +>> endobj +3319 0 obj << +/D [3277 0 R /XYZ 71.731 150.3672 null] +>> endobj +3320 0 obj << +/D [3277 0 R /XYZ 139.477 133.874 null] +>> endobj +3276 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3323 0 obj << +/Length 1085 +/Filter /FlateDecode +>> +stream +xڕX[£6}Ÿ_Ác"×WlæmÚíV[µR4Ê>uªMœ j®æß÷3bÀ\ªy€!Ç>ÇÇç³ $ÀðGIdp¡1¢‘ Ááú„ƒoðÓ¯OÄBB‹ ]ÐOû§?3Ä(ŽhìO‹#$$$£H ¢‚ýñÏÍÏçäVébR75×Ý%Étõ{òwóïËîKsó‡®Îù±Üþµÿíé—}Ç/˜D±’Y‘j,“ÆŽLBb$‘Ä +1Îd­óUW÷"+Ÿ‡Ü:RÐ=ÅÌËÝ¡BÖrÉI»ƒî7Jň—RG¨—wx}èh[yu8€C‚pÖבfÕÍDæ’žšky?tYžî#ú}Q"¸é,IÅÜ`D™ˆêÎ(ÊL·T›Oú¢+ýš_ôçbKñ&¿î¶ o DlÊ<³º¹DŠbðÓdIFÍ튼ʫ›~îZ(hÕ*lې‘¸Æ»¼À© ÃUè œÜ«³n÷ôøžïYrÕöé­n`Ÿëk’^ ñˆ [nWì']ŠôV¥y6'—AÍDÔÕ[6ìÕY[óoú¾aLõñ¡¶¹;Á°èF42Œ‰˜ÒÌÈî‹íúXòìòaûÔ[*6ÿÖ³óϖÀä ú­ôáÜÜ%™Õq/Ûº6ŠÊ¡$ós9hbziŸUCj»)S½]"Òl(vJ"ü1ú˜ö¦XK,¯-©‡ Ħó‹D(b2r—„…Š°a9EÉýRY|ã*¾§¥Fkór¹äf„ßÛy6Á-WF=9^Ó¬Ímº–rgŒI +ˆ<,Ñ3kãÂRхµÏ…ͬ}lqíóñ®XûF:˜rÜëÖ¾ž³xl£aÃ` Ïvê«â~hÊnë2íuV¥‡ÄT¼‹¼CpGl%P…‡eÔkl‹ +]ØÃXböäހZؤ±0ù˜òØË;mlÛj¬£o,‹—²/ã|i¶u»ªÃ‰aèoš}kýõØzmºkV¼[l&ÓKcŠ¨Œã…ôº°™ôv°ÅôúxW¤w¤ÃŸÞžŽÁæ±Z1D”ê; û½]¬ +×úÉ´RÉA£¤ iua3ií`‹iõñ®H«O‡s²iíÉxœ€^»$=šÖp1m D™¾TÈ.lΚ¶l‡w5k\½²¬Ý™¬7Š‘àj±ÞØ\½µ°åzó𮩷¡Ž‰zsuŒ†ž’‹cÄèpuûß5‡)lòÑbÍ9°¹`µ°å`yx×Ë£Ã,WÆ£æ¾vÊU5GG‘bK5çÂf¬é`‹ÖøxWXãÓ1¶¦'£Ws»"½&…=çê°]sô8 8‹ÖGØÊ&¦¢yS8æë^n aˆ -”¬ ›)Ù¶X²>Þ%ëÓáy¹íéXùrëÊ´Ÿ=¸Bð +Ï~q0ã#D˜ÀVÝ¢ŒA'?sxÿ^@#endstream +endobj +3322 0 obj << +/Type /Page +/Contents 3323 0 R +/Resources 3321 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3324 0 obj << +/D [3322 0 R /XYZ 71.731 729.2652 null] +>> endobj +3325 0 obj << +/D [3322 0 R /XYZ 71.731 741.2204 null] +>> endobj +3326 0 obj << +/D [3322 0 R /XYZ 71.731 718.3063 null] +>> endobj +3327 0 obj << +/D [3322 0 R /XYZ 71.731 708.2442 null] +>> endobj +3328 0 obj << +/D [3322 0 R /XYZ 71.731 706.9988 null] +>> endobj +3329 0 obj << +/D [3322 0 R /XYZ 129.5143 687.9203 null] +>> endobj +786 0 obj << +/D [3322 0 R /XYZ 71.731 681.4994 null] +>> endobj +262 0 obj << +/D [3322 0 R /XYZ 304.051 637.6847 null] +>> endobj +3330 0 obj << +/D [3322 0 R /XYZ 71.731 617.5443 null] +>> endobj +3331 0 obj << +/D [3322 0 R /XYZ 161.0655 604.8079 null] +>> endobj +3332 0 obj << +/D [3322 0 R /XYZ 71.731 592.6885 null] +>> endobj +3333 0 obj << +/D [3322 0 R /XYZ 71.731 561.3226 null] +>> endobj +3334 0 obj << +/D [3322 0 R /XYZ 168.8063 550.3123 null] +>> endobj +3335 0 obj << +/D [3322 0 R /XYZ 71.731 523.2489 null] +>> endobj +3336 0 obj << +/D [3322 0 R /XYZ 71.731 491.883 null] +>> endobj +3337 0 obj << +/D [3322 0 R /XYZ 71.731 465.4407 null] +>> endobj +3338 0 obj << +/D [3322 0 R /XYZ 71.731 432.6531 null] +>> endobj +3339 0 obj << +/D [3322 0 R /XYZ 181.5683 420.9972 null] +>> endobj +3340 0 obj << +/D [3322 0 R /XYZ 71.731 410.9351 null] +>> endobj +3341 0 obj << +/D [3322 0 R /XYZ 71.731 377.5119 null] +>> endobj +3342 0 obj << +/D [3322 0 R /XYZ 71.731 366.4021 null] +>> endobj +3343 0 obj << +/D [3322 0 R /XYZ 71.731 365.1567 null] +>> endobj +3344 0 obj << +/D [3322 0 R /XYZ 129.5143 346.0782 null] +>> endobj +3345 0 obj << +/D [3322 0 R /XYZ 129.5143 346.0782 null] +>> endobj +3346 0 obj << +/D [3322 0 R /XYZ 71.731 344.6387 null] +>> endobj +3347 0 obj << +/D [3322 0 R /XYZ 71.731 344.6387 null] +>> endobj +3348 0 obj << +/D [3322 0 R /XYZ 139.477 328.1454 null] +>> endobj +3349 0 obj << +/D [3322 0 R /XYZ 139.477 328.1454 null] +>> endobj +3350 0 obj << +/D [3322 0 R /XYZ 76.7123 310.2127 null] +>> endobj +3351 0 obj << +/D [3322 0 R /XYZ 129.5143 292.2799 null] +>> endobj +3352 0 obj << +/D [3322 0 R /XYZ 129.5143 292.2799 null] +>> endobj +3353 0 obj << +/D [3322 0 R /XYZ 71.731 290.1231 null] +>> endobj +3354 0 obj << +/D [3322 0 R /XYZ 71.731 290.1231 null] +>> endobj +3355 0 obj << +/D [3322 0 R /XYZ 139.477 274.3472 null] +>> endobj +3356 0 obj << +/D [3322 0 R /XYZ 71.731 272.9076 null] +>> endobj +3357 0 obj << +/D [3322 0 R /XYZ 139.477 256.4144 null] +>> endobj +3358 0 obj << +/D [3322 0 R /XYZ 76.7123 238.4817 null] +>> endobj +3359 0 obj << +/D [3322 0 R /XYZ 129.5143 220.5489 null] +>> endobj +3360 0 obj << +/D [3322 0 R /XYZ 129.5143 220.5489 null] +>> endobj +3361 0 obj << +/D [3322 0 R /XYZ 71.731 218.3921 null] +>> endobj +3362 0 obj << +/D [3322 0 R /XYZ 71.731 218.3921 null] +>> endobj +3363 0 obj << +/D [3322 0 R /XYZ 139.477 202.6162 null] +>> endobj +3364 0 obj << +/D [3322 0 R /XYZ 71.731 201.1766 null] +>> endobj +3365 0 obj << +/D [3322 0 R /XYZ 139.477 184.6834 null] +>> endobj +3366 0 obj << +/D [3322 0 R /XYZ 71.731 146.8254 null] +>> endobj +3367 0 obj << +/D [3322 0 R /XYZ 71.731 133.7744 null] +>> endobj +3368 0 obj << +/D [3322 0 R /XYZ 71.731 132.5291 null] +>> endobj +3369 0 obj << +/D [3322 0 R /XYZ 129.5143 113.4506 null] +>> endobj +787 0 obj << +/D [3322 0 R /XYZ 71.731 107.0297 null] +>> endobj +3321 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3372 0 obj << +/Length 926 +/Filter /FlateDecode +>> +stream +xÚµW]›:}ß_Ác"Û›¾m?Õê¶Zm#õ¡[­(q$˜®î¿ï8¶‰Ù˜$RUE +$œñ9s¦ùÙwsúʈ€=:ÏǑ41£³/ Â?¹Âendstream +endobj +3371 0 obj << +/Type /Page +/Contents 3372 0 R +/Resources 3370 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3373 0 obj << +/D [3371 0 R /XYZ 71.731 729.2652 null] +>> endobj +3374 0 obj << +/D [3371 0 R /XYZ 71.731 741.2204 null] +>> endobj +266 0 obj << +/D [3371 0 R /XYZ 203.7717 706.1179 null] +>> endobj +3375 0 obj << +/D [3371 0 R /XYZ 71.731 685.9775 null] +>> endobj +3376 0 obj << +/D [3371 0 R /XYZ 161.0655 673.2412 null] +>> endobj +3377 0 obj << +/D [3371 0 R /XYZ 71.731 661.1217 null] +>> endobj +3378 0 obj << +/D [3371 0 R /XYZ 71.731 562.1678 null] +>> endobj +3379 0 obj << +/D [3371 0 R /XYZ 71.731 533.8739 null] +>> endobj +3380 0 obj << +/D [3371 0 R /XYZ 71.731 501.0863 null] +>> endobj +3381 0 obj << +/D [3371 0 R /XYZ 181.5683 489.4305 null] +>> endobj +3382 0 obj << +/D [3371 0 R /XYZ 71.731 479.3683 null] +>> endobj +3383 0 obj << +/D [3371 0 R /XYZ 71.731 447.7967 null] +>> endobj +3384 0 obj << +/D [3371 0 R /XYZ 71.731 434.8353 null] +>> endobj +3385 0 obj << +/D [3371 0 R /XYZ 71.731 433.59 null] +>> endobj +3386 0 obj << +/D [3371 0 R /XYZ 129.5143 414.5114 null] +>> endobj +3387 0 obj << +/D [3371 0 R /XYZ 129.5143 414.5114 null] +>> endobj +3388 0 obj << +/D [3371 0 R /XYZ 71.731 413.0719 null] +>> endobj +3389 0 obj << +/D [3371 0 R /XYZ 71.731 413.0719 null] +>> endobj +3390 0 obj << +/D [3371 0 R /XYZ 139.477 396.5787 null] +>> endobj +3391 0 obj << +/D [3371 0 R /XYZ 139.477 396.5787 null] +>> endobj +3392 0 obj << +/D [3371 0 R /XYZ 76.7123 378.6459 null] +>> endobj +3393 0 obj << +/D [3371 0 R /XYZ 129.5143 360.7132 null] +>> endobj +3394 0 obj << +/D [3371 0 R /XYZ 129.5143 360.7132 null] +>> endobj +3395 0 obj << +/D [3371 0 R /XYZ 71.731 358.5564 null] +>> endobj +3396 0 obj << +/D [3371 0 R /XYZ 71.731 358.5564 null] +>> endobj +3397 0 obj << +/D [3371 0 R /XYZ 139.477 342.7804 null] +>> endobj +3398 0 obj << +/D [3371 0 R /XYZ 71.731 341.3409 null] +>> endobj +3399 0 obj << +/D [3371 0 R /XYZ 139.477 324.8477 null] +>> endobj +3400 0 obj << +/D [3371 0 R /XYZ 71.731 286.9896 null] +>> endobj +3401 0 obj << +/D [3371 0 R /XYZ 71.731 273.9387 null] +>> endobj +3402 0 obj << +/D [3371 0 R /XYZ 71.731 272.6933 null] +>> endobj +3403 0 obj << +/D [3371 0 R /XYZ 129.5143 253.6148 null] +>> endobj +788 0 obj << +/D [3371 0 R /XYZ 71.731 247.1939 null] +>> endobj +270 0 obj << +/D [3371 0 R /XYZ 232.4867 203.3792 null] +>> endobj +3404 0 obj << +/D [3371 0 R /XYZ 71.731 183.2388 null] +>> endobj +3405 0 obj << +/D [3371 0 R /XYZ 161.0655 170.5025 null] +>> endobj +3406 0 obj << +/D [3371 0 R /XYZ 71.731 158.383 null] +>> endobj +3407 0 obj << +/D [3371 0 R /XYZ 71.731 127.3534 null] +>> endobj +3408 0 obj << +/D [3371 0 R /XYZ 168.8063 116.0068 null] +>> endobj +3370 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3411 0 obj << +/Length 1058 +/Filter /FlateDecode +>> +stream +xÚÅWQœ6~¿_Á[v¥àbccÈÛ5i«TMuJ¶OMuò/‹Â +L·÷ï3›…Å «ªJuÒ­ßx>3ž°Àö8F<„’ 1⥇»Àû¯~¹ÃâŒ?ý¸»ûáç0ð”D$òvÏ^˜Dˆqêñ ˜áØÛenÞîÅQÉzëlê +QJõ›xêïÞ÷‹Rí«¬Ùþµûõî§ÝàŸ…%18Y$9 æ4IâÅ@3¢š&†· ÓÐãAŒBòŽçûrKƒÍß[Â6¢È3¡dÓsR{Ù/Ò¶®e©ú‡F6M^•HS÷>ŽPò¨Ûê£Tm]sÜÿäÏÆ®MS0}n‹Î´£vVÐ7K_+È£žÙ}QTšÖIfý«B6oóóɬ5Á(ÂqÒY‹ì—¯{ÃcnmãšG%Ó½Y–U&o%ö°Å V-ÜG cЙaî±8D BgÔ”?†Ù¨ADy€»¨ÍvÓ>Âf~ °bâô{ù{æa­æ<Âؕ=¢U{‡l„¢@{А7&TݦêõEâk{È­< +²jŒlk9? ¥1вÎ)¬EùcØYX¬oôä@vUX~@hâô{]Xk5ç16Lå|JÃ\3‡´4@˜&t&n^~1â~2¶ÝÃ×-6R'ìËu9iŒJã59G°%9-l]N‡ß[ä¼äá–sLãÒ¬¯±E”0ʗ½wdé¡ß®¯#ÕP^Œ…(´î'ýO¼˜Šøj˘ ì«®~ú\7¢k@€â¢:*£×ë +³žVêʶPWØj]qù½¡®¸xœÕòfÂ#/m©¸ÚGL$G³.ø>ãˆÇaØ JBÖ_&]A7`oÞÉŠö§\¹Š=å(&¿(öu¥*õr”·6ž‘‹Žñ瀺̙ó4ðâ1Ï«ú±¨¾äåã“h$`ð­ÝçlÒ:?êL\¢BjE¤§ôAÔ_M^šìí*Â?y£ Éϼ ÆäkÖ$3£ËΎ"M«¶TT™¸eu, â´7÷AÔÒvWeoÍá zæÔV˜—…YV¥±¬àæÕv“Ò7œ†étgQߊÎ8åEa¯ac¨<™w-….‰ÙÒa‡i 1{xû‡]ŠÒX5EžÚ9I4M•æBÙO9´Äéå¢f iÇ[¼é|ÿë™Êð{îêM[ ÁÑâòF~ϙ뿞¢pé]©vcØBµ`«ÕÎå÷†j7ãអ&<þŸ) +C‡„Ðñ•¶?†-´ý¶Úö]~ohû3ζ?¡ñýÚþõìÅq’µìÁ–²×ÂÖ³×á÷–ì½äq%{Ç<œÍ!8Æ Ñ(J¦Šçö˲ªÇ!¸<˜ù‡èÆ8J?ÖG˜ù·:#0â$vÒT½úåípø ñ˜Ñendstream +endobj +3410 0 obj << +/Type /Page +/Contents 3411 0 R +/Resources 3409 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3412 0 obj << +/D [3410 0 R /XYZ 71.731 729.2652 null] +>> endobj +3413 0 obj << +/D [3410 0 R /XYZ 71.731 718.3063 null] +>> endobj +3414 0 obj << +/D [3410 0 R /XYZ 71.731 671.6912 null] +>> endobj +3415 0 obj << +/D [3410 0 R /XYZ 181.5683 658.8294 null] +>> endobj +3416 0 obj << +/D [3410 0 R /XYZ 71.731 648.7672 null] +>> endobj +3417 0 obj << +/D [3410 0 R /XYZ 71.731 615.344 null] +>> endobj +3418 0 obj << +/D [3410 0 R /XYZ 71.731 604.2342 null] +>> endobj +3419 0 obj << +/D [3410 0 R /XYZ 71.731 602.9889 null] +>> endobj +3420 0 obj << +/D [3410 0 R /XYZ 129.5143 583.9103 null] +>> endobj +3421 0 obj << +/D [3410 0 R /XYZ 129.5143 583.9103 null] +>> endobj +3422 0 obj << +/D [3410 0 R /XYZ 71.731 582.4708 null] +>> endobj +3423 0 obj << +/D [3410 0 R /XYZ 71.731 582.4708 null] +>> endobj +3424 0 obj << +/D [3410 0 R /XYZ 139.477 565.9776 null] +>> endobj +3425 0 obj << +/D [3410 0 R /XYZ 139.477 565.9776 null] +>> endobj +3426 0 obj << +/D [3410 0 R /XYZ 71.731 563.8207 null] +>> endobj +3427 0 obj << +/D [3410 0 R /XYZ 139.477 548.0448 null] +>> endobj +3428 0 obj << +/D [3410 0 R /XYZ 139.477 548.0448 null] +>> endobj +3429 0 obj << +/D [3410 0 R /XYZ 71.731 510.1868 null] +>> endobj +3430 0 obj << +/D [3410 0 R /XYZ 71.731 497.1358 null] +>> endobj +3431 0 obj << +/D [3410 0 R /XYZ 71.731 495.8905 null] +>> endobj +3432 0 obj << +/D [3410 0 R /XYZ 129.5143 476.8119 null] +>> endobj +789 0 obj << +/D [3410 0 R /XYZ 71.731 470.3911 null] +>> endobj +274 0 obj << +/D [3410 0 R /XYZ 198.0388 426.5763 null] +>> endobj +3433 0 obj << +/D [3410 0 R /XYZ 71.731 406.4359 null] +>> endobj +3434 0 obj << +/D [3410 0 R /XYZ 161.0655 393.6996 null] +>> endobj +3435 0 obj << +/D [3410 0 R /XYZ 71.731 381.5801 null] +>> endobj +3436 0 obj << +/D [3410 0 R /XYZ 71.731 350.2143 null] +>> endobj +3437 0 obj << +/D [3410 0 R /XYZ 168.8063 339.204 null] +>> endobj +3438 0 obj << +/D [3410 0 R /XYZ 71.731 312.1405 null] +>> endobj +3439 0 obj << +/D [3410 0 R /XYZ 71.731 284.7079 null] +>> endobj +3440 0 obj << +/D [3410 0 R /XYZ 71.731 253.1263 null] +>> endobj +3441 0 obj << +/D [3410 0 R /XYZ 181.5683 241.4705 null] +>> endobj +3442 0 obj << +/D [3410 0 R /XYZ 71.731 231.4083 null] +>> endobj +3443 0 obj << +/D [3410 0 R /XYZ 71.731 199.8367 null] +>> endobj +3444 0 obj << +/D [3410 0 R /XYZ 71.731 186.8753 null] +>> endobj +3445 0 obj << +/D [3410 0 R /XYZ 71.731 185.63 null] +>> endobj +3446 0 obj << +/D [3410 0 R /XYZ 129.5143 166.5514 null] +>> endobj +3447 0 obj << +/D [3410 0 R /XYZ 129.5143 166.5514 null] +>> endobj +3448 0 obj << +/D [3410 0 R /XYZ 71.731 165.1119 null] +>> endobj +3449 0 obj << +/D [3410 0 R /XYZ 71.731 165.1119 null] +>> endobj +3450 0 obj << +/D [3410 0 R /XYZ 139.477 148.6187 null] +>> endobj +3451 0 obj << +/D [3410 0 R /XYZ 139.477 148.6187 null] +>> endobj +3452 0 obj << +/D [3410 0 R /XYZ 76.7123 130.6859 null] +>> endobj +3453 0 obj << +/D [3410 0 R /XYZ 129.5143 112.7532 null] +>> endobj +3454 0 obj << +/D [3410 0 R /XYZ 129.5143 112.7532 null] +>> endobj +3455 0 obj << +/D [3410 0 R /XYZ 71.731 110.5963 null] +>> endobj +3456 0 obj << +/D [3410 0 R /XYZ 71.731 110.5963 null] +>> endobj +3409 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3459 0 obj << +/Length 1040 +/Filter /FlateDecode +>> +stream +xڝW]£6}Ÿ_Ác"M\Ûà¯yËî¶ÕV­4ÚMŸ:Պ²A"òÑéüû^Ç@ 8€Vó3s|ϹÇ××âaø!ž Høð  +Q؝°÷þõëi!»³³A?ýâcO!Å)÷GÏW1x§H2"½Cü×æã)¼ÔI¹ÝQ†7™çsæIý{øj~Ý?6/$õ©ˆ«í߇ß~>ôüÌHI ™`‰.}oG1R”0'Š@F@ Àû/úd¨ò":QH¦Çõ0Í ¥l¬Ž@º˜ʳv¼ãçMG·Ê©ãf*ñ +„ÊHóúÑ8ö5­ó–ÆI^§/Sp{,±K†+Œ‚Õ‚56lƚ¶h‹w…5.Sk2ªºLóïwª,Ú×K™h—þÓb âQ93Œ$VÁ5ȗ¤nʼzšähÆP ’¸}ìP;vóQ l|œD»ë#¥°ù„:yïûØ­rê°|ì÷ÓÖq«1Òرµ²‰¢¤ªŽM¦eB,Ð'œ·@Û1„ô¡Ôg¦`)â׳/äæS’%uòUïǾ†ÍzÝR¼i`ŸL0[X ¤|Ô Epê¹,ê¢~¿$Oý + +ø•½]»£q"MEÜ%¼fó‚›úôhÕÉ·ÐÆ}Kc‡¾]Ggëû”TQ™^ê´ÈçúÐ+9µVFA}êJö’Dæ<Ǔ.ÊþO[Ê6ÿn ÛtMv ]«AL~åØÐҞÃwóR&ÿ4i™ŒÄDa–uuaž§P‡0Ü-u{²N£& Ûe‘uM*ïôÇãh¯-$¾š·7şURŽyönc» l:ãþ5ÅБbq´|¬æŒ-x;¥Ñéf@Zþ°ó霜_aYw½}^”<Ý©(âÊt¦Ý*h‚Õã0ҏf¶Ïi>NnmJan,3c›¾z GÜÜnÎ ½©Mø¸%@Üdu§Ò,ßÒÊŒ5çyŸe…–õÖÃ/PÍÕÚæjÃZ-—´}i*sE¯¡Ön„ex‹Ë™ Æ"ą 7’ ›¹‘zØâäâ]q#MtøÒr²¿‘:t›vØF„5ƒ†<µeP—MÔ]_ýt©×ë) +us¶‘M™Ü™(ÜB"àK#“ ›™zØâÈäâ]12Mt mG¦Œ=øb&o‡» N^CýØßېµwØz6á ªþ~õBKÕkÁ檷ƒ-W¯ƒwMõŽuÜ©^[‡=Y˜©Âá¶RˆK>4Ûöo=3œN2ãŒ!\ Geq¸%LêYÁ_Ø 6³=lq3\¼+6Ã¥Ã1Üt¬nm™í7p ŒQjö3ÙÂL¿’•Ð¯”ê#i=ŒÝýæuþzŽ´™endstream +endobj +3458 0 obj << +/Type /Page +/Contents 3459 0 R +/Resources 3457 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3275 0 R +>> endobj +3460 0 obj << +/D [3458 0 R /XYZ 71.731 729.2652 null] +>> endobj +3461 0 obj << +/D [3458 0 R /XYZ 71.731 741.2204 null] +>> endobj +3462 0 obj << +/D [3458 0 R /XYZ 139.477 708.3437 null] +>> endobj +3463 0 obj << +/D [3458 0 R /XYZ 71.731 706.9041 null] +>> endobj +3464 0 obj << +/D [3458 0 R /XYZ 139.477 690.4109 null] +>> endobj +3465 0 obj << +/D [3458 0 R /XYZ 71.731 652.5529 null] +>> endobj +3466 0 obj << +/D [3458 0 R /XYZ 71.731 639.5019 null] +>> endobj +3467 0 obj << +/D [3458 0 R /XYZ 71.731 638.2566 null] +>> endobj +3468 0 obj << +/D [3458 0 R /XYZ 129.5143 619.1781 null] +>> endobj +790 0 obj << +/D [3458 0 R /XYZ 71.731 612.7572 null] +>> endobj +278 0 obj << +/D [3458 0 R /XYZ 278.038 568.9424 null] +>> endobj +3469 0 obj << +/D [3458 0 R /XYZ 71.731 548.8021 null] +>> endobj +3470 0 obj << +/D [3458 0 R /XYZ 161.0655 536.0657 null] +>> endobj +3471 0 obj << +/D [3458 0 R /XYZ 71.731 523.9463 null] +>> endobj +3472 0 obj << +/D [3458 0 R /XYZ 71.731 492.9166 null] +>> endobj +3473 0 obj << +/D [3458 0 R /XYZ 168.8063 481.5701 null] +>> endobj +3474 0 obj << +/D [3458 0 R /XYZ 71.731 454.5067 null] +>> endobj +3475 0 obj << +/D [3458 0 R /XYZ 71.731 423.1408 null] +>> endobj +3476 0 obj << +/D [3458 0 R /XYZ 71.731 383.1906 null] +>> endobj +3477 0 obj << +/D [3458 0 R /XYZ 71.731 352.2546 null] +>> endobj +3478 0 obj << +/D [3458 0 R /XYZ 181.5683 340.5987 null] +>> endobj +3479 0 obj << +/D [3458 0 R /XYZ 71.731 330.5366 null] +>> endobj +3480 0 obj << +/D [3458 0 R /XYZ 71.731 297.1134 null] +>> endobj +3481 0 obj << +/D [3458 0 R /XYZ 71.731 286.0036 null] +>> endobj +3482 0 obj << +/D [3458 0 R /XYZ 71.731 284.7582 null] +>> endobj +3483 0 obj << +/D [3458 0 R /XYZ 129.5143 265.6797 null] +>> endobj +3484 0 obj << +/D [3458 0 R /XYZ 129.5143 265.6797 null] +>> endobj +3485 0 obj << +/D [3458 0 R /XYZ 71.731 264.2401 null] +>> endobj +3486 0 obj << +/D [3458 0 R /XYZ 71.731 264.2401 null] +>> endobj +3487 0 obj << +/D [3458 0 R /XYZ 139.477 247.7469 null] +>> endobj +3488 0 obj << +/D [3458 0 R /XYZ 139.477 247.7469 null] +>> endobj +3489 0 obj << +/D [3458 0 R /XYZ 76.7123 229.8142 null] +>> endobj +3490 0 obj << +/D [3458 0 R /XYZ 129.5143 211.8814 null] +>> endobj +3491 0 obj << +/D [3458 0 R /XYZ 129.5143 211.8814 null] +>> endobj +3492 0 obj << +/D [3458 0 R /XYZ 71.731 190.5166 null] +>> endobj +3493 0 obj << +/D [3458 0 R /XYZ 71.731 178.9052 null] +>> endobj +3494 0 obj << +/D [3458 0 R /XYZ 71.731 177.6599 null] +>> endobj +3495 0 obj << +/D [3458 0 R /XYZ 129.5143 158.5813 null] +>> endobj +791 0 obj << +/D [3458 0 R /XYZ 71.731 152.1604 null] +>> endobj +3457 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3498 0 obj << +/Length 943 +/Filter /FlateDecode +>> +stream +xÚÍWю›8}Ÿ¯à1‘ŠkŒMßf·ª«ÝÕ¨Í[§Š(q$#c4Ú¿ßëØ“˜§Õj<ã{Ïµ/$ÂðG"NO` 9¢£Qy|ÀÑ/xõù8Hì0±úmóðþ)ÁQŽòŒfÑf%y†O#žP$Ñf÷}õû¡xÕR­cÊðŠ";>×E#õŸÅOûóñù‹ýç/©í®[ÿØüñði3æg G¹€$7IŽ¨kš”D„#JXjx+Æ ñ”óMŠ²ÄãbõQÖRËouUÊG­UõsMñª×r³ÎðêŸWiØAÈÜ[yʑ ˜G±Y9ÏlÈgÕêVÄã 3²77¦eDä§ ó‰…M|Òè3\ôúðÎþ,|äÖ¤ÛV»m«¶Mq”€%ºñÝ§ûQv¥ª^uÕ6·'°Çõ w–ˆ>8‚Ý«,«Œ©Ü¹fE¶È¤½‹Iêóìó«Ô½j\Lb‡jïõe)»nß×nñû5˜}­¾ê­êlè{VýX×횲ÕÛ@ök[ËîÞ+vǪ¹7Õóš°U¡`[ l +ßä„äˆ1£”q”ðœM>¢bfMžGPÃà:š¡ðB)»ÊK)JRBƒy/Ç3aÖ5Dxª(EFÒdÊÃø7 M6 äƒÛr­úR¿»8'Ì|Ùèª,Œ]}d¯äõ +IŽÒ4K¨؇…%æȘ,h€Í + ›išóÎ ;̺æ1Ö¼…ÃkBãt±gh@]U–Âñ|©oÕüô Èz´ál‰·vì;9ï^œ &°Xr¯»åÞ¶ìÞ@Þ{Ü{Écƽ>{ˆŽÛ€èÎË\dtªzÕhw`)f›{'Ȃs}Ø çŽ°Eç†òÞáÜ_ëÜ PęðÛÌmá,8ރÕÎXõtϨyá2Ž8aK%ïÃn 7À–… ä½G¸€p>Iß«Ý`VÈ á)„ŠFç©Ï_Q:½TP¶Pä>ìF‘°Å"å½£ÈC<é-c¸æ¸H¬ 4acw™^w—OÊlO{ü»ÝÉî¿è*ŸÔ,ÔIžÚ4ï4s˜àžÚN›7Ûºêôÿ®·ÜÃê–àf1ûù²¿DŸcU݀wuÑumYzôVAcߜ#ŠÙQ*Õ*¨°}ɩۅÍaîÂV§J“;tiy÷’ +$H–ßü(ó0×ßdŒ‚‰\\ÊdeÙìV á¿Há\ªendstream +endobj +3497 0 obj << +/Type /Page +/Contents 3498 0 R +/Resources 3496 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3499 0 obj << +/D [3497 0 R /XYZ 71.731 729.2652 null] +>> endobj +3500 0 obj << +/D [3497 0 R /XYZ 71.731 741.2204 null] +>> endobj +282 0 obj << +/D [3497 0 R /XYZ 317.1857 705.7477 null] +>> endobj +3501 0 obj << +/D [3497 0 R /XYZ 71.731 682.2589 null] +>> endobj +3502 0 obj << +/D [3497 0 R /XYZ 161.0655 672.871 null] +>> endobj +3503 0 obj << +/D [3497 0 R /XYZ 71.731 660.7515 null] +>> endobj +3504 0 obj << +/D [3497 0 R /XYZ 71.731 574.89 null] +>> endobj +3505 0 obj << +/D [3497 0 R /XYZ 71.731 543.954 null] +>> endobj +3506 0 obj << +/D [3497 0 R /XYZ 181.5683 532.2981 null] +>> endobj +3507 0 obj << +/D [3497 0 R /XYZ 71.731 522.236 null] +>> endobj +3508 0 obj << +/D [3497 0 R /XYZ 71.731 490.6644 null] +>> endobj +3509 0 obj << +/D [3497 0 R /XYZ 71.731 477.703 null] +>> endobj +3510 0 obj << +/D [3497 0 R /XYZ 71.731 476.4576 null] +>> endobj +3511 0 obj << +/D [3497 0 R /XYZ 129.5143 457.3791 null] +>> endobj +3512 0 obj << +/D [3497 0 R /XYZ 129.5143 457.3791 null] +>> endobj +3513 0 obj << +/D [3497 0 R /XYZ 71.731 455.9395 null] +>> endobj +3514 0 obj << +/D [3497 0 R /XYZ 71.731 455.9395 null] +>> endobj +3515 0 obj << +/D [3497 0 R /XYZ 139.477 439.4463 null] +>> endobj +3516 0 obj << +/D [3497 0 R /XYZ 139.477 439.4463 null] +>> endobj +3517 0 obj << +/D [3497 0 R /XYZ 76.7123 421.5136 null] +>> endobj +3518 0 obj << +/D [3497 0 R /XYZ 129.5143 403.5808 null] +>> endobj +3519 0 obj << +/D [3497 0 R /XYZ 129.5143 403.5808 null] +>> endobj +3520 0 obj << +/D [3497 0 R /XYZ 71.731 401.424 null] +>> endobj +3521 0 obj << +/D [3497 0 R /XYZ 71.731 401.424 null] +>> endobj +3522 0 obj << +/D [3497 0 R /XYZ 139.477 385.6481 null] +>> endobj +3523 0 obj << +/D [3497 0 R /XYZ 71.731 383.4913 null] +>> endobj +3524 0 obj << +/D [3497 0 R /XYZ 139.477 367.7153 null] +>> endobj +3525 0 obj << +/D [3497 0 R /XYZ 71.731 329.8573 null] +>> endobj +3526 0 obj << +/D [3497 0 R /XYZ 71.731 316.8063 null] +>> endobj +3527 0 obj << +/D [3497 0 R /XYZ 71.731 315.561 null] +>> endobj +3528 0 obj << +/D [3497 0 R /XYZ 129.5143 296.4825 null] +>> endobj +792 0 obj << +/D [3497 0 R /XYZ 71.731 290.0616 null] +>> endobj +286 0 obj << +/D [3497 0 R /XYZ 301.9676 246.2468 null] +>> endobj +3529 0 obj << +/D [3497 0 R /XYZ 71.731 226.1065 null] +>> endobj +3530 0 obj << +/D [3497 0 R /XYZ 161.0655 213.3701 null] +>> endobj +3531 0 obj << +/D [3497 0 R /XYZ 71.731 201.2507 null] +>> endobj +3532 0 obj << +/D [3497 0 R /XYZ 71.731 170.221 null] +>> endobj +3533 0 obj << +/D [3497 0 R /XYZ 168.8063 158.8745 null] +>> endobj +3534 0 obj << +/D [3497 0 R /XYZ 71.731 131.8111 null] +>> endobj +3496 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3538 0 obj << +/Length 1020 +/Filter /FlateDecode +>> +stream +xÚÍW]o¤6}ϯàqF +®?06û–v»«TmeGêÃfÑf‰@ +FÑþû^cØÁ´OU ñïáøsM $ š sì_opð}¾!ZLè‚~ÞÝüô‰á AILã`w X#.¢@0Š$'2ؾn~9¥o*«·!åxC‘¹>i™©ßÓ¿Ì¿w÷ææLªC³ý¶ûíæ×ÝPŸ3 EfI¨)MšhƑ¦Ià)' –ˆELt<Ÿ2ÕÖecxsɏæÚ´û}Ö4Ƕ¸5?·oÒ¶P_©SV¿çM†4õ®ÞY–ÐކZ›rwEQm)ß¼g3ÅSUd͇aø™n?š™t£ÓÃk^Z.o¹½iyeùÇ-ᛴN_3XSÖœˆÄ#‰Ä+ø€ +]X/8,†À¤|2›¦ðL)ŸÔ¥V„PoÝËë™G?jʃIߏx¤­:yd£º‚†|°6Pu»W·žÕã³RåûTåUé"Û:›¾ ¥À%…å¼â亰³°D‡Ñ}¡vUXX|L£Ä[÷º°ý¨)±°,A‘cw ‹É³G]£8‚­âRß¼üÞëë‘õÕL×Ý«jpýU÷ò(F"JĂ{]،{Ø¢{}uW¸wÂÃïޏ¦È÷ÙK~x©ê—âìÑZJÄc!ÇZ祲[WíŠݯT"Iâdɯlί=lÙ¯žºküêáqVdð«K±Öû¢5µ2´Ÿ1¦foõkC0’2Z̲›Ó¦‡-kã©»F6.Q2yzÇyÓ [¨\JŸ ›Iß[LŸ¯îŠôMxøÓ7âQV‡>|§ªQZŽ—"o”'…„Á÷Ç[^Z×éÄãKfÄ’/%Ӆ͸o€-ºÏWw…û|<¦îÑ8'óôþÁŒ`6ÂÙR0]؜4=lYOÝ5Òxxx¤qiŒ‚ù©- +k¦¿Û´0êØÏeoOÍj´”ë= BŽîvÀכAC.)f va3`‹öÕ]hGÎ~YG<ÎV»z°Ù~Q»Ý!» +Ɍ ”ñ¸› š!®ftÚÝÎy_6*fºQDIŠÅE¿^WªR?Þ²µ'„«»·yÆë¾õ¶ßr<#k³f_çozØ1瘺Äì¹)µâ:Ü)YøA™ƒ¬pÛ(‡ov7ן[B¡S|z¸øl7ÔÝ)·s¿çEaîö©nM×x²7Mc(Ñï½i?¤cԌªaêɁž–‰øvšteñÑL+ןô£‹þitÐçT€µ fÒ¸¸zl÷ü*PȄendstream +endobj +3537 0 obj << +/Type /Page +/Contents 3538 0 R +/Resources 3536 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3539 0 obj << +/D [3537 0 R /XYZ 71.731 729.2652 null] +>> endobj +3540 0 obj << +/D [3537 0 R /XYZ 71.731 741.2204 null] +>> endobj +3541 0 obj << +/D [3537 0 R /XYZ 71.731 718.3063 null] +>> endobj +3542 0 obj << +/D [3537 0 R /XYZ 71.731 631.9816 null] +>> endobj +3543 0 obj << +/D [3537 0 R /XYZ 71.731 620.8718 null] +>> endobj +3544 0 obj << +/D [3537 0 R /XYZ 71.731 619.6265 null] +>> endobj +3545 0 obj << +/D [3537 0 R /XYZ 129.5143 600.5479 null] +>> endobj +3546 0 obj << +/D [3537 0 R /XYZ 129.5143 600.5479 null] +>> endobj +3547 0 obj << +/D [3537 0 R /XYZ 71.731 599.1084 null] +>> endobj +3548 0 obj << +/D [3537 0 R /XYZ 71.731 599.1084 null] +>> endobj +3549 0 obj << +/D [3537 0 R /XYZ 139.477 582.6152 null] +>> endobj +3550 0 obj << +/D [3537 0 R /XYZ 139.477 582.6152 null] +>> endobj +3551 0 obj << +/D [3537 0 R /XYZ 76.7123 564.6824 null] +>> endobj +3552 0 obj << +/D [3537 0 R /XYZ 129.5143 546.7497 null] +>> endobj +3553 0 obj << +/D [3537 0 R /XYZ 129.5143 546.7497 null] +>> endobj +3554 0 obj << +/D [3537 0 R /XYZ 71.731 544.5928 null] +>> endobj +3555 0 obj << +/D [3537 0 R /XYZ 71.731 544.5928 null] +>> endobj +3556 0 obj << +/D [3537 0 R /XYZ 139.477 528.8169 null] +>> endobj +3557 0 obj << +/D [3537 0 R /XYZ 71.731 527.3774 null] +>> endobj +3558 0 obj << +/D [3537 0 R /XYZ 139.477 510.8842 null] +>> endobj +3559 0 obj << +/D [3537 0 R /XYZ 76.7123 492.9514 null] +>> endobj +3560 0 obj << +/D [3537 0 R /XYZ 129.5143 475.0187 null] +>> endobj +3561 0 obj << +/D [3537 0 R /XYZ 129.5143 475.0187 null] +>> endobj +3562 0 obj << +/D [3537 0 R /XYZ 71.731 472.8618 null] +>> endobj +3563 0 obj << +/D [3537 0 R /XYZ 71.731 472.8618 null] +>> endobj +3564 0 obj << +/D [3537 0 R /XYZ 139.477 457.0859 null] +>> endobj +3565 0 obj << +/D [3537 0 R /XYZ 71.731 455.6464 null] +>> endobj +3566 0 obj << +/D [3537 0 R /XYZ 139.477 439.1532 null] +>> endobj +3567 0 obj << +/D [3537 0 R /XYZ 71.731 401.2951 null] +>> endobj +3568 0 obj << +/D [3537 0 R /XYZ 71.731 388.2442 null] +>> endobj +3569 0 obj << +/D [3537 0 R /XYZ 71.731 386.9988 null] +>> endobj +3570 0 obj << +/D [3537 0 R /XYZ 129.5143 367.9203 null] +>> endobj +793 0 obj << +/D [3537 0 R /XYZ 71.731 361.4994 null] +>> endobj +290 0 obj << +/D [3537 0 R /XYZ 309.0082 317.6847 null] +>> endobj +3571 0 obj << +/D [3537 0 R /XYZ 71.731 297.5443 null] +>> endobj +3572 0 obj << +/D [3537 0 R /XYZ 161.0655 284.8079 null] +>> endobj +3573 0 obj << +/D [3537 0 R /XYZ 71.731 272.6885 null] +>> endobj +3574 0 obj << +/D [3537 0 R /XYZ 71.731 241.6588 null] +>> endobj +3575 0 obj << +/D [3537 0 R /XYZ 168.8063 230.3123 null] +>> endobj +3576 0 obj << +/D [3537 0 R /XYZ 71.731 203.2489 null] +>> endobj +3577 0 obj << +/D [3537 0 R /XYZ 71.731 173.7346 null] +>> endobj +3578 0 obj << +/D [3537 0 R /XYZ 71.731 157.097 null] +>> endobj +3579 0 obj << +/D [3537 0 R /XYZ 71.731 124.3094 null] +>> endobj +3580 0 obj << +/D [3537 0 R /XYZ 181.5683 112.6535 null] +>> endobj +3536 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3583 0 obj << +/Length 1026 +/Filter /FlateDecode +>> +stream +xÚÍXM¤6½Ï¯àØ-m;þ¶™Û$›D%ÒhÓ9e¢K3ÛH4´€Öhÿ} +°Á4æã°R¢9@×ó«çª$ÀðGEbp¡!¢RÐ ¾<àà+<úõÈÁ`.èÇãÿ0„(”TÇ·€… ÅÅ(҂èàxú{÷Ó9ºÖI¹?Pwu×ç,ʓú÷èK÷óéùSwóGRŸ‹SµÿçøÛÃÏÇ>¾` +…‚,’ìQSš4 4Д¼¡Ià© œ +kÄ8S-ÏètIó&p‹6u0·‡fSJvàç=»¨Œ. l­z¼çKDDR„9“^¾=êàÂ,_؋¤å;Y­¡ðB©˜Ä¥6D¨7îýuàaߚò`ڧۈGt«ÏÙ(G¸‰Ð@»äVuy‹ëw)oÞOò:£:-ry+“é-È5!Xû…µ¨ƒ „%—G²°Ya!ù˜òÐw^Xû֔ÇXX"®Ô˜ÆèҏºB"Éá¤Ýë›æ_­¾Y/Ýrí}]t×[•Ì»D¹`kîu`Kîµ°u÷zânqï=÷º<Ò¼ª#©Si*´¢ˆSÍ„þ3K㤻/f QÝ +4ð q8.$Ÿ°y¾PA)ùLÅràÂrÐÃVsà‹»!>ƒš}F<ÒÜbt|3âÝâ8©ª·[f2ü¢D´ =…”fpÊF”‰®Q$eÓd”Þ}L2(Ï]~¦™šbuW×Ë¢.êo×ä±cpm” ItؾàÆh9¿`›’fvT5O^ÓÓkQ¾æÐ.à1ÙÚd>&U\¦×ÆLKt4]I]:•9âgéº&qú‚1MN+ÔÚà M:ùþª Ÿ™j}ënŠ<3w§vyg -LÂÞÏi|‚C4/FebKÐå D°cÀ§ûXn„(wV°!†M9ñ£º˜šI£JA“„Âü/ړ¬ÉaM³u©²+ßcCOͱyOã4¨éLI·,¬œ +³½·=iÚhV[ò@µ|O«né-N{ʲbOÅîÝäs‘%ÕÖ3ÐNN†Ë5ýÐ÷•ò{OSKD0ôîåZèÂja[­…¾¸jᄇ¿xü7Óц"ÌW¦)¶0Mõ°ÕiÊwÃ45áᝦF4þÓ` ÌõŠ{]؂{{ت{}q7¸wÂÃïޏûnçÑ’"¤Òc­aWêNüy¿2Ž˜¢dͯlɯ¶îWOÜ-~õðp†"ëW—Æ0¹óå©ñ`ÛÈËym p²5mؒ6¶®'îm<<<Ú¸4æÆoë8—žùpÁ5‚ '\ü¶á`¦Ÿ6ÕPÃ°_©!"ôì‡ +OÀ—Ú!endstream +endobj +3582 0 obj << +/Type /Page +/Contents 3583 0 R +/Resources 3581 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3584 0 obj << +/D [3582 0 R /XYZ 71.731 729.2652 null] +>> endobj +3585 0 obj << +/D [3582 0 R /XYZ 71.731 718.3063 null] +>> endobj +3586 0 obj << +/D [3582 0 R /XYZ 71.731 675.3674 null] +>> endobj +3587 0 obj << +/D [3582 0 R /XYZ 71.731 674.1221 null] +>> endobj +3588 0 obj << +/D [3582 0 R /XYZ 129.5143 655.0436 null] +>> endobj +3589 0 obj << +/D [3582 0 R /XYZ 129.5143 655.0436 null] +>> endobj +3590 0 obj << +/D [3582 0 R /XYZ 71.731 653.604 null] +>> endobj +3591 0 obj << +/D [3582 0 R /XYZ 71.731 653.604 null] +>> endobj +3592 0 obj << +/D [3582 0 R /XYZ 139.477 637.1108 null] +>> endobj +3593 0 obj << +/D [3582 0 R /XYZ 139.477 637.1108 null] +>> endobj +3594 0 obj << +/D [3582 0 R /XYZ 76.7123 619.1781 null] +>> endobj +3595 0 obj << +/D [3582 0 R /XYZ 129.5143 601.2453 null] +>> endobj +3596 0 obj << +/D [3582 0 R /XYZ 129.5143 601.2453 null] +>> endobj +3597 0 obj << +/D [3582 0 R /XYZ 71.731 579.1632 null] +>> endobj +3598 0 obj << +/D [3582 0 R /XYZ 71.731 568.2691 null] +>> endobj +3599 0 obj << +/D [3582 0 R /XYZ 71.731 567.0237 null] +>> endobj +3600 0 obj << +/D [3582 0 R /XYZ 129.5143 547.9452 null] +>> endobj +794 0 obj << +/D [3582 0 R /XYZ 71.731 541.5243 null] +>> endobj +294 0 obj << +/D [3582 0 R /XYZ 206.6635 497.7096 null] +>> endobj +3601 0 obj << +/D [3582 0 R /XYZ 71.731 477.5692 null] +>> endobj +3602 0 obj << +/D [3582 0 R /XYZ 161.0655 464.8329 null] +>> endobj +3603 0 obj << +/D [3582 0 R /XYZ 71.731 452.7134 null] +>> endobj +3604 0 obj << +/D [3582 0 R /XYZ 71.731 421.6837 null] +>> endobj +3605 0 obj << +/D [3582 0 R /XYZ 168.8063 410.3372 null] +>> endobj +3606 0 obj << +/D [3582 0 R /XYZ 71.731 383.2738 null] +>> endobj +3607 0 obj << +/D [3582 0 R /XYZ 71.731 351.9079 null] +>> endobj +3608 0 obj << +/D [3582 0 R /XYZ 71.731 323.614 null] +>> endobj +3609 0 obj << +/D [3582 0 R /XYZ 71.731 292.678 null] +>> endobj +3610 0 obj << +/D [3582 0 R /XYZ 181.5683 281.0222 null] +>> endobj +3611 0 obj << +/D [3582 0 R /XYZ 71.731 270.96 null] +>> endobj +3612 0 obj << +/D [3582 0 R /XYZ 71.731 237.5368 null] +>> endobj +3613 0 obj << +/D [3582 0 R /XYZ 71.731 226.427 null] +>> endobj +3614 0 obj << +/D [3582 0 R /XYZ 71.731 225.1816 null] +>> endobj +3615 0 obj << +/D [3582 0 R /XYZ 129.5143 206.1031 null] +>> endobj +3616 0 obj << +/D [3582 0 R /XYZ 129.5143 206.1031 null] +>> endobj +3617 0 obj << +/D [3582 0 R /XYZ 71.731 204.6636 null] +>> endobj +3618 0 obj << +/D [3582 0 R /XYZ 71.731 204.6636 null] +>> endobj +3619 0 obj << +/D [3582 0 R /XYZ 139.477 188.1704 null] +>> endobj +3620 0 obj << +/D [3582 0 R /XYZ 139.477 188.1704 null] +>> endobj +3621 0 obj << +/D [3582 0 R /XYZ 76.7123 170.2376 null] +>> endobj +3622 0 obj << +/D [3582 0 R /XYZ 129.5143 152.3048 null] +>> endobj +3623 0 obj << +/D [3582 0 R /XYZ 129.5143 152.3048 null] +>> endobj +3624 0 obj << +/D [3582 0 R /XYZ 71.731 150.148 null] +>> endobj +3625 0 obj << +/D [3582 0 R /XYZ 71.731 150.148 null] +>> endobj +3626 0 obj << +/D [3582 0 R /XYZ 139.477 134.3721 null] +>> endobj +3627 0 obj << +/D [3582 0 R /XYZ 71.731 132.9325 null] +>> endobj +3628 0 obj << +/D [3582 0 R /XYZ 139.477 116.4393 null] +>> endobj +3581 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3631 0 obj << +/Length 1257 +/Filter /FlateDecode +>> +stream +xÚµX]oÛ6}ϯð£ ÔI‰Ê[ÖmE‡ Š¼5C¡HL#À‘‰F‘?Ê"eJº…bC$ׇ<‡‡çò2&;lþ‘ H$æA3D9£»âõロ¯>Ý 9ZÌÑýúpóË Þe(ã”ïžwIÆéN$IFäî¡üºÿø’¿iÕŽ”á=EÃóþ”×Jÿ•? ïî?/+ýҔÝះ?o~ùY"P& ɪȵ”I3O&!bŒˆÀ%i".:¿(}nëîvÎ=¢¹4ÓSœ€Ü#êè÷ùÉ„{„õ܏”²/¥F¡ ïüyÕáF:<ŒCŒ¤ÉTGUëÃFáQ=Ïî\ªëžÏ§^¦™Ë舖ö“™@B&‰yÁˆ&Œ_&£ˆ‹~»…ÜRú®<¼/[3‹êì$¾ T I±ñ¯ÏŽàÞܷnôû›ºGH3‚_XíØ#%ˆ“ì‚¿ð8Ž‹ðGÌp~Ö/vYùðí·GŒé©OeŠ÷ö«ö²ÿ—oÔ©ìÌ@È<:V_æoª+ÚêMWM*3?mVUmŸm›¿¯3^·çB[\ÑÔ:¯êªþ>|.•ùxr“<5g=Y¥êlµ}~¬~Øc;A÷¦Šê²üÒÉ*§X§Y°Éž©Ärd‰ìèRÕz˜¸í¬ÙåÎýUNW>™#׺­žïÏZ“Ô§÷ق‡¯¹.^F—ô‹rYð—ý£:†·'å'@•W׀¥Íb´p¡q”±ðy²k²6Æñîtj”í8‚/ÍIu[“™—¯UmÕ¿UöåÜMjE«ÂUTݔj«°ûa&<ù«2»°rÒ&™@L²ÈAë¡VÎY‡Š³é†Sv."‘ž½ã!ë‹èO#À0š"ÜÏßCnýªø0k‘ýø¾ Š¼?o|ä¹UËÕ9"3¦æåPGv5•ô½² ºj¶Ó4yöºQKS_“ ¥BLeÜ_†ëà.㈧æf2÷×Î_ÀÖ×aº!òÍX áܦ‰éƒ\ƂëÁ֒ë`ñè¼[²;ׯ¯Ãµçêr’.‘gS§Æf®ÓV`{@0À”™;eËïµ_‹Š§wIº%¼KÞÅËe×ÓÛã‚ê¥a«p¥#ÑZ÷`kf9XÜ-€w‹]€À/_Æôdôï³N¿:LF¥!¡cAG4Ÿ+èOJ @p5쏵”1-ÓÔÈ0xMu•~‡›Œ`)ŽÁÙ½ ¼‰ö°Åâ½0ûÉXàìs¨£<]Ì4•{¦ oØT7 +ÔᅎØ4–‰ŽI¿øh†Í`)"¡f{õâŠZ³Â¢âN,I·±ùà‰fcÍW,D"ÊD¬ð<ÔJá9T¼ðÖ-…7—(<_‡ëÕæ[È¢še0k£„¦ÑÂó`kis°xÜÞ-yt@óuüL3t "Ò\w2qÇC­˜ãPQoÒ Ö"g|ÿÑÅÁI9b”GŠÓG…‹sDE‹bÝPœ pqNt͹Ö-ÔSŒd–ðÿ£1*˒X}ú°µ:X<ƒï–: ú:¦ÇÿÕdØ‚ç$fǵæ†EÅÍX’nñb)²Â퍰9öçõT"Ix¶ú ¼‡YþÏÌ®`’eãL½&–Nÿ&5r{endstream +endobj +3630 0 obj << +/Type /Page +/Contents 3631 0 R +/Resources 3629 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3632 0 obj << +/D [3630 0 R /XYZ 71.731 729.2652 null] +>> endobj +3633 0 obj << +/D [3630 0 R /XYZ 71.731 718.3063 null] +>> endobj +3634 0 obj << +/D [3630 0 R /XYZ 71.731 708.2442 null] +>> endobj +3635 0 obj << +/D [3630 0 R /XYZ 71.731 706.9988 null] +>> endobj +3636 0 obj << +/D [3630 0 R /XYZ 129.5143 687.9203 null] +>> endobj +795 0 obj << +/D [3630 0 R /XYZ 71.731 681.4994 null] +>> endobj +298 0 obj << +/D [3630 0 R /XYZ 231.3506 637.6847 null] +>> endobj +3637 0 obj << +/D [3630 0 R /XYZ 71.731 617.5443 null] +>> endobj +3638 0 obj << +/D [3630 0 R /XYZ 161.0655 604.8079 null] +>> endobj +3639 0 obj << +/D [3630 0 R /XYZ 71.731 592.6885 null] +>> endobj +3640 0 obj << +/D [3630 0 R /XYZ 71.731 561.6588 null] +>> endobj +3641 0 obj << +/D [3630 0 R /XYZ 168.8063 550.3123 null] +>> endobj +3642 0 obj << +/D [3630 0 R /XYZ 71.731 538.1928 null] +>> endobj +3643 0 obj << +/D [3630 0 R /XYZ 71.731 483.5144 null] +>> endobj +3644 0 obj << +/D [3630 0 R /XYZ 181.5683 472.5041 null] +>> endobj +3645 0 obj << +/D [3630 0 R /XYZ 71.731 462.4419 null] +>> endobj +3646 0 obj << +/D [3630 0 R /XYZ 71.731 429.0187 null] +>> endobj +3647 0 obj << +/D [3630 0 R /XYZ 71.731 417.9089 null] +>> endobj +3648 0 obj << +/D [3630 0 R /XYZ 71.731 416.6636 null] +>> endobj +3649 0 obj << +/D [3630 0 R /XYZ 129.5143 397.585 null] +>> endobj +3650 0 obj << +/D [3630 0 R /XYZ 129.5143 397.585 null] +>> endobj +3651 0 obj << +/D [3630 0 R /XYZ 71.731 396.1455 null] +>> endobj +3652 0 obj << +/D [3630 0 R /XYZ 71.731 396.1455 null] +>> endobj +3653 0 obj << +/D [3630 0 R /XYZ 139.477 379.6523 null] +>> endobj +3654 0 obj << +/D [3630 0 R /XYZ 139.477 379.6523 null] +>> endobj +3655 0 obj << +/D [3630 0 R /XYZ 76.7123 361.7195 null] +>> endobj +3656 0 obj << +/D [3630 0 R /XYZ 129.5143 343.7868 null] +>> endobj +3657 0 obj << +/D [3630 0 R /XYZ 129.5143 343.7868 null] +>> endobj +3658 0 obj << +/D [3630 0 R /XYZ 71.731 341.63 null] +>> endobj +3659 0 obj << +/D [3630 0 R /XYZ 71.731 341.63 null] +>> endobj +3660 0 obj << +/D [3630 0 R /XYZ 139.477 325.854 null] +>> endobj +3661 0 obj << +/D [3630 0 R /XYZ 71.731 323.6972 null] +>> endobj +3662 0 obj << +/D [3630 0 R /XYZ 139.477 307.9213 null] +>> endobj +3663 0 obj << +/D [3630 0 R /XYZ 71.731 306.4817 null] +>> endobj +3664 0 obj << +/D [3630 0 R /XYZ 71.731 306.4817 null] +>> endobj +3665 0 obj << +/D [3630 0 R /XYZ 149.4396 289.9885 null] +>> endobj +3666 0 obj << +/D [3630 0 R /XYZ 149.4396 289.9885 null] +>> endobj +3667 0 obj << +/D [3630 0 R /XYZ 71.731 287.8317 null] +>> endobj +3668 0 obj << +/D [3630 0 R /XYZ 71.731 287.8317 null] +>> endobj +3669 0 obj << +/D [3630 0 R /XYZ 159.4023 272.0558 null] +>> endobj +3670 0 obj << +/D [3630 0 R /XYZ 71.731 269.899 null] +>> endobj +3671 0 obj << +/D [3630 0 R /XYZ 159.4023 254.123 null] +>> endobj +3672 0 obj << +/D [3630 0 R /XYZ 76.7123 236.1903 null] +>> endobj +3673 0 obj << +/D [3630 0 R /XYZ 149.4396 218.2575 null] +>> endobj +3674 0 obj << +/D [3630 0 R /XYZ 149.4396 218.2575 null] +>> endobj +3675 0 obj << +/D [3630 0 R /XYZ 71.731 216.1007 null] +>> endobj +3676 0 obj << +/D [3630 0 R /XYZ 71.731 216.1007 null] +>> endobj +3677 0 obj << +/D [3630 0 R /XYZ 159.4023 200.3248 null] +>> endobj +3678 0 obj << +/D [3630 0 R /XYZ 71.731 198.8852 null] +>> endobj +3679 0 obj << +/D [3630 0 R /XYZ 159.4023 182.392 null] +>> endobj +3680 0 obj << +/D [3630 0 R /XYZ 76.7123 164.4593 null] +>> endobj +3681 0 obj << +/D [3630 0 R /XYZ 149.4396 146.5265 null] +>> endobj +3682 0 obj << +/D [3630 0 R /XYZ 149.4396 146.5265 null] +>> endobj +3683 0 obj << +/D [3630 0 R /XYZ 71.731 144.3697 null] +>> endobj +3684 0 obj << +/D [3630 0 R /XYZ 71.731 144.3697 null] +>> endobj +3685 0 obj << +/D [3630 0 R /XYZ 159.4023 128.5938 null] +>> endobj +3686 0 obj << +/D [3630 0 R /XYZ 71.731 126.4369 null] +>> endobj +3687 0 obj << +/D [3630 0 R /XYZ 159.4023 110.661 null] +>> endobj +3629 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3690 0 obj << +/Length 1230 +/Filter /FlateDecode +>> +stream +xÚ½™KoÛF…÷þ\Ú@5÷#»4h‹)`4Ú5E Hr"À• ‰.ߑȡ.É;s'jdAÊ9ä=üx)‘¢áñŸhœ`NŅ LZ#›õ?7¼ùÿë×ÑK½fE?-o~üEñ&°`¥m– +–§§$óFøf¹ùëöÝ×ÕS»=Þ-¤á·’uËûÇÕ~Û¾_}î>¾½ÿ­[ùcÛ~=lNw/¿ùy9Ì7ʱà㐢I<3Üظæã|­P•Pi皅 œiÁÃp,24Ž‰óqÆcI²Au>–Rš©7¡Eôæl÷—¦N—Wi«¹ å‘Z}±¡£Èuìãq·ßª³‘‹éë ˆt”>Ž8«ÞtLOíq·ÿÒ­úó°:Wßú?=Œd³£KóŒ<°B5™y@B0îÙS +J22·â}¼°§"×Sí “Â=…ª|OÙSljEOg6ðžŽ|œÚU»}ݞjã˜ô†ê)”b8ÈÈbs+bˆù@b8ò1Ê܇ â´§ãáN˜Ûwûõ6Ï)æFIÕÊJœ’Œæ„Ì­á„øÀ8AT]¿]jWL{Kµ¨ +­M*ºµÈԚÖNmdZ }<boׇ V]ccãmø¨®ò†£©êBY!’ƒŒŒ$6·"’˜$’#£üÝ_8wë‰6Æ:f¥ º +e%0IFƒAæրA|`` ª«$+"eáâ­Å0x†UR- ìÊ*8Þ±ší-ËJJ¦´èÜ<«´ÕÜǸŸñFi„VcÇmû|ÜzØm»GoÂçg$Ò«qE;ÀÖÜö@ßïNí˜÷GÎåe—Oí¡[vÃ懝Œ¹HÍÄ+ Š;©P†Ds¶·,n%—: só¸ÓV¨Íþª<²q½hÅE­4ñx gž‡îtüy!tz“$·ÌIí©HY)’IFG™[IÄ`4œ+è¯ïóºÍGxÏ\Dn€ª›¤"Sƒ ­ÍÔĸ¢}f ‡õ®ý†}ëÕÌ-°[g_Êwý†81Cg‚¢Y‰Y’ÑА¹5Ô¦>plÐƪûýôi·Á¿xXíô˜Þnßb¿½v›í¾Ý].hÇpžÐÆúð¼oXu¤”-Eñº-NOi‚ò= +ÑK2š2·†ÞÔNÚ(¿´qvÕÏՇÃŽq+(–WU e¯¢I·րœ˜À9ågê/À(³C`âüŧŒ¨ +“ŠÄˆ ­À85b„ʏ<_€qöTªg¬=ó"óë6½Všù[e#=ã"„aOgc–gß#ÿQÄ«ñendstream +endobj +3689 0 obj << +/Type /Page +/Contents 3690 0 R +/Resources 3688 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3691 0 obj << +/D [3689 0 R /XYZ 71.731 729.2652 null] +>> endobj +3692 0 obj << +/D [3689 0 R /XYZ 76.7123 708.3437 null] +>> endobj +3693 0 obj << +/D [3689 0 R /XYZ 149.4396 690.4109 null] +>> endobj +3694 0 obj << +/D [3689 0 R /XYZ 149.4396 690.4109 null] +>> endobj +3695 0 obj << +/D [3689 0 R /XYZ 71.731 688.2541 null] +>> endobj +3696 0 obj << +/D [3689 0 R /XYZ 71.731 688.2541 null] +>> endobj +3697 0 obj << +/D [3689 0 R /XYZ 159.4023 672.4782 null] +>> endobj +3698 0 obj << +/D [3689 0 R /XYZ 71.731 670.3214 null] +>> endobj +3699 0 obj << +/D [3689 0 R /XYZ 159.4023 654.5454 null] +>> endobj +3700 0 obj << +/D [3689 0 R /XYZ 76.7123 636.6127 null] +>> endobj +3701 0 obj << +/D [3689 0 R /XYZ 149.4396 618.6799 null] +>> endobj +3702 0 obj << +/D [3689 0 R /XYZ 149.4396 618.6799 null] +>> endobj +3703 0 obj << +/D [3689 0 R /XYZ 71.731 616.5231 null] +>> endobj +3704 0 obj << +/D [3689 0 R /XYZ 71.731 616.5231 null] +>> endobj +3705 0 obj << +/D [3689 0 R /XYZ 159.4023 600.7472 null] +>> endobj +3706 0 obj << +/D [3689 0 R /XYZ 71.731 598.5904 null] +>> endobj +3707 0 obj << +/D [3689 0 R /XYZ 159.4023 582.8144 null] +>> endobj +3708 0 obj << +/D [3689 0 R /XYZ 76.7123 564.8817 null] +>> endobj +3709 0 obj << +/D [3689 0 R /XYZ 149.4396 546.9489 null] +>> endobj +3710 0 obj << +/D [3689 0 R /XYZ 149.4396 546.9489 null] +>> endobj +3711 0 obj << +/D [3689 0 R /XYZ 71.731 544.7921 null] +>> endobj +3712 0 obj << +/D [3689 0 R /XYZ 71.731 544.7921 null] +>> endobj +3713 0 obj << +/D [3689 0 R /XYZ 159.4023 529.0162 null] +>> endobj +3714 0 obj << +/D [3689 0 R /XYZ 71.731 526.8593 null] +>> endobj +3715 0 obj << +/D [3689 0 R /XYZ 159.4023 511.0834 null] +>> endobj +3716 0 obj << +/D [3689 0 R /XYZ 76.7123 493.1507 null] +>> endobj +3717 0 obj << +/D [3689 0 R /XYZ 149.4396 475.2179 null] +>> endobj +3718 0 obj << +/D [3689 0 R /XYZ 149.4396 475.2179 null] +>> endobj +3719 0 obj << +/D [3689 0 R /XYZ 71.731 473.0611 null] +>> endobj +3720 0 obj << +/D [3689 0 R /XYZ 71.731 473.0611 null] +>> endobj +3721 0 obj << +/D [3689 0 R /XYZ 159.4023 457.2852 null] +>> endobj +3722 0 obj << +/D [3689 0 R /XYZ 71.731 455.1283 null] +>> endobj +3723 0 obj << +/D [3689 0 R /XYZ 159.4023 439.3524 null] +>> endobj +3724 0 obj << +/D [3689 0 R /XYZ 76.7123 421.4197 null] +>> endobj +3725 0 obj << +/D [3689 0 R /XYZ 149.4396 403.4869 null] +>> endobj +3726 0 obj << +/D [3689 0 R /XYZ 149.4396 403.4869 null] +>> endobj +3727 0 obj << +/D [3689 0 R /XYZ 71.731 401.3301 null] +>> endobj +3728 0 obj << +/D [3689 0 R /XYZ 71.731 401.3301 null] +>> endobj +3729 0 obj << +/D [3689 0 R /XYZ 159.4023 385.5542 null] +>> endobj +3730 0 obj << +/D [3689 0 R /XYZ 71.731 383.3973 null] +>> endobj +3731 0 obj << +/D [3689 0 R /XYZ 159.4023 367.6214 null] +>> endobj +3732 0 obj << +/D [3689 0 R /XYZ 76.7123 313.8231 null] +>> endobj +3733 0 obj << +/D [3689 0 R /XYZ 129.5143 295.8904 null] +>> endobj +3734 0 obj << +/D [3689 0 R /XYZ 129.5143 295.8904 null] +>> endobj +3735 0 obj << +/D [3689 0 R /XYZ 71.731 293.7336 null] +>> endobj +3736 0 obj << +/D [3689 0 R /XYZ 71.731 293.7336 null] +>> endobj +3737 0 obj << +/D [3689 0 R /XYZ 139.477 277.9576 null] +>> endobj +3738 0 obj << +/D [3689 0 R /XYZ 71.731 240.0996 null] +>> endobj +3739 0 obj << +/D [3689 0 R /XYZ 71.731 227.0486 null] +>> endobj +3740 0 obj << +/D [3689 0 R /XYZ 71.731 225.8033 null] +>> endobj +3741 0 obj << +/D [3689 0 R /XYZ 129.5143 206.7248 null] +>> endobj +3742 0 obj << +/D [3689 0 R /XYZ 71.731 204.5679 null] +>> endobj +3743 0 obj << +/D [3689 0 R /XYZ 71.731 204.5679 null] +>> endobj +3744 0 obj << +/D [3689 0 R /XYZ 139.477 188.792 null] +>> endobj +3745 0 obj << +/D [3689 0 R /XYZ 139.477 188.792 null] +>> endobj +3746 0 obj << +/D [3689 0 R /XYZ 71.731 186.6352 null] +>> endobj +3747 0 obj << +/D [3689 0 R /XYZ 139.477 170.8593 null] +>> endobj +3748 0 obj << +/D [3689 0 R /XYZ 139.477 170.8593 null] +>> endobj +3749 0 obj << +/D [3689 0 R /XYZ 71.731 169.4197 null] +>> endobj +3750 0 obj << +/D [3689 0 R /XYZ 139.477 152.9265 null] +>> endobj +3751 0 obj << +/D [3689 0 R /XYZ 139.477 152.9265 null] +>> endobj +3752 0 obj << +/D [3689 0 R /XYZ 71.731 150.7697 null] +>> endobj +3753 0 obj << +/D [3689 0 R /XYZ 139.477 134.9938 null] +>> endobj +3754 0 obj << +/D [3689 0 R /XYZ 139.477 134.9938 null] +>> endobj +3755 0 obj << +/D [3689 0 R /XYZ 71.731 132.8369 null] +>> endobj +3756 0 obj << +/D [3689 0 R /XYZ 139.477 117.061 null] +>> endobj +3757 0 obj << +/D [3689 0 R /XYZ 139.477 117.061 null] +>> endobj +3758 0 obj << +/D [3689 0 R /XYZ 71.731 114.9042 null] +>> endobj +3759 0 obj << +/D [3689 0 R /XYZ 139.477 99.1283 null] +>> endobj +3760 0 obj << +/D [3689 0 R /XYZ 139.477 99.1283 null] +>> endobj +3761 0 obj << +/D [3689 0 R /XYZ 71.731 96.9714 null] +>> endobj +3688 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3764 0 obj << +/Length 1280 +/Filter /FlateDecode +>> +stream +xڕX]o¤6}ϯàqFʸ¶ñû–ݶ«­Z)ÚÎ[S­È@6H§«üûŒ.«<™cßããã{/›?I‚dl.4ATpÞîpôÝüôùŽôC9ø Ç»_~q” DP_¢8ˆKɘ"ʼnŠŽÙ?»O¯éEçõþ@9ÞQd¯ç´ÌõŸé³}|xüboþÊõk•5ûÜývâóX¢D™ ‹$Vˆ GŠQB QÄLÁ 3(ið1‹å°šD‘v¡f1n€µ«y¢”Ù³\LYùº¸ã덇5å«HQëxÄ bR†4Ò,«ó¦ù¦ß/ù·Â +Öñ¿m†Rˆ ©L°vÀ«oZ×éû^ðÝ}/¼Ç>´“Ù»"ËK]KeT=Ÿª – D•R Â>vÃí½›V’($d’¬)éÁ–”t°u%¸[”ó€•ôiø Ê~’"FM)ø¹ì7Ÿë0F’Iº’ë<ÔB®s¨õ\DݒëP®óyXŸõB +™úÙɐ™ÚcæULH‡§H¨¶–Kµûœë‡lOð®ó¸x7³)L"E±ªí¤°ýÁc]éªÿÃ0â¶÷ýØ%æ)»õ]¼>–êcu;ø„9N¯úµßÝ F¶µìܶ! »Ý¯s}­Ëî—üœ5f48Ëٞã_óæT]TåVÖ_»h=Ó´ô i3åËpà¯'ݸC^ê´(۝鞳Ü<žÝ$ÏÕUKõŒÜ÷Y_^–´°µ¾Ö\ò“-ù™#™…ÃÚ¬Õ¸í@̸ˆíIœ®!ÝÐU܇"õW¿i¶TË>ï)Þ]u>LWžßç$±·o©>½‚ê×Üy§×XáâÜ'ÝçÜ·NžT9jVß ÙÆd‚_"²Ñ¹çsµ§|÷ÃøZóf«‰Óì­({ö—¢¿¹6Á±ÒùɝÀ.t ±Ç¶?Hëô-7»` 9‘˜bĉŒ¨l{1Óx9ÔÁ‡ÝRq"±MœÙfs1¥¦ë&Œ;Ÿ‹Ý¨)°´¹ðhsÔx1„ɤ;0Çå~ôՎoOÚ)m”¼Öó=åm£¯u_>l¡g`«=wCÏ0áö £‹}Á„»/ÁÌ»ë|÷õÈúf§³Æ¯†ó0ï^ÚÖ\E×ÜëÁ–Üë`ëîânqï˜ÇŒ{}A©y)\Rw!˜# ¶gAîo_Á‚:Ñ÷)ãÿµEcÖØؤ²úªæ֌í`ëÆân16ÀÃÓÍÛ§ñÂÍô·D1¤ÔÜ«—ëo}Ô|; Vû[(ê†þ¢ô·£ÇöO³* –¬|ñðQ *9ÔºJ@Ô-*4 •|a¾›5wÂHLVlí„ù°…6ÀVOwà ƒxLOX@#,´~ç9mA琑6e/;ÇC-8ǡ֝DÝâœ10ëÎñy”¦qÛܳL28üä«þ;4S&ù‰dñSµ‡™~©æTbÆõÕdö»3ð¢NÏendstream +endobj +3763 0 obj << +/Type /Page +/Contents 3764 0 R +/Resources 3762 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3535 0 R +>> endobj +3765 0 obj << +/D [3763 0 R /XYZ 71.731 729.2652 null] +>> endobj +3766 0 obj << +/D [3763 0 R /XYZ 139.477 708.3437 null] +>> endobj +3767 0 obj << +/D [3763 0 R /XYZ 139.477 708.3437 null] +>> endobj +3768 0 obj << +/D [3763 0 R /XYZ 71.731 706.1869 null] +>> endobj +3769 0 obj << +/D [3763 0 R /XYZ 71.731 706.1869 null] +>> endobj +3770 0 obj << +/D [3763 0 R /XYZ 149.4396 690.4109 null] +>> endobj +3771 0 obj << +/D [3763 0 R /XYZ 76.7123 672.4782 null] +>> endobj +3772 0 obj << +/D [3763 0 R /XYZ 139.477 654.5454 null] +>> endobj +3773 0 obj << +/D [3763 0 R /XYZ 139.477 654.5454 null] +>> endobj +3774 0 obj << +/D [3763 0 R /XYZ 71.731 652.3886 null] +>> endobj +3775 0 obj << +/D [3763 0 R /XYZ 139.477 636.6127 null] +>> endobj +3776 0 obj << +/D [3763 0 R /XYZ 139.477 636.6127 null] +>> endobj +3777 0 obj << +/D [3763 0 R /XYZ 71.731 634.4559 null] +>> endobj +3778 0 obj << +/D [3763 0 R /XYZ 139.477 618.6799 null] +>> endobj +3779 0 obj << +/D [3763 0 R /XYZ 139.477 618.6799 null] +>> endobj +3780 0 obj << +/D [3763 0 R /XYZ 71.731 616.5231 null] +>> endobj +3781 0 obj << +/D [3763 0 R /XYZ 71.731 616.5231 null] +>> endobj +3782 0 obj << +/D [3763 0 R /XYZ 149.4396 600.7472 null] +>> endobj +796 0 obj << +/D [3763 0 R /XYZ 71.731 559.9004 null] +>> endobj +302 0 obj << +/D [3763 0 R /XYZ 260.9266 514.6461 null] +>> endobj +3783 0 obj << +/D [3763 0 R /XYZ 71.731 491.1573 null] +>> endobj +3784 0 obj << +/D [3763 0 R /XYZ 161.0655 481.7693 null] +>> endobj +3785 0 obj << +/D [3763 0 R /XYZ 71.731 469.6499 null] +>> endobj +3786 0 obj << +/D [3763 0 R /XYZ 71.731 438.284 null] +>> endobj +3787 0 obj << +/D [3763 0 R /XYZ 168.8063 427.2737 null] +>> endobj +3788 0 obj << +/D [3763 0 R /XYZ 71.731 415.1542 null] +>> endobj +3789 0 obj << +/D [3763 0 R /XYZ 71.731 360.4758 null] +>> endobj +3790 0 obj << +/D [3763 0 R /XYZ 181.5683 349.4655 null] +>> endobj +3791 0 obj << +/D [3763 0 R /XYZ 71.731 339.4033 null] +>> endobj +3792 0 obj << +/D [3763 0 R /XYZ 71.731 305.9801 null] +>> endobj +3793 0 obj << +/D [3763 0 R /XYZ 71.731 294.8703 null] +>> endobj +3794 0 obj << +/D [3763 0 R /XYZ 71.731 293.625 null] +>> endobj +3795 0 obj << +/D [3763 0 R /XYZ 129.5143 274.5464 null] +>> endobj +3796 0 obj << +/D [3763 0 R /XYZ 129.5143 274.5464 null] +>> endobj +3797 0 obj << +/D [3763 0 R /XYZ 71.731 273.1069 null] +>> endobj +3798 0 obj << +/D [3763 0 R /XYZ 71.731 273.1069 null] +>> endobj +3799 0 obj << +/D [3763 0 R /XYZ 139.477 256.6137 null] +>> endobj +3800 0 obj << +/D [3763 0 R /XYZ 139.477 256.6137 null] +>> endobj +3801 0 obj << +/D [3763 0 R /XYZ 76.7123 238.6809 null] +>> endobj +3802 0 obj << +/D [3763 0 R /XYZ 129.5143 220.7482 null] +>> endobj +3803 0 obj << +/D [3763 0 R /XYZ 129.5143 220.7482 null] +>> endobj +3804 0 obj << +/D [3763 0 R /XYZ 71.731 218.5914 null] +>> endobj +3805 0 obj << +/D [3763 0 R /XYZ 71.731 218.5914 null] +>> endobj +3806 0 obj << +/D [3763 0 R /XYZ 139.477 202.8154 null] +>> endobj +3807 0 obj << +/D [3763 0 R /XYZ 71.731 200.6586 null] +>> endobj +3808 0 obj << +/D [3763 0 R /XYZ 71.731 200.6586 null] +>> endobj +3809 0 obj << +/D [3763 0 R /XYZ 149.4396 184.8827 null] +>> endobj +3810 0 obj << +/D [3763 0 R /XYZ 71.731 182.7258 null] +>> endobj +3811 0 obj << +/D [3763 0 R /XYZ 149.4396 166.9499 null] +>> endobj +3812 0 obj << +/D [3763 0 R /XYZ 76.7123 149.0172 null] +>> endobj +3813 0 obj << +/D [3763 0 R /XYZ 139.477 131.0844 null] +>> endobj +3814 0 obj << +/D [3763 0 R /XYZ 71.731 129.6449 null] +>> endobj +3815 0 obj << +/D [3763 0 R /XYZ 71.731 129.6449 null] +>> endobj +3816 0 obj << +/D [3763 0 R /XYZ 149.4396 113.1517 null] +>> endobj +3817 0 obj << +/D [3763 0 R /XYZ 149.4396 113.1517 null] +>> endobj +3818 0 obj << +/D [3763 0 R /XYZ 71.731 110.9948 null] +>> endobj +3819 0 obj << +/D [3763 0 R /XYZ 71.731 110.9948 null] +>> endobj +3762 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3822 0 obj << +/Length 1080 +/Filter /FlateDecode +>> +stream +xÚ¥˜]oœ8†ïó+¸L¤Ž×6þÌ]?v«V])êÎÝvÑ@¤ D iÕ¿‡±a 0i5€æÅç=çØ–Pø±D3¢S8pK¸’<¹{¼ É7øëýó’×ìBћýÅ¥4±Ä*®’ý}’ZE¤‰N91’™dŸÿ{ùö!{j‹æjÇ%½äÄoYU´Ÿ²¯îòõÍwòwÑ>Ôùñê¿ýNj?÷C|™jb Y5™C¤H“§Är&Q–0 +¹PCR‘ê!nMX—'ä2èY—ÌÎåÔ“ŒXIyØǝÏ>ú»Pg¦L‚ÊÓ±c۔շWž^ž7Åñè.ڟOÅÌaŸ‹²”Fm„L([!3È¢d°¸È`>2#YÓd?ŠúÞ_+…aµN”PMR଼hªTÓ±I ÈÙh…F]&Õß5·‘šÄ)%ÆO,ô‘9·„Û2ï,M›ÔJB°N형UëñúžFˆwšÅLQŒëX ²µìeñDân©AÄVƒ¡H±ÚŸ¼¨Úò ¥&ÆEPÌ¥m´YÙ¨^…ÄÝ +ñ +}à¥óì|¿I ‘Þ U˽;¨¢½‹EÝл3xïŽ|äÅñ®)ŸÚ²®¾UŒ(eô¸oÝ,m]/[*J©1†Åº7”­å ‹%wCQb>¢ùˆ,§³ •PÄ +ëßP¶†ª—ÅQ!q· B|`¨B/_l£ô˜%R“ZÎô½^µ egzVSGo6Ú"=ÎawÅ8w™^×ÜǸ‰aÛ*lMG>š¢}nªÛû²8¸-æDp“ŽÛØ!WòÒ#þTÛñ8MÝˆŽzíŽ.Ø<íޘԄ›…õ Ú…2¤Xg£-â†7ʅEã.ãîïB}Åê§î‘óā–KÈGRb¨•'Áç¡ãõbI¦F*¡ÖK2”­”ä ‹–$wCIb>Fý³ùÀúù®],œT9ÉHᄲ•ÂdÑÂÁân(œ™qŸúÂÙ¨²ÇéN.¥°AÙͯCÚP‡Ì(ƒÈÖ ö²8D$îˆS8ÄÐƯ¿lüÆnpÎùқܙîYµ׫âlçA· ˜ÀÉ~y'ø¢%†…Ô`6eòää„M0ѽC«(ã¦N”í¾ðhsù¾hßÔuûO›µ¶¸ M §Ýt ÛZí«ä¦©Ûº3q=ÜqÎÞß»ãóq¿üIš=·pdHÜ]?Œ‹ë¶|ïÎÙnìW ¿(W‹ûéìpp'߯¸„+¨ýÓeUçõWH 0]d«ëׇCÝ ú£ðc~®ÅqkYþXV¾žJò|„6´ß\´ÅÝëÀï¤ÖýWAaàÅDÙÕ‡fþÝPrC(ƒ¹´Wuþ_ü +ˆüJ#ŸŒendstream +endobj +3821 0 obj << +/Type /Page +/Contents 3822 0 R +/Resources 3820 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +3823 0 obj << +/D [3821 0 R /XYZ 71.731 729.2652 null] +>> endobj +3824 0 obj << +/D [3821 0 R /XYZ 159.4023 708.3437 null] +>> endobj +3825 0 obj << +/D [3821 0 R /XYZ 71.731 706.1869 null] +>> endobj +3826 0 obj << +/D [3821 0 R /XYZ 159.4023 690.4109 null] +>> endobj +3827 0 obj << +/D [3821 0 R /XYZ 76.7123 672.4782 null] +>> endobj +3828 0 obj << +/D [3821 0 R /XYZ 149.4396 654.5454 null] +>> endobj +3829 0 obj << +/D [3821 0 R /XYZ 149.4396 654.5454 null] +>> endobj +3830 0 obj << +/D [3821 0 R /XYZ 71.731 652.3886 null] +>> endobj +3831 0 obj << +/D [3821 0 R /XYZ 71.731 652.3886 null] +>> endobj +3832 0 obj << +/D [3821 0 R /XYZ 159.4023 636.6127 null] +>> endobj +3833 0 obj << +/D [3821 0 R /XYZ 71.731 634.4559 null] +>> endobj +3834 0 obj << +/D [3821 0 R /XYZ 159.4023 618.6799 null] +>> endobj +3835 0 obj << +/D [3821 0 R /XYZ 76.7123 600.7472 null] +>> endobj +3836 0 obj << +/D [3821 0 R /XYZ 149.4396 582.8144 null] +>> endobj +3837 0 obj << +/D [3821 0 R /XYZ 149.4396 582.8144 null] +>> endobj +3838 0 obj << +/D [3821 0 R /XYZ 71.731 580.6576 null] +>> endobj +3839 0 obj << +/D [3821 0 R /XYZ 71.731 580.6576 null] +>> endobj +3840 0 obj << +/D [3821 0 R /XYZ 159.4023 564.8817 null] +>> endobj +3841 0 obj << +/D [3821 0 R /XYZ 71.731 562.7248 null] +>> endobj +3842 0 obj << +/D [3821 0 R /XYZ 159.4023 546.9489 null] +>> endobj +3843 0 obj << +/D [3821 0 R /XYZ 76.7123 493.1507 null] +>> endobj +3844 0 obj << +/D [3821 0 R /XYZ 129.5143 475.2179 null] +>> endobj +3845 0 obj << +/D [3821 0 R /XYZ 129.5143 475.2179 null] +>> endobj +3846 0 obj << +/D [3821 0 R /XYZ 71.731 473.0611 null] +>> endobj +3847 0 obj << +/D [3821 0 R /XYZ 71.731 473.0611 null] +>> endobj +3848 0 obj << +/D [3821 0 R /XYZ 139.477 457.2852 null] +>> endobj +3849 0 obj << +/D [3821 0 R /XYZ 71.731 419.4271 null] +>> endobj +3850 0 obj << +/D [3821 0 R /XYZ 71.731 406.3762 null] +>> endobj +3851 0 obj << +/D [3821 0 R /XYZ 71.731 405.1308 null] +>> endobj +3852 0 obj << +/D [3821 0 R /XYZ 129.5143 386.0523 null] +>> endobj +3853 0 obj << +/D [3821 0 R /XYZ 71.731 383.8955 null] +>> endobj +3854 0 obj << +/D [3821 0 R /XYZ 71.731 383.8955 null] +>> endobj +3855 0 obj << +/D [3821 0 R /XYZ 139.477 368.1195 null] +>> endobj +3856 0 obj << +/D [3821 0 R /XYZ 139.477 368.1195 null] +>> endobj +3857 0 obj << +/D [3821 0 R /XYZ 71.731 365.9627 null] +>> endobj +3858 0 obj << +/D [3821 0 R /XYZ 139.477 350.1868 null] +>> endobj +3859 0 obj << +/D [3821 0 R /XYZ 139.477 350.1868 null] +>> endobj +3860 0 obj << +/D [3821 0 R /XYZ 71.731 348.03 null] +>> endobj +3861 0 obj << +/D [3821 0 R /XYZ 139.477 332.254 null] +>> endobj +3862 0 obj << +/D [3821 0 R /XYZ 139.477 332.254 null] +>> endobj +797 0 obj << +/D [3821 0 R /XYZ 71.731 309.34 null] +>> endobj +306 0 obj << +/D [3821 0 R /XYZ 234.3633 264.0857 null] +>> endobj +3863 0 obj << +/D [3821 0 R /XYZ 71.731 243.9453 null] +>> endobj +3864 0 obj << +/D [3821 0 R /XYZ 161.0655 231.2089 null] +>> endobj +3865 0 obj << +/D [3821 0 R /XYZ 71.731 219.0895 null] +>> endobj +3866 0 obj << +/D [3821 0 R /XYZ 71.731 188.0598 null] +>> endobj +3867 0 obj << +/D [3821 0 R /XYZ 168.8063 176.7133 null] +>> endobj +3868 0 obj << +/D [3821 0 R /XYZ 71.731 164.5938 null] +>> endobj +3869 0 obj << +/D [3821 0 R /XYZ 71.731 133.2279 null] +>> endobj +3870 0 obj << +/D [3821 0 R /XYZ 181.5683 122.2177 null] +>> endobj +3871 0 obj << +/D [3821 0 R /XYZ 71.731 112.1555 null] +>> endobj +3820 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3875 0 obj << +/Length 1257 +/Filter /FlateDecode +>> +stream +xÚÅXMoã6½çWèè5KR¢Hå–M»‹-Z ØÍ­)ŠLÇd)°d¤ù÷J¤BY£Ú"@äGÎãã›áÐ, ðÇɈ áÁÂcÁƒìxEƒgøê˳­Ål}Ч‡«Ÿ?‡4HHó8xØa!£@†œ(ÁTð°ûsswH_}ºÞrA7œtÏû"-uó{úÔ½½½ÿÚ½øC7‡jW_ÿõðÛÕ¯}|J’(2K²GiòÄ£ÉXB„`2T‘0 +eËóþš‰MzJØÖ7—úA±‚(œ†(…µõaŽ|")Pèa†Â#çb—sàÈ8÷òùÎÍóU @Š8jy€P‚EáGzn†Ç…n<"ÔD0›n¿êætʟ.vь×e“gi“W¥<ŸôxŽB ¡”¸°µõaïÂ2cÏÁ‚lRX0)åQ‚Ɲ֍ó +&$’rHãt鎨+bG<—úæå³Ó‘õØM×¾nªîy®[‘! L:r0£ DÑ$jgþ¦aʃ‹D)"¹`p6cð¶hp,î +ƒc<¼\w~ðHO§ô­«Ú#JªªÆ}œ6Úîp•„3ÑnðVH"U¶âòPts"©)qRm¾èæ®*÷ŸóB×ÈvG’(NAGS+elkЩjªæíEßô#Þ-eÇn9#1SI;`¤%üH5ùgW’Á·?)å…î¦Gtc¿>µfh¿ÑÅ®†Á áºu¡}®¿è:;å/ƊkÙZëÙ"aŒïԊº_A“æ%lN÷~§ámá&yªÎM3Ëx>Ÿ¼ôèV^ÛSçë~F”ö›ÜÎ[¿è,oUÙ9¶»!蛣&%H,âpÊX3¼ìŒ;“Ôm°Sm÷¥²|R_Λ6`é§k¡ÑýÄeñ¶¬¶´cÚd‡~ y#zý^ó¢è^=ißazw±ƛTD»<Ú¢1戬4ømQT×\l^]€oH³Öëé–}YíôÚ¨kېz—ˆAMŸ¯Ò>l¦J÷°Å*Å]Q¥G<ð6dÀãÿiCxBI¤b¹Ð†ø°™6¤‡-¶!XÜmȈچ hü·mê^."sÆÜëÃfÜÛÃ݋Å]áÞܽí!³‡ƒÙü3r¬µRD%4j!yÙ {LZ8„MT*Z²°›³°ƒ-[‰»Æ¯ƒsöià"YƒÞ}äĝ‘™†Q,Ö6'¢ƒ-‹ˆÄ]#"Âѧ1¬š~·pq´¨ÚÉ(\+8ÄA² ­BºœkRŸˆ™‹TŒFÖǍÓ¦p4Â$òh³·z-Ñä5…’AñA +åE7uÙ/ђ`Š›Â0QjëÃeG³MJ+@$,î´´nÊ󞔇Cƒ%;tVi./¬½„truŸ"ì×G@BFKJy°9¥lY)$R>¥»êÇų)gjMØBúú¨éôíQ‹é‹E]‘¾#xúx¼Tu“—pƒ/ŠÙkvTHD‹%‡áîʖœéÁæœé`ËÎDâ®q&Âs¦Ïc`Ãïín\Yu<ö÷e× js¯ùÛüÓY¤û÷›w·Qˆ¤ö·çš%'³?O{˜ñ¯Ó‚+¸8$I?“YCNþ֌ü*XÑendstream +endobj +3874 0 obj << +/Type /Page +/Contents 3875 0 R +/Resources 3873 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +3876 0 obj << +/D [3874 0 R /XYZ 71.731 729.2652 null] +>> endobj +3877 0 obj << +/D [3874 0 R /XYZ 71.731 718.3063 null] +>> endobj +3878 0 obj << +/D [3874 0 R /XYZ 71.731 708.2442 null] +>> endobj +3879 0 obj << +/D [3874 0 R /XYZ 71.731 706.9988 null] +>> endobj +3880 0 obj << +/D [3874 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3881 0 obj << +/D [3874 0 R /XYZ 129.5143 687.9203 null] +>> endobj +3882 0 obj << +/D [3874 0 R /XYZ 71.731 686.4807 null] +>> endobj +3883 0 obj << +/D [3874 0 R /XYZ 71.731 686.4807 null] +>> endobj +3884 0 obj << +/D [3874 0 R /XYZ 139.477 669.9875 null] +>> endobj +3885 0 obj << +/D [3874 0 R /XYZ 139.477 669.9875 null] +>> endobj +3886 0 obj << +/D [3874 0 R /XYZ 71.731 632.1295 null] +>> endobj +3887 0 obj << +/D [3874 0 R /XYZ 71.731 619.0785 null] +>> endobj +3888 0 obj << +/D [3874 0 R /XYZ 71.731 617.8332 null] +>> endobj +3889 0 obj << +/D [3874 0 R /XYZ 129.5143 598.7547 null] +>> endobj +798 0 obj << +/D [3874 0 R /XYZ 71.731 591.6165 null] +>> endobj +310 0 obj << +/D [3874 0 R /XYZ 221.9338 548.519 null] +>> endobj +3890 0 obj << +/D [3874 0 R /XYZ 71.731 528.3787 null] +>> endobj +3891 0 obj << +/D [3874 0 R /XYZ 161.0655 515.6423 null] +>> endobj +3892 0 obj << +/D [3874 0 R /XYZ 71.731 503.5228 null] +>> endobj +3893 0 obj << +/D [3874 0 R /XYZ 71.731 472.4932 null] +>> endobj +3894 0 obj << +/D [3874 0 R /XYZ 168.8063 461.1467 null] +>> endobj +3895 0 obj << +/D [3874 0 R /XYZ 71.731 449.0272 null] +>> endobj +3896 0 obj << +/D [3874 0 R /XYZ 71.731 394.3488 null] +>> endobj +3897 0 obj << +/D [3874 0 R /XYZ 181.5683 383.3385 null] +>> endobj +3898 0 obj << +/D [3874 0 R /XYZ 71.731 373.2763 null] +>> endobj +3899 0 obj << +/D [3874 0 R /XYZ 71.731 340.4987 null] +>> endobj +3900 0 obj << +/D [3874 0 R /XYZ 71.731 328.7433 null] +>> endobj +3901 0 obj << +/D [3874 0 R /XYZ 71.731 327.498 null] +>> endobj +3902 0 obj << +/D [3874 0 R /XYZ 129.5143 308.4194 null] +>> endobj +3903 0 obj << +/D [3874 0 R /XYZ 129.5143 308.4194 null] +>> endobj +3904 0 obj << +/D [3874 0 R /XYZ 71.731 306.9799 null] +>> endobj +3905 0 obj << +/D [3874 0 R /XYZ 71.731 306.9799 null] +>> endobj +3906 0 obj << +/D [3874 0 R /XYZ 139.477 290.4867 null] +>> endobj +3907 0 obj << +/D [3874 0 R /XYZ 139.477 290.4867 null] +>> endobj +3908 0 obj << +/D [3874 0 R /XYZ 76.7123 272.5539 null] +>> endobj +3909 0 obj << +/D [3874 0 R /XYZ 129.5143 254.6212 null] +>> endobj +3910 0 obj << +/D [3874 0 R /XYZ 129.5143 254.6212 null] +>> endobj +3911 0 obj << +/D [3874 0 R /XYZ 71.731 252.4643 null] +>> endobj +3912 0 obj << +/D [3874 0 R /XYZ 71.731 252.4643 null] +>> endobj +3913 0 obj << +/D [3874 0 R /XYZ 139.477 236.6884 null] +>> endobj +3914 0 obj << +/D [3874 0 R /XYZ 71.731 234.5316 null] +>> endobj +3915 0 obj << +/D [3874 0 R /XYZ 139.477 218.7557 null] +>> endobj +3916 0 obj << +/D [3874 0 R /XYZ 71.731 217.3161 null] +>> endobj +3917 0 obj << +/D [3874 0 R /XYZ 71.731 217.3161 null] +>> endobj +3918 0 obj << +/D [3874 0 R /XYZ 149.4396 200.8229 null] +>> endobj +3919 0 obj << +/D [3874 0 R /XYZ 149.4396 200.8229 null] +>> endobj +3920 0 obj << +/D [3874 0 R /XYZ 71.731 198.6661 null] +>> endobj +3921 0 obj << +/D [3874 0 R /XYZ 71.731 198.6661 null] +>> endobj +3922 0 obj << +/D [3874 0 R /XYZ 159.4023 182.8902 null] +>> endobj +3923 0 obj << +/D [3874 0 R /XYZ 71.731 180.7333 null] +>> endobj +3924 0 obj << +/D [3874 0 R /XYZ 159.4023 164.9574 null] +>> endobj +3925 0 obj << +/D [3874 0 R /XYZ 76.7123 147.0246 null] +>> endobj +3926 0 obj << +/D [3874 0 R /XYZ 149.4396 129.0919 null] +>> endobj +3927 0 obj << +/D [3874 0 R /XYZ 149.4396 129.0919 null] +>> endobj +3928 0 obj << +/D [3874 0 R /XYZ 71.731 126.9351 null] +>> endobj +3929 0 obj << +/D [3874 0 R /XYZ 71.731 126.9351 null] +>> endobj +3930 0 obj << +/D [3874 0 R /XYZ 159.4023 111.1591 null] +>> endobj +3931 0 obj << +/D [3874 0 R /XYZ 71.731 109.0023 null] +>> endobj +3873 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3934 0 obj << +/Length 1429 +/Filter /FlateDecode +>> +stream +xÚÅZ]o¤6}ϯà1‘×ß6}Û®Új«­´Ró¶©"2C2¨ˆÒmÿ}MÀÄ _§É¨Š403g¸‡ãs1eÔý±Ì0b„Ûðœp­x¶y8£Ù½ûê—36B.GÌeúñêìûŸÍr’k®³«»Läš(#3#8±ŠÙìjûõüã®xìÊöâ’+zÎÉ°ý²/ê²û\Üo?|ù4ìüVv»f{¸øãê׳Ÿ®¦úJ’[W$JRXK”Ù%§$çL &s"Qw.Ô!…™Î…ç™!¬?Ow.n‚õ's͹:&Ç#¹¢< èëo_xø_<^4eÊñ \Ìym[ü3HÖÜ ÛC×VõýwÛßwå~?ìnš‡‡¢ÞoºfؖLÿÝ¿”›§®>,î¦qªêCWì÷³Ž1™6Üm-<t¢µ*±tbY£Áªëû_-i›Y'±–³¡žñ(Û¶io6۞ÌÑ ¸±ãÚ˜>#`”QÇÕqZž¡ç ¤3±’ˆyCXļ 5/T7Á¼À¼3owj5jYÔý£ÀÏ6j½Ù<µ‡u…&šqƒiÀb{®1P7Ec€¤qÈã$ñe÷]N)1Ò`‰ "‰áQxbUSã˜ÆJb„<ÛrÌ͕Ø0–0­Í)bCY7å2‰ÅF‹Xz‚¡–†ê&XâXzÆãíþ}l+¯°ÇE&ºI -‰µ K‹“ÖÃpiº)Ò< iC'I‹×©=6¶rx”i$$BÔzHL(4$ ª !± ‡ÄŒGÝl˛j¸Ä=©ˆƒòy¡ÐV‡ª&´ú‚Üê3›¦¾»¹«öýÝ ßÝÌ'©aï{ó€»Õ‰^´ÑX̧†û¨›âS€äӐÇËò7䶬»ªÿ¤l×%£šp®ÑÖ`1É< — ¨›"À’,ä½Ið6Çd†¡ÒÌ!j½™'ÚÌPՄf^Ѐ›yÆ㹏Ëö¡:œJÐåÿÏlmì)n 0ʼnäkëñèC= +ÕMð(ÄðèŒÇlɺÙ=4Ûkª(s/l\¸ÎŇu’È\a½Âb:y®P7E'€¤SÈ[í¿Vº±érK´ Hÿ õöõ ´{’ Í{Ìîݐġyj7%аNV£ó÷|(`|êFZb™Î£æ˜ås9Š[BYžOGê j¹ú” Pð_¯Ž/endstream +endobj +3933 0 obj << +/Type /Page +/Contents 3934 0 R +/Resources 3932 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +3935 0 obj << +/D [3933 0 R /XYZ 71.731 729.2652 null] +>> endobj +3936 0 obj << +/D [3933 0 R /XYZ 159.4023 708.3437 null] +>> endobj +3937 0 obj << +/D [3933 0 R /XYZ 76.7123 690.4109 null] +>> endobj +3938 0 obj << +/D [3933 0 R /XYZ 149.4396 672.4782 null] +>> endobj +3939 0 obj << +/D [3933 0 R /XYZ 149.4396 672.4782 null] +>> endobj +3940 0 obj << +/D [3933 0 R /XYZ 71.731 670.3214 null] +>> endobj +3941 0 obj << +/D [3933 0 R /XYZ 71.731 670.3214 null] +>> endobj +3942 0 obj << +/D [3933 0 R /XYZ 159.4023 654.5454 null] +>> endobj +3943 0 obj << +/D [3933 0 R /XYZ 71.731 652.3886 null] +>> endobj +3944 0 obj << +/D [3933 0 R /XYZ 159.4023 636.6127 null] +>> endobj +3945 0 obj << +/D [3933 0 R /XYZ 76.7123 618.6799 null] +>> endobj +3946 0 obj << +/D [3933 0 R /XYZ 149.4396 600.7472 null] +>> endobj +3947 0 obj << +/D [3933 0 R /XYZ 149.4396 600.7472 null] +>> endobj +3948 0 obj << +/D [3933 0 R /XYZ 71.731 598.5904 null] +>> endobj +3949 0 obj << +/D [3933 0 R /XYZ 71.731 598.5904 null] +>> endobj +3950 0 obj << +/D [3933 0 R /XYZ 159.4023 582.8144 null] +>> endobj +3951 0 obj << +/D [3933 0 R /XYZ 71.731 580.6576 null] +>> endobj +3952 0 obj << +/D [3933 0 R /XYZ 159.4023 564.8817 null] +>> endobj +3953 0 obj << +/D [3933 0 R /XYZ 76.7123 546.9489 null] +>> endobj +3954 0 obj << +/D [3933 0 R /XYZ 149.4396 529.0162 null] +>> endobj +3955 0 obj << +/D [3933 0 R /XYZ 149.4396 529.0162 null] +>> endobj +3956 0 obj << +/D [3933 0 R /XYZ 71.731 526.8593 null] +>> endobj +3957 0 obj << +/D [3933 0 R /XYZ 71.731 526.8593 null] +>> endobj +3958 0 obj << +/D [3933 0 R /XYZ 159.4023 511.0834 null] +>> endobj +3959 0 obj << +/D [3933 0 R /XYZ 71.731 509.6439 null] +>> endobj +3960 0 obj << +/D [3933 0 R /XYZ 159.4023 493.1507 null] +>> endobj +3961 0 obj << +/D [3933 0 R /XYZ 76.7123 475.2179 null] +>> endobj +3962 0 obj << +/D [3933 0 R /XYZ 149.4396 457.2852 null] +>> endobj +3963 0 obj << +/D [3933 0 R /XYZ 149.4396 457.2852 null] +>> endobj +3964 0 obj << +/D [3933 0 R /XYZ 71.731 455.1283 null] +>> endobj +3965 0 obj << +/D [3933 0 R /XYZ 71.731 455.1283 null] +>> endobj +3966 0 obj << +/D [3933 0 R /XYZ 159.4023 439.3524 null] +>> endobj +3967 0 obj << +/D [3933 0 R /XYZ 71.731 437.1956 null] +>> endobj +3968 0 obj << +/D [3933 0 R /XYZ 159.4023 421.4197 null] +>> endobj +3969 0 obj << +/D [3933 0 R /XYZ 76.7123 403.4869 null] +>> endobj +3970 0 obj << +/D [3933 0 R /XYZ 149.4396 385.5542 null] +>> endobj +3971 0 obj << +/D [3933 0 R /XYZ 149.4396 385.5542 null] +>> endobj +3972 0 obj << +/D [3933 0 R /XYZ 71.731 383.3973 null] +>> endobj +3973 0 obj << +/D [3933 0 R /XYZ 71.731 383.3973 null] +>> endobj +3974 0 obj << +/D [3933 0 R /XYZ 159.4023 367.6214 null] +>> endobj +3975 0 obj << +/D [3933 0 R /XYZ 71.731 365.4646 null] +>> endobj +3976 0 obj << +/D [3933 0 R /XYZ 159.4023 349.6887 null] +>> endobj +3977 0 obj << +/D [3933 0 R /XYZ 76.7123 331.7559 null] +>> endobj +3978 0 obj << +/D [3933 0 R /XYZ 149.4396 313.8231 null] +>> endobj +3979 0 obj << +/D [3933 0 R /XYZ 149.4396 313.8231 null] +>> endobj +3980 0 obj << +/D [3933 0 R /XYZ 71.731 311.6663 null] +>> endobj +3981 0 obj << +/D [3933 0 R /XYZ 71.731 311.6663 null] +>> endobj +3982 0 obj << +/D [3933 0 R /XYZ 159.4023 295.8904 null] +>> endobj +3983 0 obj << +/D [3933 0 R /XYZ 71.731 293.7336 null] +>> endobj +3984 0 obj << +/D [3933 0 R /XYZ 159.4023 277.9576 null] +>> endobj +3985 0 obj << +/D [3933 0 R /XYZ 76.7123 260.0249 null] +>> endobj +3986 0 obj << +/D [3933 0 R /XYZ 149.4396 242.0921 null] +>> endobj +3987 0 obj << +/D [3933 0 R /XYZ 149.4396 242.0921 null] +>> endobj +3988 0 obj << +/D [3933 0 R /XYZ 71.731 239.9353 null] +>> endobj +3989 0 obj << +/D [3933 0 R /XYZ 71.731 239.9353 null] +>> endobj +3990 0 obj << +/D [3933 0 R /XYZ 159.4023 224.1594 null] +>> endobj +3991 0 obj << +/D [3933 0 R /XYZ 71.731 222.0026 null] +>> endobj +3992 0 obj << +/D [3933 0 R /XYZ 159.4023 206.2266 null] +>> endobj +3993 0 obj << +/D [3933 0 R /XYZ 76.7123 188.2939 null] +>> endobj +3994 0 obj << +/D [3933 0 R /XYZ 149.4396 170.3611 null] +>> endobj +3995 0 obj << +/D [3933 0 R /XYZ 149.4396 170.3611 null] +>> endobj +3996 0 obj << +/D [3933 0 R /XYZ 71.731 168.2043 null] +>> endobj +3997 0 obj << +/D [3933 0 R /XYZ 71.731 168.2043 null] +>> endobj +3998 0 obj << +/D [3933 0 R /XYZ 159.4023 152.4284 null] +>> endobj +3999 0 obj << +/D [3933 0 R /XYZ 71.731 150.2715 null] +>> endobj +4000 0 obj << +/D [3933 0 R /XYZ 159.4023 134.4956 null] +>> endobj +4001 0 obj << +/D [3933 0 R /XYZ 76.7123 116.5629 null] +>> endobj +4002 0 obj << +/D [3933 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4003 0 obj << +/D [3933 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4004 0 obj << +/D [3933 0 R /XYZ 71.731 96.4733 null] +>> endobj +4005 0 obj << +/D [3933 0 R /XYZ 71.731 96.4733 null] +>> endobj +3932 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4008 0 obj << +/Length 1686 +/Filter /FlateDecode +>> +stream +xÚÍZÛnÛF|÷WèѪíÞ/yKƒ¶H‘Aâ·¦0h‰¶ˆJ¤@Ruó÷]Š»Ô’:ÜeÛ XŒ=âÎ Ï^H²ÂöY)‚³Ô *]m7xõlÿôó qµÃ¬CÐ÷7ßÿÄðÊ #©\Ý?­˜‘H(¾RŒ"-ˆ^Ýo»}³ËŽm^ß­©À·õŸï÷Y™·ï²Çþ¿¯ß¿í~ÍÛ]µmî~¿ÿåæÇû¡¾` +m‹DI2­‘àlµ¦J"Ü n‰ÚkÁ1ÎÔp-Ô¬"ÝuÚkp¬»˜O”Š)9"2ÓUxB_wúyáá¿ò¸hJ„å)óhÚº(Ÿ¿ëEûï³¶¸£âöÏ;"nóþ·Ç¬ÝõGUÙ¶;÷§Çªjû£&¯ûï8^vyí@Ÿ0¦{w¼ÉÜ)Ý/¶UWî¥ÜWÙ6ß^)ⵓ#N°I8Â"N °¤PÝN@<'F<²ºÎ>;Ÿœ¨ß¶9Ì^†R+)¸½[‡½q uˆ¬™žkÖn5ÖJ‚Uçñߺ¦ÁôJ[g$'$äQVÛü¹®NLJ¢ï(?EœjfKuèW½vEéįœè€¿f6ñL"I¨J%>€ÅïaéÄu—$à%>äa/ßeû]Ñ´ci:Íû£³òM¼/Ê?î¾µaì³^ùÌÍ(ϳª¤2É>ÀbªzXZU îUª!8g_Khw mnÂ=!DÍ÷„•ì PÕ=áŠÜF<²ýKö¹y8·Y›/í ¶#ïsßd#}ÁãæR,$GZ“Toa‘°dŠ¡º R ñR<âá$p±}½ïÂøÒý°ª;ÝÚ6?Ûq>‹²i³ýþzlË/§Ó¿pbŸÊÍ.+Ÿ#“Á%2\§šF‹Éíai¹ºKäx@r‡<æCø¿:à;!k–ê&*ÒM<*ÝM€ªKºÉ”ÆL7 y<ûüá܁V"$bŒÉq+駆ÉNâ`sÉæ†!"pª‘„°H²X2ÙPÝɆxÉñÍ¡7»çúø Lìâ¤êç¸vn<«’ˆ•ºÿCXL%K«Ô]¢ÀR)ä‘Z|ü3áˆABØFÎ1C\Ëá×Ìþ-·3 jèÕþmtÏì¿n” Za‰åÉ"€Å”÷°´ò@Ý%ÊOyÀʇ4¬V- º5cc"ùýØTûK°‡'3/š]uÚoÇO0\ô­¯Ñ)“š3¨ˆú•(º@û) PúCñ\VuÞõŸ‡sk†Âo×ʆOLJñÞÏÛ¹-×üÝ®Pj›Ço|.%ˆ²S{aR£D‹¹ãai{€ºKü™ò€ +iäeöèÒ9mJvxÇÊÄ|yS•ϧ:k ÿø/ôÇ· l3zp8+· vI%Sƒ@‹Éíai¹ºKäžò€åilªòéá¼( Í¥B«¹q -÷6/Ûâ¼tŸ_Ƒ1,ÕïCXLdK‹ Ô]"ò”,rHã¬ï1¯EÓX ¦Ó½_!•Ž®¸Õv²Úšœ–—(„%I©{AÅÄu¨´¶×E—H;!+phªS½6Yõ•4±9þ·÷ò€ÙDº ²¸a*b˜G% Š.0lJ4,äðo_øJkÝ»X\#Mf6iýëZæúm-A5ÂÄNå<ª»)fß½ +þ ’ã‰ìendstream +endobj +4007 0 obj << +/Type /Page +/Contents 4008 0 R +/Resources 4006 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +4009 0 obj << +/D [4007 0 R /XYZ 71.731 729.2652 null] +>> endobj +4010 0 obj << +/D [4007 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4011 0 obj << +/D [4007 0 R /XYZ 71.731 706.1869 null] +>> endobj +4012 0 obj << +/D [4007 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4013 0 obj << +/D [4007 0 R /XYZ 76.7123 672.4782 null] +>> endobj +4014 0 obj << +/D [4007 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4015 0 obj << +/D [4007 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4016 0 obj << +/D [4007 0 R /XYZ 71.731 652.3886 null] +>> endobj +4017 0 obj << +/D [4007 0 R /XYZ 71.731 652.3886 null] +>> endobj +4018 0 obj << +/D [4007 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4019 0 obj << +/D [4007 0 R /XYZ 71.731 634.4559 null] +>> endobj +4020 0 obj << +/D [4007 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4021 0 obj << +/D [4007 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4022 0 obj << +/D [4007 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4023 0 obj << +/D [4007 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4024 0 obj << +/D [4007 0 R /XYZ 71.731 580.6576 null] +>> endobj +4025 0 obj << +/D [4007 0 R /XYZ 71.731 580.6576 null] +>> endobj +4026 0 obj << +/D [4007 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4027 0 obj << +/D [4007 0 R /XYZ 71.731 562.7248 null] +>> endobj +4028 0 obj << +/D [4007 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4029 0 obj << +/D [4007 0 R /XYZ 76.7123 529.0162 null] +>> endobj +4030 0 obj << +/D [4007 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4031 0 obj << +/D [4007 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4032 0 obj << +/D [4007 0 R /XYZ 71.731 508.9266 null] +>> endobj +4033 0 obj << +/D [4007 0 R /XYZ 71.731 508.9266 null] +>> endobj +4034 0 obj << +/D [4007 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4035 0 obj << +/D [4007 0 R /XYZ 71.731 490.9938 null] +>> endobj +4036 0 obj << +/D [4007 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4037 0 obj << +/D [4007 0 R /XYZ 76.7123 421.4197 null] +>> endobj +4038 0 obj << +/D [4007 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4039 0 obj << +/D [4007 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4040 0 obj << +/D [4007 0 R /XYZ 71.731 401.3301 null] +>> endobj +4041 0 obj << +/D [4007 0 R /XYZ 71.731 401.3301 null] +>> endobj +4042 0 obj << +/D [4007 0 R /XYZ 139.477 385.5542 null] +>> endobj +4043 0 obj << +/D [4007 0 R /XYZ 71.731 347.6961 null] +>> endobj +4044 0 obj << +/D [4007 0 R /XYZ 71.731 334.6452 null] +>> endobj +4045 0 obj << +/D [4007 0 R /XYZ 71.731 333.3998 null] +>> endobj +4046 0 obj << +/D [4007 0 R /XYZ 129.5143 314.3213 null] +>> endobj +4047 0 obj << +/D [4007 0 R /XYZ 71.731 312.1645 null] +>> endobj +4048 0 obj << +/D [4007 0 R /XYZ 71.731 312.1645 null] +>> endobj +4049 0 obj << +/D [4007 0 R /XYZ 139.477 296.3885 null] +>> endobj +4050 0 obj << +/D [4007 0 R /XYZ 139.477 296.3885 null] +>> endobj +4051 0 obj << +/D [4007 0 R /XYZ 71.731 294.2317 null] +>> endobj +4052 0 obj << +/D [4007 0 R /XYZ 139.477 278.4558 null] +>> endobj +4053 0 obj << +/D [4007 0 R /XYZ 139.477 278.4558 null] +>> endobj +4054 0 obj << +/D [4007 0 R /XYZ 71.731 276.2989 null] +>> endobj +4055 0 obj << +/D [4007 0 R /XYZ 139.477 260.523 null] +>> endobj +4056 0 obj << +/D [4007 0 R /XYZ 139.477 260.523 null] +>> endobj +4057 0 obj << +/D [4007 0 R /XYZ 71.731 258.3662 null] +>> endobj +4058 0 obj << +/D [4007 0 R /XYZ 139.477 242.5903 null] +>> endobj +4059 0 obj << +/D [4007 0 R /XYZ 139.477 242.5903 null] +>> endobj +4060 0 obj << +/D [4007 0 R /XYZ 71.731 240.4334 null] +>> endobj +4061 0 obj << +/D [4007 0 R /XYZ 139.477 224.6575 null] +>> endobj +4062 0 obj << +/D [4007 0 R /XYZ 139.477 224.6575 null] +>> endobj +4063 0 obj << +/D [4007 0 R /XYZ 71.731 223.218 null] +>> endobj +4064 0 obj << +/D [4007 0 R /XYZ 139.477 206.7248 null] +>> endobj +4065 0 obj << +/D [4007 0 R /XYZ 139.477 206.7248 null] +>> endobj +4066 0 obj << +/D [4007 0 R /XYZ 71.731 204.5679 null] +>> endobj +4067 0 obj << +/D [4007 0 R /XYZ 139.477 188.792 null] +>> endobj +4068 0 obj << +/D [4007 0 R /XYZ 139.477 188.792 null] +>> endobj +4069 0 obj << +/D [4007 0 R /XYZ 71.731 186.6352 null] +>> endobj +4070 0 obj << +/D [4007 0 R /XYZ 139.477 170.8593 null] +>> endobj +4071 0 obj << +/D [4007 0 R /XYZ 139.477 170.8593 null] +>> endobj +4072 0 obj << +/D [4007 0 R /XYZ 71.731 168.7024 null] +>> endobj +4073 0 obj << +/D [4007 0 R /XYZ 139.477 152.9265 null] +>> endobj +4074 0 obj << +/D [4007 0 R /XYZ 139.477 152.9265 null] +>> endobj +4075 0 obj << +/D [4007 0 R /XYZ 71.731 150.7697 null] +>> endobj +4076 0 obj << +/D [4007 0 R /XYZ 139.477 134.9938 null] +>> endobj +4077 0 obj << +/D [4007 0 R /XYZ 139.477 134.9938 null] +>> endobj +4078 0 obj << +/D [4007 0 R /XYZ 71.731 132.8369 null] +>> endobj +4079 0 obj << +/D [4007 0 R /XYZ 139.477 117.061 null] +>> endobj +4080 0 obj << +/D [4007 0 R /XYZ 139.477 117.061 null] +>> endobj +4081 0 obj << +/D [4007 0 R /XYZ 71.731 114.9042 null] +>> endobj +4082 0 obj << +/D [4007 0 R /XYZ 139.477 99.1283 null] +>> endobj +4083 0 obj << +/D [4007 0 R /XYZ 139.477 99.1283 null] +>> endobj +4084 0 obj << +/D [4007 0 R /XYZ 71.731 96.9714 null] +>> endobj +4006 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4087 0 obj << +/Length 1400 +/Filter /FlateDecode +>> +stream +xÚ­Y]o¤6}ϯàq"í¸¶1ö-m·«­Z)ZEڇ¦ŠÈàÉPg£üû^1c†ËG«U¤3ßããsï5 (ü±@2"C8ð”ð8âÁîõ†/ðÕçÖA¶fëƒ~~¸ù鷐)Icû LcIȐ“$bIðÿµù吵jn·<¢Nìñ¾Ì*¥ÿȞíåÝý{ò§Ò‡:ooÿ~øýæÓC? +%I2KRЄˆ8 ƒ-§$å,BQ †ˆ˜”|(BÙO†§$ÌL&Óãz˜™Í#çÑ5;Ó¥\¤? ‹{}¼ðpwy„I€¨±8óS"¤ÒÈÊ·ì½}:óL+ÃçLþ²’ÁA zF´â>×u©²êC§yyËèæÍüƒ¡ìg™Öêõ¨í…®í±¨Z•¥½x¤”—Êž«[m¾ß²h£ªº·ÇSµ;dՋÊGR9Qã”Áhº°D>lf‰zØâaqW,шºDû¢TO/M}:"ëÅ$ Ãx¸>­nŠê¥[žÝá¥9>҈2øÇìgµü­‚d²#¼$ŸŸI€j‚P™ÆÀ6!Ì䁛È]¸]&›ÏJú®*Ý"„„$ §2ؚԕ±MÝû¦Öµ~?ªý—Iw÷n9#1KìœÏ¬!të Ñì¤ƞÑOg7™â è¦4JŸšêü*óö<ù1Ý­‹néÚ¤øUµ»¦8ꢮÖþzŽæÜß¹8kšì½S|ß/Íi禴«+¬•½Î\–nçú¤‘¹ö1r{²?'Þ©ÔmW¿ìg²ùՍÒÕ®8K”_ [ s1Àj[3bë‹ ׍‘é¾i»e©;™¯ÇP#d$¨'Mñ|Ë¡"hÕU•ïÓ½fzwè¥Õå՝^‡·ÂÕ£gåÛFå1‘9_ykRÓўÆHøÁÚÏÑZéỲ´Yî|…šÝ®µs–¿ÕÚP÷Fø¬É^èjC J&ƒâ1„ '¦È¢•Ú¶êR¨SIm¡¾k²NsMŽq,èt™v7H «´ë> SšÁL)e£ê –ÿpµa1÷›lÙe¦ìøÈS£&»_ ¨Û”/t?6ÓýzØb÷Ãâ®è~#h÷и]ìfï~±€}ât÷»Cd}µÃ ö&§VMû–› “KÆõ`sÎu°eë"q×x÷šÇ„y}Ê´ó'Øiè~OàëKJvµ Dº[á굫ò]yŸ´/3û¶´yóasöu°eû"q×Øáq©·¯O©3ç§év9)OaG.Ó¥Œ÷a3’õ°EÉ°¸+$ÃxŒ%ÐÖG¿ñ_uðÕn0)H$Àí¨Bh룁®ÇšÔG0x ”1uZwטÆ0YЀ‡á!½Ùí=íê\á%‘'ÐÅ©:ÊˉÜM΅7…–…С¶> Ñt4Ú¤¨ÈAÀâN‹êîByx¦‹€åáÇdVöûk·gÏÕ´NaBâdêaô¢“›ÓÉÁ–uBâ®Ñ áéäóø/mt.Ñ(l(Íè|Òz¨™¤u¨å¤E¢®IÚkIëó°¶Àv1""I"“›²,0*_JY6cŶhE,î ++b<+xü¿FÚO)ŽI*Ò¥\õas9ز@HÜ5!<0|?lóÑ% ¡‰XHR5¤=j1I±¨+’tDOҏúùµÓOæM¶ †ä8‘ØÓÆbªv°I3²0ót°`F6gF[6#w˜}ƒÇ²o‡Ì½6Z¤²‹0|§¢î {9´7Ÿíá&Dâî‘@)ŽÓÙß$<Ìø'‰ˆKø–&ýHfNq<ùð_“±²0endstream +endobj +4086 0 obj << +/Type /Page +/Contents 4087 0 R +/Resources 4085 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 3872 0 R +>> endobj +4088 0 obj << +/D [4086 0 R /XYZ 71.731 729.2652 null] +>> endobj +4089 0 obj << +/D [4086 0 R /XYZ 139.477 708.3437 null] +>> endobj +4090 0 obj << +/D [4086 0 R /XYZ 139.477 708.3437 null] +>> endobj +4091 0 obj << +/D [4086 0 R /XYZ 71.731 706.1869 null] +>> endobj +4092 0 obj << +/D [4086 0 R /XYZ 139.477 690.4109 null] +>> endobj +4093 0 obj << +/D [4086 0 R /XYZ 139.477 690.4109 null] +>> endobj +799 0 obj << +/D [4086 0 R /XYZ 71.731 667.4969 null] +>> endobj +314 0 obj << +/D [4086 0 R /XYZ 199.9499 622.2426 null] +>> endobj +4094 0 obj << +/D [4086 0 R /XYZ 71.731 602.1022 null] +>> endobj +4095 0 obj << +/D [4086 0 R /XYZ 161.0655 589.3659 null] +>> endobj +4096 0 obj << +/D [4086 0 R /XYZ 71.731 577.2464 null] +>> endobj +4097 0 obj << +/D [4086 0 R /XYZ 71.731 546.2167 null] +>> endobj +4098 0 obj << +/D [4086 0 R /XYZ 168.8063 534.8702 null] +>> endobj +4099 0 obj << +/D [4086 0 R /XYZ 71.731 522.7507 null] +>> endobj +4100 0 obj << +/D [4086 0 R /XYZ 71.731 468.0723 null] +>> endobj +4101 0 obj << +/D [4086 0 R /XYZ 181.5683 457.062 null] +>> endobj +4102 0 obj << +/D [4086 0 R /XYZ 71.731 446.9998 null] +>> endobj +4103 0 obj << +/D [4086 0 R /XYZ 71.731 415.4282 null] +>> endobj +4104 0 obj << +/D [4086 0 R /XYZ 71.731 402.4668 null] +>> endobj +4105 0 obj << +/D [4086 0 R /XYZ 71.731 401.2215 null] +>> endobj +4106 0 obj << +/D [4086 0 R /XYZ 129.5143 382.143 null] +>> endobj +4107 0 obj << +/D [4086 0 R /XYZ 129.5143 382.143 null] +>> endobj +4108 0 obj << +/D [4086 0 R /XYZ 71.731 380.7034 null] +>> endobj +4109 0 obj << +/D [4086 0 R /XYZ 71.731 380.7034 null] +>> endobj +4110 0 obj << +/D [4086 0 R /XYZ 139.477 364.2102 null] +>> endobj +4111 0 obj << +/D [4086 0 R /XYZ 139.477 364.2102 null] +>> endobj +4112 0 obj << +/D [4086 0 R /XYZ 76.7123 346.2774 null] +>> endobj +4113 0 obj << +/D [4086 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4114 0 obj << +/D [4086 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4115 0 obj << +/D [4086 0 R /XYZ 71.731 326.1879 null] +>> endobj +4116 0 obj << +/D [4086 0 R /XYZ 71.731 326.1879 null] +>> endobj +4117 0 obj << +/D [4086 0 R /XYZ 139.477 310.4119 null] +>> endobj +4118 0 obj << +/D [4086 0 R /XYZ 71.731 308.2551 null] +>> endobj +4119 0 obj << +/D [4086 0 R /XYZ 139.477 292.4792 null] +>> endobj +4120 0 obj << +/D [4086 0 R /XYZ 71.731 291.0396 null] +>> endobj +4121 0 obj << +/D [4086 0 R /XYZ 71.731 291.0396 null] +>> endobj +4122 0 obj << +/D [4086 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4123 0 obj << +/D [4086 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4124 0 obj << +/D [4086 0 R /XYZ 71.731 272.3896 null] +>> endobj +4125 0 obj << +/D [4086 0 R /XYZ 71.731 272.3896 null] +>> endobj +4126 0 obj << +/D [4086 0 R /XYZ 159.4023 256.6137 null] +>> endobj +4127 0 obj << +/D [4086 0 R /XYZ 71.731 255.1741 null] +>> endobj +4128 0 obj << +/D [4086 0 R /XYZ 159.4023 238.6809 null] +>> endobj +4129 0 obj << +/D [4086 0 R /XYZ 76.7123 220.7482 null] +>> endobj +4130 0 obj << +/D [4086 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4131 0 obj << +/D [4086 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4132 0 obj << +/D [4086 0 R /XYZ 71.731 200.6586 null] +>> endobj +4133 0 obj << +/D [4086 0 R /XYZ 71.731 200.6586 null] +>> endobj +4134 0 obj << +/D [4086 0 R /XYZ 159.4023 184.8827 null] +>> endobj +4135 0 obj << +/D [4086 0 R /XYZ 71.731 183.4431 null] +>> endobj +4136 0 obj << +/D [4086 0 R /XYZ 159.4023 166.9499 null] +>> endobj +4137 0 obj << +/D [4086 0 R /XYZ 76.7123 149.0172 null] +>> endobj +4138 0 obj << +/D [4086 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4139 0 obj << +/D [4086 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4140 0 obj << +/D [4086 0 R /XYZ 71.731 128.9276 null] +>> endobj +4141 0 obj << +/D [4086 0 R /XYZ 71.731 128.9276 null] +>> endobj +4142 0 obj << +/D [4086 0 R /XYZ 159.4023 113.1517 null] +>> endobj +4143 0 obj << +/D [4086 0 R /XYZ 71.731 110.9948 null] +>> endobj +4085 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4146 0 obj << +/Length 1392 +/Filter /FlateDecode +>> +stream +xÚÍZ]oä4}ï¯Èc+1Æß±yƒå«hA+T‹ªt&Ó L“ÑLŠÔCìԞ\ÇÖ²h¥M:=ñ=>>÷ÄI‡Øü#EIPÉ́jD¥ Åúé +æWß\ YYÌÊ}qwõé× iIeq·-˜–H”¼(EJUÜm~½~³«}}¼YQ¯)ïöU[÷o«‡ñÇÏßݎ'ß×ý®Ûœn~»ûîê«»©¾`%ÒÊY$ɔB‚³bE1ҔD¸FÜ5sÁ +1ÎÊi.T%"Ã<Í\&Ü&óžRqNŽ‚´À´ðtuϏ¯<ÜU WM‰0<0e!êx¬^Fɺíx<õǦ}üdüáç]ՏgýË¡ÝÃïõÚþ¶9YÔΝÕ7T\ÿyCÄuÝZPµ>ۚ‹LÙì™áW–…,©9*xehå£ÍÏNJJ΍xª”`Õ¸äîª9 ¦ +e$—°bf61WZpãeÁöa ž`ICu3< ñ<ð0Ó·n½Ý¯5ï1¦.'œDƒèãÙ±>ºöÔ<ìí[§làX;bc¯¯Úáó—¸ÌL"Ih™’Ùƒ-Éì`i™º92< ™}°ñþ3å]‹cŒJ^¦âÂC-ąC¥ã¨šç4"qáóXWû=”#L¨ƒ;™s²PæžKx*0|؂“'XÒÉPÝ 'C<'<‚;ܛA߄?#w5çÔv½ÞLÒªcõd6*§¸Ä’#¥H*,|ؒÄ––¨›#1À’Øç‘ÚWü‹ªÛæfLJ‰L…ŠńJT5#(f4à xôÍSÿtO!AX±dDx°%ÿ:XÚ¿@Ýÿ< ÿú<^ïl_V}íîDkÌAikÑi{¼«£ûÞ¾ëþ°.ÝWëz2°í‹zݵëô“±µè§n±Cºõ.º\3DN¥‰[X –\ ¨nÆj@<€Õx,n=þ· d‹Q%Áã£âÁ3¡’ÁUÍž 8x“º] ?Ҙe§Ò üQóÇü‡˜ ©üñaKŽw°´ãº9Žx@Ž÷yäì¬GÝ/ùTÃ)Aœèd´x°%¡,-4P7Gh€$´ÏãŸj.§½ít¦‚'RÃGÅScB%Sªš‘3pj<žêÓ©z¬á× æ~‰‡&K$)I%‡[0ôKª›ahˆ`è€G°Íþ¶y܍g{ϋv罩Oëcsègd'bì%^TUs"•Jń[RÕÁÒªusTx@ªú©baãk!ŵÕþmsêÃ¥ùû™kï^ºô[™¡Ø|ڎ‘HHS”Û¡V> pñl´¨Ǖ嬗Û]òð\l£> G¡ýRWH©¿wáaæ_»Ô> endobj +4147 0 obj << +/D [4145 0 R /XYZ 71.731 729.2652 null] +>> endobj +4148 0 obj << +/D [4145 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4149 0 obj << +/D [4145 0 R /XYZ 76.7123 690.4109 null] +>> endobj +4150 0 obj << +/D [4145 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4151 0 obj << +/D [4145 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4152 0 obj << +/D [4145 0 R /XYZ 71.731 670.3214 null] +>> endobj +4153 0 obj << +/D [4145 0 R /XYZ 71.731 670.3214 null] +>> endobj +4154 0 obj << +/D [4145 0 R /XYZ 159.4023 654.5454 null] +>> endobj +4155 0 obj << +/D [4145 0 R /XYZ 71.731 652.3886 null] +>> endobj +4156 0 obj << +/D [4145 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4157 0 obj << +/D [4145 0 R /XYZ 76.7123 618.6799 null] +>> endobj +4158 0 obj << +/D [4145 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4159 0 obj << +/D [4145 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4160 0 obj << +/D [4145 0 R /XYZ 71.731 598.5904 null] +>> endobj +4161 0 obj << +/D [4145 0 R /XYZ 71.731 598.5904 null] +>> endobj +4162 0 obj << +/D [4145 0 R /XYZ 159.4023 582.8144 null] +>> endobj +4163 0 obj << +/D [4145 0 R /XYZ 71.731 580.6576 null] +>> endobj +4164 0 obj << +/D [4145 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4165 0 obj << +/D [4145 0 R /XYZ 76.7123 546.9489 null] +>> endobj +4166 0 obj << +/D [4145 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4167 0 obj << +/D [4145 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4168 0 obj << +/D [4145 0 R /XYZ 71.731 526.8593 null] +>> endobj +4169 0 obj << +/D [4145 0 R /XYZ 71.731 526.8593 null] +>> endobj +4170 0 obj << +/D [4145 0 R /XYZ 159.4023 511.0834 null] +>> endobj +4171 0 obj << +/D [4145 0 R /XYZ 71.731 508.9266 null] +>> endobj +4172 0 obj << +/D [4145 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4173 0 obj << +/D [4145 0 R /XYZ 76.7123 475.2179 null] +>> endobj +4174 0 obj << +/D [4145 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4175 0 obj << +/D [4145 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4176 0 obj << +/D [4145 0 R /XYZ 71.731 455.1283 null] +>> endobj +4177 0 obj << +/D [4145 0 R /XYZ 71.731 455.1283 null] +>> endobj +4178 0 obj << +/D [4145 0 R /XYZ 159.4023 439.3524 null] +>> endobj +4179 0 obj << +/D [4145 0 R /XYZ 71.731 437.1956 null] +>> endobj +4180 0 obj << +/D [4145 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4181 0 obj << +/D [4145 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4182 0 obj << +/D [4145 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4183 0 obj << +/D [4145 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4184 0 obj << +/D [4145 0 R /XYZ 71.731 383.3973 null] +>> endobj +4185 0 obj << +/D [4145 0 R /XYZ 71.731 383.3973 null] +>> endobj +4186 0 obj << +/D [4145 0 R /XYZ 159.4023 367.6214 null] +>> endobj +4187 0 obj << +/D [4145 0 R /XYZ 71.731 365.4646 null] +>> endobj +4188 0 obj << +/D [4145 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4189 0 obj << +/D [4145 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4190 0 obj << +/D [4145 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4191 0 obj << +/D [4145 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4192 0 obj << +/D [4145 0 R /XYZ 71.731 311.6663 null] +>> endobj +4193 0 obj << +/D [4145 0 R /XYZ 71.731 311.6663 null] +>> endobj +4194 0 obj << +/D [4145 0 R /XYZ 159.4023 295.8904 null] +>> endobj +4195 0 obj << +/D [4145 0 R /XYZ 71.731 294.4508 null] +>> endobj +4196 0 obj << +/D [4145 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4197 0 obj << +/D [4145 0 R /XYZ 76.7123 260.0249 null] +>> endobj +4198 0 obj << +/D [4145 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4199 0 obj << +/D [4145 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4200 0 obj << +/D [4145 0 R /XYZ 71.731 239.9353 null] +>> endobj +4201 0 obj << +/D [4145 0 R /XYZ 71.731 239.9353 null] +>> endobj +4202 0 obj << +/D [4145 0 R /XYZ 159.4023 224.1594 null] +>> endobj +4203 0 obj << +/D [4145 0 R /XYZ 71.731 222.0026 null] +>> endobj +4204 0 obj << +/D [4145 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4205 0 obj << +/D [4145 0 R /XYZ 76.7123 152.4284 null] +>> endobj +4206 0 obj << +/D [4145 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4207 0 obj << +/D [4145 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4208 0 obj << +/D [4145 0 R /XYZ 71.731 132.3388 null] +>> endobj +4209 0 obj << +/D [4145 0 R /XYZ 71.731 132.3388 null] +>> endobj +4210 0 obj << +/D [4145 0 R /XYZ 139.477 116.5629 null] +>> endobj +4144 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4213 0 obj << +/Length 1546 +/Filter /FlateDecode +>> +stream +xÚµYߏœ6~¿¿b÷¤¬‹ &o×$M¯m¢StU+5Չï- [`Ýß1¶YæG¢{XàÆ3ß7ž± Þxð‡7!F¡?$B$`d“œn¼Í3üëý Ö&;m³³~|¼ùá'ßÛD( +H°yäq!šß⽺½{¸WDs,ÓúöïÇ_nÞ=vñ™¢ˆCYÕ&‰,˜Gˆ1nB#Ÿúa‹ó“h.UQ¿Æî¬î‰ç;cwV;ÛÌĆ'¡‡{±;3û3!l—‡‰3îð÷ŠÃŒrâ°8†¦~G\Uñ‹R¢<¨ßº©.I3g†à“‡ÌMŠ±ÚÙfWR°Ì©c6I +d–GhäŒ;MŠ5Æáó RÚâð#Dðã_òæ))S!Á hd"œs#M_+ʲ¢y¥®Þ}½Ål+ŠFÝn±·•îÔ­ñé&–fFù±–Ù±Æl™XGÜ5Äq¸‰µaˆ¯@ÌS–:h¥ q®¥5Ká2ûìyÊÌ$Ÿ>E09–è¼Zͱ©­–É]Ã儛J C¹ÿG$ÍSórvåh€Q³¼O&Lë¬xÖ|þqŒ5•­‹ÞüW¾5ѵ¶:š+qKض¯F|Ï0Lˁ„yä/éa™Í b̖qÄ]#ɇ[†%SÝlMÝPÕ7`[-ËýÛÚ¥E=äY¤êÉþe^ž' +5‹8",˜(áÚhg[9”úš‚bYZgÔi!Ì(' ««Q€«>Ž¬˜î_,€~á…4´¬f²ÐX-&¡#节p¦ ¡€þ2Q_=ļ0šª¯÷vAíe t©®*QŸË¢Îö¹~p(+GÒi™òùË´”"ÊøRY°Íæ1fˊ8⮑dˆÃ­‰ #‰óÜ¡¡Èó¢h¦H¿‘¨Ÿ˜ùF„"É/©¬Êíí9®â¬Ìëi5¬ç [ZÜÙfsj³e5qר1ÄáVÆÑd'±Vëüx7Âä³®½­#­A×Lb²K6eùEːljèÒ‹¤,R-e ºiG¿¼ÿS»<—ÉqZ8ØØ°ˆ,-m³9áŒÙ²pŽ¸k„âp gÃ8Cޖ…»º1 ›?hÿ»º)§ß³¾ÑȃÅ؂,W£Q´Ñ¢$ãˆ+ pÊa8‰ºŽŸ…»Ñ@O¦3eíçìù¨®r‹X]éRQ'Uvn2£ŠQjí§c+$($áR_±Íæ¸7fËì;â®áˆÃ­€ £ºÅÌ©AZ^ ³µŸôØÅ+‰e…]j¶Ù±Æl™XGÜ5Äq¸‰µaȆýTÄNj™‡"ï;5mÞ9D³àcŽè]»€#pÚ–Y ÏÕB¾}/š_ÛñmríÝ몴µárwÕ怦hâ¬èVL©€ÛÜ8ٗ—fô¦µ>à¼?̐ÐÛL×g‘¨n”ÖÙ2\˽$2R2$PEÁ>©5ï&íâÞùÞ¤WeÛ@Rïo‰·½4¢sTä/ã÷WONq“;Þº…PŸo™™{aç„H$R¥cÇñÆ›#˜Œå=aç`™ˆ +üP5¿»ôd–m'#Ï¿QêŒ3G’|,‹],‡×ƒñW̖'€Ÿ™‹œ{ß +—ã•Sè.ϕCÁ§2õÚé߂Öüž3}q©{󻉩…ûðÔ ìA¾ˆÜ™¹5™>Ç˜¢ˆBMŸ?·ÍfNã;³ÅÓxWܧñ#ýÆc`‡¬¥›<ê90‰_ >¦Èñrþ'ñu¥,/ÕôÁs‚ûŃRËj¦Ÿ«Åv›A8›¹áQŸ˜Ügr çÖªwBOʝÞÔu3aø¦úåˆã šýÆfٌ?±1Âáu`kj¬$րO~0süöBh¢endstream +endobj +4212 0 obj << +/Type /Page +/Contents 4213 0 R +/Resources 4211 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4214 0 obj << +/D [4212 0 R /XYZ 71.731 729.2652 null] +>> endobj +4215 0 obj << +/D [4212 0 R /XYZ 71.731 718.3063 null] +>> endobj +4216 0 obj << +/D [4212 0 R /XYZ 71.731 708.2442 null] +>> endobj +4217 0 obj << +/D [4212 0 R /XYZ 71.731 706.9988 null] +>> endobj +4218 0 obj << +/D [4212 0 R /XYZ 129.5143 687.9203 null] +>> endobj +4219 0 obj << +/D [4212 0 R /XYZ 71.731 685.7635 null] +>> endobj +4220 0 obj << +/D [4212 0 R /XYZ 71.731 685.7635 null] +>> endobj +4221 0 obj << +/D [4212 0 R /XYZ 139.477 669.9875 null] +>> endobj +4222 0 obj << +/D [4212 0 R /XYZ 139.477 669.9875 null] +>> endobj +4223 0 obj << +/D [4212 0 R /XYZ 71.731 668.548 null] +>> endobj +4224 0 obj << +/D [4212 0 R /XYZ 139.477 652.0548 null] +>> endobj +4225 0 obj << +/D [4212 0 R /XYZ 139.477 652.0548 null] +>> endobj +4226 0 obj << +/D [4212 0 R /XYZ 71.731 650.6152 null] +>> endobj +4227 0 obj << +/D [4212 0 R /XYZ 139.477 634.122 null] +>> endobj +4228 0 obj << +/D [4212 0 R /XYZ 139.477 634.122 null] +>> endobj +4229 0 obj << +/D [4212 0 R /XYZ 71.731 631.9652 null] +>> endobj +4230 0 obj << +/D [4212 0 R /XYZ 139.477 616.1893 null] +>> endobj +4231 0 obj << +/D [4212 0 R /XYZ 139.477 616.1893 null] +>> endobj +4232 0 obj << +/D [4212 0 R /XYZ 71.731 614.0324 null] +>> endobj +4233 0 obj << +/D [4212 0 R /XYZ 71.731 614.0324 null] +>> endobj +4234 0 obj << +/D [4212 0 R /XYZ 149.4396 598.2565 null] +>> endobj +4235 0 obj << +/D [4212 0 R /XYZ 76.7123 580.3238 null] +>> endobj +4236 0 obj << +/D [4212 0 R /XYZ 139.477 562.391 null] +>> endobj +4237 0 obj << +/D [4212 0 R /XYZ 139.477 562.391 null] +>> endobj +4238 0 obj << +/D [4212 0 R /XYZ 71.731 560.2342 null] +>> endobj +4239 0 obj << +/D [4212 0 R /XYZ 139.477 544.4583 null] +>> endobj +4240 0 obj << +/D [4212 0 R /XYZ 139.477 544.4583 null] +>> endobj +4241 0 obj << +/D [4212 0 R /XYZ 71.731 542.3014 null] +>> endobj +4242 0 obj << +/D [4212 0 R /XYZ 139.477 526.5255 null] +>> endobj +4243 0 obj << +/D [4212 0 R /XYZ 139.477 526.5255 null] +>> endobj +4244 0 obj << +/D [4212 0 R /XYZ 71.731 524.3687 null] +>> endobj +4245 0 obj << +/D [4212 0 R /XYZ 139.477 508.5928 null] +>> endobj +4246 0 obj << +/D [4212 0 R /XYZ 139.477 508.5928 null] +>> endobj +4247 0 obj << +/D [4212 0 R /XYZ 71.731 506.4359 null] +>> endobj +4248 0 obj << +/D [4212 0 R /XYZ 139.477 490.66 null] +>> endobj +4249 0 obj << +/D [4212 0 R /XYZ 139.477 490.66 null] +>> endobj +4250 0 obj << +/D [4212 0 R /XYZ 71.731 488.5032 null] +>> endobj +4251 0 obj << +/D [4212 0 R /XYZ 139.477 472.7273 null] +>> endobj +4252 0 obj << +/D [4212 0 R /XYZ 139.477 472.7273 null] +>> endobj +4253 0 obj << +/D [4212 0 R /XYZ 71.731 471.2877 null] +>> endobj +4254 0 obj << +/D [4212 0 R /XYZ 139.477 454.7945 null] +>> endobj +4255 0 obj << +/D [4212 0 R /XYZ 139.477 454.7945 null] +>> endobj +800 0 obj << +/D [4212 0 R /XYZ 71.731 431.8804 null] +>> endobj +318 0 obj << +/D [4212 0 R /XYZ 184.1294 386.6261 null] +>> endobj +4256 0 obj << +/D [4212 0 R /XYZ 71.731 363.1373 null] +>> endobj +4257 0 obj << +/D [4212 0 R /XYZ 161.0655 353.7494 null] +>> endobj +4258 0 obj << +/D [4212 0 R /XYZ 71.731 341.6299 null] +>> endobj +4259 0 obj << +/D [4212 0 R /XYZ 71.731 310.2641 null] +>> endobj +4260 0 obj << +/D [4212 0 R /XYZ 168.8063 299.2538 null] +>> endobj +4261 0 obj << +/D [4212 0 R /XYZ 71.731 272.1903 null] +>> endobj +4262 0 obj << +/D [4212 0 R /XYZ 71.731 232.4559 null] +>> endobj +4263 0 obj << +/D [4212 0 R /XYZ 71.731 200.8743 null] +>> endobj +4264 0 obj << +/D [4212 0 R /XYZ 181.5683 189.864 null] +>> endobj +4265 0 obj << +/D [4212 0 R /XYZ 71.731 179.8018 null] +>> endobj +4266 0 obj << +/D [4212 0 R /XYZ 71.731 146.3786 null] +>> endobj +4267 0 obj << +/D [4212 0 R /XYZ 71.731 135.2688 null] +>> endobj +4268 0 obj << +/D [4212 0 R /XYZ 71.731 134.0235 null] +>> endobj +4269 0 obj << +/D [4212 0 R /XYZ 129.5143 114.9449 null] +>> endobj +4270 0 obj << +/D [4212 0 R /XYZ 129.5143 114.9449 null] +>> endobj +4271 0 obj << +/D [4212 0 R /XYZ 71.731 113.5054 null] +>> endobj +4272 0 obj << +/D [4212 0 R /XYZ 71.731 113.5054 null] +>> endobj +4273 0 obj << +/D [4212 0 R /XYZ 139.477 97.0122 null] +>> endobj +4274 0 obj << +/D [4212 0 R /XYZ 139.477 97.0122 null] +>> endobj +4211 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4278 0 obj << +/Length 1287 +/Filter /FlateDecode +>> +stream +xÚµYÛnã6|ÏWèÑj–<¼ˆÜ·Ý¢[´Ýyð>u‹ÀI”XX×d¥Eþ¾T$ʔuxIá @ä(#Íh4£‹+¨ýaEÉHÉí %¡¸ûûŠö_¿\±²0+ôi}õãgN CŒU¬ +n‘¥(JDK¦‹õýŸ‹Ÿ¶›§¶j–+t¤_^ï6ûªý²¹íÿüxýkÿᏪÝîË¿Ö¿]ý¼ù%/‰Ñ–$*R0M§¦XqmùGQŒ"%+‹•2”fñî`À–§¤¬;˜7º£ù ÏÕ1ƒÂß¡ã=_žt¸­æ:¸.´5U‰Wö%³3Ññ½z¹y¨w±VÍ«ôÓyŠ(f•ÓWè‡ÞÚMÓl^ú‡‡~YïÛaÅpzŽmó|×ΏÏ)(ˆRã•;ùʺMŽÇÁ‚¾ÚQå ûê¶BuœLbÜØÿ–S“f†M¥ RHû1€V> +±ã|_A7³(ÊvÃm…ÊðÜV†íïT‡=öz~_‚\TK&ƒ=õ}µoëo”BA<0¶‘ª4& Œƒ¥ƒðæсƗÑ7f0écÛ6õíèâ¹­úUA®¥h„(%¥(!!‰C¥#„°æDè\ÆôB5FÈ×ñTUÍMwµªï‘+•ê¬/ùôJ5»,e¶ÒñKmo?LjéP+†˜:Û[ÐUiý‘PÞ°«n+T‡—:iuPàS§b~î:yhªúq߯ø¾d4ÜÔÞÏÁßî܄]T‚hmï" =XÌEK»ˆð済èÀ\ôuà¹z/c‡–J{9£L%ï£ÂQÉÆc¬ŸÉÀ?Ñѕ½}yªº I,¦u·—Ðzÿ˜lü ƕ1B5O–ÞƒÅâê`é¸"¼9qEt`qõuô„nÈÎrÔa8a’¦ÊìÃ"¤;o†;˜ĝ‰Ž`dÞdØP,!KZ&Jê£Â%Qɒb¬%ÉÀK:ÑaKŠôÓ¾òðRð÷è§ýE¸„T?}X,–N ›“@D–@_G=_ÚW×PƉëN¼í*Òv‡J·aÍiû¹Œ@Û}Á7e.  —­:I´¡©ªû°HJGX2¥oFJ1HJ':þïWXãA•¥e·§3a‘‹Yä`i‹Þ‹˜E¾Žh‘ßæÚP-@¨DM}T¸¦#*YSŒ5£¦3xM':^¿ÕB{*(‘T_¸¦ ì{ŽIÖԃÅ2è`é "¼9Dt`ôuœw]½Ï¨"*Yd3ÑÁÒ&"¼9&":0}Ñ"_ÚW7c\a¤J Û|XdØ6’Ã6Œ7cØ6ӁÛ&:šª}nö7uµëg“gg£› æؼMÉÅàÿ—úØNÏÍë5´Ûãä¬ôdÁ‘ +cŠH©‘Š‹ŒTFXr¤‚ñfŒT0ó‘ÊDþEÂ0šh¦LtHíaæ3j šPf̸§ŽR™àÄ!üŠÛ¸endstream +endobj +4277 0 obj << +/Type /Page +/Contents 4278 0 R +/Resources 4276 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4279 0 obj << +/D [4277 0 R /XYZ 71.731 729.2652 null] +>> endobj +4280 0 obj << +/D [4277 0 R /XYZ 76.7123 708.3437 null] +>> endobj +4281 0 obj << +/D [4277 0 R /XYZ 129.5143 690.4109 null] +>> endobj +4282 0 obj << +/D [4277 0 R /XYZ 129.5143 690.4109 null] +>> endobj +4283 0 obj << +/D [4277 0 R /XYZ 71.731 688.2541 null] +>> endobj +4284 0 obj << +/D [4277 0 R /XYZ 71.731 688.2541 null] +>> endobj +4285 0 obj << +/D [4277 0 R /XYZ 139.477 672.4782 null] +>> endobj +4286 0 obj << +/D [4277 0 R /XYZ 71.731 670.3214 null] +>> endobj +4287 0 obj << +/D [4277 0 R /XYZ 71.731 670.3214 null] +>> endobj +4288 0 obj << +/D [4277 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4289 0 obj << +/D [4277 0 R /XYZ 76.7123 636.6127 null] +>> endobj +4290 0 obj << +/D [4277 0 R /XYZ 139.477 618.6799 null] +>> endobj +4291 0 obj << +/D [4277 0 R /XYZ 71.731 617.2404 null] +>> endobj +4292 0 obj << +/D [4277 0 R /XYZ 71.731 617.2404 null] +>> endobj +4293 0 obj << +/D [4277 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4294 0 obj << +/D [4277 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4295 0 obj << +/D [4277 0 R /XYZ 71.731 598.5904 null] +>> endobj +4296 0 obj << +/D [4277 0 R /XYZ 71.731 598.5904 null] +>> endobj +4297 0 obj << +/D [4277 0 R /XYZ 159.4023 582.8144 null] +>> endobj +4298 0 obj << +/D [4277 0 R /XYZ 71.731 580.6576 null] +>> endobj +4299 0 obj << +/D [4277 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4300 0 obj << +/D [4277 0 R /XYZ 76.7123 546.9489 null] +>> endobj +4301 0 obj << +/D [4277 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4302 0 obj << +/D [4277 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4303 0 obj << +/D [4277 0 R /XYZ 71.731 526.8593 null] +>> endobj +4304 0 obj << +/D [4277 0 R /XYZ 71.731 526.8593 null] +>> endobj +4305 0 obj << +/D [4277 0 R /XYZ 159.4023 511.0834 null] +>> endobj +4306 0 obj << +/D [4277 0 R /XYZ 71.731 508.9266 null] +>> endobj +4307 0 obj << +/D [4277 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4308 0 obj << +/D [4277 0 R /XYZ 76.7123 475.2179 null] +>> endobj +4309 0 obj << +/D [4277 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4310 0 obj << +/D [4277 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4311 0 obj << +/D [4277 0 R /XYZ 71.731 455.1283 null] +>> endobj +4312 0 obj << +/D [4277 0 R /XYZ 71.731 455.1283 null] +>> endobj +4313 0 obj << +/D [4277 0 R /XYZ 159.4023 439.3524 null] +>> endobj +4314 0 obj << +/D [4277 0 R /XYZ 71.731 437.1956 null] +>> endobj +4315 0 obj << +/D [4277 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4316 0 obj << +/D [4277 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4317 0 obj << +/D [4277 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4318 0 obj << +/D [4277 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4319 0 obj << +/D [4277 0 R /XYZ 71.731 383.3973 null] +>> endobj +4320 0 obj << +/D [4277 0 R /XYZ 71.731 383.3973 null] +>> endobj +4321 0 obj << +/D [4277 0 R /XYZ 159.4023 367.6214 null] +>> endobj +4322 0 obj << +/D [4277 0 R /XYZ 71.731 365.4646 null] +>> endobj +4323 0 obj << +/D [4277 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4324 0 obj << +/D [4277 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4325 0 obj << +/D [4277 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4326 0 obj << +/D [4277 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4327 0 obj << +/D [4277 0 R /XYZ 71.731 311.6663 null] +>> endobj +4328 0 obj << +/D [4277 0 R /XYZ 71.731 311.6663 null] +>> endobj +4329 0 obj << +/D [4277 0 R /XYZ 159.4023 295.8904 null] +>> endobj +4330 0 obj << +/D [4277 0 R /XYZ 71.731 293.7336 null] +>> endobj +4331 0 obj << +/D [4277 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4332 0 obj << +/D [4277 0 R /XYZ 76.7123 260.0249 null] +>> endobj +4333 0 obj << +/D [4277 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4334 0 obj << +/D [4277 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4335 0 obj << +/D [4277 0 R /XYZ 71.731 239.9353 null] +>> endobj +4336 0 obj << +/D [4277 0 R /XYZ 71.731 239.9353 null] +>> endobj +4337 0 obj << +/D [4277 0 R /XYZ 159.4023 224.1594 null] +>> endobj +4338 0 obj << +/D [4277 0 R /XYZ 71.731 222.0026 null] +>> endobj +4339 0 obj << +/D [4277 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4340 0 obj << +/D [4277 0 R /XYZ 76.7123 152.4284 null] +>> endobj +4341 0 obj << +/D [4277 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4342 0 obj << +/D [4277 0 R /XYZ 129.5143 134.4956 null] +>> endobj +4343 0 obj << +/D [4277 0 R /XYZ 71.731 132.3388 null] +>> endobj +4344 0 obj << +/D [4277 0 R /XYZ 71.731 132.3388 null] +>> endobj +4345 0 obj << +/D [4277 0 R /XYZ 139.477 116.5629 null] +>> endobj +4276 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4348 0 obj << +/Length 1077 +/Filter /FlateDecode +>> +stream +xÚµ˜]œ6†ï÷Wp9#í¸þÀìݦm¢6´Š¦WÝjEfœFÀ4Úßc0Œó‘‹h/`™×>/‡ãcH€á’ Éà@#D§Ááõ'øéñ’Õì\Ñ»ýÝ/ï" *‚ý׀Eq’Q¤8QÁþøÏæ×s|©t±ÝQŽ75ǧ4ÎtõWü¥ù÷ñéæ䓮Îù±Üþ»ÿóî÷}Ÿ3‰"AfMvª±M96 ‰çD+ÄB&kŸŸuu-²òa»S ÓS̼±;ÕΕµ±áŠÄ¤»“™ØϔòQ\JÁ¡Þ¸ÃãÍG;ÊëÃa„8 YßG\ñ[ó$ò¯Í±¬Šë¡›k‡ ˜SIî‡Òªv®ì…˜œê™ie“P ³0 #oÜi(í¨±¦PDXû` +¥ìÛ¸h]¼$GãdÀ0ĈcA £{hx%Yuos\·Y_åÍñû99œí¥sR6g߶oô–ð%ÿE§yv*§‘s¸ª%äŽly+[FùЇ¹kã›~{©Þ.Úǜ#N#Úg9šd'‹ýã–òÏv&?L"xg–XÞTs(­j™ä8è~ŽŽÀè!ˆIpûÿ3âô:ƒ‘DTĖ8:²9­l™¤'î”C~–®‹.Ê<óN`µ‘bªü]þœBÀ#…(Kµ×•Í@ïd‹Ð}qW@ùðBïÙ0…ÀKœqÈrE¦ˆ289ê¬Jž1¦ð(&y*ŒeK…Õ•ÍñleË<=q×ðúðótmÔkÙ$Taf–t +ê{Ã3/trÊ&¶G¹¾WÍѶáÆ%¢„×.k¬úEÓ¯ "TXǦÐmšNQªÍ]}4!š8û­À¨ç¥oiHQ ˜é>¥hºº§"¯r³úïq[Oz>Lz°Ña2ZÙ¡¿ì³Ìxó®b“—®òZL¯òTJ2. +¤+›)l±@úâ®(#ÞÙ³ñ\š=¨o™H„°½îœ=X_›ézë?¼f~بš 3…dä)ñu;QŠ¢Pª—ܑÍ%x+[NpOÜ5 îñáىö|øw¢+ºüÑ +Ã%’Š±1mŸ3,0ámù¤Ë265ó´Ý™ÊùSW—:Øi¸¢Ü·ÉRÿøbÖдê͢ΊúËv r”ýJ*¤ˆˆf?ä8šñwNԑ(êf2Ö%žü*ã ø?Òû> endobj +4349 0 obj << +/D [4347 0 R /XYZ 71.731 729.2652 null] +>> endobj +4350 0 obj << +/D [4347 0 R /XYZ 71.731 718.3063 null] +>> endobj +4351 0 obj << +/D [4347 0 R /XYZ 71.731 708.2442 null] +>> endobj +4352 0 obj << +/D [4347 0 R /XYZ 71.731 706.9988 null] +>> endobj +4353 0 obj << +/D [4347 0 R /XYZ 129.5143 687.9203 null] +>> endobj +4354 0 obj << +/D [4347 0 R /XYZ 71.731 685.7635 null] +>> endobj +4355 0 obj << +/D [4347 0 R /XYZ 71.731 685.7635 null] +>> endobj +4356 0 obj << +/D [4347 0 R /XYZ 139.477 669.9875 null] +>> endobj +4357 0 obj << +/D [4347 0 R /XYZ 139.477 669.9875 null] +>> endobj +4358 0 obj << +/D [4347 0 R /XYZ 71.731 667.8307 null] +>> endobj +4359 0 obj << +/D [4347 0 R /XYZ 139.477 652.0548 null] +>> endobj +4360 0 obj << +/D [4347 0 R /XYZ 139.477 652.0548 null] +>> endobj +4361 0 obj << +/D [4347 0 R /XYZ 71.731 649.898 null] +>> endobj +4362 0 obj << +/D [4347 0 R /XYZ 139.477 634.122 null] +>> endobj +4363 0 obj << +/D [4347 0 R /XYZ 139.477 634.122 null] +>> endobj +4364 0 obj << +/D [4347 0 R /XYZ 71.731 631.9652 null] +>> endobj +4365 0 obj << +/D [4347 0 R /XYZ 139.477 616.1893 null] +>> endobj +4366 0 obj << +/D [4347 0 R /XYZ 139.477 616.1893 null] +>> endobj +4367 0 obj << +/D [4347 0 R /XYZ 71.731 614.0324 null] +>> endobj +4368 0 obj << +/D [4347 0 R /XYZ 139.477 598.2565 null] +>> endobj +4369 0 obj << +/D [4347 0 R /XYZ 139.477 598.2565 null] +>> endobj +4370 0 obj << +/D [4347 0 R /XYZ 71.731 596.0997 null] +>> endobj +4371 0 obj << +/D [4347 0 R /XYZ 139.477 580.3238 null] +>> endobj +4372 0 obj << +/D [4347 0 R /XYZ 139.477 580.3238 null] +>> endobj +801 0 obj << +/D [4347 0 R /XYZ 71.731 557.4097 null] +>> endobj +322 0 obj << +/D [4347 0 R /XYZ 223.2771 512.1554 null] +>> endobj +4373 0 obj << +/D [4347 0 R /XYZ 71.731 488.6666 null] +>> endobj +4374 0 obj << +/D [4347 0 R /XYZ 161.0655 479.2787 null] +>> endobj +4375 0 obj << +/D [4347 0 R /XYZ 71.731 467.1592 null] +>> endobj +4376 0 obj << +/D [4347 0 R /XYZ 71.731 435.7933 null] +>> endobj +4377 0 obj << +/D [4347 0 R /XYZ 168.8063 424.783 null] +>> endobj +4378 0 obj << +/D [4347 0 R /XYZ 71.731 412.6636 null] +>> endobj +4379 0 obj << +/D [4347 0 R /XYZ 71.731 381.2977 null] +>> endobj +4380 0 obj << +/D [4347 0 R /XYZ 181.5683 370.2874 null] +>> endobj +4381 0 obj << +/D [4347 0 R /XYZ 71.731 360.2252 null] +>> endobj +4382 0 obj << +/D [4347 0 R /XYZ 71.731 326.802 null] +>> endobj +4383 0 obj << +/D [4347 0 R /XYZ 71.731 315.6922 null] +>> endobj +4384 0 obj << +/D [4347 0 R /XYZ 71.731 314.4469 null] +>> endobj +4385 0 obj << +/D [4347 0 R /XYZ 129.5143 295.3684 null] +>> endobj +4386 0 obj << +/D [4347 0 R /XYZ 129.5143 295.3684 null] +>> endobj +4387 0 obj << +/D [4347 0 R /XYZ 71.731 293.9288 null] +>> endobj +4388 0 obj << +/D [4347 0 R /XYZ 71.731 293.9288 null] +>> endobj +4389 0 obj << +/D [4347 0 R /XYZ 139.477 277.4356 null] +>> endobj +4390 0 obj << +/D [4347 0 R /XYZ 139.477 277.4356 null] +>> endobj +4391 0 obj << +/D [4347 0 R /XYZ 71.731 239.5776 null] +>> endobj +4392 0 obj << +/D [4347 0 R /XYZ 71.731 226.5266 null] +>> endobj +4393 0 obj << +/D [4347 0 R /XYZ 71.731 225.2813 null] +>> endobj +4394 0 obj << +/D [4347 0 R /XYZ 129.5143 206.2027 null] +>> endobj +802 0 obj << +/D [4347 0 R /XYZ 71.731 199.0646 null] +>> endobj +326 0 obj << +/D [4347 0 R /XYZ 225.7901 155.9671 null] +>> endobj +4395 0 obj << +/D [4347 0 R /XYZ 71.731 132.2115 null] +>> endobj +4396 0 obj << +/D [4347 0 R /XYZ 161.0655 123.0904 null] +>> endobj +4397 0 obj << +/D [4347 0 R /XYZ 71.731 110.9709 null] +>> endobj +4346 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4400 0 obj << +/Length 1331 +/Filter /FlateDecode +>> +stream +xÚµY]o£8}ï¯Èc"5^`ƒç­û©YÍJ£QßvV#’¸-+B* ªúï×›^Â5¦£õhŽ}OαÃVÔþ±UÊH*ì…k•ä«ýñ†®íGÜ0Ù:Ì‚~¾¿ùéwAWšhÅÕêþa%´"2MV©à$“,[Ýþ^ÿò”?·¦Þl¹¤kNúëç2¯Lû)ßõwŸ?ö7™öéth6ÿÜÿyóÛýP_Š”èÌ™%9 ¦4¹4ÓDJ–®Rš‘ˆôÂóWÓìëâ¹-NՇ®þ¥Qf©¤käšo9#ŠeúÒä‹iÏuÕôÔóÊ]ë:íoOýµiëó¾u¸ý©jó¢*ªÇþù`ìcé;ٝÎm{4M“?šþ¡5Çç2oMãôûø0úö•R^¶¶ö²®ûæÙì‹îSsè†heÛ2;©Äeå‰F놅õ­¦<Æ +M’4Ó¸³ºô+¢®TD%x­¯ +¼¾ˆ¬Ç¾»>²§þznL퉦„)¦#÷°¨{±º Ü;ၻwÄÃÍÓߊË|9U:ÍT•Æ—Åaöëƒ[BNRN8×,âa›ñð‹z«»ÀðqÑêtëwH`•„+mX3™®U,÷6§™‡Å5Cê.Ñ áhiŒgI¸W¸ZÛ'T]gB¡„Âr -D!]÷Ô'av—š*´jXßjJcÙÄÒ°ûð1Så»Ò`³bB‰¤Ù8ª»“Ýø­ß°q›úÒã&ôXfoh`.ô¨-„!ºNz ++­D’r´nXXß +åŒ'-Ê؇“ͦÛÁíq•(%‰ÎXL%›SÉÃâ*!u—¨„ðÀT‚<ÂÞùá\ЄJˆ<Zˆ +‡v@EC‹U]Ú <´#~-Þ¹›‰æÖÁB†‰í[ëXl!lƐ,jH¬îCb<CŽx|çŠ:Œ‰gÄþ¬‰EÂæò°¸BHÝ% +!<0… ÿoâ"Æ5'š²H\!*׍+VuA\'4ð¸Žx 'È"+‰´ØVûÓǖÉba…°+°¨±º ¬ˆñ@¬8âö”WG¦„ + *„Í©ãaquºKÔAx`ê@ï +jP0,Îì°i,¤5RŠ‡©º$¤×4!…<šóî_Óÿ¾œn„m“² r*i4£6çB‹»©»Ä…̅GØrÍùxÌë× 8,“DP‹(„͈3À¢â`uˆƒñ@ÄñxWDCzù#!ÆD÷Ž%v< +a3L,zÀ„Õ]pÀ4á0x¸3õ‡âr¢Žœ/q’ðL`çKJ®¨ŸŠæêýÂøŒÞæõÅ®‡íÞw%ɘҳ¯ÄfúFLÚ=ev×éQã”ßo!ÿë&?Ðendstream +endobj +4399 0 obj << +/Type /Page +/Contents 4400 0 R +/Resources 4398 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4401 0 obj << +/D [4399 0 R /XYZ 71.731 729.2652 null] +>> endobj +4402 0 obj << +/D [4399 0 R /XYZ 71.731 718.3063 null] +>> endobj +4403 0 obj << +/D [4399 0 R /XYZ 168.8063 708.3437 null] +>> endobj +4404 0 obj << +/D [4399 0 R /XYZ 71.731 696.2242 null] +>> endobj +4405 0 obj << +/D [4399 0 R /XYZ 71.731 631.741 null] +>> endobj +4406 0 obj << +/D [4399 0 R /XYZ 181.5683 618.8792 null] +>> endobj +4407 0 obj << +/D [4399 0 R /XYZ 71.731 608.817 null] +>> endobj +4408 0 obj << +/D [4399 0 R /XYZ 71.731 576.0394 null] +>> endobj +4409 0 obj << +/D [4399 0 R /XYZ 71.731 564.284 null] +>> endobj +4410 0 obj << +/D [4399 0 R /XYZ 71.731 563.0387 null] +>> endobj +4411 0 obj << +/D [4399 0 R /XYZ 129.5143 543.9601 null] +>> endobj +4412 0 obj << +/D [4399 0 R /XYZ 129.5143 543.9601 null] +>> endobj +4413 0 obj << +/D [4399 0 R /XYZ 71.731 542.5206 null] +>> endobj +4414 0 obj << +/D [4399 0 R /XYZ 71.731 542.5206 null] +>> endobj +4415 0 obj << +/D [4399 0 R /XYZ 139.477 526.0274 null] +>> endobj +4416 0 obj << +/D [4399 0 R /XYZ 139.477 526.0274 null] +>> endobj +4417 0 obj << +/D [4399 0 R /XYZ 76.7123 508.0946 null] +>> endobj +4418 0 obj << +/D [4399 0 R /XYZ 129.5143 490.1619 null] +>> endobj +4419 0 obj << +/D [4399 0 R /XYZ 129.5143 490.1619 null] +>> endobj +4420 0 obj << +/D [4399 0 R /XYZ 71.731 488.0051 null] +>> endobj +4421 0 obj << +/D [4399 0 R /XYZ 71.731 488.0051 null] +>> endobj +4422 0 obj << +/D [4399 0 R /XYZ 139.477 472.2291 null] +>> endobj +4423 0 obj << +/D [4399 0 R /XYZ 71.731 470.0723 null] +>> endobj +4424 0 obj << +/D [4399 0 R /XYZ 139.477 454.2964 null] +>> endobj +4425 0 obj << +/D [4399 0 R /XYZ 71.731 452.8568 null] +>> endobj +4426 0 obj << +/D [4399 0 R /XYZ 71.731 452.8568 null] +>> endobj +4427 0 obj << +/D [4399 0 R /XYZ 149.4396 436.3636 null] +>> endobj +4428 0 obj << +/D [4399 0 R /XYZ 149.4396 436.3636 null] +>> endobj +4429 0 obj << +/D [4399 0 R /XYZ 71.731 434.2068 null] +>> endobj +4430 0 obj << +/D [4399 0 R /XYZ 71.731 434.2068 null] +>> endobj +4431 0 obj << +/D [4399 0 R /XYZ 159.4023 418.4309 null] +>> endobj +4432 0 obj << +/D [4399 0 R /XYZ 71.731 416.2741 null] +>> endobj +4433 0 obj << +/D [4399 0 R /XYZ 159.4023 400.4981 null] +>> endobj +4434 0 obj << +/D [4399 0 R /XYZ 76.7123 382.5654 null] +>> endobj +4435 0 obj << +/D [4399 0 R /XYZ 149.4396 364.6326 null] +>> endobj +4436 0 obj << +/D [4399 0 R /XYZ 149.4396 364.6326 null] +>> endobj +4437 0 obj << +/D [4399 0 R /XYZ 71.731 362.4758 null] +>> endobj +4438 0 obj << +/D [4399 0 R /XYZ 71.731 362.4758 null] +>> endobj +4439 0 obj << +/D [4399 0 R /XYZ 159.4023 346.6999 null] +>> endobj +4440 0 obj << +/D [4399 0 R /XYZ 71.731 344.543 null] +>> endobj +4441 0 obj << +/D [4399 0 R /XYZ 159.4023 328.7671 null] +>> endobj +4442 0 obj << +/D [4399 0 R /XYZ 76.7123 310.8344 null] +>> endobj +4443 0 obj << +/D [4399 0 R /XYZ 149.4396 292.9016 null] +>> endobj +4444 0 obj << +/D [4399 0 R /XYZ 149.4396 292.9016 null] +>> endobj +4445 0 obj << +/D [4399 0 R /XYZ 71.731 290.7448 null] +>> endobj +4446 0 obj << +/D [4399 0 R /XYZ 71.731 290.7448 null] +>> endobj +4447 0 obj << +/D [4399 0 R /XYZ 159.4023 274.9689 null] +>> endobj +4448 0 obj << +/D [4399 0 R /XYZ 71.731 272.812 null] +>> endobj +4449 0 obj << +/D [4399 0 R /XYZ 159.4023 257.0361 null] +>> endobj +4450 0 obj << +/D [4399 0 R /XYZ 76.7123 239.1034 null] +>> endobj +4451 0 obj << +/D [4399 0 R /XYZ 149.4396 221.1706 null] +>> endobj +4452 0 obj << +/D [4399 0 R /XYZ 149.4396 221.1706 null] +>> endobj +4453 0 obj << +/D [4399 0 R /XYZ 71.731 219.0138 null] +>> endobj +4454 0 obj << +/D [4399 0 R /XYZ 71.731 219.0138 null] +>> endobj +4455 0 obj << +/D [4399 0 R /XYZ 159.4023 203.2379 null] +>> endobj +4456 0 obj << +/D [4399 0 R /XYZ 71.731 201.081 null] +>> endobj +4457 0 obj << +/D [4399 0 R /XYZ 159.4023 185.3051 null] +>> endobj +4458 0 obj << +/D [4399 0 R /XYZ 76.7123 131.5068 null] +>> endobj +4459 0 obj << +/D [4399 0 R /XYZ 129.5143 113.5741 null] +>> endobj +4460 0 obj << +/D [4399 0 R /XYZ 129.5143 113.5741 null] +>> endobj +4461 0 obj << +/D [4399 0 R /XYZ 71.731 111.4173 null] +>> endobj +4462 0 obj << +/D [4399 0 R /XYZ 71.731 111.4173 null] +>> endobj +4398 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4465 0 obj << +/Length 936 +/Filter /FlateDecode +>> +stream +xڝWQo£8~ï¯à±‘ŠÏll÷­·{·ÚÕ^­òv=hâmÙ%Ùªÿþ†ˆ  SŒÛÏ3ß|όY@ñ‡’áš@, Øîohð‚útÃZHØbBôûææ·?#h¢cˆƒÍ÷ Ò1’2¢SÁf÷÷í‡×äP›r‚ ·@ìºÎ’ÜÔ_“g»}X¶™úµØU«6_nþØôþE$‰Vèd’$§ŠðXEA”h`‹bhB0Ž(‰øˆG²t kÅ`z\k¢y—ì†KëÀ5Øù½\Ï<ºS^gQY¤ —rH£ªË4iˆ !ĂÀx%Šjq|3õ±Ì«ûWD Ád£¤ŒQåרC….쬑–Ôj4²vU#dÏÀë÷ºFÝ)/G£î5à‘”eònóªønWÔí¸­Çäºã“ŠÍ$Ž ›Hœ6›8>¿ gÄ#RBQbî&΀†É“çÌì&rJ•}4¸{«×sQd&ÉïºÛYUɋ±›´²«cѯ)e8æ猦lJÓ6¯©ÇïM/yø5uiì­,ÿ¦>YELbŽ5q «½¾^Uw&¯Ó'JKæ5I…ŠHÄÐþ´¤.lBÒ6+©ÏïIG<¼’hÔfȒÚøòT– +êZò‹ I­æÄt`Sbv°y1=~—ˆyÉÃ/¦K£:>ÿ0¶êï<ãzqrVÇý>)ß[C‹$ØeOŽCF%Q7a¬‹?™"EÓò¥ºýdêGS¿­«qùÓiô—œÐPl=Í!cÛïÖeQõûÁÜ÷'ÎA·gC`$fJŸtÞØÀÛ)Š'*hr¬_qeÿagÎõÿÑTÛ2=Ôi‘/eÐv`ë3±K–Võ°!%Yf?~­@àkÈi›ŸÉÛ_ìmd)ã‡,+“o¦µø +y5KÞrOvû´+ú‡´ý8VX’8½½ë.Ööµý̋YÊk½bg™`<¦œ˜O@Qó™ùąMÌ'=lv>ñù]0ŸŒx ¯eW<š$ôÈœP6º’8¶Ü] ËÍù¦[l“&/]ä±¼^ï Â5›k.l¢Þõ°Ùzçó» Þxxë݀ÆêboüÿêÇYíík¿èïƒÀeóêÙ à|ÙÎ4ŽBÍ à.l"Á{Øl‚ûü.HpÏ>àáÀÏJ?ú‹Ü%õöñÉQ,֓ïS3~ž +Px³´î-5%\}lzþ |iendstream +endobj +4464 0 obj << +/Type /Page +/Contents 4465 0 R +/Resources 4463 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4275 0 R +>> endobj +4466 0 obj << +/D [4464 0 R /XYZ 71.731 729.2652 null] +>> endobj +4467 0 obj << +/D [4464 0 R /XYZ 71.731 741.2204 null] +>> endobj +4468 0 obj << +/D [4464 0 R /XYZ 139.477 708.3437 null] +>> endobj +4469 0 obj << +/D [4464 0 R /XYZ 71.731 670.4857 null] +>> endobj +4470 0 obj << +/D [4464 0 R /XYZ 71.731 657.4347 null] +>> endobj +4471 0 obj << +/D [4464 0 R /XYZ 71.731 656.1894 null] +>> endobj +4472 0 obj << +/D [4464 0 R /XYZ 129.5143 637.1108 null] +>> endobj +4473 0 obj << +/D [4464 0 R /XYZ 71.731 634.954 null] +>> endobj +4474 0 obj << +/D [4464 0 R /XYZ 71.731 634.954 null] +>> endobj +4475 0 obj << +/D [4464 0 R /XYZ 139.477 619.1781 null] +>> endobj +4476 0 obj << +/D [4464 0 R /XYZ 139.477 619.1781 null] +>> endobj +4477 0 obj << +/D [4464 0 R /XYZ 71.731 617.0212 null] +>> endobj +4478 0 obj << +/D [4464 0 R /XYZ 139.477 601.2453 null] +>> endobj +4479 0 obj << +/D [4464 0 R /XYZ 139.477 601.2453 null] +>> endobj +4480 0 obj << +/D [4464 0 R /XYZ 71.731 599.0885 null] +>> endobj +4481 0 obj << +/D [4464 0 R /XYZ 139.477 583.3126 null] +>> endobj +4482 0 obj << +/D [4464 0 R /XYZ 139.477 583.3126 null] +>> endobj +4483 0 obj << +/D [4464 0 R /XYZ 71.731 581.1557 null] +>> endobj +4484 0 obj << +/D [4464 0 R /XYZ 139.477 565.3798 null] +>> endobj +4485 0 obj << +/D [4464 0 R /XYZ 139.477 565.3798 null] +>> endobj +803 0 obj << +/D [4464 0 R /XYZ 71.731 542.4657 null] +>> endobj +330 0 obj << +/D [4464 0 R /XYZ 281.8432 497.2114 null] +>> endobj +4486 0 obj << +/D [4464 0 R /XYZ 71.731 477.0711 null] +>> endobj +4487 0 obj << +/D [4464 0 R /XYZ 161.0655 464.3347 null] +>> endobj +4488 0 obj << +/D [4464 0 R /XYZ 71.731 452.2152 null] +>> endobj +4489 0 obj << +/D [4464 0 R /XYZ 71.731 421.1856 null] +>> endobj +4490 0 obj << +/D [4464 0 R /XYZ 168.8063 409.8391 null] +>> endobj +4491 0 obj << +/D [4464 0 R /XYZ 71.731 397.7196 null] +>> endobj +4492 0 obj << +/D [4464 0 R /XYZ 71.731 368.2053 null] +>> endobj +4493 0 obj << +/D [4464 0 R /XYZ 181.5683 355.3434 null] +>> endobj +4494 0 obj << +/D [4464 0 R /XYZ 71.731 345.2813 null] +>> endobj +4495 0 obj << +/D [4464 0 R /XYZ 71.731 311.8581 null] +>> endobj +4496 0 obj << +/D [4464 0 R /XYZ 71.731 300.7483 null] +>> endobj +4497 0 obj << +/D [4464 0 R /XYZ 71.731 299.5029 null] +>> endobj +4498 0 obj << +/D [4464 0 R /XYZ 129.5143 280.4244 null] +>> endobj +4499 0 obj << +/D [4464 0 R /XYZ 129.5143 280.4244 null] +>> endobj +4500 0 obj << +/D [4464 0 R /XYZ 71.731 278.9848 null] +>> endobj +4501 0 obj << +/D [4464 0 R /XYZ 71.731 278.9848 null] +>> endobj +4502 0 obj << +/D [4464 0 R /XYZ 139.477 262.4916 null] +>> endobj +4503 0 obj << +/D [4464 0 R /XYZ 139.477 262.4916 null] +>> endobj +4504 0 obj << +/D [4464 0 R /XYZ 71.731 224.6336 null] +>> endobj +4505 0 obj << +/D [4464 0 R /XYZ 71.731 211.5826 null] +>> endobj +4506 0 obj << +/D [4464 0 R /XYZ 71.731 210.3373 null] +>> endobj +4507 0 obj << +/D [4464 0 R /XYZ 129.5143 191.2588 null] +>> endobj +804 0 obj << +/D [4464 0 R /XYZ 71.731 184.1206 null] +>> endobj +4463 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4510 0 obj << +/Length 920 +/Filter /FlateDecode +>> +stream +xÚ½W]oã(}ï¯ðc"Õ,`c`Þº_Õ¬vGÕ(oÓÕȍic­cG6Þªÿ~/;8&i4Úåˆ/÷ž{8\€D~$âñ*͍¶û½À§ûâLbgûF?on~ú=Á‘D2£Y´yŽ™!Æӈ' FD´)¾¬~Ùå­ÚuL^Qdۇ*¯•þ3²Ã»‡¶ó—Ò»¦èÖoþ¸ùm3Åg GR@‹ '«%LJ"Â%,58nj1C<å|€IÏ 8.V÷JRúuMñªiÿÙ¬3¼z;¨x’^Â)G‚bÅ&ažYOm£ 3>L3ÌȆÐnnL ʈÃ„1qñ„‹70òˆÎ{½ƒ–Ä£CÁ¯ªÛ¶åA—M}-†ÏJ÷míb涩ÊNÛ^óì>T•íü»¦ Fea‡õ¾ýäߡkñÞUUc¾*çïsS©î]èy^ìËúÖÎ;”®Ów ¸¯ÜP«íÎuë¦P×âzXȲÍ÷ +lñøª$D"ƏRa‚Bªœ¬bß̪RF XŽ‰A°ôf > endobj +4511 0 obj << +/D [4509 0 R /XYZ 71.731 729.2652 null] +>> endobj +334 0 obj << +/D [4509 0 R /XYZ 259.7903 705.7477 null] +>> endobj +4512 0 obj << +/D [4509 0 R /XYZ 71.731 682.2589 null] +>> endobj +4513 0 obj << +/D [4509 0 R /XYZ 161.0655 672.871 null] +>> endobj +4514 0 obj << +/D [4509 0 R /XYZ 71.731 660.7515 null] +>> endobj +4515 0 obj << +/D [4509 0 R /XYZ 71.731 574.89 null] +>> endobj +4516 0 obj << +/D [4509 0 R /XYZ 181.5683 563.8797 null] +>> endobj +4517 0 obj << +/D [4509 0 R /XYZ 71.731 553.8175 null] +>> endobj +4518 0 obj << +/D [4509 0 R /XYZ 71.731 520.3944 null] +>> endobj +4519 0 obj << +/D [4509 0 R /XYZ 71.731 509.2845 null] +>> endobj +4520 0 obj << +/D [4509 0 R /XYZ 71.731 508.0392 null] +>> endobj +4521 0 obj << +/D [4509 0 R /XYZ 129.5143 488.9607 null] +>> endobj +4522 0 obj << +/D [4509 0 R /XYZ 129.5143 488.9607 null] +>> endobj +4523 0 obj << +/D [4509 0 R /XYZ 71.731 487.5211 null] +>> endobj +4524 0 obj << +/D [4509 0 R /XYZ 71.731 487.5211 null] +>> endobj +4525 0 obj << +/D [4509 0 R /XYZ 139.477 471.0279 null] +>> endobj +4526 0 obj << +/D [4509 0 R /XYZ 139.477 471.0279 null] +>> endobj +4527 0 obj << +/D [4509 0 R /XYZ 71.731 433.1699 null] +>> endobj +4528 0 obj << +/D [4509 0 R /XYZ 71.731 420.1189 null] +>> endobj +4529 0 obj << +/D [4509 0 R /XYZ 71.731 418.8736 null] +>> endobj +4530 0 obj << +/D [4509 0 R /XYZ 129.5143 399.795 null] +>> endobj +805 0 obj << +/D [4509 0 R /XYZ 71.731 392.6569 null] +>> endobj +338 0 obj << +/D [4509 0 R /XYZ 247.4128 349.5594 null] +>> endobj +4531 0 obj << +/D [4509 0 R /XYZ 71.731 326.0706 null] +>> endobj +4532 0 obj << +/D [4509 0 R /XYZ 161.0655 316.6827 null] +>> endobj +4533 0 obj << +/D [4509 0 R /XYZ 71.731 304.5632 null] +>> endobj +4534 0 obj << +/D [4509 0 R /XYZ 71.731 273.1973 null] +>> endobj +4535 0 obj << +/D [4509 0 R /XYZ 168.8063 262.1871 null] +>> endobj +4536 0 obj << +/D [4509 0 R /XYZ 71.731 250.0676 null] +>> endobj +4537 0 obj << +/D [4509 0 R /XYZ 71.731 195.3891 null] +>> endobj +4538 0 obj << +/D [4509 0 R /XYZ 181.5683 184.3788 null] +>> endobj +4539 0 obj << +/D [4509 0 R /XYZ 71.731 174.3167 null] +>> endobj +4540 0 obj << +/D [4509 0 R /XYZ 71.731 140.8935 null] +>> endobj +4541 0 obj << +/D [4509 0 R /XYZ 71.731 129.7837 null] +>> endobj +4542 0 obj << +/D [4509 0 R /XYZ 71.731 128.5383 null] +>> endobj +4543 0 obj << +/D [4509 0 R /XYZ 129.5143 109.4598 null] +>> endobj +4544 0 obj << +/D [4509 0 R /XYZ 129.5143 109.4598 null] +>> endobj +4545 0 obj << +/D [4509 0 R /XYZ 71.731 108.0202 null] +>> endobj +4546 0 obj << +/D [4509 0 R /XYZ 71.731 108.0202 null] +>> endobj +4508 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4549 0 obj << +/Length 1345 +/Filter /FlateDecode +>> +stream +xÚµYˎÛ6ÝÏWh9Ô,Iñ™]´E‹´ïš"plyÆÀŒ=°åEÿ¾Ôƒò¥uùðEv|ù³iŸ›ÓÃ?Ë?î~YNõe­‰5®H’¤ †eêjÁ)±œIÅÜ’ ‡Ò_‹ZO“á¶Ò„uu“™p¬›ÍWÎå5;æ¦K¹°Ð×½þ¼ððWÍyÔ¦2NT%zµ%BëÆûsû4hՑé™_nƒTD wh}7({j»ýãO£ÞîòfßîÖ«vwØ¿½ ÃõßÛÃðy>5³É2'‹dºRš;^¿ja‘­¦ƒÈ³Ñ¢"sî¦Ï8Z7.²¿jÎ#Ùßì€Çþ°i‡óë·íî¹óð\kcˆ±T…Z¯ŽÇÕ¿Ã×ÃvøÜíÛñ‡#¼³ßÎëv>sÏM +"…[CXÂÖ,kk¬n­1á¼­77#;W;ó3®qFТ‰®ÇŠ*$˜kKZ¡Uã +ù«P@!áh¸–òpzŒ!þ˹søÖ{t”kÓåú+¥|°+ª3Dik3TB#Êk„T-Ñ¡iy½•i¿zi¢9“Æ=¾˜Èå Â9›`ٜau r†ñ˜ç, 14ÿ0h\߸k÷í¨Tçßð0I%ˆ1,“2ˆŠ;hBe„U-pЌFØù½ƒ—οÞ°JA5 »þ¬SEºÙlzž€PÄ +‰¥G- Qu6ZTVé’”£uã²ú«PÀvÒñ ¼yüHóš&æ‚E™â9™,%“‡åeBê–È„ðÀd‚I§9IM¸‘¹¬BXJ!Ë+„Ô-Qá)yDms³h>ZœÁl.¦•ˆ©GåcŠT-‰é5HL!MsZw¯ýÎy´2¢”ÑÿK^iM„QÙ¼Xʍ–w#R·Ä̍GÞzWê£BÕFº]¹ÈÅÂBM°¬PXÝ¡0ˆP7Å6¥?ȨYM w¤E ,q,2Á²Ç"X݂c‘üX$àqlÚóqÿm»kž‡£º+Å»#njìLDÉûQàO»Sê߯^ºƒ#¨¡Xt¯Æ­ì`r{5KìÕ&Xv¯†Õ-Ø«a<æ{µ€Æ¥©¹–ËnïI‰¡Vö€/½B§wQKr·RRˌ%!,aÉ –µ$V·À’ Ñt¯ <ΩÃ4NÑ\˜œq,eË©[bœkèq@£Ûúí+–Pá:!·üքv#žü~dŒéÓîtù#옑å 3†hËÓ«Š/n<(»¶AJ,mȹ$mî½A˜ä.º*÷JÂv›`Y»au ì6ãÚ- Qtd2;1yó¦v’¢ÄÚ:—cK ëaya‘º%Â^óÀ……4ÛZjmâ-Ïí'ŸŒiBËiyA¥¤Qy%çEK„¼"ë8¬ûm÷'Ö߸jqÃv}<Á»´þüÔ·ÊÓk³î]¼W67·Nk ë&['Å[§e['R² u"Ö I ­s|å, 1,²góo¥fþRZrC(sAñ¨®žÑWÌHÁÿ.ïɕendstream +endobj +4548 0 obj << +/Type /Page +/Contents 4549 0 R +/Resources 4547 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4550 0 obj << +/D [4548 0 R /XYZ 71.731 729.2652 null] +>> endobj +4551 0 obj << +/D [4548 0 R /XYZ 139.477 708.3437 null] +>> endobj +4552 0 obj << +/D [4548 0 R /XYZ 139.477 708.3437 null] +>> endobj +4553 0 obj << +/D [4548 0 R /XYZ 76.7123 690.4109 null] +>> endobj +4554 0 obj << +/D [4548 0 R /XYZ 129.5143 672.4782 null] +>> endobj +4555 0 obj << +/D [4548 0 R /XYZ 129.5143 672.4782 null] +>> endobj +4556 0 obj << +/D [4548 0 R /XYZ 71.731 670.3214 null] +>> endobj +4557 0 obj << +/D [4548 0 R /XYZ 71.731 670.3214 null] +>> endobj +4558 0 obj << +/D [4548 0 R /XYZ 139.477 654.5454 null] +>> endobj +4559 0 obj << +/D [4548 0 R /XYZ 71.731 652.3886 null] +>> endobj +4560 0 obj << +/D [4548 0 R /XYZ 71.731 652.3886 null] +>> endobj +4561 0 obj << +/D [4548 0 R /XYZ 149.4396 636.6127 null] +>> endobj +4562 0 obj << +/D [4548 0 R /XYZ 71.731 634.4559 null] +>> endobj +4563 0 obj << +/D [4548 0 R /XYZ 149.4396 618.6799 null] +>> endobj +4564 0 obj << +/D [4548 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4565 0 obj << +/D [4548 0 R /XYZ 139.477 582.8144 null] +>> endobj +4566 0 obj << +/D [4548 0 R /XYZ 71.731 581.3749 null] +>> endobj +4567 0 obj << +/D [4548 0 R /XYZ 71.731 581.3749 null] +>> endobj +4568 0 obj << +/D [4548 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4569 0 obj << +/D [4548 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4570 0 obj << +/D [4548 0 R /XYZ 71.731 562.7248 null] +>> endobj +4571 0 obj << +/D [4548 0 R /XYZ 71.731 562.7248 null] +>> endobj +4572 0 obj << +/D [4548 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4573 0 obj << +/D [4548 0 R /XYZ 71.731 544.7921 null] +>> endobj +4574 0 obj << +/D [4548 0 R /XYZ 159.4023 529.0162 null] +>> endobj +4575 0 obj << +/D [4548 0 R /XYZ 76.7123 511.0834 null] +>> endobj +4576 0 obj << +/D [4548 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4577 0 obj << +/D [4548 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4578 0 obj << +/D [4548 0 R /XYZ 71.731 490.9938 null] +>> endobj +4579 0 obj << +/D [4548 0 R /XYZ 71.731 490.9938 null] +>> endobj +4580 0 obj << +/D [4548 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4581 0 obj << +/D [4548 0 R /XYZ 71.731 473.0611 null] +>> endobj +4582 0 obj << +/D [4548 0 R /XYZ 159.4023 457.2852 null] +>> endobj +4583 0 obj << +/D [4548 0 R /XYZ 76.7123 439.3524 null] +>> endobj +4584 0 obj << +/D [4548 0 R /XYZ 149.4396 421.4197 null] +>> endobj +4585 0 obj << +/D [4548 0 R /XYZ 149.4396 421.4197 null] +>> endobj +4586 0 obj << +/D [4548 0 R /XYZ 71.731 419.2628 null] +>> endobj +4587 0 obj << +/D [4548 0 R /XYZ 71.731 419.2628 null] +>> endobj +4588 0 obj << +/D [4548 0 R /XYZ 159.4023 403.4869 null] +>> endobj +4589 0 obj << +/D [4548 0 R /XYZ 71.731 401.3301 null] +>> endobj +4590 0 obj << +/D [4548 0 R /XYZ 159.4023 385.5542 null] +>> endobj +4591 0 obj << +/D [4548 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4592 0 obj << +/D [4548 0 R /XYZ 129.5143 313.8231 null] +>> endobj +4593 0 obj << +/D [4548 0 R /XYZ 129.5143 313.8231 null] +>> endobj +4594 0 obj << +/D [4548 0 R /XYZ 71.731 311.6663 null] +>> endobj +4595 0 obj << +/D [4548 0 R /XYZ 71.731 311.6663 null] +>> endobj +4596 0 obj << +/D [4548 0 R /XYZ 139.477 295.8904 null] +>> endobj +4597 0 obj << +/D [4548 0 R /XYZ 71.731 258.0324 null] +>> endobj +4598 0 obj << +/D [4548 0 R /XYZ 71.731 244.9814 null] +>> endobj +4599 0 obj << +/D [4548 0 R /XYZ 71.731 243.7361 null] +>> endobj +4600 0 obj << +/D [4548 0 R /XYZ 129.5143 224.6575 null] +>> endobj +4601 0 obj << +/D [4548 0 R /XYZ 71.731 222.5007 null] +>> endobj +4602 0 obj << +/D [4548 0 R /XYZ 71.731 222.5007 null] +>> endobj +4603 0 obj << +/D [4548 0 R /XYZ 139.477 206.7248 null] +>> endobj +4604 0 obj << +/D [4548 0 R /XYZ 139.477 206.7248 null] +>> endobj +4605 0 obj << +/D [4548 0 R /XYZ 71.731 204.5679 null] +>> endobj +4606 0 obj << +/D [4548 0 R /XYZ 71.731 204.5679 null] +>> endobj +4607 0 obj << +/D [4548 0 R /XYZ 149.4396 188.792 null] +>> endobj +4608 0 obj << +/D [4548 0 R /XYZ 76.7123 170.8593 null] +>> endobj +4609 0 obj << +/D [4548 0 R /XYZ 139.477 152.9265 null] +>> endobj +4610 0 obj << +/D [4548 0 R /XYZ 139.477 152.9265 null] +>> endobj +4611 0 obj << +/D [4548 0 R /XYZ 71.731 150.7697 null] +>> endobj +4612 0 obj << +/D [4548 0 R /XYZ 139.477 134.9938 null] +>> endobj +4613 0 obj << +/D [4548 0 R /XYZ 139.477 134.9938 null] +>> endobj +4614 0 obj << +/D [4548 0 R /XYZ 71.731 132.8369 null] +>> endobj +4615 0 obj << +/D [4548 0 R /XYZ 139.477 117.061 null] +>> endobj +4616 0 obj << +/D [4548 0 R /XYZ 139.477 117.061 null] +>> endobj +4617 0 obj << +/D [4548 0 R /XYZ 71.731 114.9042 null] +>> endobj +4618 0 obj << +/D [4548 0 R /XYZ 71.731 114.9042 null] +>> endobj +4619 0 obj << +/D [4548 0 R /XYZ 149.4396 99.1283 null] +>> endobj +4547 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4623 0 obj << +/Length 1363 +/Filter /FlateDecode +>> +stream +xÚµX]£6}Ÿ_ÁcF\Û û6ýZMÕ®F»óÖ©V$ j8Í¿ï5¶Á€ù¨Ô*äØ÷Üãs}1ÄÃð!'ˆp¡ ¢QH½Ãå{oð×ç;¢!¾Æø6èǗ»~ °— $¢‘÷rô‚$B!g(ŠC{/ٟ»ŸNéUäõ½OC¼£H]ŸÏi™‹ßÓ½úúøü¤nþÈũʚû¿^~»û奋%1Y$ÉpŒXžÄŸN)BúQ‚#8钡‰Ç‘‰B2®ƒÉl^) Ç줋)K<{Bw|íy˜QSAìÅ jÄZA‚çCYÞêâ*Šª”lZêý:DEQÌ!ŽÄ~RÒ6¢.Ê·õåK•åêî­®nWu;r㈒°%Ò*ÇãÀ8FD +-§§ˆÇrUy¼ûœ 9ñ—\¼ßS¼«ê¿;ÆQL1Ì"]Â#å’纕ø¸æŸº½z¬O!/+ìXDÇj³xÅ!Noâ¤3-Tö ï¯Ó³ô#Ã; ©sq«ËöŸüœ50qÐö E›·,~î%ÛJükM’ È.-õµ®Óu[ÕÖëvw¨Jq°¢„5T?e¹H‹³™g_݄º-ÕÒÊ»>mõCQBâGùSzț©_ŸŽý@kHÓK¥ëP ð¸æ‡¢•+“IƒÏ|†‘rDZfJØB/I›¥¼ê,á¶ÍR/¾°•£ŽPaêF/U¥÷‘´ó4h´yÆT@ ì¥5o"ï¦,Ïë\ʹ’¾¤âpR‹xqʍ; áÛ{q>«»}n{/Ïô¾øttZr(gÓË?É¡ lLu¿¬ÙhýÇ󹺧áîÝøZófk¤Ù¥(5ûk¡onÍ .E~°«øÁ˜ ¶'î>.Õ­ÙJöYŽHëô’ÃZ(’ƒœÀ^î1Ed®qo¡ú¾‘p¬úÆx®Ù¶A) +¡® ó]à š6 Ó¼lrWtFÂdÒ+ ®FÍYŽ—%yHÛa!ou>ÍÎ0ˆ´LWš± [hÆlµ»ânhÆÎf< ñº¨‡ºa„"ÏDó½øÑ!ëEM§Ê êªcÞ·4[@k^1®[r®­[×w‹wÇfԔư€ЀÃà‡]À…k«äòTŽ-“J©æI‚†‚Ü€I0³3”oúNf›6‰ääŠ;/¬åäa/˜CÿEv ÂÑ9Šq²&—[’ËÀÖårÄÝ"—ƒ‡K.›Çÿ´Ó™ÒÃðØ)OÌËel¡ÊØ ÖËØuKi̔±ÍC—°ë`턅ëQgµ„5lΖ$f(ŽéZÛ°[v°U[ºân°¥‹‡Ã–ƒgÂo·=è¬ÕʲNëóÚDJX²V²6lI[×Æw‹6.ml³†ùréš"A8f+õi£æë³C­Ö§+ê†úœÐp×ç€GÑ|¿ÖÅ%­?\§Žp0ªÐ}wóŠf¡D nև$@DV|hÁ–|h`ë>tÄÝâC—mZíº§fôÎÅè>×?ŽF]q2ïrÚwN£ÌôËvæ%‹ïã-Ìôu|Ç'L „ J¦ÀÃٗ뎀ÿqƒ·endstream +endobj +4622 0 obj << +/Type /Page +/Contents 4623 0 R +/Resources 4621 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4624 0 obj << +/D [4622 0 R /XYZ 71.731 729.2652 null] +>> endobj +4625 0 obj << +/D [4622 0 R /XYZ 76.7123 708.3437 null] +>> endobj +4626 0 obj << +/D [4622 0 R /XYZ 139.477 690.4109 null] +>> endobj +4627 0 obj << +/D [4622 0 R /XYZ 139.477 690.4109 null] +>> endobj +806 0 obj << +/D [4622 0 R /XYZ 71.731 667.4969 null] +>> endobj +342 0 obj << +/D [4622 0 R /XYZ 263.6811 622.2426 null] +>> endobj +4628 0 obj << +/D [4622 0 R /XYZ 71.731 602.1022 null] +>> endobj +4629 0 obj << +/D [4622 0 R /XYZ 161.0655 589.3659 null] +>> endobj +4630 0 obj << +/D [4622 0 R /XYZ 71.731 577.2464 null] +>> endobj +4631 0 obj << +/D [4622 0 R /XYZ 71.731 546.2167 null] +>> endobj +4632 0 obj << +/D [4622 0 R /XYZ 168.8063 534.8702 null] +>> endobj +4633 0 obj << +/D [4622 0 R /XYZ 71.731 522.7507 null] +>> endobj +4634 0 obj << +/D [4622 0 R /XYZ 71.731 468.0723 null] +>> endobj +4635 0 obj << +/D [4622 0 R /XYZ 181.5683 457.062 null] +>> endobj +4636 0 obj << +/D [4622 0 R /XYZ 71.731 446.9998 null] +>> endobj +4637 0 obj << +/D [4622 0 R /XYZ 71.731 413.5767 null] +>> endobj +4638 0 obj << +/D [4622 0 R /XYZ 71.731 402.4668 null] +>> endobj +4639 0 obj << +/D [4622 0 R /XYZ 71.731 401.2215 null] +>> endobj +4640 0 obj << +/D [4622 0 R /XYZ 129.5143 382.143 null] +>> endobj +4641 0 obj << +/D [4622 0 R /XYZ 129.5143 382.143 null] +>> endobj +4642 0 obj << +/D [4622 0 R /XYZ 71.731 380.7034 null] +>> endobj +4643 0 obj << +/D [4622 0 R /XYZ 71.731 380.7034 null] +>> endobj +4644 0 obj << +/D [4622 0 R /XYZ 139.477 364.2102 null] +>> endobj +4645 0 obj << +/D [4622 0 R /XYZ 139.477 364.2102 null] +>> endobj +4646 0 obj << +/D [4622 0 R /XYZ 76.7123 346.2774 null] +>> endobj +4647 0 obj << +/D [4622 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4648 0 obj << +/D [4622 0 R /XYZ 129.5143 328.3447 null] +>> endobj +4649 0 obj << +/D [4622 0 R /XYZ 71.731 326.1879 null] +>> endobj +4650 0 obj << +/D [4622 0 R /XYZ 71.731 326.1879 null] +>> endobj +4651 0 obj << +/D [4622 0 R /XYZ 139.477 310.4119 null] +>> endobj +4652 0 obj << +/D [4622 0 R /XYZ 71.731 308.2551 null] +>> endobj +4653 0 obj << +/D [4622 0 R /XYZ 139.477 292.4792 null] +>> endobj +4654 0 obj << +/D [4622 0 R /XYZ 71.731 291.0396 null] +>> endobj +4655 0 obj << +/D [4622 0 R /XYZ 71.731 291.0396 null] +>> endobj +4656 0 obj << +/D [4622 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4657 0 obj << +/D [4622 0 R /XYZ 149.4396 274.5464 null] +>> endobj +4658 0 obj << +/D [4622 0 R /XYZ 71.731 272.3896 null] +>> endobj +4659 0 obj << +/D [4622 0 R /XYZ 71.731 272.3896 null] +>> endobj +4660 0 obj << +/D [4622 0 R /XYZ 159.4023 256.6137 null] +>> endobj +4661 0 obj << +/D [4622 0 R /XYZ 71.731 255.1741 null] +>> endobj +4662 0 obj << +/D [4622 0 R /XYZ 159.4023 238.6809 null] +>> endobj +4663 0 obj << +/D [4622 0 R /XYZ 76.7123 220.7482 null] +>> endobj +4664 0 obj << +/D [4622 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4665 0 obj << +/D [4622 0 R /XYZ 149.4396 202.8154 null] +>> endobj +4666 0 obj << +/D [4622 0 R /XYZ 71.731 200.6586 null] +>> endobj +4667 0 obj << +/D [4622 0 R /XYZ 71.731 200.6586 null] +>> endobj +4668 0 obj << +/D [4622 0 R /XYZ 159.4023 184.8827 null] +>> endobj +4669 0 obj << +/D [4622 0 R /XYZ 71.731 182.7258 null] +>> endobj +4670 0 obj << +/D [4622 0 R /XYZ 159.4023 166.9499 null] +>> endobj +4671 0 obj << +/D [4622 0 R /XYZ 76.7123 149.0172 null] +>> endobj +4672 0 obj << +/D [4622 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4673 0 obj << +/D [4622 0 R /XYZ 149.4396 131.0844 null] +>> endobj +4674 0 obj << +/D [4622 0 R /XYZ 71.731 128.9276 null] +>> endobj +4675 0 obj << +/D [4622 0 R /XYZ 71.731 128.9276 null] +>> endobj +4676 0 obj << +/D [4622 0 R /XYZ 159.4023 113.1517 null] +>> endobj +4677 0 obj << +/D [4622 0 R /XYZ 71.731 110.9948 null] +>> endobj +4621 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4680 0 obj << +/Length 1361 +/Filter /FlateDecode +>> +stream +xÚ½š]oÛ6…ïó+tWX8~ŠÔîÒî«ÃšhîÖaP,%K¥-Ø¿/]‘ +i¿ÒËuÑ ÙõQÞ£GçH¦m–Qûeš-솄çŠg›ÝÍìK¿\0'¹tšËPôúöâûŸÍ +Rä<Ïnï3QäDi™iÁ‰QÌd·ÕŸ«7Ûòi¨÷ëK®èŠ“q{óX¶õð{y7>½ºy;>xWÛ®ê×ÝþvñÓí4_ M +c‡,šÆ%EvÉ))8S ˆÉ‚HkÔ 5DH¡§cáE¦ ;§=–I7ÉósulŽ)F +EyþA?÷xûâÃïúxaʔõA¹ˆ}”û}ù߈¬»·w]÷X—íwã³·ý¸¶õøàißìʽۧií¹_3º*7îõûnï÷hܾmWÕ'+¬­³\s»5ð‰ð¢ËP >þ[³„¥eetN'ì÷:µ!Lf,á\Fg:òQµ=;ø8:\z˜pü0bê‡}Ó>¸“á çÇÉNÍW҆WI$´¡l!´“ -47!´ ´‘‘€è#UUûºïcVQX¼~ïÖû×L­ìÅd–¢ÈIθÆ(²%Š^†Sæ¦P|@C³Ñ: X_QJ‰–«{ Z¨»Wáu¦¦ÔýØÆLÝCÛ®ÚrW•—Š(^ðs”^{£d+}([ˆë$Cã +ÍMˆ+äˆkä#ÊæªèOCÓµå£}ÌÆÿý5`cÊ%1†a­eK˜¼ ÇÌMÁø€0…>°V!9W5›[{»Ê‘Ú†ªùÚN*´¶ÐԄڞ؀kùؕ ±ÌMíÛÏs4–1B@Ȗ¢èex¹)Q|@Q }D¹{wµ–tõ&¾¥ÌÁ‘… LQ¬§¡lÎ$Cá@sà@>8‘¬§I¼\£¤Ò„…´3TÍ·sR¡í„¦&´óÄÜÎÈÇÝóc³kèžJ‰ÝEÆ µ«´žÍlü, ¡8ÖÍP¶?/ÃãÌM‰àŠ_èþ Úë²­ž›j؎O'Ð0ΈdZÌ@¶DÆËp2ÀÜ2€ˆLèÎʗÀrMƾßSie¨šoå¤B[ MMhå‰ ¸•‘»}WV›²‡z©()hq–®È5É9ÃÚÊ28ÉÐ Bs2ù2ùˆî×õð|ø„¥ÛtÐLܓn¦Â>ȍÁ:ʖxyÎ ˜›Â ðñ +}`7Óÿ‹Ð· b¸±Üä@µÐd¯Â› LMiò±™&‡>vŸ?-j,aܜeÉÊ ELA±‡²…XN24–Ð܄XB>€XF>¢ ^›È9æÓ¢¬&ÄI_­•²;—C³yc¶¯ÐUµÝ<½ú¼v›e«µµmӀ° dKl½ g ÌMa ø€Ø†>°Ê Ü®Ò\rB Ž\BÕüåaR¡—hjÂåáÄ|yˆ|´õ°+ûðÛo)•8ËõK»Z*ÐëC [Ê°—áæ¦dðe8ôöý?w–³ «£ ƒ¡9á> endobj +4681 0 obj << +/D [4679 0 R /XYZ 71.731 729.2652 null] +>> endobj +4682 0 obj << +/D [4679 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4683 0 obj << +/D [4679 0 R /XYZ 76.7123 690.4109 null] +>> endobj +4684 0 obj << +/D [4679 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4685 0 obj << +/D [4679 0 R /XYZ 149.4396 672.4782 null] +>> endobj +4686 0 obj << +/D [4679 0 R /XYZ 71.731 670.3214 null] +>> endobj +4687 0 obj << +/D [4679 0 R /XYZ 71.731 670.3214 null] +>> endobj +4688 0 obj << +/D [4679 0 R /XYZ 159.4023 654.5454 null] +>> endobj +4689 0 obj << +/D [4679 0 R /XYZ 71.731 652.3886 null] +>> endobj +4690 0 obj << +/D [4679 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4691 0 obj << +/D [4679 0 R /XYZ 76.7123 618.6799 null] +>> endobj +4692 0 obj << +/D [4679 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4693 0 obj << +/D [4679 0 R /XYZ 149.4396 600.7472 null] +>> endobj +4694 0 obj << +/D [4679 0 R /XYZ 71.731 598.5904 null] +>> endobj +4695 0 obj << +/D [4679 0 R /XYZ 71.731 598.5904 null] +>> endobj +4696 0 obj << +/D [4679 0 R /XYZ 159.4023 582.8144 null] +>> endobj +4697 0 obj << +/D [4679 0 R /XYZ 71.731 580.6576 null] +>> endobj +4698 0 obj << +/D [4679 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4699 0 obj << +/D [4679 0 R /XYZ 76.7123 546.9489 null] +>> endobj +4700 0 obj << +/D [4679 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4701 0 obj << +/D [4679 0 R /XYZ 149.4396 529.0162 null] +>> endobj +4702 0 obj << +/D [4679 0 R /XYZ 71.731 526.8593 null] +>> endobj +4703 0 obj << +/D [4679 0 R /XYZ 71.731 526.8593 null] +>> endobj +4704 0 obj << +/D [4679 0 R /XYZ 159.4023 511.0834 null] +>> endobj +4705 0 obj << +/D [4679 0 R /XYZ 71.731 508.9266 null] +>> endobj +4706 0 obj << +/D [4679 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4707 0 obj << +/D [4679 0 R /XYZ 76.7123 475.2179 null] +>> endobj +4708 0 obj << +/D [4679 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4709 0 obj << +/D [4679 0 R /XYZ 149.4396 457.2852 null] +>> endobj +4710 0 obj << +/D [4679 0 R /XYZ 71.731 455.1283 null] +>> endobj +4711 0 obj << +/D [4679 0 R /XYZ 71.731 455.1283 null] +>> endobj +4712 0 obj << +/D [4679 0 R /XYZ 159.4023 439.3524 null] +>> endobj +4713 0 obj << +/D [4679 0 R /XYZ 71.731 437.9129 null] +>> endobj +4714 0 obj << +/D [4679 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4715 0 obj << +/D [4679 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4716 0 obj << +/D [4679 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4717 0 obj << +/D [4679 0 R /XYZ 149.4396 385.5542 null] +>> endobj +4718 0 obj << +/D [4679 0 R /XYZ 71.731 383.3973 null] +>> endobj +4719 0 obj << +/D [4679 0 R /XYZ 71.731 383.3973 null] +>> endobj +4720 0 obj << +/D [4679 0 R /XYZ 159.4023 367.6214 null] +>> endobj +4721 0 obj << +/D [4679 0 R /XYZ 71.731 365.4646 null] +>> endobj +4722 0 obj << +/D [4679 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4723 0 obj << +/D [4679 0 R /XYZ 76.7123 331.7559 null] +>> endobj +4724 0 obj << +/D [4679 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4725 0 obj << +/D [4679 0 R /XYZ 149.4396 313.8231 null] +>> endobj +4726 0 obj << +/D [4679 0 R /XYZ 71.731 311.6663 null] +>> endobj +4727 0 obj << +/D [4679 0 R /XYZ 71.731 311.6663 null] +>> endobj +4728 0 obj << +/D [4679 0 R /XYZ 159.4023 295.8904 null] +>> endobj +4729 0 obj << +/D [4679 0 R /XYZ 71.731 293.7336 null] +>> endobj +4730 0 obj << +/D [4679 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4731 0 obj << +/D [4679 0 R /XYZ 76.7123 260.0249 null] +>> endobj +4732 0 obj << +/D [4679 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4733 0 obj << +/D [4679 0 R /XYZ 149.4396 242.0921 null] +>> endobj +4734 0 obj << +/D [4679 0 R /XYZ 71.731 239.9353 null] +>> endobj +4735 0 obj << +/D [4679 0 R /XYZ 71.731 239.9353 null] +>> endobj +4736 0 obj << +/D [4679 0 R /XYZ 159.4023 224.1594 null] +>> endobj +4737 0 obj << +/D [4679 0 R /XYZ 71.731 222.0026 null] +>> endobj +4738 0 obj << +/D [4679 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4739 0 obj << +/D [4679 0 R /XYZ 76.7123 188.2939 null] +>> endobj +4740 0 obj << +/D [4679 0 R /XYZ 149.4396 170.3611 null] +>> endobj +4741 0 obj << +/D [4679 0 R /XYZ 149.4396 170.3611 null] +>> endobj +4742 0 obj << +/D [4679 0 R /XYZ 71.731 168.2043 null] +>> endobj +4743 0 obj << +/D [4679 0 R /XYZ 71.731 168.2043 null] +>> endobj +4744 0 obj << +/D [4679 0 R /XYZ 159.4023 152.4284 null] +>> endobj +4745 0 obj << +/D [4679 0 R /XYZ 71.731 150.9888 null] +>> endobj +4746 0 obj << +/D [4679 0 R /XYZ 159.4023 134.4956 null] +>> endobj +4747 0 obj << +/D [4679 0 R /XYZ 76.7123 116.5629 null] +>> endobj +4748 0 obj << +/D [4679 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4749 0 obj << +/D [4679 0 R /XYZ 149.4396 98.6301 null] +>> endobj +4750 0 obj << +/D [4679 0 R /XYZ 71.731 96.4733 null] +>> endobj +4751 0 obj << +/D [4679 0 R /XYZ 71.731 96.4733 null] +>> endobj +4678 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4754 0 obj << +/Length 1505 +/Filter /FlateDecode +>> +stream +xÚµšÛrÛ6†ïý¼‹4S¡8@îÜô”N’zßÕ-ѧ¶¤!éxüöD‚©ÅÁu=¾ ?±?>î‚ Z$Ãæd’ É́jDsA³åÃÎîÌW¿‘^²è5 WôÓåُ¿2œi¤sšg—·Ó9’g’Q¤QÙåêïهu±kËz¾ Ï(êŽ÷Ŧl?7ÝÛó‹Ý‹Ïe»Þ®šù?—œýr9ÄL"­L I¦œe Š‘¦D€"Â5âƨ™ Vˆq&‡¹PIDöó4stƒl?™+JÅÔiiæhãNGö,ÐǑ)Ʀlì£iëjs÷CíãEw,V«ºlšîÍö¶;6år»Yõs÷öç/_íçõ·93se¦ó±3Ï5Fœ`áèÊY”#7#äà8òQÔuñ<ö–h™1!e– n2Up˜l/Z¸*ìt,/Wn)™ƒQý\íY§6˜Ê”ášóñõu}T»½‹é%`ˆj±°—¼wq÷`ûUÂ{Uü©Êr”*c©êÈB©jeñT⦤*àJU×G0/½\ˆB¹ÔÑvd!.VçÄMáø€¸¸>^Zž’Êܳ”¤«ò—ä Š–$5¡$OlÀ%9òÑ>ïJ ()GøMJRä)Eb%éÊ©7È¢©ÅMH=Ȑz#£<;wo؇WWXàÝ¡^õ®Ú}ãï̇ÄŽçHs«YWgeqp@Üp€œë#V³¯fi ‘„‹µ£ +µUŋˆšRÔSž¢v}ÜmùdPžÖ5ÇHi–¿EesÍ8VÙ®, ƒ,š P܄…| :ò‘Þîêêahïæbf®ÈœŠÙӜ˜3žý¥@”ÈX•»²D+‹Câ¦@|@]¯j®_ʕh$„Y—9fˆ«ÜÃÕª®ìÈUKÜq=Í˕R³+#ŒëçjÏ:õ1.z³ÝÄliG>ê²}¬7×·Uyßm•'WCRÄ©bãÒï.F.f=üOUӎ‰_aL#v«î¶;vÁN§ÝcJRސª…+Òød4/nF¦\ƒqý¸íY wƒÒ-õ#ÇÅÐ d´T˜ù³ºb-‚¿„š÷ޔd„#F ‹¤¤+ ¤ä ‹¦$7!%!£áZ¹>àR\¶ÞÄ¡:GL)IWHœAM(nBâœø×iŸ8#7õ¶X-‹¦JÔäÆº9÷åù¥l+ݶþ·ûà8Zp73‘ +q!T ¯# áµ²8^ n +Þ©¯k£j®í=à+f“ðf»½/‹½ùØun]7œjӖõíáV³ì¿¿µ S»®ús7ÛUé¿9F‚²Ø8ªBü{UÿiÐú0|ÇÃÆdç>3Á¶“sA™ýõñƜž˜Åœ"¡q¢# Q´²8F n +Ç©¤kã¥Êj S6Ûû\Èè*ëÈB­,ˆ›pêèÚXmây¬µ~B÷™ò`w@„s$)®»Ž,ÜÊâÀ¸)À§>`஍õ¶i7Åô,‰›¶‰êPñïwðîÚj»)î÷ç¿;C‚T‰RHêX“é¨L­*Šš@tjêz0‹áCѼ~-µƒÀ¥iX…Ž-¤®,„ÐÊ⠁¸)§>`Š®ÿô$ä-6¢$AÍf!-½®,„ÜÊâȁ¸)ȧ>`䮍}ûÓw×Õ +ڈ*Dò\ŽÉ›ÖÊö¸ûöÉ×nUfì¶:ìIý«-aiÍb«­+ 1¶²8c n +㩘±kã¡XB ‚Y>0Q”þ|>çxö!­K Ä´Ë9‰Q<ªB{UœáiЄ0AÇÃ>Iáì4ë‚ÀRdz³hší²2e¿êÞ?Uízºg°´ÖˆìŸÌ„A;ªh«Š‚‚&€žšA»L#FÿÿFìåÿcïªÂRÄóÐþšÅќþ˜EPiºL†‘öþ¥ôþ4øÙ¬½óendstream +endobj +4753 0 obj << +/Type /Page +/Contents 4754 0 R +/Resources 4752 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4755 0 obj << +/D [4753 0 R /XYZ 71.731 729.2652 null] +>> endobj +4756 0 obj << +/D [4753 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4757 0 obj << +/D [4753 0 R /XYZ 71.731 706.1869 null] +>> endobj +4758 0 obj << +/D [4753 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4759 0 obj << +/D [4753 0 R /XYZ 76.7123 672.4782 null] +>> endobj +4760 0 obj << +/D [4753 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4761 0 obj << +/D [4753 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4762 0 obj << +/D [4753 0 R /XYZ 71.731 652.3886 null] +>> endobj +4763 0 obj << +/D [4753 0 R /XYZ 71.731 652.3886 null] +>> endobj +4764 0 obj << +/D [4753 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4765 0 obj << +/D [4753 0 R /XYZ 71.731 634.4559 null] +>> endobj +4766 0 obj << +/D [4753 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4767 0 obj << +/D [4753 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4768 0 obj << +/D [4753 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4769 0 obj << +/D [4753 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4770 0 obj << +/D [4753 0 R /XYZ 71.731 580.6576 null] +>> endobj +4771 0 obj << +/D [4753 0 R /XYZ 71.731 580.6576 null] +>> endobj +4772 0 obj << +/D [4753 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4773 0 obj << +/D [4753 0 R /XYZ 71.731 562.7248 null] +>> endobj +4774 0 obj << +/D [4753 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4775 0 obj << +/D [4753 0 R /XYZ 76.7123 529.0162 null] +>> endobj +4776 0 obj << +/D [4753 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4777 0 obj << +/D [4753 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4778 0 obj << +/D [4753 0 R /XYZ 71.731 508.9266 null] +>> endobj +4779 0 obj << +/D [4753 0 R /XYZ 71.731 508.9266 null] +>> endobj +4780 0 obj << +/D [4753 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4781 0 obj << +/D [4753 0 R /XYZ 71.731 490.9938 null] +>> endobj +4782 0 obj << +/D [4753 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4783 0 obj << +/D [4753 0 R /XYZ 76.7123 421.4197 null] +>> endobj +4784 0 obj << +/D [4753 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4785 0 obj << +/D [4753 0 R /XYZ 129.5143 403.4869 null] +>> endobj +4786 0 obj << +/D [4753 0 R /XYZ 71.731 401.3301 null] +>> endobj +4787 0 obj << +/D [4753 0 R /XYZ 71.731 401.3301 null] +>> endobj +4788 0 obj << +/D [4753 0 R /XYZ 139.477 385.5542 null] +>> endobj +4789 0 obj << +/D [4753 0 R /XYZ 71.731 347.6961 null] +>> endobj +4790 0 obj << +/D [4753 0 R /XYZ 71.731 334.6452 null] +>> endobj +4791 0 obj << +/D [4753 0 R /XYZ 71.731 333.3998 null] +>> endobj +4792 0 obj << +/D [4753 0 R /XYZ 129.5143 314.3213 null] +>> endobj +4793 0 obj << +/D [4753 0 R /XYZ 71.731 312.1645 null] +>> endobj +4794 0 obj << +/D [4753 0 R /XYZ 71.731 312.1645 null] +>> endobj +4795 0 obj << +/D [4753 0 R /XYZ 139.477 296.3885 null] +>> endobj +4796 0 obj << +/D [4753 0 R /XYZ 139.477 296.3885 null] +>> endobj +4797 0 obj << +/D [4753 0 R /XYZ 71.731 294.2317 null] +>> endobj +4798 0 obj << +/D [4753 0 R /XYZ 139.477 278.4558 null] +>> endobj +4799 0 obj << +/D [4753 0 R /XYZ 139.477 278.4558 null] +>> endobj +4800 0 obj << +/D [4753 0 R /XYZ 71.731 276.2989 null] +>> endobj +4801 0 obj << +/D [4753 0 R /XYZ 139.477 260.523 null] +>> endobj +4802 0 obj << +/D [4753 0 R /XYZ 139.477 260.523 null] +>> endobj +4803 0 obj << +/D [4753 0 R /XYZ 71.731 258.3662 null] +>> endobj +4804 0 obj << +/D [4753 0 R /XYZ 139.477 242.5903 null] +>> endobj +4805 0 obj << +/D [4753 0 R /XYZ 139.477 242.5903 null] +>> endobj +4806 0 obj << +/D [4753 0 R /XYZ 71.731 240.4334 null] +>> endobj +4807 0 obj << +/D [4753 0 R /XYZ 139.477 224.6575 null] +>> endobj +4808 0 obj << +/D [4753 0 R /XYZ 139.477 224.6575 null] +>> endobj +4809 0 obj << +/D [4753 0 R /XYZ 71.731 222.5007 null] +>> endobj +4810 0 obj << +/D [4753 0 R /XYZ 139.477 206.7248 null] +>> endobj +4811 0 obj << +/D [4753 0 R /XYZ 139.477 206.7248 null] +>> endobj +4812 0 obj << +/D [4753 0 R /XYZ 71.731 204.5679 null] +>> endobj +4813 0 obj << +/D [4753 0 R /XYZ 139.477 188.792 null] +>> endobj +4814 0 obj << +/D [4753 0 R /XYZ 139.477 188.792 null] +>> endobj +4815 0 obj << +/D [4753 0 R /XYZ 71.731 186.6352 null] +>> endobj +4816 0 obj << +/D [4753 0 R /XYZ 139.477 170.8593 null] +>> endobj +4817 0 obj << +/D [4753 0 R /XYZ 139.477 170.8593 null] +>> endobj +4818 0 obj << +/D [4753 0 R /XYZ 71.731 168.7024 null] +>> endobj +4819 0 obj << +/D [4753 0 R /XYZ 139.477 152.9265 null] +>> endobj +4820 0 obj << +/D [4753 0 R /XYZ 139.477 152.9265 null] +>> endobj +4821 0 obj << +/D [4753 0 R /XYZ 71.731 151.487 null] +>> endobj +4822 0 obj << +/D [4753 0 R /XYZ 139.477 134.9938 null] +>> endobj +4823 0 obj << +/D [4753 0 R /XYZ 139.477 134.9938 null] +>> endobj +4824 0 obj << +/D [4753 0 R /XYZ 71.731 132.8369 null] +>> endobj +4825 0 obj << +/D [4753 0 R /XYZ 139.477 117.061 null] +>> endobj +4826 0 obj << +/D [4753 0 R /XYZ 139.477 117.061 null] +>> endobj +4827 0 obj << +/D [4753 0 R /XYZ 71.731 115.6215 null] +>> endobj +4828 0 obj << +/D [4753 0 R /XYZ 139.477 99.1283 null] +>> endobj +4829 0 obj << +/D [4753 0 R /XYZ 139.477 99.1283 null] +>> endobj +4830 0 obj << +/D [4753 0 R /XYZ 71.731 96.9714 null] +>> endobj +4752 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4833 0 obj << +/Length 1408 +/Filter /FlateDecode +>> +stream +xÚ½XˎÛ6ÝÏWh760fù)e7iš E ÒÙ5E ±4±Yr%zó÷½z&-êÑMá…õ8ä=÷ð>H‘Ï’ ÉàÆˆŠûã ~«O7d€ìÌν¼ùå#ÃAŒbAEðø°X Pò@2Š¢DÁcú×æ×CrRY½ÝÑo(êÿŠ¤ÌÔÉS{ÿð¹¿ø’©C•6Û¿¿ùíÑØ™DqFfIr!."ì(F1%¡E`Šp@IÀ3Τq†ÆD¤uœ18k½ùNix͎€»˜ò8°'Ôv¯ÿ/<ô¨1ˆ*xǃňKéÒxz-òc®Z&íËpŒ9ØhqïzYóRÝõWï“2}ÍSuèoÍ,Ž?ÚscÄ Žt´a3:Ø¢Ž>»+tñðêèÐPo§Ì#"åã8vElT—?ïӴΚ¦¿éf鮾ãgè'P·ùé…ßÂC2­±¤@+¢K[°95lYcÝ5_óðklÓ8v9íQ™…ˆÐˆ,« úûa*¯ÔÛ0„Á‰Ê÷·ý“ª6oð&=ìOf!€(!”ˆŽöŽ`(X’ƒ§"BDD¼cD‘ŒÛz%£Í§L}­Ò¬ñ%œDÅ2صEOŠ>?êJUmX¼3#.* cw” A¢>ã[rV‡Á·ÞüøŽ1-ÚBÊñfx^gê\—Ý›¬HË=›àNÛ³ ~Ț}ŸT^•stA{Šß:käþë:yô~6+xÞ«·¯J•ä¥YÁ4ƒÛBOòTÕÅÅfhŸŸ}n÷…lٜ²}Þùj>©‹˜!ØÎÛú ·#°¡`ƒyš•ªŸµnÜ:T*“cÖܹÏÛe•¤ ¦Ÿ¶oÎê2CY¼Y®ñ¨ýÁh¥¦ªØ¼æEÑ_=evdéE?wWÁ2©çˆŸ¡1ÝYÌ9ZšŽ@‚IÑÑù³:ZÞ]Íjz¾—<ÛÒpóªÍ? ï“ô˜— Zú÷EQ9ó|«Š¬Y›¨±A£S>\œ'/U¶·S÷NGdUnI¸y;Vçf-هvDRCèÁú÷$rN ð‡D   Ѩ »´‘X⾍Œf›l#”Âf„P¯Ýé6¢Gy¸mD·3‡G['zõ¸‡@:Þ]í-Ûñm‚êÙÈsMögF8q¸´²a3ýÙÀû³ÏîŠþ<âáíύ{ÐåËT!e¹äs=Ú#«Ý§Uerd2z¡Å¢ˆa¾½6l&z l1z}vWD?z]3{λ2>–YÇp`qdö´.ØÈ» ¨_ŠÑ³¶ME4E± mÃf"ÚÀ#ÚgwEDûx\„ÓíÐøÈÓq +&øDÖ òHt=פBV*¾×ê´Bz”—†¥p2wy\N„_Í>ÅÞÿL +CC„lŸç…±P3ÂhÔ²0«k„ñÐð cópjÛÇs¡7!ÿœ“ÂÙüè-ádžÁŽÎb)ÏlØLžØbžùì®È3qž94Ü>kïr¯ö­ÁD$A”±…,³QÓÁdP‹Á䳺"˜F4Ü¢¯ƒÉáQ$úq>¥‰Ê|ÍUHı$£o5Wg 5¹§ „ 1L&2T£v6Ì£êh¶IYC(ÄÔkwZV=ÊËà +»x`Ê\—âõ!ѱf€*׋Wؗ\ŸÅ ÂՃ˜¯[Ãô9µÎô"ùUe!b퇁U-؜ª¶¬ªÇîU=<|ªÚ<üqö =¤q åӅŠ`¦ ‚-֏Éåàšƒ¿Ø$^à×îW~³õíìü_[<û˜á{=‡ (ñì'} 3þ¢ÒNWqlfj Êhòû¼Çà¿a5“Sendstream +endobj +4832 0 obj << +/Type /Page +/Contents 4833 0 R +/Resources 4831 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4834 0 obj << +/D [4832 0 R /XYZ 71.731 729.2652 null] +>> endobj +4835 0 obj << +/D [4832 0 R /XYZ 139.477 708.3437 null] +>> endobj +4836 0 obj << +/D [4832 0 R /XYZ 139.477 708.3437 null] +>> endobj +4837 0 obj << +/D [4832 0 R /XYZ 71.731 706.9041 null] +>> endobj +4838 0 obj << +/D [4832 0 R /XYZ 139.477 690.4109 null] +>> endobj +4839 0 obj << +/D [4832 0 R /XYZ 139.477 690.4109 null] +>> endobj +4840 0 obj << +/D [4832 0 R /XYZ 71.731 688.2541 null] +>> endobj +4841 0 obj << +/D [4832 0 R /XYZ 139.477 672.4782 null] +>> endobj +4842 0 obj << +/D [4832 0 R /XYZ 139.477 672.4782 null] +>> endobj +807 0 obj << +/D [4832 0 R /XYZ 71.731 649.5641 null] +>> endobj +346 0 obj << +/D [4832 0 R /XYZ 196.1111 604.3098 null] +>> endobj +4843 0 obj << +/D [4832 0 R /XYZ 71.731 584.1694 null] +>> endobj +4844 0 obj << +/D [4832 0 R /XYZ 161.0655 571.4331 null] +>> endobj +4845 0 obj << +/D [4832 0 R /XYZ 71.731 559.3136 null] +>> endobj +4846 0 obj << +/D [4832 0 R /XYZ 71.731 528.284 null] +>> endobj +4847 0 obj << +/D [4832 0 R /XYZ 168.8063 516.9375 null] +>> endobj +4848 0 obj << +/D [4832 0 R /XYZ 71.731 489.874 null] +>> endobj +4849 0 obj << +/D [4832 0 R /XYZ 71.731 450.1395 null] +>> endobj +4850 0 obj << +/D [4832 0 R /XYZ 71.731 418.558 null] +>> endobj +4851 0 obj << +/D [4832 0 R /XYZ 181.5683 407.5477 null] +>> endobj +4852 0 obj << +/D [4832 0 R /XYZ 71.731 397.4855 null] +>> endobj +4853 0 obj << +/D [4832 0 R /XYZ 71.731 364.0623 null] +>> endobj +4854 0 obj << +/D [4832 0 R /XYZ 71.731 352.9525 null] +>> endobj +4855 0 obj << +/D [4832 0 R /XYZ 71.731 351.7072 null] +>> endobj +4856 0 obj << +/D [4832 0 R /XYZ 129.5143 332.6286 null] +>> endobj +4857 0 obj << +/D [4832 0 R /XYZ 129.5143 332.6286 null] +>> endobj +4858 0 obj << +/D [4832 0 R /XYZ 71.731 331.1891 null] +>> endobj +4859 0 obj << +/D [4832 0 R /XYZ 71.731 331.1891 null] +>> endobj +4860 0 obj << +/D [4832 0 R /XYZ 139.477 314.6959 null] +>> endobj +4861 0 obj << +/D [4832 0 R /XYZ 139.477 314.6959 null] +>> endobj +4862 0 obj << +/D [4832 0 R /XYZ 76.7123 296.7631 null] +>> endobj +4863 0 obj << +/D [4832 0 R /XYZ 129.5143 278.8304 null] +>> endobj +4864 0 obj << +/D [4832 0 R /XYZ 129.5143 278.8304 null] +>> endobj +4865 0 obj << +/D [4832 0 R /XYZ 71.731 276.6735 null] +>> endobj +4866 0 obj << +/D [4832 0 R /XYZ 71.731 276.6735 null] +>> endobj +4867 0 obj << +/D [4832 0 R /XYZ 139.477 260.8976 null] +>> endobj +4868 0 obj << +/D [4832 0 R /XYZ 71.731 258.7408 null] +>> endobj +4869 0 obj << +/D [4832 0 R /XYZ 71.731 258.7408 null] +>> endobj +4870 0 obj << +/D [4832 0 R /XYZ 149.4396 242.9649 null] +>> endobj +4871 0 obj << +/D [4832 0 R /XYZ 71.731 241.5253 null] +>> endobj +4872 0 obj << +/D [4832 0 R /XYZ 149.4396 225.0321 null] +>> endobj +4873 0 obj << +/D [4832 0 R /XYZ 76.7123 207.0994 null] +>> endobj +4874 0 obj << +/D [4832 0 R /XYZ 139.477 189.1666 null] +>> endobj +4875 0 obj << +/D [4832 0 R /XYZ 71.731 187.7271 null] +>> endobj +4876 0 obj << +/D [4832 0 R /XYZ 71.731 187.7271 null] +>> endobj +4877 0 obj << +/D [4832 0 R /XYZ 149.4396 171.2339 null] +>> endobj +4878 0 obj << +/D [4832 0 R /XYZ 149.4396 171.2339 null] +>> endobj +4879 0 obj << +/D [4832 0 R /XYZ 71.731 169.077 null] +>> endobj +4880 0 obj << +/D [4832 0 R /XYZ 71.731 169.077 null] +>> endobj +4881 0 obj << +/D [4832 0 R /XYZ 159.4023 153.3011 null] +>> endobj +4882 0 obj << +/D [4832 0 R /XYZ 71.731 151.1443 null] +>> endobj +4883 0 obj << +/D [4832 0 R /XYZ 159.4023 135.3684 null] +>> endobj +4884 0 obj << +/D [4832 0 R /XYZ 76.7123 117.4356 null] +>> endobj +4885 0 obj << +/D [4832 0 R /XYZ 149.4396 99.5029 null] +>> endobj +4886 0 obj << +/D [4832 0 R /XYZ 149.4396 99.5029 null] +>> endobj +4887 0 obj << +/D [4832 0 R /XYZ 71.731 97.346 null] +>> endobj +4888 0 obj << +/D [4832 0 R /XYZ 71.731 97.346 null] +>> endobj +4831 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4891 0 obj << +/Length 1369 +/Filter /FlateDecode +>> +stream +xÚÍZMoã6¼çWè˜ Ëo‘½ín›~`[,šÜš"Pbml¬#¥–ÓEþýR)Sö»uŠ"IÎØo8œá£±‚º?V”Œ”¸%\+^Ü=œÐâÞýëÇæ!çsƒÞ^|{!ha‰Õ\W a5Q¥,JÁ‰QÌW‹?Nß-«Çm½9;犞r2?¬«¦Þ¾¯n‡Ë7~N~­·ËvѝýyõËÉWc}%Jb+’$)Œ!JŠâœSb9S ˆIK¤#êÆB R”ãX¸-JÂúqº±Œ¸ÖæšsµOŽ)F¬¢¼ˆ0ÔÝ?îx„oNʸžÄ$Í5Í…FªšÍp4'<ëzsÓ´‹úfµÂ©K§mɦá\…Õ.‘Ì3g?¥%1†a±Œa û0Ô~PÝ ûA<ûMx¸á{£]ô뻩W÷ÍðA/¶×háúÆêšR6:•¶Ÿ•yù¤&V,½1,%_€áòusäx@òÅ<`C]ÑLÆ5 y„J„< ðUsB¾Oc&ä1eÛm›êê¾RÅ-î+­ LQ,æ1,áÓ†úª›áSˆàÓ IK¹xZ¯½B=UëÁ†‹áƒx`±JE8+±PÇ°”X†‹ÔÍ à‰óÀZòWéçcçFM„âH„cÔ|„Ga¨jF„hÀžðèVۙ-)QÔ·CKÎܐE£ÁRn 0܍@Ý7< 7Æ«¢¦„r‰-1,¥b€á*usTx@*Æ<þÕrñ… 9åÒÝãY,ó*‘ù€Â3TÍÉü>™ÌÇ<ºny³éª›Oõ3ôЏ»m2•§n÷Â5šû–rl€áŽêæ8à96æ1±çû±Ç|jÚÞvŸ½//ÚÝÙzÄ£§uÿpëyV?f áV`‰a ýFªT7C?ˆ ß„–øcIêóɔs;7HÖcÔ|ÖGšu¨jFÖhÀYŸð€3Î,¥¯‘q&$‘Vaa)îQ nŽGGc_ӂ²âÍ4Qš£ñŽ`)é —¨›#À’.æq¤†žPÓ¿u" 1læáKx1%¾—¢¸!”Y;þRO¿´³o™¿’U·¶endstream +endobj +4890 0 obj << +/Type /Page +/Contents 4891 0 R +/Resources 4889 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 4620 0 R +>> endobj +4892 0 obj << +/D [4890 0 R /XYZ 71.731 729.2652 null] +>> endobj +4893 0 obj << +/D [4890 0 R /XYZ 159.4023 708.3437 null] +>> endobj +4894 0 obj << +/D [4890 0 R /XYZ 71.731 706.1869 null] +>> endobj +4895 0 obj << +/D [4890 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4896 0 obj << +/D [4890 0 R /XYZ 76.7123 672.4782 null] +>> endobj +4897 0 obj << +/D [4890 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4898 0 obj << +/D [4890 0 R /XYZ 149.4396 654.5454 null] +>> endobj +4899 0 obj << +/D [4890 0 R /XYZ 71.731 652.3886 null] +>> endobj +4900 0 obj << +/D [4890 0 R /XYZ 71.731 652.3886 null] +>> endobj +4901 0 obj << +/D [4890 0 R /XYZ 159.4023 636.6127 null] +>> endobj +4902 0 obj << +/D [4890 0 R /XYZ 71.731 634.4559 null] +>> endobj +4903 0 obj << +/D [4890 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4904 0 obj << +/D [4890 0 R /XYZ 76.7123 600.7472 null] +>> endobj +4905 0 obj << +/D [4890 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4906 0 obj << +/D [4890 0 R /XYZ 149.4396 582.8144 null] +>> endobj +4907 0 obj << +/D [4890 0 R /XYZ 71.731 580.6576 null] +>> endobj +4908 0 obj << +/D [4890 0 R /XYZ 71.731 580.6576 null] +>> endobj +4909 0 obj << +/D [4890 0 R /XYZ 159.4023 564.8817 null] +>> endobj +4910 0 obj << +/D [4890 0 R /XYZ 71.731 562.7248 null] +>> endobj +4911 0 obj << +/D [4890 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4912 0 obj << +/D [4890 0 R /XYZ 76.7123 529.0162 null] +>> endobj +4913 0 obj << +/D [4890 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4914 0 obj << +/D [4890 0 R /XYZ 149.4396 511.0834 null] +>> endobj +4915 0 obj << +/D [4890 0 R /XYZ 71.731 508.9266 null] +>> endobj +4916 0 obj << +/D [4890 0 R /XYZ 71.731 508.9266 null] +>> endobj +4917 0 obj << +/D [4890 0 R /XYZ 159.4023 493.1507 null] +>> endobj +4918 0 obj << +/D [4890 0 R /XYZ 71.731 490.9938 null] +>> endobj +4919 0 obj << +/D [4890 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4920 0 obj << +/D [4890 0 R /XYZ 76.7123 457.2852 null] +>> endobj +4921 0 obj << +/D [4890 0 R /XYZ 149.4396 439.3524 null] +>> endobj +4922 0 obj << +/D [4890 0 R /XYZ 149.4396 439.3524 null] +>> endobj +4923 0 obj << +/D [4890 0 R /XYZ 71.731 437.1956 null] +>> endobj +4924 0 obj << +/D [4890 0 R /XYZ 71.731 437.1956 null] +>> endobj +4925 0 obj << +/D [4890 0 R /XYZ 159.4023 421.4197 null] +>> endobj +4926 0 obj << +/D [4890 0 R /XYZ 71.731 419.9801 null] +>> endobj +4927 0 obj << +/D [4890 0 R /XYZ 159.4023 403.4869 null] +>> endobj +4928 0 obj << +/D [4890 0 R /XYZ 76.7123 385.5542 null] +>> endobj +4929 0 obj << +/D [4890 0 R /XYZ 149.4396 367.6214 null] +>> endobj +4930 0 obj << +/D [4890 0 R /XYZ 149.4396 367.6214 null] +>> endobj +4931 0 obj << +/D [4890 0 R /XYZ 71.731 365.4646 null] +>> endobj +4932 0 obj << +/D [4890 0 R /XYZ 71.731 365.4646 null] +>> endobj +4933 0 obj << +/D [4890 0 R /XYZ 159.4023 349.6887 null] +>> endobj +4934 0 obj << +/D [4890 0 R /XYZ 71.731 347.5318 null] +>> endobj +4935 0 obj << +/D [4890 0 R /XYZ 159.4023 331.7559 null] +>> endobj +4936 0 obj << +/D [4890 0 R /XYZ 76.7123 313.8231 null] +>> endobj +4937 0 obj << +/D [4890 0 R /XYZ 149.4396 295.8904 null] +>> endobj +4938 0 obj << +/D [4890 0 R /XYZ 149.4396 295.8904 null] +>> endobj +4939 0 obj << +/D [4890 0 R /XYZ 71.731 293.7336 null] +>> endobj +4940 0 obj << +/D [4890 0 R /XYZ 71.731 293.7336 null] +>> endobj +4941 0 obj << +/D [4890 0 R /XYZ 159.4023 277.9576 null] +>> endobj +4942 0 obj << +/D [4890 0 R /XYZ 71.731 275.8008 null] +>> endobj +4943 0 obj << +/D [4890 0 R /XYZ 159.4023 260.0249 null] +>> endobj +4944 0 obj << +/D [4890 0 R /XYZ 76.7123 242.0921 null] +>> endobj +4945 0 obj << +/D [4890 0 R /XYZ 149.4396 224.1594 null] +>> endobj +4946 0 obj << +/D [4890 0 R /XYZ 149.4396 224.1594 null] +>> endobj +4947 0 obj << +/D [4890 0 R /XYZ 71.731 222.0026 null] +>> endobj +4948 0 obj << +/D [4890 0 R /XYZ 71.731 222.0026 null] +>> endobj +4949 0 obj << +/D [4890 0 R /XYZ 159.4023 206.2266 null] +>> endobj +4950 0 obj << +/D [4890 0 R /XYZ 71.731 204.0698 null] +>> endobj +4951 0 obj << +/D [4890 0 R /XYZ 159.4023 188.2939 null] +>> endobj +4952 0 obj << +/D [4890 0 R /XYZ 76.7123 170.3611 null] +>> endobj +4953 0 obj << +/D [4890 0 R /XYZ 149.4396 152.4284 null] +>> endobj +4954 0 obj << +/D [4890 0 R /XYZ 149.4396 152.4284 null] +>> endobj +4955 0 obj << +/D [4890 0 R /XYZ 71.731 150.2715 null] +>> endobj +4956 0 obj << +/D [4890 0 R /XYZ 71.731 150.2715 null] +>> endobj +4957 0 obj << +/D [4890 0 R /XYZ 159.4023 134.4956 null] +>> endobj +4958 0 obj << +/D [4890 0 R /XYZ 71.731 132.3388 null] +>> endobj +4959 0 obj << +/D [4890 0 R /XYZ 159.4023 116.5629 null] +>> endobj +4960 0 obj << +/D [4890 0 R /XYZ 76.7123 98.6301 null] +>> endobj +4889 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4963 0 obj << +/Length 1435 +/Filter /FlateDecode +>> +stream +xÚ½YÑnÛ6}ÏWè1jŽ¤H‘ì[ÚnÆv†ìiÕVb¡ŽdHrƒþý(‹”(ë’ÔŠ®Èƒeåˆ÷èèÜCÒ" Ö$‰TP…hÆi²}¾ÂɓþׯWÄ@6³qAoî¯~ú%ʼnB*£Yrÿ˜¤*C\°D¤INdr¿ûûúí>?vEs³¡_S4|ÞòªèÞ矆¯·w¿ Šn_ïڛî¿úù~¬ÏS”ÔE‚$S%ÇRÊ/¹F47‘%îx¶êåçÄÂ^µ¤‘ÊDjI3v¦Á4 ­ëœÇ.mSè]ÏçÌ}z™@ ‹¾V~=H[VÝpP›g‘7Mþ՜zœ0‹Û32…#XÁ¢ZÔƅª.FóÊʵ@S°®_V{ÈcRˆpÍÓtÎCßþ«AˆwZY£RµºòٜzÙÕpTÕ;s®¨ºÆˆùrCôeíðÅyH°ª‚j›ISՁ…Tµ°¸ª@Ý5ª< U]°Ï~”Ц³4C¡" .Ê #* PÕ‘° GŒdzVèdÌT*9ς¶kÊê)æõ.‘(*š,ä] ‹{¨»Æ»È».AãÕùçÞq—~”Ÿ ×í-h۝róÏç|»/«Â/'ÆH0’ÓÂâru×È ð€ätyx=öÿ*lú–g II"à¢ü0¢¢U]‘ pÌx‹¢y(¡Ãze$¿ï‚€³ )&cíïÂ~aQ¿BuWøâøuÆcš§î +»„íj;9•Û½5cÙ^ÎSŸŠC]=µ~õt0c’ź݅…Ô³°¸z@Ý5ê< õ\Á‰ÿ» j’©Ž#Íí¢üÍ=¢¢Í U]ÑÜ psÏxôJü¸æf‚#JD¬¹]XÀž#,jO¨î +{B<{ÎxL^üc4Y¹ÓëËò#ÆT»Ó« ˆJk]ÒÆÂâÚu×hð€´qy[w¥\D!Îõ̔J®˜G.‹Ú¸°I.%ð ×b4¯\”ê2¡`]¿\öª%yoê€ã„¥sMѝšêá±,Ï"÷Û!*Óy‹güÚÈú¾l»¹ägaûg99[Þ¶%¦wÿ% –Û¢6. pçb4¯Ü)E˜2ÖõËm¯y8î4‰<£1mKô@K¹¾Ž‘ÄŠŸžj_{-IU¦wE’G,é–aQKBuWXâáhdŸÕŒ¼Ô>m;¯q¨ˆq.#Æqa㌰¨q º+Œ³à1ïScœ¶hÛ²®à)T2ƒvɯl/r|»{.ÍuuøªO‘ËD´%Î_¾ÜP~N…_óLÏÝ:|#’O¨â|YtÞ$`¹ÇíI¯WÚµjÇãðîí_6 +÷¹ù߶®º¦>€ËFÏJ‘2Š¸Âix¥è¢ü+Å])BUW¬!NëÛEČ´®M‚3$(‹6¹ YÎÂâžê®1Ý%Øu.þÑ?5õéè1ß7ÎÅÓFä<øˆЖŞ)+Ÿ‰”H(¶¢ò;т¢FJ®ð!À°¡K"äB©ž¶3q¡ ¸p„E]Õ]áÂЅ3‡¼íNÇ]ð ÍbËö£~•KR*¥ = ‹? îšçpÉ~./EóÍSþíñ˜7…ÝH¿©ksôöÞ ¿žÆ‡&áŒÄžP!} *.ï²èu/HÀâ:zÿUE÷R7Ÿ=Y+SD¤Þnÿ׬Ճö6֏­Q4ggo‹UѻϽ¿)…H?3×ù3ׂ¢™ ”\‘¹ s]@æš7÷L"I2|¹ï`–ïö9•¥Æ‘úz{ßÔÿ> endobj +4964 0 obj << +/D [4962 0 R /XYZ 71.731 729.2652 null] +>> endobj +4965 0 obj << +/D [4962 0 R /XYZ 149.4396 708.3437 null] +>> endobj +4966 0 obj << +/D [4962 0 R /XYZ 149.4396 708.3437 null] +>> endobj +4967 0 obj << +/D [4962 0 R /XYZ 71.731 706.1869 null] +>> endobj +4968 0 obj << +/D [4962 0 R /XYZ 71.731 706.1869 null] +>> endobj +4969 0 obj << +/D [4962 0 R /XYZ 159.4023 690.4109 null] +>> endobj +4970 0 obj << +/D [4962 0 R /XYZ 71.731 688.2541 null] +>> endobj +4971 0 obj << +/D [4962 0 R /XYZ 159.4023 672.4782 null] +>> endobj +4972 0 obj << +/D [4962 0 R /XYZ 76.7123 654.5454 null] +>> endobj +4973 0 obj << +/D [4962 0 R /XYZ 149.4396 636.6127 null] +>> endobj +4974 0 obj << +/D [4962 0 R /XYZ 149.4396 636.6127 null] +>> endobj +4975 0 obj << +/D [4962 0 R /XYZ 71.731 634.4559 null] +>> endobj +4976 0 obj << +/D [4962 0 R /XYZ 71.731 634.4559 null] +>> endobj +4977 0 obj << +/D [4962 0 R /XYZ 159.4023 618.6799 null] +>> endobj +4978 0 obj << +/D [4962 0 R /XYZ 71.731 616.5231 null] +>> endobj +4979 0 obj << +/D [4962 0 R /XYZ 159.4023 600.7472 null] +>> endobj +4980 0 obj << +/D [4962 0 R /XYZ 76.7123 582.8144 null] +>> endobj +4981 0 obj << +/D [4962 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4982 0 obj << +/D [4962 0 R /XYZ 149.4396 564.8817 null] +>> endobj +4983 0 obj << +/D [4962 0 R /XYZ 71.731 562.7248 null] +>> endobj +4984 0 obj << +/D [4962 0 R /XYZ 71.731 562.7248 null] +>> endobj +4985 0 obj << +/D [4962 0 R /XYZ 159.4023 546.9489 null] +>> endobj +4986 0 obj << +/D [4962 0 R /XYZ 71.731 544.7921 null] +>> endobj +4987 0 obj << +/D [4962 0 R /XYZ 159.4023 529.0162 null] +>> endobj +4988 0 obj << +/D [4962 0 R /XYZ 76.7123 511.0834 null] +>> endobj +4989 0 obj << +/D [4962 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4990 0 obj << +/D [4962 0 R /XYZ 149.4396 493.1507 null] +>> endobj +4991 0 obj << +/D [4962 0 R /XYZ 71.731 490.9938 null] +>> endobj +4992 0 obj << +/D [4962 0 R /XYZ 71.731 490.9938 null] +>> endobj +4993 0 obj << +/D [4962 0 R /XYZ 159.4023 475.2179 null] +>> endobj +4994 0 obj << +/D [4962 0 R /XYZ 71.731 473.7784 null] +>> endobj +4995 0 obj << +/D [4962 0 R /XYZ 159.4023 457.2852 null] +>> endobj +4996 0 obj << +/D [4962 0 R /XYZ 76.7123 403.4869 null] +>> endobj +4997 0 obj << +/D [4962 0 R /XYZ 129.5143 385.5542 null] +>> endobj +4998 0 obj << +/D [4962 0 R /XYZ 129.5143 385.5542 null] +>> endobj +4999 0 obj << +/D [4962 0 R /XYZ 71.731 383.3973 null] +>> endobj +5000 0 obj << +/D [4962 0 R /XYZ 71.731 383.3973 null] +>> endobj +5001 0 obj << +/D [4962 0 R /XYZ 139.477 367.6214 null] +>> endobj +5002 0 obj << +/D [4962 0 R /XYZ 71.731 329.7634 null] +>> endobj +5003 0 obj << +/D [4962 0 R /XYZ 71.731 316.7124 null] +>> endobj +5004 0 obj << +/D [4962 0 R /XYZ 71.731 315.4671 null] +>> endobj +5005 0 obj << +/D [4962 0 R /XYZ 129.5143 296.3885 null] +>> endobj +5006 0 obj << +/D [4962 0 R /XYZ 71.731 294.2317 null] +>> endobj +5007 0 obj << +/D [4962 0 R /XYZ 71.731 294.2317 null] +>> endobj +5008 0 obj << +/D [4962 0 R /XYZ 139.477 278.4558 null] +>> endobj +5009 0 obj << +/D [4962 0 R /XYZ 139.477 278.4558 null] +>> endobj +5010 0 obj << +/D [4962 0 R /XYZ 71.731 276.2989 null] +>> endobj +5011 0 obj << +/D [4962 0 R /XYZ 139.477 260.523 null] +>> endobj +5012 0 obj << +/D [4962 0 R /XYZ 139.477 260.523 null] +>> endobj +5013 0 obj << +/D [4962 0 R /XYZ 71.731 258.3662 null] +>> endobj +5014 0 obj << +/D [4962 0 R /XYZ 71.731 258.3662 null] +>> endobj +5015 0 obj << +/D [4962 0 R /XYZ 149.4396 242.5903 null] +>> endobj +5016 0 obj << +/D [4962 0 R /XYZ 76.7123 224.6575 null] +>> endobj +5017 0 obj << +/D [4962 0 R /XYZ 139.477 206.7248 null] +>> endobj +5018 0 obj << +/D [4962 0 R /XYZ 139.477 206.7248 null] +>> endobj +5019 0 obj << +/D [4962 0 R /XYZ 71.731 204.5679 null] +>> endobj +5020 0 obj << +/D [4962 0 R /XYZ 71.731 204.5679 null] +>> endobj +5021 0 obj << +/D [4962 0 R /XYZ 149.4396 188.792 null] +>> endobj +5022 0 obj << +/D [4962 0 R /XYZ 76.7123 170.8593 null] +>> endobj +5023 0 obj << +/D [4962 0 R /XYZ 139.477 152.9265 null] +>> endobj +5024 0 obj << +/D [4962 0 R /XYZ 139.477 152.9265 null] +>> endobj +5025 0 obj << +/D [4962 0 R /XYZ 71.731 150.7697 null] +>> endobj +5026 0 obj << +/D [4962 0 R /XYZ 139.477 134.9938 null] +>> endobj +5027 0 obj << +/D [4962 0 R /XYZ 139.477 134.9938 null] +>> endobj +5028 0 obj << +/D [4962 0 R /XYZ 71.731 132.8369 null] +>> endobj +5029 0 obj << +/D [4962 0 R /XYZ 139.477 117.061 null] +>> endobj +5030 0 obj << +/D [4962 0 R /XYZ 139.477 117.061 null] +>> endobj +5031 0 obj << +/D [4962 0 R /XYZ 71.731 114.9042 null] +>> endobj +5032 0 obj << +/D [4962 0 R /XYZ 71.731 114.9042 null] +>> endobj +5033 0 obj << +/D [4962 0 R /XYZ 149.4396 99.1283 null] +>> endobj +4961 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5037 0 obj << +/Length 1587 +/Filter /FlateDecode +>> +stream +xڝY]“›6}ß_áÇõL­JB"oùhÒtÒÎN²yj:km&\»ã_ $,°@$³¶Ùƒîѹ‡«+VPý¡UŒ@©œÌ(^eÇ;¸Ú«}¸C²1˜ zóx÷ëû®0ÌVÏ«(a€ÆdGpŠøêq÷÷ýÛCz’¢^o0…÷tŸEZ +ù)}ê~¾~øØ}ùSÈCµkÖÿ<þq÷ÛcŸF1H¸ +2K’@ãÑjqŸD^RCP¤þ¹a Á¤Ÿ NV1@z¢j2=®‡éÙ|؎Ù!5]ˆI²r´qǟWö®[_q%*#-($Ž‡4žªJn™J¡É´Ì¯i  `ι +£¡¯:eYçåþ—îÇu»½lÆL¨ŸzŒUlŽCB:°9!-,,¤'î!Ç<üBº4NBÔ۲ډm¾óHÉb@`æá×Ü¥qªjÙxWœ#žŒJGZ×éeÍè½ÑýSÞ½«g³0¾ýjÊD;®I€ÍÊ\*²ª,E&íã «[q }AL≢n@åIÉx¬ÉŒ¤Vî˜y£NgÄÞå¥qECuCÊד†¤ŒÎQ¨¸°Cö° !}qò†‡×M‘gº +øLI!H`ò£žlG4.«J¯'¬F  áɼÕ\Ô´ÕzTÐj¾¨ ¬æ£á±Ú€Ç¬ÕG¡µÜ…ÍYÍÂÂVóÄ]bµ1¿Õ\mZVeös]è7HáëÝ1/­µŠ‹º„º_ŸÓrW»ïÿ­1½O‹³©x{QŠ:í+ÝÓÅZRŒk£­›Ej=­)OfŒ$@j d̅Íd¬‡3拻 c7<¼ИîtÂ_þÎvRɘŒâкïÂ攴°°’ž¸K”óð+éÒø..‘ZõcÅø'MUùûÁ{¡÷—i‘i¬1ڝ¹°9‘-,,²'î‘Ç<ü"»4vê)ßfµ°=æíÎÞ¥}S[Ú¦(? +Ûߊ›=›òumjɋ–?µÕ•€?ŠzDq¨Ð»°¹çÅTû¬Ž0~´VÃêårVMKnh}¥°]usY»¤fÌ-ë²#N¥$°¡sQÓ]v +vÙ¾¨ ºl O—=à1×eGêÆy¨¸°Wö° +}q¸ò†‡×•MsØÖMºõwLyá¹6ûSßü~/+ÝI¿ ~ùòûõèÌÛv¨XjÊjAF´å§&U3©ºú ã1Þ-p¨öc~ÿAȇ·_}‰ÇPQÁcÖÍí¡®d%/'ñª¿ãª†¹w£Ê!CfÃeÇï{©ô,f¢§ì¼m+ýº@û@ÖBžë²ý(vMÛmÝÒÛØh.½w¢Éêü¤ŸÚ9‚”áŽàç6Zc×;·F 7Õ²>gòzv#Ó¼T9ë~ï„úYØAžª³=;îòg »¾­®ÌRy.séè¢UÒS5/\>>{4œõ5Èî«úÅ:oÓ©¶Q›?FYÔNtfný!–»WhL:*{îê0q*•‘ŸÖXÍNŠ~€Òž_pL¥nö£Vb8ӗ¼(ìRçZCì®"y&:òϤj7ôz7Òò;GËÒa€Eªzj:Îæá˜ö‡áÂv®©L‹춢ܤú¶ftߕ«3BOû*ïõüQäFL}Ö܀qy4ï Mt +öU¢ƒ¹}“H1%I?’ž9G“ï=ÿîŽ5endstream +endobj +5036 0 obj << +/Type /Page +/Contents 5037 0 R +/Resources 5035 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5038 0 obj << +/D [5036 0 R /XYZ 71.731 729.2652 null] +>> endobj +5039 0 obj << +/D [5036 0 R /XYZ 76.7123 708.3437 null] +>> endobj +5040 0 obj << +/D [5036 0 R /XYZ 139.477 690.4109 null] +>> endobj +5041 0 obj << +/D [5036 0 R /XYZ 139.477 690.4109 null] +>> endobj +5042 0 obj << +/D [5036 0 R /XYZ 71.731 688.2541 null] +>> endobj +5043 0 obj << +/D [5036 0 R /XYZ 139.477 672.4782 null] +>> endobj +5044 0 obj << +/D [5036 0 R /XYZ 139.477 672.4782 null] +>> endobj +5045 0 obj << +/D [5036 0 R /XYZ 71.731 670.3214 null] +>> endobj +5046 0 obj << +/D [5036 0 R /XYZ 139.477 654.5454 null] +>> endobj +5047 0 obj << +/D [5036 0 R /XYZ 139.477 654.5454 null] +>> endobj +5048 0 obj << +/D [5036 0 R /XYZ 71.731 652.3886 null] +>> endobj +5049 0 obj << +/D [5036 0 R /XYZ 139.477 636.6127 null] +>> endobj +5050 0 obj << +/D [5036 0 R /XYZ 139.477 636.6127 null] +>> endobj +5051 0 obj << +/D [5036 0 R /XYZ 71.731 635.1731 null] +>> endobj +5052 0 obj << +/D [5036 0 R /XYZ 139.477 618.6799 null] +>> endobj +5053 0 obj << +/D [5036 0 R /XYZ 139.477 618.6799 null] +>> endobj +5054 0 obj << +/D [5036 0 R /XYZ 71.731 616.5231 null] +>> endobj +5055 0 obj << +/D [5036 0 R /XYZ 71.731 616.5231 null] +>> endobj +5056 0 obj << +/D [5036 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5057 0 obj << +/D [5036 0 R /XYZ 76.7123 582.8144 null] +>> endobj +5058 0 obj << +/D [5036 0 R /XYZ 139.477 564.8817 null] +>> endobj +5059 0 obj << +/D [5036 0 R /XYZ 139.477 564.8817 null] +>> endobj +5060 0 obj << +/D [5036 0 R /XYZ 71.731 562.7248 null] +>> endobj +5061 0 obj << +/D [5036 0 R /XYZ 71.731 562.7248 null] +>> endobj +5062 0 obj << +/D [5036 0 R /XYZ 149.4396 546.9489 null] +>> endobj +5063 0 obj << +/D [5036 0 R /XYZ 76.7123 529.0162 null] +>> endobj +5064 0 obj << +/D [5036 0 R /XYZ 139.477 511.0834 null] +>> endobj +5065 0 obj << +/D [5036 0 R /XYZ 139.477 511.0834 null] +>> endobj +5066 0 obj << +/D [5036 0 R /XYZ 71.731 508.9266 null] +>> endobj +5067 0 obj << +/D [5036 0 R /XYZ 139.477 493.1507 null] +>> endobj +5068 0 obj << +/D [5036 0 R /XYZ 139.477 493.1507 null] +>> endobj +5069 0 obj << +/D [5036 0 R /XYZ 71.731 491.7111 null] +>> endobj +5070 0 obj << +/D [5036 0 R /XYZ 139.477 475.2179 null] +>> endobj +5071 0 obj << +/D [5036 0 R /XYZ 139.477 475.2179 null] +>> endobj +5072 0 obj << +/D [5036 0 R /XYZ 71.731 473.0611 null] +>> endobj +5073 0 obj << +/D [5036 0 R /XYZ 139.477 457.2852 null] +>> endobj +5074 0 obj << +/D [5036 0 R /XYZ 139.477 457.2852 null] +>> endobj +5075 0 obj << +/D [5036 0 R /XYZ 71.731 455.1283 null] +>> endobj +5076 0 obj << +/D [5036 0 R /XYZ 139.477 439.3524 null] +>> endobj +5077 0 obj << +/D [5036 0 R /XYZ 139.477 439.3524 null] +>> endobj +5078 0 obj << +/D [5036 0 R /XYZ 71.731 437.1956 null] +>> endobj +5079 0 obj << +/D [5036 0 R /XYZ 139.477 421.4197 null] +>> endobj +5080 0 obj << +/D [5036 0 R /XYZ 139.477 421.4197 null] +>> endobj +5081 0 obj << +/D [5036 0 R /XYZ 71.731 419.2628 null] +>> endobj +5082 0 obj << +/D [5036 0 R /XYZ 139.477 403.4869 null] +>> endobj +5083 0 obj << +/D [5036 0 R /XYZ 139.477 403.4869 null] +>> endobj +5084 0 obj << +/D [5036 0 R /XYZ 71.731 401.3301 null] +>> endobj +5085 0 obj << +/D [5036 0 R /XYZ 71.731 401.3301 null] +>> endobj +5086 0 obj << +/D [5036 0 R /XYZ 149.4396 385.5542 null] +>> endobj +5087 0 obj << +/D [5036 0 R /XYZ 76.7123 367.6214 null] +>> endobj +5088 0 obj << +/D [5036 0 R /XYZ 139.477 349.6887 null] +>> endobj +5089 0 obj << +/D [5036 0 R /XYZ 139.477 349.6887 null] +>> endobj +808 0 obj << +/D [5036 0 R /XYZ 71.731 326.7746 null] +>> endobj +350 0 obj << +/D [5036 0 R /XYZ 189.4142 281.5203 null] +>> endobj +5090 0 obj << +/D [5036 0 R /XYZ 71.731 261.3799 null] +>> endobj +5091 0 obj << +/D [5036 0 R /XYZ 161.0655 248.6436 null] +>> endobj +5092 0 obj << +/D [5036 0 R /XYZ 71.731 236.5241 null] +>> endobj +5093 0 obj << +/D [5036 0 R /XYZ 71.731 205.1582 null] +>> endobj +5094 0 obj << +/D [5036 0 R /XYZ 168.8063 194.1479 null] +>> endobj +5095 0 obj << +/D [5036 0 R /XYZ 71.731 167.0845 null] +>> endobj +5096 0 obj << +/D [5036 0 R /XYZ 71.731 127.35 null] +>> endobj +5035 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5099 0 obj << +/Length 1309 +/Filter /FlateDecode +>> +stream +xÚ½™_oÛ6Åßó)ü˜5Çÿû–ېa‚!{Z‡Aµ•X€c’‚bß~TD*—Ö¥ÈiÑ9î‘îÑ/çˆfÌ6Ôþc›‚‘BØ7„kÅ7»ç+ºy²ÿõËs’­Ól¡èLJ«~tcˆÑ\o7Âh¢ +¹)'¥båæaÿ×õ§Cuêîf˽æd:Þ«S=üV}™~¼½¿›^ü^‡vßßüýðëÕOó|% +bJ;dÕä¬ZÚäØdÌ¥X±)hI„Å«ÏÛã±½áêúk½Ÿ¼üÑëþãhåõüҞ¯åx¾»Ò–3¢Yi^Ï®öÏÍéÃtâ¹q/†zwp/Oí¾ž/õfeë¯5+ôääþ†©ëª«žkËmraÌöµDr©Q³j e†UPÀ˜e£…Ïœ«Å\Î--Æѹ—Ç7þ¬¥Q¨ÌþÊ“"ôQ½ —„ŽFÉÇ p?t/»áÃEžÆóëÓÐ쪡iOPùÒÕËô˜"Ò0ƒƒõª-”½ecQ‚ò²(Xû˧\tn¬?ké#+ ‘EÚ¸µ\¦®!t•&ZÚ_òmNOž/‚õyºÜüv:¾ôu4½ª0Ä”‰ôBÙJzgY2½Ø܌ô.|àé |œw/ÿ<6Çñé‡SfÖy@¹êºêßéeû8›ÓàÞè`~£áUÚ>–ŒÐ‰ðBÙJxgY2¼Ø܌ðb>À£Ú…7°CrѼÿô§{k?&ô3¥|Ò‚š¦šek°¼, ™› ñÀ‚6Âçâ`[üå†ÛfõôÖÈ'4´ê.Æ)yÉpBN´…*Ðåµ¢|$³+x¡Ñ©q>þ¬¥°¤ÒÚ°ŸQBö՝ìZ‹TT*¢¸á؃0¬$’H'[Ü ·@ RyúyÕÊ®‹«EÁ*‹HQŽÎƒõg¡>@ð”õA¹}+Æ\Kˆ%#Kwáu2P¶Bf–%É`s3È`>2h\²a¹BIe?™"QN¨Š—sV%ˉMÍ(çÂ^ÎÀǹk‡v׿o9¥Ð„i™*'”­EÐËÒDææDñEúÀóæq»÷kòäök}ï72‡a8÷óþæhwqqŒ¬$\°d“l £—¥1"ss0">0ŒÐGv“߇¬«ª(í§R­µ‡ªxígU²öØԌÚ/làµ|4g¤ðLnû…ZÚ"Ux([Iê,K&››‘TÌ’ÔÀË»{‡l¿ï꾏’š(JSU†²5@^–„ÌÍ„øÀAÙUN1óÅb”h¡R%ª•’zUº¤ÈԜ’^ڈ”úw· ö÷¡ãåÅʼØÆF¶º±Ú¥žv”H ”­$p–%ˆÍÍH æI`àãÿnbç›)¤Ýï™T9¡l —¥Ñ ssÐ >04ÐÇ;lù]•¸°¹¦2QK¨Š×rV%k‰MͨåÂ^ËÀÇ¡í‡ï¿Ÿåœû¡]¤2dkô²t‘¹9D|`„>ðÕâÆÉPA¨(“í²52^–&ƒÌÍ!ƒøÀÈ@ÙKg–+Óî–WË UñrΪd9±©å\ØÀËø蛡ÆMIíG‘ò}×Ìñ—4UJ([‰Þ,KF››=̽ÀÇÛ*pþaÿÇί‡º«/~:Û]5Ôû8LÁˆ EªÇP¶ÓËÒ0‘¹90Lècu•ýF|Ý7˲$%ÓfõËg Y~÷¬xI(3f¾ÒxC%~“Œ üÄßendstream +endobj +5098 0 obj << +/Type /Page +/Contents 5099 0 R +/Resources 5097 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5100 0 obj << +/D [5098 0 R /XYZ 71.731 729.2652 null] +>> endobj +5101 0 obj << +/D [5098 0 R /XYZ 71.731 718.3063 null] +>> endobj +5102 0 obj << +/D [5098 0 R /XYZ 181.5683 708.3437 null] +>> endobj +5103 0 obj << +/D [5098 0 R /XYZ 71.731 698.2815 null] +>> endobj +5104 0 obj << +/D [5098 0 R /XYZ 71.731 664.8583 null] +>> endobj +5105 0 obj << +/D [5098 0 R /XYZ 71.731 653.7485 null] +>> endobj +5106 0 obj << +/D [5098 0 R /XYZ 71.731 652.5032 null] +>> endobj +5107 0 obj << +/D [5098 0 R /XYZ 129.5143 633.4246 null] +>> endobj +5108 0 obj << +/D [5098 0 R /XYZ 129.5143 633.4246 null] +>> endobj +5109 0 obj << +/D [5098 0 R /XYZ 71.731 631.9851 null] +>> endobj +5110 0 obj << +/D [5098 0 R /XYZ 71.731 631.9851 null] +>> endobj +5111 0 obj << +/D [5098 0 R /XYZ 139.477 615.4919 null] +>> endobj +5112 0 obj << +/D [5098 0 R /XYZ 139.477 615.4919 null] +>> endobj +5113 0 obj << +/D [5098 0 R /XYZ 76.7123 597.5591 null] +>> endobj +5114 0 obj << +/D [5098 0 R /XYZ 129.5143 579.6264 null] +>> endobj +5115 0 obj << +/D [5098 0 R /XYZ 129.5143 579.6264 null] +>> endobj +5116 0 obj << +/D [5098 0 R /XYZ 71.731 577.4696 null] +>> endobj +5117 0 obj << +/D [5098 0 R /XYZ 71.731 577.4696 null] +>> endobj +5118 0 obj << +/D [5098 0 R /XYZ 139.477 561.6936 null] +>> endobj +5119 0 obj << +/D [5098 0 R /XYZ 71.731 559.5368 null] +>> endobj +5120 0 obj << +/D [5098 0 R /XYZ 139.477 543.7609 null] +>> endobj +5121 0 obj << +/D [5098 0 R /XYZ 71.731 542.3213 null] +>> endobj +5122 0 obj << +/D [5098 0 R /XYZ 71.731 542.3213 null] +>> endobj +5123 0 obj << +/D [5098 0 R /XYZ 149.4396 525.8281 null] +>> endobj +5124 0 obj << +/D [5098 0 R /XYZ 149.4396 525.8281 null] +>> endobj +5125 0 obj << +/D [5098 0 R /XYZ 71.731 523.6713 null] +>> endobj +5126 0 obj << +/D [5098 0 R /XYZ 71.731 523.6713 null] +>> endobj +5127 0 obj << +/D [5098 0 R /XYZ 159.4023 507.8954 null] +>> endobj +5128 0 obj << +/D [5098 0 R /XYZ 71.731 505.7386 null] +>> endobj +5129 0 obj << +/D [5098 0 R /XYZ 159.4023 489.9626 null] +>> endobj +5130 0 obj << +/D [5098 0 R /XYZ 76.7123 472.0299 null] +>> endobj +5131 0 obj << +/D [5098 0 R /XYZ 149.4396 454.0971 null] +>> endobj +5132 0 obj << +/D [5098 0 R /XYZ 149.4396 454.0971 null] +>> endobj +5133 0 obj << +/D [5098 0 R /XYZ 71.731 451.9403 null] +>> endobj +5134 0 obj << +/D [5098 0 R /XYZ 71.731 451.9403 null] +>> endobj +5135 0 obj << +/D [5098 0 R /XYZ 159.4023 436.1644 null] +>> endobj +5136 0 obj << +/D [5098 0 R /XYZ 71.731 434.0075 null] +>> endobj +5137 0 obj << +/D [5098 0 R /XYZ 159.4023 418.2316 null] +>> endobj +5138 0 obj << +/D [5098 0 R /XYZ 76.7123 400.2989 null] +>> endobj +5139 0 obj << +/D [5098 0 R /XYZ 149.4396 382.3661 null] +>> endobj +5140 0 obj << +/D [5098 0 R /XYZ 149.4396 382.3661 null] +>> endobj +5141 0 obj << +/D [5098 0 R /XYZ 71.731 380.2093 null] +>> endobj +5142 0 obj << +/D [5098 0 R /XYZ 71.731 380.2093 null] +>> endobj +5143 0 obj << +/D [5098 0 R /XYZ 159.4023 364.4334 null] +>> endobj +5144 0 obj << +/D [5098 0 R /XYZ 71.731 362.2765 null] +>> endobj +5145 0 obj << +/D [5098 0 R /XYZ 159.4023 346.5006 null] +>> endobj +5146 0 obj << +/D [5098 0 R /XYZ 76.7123 328.5679 null] +>> endobj +5147 0 obj << +/D [5098 0 R /XYZ 149.4396 310.6351 null] +>> endobj +5148 0 obj << +/D [5098 0 R /XYZ 149.4396 310.6351 null] +>> endobj +5149 0 obj << +/D [5098 0 R /XYZ 71.731 308.4783 null] +>> endobj +5150 0 obj << +/D [5098 0 R /XYZ 71.731 308.4783 null] +>> endobj +5151 0 obj << +/D [5098 0 R /XYZ 159.4023 292.7024 null] +>> endobj +5152 0 obj << +/D [5098 0 R /XYZ 71.731 291.2628 null] +>> endobj +5153 0 obj << +/D [5098 0 R /XYZ 159.4023 274.7696 null] +>> endobj +5154 0 obj << +/D [5098 0 R /XYZ 76.7123 256.8368 null] +>> endobj +5155 0 obj << +/D [5098 0 R /XYZ 149.4396 238.9041 null] +>> endobj +5156 0 obj << +/D [5098 0 R /XYZ 149.4396 238.9041 null] +>> endobj +5157 0 obj << +/D [5098 0 R /XYZ 71.731 236.7473 null] +>> endobj +5158 0 obj << +/D [5098 0 R /XYZ 71.731 236.7473 null] +>> endobj +5159 0 obj << +/D [5098 0 R /XYZ 159.4023 220.9713 null] +>> endobj +5160 0 obj << +/D [5098 0 R /XYZ 71.731 218.8145 null] +>> endobj +5161 0 obj << +/D [5098 0 R /XYZ 159.4023 203.0386 null] +>> endobj +5162 0 obj << +/D [5098 0 R /XYZ 76.7123 185.1058 null] +>> endobj +5163 0 obj << +/D [5098 0 R /XYZ 149.4396 167.1731 null] +>> endobj +5164 0 obj << +/D [5098 0 R /XYZ 149.4396 167.1731 null] +>> endobj +5165 0 obj << +/D [5098 0 R /XYZ 71.731 165.0163 null] +>> endobj +5166 0 obj << +/D [5098 0 R /XYZ 71.731 165.0163 null] +>> endobj +5167 0 obj << +/D [5098 0 R /XYZ 159.4023 149.2403 null] +>> endobj +5168 0 obj << +/D [5098 0 R /XYZ 71.731 147.8008 null] +>> endobj +5169 0 obj << +/D [5098 0 R /XYZ 159.4023 131.3076 null] +>> endobj +5170 0 obj << +/D [5098 0 R /XYZ 76.7123 113.3748 null] +>> endobj +5097 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5173 0 obj << +/Length 1394 +/Filter /FlateDecode +>> +stream +xÚ½šKoÛF…÷þ\:@5ç•]´…‹ +gՁ"іYH +Aÿ}G"‡º$ï<Ü …¢äù‡Ïå )±‚º?VhF´p/Ü®$/6/w´xvÿúíŽ ’Õ YAÑϏw?þ*ha‰U\O…°ŠH]Zpb$3ÅãöÏûw»õ©«š7+.é='ýëÇÃúXuï×_û·?}|è7>Tݮ޶oþzüýî—DZ¾šXãŠDM +kˆ¤R+N‰åL¢*&,)µvÇB ¥Ðã±p[hÂ.ÇéŽÅËFÕåX>s.çÞXɜ7­ +8ž¯:½¹ð{-mS‡T•W¥³á¸N}¼ÔÛêp1r5};ŽŽ0Ö¸Õ۞iÛ5ûãs¿]çaÝ4뿇ž&²ÅÑ õ•¥¤dÔâL½jeÔÅhAªÒñ‘”£uÃTý^¨'&ÊÅÔGOà‡!¡ï>õ=ë,Dš»ÈžBd1D^–F„ÔÍA„øÀAÁܼžÚÐ_J(¢×ñ^…ªp¯Žªd¯bU3zuaïՉÓºm¿ÕÍi×RcôӮ̥m²],–E/Kg©›“EÄ–EèÞ¹­šãú¥ +“¡”èR'»Èbd¼,M©›Cñ‘>²»4kh(©J—P–hN¨ +7ç¨J6'V5£96ðæœø8Ö]Õþ¿©,±¥Iu&”Eò7ʒùÃêfäóäoâc¶ûvS.ë½úÜöÔq@>e*Õ Päei@HÝ@ˆ ô‘jÐlfÌ)]–K© 7uñ¨ZAٍ™Õ´g¶-Ȍs·e­fæ÷Zú˜¶ªC%Y)¦>šª;7Ç/Oûê°ÅZö²LáFL[¶­äýöý¾í¦Ü?Sʯ#^ßuuÿÚ[¶7æ®iBòÇíU+(C"º-ˆÛÝOQ^Z´n·ß õ":\ '6n17ÓréŽGRb¨•WÁWBíÛ`$…2Ľ‘‰HBY$’£,I¬nF$1€‘?WxŸ7]08Â!dF™Dp ,œQ– V7#8 Ó>‚3±—Ëå®» +rlRÍ^˜Œ‡î´¡U8·Ê­FMâqT…Wá£*¹ +Ǫf¬Â1à:ê—eûc8x\Q?•; ŠÄΫ’©CŠf„nnÍô°?!ac‚p+YN‹?|¢¸Ý6Uۆ–œHK“,FÑËÒ‘º9ç>pÐÆisv½‹Ð’0nf4]Þæ(÷ÛêØí¯‹Á&̑—DI-S,ÆÑËÒ‘º9ç>pŽÐÆ®n»ïŸ½á(8Hªˆæeje1^–‰ÔÍ9÷ƒ„6Ú}Wá‰,]ÿSmC‰|€Aœ.-ݐýÖ·]ÕTó³Ê¡Þ¬»jDό!Úòy Š€÷ª$w¤hö¹ ”:ôpª›.ü4G¿vþîvä˸Ô~~ùZ5‹I½Zov·9zBÜì~¬6—Sâï0Ó<ÓîöJZŸæ¡*<͏ªä4U͘æ1È4?ñ›æ™(‰µ"uE€²X0½,L¤nN4ç>ðlBñïìtÎu5ý¥Ê€iBKѼ©b0Ušå²hʙ œ$ððï¾Pyõ¦µ—•CjÍT„^•DˆÍ@87"„⏽cYÌ}29ü` 4Ä0e£¿)šåO +$7„2kǑ.ƌþ@)øCƒ'ˆendstream +endobj +5172 0 obj << +/Type /Page +/Contents 5173 0 R +/Resources 5171 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5174 0 obj << +/D [5172 0 R /XYZ 71.731 729.2652 null] +>> endobj +809 0 obj << +/D [5172 0 R /XYZ 71.731 741.2204 null] +>> endobj +5175 0 obj << +/D [5172 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5176 0 obj << +/D [5172 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5177 0 obj << +/D [5172 0 R /XYZ 71.731 706.1869 null] +>> endobj +5178 0 obj << +/D [5172 0 R /XYZ 71.731 706.1869 null] +>> endobj +5179 0 obj << +/D [5172 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5180 0 obj << +/D [5172 0 R /XYZ 71.731 688.2541 null] +>> endobj +5181 0 obj << +/D [5172 0 R /XYZ 159.4023 672.4782 null] +>> endobj +5182 0 obj << +/D [5172 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5183 0 obj << +/D [5172 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5184 0 obj << +/D [5172 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5185 0 obj << +/D [5172 0 R /XYZ 71.731 634.4559 null] +>> endobj +5186 0 obj << +/D [5172 0 R /XYZ 71.731 634.4559 null] +>> endobj +5187 0 obj << +/D [5172 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5188 0 obj << +/D [5172 0 R /XYZ 71.731 616.5231 null] +>> endobj +5189 0 obj << +/D [5172 0 R /XYZ 159.4023 600.7472 null] +>> endobj +5190 0 obj << +/D [5172 0 R /XYZ 76.7123 582.8144 null] +>> endobj +5191 0 obj << +/D [5172 0 R /XYZ 149.4396 564.8817 null] +>> endobj +5192 0 obj << +/D [5172 0 R /XYZ 149.4396 564.8817 null] +>> endobj +5193 0 obj << +/D [5172 0 R /XYZ 71.731 562.7248 null] +>> endobj +5194 0 obj << +/D [5172 0 R /XYZ 71.731 562.7248 null] +>> endobj +5195 0 obj << +/D [5172 0 R /XYZ 159.4023 546.9489 null] +>> endobj +5196 0 obj << +/D [5172 0 R /XYZ 71.731 544.7921 null] +>> endobj +5197 0 obj << +/D [5172 0 R /XYZ 159.4023 529.0162 null] +>> endobj +5198 0 obj << +/D [5172 0 R /XYZ 76.7123 475.2179 null] +>> endobj +5199 0 obj << +/D [5172 0 R /XYZ 129.5143 457.2852 null] +>> endobj +5200 0 obj << +/D [5172 0 R /XYZ 129.5143 457.2852 null] +>> endobj +5201 0 obj << +/D [5172 0 R /XYZ 71.731 455.1283 null] +>> endobj +5202 0 obj << +/D [5172 0 R /XYZ 71.731 455.1283 null] +>> endobj +5203 0 obj << +/D [5172 0 R /XYZ 139.477 439.3524 null] +>> endobj +5204 0 obj << +/D [5172 0 R /XYZ 71.731 401.4944 null] +>> endobj +5205 0 obj << +/D [5172 0 R /XYZ 71.731 388.4434 null] +>> endobj +5206 0 obj << +/D [5172 0 R /XYZ 71.731 387.1981 null] +>> endobj +5207 0 obj << +/D [5172 0 R /XYZ 129.5143 368.1195 null] +>> endobj +5208 0 obj << +/D [5172 0 R /XYZ 71.731 365.9627 null] +>> endobj +5209 0 obj << +/D [5172 0 R /XYZ 71.731 365.9627 null] +>> endobj +5210 0 obj << +/D [5172 0 R /XYZ 139.477 350.1868 null] +>> endobj +5211 0 obj << +/D [5172 0 R /XYZ 139.477 350.1868 null] +>> endobj +5212 0 obj << +/D [5172 0 R /XYZ 71.731 348.03 null] +>> endobj +5213 0 obj << +/D [5172 0 R /XYZ 139.477 332.254 null] +>> endobj +5214 0 obj << +/D [5172 0 R /XYZ 139.477 332.254 null] +>> endobj +5215 0 obj << +/D [5172 0 R /XYZ 71.731 330.0972 null] +>> endobj +5216 0 obj << +/D [5172 0 R /XYZ 139.477 314.3213 null] +>> endobj +5217 0 obj << +/D [5172 0 R /XYZ 139.477 314.3213 null] +>> endobj +5218 0 obj << +/D [5172 0 R /XYZ 71.731 312.1645 null] +>> endobj +5219 0 obj << +/D [5172 0 R /XYZ 71.731 312.1645 null] +>> endobj +5220 0 obj << +/D [5172 0 R /XYZ 149.4396 296.3885 null] +>> endobj +5221 0 obj << +/D [5172 0 R /XYZ 76.7123 278.4558 null] +>> endobj +5222 0 obj << +/D [5172 0 R /XYZ 139.477 260.523 null] +>> endobj +5223 0 obj << +/D [5172 0 R /XYZ 139.477 260.523 null] +>> endobj +5224 0 obj << +/D [5172 0 R /XYZ 71.731 258.3662 null] +>> endobj +5225 0 obj << +/D [5172 0 R /XYZ 139.477 242.5903 null] +>> endobj +5226 0 obj << +/D [5172 0 R /XYZ 139.477 242.5903 null] +>> endobj +5227 0 obj << +/D [5172 0 R /XYZ 71.731 241.1507 null] +>> endobj +5228 0 obj << +/D [5172 0 R /XYZ 139.477 224.6575 null] +>> endobj +5229 0 obj << +/D [5172 0 R /XYZ 139.477 224.6575 null] +>> endobj +5230 0 obj << +/D [5172 0 R /XYZ 71.731 222.5007 null] +>> endobj +5231 0 obj << +/D [5172 0 R /XYZ 139.477 206.7248 null] +>> endobj +5232 0 obj << +/D [5172 0 R /XYZ 139.477 206.7248 null] +>> endobj +5233 0 obj << +/D [5172 0 R /XYZ 71.731 205.2852 null] +>> endobj +5234 0 obj << +/D [5172 0 R /XYZ 139.477 188.792 null] +>> endobj +5235 0 obj << +/D [5172 0 R /XYZ 139.477 188.792 null] +>> endobj +5236 0 obj << +/D [5172 0 R /XYZ 71.731 186.6352 null] +>> endobj +5237 0 obj << +/D [5172 0 R /XYZ 71.731 186.6352 null] +>> endobj +5238 0 obj << +/D [5172 0 R /XYZ 149.4396 170.8593 null] +>> endobj +5239 0 obj << +/D [5172 0 R /XYZ 76.7123 152.9265 null] +>> endobj +5240 0 obj << +/D [5172 0 R /XYZ 139.477 134.9938 null] +>> endobj +5241 0 obj << +/D [5172 0 R /XYZ 139.477 134.9938 null] +>> endobj +5242 0 obj << +/D [5172 0 R /XYZ 71.731 132.8369 null] +>> endobj +5243 0 obj << +/D [5172 0 R /XYZ 139.477 117.061 null] +>> endobj +5244 0 obj << +/D [5172 0 R /XYZ 139.477 117.061 null] +>> endobj +5245 0 obj << +/D [5172 0 R /XYZ 71.731 114.9042 null] +>> endobj +5246 0 obj << +/D [5172 0 R /XYZ 139.477 99.1283 null] +>> endobj +5247 0 obj << +/D [5172 0 R /XYZ 139.477 99.1283 null] +>> endobj +5171 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5250 0 obj << +/Length 1126 +/Filter /FlateDecode +>> +stream +xÚ¥˜]s£6†ïó+¸´g‚ªO$ö.í¶;m·3ž$wÝ^¬Z »“þúD„-À3™\ Ø¯tÞsx8’!†?I‚$ƒ MMòà Ž^à«/7dÄƒ&öE?>Þüð ÃQŠÒ„&ÑãsÄÒ É#É(R‚¨èqÿçæ§"{5ºÝÆTà EýuWeµ6_³§þ߻ݯýàmŠfßmÿzüíæçÇ1¾`¥ +‚,šU—6)‰ˆD”n}Ù$B!‚9ÙÇ̓jóE›Ý–áÖíçÌdÖ ¬z‰r‰Å2Šm¢2‘§vmcóöª?3ÌHN!‡¹1%(!éIoø§ä¿a³£)àJAc·†ô³îò¶|5eS/…epcÚǽ×æØÖ]³*;3 ›çá£&Ϫᣧ¿uî¾7EfúÑà÷U»ÛÚͱÚ÷ã<Ë ÝËz¸º%öëSÖ _gçÏM«Ë—zràä®êš~Ôú®Í–l\›Á˜TXˆ TY$ì”îdõºÙënjÎ噻ÛÑV?ø^”yáÄÚeYUeýr^·”½M[šÌ”[*6ÿn‰Ø¸uMãÒïFëÎL÷VçEÛÔ噽¥ÓÓUÞbm5@c J˜LN ?h}f¶<¼Vú kXô^?·º+vc +cÚEc£}Uišì±Ó{t-°wUÕ¯«^î›Jw«ŒêÙÍö‡²¾õª~eԝ­YÖf ­¨æ÷BR$‘ÐÁŠ…û˨Š}Yß_ÒzÄÄ:¸\ÍZøF©¸ˆK)bœÐ`Üóë»7ëÒS^ tAA8›ú°hÊF9Â6‚•|x3í17·g-ÚΔÊ܃©W[}™ ³ 0"ópa*öeï…%¶[Or²ÙÂÂÍǔ§Á¸ó…u³.}L ËRÄ¥œÚ¸ƒºôÛW ºžO;ãy}¡…¸úÊz藛t xØN},í^KF‘Â)÷{ûàÒ R¬îɖw²uÀq¯<à㽪ï<ø>zgI¤)†SW+$ú²GÙ*‰¡¸Wxá#HâÄÆCUæº PÈ8’IšL)ÌÚ6{Û&b3€øÕßOÏݸô4ÇÁ…dÏΜ&öDºž­4[UN _Øð!ç‹ê&…> endobj +5251 0 obj << +/D [5249 0 R /XYZ 71.731 729.2652 null] +>> endobj +354 0 obj << +/D [5249 0 R /XYZ 217.6127 658.1081 null] +>> endobj +5252 0 obj << +/D [5249 0 R /XYZ 71.731 637.9677 null] +>> endobj +5253 0 obj << +/D [5249 0 R /XYZ 161.0655 625.2314 null] +>> endobj +5254 0 obj << +/D [5249 0 R /XYZ 71.731 613.1119 null] +>> endobj +5255 0 obj << +/D [5249 0 R /XYZ 71.731 582.0823 null] +>> endobj +5256 0 obj << +/D [5249 0 R /XYZ 168.8063 570.7357 null] +>> endobj +5257 0 obj << +/D [5249 0 R /XYZ 71.731 543.6723 null] +>> endobj +5258 0 obj << +/D [5249 0 R /XYZ 71.731 515.5941 null] +>> endobj +5259 0 obj << +/D [5249 0 R /XYZ 71.731 484.0125 null] +>> endobj +5260 0 obj << +/D [5249 0 R /XYZ 181.5683 473.0022 null] +>> endobj +5261 0 obj << +/D [5249 0 R /XYZ 71.731 462.94 null] +>> endobj +5262 0 obj << +/D [5249 0 R /XYZ 71.731 429.5169 null] +>> endobj +5263 0 obj << +/D [5249 0 R /XYZ 71.731 418.407 null] +>> endobj +5264 0 obj << +/D [5249 0 R /XYZ 71.731 417.1617 null] +>> endobj +5265 0 obj << +/D [5249 0 R /XYZ 129.5143 398.0832 null] +>> endobj +5266 0 obj << +/D [5249 0 R /XYZ 129.5143 398.0832 null] +>> endobj +5267 0 obj << +/D [5249 0 R /XYZ 71.731 396.6436 null] +>> endobj +5268 0 obj << +/D [5249 0 R /XYZ 71.731 396.6436 null] +>> endobj +5269 0 obj << +/D [5249 0 R /XYZ 139.477 380.1504 null] +>> endobj +5270 0 obj << +/D [5249 0 R /XYZ 139.477 380.1504 null] +>> endobj +5271 0 obj << +/D [5249 0 R /XYZ 71.731 342.2924 null] +>> endobj +5272 0 obj << +/D [5249 0 R /XYZ 71.731 329.2414 null] +>> endobj +5273 0 obj << +/D [5249 0 R /XYZ 71.731 327.9961 null] +>> endobj +5274 0 obj << +/D [5249 0 R /XYZ 129.5143 308.9175 null] +>> endobj +5275 0 obj << +/D [5249 0 R /XYZ 71.731 308.818 null] +>> endobj +5276 0 obj << +/D [5249 0 R /XYZ 71.731 308.818 null] +>> endobj +5277 0 obj << +/D [5249 0 R /XYZ 139.477 290.9848 null] +>> endobj +5278 0 obj << +/D [5249 0 R /XYZ 139.477 290.9848 null] +>> endobj +5279 0 obj << +/D [5249 0 R /XYZ 71.731 288.828 null] +>> endobj +5280 0 obj << +/D [5249 0 R /XYZ 71.731 288.828 null] +>> endobj +5281 0 obj << +/D [5249 0 R /XYZ 149.4396 273.052 null] +>> endobj +5282 0 obj << +/D [5249 0 R /XYZ 76.7123 255.1193 null] +>> endobj +5283 0 obj << +/D [5249 0 R /XYZ 139.477 237.1865 null] +>> endobj +5284 0 obj << +/D [5249 0 R /XYZ 139.477 237.1865 null] +>> endobj +5285 0 obj << +/D [5249 0 R /XYZ 71.731 235.0297 null] +>> endobj +5286 0 obj << +/D [5249 0 R /XYZ 71.731 235.0297 null] +>> endobj +5287 0 obj << +/D [5249 0 R /XYZ 149.4396 219.2538 null] +>> endobj +5288 0 obj << +/D [5249 0 R /XYZ 76.7123 201.321 null] +>> endobj +5289 0 obj << +/D [5249 0 R /XYZ 139.477 183.3883 null] +>> endobj +5290 0 obj << +/D [5249 0 R /XYZ 139.477 183.3883 null] +>> endobj +5291 0 obj << +/D [5249 0 R /XYZ 71.731 181.2315 null] +>> endobj +5292 0 obj << +/D [5249 0 R /XYZ 71.731 181.2315 null] +>> endobj +5293 0 obj << +/D [5249 0 R /XYZ 149.4396 165.4555 null] +>> endobj +5294 0 obj << +/D [5249 0 R /XYZ 76.7123 147.5228 null] +>> endobj +5295 0 obj << +/D [5249 0 R /XYZ 139.477 129.59 null] +>> endobj +5296 0 obj << +/D [5249 0 R /XYZ 139.477 129.59 null] +>> endobj +5297 0 obj << +/D [5249 0 R /XYZ 71.731 127.4332 null] +>> endobj +5298 0 obj << +/D [5249 0 R /XYZ 71.731 127.4332 null] +>> endobj +5299 0 obj << +/D [5249 0 R /XYZ 149.4396 111.6573 null] +>> endobj +5248 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5302 0 obj << +/Length 897 +/Filter /FlateDecode +>> +stream +xÚµV]oœ8}ϯୠ¯¿?ú–mºÕVi4ªæm³Š˜ÁÉ ˆ€QÕß χTUó`<\ûœ{¸>×$Àð#"H1¨AT +lßnpð +¯¾Ü>$îcâiÐß뛿þa80ÈH*ƒõKÀŒDBñ@1Š´ :X§ÿ…ŸvÉ{c«(¦‡¹q•'…m’›Þ­þußl³+Ó:úýõæózÄL!£ä,IŽ5âR³ fð9óFØBxKƒ'،ÉP(DÚD!™1n k³y¢T³#.¦ÜÓ ÜãñÀcXµäÁt ATÉ;Ì ®ÔœÆc™ÚN¥Žôá g¦„6ê£5©ªäg$ExëæYݸ§òōy¹Mr÷X ;Ï3ì9( +£öË?ÅÓ(®Ç{”•øèJzQOË:¬òÒ8(E8Ѐ‚ó¨›j¿mLÆR`IBեš„+¬!ìrayp¯)¬cþšÒH7ÏMöf=¥Å1Íø¼´Òr¿Ém_WOXà{»‰(÷¯0!îïû¤I6ImÝìÅ6۝{œA® +Q":b1Á +i“XjD¤æ$xJgJ‡_l³Š­­?[؁b(Æ֊”tÉ­ª²)›Ÿïöã¸â G¿6¦ÔÐ8Ƙb²ov]vKÔxØdŠzoëm•½7YY\‹ûÝ6ûª¨{™vYÿô\>DB„ý¼^½öIÿWjŸ0¦…MÝ4+†=ú¶eѼÎW­>=?FL„wß>_›Ö]ž—áë{™Ûúb†.Á$}ˊÛCVǃ;µt-‡UDØÈÆaÏ΁“&ˆ +˜h¡N4„!*ž†έQ؝ÛÅn'Ï-¥ˆqB½¸§Ïí°jÉc~nÿ˜ñh«Ò×8Âd~fÇÝuÞv½-šl›´…:ÜWö¤!2Ɛ¢\\0ÄiØCÃ.¢÷ +C\ððâŒÆèân%u8'W|¡oV¼úzd}sÛ¹ƒYºq_w"à «½BÇ# ŸúÁ駚˜!òBOÃÎøv±À}¸W¸Ç¤5õ0ã1“µuåƒz›ˆPHiÆ:!)rè!lÙCZ©ÿt©çdb~Ï­#çÍÌ«î‹wolžÖ¿Óo¦®¿Çs¸iÎ^õ'1˛¾ |Řq§X‹“÷và/7]×endstream +endobj +5301 0 obj << +/Type /Page +/Contents 5302 0 R +/Resources 5300 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5034 0 R +>> endobj +5303 0 obj << +/D [5301 0 R /XYZ 71.731 729.2652 null] +>> endobj +5304 0 obj << +/D [5301 0 R /XYZ 76.7123 708.3437 null] +>> endobj +5305 0 obj << +/D [5301 0 R /XYZ 139.477 690.4109 null] +>> endobj +5306 0 obj << +/D [5301 0 R /XYZ 139.477 690.4109 null] +>> endobj +5307 0 obj << +/D [5301 0 R /XYZ 71.731 688.2541 null] +>> endobj +5308 0 obj << +/D [5301 0 R /XYZ 71.731 688.2541 null] +>> endobj +5309 0 obj << +/D [5301 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5310 0 obj << +/D [5301 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5311 0 obj << +/D [5301 0 R /XYZ 139.477 636.6127 null] +>> endobj +5312 0 obj << +/D [5301 0 R /XYZ 139.477 636.6127 null] +>> endobj +810 0 obj << +/D [5301 0 R /XYZ 71.731 613.6986 null] +>> endobj +358 0 obj << +/D [5301 0 R /XYZ 227.1844 568.4443 null] +>> endobj +5313 0 obj << +/D [5301 0 R /XYZ 71.731 548.3039 null] +>> endobj +5314 0 obj << +/D [5301 0 R /XYZ 161.0655 535.5676 null] +>> endobj +5315 0 obj << +/D [5301 0 R /XYZ 71.731 523.4481 null] +>> endobj +5316 0 obj << +/D [5301 0 R /XYZ 71.731 492.4185 null] +>> endobj +5317 0 obj << +/D [5301 0 R /XYZ 168.8063 481.072 null] +>> endobj +5318 0 obj << +/D [5301 0 R /XYZ 71.731 468.9525 null] +>> endobj +5319 0 obj << +/D [5301 0 R /XYZ 71.731 437.5866 null] +>> endobj +5320 0 obj << +/D [5301 0 R /XYZ 181.5683 426.5763 null] +>> endobj +5321 0 obj << +/D [5301 0 R /XYZ 71.731 416.5141 null] +>> endobj +5322 0 obj << +/D [5301 0 R /XYZ 71.731 383.091 null] +>> endobj +5323 0 obj << +/D [5301 0 R /XYZ 71.731 371.9811 null] +>> endobj +5324 0 obj << +/D [5301 0 R /XYZ 71.731 370.7358 null] +>> endobj +5325 0 obj << +/D [5301 0 R /XYZ 129.5143 351.6573 null] +>> endobj +5326 0 obj << +/D [5301 0 R /XYZ 129.5143 351.6573 null] +>> endobj +5327 0 obj << +/D [5301 0 R /XYZ 71.731 350.2177 null] +>> endobj +5328 0 obj << +/D [5301 0 R /XYZ 71.731 350.2177 null] +>> endobj +5329 0 obj << +/D [5301 0 R /XYZ 139.477 333.7245 null] +>> endobj +5330 0 obj << +/D [5301 0 R /XYZ 139.477 333.7245 null] +>> endobj +5331 0 obj << +/D [5301 0 R /XYZ 71.731 295.8665 null] +>> endobj +5332 0 obj << +/D [5301 0 R /XYZ 71.731 282.8155 null] +>> endobj +5333 0 obj << +/D [5301 0 R /XYZ 71.731 281.5702 null] +>> endobj +5334 0 obj << +/D [5301 0 R /XYZ 129.5143 262.4916 null] +>> endobj +811 0 obj << +/D [5301 0 R /XYZ 71.731 255.3535 null] +>> endobj +362 0 obj << +/D [5301 0 R /XYZ 189.6208 212.256 null] +>> endobj +5335 0 obj << +/D [5301 0 R /XYZ 71.731 192.1156 null] +>> endobj +5336 0 obj << +/D [5301 0 R /XYZ 161.0655 179.3793 null] +>> endobj +5337 0 obj << +/D [5301 0 R /XYZ 71.731 167.2598 null] +>> endobj +5338 0 obj << +/D [5301 0 R /XYZ 71.731 135.8939 null] +>> endobj +5339 0 obj << +/D [5301 0 R /XYZ 168.8063 124.8837 null] +>> endobj +5300 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5342 0 obj << +/Length 1401 +/Filter /FlateDecode +>> +stream +xÚ½Y]oÛ6}ϯÐc Ô?E©oÙ°2ÀHݧu([i„*r Ë(òïw%Š2e]ŠJ‡}òÃŠEþ±H3¢\xJx¬x´{¾¢ÑWxt{ÅzȺǬ]Я۫_þ4JIó8Ú>F"‰Ò2҂“D±$Úîÿ¾þí){iòzµæŠ^sb®›2«òæ.{0?o6ÌÍ_yótØWÿlÿ¼ú};ÔWB“4"³$Ԕ&O£hƲ¥Éà©bRDš&DH¡;ž÷ysª«£á‘Uýµ®³Ws{x4×cSŸvMÛª&+ª¢új~ïsøYÚN§Æܾäy}ìÇþáÑþ­>ª/Ÿ)åå PÑ·=¾ä»¢}”ï-£ý1C±­ÖJ²¬#±ŠE7ÄbŸWéµî{9ÔN“î®Êžóã»ñÓÌ:Rˀš¦.Vœ^ŸšsUùêH`nŸ³f÷4hÖ<åæf¬Ä÷¢,ÍÝCÿ¼îÞP¾?눌р:Uórôª:á7ИH?z©s´€Ngµs"ÖýíºM„ŽÓnÊò°âêú»-p(óãû¡ùÙ©¶5‡²$íZgûç¢êÙW‡}¾´êfŘÞ.Hlª¹c B¡˜Ž”Ö„ %ш ¨µ ³ƒøiʺˆMzk)|æ\Mêrd­{y=ó°­¦; £1lqE(±.lN kƒÔ]¢ ÂÓÆ偻凎ZœÒöÿ^BÁtP3Á´¨p0‘ªK‚yIÃL—GL{®ºL&œæyÊÆZËN4“¡€º°°  ±º Lˆñ@L8âñ–3ì0¶7 eӅÍÉbaaYºKdAx`²¸<–¯¦¨R}”_³8Kåå€ +Æ«º –x,G<ºõòT—ÿs,Î"K6ç? û©»ÄÌ.Ù†Ÿîï.iö_peB§³yÌô¯âžÂ^Ç¢Z>Iìýb‹üD‹Â½endstream +endobj +5341 0 obj << +/Type /Page +/Contents 5342 0 R +/Resources 5340 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5343 0 obj << +/D [5341 0 R /XYZ 71.731 729.2652 null] +>> endobj +5344 0 obj << +/D [5341 0 R /XYZ 71.731 718.3063 null] +>> endobj +5345 0 obj << +/D [5341 0 R /XYZ 71.731 663.1647 null] +>> endobj +5346 0 obj << +/D [5341 0 R /XYZ 181.5683 652.1544 null] +>> endobj +5347 0 obj << +/D [5341 0 R /XYZ 71.731 642.0922 null] +>> endobj +5348 0 obj << +/D [5341 0 R /XYZ 71.731 609.3146 null] +>> endobj +5349 0 obj << +/D [5341 0 R /XYZ 71.731 597.5592 null] +>> endobj +5350 0 obj << +/D [5341 0 R /XYZ 71.731 596.3139 null] +>> endobj +5351 0 obj << +/D [5341 0 R /XYZ 129.5143 577.2354 null] +>> endobj +5352 0 obj << +/D [5341 0 R /XYZ 129.5143 577.2354 null] +>> endobj +5353 0 obj << +/D [5341 0 R /XYZ 71.731 575.7958 null] +>> endobj +5354 0 obj << +/D [5341 0 R /XYZ 71.731 575.7958 null] +>> endobj +5355 0 obj << +/D [5341 0 R /XYZ 139.477 559.3026 null] +>> endobj +5356 0 obj << +/D [5341 0 R /XYZ 139.477 559.3026 null] +>> endobj +5357 0 obj << +/D [5341 0 R /XYZ 76.7123 541.3699 null] +>> endobj +5358 0 obj << +/D [5341 0 R /XYZ 129.5143 523.4371 null] +>> endobj +5359 0 obj << +/D [5341 0 R /XYZ 129.5143 523.4371 null] +>> endobj +5360 0 obj << +/D [5341 0 R /XYZ 71.731 521.2803 null] +>> endobj +5361 0 obj << +/D [5341 0 R /XYZ 71.731 521.2803 null] +>> endobj +5362 0 obj << +/D [5341 0 R /XYZ 139.477 505.5044 null] +>> endobj +5363 0 obj << +/D [5341 0 R /XYZ 71.731 503.3475 null] +>> endobj +5364 0 obj << +/D [5341 0 R /XYZ 71.731 503.3475 null] +>> endobj +5365 0 obj << +/D [5341 0 R /XYZ 149.4396 487.5716 null] +>> endobj +5366 0 obj << +/D [5341 0 R /XYZ 71.731 486.1321 null] +>> endobj +5367 0 obj << +/D [5341 0 R /XYZ 149.4396 469.6388 null] +>> endobj +5368 0 obj << +/D [5341 0 R /XYZ 76.7123 451.7061 null] +>> endobj +5369 0 obj << +/D [5341 0 R /XYZ 139.477 433.7733 null] +>> endobj +5370 0 obj << +/D [5341 0 R /XYZ 71.731 432.3338 null] +>> endobj +5371 0 obj << +/D [5341 0 R /XYZ 71.731 432.3338 null] +>> endobj +5372 0 obj << +/D [5341 0 R /XYZ 149.4396 415.8406 null] +>> endobj +5373 0 obj << +/D [5341 0 R /XYZ 149.4396 415.8406 null] +>> endobj +5374 0 obj << +/D [5341 0 R /XYZ 71.731 413.6838 null] +>> endobj +5375 0 obj << +/D [5341 0 R /XYZ 71.731 413.6838 null] +>> endobj +5376 0 obj << +/D [5341 0 R /XYZ 159.4023 397.9078 null] +>> endobj +5377 0 obj << +/D [5341 0 R /XYZ 71.731 395.751 null] +>> endobj +5378 0 obj << +/D [5341 0 R /XYZ 159.4023 379.9751 null] +>> endobj +5379 0 obj << +/D [5341 0 R /XYZ 76.7123 362.0423 null] +>> endobj +5380 0 obj << +/D [5341 0 R /XYZ 149.4396 344.1096 null] +>> endobj +5381 0 obj << +/D [5341 0 R /XYZ 149.4396 344.1096 null] +>> endobj +5382 0 obj << +/D [5341 0 R /XYZ 71.731 341.9528 null] +>> endobj +5383 0 obj << +/D [5341 0 R /XYZ 71.731 341.9528 null] +>> endobj +5384 0 obj << +/D [5341 0 R /XYZ 159.4023 326.1768 null] +>> endobj +5385 0 obj << +/D [5341 0 R /XYZ 71.731 324.02 null] +>> endobj +5386 0 obj << +/D [5341 0 R /XYZ 159.4023 308.2441 null] +>> endobj +5387 0 obj << +/D [5341 0 R /XYZ 76.7123 290.3113 null] +>> endobj +5388 0 obj << +/D [5341 0 R /XYZ 149.4396 272.3786 null] +>> endobj +5389 0 obj << +/D [5341 0 R /XYZ 149.4396 272.3786 null] +>> endobj +5390 0 obj << +/D [5341 0 R /XYZ 71.731 270.2217 null] +>> endobj +5391 0 obj << +/D [5341 0 R /XYZ 71.731 270.2217 null] +>> endobj +5392 0 obj << +/D [5341 0 R /XYZ 159.4023 254.4458 null] +>> endobj +5393 0 obj << +/D [5341 0 R /XYZ 71.731 253.0063 null] +>> endobj +5394 0 obj << +/D [5341 0 R /XYZ 159.4023 236.5131 null] +>> endobj +5395 0 obj << +/D [5341 0 R /XYZ 76.7123 218.5803 null] +>> endobj +5396 0 obj << +/D [5341 0 R /XYZ 149.4396 200.6476 null] +>> endobj +5397 0 obj << +/D [5341 0 R /XYZ 149.4396 200.6476 null] +>> endobj +5398 0 obj << +/D [5341 0 R /XYZ 71.731 198.4907 null] +>> endobj +5399 0 obj << +/D [5341 0 R /XYZ 71.731 198.4907 null] +>> endobj +5400 0 obj << +/D [5341 0 R /XYZ 159.4023 182.7148 null] +>> endobj +5401 0 obj << +/D [5341 0 R /XYZ 71.731 180.558 null] +>> endobj +5402 0 obj << +/D [5341 0 R /XYZ 159.4023 164.7821 null] +>> endobj +5403 0 obj << +/D [5341 0 R /XYZ 76.7123 146.8493 null] +>> endobj +5404 0 obj << +/D [5341 0 R /XYZ 149.4396 128.9166 null] +>> endobj +5405 0 obj << +/D [5341 0 R /XYZ 149.4396 128.9166 null] +>> endobj +5406 0 obj << +/D [5341 0 R /XYZ 71.731 126.7597 null] +>> endobj +5407 0 obj << +/D [5341 0 R /XYZ 71.731 126.7597 null] +>> endobj +5408 0 obj << +/D [5341 0 R /XYZ 159.4023 110.9838 null] +>> endobj +5409 0 obj << +/D [5341 0 R /XYZ 71.731 108.827 null] +>> endobj +5340 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5413 0 obj << +/Length 1150 +/Filter /FlateDecode +>> +stream +xÚ½™Koã6…÷ùZÚ@Íò)’³›mÐ"‚wÕ)­Œ…É؁,·È¿ï•%ʔtI*è ÈB~ñ}¼”b–Qøc™fD 8pKx®x¶ývC³/ðÕí ë$«N³òE?­o~üUÐÌ›ó<[?fÂæDi™iÁ‰QÌdëÝ_‹Ÿ÷›çº¨–+®è‚“öxÿ´9õÝæsûöýýoí‹?Šzܝ–¯¿ùeÝ×WBk HÔ¤0†()²§Är¦P“–H0 +s¡†)t?n3MX3O˜K¯ëeÍd>q®Ææ˜bÄ*Ê3@Ww|¼úpg¡>®™2>(C›ªÚ¼´‘Ûã©®Ê׺| —xíŸî&Ι%J1å"'9ãOÌ©V¾ìš˜Õ´Ml2Z01Îa*Œ£uɹ³¦>„É $–Ë‹`D1à`à£*êsuxx,‹§–¯QΚɍ€Rú]›Ys®]¬w婦þ‰R~ñò®>¶Ç¶ØtÚÎ3$×Öâq;Õʗ!€NF Æ Ë‘riѺá¸ÝY¨P€j=´ÑÂ؁@ËÌGQb¨•Á‡KB§wA$•ÔDJÍHú²’½,‰$Vw’˜/#w­>ðE|ÞÖAp”{ǗEÀéeIp°º3À™ø®ÓœÃqW<”è +•Š€”¿v…6#vËóñØ5Å÷åvß-Ù}Ù}ûÜ÷L÷Éæ »QU֛º\rµøgÉÔ¢˜†ÔMƒ1¢ ËñkӉV¾ +¹4㱂WFÂîatŽV _wjÃÃÕí}å! ¦ÔŠèÐÜ{.=UK§JR‰åØʤïákñ"’ˆJ¾–ȯKF#€éå-À”Jm„ˆƒé«Â`öª$˜XÕ`b60>¢`r™i“"ӓÅÐt²4›HÝ9pŽ}àtú6ž‹êt<U9áƘ×z>Á o&pÝU‚Ì«(f'Js9-9Ë©ŒJÏD J‘·&*¥/‹@Ù˒Pbug@9ñB9°ÑpqØ|+ænぇ7ž"ÜO2“§–¶/‹¥èd鑺sRûÀSôm4)>œ«§ÿ™bô°Ÿ?åJ¦Â¼ªbYvªt”Ó¢s’™Àƒô<œžÊmè®ò¶Ô¾¶A^F|‹)˜$‚³Äæí«Â=²W%›$VuF—Äl mrà#Ö'¹6D*•Zá¾,Be/Kb‰ÕÁåÄ +æÀÜ["LÂS«ÐRÌZÜ·÷·hçÏåä3nN¡…¤%=U,ÚN•NvZtN°#x®ž‡íf[T5’¬Dç€àœd?~¼›&ی[6ÿôÙnêðÖÄ%'ÊÒd¸ž,–®“¥ãEêÎÉwìØ·q*ëïüœÞŒø•sIr¥7¾*ÜQ{U²£bUgtTÌÒQ>b•C´å .=UK§JR‰åØʤïár·TîðçtEõh“‡˜&K¾Ü‡vyÃ'£ét?HC ËmôWO3ý‘Dq × +v?§j<üÉ)øù –endstream +endobj +5412 0 obj << +/Type /Page +/Contents 5413 0 R +/Resources 5411 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5414 0 obj << +/D [5412 0 R /XYZ 71.731 729.2652 null] +>> endobj +5415 0 obj << +/D [5412 0 R /XYZ 71.731 741.2204 null] +>> endobj +5416 0 obj << +/D [5412 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5417 0 obj << +/D [5412 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5418 0 obj << +/D [5412 0 R /XYZ 129.5143 636.6127 null] +>> endobj +5419 0 obj << +/D [5412 0 R /XYZ 129.5143 636.6127 null] +>> endobj +5420 0 obj << +/D [5412 0 R /XYZ 71.731 634.4559 null] +>> endobj +5421 0 obj << +/D [5412 0 R /XYZ 71.731 634.4559 null] +>> endobj +5422 0 obj << +/D [5412 0 R /XYZ 139.477 618.6799 null] +>> endobj +5423 0 obj << +/D [5412 0 R /XYZ 71.731 580.8219 null] +>> endobj +5424 0 obj << +/D [5412 0 R /XYZ 71.731 567.7709 null] +>> endobj +5425 0 obj << +/D [5412 0 R /XYZ 71.731 566.5256 null] +>> endobj +5426 0 obj << +/D [5412 0 R /XYZ 129.5143 547.4471 null] +>> endobj +5427 0 obj << +/D [5412 0 R /XYZ 71.731 545.2902 null] +>> endobj +5428 0 obj << +/D [5412 0 R /XYZ 71.731 545.2902 null] +>> endobj +5429 0 obj << +/D [5412 0 R /XYZ 139.477 529.5143 null] +>> endobj +5430 0 obj << +/D [5412 0 R /XYZ 139.477 529.5143 null] +>> endobj +5431 0 obj << +/D [5412 0 R /XYZ 71.731 527.3575 null] +>> endobj +5432 0 obj << +/D [5412 0 R /XYZ 71.731 527.3575 null] +>> endobj +5433 0 obj << +/D [5412 0 R /XYZ 149.4396 511.5816 null] +>> endobj +5434 0 obj << +/D [5412 0 R /XYZ 76.7123 493.6488 null] +>> endobj +5435 0 obj << +/D [5412 0 R /XYZ 139.477 475.716 null] +>> endobj +5436 0 obj << +/D [5412 0 R /XYZ 139.477 475.716 null] +>> endobj +5437 0 obj << +/D [5412 0 R /XYZ 71.731 473.5592 null] +>> endobj +5438 0 obj << +/D [5412 0 R /XYZ 71.731 473.5592 null] +>> endobj +5439 0 obj << +/D [5412 0 R /XYZ 149.4396 457.7833 null] +>> endobj +5440 0 obj << +/D [5412 0 R /XYZ 76.7123 439.8505 null] +>> endobj +5441 0 obj << +/D [5412 0 R /XYZ 139.477 421.9178 null] +>> endobj +5442 0 obj << +/D [5412 0 R /XYZ 139.477 421.9178 null] +>> endobj +5443 0 obj << +/D [5412 0 R /XYZ 71.731 419.761 null] +>> endobj +5444 0 obj << +/D [5412 0 R /XYZ 71.731 419.761 null] +>> endobj +5445 0 obj << +/D [5412 0 R /XYZ 149.4396 403.985 null] +>> endobj +5446 0 obj << +/D [5412 0 R /XYZ 76.7123 386.0523 null] +>> endobj +5447 0 obj << +/D [5412 0 R /XYZ 139.477 368.1195 null] +>> endobj +5448 0 obj << +/D [5412 0 R /XYZ 139.477 368.1195 null] +>> endobj +5449 0 obj << +/D [5412 0 R /XYZ 71.731 365.9627 null] +>> endobj +5450 0 obj << +/D [5412 0 R /XYZ 139.477 350.1868 null] +>> endobj +5451 0 obj << +/D [5412 0 R /XYZ 139.477 350.1868 null] +>> endobj +5452 0 obj << +/D [5412 0 R /XYZ 71.731 348.03 null] +>> endobj +5453 0 obj << +/D [5412 0 R /XYZ 139.477 332.254 null] +>> endobj +5454 0 obj << +/D [5412 0 R /XYZ 139.477 332.254 null] +>> endobj +5455 0 obj << +/D [5412 0 R /XYZ 71.731 330.0972 null] +>> endobj +5456 0 obj << +/D [5412 0 R /XYZ 71.731 330.0972 null] +>> endobj +5457 0 obj << +/D [5412 0 R /XYZ 149.4396 314.3213 null] +>> endobj +5458 0 obj << +/D [5412 0 R /XYZ 76.7123 296.3885 null] +>> endobj +5459 0 obj << +/D [5412 0 R /XYZ 139.477 278.4558 null] +>> endobj +5460 0 obj << +/D [5412 0 R /XYZ 139.477 278.4558 null] +>> endobj +5461 0 obj << +/D [5412 0 R /XYZ 71.731 276.2989 null] +>> endobj +5462 0 obj << +/D [5412 0 R /XYZ 139.477 260.523 null] +>> endobj +5463 0 obj << +/D [5412 0 R /XYZ 139.477 260.523 null] +>> endobj +5464 0 obj << +/D [5412 0 R /XYZ 71.731 258.3662 null] +>> endobj +5465 0 obj << +/D [5412 0 R /XYZ 139.477 242.5903 null] +>> endobj +5466 0 obj << +/D [5412 0 R /XYZ 139.477 242.5903 null] +>> endobj +5467 0 obj << +/D [5412 0 R /XYZ 71.731 240.4334 null] +>> endobj +5468 0 obj << +/D [5412 0 R /XYZ 71.731 240.4334 null] +>> endobj +5469 0 obj << +/D [5412 0 R /XYZ 149.4396 224.6575 null] +>> endobj +5470 0 obj << +/D [5412 0 R /XYZ 76.7123 206.7248 null] +>> endobj +5471 0 obj << +/D [5412 0 R /XYZ 139.477 188.792 null] +>> endobj +5472 0 obj << +/D [5412 0 R /XYZ 139.477 188.792 null] +>> endobj +812 0 obj << +/D [5412 0 R /XYZ 71.731 165.8779 null] +>> endobj +5411 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5475 0 obj << +/Length 1376 +/Filter /FlateDecode +>> +stream +xÚµY]o£8}ï¯à1‘/6üuö£šÕ®Ívž¶« nƒD gGý÷{  \>V£Q áØ÷Üãs}MCþ¨#(\XDXÀ™sºÜ¹Î0Idåê 2W8«šIŽe¡ +õ~•º!Œê¨íØ£$ aTСdY‡¨óv¹ßÔù¾ùx­Ÿ}}v]–i }w×>)¥º•Í™%Œ£Ƀ‰i“üEV§2½ª´È—hz°–kh~®£µã¼½–eüÞܯ͵Råí¤ZÜ©ÈUœæiþÖ|N$|ÌÌ$/ÅM5·· +²l}ñéO¼þ2mÇVWyJëÌÃ("(êh:k°ÌÂJðÀ«SL™«fÖ²¥(û!y|‘ÕýðûØN‰Ò€”*ӗ=ƒïT?Cž½[É7·—XÎZê,%l ¾¥YÖܽHÛ 2éD²ÙeVÏ ¿ŽÆDôÁr.Ñ2tx"¨é|é³îÖNÉÓ¹Sâ}̦+S¹g|÷¯.J¹l)`}©dÖ@·ŽŸÆÓϤ={Dî°]‚ýð´]Ä*U«‡ä’æc-ò"‘ßG66ëŸNÅ-WÙº=ëNï3Fb…žÍW*ÌFÍ©C­ ‹ºÁHÃßiÀã%-žBOð³ÊdÇ_2±-«‹î{Ä ÙLiÔÁ†!’Nf›Õ”ƒ:ÎeXÜyMÍ(”‡¥.ó†<Åù1-ÞÊøzÞóÝû¼(ŒÊ×$é@K‚4 u9&·ˆ1a€IÑ3˜uÇmÚª7ÂB¥mÔ|v¨Õ +Ä¢n¨À ¼<^Ó²R_õ?0ðC- áÝí"”xúºì:¶à»¶ê<,îïa<÷ x Ìö˜ö/çíá߈ŽëÃ=x£‹ÖäéQKê´¨uq¦A·h3%Ic‘X«Ì­b™Â¢^i¼µ"µP EjPëEŠDÝR¤c3EjóÈâ…uIäF?¤YF ô±—=h¡> endobj +5476 0 obj << +/D [5474 0 R /XYZ 71.731 729.2652 null] +>> endobj +366 0 obj << +/D [5474 0 R /XYZ 210.6581 705.7477 null] +>> endobj +5477 0 obj << +/D [5474 0 R /XYZ 71.731 685.6073 null] +>> endobj +5478 0 obj << +/D [5474 0 R /XYZ 161.0655 672.871 null] +>> endobj +5479 0 obj << +/D [5474 0 R /XYZ 71.731 660.7515 null] +>> endobj +5480 0 obj << +/D [5474 0 R /XYZ 71.731 551.5774 null] +>> endobj +5481 0 obj << +/D [5474 0 R /XYZ 71.731 508.3396 null] +>> endobj +5482 0 obj << +/D [5474 0 R /XYZ 181.5683 497.3293 null] +>> endobj +5483 0 obj << +/D [5474 0 R /XYZ 71.731 487.2671 null] +>> endobj +5484 0 obj << +/D [5474 0 R /XYZ 71.731 453.8439 null] +>> endobj +5485 0 obj << +/D [5474 0 R /XYZ 71.731 442.7341 null] +>> endobj +5486 0 obj << +/D [5474 0 R /XYZ 71.731 441.4888 null] +>> endobj +5487 0 obj << +/D [5474 0 R /XYZ 129.5143 422.4102 null] +>> endobj +5488 0 obj << +/D [5474 0 R /XYZ 129.5143 422.4102 null] +>> endobj +5489 0 obj << +/D [5474 0 R /XYZ 71.731 420.9707 null] +>> endobj +5490 0 obj << +/D [5474 0 R /XYZ 71.731 420.9707 null] +>> endobj +5491 0 obj << +/D [5474 0 R /XYZ 139.477 404.4775 null] +>> endobj +5492 0 obj << +/D [5474 0 R /XYZ 139.477 404.4775 null] +>> endobj +5493 0 obj << +/D [5474 0 R /XYZ 76.7123 386.5447 null] +>> endobj +5494 0 obj << +/D [5474 0 R /XYZ 129.5143 368.612 null] +>> endobj +5495 0 obj << +/D [5474 0 R /XYZ 129.5143 368.612 null] +>> endobj +5496 0 obj << +/D [5474 0 R /XYZ 71.731 366.4552 null] +>> endobj +5497 0 obj << +/D [5474 0 R /XYZ 71.731 366.4552 null] +>> endobj +5498 0 obj << +/D [5474 0 R /XYZ 139.477 350.6792 null] +>> endobj +5499 0 obj << +/D [5474 0 R /XYZ 71.731 348.5224 null] +>> endobj +5500 0 obj << +/D [5474 0 R /XYZ 71.731 348.5224 null] +>> endobj +5501 0 obj << +/D [5474 0 R /XYZ 149.4396 332.7465 null] +>> endobj +5502 0 obj << +/D [5474 0 R /XYZ 71.731 331.3069 null] +>> endobj +5503 0 obj << +/D [5474 0 R /XYZ 149.4396 314.8137 null] +>> endobj +5504 0 obj << +/D [5474 0 R /XYZ 76.7123 296.881 null] +>> endobj +5505 0 obj << +/D [5474 0 R /XYZ 139.477 278.9482 null] +>> endobj +5506 0 obj << +/D [5474 0 R /XYZ 71.731 277.5087 null] +>> endobj +5507 0 obj << +/D [5474 0 R /XYZ 71.731 277.5087 null] +>> endobj +5508 0 obj << +/D [5474 0 R /XYZ 149.4396 261.0155 null] +>> endobj +5509 0 obj << +/D [5474 0 R /XYZ 149.4396 261.0155 null] +>> endobj +5510 0 obj << +/D [5474 0 R /XYZ 71.731 258.8586 null] +>> endobj +5511 0 obj << +/D [5474 0 R /XYZ 71.731 258.8586 null] +>> endobj +5512 0 obj << +/D [5474 0 R /XYZ 159.4023 243.0827 null] +>> endobj +5513 0 obj << +/D [5474 0 R /XYZ 71.731 240.9259 null] +>> endobj +5514 0 obj << +/D [5474 0 R /XYZ 159.4023 225.15 null] +>> endobj +5515 0 obj << +/D [5474 0 R /XYZ 76.7123 207.2172 null] +>> endobj +5516 0 obj << +/D [5474 0 R /XYZ 149.4396 189.2845 null] +>> endobj +5517 0 obj << +/D [5474 0 R /XYZ 149.4396 189.2845 null] +>> endobj +5518 0 obj << +/D [5474 0 R /XYZ 71.731 187.1276 null] +>> endobj +5519 0 obj << +/D [5474 0 R /XYZ 71.731 187.1276 null] +>> endobj +5520 0 obj << +/D [5474 0 R /XYZ 159.4023 171.3517 null] +>> endobj +5521 0 obj << +/D [5474 0 R /XYZ 71.731 169.1949 null] +>> endobj +5522 0 obj << +/D [5474 0 R /XYZ 159.4023 153.419 null] +>> endobj +5523 0 obj << +/D [5474 0 R /XYZ 76.7123 135.4862 null] +>> endobj +5524 0 obj << +/D [5474 0 R /XYZ 149.4396 117.5535 null] +>> endobj +5525 0 obj << +/D [5474 0 R /XYZ 149.4396 117.5535 null] +>> endobj +5526 0 obj << +/D [5474 0 R /XYZ 71.731 115.3966 null] +>> endobj +5527 0 obj << +/D [5474 0 R /XYZ 71.731 115.3966 null] +>> endobj +5528 0 obj << +/D [5474 0 R /XYZ 159.4023 99.6207 null] +>> endobj +5529 0 obj << +/D [5474 0 R /XYZ 71.731 97.4639 null] +>> endobj +5473 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5532 0 obj << +/Length 1338 +/Filter /FlateDecode +>> +stream +xÚ½š]oÛ6…ïó+t ÇO‘Ü]÷Ñ}`ŠÎwM(1“udC–7äߏªD…²_ñå†dÙî±Þ££ó”’kVPÿà +͈~Ã-á¥âÅÝÓ-ü_ý|ÁFÉÕ¨¹ŠE߯/¾}/ha‰-yY¬ï aK¢´,´àÄ(fŠõæÓåÕ¾síêŠ+zÉÉ°ý°­×ý^ÝOß}øuxð‡ëw›Ãêóú·‹ŸÖÓ|%4±ÆIšÆ%EqÅ)±œ)PĤ%ÒõÇB RèéX¸-4aýqúc™t“¬?˜kÎÕ©9¦±Šò"Þa˜{º}ñÞúxɔ)ïƒr1÷Qµmõà2½jšHJ‰–ƒ;R%à*n`jܧ6àŽ}tu·uÕ~mƚ9ÕÃ?‹(Ø£l© ÊøIŒíX–(è$C +ÍÍ((ä(èÌÇlýX¯„º 1ɔ’Ã0dcY*‘ Ãææ$ø€‰}`‹ìrH#=Ê7’²!1V-“8©P¡©$žÙ€Iœù8¶[€CfH)({#Ô”ÃH–j]á­ææ´ðµ.ö1«Ø/»° +쫇e¥„)ŠÁ˱L24hnF, –™ F$©‘"©4áF!Dƪe"'J$45ƒÈ30‘3¹¶¾¯ïª®Þ57_Ü3€§ñË$ãoA§ÿE„❱,Uà ÃkÌÍ©!àªaìcÖ¹îàºPºÃáïëÓ/à¾ôÏ܊©ËçåÀ8#’Y”ÛH– +,ÈðÀ€¹9> Àb·ÿ9ÑBaQJ"DǪe¢'J445ƒè30Ñ3®©n·à]¬¤DѓËÝÛÝnëª%9薚)ü-rɆr,K4s’¡Í„æf4ò4sæcŒ ¬ÕaLƹ1¾(y8#ÿ 4£7–¥2 +2<#`nNF€(£ØÇrsþ}l2&ˆáþàÓÀFª°A… LÍöÔÆ°±ýã®ùŸoO¹UÄXŠÑËMœdh¡¹M„|Mœù8¹óÒ¾g[7Dýõ¥æøtëÚ儴öÃý)EŠd©„‚ O˜›“àJ(öß®æ†6ÒÅ%'Ôr„ÔXµLê¤BI…¦fzf&uæcï\{³wíÁ_+×Ð +« ae©_÷sbÎ¥¿­±(¬‘,UŠëÌÍ©"àªbìãå“Í÷ýÅÛ®uõø:áÿ‚êkºúšR^©Â… K‘LKÂy‰’ÉRñ07'>À_ì#ùYñë%:¢É4%¢dæ±jóI…bMÍÀüÌŒùÌÇ×ûŠþž¸„ö+ŒÑo²&3ʼnäÃ<–%z:ÉОBs3z +ùz:ó1[^ÞÝÝíŽÍâ­\=¶õ®}Þw×TQÿ‡ /ÝïÚ§å…$Ò* ÷X–Š1Èð¹91> cØÂýÊɎ¨ÚñSÚ$õ‘hú B™Ff ê&>6‘ZÒý™â¥ßík,éã·"¤!†•6ùʼnHsþ½ Å ¡ÌÚiO½5c¿ ü¢ôXÕendstream +endobj +5531 0 obj << +/Type /Page +/Contents 5532 0 R +/Resources 5530 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5533 0 obj << +/D [5531 0 R /XYZ 71.731 729.2652 null] +>> endobj +5534 0 obj << +/D [5531 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5535 0 obj << +/D [5531 0 R /XYZ 76.7123 690.4109 null] +>> endobj +5536 0 obj << +/D [5531 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5537 0 obj << +/D [5531 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5538 0 obj << +/D [5531 0 R /XYZ 71.731 670.3214 null] +>> endobj +5539 0 obj << +/D [5531 0 R /XYZ 71.731 670.3214 null] +>> endobj +5540 0 obj << +/D [5531 0 R /XYZ 159.4023 654.5454 null] +>> endobj +5541 0 obj << +/D [5531 0 R /XYZ 71.731 652.3886 null] +>> endobj +5542 0 obj << +/D [5531 0 R /XYZ 159.4023 636.6127 null] +>> endobj +5543 0 obj << +/D [5531 0 R /XYZ 76.7123 618.6799 null] +>> endobj +5544 0 obj << +/D [5531 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5545 0 obj << +/D [5531 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5546 0 obj << +/D [5531 0 R /XYZ 71.731 598.5904 null] +>> endobj +5547 0 obj << +/D [5531 0 R /XYZ 71.731 598.5904 null] +>> endobj +5548 0 obj << +/D [5531 0 R /XYZ 159.4023 582.8144 null] +>> endobj +5549 0 obj << +/D [5531 0 R /XYZ 71.731 580.6576 null] +>> endobj +5550 0 obj << +/D [5531 0 R /XYZ 159.4023 564.8817 null] +>> endobj +5551 0 obj << +/D [5531 0 R /XYZ 76.7123 546.9489 null] +>> endobj +5552 0 obj << +/D [5531 0 R /XYZ 149.4396 529.0162 null] +>> endobj +5553 0 obj << +/D [5531 0 R /XYZ 149.4396 529.0162 null] +>> endobj +5554 0 obj << +/D [5531 0 R /XYZ 71.731 526.8593 null] +>> endobj +5555 0 obj << +/D [5531 0 R /XYZ 71.731 526.8593 null] +>> endobj +5556 0 obj << +/D [5531 0 R /XYZ 159.4023 511.0834 null] +>> endobj +5557 0 obj << +/D [5531 0 R /XYZ 71.731 508.9266 null] +>> endobj +5558 0 obj << +/D [5531 0 R /XYZ 159.4023 493.1507 null] +>> endobj +5559 0 obj << +/D [5531 0 R /XYZ 76.7123 475.2179 null] +>> endobj +5560 0 obj << +/D [5531 0 R /XYZ 149.4396 457.2852 null] +>> endobj +5561 0 obj << +/D [5531 0 R /XYZ 149.4396 457.2852 null] +>> endobj +5562 0 obj << +/D [5531 0 R /XYZ 71.731 455.1283 null] +>> endobj +5563 0 obj << +/D [5531 0 R /XYZ 71.731 455.1283 null] +>> endobj +5564 0 obj << +/D [5531 0 R /XYZ 159.4023 439.3524 null] +>> endobj +5565 0 obj << +/D [5531 0 R /XYZ 71.731 437.1956 null] +>> endobj +5566 0 obj << +/D [5531 0 R /XYZ 159.4023 421.4197 null] +>> endobj +5567 0 obj << +/D [5531 0 R /XYZ 76.7123 403.4869 null] +>> endobj +5568 0 obj << +/D [5531 0 R /XYZ 149.4396 385.5542 null] +>> endobj +5569 0 obj << +/D [5531 0 R /XYZ 149.4396 385.5542 null] +>> endobj +5570 0 obj << +/D [5531 0 R /XYZ 71.731 383.3973 null] +>> endobj +5571 0 obj << +/D [5531 0 R /XYZ 71.731 383.3973 null] +>> endobj +5572 0 obj << +/D [5531 0 R /XYZ 159.4023 367.6214 null] +>> endobj +5573 0 obj << +/D [5531 0 R /XYZ 71.731 366.1819 null] +>> endobj +5574 0 obj << +/D [5531 0 R /XYZ 159.4023 349.6887 null] +>> endobj +5575 0 obj << +/D [5531 0 R /XYZ 76.7123 331.7559 null] +>> endobj +5576 0 obj << +/D [5531 0 R /XYZ 149.4396 313.8231 null] +>> endobj +5577 0 obj << +/D [5531 0 R /XYZ 149.4396 313.8231 null] +>> endobj +5578 0 obj << +/D [5531 0 R /XYZ 71.731 311.6663 null] +>> endobj +5579 0 obj << +/D [5531 0 R /XYZ 71.731 311.6663 null] +>> endobj +5580 0 obj << +/D [5531 0 R /XYZ 159.4023 295.8904 null] +>> endobj +5581 0 obj << +/D [5531 0 R /XYZ 71.731 293.7336 null] +>> endobj +5582 0 obj << +/D [5531 0 R /XYZ 159.4023 277.9576 null] +>> endobj +5583 0 obj << +/D [5531 0 R /XYZ 76.7123 260.0249 null] +>> endobj +5584 0 obj << +/D [5531 0 R /XYZ 149.4396 242.0921 null] +>> endobj +5585 0 obj << +/D [5531 0 R /XYZ 149.4396 242.0921 null] +>> endobj +5586 0 obj << +/D [5531 0 R /XYZ 71.731 239.9353 null] +>> endobj +5587 0 obj << +/D [5531 0 R /XYZ 71.731 239.9353 null] +>> endobj +5588 0 obj << +/D [5531 0 R /XYZ 159.4023 224.1594 null] +>> endobj +5589 0 obj << +/D [5531 0 R /XYZ 71.731 222.0026 null] +>> endobj +5590 0 obj << +/D [5531 0 R /XYZ 159.4023 206.2266 null] +>> endobj +5591 0 obj << +/D [5531 0 R /XYZ 76.7123 188.2939 null] +>> endobj +5592 0 obj << +/D [5531 0 R /XYZ 149.4396 170.3611 null] +>> endobj +5593 0 obj << +/D [5531 0 R /XYZ 149.4396 170.3611 null] +>> endobj +5594 0 obj << +/D [5531 0 R /XYZ 71.731 168.2043 null] +>> endobj +5595 0 obj << +/D [5531 0 R /XYZ 71.731 168.2043 null] +>> endobj +5596 0 obj << +/D [5531 0 R /XYZ 159.4023 152.4284 null] +>> endobj +5597 0 obj << +/D [5531 0 R /XYZ 71.731 150.2715 null] +>> endobj +5598 0 obj << +/D [5531 0 R /XYZ 159.4023 134.4956 null] +>> endobj +5599 0 obj << +/D [5531 0 R /XYZ 76.7123 116.5629 null] +>> endobj +5600 0 obj << +/D [5531 0 R /XYZ 149.4396 98.6301 null] +>> endobj +5601 0 obj << +/D [5531 0 R /XYZ 149.4396 98.6301 null] +>> endobj +5602 0 obj << +/D [5531 0 R /XYZ 71.731 96.4733 null] +>> endobj +5603 0 obj << +/D [5531 0 R /XYZ 71.731 96.4733 null] +>> endobj +5530 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5606 0 obj << +/Length 1397 +/Filter /FlateDecode +>> +stream +xÚµ™Koã6…÷ùZÆ@Íò)’³ëô1h1‚Ö]u +C±•X¨c²2ÓþûR)Sòå#mŠ,l+GºGŸÎåÃ&6¤If^¨F´´Ø<ÝàâÑüëà ±’¥Õ,}ÑûÕÍ×?0\h¤KZ«‡‚é É É(R‚¨bµýýöÛ]õÜÕíbI¾¥hx½ÛW‡ºûXÝ¿¹ûqxósÝíŽÛÓâÕO7߯Æú‚I¤•)5ɔB‚³bI1ҔPD¸FÜ5÷‚bœÉñ^¨.$"ý}š{u£¬¿™O”Š¹9"ÒÓ¿ «;½øpg>.L‰0>0eSÍ¡ûj öÛɱm¶õ¡k>aL͑¹Gw7¥Æˆ¬l|Y„Í(K²êf°|l&>ª¶­þ,š×âbæÂR¥à&Q‚ô¬hé«XókYqs×J–`Õ0+wÖµ ¦ +eX•|úÌ|Ûª«×›¶6/ÛÞÏ p) _Ù×êÅïF˜–®% G•¨$T¦"èÉbt²tº9|@ô}\òö!k)¶Ã›®y²‡¾ìêƒýçfs|q\¿,ˆ9r>x¦I*¥N6´'‹Ñt²4M nMÀDÓ÷mèÿ °m[¡Ì\FxbðUá!`T%‡¨jÆpe&>žëº]7P÷sŒVoÛü¢äH)’j~_‰ë(Kƪ›WÈ׉K6ïj7ÙtGÈf³³‡vMàË8'Ý×ûãáñ¦ÇK¤¹J5»/‹Ñs²4= n=ÀDÏ÷mö7ê’„K5·§Š4·S¥›¨šÓÜsæö}|®Ûæ¡ÙT]s<¬ë¿ž›¶>N6ç¼õDÏ5CDàT¯û²HZGY2­P݌´B>€´N|¼zú¼ âÖ<”~Ýi˟ýlT÷Ç-Ûóû˳‚ÙJ(‘©‘À—ÅØ:Yš-P7‡-àbëûx‹iÿ¿â¶½m !&hbœðUáqbT%Ç ¨jÆ8qe'&>ꧪÙƒÙn3¥gk€S×6‡ÇäÐ`eÁSböl:9:x²X‚,` nN‚P‚}7wµÍSÕºÌ-ÏÀtÛ­‰^¤Õ1C\•ÉV÷d1PN–ÔÍø€@ù>‚éù·ìˆFB˜õcI!ìœjéË.ì´Ä»««ÙQŠ'¬fçκö1m]Ӎ‚p6õÑÖÝK{X?4õ~ Íí’"N›¶ð¼·ðÇæÔMùŸ¿é¯8Yn Å®oÛ# )jâvª¥/¢zuµ nF¦\ƒuøÝY /ªvÀžØ¸ jæBFK…¹‘ÂzI9:½ F’rŠ„Æ,I_‰ä(KFª›IȇÇÈ=«‰¸_6]08”rT +)Áñe‘àŒ²dp ºÁ¹ò1íSœ‰ûæ-¼*&Ðüj;ó}s|l«çÝ¢_¯ñáIÊU +Ÿ'‹ás²4> n¾¹Ÿoã¡iOÝúP™%Þ5EQ"ª”ŠPüÐ,¨°«A»4tׁ¥Ô4ÁÓSEp:U’&P4æÜÈÒ÷°¯"$1ÒXG@þj·(8iÆB¡YŠœ'‹¡s²4; n¼¹˜žoãŒïåyýÊüj#³mqce_Á~‘q.†-¨™ÊÔ¨éËb°, ¨›{î†íÛh{ð ‹a_"_»¨/mòãHk¦â›<_Þ䍪ä&ªš±Éƒlxӊ[íO|6dîùkH¿PŒ‡ÉSE²äTÉ(E3’47É÷Ð5ݾÎÍÑdÀ[-˜¸ugû·`ç +)؜¹_Í=Íõæ‚*„‰Öã•z' +þËë=endstream +endobj +5605 0 obj << +/Type /Page +/Contents 5606 0 R +/Resources 5604 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5607 0 obj << +/D [5605 0 R /XYZ 71.731 729.2652 null] +>> endobj +5608 0 obj << +/D [5605 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5609 0 obj << +/D [5605 0 R /XYZ 71.731 706.9041 null] +>> endobj +5610 0 obj << +/D [5605 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5611 0 obj << +/D [5605 0 R /XYZ 76.7123 672.4782 null] +>> endobj +5612 0 obj << +/D [5605 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5613 0 obj << +/D [5605 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5614 0 obj << +/D [5605 0 R /XYZ 71.731 652.3886 null] +>> endobj +5615 0 obj << +/D [5605 0 R /XYZ 71.731 652.3886 null] +>> endobj +5616 0 obj << +/D [5605 0 R /XYZ 159.4023 636.6127 null] +>> endobj +5617 0 obj << +/D [5605 0 R /XYZ 71.731 635.1731 null] +>> endobj +5618 0 obj << +/D [5605 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5619 0 obj << +/D [5605 0 R /XYZ 76.7123 600.7472 null] +>> endobj +5620 0 obj << +/D [5605 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5621 0 obj << +/D [5605 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5622 0 obj << +/D [5605 0 R /XYZ 71.731 580.6576 null] +>> endobj +5623 0 obj << +/D [5605 0 R /XYZ 71.731 580.6576 null] +>> endobj +5624 0 obj << +/D [5605 0 R /XYZ 159.4023 564.8817 null] +>> endobj +5625 0 obj << +/D [5605 0 R /XYZ 71.731 562.7248 null] +>> endobj +5626 0 obj << +/D [5605 0 R /XYZ 159.4023 546.9489 null] +>> endobj +5627 0 obj << +/D [5605 0 R /XYZ 76.7123 529.0162 null] +>> endobj +5628 0 obj << +/D [5605 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5629 0 obj << +/D [5605 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5630 0 obj << +/D [5605 0 R /XYZ 71.731 508.9266 null] +>> endobj +5631 0 obj << +/D [5605 0 R /XYZ 71.731 508.9266 null] +>> endobj +5632 0 obj << +/D [5605 0 R /XYZ 159.4023 493.1507 null] +>> endobj +5633 0 obj << +/D [5605 0 R /XYZ 71.731 490.9938 null] +>> endobj +5634 0 obj << +/D [5605 0 R /XYZ 159.4023 475.2179 null] +>> endobj +5635 0 obj << +/D [5605 0 R /XYZ 76.7123 457.2852 null] +>> endobj +5636 0 obj << +/D [5605 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5637 0 obj << +/D [5605 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5638 0 obj << +/D [5605 0 R /XYZ 71.731 437.1956 null] +>> endobj +5639 0 obj << +/D [5605 0 R /XYZ 71.731 437.1956 null] +>> endobj +5640 0 obj << +/D [5605 0 R /XYZ 159.4023 421.4197 null] +>> endobj +5641 0 obj << +/D [5605 0 R /XYZ 71.731 419.2628 null] +>> endobj +5642 0 obj << +/D [5605 0 R /XYZ 159.4023 403.4869 null] +>> endobj +5643 0 obj << +/D [5605 0 R /XYZ 76.7123 349.6887 null] +>> endobj +5644 0 obj << +/D [5605 0 R /XYZ 129.5143 331.7559 null] +>> endobj +5645 0 obj << +/D [5605 0 R /XYZ 129.5143 331.7559 null] +>> endobj +5646 0 obj << +/D [5605 0 R /XYZ 71.731 329.5991 null] +>> endobj +5647 0 obj << +/D [5605 0 R /XYZ 71.731 329.5991 null] +>> endobj +5648 0 obj << +/D [5605 0 R /XYZ 139.477 313.8231 null] +>> endobj +5649 0 obj << +/D [5605 0 R /XYZ 71.731 275.9651 null] +>> endobj +5650 0 obj << +/D [5605 0 R /XYZ 71.731 262.9141 null] +>> endobj +5651 0 obj << +/D [5605 0 R /XYZ 71.731 261.6688 null] +>> endobj +5652 0 obj << +/D [5605 0 R /XYZ 129.5143 242.5903 null] +>> endobj +5653 0 obj << +/D [5605 0 R /XYZ 71.731 240.4334 null] +>> endobj +5654 0 obj << +/D [5605 0 R /XYZ 71.731 240.4334 null] +>> endobj +5655 0 obj << +/D [5605 0 R /XYZ 139.477 224.6575 null] +>> endobj +5656 0 obj << +/D [5605 0 R /XYZ 139.477 224.6575 null] +>> endobj +5657 0 obj << +/D [5605 0 R /XYZ 71.731 222.5007 null] +>> endobj +5658 0 obj << +/D [5605 0 R /XYZ 139.477 206.7248 null] +>> endobj +5659 0 obj << +/D [5605 0 R /XYZ 139.477 206.7248 null] +>> endobj +5660 0 obj << +/D [5605 0 R /XYZ 71.731 204.5679 null] +>> endobj +5661 0 obj << +/D [5605 0 R /XYZ 139.477 188.792 null] +>> endobj +5662 0 obj << +/D [5605 0 R /XYZ 139.477 188.792 null] +>> endobj +5663 0 obj << +/D [5605 0 R /XYZ 71.731 186.6352 null] +>> endobj +5664 0 obj << +/D [5605 0 R /XYZ 139.477 170.8593 null] +>> endobj +5665 0 obj << +/D [5605 0 R /XYZ 139.477 170.8593 null] +>> endobj +5666 0 obj << +/D [5605 0 R /XYZ 71.731 168.7024 null] +>> endobj +5667 0 obj << +/D [5605 0 R /XYZ 139.477 152.9265 null] +>> endobj +5668 0 obj << +/D [5605 0 R /XYZ 139.477 152.9265 null] +>> endobj +5669 0 obj << +/D [5605 0 R /XYZ 71.731 150.7697 null] +>> endobj +5670 0 obj << +/D [5605 0 R /XYZ 71.731 150.7697 null] +>> endobj +5671 0 obj << +/D [5605 0 R /XYZ 149.4396 134.9938 null] +>> endobj +5672 0 obj << +/D [5605 0 R /XYZ 76.7123 117.061 null] +>> endobj +5673 0 obj << +/D [5605 0 R /XYZ 139.477 99.1283 null] +>> endobj +5674 0 obj << +/D [5605 0 R /XYZ 139.477 99.1283 null] +>> endobj +5675 0 obj << +/D [5605 0 R /XYZ 71.731 96.9714 null] +>> endobj +5604 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5678 0 obj << +/Length 1254 +/Filter /FlateDecode +>> +stream +xÚ­Xю£6}Ÿ¯à1‘6®mllÏÛ¶ÛݶÚJÑ*}êT#¼´" Íß×ÌrÁ¤ªæÈ|î9Ø&6$‰Ð\¨B4â48œpðbþõåtM‡Ù¸ Ÿw?}q Šh쾡Š,!E’쒿W¿ãs­Ëõ†r¼¢¨½n³8×õ×xß>~ÜþÞÞü©ëc‘Tëv<üºëëóP %M‘Y’ KÄ"Š‘¢„ƒ(b†à„”0ø…¢Ÿ U@¤™¨™LëaÍlž(åcvÄLS¦w@[w|}çaߺåÊ@Q#vå*ĄÒ¸”YÃâJù]"Qâ¦Bƒyl%­ê2Í_>´¿'Ýޝã}3;åHaÄV]،€=Ì+ Tw€7<@4~è·ç´m´‘ˆ #Š—eü¶ŽøªÓñkZÕí]ñ½½þX¼ÒkÂWoíi¢ó:}˜겺qÇIPs•p?[ÐÆE:Çš”™ã"U§e¶o4œæc††I€!4¯§»,ŒPD¨ðu™›ë2 ówPwI—yÀ]æÒÐy¼ÏtwÇB »l_™ŽsëÕ¸ê~Ö:oïœñ`E›Êë[6§¨…ùê.QtÌVÔ¥QeéAO8—›ÔÇê^ã^G¼Ç²#Á„ϲjƲå·,Pu‰ee]s–åCRŸe]ØLƒõ0oƒAu4Ø °Á4ÎÇ"×@sΡTbæÛº[ ãÐL·#\Ê/§½YúLªÉ"¤˜ôÙՅͩia~5ºKÔó€Õtiœµ.ŸÏÆMEnL È*$"Q4’Õt`§éçæƒZ”:}éðRÙ¥¤kÖÎ띳›¢Óš›L"êÓ܁Íina~́ºK4ó€5wi”æ#2µ¶áÈ@é½ٌxGBrB–!›OH5=ʛPÕ ÑrÀc.!™àˆáó´ ›é¯æí/¨î‚þºáö׀Ɯ91Û3#넝ÿ‚Ý;©%ˆJîóª ›ÓÒÂüZu—h9ækéÒHâZ?Jm.œ‘@ O†ã'óVgáéÚ¤ÿãØÝy:“H’H͹;˜ÛwN¥Yø+ՏÔÔVdòü(ø/_Lendstream +endobj +5677 0 obj << +/Type /Page +/Contents 5678 0 R +/Resources 5676 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5410 0 R +>> endobj +5679 0 obj << +/D [5677 0 R /XYZ 71.731 729.2652 null] +>> endobj +5680 0 obj << +/D [5677 0 R /XYZ 139.477 708.3437 null] +>> endobj +5681 0 obj << +/D [5677 0 R /XYZ 139.477 708.3437 null] +>> endobj +5682 0 obj << +/D [5677 0 R /XYZ 71.731 706.1869 null] +>> endobj +5683 0 obj << +/D [5677 0 R /XYZ 139.477 690.4109 null] +>> endobj +5684 0 obj << +/D [5677 0 R /XYZ 139.477 690.4109 null] +>> endobj +5685 0 obj << +/D [5677 0 R /XYZ 71.731 688.2541 null] +>> endobj +5686 0 obj << +/D [5677 0 R /XYZ 71.731 688.2541 null] +>> endobj +5687 0 obj << +/D [5677 0 R /XYZ 149.4396 672.4782 null] +>> endobj +5688 0 obj << +/D [5677 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5689 0 obj << +/D [5677 0 R /XYZ 139.477 636.6127 null] +>> endobj +5690 0 obj << +/D [5677 0 R /XYZ 139.477 636.6127 null] +>> endobj +5691 0 obj << +/D [5677 0 R /XYZ 71.731 635.1731 null] +>> endobj +5692 0 obj << +/D [5677 0 R /XYZ 139.477 618.6799 null] +>> endobj +5693 0 obj << +/D [5677 0 R /XYZ 139.477 618.6799 null] +>> endobj +5694 0 obj << +/D [5677 0 R /XYZ 71.731 616.5231 null] +>> endobj +5695 0 obj << +/D [5677 0 R /XYZ 71.731 616.5231 null] +>> endobj +5696 0 obj << +/D [5677 0 R /XYZ 149.4396 600.7472 null] +>> endobj +5697 0 obj << +/D [5677 0 R /XYZ 76.7123 582.8144 null] +>> endobj +5698 0 obj << +/D [5677 0 R /XYZ 139.477 564.8817 null] +>> endobj +5699 0 obj << +/D [5677 0 R /XYZ 139.477 564.8817 null] +>> endobj +5700 0 obj << +/D [5677 0 R /XYZ 71.731 562.7248 null] +>> endobj +5701 0 obj << +/D [5677 0 R /XYZ 139.477 546.9489 null] +>> endobj +5702 0 obj << +/D [5677 0 R /XYZ 139.477 546.9489 null] +>> endobj +5703 0 obj << +/D [5677 0 R /XYZ 71.731 544.7921 null] +>> endobj +5704 0 obj << +/D [5677 0 R /XYZ 139.477 529.0162 null] +>> endobj +5705 0 obj << +/D [5677 0 R /XYZ 139.477 529.0162 null] +>> endobj +5706 0 obj << +/D [5677 0 R /XYZ 71.731 526.8593 null] +>> endobj +5707 0 obj << +/D [5677 0 R /XYZ 71.731 526.8593 null] +>> endobj +5708 0 obj << +/D [5677 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5709 0 obj << +/D [5677 0 R /XYZ 76.7123 493.1507 null] +>> endobj +5710 0 obj << +/D [5677 0 R /XYZ 139.477 475.2179 null] +>> endobj +5711 0 obj << +/D [5677 0 R /XYZ 139.477 475.2179 null] +>> endobj +5712 0 obj << +/D [5677 0 R /XYZ 71.731 473.7784 null] +>> endobj +5713 0 obj << +/D [5677 0 R /XYZ 139.477 457.2852 null] +>> endobj +5714 0 obj << +/D [5677 0 R /XYZ 139.477 457.2852 null] +>> endobj +5715 0 obj << +/D [5677 0 R /XYZ 71.731 455.8456 null] +>> endobj +5716 0 obj << +/D [5677 0 R /XYZ 139.477 439.3524 null] +>> endobj +5717 0 obj << +/D [5677 0 R /XYZ 139.477 439.3524 null] +>> endobj +5718 0 obj << +/D [5677 0 R /XYZ 71.731 437.1956 null] +>> endobj +5719 0 obj << +/D [5677 0 R /XYZ 71.731 437.1956 null] +>> endobj +5720 0 obj << +/D [5677 0 R /XYZ 149.4396 421.4197 null] +>> endobj +5721 0 obj << +/D [5677 0 R /XYZ 76.7123 403.4869 null] +>> endobj +5722 0 obj << +/D [5677 0 R /XYZ 139.477 385.5542 null] +>> endobj +5723 0 obj << +/D [5677 0 R /XYZ 139.477 385.5542 null] +>> endobj +5724 0 obj << +/D [5677 0 R /XYZ 71.731 383.3973 null] +>> endobj +5725 0 obj << +/D [5677 0 R /XYZ 139.477 367.6214 null] +>> endobj +5726 0 obj << +/D [5677 0 R /XYZ 139.477 367.6214 null] +>> endobj +813 0 obj << +/D [5677 0 R /XYZ 71.731 344.7073 null] +>> endobj +370 0 obj << +/D [5677 0 R /XYZ 190.3782 299.453 null] +>> endobj +5727 0 obj << +/D [5677 0 R /XYZ 71.731 279.3127 null] +>> endobj +5728 0 obj << +/D [5677 0 R /XYZ 161.0655 266.5763 null] +>> endobj +5729 0 obj << +/D [5677 0 R /XYZ 71.731 254.4568 null] +>> endobj +5730 0 obj << +/D [5677 0 R /XYZ 71.731 223.4272 null] +>> endobj +5731 0 obj << +/D [5677 0 R /XYZ 168.8063 212.0807 null] +>> endobj +5732 0 obj << +/D [5677 0 R /XYZ 71.731 199.9612 null] +>> endobj +5733 0 obj << +/D [5677 0 R /XYZ 71.731 168.5953 null] +>> endobj +5734 0 obj << +/D [5677 0 R /XYZ 181.5683 157.585 null] +>> endobj +5735 0 obj << +/D [5677 0 R /XYZ 71.731 147.5229 null] +>> endobj +5736 0 obj << +/D [5677 0 R /XYZ 71.731 114.0997 null] +>> endobj +5737 0 obj << +/D [5677 0 R /XYZ 71.731 102.9899 null] +>> endobj +5738 0 obj << +/D [5677 0 R /XYZ 71.731 101.7445 null] +>> endobj +5676 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5741 0 obj << +/Length 929 +/Filter /FlateDecode +>> +stream +xÚÅWËnÛ0¼ç+t´˜åS$sKŸhÑAê[SªM7B)hùû.õ2eђ.E‘åhȝw)aø#‘$H2¨F44Ú=]áè¼úpEZȦÅl|ÐëíÕ«÷ Gé˜ÆÑö1#!y$EJm÷ßVo“gkÊõ† +¼¢¨ï²$7ösò³ùy{÷±yøbìc±¯Öß·Ÿ®Þmûø‚I¤™$ɉBœam(FšD¢‘DB2X!ƙ쓡:‚8—Lëa.›JÅ9;B)ü»¸çã‰G7k̃©H¨1¯y@ʂp6ä‘í£ãQ“>íå»rÓHZÙò¸³×gB»ù&·é.±i‘ûÈciÆ ¶b' pPصña'a‰sŸP»(,øS®ƒq/ ÛÍó +Ë4âRi܂. êŠÅü}®ošÿêô ÈúÔ,W?Û¢U-2ì½;1Ì(0RXózå{»W7#=:KÆð@¤"3÷aïa³Å]`ð“ª'?ø<’²L^±ŠƒïÏËæÄQ.؜9=ؔ9;ؼ9q—˜óœG؜>lB·6«[(îÝF<‚º h”þ4t¢9FË3éÒÜúº5ÿÛ»cý€1…VÖ¬©H]¦Ž»!P©`nc"±jN2ôÁص<©VŒýjªÊ•…‰Åpd]ç”qSãïÊÂöåÙÜô3N‰¶s7” ˜¨¦xy!jÒX`Wèa$ ›n ?è[SíÊôٕ¯¥aÛrÕ6–fÈ͚ŠÕŸÖ‹>©ßk‚WfMĪ=Þéa0Jc{Y(Ú1/öfÔµL[Q«ãnËŽYö²ŽÅªÝ¹ƒ‹’3ÛÒ*`bù'­ Z*Äm–u]$g†jV“F’dÿ”æ-•çôÚˌ㎢5»Çk/żîœtI ¥nU=‚j¸.9×#|ØDèa³="wAñ_‚<þÏ%ˆ*¸/PÎg꥛¨—=l¶^†â.¨—#Áz9 ñŸ/AbÙ%ˆb¸.èÙ[¾›2x›7x îƒx.AY¿^ª¢¡v$$’Š±ZRÊDÜu#éu£ÔšêŸö¢:À µ©Tðæ‡k¦™”IJÞóúÉöU×·ümh¿D¹BŠÄzòcÕÌ¿UUP%àÖÔ¡iM/~yþBycendstream +endobj +5740 0 obj << +/Type /Page +/Contents 5741 0 R +/Resources 5739 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +5742 0 obj << +/D [5740 0 R /XYZ 71.731 729.2652 null] +>> endobj +5743 0 obj << +/D [5740 0 R /XYZ 129.5143 708.3437 null] +>> endobj +5744 0 obj << +/D [5740 0 R /XYZ 129.5143 708.3437 null] +>> endobj +5745 0 obj << +/D [5740 0 R /XYZ 71.731 706.9041 null] +>> endobj +5746 0 obj << +/D [5740 0 R /XYZ 71.731 706.9041 null] +>> endobj +5747 0 obj << +/D [5740 0 R /XYZ 139.477 690.4109 null] +>> endobj +5748 0 obj << +/D [5740 0 R /XYZ 139.477 690.4109 null] +>> endobj +5749 0 obj << +/D [5740 0 R /XYZ 71.731 652.5529 null] +>> endobj +5750 0 obj << +/D [5740 0 R /XYZ 71.731 639.5019 null] +>> endobj +5751 0 obj << +/D [5740 0 R /XYZ 71.731 638.2566 null] +>> endobj +5752 0 obj << +/D [5740 0 R /XYZ 129.5143 619.1781 null] +>> endobj +5753 0 obj << +/D [5740 0 R /XYZ 71.731 617.0212 null] +>> endobj +5754 0 obj << +/D [5740 0 R /XYZ 71.731 617.0212 null] +>> endobj +5755 0 obj << +/D [5740 0 R /XYZ 139.477 601.2453 null] +>> endobj +5756 0 obj << +/D [5740 0 R /XYZ 139.477 601.2453 null] +>> endobj +5757 0 obj << +/D [5740 0 R /XYZ 71.731 599.0885 null] +>> endobj +5758 0 obj << +/D [5740 0 R /XYZ 139.477 583.3126 null] +>> endobj +5759 0 obj << +/D [5740 0 R /XYZ 139.477 583.3126 null] +>> endobj +814 0 obj << +/D [5740 0 R /XYZ 71.731 560.3985 null] +>> endobj +374 0 obj << +/D [5740 0 R /XYZ 209.5216 515.1442 null] +>> endobj +5760 0 obj << +/D [5740 0 R /XYZ 71.731 495.0038 null] +>> endobj +5761 0 obj << +/D [5740 0 R /XYZ 161.0655 482.2675 null] +>> endobj +5762 0 obj << +/D [5740 0 R /XYZ 71.731 470.148 null] +>> endobj +5763 0 obj << +/D [5740 0 R /XYZ 71.731 439.1184 null] +>> endobj +5764 0 obj << +/D [5740 0 R /XYZ 168.8063 427.7718 null] +>> endobj +5765 0 obj << +/D [5740 0 R /XYZ 71.731 415.6524 null] +>> endobj +5766 0 obj << +/D [5740 0 R /XYZ 71.731 384.2865 null] +>> endobj +5767 0 obj << +/D [5740 0 R /XYZ 181.5683 373.2762 null] +>> endobj +5768 0 obj << +/D [5740 0 R /XYZ 71.731 363.214 null] +>> endobj +5769 0 obj << +/D [5740 0 R /XYZ 71.731 329.7908 null] +>> endobj +5770 0 obj << +/D [5740 0 R /XYZ 71.731 318.681 null] +>> endobj +5771 0 obj << +/D [5740 0 R /XYZ 71.731 317.4357 null] +>> endobj +5772 0 obj << +/D [5740 0 R /XYZ 129.5143 298.3571 null] +>> endobj +5773 0 obj << +/D [5740 0 R /XYZ 129.5143 298.3571 null] +>> endobj +5774 0 obj << +/D [5740 0 R /XYZ 71.731 296.9176 null] +>> endobj +5775 0 obj << +/D [5740 0 R /XYZ 71.731 296.9176 null] +>> endobj +5776 0 obj << +/D [5740 0 R /XYZ 139.477 280.4244 null] +>> endobj +5777 0 obj << +/D [5740 0 R /XYZ 139.477 280.4244 null] +>> endobj +5778 0 obj << +/D [5740 0 R /XYZ 71.731 242.5664 null] +>> endobj +5779 0 obj << +/D [5740 0 R /XYZ 71.731 229.5154 null] +>> endobj +5780 0 obj << +/D [5740 0 R /XYZ 71.731 228.2701 null] +>> endobj +5781 0 obj << +/D [5740 0 R /XYZ 129.5143 209.1915 null] +>> endobj +815 0 obj << +/D [5740 0 R /XYZ 71.731 202.0534 null] +>> endobj +378 0 obj << +/D [5740 0 R /XYZ 184.6453 158.9559 null] +>> endobj +5782 0 obj << +/D [5740 0 R /XYZ 71.731 138.8155 null] +>> endobj +5783 0 obj << +/D [5740 0 R /XYZ 161.0655 126.0792 null] +>> endobj +5784 0 obj << +/D [5740 0 R /XYZ 71.731 113.9597 null] +>> endobj +5739 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5788 0 obj << +/Length 1499 +/Filter /FlateDecode +>> +stream +xÚÕY]£6}Ÿ_‘ÇDš¸ØØ|ìÛ´Û­¦ÚV£é¬T©[­HðLDàh:ÿ¾&ØĆkÌH݇*äØ÷øøž‹mð*¼Š1ŠCy!)"#«ýñ&X½È¿~¹Á +²U˜­ úñéæ‡Oa°JQ‘hõô¼ +Ó±˜®â „ádõ”ÿµþ鐝o6[‚5Aýõ¡Ì*.>g»þëÝÃ}ó‡:o7?ýzóóÓŸ…1Jd–䀚Ò$©Aã1†ãU$(¤a|áù‘·û¦8‰¢®>tñ/Ù(¢]#Õ|K0Šp’^šÆ˜ä(iCVP[¦­,mزòë(|%„Mâ"½Ž w|½òЭ¦<ÂÄÐ˂Ã0 mÙYÙEA¡ƒ|0½r;ª†]ûÎ}û¬«J&òÜðé5Y£DV5PXÚš°«°¸+óր4Ì)¬œü€ÐŒëV·šò°… SDãئq'u韀º,B•¡±¾²‚h}Y}w½êÁ#îì 0JpB|ÙkÀæ²WÃüÙ Ä]’½cŽì5y\6ÏÅ¥ÆNeŽ0JSÌl™GKQ ûéÐOÅä·îQáÊhš„(Iõd´ ›ÉèæÍh(†x«•Ñw7!«º‹Jq¸^¶& +hܗS!*g_V|0ª[!Ý +¤a(D% ¹–´yH=”ÿæâÄ) Md¹MS0jFò D]" @ÆäaÕ¶«6mYìÕí©áFÿ¸ † Œz fÀæ ¦a~ƒq— à̤a?`͵çh5éÈ¢0¥ˆ챗‰rgрòfuAMhØÕ^g‘Å£ÌZñí|Ê3Á¡§j#Ä£UˤD9ÊØdxš@!’$kjÔքªNzsÊʤ@, `\·¬ºÈÃH;&y$´y\«ÖÇlØú蝙(Žê§W¹ ïdik”˜¯,›© E7SjÒO×­VZõÀåSodÚ¢ÒUàËï÷ªžOõþàž&wÅ,"¾Y1`s³¢aþYâ.™€4+&8Oÿ/¥Ëˆ\ÝÑ4ð•$5S’4Ê_’€¨KJҘ†£$™<º³…Åۧɚ>‡VPCð€Êåxì-Gl.ñ5̟ø@Ü%‰ð€ßäa­>õÉÄ5—µæ @$‘{+Â|•Á„Í4À¼Aqñ²x8³æ½š)cÉÿQÌähgMj¢Ü&P^“BQ˜tB6©Åãܔ€Gq‚¢ðû¸”t‡M$ò¹Ô„Í%¡†ù“ˆ»$ Pš<¬ŒûòøÙÖG¯ž²®"3¡»3ì>9½žPbÆ՘¢$¥Ø'¨›TÃü‚q— +ð€5yø\ýÝ4VÎÅq*·.‰§ +˜(wPÞ*E]P&4à*`ñ¸œÐƁˆÉ»oÀFAÊ|%À„Ídìóf,wAÆB<€Œµx¼û´c ŽBŸ›M؜6æ׈»D€¤Écvõþ¾Ã!Ĉ¤±Ï˜jƘå7&u‰1Ç4Æ4yð*ە|©1wu]rýžpƜ7 zKL”`ÇZ¿H60Ó÷Ȍ¨ã-ê(¦¡ó­0ð_Ã[ïPendstream +endobj +5787 0 obj << +/Type /Page +/Contents 5788 0 R +/Resources 5786 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +5789 0 obj << +/D [5787 0 R /XYZ 71.731 729.2652 null] +>> endobj +5790 0 obj << +/D [5787 0 R /XYZ 71.731 718.3063 null] +>> endobj +5791 0 obj << +/D [5787 0 R /XYZ 168.8063 708.3437 null] +>> endobj +5792 0 obj << +/D [5787 0 R /XYZ 71.731 696.2242 null] +>> endobj +5793 0 obj << +/D [5787 0 R /XYZ 71.731 641.5458 null] +>> endobj +5794 0 obj << +/D [5787 0 R /XYZ 181.5683 630.5355 null] +>> endobj +5795 0 obj << +/D [5787 0 R /XYZ 71.731 620.4733 null] +>> endobj +5796 0 obj << +/D [5787 0 R /XYZ 71.731 587.0501 null] +>> endobj +5797 0 obj << +/D [5787 0 R /XYZ 71.731 575.9403 null] +>> endobj +5798 0 obj << +/D [5787 0 R /XYZ 71.731 574.695 null] +>> endobj +5799 0 obj << +/D [5787 0 R /XYZ 129.5143 555.6164 null] +>> endobj +5800 0 obj << +/D [5787 0 R /XYZ 129.5143 555.6164 null] +>> endobj +5801 0 obj << +/D [5787 0 R /XYZ 71.731 554.1769 null] +>> endobj +5802 0 obj << +/D [5787 0 R /XYZ 71.731 554.1769 null] +>> endobj +5803 0 obj << +/D [5787 0 R /XYZ 139.477 537.6837 null] +>> endobj +5804 0 obj << +/D [5787 0 R /XYZ 139.477 537.6837 null] +>> endobj +5805 0 obj << +/D [5787 0 R /XYZ 76.7123 519.7509 null] +>> endobj +5806 0 obj << +/D [5787 0 R /XYZ 129.5143 501.8182 null] +>> endobj +5807 0 obj << +/D [5787 0 R /XYZ 129.5143 501.8182 null] +>> endobj +5808 0 obj << +/D [5787 0 R /XYZ 71.731 499.6613 null] +>> endobj +5809 0 obj << +/D [5787 0 R /XYZ 71.731 499.6613 null] +>> endobj +5810 0 obj << +/D [5787 0 R /XYZ 139.477 483.8854 null] +>> endobj +5811 0 obj << +/D [5787 0 R /XYZ 71.731 481.7286 null] +>> endobj +5812 0 obj << +/D [5787 0 R /XYZ 71.731 481.7286 null] +>> endobj +5813 0 obj << +/D [5787 0 R /XYZ 149.4396 465.9527 null] +>> endobj +5814 0 obj << +/D [5787 0 R /XYZ 71.731 464.5131 null] +>> endobj +5815 0 obj << +/D [5787 0 R /XYZ 149.4396 448.0199 null] +>> endobj +5816 0 obj << +/D [5787 0 R /XYZ 76.7123 430.0872 null] +>> endobj +5817 0 obj << +/D [5787 0 R /XYZ 139.477 412.1544 null] +>> endobj +5818 0 obj << +/D [5787 0 R /XYZ 71.731 410.7149 null] +>> endobj +5819 0 obj << +/D [5787 0 R /XYZ 71.731 410.7149 null] +>> endobj +5820 0 obj << +/D [5787 0 R /XYZ 149.4396 394.2217 null] +>> endobj +5821 0 obj << +/D [5787 0 R /XYZ 149.4396 394.2217 null] +>> endobj +5822 0 obj << +/D [5787 0 R /XYZ 71.731 392.0648 null] +>> endobj +5823 0 obj << +/D [5787 0 R /XYZ 71.731 392.0648 null] +>> endobj +5824 0 obj << +/D [5787 0 R /XYZ 159.4023 376.2889 null] +>> endobj +5825 0 obj << +/D [5787 0 R /XYZ 71.731 374.1321 null] +>> endobj +5826 0 obj << +/D [5787 0 R /XYZ 159.4023 358.3562 null] +>> endobj +5827 0 obj << +/D [5787 0 R /XYZ 76.7123 340.4234 null] +>> endobj +5828 0 obj << +/D [5787 0 R /XYZ 149.4396 322.4907 null] +>> endobj +5829 0 obj << +/D [5787 0 R /XYZ 149.4396 322.4907 null] +>> endobj +5830 0 obj << +/D [5787 0 R /XYZ 71.731 320.3338 null] +>> endobj +5831 0 obj << +/D [5787 0 R /XYZ 71.731 320.3338 null] +>> endobj +5832 0 obj << +/D [5787 0 R /XYZ 159.4023 304.5579 null] +>> endobj +5833 0 obj << +/D [5787 0 R /XYZ 71.731 302.4011 null] +>> endobj +5834 0 obj << +/D [5787 0 R /XYZ 159.4023 286.6252 null] +>> endobj +5835 0 obj << +/D [5787 0 R /XYZ 76.7123 268.6924 null] +>> endobj +5836 0 obj << +/D [5787 0 R /XYZ 149.4396 250.7596 null] +>> endobj +5837 0 obj << +/D [5787 0 R /XYZ 149.4396 250.7596 null] +>> endobj +5838 0 obj << +/D [5787 0 R /XYZ 71.731 248.6028 null] +>> endobj +5839 0 obj << +/D [5787 0 R /XYZ 71.731 248.6028 null] +>> endobj +5840 0 obj << +/D [5787 0 R /XYZ 159.4023 232.8269 null] +>> endobj +5841 0 obj << +/D [5787 0 R /XYZ 71.731 230.6701 null] +>> endobj +5842 0 obj << +/D [5787 0 R /XYZ 159.4023 214.8941 null] +>> endobj +5843 0 obj << +/D [5787 0 R /XYZ 76.7123 196.9614 null] +>> endobj +5844 0 obj << +/D [5787 0 R /XYZ 149.4396 179.0286 null] +>> endobj +5845 0 obj << +/D [5787 0 R /XYZ 149.4396 179.0286 null] +>> endobj +5846 0 obj << +/D [5787 0 R /XYZ 71.731 176.8718 null] +>> endobj +5847 0 obj << +/D [5787 0 R /XYZ 71.731 176.8718 null] +>> endobj +5848 0 obj << +/D [5787 0 R /XYZ 159.4023 161.0959 null] +>> endobj +5849 0 obj << +/D [5787 0 R /XYZ 71.731 159.6563 null] +>> endobj +5850 0 obj << +/D [5787 0 R /XYZ 159.4023 143.1631 null] +>> endobj +5851 0 obj << +/D [5787 0 R /XYZ 76.7123 125.2304 null] +>> endobj +5852 0 obj << +/D [5787 0 R /XYZ 149.4396 107.2976 null] +>> endobj +5853 0 obj << +/D [5787 0 R /XYZ 149.4396 107.2976 null] +>> endobj +5854 0 obj << +/D [5787 0 R /XYZ 71.731 105.1408 null] +>> endobj +5855 0 obj << +/D [5787 0 R /XYZ 71.731 105.1408 null] +>> endobj +5786 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5858 0 obj << +/Length 1412 +/Filter /FlateDecode +>> +stream +xÚÍZ]oÛ6}ϯÐc4œø)roÛºnÖ!ÀR À:²¥&l9°•4û÷£*R¦ì+^6K¶!’“cÝÃÃs.)E4ËíÍ +J +n̦$ËV›³<»±úéŒ:È¥Ã\† ï¯Ï¾yÃóÌ£˜Ê®?eÜ(" ‘œ-©Î®«?θ-ïºzwqÉd~ÎÈp¼Z—mÝýZ.‡ß]½NÞÕÝí¶Ú_üyýËُ×c}É b´-%ɵ&Rðì’åÄ0*A†KԎ%ׄ ^Œca&+íÇiÇ2âFX?˜ŒÉcrTRbdβð‚¾îññÀà äqДJË#g|Êc¹Ý®ë²}5¨ös¹N–uÝgu[.×uuÂՏJ™œšD£Ñh„¡Au4‚xMx”»]ù× Æö“Ó穲q[ (2%…u˜°jt¢ÑŽ¯5«™°£×…«Îkæ¿uJƒëL[͔˜Î]Èc½mošî¾ª{2G*K›ªÜô…z䷃`ÕöÞ +æTv!„w°Y7rEeæÆs£‡ánꦸà¹1ä1(àœ÷º^5›r=|8h>‘¬»u¿Ø7]D9ª‰* šãSÎÃp债)Ê< åB³vz61]"¥¶ËHºCÔ|ºGšn¨jBºOhÀéžðX—Ý\¸…$’öá–J­)î±èC- +ÕM°(Ä°è„Gď^ò'd[ +EŒÐX¶CXL8Åê¦ð€„ y|]¶Ÿ ¥#¥$׋v€ŠDÛ£ðhUS¢}Lc&Ú!Mù¸Ø¯›U½‡VnE˜¶ŠOÂÝ´šì3çNa8¡2ÇbÂ"îa¨;¡º î„xîœð°Ãw>|W>6›ûÍð¡½ß,ý WÊiïYv7I¨;k·Ž«]]Fº($a´ÀºA‹éía¸Þ@ݽÞ!؁ÿý¸à[á— i"!j¾‰Œ(´‰@UšÈ ¸‰Lx¬·7M»X–û:µ‰ì»]ÓÞ }ÄÁf­Í¨½m3h+ `1k{nm nŠµµCƒÎÊ¿VüâÙáônWÌsö8¯RΉР+m,¦’‡á*uSTx@*…> endobj +5859 0 obj << +/D [5857 0 R /XYZ 71.731 729.2652 null] +>> endobj +5860 0 obj << +/D [5857 0 R /XYZ 159.4023 708.3437 null] +>> endobj +5861 0 obj << +/D [5857 0 R /XYZ 71.731 706.9041 null] +>> endobj +5862 0 obj << +/D [5857 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5863 0 obj << +/D [5857 0 R /XYZ 76.7123 672.4782 null] +>> endobj +5864 0 obj << +/D [5857 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5865 0 obj << +/D [5857 0 R /XYZ 149.4396 654.5454 null] +>> endobj +5866 0 obj << +/D [5857 0 R /XYZ 71.731 652.3886 null] +>> endobj +5867 0 obj << +/D [5857 0 R /XYZ 71.731 652.3886 null] +>> endobj +5868 0 obj << +/D [5857 0 R /XYZ 159.4023 636.6127 null] +>> endobj +5869 0 obj << +/D [5857 0 R /XYZ 71.731 634.4559 null] +>> endobj +5870 0 obj << +/D [5857 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5871 0 obj << +/D [5857 0 R /XYZ 76.7123 600.7472 null] +>> endobj +5872 0 obj << +/D [5857 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5873 0 obj << +/D [5857 0 R /XYZ 149.4396 582.8144 null] +>> endobj +5874 0 obj << +/D [5857 0 R /XYZ 71.731 580.6576 null] +>> endobj +5875 0 obj << +/D [5857 0 R /XYZ 71.731 580.6576 null] +>> endobj +5876 0 obj << +/D [5857 0 R /XYZ 159.4023 564.8817 null] +>> endobj +5877 0 obj << +/D [5857 0 R /XYZ 71.731 563.4421 null] +>> endobj +5878 0 obj << +/D [5857 0 R /XYZ 159.4023 546.9489 null] +>> endobj +5879 0 obj << +/D [5857 0 R /XYZ 76.7123 529.0162 null] +>> endobj +5880 0 obj << +/D [5857 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5881 0 obj << +/D [5857 0 R /XYZ 149.4396 511.0834 null] +>> endobj +5882 0 obj << +/D [5857 0 R /XYZ 71.731 508.9266 null] +>> endobj +5883 0 obj << +/D [5857 0 R /XYZ 71.731 508.9266 null] +>> endobj +5884 0 obj << +/D [5857 0 R /XYZ 159.4023 493.1507 null] +>> endobj +5885 0 obj << +/D [5857 0 R /XYZ 71.731 491.7111 null] +>> endobj +5886 0 obj << +/D [5857 0 R /XYZ 159.4023 475.2179 null] +>> endobj +5887 0 obj << +/D [5857 0 R /XYZ 76.7123 457.2852 null] +>> endobj +5888 0 obj << +/D [5857 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5889 0 obj << +/D [5857 0 R /XYZ 149.4396 439.3524 null] +>> endobj +5890 0 obj << +/D [5857 0 R /XYZ 71.731 437.1956 null] +>> endobj +5891 0 obj << +/D [5857 0 R /XYZ 71.731 437.1956 null] +>> endobj +5892 0 obj << +/D [5857 0 R /XYZ 159.4023 421.4197 null] +>> endobj +5893 0 obj << +/D [5857 0 R /XYZ 71.731 419.2628 null] +>> endobj +5894 0 obj << +/D [5857 0 R /XYZ 159.4023 403.4869 null] +>> endobj +5895 0 obj << +/D [5857 0 R /XYZ 76.7123 385.5542 null] +>> endobj +5896 0 obj << +/D [5857 0 R /XYZ 149.4396 367.6214 null] +>> endobj +5897 0 obj << +/D [5857 0 R /XYZ 149.4396 367.6214 null] +>> endobj +5898 0 obj << +/D [5857 0 R /XYZ 71.731 365.4646 null] +>> endobj +5899 0 obj << +/D [5857 0 R /XYZ 71.731 365.4646 null] +>> endobj +5900 0 obj << +/D [5857 0 R /XYZ 159.4023 349.6887 null] +>> endobj +5901 0 obj << +/D [5857 0 R /XYZ 71.731 347.5318 null] +>> endobj +5902 0 obj << +/D [5857 0 R /XYZ 159.4023 331.7559 null] +>> endobj +5903 0 obj << +/D [5857 0 R /XYZ 76.7123 313.8231 null] +>> endobj +5904 0 obj << +/D [5857 0 R /XYZ 149.4396 295.8904 null] +>> endobj +5905 0 obj << +/D [5857 0 R /XYZ 149.4396 295.8904 null] +>> endobj +5906 0 obj << +/D [5857 0 R /XYZ 71.731 293.7336 null] +>> endobj +5907 0 obj << +/D [5857 0 R /XYZ 71.731 293.7336 null] +>> endobj +5908 0 obj << +/D [5857 0 R /XYZ 159.4023 277.9576 null] +>> endobj +5909 0 obj << +/D [5857 0 R /XYZ 71.731 276.5181 null] +>> endobj +5910 0 obj << +/D [5857 0 R /XYZ 159.4023 260.0249 null] +>> endobj +5911 0 obj << +/D [5857 0 R /XYZ 76.7123 242.0921 null] +>> endobj +5912 0 obj << +/D [5857 0 R /XYZ 149.4396 224.1594 null] +>> endobj +5913 0 obj << +/D [5857 0 R /XYZ 149.4396 224.1594 null] +>> endobj +5914 0 obj << +/D [5857 0 R /XYZ 71.731 222.0026 null] +>> endobj +5915 0 obj << +/D [5857 0 R /XYZ 71.731 222.0026 null] +>> endobj +5916 0 obj << +/D [5857 0 R /XYZ 159.4023 206.2266 null] +>> endobj +5917 0 obj << +/D [5857 0 R /XYZ 71.731 204.0698 null] +>> endobj +5918 0 obj << +/D [5857 0 R /XYZ 159.4023 188.2939 null] +>> endobj +5919 0 obj << +/D [5857 0 R /XYZ 76.7123 170.3611 null] +>> endobj +5920 0 obj << +/D [5857 0 R /XYZ 149.4396 152.4284 null] +>> endobj +5921 0 obj << +/D [5857 0 R /XYZ 149.4396 152.4284 null] +>> endobj +5922 0 obj << +/D [5857 0 R /XYZ 71.731 150.2715 null] +>> endobj +5923 0 obj << +/D [5857 0 R /XYZ 71.731 150.2715 null] +>> endobj +5924 0 obj << +/D [5857 0 R /XYZ 159.4023 134.4956 null] +>> endobj +5925 0 obj << +/D [5857 0 R /XYZ 71.731 132.3388 null] +>> endobj +5926 0 obj << +/D [5857 0 R /XYZ 159.4023 116.5629 null] +>> endobj +5927 0 obj << +/D [5857 0 R /XYZ 76.7123 98.6301 null] +>> endobj +5856 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5930 0 obj << +/Length 1510 +/Filter /FlateDecode +>> +stream +xÚ­Y]oÛ6}ϯÐcÔI‰_}ëÚuëÐ A—Ö!-6àȆ%¯è¿e‘6%]’ +6äA²rÄ{xxîÕ¥D2lþH&¹9P…(g4Û<ßàìÉüëçb!+‹Yù n~xŸãL!Å)Ͼf¹âˆ‰"9E’™=Tݾݖ‡NïV”á[Š†ãý®lt÷±\?ßÜN~ÓÝv_µw?üzóÓÃ%>ËRÒ‰’Ì•D 3ž­(FŠ¢H®P!„™ –(/rq™ U™@¤Ÿ§™‹ƒ]Pý\¾PʦÜHA 7Á3<uz¼²pwÍiä2“FR^œi††ÑuÌã õñ±®z*gÚ×%(°‘@š=ìõ jÝtÃÉÞ®By<–ßí¥¯WÌlb64W+XN‡Zù0@ÏÙhAA™‘†a +Æ êîy\"ÌðÀ4ó0Óe©W»ýpü¶­7[{i[·ÃY[wz8[ëݾyjÃê jŒ$iJ=SÏÁÒêq—¨ð€ÔóyÀ~ú¿µ ÉsŽ8¡"žÜ>*œÜT2¹¡¨ ’{FNîr½>êê²ÓÕcS>k Ë¥)t\LÒ¼íŽuó”Ìt ڕHąJ&»‹ÙÕÁÒvâ.±+À²«ÏcPÀÚóM¯öe·ƒâS3º€µÂ‰B$SۃŴr°´V@Ü%Z< ­|AýùˆBŒ‘1ó0DŽäs¨•»Ê§䛍”Ró%Œ–ÏÝ5ç1Îeó_FŠ|Ì㨻ӱyüZëÝÐÕLDï«(•ù8‘Í9»µ¬Ûn¼_0¦çGuu6Ÿ¶#FÂ2/`¹jå÷ÎF Êmš@L Æ Ëíîyxnµ|DãZÚÌ@KY?Œ$VàÓY¡öuВ&MçŠY’>,bÉ ,iI(îKB<<ÜZxÀ}ÚtAãÔTb7qãø°ˆq.°¤q ¸ Œ3ã1ÎSkœ²ªŽºmMK %)'ˆs)^š¤vPÛUºéêsÞƒ­MsÓ7$¶-(ÜØ8P²¯B.hkžíÜÍ'í/œ#r.‘É–ð—‹øëKú Š»À_3 ¿F4›SÀ[f¿fô*^ê­û·Ÿ_à«ÜÔ@"¹ŒËG…uA%­E]à-ˆ`®¨»HrJò”» ݔ띾“j¹Þïwºl¬þ¿”­{Ûx~¼™3o‡ƒ©]û&P,GTJùâýÏf³?¹O‹ª$f¯ÎT¢Lú¨p¼ ’…Šº RB4€R9â«•$/Ry*a}XÌ`–vw‰Å¦<`ù4úzùj5MØë'„?.]ßFa%‰@˜“”WTLG‹JË8ºDÅ XDCÿi¤îNÔ$š‘«ýÉ5«ã;½©ŸKÛ&^Geí²§‹Rˆôï-ã{¨ˆÄ•”º@â) PbŸC»«7¡¾’xAÛ؏¸ Ú¯ì…D’pýïaæßᕳ]p¨ž­bÁ¯ê@ÀÅuxendstream +endobj +5929 0 obj << +/Type /Page +/Contents 5930 0 R +/Resources 5928 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +5931 0 obj << +/D [5929 0 R /XYZ 71.731 729.2652 null] +>> endobj +5932 0 obj << +/D [5929 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5933 0 obj << +/D [5929 0 R /XYZ 149.4396 708.3437 null] +>> endobj +5934 0 obj << +/D [5929 0 R /XYZ 71.731 706.1869 null] +>> endobj +5935 0 obj << +/D [5929 0 R /XYZ 71.731 706.1869 null] +>> endobj +5936 0 obj << +/D [5929 0 R /XYZ 159.4023 690.4109 null] +>> endobj +5937 0 obj << +/D [5929 0 R /XYZ 71.731 688.2541 null] +>> endobj +5938 0 obj << +/D [5929 0 R /XYZ 159.4023 672.4782 null] +>> endobj +5939 0 obj << +/D [5929 0 R /XYZ 76.7123 654.5454 null] +>> endobj +5940 0 obj << +/D [5929 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5941 0 obj << +/D [5929 0 R /XYZ 149.4396 636.6127 null] +>> endobj +5942 0 obj << +/D [5929 0 R /XYZ 71.731 634.4559 null] +>> endobj +5943 0 obj << +/D [5929 0 R /XYZ 71.731 634.4559 null] +>> endobj +5944 0 obj << +/D [5929 0 R /XYZ 159.4023 618.6799 null] +>> endobj +5945 0 obj << +/D [5929 0 R /XYZ 71.731 616.5231 null] +>> endobj +5946 0 obj << +/D [5929 0 R /XYZ 159.4023 600.7472 null] +>> endobj +5947 0 obj << +/D [5929 0 R /XYZ 76.7123 546.9489 null] +>> endobj +5948 0 obj << +/D [5929 0 R /XYZ 129.5143 529.0162 null] +>> endobj +5949 0 obj << +/D [5929 0 R /XYZ 129.5143 529.0162 null] +>> endobj +5950 0 obj << +/D [5929 0 R /XYZ 71.731 526.8593 null] +>> endobj +5951 0 obj << +/D [5929 0 R /XYZ 71.731 526.8593 null] +>> endobj +5952 0 obj << +/D [5929 0 R /XYZ 139.477 511.0834 null] +>> endobj +5953 0 obj << +/D [5929 0 R /XYZ 71.731 473.2254 null] +>> endobj +5954 0 obj << +/D [5929 0 R /XYZ 71.731 460.1744 null] +>> endobj +5955 0 obj << +/D [5929 0 R /XYZ 71.731 458.9291 null] +>> endobj +5956 0 obj << +/D [5929 0 R /XYZ 129.5143 439.8505 null] +>> endobj +5957 0 obj << +/D [5929 0 R /XYZ 71.731 437.6937 null] +>> endobj +5958 0 obj << +/D [5929 0 R /XYZ 71.731 437.6937 null] +>> endobj +5959 0 obj << +/D [5929 0 R /XYZ 139.477 421.9178 null] +>> endobj +5960 0 obj << +/D [5929 0 R /XYZ 139.477 421.9178 null] +>> endobj +5961 0 obj << +/D [5929 0 R /XYZ 71.731 419.761 null] +>> endobj +5962 0 obj << +/D [5929 0 R /XYZ 71.731 419.761 null] +>> endobj +5963 0 obj << +/D [5929 0 R /XYZ 149.4396 403.985 null] +>> endobj +5964 0 obj << +/D [5929 0 R /XYZ 76.7123 386.0523 null] +>> endobj +5965 0 obj << +/D [5929 0 R /XYZ 139.477 368.1195 null] +>> endobj +5966 0 obj << +/D [5929 0 R /XYZ 139.477 368.1195 null] +>> endobj +5967 0 obj << +/D [5929 0 R /XYZ 71.731 365.9627 null] +>> endobj +5968 0 obj << +/D [5929 0 R /XYZ 71.731 365.9627 null] +>> endobj +5969 0 obj << +/D [5929 0 R /XYZ 149.4396 350.1868 null] +>> endobj +5970 0 obj << +/D [5929 0 R /XYZ 76.7123 332.254 null] +>> endobj +5971 0 obj << +/D [5929 0 R /XYZ 139.477 314.3213 null] +>> endobj +5972 0 obj << +/D [5929 0 R /XYZ 139.477 314.3213 null] +>> endobj +5973 0 obj << +/D [5929 0 R /XYZ 71.731 312.1645 null] +>> endobj +5974 0 obj << +/D [5929 0 R /XYZ 139.477 296.3885 null] +>> endobj +5975 0 obj << +/D [5929 0 R /XYZ 139.477 296.3885 null] +>> endobj +5976 0 obj << +/D [5929 0 R /XYZ 71.731 294.2317 null] +>> endobj +5977 0 obj << +/D [5929 0 R /XYZ 139.477 278.4558 null] +>> endobj +5978 0 obj << +/D [5929 0 R /XYZ 139.477 278.4558 null] +>> endobj +5979 0 obj << +/D [5929 0 R /XYZ 71.731 276.2989 null] +>> endobj +5980 0 obj << +/D [5929 0 R /XYZ 71.731 276.2989 null] +>> endobj +5981 0 obj << +/D [5929 0 R /XYZ 149.4396 260.523 null] +>> endobj +5982 0 obj << +/D [5929 0 R /XYZ 76.7123 242.5903 null] +>> endobj +5983 0 obj << +/D [5929 0 R /XYZ 139.477 224.6575 null] +>> endobj +5984 0 obj << +/D [5929 0 R /XYZ 139.477 224.6575 null] +>> endobj +5985 0 obj << +/D [5929 0 R /XYZ 71.731 222.5007 null] +>> endobj +5986 0 obj << +/D [5929 0 R /XYZ 139.477 206.7248 null] +>> endobj +5987 0 obj << +/D [5929 0 R /XYZ 139.477 206.7248 null] +>> endobj +5988 0 obj << +/D [5929 0 R /XYZ 71.731 205.2852 null] +>> endobj +5989 0 obj << +/D [5929 0 R /XYZ 139.477 188.792 null] +>> endobj +5990 0 obj << +/D [5929 0 R /XYZ 139.477 188.792 null] +>> endobj +5991 0 obj << +/D [5929 0 R /XYZ 71.731 186.6352 null] +>> endobj +5992 0 obj << +/D [5929 0 R /XYZ 71.731 186.6352 null] +>> endobj +5993 0 obj << +/D [5929 0 R /XYZ 149.4396 170.8593 null] +>> endobj +5994 0 obj << +/D [5929 0 R /XYZ 76.7123 152.9265 null] +>> endobj +5995 0 obj << +/D [5929 0 R /XYZ 139.477 134.9938 null] +>> endobj +5996 0 obj << +/D [5929 0 R /XYZ 139.477 134.9938 null] +>> endobj +5997 0 obj << +/D [5929 0 R /XYZ 71.731 133.5542 null] +>> endobj +5998 0 obj << +/D [5929 0 R /XYZ 139.477 117.061 null] +>> endobj +5999 0 obj << +/D [5929 0 R /XYZ 139.477 117.061 null] +>> endobj +6000 0 obj << +/D [5929 0 R /XYZ 71.731 114.9042 null] +>> endobj +6001 0 obj << +/D [5929 0 R /XYZ 139.477 99.1283 null] +>> endobj +6002 0 obj << +/D [5929 0 R /XYZ 139.477 99.1283 null] +>> endobj +6003 0 obj << +/D [5929 0 R /XYZ 71.731 96.9714 null] +>> endobj +6004 0 obj << +/D [5929 0 R /XYZ 71.731 96.9714 null] +>> endobj +5928 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6007 0 obj << +/Length 1628 +/Filter /FlateDecode +>> +stream +xÚµYߏ£6~ß¿"‰´q±ÁÆÜ۶׫¶j«ènOªÔ«"¼KR {·ÿ}Ç`æÇ©ªöŽ=ß|3¼òà¯BŒB.$B„Q²:žï¼Õ üë—;¬M¶Úfkýøt÷Ãß[E(b„­žžW~Ä ƒUèÄ)櫧ä¯õO§øR‰b³%Ô[Ô\wiœ‰ê·øÐü|Ø=67¿‹ê”'åæï§_ï~~jýS?D'“ ýˆ#êQ¶ÚES§ö#„!Äâqä~ØÆB¢Uˆ°Šb1f­•Šå !´ °…leÏg¼ö¯7f”ƍR ോCfÕ0Cqà¯XH8wSÔZmm3GôƒÙFÇ\{$ˆœ~ÇÃ7£†8|¾â> ì,t`œãoû2•¯¢¨ ¥ÇÈ1‚eû®©+ ì^WXüMž¯çæGv=LiæÏÍfÞº~Ý`ºVê‡Õ)®ÌÐv²ÒwRŇT?©òæz,D V£©¢¢ æRe™M¥Ê˜Í§ÊáwIªú8Ü©²aèT…+S”!Â9ÿ/™RÿŸ òb˜„s ²Ì¦dÌæäð»$A}îÙ0ÒüEfûC\Š¥ *«Bf/:GŸZŽëd4·—B|ñ<òmœVÌ £hŽVËlŠVc6O«ÃïZû8Ü´Ú0¨ª}S\‰«G…(ðF[Ôûؐg‰®Wy֏¾žDÖ¯o‘Uśþ÷ðҮîäÞ8ÐãÄ1ϒÒL’™´}þãñO=ß%?žÆ³çy( ÂÙ Æ2›Êž1›ÏžÃï’ìõq¸³gÃHãJV×ĵ$Š(‰H7uI~…Îb²'Žò§Ív¦Nã궨1ž)…ƒ¹ÝÁ6›à¹5›åÙåwÏNž;0d¹¿sòèê= áxò<q¦™ÞÕcS]ù¯R¨}»Ym£Ÿf˜ˆs<×Þm³)†Ù<ÿKîãp3løQì{ùý}胒@y!äË ãÈzŽT]ÞlÊfûUÇ Š>×øm³)Ù<á¿Kïãpnè wrxp8 £1²wÂ0i´Éד„.¬†,û)8ˆ4Ï^Êq®áÆÃl®MÛfS\³y®~—pÝÇáæچ…x•j‹ÛgñÙÕ®9œY8¥`Ô$µà¯'ê³lÍ 1†N•5 -qäc¹eaƛŽ͍«#nÈ׿ˆê“ÒD¸;lˆ·¾VN„ˆX…[ujY³pwE^åÕÛE¼kGÜØÐc·Ž:Xވ»:ˆ/õâkuº·¤Ú>¶ ÷j)§ê˜xkmVˆêZdõDš”0 v ß06ú÷¢<òRÉ<›ÂB”2ÒàÿX{3B]7œ¸(ⷞ诊ë±2'ϪXfM½ ø™¶j?¿VqÚJªî9Ï41›<ý®â!sü³w°˜šrƒ×Áϊ(Ë-†Ræ×´º ˓ºcëìÕ èz,E¥á=>/Èjwì$J=kÒãD.àߢÒAH½/@ÄÍÖPêRÊ ®¨›Œ~—nšŒÌ(±Á:¸s\OmÉ´œw¹ú*ÓÔôY{9ˆ¤G;4ȯ½PZ*]±Þ¨À¾©Â~~:e=…Ìx„ž²Úãç²y‰ásü­¹Ñ>ýpýÏUúá€*eøÜ\ۓ¶zVèg÷àU‰5Æl_p«"㨏Pgúz™”ÝãL> 3T.]\[¯L:_îXodqÛúÅkj³³/·Õ«E'Ä +Lõä,³¶ö´­‰h¤F/Xˆ·ù­ºvdz¡t–öè‡4ÍkÁlªì#hërév« 4A©o®egQ]l)šŠ .`·…%Ø è¨ :„‚¨ÅŒ">öÆÌm-«›¦‰B¯Ñ4ý¹F% !È0q9W4fÐDWÐaeƒP{´ƒ0€æHè™÷½·çj¼ê¿ÇXí¼¶åµ?a ÁþŒP´Í&„bk6+]~ŧPìÀx^š/ î—\,ƒ)‰è õÜL×ì×RŒ×-ü”ò¹ÂµÌ¦*ט͗®Ãï’Úíã)^‡-@”øx–õv:dC#Á,¢]ÊZC}æ趻F*ô‚Õ§Ž8L;ùýʲ~¾¢”8öx;“B±ÑQ‡ÿ߂uêendstream +endobj +6006 0 obj << +/Type /Page +/Contents 6007 0 R +/Resources 6005 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +6008 0 obj << +/D [6006 0 R /XYZ 71.731 729.2652 null] +>> endobj +6009 0 obj << +/D [6006 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6010 0 obj << +/D [6006 0 R /XYZ 76.7123 690.4109 null] +>> endobj +6011 0 obj << +/D [6006 0 R /XYZ 139.477 672.4782 null] +>> endobj +6012 0 obj << +/D [6006 0 R /XYZ 139.477 672.4782 null] +>> endobj +6013 0 obj << +/D [6006 0 R /XYZ 71.731 671.0386 null] +>> endobj +6014 0 obj << +/D [6006 0 R /XYZ 139.477 654.5454 null] +>> endobj +6015 0 obj << +/D [6006 0 R /XYZ 139.477 654.5454 null] +>> endobj +6016 0 obj << +/D [6006 0 R /XYZ 71.731 653.1059 null] +>> endobj +6017 0 obj << +/D [6006 0 R /XYZ 139.477 636.6127 null] +>> endobj +6018 0 obj << +/D [6006 0 R /XYZ 139.477 636.6127 null] +>> endobj +6019 0 obj << +/D [6006 0 R /XYZ 71.731 634.4559 null] +>> endobj +6020 0 obj << +/D [6006 0 R /XYZ 139.477 618.6799 null] +>> endobj +6021 0 obj << +/D [6006 0 R /XYZ 139.477 618.6799 null] +>> endobj +6022 0 obj << +/D [6006 0 R /XYZ 71.731 616.5231 null] +>> endobj +6023 0 obj << +/D [6006 0 R /XYZ 139.477 600.7472 null] +>> endobj +6024 0 obj << +/D [6006 0 R /XYZ 139.477 600.7472 null] +>> endobj +6025 0 obj << +/D [6006 0 R /XYZ 71.731 599.3076 null] +>> endobj +6026 0 obj << +/D [6006 0 R /XYZ 139.477 582.8144 null] +>> endobj +6027 0 obj << +/D [6006 0 R /XYZ 139.477 582.8144 null] +>> endobj +6028 0 obj << +/D [6006 0 R /XYZ 71.731 580.6576 null] +>> endobj +6029 0 obj << +/D [6006 0 R /XYZ 139.477 564.8817 null] +>> endobj +6030 0 obj << +/D [6006 0 R /XYZ 139.477 564.8817 null] +>> endobj +6031 0 obj << +/D [6006 0 R /XYZ 71.731 562.7248 null] +>> endobj +6032 0 obj << +/D [6006 0 R /XYZ 139.477 546.9489 null] +>> endobj +6033 0 obj << +/D [6006 0 R /XYZ 139.477 546.9489 null] +>> endobj +6034 0 obj << +/D [6006 0 R /XYZ 71.731 544.7921 null] +>> endobj +6035 0 obj << +/D [6006 0 R /XYZ 139.477 529.0162 null] +>> endobj +6036 0 obj << +/D [6006 0 R /XYZ 139.477 529.0162 null] +>> endobj +882 0 obj << +/D [6006 0 R /XYZ 71.731 506.1021 null] +>> endobj +382 0 obj << +/D [6006 0 R /XYZ 264.6446 460.8478 null] +>> endobj +6037 0 obj << +/D [6006 0 R /XYZ 71.731 440.7074 null] +>> endobj +6038 0 obj << +/D [6006 0 R /XYZ 161.0655 427.9711 null] +>> endobj +6039 0 obj << +/D [6006 0 R /XYZ 71.731 415.8516 null] +>> endobj +6040 0 obj << +/D [6006 0 R /XYZ 71.731 384.822 null] +>> endobj +6041 0 obj << +/D [6006 0 R /XYZ 168.8063 373.4754 null] +>> endobj +6042 0 obj << +/D [6006 0 R /XYZ 71.731 346.412 null] +>> endobj +6043 0 obj << +/D [6006 0 R /XYZ 71.731 295.0212 null] +>> endobj +6044 0 obj << +/D [6006 0 R /XYZ 71.731 251.7834 null] +>> endobj +6045 0 obj << +/D [6006 0 R /XYZ 181.5683 240.7731 null] +>> endobj +6046 0 obj << +/D [6006 0 R /XYZ 71.731 230.7109 null] +>> endobj +6047 0 obj << +/D [6006 0 R /XYZ 71.731 197.2877 null] +>> endobj +6048 0 obj << +/D [6006 0 R /XYZ 71.731 186.1779 null] +>> endobj +6049 0 obj << +/D [6006 0 R /XYZ 71.731 184.9326 null] +>> endobj +6050 0 obj << +/D [6006 0 R /XYZ 129.5143 165.854 null] +>> endobj +6051 0 obj << +/D [6006 0 R /XYZ 129.5143 165.854 null] +>> endobj +6052 0 obj << +/D [6006 0 R /XYZ 71.731 164.4145 null] +>> endobj +6053 0 obj << +/D [6006 0 R /XYZ 71.731 164.4145 null] +>> endobj +6054 0 obj << +/D [6006 0 R /XYZ 139.477 147.9213 null] +>> endobj +6055 0 obj << +/D [6006 0 R /XYZ 139.477 147.9213 null] +>> endobj +6056 0 obj << +/D [6006 0 R /XYZ 76.7123 129.9885 null] +>> endobj +6057 0 obj << +/D [6006 0 R /XYZ 129.5143 112.0558 null] +>> endobj +6058 0 obj << +/D [6006 0 R /XYZ 129.5143 112.0558 null] +>> endobj +6059 0 obj << +/D [6006 0 R /XYZ 71.731 109.899 null] +>> endobj +6060 0 obj << +/D [6006 0 R /XYZ 71.731 109.899 null] +>> endobj +6005 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6063 0 obj << +/Length 1341 +/Filter /FlateDecode +>> +stream +xÚÍZ]oÛ6}ϯУ Ì¿?úÖ Û°a +ÌoëP¨¶“°åÀV2ôߏšD™²®xÙÖ†‘“ëžsIFfõ_¬0Œá/Ü®/6‡;Z<ø?ýrÇzȪǬbÐë»ï´pÄi®‹õ}!œ&ÊÈÂN¬b¶XoÿZüøX>5»ÓrÅ]pÒ]ßïËz×ü^~ê~|ûþ×îÅ»]óxܞ—¯»ûi=ÔWÂg}‘$II-‘ÚŠbÅ)qœ)Åü-“e<^Ha†ÁpWÂځúÁ ¸֎æçêšóÃ¥\º"¾a¨{}½ðïy\DeÂi̘Fy:•Ÿ;Ɏ÷ݵª›ïºWî«Í®{Y6Í©ú´ätñÜô¿ª¶»º©>PÊý¤\$ŒY;J$£Q0†%`¨‚PÝ !SG4ÎÍéy{;•©hß…›î¯vb­b Ðõ½fõ‘Ìûßh°ê¼>á]SÂÖë£å4¤§á³;æQ—‡]ËãJL. m+´7T^ʪ~èÝØ0h› -W’(©$,h@­b èän³’*/Ž¢¬;/ixÈ#²œò<(cY)m>?õ¯Â<À¢ M4ã-‚¥D 0\4 nŽhH´˜Ç¬“n¡c ¥ÄHƒ…9B%ÂPx˜ª9a¾¦1æ˜Ç¹écµ-±ÖØq¤ýb‚æ¹ÅÌùRY¿` s Kør€¡¾„êføâørÄ\o“‹ë0-½ä m K‰`¸8@Ýq81ÜýIR¯>PÊo#(ÓH8cÔ|8N¨jF8'4àpŽxtá욗o\pL#Ú꧔1B­@SÁRF 0܈@Ý#< #Æ@ݜ‰x@óHv‘ÿãÜô½‚J„fH߉Qó}g@¡}ªšÑw&4à¾3â±Ý7§ê©©Ž5ÔwÑÚoý^á_Lq"¹ÅºO K˜~€¡¦‡êf˜â˜~Ä㫞]M¬D:…5Œ–Ò.Àp퀺9Ú< íb·z䖐³ÿ@‰´Ä2풟9‰0ӏœ(Š‰áN-gf?@ü‰ð´endstream +endobj +6062 0 obj << +/Type /Page +/Contents 6063 0 R +/Resources 6061 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 5785 0 R +>> endobj +6064 0 obj << +/D [6062 0 R /XYZ 71.731 729.2652 null] +>> endobj +6065 0 obj << +/D [6062 0 R /XYZ 139.477 708.3437 null] +>> endobj +6066 0 obj << +/D [6062 0 R /XYZ 71.731 706.1869 null] +>> endobj +6067 0 obj << +/D [6062 0 R /XYZ 139.477 690.4109 null] +>> endobj +6068 0 obj << +/D [6062 0 R /XYZ 71.731 688.9714 null] +>> endobj +6069 0 obj << +/D [6062 0 R /XYZ 71.731 688.9714 null] +>> endobj +6070 0 obj << +/D [6062 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6071 0 obj << +/D [6062 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6072 0 obj << +/D [6062 0 R /XYZ 71.731 670.3214 null] +>> endobj +6073 0 obj << +/D [6062 0 R /XYZ 71.731 670.3214 null] +>> endobj +6074 0 obj << +/D [6062 0 R /XYZ 159.4023 654.5454 null] +>> endobj +6075 0 obj << +/D [6062 0 R /XYZ 71.731 652.3886 null] +>> endobj +6076 0 obj << +/D [6062 0 R /XYZ 159.4023 636.6127 null] +>> endobj +6077 0 obj << +/D [6062 0 R /XYZ 76.7123 618.6799 null] +>> endobj +6078 0 obj << +/D [6062 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6079 0 obj << +/D [6062 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6080 0 obj << +/D [6062 0 R /XYZ 71.731 598.5904 null] +>> endobj +6081 0 obj << +/D [6062 0 R /XYZ 71.731 598.5904 null] +>> endobj +6082 0 obj << +/D [6062 0 R /XYZ 159.4023 582.8144 null] +>> endobj +6083 0 obj << +/D [6062 0 R /XYZ 71.731 581.3749 null] +>> endobj +6084 0 obj << +/D [6062 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6085 0 obj << +/D [6062 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6086 0 obj << +/D [6062 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6087 0 obj << +/D [6062 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6088 0 obj << +/D [6062 0 R /XYZ 71.731 526.8593 null] +>> endobj +6089 0 obj << +/D [6062 0 R /XYZ 71.731 526.8593 null] +>> endobj +6090 0 obj << +/D [6062 0 R /XYZ 159.4023 511.0834 null] +>> endobj +6091 0 obj << +/D [6062 0 R /XYZ 71.731 509.6439 null] +>> endobj +6092 0 obj << +/D [6062 0 R /XYZ 159.4023 493.1507 null] +>> endobj +6093 0 obj << +/D [6062 0 R /XYZ 76.7123 475.2179 null] +>> endobj +6094 0 obj << +/D [6062 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6095 0 obj << +/D [6062 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6096 0 obj << +/D [6062 0 R /XYZ 71.731 455.1283 null] +>> endobj +6097 0 obj << +/D [6062 0 R /XYZ 71.731 455.1283 null] +>> endobj +6098 0 obj << +/D [6062 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6099 0 obj << +/D [6062 0 R /XYZ 71.731 437.1956 null] +>> endobj +6100 0 obj << +/D [6062 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6101 0 obj << +/D [6062 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6102 0 obj << +/D [6062 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6103 0 obj << +/D [6062 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6104 0 obj << +/D [6062 0 R /XYZ 71.731 383.3973 null] +>> endobj +6105 0 obj << +/D [6062 0 R /XYZ 71.731 383.3973 null] +>> endobj +6106 0 obj << +/D [6062 0 R /XYZ 159.4023 367.6214 null] +>> endobj +6107 0 obj << +/D [6062 0 R /XYZ 71.731 365.4646 null] +>> endobj +6108 0 obj << +/D [6062 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6109 0 obj << +/D [6062 0 R /XYZ 76.7123 331.7559 null] +>> endobj +6110 0 obj << +/D [6062 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6111 0 obj << +/D [6062 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6112 0 obj << +/D [6062 0 R /XYZ 71.731 311.6663 null] +>> endobj +6113 0 obj << +/D [6062 0 R /XYZ 71.731 311.6663 null] +>> endobj +6114 0 obj << +/D [6062 0 R /XYZ 159.4023 295.8904 null] +>> endobj +6115 0 obj << +/D [6062 0 R /XYZ 71.731 294.4508 null] +>> endobj +6116 0 obj << +/D [6062 0 R /XYZ 159.4023 277.9576 null] +>> endobj +6117 0 obj << +/D [6062 0 R /XYZ 76.7123 260.0249 null] +>> endobj +6118 0 obj << +/D [6062 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6119 0 obj << +/D [6062 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6120 0 obj << +/D [6062 0 R /XYZ 71.731 239.9353 null] +>> endobj +6121 0 obj << +/D [6062 0 R /XYZ 71.731 239.9353 null] +>> endobj +6122 0 obj << +/D [6062 0 R /XYZ 159.4023 224.1594 null] +>> endobj +6123 0 obj << +/D [6062 0 R /XYZ 71.731 222.0026 null] +>> endobj +6124 0 obj << +/D [6062 0 R /XYZ 159.4023 206.2266 null] +>> endobj +6125 0 obj << +/D [6062 0 R /XYZ 76.7123 188.2939 null] +>> endobj +6126 0 obj << +/D [6062 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6127 0 obj << +/D [6062 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6128 0 obj << +/D [6062 0 R /XYZ 71.731 168.2043 null] +>> endobj +6129 0 obj << +/D [6062 0 R /XYZ 71.731 168.2043 null] +>> endobj +6130 0 obj << +/D [6062 0 R /XYZ 159.4023 152.4284 null] +>> endobj +6131 0 obj << +/D [6062 0 R /XYZ 71.731 150.2715 null] +>> endobj +6132 0 obj << +/D [6062 0 R /XYZ 159.4023 134.4956 null] +>> endobj +6061 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6135 0 obj << +/Length 1369 +/Filter /FlateDecode +>> +stream +xÚ­X]o£8}ï¯à1‘/66¶ûÖýÍjfUÍæmgUф6H" Í¿ßklæcG«>@ÊÁ÷øÜc›{qÂ8F<‚ ‘ˆÄŒ‡ó]¼Á£wØ@v³sA?ïï~ú= +‰dLâ`ÿD2FŒÓ€G †E°?þ½ùå”\š´Úî 7éëSžió)yÑ?Ÿ>ê›Ïis*õöŸýw¿í»ø,âH +2K’bhÊ` ˆO#/ +c‰Ã<ØÅ2DÞN†Èâð«Ét¸¦fó•6d‡ AÅ$p´q‡×û֘G$¢Æ´åSf&ÓãQ¥Íµ*ž_³4×rµìo©àQ""¥ÐZݤª’ïۘmîõïOYÝè»òU_¿†!iGl5¥¾ê`ãi[b*þ¤t¨ »É•¯zÓ´°I¹Á]!¡ÒwZnû–—ÇM8IxÊû4ê¦ÊŠ7E,a0"JÖ¾´ +Õ#®‰BŒe‹–t`s–´°eKzâ®±¤‡‡£Q—+—‡vWÏN ÛõÐL‡‰EƜ7Ž ›1N[4Ž/î +ãŒxôש1NF‘œSÏê$…¡”ýÕ©Mf–æ_yvHͪmàÁ˖„›kcþÕ|¿˜;À¯oÌPÄ¥XÒׁÍékaËúzâ®ÑwÈï¯K£V2=gGÆ”!!¸èkœÍXàì˜MÖn}Õ´–”#J9^ÒҁÍiiaËZzâ®ÑrÈï¥KCk©ÝNó«*%ŠE¼BTk×élotv`s:ۛe=q×è<äá×Ù¥ñžäWï¦ Q$$ÿáMá}KØƎí×cÄ^Üo؜¶¶¬­'îm‡<üÚº4nîU[䄅)ŠÂÿ˜‡o;ï*7S¡˜Š¥؅Í(ÞÁ÷Å]¡øˆ‡Wñ¢<*9Ûªw0ãN=#< e7’â*ÅdßÝð_i³£qendstream +endobj +6134 0 obj << +/Type /Page +/Contents 6135 0 R +/Resources 6133 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6136 0 obj << +/D [6134 0 R /XYZ 71.731 729.2652 null] +>> endobj +6137 0 obj << +/D [6134 0 R /XYZ 76.7123 708.3437 null] +>> endobj +6138 0 obj << +/D [6134 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6139 0 obj << +/D [6134 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6140 0 obj << +/D [6134 0 R /XYZ 71.731 688.2541 null] +>> endobj +6141 0 obj << +/D [6134 0 R /XYZ 71.731 688.2541 null] +>> endobj +6142 0 obj << +/D [6134 0 R /XYZ 139.477 672.4782 null] +>> endobj +6143 0 obj << +/D [6134 0 R /XYZ 71.731 634.6202 null] +>> endobj +6144 0 obj << +/D [6134 0 R /XYZ 71.731 621.5692 null] +>> endobj +6145 0 obj << +/D [6134 0 R /XYZ 71.731 620.3239 null] +>> endobj +6146 0 obj << +/D [6134 0 R /XYZ 129.5143 601.2453 null] +>> endobj +6147 0 obj << +/D [6134 0 R /XYZ 71.731 599.0885 null] +>> endobj +6148 0 obj << +/D [6134 0 R /XYZ 71.731 599.0885 null] +>> endobj +6149 0 obj << +/D [6134 0 R /XYZ 139.477 583.3126 null] +>> endobj +6150 0 obj << +/D [6134 0 R /XYZ 139.477 583.3126 null] +>> endobj +6151 0 obj << +/D [6134 0 R /XYZ 71.731 581.1557 null] +>> endobj +6152 0 obj << +/D [6134 0 R /XYZ 139.477 565.3798 null] +>> endobj +6153 0 obj << +/D [6134 0 R /XYZ 139.477 565.3798 null] +>> endobj +6154 0 obj << +/D [6134 0 R /XYZ 71.731 563.9403 null] +>> endobj +6155 0 obj << +/D [6134 0 R /XYZ 139.477 547.4471 null] +>> endobj +6156 0 obj << +/D [6134 0 R /XYZ 139.477 547.4471 null] +>> endobj +6157 0 obj << +/D [6134 0 R /XYZ 71.731 546.0075 null] +>> endobj +6158 0 obj << +/D [6134 0 R /XYZ 139.477 529.5143 null] +>> endobj +6159 0 obj << +/D [6134 0 R /XYZ 139.477 529.5143 null] +>> endobj +6160 0 obj << +/D [6134 0 R /XYZ 71.731 527.3575 null] +>> endobj +6161 0 obj << +/D [6134 0 R /XYZ 139.477 511.5816 null] +>> endobj +6162 0 obj << +/D [6134 0 R /XYZ 139.477 511.5816 null] +>> endobj +6163 0 obj << +/D [6134 0 R /XYZ 71.731 509.4247 null] +>> endobj +6164 0 obj << +/D [6134 0 R /XYZ 139.477 493.6488 null] +>> endobj +6165 0 obj << +/D [6134 0 R /XYZ 139.477 493.6488 null] +>> endobj +6166 0 obj << +/D [6134 0 R /XYZ 71.731 492.2093 null] +>> endobj +6167 0 obj << +/D [6134 0 R /XYZ 139.477 475.716 null] +>> endobj +6168 0 obj << +/D [6134 0 R /XYZ 139.477 475.716 null] +>> endobj +6169 0 obj << +/D [6134 0 R /XYZ 71.731 473.5592 null] +>> endobj +6170 0 obj << +/D [6134 0 R /XYZ 139.477 457.7833 null] +>> endobj +6171 0 obj << +/D [6134 0 R /XYZ 139.477 457.7833 null] +>> endobj +883 0 obj << +/D [6134 0 R /XYZ 71.731 434.8692 null] +>> endobj +386 0 obj << +/D [6134 0 R /XYZ 303.7923 389.6149 null] +>> endobj +6172 0 obj << +/D [6134 0 R /XYZ 71.731 366.1261 null] +>> endobj +6173 0 obj << +/D [6134 0 R /XYZ 161.0655 356.7382 null] +>> endobj +6174 0 obj << +/D [6134 0 R /XYZ 71.731 344.6187 null] +>> endobj +6175 0 obj << +/D [6134 0 R /XYZ 71.731 313.2529 null] +>> endobj +6176 0 obj << +/D [6134 0 R /XYZ 168.8063 302.2426 null] +>> endobj +6177 0 obj << +/D [6134 0 R /XYZ 71.731 290.1231 null] +>> endobj +6178 0 obj << +/D [6134 0 R /XYZ 71.731 235.4446 null] +>> endobj +6179 0 obj << +/D [6134 0 R /XYZ 181.5683 224.4344 null] +>> endobj +6180 0 obj << +/D [6134 0 R /XYZ 71.731 214.3722 null] +>> endobj +6181 0 obj << +/D [6134 0 R /XYZ 71.731 180.949 null] +>> endobj +6182 0 obj << +/D [6134 0 R /XYZ 71.731 169.8392 null] +>> endobj +6183 0 obj << +/D [6134 0 R /XYZ 71.731 168.5938 null] +>> endobj +6184 0 obj << +/D [6134 0 R /XYZ 129.5143 149.5153 null] +>> endobj +6185 0 obj << +/D [6134 0 R /XYZ 129.5143 149.5153 null] +>> endobj +6186 0 obj << +/D [6134 0 R /XYZ 71.731 148.0758 null] +>> endobj +6187 0 obj << +/D [6134 0 R /XYZ 71.731 148.0758 null] +>> endobj +6188 0 obj << +/D [6134 0 R /XYZ 139.477 131.5826 null] +>> endobj +6189 0 obj << +/D [6134 0 R /XYZ 139.477 131.5826 null] +>> endobj +6190 0 obj << +/D [6134 0 R /XYZ 76.7123 113.6498 null] +>> endobj +6133 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6194 0 obj << +/Length 1345 +/Filter /FlateDecode +>> +stream +xÚÍZ]oÛ6}ϯÐcÌ?E²oÝ° Z Xó¶ê(‰GlCÿý(‹”¯¤+’-\ ÈƒûH÷ðÜs¯¨k³‚º?VhF´pn //¶ÏW´xtýqÅÜl¸¢×œ Ç»ª­»wÕçáß·þ^¼¯»§ýýñæßÛ¿®~»ã+¡‰5.H”¤d†HAm±á”XΊbÌ¥˜v‹¡†)ô¸n GSÖ/fč°~5Ÿ8WsvŒs`¼€ qçÇ3p֒‡0…q¢–òÄÃ-Y1)¦<ª®;4Ÿ_»ú®ûòRß=4»^cG촊sJSD«]Ìþ´7ƒÌÕáP}^î†cÓvþ Ÿª£ Ð>.Þ{ÝvËõ{†¥¥D2—T÷€Ú@ØYwÖ ®w„­êîlF¹´hÜuÝÃY( œ°Dj=¥ñÂ-ÈúËiîŽwpm +‘h~­U…$su£K4êºBá,”PH:®æ§<œ? B|Ü5ÛÚîd×N¯e‡·zßzïë¶k>QÊ £²)I”T2!@Ed ¨´lHÔÙ˜lÇàš¯T®­žëõjtí°Ô6Y«ÆKW#7§H5BC;òš½] +Õ[*ôEÔT”-uª*bª€J› +‰šcª9é]b4ä1»K4÷ÈÂJ"hɧ7ˆES[i|‹5zʸ“+åPC¤]\mU[åTR”£q×µ g¡<€÷”ãA¹˜ò¸pŸ×ZJb Ó)å,¦\€¥•Câæ(‡ðÀ”ƒ
+ Authentication + + The API should be accessed via XML-RPC over HTTPS. The API + supports the standard introspection calls system.listMethods, system.methodSignature, + and system.methodHelp, + and the standard batching call system.multicall. With the + exception of these calls, all PLCAPI calls take an + authentication structure as their first argument. All + authentication structures require the specification of + AuthMethod. If the documentation for a + call does not further specify the authentication structure, then + any of (but only) the following authentication structures may be + used: + + + + Session authentication. User sessions are typically + valid for 24 hours. Node sessions are valid until the next + reboot. Obtain a session key with GetSession using another form of + authentication, such as password or GnuPG + authentication. + + + + AuthMethodsession + sessionSession key + + + + + + Password authentication. + + + + AuthMethodpassword + UsernameUsername, typically an e-mail address + AuthStringAuthentication string, typically a password + + + + + + GnuPG authentication. Users may upload a GPG public key + using AddPersonKey. Peer + GPG keys should be added with AddPeer or UpdatePeer. + + + + + AuthMethodgpg + namePeer or user name + signatureGnuPG signature of + the canonicalized + XML-RPC + representation of the rest of the arguments to the + call. + + + + + + Anonymous authentication. + + + + AuthMethodanonymous + + + + + +
+ +
+ Roles + + Some functions may only be called by users with certain + roles (see GetRoles), and others + may return different information to different callers depending + on the role(s) of the caller. + + The node and + anonymous roles are pseudo-roles. A function + that allows the node role may be called by + automated scripts running on a node, such as the Boot and Node + Managers. A function that allows the + anonymous role may be called by anyone; an + API authentication structure must still be specified (see ). +
+ +
+ Filters + + Most of the Get functions take a + filter argument. Filters may be arrays of integer (and sometimes + string) identifiers, or a struct representing a filter on the + attributes of the entities being queried. For example, + + +# plcsh code fragment (see below) +GetNodes([1,2,3]) +GetNodes({'node_id': [1,2,3]}) +GetNodes({'node_id': 1}) + GetNodes({'node_id': 2}) + GetNodes({'node_id': 3}) + + + Would all be equivalent queries. Attributes that are + themselves arrays (such as nodenetwork_ids + and slice_ids for nodes) cannot be used in + filters. +
+ +
+ PlanetLab shell + + A command-line program called plcsh + simplifies authentication structure handling, and is useful for + scripting. This program is distributed as a Linux RPM called + PLCAPI and requires Python ≥2.4. + + +usage: plcsh [options] + +options: + -f CONFIG, --config=CONFIG + PLC configuration file + -h URL, --url=URL API URL + -c CACERT, --cacert=CACERT + API SSL certificate + -k INSECURE, --insecure=INSECURE + Do not check SSL certificate + -m METHOD, --method=METHOD + API authentication method + -s SESSION, --session=SESSION + API session key + -u USER, --user=USER API user name + -p PASSWORD, --password=PASSWORD + API password + -r ROLE, --role=ROLE API role + -x, --xmlrpc Use XML-RPC interface + --help show this help message and exit + + + Specify at least the API URL and your user name: + + +plcsh --url https://www.planet-lab.org/PLCAPI/ -u user@site.edu + + + You will be presented with a prompt. From here, you can + invoke API calls and omit the authentication structure, as it will + be filled in automatically. + + +user@site.edu connected using password authentication +Type "system.listMethods()" or "help(method)" for more information. +[user@site.edu]>>> AuthCheck() +1 +[user@site.edu]>>> GetNodes([121], ['node_id', 'hostname']) +[{'node_id': 121, 'hostname': 'planetlab-1.cs.princeton.edu'}] + + + As this program is actually a Python interpreter, you may + create variables, execute for loops, import other packages, etc., + directly on the command line as you would using the regular Python + shell. + + To use plcsh programmatically, import + the PLC.Shell module: + + +#!/usr/bin/python + +import sys + +# Default location that the PLCAPI RPM installs the PLC class +sys.path.append('/usr/share/plc_api') + +# Initialize shell environment. Shell() will define all PLCAPI methods +# in the specified namespace (specifying globals() will define them +# globally). +from PLC.Shell import Shell +plc = Shell(globals(), + url = "https://www.planet-lab.org/PLCAPI/", + user = "user@site.edu", + password = "password") + +# Both are equivalent +nodes = GetNodes([121], ['node_id', 'hostname']) +nodes = plc.GetNodes([121], ['node_id', 'hostname']) + +
+ + + + PlanetLab API Methods + + + &Methods; + + + + + + + diff --git a/trunk/migrations/001-down-subversion.sql b/trunk/migrations/001-down-subversion.sql new file mode 100644 index 0000000..5e3255c --- /dev/null +++ b/trunk/migrations/001-down-subversion.sql @@ -0,0 +1,3 @@ +-- you may also write downgrader scripts, though they are not - yet - supported + +ALTER TABLE plc_db_version DROP subversion; diff --git a/trunk/migrations/001-up-subversion.sql b/trunk/migrations/001-up-subversion.sql new file mode 100644 index 0000000..01046a5 --- /dev/null +++ b/trunk/migrations/001-up-subversion.sql @@ -0,0 +1,5 @@ +-- Add plc_db_version.subversion field +ALTER TABLE plc_db_version ADD subversion integer NOT NULL DEFAULT 0; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 1; diff --git a/trunk/migrations/002-up-slices.sql b/trunk/migrations/002-up-slices.sql new file mode 100644 index 0000000..4bf656d --- /dev/null +++ b/trunk/migrations/002-up-slices.sql @@ -0,0 +1,6 @@ +-- Remove NOT NULL constraint from creator_person_id in case the +-- creator is deleted. +ALTER TABLE slices ALTER creator_person_id DROP NOT NULL; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 2; diff --git a/trunk/migrations/003-down-network-settings.sql b/trunk/migrations/003-down-network-settings.sql new file mode 100644 index 0000000..796e4b4 --- /dev/null +++ b/trunk/migrations/003-down-network-settings.sql @@ -0,0 +1,24 @@ +-- IMPORTANT NOTICE +-- +-- this down script is provided for convenience only +-- DO NOT USE on an operational site +-- the change in migration 003 involves creating +-- the new view view_nodenetworks for fetching instances +-- of NodeNetworks +-- AND to alter NodeNetworks.py accordingly +-- so this change cannot be easily undone +-- unless you also revert the API itself + +DROP VIEW view_nodenetworks; + +DROP VIEW view_nodenetwork_settings; + +DROP VIEW nodenetwork_settings; + +DROP TABLE nodenetwork_setting; + +DROP TABLE nodenetwork_setting_types; + +-- deflate subversion +UPDATE plc_db_version SET subversion = 2; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/003-test.py b/trunk/migrations/003-test.py new file mode 100755 index 0000000..aed650b --- /dev/null +++ b/trunk/migrations/003-test.py @@ -0,0 +1,60 @@ +#!/usr/bin/env plcsh + +nnst = GetNodeNetworkSettingTypes(['interface_name']) +if nnst: + print 'NodeNetworkSettingType interface_name already defined' +else: + AddNodeNetworkSettingType({ + 'category':'general', + 'min_role_id':30, + 'name':'interface_name', + 'description':'allows to specify a custom interface name' + }) +nnst_ifname_id = GetNodeNetworkSettingTypes(['interface_name'])[0]['nodenetwork_setting_type_id'] + + +nnst = GetNodeNetworkSettingTypes(['ssid']) +if nnst: + print 'NodeNetworkSettingType ssid already defined' +else: + AddNodeNetworkSettingType({ + 'category':'wifi', + 'min_role_id':30, + 'name':'ssid', + 'description':'allows to set ESSID' + }) +nnst_ssid_id = GetNodeNetworkSettingTypes(['ssid'])[0]['nodenetwork_setting_type_id'] + +nodename = 'onelab2.inria.fr' + +nodenetwork_id=GetNodes(nodename)[0]['nodenetwork_ids'][0] + +####### +nns_ifname = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ifname_id}) +if nns_ifname: + print "interface name for %s already set (got %s - cat=%s)" %\ + (nodename,nns_ifname[0]['value'],nns_ifname[0]['category']) +else: + AddNodeNetworkSetting(nodenetwork_id, 'interface_name', 'custom-eth0') + +nns_ifname_id = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ifname_id})[0]['nodenetwork_setting_id'] +####### +nns_ssid = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ssid_id}) +if nns_ssid: + print "ssid for %s already set (got %s - cat=%s)" %\ + (nodename,nns_ifname[0]['value'],nns_ifname[0]['category']) +else: + AddNodeNetworkSetting(nodenetwork_id, 'ssid', 'init-onelab-g') + +nns_ssid_id = GetNodeNetworkSettings ({'nodenetwork_id':nodenetwork_id, + 'nodenetwork_setting_type_id':nnst_ssid_id})[0]['nodenetwork_setting_id'] + +####### + +UpdateNodeNetworkSetting (nns_ssid_id,'onelab-g') + +DeleteNodeNetworkSetting (nns_ifname_id) + diff --git a/trunk/migrations/003-up-network-settings.sql b/trunk/migrations/003-up-network-settings.sql new file mode 100644 index 0000000..64b0ff6 --- /dev/null +++ b/trunk/migrations/003-up-network-settings.sql @@ -0,0 +1,86 @@ +-- +-- Thierry Parmentelat -- INRIA +-- +-- migration 003 +-- +-- purpose : provide a generic mechanism for assigning +-- nodenetworks (read, network interfaces) with +-- custom settings +-- +-- design +-- mimicks the way slice attributes are being handled, +-- not that this design is particularly attractive +-- but let's not add confusion here +-- i.e: +-- (*) nodenetwork_setting_types (see slice_attribute_types) +-- allows to define a new setting +-- e.g, define one such object for storing wifi SSID +-- +-- (*) nodenetwork_setting (see slice_attribute) +-- allow to associate a nodenetwork, a nodenetwork_setting_type, and a value +-- +-- NOTE. with slice_attributes there is a trick that allows to define +-- the attribute either on the slice globally or on a particular node only. +-- of course we do not need such a trick + +CREATE TABLE nodenetwork_setting_types ( + nodenetwork_setting_type_id serial PRIMARY KEY, + -- Setting Type Identifier + name text UNIQUE NOT NULL, -- Setting Name + description text, -- Optional Description + category text NOT NULL, -- Category, e.g. Wifi, or whatever + min_role_id integer references roles -- If set, minimal role required +) WITH OIDS; + +CREATE TABLE nodenetwork_setting ( + nodenetwork_setting_id serial PRIMARY KEY, -- Nodenetwork Setting Identifier + nodenetwork_id integer REFERENCES nodenetworks NOT NULL, + -- the nodenetwork this applies to + nodenetwork_setting_type_id integer REFERENCES nodenetwork_setting_types NOT NULL, + -- the setting type + value text +) WITH OIDS; + + +CREATE OR REPLACE VIEW nodenetwork_settings AS +SELECT nodenetwork_id, +array_accum(nodenetwork_setting_id) AS nodenetwork_setting_ids +FROM nodenetwork_setting +GROUP BY nodenetwork_id; + +CREATE OR REPLACE VIEW view_nodenetwork_settings AS +SELECT +nodenetwork_setting.nodenetwork_setting_id, +nodenetwork_setting.nodenetwork_id, +nodenetwork_setting_types.nodenetwork_setting_type_id, +nodenetwork_setting_types.name, +nodenetwork_setting_types.description, +nodenetwork_setting_types.category, +nodenetwork_setting_types.min_role_id, +nodenetwork_setting.value +FROM nodenetwork_setting +INNER JOIN nodenetwork_setting_types USING (nodenetwork_setting_type_id); + +CREATE VIEW view_nodenetworks AS +SELECT +nodenetworks.nodenetwork_id, +nodenetworks.node_id, +nodenetworks.is_primary, +nodenetworks.type, +nodenetworks.method, +nodenetworks.ip, +nodenetworks.mac, +nodenetworks.gateway, +nodenetworks.network, +nodenetworks.broadcast, +nodenetworks.netmask, +nodenetworks.dns1, +nodenetworks.dns2, +nodenetworks.bwlimit, +nodenetworks.hostname, +COALESCE((SELECT nodenetwork_setting_ids FROM nodenetwork_settings WHERE nodenetwork_settings.nodenetwork_id = nodenetworks.nodenetwork_id), '{}') AS nodenetwork_setting_ids +FROM nodenetworks; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 3; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/004-up-fix-site-nodes.sql b/trunk/migrations/004-up-fix-site-nodes.sql new file mode 100644 index 0000000..8bc9c58 --- /dev/null +++ b/trunk/migrations/004-up-fix-site-nodes.sql @@ -0,0 +1,16 @@ +-- +-- bugfix +-- the site_nodes should restrict to nodes where deleted is false +-- + +CREATE OR REPLACE VIEW site_nodes AS +SELECT site_id, +array_accum(node_id) AS node_ids +FROM nodes +WHERE deleted is false +GROUP BY site_id; + +-- Bump subversion +UPDATE plc_db_version SET subversion = 4; +SELECT subversion from plc_db_version; + diff --git a/trunk/migrations/005-down-import-apr-2007.sql b/trunk/migrations/005-down-import-apr-2007.sql new file mode 100644 index 0000000..fa16b12 --- /dev/null +++ b/trunk/migrations/005-down-import-apr-2007.sql @@ -0,0 +1,112 @@ +-- revert migration 005 +-- +-- this is a rather complex example, so for next times, make sure that you +-- * first restore old columns or tables +-- * then create or replace views +-- * and only finally drop new columns and tables +-- otherwise the columns may refuse to get dropped if they are still used by views +-- + +---------- creations + +ALTER TABLE events ADD object_type text NOT NULL Default 'Unknown'; + +---------- view changes + +-- for some reason these views require to be dropped first +DROP VIEW view_events; +DROP VIEW event_objects; +DROP VIEW view_nodes; +DROP VIEW view_sites; + +CREATE OR REPLACE VIEW event_objects AS +SELECT event_id, +array_accum(object_id) AS object_ids +FROM event_object +GROUP BY event_id; + +CREATE OR REPLACE VIEW view_events AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.fault_code, +events.call_name, +events.call, +events.object_type, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +COALESCE((SELECT object_ids FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_ids +FROM events; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +CREATE OR REPLACE VIEW view_sites AS +SELECT +sites.site_id, +sites.login_base, +sites.name, +sites.abbreviated_name, +sites.deleted, +sites.enabled, +sites.is_public, +sites.max_slices, +sites.max_slivers, +sites.latitude, +sites.longitude, +sites.url, +CAST(date_part('epoch', sites.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', sites.last_updated) AS bigint) AS last_updated, +peer_site.peer_id, +peer_site.peer_site_id, +COALESCE((SELECT person_ids FROM site_persons WHERE site_persons.site_id = sites.site_id), '{}') AS person_ids, +COALESCE((SELECT node_ids FROM site_nodes WHERE site_nodes.site_id = sites.site_id), '{}') AS node_ids, +COALESCE((SELECT address_ids FROM site_addresses WHERE site_addresses.site_id = sites.site_id), '{}') AS address_ids, +COALESCE((SELECT slice_ids FROM site_slices WHERE site_slices.site_id = sites.site_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM site_pcus WHERE site_pcus.site_id = sites.site_id), '{}') AS pcu_ids +FROM sites +LEFT JOIN peer_site USING (site_id); + +---------- deletions + +ALTER TABLE sites DROP COLUMN ext_consortium_id; + +ALTER TABLE nodes DROP COLUMN last_contact; + +DROP INDEX initscripts_name_idx; +DROP TABLE initscripts; + +ALTER TABLE events DROP COLUMN auth_type; + +ALTER TABLE event_object DROP COLUMN object_type; + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 4; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/005-up-import-apr-2007.sql b/trunk/migrations/005-up-import-apr-2007.sql new file mode 100644 index 0000000..3a34f25 --- /dev/null +++ b/trunk/migrations/005-up-import-apr-2007.sql @@ -0,0 +1,154 @@ +-- +-- to apply changes from import done in april 2007 from the +-- planetlab-4_0-branch tag +-- +-- this is a rather complex example, so for next times, make sure that you +-- * first add new columns and new tables +-- * then create or replace views +-- * and only finally drop columns +-- otherwise the columns may refuse to get dropped if they are still used by views +-- + +---------- creations + +ALTER TABLE sites ADD ext_consortium_id integer; + +ALTER TABLE nodes ADD last_contact timestamp without time zone; + +-- Initscripts +CREATE TABLE initscripts ( + initscript_id serial PRIMARY KEY, -- Initscript identifier + name text NOT NULL, -- Initscript name + enabled bool NOT NULL DEFAULT true, -- Initscript is active + script text NOT NULL, -- Initscript + UNIQUE (name) +) WITH OIDS; +CREATE INDEX initscripts_name_idx ON initscripts (name); + +-- rather drop the tables altogether, +-- ALTER TABLE events ADD auth_type text; +-- ALTER TABLE event_object ADD COLUMN object_type text NOT NULL Default 'Unknown'; +-- CREATE INDEX event_object_object_type_idx ON event_object (object_type); + +-- for some reason these views require to be dropped first +DROP VIEW view_events; +DROP VIEW event_objects; +DROP VIEW view_nodes; +DROP VIEW view_sites; + +----dropping tables must be preceded by dropping views using those tables +----otherwise dependency problems +DROP TABLE event_object; +DROP TABLE events; + +CREATE TABLE events ( + event_id serial PRIMARY KEY, -- Event identifier + person_id integer REFERENCES persons, -- Person responsible for event, if any + node_id integer REFERENCES nodes, -- Node responsible for event, if any + auth_type text, -- Type of auth used. i.e. AuthMethod + fault_code integer NOT NULL DEFAULT 0, -- Did this event result in error + call_name text NOT NULL, -- Call responsible for this event + call text NOT NULL, -- Call responsible for this event, including parameters + message text, -- High level description of this event + runtime float DEFAULT 0, -- Event run time + time timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP -- Event timestamp +) WITH OIDS; + +-- Database object(s) that may have been affected by a particular event +CREATE TABLE event_object ( + event_id integer REFERENCES events NOT NULL, -- Event identifier + object_id integer NOT NULL, -- Object identifier + object_type text NOT NULL Default 'Unknown' -- What type of object is this event affecting +) WITH OIDS; +CREATE INDEX event_object_event_id_idx ON event_object (event_id); +CREATE INDEX event_object_object_id_idx ON event_object (object_id); +CREATE INDEX event_object_object_type_idx ON event_object (object_type); + +---------- view changes + +CREATE OR REPLACE VIEW event_objects AS +SELECT event_id, +array_accum(object_id) AS object_ids, +array_accum(object_type) AS object_types +FROM event_object +GROUP BY event_id; + +CREATE OR REPLACE VIEW view_events AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.auth_type, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +COALESCE((SELECT object_ids FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_ids, +COALESCE((SELECT object_types FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_types +FROM events; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +CREATE OR REPLACE VIEW view_sites AS +SELECT +sites.site_id, +sites.login_base, +sites.name, +sites.abbreviated_name, +sites.deleted, +sites.enabled, +sites.is_public, +sites.max_slices, +sites.max_slivers, +sites.latitude, +sites.longitude, +sites.url, +sites.ext_consortium_id, +CAST(date_part('epoch', sites.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', sites.last_updated) AS bigint) AS last_updated, +peer_site.peer_id, +peer_site.peer_site_id, +COALESCE((SELECT person_ids FROM site_persons WHERE site_persons.site_id = sites.site_id), '{}') AS person_ids, +COALESCE((SELECT node_ids FROM site_nodes WHERE site_nodes.site_id = sites.site_id), '{}') AS node_ids, +COALESCE((SELECT address_ids FROM site_addresses WHERE site_addresses.site_id = sites.site_id), '{}') AS address_ids, +COALESCE((SELECT slice_ids FROM site_slices WHERE site_slices.site_id = sites.site_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM site_pcus WHERE site_pcus.site_id = sites.site_id), '{}') AS pcu_ids +FROM sites +LEFT JOIN peer_site USING (site_id); + +---------- deletions +--dont need to drop this colum it doesn't exit anymore +-----ALTER TABLE events DROP COLUMN object_type; + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 5; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/006-down-slice-attribute-nodegroup.sql b/trunk/migrations/006-down-slice-attribute-nodegroup.sql new file mode 100644 index 0000000..0dc4bae --- /dev/null +++ b/trunk/migrations/006-down-slice-attribute-nodegroup.sql @@ -0,0 +1,25 @@ +---------- view changes + +DROP VIEW view_slice_attributes; + +CREATE OR REPLACE VIEW view_slice_attributes AS +SELECT +slice_attribute.slice_attribute_id, +slice_attribute.slice_id, +slice_attribute.node_id, +slice_attribute_types.attribute_type_id, +slice_attribute_types.name, +slice_attribute_types.description, +slice_attribute_types.min_role_id, +slice_attribute.value +FROM slice_attribute +INNER JOIN slice_attribute_types USING (attribute_type_id); + +---------- deletions +DROP INDEX slice_attribute_nodegroup_id_idx; +ALTER TABLE slice_attribute DROP COLUMN nodegroup_id; + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 5; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/006-up-slice-attribute-nodegroup.sql b/trunk/migrations/006-up-slice-attribute-nodegroup.sql new file mode 100644 index 0000000..801f2a0 --- /dev/null +++ b/trunk/migrations/006-up-slice-attribute-nodegroup.sql @@ -0,0 +1,29 @@ +---------- creations + +ALTER TABLE slice_attribute ADD nodegroup_id integer REFERENCES nodegroups; + +CREATE INDEX slice_attribute_nodegroup_id_idx ON slice_attribute (nodegroup_id); + +---------- view changes + +DROP VIEW view_slice_attributes; + +CREATE OR REPLACE VIEW view_slice_attributes AS +SELECT +slice_attribute.slice_attribute_id, +slice_attribute.slice_id, +slice_attribute.node_id, +slice_attribute.nodegroup_id, +slice_attribute_types.attribute_type_id, +slice_attribute_types.name, +slice_attribute_types.description, +slice_attribute_types.min_role_id, +slice_attribute.value +FROM slice_attribute +INNER JOIN slice_attribute_types USING (attribute_type_id); + + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 6; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/007-down-event-objects-view.sql b/trunk/migrations/007-down-event-objects-view.sql new file mode 100644 index 0000000..09b86f3 --- /dev/null +++ b/trunk/migrations/007-down-event-objects-view.sql @@ -0,0 +1,11 @@ +-- +-- migration 007 - revert +-- + +DROP VIEW view_event_objects; + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 6; +SELECT subversion from plc_db_version; + diff --git a/trunk/migrations/007-up-event-objects-view.sql b/trunk/migrations/007-up-event-objects-view.sql new file mode 100644 index 0000000..2ed47ee --- /dev/null +++ b/trunk/migrations/007-up-event-objects-view.sql @@ -0,0 +1,26 @@ +-- +-- migration 007 +-- change the way event objects are fetched, use a view for that purpose +-- + + +CREATE OR REPLACE VIEW view_event_objects AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +event_object.object_id, +event_object.object_type +FROM events LEFT JOIN event_object USING (event_id); + + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 7; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/008-down-import-aug-2007.sql b/trunk/migrations/008-down-import-aug-2007.sql new file mode 100644 index 0000000..9a3eaab --- /dev/null +++ b/trunk/migrations/008-down-import-aug-2007.sql @@ -0,0 +1,42 @@ + +DELETE from slice_instantiations WHERE instantiation='nm-controller'; + + + +DROP VIEW view_nodes; +DROP VIEW node_slices_whitelist; +DROP TABLE node_slice_whitelist; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + + +---------- revert subversion + +UPDATE plc_db_version SET subversion = 7; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/008-up-import-aug-2007.sql b/trunk/migrations/008-up-import-aug-2007.sql new file mode 100644 index 0000000..2220f8b --- /dev/null +++ b/trunk/migrations/008-up-import-aug-2007.sql @@ -0,0 +1,64 @@ +-- +-- migration 008 +-- import from Princeton codebase on august 2007 28 +-- slice instantiation 'nm-controller' +-- * white lists +-- + +INSERT INTO slice_instantiations (instantiation) VALUES ('nm-controller'); -- NM Controller + +-------------------------------------------------------------------------------- +-- Slice whitelist +-------------------------------------------------------------------------------- +-- slice whitelist on nodes +CREATE TABLE node_slice_whitelist ( + node_id integer REFERENCES nodes NOT NULL, -- Node id of whitelist + slice_id integer REFERENCES slices NOT NULL, -- Slice id thats allowd on this node + PRIMARY KEY (node_id, slice_id) +) WITH OIDS; +CREATE INDEX node_slice_whitelist_node_id_idx ON node_slice_whitelist (node_id); +CREATE INDEX node_slice_whitelist_slice_id_idx ON node_slice_whitelist (slice_id); + +-- Slices on each node +CREATE VIEW node_slices_whitelist AS +SELECT node_id, +array_accum(slice_id) AS slice_ids_whitelist +FROM node_slice_whitelist +GROUP BY node_id; + +DROP VIEW view_nodes; + + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT slice_ids_whitelist FROM node_slices_whitelist WHERE node_slices_whitelist.node_id = nodes.node_id), '{}') AS slice_ids_whitelist, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +---------- bump subversion + +UPDATE plc_db_version SET subversion = 8; +SELECT subversion from plc_db_version; diff --git a/trunk/migrations/009-down-pcu-types.sql b/trunk/migrations/009-down-pcu-types.sql new file mode 100644 index 0000000..1dbe9d2 --- /dev/null +++ b/trunk/migrations/009-down-pcu-types.sql @@ -0,0 +1,13 @@ +-- +-- 009 revert +-- + +DROP VIEW view_pcu_types; + +DROP VIEW pcu_type_ports; + +DROP TABLE pcu_type_port; + +DROP TABLE pcu_types; + +UPDATE plc_db_version SET subversion = 7; diff --git a/trunk/migrations/009-up-pcu-types.sql b/trunk/migrations/009-up-pcu-types.sql new file mode 100644 index 0000000..c7dd7b6 --- /dev/null +++ b/trunk/migrations/009-up-pcu-types.sql @@ -0,0 +1,41 @@ +-- +-- Tony Mack - PlanetLab +-- +-- migration 009 +-- +-- purpose: provide a means for storing details about pcu models +-- +-- + +CREATE TABLE pcu_types ( + pcu_type_id serial PRIMARY KEY, + model text NOT NULL, -- PCU model name + name text -- Full PCU model name +) WITH OIDS; +CREATE INDEX pcu_types_model_idx ON pcu_types (model); + +CREATE TABLE pcu_protocol_type ( + pcu_protocol_type_id serial PRIMARY KEY, + pcu_type_id integer REFERENCES pcu_types NOT NULL, -- PCU type identifier + port integer NOT NULL, -- PCU port + protocol text NOT NULL, -- Protocol + supported boolean NOT NULL DEFAULT True -- Does PLC support +) WITH OIDS; +CREATE INDEX pcu_protocol_type_pcu_type_id ON pcu_protocol_type (pcu_type_id); + + +CREATE OR REPLACE VIEW pcu_protocol_types AS +SELECT pcu_type_id, +array_accum(pcu_protocol_type_id) as pcu_protocol_type_ids +FROM pcu_protocol_type +GROUP BY pcu_type_id; + +CREATE OR REPLACE VIEW view_pcu_types AS +SELECT +pcu_types.pcu_type_id, +pcu_types.model, +pcu_types.name, +COALESCE((SELECT pcu_protocol_type_ids FROM pcu_protocol_types WHERE pcu_protocol_types.pcu_type_id = pcu_types.pcu_type_id), '{}') AS pcu_protocol_type_ids +FROM pcu_types; + +UPDATE plc_db_version SET subversion = 9; diff --git a/trunk/migrations/README.txt b/trunk/migrations/README.txt new file mode 100644 index 0000000..e8570bf --- /dev/null +++ b/trunk/migrations/README.txt @@ -0,0 +1,8 @@ +Store here migration scripts, named +-up-any-text. +with contiguous indices starting with 001 + +if the extension is .sql it is ran on the planetlab4 database +otherwise it is run as is + +See myplc/plc.d/db for how this is used diff --git a/trunk/php/.cvsignore b/trunk/php/.cvsignore new file mode 100644 index 0000000..dd89eef --- /dev/null +++ b/trunk/php/.cvsignore @@ -0,0 +1,2 @@ +methods.php +plc_api.php diff --git a/trunk/php/Makefile b/trunk/php/Makefile new file mode 100644 index 0000000..560ff68 --- /dev/null +++ b/trunk/php/Makefile @@ -0,0 +1,25 @@ +# +# (Re)builds PHP API. PHP classes must be defined in a single file. +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +all: plc_api.php + +methods.php: methods.py ../PLC/__init__.py ../PLC/Methods/__init__.py + PYTHONPATH=.. python $< > $@ + # Indent all lines by a couple of spaces + sed -i -e "s/^/ /" $@ + +plc_api.php: header.php methods.php footer.php + # Set timestamp + sed -e "s/@DATE@/$$(date)/" header.php > $@ + cat methods.php footer.php >> $@ + +clean: + rm -f plc_api.php methods.php + +.PHONY: all clean diff --git a/trunk/php/footer.php b/trunk/php/footer.php new file mode 100644 index 0000000..6212304 --- /dev/null +++ b/trunk/php/footer.php @@ -0,0 +1,9 @@ +} + +global $adm; + +$adm = new PLCAPI(array('AuthMethod' => "capability", + 'Username' => PLC_API_MAINTENANCE_USER, + 'AuthString' => PLC_API_MAINTENANCE_PASSWORD)); + +?> diff --git a/trunk/php/header.php b/trunk/php/header.php new file mode 100644 index 0000000..5172894 --- /dev/null +++ b/trunk/php/header.php @@ -0,0 +1,202 @@ + +// Copyright (C) 2005-2006 The Trustees of Princeton University +// +// $Id$ +// +// + +require_once 'plc_config.php'; + +class PLCAPI +{ + var $auth; + var $server; + var $port; + var $path; + var $errors; + var $trace; + var $calls; + var $multicall; + + function PLCAPI($auth = NULL, + $server = PLC_API_HOST, + $port = PLC_API_PORT, + $path = PLC_API_PATH, + $cainfo = NULL) + { + $this->auth = $auth; + $this->server = $server; + $this->port = $port; + $this->path = $path; + $this->cainfo = $cainfo; + $this->errors = array(); + $this->trace = array(); + $this->calls = array(); + $this->multicall = false; + } + + function error_log($error_msg, $backtrace_level = 1) + { + $backtrace = debug_backtrace(); + $file = $backtrace[$backtrace_level]['file']; + $line = $backtrace[$backtrace_level]['line']; + + $this->errors[] = 'PLCAPI error: ' . $error_msg . ' in ' . $file . ' on line ' . $line; + error_log(end($this->errors)); + } + + function error() + { + if (empty($this->trace)) { + return NULL; + } else { + $last_trace = end($this->trace); + return implode("\\n", $last_trace['errors']); + } + } + + function trace() + { + return $this->trace; + } + + function microtime_float() + { + list($usec, $sec) = explode(" ", microtime()); + return ((float) $usec + (float) $sec); + } + + function call($method, $args = NULL) + { + if ($this->multicall) { + $this->calls[] = array ('methodName' => $method, + 'params' => $args); + return NULL; + } else { + return $this->internal_call ($method, $args, 3); + } + } + + function internal_call($method, $args = NULL, $backtrace_level = 2) + { + $curl = curl_init(); + + // Verify peer certificate if talking over SSL + if ($this->port == 443) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 2); + if (!empty($this->cainfo)) { + curl_setopt($curl, CURLOPT_CAINFO, $this->cainfo); + } elseif (defined('PLC_API_CA_SSL_CRT')) { + curl_setopt($curl, CURLOPT_CAINFO, PLC_API_CA_SSL_CRT); + } + $url = 'https://'; + } else { + $url = 'http://'; + } + + // Set the URL for the request + $url .= $this->server . ':' . $this->port . '/' . $this->path; + curl_setopt($curl, CURLOPT_URL, $url); + + // Marshal the XML-RPC request as a POST variable. is an + // extension to the XML-RPC spec that is supported in our custom + // version of xmlrpc.so via the 'allow_null' output_encoding key. + $request = xmlrpc_encode_request($method, $args, array('allow_null' => TRUE)); + curl_setopt($curl, CURLOPT_POSTFIELDS, $request); + + // Construct the HTTP header + $header[] = 'Content-type: text/xml'; + $header[] = 'Content-length: ' . strlen($request); + curl_setopt($curl, CURLOPT_HTTPHEADER, $header); + + // Set some miscellaneous options + curl_setopt($curl, CURLOPT_TIMEOUT, 30); + + // Get the output of the request + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + $t0 = $this->microtime_float(); + $output = curl_exec($curl); + $t1 = $this->microtime_float(); + + if (curl_errno($curl)) { + $this->error_log('curl: ' . curl_error($curl), true); + $ret = NULL; + } else { + $ret = xmlrpc_decode($output); + if (is_array($ret) && xmlrpc_is_fault($ret)) { + $this->error_log('Fault Code ' . $ret['faultCode'] . ': ' . + $ret['faultString'], $backtrace_level, true); + $ret = NULL; + } + } + + curl_close($curl); + + $this->trace[] = array('method' => $method, + 'args' => $args, + 'runtime' => $t1 - $t0, + 'return' => $ret, + 'errors' => $this->errors); + $this->errors = array(); + + return $ret; + } + + function begin() + { + if (!empty($this->calls)) { + $this->error_log ('Warning: multicall already in progress'); + } + + $this->multicall = true; + } + + function commit() + { + if (!empty ($this->calls)) { + $ret = array(); + $results = $this->internal_call ('system.multicall', array ($this->calls)); + foreach ($results as $result) { + if (is_array($result)) { + if (xmlrpc_is_fault($result)) { + $this->error_log('Fault Code ' . $result['faultCode'] . ': ' . + $result['faultString'], 1, true); + $ret[] = NULL; + // Thierry - march 30 2007 + // using $adm->error() is broken with begin/commit style + // this is because error() uses last item in trace and checks for ['errors'] + // when using begin/commit we do run internal_call BUT internal_call checks for + // multicall's result globally, not individual results, so ['errors'] comes empty + // I considered hacking internal_call + // to *NOT* maintain this->trace at all when invoked with multicall + // but it is too complex to get all values right + // so let's go for the hacky way, and just record individual errors at the right place + $this->trace[count($this->trace)-1]['errors'][] = end($this->errors); + } else { + $ret[] = $result[0]; + } + } else { + $ret[] = $result; + } + } + } else { + $ret = NULL; + } + + $this->calls = array(); + $this->multicall = false; + + return $ret; + } + + // + // PLCAPI Methods + // + diff --git a/trunk/php/methods.py b/trunk/php/methods.py new file mode 100755 index 0000000..ca34773 --- /dev/null +++ b/trunk/php/methods.py @@ -0,0 +1,111 @@ +#!/usr/bin/python +# +# Generates the PLCAPI interface for the website PHP code. +# +# Mark Huang +# Copyright (C) 2005 The Trustess of Princeton University +# +# $Id$ +# + +import os, sys +import time + +from PLC.API import PLCAPI +from PLC.Method import * +from PLC.Auth import Auth + +try: + set +except NameError: + from sets import Set + set = Set + +def php_cast(value): + """ + Casts Python values to PHP values. + """ + + if value is None: + return "NULL" + elif isinstance(value, (list, tuple, set)): + return "array(%s)" % ", ".join([php_cast(v) for v in value]) + elif isinstance(value, dict): + items = ["%s => %s" % (php_cast(k), php_cast(v)) for (k, v) in value.items()] + return "array(%s)" % ", ".join(items) + elif isinstance(value, (int, long, bool, float)): + return str(value) + else: + unicode_repr = repr(unicode(value)) + # Truncate the leading 'u' prefix + return unicode_repr[1:] + +# Class functions +api = PLCAPI(None) + +api.methods.sort() +for method in api.methods: + # Skip system. methods + if "system." in method: + continue + + function = api.callable(method) + + # Commented documentation + lines = ["// " + line.strip() for line in function.__doc__.strip().split("\n")] + print "\n".join(lines) + print + + # Function declaration + print "function " + function.name, + + # PHP function arguments + args = [] + (min_args, max_args, defaults) = function.args() + parameters = zip(max_args, function.accepts, defaults) + + for name, expected, default in parameters: + # Skip auth structures (added automatically) + if isinstance(expected, Auth) or \ + (isinstance(expected, Mixed) and \ + filter(lambda sub: isinstance(sub, Auth), expected)): + continue + + # Declare parameter + arg = "$" + name + + # Set optional parameters to their defaults + if name not in min_args: + arg += " = " + php_cast(default) + + args.append(arg) + + # Write function declaration + print "(" + ", ".join(args) + ")" + + # Begin function body + print "{" + + # API function arguments + i = 0 + for name, expected, default in parameters: + # Automatically added auth structures + if isinstance(expected, Auth) or \ + (isinstance(expected, Mixed) and \ + filter(lambda sub: isinstance(sub, Auth), expected)): + print " $args[] = $this->auth;" + continue + + print " ", + if name not in min_args: + print "if (func_num_args() > %d)" % i, + print "$args[] = $%s;" % name + + i += 1 + + # Call API function + print " return $this->call('%s', $args);" % method + + # End function body + print "}" + print diff --git a/trunk/php/xmlrpc/CREDITS b/trunk/php/xmlrpc/CREDITS new file mode 100644 index 0000000..cfb14fa --- /dev/null +++ b/trunk/php/xmlrpc/CREDITS @@ -0,0 +1,2 @@ +xmlrpc +Dan Libby diff --git a/trunk/php/xmlrpc/EXPERIMENTAL b/trunk/php/xmlrpc/EXPERIMENTAL new file mode 100644 index 0000000..6443e99 --- /dev/null +++ b/trunk/php/xmlrpc/EXPERIMENTAL @@ -0,0 +1,5 @@ +this extension is experimental, +its functions may change their names +or move to extension all together +so do not rely to much on them +you have been warned! diff --git a/trunk/php/xmlrpc/Makefile b/trunk/php/xmlrpc/Makefile new file mode 100644 index 0000000..40c6887 --- /dev/null +++ b/trunk/php/xmlrpc/Makefile @@ -0,0 +1,26 @@ +# +# Build xmlrpc.so PHP extension +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +CC := gcc +CFLAGS := -g -O2 -I. -Ilibxmlrpc -fPIC +CFLAGS += $(shell php-config --includes) +CFLAGS += $(shell xml2-config --cflags) + +LDFLAGS := -shared --export-dynamic +LIBS := -lexpat + +all: xmlrpc.so + +xmlrpc.so: xmlrpc-epi-php.o $(patsubst %.c, %.o, $(wildcard libxmlrpc/*.c)) + $(LD) $(LDFLAGS) -o $@ $^ $(LIBS) + +clean: + rm -f *.o libxmlrpc/*.o *.so + +.PHONY: all clean diff --git a/trunk/php/xmlrpc/config.m4 b/trunk/php/xmlrpc/config.m4 new file mode 100644 index 0000000..54335df --- /dev/null +++ b/trunk/php/xmlrpc/config.m4 @@ -0,0 +1,93 @@ +dnl +dnl $Id$ +dnl + +sinclude(ext/xmlrpc/libxmlrpc/acinclude.m4) +sinclude(ext/xmlrpc/libxmlrpc/xmlrpc.m4) +sinclude(libxmlrpc/acinclude.m4) +sinclude(libxmlrpc/xmlrpc.m4) + +PHP_ARG_WITH(xmlrpc, for XMLRPC-EPI support, +[ --with-xmlrpc[=DIR] Include XMLRPC-EPI support.]) + +PHP_ARG_WITH(expat-dir, libexpat dir for XMLRPC-EPI, +[ --with-expat-dir=DIR XMLRPC-EPI: libexpat dir for XMLRPC-EPI.],no,no) + +PHP_ARG_WITH(iconv-dir, iconv dir for XMLRPC-EPI, +[ --with-iconv-dir=DIR XMLRPC-EPI: iconv dir for XMLRPC-EPI.],no,no) + +if test "$PHP_XMLRPC" != "no"; then + + PHP_SUBST(XMLRPC_SHARED_LIBADD) + AC_DEFINE(HAVE_XMLRPC,1,[ ]) + + testval=no + for i in $PHP_EXPAT_DIR $XMLRPC_DIR /usr/local /usr; do + if test -f $i/$PHP_LIBDIR/libexpat.a -o -f $i/$PHP_LIBDIR/libexpat.$SHLIB_SUFFIX_NAME; then + AC_DEFINE(HAVE_LIBEXPAT2,1,[ ]) + PHP_ADD_LIBRARY_WITH_PATH(expat, $i/$PHP_LIBDIR, XMLRPC_SHARED_LIBADD) + PHP_ADD_INCLUDE($i/include) + testval=yes + break + fi + done + + if test "$testval" = "no"; then + AC_MSG_ERROR(XML-RPC support requires libexpat. Use --with-expat-dir=
) + fi + + if test "$PHP_ICONV_DIR" != "no"; then + PHP_ICONV=$PHP_ICONV_DIR + fi + + if test "$PHP_ICONV" = "no"; then + PHP_ICONV=yes + fi + + PHP_SETUP_ICONV(XMLRPC_SHARED_LIBADD, [], [ + AC_MSG_ERROR([iconv not found, in order to build xmlrpc you need the iconv library]) + ]) +fi + + +if test "$PHP_XMLRPC" = "yes"; then + XMLRPC_CHECKS + PHP_NEW_EXTENSION(xmlrpc,xmlrpc-epi-php.c libxmlrpc/base64.c \ + libxmlrpc/simplestring.c libxmlrpc/xml_to_dandarpc.c \ + libxmlrpc/xmlrpc_introspection.c libxmlrpc/encodings.c \ + libxmlrpc/system_methods.c libxmlrpc/xml_to_xmlrpc.c \ + libxmlrpc/queue.c libxmlrpc/xml_element.c libxmlrpc/xmlrpc.c \ + libxmlrpc/xml_to_soap.c,$ext_shared,, + -I@ext_srcdir@/libxmlrpc -DVERSION="0.50") + PHP_ADD_BUILD_DIR($ext_builddir/libxmlrpc) + XMLRPC_MODULE_TYPE=builtin + +elif test "$PHP_XMLRPC" != "no"; then + + if test -r $PHP_XMLRPC/include/xmlrpc.h; then + XMLRPC_DIR=$PHP_XMLRPC/include + elif test -r $PHP_XMLRPC/include/xmlrpc-epi/xmlrpc.h; then +dnl some xmlrpc-epi header files have generic file names like +dnl queue.h or base64.h. Distributions have to create dir +dnl for xmlrpc-epi because of this. + XMLRPC_DIR=$PHP_XMLRPC/include/xmlrpc-epi + else + AC_MSG_CHECKING(for XMLRPC-EPI in default path) + for i in /usr/local /usr; do + if test -r $i/include/xmlrpc.h; then + XMLRPC_DIR=$i/include + AC_MSG_RESULT(found in $i) + break + fi + done + fi + + if test -z "$XMLRPC_DIR"; then + AC_MSG_RESULT(not found) + AC_MSG_ERROR(Please reinstall the XMLRPC-EPI distribution) + fi + + PHP_ADD_INCLUDE($XMLRPC_DIR) + PHP_ADD_LIBRARY_WITH_PATH(xmlrpc, $XMLRPC_DIR/$PHP_LIBDIR, XMLRPC_SHARED_LIBADD) +fi + diff --git a/trunk/php/xmlrpc/config.m4.lib64 b/trunk/php/xmlrpc/config.m4.lib64 new file mode 100644 index 0000000..8551f6b --- /dev/null +++ b/trunk/php/xmlrpc/config.m4.lib64 @@ -0,0 +1,93 @@ +dnl +dnl $Id$ +dnl + +sinclude(ext/xmlrpc/libxmlrpc/acinclude.m4) +sinclude(ext/xmlrpc/libxmlrpc/xmlrpc.m4) +sinclude(libxmlrpc/acinclude.m4) +sinclude(libxmlrpc/xmlrpc.m4) + +PHP_ARG_WITH(xmlrpc, for XMLRPC-EPI support, +[ --with-xmlrpc[=DIR] Include XMLRPC-EPI support.]) + +PHP_ARG_WITH(expat-dir, libexpat dir for XMLRPC-EPI, +[ --with-expat-dir=DIR XMLRPC-EPI: libexpat dir for XMLRPC-EPI.],no,no) + +PHP_ARG_WITH(iconv-dir, iconv dir for XMLRPC-EPI, +[ --with-iconv-dir=DIR XMLRPC-EPI: iconv dir for XMLRPC-EPI.],no,no) + +if test "$PHP_XMLRPC" != "no"; then + + PHP_SUBST(XMLRPC_SHARED_LIBADD) + AC_DEFINE(HAVE_XMLRPC,1,[ ]) + + testval=no + for i in $PHP_EXPAT_DIR $XMLRPC_DIR /usr/local /usr; do + if test -f $i/lib/libexpat.a -o -f $i/lib/libexpat.$SHLIB_SUFFIX_NAME; then + AC_DEFINE(HAVE_LIBEXPAT2,1,[ ]) + PHP_ADD_LIBRARY_WITH_PATH(expat, $i/lib, XMLRPC_SHARED_LIBADD) + PHP_ADD_INCLUDE($i/include) + testval=yes + break + fi + done + + if test "$testval" = "no"; then + AC_MSG_ERROR(XML-RPC support requires libexpat. Use --with-expat-dir=) + fi + + if test "$PHP_ICONV_DIR" != "no"; then + PHP_ICONV=$PHP_ICONV_DIR + fi + + if test "$PHP_ICONV" = "no"; then + PHP_ICONV=yes + fi + + PHP_SETUP_ICONV(XMLRPC_SHARED_LIBADD, [], [ + AC_MSG_ERROR([iconv not found, in order to build xmlrpc you need the iconv library]) + ]) +fi + + +if test "$PHP_XMLRPC" = "yes"; then + XMLRPC_CHECKS + PHP_NEW_EXTENSION(xmlrpc,xmlrpc-epi-php.c libxmlrpc/base64.c \ + libxmlrpc/simplestring.c libxmlrpc/xml_to_dandarpc.c \ + libxmlrpc/xmlrpc_introspection.c libxmlrpc/encodings.c \ + libxmlrpc/system_methods.c libxmlrpc/xml_to_xmlrpc.c \ + libxmlrpc/queue.c libxmlrpc/xml_element.c libxmlrpc/xmlrpc.c \ + libxmlrpc/xml_to_soap.c,$ext_shared,, + -I@ext_srcdir@/libxmlrpc -DVERSION="0.50") + PHP_ADD_BUILD_DIR($ext_builddir/libxmlrpc) + XMLRPC_MODULE_TYPE=builtin + +elif test "$PHP_XMLRPC" != "no"; then + + if test -r $PHP_XMLRPC/include/xmlrpc.h; then + XMLRPC_DIR=$PHP_XMLRPC/include + elif test -r $PHP_XMLRPC/include/xmlrpc-epi/xmlrpc.h; then +dnl some xmlrpc-epi header files have generic file names like +dnl queue.h or base64.h. Distributions have to create dir +dnl for xmlrpc-epi because of this. + XMLRPC_DIR=$PHP_XMLRPC/include/xmlrpc-epi + else + AC_MSG_CHECKING(for XMLRPC-EPI in default path) + for i in /usr/local /usr; do + if test -r $i/include/xmlrpc.h; then + XMLRPC_DIR=$i/include + AC_MSG_RESULT(found in $i) + break + fi + done + fi + + if test -z "$XMLRPC_DIR"; then + AC_MSG_RESULT(not found) + AC_MSG_ERROR(Please reinstall the XMLRPC-EPI distribution) + fi + + PHP_ADD_INCLUDE($XMLRPC_DIR) + PHP_ADD_LIBRARY_WITH_PATH(xmlrpc, $XMLRPC_DIR/lib, XMLRPC_SHARED_LIBADD) +fi + diff --git a/trunk/php/xmlrpc/config.w32 b/trunk/php/xmlrpc/config.w32 new file mode 100644 index 0000000..8c399cd --- /dev/null +++ b/trunk/php/xmlrpc/config.w32 @@ -0,0 +1,14 @@ +// $Id$ +// vim:ft=javascript + +ARG_WITH("xmlrpc", "XMLRPC-EPI support", "no"); + +if (PHP_XMLRPC != "no") { + CHECK_HEADER_ADD_INCLUDE("xmlrpc.h", "CFLAGS_XMLRPC", configure_module_dirname + "/libxmlrpc"); + EXTENSION('xmlrpc', 'xmlrpc-epi-php.c', PHP_XMLRPC_SHARED, "-DVERSION=\"0.50\""); + ADD_SOURCES(configure_module_dirname + "/libxmlrpc", "base64.c simplestring.c xml_to_dandarpc.c \ + xmlrpc_introspection.c encodings.c system_methods.c xml_to_xmlrpc.c \ + queue.c xml_element.c xmlrpc.c xml_to_soap.c", "xmlrpc"); + ADD_EXTENSION_DEP('xmlrpc', 'libxml'); +} + diff --git a/trunk/php/xmlrpc/libxmlrpc/README b/trunk/php/xmlrpc/libxmlrpc/README new file mode 100644 index 0000000..323edfa --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/README @@ -0,0 +1,17 @@ +organization of this directory is moving towards this approach: + +.h -- public API and data types +_private.h -- protected API and data types +.c -- implementation and private API / types + +The rules are: +.c files may include *_private.h. +.h files may not include *_private.h + +This allows us to have a nicely encapsulated C api with opaque data types and private functions +that are nonetheless shared between source files without redundant extern declarations.. + + + + + diff --git a/trunk/php/xmlrpc/libxmlrpc/acinclude.m4 b/trunk/php/xmlrpc/libxmlrpc/acinclude.m4 new file mode 100644 index 0000000..49b6090 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/acinclude.m4 @@ -0,0 +1,32 @@ +# Local macros for automake & autoconf + +AC_DEFUN([XMLRPC_FUNCTION_CHECKS],[ + +# Standard XMLRPC list +AC_CHECK_FUNCS( \ + strtoul strtoull snprintf \ + strstr strpbrk strerror\ + memcpy memmove) + +]) + +AC_DEFUN([XMLRPC_HEADER_CHECKS],[ +AC_HEADER_STDC +AC_CHECK_HEADERS(xmlparse.h xmltok.h stdlib.h strings.h string.h) +]) + +AC_DEFUN([XMLRPC_TYPE_CHECKS],[ + +AC_REQUIRE([AC_C_CONST]) +AC_REQUIRE([AC_C_INLINE]) +AC_CHECK_SIZEOF(char, 1) + +AC_CHECK_SIZEOF(int, 4) +AC_CHECK_SIZEOF(long, 4) +AC_CHECK_SIZEOF(long long, 8) +AC_TYPE_SIZE_T +AC_HEADER_TIME +AC_TYPE_UID_T + + +]) diff --git a/trunk/php/xmlrpc/libxmlrpc/base64.c b/trunk/php/xmlrpc/libxmlrpc/base64.c new file mode 100644 index 0000000..7788d02 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/base64.c @@ -0,0 +1,192 @@ +static const char rcsid[] = "#(@) $Id$"; + +/* + + Encode or decode file as MIME base64 (RFC 1341) + + by John Walker + http://www.fourmilab.ch/ + + This program is in the public domain. + +*/ +#include + +/* ENCODE -- Encode binary file into base64. */ +#include +#include + +#include "base64.h" + +static unsigned char dtable[512]; + +void buffer_new(struct buffer_st *b) +{ + b->length = 512; + b->data = malloc(sizeof(char)*(b->length)); + b->data[0] = 0; + b->ptr = b->data; + b->offset = 0; +} + +void buffer_add(struct buffer_st *b, char c) +{ + *(b->ptr++) = c; + b->offset++; + if (b->offset == b->length) { + b->length += 512; + b->data = realloc(b->data, b->length); + b->ptr = b->data + b->offset; + } +} + +void buffer_delete(struct buffer_st *b) +{ + free(b->data); + b->length = 0; + b->offset = 0; + b->ptr = NULL; + b->data = NULL; +} + +void base64_encode(struct buffer_st *b, const char *source, int length) +{ + int i, hiteof = 0; + int offset = 0; + int olen; + + olen = 0; + + buffer_new(b); + + /* Fill dtable with character encodings. */ + + for (i = 0; i < 26; i++) { + dtable[i] = 'A' + i; + dtable[26 + i] = 'a' + i; + } + for (i = 0; i < 10; i++) { + dtable[52 + i] = '0' + i; + } + dtable[62] = '+'; + dtable[63] = '/'; + + while (!hiteof) { + unsigned char igroup[3], ogroup[4]; + int c, n; + + igroup[0] = igroup[1] = igroup[2] = 0; + for (n = 0; n < 3; n++) { + c = *(source++); + offset++; + if (offset > length) { + hiteof = 1; + break; + } + igroup[n] = (unsigned char) c; + } + if (n > 0) { + ogroup[0] = dtable[igroup[0] >> 2]; + ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; + ogroup[2] = dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; + ogroup[3] = dtable[igroup[2] & 0x3F]; + + /* Replace characters in output stream with "=" pad + characters if fewer than three characters were + read from the end of the input stream. */ + + if (n < 3) { + ogroup[3] = '='; + if (n < 2) { + ogroup[2] = '='; + } + } + for (i = 0; i < 4; i++) { + buffer_add(b, ogroup[i]); + if (!(b->offset % 72)) { + /* buffer_add(b, '\r'); */ + buffer_add(b, '\n'); + } + } + } + } + /* buffer_add(b, '\r'); */ + buffer_add(b, '\n'); +} + +void base64_decode(struct buffer_st *bfr, const char *source, int length) +{ + int i; + int offset = 0; + int endoffile; + int count; + + buffer_new(bfr); + + for (i = 0; i < 255; i++) { + dtable[i] = 0x80; + } + for (i = 'A'; i <= 'Z'; i++) { + dtable[i] = 0 + (i - 'A'); + } + for (i = 'a'; i <= 'z'; i++) { + dtable[i] = 26 + (i - 'a'); + } + for (i = '0'; i <= '9'; i++) { + dtable[i] = 52 + (i - '0'); + } + dtable['+'] = 62; + dtable['/'] = 63; + dtable['='] = 0; + + endoffile = 0; + + /*CONSTANTCONDITION*/ + while (1) { + unsigned char a[4], b[4], o[3]; + + for (i = 0; i < 4; i++) { + int c; + while (1) { + c = *(source++); + offset++; + if (offset > length) endoffile = 1; + if (isspace(c) || c == '\n' || c == '\r') continue; + break; + } + + if (endoffile) { + /* + if (i > 0) { + fprintf(stderr, "Input file incomplete.\n"); + exit(1); + } + */ + return; + } + + if (dtable[c] & 0x80) { + /* + fprintf(stderr, "Offset %i length %i\n", offset, length); + fprintf(stderr, "character '%c:%x:%c' in input file.\n", c, c, dtable[c]); + exit(1); + */ + i--; + continue; + } + a[i] = (unsigned char) c; + b[i] = (unsigned char) dtable[c]; + } + o[0] = (b[0] << 2) | (b[1] >> 4); + o[1] = (b[1] << 4) | (b[2] >> 2); + o[2] = (b[2] << 6) | b[3]; + i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3); + count = 0; + while (count < i) { + buffer_add(bfr, o[count++]); + } + if (i < 3) { + return; + } + } +} diff --git a/trunk/php/xmlrpc/libxmlrpc/base64.h b/trunk/php/xmlrpc/libxmlrpc/base64.h new file mode 100644 index 0000000..4cf156a --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/base64.h @@ -0,0 +1,38 @@ +/* + + Encode or decode file as MIME base64 (RFC 1341) + + by John Walker + http://www.fourmilab.ch/ + + This program is in the public domain. + +*/ + + +struct buffer_st { + char *data; + int length; + char *ptr; + int offset; +}; + +void buffer_new(struct buffer_st *b); +void buffer_add(struct buffer_st *b, char c); +void buffer_delete(struct buffer_st *b); + +void base64_encode(struct buffer_st *b, const char *source, int length); +void base64_decode(struct buffer_st *b, const char *source, int length); + +/* +#define DEBUG_MALLOC + */ + +#ifdef DEBUG_MALLOC +void *_malloc_real(size_t s, char *file, int line); +void _free_real(void *p, char *file, int line); + +#define malloc(s) _malloc_real(s,__FILE__,__LINE__) +#define free(p) _free_real(p, __FILE__,__LINE__) +#endif + diff --git a/trunk/php/xmlrpc/libxmlrpc/encodings.c b/trunk/php/xmlrpc/libxmlrpc/encodings.c new file mode 100644 index 0000000..1637a09 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/encodings.c @@ -0,0 +1,118 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef PHP_WIN32 +#include +#else +#include +#include +#endif + +static const char rcsid[] = "#(@) $Id$"; + +#include + +#ifdef HAVE_GICONV_H +#include +#else +#include +#endif + +#include "encodings.h" + +static char* convert(const char* src, int src_len, int *new_len, const char* from_enc, const char* to_enc) { + char* outbuf = 0; + + if(src && src_len && from_enc && to_enc) { + size_t outlenleft = src_len; + size_t inlenleft = src_len; + int outlen = src_len; + iconv_t ic = iconv_open(to_enc, from_enc); + char* out_ptr = 0; + + if(ic != (iconv_t)-1) { + size_t st; + outbuf = (char*)malloc(outlen + 1); + + if(outbuf) { + out_ptr = (char*)outbuf; + while(inlenleft) { + st = iconv(ic, (char**)&src, &inlenleft, &out_ptr, &outlenleft); + if(st == -1) { + if(errno == E2BIG) { + int diff = out_ptr - outbuf; + outlen += inlenleft; + outlenleft += inlenleft; + outbuf = (char*)realloc(outbuf, outlen + 1); + if(!outbuf) { + break; + } + out_ptr = outbuf + diff; + } + else { + free(outbuf); + outbuf = 0; + break; + } + } + } + } + iconv_close(ic); + } + outlen -= outlenleft; + + if(new_len) { + *new_len = outbuf ? outlen : 0; + } + if(outbuf) { + outbuf[outlen] = 0; + } + } + return outbuf; +} + +/* returns a new string that must be freed */ +char* utf8_encode(const char *s, int len, int *newlen, const char* encoding) +{ + return convert(s, len, newlen, encoding, "UTF-8"); +} + +/* returns a new string, possibly decoded */ +char* utf8_decode(const char *s, int len, int *newlen, const char* encoding) +{ + return convert(s, len, newlen, "UTF-8", encoding); +} + diff --git a/trunk/php/xmlrpc/libxmlrpc/encodings.h b/trunk/php/xmlrpc/libxmlrpc/encodings.h new file mode 100644 index 0000000..486360b --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/encodings.h @@ -0,0 +1,46 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +#ifndef __ENCODINGS__H +#define __ENCODINGS__H + +/* these defines are for legacy purposes. */ +#define encoding_utf_8 "UTF-8" +typedef const char* ENCODING_ID; +#define utf8_get_encoding_id_string(desired_enc) ((const char*)desired_enc) +#define utf8_get_encoding_id_from_string(id_string) ((ENCODING_ID)id_string) + +char* utf8_encode(const char *s, int len, int *newlen, ENCODING_ID encoding); +char* utf8_decode(const char *s, int len, int *newlen, ENCODING_ID encoding); + +#endif /* __ENCODINGS__H */ diff --git a/trunk/php/xmlrpc/libxmlrpc/queue.c b/trunk/php/xmlrpc/libxmlrpc/queue.c new file mode 100644 index 0000000..2418738 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/queue.c @@ -0,0 +1,982 @@ +static const char rcsid[] = "#(@) $Id$"; + +/* + * Date last modified: Jan 2001 + * Modifications by Dan Libby (dan@libby.com), including: + * - various fixes, null checks, etc + * - addition of Q_Iter funcs, macros + */ + + +/*-************************************************************** + * + * File : q.c + * + * Author: Peter Yard [1993.01.02] -- 02 Jan 1993 + * + * Disclaimer: This code is released to the public domain. + * + * Description: + * Generic double ended queue (Deque pronounced DEK) for handling + * any data types, with sorting. + * + * By use of various functions in this module the caller + * can create stacks, queues, lists, doubly linked lists, + * sorted lists, indexed lists. All lists are dynamic. + * + * It is the responsibility of the caller to malloc and free + * memory for insertion into the queue. A pointer to the object + * is used so that not only can any data be used but various kinds + * of data can be pushed on the same queue if one so wished e.g. + * various length string literals mixed with pointers to structures + * or integers etc. + * + * Enhancements: + * A future improvement would be the option of multiple "cursors" + * so that multiple locations could occur in the one queue to allow + * placemarkers and additional flexibility. Perhaps even use queue + * itself to have a list of cursors. + * + * Usage: + * + * /x init queue x/ + * queue q; + * Q_Init(&q); + * + * To create a stack : + * + * Q_PushHead(&q, &mydata1); /x push x/ + * Q_PushHead(&q, &mydata2); + * ..... + * data_ptr = Q_PopHead(&q); /x pop x/ + * ..... + * data_ptr = Q_Head(&q); /x top of stack x/ + * + * To create a FIFO: + * + * Q_PushHead(&q, &mydata1); + * ..... + * data_ptr = Q_PopTail(&q); + * + * To create a double list: + * + * data_ptr = Q_Head(&q); + * .... + * data_ptr = Q_Next(&q); + * data_ptr = Q_Tail(&q); + * if (Q_IsEmpty(&q)) .... + * ..... + * data_ptr = Q_Previous(&q); + * + * To create a sorted list: + * + * Q_PushHead(&q, &mydata1); /x push x/ + * Q_PushHead(&q, &mydata2); + * ..... + * if (!Q_Sort(&q, MyFunction)) + * .. error .. + * + * /x fill in key field of mydata1. + * * NB: Q_Find does linear search + * x/ + * + * if (Q_Find(&q, &mydata1, MyFunction)) + * { + * /x found it, queue cursor now at correct record x/ + * /x can retrieve with x/ + * data_ptr = Q_Get(&q); + * + * /x alter data , write back with x/ + * Q_Put(&q, data_ptr); + * } + * + * /x Search with binary search x/ + * if (Q_Seek(&q, &mydata, MyFunction)) + * /x etc x/ + * + * + ****************************************************************/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include "queue.h" + + +static void QuickSort(void *list[], int low, int high, + int (*Comp)(const void *, const void *)); +static int Q_BSearch(queue *q, void *key, + int (*Comp)(const void *, const void *)); + +/* The index: a pointer to pointers */ + +static void **index; +static datanode **posn_index; + + +/*** + * + ** function : Q_Init + * + ** purpose : Initialise queue object and pointers. + * + ** parameters : 'queue' pointer. + * + ** returns : True_ if init successful else False_ + * + ** comments : + ***/ + +int Q_Init(queue *q) +{ + if(q) { + q->head = q->tail = NULL; + q->cursor = q->head; + q->size = 0; + q->sorted = False_; + } + + return True_; +} + +/*** + * + ** function : Q_AtHead + * + ** purpose : tests if cursor is at head of queue + * + ** parameters : 'queue' pointer. + * + ** returns : boolean - True_ is at head else False_ + * + ** comments : + * + ***/ + +int Q_AtHead(queue *q) +{ + return(q && q->cursor == q->head); +} + + +/*** + * + ** function : Q_AtTail + * + ** purpose : boolean test if cursor at tail of queue + * + ** parameters : 'queue' pointer to test. + * + ** returns : True_ or False_ + * + ** comments : + * + ***/ + +int Q_AtTail(queue *q) +{ + return(q && q->cursor == q->tail); +} + + +/*** + * + ** function : Q_IsEmpty + * + ** purpose : test if queue has nothing in it. + * + ** parameters : 'queue' pointer + * + ** returns : True_ if IsEmpty queue, else False_ + * + ** comments : + * + ***/ + +inline int Q_IsEmpty(queue *q) +{ + return(!q || q->size == 0); +} + +/*** + * + ** function : Q_Size + * + ** purpose : return the number of elements in the queue + * + ** parameters : queue pointer + * + ** returns : number of elements + * + ** comments : + * + ***/ + +int Q_Size(queue *q) +{ + return q ? q->size : 0; +} + + +/*** + * + ** function : Q_Head + * + ** purpose : position queue cursor to first element (head) of queue. + * + ** parameters : 'queue' pointer + * + ** returns : pointer to data at head. If queue is IsEmpty returns NULL + * + ** comments : + * + ***/ + +void *Q_Head(queue *q) +{ + if(Q_IsEmpty(q)) + return NULL; + + q->cursor = q->head; + + return q->cursor->data; +} + + +/*** + * + ** function : Q_Tail + * + ** purpose : locate cursor at tail of queue. + * + ** parameters : 'queue' pointer + * + ** returns : pointer to data at tail , if queue IsEmpty returns NULL + * + ** comments : + * + ***/ + +void *Q_Tail(queue *q) +{ + if(Q_IsEmpty(q)) + return NULL; + + q->cursor = q->tail; + + return q->cursor->data; +} + + +/*** + * + ** function : Q_PushHead + * + ** purpose : put a data pointer at the head of the queue + * + ** parameters : 'queue' pointer, void pointer to the data. + * + ** returns : True_ if success else False_ if unable to push data. + * + ** comments : + * + ***/ + +int Q_PushHead(queue *q, void *d) +{ + if(q && d) { + node *n; + datanode *p; + + p = malloc(sizeof(datanode)); + if(p == NULL) + return False_; + + n = q->head; + + q->head = (node*)p; + q->head->prev = NULL; + + if(q->size == 0) { + q->head->next = NULL; + q->tail = q->head; + } + else { + q->head->next = (datanode*)n; + n->prev = q->head; + } + + q->head->data = d; + q->size++; + + q->cursor = q->head; + + q->sorted = False_; + + return True_; + } + return False_; +} + + + +/*** + * + ** function : Q_PushTail + * + ** purpose : put a data element pointer at the tail of the queue + * + ** parameters : queue pointer, pointer to the data + * + ** returns : True_ if data pushed, False_ if data not inserted. + * + ** comments : + * + ***/ + +int Q_PushTail(queue *q, void *d) +{ + if(q && d) { + node *p; + datanode *n; + + n = malloc(sizeof(datanode)); + if(n == NULL) + return False_; + + p = q->tail; + q->tail = (node *)n; + + if(q->size == 0) { + q->tail->prev = NULL; + q->head = q->tail; + } + else { + q->tail->prev = (datanode *)p; + p->next = q->tail; + } + + q->tail->next = NULL; + + q->tail->data = d; + q->cursor = q->tail; + q->size++; + + q->sorted = False_; + + return True_; + } + return False_; +} + + + +/*** + * + ** function : Q_PopHead + * + ** purpose : remove and return the top element at the head of the + * queue. + * + ** parameters : queue pointer + * + ** returns : pointer to data element or NULL if queue is IsEmpty. + * + ** comments : + * + ***/ + +void *Q_PopHead(queue *q) +{ + datanode *n; + void *d; + + if(Q_IsEmpty(q)) + return NULL; + + d = q->head->data; + n = q->head->next; + free(q->head); + + q->size--; + + if(q->size == 0) + q->head = q->tail = q->cursor = NULL; + else { + q->head = (node *)n; + q->head->prev = NULL; + q->cursor = q->head; + } + + q->sorted = False_; + + return d; +} + + +/*** + * + ** function : Q_PopTail + * + ** purpose : remove element from tail of queue and return data. + * + ** parameters : queue pointer + * + ** returns : pointer to data element that was at tail. NULL if queue + * IsEmpty. + * + ** comments : + * + ***/ + +void *Q_PopTail(queue *q) +{ + datanode *p; + void *d; + + if(Q_IsEmpty(q)) + return NULL; + + d = q->tail->data; + p = q->tail->prev; + free(q->tail); + q->size--; + + if(q->size == 0) + q->head = q->tail = q->cursor = NULL; + else { + q->tail = (node *)p; + q->tail->next = NULL; + q->cursor = q->tail; + } + + q->sorted = False_; + + return d; +} + + + +/*** + * + ** function : Q_Next + * + ** purpose : Move to the next element in the queue without popping + * + ** parameters : queue pointer. + * + ** returns : pointer to data element of new element or NULL if end + * of the queue. + * + ** comments : This uses the cursor for the current position. Q_Next + * only moves in the direction from the head of the queue + * to the tail. + ***/ + +void *Q_Next(queue *q) +{ + if(!q) + return NULL; + + if(!q->cursor || q->cursor->next == NULL) + return NULL; + + q->cursor = (node *)q->cursor->next; + + return q->cursor->data ; +} + + + +/*** + * + ** function : Q_Previous + * + ** purpose : Opposite of Q_Next. Move to next element closer to the + * head of the queue. + * + ** parameters : pointer to queue + * + ** returns : pointer to data of new element else NULL if queue IsEmpty + * + ** comments : Makes cursor move towards the head of the queue. + * + ***/ + +void *Q_Previous(queue *q) +{ + if(!q) + return NULL; + + if(q->cursor->prev == NULL) + return NULL; + + q->cursor = (node *)q->cursor->prev; + + return q->cursor->data; +} + + +void *Q_Iter_Del(queue *q, q_iter iter) +{ + void *d; + datanode *n, *p; + + if(!q) + return NULL; + + if(iter == NULL) + return NULL; + + if(iter == (q_iter)q->head) + return Q_PopHead(q); + + if(iter == (q_iter)q->tail) + return Q_PopTail(q); + + n = ((node*)iter)->next; + p = ((node*)iter)->prev; + d = ((node*)iter)->data; + + free(iter); + + if(p) { + p->next = n; + } + if (q->cursor == (node*)iter) { + if (p) { + q->cursor = p; + } else { + q->cursor = n; + } + } + + + if (n != NULL) { + n->prev = p; + } + + q->size--; + + q->sorted = False_; + + return d; +} + + + +/*** + * + ** function : Q_DelCur + * + ** purpose : Delete the current queue element as pointed to by + * the cursor. + * + ** parameters : queue pointer + * + ** returns : pointer to data element. + * + ** comments : WARNING! It is the responsibility of the caller to + * free any memory. Queue cannot distinguish between + * pointers to literals and malloced memory. + * + ***/ + +void *Q_DelCur(queue* q) { + if(q) { + return Q_Iter_Del(q, (q_iter)q->cursor); + } + return 0; +} + + +/*** + * + ** function : Q_Destroy + * + ** purpose : Free all queue resources + * + ** parameters : queue pointer + * + ** returns : null. + * + ** comments : WARNING! It is the responsibility of the caller to + * free any memory. Queue cannot distinguish between + * pointers to literals and malloced memory. + * + ***/ + +void Q_Destroy(queue *q) +{ + while(!Q_IsEmpty(q)) { + Q_PopHead(q); + } +} + + +/*** + * + ** function : Q_Get + * + ** purpose : get the pointer to the data at the cursor location + * + ** parameters : queue pointer + * + ** returns : data element pointer + * + ** comments : + * + ***/ + +void *Q_Get(queue *q) +{ + if(!q) + return NULL; + + if(q->cursor == NULL) + return NULL; + return q->cursor->data; +} + + + +/*** + * + ** function : Q_Put + * + ** purpose : replace pointer to data with new pointer to data. + * + ** parameters : queue pointer, data pointer + * + ** returns : boolean- True_ if successful, False_ if cursor at NULL + * + ** comments : + * + ***/ + +int Q_Put(queue *q, void *data) +{ + if(q && data) { + if(q->cursor == NULL) + return False_; + + q->cursor->data = data; + return True_; + } + return False_; +} + + +/*** + * + ** function : Q_Find + * + ** purpose : Linear search of queue for match with key in *data + * + ** parameters : queue pointer q, data pointer with data containing key + * comparison function here called Comp. + * + ** returns : True_ if found , False_ if not in queue. + * + ** comments : Useful for small queues that are constantly changing + * and would otherwise need constant sorting with the + * Q_Seek function. + * For description of Comp see Q_Sort. + * Queue cursor left on position found item else at end. + * + ***/ + +int Q_Find(queue *q, void *data, + int (*Comp)(const void *, const void *)) +{ + void *d; + + if (q == NULL) { + return False_; + } + + d = Q_Head(q); + do { + if(Comp(d, data) == 0) + return True_; + d = Q_Next(q); + } while(!Q_AtTail(q)); + + if(Comp(d, data) == 0) + return True_; + + return False_; +} + +/*======== Sorted Queue and Index functions ========= */ + + +static void QuickSort(void *list[], int low, int high, + int (*Comp)(const void *, const void *)) +{ + int flag = 1, i, j; + void *key, *temp; + + if(low < high) { + i = low; + j = high + 1; + + key = list[ low ]; + + while(flag) { + i++; + while(Comp(list[i], key) < 0) + i++; + + j--; + while(Comp(list[j], key) > 0) + j--; + + if(i < j) { + temp = list[i]; + list[i] = list[j]; + list[j] = temp; + } + else flag = 0; + } + + temp = list[low]; + list[low] = list[j]; + list[j] = temp; + + QuickSort(list, low, j-1, Comp); + QuickSort(list, j+1, high, Comp); + } +} + + +/*** + * + ** function : Q_Sort + * + ** purpose : sort the queue and allow index style access. + * + ** parameters : queue pointer, comparison function compatible with + * with 'qsort'. + * + ** returns : True_ if sort succeeded. False_ if error occurred. + * + ** comments : Comp function supplied by caller must return + * -1 if data1 < data2 + * 0 if data1 == data2 + * +1 if data1 > data2 + * + * for Comp(data1, data2) + * + * If queue is already sorted it frees the memory of the + * old index and starts again. + * + ***/ + +int Q_Sort(queue *q, int (*Comp)(const void *, const void *)) +{ + int i; + void *d; + datanode *dn; + + /* if already sorted free memory for tag array */ + + if(q->sorted) { + free(index); + free(posn_index); + q->sorted = False_; + } + + /* Now allocate memory of array, array of pointers */ + + index = malloc(q->size * sizeof(q->cursor->data)); + if(index == NULL) + return False_; + + posn_index = malloc(q->size * sizeof(q->cursor)); + if(posn_index == NULL) { + free(index); + return False_; + } + + /* Walk queue putting pointers into array */ + + d = Q_Head(q); + for(i=0; i < q->size; i++) { + index[i] = d; + posn_index[i] = q->cursor; + d = Q_Next(q); + } + + /* Now sort the index */ + + QuickSort(index, 0, q->size - 1, Comp); + + /* Rearrange the actual queue into correct order */ + + dn = q->head; + i = 0; + while(dn != NULL) { + dn->data = index[i++]; + dn = dn->next; + } + + /* Re-position to original element */ + + if(d != NULL) + Q_Find(q, d, Comp); + else Q_Head(q); + + q->sorted = True_; + + return True_; +} + + +/*** + * + ** function : Q_BSearch + * + ** purpose : binary search of queue index for node containing key + * + ** parameters : queue pointer 'q', data pointer of key 'key', + * Comp comparison function. + * + ** returns : integer index into array of node pointers, + * or -1 if not found. + * + ** comments : see Q_Sort for description of 'Comp' function. + * + ***/ + +static int Q_BSearch( queue *q, void *key, + int (*Comp)(const void *, const void*)) +{ + int low, mid, hi, val; + + low = 0; + hi = q->size - 1; + + while(low <= hi) { + mid = (low + hi) / 2; + val = Comp(key, index[ mid ]); + + if(val < 0) + hi = mid - 1; + + else if(val > 0) + low = mid + 1; + + else /* Success */ + return mid; + } + + /* Not Found */ + + return -1; +} + + +/*** + * + ** function : Q_Seek + * + ** purpose : use index to locate data according to key in 'data' + * + ** parameters : queue pointer 'q', data pointer 'data', Comp comparison + * function. + * + ** returns : pointer to data or NULL if could not find it or could + * not sort queue. + * + ** comments : see Q_Sort for description of 'Comp' function. + * + ***/ + +void *Q_Seek(queue *q, void *data, int (*Comp)(const void *, const void *)) +{ + int idx; + + if (q == NULL) { + return NULL; + } + + if(!q->sorted) { + if(!Q_Sort(q, Comp)) + return NULL; + } + + idx = Q_BSearch(q, data, Comp); + + if(idx < 0) + return NULL; + + q->cursor = posn_index[idx]; + + return index[idx]; +} + + + +/*** + * + ** function : Q_Insert + * + ** purpose : Insert an element into an indexed queue + * + ** parameters : queue pointer 'q', data pointer 'data', Comp comparison + * function. + * + ** returns : pointer to data or NULL if could not find it or could + * not sort queue. + * + ** comments : see Q_Sort for description of 'Comp' function. + * WARNING! This code can be very slow since each new + * element means a new Q_Sort. Should only be used for + * the insertion of the odd element ,not the piecemeal + * building of an entire queue. + ***/ + +int Q_Insert(queue *q, void *data, int (*Comp)(const void *, const void *)) +{ + if (q == NULL) { + return False_; + } + + Q_PushHead(q, data); + + if(!Q_Sort(q, Comp)) + return False_; + + return True_; +} + +/* read only funcs for iterating through queue. above funcs modify queue */ +q_iter Q_Iter_Head(queue *q) { + return q ? (q_iter)q->head : NULL; +} + +q_iter Q_Iter_Tail(queue *q) { + return q ? (q_iter)q->tail : NULL; +} + +q_iter Q_Iter_Next(q_iter qi) { + return qi ? (q_iter)((node*)qi)->next : NULL; +} + +q_iter Q_Iter_Prev(q_iter qi) { + return qi ? (q_iter)((node*)qi)->prev : NULL; +} + +void * Q_Iter_Get(q_iter qi) { + return qi ? ((node*)qi)->data : NULL; +} + +int Q_Iter_Put(q_iter qi, void* data) { + if(qi) { + ((node*)qi)->data = data; + return True_; + } + return False_; +} diff --git a/trunk/php/xmlrpc/libxmlrpc/queue.h b/trunk/php/xmlrpc/libxmlrpc/queue.h new file mode 100644 index 0000000..be73f6d --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/queue.h @@ -0,0 +1,89 @@ +/* + * Date last modified: Jan 2001 + * Modifications by Dan Libby (dan@libby.com), including: + * - various fixes, null checks, etc + * - addition of Q_Iter funcs, macros + */ + +/* + * File : q.h + * + * Peter Yard 02 Jan 1993. + * + * Disclaimer: This code is released to the public domain. + */ + +#ifndef Q__H +#define Q__H + +#ifndef False_ + #define False_ 0 +#endif + +#ifndef True_ + #define True_ 1 +#endif + +typedef struct nodeptr datanode; + +typedef struct nodeptr { + void *data ; + datanode *prev, *next ; +} node ; + +/* For external use with Q_Iter* funcs */ +typedef struct nodeptr* q_iter; + +typedef struct { + node *head, *tail, *cursor; + int size, sorted, item_deleted; +} queue; + +typedef struct { + void *dataptr; + node *loc ; +} index_elt ; + + +int Q_Init(queue *q); +void Q_Destroy(queue *q); +int Q_IsEmpty(queue *q); +int Q_Size(queue *q); +int Q_AtHead(queue *q); +int Q_AtTail(queue *q); +int Q_PushHead(queue *q, void *d); +int Q_PushTail(queue *q, void *d); +void *Q_Head(queue *q); +void *Q_Tail(queue *q); +void *Q_PopHead(queue *q); +void *Q_PopTail(queue *q); +void *Q_Next(queue *q); +void *Q_Previous(queue *q); +void *Q_DelCur(queue *q); +void *Q_Get(queue *q); +int Q_Put(queue *q, void *data); +int Q_Sort(queue *q, int (*Comp)(const void *, const void *)); +int Q_Find(queue *q, void *data, + int (*Comp)(const void *, const void *)); +void *Q_Seek(queue *q, void *data, + int (*Comp)(const void *, const void *)); +int Q_Insert(queue *q, void *data, + int (*Comp)(const void *, const void *)); + +/* read only funcs for iterating through queue. above funcs modify queue */ +q_iter Q_Iter_Head(queue *q); +q_iter Q_Iter_Tail(queue *q); +q_iter Q_Iter_Next(q_iter qi); +q_iter Q_Iter_Prev(q_iter qi); +void* Q_Iter_Get(q_iter qi); +int Q_Iter_Put(q_iter qi, void* data); /* not read only! here for completeness. */ +void* Q_Iter_Del(queue *q, q_iter iter); /* not read only! here for completeness. */ + +/* Fast (macro'd) versions of above */ +#define Q_Iter_Head_F(q) (q ? (q_iter)((queue*)q)->head : NULL) +#define Q_Iter_Tail_F(q) (q ? (q_iter)((queue*)q)->tail : NULL) +#define Q_Iter_Next_F(qi) (qi ? (q_iter)((node*)qi)->next : NULL) +#define Q_Iter_Prev_F(qi) (qi ? (q_iter)((node*)qi)->prev : NULL) +#define Q_Iter_Get_F(qi) (qi ? ((node*)qi)->data : NULL) + +#endif /* Q__H */ diff --git a/trunk/php/xmlrpc/libxmlrpc/simplestring.c b/trunk/php/xmlrpc/libxmlrpc/simplestring.c new file mode 100644 index 0000000..be2aba5 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/simplestring.c @@ -0,0 +1,251 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id$"; + + +#define SIMPLESTRING_INCR 32 + +/****h* ABOUT/simplestring + * NAME + * simplestring + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 06/2000 + * HISTORY + * $Log: simplestring.c,v $ + * Revision 1.4 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.3 2002/08/22 01:25:50 sniper + * kill some compile warnings + * + * Revision 1.2 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.4 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.3 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * This code was written primarily for xmlrpc, but has found some other uses. + * + * simplestring is, as the name implies, a simple API for dealing with C strings. + * Why would I write yet another string API? Because I couldn't find any that were + * a) free / GPL, b) simple/lightweight, c) fast, not doing unneccesary strlens all + * over the place. So. It is simple, and it seems to work, and it is pretty fast. + * + * Oh, and it is also binary safe, ie it can handle strings with embedded NULLs, + * so long as the real length is passed in. + * + * And the masses rejoiced. + * + * BUGS + * there must be some. + ******/ + +#include +#include +#include "simplestring.h" + +#define my_free(thing) if(thing) {free(thing); thing = 0;} + +/*----------------------** +* Begin String Functions * +*-----------------------*/ + +/****f* FUNC/simplestring_init + * NAME + * simplestring_init + * SYNOPSIS + * void simplestring_init(simplestring* string) + * FUNCTION + * initialize string + * INPUTS + * string - pointer to a simplestring struct that will be initialized + * RESULT + * void + * NOTES + * SEE ALSO + * simplestring_free () + * simplestring_clear () + * SOURCE + */ +void simplestring_init(simplestring* string) { + memset(string, 0, sizeof(simplestring)); +} +/******/ + +static void simplestring_init_str(simplestring* string) { + string->str = (char*)malloc(SIMPLESTRING_INCR); + if(string->str) { + string->str[0] = 0; + string->len = 0; + string->size = SIMPLESTRING_INCR; + } + else { + string->size = 0; + } +} + +/****f* FUNC/simplestring_clear + * NAME + * simplestring_clear + * SYNOPSIS + * void simplestring_clear(simplestring* string) + * FUNCTION + * clears contents of a string + * INPUTS + * string - the string value to clear + * RESULT + * void + * NOTES + * This function is very fast as it does not de-allocate any memory. + * SEE ALSO + * + * SOURCE + */ +void simplestring_clear(simplestring* string) { + if(string->str) { + string->str[0] = 0; + } + string->len = 0; +} +/******/ + +/****f* FUNC/simplestring_free + * NAME + * simplestring_free + * SYNOPSIS + * void simplestring_free(simplestring* string) + * FUNCTION + * frees contents of a string, if any. Does *not* free the simplestring struct itself. + * INPUTS + * string - value containing string to be free'd + * RESULT + * void + * NOTES + * caller is responsible for allocating and freeing simplestring* struct itself. + * SEE ALSO + * simplestring_init () + * SOURCE + */ +void simplestring_free(simplestring* string) { + if(string && string->str) { + my_free(string->str); + string->len = 0; + } +} +/******/ + +/****f* FUNC/simplestring_addn + * NAME + * simplestring_addn + * SYNOPSIS + * void simplestring_addn(simplestring* string, const char* add, int add_len) + * FUNCTION + * copies n characters from source to target string + * INPUTS + * target - target string + * source - source string + * add_len - number of characters to copy + * RESULT + * void + * NOTES + * SEE ALSO + * simplestring_add () + * SOURCE + */ +void simplestring_addn(simplestring* target, const char* source, int add_len) { + if(target && source) { + if(!target->str) { + simplestring_init_str(target); + } + if(target->len + add_len + 1 > target->size) { + /* newsize is current length + new length */ + int newsize = target->len + add_len + 1; + int incr = target->size * 2; + + /* align to SIMPLESTRING_INCR increments */ + newsize = newsize - (newsize % incr) + incr; + target->str = (char*)realloc(target->str, newsize); + + target->size = target->str ? newsize : 0; + } + + if(target->str) { + if(add_len) { + memcpy(target->str + target->len, source, add_len); + } + target->len += add_len; + target->str[target->len] = 0; /* null terminate */ + } + } +} +/******/ + +/****f* FUNC/simplestring_add + * NAME + * simplestring_add + * SYNOPSIS + * void simplestring_add(simplestring* string, const char* add) + * FUNCTION + * appends a string of unknown length from source to target + * INPUTS + * target - the target string to append to + * source - the source string of unknown length + * RESULT + * void + * NOTES + * SEE ALSO + * simplestring_addn () + * SOURCE + */ +void simplestring_add(simplestring* target, const char* source) { + if(target && source) { + simplestring_addn(target, source, strlen(source)); + } +} +/******/ + + +/*---------------------- +* End String Functions * +*--------------------**/ diff --git a/trunk/php/xmlrpc/libxmlrpc/simplestring.h b/trunk/php/xmlrpc/libxmlrpc/simplestring.h new file mode 100644 index 0000000..c5d98cf --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/simplestring.h @@ -0,0 +1,76 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef __SIMPLESTRING_H__ + #define __SIMPLESTRING_H__ + +/*-******************************** +* begin simplestring header stuff * +**********************************/ + +#ifdef __cplusplus +extern "C" { +#endif + + /****s* struct/simplestring + * NAME + * simplestring + * NOTES + * represents a string efficiently for fast appending, etc. + * SOURCE + */ +typedef struct _simplestring { + char* str; /* string buf */ + int len; /* length of string/buf */ + int size; /* size of allocated buffer */ +} simplestring; +/******/ + +#ifndef NULL + #define NULL 0 +#endif + +void simplestring_init(simplestring* string); +void simplestring_clear(simplestring* string); +void simplestring_free(simplestring* string); +void simplestring_add(simplestring* string, const char* add); +void simplestring_addn(simplestring* string, const char* add, int add_len); + +#ifdef __cplusplus +} +#endif + +/*-****************************** +* end simplestring header stuff * +********************************/ + +#endif /* __SIMPLESTRING_H__ */ diff --git a/trunk/php/xmlrpc/libxmlrpc/system_methods.c b/trunk/php/xmlrpc/libxmlrpc/system_methods.c new file mode 100644 index 0000000..c3c2b88 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/system_methods.c @@ -0,0 +1,378 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +/****h* ABOUT/system_methods + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * HISTORY + * $Log: system_methods.c,v $ + * Revision 1.2 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.7 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 4/28/2001 -- danda -- adding system.multicall and separating out system methods. + * TODO + * NOTES + *******/ + + +#include "queue.h" +#include "xmlrpc.h" +#include "xmlrpc_private.h" +#include "xmlrpc_introspection_private.h" +#include "system_methods_private.h" +#include +#include +#include + + +static const char* xsm_introspection_xml = +"" + +"" + "" + + "" + "value identifier" + "value's xmlrpc or user-defined type" + "value's textual description " + "true if value is optional, else it is required " + "a child of this element. n/a for scalar types " + "" + + "" + "" + "" + + "" + "" + "" + + + "" + + "" + + "" + "" + "Dan Libby" + "fully describes the methods and types implemented by this XML-RPC server." + "1.1" + "" + "" + "" + "" + "a valid method name" + "" + "" + "" + "" + "" + "" + "method name" + "method version" + "method author" + "method purpose" + "" + "" + "parameter list" + "return value list" + "" + "" + "list of known bugs" + "list of possible errors and error codes" + "list of examples" + "list of modifications" + "list of notes" + "see also. list of related methods" + "list of unimplemented features" + "" + "" + "" + "a type description" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "enumerates the methods implemented by this XML-RPC server." + "1.0" + "" + "" + "" + "" + "name of a method implemented by the server." + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "provides documentation string for a single method" + "1.0" + "" + "" + "" + "name of the method for which documentation is desired" + "" + "" + "help text if defined for the method passed, otherwise an empty string" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "provides 1 or more signatures for a single method" + "1.0" + "" + "" + "" + "name of the method for which documentation is desired" + "" + "" + "" + "" + "a string indicating the xmlrpc type of a value. one of: string, int, double, base64, datetime, array, struct" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "executes multiple methods in sequence and returns the results" + "1.0" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" + "" + "Dan Libby" + "returns a list of capabilities supported by this server" + "1.0" + "spec url: http://groups.yahoo.com/group/xml-rpc/message/2897" + "" + "" + "" + "" + "" + "www address of the specification defining this capability" + "version of the spec that this server's implementation conforms to" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + + "" +""; + + +/* forward declarations for static (non public, non api) funcs */ +static XMLRPC_VALUE xsm_system_multicall_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xsm_system_get_capabilities_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); + +/*-******************* +* System Methods API * +*********************/ + +static void xsm_lazy_doc_methods_cb(XMLRPC_SERVER server, void* userData) { + XMLRPC_VALUE xDesc = XMLRPC_IntrospectionCreateDescription(xsm_introspection_xml, NULL); + XMLRPC_ServerAddIntrospectionData(server, xDesc); + XMLRPC_CleanupValue(xDesc); +} + +void xsm_register(XMLRPC_SERVER server) { + xi_register_system_methods(server); + + XMLRPC_ServerRegisterMethod(server, xsm_token_system_multicall, xsm_system_multicall_cb); + XMLRPC_ServerRegisterMethod(server, xsm_token_system_get_capabilities, xsm_system_get_capabilities_cb); + + /* callback for documentation generation should it be requested */ + XMLRPC_ServerRegisterIntrospectionCallback(server, xsm_lazy_doc_methods_cb); +} + +XMLRPC_VALUE xsm_system_multicall_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xArray = XMLRPC_VectorRewind(XMLRPC_RequestGetData(input)); + XMLRPC_VALUE xReturn = XMLRPC_CreateVector(0, xmlrpc_vector_array); + + if (xArray) { + XMLRPC_VALUE xMethodIter = XMLRPC_VectorRewind(xArray); + + while (xMethodIter) { + XMLRPC_REQUEST request = XMLRPC_RequestNew(); + if(request) { + const char* methodName = XMLRPC_VectorGetStringWithID(xMethodIter, "methodName"); + XMLRPC_VALUE params = XMLRPC_VectorGetValueWithID(xMethodIter, "params"); + + if(methodName && params) { + XMLRPC_VALUE xRandomArray = XMLRPC_CreateVector(0, xmlrpc_vector_array); + XMLRPC_RequestSetMethodName(request, methodName); + XMLRPC_RequestSetData(request, params); + XMLRPC_RequestSetRequestType(request, xmlrpc_request_call); + + XMLRPC_AddValueToVector(xRandomArray, + XMLRPC_ServerCallMethod(server, request, userData)); + + XMLRPC_AddValueToVector(xReturn, xRandomArray); + } + XMLRPC_RequestFree(request, 1); + } + xMethodIter = XMLRPC_VectorNext(xArray); + } + } + return xReturn; +} + + +XMLRPC_VALUE xsm_system_get_capabilities_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xReturn = XMLRPC_CreateVector(0, xmlrpc_vector_struct); + XMLRPC_VALUE xFaults = XMLRPC_CreateVector("faults_interop", xmlrpc_vector_struct); + XMLRPC_VALUE xIntro = XMLRPC_CreateVector("introspection", xmlrpc_vector_struct); + + /* support for fault spec */ + XMLRPC_VectorAppendString(xFaults, "specURL", "http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php", 0); + XMLRPC_VectorAppendInt(xFaults, "specVersion", 20010516); + + /* support for introspection spec */ + XMLRPC_VectorAppendString(xIntro, "specURL", "http://xmlrpc-epi.sourceforge.net/specs/rfc.introspection.php", 0); + XMLRPC_VectorAppendInt(xIntro, "specVersion", 20010516); + + XMLRPC_AddValuesToVector(xReturn, + xFaults, + xIntro, + NULL); + + return xReturn; + +} + +/*-*********************** +* End System Methods API * +*************************/ + + + diff --git a/trunk/php/xmlrpc/libxmlrpc/system_methods_private.h b/trunk/php/xmlrpc/libxmlrpc/system_methods_private.h new file mode 100644 index 0000000..72408fd --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/system_methods_private.h @@ -0,0 +1,91 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Dan Libby, Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* IMPORTANT! + * + * only non-public things should be in this file. It is fine for any .c file + * in xmlrpc/src to include it, but users of the public API should never + * include it, and thus *.h files that are part of the public API should + * never include it, or they would break if this file is not present. + */ + + +#ifndef __SYSTEM_METHODS_PRIVATE_H +/* + * Avoid include redundancy. + */ +#define __SYSTEM_METHODS_PRIVATE_H + +/*---------------------------------------------------------------------------- + * system_methods_private.h + * + * Purpose: + * define non-public system.* methods + * Comments: + * xsm = xmlrpc system methods + */ + +/*---------------------------------------------------------------------------- + * Constants + */ +#define xsm_token_system_multicall "system.multiCall" +#define xsm_token_system_get_capabilities "system.getCapabilities" + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +void xsm_register(XMLRPC_SERVER server); +int xsm_is_system_method(XMLRPC_Callback cb); + +/*---------------------------------------------------------------------------- + * Macros + */ + + +#endif /* __SYSTEM_METHODS_PRIVATE_H */ + + + + diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_element.c b/trunk/php/xmlrpc/libxmlrpc/xml_element.c new file mode 100644 index 0000000..ae30838 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_element.c @@ -0,0 +1,750 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id$"; + + + +/****h* ABOUT/xml_element + * NAME + * xml_element + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 06/2000 + * HISTORY + * $Log: xml_element.c,v $ + * Revision 1.6 2004/06/01 20:16:06 iliaa + * Fixed bug #28597 (xmlrpc_encode_request() incorrectly encodes chars in + * 200-210 range). + * Patch by: fernando dot nemec at folha dot com dot br + * + * Revision 1.5 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.4 2002/11/26 23:01:16 fmk + * removing unused variables + * + * Revision 1.3 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.9 2002/07/03 20:54:30 danda + * root element should not have a parent. patch from anon SF user + * + * Revision 1.8 2002/05/23 17:46:51 danda + * patch from mukund - fix non utf-8 encoding conversions + * + * Revision 1.7 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.6 2002/01/08 01:06:55 danda + * enable format for parsers that are very picky. + * + * Revision 1.5 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * TODO + * Nicer external API. Get rid of macros. Make opaque types, etc. + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * This code incorporates ideas from expat-ensor from http://xml.ensor.org. + * + * It was coded primarily to act as a go-between for expat and xmlrpc. To this + * end, it stores xml elements, their sub-elements, and their attributes in an + * in-memory tree. When expat is done parsing, the tree can be walked, thus + * retrieving the values. The code can also be used to build a tree via API then + * write out the tree to a buffer, thus "serializing" the xml. + * + * It turns out this is useful for other purposes, such as parsing config files. + * YMMV. + * + * Some Features: + * - output option for xml escaping data. Choices include no escaping, entity escaping, + * or CDATA sections. + * - output option for character encoding. Defaults to (none) utf-8. + * - output option for verbosity/readability. ultra-compact, newlines, pretty/level indented. + * + * BUGS + * there must be some. + ******/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include + +#include "xml_element.h" +#include "queue.h" +#include "expat.h" +#include "encodings.h" + +#define my_free(thing) if(thing) {free(thing); thing = NULL;} + +#define XML_DECL_START "" +#define XML_DECL_END_LEN sizeof(XML_DECL_END) - 1 +#define START_TOKEN_BEGIN "<" +#define START_TOKEN_BEGIN_LEN sizeof(START_TOKEN_BEGIN) - 1 +#define START_TOKEN_END ">" +#define START_TOKEN_END_LEN sizeof(START_TOKEN_END) - 1 +#define EMPTY_START_TOKEN_END "/>" +#define EMPTY_START_TOKEN_END_LEN sizeof(EMPTY_START_TOKEN_END) - 1 +#define END_TOKEN_BEGIN "" +#define END_TOKEN_END_LEN sizeof(END_TOKEN_END) - 1 +#define ATTR_DELIMITER "\"" +#define ATTR_DELIMITER_LEN sizeof(ATTR_DELIMITER) - 1 +#define CDATA_BEGIN "" +#define CDATA_END_LEN sizeof(CDATA_END) - 1 +#define EQUALS "=" +#define EQUALS_LEN sizeof(EQUALS) - 1 +#define WHITESPACE " " +#define WHITESPACE_LEN sizeof(WHITESPACE) - 1 +#define NEWLINE "\n" +#define NEWLINE_LEN sizeof(NEWLINE) - 1 +#define MAX_VAL_BUF 144 +#define SCALAR_STR "SCALAR" +#define SCALAR_STR_LEN sizeof(SCALAR_STR) - 1 +#define VECTOR_STR "VECTOR" +#define VECTOR_STR_LEN sizeof(VECTOR_STR) - 1 +#define RESPONSE_STR "RESPONSE" +#define RESPONSE_STR_LEN sizeof(RESPONSE_STR) - 1 + + +/*----------------------------- +- Begin xml_element Functions - +-----------------------------*/ + +/****f* xml_element/xml_elem_free_non_recurse + * NAME + * xml_elem_free_non_recurse + * SYNOPSIS + * void xml_elem_free_non_recurse(xml_element* root) + * FUNCTION + * free a single xml element. child elements will not be freed. + * INPUTS + * root - the element to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free_non_recurse(xml_element* root) { + if(root) { + xml_element_attr* attrs = Q_Head(&root->attrs); + while(attrs) { + my_free(attrs->key); + my_free(attrs->val); + my_free(attrs); + attrs = Q_Next(&root->attrs); + } + + Q_Destroy(&root->children); + Q_Destroy(&root->attrs); + if (root->name) { + free((char *)root->name); + root->name = NULL; + } + simplestring_free(&root->text); + my_free(root); + } +} +/******/ + +/****f* xml_element/xml_elem_free + * NAME + * xml_elem_free + * SYNOPSIS + * void xml_elem_free(xml_element* root) + * FUNCTION + * free an xml element and all of its child elements + * INPUTS + * root - the root of an xml tree you would like to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free_non_recurse () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free(xml_element* root) { + if(root) { + xml_element* kids = Q_Head(&root->children); + while(kids) { + xml_elem_free(kids); + kids = Q_Next(&root->children); + } + xml_elem_free_non_recurse(root); + } +} +/******/ + +/****f* xml_element/xml_elem_new + * NAME + * xml_elem_new + * SYNOPSIS + * xml_element* xml_elem_new() + * FUNCTION + * allocates and initializes a new xml_element + * INPUTS + * none + * RESULT + * xml_element* or NULL. NULL indicates an out-of-memory condition. + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_free_non_recurse () + * SOURCE + */ +xml_element* xml_elem_new() { + xml_element* elem = calloc(1, sizeof(xml_element)); + if(elem) { + Q_Init(&elem->children); + Q_Init(&elem->attrs); + simplestring_init(&elem->text); + + /* init empty string in case we don't find any char data */ + simplestring_addn(&elem->text, "", 0); + } + return elem; +} +/******/ + +static int xml_elem_writefunc(int (*fptr)(void *data, const char *text, int size), const char *text, void *data, int len) +{ + return fptr && text ? fptr(data, text, len ? len : strlen(text)) : 0; +} + + + +static int create_xml_escape(char *pString, unsigned char c) +{ + int counter = 0; + + pString[counter++] = '&'; + pString[counter++] = '#'; + if(c >= 100) { + pString[counter++] = c / 100 + '0'; + c = c % 100; + } + pString[counter++] = c / 10 + '0'; + c = c % 10; + + pString[counter++] = c + '0'; + pString[counter++] = ';'; + return counter; +} + +#define non_ascii(c) (c > 127) +#define non_print(c) (!isprint(c)) +#define markup(c) (c == '&' || c == '\"' || c == '>' || c == '<') +#define entity_length(c) ( (c >= 100) ? 3 : ((c >= 10) ? 2 : 1) ) + 3; /* "&#" + c + ";" */ + +/* + * xml_elem_entity_escape + * + * Purpose: + * escape reserved xml chars and non utf-8 chars as xml entities + * Comments: + * The return value may be a new string, or null if no + * conversion was performed. In the latter case, *newlen will + * be 0. + * Flags (to escape) + * xml_elem_no_escaping = 0x000, + * xml_elem_entity_escaping = 0x002, // escape xml special chars as entities + * xml_elem_non_ascii_escaping = 0x008, // escape chars above 127 + * xml_elem_cdata_escaping = 0x010, // wrap in cdata + */ +static char* xml_elem_entity_escape(const char* buf, int old_len, int *newlen, XML_ELEM_ESCAPING flags) { + char *pRetval = 0; + int iNewBufLen=0; + +#define should_escape(c, flag) ( ((flag & xml_elem_markup_escaping) && markup(c)) || \ + ((flag & xml_elem_non_ascii_escaping) && non_ascii(c)) || \ + ((flag & xml_elem_non_print_escaping) && non_print(c)) ) + + if(buf && *buf) { + const unsigned char *bufcopy; + char *NewBuffer; + int ToBeXmlEscaped=0; + int iLength; + bufcopy = buf; + iLength= old_len ? old_len : strlen(buf); + while(*bufcopy) { + if( should_escape(*bufcopy, flags) ) { + /* the length will increase by length of xml escape - the character length */ + iLength += entity_length(*bufcopy); + ToBeXmlEscaped=1; + } + bufcopy++; + } + + if(ToBeXmlEscaped) { + + NewBuffer= malloc(iLength+1); + if(NewBuffer) { + bufcopy=buf; + while(*bufcopy) { + if(should_escape(*bufcopy, flags)) { + iNewBufLen += create_xml_escape(NewBuffer+iNewBufLen,*bufcopy); + } + else { + NewBuffer[iNewBufLen++]=*bufcopy; + } + bufcopy++; + } + NewBuffer[iNewBufLen] = 0; + pRetval = NewBuffer; + } + } + } + + if(newlen) { + *newlen = iNewBufLen; + } + + return pRetval; +} + + +static void xml_element_serialize(xml_element *el, int (*fptr)(void *data, const char *text, int size), void *data, XML_ELEM_OUTPUT_OPTIONS options, int depth) +{ + int i; + static STRUCT_XML_ELEM_OUTPUT_OPTIONS default_opts = {xml_elem_pretty, xml_elem_markup_escaping | xml_elem_non_print_escaping, XML_DECL_ENCODING_DEFAULT}; + static char whitespace[] = " " + " " + " "; + depth++; + + if(!el) { + fprintf(stderr, "Nothing to write\n"); + return; + } + if(!options) { + options = &default_opts; + } + + /* print xml declaration if at root level */ + if(depth == 1) { + xml_elem_writefunc(fptr, XML_DECL_START, data, XML_DECL_START_LEN); + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_VERSION, data, XML_DECL_VERSION_LEN); + if(options->encoding && *options->encoding) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_ENCODING_ATTR, data, XML_DECL_ENCODING_ATTR_LEN); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, options->encoding, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + } + xml_elem_writefunc(fptr, XML_DECL_END, data, XML_DECL_END_LEN); + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + /* begin element */ + xml_elem_writefunc(fptr,START_TOKEN_BEGIN, data, START_TOKEN_BEGIN_LEN); + if(el->name) { + xml_elem_writefunc(fptr, el->name, data, 0); + + /* write attrs, if any */ + if(Q_Size(&el->attrs)) { + xml_element_attr* iter = Q_Head(&el->attrs); + while( iter ) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, iter->key, data, 0); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, iter->val, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + + iter = Q_Next(&el->attrs); + } + } + } + else { + xml_elem_writefunc(fptr, "None", data, 0); + } + /* if no text and no children, use abbreviated form, eg: */ + if(!el->text.len && !Q_Size(&el->children)) { + xml_elem_writefunc(fptr, EMPTY_START_TOKEN_END, data, EMPTY_START_TOKEN_END_LEN); + } + /* otherwise, print element contents */ + else { + xml_elem_writefunc(fptr, START_TOKEN_END, data, START_TOKEN_END_LEN); + + /* print text, if any */ + if(el->text.len) { + char* escaped_str = el->text.str; + int buflen = el->text.len; + + if(options->escaping && options->escaping != xml_elem_cdata_escaping) { + escaped_str = xml_elem_entity_escape(el->text.str, buflen, &buflen, options->escaping ); + if(!escaped_str) { + escaped_str = el->text.str; + } + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_BEGIN, data, CDATA_BEGIN_LEN); + } + + xml_elem_writefunc(fptr, escaped_str, data, buflen); + + if(escaped_str != el->text.str) { + my_free(escaped_str); + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_END, data, CDATA_END_LEN); + } + } + /* no text, so print child elems */ + else { + xml_element *kids = Q_Head(&el->children); + i = 0; + while( kids ) { + if(i++ == 0) { + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + xml_element_serialize(kids, fptr, data, options, depth); + kids = Q_Next(&el->children); + } + if(i) { + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + } + } + + xml_elem_writefunc(fptr, END_TOKEN_BEGIN, data, END_TOKEN_BEGIN_LEN); + xml_elem_writefunc(fptr,el->name ? el->name : "None", data, 0); + xml_elem_writefunc(fptr, END_TOKEN_END, data, END_TOKEN_END_LEN); + } + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } +} + +/* print buf to file */ +static int file_out_fptr(void *f, const char *text, int size) +{ + fputs(text, (FILE *)f); + return 0; +} + +/* print buf to simplestring */ +static int simplestring_out_fptr(void *f, const char *text, int size) +{ + simplestring* buf = (simplestring*)f; + if(buf) { + simplestring_addn(buf, text, size); + } + return 0; +} + +/****f* xml_element/xml_elem_serialize_to_string + * NAME + * xml_elem_serialize_to_string + * SYNOPSIS + * void xml_element_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) + * FUNCTION + * writes element tree as XML into a newly allocated buffer + * INPUTS + * el - root element of tree + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * buf_len - length of returned buffer, if not null. + * RESULT + * char* or NULL. Must be free'd by caller. + * NOTES + * SEE ALSO + * xml_elem_serialize_to_stream () + * xml_elem_parse_buf () + * SOURCE + */ +char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) +{ + simplestring buf; + simplestring_init(&buf); + + xml_element_serialize(el, simplestring_out_fptr, (void *)&buf, options, 0); + + if(buf_len) { + *buf_len = buf.len; + } + + return buf.str; +} +/******/ + +/****f* xml_element/xml_elem_serialize_to_stream + * NAME + * xml_elem_serialize_to_stream + * SYNOPSIS + * void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) + * FUNCTION + * writes element tree as XML into a stream (typically an opened file) + * INPUTS + * el - root element of tree + * output - stream handle + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_parse_buf () + * SOURCE + */ +void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) +{ + xml_element_serialize(el, file_out_fptr, (void *)output, options, 0); +} +/******/ + +/*--------------------------* +* End xml_element Functions * +*--------------------------*/ + + +/*---------------------- +* Begin Expat Handlers * +*---------------------*/ + +typedef struct _xml_elem_data { + xml_element* root; + xml_element* current; + XML_ELEM_INPUT_OPTIONS input_options; + int needs_enc_conversion; +} xml_elem_data; + + +/* expat start of element handler */ +static void startElement(void *userData, const char *name, const char **attrs) +{ + xml_element *c; + xml_elem_data* mydata = (xml_elem_data*)userData; + const char** p = attrs; + + if(mydata) { + c = mydata->current; + + mydata->current = xml_elem_new(); + mydata->current->name = (char*)strdup(name); + mydata->current->parent = c; + + /* init attrs */ + while(p && *p) { + xml_element_attr* attr = malloc(sizeof(xml_element_attr)); + if(attr) { + attr->key = strdup(*p); + attr->val = strdup(*(p+1)); + Q_PushTail(&mydata->current->attrs, attr); + + p += 2; + } + } + } +} + +/* expat end of element handler */ +static void endElement(void *userData, const char *name) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + + if(mydata && mydata->current && mydata->current->parent) { + Q_PushTail(&mydata->current->parent->children, mydata->current); + + mydata->current = mydata->current->parent; + } +} + +/* expat char data handler */ +static void charHandler(void *userData, + const char *s, + int len) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + if(mydata && mydata->current) { + + /* Check if we need to decode utf-8 parser output to another encoding */ + if(mydata->needs_enc_conversion && mydata->input_options->encoding) { + int new_len = 0; + char* add_text = utf8_decode(s, len, &new_len, mydata->input_options->encoding); + if(add_text) { + len = new_len; + simplestring_addn(&mydata->current->text, add_text, len); + free(add_text); + return; + } + } + simplestring_addn(&mydata->current->text, s, len); + } +} +/******/ + +/*-------------------* +* End Expat Handlers * +*-------------------*/ + +/*-------------------* +* xml_elem_parse_buf * +*-------------------*/ + +/****f* xml_element/xml_elem_parse_buf + * NAME + * xml_elem_parse_buf + * SYNOPSIS + * xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) + * FUNCTION + * parse a buffer containing XML into an xml_element in-memory tree + * INPUTS + * in_buf - buffer containing XML document + * len - length of buffer + * options - input options. optional + * error - error result data. optional. check if result is null. + * RESULT + * void + * NOTES + * The returned data must be free'd by caller + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_free () + * SOURCE + */ +xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) +{ + xml_element* xReturn = NULL; + char buf[100] = ""; + static STRUCT_XML_ELEM_INPUT_OPTIONS default_opts = {encoding_utf_8}; + + if(!options) { + options = &default_opts; + } + + if(in_buf) { + XML_Parser parser; + xml_elem_data mydata = {0}; + + parser = XML_ParserCreate(NULL); + + mydata.root = xml_elem_new(); + mydata.current = mydata.root; + mydata.input_options = options; + mydata.needs_enc_conversion = options->encoding && strcmp(options->encoding, encoding_utf_8); + + XML_SetElementHandler(parser, startElement, endElement); + XML_SetCharacterDataHandler(parser, charHandler); + + /* pass the xml_elem_data struct along */ + XML_SetUserData(parser, (void*)&mydata); + + if(!len) { + len = strlen(in_buf); + } + + /* parse the XML */ + if(XML_Parse(parser, in_buf, len, 1) == 0) { + enum XML_Error err_code = XML_GetErrorCode(parser); + int line_num = XML_GetCurrentLineNumber(parser); + int col_num = XML_GetCurrentColumnNumber(parser); + long byte_idx = XML_GetCurrentByteIndex(parser); + int byte_total = XML_GetCurrentByteCount(parser); + const char * error_str = XML_ErrorString(err_code); + if(byte_idx >= 0) { + snprintf(buf, + sizeof(buf), + "\n\tdata beginning %ld before byte index: %s\n", + byte_idx > 10 ? 10 : byte_idx, + in_buf + (byte_idx > 10 ? byte_idx - 10 : byte_idx)); + } + + fprintf(stderr, "expat reports error code %i\n" + "\tdescription: %s\n" + "\tline: %i\n" + "\tcolumn: %i\n" + "\tbyte index: %ld\n" + "\ttotal bytes: %i\n%s ", + err_code, error_str, line_num, + col_num, byte_idx, byte_total, buf); + + + /* error condition */ + if(error) { + error->parser_code = (long)err_code; + error->line = line_num; + error->column = col_num; + error->byte_index = byte_idx; + error->parser_error = error_str; + } + } + else { + xReturn = (xml_element*)Q_Head(&mydata.root->children); + xReturn->parent = NULL; + } + + XML_ParserFree(parser); + + + xml_elem_free_non_recurse(mydata.root); + } + + return xReturn; +} + +/******/ diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_element.c.gcc4 b/trunk/php/xmlrpc/libxmlrpc/xml_element.c.gcc4 new file mode 100644 index 0000000..154f19b --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_element.c.gcc4 @@ -0,0 +1,747 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id$"; + + + +/****h* ABOUT/xml_element + * NAME + * xml_element + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 06/2000 + * HISTORY + * $Log: xml_element.c,v $ + * Revision 1.6 2004/06/01 20:16:06 iliaa + * Fixed bug #28597 (xmlrpc_encode_request() incorrectly encodes chars in + * 200-210 range). + * Patch by: fernando dot nemec at folha dot com dot br + * + * Revision 1.5 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.4 2002/11/26 23:01:16 fmk + * removing unused variables + * + * Revision 1.3 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.9 2002/07/03 20:54:30 danda + * root element should not have a parent. patch from anon SF user + * + * Revision 1.8 2002/05/23 17:46:51 danda + * patch from mukund - fix non utf-8 encoding conversions + * + * Revision 1.7 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.6 2002/01/08 01:06:55 danda + * enable format for parsers that are very picky. + * + * Revision 1.5 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * TODO + * Nicer external API. Get rid of macros. Make opaque types, etc. + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * This code incorporates ideas from expat-ensor from http://xml.ensor.org. + * + * It was coded primarily to act as a go-between for expat and xmlrpc. To this + * end, it stores xml elements, their sub-elements, and their attributes in an + * in-memory tree. When expat is done parsing, the tree can be walked, thus + * retrieving the values. The code can also be used to build a tree via API then + * write out the tree to a buffer, thus "serializing" the xml. + * + * It turns out this is useful for other purposes, such as parsing config files. + * YMMV. + * + * Some Features: + * - output option for xml escaping data. Choices include no escaping, entity escaping, + * or CDATA sections. + * - output option for character encoding. Defaults to (none) utf-8. + * - output option for verbosity/readability. ultra-compact, newlines, pretty/level indented. + * + * BUGS + * there must be some. + ******/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include + +#include "xml_element.h" +#include "queue.h" +#include "expat.h" +#include "encodings.h" + +#define my_free(thing) if(thing) {free(thing); thing = 0;} + +#define XML_DECL_START "" +#define XML_DECL_END_LEN sizeof(XML_DECL_END) - 1 +#define START_TOKEN_BEGIN "<" +#define START_TOKEN_BEGIN_LEN sizeof(START_TOKEN_BEGIN) - 1 +#define START_TOKEN_END ">" +#define START_TOKEN_END_LEN sizeof(START_TOKEN_END) - 1 +#define EMPTY_START_TOKEN_END "/>" +#define EMPTY_START_TOKEN_END_LEN sizeof(EMPTY_START_TOKEN_END) - 1 +#define END_TOKEN_BEGIN "" +#define END_TOKEN_END_LEN sizeof(END_TOKEN_END) - 1 +#define ATTR_DELIMITER "\"" +#define ATTR_DELIMITER_LEN sizeof(ATTR_DELIMITER) - 1 +#define CDATA_BEGIN "" +#define CDATA_END_LEN sizeof(CDATA_END) - 1 +#define EQUALS "=" +#define EQUALS_LEN sizeof(EQUALS) - 1 +#define WHITESPACE " " +#define WHITESPACE_LEN sizeof(WHITESPACE) - 1 +#define NEWLINE "\n" +#define NEWLINE_LEN sizeof(NEWLINE) - 1 +#define MAX_VAL_BUF 144 +#define SCALAR_STR "SCALAR" +#define SCALAR_STR_LEN sizeof(SCALAR_STR) - 1 +#define VECTOR_STR "VECTOR" +#define VECTOR_STR_LEN sizeof(VECTOR_STR) - 1 +#define RESPONSE_STR "RESPONSE" +#define RESPONSE_STR_LEN sizeof(RESPONSE_STR) - 1 + + +/*----------------------------- +- Begin xml_element Functions - +-----------------------------*/ + +/****f* xml_element/xml_elem_free_non_recurse + * NAME + * xml_elem_free_non_recurse + * SYNOPSIS + * void xml_elem_free_non_recurse(xml_element* root) + * FUNCTION + * free a single xml element. child elements will not be freed. + * INPUTS + * root - the element to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free_non_recurse(xml_element* root) { + if(root) { + xml_element_attr* attrs = Q_Head(&root->attrs); + while(attrs) { + my_free(attrs->key); + my_free(attrs->val); + my_free(attrs); + attrs = Q_Next(&root->attrs); + } + + Q_Destroy(&root->children); + Q_Destroy(&root->attrs); + my_free((char*)root->name); + simplestring_free(&root->text); + my_free(root); + } +} +/******/ + +/****f* xml_element/xml_elem_free + * NAME + * xml_elem_free + * SYNOPSIS + * void xml_elem_free(xml_element* root) + * FUNCTION + * free an xml element and all of its child elements + * INPUTS + * root - the root of an xml tree you would like to free + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_free_non_recurse () + * xml_elem_new () + * SOURCE + */ +void xml_elem_free(xml_element* root) { + if(root) { + xml_element* kids = Q_Head(&root->children); + while(kids) { + xml_elem_free(kids); + kids = Q_Next(&root->children); + } + xml_elem_free_non_recurse(root); + } +} +/******/ + +/****f* xml_element/xml_elem_new + * NAME + * xml_elem_new + * SYNOPSIS + * xml_element* xml_elem_new() + * FUNCTION + * allocates and initializes a new xml_element + * INPUTS + * none + * RESULT + * xml_element* or NULL. NULL indicates an out-of-memory condition. + * NOTES + * SEE ALSO + * xml_elem_free () + * xml_elem_free_non_recurse () + * SOURCE + */ +xml_element* xml_elem_new() { + xml_element* elem = calloc(1, sizeof(xml_element)); + if(elem) { + Q_Init(&elem->children); + Q_Init(&elem->attrs); + simplestring_init(&elem->text); + + /* init empty string in case we don't find any char data */ + simplestring_addn(&elem->text, "", 0); + } + return elem; +} +/******/ + +static int xml_elem_writefunc(int (*fptr)(void *data, const char *text, int size), const char *text, void *data, int len) +{ + return fptr && text ? fptr(data, text, len ? len : strlen(text)) : 0; +} + + + +static int create_xml_escape(char *pString, unsigned char c) +{ + int counter = 0; + + pString[counter++] = '&'; + pString[counter++] = '#'; + if(c >= 100) { + pString[counter++] = c / 100 + '0'; + c = c % 100; + } + pString[counter++] = c / 10 + '0'; + c = c % 10; + + pString[counter++] = c + '0'; + pString[counter++] = ';'; + return counter; +} + +#define non_ascii(c) (c > 127) +#define non_print(c) (!isprint(c)) +#define markup(c) (c == '&' || c == '\"' || c == '>' || c == '<') +#define entity_length(c) ( (c >= 100) ? 3 : ((c >= 10) ? 2 : 1) ) + 3; /* "&#" + c + ";" */ + +/* + * xml_elem_entity_escape + * + * Purpose: + * escape reserved xml chars and non utf-8 chars as xml entities + * Comments: + * The return value may be a new string, or null if no + * conversion was performed. In the latter case, *newlen will + * be 0. + * Flags (to escape) + * xml_elem_no_escaping = 0x000, + * xml_elem_entity_escaping = 0x002, // escape xml special chars as entities + * xml_elem_non_ascii_escaping = 0x008, // escape chars above 127 + * xml_elem_cdata_escaping = 0x010, // wrap in cdata + */ +static char* xml_elem_entity_escape(const char* buf, int old_len, int *newlen, XML_ELEM_ESCAPING flags) { + char *pRetval = 0; + int iNewBufLen=0; + +#define should_escape(c, flag) ( ((flag & xml_elem_markup_escaping) && markup(c)) || \ + ((flag & xml_elem_non_ascii_escaping) && non_ascii(c)) || \ + ((flag & xml_elem_non_print_escaping) && non_print(c)) ) + + if(buf && *buf) { + const unsigned char *bufcopy; + char *NewBuffer; + int ToBeXmlEscaped=0; + int iLength; + bufcopy = buf; + iLength= old_len ? old_len : strlen(buf); + while(*bufcopy) { + if( should_escape(*bufcopy, flags) ) { + /* the length will increase by length of xml escape - the character length */ + iLength += entity_length(*bufcopy); + ToBeXmlEscaped=1; + } + bufcopy++; + } + + if(ToBeXmlEscaped) { + + NewBuffer= malloc(iLength+1); + if(NewBuffer) { + bufcopy=buf; + while(*bufcopy) { + if(should_escape(*bufcopy, flags)) { + iNewBufLen += create_xml_escape(NewBuffer+iNewBufLen,*bufcopy); + } + else { + NewBuffer[iNewBufLen++]=*bufcopy; + } + bufcopy++; + } + NewBuffer[iNewBufLen] = 0; + pRetval = NewBuffer; + } + } + } + + if(newlen) { + *newlen = iNewBufLen; + } + + return pRetval; +} + + +static void xml_element_serialize(xml_element *el, int (*fptr)(void *data, const char *text, int size), void *data, XML_ELEM_OUTPUT_OPTIONS options, int depth) +{ + int i; + static STRUCT_XML_ELEM_OUTPUT_OPTIONS default_opts = {xml_elem_pretty, xml_elem_markup_escaping | xml_elem_non_print_escaping, XML_DECL_ENCODING_DEFAULT}; + static char whitespace[] = " " + " " + " "; + depth++; + + if(!el) { + fprintf(stderr, "Nothing to write\n"); + return; + } + if(!options) { + options = &default_opts; + } + + /* print xml declaration if at root level */ + if(depth == 1) { + xml_elem_writefunc(fptr, XML_DECL_START, data, XML_DECL_START_LEN); + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_VERSION, data, XML_DECL_VERSION_LEN); + if(options->encoding && *options->encoding) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, XML_DECL_ENCODING_ATTR, data, XML_DECL_ENCODING_ATTR_LEN); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, options->encoding, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + } + xml_elem_writefunc(fptr, XML_DECL_END, data, XML_DECL_END_LEN); + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + /* begin element */ + xml_elem_writefunc(fptr,START_TOKEN_BEGIN, data, START_TOKEN_BEGIN_LEN); + if(el->name) { + xml_elem_writefunc(fptr, el->name, data, 0); + + /* write attrs, if any */ + if(Q_Size(&el->attrs)) { + xml_element_attr* iter = Q_Head(&el->attrs); + while( iter ) { + xml_elem_writefunc(fptr, WHITESPACE, data, WHITESPACE_LEN); + xml_elem_writefunc(fptr, iter->key, data, 0); + xml_elem_writefunc(fptr, EQUALS, data, EQUALS_LEN); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + xml_elem_writefunc(fptr, iter->val, data, 0); + xml_elem_writefunc(fptr, ATTR_DELIMITER, data, ATTR_DELIMITER_LEN); + + iter = Q_Next(&el->attrs); + } + } + } + else { + xml_elem_writefunc(fptr, "None", data, 0); + } + /* if no text and no children, use abbreviated form, eg: */ + if(!el->text.len && !Q_Size(&el->children)) { + xml_elem_writefunc(fptr, EMPTY_START_TOKEN_END, data, EMPTY_START_TOKEN_END_LEN); + } + /* otherwise, print element contents */ + else { + xml_elem_writefunc(fptr, START_TOKEN_END, data, START_TOKEN_END_LEN); + + /* print text, if any */ + if(el->text.len) { + char* escaped_str = el->text.str; + int buflen = el->text.len; + + if(options->escaping && options->escaping != xml_elem_cdata_escaping) { + escaped_str = xml_elem_entity_escape(el->text.str, buflen, &buflen, options->escaping ); + if(!escaped_str) { + escaped_str = el->text.str; + } + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_BEGIN, data, CDATA_BEGIN_LEN); + } + + xml_elem_writefunc(fptr, escaped_str, data, buflen); + + if(escaped_str != el->text.str) { + my_free(escaped_str); + } + + if(options->escaping & xml_elem_cdata_escaping) { + xml_elem_writefunc(fptr, CDATA_END, data, CDATA_END_LEN); + } + } + /* no text, so print child elems */ + else { + xml_element *kids = Q_Head(&el->children); + i = 0; + while( kids ) { + if(i++ == 0) { + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } + } + xml_element_serialize(kids, fptr, data, options, depth); + kids = Q_Next(&el->children); + } + if(i) { + if(options->verbosity == xml_elem_pretty && depth > 2) { + xml_elem_writefunc(fptr, whitespace, data, depth - 2); + } + } + } + + xml_elem_writefunc(fptr, END_TOKEN_BEGIN, data, END_TOKEN_BEGIN_LEN); + xml_elem_writefunc(fptr,el->name ? el->name : "None", data, 0); + xml_elem_writefunc(fptr, END_TOKEN_END, data, END_TOKEN_END_LEN); + } + if(options->verbosity != xml_elem_no_white_space) { + xml_elem_writefunc(fptr, NEWLINE, data, NEWLINE_LEN); + } +} + +/* print buf to file */ +static int file_out_fptr(void *f, const char *text, int size) +{ + fputs(text, (FILE *)f); + return 0; +} + +/* print buf to simplestring */ +static int simplestring_out_fptr(void *f, const char *text, int size) +{ + simplestring* buf = (simplestring*)f; + if(buf) { + simplestring_addn(buf, text, size); + } + return 0; +} + +/****f* xml_element/xml_elem_serialize_to_string + * NAME + * xml_elem_serialize_to_string + * SYNOPSIS + * void xml_element_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) + * FUNCTION + * writes element tree as XML into a newly allocated buffer + * INPUTS + * el - root element of tree + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * buf_len - length of returned buffer, if not null. + * RESULT + * char* or NULL. Must be free'd by caller. + * NOTES + * SEE ALSO + * xml_elem_serialize_to_stream () + * xml_elem_parse_buf () + * SOURCE + */ +char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len) +{ + simplestring buf; + simplestring_init(&buf); + + xml_element_serialize(el, simplestring_out_fptr, (void *)&buf, options, 0); + + if(buf_len) { + *buf_len = buf.len; + } + + return buf.str; +} +/******/ + +/****f* xml_element/xml_elem_serialize_to_stream + * NAME + * xml_elem_serialize_to_stream + * SYNOPSIS + * void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) + * FUNCTION + * writes element tree as XML into a stream (typically an opened file) + * INPUTS + * el - root element of tree + * output - stream handle + * options - options determining how output is written. see XML_ELEM_OUTPUT_OPTIONS + * RESULT + * void + * NOTES + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_parse_buf () + * SOURCE + */ +void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options) +{ + xml_element_serialize(el, file_out_fptr, (void *)output, options, 0); +} +/******/ + +/*--------------------------* +* End xml_element Functions * +*--------------------------*/ + + +/*---------------------- +* Begin Expat Handlers * +*---------------------*/ + +typedef struct _xml_elem_data { + xml_element* root; + xml_element* current; + XML_ELEM_INPUT_OPTIONS input_options; + int needs_enc_conversion; +} xml_elem_data; + + +/* expat start of element handler */ +static void startElement(void *userData, const char *name, const char **attrs) +{ + xml_element *c; + xml_elem_data* mydata = (xml_elem_data*)userData; + const char** p = attrs; + + if(mydata) { + c = mydata->current; + + mydata->current = xml_elem_new(); + mydata->current->name = (char*)strdup(name); + mydata->current->parent = c; + + /* init attrs */ + while(p && *p) { + xml_element_attr* attr = malloc(sizeof(xml_element_attr)); + if(attr) { + attr->key = strdup(*p); + attr->val = strdup(*(p+1)); + Q_PushTail(&mydata->current->attrs, attr); + + p += 2; + } + } + } +} + +/* expat end of element handler */ +static void endElement(void *userData, const char *name) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + + if(mydata && mydata->current && mydata->current->parent) { + Q_PushTail(&mydata->current->parent->children, mydata->current); + + mydata->current = mydata->current->parent; + } +} + +/* expat char data handler */ +static void charHandler(void *userData, + const char *s, + int len) +{ + xml_elem_data* mydata = (xml_elem_data*)userData; + if(mydata && mydata->current) { + + /* Check if we need to decode utf-8 parser output to another encoding */ + if(mydata->needs_enc_conversion && mydata->input_options->encoding) { + int new_len = 0; + char* add_text = utf8_decode(s, len, &new_len, mydata->input_options->encoding); + if(add_text) { + len = new_len; + simplestring_addn(&mydata->current->text, add_text, len); + free(add_text); + return; + } + } + simplestring_addn(&mydata->current->text, s, len); + } +} +/******/ + +/*-------------------* +* End Expat Handlers * +*-------------------*/ + +/*-------------------* +* xml_elem_parse_buf * +*-------------------*/ + +/****f* xml_element/xml_elem_parse_buf + * NAME + * xml_elem_parse_buf + * SYNOPSIS + * xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) + * FUNCTION + * parse a buffer containing XML into an xml_element in-memory tree + * INPUTS + * in_buf - buffer containing XML document + * len - length of buffer + * options - input options. optional + * error - error result data. optional. check if result is null. + * RESULT + * void + * NOTES + * The returned data must be free'd by caller + * SEE ALSO + * xml_elem_serialize_to_string () + * xml_elem_free () + * SOURCE + */ +xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error) +{ + xml_element* xReturn = NULL; + char buf[100] = ""; + static STRUCT_XML_ELEM_INPUT_OPTIONS default_opts = {encoding_utf_8}; + + if(!options) { + options = &default_opts; + } + + if(in_buf) { + XML_Parser parser; + xml_elem_data mydata = {0}; + + parser = XML_ParserCreate(NULL); + + mydata.root = xml_elem_new(); + mydata.current = mydata.root; + mydata.input_options = options; + mydata.needs_enc_conversion = options->encoding && strcmp(options->encoding, encoding_utf_8); + + XML_SetElementHandler(parser, startElement, endElement); + XML_SetCharacterDataHandler(parser, charHandler); + + /* pass the xml_elem_data struct along */ + XML_SetUserData(parser, (void*)&mydata); + + if(!len) { + len = strlen(in_buf); + } + + /* parse the XML */ + if(XML_Parse(parser, in_buf, len, 1) == 0) { + enum XML_Error err_code = XML_GetErrorCode(parser); + int line_num = XML_GetCurrentLineNumber(parser); + int col_num = XML_GetCurrentColumnNumber(parser); + long byte_idx = XML_GetCurrentByteIndex(parser); + int byte_total = XML_GetCurrentByteCount(parser); + const char * error_str = XML_ErrorString(err_code); + if(byte_idx >= 0) { + snprintf(buf, + sizeof(buf), + "\n\tdata beginning %ld before byte index: %s\n", + byte_idx > 10 ? 10 : byte_idx, + in_buf + (byte_idx > 10 ? byte_idx - 10 : byte_idx)); + } + + fprintf(stderr, "expat reports error code %i\n" + "\tdescription: %s\n" + "\tline: %i\n" + "\tcolumn: %i\n" + "\tbyte index: %ld\n" + "\ttotal bytes: %i\n%s ", + err_code, error_str, line_num, + col_num, byte_idx, byte_total, buf); + + + /* error condition */ + if(error) { + error->parser_code = (long)err_code; + error->line = line_num; + error->column = col_num; + error->byte_index = byte_idx; + error->parser_error = error_str; + } + } + else { + xReturn = (xml_element*)Q_Head(&mydata.root->children); + xReturn->parent = NULL; + } + + XML_ParserFree(parser); + + + xml_elem_free_non_recurse(mydata.root); + } + + return xReturn; +} + +/******/ diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_element.h b/trunk/php/xmlrpc/libxmlrpc/xml_element.h new file mode 100644 index 0000000..cfe7ca2 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_element.h @@ -0,0 +1,202 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef __XML_ELEMENT_H__ + #define __XML_ELEMENT_H__ + +/* includes */ +#include +#include "queue.h" +#include "simplestring.h" +#include "encodings.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****d* enum/XML_ELEM_VERBOSITY + * NAME + * XML_ELEM_VERBOSITY + * NOTES + * verbosity/readability options for generated xml + * SEE ALSO + * XML_ELEM_OUTPUT_OPTIONS + * SOURCE + */ +typedef enum _xml_elem_verbosity { + xml_elem_no_white_space, /* compact xml with no white space */ + xml_elem_newlines_only, /* add newlines for enhanced readability */ + xml_elem_pretty /* add newlines and indent accordint to depth */ +} XML_ELEM_VERBOSITY; +/******/ + + +/****d* enum/XML_ELEM_ESCAPING + * NAME + * XML_ELEM_ESCAPING + * NOTES + * xml escaping options for generated xml + * SEE ALSO + * XML_ELEM_OUTPUT_OPTIONS + * SOURCE + */ +typedef enum _xml_elem_escaping { + xml_elem_no_escaping = 0x000, + xml_elem_markup_escaping = 0x002, /* entity escape xml special chars */ + xml_elem_non_ascii_escaping = 0x008, /* entity escape chars above 127 */ + xml_elem_non_print_escaping = 0x010, /* entity escape non print (illegal) chars */ + xml_elem_cdata_escaping = 0x020, /* wrap in cdata section */ +} XML_ELEM_ESCAPING; +/******/ + + +/****s* struct/XML_ELEM_OUTPUT_OPTIONS + * NAME + * XML_ELEM_OUTPUT_OPTIONS + * NOTES + * defines various output options + * SOURCE + */ +typedef struct _xml_output_options { + XML_ELEM_VERBOSITY verbosity; /* length/verbosity of xml */ + XML_ELEM_ESCAPING escaping; /* how to escape special chars */ + const char* encoding; /* " ?> */ +} STRUCT_XML_ELEM_OUTPUT_OPTIONS, *XML_ELEM_OUTPUT_OPTIONS; +/******/ + +/****s* struct/XML_ELEM_INPUT_OPTIONS + * NAME + * XML_ELEM_INPUT_OPTIONS + * NOTES + * defines various input options + * SOURCE + */ +typedef struct _xml_input_options { + ENCODING_ID encoding; /* which encoding to use. */ +} STRUCT_XML_ELEM_INPUT_OPTIONS, *XML_ELEM_INPUT_OPTIONS; +/******/ + +/****s* struct/XML_ELEM_ERROR + * NAME + * XML_ELEM_ERROR + * NOTES + * defines an xml parser error + * SOURCE + */ +typedef struct _xml_elem_error { + int parser_code; + const char* parser_error; + long line; + long column; + long byte_index; +} STRUCT_XML_ELEM_ERROR, *XML_ELEM_ERROR; +/******/ + + +/*-************************ +* begin xml element stuff * +**************************/ + +/****s* struct/xml_elem_attr + * NAME + * xml_elem_attr + * NOTES + * representation of an xml attribute, foo="bar" + * SOURCE + */ +typedef struct _xml_element_attr { + char* key; /* attribute key */ + char* val; /* attribute value */ +} xml_element_attr; +/******/ + +/****s* struct/xml_elem_attr + * NAME + * xml_elem_attr + * NOTES + * representation of an xml element, eg + * SOURCE + */ +typedef struct _xml_element { + const char* name; /* element identifier */ + simplestring text; /* text contained between element begin/end pairs */ + struct _xml_element* parent; /* element's parent */ + + queue attrs; /* attribute list */ + queue children; /* child element list */ +} xml_element; +/******/ + +void xml_elem_free(xml_element* root); +void xml_elem_free_non_recurse(xml_element* root); +xml_element* xml_elem_new(void); +char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len); +void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options); +xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error); + +/*-********************** +* end xml element stuff * +************************/ + +/*-********************** +* Begin xml_element API * +************************/ + +/****d* VALUE/XMLRPC_MACROS + * NAME + * Some Helpful Macros + * NOTES + * Some macros for making life easier. Should be self-explanatory. + * SEE ALSO + * XMLRPC_AddValueToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * SOURCE + */ +#define xml_elem_next_element(el) ((el) ? (xml_element *)Q_Next(&el->children) : NULL) +#define xml_elem_head_element(el) ((el) ? (xml_element *)Q_Head(&el->children) : NULL) +#define xml_elem_next_attr(el) ((el) ? (xml_element_attr *)Q_Next(&el->attrs) : NULL) +#define xml_elem_head_attr(el) ((el) ? (xml_element_attr *)Q_Head(&el->attrs) : NULL) +#define xml_elem_get_name(el) (char *)((el) ? el->name : NULL) +#define xml_elem_get_val(el) (char *)((el) ? el->text.str : NULL) +/******/ + + +/*-******************** +* End xml_element API * +**********************/ + +#ifdef __cplusplus +} +#endif + +#endif /* __XML_ELEMENT_H__ */ diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_to_dandarpc.c b/trunk/php/xmlrpc/libxmlrpc/xml_to_dandarpc.c new file mode 100644 index 0000000..b51d991 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_to_dandarpc.c @@ -0,0 +1,319 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include "xml_to_dandarpc.h" +#include "base64.h" + +/* list of tokens used in vocab */ +#define ELEM_METHODCALL "methodCall" +#define ELEM_METHODNAME "methodName" +#define ELEM_METHODRESPONSE "methodResponse" +#define ELEM_ROOT "simpleRPC" + +#define ATTR_ARRAY "array" +#define ATTR_BASE64 "base64" +#define ATTR_BOOLEAN "boolean" +#define ATTR_DATETIME "dateTime.iso8601" +#define ATTR_DOUBLE "double" +#define ATTR_ID "id" +#define ATTR_INT "int" +#define ATTR_MIXED "mixed" +#define ATTR_SCALAR "scalar" +#define ATTR_STRING "string" +#define ATTR_STRUCT "struct" +#define ATTR_TYPE "type" +#define ATTR_VECTOR "vector" +#define ATTR_VERSION "version" + +#define VAL_VERSION_0_9 "0.9" + + +XMLRPC_VALUE xml_element_to_DANDARPC_REQUEST_worker(XMLRPC_REQUEST request, XMLRPC_VALUE xCurrent, xml_element* el) { + if(!xCurrent) { + xCurrent = XMLRPC_CreateValueEmpty(); + } + + if(el->name) { + const char* id = NULL; + const char* type = NULL; + xml_element_attr* attr_iter = Q_Head(&el->attrs); + + while(attr_iter) { + if(!strcmp(attr_iter->key, ATTR_ID)) { + id = attr_iter->val; + } + if(!strcmp(attr_iter->key, ATTR_TYPE)) { + type = attr_iter->val; + } + attr_iter = Q_Next(&el->attrs); + } + + if(id) { + XMLRPC_SetValueID_Case(xCurrent, id, 0, xmlrpc_case_exact); + } + + if(!strcmp(el->name, ATTR_SCALAR)) { + if(!type || !strcmp(type, ATTR_STRING)) { + XMLRPC_SetValueString(xCurrent, el->text.str, el->text.len); + } + else if(!strcmp(type, ATTR_INT)) { + XMLRPC_SetValueInt(xCurrent, atoi(el->text.str)); + } + else if(!strcmp(type, ATTR_BOOLEAN)) { + XMLRPC_SetValueBoolean(xCurrent, atoi(el->text.str)); + } + else if(!strcmp(type, ATTR_DOUBLE)) { + XMLRPC_SetValueDouble(xCurrent, atof(el->text.str)); + } + else if(!strcmp(type, ATTR_DATETIME)) { + XMLRPC_SetValueDateTime_ISO8601(xCurrent, el->text.str); + } + else if(!strcmp(type, ATTR_BASE64)) { + struct buffer_st buf; + base64_decode(&buf, el->text.str, el->text.len); + XMLRPC_SetValueBase64(xCurrent, buf.data, buf.offset); + buffer_delete(&buf); + } + } + else if(!strcmp(el->name, ATTR_VECTOR)) { + xml_element* iter = (xml_element*)Q_Head(&el->children); + + if(!type || !strcmp(type, ATTR_MIXED)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_mixed); + } + else if(!strcmp(type, ATTR_ARRAY)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_array); + } + else if(!strcmp(type, ATTR_STRUCT)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_struct); + } + while( iter ) { + XMLRPC_VALUE xNext = XMLRPC_CreateValueEmpty(); + xml_element_to_DANDARPC_REQUEST_worker(request, xNext, iter); + XMLRPC_AddValueToVector(xCurrent, xNext); + iter = (xml_element*)Q_Next(&el->children); + } + } + else { + xml_element* iter = (xml_element*)Q_Head(&el->children); + while( iter ) { + xml_element_to_DANDARPC_REQUEST_worker(request, xCurrent, iter); + iter = (xml_element*)Q_Next(&el->children); + } + + if(!strcmp(el->name, ELEM_METHODCALL)) { + if(request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_call); + } + } + else if(!strcmp(el->name, ELEM_METHODRESPONSE)) { + if(request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_response); + } + } + else if(!strcmp(el->name, ELEM_METHODNAME)) { + if(request) { + XMLRPC_RequestSetMethodName(request, el->text.str); + } + } + } + } + return xCurrent; +} + +XMLRPC_VALUE xml_element_to_DANDARPC_VALUE(xml_element* el) +{ + return xml_element_to_DANDARPC_REQUEST_worker(NULL, NULL, el); +} + +XMLRPC_VALUE xml_element_to_DANDARPC_REQUEST(XMLRPC_REQUEST request, xml_element* el) +{ + if(request) { + return XMLRPC_RequestSetData(request, xml_element_to_DANDARPC_REQUEST_worker(request, NULL, el)); + } + return NULL; +} + +xml_element* DANDARPC_to_xml_element_worker(XMLRPC_REQUEST request, XMLRPC_VALUE node) { +#define BUF_SIZE 512 + xml_element* root = NULL; + if(node) { + char buf[BUF_SIZE]; + const char* id = XMLRPC_GetValueID(node); + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(node); + XMLRPC_REQUEST_OUTPUT_OPTIONS output = XMLRPC_RequestGetOutputOptions(request); + int bNoAddType = (type == xmlrpc_string && request && output && output->xml_elem_opts.verbosity == xml_elem_no_white_space); + xml_element* elem_val = xml_elem_new(); + const char* pAttrType = NULL; + + xml_element_attr* attr_type = bNoAddType ? NULL : malloc(sizeof(xml_element_attr)); + + if(attr_type) { + attr_type->key = strdup(ATTR_TYPE); + attr_type->val = 0; + Q_PushTail(&elem_val->attrs, attr_type); + } + + elem_val->name = (type == xmlrpc_vector) ? strdup(ATTR_VECTOR) : strdup(ATTR_SCALAR); + + if(id && *id) { + xml_element_attr* attr_id = malloc(sizeof(xml_element_attr)); + if(attr_id) { + attr_id->key = strdup(ATTR_ID); + attr_id->val = strdup(id); + Q_PushTail(&elem_val->attrs, attr_id); + } + } + + switch(type) { + case xmlrpc_string: + pAttrType = ATTR_STRING; + simplestring_addn(&elem_val->text, XMLRPC_GetValueString(node), XMLRPC_GetValueStringLen(node)); + break; + case xmlrpc_int: + pAttrType = ATTR_INT; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueInt(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_boolean: + pAttrType = ATTR_BOOLEAN; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueBoolean(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_double: + pAttrType = ATTR_DOUBLE; + snprintf(buf, BUF_SIZE, "%f", XMLRPC_GetValueDouble(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_datetime: + pAttrType = ATTR_DATETIME; + simplestring_add(&elem_val->text, XMLRPC_GetValueDateTime_ISO8601(node)); + break; + case xmlrpc_base64: + { + struct buffer_st buf; + pAttrType = ATTR_BASE64; + base64_encode(&buf, XMLRPC_GetValueBase64(node), XMLRPC_GetValueStringLen(node)); + simplestring_addn(&elem_val->text, buf.data, buf.offset ); + buffer_delete(&buf); + } + break; + case xmlrpc_vector: + { + XMLRPC_VECTOR_TYPE my_type = XMLRPC_GetVectorType(node); + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + + switch(my_type) { + case xmlrpc_vector_array: + pAttrType = ATTR_ARRAY; + break; + case xmlrpc_vector_mixed: + pAttrType = ATTR_MIXED; + break; + case xmlrpc_vector_struct: + pAttrType = ATTR_STRUCT; + break; + default: + break; + } + + /* recurse through sub-elements */ + while( xIter ) { + xml_element* next_el = DANDARPC_to_xml_element_worker(request, xIter); + if(next_el) { + Q_PushTail(&elem_val->children, next_el); + } + xIter = XMLRPC_VectorNext(node); + } + } + break; + default: + break; + } + if(pAttrType && attr_type && !bNoAddType) { + attr_type->val = strdup(pAttrType); + } + root = elem_val; + } + return root; +} + +xml_element* DANDARPC_VALUE_to_xml_element(XMLRPC_VALUE node) { + return DANDARPC_to_xml_element_worker(NULL, node); +} + +xml_element* DANDARPC_REQUEST_to_xml_element(XMLRPC_REQUEST request) { + xml_element* wrapper = NULL; + xml_element* root = NULL; + if(request) { + XMLRPC_REQUEST_TYPE request_type = XMLRPC_RequestGetRequestType(request); + const char* pStr = NULL; + xml_element_attr* version = malloc(sizeof(xml_element_attr)); + version->key = strdup(ATTR_VERSION); + version->val = strdup(VAL_VERSION_0_9); + + wrapper = xml_elem_new(); + + if(request_type == xmlrpc_request_response) { + pStr = ELEM_METHODRESPONSE; + } + else if(request_type == xmlrpc_request_call) { + pStr = ELEM_METHODCALL; + } + if(pStr) { + wrapper->name = strdup(pStr); + } + + root = xml_elem_new(); + root->name = strdup(ELEM_ROOT); + Q_PushTail(&root->attrs, version); + Q_PushTail(&root->children, wrapper); + + pStr = XMLRPC_RequestGetMethodName(request); + + if(pStr) { + xml_element* method = xml_elem_new(); + method->name = strdup(ELEM_METHODNAME); + simplestring_add(&method->text, pStr); + Q_PushTail(&wrapper->children, method); + } + Q_PushTail(&wrapper->children, + DANDARPC_to_xml_element_worker(request, XMLRPC_RequestGetData(request))); + } + return root; +} + diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_to_dandarpc.h b/trunk/php/xmlrpc/libxmlrpc/xml_to_dandarpc.h new file mode 100644 index 0000000..6facb55 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_to_dandarpc.h @@ -0,0 +1,44 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef XML_TO_DANDARPC_H + #define XML_TO_DANDARPC_H + +#include "time.h" +#include "xmlrpc.h" + +XMLRPC_VALUE xml_element_to_DANDARPC_VALUE(xml_element* el); +XMLRPC_VALUE xml_element_to_DANDARPC_REQUEST(XMLRPC_REQUEST request, xml_element* el); +xml_element* DANDARPC_VALUE_to_xml_element(XMLRPC_VALUE node); +xml_element* DANDARPC_REQUEST_to_xml_element(XMLRPC_REQUEST request); + +#endif /* XML_TO_DANDARPC_H */ diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_to_soap.c b/trunk/php/xmlrpc/libxmlrpc/xml_to_soap.c new file mode 100644 index 0000000..8390f06 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_to_soap.c @@ -0,0 +1,670 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) +*/ + + +/*-********************************************************************** +* TODO: * +* - [SOAP-ENC:position] read sparse arrays (and write?) * +* - [SOAP-ENC:offset] read partially transmitted arrays (and write?) * +* - read "flattened" multi-dimensional arrays. (don't bother writing) * +* * +* BUGS: * +* - does not read schema. thus only knows soap pre-defined types. * +* - references (probably) do not work. untested. * +* - does not expose SOAP-ENV:Header to application at all. * +* - does not use namespaces correctly, thus: * +* - namespaces are hard-coded in comparison tokens * +* - if a sender uses another namespace identifer, it will break * +************************************************************************/ + + +static const char rcsid[] = "#(@) $Id:"; + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include "xml_to_soap.h" +#include "base64.h" + +/* list of tokens used in vocab */ +#define TOKEN_ANY "xsd:ur-type" +#define TOKEN_ARRAY "SOAP-ENC:Array" +#define TOKEN_ARRAY_TYPE "SOAP-ENC:arrayType" +#define TOKEN_BASE64 "SOAP-ENC:base64" +#define TOKEN_BOOLEAN "xsd:boolean" +#define TOKEN_DATETIME "xsd:timeInstant" +#define TOKEN_DOUBLE "xsd:double" +#define TOKEN_FLOAT "xsd:float" +#define TOKEN_ID "id" +#define TOKEN_INT "xsd:int" +#define TOKEN_NULL "xsi:null" +#define TOKEN_STRING "xsd:string" +#define TOKEN_STRUCT "xsd:struct" +#define TOKEN_TYPE "xsi:type" +#define TOKEN_FAULT "SOAP-ENV:Fault" +#define TOKEN_MUSTUNDERSTAND "SOAP-ENV:mustUnderstand" +#define TOKEN_ACTOR "SOAP-ENV:actor" +#define TOKEN_ACTOR_NEXT "http://schemas.xmlsoap.org/soap/actor/next" + +#define TOKEN_XMLRPC_FAULTCODE "faultCode" +#define TOKEN_XMLRPC_FAULTSTRING "faultString" +#define TOKEN_SOAP_FAULTCODE "faultcode" +#define TOKEN_SOAP_FAULTSTRING "faultstring" +#define TOKEN_SOAP_FAULTDETAILS "details" +#define TOKEN_SOAP_FAULTACTOR "actor" + + +/* determine if a string represents a soap type, as used in element names */ +static inline int is_soap_type(const char* soap_type) { + return(strstr(soap_type, "SOAP-ENC:") || strstr(soap_type, "xsd:")) ? 1 : 0; +} + +/* utility func to generate a new attribute. possibly should be in xml_element.c?? */ +static xml_element_attr* new_attr(const char* key, const char* val) { + xml_element_attr* attr = malloc(sizeof(xml_element_attr)); + if (attr) { + attr->key = key ? strdup(key) : NULL; + attr->val = val ? strdup(val) : NULL; + } + return attr; +} + +struct array_info { + char kids_type[30]; + unsigned long size; + /* ... ? */ +}; + + +/* parses soap arrayType attribute to generate an array_info structure. + * TODO: should deal with sparse, flattened, & multi-dimensional arrays + */ +static struct array_info* parse_array_type_info(const char* array_type) { + struct array_info* ai = NULL; + if (array_type) { + ai = (struct array_info*)calloc(1, sizeof(struct array_info)); + if (ai) { + char buf[128], *p; + snprintf(buf, sizeof(buf), "%s", array_type); + p = strchr(buf, '['); + if (p) { + *p = 0; + } + strcpy(ai->kids_type, buf); + } + } + return ai; +} + +/* performs heuristics on an xmlrpc_vector_array to determine + * appropriate soap arrayType string. + */ +static const char* get_array_soap_type(XMLRPC_VALUE node) { + XMLRPC_VALUE_TYPE_EASY type = xmlrpc_type_none; + + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + int loopCount = 0; + const char* soapType = TOKEN_ANY; + + type = XMLRPC_GetValueTypeEasy(xIter); + xIter = XMLRPC_VectorNext(node); + + while (xIter) { + /* 50 seems like a decent # of loops. That will likely + * cover most cases. Any more and we start to sacrifice + * performance. + */ + if ( (XMLRPC_GetValueTypeEasy(xIter) != type) || loopCount >= 50) { + type = xmlrpc_type_none; + break; + } + loopCount ++; + + xIter = XMLRPC_VectorNext(node); + } + switch (type) { + case xmlrpc_type_none: + soapType = TOKEN_ANY; + break; + case xmlrpc_type_empty: + soapType = TOKEN_NULL; + break; + case xmlrpc_type_int: + soapType = TOKEN_INT; + break; + case xmlrpc_type_double: + soapType = TOKEN_DOUBLE; + break; + case xmlrpc_type_boolean: + soapType = TOKEN_BOOLEAN; + break; + case xmlrpc_type_string: + soapType = TOKEN_STRING; + break; + case xmlrpc_type_base64: + soapType = TOKEN_BASE64; + break; + case xmlrpc_type_datetime: + soapType = TOKEN_DATETIME; + break; + case xmlrpc_type_struct: + soapType = TOKEN_STRUCT; + break; + case xmlrpc_type_array: + soapType = TOKEN_ARRAY; + break; + case xmlrpc_type_mixed: + soapType = TOKEN_STRUCT; + break; + } + return soapType; +} + +/* determines wether a node is a fault or not, and of which type: + * 0 = not a fault, + * 1 = xmlrpc style fault + * 2 = soap style fault. + */ +static inline int get_fault_type(XMLRPC_VALUE node) { + if (XMLRPC_VectorGetValueWithID(node, TOKEN_XMLRPC_FAULTCODE) && + XMLRPC_VectorGetValueWithID(node, TOKEN_XMLRPC_FAULTSTRING)) { + return 1; + } + else if (XMLRPC_VectorGetValueWithID(node, TOKEN_SOAP_FAULTCODE) && + XMLRPC_VectorGetValueWithID(node, TOKEN_SOAP_FAULTSTRING)) { + return 2; + } + return 0; +} + +/* input: an XMLRPC_VALUE representing a fault struct in xml-rpc style. + * output: an XMLRPC_VALUE representing a fault struct in soap style, + * with xmlrpc codes mapped to soap codes, and all other values preserved. + * note that the returned value is a completely new value, and must be freed. + * the input value is untouched. + */ +static XMLRPC_VALUE gen_fault_xmlrpc(XMLRPC_VALUE node, xml_element* el_target) { + XMLRPC_VALUE xDup = XMLRPC_DupValueNew(node); + XMLRPC_VALUE xCode = XMLRPC_VectorGetValueWithID(xDup, TOKEN_XMLRPC_FAULTCODE); + XMLRPC_VALUE xStr = XMLRPC_VectorGetValueWithID(xDup, TOKEN_XMLRPC_FAULTSTRING); + + XMLRPC_SetValueID(xCode, TOKEN_SOAP_FAULTCODE, 0); + XMLRPC_SetValueID(xStr, TOKEN_SOAP_FAULTSTRING, 0); + + /* rough mapping of xmlrpc fault codes to soap codes */ + switch (XMLRPC_GetValueInt(xCode)) { + case -32700: /* "parse error. not well formed", */ + case -32701: /* "parse error. unsupported encoding" */ + case -32702: /* "parse error. invalid character for encoding" */ + case -32600: /* "server error. invalid xml-rpc. not conforming to spec." */ + case -32601: /* "server error. requested method not found" */ + case -32602: /* "server error. invalid method parameters" */ + XMLRPC_SetValueString(xCode, "SOAP-ENV:Client", 0); + break; + case -32603: /* "server error. internal xml-rpc error" */ + case -32500: /* "application error" */ + case -32400: /* "system error" */ + case -32300: /* "transport error */ + XMLRPC_SetValueString(xCode, "SOAP-ENV:Server", 0); + break; + } + return xDup; +} + +/* returns a new XMLRPC_VALUE representing a soap fault, comprised of a struct with four keys. */ +static XMLRPC_VALUE gen_soap_fault(const char* fault_code, const char* fault_string, + const char* actor, const char* details) { + XMLRPC_VALUE xReturn = XMLRPC_CreateVector(TOKEN_FAULT, xmlrpc_vector_struct); + XMLRPC_AddValuesToVector(xReturn, + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTCODE, fault_code, 0), + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTSTRING, fault_string, 0), + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTACTOR, actor, 0), + XMLRPC_CreateValueString(TOKEN_SOAP_FAULTDETAILS, details, 0), + NULL); + return xReturn; +} + +/* translates xml soap dom to native data structures. recursive. */ +XMLRPC_VALUE xml_element_to_SOAP_REQUEST_worker(XMLRPC_REQUEST request, + XMLRPC_VALUE xParent, + struct array_info* parent_array, + XMLRPC_VALUE xCurrent, + xml_element* el, + int depth) { + XMLRPC_REQUEST_TYPE rtype = xmlrpc_request_none; + + /* no current element on first call */ + if (!xCurrent) { + xCurrent = XMLRPC_CreateValueEmpty(); + } + + /* increment recursion depth guage */ + depth ++; + + /* safety first. must have a valid element */ + if (el && el->name) { + const char* id = NULL; + const char* type = NULL, *arrayType=NULL, *actor = NULL; + xml_element_attr* attr_iter = Q_Head(&el->attrs); + int b_must_understand = 0; + + /* in soap, types may be specified in either element name -or- with xsi:type attribute. */ + if (is_soap_type(el->name)) { + type = el->name; + } + /* if our parent node, by definition a vector, is not an array, then + our element name must be our key identifier. */ + else if (XMLRPC_GetVectorType(xParent) != xmlrpc_vector_array) { + id = el->name; + if(!strcmp(id, "item")) { + } + } + + /* iterate through element attributes, pick out useful stuff. */ + while (attr_iter) { + /* element's type */ + if (!strcmp(attr_iter->key, TOKEN_TYPE)) { + type = attr_iter->val; + } + /* array type */ + else if (!strcmp(attr_iter->key, TOKEN_ARRAY_TYPE)) { + arrayType = attr_iter->val; + } + /* must understand, sometimes present in headers. */ + else if (!strcmp(attr_iter->key, TOKEN_MUSTUNDERSTAND)) { + b_must_understand = strchr(attr_iter->val, '1') ? 1 : 0; + } + /* actor, used in conjuction with must understand. */ + else if (!strcmp(attr_iter->key, TOKEN_ACTOR)) { + actor = attr_iter->val; + } + attr_iter = Q_Next(&el->attrs); + } + + /* check if caller says we must understand something in a header. */ + if (b_must_understand) { + /* is must understand actually indended for us? + BUG: spec says we should also determine if actor is our URL, but + we do not have that information. */ + if (!actor || !strcmp(actor, TOKEN_ACTOR_NEXT)) { + /* TODO: implement callbacks or other mechanism for applications + to "understand" these headers. For now, we just bail if we + get a mustUnderstand header intended for us. */ + XMLRPC_RequestSetError(request, + gen_soap_fault("SOAP-ENV:MustUnderstand", + "SOAP Must Understand Error", + "", "")); + return xCurrent; + } + } + + /* set id (key) if one was found. */ + if (id) { + XMLRPC_SetValueID_Case(xCurrent, id, 0, xmlrpc_case_exact); + } + + /* according to soap spec, + depth 1 = Envelope, 2 = Header, Body & Fault, 3 = methodcall or response. */ + if (depth == 3) { + const char* methodname = el->name; + char* p = NULL; + + /* BUG: we determine request or response type using presence of "Response" in element name. + According to spec, this is only recommended, not required. Apparently, implementations + are supposed to know the type of action based on state, which strikes me as a bit lame. + Anyway, we don't have that state info, thus we use Response as a heuristic. */ + rtype = +#ifdef strcasestr + strcasestr(el->name, "response") ? xmlrpc_request_response : xmlrpc_request_call; +#else + strstr(el->name, "esponse") ? xmlrpc_request_response : xmlrpc_request_call; +#endif + XMLRPC_RequestSetRequestType(request, rtype); + + /* Get methodname. strip xml namespace crap. */ + p = strchr(el->name, ':'); + if (p) { + methodname = p + 1; + } + if (rtype == xmlrpc_request_call) { + XMLRPC_RequestSetMethodName(request, methodname); + } + } + + + /* Next, we begin to convert actual values. if no children, then must be a scalar value. */ + if (!Q_Size(&el->children)) { + if (!type && parent_array && parent_array->kids_type[0]) { + type = parent_array->kids_type; + } + if (!type || !strcmp(type, TOKEN_STRING)) { + XMLRPC_SetValueString(xCurrent, el->text.str, el->text.len); + } + else if (!strcmp(type, TOKEN_INT)) { + XMLRPC_SetValueInt(xCurrent, atoi(el->text.str)); + } + else if (!strcmp(type, TOKEN_BOOLEAN)) { + XMLRPC_SetValueBoolean(xCurrent, atoi(el->text.str)); + } + else if (!strcmp(type, TOKEN_DOUBLE) || + !strcmp(type, TOKEN_FLOAT)) { + XMLRPC_SetValueDouble(xCurrent, atof(el->text.str)); + } + else if (!strcmp(type, TOKEN_NULL)) { + /* already an empty val. do nothing. */ + } + else if (!strcmp(type, TOKEN_DATETIME)) { + XMLRPC_SetValueDateTime_ISO8601(xCurrent, el->text.str); + } + else if (!strcmp(type, TOKEN_BASE64)) { + struct buffer_st buf; + base64_decode(&buf, el->text.str, el->text.len); + XMLRPC_SetValueBase64(xCurrent, buf.data, buf.offset); + buffer_delete(&buf); + } + } + /* Element has children, thus a vector, or "compound type" in soap-speak. */ + else { + struct array_info* ai = NULL; + xml_element* iter = (xml_element*)Q_Head(&el->children); + + if (!type || !strcmp(type, TOKEN_STRUCT)) { + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_struct); + } + else if (!strcmp(type, TOKEN_ARRAY) || arrayType != NULL) { + /* determine magic associated with soap array type. + this is passed down as we recurse, so our children have access to the info. */ + ai = parse_array_type_info(arrayType); // alloc'ed ai free'd below. + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_array); + } + else { + /* mixed is probably closest thing we have to compound type. */ + XMLRPC_SetIsVector(xCurrent, xmlrpc_vector_mixed); + } + /* Recurse, adding values as we go. Check for error during recursion + and if found, bail. this short-circuits us out of the recursion. */ + while ( iter && !XMLRPC_RequestGetError(request) ) { + XMLRPC_VALUE xNext = NULL; + /* top level elements don't actually represent values, so we just pass the + current value along until we are deep enough. */ + if ( depth <= 2 || + (rtype == xmlrpc_request_response && depth <= 3) ) { + xml_element_to_SOAP_REQUEST_worker(request, NULL, ai, xCurrent, iter, depth); + } + /* ready to do some actual de-serialization. create a new empty value and + pass that along to be init'd, then add it to our current vector. */ + else { + xNext = XMLRPC_CreateValueEmpty(); + xml_element_to_SOAP_REQUEST_worker(request, xCurrent, ai, xNext, iter, depth); + XMLRPC_AddValueToVector(xCurrent, xNext); + } + iter = (xml_element*)Q_Next(&el->children); + } + /* cleanup */ + if (ai) { + free(ai); + } + } + } + return xCurrent; +} + +/* Convert soap xml dom to XMLRPC_VALUE, sans request info. untested. */ +XMLRPC_VALUE xml_element_to_SOAP_VALUE(xml_element* el) +{ + return xml_element_to_SOAP_REQUEST_worker(NULL, NULL, NULL, NULL, el, 0); +} + +/* Convert soap xml dom to XMLRPC_REQUEST */ +XMLRPC_VALUE xml_element_to_SOAP_REQUEST(XMLRPC_REQUEST request, xml_element* el) +{ + if (request) { + return XMLRPC_RequestSetData(request, xml_element_to_SOAP_REQUEST_worker(request, NULL, NULL, NULL, el, 0)); + } + return NULL; +} + + +/* translates data structures to soap/xml. recursive */ +xml_element* SOAP_to_xml_element_worker(XMLRPC_REQUEST request, XMLRPC_VALUE node) { +#define BUF_SIZE 128 + xml_element* elem_val = NULL; + if (node) { + int bFreeNode = 0; /* sometimes we may need to free 'node' variable */ + char buf[BUF_SIZE]; + XMLRPC_VALUE_TYPE_EASY type = XMLRPC_GetValueTypeEasy(node); + char* pName = NULL, *pAttrType = NULL; + + /* create our return value element */ + elem_val = xml_elem_new(); + + switch (type) { + case xmlrpc_type_struct: + case xmlrpc_type_mixed: + case xmlrpc_type_array: + if (type == xmlrpc_type_array) { + /* array's are _very_ special in soap. + TODO: Should handle sparse/partial arrays here. */ + + /* determine soap array type. */ + const char* type = get_array_soap_type(node); + xml_element_attr* attr_array_type = NULL; + + /* specify array kids type and array size. */ + snprintf(buf, sizeof(buf), "%s[%i]", type, XMLRPC_VectorSize(node)); + attr_array_type = new_attr(TOKEN_ARRAY_TYPE, buf); + + Q_PushTail(&elem_val->attrs, attr_array_type); + + pAttrType = TOKEN_ARRAY; + } + /* check for fault, which is a rather special case. + (can't these people design anything consistent/simple/elegant?) */ + else if (type == xmlrpc_type_struct) { + int fault_type = get_fault_type(node); + if (fault_type) { + if (fault_type == 1) { + /* gen fault from xmlrpc style fault codes + notice that we get a new node, which must be freed herein. */ + node = gen_fault_xmlrpc(node, elem_val); + bFreeNode = 1; + } + pName = TOKEN_FAULT; + } + } + + { + /* recurse through sub-elements */ + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + while ( xIter ) { + xml_element* next_el = SOAP_to_xml_element_worker(request, xIter); + if (next_el) { + Q_PushTail(&elem_val->children, next_el); + } + xIter = XMLRPC_VectorNext(node); + } + } + + break; + + /* handle scalar types */ + case xmlrpc_type_empty: + pAttrType = TOKEN_NULL; + break; + case xmlrpc_type_string: + pAttrType = TOKEN_STRING; + simplestring_addn(&elem_val->text, XMLRPC_GetValueString(node), XMLRPC_GetValueStringLen(node)); + break; + case xmlrpc_type_int: + pAttrType = TOKEN_INT; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueInt(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_type_boolean: + pAttrType = TOKEN_BOOLEAN; + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueBoolean(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_type_double: + pAttrType = TOKEN_DOUBLE; + snprintf(buf, BUF_SIZE, "%f", XMLRPC_GetValueDouble(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_type_datetime: + { + time_t tt = XMLRPC_GetValueDateTime(node); + struct tm *tm = localtime (&tt); + pAttrType = TOKEN_DATETIME; + if(strftime (buf, BUF_SIZE, "%Y-%m-%dT%H:%M:%SZ", tm)) { + simplestring_add(&elem_val->text, buf); + } + } + break; + case xmlrpc_type_base64: + { + struct buffer_st buf; + pAttrType = TOKEN_BASE64; + base64_encode(&buf, XMLRPC_GetValueBase64(node), XMLRPC_GetValueStringLen(node)); + simplestring_addn(&elem_val->text, buf.data, buf.offset ); + buffer_delete(&buf); + } + break; + break; + default: + break; + } + + /* determining element's name is a bit tricky, due to soap semantics. */ + if (!pName) { + /* if the value's type is known... */ + if (pAttrType) { + /* see if it has an id (key). If so, use that as name, and type as an attribute. */ + pName = (char*)XMLRPC_GetValueID(node); + if (pName) { + Q_PushTail(&elem_val->attrs, new_attr(TOKEN_TYPE, pAttrType)); + } + + /* otherwise, use the type as the name. */ + else { + pName = pAttrType; + } + } + /* if the value's type is not known... (a rare case?) */ + else { + /* see if it has an id (key). otherwise, default to generic "item" */ + pName = (char*)XMLRPC_GetValueID(node); + if (!pName) { + pName = "item"; + } + } + } + elem_val->name = strdup(pName); + + /* cleanup */ + if (bFreeNode) { + XMLRPC_CleanupValue(node); + } + } + return elem_val; +} + +/* convert XMLRPC_VALUE to soap xml dom. untested. */ +xml_element* SOAP_VALUE_to_xml_element(XMLRPC_VALUE node) { + return SOAP_to_xml_element_worker(NULL, node); +} + +/* convert XMLRPC_REQUEST to soap xml dom. */ +xml_element* SOAP_REQUEST_to_xml_element(XMLRPC_REQUEST request) { + xml_element* root = xml_elem_new(); + + /* safety first. */ + if (root) { + xml_element* body = xml_elem_new(); + root->name = strdup("SOAP-ENV:Envelope"); + + /* silly namespace stuff */ + Q_PushTail(&root->attrs, new_attr("xmlns:SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/")); + Q_PushTail(&root->attrs, new_attr("xmlns:xsi", "http://www.w3.org/1999/XMLSchema-instance")); + Q_PushTail(&root->attrs, new_attr("xmlns:xsd", "http://www.w3.org/1999/XMLSchema")); + Q_PushTail(&root->attrs, new_attr("xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/")); + Q_PushTail(&root->attrs, new_attr("xmlns:si", "http://soapinterop.org/xsd")); + Q_PushTail(&root->attrs, new_attr("xmlns:ns6", "http://testuri.org")); + Q_PushTail(&root->attrs, new_attr("SOAP-ENV:encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/")); + + /* Q_PushHead(&root->attrs, new_attr("xmlns:ks", "http://kitchen.sink.org/soap/everything/under/sun")); + JUST KIDDING!! :-) ----> ------------------------------------------------- */ + + if (body) { + /* go ahead and serialize first... */ + xml_element* el_serialized = + SOAP_to_xml_element_worker(request, + XMLRPC_RequestGetData(request)); + + /* check for fault, in which case, there is no intermediate element */ + if (el_serialized && !strcmp(el_serialized->name, TOKEN_FAULT)) { + Q_PushTail(&body->children, el_serialized); + } + /* usual case: not a fault. Add Response element in between. */ + else { + xml_element* rpc = xml_elem_new(); + + if (rpc) { + const char* methodname = XMLRPC_RequestGetMethodName(request); + XMLRPC_REQUEST_TYPE rtype = XMLRPC_RequestGetRequestType(request); + + /* if we are making a request, we want to use the methodname as is. */ + if (rtype == xmlrpc_request_call) { + if (methodname) { + rpc->name = strdup(methodname); + } + } + /* if it's a response, we append "Response". Also, given xmlrpc-epi + API/architecture, it's likely that we don't have a methodname for + the response, so we have to check that. */ + else { + char buf[128]; + snprintf(buf, sizeof(buf), "%s%s", + methodname ? methodname : "", + "Response"); + + rpc->name = strdup(buf); + } + + /* add serialized data to method call/response. + add method call/response to body element */ + if (rpc->name) { + if(el_serialized) { + if(Q_Size(&el_serialized->children) && rtype == xmlrpc_request_call) { + xml_element* iter = (xml_element*)Q_Head(&el_serialized->children); + while(iter) { + Q_PushTail(&rpc->children, iter); + iter = (xml_element*)Q_Next(&el_serialized->children); + } + xml_elem_free_non_recurse(el_serialized); + } + else { + Q_PushTail(&rpc->children, el_serialized); + } + } + + Q_PushTail(&body->children, rpc); + } + else { + /* no method name?! + TODO: fault here...? */ + } + } + } + body->name = strdup("SOAP-ENV:Body"); + Q_PushTail(&root->children, body); + } + } + + return root; +} + diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_to_soap.h b/trunk/php/xmlrpc/libxmlrpc/xml_to_soap.h new file mode 100644 index 0000000..9ae9308 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_to_soap.h @@ -0,0 +1,44 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +#ifndef XML_TO_SOAP_H + #define XML_TO_SOAP_H + +#include "xmlrpc.h" + +XMLRPC_VALUE xml_element_to_SOAP_VALUE(xml_element* el); +XMLRPC_VALUE xml_element_to_SOAP_REQUEST(XMLRPC_REQUEST request, xml_element* el); +xml_element* SOAP_VALUE_to_xml_element(XMLRPC_VALUE node); +xml_element* SOAP_REQUEST_to_xml_element(XMLRPC_REQUEST request); + +#endif /* XML_TO_XMLRPC_H */ diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.c b/trunk/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.c new file mode 100644 index 0000000..c76b00f --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.c @@ -0,0 +1,413 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id$"; + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include "xml_to_xmlrpc.h" +#include "base64.h" + +/* list of tokens used in vocab */ +#define ELEM_ARRAY "array" +#define ELEM_BASE64 "base64" +#define ELEM_BOOLEAN "boolean" +#define ELEM_DATA "data" +#define ELEM_DATETIME "dateTime.iso8601" +#define ELEM_DOUBLE "double" +#define ELEM_FAULT "fault" +#define ELEM_FAULTCODE "faultCode" +#define ELEM_FAULTSTRING "faultString" +#define ELEM_I4 "i4" +#define ELEM_INT "int" +#define ELEM_MEMBER "member" +#define ELEM_METHODCALL "methodCall" +#define ELEM_METHODNAME "methodName" +#define ELEM_METHODRESPONSE "methodResponse" +#define ELEM_NAME "name" +#define ELEM_NIL "nil" +#define ELEM_PARAM "param" +#define ELEM_PARAMS "params" +#define ELEM_STRING "string" +#define ELEM_STRUCT "struct" +#define ELEM_VALUE "value" + + +XMLRPC_VALUE xml_element_to_XMLRPC_REQUEST_worker(XMLRPC_REQUEST request, XMLRPC_VALUE parent_vector, XMLRPC_VALUE current_val, xml_element* el) { + if (!current_val) { + /* This should only be the case for the first element */ + current_val = XMLRPC_CreateValueEmpty(); + } + + if (el->name) { + + /* first, deal with the crazy/stupid fault format */ + if (!strcmp(el->name, ELEM_FAULT)) { + xml_element* fault_value = (xml_element*)Q_Head(&el->children); + XMLRPC_SetIsVector(current_val, xmlrpc_vector_struct); + + if(fault_value) { + xml_element* fault_struct = (xml_element*)Q_Head(&fault_value->children); + if(fault_struct) { + xml_element* iter = (xml_element*)Q_Head(&fault_struct->children); + + while (iter) { + XMLRPC_VALUE xNextVal = XMLRPC_CreateValueEmpty(); + xml_element_to_XMLRPC_REQUEST_worker(request, current_val, xNextVal, iter); + XMLRPC_AddValueToVector(current_val, xNextVal); + iter = (xml_element*)Q_Next(&fault_struct->children); + } + } + } + } + else if (!strcmp(el->name, ELEM_DATA) /* should be ELEM_ARRAY, but there is an extra level. weird */ + || (!strcmp(el->name, ELEM_PARAMS) && + (XMLRPC_RequestGetRequestType(request) == xmlrpc_request_call)) ) { /* this "PARAMS" concept is silly. dave?! */ + xml_element* iter = (xml_element*)Q_Head(&el->children); + XMLRPC_SetIsVector(current_val, xmlrpc_vector_array); + + while (iter) { + XMLRPC_VALUE xNextVal = XMLRPC_CreateValueEmpty(); + xml_element_to_XMLRPC_REQUEST_worker(request, current_val, xNextVal, iter); + XMLRPC_AddValueToVector(current_val, xNextVal); + iter = (xml_element*)Q_Next(&el->children); + } + } + else if (!strcmp(el->name, ELEM_STRUCT)) { + xml_element* iter = (xml_element*)Q_Head(&el->children); + XMLRPC_SetIsVector(current_val, xmlrpc_vector_struct); + + while ( iter ) { + XMLRPC_VALUE xNextVal = XMLRPC_CreateValueEmpty(); + xml_element_to_XMLRPC_REQUEST_worker(request, current_val, xNextVal, iter); + XMLRPC_AddValueToVector(current_val, xNextVal); + iter = (xml_element*)Q_Next(&el->children); + } + } + else if (!strcmp(el->name, ELEM_STRING) || + (!strcmp(el->name, ELEM_VALUE) && Q_Size(&el->children) == 0)) { + XMLRPC_SetValueString(current_val, el->text.str, el->text.len); + } + else if (!strcmp(el->name, ELEM_NAME)) { + XMLRPC_SetValueID_Case(current_val, el->text.str, 0, xmlrpc_case_exact); + } + else if (!strcmp(el->name, ELEM_INT) || !strcmp(el->name, ELEM_I4)) { + XMLRPC_SetValueInt(current_val, atoi(el->text.str)); + } + else if (!strcmp(el->name, ELEM_BOOLEAN)) { + XMLRPC_SetValueBoolean(current_val, atoi(el->text.str)); + } + else if (!strcmp(el->name, ELEM_DOUBLE)) { + XMLRPC_SetValueDouble(current_val, atof(el->text.str)); + } + else if (!strcmp(el->name, ELEM_DATETIME)) { + XMLRPC_SetValueDateTime_ISO8601(current_val, el->text.str); + } + else if (!strcmp(el->name, ELEM_BASE64)) { + struct buffer_st buf; + base64_decode(&buf, el->text.str, el->text.len); + XMLRPC_SetValueBase64(current_val, buf.data, buf.offset); + buffer_delete(&buf); + } + else { + xml_element* iter; + + if (!strcmp(el->name, ELEM_METHODCALL)) { + if (request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_call); + } + } + else if (!strcmp(el->name, ELEM_METHODRESPONSE)) { + if (request) { + XMLRPC_RequestSetRequestType(request, xmlrpc_request_response); + } + } + else if (!strcmp(el->name, ELEM_METHODNAME)) { + if (request) { + XMLRPC_RequestSetMethodName(request, el->text.str); + } + } + + iter = (xml_element*)Q_Head(&el->children); + while ( iter ) { + xml_element_to_XMLRPC_REQUEST_worker(request, parent_vector, + current_val, iter); + iter = (xml_element*)Q_Next(&el->children); + } + } + } + return current_val; +} + +XMLRPC_VALUE xml_element_to_XMLRPC_VALUE(xml_element* el) +{ + return xml_element_to_XMLRPC_REQUEST_worker(NULL, NULL, NULL, el); +} + +XMLRPC_VALUE xml_element_to_XMLRPC_REQUEST(XMLRPC_REQUEST request, xml_element* el) +{ + if (request) { + return XMLRPC_RequestSetData(request, xml_element_to_XMLRPC_REQUEST_worker(request, NULL, NULL, el)); + } + return NULL; +} + +xml_element* XMLRPC_to_xml_element_worker(XMLRPC_VALUE current_vector, XMLRPC_VALUE node, + XMLRPC_REQUEST_TYPE request_type, int depth) { +#define BUF_SIZE 512 + xml_element* root = NULL; + if (node) { + char buf[BUF_SIZE]; + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(node); + XMLRPC_VECTOR_TYPE vtype = XMLRPC_GetVectorType(node); + xml_element* elem_val = xml_elem_new(); + + /* special case for when root element is not an array */ + if (depth == 0 && + !(type == xmlrpc_vector && + vtype == xmlrpc_vector_array && + request_type == xmlrpc_request_call) ) { + int bIsFault = (vtype == xmlrpc_vector_struct && XMLRPC_VectorGetValueWithID(node, ELEM_FAULTCODE)); + + xml_element* next_el = XMLRPC_to_xml_element_worker(NULL, node, request_type, depth + 1); + if (next_el) { + Q_PushTail(&elem_val->children, next_el); + } + elem_val->name = strdup(bIsFault ? ELEM_FAULT : ELEM_PARAMS); + } + else { + switch (type) { + case xmlrpc_empty: /* treat null value as empty string in xmlrpc. */ + case xmlrpc_nil: + elem_val->name = strdup(ELEM_NIL); + break; + case xmlrpc_string: + elem_val->name = strdup(ELEM_STRING); + simplestring_addn(&elem_val->text, XMLRPC_GetValueString(node), XMLRPC_GetValueStringLen(node)); + break; + case xmlrpc_int: + elem_val->name = strdup(ELEM_INT); + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueInt(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_boolean: + elem_val->name = strdup(ELEM_BOOLEAN); + snprintf(buf, BUF_SIZE, "%i", XMLRPC_GetValueBoolean(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_double: + elem_val->name = strdup(ELEM_DOUBLE); + snprintf(buf, BUF_SIZE, "%f", XMLRPC_GetValueDouble(node)); + simplestring_add(&elem_val->text, buf); + break; + case xmlrpc_datetime: + elem_val->name = strdup(ELEM_DATETIME); + simplestring_add(&elem_val->text, XMLRPC_GetValueDateTime_ISO8601(node)); + break; + case xmlrpc_base64: + { + struct buffer_st buf; + elem_val->name = strdup(ELEM_BASE64); + base64_encode(&buf, XMLRPC_GetValueBase64(node), XMLRPC_GetValueStringLen(node)); + simplestring_addn(&elem_val->text, buf.data, buf.offset ); + buffer_delete(&buf); + } + break; + case xmlrpc_vector: + { + XMLRPC_VECTOR_TYPE my_type = XMLRPC_GetVectorType(node); + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(node); + xml_element* root_vector_elem = elem_val; + + switch (my_type) { + case xmlrpc_vector_array: + { + if(depth == 0) { + elem_val->name = strdup(ELEM_PARAMS); + } + else { + /* Hi my name is Dave and I like to make things as confusing + * as possible, thus I will throw in this 'data' element + * where it absolutely does not belong just so that people + * cannot code arrays and structs in a similar and straight + * forward manner. Have a good day. + * + * GRRRRRRRRR! + */ + xml_element* data = xml_elem_new(); + data->name = strdup(ELEM_DATA); + + elem_val->name = strdup(ELEM_ARRAY); + Q_PushTail(&elem_val->children, data); + root_vector_elem = data; + } + } + break; + case xmlrpc_vector_mixed: /* not officially supported */ + case xmlrpc_vector_struct: + elem_val->name = strdup(ELEM_STRUCT); + break; + default: + break; + } + + /* recurse through sub-elements */ + while ( xIter ) { + xml_element* next_el = XMLRPC_to_xml_element_worker(node, xIter, request_type, depth + 1); + if (next_el) { + Q_PushTail(&root_vector_elem->children, next_el); + } + xIter = XMLRPC_VectorNext(node); + } + } + break; + default: + break; + } + } + + { + XMLRPC_VECTOR_TYPE vtype = XMLRPC_GetVectorType(current_vector); + + if (depth == 1) { + xml_element* value = xml_elem_new(); + value->name = strdup(ELEM_VALUE); + + /* yet another hack for the "fault" crap */ + if (XMLRPC_VectorGetValueWithID(node, ELEM_FAULTCODE)) { + root = value; + } + else { + xml_element* param = xml_elem_new(); + param->name = strdup(ELEM_PARAM); + + Q_PushTail(¶m->children, value); + + root = param; + } + Q_PushTail(&value->children, elem_val); + } + else if (vtype == xmlrpc_vector_struct || vtype == xmlrpc_vector_mixed) { + xml_element* member = xml_elem_new(); + xml_element* name = xml_elem_new(); + xml_element* value = xml_elem_new(); + + member->name = strdup(ELEM_MEMBER); + name->name = strdup(ELEM_NAME); + value->name = strdup(ELEM_VALUE); + + simplestring_add(&name->text, XMLRPC_GetValueID(node)); + + Q_PushTail(&member->children, name); + Q_PushTail(&member->children, value); + Q_PushTail(&value->children, elem_val); + + root = member; + } + else if (vtype == xmlrpc_vector_array) { + xml_element* value = xml_elem_new(); + + value->name = strdup(ELEM_VALUE); + + Q_PushTail(&value->children, elem_val); + + root = value; + } + else if (vtype == xmlrpc_vector_none) { + /* no parent. non-op */ + root = elem_val; + } + else { + xml_element* value = xml_elem_new(); + + value->name = strdup(ELEM_VALUE); + + Q_PushTail(&value->children, elem_val); + + root = value; + } + } + } + return root; +} + +xml_element* XMLRPC_VALUE_to_xml_element(XMLRPC_VALUE node) { + return XMLRPC_to_xml_element_worker(NULL, node, xmlrpc_request_none, 0); +} + +xml_element* XMLRPC_REQUEST_to_xml_element(XMLRPC_REQUEST request) { + xml_element* wrapper = NULL; + if (request) { + const char* pStr = NULL; + XMLRPC_REQUEST_TYPE request_type = XMLRPC_RequestGetRequestType(request); + XMLRPC_VALUE xParams = XMLRPC_RequestGetData(request); + + wrapper = xml_elem_new(); + + if (request_type == xmlrpc_request_call) { + pStr = ELEM_METHODCALL; + } + else if (request_type == xmlrpc_request_response) { + pStr = ELEM_METHODRESPONSE; + } + if (pStr) { + wrapper->name = strdup(pStr); + } + + if(request_type == xmlrpc_request_call) { + pStr = XMLRPC_RequestGetMethodName(request); + + if (pStr) { + xml_element* method = xml_elem_new(); + method->name = strdup(ELEM_METHODNAME); + simplestring_add(&method->text, pStr); + Q_PushTail(&wrapper->children, method); + } + } + if (xParams) { + Q_PushTail(&wrapper->children, + XMLRPC_to_xml_element_worker(NULL, XMLRPC_RequestGetData(request), XMLRPC_RequestGetRequestType(request), 0)); + } + else { + /* Despite the spec, the xml-rpc list folk want me to send an empty params element */ + xml_element* params = xml_elem_new(); + params->name = strdup(ELEM_PARAMS); + Q_PushTail(&wrapper->children, params); + } + } + return wrapper; +} + diff --git a/trunk/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.h b/trunk/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.h new file mode 100644 index 0000000..234a153 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xml_to_xmlrpc.h @@ -0,0 +1,45 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +#ifndef XML_TO_XMLRPC_H + #define XML_TO_XMLRPC_H + +#include "time.h" +#include "xmlrpc.h" + +XMLRPC_VALUE xml_element_to_XMLRPC_VALUE(xml_element* el); +XMLRPC_VALUE xml_element_to_XMLRPC_REQUEST(XMLRPC_REQUEST request, xml_element* el); +xml_element* XMLRPC_VALUE_to_xml_element(XMLRPC_VALUE node); +xml_element* XMLRPC_REQUEST_to_xml_element(XMLRPC_REQUEST request); + +#endif /* XML_TO_XMLRPC_H */ diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc.c b/trunk/php/xmlrpc/libxmlrpc/xmlrpc.c new file mode 100644 index 0000000..d5f3f7b --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc.c @@ -0,0 +1,2963 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +static const char rcsid[] = "#(@) $Id$"; + + +/****h* ABOUT/xmlrpc + * NAME + * XMLRPC_VALUE + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * CREATION DATE + * 9/1999 - 10/2000 + * HISTORY + * $Log: xmlrpc.c,v $ + * Revision 1.6 2004/04/27 17:33:59 iliaa + * Removed C++ style comments. + * + * Revision 1.5 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.4 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.22 2002/03/09 23:15:44 danda + * add fault interrogation funcs + * + * Revision 1.21 2002/03/09 22:27:41 danda + * win32 build patches contributed by Jeff Lawson + * + * Revision 1.20 2002/02/13 20:58:50 danda + * patch to make source more windows friendly, contributed by Jeff Lawson + * + * Revision 1.19 2001/10/12 23:25:54 danda + * default to writing xmlrpc + * + * Revision 1.18 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 10/15/2000 -- danda -- adding robodoc documentation + * 08/2000 -- danda -- PHP C extension that uses XMLRPC + * 08/2000 -- danda -- support for two vocabularies: danda-rpc and xml-rpc + * 09/1999 -- danda -- Initial API, before I even knew of standard XMLRPC vocab. Response only. + * 07/2000 -- danda -- wrote new implementation to be compatible with xmlrpc standard and + * incorporated some ideas from ensor, most notably the separation of + * xml dom from xmlrpc api. + * 06/2000 -- danda -- played with expat-ensor from www.ensor.org. Cool, but some flaws. + * TODO + * PORTABILITY + * Coded on RedHat Linux 6.2. Builds on Solaris x86. Should build on just + * about anything with minor mods. + * NOTES + * Welcome to XMLRPC. For more info on the specification and history, see + * http://www.xmlrpc.org. + * + * This code aims to be a full-featured C implementation of XMLRPC. It does not + * have any networking code. Rather, it is intended to be plugged into apps + * or libraries with existing networking facilities, eg PHP, apache, perl, mozilla, + * home-brew application servers, etc. + * + * Usage Paradigm: + * The user of this library will typically be implementing either an XMLRPC server, + * an XMLRPC client, or both. The client will use the library to build an in-memory + * representation of a request, and then serialize (encode) that request into XML. The + * client will then send the XML to the server via external mechanism. The server will + * de-serialize the XML back into an binary representation, call the appropriate registered + * method -- thereby generating a response. The response will be serialized into XML and + * sent back to the client. The client will de-serialize it into memory, and can + * iterate through the results via API. + * + * Both the request and the response may consist of arbitrarily long, arbitrarily nested + * values. The values may be one of several types, as defined by XMLRPC_VALUE_TYPE. + * + * Features and Architecture: + * - The XML parsing (xml_element.c) is completely independent of the XMLRPC api. In fact, + * it can be used as a standalone dom implementation. + * - Because of this, the same XMLRPC data can be serialized into multiple xml vocabularies. + * It is simply a matter of writing a transport. So far, two transports have been defined. + * The default xmlrpc vocab (xml_to_xmlrpc.c), and simple-rpc (xml_to_dandarpc.c) which is + * proprietary, but imho more readable, and nice for proprietary legacy reasons. + * - Various output options, including: xml escaping via CDATA or entity, case folding, + * vocab version, and character encoding. + * - One to One mapping between C structures and actual values, unlike ensor which forces + * one to understand the arcana of the xmlrpc vocab. + * - support for mixed indexed/keyed vector types, making it more compatible with + * languages such as PHP. + * - quite speedy compared to implementations written in interpreted languages. Also, uses + * intelligent string handling, so not many strlen() calls, etc. + * - comprehensive API for manipulation of values + *******/ + + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include +#include +#include +#include +#include +#include + +#include "queue.h" +#include "xmlrpc.h" +#include "expat.h" +#include "base64.h" + +#include "xml_to_xmlrpc.h" +#include "xml_to_dandarpc.h" +#include "xml_to_soap.h" +#include "xml_element.h" +#include "xmlrpc_private.h" +#include "xmlrpc_introspection_private.h" +#include "system_methods_private.h" + + + +/*-********************* +* Begin Time Functions * +***********************/ + +static int date_from_ISO8601 (const char *text, time_t * value) { + struct tm tm; + int n; + int i; + char buf[18]; + + if (strchr (text, '-')) { + char *p = (char *) text, *p2 = buf; + while (p && *p) { + if (*p != '-') { + *p2 = *p; + p2++; + } + p++; + } + text = buf; + } + + + tm.tm_isdst = -1; + + if(strlen(text) < 17) { + return -1; + } + + n = 1000; + tm.tm_year = 0; + for(i = 0; i < 4; i++) { + tm.tm_year += (text[i]-'0')*n; + n /= 10; + } + n = 10; + tm.tm_mon = 0; + for(i = 0; i < 2; i++) { + tm.tm_mon += (text[i+4]-'0')*n; + n /= 10; + } + tm.tm_mon --; + + n = 10; + tm.tm_mday = 0; + for(i = 0; i < 2; i++) { + tm.tm_mday += (text[i+6]-'0')*n; + n /= 10; + } + + n = 10; + tm.tm_hour = 0; + for(i = 0; i < 2; i++) { + tm.tm_hour += (text[i+9]-'0')*n; + n /= 10; + } + + n = 10; + tm.tm_min = 0; + for(i = 0; i < 2; i++) { + tm.tm_min += (text[i+12]-'0')*n; + n /= 10; + } + + n = 10; + tm.tm_sec = 0; + for(i = 0; i < 2; i++) { + tm.tm_sec += (text[i+15]-'0')*n; + n /= 10; + } + + tm.tm_year -= 1900; + + *value = mktime(&tm); + + return 0; + +} + +static int date_to_ISO8601 (time_t value, char *buf, int length) { + struct tm *tm; + tm = localtime(&value); +#if 0 /* TODO: soap seems to favor this method. xmlrpc the latter. */ + return strftime (buf, length, "%Y-%m-%dT%H:%M:%SZ", tm); +#else + return strftime(buf, length, "%Y%m%dT%H:%M:%S", tm); +#endif +} + +/*-******************* +* End Time Functions * +*********************/ + + +/*-*************************** +* Begin XMLRPC_REQUEST funcs * +*****************************/ + +/****f* REQUEST/XMLRPC_RequestNew + * NAME + * XMLRPC_RequestNew + * SYNOPSIS + * XMLRPC_REQUEST XMLRPC_RequestNew() + * FUNCTION + * Creates a new XMLRPC_Request data struct + * INPUTS + * none + * SEE ALSO + * XMLRPC_RequestFree () + * SOURCE + */ +XMLRPC_REQUEST XMLRPC_RequestNew() { + XMLRPC_REQUEST xRequest = calloc(1, sizeof(STRUCT_XMLRPC_REQUEST)); + if(xRequest) { + simplestring_init(&xRequest->methodName); + } + return xRequest; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestFree + * NAME + * XMLRPC_RequestFree + * SYNOPSIS + * void XMLRPC_RequestFree(XMLRPC_REQUEST request, int bFreeIO) + * FUNCTION + * Free XMLRPC Request and all sub-values + * INPUTS + * request -- previously allocated request struct + * bFreeIO -- 1 = also free request value data, if any, 0 = ignore. + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_CleanupValue () + * SOURCE + */ +void XMLRPC_RequestFree(XMLRPC_REQUEST request, int bFreeIO) { + if(request) { + simplestring_free(&request->methodName); + + if(request->io && bFreeIO) { + XMLRPC_CleanupValue(request->io); + } + if(request->error) { + XMLRPC_CleanupValue(request->error); + } + my_free(request); + } +} + +/*******/ + +/* Set Method Name to call */ +/****f* REQUEST/XMLRPC_RequestSetMethodName + * NAME + * XMLRPC_RequestSetMethodName + * SYNOPSIS + * const char* XMLRPC_RequestSetMethodName(XMLRPC_REQUEST request, const char* methodName) + * FUNCTION + * Set name of method to call with this request. + * INPUTS + * request -- previously allocated request struct + * methodName -- name of method + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetMethodName () + * XMLRPC_RequestFree () + * SOURCE + */ +const char* XMLRPC_RequestSetMethodName(XMLRPC_REQUEST request, const char* methodName) { + if(request) { + simplestring_clear(&request->methodName); + simplestring_add(&request->methodName, methodName); + return request->methodName.str; + } + return NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetMethodName + * NAME + * XMLRPC_RequestGetMethodName + * SYNOPSIS + * const char* XMLRPC_RequestGetMethodName(XMLRPC_REQUEST request) + * FUNCTION + * Get name of method called by this request + * INPUTS + * request -- previously allocated request struct + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetMethodName () + * XMLRPC_RequestFree () + * SOURCE + */ +const char* XMLRPC_RequestGetMethodName(XMLRPC_REQUEST request) { + return request ? request->methodName.str : NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestSetRequestType + * NAME + * XMLRPC_RequestSetRequestType + * SYNOPSIS + * XMLRPC_REQUEST_TYPE XMLRPC_RequestSetRequestType(XMLRPC_REQUEST request, XMLRPC_REQUEST_TYPE type) + * FUNCTION + * A request struct may be allocated by a caller or by xmlrpc + * in response to a request. This allows setting the + * request type. + * INPUTS + * request -- previously allocated request struct + * type -- request type [xmlrpc_method_call | xmlrpc_method_response] + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetRequestType () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +XMLRPC_REQUEST_TYPE XMLRPC_RequestSetRequestType (XMLRPC_REQUEST request, + XMLRPC_REQUEST_TYPE type) { + if(request) { + request->request_type = type; + return request->request_type; + } + return xmlrpc_request_none; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetRequestType + * NAME + * XMLRPC_RequestGetRequestType + * SYNOPSIS + * XMLRPC_REQUEST_TYPE XMLRPC_RequestGetRequestType(XMLRPC_REQUEST request) + * FUNCTION + * A request struct may be allocated by a caller or by xmlrpc + * in response to a request. This allows setting the + * request type. + * INPUTS + * request -- previously allocated request struct + * RESULT + * type -- request type [xmlrpc_method_call | xmlrpc_method_response] + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetRequestType () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +XMLRPC_REQUEST_TYPE XMLRPC_RequestGetRequestType(XMLRPC_REQUEST request) { + return request ? request->request_type : xmlrpc_request_none; +} + +/*******/ + + +/****f* REQUEST/XMLRPC_RequestSetData + * NAME + * XMLRPC_RequestSetData + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestSetData(XMLRPC_REQUEST request, XMLRPC_VALUE data) + * FUNCTION + * Associates a block of xmlrpc data with the request. The + * data is *not* copied. A pointer is kept. The caller + * should be careful not to doubly free the data value, + * which may optionally be free'd by XMLRPC_RequestFree(). + * INPUTS + * request -- previously allocated request struct + * data -- previously allocated data struct + * RESULT + * XMLRPC_VALUE -- pointer to value stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetData () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestSetData(XMLRPC_REQUEST request, XMLRPC_VALUE data) { + if(request && data) { + if (request->io) { + XMLRPC_CleanupValue (request->io); + } + request->io = XMLRPC_CopyValue(data); + return request->io; + } + return NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetData + * NAME + * XMLRPC_RequestGetData + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestGetData(XMLRPC_REQUEST request) + * FUNCTION + * Returns data associated with request, if any. + * INPUTS + * request -- previously allocated request struct + * RESULT + * XMLRPC_VALUE -- pointer to value stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetData () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestGetData(XMLRPC_REQUEST request) { + return request ? request->io : NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestSetError + * NAME + * XMLRPC_RequestSetError + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestSetError(XMLRPC_REQUEST request, XMLRPC_VALUE error) + * FUNCTION + * Associates a block of xmlrpc data, representing an error + * condition, with the request. + * INPUTS + * request -- previously allocated request struct + * error -- previously allocated error code or struct + * RESULT + * XMLRPC_VALUE -- pointer to value stored, or NULL + * NOTES + * This is a private function for usage by internals only. + * SEE ALSO + * XMLRPC_RequestGetError () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestSetError (XMLRPC_REQUEST request, XMLRPC_VALUE error) { + if (request && error) { + if (request->error) { + XMLRPC_CleanupValue (request->error); + } + request->error = XMLRPC_CopyValue (error); + return request->error; + } + return NULL; +} + +/*******/ + +/****f* REQUEST/XMLRPC_RequestGetError + * NAME + * XMLRPC_RequestGetError + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_RequestGetError(XMLRPC_REQUEST request) + * FUNCTION + * Returns error data associated with request, if any. + * INPUTS + * request -- previously allocated request struct + * RESULT + * XMLRPC_VALUE -- pointer to error value stored, or NULL + * NOTES + * This is a private function for usage by internals only. + * SEE ALSO + * XMLRPC_RequestSetError () + * XMLRPC_RequestFree () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_RequestGetError (XMLRPC_REQUEST request) { + return request ? request->error : NULL; +} + +/*******/ + + +/****f* REQUEST/XMLRPC_RequestSetOutputOptions + * NAME + * XMLRPC_RequestSetOutputOptions + * SYNOPSIS + * XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output) + * FUNCTION + * Sets output options used for generating XML. The output struct + * is copied, and may be freed by the caller. + * INPUTS + * request -- previously allocated request struct + * output -- output options struct initialized by caller + * RESULT + * XMLRPC_REQUEST_OUTPUT_OPTIONS -- pointer to value stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestGetOutputOptions () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * SOURCE + */ +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output) { + if(request && output) { + memcpy (&request->output, output, + sizeof (STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS)); + return &request->output; + } + return NULL; +} + +/*******/ + + +/****f* REQUEST/XMLRPC_RequestGetOutputOptions + * NAME + * XMLRPC_RequestGetOutputOptions + * SYNOPSIS + * XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request) + * FUNCTION + * Gets a pointer to output options used for generating XML. + * INPUTS + * request -- previously allocated request struct + * RESULT + * XMLRPC_REQUEST_OUTPUT_OPTIONS -- pointer to options stored, or NULL + * SEE ALSO + * XMLRPC_RequestNew () + * XMLRPC_RequestSetOutputOptions () + * XMLRPC_RequestFree () + * XMLRPC_REQUEST + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * SOURCE + */ +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request) { + return request ? &request->output : NULL; +} + +/*******/ + +/*-************************* +* End XMLRPC_REQUEST funcs * +***************************/ + + +/*-*************************** +* Begin Serializiation funcs * +*****************************/ + +/****f* SERIALIZE/XMLRPC_VALUE_ToXML + * NAME + * XMLRPC_VALUE_ToXML + * SYNOPSIS + * char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val) + * FUNCTION + * encode XMLRPC_VALUE into XML buffer. Note that the generated + * buffer will not contain a methodCall. + * INPUTS + * val -- previously allocated XMLRPC_VALUE + * buf_len -- length of returned buffer, if not null + * RESULT + * char* -- newly allocated buffer containing XML. + * It is the caller's responsibility to free it. + * SEE ALSO + * XMLRPC_REQUEST_ToXML () + * XMLRPC_VALUE_FromXML () + * XMLRPC_Free () + * XMLRPC_VALUE + * SOURCE + */ +char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val, int* buf_len) { + xml_element *root_elem = XMLRPC_VALUE_to_xml_element(val); + char* pRet = NULL; + + if(root_elem) { + pRet = xml_elem_serialize_to_string(root_elem, NULL, buf_len); + xml_elem_free(root_elem); + } + return pRet; +} + +/*******/ + +/****f* SERIALIZE/XMLRPC_REQUEST_ToXML + * NAME + * XMLRPC_REQUEST_ToXML + * SYNOPSIS + * char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request) + * FUNCTION + * encode XMLRPC_REQUEST into XML buffer + * INPUTS + * request -- previously allocated XMLRPC_REQUEST + * buf_len -- size of returned buf, if not null + * RESULT + * char* -- newly allocated buffer containing XML. + * It is the caller's responsibility to free it. + * SEE ALSO + * XMLRPC_REQUEST_ToXML () + * XMLRPC_REQUEST_FromXML () + * XMLRPC_Free () + * XMLRPC_VALUE_ToXML () + * XMLRPC_REQUEST + * SOURCE + */ +char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request, int* buf_len) { + char* pRet = NULL; + if (request) { + xml_element *root_elem = NULL; + if (request->output.version == xmlrpc_version_simple) { + root_elem = DANDARPC_REQUEST_to_xml_element (request); + } + else if (request->output.version == xmlrpc_version_1_0 || + request->output.version == xmlrpc_version_none) { + root_elem = XMLRPC_REQUEST_to_xml_element (request); + } + else if (request->output.version == xmlrpc_version_soap_1_1) { + root_elem = SOAP_REQUEST_to_xml_element (request); + } + + if(root_elem) { + pRet = + xml_elem_serialize_to_string (root_elem, + &request->output.xml_elem_opts, + buf_len); + xml_elem_free(root_elem); + } + } + return pRet; +} + +/*******/ + +/****f* SERIALIZE/XMLRPC_VALUE_FromXML + * NAME + * XMLRPC_VALUE_FromXML + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VALUE_FromXML(const char* in_buf, int le + * FUNCTION + * Retrieve XMLRPC_VALUE from XML buffer. Note that this will + * ignore any methodCall. See XMLRPC_REQUEST_FromXML + * INPUTS + * in_buf -- character buffer containing XML + * len -- length of buffer + * RESULT + * XMLRPC_VALUE -- newly allocated data, or NULL if error. Should + * be free'd by caller. + * SEE ALSO + * XMLRPC_VALUE_ToXML () + * XMLRPC_REQUEST_FromXML () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VALUE_FromXML (const char *in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options) { + XMLRPC_VALUE xResponse = NULL; + XMLRPC_REQUEST req = XMLRPC_REQUEST_FromXML(in_buf, len, in_options); + + if(req) { + xResponse = req->io; + XMLRPC_RequestFree(req, 0); + } + return xResponse; +} + +/*******/ + +/* map parser errors to standard xml-rpc errors */ +static XMLRPC_VALUE map_expat_errors(XML_ELEM_ERROR error) { + XMLRPC_VALUE xReturn = NULL; + if(error) { + XMLRPC_ERROR_CODE code; + char buf[1024]; + snprintf(buf, sizeof(buf), + "error occurred at line %ld, column %ld, byte index %ld", + error->line, error->column, error->byte_index); + + /* expat specific errors */ + switch(error->parser_code) { + case XML_ERROR_UNKNOWN_ENCODING: + code = xmlrpc_error_parse_unknown_encoding; + break; + case XML_ERROR_INCORRECT_ENCODING: + code = xmlrpc_error_parse_bad_encoding; + break; + default: + code = xmlrpc_error_parse_xml_syntax; + break; + } + xReturn = XMLRPC_UtilityCreateFault(code, buf); + } + return xReturn; +} + +/****f* SERIALIZE/XMLRPC_REQUEST_FromXML + * NAME + * XMLRPC_REQUEST_FromXML + * SYNOPSIS + * XMLRPC_REQUEST XMLRPC_REQUEST_FromXML(const char* in_buf, int le + * FUNCTION + * Retrieve XMLRPC_REQUEST from XML buffer + * INPUTS + * in_buf -- character buffer containing XML + * len -- length of buffer + * RESULT + * XMLRPC_REQUEST -- newly allocated data, or NULL if error. Should + * be free'd by caller. + * SEE ALSO + * XMLRPC_REQUEST_ToXML () + * XMLRPC_VALUE_FromXML () + * XMLRPC_REQUEST + * SOURCE + */ +XMLRPC_REQUEST XMLRPC_REQUEST_FromXML (const char *in_buf, int len, + XMLRPC_REQUEST_INPUT_OPTIONS in_options) { + XMLRPC_REQUEST request = XMLRPC_RequestNew(); + STRUCT_XML_ELEM_ERROR error = {0}; + + if(request) { + xml_element *root_elem = + xml_elem_parse_buf (in_buf, len, + (in_options ? &in_options->xml_elem_opts : NULL), + &error); + + if(root_elem) { + if(!strcmp(root_elem->name, "simpleRPC")) { + request->output.version = xmlrpc_version_simple; + xml_element_to_DANDARPC_REQUEST(request, root_elem); + } + else if (!strcmp (root_elem->name, "SOAP-ENV:Envelope")) { + request->output.version = xmlrpc_version_soap_1_1; + xml_element_to_SOAP_REQUEST (request, root_elem); + } + else { + request->output.version = xmlrpc_version_1_0; + xml_element_to_XMLRPC_REQUEST(request, root_elem); + } + xml_elem_free(root_elem); + } + else { + if(error.parser_error) { + XMLRPC_RequestSetError (request, map_expat_errors (&error)); + } + } + } + + return request; +} + +/*******/ + +/*-************************ +* End Serialization Funcs * +**************************/ + + + +/****f* VALUE/XMLRPC_CreateValueEmpty + * NAME + * XMLRPC_CreateValueEmpty + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueEmpty () + * FUNCTION + * Create an XML value to be used/modified elsewhere. + * INPUTS + * RESULT + * XMLRPC_VALUE. The new value, or NULL on failure. + * SEE ALSO + * XMLRPC_CleanupValue () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueEmpty() { + XMLRPC_VALUE v = calloc(1, sizeof(STRUCT_XMLRPC_VALUE)); + if(v) { +#ifdef XMLRPC_DEBUG_REFCOUNT + printf ("calloc'd 0x%x\n", v); +#endif + v->type = xmlrpc_empty; + simplestring_init(&v->id); + simplestring_init(&v->str); + } + return v; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueID_Case + * NAME + * XMLRPC_SetValueID_Case + * SYNOPSIS + * const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case) + * FUNCTION + * Assign an ID (key) to an XMLRPC value. + * INPUTS + * value The xml value who's ID we will set. + * id The desired new id. + * len length of id string if known, or 0 if unknown. + * id_case one of XMLRPC_CASE + * RESULT + * const char* pointer to the newly allocated id string, or NULL + * SEE ALSO + * XMLRPC_SetValueID () + * XMLRPC_GetValueID () + * XMLRPC_VALUE + * XMLRPC_CASE + * SOURCE + */ +const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case) { + const char* pRetval = NULL; + if(value) { + if(id) { + simplestring_clear(&value->id); + (len > 0) ? simplestring_addn(&value->id, id, len) : + simplestring_add(&value->id, id); + + /* upper or lower case string in place if required. could be a seperate func. */ + if(id_case == xmlrpc_case_lower || id_case == xmlrpc_case_upper) { + int i; + for(i = 0; i < value->id.len; i++) { + value->id.str[i] = + (id_case == + xmlrpc_case_lower) ? tolower (value->id. + str[i]) : toupper (value-> + id. + str[i]); + } + } + + pRetval = value->id.str; + +#ifdef XMLRPC_DEBUG_REFCOUNT + printf("set value id: %s\n", pRetval); +#endif + } + } + + return pRetval; +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueString + * NAME + * XMLRPC_SetValueString + * SYNOPSIS + * const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* val, int len) + * FUNCTION + * Assign a string value to an XMLRPC_VALUE, and set it to type xmlrpc_string + * INPUTS + * value The xml value who's ID we will set. + * val The desired new string val. + * len length of val string if known, or 0 if unknown. + * RESULT + * const char* pointer to the newly allocated value string, or NULL + * SEE ALSO + * XMLRPC_GetValueString () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* val, int len) { + char *pRetval = NULL; + if(value && val) { + simplestring_clear(&value->str); + (len > 0) ? simplestring_addn(&value->str, val, len) : + simplestring_add(&value->str, val); + value->type = xmlrpc_string; + pRetval = (char *)value->str.str; + } + + return pRetval; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueInt + * NAME + * XMLRPC_SetValueInt + * SYNOPSIS + * void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val) + * FUNCTION + * Assign an int value to an XMLRPC_VALUE, and set it to type xmlrpc_int + * INPUTS + * value The xml value who's ID we will set. + * val The desired new integer value + * RESULT + * SEE ALSO + * XMLRPC_GetValueInt () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val) { + if(value) { + value->type = xmlrpc_int; + value->i = val; + } +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueBoolean + * NAME + * XMLRPC_SetValueBoolean + * SYNOPSIS + * void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val) + * FUNCTION + * Assign a boolean value to an XMLRPC_VALUE, and set it to type xmlrpc_boolean + * INPUTS + * value The xml value who's value we will set. + * val The desired new boolean value. [0 | 1] + * RESULT + * SEE ALSO + * XMLRPC_GetValueBoolean () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val) { + if(value) { + value->type = xmlrpc_boolean; + value->i = val ? 1 : 0; + } +} + +/*******/ + + +/****f* VECTOR/XMLRPC_SetIsVector + * NAME + * XMLRPC_SetIsVector + * SYNOPSIS + * int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type) + * FUNCTION + * Set the XMLRPC_VALUE to be a vector (list) type. The vector may be one of + * [xmlrpc_array | xmlrpc_struct | xmlrpc_mixed]. An array has only index values. + * A struct has key/val pairs. Mixed allows both index and key/val combinations. + * INPUTS + * value The xml value who's vector type we will set + * type New type of vector as enumerated by XMLRPC_VECTOR_TYPE + * RESULT + * int 1 if successful, 0 otherwise + * SEE ALSO + * XMLRPC_GetValueType () + * XMLRPC_GetVectorType () + * XMLRPC_VALUE + * XMLRPC_VECTOR_TYPE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type) { + int bSuccess = 0; + + if (value) { + /* we can change the type so long as nothing is currently stored. */ + if(value->type == xmlrpc_vector) { + if(value->v) { + if(!Q_Size(value->v->q)) { + value->v->type = type; + } + } + } + else { + value->v = calloc(1, sizeof(STRUCT_XMLRPC_VECTOR)); + if(value->v) { + value->v->q = (queue*)malloc(sizeof(queue)); + if(value->v->q) { + Q_Init(value->v->q); + value->v->type = type; + value->type = xmlrpc_vector; + bSuccess = 1; + } + } + } + } + + return bSuccess; +} + +/*******/ + +/****f* VECTOR/XMLRPC_CreateVector + * NAME + * XMLRPC_CreateVector + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateVector(const char* id, XMLRPC_VECTOR_TYPE type) + * FUNCTION + * Create a new vector and optionally set an id. + * INPUTS + * id The id of the vector, or NULL + * type New type of vector as enumerated by XMLRPC_VECTOR_TYPE + * RESULT + * XMLRPC_VALUE The new vector, or NULL on failure. + * SEE ALSO + * XMLRPC_CreateValueEmpty () + * XMLRPC_SetIsVector () + * XMLRPC_GetValueType () + * XMLRPC_GetVectorType () + * XMLRPC_VALUE + * XMLRPC_VECTOR_TYPE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateVector(const char* id, XMLRPC_VECTOR_TYPE type) { + XMLRPC_VALUE val = NULL; + + val = XMLRPC_CreateValueEmpty(); + if(val) { + if(XMLRPC_SetIsVector(val, type)) { + if(id) { + const char *pSVI = NULL; + + pSVI = XMLRPC_SetValueID(val, id, 0); + if(NULL == pSVI) { + val = NULL; + } + } + } + else { + val = NULL; + } + } + return val; +} + +/*******/ + + +/* Not yet implemented. + * + * This should use a hash to determine if a given target id has already + * been appended. + * + * Alternately, it could walk the entire vector, but that could be quite + * slow for very large lists. + */ +static int isDuplicateEntry(XMLRPC_VALUE target, XMLRPC_VALUE source) { + return 0; +} + +/****f* VECTOR/XMLRPC_AddValueToVector + * NAME + * XMLRPC_AddValueToVector + * SYNOPSIS + * int XMLRPC_AddValueToVector(XMLRPC_VALUE target, XMLRPC_VALUE source) + * FUNCTION + * Add (append) an existing XMLRPC_VALUE to a vector. + * INPUTS + * target The target vector + * source The source value to append + * RESULT + * int 1 if successful, else 0 + * SEE ALSO + * XMLRPC_AddValuesToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * NOTES + * The function will fail and return 0 if an attempt is made to add + * a value with an ID into a vector of type xmlrpc_vector_array. Such + * values can only be added to xmlrpc_vector_struct. + * SOURCE + */ +int XMLRPC_AddValueToVector(XMLRPC_VALUE target, XMLRPC_VALUE source) { + if(target && source) { + if(target->type == xmlrpc_vector && target->v && + target->v->q && target->v->type != xmlrpc_vector_none) { + + /* guard against putting value of unknown type into vector */ + switch(source->type) { + case xmlrpc_empty: + case xmlrpc_nil: + case xmlrpc_base64: + case xmlrpc_boolean: + case xmlrpc_datetime: + case xmlrpc_double: + case xmlrpc_int: + case xmlrpc_string: + case xmlrpc_vector: + /* Guard against putting a key/val pair into an array vector */ + if( !(source->id.len && target->v->type == xmlrpc_vector_array) ) { + if (isDuplicateEntry (target, source) + || Q_PushTail (target->v->q, XMLRPC_CopyValue (source))) { + return 1; + } + } + else { + fprintf (stderr, + "xmlrpc: attempted to add key/val pair to vector of type array\n"); + } + break; + default: + fprintf (stderr, + "xmlrpc: attempted to add value of unknown type to vector\n"); + break; + } + } + } + return 0; +} + +/*******/ + + +/****f* VECTOR/XMLRPC_AddValuesToVector + * NAME + * XMLRPC_AddValuesToVector + * SYNOPSIS + * XMLRPC_AddValuesToVector ( target, val1, val2, val3, val(n), 0 ) + * XMLRPC_AddValuesToVector( XMLRPC_VALUE, ... ) + * FUNCTION + * Add (append) a series of existing XMLRPC_VALUE to a vector. + * INPUTS + * target The target vector + * ... The source value(s) to append. The last item *must* be 0. + * RESULT + * int 1 if successful, else 0 + * SEE ALSO + * XMLRPC_AddValuesToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * NOTES + * This function may actually return failure after it has already modified + * or added items to target. You can not trust the state of target + * if this function returns failure. + * SOURCE + */ +int XMLRPC_AddValuesToVector(XMLRPC_VALUE target, ...) { + int iRetval = 0; + + if(target) { + if(target->type == xmlrpc_vector) { + XMLRPC_VALUE v = NULL; + va_list vl; + + va_start(vl, target); + + do { + v = va_arg(vl, XMLRPC_VALUE); + if(v) { + if(!XMLRPC_AddValueToVector(target, v)) { + iRetval = 0; + break; + } + } + } + while (v); + + va_end(vl); + + if(NULL == v) { + iRetval = 1; + } + } + } + return iRetval; +} + +/*******/ + + +/****f* VECTOR/XMLRPC_VectorGetValueWithID_Case + * NAME + * XMLRPC_VectorGetValueWithID_Case + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VectorGetValueWithID_Case(XMLRPC_VALUE vector, const char* id, XMLRPC_CASE_COMPARISON id_case) + * FUNCTION + * Get value from vector matching id (key) + * INPUTS + * vector The source vector + * id The key to find + * id_case Rule for how to match key + * RESULT + * int 1 if successful, else 0 + * SEE ALSO + * XMLRPC_SetValueID_Case () + * XMLRPC_VALUE + * XMLRPC_CASE_COMPARISON + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VectorGetValueWithID_Case (XMLRPC_VALUE vector, const char *id, + XMLRPC_CASE_COMPARISON id_case) { + if(vector && vector->v && vector->v->q) { + q_iter qi = Q_Iter_Head_F(vector->v->q); + + while(qi) { + XMLRPC_VALUE xIter = Q_Iter_Get_F(qi); + if(xIter && xIter->id.str) { + if(id_case == xmlrpc_case_sensitive) { + if(!strcmp(xIter->id.str, id)) { + return xIter; + } + } + else if(id_case == xmlrpc_case_insensitive) { + if(!strcasecmp(xIter->id.str, id)) { + return xIter; + } + } + } + qi = Q_Iter_Next_F(qi); + } + } + return NULL; +} + +/*******/ + + +int XMLRPC_VectorRemoveValue(XMLRPC_VALUE vector, XMLRPC_VALUE value) { + if(vector && vector->v && vector->v->q && value) { + q_iter qi = Q_Iter_Head_F(vector->v->q); + + while(qi) { + XMLRPC_VALUE xIter = Q_Iter_Get_F(qi); + if(xIter == value) { + XMLRPC_CleanupValue(xIter); + Q_Iter_Del(vector->v->q, qi); + return 1; + } + qi = Q_Iter_Next_F(qi); + } + } + return 0; +} + + +/****f* VALUE/XMLRPC_CreateValueString + * NAME + * XMLRPC_CreateValueString + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueString(const char* id, const char* val, int len) + * FUNCTION + * Create an XMLRPC_VALUE, and assign a string to it + * INPUTS + * id The id of the value, or NULL + * val The desired new string val. + * len length of val string if known, or 0 if unknown. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL + * SEE ALSO + * XMLRPC_GetValueString () + * XMLRPC_CreateValueEmpty () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueString(const char* id, const char* val, int len) { + XMLRPC_VALUE value = NULL; + if(val) { + value = XMLRPC_CreateValueEmpty(); + if(value) { + XMLRPC_SetValueString(value, val, len); + if(id) { + XMLRPC_SetValueID(value, id, 0); + } + } + } + return value; +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueInt + * NAME + * XMLRPC_CreateValueInt + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueInt(const char* id, int i) + * FUNCTION + * Create an XMLRPC_VALUE, and assign an int to it + * INPUTS + * id The id of the value, or NULL + * i The desired new int val. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL + * SEE ALSO + * XMLRPC_GetValueInt () + * XMLRPC_CreateValueEmpty () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueInt(const char* id, int i) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueInt(val, i); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueBoolean + * NAME + * XMLRPC_CreateValueBoolean + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueBoolean(const char* id, int i) + * FUNCTION + * Create an XMLRPC_VALUE, and assign an int to it + * INPUTS + * id The id of the value, or NULL + * i The desired new int val. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL + * SEE ALSO + * XMLRPC_GetValueBoolean () + * XMLRPC_CreateValueEmpty () + * XMLRPC_VALUE + * XMLRPC_VALUE_TYPE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueBoolean(const char* id, int i) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueBoolean(val, i); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + + +/****f* VALUE/XMLRPC_CleanupValue + * NAME + * XMLRPC_CleanupValue + * SYNOPSIS + * void XMLRPC_CleanupValue(XMLRPC_VALUE value) + * FUNCTION + * Frees all memory allocated for an XMLRPC_VALUE and any of its children (if a vector) + * INPUTS + * value The id of the value to be cleaned up. + * RESULT + * void + * NOTES + * Normally this function will be called for the topmost vector, thus free-ing + * all children. If a child of a vector is free'd first, results are undefined. + * Failure to call this function *will* cause memory leaks. + * + * Also, this function is implemented using reference counting. Thus a value + * may be added and freed from multiple parents so long as a reference is added + * first using XMLRPC_CopyValue() + * SEE ALSO + * XMLRPC_RequestFree () + * XMLRPC_CreateValueEmpty () + * XMLRPC_CopyValue() + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_CleanupValue(XMLRPC_VALUE value) { + if(value) { + if(value->iRefCount > 0) { + value->iRefCount --; + } + +#ifdef XMLRPC_DEBUG_REFCOUNT + if(value->id.str) { + printf ("decremented refcount of %s, now %i\n", value->id.str, + value->iRefCount); + } + else { + printf ("decremented refcount of 0x%x, now %i\n", value, + value->iRefCount); + } +#endif + + if(value->type == xmlrpc_vector) { + if(value->v) { + if(value->iRefCount == 0) { + XMLRPC_VALUE cur = (XMLRPC_VALUE)Q_Head(value->v->q); + while( cur ) { + XMLRPC_CleanupValue(cur); + + /* Make sure some idiot didn't include a vector as a child of itself + * and thus it would have already free'd these. + */ + if(value->v && value->v->q) { + cur = Q_Next(value->v->q); + } + else { + break; + } + } + + Q_Destroy(value->v->q); + my_free(value->v->q); + my_free(value->v); + } + } + } + + + if(value->iRefCount == 0) { + + /* guard against freeing invalid types */ + switch(value->type) { + case xmlrpc_empty: + case xmlrpc_base64: + case xmlrpc_boolean: + case xmlrpc_datetime: + case xmlrpc_double: + case xmlrpc_int: + case xmlrpc_string: + case xmlrpc_vector: +#ifdef XMLRPC_DEBUG_REFCOUNT + if(value->id.str) { + printf("free'd %s\n", value->id.str); + } + else { + printf("free'd 0x%x\n", value); + } +#endif + simplestring_free(&value->id); + simplestring_free(&value->str); + + memset(value, 0, sizeof(STRUCT_XMLRPC_VALUE)); + my_free(value); + break; + default: + fprintf (stderr, + "xmlrpc: attempted to free value of invalid type\n"); + break; + } + } + } +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueDateTime + * NAME + * XMLRPC_SetValueDateTime + * SYNOPSIS + * void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time) + * FUNCTION + * Assign time value to XMLRPC_VALUE + * INPUTS + * value The target XMLRPC_VALUE + * time The desired new unix time value (time_t) + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDateTime () + * XMLRPC_SetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time) { + if(value) { + char timeBuf[30]; + value->type = xmlrpc_datetime; + value->i = time; + + timeBuf[0] = 0; + + date_to_ISO8601(time, timeBuf, sizeof(timeBuf)); + + if(timeBuf[0]) { + simplestring_clear(&value->str); + simplestring_add(&value->str, timeBuf); + } + } +} + +/*******/ + +/****f* VALUE/XMLRPC_CopyValue + * NAME + * XMLRPC_CopyValue + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value) + * FUNCTION + * Make a copy (reference) of an XMLRPC_VALUE + * INPUTS + * value The target XMLRPC_VALUE + * RESULT + * XMLRPC_VALUE -- address of the copy + * SEE ALSO + * XMLRPC_CleanupValue () + * XMLRPC_DupValueNew () + * NOTES + * This function is implemented via reference counting, so the + * returned value is going to be the same as the passed in value. + * The value must be freed the same number of times it is copied + * or there will be a memory leak. + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value) { + if(value) { + value->iRefCount ++; +#ifdef XMLRPC_DEBUG_REFCOUNT + if(value->id.str) { + printf ("incremented refcount of %s, now %i\n", value->id.str, + value->iRefCount); + } + else { + printf ("incremented refcount of 0x%x, now %i\n", value, + value->iRefCount); + } +#endif + } + return value; +} + +/*******/ + + +/****f* VALUE/XMLRPC_DupValueNew + * NAME + * XMLRPC_DupValueNew + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_DupValueNew(XMLRPC_VALUE value) + * FUNCTION + * Make a duplicate (non reference) of an XMLRPC_VALUE with newly allocated mem. + * INPUTS + * value The source XMLRPC_VALUE to duplicate + * RESULT + * XMLRPC_VALUE -- address of the duplicate value + * SEE ALSO + * XMLRPC_CleanupValue () + * XMLRPC_CopyValue () + * NOTES + * Use this when function when you need to modify the contents of + * the copied value seperately from the original. + * + * this function is recursive, thus the value and all of its children + * (if any) will be duplicated. + * SOURCE + */ +XMLRPC_VALUE XMLRPC_DupValueNew (XMLRPC_VALUE xSource) { + XMLRPC_VALUE xReturn = NULL; + if (xSource) { + xReturn = XMLRPC_CreateValueEmpty (); + if (xSource->id.len) { + XMLRPC_SetValueID (xReturn, xSource->id.str, xSource->id.len); + } + + switch (xSource->type) { + case xmlrpc_int: + case xmlrpc_boolean: + XMLRPC_SetValueInt (xReturn, xSource->i); + break; + case xmlrpc_string: + case xmlrpc_base64: + XMLRPC_SetValueString (xReturn, xSource->str.str, xSource->str.len); + break; + case xmlrpc_datetime: + XMLRPC_SetValueDateTime (xReturn, xSource->i); + break; + case xmlrpc_double: + XMLRPC_SetValueDouble (xReturn, xSource->d); + break; + case xmlrpc_vector: + { + q_iter qi = Q_Iter_Head_F (xSource->v->q); + XMLRPC_SetIsVector (xReturn, xSource->v->type); + + while (qi) { + XMLRPC_VALUE xIter = Q_Iter_Get_F (qi); + XMLRPC_AddValueToVector (xReturn, XMLRPC_DupValueNew (xIter)); + qi = Q_Iter_Next_F (qi); + } + } + break; + default: + break; + } + } + return xReturn; +} + +/*******/ + + + +/****f* VALUE/XMLRPC_CreateValueDateTime + * NAME + * XMLRPC_CreateValueDateTime + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time) + * FUNCTION + * Create new datetime value from time_t + * INPUTS + * id id of the new value, or NULL + * time The desired unix time value (time_t) + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDateTime () + * XMLRPC_SetValueDateTime () + * XMLRPC_CreateValueDateTime_ISO8601 () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueDateTime(val, time); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueDateTime_ISO8601 + * NAME + * XMLRPC_SetValueDateTime_ISO8601 + * SYNOPSIS + * void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s) + * FUNCTION + * Set datetime value from IS08601 encoded string + * INPUTS + * value The target XMLRPC_VALUE + * s The desired new time value + * RESULT + * void + * BUGS + * This function currently attempts to convert the time string to a valid unix time + * value before passing it. Behavior when the string is invalid or out of range + * is not well defined, but will probably result in Jan 1, 1970 (0) being passed. + * SEE ALSO + * XMLRPC_GetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s) { + if(value) { + time_t time_val = 0; + if(s) { + date_from_ISO8601(s, &time_val); + XMLRPC_SetValueDateTime(value, time_val); + } + } +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueDateTime_ISO8601 + * NAME + * XMLRPC_CreateValueDateTime_ISO8601 + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s) + * FUNCTION + * Create datetime value from IS08601 encoded string + * INPUTS + * id The id of the new value, or NULL + * s The desired new time value + * RESULT + * newly allocated XMLRPC_VALUE, or NULL if no value created. + * BUGS + * See XMLRPC_SetValueDateTime_ISO8601 () + * SEE ALSO + * XMLRPC_GetValueDateTime_ISO8601 () + * XMLRPC_SetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueDateTime_ISO8601(val, s); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + + +/****f* VALUE/XMLRPC_SetValueBase64 + * NAME + * XMLRPC_SetValueBase64 + * SYNOPSIS + * void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len) + * FUNCTION + * Set base64 value. Base64 is useful for transferring binary data, such as an image. + * INPUTS + * value The target XMLRPC_VALUE + * s The desired new binary value + * len The length of s, or NULL. If buffer is not null terminated, len *must* be passed. + * RESULT + * void + * NOTES + * Data is set/stored/retrieved as passed in, but is base64 encoded for XML transfer, and + * decoded on the other side. This is transparent to the caller. + * SEE ALSO + * XMLRPC_GetValueBase64 () + * XMLRPC_CreateValueBase64 () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len) { + if(value && s) { + simplestring_clear(&value->str); + (len > 0) ? simplestring_addn(&value->str, s, len) : + simplestring_add(&value->str, s); + value->type = xmlrpc_base64; + } +} + +/*******/ + + +/****f* VALUE/XMLRPC_CreateValueBase64 + * NAME + * XMLRPC_CreateValueBase64 + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len) + * FUNCTION + * Create base64 value. Base64 is useful for transferring binary data, such as an image. + * INPUTS + * id id of the new value, or NULL + * s The desired new binary value + * len The length of s, or NULL. If buffer is not null terminated, len *must* be passed. + * RESULT + * newly allocated XMLRPC_VALUE, or NULL if error + * NOTES + * See XMLRPC_SetValueBase64 () + * SEE ALSO + * XMLRPC_GetValueBase64 () + * XMLRPC_SetValueBase64 () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueBase64(val, s, len); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetValueDouble + * NAME + * XMLRPC_SetValueDouble + * SYNOPSIS + * void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val) + * FUNCTION + * Set double (floating point) value. + * INPUTS + * value The target XMLRPC_VALUE + * val The desired new double value + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDouble () + * XMLRPC_CreateValueDouble () + * XMLRPC_VALUE + * SOURCE + */ +void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val) { + if(value) { + value->type = xmlrpc_double; + value->d = val; + } +} + +/*******/ + +/****f* VALUE/XMLRPC_CreateValueDouble + * NAME + * XMLRPC_CreateValueDouble + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double d) + * FUNCTION + * Create double (floating point) value. + * INPUTS + * id id of the newly created value, or NULL + * d The desired new double value + * RESULT + * void + * SEE ALSO + * XMLRPC_GetValueDouble () + * XMLRPC_CreateValueDouble () + * XMLRPC_VALUE + * SOURCE + */ +XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double d) { + XMLRPC_VALUE val = XMLRPC_CreateValueEmpty(); + if(val) { + XMLRPC_SetValueDouble(val, d); + if(id) { + XMLRPC_SetValueID(val, id, 0); + } + } + return val; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueString + * NAME + * XMLRPC_GetValueString + * SYNOPSIS + * const char* XMLRPC_GetValueString(XMLRPC_VALUE value) + * FUNCTION + * retrieve string value + * INPUTS + * value source XMLRPC_VALUE of type xmlrpc_string + * RESULT + * void + * SEE ALSO + * XMLRPC_SetValueString () + * XMLRPC_GetValueType () + * XMLRPC_VALUE + * SOURCE + */ +const char* XMLRPC_GetValueString(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_string) ? value->str.str : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueStringLen + * NAME + * XMLRPC_GetValueStringLen + * SYNOPSIS + * int XMLRPC_GetValueStringLen(XMLRPC_VALUE value) + * FUNCTION + * determine length of string value + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_string + * RESULT + * length of string, or 0 + * NOTES + * SEE ALSO + * XMLRPC_SetValueString () + * XMLRPC_GetValueString () + * SOURCE + */ +int XMLRPC_GetValueStringLen(XMLRPC_VALUE value) { + return ((value) ? value->str.len : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueInt + * NAME + * XMLRPC_GetValueInt + * SYNOPSIS + * int XMLRPC_GetValueInt(XMLRPC_VALUE value) + * FUNCTION + * retrieve integer value. + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_int + * RESULT + * integer value or 0 if value is not valid int + * NOTES + * use XMLRPC_GetValueType () to be sure if 0 is real return value or not + * SEE ALSO + * XMLRPC_SetValueInt () + * XMLRPC_CreateValueInt () + * SOURCE + */ +int XMLRPC_GetValueInt(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_int) ? value->i : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueBoolean + * NAME + * XMLRPC_GetValueBoolean + * SYNOPSIS + * int XMLRPC_GetValueBoolean(XMLRPC_VALUE value) + * FUNCTION + * retrieve boolean value. + * INPUTS + * XMLRPC_VALUE of type xmlrpc_boolean + * RESULT + * boolean value or 0 if value is not valid boolean + * NOTES + * use XMLRPC_GetValueType() to be sure if 0 is real value or not + * SEE ALSO + * XMLRPC_SetValueBoolean () + * XMLRPC_CreateValueBoolean () + * SOURCE + */ +int XMLRPC_GetValueBoolean(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_boolean) ? value->i : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueDouble + * NAME + * XMLRPC_GetValueDouble + * SYNOPSIS + * double XMLRPC_GetValueDouble(XMLRPC_VALUE value) + * FUNCTION + * retrieve double value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_double + * RESULT + * double value or 0 if value is not valid double. + * NOTES + * use XMLRPC_GetValueType() to be sure if 0 is real value or not + * SEE ALSO + * XMLRPC_SetValueDouble () + * XMLRPC_CreateValueDouble () + * SOURCE + */ +double XMLRPC_GetValueDouble(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_double) ? value->d : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueBase64 + * NAME + * XMLRPC_GetValueBase64 + * SYNOPSIS + * const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value) + * FUNCTION + * retrieve binary value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_base64 + * RESULT + * pointer to binary value or 0 if value is not valid. + * SEE ALSO + * XMLRPC_SetValueBase64 () + * XMLRPC_CreateValueBase64 () + * NOTES + * Call XMLRPC_GetValueStringLen() to retrieve real length of binary data. strlen() + * will not be accurate, as returned data may contain embedded nulls. + * SOURCE + */ +const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_base64) ? value->str.str : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueDateTime + * NAME + * XMLRPC_GetValueDateTime + * SYNOPSIS + * time_t XMLRPC_GetValueDateTime(XMLRPC_VALUE value) + * FUNCTION + * retrieve time_t value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_datetime + * RESULT + * time_t value or 0 if value is not valid datetime. + * NOTES + * use XMLRPC_GetValueType() to be sure if 0 is real value or not + * SEE ALSO + * XMLRPC_SetValueDateTime () + * XMLRPC_GetValueDateTime_ISO8601 () + * XMLRPC_CreateValueDateTime () + * SOURCE + */ +time_t XMLRPC_GetValueDateTime(XMLRPC_VALUE value) { + return (time_t)((value && value->type == xmlrpc_datetime) ? value->i : 0); +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueDateTime_IOS8601 + * NAME + * XMLRPC_GetValueDateTime_IOS8601 + * SYNOPSIS + * const char* XMLRPC_GetValueDateTime_IOS8601(XMLRPC_VALUE value) + * FUNCTION + * retrieve ISO8601 formatted time value + * INPUTS + * XMLRPC_VALUE of type xmlrpc_datetime + * RESULT + * const char* value or 0 if value is not valid datetime. + * SEE ALSO + * XMLRPC_SetValueDateTime_IOS8601 () + * XMLRPC_GetValueDateTime () + * XMLRPC_CreateValueDateTime_IOS8601 () + * SOURCE + */ +const char* XMLRPC_GetValueDateTime_ISO8601(XMLRPC_VALUE value) { + return ((value && value->type == xmlrpc_datetime) ? value->str.str : 0); +} + +/*******/ + +/* Get ID (key) of value or NULL */ +/****f* VALUE/XMLRPC_GetValueID + * NAME + * XMLRPC_GetValueID + * SYNOPSIS + * const char* XMLRPC_GetValueID(XMLRPC_VALUE value) + * FUNCTION + * retrieve id (key) of value + * INPUTS + * XMLRPC_VALUE of any type + * RESULT + * const char* pointer to id of value, or NULL + * NOTES + * SEE ALSO + * XMLRPC_SetValueID() + * XMLRPC_CreateValueEmpty() + * SOURCE + */ +const char* XMLRPC_GetValueID(XMLRPC_VALUE value) { + return (const char*)((value && value->id.len) ? value->id.str : 0); +} + +/*******/ + + +/****f* VECTOR/XMLRPC_VectorSize + * NAME + * XMLRPC_VectorSize + * SYNOPSIS + * int XMLRPC_VectorSize(XMLRPC_VALUE value) + * FUNCTION + * retrieve size of vector + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * count of items in vector + * NOTES + * This is a cheap operation even on large vectors. Vector size is + * maintained by queue during add/remove ops. + * SEE ALSO + * XMLRPC_AddValueToVector () + * SOURCE + */ +int XMLRPC_VectorSize(XMLRPC_VALUE value) { + int size = 0; + if(value && value->type == xmlrpc_vector && value->v) { + size = Q_Size(value->v->q); + } + return size; +} + +/*******/ + +/****f* VECTOR/XMLRPC_VectorRewind + * NAME + * XMLRPC_VectorRewind + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VectorRewind(XMLRPC_VALUE value) + * FUNCTION + * reset vector to first item + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * first XMLRPC_VALUE in list, or NULL if empty or error. + * NOTES + * Be careful to rewind any vector passed in to you if you expect to + * iterate through the entire list. + * SEE ALSO + * XMLRPC_VectorNext () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VectorRewind(XMLRPC_VALUE value) { + XMLRPC_VALUE xReturn = NULL; + if(value && value->type == xmlrpc_vector && value->v) { + xReturn = (XMLRPC_VALUE)Q_Head(value->v->q); + } + return xReturn; +} + +/*******/ + +/****f* VECTOR/XMLRPC_VectorNext + * NAME + * XMLRPC_VectorNext + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_VectorNext(XMLRPC_VALUE value) + * FUNCTION + * Iterate vector to next item in list. + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * Next XMLRPC_VALUE in vector, or NULL if at end. + * NOTES + * SEE ALSO + * XMLRPC_VectorRewind () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_VectorNext(XMLRPC_VALUE value) { + XMLRPC_VALUE xReturn = NULL; + if(value && value->type == xmlrpc_vector && value->v) { + xReturn = (XMLRPC_VALUE)Q_Next(value->v->q); + } + return xReturn; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueType + * NAME + * XMLRPC_GetValueType + * SYNOPSIS + * XMLRPC_VALUE_TYPE XMLRPC_GetValueType(XMLRPC_VALUE value) + * FUNCTION + * determine data type of the XMLRPC_VALUE + * INPUTS + * XMLRPC_VALUE target of query + * RESULT + * data type of value as enumerated by XMLRPC_VALUE_TYPE + * NOTES + * all values are of type xmlrpc_empty until set. + * Deprecated for public use. See XMLRPC_GetValueTypeEasy + * SEE ALSO + * XMLRPC_SetValue* + * XMLRPC_CreateValue* + * XMLRPC_Append* + * XMLRPC_GetValueTypeEasy () + * SOURCE + */ +XMLRPC_VALUE_TYPE XMLRPC_GetValueType(XMLRPC_VALUE value) { + return value ? value->type : xmlrpc_empty; +} + +/*******/ + +/* Vector type accessor */ +/****f* VALUE/XMLRPC_GetVectorType + * NAME + * XMLRPC_GetVectorType + * SYNOPSIS + * XMLRPC_VECTOR_TYPE XMLRPC_GetVectorType(XMLRPC_VALUE value) + * FUNCTION + * determine vector type of the XMLRPC_VALUE + * INPUTS + * XMLRPC_VALUE of type xmlrpc_vector + * RESULT + * vector type of value as enumerated by XMLRPC_VECTOR_TYPE. + * xmlrpc_none if not a value. + * NOTES + * xmlrpc_none is returned if value is not a vector + * Deprecated for public use. See XMLRPC_GetValueTypeEasy + * SEE ALSO + * XMLRPC_SetIsVector () + * XMLRPC_GetValueType () + * XMLRPC_GetValueTypeEasy () + * SOURCE + */ +XMLRPC_VECTOR_TYPE XMLRPC_GetVectorType(XMLRPC_VALUE value) { + return(value && value->v) ? value->v->type : xmlrpc_none; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetValueTypeEasy + * NAME + * XMLRPC_GetValueTypeEasy + * SYNOPSIS + * XMLRPC_VALUE_TYPE_EASY XMLRPC_GetValueTypeEasy(XMLRPC_VALUE value) + * FUNCTION + * determine data type of the XMLRPC_VALUE. includes vector types. + * INPUTS + * XMLRPC_VALUE target of query + * RESULT + * data type of value as enumerated by XMLRPC_VALUE_TYPE_EASY + * xmlrpc_type_none if not a value. + * NOTES + * all values are of type xmlrpc_type_empty until set. + * SEE ALSO + * XMLRPC_SetValue* + * XMLRPC_CreateValue* + * XMLRPC_Append* + * SOURCE + */ +XMLRPC_VALUE_TYPE_EASY XMLRPC_GetValueTypeEasy (XMLRPC_VALUE value) { + if (value) { + switch (value->type) { + case xmlrpc_vector: + switch (value->v->type) { + case xmlrpc_vector_none: + return xmlrpc_type_none; + case xmlrpc_vector_struct: + return xmlrpc_type_struct; + case xmlrpc_vector_mixed: + return xmlrpc_type_mixed; + case xmlrpc_vector_array: + return xmlrpc_type_array; + } + default: + /* evil cast, but we know they are the same */ + return(XMLRPC_VALUE_TYPE_EASY) value->type; + } + } + return xmlrpc_none; +} + +/*******/ + + + +/*-******************* +* Begin Server Funcs * +*********************/ + + +/****f* VALUE/XMLRPC_ServerCreate + * NAME + * XMLRPC_ServerCreate + * SYNOPSIS + * XMLRPC_SERVER XMLRPC_ServerCreate() + * FUNCTION + * Allocate/Init XMLRPC Server Resources. + * INPUTS + * none + * RESULT + * newly allocated XMLRPC_SERVER + * NOTES + * SEE ALSO + * XMLRPC_ServerDestroy () + * XMLRPC_GetGlobalServer () + * SOURCE + */ +XMLRPC_SERVER XMLRPC_ServerCreate() { + XMLRPC_SERVER server = calloc(1, sizeof(STRUCT_XMLRPC_SERVER)); + if(server) { + Q_Init(&server->methodlist); + Q_Init(&server->docslist); + + /* register system methods */ + xsm_register(server); + } + return server; +} + +/*******/ + +/* Return global server. Not locking! Not Thread Safe! */ +/****f* VALUE/XMLRPC_GetGlobalServer + * NAME + * XMLRPC_GetGlobalServer + * SYNOPSIS + * XMLRPC_SERVER XMLRPC_GetGlobalServer() + * FUNCTION + * Allocates a global (process-wide) server, or returns pointer if pre-existing. + * INPUTS + * none + * RESULT + * pointer to global server, or 0 if error. + * NOTES + * ***WARNING*** This function is not thread safe. It is included only for the very lazy. + * Multi-threaded programs that use this may experience problems. + * BUGS + * There is currently no way to cleanup the global server gracefully. + * SEE ALSO + * XMLRPC_ServerCreate () + * SOURCE + */ +XMLRPC_SERVER XMLRPC_GetGlobalServer() { + static XMLRPC_SERVER xsServer = 0; + if(!xsServer) { + xsServer = XMLRPC_ServerCreate(); + } + return xsServer; +} + +/*******/ + +/****f* VALUE/XMLRPC_ServerDestroy + * NAME + * XMLRPC_ServerDestroy + * SYNOPSIS + * void XMLRPC_ServerDestroy(XMLRPC_SERVER server) + * FUNCTION + * Free Server Resources + * INPUTS + * server The server to be free'd + * RESULT + * void + * NOTES + * This frees the server struct and any methods that have been added. + * SEE ALSO + * XMLRPC_ServerCreate () + * SOURCE + */ +void XMLRPC_ServerDestroy(XMLRPC_SERVER server) { + if(server) { + doc_method* dm = Q_Head(&server->docslist); + server_method* sm = Q_Head(&server->methodlist); + while( dm ) { + my_free(dm); + dm = Q_Next(&server->docslist); + } + while( sm ) { + if(sm->name) { + my_free(sm->name); + } + if(sm->desc) { + XMLRPC_CleanupValue(sm->desc); + } + my_free(sm); + sm = Q_Next(&server->methodlist); + } + if(server->xIntrospection) { + XMLRPC_CleanupValue(server->xIntrospection); + } + + Q_Destroy(&server->methodlist); + Q_Destroy(&server->docslist); + my_free(server); + } +} + +/*******/ + + +/****f* VALUE/XMLRPC_ServerRegisterMethod + * NAME + * XMLRPC_ServerRegisterMethod + * SYNOPSIS + * void XMLRPC_ServerRegisterMethod(XMLRPC_SERVER server, const char *name, XMLRPC_Callback cb) + * FUNCTION + * Register new XMLRPC method with server + * INPUTS + * server The XMLRPC_SERVER to register the method with + * name public name of the method + * cb C function that implements the method + * RESULT + * int - 1 if success, else 0 + * NOTES + * A C function must be registered for every "method" that the server recognizes. The + * method name is equivalent to method name in the + * XML syntax. + * SEE ALSO + * XMLRPC_ServerFindMethod () + * XMLRPC_ServerCallMethod () + * SOURCE + */ +int XMLRPC_ServerRegisterMethod(XMLRPC_SERVER server, const char *name, XMLRPC_Callback cb) { + if(server && name && cb) { + + server_method* sm = malloc(sizeof(server_method)); + + if(sm) { + sm->name = strdup(name); + sm->method = cb; + sm->desc = NULL; + + return Q_PushTail(&server->methodlist, sm); + } + } + return 0; +} + +/*******/ + +server_method* find_method(XMLRPC_SERVER server, const char* name) { + server_method* sm; + + q_iter qi = Q_Iter_Head_F(&server->methodlist); + + while( qi ) { + sm = Q_Iter_Get_F(qi); + if(sm && !strcmp(sm->name, name)) { + return sm; + } + qi = Q_Iter_Next_F(qi); + } + return NULL; +} + + +const char* type_to_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype) { + switch(type) { + case xmlrpc_none: + return "none"; + case xmlrpc_empty: + return "empty"; + case xmlrpc_nil: + return "nil"; + case xmlrpc_base64: + return "base64"; + case xmlrpc_boolean: + return "boolean"; + case xmlrpc_datetime: + return "datetime"; + case xmlrpc_double: + return "double"; + case xmlrpc_int: + return "int"; + case xmlrpc_string: + return "string"; + case xmlrpc_vector: + switch(vtype) { + case xmlrpc_vector_none: + return "none"; + case xmlrpc_vector_array: + return "array"; + case xmlrpc_vector_mixed: + return "mixed vector (struct)"; + case xmlrpc_vector_struct: + return "struct"; + } + } + return "unknown"; +} + +/****f* VALUE/XMLRPC_ServerFindMethod + * NAME + * XMLRPC_ServerFindMethod + * SYNOPSIS + * XMLRPC_Callback XMLRPC_ServerFindMethod(XMLRPC_SERVER server, const char* callName) + * FUNCTION + * retrieve C callback associated with a given method name. + * INPUTS + * server The XMLRPC_SERVER the method is registered with + * callName the method to find + * RESULT + * previously registered XMLRPC_Callback, or NULL + * NOTES + * Typically, this is used to determine if a requested method exists, without actually calling it. + * SEE ALSO + * XMLRPC_ServerCallMethod () + * XMLRPC_ServerRegisterMethod () + * SOURCE + */ +XMLRPC_Callback XMLRPC_ServerFindMethod(XMLRPC_SERVER server, const char* callName) { + if(server && callName) { + q_iter qi = Q_Iter_Head_F(&server->methodlist); + while( qi ) { + server_method* sm = Q_Iter_Get_F(qi); + if(sm && !strcmp(sm->name, callName)) { + return sm->method; + } + qi = Q_Iter_Next_F(qi); + } + } + return NULL; +} + +/*******/ + + +/* Call method specified in request */ +/****f* VALUE/XMLRPC_ServerCallMethod + * NAME + * XMLRPC_ServerCallMethod + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_ServerCallMethod(XMLRPC_SERVER server, XMLRPC_REQUEST request, void* userData) + * FUNCTION + * + * INPUTS + * server The XMLRPC_SERVER the method is registered with + * request the request to handle + * userData any additional data to pass to the C callback, or NULL + * RESULT + * XMLRPC_VALUE allocated by the callback, or NULL + * NOTES + * It is typically the caller's responsibility to free the returned value. + * + * Often the caller will want to serialize the result as XML, via + * XMLRPC_VALUE_To_XML () or XMLRPC_REQUEST_To_XML () + * SEE ALSO + * XMLRPC_ServerFindMethod () + * XMLRPC_ServerRegisterMethod () + * XMLRPC_CleanupValue () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_ServerCallMethod(XMLRPC_SERVER server, XMLRPC_REQUEST request, void* userData) { + XMLRPC_VALUE xReturn = NULL; + + /* check for error set during request parsing / generation */ + if(request && request->error) { + xReturn = XMLRPC_CopyValue(request->error); + } + else if (server && request) { + XMLRPC_Callback cb = + XMLRPC_ServerFindMethod (server, request->methodName.str); + if(cb) { + xReturn = cb(server, request, userData); + } + else { + xReturn = + XMLRPC_UtilityCreateFault (xmlrpc_error_unknown_method, + request->methodName.str); + } + } + return xReturn; +} + +/*******/ + +/*-***************** +* End server funcs * +*******************/ + + +/*-*********************************** +* Begin XMLRPC General Options funcs * +*************************************/ + +/* For options used by XMLRPC_VALUE funcs that otherwise do not have + * parameters for options. Kind of gross. :( + */ +typedef struct _xmlrpc_options { + XMLRPC_CASE id_case; + XMLRPC_CASE_COMPARISON id_case_compare; +} +STRUCT_XMLRPC_OPTIONS, *XMLRPC_OPTIONS; + +static XMLRPC_OPTIONS XMLRPC_GetDefaultOptions() { + static STRUCT_XMLRPC_OPTIONS options = { + xmlrpc_case_exact, + xmlrpc_case_sensitive + }; + return &options; +} + +/****f* VALUE/XMLRPC_GetDefaultIdCase + * NAME + * XMLRPC_GetDefaultIdCase + * SYNOPSIS + * XMLRPC_CASE XMLRPC_GetDefaultIdCase() + * FUNCTION + * Gets default case options used by XMLRPC_VALUE funcs + * INPUTS + * none + * RESULT + * XMLRPC_CASE + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_SetDefaultIdCase () + * SOURCE + */ +XMLRPC_CASE XMLRPC_GetDefaultIdCase() { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + return options->id_case; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetDefaultIdCase + * NAME + * XMLRPC_SetDefaultIdCase + * SYNOPSIS + * XMLRPC_CASE XMLRPC_SetDefaultIdCase(XMLRPC_CASE id_case) + * FUNCTION + * Sets default case options used by XMLRPC_VALUE funcs + * INPUTS + * id_case case options as enumerated by XMLRPC_CASE + * RESULT + * XMLRPC_CASE -- newly set option + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_GetDefaultIdCase () + * SOURCE + */ +XMLRPC_CASE XMLRPC_SetDefaultIdCase(XMLRPC_CASE id_case) { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + options->id_case = id_case; + return options->id_case; +} + +/*******/ + +/****f* VALUE/XMLRPC_GetDefaultIdCaseComparison + * NAME + * XMLRPC_GetDefaultIdCaseComparison + * SYNOPSIS + * XMLRPC_CASE XMLRPC_GetDefaultIdCaseComparison( ) + * FUNCTION + * Gets default case comparison options used by XMLRPC_VALUE funcs + * INPUTS + * none + * RESULT + * XMLRPC_CASE_COMPARISON default + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_SetDefaultIdCaseComparison () + * SOURCE + */ +XMLRPC_CASE_COMPARISON XMLRPC_GetDefaultIdCaseComparison() { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + return options->id_case_compare; +} + +/*******/ + +/****f* VALUE/XMLRPC_SetDefaultIdCaseComparison + * NAME + * XMLRPC_SetDefaultIdCaseComparison + * SYNOPSIS + * XMLRPC_CASE XMLRPC_SetDefaultIdCaseComparison( XMLRPC_CASE_COMPARISON id_case_compare ) + * FUNCTION + * Gets default case comparison options used by XMLRPC_VALUE funcs + * INPUTS + * id_case_compare case comparison rule to set as default + * RESULT + * XMLRPC_CASE_COMPARISON newly set default + * BUGS + * Nasty and gross. Should be server specific, but that requires changing all + * the XMLRPC_VALUE api's. + * SEE ALSO + * XMLRPC_GetDefaultIdCaseComparison () + * SOURCE + */ +XMLRPC_CASE_COMPARISON XMLRPC_SetDefaultIdCaseComparison(XMLRPC_CASE_COMPARISON id_case_compare) { + XMLRPC_OPTIONS options = XMLRPC_GetDefaultOptions(); + options->id_case_compare = id_case_compare; + return options->id_case_compare; +} + +/*******/ + +/*-********************************* +* End XMLRPC General Options funcs * +***********************************/ + + +/*-****************** +* Fault API funcs * +********************/ + +/****f* UTILITY/XMLRPC_UtilityCreateFault + * NAME + * XMLRPC_UtilityCreateFault + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_UtilityCreateFault( int fault_code, const char* fault_string ) + * FUNCTION + * generates a struct containing a string member with id "faultString" and an int member + * with id "faultCode". When using the xmlrpc xml serialization, these will be translated + * to ... format. + * INPUTS + * fault_code application specific error code. can be 0. + * fault_string application specific error string. cannot be null. + * RESULT + * XMLRPC_VALUE a newly created struct vector representing the error, or null on error. + * NOTES + * This is a utility function. xmlrpc "faults" are not directly represented in this xmlrpc + * API or data structures. It is the author's view, that this API is intended for simple + * data types, and a "fault" is a complex data type consisting of multiple simple data + * types. This function is provided for convenience only, the same result could be + * achieved directly by the application. + * + * This function now supports some "standardized" fault codes, as specified at. + * http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php. + * If one of these fault codes is received, the description string will automatically + * be prefixed with a standard error string and 2 newlines. + * + * The actual transformation between this complex type and the xml "" element takes + * place in the xmlrpc to xml serialization layer. This step is not performed when using the + * simplerpc serialization, meaning that there will be no "" element in that + * serialization. There will simply be a standard struct with 2 child elements. + * imho, the "" element is unnecessary and/or out of place as part of the standard API. + * + * SOURCE + */ +XMLRPC_VALUE XMLRPC_UtilityCreateFault(int fault_code, const char* fault_string) { + XMLRPC_VALUE xOutput = NULL; + + char* string = NULL; + simplestring description; + simplestring_init(&description); + + switch (fault_code) { + case xmlrpc_error_parse_xml_syntax: + string = xmlrpc_error_parse_xml_syntax_str; + break; + case xmlrpc_error_parse_unknown_encoding: + string = xmlrpc_error_parse_unknown_encoding_str; + break; + case xmlrpc_error_parse_bad_encoding: + string = xmlrpc_error_parse_bad_encoding_str; + break; + case xmlrpc_error_invalid_xmlrpc: + string = xmlrpc_error_invalid_xmlrpc_str; + break; + case xmlrpc_error_unknown_method: + string = xmlrpc_error_unknown_method_str; + break; + case xmlrpc_error_invalid_params: + string = xmlrpc_error_invalid_params_str; + break; + case xmlrpc_error_internal_server: + string = xmlrpc_error_internal_server_str; + break; + case xmlrpc_error_application: + string = xmlrpc_error_application_str; + break; + case xmlrpc_error_system: + string = xmlrpc_error_system_str; + break; + case xmlrpc_error_transport: + string = xmlrpc_error_transport_str; + break; + } + + simplestring_add(&description, string); + + if(string && fault_string) { + simplestring_add(&description, "\n\n"); + } + simplestring_add(&description, fault_string); + + + if(description.len) { + xOutput = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + + XMLRPC_VectorAppendString (xOutput, "faultString", description.str, + description.len); + XMLRPC_VectorAppendInt(xOutput, "faultCode", fault_code); + } + + simplestring_free(&description); + + return xOutput; +} + +/*******/ + + +/****f* FAULT/XMLRPC_ValueIsFault + * NAME + * XMLRPC_ValueIsFault + * SYNOPSIS + * int XMLRPC_ValueIsFault (XMLRPC_VALUE value) + * FUNCTION + * Determines if a value encapsulates a fault "object" + * INPUTS + * value any XMLRPC_VALUE + * RESULT + * 1 if it is a fault, else 0 + * SEE ALSO + * XMLRPC_ResponseIsFault () + * SOURCE + */ +int XMLRPC_ValueIsFault (XMLRPC_VALUE value) { + if( XMLRPC_VectorGetValueWithID(value, "faultCode") && + XMLRPC_VectorGetValueWithID(value, "faultString") ) { + return 1; + } + return 0; +} +/*******/ + + +/****f* FAULT/XMLRPC_ResponseIsFault + * NAME + * XMLRPC_ResponseIsFault + * SYNOPSIS + * int XMLRPC_ResponseIsFault (XMLRPC_REQUEST response) + * FUNCTION + * Determines if a response contains an encapsulated fault "object" + * INPUTS + * value any XMLRPC_REQUEST. typically of type xmlrpc_request_response + * RESULT + * 1 if it contains a fault, else 0 + * SEE ALSO + * XMLRPC_ValueIsFault () + * SOURCE + */ +int XMLRPC_ResponseIsFault(XMLRPC_REQUEST response) { + return XMLRPC_ValueIsFault( XMLRPC_RequestGetData(response) ); +} + +/*******/ + +/****f* FAULT/XMLRPC_GetValueFaultCode + * NAME + * XMLRPC_GetValueFaultCode + * SYNOPSIS + * int XMLRPC_GetValueFaultCode (XMLRPC_VALUE value) + * FUNCTION + * returns fault code from a struct, if any + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_vector_struct. + * RESULT + * fault code, else 0. + * BUGS + * impossible to distinguish faultCode == 0 from faultCode not present. + * SEE ALSO + * XMLRPC_GetResponseFaultCode () + * SOURCE + */ +int XMLRPC_GetValueFaultCode (XMLRPC_VALUE value) { + return XMLRPC_VectorGetIntWithID(value, "faultCode"); +} + +/*******/ + +/****f* FAULT/XMLRPC_GetResponseFaultCode + * NAME + * XMLRPC_GetResponseFaultCode + * SYNOPSIS + * int XMLRPC_GetResponseFaultCode(XMLRPC_REQUEST response) + * FUNCTION + * returns fault code from a response, if any + * INPUTS + * response XMLRPC_REQUEST. typically of type xmlrpc_request_response. + * RESULT + * fault code, else 0. + * BUGS + * impossible to distinguish faultCode == 0 from faultCode not present. + * SEE ALSO + * XMLRPC_GetValueFaultCode () + * SOURCE + */ +int XMLRPC_GetResponseFaultCode(XMLRPC_REQUEST response) { + return XMLRPC_GetValueFaultCode( XMLRPC_RequestGetData(response) ); +} + +/*******/ + + +/****f* FAULT/XMLRPC_GetValueFaultString + * NAME + * XMLRPC_GetValueFaultString + * SYNOPSIS + * const char* XMLRPC_GetValueFaultString (XMLRPC_VALUE value) + * FUNCTION + * returns fault string from a struct, if any + * INPUTS + * value XMLRPC_VALUE of type xmlrpc_vector_struct. + * RESULT + * fault string, else 0. + * SEE ALSO + * XMLRPC_GetResponseFaultString () + * SOURCE + */ +const char* XMLRPC_GetValueFaultString (XMLRPC_VALUE value) { + return XMLRPC_VectorGetStringWithID(value, "faultString"); +} + +/*******/ + +/****f* FAULT/XMLRPC_GetResponseFaultString + * NAME + * XMLRPC_GetResponseFaultString + * SYNOPSIS + * const char* XMLRPC_GetResponseFaultString (XMLRPC_REQUEST response) + * FUNCTION + * returns fault string from a response, if any + * INPUTS + * response XMLRPC_REQUEST. typically of type xmlrpc_request_response. + * RESULT + * fault string, else 0. + * SEE ALSO + * XMLRPC_GetValueFaultString () + * SOURCE + */ +const char* XMLRPC_GetResponseFaultString (XMLRPC_REQUEST response) { + return XMLRPC_GetValueFaultString( XMLRPC_RequestGetData(response) ); +} + +/*******/ + + +/*-****************** +* Utility API funcs * +********************/ + + +/****f* UTILITY/XMLRPC_Free + * NAME + * XMLRPC_Free + * SYNOPSIS + * void XMLRPC_Free(void* mem) + * FUNCTION + * frees a block of memory allocated by xmlrpc. + * INPUTS + * mem memory to free + * RESULT + * void + * NOTES + * Useful for OS's where memory must be free'd + * in the same library in which it is allocated. + * SOURCE + */ +void XMLRPC_Free(void* mem) { + my_free(mem); +} + +/*******/ + + +/****f* UTILITY/XMLRPC_GetVersionString + * NAME + * XMLRPC_GetVersionString + * SYNOPSIS + * const char* XMLRPC_GetVersionString() + * FUNCTION + * returns library version string + * INPUTS + * + * RESULT + * const char* + * NOTES + * SOURCE + */ +const char* XMLRPC_GetVersionString() { + return XMLRPC_VERSION_STR; +} + +/*******/ + + +/*-********************** +* End Utility API funcs * +************************/ diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc.h b/trunk/php/xmlrpc/libxmlrpc/xmlrpc.h new file mode 100644 index 0000000..eead11c --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc.h @@ -0,0 +1,455 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +#ifndef XMLRPC_ALREADY_INCLUDED +#define XMLRPC_ALREADY_INCLUDED 1 + +/* includes */ +#include "xml_element.h" +#include /* for time_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* allow version to be specified via compile line define */ +#ifndef XMLRPC_LIB_VERSION + #define XMLRPC_LIB_VERSION "0.51" +#endif + +/* this number, representing the date, must be increased each time the API changes */ +#define XMLRPC_API_NO 20020623 + +/* this string should be changed with each packaged release */ +#define XMLRPC_VERSION_STR "xmlrpc-epi v. " XMLRPC_LIB_VERSION + +/* where to find more info. shouldn't need to change much */ +#define XMLRPC_HOME_PAGE_STR "http://xmlprc-epi.sourceforge.net/" + + +/****d* VALUE/XMLRPC_VALUE_TYPE + * NAME + * XMLRPC_VALUE_TYPE + * NOTES + * Defines data types for XMLRPC_VALUE + * Deprecated for public use. See XMLRPC_VALUE_TYPE_EASY + * SEE ALSO + * XMLRPC_VECTOR_TYPE + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +typedef enum _XMLRPC_VALUE_TYPE { + xmlrpc_none, /* not a value */ + xmlrpc_empty, /* empty value */ + xmlrpc_nil, /* null value, eg NULL */ + xmlrpc_base64, /* base64 value, eg binary data */ + xmlrpc_boolean, /* boolean [0 | 1] */ + xmlrpc_datetime, /* datetime [ISO8601 | time_t] */ + xmlrpc_double, /* double / floating point */ + xmlrpc_int, /* integer */ + xmlrpc_string, /* string */ + xmlrpc_vector /* vector, aka list, array */ +} XMLRPC_VALUE_TYPE; +/*******/ + +/****d* VALUE/XMLRPC_VECTOR_TYPE + * NAME + * XMLRPC_VECTOR_TYPE + * NOTES + * Defines data types for XMLRPC_VECTOR. + * Deprecated for public use. See XMLRPC_VALUE_TYPE_EASY + * SEE ALSO + * XMLRPC_VALUE_TYPE + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +typedef enum _XMLRPC_VECTOR_TYPE { + xmlrpc_vector_none, /* not an array */ + xmlrpc_vector_array, /* no values may have key names */ + xmlrpc_vector_mixed, /* some values may have key names */ + xmlrpc_vector_struct /* all values must have key names */ +} XMLRPC_VECTOR_TYPE; +/*******/ + +/****d* VALUE/XMLRPC_VALUE_TYPE_EASY + * NAME + * XMLRPC_VALUE_TYPE_EASY + * NOTES + * Defines data types for XMLRPC_VALUE, including vector types. + * SEE ALSO + * XMLRPC_VECTOR_TYPE + * XMLRPC_REQUEST_TYPE + * SOURCE + */ +typedef enum _XMLRPC_VALUE_TYPE_EASY { + xmlrpc_type_none, /* not a value */ + xmlrpc_type_empty, /* empty value, eg NULL */ + xmlrpc_type_base64, /* base64 value, eg binary data */ + xmlrpc_type_boolean, /* boolean [0 | 1] */ + xmlrpc_type_datetime, /* datetime [ISO8601 | time_t] */ + xmlrpc_type_double, /* double / floating point */ + xmlrpc_type_int, /* integer */ + xmlrpc_type_string, /* string */ +/* -- IMPORTANT: identical to XMLRPC_VALUE_TYPE to this point. -- */ + xmlrpc_type_array, /* vector array */ + xmlrpc_type_mixed, /* vector mixed */ + xmlrpc_type_struct /* vector struct */ +} XMLRPC_VALUE_TYPE_EASY; +/*******/ + + +/****d* VALUE/XMLRPC_REQUEST_TYPE + * NAME + * XMLRPC_REQUEST_TYPE + * NOTES + * Defines data types for XMLRPC_REQUEST + * SEE ALSO + * XMLRPC_VALUE_TYPE + * XMLRPC_VECTOR_TYPE + * SOURCE + */ +typedef enum _xmlrpc_request_type { + xmlrpc_request_none, /* not a valid request */ + xmlrpc_request_call, /* calling/invoking a method */ + xmlrpc_request_response, /* responding to a method call */ +} XMLRPC_REQUEST_TYPE; +/*******/ + +/****d* VALUE/XMLRPC_ERROR_CODE + * NAME + * XMLRPC_ERROR_CODE + * NOTES + * All existing error codes + * SEE ALSO + * XMLRPC_REQUEST_ERROR + * SOURCE + */ +typedef enum _xmlrpc_error_code { + xmlrpc_error_none = 0, /* not an error */ + xmlrpc_error_parse_xml_syntax = -32700, + xmlrpc_error_parse_unknown_encoding = -32701, + xmlrpc_error_parse_bad_encoding = -32702, + xmlrpc_error_invalid_xmlrpc = -32600, + xmlrpc_error_unknown_method = -32601, + xmlrpc_error_invalid_params = -32602, + xmlrpc_error_internal_server = -32603, + xmlrpc_error_application = -32500, + xmlrpc_error_system = -32400, + xmlrpc_error_transport = -32300 +} XMLRPC_ERROR_CODE; +/******/ + +#define xmlrpc_error_parse_xml_syntax_str "parse error. not well formed." +#define xmlrpc_error_parse_unknown_encoding_str "parse error. unknown encoding" +#define xmlrpc_error_parse_bad_encoding_str "parse error. invalid character for encoding" +#define xmlrpc_error_invalid_xmlrpc_str "server error. xml-rpc not conforming to spec" +#define xmlrpc_error_unknown_method_str "server error. method not found." +#define xmlrpc_error_invalid_params_str "server error. invalid method parameters" +#define xmlrpc_error_internal_server_str "server error. internal xmlrpc library error" +#define xmlrpc_error_application_str "application error." +#define xmlrpc_error_system_str "system error." +#define xmlrpc_error_transport_str "transport error." + + + +/****d* VALUE/XMLRPC_VERSION + * NAME + * XMLRPC_VERSION + * NOTES + * Defines xml vocabulary used for generated xml + * SEE ALSO + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * XMLRPC_REQUEST_To_XML () + * SOURCE + */ +typedef enum _xmlrpc_version { + xmlrpc_version_none = 0, /* not a recognized vocabulary */ + xmlrpc_version_1_0 = 1, /* xmlrpc 1.0 standard vocab */ + xmlrpc_version_simple = 2, /* alt more readable vocab */ + xmlrpc_version_danda = 2, /* same as simple. legacy */ + xmlrpc_version_soap_1_1 = 3 /* SOAP. version 1.1 */ +} XMLRPC_VERSION; +/******/ + +/****s* VALUE/XMLRPC_REQUEST_OUTPUT_OPTIONS + * NAME + * XMLRPC_REQUEST_OUTPUT_OPTIONS + * NOTES + * Defines output options for generated xml + * SEE ALSO + * XMLRPC_VERSION + * XML_ELEM_OUTPUT_OPTIONS + * XMLRPC_REQUEST_To_XML () + * SOURCE + */ +typedef struct _xmlrpc_request_output_options { + STRUCT_XML_ELEM_OUTPUT_OPTIONS xml_elem_opts; /* xml_element specific output options */ + XMLRPC_VERSION version; /* xml vocabulary to use */ +} STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS, *XMLRPC_REQUEST_OUTPUT_OPTIONS; +/******/ + +/****s* VALUE/XMLRPC_REQUEST_INPUT_OPTIONS + * NAME + * XMLRPC_REQUEST_INPUT_OPTIONS + * NOTES + * Defines options for reading in xml data + * SEE ALSO + * XMLRPC_VERSION + * XML_ELEM_INPUT_OPTIONS + * XMLRPC_REQUEST_From_XML () + * SOURCE + */ +typedef struct _xmlrpc_request_input_options { + STRUCT_XML_ELEM_INPUT_OPTIONS xml_elem_opts; /* xml_element specific output options */ +} STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS, *XMLRPC_REQUEST_INPUT_OPTIONS; +/******/ + +/****s* VALUE/XMLRPC_ERROR + * NAME + * XMLRPC_ERROR + * NOTES + * For the reporting and handling of errors + * SOURCE + */ +typedef struct _xmlrpc_error { + XMLRPC_ERROR_CODE code; + STRUCT_XML_ELEM_ERROR xml_elem_error; /* xml_element errors (parser errors) */ +} STRUCT_XMLRPC_ERROR, *XMLRPC_ERROR; +/******/ + + +/****d* VALUE/XMLRPC_CASE_COMPARISON + * NAME + * XMLRPC_CASE_COMPARISON + * NOTES + * Defines case comparison options for XMLRPC_VALUE/VECTOR API's + * SEE ALSO + * XMLRPC_CASE + * XMLRPC_VALUE + * SOURCE + */ +typedef enum _xmlrpc_case_comparison { + xmlrpc_case_insensitive, /* use case-insensitive compare */ + xmlrpc_case_sensitive /* use case-sensitive compare */ +} XMLRPC_CASE_COMPARISON; +/******/ + +/****d* VALUE/XMLRPC_CASE + * NAME + * XMLRPC_CASE + * NOTES + * Defines case behavior when setting IDs in XMLRPC_VALUE API's + * SEE ALSO + * XMLRPC_CASE_COMPARISON + * XMLRPC_VALUE + * SOURCE + */ +typedef enum _xmlrpc_case { + xmlrpc_case_exact, /* leave case alone */ + xmlrpc_case_lower, /* lower-case id */ + xmlrpc_case_upper /* upper-case id */ +} XMLRPC_CASE; +/******/ + +/* if you don't like these defaults, you can set them with XMLRPC_SetDefaultIdCase*() */ +#define XMLRPC_DEFAULT_ID_CASE XMLRPC_GetDefaultIdCase() +#define XMLRPC_DEFAULT_ID_CASE_SENSITIVITY XMLRPC_GetDefaultIdCaseComparison() + +/* opaque (non-public) types. defined locally in xmlrpc.c */ +typedef struct _xmlrpc_request* XMLRPC_REQUEST; +typedef struct _xmlrpc_server* XMLRPC_SERVER; +typedef struct _xmlrpc_value* XMLRPC_VALUE; + +/****d* VALUE/XMLRPC_Callback + * NAME + * XMLRPC_Callback + * NOTES + * Function prototype for user defined method handlers (callbacks). + * SEE ALSO + * XMLRPC_ServerRegisterMethod () + * XMLRPC_ServerCallMethod () + * XMLRPC_REQUEST + * XMLRPC_VALUE + * SOURCE + */ +typedef XMLRPC_VALUE (*XMLRPC_Callback)(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +/******/ + +/* ID Case Defaults */ +XMLRPC_CASE XMLRPC_GetDefaultIdCase(void); +XMLRPC_CASE XMLRPC_SetDefaultIdCase(XMLRPC_CASE id_case); +XMLRPC_CASE_COMPARISON XMLRPC_GetDefaultIdCaseComparison(void); +XMLRPC_CASE_COMPARISON XMLRPC_SetDefaultIdCaseComparison(XMLRPC_CASE_COMPARISON id_case); + +/* Vector manipulation */ +int XMLRPC_VectorSize(XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_VectorRewind(XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_VectorNext(XMLRPC_VALUE value); +int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type); +int XMLRPC_AddValueToVector(XMLRPC_VALUE target, XMLRPC_VALUE source); +int XMLRPC_AddValuesToVector(XMLRPC_VALUE target, ...); +int XMLRPC_VectorRemoveValue(XMLRPC_VALUE vector, XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_VectorGetValueWithID_Case(XMLRPC_VALUE vector, const char* id, XMLRPC_CASE_COMPARISON id_case); + + +/* Create values */ +XMLRPC_VALUE XMLRPC_CreateValueBoolean(const char* id, int truth); +XMLRPC_VALUE XMLRPC_CreateValueBase64(const char* id, const char* s, int len); +XMLRPC_VALUE XMLRPC_CreateValueDateTime(const char* id, time_t time); +XMLRPC_VALUE XMLRPC_CreateValueDateTime_ISO8601(const char* id, const char *s); +XMLRPC_VALUE XMLRPC_CreateValueDouble(const char* id, double f); +XMLRPC_VALUE XMLRPC_CreateValueInt(const char* id, int i); +XMLRPC_VALUE XMLRPC_CreateValueString(const char* id, const char* s, int len); +XMLRPC_VALUE XMLRPC_CreateValueEmpty(void); +XMLRPC_VALUE XMLRPC_CreateVector(const char* id, XMLRPC_VECTOR_TYPE type); + +/* Cleanup values */ +void XMLRPC_CleanupValue(XMLRPC_VALUE value); + +/* Request error */ +XMLRPC_VALUE XMLRPC_RequestSetError (XMLRPC_REQUEST request, XMLRPC_VALUE error); +XMLRPC_VALUE XMLRPC_RequestGetError (XMLRPC_REQUEST request); + +/* Copy values */ +XMLRPC_VALUE XMLRPC_CopyValue(XMLRPC_VALUE value); +XMLRPC_VALUE XMLRPC_DupValueNew(XMLRPC_VALUE xSource); + +/* Set Values */ +void XMLRPC_SetValueDateTime(XMLRPC_VALUE value, time_t time); +void XMLRPC_SetValueDateTime_ISO8601(XMLRPC_VALUE value, const char* s); +void XMLRPC_SetValueDouble(XMLRPC_VALUE value, double val); +void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val); +void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val); +const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* s, int len); +void XMLRPC_SetValueBase64(XMLRPC_VALUE value, const char* s, int len); +const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case); +#define XMLRPC_SetValueID(value, id, len) XMLRPC_SetValueID_Case(value, id, len, XMLRPC_DEFAULT_ID_CASE) + +/* Get Values */ +const char* XMLRPC_GetValueString(XMLRPC_VALUE value); +int XMLRPC_GetValueStringLen(XMLRPC_VALUE value); +int XMLRPC_GetValueInt(XMLRPC_VALUE value); +int XMLRPC_GetValueBoolean(XMLRPC_VALUE value); +double XMLRPC_GetValueDouble(XMLRPC_VALUE value); +const char* XMLRPC_GetValueBase64(XMLRPC_VALUE value); +time_t XMLRPC_GetValueDateTime(XMLRPC_VALUE value); +const char* XMLRPC_GetValueDateTime_ISO8601(XMLRPC_VALUE value); +const char* XMLRPC_GetValueID(XMLRPC_VALUE value); + +/* Type introspection */ +XMLRPC_VALUE_TYPE XMLRPC_GetValueType(XMLRPC_VALUE v); +XMLRPC_VALUE_TYPE_EASY XMLRPC_GetValueTypeEasy(XMLRPC_VALUE v); +XMLRPC_VECTOR_TYPE XMLRPC_GetVectorType(XMLRPC_VALUE v); + +/* Parsing and Creating XML */ +XMLRPC_REQUEST XMLRPC_REQUEST_FromXML(const char* in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options); +XMLRPC_VALUE XMLRPC_VALUE_FromXML(const char* in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options); +char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request, int *buf_len); +char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val, int* buf_len); + +/* Request manipulation funcs */ +const char* XMLRPC_RequestSetMethodName(XMLRPC_REQUEST request, const char* methodName); +const char* XMLRPC_RequestGetMethodName(XMLRPC_REQUEST request); +XMLRPC_REQUEST XMLRPC_RequestNew(void); +void XMLRPC_RequestFree(XMLRPC_REQUEST request, int bFreeIO); +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output); +XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request); +XMLRPC_VALUE XMLRPC_RequestSetData(XMLRPC_REQUEST request, XMLRPC_VALUE data); +XMLRPC_VALUE XMLRPC_RequestGetData(XMLRPC_REQUEST request); +XMLRPC_REQUEST_TYPE XMLRPC_RequestSetRequestType(XMLRPC_REQUEST request, XMLRPC_REQUEST_TYPE type); +XMLRPC_REQUEST_TYPE XMLRPC_RequestGetRequestType(XMLRPC_REQUEST request); + +/* Server Creation/Destruction; Method Registration and Invocation */ +XMLRPC_SERVER XMLRPC_ServerCreate(void); +XMLRPC_SERVER XMLRPC_GetGlobalServer(void); /* better to use XMLRPC_ServerCreate if you can */ +void XMLRPC_ServerDestroy(XMLRPC_SERVER server); +int XMLRPC_ServerRegisterMethod(XMLRPC_SERVER server, const char *name, XMLRPC_Callback cb); +XMLRPC_Callback XMLRPC_ServerFindMethod(XMLRPC_SERVER server, const char* callName); +XMLRPC_VALUE XMLRPC_ServerCallMethod(XMLRPC_SERVER server, XMLRPC_REQUEST request, void* userData); + +#include "xmlrpc_introspection.h" + +/* Fault interrogation funcs */ +int XMLRPC_ValueIsFault (XMLRPC_VALUE value); +int XMLRPC_ResponseIsFault(XMLRPC_REQUEST response); +int XMLRPC_GetValueFaultCode (XMLRPC_VALUE value); +int XMLRPC_GetResponseFaultCode(XMLRPC_REQUEST response); +const char* XMLRPC_GetValueFaultString (XMLRPC_VALUE value); +const char* XMLRPC_GetResponseFaultString (XMLRPC_REQUEST response); + + +/* Public Utility funcs */ +XMLRPC_VALUE XMLRPC_UtilityCreateFault(int fault_code, const char* fault_string); +void XMLRPC_Free(void* mem); +const char* XMLRPC_GetVersionString(void); + +/****d* VALUE/XMLRPC_MACROS + * NAME + * Some Helpful Macros + * NOTES + * Some macros for making life easier. Should be self-explanatory. + * SEE ALSO + * XMLRPC_AddValueToVector () + * XMLRPC_VectorGetValueWithID_Case () + * XMLRPC_VALUE + * SOURCE + */ + +/* Append values to vector */ +#define XMLRPC_VectorAppendString(vector, id, s, len) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueString(id, s, len)) +#define XMLRPC_VectorAppendBase64(vector, id, s, len) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueBase64(id, s, len)) +#define XMLRPC_VectorAppendDateTime(vector, id, time) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDateTime(id, time)) +#define XMLRPC_VectorAppendDateTime_ISO8601(vector, id, s) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDateTime_ISO8601(id, s)) +#define XMLRPC_VectorAppendDouble(vector, id, f) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueDouble(id, f)) +#define XMLRPC_VectorAppendInt(vector, id, i) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueInt(id, i)) +#define XMLRPC_VectorAppendBoolean(vector, id, i) XMLRPC_AddValueToVector(vector, XMLRPC_CreateValueBoolean(id, i)) + +/* Get named values from vector */ +#define XMLRPC_VectorGetValueWithID(vector, id) XMLRPC_VectorGetValueWithID_Case(vector, id, XMLRPC_DEFAULT_ID_CASE_SENSITIVITY) +#define XMLRPC_VectorGetStringWithID(vector, id) XMLRPC_GetValueString(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetBase64WithID(vector, id) XMLRPC_GetValueBase64(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetDateTimeWithID(vector, id) XMLRPC_GetValueDateTime(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetDoubleWithID(vector, id) XMLRPC_GetValueDouble(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetIntWithID(vector, id) XMLRPC_GetValueInt(XMLRPC_VectorGetValueWithID(vector, id)) +#define XMLRPC_VectorGetBooleanWithID(vector, id) XMLRPC_GetValueBoolean(XMLRPC_VectorGetValueWithID(vector, id)) + +/******/ + + +#ifdef __cplusplus +} +#endif + +#endif /* not XMLRPC_ALREADY_INCLUDED */ + + + diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc.m4 b/trunk/php/xmlrpc/libxmlrpc/xmlrpc.m4 new file mode 100644 index 0000000..87da92d --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc.m4 @@ -0,0 +1,12 @@ +AC_DEFUN([XMLRPC_CHECKS],[ + +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_LN_S]) +AC_REQUIRE([AC_PROG_RANLIB]) + +AC_DEFINE(UNDEF_THREADS_HACK,,[ ]) + +XMLRPC_HEADER_CHECKS +XMLRPC_TYPE_CHECKS +XMLRPC_FUNCTION_CHECKS +]) diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection.c b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection.c new file mode 100644 index 0000000..589ff8e --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection.c @@ -0,0 +1,604 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + + +/****h* ABOUT/xmlrpc_introspection + * AUTHOR + * Dan Libby, aka danda (dan@libby.com) + * HISTORY + * $Log: xmlrpc_introspection.c,v $ + * Revision 1.4 2003/12/16 21:00:21 sniper + * Fix some compile warnings (patch by Joe Orton) + * + * Revision 1.3 2002/07/05 04:43:53 danda + * merged in updates from SF project. bring php repository up to date with xmlrpc-epi version 0.51 + * + * Revision 1.9 2001/09/29 21:58:05 danda + * adding cvs log to history section + * + * 4/10/2001 -- danda -- initial introspection support + * TODO + * NOTES + *******/ + + +#ifdef _WIN32 +#include "xmlrpc_win32.h" +#endif +#include "queue.h" +#include "xmlrpc.h" +#include "xmlrpc_private.h" +#include "xmlrpc_introspection_private.h" +#include +#include +#include + + +/* forward declarations for static (non public, non api) funcs */ +static XMLRPC_VALUE xi_system_describe_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xi_system_list_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xi_system_method_signature_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); +static XMLRPC_VALUE xi_system_method_help_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData); + + +/*-********************************** +* Introspection Callbacks (methods) * +************************************/ + +/* iterates through a list of structs and finds the one with key "name" matching + * needle. slow, would benefit from a struct key hash. + */ +inline XMLRPC_VALUE find_named_value(XMLRPC_VALUE list, const char* needle) { + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(list); + while(xIter) { + const char* name = XMLRPC_VectorGetStringWithID(xIter, xi_token_name); + if(name && !strcmp(name, needle)) { + return xIter; + } + xIter = XMLRPC_VectorNext(list); + } + return NULL; +} + + +/* iterates through docs callbacks and calls any that have not yet been called */ +static void check_docs_loaded(XMLRPC_SERVER server, void* userData) { + if(server) { + q_iter qi = Q_Iter_Head_F(&server->docslist); + while( qi ) { + doc_method* dm = Q_Iter_Get_F(qi); + if(dm && !dm->b_called) { + dm->method(server, userData); + dm->b_called = 1; + } + qi = Q_Iter_Next_F(qi); + } + } +} + + +/* utility function for xi_system_describe_methods_cb */ +inline void describe_method(XMLRPC_SERVER server, XMLRPC_VALUE vector, const char* method) { + if(method) { + server_method* sm = find_method(server, method); + if(sm) { + XMLRPC_AddValueToVector(vector, sm->desc); + } + } +} + + + +/* system.describeMethods() callback */ +static XMLRPC_VALUE xi_system_describe_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xParams = XMLRPC_VectorRewind(XMLRPC_RequestGetData(input)); + XMLRPC_VALUE xResponse = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + XMLRPC_VALUE xMethodList = XMLRPC_CreateVector("methodList", xmlrpc_vector_array); + XMLRPC_VALUE xTypeList = NULL; + int bAll = 1; + + /* lazy loading of introspection data */ + check_docs_loaded(server, userData); + + xTypeList = XMLRPC_VectorGetValueWithID(server->xIntrospection, "typeList"); + + XMLRPC_AddValueToVector(xResponse, xTypeList); + XMLRPC_AddValueToVector(xResponse, xMethodList); + + /* check if we have any param */ + if(xParams) { + /* check if string or vector (1 or n) */ + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(xParams); + if(type == xmlrpc_string) { + /* just one. spit it out. */ + describe_method(server, xMethodList, XMLRPC_GetValueString(xParams)); + bAll = 0; + } + else if(type == xmlrpc_vector) { + /* multiple. spit all out */ + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(xParams); + while(xIter) { + describe_method(server, xMethodList, XMLRPC_GetValueString(xIter)); + xIter = XMLRPC_VectorNext(xParams); + } + bAll = 0; + } + } + + /* otherwise, default to sending all methods */ + if(bAll) { + q_iter qi = Q_Iter_Head_F(&server->methodlist); + while( qi ) { + server_method* sm = Q_Iter_Get_F(qi); + if(sm) { + XMLRPC_AddValueToVector(xMethodList, sm->desc); + } + qi = Q_Iter_Next_F(qi); + } + } + + return xResponse; +} + +/* this complies with system.listMethods as defined at http://xmlrpc.usefulinc.com/doc/reserved.html */ +static XMLRPC_VALUE xi_system_list_methods_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + XMLRPC_VALUE xResponse = XMLRPC_CreateVector(NULL, xmlrpc_vector_array); + + q_iter qi = Q_Iter_Head_F(&server->methodlist); + while( qi ) { + server_method* sm = Q_Iter_Get_F(qi); + if(sm) { + XMLRPC_VectorAppendString(xResponse, 0, sm->name, 0); + } + qi = Q_Iter_Next_F(qi); + } + return xResponse; +} + +/* this complies with system.methodSignature as defined at + * http://xmlrpc.usefulinc.com/doc/sysmethodsig.html + */ +static XMLRPC_VALUE xi_system_method_signature_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + const char* method = XMLRPC_GetValueString(XMLRPC_VectorRewind(XMLRPC_RequestGetData(input))); + XMLRPC_VALUE xResponse = NULL; + + /* lazy loading of introspection data */ + check_docs_loaded(server, userData); + + if(method) { + server_method* sm = find_method(server, method); + if(sm && sm->desc) { + XMLRPC_VALUE xTypesArray = XMLRPC_CreateVector(NULL, xmlrpc_vector_array); + XMLRPC_VALUE xIter, xParams, xSig, xSigIter; + const char* type; + + /* array of possible signatures. */ + xResponse = XMLRPC_CreateVector(NULL, xmlrpc_vector_array); + + /* find first signature */ + xSig = XMLRPC_VectorGetValueWithID(sm->desc, xi_token_signatures); + xSigIter = XMLRPC_VectorRewind( xSig ); + + /* iterate through sigs */ + while(xSigIter) { + /* first type is the return value */ + type = XMLRPC_VectorGetStringWithID(XMLRPC_VectorRewind( + XMLRPC_VectorGetValueWithID(xSigIter, xi_token_returns)), + xi_token_type); + XMLRPC_AddValueToVector(xTypesArray, + XMLRPC_CreateValueString(NULL, + type ? type : type_to_str(xmlrpc_none, 0), + 0)); + + /* the rest are parameters */ + xParams = XMLRPC_VectorGetValueWithID(xSigIter, xi_token_params); + xIter = XMLRPC_VectorRewind(xParams); + + /* iter through params, adding to types array */ + while(xIter) { + XMLRPC_AddValueToVector(xTypesArray, + XMLRPC_CreateValueString(NULL, + XMLRPC_VectorGetStringWithID(xIter, xi_token_type), + 0)); + xIter = XMLRPC_VectorNext(xParams); + } + + /* add types for this signature */ + XMLRPC_AddValueToVector(xResponse, xTypesArray); + + xSigIter = XMLRPC_VectorNext( xSig ); + } + } + } + + return xResponse; +} + +/* this complies with system.methodHelp as defined at + * http://xmlrpc.usefulinc.com/doc/sysmethhelp.html + */ +static XMLRPC_VALUE xi_system_method_help_cb(XMLRPC_SERVER server, XMLRPC_REQUEST input, void* userData) { + const char* method = XMLRPC_GetValueString(XMLRPC_VectorRewind(XMLRPC_RequestGetData(input))); + XMLRPC_VALUE xResponse = NULL; + + /* lazy loading of introspection data */ + check_docs_loaded(server, userData); + + if(method) { + server_method* sm = find_method(server, method); + if(sm && sm->desc) { + const char* help = XMLRPC_VectorGetStringWithID(sm->desc, xi_token_purpose); + + /* returns a documentation string, or empty string */ + xResponse = XMLRPC_CreateValueString(NULL, help ? help : xi_token_empty, 0); + } + } + + return xResponse; +} + +/*-************************************** +* End Introspection Callbacks (methods) * +****************************************/ + + +/*-************************ +* Introspection Utilities * +**************************/ + +/* performs registration of introspection methods */ +void xi_register_system_methods(XMLRPC_SERVER server) { + XMLRPC_ServerRegisterMethod(server, xi_token_system_list_methods, xi_system_list_methods_cb); + XMLRPC_ServerRegisterMethod(server, xi_token_system_method_help, xi_system_method_help_cb); + XMLRPC_ServerRegisterMethod(server, xi_token_system_method_signature, xi_system_method_signature_cb); + XMLRPC_ServerRegisterMethod(server, xi_token_system_describe_methods, xi_system_describe_methods_cb); +} + +/* describe a value (param, return, type) */ +static XMLRPC_VALUE describeValue_worker(const char* type, const char* id, const char* desc, int optional, const char* default_val, XMLRPC_VALUE sub_params) { + XMLRPC_VALUE xParam = NULL; + if(id || desc) { + xParam = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + XMLRPC_VectorAppendString(xParam, xi_token_name, id, 0); + XMLRPC_VectorAppendString(xParam, xi_token_type, type, 0); + XMLRPC_VectorAppendString(xParam, xi_token_description, desc, 0); + if(optional != 2) { + XMLRPC_VectorAppendInt(xParam, xi_token_optional, optional); + } + if(optional == 1 && default_val) { + XMLRPC_VectorAppendString(xParam, xi_token_default, default_val, 0); + } + XMLRPC_AddValueToVector(xParam, sub_params); + } + return xParam; +} + + +/* convert an xml tree conforming to spec to XMLRPC_VALUE + * suitable for use with XMLRPC_ServerAddIntrospectionData + */ +XMLRPC_VALUE xml_element_to_method_description(xml_element* el, XMLRPC_ERROR err) { + XMLRPC_VALUE xReturn = NULL; + + if(el->name) { + const char* name = NULL; + const char* type = NULL; + const char* basetype = NULL; + const char* desc = NULL; + const char* def = NULL; + int optional = 0; + xml_element_attr* attr_iter = Q_Head(&el->attrs); + + /* grab element attributes up front to save redundant while loops */ + while(attr_iter) { + if(!strcmp(attr_iter->key, "name")) { + name = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "type")) { + type = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "basetype")) { + basetype = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "desc")) { + desc = attr_iter->val; + } + else if(!strcmp(attr_iter->key, "optional")) { + if(attr_iter->val && !strcmp(attr_iter->val, "yes")) { + optional = 1; + } + } + else if(!strcmp(attr_iter->key, "default")) { + def = attr_iter->val; + } + attr_iter = Q_Next(&el->attrs); + } + + /* value and typeDescription behave about the same */ + if(!strcmp(el->name, "value") || !strcmp(el->name, "typeDescription")) { + XMLRPC_VALUE xSubList = NULL; + const char* ptype = !strcmp(el->name, "value") ? type : basetype; + if(ptype) { + if(Q_Size(&el->children) && + (!strcmp(ptype, "array") || !strcmp(ptype, "struct") || !strcmp(ptype, "mixed"))) { + xSubList = XMLRPC_CreateVector("member", xmlrpc_vector_array); + + if(xSubList) { + xml_element* elem_iter = Q_Head(&el->children); + while(elem_iter) { + XMLRPC_AddValueToVector(xSubList, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + } + xReturn = describeValue_worker(ptype, name, (desc ? desc : (xSubList ? NULL : el->text.str)), optional, def, xSubList); + } + } + + /* these three kids are about equivalent */ + else if(!strcmp(el->name, "params") || + !strcmp(el->name, "returns") || + !strcmp(el->name, "signature")) { + if(Q_Size(&el->children)) { + xml_element* elem_iter = Q_Head(&el->children); + xReturn = XMLRPC_CreateVector(!strcmp(el->name, "signature") ? NULL : el->name, xmlrpc_vector_struct); + + + while(elem_iter) { + XMLRPC_AddValueToVector(xReturn, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + } + + + else if(!strcmp(el->name, "methodDescription")) { + xml_element* elem_iter = Q_Head(&el->children); + xReturn = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + + XMLRPC_VectorAppendString(xReturn, xi_token_name, name, 0); + + while(elem_iter) { + XMLRPC_AddValueToVector(xReturn, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + + /* items are slightly special */ + else if(!strcmp(el->name, "item")) { + xReturn = XMLRPC_CreateValueString(name, el->text.str, el->text.len); + } + + /* sure. we'll let any ol element with children through */ + else if(Q_Size(&el->children)) { + xml_element* elem_iter = Q_Head(&el->children); + xReturn = XMLRPC_CreateVector(el->name, xmlrpc_vector_mixed); + + while(elem_iter) { + XMLRPC_AddValueToVector(xReturn, + xml_element_to_method_description(elem_iter, err)); + elem_iter = Q_Next(&el->children); + } + } + + /* or anything at all really, so long as its got some text. + * no reason being all snotty about a spec, right? + */ + else if(el->name && el->text.len) { + xReturn = XMLRPC_CreateValueString(el->name, el->text.str, el->text.len); + } + } + + return xReturn; +} + +/*-**************************** +* End Introspection Utilities * +******************************/ + + + +/*-****************** +* Introspection API * +********************/ + + +/****f* VALUE/XMLRPC_IntrospectionCreateDescription + * NAME + * XMLRPC_IntrospectionCreateDescription + * SYNOPSIS + * XMLRPC_VALUE XMLRPC_IntrospectionCreateDescription(const char* xml, XMLRPC_ERROR err) + * FUNCTION + * converts raw xml describing types and methods into an + * XMLRPC_VALUE suitable for use with XMLRPC_ServerAddIntrospectionData() + * INPUTS + * xml - xml data conforming to introspection spec at + * err - optional pointer to error struct. filled in if error occurs and not NULL. + * RESULT + * XMLRPC_VALUE - newly created value, or NULL if fatal error. + * BUGS + * Currently does little or no validation of xml. + * Only parse errors are currently reported in err, not structural errors. + * SEE ALSO + * XMLRPC_ServerAddIntrospectionData () + * SOURCE + */ +XMLRPC_VALUE XMLRPC_IntrospectionCreateDescription(const char* xml, XMLRPC_ERROR err) { + XMLRPC_VALUE xReturn = NULL; + xml_element* root = xml_elem_parse_buf(xml, 0, 0, err ? &err->xml_elem_error : NULL); + + if(root) { + xReturn = xml_element_to_method_description(root, err); + + xml_elem_free(root); + } + + return xReturn; + +} +/*******/ + + +/****f* SERVER/XMLRPC_ServerAddIntrospectionData + * NAME + * XMLRPC_ServerAddIntrospectionData + * SYNOPSIS + * int XMLRPC_ServerAddIntrospectionData(XMLRPC_SERVER server, XMLRPC_VALUE desc) + * FUNCTION + * updates server with additional introspection data + * INPUTS + * server - target server + * desc - introspection data, should be a struct generated by + * XMLRPC_IntrospectionCreateDescription () + * RESULT + * int - 1 if success, else 0 + * NOTES + * - function will fail if neither typeList nor methodList key is present in struct. + * - if method or type already exists, it will be replaced. + * - desc is never freed by the server. caller is responsible for cleanup. + * BUGS + * - horribly slow lookups. prime candidate for hash improvements. + * - uglier and more complex than I like to see for API functions. + * SEE ALSO + * XMLRPC_ServerAddIntrospectionData () + * XMLRPC_ServerRegisterIntrospectionCallback () + * XMLRPC_CleanupValue () + * SOURCE + */ +int XMLRPC_ServerAddIntrospectionData(XMLRPC_SERVER server, XMLRPC_VALUE desc) { + int bSuccess = 0; + if(server && desc) { + XMLRPC_VALUE xNewTypes = XMLRPC_VectorGetValueWithID(desc, "typeList"); + XMLRPC_VALUE xNewMethods = XMLRPC_VectorGetValueWithID(desc, "methodList"); + XMLRPC_VALUE xServerTypes = XMLRPC_VectorGetValueWithID(server->xIntrospection, "typeList"); + + if(xNewMethods) { + XMLRPC_VALUE xMethod = XMLRPC_VectorRewind(xNewMethods); + + while(xMethod) { + const char* name = XMLRPC_VectorGetStringWithID(xMethod, xi_token_name); + server_method* sm = find_method(server, name); + + if(sm) { + if(sm->desc) { + XMLRPC_CleanupValue(sm->desc); + } + sm->desc = XMLRPC_CopyValue(xMethod); + bSuccess = 1; + } + + xMethod = XMLRPC_VectorNext(xNewMethods); + } + } + if(xNewTypes) { + if(!xServerTypes) { + if(!server->xIntrospection) { + server->xIntrospection = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); + } + + XMLRPC_AddValueToVector(server->xIntrospection, xNewTypes); + bSuccess = 1; + } + else { + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(xNewTypes); + while(xIter) { + /* get rid of old values */ + XMLRPC_VALUE xPrev = find_named_value(xServerTypes, XMLRPC_VectorGetStringWithID(xIter, xi_token_name)); + if(xPrev) { + XMLRPC_VectorRemoveValue(xServerTypes, xPrev); + } + XMLRPC_AddValueToVector(xServerTypes, xIter); + bSuccess = 1; + xIter = XMLRPC_VectorNext(xNewTypes); + } + } + } + } + return bSuccess; +} +/*******/ + + +/****f* SERVER/XMLRPC_ServerRegisterIntrospectionCallback + * NAME + * XMLRPC_ServerRegisterIntrospectionCallback + * SYNOPSIS + * int XMLRPC_ServerRegisterIntrospectionCallback(XMLRPC_SERVER server, XMLRPC_IntrospectionCallback cb) + * FUNCTION + * registers a callback for lazy generation of introspection data + * INPUTS + * server - target server + * cb - callback that will generate introspection data + * RESULT + * int - 1 if success, else 0 + * NOTES + * parsing xml and generating introspection data is fairly expensive, thus a + * server may wish to wait until this data is actually requested before generating + * it. Any number of callbacks may be registered at any time. A given callback + * will only ever be called once, the first time an introspection request is + * processed after the time of callback registration. + * SEE ALSO + * XMLRPC_ServerAddIntrospectionData () + * XMLRPC_IntrospectionCreateDescription () + * SOURCE + */ +int XMLRPC_ServerRegisterIntrospectionCallback(XMLRPC_SERVER server, XMLRPC_IntrospectionCallback cb) { + int bSuccess = 0; + if(server && cb) { + + doc_method* dm = calloc(1, sizeof(doc_method)); + + if(dm) { + dm->method = cb; + dm->b_called = 0; + + if(Q_PushTail(&server->docslist, dm)) { + bSuccess = 1; + } + else { + my_free(dm); + } + } + } + return 0; +} +/*******/ + +/*-********************** +* End Introspection API * +************************/ + + + diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection.h b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection.h new file mode 100644 index 0000000..656e441 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection.h @@ -0,0 +1,101 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* IMPORTANT! + * + * only public (official API) things should be in this file. Anything else + * should go in _private.h, or in the appropriate .c file. + */ + + +#ifndef __XI_INTROSPECTION_H +/* + * Avoid include redundancy. + */ +#define __XI_INTROSPECTION_H + +/*---------------------------------------------------------------------------- + * xmlrpc_introspection.h + * + * Purpose: + * define public introspection API + * Comments: + */ + +/*---------------------------------------------------------------------------- + * Constants + */ + #define xi_token_params "params" + #define xi_token_returns "returns" + #define xi_token_related "related" + #define xi_token_sub "sub" + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ + + /****d* VALUE/XMLRPC_IntrospectionCallback + * NAME + * XMLRPC_IntrospectionCallback + * NOTES + * Function prototype for lazy documentation generation (not generated until requested). + * SOURCE + */ +typedef void (*XMLRPC_IntrospectionCallback)(XMLRPC_SERVER server, void* userData); +/******/ + + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +XMLRPC_VALUE XMLRPC_IntrospectionCreateDescription(const char* xml, XMLRPC_ERROR error); +int XMLRPC_ServerAddIntrospectionData(XMLRPC_SERVER server, XMLRPC_VALUE desc); +int XMLRPC_ServerRegisterIntrospectionCallback(XMLRPC_SERVER server, XMLRPC_IntrospectionCallback cb); + +/*---------------------------------------------------------------------------- + * Macros + */ + + +#endif /* __XI_INTROSPECTION_H */ + + + diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection_private.h b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection_private.h new file mode 100644 index 0000000..7b97fa7 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_introspection_private.h @@ -0,0 +1,106 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Dan Libby, Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* IMPORTANT! + * + * only non-public things should be in this file. It is fine for any .c file + * in xmlrpc/src to include it, but users of the public API should never + * include it, and thus *.h files that are part of the public API should + * never include it, or they would break if this file is not present. + */ + + +#ifndef __XI_INTROSPECTION_PRIVATE_H +/* + * Avoid include redundancy. + */ +#define __XI_INTROSPECTION_PRIVATE_H + +/*---------------------------------------------------------------------------- + * xmlrpc_introspection_private.h + * + * Purpose: + * define non-public introspection routines + * Comments: + */ + +/*---------------------------------------------------------------------------- + * Constants + */ +#define xi_token_default "default" +#define xi_token_description "description" +#define xi_token_name "name" +#define xi_token_optional "optional" +#define xi_token_params "params" +#define xi_token_purpose "purpose" +#define xi_token_returns "returns" +#define xi_token_signatures "signatures" +#define xi_token_type "type" +#define xi_token_version "version" +#define xi_token_empty "" +#define xi_token_system_describe_methods "system.describeMethods" +#define xi_token_system_list_methods "system.listMethods" +#define xi_token_system_method_help "system.methodHelp" +#define xi_token_system_method_signature "system.methodSignature" + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ +typedef struct _doc_method { + XMLRPC_IntrospectionCallback method; + int b_called; +} doc_method; + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +void xi_register_system_methods(XMLRPC_SERVER server); + +/*---------------------------------------------------------------------------- + * Macros + */ + + +#endif /* __XI_INTROSPECTION_PRIVATE_H */ + + + + diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc_private.h b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_private.h new file mode 100644 index 0000000..65c6b13 --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_private.h @@ -0,0 +1,178 @@ +/* + This file is part of libXMLRPC - a C library for xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2000 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* only non-public things should be in this file. It is fine for any .c file + * in xmlrpc/src to include it, but users of the public API should never + * include it, and thus *.h files that are part of the public API should + * never include it, or they would break if this file is not present. + */ + +#ifndef XMLRPC_PRIVATE_ALREADY_INCLUDED +/* + * Avoid include redundancy. + */ +#define XMLRPC_PRIVATE_ALREADY_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + + +/*---------------------------------------------------------------------------- + * xmlrpc_private.h + * + * Purpose: + * define non-public intra-library routines & data + * Comments: + */ + +/*---------------------------------------------------------------------------- + * Constants + */ + + +/*---------------------------------------------------------------------------- + * Includes + */ + +/*---------------------------------------------------------------------------- + * Structures + */ + +/* Some of these are typedef'd in xmlrpc.h for public use */ + +typedef struct _xmlrpc_vector* XMLRPC_VECTOR; + +/****s* VALUE/XMLRPC_VALUE + * NAME + * XMLRPC_VALUE + * NOTES + * A value of variable data type. The most important object in this API. :) + * + * This struct is opaque to callers and should be accessed only via accessor functions. + * SEE ALSO + * XMLRPC_REQUEST + * XMLRPC_CreateValueEmpty () + * XMLRPC_CleanupValue () + * SOURCE + */ +typedef struct _xmlrpc_value { + XMLRPC_VALUE_TYPE type; /* data type of this value */ + XMLRPC_VECTOR v; /* vector type specific info */ + simplestring str; /* string value buffer */ + simplestring id; /* id of this value. possibly empty. */ + int i; /* integer value. */ + double d; /* double value */ + int iRefCount; /* So we know when we can delete the value . */ +} STRUCT_XMLRPC_VALUE; +/******/ + +/****s* VALUE/XMLRPC_REQUEST + * NAME + * XMLRPC_REQUEST + * NOTES + * Internal representation of an XML request. + * + * This struct is opaque to callers and should be accessed only via accessor functions. + * + * SEE ALSO + * XMLRPC_VALUE + * XMLRPC_RequestNew () + * XMLRPC_RequestFree () + * SOURCE + */ +typedef struct _xmlrpc_request { + XMLRPC_VALUE io; /* data associated with this request */ + simplestring methodName; /* name of method being called */ + XMLRPC_REQUEST_TYPE request_type; /* type of request */ + STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS output; /* xml output options */ + XMLRPC_VALUE error; /* error codes */ +} STRUCT_XMLRPC_REQUEST; +/******/ + +/* Vector type. Used by XMLRPC_VALUE. Never visible to users of the API. */ +typedef struct _xmlrpc_vector { + XMLRPC_VECTOR_TYPE type; /* vector type */ + queue *q; /* list of child values */ +} STRUCT_XMLRPC_VECTOR; +/******/ + +/****s* VALUE/XMLRPC_SERVER + * NAME + * XMLRPC_SERVER + * NOTES + * internal representation of an xmlrpc server + * + * This struct is opaque to callers and should be accessed only via accessor functions. + * + * SEE ALSO + * XMLRPC_ServerCreate () + * XMLRPC_ServerDestroy () + * SOURCE + */ +typedef struct _xmlrpc_server { + queue methodlist; /* list of callback methods */ + queue docslist; /* list of introspection callbacks */ + XMLRPC_VALUE xIntrospection; +} STRUCT_XMLRPC_SERVER; +/******/ + +typedef struct _server_method { + char* name; + XMLRPC_VALUE desc; + XMLRPC_Callback method; +} server_method; + + +/*---------------------------------------------------------------------------- + * Globals + */ + +/*---------------------------------------------------------------------------- + * Functions + */ +server_method* find_method(XMLRPC_SERVER server, const char* name); +const char* type_to_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype); + +/*---------------------------------------------------------------------------- + * Macros + */ +#define my_free(thing) if(thing) {free(thing); thing = 0;} + + +#ifdef __cplusplus +} +#endif + + +#endif /* XMLRPC_PRIVATE_ALREADY_INCLUDED */ + diff --git a/trunk/php/xmlrpc/libxmlrpc/xmlrpc_win32.h b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_win32.h new file mode 100644 index 0000000..58c54bb --- /dev/null +++ b/trunk/php/xmlrpc/libxmlrpc/xmlrpc_win32.h @@ -0,0 +1,11 @@ +#ifndef _XMLRPC_WIN32_H +#define _XMLRPC_WIN32_H +/* just some things needed to compile win32 */ +#include +#include +#define inline __inline +#define snprintf _snprintf +#define strcasecmp(s1, s2) stricmp(s1, s2) + + +#endif \ No newline at end of file diff --git a/trunk/php/xmlrpc/php_xmlrpc.h b/trunk/php/xmlrpc/php_xmlrpc.h new file mode 100644 index 0000000..98355ba --- /dev/null +++ b/trunk/php/xmlrpc/php_xmlrpc.h @@ -0,0 +1,132 @@ +/* + This file is part of, or distributed with, libXMLRPC - a C library for + xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* auto-generated portions of this file are also subject to the php license */ + +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2004 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Dan Libby | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ + +#ifndef _PHP_XMLRPC_H +#define _PHP_XMLRPC_H + +/* You should tweak config.m4 so this symbol (or some else suitable) + gets defined. +*/ +#if 1 /* HAVE_XMLRPC */ + +extern zend_module_entry xmlrpc_module_entry; +#define phpext_xmlrpc_ptr &xmlrpc_module_entry + +#ifdef PHP_WIN32 +#define PHP_XMLRPC_API __declspec(dllexport) +#else +#define PHP_XMLRPC_API +#endif + +PHP_MINIT_FUNCTION(xmlrpc); +PHP_MSHUTDOWN_FUNCTION(xmlrpc); +PHP_RINIT_FUNCTION(xmlrpc); +PHP_RSHUTDOWN_FUNCTION(xmlrpc); +PHP_MINFO_FUNCTION(xmlrpc); + +PHP_FUNCTION(xmlrpc_encode); +PHP_FUNCTION(xmlrpc_decode); +PHP_FUNCTION(xmlrpc_decode_request); +PHP_FUNCTION(xmlrpc_encode_request); +PHP_FUNCTION(xmlrpc_get_type); +PHP_FUNCTION(xmlrpc_set_type); +PHP_FUNCTION(xmlrpc_is_fault); +PHP_FUNCTION(xmlrpc_server_create); +PHP_FUNCTION(xmlrpc_server_destroy); +PHP_FUNCTION(xmlrpc_server_register_method); +PHP_FUNCTION(xmlrpc_server_call_method); +PHP_FUNCTION(xmlrpc_parse_method_descriptions); +PHP_FUNCTION(xmlrpc_server_add_introspection_data); +PHP_FUNCTION(xmlrpc_server_register_introspection_callback); + +/* Fill in this structure and use entries in it + for thread safety instead of using true globals. +*/ +ZEND_BEGIN_MODULE_GLOBALS(xmlrpc) + long allow_null; +ZEND_END_MODULE_GLOBALS(xmlrpc) + +/* In every function that needs to use variables in zend_xmlrpc_globals, + do call XMLRPCLS_FETCH(); after declaring other variables used by + that function, and always refer to them as XMLRPCG(variable). + You are encouraged to rename these macros something shorter, see + examples in any other php module directory. +*/ + +#ifdef ZTS +#define XMLRPCG(v) TSRMG(xmlrpc_globals_id, zend_xmlrpc_globals *, v) +#define XMLRPCLS_FETCH() zend_xmlrpc_globals *xmlrpc_globals = ts_resource(xmlrpc_globals_id) +#else +#define XMLRPCG(v) (xmlrpc_globals.v) +#define XMLRPCLS_FETCH() +#endif + +ZEND_EXTERN_MODULE_GLOBALS(xmlrpc) + +#else + +#define phpext_xmlrpc_ptr NULL + +#endif + +#endif /* _PHP_XMLRPC_H */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ diff --git a/trunk/php/xmlrpc/xmlrpc-epi-php.c b/trunk/php/xmlrpc/xmlrpc-epi-php.c new file mode 100644 index 0000000..d668067 --- /dev/null +++ b/trunk/php/xmlrpc/xmlrpc-epi-php.c @@ -0,0 +1,1528 @@ +/* + This file is part of, or distributed with, libXMLRPC - a C library for + xml-encoded function calls. + + Author: Dan Libby (dan@libby.com) + Epinions.com may be contacted at feedback@epinions-inc.com +*/ + +/* + Copyright 2001 Epinions, Inc. + + Subject to the following 3 conditions, Epinions, Inc. permits you, free + of charge, to (a) use, copy, distribute, modify, perform and display this + software and associated documentation files (the "Software"), and (b) + permit others to whom the Software is furnished to do so as well. + + 1) The above copyright notice and this permission notice shall be included + without modification in all copies or substantial portions of the + Software. + + 2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF + ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY + IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE OR NONINFRINGEMENT. + + 3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, + SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT + OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING + NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH + DAMAGES. + +*/ + +/* auto-generated portions of this file are also subject to the php license */ + +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2004 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Dan Libby | + +----------------------------------------------------------------------+ + */ + +/* $Id$ */ + +/********************************************************************** +* BUGS: * +* - when calling a php user function, there appears to be no way to * +* distinguish between a return value of null, and no return value * +* at all. The xml serialization layer(s) will then return a value * +* of null, when the right thing may be no value at all. (SOAP) * +**********************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "ext/standard/info.h" +#include "php_ini.h" +#include "php_xmlrpc.h" +#include "xmlrpc.h" + +#define PHP_EXT_VERSION "0.51" + +/* You should tweak config.m4 so this symbol (or some else suitable) + gets defined. */ + +ZEND_DECLARE_MODULE_GLOBALS(xmlrpc) + +static int le_xmlrpc_server; + +function_entry xmlrpc_functions[] = { + PHP_FE(xmlrpc_encode, NULL) + PHP_FE(xmlrpc_decode, NULL) + PHP_FE(xmlrpc_decode_request, second_arg_force_ref) + PHP_FE(xmlrpc_encode_request, NULL) + PHP_FE(xmlrpc_get_type, NULL) + PHP_FE(xmlrpc_set_type, first_arg_force_ref) + PHP_FE(xmlrpc_is_fault, NULL) + PHP_FE(xmlrpc_server_create, NULL) + PHP_FE(xmlrpc_server_destroy, NULL) + PHP_FE(xmlrpc_server_register_method, NULL) + PHP_FE(xmlrpc_server_call_method, NULL) + PHP_FE(xmlrpc_parse_method_descriptions, NULL) + PHP_FE(xmlrpc_server_add_introspection_data, NULL) + PHP_FE(xmlrpc_server_register_introspection_callback, NULL) + {NULL, NULL, NULL} +}; + +zend_module_entry xmlrpc_module_entry = { + STANDARD_MODULE_HEADER, + "xmlrpc", + xmlrpc_functions, + PHP_MINIT(xmlrpc), + PHP_MSHUTDOWN(xmlrpc), + PHP_RINIT(xmlrpc), /* Replace with NULL if there's nothing to do at request start */ + PHP_RSHUTDOWN(xmlrpc), /* Replace with NULL if there's nothing to do at request end */ + PHP_MINFO(xmlrpc), + PHP_EXT_VERSION, + STANDARD_MODULE_PROPERTIES +}; + +#ifdef COMPILE_DL_XMLRPC +ZEND_GET_MODULE(xmlrpc) +# ifdef PHP_WIN32 +# include "zend_arg_defs.c" +# endif +#endif + +PHP_INI_BEGIN() +STD_PHP_INI_BOOLEAN("xmlrpc.allow_null", "0", PHP_INI_ALL, OnUpdateBool, allow_null, zend_xmlrpc_globals, xmlrpc_globals) +PHP_INI_END() + +static void php_xmlrpc_init_globals(zend_xmlrpc_globals *xmlrpc_globals) +{ + memset(xmlrpc_globals, 0, sizeof(zend_xmlrpc_globals)); +} + +/******************************* +* local structures and defines * +*******************************/ + +/* per server data */ +typedef struct _xmlrpc_server_data { + zval* method_map; + zval* introspection_map; + XMLRPC_SERVER server_ptr; +} xmlrpc_server_data; + + +/* how to format output */ +typedef struct _php_output_options { + int b_php_out; + int b_auto_version; + int b_allow_null; + STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS xmlrpc_out; +} php_output_options; + +/* data passed to C callback */ +typedef struct _xmlrpc_callback_data { + zval* xmlrpc_method; + zval* php_function; + zval* caller_params; + zval* return_data; + xmlrpc_server_data* server; + char php_executed; +} xmlrpc_callback_data; + +/* output options */ +#define OUTPUT_TYPE_KEY "output_type" +#define OUTPUT_TYPE_KEY_LEN (sizeof(OUTPUT_TYPE_KEY) - 1) +#define OUTPUT_TYPE_VALUE_PHP "php" +#define OUTPUT_TYPE_VALUE_XML "xml" + +#define ALLOW_NULL_KEY "allow_null" +#define ALLOW_NULL_KEY_LEN (sizeof(ALLOW_NULL_KEY) - 1) + +#define VERBOSITY_KEY "verbosity" +#define VERBOSITY_KEY_LEN (sizeof(VERBOSITY_KEY) - 1) +#define VERBOSITY_VALUE_NO_WHITE_SPACE "no_white_space" +#define VERBOSITY_VALUE_NEWLINES_ONLY "newlines_only" +#define VERBOSITY_VALUE_PRETTY "pretty" + +#define ESCAPING_KEY "escaping" +#define ESCAPING_KEY_LEN (sizeof(ESCAPING_KEY) - 1) +#define ESCAPING_VALUE_CDATA "cdata" +#define ESCAPING_VALUE_NON_ASCII "non-ascii" +#define ESCAPING_VALUE_NON_PRINT "non-print" +#define ESCAPING_VALUE_MARKUP "markup" + +#define VERSION_KEY "version" +#define VERSION_KEY_LEN (sizeof(VERSION_KEY) - 1) +#define VERSION_VALUE_SIMPLE "simple" +#define VERSION_VALUE_XMLRPC "xmlrpc" +#define VERSION_VALUE_SOAP11 "soap 1.1" +#define VERSION_VALUE_AUTO "auto" + +#define ENCODING_KEY "encoding" +#define ENCODING_KEY_LEN (sizeof(ENCODING_KEY) - 1) +#define ENCODING_DEFAULT "iso-8859-1" + +/* value types */ +#define OBJECT_TYPE_ATTR "xmlrpc_type" +#define OBJECT_VALUE_ATTR "scalar" +#define OBJECT_VALUE_TS_ATTR "timestamp" + +/* faults */ +#define FAULT_CODE "faultCode" +#define FAULT_CODE_LEN (sizeof(FAULT_CODE) - 1) +#define FAULT_STRING "faultString" +#define FAULT_STRING_LEN (sizeof(FAULT_STRING) - 1) + +/*********************** +* forward declarations * +***********************/ +XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(php_output_options* out, zval* value, zval** newvalue); +static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data); +int sset_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE type); +zval* decode_request_worker(zval* xml_in, zval* encoding_in, zval* method_name_out); +const char* xmlrpc_type_as_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype); +XMLRPC_VALUE_TYPE xmlrpc_str_as_type(const char* str); +XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str); +int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE type); + +/********************* +* startup / shutdown * +*********************/ + +static void destroy_server_data(xmlrpc_server_data *server) +{ + if (server) { + XMLRPC_ServerDestroy(server->server_ptr); + + zval_dtor(server->method_map); + FREE_ZVAL(server->method_map); + + zval_dtor(server->introspection_map); + FREE_ZVAL(server->introspection_map); + + efree(server); + } +} + +/* called when server is being destructed. either when xmlrpc_server_destroy + * is called, or when request ends. */ +static void xmlrpc_server_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC) +{ + if (rsrc && rsrc->ptr) { + destroy_server_data((xmlrpc_server_data*) rsrc->ptr); + } +} + +/* module init */ +PHP_MINIT_FUNCTION(xmlrpc) +{ + ZEND_INIT_MODULE_GLOBALS(xmlrpc, php_xmlrpc_init_globals, NULL); + + REGISTER_INI_ENTRIES(); + + le_xmlrpc_server = zend_register_list_destructors_ex(xmlrpc_server_destructor, NULL, "xmlrpc server", module_number); + + return SUCCESS; +} + +/* module shutdown */ +PHP_MSHUTDOWN_FUNCTION(xmlrpc) +{ + return SUCCESS; +} + +/* Remove if there's nothing to do at request start */ +PHP_RINIT_FUNCTION(xmlrpc) +{ + return SUCCESS; +} + +/* Remove if there's nothing to do at request end */ +PHP_RSHUTDOWN_FUNCTION(xmlrpc) +{ + return SUCCESS; +} + +/* display info in phpinfo() */ +PHP_MINFO_FUNCTION(xmlrpc) +{ + php_info_print_table_start(); + php_info_print_table_row(2, "core library version", XMLRPC_GetVersionString()); + php_info_print_table_row(2, "php extension version", PHP_EXT_VERSION); + php_info_print_table_row(2, "author", "Dan Libby"); + php_info_print_table_row(2, "homepage", "http://xmlrpc-epi.sourceforge.net"); + php_info_print_table_row(2, "open sourced by", "Epinions.com"); + php_info_print_table_end(); +} + +/******************* +* random utilities * +*******************/ + +/* Utility functions for adding data types to arrays, with or without key (assoc, non-assoc). + * Could easily be further generalized to work with objects. + */ +#if 0 +static int add_long(zval* list, char* id, int num) { + if(id) return add_assoc_long(list, id, num); + else return add_next_index_long(list, num); +} + +static int add_double(zval* list, char* id, double num) { + if(id) return add_assoc_double(list, id, num); + else return add_next_index_double(list, num); +} + +static int add_string(zval* list, char* id, char* string, int duplicate) { + if(id) return add_assoc_string(list, id, string, duplicate); + else return add_next_index_string(list, string, duplicate); +} + +static int add_stringl(zval* list, char* id, char* string, uint length, int duplicate) { + if(id) return add_assoc_stringl(list, id, string, length, duplicate); + else return add_next_index_stringl(list, string, length, duplicate); +} + +#endif + +static int add_zval(zval* list, const char* id, zval** val) +{ + if (list && val) { + if (id) { + return zend_hash_update(Z_ARRVAL_P(list), (char*) id, strlen(id) + 1, (void *) val, sizeof(zval **), NULL); + } else { + return zend_hash_next_index_insert(Z_ARRVAL_P(list), (void *) val, sizeof(zval **), NULL); + } + } + /* what is the correct return on error? */ + return 0; +} + +#define my_zend_hash_get_current_key(ht, my_key, num_index) zend_hash_get_current_key(ht, my_key, num_index, 0) + + +/************************* +* input / output options * +*************************/ + +/* parse an array (user input) into output options suitable for use by xmlrpc engine + * and determine whether to return data as xml or php vars */ +static void set_output_options(php_output_options* options, zval* output_opts) +{ + XMLRPCLS_FETCH(); + + if (options) { + + /* defaults */ + options->b_php_out = 0; + options->b_auto_version = 1; + options->b_allow_null = 0; + options->xmlrpc_out.version = xmlrpc_version_1_0; + options->xmlrpc_out.xml_elem_opts.encoding = ENCODING_DEFAULT; + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_pretty; + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping | xml_elem_non_ascii_escaping | xml_elem_non_print_escaping; + + if (output_opts && Z_TYPE_P(output_opts) == IS_ARRAY) { + zval** val; + + /* marshal NULL */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), ALLOW_NULL_KEY, ALLOW_NULL_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_BOOL) { + if (Z_LVAL_PP(val)) { + options->b_allow_null = 1; + } else { + options->b_allow_null = 0; + } + } + } + + /* type of output (xml/php) */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), OUTPUT_TYPE_KEY, OUTPUT_TYPE_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_STRING) { + if (!strcmp(Z_STRVAL_PP(val), OUTPUT_TYPE_VALUE_PHP)) { + options->b_php_out = 1; + } else if (!strcmp(Z_STRVAL_PP(val), OUTPUT_TYPE_VALUE_XML)) { + options->b_php_out = 0; + } + } + } + + /* verbosity of generated xml */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), VERBOSITY_KEY, VERBOSITY_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_STRING) { + if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_NO_WHITE_SPACE)) { + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_no_white_space; + } else if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_NEWLINES_ONLY)) { + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_newlines_only; + } else if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_PRETTY)) { + options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_pretty; + } + } + } + + /* version of xml to output */ + if (zend_hash_find(Z_ARRVAL_P(output_opts), VERSION_KEY, VERSION_KEY_LEN + 1, (void**) &val) == SUCCESS) { + if (Z_TYPE_PP(val) == IS_STRING) { + options->b_auto_version = 0; + if (!strcmp(Z_STRVAL_PP(val), VERSION_VALUE_XMLRPC)) { + options->xmlrpc_out.version = xmlrpc_version_1_0; + } else if (!strcmp(Z_STRVAL_PP(val), VERSION_VALUE_SIMPLE)) { + options->xmlrpc_out.version = xmlrpc_version_simple; + } else if (!strcmp((*val)->value.str.val, VERSION_VALUE_SOAP11)) { + options->xmlrpc_out.version = xmlrpc_version_soap_1_1; + } else { /* if(!strcmp((*val)->value.str.val, VERSION_VALUE_AUTO)) { */ + options->b_auto_version = 1; + } + } + } + + /* encoding code set */ + if(zend_hash_find(Z_ARRVAL_P(output_opts), + ENCODING_KEY, ENCODING_KEY_LEN + 1, + (void**)&val) == SUCCESS) { + if(Z_TYPE_PP(val) == IS_STRING) { + options->xmlrpc_out.xml_elem_opts.encoding = estrdup(Z_STRVAL_PP(val)); + } + } + + /* escaping options */ + if(zend_hash_find(Z_ARRVAL_P(output_opts), + ESCAPING_KEY, ESCAPING_KEY_LEN + 1, + (void**)&val) == SUCCESS) { + /* multiple values allowed. check if array */ + if(Z_TYPE_PP(val) == IS_ARRAY) { + zval** iter_val; + zend_hash_internal_pointer_reset(Z_ARRVAL_PP(val)); + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_no_escaping; + while(1) { + if(zend_hash_get_current_data(Z_ARRVAL_PP(val), (void**)&iter_val) == SUCCESS) { + if(Z_TYPE_PP(iter_val) == IS_STRING && Z_STRVAL_PP(iter_val)) { + if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_CDATA)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_cdata_escaping; + } + else if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_ASCII)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_ascii_escaping; + } + else if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_PRINT)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_print_escaping; + } + else if(!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_MARKUP)) { + options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_markup_escaping; + } + } + } + else { + break; + } + + zend_hash_move_forward(Z_ARRVAL_PP(val)); + } + } + /* else, check for single value */ + else if(Z_TYPE_PP(val) == IS_STRING) { + if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_CDATA)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_cdata_escaping; + } + else if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_NON_ASCII)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_ascii_escaping; + } + else if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_NON_PRINT)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_print_escaping; + } + else if(!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_MARKUP)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping; + } + } + } + } + } +} + + +/****************** +* encode / decode * +******************/ + +/* php arrays have no distinction between array and struct types. + * they even allow mixed. Thus, we determine the type by iterating + * through the entire array and figuring out each element. + * room for some optimation here if we stop after a specific # of elements. + */ +static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) +{ + int bArray = 0, bStruct = 0, bMixed = 0; + unsigned long num_index; + char* my_key; + + zend_hash_internal_pointer_reset(ht); + while(1) { + int res = my_zend_hash_get_current_key(ht, &my_key, &num_index); + if(res == HASH_KEY_IS_LONG) { + if(bStruct) { + bMixed = 1; + break; + } + bArray = 1; + } + else if(res == HASH_KEY_NON_EXISTANT) { + break; + } + else if(res == HASH_KEY_IS_STRING) { + if(bArray) { + bMixed = 1; + break; + } + bStruct = 1; + } + + zend_hash_move_forward(ht); + } + return bMixed ? xmlrpc_vector_mixed : (bStruct ? xmlrpc_vector_struct : xmlrpc_vector_array); +} + +/* recursively convert php values into xmlrpc values */ +static XMLRPC_VALUE PHP_to_XMLRPC_worker (php_output_options* out, const char* key, zval* in_val, int depth) +{ + XMLRPC_VALUE xReturn = NULL; + if(in_val) { + zval* val = NULL; + XMLRPC_VALUE_TYPE type = get_zval_xmlrpc_type(out, in_val, &val); + if(val) { + switch(type) { + case xmlrpc_nil: + xReturn = XMLRPC_CreateValueEmpty(); + XMLRPC_SetValueID(xReturn, key, 0); + break; + case xmlrpc_base64: + xReturn = XMLRPC_CreateValueBase64(key, Z_STRVAL_P(val), Z_STRLEN_P(val)); + break; + case xmlrpc_datetime: + convert_to_string(val); + xReturn = XMLRPC_CreateValueDateTime_ISO8601(key, Z_STRVAL_P(val)); + break; + case xmlrpc_boolean: + convert_to_boolean(val); + xReturn = XMLRPC_CreateValueBoolean(key, Z_LVAL_P(val)); + break; + case xmlrpc_int: + convert_to_long(val); + xReturn = XMLRPC_CreateValueInt(key, Z_LVAL_P(val)); + break; + case xmlrpc_double: + convert_to_double(val); + xReturn = XMLRPC_CreateValueDouble(key, Z_DVAL_P(val)); + break; + case xmlrpc_string: + convert_to_string(val); + xReturn = XMLRPC_CreateValueString(key, Z_STRVAL_P(val), Z_STRLEN_P(val)); + break; + case xmlrpc_vector: + { + unsigned long num_index; + zval** pIter; + char* my_key; + + convert_to_array(val); + + xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val))); + + zend_hash_internal_pointer_reset(Z_ARRVAL_P(val)); + while(1) { + int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val), &my_key, &num_index); + if(res == HASH_KEY_IS_LONG) { + if(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) { + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(out, 0, *pIter, depth++)); + } + } + else if(res == HASH_KEY_NON_EXISTANT) { + break; + } + else if(res == HASH_KEY_IS_STRING) { + if(zend_hash_get_current_data(Z_ARRVAL_P(val), (void**)&pIter) == SUCCESS) { + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(out, my_key, *pIter, depth++)); + } + } + + zend_hash_move_forward(Z_ARRVAL_P(val)); + } + } + break; + default: + break; + } + } + } + return xReturn; +} + +static XMLRPC_VALUE PHP_to_XMLRPC(php_output_options* out, zval* root_val) +{ + return PHP_to_XMLRPC_worker(out, NULL, root_val, 0); +} + +/* recursively convert xmlrpc values into php values */ +static zval* XMLRPC_to_PHP(XMLRPC_VALUE el) +{ + zval* elem = NULL; + const char* pStr; + + if(el) { + XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(el); + + MAKE_STD_ZVAL(elem); /* init. very important. spent a frustrating day finding this out. */ + + switch(type) { + case xmlrpc_empty: + case xmlrpc_nil: + Z_TYPE_P(elem) = IS_NULL; + break; + case xmlrpc_string: + pStr = XMLRPC_GetValueString(el); + if(pStr) { + Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); + Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem)); + Z_TYPE_P(elem) = IS_STRING; + } + break; + case xmlrpc_int: + Z_LVAL_P(elem) = XMLRPC_GetValueInt(el); + Z_TYPE_P(elem) = IS_LONG; + break; + case xmlrpc_boolean: + Z_LVAL_P(elem) = XMLRPC_GetValueBoolean(el); + Z_TYPE_P(elem) = IS_BOOL; + break; + case xmlrpc_double: + Z_DVAL_P(elem) = XMLRPC_GetValueDouble(el); + Z_TYPE_P(elem) = IS_DOUBLE; + break; + case xmlrpc_datetime: + Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); + Z_STRVAL_P(elem) = estrndup(XMLRPC_GetValueDateTime_ISO8601(el), Z_STRLEN_P(elem)); + Z_TYPE_P(elem) = IS_STRING; + break; + case xmlrpc_base64: + pStr = XMLRPC_GetValueBase64(el); + if(pStr) { + Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); + Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem)); + Z_TYPE_P(elem) = IS_STRING; + } + break; + case xmlrpc_vector: + array_init(elem); + { + XMLRPC_VALUE xIter = XMLRPC_VectorRewind(el); + + while( xIter ) { + zval *val = XMLRPC_to_PHP(xIter); + if (val) { + add_zval(elem, XMLRPC_GetValueID(xIter), &val); + } + xIter = XMLRPC_VectorNext(el); + } + } + break; + default: + break; + } + set_zval_xmlrpc_type(elem, type); + } + return elem; +} + +/* {{{ proto string xmlrpc_encode_request(string method, mixed params) + Generates XML for a method request */ +PHP_FUNCTION(xmlrpc_encode_request) +{ + XMLRPC_REQUEST xRequest = NULL; + zval **method, **vals, **out_opts; + char* outBuf; + php_output_options out; + + if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 3 || (zend_get_parameters_ex(ZEND_NUM_ARGS(), &method, &vals, &out_opts) == FAILURE)) { + WRONG_PARAM_COUNT; /* prints/logs a warning and returns */ + } + + set_output_options(&out, (ZEND_NUM_ARGS() == 3) ? *out_opts : 0); + + if(return_value_used) { + xRequest = XMLRPC_RequestNew(); + + if(xRequest) { + XMLRPC_RequestSetOutputOptions(xRequest, &out.xmlrpc_out); + if (Z_TYPE_PP(method) == IS_NULL) { + XMLRPC_RequestSetRequestType(xRequest, xmlrpc_request_response); + } else { + XMLRPC_RequestSetMethodName(xRequest, Z_STRVAL_PP(method)); + XMLRPC_RequestSetRequestType(xRequest, xmlrpc_request_call); + } + if (Z_TYPE_PP(vals) != IS_NULL) { + XMLRPC_RequestSetData(xRequest, PHP_to_XMLRPC(&out, *vals)); + } + + outBuf = XMLRPC_REQUEST_ToXML(xRequest, 0); + if(outBuf) { + RETVAL_STRING(outBuf, 1); + free(outBuf); + } + XMLRPC_RequestFree(xRequest, 1); + } + } +} +/* }}} */ + +/* {{{ proto string xmlrpc_encode(mixed value) + Generates XML for a PHP value */ +PHP_FUNCTION(xmlrpc_encode) +{ + XMLRPC_VALUE xOut = NULL; + zval **arg1; + char *outBuf; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + if( return_value_used ) { + /* convert native php type to xmlrpc type */ + xOut = PHP_to_XMLRPC(NULL, *arg1); + + /* generate raw xml from xmlrpc data */ + outBuf = XMLRPC_VALUE_ToXML(xOut, 0); + + if(xOut) { + if(outBuf) { + RETVAL_STRING(outBuf, 1); + free(outBuf); + } + /* cleanup */ + XMLRPC_CleanupValue(xOut); + } + } +} +/* }}} */ + + +zval* decode_request_worker (zval* xml_in, zval* encoding_in, zval* method_name_out) +{ + zval* retval = NULL; + XMLRPC_REQUEST response; + STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS opts = {{0}}; + opts.xml_elem_opts.encoding = encoding_in ? utf8_get_encoding_id_from_string(Z_STRVAL_P(encoding_in)) : ENCODING_DEFAULT; + + /* generate XMLRPC_REQUEST from raw xml */ + response = XMLRPC_REQUEST_FromXML(Z_STRVAL_P(xml_in), Z_STRLEN_P(xml_in), &opts); + if(response) { + /* convert xmlrpc data to native php types */ + retval = XMLRPC_to_PHP(XMLRPC_RequestGetData(response)); + + if(XMLRPC_RequestGetRequestType(response) == xmlrpc_request_call) { + if(method_name_out) { + convert_to_string(method_name_out); + Z_TYPE_P(method_name_out) = IS_STRING; + Z_STRVAL_P(method_name_out) = estrdup(XMLRPC_RequestGetMethodName(response)); + Z_STRLEN_P(method_name_out) = strlen(Z_STRVAL_P(method_name_out)); + } + } + + /* dust, sweep, and mop */ + XMLRPC_RequestFree(response, 1); + } + return retval; +} + +/* {{{ proto array xmlrpc_decode_request(string xml, string& method [, string encoding]) + Decodes XML into native PHP types */ +PHP_FUNCTION(xmlrpc_decode_request) +{ + zval **xml, **method, **encoding = NULL; + int argc = ZEND_NUM_ARGS(); + + if (argc < 2 || argc > 3 || (zend_get_parameters_ex(argc, &xml, &method, &encoding) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(xml); + convert_to_string_ex(method); + if(argc == 3) { + convert_to_string_ex(encoding); + } + + if(return_value_used) { + zval* retval = decode_request_worker(*xml, encoding ? *encoding : NULL, *method); + if(retval) { + *return_value = *retval; + FREE_ZVAL(retval); + } + } +} +/* }}} */ + + +/* {{{ proto array xmlrpc_decode(string xml [, string encoding]) + Decodes XML into native PHP types */ +PHP_FUNCTION(xmlrpc_decode) +{ + zval **arg1, **arg2 = NULL; + int argc = ZEND_NUM_ARGS(); + + if (argc < 1 || argc > 2 || (zend_get_parameters_ex(argc, &arg1, &arg2) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(arg1); + if(argc == 2) { + convert_to_string_ex(arg2); + } + + if(return_value_used) { + zval* retval = decode_request_worker(*arg1, arg2 ? *arg2 : NULL, NULL); + if(retval) { + *return_value = *retval; + FREE_ZVAL(retval); + } + } +} +/* }}} */ + + +/************************* +* server related methods * +*************************/ + +/* {{{ proto resource xmlrpc_server_create(void) + Creates an xmlrpc server */ +PHP_FUNCTION(xmlrpc_server_create) +{ + if(ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT; + } + + if(return_value_used) { + zval *method_map, *introspection_map; + xmlrpc_server_data *server = emalloc(sizeof(xmlrpc_server_data)); + MAKE_STD_ZVAL(method_map); + MAKE_STD_ZVAL(introspection_map); + + array_init(method_map); + array_init(introspection_map); + + /* allocate server data. free'd in destroy_server_data() */ + server->method_map = method_map; + server->introspection_map = introspection_map; + server->server_ptr = XMLRPC_ServerCreate(); + + XMLRPC_ServerRegisterIntrospectionCallback(server->server_ptr, php_xmlrpc_introspection_callback); + + /* store for later use */ + ZEND_REGISTER_RESOURCE(return_value,server, le_xmlrpc_server); + } +} +/* }}} */ + +/* {{{ proto int xmlrpc_server_destroy(resource server) + Destroys server resources */ +PHP_FUNCTION(xmlrpc_server_destroy) +{ + zval **arg1; + int bSuccess = FAILURE; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + if(Z_TYPE_PP(arg1) == IS_RESOURCE) { + int type; + + xmlrpc_server_data *server = zend_list_find(Z_LVAL_PP(arg1), &type); + + if(server && type == le_xmlrpc_server) { + bSuccess = zend_list_delete(Z_LVAL_PP(arg1)); + + /* called by hashtable destructor + * destroy_server_data(server); + */ + } + } + RETVAL_LONG(bSuccess == SUCCESS); +} +/* }}} */ + + +/* called by xmlrpc C engine as method handler for all registered methods. + * it then calls the corresponding PHP function to handle the method. + */ +static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRequest, void* data) +{ + xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; + zval* xmlrpc_params; + zval* callback_params[3]; + TSRMLS_FETCH(); + + /* convert xmlrpc to native php types */ + xmlrpc_params = XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest)); + + /* setup data hoojum */ + callback_params[0] = pData->xmlrpc_method; + callback_params[1] = xmlrpc_params; + callback_params[2] = pData->caller_params; + + /* Use same C function for all methods */ + + /* php func prototype: function user_func($method_name, $xmlrpc_params, $user_params) */ + call_user_function(CG(function_table), NULL, pData->php_function, pData->return_data, 3, callback_params TSRMLS_CC); + + pData->php_executed = 1; + + zval_dtor(xmlrpc_params); + FREE_ZVAL(xmlrpc_params); + + return NULL; +} + +/* called by the C server when it first receives an introspection request. We pass this on to + * our PHP listeners, if any + */ +static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data) +{ + zval *retval_ptr, **php_function; + zval* callback_params[1]; + xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; + TSRMLS_FETCH(); + + MAKE_STD_ZVAL(retval_ptr); + Z_TYPE_P(retval_ptr) = IS_NULL; + + /* setup data hoojum */ + callback_params[0] = pData->caller_params; + + /* loop through and call all registered callbacks */ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(pData->server->introspection_map)); + while(1) { + if(zend_hash_get_current_data(Z_ARRVAL_P(pData->server->introspection_map), + (void**)&php_function) == SUCCESS) { + + /* php func prototype: function string user_func($user_params) */ + if(call_user_function(CG(function_table), NULL, *php_function, + retval_ptr, 1, callback_params TSRMLS_CC) == SUCCESS) { + XMLRPC_VALUE xData; + STRUCT_XMLRPC_ERROR err = {0}; + + /* return value should be a string */ + convert_to_string(retval_ptr); + + xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL_P(retval_ptr), &err); + + if(xData) { + if(!XMLRPC_ServerAddIntrospectionData(server, xData)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s(), improper element structure", Z_STRVAL_PP(php_function)); + } + XMLRPC_CleanupValue(xData); + } + else { + /* could not create description */ + if(err.xml_elem_error.parser_code) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to add introspection data returned from %s()", + err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error, Z_STRVAL_PP(php_function)); + } + else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", + Z_STRVAL_PP(php_function)); + } + } + } + else { + /* user func failed */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user introspection callback: %s()", Z_STRVAL_PP(php_function)); + } + } + else { + break; + } + + zend_hash_move_forward(Z_ARRVAL_P(pData->server->introspection_map)); + } + + /* so we don't call the same callbacks ever again */ + zend_hash_clean(Z_ARRVAL_P(pData->server->introspection_map)); +} + +/* {{{ proto bool xmlrpc_server_register_method(resource server, string method_name, string function) + Register a PHP function to handle method matching method_name */ +PHP_FUNCTION(xmlrpc_server_register_method) +{ + zval **method_key, **method_name, **handle, *method_name_save; + int type; + xmlrpc_server_data* server; + + if (ZEND_NUM_ARGS() != 3 || (zend_get_parameters_ex(3, &handle, &method_key, &method_name) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if(type == le_xmlrpc_server) { + /* register with C engine. every method just calls our standard callback, + * and it then dispatches to php as necessary + */ + if(XMLRPC_ServerRegisterMethod(server->server_ptr, Z_STRVAL_PP(method_key), php_xmlrpc_callback)) { + /* save for later use */ + MAKE_STD_ZVAL(method_name_save); + *method_name_save = **method_name; + zval_copy_ctor(method_name_save); + + /* register our php method */ + add_zval(server->method_map, Z_STRVAL_PP(method_key), &method_name_save); + + RETURN_BOOL(1); + } + } + RETURN_BOOL(0); +} +/* }}} */ + + +/* {{{ proto bool xmlrpc_server_register_introspection_callback(resource server, string function) + Register a PHP function to generate documentation */ +PHP_FUNCTION(xmlrpc_server_register_introspection_callback) +{ + zval **method_name, **handle, *method_name_save; + int type; + xmlrpc_server_data* server; + + if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &handle, &method_name) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if(type == le_xmlrpc_server) { + /* save for later use */ + MAKE_STD_ZVAL(method_name_save); + *method_name_save = **method_name; + zval_copy_ctor(method_name_save); + + /* register our php method */ + add_zval(server->introspection_map, NULL, &method_name_save); + + RETURN_BOOL(1); + } + RETURN_BOOL(0); +} +/* }}} */ + + +/* this function is itchin for a re-write */ + +/* {{{ proto mixed xmlrpc_server_call_method(resource server, string xml, mixed user_data [, array output_options]) + Parses XML requests and call methods */ +PHP_FUNCTION(xmlrpc_server_call_method) +{ + xmlrpc_callback_data data = {0}; + XMLRPC_REQUEST xRequest; + STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS input_opts; + xmlrpc_server_data* server; + zval **rawxml, **caller_params, **handle, **output_opts = NULL; + int type; + php_output_options out; + int argc =ZEND_NUM_ARGS(); + + if (argc < 3 || argc > 4 || (zend_get_parameters_ex(argc, &handle, &rawxml, &caller_params, &output_opts) != SUCCESS)) { + WRONG_PARAM_COUNT; + } + /* user output options */ + if (argc == 3) { + set_output_options(&out, NULL); + } + else { + set_output_options(&out, *output_opts); + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if(type == le_xmlrpc_server) { + /* HACK: use output encoding for now */ + input_opts.xml_elem_opts.encoding = utf8_get_encoding_id_from_string(out.xmlrpc_out.xml_elem_opts.encoding); + + /* generate an XMLRPC_REQUEST from the raw xml input */ + xRequest = XMLRPC_REQUEST_FromXML(Z_STRVAL_PP(rawxml), Z_STRLEN_PP(rawxml), &input_opts); + + if(xRequest) { + const char* methodname = XMLRPC_RequestGetMethodName(xRequest); + zval **php_function; + XMLRPC_VALUE xAnswer = NULL; + MAKE_STD_ZVAL(data.xmlrpc_method); /* init. very important. spent a frustrating day finding this out. */ + MAKE_STD_ZVAL(data.return_data); + Z_TYPE_P(data.return_data) = IS_NULL; /* in case value is never init'd, we don't dtor to think it is a string or something */ + Z_TYPE_P(data.xmlrpc_method) = IS_NULL; + + if (!methodname) { + methodname = ""; + } + + /* setup some data to pass to the callback function */ + Z_STRVAL_P(data.xmlrpc_method) = estrdup(methodname); + Z_STRLEN_P(data.xmlrpc_method) = strlen(methodname); + Z_TYPE_P(data.xmlrpc_method) = IS_STRING; + data.caller_params = *caller_params; + data.php_executed = 0; + data.server = server; + + /* check if the called method has been previous registered */ + if(zend_hash_find(Z_ARRVAL_P(server->method_map), + Z_STRVAL_P(data.xmlrpc_method), + Z_STRLEN_P(data.xmlrpc_method) + 1, + (void**)&php_function) == SUCCESS) { + + data.php_function = *php_function; + } + + /* We could just call the php method directly ourselves at this point, but we do this + * with a C callback in case the xmlrpc library ever implements some cool usage stats, + * or somesuch. + */ + xAnswer = XMLRPC_ServerCallMethod(server->server_ptr, xRequest, &data); + if(xAnswer && out.b_php_out) { + zval_dtor(data.return_data); + FREE_ZVAL(data.return_data); + data.return_data = XMLRPC_to_PHP(xAnswer); + } else if(data.php_executed && !out.b_php_out) { + xAnswer = PHP_to_XMLRPC(&out, data.return_data); + } + + /* should we return data as xml? */ + if(!out.b_php_out) { + XMLRPC_REQUEST xResponse = XMLRPC_RequestNew(); + if(xResponse) { + char *outBuf = 0; + int buf_len = 0; + + /* automagically determine output serialization type from request type */ + if (out.b_auto_version) { + XMLRPC_REQUEST_OUTPUT_OPTIONS opts = XMLRPC_RequestGetOutputOptions(xRequest); + if (opts) { + out.xmlrpc_out.version = opts->version; + } + } + /* set some required request hoojum */ + XMLRPC_RequestSetOutputOptions(xResponse, &out.xmlrpc_out); + XMLRPC_RequestSetRequestType(xResponse, xmlrpc_request_response); + XMLRPC_RequestSetData(xResponse, xAnswer); + XMLRPC_RequestSetMethodName(xResponse, methodname); + + /* generate xml */ + outBuf = XMLRPC_REQUEST_ToXML(xResponse, &buf_len); + if(outBuf) { + RETVAL_STRINGL(outBuf, buf_len, 1); + free(outBuf); + } + /* cleanup after ourselves. what a sty! */ + XMLRPC_RequestFree(xResponse, 0); + } + } else { /* or as native php types? */ + *return_value = *data.return_data; + zval_copy_ctor(return_value); + } + + /* cleanup after ourselves. what a sty! */ + zval_dtor(data.xmlrpc_method); + FREE_ZVAL(data.xmlrpc_method); + zval_dtor(data.return_data); + FREE_ZVAL(data.return_data); + + if(xAnswer) { + XMLRPC_CleanupValue(xAnswer); + } + + XMLRPC_RequestFree(xRequest, 1); + } + } +} +/* }}} */ + + +/* {{{ proto int xmlrpc_server_add_introspection_data(resource server, array desc) + Adds introspection documentation */ +PHP_FUNCTION(xmlrpc_server_add_introspection_data) +{ + zval **handle, **desc; + int type; + xmlrpc_server_data* server; + + if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &handle, &desc) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + server = zend_list_find(Z_LVAL_PP(handle), &type); + + if (type == le_xmlrpc_server) { + XMLRPC_VALUE xDesc = PHP_to_XMLRPC(NULL, *desc); + if (xDesc) { + int retval = XMLRPC_ServerAddIntrospectionData(server->server_ptr, xDesc); + XMLRPC_CleanupValue(xDesc); + RETURN_LONG(retval); + } + } + RETURN_LONG(0); +} +/* }}} */ + + +/* {{{ proto array xmlrpc_parse_method_descriptions(string xml) + Decodes XML into a list of method descriptions */ +PHP_FUNCTION(xmlrpc_parse_method_descriptions) +{ + zval **arg1, *retval; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg1) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(arg1); + + if(return_value_used) { + STRUCT_XMLRPC_ERROR err = {0}; + XMLRPC_VALUE xVal = XMLRPC_IntrospectionCreateDescription(Z_STRVAL_PP(arg1), &err); + if(xVal) { + retval = XMLRPC_to_PHP(xVal); + + if(retval) { + *return_value = *retval; + zval_copy_ctor(return_value); + } + /* dust, sweep, and mop */ + XMLRPC_CleanupValue(xVal); + } else { + /* could not create description */ + if(err.xml_elem_error.parser_code) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to create introspection data", + err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid xml structure. Unable to create introspection data"); + } + + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error. no method description created"); + } + } +} +/* }}} */ + + +/************ +* type data * +************/ + +#define XMLRPC_TYPE_COUNT 10 +#define XMLRPC_VECTOR_TYPE_COUNT 4 +#define TYPE_STR_MAP_SIZE (XMLRPC_TYPE_COUNT + XMLRPC_VECTOR_TYPE_COUNT) + +/* return a string matching a given xmlrpc type */ +static const char** get_type_str_mapping(void) +{ + static const char* str_mapping[TYPE_STR_MAP_SIZE]; + static int first = 1; + if (first) { + /* warning. do not add/delete without changing size define */ + str_mapping[xmlrpc_none] = "none"; + str_mapping[xmlrpc_empty] = "empty"; + str_mapping[xmlrpc_nil] = "nil"; + str_mapping[xmlrpc_base64] = "base64"; + str_mapping[xmlrpc_boolean] = "boolean"; + str_mapping[xmlrpc_datetime] = "datetime"; + str_mapping[xmlrpc_double] = "double"; + str_mapping[xmlrpc_int] = "int"; + str_mapping[xmlrpc_string] = "string"; + str_mapping[xmlrpc_vector] = "vector"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_none] = "none"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_array] = "array"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_mixed] = "mixed"; + str_mapping[XMLRPC_TYPE_COUNT + xmlrpc_vector_struct] = "struct"; + first = 0; + } + return (const char**)str_mapping; +} + +/* map an xmlrpc type to a string */ +const char* xmlrpc_type_as_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype) +{ + const char** str_mapping = get_type_str_mapping(); + + if (vtype == xmlrpc_vector_none) { + return str_mapping[type]; + } else { + return str_mapping[XMLRPC_TYPE_COUNT + vtype]; + } +} + +/* map a string to an xmlrpc type */ +XMLRPC_VALUE_TYPE xmlrpc_str_as_type(const char* str) +{ + const char** str_mapping = get_type_str_mapping(); + int i; + + if (str) { + for (i = 0; i < XMLRPC_TYPE_COUNT; i++) { + if (!strcmp(str_mapping[i], str)) { + return (XMLRPC_VALUE_TYPE) i; + } + } + } + return xmlrpc_none; +} + +/* map a string to an xmlrpc vector type */ +XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str) +{ + const char** str_mapping = get_type_str_mapping(); + int i; + + if (str) { + for (i = XMLRPC_TYPE_COUNT; i < TYPE_STR_MAP_SIZE; i++) { + if (!strcmp(str_mapping[i], str)) { + return (XMLRPC_VECTOR_TYPE) (i - XMLRPC_TYPE_COUNT); + } + } + } + return xmlrpc_none; +} + + +/* set a given value to a particular type. + * note: this only works on strings, and only for date and base64, + * which do not have native php types. black magic lies herein. + */ +int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) +{ + int bSuccess = FAILURE; + TSRMLS_FETCH(); + + /* we only really care about strings because they can represent + * base64 and datetime. all other types have corresponding php types + */ + if (Z_TYPE_P(value) == IS_STRING) { + if (newtype == xmlrpc_base64 || newtype == xmlrpc_datetime) { + const char* typestr = xmlrpc_type_as_str(newtype, xmlrpc_vector_none); + zval* type; + + MAKE_STD_ZVAL(type); + + Z_TYPE_P(type) = IS_STRING; + Z_STRVAL_P(type) = estrdup(typestr); + Z_STRLEN_P(type) = strlen(typestr); + + if(newtype == xmlrpc_datetime) { + XMLRPC_VALUE v = XMLRPC_CreateValueDateTime_ISO8601(NULL, value->value.str.val); + if(v) { + time_t timestamp = XMLRPC_GetValueDateTime(v); + if(timestamp) { + pval* ztimestamp; + + MAKE_STD_ZVAL(ztimestamp); + + ztimestamp->type = IS_LONG; + ztimestamp->value.lval = timestamp; + + convert_to_object(value); + if(SUCCESS == zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL)) { + bSuccess = zend_hash_update(Z_OBJPROP_P(value), OBJECT_VALUE_TS_ATTR, sizeof(OBJECT_VALUE_TS_ATTR), (void *) &ztimestamp, sizeof(zval *), NULL); + } + } + XMLRPC_CleanupValue(v); + } + } + else { + convert_to_object(value); + bSuccess = zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL); + } + } + } + + return bSuccess; +} + +/* return xmlrpc type of a php value */ +XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(php_output_options* out, zval* value, zval** newvalue) +{ + XMLRPC_VALUE_TYPE type = xmlrpc_none; + TSRMLS_FETCH(); + XMLRPCLS_FETCH(); + + if (value) { + switch (Z_TYPE_P(value)) { + case IS_NULL: + if (XMLRPCG(allow_null) || (out && out->b_allow_null)) { + type = xmlrpc_nil; + } else { + type = xmlrpc_string; + } + break; +#ifndef BOOL_AS_LONG + + /* Right thing to do, but it breaks some legacy code. */ + case IS_BOOL: + type = xmlrpc_boolean; + break; +#else + case IS_BOOL: +#endif + case IS_LONG: + case IS_RESOURCE: + type = xmlrpc_int; + break; + case IS_DOUBLE: + type = xmlrpc_double; + break; + case IS_CONSTANT: + type = xmlrpc_string; + break; + case IS_STRING: + type = xmlrpc_string; + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: + type = xmlrpc_vector; + break; + case IS_OBJECT: + { + zval** attr; + type = xmlrpc_vector; + + if (zend_hash_find(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void**) &attr) == SUCCESS) { + if (Z_TYPE_PP(attr) == IS_STRING) { + type = xmlrpc_str_as_type(Z_STRVAL_PP(attr)); + } + } + break; + } + } + + /* if requested, return an unmolested (magic removed) copy of the value */ + if (newvalue) { + zval** val; + + if ((type == xmlrpc_base64 && Z_TYPE_P(value) != IS_NULL) || type == xmlrpc_datetime) { + if (zend_hash_find(Z_OBJPROP_P(value), OBJECT_VALUE_ATTR, sizeof(OBJECT_VALUE_ATTR), (void**) &val) == SUCCESS) { + *newvalue = *val; + } + } else { + *newvalue = value; + } + } + } + + return type; +} + + +/* {{{ proto bool xmlrpc_set_type(string value, string type) + Sets xmlrpc type, base64 or datetime or nil, for a PHP string value */ +PHP_FUNCTION(xmlrpc_set_type) +{ + zval **arg, **type; + XMLRPC_VALUE_TYPE vtype; + + if (ZEND_NUM_ARGS() != 2 || (zend_get_parameters_ex(2, &arg, &type) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(type); + vtype = xmlrpc_str_as_type(Z_STRVAL_PP(type)); + if (vtype != xmlrpc_none) { + if (set_zval_xmlrpc_type(*arg, vtype) == SUCCESS) { + RETURN_TRUE; + } + } else { + zend_error(E_WARNING,"invalid type '%s' passed to xmlrpc_set_type()", Z_STRVAL_PP(type)); + } + RETURN_FALSE; +} +/* }}} */ + +/* {{{ proto string xmlrpc_get_type(mixed value) + Gets xmlrpc type for a PHP value. Especially useful for base64 and datetime strings */ +PHP_FUNCTION(xmlrpc_get_type) +{ + zval **arg; + XMLRPC_VALUE_TYPE type; + XMLRPC_VECTOR_TYPE vtype = xmlrpc_vector_none; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + type = get_zval_xmlrpc_type(NULL, *arg, 0); + if (type == xmlrpc_vector) { + vtype = determine_vector_type(Z_ARRVAL_PP(arg)); + } + + RETURN_STRING((char*) xmlrpc_type_as_str(type, vtype), 1); +} +/* }}} */ + +/* {{{ proto bool xmlrpc_is_fault(array) + Determines if an array value represents an XMLRPC fault. */ +PHP_FUNCTION(xmlrpc_is_fault) +{ + zval **arg, **val; + + if (ZEND_NUM_ARGS() != 1 || (zend_get_parameters_ex(1, &arg) == FAILURE)) { + WRONG_PARAM_COUNT; + } + + if (Z_TYPE_PP(arg) != IS_ARRAY) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Array argument expected"); + } else { + /* The "correct" way to do this would be to call the xmlrpc + * library XMLRPC_ValueIsFault() func. However, doing that + * would require us to create an xmlrpc value from the php + * array, which is rather expensive, especially if it was + * a big array. Thus, we resort to this not so clever hackery. + */ + if (zend_hash_find(Z_ARRVAL_PP(arg), FAULT_CODE, FAULT_CODE_LEN + 1, (void**) &val) == SUCCESS && + zend_hash_find(Z_ARRVAL_PP(arg), FAULT_STRING, FAULT_STRING_LEN + 1, (void**) &val) == SUCCESS) { + RETURN_TRUE; + } + } + + RETURN_FALSE; +} +/* }}} */ + + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + diff --git a/trunk/php/xmlrpc/xmlrpc.dsp b/trunk/php/xmlrpc/xmlrpc.dsp new file mode 100644 index 0000000..8c455d3 --- /dev/null +++ b/trunk/php/xmlrpc/xmlrpc.dsp @@ -0,0 +1,211 @@ +# Microsoft Developer Studio Project File - Name="xmlrpc" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=xmlrpc - Win32 Debug_TS +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "xmlrpc.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "xmlrpc.mak" CFG="xmlrpc - Win32 Debug_TS" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "xmlrpc - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "xmlrpc - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "xmlrpc - Win32 Debug_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug_TS" +# PROP BASE Intermediate_Dir "Debug_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_TS" +# PROP Intermediate_Dir "Debug_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "libxmlrpc" /I "..\..\bundle\expat" /D HAVE_XMLRPC=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D ZEND_DEBUG=1 /D ZTS=1 /D COMPILE_DL_XMLRPC=1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x1009 /d "_DEBUG" +# ADD RSC /l 0x1009 /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 /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 php5ts_debug.lib expat.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 /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_xmlrpc.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" + +!ELSEIF "$(CFG)" == "xmlrpc - Win32 Release_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_TS" +# PROP BASE Intermediate_Dir "Release_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_TS" +# PROP Intermediate_Dir "Release_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "libxmlrpc" /I "..\..\bundle\expat" /D HAVE_XMLRPC=1 /D "ZEND_WIN32" /D ZEND_DEBUG=0 /D "PHP_WIN32" /D ZTS=1 /D COMPILE_DL_XMLRPC=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "XMLRPC_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x1009 /d "NDEBUG" +# ADD RSC /l 0x1009 /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 /nologo /dll /machine:I386 +# ADD LINK32 php5ts.lib expat.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 /dll /machine:I386 /out:"..\..\Release_TS/php_xmlrpc.dll" /libpath:"..\..\Release_TS" + +!ENDIF + +# Begin Target + +# Name "xmlrpc - Win32 Debug_TS" +# Name "xmlrpc - Win32 Release_TS" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=".\xmlrpc-epi-php.c" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\php_xmlrpc.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Group "libxmlrpc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\libxmlrpc\base64.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\base64.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\encodings.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\encodings.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\queue.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\queue.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\simplestring.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\simplestring.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\system_methods.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\system_methods_private.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_element.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_element.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_dandarpc.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_dandarpc.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_soap.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_soap.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_xmlrpc.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xml_to_xmlrpc.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_introspection.c +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_introspection.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_introspection_private.h +# End Source File +# Begin Source File + +SOURCE=.\libxmlrpc\xmlrpc_private.h +# End Source File +# End Group +# End Target +# End Project diff --git a/trunk/planetlab4.sql b/trunk/planetlab4.sql new file mode 100644 index 0000000..8bfb42a --- /dev/null +++ b/trunk/planetlab4.sql @@ -0,0 +1,1152 @@ +-- +-- PlanetLab Central database schema +-- Version 4, PostgreSQL +-- +-- Aaron Klingaman +-- Reid Moran +-- Mark Huang +-- Tony Mack +-- +-- Copyright (C) 2006 The Trustees of Princeton University +-- +-- $Id$ +-- + +SET client_encoding = 'UNICODE'; + +-------------------------------------------------------------------------------- +-- Aggregates and store procedures +-------------------------------------------------------------------------------- + +-- Like MySQL GROUP_CONCAT(), this function aggregates values into a +-- PostgreSQL array. +CREATE AGGREGATE array_accum ( + sfunc = array_append, + basetype = anyelement, + stype = anyarray, + initcond = '{}' +); + +-------------------------------------------------------------------------------- +-- Version +-------------------------------------------------------------------------------- + +-- Database version +CREATE TABLE plc_db_version ( + version integer NOT NULL, + subversion integer NOT NULL DEFAULT 0 +) WITH OIDS; + +INSERT INTO plc_db_version (version, subversion) VALUES (4, 9); + +-------------------------------------------------------------------------------- +-- Accounts +-------------------------------------------------------------------------------- + +-- Accounts +CREATE TABLE persons ( + -- Mandatory + person_id serial PRIMARY KEY, -- Account identifier + email text NOT NULL, -- E-mail address + first_name text NOT NULL, -- First name + last_name text NOT NULL, -- Last name + deleted boolean NOT NULL DEFAULT false, -- Has been deleted + enabled boolean NOT NULL DEFAULT false, -- Has been disabled + + -- Password + password text NOT NULL DEFAULT 'nopass', -- Password (md5crypted) + verification_key text, -- Reset password key + verification_expires timestamp without time zone, + + -- Optional + title text, -- Honorific + phone text, -- Telephone number + url text, -- Home page + bio text, -- Biography + + -- Timestamps + date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP +) WITH OIDS; +CREATE INDEX persons_email_idx ON persons (email) WHERE deleted IS false; + +-------------------------------------------------------------------------------- +-- Sites +-------------------------------------------------------------------------------- + +-- Sites +CREATE TABLE sites ( + -- Mandatory + site_id serial PRIMARY KEY, -- Site identifier + login_base text NOT NULL, -- Site slice prefix + name text NOT NULL, -- Site name + abbreviated_name text NOT NULL, -- Site abbreviated name + enabled boolean NOT NULL Default true, -- Is this site enabled + deleted boolean NOT NULL DEFAULT false, -- Has been deleted + is_public boolean NOT NULL DEFAULT true, -- Shows up in public lists + max_slices integer NOT NULL DEFAULT 0, -- Maximum number of slices + max_slivers integer NOT NULL DEFAULT 1000, -- Maximum number of instantiated slivers + + -- Optional + latitude real, + longitude real, + url text, + ext_consortium_id integer, -- external consortium id + + -- Timestamps + date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP +) WITH OIDS; +CREATE INDEX sites_login_base_idx ON sites (login_base) WHERE deleted IS false; + +-- Account site membership +CREATE TABLE person_site ( + person_id integer REFERENCES persons NOT NULL, -- Account identifier + site_id integer REFERENCES sites NOT NULL, -- Site identifier + is_primary boolean NOT NULL DEFAULT false, -- Is the primary site for this account + PRIMARY KEY (person_id, site_id) +); +CREATE INDEX person_site_person_id_idx ON person_site (person_id); +CREATE INDEX person_site_site_id_idx ON person_site (site_id); + +-- Ordered by primary site first +CREATE VIEW person_site_ordered AS +SELECT person_id, site_id +FROM person_site +ORDER BY is_primary DESC; + +-- Sites that each person is a member of +CREATE VIEW person_sites AS +SELECT person_id, +array_accum(site_id) AS site_ids +FROM person_site_ordered +GROUP BY person_id; + +-- Accounts at each site +CREATE VIEW site_persons AS +SELECT site_id, +array_accum(person_id) AS person_ids +FROM person_site +GROUP BY site_id; + +-------------------------------------------------------------------------------- +-- Mailing Addresses +-------------------------------------------------------------------------------- + +CREATE TABLE address_types ( + address_type_id serial PRIMARY KEY, -- Address type identifier + name text UNIQUE NOT NULL, -- Address type + description text -- Address type description +) WITH OIDS; + +INSERT INTO address_types (name) VALUES ('Personal'); +INSERT INTO address_types (name) VALUES ('Shipping'); +-- XXX Used to be Site +INSERT INTO address_types (name) VALUES ('Billing'); + +-- Mailing addresses +CREATE TABLE addresses ( + address_id serial PRIMARY KEY, -- Address identifier + line1 text NOT NULL, -- Address line 1 + line2 text, -- Address line 2 + line3 text, -- Address line 3 + city text NOT NULL, -- City + state text NOT NULL, -- State or province + postalcode text NOT NULL, -- Postal code + country text NOT NULL -- Country +) WITH OIDS; + +-- Each mailing address can be one of several types +CREATE TABLE address_address_type ( + address_id integer REFERENCES addresses NOT NULL, -- Address identifier + address_type_id integer REFERENCES address_types NOT NULL, -- Address type + PRIMARY KEY (address_id, address_type_id) +) WITH OIDS; +CREATE INDEX address_address_type_address_id_idx ON address_address_type (address_id); +CREATE INDEX address_address_type_address_type_id_idx ON address_address_type (address_type_id); + +CREATE VIEW address_address_types AS +SELECT address_id, +array_accum(address_type_id) AS address_type_ids, +array_accum(address_types.name) AS address_types +FROM address_address_type +LEFT JOIN address_types USING (address_type_id) +GROUP BY address_id; + +CREATE TABLE site_address ( + site_id integer REFERENCES sites NOT NULL, -- Site identifier + address_id integer REFERENCES addresses NOT NULL, -- Address identifier + PRIMARY KEY (site_id, address_id) +) WITH OIDS; +CREATE INDEX site_address_site_id_idx ON site_address (site_id); +CREATE INDEX site_address_address_id_idx ON site_address (address_id); + +CREATE VIEW site_addresses AS +SELECT site_id, +array_accum(address_id) AS address_ids +FROM site_address +GROUP BY site_id; + +-------------------------------------------------------------------------------- +-- Authentication Keys +-------------------------------------------------------------------------------- + +-- Valid key types +CREATE TABLE key_types ( + key_type text PRIMARY KEY -- Key type +) WITH OIDS; +INSERT INTO key_types (key_type) VALUES ('ssh'); + +-- Authentication keys +CREATE TABLE keys ( + key_id serial PRIMARY KEY, -- Key identifier + key_type text REFERENCES key_types NOT NULL, -- Key type + key text NOT NULL, -- Key material + is_blacklisted boolean NOT NULL DEFAULT false -- Has been blacklisted +) WITH OIDS; + +-- Account authentication key(s) +CREATE TABLE person_key ( + key_id integer REFERENCES keys PRIMARY KEY, -- Key identifier + person_id integer REFERENCES persons NOT NULL -- Account identifier +) WITH OIDS; +CREATE INDEX person_key_person_id_idx ON person_key (person_id); + +CREATE VIEW person_keys AS +SELECT person_id, +array_accum(key_id) AS key_ids +FROM person_key +GROUP BY person_id; + +-------------------------------------------------------------------------------- +-- Account roles +-------------------------------------------------------------------------------- + +-- Valid account roles +CREATE TABLE roles ( + role_id integer PRIMARY KEY, -- Role identifier + name text UNIQUE NOT NULL -- Role symbolic name +) WITH OIDS; +INSERT INTO roles (role_id, name) VALUES (10, 'admin'); +INSERT INTO roles (role_id, name) VALUES (20, 'pi'); +INSERT INTO roles (role_id, name) VALUES (30, 'user'); +INSERT INTO roles (role_id, name) VALUES (40, 'tech'); + +CREATE TABLE person_role ( + person_id integer REFERENCES persons NOT NULL, -- Account identifier + role_id integer REFERENCES roles NOT NULL, -- Role identifier + PRIMARY KEY (person_id, role_id) +) WITH OIDS; +CREATE INDEX person_role_person_id_idx ON person_role (person_id); + +-- Account roles +CREATE VIEW person_roles AS +SELECT person_id, +array_accum(role_id) AS role_ids, +array_accum(roles.name) AS roles +FROM person_role +LEFT JOIN roles USING (role_id) +GROUP BY person_id; + +-------------------------------------------------------------------------------- +-- Nodes +-------------------------------------------------------------------------------- + +-- Valid node boot states +CREATE TABLE boot_states ( + boot_state text PRIMARY KEY +) WITH OIDS; +INSERT INTO boot_states (boot_state) VALUES ('boot'); +INSERT INTO boot_states (boot_state) VALUES ('dbg'); +INSERT INTO boot_states (boot_state) VALUES ('inst'); +INSERT INTO boot_states (boot_state) VALUES ('rins'); +INSERT INTO boot_states (boot_state) VALUES ('rcnf'); +INSERT INTO boot_states (boot_state) VALUES ('new'); + +-- Nodes +CREATE TABLE nodes ( + -- Mandatory + node_id serial PRIMARY KEY, -- Node identifier + hostname text NOT NULL, -- Node hostname + site_id integer REFERENCES sites NOT NULL, -- At which site + + boot_state text REFERENCES boot_states NOT NULL DEFAULT 'inst', -- Node boot state + deleted boolean NOT NULL DEFAULT false, -- Is deleted + + -- Optional + model text, -- Hardware make and model + boot_nonce text, -- Random nonce updated by Boot Manager + version text, -- Boot CD version string updated by Boot Manager + ssh_rsa_key text, -- SSH host key updated by Boot Manager + key text, -- Node key generated by API when configuration file is downloaded + + -- Timestamps + date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_contact timestamp without time zone +) WITH OIDS; +CREATE INDEX nodes_hostname_idx ON nodes (hostname) WHERE deleted IS false; +CREATE INDEX nodes_site_id_idx ON nodes (site_id) WHERE deleted IS false; + +-- Nodes at each site +CREATE VIEW site_nodes AS +SELECT site_id, +array_accum(node_id) AS node_ids +FROM nodes +WHERE deleted IS false +GROUP BY site_id; + +-------------------------------------------------------------------------------- +-- Node groups +-------------------------------------------------------------------------------- + +-- Node groups +CREATE TABLE nodegroups ( + nodegroup_id serial PRIMARY KEY, -- Group identifier + name text UNIQUE NOT NULL, -- Group name + description text -- Group description +) WITH OIDS; + +-- Node group membership +CREATE TABLE nodegroup_node ( + nodegroup_id integer REFERENCES nodegroups NOT NULL, -- Group identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + PRIMARY KEY (nodegroup_id, node_id) +) WITH OIDS; +CREATE INDEX nodegroup_node_nodegroup_id_idx ON nodegroup_node (nodegroup_id); +CREATE INDEX nodegroup_node_node_id_idx ON nodegroup_node (node_id); + +-- Nodes in each node group +CREATE VIEW nodegroup_nodes AS +SELECT nodegroup_id, +array_accum(node_id) AS node_ids +FROM nodegroup_node +GROUP BY nodegroup_id; + +-- Node groups that each node is a member of +CREATE VIEW node_nodegroups AS +SELECT node_id, +array_accum(nodegroup_id) AS nodegroup_ids +FROM nodegroup_node +GROUP BY node_id; + +-------------------------------------------------------------------------------- +-- Node configuration files +-------------------------------------------------------------------------------- + +CREATE TABLE conf_files ( + conf_file_id serial PRIMARY KEY, -- Configuration file identifier + enabled bool NOT NULL DEFAULT true, -- Configuration file is active + source text NOT NULL, -- Relative path on the boot server where file can be downloaded + dest text NOT NULL, -- Absolute path where file should be installed + file_permissions text NOT NULL DEFAULT '0644', -- chmod(1) permissions + file_owner text NOT NULL DEFAULT 'root', -- chown(1) owner + file_group text NOT NULL DEFAULT 'root', -- chgrp(1) owner + preinstall_cmd text, -- Shell command to execute prior to installing + postinstall_cmd text, -- Shell command to execute after installing + error_cmd text, -- Shell command to execute if any error occurs + ignore_cmd_errors bool NOT NULL DEFAULT false, -- Install file anyway even if an error occurs + always_update bool NOT NULL DEFAULT false -- Always attempt to install file even if unchanged +); + +CREATE TABLE conf_file_node ( + conf_file_id integer REFERENCES conf_files NOT NULL, -- Configuration file identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + PRIMARY KEY (conf_file_id, node_id) +); +CREATE INDEX conf_file_node_conf_file_id_idx ON conf_file_node (conf_file_id); +CREATE INDEX conf_file_node_node_id_idx ON conf_file_node (node_id); + +-- Nodes linked to each configuration file +CREATE VIEW conf_file_nodes AS +SELECT conf_file_id, +array_accum(node_id) AS node_ids +FROM conf_file_node +GROUP BY conf_file_id; + +-- Configuration files linked to each node +CREATE VIEW node_conf_files AS +SELECT node_id, +array_accum(conf_file_id) AS conf_file_ids +FROM conf_file_node +GROUP BY node_id; + +CREATE TABLE conf_file_nodegroup ( + conf_file_id integer REFERENCES conf_files NOT NULL, -- Configuration file identifier + nodegroup_id integer REFERENCES nodegroups NOT NULL, -- Node group identifier + PRIMARY KEY (conf_file_id, nodegroup_id) +); +CREATE INDEX conf_file_nodegroup_conf_file_id_idx ON conf_file_nodegroup (conf_file_id); +CREATE INDEX conf_file_nodegroup_nodegroup_id_idx ON conf_file_nodegroup (nodegroup_id); + +-- Node groups linked to each configuration file +CREATE VIEW conf_file_nodegroups AS +SELECT conf_file_id, +array_accum(nodegroup_id) AS nodegroup_ids +FROM conf_file_nodegroup +GROUP BY conf_file_id; + +-- Configuration files linked to each node group +CREATE VIEW nodegroup_conf_files AS +SELECT nodegroup_id, +array_accum(conf_file_id) AS conf_file_ids +FROM conf_file_nodegroup +GROUP BY nodegroup_id; + +-------------------------------------------------------------------------------- +-- Node network interfaces +-------------------------------------------------------------------------------- + +-- Valid network addressing schemes +CREATE TABLE network_types ( + type text PRIMARY KEY -- Addressing scheme +) WITH OIDS; +INSERT INTO network_types (type) VALUES ('ipv4'); + +-- Valid network configuration methods +CREATE TABLE network_methods ( + method text PRIMARY KEY -- Configuration method +) WITH OIDS; +INSERT INTO network_methods (method) VALUES ('static'); +INSERT INTO network_methods (method) VALUES ('dhcp'); +INSERT INTO network_methods (method) VALUES ('proxy'); +INSERT INTO network_methods (method) VALUES ('tap'); +INSERT INTO network_methods (method) VALUES ('ipmi'); +INSERT INTO network_methods (method) VALUES ('unknown'); + +-- Node network interfaces +CREATE TABLE nodenetworks ( + -- Mandatory + nodenetwork_id serial PRIMARY KEY, -- Network interface identifier + node_id integer REFERENCES nodes NOT NULL, -- Which node + is_primary boolean NOT NULL DEFAULT false, -- Is the primary interface for this node + type text REFERENCES network_types NOT NULL, -- Addressing scheme + method text REFERENCES network_methods NOT NULL, -- Configuration method + + -- Optional, depending on type and method + ip text, -- IP address + mac text, -- MAC address + gateway text, -- Default gateway address + network text, -- Network address + broadcast text, -- Network broadcast address + netmask text, -- Network mask + dns1 text, -- Primary DNS server + dns2 text, -- Secondary DNS server + bwlimit integer, -- Bandwidth limit in bps + hostname text -- Hostname of this interface +) WITH OIDS; +CREATE INDEX nodenetworks_node_id_idx ON nodenetworks (node_id); + +-- Ordered by primary interface first +CREATE VIEW nodenetworks_ordered AS +SELECT node_id, nodenetwork_id +FROM nodenetworks +ORDER BY is_primary DESC; + +-- Network interfaces on each node +CREATE VIEW node_nodenetworks AS +SELECT node_id, +array_accum(nodenetwork_id) AS nodenetwork_ids +FROM nodenetworks_ordered +GROUP BY node_id; + +-------------------------------------------------------------------------------- +-- Nodenetwork setting types and nodenetworks settings +-------------------------------------------------------------------------------- + +CREATE TABLE nodenetwork_setting_types ( + nodenetwork_setting_type_id serial PRIMARY KEY, + -- Setting Type Identifier + name text UNIQUE NOT NULL, -- Setting Name + description text, -- Optional Description + category text NOT NULL, -- Category, e.g. Wifi, or whatever + min_role_id integer references roles -- If set, minimal role required +) WITH OIDS; + +CREATE TABLE nodenetwork_setting ( + nodenetwork_setting_id serial PRIMARY KEY, -- Nodenetwork Setting Identifier + nodenetwork_id integer REFERENCES nodenetworks NOT NULL, + -- the nodenetwork this applies to + nodenetwork_setting_type_id integer REFERENCES nodenetwork_setting_types NOT NULL, + -- the setting type + value text +) WITH OIDS; + +CREATE OR REPLACE VIEW nodenetwork_settings AS +SELECT nodenetwork_id, +array_accum(nodenetwork_setting_id) AS nodenetwork_setting_ids +FROM nodenetwork_setting +GROUP BY nodenetwork_id; + +CREATE OR REPLACE VIEW view_nodenetwork_settings AS +SELECT +nodenetwork_setting.nodenetwork_setting_id, +nodenetwork_setting.nodenetwork_id, +nodenetwork_setting_types.nodenetwork_setting_type_id, +nodenetwork_setting_types.name, +nodenetwork_setting_types.description, +nodenetwork_setting_types.category, +nodenetwork_setting_types.min_role_id, +nodenetwork_setting.value +FROM nodenetwork_setting +INNER JOIN nodenetwork_setting_types USING (nodenetwork_setting_type_id); + +CREATE OR REPLACE VIEW view_nodenetworks AS +SELECT +nodenetworks.nodenetwork_id, +nodenetworks.node_id, +nodenetworks.is_primary, +nodenetworks.type, +nodenetworks.method, +nodenetworks.ip, +nodenetworks.mac, +nodenetworks.gateway, +nodenetworks.network, +nodenetworks.broadcast, +nodenetworks.netmask, +nodenetworks.dns1, +nodenetworks.dns2, +nodenetworks.bwlimit, +nodenetworks.hostname, +COALESCE((SELECT nodenetwork_setting_ids FROM nodenetwork_settings WHERE nodenetwork_settings.nodenetwork_id = nodenetworks.nodenetwork_id), '{}') AS nodenetwork_setting_ids +FROM nodenetworks; + +-------------------------------------------------------------------------------- +-- Power control units (PCUs) +-------------------------------------------------------------------------------- + +CREATE TABLE pcus ( + -- Mandatory + pcu_id serial PRIMARY KEY, -- PCU identifier + site_id integer REFERENCES sites NOT NULL, -- Site identifier + hostname text, -- Hostname, not necessarily unique (multiple logical sites could use the same PCU) + ip text NOT NULL, -- IP, not necessarily unique + + -- Optional + protocol text, -- Protocol, e.g. ssh or https or telnet + username text, -- Username, if applicable + "password" text, -- Password, if applicable + model text, -- Model, e.g. BayTech or iPal + notes text -- Random notes +) WITH OIDS; +CREATE INDEX pcus_site_id_idx ON pcus (site_id); + +CREATE VIEW site_pcus AS +SELECT site_id, +array_accum(pcu_id) AS pcu_ids +FROM pcus +GROUP BY site_id; + +CREATE TABLE pcu_node ( + pcu_id integer REFERENCES pcus NOT NULL, -- PCU identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + port integer NOT NULL, -- Port number + PRIMARY KEY (pcu_id, node_id), -- The same node cannot be controlled by different ports + UNIQUE (pcu_id, port) -- The same port cannot control multiple nodes +); +CREATE INDEX pcu_node_pcu_id_idx ON pcu_node (pcu_id); +CREATE INDEX pcu_node_node_id_idx ON pcu_node (node_id); + +CREATE VIEW node_pcus AS +SELECT node_id, +array_accum(pcu_id) AS pcu_ids, +array_accum(port) AS ports +FROM pcu_node +GROUP BY node_id; + +CREATE VIEW pcu_nodes AS +SELECT pcu_id, +array_accum(node_id) AS node_ids, +array_accum(port) AS ports +FROM pcu_node +GROUP BY pcu_id; + +-------------------------------------------------------------------------------- +-- Slices +-------------------------------------------------------------------------------- + +CREATE TABLE slice_instantiations ( + instantiation text PRIMARY KEY +) WITH OIDS; +INSERT INTO slice_instantiations (instantiation) VALUES ('not-instantiated'); -- Placeholder slice +INSERT INTO slice_instantiations (instantiation) VALUES ('plc-instantiated'); -- Instantiated by Node Manager +INSERT INTO slice_instantiations (instantiation) VALUES ('delegated'); -- Manually instantiated +INSERT INTO slice_instantiations (instantiation) VALUES ('nm-controller'); -- NM Controller + +-- Slices +CREATE TABLE slices ( + slice_id serial PRIMARY KEY, -- Slice identifier + site_id integer REFERENCES sites NOT NULL, -- Site identifier + + name text NOT NULL, -- Slice name + instantiation text REFERENCES slice_instantiations NOT NULL DEFAULT 'plc-instantiated', -- Slice state, e.g. plc-instantiated + url text, -- Project URL + description text, -- Project description + + max_nodes integer NOT NULL DEFAULT 100, -- Maximum number of nodes that can be assigned to this slice + + creator_person_id integer REFERENCES persons, -- Creator + created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Creation date + expires timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + '2 weeks', -- Expiration date + + is_deleted boolean NOT NULL DEFAULT false +) WITH OIDS; +CREATE INDEX slices_site_id_idx ON slices (site_id) WHERE is_deleted IS false; +CREATE INDEX slices_name_idx ON slices (name) WHERE is_deleted IS false; + +-- Slivers +CREATE TABLE slice_node ( + slice_id integer REFERENCES slices NOT NULL, -- Slice identifier + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + PRIMARY KEY (slice_id, node_id) +) WITH OIDS; +CREATE INDEX slice_node_slice_id_idx ON slice_node (slice_id); +CREATE INDEX slice_node_node_id_idx ON slice_node (node_id); + +-- Synonym for slice_node +CREATE VIEW slivers AS +SELECT * FROM slice_node; + +-- Nodes in each slice +CREATE VIEW slice_nodes AS +SELECT slice_id, +array_accum(node_id) AS node_ids +FROM slice_node +GROUP BY slice_id; + +-- Slices on each node +CREATE VIEW node_slices AS +SELECT node_id, +array_accum(slice_id) AS slice_ids +FROM slice_node +GROUP BY node_id; + +-- Slices at each site +CREATE VIEW site_slices AS +SELECT site_id, +array_accum(slice_id) AS slice_ids +FROM slices +WHERE is_deleted is false +GROUP BY site_id; + +-- Slice membership +CREATE TABLE slice_person ( + slice_id integer REFERENCES slices NOT NULL, -- Slice identifier + person_id integer REFERENCES persons NOT NULL, -- Account identifier + PRIMARY KEY (slice_id, person_id) +) WITH OIDS; +CREATE INDEX slice_person_slice_id_idx ON slice_person (slice_id); +CREATE INDEX slice_person_person_id_idx ON slice_person (person_id); + +-- Members of the slice +CREATE VIEW slice_persons AS +SELECT slice_id, +array_accum(person_id) AS person_ids +FROM slice_person +GROUP BY slice_id; + +-- Slices of which each person is a member +CREATE VIEW person_slices AS +SELECT person_id, +array_accum(slice_id) AS slice_ids +FROM slice_person +GROUP BY person_id; + +-------------------------------------------------------------------------------- +-- Slice whitelist +-------------------------------------------------------------------------------- +-- slice whitelist on nodes +CREATE TABLE node_slice_whitelist ( + node_id integer REFERENCES nodes NOT NULL, -- Node id of whitelist + slice_id integer REFERENCES slices NOT NULL, -- Slice id thats allowd on this node + PRIMARY KEY (node_id, slice_id) +) WITH OIDS; +CREATE INDEX node_slice_whitelist_node_id_idx ON node_slice_whitelist (node_id); +CREATE INDEX node_slice_whitelist_slice_id_idx ON node_slice_whitelist (slice_id); + +-- Slices on each node +CREATE VIEW node_slices_whitelist AS +SELECT node_id, +array_accum(slice_id) AS slice_ids_whitelist +FROM node_slice_whitelist +GROUP BY node_id; + +-------------------------------------------------------------------------------- +-- Slice attributes +-------------------------------------------------------------------------------- + +-- Slice attribute types +CREATE TABLE slice_attribute_types ( + attribute_type_id serial PRIMARY KEY, -- Attribute type identifier + name text UNIQUE NOT NULL, -- Attribute name + description text, -- Attribute description + min_role_id integer REFERENCES roles DEFAULT 10 -- If set, minimum (least powerful) role that can set or change this attribute +) WITH OIDS; + +-- Slice/sliver attributes +CREATE TABLE slice_attribute ( + slice_attribute_id serial PRIMARY KEY, -- Slice attribute identifier + slice_id integer REFERENCES slices NOT NULL, -- Slice identifier + node_id integer REFERENCES nodes, -- Sliver attribute if set + nodegroup_id integer REFERENCES nodegroups, -- Node group attribute if set + attribute_type_id integer REFERENCES slice_attribute_types NOT NULL, -- Attribute type identifier + value text +) WITH OIDS; +CREATE INDEX slice_attribute_slice_id_idx ON slice_attribute (slice_id); +CREATE INDEX slice_attribute_node_id_idx ON slice_attribute (node_id); +CREATE INDEX slice_attribute_nodegroup_id_idx ON slice_attribute (nodegroup_id); + +CREATE VIEW slice_attributes AS +SELECT slice_id, +array_accum(slice_attribute_id) AS slice_attribute_ids +FROM slice_attribute +GROUP BY slice_id; + +-------------------------------------------------------------------------------- +-- Initscripts +-------------------------------------------------------------------------------- + +-- Initscripts +CREATE TABLE initscripts ( + initscript_id serial PRIMARY KEY, -- Initscript identifier + name text NOT NULL, -- Initscript name + enabled bool NOT NULL DEFAULT true, -- Initscript is active + script text NOT NULL, -- Initscript + UNIQUE (name) +) WITH OIDS; +CREATE INDEX initscripts_name_idx ON initscripts (name); + + +-------------------------------------------------------------------------------- +-- Peers +-------------------------------------------------------------------------------- + +-- Peers +CREATE TABLE peers ( + peer_id serial PRIMARY KEY, -- Peer identifier + peername text NOT NULL, -- Peer name + peer_url text NOT NULL, -- (HTTPS) URL of the peer PLCAPI interface + cacert text, -- (SSL) Public certificate of peer API server + key text, -- (GPG) Public key used for authentication + deleted boolean NOT NULL DEFAULT false +) WITH OIDS; +CREATE INDEX peers_peername_idx ON peers (peername) WHERE deleted IS false; + +-- Objects at each peer +CREATE TABLE peer_site ( + site_id integer REFERENCES sites PRIMARY KEY, -- Local site identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_site_id integer NOT NULL, -- Foreign site identifier at peer + UNIQUE (peer_id, peer_site_id) -- The same foreign site should not be cached twice +) WITH OIDS; +CREATE INDEX peer_site_peer_id_idx ON peers (peer_id); + +CREATE VIEW peer_sites AS +SELECT peer_id, +array_accum(site_id) AS site_ids, +array_accum(peer_site_id) AS peer_site_ids +FROM peer_site +GROUP BY peer_id; + +CREATE TABLE peer_person ( + person_id integer REFERENCES persons PRIMARY KEY, -- Local user identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_person_id integer NOT NULL, -- Foreign user identifier at peer + UNIQUE (peer_id, peer_person_id) -- The same foreign user should not be cached twice +) WITH OIDS; +CREATE INDEX peer_person_peer_id_idx ON peer_person (peer_id); + +CREATE VIEW peer_persons AS +SELECT peer_id, +array_accum(person_id) AS person_ids, +array_accum(peer_person_id) AS peer_person_ids +FROM peer_person +GROUP BY peer_id; + +CREATE TABLE peer_key ( + key_id integer REFERENCES keys PRIMARY KEY, -- Local key identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_key_id integer NOT NULL, -- Foreign key identifier at peer + UNIQUE (peer_id, peer_key_id) -- The same foreign key should not be cached twice +) WITH OIDS; +CREATE INDEX peer_key_peer_id_idx ON peer_key (peer_id); + +CREATE VIEW peer_keys AS +SELECT peer_id, +array_accum(key_id) AS key_ids, +array_accum(peer_key_id) AS peer_key_ids +FROM peer_key +GROUP BY peer_id; + +CREATE TABLE peer_node ( + node_id integer REFERENCES nodes PRIMARY KEY, -- Local node identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_node_id integer NOT NULL, -- Foreign node identifier + UNIQUE (peer_id, peer_node_id) -- The same foreign node should not be cached twice +) WITH OIDS; +CREATE INDEX peer_node_peer_id_idx ON peer_node (peer_id); + +CREATE VIEW peer_nodes AS +SELECT peer_id, +array_accum(node_id) AS node_ids, +array_accum(peer_node_id) AS peer_node_ids +FROM peer_node +GROUP BY peer_id; + +CREATE TABLE peer_slice ( + slice_id integer REFERENCES slices PRIMARY KEY, -- Local slice identifier + peer_id integer REFERENCES peers NOT NULL, -- Peer identifier + peer_slice_id integer NOT NULL, -- Slice identifier at peer + UNIQUE (peer_id, peer_slice_id) -- The same foreign slice should not be cached twice +) WITH OIDS; +CREATE INDEX peer_slice_peer_id_idx ON peer_slice (peer_id); + +CREATE VIEW peer_slices AS +SELECT peer_id, +array_accum(slice_id) AS slice_ids, +array_accum(peer_slice_id) AS peer_slice_ids +FROM peer_slice +GROUP BY peer_id; + +-------------------------------------------------------------------------------- +-- Authenticated sessions +-------------------------------------------------------------------------------- + +-- Authenticated sessions +CREATE TABLE sessions ( + session_id text PRIMARY KEY, -- Session identifier + expires timestamp without time zone +) WITH OIDS; + +-- People can have multiple sessions +CREATE TABLE person_session ( + person_id integer REFERENCES persons NOT NULL, -- Account identifier + session_id text REFERENCES sessions NOT NULL, -- Session identifier + PRIMARY KEY (person_id, session_id), + UNIQUE (session_id) -- Sessions are unique +) WITH OIDS; +CREATE INDEX person_session_person_id_idx ON person_session (person_id); + +-- Nodes can have only one session +CREATE TABLE node_session ( + node_id integer REFERENCES nodes NOT NULL, -- Node identifier + session_id text REFERENCES sessions NOT NULL, -- Session identifier + UNIQUE (node_id), -- Nodes can have only one session + UNIQUE (session_id) -- Sessions are unique +) WITH OIDS; + + + +------------------------------------------------------------------------------- +-- PCU Types +------------------------------------------------------------------------------ +CREATE TABLE pcu_types ( + pcu_type_id serial PRIMARY KEY, + model text NOT NULL , -- PCU model name + name text -- Full PCU model name +) WITH OIDS; +CREATE INDEX pcu_types_model_idx ON pcu_types (model); + +CREATE TABLE pcu_protocol_type ( + pcu_protocol_type_id serial PRIMARY KEY, + pcu_type_id integer REFERENCES pcu_types NOT NULL, -- PCU type identifier + port integer NOT NULL, -- PCU port + protocol text NOT NULL, -- Protocol + supported boolean NOT NULL DEFAULT True -- Does PLC support +) WITH OIDS; +CREATE INDEX pcu_protocol_type_pcu_type_id ON pcu_protocol_type (pcu_type_id); + + +CREATE OR REPLACE VIEW pcu_protocol_types AS +SELECT pcu_type_id, +array_accum(pcu_protocol_type_id) as pcu_protocol_type_ids +FROM pcu_protocol_type +GROUP BY pcu_type_id; + +-------------------------------------------------------------------------------- +-- Message templates +-------------------------------------------------------------------------------- + +CREATE TABLE messages ( + message_id text PRIMARY KEY, -- Message name + subject text, -- Message summary + template text, -- Message template + enabled bool NOT NULL DEFAULT true -- Whether message is enabled +) WITH OIDS; + +-------------------------------------------------------------------------------- +-- Events +-------------------------------------------------------------------------------- + +-- Events +CREATE TABLE events ( + event_id serial PRIMARY KEY, -- Event identifier + person_id integer REFERENCES persons, -- Person responsible for event, if any + node_id integer REFERENCES nodes, -- Node responsible for event, if any + auth_type text, -- Type of auth used. i.e. AuthMethod + fault_code integer NOT NULL DEFAULT 0, -- Did this event result in error + call_name text NOT NULL, -- Call responsible for this event + call text NOT NULL, -- Call responsible for this event, including parameters + message text, -- High level description of this event + runtime float DEFAULT 0, -- Event run time + time timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP -- Event timestamp +) WITH OIDS; + +-- Database object(s) that may have been affected by a particular event +CREATE TABLE event_object ( + event_id integer REFERENCES events NOT NULL, -- Event identifier + object_id integer NOT NULL, -- Object identifier + object_type text NOT NULL Default 'Unknown' -- What type of object is this event affecting +) WITH OIDS; +CREATE INDEX event_object_event_id_idx ON event_object (event_id); +CREATE INDEX event_object_object_id_idx ON event_object (object_id); +CREATE INDEX event_object_object_type_idx ON event_object (object_type); + +CREATE OR REPLACE VIEW event_objects AS +SELECT event_id, +array_accum(object_id) AS object_ids, +array_accum(object_type) AS object_types +FROM event_object +GROUP BY event_id; + +-------------------------------------------------------------------------------- +-- Useful views +-------------------------------------------------------------------------------- +CREATE OR REPLACE VIEW view_pcu_types AS +SELECT +pcu_types.pcu_type_id, +pcu_types.model, +pcu_types.name, +COALESCE((SELECT pcu_protocol_type_ids FROM pcu_protocol_types WHERE pcu_protocol_types.pcu_type_id = pcu_types.pcu_type_id), '{}') AS pcu_protocol_type_ids +FROM pcu_types; + +CREATE OR REPLACE VIEW view_events AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.auth_type, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +COALESCE((SELECT object_ids FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_ids, +COALESCE((SELECT object_types FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_types +FROM events; + +CREATE OR REPLACE VIEW view_event_objects AS +SELECT +events.event_id, +events.person_id, +events.node_id, +events.fault_code, +events.call_name, +events.call, +events.message, +events.runtime, +CAST(date_part('epoch', events.time) AS bigint) AS time, +event_object.object_id, +event_object.object_type +FROM events LEFT JOIN event_object USING (event_id); + +CREATE OR REPLACE VIEW view_persons AS +SELECT +persons.person_id, +persons.email, +persons.first_name, +persons.last_name, +persons.deleted, +persons.enabled, +persons.password, +persons.verification_key, +CAST(date_part('epoch', persons.verification_expires) AS bigint) AS verification_expires, +persons.title, +persons.phone, +persons.url, +persons.bio, +CAST(date_part('epoch', persons.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', persons.last_updated) AS bigint) AS last_updated, +peer_person.peer_id, +peer_person.peer_person_id, +COALESCE((SELECT role_ids FROM person_roles WHERE person_roles.person_id = persons.person_id), '{}') AS role_ids, +COALESCE((SELECT roles FROM person_roles WHERE person_roles.person_id = persons.person_id), '{}') AS roles, +COALESCE((SELECT site_ids FROM person_sites WHERE person_sites.person_id = persons.person_id), '{}') AS site_ids, +COALESCE((SELECT key_ids FROM person_keys WHERE person_keys.person_id = persons.person_id), '{}') AS key_ids, +COALESCE((SELECT slice_ids FROM person_slices WHERE person_slices.person_id = persons.person_id), '{}') AS slice_ids +FROM persons +LEFT JOIN peer_person USING (person_id); + +CREATE OR REPLACE VIEW view_peers AS +SELECT +peers.*, +COALESCE((SELECT site_ids FROM peer_sites WHERE peer_sites.peer_id = peers.peer_id), '{}') AS site_ids, +COALESCE((SELECT peer_site_ids FROM peer_sites WHERE peer_sites.peer_id = peers.peer_id), '{}') AS peer_site_ids, +COALESCE((SELECT person_ids FROM peer_persons WHERE peer_persons.peer_id = peers.peer_id), '{}') AS person_ids, +COALESCE((SELECT peer_person_ids FROM peer_persons WHERE peer_persons.peer_id = peers.peer_id), '{}') AS peer_person_ids, +COALESCE((SELECT key_ids FROM peer_keys WHERE peer_keys.peer_id = peers.peer_id), '{}') AS key_ids, +COALESCE((SELECT peer_key_ids FROM peer_keys WHERE peer_keys.peer_id = peers.peer_id), '{}') AS peer_key_ids, +COALESCE((SELECT node_ids FROM peer_nodes WHERE peer_nodes.peer_id = peers.peer_id), '{}') AS node_ids, +COALESCE((SELECT peer_node_ids FROM peer_nodes WHERE peer_nodes.peer_id = peers.peer_id), '{}') AS peer_node_ids, +COALESCE((SELECT slice_ids FROM peer_slices WHERE peer_slices.peer_id = peers.peer_id), '{}') AS slice_ids, +COALESCE((SELECT peer_slice_ids FROM peer_slices WHERE peer_slices.peer_id = peers.peer_id), '{}') AS peer_slice_ids +FROM peers; + +CREATE OR REPLACE VIEW view_nodes AS +SELECT +nodes.node_id, +nodes.hostname, +nodes.site_id, +nodes.boot_state, +nodes.deleted, +nodes.model, +nodes.boot_nonce, +nodes.version, +nodes.ssh_rsa_key, +nodes.key, +CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated, +CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact, +peer_node.peer_id, +peer_node.peer_node_id, +COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids, +COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids, +COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids, +COALESCE((SELECT slice_ids_whitelist FROM node_slices_whitelist WHERE node_slices_whitelist.node_id = nodes.node_id), '{}') AS slice_ids_whitelist, +COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids, +COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports, +COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids, +node_session.session_id AS session +FROM nodes +LEFT JOIN peer_node USING (node_id) +LEFT JOIN node_session USING (node_id); + +CREATE OR REPLACE VIEW view_nodegroups AS +SELECT +nodegroups.*, +COALESCE((SELECT node_ids FROM nodegroup_nodes WHERE nodegroup_nodes.nodegroup_id = nodegroups.nodegroup_id), '{}') AS node_ids, +COALESCE((SELECT conf_file_ids FROM nodegroup_conf_files WHERE nodegroup_conf_files.nodegroup_id = nodegroups.nodegroup_id), '{}') AS conf_file_ids +FROM nodegroups; + +CREATE OR REPLACE VIEW view_conf_files AS +SELECT +conf_files.*, +COALESCE((SELECT node_ids FROM conf_file_nodes WHERE conf_file_nodes.conf_file_id = conf_files.conf_file_id), '{}') AS node_ids, +COALESCE((SELECT nodegroup_ids FROM conf_file_nodegroups WHERE conf_file_nodegroups.conf_file_id = conf_files.conf_file_id), '{}') AS nodegroup_ids +FROM conf_files; + +CREATE OR REPLACE VIEW view_pcus AS +SELECT +pcus.*, +COALESCE((SELECT node_ids FROM pcu_nodes WHERE pcu_nodes.pcu_id = pcus.pcu_id), '{}') AS node_ids, +COALESCE((SELECT ports FROM pcu_nodes WHERE pcu_nodes.pcu_id = pcus.pcu_id), '{}') AS ports +FROM pcus; + +CREATE OR REPLACE VIEW view_sites AS +SELECT +sites.site_id, +sites.login_base, +sites.name, +sites.abbreviated_name, +sites.deleted, +sites.enabled, +sites.is_public, +sites.max_slices, +sites.max_slivers, +sites.latitude, +sites.longitude, +sites.url, +sites.ext_consortium_id, +CAST(date_part('epoch', sites.date_created) AS bigint) AS date_created, +CAST(date_part('epoch', sites.last_updated) AS bigint) AS last_updated, +peer_site.peer_id, +peer_site.peer_site_id, +COALESCE((SELECT person_ids FROM site_persons WHERE site_persons.site_id = sites.site_id), '{}') AS person_ids, +COALESCE((SELECT node_ids FROM site_nodes WHERE site_nodes.site_id = sites.site_id), '{}') AS node_ids, +COALESCE((SELECT address_ids FROM site_addresses WHERE site_addresses.site_id = sites.site_id), '{}') AS address_ids, +COALESCE((SELECT slice_ids FROM site_slices WHERE site_slices.site_id = sites.site_id), '{}') AS slice_ids, +COALESCE((SELECT pcu_ids FROM site_pcus WHERE site_pcus.site_id = sites.site_id), '{}') AS pcu_ids +FROM sites +LEFT JOIN peer_site USING (site_id); + +CREATE OR REPLACE VIEW view_addresses AS +SELECT +addresses.*, +COALESCE((SELECT address_type_ids FROM address_address_types WHERE address_address_types.address_id = addresses.address_id), '{}') AS address_type_ids, +COALESCE((SELECT address_types FROM address_address_types WHERE address_address_types.address_id = addresses.address_id), '{}') AS address_types +FROM addresses; + +CREATE OR REPLACE VIEW view_keys AS +SELECT +keys.*, +person_key.person_id, +peer_key.peer_id, +peer_key.peer_key_id +FROM keys +LEFT JOIN person_key USING (key_id) +LEFT JOIN peer_key USING (key_id); + +CREATE OR REPLACE VIEW view_slices AS +SELECT +slices.slice_id, +slices.site_id, +slices.name, +slices.instantiation, +slices.url, +slices.description, +slices.max_nodes, +slices.creator_person_id, +slices.is_deleted, +CAST(date_part('epoch', slices.created) AS bigint) AS created, +CAST(date_part('epoch', slices.expires) AS bigint) AS expires, +peer_slice.peer_id, +peer_slice.peer_slice_id, +COALESCE((SELECT node_ids FROM slice_nodes WHERE slice_nodes.slice_id = slices.slice_id), '{}') AS node_ids, +COALESCE((SELECT person_ids FROM slice_persons WHERE slice_persons.slice_id = slices.slice_id), '{}') AS person_ids, +COALESCE((SELECT slice_attribute_ids FROM slice_attributes WHERE slice_attributes.slice_id = slices.slice_id), '{}') AS slice_attribute_ids +FROM slices +LEFT JOIN peer_slice USING (slice_id); + +CREATE OR REPLACE VIEW view_slice_attributes AS +SELECT +slice_attribute.slice_attribute_id, +slice_attribute.slice_id, +slice_attribute.node_id, +slice_attribute.nodegroup_id, +slice_attribute_types.attribute_type_id, +slice_attribute_types.name, +slice_attribute_types.description, +slice_attribute_types.min_role_id, +slice_attribute.value +FROM slice_attribute +INNER JOIN slice_attribute_types USING (attribute_type_id); + +CREATE OR REPLACE VIEW view_sessions AS +SELECT +sessions.session_id, +CAST(date_part('epoch', sessions.expires) AS bigint) AS expires, +person_session.person_id, +node_session.node_id +FROM sessions +LEFT JOIN person_session USING (session_id) +LEFT JOIN node_session USING (session_id); + +-------------------------------------------------------------------------------- +-- Built-in maintenance account and default site +-------------------------------------------------------------------------------- + +INSERT INTO persons +(first_name, last_name, email, password, enabled) +VALUES +('Maintenance', 'Account', 'maint@localhost.localdomain', 'nopass', true); + +INSERT INTO person_role (person_id, role_id) VALUES (1, 10); +INSERT INTO person_role (person_id, role_id) VALUES (1, 20); +INSERT INTO person_role (person_id, role_id) VALUES (1, 30); +INSERT INTO person_role (person_id, role_id) VALUES (1, 40); + +INSERT INTO sites +(login_base, name, abbreviated_name, max_slices) +VALUES +('pl', 'PlanetLab Central', 'PLC', 100); diff --git a/trunk/plcsh b/trunk/plcsh new file mode 100755 index 0000000..209a0e0 --- /dev/null +++ b/trunk/plcsh @@ -0,0 +1,152 @@ +#!/usr/bin/python +# +# Interactive shell for testing PLCAPI +# +# Mark Huang +# Copyright (C) 2005 The Trustees of Princeton University +# +# $Id$ +# + +import os +import sys +from socket import gethostname +from optparse import OptionParser +from getpass import getpass +from traceback import print_exc + +sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0]))) +from PLC.Shell import Shell + +parser = OptionParser(add_help_option = False) +parser.add_option("-f", "--config", help = "PLC configuration file") +parser.add_option("-h", "--url", help = "API URL") +parser.add_option("-c", "--cacert", help = "API SSL certificate") +parser.add_option("-k", "--insecure", help = "Do not check SSL certificate") +parser.add_option("-m", "--method", help = "API authentication method") +parser.add_option("-s", "--session", help = "API session key") +parser.add_option("-u", "--user", help = "API user name") +parser.add_option("-p", "--password", help = "API password") +parser.add_option("-r", "--role", help = "API role") +parser.add_option("-x", "--xmlrpc", action = "store_true", default = False, help = "Use XML-RPC interface") +parser.add_option("--help", action = "help", help = "show this help message and exit") +(options, args) = parser.parse_args() + +# If user is specified but password is not +if options.user is not None and options.password is None: + try: + options.password = getpass() + except (EOFError, KeyboardInterrupt): + print + sys.exit(0) + +# Initialize a single global instance (scripts may re-initialize +# this instance and/or create additional instances). +try: + shell = Shell(globals = globals(), + config = options.config, + url = options.url, xmlrpc = options.xmlrpc, cacert = options.cacert, + method = options.method, role = options.role, + user = options.user, password = options.password, + session = options.session) + # Register a few more globals for backward compatibility + auth = shell.auth + api = shell.api + config = shell.config +except Exception, err: + print_exc() + print "Error:", err + print + parser.print_help() + sys.exit(1) + +# If called by a script +if len(sys.argv) > 1 and os.path.exists(sys.argv[1]): + # Pop us off the argument stack + sys.argv.pop(0) + execfile(sys.argv[0]) + +# Otherwise, run an interactive shell environment +else: + if shell.server is None: + print "PlanetLab Central Direct API Access" + prompt = "" + elif shell.auth['AuthMethod'] == "anonymous": + prompt = "[anonymous]" + print "Connected anonymously" + elif shell.auth['AuthMethod'] == "session": + # XXX No way to tell node and user sessions apart from the + # client point of view. + prompt = "[%s]" % gethostname() + print "%s connected using session authentication" % gethostname() + else: + prompt = "[%s]" % shell.auth['Username'] + print "%s connected using %s authentication" % \ + (shell.auth['Username'], shell.auth['AuthMethod']) + + # Readline and tab completion support + import atexit + import readline + import rlcompleter + + print 'Type "system.listMethods()" or "help(method)" for more information.' + # Load command history + history_path = os.path.join(os.environ["HOME"], ".plcapi_history") + try: + file(history_path, 'a').close() + readline.read_history_file(history_path) + atexit.register(readline.write_history_file, history_path) + except IOError: + pass + + # Enable tab completion + readline.parse_and_bind("tab: complete") + + try: + while True: + command = "" + while True: + # Get line + try: + if command == "": + sep = ">>> " + else: + sep = "... " + line = raw_input(prompt + sep) + # Ctrl-C + except KeyboardInterrupt: + command = "" + print + break + + # Build up multi-line command + command += line + + # Blank line or first line does not end in : + if line == "" or (command == line and line[-1] != ':'): + break + + command += os.linesep + + # Blank line + if command == "": + continue + # Quit + elif command in ["q", "quit", "exit"]: + break + + try: + try: + # Try evaluating as an expression and printing the result + result = eval(command) + if result is not None: + print result + except SyntaxError: + # Fall back to executing as a statement + exec command + except Exception, err: + print_exc() + + except EOFError: + print + pass diff --git a/trunk/plctest/TestConfig.py b/trunk/plctest/TestConfig.py new file mode 100644 index 0000000..67357a2 --- /dev/null +++ b/trunk/plctest/TestConfig.py @@ -0,0 +1,131 @@ +#definition of all structure used by the test_setup.py script +site1_nodes = { +'node1' : {'hostname': 'test1.one-lab.org', + 'boot_state':'inst', + 'model':'vmware/minhw', + 'owned' : 'pi', + 'network': { 'method':'static', + 'type':'ipv4', + 'ip':'192.168.132.128', + 'gateway':'192.168.132.1', + 'network':'192.168.132.0', + 'broadcast':'192.168.132.255', + 'netmask':'255.255.255.0', + 'dns1': '192.168.132.2', + }, + + }, +'node2' : { 'hostname':'test2.one-lab.org', + 'boot_state':'inst', + 'model':'vmware/minhw', + 'owned' : 'tech', + 'network': {'method':'static', + 'type':'ipv4', + 'ip':'192.168.132.130', + 'gateway':'192.168.132.1', + 'network':'192.168.132.0', + 'broadcast':'192.168.132.255', + 'netmask':'255.255.255.0', + 'dns1': '192.168.132.2', + }, + + }, +} +site_users= { +'pi_spec' : {'first_name':'PI', + 'last_name':'PI', + 'enabled':'True', + 'email':'fake-pi1@one-lab.org', + 'password':'testpi', + 'roles':['pi'], + 'auth_meth':'pi', + }, +'tech_spec' : {'first_name':'Tech', + 'last_name':'Tech', + 'enabled':'true', + 'email':'fake-tech1@one-lab.org', + 'password':'testtech', + 'roles':['tech'], + 'auth_meth':'tech', + }, +'user_spec' : {'first_name':'User', + 'last_name':'User', + 'enabled':'true', + 'email':'fake-user1@one-lab.org', + 'password':'testuser', + 'roles':['user'], + 'auth_meth':'user', + }, +'tech_user_spec' : {'first_name':'UserTech', + 'last_name':'UserTech', + 'enabled':'true', + 'email':'fake-tech2@one-lab.org', + 'password':'testusertech', + 'roles':['tech','user'], + 'auth_meth':'techuser', + }, +'pi_tech_spec' : {'first_name':'PiTech', + 'last_name':'PiTech', + 'enabled':'true', + 'email':'fake-pi2@one-lab.org', + 'password':'testusertech', + 'roles':['pi','tech'], + 'auth_meth':'pitech', + }, +} +site_spec1 = { +'site_fields' : {'name':'testsite', + 'login_base':'ts', + 'abbreviated_name':'PLanettest', + 'max_slices':100, + 'url':'http://onelab-test.inria.fr', + }, +'site_address' : {'line1':'route des lucioles', + 'city':'sophia', + 'state':'fr', + 'postalcode':'06600', + 'country':'france', + }, +'users': [ site_users['pi_spec'], site_users['tech_spec'], site_users['user_spec'],site_users['tech_user_spec'],site_users['pi_tech_spec']], +'nodes' : [ site1_nodes['node1'], site1_nodes['node2']], +} + + +site_specs = [ site_spec1 ] + +plc_spec1 = { + 'hostname' : 'localhost', + 'role' : 'root', + 'PLC_ROOT_USER' : 'root@onelab-test.inria.fr', + 'PLC_ROOT_PASSWORD' : 'test++', + 'PLC_NAME' : 'TestLab', + 'PLC_MAIL_ENABLED':'true', + 'PLC_MAIL_SUPPORT_ADDRESS' : 'mohamed-amine.chaoui@sophia.inria.fr', + 'PLC_DB_HOST' : 'onelab-test.inria.fr', + 'PLC_API_HOST' : 'onelab-test.inria.fr', + 'PLC_WWW_HOST' : 'onelab-test.inria.fr', + 'PLC_BOOT_HOST' : 'onelab-test.inria.fr', + 'PLC_NET_DNS1' : '138.96.0.10', + 'PLC_NET_DNS2' : '138.96.0.11', + 'sites' : site_specs, + } +plc_specs = [ plc_spec1 ] + +key={'key_type':'ssh', + 'key':'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4jNj8yT9ieEc6nSJz/ESu4fui9WrJ2y/MCfqIZ5WcdVKhBFUYyIenmUaeTduMcSqvoYRQ4QnFR1BFdLG8XR9D6FWZ5zTKUgpkew22EVNeqai4IXeWYKyt1Qf3ehaz9E3o1PG/bmQNIM6aQay6TD1Y4lqXI+eTVXVQev4K2fixySjFQpp9RB4UHbeA8c28yoa/cgAYHqCqlvm9uvpGMjgm/Qa4M+ZeO7NdjowfaF/wF4BQIzVFN9YRhvQ/d8WDz84B5Pr0J7pWpaX7EyC4bvdskxl6kmdNIwIRcIe4OcuIiX5Z9oO+7h/chsEVJWF4vqNIYlL9Zvyhnr0hLLhhuk2bw== root@onelab-test.inria.fr'} + + +slice1_spec={ +'slice_spec':{'name':'ts_slicetest1', + 'instantiation':'plc-instantiated', + 'url':'http://foo@ffo.com', + 'description':'testslice the first slice for the site testsite', + 'max_nodes':1000 + }, +'slice_users' : [ site_users['pi_spec'], site_users['tech_spec'],site_users['tech_user_spec']], +'slice_nodes' : [ site1_nodes['node1'], site1_nodes['node2'] ], +} +slices_specs= [slice1_spec] + + + diff --git a/trunk/plctest/TestMain.py b/trunk/plctest/TestMain.py new file mode 100755 index 0000000..498cfbb --- /dev/null +++ b/trunk/plctest/TestMain.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python + +import os, sys, time +from optparse import OptionParser +from TestPlc import TestPlc +from TestSite import TestSite +from TestNode import TestNode +import TestConfig +import threading + +class TestMain: + + subversion_id = "$Id$" + + def __init__ (self): + self.path=os.path.dirname(sys.argv[0]) + + def main (self): + try: + usage = """usage: %prog [options] MyplcURL""" + parser=OptionParser(usage=usage,version=self.subversion_id) + # verbosity + parser.add_option("-v","--verbose", action="store_true", dest="verbose", default=False, + help="Run in verbose mode") + # debug mode + parser.add_option("-g","--debug", action="store", dest="debug", + help="Run in debug mode for eventual virtual problems") + #exporting Display + parser.add_option("-d","--display", action="store", dest="Xterm", default='bellami:0.0', + help="export the display on the mentionneted one") + + (self.options, self.args) = parser.parse_args() + + display='' + url='' + test_plcs=[] + test_nodes=[] + pids=[] + timset=time.strftime("%H:%M:%S", time.localtime()) + #test the existence of the URL + if (len (self.args)): + url=self.args[0] + print 'the myplc url is ',url + else: + print "PLease introduce a right URL for the myplc instal" + sys.exit(1) + #check where to display Virtual machines + if (self.options.Xterm): + display=self.options.Xterm + print 'the display is', display + #the debug option + if (self.options.debug): + file=self.path+'/'+self.options.debug+'/My_Virtual_Machine.vmx' + if os.path.exists(file): + print 'vmx file is',file + arg='< /dev/null &>/dev/null &' + os.system('DISPLAY=%s vmplayer %s %s '%(display,file,arg)) + sys.exit(0) + else: + print "no way to find the virtual file" + sys.exit(1) + + for plc_spec in TestConfig.plc_specs: + print '========>Creating plc at '+timset+':',plc_spec + test_plc = TestPlc(plc_spec) + test_plc.connect() + test_plcs.append(test_plc) + test_plc.cleanup_plc() + print '========>Installing myplc at: ', timset + if (len(sys.argv) > 1): + test_plc.install_plc(url) + test_plc.config_plc(plc_spec) + else : + print "========>PLease insert a valid url for the myplc install" + ##create all the sites under the new plc,and then populate them with + ##nodes,persons and slices + for site_spec in plc_spec['sites']: + print '========>Creating site at '+timset+ ':',site_spec + test_site = test_plc.init_site(site_spec) + for node_spec in site_spec['nodes']: + print '========>Creating node at '+ timset+' :',node_spec + test_nodes.append(node_spec) + test_node = test_plc.init_node(test_site,node_spec,self.path) + test_node.create_slice ("pi") + print 'Runing Checkers and Vmwares for Site nodes at :',timset + test_site.run_vmware(test_nodes,display) + if(test_site.node_check_status(test_nodes,True)): + test_plc.db_dump() + test_site.slice_access(test_nodes) + print "all is alright" + return 0 + else : + print "There is something wrong" + sys.exit(1) + except Exception, e: + print str(e) + sys.exit(1) + +if __name__ == "__main__": + TestMain().main() diff --git a/trunk/plctest/TestNode.py b/trunk/plctest/TestNode.py new file mode 100644 index 0000000..0ca91ba --- /dev/null +++ b/trunk/plctest/TestNode.py @@ -0,0 +1,94 @@ +import os +import sys +import time +import base64 +import TestConfig +import xmlrpclib + +class TestNode: + + def __init__ (self,test_plc,test_site,node_spec): + self.test_plc=test_plc + self.test_site=test_site + self.node_spec=node_spec + self.timset=time.strftime("%H:%M:%S", time.localtime()) + def create_node (self,role): + auth = self.test_site.anyuser_auth (role) + filter={'boot_state':'rins'} + try: + if (role=='pi' and self.node_spec['owned']=='pi'): + self.node_id = self.test_plc.server.AddNode(auth, + self.test_site.site_spec['site_fields']['login_base'], + self.node_spec) + self.test_plc.server.AddNodeNetwork(auth,self.node_id, + self.node_spec['network']) + self.test_plc.server.UpdateNode(auth, self.node_id, filter) + return self.node_id + + elif (role=='tech' and self.node_spec['owned']=='tech'): + self.node_id = self.test_plc.server.AddNode(auth, + self.test_site.site_spec['site_fields']['login_base'], + self.node_spec) + self.test_plc.server.AddNodeNetwork(auth,self.node_id, + self.node_spec['network']) + self.test_plc.server.UpdateNode(auth, self.node_id, filter) + return self.node_id + except Exception, e: + print str(e) + + def create_slice(self, role): + auth = self.test_site.anyuser_auth (role) + liste_hosts=[] + #for l in liste_nodes_spec : + # liste_hosts.append(l['hostname']) + try: + for slicespec in TestConfig.slices_specs : + print '========>Creating slice at :'+self.timset+' : ',slicespec + slice_id=self.test_plc.server.AddSlice(auth,slicespec['slice_spec']) + for sliceuser in slicespec['slice_users']: + self.test_plc.server.AddPersonToSlice(auth, sliceuser['email'], slice_id)##affecting person to the slice + for slicenode in slicespec['slice_nodes']: + liste_hosts.append(slicenode['hostname']) + self.test_plc.server.AddSliceToNodes(auth, slice_id, liste_hosts)##add slice to the spec nodes + print 'fin creation slices' + except Exception, e: + print str(e) + sys.exit(1) + + def conffile(self,image,hostname,path): + try: + file=path+'/VirtualFile-'+hostname+'/My_Virtual_Machine.vmx' + f2=open(file,'w') + + f1=open(path+'/My-Virtual-Machine-model/My_Virtual_Machine.vmx','r') + while 1: + txt = f1.readline() + if txt=='': + f1.close() + f2.close() + break + if txt[0]!='*' : + f2.write(txt) + else : + f2.write('ide1:1.fileName = '+'"'+image+'"' '\n') + + + except Exception, e: + print str(e) + + def create_boot_cd(self,node_spec,path): + try: + os.system('mkdir -p %s/VirtualFile-%s && cp %s/My-Virtual-Machine-model/* %s/VirtualFile-%s' + %(path, node_spec['hostname'], path, path, node_spec['hostname'])) + link1=self.test_plc.server.GetBootMedium(self.test_plc.auth_root(), + node_spec['hostname'], 'node-iso', '') + if (link1 == ''): + raise Exception, 'boot.iso not found' + file1=open(path+'/VirtualFile-'+node_spec['hostname']+'/boot_file.iso','w') + file1.write(base64.b64decode(link1)) + file1.close() + print '========> boot cd created for :',self.node_spec['hostname'] + self.conffile('boot_file.iso',self.node_spec['hostname'], path) #create 2 conf file for the vmware based + except Exception, e: + print str(e) + sys.exit(1) diff --git a/trunk/plctest/TestPlc.py b/trunk/plctest/TestPlc.py new file mode 100644 index 0000000..d183e83 --- /dev/null +++ b/trunk/plctest/TestPlc.py @@ -0,0 +1,101 @@ +import os +import sys +import xmlrpclib +import datetime +from TestSite import TestSite +from TestNode import TestNode + +class TestPlc: + + def __init__ (self,plc_spec): + self.plc_spec=plc_spec + self.url="https://%s:443/PLCAPI/"%plc_spec['hostname'] + self.server=xmlrpclib.Server(self.url,allow_none=True) + self.path=os.path.dirname(sys.argv[0]) + + def connect (self): + # tricky : define les methodes de l'API sur cet object + pass + + def auth_root (self): + return {'Username':self.plc_spec['PLC_ROOT_USER'], + 'AuthMethod':'password', + 'AuthString':self.plc_spec['PLC_ROOT_PASSWORD'], + 'Role' : self.plc_spec['role'] + } + def affiche_results(self, test_case_name, status, timers): + timers=datetime.datetime.now() + fileHandle = open (self.path+'/results.txt', 'a' ) + fileHandle.write ( str(test_case_name)+' ' +str(status)+' '+str(timers)) + fileHandle.close() + + + + def config_plc(self,plc_spec): +# Thierry 2007-07-05 +# now plc-config-tty silently creates needed directories +# os.system('mkdir -p /etc/planetlab/configs') + + fileconf=open('tty_conf','w') + for var in [ 'PLC_NAME', + 'PLC_ROOT_PASSWORD', + 'PLC_ROOT_USER', + 'PLC_MAIL_ENABLED', + 'PLC_MAIL_SUPPORT_ADDRESS', + 'PLC_DB_HOST', + 'PLC_API_HOST', + 'PLC_WWW_HOST', + 'PLC_BOOT_HOST', + 'PLC_NET_DNS1', + 'PLC_NET_DNS2']: + fileconf.write ('e %s\n%s\n'%(var,plc_spec[var])) + fileconf.write('w\n') + fileconf.write('q\n') + fileconf.close() + os.system('set -x ; cat tty_conf') + os.system('set -x ; chroot /plc/root plc-config-tty < tty_conf') + os.system('set -x ; service plc start') + os.system('set -x; service sendmail stop') + os.system('set -x; chroot /plc/root service sendmail restart') + + def cleanup_plc(self): + os.system('service plc safestop') + #####detecting the last myplc version installed and remove it + os.system('set -x; rpm -e myplc') + print "=======================>Remove Myplc DONE!" + ##### Clean up the /plc directory + os.system('set -x; rm -rf /plc/data') + print "=======================>Clean up DONE!" + + def install_plc(self,url): + print url + os.system('set -x; rpm -ivh '+url) + os.system('set -x; service plc mount') + + def init_site (self,site_spec): + test_site = TestSite (self,site_spec) + test_site.create_site() + for key in site_spec['users']: + test_site.create_user(key) + test_site.enable_user(key) + test_site.add_key_user(key) + return test_site + + def init_node (self,test_site,node_spec,path): + + test_node = TestNode(self, test_site, node_spec) + test_node.create_node ("pi") + test_node.create_node ("tech") + test_node.create_boot_cd(node_spec,path) + return test_node + + def db_dump(self): + + t=datetime.datetime.now() + d=t.date() + dump='/var/lib/pgsql/backups/planetlab4-'+str(d)+'-2nodes' + os.system('chroot /plc/root pg_dump -U pgsqluser planetlab4 -f '+ dump) + print 'dump is done',dump + + + diff --git a/trunk/plctest/TestRestore.py b/trunk/plctest/TestRestore.py new file mode 100755 index 0000000..fa015c8 --- /dev/null +++ b/trunk/plctest/TestRestore.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python + +import os, sys, time +from optparse import OptionParser +import xmlrpclib + +class TestRestore: + + subversion_id = "$Id$" + + def __init__ (self): + self.url="https://localhost:443/PLCAPI/" + self.server=xmlrpclib.Server(self.url,allow_none=True) + self.path=os.path.dirname(sys.argv[0]) + +###################3 + def auth_root (self): + return {'Username':'root@onelab-test.inria.fr', + 'AuthMethod':'password', + 'AuthString':'test++', + 'Role' : 'root' + } + +##############check if the db version exsit + def check_dir(self,dbname): + + config_file = "/plc/data/var/lib/pgsql/backups/"+dbname + if (os.path.isfile (config_file)): + print "==>dbversion found " + return 1 + else: + print "\n %s non-existing Bdd version\n" % config_file + return 0 + +##############restoring one db return list of host nodes + def restore_db(self,db,display): + try: + list_host=[] + ##stop httpd service + os.system('chroot /plc/root service httpd stop') + ##droping + os.system(' echo drop database planetlab4 |chroot /plc/root psql --user=pgsqluser template1') + ##creating + os.system('chroot /plc/root createdb -U postgres --encoding=UNICODE --owner=pgsqluser planetlab4') + ##populating + os.system('chroot /plc/root psql -U pgsqluser planetlab4 -f /var/lib/pgsql/backups/'+db) + ##starting httpd service + os.system('chroot /plc/root service httpd start') + + print 'db.restored' + hosts=self.server.GetNodes(self.auth_root()) + for host in hosts: + print host['hostname'] + list_host.append(host['hostname']) + + for l in list_host : + print display + os.system('DISPLAY=%s vmplayer %s/VirtualFile-%s/My_Virtual_Machine.vmx &'%(display,self.path,l)) + + except Exception, e: + print str(e) +########################### + + + + + def main (self): + try: + usage = """usage: %prog [options] BDDversion""" + parser=OptionParser(usage=usage,version=self.subversion_id) + # verbosity + parser.add_option("-v","--verbose", action="store_true", dest="verbose", default=False, + help="Run in verbose mode") + #exporting Display + parser.add_option("-d","--display", action="store", dest="Xdisplay", default='bellami:0.0', + help="export the display on the mentionneted one") + + + (self.options, self.args) = parser.parse_args() + + hosts=[] + i=0 + dirname ='' + display='' + + + if (self.options.Xdisplay): + display=self.options.Xdisplay + print 'the display is', display + + + if (len(self.args) == 0 ): + parser.print_help() + sys.exit(1) + else: + dirname=self.args[0] + + if (not (self.check_dir(dirname))): + parser.print_help() + sys.exit(1) + + self.restore_db(dirname,display) + + except Exception, e: + print str(e) + +if __name__ == "__main__": + TestRestore().main() + diff --git a/trunk/plctest/TestSite.py b/trunk/plctest/TestSite.py new file mode 100644 index 0000000..f9d4caa --- /dev/null +++ b/trunk/plctest/TestSite.py @@ -0,0 +1,223 @@ +import os +import sys +import datetime +import time +from TestConfig import * +import xmlrpclib + +class TestSite: + + def __init__ (self,test_plc,site_spec): + self.test_plc=test_plc + self.site_spec=site_spec + self.timset=time.strftime("%H:%M:%S", time.localtime()) + + def create_site (self): + try: + print self.test_plc.auth_root() + self.site_id = self.test_plc.server.AddSite(self.test_plc.auth_root(), + self.site_spec['site_fields']) + self.test_plc.server.AddSiteAddress(self.test_plc.auth_root(),self.site_id, + self.site_spec['site_address']) + + return self.site_id + except Exception, e: + print str(e) + + def site_id(self): + return self.site_id() + + def create_user (self, user_spec): + try: + i=0 + print '========>Adding user at '+self.timset+ ': ',user_spec + self.person_id=self.test_plc.server.AddPerson(self.test_plc.auth_root(), + user_spec) + self.test_plc.server.UpdatePerson(self.test_plc.auth_root(), + self.person_id,{'enabled': True}) + for role in user_spec['roles']: + self.test_plc.server.AddRoleToPerson(self.test_plc.auth_root(), + role,user_spec['email']) + self.test_plc.server.AddPersonToSite(self.test_plc.auth_root(), + user_spec['email'], + self.site_spec['site_fields']['login_base']) + except Exception,e: + print str(e) + + def enable_user (self, user_spec): + try: + persones=self.test_plc.server.GetPersons(self.test_plc.auth_root()) + for person in persones: + if (person['enabled']!="True"): + self.test_plc.server.UpdatePerson(self.test_plc.auth_root(), + person['person_id'], + {'enabled': True}) + except Exception,e: + print str(e) + + def add_key_user(self,user_spec): + try: + auth="" + for userspec in self.site_spec['users']: + if(user_spec == userspec): + for role in userspec['roles']: + auth=auth+role + print auth + self.test_plc.server.AddPersonKey(self.anyuser_auth(auth), + user_spec['email'], key) + except Exception, e: + print str(e) + + def anyuser_auth (self,key): + for person in self.site_spec['users']: + if person['auth_meth']== key : + return {'Username':person['email'], + 'AuthMethod':'password', + 'AuthString':person['password'], + 'Role':person['roles'][0], + } + + def node_check_status(self,liste_nodes,bool): + try: + ret_value=True + filter=['boot_state'] + bt={'boot_state':'boot'} + dbg={'boot_state':'dbg'} + secondes=15 + start_time = datetime.datetime.now() ##geting the current time + dead_time=datetime.datetime.now()+ datetime.timedelta(minutes=10)##adding 10minutes + start=time.strftime("%H:%M:%S", time.localtime()) + print "time in the begining is :",start + + for l in liste_nodes : + while (bool): + node_status=self.test_plc.server.GetNodes(self.test_plc.auth_root(), + l['hostname'], filter) + timset=time.strftime("%H:%M:%S", time.localtime()) + print 'the actual status for the node '+l['hostname']+' at '+str(timset)+' is :',node_status + try: + if (node_status[0] == bt): + test_name='\nTest Installation Node hosted: '+l['hostname'] + self.test_plc.affiche_results(test_name, 'Successful', '')##printing out the result + break ##for exsiting and renaming virtual file to just installed + elif (node_status[0] ==dbg): + test_name='\nTest Installation Node hosted: '+l['hostname'] + self.test_plc.affiche_results(test_name, 'En Debug', '')##printing out the result + bool=False + break ##for exsiting and renaming virtual file to just installed + elif ( start_time <= dead_time ) : + start_time=datetime.datetime.now()+ datetime.timedelta(minutes=2) + time.sleep(secondes) + else: bool=False + except OSError ,e : + bool=False + str(e) + if (bool): + print "Node correctly instaled and booted " + else : + print "Node not fully booted "##cheek if configuration file already exist + ret_value=False + test_name='\nTest Installation Node Hosted: ',l['hostname'] + self.test_plc.affiche_results(test_name, 'Failure', '')##printing out the result + + end=time.strftime("%H:%M:%S", time.localtime()) + print "time at the end is :",end ##converting time to secondes + return ret_value + except Exception, e: + print str(e) + print "vmware killed if problems occur " + time.sleep(10) + self.kill_all_vmwares() + sys.exit(1) + + def kill_all_vmwares(self): + os.system('pgrep vmware | xargs -r kill') + os.system('pgrep vmplayer | xargs -r kill ') + os.system('pgrep vmware | xargs -r kill -9') + os.system('pgrep vmplayer | xargs -r kill -9') + + def run_vmware(self,liste_nodes,display): + path=os.path.dirname(sys.argv[0]) + print path + print " kill last vmware before any new installation " + self.kill_all_vmwares() + print 'i will be displayed here========>', display + arg='< /dev/null &>/dev/null &' + for l in liste_nodes : + #os.system('set -x; vmplayer VirtualFile-%s/My_Virtual_Machine.vmx %s '%(l['hostname'],arg)) + os.system('set -x; DISPLAY=%s vmplayer %s/VirtualFile-%s/My_Virtual_Machine.vmx %s '%(display,path,l['hostname'],arg)) + + def delete_known_hosts(self): + try: + file1=open('/root/.ssh/known_hosts','r') + file2=open('/root/.ssh/known_hosts_temp','w') + while 1: + txt = file1.readline() + if txt=='': + file1.close() + file2.close() + break + if txt[0:4]!='test' : + file2.write(txt) + + + os.system('mv -f /root/.ssh/known_hosts_temp /root/.ssh/known_hosts') + except Exception, e: + print str(e) + + def slice_access(self,liste_nodes): + try: + bool=True + bool1=True + secondes=15 + self.delete_known_hosts() + start_time = datetime.datetime.now() + dead_time=start_time + datetime.timedelta(minutes=3)##adding 3minutes + for slice in slices_specs: + for slicenode in slice['slice_nodes']: + timset=time.strftime("%H:%M:%S", time.localtime()) + while(bool): + print '=========>Try to Restart the Node Manager on %s at %s:'%(slicenode['hostname'],str(timset)) + access=os.system('set -x; ssh -i /etc/planetlab/root_ssh_key.rsa root@%s service nm restart'%slicenode['hostname'] ) + if (access==0): + print '=========>Node Manager Restarted on %s at %s:'%(slicenode['hostname'] ,str(timset)) + while(bool1): + print '=========>Try to connect to the %s@%s at %s '%(slice['slice_spec']['name'],slicenode['hostname'],str(time.strftime("%H:%M:%S", time.localtime()))) + Date=os.system('set -x; ssh -i ~/.ssh/slices.rsa %s@%s echo "The Actual Time here is;" date'%(slice['slice_spec']['name'],slicenode['hostname'])) + if (Date==0): + break + elif ( start_time <= dead_time ) : + start_time=datetime.datetime.now()+ datetime.timedelta(seconds=30) + time.sleep(secondes) + else: + bool1=False + if(bool1): + print '=========>connected to the '+slice['slice_spec']['name']+'@'+slicenode['hostname'] +'--->' + else: + print '=========>access to one slice is denied but last chance' + print '=========>Retry to Restart the Node Manager on %s at %s:'%(slicenode['hostname'],str(timset)) + access=os.system('set -x; ssh -i /etc/planetlab/root_ssh_key.rsa root@%s service nm restart'%slicenode['hostname'] ) + if (access==0): + print '=========>Retry to connect to the %s@%s at %s '%(slice['slice_spec']['name'],slicenode['hostname'],str(time.strftime("%H:%M:%S", time.localtime()))) + Date=os.system('set -x; ssh -i ~/.ssh/slices.rsa %s@%s echo "The Actual Time here is;" date'%(slice['slice_spec']['name'],slicenode['hostname'] )) + if (Date==0): + print '=========>connected to the '+slice['slice_spec']['name']+'@'+slicenode['hostname']+'--->' + else: + print '=========>the Access is finaly denied' + sys.exit(1) + else :"=========>Last try failed" + break + elif ( start_time <= dead_time ) : + start_time=datetime.datetime.now()+ datetime.timedelta(minutes=1) + time.sleep(secondes) + else: + bool=False + + if (not bool): + print 'Node manager problems' + sys.exit(1) + + except Exception, e: + print str(e) + sys.exit(1) + diff --git a/trunk/plctest/tty_conf b/trunk/plctest/tty_conf new file mode 100644 index 0000000..1cea152 --- /dev/null +++ b/trunk/plctest/tty_conf @@ -0,0 +1,24 @@ +e PLC_NAME +TestLab +e PLC_ROOT_PASSWORD +test++ +e PLC_ROOT_USER +root@onelab-test.inria.fr +e PLC_MAIL_ENABLED +true +e PLC_MAIL_SUPPORT_ADDRESS +mohamed-amine.chaoui@sophia.inria.fr +e PLC_DB_HOST +onelab-test.inria.fr +e PLC_API_HOST +onelab-test.inria.fr +e PLC_WWW_HOST +onelab-test.inria.fr +e PLC_BOOT_HOST +onelab-test.inria.fr +e PLC_NET_DNS1 +138.96.0.10 +e PLC_NET_DNS2 +138.96.0.11 +w +q diff --git a/trunk/psycopg2/AUTHORS b/trunk/psycopg2/AUTHORS new file mode 100644 index 0000000..44c77fc --- /dev/null +++ b/trunk/psycopg2/AUTHORS @@ -0,0 +1,8 @@ +Main authors: + Federico Di Gregorio + +For the win32 port: + Jason Erickson (most of his changes are still in 2.0) + +Additional Help: + diff --git a/trunk/psycopg2/ChangeLog b/trunk/psycopg2/ChangeLog new file mode 100644 index 0000000..b273e20 --- /dev/null +++ b/trunk/psycopg2/ChangeLog @@ -0,0 +1,1219 @@ +2006-09-02 Federico Di Gregorio + + * Release 2.0.5.1. + + * psycopg/cursor_type.c: applied patch from Jason Erickson to + build on MSVC and older gcc. + +2006-09-01 Federico Di Gregorio + + * Release 2.0.5. + + * Fixed patch from #119, see tracker for details. + + * Preparing release 2.0.5. + + * psycopg/psycopgmodule.c: fixed filling of connection errors + to include OperationalError. + + * setup.py: removed pydatetime option from initialize_options + to make sure that the value in setup.cfg is used. + + * psycopg/psycopgmodule.c: applied patch from jdahlin (#120) + to have .connect() accept either a string or int as the port + parameter. + + * psycopg/adapter_binary.c: applied patch from jdahlin (#119) + to fix the segfault on empty binary buffers. + + * psycopg/connection_type.c: added .status attribute to expose + the internal status. + + * psycopg/pqpath.c: applied patch from intgr (#117) to fix + segfault on null queries. + + * psycopg/cursor_type.c: applied patch from intgr (#116) to + fix bad keyword naming and segfault in .executemany(). + + * ZPsycopgDA/DA.py: applied ImageFile patch from Charlie + Clark. + + * lib/pool.py: applied logging patch from Charlie Clark. + It will probably get a makeup and be moved to the top-level + module later. + +2006-08-02 Federico Di Gregorio + + * Release 2.0.4. + + * Fixed bug in float conversion (check for NULL string was + erroneously removed in 2.0.3!) + +2006-07-31 Federico Di Gregorio + + * Release 2.0.3. + + * psycopg/cursor_type.c: applied patch from jbellis (#113) to + allow column selection in .copy_from(). + + * psycopg/psycopgmodule.c: fixed memory leak in custom exceptions + (applied patch from #114). + +2006-07-26 Federico Di Gregorio + + * psycopg/adapter_datetime.c (pydatetime_str): fixed error + in conversion of microseconds for intervals and better algo + (thanks to Mario Frasca.) + +2006-06-18 Federico Di Gregorio + + * psycopg/adapter_binary.c: same as below. + + * psycopg/adapter_qstring.c: does not segfault anymore if + .getquoted() is called without preparing the qstring with + the connection. + +2006-06-15 Federico Di Gregorio + + * psycopg/typecast_basic.c: fixed problem with bogus + conversion when importing gtk (that was crazy, I didn't + understand why it happened but the new code just fixes it.) + + * ZPsycopgDA/db.py: better type analisys, using an hash + instead of a series of if (variation on patch from Charlie + Clark.) + +2006-06-11 Federico Di Gregorio + + * Release 2.0.2. + + * psycopg/typecast_array.c (typecast_array_cleanup): fixed a + problem with typecast_array_cleanup always returning the new + string length shorter by 1 (Closes: #93). + + * psycopg/adapter_binary.c: as below. + + * psycopg/adapter_qstring.c: wrapped #warning in #ifdef __GCC__ + because other compilers don't have it and it will just break + compilation (patch from jason, our great win32 builder). + + * psycopg/adapter_list.c: applied patch to adapt an empty list + into an empty array and not to NULL (from iGGy, closes: #108). + + * psycopg/cursor_type.c: applied patch from wkv to avoid + under-allocating query space when the parameters are not of the + right type (Closes: #110). + + * psycopg/connection_int.c: applied patch from wkv to avoid off + by one allocation of connection encoding string (Closes: #109). + +2006-06-09 Federico Di Gregorio + + * Release 2.0.1. + + * Fixed some buglets in ZPsycopgDA (was unable to load due + to shorter version number in psycopg module.) + +2006-06-08 Federico Di Gregorio + + * Release 2.0. + + * ZPsycopgDA/DA.py: removed Browse table for 2.0 release; we'll + add it back later. + +2006-05-26 Federico Di Gregorio + + * Applied better PostgreSQL patch from AA. + +2006-05-24 Federico Di Gregorio + + * Enabled 8.1.4 security fix only when the version is >= 8.1.4, fall + back to old code otherwise. + + * psycopg/adapter_qstring.c: now quote using PQescapeStringConn if + available. + + * psycopg/adapter_binary.c: now quote using PQescapeByteaConn if + available. + +2006-04-38 Federico Di Gregorio + + * setup.py: fixed little problem with mx_include_dir as suggested + by kvc (this closes #102). + +2006-04-24 Federico Di Gregorio + + * psycopg/adapter_pboolean.c: added the possibility to format boolean + values as "true" and "false" instead of "'t'" and "'f'". + +2006-03-08 Federico Di Gregorio + + * lib/extras.py: added .next() to DictCursot to support iteration. + +2006-03-02 Federico Di Gregorio + + * psycopg/typecast_array.c (typecast_array_tokenize): removed cast + to build without warnings on 64 bit arches. + +2006-02-11 Federico Di Gregorio + + * Release 2.0 beta 8. + + * psycopg/config.h: applied patch from Jason to fix handle leak on + win32, as documented in #92. + +2006-02-11 Federico Di Gregorio + + * Release 2.0 beta 7. + + * psycopg/psycopgmodule.c: applied fix for memory overflow in + connect() (reported by solt, #91.) + + * setup.py: applied patch from lbruno. + +2006-01-11 Federico Di Gregorio + + * setup.py: does not report an error in pg_config unless the pg_config + was explicitly set (allows for building with old options.) + +2006-01-06 Daniele Varrazzo + + * setup.py: libpq.dll not used anymore. win32 setup uses pg_config too. + +2006-01-05 Federico Di Gregorio + + * psycopg/psycopgmodule.c (psyco_set_error): added function to set extra + parameters on ProgrammingError instances. Also modified all occurances of + PyErr_SetString(ProgrammingError,...) to psycopg_set_error(). + + * setup.{cfg,py}: we now use pg_config to locate PostgreSQL libraries + and headers (modified patch from lbruno, see #70.) + +2006-01-01 Federico Di Gregorio + + * Preparing release 2 beta 7. + + * MANIFEST.in: we now distrbute pre-built documentation (still need + to add to setup.py the code necessary to build docs as part of the + build process.) + + * psycopg/connection_int.c: PostgreSQL encoding names are now force + uppercase (after all PostgreSQL documentation reports them this way.) + +2005-12-11 Federico Di Gregorio + + * psycopg/typecast_array.c (typecast_array_cleanup): added functio + to cleanup the "[...]=" part of an array result. This probably will + need some more work for nested arrays but it fixed every test I was + able to write. (Closes: #80) + +2005-12-11 Federico Di Gregorio + + * setup.py: half-applied patch from Tavis to specify mx_include_dir + in setup.cfg. + + * psycopg/typecast.c (typecast_parse_time): cz limit in the while + loop is 6, not 5. This solve the problem with "fractionary" time zones + and fixes #78. + +2005-12-06 Federico Di Gregorio + + * lib/extras.py: added .callproc() to DictCursor as suggested + by Philip Semanchuk. + +2005-11-29 Federico Di Gregorio + + * MANIFEST.in: added docs/async.txt. (Closes: #75) + +2005-11-26 Daniele Varrazzo + + * psycopg/psycopgmodule.c: fixed exceptions refcount. + + * Fixed lots of doctrings and added Epydoc-generated docs support. + +2005-11-24 Federico Di Gregorio + + * sandbox: added all the test and creash-me files to the repository. + + * psycopg/typecast.c (typecast_dealloc): now directly calls + PyObject_Del to avoid to segfault. + +2005-11-20 Federico Di Gregorio + + * psycopg/typecast.c: fixed problem with microseconds conversion by + applying slightly modified patch from Ronnie Mackay. + +2005-11-19 Federico Di Gregorio + + * lib/extensions.py: COMMITED -> COMMITTED. (Closes: #73) + + * doc/extensions.rst: included Daniele's work after minor cosmetic changes + like using the new constants instead of numbers for transaction isolation + levels. + +2005-11-17 Federico Di Gregorio + + * ZPsycopgDA/pool.py: fixed connections leak by using the new name + (PersistentConnectionPool) for the old connection pool class. + +2005-11-16 Federico Di Gregorio + + * Preparing release 2.0 beta 6. + + * psycopg/adapter_mxdatetime.c: fixed all problems with mx conversions. + + * psycopg/typecast.c: now the timezone is set correctly even if there + are no microseconds and/or the offset is 0; + + * examples/encoding.py: fixed example by using python utf8 encoding for + the whole file. + + * lib/__init__.py: very nice hack from Harald Armin Massa to allow + py2exe and similar tools to do their work without problems. + +2005-11-15 Federico Di Gregorio + + * psycopg/psycopgmodule.c: now bails out with correct exception when one + of the needed modules can't be imported (should fix #32.) + +2005-11-14 Federico Di Gregorio + + * psycopg/typecast.c: added typecast_parse_date and typecast_parse_time + functions to do locale-safe date/time parsing. This would probably also + speed-up psycopg a little bit. + +2005-11-07 Federico Di Gregorio + + * psycopg/pqpath.c: fixed problem with uninitialized value (all this was + started by replacing calloc() calls with PyMem_Malloc().) + +2005-11-04 Federico Di Gregorio + + * psycopg/typecast.c: a lot of changes: + - made typecast a new-style type + - removed coerce code and implemented the richcompare protocol that + allows to compare objects of different types + - much better __cmp__ method that allows to compare two typecast + objects and returns True if any two of the mapped oids match + - any object that can be used as an int works as right-hand operand + in __cmp__ operations + + * psycopg/typecast_datetime.c: now typecast_PYINTERVAL_cast limit the + scan to 'len' characters in the string (should fix #65.) + +2005-11-03 Federico Di Gregorio + + * Applied patch from Daniele Varazzo to enable Decimal on Python + 2.3 when the module is available (run-time check, nice.) + +2005-10-26 Federico Di Gregorio + + * setup.cfg: added include_dirs line for SUSE 9.3. + +2005-10-22 Federico Di Gregorio + + * psycopg/cursor_type.c: added support for named cursors: + - .fetchXXX() methods now execute a FETCH if the cursor is named + - .execute() executes a DECLARE if the cursor is named + - .execute() fails if a named cursor is used in autocommit + - .executemany() can't be called on named cursors + - .scroll() executes a MOVE if the cursor is named + - .close() executes a CLOSE if the cursor is named + Also, a "transaction mark" was added to both the connection and the + cursor and an exception is raised when using a named cursor unless the + two marks correspond. + + * psycopg/connection_int.c: snprintf->PyOS_snprintf. + + * psycopg/psycopgmodule.c: snprintf->PyOS_snprintf. + + * psycopg/cursor_type.c: changed self->query type from C string to + PyObject* to better manage queries in named cursors. + + * psycopg/psycopgmodule.c: cleaned up exception names (now the errors + is printed as psycopg2.Error and not as the confusing + psycopg2._psycopg.Error.) + +2005-10-20 Federico Di Gregorio + + * lib/pool.py: renamed ThreadedConnectionPool to PersistentConnectionPool + and added a connection pool that allows multiple connections per thread + as ThreadedConnectionPool (courtesy of Daniele Varrazzo.) + +2005-10-19 Federico Di Gregorio + + * Releasing 2.0 beta 5. + + * psycopg/adapter_mxdatetime.c: reverted to old strftime method to format + mx.DateTime objects; the new method didn't worked in some corner-cases. + This makes impossible to have more than 2 decimal places for seconds but + at least we get the time right every time. + +2005-10-18 Federico Di Gregorio + + * NOTIFY is back end working. + + * psycopg/connection_type.c: fixed problem with initialization of + notifies list (also fixed small memory leak in connection dealloc.) + + * examples/notify.py: added NOTIFY example. + + * psycopg/cursor_type.c: added per-cursor type-casters dictionaries. + +2005-10-18 Federico Di Gregorio + + * psycopg/typecast.c: temporary fix to typecasting objects to return + False for any comparaison except an integer in self.values (i.e., we + don't raise an exception anymore on a coerce error.) Epydoc is now + happy. + + * psycopg/config.h: ZETA config.h patch from Charlie Clark. + + * examples/threads.py: fixed small typo: psycopg -> psycopg2. + + * Big cleanup of unsigned chars to tame gcc 4. + + * Big cleanup of module names (i.e., psycopg2._psycopg everywhere.) + + * psycopg/config.h: added fake localtime_r for platforms missing it + + * psycopg/cursor_type.c: cursors now have a FixedOffsetTimezone + tzinfo_factory by default. + + * psycopg/adapter_datetime.c: added tzinfo argument to psycopg2.Time and + psycopg2.Timestamp. Also now TimestampFromTicks sets the tzinfo object + to psycopg2.tz.LOCAL. + +2005-10-17 Federico Di Gregorio + + * psycopg/adapter_datetime.c: we now use localtime() instead of gmtime() + to accound for the local time-zone in timestamps. + + * psycopg/connection_type.c: fixed docstring for .cursor(). + + * psycopg/psycopgmodule.c: added useful docstring for .connect(). + +2005-10-08 Federico Di Gregorio + + * psycopg/connection_type.c: isolation level upper bound set to 2. + + * lib/psycopg1.py: explicitly set isolation level to 2 on .connect() + to mimic psycopg 1 behaviour. + + * psycopg/connection_int.c: now set isolation level from + default_transaction_isolation backend environment value. + + * psycopg/pqpath.c: removed serialization level 3: now everybody + (except me) has to use the mnemonics defined in psycopg2.extensions. + + * lib/extensions.py: Added mnemonics for serialization levels. + +2005-10-02 Federico Di Gregorio + + * psycopg/cursor_type.c (psyco_curs_callproc): applied callproc + patch from Matt Goodall (added a check on _psyco_curs_execute + return value and substituted malloc/free with PyMem versions.) + +2005-10-01 Federico Di Gregorio + + * psycopg/connection_int.c: fixed segfault by moving PyErr_Format + after GIL acquisition (closes: #50). + + * psycopg/connection_type.c: applied patch from Matt Goodall to + fix some doc strings. + +2005-09-23 Federico Di Gregorio + + * lib/pool.py: applied patch from piro to avoid the scan of the + whole connection array on getconn(). + +2005-09-12 Federico Di Gregorio + + * lib/pool.py: Applied psycopg->psycopg2 patch to from bug #35. + + * ZpsycopgDA/db.py: fixed problem with OperationalError that + resulted in cryptic message to Zope users ("'OperationalError' is + not defined".) + +2005-08-23 Federico Di Gregorio + + * setup.py: applied patch from Daniele Varrazzo to avoid segfaults + when compiling with migw for Python 2.4.x. + + * psycopg/adapter_mxdatetime.c (mxdatetime_str): ported code from 1.1.x + to convert mxDateTime object preserving the precision of fractional + seconds. + +2005-08-22 Federico Di Gregorio + + * ZPsycopgDA/*.py: psycopg -> psycopg2. + + * setup.py: modified to install the module components under + psycopg2 on windows too (thanks to Daniele Varrazzo.) + +2005-08-07 Federico Di Gregorio + + * psycopg/config.h: added __sun__ to the symbols checked for round() + +2005-07-21 Federico Di Gregorio + + * psycopg/adapter_datetime.c (psyco_XXXFromTicks): fixed the 1900 + years offset reported by Jeroen van Dongen (see ticket #33). + +2005-07-17 Federico Di Gregorio + + * Release 2.0 beta 4. + + * lib/extras.py (DictConnection.cursor): added DictConnection to + make easier to retrieve data in DictRows. + +2005-06-24 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_PYINTERVAL_cast): applied patch + from Geert Jansen to fix interval bug due to overflow. + +2005-06-18 Federico Di Gregorio + + * setup.cfg: some clarifications and include_dirs example for Mandrake. + + * ZPsycopgDA/DA.py: DTMLFile -> HTMLFile everywhere to fix zope + cut&paste problems. + + * MANIFEST.in: added missing files to do bdist_rpm. + + * lib/psycopg1.py: fixed .dictfetchrow() to return None if fetchone() + returns None instead of raising an exception. + + * ZPsycopgDA/icons: replaced corrupted icons with good ones. + +2005-06-13 Federico Di Gregorio + + * psycopg/psycopgmodule.c (psyco_connect): changed the port keyword + parameter type to int (instead of string); this should fix #23. + + * psycopg/cursor_type.c (_psyco_curs_execute): now checks for + empty queries and raise a ProgrammingError if appropriate (closes: + #24). + + * setup.py: psycopg module renamed to psycopg2. + +2005-06-02 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_execute): fixed segfault when + not passing string or unicode to .execute(). + +2005-06-01 Federico Di Gregorio + + * examples/fetch.py: added example about using DECLARE CURSOR. + + * psycopg/adapter_datetime.c (psyco_TimestampFromTicks): "Hmmm, + looks like someone forgot that C expects months to start counting + from 0, but the Python date routines start counting from 1." That + was me: fixed. + +2005-05-31 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_execute): if a + UnicodeEncodeError is raised during the converion of a unicode + query we let it propagate insead of segfaulting. + +2005-5-27 Federico Di Gregorio, + + * tests/types_basic.py: fixed float and binary tests. + +2005-05-26 Federico Di Gregorio + + * Release 2.0b3. + + * ZPsycopgDA/db.py (DB.convert_description): isolated description + conversion (and fixed the conversion as per #18). + + * ZPsycopgDA/DA.py: fixed again; this time Zope should work for + real. :/ Also fixed the type-casters (psycopg 2 added the extra + cursor parameter) as reported in #18. + + * psycopg/psycopgmodule.c (init_psycopg): fixed Python 2.2 build. + +2005-05-19 Federico Di Gregorio + + * Release 2.0b2. + + * lib/extras.py (DictRow): Some extra methods for DictRow. + + * psycopg/cursor_type.c (_psyco_curs_execute): added explict check + to avoid using None as bound variables (very importand for cursor + subclasses calling cursor.execute(self, query, None). + +2005-05-18 Federico Di Gregorio + + * ZPsycopgDA/DA.py (ALLOWED_PSYCOPG_VERSIONS): updated to work + with 2.0b2 only (will support only the exact version untill final + 2.0 release.) + + * setup.py: Applied combined patch from Daniele Varrazzo and Jason + Erickson to build on win32 using MSVC or mingw. + +2005-05-15 Federico Di Gregorio + + * psycopg/microprotocols.c (microprotocols_adapt): fixed memory + leak on None as suggested by gh (closes: #16). + +2005-05-10 Federico Di Gregorio + + * lib/extras.py (DictRow): we now save a reference to the index + itself and not to the cursor to avoid problems while accessing + DictRow objects after reusing the cursor for a different query + (using Kevin Jacobs db_row would be much better but DictRow is + just an example, right?) + +2005-05-09 Federico Di Gregorio + + * Release 2.0 beta 1. + + * psycopg/typecast_datetime.c (typecast_PYDATETIME_cast): fixed a + typo (pyDateTimeModuleP->pyDateTimeTypeP) that was causing errors + with infinite datetime values. + + * psycopg/adapter_binary.c (binary_str): Py_XINCREF on the buffer + that can be NULL on error. + + * psycopg/typecast_binary.*: applied slightly modified + chunk/buffer object patch to allow round-trip of buffer objects + (BYTEA columns.) + + * psycopg/cursor_type.c (psyco_curs_executemany): applied slightly + fixed patch from wrobell to allow iterators in .executemany(). + +2005-04-18 Federico Di Gregorio + + * MANIFEST.in: included debian directory. + +2005-04-10 Federico Di Gregorio + + * psycopg/adapter_list.*: added list adapter. + + * psycopg/microprotocols.c (microprotocol_getquoted): moved + _mogrify_getquoted into utility function in the microprotocols + library. + + * setup.py: Added extensive error message on missing datetime + headers. + + * Applied mingw patch from Daniele Varazzo. + +2005-04-03 Federico Di Gregorio + + * lib/psycopg1.py (connection.autocommit): added compatibility + .autocommit() method. + + * psycopg/psycopgmodule.c (psyco_connect): factory -> + connection_factory. + + * lib/psycopg1.py: added psycopg 1.1.x compatibility module. + +2005-03-29 Federico Di Gregorio + + * Applied patch to fix tuple count. + + * psycopg/pqpath.c (pq_is_busy): Staring from bug report from + Jason Erickson fixed segfaults due to calling Python function + without holding the GIL. + +2005-03-24 Federico Di Gregorio + + * psycopg/adapter_binary.c (binary_escape): propagated Andrea's + fix to binary adapter. + + * psycopg/adapter_qstring.c (qstring_quote): applied patch from + Andrea Arcangeli to fix allocation failures (>4Gb) on 64 bit + arches. + + * psycopg/typecast_array.c (typecast_array_tokenize): much better + tokenization code. + +2005-03-23 Federico Di Gregorio + + * psycopg/typecast_basic.c: all the basic casters now respect the + passed string length. + + * psycopg/typecast.c (typecast_cast): set curs->caster to self + during the type-casting. + + * psycopg/cursor_type.c: added "typecaster" attribute to the + cursor (this is safe, cursors can't be shared among threads and + the attribute is RO.) + +2005-03-22 Federico Di Gregorio + + * psycopg/typecast_array.c: added some more structure to implement + array typecasting. + + * scripts/buildtypes.py: new version to include array data. + +2005-03-15 Federico Di Gregorio + + * lib/extensions.py: Added AsIs import. + +2005-03-12 Federico Di Gregorio + + * psycopg/cursor.h: removed "qattr", not used anymore and added + "cast", holding the typecaster currently in use. + + * Release 1.99.13. + + * psycopg/cursor_type.c (psyco_curs_executemany): implemented as a + wrapper to extract python arguments and then call + _psyco_curs_execute(). + + * psycopg/cursor_type.c (_psyco_curs_execute): splitted away + python argument parsing from the real execute code, to later allow + for .executemany(). + + * psycopg/cursor_type.c (_psyco_curs_buildrow_fill): modified to + call typecast_cast(). + + * psycopg/typecast.c (typecast_call/typecast_cast): modified + typecast_call to use the new typecast_cast that avoids one string + conversion on every cast. + +2005-03-04 Federico Di Gregorio + + * Release 1.99.12.1. + + * psycopg/adapter_asis.c (asis_str): changed call to PyObject_Repr + to PyObject_Str to avoid problems with long integers. + +2005-03-03 Federico Di Gregorio + + * psycopg/typecast.h: added array casting functions. + + * scripts/maketypes.sh: does not generate pgversion.h anymore. + + * Updated all examples for the release. + +2005-03-02 Federico Di Gregorio + + * Release 1.99.12. + + * psycopg/adapter_*.c: added __conform__ to all adapters. + + * psycopg/adapter_qstring.c (qstring_quote): we now use + PyString_AsStringAndSize() instead of strlen() that would stop at + the first embedded \0 (but note that libpq quoting function will + truncate the string anyway!) + + * COPY TO implemented using both old and new (v3) protocol. + + * psycopg/pqpath.c (_pq_copy_out_v3): implemented and working. + + * psycopg/cursor_type.c (psyco_curs_copy_to): added cursor object + interface for copy_to. + + * COPY FROM implemented using both old and new (v3) protocol. + + * psycopg/config.h (Dprintf): declaration for asprintf is gone. + + * psycopg/pqpath.c (_pq_copy_in_v3): implemented. + +2005-03-01 Federico Di Gregorio + + * setup.py: now we generate a slighly more verbose version string + that embeds some of the compile options, to facilitate users' bug + reports. + + * psycopg/cursor_type.c (psyco_curs_copy_from): we now use + PyOS_snprintf instead of asprintf. On some platforms this can be + bad (win32).. if that's your case, get a better platform. :/ + + * psycopg/microprotocols.c (microprotocols_adapt): fixed small + typo that made adaptation using __conform__ impossible. + +2005-02-28 Federico Di Gregorio + + * lib/extras.py: removed AsIs adapter (now a built-in); also + removed prepare() method from the adapters that don't use it to + avoid an extra method call at mogrification time. + + * psycopg/psycopgmodule.c (psyco_adapters_init): added + initialization of the AsIs adapter (adapts int, long, float and + *wonder* None!) + + * psycopg/cursor_type.c (_mogrify_getquoted): reorganized the code + to adapt and then call .getquoted() to obtain the quoted data into + this new function. + +2005-2-27 Federico Di Gregorio + + * examples/myfirstrecipe.py: fixed adapter registration. + +2005-2-7 Federico Di Gregorio + + * setup.py: added patch by Valentino Volonghi to build on MacOS X. + +2005-01-29 Federico Di Gregorio + + * psycopg/pqpath.c (_pq_fetch_tuples): fixed scale-related + segfault (*fourth* mail from Andrea. Another couple like this and + psycopg 2 will exit alpha at warp speed.) + + * psycopg/pqpath.c (pq_fetch): _pq_copy_out_3 -> _pq_copy_out_v3 + (second and third mail from Andrea. :/) + + * psycopg/cursor_type.c (_psyco_curs_has_write_check): added check + on .write() attribute, fixed compilation problems (first mail from + Andrea Arcangeli.) + +2005-01-20 Federico Di Gregorio + + * lib/extensions.py (register_adapter): added register_adapter + function, exported ISQLQuote in psycopg.extensions. + +2005-01-18 Federico Di Gregorio + + * psycopg/pqpath.c (_pq_fetch_tuples): ported scale/precision fix + from psycopg 1.1. + + * LICENSE: detailed licensing information. Re-licensed some parts + under BSD-like to allow integration is pysqlite. + +2005-01-13 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.query + ): ported ZPsycopgDA connection fix + from psycopg 1.1. + + * lib/*.py: added pydoc-friendly messages. + +2005-01-12 Federico Di Gregorio + + * Added debian directory (thanks to W. Borgert who sent initial + patch based on cdbs.) + +2004-12-20 Federico Di Gregorio + + * psycopg/pqpath.c (pq_execute): removed multiple calls to + pq_fetch in syncronous DBAPI compatibility mode to solve rowcount + problem. + +2004-12-14 Federico Di Gregorio + + * Mm.. release 1.99.11. + + * psycopg/cursor_type.c (_psyco_curs_prefetch): fixed bug in + interaction between the .isready() method and + _psyco_curs_prefetch: isready now store away the pgres but leave + prefetch do its work. + + * psycopg/*.c: changed the names of most of the psycopg's built-in + types to replect their position in the psycopg._psycopg module. + +2004-12-10 Federico Di Gregorio + + * psycopg/cursor_type.c: now *all* write or async accesses to the + connection object are arbitrated using the connection lock. + + * psycopg/cursor_type.c (psyco_curs_isready): now we reset the + current async cursor if it is ready, to allow other cursors to + .execute() without raising the "transaction in progress" error. + + * psycopg/pqpath.c (pq_is_busy): gained status of high-level + function with its own blocking and locking. + + * psycopg/cursor.h (EXC_IF_CURS_CLOSED): also checks the + connection (a closed connection implies a closed cursor.) + + * psycopg/cursor_type.c: cursor's connection is correctly + INCREFfed and DECREFfed. + + * psycopg/connection_type.c: removed the cursors list from the + connection object. It is not necessary anymore for the connection + to know about the cursors and the reference counting will keep the + connection alive (but possibly closed) until all cursors are + garbage collected. + +2004-11-20 Federico Di Gregorio + + * psycopg/cursor_type.c (_mogrify): ported %% fix from 1.1.15. + +2004-11-20 Federico Di Gregorio + + * psycopg/cursor_type.c (psyco_curs_execute): added check to raise an + exception if a cursor tries to .execute() while an async query is + already in execution froma different cursor. + +2004-11-20 Federico Di Gregorio + + * psycopg/connection_type.c (psyco_conn_cursor): renamed 'cursor' + argument to 'cursor_factory'. + +2004-11-19 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_buildrow_fill): now standard + tuples are filled using PyTuple_SET_ITEM while extended types + (created via row_factory) are filled using PySequence_SetItem. + + * psycopg/cursor_type.c: changed cursor attribute name from + tuple_factory to row_factory. + +2004-10-14 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_buildrow_fill): now we use + PySequence_SetItem to avoid problems with containers created from + cursor's .tuple_factory attribute. + + * lib/extras.py (DictCursor.execute): fixed stupid bug with cursor + setting self.tuplefactory instead of self.tuple_factory. + +2004-10-02 Federico Di Gregorio + + * Release 1.99.10. + + * psycopg/cursor_type.c (_psyco_curs_buildrow_*): unified normal + and factory code into the _psyco_curs_buildrow_fill function; no + more memory leaks here. + + * psycopg/config.h (round): added check for __FreeBSD__ (that + should be defined when compiling with gcc, I hope.) + + * setup.py: removed a lot of code now in setup.cfg. + +2004-09-24 Federico Di Gregorio + + * psycopg/cursor_type.c (cursor_dealloc): fixed small memory leak + due to missing disposal of self->pgres. + +2004-9-14 Federico Di Gregorio + + * examples/dialtone.py: Added adapt() example by Valentino + Volonghi. + +2004-09-14 Federico Di Gregorio + + * psycopg/microprotocols.c (microprotocols_adapt): lots of changes + to the microprotocols layer (it is not micro anymore); + implementing almost all the PEP 246. The adapter registry is now + indexed by (type, protocol) and not by type alone. + +2004-09-13 Federico Di Gregorio + + * psycopg/cursor_type.c (_mogrify): and qattr is gone. + +2004-09-05 Federico Di Gregorio + + * Release 1.99.9 (or, the "twisting by the pool" release). + + * psycopg/pqpath.c (_pq_fetch_tuples): changed to "static void" + instead of "static int", no ways for this function to fail. + +2004-09-04 Federico Di Gregorio + + * psycopg/pqpath.c (_pq_fetch_tuples): ported rowcount fix from + 1.1.15. + + * ZPsycopgDA/*: ZPsycopgDA back in action, using the new pooling + code. + +2004-08-29 Federico Di Gregorio + + * psycopg/typecast_basic.c (typecast_DECIMAL_cast): added DECIMAL + typecaster; it even works :). + + * scripts/buildtypes.py (basic_types): added DECIMAL typecaster + for the NUMERIC oid. + + * examples/threads.py: updated threads example to use pooling code. + + * lib/pool.py: added very simple and thread-safe connection + pooling class. + + * psycopg/cursor_type.c (psyco_curs_fetchmany): fixed problem with + .fetchall() and .fetchmany() returning None instead of [] on empty + result sets. + + * Release 1.99.8. + +2004-08-28 Federico Di Gregorio + + * psycopg/cursor_type.c (psyco_curs_execute): added processing of + unicode queries. + + * examples/encoding.py: much better encoding example, also using + the new UNICODE typecaster. + + * psycopg/typecast_basic.c (typecast_UNICODE_cast): added UNICODE + typecaster. + + * lib/extensions.py: the encodings dictionary is not available by + default but can be accessed from the psycopg.extensions module. + + * psycopg/adapter_qstring.h: remove encoding information from + qstring adapter and moved it into psycopg module. + +2004-08-26 Federico Di Gregorio + + * psycopg/cursor_type.c (_psyco_curs_prefetch): added check for + asynchronous fetch by wrong cursor. + + * psycopg/pqpath.c (pq_fetch): fixed backend status message (bug + reported by Daniele Varrazzo.) + +2004-07-29 Federico Di Gregorio + + * psycopg/typecast_basic.c (typecast_BINARY_cast): reverted to + using strings instead of buffers when converting postgresql binary + objects (should *temporarily* fix corruption bug reported on + win32.) + +2004-07-21 Federico Di Gregorio + + * psycopg/cursor_type.c: removed __iter__ and next methods from + object methods and moved them where they do belong (tp_iter and + tp_iternext.) Bug reported by Daniele Varrazzo (again!) + +2004-07-19 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_PYINTERVAL_cast): replaced + round() with micro() when rounding seconds (fixes bugs reported by + Daniele Varrazzo.) + +2004-07-16 Federico Di Gregorio + + * psycopg/pqpath.c (pq_set_critical): allow for a custom message + insted of the one from PQerrorMessage. + (pq_resolve_critical): added argument to specify if connection is + to be closed (used to not close it during COPY FROM/TO criticals.) + + * psycopg/cursor_type.c (psyco_curs_fileno, psyco_curs_isready): + added extension methods related to async queries. + +2004-07-15 Federico Di Gregorio + + * Release 1.99.7. + + * examples/tz.py: added example about time zones. + + * psycopg/typecast_datetime.c (typecast_PYDATETIME_cast): create + FixedOffsetTimezone for postgresql "timestamp with time zone" + types. + + * lib/tz.py: added (even more than) needed tzinfo classes. + + * psycopg/typecast.c (typecast_call): changed typecast call code + to take the additional cursor parameter, needed for + cursor-dependent type casting (tzinfo & friends.) + + * psycopg/cursor_type.c (_psyco_curs_buildrow_with_factory): added + use of tuple factories to fetcXXX methods. + + * lib/extras.py: little extra goodies for psycopg. + +2004-07-14 Federico Di Gregorio + + * Release 1.99.6. + + * psycopg/connection_type.c: added .dsn attribute to connection + objects. + + * psycopg/cursor_type.c (psyco_curs_mogrify): added .mogrify() + method. + + * psycopg/adapter_qstring.c: copy the connection encoding only if + wrapped object is unicode and added table of encodings. + +2004-07-13 Federico Di Gregorio + + * psycopg/cursor_type.c (_mogrify): moved Dprintf statement to + avoid dereferencing empty pointer (from 1.1.x) + (psyco_curs_execute): now we save the query in self->query instead + of freeing the memory ASAP. + (cursorObject_members): and we finally export the saved query + through the cursor members interface. that's all folks. + + * lib/extensions.py: added extensions module to clearly separate + psycopg own extensions from DBAPI-2.0 + +2004-07-10 Federico Di Gregorio + + * psycopg/typecast_datetime.c: ported interval fix from 1.1.x. + +2004-05-16 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_*_cast): fixed Value error + when seconds > 59 by setting minutes += 1 and seconds -= 60 + (reported by Marcel Gsteiger.) + +2004-04-24 Federico Di Gregorio + + * ported time interval patch by Ross Cohen from 1.1.12. + +2004-04-19 Federico Di Gregorio + + * psycopg/typecast_datetime.c (typecast_PYDATE_cast): applied + patch from Jason Erickson: min and max taken from datetime.Date + type. + +2004-04-18 Federico Di Gregorio + + * Applied changes from Jason Erickson to build on win32; see his + (slightly edited) entry below. (Still builds on Linux :) + + * psycopg/*.c: removed inclusion of pthread.h from all files + except psycopg/config.h to build on win32 without faking the file. + +2004-04-15 Jason Erickson + + * setup.py: Various changes. The critical ones: + - Make an empty pthread.h file so all the code doing an + #include will find something. + - Appended the winsock2 library and the PostgreSQL library to + the library path. + - Setup the include path. + - Have the PSYCOPG_VERSION macro be included with quotes. + + * config.h: Added/Cleaned up Win32 includes, defines, stub functions. + + * typecast.h: Removed ';' after PyObject_HEAD in the + typecastObject structure since Microsoft Visual Studio does not + like it. + +2004-04-15 Federico Di Gregorio + + * Release 1.99.5 (bug-fixing and reorganization) + + * setup.py et al.: moved psycopg to psycopg._psycopg to make + easier to provide high level python-only utilities (like the + promised pooling code). psycopg/__init__.py imports _psycopg and + make all the default DBAPI-2.0 stuff available. + +2004-04-14 Federico Di Gregorio + + * psycopg/psycopgmodule.c (initpsycopg): wrapped initialization of + date/time adapters in #ifdefs to have psycopg compile without mx + or builtin datetime. + +2004-04-10 Federico Di Gregorio + + * Release 1.99.4. + +2004-04-09 Federico Di Gregorio + + * psycopg/typecast_builtins.c: changed DATE to not include + DATETIME types anymore. + + * psycopg/adapter_datetime.c (pydatetime_str): switched from + strftime to isoformat to preserve fractional seconds. + +2004-04-08 Federico Di Gregorio + + * psycopg/psycopgmodule.c (psyco_connect): ported sslmode + parameter from 1.1 branch. + + * psycopg/adapter_datetime.*: added python built-in datetime + adapters. also added the datetime typecasters (still using mx as + default). + + * psycopg/typecast.h: removed aliases, they now live in the right + typecast_xxx.c file. + +2004-03-08 Federico Di Gregorio + + * Release 1.99.3 (alpha 4). + + * examples/lastrowid.py: and the .lastrowid example is in. + + * psycopg/cursor_type.c (_mogrify): added call to .prepare() + method in both dict and sequence path. + + * psycopg/connection_int.c (conn_set_client_encoding): added + encoding-change code. + + * psycopg/adapter_qstring.c (qstring_quote): added hard-coded + support for utf8 and latin1 encodings. + +2004-03-01 Federico Di Gregorio + + * psycopg/connection_int.c (conn_close): does not use libpq + functions on NULL pgconn (this can happen when conn_close is + called after a failed PQconnect.) + +2004-02-29 Federico Di Gregorio + + * Release 1.99.2 (alpha 3). + + * psycopg/cursor_type.c: added .rownumber and .connection + attributes. Also added .scroll(), .next() and .__iter__() methods + (see DBAPI2-.0 extensions on PEP.) + + * psycopg/connection_type.c (psyco_conn_set_isolation_level): + added connection method .set_isolation_level(). Also added all + error objects to the connection (see DBAPI2-.0 extensions on PEP.) + + * psycopg/connection_int.c (conn_switch_isolation_level): added + isolation level switching code. + + * setup.py: removed all references to PSYCOPG_NEWSTYLE: support + for python < 2.2 has been dropped. + + * typecast_basic.c (typecast_BINARY_cast): now binary objects are + returned as true buffers. + + * adapter_binary.*: added adapter for buffers and binary (bytea) + objects. + + * Release 1.99.1 (alpha 2). + + * adapter_mxdatetime.*: added adapters for all mx.DateTime types. + +2004-02-28 Federico Di Gregorio + + * cursor_type.c (_mogrify): complete rework of the mogrification + code to use the microprotocols_adapt function. + + * typecast_basic.c (typecast_BOOLEAN_cast): we now return real + Py_True and Py_False values. + + * microprotocols.h: added very simple microprotocols + implementation to allow for python->postgresql types registry. + +2004-01-05 Federico Di Gregorio + + * connection_int.c (conn_commit/conn_rollback): added code to + commit/rollback and connection methods. + +2004-01-04 Federico Di Gregorio + + * cursor_type.c (psyco_curs_fetchone): added fetchone method. + +2004-01-03 Federico Di Gregorio + + * added (empty) INSTALL file. + + * cursor_type.c (cursor_dealloc): added qattr for custom object + quoting using a callable attribute. + (_mogrify): ported new, fixed mogrification code from 1.1.12. + +2003-08-01 Federico Di Gregorio + + * cursor_type.c (_mogrify_sequence): added sequence mogrification, + can be done better, on the dict model. + +2003-07-28 Federico Di Gregorio + + * typeobj_qstring.c: added quoted strings (can use both own code, + like psycopg 1.x or PQescapeString from lipq.) + +2003-07-21 Federico Di Gregorio + + * connection_type.c (psyco_conn_close): added .close() + method. wow. + + * cursor_*.c: added basic cursor interface (new-style.) + +2003-07-20 Federico Di Gregorio + + * psycopg/*: beginning of new source layout. if you think this + changelog is somewhat empty, you're right. look at + doc/ChangeLog-1.x for psycopg 1.x changelog just before the + branch. + + diff --git a/trunk/psycopg2/INSTALL b/trunk/psycopg2/INSTALL new file mode 100644 index 0000000..873dbfa --- /dev/null +++ b/trunk/psycopg2/INSTALL @@ -0,0 +1,48 @@ +Compiling and installing psycopg +******************************** + +** Important note: if you plan to use psyopg2 in a multithreaed application + make sure that your libpq has been compiled with the --with-thread-safety + option. psycopg2 will work correctly even with a non-thread-safe libpq but + libpq will leak memory. + +While psycopg 1.x used autoconf for its build process psycopg 2 switched to +the more pythoning setup.py. Currently both psycopg's author and distutils +have some limitations so the file setup.cfg is almost unused and most build +options are hidden in setup.py. Before building psycopg look at setup.cfg file +and change any settings to follow your system (or taste); then: + + python setup.py build + +to build in the local directory; and: + + python setup.py install + +to install system-wide. + + +Using setuptools and EasyInstall +================================ + +If setuptools are installed on your system you can easily create an egg for +psycopg and install it. Download the source distribution (if you're reading +this file you probably already have) and then edit setup.cfg to your taste +and build from the source distribution top-level directory using: + + easy_install . + + +Compiling under Windows with mingw32 +==================================== + +You can compile psycopg under Windows platform with mingw32 +(http://www.mingw.org/) compiler. MinGW is also shipped with IDEs such as +Dev-C++ (http://www.bloodshed.net/devcpp.html) and Code::Blocks +(http://www.codeblocks.org). gcc binaries should be in your PATH. + +You need a PostgreSQL with include and libary files installed. At least v8.0 is required. + +First you need to create a libpython2X.a as described in +http://starship.python.net/crew/kernr/mingw32/Notes.html. Then run: + + python setup.py build_ext --compiler=mingw32 install diff --git a/trunk/psycopg2/LICENSE b/trunk/psycopg2/LICENSE new file mode 100644 index 0000000..b20b282 --- /dev/null +++ b/trunk/psycopg2/LICENSE @@ -0,0 +1,60 @@ +psycopg and the GPL +=================== + +psycopg 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. See file COPYING for details. + +As a special exception, specific permission is granted for the GPLed +code in this distribition to be linked to OpenSSL and PostgreSQL libpq +without invoking GPL clause 2(b). + +Note that the GPL was chosen to avoid proprietary adapters based on +psycopg code. Using psycopg in a proprietary product (even bundling +psycopg with the proprietary product) is fine as long as: + + 1. psycopg is called from Python only using only the provided API + (i.e., no linking with C code and no C modules based on it); and + + 2. all the other points of the GPL are respected (you offer a copy + of psycopg's source code, and so on.) + +Alternative licenses +==================== + +If you prefer you can use the Zope Database Adapter ZPsycopgDA (i.e., +every file inside the ZPsycopgDA directory) user the ZPL license as +published on the Zope web site, http://www.zope.org/Resources/ZPL. + +Also, the following BSD-like license applies (at your option) to the +files following the pattern psycopg/adapter*.{h,c} and +psycopg/microprotocol*.{h,c}: + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product documentation + would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + +psycopg 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. + +Proprietary licenses +==================== + +A non-exclusive license is available for companies that want to include +psycopg in their proprietary products without respecting the spirit of the +GPL. The price of the license is one day of development done by the author, +at the consulting fee he applies to his usual customers at the day of the +request. diff --git a/trunk/psycopg2/MANIFEST b/trunk/psycopg2/MANIFEST new file mode 100644 index 0000000..c8538ea --- /dev/null +++ b/trunk/psycopg2/MANIFEST @@ -0,0 +1,222 @@ +AUTHORS +ChangeLog +INSTALL +LICENSE +MANIFEST +MANIFEST.in +README +setup.cfg +setup.py +ZPsycopgDA/DA.py +ZPsycopgDA/__init__.py +ZPsycopgDA/db.py +ZPsycopgDA/pool.py +ZPsycopgDA/dtml/add.dtml +ZPsycopgDA/dtml/browse.dtml +ZPsycopgDA/dtml/edit.dtml +ZPsycopgDA/dtml/table_info.dtml +ZPsycopgDA/icons/bin.gif +ZPsycopgDA/icons/date.gif +ZPsycopgDA/icons/datetime.gif +ZPsycopgDA/icons/field.gif +ZPsycopgDA/icons/float.gif +ZPsycopgDA/icons/int.gif +ZPsycopgDA/icons/stable.gif +ZPsycopgDA/icons/table.gif +ZPsycopgDA/icons/text.gif +ZPsycopgDA/icons/time.gif +ZPsycopgDA/icons/view.gif +ZPsycopgDA/icons/what.gif +debian/changelog +debian/control +debian/copyright +debian/rules +doc/ChangeLog-1.x +doc/HACKING +doc/SUCCESS +doc/TODO +doc/api-screen.css +doc/async.txt +doc/extensions.html +doc/extensions.rst +doc/api/epydoc.css +doc/api/index.html +doc/api/private/__builtin__.list-class.html +doc/api/private/__builtin__.object-class.html +doc/api/private/__builtin__.type-class.html +doc/api/private/datetime.tzinfo-class.html +doc/api/private/epydoc.css +doc/api/private/exceptions.Exception-class.html +doc/api/private/exceptions.StandardError-class.html +doc/api/private/frames.html +doc/api/private/help.html +doc/api/private/index.html +doc/api/private/indices.html +doc/api/private/psycopg2-module.html +doc/api/private/psycopg2.DataError-class.html +doc/api/private/psycopg2.DatabaseError-class.html +doc/api/private/psycopg2.Error-class.html +doc/api/private/psycopg2.IntegrityError-class.html +doc/api/private/psycopg2.InterfaceError-class.html +doc/api/private/psycopg2.InternalError-class.html +doc/api/private/psycopg2.NotSupportedError-class.html +doc/api/private/psycopg2.OperationalError-class.html +doc/api/private/psycopg2.ProgrammingError-class.html +doc/api/private/psycopg2.Warning-class.html +doc/api/private/psycopg2._psycopg-module.html +doc/api/private/psycopg2._psycopg.ISQLQuote-class.html +doc/api/private/psycopg2._psycopg.connection-class.html +doc/api/private/psycopg2._psycopg.cursor-class.html +doc/api/private/psycopg2.extensions-module.html +doc/api/private/psycopg2.extras-module.html +doc/api/private/psycopg2.extras.DictConnection-class.html +doc/api/private/psycopg2.extras.DictCursor-class.html +doc/api/private/psycopg2.extras.DictRow-class.html +doc/api/private/psycopg2.extras.SQL_IN-class.html +doc/api/private/psycopg2.pool-module.html +doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html +doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html +doc/api/private/psycopg2.pool.PoolError-class.html +doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html +doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html +doc/api/private/psycopg2.psycopg1-module.html +doc/api/private/psycopg2.psycopg1.connection-class.html +doc/api/private/psycopg2.psycopg1.cursor-class.html +doc/api/private/psycopg2.tz-module.html +doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html +doc/api/private/psycopg2.tz.LocalTimezone-class.html +doc/api/private/toc-everything.html +doc/api/private/toc-psycopg2-module.html +doc/api/private/toc-psycopg2._psycopg-module.html +doc/api/private/toc-psycopg2.extensions-module.html +doc/api/private/toc-psycopg2.extras-module.html +doc/api/private/toc-psycopg2.pool-module.html +doc/api/private/toc-psycopg2.psycopg1-module.html +doc/api/private/toc-psycopg2.tz-module.html +doc/api/private/toc.html +doc/api/private/trees.html +doc/api/public/__builtin__.list-class.html +doc/api/public/__builtin__.object-class.html +doc/api/public/__builtin__.type-class.html +doc/api/public/datetime.tzinfo-class.html +doc/api/public/epydoc.css +doc/api/public/exceptions.Exception-class.html +doc/api/public/exceptions.StandardError-class.html +doc/api/public/frames.html +doc/api/public/help.html +doc/api/public/index.html +doc/api/public/indices.html +doc/api/public/psycopg2-module.html +doc/api/public/psycopg2.DataError-class.html +doc/api/public/psycopg2.DatabaseError-class.html +doc/api/public/psycopg2.Error-class.html +doc/api/public/psycopg2.IntegrityError-class.html +doc/api/public/psycopg2.InterfaceError-class.html +doc/api/public/psycopg2.InternalError-class.html +doc/api/public/psycopg2.NotSupportedError-class.html +doc/api/public/psycopg2.OperationalError-class.html +doc/api/public/psycopg2.ProgrammingError-class.html +doc/api/public/psycopg2.Warning-class.html +doc/api/public/psycopg2._psycopg-module.html +doc/api/public/psycopg2.extensions-module.html +doc/api/public/psycopg2.extras-module.html +doc/api/public/psycopg2.extras.DictConnection-class.html +doc/api/public/psycopg2.extras.DictCursor-class.html +doc/api/public/psycopg2.extras.DictRow-class.html +doc/api/public/psycopg2.extras.SQL_IN-class.html +doc/api/public/psycopg2.pool-module.html +doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html +doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html +doc/api/public/psycopg2.pool.PoolError-class.html +doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html +doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html +doc/api/public/psycopg2.psycopg1-module.html +doc/api/public/psycopg2.psycopg1.connection-class.html +doc/api/public/psycopg2.psycopg1.cursor-class.html +doc/api/public/psycopg2.tz-module.html +doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html +doc/api/public/psycopg2.tz.LocalTimezone-class.html +doc/api/public/toc-everything.html +doc/api/public/toc-psycopg2-module.html +doc/api/public/toc-psycopg2._psycopg-module.html +doc/api/public/toc-psycopg2.extensions-module.html +doc/api/public/toc-psycopg2.extras-module.html +doc/api/public/toc-psycopg2.pool-module.html +doc/api/public/toc-psycopg2.psycopg1-module.html +doc/api/public/toc-psycopg2.tz-module.html +doc/api/public/toc.html +doc/api/public/trees.html +examples/binary.py +examples/copy_from.py +examples/copy_to.py +examples/cursor.py +examples/dialtone.py +examples/dict.py +examples/dt.py +examples/encoding.py +examples/fetch.py +examples/lastrowid.py +examples/mogrify.py +examples/myfirstrecipe.py +examples/notify.py +examples/simple.py +examples/somehackers.jpg +examples/threads.py +examples/tz.py +examples/usercast.py +examples/whereareyou.jpg +lib/__init__.py +lib/extensions.py +lib/extras.py +lib/pool.py +lib/psycopg1.py +lib/tz.py +psycopg/adapter_asis.c +psycopg/adapter_asis.h +psycopg/adapter_binary.c +psycopg/adapter_binary.h +psycopg/adapter_datetime.c +psycopg/adapter_datetime.h +psycopg/adapter_list.c +psycopg/adapter_list.h +psycopg/adapter_mxdatetime.c +psycopg/adapter_mxdatetime.h +psycopg/adapter_pboolean.c +psycopg/adapter_pboolean.h +psycopg/adapter_qstring.c +psycopg/adapter_qstring.h +psycopg/config.h +psycopg/connection.h +psycopg/connection_int.c +psycopg/connection_type.c +psycopg/cursor.h +psycopg/cursor_int.c +psycopg/cursor_type.c +psycopg/microprotocols.c +psycopg/microprotocols.h +psycopg/microprotocols_proto.c +psycopg/microprotocols_proto.h +psycopg/pgtypes.h +psycopg/pgversion.h +psycopg/pqpath.c +psycopg/pqpath.h +psycopg/psycopg.h +psycopg/psycopgmodule.c +psycopg/python.h +psycopg/typecast.c +psycopg/typecast.h +psycopg/typecast_array.c +psycopg/typecast_basic.c +psycopg/typecast_binary.c +psycopg/typecast_binary.h +psycopg/typecast_builtins.c +psycopg/typecast_datetime.c +psycopg/typecast_mxdatetime.c +scripts/buildtypes.py +scripts/ext2html.py +scripts/makedocs.py +scripts/maketypes.sh +tests/dbapi20.py +tests/extras_dictcursor.py +tests/test_psycopg2_dbapi20.py +tests/types_basic.py diff --git a/trunk/psycopg2/MANIFEST.in b/trunk/psycopg2/MANIFEST.in new file mode 100644 index 0000000..457004c --- /dev/null +++ b/trunk/psycopg2/MANIFEST.in @@ -0,0 +1,12 @@ +recursive-include psycopg *.c *.h +recursive-include lib *.py +recursive-include tests *.py +recursive-include ZPsycopgDA *.py *.gif *.dtml +recursive-include examples *.py somehackers.jpg whereareyou.jpg +recursive-include debian * +recursive-include doc TODO HACKING SUCCESS ChangeLog-1.x async.txt +recursive-include scripts *.py *.sh +include scripts/maketypes.sh scripts/buildtypes.py +include AUTHORS README INSTALL LICENSE ChangeLog +include PKG-INFO MANIFEST.in MANIFEST setup.py setup.cfg +recursive-include doc *.rst *.css *.html diff --git a/trunk/psycopg2/PKG-INFO b/trunk/psycopg2/PKG-INFO new file mode 100644 index 0000000..2fab953 --- /dev/null +++ b/trunk/psycopg2/PKG-INFO @@ -0,0 +1,35 @@ +Metadata-Version: 1.0 +Name: psycopg2 +Version: 2.0.5.1 +Summary: Python-PostgreSQL Database Adapter +Home-page: http://initd.org/tracker/psycopg +Author: Federico Di Gregorio +Author-email: fog@initd.org +License: GPL with exceptions or ZPL +Download-URL: http://initd.org/pub/software/psycopg2 +Description: psycopg is a PostgreSQL database adapter for the Python programming + language. This is version 2, a complete rewrite of the original code to + provide new-style classes for connection and cursor objects and other sweet + candies. Like the original, psycopg 2 was written with the aim of being + very small and fast, and stable as a rock. + + psycopg is different from the other database adapter because it was + designed for heavily multi-threaded applications that create and destroy + lots of cursors and make a conspicuous number of concurrent INSERTs or + UPDATEs. psycopg 2 also provide full asycronous operations for the really + brave programmer. + +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU General Public License (GPL) +Classifier: License :: OSI Approved :: Zope Public License +Classifier: Programming Language :: Python +Classifier: Programming Language :: C +Classifier: Programming Language :: SQL +Classifier: Topic :: Database +Classifier: Topic :: Database :: Front-Ends +Classifier: Topic :: Software Development +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: Unix diff --git a/trunk/psycopg2/README b/trunk/psycopg2/README new file mode 100644 index 0000000..4e4a0e9 --- /dev/null +++ b/trunk/psycopg2/README @@ -0,0 +1,39 @@ +psycopg - Python-PostgreSQL Database Adapter +******************************************** + +psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other +sweet candies. Like the original, psycopg 2 was written with the aim of +being very small and fast, and stable as a rock. + +psycopg is different from the other database adapter because it was +designed for heavily multi-threaded applications that create and destroy +lots of cursors and make a conspicuous number of concurrent INSERTs or +UPDATEs. psycopg 2 also provide full asycronous operations for the really +brave programmer. + +There are confirmed reports of psycopg 1.x compiling and running on Linux +and FreeBSD on i386, Solaris, MacOS X and win32 architectures. psycopg 2 +does not introduce build-wise incompatible changes so it should be able to +compile on all architectures just as its predecessor did. + +Now go read the INSTALL file. More information about psycopg extensions to +the DBAPI-2.0 is available in the files located in the doc/ direcory. + +psycopg is free software ("free as in freedom" but I like beer too.) +Licensing information is available in the LICENSE file. + + +Contributors +------------ + +A short list of contributors to psycopg2 follows (if you feel you belong +to this list and you can't find yourself here just drop me a mail): + + * Kudos to piro for all the documentation work. + + * Peter Fein contributed a logging connection/cursor class that even if it + was not used directly heavily influenced the implementation currently in + psycopg2.extras. + diff --git a/trunk/psycopg2/ZPsycopgDA/DA.py b/trunk/psycopg2/ZPsycopgDA/DA.py new file mode 100644 index 0000000..2a0f4dd --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/DA.py @@ -0,0 +1,375 @@ +# ZPsycopgDA/DA.py - ZPsycopgDA Zope product: Database Connection +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + + +ALLOWED_PSYCOPG_VERSIONS = ('2.0.1', '2.0.2', '2.0.3', '2.0.4', '2.0.5') + +import sys +import time +import db +import re + +import Acquisition +import Shared.DC.ZRDB.Connection + +from db import DB +from Globals import HTMLFile +from ExtensionClass import Base +from App.Dialogs import MessageDialog +from DateTime import DateTime + +# Build Zope version in a float for later cheks +import App +zope_version = App.version_txt.getZopeVersion() +zope_version = float("%s.%s" %(zope_version[:2])) + +# ImageFile is deprecated in Zope >= 2.9 +if zope_version < 2.9: + from ImageFile import ImageFile +else: + from App.ImageFile import ImageFile + +# import psycopg and functions/singletons needed for date/time conversions + +import psycopg2 +from psycopg2 import NUMBER, STRING, ROWID, DATETIME +from psycopg2.extensions import INTEGER, LONGINTEGER, FLOAT, BOOLEAN, DATE +from psycopg2.extensions import TIME, INTERVAL +from psycopg2.extensions import new_type, register_type + + +# add a new connection to a folder + +manage_addZPsycopgConnectionForm = HTMLFile('dtml/add',globals()) + +def manage_addZPsycopgConnection(self, id, title, connection_string, + zdatetime=None, tilevel=2, + check=None, REQUEST=None): + """Add a DB connection to a folder.""" + self._setObject(id, Connection(id, title, connection_string, + zdatetime, check, tilevel)) + if REQUEST is not None: return self.manage_main(self, REQUEST) + + +# the connection object + +class Connection(Shared.DC.ZRDB.Connection.Connection): + """ZPsycopg Connection.""" + _isAnSQLConnection = 1 + + id = 'Psycopg2_database_connection' + database_type = 'Psycopg2' + meta_type = title = 'Z Psycopg 2 Database Connection' + icon = 'misc_/conn' + + def __init__(self, id, title, connection_string, + zdatetime, check=None, tilevel=2, encoding=''): + self.zdatetime = zdatetime + self.id = str(id) + self.edit(title, connection_string, zdatetime, + check=check, tilevel=tilevel, encoding=encoding) + + def factory(self): + return DB + + ## connection parameters editing ## + + def edit(self, title, connection_string, + zdatetime, check=None, tilevel=2, encoding=''): + self.title = title + self.connection_string = connection_string + self.zdatetime = zdatetime + self.tilevel = tilevel + self.encoding = encoding + + self.set_type_casts() + + if check: self.connect(self.connection_string) + + manage_properties = HTMLFile('dtml/edit', globals()) + + def manage_edit(self, title, connection_string, + zdatetime=None, check=None, tilevel=2, encoding='UTF-8', + REQUEST=None): + """Edit the DB connection.""" + self.edit(title, connection_string, zdatetime, + check=check, tilevel=tilevel, encoding=encoding) + if REQUEST is not None: + msg = "Connection edited." + return self.manage_main(self,REQUEST,manage_tabs_message=msg) + + def connect(self, s): + try: + self._v_database_connection.close() + except: + pass + + # check psycopg version and raise exception if does not match + if psycopg2.__version__[:5] not in ALLOWED_PSYCOPG_VERSIONS: + raise ImportError("psycopg version mismatch (imported %s)" % + psycopg2.__version__) + + self.set_type_casts() + self._v_connected = '' + dbf = self.factory() + + # TODO: let the psycopg exception propagate, or not? + self._v_database_connection = dbf( + self.connection_string, self.tilevel, self.encoding) + self._v_database_connection.open() + self._v_connected = DateTime() + + return self + + def set_type_casts(self): + # note that in both cases order *is* important + if self.zdatetime: + # use zope internal datetime routines + register_type(ZDATETIME) + register_type(ZDATE) + register_type(ZTIME) + else: + # use the standard + register_type(DATETIME) + register_type(DATE) + register_type(TIME) + + ## browsing and table/column management ## + + manage_options = Shared.DC.ZRDB.Connection.Connection.manage_options + # + ( + # {'label': 'Browse', 'action':'manage_browse'},) + + #manage_tables = HTMLFile('dtml/tables', globals()) + #manage_browse = HTMLFile('dtml/browse', globals()) + + info = None + + def table_info(self): + return self._v_database_connection.table_info() + + + def __getitem__(self, name): + if name == 'tableNamed': + if not hasattr(self, '_v_tables'): self.tpValues() + return self._v_tables.__of__(self) + raise KeyError, name + + def tpValues(self): + res = [] + conn = self._v_database_connection + for d in conn.tables(rdb=0): + try: + name = d['TABLE_NAME'] + b = TableBrowser() + b.__name__ = name + b._d = d + b._c = c + try: + b.icon = table_icons[d['TABLE_TYPE']] + except: + pass + r.append(b) + except: + pass + return res + + +## database connection registration data ## + +classes = (Connection,) + +meta_types = ({'name':'Z Psycopg 2 Database Connection', + 'action':'manage_addZPsycopgConnectionForm'},) + +folder_methods = { + 'manage_addZPsycopgConnection': manage_addZPsycopgConnection, + 'manage_addZPsycopgConnectionForm': manage_addZPsycopgConnectionForm} + +__ac_permissions__ = ( + ('Add Z Psycopg Database Connections', + ('manage_addZPsycopgConnectionForm', 'manage_addZPsycopgConnection')),) + +# add icons + +misc_={'conn': ImageFile('Shared/DC/ZRDB/www/DBAdapterFolder_icon.gif')} + +for icon in ('table', 'view', 'stable', 'what', 'field', 'text', 'bin', + 'int', 'float', 'date', 'time', 'datetime'): + misc_[icon] = ImageFile('icons/%s.gif' % icon, globals()) + + +## zope-specific psycopg typecasters ## + +# convert an ISO timestamp string from postgres to a Zope DateTime object +def _cast_DateTime(iso, curs): + if iso: + return DateTime(re.split("GMT\+?|GMT-?", iso)[0]) + + # this will split us into [date, time, GMT/AM/PM(if there)] + # dt = str.split(' ') + # if len(dt) > 1: + # # we now should split out any timezone info + # dt[1] = dt[1].split('-')[0] + # dt[1] = dt[1].split('+')[0] + # return DateTime(' '.join(dt[:2])) + # else: + # return DateTime(dt[0]) + +# convert an ISO date string from postgres to a Zope DateTime object +def _cast_Date(iso, curs): + if iso: + return DateTime(iso) + +# Convert a time string from postgres to a Zope DateTime object. +# NOTE: we set the day as today before feeding to DateTime so +# that it has the same DST settings. +def _cast_Time(iso, curs): + if iso: + return DateTime(time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(time.time())[:3]+ + time.strptime(iso[:8], "%H:%M:%S")[3:])) + +# NOTE: we don't cast intervals anymore because they are passed +# untouched to Zope. +def _cast_Interval(iso, curs): + return iso + +ZDATETIME = new_type((1184, 1114), "ZDATETIME", _cast_DateTime) +ZINTERVAL = new_type((1186,), "ZINTERVAL", _cast_Interval) +ZDATE = new_type((1082,), "ZDATE", _cast_Date) +ZTIME = new_type((1083,), "ZTIME", _cast_Time) + + +## table browsing helpers ## + +class TableBrowserCollection(Acquisition.Implicit): + pass + +class Browser(Base): + def __getattr__(self, name): + try: + return self._d[name] + except KeyError: + raise AttributeError, name + +class values: + def len(self): + return 1 + + def __getitem__(self, i): + try: + return self._d[i] + except AttributeError: + pass + self._d = self._f() + return self._d[i] + +class TableBrowser(Browser, Acquisition.Implicit): + icon = 'what' + Description = check = '' + info = HTMLFile('table_info', globals()) + menu = HTMLFile('table_menu', globals()) + + def tpValues(self): + v = values() + v._f = self.tpValues_ + return v + + def tpValues_(self): + r=[] + tname=self.__name__ + for d in self._c.columns(tname): + b=ColumnBrowser() + b._d=d + try: b.icon=field_icons[d['Type']] + except: pass + b.TABLE_NAME=tname + r.append(b) + return r + + def tpId(self): return self._d['TABLE_NAME'] + def tpURL(self): return "Table/%s" % self._d['TABLE_NAME'] + def Name(self): return self._d['TABLE_NAME'] + def Type(self): return self._d['TABLE_TYPE'] + + manage_designInput=HTMLFile('designInput',globals()) + def manage_buildInput(self, id, source, default, REQUEST=None): + "Create a database method for an input form" + args=[] + values=[] + names=[] + columns=self._columns + for i in range(len(source)): + s=source[i] + if s=='Null': continue + c=columns[i] + d=default[i] + t=c['Type'] + n=c['Name'] + names.append(n) + if s=='Argument': + values.append("'" % + (n, vartype(t))) + a='%s%s' % (n, boboType(t)) + if d: a="%s=%s" % (a,d) + args.append(a) + elif s=='Property': + values.append("'" % + (n, vartype(t))) + else: + if isStringType(t): + if find(d,"\'") >= 0: d=join(split(d,"\'"),"''") + values.append("'%s'" % d) + elif d: + values.append(str(d)) + else: + raise ValueError, ( + 'no default was given for %s' % n) + +class ColumnBrowser(Browser): + icon='field' + + def check(self): + return ('\t' % + (self.TABLE_NAME, self._d['Name'])) + def tpId(self): return self._d['Name'] + def tpURL(self): return "Column/%s" % self._d['Name'] + def Description(self): + d=self._d + if d['Scale']: + return " %(Type)s(%(Precision)s,%(Scale)s) %(Nullable)s" % d + else: + return " %(Type)s(%(Precision)s) %(Nullable)s" % d + +table_icons={ + 'TABLE': 'table', + 'VIEW':'view', + 'SYSTEM_TABLE': 'stable', + } + +field_icons={ + NUMBER.name: 'i', + STRING.name: 'text', + DATETIME.name: 'date', + INTEGER.name: 'int', + FLOAT.name: 'float', + BOOLEAN.name: 'bin', + ROWID.name: 'int' + } diff --git a/trunk/psycopg2/ZPsycopgDA/__init__.py b/trunk/psycopg2/ZPsycopgDA/__init__.py new file mode 100644 index 0000000..0af0ceb --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/__init__.py @@ -0,0 +1,31 @@ +# ZPsycopgDA/__init__.py - ZPsycopgDA Zope product +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + +__doc__ = "ZPsycopg Database Adapter Registration." +__version__ = '2.0' + +import DA + +def initialize(context): + context.registerClass( + DA.Connection, + permission = 'Add Z Psycopg 2 Database Connections', + constructors = (DA.manage_addZPsycopgConnectionForm, + DA.manage_addZPsycopgConnection), + icon = SOFTWARE_HOME + '/Shared/DC/ZRDB/www/DBAdapterFolder_icon.gif') diff --git a/trunk/psycopg2/ZPsycopgDA/db.py b/trunk/psycopg2/ZPsycopgDA/db.py new file mode 100644 index 0000000..9a0b4b0 --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/db.py @@ -0,0 +1,206 @@ +# ZPsycopgDA/db.py - query execution +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + +from Shared.DC.ZRDB.TM import TM +from Shared.DC.ZRDB import dbi_db + +from ZODB.POSException import ConflictError + +import site +import pool + +import psycopg2 +from psycopg2.extensions import INTEGER, LONGINTEGER, FLOAT, BOOLEAN, DATE, TIME +from psycopg2 import NUMBER, STRING, ROWID, DATETIME + + +# the DB object, managing all the real query work + +class DB(TM, dbi_db.DB): + + _p_oid = _p_changed = _registered = None + + def __init__(self, dsn, tilevel, enc='utf-8'): + self.dsn = dsn + self.tilevel = tilevel + self.encoding = enc + self.failures = 0 + self.calls = 0 + self.make_mappings() + + def getconn(self, create=True): + conn = pool.getconn(self.dsn) + conn.set_isolation_level(int(self.tilevel)) + return conn + + def putconn(self, close=False): + try: + conn = pool.getconn(self.dsn, False) + except AttributeError: + pass + pool.putconn(self.dsn, conn, close) + + def getcursor(self): + conn = self.getconn() + return conn.cursor() + + def _finish(self, *ignored): + try: + conn = self.getconn(False) + conn.commit() + self.putconn() + except AttributeError: + pass + + def _abort(self, *ignored): + try: + conn = self.getconn(False) + conn.rollback() + self.putconn() + except AttributeError: + pass + + def open(self): + # this will create a new pool for our DSN if not already existing, + # then get and immediately release a connection + self.getconn() + self.putconn() + + def close(self): + # FIXME: if this connection is closed we flush all the pool associated + # with the current DSN; does this makes sense? + pool.flushpool(self.dsn) + + def sortKey(self): + return 1 + + def make_mappings(self): + """Generate the mappings used later by self.convert_description().""" + self.type_mappings = {} + for t, s in [(INTEGER,'i'), (LONGINTEGER, 'i'), (NUMBER, 'n'), + (BOOLEAN,'n'), (ROWID, 'i'), + (DATETIME, 'd'), (DATE, 'd'), (TIME, 'd')]: + for v in t.values: + self.type_mappings[v] = (t, s) + + def convert_description(self, desc, use_psycopg_types=False): + """Convert DBAPI-2.0 description field to Zope format.""" + items = [] + for name, typ, width, ds, p, scale, null_ok in desc: + m = self.type_mappings.get(typ, (STRING, 's')) + items.append({ + 'name': name, + 'type': use_psycopg_types and m[0] or m[1], + 'width': width, + 'precision': p, + 'scale': scale, + 'null': null_ok, + }) + return items + + ## tables and rows ## + + def tables(self, rdb=0, _care=('TABLE', 'VIEW')): + self._register() + c = self.getcursor() + c.execute( + "SELECT t.tablename AS NAME, 'TABLE' AS TYPE " + " FROM pg_tables t WHERE tableowner <> 'postgres' " + "UNION SELECT v.viewname AS NAME, 'VIEW' AS TYPE " + " FROM pg_views v WHERE viewowner <> 'postgres' " + "UNION SELECT t.tablename AS NAME, 'SYSTEM_TABLE\' AS TYPE " + " FROM pg_tables t WHERE tableowner = 'postgres' " + "UNION SELECT v.viewname AS NAME, 'SYSTEM_TABLE' AS TYPE " + "FROM pg_views v WHERE viewowner = 'postgres'") + res = [] + for name, typ in c.fetchall(): + if typ in _care: + res.append({'TABLE_NAME': name, 'TABLE_TYPE': typ}) + self.putconn() + return res + + def columns(self, table_name): + self._register() + c = self.getcursor() + try: + r = c.execute('SELECT * FROM "%s" WHERE 1=0' % table_name) + except: + return () + self.putconn() + return self.convert_description(c.description, True) + + ## query execution ## + + def query(self, query_string, max_rows=None, query_data=None): + self._register() + self.calls = self.calls+1 + + desc = () + res = [] + nselects = 0 + + c = self.getcursor() + + try: + for qs in [x for x in query_string.split('\0') if x]: + if type(qs) == unicode: + if self.encoding: + qs = qs.encode(self.encoding) + try: + if query_data: + c.execute(qs, query_data) + else: + c.execute(qs) + except psycopg2.OperationalError, e: + try: + self.close() + except: + pass + self.open() + try: + if query_data: + c.execute(qs, query_data) + else: + c.execute(qs) + except (psycopg2.ProgrammingError, + psycopg2.IntegrityError), e: + if e.args[0].find("concurrent update") > -1: + raise ConflictError + raise e + except (psycopg2.ProgrammingError, psycopg2.IntegrityError), e: + if e.args[0].find("concurrent update") > -1: + raise ConflictError + raise e + if c.description is not None: + nselects += 1 + if c.description != desc and nselects > 1: + raise psycopg2.ProgrammingError( + 'multiple selects in single query not allowed') + if max_rows: + res = c.fetchmany(max_rows) + else: + res = c.fetchall() + desc = c.description + self.failures = 0 + + except StandardError, err: + self._abort() + raise err + + return self.convert_description(desc), res diff --git a/trunk/psycopg2/ZPsycopgDA/dtml/add.dtml b/trunk/psycopg2/ZPsycopgDA/dtml/add.dtml new file mode 100644 index 0000000..c718ded --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/dtml/add.dtml @@ -0,0 +1,96 @@ + + + + +

+A Zope Psycopg 2 Database Connection is used to connect and execute +queries on a PostgreSQL database. +

+ +

+In the form below Connection String (also called the Data Source Name +or DSN for short) is a string... (TODO: finish docs) +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Id +
+
+ +
+
+ Title +
+
+ +
+
+ Connection string +
+
+ +
+
+ Connect immediately +
+
+ +
+
+ Use Zope's internal DateTime +
+
+ +
+
+ Transaction isolation level +
+
+ +
+
+ +
+
+
+ + diff --git a/trunk/psycopg2/ZPsycopgDA/dtml/browse.dtml b/trunk/psycopg2/ZPsycopgDA/dtml/browse.dtml new file mode 100644 index 0000000..deffd0a --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/dtml/browse.dtml @@ -0,0 +1,11 @@ + + <dtml-var title_or_id >tables + + + + <dtml-var Type> + + + + diff --git a/trunk/psycopg2/ZPsycopgDA/dtml/edit.dtml b/trunk/psycopg2/ZPsycopgDA/dtml/edit.dtml new file mode 100644 index 0000000..7cb371f --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/dtml/edit.dtml @@ -0,0 +1,67 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ Title +
+
+ +
+
+ Connection string +
+
+ +
+
+ Use Zope's internal DateTime +
+
+ checked="YES" /> +
+
+ Transaction isolation level +
+
+ +
+
+ +
+
+
+ + diff --git a/trunk/psycopg2/ZPsycopgDA/dtml/table_info.dtml b/trunk/psycopg2/ZPsycopgDA/dtml/table_info.dtml new file mode 100644 index 0000000..639c23f --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/dtml/table_info.dtml @@ -0,0 +1,7 @@ + + + + owned by +
+ + diff --git a/trunk/psycopg2/ZPsycopgDA/icons/bin.gif b/trunk/psycopg2/ZPsycopgDA/icons/bin.gif new file mode 100644 index 0000000..e469126 Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/bin.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/date.gif b/trunk/psycopg2/ZPsycopgDA/icons/date.gif new file mode 100644 index 0000000..0d88a57 Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/date.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/datetime.gif b/trunk/psycopg2/ZPsycopgDA/icons/datetime.gif new file mode 100644 index 0000000..faa540b Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/datetime.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/field.gif b/trunk/psycopg2/ZPsycopgDA/icons/field.gif new file mode 100644 index 0000000..9bf8692 Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/field.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/float.gif b/trunk/psycopg2/ZPsycopgDA/icons/float.gif new file mode 100644 index 0000000..dd42729 Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/float.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/int.gif b/trunk/psycopg2/ZPsycopgDA/icons/int.gif new file mode 100644 index 0000000..ef2c5e3 Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/int.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/stable.gif b/trunk/psycopg2/ZPsycopgDA/icons/stable.gif new file mode 100644 index 0000000..acdd37d Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/stable.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/table.gif b/trunk/psycopg2/ZPsycopgDA/icons/table.gif new file mode 100644 index 0000000..cce83be Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/table.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/text.gif b/trunk/psycopg2/ZPsycopgDA/icons/text.gif new file mode 100644 index 0000000..a2e5aab Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/text.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/time.gif b/trunk/psycopg2/ZPsycopgDA/icons/time.gif new file mode 100644 index 0000000..6d08915 Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/time.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/view.gif b/trunk/psycopg2/ZPsycopgDA/icons/view.gif new file mode 100644 index 0000000..71b30de Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/view.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/icons/what.gif b/trunk/psycopg2/ZPsycopgDA/icons/what.gif new file mode 100644 index 0000000..8b5516e Binary files /dev/null and b/trunk/psycopg2/ZPsycopgDA/icons/what.gif differ diff --git a/trunk/psycopg2/ZPsycopgDA/pool.py b/trunk/psycopg2/ZPsycopgDA/pool.py new file mode 100644 index 0000000..05af0a5 --- /dev/null +++ b/trunk/psycopg2/ZPsycopgDA/pool.py @@ -0,0 +1,51 @@ +# ZPsycopgDA/pool.py - ZPsycopgDA Zope product: connection pooling +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# Or, at your option this program (ZPsycopgDA) can be distributed under the +# Zope Public License (ZPL) Version 1.0, as published on the Zope web site, +# http://www.zope.org/Resources/ZPL. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. +# +# See the LICENSE file for details. + +# all the connections are held in a pool of pools, directly accessible by the +# ZPsycopgDA code in db.py + +import threading +import psycopg2.pool + +_connections_pool = {} +_connections_lock = threading.Lock() + +def getpool(dsn, create=True): + _connections_lock.acquire() + try: + if not _connections_pool.has_key(dsn) and create: + _connections_pool[dsn] = \ + psycopg2.pool.PersistentConnectionPool(4, 200, dsn) + finally: + _connections_lock.release() + return _connections_pool[dsn] + +def flushpool(dsn): + _connections_lock.acquire() + try: + _connections_pool[dsn].closeall() + del _connections_pool[dsn] + finally: + _connections_lock.release() + +def getconn(dsn, create=True): + return getpool(dsn, create=create).getconn() + +def putconn(dsn, conn, close=False): + getpool(dsn).putconn(conn, close=close) diff --git a/trunk/psycopg2/debian/changelog b/trunk/psycopg2/debian/changelog new file mode 100644 index 0000000..44d83dc --- /dev/null +++ b/trunk/psycopg2/debian/changelog @@ -0,0 +1,12 @@ +psycopg2 (1.99.12.1-1) experimental; urgency=low + + * Adapted from patches sent by W. Borgert. + * Renamed source package to psycopg2. + + -- Federico Di Gregorio Fri, 4 Mar 2005 13:11:43 +0100 + +psycopg2 (1.99.11-0.1) unstable; urgency=low + + * Experimental package. + + -- W. Borgert Sun, 09 Jan 2005 10:14:09 +0000 diff --git a/trunk/psycopg2/debian/control b/trunk/psycopg2/debian/control new file mode 100644 index 0000000..9c63676 --- /dev/null +++ b/trunk/psycopg2/debian/control @@ -0,0 +1,51 @@ +Source: psycopg2 +Section: python +Priority: optional +Build-depends: postgresql-dev, debhelper (>> 3), python2.3-dev, cdbs +Maintainer: Federico Di Gregorio +Standards-Version: 3.6.1.1 + +Package: python-psycopg2 +Architecture: any +Section: python +Depends: python (>= 2.3), python (<< 2.4), python2.3-psycopg2 +Description: Python module for PostgreSQL [dummy package] + psycopg is a PostgreSQL database adapter for the Python programming + language. It was written from scratch with the aim of being very small + and fast, and stable as a rock. The main advantages of psycopg are that + it supports the full Python DBAPI-2.0 and being thread safe at level 2. + . + psycopg 2 is the next generation psycopg, implementing a much better + type system and even more DBAPI extensions: + . + * support for Python datetime and Decimal types; + * complete implementation of adapt() from PEP 246 to convert Python + types to PostgreSQL ones; + * COPY FROM/COPY TO support; + * inehritable connection and cursor objects and support for connection + and cursor factories; + * automatic encoding conversion and support for unicode queries. + . + This dummy package just depends on the right, default version of Python + and psycopg 2. + +Package: python2.3-psycopg2 +Architecture: any +Section: python +Depends: ${shlibs:Depends}, python2.3 +Description: Python 2.3 module for PostgreSQL + psycopg is a PostgreSQL database adapter for the Python programming + language. It was written from scratch with the aim of being very small + and fast, and stable as a rock. The main advantages of psycopg are that + it supports the full Python DBAPI-2.0 and being thread safe at level 2. + . + psycopg 2 is the next generation psycopg, implementing a much better + type system and even more DBAPI extensions: + . + * support for Python datetime and Decimal types; + * complete implementation of adapt() from PEP 246 to convert Python + types to PostgreSQL ones; + * COPY FROM/COPY TO support; + * inehritable connection and cursor objects and support for connection + and cursor factories; + * automatic encoding conversion and support for unicode queries. diff --git a/trunk/psycopg2/debian/copyright b/trunk/psycopg2/debian/copyright new file mode 100644 index 0000000..c631915 --- /dev/null +++ b/trunk/psycopg2/debian/copyright @@ -0,0 +1,10 @@ +psycopg 2 can be downloaded from: + + http://initd.org/pub/software/psycopg/ALPHA/ + +Copyright (c) 2001-2005 Federico Di Gregorio + +This program is distributed under the GNU GPL. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License can be found in '/usr/share/common-licenses/GPL'. diff --git a/trunk/psycopg2/debian/rules b/trunk/psycopg2/debian/rules new file mode 100755 index 0000000..98ad46f --- /dev/null +++ b/trunk/psycopg2/debian/rules @@ -0,0 +1,4 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/python-distutils.mk diff --git a/trunk/psycopg2/doc/ChangeLog-1.x b/trunk/psycopg2/doc/ChangeLog-1.x new file mode 100644 index 0000000..dadfc1b --- /dev/null +++ b/trunk/psycopg2/doc/ChangeLog-1.x @@ -0,0 +1,1744 @@ +2003-07-26 Federico Di Gregorio + + * Release 1.1.7. + + * ZPsycopgDA/db.py: added _cursor method that checks for self.db + before returning a new cursor. Should fix problem reported with + Zope 2.7. + +2003-07-23 Federico Di Gregorio + + * cursor.c: applied notify and fileno patch from Vsevolod Lobko. + +2003-07-20 Federico Di Gregorio + + * cursor.c (_mogrify_dict): applied (slightly modofied) patch from + Tobias Sargeant: now .execute() accept not only dictionaries but + every type that has a __getitem__ method. + +2003-07-13 Federico Di Gregorio + + * Release 1.1.6. + + * cursor.c (psyco_curs_scroll): added scroll method, patch from + Jason D.Hildebrand. + + * typemod.c (new_psyco_quotedstringobject): discard NUL characters + (\0) in quoted strings (fix problem reported by Richard Taylor.) + +2003-07-10 Federico Di Gregorio + + * Added python-taylor.txt in doc directory: very nice introduction + to DBAPI programming by Richard Taylor. + +2003-07-09 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): another MT problem exposed and + fixed by Sebastien Bigaret (self->keeper->status still LOCKED + after a fatal error during PQexec call.) + +2003-06-23 Federico Di Gregorio + + * Release 1.1.5.1. + + * ZPsycopgDA/db.py (DB.query): stupid error making ZPsycopgDA + unusable fixed (else->except). + +2003-06-22 Federico Di Gregorio + + * Release 1.1.5 candidate. + + * cursor.c (psyco_curs_copy_to): now any object with the write + method can be used as a copy_to target. + +2003-06-20 Federico Di Gregorio + + * cursor.c (psyco_curs_copy_from): applied patch to allow copy_to + from any object having a "readline" attribute (patch from Lex + Berezhny.) (psyco_curs_copy_from): another patch from Lex to make + psycopg raise an error on COPY FROM errors. + + * ZPsycopgDA/db.py (DB.query): if a query raise an exception, + first self._abort() is called to rollback current + "sub-transaction". this is a backward-compatible change for + people that think continuing to work in the same zope transaction + after an exception is a Good Thing (TM). + + * finally updated check_types.expected. checked by hand the + conversions work the right way. + + * doc/examples/work.py: fixed example. note that it is a long time + (at least two releases) that psycopg does not END a transaction + initiated explicitly by the user while in autocommit mode. + +2003-06-19 Federico Di Gregorio + + * cursor.c (_mogrify_dict): fixed dictionary mogrification (patch + by Vsevolod Lobko.) (_psyco_curs_execute): fixed keeper status + trashing problem by letting only one thread at time play with + keeper->status (as suggested by Sebastien Bigaret.) + +2003-05-07 Federico Di Gregorio + + * Release 1.1.4. + + * cursor.c: Added "statusmessage" attribute that holds the backend + message (modified lots of functions, look for self->status). + +2003-05-06 Federico Di Gregorio + + * typemod.c (new_psyco_datetimeobject): moved Py_INCREF into + XXX_FromMx functions, to fix memory leak reported by Jim Crumpler. + +2003-04-11 Federico Di Gregorio + + * module.h (PyObject_TypeCheck): fixed leak in python 2.1 + (Guido van Rossum). + +2003-04-08 Federico Di Gregorio + + * buildtypes.py (basic_types): removed LXTEXT (never user, does + not exists anymore.) + +2003-04-07 Federico Di Gregorio + + * setup.py: added very lame setup.py script. + +2003-04-02 Federico Di Gregorio + + * Release 1.3. + + * psycopg.spec: Added (but modified) spec file by William + K. Volkman (again, this change was lost somewhere in time...) + +2003-04-01 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): psycopg was reporting everything + as IntegrityError; reported and fix suggested by Amin Abdulghani. + +2003-03-21 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): debug statements sometimes made + psycopg segfault: fixed by a patch by Ken Simpson. + +2003-03-18 Federico Di Gregorio + + * cursor.c (alloc_keeper): patch from Dieter Maurer to unlock GIL + whaile calling PQconnectdb(). + +2003-03-05 Federico Di Gregorio + + * Release 1.1.2. + + * Applied cygwin patch from Hajime Nakagami. + +2003-02-25 Federico Di Gregorio + + * Release 1.1.2pre1. + + * cursor.c: added .lastrowid attribute to cursors (lastoid is + deprecated and will be removed sometime in the future.) + + * cursor.c (begin_pgconn): implemented various isolation levels + (also, in abort_pgconn, commit_pgconn.) + + * Added keyword parameters to psycopg.connect(): all take strings + (even port): database, host, port, user, password. + + * configure.in: fixed test for postgres version > 7.2. + + * cursor.c (_psyco_curs_execute): removed if on pgerr in default + case (if we enter default pgerr can't be one of the cased ones.) + Also applied slightly modified patch from William K. Volkman. + +2003-02-24 Federico Di Gregorio + + * Merged in changes from 1.0.15.1 (see below for merged + ChangeLog.) + +2003-02-14 Federico Di Gregorio + + * Release 1.0.15.1. + + * cursor.c (_mogrify_fmt): in some cases we where removing one + character too much from the format string, resulting in BIG BAD + BUG. Fixed. + +2003-02-13 Federico Di Gregorio + + * Release 1.0.15. + + * connection.c (_psyco_conn_close): now call dispose_pgconn on all + cursors, to make sure all phisical connections to the db are + closed (problem first reported by Amin Abdulghani.) + + * DBAPI-2.0 fixed mainly due to Stuart Bishop: + - cursor.c (psyco_curs_setinputsizes): removed PARSEARGS, as + this method does nothing. + - cursor.c (psyco_curs_setoutputsize): .setoutputsize was + spelled .setoutputsizes! fixed. Also removed PARSEARGS, as this + method does nothing. + +2003-02-12 Federico Di Gregorio + + * module.h (Dprintf): check on __APPLE__ to avoid variadic macros + on macos x (as reported by Stuart Bishop, btw, why gcc seems to + not support them on macos?) + + * cursor.c (_mogrify_fmt): non-alphabetic characters are dropped + after the closing ")" until a real alphabetic, formatting one is + found. (Fix bug reported by Randall Randall.) + +2003-02-05 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): patched again to take into + account leading zeroes. + +2003-02-02 Federico Di Gregorio + + * Makefile.pre.in: applied patch from Albert Chin-A-Young to + define BLDSHARED. + + * README: added explicit permission to link with OpenSSL. + +2003-01-30 Federico Di Gregorio + + * config.h.in: applied patch from Albert Chin-A-Young to fix + asprintf prototype. + +2003-01-29 Federico Di Gregorio + + * cursor.c (_mogrify_seq): fixed little refcount leak, as + suggested by Yves Bastide. + +2003-01-24 Federico Di Gregorio + + * Merged-in changes from 1.0.14.2 (emacs diff mode is great..) + + * Release 1.0.14.2. + + * ZPsycopgDA/db.py (DB.query): back to allowing up to 1000 db + errors before trying to reopen the connection by ourselves. + + * ZPsycopgDA/db.py: a false (None preferred, 0 allowed) max_rows + value now means "fetch all results". + +2003-01-22 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): fixed little memory leak + reported by Dieter Maurer. + +2003-01-20 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.tables/columns): added registration with + Zope's transaction machinery. + + * Release 1.0.14.1. + + * ZPsycopgDA/db.py: applied some fixes and cleanups by Dieter + Maurer (serialization problem were no more correctly detected!) + + * Release 1.0.14. + + * Merged in 1.0.14. + + * Import of 1.1.1 done. + + * Moved everything to cvs HEAD. + +2003-01-20 Federico Di Gregorio + + * ZPsycopgDA/connectionAdd.dtml: fixed typo (thanks to Andrew + Veitch.) + + * typeobj.c (psyco_INTERVAL_cast): applied patch from Karl Putland + to fix problems with fractional seconds. + +2002-12-03 Federico Di Gregorio + + * Release 1.0.14-pre2. + + * module.h: added macro for PyObject_TypeCheck if python version <2.2. + + * typeobj.c (psyco_DBAPITypeObject_coerce): added error message to + coercion errors. + +2002-12-02 Federico Di Gregorio + + * Release 1.0.14-pre1. + + * ZPsycopgDA/db.py (DB.sortKey): added sortKey(). + + * ZPsycopgDA/DA.py: applied a patch that was lost on hard disk + (sic), if you sent me a patch names psycopg-1.0.13.diff modifying + DA.py imports and want your name here, send me an email. :) + [btw, the patch fix the ImageFile import, getting it from Globals + as it is right.] + + * typeobj.c (psyco_DBAPITypeObject_coerce): Fixed coerce segfault + by checking explicitly for all the allowed types. + +2002-11-25 Federico Di Gregorio + + * doc/examples/*.py: added .rollback() to all exceptions before + deleteing the old table. + + * cursor.c: Apllied patch from John Goerzen (fix memory leak in + executemany). + +2002-10-25 Federico Di Gregorio + + * Release 1.0.13. + + * connection.c (_psyco_conn_close): remove cursors from the list + starting from last and moving backward (as suggested by Jeremy + Hylton; this is not such a big gain because python lists are + *linked* lists, but not removing the element 0 makes the code a + little bit clear.) + + * cursor.c (_psyco_curs_execute): now IntegrityError is raised + instead of ProgrammingError when adding NULL values to a non-NULL + column (suggested by Edmund Lian) and on referential integrity + violation (as per debian bug #165791.) + + * typeobj.c (psyco_DATE_cast): now we use 999999 instead of + 5867440 for very large (both signs) dates. This allow to re-insert + the DateTime object into postgresql (suggested by Zahid Malik.) + +2002-09-13 Federico Di Gregorio + + * Release 1.0.12. + + * Removed code to support COPY FROM/TO, will be added to new 1.1 + branch to be released next week. + + * cursor.c (_mogrify_seq): Fixed memory leak reported by Menno + Smits (values obtained by calling PySequence_GetItem are *new* + references!) + +2002-09-07 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): Added skeleton to support COPY + FROM/TO. + +2002-09-06 Federico Di Gregorio + + * configure.in: if libcrypt can't be found we probably are on + MacOS X: check for libcrypto, as suggested by Aparajita Fishman. + +2002-09-03 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.columns): Applied patch from Dieter Maurer + to allow the DA-browser to work with mixed case table names. + +2002-08-30 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_DateTime): Applied patch from Yury to fix + timestamps (before they were returned with time always set to 0.) + +2002-08-26 Federico Di Gregorio + + * Release 1.0.11.1 (to fix a %&£$"! bug in ZPsycopgDA not + accepting psycopg 1.0.11 as a valid version. + + * Release 1.0.11. + +2002-08-22 Federico Di Gregorio + + * Release 1.0.11pre2. + + * cursor.c (_psyco_curs_execute): fixed IntegrityError as reported + by Andy Dustman. (psyco_curs_execute): converting TypeError to + ProgrammingError on wrong number of % and/or aeguments. + + * doc/examples/integrity.py: added example and check for + IntegrityError. + +2002-08-08 Federico Di Gregorio + + * Release 1.0.11pre1. + +2002-08-06 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_DateTime): patched as suggested by Tom + Jenkins; now it shouldwork with time zones too. + +2002-08-01 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_DateTime): fixed problem with missing + AM/PM, as reported by Tom Jenkins. + +2002-07-23 Federico Di Gregorio + + * Fixed buglets reported by Mike Coleman. + +2002-07-22 Federico Di Gregorio + + * Release 1.0.10. + +2002-07-14 Federico Di Gregorio + + * Release 1.0.10pre2. + + * typeobj.c (psyco_LONGINTEGER_cast): fixed bad segfault by + INCREFfing Py_None when it is the result of a NULL conversion. + +2002-07-04 Federico Di Gregorio + + * Release 1.0.10pre1. + + * buildtypes.py (basic_types): added TIMESTAMPTZ to the types + converted by the DATE builtin. + + * ZPsycopgDA/DA.py (Connection.connect): Added version check. + +2002-07-03 Federico Di Gregorio + + * typeobj.c (psyco_XXX_cast): fixed bug reported by multiple users + by appliying Matt patch. + +2002-06-30 Federico Di Gregorio + + * ZPsycopgDA/DA.py (Connection.set_type_casts): applied patch from + Tom Jenkins to parse dates with TZ. + +2002-06-20 Federico Di Gregorio + + * Preparing for release 1.0.9. + + * Makefile.pre.in (dist): now we really include psycopg.spec. + +2002-06-17 Federico Di Gregorio + + * ZPsycopgDA/db.py (_finish, _abort): fixed problem with + connection left in invalid state by applying Tom Jenkins patch. + +2002-06-06 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB._abort): fixed exception raising after an + error in execute triggerer deletion of self.db. + +2002-05-16 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): None values passed to the + internal typecasters. + + * typeobj.c: added management of None to all the builtin + typecasters. + +2002-04-29 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_Time): applied 'seconds as a float' patch + from Jelle. + +2002-04-23 Federico Di Gregorio + + * Release 1.0.8. + + * Makefile.pre.in: we now include win32 related files in the + distribution. + + * connection.c (psyco_conn_destroy): fixed segfault reported by + Scott Leerssen (we were double calling _psyco_conn_close().) + + * typemod.c (new_psyco_quotedstringobject): fixed memory stomping + catched by assert(); thanks to Matt Hoskins for reporting this + one. + +2002-04-22 Federico Di Gregorio + + * configure.in: grmpf. we need a VERSION file for windows, we'll + use it for configue and debian/rules too. + + * Integrated win32 changes from Jason Erickson. Moved his + Readme.txt to README.win32, removed VERSION and DATE, patched + source where required. Renamed HISTORY to ChangeLog.win32, hoping + Jason will start adding changes to the real ChangeLog file. + +2002-04-07 Federico Di Gregorio + + * Release 1.0.7.1. + + * configure.in: fixed little bug as reported by ron. + +2002-04-05 Federico Di Gregorio + + * Release 1.0.7? + + * typemod.c (new_psyco_bufferobject): fixed encoding problem (0xff + now encoded as \377 and not \777.) Also encoding *all* chars as + quoted octal values to prevent "Invalid UNICODE character sequence + found" errors. + + * Release 1.0.7. (Real this time.) (Ok, it was a joke....) + +2002-04-03 Federico Di Gregorio + + * configure.in: fixed problem with postgres versions in the format + 7.2.x (sic.) + + * connection.c (psyco_conn_destroy): moved most of the destroy + stuff into its own function (_psyco_conn_close) and added a call + to it from psyco_conn_close. This should fix the "psycopg does not + release postgres connections on .close()" problem. + +2002-03-29 Federico Di Gregorio + + * Release 1.0.7. Delayed. + + * buildtypes.py (basic_types): added TIMESTAMPTZ postgres type to + the list of valid DATETIME types (incredible luck, no changes to + the parse are needed!) + + * typeobj.c (psyco_DATE_cast): fixed wrong managment of sign in + infinity. + +2002-03-27 Federico Di Gregorio + + * configure.in (INSTALLOPTS): added AC_PROG_CPP test, now uses + AC_TRY_CPP to test for _all_ required mx includes. + +2002-03-19 Federico Di Gregorio + + * configure.in: added check for both pg_config.h and config.h to + detect postgres version. + + * cursor.c: now None values are correctly handled when the format + string is not %s but %d, etc. + +2002-03-08 Federico Di Gregorio + + * ZPsycopgDA/DA.py: added MessageDialog import suggested by + Guido. + +2002-03-07 Federico Di Gregorio + + * psycopg.spec: added RPM specs by William K. Volkman. + + * Release 1.0.6. + + * configure.in: imported changes to allow postgres 7.2 builds from + unstable branch. + +2002-03-04 Federico Di Gregorio + + * Release 1.0.5. + + * applied table browser patch from Andy Dustman. + +2002-02-26 Federico Di Gregorio + + * typeobj.c (psyco_DATE_cast): added management of infinity + values, this can be done in a better way, by accessing the + MaxDateTime and MinDateTime constants of the mx.DateTime module. + +2002-02-20 Federico Di Gregorio + + * configure.in: Release 1.0.4. + +2002-02-12 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.columns): fixed select to reenable column + expansion in table browsing. + + * ZPsycopgDA/__init__.py: removed code that made psycopg think + double. + +2002-02-11 Federico Di Gregorio + + * cursor.c (_mogrify_dict): removed Py_DECREF of Py_None, + references returned by PyDict_Next() are borrowed (thanks to + Michael Lausch for this one.) + +2002-02-08 Federico Di Gregorio + + * A little bug slipped in ZPsycopgDA, releasing 1.0.3 immediately. + + * Release 1.0.2. + + * tests/check_types.py (TYPES): added check for hundredths of a + second. + +2002-02-07 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): patched to correct wrong + interpretation of hundredths of a second (patch from + A. R. Beresford, kudos!) + +2002-01-31 Federico Di Gregorio + + * FAQ: added. + +2002-01-16 Federico Di Gregorio + + * Preparing for release 1.0.1. + + * cursor.c (alloc_keeper): removed ALLOW_THREADS wrapper around + PQconnectdb: libpq calls crypt() that is *not* reentrant. + +2001-12-19 Federico Di Gregorio + + * typeobj.c (psyco_DBAPITypeObject_cmp): added check to simply + return false when two type objects are compared (type objects are + meaned to be compared to integers!) + + * typeobj.c: fixed the memory leak reported by the guys at + racemi, for real this time. (added about 5 DECREFS and 2 INCREFS, + ouch!) + +2001-12-17 Federico Di Gregorio + + * typeobj.c (psyco_DBAPITypeObject_cmp): fixed memory leak by + using PyTuple_GET_ITEM (we are sure the tuple has at least one + element, we built it, after all...) (many thanks to Scott Leerssen + for reporting the *exact line* for this one.) + +2001-12-13 Federico Di Gregorio + + * cursor.c: fixed memory leak due to extra strdup (thanks + to Leonardo Rochael Almeida.) + +2001-11-14 Federico Di Gregorio + + * Release 1.0. + + * doc/README: added explanation about guide work in progess but + examples working. + + * debian/*: lots of changes to release 1.0 in debian too. + +2001-11-12 Federico Di Gregorio + + * RELEASE-1.0: added release file, to celebrate 1.0. + + * tests/zope/typecheck.zexp: regression test on types for zope. + +2001-11-11 Federico Di Gregorio + + * ZPsycopgDA/DA.py (cast_Interval): removed typecast of interval + into zope DateTime. intervals are reported as strings when using + zope DateTime and as DateTimeDeltas when using mx. + +2001-11-09 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): complete rewrite of the + interval parsing code. now we don't use sscanf anymore and all is + done with custom code in a very tight and fast loop. + +2001-11-08 Federico Di Gregorio + + * ZPsycopgDA/DA.py (Connection.set_type_casts): added mx INTERVAL + type restore. + + * ZPsycopgDA/db.py (DB.query): now we return column names even if + there are no rows in the result set. also, cleaned up a little bit + the code. + +2001-11-7 Federico Di Gregorio, + + * Makefile.pre.in: fixed small problem with zcat on True64 + (thank you stefan.) + +2001-11-06 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB.query): added fix for concurrent update + from Chris Kratz. + +2001-11-05 Federico Di Gregorio + + * cursor.c: now we include postgres.h if InvalidOid is still + undefined after all other #includes. + + * README: clarified use of configure args related to python + versions. + + * aclocal.m4: patched to work with symlinks installations (thanks + to Stuart Bishop.) + + * cursor.c (_psyco_curs_execute): now reset the keeper's status to + the old value and not to BEGIN (solve problem with autocommit not + switching back.) + +2001-11-01 Federico Di Gregorio + + * doc/examples/dt.py: added example on how to use the date and + time constructors. + + * Makefile.pre.in (dist-zope): removed dependencies on GNU install + and tar commands. Also a little general cleanup on various targets. + + * ZPsycopgDA/DA.py: fixed mx.DateTime importing. + +2001-10-31 Federico Di Gregorio + + * typemod.c (psyco_xxxFromMx): fixed bug in argument parsing (we + weren't usigng the right type object.) + + * aclocal.m4: now builds OPT and LDFLAGS on the values of the env + variables instead of overwriting them. + + * Makefile.pre.in (CFLAGS): removed -Wall, you can add it back at + compile time with OPT="-Wall" ./configure ... + + * Setup.in (OPT): removed -Wall. + +2001-10-30 Michele Comitini + + * module.h: ANSI C compatibility patch from Daniel Plagge. + +2001-10-30 Federico Di Gregorio + + * README: added common building problems and solutions. + + * configure.in: removed check for install command, already done by + james's aclocal.m4 for python. removed install-sh. removed -s from + INSTALLOPTS. + +2001-10-29 Federico Di Gregorio + + * Makefile.pre.in (dist): removed examples/ directory from + distribution. + + * merge with cvs head. preparing to fork again on PSYCOPG-1-0 (i + admit BRANCH_1_0 was quite a silly name.) + + * doc/examples/usercast.py: now works. + + * connection.c (curs_rollbackall): fixed little bug (exposed by + the deadlock below) by changing KEEPER_READY to KEEPER_READY. + + * doc/examples/commit.py: deadlock problem solved, was the + example script, _not_ psycopg. pew... :) + + * examples/*: removed the examples moved to doc/examples/. + + * doc/examples/commit.py,dictfetch.py: moved from examples/ and + changed to work for 1.0. unfortunately commit.py locks psycopg!!! + +2001-10-24 Federico Di Gregorio + + * modified all files neede for the 1.0 release. + + * configure.in (MXFLAGS): removed electric fence support. + + * Makefile.pre.in (dist): now we remove CVS working files before + packing the tarball. + + * tests: files in this directory are not coding examples, but + regression tests. we need a sufficient number of tests to follow + every single code path in psycopg at least once. first test is + about datatypes. + + * doc/examples: moved new example code to examples directory, old + tests and code samples will stay in examples/ until the manual will + be finished. + +2001-10-16 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): completely revised interval + casting code. (psyco_TIME_cast): we use the unix epoch when the + date is undefined. + + * cursor.c (psyco_curs_executemany): modified sanity check to + accept sequences of tuples too and not just dictionaries. + +2001-10-15 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): fixed bug caused by wrong + parsing on '1 day' (no hours, minutes and seconds.) + +2001-10-15 Michele Comitini + + * cursor.c (_execute): use the correct cast functions even on + retrival of binary cursors. + +2001-10-12 Federico Di Gregorio + + * typemod.c (new_psyco_bufferobject): space not quoted anymore, + smarter formula to calculate realloc size. + + * cursor.c (psyco_curs_fetchone): removed static tuple (using + static variable in multithreaded code is *crazy*, why did i do it? + who knows...) + + * typeobj.c (psyco_init_types): exports the binary converter (will + be used in cursor.c:_execute.) + + * typeobj.h: added export of psyco_binary_cast object. + +2001-10-05 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): added missing Py_XDECREF on + casts list. + + * Makefile.pre.in (dist): added install-sh file to the + distribution. + + * replaced PyMem_DEL with PyObject_Del where necessary. + + * connection.c (psyco_conn_destroy): added missing + pthread_mutex_destroy on keeper lock. + +2001-10-01 Michele Comitini + + * typemod.c(new_psyco_bufferobject()): using unsigned char for + binary objects to avoid too many chars escaped. A quick and + simple formula to avoid memory wasting and too much reallocating + for the converted object. Needs _testing_, but it is faster. + + * cursor.c: #include + + * module.h: now debugging should be active only when asked by + ./configure --enable-devel + +2001-09-29 Federico Di Gregorio + + * cursor.c (new_psyco_cursobject): added locking of connection, + still unsure if necessary. + +2001-09-26 Federico Di Gregorio + + * configure.in: changed DEBUG into PSYCOTIC_DEBUG, to allow other + includes (postgres.h) to use the former. better compiler checks: + inline, ansi, gcc specific extensions. removed MXMODULE: we don't + need it anymore. + + * general #include cleanup, should compile on MacOS X too. + + * typeobj.c (psyco_DATE_cast): uses sscanf. should be faster too. + (psyco_TIME_cast): dixit. + + * applied patch from Daniel Plagge (SUN cc changes.) + +2001-09-22 Federico Di Gregorio + + * ZPsycopgDA/db.py (DB._finish, DB._begin): fix for the + self.db == None problem. + +2001-09-19 Michele Comitini + + * typemod.c (new_psyco_bufferobject): better memory managment + (now it allocates only needed space dinamically). + + * typeobj.c (psyco_BINARY_cast): ripped a useless check, now + it assumes that binary streams come out from the db correctly + escaped. Should be a lot faster. + +2001-09-18 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): fixed interval conversion + (hours were incorrectly converted into seconds.) + +2001-09-17 Federico Di Gregorio + + * cursor.c (_mogrify_seq, _mogrify_dict): added check for None + value and conversion of None -> NULL (fixes bug reported by Hamish + Lawson.) + +2001-09-12 Federico Di Gregorio + + * module.c: added handles to new date and time conversion + functions (see below.) + + * typemod.c (psyco_XXXFromMx): added conversion functions that + simply wrap the mxDateTime objects instead of creating + them. DBAPI-2.0 extension, off-curse. + +2001-09-10 Federico Di Gregorio + + * buildtypes.py: solved hidden bug by changing from dictionary to + list, to maintain ordering of types. sometimes (and just + sometimes) the type definitions were printed unsorted, resulting + is psycopg initializing the type system using the type objects in + the wrong order. you were getting float values from an int4 + column? be happy, this is now fixed... + + * cursor.c (psyco_curs_lastoid): added method to get oid of the + last inserted row (it was sooo easy, it even works...) + +2001-09-08 Federico Di Gregorio + + * typeobj.c (psyco_INTERVAL_cast): added casting function for the + postgres INTERVAL and TINTERVAL types (create a DateTimeDelta + object.) + +2001-09-05 Federico Di Gregorio + + * cursor.c: moved all calls to begin_pgconn to a single call in + _psyco_curs_execute, to leave the connection in a not-idle status + after a commit or a rollback. this should free a lot of resources + on the backend side. kudos to the webware-discuss mailing list + members and to Clark C. Evans who suggested a nice solution. + + * connection.c (curs_rollbackall, curs_commitall): removed calls + to begin_pgconn, see above. + + * module.c (initpsycopg): cleaned up mxDateTime importing; we now + use the right function from mxDateTime.h. Is not necessary anymore + to include our own mx headers. This makes psycopg to depend on + mxDateTime >= 2.0.0. + +2001-09-04 Federico Di Gregorio + + * doc/*.tex: added documentation directory and skeleton of the + psycopg guide. + +2001-09-03 Federico Di Gregorio + + * merged in changes from HEAD (mostly mcm fixes to binary + objects.) + + * preparing for release 0.99.6. + +2001-09-03 Michele Comitini + + * typemod.c: much faster Binary encoding routine. + + * typeobj.c: much faster Binary decoding routine. + +2001-08-28 Michele Comitini + + * typemod.c: Working binary object to feed data to bytea type + fields. + + * typeobj.c: Added BINARY typecast to extract data from + bytea type fields. + + * cursor.c: Added handling for SQL binary cursors. + +2001-08-3 Michele Comitini + + * cursor.c: fixed DATESTYLE problem thanx to Steve Drees. + +2001-07-26 Federico Di Gregorio + + * Makefile.pre.in: applied change suggested by Stefan H. Holek to + clobber and distclean targets. + +2001-07-23 Federico Di Gregorio + + * ZPsycopgDA/db.py: fixed little bugs exposed by multiple select + changes, not we correctly import ListType and we don't override + the type() function with a variable. + +2001-07-17 Federico Di Gregorio + + * configure.in: Release 0.99.5. + +2001-07-12 Federico Di Gregorio + + * debian/* fixed some little packaging problems. + +2001-07-11 Federico Di Gregorio + + * cursor.c, typeobj.c: removed some Py_INCREF on PyDict_SetItem + keys and values to avoid memory leaks. + +2001-07-03 Federico Di Gregorio + + * cursor.c (_mogrify_dict): added dictionary mogrification: all + Strings in the dictionary are translated into QuotedStrings. it + even works... (_mogrify_seq): added sequence mogrification and + code to automagically mogrify all strings passed to .execute(). + +2001-07-02 Federico Di Gregorio + + * Release 0.99.4. + + * typemod.c: added QuotedString class and methods. + + * module.c: added QuotedString method to module psycopg. + + * typemod.c: changed Binary objects into something usefull. now + the buffer object quotes the input by translatin every char into + its octal representation. this consumes 4x memory but guarantees + that even binary data containing '\0' can go into the Binary + object. + + * typemod.h: added definition of QuotedString object. + +2001-06-28 Federico Di Gregorio + + * ZPsycopgDA/db.py, ZPsycopgDA/DABase.py: applied patch sent by + yury to fix little buglet. + +2001-06-22 Federico Di Gregorio + + * Release 0.99.3. + + * connection.c (new_psyco_connobject): now we strdup dsn, as a fix + for the problem reported by Jack Moffitt. + + * Ok, this will be the stable branch from now on... + + * Merged in stuff from 0.99.3. About to re-branch with a better + name (BRANCH_1_0) + +2001-06-20 Federico Di Gregorio + + * Release 0.99.3. Showstoppers for 1.0 are: + - documentation + - mxDateTime module loading + - bug reported by Yury. + + * Integrated patches from Michele: + - searching for libcrypt in configure now works + - removed memory leak in asprintf.c + +2001-06-15 Federico Di Gregorio + + * ZPsycopgDA/__init__.py (initialize): applied patch from Jelle to + resolve problem with Zope 2.4.0a1. + +2001-06-14 Federico Di Gregorio + + * configure.in: added code to check for missing functions (only + asprintf at now.) + + * asprintf.c: added compatibility code for oses that does not have + the asprintf() function. + +2001-06-10 Federico Di Gregorio + + * Branched PSYCOPG_0_99_3. Development will continue on the cvs + HEAD, final adjustements and bugfixing should go to this newly + created branch. + +2001-06-08 Michele Comitini + + * ZPsycopgDA/DA.py: DateTime casts simplified and corrected + as suggested by Yury. + +2001-06-05 Federico Di Gregorio + + * Release 0.99.2. + + * Makefile.pre.in (dist): added typemod.h and typemod.c to + distribution. + + * cursor.c (commit_pgconn, abort_pgconn, begin_pgconn): resolved + segfault reported by Andre by changing PyErr_SetString invokations + into pgconn_set_critical. the problem was that the python + interpreter simply segfaults when we touch its internal data (like + exception message) inside an ALLOW_THREADS wrapper. + + * now that we are 100% DBAPI-2.0 compliant is time for the + one-dot-o release (at last!) Para-pa-pa! This one is tagged + PSYCOPG_0_99_1 but you can call it 1.0pre1, if you better like. + (A very long text just to say 'Release 0.99.1') + + * typemod.[ch]: to reach complete DBAPI-2.0 compliance we + introduce some new objects returned by the constructors Date(), + Time(), Binary(), etc. Those objects are module-to-database only, + the type system still takes care of the database-to-python + conversion. + +2001-06-01 Federico Di Gregorio + + * Release 0.5.5. + + * module.h: better error message when trying to commit on a + cursor derived from serialized connection. + + * ZPsycopgDA/db.py (DB.close): now self.cursor is set to None when + the connection is closed. + + * module.c (initpsycopg): added missing (sic) DBAPI module + parameters (paramstyle, apilevel, threadsafety, etc...) + +2001-05-24 Michele Comitini + + * ZPsycopgDA: Support for Zope's internal DateTime, option + to leave mxDateTime is available on the management interface so + to switch with little effort :). + + * cursor.c: more aggressive cleanup of postgres results + to avoid the risk of memory leaking. + + * typeobj.c, connection.c: deleted some Py_INCREF which + wasted memory. + +2001-05-18 Federico Di Gregorio + + * Release 0.5.4. + +2001-05-17 Michele Comitini + + * ZPsycopgDA/db.py: The connection closed by the management + interface of zope now raises error instead of reopening itself. + + * cursor.c (psyco_curs_close): does not try to free the cursor + list, as it caused a segfault on subsequent operations on the same + cursor. + +2001-05-07 Federico Di Gregorio + + * Release 0.5.3. + + * Merged in changes from me and mcm. + +2001-05-06 Michele Comitini + + * ZPsycopgDA/db.py (DB.close): Fixes a bug report by Andre + Shubert, which was still open since there was a tiny typo in + method definition. + + * ZPsycopgDA/DA.py (Connection.sql_quote__): overriding standard + sql_quote__ method to provide correct quoting (thank to Philip + Mayers and Casey Duncan for this bug report). + +2001-05-04 Federico Di Gregorio + + * ZPsycopgDA/db.py: added .close() method (as suffested by Andre + Schubert.) + +2001-05-04 Michele Comitini + + * module.h: working on a closed object now raises an + InterfaceError. + + * ZPsycopgDA/db.py: fixed problems with dead connections detection. + + * ZPsycopgDA/__init__.py: corrected SOFTWARE_HOME bug for zope + icon. + +2001-05-04 Federico Di Gregorio + + * examples/thread_test.py: now that the serialization bug is + fixed, it is clear that thread_test.py is bugged! added a commit() + after the creation of the first table to avoid loosing it on the + exception raised by the CREATE of an existing table_b. + +2001-05-03 Federico Di Gregorio + + * connection.c (psyco_conn_cursor): reverted to old locking + policy, the new caused a nasty deadlock. apparently the multiple + connection problem has been solved as a side-effect of the other + fixes... (?!) + + * module.h: removes stdkeeper field from connobject, we don't need + it anymore. + + * cursor.c (dispose_pgconn): now sets self->keeper to NULL to + avoid decrementing the keeper refcnt two times when the cursor is + first closed and then destroyed. + + * connection.c (psyco_conn_cursor): fixed little bug in cursor + creation: now the connection is locked for the entire duration of + the cursor creation, to avoid a new cursor to be created with a + new keeper due to a delay in assigning the stdmanager cursor. + + * cursor.c: added calls to pgconn_set_critical() and to + EXC_IFCRITICAL() where we expect problems. Still segfaults but at + least raise an exception... + + * cursor.c (psyco_curs_autocommit): added exception if the + cursor's keeper is shared between more than 1 cursor. + + * module.h (EXC_IFCRITICAL): added this macro that call + pgconn_resolve_critical) on critical errors. + + * cursor.c (alloc_keeper): added check for pgres == NULL. + + * cursor.c (psyco_curs_destroy): merged psyco_curs_destroy() and + psyco_curs_close(): now both call _psyco_curs_close() and destroy + does only some extra cleanup. + +2001-05-03 Michele Comitini + + * ZPsycopgDA/db.py: Some cleanup to bring the zope product up to + date with the python module. Some bugs found thanks to Andre + Schubert. Now the ZDA should rely on the new serialized version + of psycopg. + + * cursor.c: while looking for problems in the ZDA some come out + here, with the inability to handle dropping connection correctly. + This leads to segfaults and is not fixed yet for lack of time. + Some problems found in cursors not willing to share the same + connection even if they should. Hopefully it should be fixed + soon. + +2001-04-26 Federico Di Gregorio + + * fixed bug reported by Andre Schubert by adding a new cast + function for long integers (int8 postgresql type.) at now they are + converted to python LongIntegers: not sure f simply convert to + floats. + + * michele applied patch from Ivo van der Wijk to make zpsycopgda + behave better when INSTANCE_HOME != SOFTWARE_HOME. + + * cursor.c (_psyco_curs_execute): also fill the 'columns' field. + + * module.h: added a 'columns' field to cursobject, to better + support the new dictionary fetch functions (dictfetchone(), + dictfetchmany(), dictfetchall().) + + * cursor.c: added the afore-mentioned functions (function names + are not definitive, they will follow decisions on the DBAPI SIG.) + +2001-04-03 Federico Di Gregorio + + * Release 0.5.1. + + * mcm fixed a nasty bug by correcting a typo in module.h. + +2001-03-30 Federico Di Gregorio + + * module.c (psyco_connect): added `serialized' named argument to + the .connect() method (takes 1 or 0 and initialize the connection + to the right serialization state.) + + * Makefile.pre.in (dist): fixed little bug, a missing -f argument + to rm. + + * examples/thread_test.py: removed all extension cruft. + + * examples/thread_test_x.py: this one uses extensions like the + per-cursor commit, autocommit, etc. + + * README (psycopg): added explanation on how .serialize() works. + + * connection.c (psyco_conn_serialize): added cursor serialization + and .serialize() method on the connection object. now we are + definitely DBAPI-2.0 compliant. + +2001-03-20 Federico Di Gregorio + + * cursor.c (_psyco_curs_execute): replaced some fields in + description with None, as suggested on the DB-SIG ML. + + * something like one hundred of little changes to allow cursors + share the same postgres connection. added connkeeper object and + pthread mutexes (both in connobject and connkeeper.) apparently it + works. this one will be 0.5.0, i think. + +2001-03-19 Michele Comitini + + * cursor.c: added mutexes, they do not interact well with python + threads :(. + +2001-03-16 Michele Comitini + + * ZPsycopgDA/db.py (ZDA): some fixes in table browsing. + +2001-03-16 Federico Di Gregorio + + * suite/tables.postgresql (TABLE_DESCRIPTIONS): fixed some typos + introduced by copying by hand the type values from pg_type.h. + + * suite/*: added some (badly) structured code to test for + DBAPI-2.0 compliance. + + * cursor.c (pgconn_notice_callback): now the NOTICE processor only + prints NOTICEs when psycopg has been compiled with the + --enable-devel switch. + + * connection.c: removed 'autocommit' attribute, now is a method as + specified in the DBAPI-2.0 document. + +2001-03-15 Federico Di Gregorio + + * connection.c (curs_commitall): splitted for cycle in two to + avoid the "bad snapshot" problem. + +2001-03-14 Federico Di Gregorio + + * Release 0.4.6. + + * cursor.c (_psyco_curs_execute): fixed nasty bug, there was an + free(query) left from before the execute/callproc split. + + * Preparing for 0.4.6. + +2001-03-13 Federico Di Gregorio + + * cursor.c (psyco_curs_execute): fixed some memory leaks in + argument parsing (the query string was not free()ed.) + (psyco_curs_callproc): implemented callproc() method on cursors. + (_psyco_curs_execute): this is the function that does the real + stuff for callproc() and execute(). + (pgconn_notice_*): added translation of notices into python + exceptions (do we really want that?) + + * configure.in: removed some cruft (old comments and strncasecmp() + check) + +2001-03-12 Federico Di Gregorio + + * examples/thread_test.py: added moronic argument parsing: now you + can give the dsn string on the command line... :( + + * Release 0.4.5. + +2001-03-10 Federico Di Gregorio + + * cursor.c (request_pgconn): added code to set datestyle to ISO on + new connections (many thanks to Yury for the code, + i changed it just a little bit to raise an exception on error.) + +2001-03-09 Federico Di Gregorio + + * Release 0.4.4. + + * ZPsycopgDA/db.py: michele fixed a nasty bug here. + +2001-03-08 Federico Di Gregorio + + * Release 0.4.3. + +2001-03-07 Federico Di Gregorio + + * Makefile.pre.in (dist): typeobj_builtins.c included for people + without pg_type.h. if you encounter type-casting problems like + results cast to the wrong type, simply "rm typeobj_builtins.c" and + rebuild. + + * typeobj.c (psyco_*_cast): removed RETURNIFNULL() macro from all + the builtin casting functions. (psyco_STRING_cast) does not create + a new string anymore, simply Py_INCREF its argument and return it. + + * cursor.c (psyco_curs_fetchone): removed strdup() call. added + PQgetisnull() test to differentiate between real NULLs and empty + strings. + + * Removed cursor.py (mcm, put tests in examples) and fixed some + typos in the dtml code. + +2001-03-04 Michele Comitini + + * examples/commit_test.py: Modifications to test argument passing + and string substitution to cursor functions, nothing more. + + * ZPsycopgDA/db.py: now it exploits some of the good features of + the psycopg driver, such as connection reusage and type + comparison. Code is smaller although it handles (and + reports) errors much better. + + * cursor.c: corrected a bug that left a closed cursor in the + cursor list of the connection. Now cursors are removed from the + lists either when they are close or when they are destroyed. + Better connection (TCP) error reporting and handling. + + +2001-03-02 Federico Di Gregorio + + * examples commit_test.py: added code to test autocommit. + + * examples/thread_test.py (ab_select): modified select thread to + test autocommit mode. + + * Release 0.4.1. + + * module.h, connection.c, cursor.c: added autocommit support. + +2001-02-28 Federico Di Gregorio + + * Release 0.4. + +2001-02-27 Michele Comitini + + * cursor.py: cut some unuseful code in psyco_curs_fetchmany() and + psyco_curs_fetchall() inserted an assert in case someting goes + wrong. + +2001-02-27 Federico Di Gregorio + + * debian/*: various changes to build both the python module and + the zope db adapter in different packages (respectively + python-psycopg and zope-psycopgda.) + + * examples/type_test.py: better and more modular tests. + + * typeobj.c: added DATE, TIME, DATETIME, BOOLEAN, BINARY and ROWID + types. (RETURNIFNULL) added NULL-test to builtin conversion + functions (using the RETURNIFNULL macro.) + +2001-02-26 Federico Di Gregorio + + * releasing 0.3 (added NEWS file.) + +2001-02-26 Michele Comitini + + * cursor.c: fetchmany() some cleanup done. + + * ZPsycopgDA/db.py, ZPsycopgDA/__init__.py, : fixes to make the + ZDA work some way. WARNING WARNING WARNING the zda is still + alpha code, but we need some feed back on it so please give it + a try. + +2001-02-26 Federico Di Gregorio + + * typeobj.c (psyco_STRING_cast): fixed bad bad bad bug. we + returned the string without coping it and the type-system was more + than happy to Py_DECREF() it and trash the whole system. fixed at + last! + + * module.h (Dprintf): added pid to every Dprintf() call, to + facilitate multi-threaded debug. + +2001-02-26 Michele Comitini + + * module.c: added code so that DateTime package need not to be + loaded to have mxDateTime. This should avoid clashing with + DateTime from the zope distribution. + + * cursor.c: setting error message in fetchmany when no more tuples + are left. This has to be fixed in fetch and fetchall to. + +2001-02-26 Federico Di Gregorio + + * configure.in: stepped up version to 0.3, ready to release + tomorrow morning. added check for path to DateTime module. + + * examples/usercast_test.py: generate some random boxes and + points, select the boxes with at least one point inside and print + them converting the PostgeSQL output using a user-specified cast + object. nice. + +2001-02-24 Federico Di Gregorio + + * cursor.c (psyco_curs_fetchone): now an error in the python + callback when typecasting results raise the correct exception. + + * typeobj.c (psyco_DBAPITypeObject_call): removed extra Py_INCREF(). + +2001-02-23 Federico Di Gregorio + + * replaced every single instance of the string 'pgpy' with 'psyco' + (this was part of the general cleanup.) + + * type_test.py: added this little test program to the distribution + (use the new_type() method to create new instances of the type + objects.) + + * typeobj.c: general cleanup. fixed some bugs related to + refcounting (again!) + + * cursor.c: general cleanup. (request_pgconn) simplified by adding + a support function (_extract_pgconn.) + + * connection.c: general cleanup. replaced some ifs with asserts() + in utility functions when errors depend on programming errors and + not on runtime exceptions. (pgpy_conn_destroy) fixed little bug + when deleting available connections from the list. + + * module.h: general cleanup. + + * typeobj.h: general cleanup, better comments, made some function + declarations extern. + + * module.c: general cleanup, double-checked every function for + memory leaks. (pgpy_connect) removed unused variable 'connection'. + +2001-02-22 Federico Di Gregorio + + * typeobj.c: fixed lots of bugs, added NUMBER type object. now the + basic tests in type_test.py work pretty well. + + * cursor.c (pgpy_curs_fetchmany): fixed little bug, fetchmany() + reported one less row than available. + + * fixed lots of bugs in typeobj.c, typeobj.h, cursor.c. apparently + now the type system works. it is time to clean up things a little + bit. + +2001-02-21 Federico Di Gregorio + + * typeobj.c: separated type objects stuff from module.c + + * typeobj.h: separated type objects stuff from module.h + +2001-02-19 Federico Di Gregorio + + * cursor.c (pgpy_curs_fetchmany): now check size and adjust it to + be lesser or equal than the nuber of available rows. + +2001-02-18 Michele Comitini + + * module.c, module.h: added optional args maxconn and minconn to + connection functions + + * cursor.c: better error checking in request_pgconn. + + * connection.c: changed new_connect_obj to take as optional args + maxconn and minconn. Added the corresponding ro attributes to + connection objects. + + * cursor.py: added some code to stress test cursor reusage. + + * cursor.c: some fixes on closed cursors. + + * connection.c: corrections on some assert calls. + +2001-02-16 Federico Di Gregorio + + * configure.in: added --enable-priofile sqitch. changed VERSION to + 0.2: preparing for a new release. + + * cursor.c: added a couple of asserts. + +2001-02-16 Michele Comitini + + * cursor.c, connection.c: fixed the assert problem: assert must + take just the value to be tested! no assignemente must be done in + the argument of assert() otherwise is wiped when NDEBUG is set. + + * module.h: some syntax error fixed. Error in allocating a tuple + corrected in macro DBAPITypeObject_NEW(). + + * module.c: pgpy_DBAPITypeObject_init() is not declared static anymore. + + * cursor.c: executemany() now does not create and destroy tuples + for each list item, so it is much faster. + +2001-02-14 Michele Comitini + + * cursor.c: added again Py_DECREF on the cpcon after disposing + it. assert() with -DNDEBUG makes the driver segfault while it + should not. + + +2001-02-13 Federico Di Gregorio + + * some of the memory leak were memprof errors, bleah. resumed some + old code, fixed segfault, fixed other bugs, improved speed. almost + ready for a new release. + + * connection.c (pgpy_conn_destroy): replaced some impossible ifs + with aseert()s. + + * cursor.c (pgpy_curs_close): added Py_DECREF() to + self->descritpion to prevent a memory leak after an execute(). + + * connection.c (pgpy_conn_destroy): always access first element of + lists inside for cycles because removing items from the list makes + higher indices invalid. + + * cursor.c (dispose_pgconn): fixed memory leak, there was a + missing Py_DECREF() after the addition of the C object wrapping + the postgresql connection to the list of available connections. + + * cursor.c (dispose_pgconn): fixed another memory leak: an + orphaned cursor should call PQfinish() on its postgresql + connection because it has no python connection to give the + postgresql ine back. + + * cursor.c (pgpy_curs_execute): added Py_DECREF() of description + tuple after adding it to self->description. this one fixes the + execute() memory leak. + + * cursor.c (pgpy_curs_fetchall): added missing Py_DECREF() on row + data (obtained from fetchone().) this fixes the last memory leak. + (thread_test.py now runs without leaking memory!) + +2001-02-12 Federico Di Gregorio + + * INSTALL: removed wok cruft from head of this file. + + * debian/rules: debianized the sources. python-psycopg is about to + enter debian. mxDateTime header locally included until the + maintainer of python-mxdatetime includes them in his package + (where they do belong.) + + * autogen.sh: added option --dont-run-configure. + +2001-02-09 Federico Di Gregorio + + * module.c (initpsycopg): changed name of init function to match + new module name (also changed all the exception definitions.) + + * README: updated psycopg description (we have a new name!) + + * Ready for 0.1 release. + +2001-02-07 Michele Comitini + + * cursor.c: now executemany takes sequences and not just + tuples + +2001-02-07 Federico Di Gregorio + + * Makefile.pre.in: now dist target includes test programs + (thread_test.py) and README and INSTALL files. + + * configure.in: changed --with-devel to --enable-devel. little + cosmetical fixes to the option management. + + * connection.c, module.c, cursor.c, module.h: removed 'postgres/' + from #include directive. it is ./configure task to find the right + directory. + + * thread_test.py: added thread testing program. + +2001-02-07 Michele Comitini + + * cursor.c: added code to allow threads during PQexec() calls. + + * cursor.c: added begin_pgconn to rollback() and commit() + so that the cursror is not in autocommit mode. + + * cursor.c: added rollback() and commit() methods to cursor + objects. + + +2001-02-07 Federico Di Gregorio + + * connection.c (pgpy_conn_destroy): always delete item at index + 0 and not i (because items shift in the list while deleting and + accessing items at len(list)/2 segfaults.) + +2001-02-07 Michele Comitini + + * connection.c: added some more checking to avoid + clearing of already cleared pgresults. Calling curs_closall() + in conn_destroy() since cursors have to live even without + their parent connection, otherwise explicit deletion of + object referencing to those cursors can cause arbitrary code + to be executed. + + * cursor.c: some more checking to avoid trying to close + already close pgconnections. + +2001-02-06 Federico Di Gregorio + + * Makefile.pre.in (CFLAGS): added -Wall to catch bad programming + habits. + + * cursor.c, connection.c: lots of fixes to the destroy stuff. now + all the cursor are destroyed *before* the connection goes away. + + * cursor.c (request_pgconn): another idiot error done by not + replacing dsn with owner_conn->dsn. fixed. + (dispose_pgconn): commented if to guarantee that the connection is + returned to the pool of available connections. + + * merged changes done by mcm. + + * cursor.c: general cleanup and better debugging/error + messages. changed xxx_conn into xxx_pgconn where still + missing. some pretty big changes to the way pgconn_request() + allocates new connections. + + * connection.c: removed all 'register' integers. obsolete, gcc + does a much better job optimizing cycles than a programmer + specifying how to use registers. + + * module.h: some general cleanup and better definition of DPrintf + macro. now the DEBUG variable can be specified at configure time by + the --with-devel switch to ./configure. + +2001-02-02 Michele Comitini + + * cursor.c (Repository): Added functions for managing a connection + pool. Segfaults. + + * configure.in (Repository): removed check for mxdatetime headers. + +2001-01-24 Federico Di Gregorio + + * first checkout from shinning new init.d cvs. + + * autotoolized build system. note that the mx headers are missing + from the cvs, you should get them someplace else (this is the + right way to do it, just require the headers in the configure + script.) + +2001-01-21 Michele Comitini + + * cursor.c (Repository): commit, abort, begin functions now check + the right exit status of the command. + + * connection.c (Repository): working commit() and rollback() + methods. + +2001-01-20 Michele Comitini + + * module.h (Repository): added member to cursor struct to handle + queries without output tuples. + + * cursor.c (Repository): new working methods: executemany, + fetchone, fetchmany, fetchall. + +2001-01-18 Michele Comitini + + * cursor.c (Repository): close working. destroy calling close. + close frees pg structures correctly. + + * connection.c (Repository): close method working. destroy seems + working. + +2001-01-17 Michele Comitini + + * cursor.c (Repository): now each python cursor has its own + connection. Each cursor works in a transaction block. + + * connection.c (Repository): added cursor list to connection + object + +2001-01-14 Michele Comitini + + * cursor.c (Repository): Beginning of code to implement cursor + functionalities as specified in DBA API 2.0, through the use of + transactions not cursors. + + * connection.c (Repository): Added some error checking code for pg + connection (will be moved to cursor?). + +2001-01-13 Michele Comitini + + * connection.c (Repository): Added error checking in connection + code to fail if connection to the db could not be opened. + + * module.h (Repository): New macro to help creating + DBAPITypeObjects. + + * module.c (Repository): DBAPITypeObject __cmp__ function is now + very simplified using recursion. + + * module.h (Repository): "DBAPIObject" changed to + "DBAPITypeObject". + + * module.c (Repository): Fixes for coerce function of DBAPIObjects + by Federico Di Gregorio . + (Repository): Clean up and better naming for DBAPITypeObjects. + +2001-01-08 Michele Comitini + + * module.c (Repository): Corrected the exception hierarcy + + * connection.c (Repository): Begun to use the connection objects + of libpq + +2001-01-07 Michele Comitini + + * module.c (Repository): Added the Date/Time functions. + +2001-01-06 Michele Comitini + + * cursor.c (Repository): Skeleton of cursor interface. All + methods and attributes of cursor objects are now available + in python. They do nothing now. + +2001-01-05 Michele Comitini + + * module.c (Repository): Test version; module loaded with + exception defined. + +2001-01-05 Michele Comitini + + * Setup.in (Repository): Setup file. + + * Makefile.pre.in (Repository): from the python source. + +2001-01-05 Michele Comitini + + * module.c: Written some code for defining exceptions. + + * module.h: Static variable for exceptions. + +2001-01-04 Michele Comitini + + * Changelog: pre-release just a few prototypes to get started. + + diff --git a/trunk/psycopg2/doc/HACKING b/trunk/psycopg2/doc/HACKING new file mode 100644 index 0000000..f60474c --- /dev/null +++ b/trunk/psycopg2/doc/HACKING @@ -0,0 +1,43 @@ +General information +******************* + +Some help to people wanting to hack on psycopg. First of all, note that +*every* function in the psycopg module source code is prefixed by one of the +following words: + + psyco is used for function directly callable from python (i.e., functions + in the psycopg module itself.) the only notable exception is the + source code for the module itself, that uses "psyco" even for C-only + functions. + + conn is used for functions related to connection objects. + + curs is used for functions related to cursor objects. + + typecast is used for typecasters and utility function related to + typecaster creation and registration. + +Pythonic definition of types and functions available from python are defined +in *_type.c files. Internal functions, callable only from C are located in +*_int.c files and extensions to the DBAPI can be found in the *_ext.c files. + + +Patches +******* + +If you submit a patch, please send a diff generated with the "-u" switch. +Also note that I don't like that much cosmetic changes (like renaming +already existing variables) and I will rewrap the patch to 78 columns +anyway, so it is much better if you do that beforehand. + + +The type system +*************** + +Simple types, like integers and strings, are converted to python base types +(the conversion functions are in typecast_base.c). Complex types are +converted to ad-hoc types, defined in the typeobj_*.{c,h} files. The +conversion function are in the other typecast_*.c files. typecast.c defines +the basic utility functions (available through the psycopg module) used when +defining new typecasters from C and python. + diff --git a/trunk/psycopg2/doc/SUCCESS b/trunk/psycopg2/doc/SUCCESS new file mode 100644 index 0000000..9ae91f5 --- /dev/null +++ b/trunk/psycopg2/doc/SUCCESS @@ -0,0 +1,114 @@ +From: Jack Moffitt +To: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 22 Oct 2001 11:16:21 -0600 + +www.vorbis.com is serving from 5-10k pages per day with psycopg serving +data for most of that. + +I plan to use it for several of our other sites, so that number will +increase. + +I've never had a single problem (that wasn't my fault) besides those +segfaults, and those are now gone as well, and I've been using psycopg +since June (around 0.99.2?). + +jack. + + +From: Yury Don +To: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 09:53:11 +0600 + +We use psycopg and psycopg zope adapter since fisrt public +release (it seems version 0.4). Now it works on 3 our sites and in intranet +applications. We had few problems, but all problems were quckly +solved. The strong side of psycopg is that it's code is well organized +and easy to understand. When I found a problem with non-ISO datestyle in first +version of psycopg, it took for me 15 or 20 minutes to learn code and +to solve the problem, even thouth my knowledge of c were poor. + +BTW, segfault with dictfetchall on particular data set (see [Psycopg] +dictfetchXXX() problems) disappeared in 0.99.8pre2. + +-- +Best regards, +Yury Don + + +From: Tom Jenkins +To: Federico Di Gregorio +Cc: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 08:25:52 -0400 + +The US Govt Department of Labor's Office of Disability Employment +Policy's DisabilityDirect website is run on zope and zpsycopg. + + +From: Scott Leerssen +To: Federico Di Gregorio +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 09:56:10 -0400 + +Racemi's load management software infrastructure uses psycopg to handle +complex server allocation decisions, plus storage and access of +environmental conditions and accounting records for potentially +thousands of servers. Psycopg has, to this point, been the only +Python/PostGreSQL interface that could handle the scaling required for +our multithreaded applications. + +Scott + + +From: Andre Schubert +To: Federico Di Gregorio +Cc: Psycopg Mailing List +Subject: Re: [Psycopg] preparing for 1.0 +Date: 23 Oct 2001 11:46:07 +0200 + +i have changed the psycopg version to 0.99.8pre2 on all devel-machines +and all segfaults are gone. after my holiday i wil change to 0.99.8pre2 +or 1.0 on our production-server. +this server contains several web-sites which are all connected to +postgres over ZPsycopgDA. + +thanks as + + +From: Fred Wilson Horch +To: +Subject: [Psycopg] Success story for psycopg +Date: 23 Oct 2001 10:59:17 -0400 + +Due to various quirks of PyGreSQL and PoPy, EcoAccess has been looking for +a reliable, fast and relatively bug-free Python-PostgreSQL interface for +our project. + +Binary support in psycopg, along with the umlimited tuple size in +PostgreSQL 7.1, allowed us to quickly prototype a database-backed file +storage web application, which we're using for file sharing among our +staff and volunteers. Using a database backend instead of a file system +allows us to easily enrich the meta-information associated with each file +and simplifies our data handling routines. + +We've been impressed by the responsiveness of the psycopg team to bug +reports and feature requests, and we're looking forward to using psycopg +as the Python interface for additional database-backed web applications. + +Keep up the good work! +-- +Fred Wilson Horch mailto:fhorch@ecoaccess.org +Executive Director, EcoAccess http://ecoaccess.org/ + + +From: Damon Fasching +To: Michele Comitini +Cc: fog@debian.org +Subject: Re: How does one create a database within Python using psycopg? +Date: 25 Feb 2002 17:39:41 -0800 + +[snip] +btw I checked out 4 different Python-PostgreSQL packages. psycopg is the +only one which built and imported w/o any trouble! (At least for me.) diff --git a/trunk/psycopg2/doc/TODO b/trunk/psycopg2/doc/TODO new file mode 100644 index 0000000..b20b276 --- /dev/null +++ b/trunk/psycopg2/doc/TODO @@ -0,0 +1,33 @@ +TODO list for psycopg 2 or later +******************************** + +Move items to the DONE section only after writing a test for the +implementation. Also add a note on how the item was resolved. +(Obviously I was joking about the test..) + +* Find a better way to compile the type-casting code instead of including it + in typecast.c directy. (Including is not that bad, but the need to touch + psycopg/typecast.c every time is bad bad bad.) + +* executemany() should _not_ take the async flag, remove it and force multiple + queries to be synchronous. + +* Fix all the docstrings. + +* Support the protocols API fully. + +* Unify the common code in typecast_datetime.c and typecast_mxdatetime.c. + +* Port typecasters to new-style classes. + +* Write a complete postgresql<->python encodings table. + +* Implement binary typecasters (should be easy, but it will take time.) + +DONE +==== + +* Convert type-casters to new-style types in Python 2.2+. + +* callproc() never worked, fix it or remove it and raise right exception. + [Removed callproc code, now an exception is raised.] diff --git a/trunk/psycopg2/doc/api-screen.css b/trunk/psycopg2/doc/api-screen.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/trunk/psycopg2/doc/api-screen.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/trunk/psycopg2/doc/api/epydoc.css b/trunk/psycopg2/doc/api/epydoc.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/trunk/psycopg2/doc/api/epydoc.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/trunk/psycopg2/doc/api/index.html b/trunk/psycopg2/doc/api/index.html new file mode 100644 index 0000000..419bbcf --- /dev/null +++ b/trunk/psycopg2/doc/api/index.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/trunk/psycopg2/doc/api/private/__builtin__.list-class.html b/trunk/psycopg2/doc/api/private/__builtin__.list-class.html new file mode 100644 index 0000000..c8217a7 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/__builtin__.list-class.html @@ -0,0 +1,817 @@ + + + + + __builtin__.list + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class list +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type list

+ +
+object --+
+         |
+        list
+

+ +
Known Subclasses:
+
+ DictRow
+ +
+ +

list() -> new list +list(sequence) -> new list initialized from sequence's items

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getitem__(x, + y) +
+Return x[y]...
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__add__(x, + y) +
(Addition operator) +

+
+
Returns:
+
+
+x+y
+
+
+
+
+
+ + +
+

__contains__(x, + y) +
(In operator) +

+
+
Returns:
+
+
+y in x
+
+
+
+
+
+ + +
+

__delitem__(x, + y) +
(Index deletion operator) +

+
+
Returns:
+
+
+del x[y]
+
+
+
+
+
+ + +
+

__delslice__(x, + i, + j) +
(Slice deletion operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+del x[i:j]
+
+
+
+
+
+ + +
+

__eq__(x, + y) +
(Equality operator) +

+
+
Returns:
+
+
+x==y
+
+
+
+
+
+ + +
+

__ge__(x, + y) +
(Greater-than-or-equals operator) +

+
+
Returns:
+
+
+x>=y
+
+
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__getitem__(x, + y) +
(Indexing operator) +

+
+
Returns:
+
+
+x[y]
+
+
+
+
+
+ + +
+

__getslice__(x, + i, + j) +
(Slicling operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]
+
+
+
+
+
+ + +
+

__gt__(x, + y) +
(Greater-than operator) +

+
+
Returns:
+
+
+x>y
+
+
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__iadd__(x, + y) +

+
+
Returns:
+
+
+x+=y
+
+
+
+
+
+ + +
+

__imul__(x, + y) +

+
+
Returns:
+
+
+x*=y
+
+
+
+
+
+ + +
+

__iter__(x) +

+
+
Returns:
+
+
+iter(x)
+
+
+
+
+
+ + +
+

__le__(x, + y) +
(Less-than-or-equals operator) +

+
+
Returns:
+
+
+x<=y
+
+
+
+
+
+ + +
+

__len__(x) +
(Length operator) +

+
+
Returns:
+
+
+len(x)
+
+
+
+
+
+ + +
+

__lt__(x, + y) +
(Less-than operator) +

+
+
Returns:
+
+
+x<y
+
+
+
+
+
+ + +
+

__mul__(x, + n) +

+
+
Returns:
+
+
+x*n
+
+
+
+
+
+ + +
+

__ne__(x, + y) +
(Inequality operator) +

+
+
Returns:
+
+
+x!=y
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__rmul__(x, + n) +

+
+
Returns:
+
+
+n*x
+
+
+
+
+
+ + +
+

__setitem__(x, + i, + y) +
(Index assignment operator) +

+
+
Returns:
+
+
+x[i]=y
+
+
+
+
+
+ + +
+

__setslice__(x, + i, + j, + y) +
(Slice assignment operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]=y
+
+
+
+
+
+ + +
+

append(L, + object) +

+

append object to end

+
+
+
+ + +
+

count(L, + value) +

+

return number of occurrences of value

+
+
Returns:
+
+
+integer
+
+
+
+
+
+ + +
+

extend(L, + iterable) +

+

extend list by appending elements from the iterable

+
+
+
+ + +
+

index(...) +

+

L.index(value, [start, [stop]]) -> integer -- return first index of value

+
+
+
+ + +
+

insert(L, + index, + object) +

+

insert object before index

+
+
+
+ + +
+

pop(L, + index=...) +

+

remove and return item at index (default last)

+
+
Returns:
+
+
+item
+
+
+
+
+
+ + +
+

remove(L, + value) +

+

remove first occurrence of value

+
+
+
+ + +
+

reverse(L) +

+

reverse IN PLACE

+
+
+
+ + +
+

sort(L, + cmpfunc=None) +

+

stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/__builtin__.object-class.html b/trunk/psycopg2/doc/api/private/__builtin__.object-class.html new file mode 100644 index 0000000..08d0af6 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/__builtin__.object-class.html @@ -0,0 +1,270 @@ + + + + + __builtin__.object + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class object +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type object

+ +
Known Subclasses:
+
+ AbstractConnectionPool, + list, + SQL_IN, + type, + tzinfo, + connection, + cursor, + ISQLQuote
+ +
+ +

The most base type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + +
Class Variable Summary
type__class__ = __builtin__.type

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
+
+ + +
+

__reduce__(...) +

+

helper for pickle

+
+
+
+ + +
+

__reduce_ex__(...) +

+

helper for pickle

+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/__builtin__.type-class.html b/trunk/psycopg2/doc/api/private/__builtin__.type-class.html new file mode 100644 index 0000000..b388e76 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/__builtin__.type-class.html @@ -0,0 +1,384 @@ + + + + + __builtin__.type + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class type +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type type

+ +
+object --+
+         |
+        type
+

+ +
+ +

type(object) -> the object's type +type(name, bases, dict) -> a new type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __call__(x, + ...) +
+Return x(...)...
 __cmp__(x, + y) +
+Return cmp(x,y)...
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
list of immediate subclasses__subclasses__() +
listmro() +
+return a type's method resolution order
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + + + + +
Property Summary
 __base__
 __basicsize__
 __dictoffset__
 __flags__
 __itemsize__
 __mro__
 __weakrefoffset__

+ + + + + + + + + + +
Class Variable Summary
tuple__bases__ = (<type 'object'>,) +
str__name__ = 'type' +

+ + + + + + +
Method Details
+ + +
+

__call__(x, + ...) +
(Call operator) +

+
+
Returns:
+
+
+x(...)
+
+
+
+
+
+ + +
+

__cmp__(x, + y) +
(Comparison operator) +

+
+
Returns:
+
+
+cmp(x,y)
+
+
+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
Overrides:
+
__builtin__.object.__delattr__
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
Overrides:
+
__builtin__.object.__setattr__
+
+
+
+ + +
+

__subclasses__() +

+
+
Returns:
+
+list of immediate subclasses
+
+
+
+ + +
+

mro() +

+

return a type's method resolution order

+
+
Returns:
+
+list
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

__bases__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'object'>,)                                                     
+
+
+
+
+
+ +

__name__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'type'                                                                 
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/datetime.tzinfo-class.html b/trunk/psycopg2/doc/api/private/datetime.tzinfo-class.html new file mode 100644 index 0000000..337ac1a --- /dev/null +++ b/trunk/psycopg2/doc/api/private/datetime.tzinfo-class.html @@ -0,0 +1,239 @@ + + + + + datetime.tzinfo + + + + + + + + + + + + + + + + + + + +
+ + Module datetime :: + Class tzinfo +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type tzinfo

+ +
+object --+
+         |
+        tzinfo
+

+ +
Known Subclasses:
+
+ FixedOffsetTimezone, + LocalTimezone
+ +
+ +

Abstract base class for time zone info objects.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 dst(...) +
+datetime -> DST offset in minutes east of UTC.
 fromutc(...) +
+datetime in UTC -> datetime in local time.
 tzname(...) +
+datetime -> string name of time zone.
 utcoffset(...) +
+datetime -> minutes east of UTC (negative for west of UTC).
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__reduce__(...) +

+

-> (cls, state)

+
+
Overrides:
+
__builtin__.object.__reduce__
+
+
+
+ + +
+

dst(...) +

+

datetime -> DST offset in minutes east of UTC.

+
+
+
+ + +
+

fromutc(...) +

+

datetime in UTC -> datetime in local time.

+
+
+
+ + +
+

tzname(...) +

+

datetime -> string name of time zone.

+
+
+
+ + +
+

utcoffset(...) +

+

datetime -> minutes east of UTC (negative for west of UTC).

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/epydoc.css b/trunk/psycopg2/doc/api/private/epydoc.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/trunk/psycopg2/doc/api/private/epydoc.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/trunk/psycopg2/doc/api/private/exceptions.Exception-class.html b/trunk/psycopg2/doc/api/private/exceptions.Exception-class.html new file mode 100644 index 0000000..3064c51 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/exceptions.Exception-class.html @@ -0,0 +1,128 @@ + + + + + exceptions.Exception + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class Exception +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Exception

+ +
Known Subclasses:
+
+ StandardError
+ +
+ +

Common base class for all exceptions.

+
+ + + + + + + + + + + + +
Method Summary
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+
+
+
+ + +
+

__getitem__(...) +
(Indexing operator) +

+
+
+
+ + +
+

__str__(...) +
(Informal representation operator) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/exceptions.StandardError-class.html b/trunk/psycopg2/doc/api/private/exceptions.StandardError-class.html new file mode 100644 index 0000000..1b491dd --- /dev/null +++ b/trunk/psycopg2/doc/api/private/exceptions.StandardError-class.html @@ -0,0 +1,102 @@ + + + + + exceptions.StandardError + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class StandardError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class StandardError

+ +
+Exception --+
+            |
+           StandardError
+

+ +
Known Subclasses:
+
+ Error, + Warning
+ +
+ +

Base class for all standard Python exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/frames.html b/trunk/psycopg2/doc/api/private/frames.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/frames.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/trunk/psycopg2/doc/api/private/help.html b/trunk/psycopg2/doc/api/private/help.html new file mode 100644 index 0000000..21f2560 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/help.html @@ -0,0 +1,231 @@ + + + + + Help + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains:

+
    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +
+ +

Each Module Documentation page contains:

+
    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +
+ +

Each Class Documentation page contains:

+
    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +
+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies:

+
    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +
+ +

The Index page contains indices of terms and + identifiers:

+
    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +
+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ + + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
  +

+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/index.html b/trunk/psycopg2/doc/api/private/index.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/index.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/trunk/psycopg2/doc/api/private/indices.html b/trunk/psycopg2/doc/api/private/indices.html new file mode 100644 index 0000000..6a224a1 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/indices.html @@ -0,0 +1,666 @@ + + + + + Index + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Identifier Index
__add__Method in class __builtin__.list
__base__member_descriptor in class __builtin__.type
__bases__Variable in class __builtin__.type
__basicsize__member_descriptor in class __builtin__.type
__build_dictMethod in class psycopg2.psycopg1.cursor
__call__Method in class __builtin__.type
typeClass in module __builtin__
__cmp__Method in class __builtin__.type
__contains__Method in class __builtin__.list
__delattr__Method in class __builtin__.object
__delattr__Method in class __builtin__.type
__delitem__Method in class __builtin__.list
__delslice__Method in class __builtin__.list
__dictoffset__member_descriptor in class __builtin__.type
__eq__Method in class __builtin__.list
__flags__member_descriptor in class __builtin__.type
__ge__Method in class __builtin__.list
__getattribute__Method in class __builtin__.list
__getattribute__Method in class __builtin__.object
__getattribute__Method in class __builtin__.type
__getattribute__Method in class datetime.tzinfo
__getitem__Method in class __builtin__.list
__getitem__Method in class exceptions.Exception
__getitem__Method in class psycopg2.extras.DictRow
__getslice__Method in class __builtin__.list
__gt__Method in class __builtin__.list
__hash__Method in class __builtin__.list
__hash__Method in class __builtin__.object
__hash__Method in class __builtin__.type
__iadd__Method in class __builtin__.list
__imul__Method in class __builtin__.list
__init__Method in class __builtin__.list
__init__Method in class __builtin__.object
__init__Method in class exceptions.Exception
__init__Method in class psycopg2._psycopg.ISQLQuote
__init__Method in class psycopg2._psycopg.connection
__init__Method in class psycopg2._psycopg.cursor
__init__Method in class psycopg2.extras.DictRow
__init__Method in class psycopg2.extras.SQL_IN
__init__Method in class psycopg2.pool.AbstractConnectionPool
__init__Method in class psycopg2.pool.PersistentConnectionPool
__init__Method in class psycopg2.pool.ThreadedConnectionPool
__init__Method in class psycopg2.tz.FixedOffsetTimezone
__itemsize__member_descriptor in class __builtin__.type
__iter__Method in class __builtin__.list
__iter__Method in class psycopg2._psycopg.cursor
__le__Method in class __builtin__.list
__len__Method in class __builtin__.list
__lt__Method in class __builtin__.list
__mro__member_descriptor in class __builtin__.type
__mul__Method in class __builtin__.list
__name__Variable in class __builtin__.type
__ne__Method in class __builtin__.list
__new__Method in class __builtin__.list
__new__Method in class __builtin__.object
__new__Method in class __builtin__.type
__new__Method in class datetime.tzinfo
__new__Method in class psycopg2._psycopg.ISQLQuote
__new__Method in class psycopg2._psycopg.connection
__new__Method in class psycopg2._psycopg.cursor
__reduce__Method in class __builtin__.object
__reduce__Method in class datetime.tzinfo
__reduce_ex__Method in class __builtin__.object
__repr__Method in class __builtin__.list
__repr__Method in class __builtin__.object
__repr__Method in class __builtin__.type
__repr__Method in class psycopg2._psycopg.connection
__repr__Method in class psycopg2._psycopg.cursor
__rmul__Method in class __builtin__.list
__setattr__Method in class __builtin__.object
__setattr__Method in class __builtin__.type
__setitem__Method in class __builtin__.list
__setslice__Method in class __builtin__.list
__str__Method in class __builtin__.object
__str__Method in class exceptions.Exception
__str__Method in class psycopg2._psycopg.connection
__str__Method in class psycopg2._psycopg.cursor
__subclasses__Method in class __builtin__.type
__version__Variable in module psycopg2._psycopg
__weakrefoffset__member_descriptor in class __builtin__.type
_build_indexMethod in class psycopg2.extras.DictCursor
_C_APIVariable in module psycopg2._psycopg
_closeallMethod in class psycopg2.pool.AbstractConnectionPool
_connectMethod in class psycopg2.pool.AbstractConnectionPool
__query_executedVariable in class psycopg2.extras.DictCursor
_getconnMethod in class psycopg2.pool.AbstractConnectionPool
_getkeyMethod in class psycopg2.pool.AbstractConnectionPool
_isdstMethod in class psycopg2.tz.LocalTimezone
_nameVariable in class psycopg2.tz.FixedOffsetTimezone
_offsetVariable in class psycopg2.tz.FixedOffsetTimezone
_psycopgModule in package psycopg2
_putconnMethod in class psycopg2.pool.AbstractConnectionPool
_wrappedmember_descriptor in class psycopg2._psycopg.ISQLQuote
AbstractConnectionPoolClass in module psycopg2.pool
adaptFunction in module psycopg2.extensions
adaptersVariable in module psycopg2._psycopg
apilevelVariable in module psycopg2._psycopg
appendMethod in class __builtin__.list
arraysizemember_descriptor in class psycopg2._psycopg.cursor
AsIsFunction in module psycopg2.extensions
autocommitMethod in class psycopg2.psycopg1.connection
BinaryFunction in package psycopg2
BINARYVariable in module psycopg2._psycopg
binary_typesVariable in module psycopg2._psycopg
binary_typesmember_descriptor in class psycopg2._psycopg.cursor
BINARYARRAYVariable in module psycopg2._psycopg
BOOLEANVariable in module psycopg2._psycopg
BooleanFunction in module psycopg2.extensions
BOOLEANARRAYVariable in module psycopg2._psycopg
callprocMethod in class psycopg2._psycopg.cursor
callprocMethod in class psycopg2.extras.DictCursor
closeMethod in class psycopg2._psycopg.connection
closeMethod in class psycopg2._psycopg.cursor
closeallMethod in class psycopg2.pool.PersistentConnectionPool
closeallMethod in class psycopg2.pool.ThreadedConnectionPool
closedmember_descriptor in class psycopg2._psycopg.connection
commitMethod in class psycopg2._psycopg.connection
connectFunction in package psycopg2
connectFunction in module psycopg2.psycopg1
connectionClass in module psycopg2._psycopg
connectionmember_descriptor in class psycopg2._psycopg.cursor
connectionClass in module psycopg2.psycopg1
copy_fromMethod in class psycopg2._psycopg.cursor
copy_toMethod in class psycopg2._psycopg.cursor
countMethod in class __builtin__.list
cursorMethod in class psycopg2._psycopg.connection
cursorClass in module psycopg2._psycopg
cursorMethod in class psycopg2.extras.DictConnection
cursorMethod in class psycopg2.psycopg1.connection
cursorClass in module psycopg2.psycopg1
DatabaseErrorClass in package psycopg2
DatabaseErrormember_descriptor in class psycopg2._psycopg.connection
DataErrorClass in package psycopg2
DataErrormember_descriptor in class psycopg2._psycopg.connection
DateFunction in package psycopg2
DATEVariable in module psycopg2._psycopg
DATEARRAYVariable in module psycopg2._psycopg
DateFromPyFunction in module psycopg2.extensions
DateFromTicksFunction in package psycopg2
DATETIMEVariable in module psycopg2._psycopg
DATETIMEARRAYVariable in module psycopg2._psycopg
dbgFunction in module psycopg2.pool
DECIMALVariable in module psycopg2._psycopg
DECIMALARRAYVariable in module psycopg2._psycopg
descriptionmember_descriptor in class psycopg2._psycopg.cursor
DictConnectionClass in module psycopg2.extras
DictCursorClass in module psycopg2.extras
dictfetchallMethod in class psycopg2.psycopg1.cursor
dictfetchmanyMethod in class psycopg2.psycopg1.cursor
dictfetchoneMethod in class psycopg2.psycopg1.cursor
DictRowClass in module psycopg2.extras
dsnmember_descriptor in class psycopg2._psycopg.connection
dstMethod in class datetime.tzinfo
dstMethod in class psycopg2.tz.FixedOffsetTimezone
dstMethod in class psycopg2.tz.LocalTimezone
DSTDIFFVariable in module psycopg2.tz
encodingmember_descriptor in class psycopg2._psycopg.connection
encodingsVariable in module psycopg2._psycopg
ErrorClass in package psycopg2
Errormember_descriptor in class psycopg2._psycopg.connection
ExceptionClass in module exceptions
executeMethod in class psycopg2._psycopg.cursor
executeMethod in class psycopg2.extras.DictCursor
executemanyMethod in class psycopg2._psycopg.cursor
extendMethod in class __builtin__.list
extensionsModule in package psycopg2
extrasModule in package psycopg2
fetchallMethod in class psycopg2._psycopg.cursor
fetchallMethod in class psycopg2.extras.DictCursor
fetchmanyMethod in class psycopg2._psycopg.cursor
fetchmanyMethod in class psycopg2.extras.DictCursor
fetchoneMethod in class psycopg2._psycopg.cursor
fetchoneMethod in class psycopg2.extras.DictCursor
filenoMethod in class psycopg2._psycopg.cursor
FixedOffsetTimezoneClass in module psycopg2.tz
FLOATVariable in module psycopg2._psycopg
FLOATARRAYVariable in module psycopg2._psycopg
fromutcMethod in class datetime.tzinfo
getMethod in class psycopg2.extras.DictRow
getbinaryMethod in class psycopg2._psycopg.ISQLQuote
getbufferMethod in class psycopg2._psycopg.ISQLQuote
getconnMethod in class psycopg2.pool.PersistentConnectionPool
getconnMethod in class psycopg2.pool.ThreadedConnectionPool
getquotedMethod in class psycopg2._psycopg.ISQLQuote
getquotedMethod in class psycopg2.extras.SQL_IN
has_keyMethod in class psycopg2.extras.DictRow
indexMethod in class __builtin__.list
insertMethod in class __builtin__.list
INTEGERVariable in module psycopg2._psycopg
INTEGERARRAYVariable in module psycopg2._psycopg
IntegrityErrorClass in package psycopg2
IntegrityErrormember_descriptor in class psycopg2._psycopg.connection
InterfaceErrorClass in package psycopg2
InterfaceErrormember_descriptor in class psycopg2._psycopg.connection
InternalErrorClass in package psycopg2
InternalErrormember_descriptor in class psycopg2._psycopg.connection
INTERVALVariable in module psycopg2._psycopg
INTERVALARRAYVariable in module psycopg2._psycopg
IntervalFromPyFunction in module psycopg2.extensions
isolation_levelmember_descriptor in class psycopg2._psycopg.connection
ISOLATION_LEVEL_AUTOCOMMITVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_COMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_UNCOMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_REPEATABLE_READVariable in module psycopg2.extensions
ISOLATION_LEVEL_SERIALIZABLEVariable in module psycopg2.extensions
ISQLQuoteClass in module psycopg2._psycopg
isreadyMethod in class psycopg2._psycopg.cursor
itemsMethod in class psycopg2.extras.DictRow
keysMethod in class psycopg2.extras.DictRow
lastrowidmember_descriptor in class psycopg2._psycopg.cursor
listClass in module __builtin__
ListFunction in module psycopg2._psycopg
LOCALVariable in module psycopg2.tz
LocalTimezoneClass in module psycopg2.tz
LONGINTEGERVariable in module psycopg2._psycopg
LONGINTEGERARRAYVariable in module psycopg2._psycopg
mogrifyMethod in class psycopg2._psycopg.cursor
mroMethod in class __builtin__.type
namemember_descriptor in class psycopg2._psycopg.cursor
new_typeFunction in module psycopg2.extensions
nextMethod in class psycopg2._psycopg.cursor
nextsetMethod in class psycopg2._psycopg.cursor
noticesmember_descriptor in class psycopg2._psycopg.connection
notifiesmember_descriptor in class psycopg2._psycopg.connection
NotSupportedErrorClass in package psycopg2
NotSupportedErrormember_descriptor in class psycopg2._psycopg.connection
NUMBERVariable in module psycopg2._psycopg
objectClass in module __builtin__
OperationalErrorClass in package psycopg2
OperationalErrormember_descriptor in class psycopg2._psycopg.connection
paramstyleVariable in module psycopg2._psycopg
PersistentConnectionPoolClass in module psycopg2.pool
poolModule in package psycopg2
PoolErrorClass in module psycopg2.pool
popMethod in class __builtin__.list
ProgrammingErrorClass in package psycopg2
ProgrammingErrormember_descriptor in class psycopg2._psycopg.connection
psycopg1Module in package psycopg2
psycopg2Package
putconnMethod in class psycopg2.pool.PersistentConnectionPool
putconnMethod in class psycopg2.pool.ThreadedConnectionPool
PYDATEVariable in module psycopg2._psycopg
PYDATETIMEVariable in module psycopg2._psycopg
PYINTERVALVariable in module psycopg2._psycopg
PYTIMEVariable in module psycopg2._psycopg
querymember_descriptor in class psycopg2._psycopg.cursor
QuotedStringFunction in module psycopg2.extensions
register_adapterFunction in module psycopg2.extensions
register_typeFunction in module psycopg2.extensions
removeMethod in class __builtin__.list
reverseMethod in class __builtin__.list
rollbackMethod in class psycopg2._psycopg.connection
row_factorymember_descriptor in class psycopg2._psycopg.cursor
rowcountmember_descriptor in class psycopg2._psycopg.cursor
ROWIDVariable in module psycopg2._psycopg
ROWIDARRAYVariable in module psycopg2._psycopg
rownumbermember_descriptor in class psycopg2._psycopg.cursor
scrollMethod in class psycopg2._psycopg.cursor
set_client_encodingMethod in class psycopg2._psycopg.connection
set_isolation_levelMethod in class psycopg2._psycopg.connection
setinputsizesMethod in class psycopg2._psycopg.cursor
setoutputsizeMethod in class psycopg2._psycopg.cursor
SimpleConnectionPoolClass in module psycopg2.pool
sortMethod in class __builtin__.list
SQL_INClass in module psycopg2.extras
StandardErrorClass in module exceptions
statusmessagemember_descriptor in class psycopg2._psycopg.cursor
STDOFFSETVariable in module psycopg2.tz
STRINGVariable in module psycopg2._psycopg
string_typesmember_descriptor in class psycopg2._psycopg.cursor
string_typesVariable in module psycopg2._psycopg
STRINGARRAYVariable in module psycopg2._psycopg
ThreadedConnectionPoolClass in module psycopg2.pool
threadsafetyVariable in module psycopg2._psycopg
TimeFunction in package psycopg2
TIMEVariable in module psycopg2._psycopg
TIMEARRAYVariable in module psycopg2._psycopg
TimeFromPyFunction in module psycopg2.extensions
TimeFromTicksFunction in package psycopg2
TimestampFunction in package psycopg2
TimestampFromPyFunction in module psycopg2.extensions
TimestampFromTicksFunction in package psycopg2
typeClass in module __builtin__
typecastermember_descriptor in class psycopg2._psycopg.cursor
tzModule in package psycopg2
tzinfoClass in module datetime
tzinfo_factorymember_descriptor in class psycopg2._psycopg.cursor
tznameMethod in class datetime.tzinfo
tznameMethod in class psycopg2.tz.FixedOffsetTimezone
tznameMethod in class psycopg2.tz.LocalTimezone
UNICODEVariable in module psycopg2._psycopg
UNICODEARRAYVariable in module psycopg2._psycopg
utcoffsetMethod in class datetime.tzinfo
utcoffsetMethod in class psycopg2.tz.FixedOffsetTimezone
utcoffsetMethod in class psycopg2.tz.LocalTimezone
valuesMethod in class psycopg2.extras.DictRow
WarningClass in package psycopg2
Warningmember_descriptor in class psycopg2._psycopg.connection
ZEROVariable in module psycopg2.tz
+
+ + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2-module.html b/trunk/psycopg2/doc/api/private/psycopg2-module.html new file mode 100644 index 0000000..dd7e92d --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2-module.html @@ -0,0 +1,336 @@ + + + + + psycopg2 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Package psycopg2

+ +

A Python driver for PostgreSQL

+

psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being very +small and fast, and stable as a rock.

+

Homepage: http://initd.org/projects/psycopg2

+
+ + + + + + +
Submodules
    +
  • extensions: psycopg extensions to the DBAPI-2.0
  • +
  • extras: Miscellaneous goodies for psycopg2
  • +
  • pool: Connection pooling for psycopg2
  • +
  • psycopg1: psycopg 1.1.x compatibility module
  • +
  • tz: tzinfo implementations for psycopg2
  • +
  • _psycopg: psycopg PostgreSQL driver
  • +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Exceptions
+ DatabaseErrorError related to the database engine.
+ DataErrorError related to problems with the processed data.
+ ErrorBase class for error exceptions.
+ IntegrityErrorError related to database integrity.
+ InterfaceErrorError related to the database interface.
+ InternalErrorThe database encountered an internal error.
+ NotSupportedErrorA not supported datbase API was called.
+ OperationalErrorError related to database operation (disconnect, memory allocation etc).
+ ProgrammingErrorError related to database programming (SQL error, table not found etc).
+ WarningA database warning.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
    Connections creation
extensions.connectionconnect(dsn, + ...) +
+Create a new database connection.
    Value objects constructors
new binary objectBinary(buffer) +
+Build an object capable to hold a bynary string value.
new dateDate(year, + month, + day) +
+Build an object holding a date value.
new dateDateFromTicks(ticks) +
+Build an object holding a date value from the given ticks value.
new timeTime(hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a time value.
new timeTimeFromTicks(ticks) +
+Build an object holding a time value from the given ticks value.
new timestampTimestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a timestamp value.
new timestampTimestampFromTicks(ticks) +
+Build an object holding a timestamp value from the given ticks value.

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+

Create a new database connection.

+

This function supports two different but equivalent sets of arguments. +A single data source name or dsn string can be used to specify the +connection parameters, as follows:

+
+psycopg2.connect("dbname=xxx user=xxx ...")
+
+

If dsn is not provided it is possible to pass the parameters as +keyword arguments; e.g.:

+
+psycopg2.connect(database='xxx', user='xxx', ...)
+
+

The full list of available parameters is:

+
    +
  • dbname -- database name (only in 'dsn')
  • +
  • database -- database name (only as keyword argument)
  • +
  • host -- host address (defaults to UNIX socket if not provided)
  • +
  • port -- port number (defaults to 5432 if not provided)
  • +
  • user -- user name used to authenticate
  • +
  • password -- password used to authenticate
  • +
  • sslmode -- SSL mode (see PostgreSQL documentation)
  • +
+

If the connection_factory keyword argument is not provided this +function always return an instance of the connection class. +Else the given sub-class of extensions.connection will be used to +instantiate the connection object.

+
+
Returns:
+
+New database connection
           + (type=extensions.connection) +
+
+
+
+ + +
+

Binary(buffer) +

+

Build an object capable to hold a bynary string value.

+
+
Returns:
+
+new binary object
+
+
+
+ + +
+

Date(year, + month, + day) +

+

Build an object holding a date value.

+
+
Returns:
+
+new date
+
+
+
+ + +
+

DateFromTicks(ticks) +

+

Build an object holding a date value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new date
+
+
+
+ + +
+

Time(hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a time value.

+
+
Returns:
+
+new time
+
+
+
+ + +
+

TimeFromTicks(ticks) +

+

Build an object holding a time value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new time
+
+
+
+ + +
+

Timestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a timestamp value.

+
+
Returns:
+
+new timestamp
+
+
+
+ + +
+

TimestampFromTicks(ticks) +

+

Build an object holding a timestamp value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new timestamp
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.DataError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.DataError-class.html new file mode 100644 index 0000000..5805400 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.DataError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.DataError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DataError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DataError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       DataError
+

+ +
+ +

Error related to problems with the processed data.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.DatabaseError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.DatabaseError-class.html new file mode 100644 index 0000000..adc28d4 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.DatabaseError-class.html @@ -0,0 +1,110 @@ + + + + + psycopg2.DatabaseError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DatabaseError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DatabaseError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   DatabaseError
+

+ +
Known Subclasses:
+
+ DataError, + IntegrityError, + InternalError, + NotSupportedError, + OperationalError, + ProgrammingError
+ +
+ +

Error related to the database engine.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.Error-class.html b/trunk/psycopg2/doc/api/private/psycopg2.Error-class.html new file mode 100644 index 0000000..33bff57 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.Error-class.html @@ -0,0 +1,105 @@ + + + + + psycopg2.Error + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Error +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Error

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Error
+

+ +
Known Subclasses:
+
+ DatabaseError, + InterfaceError, + PoolError
+ +
+ +

Base class for error exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.IntegrityError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.IntegrityError-class.html new file mode 100644 index 0000000..c1804f6 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.IntegrityError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.IntegrityError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class IntegrityError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class IntegrityError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       IntegrityError
+

+ +
+ +

Error related to database integrity.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.InterfaceError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.InterfaceError-class.html new file mode 100644 index 0000000..099ee90 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.InterfaceError-class.html @@ -0,0 +1,101 @@ + + + + + psycopg2.InterfaceError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InterfaceError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InterfaceError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   InterfaceError
+

+ +
+ +

Error related to the database interface.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.InternalError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.InternalError-class.html new file mode 100644 index 0000000..5390de5 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.InternalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.InternalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InternalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InternalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       InternalError
+

+ +
+ +

The database encountered an internal error.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.NotSupportedError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.NotSupportedError-class.html new file mode 100644 index 0000000..c677f5b --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.NotSupportedError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.NotSupportedError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class NotSupportedError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class NotSupportedError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       NotSupportedError
+

+ +
+ +

A not supported datbase API was called.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.OperationalError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.OperationalError-class.html new file mode 100644 index 0000000..6cca463 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.OperationalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.OperationalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class OperationalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class OperationalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       OperationalError
+

+ +
+ +

Error related to database operation (disconnect, memory allocation etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.ProgrammingError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.ProgrammingError-class.html new file mode 100644 index 0000000..9fcd4ef --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.ProgrammingError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.ProgrammingError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class ProgrammingError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class ProgrammingError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       ProgrammingError
+

+ +
+ +

Error related to database programming (SQL error, table not found etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.Warning-class.html b/trunk/psycopg2/doc/api/private/psycopg2.Warning-class.html new file mode 100644 index 0000000..741c9a7 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.Warning-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.Warning + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Warning +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Warning

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Warning
+

+ +
+ +

A database warning.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2._psycopg-module.html b/trunk/psycopg2/doc/api/private/psycopg2._psycopg-module.html new file mode 100644 index 0000000..6e4cb25 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2._psycopg-module.html @@ -0,0 +1,1072 @@ + + + + + psycopg2._psycopg + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2._psycopg

+ +

psycopg PostgreSQL driver

+
+ + + + + + + + + + + +
Classes
+ connectionconnection(dsn, ...) -> new connection object
+ cursorA database cursor.
+ ISQLQuoteAbstract ISQLQuote protocol

+ + + + + + + + +
Function Summary
new quoted listList(list, + enc) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Summary
str__version__ = '2.0b7 (dt ext pq3)' +
PyCObject_C_API = <PyCObject object at 0x0076A320> +
dictadapters = {(<type 'bool'>, <type 'psycopg2._psycopg.ISQ... +
strapilevel = '2.0' +
typeBINARY = <psycopg2._psycopg.type object at 0x00847A00> +
dictbinary_types = {} +
typeBINARYARRAY = <psycopg2._psycopg.type object at 0x00847C... +
typeBOOLEAN = <psycopg2._psycopg.type object at 0x00847880> +
typeBOOLEANARRAY = <psycopg2._psycopg.type object at 0x00847... +
typeDATE = <psycopg2._psycopg.type object at 0x00847960> +
typeDATEARRAY = <psycopg2._psycopg.type object at 0x00847C20... +
typeDATETIME = <psycopg2._psycopg.type object at 0x008478C0> +
typeDATETIMEARRAY = <psycopg2._psycopg.type object at 0x0084... +
typeDECIMAL = <psycopg2._psycopg.type object at 0x008477A0> +
typeDECIMALARRAY = <psycopg2._psycopg.type object at 0x00847... +
dictencodings = {'UTF8': 'utf_8', 'LATIN-1': 'latin_1', 'SQL... +
typeFLOAT = <psycopg2._psycopg.type object at 0x00847740> +
typeFLOATARRAY = <psycopg2._psycopg.type object at 0x00847AE... +
typeINTEGER = <psycopg2._psycopg.type object at 0x00847700> +
typeINTEGERARRAY = <psycopg2._psycopg.type object at 0x00847... +
typeINTERVAL = <psycopg2._psycopg.type object at 0x008479A0> +
typeINTERVALARRAY = <psycopg2._psycopg.type object at 0x0084... +
typeLONGINTEGER = <psycopg2._psycopg.type object at 0x008476... +
typeLONGINTEGERARRAY = <psycopg2._psycopg.type object at 0x0... +
typeNUMBER = <psycopg2._psycopg.type object at 0x00847680> +
strparamstyle = 'pyformat' +
typePYDATE = <psycopg2._psycopg.type object at 0x00847DC0> +
typePYDATETIME = <psycopg2._psycopg.type object at 0x00847D2... +
typePYINTERVAL = <psycopg2._psycopg.type object at 0x00847DE... +
typePYTIME = <psycopg2._psycopg.type object at 0x00847D60> +
typeROWID = <psycopg2._psycopg.type object at 0x00847A60> +
typeROWIDARRAY = <psycopg2._psycopg.type object at 0x00847CC... +
typeSTRING = <psycopg2._psycopg.type object at 0x00847820> +
dictstring_types = {1028: <psycopg2._psycopg.type object at ... +
typeSTRINGARRAY = <psycopg2._psycopg.type object at 0x00847B... +
intthreadsafety = 2                                                                     
typeTIME = <psycopg2._psycopg.type object at 0x00847900> +
typeTIMEARRAY = <psycopg2._psycopg.type object at 0x00847BE0... +
typeUNICODE = <psycopg2._psycopg.type object at 0x008477E0> +
typeUNICODEARRAY = <psycopg2._psycopg.type object at 0x00847... +

+ + + + + + +
Function Details
+ + +
+

List(list, + enc) +

+
+
Returns:
+
+new quoted list
+
+
+
+
+ + + + + + +
Variable Details
+
+ +

__version__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0b7 (dt ext pq3)'                                                   
+
+
+
+
+
+ +

_C_API

+
+
+
+
+
Type:
+
+ PyCObject + +
+
Value:
+
+
+<PyCObject object at 0x0076A320>                                       
+
+
+
+
+
+ +

adapters

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{(<type 'datetime.timedelta'>, <type 'psycopg2._psycopg.ISQLQuote'>): \
+<built-in function IntervalFromPy>,
+ (<type 'datetime.date'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function DateFromPy>,
+ (<type 'datetime.time'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function TimeFromPy>,
+ (<type 'datetime.datetime'>, <type 'psycopg2._psycopg.ISQLQuote'>): <\
+built-in function TimestampFromPy>,
+...                                                                    
+
+
+
+
+
+ +

apilevel

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0'                                                                  
+
+
+
+
+
+ +

BINARY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847A00>                          
+
+
+
+
+
+ +

binary_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{}                                                                     
+
+
+
+
+
+ +

BINARYARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847CA0>                          
+
+
+
+
+
+ +

BOOLEAN

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847880>                          
+
+
+
+
+
+ +

BOOLEANARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847BA0>                          
+
+
+
+
+
+ +

DATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847960>                          
+
+
+
+
+
+ +

DATEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847C20>                          
+
+
+
+
+
+ +

DATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008478C0>                          
+
+
+
+
+
+ +

DATETIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847BC0>                          
+
+
+
+
+
+ +

DECIMAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008477A0>                          
+
+
+
+
+
+ +

DECIMALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847B20>                          
+
+
+
+
+
+ +

encodings

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'LATIN-1': 'latin_1',
+ 'LATIN1': 'latin_1',
+ 'SQL_ASCII': 'ascii',
+ 'UNICODE': 'utf_8',
+ 'UTF8': 'utf_8'}                                                      
+
+
+
+
+
+ +

FLOAT

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847740>                          
+
+
+
+
+
+ +

FLOATARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847AE0>                          
+
+
+
+
+
+ +

INTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847700>                          
+
+
+
+
+
+ +

INTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847AC0>                          
+
+
+
+
+
+ +

INTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008479A0>                          
+
+
+
+
+
+ +

INTERVALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847C60>                          
+
+
+
+
+
+ +

LONGINTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008476C0>                          
+
+
+
+
+
+ +

LONGINTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847AA0>                          
+
+
+
+
+
+ +

NUMBER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847680>                          
+
+
+
+
+
+ +

paramstyle

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'pyformat'                                                             
+
+
+
+
+
+ +

PYDATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847DC0>                          
+
+
+
+
+
+ +

PYDATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847D20>                          
+
+
+
+
+
+ +

PYINTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847DE0>                          
+
+
+
+
+
+ +

PYTIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847D60>                          
+
+
+
+
+
+ +

ROWID

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847A60>                          
+
+
+
+
+
+ +

ROWIDARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847CC0>                          
+
+
+
+
+
+ +

STRING

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847820>                          
+
+
+
+
+
+ +

string_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{16: <psycopg2._psycopg.type object at 0x00847880>,
+ 17: <psycopg2._psycopg.type object at 0x00847A00>,
+ 18: <psycopg2._psycopg.type object at 0x00847820>,
+ 19: <psycopg2._psycopg.type object at 0x00847820>,
+ 20: <psycopg2._psycopg.type object at 0x008476C0>,
+ 21: <psycopg2._psycopg.type object at 0x00847700>,
+ 23: <psycopg2._psycopg.type object at 0x00847700>,
+ 25: <psycopg2._psycopg.type object at 0x00847820>,
+...                                                                    
+
+
+
+
+
+ +

STRINGARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847B60>                          
+
+
+
+
+
+ +

threadsafety

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

TIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847900>                          
+
+
+
+
+
+ +

TIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847BE0>                          
+
+
+
+
+
+ +

UNICODE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x008477E0>                          
+
+
+
+
+
+ +

UNICODEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00847B40>                          
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2._psycopg.ISQLQuote-class.html b/trunk/psycopg2/doc/api/private/psycopg2._psycopg.ISQLQuote-class.html new file mode 100644 index 0000000..3a7db8e --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2._psycopg.ISQLQuote-class.html @@ -0,0 +1,221 @@ + + + + + psycopg2._psycopg.ISQLQuote + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg :: + Class ISQLQuote +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ISQLQuote

+ +
+object --+
+         |
+        ISQLQuote
+

+ +
+ +

Abstract ISQLQuote protocol

+

An object conform to this protocol should expose a getquoted() method +returning the SQL representation of the object.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 getbinary() +
+return SQL-quoted binary representation of this object
 getbuffer() +
+return this object
 getquoted() +
+return SQL-quoted representation of this object
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + +
Property Summary
 _wrapped

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

getbinary() +

+

return SQL-quoted binary representation of this object

+
+
+
+ + +
+

getbuffer() +

+

return this object

+
+
+
+ + +
+

getquoted() +

+

return SQL-quoted representation of this object

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2._psycopg.connection-class.html b/trunk/psycopg2/doc/api/private/psycopg2._psycopg.connection-class.html new file mode 100644 index 0000000..0b6076e --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2._psycopg.connection-class.html @@ -0,0 +1,405 @@ + + + + + psycopg2._psycopg.connection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg :: + Class connection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type connection

+ +
+object --+
+         |
+        connection
+

+ +
Known Subclasses:
+
+ connection, + DictConnection
+ +
+ +

connection(dsn, ...) -> new connection object

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the connection.
 commit() +
+Commit all changes to database.
extensions.cursorcursor(cursor_factory) +
+new cursor
 rollback() +
+Roll back all changes done to database.
 set_client_encoding(encoding) +
+Set client encoding to encoding.
 set_isolation_level(level) +
+Switch isolation level to level.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Property Summary
 closed: True if the connection is closed.
 dsn: The current connection string.
 encoding: The current client encoding.
 isolation_level: The current isolation level.
 notices
 notifies
    DBAPI-2.0 errors
 Error: Base class for error exceptions.
 Warning: A database warning.
 InterfaceError: Error related to the database interface.
 DatabaseError: Error related to the database engine.
 InternalError: The database encountered an internal error.
 OperationalError: Error related to database operation (disconnect, memory allocation etc).
 ProgrammingError: Error related to database programming (SQL error, table not found etc).
 IntegrityError: Error related to database integrity.
 DataError: Error related to problems with the processed data.
 NotSupportedError: A not supported datbase API was called.

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+ + +
+

close() +

+

Close the connection.

+
+
+
+ + +
+

commit() +

+

Commit all changes to database.

+
+
+
+ + +
+

cursor(cursor_factory=extensions.cursor) +

+

new cursor

+

Return a new cursor.

+

The cursor_factory argument can be used to +create non-standard cursors by passing a class different from the +default. Note that the new class should be a sub-class of +extensions.cursor.

+
+
Returns:
+
+extensions.cursor
+
+
+
+ + +
+

rollback() +

+

Roll back all changes done to database.

+
+
+
+ + +
+

set_client_encoding(encoding) +

+

Set client encoding to encoding.

+
+
+
+ + +
+

set_isolation_level(level) +

+

Switch isolation level to level.

+
+
+
+
+ + + + + + +
Property Details
+
+ + +

Error

+

Base class for error exceptions.

+
+ + +

Warning

+

A database warning.

+
+ + +

InterfaceError

+

Error related to the database interface.

+
+ + +

DatabaseError

+

Error related to the database engine.

+
+ + +

InternalError

+

The database encountered an internal error.

+
+ + +

OperationalError

+

Error related to database operation (disconnect, memory allocation etc).

+
+ + +

ProgrammingError

+

Error related to database programming (SQL error, table not found etc).

+
+ + +

IntegrityError

+

Error related to database integrity.

+
+ + +

DataError

+

Error related to problems with the processed data.

+
+ + +

NotSupportedError

+

A not supported datbase API was called.

+
+ + +

closed

+

True if the connection is closed.

+
+ + +

dsn

+

The current connection string.

+
+ + +

encoding

+

The current client encoding.

+
+ + +

isolation_level

+

The current isolation level.

+

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2._psycopg.cursor-class.html b/trunk/psycopg2/doc/api/private/psycopg2._psycopg.cursor-class.html new file mode 100644 index 0000000..d3947aa --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2._psycopg.cursor-class.html @@ -0,0 +1,599 @@ + + + + + psycopg2._psycopg.cursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg :: + Class cursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type cursor

+ +
+object --+
+         |
+        cursor
+

+ +
Known Subclasses:
+
+ cursor, + DictCursor
+ +
+ +

A database cursor.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __iter__(x) +
+Return iter(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 callproc(procname, + parameters, + async) +
+Execute stored procedure.
 close() +
+Close the cursor.
 copy_from(file, + table, + sep, + null) +
+Copy table from file.
 copy_to(file, + table, + sep, + null) +
+Copy table to file.
 execute(query, + vars, + async) +
+Execute query with bound vars.
 executemany(query, + vars_list, + async) +
+Execute many queries with bound vars.
list of tuplefetchall() +
+Return all the remaining rows of a query result set.
list of tuplefetchmany(size) +
+Return the next size rows of a query result set in the form of a list +of tuples (by default) or using the sequence factory previously set in +the row_factory attribute.
tuple or Nonefetchone() +
+Return the next row of a query result set in the form of a tuple (by +default) or using the sequence factory previously set in the +row_factory attribute.
intfileno() +
+Return file descriptor associated to database connection.
boolisready() +
+Return True if data is ready after an async query.
strmogrify(query, + vars) +
+Return query after vars binding.
 next(x) +
+Return the next value, or raise StopIteration...
 nextset() +
+Skip to next set of data.
 scroll(value, + mode) +
+Scroll to new position according to mode.
 setinputsizes(sizes) +
+Set memory areas before execute.
 setoutputsize(size, + column) +
+Set column buffer size.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + +
Property Summary
 arraysize: Number of records fetchmany() must fetch if not explicitely specified.
 binary_types
 connection: The connection where the cursor comes from.
 description: Cursor description as defined in DBAPI-2.0.
 lastrowid: The oid of the last row inserted by the cursor.
 name
 query: The last query text sent to the backend.
 row_factory
 rowcount: Number of rows read from the backend in the last command.
 rownumber: The current row position.
 statusmessage: The return message of the last command.
 string_types
 typecaster
 tzinfo_factory

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__iter__(x) +

+
+
Returns:
+
+
+iter(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
Overrides:
+
__builtin__.object.__str__
+
+
+
+ + +
+

callproc(procname, + parameters=None, + async=0) +

+

Execute stored procedure.

+
+
+
+ + +
+

close() +

+

Close the cursor.

+
+
+
+ + +
+

copy_from(file, + table, + sep='\t', + null='\N') +

+

Copy table from file.

+
+
+
+ + +
+

copy_to(file, + table, + sep='\t', + null='\N') +

+

Copy table to file.

+
+
+
+ + +
+

execute(query, + vars=None, + async=0) +

+

Execute query with bound vars.

+
+
+
+ + +
+

executemany(query, + vars_list=(), + async=0) +

+

Execute many queries with bound vars.

+
+
+
+ + +
+

fetchall() +

+

Return all the remaining rows of a query result set.

+

Rows are returned in the form of a list of tuples (by default) or using +the sequence factory previously set in the row_factory attribute. +Return None when no more data is available.

+
+
Returns:
+
+list of tuple
+
+
+
+ + +
+

fetchmany(size=self.arraysize) +

+

Return the next size rows of a query result set in the form of a list +of tuples (by default) or using the sequence factory previously set in +the row_factory attribute. Return None when no more data is available.

+
+
Returns:
+
+list of tuple
+
+
+
+ + +
+

fetchone() +

+

Return the next row of a query result set in the form of a tuple (by +default) or using the sequence factory previously set in the +row_factory attribute. Return None when no more data is available.

+
+
Returns:
+
+tuple or None
+
+
+
+ + +
+

fileno() +

+

Return file descriptor associated to database connection.

+
+
Returns:
+
+int
+
+
+
+ + +
+

isready() +

+

Return True if data is ready after an async query.

+
+
Returns:
+
+bool
+
+
+
+ + +
+

mogrify(query, + vars=None) +

+

Return query after vars binding.

+
+
Returns:
+
+str
+
+
+
+ + +
+

next(x) +

+
+
Returns:
+
+
+the next value, or raise StopIteration
+
+
+
+
+
+ + +
+

nextset() +

+

Skip to next set of data.

+

This method is not supported (PostgreSQL does not have multiple data +sets) and will raise a NotSupportedError exception.

+
+
+
+ + +
+

scroll(value, + mode='relative') +

+

Scroll to new position according to mode.

+
+
+
+ + +
+

setinputsizes(sizes) +

+

Set memory areas before execute.

+

This method currently does nothing but it is safe to call it.

+
+
+
+ + +
+

setoutputsize(size, + column=None) +

+

Set column buffer size.

+

This method currently does nothing but it is safe to call it.

+
+
+
+
+ + + + + + +
Property Details
+
+ + +

arraysize

+

Number of records fetchmany() must fetch if not explicitely specified.

+
+ + +

connection

+

The connection where the cursor comes from.

+
+ + +

description

+

Cursor description as defined in DBAPI-2.0.

+
+ + +

lastrowid

+

The oid of the last row inserted by the cursor.

+
+ + +

query

+

The last query text sent to the backend.

+
+ + +

rowcount

+

Number of rows read from the backend in the last command.

+
+ + +

rownumber

+

The current row position.

+
+ + +

statusmessage

+

The return message of the last command.

+

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.extensions-module.html b/trunk/psycopg2/doc/api/private/psycopg2.extensions-module.html new file mode 100644 index 0000000..a78fd66 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.extensions-module.html @@ -0,0 +1,418 @@ + + + + + psycopg2.extensions + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extensions +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extensions

+ +

psycopg extensions to the DBAPI-2.0

+

This module holds all the extensions to the DBAPI-2.0 provided by psycopg.

+
    +
  • connection -- the new-type inheritable connection class
  • +
  • cursor -- the new-type inheritable cursor class
  • +
  • adapt() -- exposes the PEP-246 compatible adapting mechanism used +by psycopg to adapt Python types to PostgreSQL ones
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
objectadapt(obj, + protocol, + alternate) +
+adapt obj to given protocol
new AsIs wrapper objectAsIs(obj) +
new boolean valueBoolean(obj) +
new wrapperDateFromPy(datetime.date) +
new wrapperIntervalFromPy(datetime.timedelta) +
new type objectnew_type(oids, + name, + adapter) +
+Create a new binding object.
new quoted stringQuotedString(str, + enc) +
 register_adapter(typ, + callable) +
+Register 'callable' as an ISQLQuote adapter for type 'typ'.
Noneregister_type(obj) +
+register obj with psycopg type system
new wrapperTimeFromPy(datetime.time) +
new wrapperTimestampFromPy(datetime.datetime) +

+ + + + + + + + + + + + + + + + +
Variable Summary
intISOLATION_LEVEL_AUTOCOMMIT = 0                                                                     
intISOLATION_LEVEL_READ_COMMITTED = 1                                                                     
intISOLATION_LEVEL_READ_UNCOMMITTED = 1                                                                     
intISOLATION_LEVEL_REPEATABLE_READ = 2                                                                     
intISOLATION_LEVEL_SERIALIZABLE = 2                                                                     

+ + + + + + +
Function Details
+ + +
+

adapt(obj, + protocol, + alternate) +

+

adapt obj to given protocol

+
+
Returns:
+
+object
+
+
+
+ + +
+

AsIs(obj) +

+
+
Returns:
+
+new AsIs wrapper object
+
+
+
+ + +
+

Boolean(obj) +

+
+
Returns:
+
+new boolean value
+
+
+
+ + +
+

DateFromPy(datetime.date) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

IntervalFromPy(datetime.timedelta) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

new_type(oids, + name, + adapter) +

+

Create a new binding object. The object can be used with the +register_type() function to bind PostgreSQL objects to python objects.

+
+
Parameters:
+
oids - + Tuple of oid of the PostgreSQL types to convert. +
+
name - + Name for the new type +
+
adapter - + Callable to perform type conversion. +It must have the signature fun(value, cur) where value is +the string representation returned by PostgreSQL (None if NULL) +and cur is the cursor from which data are read. +
+
+
Returns:
+
+new type object
+
+
+
+ + +
+

QuotedString(str, + enc) +

+
+
Returns:
+
+new quoted string
+
+
+
+ + +
+

register_adapter(typ, + callable) +

+

Register 'callable' as an ISQLQuote adapter for type 'typ'.

+
+
+
+ + +
+

register_type(obj) +

+

register obj with psycopg type system

+
+
Parameters:
+
obj - + A type adapter created by new_type() +
+
+
Returns:
+
+None
+
+
+
+ + +
+

TimeFromPy(datetime.time) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

TimestampFromPy(datetime.datetime) +

+
+
Returns:
+
+new wrapper
+
+
+
+
+ + + + + + +
Variable Details
+
+ +

ISOLATION_LEVEL_AUTOCOMMIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_COMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_UNCOMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_REPEATABLE_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_SERIALIZABLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.extras-module.html b/trunk/psycopg2/doc/api/private/psycopg2.extras-module.html new file mode 100644 index 0000000..463fc22 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.extras-module.html @@ -0,0 +1,91 @@ + + + + + psycopg2.extras + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extras

+ +

Miscellaneous goodies for psycopg2

+

This module is a generic place used to hold little helper functions +and classes untill a better place in the distribution is found.

+
+ + + + + + + + + + + + + +
Classes
+ DictConnectionA connection that uses DictCursor automatically.
+ DictCursorA cursor that keeps a list of column name -> index mappings.
+ DictRowA row object that allow by-colun-name access to data.
+ SQL_INAdapt any iterable to an SQL quotable object.

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.extras.DictConnection-class.html b/trunk/psycopg2/doc/api/private/psycopg2.extras.DictConnection-class.html new file mode 100644 index 0000000..73989b5 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.extras.DictConnection-class.html @@ -0,0 +1,202 @@ + + + + + psycopg2.extras.DictConnection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictConnection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictConnection

+ +
+object --+    
+         |    
+connection --+
+             |
+            DictConnection
+

+ +
+ +

A connection that uses DictCursor automatically.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 cursor(self) +
    Inherited from connection
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the connection.
 commit() +
+Commit all changes to database.
 rollback() +
+Roll back all changes done to database.
 set_client_encoding(encoding) +
+Set client encoding to encoding.
 set_isolation_level(level) +
+Switch isolation level to level.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from connection
 closed: True if the connection is closed.
 DatabaseError: Error related to the database engine.
 DataError: Error related to problems with the processed data.
 dsn: The current connection string.
 encoding: The current client encoding.
 Error: Base class for error exceptions.
 IntegrityError: Error related to database integrity.
 InterfaceError: Error related to the database interface.
 InternalError: The database encountered an internal error.
 isolation_level: The current isolation level.
 notices
 notifies
 NotSupportedError: A not supported datbase API was called.
 OperationalError: Error related to database operation (disconnect, memory allocation etc).
 ProgrammingError: Error related to database programming (SQL error, table not found etc).
 Warning: A database warning.

+ + + + + + +
Method Details
+ + +
+

cursor(self) +

+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.extras.DictCursor-class.html b/trunk/psycopg2/doc/api/private/psycopg2.extras.DictCursor-class.html new file mode 100644 index 0000000..80a05c9 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.extras.DictCursor-class.html @@ -0,0 +1,359 @@ + + + + + psycopg2.extras.DictCursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictCursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictCursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            DictCursor
+

+ +
+ +

A cursor that keeps a list of column name -> index mappings.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 callproc(self, + procname, + vars) +
 execute(self, + query, + vars, + async) +
 fetchall(self) +
 fetchmany(self, + size) +
 fetchone(self) +
 _build_index(self) +
    Inherited from cursor
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __iter__(x) +
+Return iter(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the cursor.
 copy_from(file, + table, + sep, + null) +
+Copy table from file.
 copy_to(file, + table, + sep, + null) +
+Copy table to file.
 executemany(query, + vars_list, + async) +
+Execute many queries with bound vars.
intfileno() +
+Return file descriptor associated to database connection.
boolisready() +
+Return True if data is ready after an async query.
strmogrify(query, + vars) +
+Return query after vars binding.
 next(x) +
+Return the next value, or raise StopIteration...
 nextset() +
+Skip to next set of data.
 scroll(value, + mode) +
+Scroll to new position according to mode.
 setinputsizes(sizes) +
+Set memory areas before execute.
 setoutputsize(size, + column) +
+Set column buffer size.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from cursor
 arraysize: Number of records fetchmany() must fetch if not explicitely specified.
 binary_types
 connection: The connection where the cursor comes from.
 description: Cursor description as defined in DBAPI-2.0.
 lastrowid: The oid of the last row inserted by the cursor.
 name
 query: The last query text sent to the backend.
 row_factory
 rowcount: Number of rows read from the backend in the last command.
 rownumber: The current row position.
 statusmessage: The return message of the last command.
 string_types
 typecaster
 tzinfo_factory

+ + + + + + + + +
Class Variable Summary
int_DictCursor__query_executed = 0                                                                     

+ + + + + + +
Method Details
+ + +
+

callproc(self, + procname, + vars=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.callproc
+
+
+
+ + +
+

execute(self, + query, + vars=None, + async=0) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.execute
+
+
+
+ + +
+

fetchall(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchall
+
+
+
+ + +
+

fetchmany(self, + size=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchmany
+
+
+
+ + +
+

fetchone(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchone
+
+
+
+ + +
+

_build_index(self) +

+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

_DictCursor__query_executed

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.extras.DictRow-class.html b/trunk/psycopg2/doc/api/private/psycopg2.extras.DictRow-class.html new file mode 100644 index 0000000..db74990 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.extras.DictRow-class.html @@ -0,0 +1,376 @@ + + + + + psycopg2.extras.DictRow + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictRow +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictRow

+ +
+object --+    
+         |    
+      list --+
+             |
+            DictRow
+

+ +
+ +

A row object that allow by-colun-name access to data.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + cursor) +
 __getitem__(self, + x) +
 get(self, + x, + default) +
 has_key(self, + x) +
 items(self) +
 keys(self) +
 values(self) +
    Inherited from list
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + cursor) +
(Constructor) +

+
+
Overrides:
+
__builtin__.list.__init__
+
+
+
+ + +
+

__getitem__(self, + x) +
(Indexing operator) +

+
+
Overrides:
+
__builtin__.list.__getitem__
+
+
+
+ + +
+

get(self, + x, + default=None) +

+
+
+
+ + +
+

has_key(self, + x) +

+
+
+
+ + +
+

items(self) +

+
+
+
+ + +
+

keys(self) +

+
+
+
+ + +
+

values(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.extras.SQL_IN-class.html b/trunk/psycopg2/doc/api/private/psycopg2.extras.SQL_IN-class.html new file mode 100644 index 0000000..6b7009b --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.extras.SQL_IN-class.html @@ -0,0 +1,171 @@ + + + + + psycopg2.extras.SQL_IN + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class SQL_IN +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SQL_IN

+ +
+object --+
+         |
+        SQL_IN
+

+ +
+ +

Adapt any iterable to an SQL quotable object.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + seq) +
 __str__(self) +
 getquoted(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

__init__(self, + seq) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+
+
+
+ + +
+

getquoted(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.pool-module.html b/trunk/psycopg2/doc/api/private/psycopg2.pool-module.html new file mode 100644 index 0000000..64e53c1 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.pool-module.html @@ -0,0 +1,126 @@ + + + + + psycopg2.pool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.pool

+ +

Connection pooling for psycopg2

+

This module implements thread-safe (and not) connection pools.

+
+ + + + + + + + + + + + + +
Classes
+ AbstractConnectionPoolGeneric key-based pooling code.
+ PersistentConnectionPoolA pool that assigns persistent connections to different threads.
+ SimpleConnectionPoolA connection pool that can't be shared across different threads.
+ ThreadedConnectionPoolA connection pool that works with the threading module.

+ + + + + + + + +
Exceptions
+ PoolError 

+ + + + + + + + +
Function Summary
 dbg(*args) +

+ + + + + + +
Function Details
+ + +
+

dbg(*args) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html b/trunk/psycopg2/doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html new file mode 100644 index 0000000..be79964 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.pool.AbstractConnectionPool-class.html @@ -0,0 +1,247 @@ + + + + + psycopg2.pool.AbstractConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class AbstractConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type AbstractConnectionPool

+ +
+object --+
+         |
+        AbstractConnectionPool
+

+ +
Known Subclasses:
+
+ PersistentConnectionPool, + SimpleConnectionPool, + ThreadedConnectionPool
+ +
+ +

Generic key-based pooling code.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the connection pool.

+

New 'minconn' connections are created immediately calling 'connfunc' +with given parameters. The connection pool will support a maximum of +about 'maxconn' connections.

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

_closeall(self) +

+

Close all connections.

+

Note that this can lead to some code fail badly when trying to use +an already closed connection. If you call .closeall() make sure +your code can deal with it.

+
+
+
+ + +
+

_connect(self, + key=None) +

+

Create a new connection and assign it to 'key' if not None.

+
+
+
+ + +
+

_getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

_getkey(self) +

+

Return a new unique key.

+
+
+
+ + +
+

_putconn(self, + conn, + key=None, + close=False) +

+

Put away a connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html b/trunk/psycopg2/doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html new file mode 100644 index 0000000..4656713 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.pool.PersistentConnectionPool-class.html @@ -0,0 +1,237 @@ + + + + + psycopg2.pool.PersistentConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PersistentConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PersistentConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        PersistentConnectionPool
+

+ +
+ +

A pool that assigns persistent connections to different threads.

+

Note that this connection pool generates by itself the required keys +using the current thread id. This means that untill a thread put away +a connection it will always get the same connection object by successive +.getconn() calls. This also means that a thread can't use more than one +single connection from the pool.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self) +
+Generate thread id and return a connection.
 putconn(self, + conn, + close) +
+Put away an unused connection.
    Inherited from AbstractConnectionPool
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self) +

+

Generate thread id and return a connection.

+
+
+
+ + +
+

putconn(self, + conn=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.pool.PoolError-class.html b/trunk/psycopg2/doc/api/private/psycopg2.pool.PoolError-class.html new file mode 100644 index 0000000..83a85cf --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.pool.PoolError-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.pool.PoolError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PoolError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class PoolError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   PoolError
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html b/trunk/psycopg2/doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html new file mode 100644 index 0000000..06c9bb6 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.pool.SimpleConnectionPool-class.html @@ -0,0 +1,222 @@ + + + + + psycopg2.pool.SimpleConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class SimpleConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SimpleConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        SimpleConnectionPool
+

+ +
+ +

A connection pool that can't be shared across different threads.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 closeall(self) +
+Close all connections.
 getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from AbstractConnectionPool
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

closeall(self) +

+

Close all connections.

+

Note that this can lead to some code fail badly when trying to use +an already closed connection. If you call .closeall() make sure +your code can deal with it.

+
+
+
+ + +
+

getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

putconn(self, + conn, + key=None, + close=False) +

+

Put away a connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html b/trunk/psycopg2/doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html new file mode 100644 index 0000000..1ad34cb --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.pool.ThreadedConnectionPool-class.html @@ -0,0 +1,236 @@ + + + + + psycopg2.pool.ThreadedConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class ThreadedConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ThreadedConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        ThreadedConnectionPool
+

+ +
+ +

A connection pool that works with the threading module.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 putconn(self, + conn, + key, + close) +
+Put away an unused connection.
    Inherited from AbstractConnectionPool
 _closeall(self) +
+Close all connections.
 _connect(self, + key) +
+Create a new connection and assign it to 'key' if not None.
 _getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 _getkey(self) +
+Return a new unique key.
 _putconn(self, + conn, + key, + close) +
+Put away a connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

putconn(self, + conn=None, + key=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.psycopg1-module.html b/trunk/psycopg2/doc/api/private/psycopg2.psycopg1-module.html new file mode 100644 index 0000000..f535cb9 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.psycopg1-module.html @@ -0,0 +1,121 @@ + + + + + psycopg2.psycopg1 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.psycopg1

+ +

psycopg 1.1.x compatibility module

+

This module uses the new style connection and cursor types to build a psycopg +1.1.1.x compatibility layer. It should be considered a temporary hack to run +old code while porting to psycopg 2. Import it as follows:

+
+from psycopg2 import psycopg1 as psycopg
+
+
+ + + + + + + + + +
Classes
+ connectionpsycopg 1.1.x connection.
+ cursorpsycopg 1.1.x cursor.

+ + + + + + + + +
Function Summary
new psycopg 1.1.x compatible connection objectconnect(dsn, + ...) +

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+
+
Returns:
+
+new psycopg 1.1.x compatible connection object
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.psycopg1.connection-class.html b/trunk/psycopg2/doc/api/private/psycopg2.psycopg1.connection-class.html new file mode 100644 index 0000000..6d52ff8 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.psycopg1.connection-class.html @@ -0,0 +1,221 @@ + + + + + psycopg2.psycopg1.connection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class connection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type connection

+ +
+object --+    
+         |    
+connection --+
+             |
+            connection
+

+ +
+ +

psycopg 1.1.x connection.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
switch autocommit on (1) or off (0)autocommit(on_off) +
new psycopg 1.1.x compatible cursor objectcursor() +
    Inherited from connection
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 close() +
+Close the connection.
 commit() +
+Commit all changes to database.
 rollback() +
+Roll back all changes done to database.
 set_client_encoding(encoding) +
+Set client encoding to encoding.
 set_isolation_level(level) +
+Switch isolation level to level.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from connection
 closed: True if the connection is closed.
 DatabaseError: Error related to the database engine.
 DataError: Error related to problems with the processed data.
 dsn: The current connection string.
 encoding: The current client encoding.
 Error: Base class for error exceptions.
 IntegrityError: Error related to database integrity.
 InterfaceError: Error related to the database interface.
 InternalError: The database encountered an internal error.
 isolation_level: The current isolation level.
 notices
 notifies
 NotSupportedError: A not supported datbase API was called.
 OperationalError: Error related to database operation (disconnect, memory allocation etc).
 ProgrammingError: Error related to database programming (SQL error, table not found etc).
 Warning: A database warning.

+ + + + + + +
Method Details
+ + +
+

autocommit(on_off=1) +

+
+
Returns:
+
+switch autocommit on (1) or off (0)
+
+
+
+ + +
+

cursor() +

+
+
Returns:
+
+new psycopg 1.1.x compatible cursor object
+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.psycopg1.cursor-class.html b/trunk/psycopg2/doc/api/private/psycopg2.psycopg1.cursor-class.html new file mode 100644 index 0000000..17d22e0 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.psycopg1.cursor-class.html @@ -0,0 +1,308 @@ + + + + + psycopg2.psycopg1.cursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class cursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type cursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            cursor
+

+ +
+ +

psycopg 1.1.x cursor.

+

Note that this cursor implements the exact procedure used by psycopg 1 to +build dictionaries out of result rows. The DictCursor in the +psycopg.extras modules implements a much better and faster algorithm.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dictfetchall(self) +
 dictfetchmany(self, + size) +
 dictfetchone(self) +
 __build_dict(self, + row) +
    Inherited from cursor
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __iter__(x) +
+Return iter(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __str__(x) +
+Return str(x)...
 callproc(procname, + parameters, + async) +
+Execute stored procedure.
 close() +
+Close the cursor.
 copy_from(file, + table, + sep, + null) +
+Copy table from file.
 copy_to(file, + table, + sep, + null) +
+Copy table to file.
 execute(query, + vars, + async) +
+Execute query with bound vars.
 executemany(query, + vars_list, + async) +
+Execute many queries with bound vars.
list of tuplefetchall() +
+Return all the remaining rows of a query result set.
list of tuplefetchmany(size) +
+Return the next size rows of a query result set in the form of a list +of tuples (by default) or using the sequence factory previously set in +the row_factory attribute.
tuple or Nonefetchone() +
+Return the next row of a query result set in the form of a tuple (by +default) or using the sequence factory previously set in the +row_factory attribute.
intfileno() +
+Return file descriptor associated to database connection.
boolisready() +
+Return True if data is ready after an async query.
strmogrify(query, + vars) +
+Return query after vars binding.
 next(x) +
+Return the next value, or raise StopIteration...
 nextset() +
+Skip to next set of data.
 scroll(value, + mode) +
+Scroll to new position according to mode.
 setinputsizes(sizes) +
+Set memory areas before execute.
 setoutputsize(size, + column) +
+Set column buffer size.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + + + + + + + + + + + + + + + + + +
Property Summary
    Inherited from cursor
 arraysize: Number of records fetchmany() must fetch if not explicitely specified.
 binary_types
 connection: The connection where the cursor comes from.
 description: Cursor description as defined in DBAPI-2.0.
 lastrowid: The oid of the last row inserted by the cursor.
 name
 query: The last query text sent to the backend.
 row_factory
 rowcount: Number of rows read from the backend in the last command.
 rownumber: The current row position.
 statusmessage: The return message of the last command.
 string_types
 typecaster
 tzinfo_factory

+ + + + + + +
Method Details
+ + +
+

dictfetchall(self) +

+
+
+
+ + +
+

dictfetchmany(self, + size) +

+
+
+
+ + +
+

dictfetchone(self) +

+
+
+
+ + +
+

__build_dict(self, + row) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.tz-module.html b/trunk/psycopg2/doc/api/private/psycopg2.tz-module.html new file mode 100644 index 0000000..9b8244a --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.tz-module.html @@ -0,0 +1,193 @@ + + + + + psycopg2.tz + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.tz

+ +

tzinfo implementations for psycopg2

+

This module holds two different tzinfo implementations that can be used as +the 'tzinfo' argument to datetime constructors, directly passed to psycopg +functions or used to set the .tzinfo_factory attribute in cursors.

+
+ + + + + + + + + +
Classes
+ FixedOffsetTimezoneFixed offset in minutes east from UTC.
+ LocalTimezonePlatform idea of local timezone.

+ + + + + + + + + + + + + + +
Variable Summary
timedeltaDSTDIFF = datetime.timedelta(0, 3600) +
LocalTimezoneLOCAL = <psycopg2.tz.LocalTimezone object at 0x00847090> +
timedeltaSTDOFFSET = datetime.timedelta(0, 3600) +
timedeltaZERO = datetime.timedelta(0) +

+ + + + + + +
Variable Details
+
+ +

DSTDIFF

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

LOCAL

+
+
+
+
+
Type:
+
+ LocalTimezone + +
+
Value:
+
+
+<psycopg2.tz.LocalTimezone object at 0x00847090>                       
+
+
+
+
+
+ +

STDOFFSET

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

ZERO

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0)                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html b/trunk/psycopg2/doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html new file mode 100644 index 0000000..4e6d658 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.tz.FixedOffsetTimezone-class.html @@ -0,0 +1,273 @@ + + + + + psycopg2.tz.FixedOffsetTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class FixedOffsetTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type FixedOffsetTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            FixedOffsetTimezone
+

+ +
+ +

Fixed offset in minutes east from UTC.

+

This is exactly the implementation found in Python 2.3.x documentation, +with a small change to the __init__ method to allow for pickling and a +default name in the form 'sHH:MM' ('s' is the sign.)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + offset, + name) +
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + +
Class Variable Summary
NoneType_name = None                                                                  
timedelta_offset = datetime.timedelta(0) +

+ + + + + + +
Method Details
+ + +
+

__init__(self, + offset=None, + name=None) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

_name

+
+
+
+
+
Type:
+
+ NoneType + +
+
Value:
+
+
+None                                                                  
+
+
+
+
+
+ +

_offset

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0)                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/psycopg2.tz.LocalTimezone-class.html b/trunk/psycopg2/doc/api/private/psycopg2.tz.LocalTimezone-class.html new file mode 100644 index 0000000..0954549 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/psycopg2.tz.LocalTimezone-class.html @@ -0,0 +1,209 @@ + + + + + psycopg2.tz.LocalTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class LocalTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type LocalTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            LocalTimezone
+

+ +
+ +

Platform idea of local timezone.

+

This is the exact implementation from the Pyhton 2.3 documentation.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
 _isdst(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+ + +
+

_isdst(self, + dt) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/private/toc-everything.html b/trunk/psycopg2/doc/api/private/toc-everything.html new file mode 100644 index 0000000..2b60e36 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-everything.html @@ -0,0 +1,134 @@ + + + + + Everything + + + + +

Everything

+
+ + +

All Classes

+

psycopg2._psycopg.connection

+

psycopg2._psycopg.cursor

+

psycopg2._psycopg.ISQLQuote

+

psycopg2.extras.DictConnection

+

psycopg2.extras.DictCursor

+

psycopg2.extras.DictRow

+

psycopg2.extras.SQL_IN

+

psycopg2.pool.AbstractConnectionPool

+

psycopg2.pool.PersistentConnectionPool

+

psycopg2.pool.SimpleConnectionPool

+

psycopg2.pool.ThreadedConnectionPool

+

psycopg2.psycopg1.connection

+

psycopg2.psycopg1.cursor

+

psycopg2.tz.FixedOffsetTimezone

+

psycopg2.tz.LocalTimezone

+ + +

All Exceptions

+

psycopg2.DatabaseError

+

psycopg2.DataError

+

psycopg2.Error

+

psycopg2.IntegrityError

+

psycopg2.InterfaceError

+

psycopg2.InternalError

+

psycopg2.NotSupportedError

+

psycopg2.OperationalError

+

psycopg2.pool.PoolError

+

psycopg2.ProgrammingError

+

psycopg2.Warning

+ + +

All Functions

+

adapt

+

AsIs

+

Binary

+

Boolean

+

connect

+

connect

+

Date

+

DateFromPy

+

DateFromTicks

+

dbg

+

IntervalFromPy

+

List

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

Time

+

TimeFromPy

+

TimeFromTicks

+

Timestamp

+

TimestampFromPy

+

TimestampFromTicks

+ + +

All Variables

+

__version__

+

_C_API

+

adapters

+

apilevel

+

BINARY

+

binary_types

+

BINARYARRAY

+

BOOLEAN

+

BOOLEANARRAY

+

DATE

+

DATEARRAY

+

DATETIME

+

DATETIMEARRAY

+

DECIMAL

+

DECIMALARRAY

+

DSTDIFF

+

encodings

+

FLOAT

+

FLOATARRAY

+

INTEGER

+

INTEGERARRAY

+

INTERVAL

+

INTERVALARRAY

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+

LOCAL

+

LONGINTEGER

+

LONGINTEGERARRAY

+

NUMBER

+

paramstyle

+

PYDATE

+

PYDATETIME

+

PYINTERVAL

+

PYTIME

+

ROWID

+

ROWIDARRAY

+

STDOFFSET

+

STRING

+

string_types

+

STRINGARRAY

+

threadsafety

+

TIME

+

TIMEARRAY

+

UNICODE

+

UNICODEARRAY

+

ZERO

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc-psycopg2-module.html b/trunk/psycopg2/doc/api/private/toc-psycopg2-module.html new file mode 100644 index 0000000..e07c73c --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-psycopg2-module.html @@ -0,0 +1,58 @@ + + + + + psycopg2 + + + + +

psycopg2

+
+ + +

Modules

+

_psycopg

+

extensions

+

extras

+

pool

+

psycopg1

+

tz

+ + +

Exceptions

+

DatabaseError

+

DataError

+

Error

+

IntegrityError

+

InterfaceError

+

InternalError

+

NotSupportedError

+

OperationalError

+

ProgrammingError

+

Warning

+ + +

Functions

+

Binary

+

connect

+

Date

+

DateFromTicks

+

Time

+

TimeFromTicks

+

Timestamp

+

TimestampFromTicks

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc-psycopg2._psycopg-module.html b/trunk/psycopg2/doc/api/private/toc-psycopg2._psycopg-module.html new file mode 100644 index 0000000..49975f5 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-psycopg2._psycopg-module.html @@ -0,0 +1,78 @@ + + + + + psycopg2._psycopg + + + + +

_psycopg

+
+ + +

Classes

+

connection

+

cursor

+

ISQLQuote

+ + +

Functions

+

List

+ + +

Variables

+

__version__

+

_C_API

+

adapters

+

apilevel

+

BINARY

+

binary_types

+

BINARYARRAY

+

BOOLEAN

+

BOOLEANARRAY

+

DATE

+

DATEARRAY

+

DATETIME

+

DATETIMEARRAY

+

DECIMAL

+

DECIMALARRAY

+

encodings

+

FLOAT

+

FLOATARRAY

+

INTEGER

+

INTEGERARRAY

+

INTERVAL

+

INTERVALARRAY

+

LONGINTEGER

+

LONGINTEGERARRAY

+

NUMBER

+

paramstyle

+

PYDATE

+

PYDATETIME

+

PYINTERVAL

+

PYTIME

+

ROWID

+

ROWIDARRAY

+

STRING

+

string_types

+

STRINGARRAY

+

threadsafety

+

TIME

+

TIMEARRAY

+

UNICODE

+

UNICODEARRAY

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc-psycopg2.extensions-module.html b/trunk/psycopg2/doc/api/private/toc-psycopg2.extensions-module.html new file mode 100644 index 0000000..2e7c983 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-psycopg2.extensions-module.html @@ -0,0 +1,47 @@ + + + + + psycopg2.extensions + + + + +

extensions

+
+ + +

Functions

+

adapt

+

AsIs

+

Boolean

+

DateFromPy

+

IntervalFromPy

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

TimeFromPy

+

TimestampFromPy

+ + +

Variables

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc-psycopg2.extras-module.html b/trunk/psycopg2/doc/api/private/toc-psycopg2.extras-module.html new file mode 100644 index 0000000..505d1d8 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-psycopg2.extras-module.html @@ -0,0 +1,32 @@ + + + + + psycopg2.extras + + + + +

extras

+
+ + +

Classes

+

DictConnection

+

DictCursor

+

DictRow

+

SQL_IN

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc-psycopg2.pool-module.html b/trunk/psycopg2/doc/api/private/toc-psycopg2.pool-module.html new file mode 100644 index 0000000..2b2a8cc --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-psycopg2.pool-module.html @@ -0,0 +1,40 @@ + + + + + psycopg2.pool + + + + +

pool

+
+ + +

Classes

+

AbstractConnectionPool

+

PersistentConnectionPool

+

SimpleConnectionPool

+

ThreadedConnectionPool

+ + +

Exceptions

+

PoolError

+ + +

Functions

+

dbg

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc-psycopg2.psycopg1-module.html b/trunk/psycopg2/doc/api/private/toc-psycopg2.psycopg1-module.html new file mode 100644 index 0000000..20971b2 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-psycopg2.psycopg1-module.html @@ -0,0 +1,34 @@ + + + + + psycopg2.psycopg1 + + + + +

psycopg1

+
+ + +

Classes

+

connection

+

cursor

+ + +

Functions

+

connect

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc-psycopg2.tz-module.html b/trunk/psycopg2/doc/api/private/toc-psycopg2.tz-module.html new file mode 100644 index 0000000..fce1191 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc-psycopg2.tz-module.html @@ -0,0 +1,37 @@ + + + + + psycopg2.tz + + + + +

tz

+
+ + +

Classes

+

FixedOffsetTimezone

+

LocalTimezone

+ + +

Variables

+

DSTDIFF

+

LOCAL

+

STDOFFSET

+

ZERO

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/toc.html b/trunk/psycopg2/doc/api/private/toc.html new file mode 100644 index 0000000..1e31df5 --- /dev/null +++ b/trunk/psycopg2/doc/api/private/toc.html @@ -0,0 +1,39 @@ + + + + + Table of Contents + + + + +

Table of Contents

+
+

Everything

+ + +

Packages

+

psycopg2

+ + +

Modules

+

psycopg2._psycopg

+

psycopg2.extensions

+

psycopg2.extras

+

psycopg2.pool

+

psycopg2.psycopg1

+

psycopg2.tz

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/private/trees.html b/trunk/psycopg2/doc/api/private/trees.html new file mode 100644 index 0000000..5907cfa --- /dev/null +++ b/trunk/psycopg2/doc/api/private/trees.html @@ -0,0 +1,196 @@ + + + + + Module and Class Hierarchies + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ + +

Module Hierarchy

+
    +
  • psycopg2: A Python driver for PostgreSQL
      +
    • _psycopg: psycopg PostgreSQL driver
    • +
    • extensions: psycopg extensions to the DBAPI-2.0
    • +
    • extras: Miscellaneous goodies for psycopg2
    • +
    • pool: Connection pooling for psycopg2
    • +
    • psycopg1: psycopg 1.1.x compatibility module
    • +
    • tz: tzinfo implementations for psycopg2
    • +
    +
  • +
+ + +

Class Hierarchy

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/__builtin__.list-class.html b/trunk/psycopg2/doc/api/public/__builtin__.list-class.html new file mode 100644 index 0000000..4ede43e --- /dev/null +++ b/trunk/psycopg2/doc/api/public/__builtin__.list-class.html @@ -0,0 +1,817 @@ + + + + + __builtin__.list + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class list +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type list

+ +
+object --+
+         |
+        list
+

+ +
Known Subclasses:
+
+ DictRow
+ +
+ +

list() -> new list +list(sequence) -> new list initialized from sequence's items

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getitem__(x, + y) +
+Return x[y]...
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__add__(x, + y) +
(Addition operator) +

+
+
Returns:
+
+
+x+y
+
+
+
+
+
+ + +
+

__contains__(x, + y) +
(In operator) +

+
+
Returns:
+
+
+y in x
+
+
+
+
+
+ + +
+

__delitem__(x, + y) +
(Index deletion operator) +

+
+
Returns:
+
+
+del x[y]
+
+
+
+
+
+ + +
+

__delslice__(x, + i, + j) +
(Slice deletion operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+del x[i:j]
+
+
+
+
+
+ + +
+

__eq__(x, + y) +
(Equality operator) +

+
+
Returns:
+
+
+x==y
+
+
+
+
+
+ + +
+

__ge__(x, + y) +
(Greater-than-or-equals operator) +

+
+
Returns:
+
+
+x>=y
+
+
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__getitem__(x, + y) +
(Indexing operator) +

+
+
Returns:
+
+
+x[y]
+
+
+
+
+
+ + +
+

__getslice__(x, + i, + j) +
(Slicling operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]
+
+
+
+
+
+ + +
+

__gt__(x, + y) +
(Greater-than operator) +

+
+
Returns:
+
+
+x>y
+
+
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__iadd__(x, + y) +

+
+
Returns:
+
+
+x+=y
+
+
+
+
+
+ + +
+

__imul__(x, + y) +

+
+
Returns:
+
+
+x*=y
+
+
+
+
+
+ + +
+

__iter__(x) +

+
+
Returns:
+
+
+iter(x)
+
+
+
+
+
+ + +
+

__le__(x, + y) +
(Less-than-or-equals operator) +

+
+
Returns:
+
+
+x<=y
+
+
+
+
+
+ + +
+

__len__(x) +
(Length operator) +

+
+
Returns:
+
+
+len(x)
+
+
+
+
+
+ + +
+

__lt__(x, + y) +
(Less-than operator) +

+
+
Returns:
+
+
+x<y
+
+
+
+
+
+ + +
+

__mul__(x, + n) +

+
+
Returns:
+
+
+x*n
+
+
+
+
+
+ + +
+

__ne__(x, + y) +
(Inequality operator) +

+
+
Returns:
+
+
+x!=y
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__rmul__(x, + n) +

+
+
Returns:
+
+
+n*x
+
+
+
+
+
+ + +
+

__setitem__(x, + i, + y) +
(Index assignment operator) +

+
+
Returns:
+
+
+x[i]=y
+
+
+
+
+
+ + +
+

__setslice__(x, + i, + j, + y) +
(Slice assignment operator) +

+

Use of negative indices is not supported.

+
+
Returns:
+
+
+x[i:j]=y
+
+
+
+
+
+ + +
+

append(L, + object) +

+

append object to end

+
+
+
+ + +
+

count(L, + value) +

+

return number of occurrences of value

+
+
Returns:
+
+
+integer
+
+
+
+
+
+ + +
+

extend(L, + iterable) +

+

extend list by appending elements from the iterable

+
+
+
+ + +
+

index(...) +

+

L.index(value, [start, [stop]]) -> integer -- return first index of value

+
+
+
+ + +
+

insert(L, + index, + object) +

+

insert object before index

+
+
+
+ + +
+

pop(L, + index=...) +

+

remove and return item at index (default last)

+
+
Returns:
+
+
+item
+
+
+
+
+
+ + +
+

remove(L, + value) +

+

remove first occurrence of value

+
+
+
+ + +
+

reverse(L) +

+

reverse IN PLACE

+
+
+
+ + +
+

sort(L, + cmpfunc=None) +

+

stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/__builtin__.object-class.html b/trunk/psycopg2/doc/api/public/__builtin__.object-class.html new file mode 100644 index 0000000..e9638da --- /dev/null +++ b/trunk/psycopg2/doc/api/public/__builtin__.object-class.html @@ -0,0 +1,267 @@ + + + + + __builtin__.object + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class object +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type object

+ +
Known Subclasses:
+
+ AbstractConnectionPool, + list, + SQL_IN, + type, + tzinfo
+ +
+ +

The most base type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + +
Class Variable Summary
type__class__ = __builtin__.type

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
+
+ + +
+

__reduce__(...) +

+

helper for pickle

+
+
+
+ + +
+

__reduce_ex__(...) +

+

helper for pickle

+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
+
+ + +
+

__str__(x) +
(Informal representation operator) +

+
+
Returns:
+
+
+str(x)
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/__builtin__.type-class.html b/trunk/psycopg2/doc/api/public/__builtin__.type-class.html new file mode 100644 index 0000000..7af340f --- /dev/null +++ b/trunk/psycopg2/doc/api/public/__builtin__.type-class.html @@ -0,0 +1,384 @@ + + + + + __builtin__.type + + + + + + + + + + + + + + + + + + + +
+ + Module __builtin__ :: + Class type +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type type

+ +
+object --+
+         |
+        type
+

+ +
+ +

type(object) -> the object's type +type(name, bases, dict) -> a new type

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __call__(x, + ...) +
+Return x(...)...
 __cmp__(x, + y) +
+Return cmp(x,y)...
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
list of immediate subclasses__subclasses__() +
listmro() +
+return a type's method resolution order
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + + + + +
Property Summary
 __base__
 __basicsize__
 __dictoffset__
 __flags__
 __itemsize__
 __mro__
 __weakrefoffset__

+ + + + + + + + + + +
Class Variable Summary
tuple__bases__ = (<type 'object'>,) +
str__name__ = 'type' +

+ + + + + + +
Method Details
+ + +
+

__call__(x, + ...) +
(Call operator) +

+
+
Returns:
+
+
+x(...)
+
+
+
+
+
+ + +
+

__cmp__(x, + y) +
(Comparison operator) +

+
+
Returns:
+
+
+cmp(x,y)
+
+
+
+
+
+ + +
+

__delattr__(...) +

+

x.__delattr__('name') <==> del x.name

+
+
Overrides:
+
__builtin__.object.__delattr__
+
+
+
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__hash__(x) +
(Hashing function) +

+
+
Returns:
+
+
+hash(x)
+
+
+
+
Overrides:
+
__builtin__.object.__hash__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__repr__(x) +
(Representation operator) +

+
+
Returns:
+
+
+repr(x)
+
+
+
+
Overrides:
+
__builtin__.object.__repr__
+
+
+
+ + +
+

__setattr__(...) +

+

x.__setattr__('name', value) <==> x.name = value

+
+
Overrides:
+
__builtin__.object.__setattr__
+
+
+
+ + +
+

__subclasses__() +

+
+
Returns:
+
+list of immediate subclasses
+
+
+
+ + +
+

mro() +

+

return a type's method resolution order

+
+
Returns:
+
+list
+
+
+
+
+ + + + + + +
Class Variable Details
+
+ +

__bases__

+
+
+
+
+
Type:
+
+ tuple + +
+
Value:
+
+
+(<type 'object'>,)                                                     
+
+
+
+
+
+ +

__name__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'type'                                                                 
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/datetime.tzinfo-class.html b/trunk/psycopg2/doc/api/public/datetime.tzinfo-class.html new file mode 100644 index 0000000..080afa2 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/datetime.tzinfo-class.html @@ -0,0 +1,239 @@ + + + + + datetime.tzinfo + + + + + + + + + + + + + + + + + + + +
+ + Module datetime :: + Class tzinfo +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type tzinfo

+ +
+object --+
+         |
+        tzinfo
+

+ +
Known Subclasses:
+
+ FixedOffsetTimezone, + LocalTimezone
+ +
+ +

Abstract base class for time zone info objects.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 dst(...) +
+datetime -> DST offset in minutes east of UTC.
 fromutc(...) +
+datetime in UTC -> datetime in local time.
 tzname(...) +
+datetime -> string name of time zone.
 utcoffset(...) +
+datetime -> minutes east of UTC (negative for west of UTC).
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__getattribute__(...) +

+

x.__getattribute__('name') <==> x.name

+
+
Overrides:
+
__builtin__.object.__getattribute__
+
+
+
+ + +
+

__new__(T, + S, + ...) +

+
+
Returns:
+
+
+a new object with type S, a subtype of T
+
+
+
+
Overrides:
+
__builtin__.object.__new__
+
+
+
+ + +
+

__reduce__(...) +

+

-> (cls, state)

+
+
Overrides:
+
__builtin__.object.__reduce__
+
+
+
+ + +
+

dst(...) +

+

datetime -> DST offset in minutes east of UTC.

+
+
+
+ + +
+

fromutc(...) +

+

datetime in UTC -> datetime in local time.

+
+
+
+ + +
+

tzname(...) +

+

datetime -> string name of time zone.

+
+
+
+ + +
+

utcoffset(...) +

+

datetime -> minutes east of UTC (negative for west of UTC).

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/epydoc.css b/trunk/psycopg2/doc/api/public/epydoc.css new file mode 100644 index 0000000..22e8f7e --- /dev/null +++ b/trunk/psycopg2/doc/api/public/epydoc.css @@ -0,0 +1,138 @@ +/* Based on the Epydoc "default.css" +** with some missing reST-related classes +** and Python syntax support (from SilverCity) +*/ + +/* Body color */ +body { background: #ffffff; color: #000000; } + +/* Tables */ +table.summary, table.details, table.index + { background: #e8f0f8; color: #000000; } +tr.summary, tr.details, tr.index + { background: #70b0f0; color: #000000; + text-align: left; font-size: 120%; } +tr.group { background: #c0e0f8; color: #000000; + text-align: left; font-size: 120%; + font-style: italic; } + +/* Documentation page titles */ +h2.module { margin-top: 0.2em; } +h2.class { margin-top: 0.2em; } + +/* Headings */ +h1.heading { font-size: +140%; font-style: italic; + font-weight: bold; } +h2.heading { font-size: +125%; font-style: italic; + font-weight: bold; } +h3.heading { font-size: +110%; font-style: italic; + font-weight: normal; } + +/* Base tree */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* TOC */ +p.toc { margin: 0; } + +/* Details Sections */ +table.func-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.func-detail { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +table.var-details { background: #e8f0f8; color: #000000; + border: 2px groove #c0d0d0; + padding: 0 1em 0 1em; margin: 0.4em 0 0 0; } +h3.var-details { background: transparent; color: #000000; + margin: 0 0 1em 0; } + +/* Function signatures */ +.sig { background: transparent; color: #000000; + font-weight: bold; } +.sig-name { background: transparent; color: #006080; } +.sig-arg, .sig-kwarg, .sig-vararg + { background: transparent; color: #008060; } +.sig-default { background: transparent; color: #602000; } +.summary-sig { background: transparent; color: #000000; } +.summary-sig-name { background: transparent; color: #204080; } +.summary-sig-arg, .summary-sig-kwarg, .summary-sig-vararg + { background: transparent; color: #008060; } + +/* Doctest blocks */ +.py-src { background: transparent; color: #000000; } +.py-prompt { background: transparent; color: #005050; + font-weight: bold;} +.py-string { background: transparent; color: #006030; } +.py-comment { background: transparent; color: #003060; } +.py-keyword { background: transparent; color: #600000; } +.py-output { background: transparent; color: #404040; } +div.code-block, +pre.literal-block, +pre.doctestblock { background: #f4faff; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +table pre.doctestblock + { background: #dce4ec; color: #000000; + padding: .5em; margin: 1em; + border: 1px solid #708890; } +div.code-block { font-family: monospace; } + +/* Variable values */ +pre.variable { background: #dce4ec; color: #000000; + padding: .5em; margin: 0; + border: 1px solid #708890; } +.variable-linewrap { background: transparent; color: #604000; } +.variable-ellipsis { background: transparent; color: #604000; } +.variable-quote { background: transparent; color: #604000; } +.re { background: transparent; color: #000000; } +.re-char { background: transparent; color: #006030; } +.re-op { background: transparent; color: #600000; } +.re-group { background: transparent; color: #003060; } +.re-ref { background: transparent; color: #404040; } + +/* Navigation bar */ +table.navbar { background: #a0c0ff; color: #0000ff; + border: 2px groove #c0d0d0; } +th.navbar { background: #a0c0ff; color: #0000ff; } +th.navselect { background: #70b0ff; color: #000000; } +.nomargin { margin: 0; } + +/* Links */ +a:link { background: transparent; color: #0000ff; } +a:visited { background: transparent; color: #204080; } +a.navbar:link { background: transparent; color: #0000ff; + text-decoration: none; } +a.navbar:visited { background: transparent; color: #204080; + text-decoration: none; } + +/* Admonitions */ +div.warning, +div.note { background-color: #c0e0f8; + border: thin solid black; + padding: 1em; + margin-left: 1em; + margin-right: 1em; } +div.warning .first, +div.note .first { font-family: sans-serif; + font-size: 110%; + margin-right: 0.5em; } + +/* Lists */ +ul { margin-top: 0; } + +/* Python syntax */ +.p_character { color: olive; } +.p_classname { color: blue; font-weight: bold; } +.p_commentblock {color: gray; font-style: italic; } +.p_commentline { color: green; font-style: italic; } +.p_default {} +.p_defname { color: #009999; font-weight: bold; } +.p_identifier { color: black; } +.p_number { color: #009999; } +.p_operator { color: black; } +.p_string { color: #7F007F; } +.p_stringeol { color: #7F007F; } +.p_triple { color: #7F0000; } +.p_tripledouble { color: #7F0000; } +.p_word { color: navy; font-weight: bold; } diff --git a/trunk/psycopg2/doc/api/public/exceptions.Exception-class.html b/trunk/psycopg2/doc/api/public/exceptions.Exception-class.html new file mode 100644 index 0000000..d7e7ba4 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/exceptions.Exception-class.html @@ -0,0 +1,128 @@ + + + + + exceptions.Exception + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class Exception +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Exception

+ +
Known Subclasses:
+
+ StandardError
+ +
+ +

Common base class for all exceptions.

+
+ + + + + + + + + + + + +
Method Summary
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + +
Method Details
+ + +
+

__init__(...) +
(Constructor) +

+
+
+
+ + +
+

__getitem__(...) +
(Indexing operator) +

+
+
+
+ + +
+

__str__(...) +
(Informal representation operator) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/exceptions.StandardError-class.html b/trunk/psycopg2/doc/api/public/exceptions.StandardError-class.html new file mode 100644 index 0000000..ab0a1c3 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/exceptions.StandardError-class.html @@ -0,0 +1,102 @@ + + + + + exceptions.StandardError + + + + + + + + + + + + + + + + + + + +
+ + Module exceptions :: + Class StandardError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class StandardError

+ +
+Exception --+
+            |
+           StandardError
+

+ +
Known Subclasses:
+
+ Error, + Warning
+ +
+ +

Base class for all standard Python exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/frames.html b/trunk/psycopg2/doc/api/public/frames.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/frames.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/trunk/psycopg2/doc/api/public/help.html b/trunk/psycopg2/doc/api/public/help.html new file mode 100644 index 0000000..0e9a1cf --- /dev/null +++ b/trunk/psycopg2/doc/api/public/help.html @@ -0,0 +1,231 @@ + + + + + Help + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains:

+
    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +
+ +

Each Module Documentation page contains:

+
    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +
+ +

Each Class Documentation page contains:

+
    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +
+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies:

+
    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +
+ +

The Index page contains indices of terms and + identifiers:

+
    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +
+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ + + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
  +

+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/index.html b/trunk/psycopg2/doc/api/public/index.html new file mode 100644 index 0000000..ffd6536 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/index.html @@ -0,0 +1,15 @@ + + + + + API Documentation + + + + + + + + + diff --git a/trunk/psycopg2/doc/api/public/indices.html b/trunk/psycopg2/doc/api/public/indices.html new file mode 100644 index 0000000..a6d0fad --- /dev/null +++ b/trunk/psycopg2/doc/api/public/indices.html @@ -0,0 +1,418 @@ + + + + + Index + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Identifier Index
__add__Method in class __builtin__.list
__base__member_descriptor in class __builtin__.type
__bases__Variable in class __builtin__.type
__basicsize__member_descriptor in class __builtin__.type
__call__Method in class __builtin__.type
typeClass in module __builtin__
__cmp__Method in class __builtin__.type
__contains__Method in class __builtin__.list
__delattr__Method in class __builtin__.object
__delattr__Method in class __builtin__.type
__delitem__Method in class __builtin__.list
__delslice__Method in class __builtin__.list
__dictoffset__member_descriptor in class __builtin__.type
__eq__Method in class __builtin__.list
__flags__member_descriptor in class __builtin__.type
__ge__Method in class __builtin__.list
__getattribute__Method in class __builtin__.list
__getattribute__Method in class __builtin__.object
__getattribute__Method in class __builtin__.type
__getattribute__Method in class datetime.tzinfo
__getitem__Method in class __builtin__.list
__getitem__Method in class exceptions.Exception
__getitem__Method in class psycopg2.extras.DictRow
__getslice__Method in class __builtin__.list
__gt__Method in class __builtin__.list
__hash__Method in class __builtin__.list
__hash__Method in class __builtin__.object
__hash__Method in class __builtin__.type
__iadd__Method in class __builtin__.list
__imul__Method in class __builtin__.list
__init__Method in class __builtin__.list
__init__Method in class __builtin__.object
__init__Method in class exceptions.Exception
__init__Method in class psycopg2.extras.DictRow
__init__Method in class psycopg2.extras.SQL_IN
__init__Method in class psycopg2.pool.AbstractConnectionPool
__init__Method in class psycopg2.pool.PersistentConnectionPool
__init__Method in class psycopg2.pool.ThreadedConnectionPool
__init__Method in class psycopg2.tz.FixedOffsetTimezone
__itemsize__member_descriptor in class __builtin__.type
__iter__Method in class __builtin__.list
__le__Method in class __builtin__.list
__len__Method in class __builtin__.list
__lt__Method in class __builtin__.list
__mro__member_descriptor in class __builtin__.type
__mul__Method in class __builtin__.list
__name__Variable in class __builtin__.type
__ne__Method in class __builtin__.list
__new__Method in class __builtin__.list
__new__Method in class __builtin__.object
__new__Method in class __builtin__.type
__new__Method in class datetime.tzinfo
__reduce__Method in class __builtin__.object
__reduce__Method in class datetime.tzinfo
__reduce_ex__Method in class __builtin__.object
__repr__Method in class __builtin__.list
__repr__Method in class __builtin__.object
__repr__Method in class __builtin__.type
__rmul__Method in class __builtin__.list
__setattr__Method in class __builtin__.object
__setattr__Method in class __builtin__.type
__setitem__Method in class __builtin__.list
__setslice__Method in class __builtin__.list
__str__Method in class __builtin__.object
__str__Method in class exceptions.Exception
__subclasses__Method in class __builtin__.type
__weakrefoffset__member_descriptor in class __builtin__.type
AbstractConnectionPoolClass in module psycopg2.pool
adaptFunction in module psycopg2.extensions
appendMethod in class __builtin__.list
AsIsFunction in module psycopg2.extensions
autocommitMethod in class psycopg2.psycopg1.connection
BinaryFunction in package psycopg2
BooleanFunction in module psycopg2.extensions
callprocMethod in class psycopg2.extras.DictCursor
closeallMethod in class psycopg2.pool.PersistentConnectionPool
closeallMethod in class psycopg2.pool.ThreadedConnectionPool
connectFunction in package psycopg2
connectFunction in module psycopg2.psycopg1
connectionClass in module psycopg2.psycopg1
countMethod in class __builtin__.list
cursorMethod in class psycopg2.extras.DictConnection
cursorMethod in class psycopg2.psycopg1.connection
cursorClass in module psycopg2.psycopg1
DatabaseErrorClass in package psycopg2
DataErrorClass in package psycopg2
DateFunction in package psycopg2
DateFromPyFunction in module psycopg2.extensions
DateFromTicksFunction in package psycopg2
dbgFunction in module psycopg2.pool
DictConnectionClass in module psycopg2.extras
DictCursorClass in module psycopg2.extras
dictfetchallMethod in class psycopg2.psycopg1.cursor
dictfetchmanyMethod in class psycopg2.psycopg1.cursor
dictfetchoneMethod in class psycopg2.psycopg1.cursor
DictRowClass in module psycopg2.extras
dstMethod in class datetime.tzinfo
dstMethod in class psycopg2.tz.FixedOffsetTimezone
dstMethod in class psycopg2.tz.LocalTimezone
DSTDIFFVariable in module psycopg2.tz
ErrorClass in package psycopg2
ExceptionClass in module exceptions
executeMethod in class psycopg2.extras.DictCursor
extendMethod in class __builtin__.list
extensionsModule in package psycopg2
extrasModule in package psycopg2
fetchallMethod in class psycopg2.extras.DictCursor
fetchmanyMethod in class psycopg2.extras.DictCursor
fetchoneMethod in class psycopg2.extras.DictCursor
FixedOffsetTimezoneClass in module psycopg2.tz
fromutcMethod in class datetime.tzinfo
getMethod in class psycopg2.extras.DictRow
getconnMethod in class psycopg2.pool.PersistentConnectionPool
getconnMethod in class psycopg2.pool.ThreadedConnectionPool
getquotedMethod in class psycopg2.extras.SQL_IN
has_keyMethod in class psycopg2.extras.DictRow
indexMethod in class __builtin__.list
insertMethod in class __builtin__.list
IntegrityErrorClass in package psycopg2
InterfaceErrorClass in package psycopg2
InternalErrorClass in package psycopg2
IntervalFromPyFunction in module psycopg2.extensions
ISOLATION_LEVEL_AUTOCOMMITVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_COMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_READ_UNCOMMITTEDVariable in module psycopg2.extensions
ISOLATION_LEVEL_REPEATABLE_READVariable in module psycopg2.extensions
ISOLATION_LEVEL_SERIALIZABLEVariable in module psycopg2.extensions
itemsMethod in class psycopg2.extras.DictRow
keysMethod in class psycopg2.extras.DictRow
listClass in module __builtin__
LOCALVariable in module psycopg2.tz
LocalTimezoneClass in module psycopg2.tz
mroMethod in class __builtin__.type
new_typeFunction in module psycopg2.extensions
NotSupportedErrorClass in package psycopg2
objectClass in module __builtin__
OperationalErrorClass in package psycopg2
PersistentConnectionPoolClass in module psycopg2.pool
poolModule in package psycopg2
PoolErrorClass in module psycopg2.pool
popMethod in class __builtin__.list
ProgrammingErrorClass in package psycopg2
psycopg1Module in package psycopg2
psycopg2Package
putconnMethod in class psycopg2.pool.PersistentConnectionPool
putconnMethod in class psycopg2.pool.ThreadedConnectionPool
QuotedStringFunction in module psycopg2.extensions
register_adapterFunction in module psycopg2.extensions
register_typeFunction in module psycopg2.extensions
removeMethod in class __builtin__.list
reverseMethod in class __builtin__.list
SimpleConnectionPoolClass in module psycopg2.pool
sortMethod in class __builtin__.list
SQL_INClass in module psycopg2.extras
StandardErrorClass in module exceptions
STDOFFSETVariable in module psycopg2.tz
ThreadedConnectionPoolClass in module psycopg2.pool
TimeFunction in package psycopg2
TimeFromPyFunction in module psycopg2.extensions
TimeFromTicksFunction in package psycopg2
TimestampFunction in package psycopg2
TimestampFromPyFunction in module psycopg2.extensions
TimestampFromTicksFunction in package psycopg2
typeClass in module __builtin__
tzModule in package psycopg2
tzinfoClass in module datetime
tznameMethod in class datetime.tzinfo
tznameMethod in class psycopg2.tz.FixedOffsetTimezone
tznameMethod in class psycopg2.tz.LocalTimezone
utcoffsetMethod in class datetime.tzinfo
utcoffsetMethod in class psycopg2.tz.FixedOffsetTimezone
utcoffsetMethod in class psycopg2.tz.LocalTimezone
valuesMethod in class psycopg2.extras.DictRow
WarningClass in package psycopg2
ZEROVariable in module psycopg2.tz
+
+ + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2-module.html b/trunk/psycopg2/doc/api/public/psycopg2-module.html new file mode 100644 index 0000000..052c338 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2-module.html @@ -0,0 +1,335 @@ + + + + + psycopg2 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Package psycopg2

+ +

A Python driver for PostgreSQL

+

psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being very +small and fast, and stable as a rock.

+

Homepage: http://initd.org/projects/psycopg2

+
+ + + + + + +
Submodules
    +
  • extensions: psycopg extensions to the DBAPI-2.0
  • +
  • extras: Miscellaneous goodies for psycopg2
  • +
  • pool: Connection pooling for psycopg2
  • +
  • psycopg1: psycopg 1.1.x compatibility module
  • +
  • tz: tzinfo implementations for psycopg2
  • +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Exceptions
+ DatabaseErrorError related to the database engine.
+ DataErrorError related to problems with the processed data.
+ ErrorBase class for error exceptions.
+ IntegrityErrorError related to database integrity.
+ InterfaceErrorError related to the database interface.
+ InternalErrorThe database encountered an internal error.
+ NotSupportedErrorA not supported datbase API was called.
+ OperationalErrorError related to database operation (disconnect, memory allocation etc).
+ ProgrammingErrorError related to database programming (SQL error, table not found etc).
+ WarningA database warning.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
    Connections creation
extensions.connectionconnect(dsn, + ...) +
+Create a new database connection.
    Value objects constructors
new binary objectBinary(buffer) +
+Build an object capable to hold a bynary string value.
new dateDate(year, + month, + day) +
+Build an object holding a date value.
new dateDateFromTicks(ticks) +
+Build an object holding a date value from the given ticks value.
new timeTime(hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a time value.
new timeTimeFromTicks(ticks) +
+Build an object holding a time value from the given ticks value.
new timestampTimestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo) +
+Build an object holding a timestamp value.
new timestampTimestampFromTicks(ticks) +
+Build an object holding a timestamp value from the given ticks value.

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+

Create a new database connection.

+

This function supports two different but equivalent sets of arguments. +A single data source name or dsn string can be used to specify the +connection parameters, as follows:

+
+psycopg2.connect("dbname=xxx user=xxx ...")
+
+

If dsn is not provided it is possible to pass the parameters as +keyword arguments; e.g.:

+
+psycopg2.connect(database='xxx', user='xxx', ...)
+
+

The full list of available parameters is:

+
    +
  • dbname -- database name (only in 'dsn')
  • +
  • database -- database name (only as keyword argument)
  • +
  • host -- host address (defaults to UNIX socket if not provided)
  • +
  • port -- port number (defaults to 5432 if not provided)
  • +
  • user -- user name used to authenticate
  • +
  • password -- password used to authenticate
  • +
  • sslmode -- SSL mode (see PostgreSQL documentation)
  • +
+

If the connection_factory keyword argument is not provided this +function always return an instance of the connection class. +Else the given sub-class of extensions.connection will be used to +instantiate the connection object.

+
+
Returns:
+
+New database connection
           + (type=extensions.connection) +
+
+
+
+ + +
+

Binary(buffer) +

+

Build an object capable to hold a bynary string value.

+
+
Returns:
+
+new binary object
+
+
+
+ + +
+

Date(year, + month, + day) +

+

Build an object holding a date value.

+
+
Returns:
+
+new date
+
+
+
+ + +
+

DateFromTicks(ticks) +

+

Build an object holding a date value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new date
+
+
+
+ + +
+

Time(hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a time value.

+
+
Returns:
+
+new time
+
+
+
+ + +
+

TimeFromTicks(ticks) +

+

Build an object holding a time value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new time
+
+
+
+ + +
+

Timestamp(year, + month, + day, + hour, + minutes, + seconds, + tzinfo=None) +

+

Build an object holding a timestamp value.

+
+
Returns:
+
+new timestamp
+
+
+
+ + +
+

TimestampFromTicks(ticks) +

+

Build an object holding a timestamp value from the given ticks value.

+

Ticks are the number of seconds since the epoch; see the documentation of the standard Python time module for details).

+
+
Returns:
+
+new timestamp
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.DataError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.DataError-class.html new file mode 100644 index 0000000..48749b9 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.DataError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.DataError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DataError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DataError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       DataError
+

+ +
+ +

Error related to problems with the processed data.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.DatabaseError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.DatabaseError-class.html new file mode 100644 index 0000000..154af85 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.DatabaseError-class.html @@ -0,0 +1,110 @@ + + + + + psycopg2.DatabaseError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class DatabaseError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class DatabaseError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   DatabaseError
+

+ +
Known Subclasses:
+
+ DataError, + IntegrityError, + InternalError, + NotSupportedError, + OperationalError, + ProgrammingError
+ +
+ +

Error related to the database engine.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.Error-class.html b/trunk/psycopg2/doc/api/public/psycopg2.Error-class.html new file mode 100644 index 0000000..ed0b9fa --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.Error-class.html @@ -0,0 +1,105 @@ + + + + + psycopg2.Error + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Error +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Error

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Error
+

+ +
Known Subclasses:
+
+ DatabaseError, + InterfaceError, + PoolError
+ +
+ +

Base class for error exceptions.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.IntegrityError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.IntegrityError-class.html new file mode 100644 index 0000000..f2e2752 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.IntegrityError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.IntegrityError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class IntegrityError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class IntegrityError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       IntegrityError
+

+ +
+ +

Error related to database integrity.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.InterfaceError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.InterfaceError-class.html new file mode 100644 index 0000000..40667fa --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.InterfaceError-class.html @@ -0,0 +1,101 @@ + + + + + psycopg2.InterfaceError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InterfaceError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InterfaceError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   InterfaceError
+

+ +
+ +

Error related to the database interface.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.InternalError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.InternalError-class.html new file mode 100644 index 0000000..13290d4 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.InternalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.InternalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class InternalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class InternalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       InternalError
+

+ +
+ +

The database encountered an internal error.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.NotSupportedError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.NotSupportedError-class.html new file mode 100644 index 0000000..842c79f --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.NotSupportedError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.NotSupportedError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class NotSupportedError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class NotSupportedError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       NotSupportedError
+

+ +
+ +

A not supported datbase API was called.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.OperationalError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.OperationalError-class.html new file mode 100644 index 0000000..e52e8b1 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.OperationalError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.OperationalError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class OperationalError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class OperationalError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       OperationalError
+

+ +
+ +

Error related to database operation (disconnect, memory allocation etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.ProgrammingError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.ProgrammingError-class.html new file mode 100644 index 0000000..ea995a5 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.ProgrammingError-class.html @@ -0,0 +1,103 @@ + + + + + psycopg2.ProgrammingError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class ProgrammingError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class ProgrammingError

+ +
+Exception --+            
+            |            
+StandardError --+        
+                |        
+            Error --+    
+                    |    
+        DatabaseError --+
+                        |
+                       ProgrammingError
+

+ +
+ +

Error related to database programming (SQL error, table not found etc).

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.Warning-class.html b/trunk/psycopg2/doc/api/public/psycopg2.Warning-class.html new file mode 100644 index 0000000..86631fe --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.Warning-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.Warning + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Class Warning +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class Warning

+ +
+Exception --+    
+            |    
+StandardError --+
+                |
+               Warning
+

+ +
+ +

A database warning.

+
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2._psycopg-module.html b/trunk/psycopg2/doc/api/public/psycopg2._psycopg-module.html new file mode 100644 index 0000000..034827e --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2._psycopg-module.html @@ -0,0 +1,1001 @@ + + + + + psycopg2._psycopg + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module _psycopg +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2._psycopg

+ +

psycopg PostgreSQL driver

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Summary
str__version__ = '2.0b7 (dt ext pq3)' +
dictadapters = {(<type 'bool'>, <type 'psycopg2._psycopg.ISQ... +
strapilevel = '2.0' +
typeBINARY = <psycopg2._psycopg.type object at 0x009558C0> +
dictbinary_types = {} +
typeBINARYARRAY = <psycopg2._psycopg.type object at 0x00955B... +
typeBOOLEAN = <psycopg2._psycopg.type object at 0x00955760> +
typeBOOLEANARRAY = <psycopg2._psycopg.type object at 0x00955... +
typeDATE = <psycopg2._psycopg.type object at 0x009558A0> +
typeDATEARRAY = <psycopg2._psycopg.type object at 0x00955AA0... +
typeDATETIME = <psycopg2._psycopg.type object at 0x009557C0> +
typeDATETIMEARRAY = <psycopg2._psycopg.type object at 0x0095... +
typeDECIMAL = <psycopg2._psycopg.type object at 0x00955680> +
typeDECIMALARRAY = <psycopg2._psycopg.type object at 0x00955... +
dictencodings = {'UTF8': 'utf_8', 'LATIN-1': 'latin_1', 'SQL... +
typeFLOAT = <psycopg2._psycopg.type object at 0x00955660> +
typeFLOATARRAY = <psycopg2._psycopg.type object at 0x009559E... +
typeINTEGER = <psycopg2._psycopg.type object at 0x00955620> +
typeINTEGERARRAY = <psycopg2._psycopg.type object at 0x00955... +
typeINTERVAL = <psycopg2._psycopg.type object at 0x00955860> +
typeINTERVALARRAY = <psycopg2._psycopg.type object at 0x0095... +
typeLONGINTEGER = <psycopg2._psycopg.type object at 0x009555... +
typeLONGINTEGERARRAY = <psycopg2._psycopg.type object at 0x0... +
typeNUMBER = <psycopg2._psycopg.type object at 0x00955540> +
strparamstyle = 'pyformat' +
typePYDATE = <psycopg2._psycopg.type object at 0x00955D00> +
typePYDATETIME = <psycopg2._psycopg.type object at 0x00955C0... +
typePYINTERVAL = <psycopg2._psycopg.type object at 0x00955CE... +
typePYTIME = <psycopg2._psycopg.type object at 0x00955C40> +
typeROWID = <psycopg2._psycopg.type object at 0x009559A0> +
typeROWIDARRAY = <psycopg2._psycopg.type object at 0x00955BE... +
typeSTRING = <psycopg2._psycopg.type object at 0x00955720> +
dictstring_types = {1028: <psycopg2._psycopg.type object at ... +
typeSTRINGARRAY = <psycopg2._psycopg.type object at 0x00955A... +
intthreadsafety = 2                                                                     
typeTIME = <psycopg2._psycopg.type object at 0x00955840> +
typeTIMEARRAY = <psycopg2._psycopg.type object at 0x00955B00... +
typeUNICODE = <psycopg2._psycopg.type object at 0x009556C0> +
typeUNICODEARRAY = <psycopg2._psycopg.type object at 0x00955... +

+ + + + + + +
Variable Details
+
+ +

__version__

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0b7 (dt ext pq3)'                                                   
+
+
+
+
+
+ +

adapters

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{(<type 'datetime.timedelta'>, <type 'psycopg2._psycopg.ISQLQuote'>): \
+<built-in function IntervalFromPy>,
+ (<type 'datetime.date'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function DateFromPy>,
+ (<type 'datetime.time'>, <type 'psycopg2._psycopg.ISQLQuote'>): <buil\
+t-in function TimeFromPy>,
+ (<type 'datetime.datetime'>, <type 'psycopg2._psycopg.ISQLQuote'>): <\
+built-in function TimestampFromPy>,
+...                                                                    
+
+
+
+
+
+ +

apilevel

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'2.0'                                                                  
+
+
+
+
+
+ +

BINARY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009558C0>                          
+
+
+
+
+
+ +

binary_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{}                                                                     
+
+
+
+
+
+ +

BINARYARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955B60>                          
+
+
+
+
+
+ +

BOOLEAN

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955760>                          
+
+
+
+
+
+ +

BOOLEANARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A20>                          
+
+
+
+
+
+ +

DATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009558A0>                          
+
+
+
+
+
+ +

DATEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955AA0>                          
+
+
+
+
+
+ +

DATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009557C0>                          
+
+
+
+
+
+ +

DATETIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955AC0>                          
+
+
+
+
+
+ +

DECIMAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955680>                          
+
+
+
+
+
+ +

DECIMALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955260>                          
+
+
+
+
+
+ +

encodings

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{'LATIN-1': 'latin_1',
+ 'LATIN1': 'latin_1',
+ 'SQL_ASCII': 'ascii',
+ 'UNICODE': 'utf_8',
+ 'UTF8': 'utf_8'}                                                      
+
+
+
+
+
+ +

FLOAT

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955660>                          
+
+
+
+
+
+ +

FLOATARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009559E0>                          
+
+
+
+
+
+ +

INTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955620>                          
+
+
+
+
+
+ +

INTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A00>                          
+
+
+
+
+
+ +

INTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955860>                          
+
+
+
+
+
+ +

INTERVALARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955BA0>                          
+
+
+
+
+
+ +

LONGINTEGER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009555C0>                          
+
+
+
+
+
+ +

LONGINTEGERARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955960>                          
+
+
+
+
+
+ +

NUMBER

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955540>                          
+
+
+
+
+
+ +

paramstyle

+
+
+
+
+
Type:
+
+ str + +
+
Value:
+
+
+'pyformat'                                                             
+
+
+
+
+
+ +

PYDATE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955D00>                          
+
+
+
+
+
+ +

PYDATETIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955C00>                          
+
+
+
+
+
+ +

PYINTERVAL

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955CE0>                          
+
+
+
+
+
+ +

PYTIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955C40>                          
+
+
+
+
+
+ +

ROWID

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009559A0>                          
+
+
+
+
+
+ +

ROWIDARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955BE0>                          
+
+
+
+
+
+ +

STRING

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955720>                          
+
+
+
+
+
+ +

string_types

+
+
+
+
+
Type:
+
+ dict + +
+
Value:
+
+
+{16: <psycopg2._psycopg.type object at 0x00955760>,
+ 17: <psycopg2._psycopg.type object at 0x009558C0>,
+ 18: <psycopg2._psycopg.type object at 0x00955720>,
+ 19: <psycopg2._psycopg.type object at 0x00955720>,
+ 20: <psycopg2._psycopg.type object at 0x009555C0>,
+ 21: <psycopg2._psycopg.type object at 0x00955620>,
+ 23: <psycopg2._psycopg.type object at 0x00955620>,
+ 25: <psycopg2._psycopg.type object at 0x00955720>,
+...                                                                    
+
+
+
+
+
+ +

STRINGARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A80>                          
+
+
+
+
+
+ +

threadsafety

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

TIME

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955840>                          
+
+
+
+
+
+ +

TIMEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955B00>                          
+
+
+
+
+
+ +

UNICODE

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x009556C0>                          
+
+
+
+
+
+ +

UNICODEARRAY

+
+
+
+
+
Type:
+
+ type + +
+
Value:
+
+
+<psycopg2._psycopg.type object at 0x00955A40>                          
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.extensions-module.html b/trunk/psycopg2/doc/api/public/psycopg2.extensions-module.html new file mode 100644 index 0000000..4e97448 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.extensions-module.html @@ -0,0 +1,418 @@ + + + + + psycopg2.extensions + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extensions +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extensions

+ +

psycopg extensions to the DBAPI-2.0

+

This module holds all the extensions to the DBAPI-2.0 provided by psycopg.

+
    +
  • connection -- the new-type inheritable connection class
  • +
  • cursor -- the new-type inheritable cursor class
  • +
  • adapt() -- exposes the PEP-246 compatible adapting mechanism used +by psycopg to adapt Python types to PostgreSQL ones
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function Summary
objectadapt(obj, + protocol, + alternate) +
+adapt obj to given protocol
new AsIs wrapper objectAsIs(obj) +
new boolean valueBoolean(obj) +
new wrapperDateFromPy(datetime.date) +
new wrapperIntervalFromPy(datetime.timedelta) +
new type objectnew_type(oids, + name, + adapter) +
+Create a new binding object.
new quoted stringQuotedString(str, + enc) +
 register_adapter(typ, + callable) +
+Register 'callable' as an ISQLQuote adapter for type 'typ'.
Noneregister_type(obj) +
+register obj with psycopg type system
new wrapperTimeFromPy(datetime.time) +
new wrapperTimestampFromPy(datetime.datetime) +

+ + + + + + + + + + + + + + + + +
Variable Summary
intISOLATION_LEVEL_AUTOCOMMIT = 0                                                                     
intISOLATION_LEVEL_READ_COMMITTED = 1                                                                     
intISOLATION_LEVEL_READ_UNCOMMITTED = 1                                                                     
intISOLATION_LEVEL_REPEATABLE_READ = 2                                                                     
intISOLATION_LEVEL_SERIALIZABLE = 2                                                                     

+ + + + + + +
Function Details
+ + +
+

adapt(obj, + protocol, + alternate) +

+

adapt obj to given protocol

+
+
Returns:
+
+object
+
+
+
+ + +
+

AsIs(obj) +

+
+
Returns:
+
+new AsIs wrapper object
+
+
+
+ + +
+

Boolean(obj) +

+
+
Returns:
+
+new boolean value
+
+
+
+ + +
+

DateFromPy(datetime.date) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

IntervalFromPy(datetime.timedelta) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

new_type(oids, + name, + adapter) +

+

Create a new binding object. The object can be used with the +register_type() function to bind PostgreSQL objects to python objects.

+
+
Parameters:
+
oids - + Tuple of oid of the PostgreSQL types to convert. +
+
name - + Name for the new type +
+
adapter - + Callable to perform type conversion. +It must have the signature fun(value, cur) where value is +the string representation returned by PostgreSQL (None if NULL) +and cur is the cursor from which data are read. +
+
+
Returns:
+
+new type object
+
+
+
+ + +
+

QuotedString(str, + enc) +

+
+
Returns:
+
+new quoted string
+
+
+
+ + +
+

register_adapter(typ, + callable) +

+

Register 'callable' as an ISQLQuote adapter for type 'typ'.

+
+
+
+ + +
+

register_type(obj) +

+

register obj with psycopg type system

+
+
Parameters:
+
obj - + A type adapter created by new_type() +
+
+
Returns:
+
+None
+
+
+
+ + +
+

TimeFromPy(datetime.time) +

+
+
Returns:
+
+new wrapper
+
+
+
+ + +
+

TimestampFromPy(datetime.datetime) +

+
+
Returns:
+
+new wrapper
+
+
+
+
+ + + + + + +
Variable Details
+
+ +

ISOLATION_LEVEL_AUTOCOMMIT

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+0                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_COMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_READ_UNCOMMITTED

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+1                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_REPEATABLE_READ

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ +

ISOLATION_LEVEL_SERIALIZABLE

+
+
+
+
+
Type:
+
+ int + +
+
Value:
+
+
+2                                                                     
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.extras-module.html b/trunk/psycopg2/doc/api/public/psycopg2.extras-module.html new file mode 100644 index 0000000..c99a0ce --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.extras-module.html @@ -0,0 +1,91 @@ + + + + + psycopg2.extras + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.extras

+ +

Miscellaneous goodies for psycopg2

+

This module is a generic place used to hold little helper functions +and classes untill a better place in the distribution is found.

+
+ + + + + + + + + + + + + +
Classes
+ DictConnectionA connection that uses DictCursor automatically.
+ DictCursorA cursor that keeps a list of column name -> index mappings.
+ DictRowA row object that allow by-colun-name access to data.
+ SQL_INAdapt any iterable to an SQL quotable object.

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.extras.DictConnection-class.html b/trunk/psycopg2/doc/api/public/psycopg2.extras.DictConnection-class.html new file mode 100644 index 0000000..988bd79 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.extras.DictConnection-class.html @@ -0,0 +1,137 @@ + + + + + psycopg2.extras.DictConnection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictConnection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictConnection

+ +
+object --+    
+         |    
+connection --+
+             |
+            DictConnection
+

+ +
+ +

A connection that uses DictCursor automatically.

+
+ + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 cursor(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

cursor(self) +

+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.extras.DictCursor-class.html b/trunk/psycopg2/doc/api/public/psycopg2.extras.DictCursor-class.html new file mode 100644 index 0000000..d546d3a --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.extras.DictCursor-class.html @@ -0,0 +1,205 @@ + + + + + psycopg2.extras.DictCursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictCursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictCursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            DictCursor
+

+ +
+ +

A cursor that keeps a list of column name -> index mappings.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 callproc(self, + procname, + vars) +
 execute(self, + query, + vars, + async) +
 fetchall(self) +
 fetchmany(self, + size) +
 fetchone(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

callproc(self, + procname, + vars=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.callproc
+
+
+
+ + +
+

execute(self, + query, + vars=None, + async=0) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.execute
+
+
+
+ + +
+

fetchall(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchall
+
+
+
+ + +
+

fetchmany(self, + size=None) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchmany
+
+
+
+ + +
+

fetchone(self) +

+
+
Overrides:
+
psycopg2._psycopg.cursor.fetchone
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.extras.DictRow-class.html b/trunk/psycopg2/doc/api/public/psycopg2.extras.DictRow-class.html new file mode 100644 index 0000000..e278ca3 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.extras.DictRow-class.html @@ -0,0 +1,376 @@ + + + + + psycopg2.extras.DictRow + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class DictRow +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type DictRow

+ +
+object --+    
+         |    
+      list --+
+             |
+            DictRow
+

+ +
+ +

A row object that allow by-colun-name access to data.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + cursor) +
 __getitem__(self, + x) +
 get(self, + x, + default) +
 has_key(self, + x) +
 items(self) +
 keys(self) +
 values(self) +
    Inherited from list
 __add__(x, + y) +
+Return x+y...
 __contains__(x, + y) +
+Return y in x...
 __delitem__(x, + y) +
+Return del x[y]...
 __delslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __eq__(x, + y) +
+Return x==y...
 __ge__(x, + y) +
+Return x>=y...
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __getslice__(x, + i, + j) +
+Use of negative indices is not supported.
 __gt__(x, + y) +
+Return x>y...
 __hash__(x) +
+Return hash(x)...
 __iadd__(x, + y) +
+Return x+=y...
 __imul__(x, + y) +
+Return x*=y...
 __iter__(x) +
+Return iter(x)...
 __le__(x, + y) +
+Return x<=y...
 __len__(x) +
+Return len(x)...
 __lt__(x, + y) +
+Return x<y...
 __mul__(x, + n) +
+Return x*n...
 __ne__(x, + y) +
+Return x!=y...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __repr__(x) +
+Return repr(x)...
 __rmul__(x, + n) +
+Return n*x...
 __setitem__(x, + i, + y) +
+Return x[i]=y...
 __setslice__(x, + i, + j, + y) +
+Use of negative indices is not supported.
 append(L, + object) +
+append object to end
 count(L, + value) +
+return number of occurrences of value
 extend(L, + iterable) +
+extend list by appending elements from the iterable
 index(...) +
+L.index(value, [start, [stop]]) -> integer -- return first index of value
 insert(L, + index, + object) +
+insert object before index
 pop(L, + index) +
+remove and return item at index (default last)
 remove(L, + value) +
+remove first occurrence of value
 reverse(L) +
+reverse IN PLACE
 sort(L, + cmpfunc) +
+stable sort IN PLACE; cmpfunc(x, y) -> -1, 0, 1
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + cursor) +
(Constructor) +

+
+
Overrides:
+
__builtin__.list.__init__
+
+
+
+ + +
+

__getitem__(self, + x) +
(Indexing operator) +

+
+
Overrides:
+
__builtin__.list.__getitem__
+
+
+
+ + +
+

get(self, + x, + default=None) +

+
+
+
+ + +
+

has_key(self, + x) +

+
+
+
+ + +
+

items(self) +

+
+
+
+ + +
+

keys(self) +

+
+
+
+ + +
+

values(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.extras.SQL_IN-class.html b/trunk/psycopg2/doc/api/public/psycopg2.extras.SQL_IN-class.html new file mode 100644 index 0000000..0b05cd2 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.extras.SQL_IN-class.html @@ -0,0 +1,171 @@ + + + + + psycopg2.extras.SQL_IN + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module extras :: + Class SQL_IN +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SQL_IN

+ +
+object --+
+         |
+        SQL_IN
+

+ +
+ +

Adapt any iterable to an SQL quotable object.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + seq) +
 __str__(self) +
 getquoted(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

__init__(self, + seq) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

__str__(self) +
(Informal representation operator) +

+
+
+
+ + +
+

getquoted(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.pool-module.html b/trunk/psycopg2/doc/api/public/psycopg2.pool-module.html new file mode 100644 index 0000000..34fbebd --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.pool-module.html @@ -0,0 +1,126 @@ + + + + + psycopg2.pool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.pool

+ +

Connection pooling for psycopg2

+

This module implements thread-safe (and not) connection pools.

+
+ + + + + + + + + + + + + +
Classes
+ AbstractConnectionPoolGeneric key-based pooling code.
+ PersistentConnectionPoolA pool that assigns persistent connections to different threads.
+ SimpleConnectionPoolA connection pool that can't be shared across different threads.
+ ThreadedConnectionPoolA connection pool that works with the threading module.

+ + + + + + + + +
Exceptions
+ PoolError 

+ + + + + + + + +
Function Summary
 dbg(*args) +

+ + + + + + +
Function Details
+ + +
+

dbg(*args) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html b/trunk/psycopg2/doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html new file mode 100644 index 0000000..41d63b9 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.pool.AbstractConnectionPool-class.html @@ -0,0 +1,169 @@ + + + + + psycopg2.pool.AbstractConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class AbstractConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type AbstractConnectionPool

+ +
+object --+
+         |
+        AbstractConnectionPool
+

+ +
Known Subclasses:
+
+ PersistentConnectionPool, + SimpleConnectionPool, + ThreadedConnectionPool
+ +
+ +

Generic key-based pooling code.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the connection pool.

+

New 'minconn' connections are created immediately calling 'connfunc' +with given parameters. The connection pool will support a maximum of +about 'maxconn' connections.

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html b/trunk/psycopg2/doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html new file mode 100644 index 0000000..954b8b5 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.pool.PersistentConnectionPool-class.html @@ -0,0 +1,210 @@ + + + + + psycopg2.pool.PersistentConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PersistentConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type PersistentConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        PersistentConnectionPool
+

+ +
+ +

A pool that assigns persistent connections to different threads.

+

Note that this connection pool generates by itself the required keys +using the current thread id. This means that untill a thread put away +a connection it will always get the same connection object by successive +.getconn() calls. This also means that a thread can't use more than one +single connection from the pool.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self) +
+Generate thread id and return a connection.
 putconn(self, + conn, + close) +
+Put away an unused connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self) +

+

Generate thread id and return a connection.

+
+
+
+ + +
+

putconn(self, + conn=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.pool.PoolError-class.html b/trunk/psycopg2/doc/api/public/psycopg2.pool.PoolError-class.html new file mode 100644 index 0000000..89cd4f7 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.pool.PoolError-class.html @@ -0,0 +1,99 @@ + + + + + psycopg2.pool.PoolError + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class PoolError +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Class PoolError

+ +
+Exception --+        
+            |        
+StandardError --+    
+                |    
+            Error --+
+                    |
+                   PoolError
+

+ +
+ + + + + + + + + + + + + + +
Method Summary
    Inherited from Exception
 __init__(...) +
 __getitem__(...) +
 __str__(...) +

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html b/trunk/psycopg2/doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html new file mode 100644 index 0000000..ea8f605 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.pool.SimpleConnectionPool-class.html @@ -0,0 +1,139 @@ + + + + + psycopg2.pool.SimpleConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class SimpleConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type SimpleConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        SimpleConnectionPool
+

+ +
+ +

A connection pool that can't be shared across different threads.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
    Inherited from AbstractConnectionPool
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the connection pool.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html b/trunk/psycopg2/doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html new file mode 100644 index 0000000..64c95a9 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.pool.ThreadedConnectionPool-class.html @@ -0,0 +1,209 @@ + + + + + psycopg2.pool.ThreadedConnectionPool + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module pool :: + Class ThreadedConnectionPool +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type ThreadedConnectionPool

+ +
+            object --+    
+                     |    
+AbstractConnectionPool --+
+                         |
+                        ThreadedConnectionPool
+

+ +
+ +

A connection pool that works with the threading module.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + minconn, + maxconn, + *args, + **kwargs) +
+Initialize the threading lock.
 closeall(self) +
+Close all connections (even the one currently in use.)
 getconn(self, + key) +
+Get a free connection and assign it to 'key' if not None.
 putconn(self, + conn, + key, + close) +
+Put away an unused connection.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + minconn, + maxconn, + *args, + **kwargs) +
(Constructor) +

+

Initialize the threading lock.

+
+
Overrides:
+
psycopg2.pool.AbstractConnectionPool.__init__
+
+
+
+ + +
+

closeall(self) +

+

Close all connections (even the one currently in use.)

+
+
+
+ + +
+

getconn(self, + key=None) +

+

Get a free connection and assign it to 'key' if not None.

+
+
+
+ + +
+

putconn(self, + conn=None, + key=None, + close=False) +

+

Put away an unused connection.

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.psycopg1-module.html b/trunk/psycopg2/doc/api/public/psycopg2.psycopg1-module.html new file mode 100644 index 0000000..18a9a75 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.psycopg1-module.html @@ -0,0 +1,121 @@ + + + + + psycopg2.psycopg1 + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.psycopg1

+ +

psycopg 1.1.x compatibility module

+

This module uses the new style connection and cursor types to build a psycopg +1.1.1.x compatibility layer. It should be considered a temporary hack to run +old code while porting to psycopg 2. Import it as follows:

+
+from psycopg2 import psycopg1 as psycopg
+
+
+ + + + + + + + + +
Classes
+ connectionpsycopg 1.1.x connection.
+ cursorpsycopg 1.1.x cursor.

+ + + + + + + + +
Function Summary
new psycopg 1.1.x compatible connection objectconnect(dsn, + ...) +

+ + + + + + +
Function Details
+ + +
+

connect(dsn, + ...) +

+
+
Returns:
+
+new psycopg 1.1.x compatible connection object
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.psycopg1.connection-class.html b/trunk/psycopg2/doc/api/public/psycopg2.psycopg1.connection-class.html new file mode 100644 index 0000000..9b5b429 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.psycopg1.connection-class.html @@ -0,0 +1,156 @@ + + + + + psycopg2.psycopg1.connection + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class connection +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type connection

+ +
+object --+    
+         |    
+connection --+
+             |
+            connection
+

+ +
+ +

psycopg 1.1.x connection.

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
switch autocommit on (1) or off (0)autocommit(on_off) +
new psycopg 1.1.x compatible cursor objectcursor() +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

autocommit(on_off=1) +

+
+
Returns:
+
+switch autocommit on (1) or off (0)
+
+
+
+ + +
+

cursor() +

+
+
Returns:
+
+new psycopg 1.1.x compatible cursor object
+
+
Overrides:
+
psycopg2._psycopg.connection.cursor
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.psycopg1.cursor-class.html b/trunk/psycopg2/doc/api/public/psycopg2.psycopg1.cursor-class.html new file mode 100644 index 0000000..f80677d --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.psycopg1.cursor-class.html @@ -0,0 +1,161 @@ + + + + + psycopg2.psycopg1.cursor + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module psycopg1 :: + Class cursor +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type cursor

+ +
+object --+    
+         |    
+    cursor --+
+             |
+            cursor
+

+ +
+ +

psycopg 1.1.x cursor.

+

Note that this cursor implements the exact procedure used by psycopg 1 to +build dictionaries out of result rows. The DictCursor in the +psycopg.extras modules implements a much better and faster algorithm.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dictfetchall(self) +
 dictfetchmany(self, + size) +
 dictfetchone(self) +
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __hash__(x) +
+Return hash(x)...
 __reduce__(...) +
+helper for pickle
 __reduce_ex__(...) +
+helper for pickle
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value

+ + + + + + +
Method Details
+ + +
+

dictfetchall(self) +

+
+
+
+ + +
+

dictfetchmany(self, + size) +

+
+
+
+ + +
+

dictfetchone(self) +

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.tz-module.html b/trunk/psycopg2/doc/api/public/psycopg2.tz-module.html new file mode 100644 index 0000000..192ac5e --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.tz-module.html @@ -0,0 +1,193 @@ + + + + + psycopg2.tz + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Module psycopg2.tz

+ +

tzinfo implementations for psycopg2

+

This module holds two different tzinfo implementations that can be used as +the 'tzinfo' argument to datetime constructors, directly passed to psycopg +functions or used to set the .tzinfo_factory attribute in cursors.

+
+ + + + + + + + + +
Classes
+ FixedOffsetTimezoneFixed offset in minutes east from UTC.
+ LocalTimezonePlatform idea of local timezone.

+ + + + + + + + + + + + + + +
Variable Summary
timedeltaDSTDIFF = datetime.timedelta(0, 3600) +
LocalTimezoneLOCAL = <psycopg2.tz.LocalTimezone object at 0x00847090> +
timedeltaSTDOFFSET = datetime.timedelta(0, 3600) +
timedeltaZERO = datetime.timedelta(0) +

+ + + + + + +
Variable Details
+
+ +

DSTDIFF

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

LOCAL

+
+
+
+
+
Type:
+
+ LocalTimezone + +
+
Value:
+
+
+<psycopg2.tz.LocalTimezone object at 0x00847090>                       
+
+
+
+
+
+ +

STDOFFSET

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0, 3600)                                            
+
+
+
+
+
+ +

ZERO

+
+
+
+
+
Type:
+
+ timedelta + +
+
Value:
+
+
+datetime.timedelta(0)                                                  
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html b/trunk/psycopg2/doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html new file mode 100644 index 0000000..71145dd --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.tz.FixedOffsetTimezone-class.html @@ -0,0 +1,213 @@ + + + + + psycopg2.tz.FixedOffsetTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class FixedOffsetTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type FixedOffsetTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            FixedOffsetTimezone
+

+ +
+ +

Fixed offset in minutes east from UTC.

+

This is exactly the implementation found in Python 2.3.x documentation, +with a small change to the __init__ method to allow for pickling and a +default name in the form 'sHH:MM' ('s' is the sign.)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 __init__(self, + offset, + name) +
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

__init__(self, + offset=None, + name=None) +
(Constructor) +

+
+
Overrides:
+
__builtin__.object.__init__
+
+
+
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/psycopg2.tz.LocalTimezone-class.html b/trunk/psycopg2/doc/api/public/psycopg2.tz.LocalTimezone-class.html new file mode 100644 index 0000000..7f95294 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/psycopg2.tz.LocalTimezone-class.html @@ -0,0 +1,196 @@ + + + + + psycopg2.tz.LocalTimezone + + + + + + + + + + + + + + + + + + + +
+ + Package psycopg2 :: + Module tz :: + Class LocalTimezone +
+
+ + +
[show private | hide private]
[frames | no frames]
+ + +

Type LocalTimezone

+ +
+object --+    
+         |    
+    tzinfo --+
+             |
+            LocalTimezone
+

+ +
+ +

Platform idea of local timezone.

+

This is the exact implementation from the Pyhton 2.3 documentation.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
 dst(self, + dt) +
 tzname(self, + dt) +
 utcoffset(self, + dt) +
    Inherited from tzinfo
 __getattribute__(...) +
+x.__getattribute__('name') <==> x.name
 __new__(T, + S, + ...) +
+Return a new object with type S, a subtype of T...
 __reduce__(...) +
+-> (cls, state)
 fromutc(...) +
+datetime in UTC -> datetime in local time.
    Inherited from object
 __init__(...) +
+x.__init__(...) initializes x; see x.__class__.__doc__ for signature
 __delattr__(...) +
+x.__delattr__('name') <==> del x.name
 __hash__(x) +
+Return hash(x)...
 __reduce_ex__(...) +
+helper for pickle
 __repr__(x) +
+Return repr(x)...
 __setattr__(...) +
+x.__setattr__('name', value) <==> x.name = value
 __str__(x) +
+Return str(x)...

+ + + + + + +
Method Details
+ + +
+

dst(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.dst
+
+
+
+ + +
+

tzname(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.tzname
+
+
+
+ + +
+

utcoffset(self, + dt) +

+
+
Overrides:
+
datetime.tzinfo.utcoffset
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/api/public/toc-everything.html b/trunk/psycopg2/doc/api/public/toc-everything.html new file mode 100644 index 0000000..a13c502 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-everything.html @@ -0,0 +1,90 @@ + + + + + Everything + + + + +

Everything

+
+ + +

All Classes

+

psycopg2.extras.DictConnection

+

psycopg2.extras.DictCursor

+

psycopg2.extras.DictRow

+

psycopg2.extras.SQL_IN

+

psycopg2.pool.AbstractConnectionPool

+

psycopg2.pool.PersistentConnectionPool

+

psycopg2.pool.SimpleConnectionPool

+

psycopg2.pool.ThreadedConnectionPool

+

psycopg2.psycopg1.connection

+

psycopg2.psycopg1.cursor

+

psycopg2.tz.FixedOffsetTimezone

+

psycopg2.tz.LocalTimezone

+ + +

All Exceptions

+

psycopg2.DatabaseError

+

psycopg2.DataError

+

psycopg2.Error

+

psycopg2.IntegrityError

+

psycopg2.InterfaceError

+

psycopg2.InternalError

+

psycopg2.NotSupportedError

+

psycopg2.OperationalError

+

psycopg2.pool.PoolError

+

psycopg2.ProgrammingError

+

psycopg2.Warning

+ + +

All Functions

+

adapt

+

AsIs

+

Binary

+

Boolean

+

connect

+

connect

+

Date

+

DateFromPy

+

DateFromTicks

+

dbg

+

IntervalFromPy

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

Time

+

TimeFromPy

+

TimeFromTicks

+

Timestamp

+

TimestampFromPy

+

TimestampFromTicks

+ + +

All Variables

+

DSTDIFF

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+

LOCAL

+

STDOFFSET

+

ZERO

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc-psycopg2-module.html b/trunk/psycopg2/doc/api/public/toc-psycopg2-module.html new file mode 100644 index 0000000..fa15e9b --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-psycopg2-module.html @@ -0,0 +1,57 @@ + + + + + psycopg2 + + + + +

psycopg2

+
+ + +

Modules

+

extensions

+

extras

+

pool

+

psycopg1

+

tz

+ + +

Exceptions

+

DatabaseError

+

DataError

+

Error

+

IntegrityError

+

InterfaceError

+

InternalError

+

NotSupportedError

+

OperationalError

+

ProgrammingError

+

Warning

+ + +

Functions

+

Binary

+

connect

+

Date

+

DateFromTicks

+

Time

+

TimeFromTicks

+

Timestamp

+

TimestampFromTicks

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc-psycopg2._psycopg-module.html b/trunk/psycopg2/doc/api/public/toc-psycopg2._psycopg-module.html new file mode 100644 index 0000000..6e8fa49 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-psycopg2._psycopg-module.html @@ -0,0 +1,73 @@ + + + + + psycopg2._psycopg + + + + +

_psycopg

+
+ + +

Classes

+ + +

Functions

+ + +

Variables

+

__version__

+

adapters

+

apilevel

+

BINARY

+

binary_types

+

BINARYARRAY

+

BOOLEAN

+

BOOLEANARRAY

+

DATE

+

DATEARRAY

+

DATETIME

+

DATETIMEARRAY

+

DECIMAL

+

DECIMALARRAY

+

encodings

+

FLOAT

+

FLOATARRAY

+

INTEGER

+

INTEGERARRAY

+

INTERVAL

+

INTERVALARRAY

+

LONGINTEGER

+

LONGINTEGERARRAY

+

NUMBER

+

paramstyle

+

PYDATE

+

PYDATETIME

+

PYINTERVAL

+

PYTIME

+

ROWID

+

ROWIDARRAY

+

STRING

+

string_types

+

STRINGARRAY

+

threadsafety

+

TIME

+

TIMEARRAY

+

UNICODE

+

UNICODEARRAY

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc-psycopg2.extensions-module.html b/trunk/psycopg2/doc/api/public/toc-psycopg2.extensions-module.html new file mode 100644 index 0000000..abf93eb --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-psycopg2.extensions-module.html @@ -0,0 +1,47 @@ + + + + + psycopg2.extensions + + + + +

extensions

+
+ + +

Functions

+

adapt

+

AsIs

+

Boolean

+

DateFromPy

+

IntervalFromPy

+

new_type

+

QuotedString

+

register_adapter

+

register_type

+

TimeFromPy

+

TimestampFromPy

+ + +

Variables

+

ISOLATION_LEVEL_AUTOCOMMIT

+

ISOLATION_LEVEL_READ_COMMITTED

+

ISOLATION_LEVEL_READ_UNCOMMITTED

+

ISOLATION_LEVEL_REPEATABLE_READ

+

ISOLATION_LEVEL_SERIALIZABLE

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc-psycopg2.extras-module.html b/trunk/psycopg2/doc/api/public/toc-psycopg2.extras-module.html new file mode 100644 index 0000000..f193b47 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-psycopg2.extras-module.html @@ -0,0 +1,32 @@ + + + + + psycopg2.extras + + + + +

extras

+
+ + +

Classes

+

DictConnection

+

DictCursor

+

DictRow

+

SQL_IN

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc-psycopg2.pool-module.html b/trunk/psycopg2/doc/api/public/toc-psycopg2.pool-module.html new file mode 100644 index 0000000..0736019 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-psycopg2.pool-module.html @@ -0,0 +1,40 @@ + + + + + psycopg2.pool + + + + +

pool

+
+ + +

Classes

+

AbstractConnectionPool

+

PersistentConnectionPool

+

SimpleConnectionPool

+

ThreadedConnectionPool

+ + +

Exceptions

+

PoolError

+ + +

Functions

+

dbg

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc-psycopg2.psycopg1-module.html b/trunk/psycopg2/doc/api/public/toc-psycopg2.psycopg1-module.html new file mode 100644 index 0000000..69b1f79 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-psycopg2.psycopg1-module.html @@ -0,0 +1,34 @@ + + + + + psycopg2.psycopg1 + + + + +

psycopg1

+
+ + +

Classes

+

connection

+

cursor

+ + +

Functions

+

connect

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc-psycopg2.tz-module.html b/trunk/psycopg2/doc/api/public/toc-psycopg2.tz-module.html new file mode 100644 index 0000000..6f617fe --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc-psycopg2.tz-module.html @@ -0,0 +1,37 @@ + + + + + psycopg2.tz + + + + +

tz

+
+ + +

Classes

+

FixedOffsetTimezone

+

LocalTimezone

+ + +

Variables

+

DSTDIFF

+

LOCAL

+

STDOFFSET

+

ZERO

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/toc.html b/trunk/psycopg2/doc/api/public/toc.html new file mode 100644 index 0000000..89021cc --- /dev/null +++ b/trunk/psycopg2/doc/api/public/toc.html @@ -0,0 +1,38 @@ + + + + + Table of Contents + + + + +

Table of Contents

+
+

Everything

+ + +

Packages

+

psycopg2

+ + +

Modules

+

psycopg2.extensions

+

psycopg2.extras

+

psycopg2.pool

+

psycopg2.psycopg1

+

psycopg2.tz

+ +
+[show private | hide private] + + diff --git a/trunk/psycopg2/doc/api/public/trees.html b/trunk/psycopg2/doc/api/public/trees.html new file mode 100644 index 0000000..44573d9 --- /dev/null +++ b/trunk/psycopg2/doc/api/public/trees.html @@ -0,0 +1,174 @@ + + + + + Module and Class Hierarchies + + + + + + + + + + + + + + + + + + + +
+ + + +
[show private | hide private]
[frames | no frames]
+ + +

Module Hierarchy

+
    +
  • psycopg2: A Python driver for PostgreSQL
      +
    • extensions: psycopg extensions to the DBAPI-2.0
    • +
    • extras: Miscellaneous goodies for psycopg2
    • +
    • pool: Connection pooling for psycopg2
    • +
    • psycopg1: psycopg 1.1.x compatibility module
    • +
    • tz: tzinfo implementations for psycopg2
    • +
    +
  • +
+ + +

Class Hierarchy

+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/trunk/psycopg2/doc/async.txt b/trunk/psycopg2/doc/async.txt new file mode 100644 index 0000000..518d5fe --- /dev/null +++ b/trunk/psycopg2/doc/async.txt @@ -0,0 +1,67 @@ +psycopg asynchronous API +************************ + +** Important: async quaeries are not enabled for 2.0 ** + +Program code can initiate an asynchronous query by passing an 'async=1' flag +to the .execute() method. A very simple example, from the connection to the +query: + + conn = psycopg.connect(database='test') + curs = conn.cursor() + curs.execute("SEECT * from test WHERE fielda > %s", (1971,), async=1) + +From then on any query on other cursors derived from the same connection is +doomed to fail (and raise an exception) until the original cursor (the one +executing the query) complete the asynchronous operation. This can happen in +a number of different ways: + + 1) one of the .fetchXXX() methods is called, effectively blocking untill + data has been sent from the backend to the client, terminating the + query. + + 2) .cancel() is called. This method tries to abort the current query and + will block until the query is aborted or fully executed. The return + value is True if the query was successfully aborted or False if it + was executed. Query result are discarded in both cases. + + 3) .execute() is called again on the same cursor (.execute() on a + different cursor will simply raise an exception.) This waits for the + complete execution of the current query, discard any data and execute + the new one. + +Note that calling .execute() two times in a row will not abort the former +query and will temporarily go to synchronous mode until the first of the two +queries is executed. + +Cursors now have some extra methods that make them usefull during +asynchronous queries: + + .fileno() + Returns the file descriptor associated with the current connection and + make possible to use a cursor in a context where a file object would be + expected (like in a select() call.) + + .isbusy() + Returns True if the backend is still processing the query or false if + data is ready to be fetched (by one of the .fetchXXX() methods.) + +A code snippet that shows how to use the cursor object in a select() call: + + import psycopg + import select + + conn = psycopg.connect(database='test') + curs = conn.cursor() + curs.execute("SEECT * from test WHERE fielda > %s", (1971,), async=1) + + # wait for input with a maximum timeout of 5 seconds + query_ended = False + while not query_ended: + rread, rwrite, rspec = select([cursor, another_file], [], [], 5) + if not cursor.isbusy(): + query_ended = True + # manage input from other sources like other_file, etc. + print "Query Results:" + for row in cursor: + print row diff --git a/trunk/psycopg2/doc/extensions.html b/trunk/psycopg2/doc/extensions.html new file mode 100644 index 0000000..cb71200 --- /dev/null +++ b/trunk/psycopg2/doc/extensions.html @@ -0,0 +1,219 @@ + + + + + + +psycopg 2 extensions to the DBAPI 2.0 + + + +
+

psycopg 2 extensions to the DBAPI 2.0

+

This document is a short summary of the extensions built in psycopg 2.0.x over +the standard Python Database API Specification 2.0, usually called simply +DBAPI-2.0 or even PEP-249. Before reading on this document please make sure +you already know how to program in Python using a DBAPI-2.0 compliant driver: +basic concepts like opening a connection, executing queries and commiting or +rolling back a transaction will not be explained but just used.

+

Many objects and extension functions are defined in the psycopg2.extensions +module.

+
+

Connection and cursor factories

+

psycopg 2 exposes two new-style classes that can be sub-classed and expanded to +adapt them to the needs of the programmer: cursor and connection. The +connection class is usually sub-classed only to provide a . cursor is much +more interesting, because it is the class where query building, execution and +result type-casting into Python variables happens.

+ + +
+
+

Setting transaction isolation levels

+

psycopg2 connection objects hold informations about the PostgreSQL transaction +isolation level. The current transaction level can be read from the +.isolation_level attribute. The default isolation level is READ +COMMITTED. A different isolation level con be set through the +.set_isolation_level() method. The level can be set to one of the following +constants, defined in psycopg2.extensions:

+
+
ISOLATION_LEVEL_AUTOCOMMIT
+
No transaction is started when command are issued and no +.commit()/.rollback() is required. Some PostgreSQL command such as +CREATE DATABASE can't run into a transaction: to run such command use +.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT).
+
`ISOLATION_LEVEL_READ_COMMITTED`
+
+

System Message: ERROR/3 (../doc/extensions.rst, line 54); backlink

+Can't find 'ISOLATION_LEVEL_READ_COMMITTED' in any provided module.
+

This is the default value. A new transaction is started at the first +.execute() command on a cursor and at each new .execute() after a +.commit() or a .rollback(). The transaction runs in the PostgreSQL +READ COMMITTED isolation level.

+
+
ISOLATION_LEVEL_SERIALIZABLE
+
Transactions are run at a SERIALIZABLE isolation level.
+
+
+
+

Adaptation of Python values to SQL types

+

psycopg2 casts Python variables to SQL literals by type. Standard Python types +are already adapted to the proper SQL literal.

+

Example: the Python function:

+
+curs.execute("""INSERT INTO atable (anint, adate, astring)
+                 VALUES (%s, %s, %s)""",
+             (10, datetime.date(2005, 11, 18), "O'Reilly"))
+
+

is converted into the SQL command:

+
+INSERT INTO atable (anint, adate, astring)
+ VALUES (10, '2005-11-18', 'O''Reilly');
+
+

Named arguments are supported too with %(name)s placeholders. Notice that:

+
+
    +
  • The Python string operator % is not used: the .execute() function +accepts the values tuple or dictionary as second parameter.
  • +
  • The variables placeholder must always be a %s, even if a different +placeholder (such as a %d for an integer) may look more appropriate.
  • +
  • For positional variables binding, the second argument must always be a +tuple, even if it contains a single variable.
  • +
  • Only variable values should be bound via this method: it shouldn't be used +to set table or field names. For these elements, ordinary string formatting +should be used before running .execute().
  • +
+
+
+

Adapting new types

+

Any Python class or type can be adapted to an SQL string. Adaptation mechanism +is similar to the Object Adaptation proposed in the PEP-246 and is exposed +by the adapt() function.

+

psycopg2 .execute() method adapts its vars arguments to the ISQLQuote +protocol. Objects that conform to this protocol expose a getquoted() method +returning the SQL representation of the object as a string.

+

The easiest way to adapt an object to an SQL string is to register an adapter +function via the register_adapter() function. The adapter function must take +the value to be adapted as argument and return a conform object. A convenient +object is the AsIs wrapper, whose getquoted() result is simply the +str()ingification of the wrapped object.

+

Example: mapping of a Point class into the point PostgreSQL geometric +type:

+
+from psycopg2.extensions import adapt, register_adapter, AsIs
+
+class Point(object):
+    def __init__(self, x=0.0, y=0.0):
+        self.x = x
+        self.y = y
+
+def adapt_point(point):
+    return AsIs("'(%s,%s)'" % (adapt(point.x), adapt(point.y)))
+    
+register_adapter(Point, adapt_point)
+
+curs.execute("INSERT INTO atable (apoint) VALUES (%s)", 
+             (Point(1.23, 4.56),))
+
+

The above function call results in the SQL command:

+
+INSERT INTO atable (apoint) VALUES ((1.23, 4.56));
+
+
+
+
+

Type casting of SQL types into Python values

+

PostgreSQL objects read from the database can be adapted to Python objects +through an user-defined adapting function. An adapter function takes two +argments: the object string representation as returned by PostgreSQL and the +cursor currently being read, and should return a new Python object. For +example, the following function parses a PostgreSQL point into the +previously defined Point class:

+
+def cast_point(value, curs):
+    if value is not None:
+            # Convert from (f1, f2) syntax using a regular expression.
+        m = re.match("\((.*),(.*)\)", value) 
+        if m:
+            return Point(float(m.group(1)), float(m.group(2)))
+
+

To create a mapping from the PostgreSQL type (either standard or user-defined), +its oid must be known. It can be retrieved either by the second column of +the cursor description:

+
+curs.execute("SELECT NULL::point")
+point_oid = curs.description[0][1]   # usually returns 600
+
+

or by querying the system catalogs for the type name and namespace (the +namespace for system objects is pg_catalog):

+
+curs.execute("""
+    SELECT pg_type.oid
+      FROM pg_type JOIN pg_namespace
+             ON typnamespace = pg_namespace.oid
+     WHERE typname = %(typename)s
+       AND nspname = %(namespace)s""",
+            {'typename': 'point', 'namespace': 'pg_catalog'})
+    
+point_oid = curs.fetchone()[0]
+
+

After you know the object oid, you must can and register the new type:

+
+POINT = psycopg2.extensions.new_type((point_oid,), "POINT", cast_point)
+psycopg2.extensions.register_type(POINT)
+
+

The new_type() function binds the object oids (more than one can be +specified) to the adapter function. register_type() completes the spell. +Conversion is automatically performed when a column whose type is a registered +oid is read:

+
+curs.execute("SELECT '(10.2,20.3)'::point")
+point = curs.fetchone()[0]
+print type(point), point.x, point.y
+# Prints: "<class '__main__.Point'> 10.2 20.3"
+
+
+ + +
+

Using COPY TO and COPY FROM

+

psycopg2 cursor object provides an interface to the efficient PostgreSQL +COPY command to move data from files to tables and back.

+

The .copy_to(file, table) method writes the content of the table +named table to the file-like object file. file must have a +write() method.

+

The .copy_from(file, table) reads data from the file-like object +file appending them to the table named table. file must have both +read() and readline() method.

+

Both methods accept two optional arguments: sep (defaulting to a tab) is +the columns separator and null (defaulting to \N) represents NULL +values in the file.

+
+
+

PostgreSQL status message and executed query

+

cursor objects have two special fields related to the last executed query:

+
+
    +
  • .query is the textual representation (str or unicode, depending on what +was passed to .execute() as first argument) of the query after argument +binding and mogrification has been applied. To put it another way, .query +is the exact query that was sent to the PostgreSQL backend.
  • +
  • .statusmessage is the status message that the backend sent upon query +execution. It usually contains the basic type of the query (SELECT, +INSERT, UPDATE, ...) and some additional information like the number of +rows updated and so on. Refer to the PostgreSQL manual for more +information.
  • +
+
+
+
+ + diff --git a/trunk/psycopg2/doc/extensions.rst b/trunk/psycopg2/doc/extensions.rst new file mode 100644 index 0000000..3bdc680 --- /dev/null +++ b/trunk/psycopg2/doc/extensions.rst @@ -0,0 +1,260 @@ +======================================= + psycopg 2 extensions to the DBAPI 2.0 +======================================= + +This document is a short summary of the extensions built in psycopg 2.0.x over +the standard `Python Database API Specification 2.0`__, usually called simply +DBAPI-2.0 or even PEP-249. Before reading on this document please make sure +you already know how to program in Python using a DBAPI-2.0 compliant driver: +basic concepts like opening a connection, executing queries and commiting or +rolling back a transaction will not be explained but just used. + +.. __: http://www.python.org/peps/pep-0249.html + +Many objects and extension functions are defined in the `psycopg2.extensions` +module. + + +Connection and cursor factories +=============================== + +psycopg 2 exposes two new-style classes that can be sub-classed and expanded to +adapt them to the needs of the programmer: `cursor` and `connection`. The +`connection` class is usually sub-classed only to provide an easy way to create +customized cursors but other uses are possible. `cursor` is much more +interesting, because it is the class where query building, execution and result +type-casting into Python variables happens. + +An example of cursor subclass performing logging is:: + + import psycopg2 + import psycopg2.extensions + import logging + + class LoggingCursor(psycopg2.extensions.cursor): + def execute(self, sql, args=None): + logger = logging.getLogger('sql_debug') + logger.info(self.mogrify(sql, args)) + + try: + psycopg2.extensions.cursor.execute(self, sql, args) + except Exception, exc: + logger.error("%s: %s" % (exc.__class__.__name__, exc)) + raise + + conn = psycopg2.connect(DSN) + curs = conn.cursor(cursor_factory=LoggingCursor) + curs.execute("INSERT INTO mytable VALUES (%s, %s, %s);", + (10, 20, 30)) + + +Row factories +------------- + +tzinfo factories +---------------- + + +Setting transaction isolation levels +==================================== + +psycopg2 connection objects hold informations about the PostgreSQL `transaction +isolation level`_. The current transaction level can be read from the +`.isolation_level` attribute. The default isolation level is ``READ +COMMITTED``. A different isolation level con be set through the +`.set_isolation_level()` method. The level can be set to one of the following +constants, defined in `psycopg2.extensions`: + +`ISOLATION_LEVEL_AUTOCOMMIT` + No transaction is started when command are issued and no + `.commit()`/`.rollback()` is required. Some PostgreSQL command such as + ``CREATE DATABASE`` can't run into a transaction: to run such command use + `.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)`. + +`ISOLATION_LEVEL_READ_COMMITTED` + This is the default value. A new transaction is started at the first + `.execute()` command on a cursor and at each new `.execute()` after a + `.commit()` or a `.rollback()`. The transaction runs in the PostgreSQL + ``READ COMMITTED`` isolation level. + +`ISOLATION_LEVEL_SERIALIZABLE` + Transactions are run at a ``SERIALIZABLE`` isolation level. + + +.. _transaction isolation level: + http://www.postgresql.org/docs/8.1/static/transaction-iso.html + + +Adaptation of Python values to SQL types +======================================== + +psycopg2 casts Python variables to SQL literals by type. Standard Python types +are already adapted to the proper SQL literal. + +Example: the Python function:: + + curs.execute("""INSERT INTO atable (anint, adate, astring) + VALUES (%s, %s, %s)""", + (10, datetime.date(2005, 11, 18), "O'Reilly")) + +is converted into the SQL command:: + + INSERT INTO atable (anint, adate, astring) + VALUES (10, '2005-11-18', 'O''Reilly'); + +Named arguments are supported too with ``%(name)s`` placeholders. Notice that: + + - The Python string operator ``%`` is not used: the `.execute()` function + accepts the values tuple or dictionary as second parameter. + + - The variables placeholder must always be a ``%s``, even if a different + placeholder (such as a ``%d`` for an integer) may look more appropriate. + + - For positional variables binding, the second argument must always be a + tuple, even if it contains a single variable. + + - Only variable values should be bound via this method: it shouldn't be used + to set table or field names. For these elements, ordinary string formatting + should be used before running `.execute()`. + + +Adapting new types +------------------ + +Any Python class or type can be adapted to an SQL string. Adaptation mechanism +is similar to the Object Adaptation proposed in the `PEP-246`_ and is exposed +by the `adapt()` function. + +psycopg2 `.execute()` method adapts its ``vars`` arguments to the `ISQLQuote` +protocol. Objects that conform to this protocol expose a ``getquoted()`` method +returning the SQL representation of the object as a string. + +The easiest way to adapt an object to an SQL string is to register an adapter +function via the `register_adapter()` function. The adapter function must take +the value to be adapted as argument and return a conform object. A convenient +object is the `AsIs` wrapper, whose ``getquoted()`` result is simply the +``str()``\ ingification of the wrapped object. + +Example: mapping of a ``Point`` class into the ``point`` PostgreSQL geometric +type:: + + from psycopg2.extensions import adapt, register_adapter, AsIs + + class Point(object): + def __init__(self, x=0.0, y=0.0): + self.x = x + self.y = y + + def adapt_point(point): + return AsIs("'(%s,%s)'" % (adapt(point.x), adapt(point.y))) + + register_adapter(Point, adapt_point) + + curs.execute("INSERT INTO atable (apoint) VALUES (%s)", + (Point(1.23, 4.56),)) + +The above function call results in the SQL command:: + + INSERT INTO atable (apoint) VALUES ((1.23, 4.56)); + + +.. _PEP-246: http://www.python.org/peps/pep-0246.html + + +Type casting of SQL types into Python values +============================================ + +PostgreSQL objects read from the database can be adapted to Python objects +through an user-defined adapting function. An adapter function takes two +argments: the object string representation as returned by PostgreSQL and the +cursor currently being read, and should return a new Python object. For +example, the following function parses a PostgreSQL ``point`` into the +previously defined ``Point`` class:: + + def cast_point(value, curs): + if value is not None: + # Convert from (f1, f2) syntax using a regular expression. + m = re.match("\((.*),(.*)\)", value) + if m: + return Point(float(m.group(1)), float(m.group(2))) + +To create a mapping from the PostgreSQL type (either standard or user-defined), +its ``oid`` must be known. It can be retrieved either by the second column of +the cursor description:: + + curs.execute("SELECT NULL::point") + point_oid = curs.description[0][1] # usually returns 600 + +or by querying the system catalogs for the type name and namespace (the +namespace for system objects is ``pg_catalog``):: + + curs.execute(""" + SELECT pg_type.oid + FROM pg_type JOIN pg_namespace + ON typnamespace = pg_namespace.oid + WHERE typname = %(typename)s + AND nspname = %(namespace)s""", + {'typename': 'point', 'namespace': 'pg_catalog'}) + + point_oid = curs.fetchone()[0] + +After you know the object ``oid``, you must can and register the new type:: + + POINT = psycopg2.extensions.new_type((point_oid,), "POINT", cast_point) + psycopg2.extensions.register_type(POINT) + +The `new_type()` function binds the object oids (more than one can be +specified) to the adapter function. `register_type()` completes the spell. +Conversion is automatically performed when a column whose type is a registered +``oid`` is read:: + + curs.execute("SELECT '(10.2,20.3)'::point") + point = curs.fetchone()[0] + print type(point), point.x, point.y + # Prints: " 10.2 20.3" + + +Working with times and dates +============================ + + +Receiving NOTIFYs +================= + + +Using COPY TO and COPY FROM +=========================== + +psycopg2 `cursor` object provides an interface to the efficient `PostgreSQL +COPY command`__ to move data from files to tables and back. + +The `.copy_to(file, table)` method writes the content of the table +named ``table`` *to* the file-like object ``file``. ``file`` must have a +``write()`` method. + +The `.copy_from(file, table)` reads data *from* the file-like object +``file`` appending them to the table named ``table``. ``file`` must have both +``read()`` and ``readline()`` method. + +Both methods accept two optional arguments: ``sep`` (defaulting to a tab) is +the columns separator and ``null`` (defaulting to ``\N``) represents ``NULL`` +values in the file. + +.. __: http://www.postgresql.org/docs/8.1/static/sql-copy.html + + +PostgreSQL status message and executed query +============================================ + +`cursor` objects have two special fields related to the last executed query: + + - `.query` is the textual representation (str or unicode, depending on what + was passed to `.execute()` as first argument) of the query *after* argument + binding and mogrification has been applied. To put it another way, `.query` + is the *exact* query that was sent to the PostgreSQL backend. + + - `.statusmessage` is the status message that the backend sent upon query + execution. It usually contains the basic type of the query (SELECT, + INSERT, UPDATE, ...) and some additional information like the number of + rows updated and so on. Refer to the PostgreSQL manual for more + information. diff --git a/trunk/psycopg2/examples/binary.py b/trunk/psycopg2/examples/binary.py new file mode 100644 index 0000000..eaa8f1e --- /dev/null +++ b/trunk/psycopg2/examples/binary.py @@ -0,0 +1,89 @@ +# binary.py - working with binary data +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_binary (id int4, name text, img bytea)") +except: + conn.rollback() + curs.execute("DROP TABLE test_binary") + curs.execute("CREATE TABLE test_binary (id int4, name text, img bytea)") +conn.commit() + +# first we try two inserts, one with an explicit Binary call and the other +# using a buffer on a file object. + +data1 = {'id':1, 'name':'somehackers.jpg', + 'img':psycopg2.Binary(open('somehackers.jpg').read())} +data2 = {'id':2, 'name':'whereareyou.jpg', + 'img':buffer(open('whereareyou.jpg').read())} + +curs.execute("""INSERT INTO test_binary + VALUES (%(id)s, %(name)s, %(img)s)""", data1) +curs.execute("""INSERT INTO test_binary + VALUES (%(id)s, %(name)s, %(img)s)""", data2) + +# now we try to extract the images as simple text strings + +print "Extracting the images as strings..." +curs.execute("SELECT * FROM test_binary") + +for row in curs.fetchall(): + name, ext = row[1].split('.') + new_name = name + '_S.' + ext + print " writing %s to %s ..." % (name+'.'+ext, new_name), + open(new_name, 'wb').write(row[2]) + print "done" + print " python type of image data is", type(row[2]) + +# extract exactly the same data but using a binary cursor + +print "Extracting the images using a binary cursor:" + +curs.execute("""DECLARE zot CURSOR FOR + SELECT img, name FROM test_binary FOR READ ONLY""") +curs.execute("""FETCH ALL FROM zot""") + +for row in curs.fetchall(): + name, ext = row[1].split('.') + new_name = name + '_B.' + ext + print " writing %s to %s ..." % (name+'.'+ext, new_name), + open(new_name, 'wb').write(row[0]) + print "done" + print " python type of image data is", type(row[0]) + +# this rollback is requires because we can't drop a table with a binary cusor +# declared and still open +conn.rollback() + +curs.execute("DROP TABLE test_binary") +conn.commit() + +print "\nNow try to load the new images, to check it worked!" diff --git a/trunk/psycopg2/examples/copy_from.py b/trunk/psycopg2/examples/copy_from.py new file mode 100644 index 0000000..edd3294 --- /dev/null +++ b/trunk/psycopg2/examples/copy_from.py @@ -0,0 +1,178 @@ +# copy_from.py -- example about copy_from +# +# Copyright (C) 2002 Tom Jenkins +# Copyright (C) 2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import os +import StringIO +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +except: + conn.rollback() + curs.execute("DROP TABLE test_copy") + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +conn.commit() + +# copy_from with default arguments, from open file + +io = open('copy_from.txt', 'wr') +data = ['Tom\tJenkins\t37\n', + 'Madonna\t\N\t45\n', + 'Federico\tDi Gregorio\t\N\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy') +print "1) Copy %d records from file object " % len(data) + \ + "using defaults (sep: \\t and null = \\N)" +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# copy_from using custom separator, from open file + +io = open('copy_from.txt', 'wr') +data = ['Tom:Jenkins:37\n', + 'Madonna:\N:45\n', + 'Federico:Di Gregorio:\N\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy', ':') +print "2) Copy %d records from file object using sep = :" % len(data) +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# copy_from using custom null identifier, from open file + +io = open('copy_from.txt', 'wr') +data = ['Tom\tJenkins\t37\n', + 'Madonna\tNULL\t45\n', + 'Federico\tDi Gregorio\tNULL\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy', null='NULL') +print "3) Copy %d records from file object using null = NULL" % len(data) +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select using cursor returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# copy_from using custom separator and null identifier + +io = open('copy_from.txt', 'wr') +data = ['Tom:Jenkins:37\n', 'Madonna:NULL:45\n', 'Federico:Di Gregorio:NULL\n'] +io.writelines(data) +io.close() + +io = open('copy_from.txt', 'r') +curs.copy_from(io, 'test_copy', ':', 'NULL') +print "4) Copy %d records from file object " % len(data) + \ + "using sep = : and null = NULL" +io.close() + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select using cursor returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# anything can be used as a file if it has .read() and .readline() methods + +data = StringIO.StringIO() +data.write('\n'.join(['Tom\tJenkins\t37', + 'Madonna\t\N\t45', + 'Federico\tDi Gregorio\t\N'])) +data.seek(0) + +curs.copy_from(data, 'test_copy') +print "5) Copy 3 records from StringIO object using defaults" + +curs.execute("SELECT * FROM test_copy") +rows = curs.fetchall() +print " Select using cursor returned %d rows" % len(rows) + +for r in rows: + print " %s %s\t%s" % (r[0], r[1], r[2]) +curs.execute("delete from test_copy") +conn.commit() + +# simple error test + +print "6) About to raise an error" +data = StringIO.StringIO() +data.write('\n'.join(['Tom\tJenkins\t37', + 'Madonna\t\N\t45', + 'Federico\tDi Gregorio\taaa'])) +data.seek(0) + +try: + curs.copy_from(data, 'test_copy') +except StandardError, err: + conn.rollback() + print " Catched error (as expected):\n", err + +conn.rollback() + +curs.execute("DROP TABLE test_copy") +os.unlink('copy_from.txt') +conn.commit() + + + diff --git a/trunk/psycopg2/examples/copy_to.py b/trunk/psycopg2/examples/copy_to.py new file mode 100644 index 0000000..5570fbc --- /dev/null +++ b/trunk/psycopg2/examples/copy_to.py @@ -0,0 +1,104 @@ +# copy_to.py -- example about copy_to +# +# Copyright (C) 2002 Tom Jenkins +# Copyright (C) 2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import os +import StringIO +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +except: + conn.rollback() + curs.execute("DROP TABLE test_copy") + curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") +conn.commit() + +# demostrate copy_to functionality +data = [('Tom', 'Jenkins', '37'), + ('Madonna', None, '45'), + ('Federico', 'Di Gregorio', None)] +query = "INSERT INTO test_copy VALUES (%s, %s, %s)" +curs.executemany(query, data) +conn.commit() + +# copy_to using defaults +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy') +print "1) Copy %d records into file object using defaults: " % len (data) + \ + "sep = \\t and null = \\N" +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +# copy_to using custom separator +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy', ':') +print "2) Copy %d records into file object using sep = :" % len(data) +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +# copy_to using custom null identifier +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy', null='NULL') +print "3) Copy %d records into file object using null = NULL" % len(data) +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +# copy_to using custom separator and null identifier +io = open('copy_to.txt', 'w') +curs.copy_to(io, 'test_copy', ':', 'NULL') +print "4) Copy %d records into file object using sep = : and null ) NULL" % \ + len(data) +io.close() + +rows = open('copy_to.txt', 'r').readlines() +print " File has %d rows:" % len(rows) + +for r in rows: + print " ", r, + +curs.execute("DROP TABLE test_copy") +os.unlink('copy_to.txt') +conn.commit() diff --git a/trunk/psycopg2/examples/cursor.py b/trunk/psycopg2/examples/cursor.py new file mode 100644 index 0000000..54cb5e7 --- /dev/null +++ b/trunk/psycopg2/examples/cursor.py @@ -0,0 +1,63 @@ +# cursor.py - how to subclass the cursor type +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extensions + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dsn:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + + +class NoDataError(psycopg2.ProgrammingError): + """Exception that will be raised by our cursor.""" + pass + +class Cursor(psycopg2.extensions.cursor): + """A custom cursor.""" + + def fetchone(self): + """Like fetchone but raise an exception if no data is available. + + Note that to have .fetchmany() and .fetchall() to raise the same + exception we'll have to override them too; even if internally psycopg + uses the same function to fetch rows, the code path from Python is + different. + """ + d = psycopg2.extensions.cursor.fetchone(self) + if d is None: + raise NoDataError("no more data") + return d + +curs = conn.cursor(cursor_factory=Cursor) +curs.execute("SELECT 1 AS foo") +print "Result of fetchone():", curs.fetchone() + +# now let's raise the exception +try: + curs.fetchone() +except NoDataError, err: + print "Exception caugth:", err + +conn.rollback() diff --git a/trunk/psycopg2/examples/dialtone.py b/trunk/psycopg2/examples/dialtone.py new file mode 100644 index 0000000..3a55686 --- /dev/null +++ b/trunk/psycopg2/examples/dialtone.py @@ -0,0 +1,144 @@ +""" +This example/recipe has been contributed by Valentino Volonghi (dialtone) + +Mapping arbitrary objects to a PostgreSQL database with psycopg2 + +- Problem + +You need to store arbitrary objects in a PostgreSQL database without being +intrusive for your classes (don't want inheritance from an 'Item' or +'Persistent' object). + +- Solution +""" + +from datetime import datetime + +import psycopg2 +from psycopg2.extensions import adapt, register_adapter + +try: + sorted() +except: + def sorted(seq): + seq.sort() + return seq + +# Here is the adapter for every object that we may ever need to +# insert in the database. It receives the original object and does +# its job on that instance + +class ObjectMapper(object): + def __init__(self, orig, curs=None): + self.orig = orig + self.tmp = {} + self.items, self.fields = self._gatherState() + + def _gatherState(self): + adaptee_name = self.orig.__class__.__name__ + fields = sorted([(field, getattr(self.orig, field)) + for field in persistent_fields[adaptee_name]]) + items = [] + for item, value in fields: + items.append(item) + return items, fields + + def getTableName(self): + return self.orig.__class__.__name__ + + def getMappedValues(self): + tmp = [] + for i in self.items: + tmp.append("%%(%s)s"%i) + return ", ".join(tmp) + + def getValuesDict(self): + return dict(self.fields) + + def getFields(self): + return self.items + + def generateInsert(self): + qry = "INSERT INTO" + qry += " " + self.getTableName() + " (" + qry += ", ".join(self.getFields()) + ") VALUES (" + qry += self.getMappedValues() + ")" + return qry, self.getValuesDict() + +# Here are the objects +class Album(object): + id = 0 + def __init__(self): + self.creation_time = datetime.now() + self.album_id = self.id + Album.id = Album.id + 1 + self.binary_data = buffer('12312312312121') + +class Order(object): + id = 0 + def __init__(self): + self.items = ['rice','chocolate'] + self.price = 34 + self.order_id = self.id + Order.id = Order.id + 1 + +register_adapter(Album, ObjectMapper) +register_adapter(Order, ObjectMapper) + +# Describe what is needed to save on each object +# This is actually just configuration, you can use xml with a parser if you +# like to have plenty of wasted CPU cycles ;P. + +persistent_fields = {'Album': ['album_id', 'creation_time', 'binary_data'], + 'Order': ['order_id', 'items', 'price'] + } + +print adapt(Album()).generateInsert() +print adapt(Album()).generateInsert() +print adapt(Album()).generateInsert() +print adapt(Order()).generateInsert() +print adapt(Order()).generateInsert() +print adapt(Order()).generateInsert() + +""" +- Discussion + +Psycopg 2 has a great new feature: adaptation. The big thing about +adaptation is that it enable the programmer to glue most of the +code out there without many difficulties. + +This recipe tries to focus the attention on a way to generate SQL queries to +insert completely new objects inside a database. As you can see objects do +not know anything about the code that is handling them. We specify all the +fields that we need for each object through the persistent_fields dict. + +The most important lines of this recipe are: + register_adapter(Album, ObjectMapper) + register_adapter(Order, ObjectMapper) + +In these line we notify the system that when we call adapt with an Album instance +as an argument we want it to istantiate ObjectMapper passing the Album instance +as argument (self.orig in the ObjectMapper class). + +The output is something like this (for each call to generateInsert): + +('INSERT INTO Album (album_id, binary_data, creation_time) VALUES + (%(album_id)s, %(binary_data)s, %(creation_time)s)', + + {'binary_data': , + 'creation_time': datetime.datetime(2004, 9, 10, 20, 48, 29, 633728), + 'album_id': 1} +) + +This is a tuple of {SQL_QUERY, FILLING_DICT}, and all the quoting/converting +stuff (from python's datetime to postgres s and from python's buffer to +postgres' blob) is handled with the same adaptation process hunder the hood +by psycopg2. + +At last, just notice that ObjectMapper is working for both Album and Order +instances without any glitches at all, and both classes could have easily been +coming from closed source libraries or C coded ones (which are not easily +modified), whereas a common pattern in todays ORMs or OODBs is to provide +a basic 'Persistent' object that already knows how to store itself in the +database. +""" diff --git a/trunk/psycopg2/examples/dict.py b/trunk/psycopg2/examples/dict.py new file mode 100644 index 0000000..37dc74a --- /dev/null +++ b/trunk/psycopg2/examples/dict.py @@ -0,0 +1,45 @@ +# dict.py - using DictCUrsor/DictRow +# +# Copyright (C) 2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extras + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dsn:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + + +curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) +curs.execute("SELECT 1 AS foo, 'cip' AS bar, date(now()) as zot") + +data = curs.fetchone() +print "Some data accessed both as tuple and dict:" +print " ", data['foo'], data['bar'], data['zot'] +print " ", data[0], data[1], data[2] + +# execute another query and demostrate we can still access the row +curs.execute("SELECT 2 AS foo") +print "Some more data accessed both as tuple and dict:" +print " ", data['foo'], data['bar'], data['zot'] +print " ", data[0], data[1], data[2] diff --git a/trunk/psycopg2/examples/dt.py b/trunk/psycopg2/examples/dt.py new file mode 100644 index 0000000..76f0c78 --- /dev/null +++ b/trunk/psycopg2/examples/dt.py @@ -0,0 +1,99 @@ +# datetime.py - example of using date and time types +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 +import mx.DateTime +import datetime + +from psycopg2.extensions import adapt + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("""CREATE TABLE test_dt ( + k int4, d date, t time, dt timestamp, z interval)""") +except: + conn.rollback() + curs.execute("DROP TABLE test_dt") + curs.execute("""CREATE TABLE test_dt ( + k int4, d date, t time, dt timestamp, z interval)""") +conn.commit() + +# build and insert some data using mx.DateTime +mx1 = ( + 1, + mx.DateTime.Date(2004, 10, 19), + mx.DateTime.Time(0, 11, 17.015), + mx.DateTime.Timestamp(2004, 10, 19, 0, 11, 17.5), + mx.DateTime.DateTimeDelta(13, 15, 17, 59.9)) + +from psycopg2.extensions import adapt +import psycopg2.extras +print adapt(mx1) + +print "Inserting mx.DateTime values..." +curs.execute("INSERT INTO test_dt VALUES (%s, %s, %s, %s, %s)", mx1) + +# build and insert some values using the datetime adapters +dt1 = ( + 2, + datetime.date(2004, 10, 19), + datetime.time(0, 11, 17, 15000), + datetime.datetime(2004, 10, 19, 0, 11, 17, 500000), + datetime.timedelta(13, 15*3600+17*60+59, 900000)) + +print "Inserting Python datetime values..." +curs.execute("INSERT INTO test_dt VALUES (%s, %s, %s, %s, %s)", dt1) + +# now extract the row from database and print them +print "Extracting values inserted with mx.DateTime wrappers:" +curs.execute("SELECT d, t, dt, z FROM test_dt WHERE k = 1") +for n, x in zip(mx1[1:], curs.fetchone()): + try: + # this will work only is psycopg has been compiled with datetime + # as the default typecaster for date/time values + s = repr(n) + "\n -> " + str(adapt(n)) + \ + "\n -> " + repr(x) + "\n -> " + x.isoformat() + except: + s = repr(n) + "\n -> " + str(adapt(n)) + \ + "\n -> " + repr(x) + "\n -> " + str(x) + print s +print + +print "Extracting values inserted with Python datetime wrappers:" +curs.execute("SELECT d, t, dt, z FROM test_dt WHERE k = 2") +for n, x in zip(dt1[1:], curs.fetchone()): + try: + # this will work only is psycopg has been compiled with datetime + # as the default typecaster for date/time values + s = repr(n) + "\n -> " + repr(x) + "\n -> " + x.isoformat() + except: + s = repr(n) + "\n -> " + repr(x) + "\n -> " + str(x) + print s +print + +curs.execute("DROP TABLE test_dt") +conn.commit() diff --git a/trunk/psycopg2/examples/encoding.py b/trunk/psycopg2/examples/encoding.py new file mode 100644 index 0000000..da57bcf --- /dev/null +++ b/trunk/psycopg2/examples/encoding.py @@ -0,0 +1,105 @@ +# enkoding.py - show to change client enkoding (and test it works) +# -*- encoding: utf8 -*- +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extensions + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Initial encoding for this connection is", conn.encoding + +print "\n** This example is supposed to be run in a UNICODE terminal! **\n" + +print "Available encodings:" +encs = psycopg2.extensions.encodings.items() +encs.sort() +for a, b in encs: + print " ", a, "<->", b + +print "Using STRING typecaster" +print "Setting backend encoding to LATIN1 and executing queries:" +conn.set_client_encoding('LATIN1') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", ('àèìòù',)) +x = curs.fetchone()[0] +print " ->", unicode(x, 'latin-1').encode('utf-8'), type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", unicode(x, 'latin-1').encode('utf-8'), type(x) + +print "Setting backend encoding to UTF8 and executing queries:" +conn.set_client_encoding('UNICODE') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù'.encode('utf-8'),)) +x = curs.fetchone()[0] +print " ->", x, type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x, type(x) + +print "Using UNICODE typecaster" +psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) + +print "Setting backend encoding to LATIN1 and executing queries:" +conn.set_client_encoding('LATIN1') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", ('àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) + +print "Setting backend encoding to UTF8 and executing queries:" +conn.set_client_encoding('UNICODE') +curs = conn.cursor() +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù'.encode('utf-8'),)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute("SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) + +print "Executing full UNICODE queries" + +print "Setting backend encoding to LATIN1 and executing queries:" +conn.set_client_encoding('LATIN1') +curs = conn.cursor() +curs.execute(u"SELECT %s::TEXT AS foo", ('àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute(u"SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) + +print "Setting backend encoding to UTF8 and executing queries:" +conn.set_client_encoding('UNICODE') +curs = conn.cursor() +curs.execute(u"SELECT %s::TEXT AS foo", (u'àèìòù'.encode('utf-8'),)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) +curs.execute(u"SELECT %s::TEXT AS foo", (u'àèìòù',)) +x = curs.fetchone()[0] +print " ->", x.encode('utf-8'), ":", type(x) diff --git a/trunk/psycopg2/examples/fetch.py b/trunk/psycopg2/examples/fetch.py new file mode 100644 index 0000000..dab0a41 --- /dev/null +++ b/trunk/psycopg2/examples/fetch.py @@ -0,0 +1,81 @@ +# fetch.py -- example about declaring cursors +# +# Copyright (C) 2001-2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_fetch (val int4)") +except: + conn.rollback() + curs.execute("DROP TABLE test_fetch") + curs.execute("CREATE TABLE test_fetch (val int4)") +conn.commit() + +# we use this function to format the output + +def flatten(l): + """Flattens list of tuples l.""" + return map(lambda x: x[0], l) + +# insert 20 rows in the table + +for i in range(20): + curs.execute("INSERT INTO test_fetch VALUES(%s)", (i,)) +conn.commit() + +# does some nice tricks with the transaction and postgres cursors +# (remember to always commit or rollback before a DECLARE) +# +# we don't need to DECLARE ourselves, psycopg now support named +# cursors (but we leave the code here, comments, as an example of +# what psycopg is doing under the hood) +# +#curs.execute("DECLARE crs CURSOR FOR SELECT * FROM test_fetch") +#curs.execute("FETCH 10 FROM crs") +#print "First 10 rows:", flatten(curs.fetchall()) +#curs.execute("MOVE -5 FROM crs") +#print "Moved back cursor by 5 rows (to row 5.)" +#curs.execute("FETCH 10 FROM crs") +#print "Another 10 rows:", flatten(curs.fetchall()) +#curs.execute("FETCH 10 FROM crs") +#print "The remaining rows:", flatten(curs.fetchall()) + +ncurs = conn.cursor("crs") +ncurs.execute("SELECT * FROM test_fetch") +print "First 10 rows:", flatten(ncurs.fetchmany(10)) +ncurs.scroll(-5) +print "Moved back cursor by 5 rows (to row 5.)" +print "Another 10 rows:", flatten(ncurs.fetchmany(10)) +print "Another one:", list(ncurs.fetchone()) +print "The remaining rows:", flatten(ncurs.fetchall()) +conn.rollback() + +curs.execute("DROP TABLE test_fetch") +conn.commit() diff --git a/trunk/psycopg2/examples/lastrowid.py b/trunk/psycopg2/examples/lastrowid.py new file mode 100644 index 0000000..205ef6c --- /dev/null +++ b/trunk/psycopg2/examples/lastrowid.py @@ -0,0 +1,59 @@ +# lastrowid.py - example of using .lastrowid attribute +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys, psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("CREATE TABLE test_oid (name text, surname text)") +except: + conn.rollback() + curs.execute("DROP TABLE test_oid") + curs.execute("CREATE TABLE test_oid (name text, surname text)") +conn.commit() + +data = ({'name':'Federico', 'surname':'Di Gregorio'}, + {'name':'Pierluigi', 'surname':'Di Nunzio'}) + +curs.execute("""INSERT INTO test_oid + VALUES (%(name)s, %(surname)s)""", data[0]) + +foid = curs.lastrowid +print "Oid for %(name)s %(surname)s" % data[0], "is", foid + +curs.execute("""INSERT INTO test_oid + VALUES (%(name)s, %(surname)s)""", data[1]) +moid = curs.lastrowid +print "Oid for %(name)s %(surname)s" % data[1], "is", moid + +curs.execute("SELECT * FROM test_oid WHERE oid = %s", (foid,)) +print "Oid", foid, "selected %s %s" % curs.fetchone() + +curs.execute("SELECT * FROM test_oid WHERE oid = %s", (moid,)) +print "Oid", moid, "selected %s %s" % curs.fetchone() + +curs.execute("DROP TABLE test_oid") +conn.commit() diff --git a/trunk/psycopg2/examples/mogrify.py b/trunk/psycopg2/examples/mogrify.py new file mode 100644 index 0000000..480c491 --- /dev/null +++ b/trunk/psycopg2/examples/mogrify.py @@ -0,0 +1,47 @@ +# mogrify.py - test all possible simple type mogrifications +# -*- encoding: latin1 -*- +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys, psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN + +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +curs.execute("SELECT %(foo)s AS foo", {'foo':'bar'}) +curs.execute("SELECT %(foo)s AS foo", {'foo':None}) +curs.execute("SELECT %(foo)s AS foo", {'foo':True}) +curs.execute("SELECT %(foo)s AS foo", {'foo':42}) +curs.execute("SELECT %(foo)s AS foo", {'foo':u'yatt�!'}) +curs.execute("SELECT %(foo)s AS foo", {'foo':u'bar'}) + +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':'bar'}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':None}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':True}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':42}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':u'yatt�!'}) +print curs.mogrify("SELECT %(foo)s AS foo", {'foo':u'bar'}) + +conn.rollback() diff --git a/trunk/psycopg2/examples/myfirstrecipe.py b/trunk/psycopg2/examples/myfirstrecipe.py new file mode 100644 index 0000000..4ddc65e --- /dev/null +++ b/trunk/psycopg2/examples/myfirstrecipe.py @@ -0,0 +1,122 @@ +""" +Using a tuple as a bound variable in "SELECT ... IN (...)" clauses +in PostgreSQL using psycopg 2 + +Some time ago someone asked on the psycopg mailing list how to have a +bound variable expand to the right SQL for an SELECT IN clause: + + SELECT * FROM atable WHERE afield IN (value1, value2, value3) + +with the values to be used in the IN clause to be passed to the cursor +.execute() method in a tuple as a bound variable, i.e.: + + in_values = ("value1", "value2", "value3") + curs.execute("SELECT ... IN %s", (in_values,)) + +psycopg 1 does support typecasting from Python to PostgreSQL (and back) +only for simple types and this problem has no elegant solution (short or +writing a wrapper class returning the pre-quoted text in an __str__ +method. + +But psycopg 2 offers a simple and elegant solution by partially +implementing the Object Adaptation from PEP 246. psycopg 2 (still in +beta and currently labeled as 1.99.9) moves the type-casting logic into +external adapters and a somehow broken adapt() function. + +While the original adapt() takes 3 arguments, psycopg's one only takes +1: the bound variable to be adapted. The result is an object supporting +a not-yet well defined protocol that we can call IPsycopgSQLQuote: + + class IPsycopgSQLQuote: + + def getquoted(self): + "Returns a quoted string representing the bound variable." + + def getbinary(self): + "Returns a binary quoted string representing the bound variable." + + def getbuffer(self): + "Returns the wrapped object itself." + + __str__ = getquoted + +Then one of the functions (usually .getquoted()) is called by psycopg at +the right time to obtain the right, sql-quoted representation for the +corresponding bound variable. + +The nice part is that the default, built-in adapters, derived from +psycopg 1 tyecasting code can be overridden by the programmer, simply +replacing them in the psycopg.extensions.adapters dictionary. + +Then the solution to the original problem is now obvious: write an +adapter that adapts tuple objects into the right SQL string, by calling +recursively adapt() on each element. + +Note: psycopg 2 adapter code is still very young and will probably move +to a more 'standard' (3 arguments) implementation for the adapt() +function; as long as that does not slow down too much query execution. + +Psycopg 2 development can be tracked on the psycopg mailing list: + + http://lists.initd.org/mailman/listinfo/psycopg + +and on the psycopg 2 wiki: + + http://wiki.initd.org/Projects/Psycopg2 + +""" + +import psycopg2 +import psycopg2.extensions +from psycopg2.extensions import adapt as psycoadapt +from psycopg2.extensions import register_adapter + +class AsIs(object): + """An adapter that just return the object 'as is'. + + psycopg 1.99.9 has some optimizations that make impossible to call + adapt() without adding some basic adapters externally. This limitation + will be lifted in a future release. + """ + def __init__(self, obj): + self.__obj = obj + def getquoted(self): + return self.__obj + +class SQL_IN(object): + """Adapt a tuple to an SQL quotable object.""" + + def __init__(self, seq): + self._seq = seq + + def prepare(self, conn): + pass + + def getquoted(self): + # this is the important line: note how every object in the + # list is adapted and then how getquoted() is called on it + + qobjs = [str(psycoadapt(o).getquoted()) for o in self._seq] + + return '(' + ', '.join(qobjs) + ')' + + __str__ = getquoted + + +# add our new adapter class to psycopg list of adapters +register_adapter(tuple, SQL_IN) +register_adapter(float, AsIs) +register_adapter(int, AsIs) + +# usually we would call: +# +# conn = psycopg.connect("...") +# curs = conn.cursor() +# curs.execute("SELECT ...", (("this", "is", "the", "tuple"),)) +# +# but we have no connection to a database right now, so we just check +# the SQL_IN class by calling psycopg's adapt() directly: + +if __name__ == '__main__': + print "Note how the string will be SQL-quoted, but the number will not:" + print psycoadapt(("this is an 'sql quoted' str\\ing", 1, 2.0)) diff --git a/trunk/psycopg2/examples/notify.py b/trunk/psycopg2/examples/notify.py new file mode 100644 index 0000000..83761b9 --- /dev/null +++ b/trunk/psycopg2/examples/notify.py @@ -0,0 +1,43 @@ +# notify.py - example of getting notifies +# +# Copyright (C) 2001-2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 +import select + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +conn.set_isolation_level(0) +curs = conn.cursor() + +curs.execute("listen test") + +print "Waiting for 'NOTIFY test'" +while 1: + if select.select([curs],[],[],5)==([],[],[]): + print "Timeout" + else: + if curs.isready(): + print "Got NOTIFY: %s" % str(curs.connection.notifies.pop()) diff --git a/trunk/psycopg2/examples/simple.py b/trunk/psycopg2/examples/simple.py new file mode 100644 index 0000000..2306be1 --- /dev/null +++ b/trunk/psycopg2/examples/simple.py @@ -0,0 +1,53 @@ +# simple.py - very simple example of plain DBAPI-2.0 usage +# currently used as test-me-stress-me script for psycopg 2.0 +# +# Copyright (C) 2001-2003 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +class SimpleQuoter(object): + def sqlquote(x=None): + return "'bar'" + +import sys +import psycopg2 + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Encoding for this connection is", conn.encoding + +curs = conn.cursor() +curs.execute("SELECT 1 AS foo") +print curs.fetchone() +curs.execute("SELECT 1 AS foo") +print curs.fetchmany() +curs.execute("SELECT 1 AS foo") +print curs.fetchall() + +conn.rollback() + +sys.exit(0) + +curs.execute("SELECT 1 AS foo", async=1) + +curs.execute("SELECT %(foo)s AS foo", {'foo':'bar'}) +curs.execute("SELECT %(foo)s AS foo", {'foo':None}) +curs.execute("SELECT %(foo)f AS foo", {'foo':42}) +curs.execute("SELECT %(foo)s AS foo", {'foo':SimpleQuoter()}) diff --git a/trunk/psycopg2/examples/somehackers.jpg b/trunk/psycopg2/examples/somehackers.jpg new file mode 100644 index 0000000..8bb6e01 Binary files /dev/null and b/trunk/psycopg2/examples/somehackers.jpg differ diff --git a/trunk/psycopg2/examples/threads.py b/trunk/psycopg2/examples/threads.py new file mode 100644 index 0000000..5477aa8 --- /dev/null +++ b/trunk/psycopg2/examples/threads.py @@ -0,0 +1,160 @@ +# threads.py -- example of multiple threads using psycopg +# -*- encoding: latin1 -*- +# +# Copyright (C) 2001-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## some others parameters +INSERT_THREADS = ('A', 'B', 'C') +SELECT_THREADS = ('1', '2') + +ROWS = 1000 + +COMMIT_STEP = 20 +SELECT_SIZE = 10000 +SELECT_STEP = 500 +SELECT_DIV = 250 + +# the available modes are: +# 0 - one connection for all insert and one for all select threads +# 1 - connections generated using the connection pool + +MODE = 1 + +## don't modify anything below tis line (except for experimenting) + +import sys, psycopg2, threading +from psycopg2.pool import ThreadedConnectionPool + +if len(sys.argv) > 1: + DSN = sys.argv[1] +if len(sys.argv) > 2: + MODE = int(sys.argv[2]) + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("""CREATE TABLE test_threads ( + name text, value1 int4, value2 float)""") +except: + conn.rollback() + curs.execute("DROP TABLE test_threads") + curs.execute("""CREATE TABLE test_threads ( + name text, value1 int4, value2 float)""") +conn.commit() + + +## this function inserts a big number of rows and creates and destroys +## a large number of cursors + +def insert_func(conn_or_pool, rows): + name = threading.currentThread().getName() + + if MODE == 0: + conn = conn_or_pool + else: + conn = conn_or_pool.getconn() + + for i in range(rows): + if divmod(i, COMMIT_STEP)[1] == 0: + conn.commit() + if MODE == 1: + conn_or_pool.putconn(conn) + s = name + ": COMMIT STEP " + str(i) + print s + if MODE == 1: + conn = conn_or_pool.getconn() + c = conn.cursor() + try: + c.execute("INSERT INTO test_threads VALUES (%s, %s, %s)", + (str(i), i, float(i))) + except psycopg2.ProgrammingError, err: + print name, ": an error occurred; skipping this insert" + print err + conn.commit() + +## a nice select function that prints the current number of rows in the +## database (and transefer them, putting some pressure on the network) + +def select_func(conn_or_pool, z): + name = threading.currentThread().getName() + + if MODE == 0: + conn = conn_or_pool + conn.set_isolation_level(0) + + for i in range(SELECT_SIZE): + if divmod(i, SELECT_STEP)[1] == 0: + try: + if MODE == 1: + conn = conn_or_pool.getconn() + conn.set_isolation_level(0) + c = conn.cursor() + c.execute("SELECT * FROM test_threads WHERE value2 < %s", + (int(i/z),)) + l = c.fetchall() + if MODE == 1: + conn_or_pool.putconn(conn) + s = name + ": number of rows fetched: " + str(len(l)) + print s + except psycopg2.ProgrammingError, err: + print name, ": an error occurred; skipping this select" + print err + +## create the connection pool or the connections +if MODE == 0: + conn_insert = psycopg2.connect(DSN) + conn_select = psycopg2.connect(DSN) +else: + m = len(INSERT_THREADS) + len(SELECT_THREADS) + n = m/2 + conn_insert = conn_select = ThreadedConnectionPool(n, m, DSN) + +## create the threads +threads = [] + +print "Creating INSERT threads:" +for name in INSERT_THREADS: + t = threading.Thread(None, insert_func, 'Thread-'+name, + (conn_insert, ROWS)) + t.setDaemon(0) + threads.append(t) + +print "Creating SELECT threads:" +for name in SELECT_THREADS: + t = threading.Thread(None, select_func, 'Thread-'+name, + (conn_select, SELECT_DIV)) + t.setDaemon(0) + threads.append(t) + +## really start the threads now +for t in threads: + t.start() + +# and wait for them to finish +for t in threads: + t.join() + print t.getName(), "exited OK" + + +conn.commit() +curs.execute("SELECT count(name) FROM test_threads") +print "Inserted", curs.fetchone()[0], "rows." + +curs.execute("DROP TABLE test_threads") +conn.commit() diff --git a/trunk/psycopg2/examples/tz.py b/trunk/psycopg2/examples/tz.py new file mode 100644 index 0000000..c27bf30 --- /dev/null +++ b/trunk/psycopg2/examples/tz.py @@ -0,0 +1,69 @@ +# tz.py - example of datetime objects with time zones +# -*- encoding: utf8 -*- +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below this line (except for experimenting) + +import sys +import psycopg2 +import datetime + +from psycopg2.tz import ZERO, LOCAL, FixedOffsetTimezone + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +curs = conn.cursor() + +try: + curs.execute("CREATE TABLE test_tz (t timestamp with time zone)") +except: + conn.rollback() + curs.execute("DROP TABLE test_tz") + curs.execute("CREATE TABLE test_tz (t timestamp with time zone)") +conn.commit() + +d = datetime.datetime(1971, 10, 19, 22, 30, 0, tzinfo=LOCAL) +curs.execute("INSERT INTO test_tz VALUES (%s)", (d,)) +print "Inserted timestamp with timezone:", d +print "Time zone:", d.tzinfo.tzname(d), "offset:", d.tzinfo.utcoffset(d) + +tz = FixedOffsetTimezone(-5*60, "EST") +d = datetime.datetime(1971, 10, 19, 22, 30, 0, tzinfo=tz) +curs.execute("INSERT INTO test_tz VALUES (%s)", (d,)) +print "Inserted timestamp with timezone:", d +print "Time zone:", d.tzinfo.tzname(d), "offset:", d.tzinfo.utcoffset(d) + +curs.execute("SELECT * FROM test_tz") +d = curs.fetchone()[0] +curs.execute("INSERT INTO test_tz VALUES (%s)", (d,)) +print "Inserted SELECTed timestamp:", d +print "Time zone:", d.tzinfo.tzname(d), "offset:", d.tzinfo.utcoffset(d) + +curs.execute("SELECT * FROM test_tz") +for d in curs: + u = d[0].utcoffset() or ZERO + print "UTC time: ", d[0] - u + print "Local time:", d[0] + print "Time zone:", d[0].tzinfo.tzname(d[0]), d[0].tzinfo.utcoffset(d[0]) + + +curs.execute("DROP TABLE test_tz") +conn.commit() diff --git a/trunk/psycopg2/examples/usercast.py b/trunk/psycopg2/examples/usercast.py new file mode 100644 index 0000000..5c8031f --- /dev/null +++ b/trunk/psycopg2/examples/usercast.py @@ -0,0 +1,126 @@ +# usercast.py -- example of user defined typecasters +# -*- encoding: latin-1 -*- +# +# Copyright (C) 2001-2005 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +## put in DSN your DSN string + +DSN = 'dbname=test' + +## don't modify anything below tis line (except for experimenting) + +import sys +import psycopg2 +import psycopg2.extensions +import whrandom + +# importing psycopg.extras will give us a nice tuple adapter: this is wrong +# because the adapter is meant to be used in SQL IN clauses while we use +# tuples to represent points but it works and the example is about Rect, not +# "Point" +import psycopg2.extras + +if len(sys.argv) > 1: + DSN = sys.argv[1] + +print "Opening connection using dns:", DSN +conn = psycopg2.connect(DSN) +print "Initial encoding for this connection is", conn.encoding + +curs = conn.cursor() +try: + curs.execute("CREATE TABLE test_cast (p1 point, p2 point, b box)") +except: + conn.rollback() + curs.execute("DROP TABLE test_cast") + curs.execute("CREATE TABLE test_cast (p1 point, p2 point, b box)") +conn.commit() + +# this is the callable object we use as a typecast (the typecast is +# usually a function, but we use a class, just to demonstrate the +# flexibility of the psycopg casting system + +class Rect(object): + """Very simple rectangle. + + Note that we use this type as a data holder, as an adapter of itself for + the ISQLQuote protocol used by psycopg's adapt() (see __confrom__ below) + and eventually as a type-caster for the data extracted from the database + (that's why __init__ takes the curs argument.) + """ + + def __init__(self, s=None, curs=None): + """Init the rectangle from the optional string s.""" + self.x = self.y = self.width = self.height = 0.0 + if s: self.from_string(s) + + def __conform__(self, proto): + """This is a terrible hack, just ignore proto and return self.""" + if proto == psycopg2.extensions.ISQLQuote: + return self + + def from_points(self, x0, y0, x1, y1): + """Init the rectangle from points.""" + if x0 > x1: (x0, x1) = (x1, x0) + if y0 > y1: (y0, y1) = (y1, y0) + self.x = x0 + self.y = y0 + self.width = x1 - x0 + self.height = y1 - y0 + + def from_string(self, s): + """Init the rectangle from a string.""" + seq = eval(s) + self.from_points(seq[0][0], seq[0][1], seq[1][0], seq[1][1]) + + def getquoted(self): + """Format self as a string usable by the db to represent a box.""" + s = "'((%d,%d),(%d,%d))'" % ( + self.x, self.y, self.x + self.width, self.y + self.height) + return s + + def show(self): + """Format a description of the box.""" + s = "X: %d\tY: %d\tWidth: %d\tHeight: %d" % ( + self.x, self.y, self.width, self.height) + return s + +# here we select from the empty table, just to grab the description +curs.execute("SELECT b FROM test_cast WHERE 0=1") +boxoid = curs.description[0][1] +print "Oid for the box datatype is", boxoid + +# and build the user cast object +BOX = psycopg2.extensions.new_type((boxoid,), "BOX", Rect) +psycopg2.extensions.register_type(BOX) + +# now insert 100 random data (2 points and a box in each row) +for i in range(100): + p1 = (whrandom.randint(0,100), whrandom.randint(0,100)) + p2 = (whrandom.randint(0,100), whrandom.randint(0,100)) + b = Rect() + b.from_points(whrandom.randint(0,100), whrandom.randint(0,100), + whrandom.randint(0,100), whrandom.randint(0,100)) + curs.execute("INSERT INTO test_cast VALUES ('%(p1)s', '%(p2)s', %(box)s)", + {'box':b, 'p1':p1, 'p2':p2}) +print "Added 100 boxed to the database" + +# select and print all boxes with at least one point inside +curs.execute("SELECT b FROM test_cast WHERE p1 @ b OR p2 @ b") +boxes = curs.fetchall() +print "Found %d boxes with at least a point inside:" % len(boxes) +for box in boxes: + print " ", box[0].show() + +curs.execute("DROP TABLE test_cast") +conn.commit() diff --git a/trunk/psycopg2/examples/whereareyou.jpg b/trunk/psycopg2/examples/whereareyou.jpg new file mode 100644 index 0000000..f508c0b Binary files /dev/null and b/trunk/psycopg2/examples/whereareyou.jpg differ diff --git a/trunk/psycopg2/lib/__init__.py b/trunk/psycopg2/lib/__init__.py new file mode 100644 index 0000000..e40caa3 --- /dev/null +++ b/trunk/psycopg2/lib/__init__.py @@ -0,0 +1,72 @@ +"""A Python driver for PostgreSQL + +psycopg is a PostgreSQL_ database adapter for the Python_ programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being very +small and fast, and stable as a rock. + +Homepage: http://initd.org/projects/psycopg2 + +.. _PostgreSQL: http://www.postgresql.org/ +.. _Python: http://www.python.org/ + +:Groups: + * `Connections creation`: connect + * `Value objects constructors`: Binary, Date, DateFromTicks, Time, + TimeFromTicks, Timestamp, TimestampFromTicks +""" +# psycopg/__init__.py - initialization of the psycopg module +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +# Import modules needed by _psycopg to allow tools like py2exe to do +# their work without bothering about the module dependencies. +# +# TODO: we should probably use the Warnings framework to signal a missing +# module instead of raising an exception (in case we're running a thin +# embedded Python or something even more devious.) + +import sys, warnings +if sys.version_info[0] >= 2 and sys.version_info[1] >= 3: + try: + import datetime as _psycopg_needs_datetime + except: + warnings.warn( + "can't import datetime module probably needed by _psycopg", + RuntimeWarning) +if sys.version_info[0] >= 2 and sys.version_info[1] >= 4: + try: + import decimal as _psycopg_needs_decimal + except: + warnings.warn( + "can't import decimal module probably needed by _psycopg", + RuntimeWarning) +from psycopg2 import tz +del sys, warnings + +# Import the DBAPI-2.0 stuff into top-level module. + +from _psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID + +from _psycopg import Binary, Date, Time, Timestamp +from _psycopg import DateFromTicks, TimeFromTicks, TimestampFromTicks + +from _psycopg import Error, Warning, DataError, DatabaseError, ProgrammingError +from _psycopg import IntegrityError, InterfaceError, InternalError +from _psycopg import NotSupportedError, OperationalError + +from _psycopg import connect, apilevel, threadsafety, paramstyle +from _psycopg import __version__ + +__all__ = [ k for k in locals().keys() if not k.startswith('_') ] diff --git a/trunk/psycopg2/lib/extensions.py b/trunk/psycopg2/lib/extensions.py new file mode 100644 index 0000000..9233d1d --- /dev/null +++ b/trunk/psycopg2/lib/extensions.py @@ -0,0 +1,69 @@ +"""psycopg extensions to the DBAPI-2.0 + +This module holds all the extensions to the DBAPI-2.0 provided by psycopg. + +- `connection` -- the new-type inheritable connection class +- `cursor` -- the new-type inheritable cursor class +- `adapt()` -- exposes the PEP-246_ compatible adapting mechanism used + by psycopg to adapt Python types to PostgreSQL ones + +.. _PEP-246: http://www.python.org/peps/pep-0246.html +""" +# psycopg/extensions.py - DBAPI-2.0 extensions specific to psycopg +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +from _psycopg import UNICODE, INTEGER, LONGINTEGER, BOOLEAN, FLOAT +from _psycopg import TIME, DATE, INTERVAL + +from _psycopg import Boolean, QuotedString, AsIs +try: + from _psycopg import DateFromMx, TimeFromMx, TimestampFromMx + from _psycopg import IntervalFromMx +except: + pass +try: + from _psycopg import DateFromPy, TimeFromPy, TimestampFromPy + from _psycopg import IntervalFromPy +except: + pass + +from _psycopg import adapt, adapters, encodings, connection, cursor +from _psycopg import string_types, binary_types, new_type, register_type +from _psycopg import ISQLQuote + +"""Isolation level values.""" +ISOLATION_LEVEL_AUTOCOMMIT = 0 +ISOLATION_LEVEL_READ_COMMITTED = 1 +ISOLATION_LEVEL_SERIALIZABLE = 2 + +# PostgreSQL maps the the other standard values to already defined levels +ISOLATION_LEVEL_REPEATABLE_READ = ISOLATION_LEVEL_SERIALIZABLE +ISOLATION_LEVEL_READ_UNCOMMITTED = ISOLATION_LEVEL_READ_COMMITTED + +"""Transaction status values.""" +STATUS_SETUP = 0 +STATUS_READY = 1 +STATUS_BEGIN = 2 +STATUS_SYNC = 3 +STATUS_ASYNC = 4 + +# This is a usefull mnemonic to check if the connection is in a transaction +STATUS_IN_TRANSACTION = STATUS_BEGIN + + +def register_adapter(typ, callable): + """Register 'callable' as an ISQLQuote adapter for type 'typ'.""" + adapters[(typ, ISQLQuote)] = callable + +__all__ = [ k for k in locals().keys() if not k.startswith('_') ] diff --git a/trunk/psycopg2/lib/extras.py b/trunk/psycopg2/lib/extras.py new file mode 100644 index 0000000..847bdb7 --- /dev/null +++ b/trunk/psycopg2/lib/extras.py @@ -0,0 +1,235 @@ +"""Miscellaneous goodies for psycopg2 + +This module is a generic place used to hold little helper functions +and classes untill a better place in the distribution is found. +""" +# psycopg/extras.py - miscellaneous extra goodies for psycopg +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import os +import time + +try: + import logging +except: + logging = None + +from psycopg2.extensions import cursor as _cursor +from psycopg2.extensions import connection as _connection +from psycopg2.extensions import register_adapter as _RA +from psycopg2.extensions import adapt as _A + + +class DictConnection(_connection): + """A connection that uses DictCursor automatically.""" + def cursor(self): + return _connection.cursor(self, cursor_factory=DictCursor) + +class DictCursor(_cursor): + """A cursor that keeps a list of column name -> index mappings.""" + + __query_executed = 0 + + def execute(self, query, vars=None, async=0): + self.row_factory = DictRow + self.index = {} + self.__query_executed = 1 + return _cursor.execute(self, query, vars, async) + + def callproc(self, procname, vars=None): + self.row_factory = DictRow + self.index = {} + self.__query_executed = 1 + return _cursor.callproc(self, procname, vars) + + def _build_index(self): + if self.__query_executed == 1 and self.description: + for i in range(len(self.description)): + self.index[self.description[i][0]] = i + self.__query_executed = 0 + + def fetchone(self): + res = _cursor.fetchone(self) + if self.__query_executed: + self._build_index() + return res + + def fetchmany(self, size=None): + res = _cursor.fetchmany(self, size) + if self.__query_executed: + self._build_index() + return res + + def fetchall(self): + res = _cursor.fetchall(self) + if self.__query_executed: + self._build_index() + return res + + def next(self): + res = _cursor.fetchone(self) + if res is None: + raise StopIteration() + if self.__query_executed: + self._build_index() + return res + +class DictRow(list): + """A row object that allow by-colun-name access to data.""" + + def __init__(self, cursor): + self._index = cursor.index + self[:] = [None] * len(cursor.description) + + def __getitem__(self, x): + if type(x) != int: + x = self._index[x] + return list.__getitem__(self, x) + + def items(self): + res = [] + for n, v in self._index.items(): + res.append((n, list.__getitem__(self, v))) + return res + + def keys(self): + return self._index.keys() + + def values(self): + return tuple(self[:]) + + def has_key(self, x): + return self._index.has_key(x) + + def get(self, x, default=None): + try: + return self[x] + except: + return default + + +class SQL_IN(object): + """Adapt any iterable to an SQL quotable object.""" + + def __init__(self, seq): + self._seq = seq + + def prepare(self, conn): + self._conn = conn + + def getquoted(self): + # this is the important line: note how every object in the + # list is adapted and then how getquoted() is called on it + pobjs = [_A(o) for o in self._seq] + for obj in pobjs: + if hasattr(obj, 'prepare'): + obj.prepare(self._conn) + qobjs = [str(o.getquoted()) for o in pobjs] + return '(' + ', '.join(qobjs) + ')' + + __str__ = getquoted + +_RA(tuple, SQL_IN) + + +class LoggingConnection(_connection): + """A connection that logs all queries to a file or logger object.""" + + def initialize(self, logobj): + """Initialize the connection to log to `logobj`. + + The `logobj` parameter can be an open file object or a Logger instance + from the standard logging module. + """ + self._logobj = logobj + if logging and isinstance(logobj, logging.Logger): + self.log = self._logtologger + else: + self.log = self._logtofile + + def filter(self, msg, curs): + """Filter the query before logging it. + + This is the method to overwrite to filter unwanted queries out of the + log or to add some extra data to the output. The default implementation + just does nothing. + """ + return msg + + def _logtofile(self, msg, curs): + msg = self.filter(msg, curs) + if msg: self._logobj.write(msg + os.linesep) + + def _logtologger(self, msg, curs): + msg = self.filter(msg, curs) + if msg: self._logobj.debug(msg) + + def _check(self): + if not hasattr(self, '_logobj'): + raise self.ProgrammingError( + "LoggingConnection object has not been initialize()d") + + def cursor(self): + self._check() + return _connection.cursor(self, cursor_factory=LoggingCursor) + +class LoggingCursor(_cursor): + """A cursor that logs queries using its connection logging facilities.""" + + def execute(self, query, vars=None, async=0): + try: + return _cursor.execute(self, query, vars, async) + finally: + self.connection.log(self.query, self) + + def callproc(self, procname, vars=None): + try: + return _cursor.callproc(self, procname, vars) + finally: + self.connection.log(self.query, self) + + +class MinTimeLoggingConnection(LoggingConnection): + """A connection that logs queries based on execution time. + + This is just an example of how to sub-class LoggingConnection to provide + some extra filtering for the logged queries. Both the `.inizialize()` and + `.filter()` methods are overwritten to make sure that only queries + executing for more than `mintime` ms are logged. + + Note that this connection uses the specialized cursor MinTimeLoggingCursor. + """ + def initialize(self, logobj, mintime=0): + LoggingConnection.initialize(self, logobj) + self._mintime = mintime + + def filter(self, msg, curs): + t = (time.time() - curs.timestamp) * 1000 + if t > self._mintime: + return msg + os.linesep + " (execution time: %d ms)" % t + + def cursor(self): + self._check() + return _connection.cursor(self, cursor_factory=MinTimeLoggingCursor) + +class MinTimeLoggingCursor(LoggingCursor): + """The cursor sub-class companion to MinTimeLoggingConnection.""" + + def execute(self, query, vars=None, async=0): + self.timestamp = time.time() + return LoggingCursor.execute(self, query, vars, async) + + def callproc(self, procname, vars=None): + self.timestamp = time.time() + return LoggingCursor.execute(self, procname, var) diff --git a/trunk/psycopg2/lib/pool.py b/trunk/psycopg2/lib/pool.py new file mode 100644 index 0000000..0468db6 --- /dev/null +++ b/trunk/psycopg2/lib/pool.py @@ -0,0 +1,236 @@ +"""Connection pooling for psycopg2 + +This module implements thread-safe (and not) connection pools. +""" +# psycopg/pool.py - pooling code for psycopg +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import psycopg2 + +try: + import logging + # do basic initialization if the module is not already initialized + logging.basicConfig(level=logging.INFO, + format='%(asctime)s %(levelname)s %(message)s') + # create logger object for psycopg2 module and sub-modules + _logger = logging.getLogger("psycopg2") + def dbg(*args): + _logger.debug("psycopg2", ' '.join([str(x) for x in args])) + try: + import App # does this make sure that we're running in Zope? + _logger.info("installed. Logging using Python logging module") + except: + _logger.debug("installed. Logging using Python logging module") + +except ImportError: + from zLOG import LOG, DEBUG, INFO + def dbg(*args): + LOG('ZPsycopgDA', DEBUG, "", + ' '.join([str(x) for x in args])+'\n') + LOG('ZPsycopgDA', INFO, "Installed", "Logging using Zope's zLOG\n") + +except: + import sys + def dbg(*args): + sys.stderr.write(' '.join(args)+'\n') + + +class PoolError(psycopg2.Error): + pass + + +class AbstractConnectionPool(object): + """Generic key-based pooling code.""" + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the connection pool. + + New 'minconn' connections are created immediately calling 'connfunc' + with given parameters. The connection pool will support a maximum of + about 'maxconn' connections. + """ + self.minconn = minconn + self.maxconn = maxconn + self.closed = False + + self._args = args + self._kwargs = kwargs + + self._pool = [] + self._used = {} + self._rused = {} # id(conn) -> key map + self._keys = 0 + + for i in range(self.minconn): + self._connect() + + def _connect(self, key=None): + """Create a new connection and assign it to 'key' if not None.""" + conn = psycopg2.connect(*self._args, **self._kwargs) + if key is not None: + self._used[key] = conn + self._rused[id(conn)] = key + else: + self._pool.append(conn) + return conn + + def _getkey(self): + """Return a new unique key.""" + self._keys += 1 + return self._keys + + def _getconn(self, key=None): + """Get a free connection and assign it to 'key' if not None.""" + if self.closed: raise PoolError("connection pool is closed") + if key is None: key = self._getkey() + + if self._used.has_key(key): + return self._used[key] + + if self._pool: + self._used[key] = conn = self._pool.pop() + self._rused[id(conn)] = key + return conn + else: + if len(self._used) == self.maxconn: + raise PoolError("connection pool exausted") + return self._connect(key) + + def _putconn(self, conn, key=None, close=False): + """Put away a connection.""" + if self.closed: raise PoolError("connection pool is closed") + if key is None: key = self._rused[id(conn)] + + if not key: + raise PoolError("trying to put unkeyed connection") + + if len(self._pool) < self.minconn and not close: + self._pool.append(conn) + else: + conn.close() + + # here we check for the presence of key because it can happen that a + # thread tries to put back a connection after a call to close + if not self.closed or key in self._used: + del self._used[key] + del self._rused[id(conn)] + + def _closeall(self): + """Close all connections. + + Note that this can lead to some code fail badly when trying to use + an already closed connection. If you call .closeall() make sure + your code can deal with it. + """ + if self.closed: raise PoolError("connection pool is closed") + for conn in self._pool + list(self._used.values()): + try: + print "Closing connection", conn + conn.close() + except: + pass + self.closed = True + + +class SimpleConnectionPool(AbstractConnectionPool): + """A connection pool that can't be shared across different threads.""" + + getconn = AbstractConnectionPool._getconn + putconn = AbstractConnectionPool._putconn + closeall = AbstractConnectionPool._closeall + + +class ThreadedConnectionPool(AbstractConnectionPool): + """A connection pool that works with the threading module.""" + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the threading lock.""" + import threading + AbstractConnectionPool.__init__( + self, minconn, maxconn, *args, **kwargs) + self._lock = threading.Lock() + + def getconn(self, key=None): + """Get a free connection and assign it to 'key' if not None.""" + self._lock.acquire() + try: + return self._getconn(key) + finally: + self._lock.release() + + def putconn(self, conn=None, key=None, close=False): + """Put away an unused connection.""" + self._lock.acquire() + try: + self._putconn(conn, key, close) + finally: + self._lock.release() + + def closeall(self): + """Close all connections (even the one currently in use.)""" + self._lock.acquire() + try: + self._closeall() + finally: + self._lock.release() + + +class PersistentConnectionPool(AbstractConnectionPool): + """A pool that assigns persistent connections to different threads. + + Note that this connection pool generates by itself the required keys + using the current thread id. This means that untill a thread put away + a connection it will always get the same connection object by successive + .getconn() calls. This also means that a thread can't use more than one + single connection from the pool. + """ + + def __init__(self, minconn, maxconn, *args, **kwargs): + """Initialize the threading lock.""" + import threading + AbstractConnectionPool.__init__( + self, minconn, maxconn, *args, **kwargs) + self._lock = threading.Lock() + + # we we'll need the thread module, to determine thread ids, so we + # import it here and copy it in an instance variable + import thread + self.__thread = thread + + def getconn(self): + """Generate thread id and return a connection.""" + key = self.__thread.get_ident() + self._lock.acquire() + try: + return self._getconn(key) + finally: + self._lock.release() + + def putconn(self, conn=None, close=False): + """Put away an unused connection.""" + key = self.__thread.get_ident() + self._lock.acquire() + try: + if not conn: conn = self._used[key] + self._putconn(conn, key, close) + finally: + self._lock.release() + + def closeall(self): + """Close all connections (even the one currently in use.)""" + self._lock.acquire() + try: + self._closeall() + finally: + self._lock.release() diff --git a/trunk/psycopg2/lib/psycopg1.py b/trunk/psycopg2/lib/psycopg1.py new file mode 100644 index 0000000..d539888 --- /dev/null +++ b/trunk/psycopg2/lib/psycopg1.py @@ -0,0 +1,87 @@ +"""psycopg 1.1.x compatibility module + +This module uses the new style connection and cursor types to build a psycopg +1.1.1.x compatibility layer. It should be considered a temporary hack to run +old code while porting to psycopg 2. Import it as follows:: + + from psycopg2 import psycopg1 as psycopg +""" +# psycopg/psycopg1.py - psycopg 1.1.x compatibility module +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import _psycopg as _2psycopg +from psycopg2.extensions import cursor as _2cursor +from psycopg2.extensions import connection as _2connection + +from psycopg2 import * +del connect + + +def connect(*args, **kwargs): + """connect(dsn, ...) -> new psycopg 1.1.x compatible connection object""" + kwargs['connection_factory'] = connection + conn = _2psycopg.connect(*args, **kwargs) + conn.set_isolation_level(2) + return conn + +class connection(_2connection): + """psycopg 1.1.x connection.""" + + def cursor(self): + """cursor() -> new psycopg 1.1.x compatible cursor object""" + return _2connection.cursor(self, cursor_factory=cursor) + + def autocommit(self, on_off=1): + """autocommit(on_off=1) -> switch autocommit on (1) or off (0)""" + if on_off > 0: + self.set_isolation_level(0) + else: + self.set_isolation_level(2) + + +class cursor(_2cursor): + """psycopg 1.1.x cursor. + + Note that this cursor implements the exact procedure used by psycopg 1 to + build dictionaries out of result rows. The DictCursor in the + psycopg.extras modules implements a much better and faster algorithm. + """ + + def __build_dict(self, row): + res = {} + for i in range(len(self.description)): + res[self.description[i][0]] = row[i] + return res + + def dictfetchone(self): + row = _2cursor.fetchone(self) + if row: + return self.__build_dict(row) + else: + return row + + def dictfetchmany(self, size): + res = [] + rows = _2cursor.fetchmany(self, size) + for row in rows: + res.append(self.__build_dict(row)) + return res + + def dictfetchall(self): + res = [] + rows = _2cursor.fetchall(self) + for row in rows: + res.append(self.__build_dict(row)) + return res + diff --git a/trunk/psycopg2/lib/tz.py b/trunk/psycopg2/lib/tz.py new file mode 100644 index 0000000..e521b6d --- /dev/null +++ b/trunk/psycopg2/lib/tz.py @@ -0,0 +1,100 @@ +"""tzinfo implementations for psycopg2 + +This module holds two different tzinfo implementations that can be used as +the 'tzinfo' argument to datetime constructors, directly passed to psycopg +functions or used to set the .tzinfo_factory attribute in cursors. +""" +# psycopg/tz.py - tzinfo implementation +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import datetime +import time + + +ZERO = datetime.timedelta(0) + +class FixedOffsetTimezone(datetime.tzinfo): + """Fixed offset in minutes east from UTC. + + This is exactly the implementation found in Python 2.3.x documentation, + with a small change to the __init__ method to allow for pickling and a + default name in the form 'sHH:MM' ('s' is the sign.) + """ + _name = None + _offset = ZERO + + def __init__(self, offset=None, name=None): + if offset is not None: + self._offset = datetime.timedelta(minutes = offset) + if name is not None: + self._name = name + + def utcoffset(self, dt): + return self._offset + + def tzname(self, dt): + if self._name is not None: + return self._name + else: + seconds = self._offset.seconds + self._offset.days * 86400 + hours, seconds = divmod(seconds, 3600) + minutes = seconds/60 + if minutes: + return "%+03d:%d" % (hours, minutes) + else: + return "%+03d" % hours + + def dst(self, dt): + return ZERO + + +STDOFFSET = datetime.timedelta(seconds = -time.timezone) +if time.daylight: + DSTOFFSET = datetime.timedelta(seconds = -time.altzone) +else: + DSTOFFSET = STDOFFSET +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(datetime.tzinfo): + """Platform idea of local timezone. + + This is the exact implementation from the Pyhton 2.3 documentation. + """ + + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = time.mktime(tt) + tt = time.localtime(stamp) + return tt.tm_isdst > 0 + +LOCAL = LocalTimezone() + +# TODO: pre-generate some interesting time zones? diff --git a/trunk/psycopg2/psycopg/adapter_asis.c b/trunk/psycopg2/psycopg/adapter_asis.c new file mode 100644 index 0000000..75ee0e4 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_asis.c @@ -0,0 +1,227 @@ +/* adapter_asis.c - adapt types as they are + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_asis.h" +#include "psycopg/microprotocols_proto.h" + +/** the AsIs object **/ + +static PyObject * +asis_str(asisObject *self) +{ + if (self->wrapped == Py_None) { + return PyString_FromString("NULL"); + } + else { + return PyObject_Str(self->wrapped); + } +} + +PyObject * +asis_getquoted(asisObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return asis_str(self); +} + +PyObject * +asis_conform(asisObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the AsIs object */ + +/* object member list */ + +static struct PyMemberDef asisObject_members[] = { + {"adapted", T_OBJECT, offsetof(asisObject, wrapped), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef asisObject_methods[] = { + {"getquoted", (PyCFunction)asis_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted string"}, + {"__conform__", (PyCFunction)asis_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +asis_setup(asisObject *self, PyObject *obj) +{ + Dprintf("asis_setup: init asis object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("asis_setup: good asis object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +asis_dealloc(PyObject* obj) +{ + asisObject *self = (asisObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("asis_dealloc: deleted asis object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +asis_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *o; + + if (!PyArg_ParseTuple(args, "O", &o)) + return -1; + + return asis_setup((asisObject *)obj, o); +} + +static PyObject * +asis_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +asis_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +asis_repr(asisObject *self) +{ + return PyString_FromFormat("", self); +} + + +/* object type */ + +#define asisType_doc \ +"AsIs(str) -> new AsIs adapter object" + +PyTypeObject asisType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.AsIs", + sizeof(asisObject), + 0, + asis_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + + (reprfunc)asis_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)asis_str, /*tp_str*/ + + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + asisType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + asisObject_methods, /*tp_methods*/ + asisObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + asis_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + asis_new, /*tp_new*/ + (freefunc)asis_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_AsIs(PyObject *module, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O", &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&asisType, "O", obj); +} diff --git a/trunk/psycopg2/psycopg/adapter_asis.h b/trunk/psycopg2/psycopg/adapter_asis.h new file mode 100644 index 0000000..9495c58 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_asis.h @@ -0,0 +1,51 @@ +/* adapter_asis.h - definition for the psycopg AsIs type wrapper + * + * Copyright (C) 2003-2005 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_ASIS_H +#define PSYCOPG_ASIS_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject asisType; + +typedef struct { + PyObject HEAD; + + /* this is the real object we wrap */ + PyObject *wrapped; + +} asisObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_AsIs(PyObject *module, PyObject *args); +#define psyco_AsIs_doc \ + "AsIs(obj) -> new AsIs wrapper object" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_ASIS_H) */ diff --git a/trunk/psycopg2/psycopg/adapter_binary.c b/trunk/psycopg2/psycopg/adapter_binary.c new file mode 100644 index 0000000..0fc8101 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_binary.c @@ -0,0 +1,382 @@ +/* adapter_binary.c - Binary objects + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/adapter_binary.h" +#include "psycopg/microprotocols_proto.h" + +/** the quoting code */ + +#ifndef PSYCOPG_OWN_QUOTING +static unsigned char * +binary_escape(unsigned char *from, unsigned int from_length, + unsigned int *to_length, PGconn *conn) +{ +#if PG_MAJOR_VERSION > 8 || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION > 1) || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION == 1 && PG_PATCH_VERSION >= 4) + if (conn) + return PQescapeByteaConn(conn, from, from_length, to_length); + else +#endif + return PQescapeBytea(from, from_length, to_length); +} +#else +static unsigned char * +binary_escape(unsigned char *from, unsigned int from_length, + unsigned int *to_length, PGconn *conn) +{ + unsigneed char *quoted, *chptr, *newptr; + int i, space, new_space; + + space = from_length + 2; + + Py_BEGIN_ALLOW_THREADS; + + quoted = (unsigned char*)calloc(space, sizeof(char)); + if (quoted == NULL) return NULL; + + chptr = quoted; + + for (i=0; i < len; i++) { + if (chptr - quoted > space - 6) { + new_space = space * ((space) / (i + 1)) + 2 + 6; + if (new_space - space < 1024) space += 1024; + else space = new_space; + newptr = (unsigned char *)realloc(quoted, space); + if (newptr == NULL) { + free(quoted); + return NULL; + } + /* chptr has to be moved to the new location*/ + chptr = newptr + (chptr - quoted); + quoted = newptr; + Dprintf("binary_escape: reallocated %i bytes at %p", space,quoted); + } + if (from[i]) { + if (from[i] >= ' ' && from[i] <= '~') { + if (from[i] == '\'') { + *chptr = '\''; + chptr++; + *chptr = '\''; + chptr++; + } + else if (from[i] == '\\') { + memcpy(chptr, "\\\\\\\\", 4); + chptr += 4; + } + else { + /* leave it as it is if ascii printable */ + *chptr = from[i]; + chptr++; + } + } + else { + unsigned char c; + + /* escape to octal notation \nnn */ + *chptr++ = '\\'; + *chptr++ = '\\'; + c = from[i]; + *chptr = ((c >> 6) & 0x07) + 0x30; chptr++; + *chptr = ((c >> 3) & 0x07) + 0x30; chptr++; + *chptr = ( c & 0x07) + 0x30; chptr++; + } + } + else { + /* escape null as \\000 */ + memcpy(chptr, "\\\\000", 5); + chptr += 5; + } + } + *chptr = '\0'; + + Py_END_ALLOW_THREADS; + + *to_size = chptr - quoted + 1; + return quoted; +} +#endif + +/* binary_quote - do the quote process on plain and unicode strings */ + +static PyObject * +binary_quote(binaryObject *self) +{ + char *to; + const char *buffer; + int buffer_len; + size_t len = 0; + + /* if we got a plain string or a buffer we escape it and save the buffer */ + if (PyString_Check(self->wrapped) || PyBuffer_Check(self->wrapped)) { + /* escape and build quoted buffer */ + PyObject_AsCharBuffer(self->wrapped, &buffer, &buffer_len); + + to = (char *)binary_escape((unsigned char*)buffer, buffer_len, &len, + self->conn ? ((connectionObject*)self->conn)->pgconn : NULL); + if (to == NULL) { + PyErr_NoMemory(); + return NULL; + } + + if (len > 0) + self->buffer = PyString_FromFormat("'%s'", to); + else + self->buffer = PyString_FromString("''"); + PQfreemem(to); + } + + /* if the wrapped object is not a string or a buffer, this is an error */ + else { + PyErr_SetString(PyExc_TypeError, "can't escape non-string object"); + return NULL; + } + + return self->buffer; +} + +/* binary_str, binary_getquoted - return result of quoting */ + +static PyObject * +binary_str(binaryObject *self) +{ + if (self->buffer == NULL) { + binary_quote(self); + } + Py_XINCREF(self->buffer); + return self->buffer; +} + +PyObject * +binary_getquoted(binaryObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return binary_str(self); +} + +PyObject * +binary_prepare(binaryObject *self, PyObject *args) +{ + connectionObject *conn; + + if (!PyArg_ParseTuple(args, "O", &conn)) + return NULL; + + Py_XDECREF(self->conn); + if (conn) { + self->conn = (PyObject*)conn; + Py_INCREF(self->conn); + } + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject * +binary_conform(binaryObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the Binary object **/ + +/* object member list */ + +static struct PyMemberDef binaryObject_members[] = { + {"adapted", T_OBJECT, offsetof(binaryObject, wrapped), RO}, + {"buffer", T_OBJECT, offsetof(binaryObject, buffer), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef binaryObject_methods[] = { + {"getquoted", (PyCFunction)binary_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted binary string"}, + {"prepare", (PyCFunction)binary_prepare, METH_VARARGS, + "prepare(conn) -> prepare for binary encoding using conn"}, + {"__conform__", (PyCFunction)binary_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +binary_setup(binaryObject *self, PyObject *str) +{ + Dprintf("binary_setup: init binary object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->buffer = NULL; + self->conn = NULL; + self->wrapped = str; + Py_INCREF(self->wrapped); + + Dprintf("binary_setup: good binary object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +binary_dealloc(PyObject* obj) +{ + binaryObject *self = (binaryObject *)obj; + + Py_XDECREF(self->wrapped); + Py_XDECREF(self->buffer); + Py_XDECREF(self->conn); + + Dprintf("binary_dealloc: deleted binary object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +binary_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *str; + + if (!PyArg_ParseTuple(args, "O", &str)) + return -1; + + return binary_setup((binaryObject *)obj, str); +} + +static PyObject * +binary_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +binary_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +binary_repr(binaryObject *self) +{ + return PyString_FromFormat("", self); +} + +/* object type */ + +#define binaryType_doc \ +"Binary(buffer) -> new binary object" + +PyTypeObject binaryType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.Binary", + sizeof(binaryObject), + 0, + binary_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)binary_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)binary_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + binaryType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + binaryObject_methods, /*tp_methods*/ + binaryObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + binary_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + binary_new, /*tp_new*/ + (freefunc)binary_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_Binary(PyObject *module, PyObject *args) +{ + PyObject *str; + + if (!PyArg_ParseTuple(args, "O", &str)) + return NULL; + + return PyObject_CallFunction((PyObject *)&binaryType, "O", str); +} diff --git a/trunk/psycopg2/psycopg/adapter_binary.h b/trunk/psycopg2/psycopg/adapter_binary.h new file mode 100644 index 0000000..262a72d --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_binary.h @@ -0,0 +1,53 @@ +/* adapter_binary.h - definition for the Binary type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_BINARY_H +#define PSYCOPG_BINARY_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject binaryType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + PyObject *buffer; + PyObject *conn; +} binaryObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_Binary(PyObject *module, PyObject *args); +#define psyco_Binary_doc \ + "Binary(buffer) -> new binary object\n\n" \ + "Build an object capable to hold a bynary string value." + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_BINARY_H) */ diff --git a/trunk/psycopg2/psycopg/adapter_datetime.c b/trunk/psycopg2/psycopg/adapter_datetime.c new file mode 100644 index 0000000..6409cef --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_datetime.c @@ -0,0 +1,461 @@ +/* adapter_datetime.c - python date/time objects + * + * Copyright (C) 2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_datetime.h" +#include "psycopg/microprotocols_proto.h" + + +/* the pointer to the datetime module API is initialized by the module init + code, we just need to grab it */ +extern PyObject* pyDateTimeModuleP; +extern PyObject *pyDateTypeP; +extern PyObject *pyTimeTypeP; +extern PyObject *pyDateTimeTypeP; +extern PyObject *pyDeltaTypeP; + +extern PyObject *pyPsycopgTzModule; +extern PyObject *pyPsycopgTzLOCAL; + +/* datetime_str, datetime_getquoted - return result of quoting */ + +static PyObject * +pydatetime_str(pydatetimeObject *self) +{ + if (self->type <= PSYCO_DATETIME_TIMESTAMP) { + PyObject *res = NULL; + PyObject *iso = PyObject_CallMethod(self->wrapped, "isoformat", NULL); + if (iso) { + res = PyString_FromFormat("'%s'", PyString_AsString(iso)); + Py_DECREF(iso); + } + return res; + } + else { + PyDateTime_Delta *obj = (PyDateTime_Delta*)self->wrapped; + + char buffer[8]; + int i; + int a = obj->microseconds; + + for (i=0; i < 6 ; i++) { + buffer[5-i] = '0' + (a % 10); + a /= 10; + } + buffer[6] = '\0'; + + return PyString_FromFormat("'%d days %d.%s seconds'", + obj->days, obj->seconds, buffer); + } +} + +PyObject * +pydatetime_getquoted(pydatetimeObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return pydatetime_str(self); +} + +PyObject * +pydatetime_conform(pydatetimeObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the DateTime wrapper object **/ + +/* object member list */ + +static struct PyMemberDef pydatetimeObject_members[] = { + {"adapted", T_OBJECT, offsetof(pydatetimeObject, wrapped), RO}, + {"type", T_INT, offsetof(pydatetimeObject, type), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef pydatetimeObject_methods[] = { + {"getquoted", (PyCFunction)pydatetime_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL date/time"}, + {"__conform__", (PyCFunction)pydatetime_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +pydatetime_setup(pydatetimeObject *self, PyObject *obj, int type) +{ + Dprintf("pydatetime_setup: init datetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->type = type; + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("pydatetime_setup: good pydatetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +pydatetime_dealloc(PyObject* obj) +{ + pydatetimeObject *self = (pydatetimeObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("mpydatetime_dealloc: deleted pydatetime object at %p, " + "refcnt = %d", obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +pydatetime_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *dt; + int type = -1; /* raise an error if type was not passed! */ + + if (!PyArg_ParseTuple(args, "O|i", &dt, &type)) + return -1; + + return pydatetime_setup((pydatetimeObject *)obj, dt, type); +} + +static PyObject * +pydatetime_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +pydatetime_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +pydatetime_repr(pydatetimeObject *self) +{ + return PyString_FromFormat("", + self); +} + +/* object type */ + +#define pydatetimeType_doc \ +"datetime(datetime, type) -> new datetime wrapper object" + +PyTypeObject pydatetimeType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.datetime", + sizeof(pydatetimeObject), + 0, + pydatetime_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)pydatetime_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)pydatetime_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + pydatetimeType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + pydatetimeObject_methods, /*tp_methods*/ + pydatetimeObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + pydatetime_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + pydatetime_new, /*tp_new*/ + (freefunc)pydatetime_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +#ifdef PSYCOPG_DEFAULT_PYDATETIME + +PyObject * +psyco_Date(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + int year, month, day; + + PyObject* obj = NULL; + + if (!PyArg_ParseTuple(args, "iii", &year, &month, &day)) + return NULL; + + obj = PyObject_CallFunction(pyDateTypeP, "iii", year, month, day); + + if (obj) { + res = PyObject_CallFunction((PyObject *)&pydatetimeType, + "Oi", obj, PSYCO_DATETIME_DATE); + Py_DECREF(obj); + } + + return res; +} + +PyObject * +psyco_Time(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + PyObject *tzinfo = NULL; + int hours, minutes=0; + double micro, seconds=0.0; + + PyObject* obj = NULL; + + if (!PyArg_ParseTuple(args, "iid|O", &hours, &minutes, &seconds, + &tzinfo)) + return NULL; + + micro = (seconds - floor(seconds)) * 1000000.0; + + if (tzinfo == NULL) + obj = PyObject_CallFunction(pyTimeTypeP, "iiii", + hours, minutes, (int)round(seconds), (int)round(micro)); + else + obj = PyObject_CallFunction(pyTimeTypeP, "iiiiO", + hours, minutes, (int)round(seconds), (int)round(micro), tzinfo); + + if (obj) { + res = PyObject_CallFunction((PyObject *)&pydatetimeType, + "Oi", obj, PSYCO_DATETIME_TIME); + Py_DECREF(obj); + } + + return res; +} + +PyObject * +psyco_Timestamp(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + PyObject *tzinfo = NULL; + int year, month, day; + int hour=0, minute=0; /* default to midnight */ + double micro, second=0.0; + + PyObject* obj = NULL; + + if (!PyArg_ParseTuple(args, "lii|iidO", &year, &month, &day, + &hour, &minute, &second, &tzinfo)) + return NULL; + + micro = (second - floor(second)) * 1000000.0; + + if (tzinfo == NULL) + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiii", + year, month, day, hour, minute, (int)round(second), + (int)round(micro)); + else + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiiiO", + year, month, day, hour, minute, (int)round(second), + (int)round(micro), tzinfo); + + if (obj) { + res = PyObject_CallFunction((PyObject *)&pydatetimeType, + "Oi", obj, PSYCO_DATETIME_TIMESTAMP); + Py_DECREF(obj); + } + + return res; +} + +PyObject * +psyco_DateFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + struct tm tm; + time_t t; + double ticks; + + if (!PyArg_ParseTuple(args, "d", &ticks)) + return NULL; + + t = (time_t)round(ticks); + if (localtime_r(&t, &tm)) { + args = Py_BuildValue("iii", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday); + if (args) { + res = psyco_Date(self, args); + Py_DECREF(args); + } + } + return res; +} + +PyObject * +psyco_TimeFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + struct tm tm; + time_t t; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + t = (time_t)round(ticks); + if (localtime_r(&t, &tm)) { + args = Py_BuildValue("iid", tm.tm_hour, tm.tm_min, (double)tm.tm_sec); + if (args) { + res = psyco_Time(self, args); + Py_DECREF(args); + } + } + return res; +} + +PyObject * +psyco_TimestampFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res = NULL; + struct tm tm; + time_t t; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + t = (time_t)round(ticks); + if (localtime_r(&t, &tm)) { + args = Py_BuildValue("iiiiidO", + tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, + tm.tm_hour, tm.tm_min, (double)tm.tm_sec, + pyPsycopgTzLOCAL); + if (args) { + res = psyco_Timestamp(self, args); + Py_DECREF(args); + } + } + return res; +} + +#endif + +PyObject * +psyco_DateFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyDateTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_DATE); +} + +PyObject * +psyco_TimeFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyTimeTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_TIME); +} + +PyObject * +psyco_TimestampFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyDateTimeTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_TIMESTAMP); +} + +PyObject * +psyco_IntervalFromPy(PyObject *self, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O!", pyDeltaTypeP, &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pydatetimeType, "Oi", obj, + PSYCO_DATETIME_INTERVAL); +} diff --git a/trunk/psycopg2/psycopg/adapter_datetime.h b/trunk/psycopg2/psycopg/adapter_datetime.h new file mode 100644 index 0000000..a32bb8d --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_datetime.h @@ -0,0 +1,107 @@ +/* adapter_datetime.h - definition for the python date/time types + * + * Copyright (C) 2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_DATETIME_H +#define PSYCOPG_DATETIME_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject pydatetimeType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + int type; +#define PSYCO_DATETIME_TIME 0 +#define PSYCO_DATETIME_DATE 1 +#define PSYCO_DATETIME_TIMESTAMP 2 +#define PSYCO_DATETIME_INTERVAL 3 + +} pydatetimeObject; + + +/* functions exported to psycopgmodule.c */ +#ifdef PSYCOPG_DEFAULT_PYDATETIME + +extern PyObject *psyco_Date(PyObject *module, PyObject *args); +#define psyco_Date_doc \ + "Date(year, month, day) -> new date\n\n" \ + "Build an object holding a date value." + +extern PyObject *psyco_Time(PyObject *module, PyObject *args); +#define psyco_Time_doc \ + "Time(hour, minutes, seconds, tzinfo=None) -> new time\n\n" \ + "Build an object holding a time value." + +extern PyObject *psyco_Timestamp(PyObject *module, PyObject *args); +#define psyco_Timestamp_doc \ + "Timestamp(year, month, day, hour, minutes, seconds, tzinfo=None) -> new timestamp\n\n" \ + "Build an object holding a timestamp value." + +extern PyObject *psyco_DateFromTicks(PyObject *module, PyObject *args); +#define psyco_DateFromTicks_doc \ + "DateFromTicks(ticks) -> new date\n\n" \ + "Build an object holding a date value from the given ticks value.\n\n" \ + "Ticks are the number of seconds since the epoch; see the documentation " \ + "of the standard Python time module for details)." + +extern PyObject *psyco_TimeFromTicks(PyObject *module, PyObject *args); +#define psyco_TimeFromTicks_doc \ + "TimeFromTicks(ticks) -> new time\n\n" \ + "Build an object holding a time value from the given ticks value.\n\n" \ + "Ticks are the number of seconds since the epoch; see the documentation " \ + "of the standard Python time module for details)." + +extern PyObject *psyco_TimestampFromTicks(PyObject *module, PyObject *args); +#define psyco_TimestampFromTicks_doc \ + "TimestampFromTicks(ticks) -> new timestamp\n\n" \ + "Build an object holding a timestamp value from the given ticks value.\n\n" \ + "Ticks are the number of seconds since the epoch; see the documentation " \ + "of the standard Python time module for details)." + +#endif /* PSYCOPG_DEFAULT_PYDATETIME */ + +extern PyObject *psyco_DateFromPy(PyObject *module, PyObject *args); +#define psyco_DateFromPy_doc \ + "DateFromPy(datetime.date) -> new wrapper" + +extern PyObject *psyco_TimeFromPy(PyObject *module, PyObject *args); +#define psyco_TimeFromPy_doc \ + "TimeFromPy(datetime.time) -> new wrapper" + +extern PyObject *psyco_TimestampFromPy(PyObject *module, PyObject *args); +#define psyco_TimestampFromPy_doc \ + "TimestampFromPy(datetime.datetime) -> new wrapper" + +extern PyObject *psyco_IntervalFromPy(PyObject *module, PyObject *args); +#define psyco_IntervalFromPy_doc \ + "IntervalFromPy(datetime.timedelta) -> new wrapper" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_DATETIME_H) */ diff --git a/trunk/psycopg2/psycopg/adapter_list.c b/trunk/psycopg2/psycopg/adapter_list.c new file mode 100644 index 0000000..29ef116 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_list.c @@ -0,0 +1,297 @@ +/* adapter_list.c - python list objects + * + * Copyright (C) 2004-2005 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_list.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" + + +/* list_str, list_getquoted - return result of quoting */ + +static PyObject * +list_quote(listObject *self) +{ + /* adapt the list by calling adapt() recursively and then wrapping + everything into "ARRAY[]" */ + PyObject *tmp = NULL, *str = NULL, *joined = NULL, *res = NULL; + int i, len; + + len = PyList_GET_SIZE(self->wrapped); + + /* empty arrays are converted to NULLs (still searching for a way to + insert an empty array in postgresql */ + if (len == 0) return PyString_FromString("'{}'"); + + tmp = PyTuple_New(len); + + for (i=0; iwrapped, i), + (connectionObject*)self->connection); + if (quoted == NULL) goto error; + + /* here we don't loose a refcnt: SET_ITEM does not change the + reference count and we are just transferring ownership of the tmp + object to the tuple */ + PyTuple_SET_ITEM(tmp, i, quoted); + } + + /* now that we have a tuple of adapted objects we just need to join them + and put "ARRAY[] around the result */ + str = PyString_FromString(", "); + joined = PyObject_CallMethod(str, "join", "(O)", tmp); + if (joined == NULL) goto error; + + res = PyString_FromFormat("ARRAY[%s]", PyString_AsString(joined)); + + error: + Py_XDECREF(tmp); + Py_XDECREF(str); + Py_XDECREF(joined); + return res; +} + +PyObject * +list_str(listObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return list_quote(self); +} + +PyObject * +list_getquoted(listObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return list_quote(self); +} + +PyObject * +list_prepare(listObject *self, PyObject *args) +{ + connectionObject *conn; + + if (!PyArg_ParseTuple(args, "O", &conn)) + return NULL; + + /* note that we don't copy the encoding from the connection, but take a + reference to it; we'll need it during the recursive adapt() call (the + encoding is here for a future expansion that will make .getquoted() + work even without a connection to the backend. */ + Py_XDECREF(self->connection); + self->connection = (PyObject*)conn; + Py_INCREF(self->connection); + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject * +list_conform(listObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the DateTime wrapper object **/ + +/* object member list */ + +static struct PyMemberDef listObject_members[] = { + {"adapted", T_OBJECT, offsetof(listObject, wrapped), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef listObject_methods[] = { + {"getquoted", (PyCFunction)list_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL date/time"}, + {"prepare", (PyCFunction)list_prepare, METH_VARARGS, + "prepare(conn) -> set encoding to conn->encoding"}, + {"__conform__", (PyCFunction)list_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +list_setup(listObject *self, PyObject *obj, char *enc) +{ + Dprintf("list_setup: init list object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + if (!PyList_Check(obj)) + return -1; + + /* FIXME: remove this orrible strdup */ + if (enc) self->encoding = strdup(enc); + + self->connection = NULL; + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("list_setup: good list object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +list_dealloc(PyObject* obj) +{ + listObject *self = (listObject *)obj; + + Py_XDECREF(self->wrapped); + Py_XDECREF(self->connection); + if (self->encoding) free(self->encoding); + + Dprintf("list_dealloc: deleted list object at %p, " + "refcnt = %d", obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +list_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *l; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &l, &enc)) + return -1; + + return list_setup((listObject *)obj, l, enc); +} + +static PyObject * +list_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +list_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +list_repr(listObject *self) +{ + return PyString_FromFormat("", self); +} + +/* object type */ + +#define listType_doc \ +"List(list) -> new list wrapper object" + +PyTypeObject listType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.List", + sizeof(listObject), + 0, + list_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)list_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)list_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + listType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + listObject_methods, /*tp_methods*/ + listObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + list_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + list_new, /*tp_new*/ + (freefunc)list_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_List(PyObject *module, PyObject *args) +{ + PyObject *str; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &str, &enc)) + return NULL; + + return PyObject_CallFunction((PyObject *)&listType, "Os", str, enc); +} diff --git a/trunk/psycopg2/psycopg/adapter_list.h b/trunk/psycopg2/psycopg/adapter_list.h new file mode 100644 index 0000000..71b4286 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_list.h @@ -0,0 +1,49 @@ +/* adapter_list.h - definition for the python list types + * + * Copyright (C) 2004-2005 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_LIST_H +#define PSYCOPG_LIST_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject listType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + PyObject *connection; + char *encoding; +} listObject; + +extern PyObject *psyco_List(PyObject *module, PyObject *args); +#define psyco_List_doc \ + "List(list, enc) -> new quoted list" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_LIST_H) */ diff --git a/trunk/psycopg2/psycopg/adapter_mxdatetime.c b/trunk/psycopg2/psycopg/adapter_mxdatetime.c new file mode 100644 index 0000000..3b23148 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_mxdatetime.c @@ -0,0 +1,446 @@ +/* adapter_mxdatetime.c - mx date/time objects + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_mxdatetime.h" +#include "psycopg/microprotocols_proto.h" + +/* the pointer to the mxDateTime API is initialized by the module init code, + we just need to grab it */ +extern mxDateTimeModule_APIObject *mxDateTimeP; + + +/* mxdatetime_str, mxdatetime_getquoted - return result of quoting */ + +static PyObject * +mxdatetime_str(mxdatetimeObject *self) +{ + PyObject *str = NULL, *res = NULL; + + switch (self->type) { + + case PSYCO_MXDATETIME_DATE: + case PSYCO_MXDATETIME_TIMESTAMP: + str = PyObject_Str(self->wrapped); + + /* given the limitation of the mx.DateTime module that uses the same + type for both date and timestamp values we need to do some black + magic and make sure we're not using an adapt()ed timestamp as a + simple date */ + if (strncmp(&(PyString_AsString(str)[11]), "00:00:00.000", 12) == 0) { + PyObject *tmp = + PyString_FromStringAndSize(PyString_AsString(str), 10); + Py_DECREF(str); + str = tmp; + } + break; + + case PSYCO_MXDATETIME_TIME: + case PSYCO_MXDATETIME_INTERVAL: + str = PyObject_Str(self->wrapped); + + /* given the limitation of the mx.DateTime module that uses the same + type for both time and delta values we need to do some black magic + and make sure we're not using an adapt()ed interval as a simple + time */ + if (PyString_Size(str) > 8 && PyString_AsString(str)[8] == ':') { + mxDateTimeDeltaObject *obj = (mxDateTimeDeltaObject*)self->wrapped; + + char buffer[8]; + int i, j, x; + + double ss = obj->hour*3600.0 + obj->minute*60.0 + obj->second; + int us = (int)((ss - floor(ss))*1000000); + + for (i=1000000, j=0; i > 0 ; i /= 10) { + x = us/i; + us -= x*i; + buffer[j++] = '0'+x; + } + buffer[j] = '\0'; + + res = PyString_FromFormat("'%ld days %d.%s seconds'", + obj->day, (int)round(ss), buffer); + } + break; + } + + if (str != NULL && res == NULL) { + res = PyString_FromFormat("'%s'", PyString_AsString(str)); + } + Py_XDECREF(str); + + return res; +} + +PyObject * +mxdatetime_getquoted(mxdatetimeObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return mxdatetime_str(self); +} + +PyObject * +mxdatetime_conform(mxdatetimeObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the MxDateTime object **/ + +/* object member list */ + +static struct PyMemberDef mxdatetimeObject_members[] = { + {"adapted", T_OBJECT, offsetof(mxdatetimeObject, wrapped), RO}, + {"type", T_INT, offsetof(mxdatetimeObject, type), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef mxdatetimeObject_methods[] = { + {"getquoted", (PyCFunction)mxdatetime_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL date/time"}, + {"__conform__", (PyCFunction)mxdatetime_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +mxdatetime_setup(mxdatetimeObject *self, PyObject *obj, int type) +{ + Dprintf("mxdatetime_setup: init mxdatetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->type = type; + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("mxdatetime_setup: good mxdatetime object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +mxdatetime_dealloc(PyObject* obj) +{ + mxdatetimeObject *self = (mxdatetimeObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("mxdatetime_dealloc: deleted mxdatetime object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +mxdatetime_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *mx; + int type = -1; /* raise an error if type was not passed! */ + + if (!PyArg_ParseTuple(args, "O|i", &mx, &type)) + return -1; + + return mxdatetime_setup((mxdatetimeObject *)obj, mx, type); +} + +static PyObject * +mxdatetime_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +mxdatetime_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +mxdatetime_repr(mxdatetimeObject *self) +{ + return PyString_FromFormat("", + self); +} + +/* object type */ + +#define mxdatetimeType_doc \ +"MxDateTime(mx, type) -> new mx.DateTime wrapper object" + +PyTypeObject mxdatetimeType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.MxDateTime", + sizeof(mxdatetimeObject), + 0, + mxdatetime_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)mxdatetime_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)mxdatetime_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + mxdatetimeType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + mxdatetimeObject_methods, /*tp_methods*/ + mxdatetimeObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + mxdatetime_init, /*tp_init*/ + PyType_GenericAlloc, /*tp_alloc*/ + mxdatetime_new, /*tp_new*/ + (freefunc)mxdatetime_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +#ifdef PSYCOPG_DEFAULT_MXDATETIME + +PyObject * +psyco_Date(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + int year, month, day; + + if (!PyArg_ParseTuple(args, "iii", &year, &month, &day)) + return NULL; + + mx = mxDateTimeP->DateTime_FromDateAndTime(year, month, day, 0, 0, 0.0); + if (mx == NULL) return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_DATE); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_Time(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + int hours, minutes=0; + double seconds=0.0; + + if (!PyArg_ParseTuple(args, "iid", &hours, &minutes, &seconds)) + return NULL; + + mx = mxDateTimeP->DateTimeDelta_FromTime(hours, minutes, seconds); + if (mx == NULL) return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIME); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_Timestamp(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + int year, month, day; + int hour=0, minute=0; /* default to midnight */ + double second=0.0; + + if (!PyArg_ParseTuple(args, "lii|iid", &year, &month, &day, + &hour, &minute, &second)) + return NULL; + + mx = mxDateTimeP->DateTime_FromDateAndTime(year, month, day, + hour, minute, second); + if (mx == NULL) return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIMESTAMP); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_DateFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res, *mx; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + if (!(mx = mxDateTimeP->DateTime_FromTicks(ticks))) + return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_DATE); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_TimeFromTicks(PyObject *self, PyObject *args) +{ + PyObject *res, *mx, *dt; + double ticks; + + if (!PyArg_ParseTuple(args,"d", &ticks)) + return NULL; + + if (!(dt = mxDateTimeP->DateTime_FromTicks(ticks))) + return NULL; + + if (!(mx = mxDateTimeP->DateTimeDelta_FromDaysAndSeconds( + 0, ((mxDateTimeObject*)dt)->abstime))) + { + Py_DECREF(dt); + return NULL; + } + + Py_DECREF(dt); + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIME); + Py_DECREF(mx); + return res; +} + +PyObject * +psyco_TimestampFromTicks(PyObject *self, PyObject *args) +{ + PyObject *mx, *res; + double ticks; + + if (!PyArg_ParseTuple(args, "d", &ticks)) + return NULL; + + if (!(mx = mxDateTimeP->DateTime_FromTicks(ticks))) + return NULL; + + res = PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIMESTAMP); + Py_DECREF(mx); + return res; +} + +#endif + +PyObject * +psyco_DateFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTime_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_DATE); +} + +PyObject * +psyco_TimeFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTimeDelta_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIME); +} + +PyObject * +psyco_TimestampFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTime_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_TIMESTAMP); +} + +PyObject * +psyco_IntervalFromMx(PyObject *self, PyObject *args) +{ + PyObject *mx; + + if (!PyArg_ParseTuple(args, "O!", mxDateTimeP->DateTime_Type, &mx)) + return NULL; + + return PyObject_CallFunction((PyObject *)&mxdatetimeType, "Oi", mx, + PSYCO_MXDATETIME_INTERVAL); +} diff --git a/trunk/psycopg2/psycopg/adapter_mxdatetime.h b/trunk/psycopg2/psycopg/adapter_mxdatetime.h new file mode 100644 index 0000000..c485707 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_mxdatetime.h @@ -0,0 +1,94 @@ +/* adapter_mxdatetime.h - definition for the mx date/time types + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_MXDATETIME_H +#define PSYCOPG_MXDATETIME_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject mxdatetimeType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + int type; +#define PSYCO_MXDATETIME_TIME 0 +#define PSYCO_MXDATETIME_DATE 1 +#define PSYCO_MXDATETIME_TIMESTAMP 2 +#define PSYCO_MXDATETIME_INTERVAL 3 + +} mxdatetimeObject; + +/* functions exported to psycopgmodule.c */ +#ifdef PSYCOPG_DEFAULT_MXDATETIME + +extern PyObject *psyco_Date(PyObject *module, PyObject *args); +#define psyco_Date_doc \ + "Date(year, month, day) -> new date" + +extern PyObject *psyco_Time(PyObject *module, PyObject *args); +#define psyco_Time_doc \ + "Time(hour, minutes, seconds) -> new time" + +extern PyObject *psyco_Timestamp(PyObject *module, PyObject *args); +#define psyco_Timestamp_doc \ + "Time(year, month, day, hour, minutes, seconds) -> new timestamp" + +extern PyObject *psyco_DateFromTicks(PyObject *module, PyObject *args); +#define psyco_DateFromTicks_doc \ + "DateFromTicks(ticks) -> new date" + +extern PyObject *psyco_TimeFromTicks(PyObject *module, PyObject *args); +#define psyco_TimeFromTicks_doc \ + "TimeFromTicks(ticks) -> new time" + +extern PyObject *psyco_TimestampFromTicks(PyObject *module, PyObject *args); +#define psyco_TimestampFromTicks_doc \ + "TimestampFromTicks(ticks) -> new timestamp" + +#endif /* PSYCOPG_DEFAULT_MXDATETIME */ + +extern PyObject *psyco_DateFromMx(PyObject *module, PyObject *args); +#define psyco_DateFromMx_doc \ + "DateFromMx(mx) -> new date" + +extern PyObject *psyco_TimeFromMx(PyObject *module, PyObject *args); +#define psyco_TimeFromMx_doc \ + "TimeFromMx(mx) -> new time" + +extern PyObject *psyco_TimestampFromMx(PyObject *module, PyObject *args); +#define psyco_TimestampFromMx_doc \ + "TimestampFromMx(mx) -> new timestamp" + +extern PyObject *psyco_IntervalFromMx(PyObject *module, PyObject *args); +#define psyco_IntervalFromMx_doc \ + "IntervalFromMx(mx) -> new interval" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_MXDATETIME_H) */ diff --git a/trunk/psycopg2/psycopg/adapter_pboolean.c b/trunk/psycopg2/psycopg/adapter_pboolean.c new file mode 100644 index 0000000..fa70ad0 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_pboolean.c @@ -0,0 +1,238 @@ +/* adapter_pboolean.c - psycopg boolean type wrapper implementation + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/adapter_pboolean.h" +#include "psycopg/microprotocols_proto.h" + + +/** the Boolean object **/ + +static PyObject * +pboolean_str(pbooleanObject *self) +{ +#ifdef PSYCOPG_NEW_BOOLEAN + if (PyObject_IsTrue(self->wrapped)) { + return PyString_FromString("true"); + } + else { + return PyString_FromString("false"); + } +#else + if (PyObject_IsTrue(self->wrapped)) { + return PyString_FromString("'t'"); + } + else { + return PyString_FromString("'f'"); + } +#endif +} + +PyObject * +pboolean_getquoted(pbooleanObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return pboolean_str(self); +} + +PyObject * +pboolean_conform(pbooleanObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the Boolean object */ + +/* object member list */ + +static struct PyMemberDef pbooleanObject_members[] = { + {"adapted", T_OBJECT, offsetof(pbooleanObject, wrapped), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef pbooleanObject_methods[] = { + {"getquoted", (PyCFunction)pboolean_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted string"}, + {"__conform__", (PyCFunction)pboolean_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +pboolean_setup(pbooleanObject *self, PyObject *obj) +{ + Dprintf("pboolean_setup: init pboolean object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->wrapped = obj; + Py_INCREF(self->wrapped); + + Dprintf("pboolean_setup: good pboolean object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +pboolean_dealloc(PyObject* obj) +{ + pbooleanObject *self = (pbooleanObject *)obj; + + Py_XDECREF(self->wrapped); + + Dprintf("pboolean_dealloc: deleted pboolean object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +pboolean_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *o; + + if (!PyArg_ParseTuple(args, "O", &o)) + return -1; + + return pboolean_setup((pbooleanObject *)obj, o); +} + +static PyObject * +pboolean_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +pboolean_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +pboolean_repr(pbooleanObject *self) +{ + return PyString_FromFormat("", + self); +} + + +/* object type */ + +#define pbooleanType_doc \ +"Boolean(str) -> new Boolean adapter object" + +PyTypeObject pbooleanType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.Boolean", + sizeof(pbooleanObject), + 0, + pboolean_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + + (reprfunc)pboolean_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)pboolean_str, /*tp_str*/ + + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + pbooleanType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + pbooleanObject_methods, /*tp_methods*/ + pbooleanObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + pboolean_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + pboolean_new, /*tp_new*/ + (freefunc)pboolean_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_Boolean(PyObject *module, PyObject *args) +{ + PyObject *obj; + + if (!PyArg_ParseTuple(args, "O", &obj)) + return NULL; + + return PyObject_CallFunction((PyObject *)&pbooleanType, "O", obj); +} diff --git a/trunk/psycopg2/psycopg/adapter_pboolean.h b/trunk/psycopg2/psycopg/adapter_pboolean.h new file mode 100644 index 0000000..efdfe56 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_pboolean.h @@ -0,0 +1,51 @@ +/* adapter_pboolean.h - definition for the psycopg boolean type wrapper + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_PBOOLEAN_H +#define PSYCOPG_PBOOLEAN_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject pbooleanType; + +typedef struct { + PyObject HEAD; + + /* this is the real object we wrap */ + PyObject *wrapped; + +} pbooleanObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_Boolean(PyObject *module, PyObject *args); +#define psyco_Boolean_doc \ + "Boolean(obj) -> new boolean value" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_PBOOLEAN_H) */ diff --git a/trunk/psycopg2/psycopg/adapter_qstring.c b/trunk/psycopg2/psycopg/adapter_qstring.c new file mode 100644 index 0000000..2eaf7f3 --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_qstring.c @@ -0,0 +1,393 @@ +/* adapter_qstring.c - QuotedString objects + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/adapter_qstring.h" +#include "psycopg/microprotocols_proto.h" + + +/** the quoting code */ + +#ifndef PSYCOPG_OWN_QUOTING +static size_t +qstring_escape(char *to, char *from, size_t len, PGconn *conn) +{ +#if PG_MAJOR_VERSION > 8 || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION > 1) || \ + (PG_MAJOR_VERSION == 8 && PG_MINOR_VERSION == 1 && PG_PATCH_VERSION >= 4) + int err; + if (conn) + return PQescapeStringConn(conn, to, from, len, &err); + else +#endif + return PQescapeString(to, from, len); +} +#else +static size_t +qstring_escape(char *to, char *from, size_t len, PGconn *conn) +{ + int i, j; + + for (i=0, j=0; iencoding but if the encoding is not specified we don't know what + to do and we raise an exception */ + + /* TODO: we need a real translation table from postgres encoding names to + python ones here */ + + if (PyUnicode_Check(self->wrapped) && self->encoding) { + PyObject *enc = PyDict_GetItemString(psycoEncodings, self->encoding); + /* note that pgenc is a borrowed reference */ + + if (enc) { + char *s = PyString_AsString(enc); + Dprintf("qstring_quote: encoding unicode object to %s", s); + str = PyUnicode_AsEncodedString(self->wrapped, s, NULL); + Dprintf("qstring_quote: got encoded object at %p", str); + if (str == NULL) return NULL; + } + else { + /* can't find the right encoder, raise exception */ + PyErr_Format(InterfaceError, + "can't encode unicode string to %s", self->encoding); + return NULL; + } + } + + /* if the wrapped object is a simple string, we don't know how to + (re)encode it, so we pass it as-is */ + else if (PyString_Check(self->wrapped)) { + str = self->wrapped; + /* INCREF to make it ref-wise identical to unicode one */ + Py_INCREF(str); + } + + /* if the wrapped object is not a string, this is an error */ + else { + PyErr_SetString(PyExc_TypeError, + "can't quote non-string object (or missing encoding)"); + return NULL; + } + + /* encode the string into buffer */ + PyString_AsStringAndSize(str, &s, &len); + + buffer = (char *)PyMem_Malloc((len*2+3) * sizeof(char)); + if (buffer == NULL) { + Py_DECREF(str); + PyErr_NoMemory(); + return NULL; + } + + Py_BEGIN_ALLOW_THREADS; + len = qstring_escape(buffer+1, s, len, + self->conn ? ((connectionObject*)self->conn)->pgconn : NULL); + buffer[0] = '\'' ; buffer[len+1] = '\''; + Py_END_ALLOW_THREADS; + + self->buffer = PyString_FromStringAndSize(buffer, len+2); + PyMem_Free(buffer); + Py_DECREF(str); + + return self->buffer; +} + +/* qstring_str, qstring_getquoted - return result of quoting */ + +static PyObject * +qstring_str(qstringObject *self) +{ + if (self->buffer == NULL) { + qstring_quote(self); + } + Py_XINCREF(self->buffer); + return self->buffer; +} + +PyObject * +qstring_getquoted(qstringObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + return qstring_str(self); +} + +PyObject * +qstring_prepare(qstringObject *self, PyObject *args) +{ + connectionObject *conn; + + if (!PyArg_ParseTuple(args, "O", &conn)) + return NULL; + + /* we bother copying the encoding only if the wrapped string is unicode, + we don't need the encoding if that's not the case */ + if (PyUnicode_Check(self->wrapped)) { + if (self->encoding) free(self->encoding); + self->encoding = strdup(conn->encoding); + Dprintf("qstring_prepare: set encoding to %s", conn->encoding); + } + + Py_XDECREF(self->conn); + if (conn) { + self->conn = (PyObject*)conn; + Py_INCREF(self->conn); + } + + Py_INCREF(Py_None); + return Py_None; +} + +PyObject * +qstring_conform(qstringObject *self, PyObject *args) +{ + PyObject *res, *proto; + + if (!PyArg_ParseTuple(args, "O", &proto)) return NULL; + + if (proto == (PyObject*)&isqlquoteType) + res = (PyObject*)self; + else + res = Py_None; + + Py_INCREF(res); + return res; +} + +/** the QuotedString object **/ + +/* object member list */ + +static struct PyMemberDef qstringObject_members[] = { + {"adapted", T_OBJECT, offsetof(qstringObject, wrapped), RO}, + {"buffer", T_OBJECT, offsetof(qstringObject, buffer), RO}, + {"encoding", T_STRING, offsetof(qstringObject, encoding), RO}, + {NULL} +}; + +/* object method table */ + +static PyMethodDef qstringObject_methods[] = { + {"getquoted", (PyCFunction)qstring_getquoted, METH_VARARGS, + "getquoted() -> wrapped object value as SQL-quoted string"}, + {"prepare", (PyCFunction)qstring_prepare, METH_VARARGS, + "prepare(conn) -> set encoding to conn->encoding and store conn"}, + {"__conform__", (PyCFunction)qstring_conform, METH_VARARGS, NULL}, + {NULL} /* Sentinel */ +}; + +/* initialization and finalization methods */ + +static int +qstring_setup(qstringObject *self, PyObject *str, char *enc) +{ + Dprintf("qstring_setup: init qstring object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->buffer = NULL; + self->conn = NULL; + + /* FIXME: remove this orrible strdup */ + if (enc) self->encoding = strdup(enc); + + self->wrapped = str; + Py_INCREF(self->wrapped); + + Dprintf("qstring_setup: good qstring object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +qstring_dealloc(PyObject* obj) +{ + qstringObject *self = (qstringObject *)obj; + + Py_XDECREF(self->wrapped); + Py_XDECREF(self->buffer); + Py_XDECREF(self->conn); + + if (self->encoding) free(self->encoding); + + Dprintf("qstring_dealloc: deleted qstring object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +qstring_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *str; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &str, &enc)) + return -1; + + return qstring_setup((qstringObject *)obj, str, enc); +} + +static PyObject * +qstring_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +qstring_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +qstring_repr(qstringObject *self) +{ + return PyString_FromFormat("", + self); +} + +/* object type */ + +#define qstringType_doc \ +"QuotedString(str, enc) -> new quoted object with 'enc' encoding" + +PyTypeObject qstringType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.QuotedString", + sizeof(qstringObject), + 0, + qstring_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + + 0, /*tp_compare*/ + (reprfunc)qstring_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)qstring_str, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + + qstringType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + qstringObject_methods, /*tp_methods*/ + qstringObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + qstring_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + qstring_new, /*tp_new*/ + (freefunc)qstring_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + + +/** module-level functions **/ + +PyObject * +psyco_QuotedString(PyObject *module, PyObject *args) +{ + PyObject *str; + char *enc = "latin-1"; /* default encoding as in Python */ + + if (!PyArg_ParseTuple(args, "O|s", &str, &enc)) + return NULL; + + return PyObject_CallFunction((PyObject *)&qstringType, "Os", str, enc); +} diff --git a/trunk/psycopg2/psycopg/adapter_qstring.h b/trunk/psycopg2/psycopg/adapter_qstring.h new file mode 100644 index 0000000..544b32b --- /dev/null +++ b/trunk/psycopg2/psycopg/adapter_qstring.h @@ -0,0 +1,53 @@ +/* adapter_qstring.h - definition for the QuotedString type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_QSTRING_H +#define PSYCOPG_QSTRING_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject qstringType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + PyObject *buffer; + char *encoding; + + PyObject *conn; +} qstringObject; + +/* functions exported to psycopgmodule.c */ + +extern PyObject *psyco_QuotedString(PyObject *module, PyObject *args); +#define psyco_QuotedString_doc \ + "QuotedString(str, enc) -> new quoted string" + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_QSTRING_H) */ diff --git a/trunk/psycopg2/psycopg/config.h b/trunk/psycopg2/psycopg/config.h new file mode 100644 index 0000000..649fee8 --- /dev/null +++ b/trunk/psycopg2/psycopg/config.h @@ -0,0 +1,118 @@ +/* config.h - general config and Dprintf macro + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_CONFIG_H +#define PSYCOPG_CONFIG_H 1 + +/* debug printf-like function */ +#if defined( __GNUC__) && !defined(__APPLE__) +#ifdef PSYCOPG_DEBUG +#include +#include +#define Dprintf(fmt, args...) \ + fprintf(stderr, "[%d] " fmt "\n", getpid() , ## args) +#else +#define Dprintf(fmt, args...) +#endif +#else /* !__GNUC__ or __APPLE__ */ +#ifdef PSYCOPG_DEBUG +#include +static void Dprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + printf("\n"); +} +#else +static void Dprintf(const char *fmt, ...) {} +#endif +#endif + +/* pthreads work-arounds for mutilated operating systems */ +#if defined(_WIN32) || defined(__BEOS__) + +#ifdef _WIN32 +#include +#define pthread_mutex_t HANDLE +#define pthread_condvar_t HANDLE +#define pthread_mutex_lock(object) WaitForSingleObject(object, INFINITE) +#define pthread_mutex_unlock(object) ReleaseMutex(object) +#define pthread_mutex_destroy(ref) (CloseHandle(*(ref))) +/* convert pthread mutex to native mutex */ +static int pthread_mutex_init(pthread_mutex_t *mutex, void* fake) +{ + *mutex = CreateMutex(NULL, FALSE, NULL); + return 0; +} +#endif /* _WIN32 */ + +#ifdef __BEOS__ +#include +#define pthread_mutex_t sem_id +#define pthread_mutex_lock(object) acquire_sem(object) +#define pthread_mutex_unlock(object) release_sem(object) +#define pthread_mutex_destroy(ref) delete_sem(*ref) +static int pthread_mutex_init(pthread_mutex_t *mutex, void* fake) +{ + *mutex = create_sem(1, "psycopg_mutex"); + if (*mutex < B_OK) + return *mutex; + return 0; +} +#endif /* __BEOS__ */ + +#else /* pthread is available */ +#include +#endif + +/* to work around the fact that Windows does not have a gmtime_r function, or + a proper gmtime function */ +#ifdef _WIN32 +static struct tm *gmtime_r(time_t *t, struct tm *tm) +{ + tm = gmtime(t); + return tm; +} +static struct tm *localtime_r(time_t *t, struct tm *tm) +{ + tm = localtime(t); + return tm; +} +/* remove the inline keyword, since it doesn't work unless C++ file */ +#define inline +#endif + +#if defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__) +/* what's this, we have no round function either? */ +static double round(double num) +{ + return (num >= 0) ? floor(num + 0.5) : ceil(num - 0.5); +} +#endif + +/* postgresql < 7.4 does not have PQfreemem */ +#ifndef HAVE_PQFREEMEM +#define PQfreemem free +#endif + +#endif /* !defined(PSYCOPG_CONFIG_H) */ diff --git a/trunk/psycopg2/psycopg/connection.h b/trunk/psycopg2/psycopg/connection.h new file mode 100644 index 0000000..7010120 --- /dev/null +++ b/trunk/psycopg2/psycopg/connection.h @@ -0,0 +1,97 @@ +/* connection.h - definition for the psycopg connection type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_CONNECTION_H +#define PSYCOPG_CONNECTION_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* connection status */ +#define CONN_STATUS_READY 1 +#define CONN_STATUS_BEGIN 2 +#define CONN_STATUS_SYNC 3 +#define CONN_STATUS_ASYNC 4 + +extern PyTypeObject connectionType; + +typedef struct { + PyObject HEAD; + + pthread_mutex_t lock; /* the global connection lock */ + + char *dsn; /* data source name */ + char *critical; /* critical error on this connection */ + char *encoding; /* current backend encoding */ + + long int closed; /* 2 means connection has been closed */ + long int isolation_level; /* isolation level for this connection */ + long int mark; /* number of commits/rollbacks done so far */ + int status; /* status of the connection */ + int protocol; /* protocol version */ + + PGconn *pgconn; /* the postgresql connection */ + + PyObject *async_cursor; + + /* notice processing */ + PyObject *notice_list; + PyObject *notice_filter; + + /* notifies */ + PyObject *notifies; + + /* errors (DBAPI-2.0 extension) */ + PyObject *exc_Error; + PyObject *exc_Warning; + PyObject *exc_InterfaceError; + PyObject *exc_DatabaseError; + PyObject *exc_InternalError; + PyObject *exc_OperationalError; + PyObject *exc_ProgrammingError; + PyObject *exc_IntegrityError; + PyObject *exc_DataError; + PyObject *exc_NotSupportedError; + +} connectionObject; + +/* C-callable functions in connection_int.c and connection_ext.c */ +extern int conn_connect(connectionObject *self); +extern void conn_close(connectionObject *self); +extern int conn_commit(connectionObject *self); +extern int conn_rollback(connectionObject *self); +extern int conn_switch_isolation_level(connectionObject *self, int level); +extern int conn_set_client_encoding(connectionObject *self, char *enc); + +/* exception-raising macros */ +#define EXC_IF_CONN_CLOSED(self) if ((self)->closed > 0) { \ + PyErr_SetString(InterfaceError, "connection already closed"); \ + return NULL; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_CONNECTION_H) */ diff --git a/trunk/psycopg2/psycopg/connection_int.c b/trunk/psycopg2/psycopg/connection_int.c new file mode 100644 index 0000000..3e61ddf --- /dev/null +++ b/trunk/psycopg2/psycopg/connection_int.c @@ -0,0 +1,303 @@ +/* connection_int.c - code used by the connection object + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" +#include "psycopg/pqpath.h" + +/* conn_notice_callback - process notices */ + +void +conn_notice_callback(void *args, const char *message) +{ + connectionObject *self = (connectionObject *)args; + + Dprintf("conn_notice_callback: %s", message); + + /* unfortunately the old protocl return COPY FROM errors only as notices, + so we need to filter them looking for such errors */ + if (strncmp(message, "ERROR", 5) == 0) + pq_set_critical(self, message); + else + PyList_Append(self->notice_list, PyString_FromString(message)); +} + +/* conn_connect - execute a connection to the dataabase */ + +int +conn_connect(connectionObject *self) +{ + PGconn *pgconn; + PGresult *pgres; + char *data, *tmp; + int i; + + /* we need the initial date style to be ISO, for typecasters; if the user + later change it, she must know what she's doing... */ + const char *datestyle = "SET DATESTYLE TO 'ISO'"; + const char *encoding = "SHOW client_encoding"; + const char *isolevel = "SHOW default_transaction_isolation"; + + const char *lvl1a = "read uncommitted"; + const char *lvl1b = "read committed"; + const char *lvl2a = "repeatable read"; + const char *lvl2b = "serializable"; + + Py_BEGIN_ALLOW_THREADS; + pgconn = PQconnectdb(self->dsn); + Py_END_ALLOW_THREADS; + + Dprintf("conn_connect: new postgresql connection at %p", pgconn); + + if (pgconn == NULL) + { + Dprintf("conn_connect: PQconnectdb(%s) FAILED", self->dsn); + PyErr_SetString(OperationalError, "PQconnectdb() failed"); + return -1; + } + else if (PQstatus(pgconn) == CONNECTION_BAD) + { + Dprintf("conn_connect: PQconnectdb(%s) returned BAD", self->dsn); + PyErr_SetString(OperationalError, PQerrorMessage(pgconn)); + PQfinish(pgconn); + return -1; + } + + PQsetNoticeProcessor(pgconn, conn_notice_callback, (void*)self); + + Py_BEGIN_ALLOW_THREADS; + pgres = PQexec(pgconn, datestyle); + Py_END_ALLOW_THREADS; + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_COMMAND_OK ) { + PyErr_SetString(OperationalError, "can't set datestyle to ISO"); + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + CLEARPGRES(pgres); + + Py_BEGIN_ALLOW_THREADS; + pgres = PQexec(pgconn, encoding); + Py_END_ALLOW_THREADS; + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_TUPLES_OK) { + PyErr_SetString(OperationalError, "can't fetch client_encoding"); + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + tmp = PQgetvalue(pgres, 0, 0); + self->encoding = PyMem_Malloc(strlen(tmp)+1); + if (self->encoding == NULL) { + /* exception already set by PyMem_Malloc() */ + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + for (i=0 ; i < strlen(tmp) ; i++) + self->encoding[i] = toupper(tmp[i]); + self->encoding[i] = '\0'; + CLEARPGRES(pgres); + + Py_BEGIN_ALLOW_THREADS; + pgres = PQexec(pgconn, isolevel); + Py_END_ALLOW_THREADS; + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_TUPLES_OK) { + PyErr_SetString(OperationalError, + "can't fetch default_isolation_level"); + PQfinish(pgconn); + IFCLEARPGRES(pgres); + return -1; + } + data = PQgetvalue(pgres, 0, 0); + if ((strncmp(lvl1a, data, strlen(lvl1a)) == 0) + || (strncmp(lvl1b, data, strlen(lvl1b)) == 0)) + self->isolation_level = 1; + else if ((strncmp(lvl2a, data, strlen(lvl2a)) == 0) + || (strncmp(lvl2b, data, strlen(lvl2b)) == 0)) + self->isolation_level = 2; + else + self->isolation_level = 2; + CLEARPGRES(pgres); + + if (PQsetnonblocking(pgconn, 1) != 0) { + Dprintf("conn_connect: PQsetnonblocking() FAILED"); + PyErr_SetString(OperationalError, "PQsetnonblocking() failed"); + PQfinish(pgconn); + return -1; + } + +#ifdef HAVE_PQPROTOCOL3 + self->protocol = PQprotocolVersion(pgconn); +#else + self->protocol = 2; +#endif + Dprintf("conn_connect: using protocol %d", self->protocol); + + self->pgconn = pgconn; + return 0; +} + +/* conn_close - do anything needed to shut down the connection */ + +void +conn_close(connectionObject *self) +{ + /* sets this connection as closed even for other threads; also note that + we need to check the value of pgconn, because we get called even when + the connection fails! */ + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + self->closed = 1; + + /* execute a forced rollback on the connection (but don't check the + result, we're going to close the pq connection anyway */ + if (self->pgconn) { + pq_abort(self); + PQfinish(self->pgconn); + Dprintf("conn_close: PQfinish called"); + self->pgconn = NULL; + } + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + +} + +/* conn_commit - commit on a connection */ + +int +conn_commit(connectionObject *self) +{ + int res; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + res = pq_commit(self); + self->mark++; + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + return res; +} + +/* conn_rollback - rollback a connection */ + +int +conn_rollback(connectionObject *self) +{ + int res; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + res = pq_abort(self); + self->mark++; + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + return res; +} + +/* conn_switch_isolation_level - switch isolation level on the connection */ + +int +conn_switch_isolation_level(connectionObject *self, int level) +{ + int res = 0; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + /* if the current isolation level is > 0 we need to abort the current + transaction before changing; that all folks! */ + if (self->isolation_level != level && self->isolation_level > 0) { + res = pq_abort(self); + } + self->isolation_level = level; + self->mark++; + + Dprintf("conn_switch_isolation_level: switched to level %d", level); + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + return res; +} + +/* conn_set_client_encoding - switch client encoding on connection */ + +int +conn_set_client_encoding(connectionObject *self, char *enc) +{ + PGresult *pgres; + char query[48]; + int res = 0; + + /* TODO: check for async query here and raise error if necessary */ + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&self->lock); + + /* set encoding, no encoding string is longer than 24 bytes */ + PyOS_snprintf(query, 47, "SET client_encoding = '%s'", enc); + + /* abort the current transaction, to set the encoding ouside of + transactions */ + res = pq_abort(self); + + if (res == 0) { + pgres = PQexec(self->pgconn, query); + + if (pgres == NULL || PQresultStatus(pgres) != PGRES_COMMAND_OK ) { + res = -1; + } + else { + /* no error, we can proceeed and store the new encoding */ + if (self->encoding) free(self->encoding); + self->encoding = strdup(enc); + } + + IFCLEARPGRES(pgres); + } + + Dprintf("conn_set_client_encoding: set encoding to %s", self->encoding); + + pthread_mutex_unlock(&self->lock); + Py_END_ALLOW_THREADS; + + if (res == -1) + PyErr_Format(OperationalError, "can't set encoding to %s", enc); + + return res; +} diff --git a/trunk/psycopg2/psycopg/connection_type.c b/trunk/psycopg2/psycopg/connection_type.c new file mode 100644 index 0000000..f8cbd80 --- /dev/null +++ b/trunk/psycopg2/psycopg/connection_type.c @@ -0,0 +1,422 @@ +/* connection_type.c - python interface to connection objects + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" + +/** DBAPI methods **/ + +/* cursor method - allocate a new cursor */ + +#define psyco_conn_cursor_doc \ +"cursor(cursor_factory=extensions.cursor) -- new cursor\n\n" \ +"Return a new cursor.\n\nThe ``cursor_factory`` argument can be used to\n" \ +"create non-standard cursors by passing a class different from the\n" \ +"default. Note that the new class *should* be a sub-class of\n" \ +"`extensions.cursor`.\n\n" \ +":rtype: `extensions.cursor`" + +static PyObject * +psyco_conn_cursor(connectionObject *self, PyObject *args, PyObject *keywds) +{ + char *name = NULL; + PyObject *obj, *factory = NULL; + + static char *kwlist[] = {"name", "cursor_factory", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, keywds, "|sO", kwlist, + &name, &factory)) { + return NULL; + } + + EXC_IF_CONN_CLOSED(self); + + Dprintf("psyco_conn_cursor: new cursor for connection at %p", self); + Dprintf("psyco_conn_cursor: parameters: name = %s", name); + + if (factory == NULL) factory = (PyObject *)&cursorType; + if (name) + obj = PyObject_CallFunction(factory, "Os", self, name); + else + obj = PyObject_CallFunction(factory, "O", self); + + if (obj == NULL) return NULL; + if (PyObject_IsInstance(obj, (PyObject *)&cursorType) == 0) { + PyErr_SetString(PyExc_TypeError, + "cursor factory must be subclass of psycopg2._psycopg.cursor"); + Py_DECREF(obj); + return NULL; + } + + Dprintf("psyco_conn_cursor: new cursor at %p: refcnt = %d", + obj, obj->ob_refcnt); + return obj; +} + + +/* close method - close the connection and all related cursors */ + +#define psyco_conn_close_doc "close() -- Close the connection." + +static PyObject * +psyco_conn_close(connectionObject *self, PyObject *args) +{ + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "")) return NULL; + + Dprintf("psyco_conn_close: closing connection at %p", self); + conn_close(self); + Dprintf("psyco_conn_close: connection at %p closed", self); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* commit method - commit all changes to the database */ + +#define psyco_conn_commit_doc "commit() -- Commit all changes to database." + +static PyObject * +psyco_conn_commit(connectionObject *self, PyObject *args) +{ + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "")) return NULL; + + /* FIXME: check return status? */ + conn_commit(self); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* rollback method - roll back all changes done to the database */ + +#define psyco_conn_rollback_doc \ +"rollback() -- Roll back all changes done to database." + +static PyObject * +psyco_conn_rollback(connectionObject *self, PyObject *args) +{ + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "")) return NULL; + + /* FIXME: check return status? */ + conn_rollback(self); + + Py_INCREF(Py_None); + return Py_None; +} + + +#ifdef PSYCOPG_EXTENSIONS +/* set_isolation_level method - switch connection isolation level */ + +#define psyco_conn_set_isolation_level_doc \ +"set_isolation_level(level) -- Switch isolation level to ``level``." + +static PyObject * +psyco_conn_set_isolation_level(connectionObject *self, PyObject *args) +{ + int level = 1; + + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "i", &level)) return NULL; + + if (level < 0 || level > 2) { + PyErr_SetString(PyExc_ValueError, + "isolation level out of bounds (0,3)"); + return NULL; + } + + /* FIXME: check return status? */ + conn_switch_isolation_level(self, level); + + Py_INCREF(Py_None); + return Py_None; +} + + + +/* set_isolation_level method - switch connection isolation level */ + +#define psyco_conn_set_client_encoding_doc \ +"set_client_encoding(encoding) -- Set client encoding to ``encoding``." + +static PyObject * +psyco_conn_set_client_encoding(connectionObject *self, PyObject *args) +{ + char *enc = NULL; + + EXC_IF_CONN_CLOSED(self); + + if (!PyArg_ParseTuple(args, "s", &enc)) return NULL; + + if (conn_set_client_encoding(self, enc) == 0) { + Py_INCREF(Py_None); + return Py_None; + } + else { + return NULL; + } +} +#endif + + +/** the connection object **/ + + +/* object method list */ + +static struct PyMethodDef connectionObject_methods[] = { + {"cursor", (PyCFunction)psyco_conn_cursor, + METH_VARARGS|METH_KEYWORDS, psyco_conn_cursor_doc}, + {"close", (PyCFunction)psyco_conn_close, + METH_VARARGS, psyco_conn_close_doc}, + {"commit", (PyCFunction)psyco_conn_commit, + METH_VARARGS, psyco_conn_commit_doc}, + {"rollback", (PyCFunction)psyco_conn_rollback, + METH_VARARGS, psyco_conn_rollback_doc}, +#ifdef PSYCOPG_EXTENSIONS + {"set_isolation_level", (PyCFunction)psyco_conn_set_isolation_level, + METH_VARARGS, psyco_conn_set_isolation_level_doc}, + {"set_client_encoding", (PyCFunction)psyco_conn_set_client_encoding, + METH_VARARGS, psyco_conn_set_client_encoding_doc}, +#endif + {NULL} +}; + +/* object member list */ + +static struct PyMemberDef connectionObject_members[] = { + /* DBAPI-2.0 extensions (exception objects) */ + {"Error", T_OBJECT, + offsetof(connectionObject, exc_Error), RO, Error_doc}, + {"Warning", + T_OBJECT, offsetof(connectionObject, exc_Warning), RO, Warning_doc}, + {"InterfaceError", T_OBJECT, + offsetof(connectionObject, exc_InterfaceError), RO, + InterfaceError_doc}, + {"DatabaseError", T_OBJECT, + offsetof(connectionObject, exc_DatabaseError), RO, DatabaseError_doc}, + {"InternalError", T_OBJECT, + offsetof(connectionObject, exc_InternalError), RO, InternalError_doc}, + {"OperationalError", T_OBJECT, + offsetof(connectionObject, exc_OperationalError), RO, + OperationalError_doc}, + {"ProgrammingError", T_OBJECT, + offsetof(connectionObject, exc_ProgrammingError), RO, + ProgrammingError_doc}, + {"IntegrityError", T_OBJECT, + offsetof(connectionObject, exc_IntegrityError), RO, + IntegrityError_doc}, + {"DataError", T_OBJECT, + offsetof(connectionObject, exc_DataError), RO, DataError_doc}, + {"NotSupportedError", T_OBJECT, + offsetof(connectionObject, exc_NotSupportedError), RO, + NotSupportedError_doc}, +#ifdef PSYCOPG_EXTENSIONS + {"closed", T_LONG, offsetof(connectionObject, closed), RO, + "True if the connection is closed."}, + {"isolation_level", T_LONG, + offsetof(connectionObject, isolation_level), RO, + "The current isolation level."}, + {"encoding", T_STRING, offsetof(connectionObject, encoding), RO, + "The current client encoding."}, + {"notices", T_OBJECT, offsetof(connectionObject, notice_list), RO}, + {"notifies", T_OBJECT, offsetof(connectionObject, notifies), RO}, + {"dsn", T_STRING, offsetof(connectionObject, dsn), RO, + "The current connection string."}, + {"status", T_LONG, + offsetof(connectionObject, status), RO, + "The current transaction status."}, +#endif + {NULL} +}; + +/* initialization and finalization methods */ + +static int +connection_setup(connectionObject *self, char *dsn) +{ + Dprintf("connection_setup: init connection object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + + self->dsn = strdup(dsn); + self->notice_list = PyList_New(0); + self->notifies = PyList_New(0); + self->closed = 0; + self->status = CONN_STATUS_READY; + self->critical = NULL; + self->async_cursor = NULL; + self->pgconn = NULL; + self->mark = 0; + + pthread_mutex_init(&(self->lock), NULL); + + if (conn_connect(self) != 0) { + pthread_mutex_destroy(&(self->lock)); + Dprintf("connection_init: FAILED"); + return -1; + } + + Dprintf("connection_setup: good connection object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +connection_dealloc(PyObject* obj) +{ + connectionObject *self = (connectionObject *)obj; + + if (self->closed == 0) conn_close(self); + + if (self->dsn) free(self->dsn); + if (self->encoding) PyMem_Free(self->encoding); + if (self->critical) free(self->critical); + + Py_XDECREF(self->notice_list); + Py_XDECREF(self->notifies); + Py_XDECREF(self->async_cursor); + + pthread_mutex_destroy(&(self->lock)); + + Dprintf("connection_dealloc: deleted connection object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +connection_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + char *dsn; + + if (!PyArg_ParseTuple(args, "s", &dsn)) + return -1; + + return connection_setup((connectionObject *)obj, dsn); +} + +static PyObject * +connection_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +connection_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +connection_repr(connectionObject *self) +{ + return PyString_FromFormat( + "", + self, self->dsn, self->closed); +} + + +/* object type */ + +#define connectionType_doc \ +"connection(dsn, ...) -> new connection object\n\n" \ +":Groups:\n" \ +" * `DBAPI-2.0 errors`: Error, Warning, InterfaceError,\n" \ +" DatabaseError, InternalError, OperationalError,\n" \ +" ProgrammingError, IntegrityError, DataError, NotSupportedError" + +PyTypeObject connectionType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.connection", + sizeof(connectionObject), + 0, + connection_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + (reprfunc)connection_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)connection_repr, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + connectionType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + connectionObject_methods, /*tp_methods*/ + connectionObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + connection_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + connection_new, /*tp_new*/ + (freefunc)connection_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; diff --git a/trunk/psycopg2/psycopg/cursor.h b/trunk/psycopg2/psycopg/cursor.h new file mode 100644 index 0000000..5aab172 --- /dev/null +++ b/trunk/psycopg2/psycopg/cursor.h @@ -0,0 +1,103 @@ +/* cursor.h - definition for the psycopg cursor type + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_CURSOR_H +#define PSYCOPG_CURSOR_H 1 + +#include +#include + +#include "psycopg/connection.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject cursorType; + +typedef struct { + PyObject HEAD; + + connectionObject *conn; /* connection owning the cursor */ + + int closed:1; /* 1 if the cursor is closed */ + int notuples:1; /* 1 if the command was not a SELECT query */ + int needsfetch:1; /* 1 if a call to pq_fetch is pending */ + + long int rowcount; /* number of rows affected by last execute */ + long int columns; /* number of columns fetched from the db */ + long int arraysize; /* how many rows should fetchmany() return */ + long int row; /* the row counter for fetch*() operations */ + long int mark; /* transaction marker, copied from conn */ + + PyObject *description; /* read-only attribute: sequence of 7-item + sequences.*/ + + /* postgres connection stuff */ + PGresult *pgres; /* result of last query */ + PyObject *pgstatus; /* last message from the server after an execute */ + Oid lastoid; /* last oid from an insert or InvalidOid */ + + PyObject *casts; /* an array (tuple) of typecast functions */ + PyObject *caster; /* the current typecaster object */ + + PyObject *copyfile; /* file-like used during COPY TO/FROM ops */ + long int copysize; /* size of the copy buffer during COPY TO/FROM ops */ +#define DEFAULT_COPYSIZE 16384 + + PyObject *tuple_factory; /* factory for result tuples */ + PyObject *tzinfo_factory; /* factory for tzinfo objects */ + + PyObject *query; /* last query executed */ + + char *qattr; /* quoting attr, used when quoting strings */ + char *notice; /* a notice from the backend */ + char *name; /* this cursor name */ + + PyObject *string_types; /* a set of typecasters for string types */ + PyObject *binary_types; /* a set of typecasters for binary types */ + +} cursorObject; + +/* C-callable functions in cursor_int.c and cursor_ext.c */ +extern void curs_reset(cursorObject *self); + +/* exception-raising macros */ +#define EXC_IF_CURS_CLOSED(self) \ +if ((self)->closed || ((self)->conn && (self)->conn->closed)) { \ + PyErr_SetString(InterfaceError, "cursor already closed"); \ + return NULL; } + +#define EXC_IF_NO_TUPLES(self) \ +if ((self)->notuples && (self)->name == NULL) { \ + PyErr_SetString(ProgrammingError, "no results to fetch"); \ + return NULL; } + +#define EXC_IF_NO_MARK(self) \ +if ((self)->mark != (self)->conn->mark) { \ + PyErr_SetString(ProgrammingError, "named cursor isn't valid anymore"); \ + return NULL; } + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_CURSOR_H) */ diff --git a/trunk/psycopg2/psycopg/cursor_int.c b/trunk/psycopg2/psycopg/cursor_int.c new file mode 100644 index 0000000..8036268 --- /dev/null +++ b/trunk/psycopg2/psycopg/cursor_int.c @@ -0,0 +1,47 @@ +/* cursor_int.c - code used by the cursor object + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/psycopg.h" +#include "psycopg/cursor.h" +#include "psycopg/pqpath.h" + +/* curs_reset - reset the cursor to a clean state */ + +void +curs_reset(cursorObject *self) +{ + /* initialize some variables to default values */ + self->notuples = 1; + self->rowcount = -1; + self->row = 0; + + Py_XDECREF(self->description); + Py_INCREF(Py_None); + self->description = Py_None; + + Py_XDECREF(self->casts); + self->casts = NULL; +} diff --git a/trunk/psycopg2/psycopg/cursor_type.c b/trunk/psycopg2/psycopg/cursor_type.c new file mode 100644 index 0000000..73e4de6 --- /dev/null +++ b/trunk/psycopg2/psycopg/cursor_type.c @@ -0,0 +1,1553 @@ +/* cursor_type.c - python interface to cursor objects + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public Likcense + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/cursor.h" +#include "psycopg/connection.h" +#include "psycopg/pqpath.h" +#include "psycopg/typecast.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" +#include "pgversion.h" + +extern PyObject *pyPsycopgTzFixedOffsetTimezone; + + +/** DBAPI methods **/ + +/* close method - close the cursor */ + +#define psyco_curs_close_doc \ +"close() -- Close the cursor." + +static PyObject * +psyco_curs_close(cursorObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + EXC_IF_CURS_CLOSED(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "CLOSE %s", self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + } + + self->closed = 1; + Dprintf("psyco_curs_close: cursor at %p closed", self); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* execute method - executes a query */ + +/* mogrify a query string and build argument array or dict */ + +static int +_mogrify(PyObject *var, PyObject *fmt, connectionObject *conn, PyObject **new) +{ + PyObject *key, *value, *n, *item; + char *d, *c; + int index = 0, force = 0; + + /* from now on we'll use n and replace its value in *new only at the end, + just before returning. we also init *new to NULL to exit with an error + if we can't complete the mogrification */ + n = *new = NULL; + c = PyString_AsString(fmt); + + while(*c) { + /* handle plain percent symbol in format string */ + if (c[0] == '%' && c[1] == '%') { + c+=2; force = 1; + } + + /* if we find '%(' then this is a dictionary, we: + 1/ find the matching ')' and extract the key name + 2/ locate the value in the dictionary (or return an error) + 3/ mogrify the value into something usefull (quoting)... + 4/ ...and add it to the new dictionary to be used as argument + */ + else if (c[0] == '%' && c[1] == '(') { + + /* let's have d point the end of the argument */ + for (d = c + 2; *d && *d != ')'; d++); + + if (*d == ')') { + key = PyString_FromStringAndSize(c+2, d-c-2); + value = PyObject_GetItem(var, key); + /* key has refcnt 1, value the original value + 1 */ + + /* if value is NULL we did not find the key (or this is not a + dictionary): let python raise a KeyError */ + if (value == NULL) { + Py_DECREF(key); /* destroy key */ + Py_XDECREF(n); /* destroy n */ + return -1; + } + + Dprintf("_mogrify: value refcnt: %d (+1)", value->ob_refcnt); + + if (n == NULL) { + n = PyDict_New(); + } + + if ((item = PyObject_GetItem(n, key)) == NULL) { + PyObject *t = NULL; + + PyErr_Clear(); + + /* None is always converted to NULL; this is an + optimization over the adapting code and can go away in + the future if somebody finds a None adapter usefull. */ + if (value == Py_None) { + t = PyString_FromString("NULL"); + PyDict_SetItem(n, key, t); + /* t is a new object, refcnt = 1, key is at 2 */ + + /* if the value is None we need to substitute the + formatting char with 's' (FIXME: this should not be + necessary if we drop support for formats other than + %s!) */ + while (*d && !isalpha(*d)) d++; + if (*d) *d = 's'; + } + else { + t = microprotocol_getquoted(value, conn); + + if (t != NULL) { + PyDict_SetItem(n, key, t); + /* both key and t refcnt +1, key is at 2 now */ + } + else { + /* no adapter found, raise a BIG exception */ + Py_XDECREF(value); + Py_DECREF(n); + return -1; + } + } + + Py_XDECREF(t); /* t dies here */ + /* after the DECREF value has the original refcnt plus 1 + if it was added to the dictionary directly; good */ + Py_XDECREF(value); + } + else { + /* we have an item with one extra refcnt here, zap! */ + Py_DECREF(item); + } + Py_DECREF(key); /* key has the original refcnt now */ + Dprintf("_mogrify: after value refcnt: %d",value->ob_refcnt); + } + c = d; + } + + else if (c[0] == '%' && c[1] != '(') { + /* this is a format that expects a tuple; it is much easier, + because we don't need to check the old/new dictionary for + keys */ + + value = PySequence_GetItem(var, index); + /* value has refcnt inc'ed by 1 here */ + + /* if value is NULL this is not a sequence or the index is wrong; + anyway we let python set its own exception */ + if (value == NULL) { + Py_XDECREF(n); + return -1; + } + + if (n == NULL) { + n = PyTuple_New(PyObject_Length(var)); + } + + /* let's have d point just after the '%' */ + d = c+1; + + if (value == Py_None) { + PyTuple_SET_ITEM(n, index, PyString_FromString("NULL")); + while (*d && !isalpha(*d)) d++; + if (*d) *d = 's'; + Py_DECREF(value); + } + else { + PyObject *t = microprotocol_getquoted(value, conn); + + if (t != NULL) { + PyTuple_SET_ITEM(n, index, t); + Py_DECREF(value); + } + else { + Py_DECREF(n); + Py_DECREF(value); + return -1; + } + } + c = d; + index += 1; + } + else { + c++; + } + } + + if (force && n == NULL) + n = PyTuple_New(0); + *new = n; + + return 0; +} + +#define psyco_curs_execute_doc \ +"execute(query, vars=None, async=0) -- Execute query with bound vars." + +static int +_psyco_curs_execute(cursorObject *self, + PyObject *operation, PyObject *vars, long int async) +{ + int res; + PyObject *fquery, *cvt = NULL, *uoperation = NULL; + + pthread_mutex_lock(&(self->conn->lock)); + if (self->conn->async_cursor != NULL + && self->conn->async_cursor != (PyObject*)self) { + pthread_mutex_unlock(&(self->conn->lock)); + psyco_set_error(ProgrammingError, (PyObject*)self, + "asynchronous query already in execution", NULL, NULL); + return 0; + } + pthread_mutex_unlock(&(self->conn->lock)); + + if (!PyObject_IsTrue(operation)) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't execute an empty query", NULL, NULL); + return 0; + } + + if (PyUnicode_Check(operation)) { + PyObject *enc = PyDict_GetItemString(psycoEncodings, + self->conn->encoding); + /* enc is a borrowed reference, we won't decref it */ + + if (enc) { + operation = PyUnicode_AsEncodedString( + operation, PyString_AsString(enc), NULL); + + /* if there was an error during the encoding from unicode to the + target encoding we just let the exception propagate */ + if (operation == NULL) return 0; + + /* we clone operation in uoperation to be sure to free it later */ + uoperation = operation; + } + else { + PyErr_Format(InterfaceError, "can't encode unicode query to %s", + self->conn->encoding); + return 0; + } + } + else if (!PyString_Check(operation)) { + /* the operation is not unicode or string, raise an error */ + PyErr_SetString(PyExc_TypeError, + "argument 1 must be a string or unicode object"); + return 0; + } + + IFCLEARPGRES(self->pgres); + + if (self->query) { + Py_DECREF(self->query); + self->query = NULL; + } + + Dprintf("psyco_curs_execute: starting execution of new query"); + + /* here we are, and we have a sequence or a dictionary filled with + objects to be substituted (bound variables). we try to be smart and do + the right thing (i.e., what the user expects) */ + + if (vars && vars != Py_None) + { + if(_mogrify(vars, operation, self->conn, &cvt) == -1) { + Py_XDECREF(uoperation); + return 0; + } + } + + if (vars && cvt) { + /* if PyString_Format() return NULL an error occured: if the error is + a TypeError we need to check the exception.args[0] string for the + values: + + "not enough arguments for format string" + "not all arguments converted" + + and return the appropriate ProgrammingError. we do that by grabbing + the curren exception (we will later restore it if the type or the + strings do not match.) */ + + if (!(fquery = PyString_Format(operation, cvt))) { + PyObject *err, *arg, *trace; + int pe = 0; + + PyErr_Fetch(&err, &arg, &trace); + + if (err && PyErr_GivenExceptionMatches(err, PyExc_TypeError)) { + Dprintf("psyco_curs_execute: TypeError exception catched"); + PyErr_NormalizeException(&err, &arg, &trace); + + if (PyObject_HasAttrString(arg, "args")) { + PyObject *args = PyObject_GetAttrString(arg, "args"); + PyObject *str = PySequence_GetItem(args, 0); + char *s = PyString_AS_STRING(str); + + Dprintf("psyco_curs_execute: -> %s", s); + + if (!strcmp(s, "not enough arguments for format string") + || !strcmp(s, "not all arguments converted")) { + Dprintf("psyco_curs_execute: -> got a match"); + psyco_set_error(ProgrammingError, (PyObject*)self, + s, NULL, NULL); + pe = 1; + } + + Py_DECREF(args); + Py_DECREF(str); + } + } + + /* if we did not manage our own exception, restore old one */ + if (pe == 1) { + Py_XDECREF(err); Py_XDECREF(arg); Py_XDECREF(trace); + } + else { + PyErr_Restore(err, arg, trace); + } + Py_XDECREF(uoperation); + return 0; + } + + if (self->name != NULL) { + self->query = PyString_FromFormat( + "DECLARE %s CURSOR WITHOUT HOLD FOR %s", + self->name, PyString_AS_STRING(fquery)); + Py_DECREF(fquery); + } + else { + self->query = fquery; + } + + Dprintf("psyco_curs_execute: cvt->refcnt = %d", cvt->ob_refcnt); + Py_DECREF(cvt); + } + else { + if (self->name != NULL) { + self->query = PyString_FromFormat( + "DECLARE %s CURSOR WITHOUT HOLD FOR %s", + self->name, PyString_AS_STRING(operation)); + } + else { + Py_INCREF(operation); + self->query = operation; + } + } + + res = pq_execute(self, PyString_AS_STRING(self->query), async); + + Dprintf("psyco_curs_execute: res = %d, pgres = %p", res, self->pgres); + + Py_XDECREF(uoperation); + + return res == -1 ? 0 : 1; +} + +static PyObject * +psyco_curs_execute(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + long int async = 0; + PyObject *vars = NULL, *operation = NULL; + + static char *kwlist[] = {"query", "vars", "async", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|Oi", kwlist, + &operation, &vars, &async)) { + return NULL; + } + + if (self->name != NULL) { + if (self->query != Py_None) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't call .execute() on named cursors more than once", + NULL, NULL); + return NULL; + } + if (self->conn->isolation_level == 0) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't use a named cursor outside of transactions", NULL, NULL); + return NULL; + } + if (self->conn->mark != self->mark) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "named cursor isn't valid anymore", NULL, NULL); + return NULL; + } + } + + EXC_IF_CURS_CLOSED(self); + + if (_psyco_curs_execute(self, operation, vars, async)) { + Py_INCREF(Py_None); + return Py_None; + } + else { + return NULL; + } +} + +#define psyco_curs_executemany_doc \ +"executemany(query, vars_list) -- Execute many queries with bound vars." + +static PyObject * +psyco_curs_executemany(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *operation = NULL, *vars = NULL; + PyObject *v, *iter = NULL; + + static char *kwlist[] = {"query", "vars_list", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO", kwlist, + &operation, &vars)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (self->name != NULL) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't call .executemany() on named cursors", NULL, NULL); + return NULL; + } + + if (!PyIter_Check(vars)) { + vars = iter = PyObject_GetIter(vars); + if (iter == NULL) return NULL; + } + + while ((v = PyIter_Next(vars)) != NULL) { + if (_psyco_curs_execute(self, operation, v, 0) == 0) { + Py_DECREF(v); + return NULL; + } + else { + Py_DECREF(v); + } + } + Py_XDECREF(iter); + + Py_INCREF(Py_None); + return Py_None; +} + + +#ifdef PSYCOPG_EXTENSIONS +#define psyco_curs_mogrify_doc \ +"mogrify(query, vars=None) -> str -- Return query after vars binding." + +static PyObject * +psyco_curs_mogrify(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + PyObject *vars = NULL, *cvt = NULL, *operation = NULL; + PyObject *fquery; + + static char *kwlist[] = {"query", "vars", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", kwlist, + &operation, &vars)) { + return NULL; + } + + if (PyUnicode_Check(operation)) { + PyErr_SetString(NotSupportedError, + "unicode queries not yet supported"); + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + IFCLEARPGRES(self->pgres); + + /* note that we don't overwrite the last query executed on the cursor, we + just *return* the new query with bound variables + + TODO: refactor the common mogrification code (see psycopg_curs_execute + for comments, the code is amost identical) */ + + if (vars) + { + if(_mogrify(vars, operation, self->conn, &cvt) == -1) return NULL; + } + + if (vars && cvt) { + if (!(fquery = PyString_Format(operation, cvt))) { + PyObject *err, *arg, *trace; + int pe = 0; + + PyErr_Fetch(&err, &arg, &trace); + + if (err && PyErr_GivenExceptionMatches(err, PyExc_TypeError)) { + Dprintf("psyco_curs_execute: TypeError exception catched"); + PyErr_NormalizeException(&err, &arg, &trace); + + if (PyObject_HasAttrString(arg, "args")) { + PyObject *args = PyObject_GetAttrString(arg, "args"); + PyObject *str = PySequence_GetItem(args, 0); + char *s = PyString_AS_STRING(str); + + Dprintf("psyco_curs_execute: -> %s", s); + + if (!strcmp(s, "not enough arguments for format string") + || !strcmp(s, "not all arguments converted")) { + Dprintf("psyco_curs_execute: -> got a match"); + psyco_set_error(ProgrammingError, (PyObject*)self, + s, NULL, NULL); + pe = 1; + } + + Py_DECREF(args); + Py_DECREF(str); + } + } + + /* if we did not manage our own exception, restore old one */ + if (pe == 1) { + Py_XDECREF(err); Py_XDECREF(arg); Py_XDECREF(trace); + } + else { + PyErr_Restore(err, arg, trace); + } + return NULL; + } + + Dprintf("psyco_curs_execute: cvt->refcnt = %d, fquery->refcnt = %d", + cvt->ob_refcnt, fquery->ob_refcnt); + Py_DECREF(cvt); + } + else { + fquery = operation; + Py_INCREF(operation); + } + + return fquery; +} +#endif + + +/* fetchone method - fetch one row of results */ + +#define psyco_curs_fetchone_doc \ +"fetchone() -> tuple or None\n\n" \ +"Return the next row of a query result set in the form of a tuple (by\n" \ +"default) or using the sequence factory previously set in the\n" \ +"`row_factory` attribute. Return `None` when no more data is available.\n" + +static int +_psyco_curs_prefetch(cursorObject *self) +{ + int i = 0; + + /* check if the fetching cursor is the one that did the asynchronous query + and raise an exception if not */ + pthread_mutex_lock(&(self->conn->lock)); + if (self->conn->async_cursor != NULL + && self->conn->async_cursor != (PyObject*)self) { + pthread_mutex_unlock(&(self->conn->lock)); + psyco_set_error(ProgrammingError, (PyObject*)self, + "asynchronous fetch by wrong cursor", NULL, NULL); + return -2; + } + pthread_mutex_unlock(&(self->conn->lock)); + + if (self->pgres == NULL || self->needsfetch) { + self->needsfetch = 0; + Dprintf("_psyco_curs_prefetch: trying to fetch data"); + do { + i = pq_fetch(self); + Dprintf("_psycopg_curs_prefetch: result = %d", i); + } while(i == 1); + } + + Dprintf("_psyco_curs_prefetch: result = %d", i); + return i; +} + +static PyObject * +_psyco_curs_buildrow_fill(cursorObject *self, PyObject *res, + int row, int n, int istuple) +{ + int i, len; + unsigned char *str; + PyObject *val; + + for (i=0; i < n; i++) { + if (PQgetisnull(self->pgres, row, i)) { + str = NULL; + len = 0; + } + else { + str = (unsigned char*)PQgetvalue(self->pgres, row, i); + len = PQgetlength(self->pgres, row, i); + } + + Dprintf("_psyco_curs_buildrow: row %ld, element %d, len %i", + self->row, i, len); + + val = typecast_cast(PyTuple_GET_ITEM(self->casts, i), (char*)str, len, + (PyObject*)self); + + if (val) { + Dprintf("_psyco_curs_buildrow: val->refcnt = %d", val->ob_refcnt); + if (istuple) { + PyTuple_SET_ITEM(res, i, val); + } + else { + PySequence_SetItem(res, i, val); + Py_DECREF(val); + } + } + else { + /* an error occurred in the type system, we return NULL to raise + an exception. the typecast code should already have set the + exception type and text */ + Py_DECREF(res); + res = NULL; + break; + } + } + return res; +} + +static PyObject * +_psyco_curs_buildrow(cursorObject *self, int row) +{ + int n; + + n = PQnfields(self->pgres); + return _psyco_curs_buildrow_fill(self, PyTuple_New(n), row, n, 1); +} + +static PyObject * +_psyco_curs_buildrow_with_factory(cursorObject *self, int row) +{ + int n; + PyObject *res; + + n = PQnfields(self->pgres); + if ((res = PyObject_CallFunction(self->tuple_factory, "O", self))== NULL) + return NULL; + + return _psyco_curs_buildrow_fill(self, res, row, n, 0); +} + +PyObject * +psyco_curs_fetchone(cursorObject *self, PyObject *args) +{ + PyObject *res; + + if (args && !PyArg_ParseTuple(args, "")) return NULL; + + EXC_IF_CURS_CLOSED(self) + if (_psyco_curs_prefetch(self) < 0) return NULL; + EXC_IF_NO_TUPLES(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "FETCH FORWARD 1 FROM %s", self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + Dprintf("psyco_curs_fetchone: fetching row %ld", self->row); + Dprintf("psyco_curs_fetchone: rowcount = %ld", self->rowcount); + + if (self->row >= self->rowcount) { + /* we exausted available data: return None */ + Py_INCREF(Py_None); + return Py_None; + } + + if (self->tuple_factory == Py_None) + res = _psyco_curs_buildrow(self, self->row); + else + res = _psyco_curs_buildrow_with_factory(self, self->row); + + self->row++; /* move the counter to next line */ + + /* if the query was async aggresively free pgres, to allow + successive requests to reallocate it */ + if (self->row >= self->rowcount + && self->conn->async_cursor == (PyObject*)self) + IFCLEARPGRES(self->pgres); + + return res; +} + + +/* fetch many - fetch some results */ + +#define psyco_curs_fetchmany_doc \ +"fetchmany(size=self.arraysize) -> list of tuple\n\n" \ +"Return the next `size` rows of a query result set in the form of a list\n" \ +"of tuples (by default) or using the sequence factory previously set in\n" \ +"the `row_factory` attribute. Return `None` when no more data is available.\n" + +PyObject * +psyco_curs_fetchmany(cursorObject *self, PyObject *args, PyObject *kwords) +{ + int i; + PyObject *list, *res; + + long int size = self->arraysize; + static char *kwlist[] = {"size", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwords, "|l", kwlist, &size)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + if (_psyco_curs_prefetch(self) < 0) return NULL; + EXC_IF_NO_TUPLES(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "FETCH FORWARD %d FROM %s", + (int)size, self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + /* make sure size is not > than the available number of rows */ + if (size > self->rowcount - self->row || size < 0) { + size = self->rowcount - self->row; + } + + Dprintf("psyco_curs_fetchmany: size = %ld", size); + + if (size <= 0) { + return PyList_New(0); + } + + list = PyList_New(size); + + for (i = 0; i < size; i++) { + if (self->tuple_factory == Py_None) + res = _psyco_curs_buildrow(self, self->row); + else + res = _psyco_curs_buildrow_with_factory(self, self->row); + + self->row++; + + if (res == NULL) { + Py_DECREF(list); + return NULL; + } + + PyList_SET_ITEM(list, i, res); + } + + /* if the query was async aggresively free pgres, to allow + successive requests to reallocate it */ + if (self->row >= self->rowcount + && self->conn->async_cursor == (PyObject*)self) + IFCLEARPGRES(self->pgres); + + return list; +} + + +/* fetch all - fetch all results */ + +#define psyco_curs_fetchall_doc \ +"fetchall() -> list of tuple\n\n" \ +"Return all the remaining rows of a query result set.\n\n" \ +"Rows are returned in the form of a list of tuples (by default) or using\n" \ +"the sequence factory previously set in the `row_factory` attribute.\n" \ +"Return `None` when no more data is available.\n" + +PyObject * +psyco_curs_fetchall(cursorObject *self, PyObject *args) +{ + int i, size; + PyObject *list, *res; + + if (!PyArg_ParseTuple(args, "")) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + if (_psyco_curs_prefetch(self) < 0) return NULL; + EXC_IF_NO_TUPLES(self); + + if (self->name != NULL) { + char buffer[128]; + + EXC_IF_NO_MARK(self); + PyOS_snprintf(buffer, 127, "FETCH FORWARD ALL FROM %s", self->name); + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + size = self->rowcount - self->row; + + if (size <= 0) { + return PyList_New(0); + } + + list = PyList_New(size); + + for (i = 0; i < size; i++) { + if (self->tuple_factory == Py_None) + res = _psyco_curs_buildrow(self, self->row); + else + res = _psyco_curs_buildrow_with_factory(self, self->row); + + self->row++; + + if (res == NULL) { + Py_DECREF(list); + return NULL; + } + + PyList_SET_ITEM(list, i, res); + } + + /* if the query was async aggresively free pgres, to allow + successive requests to reallocate it */ + if (self->row >= self->rowcount + && self->conn->async_cursor == (PyObject*)self) + IFCLEARPGRES(self->pgres); + + return list; +} + + +/* callproc method - execute a stored procedure */ + +#define psyco_curs_callproc_doc \ +"callproc(procname, parameters=None, async=0) -- Execute stored procedure." + +static PyObject * +psyco_curs_callproc(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + char *procname = NULL, *sql = NULL; + long int async = 0; + int i, nparameters = 0, sl = 0; + PyObject *parameters = NULL; + PyObject *operation = NULL; + PyObject *res = NULL; + + if (!PyArg_ParseTuple(args, "s|Oi", &procname, ¶meters, &async)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (self->name != NULL) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "can't call .callproc() on named cursors", NULL, NULL); + return NULL; + } + + if(parameters && parameters != Py_None) { + nparameters = PyObject_Length(parameters); + if (nparameters < 0) nparameters = 0; + } + + /* allocate some memory, build the SQL and create a PyString from it */ + sl = strlen(procname) + 10 + nparameters*3 - (nparameters ? 1 : 0); + sql = (char*)PyMem_Malloc(sl); + if (sql == NULL) return NULL; + + sprintf(sql, "SELECT %s(", procname); + for(i=0; iname == NULL) { + if (strcmp(mode, "relative") == 0) { + newpos = self->row + value; + } else if (strcmp( mode, "absolute") == 0) { + newpos = value; + } else { + psyco_set_error(ProgrammingError, (PyObject*)self, + "scroll mode must be 'relative' or 'absolute'", NULL, NULL); + return NULL; + } + + if (newpos < 0 || newpos >= self->rowcount ) { + psyco_set_error(ProgrammingError, (PyObject*)self, + "scroll destination out of bounds", NULL, NULL); + return NULL; + } + + self->row = newpos; + } + + else { + char buffer[128]; + + EXC_IF_NO_MARK(self); + + if (strcmp(mode, "absolute") == 0) { + PyOS_snprintf(buffer, 127, "MOVE ABSOLUTE %d FROM %s", + value, self->name); + } + else { + PyOS_snprintf(buffer, 127, "MOVE %d FROM %s", value, self->name); + } + if (pq_execute(self, buffer, 0) == -1) return NULL; + if (_psyco_curs_prefetch(self) < 0) return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + + +#ifdef PSYCOPG_EXTENSIONS + +/* extension: copy_from - implements COPY FROM */ + +#define psyco_curs_copy_from_doc \ +"copy_from(file, table, sep='\\t', null='\\N', columns=None) -- Copy table from file." + +static int +_psyco_curs_has_read_check(PyObject* o, void* var) +{ + if (PyObject_HasAttrString(o, "readline") + && PyObject_HasAttrString(o, "read")) { + Py_INCREF(o); + *((PyObject**)var) = o; + return 1; + } + else { + PyErr_SetString(PyExc_TypeError, + "argument 1 must have both .read() and .readline() methods"); + return 0; + } +} + +static PyObject * +psyco_curs_copy_from(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + char query[1024]; + char *table_name; + char *sep = "\t", *null = NULL; + long int bufsize = DEFAULT_COPYSIZE; + PyObject *file, *columns = NULL, *res = NULL; + char columnlist[1024] = ""; + + static char *kwlist[] = {"file", "table", "sep", "null", "size", + "columns", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&s|ssiO", kwlist, + _psyco_curs_has_read_check, &file, + &table_name, &sep, &null, &bufsize, + &columns)) { + return NULL; + } + + if (columns != NULL && columns != Py_None) { + PyObject* collistiter = PyObject_GetIter(columns); + PyObject* col; + int collistlen = 2; + int colitemlen; + char* colname; + if (collistiter == NULL) { + return NULL; + } + strcpy(columnlist, " ("); + while ((col = PyIter_Next(collistiter)) != NULL) { + if (!PyString_Check(col)) { + Py_DECREF(col); + Py_DECREF(collistiter); + PyErr_SetString(PyExc_ValueError, + "Elements in column list must be strings"); + return NULL; + } + PyString_AsStringAndSize(col, &colname, &colitemlen); + if (collistlen + colitemlen > 1022) { + Py_DECREF(col); + Py_DECREF(collistiter); + PyErr_SetString(PyExc_ValueError, "Column list too long"); + return NULL; + } + strncpy(&columnlist[collistlen], colname, colitemlen); + collistlen += colitemlen; + columnlist[collistlen++] = ','; + Py_DECREF(col); + } + Py_DECREF(collistiter); + + if (collistlen == 2) { /* empty list; we printed no comma */ + collistlen++; + } + + columnlist[collistlen - 1] = ')'; + columnlist[collistlen] = '\0'; + } + + if (PyErr_Occurred()) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (null) { + PyOS_snprintf(query, 1023, "COPY %s%s FROM stdin USING DELIMITERS '%s'" + " WITH NULL AS '%s'", table_name, columnlist, sep, null); + } + else { + PyOS_snprintf(query, 1023, "COPY %s%s FROM stdin USING DELIMITERS '%s'", + table_name, columnlist, sep); + } + Dprintf("psyco_curs_copy_from: query = %s", query); + + self->copysize = bufsize; + self->copyfile = file; + + if (pq_execute(self, query, 0) == 1) { + res = Py_None; + Py_INCREF(Py_None); + } + + self->copyfile =NULL; + + return res; +} + +#define psyco_curs_copy_to_doc \ +"copy_to(file, table, sep='\\t', null='\\N') -- Copy table to file." + +static int +_psyco_curs_has_write_check(PyObject* o, void* var) +{ + if (PyObject_HasAttrString(o, "write")) { + Py_INCREF(o); + *((PyObject**)var) = o; + return 1; + } + else { + PyErr_SetString(PyExc_TypeError, + "argument 1 must have a .write() method"); + return 0; + } +} + +static PyObject * +psyco_curs_copy_to(cursorObject *self, PyObject *args, PyObject *kwargs) +{ + char query[256]; + char *table_name; + char *sep = "\t", *null = NULL; + PyObject *file, *res = NULL; + + static char *kwlist[] = {"file", "table", "sep", "null", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&s|ss", kwlist, + _psyco_curs_has_write_check, &file, + &table_name, &sep, &null)) { + return NULL; + } + + EXC_IF_CURS_CLOSED(self); + + if (null) { + PyOS_snprintf(query, 255, "COPY %s TO stdout USING DELIMITERS '%s'" + " WITH NULL AS '%s'", table_name, sep, null); + } + else { + PyOS_snprintf(query, 255, "COPY %s TO stdout USING DELIMITERS '%s'", + table_name, sep); + } + + self->copysize = 0; + self->copyfile = file; + + if (pq_execute(self, query, 0) == 1) { + res = Py_None; + Py_INCREF(Py_None); + } + + self->copyfile = NULL; + + return res; +} +/* extension: fileno - return the file descripor of the connection */ + +#define psyco_curs_fileno_doc \ +"fileno() -> int -- Return file descriptor associated to database connection." + +static PyObject * +psyco_curs_fileno(cursorObject *self, PyObject *args) +{ + long int socket; + + if (!PyArg_ParseTuple(args, "")) return NULL; + EXC_IF_CURS_CLOSED(self); + + /* note how we call PQflush() to make sure the user will use + select() in the safe way! */ + pthread_mutex_lock(&(self->conn->lock)); + Py_BEGIN_ALLOW_THREADS; + PQflush(self->conn->pgconn); + socket = (long int)PQsocket(self->conn->pgconn); + Py_END_ALLOW_THREADS; + pthread_mutex_unlock(&(self->conn->lock)); + + return PyInt_FromLong(socket); +} + +/* extension: isready - return true if data from async execute is ready */ + +#define psyco_curs_isready_doc \ +"isready() -> bool -- Return True if data is ready after an async query." + +static PyObject * +psyco_curs_isready(cursorObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + EXC_IF_CURS_CLOSED(self); + + /* pq_is_busy does its own locking, we don't need anything special but if + the cursor is ready we need to fetch the result and free the connection + for the next query. */ + + if (pq_is_busy(self->conn)) { + Py_INCREF(Py_False); + return Py_False; + } + else { + IFCLEARPGRES(self->pgres); + pthread_mutex_lock(&(self->conn->lock)); + self->pgres = PQgetResult(self->conn->pgconn); + self->conn->async_cursor = NULL; + pthread_mutex_unlock(&(self->conn->lock)); + self->needsfetch = 1; + Py_INCREF(Py_True); + return Py_True; + } +} + +#endif + + +/** the cursor object **/ + +/* iterator protocol */ + +static PyObject * +cursor_iter(PyObject *self) +{ + EXC_IF_CURS_CLOSED((cursorObject*)self); + Py_INCREF(self); + return self; +} + +static PyObject * +cursor_next(PyObject *self) +{ + PyObject *res; + + /* we don't parse arguments: psyco_curs_fetchone will do that for us */ + res = psyco_curs_fetchone((cursorObject*)self, NULL); + + /* convert a None to NULL to signal the end of iteration */ + if (res && res == Py_None) { + Py_DECREF(res); + res = NULL; + } + return res; +} + +/* object method list */ + +static struct PyMethodDef cursorObject_methods[] = { + /* DBAPI-2.0 core */ + {"close", (PyCFunction)psyco_curs_close, + METH_VARARGS, psyco_curs_close_doc}, + {"execute", (PyCFunction)psyco_curs_execute, + METH_VARARGS|METH_KEYWORDS, psyco_curs_execute_doc}, + {"executemany", (PyCFunction)psyco_curs_executemany, + METH_VARARGS|METH_KEYWORDS, psyco_curs_executemany_doc}, + {"fetchone", (PyCFunction)psyco_curs_fetchone, + METH_VARARGS, psyco_curs_fetchone_doc}, + {"fetchmany", (PyCFunction)psyco_curs_fetchmany, + METH_VARARGS|METH_KEYWORDS, psyco_curs_fetchmany_doc}, + {"fetchall", (PyCFunction)psyco_curs_fetchall, + METH_VARARGS, psyco_curs_fetchall_doc}, + {"callproc", (PyCFunction)psyco_curs_callproc, + METH_VARARGS, psyco_curs_callproc_doc}, + {"nextset", (PyCFunction)psyco_curs_nextset, + METH_VARARGS, psyco_curs_nextset_doc}, + {"setinputsizes", (PyCFunction)psyco_curs_setinputsizes, + METH_VARARGS, psyco_curs_setinputsizes_doc}, + {"setoutputsize", (PyCFunction)psyco_curs_setoutputsize, + METH_VARARGS, psyco_curs_setoutputsize_doc}, + /* DBAPI-2.0 extensions */ + {"scroll", (PyCFunction)psyco_curs_scroll, + METH_VARARGS|METH_KEYWORDS, psyco_curs_scroll_doc}, + /* psycopg extensions */ +#ifdef PSYCOPG_EXTENSIONS + {"mogrify", (PyCFunction)psyco_curs_mogrify, + METH_VARARGS|METH_KEYWORDS, psyco_curs_mogrify_doc}, + {"fileno", (PyCFunction)psyco_curs_fileno, + METH_VARARGS, psyco_curs_fileno_doc}, + {"isready", (PyCFunction)psyco_curs_isready, + METH_VARARGS, psyco_curs_isready_doc}, + {"copy_from", (PyCFunction)psyco_curs_copy_from, + METH_VARARGS|METH_KEYWORDS, psyco_curs_copy_from_doc}, + {"copy_to", (PyCFunction)psyco_curs_copy_to, + METH_VARARGS|METH_KEYWORDS, psyco_curs_copy_to_doc}, +#endif + {NULL} +}; + +/* object member list */ + +#define OFFSETOF(x) offsetof(cursorObject, x) + +static struct PyMemberDef cursorObject_members[] = { + /* DBAPI-2.0 basics */ + {"rowcount", T_LONG, OFFSETOF(rowcount), RO, + "Number of rows read from the backend in the last command."}, + {"arraysize", T_LONG, OFFSETOF(arraysize), 0, + "Number of records `fetchmany()` must fetch if not explicitely " \ + "specified."}, + {"description", T_OBJECT, OFFSETOF(description), RO, + "Cursor description as defined in DBAPI-2.0."}, + {"lastrowid", T_LONG, OFFSETOF(lastoid), RO, + "The ``oid`` of the last row inserted by the cursor."}, + /* DBAPI-2.0 extensions */ + {"rownumber", T_LONG, OFFSETOF(row), RO, + "The current row position."}, + {"connection", T_OBJECT, OFFSETOF(conn), RO, + "The connection where the cursor comes from."}, +#ifdef PSYCOPG_EXTENSIONS + {"name", T_STRING, OFFSETOF(name), RO}, + {"statusmessage", T_OBJECT, OFFSETOF(pgstatus), RO, + "The return message of the last command."}, + {"query", T_OBJECT, OFFSETOF(query), RO, + "The last query text sent to the backend."}, + {"row_factory", T_OBJECT, OFFSETOF(tuple_factory), 0}, + {"tzinfo_factory", T_OBJECT, OFFSETOF(tzinfo_factory), 0}, + {"typecaster", T_OBJECT, OFFSETOF(caster), RO}, + {"string_types", T_OBJECT, OFFSETOF(string_types), 0}, + {"binary_types", T_OBJECT, OFFSETOF(binary_types), 0}, +#endif + {NULL} +}; + +/* initialization and finalization methods */ + +static int +cursor_setup(cursorObject *self, connectionObject *conn, char *name) +{ + Dprintf("cursor_setup: init cursor object at %p", self); + Dprintf("cursor_setup: parameters: name = %s, conn = %p", name, conn); + + if (name) { + self->name = PyMem_Malloc(strlen(name)+1); + if (self->name == NULL) return 1; + strncpy(self->name, name, strlen(name)+1); + } + + /* FIXME: why does this raise an excpetion on the _next_ line of code? + if (PyObject_IsInstance((PyObject*)conn, + (PyObject *)&connectionType) == 0) { + PyErr_SetString(PyExc_TypeError, + "argument 1 must be subclass of psycopg2._psycopg.connection"); + return 1; + } */ + self->conn = conn; + Py_INCREF((PyObject*)self->conn); + + self->closed = 0; + self->mark = conn->mark; + self->pgres = NULL; + self->notuples = 1; + self->arraysize = 1; + self->rowcount = -1; + self->lastoid = InvalidOid; + + self->casts = NULL; + self->notice = NULL; + + self->string_types = NULL; + self->binary_types = NULL; + + self->description = Py_None; + Py_INCREF(Py_None); + self->pgstatus = Py_None; + Py_INCREF(Py_None); + self->tuple_factory = Py_None; + Py_INCREF(Py_None); + self->query = Py_None; + Py_INCREF(Py_None); + + /* default tzinfo factory */ + self->tzinfo_factory = pyPsycopgTzFixedOffsetTimezone; + Py_INCREF(self->tzinfo_factory); + + Dprintf("cursor_setup: good cursor object at %p, refcnt = %d", + self, ((PyObject *)self)->ob_refcnt); + return 0; +} + +static void +cursor_dealloc(PyObject* obj) +{ + cursorObject *self = (cursorObject *)obj; + + if (self->name) PyMem_Free(self->name); + + Py_XDECREF((PyObject*)self->conn); + Py_XDECREF(self->casts); + Py_XDECREF(self->description); + Py_XDECREF(self->pgstatus); + Py_XDECREF(self->tuple_factory); + Py_XDECREF(self->tzinfo_factory); + Py_XDECREF(self->query); + + IFCLEARPGRES(self->pgres); + + Dprintf("cursor_dealloc: deleted cursor object at %p, refcnt = %d", + obj, obj->ob_refcnt); + + obj->ob_type->tp_free(obj); +} + +static int +cursor_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + char *name = NULL; + PyObject *conn; + + if (!PyArg_ParseTuple(args, "O|s", &conn, &name)) + return -1; + + return cursor_setup((cursorObject *)obj, (connectionObject *)conn, name); +} + +static PyObject * +cursor_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +cursor_del(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject * +cursor_repr(cursorObject *self) +{ + return PyString_FromFormat( + "", self, self->closed); +} + + +/* object type */ + +#define cursorType_doc \ +"A database cursor." + +PyTypeObject cursorType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.cursor", + sizeof(cursorObject), + 0, + cursor_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + (reprfunc)cursor_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + (reprfunc)cursor_repr, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ + cursorType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + cursor_iter, /*tp_iter*/ + cursor_next, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + cursorObject_methods, /*tp_methods*/ + cursorObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + cursor_init, /*tp_init*/ + 0, /*tp_alloc Will be set to PyType_GenericAlloc in module init*/ + cursor_new, /*tp_new*/ + (freefunc)cursor_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; diff --git a/trunk/psycopg2/psycopg/microprotocols.c b/trunk/psycopg2/psycopg/microprotocols.c new file mode 100644 index 0000000..73abbfc --- /dev/null +++ b/trunk/psycopg2/psycopg/microprotocols.c @@ -0,0 +1,161 @@ +/* microprotocols.c - minimalist and non-validating protocols implementation + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/cursor.h" +#include "psycopg/connection.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" + + +/** the adapters registry **/ + +PyObject *psyco_adapters; + +/* microprotocols_init - initialize the adapters dictionary */ + +int +microprotocols_init(PyObject *dict) +{ + /* create adapters dictionary and put it in module namespace */ + if ((psyco_adapters = PyDict_New()) == NULL) { + return -1; + } + + PyDict_SetItemString(dict, "adapters", psyco_adapters); + + return 0; +} + + +/* microprotocols_add - add a reverse type-caster to the dictionary */ + +int +microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast) +{ + if (proto == NULL) proto = (PyObject*)&isqlquoteType; + + Dprintf("microprotocols_add: cast %p for (%s, ?)", cast, type->tp_name); + + PyDict_SetItem(psyco_adapters, + Py_BuildValue("(OO)", (PyObject*)type, proto), + cast); + return 0; +} + +/* microprotocols_adapt - adapt an object to the built-in protocol */ + +PyObject * +microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) +{ + PyObject *adapter, *key; + + /* we don't check for exact type conformance as specified in PEP 246 + because the ISQLQuote type is abstract and there is no way to get a + quotable object to be its instance */ + + Dprintf("microprotocols_adapt: trying to adapt %s", obj->ob_type->tp_name); + + /* look for an adapter in the registry */ + key = Py_BuildValue("(OO)", (PyObject*)obj->ob_type, proto); + adapter = PyDict_GetItem(psyco_adapters, key); + Py_DECREF(key); + if (adapter) { + PyObject *adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL); + return adapted; + } + + /* try to have the protocol adapt this object*/ + if (PyObject_HasAttrString(proto, "__adapt__")) { + PyObject *adapted = PyObject_CallMethod(proto, "__adapt__", "O", obj); + if (adapted && adapted != Py_None) return adapted; + Py_XDECREF(adapted); + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) + return NULL; + } + + /* and finally try to have the object adapt itself */ + if (PyObject_HasAttrString(obj, "__conform__")) { + PyObject *adapted = PyObject_CallMethod(obj, "__conform__","O", proto); + if (adapted && adapted != Py_None) return adapted; + Py_XDECREF(adapted); + if (PyErr_Occurred() && !PyErr_ExceptionMatches(PyExc_TypeError)) + return NULL; + } + + /* else set the right exception and return NULL */ + psyco_set_error(ProgrammingError, NULL, "can't adapt", NULL, NULL); + return NULL; +} + +/* microprotocol_getquoted - utility function that adapt and call getquoted */ + +PyObject * +microprotocol_getquoted(PyObject *obj, connectionObject *conn) +{ + PyObject *res = NULL; + PyObject *tmp = microprotocols_adapt( + obj, (PyObject*)&isqlquoteType, NULL); + + if (tmp != NULL) { + Dprintf("microprotocol_getquoted: adapted to %s", + tmp->ob_type->tp_name); + + /* if requested prepare the object passing it the connection */ + if (PyObject_HasAttrString(tmp, "prepare") && conn) { + res = PyObject_CallMethod(tmp, "prepare", "O", (PyObject*)conn); + if (res == NULL) { + Py_DECREF(tmp); + return NULL; + } + else { + Py_DECREF(res); + } + } + + /* call the getquoted method on tmp (that should exist because we + adapted to the right protocol) */ + res = PyObject_CallMethod(tmp, "getquoted", NULL); + Py_DECREF(tmp); + } + + /* we return res with one extra reference, the caller shall free it */ + return res; +} + + +/** module-level functions **/ + +PyObject * +psyco_microprotocols_adapt(cursorObject *self, PyObject *args) +{ + PyObject *obj, *alt = NULL; + PyObject *proto = (PyObject*)&isqlquoteType; + + if (!PyArg_ParseTuple(args, "O|OO", &obj, &proto, &alt)) return NULL; + return microprotocols_adapt(obj, proto, alt); +} diff --git a/trunk/psycopg2/psycopg/microprotocols.h b/trunk/psycopg2/psycopg/microprotocols.h new file mode 100644 index 0000000..5501a7c --- /dev/null +++ b/trunk/psycopg2/psycopg/microprotocols.h @@ -0,0 +1,60 @@ +/* microprotocols.c - definitions for minimalist and non-validating protocols + * + * Copyright (C) 2003-2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_MICROPROTOCOLS_H +#define PSYCOPG_MICROPROTOCOLS_H 1 + +#include +#include "psycopg/connection.h" +#include "psycopg/cursor.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** adapters registry **/ + +extern PyObject *psyco_adapters; + +/** the names of the three mandatory methods **/ + +#define MICROPROTOCOLS_GETQUOTED_NAME "getquoted" +#define MICROPROTOCOLS_GETSTRING_NAME "getstring" +#define MICROPROTOCOLS_GETBINARY_NAME "getbinary" + +/** exported functions **/ + +/* used by module.c to init the microprotocols system */ +extern int microprotocols_init(PyObject *dict); +extern int microprotocols_add( + PyTypeObject *type, PyObject *proto, PyObject *cast); + +extern PyObject *microprotocols_adapt( + PyObject *obj, PyObject *proto, PyObject *alt); +extern PyObject *microprotocol_getquoted( + PyObject *obj, connectionObject *conn); + +extern PyObject * + psyco_microprotocols_adapt(cursorObject *self, PyObject *args); +#define psyco_microprotocols_adapt_doc \ + "adapt(obj, protocol, alternate) -> object -- adapt obj to given protocol" + +#endif /* !defined(PSYCOPG_MICROPROTOCOLS_H) */ diff --git a/trunk/psycopg2/psycopg/microprotocols_proto.c b/trunk/psycopg2/psycopg/microprotocols_proto.c new file mode 100644 index 0000000..72c3a7e --- /dev/null +++ b/trunk/psycopg2/psycopg/microprotocols_proto.c @@ -0,0 +1,216 @@ +/* microprotocol_proto.c - psycopg protocols + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/microprotocols_proto.h" + + +/** void protocol implementation **/ + + +/* getquoted - return quoted representation for object */ + +#define psyco_isqlquote_getquoted_doc \ +"getquoted() -- return SQL-quoted representation of this object" + +static PyObject * +psyco_isqlquote_getquoted(isqlquoteObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + Py_INCREF(Py_None); + return Py_None; +} + +/* getbinary - return quoted representation for object */ + +#define psyco_isqlquote_getbinary_doc \ +"getbinary() -- return SQL-quoted binary representation of this object" + +static PyObject * +psyco_isqlquote_getbinary(isqlquoteObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + Py_INCREF(Py_None); + return Py_None; +} + +/* getbuffer - return quoted representation for object */ + +#define psyco_isqlquote_getbuffer_doc \ +"getbuffer() -- return this object" + +static PyObject * +psyco_isqlquote_getbuffer(isqlquoteObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) return NULL; + + Py_INCREF(Py_None); + return Py_None; +} + + + +/** the ISQLQuote object **/ + + +/* object method list */ + +static struct PyMethodDef isqlquoteObject_methods[] = { + {"getquoted", (PyCFunction)psyco_isqlquote_getquoted, + METH_VARARGS, psyco_isqlquote_getquoted_doc}, + {"getbinary", (PyCFunction)psyco_isqlquote_getbinary, + METH_VARARGS, psyco_isqlquote_getbinary_doc}, + {"getbuffer", (PyCFunction)psyco_isqlquote_getbuffer, + METH_VARARGS, psyco_isqlquote_getbuffer_doc}, + /* {"prepare", (PyCFunction)psyco_isqlquote_prepare, + METH_VARARGS, psyco_isqlquote_prepare_doc}, */ + {NULL} +}; + +/* object member list */ + +static struct PyMemberDef isqlquoteObject_members[] = { + /* DBAPI-2.0 extensions (exception objects) */ + {"_wrapped", T_OBJECT, offsetof(isqlquoteObject, wrapped), RO}, + {NULL} +}; + +/* initialization and finalization methods */ + +static int +isqlquote_setup(isqlquoteObject *self, PyObject *wrapped) +{ + self->wrapped = wrapped; + Py_INCREF(wrapped); + + return 0; +} + +static void +isqlquote_dealloc(PyObject* obj) +{ + isqlquoteObject *self = (isqlquoteObject *)obj; + + Py_XDECREF(self->wrapped); + + obj->ob_type->tp_free(obj); +} + +static int +isqlquote_init(PyObject *obj, PyObject *args, PyObject *kwds) +{ + PyObject *wrapped = NULL; + + if (!PyArg_ParseTuple(args, "O", &wrapped)) + return -1; + + return isqlquote_setup((isqlquoteObject *)obj, wrapped); +} + +static PyObject * +isqlquote_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + return type->tp_alloc(type, 0); +} + +static void +isqlquote_del(PyObject* self) +{ + PyObject_Del(self); +} + + +/* object type */ + +#define isqlquoteType_doc \ +"Abstract ISQLQuote protocol\n\n" \ +"An object conform to this protocol should expose a ``getquoted()`` method\n" \ +"returning the SQL representation of the object.\n\n" + +PyTypeObject isqlquoteType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.ISQLQuote", + sizeof(isqlquoteObject), + 0, + isqlquote_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/ + isqlquoteType_doc, /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + isqlquoteObject_methods, /*tp_methods*/ + isqlquoteObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + isqlquote_init, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + isqlquote_new, /*tp_new*/ + (freefunc)isqlquote_del, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; diff --git a/trunk/psycopg2/psycopg/microprotocols_proto.h b/trunk/psycopg2/psycopg/microprotocols_proto.h new file mode 100644 index 0000000..c671264 --- /dev/null +++ b/trunk/psycopg2/psycopg/microprotocols_proto.h @@ -0,0 +1,45 @@ +/* microporotocols_proto.h - definiton for psycopg's protocols + * + * Copyright (C) 2004 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_ISQLQUOTE_H +#define PSYCOPG_ISQLQUOTE_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern PyTypeObject isqlquoteType; + +typedef struct { + PyObject HEAD; + + PyObject *wrapped; + +} isqlquoteObject; + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_ISQLQUOTE_H) */ diff --git a/trunk/psycopg2/psycopg/pgtypes.h b/trunk/psycopg2/psycopg/pgtypes.h new file mode 100644 index 0000000..1fdbda9 --- /dev/null +++ b/trunk/psycopg2/psycopg/pgtypes.h @@ -0,0 +1,65 @@ +#define BOOLOID 16 +#define BYTEAOID 17 +#define CHAROID 18 +#define NAMEOID 19 +#define INT8OID 20 +#define INT2OID 21 +#define INT2VECTOROID 22 +#define INT4OID 23 +#define REGPROCOID 24 +#define TEXTOID 25 +#define OIDOID 26 +#define TIDOID 27 +#define XIDOID 28 +#define CIDOID 29 +#define OIDVECTOROID 30 +#define PG_TYPE_RELTYPE_OID 71 +#define PG_ATTRIBUTE_RELTYPE_OID 75 +#define PG_PROC_RELTYPE_OID 81 +#define PG_CLASS_RELTYPE_OID 83 +#define POINTOID 600 +#define LSEGOID 601 +#define PATHOID 602 +#define BOXOID 603 +#define POLYGONOID 604 +#define LINEOID 628 +#define FLOAT4OID 700 +#define FLOAT8OID 701 +#define ABSTIMEOID 702 +#define RELTIMEOID 703 +#define TINTERVALOID 704 +#define UNKNOWNOID 705 +#define CIRCLEOID 718 +#define CASHOID 790 +#define MACADDROID 829 +#define INETOID 869 +#define CIDROID 650 +#define INT4ARRAYOID 1007 +#define ACLITEMOID 1033 +#define BPCHAROID 1042 +#define VARCHAROID 1043 +#define DATEOID 1082 +#define TIMEOID 1083 +#define TIMESTAMPOID 1114 +#define TIMESTAMPTZOID 1184 +#define INTERVALOID 1186 +#define TIMETZOID 1266 +#define BITOID 1560 +#define VARBITOID 1562 +#define NUMERICOID 1700 +#define REFCURSOROID 1790 +#define REGPROCEDUREOID 2202 +#define REGOPEROID 2203 +#define REGOPERATOROID 2204 +#define REGCLASSOID 2205 +#define REGTYPEOID 2206 +#define RECORDOID 2249 +#define CSTRINGOID 2275 +#define ANYOID 2276 +#define ANYARRAYOID 2277 +#define VOIDOID 2278 +#define TRIGGEROID 2279 +#define LANGUAGE_HANDLEROID 2280 +#define INTERNALOID 2281 +#define OPAQUEOID 2282 +#define ANYELEMENTOID 2283 diff --git a/trunk/psycopg2/psycopg/pgversion.h b/trunk/psycopg2/psycopg/pgversion.h new file mode 100644 index 0000000..f874a9a --- /dev/null +++ b/trunk/psycopg2/psycopg/pgversion.h @@ -0,0 +1,2 @@ +#define PG_VERSION_MAJOR 7 +#define PG_VERSION_MINOR 4 diff --git a/trunk/psycopg2/psycopg/pqpath.c b/trunk/psycopg2/psycopg/pqpath.c new file mode 100644 index 0000000..1ebb569 --- /dev/null +++ b/trunk/psycopg2/psycopg/pqpath.c @@ -0,0 +1,883 @@ +/* pqpath.c - single path into libpq + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* IMPORTANT NOTE: no function in this file do its own connection locking + except for pg_execute and pq_fetch (that are somehow high-level. This means + that all the othe functions should be called while holding a lock to the + connection. +*/ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/pqpath.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" +#include "psycopg/typecast.h" +#include "psycopg/pgtypes.h" +#include "psycopg/pgversion.h" + +/* pq_raise - raise a python exception of the right kind + + This function should be called while holding the GIL. */ + +void +pq_raise(connectionObject *conn, cursorObject *curs, PyObject *exc, char *msg) +{ + PyObject *pgc = (PyObject*)curs; + + char *err = NULL; + char *err2 = NULL; + char *code = NULL; + char *buf = NULL; + + if ((conn == NULL && curs == NULL) || (curs != NULL && conn == NULL)) { + PyErr_SetString(Error, "psycopg went psycotic and raised a null error"); + return; + } + + if (curs && curs->pgres) { + err = PQresultErrorMessage(curs->pgres); +#ifdef HAVE_PQPROTOCOL3 + if (err != NULL && conn->protocol == 3) { + code = PQresultErrorField(curs->pgres, PG_DIAG_SQLSTATE); + } +#endif + } + if (err == NULL) + err = PQerrorMessage(conn->pgconn); + + /* if the is no error message we probably called pq_raise without reason: + we need to set an exception anyway because the caller will probably + raise and a meaningful message is better than an empty one */ + if (err == NULL) { + PyErr_SetString(Error, "psycopg went psycotic without error set"); + return; + } + + /* if exc is NULL, analyze the message and try to deduce the right + exception kind (only if we have a pgres, obviously) */ + if (exc == NULL) { + if (curs && curs->pgres) { + if (conn->protocol == 3) { +#ifdef HAVE_PQPROTOCOL3 + char *pgstate = + PQresultErrorField(curs->pgres, PG_DIAG_SQLSTATE); + if (pgstate != NULL && !strncmp(pgstate, "23", 2)) + exc = IntegrityError; + else + exc = ProgrammingError; +#endif + } + } + } + + /* if exc is still NULL psycopg was not built with HAVE_PQPROTOCOL3 or the + connection is using protocol 2: in both cases we default to comparing + error messages */ + if (exc == NULL) { + if (!strncmp(err, "ERROR: Cannot insert a duplicate key", 37) + || !strncmp(err, "ERROR: ExecAppend: Fail to add null", 36) + || strstr(err, "referential integrity violation")) + exc = IntegrityError; + else + exc = ProgrammingError; + } + + /* try to remove the initial "ERROR: " part from the postgresql error */ + if (err && strlen(err) > 8) err2 = &(err[8]); + else err2 = err; + + /* if msg is not NULL, add it to the error message, after a '\n' */ + if (msg && code) { + int len = strlen(code) + strlen(err) + strlen(msg) + 5; + if ((buf = PyMem_Malloc(len))) { + snprintf(buf, len, "[%s] %s\n%s", code, err2, msg); + psyco_set_error(exc, pgc, buf, err, code); + } + } + else if (msg) { + int len = strlen(err) + strlen(msg) + 2; + if ((buf = PyMem_Malloc(len))) { + snprintf(buf, len, "%s\n%s", err2, msg); + psyco_set_error(exc, pgc, buf, err, code); + } + } + else { + psyco_set_error(exc, pgc, err2, err, code); + } + + if (buf != NULL) PyMem_Free(buf); +} + +/* pq_set_critical, pq_resolve_critical - manage critical errors + + this function is invoked when a PQexec() call returns NULL, meaning a + critical condition like out of memory or lost connection. it save the error + message and mark the connection as 'wanting cleanup'. + + both functions do not call any Py_*_ALLOW_THREADS macros. + pq_resolve_critical should be called while holding the GIL. */ + +void +pq_set_critical(connectionObject *conn, const char *msg) +{ + if (msg == NULL) + msg = PQerrorMessage(conn->pgconn); + if (conn->critical) free(conn->critical); + if (msg && msg[0] != '\0') conn->critical = strdup(msg); + else conn->critical = NULL; +} + +PyObject * +pq_resolve_critical(connectionObject *conn, int close) +{ + Dprintf("pq_resolve_critical: resolving %s", conn->critical); + + if (conn->critical) { + char *msg = &(conn->critical[6]); + Dprintf("pq_resolve_critical: error = %s", msg); + /* we can't use pq_raise because the error has already been cleared + from the connection, so we just raise an OperationalError with the + critical message */ + PyErr_SetString(OperationalError, msg); + + /* we don't want to destroy this connection but just close it */ + if (close == 1) conn_close(conn); + } + return NULL; +} + +/* pq_clear_async - clear the effects of a previous async query + + note that this function does block because it needs to wait for the full + result sets of the previous query to clear them. + + + this function does not call any Py_*_ALLOW_THREADS macros */ + +void +pq_clear_async(connectionObject *conn) +{ + PGresult *pgres; + + do { + pgres = PQgetResult(conn->pgconn); + Dprintf("pq_clear_async: clearing PGresult at %p", pgres); + IFCLEARPGRES(pgres); + } while (pgres != NULL); +} + +/* pq_begin - send a BEGIN WORK, if necessary + + this function does not call any Py_*_ALLOW_THREADS macros */ + +int +pq_begin(connectionObject *conn) +{ + const char *query[] = { + NULL, + "BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED", + "BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"}; + + int pgstatus, retvalue = -1; + PGresult *pgres = NULL; + + Dprintf("pq_begin: pgconn = %p, isolevel = %ld, status = %d", + conn->pgconn, conn->isolation_level, conn->status); + + if (conn->isolation_level == 0 || conn->status != CONN_STATUS_READY) { + Dprintf("pq_begin: transaction in progress"); + return 0; + } + + pq_clear_async(conn); + pgres = PQexec(conn->pgconn, query[conn->isolation_level]); + if (pgres == NULL) { + Dprintf("pq_begin: PQexec() failed"); + pq_set_critical(conn, NULL); + goto cleanup; + } + + pgstatus = PQresultStatus(pgres); + if (pgstatus != PGRES_COMMAND_OK ) { + Dprintf("pq_begin: result is NOT OK"); + pq_set_critical(conn, NULL); + goto cleanup; + } + Dprintf("pq_begin: issued '%s' command", query[conn->isolation_level]); + + retvalue = 0; + conn->status = CONN_STATUS_BEGIN; + + cleanup: + IFCLEARPGRES(pgres); + return retvalue; +} + +/* pq_commit - send an END, if necessary + + this function does not call any Py_*_ALLOW_THREADS macros */ + +int +pq_commit(connectionObject *conn) +{ + const char *query = "END"; + int pgstatus, retvalue = -1; + PGresult *pgres = NULL; + + Dprintf("pq_commit: pgconn = %p, isolevel = %ld, status = %d", + conn->pgconn, conn->isolation_level, conn->status); + + if (conn->isolation_level == 0 || conn->status != CONN_STATUS_BEGIN) { + Dprintf("pq_commit: no transaction to commit"); + return 0; + } + + pq_clear_async(conn); + pgres = PQexec(conn->pgconn, query); + if (pgres == NULL) { + Dprintf("pq_commit: PQexec() failed"); + pq_set_critical(conn, NULL); + goto cleanup; + } + + pgstatus = PQresultStatus(pgres); + if (pgstatus != PGRES_COMMAND_OK ) { + Dprintf("pq_commit: result is NOT OK"); + pq_set_critical(conn, NULL); + goto cleanup; + } + Dprintf("pq_commit: issued '%s' command", query); + + retvalue = 0; + conn->status = CONN_STATUS_READY; + + cleanup: + IFCLEARPGRES(pgres); + return retvalue; +} + +/* pq_abort - send an ABORT, if necessary + + this function does not call any Py_*_ALLOW_THREADS macros */ + +int +pq_abort(connectionObject *conn) +{ + const char *query = "ABORT"; + int pgstatus, retvalue = -1; + PGresult *pgres = NULL; + + Dprintf("pq_abort: pgconn = %p, isolevel = %ld, status = %d", + conn->pgconn, conn->isolation_level, conn->status); + + if (conn->isolation_level == 0 || conn->status != CONN_STATUS_BEGIN) { + Dprintf("pq_abort: no transaction to abort"); + return 0; + } + + pq_clear_async(conn); + pgres = PQexec(conn->pgconn, query); + if (pgres == NULL) { + Dprintf("pq_abort: PQexec() failed"); + pq_set_critical(conn, NULL); + goto cleanup; + } + + pgstatus = PQresultStatus(pgres); + if (pgstatus != PGRES_COMMAND_OK ) { + Dprintf("pq_abort: result is NOT OK"); + pq_set_critical(conn, NULL); + goto cleanup; + } + Dprintf("pq_abort: issued '%s' command", query); + + retvalue = 0; + conn->status = CONN_STATUS_READY; + + cleanup: + IFCLEARPGRES(pgres); + return retvalue; +} + +/* pq_is_busy - consume input and return connection status + + a status of 1 means that a call to pq_fetch will block, while a status of 0 + means that there is data available to be collected. -1 means an error, the + exception will be set accordingly. + + this fucntion locks the connection object + this function call Py_*_ALLOW_THREADS macros */ + +int +pq_is_busy(connectionObject *conn) +{ + PGnotify *pgn; + + Dprintf("pq_is_busy: consuming input"); + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&(conn->lock)); + + if (PQconsumeInput(conn->pgconn) == 0) { + Dprintf("pq_is_busy: PQconsumeInput() failed"); + pthread_mutex_unlock(&(conn->lock)); + Py_BLOCK_THREADS; + PyErr_SetString(OperationalError, PQerrorMessage(conn->pgconn)); + return -1; + } + + pthread_mutex_unlock(&(conn->lock)); + Py_END_ALLOW_THREADS; + + /* now check for notifies */ + while ((pgn = PQnotifies(conn->pgconn)) != NULL) { + PyObject *notify; + + Dprintf("curs_is_busy: got NOTIFY from pid %d, msg = %s", + pgn->be_pid, pgn->relname); + + notify = PyTuple_New(2); + PyTuple_SET_ITEM(notify, 0, PyInt_FromLong((long)pgn->be_pid)); + PyTuple_SET_ITEM(notify, 1, PyString_FromString(pgn->relname)); + PyList_Append(conn->notifies, notify); + free(pgn); + } + + return PQisBusy(conn->pgconn); +} + +/* pq_execute - execute a query, possibly asyncronously + + this fucntion locks the connection object + this function call Py_*_ALLOW_THREADS macros */ + +int +pq_execute(cursorObject *curs, const char *query, int async) +{ + /* if the status of the connection is critical raise an exception and + definitely close the connection */ + if (curs->conn->critical) { + pq_resolve_critical(curs->conn, 1); + return -1; + } + + /* check status of connection, raise error if not OK */ + if (PQstatus(curs->conn->pgconn) != CONNECTION_OK) { + Dprintf("pq_execute: connection NOT OK"); + PyErr_SetString(OperationalError, PQerrorMessage(curs->conn->pgconn)); + return -1; + } + Dprintf("curs_execute: pg connection at %p OK", curs->conn->pgconn); + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&(curs->conn->lock)); + + pq_begin(curs->conn); + + if (async == 0) { + IFCLEARPGRES(curs->pgres); + Dprintf("pq_execute: executing SYNC query:"); + Dprintf(" %-.200s", query); + curs->pgres = PQexec(curs->conn->pgconn, query); + } + + else if (async == 1) { + /* first of all, let see if the previous query has already ended, if + not what should we do? just block and discard data or execute + another query? */ + pq_clear_async(curs->conn); + + Dprintf("pq_execute: executing ASYNC query:"); + Dprintf(" %-.200s", query); + + /* then we can go on and send a new query without fear */ + IFCLEARPGRES(curs->pgres); + if (PQsendQuery(curs->conn->pgconn, query) == 0) { + pthread_mutex_unlock(&(curs->conn->lock)); + Py_BLOCK_THREADS; + PyErr_SetString(OperationalError, + PQerrorMessage(curs->conn->pgconn)); + return -1; + } + Dprintf("pq_execute: async query sent to backend"); + } + + pthread_mutex_unlock(&(curs->conn->lock)); + Py_END_ALLOW_THREADS; + + /* if the execute was sync, we call pq_fetch() immediately, + to respect the old DBAPI-2.0 compatible behaviour */ + if (async == 0) { + Dprintf("pq_execute: entering syncronous DBAPI compatibility mode"); + if (pq_fetch(curs) == -1) return -1; + } + else { + curs->conn->async_cursor = (PyObject*)curs; + } + + return 1-async; +} + + +/* pq_fetch - fetch data after a query + + this fucntion locks the connection object + this function call Py_*_ALLOW_THREADS macros + + return value: + -1 - some error occurred while calling libpq + 0 - no result from the backend but no libpq errors + 1 - result from backend (possibly data is ready) +*/ + +static void +_pq_fetch_tuples(cursorObject *curs) +{ + int i, *dsize = NULL; + + int pgnfields = PQnfields(curs->pgres); + int pgbintuples = PQbinaryTuples(curs->pgres); + + curs->notuples = 0; + + /* create the tuple for description and typecasting */ + Py_XDECREF(curs->description); + Py_XDECREF(curs->casts); + curs->description = PyTuple_New(pgnfields); + curs->casts = PyTuple_New(pgnfields); + curs->columns = pgnfields; + + /* calculate the display size for each column (cpu intensive, can be + switched off at configuration time) */ +#ifdef PSYCOPG_DISPLAY_SIZE + dsize = (int *)PyMem_Malloc(pgnfields * sizeof(int)); + if (dsize != NULL) { + int j, len; + for (i=0; i < pgnfields; i++) { + dsize[i] = -1; + } + for (j = 0; j < curs->rowcount; j++) { + for (i = 0; i < pgnfields; i++) { + len = PQgetlength(curs->pgres, j, i); + if (len > dsize[i]) dsize[i] = len; + } + } + } +#endif + + /* calculate various parameters and typecasters */ + for (i = 0; i < pgnfields; i++) { + Oid ftype = PQftype(curs->pgres, i); + int fsize = PQfsize(curs->pgres, i); + int fmod = PQfmod(curs->pgres, i); + + PyObject *dtitem = PyTuple_New(7); + PyObject *type = PyInt_FromLong(ftype); + PyObject *cast = NULL; + + PyTuple_SET_ITEM(curs->description, i, dtitem); + + /* fill the right cast function by accessing the global dictionary of + casting objects. if we got no defined cast use the default + one */ + if (!(cast = PyDict_GetItem(curs->casts, type))) { + Dprintf("_pq_fetch_tuples: cast %d not in per-cursor dict", ftype); + if (!(cast = PyDict_GetItem(psyco_types, type))) { + Dprintf("_pq_fetch_tuples: cast %d not found, using default", + PQftype(curs->pgres,i)); + cast = psyco_default_cast; + } + } + /* else if we got binary tuples and if we got a field that + is binary use the default cast + FIXME: what the hell am I trying to do here? This just can't work.. + */ + else if (pgbintuples && cast == psyco_default_binary_cast) { + Dprintf("_pq_fetch_tuples: Binary cursor and " + "binary field: %i using default cast", + PQftype(curs->pgres,i)); + cast = psyco_default_cast; + } + Dprintf("_pq_fetch_tuples: using cast at %p (%s) for type %d", + cast, PyString_AS_STRING(((typecastObject*)cast)->name), + PQftype(curs->pgres,i)); + Py_INCREF(cast); + PyTuple_SET_ITEM(curs->casts, i, cast); + + + /* 1/ fill the other fields */ + PyTuple_SET_ITEM(dtitem, 0, + PyString_FromString(PQfname(curs->pgres, i))); + PyTuple_SET_ITEM(dtitem, 1, type); + + /* 2/ display size is the maximum size of this field result tuples. */ + if (dsize && dsize[i] >= 0) { + PyTuple_SET_ITEM(dtitem, 2, PyInt_FromLong(dsize[i])); + } + else { + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 2, Py_None); + } + + /* 3/ size on the backend */ + if (fmod > 0) fmod = fmod - sizeof(int); + if (fsize == -1) { + if (ftype == NUMERICOID) { + PyTuple_SET_ITEM(dtitem, 3, + PyInt_FromLong((fmod >> 16) & 0xFFFF)); + } + else { /* If variable length record, return maximum size */ + PyTuple_SET_ITEM(dtitem, 3, PyInt_FromLong(fmod)); + } + } + else { + PyTuple_SET_ITEM(dtitem, 3, PyInt_FromLong(fsize)); + } + + /* 4,5/ scale and precision */ + if (ftype == NUMERICOID) { + PyTuple_SET_ITEM(dtitem, 4, PyInt_FromLong((fmod >> 16) & 0xFFFF)); + PyTuple_SET_ITEM(dtitem, 5, PyInt_FromLong((fmod & 0xFFFF) - 4)); + } + else { + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 4, Py_None); + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 5, Py_None); + } + + /* 6/ FIXME: null_ok??? */ + Py_INCREF(Py_None); + PyTuple_SET_ITEM(dtitem, 6, Py_None); + } + + if (dsize) PyMem_Free(dsize); +} + +#ifdef HAVE_PQPROTOCOL3 +static int +_pq_copy_in_v3(cursorObject *curs) +{ + /* COPY FROM implementation when protocol 3 is available: this function + uses the new PQputCopyData() and can detect errors and set the correct + exception */ + PyObject *o; + int length = 0, error = 0; + + while (1) { + o = PyObject_CallMethod(curs->copyfile, "read", "i", curs->copysize); + if (!o || !PyString_Check(o) || (length = PyString_Size(o)) == -1) { + error = 1; + } + if (length == 0 || error == 1) break; + + Py_BEGIN_ALLOW_THREADS; + if (PQputCopyData(curs->conn->pgconn, + PyString_AS_STRING(o), length) == -1) { + error = 2; + } + Py_END_ALLOW_THREADS; + + if (error == 2) break; + + Py_DECREF(o); + } + + Py_XDECREF(o); + + if (error == 0 || error == 2) + /* 0 means that the copy went well, 2 that there was an error on the + backend: in both cases we'll get the error message from the + PQresult */ + PQputCopyEnd(curs->conn->pgconn, NULL); + else + PQputCopyEnd(curs->conn->pgconn, "error during .read() call"); + + /* and finally we grab the operation result from the backend */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + + return 1; +} +#endif +static int +_pq_copy_in(cursorObject *curs) +{ + /* COPY FROM implementation when protocol 3 is not available: this + function can't fail but the backend will send an ERROR notice that will + be catched by our notice collector */ + PyObject *o; + + while (1) { + o = PyObject_CallMethod(curs->copyfile, "readline", NULL); + if (!o || o == Py_None || PyString_GET_SIZE(o) == 0) break; + if (PQputline(curs->conn->pgconn, PyString_AS_STRING(o)) != 0) { + Py_DECREF(o); + return -1; + } + Py_DECREF(o); + } + Py_XDECREF(o); + PQputline(curs->conn->pgconn, "\\.\n"); + PQendcopy(curs->conn->pgconn); + + /* if for some reason we're using a protocol 3 libpq to connect to a + protocol 2 backend we still need to cycle on the result set */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + + return 1; +} + +#ifdef HAVE_PQPROTOCOL3 +static int +_pq_copy_out_v3(cursorObject *curs) +{ + char *buffer; + int len; + + while (1) { + Py_BEGIN_ALLOW_THREADS; + len = PQgetCopyData(curs->conn->pgconn, &buffer, 0); + Py_END_ALLOW_THREADS; + + if (len > 0 && buffer) { + PyObject_CallMethod(curs->copyfile, "write", "s#", buffer, len); + PQfreemem(buffer); + } + /* we break on len == 0 but note that that should *not* happen, + because we are not doing an async call (if it happens blame + postgresql authors :/) */ + else if (len <= 0) break; + } + + if (len == -2) { + pq_raise(curs->conn, NULL, NULL, NULL); + return -1; + } + + /* and finally we grab the operation result from the backend */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + return 1; +} +#endif + +static int +_pq_copy_out(cursorObject *curs) +{ + char buffer[4096]; + int status, len; + + while (1) { + Py_BEGIN_ALLOW_THREADS; + status = PQgetline(curs->conn->pgconn, buffer, 4096); + Py_END_ALLOW_THREADS; + if (status == 0) { + if (buffer[0] == '\\' && buffer[1] == '.') break; + + len = strlen(buffer); + buffer[len++] = '\n'; + } + else if (status == 1) { + len = 4096-1; + } + else { + return -1; + } + + PyObject_CallMethod(curs->copyfile, "write", "s#", buffer, len); + } + + status = 1; + if (PQendcopy(curs->conn->pgconn) != 0) + status = -1; + + /* if for some reason we're using a protocol 3 libpq to connect to a + protocol 2 backend we still need to cycle on the result set */ + IFCLEARPGRES(curs->pgres); + while ((curs->pgres = PQgetResult(curs->conn->pgconn)) != NULL) { + if (PQresultStatus(curs->pgres) == PGRES_FATAL_ERROR) + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + } + + return status; +} + +int +pq_fetch(cursorObject *curs) +{ + int pgstatus, ex = -1; + + /* even if we fail, we remove any information about the previous query */ + curs_reset(curs); + + /* we check the result from the previous execute; if the result is not + already there, we need to consume some input and go to sleep until we + get something edible to eat */ + if (!curs->pgres) { + + Dprintf("pq_fetch: no data: entering polling loop"); + + while (pq_is_busy(curs->conn) > 0) { + fd_set rfds; + struct timeval tv; + int sval, sock; + + Py_BEGIN_ALLOW_THREADS; + pthread_mutex_lock(&(curs->conn->lock)); + + sock = PQsocket(curs->conn->pgconn); + FD_ZERO(&rfds); + FD_SET(sock, &rfds); + + /* set a default timeout of 5 seconds + TODO: make use of the timeout, maybe allowing the user to + make a non-blocking (timeouted) call to fetchXXX */ + tv.tv_sec = 5; + tv.tv_usec = 0; + + Dprintf("pq_fetch: entering PDflush() loop"); + while (PQflush(curs->conn->pgconn) != 0); + sval = select(sock+1, &rfds, NULL, NULL, &tv); + + pthread_mutex_unlock(&(curs->conn->lock)); + Py_END_ALLOW_THREADS; + } + + Dprintf("pq_fetch: data is probably ready"); + IFCLEARPGRES(curs->pgres); + curs->pgres = PQgetResult(curs->conn->pgconn); + } + + /* check for PGRES_FATAL_ERROR result */ + /* FIXME: I am not sure we need to check for critical error here. + if (curs->pgres == NULL) { + Dprintf("pq_fetch: got a NULL pgres, checking for critical"); + pq_set_critical(curs->conn); + if (curs->conn->critical) { + pq_resolve_critical(curs->conn); + return -1; + } + else { + return 0; + } + } + */ + + if (curs->pgres == NULL) return 0; + + pgstatus = PQresultStatus(curs->pgres); + Dprintf("pq_fetch: pgstatus = %s", PQresStatus(pgstatus)); + + /* backend status message */ + Py_XDECREF(curs->pgstatus); + curs->pgstatus = PyString_FromString(PQcmdStatus(curs->pgres)); + + switch(pgstatus) { + + case PGRES_COMMAND_OK: + Dprintf("pq_fetch: command returned OK (no tuples)"); + curs->rowcount = atoi(PQcmdTuples(curs->pgres)); + curs->lastoid = PQoidValue(curs->pgres); + CLEARPGRES(curs->pgres); + ex = 1; + break; + + case PGRES_COPY_OUT: + Dprintf("pq_fetch: data from a COPY TO (no tuples)"); +#ifdef HAVE_PQPROTOCOL3 + if (curs->conn->protocol == 3) + ex = _pq_copy_out_v3(curs); + else +#endif + ex = _pq_copy_out(curs); + curs->rowcount = -1; + /* error caught by out glorious notice handler */ + if (PyErr_Occurred()) ex = -1; + IFCLEARPGRES(curs->pgres); + break; + + case PGRES_COPY_IN: + Dprintf("pq_fetch: data from a COPY FROM (no tuples)"); +#ifdef HAVE_PQPROTOCOL3 + if (curs->conn->protocol == 3) + ex = _pq_copy_in_v3(curs); + else +#endif + ex = _pq_copy_in(curs); + curs->rowcount = -1; + /* error caught by out glorious notice handler */ + if (PyErr_Occurred()) ex = -1; + IFCLEARPGRES(curs->pgres); + break; + + case PGRES_TUPLES_OK: + Dprintf("pq_fetch: data from a SELECT (got tuples)"); + curs->rowcount = PQntuples(curs->pgres); + _pq_fetch_tuples(curs); ex = 0; + /* don't clear curs->pgres, because it contains the results! */ + break; + + default: + Dprintf("pq_fetch: uh-oh, something FAILED"); + pq_raise(curs->conn, curs, NULL, NULL); + IFCLEARPGRES(curs->pgres); + ex = -1; + break; + } + + Dprintf("pq_fetch: fetching done; check for critical errors"); + + /* error checking, close the connection if necessary (some critical errors + are not really critical, like a COPY FROM error: if that's the case we + raise the exception but we avoid to close the connection) */ + if (curs->conn->critical) { + if (ex == -1) { + pq_resolve_critical(curs->conn, 1); + } + else { + pq_resolve_critical(curs->conn, 0); + } + return -1; + } + + return ex; +} diff --git a/trunk/psycopg2/psycopg/pqpath.h b/trunk/psycopg2/psycopg/pqpath.h new file mode 100644 index 0000000..64d113e --- /dev/null +++ b/trunk/psycopg2/psycopg/pqpath.h @@ -0,0 +1,41 @@ +/* pqpath.h - definitions for pqpath.c + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_PQPATH_H +#define PSYCOPG_PQPATH_H 1 + +#include "psycopg/cursor.h" +#include "psycopg/connection.h" + +/* macros to clean the pg result */ +#define IFCLEARPGRES(pgres) if (pgres) {PQclear(pgres); pgres = NULL;} +#define CLEARPGRES(pgres) PQclear(pgres); pgres = NULL + +/* exported functions */ +extern int pq_fetch(cursorObject *curs); +extern int pq_execute(cursorObject *curs, const char *query, int async); +extern int pq_begin(connectionObject *conn); +extern int pq_commit(connectionObject *conn); +extern int pq_abort(connectionObject *conn); +extern int pq_is_busy(connectionObject *conn); +extern void pq_set_critical(connectionObject *conn, const char *msg); + +#endif /* !defined(PSYCOPG_PQPATH_H) */ diff --git a/trunk/psycopg2/psycopg/psycopg.h b/trunk/psycopg2/psycopg/psycopg.h new file mode 100644 index 0000000..a689ea4 --- /dev/null +++ b/trunk/psycopg2/psycopg/psycopg.h @@ -0,0 +1,142 @@ +/* psycopg.h - definitions for the psycopg python module + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_H +#define PSYCOPG_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* DBAPI compliance parameters */ +#define APILEVEL "2.0" +#define THREADSAFETY 2 +#define PARAMSTYLE "pyformat" + +/* C API functions */ +#define psyco_errors_fill_NUM 0 +#define psyco_errors_fill_RETURN void +#define psyco_errors_fill_PROTO (PyObject *dict) +#define psyco_errors_set_NUM 1 +#define psyco_errors_set_RETURN void +#define psyco_errors_set_PROTO (PyObject *type) + +/* Total number of C API pointers */ +#define PSYCOPG_API_pointers 2 + +#ifdef PSYCOPG_MODULE + /** This section is used when compiling psycopgmodule.c & co. **/ +extern psyco_errors_fill_RETURN psyco_errors_fill psyco_errors_fill_PROTO; +extern psyco_errors_set_RETURN psyco_errors_set psyco_errors_set_PROTO; + +/* global excpetions */ +extern PyObject *Error, *Warning, *InterfaceError, *DatabaseError, + *InternalError, *OperationalError, *ProgrammingError, + *IntegrityError, *DataError, *NotSupportedError; + +/* python versions and compatibility stuff */ +#ifndef PyMODINIT_FUNC +#define PyMODINIT_FUNC void +#endif + +#else + /** This section is used in modules that use psycopg's C API **/ + +static void **PSYCOPG_API; + +#define psyco_errors_fill \ + (*(psyco_errors_fill_RETURN (*)psyco_errors_fill_PROTO) \ + PSYCOPG_API[psyco_errors_fill_NUM]) +#define psyco_errors_set \ + (*(psyco_errors_set_RETURN (*)psyco_errors_set_PROTO) \ + PSYCOPG_API[psyco_errors_set_NUM]) + +/* Return -1 and set exception on error, 0 on success. */ +static int +import_psycopg(void) +{ + PyObject *module = PyImport_ImportModule("psycopg"); + + if (module != NULL) { + PyObject *c_api_object = PyObject_GetAttrString(module, "_C_API"); + if (c_api_object == NULL) return -1; + if (PyCObject_Check(c_api_object)) + PSYCOPG_API = (void **)PyCObject_AsVoidPtr(c_api_object); + Py_DECREF(c_api_object); + } + return 0; +} + +#endif + +/* postgresql<->python encoding map */ +extern PyObject *psycoEncodings; + +typedef struct { + char *pgenc; + char *pyenc; +} encodingPair; + +/* the Decimal type, used by the DECIMAL typecaster */ +extern PyObject *decimalType; + +/* some utility functions */ +extern void psyco_set_error(PyObject *exc, PyObject *curs, char *msg, + char *pgerror, char *pgcode); + +/* Exceptions docstrings */ +#define Error_doc \ +"Base class for error exceptions." + +#define Warning_doc \ +"A database warning." + +#define InterfaceError_doc \ +"Error related to the database interface." + +#define DatabaseError_doc \ +"Error related to the database engine." + +#define InternalError_doc \ +"The database encountered an internal error." + +#define OperationalError_doc \ +"Error related to database operation (disconnect, memory allocation etc)." + +#define ProgrammingError_doc \ +"Error related to database programming (SQL error, table not found etc)." + +#define IntegrityError_doc \ +"Error related to database integrity." + +#define DataError_doc \ +"Error related to problems with the processed data." + +#define NotSupportedError_doc \ +"A not supported datbase API was called." + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_H) */ diff --git a/trunk/psycopg2/psycopg/psycopgmodule.c b/trunk/psycopg2/psycopg/psycopgmodule.c new file mode 100644 index 0000000..426fb27 --- /dev/null +++ b/trunk/psycopg2/psycopg/psycopgmodule.c @@ -0,0 +1,672 @@ +/* psycopgmodule.c - psycopg module (will import other C classes) + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/python.h" +#include "psycopg/psycopg.h" +#include "psycopg/connection.h" +#include "psycopg/cursor.h" +#include "psycopg/typecast.h" +#include "psycopg/microprotocols.h" +#include "psycopg/microprotocols_proto.h" + +#include "psycopg/adapter_qstring.h" +#include "psycopg/adapter_binary.h" +#include "psycopg/adapter_pboolean.h" +#include "psycopg/adapter_asis.h" +#include "psycopg/adapter_list.h" +#include "psycopg/typecast_binary.h" + +#ifdef HAVE_MXDATETIME +#include +#include "psycopg/adapter_mxdatetime.h" +mxDateTimeModule_APIObject *mxDateTimeP = NULL; +#endif + +/* some module-level variables, like the datetime module */ +#ifdef HAVE_PYDATETIME +#include +#include "psycopg/adapter_datetime.h" +PyObject *pyDateTimeModuleP = NULL; +PyObject *pyDateTypeP = NULL; +PyObject *pyTimeTypeP = NULL; +PyObject *pyDateTimeTypeP = NULL; +PyObject *pyDeltaTypeP = NULL; +#endif + +/* pointers to the psycopg.tz classes */ +PyObject *pyPsycopgTzModule = NULL; +PyObject *pyPsycopgTzLOCAL = NULL; +PyObject *pyPsycopgTzFixedOffsetTimezone = NULL; + +PyObject *psycoEncodings = NULL; +PyObject *decimalType = NULL; + +/** connect module-level function **/ +#define psyco_connect_doc \ +"connect(dsn, ...) -- Create a new database connection.\n\n" \ +"This function supports two different but equivalent sets of arguments.\n" \ +"A single data source name or ``dsn`` string can be used to specify the\n" \ +"connection parameters, as follows::\n\n" \ +" psycopg2.connect(\"dbname=xxx user=xxx ...\")\n\n" \ +"If ``dsn`` is not provided it is possible to pass the parameters as\n" \ +"keyword arguments; e.g.::\n\n" \ +" psycopg2.connect(database='xxx', user='xxx', ...)\n\n" \ +"The full list of available parameters is:\n\n" \ +"- ``dbname`` -- database name (only in 'dsn')\n" \ +"- ``database`` -- database name (only as keyword argument)\n" \ +"- ``host`` -- host address (defaults to UNIX socket if not provided)\n" \ +"- ``port`` -- port number (defaults to 5432 if not provided)\n" \ +"- ``user`` -- user name used to authenticate\n" \ +"- ``password`` -- password used to authenticate\n" \ +"- ``sslmode`` -- SSL mode (see PostgreSQL documentation)\n\n" \ +"If the ``connection_factory`` keyword argument is not provided this\n" \ +"function always return an instance of the `connection` class.\n" \ +"Else the given sub-class of `extensions.connection` will be used to\n" \ +"instantiate the connection object.\n\n" \ +":return: New database connection\n" \ +":rtype: `extensions.connection`" + +static int +_psyco_connect_fill_dsn(char *dsn, char *kw, char *v, int i) +{ + strcpy(&dsn[i], kw); i += strlen(kw); + strcpy(&dsn[i], v); i += strlen(v); + return i; +} + +static void +_psyco_connect_fill_exc(connectionObject *conn) +{ + /* fill the connection object with the exceptions */ + conn->exc_Error = Error; + Py_INCREF(Error); + conn->exc_Warning = Warning; + Py_INCREF(Warning); + conn->exc_InterfaceError = InterfaceError; + Py_INCREF(InterfaceError); + conn->exc_DatabaseError = DatabaseError; + Py_INCREF(DatabaseError); + conn->exc_InternalError = InternalError; + Py_INCREF(InternalError); + conn->exc_ProgrammingError = ProgrammingError; + Py_INCREF(ProgrammingError); + conn->exc_IntegrityError = IntegrityError; + Py_INCREF(IntegrityError); + conn->exc_DataError = DataError; + Py_INCREF(DataError); + conn->exc_NotSupportedError = NotSupportedError; + Py_INCREF(NotSupportedError); + conn->exc_OperationalError = OperationalError; + Py_INCREF(OperationalError); +} + +static PyObject * +psyco_connect(PyObject *self, PyObject *args, PyObject *keywds) +{ + PyObject *conn, *factory = NULL; + PyObject *pyport = NULL; + + int idsn=-1, iport=-1; + char *dsn=NULL, *database=NULL, *user=NULL, *password=NULL; + char *host=NULL, *sslmode=NULL; + char port[16]; + + static char *kwlist[] = {"dsn", "database", "host", "port", + "user", "password", "sslmode", + "connection_factory", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, keywds, "|sssOsssO", kwlist, + &dsn, &database, &host, &pyport, + &user, &password, &sslmode, &factory)) { + return NULL; + } + + if (pyport && PyString_Check(pyport)) { + PyObject *pyint = PyInt_FromString(PyString_AsString(pyport), NULL, 10); + if (!pyint) return NULL; + iport = PyInt_AsLong(pyint); + } + else if (pyport && PyInt_Check(pyport)) { + iport = PyInt_AsLong(pyport); + } + else if (pyport != NULL) { + PyErr_SetString(PyExc_TypeError, "port must be a string or int"); + return NULL; + } + + if (iport > 0) + PyOS_snprintf(port, 16, "%d", iport); + + if (dsn == NULL) { + int l = 45; /* len("dbname= user= password= host= port= sslmode=\0") */ + + if (database) l += strlen(database); + if (host) l += strlen(host); + if (iport > 0) l += strlen(port); + if (user) l += strlen(user); + if (password) l += strlen(password); + if (sslmode) l += strlen(sslmode); + + dsn = malloc(l*sizeof(char)); + if (dsn == NULL) { + PyErr_SetString(InterfaceError, "dynamic dsn allocation failed"); + return NULL; + } + + idsn = 0; + if (database) + idsn = _psyco_connect_fill_dsn(dsn, " dbname=", database, idsn); + if (host) + idsn = _psyco_connect_fill_dsn(dsn, " host=", host, idsn); + if (iport > 0) + idsn = _psyco_connect_fill_dsn(dsn, " port=", port, idsn); + if (user) + idsn = _psyco_connect_fill_dsn(dsn, " user=", user, idsn); + if (password) + idsn = _psyco_connect_fill_dsn(dsn, " password=", password, idsn); + if (sslmode) + idsn = _psyco_connect_fill_dsn(dsn, " sslmode=", sslmode, idsn); + + if (idsn > 0) { + dsn[idsn] = '\0'; + memmove(dsn, &dsn[1], idsn); + } + else { + free(dsn); + PyErr_SetString(InterfaceError, "missing dsn and no parameters"); + return NULL; + } + } + + Dprintf("psyco_connect: dsn = '%s'", dsn); + + /* allocate connection, fill with errors and return it */ + if (factory == NULL) factory = (PyObject *)&connectionType; + conn = PyObject_CallFunction(factory, "s", dsn); + if (conn) _psyco_connect_fill_exc((connectionObject*)conn); + + return conn; +} + +/** type registration **/ +#define psyco_register_type_doc \ +"register_type(obj) -> None -- register obj with psycopg type system\n\n" \ +":Parameters:\n" \ +" * `obj`: A type adapter created by `new_type()`" + +#define typecast_from_python_doc \ +"new_type(oids, name, adapter) -> new type object\n\n" \ +"Create a new binding object. The object can be used with the\n" \ +"`register_type()` function to bind PostgreSQL objects to python objects.\n\n" \ +":Parameters:\n" \ +" * `oids`: Tuple of ``oid`` of the PostgreSQL types to convert.\n" \ +" * `name`: Name for the new type\n" \ +" * `adapter`: Callable to perform type conversion.\n" \ +" It must have the signature ``fun(value, cur)`` where ``value`` is\n" \ +" the string representation returned by PostgreSQL (`None` if ``NULL``)\n" \ +" and ``cur`` is the cursor from which data are read." + +static PyObject * +psyco_register_type(PyObject *self, PyObject *args) +{ + PyObject *type; + + if (!PyArg_ParseTuple(args, "O!", &typecastType, &type)) { + return NULL; + } + + typecast_add(type, 0); + + Py_INCREF(Py_None); + return Py_None; +} + + +/* default adapters */ + +static void +psyco_adapters_init(PyObject *mod) +{ + PyObject *call; + + microprotocols_add(&PyFloat_Type, NULL, (PyObject*)&asisType); + microprotocols_add(&PyInt_Type, NULL, (PyObject*)&asisType); + microprotocols_add(&PyLong_Type, NULL, (PyObject*)&asisType); + + microprotocols_add(&PyString_Type, NULL, (PyObject*)&qstringType); + microprotocols_add(&PyUnicode_Type, NULL, (PyObject*)&qstringType); + microprotocols_add(&PyBuffer_Type, NULL, (PyObject*)&binaryType); + microprotocols_add(&PyList_Type, NULL, (PyObject*)&listType); + +#ifdef HAVE_MXDATETIME + /* the module has already been initialized, so we can obtain the callable + objects directly from its dictionary :) */ + call = PyMapping_GetItemString(mod, "TimestampFromMx"); + microprotocols_add(mxDateTimeP->DateTime_Type, NULL, call); + call = PyMapping_GetItemString(mod, "TimeFromMx"); + microprotocols_add(mxDateTimeP->DateTimeDelta_Type, NULL, call); +#endif + +#ifdef HAVE_PYDATETIME + /* as above, we use the callable objects from the psycopg module */ + call = PyMapping_GetItemString(mod, "DateFromPy"); + microprotocols_add((PyTypeObject*)pyDateTypeP, NULL, call); + call = PyMapping_GetItemString(mod, "TimeFromPy"); + microprotocols_add((PyTypeObject*)pyTimeTypeP, NULL, call); + call = PyMapping_GetItemString(mod, "TimestampFromPy"); + microprotocols_add((PyTypeObject*)pyDateTimeTypeP, NULL, call); + call = PyMapping_GetItemString(mod, "IntervalFromPy"); + microprotocols_add((PyTypeObject*)pyDeltaTypeP, NULL, call); +#endif + +#ifdef HAVE_PYBOOL + microprotocols_add(&PyBool_Type, NULL, (PyObject*)&pbooleanType); +#endif + +#ifdef HAVE_DECIMAL + microprotocols_add((PyTypeObject*)decimalType, NULL, (PyObject*)&asisType); +#endif +} + +/* psyco_encodings_fill + + Fill the module's postgresql<->python encoding table */ + +static encodingPair encodings[] = { + {"SQL_ASCII", "ascii"}, + {"LATIN1", "latin_1"}, + {"UNICODE", "utf_8"}, + {"UTF8", "utf_8"}, + + /* some compatibility stuff */ + {"LATIN-1", "latin_1"}, + + {NULL, NULL} +}; +static void psyco_encodings_fill(PyObject *dict) +{ + encodingPair *enc; + + for (enc = encodings; enc->pgenc != NULL; enc++) { + PyObject *value = PyString_FromString(enc->pyenc); + PyDict_SetItemString(dict, enc->pgenc, value); + Py_DECREF(value); + } +} + +/* psyco_errors_init, psyco_errors_fill (callable from C) + + Initialize the module's exceptions and after that a dictionary with a full + set of exceptions. */ + +PyObject *Error, *Warning, *InterfaceError, *DatabaseError, + *InternalError, *OperationalError, *ProgrammingError, + *IntegrityError, *DataError, *NotSupportedError; + +/* mapping between exception names and their PyObject */ +static struct { + char *name; + PyObject **exc; + PyObject **base; + char *docstr; +} exctable[] = { + { "psycopg2.Error", &Error, 0, Error_doc }, + { "psycopg2.Warning", &Warning, 0, Warning_doc }, + { "psycopg2.InterfaceError", &InterfaceError, &Error, InterfaceError_doc }, + { "psycopg2.DatabaseError", &DatabaseError, &Error, DatabaseError_doc }, + { "psycopg2.InternalError", &InternalError, &DatabaseError, InternalError_doc }, + { "psycopg2.OperationalError", &OperationalError, &DatabaseError, + OperationalError_doc }, + { "psycopg2.ProgrammingError", &ProgrammingError, &DatabaseError, + ProgrammingError_doc }, + { "psycopg2.IntegrityError", &IntegrityError, &DatabaseError, + IntegrityError_doc }, + { "psycopg2.DataError", &DataError, &DatabaseError, DataError_doc }, + { "psycopg2.NotSupportedError", &NotSupportedError, &DatabaseError, + NotSupportedError_doc }, + {NULL} /* Sentinel */ +}; + +static void +psyco_errors_init(void) +{ + /* the names of the exceptions here reflect the oranization of the + psycopg2 module and not the fact the the original error objects + live in _psycopg */ + + int i; + PyObject *dict; + PyObject *base; + PyObject *str; + + for (i=0; exctable[i].name; i++) { + dict = PyDict_New(); + + if (exctable[i].docstr) { + str = PyString_FromString(exctable[i].docstr); + PyDict_SetItemString(dict, "__doc__", str); + } + + if (exctable[i].base == 0) + base = PyExc_StandardError; + else + base = *exctable[i].base; + + *exctable[i].exc = PyErr_NewException(exctable[i].name, base, dict); + } +} + +void +psyco_errors_fill(PyObject *dict) +{ + PyDict_SetItemString(dict, "Error", Error); + PyDict_SetItemString(dict, "Warning", Warning); + PyDict_SetItemString(dict, "InterfaceError", InterfaceError); + PyDict_SetItemString(dict, "DatabaseError", DatabaseError); + PyDict_SetItemString(dict, "InternalError", InternalError); + PyDict_SetItemString(dict, "OperationalError", OperationalError); + PyDict_SetItemString(dict, "ProgrammingError", ProgrammingError); + PyDict_SetItemString(dict, "IntegrityError", IntegrityError); + PyDict_SetItemString(dict, "DataError", DataError); + PyDict_SetItemString(dict, "NotSupportedError", NotSupportedError); +} + +void +psyco_errors_set(PyObject *type) +{ + PyObject_SetAttrString(type, "Error", Error); + PyObject_SetAttrString(type, "Warning", Warning); + PyObject_SetAttrString(type, "InterfaceError", InterfaceError); + PyObject_SetAttrString(type, "DatabaseError", DatabaseError); + PyObject_SetAttrString(type, "InternalError", InternalError); + PyObject_SetAttrString(type, "OperationalError", OperationalError); + PyObject_SetAttrString(type, "ProgrammingError", ProgrammingError); + PyObject_SetAttrString(type, "IntegrityError", IntegrityError); + PyObject_SetAttrString(type, "DataError", DataError); + PyObject_SetAttrString(type, "NotSupportedError", NotSupportedError); +} + +/* psyco_error_new + + Create a new error of the given type with extra attributes. */ + +void +psyco_set_error(PyObject *exc, PyObject *curs, char *msg, + char *pgerror, char *pgcode) +{ + PyObject *t; + + PyObject *err = PyObject_CallFunction(exc, "s", msg); + + if (err) { + if (pgerror) { + t = PyString_FromString(pgerror); + } + else { + t = Py_None ; Py_INCREF(t); + } + PyObject_SetAttrString(err, "pgerror", t); + Py_DECREF(t); + + if (pgcode) { + t = PyString_FromString(pgcode); + } + else { + t = Py_None ; Py_INCREF(t); + } + PyObject_SetAttrString(err, "pgcode", t); + Py_DECREF(t); + + if (curs) + PyObject_SetAttrString(err, "cursor", curs); + else + PyObject_SetAttrString(err, "cursor", Py_None); + + PyErr_SetObject(exc, err); + Py_DECREF(err); + } +} + +/* psyco_decimal_init + + Initialize the module's pointer to the decimal type. */ + +void +psyco_decimal_init(void) +{ +#ifdef HAVE_DECIMAL + PyObject *decimal = PyImport_ImportModule("decimal"); + if (decimal) { + decimalType = PyObject_GetAttrString(decimal, "Decimal"); + } + else { + PyErr_Clear(); + decimalType = (PyObject *)&PyFloat_Type; + Py_INCREF(decimalType); + } +#endif +} + + +/** method table and module initialization **/ + +static PyMethodDef psycopgMethods[] = { + {"connect", (PyCFunction)psyco_connect, + METH_VARARGS|METH_KEYWORDS, psyco_connect_doc}, + {"adapt", (PyCFunction)psyco_microprotocols_adapt, + METH_VARARGS, psyco_microprotocols_adapt_doc}, + + {"register_type", (PyCFunction)psyco_register_type, + METH_VARARGS, psyco_register_type_doc}, + {"new_type", (PyCFunction)typecast_from_python, + METH_VARARGS|METH_KEYWORDS, typecast_from_python_doc}, + + {"AsIs", (PyCFunction)psyco_AsIs, + METH_VARARGS, psyco_AsIs_doc}, + {"QuotedString", (PyCFunction)psyco_QuotedString, + METH_VARARGS, psyco_QuotedString_doc}, + {"Boolean", (PyCFunction)psyco_Boolean, + METH_VARARGS, psyco_Boolean_doc}, + {"Binary", (PyCFunction)psyco_Binary, + METH_VARARGS, psyco_Binary_doc}, + {"Date", (PyCFunction)psyco_Date, + METH_VARARGS, psyco_Date_doc}, + {"Time", (PyCFunction)psyco_Time, + METH_VARARGS, psyco_Time_doc}, + {"Timestamp", (PyCFunction)psyco_Timestamp, + METH_VARARGS, psyco_Timestamp_doc}, + {"DateFromTicks", (PyCFunction)psyco_DateFromTicks, + METH_VARARGS, psyco_DateFromTicks_doc}, + {"TimeFromTicks", (PyCFunction)psyco_TimeFromTicks, + METH_VARARGS, psyco_TimeFromTicks_doc}, + {"TimestampFromTicks", (PyCFunction)psyco_TimestampFromTicks, + METH_VARARGS, psyco_TimestampFromTicks_doc}, + {"List", (PyCFunction)psyco_List, + METH_VARARGS, psyco_List_doc}, + +#ifdef HAVE_MXDATETIME + {"DateFromMx", (PyCFunction)psyco_DateFromMx, + METH_VARARGS, psyco_DateFromMx_doc}, + {"TimeFromMx", (PyCFunction)psyco_TimeFromMx, + METH_VARARGS, psyco_TimeFromMx_doc}, + {"TimestampFromMx", (PyCFunction)psyco_TimestampFromMx, + METH_VARARGS, psyco_TimestampFromMx_doc}, + {"IntervalFromMx", (PyCFunction)psyco_IntervalFromMx, + METH_VARARGS, psyco_IntervalFromMx_doc}, +#endif + +#ifdef HAVE_PYDATETIME + {"DateFromPy", (PyCFunction)psyco_DateFromPy, + METH_VARARGS, psyco_DateFromPy_doc}, + {"TimeFromPy", (PyCFunction)psyco_TimeFromPy, + METH_VARARGS, psyco_TimeFromPy_doc}, + {"TimestampFromPy", (PyCFunction)psyco_TimestampFromPy, + METH_VARARGS, psyco_TimestampFromPy_doc}, + {"IntervalFromPy", (PyCFunction)psyco_IntervalFromPy, + METH_VARARGS, psyco_IntervalFromPy_doc}, +#endif + + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +PyMODINIT_FUNC +init_psycopg(void) +{ + static void *PSYCOPG_API[PSYCOPG_API_pointers]; + + PyObject *module, *dict; + PyObject *c_api_object; + + Dprintf("initpsycopg: initializing psycopg %s", PSYCOPG_VERSION); + + /* initialize all the new types and then the module */ + connectionType.ob_type = &PyType_Type; + cursorType.ob_type = &PyType_Type; + typecastType.ob_type = &PyType_Type; + qstringType.ob_type = &PyType_Type; + binaryType.ob_type = &PyType_Type; + isqlquoteType.ob_type = &PyType_Type; + asisType.ob_type = &PyType_Type; + listType.ob_type = &PyType_Type; + chunkType.ob_type = &PyType_Type; + + if (PyType_Ready(&connectionType) == -1) return; + if (PyType_Ready(&cursorType) == -1) return; + if (PyType_Ready(&typecastType) == -1) return; + if (PyType_Ready(&qstringType) == -1) return; + if (PyType_Ready(&binaryType) == -1) return; + if (PyType_Ready(&isqlquoteType) == -1) return; + if (PyType_Ready(&asisType) == -1) return; + if (PyType_Ready(&listType) == -1) return; + if (PyType_Ready(&chunkType) == -1) return; + +#ifdef HAVE_PYBOOL + pbooleanType.ob_type = &PyType_Type; + if (PyType_Ready(&pbooleanType) == -1) return; +#endif + + /* import mx.DateTime module, if necessary */ +#ifdef HAVE_MXDATETIME + mxdatetimeType.ob_type = &PyType_Type; + if (PyType_Ready(&mxdatetimeType) == -1) return; + if (mxDateTime_ImportModuleAndAPI() != 0) { + Dprintf("initpsycopg: why marc hide mx.DateTime again?!"); + PyErr_SetString(PyExc_ImportError, "can't import mx.DateTime module"); + return; + } + mxDateTimeP = &mxDateTime; +#endif + + /* import python builtin datetime module, if available */ +#ifdef HAVE_PYDATETIME + pyDateTimeModuleP = PyImport_ImportModule("datetime"); + if (pyDateTimeModuleP == NULL) { + Dprintf("initpsycopg: can't import datetime module"); + PyErr_SetString(PyExc_ImportError, "can't import datetime module"); + return; + } + pydatetimeType.ob_type = &PyType_Type; + if (PyType_Ready(&pydatetimeType) == -1) return; + + /* now we define the datetime types, this is crazy because python should + be doing that, not us! */ + pyDateTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "date"); + pyTimeTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "time"); + pyDateTimeTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "datetime"); + pyDeltaTypeP = PyObject_GetAttrString(pyDateTimeModuleP, "timedelta"); +#endif + + /* import psycopg2.tz anyway (TODO: replace with C-level module?) */ + pyPsycopgTzModule = PyImport_ImportModule("psycopg2.tz"); + if (pyPsycopgTzModule == NULL) { + Dprintf("initpsycopg: can't import psycopg2.tz module"); + PyErr_SetString(PyExc_ImportError, "can't import psycopg2.tz module"); + return; + } + pyPsycopgTzLOCAL = + PyObject_GetAttrString(pyPsycopgTzModule, "LOCAL"); + pyPsycopgTzFixedOffsetTimezone = + PyObject_GetAttrString(pyPsycopgTzModule, "FixedOffsetTimezone"); + + /* initialize the module and grab module's dictionary */ + module = Py_InitModule("_psycopg", psycopgMethods); + dict = PyModule_GetDict(module); + + /* initialize all the module's exported functions */ + /* PyBoxer_API[PyBoxer_Fake_NUM] = (void *)PyBoxer_Fake; */ + + /* Create a CObject containing the API pointer array's address */ + c_api_object = PyCObject_FromVoidPtr((void *)PSYCOPG_API, NULL); + if (c_api_object != NULL) + PyModule_AddObject(module, "_C_API", c_api_object); + + /* other mixed initializations of module-level variables */ + psycoEncodings = PyDict_New(); + psyco_encodings_fill(psycoEncodings); + psyco_decimal_init(); + + /* set some module's parameters */ + PyModule_AddStringConstant(module, "__version__", PSYCOPG_VERSION); + PyModule_AddStringConstant(module, "__doc__", "psycopg PostgreSQL driver"); + PyModule_AddObject(module, "apilevel", PyString_FromString(APILEVEL)); + PyModule_AddObject(module, "threadsafety", PyInt_FromLong(THREADSAFETY)); + PyModule_AddObject(module, "paramstyle", PyString_FromString(PARAMSTYLE)); + + /* put new types in module dictionary */ + PyModule_AddObject(module, "connection", (PyObject*)&connectionType); + PyModule_AddObject(module, "cursor", (PyObject*)&cursorType); + PyModule_AddObject(module, "ISQLQuote", (PyObject*)&isqlquoteType); + + /* encodings dictionary in module dictionary */ + PyModule_AddObject(module, "encodings", psycoEncodings); + + /* initialize default set of typecasters */ + typecast_init(dict); + + /* initialize microprotocols layer */ + microprotocols_init(dict); + psyco_adapters_init(dict); + + /* create a standard set of exceptions and add them to the module's dict */ + psyco_errors_init(); + psyco_errors_fill(dict); + + /* Solve win32 build issue about non-constant initializer element */ + cursorType.tp_alloc = PyType_GenericAlloc; + binaryType.tp_alloc = PyType_GenericAlloc; + isqlquoteType.tp_alloc = PyType_GenericAlloc; + pbooleanType.tp_alloc = PyType_GenericAlloc; + connectionType.tp_alloc = PyType_GenericAlloc; + asisType.tp_alloc = PyType_GenericAlloc; + qstringType.tp_alloc = PyType_GenericAlloc; + listType.tp_alloc = PyType_GenericAlloc; + chunkType.tp_alloc = PyType_GenericAlloc; + +#ifdef HAVE_PYDATETIME + pydatetimeType.tp_alloc = PyType_GenericAlloc; +#endif + + Dprintf("initpsycopg: module initialization complete"); +} diff --git a/trunk/psycopg2/psycopg/python.h b/trunk/psycopg2/psycopg/python.h new file mode 100644 index 0000000..1c2b96d --- /dev/null +++ b/trunk/psycopg2/psycopg/python.h @@ -0,0 +1,43 @@ +/* python.h - python version compatibility stuff + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_PYTHON_H +#define PSYCOPG_PYTHON_H 1 + +#include +#include + +/* python < 2.2 does not have PyMemeberDef */ +#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 2 +#define PyMemberDef memberlist +#endif + +/* PyObject_TypeCheck introduced in 2.2 */ +#ifndef PyObject_TypeCheck +#define PyObject_TypeCheck(o, t) ((o)->ob_type == (t)) +#endif + +/* python 2.2 does not have freefunc (it has destructor instead) */ +#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 3 +#define freefunc destructor +#endif + +#endif /* !defined(PSYCOPG_PYTHON_H) */ diff --git a/trunk/psycopg2/psycopg/typecast.c b/trunk/psycopg2/psycopg/typecast.c new file mode 100644 index 0000000..ef91bfd --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast.c @@ -0,0 +1,563 @@ +/* typecast.c - basic utility functions related to typecasting + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include + +#define PSYCOPG_MODULE +#include "psycopg/config.h" +#include "psycopg/psycopg.h" +#include "psycopg/python.h" +#include "psycopg/typecast.h" +#include "psycopg/cursor.h" + +/* usefull function used by some typecasters */ + +static char * +skip_until_space(char *s) +{ + while (*s && *s != ' ') s++; + return s; +} + +static char * +skip_until_space2(char *s, int *len) +{ + while (*len > 0 && *s && *s != ' ') { + s++; (*len)--; + } + return s; +} + +static int +typecast_parse_date(char* s, char** t, int* len, + int* year, int* month, int* day) +{ + int acc = -1, cz = 0; + + Dprintf("typecast_parse_date: len = %d, s = %s", *len, s); + + while (cz < 3 && *len > 0 && *s) { + switch (*s) { + case '-': + case ' ': + case 'T': + if (cz == 0) *year = acc; + else if (cz == 1) *month = acc; + else if (cz == 2) *day = acc; + acc = -1; cz++; + break; + default: + acc = (acc == -1 ? 0 : acc*10) + ((int)*s - (int)'0'); + break; + } + + s++; (*len)--; + } + + if (acc != -1) { + *day = acc; + cz += 1; + } + if (t != NULL) *t = s; + + return cz; +} + +static int +typecast_parse_time(char* s, char** t, int* len, + int* hh, int* mm, int* ss, int* us, int* tz) +{ + int acc = -1, cz = 0; + int tzs = 1, tzhh = 0, tzmm = 0; + int usd = 0; + + /* sets microseconds and timezone to 0 because they may be missing */ + *us = *tz = 0; + + Dprintf("typecast_parse_time: len = %d, s = %s", *len, s); + + while (cz < 6 && *len > 0 && *s) { + switch (*s) { + case ':': + if (cz == 0) *hh = acc; + else if (cz == 1) *mm = acc; + else if (cz == 2) *ss = acc; + else if (cz == 3) *us = acc; + else if (cz == 4) tzhh = acc; + acc = -1; cz++; + break; + case '.': + /* we expect seconds and if we don't get them we return an error */ + if (cz != 2) return -1; + *ss = acc; + acc = -1; cz++; + break; + case '+': + case '-': + /* seconds or microseconds here, anything else is an error */ + if (cz < 2 || cz > 3) return -1; + if (*s == '-') tzs = -1; + if (cz == 2) *ss = acc; + else if (cz == 3) *us = acc; + acc = -1; cz = 4; + break; + default: + acc = (acc == -1 ? 0 : acc*10) + ((int)*s - (int)'0'); + if (cz == 3) usd += 1; + break; + } + + s++; (*len)--; + } + + if (acc != -1) { + if (cz == 2) { *ss = acc; cz += 1; } + else if (cz == 3) { *us = acc; cz += 1; } + else if (cz == 4) { tzhh = acc; cz += 1; } + else if (cz == 5) tzmm = acc; + } + if (t != NULL) *t = s; + + *tz = tzs * tzhh*60 + tzmm; + + if (*us != 0.0) { + while (usd++ < 6) *us *= 10.0; + } + + return cz; +} + +/** include casting objects **/ +#include "psycopg/typecast_basic.c" +#include "psycopg/typecast_binary.c" + +#ifdef HAVE_MXDATETIME +#include "psycopg/typecast_mxdatetime.c" +#endif + +#ifdef HAVE_PYDATETIME +#include "psycopg/typecast_datetime.c" +#endif + +#include "psycopg/typecast_array.c" +#include "psycopg/typecast_builtins.c" + + +/* a list of initializers, used to make the typecasters accessible anyway */ +#ifdef HAVE_PYDATETIME +typecastObject_initlist typecast_pydatetime[] = { + {"PYDATETIME", typecast_DATETIME_types, typecast_PYDATETIME_cast}, + {"PYTIME", typecast_TIME_types, typecast_PYTIME_cast}, + {"PYDATE", typecast_DATE_types, typecast_PYDATE_cast}, + {"PYINTERVAL", typecast_INTERVAL_types, typecast_PYINTERVAL_cast}, + {NULL, NULL, NULL} +}; +#endif + +/* a list of initializers, used to make the typecasters accessible anyway */ +#ifdef HAVE_MXDATETIME +typecastObject_initlist typecast_mxdatetime[] = { + {"MXDATETIME", typecast_DATETIME_types, typecast_MXDATE_cast}, + {"MXTIME", typecast_TIME_types, typecast_MXTIME_cast}, + {"MXDATE", typecast_DATE_types, typecast_MXDATE_cast}, + {"MXINTERVAL", typecast_INTERVAL_types, typecast_MXINTERVAL_cast}, + {NULL, NULL, NULL} +}; +#endif + + +/** the type dictionary and associated functions **/ + +PyObject *psyco_types; +PyObject *psyco_default_cast; +PyObject *psyco_binary_types; +PyObject *psyco_default_binary_cast; + +static long int typecast_default_DEFAULT[] = {0}; +static typecastObject_initlist typecast_default = { + "DEFAULT", typecast_default_DEFAULT, typecast_STRING_cast}; + + +/* typecast_init - initialize the dictionary and create default types */ + +int +typecast_init(PyObject *dict) +{ + int i; + + /* create type dictionary and put it in module namespace */ + psyco_types = PyDict_New(); + psyco_binary_types = PyDict_New(); + + if (!psyco_types || !psyco_binary_types) { + Py_XDECREF(psyco_types); + Py_XDECREF(psyco_binary_types); + return -1; + } + + PyDict_SetItemString(dict, "string_types", psyco_types); + PyDict_SetItemString(dict, "binary_types", psyco_binary_types); + + /* insert the cast types into the 'types' dictionary and register them in + the module dictionary */ + for (i = 0; typecast_builtins[i].name != NULL; i++) { + typecastObject *t; + + Dprintf("typecast_init: initializing %s", typecast_builtins[i].name); + + t = (typecastObject *)typecast_from_c(&(typecast_builtins[i]), dict); + if (t == NULL) return -1; + if (typecast_add((PyObject *)t, 0) != 0) return -1; + + PyDict_SetItem(dict, t->name, (PyObject *)t); + + /* export binary object */ + if (typecast_builtins[i].values == typecast_BINARY_types) { + psyco_default_binary_cast = (PyObject *)t; + } + } + + /* create and save a default cast object (but does not register it) */ + psyco_default_cast = typecast_from_c(&typecast_default, dict); + + /* register the date/time typecasters with their original names */ +#ifdef HAVE_MXDATETIME + for (i = 0; typecast_mxdatetime[i].name != NULL; i++) { + typecastObject *t; + Dprintf("typecast_init: initializing %s", typecast_mxdatetime[i].name); + t = (typecastObject *)typecast_from_c(&(typecast_mxdatetime[i]), dict); + if (t == NULL) return -1; + PyDict_SetItem(dict, t->name, (PyObject *)t); + } +#endif +#ifdef HAVE_PYDATETIME + for (i = 0; typecast_pydatetime[i].name != NULL; i++) { + typecastObject *t; + Dprintf("typecast_init: initializing %s", typecast_pydatetime[i].name); + t = (typecastObject *)typecast_from_c(&(typecast_pydatetime[i]), dict); + if (t == NULL) return -1; + PyDict_SetItem(dict, t->name, (PyObject *)t); + } +#endif + + return 0; +} + +/* typecast_add - add a type object to the dictionary */ +int +typecast_add(PyObject *obj, int binary) +{ + PyObject *val; + int len, i; + + typecastObject *type = (typecastObject *)obj; + + Dprintf("typecast_add: object at %p, values refcnt = %d", + obj, type->values->ob_refcnt); + + len = PyTuple_Size(type->values); + for (i = 0; i < len; i++) { + val = PyTuple_GetItem(type->values, i); + Dprintf("typecast_add: adding val: %ld", PyInt_AsLong(val)); + if (binary) { + PyDict_SetItem(psyco_binary_types, val, obj); + } + else { + PyDict_SetItem(psyco_types, val, obj); + } + } + + Dprintf("typecast_add: base caster: %p", type->bcast); + + return 0; +} + + +/** typecast type **/ + +#define OFFSETOF(x) offsetof(typecastObject, x) + +static int +typecast_cmp(PyObject *obj1, PyObject* obj2) +{ + typecastObject *self = (typecastObject*)obj1; + typecastObject *other = NULL; + PyObject *number = NULL; + int i, j, res = -1; + + if (PyObject_TypeCheck(obj2, &typecastType)) { + other = (typecastObject*)obj2; + } + else { + number = PyNumber_Int(obj2); + } + + Dprintf("typecast_cmp: other = %p, number = %p", other, number); + + for (i=0; i < PyObject_Length(self->values) && res == -1; i++) { + long int val = PyInt_AsLong(PyTuple_GET_ITEM(self->values, i)); + + if (other != NULL) { + for (j=0; j < PyObject_Length(other->values); j++) { + if (PyInt_AsLong(PyTuple_GET_ITEM(other->values, j)) == val) { + res = 0; break; + } + } + } + + else if (number != NULL) { + if (PyInt_AsLong(number) == val) { + res = 0; break; + } + } + } + + Py_XDECREF(number); + return res; +} + +static PyObject* +typecast_richcompare(PyObject *obj1, PyObject* obj2, int opid) +{ + PyObject *result = NULL; + int res = typecast_cmp(obj1, obj2); + + if (PyErr_Occurred()) return NULL; + + if ((opid == Py_EQ && res == 0) || (opid != Py_EQ && res != 0)) + result = Py_True; + else + result = Py_False; + + Py_INCREF(result); + return result; +} + +static struct PyMemberDef typecastObject_members[] = { + {"name", T_OBJECT, OFFSETOF(name), RO}, + {"values", T_OBJECT, OFFSETOF(values), RO}, + {NULL} +}; + +static void +typecast_dealloc(PyObject *obj) +{ + typecastObject *self = (typecastObject*)obj; + + Py_XDECREF(self->values); + Py_XDECREF(self->name); + Py_XDECREF(self->pcast); + + PyObject_Del(self); +} + +static PyObject * +typecast_call(PyObject *obj, PyObject *args, PyObject *kwargs) +{ + PyObject *string, *cursor; + + if (!PyArg_ParseTuple(args, "OO", &string, &cursor)) { + return NULL; + } + + return typecast_cast(obj, + PyString_AsString(string), PyString_Size(string), + cursor); +} + +PyTypeObject typecastType = { + PyObject_HEAD_INIT(NULL) + 0, + "psycopg2._psycopg.type", + sizeof(typecastObject), + 0, + + typecast_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + typecast_cmp, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + + typecast_call, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + + Py_TPFLAGS_HAVE_RICHCOMPARE, /*tp_flags*/ + "psycopg type-casting object", /*tp_doc*/ + + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + + typecast_richcompare, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + + /* Attribute descriptor and subclassing stuff */ + + 0, /*tp_methods*/ + typecastObject_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + + 0, /*tp_init*/ + 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/ + 0, /*tp_new*/ + 0, /*tp_free Low-level free-memory routine */ + 0, /*tp_is_gc For PyObject_IS_GC */ + 0, /*tp_bases*/ + 0, /*tp_mro method resolution order */ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0 /*tp_weaklist*/ +}; + +static PyObject * +typecast_new(PyObject *name, PyObject *values, PyObject *cast, PyObject *base) +{ + typecastObject *obj; + + obj = PyObject_NEW(typecastObject, &typecastType); + if (obj == NULL) return NULL; + + Dprintf("typecast_new: new type at = %p, refcnt = %d", obj, obj->ob_refcnt); + + Py_INCREF(values); + obj->values = values; + + if (name) { + Py_INCREF(name); + obj->name = name; + } + else { + Py_INCREF(Py_None); + obj->name = Py_None; + } + + obj->pcast = NULL; + obj->ccast = NULL; + obj->bcast = base; + + if (obj->bcast) Py_INCREF(obj->bcast); + + /* FIXME: raise an exception when None is passed as Python caster */ + if (cast && cast != Py_None) { + Py_INCREF(cast); + obj->pcast = cast; + } + + Dprintf("typecast_new: typecast object created at %p", obj); + + return (PyObject *)obj; +} + +PyObject * +typecast_from_python(PyObject *self, PyObject *args, PyObject *keywds) +{ + PyObject *v, *name, *cast = NULL, *base = NULL; + + static char *kwlist[] = {"values", "name", "castobj", "baseobj", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, keywds, "O!|O!OO", kwlist, + &PyTuple_Type, &v, + &PyString_Type, &name, + &cast, &base)) { + return NULL; + } + + return typecast_new(name, v, cast, base); +} + +PyObject * +typecast_from_c(typecastObject_initlist *type, PyObject *dict) +{ + PyObject *tuple, *base = NULL; + typecastObject *obj; + int i, len = 0; + + /* before doing anything else we look for the base */ + if (type->base) { + /* NOTE: base is a borrowed reference! */ + base = PyDict_GetItemString(dict, type->base); + if (!base) { + PyErr_Format(Error, "typecast base not found: %s", type->base); + return NULL; + } + } + + while (type->values[len] != 0) len++; + + tuple = PyTuple_New(len); + if (!tuple) return NULL; + + for (i = 0; i < len ; i++) { + PyTuple_SET_ITEM(tuple, i, PyInt_FromLong(type->values[i])); + } + + + obj = (typecastObject *) + typecast_new(PyString_FromString(type->name), tuple, NULL, base); + + if (obj) { + obj->ccast = type->cast; + obj->pcast = NULL; + } + return (PyObject *)obj; +} + +PyObject * +typecast_cast(PyObject *obj, char *str, int len, PyObject *curs) +{ + PyObject *old, *res = NULL; + typecastObject *self = (typecastObject *)obj; + + /* we don't incref, the caster *can't* die at this point */ + old = ((cursorObject*)curs)->caster; + ((cursorObject*)curs)->caster = obj; + + if (self->ccast) { + res = self->ccast(str, len, curs); + } + else if (self->pcast) { + res = PyObject_CallFunction(self->pcast, "s#O", str, len, curs); + } + else { + PyErr_SetString(Error, "internal error: no casting function found"); + } + + ((cursorObject*)curs)->caster = old; + + return res; +} diff --git a/trunk/psycopg2/psycopg/typecast.h b/trunk/psycopg2/psycopg/typecast.h new file mode 100644 index 0000000..ec77e5c --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast.h @@ -0,0 +1,85 @@ +/* typecast.h - definitions for typecasters + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_TYPECAST_H +#define PSYCOPG_TYPECAST_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* type of type-casting functions (both C and Python) */ +typedef PyObject *(*typecast_function)(char *, int len, PyObject *); + +/** typecast type **/ + +extern PyTypeObject typecastType; + +typedef struct { + PyObject_HEAD + + PyObject *name; /* the name of this type */ + PyObject *values; /* the different types this instance can match */ + + typecast_function ccast; /* the C casting function */ + PyObject *pcast; /* the python casting function */ + PyObject *bcast; /* base cast, used by array typecasters */ +} typecastObject; + +/* the initialization values are stored here */ + +typedef struct { + char *name; + long int *values; + typecast_function cast; + + /* base is the base typecaster for arrays */ + char *base; +} typecastObject_initlist; + +/* the type dictionary, much faster to access it globally */ +extern PyObject *psyco_types; +extern PyObject *psyco_binary_types; + +/* the default casting objects, used when no other objects are available */ +extern PyObject *psyco_default_cast; +extern PyObject *psyco_default_binary_cast; + +/** exported functions **/ + +/* used by module.c to init the type system and register types */ +extern int typecast_init(PyObject *dict); +extern int typecast_add(PyObject *obj, int binary); + +/* the C callable typecastObject creator function */ +extern PyObject *typecast_from_c(typecastObject_initlist *type, PyObject *d); + +/* the python callable typecast creator function */ +extern PyObject *typecast_from_python( + PyObject *self, PyObject *args, PyObject *keywds); + +/* the function used to dispatch typecasting calls */ +extern PyObject *typecast_cast( + PyObject *self, char *str, int len, PyObject *curs); + +#endif /* !defined(PSYCOPG_TYPECAST_H) */ diff --git a/trunk/psycopg2/psycopg/typecast_array.c b/trunk/psycopg2/psycopg/typecast_array.c new file mode 100644 index 0000000..7dcb3a3 --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast_array.c @@ -0,0 +1,258 @@ +/* typecast_array.c - array typecasters + * + * Copyright (C) 2005 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define MAX_DIMENSIONS 16 + +/** typecast_array_cleanup - remove the horrible [...]= stuff **/ + +static int +typecast_array_cleanup(char **str, int *len) +{ + int i, depth = 1; + + if ((*str)[0] != '[') return -1; + + for (i=1 ; depth > 0 && i < *len ; i++) { + if ((*str)[i] == '[') + depth += 1; + else if ((*str)[i] == ']') + depth -= 1; + } + if ((*str)[i] != '=') return -1; + + *str = &((*str)[i+1]); + *len = *len - i - 1; + return 0; +} + +/** typecast_array_scan - scan a string looking for array items **/ + +#define ASCAN_ERROR -1 +#define ASCAN_EOF 0 +#define ASCAN_BEGIN 1 +#define ASCAN_END 2 +#define ASCAN_TOKEN 3 +#define ASCAN_QUOTED 4 + +static int +typecast_array_tokenize(char *str, int strlength, + int *pos, char** token, int *length) +{ + /* FORTRAN glory */ + int i, j, q, b, l, res; + + Dprintf("typecast_array_tokenize: '%s', %d/%d", + &str[*pos], *pos, strlength); + + /* we always get called with pos pointing at the start of a token, so a + fast check is enough for ASCAN_EOF, ASCAN_BEGIN and ASCAN_END */ + if (*pos == strlength) { + return ASCAN_EOF; + } + else if (str[*pos] == '{') { + *pos += 1; + return ASCAN_BEGIN; + } + else if (str[*pos] == '}') { + *pos += 1; + if (str[*pos] == ',') + *pos += 1; + return ASCAN_END; + } + + /* now we start looking for the first unquoted ',' or '}', the only two + tokens that can limit an array element */ + q = 0; /* if q is odd we're inside quotes */ + b = 0; /* if b is 1 we just encountered a backslash */ + res = ASCAN_TOKEN; + + for (i = *pos ; i < strlength ; i++) { + switch (str[i]) { + case '"': + if (b == 0) + q += 1; + else + b = 0; + break; + + case '\\': + res = ASCAN_QUOTED; + if (b == 0) + b = 1; + else + /* we're backslashing a backslash */ + b = 0; + break; + + case '}': + case ',': + if (b == 0 && ((q&1) == 0)) + goto tokenize; + break; + + default: + /* reset the backslash counter */ + b = 0; + break; + } + } + + tokenize: + /* remove initial quoting character and calculate raw length */ + l = i - *pos; + if (str[*pos] == '"') { + *pos += 1; + l -= 2; + } + + if (res == ASCAN_QUOTED) { + char *buffer = PyMem_Malloc(l+1); + if (buffer == NULL) return ASCAN_ERROR; + + *token = buffer; + + for (j = *pos; j < *pos+l; j++) { + if (str[j] != '\\' + || (j > *pos && str[j-1] == '\\')) + *(buffer++) = str[j]; + } + + *buffer = '\0'; + *length = buffer - *token; + } + else { + *token = &str[*pos]; + *length = l; + } + + *pos = i; + + /* skip the comma and set position to the start of next token */ + if (str[i] == ',') *pos += 1; + + return res; +} + +static int +typecast_array_scan(char *str, int strlength, + PyObject *curs, PyObject *base, PyObject *array) +{ + int state, length = 0, pos = 0; + char *token; + + PyObject *stack[MAX_DIMENSIONS]; + int stack_index = 0; + + while (1) { + token = NULL; + state = typecast_array_tokenize(str, strlength, &pos, &token, &length); + Dprintf("typecast_array_scan: state = %d, length = %d, token = '%s'", + state, length, token); + if (state == ASCAN_TOKEN || state == ASCAN_QUOTED) { + PyObject *obj = typecast_cast(base, token, length, curs); + + /* before anything else we free the memory */ + if (state == ASCAN_QUOTED) PyMem_Free(token); + if (obj == NULL) return 0; + + PyList_Append(array, obj); + Py_DECREF(obj); + } + + else if (state == ASCAN_BEGIN) { + PyObject *sub = PyList_New(0); + if (sub == NULL) return 0; + + PyList_Append(array, sub); + Py_DECREF(sub); + + if (stack_index == MAX_DIMENSIONS) + return 0; + + stack[stack_index++] = array; + array = sub; + } + + else if (state == ASCAN_ERROR) { + return 0; + } + + else if (state == ASCAN_END) { + if (--stack_index < 0) + return 0; + array = stack[stack_index]; + } + + else if (state == ASCAN_EOF) + break; + } + + return 1; +} + + +/** GENERIC - a generic typecaster that can be used when no special actions + have to be taken on the single items **/ + +static PyObject * +typecast_GENERIC_ARRAY_cast(char *str, int len, PyObject *curs) +{ + PyObject *obj = NULL; + PyObject *base = ((typecastObject*)((cursorObject*)curs)->caster)->bcast; + + Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s', len = %d", str, len); + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + if (str[0] == '[') + typecast_array_cleanup(&str, &len); + if (str[0] != '{') { + PyErr_SetString(Error, "array does not start with '{'"); + return NULL; + } + + Dprintf("typecast_GENERIC_ARRAY_cast: str = '%s', len = %d", str, len); + + obj = PyList_New(0); + + /* scan the array skipping the first level of {} */ + if (typecast_array_scan(&str[1], len-2, curs, base, obj) == 0) { + Py_DECREF(obj); + obj = NULL; + } + + return obj; +} + +/** almost all the basic array typecasters are derived from GENERIC **/ + +#define typecast_LONGINTEGERARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_INTEGERARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_FLOATARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_DECIMALARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_STRINGARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_UNICODEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_BOOLEANARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_DATETIMEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_DATEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_TIMEARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_INTERVALARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_BINARYARRAY_cast typecast_GENERIC_ARRAY_cast +#define typecast_ROWIDARRAY_cast typecast_GENERIC_ARRAY_cast diff --git a/trunk/psycopg2/psycopg/typecast_basic.c b/trunk/psycopg2/psycopg/typecast_basic.c new file mode 100644 index 0000000..e9ac7f4 --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast_basic.c @@ -0,0 +1,141 @@ +/* pgcasts_basic.c - basic typecasting functions to python types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** INTEGER - cast normal integers (4 bytes) to python int **/ + +static PyObject * +typecast_INTEGER_cast(char *s, int len, PyObject *curs) +{ + char buffer[12]; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + if (s[len] != '\0') { + strncpy(buffer, s, len); buffer[len] = '\0'; + s = buffer; + } + return PyInt_FromString(s, NULL, 0); +} + +/** LONGINTEGER - cast long integers (8 bytes) to python long **/ + +static PyObject * +typecast_LONGINTEGER_cast(char *s, int len, PyObject *curs) +{ + char buffer[24]; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + if (s[len] != '\0') { + strncpy(buffer, s, len); buffer[len] = '\0'; + s = buffer; + } + return PyLong_FromString(s, NULL, 0); +} + +/** FLOAT - cast floating point numbers to python float **/ + +static PyObject * +typecast_FLOAT_cast(char *s, int len, PyObject *curs) +{ + PyObject *str = NULL, *flo = NULL; + char *pend; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + str = PyString_FromStringAndSize(s, len); + flo = PyFloat_FromString(str, &pend); + Py_DECREF(str); + return flo; +} + +/** STRING - cast strings of any type to python string **/ + +static PyObject * +typecast_STRING_cast(char *s, int len, PyObject *curs) +{ + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + return PyString_FromStringAndSize(s, len); +} + +/** UNICODE - cast strings of any type to a python unicode object **/ + +static PyObject * +typecast_UNICODE_cast(char *s, int len, PyObject *curs) +{ + PyObject *enc; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + enc = PyDict_GetItemString(psycoEncodings, + ((cursorObject*)curs)->conn->encoding); + if (enc) { + return PyUnicode_Decode(s, len, PyString_AsString(enc), NULL); + } + else { + PyErr_Format(InterfaceError, + "can't decode into unicode string from %s", + ((cursorObject*)curs)->conn->encoding); + return NULL; + } +} + +/** BOOLEAN - cast boolean value into right python object **/ + +static PyObject * +typecast_BOOLEAN_cast(char *s, int len, PyObject *curs) +{ + PyObject *res; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + if (s[0] == 't') + res = Py_True; + else + res = Py_False; + + Py_INCREF(res); + return res; +} + +/** DECIMAL - cast any kind of number into a Python Decimal object **/ + +#ifdef HAVE_DECIMAL +static PyObject * +typecast_DECIMAL_cast(char *s, int len, PyObject *curs) +{ + PyObject *res = NULL; + char *buffer; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + if ((buffer = PyMem_Malloc(len+1)) == NULL) + PyErr_NoMemory(); + strncpy(buffer, s, len); buffer[len] = '\0'; + res = PyObject_CallFunction(decimalType, "s", buffer); + PyMem_Free(buffer); + + return res; +} +#else +#define typecast_DECIMAL_cast typecast_FLOAT_cast +#endif + +/* some needed aliases */ +#define typecast_NUMBER_cast typecast_FLOAT_cast +#define typecast_ROWID_cast typecast_INTEGER_cast diff --git a/trunk/psycopg2/psycopg/typecast_binary.c b/trunk/psycopg2/psycopg/typecast_binary.c new file mode 100644 index 0000000..d490bc7 --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast_binary.c @@ -0,0 +1,191 @@ +/* typecast_binary.c - binary typecasting functions to python types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "typecast_binary.h" + +#include +#include + + +/* Python object holding a memory chunk. The memory is deallocated when + the object is destroyed. This type is used to let users directly access + memory chunks holding unescaped binary data through the buffer interface. + */ + +static void +chunk_dealloc(chunkObject *self) +{ + Dprintf("chunk_dealloc: deallocating memory at %p, size %d", + self->base, self->len); + free(self->base); + self->ob_type->tp_free((PyObject *) self); +} + +static PyObject * +chunk_repr(chunkObject *self) +{ + return PyString_FromFormat("", + self->base, self->len); +} + +static int +chunk_getreadbuffer(chunkObject *self, int segment, void **ptr) +{ + if (segment != 0) + { + PyErr_SetString(PyExc_SystemError, + "acessing non-existant buffer segment"); + return -1; + } + *ptr = self->base; + return self->len; +} + +static int +chunk_getsegcount(chunkObject *self, int *lenp) +{ + if (lenp != NULL) + *lenp = self->len; + return 1; +} + +static PyBufferProcs chunk_as_buffer = +{ + (getreadbufferproc) chunk_getreadbuffer, + (getwritebufferproc) NULL, + (getsegcountproc) chunk_getsegcount, + (getcharbufferproc) NULL +}; + +#define chunk_doc "memory chunk" + +PyTypeObject chunkType = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "psycopg2._psycopg.chunk", /* tp_name */ + sizeof(chunkObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) chunk_dealloc, /* tp_dealloc*/ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc) chunk_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + &chunk_as_buffer, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ + chunk_doc /* tp_doc */ +}; + +/* the function typecast_BINARY_cast_unescape is used when libpq does not + provide PQunescapeBytea: it convert all the \xxx octal sequences to the + proper byte value */ + +#ifdef PSYCOPG_OWN_QUOTING +static unsigned char * +typecast_BINARY_cast_unescape(unsigned char *str, size_t *to_length) +{ + char *dstptr, *dststr; + int len, i; + + len = strlen(str); + dststr = (char*)calloc(len, sizeof(char)); + dstptr = dststr; + + if (dststr == NULL) return NULL; + + Py_BEGIN_ALLOW_THREADS; + + for (i = 0; i < len; i++) { + if (str[i] == '\\') { + if ( ++i < len) { + if (str[i] == '\\') { + *dstptr = '\\'; + } + else { + *dstptr = 0; + *dstptr |= (str[i++] & 7) << 6; + *dstptr |= (str[i++] & 7) << 3; + *dstptr |= (str[i] & 7); + } + } + } + else { + *dstptr = str[i]; + } + dstptr++; + } + + Py_END_ALLOW_THREADS; + + *to_length = (size_t)(dstptr-dststr); + + return dststr; +} + +#define PQunescapeBytea typecast_BINARY_cast_unescape +#endif + +static PyObject * +typecast_BINARY_cast(char *s, int l, PyObject *curs) +{ + chunkObject *chunk; + PyObject *res; + char *str, *buffer = NULL; + size_t len; + + if (s == NULL) {Py_INCREF(Py_None); return Py_None;} + + /* PQunescapeBytea absolutely wants a 0-terminated string and we don't + want to copy the whole buffer, right? Wrong, but there isn't any other + way */ + if (s[l] != '\0') { + if ((buffer = PyMem_Malloc(l+1)) == NULL) + PyErr_NoMemory(); + strncpy(buffer, s, l); + buffer[l] = '\0'; + s = buffer; + } + str = (char*)PQunescapeBytea((unsigned char*)s, &len); + Dprintf("typecast_BINARY_cast: unescaped %d bytes", len); + if (buffer) PyMem_Free(buffer); + + chunk = (chunkObject *) PyObject_New(chunkObject, &chunkType); + if (chunk == NULL) return NULL; + + chunk->base = str; + chunk->len = len; + if ((res = PyBuffer_FromObject((PyObject *)chunk, 0, len)) == NULL) + return NULL; + + /* PyBuffer_FromObject() created a new reference. Release our reference so + that the memory can be freed once the buffer is garbage collected. */ + Py_DECREF(chunk); + + return res; +} diff --git a/trunk/psycopg2/psycopg/typecast_binary.h b/trunk/psycopg2/psycopg/typecast_binary.h new file mode 100644 index 0000000..cf985bb --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast_binary.h @@ -0,0 +1,47 @@ +/* typecast_binary.h - definitions for binary typecaster + * + * Copyright (C) 2003 Federico Di Gregorio + * + * This file is part of psycopg. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PSYCOPG_TYPECAST_BINARY_H +#define PSYCOPG_TYPECAST_BINARY_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** chunk type **/ + +extern PyTypeObject chunkType; + +typedef struct { + PyObject_HEAD + + void *base; /* Pointer to the memory chunk. */ + int len; /* Size in bytes of the memory chunk. */ + +} chunkObject; + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PSYCOPG_TYPECAST_BINARY_H) */ diff --git a/trunk/psycopg2/psycopg/typecast_builtins.c b/trunk/psycopg2/psycopg/typecast_builtins.c new file mode 100644 index 0000000..0fc109d --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast_builtins.c @@ -0,0 +1,60 @@ +static long int typecast_NUMBER_types[] = {20, 23, 21, 701, 700, 1700, 0}; +static long int typecast_LONGINTEGER_types[] = {20, 0}; +static long int typecast_INTEGER_types[] = {23, 21, 0}; +static long int typecast_FLOAT_types[] = {701, 700, 0}; +static long int typecast_DECIMAL_types[] = {1700, 0}; +static long int typecast_UNICODE_types[] = {19, 18, 25, 1042, 1043, 0}; +static long int typecast_STRING_types[] = {19, 18, 25, 1042, 1043, 0}; +static long int typecast_BOOLEAN_types[] = {16, 0}; +static long int typecast_DATETIME_types[] = {1114, 1184, 704, 1186, 0}; +static long int typecast_TIME_types[] = {1083, 1266, 0}; +static long int typecast_DATE_types[] = {1082, 0}; +static long int typecast_INTERVAL_types[] = {704, 1186, 0}; +static long int typecast_BINARY_types[] = {17, 0}; +static long int typecast_ROWID_types[] = {26, 0}; +static long int typecast_LONGINTEGERARRAY_types[] = {1016, 0}; +static long int typecast_INTEGERARRAY_types[] = {1005, 1006, 1007, 0}; +static long int typecast_FLOATARRAY_types[] = {1017, 1021, 1022, 0}; +static long int typecast_DECIMALARRAY_types[] = {1231, 0}; +static long int typecast_UNICODEARRAY_types[] = {1002, 1003, 1009, 1014, 1015, 0}; +static long int typecast_STRINGARRAY_types[] = {1002, 1003, 1009, 1014, 1015, 0}; +static long int typecast_BOOLEANARRAY_types[] = {1000, 0}; +static long int typecast_DATETIMEARRAY_types[] = {1115, 1185, 0}; +static long int typecast_TIMEARRAY_types[] = {1183, 1270, 0}; +static long int typecast_DATEARRAY_types[] = {1182, 0}; +static long int typecast_INTERVALARRAY_types[] = {1187, 0}; +static long int typecast_BINARYARRAY_types[] = {1001, 0}; +static long int typecast_ROWIDARRAY_types[] = {1028, 1013, 0}; + + +typecastObject_initlist typecast_builtins[] = { + {"NUMBER", typecast_NUMBER_types, typecast_NUMBER_cast, NULL}, + {"LONGINTEGER", typecast_LONGINTEGER_types, typecast_LONGINTEGER_cast, NULL}, + {"INTEGER", typecast_INTEGER_types, typecast_INTEGER_cast, NULL}, + {"FLOAT", typecast_FLOAT_types, typecast_FLOAT_cast, NULL}, + {"DECIMAL", typecast_DECIMAL_types, typecast_DECIMAL_cast, NULL}, + {"UNICODE", typecast_UNICODE_types, typecast_UNICODE_cast, NULL}, + {"STRING", typecast_STRING_types, typecast_STRING_cast, NULL}, + {"BOOLEAN", typecast_BOOLEAN_types, typecast_BOOLEAN_cast, NULL}, + {"DATETIME", typecast_DATETIME_types, typecast_DATETIME_cast, NULL}, + {"TIME", typecast_TIME_types, typecast_TIME_cast, NULL}, + {"DATE", typecast_DATE_types, typecast_DATE_cast, NULL}, + {"INTERVAL", typecast_INTERVAL_types, typecast_INTERVAL_cast, NULL}, + {"BINARY", typecast_BINARY_types, typecast_BINARY_cast, NULL}, + {"ROWID", typecast_ROWID_types, typecast_ROWID_cast, NULL}, + {"LONGINTEGERARRAY", typecast_LONGINTEGERARRAY_types, typecast_LONGINTEGERARRAY_cast, "LONGINTEGER"}, + {"INTEGERARRAY", typecast_INTEGERARRAY_types, typecast_INTEGERARRAY_cast, "INTEGER"}, + {"FLOATARRAY", typecast_FLOATARRAY_types, typecast_FLOATARRAY_cast, "FLOAT"}, + {"DECIMALARRAY", typecast_DECIMALARRAY_types, typecast_DECIMALARRAY_cast, "DECIMAL"}, + {"UNICODEARRAY", typecast_UNICODEARRAY_types, typecast_UNICODEARRAY_cast, "UNICODE"}, + {"STRINGARRAY", typecast_STRINGARRAY_types, typecast_STRINGARRAY_cast, "STRING"}, + {"BOOLEANARRAY", typecast_BOOLEANARRAY_types, typecast_BOOLEANARRAY_cast, "BOOLEAN"}, + {"DATETIMEARRAY", typecast_DATETIMEARRAY_types, typecast_DATETIMEARRAY_cast, "DATETIME"}, + {"TIMEARRAY", typecast_TIMEARRAY_types, typecast_TIMEARRAY_cast, "TIME"}, + {"DATEARRAY", typecast_DATEARRAY_types, typecast_DATEARRAY_cast, "DATE"}, + {"INTERVALARRAY", typecast_INTERVALARRAY_types, typecast_INTERVALARRAY_cast, "INTERVAL"}, + {"BINARYARRAY", typecast_BINARYARRAY_types, typecast_BINARYARRAY_cast, "BINARY"}, + {"ROWIDARRAY", typecast_ROWIDARRAY_types, typecast_ROWIDARRAY_cast, "ROWID"}, + {NULL, NULL, NULL, NULL} +}; + diff --git a/trunk/psycopg2/psycopg/typecast_datetime.c b/trunk/psycopg2/psycopg/typecast_datetime.c new file mode 100644 index 0000000..3a09f07 --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast_datetime.c @@ -0,0 +1,279 @@ +/* typecast_datetime.c - date and time typecasting functions to python types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include "datetime.h" + + +/* the pointer to the datetime module API is initialized by the module init + code, we just need to grab it */ +extern PyObject* pyDateTimeModuleP; +extern PyObject *pyDateTypeP; +extern PyObject *pyTimeTypeP; +extern PyObject *pyDateTimeTypeP; +extern PyObject *pyDeltaTypeP; + +/** DATE - cast a date into a date python object **/ + +static PyObject * +typecast_PYDATE_cast(char *str, int len, PyObject *curs) +{ + PyObject* obj = NULL; + int n, y=0, m=0, d=0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + if (!strcmp(str, "infinity") || !strcmp(str, "-infinity")) { + if (str[0] == '-') { + obj = PyObject_GetAttrString(pyDateTypeP, "min"); + } + else { + obj = PyObject_GetAttrString(pyDateTypeP, "max"); + } + } + + else { + n = typecast_parse_date(str, NULL, &len, &y, &m, &d); + Dprintf("typecast_PYDATE_cast: " + "n = %d, len = %d, y = %d, m = %d, d = %d", + n, len, y, m, d); + if (n != 3) { + PyErr_SetString(DataError, "unable to parse date"); + } + else { + obj = PyObject_CallFunction(pyDateTypeP, "iii", y, m, d); + } + } + return obj; +} + +/** DATETIME - cast a timestamp into a datetime python object **/ + +static PyObject * +typecast_PYDATETIME_cast(char *str, int len, PyObject *curs) +{ + PyObject* obj = NULL; + int n, y=0, m=0, d=0; + int hh=0, mm=0, ss=0, us=0, tz=0; + char *tp = NULL; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + /* check for infinity */ + if (!strcmp(str, "infinity") || !strcmp(str, "-infinity")) { + if (str[0] == '-') { + obj = PyObject_GetAttrString(pyDateTimeTypeP, "min"); + } + else { + obj = PyObject_GetAttrString(pyDateTimeTypeP, "max"); + } + } + + else { + Dprintf("typecast_PYDATETIME_cast: s = %s", str); + n = typecast_parse_date(str, &tp, &len, &y, &m, &d); + Dprintf("typecast_PYDATE_cast: tp = %p " + "n = %d, len = %d, y = %d, m = %d, d = %d", + tp, n, len, y, m, d); + if (n != 3) { + PyErr_SetString(DataError, "unable to parse date"); + } + + if (len > 0) { + n = typecast_parse_time(tp, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_PYDATETIME_cast: n = %d, len = %d, " + "hh = %d, mm = %d, ss = %d, us = %d, tz = %d", + n, len, hh, mm, ss, us, tz); + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + } + } + + if (ss > 59) { + mm += 1; + ss -= 60; + } + + if (n == 5 && ((cursorObject*)curs)->tzinfo_factory != Py_None) { + /* we have a time zone, calculate minutes and create + appropriate tzinfo object calling the factory */ + PyObject *tzinfo; + Dprintf("typecast_PYDATETIME_cast: UTC offset = %dm", tz); + tzinfo = PyObject_CallFunction( + ((cursorObject*)curs)->tzinfo_factory, "i", tz); + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiiiO", + y, m, d, hh, mm, ss, us, tzinfo); + Dprintf("typecast_PYDATETIME_cast: tzinfo: %p, refcnt = %d", + tzinfo, tzinfo->ob_refcnt); + Py_XDECREF(tzinfo); + } + else { + obj = PyObject_CallFunction(pyDateTimeTypeP, "iiiiiii", + y, m, d, hh, mm, ss, us); + } + } + return obj; +} + +/** TIME - parse time into a time object **/ + +static PyObject * +typecast_PYTIME_cast(char *str, int len, PyObject *curs) +{ + PyObject* obj = NULL; + int n, hh=0, mm=0, ss=0, us=0, tz=0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + n = typecast_parse_time(str, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_PYTIME_cast: n = %d, len = %d, " + "hh = %d, mm = %d, ss = %d, us = %d, tz = %d", + n, len, hh, mm, ss, us, tz); + + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + } + else { + if (ss > 59) { + mm += 1; + ss -= 60; + } + obj = PyObject_CallFunction(pyTimeTypeP, "iiii", hh, mm, ss, us); + } + return obj; +} + +/** INTERVAL - parse an interval into a timedelta object **/ + +static PyObject * +typecast_PYINTERVAL_cast(char *str, int len, PyObject *curs) +{ + long years = 0, months = 0, days = 0; + double hours = 0.0, minutes = 0.0, seconds = 0.0, hundredths = 0.0; + double v = 0.0, sign = 1.0, denominator = 1.0; + int part = 0, sec; + double micro; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_PYINTERVAL_cast: s = %s", str); + + while (len-- > 0 && *str) { + switch (*str) { + + case '-': + sign = -1.0; + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + v = v*10 + (double)*str - (double)'0'; + if (part == 6){ + denominator *= 10; + } + break; + + case 'y': + if (part == 0) { + years = (long)(v*sign); + str = skip_until_space2(str, &len); + v = 0.0; sign = 1.0; part = 1; + } + break; + + case 'm': + if (part <= 1) { + months = (long)(v*sign); + str = skip_until_space2(str, &len); + v = 0.0; sign = 1.0; part = 2; + } + break; + + case 'd': + if (part <= 2) { + days = (long)(v*sign); + str = skip_until_space2(str, &len); + v = 0.0; sign = 1.0; part = 3; + } + break; + + case ':': + if (part <= 3) { + hours = v; + v = 0.0; part = 4; + } + else if (part == 4) { + minutes = v; + v = 0.0; part = 5; + } + break; + + case '.': + if (part == 5) { + seconds = v; + v = 0.0; part = 6; + } + break; + + default: + break; + } + + str++; + } + + /* manage last value, be it minutes or seconds or hundredths of a second */ + if (part == 4) { + minutes = v; + } + else if (part == 5) { + seconds = v; + } + else if (part == 6) { + hundredths = v; + hundredths = hundredths/denominator; + } + + /* calculates seconds */ + if (sign < 0.0) { + seconds = - (hundredths + seconds + minutes*60 + hours*3600); + } + else { + seconds += hundredths + minutes*60 + hours*3600; + } + + /* calculates days */ + days += years*365 + months*30; + + micro = (seconds - floor(seconds)) * 1000000.0; + sec = (int)floor(seconds); + return PyObject_CallFunction(pyDeltaTypeP, "iii", + days, sec, (int)round(micro)); +} + +/* psycopg defaults to using python datetime types */ + +#ifdef PSYCOPG_DEFAULT_PYDATETIME +#define typecast_DATE_cast typecast_PYDATE_cast +#define typecast_TIME_cast typecast_PYTIME_cast +#define typecast_INTERVAL_cast typecast_PYINTERVAL_cast +#define typecast_DATETIME_cast typecast_PYDATETIME_cast +#endif diff --git a/trunk/psycopg2/psycopg/typecast_mxdatetime.c b/trunk/psycopg2/psycopg/typecast_mxdatetime.c new file mode 100644 index 0000000..52b1ce7 --- /dev/null +++ b/trunk/psycopg2/psycopg/typecast_mxdatetime.c @@ -0,0 +1,231 @@ +/* typecast_mxdatetime.c - date and time typecasting functions to mx types + * + * Copyright (C) 2001-2003 Federico Di Gregorio + * + * This file is part of the psycopg module. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2, + * or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "mxDateTime.h" + +/* the pointer to the mxDateTime API is initialized by the module init code, + we just need to grab it */ +extern mxDateTimeModule_APIObject *mxDateTimeP; + +/** DATE - cast a date into mx.DateTime python object **/ + +static PyObject * +typecast_MXDATE_cast(char *str, int len, PyObject *curs) +{ + int n, y=0, m=0, d=0; + int hh=0, mm=0, ss=0, us=0, tz=0; + char *tp = NULL; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_MXDATE_cast: s = %s", str); + + /* check for infinity */ + if (!strcmp(str, "infinity") || !strcmp(str, "-infinity")) { + if (str[0] == '-') { + return mxDateTimeP->DateTime_FromDateAndTime(-999998,1,1, 0,0,0); + } + else { + return mxDateTimeP->DateTime_FromDateAndTime(999999,12,31, 0,0,0); + } + } + + n = typecast_parse_date(str, &tp, &len, &y, &m, &d); + Dprintf("typecast_MXDATE_cast: tp = %p n = %d, len = %d, " + "y = %d, m = %d, d = %d", tp, n, len, y, m, d); + if (n != 3) { + PyErr_SetString(DataError, "unable to parse date"); + } + + if (len > 0) { + n = typecast_parse_time(tp, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_MXDATE_cast: n = %d, len = %d, " + "hh = %d, mm = %d, ss = %d, us = %d, tz = %d", + n, len, hh, mm, ss, us, tz); + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + } + } + + Dprintf("typecast_MXDATE_cast: fractionary seconds: %lf", + (double)ss + (double)us/(double)1000000.0); + return mxDateTimeP->DateTime_FromDateAndTime(y, m, d, hh, mm, + (double)ss + (double)us/(double)1000000.0); +} + +/** TIME - parse time into an mx.DateTime object **/ + +static PyObject * +typecast_MXTIME_cast(char *str, int len, PyObject *curs) +{ + int n, hh=0, mm=0, ss=0, us=0, tz=0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_MXTIME_cast: s = %s", str); + + n = typecast_parse_time(str, NULL, &len, &hh, &mm, &ss, &us, &tz); + Dprintf("typecast_MXTIME_cast: time parsed, %d components", n); + Dprintf("typecast_MXTIME_cast: hh = %d, mm = %d, ss = %d, us = %d", + hh, mm, ss, us); + + if (n < 3 || n > 5) { + PyErr_SetString(DataError, "unable to parse time"); + return NULL; + } + + Dprintf("typecast_MXTIME_cast: fractionary seconds: %lf", + (double)ss + (double)us/(double)1000000.0); + return mxDateTimeP->DateTimeDelta_FromTime(hh, mm, + (double)ss + (double)us/(double)1000000.0); +} + +/** INTERVAL - parse an interval into an mx.DateTimeDelta **/ + +static PyObject * +typecast_MXINTERVAL_cast(char *str, int len, PyObject *curs) +{ + long years = 0, months = 0, days = 0, denominator = 1; + double hours = 0.0, minutes = 0.0, seconds = 0.0, hundredths = 0.0; + double v = 0.0, sign = 1.0; + int part = 0; + + if (str == NULL) {Py_INCREF(Py_None); return Py_None;} + + Dprintf("typecast_MXINTERVAL_cast: s = %s", str); + + while (*str) { + switch (*str) { + + case '-': + sign = -1.0; + break; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + v = v*10 + (double)*str - (double)'0'; + Dprintf("typecast_MXINTERVAL_cast: v = %f", v); + if (part == 6){ + denominator *= 10; + Dprintf("typecast_MXINTERVAL_cast: denominator = %ld", + denominator); + } + break; + + case 'y': + if (part == 0) { + years = (long)(v*sign); + str = skip_until_space(str); + Dprintf("typecast_MXINTERVAL_cast: years = %ld, rest = %s", + years, str); + v = 0.0; sign = 1.0; part = 1; + } + break; + + case 'm': + if (part <= 1) { + months = (long)(v*sign); + str = skip_until_space(str); + Dprintf("typecast_MXINTERVAL_cast: months = %ld, rest = %s", + months, str); + v = 0.0; sign = 1.0; part = 2; + } + break; + + case 'd': + if (part <= 2) { + days = (long)(v*sign); + str = skip_until_space(str); + Dprintf("typecast_MXINTERVAL_cast: days = %ld, rest = %s", + days, str); + v = 0.0; sign = 1.0; part = 3; + } + break; + + case ':': + if (part <= 3) { + hours = v; + Dprintf("typecast_MXINTERVAL_cast: hours = %f", hours); + v = 0.0; part = 4; + } + else if (part == 4) { + minutes = v; + Dprintf("typecast_MXINTERVAL_cast: minutes = %f", minutes); + v = 0.0; part = 5; + } + break; + + case '.': + if (part == 5) { + seconds = v; + Dprintf("typecast_MXINTERVAL_cast: seconds = %f", seconds); + v = 0.0; part = 6; + } + break; + + default: + break; + } + + str++; + } + + /* manage last value, be it minutes or seconds or hundredths of a second */ + if (part == 4) { + minutes = v; + Dprintf("typecast_MXINTERVAL_cast: minutes = %f", minutes); + } + else if (part == 5) { + seconds = v; + Dprintf("typecast_MXINTERVAL_cast: seconds = %f", seconds); + } + else if (part == 6) { + hundredths = v; + Dprintf("typecast_MXINTERVAL_cast: hundredths = %f", hundredths); + hundredths = hundredths/denominator; + Dprintf("typecast_MXINTERVAL_cast: fractions = %.20f", hundredths); + } + + /* calculates seconds */ + if (sign < 0.0) { + seconds = - (hundredths + seconds + minutes*60 + hours*3600); + } + else { + seconds += hundredths + minutes*60 + hours*3600; + } + + /* calculates days */ + days += years*365 + months*30; + + Dprintf("typecast_MXINTERVAL_cast: days = %ld, seconds = %f", + days, seconds); + return mxDateTimeP->DateTimeDelta_FromDaysAndSeconds(days, seconds); +} + +/* psycopg defaults to using mx types */ + +#ifdef PSYCOPG_DEFAULT_MXDATETIME +#define typecast_DATE_cast typecast_MXDATE_cast +#define typecast_TIME_cast typecast_MXTIME_cast +#define typecast_INTERVAL_cast typecast_MXINTERVAL_cast +#define typecast_DATETIME_cast typecast_MXDATE_cast +#endif + diff --git a/trunk/psycopg2/scripts/buildtypes.py b/trunk/psycopg2/scripts/buildtypes.py new file mode 100644 index 0000000..197272f --- /dev/null +++ b/trunk/psycopg2/scripts/buildtypes.py @@ -0,0 +1,124 @@ +# -*- python -*- +# +# Copyright (C) 2001-2003 Federico Di Gregorio +# +# This file is part of the psycopg module. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2, +# or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# this a little script that analyze a file with (TYPE, NUMBER) tuples +# and write out C code ready for inclusion in psycopg. the generated +# code defines the DBAPITypeObject fundamental types and warns for +# undefined types. + +import sys, os, string, copy +from string import split, join, strip + + +# here is the list of the foundamental types we want to import from +# postgresql header files + +basic_types = (['NUMBER', ['INT8', 'INT4', 'INT2', 'FLOAT8', 'FLOAT4', + 'NUMERIC']], + ['LONGINTEGER', ['INT8']], + ['INTEGER', ['INT4', 'INT2']], + ['FLOAT', ['FLOAT8', 'FLOAT4']], + ['DECIMAL', ['NUMERIC']], + ['UNICODE', ['NAME', 'CHAR', 'TEXT', 'BPCHAR', + 'VARCHAR']], + ['STRING', ['NAME', 'CHAR', 'TEXT', 'BPCHAR', + 'VARCHAR']], + ['BOOLEAN', ['BOOL']], + ['DATETIME', ['TIMESTAMP', 'TIMESTAMPTZ', + 'TINTERVAL', 'INTERVAL']], + ['TIME', ['TIME', 'TIMETZ']], + ['DATE', ['DATE']], + ['INTERVAL', ['TINTERVAL', 'INTERVAL']], + ['BINARY', ['BYTEA']], + ['ROWID', ['OID']]) + +# unfortunately we don't have a nice way to extract array information +# from postgresql headers; we'll have to do it hard-coding :/ +array_types = (['LONGINTEGER', [1016]], + ['INTEGER', [1005, 1006, 1007]], + ['FLOAT', [1017, 1021, 1022]], + ['DECIMAL', [1231]], + ['UNICODE', [1002, 1003, 1009, 1014, 1015]], + ['STRING', [1002, 1003, 1009, 1014, 1015]], + ['BOOLEAN', [1000]], + ['DATETIME', [1115, 1185]], + ['TIME', [1183, 1270]], + ['DATE', [1182]], + ['INTERVAL', [1187]], + ['BINARY', [1001]], + ['ROWID', [1028, 1013]]) + +# this is the header used to compile the data in the C module +HEADER = """ +typecastObject_initlist typecast_builtins[] = { +""" + +# then comes the footer +FOOTER = """ {NULL, NULL, NULL, NULL}\n};\n""" + + +# usefull error reporting function +def error(msg): + """Report an error on stderr.""" + sys.stderr.write(msg+'\n') + + +# read couples from stdin and build list +read_types = [] +for l in sys.stdin.readlines(): + oid, val = split(l) + read_types.append((strip(oid)[:-3], strip(val))) + +# look for the wanted types in the read touples +found_types = {} + +for t in basic_types: + k = t[0] + found_types[k] = [] + for v in t[1]: + found = filter(lambda x, y=v: x[0] == y, read_types) + if len(found) == 0: + error(v+': value not found') + elif len(found) > 1: + error(v+': too many values') + else: + found_types[k].append(int(found[0][1])) + +# now outputs to stdout the right C-style definitions +stypes = "" ; sstruct = "" +for t in basic_types: + k = t[0] + s = str(found_types[k]) + s = '{' + s[1:-1] + ', 0}' + stypes = stypes + ('static long int typecast_%s_types[] = %s;\n' % (k, s)) + sstruct += (' {"%s", typecast_%s_types, typecast_%s_cast, NULL},\n' + % (k, k, k)) +for t in array_types: + kt = t[0] + ka = t[0]+'ARRAY' + s = str(t[1]) + s = '{' + s[1:-1] + ', 0}' + stypes = stypes + ('static long int typecast_%s_types[] = %s;\n' % (ka, s)) + sstruct += (' {"%s", typecast_%s_types, typecast_%s_cast, "%s"},\n' + % (ka, ka, ka, kt)) +sstruct = HEADER + sstruct + FOOTER + +print stypes +print sstruct diff --git a/trunk/psycopg2/scripts/ext2html.py b/trunk/psycopg2/scripts/ext2html.py new file mode 100755 index 0000000..488e97f --- /dev/null +++ b/trunk/psycopg2/scripts/ext2html.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python + +# Author: Daniele Varrazzo +# Contact: daniele dot varrazzo at gmail dot com +# Revision: $Revision$ +# Date: $Date$ +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing HTML. + +Output can refer to Epydoc-generated APIs through the iterpreted text role +"api". +""" + +import types +import sys + +# The url fragment where the api "index.html" resides w.r.t. the generated docs +api_root = "api/" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description +from docutils.parsers.rst.roles import register_canonical_role +from docutils import nodes, utils + +# api references are searched for in these modules +api_modules = [ + 'psycopg2', + 'psycopg2._psycopg', + 'psycopg2.extensions', +] + +# name starting with a dot are looking as those objects attributes. +searched_objects = [ + # module_name, object_name + ('psycopg2.extensions', 'connection'), + ('psycopg2.extensions', 'cursor'), +] + +# import all the referenced modules +for modname in api_modules: + __import__(modname) + +class EpydocTarget: + """Representation of an element language.""" + def __init__(self, name, element): + self.name = name + + # The python object described + self.element = element + + # The base name of the page + self.page = None + + # The url fragment + self.fragment = None + + def get_url(self): + # is it a private element? + components = self.page.split('.') + if self.fragment: components.append(self.fragment) + + for component in components: + if component.startswith('_'): + private = True + break + else: + private = False + + ref = api_root + (private and "private/" or "public/") \ + + self.page + "-" + self.get_type() + ".html" + if self.fragment: + ref = ref + "#" + self.fragment + + return ref + + def get_type(self): + # detect the element type + if isinstance(self.element, types.TypeType): + return 'class' + elif isinstance(self.element, types.ModuleType): + return 'module' + else: + raise ValueError("Can't choose a type for '%s'." % self.name) + +def filter_par(name): + """Filter parenthesis away from a name.""" + if name.endswith(")"): + return name.split("(")[0] + else: + return name + +def get_element_target(name): + """Return the life, the death, the miracles about a package element.""" + + name = filter_par(name) + + if name.startswith('.'): + for modname, objname in searched_objects: + if hasattr(getattr(sys.modules[modname], objname), name[1:]): + name = objname + name + break + + # is the element a module? + if name in api_modules: + out = EpydocTarget(name, sys.modules[name]) + out.page = name + return out + + # look for the element in some module + for modname in api_modules: + element = getattr(sys.modules[modname], name, None) + if element is not None: + + # Check if it is a function defined in a module + if isinstance(element, + (int, types.FunctionType, types.BuiltinFunctionType)): + out = EpydocTarget(name, sys.modules[modname]) + out.page = modname + out.fragment = name + else: + out = EpydocTarget(name, element) + out.page = modname + '.' + name + + return out + + # maybe a qualified name? + if '.' in name: + out = get_element_target('.'.join(name.split('.')[:-1])) + if out is not None: + out.fragment = filter_par(name.split('.')[-1]) + return out + + raise ValueError("Can't find '%s' in any provided module." % name) + +def api_role(role, rawtext, text, lineno, inliner, + options={}, content=[]): + try: + target = get_element_target(text) + except Exception, exc: + msg = inliner.reporter.error(str(exc), line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + + ref = target.get_url() + node2 = nodes.literal(rawtext, utils.unescape(text)) + node = nodes.reference(rawtext, '', node2, refuri=ref, + **options) + return [node], [] + + +register_canonical_role('api', api_role) + +# Register the 'api' role as canonical role +from docutils.parsers.rst import roles +roles.DEFAULT_INTERPRETED_ROLE = 'api' + + +description = ('Generates (X)HTML documents from standalone reStructuredText ' + 'sources with links to Epydoc API. ' + default_description) + + +publish_cmdline(writer_name='html', description=description) diff --git a/trunk/psycopg2/scripts/makedocs.py b/trunk/psycopg2/scripts/makedocs.py new file mode 100755 index 0000000..dcaa940 --- /dev/null +++ b/trunk/psycopg2/scripts/makedocs.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +"""Build documentation and api.""" + +import os + +EPYDOC = "python c:/programmi/python23/scripts/epydoc.py" +PSYCOPG = "c:/programmi/python23/lib/site-packages/psycopg2" + +os.system("python ext2html.py ../doc/extensions.rst > ../doc/extensions.html") +os.system("%s " + "-o ../doc/api " + "--css ../doc/api-screen.css " + "--docformat restructuredtext " + "%s" + % (EPYDOC,PSYCOPG,)) diff --git a/trunk/psycopg2/scripts/maketypes.sh b/trunk/psycopg2/scripts/maketypes.sh new file mode 100755 index 0000000..ab133c1 --- /dev/null +++ b/trunk/psycopg2/scripts/maketypes.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +SCRIPTSDIR="`dirname $0`" +SRCDIR="`dirname $SCRIPTSDIR`/psycopg" + +if [ -z "$1" ] ; then + echo Usage: $0 '' + exit 1 +fi + +echo -n checking for pg_type.h ... +if [ -f "$1/catalog/pg_type.h" ] ; then + PGTYPE="$1/catalog/pg_type.h" +else + if [ -f "$1/server/catalog/pg_type.h" ] ; then + PGTYPE="$1/server/catalog/pg_type.h" + else + echo + echo "error: can't find pg_type.h under $1" + exit 2 + fi +fi +echo " found" + +PGVERSION="`sed -n -e 's/.*PG_VERSION \"\([0-9]\.[0-9]\).*\"/\1/p' $1/pg_config.h`" +PGMAJOR="`echo $PGVERSION | cut -d. -f1`" +PGMINOR="`echo $PGVERSION | cut -d. -f2`" + +echo checking for postgresql major: $PGMAJOR +echo checking for postgresql minor: $PGMINOR + +echo -n generating pgtypes.h ... +awk '/#define .+OID/ {print "#define " $2 " " $3}' "$PGTYPE" \ + > $SRCDIR/pgtypes.h +echo " done" +echo -n generating typecast_builtins.c ... +awk '/#define .+OID/ {print $2 " " $3}' "$PGTYPE" | \ + python $SCRIPTSDIR/buildtypes.py >$SRCDIR/typecast_builtins.c +echo " done" + + diff --git a/trunk/psycopg2/setup.cfg b/trunk/psycopg2/setup.cfg new file mode 100644 index 0000000..9c32951 --- /dev/null +++ b/trunk/psycopg2/setup.cfg @@ -0,0 +1,46 @@ +[build_ext] +define=PSYCOPG_EXTENSIONS,PSYCOPG_DISPLAY_SIZE,PSYCOPG_NEW_BOOLEAN,HAVE_PQFREEMEM,HAVE_PQPROTOCOL3 +# PSYCOPG_EXTENSIONS enables extensions to PEP-249 (you really want this) +# PSYCOPG_DISPLAY_SIZE enable display size calculation (a little slower) +# HAVE_PQFREEMEM should be defined on PostgreSQL >= 7.3 +# HAVE_PQPROTOCOL3 should be defined on PostgreSQL >= 7.4 +# PSYCOPG_DEBUG can be added to enable verbose debug information +# PSYCOPG_OWN_QUOTING can be added, but it is deprecated (will go away in 2.1) +# PSYCOPG_NEW_BOOLEAN to format booleans as true/false vs 't'/'f' + +# Set to 1 to use Python datatime objects for default date/time representation +use_pydatetime=1 + +# Set to 1 if you want to enable "Decimal" type on python 2.3. +# If the "decimal" module is found in the PYTHONPATH it will be used, else +# fall back on the float type (this is disabled by default to be compatible +# with old versions of psycopg 1 and pre-beta versions of psycopg 2.) +use_decimal=0 + +# If the build system does not find the mx.DateTime headers, try +# uncommenting the following line and setting its value to the right path. +#mx_include_dir= + +# "pg_config" is the preferred method to locate PostgreSQL headers and +# libraries needed to build psycopg2. If pg_config is not in the path or +# is installed under a different name uncomment the following option and +# set it to the pg_config full path. +#pg_config= + +# If "pg_config" is not available, "include_dirs" can be used to locate +# postgresql headers and libraries. Some extra checks on sys.platform will +# still be done in setup.py. +# The next line is the default as used on psycopg author Debian laptop: +#include_dirs=/usr/include/postgresql:/usr/include/postgresql/server + +# Uncomment next line on Mandrake 10.x (and comment previous ones): +#include_dirs=/usr/include/pgsql/8.0:/usr/include/pgsql/8.0/server + +# Uncomment next line on SUSE 9.3 (and comment previous ones): +#include_dirs=/usr/include/pgsql:/usr/include/pgsql/server + +# If postgresql is installed somewhere weird (i.e., not in your runtime library +# path like /usr/lib), just add the right path in "library_dirs" and any extra +# libraries required to link in "libraries". +#library_dirs= +#libraries= diff --git a/trunk/psycopg2/setup.py b/trunk/psycopg2/setup.py new file mode 100644 index 0000000..45daed7 --- /dev/null +++ b/trunk/psycopg2/setup.py @@ -0,0 +1,293 @@ +# setup.py - distutils packaging +# +# Copyright (C) 2003-2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +"""Python-PostgreSQL Database Adapter + +psycopg is a PostgreSQL database adapter for the Python programming +language. This is version 2, a complete rewrite of the original code to +provide new-style classes for connection and cursor objects and other sweet +candies. Like the original, psycopg 2 was written with the aim of being +very small and fast, and stable as a rock. + +psycopg is different from the other database adapter because it was +designed for heavily multi-threaded applications that create and destroy +lots of cursors and make a conspicuous number of concurrent INSERTs or +UPDATEs. psycopg 2 also provide full asycronous operations for the really +brave programmer. +""" + +classifiers = """\ +Development Status :: 4 - Beta +Intended Audience :: Developers +License :: OSI Approved :: GNU General Public License (GPL) +License :: OSI Approved :: Zope Public License +Programming Language :: Python +Programming Language :: C +Programming Language :: SQL +Topic :: Database +Topic :: Database :: Front-Ends +Topic :: Software Development +Topic :: Software Development :: Libraries :: Python Modules +Operating System :: Microsoft :: Windows +Operating System :: Unix +""" + +import os +import sys +import popen2 +from distutils.core import setup, Extension +from distutils.errors import DistutilsFileError +from distutils.command.build_ext import build_ext +from distutils.sysconfig import get_python_inc +from distutils.ccompiler import get_default_compiler + +PSYCOPG_VERSION = '2.0.5.1' +version_flags = [] + +# to work around older distutil limitations +if sys.version < '2.2.3': + from distutils.dist import DistributionMetadata + DistributionMetadata.classifiers = None + DistributionMetadata.download_url = None + +def get_pg_config(kind, pg_config="pg_config"): + p = popen2.popen3(pg_config + " --" + kind) + r = p[0].readline().strip() + if not r: + raise Warning(p[2].readline()) + return r + +class psycopg_build_ext(build_ext): + """Conditionally complement the setup.cfg options file. + + This class configures the include_dirs, libray_dirs, libraries + options as required by the system. Most of the configuration happens + in finalize_options() method. + + If you want to set up the build step for a peculiar platform, add a + method finalize_PLAT(), where PLAT matches your sys.platform. + """ + user_options = build_ext.user_options[:] + user_options.extend([ + ('use-pydatetime', None, + "Use Python datatime objects for date and time representation."), + ('pg-config=', None, + "The name of the pg_config binary and/or full path to find it"), + ('use-decimal', None, + "Use Decimal type even on Python 2.3 if the module is provided."), + ]) + + boolean_options = build_ext.boolean_options[:] + boolean_options.extend(('use-pydatetime', 'use-decimal')) + + DEFAULT_PG_CONFIG = "pg_config" + + def initialize_options(self): + build_ext.initialize_options(self) + self.use_pg_dll = 1 + self.pgdir = None + self.pg_config = self.DEFAULT_PG_CONFIG + self.mx_include_dir = None + + def get_compiler(self): + """Return the c compiler to compile extensions. + + If a compiler was not explicitely set (on the command line, for + example), fall back on the default compiler. + """ + return self.compiler or get_default_compiler() + + def get_pg_config(self, kind): + return get_pg_config(kind, self.pg_config) + + def build_extensions(self): + # Linking against this library causes psycopg2 to crash + # on Python >= 2.4. Maybe related to strdup calls, cfr. + # http://mail.python.org/pipermail/distutils-sig/2005-April/004433.html + if self.get_compiler().compiler_type == "mingw32" \ + and 'msvcr71' in self.compiler.dll_libraries: + self.compiler.dll_libraries.remove('msvcr71') + + build_ext.build_extensions(self) + + def finalize_win32(self): + """Finalize build system configuration on win32 platform.""" + self.libraries.append("ws2_32") + self.libraries.append("advapi32") + if self.get_compiler() == "msvc": + # MSVC requires an explicit "libpq" + self.libraries.remove("pq") + self.libraries.append("libpq") + self.libraries.append("shfolder") + for path in self.library_dirs: + if os.path.isfile(os.path.join(path, "ms", "libpq.lib")): + self.library_dirs.append(os.path.join(path, "ms")) + break + + def finalize_darwin(self): + """Finalize build system configuration on darwin platform.""" + self.libraries.append('ssl') + self.libraries.append('crypto') + + def finalize_options(self): + """Complete the build system configuation.""" + build_ext.finalize_options(self) + + self.include_dirs.append(".") + self.libraries.append("pq") + + try: + self.library_dirs.append(self.get_pg_config("libdir")) + self.include_dirs.append(self.get_pg_config("includedir")) + self.include_dirs.append(self.get_pg_config("includedir-server")) + try: + # Here we take a conservative approach: we suppose that + # *at least* PostgreSQL 7.4 is available (this is the only + # 7.x series supported by psycopg 2) + pgversion = self.get_pg_config("version").split()[1] + pgmajor, pgminor, pgpatch = pgversion.split('.') + except: + pgmajor, pgminor, pgpatch = 7, 4, 0 + define_macros.append(("PG_MAJOR_VERSION", pgmajor)) + define_macros.append(("PG_MINOR_VERSION", pgminor)) + define_macros.append(("PG_PATCH_VERSION", pgpatch)) + except Warning, w: + if self.pg_config == self.DEFAULT_PG_CONFIG: + sys.stderr.write("Warning: %s" % str(w)) + else: + sys.stderr.write("Error: %s" % str(w)) + sys.exit(1) + + if hasattr(self, "finalize_" + sys.platform): + getattr(self, "finalize_" + sys.platform)() + +# let's start with macro definitions (the ones not already in setup.cfg) +define_macros = [] +include_dirs = [] + +# python version +define_macros.append(('PY_MAJOR_VERSION', str(sys.version_info[0]))) +define_macros.append(('PY_MINOR_VERSION', str(sys.version_info[1]))) + +# some macros related to python versions and features +if sys.version_info[0] >= 2 and sys.version_info[1] >= 3: + define_macros.append(('HAVE_PYBOOL','1')) + +# gather information to build the extension module +ext = [] ; data_files = [] + +# sources + +sources = [ + 'psycopgmodule.c', 'pqpath.c', 'typecast.c', + 'microprotocols.c', 'microprotocols_proto.c', + 'connection_type.c', 'connection_int.c', 'cursor_type.c', 'cursor_int.c', + 'adapter_qstring.c', 'adapter_pboolean.c', 'adapter_binary.c', + 'adapter_asis.c', 'adapter_list.c'] + +from ConfigParser import ConfigParser +parser = ConfigParser() +parser.read('setup.cfg') + +# Choose if to use Decimal type +use_decimal = int(parser.get('build_ext', 'use_decimal')) +if sys.version_info[0] >= 2 and ( + sys.version_info[1] >= 4 or (sys.version_info[1] == 3 and use_decimal)): + define_macros.append(('HAVE_DECIMAL','1')) + version_flags.append('dec') + +# Choose a datetime module +have_pydatetime = False +have_mxdatetime = False +use_pydatetime = int(parser.get('build_ext', 'use_pydatetime')) + +# check for mx package +if parser.has_option('build_ext', 'mx_include_dir'): + mxincludedir = parser.get('build_ext', 'mx_include_dir') +else: + mxincludedir = os.path.join(get_python_inc(plat_specific=1), "mx") +if os.path.exists(mxincludedir): + include_dirs.append(mxincludedir) + define_macros.append(('HAVE_MXDATETIME','1')) + sources.append('adapter_mxdatetime.c') + have_mxdatetime = True + version_flags.append('mx') + +# check for python datetime package +if os.path.exists(os.path.join(get_python_inc(plat_specific=1),"datetime.h")): + define_macros.append(('HAVE_PYDATETIME','1')) + sources.append('adapter_datetime.c') + have_pydatetime = True + version_flags.append('dt') + +# now decide which package will be the default for date/time typecasts +if have_pydatetime and use_pydatetime \ + or have_pydatetime and not have_mxdatetime: + define_macros.append(('PSYCOPG_DEFAULT_PYDATETIME','1')) +elif have_mxdatetime: + define_macros.append(('PSYCOPG_DEFAULT_MXDATETIME','1')) +else: + def e(msg): + sys.stderr.write("error: " + msg + "\n") + e("psycopg requires a datetime module:") + e(" mx.DateTime module not found") + e(" python datetime module not found") + e("Note that psycopg needs the module headers and not just the module") + e("itself. If you installed Python or mx.DateTime from a binary package") + e("you probably need to install its companion -dev or -devel package.") + sys.exit(1) + +# generate a nice version string to avoid confusion when users report bugs +for have in parser.get('build_ext', 'define').split(','): + if have == 'PSYCOPG_EXTENSIONS': + version_flags.append('ext') + elif have == 'HAVE_PQPROTOCOL3': + version_flags.append('pq3') +if version_flags: + PSYCOPG_VERSION_EX = PSYCOPG_VERSION + " (%s)" % ' '.join(version_flags) +else: + PSYCOPG_VERSION_EX = PSYCOPG_VERSION + +if sys.platform != 'win32': + define_macros.append(('PSYCOPG_VERSION', '"'+PSYCOPG_VERSION_EX+'"')) +else: + define_macros.append(('PSYCOPG_VERSION', '\\"'+PSYCOPG_VERSION_EX+'\\"')) + +# build the extension + +sources = map(lambda x: os.path.join('psycopg', x), sources) + +ext.append(Extension("psycopg2._psycopg", sources, + define_macros=define_macros, + include_dirs=include_dirs, + undef_macros=[])) + +setup(name="psycopg2", + version=PSYCOPG_VERSION, + maintainer="Federico Di Gregorio", + maintainer_email="fog@initd.org", + author="Federico Di Gregorio", + author_email="fog@initd.org", + url="http://initd.org/tracker/psycopg", + download_url = "http://initd.org/pub/software/psycopg2", + license="GPL with exceptions or ZPL", + platforms = ["any"], + description=__doc__.split("\n")[0], + long_description="\n".join(__doc__.split("\n")[2:]), + classifiers=filter(None, classifiers.split("\n")), + data_files=data_files, + package_dir={'psycopg2':'lib'}, + packages=['psycopg2'], + cmdclass={ 'build_ext': psycopg_build_ext }, + ext_modules=ext) diff --git a/trunk/psycopg2/tests/dbapi20.py b/trunk/psycopg2/tests/dbapi20.py new file mode 100644 index 0000000..21f15b9 --- /dev/null +++ b/trunk/psycopg2/tests/dbapi20.py @@ -0,0 +1,850 @@ +#!/usr/bin/env python +''' Python DB API 2.0 driver compliance unit test suite. + + This software is Public Domain and may be used without restrictions. + + "Now we have booze and barflies entering the discussion, plus rumours of + DBAs on drugs... and I won't tell you what flashes through my mind each + time I read the subject line with 'Anal Compliance' in it. All around + this is turning out to be a thoroughly unwholesome unit test." + + -- Ian Bicking +''' + +__rcs_id__ = '$Id$' +__version__ = '$Revision$'[11:-2] +__author__ = 'Stuart Bishop ' + +import unittest +import time + +# $Log: dbapi20.py,v $ +# Revision 1.10 2003/10/09 03:14:14 zenzen +# Add test for DB API 2.0 optional extension, where database exceptions +# are exposed as attributes on the Connection object. +# +# Revision 1.9 2003/08/13 01:16:36 zenzen +# Minor tweak from Stefan Fleiter +# +# Revision 1.8 2003/04/10 00:13:25 zenzen +# Changes, as per suggestions by M.-A. Lemburg +# - Add a table prefix, to ensure namespace collisions can always be avoided +# +# Revision 1.7 2003/02/26 23:33:37 zenzen +# Break out DDL into helper functions, as per request by David Rushby +# +# Revision 1.6 2003/02/21 03:04:33 zenzen +# Stuff from Henrik Ekelund: +# added test_None +# added test_nextset & hooks +# +# Revision 1.5 2003/02/17 22:08:43 zenzen +# Implement suggestions and code from Henrik Eklund - test that cursor.arraysize +# defaults to 1 & generic cursor.callproc test added +# +# Revision 1.4 2003/02/15 00:16:33 zenzen +# Changes, as per suggestions and bug reports by M.-A. Lemburg, +# Matthew T. Kromer, Federico Di Gregorio and Daniel Dittmar +# - Class renamed +# - Now a subclass of TestCase, to avoid requiring the driver stub +# to use multiple inheritance +# - Reversed the polarity of buggy test in test_description +# - Test exception heirarchy correctly +# - self.populate is now self._populate(), so if a driver stub +# overrides self.ddl1 this change propogates +# - VARCHAR columns now have a width, which will hopefully make the +# DDL even more portible (this will be reversed if it causes more problems) +# - cursor.rowcount being checked after various execute and fetchXXX methods +# - Check for fetchall and fetchmany returning empty lists after results +# are exhausted (already checking for empty lists if select retrieved +# nothing +# - Fix bugs in test_setoutputsize_basic and test_setinputsizes +# + +class DatabaseAPI20Test(unittest.TestCase): + ''' Test a database self.driver for DB API 2.0 compatibility. + This implementation tests Gadfly, but the TestCase + is structured so that other self.drivers can subclass this + test case to ensure compiliance with the DB-API. It is + expected that this TestCase may be expanded in the future + if ambiguities or edge conditions are discovered. + + The 'Optional Extensions' are not yet being tested. + + self.drivers should subclass this test, overriding setUp, tearDown, + self.driver, connect_args and connect_kw_args. Class specification + should be as follows: + + import dbapi20 + class mytest(dbapi20.DatabaseAPI20Test): + [...] + + Don't 'import DatabaseAPI20Test from dbapi20', or you will + confuse the unit tester - just 'import dbapi20'. + ''' + + # The self.driver module. This should be the module where the 'connect' + # method is to be found + driver = None + connect_args = () # List of arguments to pass to connect + connect_kw_args = {} # Keyword arguments for connect + table_prefix = 'dbapi20test_' # If you need to specify a prefix for tables + + ddl1 = 'create table %sbooze (name varchar(20))' % table_prefix + ddl2 = 'create table %sbarflys (name varchar(20))' % table_prefix + xddl1 = 'drop table %sbooze' % table_prefix + xddl2 = 'drop table %sbarflys' % table_prefix + + lowerfunc = 'lower' # Name of stored procedure to convert string->lowercase + + # Some drivers may need to override these helpers, for example adding + # a 'commit' after the execute. + def executeDDL1(self,cursor): + cursor.execute(self.ddl1) + + def executeDDL2(self,cursor): + cursor.execute(self.ddl2) + + def setUp(self): + ''' self.drivers should override this method to perform required setup + if any is necessary, such as creating the database. + ''' + pass + + def tearDown(self): + ''' self.drivers should override this method to perform required cleanup + if any is necessary, such as deleting the test database. + The default drops the tables that may be created. + ''' + con = self._connect() + try: + cur = con.cursor() + for ddl in (self.xddl1,self.xddl2): + try: + cur.execute(ddl) + con.commit() + except self.driver.Error: + # Assume table didn't exist. Other tests will check if + # execute is busted. + pass + finally: + con.close() + + def _connect(self): + try: + return self.driver.connect( + *self.connect_args,**self.connect_kw_args + ) + except AttributeError: + self.fail("No connect method found in self.driver module") + + def test_connect(self): + con = self._connect() + con.close() + + def test_apilevel(self): + try: + # Must exist + apilevel = self.driver.apilevel + # Must equal 2.0 + self.assertEqual(apilevel,'2.0') + except AttributeError: + self.fail("Driver doesn't define apilevel") + + def test_threadsafety(self): + try: + # Must exist + threadsafety = self.driver.threadsafety + # Must be a valid value + self.failUnless(threadsafety in (0,1,2,3)) + except AttributeError: + self.fail("Driver doesn't define threadsafety") + + def test_paramstyle(self): + try: + # Must exist + paramstyle = self.driver.paramstyle + # Must be a valid value + self.failUnless(paramstyle in ( + 'qmark','numeric','named','format','pyformat' + )) + except AttributeError: + self.fail("Driver doesn't define paramstyle") + + def test_Exceptions(self): + # Make sure required exceptions exist, and are in the + # defined heirarchy. + self.failUnless(issubclass(self.driver.Warning,StandardError)) + self.failUnless(issubclass(self.driver.Error,StandardError)) + self.failUnless( + issubclass(self.driver.InterfaceError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.DatabaseError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.OperationalError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.IntegrityError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.InternalError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.ProgrammingError,self.driver.Error) + ) + self.failUnless( + issubclass(self.driver.NotSupportedError,self.driver.Error) + ) + + def test_ExceptionsAsConnectionAttributes(self): + # OPTIONAL EXTENSION + # Test for the optional DB API 2.0 extension, where the exceptions + # are exposed as attributes on the Connection object + # I figure this optional extension will be implemented by any + # driver author who is using this test suite, so it is enabled + # by default. + con = self._connect() + drv = self.driver + self.failUnless(con.Warning is drv.Warning) + self.failUnless(con.Error is drv.Error) + self.failUnless(con.InterfaceError is drv.InterfaceError) + self.failUnless(con.DatabaseError is drv.DatabaseError) + self.failUnless(con.OperationalError is drv.OperationalError) + self.failUnless(con.IntegrityError is drv.IntegrityError) + self.failUnless(con.InternalError is drv.InternalError) + self.failUnless(con.ProgrammingError is drv.ProgrammingError) + self.failUnless(con.NotSupportedError is drv.NotSupportedError) + + + def test_commit(self): + con = self._connect() + try: + # Commit must work, even if it doesn't do anything + con.commit() + finally: + con.close() + + def test_rollback(self): + con = self._connect() + # If rollback is defined, it should either work or throw + # the documented exception + if hasattr(con,'rollback'): + try: + con.rollback() + except self.driver.NotSupportedError: + pass + + def test_cursor(self): + con = self._connect() + try: + cur = con.cursor() + finally: + con.close() + + def test_cursor_isolation(self): + con = self._connect() + try: + # Make sure cursors created from the same connection have + # the documented transaction isolation level + cur1 = con.cursor() + cur2 = con.cursor() + self.executeDDL1(cur1) + cur1.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + cur2.execute("select name from %sbooze" % self.table_prefix) + booze = cur2.fetchall() + self.assertEqual(len(booze),1) + self.assertEqual(len(booze[0]),1) + self.assertEqual(booze[0][0],'Victoria Bitter') + finally: + con.close() + + def test_description(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + self.assertEqual(cur.description,None, + 'cursor.description should be none after executing a ' + 'statement that can return no rows (such as DDL)' + ) + cur.execute('select name from %sbooze' % self.table_prefix) + self.assertEqual(len(cur.description),1, + 'cursor.description describes too many columns' + ) + self.assertEqual(len(cur.description[0]),7, + 'cursor.description[x] tuples must have 7 elements' + ) + self.assertEqual(cur.description[0][0].lower(),'name', + 'cursor.description[x][0] must return column name' + ) + self.assertEqual(cur.description[0][1],self.driver.STRING, + 'cursor.description[x][1] must return column type. Got %r' + % cur.description[0][1] + ) + + # Make sure self.description gets reset + self.executeDDL2(cur) + self.assertEqual(cur.description,None, + 'cursor.description not being set to None when executing ' + 'no-result statements (eg. DDL)' + ) + finally: + con.close() + + def test_rowcount(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + self.assertEqual(cur.rowcount,-1, + 'cursor.rowcount should be -1 after executing no-result ' + 'statements' + ) + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.failUnless(cur.rowcount in (-1,1), + 'cursor.rowcount should == number or rows inserted, or ' + 'set to -1 after executing an insert statement' + ) + cur.execute("select name from %sbooze" % self.table_prefix) + self.failUnless(cur.rowcount in (-1,1), + 'cursor.rowcount should == number of rows returned, or ' + 'set to -1 after executing a select statement' + ) + self.executeDDL2(cur) + self.assertEqual(cur.rowcount,-1, + 'cursor.rowcount not being reset to -1 after executing ' + 'no-result statements' + ) + finally: + con.close() + + lower_func = 'lower' + def test_callproc(self): + con = self._connect() + try: + cur = con.cursor() + if self.lower_func and hasattr(cur,'callproc'): + r = cur.callproc(self.lower_func,('FOO',)) + self.assertEqual(len(r),1) + self.assertEqual(r[0],'FOO') + r = cur.fetchall() + self.assertEqual(len(r),1,'callproc produced no result set') + self.assertEqual(len(r[0]),1, + 'callproc produced invalid result set' + ) + self.assertEqual(r[0][0],'foo', + 'callproc produced invalid results' + ) + finally: + con.close() + + def test_close(self): + con = self._connect() + try: + cur = con.cursor() + finally: + con.close() + + # cursor.execute should raise an Error if called after connection + # closed + self.assertRaises(self.driver.Error,self.executeDDL1,cur) + + # connection.commit should raise an Error if called after connection' + # closed.' + self.assertRaises(self.driver.Error,con.commit) + + # connection.close should raise an Error if called more than once + self.assertRaises(self.driver.Error,con.close) + + def test_execute(self): + con = self._connect() + try: + cur = con.cursor() + self._paraminsert(cur) + finally: + con.close() + + def _paraminsert(self,cur): + self.executeDDL1(cur) + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.failUnless(cur.rowcount in (-1,1)) + + if self.driver.paramstyle == 'qmark': + cur.execute( + 'insert into %sbooze values (?)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'numeric': + cur.execute( + 'insert into %sbooze values (:1)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'named': + cur.execute( + 'insert into %sbooze values (:beer)' % self.table_prefix, + {'beer':"Cooper's"} + ) + elif self.driver.paramstyle == 'format': + cur.execute( + 'insert into %sbooze values (%%s)' % self.table_prefix, + ("Cooper's",) + ) + elif self.driver.paramstyle == 'pyformat': + cur.execute( + 'insert into %sbooze values (%%(beer)s)' % self.table_prefix, + {'beer':"Cooper's"} + ) + else: + self.fail('Invalid paramstyle') + self.failUnless(cur.rowcount in (-1,1)) + + cur.execute('select name from %sbooze' % self.table_prefix) + res = cur.fetchall() + self.assertEqual(len(res),2,'cursor.fetchall returned too few rows') + beers = [res[0][0],res[1][0]] + beers.sort() + self.assertEqual(beers[0],"Cooper's", + 'cursor.fetchall retrieved incorrect data, or data inserted ' + 'incorrectly' + ) + self.assertEqual(beers[1],"Victoria Bitter", + 'cursor.fetchall retrieved incorrect data, or data inserted ' + 'incorrectly' + ) + + def test_executemany(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + largs = [ ("Cooper's",) , ("Boag's",) ] + margs = [ {'beer': "Cooper's"}, {'beer': "Boag's"} ] + if self.driver.paramstyle == 'qmark': + cur.executemany( + 'insert into %sbooze values (?)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'numeric': + cur.executemany( + 'insert into %sbooze values (:1)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'named': + cur.executemany( + 'insert into %sbooze values (:beer)' % self.table_prefix, + margs + ) + elif self.driver.paramstyle == 'format': + cur.executemany( + 'insert into %sbooze values (%%s)' % self.table_prefix, + largs + ) + elif self.driver.paramstyle == 'pyformat': + cur.executemany( + 'insert into %sbooze values (%%(beer)s)' % ( + self.table_prefix + ), + margs + ) + else: + self.fail('Unknown paramstyle') + self.failUnless(cur.rowcount in (-1,2), + 'insert using cursor.executemany set cursor.rowcount to ' + 'incorrect value %r' % cur.rowcount + ) + cur.execute('select name from %sbooze' % self.table_prefix) + res = cur.fetchall() + self.assertEqual(len(res),2, + 'cursor.fetchall retrieved incorrect number of rows' + ) + beers = [res[0][0],res[1][0]] + beers.sort() + self.assertEqual(beers[0],"Boag's",'incorrect data retrieved') + self.assertEqual(beers[1],"Cooper's",'incorrect data retrieved') + finally: + con.close() + + def test_fetchone(self): + con = self._connect() + try: + cur = con.cursor() + + # cursor.fetchone should raise an Error if called before + # executing a select-type query + self.assertRaises(self.driver.Error,cur.fetchone) + + # cursor.fetchone should raise an Error if called after + # executing a query that cannnot return rows + self.executeDDL1(cur) + self.assertRaises(self.driver.Error,cur.fetchone) + + cur.execute('select name from %sbooze' % self.table_prefix) + self.assertEqual(cur.fetchone(),None, + 'cursor.fetchone should return None if a query retrieves ' + 'no rows' + ) + self.failUnless(cur.rowcount in (-1,0)) + + # cursor.fetchone should raise an Error if called after + # executing a query that cannnot return rows + cur.execute("insert into %sbooze values ('Victoria Bitter')" % ( + self.table_prefix + )) + self.assertRaises(self.driver.Error,cur.fetchone) + + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchone() + self.assertEqual(len(r),1, + 'cursor.fetchone should have retrieved a single row' + ) + self.assertEqual(r[0],'Victoria Bitter', + 'cursor.fetchone retrieved incorrect data' + ) + self.assertEqual(cur.fetchone(),None, + 'cursor.fetchone should return None if no more rows available' + ) + self.failUnless(cur.rowcount in (-1,1)) + finally: + con.close() + + samples = [ + 'Carlton Cold', + 'Carlton Draft', + 'Mountain Goat', + 'Redback', + 'Victoria Bitter', + 'XXXX' + ] + + def _populate(self): + ''' Return a list of sql commands to setup the DB for the fetch + tests. + ''' + populate = [ + "insert into %sbooze values ('%s')" % (self.table_prefix,s) + for s in self.samples + ] + return populate + + def test_fetchmany(self): + con = self._connect() + try: + cur = con.cursor() + + # cursor.fetchmany should raise an Error if called without + #issuing a query + self.assertRaises(self.driver.Error,cur.fetchmany,4) + + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchmany() + self.assertEqual(len(r),1, + 'cursor.fetchmany retrieved incorrect number of rows, ' + 'default of arraysize is one.' + ) + cur.arraysize=10 + r = cur.fetchmany(3) # Should get 3 rows + self.assertEqual(len(r),3, + 'cursor.fetchmany retrieved incorrect number of rows' + ) + r = cur.fetchmany(4) # Should get 2 more + self.assertEqual(len(r),2, + 'cursor.fetchmany retrieved incorrect number of rows' + ) + r = cur.fetchmany(4) # Should be an empty sequence + self.assertEqual(len(r),0, + 'cursor.fetchmany should return an empty sequence after ' + 'results are exhausted' + ) + self.failUnless(cur.rowcount in (-1,6)) + + # Same as above, using cursor.arraysize + cur.arraysize=4 + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchmany() # Should get 4 rows + self.assertEqual(len(r),4, + 'cursor.arraysize not being honoured by fetchmany' + ) + r = cur.fetchmany() # Should get 2 more + self.assertEqual(len(r),2) + r = cur.fetchmany() # Should be an empty sequence + self.assertEqual(len(r),0) + self.failUnless(cur.rowcount in (-1,6)) + + cur.arraysize=6 + cur.execute('select name from %sbooze' % self.table_prefix) + rows = cur.fetchmany() # Should get all rows + self.failUnless(cur.rowcount in (-1,6)) + self.assertEqual(len(rows),6) + self.assertEqual(len(rows),6) + rows = [r[0] for r in rows] + rows.sort() + + # Make sure we get the right data back out + for i in range(0,6): + self.assertEqual(rows[i],self.samples[i], + 'incorrect data retrieved by cursor.fetchmany' + ) + + rows = cur.fetchmany() # Should return an empty list + self.assertEqual(len(rows),0, + 'cursor.fetchmany should return an empty sequence if ' + 'called after the whole result set has been fetched' + ) + self.failUnless(cur.rowcount in (-1,6)) + + self.executeDDL2(cur) + cur.execute('select name from %sbarflys' % self.table_prefix) + r = cur.fetchmany() # Should get empty sequence + self.assertEqual(len(r),0, + 'cursor.fetchmany should return an empty sequence if ' + 'query retrieved no rows' + ) + self.failUnless(cur.rowcount in (-1,0)) + + finally: + con.close() + + def test_fetchall(self): + con = self._connect() + try: + cur = con.cursor() + # cursor.fetchall should raise an Error if called + # without executing a query that may return rows (such + # as a select) + self.assertRaises(self.driver.Error, cur.fetchall) + + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + # cursor.fetchall should raise an Error if called + # after executing a a statement that cannot return rows + self.assertRaises(self.driver.Error,cur.fetchall) + + cur.execute('select name from %sbooze' % self.table_prefix) + rows = cur.fetchall() + self.failUnless(cur.rowcount in (-1,len(self.samples))) + self.assertEqual(len(rows),len(self.samples), + 'cursor.fetchall did not retrieve all rows' + ) + rows = [r[0] for r in rows] + rows.sort() + for i in range(0,len(self.samples)): + self.assertEqual(rows[i],self.samples[i], + 'cursor.fetchall retrieved incorrect rows' + ) + rows = cur.fetchall() + self.assertEqual( + len(rows),0, + 'cursor.fetchall should return an empty list if called ' + 'after the whole result set has been fetched' + ) + self.failUnless(cur.rowcount in (-1,len(self.samples))) + + self.executeDDL2(cur) + cur.execute('select name from %sbarflys' % self.table_prefix) + rows = cur.fetchall() + self.failUnless(cur.rowcount in (-1,0)) + self.assertEqual(len(rows),0, + 'cursor.fetchall should return an empty list if ' + 'a select query returns no rows' + ) + + finally: + con.close() + + def test_mixedfetch(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + for sql in self._populate(): + cur.execute(sql) + + cur.execute('select name from %sbooze' % self.table_prefix) + rows1 = cur.fetchone() + rows23 = cur.fetchmany(2) + rows4 = cur.fetchone() + rows56 = cur.fetchall() + self.failUnless(cur.rowcount in (-1,6)) + self.assertEqual(len(rows23),2, + 'fetchmany returned incorrect number of rows' + ) + self.assertEqual(len(rows56),2, + 'fetchall returned incorrect number of rows' + ) + + rows = [rows1[0]] + rows.extend([rows23[0][0],rows23[1][0]]) + rows.append(rows4[0]) + rows.extend([rows56[0][0],rows56[1][0]]) + rows.sort() + for i in range(0,len(self.samples)): + self.assertEqual(rows[i],self.samples[i], + 'incorrect data retrieved or inserted' + ) + finally: + con.close() + + def help_nextset_setUp(self,cur): + ''' Should create a procedure called deleteme + that returns two result sets, first the + number of rows in booze then "name from booze" + ''' + raise NotImplementedError,'Helper not implemented' + #sql=""" + # create procedure deleteme as + # begin + # select count(*) from booze + # select name from booze + # end + #""" + #cur.execute(sql) + + def help_nextset_tearDown(self,cur): + 'If cleaning up is needed after nextSetTest' + raise NotImplementedError,'Helper not implemented' + #cur.execute("drop procedure deleteme") + + def test_nextset(self): + con = self._connect() + try: + cur = con.cursor() + if not hasattr(cur,'nextset'): + return + + try: + self.executeDDL1(cur) + sql=self._populate() + for sql in self._populate(): + cur.execute(sql) + + self.help_nextset_setUp(cur) + + cur.callproc('deleteme') + numberofrows=cur.fetchone() + assert numberofrows[0]== len(self.samples) + assert cur.nextset() + names=cur.fetchall() + assert len(names) == len(self.samples) + s=cur.nextset() + assert s == None,'No more return sets, should return None' + finally: + self.help_nextset_tearDown(cur) + + finally: + con.close() + + def test_nextset(self): + raise NotImplementedError,'Drivers need to override this test' + + def test_arraysize(self): + # Not much here - rest of the tests for this are in test_fetchmany + con = self._connect() + try: + cur = con.cursor() + self.failUnless(hasattr(cur,'arraysize'), + 'cursor.arraysize must be defined' + ) + finally: + con.close() + + def test_setinputsizes(self): + con = self._connect() + try: + cur = con.cursor() + cur.setinputsizes( (25,) ) + self._paraminsert(cur) # Make sure cursor still works + finally: + con.close() + + def test_setoutputsize_basic(self): + # Basic test is to make sure setoutputsize doesn't blow up + con = self._connect() + try: + cur = con.cursor() + cur.setoutputsize(1000) + cur.setoutputsize(2000,0) + self._paraminsert(cur) # Make sure the cursor still works + finally: + con.close() + + def test_setoutputsize(self): + # Real test for setoutputsize is driver dependant + raise NotImplementedError,'Driver need to override this test' + + def test_None(self): + con = self._connect() + try: + cur = con.cursor() + self.executeDDL1(cur) + cur.execute('insert into %sbooze values (NULL)' % self.table_prefix) + cur.execute('select name from %sbooze' % self.table_prefix) + r = cur.fetchall() + self.assertEqual(len(r),1) + self.assertEqual(len(r[0]),1) + self.assertEqual(r[0][0],None,'NULL value not returned as None') + finally: + con.close() + + def test_Date(self): + d1 = self.driver.Date(2002,12,25) + d2 = self.driver.DateFromTicks(time.mktime((2002,12,25,0,0,0,0,0,0))) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(d1),str(d2)) + + def test_Time(self): + t1 = self.driver.Time(13,45,30) + t2 = self.driver.TimeFromTicks(time.mktime((2001,1,1,13,45,30,0,0,0))) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(t1),str(t2)) + + def test_Timestamp(self): + t1 = self.driver.Timestamp(2002,12,25,13,45,30) + t2 = self.driver.TimestampFromTicks( + time.mktime((2002,12,25,13,45,30,0,0,0)) + ) + # Can we assume this? API doesn't specify, but it seems implied + # self.assertEqual(str(t1),str(t2)) + + def test_Binary(self): + b = self.driver.Binary('Something') + b = self.driver.Binary('') + + def test_STRING(self): + self.failUnless(hasattr(self.driver,'STRING'), + 'module.STRING must be defined' + ) + + def test_BINARY(self): + self.failUnless(hasattr(self.driver,'BINARY'), + 'module.BINARY must be defined.' + ) + + def test_NUMBER(self): + self.failUnless(hasattr(self.driver,'NUMBER'), + 'module.NUMBER must be defined.' + ) + + def test_DATETIME(self): + self.failUnless(hasattr(self.driver,'DATETIME'), + 'module.DATETIME must be defined.' + ) + + def test_ROWID(self): + self.failUnless(hasattr(self.driver,'ROWID'), + 'module.ROWID must be defined.' + ) + diff --git a/trunk/psycopg2/tests/extras_dictcursor.py b/trunk/psycopg2/tests/extras_dictcursor.py new file mode 100644 index 0000000..270d37f --- /dev/null +++ b/trunk/psycopg2/tests/extras_dictcursor.py @@ -0,0 +1,47 @@ +# extras_dictcursor - test if DictCursor extension class works +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import psycopg2 +import psycopg2.extras +from unittest import TestCase, TestSuite, main + + +class ExtrasDictCursorTests(TestCase): + """Test if DictCursor extension class works.""" + + def setUp(self): + self.conn = psycopg2.connect("dbname=test") + curs = self.conn.cursor() + curs.execute("CREATE TABLE ExtrasDictCursorTests (foo text)") + + def testDictCursor(self): + curs = self.conn.cursor(cursor_factory=psycopg2.extras.DictCursor) + curs.execute("INSERT INTO ExtrasDictCursorTests VALUES ('bar')") + curs.execute("SELECT * FROM ExtrasDictCursorTests") + row = curs.fetchone() + self.failUnless(row['foo'] == 'bar') + self.failUnless(row[0] == 'bar') + +class ExtrasDictCursorSuite(TestSuite): + """Build a suite of all tests.""" + + def __init__(self): + """Build a list of tests.""" + self.tests = [x for x in dir(ExtrasDictCursorTests) + if x.startswith('test')] + TestSuite.__init__(self, map(TestModule, self.tests)) + + +if __name__ == "__main__": + main() diff --git a/trunk/psycopg2/tests/test_psycopg2_dbapi20.py b/trunk/psycopg2/tests/test_psycopg2_dbapi20.py new file mode 100644 index 0000000..028b718 --- /dev/null +++ b/trunk/psycopg2/tests/test_psycopg2_dbapi20.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +import dbapi20 +import unittest +import psycopg2 +import popen2 + +class test_Psycopg(dbapi20.DatabaseAPI20Test): + driver = psycopg2 + connect_args = () + connect_kw_args = {'dsn': 'dbname=dbapi20_test'} + + lower_func = 'lower' # For stored procedure test + + def setUp(self): + # Call superclass setUp In case this does something in the + # future + dbapi20.DatabaseAPI20Test.setUp(self) + + try: + con = self._connect() + con.close() + except: + cmd = "psql -c 'create database dbapi20_test' template1" + cout,cin = popen2.popen2(cmd) + cin.close() + cout.read() + + def tearDown(self): + dbapi20.DatabaseAPI20Test.tearDown(self) + + def test_nextset(self): pass + def test_setoutputsize(self): pass + +if __name__ == '__main__': + unittest.main() diff --git a/trunk/psycopg2/tests/types_basic.py b/trunk/psycopg2/tests/types_basic.py new file mode 100644 index 0000000..446ad15 --- /dev/null +++ b/trunk/psycopg2/tests/types_basic.py @@ -0,0 +1,87 @@ +# types_basic.py - tests for basic types conversions +# +# Copyright (C) 2004 Federico Di Gregorio +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. + +import sys +try: + import decimal +except: + pass +import psycopg2 +from unittest import TestCase, TestSuite, main + + +class TypesBasicTests(TestCase): + """Test presence of mandatory attributes and methods.""" + + def setUp(self): + self.conn = psycopg2.connect("dbname=test") + + def execute(self, *args): + curs = self.conn.cursor() + curs.execute(*args) + return curs.fetchone()[0] + + def testQuoting(self): + s = "Quote'this\\! ''ok?''" + self.failUnless(self.execute("SELECT %s AS foo", (s,)) == s, + "wrong quoting: " + s) + + def testUnicode(self): + s = u"Quote'this\\! ''ok?''" + self.failUnless(self.execute("SELECT %s AS foo", (s,)) == s, + "wrong unicode quoting: " + s) + + def testNumber(self): + s = self.execute("SELECT %s AS foo", (1971,)) + self.failUnless(s == 1971, "wrong integer quoting: " + str(s)) + s = self.execute("SELECT %s AS foo", (1971L,)) + self.failUnless(s == 1971L, "wrong integer quoting: " + str(s)) + # Python 2.4 defaults to Decimal? + if sys.version_info[0] >= 2 and sys.version_info[1] >= 4: + s = self.execute("SELECT %s AS foo", (19.10,)) + self.failUnless(s - decimal.Decimal("19.10") == 0, + "wrong decimal quoting: " + str(s)) + else: + s = self.execute("SELECT %s AS foo", (19.10,)) + self.failUnless(abs(s - 19.10) < 0.001, + "wrong float quoting: " + str(s)) + + def testBinary(self): + s = ''.join([chr(x) for x in range(256)]) + b = psycopg2.Binary(s) + r = str(self.execute("SELECT %s::bytea AS foo", (b,))) + self.failUnless(r == s, "wrong binary quoting") + # test to make sure an empty Binary is converted to an empty string + b = psycopg2.Binary('') + self.assertEqual(str(b), "''") + + def testArray(self): + s = self.execute("SELECT %s AS foo", ([[1,2],[3,4]],)) + self.failUnless(s == [[1,2],[3,4]], "wrong array quoting " + str(s)) + s = self.execute("SELECT %s AS foo", (['one', 'two', 'three'],)) + self.failUnless(s == ['one', 'two', 'three'], + "wrong array quoting " + str(s)) + + +class TypesBasicSuite(TestSuite): + """Build a suite of all tests.""" + + def __init__(self): + """Build a list of tests.""" + self.tests = [x for x in dir(TypesBasicTests) if x.startswith('test')] + TestSuite.__init__(self, map(TestModule, self.tests)) + + +if __name__ == "__main__": + main() diff --git a/trunk/pycurl/COPYING b/trunk/pycurl/COPYING new file mode 100644 index 0000000..99dce33 --- /dev/null +++ b/trunk/pycurl/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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! + + diff --git a/trunk/pycurl/ChangeLog b/trunk/pycurl/ChangeLog new file mode 100644 index 0000000..0e5ae7e --- /dev/null +++ b/trunk/pycurl/ChangeLog @@ -0,0 +1,759 @@ +Version 7.13.1 [requires libcurl-7.13.1 or better] +-------------- + +2005-03-04 Kjetil Jacobsen + + * Use METH_NOARGS where appropriate. + +2005-03-03 Kjetil Jacobsen + + * Added support for CURLFORM API with HTTPPOST: Supports a + a tuple with pairs of options and values instead of just + supporting string contents. See tests/test_post2.py + for example usage. Options are FORM_CONTENTS, FORM_FILE and + FORM_CONTENTTYPE, corresponding to the CURLFORM_* options, + and values are strings. + +2005-02-13 Markus F.X.J. Oberhumer + + * Read callbacks (pycurl.READFUNCTION) can now return + pycurl.READFUNC_ABORT to immediately abort the current transfer. + + * The INFILESIZE, MAXFILESIZE, POSTFIELDSIZE and RESUME_FROM + options now automatically use the largefile version to handle + files > 2GB. + + * Added missing pycurl.PORT constant. + + +Version 7.13.0 +-------------- + +2005-02-10 Kjetil Jacobsen + + * Added file_upload.py to examples, shows how to upload + a file. + + * Added CURLOPT_IOCTLFUNCTION/DATA. + + * Added options from libcurl 7.13.0: FTP_ACCOUNT, SOURCE_URL, + SOURCE_QUOTE. + + * Obsoleted options: SOURCE_HOST, SOURCE_PATH, SOURCE_PORT, + PASV_HOST. + + +Version 7.12.3 +-------------- + +2004-12-22 Markus F.X.J. Oberhumer + + * Added CURLINFO_NUM_CONNECTS and CURLINFO_SSL_ENGINES. + + * Added some other missing constants. + + * Updated pycurl.version_info() to return a 12-tuple + instead of a 9-tuple. + + +Version 7.12.2 +-------------- + +2004-10-15 Kjetil Jacobsen + + * Added CURLOPT_FTPSSLAUTH (and CURLFTPAUTH_*). + + * Added CURLINFO_OS_ERRNO. + +2004-08-17 Kjetil Jacobsen + + * Use LONG_LONG instead of PY_LONG_LONG to make pycurl compile + on Python versions < 2.3 (fix from Domenico Andreoli + ). + + +Version 7.12.1 +-------------- + +2004-08-02 Kjetil Jacobsen + + * Added INFOTYPE_SSL_DATA_IN/OUT. + +2004-07-16 Markus F.X.J. Oberhumer + + * WARNING: removed deprecated PROXY_, TIMECOND_ and non-prefixed + INFOTYPE constant names. See ChangeLog entry 2003-06-10. + +2004-06-21 Kjetil Jacobsen + + * Added test program for HTTP post using the read callback (see + tests/test_post3.py for details). + + * Use the new CURL_READFUNC_ABORT return code where appropriate + to avoid hanging in perform() when read callbacks are used. + + * Added support for libcurl 7.12.1 CURLOPT features: + SOURCE_HOST, SOURCE_USERPWD, SOURCE_PATH, SOURCE_PORT, + PASV_HOST, SOURCE_PREQUOTE, SOURCE_POSTQUOTE. + +2004-06-08 Markus F.X.J. Oberhumer + + * Setting CURLOPT_POSTFIELDS now allows binary data and + automatically sets CURLOPT_POSTFIELDSIZE for you. If you really + want a different size you have to manually set POSTFIELDSIZE + after setting POSTFIELDS. + (Based on a patch by Martin Muenstermann). + +2004-06-05 Markus F.X.J. Oberhumer + + * Added stricter checks within the callback handlers. + + * Unify the behaviour of int and long parameters where appropriate. + + +Version 7.12 +------------ + +2004-05-18 Kjetil Jacobsen + + * WARNING: To simplify code maintenance pycurl now requires + libcurl 7.11.2 and Python 2.2 or newer to work. + + * GC support is now always enabled. + + +Version 7.11.3 +-------------- + +2004-04-30 Kjetil Jacobsen + + * Do not use the deprecated curl_formparse function. + API CHANGE: HTTPPOST now takes a list of tuples where each + tuple contains a form name and a form value, both strings + (see test/test_post2.py for example usage). + + * Found a possible reference count bug in the multithreading + code which may have contributed to the long-standing GC + segfault which has haunted pycurl. Fingers crossed. + + +Version 7.11.2 +-------------- + +2004-04-21 Kjetil Jacobsen + + * Added support for libcurl 7.11.2 CURLOPT features: + CURLOPT_TCP_NODELAY. + +2004-03-25 Kjetil Jacobsen + + * Store Python longs in off_t with PyLong_AsLongLong instead + of PyLong_AsLong. Should make the options which deal + with large files behave a little better. Note that this + requires the long long support in Python 2.2 or newer to + work properly. + + +Version 7.11.1 +-------------- + +2004-03-16 Kjetil Jacobsen + + * WARNING: Removed support for the PASSWDFUNCTION callback, which + is no longer supported by libcurl. + +2004-03-15 Kjetil Jacobsen + + * Added support for libcurl 7.11.1 CURLOPT features: + CURLOPT_POSTFIELDSIZE_LARGE. + + +Version 7.11.0 +-------------- + +2004-02-11 Kjetil Jacobsen + + * Added support for libcurl 7.11.0 CURLOPT features: + INFILESIZE_LARGE, RESUME_FROM_LARGE, MAXFILESIZE_LARGE + and FTP_SSL. + + * Circular garbage collection support can now be enabled or + disabled by passing the '--use-gc=[1|0]' parameter to setup.py + when building pycurl. + + * HTTP_VERSION options are known as CURL_HTTP_VERSION_NONE, + CURL_HTTP_VERSION_1_0, CURL_HTTP_VERSION_1_1 and + CURL_HTTP_VERSION_LAST. + +2003-11-16 Markus F.X.J. Oberhumer + + * Added support for these new libcurl 7.11.0 features: + CURLOPT_NETRC_FILE. + + +Version 7.10.8 +-------------- + +2003-11-04 Markus F.X.J. Oberhumer + + * Added support for these new libcurl 7.10.8 features: + CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOPT_IPRESOLVE, + CURLOPT_MAXFILESIZE, + CURLINFO_HTTPAUTH_AVAIL, CURLINFO_PROXYAUTH_AVAIL, + CURL_IPRESOLVE_* constants. + + * Added support for these new libcurl 7.10.7 features: + CURLOPT_FTP_CREATE_MISSING_DIRS, CURLOPT_PROXYAUTH, + CURLINFO_HTTP_CONNECTCODE. + + +2003-10-28 Kjetil Jacobsen + + * Added missing CURLOPT_ENCODING option (patch by Martijn + Boerwinkel ) + + +Version 7.10.6 +-------------- + +2003-07-29 Markus F.X.J. Oberhumer + + * Started working on support for CURLOPT_SSL_CTX_FUNCTION and + CURLOPT_SSL_CTX_DATA (libcurl-7.10.6) - not yet finished. + +2003-06-10 Markus F.X.J. Oberhumer + + * Added support for CURLOPT_HTTPAUTH (libcurl-7.10.6), including + the new HTTPAUTH_BASIC, HTTPAUTH_DIGEST, HTTPAUTH_GSSNEGOTIATE + and HTTPAUTH_NTML constants. + + * Some constants were renamed for consistency: + + All curl_infotype constants are now prefixed with "INFOTYPE_", + all curl_proxytype constants are prefixed with "PROXYTYPE_" instead + of "PROXY_", and all curl_TimeCond constants are now prefixed + with "TIMECONDITION_" instead of "TIMECOND_". + + (The old names are still available but will get removed + in a future release.) + + * WARNING: Removed the deprecated pycurl.init() and pycurl.multi_init() + names - use pycurl.Curl() and pycurl.CurlMulti() instead. + + * WARNING: Removed the deprecated Curl.cleanup() and + CurlMulti.cleanup() methods - use Curl.close() and + CurlMulti.close() instead. + + +Version 7.10.5 +-------------- + +2003-05-15 Markus F.X.J. Oberhumer + + * Added support for CURLOPT_FTP_USE_EPRT (libcurl-7.10.5). + + * Documentation updates. + +2003-05-07 Eric S. Raymond + + * Lifted all HTML docs to clean XHTML, verified by tidy. + +2003-05-02 Markus F.X.J. Oberhumer + + * Fixed some `int' vs. `long' mismatches that affected 64-bit systems. + + * Fixed wrong pycurl.CAPATH constant. + +2003-05-01 Markus F.X.J. Oberhumer + + * Added new method Curl.errstr() which returns the internal + libcurl error buffer string of the handle. + + +Version 7.10.4.2 +---------------- + +2003-04-15 Markus F.X.J. Oberhumer + + * Allow compilation against the libcurl-7.10.3 release - some + recent Linux distributions (e.g. Mandrake 9.1) ship with 7.10.3, + and apart from the new CURLOPT_UNRESTRICTED_AUTH option there is + no need that we require libcurl-7.10.4. + + +Version 7.10.4 +-------------- + +2003-04-01 Kjetil Jacobsen + + * Markus added CURLOPT_UNRESTRICTED_AUTH (libcurl-7.10.4). + +2003-02-25 Kjetil Jacobsen + + * Fixed some broken test code and removed the fileupload test + since it didn't work properly. + +2003-01-28 Kjetil Jacobsen + + * Some documentation updates by Markus and me. + +2003-01-22 Kjetil Jacobsen + + * API CHANGE: the CurlMulti.info_read() method now returns + a separate array with handles that failed. Each entry in this array + is a tuple with (curl object, error number, error message). + This addition makes it simpler to do error checking of individual + curl objects when using the multi interface. + + +Version 7.10.3 +-------------- + +2003-01-13 Kjetil Jacobsen + + * PycURL memory usage has been reduced. + +2003-01-10 Kjetil Jacobsen + + * Added 'examples/retriever-multi.py' which shows how to retrieve + a set of URLs concurrently using the multi interface. + +2003-01-09 Kjetil Jacobsen + + * Added support for CURLOPT_HTTP200ALIASES. + +2002-11-22 Kjetil Jacobsen + + * Updated pycurl documentation in the 'doc' directory. + +2002-11-21 Kjetil Jacobsen + + * Updated and improved 'examples/curl.py'. + + * Added 'tests/test_multi6.py' which shows how to use the + info_read method with CurlMulti. + +2002-11-19 Kjetil Jacobsen + + * Added new method CurlMulti.info_read(). + + +Version 7.10.2 +-------------- + +2002-11-14 Kjetil Jacobsen + + * Free options set with setopt after cleanup is called, as cleanup + assumes that options are still valid when invoked. This fixes the + bug with COOKIEJAR reported by Bastiaan Naber + . + +2002-11-06 Markus F.X.J. Oberhumer + + * Install documentation under /usr/share/doc instead of /usr/doc. + Also, start shipping the (unfinished) HTML docs and some + basic test scripts. + +2002-10-30 Markus F.X.J. Oberhumer + + * API CHANGE: For integral values, Curl.getinfo() now returns a + Python-int instead of a Python-long. + + +Version 7.10.1 +-------------- + +2002-10-03 Markus F.X.J. Oberhumer + + * Added new module-level function version_info() from + libcurl-7.10. + + +Version 7.10 +------------ + +2002-09-13 Kjetil Jacobsen + + * Added commandline options to setup.py for specifying the path to + 'curl-config' (non-windows) and the curl installation directory + (windows). See the 'INSTALL' file for details. + + * Added CURLOPT_ENCODING, CURLOPT_NOSIGNAL and CURLOPT_BUFFERSIZE + from libcurl-7.10 (by Markus Oberhumer). + + +Version 7.9.8.4 +--------------- + +2002-08-28 Kjetil Jacobsen + + * Added a simple web-browser example based on gtkhtml and pycurl. + See the file 'examples/gtkhtml_demo.py' for details. The example + requires a working installation of gnome-python with gtkhtml + bindings enabled (pass --with-gtkhtml to gnome-python configure). + +2002-08-14 Kjetil Jacobsen + + * Added new method 'select' on CurlMulti objects. Example usage + in 'tests/test_multi5.py'. This method is just an optimization of + the combined use of fdset and select. + +2002-08-12 Kjetil Jacobsen + + * Added support for curl_multi_fdset. See the file + 'tests/test_multi4.py' for example usage. Contributed by Conrad + Steenberg . + + * perform() on multi objects now returns a tuple (result, number + of handles) like the libcurl interface does. + +2002-08-08 Kjetil Jacobsen + + * Added the 'sfquery' script which retrieves a SourceForge XML + export object for a given project. See the file 'examples/sfquery.py' + for details and usage. 'sfquery' was contributed by Eric + S. Raymond . + +2002-07-20 Markus F.X.J. Oberhumer + + * API enhancements: added Curl() and CurlMulti() as aliases for + init() and multi_init(), and added close() methods as aliases + for the cleanup() methods. The new names much better match + the actual intended use of the objects, and they also nicely + correspond to Python's file object. + + * Also, all constants for Curl.setopt() and Curl.getinfo() are now + visible from within Curl objects. + + All changes are fully backward-compatible. + + +Version 7.9.8.3 +--------------- + +2002-07-16 Markus F.X.J. Oberhumer + + * Under Python 2.2 or better, Curl and CurlMulti objects now + automatically participate in cyclic garbarge collection + (using the gc module). + + +Version 7.9.8.2 +--------------- + +2002-07-05 Markus F.X.J. Oberhumer + + * Curl and CurlMulti objects now support standard Python attributes. + See tests/test_multi2.py for an example. + +2002-07-02 Kjetil Jacobsen + + * Added support for the multi-interface. + + +Version 7.9.8.1 +--------------- + +2002-06-25 Markus F.X.J. Oberhumer + + * Fixed a couple of `int' vs. `size_t' mismatches in callbacks + and Py_BuildValue() calls. + +2002-06-25 Kjetil Jacobsen + + * Use 'double' type instead of 'size_t' for progress callbacks + (by Conrad Steenberg ). Also cleaned up + some other type mismatches in the callback interfaces. + +2002-06-24 Kjetil Jacobsen + + * Added example code on how to upload a file using HTTPPOST in + pycurl (code by Amit Mongia ). See the + file 'test_fileupload.py' for details. + + +Version 7.9.8 +------------- + +2002-06-24 Kjetil Jacobsen + + * Resolved some build problems on Windows (by Markus Oberhumer). + +2002-06-19 Kjetil Jacobsen + + * Added CURLOPT_CAPATH. + + * Added option constants for CURLOPT_NETRC: CURL_NETRC_OPTIONAL, + CURL_NETRC_IGNORED and CURL_NETRC_REQUIRED. + + * Added option constants for CURLOPT_TIMECONDITION: + TIMECOND_IFMODSINCE and TIMECOND_IFUNMODSINCE. + + * Added an simple example crawler, which downloads documents + listed in a file with a configurable number of worker threads. + See the file 'crawler.py' in the 'tests' directory for details. + + * Removed the redundant 'test_xmlrpc2.py' test script. + + * Disallow recursive callback invocations (by Markus Oberhumer). + +2002-06-18 Kjetil Jacobsen + + * Made some changes to setup.py which should fix the build + problems on RedHat 7.3 (suggested by Benji ). + + * Use CURLOPT_READDATA instead of CURLOPT_INFILE, and + CURLOPT_WRITEDATA instead of CURLOPT_FILE. Also fixed some + reference counting bugs with file objects. + + * CURLOPT_FILETIME and CURLINFO_FILETIME had a namespace clash + which caused them not to work. Use OPT_FILETIME for setopt() and + INFO_FILETIME for getinfo(). See example usage in + 'test_getinfo.py' for details. + + +Version 7.9.7 +------------- + +2002-05-20 Kjetil Jacobsen + + * New versioning scheme. Pycurl now has the same version number + as the libcurl version it was built with. The pycurl version + number thus indicates which version of libcurl is required to run. + +2002-05-17 Kjetil Jacobsen + + * Added CURLINFO_REDIRECT_TIME and CURLINFO_REDIRECT_COUNT. + +2002-04-27 Kjetil Jacobsen + + * Fixed potential memory leak and thread race (by Markus + Oberhumer). + + +Version 0.4.9 +------------- + +2002-04-15 Kjetil Jacobsen + + * Added CURLOPT_DEBUGFUNCTION to allow debug callbacks to be + specified (see the file 'test_debug.py' for details on how to use + debug callbacks). + + * Added CURLOPT_DNS_USE_GLOBAL_CACHE and + CURLOPT_DNS_CACHE_TIMEOUT. + + * Fixed a segfault when finalizing curl objects in Python 1.5.2. + + * Now requires libcurl 7.9.6 or greater. + +2002-04-12 Kjetil Jacobsen + + * Added 'test_post2.py' file which is another example on how to + issue POST requests. + +2002-04-11 Markus F.X.J. Oberhumer + + * Added the 'test_post.py' file which demonstrates the use of + POST requests. + + +Version 0.4.8 +------------- + +2002-03-07 Kjetil Jacobsen + + * Added CURLOPT_PREQUOTE. + + * Now requires libcurl 7.9.5 or greater. + + * Other minor code cleanups and bugfixes. + +2002-03-05 Kjetil Jacobsen + + * Do not allow WRITEFUNCTION and WRITEHEADER on the same handle. + + +Version 0.4.7 +------------- + +2002-02-27 Kjetil Jacobsen + + * Abort callback if the thread state of the calling thread cannot + be determined. + + * Check that the installed version of libcurl matches the + requirements of pycurl. + +2002-02-26 Kjetil Jacobsen + + * Clarence Garnder found a bug where string + arguments to setopt sometimes were prematurely deallocated, this + should now be fixed. + +2002-02-21 Kjetil Jacobsen + + * Added the 'xmlrpc_curl.py' file which implements a transport + for xmlrpclib (xmlrpclib is part of Python 2.2). + + * Added CURLINFO_CONTENT_TYPE. + + * Added CURLOPT_SSLCERTTYPE, CURLOPT_SSLKEY, CURLOPT_SSLKEYTYPE, + CURLOPT_SSLKEYPASSWD, CURLOPT_SSLENGINE and + CURLOPT_SSLENGINE_DEFAULT. + + * When thrown, the pycurl.error exception is now a tuple consisting + of the curl error code and the error message. + + * Now requires libcurl 7.9.4 or greater. + +2002-02-19 Kjetil Jacobsen + + * Fixed docstring for getopt() function. + +2001-12-18 Kjetil Jacobsen + + * Updated the INSTALL information for Win32. + +2001-12-12 Kjetil Jacobsen + + * Added missing link flag to make pycurl build on MacOS X (by Matt + King ). + +2001-12-06 Kjetil Jacobsen + + * Added CURLINFO_STARTTRANSFER_TIME and CURLOPT_FTP_USE_EPSV from + libcurl 7.9.2. + +2001-12-01 Markus F.X.J. Oberhumer + + * Added the 'test_stringio.py' file which demonstrates the use of + StringIO objects as callback. + +2001-12-01 Markus F.X.J. Oberhumer + + * setup.py: Do not remove entries from a list while iterating + over it. + +2001-11-29 Kjetil Jacobsen + + * Added code in setup.py to install on Windows. Requires some + manual configuration (by Tino Lange ). + +2001-11-27 Kjetil Jacobsen + + * Improved detection of where libcurl is installed in setup.py. + Should make it easier to install pycurl when libcurl is not + located in regular lib/include paths. + +2001-11-05 Kjetil Jacobsen + + * Some of the newer options to setopt were missing, this should + now be fixed. + +2001-11-04 Kjetil Jacobsen + + * Exception handling has been improved and should no longer throw + spurious exceptions (by Markus F.X.J. Oberhumer + ). + +2001-10-15 Kjetil Jacobsen + + * Refactored the test_gtk.py script to avoid global variables. + +2001-10-12 Kjetil Jacobsen + + * Added module docstrings, terse perhaps, but better than nothing. + + * Added the 'basicfirst.py' file which is a Python version of the + corresponding Perl script by Daniel. + + * PycURL now works properly under Python 1.5 and 1.6 (by Markus + F.X.J. Oberhumer ). + + * Allow C-functions and Python methods as callbacks (by Markus + F.X.J. Oberhumer ). + + * Allow None as success result of write, header and progress + callback invocations (by Markus F.X.J. Oberhumer + ). + + * Added the 'basicfirst2.py' file which demonstrates the use of a + class method as callback instead of just a function. + +2001-08-21 Kjetil Jacobsen + + * Cleaned up the script with GNOME/PycURL integration. + +2001-08-20 Kjetil Jacobsen + + * Added another test script for shipping XML-RPC requests which + uses py-xmlrpc to encode the arguments (tests/test_xmlrpc2.py). + +2001-08-20 Kjetil Jacobsen + + * Added test script for using PycURL and GNOME (tests/test_gtk.py). + +2001-08-20 Kjetil Jacobsen + + * Added test script for using XML-RPC (tests/test_xmlrpc.py). + + * Added more comments to the test sources. + +2001-08-06 Kjetil Jacobsen + + * Renamed module namespace to pycurl instead of curl. + +2001-08-06 Kjetil Jacobsen + + * Set CURLOPT_VERBOSE to 0 by default. + +2001-06-29 Kjetil Jacobsen + + * Updated INSTALL, curl version 7.8 or greater is now mandatory to + use pycurl. + +2001-06-13 Kjetil Jacobsen + + * Set NOPROGRESS to 1 by default. + +2001-06-07 Kjetil Jacobsen + + * Added global_init/cleanup. + +2001-06-06 Kjetil Jacobsen + + * Added HEADER/PROGRESSFUNCTION callbacks (see files in tests/). + + * Added PASSWDFUNCTION callback (untested). + + * Added READFUNCTION callback (untested). + +2001-06-05 Kjetil Jacobsen + + * WRITEFUNCTION callbacks now work (see tests/test_cb.py for details). + + * Preliminary distutils installation. + + * Added CLOSEPOLICY constants to module namespace. + +2001-06-04 Kjetil Jacobsen + + * Return -1 on error from Python callback in WRITEFUNCTION callback. + +2001-06-01 Kjetil Jacobsen + + * Moved source to src and tests to tests directory. + +2001-05-31 Kjetil Jacobsen + + * Added better type checking for setopt. + +2001-05-30 Kjetil Jacobsen + + * Moved code to sourceforge. + + * Added getinfo support. + + +# vi:ts=8:et diff --git a/trunk/pycurl/INSTALL b/trunk/pycurl/INSTALL new file mode 100644 index 0000000..ef42cf6 --- /dev/null +++ b/trunk/pycurl/INSTALL @@ -0,0 +1,44 @@ +NOTE: You need Python and libcurl installed on your system to use or +build pycurl. Some RPM distributions of curl/libcurl do not include +everything necessary to build pycurl, in which case you need to +install the developer specific RPM which is usually called curl-dev. + + +Distutils +--------- + +Assuming that distutils is installed (which it is by default on Python +versions greater than 1.5.2) build and install pycurl with the +following commands: + + (if necessary, become root) + tar -zxvf pycurl-$VER.tar.gz + cd pycurl-$VER + python setup.py install + +$VER should be substituted with the version number, e.g. 7.10.5. + +Note that the installation script assumes that 'curl-config' can be +located in your path setting. If curl-config is installed outside +your path or you want to force installation to use a particular +version of curl-config, use the '--curl-config' commandline option to +specify the location of curl-config. Example: + + python setup.py install --curl-config=/usr/local/bin/curl-config + +If libcurl is linked dynamically with pycurl, you may have to alter the +LD_LIBRARY_PATH environment variable accordingly. This normally +applies only if there is more than one version of libcurl installed, +e.g. one in /usr/lib and one in /usr/local/lib. + + +Windows +------- + +When installing on Windows, you need to manually configure the path to +the curl source tree, specified with the CURL_DIR variable in the file +'setup.py'. The CURL_DIR variable can also be set using the +commandline option '--curl-dir' when invoking setup.py: + + python setup.py install --curl-dir=c:\curl-7.10.5 + diff --git a/trunk/pycurl/MANIFEST.in b/trunk/pycurl/MANIFEST.in new file mode 100644 index 0000000..f4e3837 --- /dev/null +++ b/trunk/pycurl/MANIFEST.in @@ -0,0 +1,22 @@ +# +# MANIFEST.in +# Manifest template for creating the source distribution. +# + +include ChangeLog +include COPYING +include INSTALL +include Makefile +include README +include TODO +include MANIFEST.in +include src/Makefile +include src/pycurl.c +include python/curl/*.py +include examples/*.py +include tests/*.py +include doc/*.html +include setup_win32_ssl.py + +# exclude unfinished test scripts +#exclude tests/test_multi_vs_thread.py diff --git a/trunk/pycurl/Makefile b/trunk/pycurl/Makefile new file mode 100644 index 0000000..9b2369d --- /dev/null +++ b/trunk/pycurl/Makefile @@ -0,0 +1,60 @@ +# +# to use a specific python version call +# `make PYTHON=python2.2' +# + +SHELL = /bin/sh + +PYTHON = python2.3 +PYTHON = python + +all build: + $(PYTHON) setup.py build + +build-7.10.8: + $(PYTHON) setup.py build --curl-config=/home/hosts/localhost/packages/curl-7.10.8/bin/curl-config + +test: build + $(PYTHON) tests/test_internals.py -q + +# (needs GNU binutils) +strip: build + strip -p --strip-unneeded build/lib*/*.so + chmod -x build/lib*/*.so + +install install_lib: + $(PYTHON) setup.py $@ + +clean: + -rm -rf build dist + -rm -f *.pyc *.pyo */*.pyc */*.pyo */*/*.pyc */*/*.pyo + -rm -f MANIFEST + cd src && $(MAKE) clean + +distclean: clean + +maintainer-clean: distclean + +dist sdist: distclean + $(PYTHON) setup.py sdist + +# target for maintainer +windist: distclean + rm -rf build + python2.2 setup.py bdist_wininst + rm -rf build + python2.3 setup.py bdist_wininst + rm -rf build + python2.4 setup.py bdist_wininst + rm -rf build + python2.2 setup_win32_ssl.py bdist_wininst + rm -rf build + python2.3 setup_win32_ssl.py bdist_wininst + rm -rf build + python2.4 setup_win32_ssl.py bdist_wininst + rm -rf build + + +.PHONY: all build test strip install install_lib clean distclean maintainer-clean dist sdist windist + +.NOEXPORT: diff --git a/trunk/pycurl/PKG-INFO b/trunk/pycurl/PKG-INFO new file mode 100644 index 0000000..f0c0e97 --- /dev/null +++ b/trunk/pycurl/PKG-INFO @@ -0,0 +1,11 @@ +Metadata-Version: 1.0 +Name: pycurl +Version: 7.13.1 +Summary: PycURL -- cURL library module for Python +Home-page: http://pycurl.sourceforge.net/ +Author: Kjetil Jacobsen, Markus F.X.J. Oberhumer +Author-email: kjetilja@cs.uit.no, markus@oberhumer.com +License: GNU Lesser General Public License (LGPL) +Description: + This module provides Python bindings for the cURL library. +Platform: All diff --git a/trunk/pycurl/README b/trunk/pycurl/README new file mode 100644 index 0000000..bd04ab6 --- /dev/null +++ b/trunk/pycurl/README @@ -0,0 +1,12 @@ +LICENSE +------- + +Copyright (C) 2001-2005 by Kjetil Jacobsen +Copyright (C) 2001-2005 by Markus F.X.J. Oberhumer + +PycURL 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. + +A full copy of the LGPL license is included in the file COPYING. diff --git a/trunk/pycurl/TODO b/trunk/pycurl/TODO new file mode 100644 index 0000000..ed4afdf --- /dev/null +++ b/trunk/pycurl/TODO @@ -0,0 +1,27 @@ +# $Id$ +# vi:ts=4:et + +If you want to hack on pycurl, here's our list of unresolved issues: + + +NEW FEATURES/IMPROVEMENTS: + + * Add docs to the high-level interface. + + * Add more options to the undocumented and currently mostly useless + Curl.unsetopt() method. Have to carefully check the libcurl source + code for each option we want to support. + + * curl_easy_reset() should probably be supported. But we have to be + careful since curl_easy_reset() e.g. modifies callbacks and other + pointers which could leave pycurl and libcurl out of sync. + + +DEFICIENICES: + + * Using certain invalid options, it may be possible to cause a crash. + This is un-Pythonic behaviour, but you somewhere have to draw a line + between efficiency (and feature completeness) and safety. + There _are_ quite a number of internal error checks, but tracking and + catching all possible (deliberate) misuses is not a goal (and probably + impossible anyway, due to the complexity of libcurl). diff --git a/trunk/pycurl/doc/callbacks.html b/trunk/pycurl/doc/callbacks.html new file mode 100644 index 0000000..b98e0a9 --- /dev/null +++ b/trunk/pycurl/doc/callbacks.html @@ -0,0 +1,140 @@ + + + + + PyCurl: Callbacks + + + + + + +

Callbacks

+ +

For more fine-grained control, libcurl allows a +number of callbacks to be associated with each connection. In +pycurl, callbacks are defined using the setopt() method for +Curl objects with options WRITEFUNCTION, READFUNCTION, HEADERFUNCTION, +PROGRESSFUNCTION, IOCTLFUNCTION, or DEBUGFUNCTION. These options +correspond to the libcurl options with CURLOPT_* prefix removed. A +callback in pycurl must be either a regular Python function, a class +method or an extension type function.

+ +

There are some limitations to some of the options which can be used +concurrently with the pycurl callbacks compared to the libcurl callbacks. +This is to allow different callback functions to be associated with +different Curl objects. More specifically, WRITEDATA cannot +be used with WRITEFUNCTION, READDATA cannot be used with READFUNCTION, +WRITEHEADER cannot be used with HEADERFUNCTION, PROGRESSDATA cannot be +used with PROGRESSFUNCTION, IOCTLDATA cannot be used with IOCTLFUNCTION, +and DEBUGDATA cannot be used with DEBUGFUNCTION. +In practice, these limitations can be overcome by having a callback +function be a class instance method and rather use the class instance +attributes to store per object data such as files used in the callbacks. +

+ +The signature of each callback used in pycurl is as follows:
+
+WRITEFUNCTION(string) -> number of characters written
+
+
+READFUNCTION(number of characters to read)-> +string
+
+HEADERFUNCTION(string) -> number of characters written
+

+PROGRESSFUNCTION(download total, downloaded, upload total, uploaded) -> status
+
+DEBUGFUNCTION(debug message type, debug message string) +-> None
+
+IOCTLFUNCTION(ioctl cmd) +-> status
+
+
+ +

Example: Callbacks for document header and body

+ +

This example prints the header data to stderr and the body data to +stdout. Also note that neither callback returns the number of bytes +written. For WRITEFUNCTION and HEADERFUNCTION callbacks, returning +None implies that all bytes where written.

+ +
+    ## Callback function invoked when body data is ready
+    def body(buf):
+        # Print body data to stdout
+        import sys
+        sys.stdout.write(buf)
+        # Returning None implies that all bytes were written
+
+    ## Callback function invoked when header data is ready
+    def header(buf):
+        # Print header data to stderr
+        import sys
+        sys.stderr.write(buf)
+        # Returning None implies that all bytes were written
+
+    c = pycurl.Curl()
+    c.setopt(pycurl.URL, "http://www.python.org/")
+    c.setopt(pycurl.WRITEFUNCTION, body)
+    c.setopt(pycurl.HEADERFUNCTION, header)
+    c.perform()
+
+ +

Example: Download/upload progress callback

+ +

This example shows how to use the progress callback. When downloading +a document, the arguments related to uploads are zero, and vice versa.

+ +
+    ## Callback function invoked when download/upload has progress
+    def progress(download_t, download_d, upload_t, upload_d):
+        print "Total to download", download_t
+        print "Total downloaded", download_d
+        print "Total to upload", upload_t
+        print "Total uploaded", upload_d
+
+    c.setopt(c.URL, "http://slashdot.org/")
+    c.setopt(c.NOPROGRESS, 0)
+    c.setopt(c.PROGRESSFUNCTION, progress)
+    c.perform()
+
+ +

Example: Debug callbacks

+ +

This example shows how to use the debug callback. The debug message +type is an integer indicating the type of debug message. The +VERBOSE option must be enabled for this callback to be invoked.

+ +
+    def test(debug_type, debug_msg):
+        print "debug(%d): %s" % (debug_type, debug_msg)
+
+    c = pycurl.Curl()
+    c.setopt(pycurl.URL, "http://curl.haxx.se/")
+    c.setopt(pycurl.VERBOSE, 1)
+    c.setopt(pycurl.DEBUGFUNCTION, test)
+    c.perform()
+
+ +

Other examples

+The pycurl distribution also contains a number of test scripts and +examples which show how to use the various callbacks in libcurl. +For instance, the file 'examples/file_upload.py' in the distribution contains +example code for using READFUNCTION, 'tests/test_cb.py' shows +WRITEFUNCTION and HEADERFUNCTION, 'tests/test_debug.py' shows DEBUGFUNCTION, +and 'tests/test_getinfo.py' shows PROGRESSFUNCTION.

+ + +
+

+ Valid XHTML 1.0! + $Id$ +

+ + + diff --git a/trunk/pycurl/doc/curlmultiobject.html b/trunk/pycurl/doc/curlmultiobject.html new file mode 100644 index 0000000..f944b18 --- /dev/null +++ b/trunk/pycurl/doc/curlmultiobject.html @@ -0,0 +1,136 @@ + + + + + PycURL: CurlMulti Objects + + + + + + +

CurlMulti Object

+ +

CurlMulti objects have the following methods:

+ +
+
close() -> None
+
+

Corresponds to +curl_multi_cleanup() in libcurl. +This method is automatically called by pycurl when a CurlMulti object no +longer has any references to it, but can also be called +explicitly.

+
+ +
perform() -> tuple of status and the number of active Curl objects
+
+

Corresponds to +curl_multi_perform() in libcurl.

+
+ +
add_handle(Curl object) -> None
+
+

Corresponds to +curl_multi_add_handle() in libcurl. +This method adds an existing and valid Curl object to the CurlMulti +object.

+ +

IMPORTANT NOTE: add_handle does not implicitly add a Python reference +to the Curl object (and thus does not increase the reference count on the Curl +object).

+
+ +
remove_handle(Curl object) -> None
+
+

Corresponds to +curl_multi_remove_handle() in libcurl. +This method removes an existing and valid Curl object from the CurlMulti +object.

+ +

IMPORTANT NOTE: remove_handle does not implicitly remove a Python reference +from the Curl object (and thus does not decrease the reference count on the Curl +object).

+
+ +
fdset() -> +triple of lists with active file descriptors, +readable, writeable, exceptions.
+
+

Corresponds to +curl_multi_fdset() in libcurl. +This method extracts the file descriptor information from a CurlMulti object. +The returned lists can be used with the select module to +poll for events.

+ +

Example usage:

+ +
+import pycurl
+c = pycurl.Curl()
+c.setopt(pycurl.URL, "http://curl.haxx.se")
+m = pycurl.CurlMulti()
+m.add_handle(c)
+while 1:
+    ret, num_handles = m.perform()
+    if ret != pycurl.E_CALL_MULTI_PERFORM: break
+while num_handles:
+    apply(select.select, m.fdset() + (1,))
+    while 1:
+        ret, num_handles = m.perform()
+        if ret != pycurl.E_CALL_MULTI_PERFORM: break
+
+
+ +
select([timeout]) -> +number of ready file descriptors or -1 on timeout
+
+

This is a convenience function which simplifies the combined +use of fdset() and the select module.

+ +

Example usage:

+ +
import pycurl
+c = pycurl.Curl()
+c.setopt(pycurl.URL, "http://curl.haxx.se")
+m = pycurl.CurlMulti()
+m.add_handle(c)
+while 1:
+    ret, num_handles = m.perform()
+    if ret != pycurl.E_CALL_MULTI_PERFORM: break
+while num_handles:
+    ret = m.select()
+    if ret == -1:  continue
+    while 1:
+        ret, num_handles = m.perform()
+        if ret != pycurl.E_CALL_MULTI_PERFORM: break
+
+
+ +
info_read([max]) -> +numberof queued messages, a list of successful objects, a list of +failed objects
+
+

Corresponds to the +curl_multi_info_read() function in libcurl. +This method extracts at most max messages +from the multi stack and returns them in two lists. The first +list contains the handles which completed successfully and the second +list contains a tuple <curl object, curl error number, curl +error message> for each failed curl object. The number +of queued messages after this method has been called is also +returned.

+
+
+ +
+

+ Valid XHTML 1.0! + $Id$ +

+ + + diff --git a/trunk/pycurl/doc/curlobject.html b/trunk/pycurl/doc/curlobject.html new file mode 100644 index 0000000..53497f6 --- /dev/null +++ b/trunk/pycurl/doc/curlobject.html @@ -0,0 +1,102 @@ + + + + + PycURL: Curl Objects + + + + + + +

Curl Object

+ +

Curl objects have the following methods:

+ +
+
close() -> None
+
+

Corresponds to +curl_easy_cleanup in libcurl. +This method is automatically called by pycurl when a Curl object no longer has +any references to it, but can also be called explicitly.

+
+ +
perform() -> None
+
+

Corresponds to +curl_easy_perform in libcurl.

+
+ +
setopt(option, value) -> None
+
+ +

Corresponds to +curl_easy_setopt in libcurl, where +option is specified with the CURLOPT_* constants in libcurl, +except that the CURLOPT_ prefix has been removed. The type for +value depends on the option, and can be either a string, +integer, long integer, file objects, lists, or functions.

+ +

Example usage:

+ +
+import pycurl
+c = pycurl.Curl()
+c.setopt(pycurl.URL, "http://www.python.org/")
+c.setopt(pycurl.HTTPHEADER, ["Accept:"])
+import StringIO
+b = StringIO.StringIO()
+c.setopt(pycurl.WRITEFUNCTION, b.write)
+c.setopt(pycurl.FOLLOWLOCATION, 1)
+c.setopt(pycurl.MAXREDIRS, 5)
+c.perform()
+print b.getvalue()
+...
+
+
+ +
getinfo(option) -> Result
+
+ +

Corresponds to +curl_easy_getinfo in libcurl, where +option is the same as the CURLINFO_* constants in libcurl, +except that the CURLINFO_ prefix has been removed. +Result contains an integer, float or string, depending on +which option is given. The getinfo method should +not be called unless perform has been called and +finished.

+ +

Example usage:

+ +
+import pycurl
+c = pycurl.Curl()
+c.setopt(pycurl.URL, "http://sf.net")
+c.setopt(pycurl.FOLLOWLOCATION, 1)
+c.perform()
+print c.getinfo(pycurl.HTTP_CODE), c.getinfo(pycurl.EFFECTIVE_URL)
+...
+--> 200 "http://sourceforge.net/"
+
+
+ +
errstr() -> String
+
+

Returns the internal libcurl error buffer of this handle as a string.

+
+
+ + +
+

+ Valid XHTML 1.0! + $Id$ +

+ + + diff --git a/trunk/pycurl/doc/pycurl.html b/trunk/pycurl/doc/pycurl.html new file mode 100644 index 0000000..f1db42a --- /dev/null +++ b/trunk/pycurl/doc/pycurl.html @@ -0,0 +1,120 @@ + + + + + PycURL Documentation + + + + + + +

pycurl — A Python interface to the cURL library

+ +

The pycurl package is a Python interface to libcurl (http://curl.haxx.se/libcurl/). pycurl +has been successfully built and tested with Python versions from +2.2 to the current 2.4.x releases.

+ +

libcurl is a client-side URL transfer library supporting FTP, FTPS, +HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP. libcurl +also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploads, proxies, +cookies, basic authentication, file transfer resume of FTP sessions, HTTP +proxy tunneling and more.

+ +

All the functionality provided by libcurl can used through the +pycurl interface. The following subsections describe how to use the +pycurl interface, and assume familiarity with how libcurl works. For +information on how libcurl works, please consult the curl library web pages +(http://curl.haxx.se/libcurl/c/).

+ +
+ +

Module Functionality

+ +
+
pycurl.global_init(option) ->None
+ +

option is one of the constants +pycurl.GLOBAL_SSL, pycurl.GLOBAL_WIN32, pycurl.GLOBAL_ALL, +pycurl.GLOBAL_NOTHING, pycurl.GLOBAL_DEFAULT. Corresponds to +curl_global_init() in libcurl.

+
+ +
pycurl.global_cleanup() -> None
+
+

Corresponds to +curl_global_cleanup() in libcurl.

+
+ +
pycurl.version
+ +

This is a string with version information on libcurl, +corresponding to +curl_version() in libcurl.

+ +

Example usage:

+
+>>> import pycurl
+>>> pycurl.version
+'libcurl/7.12.3 OpenSSL/0.9.7e zlib/1.2.2.1 libidn/0.5.12'
+
+
+ +
pycurl.version_info() -> Tuple
+
+

Corresponds to +curl_version_info() in libcurl. +Returns a tuple of information which is similar to the +curl_version_info_data struct returned by +curl_version_info() in libcurl.

+ +

Example usage:

+
+>>> import pycurl
+>>> pycurl.version_info()
+(2, '7.12.3', 461827, 'i586-pc-linux-gnu', 1565, 'OpenSSL/0.9.7e', 9465951,
+'1.2.2.1', ('ftp', 'gopher', 'telnet', 'dict', 'ldap', 'http', 'file',
+'https', 'ftps'), None, 0, '0.5.12')
+
+
+ +
pycurl.Curl() -> Curl object
+
+

This function creates a new +Curl object which corresponds to a +CURL handle in libcurl. Curl objects automatically +set CURLOPT_VERBOSE to 0, CURLOPT_NOPROGRESS to 1, +provide a default CURLOPT_USERAGENT and setup +CURLOPT_ERRORBUFFER to point to a private error buffer.

+
+ +
pycurl.CurlMulti() -> CurlMulti object
+
+

This function creates a new +CurlMulti object which corresponds to +a CURLM handle in libcurl.

+
+
+ +
+ +

Subsections

+ + + +
+

+ Valid XHTML 1.0! + $Id$ +

+ + + diff --git a/trunk/pycurl/examples/basicfirst.py b/trunk/pycurl/examples/basicfirst.py new file mode 100644 index 0000000..af59405 --- /dev/null +++ b/trunk/pycurl/examples/basicfirst.py @@ -0,0 +1,25 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys +import pycurl + +class Test: + def __init__(self): + self.contents = '' + + def body_callback(self, buf): + self.contents = self.contents + buf + +print >>sys.stderr, 'Testing', pycurl.version + +t = Test() +c = pycurl.Curl() +c.setopt(c.URL, 'http://curl.haxx.se/dev/') +c.setopt(c.WRITEFUNCTION, t.body_callback) +c.perform() +c.close() + +print t.contents diff --git a/trunk/pycurl/examples/file_upload.py b/trunk/pycurl/examples/file_upload.py new file mode 100644 index 0000000..a514c1c --- /dev/null +++ b/trunk/pycurl/examples/file_upload.py @@ -0,0 +1,46 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import os, sys +import pycurl + +# Class which holds a file reference and the read callback +class FileReader: + def __init__(self, fp): + self.fp = fp + def read_callback(self, size): + return self.fp.read(size) + +# Check commandline arguments +if len(sys.argv) < 3: + print "Usage: %s " % sys.argv[0] + raise SystemExit +url = sys.argv[1] +filename = sys.argv[2] + +if not os.path.exists(filename): + print "Error: the file '%s' does not exist" % filename + raise SystemExit + +# Initialize pycurl +c = pycurl.Curl() +c.setopt(pycurl.URL, url) +c.setopt(pycurl.UPLOAD, 1) + +# Two versions with the same semantics here, but the filereader version +# is useful when you have to process the data which is read before returning +if 1: + c.setopt(pycurl.READFUNCTION, FileReader(open(filename, 'rb')).read_callback) +else: + c.setopt(pycurl.READFUNCTION, open(filename, 'rb').read) + +# Set size of file to be uploaded. +filesize = os.path.getsize(filename) +c.setopt(pycurl.INFILESIZE, filesize) + +# Start transfer +print 'Uploading file %s to url %s' % (filename, url) +c.perform() +c.close() diff --git a/trunk/pycurl/examples/linksys.py b/trunk/pycurl/examples/linksys.py new file mode 100755 index 0000000..a60eba1 --- /dev/null +++ b/trunk/pycurl/examples/linksys.py @@ -0,0 +1,563 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# +# linksys.py -- program settings on a Linkys router +# +# This tool is designed to help you recover from the occasional episodes +# of catatonia that afflict Linksys boxes. It allows you to batch-program +# them rather than manually entering values to the Web interface. Commands +# are taken from the command line first, then standard input. +# +# The somewhat spotty coverage of status queries is because I only did the +# ones that were either (a) easy, or (b) necessary. If you want to know the +# status of the box, look at the web interface. +# +# This code has been tested against the following hardware: +# +# Hardware Firmware +# ---------- --------------------- +# BEFW11S4v2 1.44.2.1, Dec 20 2002 +# +# The code is, of course, sensitive to changes in the names of CGI pages +# and field names. +# +# Note: to make the no-arguments form work, you'll need to have the following +# entry in your ~/.netrc file. If you have changed the router IP address or +# name/password, modify accordingly. +# +# machine 192.168.1.1 +# login "" +# password admin +# +# By Eric S. Raymond, August April 2003. All rites reversed. + +import sys, re, copy, curl, exceptions + +class LinksysError(exceptions.Exception): + def __init__(self, *args): + self.args = args + +class LinksysSession: + months = 'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec' + + WAN_CONNECT_AUTO = '1' + WAN_CONNECT_STATIC = '2' + WAN_CONNECT_PPOE = '3' + WAN_CONNECT_RAS = '4' + WAN_CONNECT_PPTP = '5' + WAN_CONNECT_HEARTBEAT = '6' + + # Substrings to check for on each page load. + # This may enable us to detect when a firmware change has hosed us. + check_strings = { + "": "basic setup functions", + "Passwd.htm": "For security reasons,", + "DHCP.html": "You can configure the router to act as a DHCP", + "Log.html": "There are some log settings and lists in this page.", + "Forward.htm":"Port forwarding can be used to set up public services", + } + + def __init__(self): + self.actions = [] + self.host = "http://192.168.1.1" + self.verbosity = False + self.pagecache = {} + + def set_verbosity(self, flag): + self.verbosity = flag + + # This is not a performance hack -- we need the page cache to do + # sanity checks at configure time. + def cache_load(self, page): + if page not in self.pagecache: + fetch = curl.Curl(self.host) + fetch.set_verbosity(self.verbosity) + fetch.get(page) + self.pagecache[page] = fetch.body() + if fetch.answered("401"): + raise LinksysError("authorization failure.", True) + elif not fetch.answered(LinksysSession.check_strings[page]): + del self.pagecache[page] + raise LinksysError("check string for page %s missing!" % os.path.join(self.host, page), False) + fetch.close() + def cache_flush(self): + self.pagecache = {} + + # Primitives + def screen_scrape(self, page, template): + self.cache_load(page) + match = re.compile(template).search(self.pagecache[page]) + if match: + result = match.group(1) + else: + result = None + return result + def get_MAC_address(self, page, prefix): + return self.screen_scrape("", prefix+r":[^M]*\(MAC Address: *([^)]*)") + def set_flag(page, flag, value): + if value: + self.actions.append(page, flag, "1") + else: + self.actions.append(page, flag, "0") + def set_IP_address(self, page, cgi, role, ip): + ind = 0 + for octet in ip.split("."): + self.actions.append(("", "F1", role + `ind+1`, octet)) + ind += 1 + + # Scrape configuration data off the main page + def get_firmware_version(self): + # This is fragile. There is no distinguishing tag before the firmware + # version, so we have to key off the pattern of the version number. + # Our model is ">1.44.2.1, Dec 20 2002<" + return self.screen_scrape("", ">([0-9.v]*, (" + \ + LinksysSession.months + ")[^<]*)<", ) + def get_LAN_MAC(self): + return self.get_MAC_address("", r"LAN IP Address") + def get_Wireless_MAC(self): + return self.get_MAC_address("", r"Wireless") + def get_WAN_MAC(self): + return self.get_MAC_address("", r"WAN Connection Type") + + # Set configuration data on the main page + def set_host_name(self, name): + self.actions.append(("", "hostName", name)) + def set_domain_name(self, name): + self.actions.append(("", "DomainName", name)) + def set_LAN_IP(self, ip): + self.set_IP_address("", "ipAddr", ip) + def set_LAN_netmask(self, ip): + if not ip.startswith("255.255.255."): + raise ValueError + lastquad = ip.split(".")[-1] + if lastquad not in ("0", "128", "192", "240", "252"): + raise ValueError + self.actions.append("", "netMask", lastquad) + def set_wireless(self, flag): + self.set_flag("", "wirelessStatus") + def set_SSID(self, ssid): + self.actions.append(("", "wirelessESSID", ssid)) + def set_SSID_broadcast(self, flag): + self.set_flag("", "broadcastSSID") + def set_channel(self, channel): + self.actions.append(("", "wirelessChannel", channel)) + def set_WEP(self, flag): + self.set_flag("", "WepType") + # FIXME: Add support for setting WEP keys + def set_connection_type(self, type): + self.actions.append(("", "WANConnectionType", type)) + def set_WAN_IP(self, ip): + self.set_IP_address("", "aliasIP", ip) + def set_WAN_netmask(self, ip): + self.set_IP_address("", "aliasMaskIP", ip) + def set_WAN_gateway_address(self, ip): + self.set_IP_address("", "routerIP", ip) + def set_DNS_server(self, index, ip): + self.set_IP_address("", "dns" + "ABC"[index], ip) + + # Set configuration data on the password page + def set_password(self, str): + self.actions.append("Passwd.htm","sysPasswd", str) + self.actions.append("Passwd.htm","sysPasswdConfirm", str) + def set_UPnP(self, flag): + self.set_flag("Passwd.htm", "UPnP_Work") + def reset(self): + self.actions.append("Passwd.htm", "FactoryDefaults") + + # DHCP features + def set_DHCP(self, flag): + if flag: + self.actions.append("DHCP.htm","dhcpStatus","Enable") + else: + self.actions.append("DHCP.htm","dhcpStatus","Disable") + def set_DHCP_starting_IP(self, val): + self.actions.append("DHCP.htm","dhcpS4", str(val)) + def set_DHCP_users(self, val): + self.actions.append("DHCP.htm","dhcpLen", str(val)) + def set_DHCP_lease_time(self, val): + self.actions.append("DHCP.htm","leaseTime", str(val)) + def set_DHCP_DNS_server(self, index, ip): + self.set_IP_address("DHCP.htm", "dns" + "ABC"[index], ip) + # FIXME: add support for setting WINS key + + # Logging features + def set_logging(self, flag): + if flag: + self.actions.append("Log.htm", "rLog", "Enable") + else: + self.actions.append("Log.htm", "rLog", "Disable") + def set_log_address(self, val): + self.actions.append("DHCP.htm","trapAddr3", str(val)) + + # The AOL parental control flag is not supported by design. + + # FIXME: add Filters and other advanced features + + def configure(self): + "Write configuration changes to the Linksys." + if self.actions: + fields = [] + self.cache_flush() + for (page, field, value) in self.actions: + self.cache_load(page) + if self.pagecache[page].find(field) == -1: + print >>sys.stderr, "linksys: field %s not found where expected in page %s!" % (field, os.path.join(self.host, page)) + continue + else: + fields.append((field, value)) + # Clearing the action list before fieldsping is deliberate. + # Otherwise we could get permanently wedged by a 401. + self.actions = [] + transaction = curl.Curl(self.host) + transaction.set_verbosity(self.verbosity) + transaction.get("Gozila.cgi", tuple(fields)) + transaction.close() + +if __name__ == "__main__": + import os, cmd + + class LinksysInterpreter(cmd.Cmd): + """Interpret commands to perform LinkSys programming actions.""" + def __init__(self): + self.session = LinksysSession() + if os.isatty(0): + import readline + print "Type ? or `help' for help." + self.prompt = self.session.host + ": " + else: + self.prompt = "" + print "Bar1" + + def flag_command(self, func): + if line.strip() in ("on", "enable", "yes"): + func(True) + elif line.strip() in ("off", "disable", "no"): + func(False) + else: + print >>sys.stderr, "linksys: unknown switch value" + return 0 + + def do_connect(self, line): + newhost = line.strip() + if newhost: + self.session.host = newhost + self.session.cache_flush() + self.prompt = self.session.host + ": " + else: + print self.session.host + return 0 + def help_connect(self): + print "Usage: connect []" + print "Connect to a Linksys by name or IP address." + print "If no argument is given, print the current host." + + def do_status(self, line): + self.session.cache_load("") + if "" in self.session.pagecache: + print "Firmware:", self.session.get_firmware_version() + print "LAN MAC:", self.session.get_LAN_MAC() + print "Wireless MAC:", self.session.get_Wireless_MAC() + print "WAN MAC:", self.session.get_WAN_MAC() + print "." + return 0 + def help_status(self): + print "Usage: status" + print "The status command shows the status of the Linksys." + print "It is mainly useful as a sanity check to make sure" + print "the box is responding correctly." + + def do_verbose(self, line): + self.flag_command(self.session.set_verbosity) + def help_verbose(self): + print "Usage: verbose {on|off|enable|disable|yes|no}" + print "Enables display of HTTP requests." + + def do_host(self, line): + self.session.set_host_name(line) + return 0 + def help_host(self): + print "Usage: host " + print "Sets the Host field to be queried by the ISP." + + def do_domain(self, line): + print "Usage: host " + self.session.set_domain_name(line) + return 0 + def help_domain(self): + print "Sets the Domain field to be queried by the ISP." + + def do_lan_address(self, line): + self.session.set_LAN_IP(line) + return 0 + def help_lan_address(self): + print "Usage: lan_address " + print "Sets the LAN IP address." + + def do_lan_netmask(self, line): + self.session.set_LAN_netmask(line) + return 0 + def help_lan_netmask(self): + print "Usage: lan_netmask " + print "Sets the LAN subnetwork mask." + + def do_wireless(self, line): + self.flag_command(self.session.set_wireless) + return 0 + def help_wireless(self): + print "Usage: wireless {on|off|enable|disable|yes|no}" + print "Switch to enable or disable wireless features." + + def do_ssid(self, line): + self.session.set_SSID(line) + return 0 + def help_ssid(self): + print "Usage: ssid " + print "Sets the SSID used to control wireless access." + + def do_ssid_broadcast(self, line): + self.flag_command(self.session.set_SSID_broadcast) + return 0 + def help_ssid_broadcast(self): + print "Usage: ssid_broadcast {on|off|enable|disable|yes|no}" + print "Switch to enable or disable SSID broadcast." + + def do_channel(self, line): + self.session.set_channel(line) + return 0 + def help_channel(self): + print "Usage: channel " + print "Sets the wireless channel." + + def do_wep(self, line): + self.flag_command(self.session.set_WEP) + return 0 + def help_wep(self): + print "Usage: wep {on|off|enable|disable|yes|no}" + print "Switch to enable or disable WEP security." + + def do_wan_type(self, line): + try: + type=eval("LinksysSession.WAN_CONNECT_"+line.strip().upper()) + self.session.set_connection_type(type) + except ValueError: + print >>sys.stderr, "linksys: unknown connection type." + return 0 + def help_wan_type(self): + print "Usage: wan_type {auto|static|ppoe|ras|pptp|heartbeat}" + print "Set the WAN connection type." + + def do_wan_address(self, line): + self.session.set_WAN_IP(line) + return 0 + def help_wan_address(self): + print "Usage: wan_address " + print "Sets the WAN IP address." + + def do_wan_netmask(self, line): + self.session.set_WAN_netmask(line) + return 0 + def help_wan_netmask(self): + print "Usage: wan_netmask " + print "Sets the WAN subnetwork mask." + + def do_wan_gateway(self, line): + self.session.set_WAN_gateway(line) + return 0 + def help_wan_gateway(self): + print "Usage: wan_gateway " + print "Sets the LAN subnetwork mask." + + def do_dns(self, line): + (index, address) = line.split() + if index in ("1", "2", "3"): + self.session.set_DNS_server(eval(index), address) + else: + print >>sys.stderr, "linksys: server index out of bounds." + return 0 + def help_dns(self): + print "Usage: dns {1|2|3} " + print "Sets a primary, secondary, or tertiary DNS server address." + + def do_password(self, line): + self.session.set_password(line) + return 0 + def help_password(self): + print "Usage: password " + print "Sets the router password." + + def do_upnp(self, line): + self.flag_command(self.session.set_UPnP) + return 0 + def help_upnp(self): + print "Usage: upnp {on|off|enable|disable|yes|no}" + print "Switch to enable or disable Universal Plug and Play." + + def do_reset(self, line): + self.session.reset() + def help_reset(self): + print "Usage: reset" + print "Reset Linksys settings to factory defaults." + + def do_dhcp(self, line): + self.flag_command(self.session.set_DHCP) + def help_dhcp(self): + print "Usage: dhcp {on|off|enable|disable|yes|no}" + print "Switch to enable or disable DHCP features." + + def do_dhcp_start(self, line): + self.session.set_DHCP_starting_IP(line) + def help_dhcp_start(self): + print "Usage: dhcp_start " + print "Set the start address of the DHCP pool." + + def do_dhcp_users(self, line): + self.session.set_DHCP_users(line) + def help_dhcp_users(self): + print "Usage: dhcp_users " + print "Set number of address slots to allocate in the DHCP pool." + + def do_dhcp_lease(self, line): + self.session.set_DHCP_lease(line) + def help_dhcp_lease(self): + print "Usage: dhcp_lease " + print "Set number of address slots to allocate in the DHCP pool." + + def do_dhcp_dns(self, line): + (index, address) = line.split() + if index in ("1", "2", "3"): + self.session.set_DHCP_DNS_server(eval(index), address) + else: + print >>sys.stderr, "linksys: server index out of bounds." + return 0 + def help_dhcp_dns(self): + print "Usage: dhcp_dns {1|2|3} " + print "Sets primary, secondary, or tertiary DNS server address." + + def do_logging(self, line): + self.flag_command(self.session.set_logging) + def help_logging(self): + print "Usage: logging {on|off|enable|disable|yes|no}" + print "Switch to enable or disable session logging." + + def do_log_address(self, line): + self.session.set_Log_address(line) + def help_log_address(self): + print "Usage: log_address " + print "Set the last quad of the address to which to log." + + def do_configure(self, line): + self.session.configure() + return 0 + def help_configure(self): + print "Usage: configure" + print "Writes the configuration to the Linksys." + + def do_cache(self, line): + print self.session.pagecache + def help_cache(self): + print "Usage: cache" + print "Display the page cache." + + def do_quit(self, line): + return 1 + def help_quit(self, line): + print "The quit command ends your linksys session without" + print "writing configuration changes to the Linksys." + def do_EOF(self, line): + print "" + self.session.configure() + return 1 + def help_EOF(self): + print "The EOF command writes the configuration to the linksys" + print "and ends your session." + + def default(self, line): + """Pass the command through to be executed by the shell.""" + os.system(line) + return 0 + + def help_help(self): + print "On-line help is available through this command." + print "? is a convenience alias for help." + + def help_introduction(self): + print """\ + +This program supports changing the settings on Linksys blue-box routers. This +capability may come in handy when they freeze up and have to be reset. Though +it can be used interactively (and will command-prompt when standard input is a +terminal) it is really designed to be used in batch mode. Commands are taken +from the command line first, then standard input. + +By default, it is assumed that the Linksys is at http://192.168.1.1, the +default LAN address. You can connect to a different address or IP with the +'connect' command. Note that your .netrc must contain correct user/password +credentials for the router. The entry corresponding to the defaults is: + +machine 192.168.1.1 + login "" + password admin + +Most commands queue up changes but don't actually send them to the Linksys. +You can force pending changes to be written with 'configure'. Otherwise, they +will be shipped to the Linksys at the end of session (e.g. when the program +running in batch mode encounters end-of-file or you type a control-D). If you +end the session with `quit', pending changes will be discarded. + +For more help, read the topics 'wan', 'lan', and 'wireless'.""" + + def help_lan(self): + print """\ +The `lan_address' and `lan_netmask' commands let you set the IP location of +the Linksys on your LAN, or inside. Normally you'll want to leave these +untouched.""" + + def help_wan(self): + print """\ +The WAN commands become significant if you are using the BEFSR41 or any of +the other Linksys boxes designed as DSL or cable-modem gateways. You will +need to use `wan_type' to declare how you expect to get your address. + +If your ISP has issued you a static address, you'll need to use the +`wan_address', `wan_netmask', and `wan_gateway' commands to set the address +of the router as seen from the WAN, the outside. In this case you will also +need to use the `dns' command to declare which remote servers your DNS +requests should be forwarded to. + +Some ISPs may require you to set host and domain for use with dynamic-address +allocation.""" + + def help_wireless(self): + print """\ +The channel, ssid, ssid_broadcast, wep, and wireless commands control +wireless routing.""" + + def help_switches(self): + print "Switches may be turned on with 'on', 'enable', or 'yes'." + print "Switches may be turned off with 'off', 'disable', or 'no'." + print "Switch commands include: wireless, ssid_broadcast." + + def help_addresses(self): + print "An address argument must be a valid IP address;" + print "four decimal numbers separated by dots, each " + print "between 0 and 255." + + def emptyline(self): + pass + + interpreter = LinksysInterpreter() + for arg in sys.argv[1:]: + interpreter.onecmd(arg) + fatal = False + while not fatal: + try: + interpreter.cmdloop() + fatal = True + except LinksysError, (message, fatal): + print "linksys:", message + +# The following sets edit modes for GNU EMACS +# Local Variables: +# mode:python +# End: diff --git a/trunk/pycurl/examples/retriever-multi.py b/trunk/pycurl/examples/retriever-multi.py new file mode 100644 index 0000000..2ec3f9a --- /dev/null +++ b/trunk/pycurl/examples/retriever-multi.py @@ -0,0 +1,122 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +# +# Usage: python retriever-multi.py [<# of +# concurrent connections>] +# + +import sys +import pycurl + +# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see +# the libcurl tutorial for more info. +try: + import signal + from signal import SIGPIPE, SIG_IGN + signal.signal(signal.SIGPIPE, signal.SIG_IGN) +except ImportError: + pass + + +# Get args +num_conn = 10 +try: + if sys.argv[1] == "-": + urls = sys.stdin.readlines() + else: + urls = open(sys.argv[1]).readlines() + if len(sys.argv) >= 3: + num_conn = int(sys.argv[2]) +except: + print "Usage: %s [<# of concurrent connections>]" % sys.argv[0] + raise SystemExit + + +# Make a queue with (url, filename) tuples +queue = [] +for url in urls: + url = url.strip() + if not url or url[0] == "#": + continue + filename = "doc_%03d.dat" % (len(queue) + 1) + queue.append((url, filename)) + + +# Check args +assert queue, "no URLs given" +num_urls = len(queue) +num_conn = min(num_conn, num_urls) +assert 1 <= num_conn <= 10000, "invalid number of concurrent connections" +print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM) +print "----- Getting", num_urls, "URLs using", num_conn, "connections -----" + + +# Pre-allocate a list of curl objects +m = pycurl.CurlMulti() +m.handles = [] +for i in range(num_conn): + c = pycurl.Curl() + c.fp = None + c.setopt(pycurl.FOLLOWLOCATION, 1) + c.setopt(pycurl.MAXREDIRS, 5) + c.setopt(pycurl.CONNECTTIMEOUT, 30) + c.setopt(pycurl.TIMEOUT, 300) + c.setopt(pycurl.NOSIGNAL, 1) + m.handles.append(c) + + +# Main loop +freelist = m.handles[:] +num_processed = 0 +while num_processed < num_urls: + # If there is an url to process and a free curl object, add to multi stack + while queue and freelist: + url, filename = queue.pop(0) + c = freelist.pop() + c.fp = open(filename, "wb") + c.setopt(pycurl.URL, url) + c.setopt(pycurl.WRITEDATA, c.fp) + m.add_handle(c) + # store some info + c.filename = filename + c.url = url + # Run the internal curl state machine for the multi stack + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + # Check for curl objects which have terminated, and add them to the freelist + while 1: + num_q, ok_list, err_list = m.info_read() + for c in ok_list: + c.fp.close() + c.fp = None + m.remove_handle(c) + print "Success:", c.filename, c.url, c.getinfo(pycurl.EFFECTIVE_URL) + freelist.append(c) + for c, errno, errmsg in err_list: + c.fp.close() + c.fp = None + m.remove_handle(c) + print "Failed: ", c.filename, c.url, errno, errmsg + freelist.append(c) + num_processed = num_processed + len(ok_list) + len(err_list) + if num_q == 0: + break + # Currently no more I/O is pending, could do something in the meantime + # (display a progress bar, etc.). + # We just call select() to sleep until some more data is available. + m.select() + + +# Cleanup +for c in m.handles: + if c.fp is not None: + c.fp.close() + c.fp = None + c.close() +m.close() + diff --git a/trunk/pycurl/examples/retriever.py b/trunk/pycurl/examples/retriever.py new file mode 100644 index 0000000..2c91d07 --- /dev/null +++ b/trunk/pycurl/examples/retriever.py @@ -0,0 +1,99 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +# +# Usage: python retriever.py [<# of +# concurrent connections>] +# + +import sys, threading, Queue +import pycurl + +# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see +# the libcurl tutorial for more info. +try: + import signal + from signal import SIGPIPE, SIG_IGN + signal.signal(signal.SIGPIPE, signal.SIG_IGN) +except ImportError: + pass + + +# Get args +num_conn = 10 +try: + if sys.argv[1] == "-": + urls = sys.stdin.readlines() + else: + urls = open(sys.argv[1]).readlines() + if len(sys.argv) >= 3: + num_conn = int(sys.argv[2]) +except: + print "Usage: %s [<# of concurrent connections>]" % sys.argv[0] + raise SystemExit + + +# Make a queue with (url, filename) tuples +queue = Queue.Queue() +for url in urls: + url = url.strip() + if not url or url[0] == "#": + continue + filename = "doc_%03d.dat" % (len(queue.queue) + 1) + queue.put((url, filename)) + + +# Check args +assert queue.queue, "no URLs given" +num_urls = len(queue.queue) +num_conn = min(num_conn, num_urls) +assert 1 <= num_conn <= 10000, "invalid number of concurrent connections" +print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM) +print "----- Getting", num_urls, "URLs using", num_conn, "connections -----" + + +class WorkerThread(threading.Thread): + def __init__(self, queue): + threading.Thread.__init__(self) + self.queue = queue + + def run(self): + while 1: + try: + url, filename = self.queue.get_nowait() + except Queue.Empty: + raise SystemExit + fp = open(filename, "wb") + curl = pycurl.Curl() + curl.setopt(pycurl.URL, url) + curl.setopt(pycurl.FOLLOWLOCATION, 1) + curl.setopt(pycurl.MAXREDIRS, 5) + curl.setopt(pycurl.CONNECTTIMEOUT, 30) + curl.setopt(pycurl.TIMEOUT, 300) + curl.setopt(pycurl.NOSIGNAL, 1) + curl.setopt(pycurl.WRITEDATA, fp) + try: + curl.perform() + except: + import traceback + traceback.print_exc(file=sys.stderr) + sys.stderr.flush() + curl.close() + fp.close() + sys.stdout.write(".") + sys.stdout.flush() + + +# Start a bunch of threads +threads = [] +for dummy in range(num_conn): + t = WorkerThread(queue) + t.start() + threads.append(t) + + +# Wait for all threads to finish +for thread in threads: + thread.join() diff --git a/trunk/pycurl/examples/sfquery.py b/trunk/pycurl/examples/sfquery.py new file mode 100644 index 0000000..0c63f61 --- /dev/null +++ b/trunk/pycurl/examples/sfquery.py @@ -0,0 +1,64 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# +# sfquery -- Source Forge query script using the ClientCGI high-level interface +# +# Retrieves a SourceForge XML export object for a given project. +# Specify the *numeric* project ID. the user name, and the password, +# as arguments. If you have a valid ~/.netrc entry for sourceforge.net, +# you can just give the project ID. +# +# By Eric S. Raymond, August 2002. All rites reversed. + +import os, sys, netrc +import curl + +assert sys.version[:3] >= "2.2", "requires Python 2.2 or better" + +class SourceForgeUserSession(curl.Curl): + # SourceForge-specific methods. Sensitive to changes in site design. + def login(self, name, password): + "Establish a login session." + self.post("account/login.php", (("form_loginname", name), + ("form_pw", password), + ("return_to", ""), + ("stay_in_ssl", "1"), + ("login", "Login With SSL"))) + def logout(self): + "Log out of SourceForge." + self.get("account/logout.php") + def fetch_xml(self, numid): + self.get("export/xml_export.php?group_id=%s" % numid) + +if __name__ == "__main__": + if len(sys.argv) == 1: + project_id = '28236' # PyCurl project ID + else: + project_id = sys.argv[1] + # Try to grab authenticators out of your .netrc + try: + auth = netrc.netrc().authenticators("sourceforge.net") + name, account, password = auth + except: + name = sys.argv[2] + password = sys.argv[3] + session = SourceForgeUserSession("https://sourceforge.net/") + session.set_verbosity(0) + session.login(name, password) + # Login could fail. + if session.answered("Invalid Password or User Name"): + sys.stderr.write("Login/password not accepted (%d bytes)\n" % len(session.body())) + sys.exit(1) + # We'll see this if we get the right thing. + elif session.answered("Personal Page For: " + name): + session.fetch_xml(project_id) + sys.stdout.write(session.body()) + session.logout() + sys.exit(0) + # Or maybe SourceForge has changed its site design so our check strings + # are no longer valid. + else: + sys.stderr.write("Unexpected page (%d bytes)\n"%len(session.body())) + sys.exit(1) + diff --git a/trunk/pycurl/examples/xmlrpc_curl.py b/trunk/pycurl/examples/xmlrpc_curl.py new file mode 100644 index 0000000..462bc97 --- /dev/null +++ b/trunk/pycurl/examples/xmlrpc_curl.py @@ -0,0 +1,61 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see +# the libcurl tutorial for more info. +try: + import signal + from signal import SIGPIPE, SIG_IGN + signal.signal(signal.SIGPIPE, signal.SIG_IGN) +except ImportError: + pass +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +import xmlrpclib, pycurl + + +class CURLTransport(xmlrpclib.Transport): + """Handles a cURL HTTP transaction to an XML-RPC server.""" + + xmlrpc_h = [ "Content-Type: text/xml" ] + + def __init__(self, username=None, password=None): + self.c = pycurl.Curl() + self.c.setopt(pycurl.POST, 1) + self.c.setopt(pycurl.NOSIGNAL, 1) + self.c.setopt(pycurl.CONNECTTIMEOUT, 30) + self.c.setopt(pycurl.HTTPHEADER, self.xmlrpc_h) + if username != None and password != None: + self.c.setopt(pycurl.USERPWD, '%s:%s' % (username, password)) + + def request(self, host, handler, request_body, verbose=0): + b = StringIO() + self.c.setopt(pycurl.URL, 'http://%s%s' % (host, handler)) + self.c.setopt(pycurl.POSTFIELDS, request_body) + self.c.setopt(pycurl.WRITEFUNCTION, b.write) + self.c.setopt(pycurl.VERBOSE, verbose) + self.verbose = verbose + try: + self.c.perform() + except pycurl.error, v: + raise xmlrpclib.ProtocolError( + host + handler, + v[0], v[1], None + ) + b.seek(0) + return self.parse_response(b) + + +if __name__ == "__main__": + ## Test + server = xmlrpclib.ServerProxy("http://betty.userland.com", + transport=CURLTransport()) + print server + try: + print server.examples.getStateName(41) + except xmlrpclib.Error, v: + print "ERROR", v diff --git a/trunk/pycurl/python/curl/__init__.py b/trunk/pycurl/python/curl/__init__.py new file mode 100644 index 0000000..8fecb4d --- /dev/null +++ b/trunk/pycurl/python/curl/__init__.py @@ -0,0 +1,146 @@ +# A high-level interface to the pycurl extension +# +# ** mfx NOTE: the CGI class uses "black magic" using COOKIEFILE in +# combination with a non-existant file name. See the libcurl docs +# for more info. +# +# If you want thread-safe operation, you'll have to set the NOSIGNAL option +# yourself. +# +# By Eric S. Raymond, April 2003. + +import os, sys, urllib, exceptions, mimetools, pycurl +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + + +class Curl: + "High-level interface to cURL functions." + def __init__(self, base_url="", fakeheaders=[]): + self.handle = pycurl.Curl() + # These members might be set. + self.set_url(base_url) + self.verbosity = 0 + self.fakeheaders = fakeheaders + # Nothing past here should be modified by the caller. + self.payload = "" + self.header = StringIO() + # Verify that we've got the right site; harmless on a non-SSL connect. + self.set_option(pycurl.SSL_VERIFYHOST, 2) + # Follow redirects in case it wants to take us to a CGI... + self.set_option(pycurl.FOLLOWLOCATION, 1) + self.set_option(pycurl.MAXREDIRS, 5) + # Setting this option with even a nonexistent file makes libcurl + # handle cookie capture and playback automatically. + self.set_option(pycurl.COOKIEFILE, "/dev/null") + # Set timeouts to avoid hanging too long + self.set_timeout(30) + # Use password identification from .netrc automatically + self.set_option(pycurl.NETRC, 1) + # Set up a callback to capture the payload + def payload_callback(x): + self.payload += x + self.set_option(pycurl.WRITEFUNCTION, payload_callback) + def header_callback(x): + self.header.write(x) + self.set_option(pycurl.HEADERFUNCTION, header_callback) + + def set_timeout(self, timeout): + "Set timeout for connect and object retrieval (applies for both)" + self.set_option(pycurl.CONNECTTIMEOUT, timeout) + self.set_option(pycurl.TIMEOUT, timeout) + + def set_url(self, url): + "Set the base URL to be retrieved." + self.base_url = url + self.set_option(pycurl.URL, self.base_url) + + def set_option(self, *args): + "Set an option on the retrieval," + apply(self.handle.setopt, args) + + def set_verbosity(self, level): + "Set verbosity to 1 to see transactions." + self.set_option(pycurl.VERBOSE, level) + + def __request(self, relative_url=None): + "Perform the pending request." + if self.fakeheaders: + self.set_option(pycurl.HTTPHEADER, self.fakeheaders) + if relative_url: + self.set_option(pycurl.URL,os.path.join(self.base_url,relative_url)) + self.header.seek(0,0) + self.payload = "" + self.handle.perform() + return self.payload + + def get(self, url="", params=None): + "Ship a GET request for a specified URL, capture the response." + if params: + url += "?" + urllib.urlencode(params) + self.set_option(pycurl.HTTPGET, 1) + return self.__request(url) + + def post(self, cgi, params): + "Ship a POST request to a specified CGI, capture the response." + self.set_option(pycurl.POST, 1) + self.set_option(pycurl.POSTFIELDS, urllib.urlencode(params)) + return self.__request(cgi) + + def body(self): + "Return the body from the last response." + return self.payload + + def info(self): + "Return an RFC822 object with info on the page." + self.header.seek(0,0) + url = self.handle.getinfo(pycurl.EFFECTIVE_URL) + if url[:5] == 'http:': + self.header.readline() + m = mimetools.Message(self.header) + else: + m = mimetools.Message(StringIO()) + m['effective-url'] = url + m['http-code'] = str(self.handle.getinfo(pycurl.HTTP_CODE)) + m['total-time'] = str(self.handle.getinfo(pycurl.TOTAL_TIME)) + m['namelookup-time'] = str(self.handle.getinfo(pycurl.NAMELOOKUP_TIME)) + m['connect-time'] = str(self.handle.getinfo(pycurl.CONNECT_TIME)) + m['pretransfer-time'] = str(self.handle.getinfo(pycurl.PRETRANSFER_TIME)) + m['redirect-time'] = str(self.handle.getinfo(pycurl.REDIRECT_TIME)) + m['redirect-count'] = str(self.handle.getinfo(pycurl.REDIRECT_COUNT)) + m['size-upload'] = str(self.handle.getinfo(pycurl.SIZE_UPLOAD)) + m['size-download'] = str(self.handle.getinfo(pycurl.SIZE_DOWNLOAD)) + m['speed-upload'] = str(self.handle.getinfo(pycurl.SPEED_UPLOAD)) + m['header-size'] = str(self.handle.getinfo(pycurl.HEADER_SIZE)) + m['request-size'] = str(self.handle.getinfo(pycurl.REQUEST_SIZE)) + m['content-length-download'] = str(self.handle.getinfo(pycurl.CONTENT_LENGTH_DOWNLOAD)) + m['content-length-upload'] = str(self.handle.getinfo(pycurl.CONTENT_LENGTH_UPLOAD)) + m['content-type'] = (self.handle.getinfo(pycurl.CONTENT_TYPE) or '').strip(';') + return m + + def answered(self, check): + "Did a given check string occur in the last payload?" + return self.payload.find(check) >= 0 + + def close(self): + "Close a session, freeing resources." + self.handle.close() + self.header.close() + + def __del__(self): + self.close() + + +if __name__ == "__main__": + if len(sys.argv) < 2: + url = 'http://curl.haxx.se' + else: + url = sys.argv[1] + c = Curl() + c.get(url) + print c.body() + print '='*74 + '\n' + print c.info() + c.close() diff --git a/trunk/pycurl/setup.py b/trunk/pycurl/setup.py new file mode 100644 index 0000000..841ff19 --- /dev/null +++ b/trunk/pycurl/setup.py @@ -0,0 +1,199 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +"""Setup script for the PycURL module distribution.""" + +PACKAGE = "pycurl" +PY_PACKAGE = "curl" +VERSION = "7.13.1" + +import glob, os, re, sys, string +import distutils +from distutils.core import setup +from distutils.extension import Extension +from distutils.util import split_quoted +from distutils.version import LooseVersion + +include_dirs = [] +define_macros = [] +library_dirs = [] +libraries = [] +runtime_library_dirs = [] +extra_objects = [] +extra_compile_args = [] +extra_link_args = [] + + +def scan_argv(s, default): + p = default + i = 1 + while i < len(sys.argv): + arg = sys.argv[i] + if string.find(arg, s) == 0: + p = arg[len(s):] + assert p, arg + del sys.argv[i] + else: + i = i + 1 + ##print sys.argv + return p + + +# append contents of an environment variable to library_dirs[] +def add_libdirs(envvar, sep, fatal=0): + v = os.environ.get(envvar) + if not v: + return + for dir in string.split(v, sep): + dir = string.strip(dir) + if not dir: + continue + dir = os.path.normpath(dir) + if os.path.isdir(dir): + if not dir in library_dirs: + library_dirs.append(dir) + elif fatal: + print "FATAL: bad directory %s in environment variable %s" % (dir, envvar) + sys.exit(1) + + +if sys.platform == "win32": + # Windows users have to configure the CURL_DIR path parameter to match + # their cURL source installation. The path set here is just an example + # and thus unlikely to match your installation. + CURL_DIR = r"c:\src\build\pycurl\curl-7.13.1" + CURL_DIR = scan_argv("--curl-dir=", CURL_DIR) + print "Using curl directory:", CURL_DIR + assert os.path.isdir(CURL_DIR), "please check CURL_DIR in setup.py" + include_dirs.append(os.path.join(CURL_DIR, "include")) + extra_objects.append(os.path.join(CURL_DIR, "lib", "libcurl.lib")) + extra_link_args.extend(["gdi32.lib", "winmm.lib", "ws2_32.lib",]) + add_libdirs("LIB", ";") + if string.find(sys.version, "MSC") >= 0: + extra_compile_args.append("-O2") + extra_compile_args.append("-GF") # enable read-only string pooling + extra_compile_args.append("-WX") # treat warnings as errors + extra_link_args.append("/opt:nowin98") # use small section alignment +else: + # Find out the rest the hard way + CURL_CONFIG = "curl-config" + CURL_CONFIG = scan_argv("--curl-config=", CURL_CONFIG) + d = os.popen("'%s' --version" % CURL_CONFIG).read() + if d: + d = string.strip(d) + if not d: + raise Exception, ("`%s' not found -- please install the libcurl development files" % CURL_CONFIG) + print "Using %s (%s)" % (CURL_CONFIG, d) + for e in split_quoted(os.popen("'%s' --cflags" % CURL_CONFIG).read()): + if e[:2] == "-I": + # do not add /usr/include + if not re.search(r"^\/+usr\/+include\/*$", e[2:]): + include_dirs.append(e[2:]) + else: + extra_compile_args.append(e) + for e in split_quoted(os.popen("'%s' --libs" % CURL_CONFIG).read()): + if e[:2] == "-l": + libraries.append(e[2:]) + elif e[:2] == "-L": + library_dirs.append(e[2:]) + else: + extra_link_args.append(e) + if not libraries: + libraries.append("curl") + # Add extra compile flag for MacOS X + if sys.platform[:-1] == "darwin": + extra_link_args.append("-flat_namespace") + + +############################################################################### + +def get_kw(**kw): return kw + +ext = Extension( + name=PACKAGE, + sources=[ + os.path.join("src", "pycurl.c"), + ], + include_dirs=include_dirs, + define_macros=define_macros, + library_dirs=library_dirs, + libraries=libraries, + runtime_library_dirs=runtime_library_dirs, + extra_objects=extra_objects, + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args, +) +##print ext.__dict__; sys.exit(1) + + +############################################################################### + +# prepare data_files + +def get_data_files(): + # a list of tuples with (path to install to, a list of local files) + data_files = [] + if sys.platform == "win32": + datadir = os.path.join("doc", PACKAGE) + else: + datadir = os.path.join("share", "doc", PACKAGE) + # + files = ["ChangeLog", "COPYING", "INSTALL", "README", "TODO",] + if files: + data_files.append((os.path.join(datadir), files)) + files = glob.glob(os.path.join("doc", "*.html")) + if files: + data_files.append((os.path.join(datadir, "html"), files)) + files = glob.glob(os.path.join("examples", "*.py")) + if files: + data_files.append((os.path.join(datadir, "examples"), files)) + files = glob.glob(os.path.join("tests", "*.py")) + if files: + data_files.append((os.path.join(datadir, "tests"), files)) + # + assert data_files + for install_dir, files in data_files: + assert files + for f in files: + assert os.path.isfile(f), (f, install_dir) + return data_files + +##print get_data_files(); sys.exit(1) + + +############################################################################### + +setup_args = get_kw( + name=PACKAGE, + version=VERSION, + description="PycURL -- cURL library module for Python", + author="Kjetil Jacobsen, Markus F.X.J. Oberhumer", + author_email="kjetilja@cs.uit.no, markus@oberhumer.com", + maintainer="Kjetil Jacobsen, Markus F.X.J. Oberhumer", + maintainer_email="kjetilja@cs.uit.no, markus@oberhumer.com", + url="http://pycurl.sourceforge.net/", + license="GNU Lesser General Public License (LGPL)", + data_files=get_data_files(), + ext_modules=[ext], + long_description=""" +This module provides Python bindings for the cURL library.""", +) + +if sys.version >= "2.2": + setup_args["packages"] = [PY_PACKAGE] + setup_args["package_dir"] = { PY_PACKAGE: os.path.join('python', 'curl') } + + +##print distutils.__version__ +if LooseVersion(distutils.__version__) > LooseVersion("1.0.1"): + setup_args["platforms"] = "All" +if LooseVersion(distutils.__version__) < LooseVersion("1.0.3"): + setup_args["licence"] = setup_args["license"] + +if __name__ == "__main__": + for o in ext.extra_objects: + assert os.path.isfile(o), o + # We can live with the deprecationwarning for a while + apply(setup, (), setup_args) diff --git a/trunk/pycurl/setup_win32_ssl.py b/trunk/pycurl/setup_win32_ssl.py new file mode 100644 index 0000000..1226ac1 --- /dev/null +++ b/trunk/pycurl/setup_win32_ssl.py @@ -0,0 +1,34 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import os, sys, string +assert sys.platform == "win32", "Only for building on Win32 with SSL and zlib" + + +CURL_DIR = r"c:\src\build\pycurl\curl-7.13.1-ssl" +OPENSSL_DIR = r"c:\src\build\pycurl\openssl-0.9.7e" +sys.argv.insert(1, "--curl-dir=" + CURL_DIR) + +from setup import * + +setup_args["name"] = "pycurl-ssl" + + +for l in ("libeay32.lib", "ssleay32.lib",): + ext.extra_objects.append(os.path.join(OPENSSL_DIR, "out32", l)) + +pool = "\\" + r"pool\win32\vc6" + "\\" +if string.find(sys.version, "MSC v.1310") >= 0: + pool = "\\" + r"pool\win32\vc71" + "\\" +ext.extra_objects.append(r"c:\src\pool\zlib-1.2.2" + pool + "zlib.lib") +ext.extra_objects.append(r"c:\src\pool\c-ares-20041212" + pool + "ares.lib") +ext.extra_objects.append(r"c:\src\pool\libidn-0.5.13" + pool + "idn.lib") + + +if __name__ == "__main__": + for o in ext.extra_objects: + assert os.path.isfile(o), o + apply(setup, (), setup_args) + diff --git a/trunk/pycurl/src/Makefile b/trunk/pycurl/src/Makefile new file mode 100644 index 0000000..a4828d3 --- /dev/null +++ b/trunk/pycurl/src/Makefile @@ -0,0 +1,19 @@ +CC=gcc +RM=rm +CP=cp +PYINCLUDE=/usr/include/python2.2 +CURLINCLUDE=/usr/include/curl +INCLUDE=-I$(PYINCLUDE) -I$(CURLINCLUDE) +LIBS=-L/usr/lib -lcurl +LDOPTS=-shared +CCOPTS=-g -O2 -Wall -Wstrict-prototypes -fPIC + +all: + $(CC) $(INCLUDE) $(CCOPTS) -c pycurl.c -o pycurl.o + $(CC) $(LIBS) $(LDOPTS) -lcurl pycurl.o -o pycurl.so + +install: all + $(CP) pycurl.so /usr/lib/python2.2/site-packages + +clean: + $(RM) -f *~ *.o *obj *.so diff --git a/trunk/pycurl/src/pycurl.c b/trunk/pycurl/src/pycurl.c new file mode 100644 index 0000000..25f9d61 --- /dev/null +++ b/trunk/pycurl/src/pycurl.c @@ -0,0 +1,2828 @@ +/* $Id$ */ + +/* PycURL -- cURL Python module + * + * Authors: + * Copyright (C) 2001-2005 by Kjetil Jacobsen + * Copyright (C) 2001-2005 by Markus F.X.J. Oberhumer + * + * Contributions: + * Tino Lange + * Matt King + * Conrad Steenberg + * Amit Mongia + * Eric S. Raymond + * Martin Muenstermann + * Domenico Andreoli + * + * See file COPYING for license information. + * + * Some quick info on Python's refcount: + * Py_BuildValue does incref the item(s) + * PyArg_ParseTuple does NOT incref the item + * PyList_Append does incref the item + * PyTuple_SET_ITEM does NOT incref the item + * PyTuple_SetItem does NOT incref the item + * PyXXX_GetItem returns a borrowed reference + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 1 +#endif +#if defined(WIN32) +# define CURL_STATICLIB 1 +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#undef NDEBUG +#include + +/* Ensure we have updated versions */ +#if !defined(PY_VERSION_HEX) || (PY_VERSION_HEX < 0x02020000) +# error "Need Python version 2.2 or greater to compile pycurl." +#endif +#if !defined(LIBCURL_VERSION_NUM) || (LIBCURL_VERSION_NUM < 0x070d01) +# error "Need libcurl version 7.13.1 or greater to compile pycurl." +#endif + +#undef UNUSED +#define UNUSED(var) ((void)&var) + +#undef COMPILE_TIME_ASSERT +#define COMPILE_TIME_ASSERT(expr) \ + { typedef int compile_time_assert_fail__[1 - 2 * !(expr)]; } + + +/* Calculate the number of OBJECTPOINT options we need to store */ +#define OPTIONS_SIZE ((int)CURLOPT_LASTENTRY % 10000) +static int OPT_INDEX(int o) +{ + assert(o >= CURLOPTTYPE_OBJECTPOINT); + assert(o < CURLOPTTYPE_OBJECTPOINT + OPTIONS_SIZE); + return o - CURLOPTTYPE_OBJECTPOINT; +} + + +static PyObject *ErrorObject = NULL; +static PyTypeObject *p_Curl_Type = NULL; +static PyTypeObject *p_CurlMulti_Type = NULL; + +typedef struct { + PyObject_HEAD + PyObject *dict; /* Python attributes dictionary */ + CURLM *multi_handle; + PyThreadState *state; + fd_set read_fd_set; + fd_set write_fd_set; + fd_set exc_fd_set; +} CurlMultiObject; + +typedef struct { + PyObject_HEAD + PyObject *dict; /* Python attributes dictionary */ + CURL *handle; + PyThreadState *state; + CurlMultiObject *multi_stack; + struct curl_httppost *httppost; + struct curl_slist *httpheader; + struct curl_slist *http200aliases; + struct curl_slist *quote; + struct curl_slist *postquote; + struct curl_slist *prequote; + struct curl_slist *source_prequote; + struct curl_slist *source_postquote; + /* callbacks */ + PyObject *w_cb; + PyObject *h_cb; + PyObject *r_cb; + PyObject *pro_cb; + PyObject *debug_cb; + PyObject *ioctl_cb; + /* file objects */ + PyObject *readdata_fp; + PyObject *writedata_fp; + PyObject *writeheader_fp; + /* misc */ + void *options[OPTIONS_SIZE]; /* for OBJECTPOINT options */ + char error[CURL_ERROR_SIZE+1]; +} CurlObject; + +/* Throw exception based on return value `res' and `self->error' */ +#define CURLERROR_RETVAL() do {\ + PyObject *v; \ + self->error[sizeof(self->error) - 1] = 0; \ + v = Py_BuildValue("(is)", (int) (res), self->error); \ + if (v != NULL) { PyErr_SetObject(ErrorObject, v); Py_DECREF(v); } \ + return NULL; \ +} while (0) + +/* Throw exception based on return value `res' and custom message */ +#define CURLERROR_MSG(msg) do {\ + PyObject *v; const char *m = (msg); \ + v = Py_BuildValue("(is)", (int) (res), (m)); \ + if (v != NULL) { PyErr_SetObject(ErrorObject, v); Py_DECREF(v); } \ + return NULL; \ +} while (0) + + +/* Safe XDECREF for object states that handles nested deallocations */ +#define ZAP(v) do {\ + PyObject *tmp = (PyObject *)(v); \ + (v) = NULL; \ + Py_XDECREF(tmp); \ +} while (0) + + +/************************************************************************* +// python utility functions +**************************************************************************/ + +#if (PY_VERSION_HEX < 0x02030000) && !defined(PY_LONG_LONG) +# define PY_LONG_LONG LONG_LONG +#endif + +/* Like PyString_AsString(), but set an exception if the string contains + * embedded NULs. Actually PyString_AsStringAndSize() already does that for + * us if the `len' parameter is NULL - see Objects/stringobject.c. + */ + +static char *PyString_AsString_NoNUL(PyObject *obj) +{ + char *s = NULL; + int r; + r = PyString_AsStringAndSize(obj, &s, NULL); + if (r != 0) + return NULL; /* exception already set */ + assert(s != NULL); + return s; +} + + +/* Convert a curl slist (a list of strings) to a Python list. + * In case of error return NULL with an exception set. + */ +static PyObject *convert_slist(struct curl_slist *slist, int free_flags) +{ + PyObject *ret = NULL; + + ret = PyList_New(0); + if (ret == NULL) goto error; + + for ( ; slist != NULL; slist = slist->next) { + PyObject *v = NULL; + + if (slist->data != NULL) { + v = PyString_FromString(slist->data); + if (v == NULL || PyList_Append(ret, v) != 0) { + Py_XDECREF(v); + goto error; + } + Py_DECREF(v); + } + } + + if ((free_flags & 1) && slist) + curl_slist_free_all(slist); + return ret; + +error: + Py_XDECREF(ret); + if ((free_flags & 2) && slist) + curl_slist_free_all(slist); + return NULL; +} + + +/************************************************************************* +// static utility functions +**************************************************************************/ + +static PyThreadState * +get_thread_state(const CurlObject *self) +{ + /* Get the thread state for callbacks to run in. + * This is either `self->state' when running inside perform() or + * `self->multi_stack->state' when running inside multi_perform(). + * When the result is != NULL we also implicitly assert + * a valid `self->handle'. + */ + if (self == NULL) + return NULL; + assert(self->ob_type == p_Curl_Type); + if (self->state != NULL) + { + /* inside perform() */ + assert(self->handle != NULL); + if (self->multi_stack != NULL) { + assert(self->multi_stack->state == NULL); + } + return self->state; + } + if (self->multi_stack != NULL && self->multi_stack->state != NULL) + { + /* inside multi_perform() */ + assert(self->handle != NULL); + assert(self->multi_stack->multi_handle != NULL); + assert(self->state == NULL); + return self->multi_stack->state; + } + return NULL; +} + + +/* assert some CurlObject invariants */ +static void +assert_curl_state(const CurlObject *self) +{ + assert(self != NULL); + assert(self->ob_type == p_Curl_Type); + (void) get_thread_state(self); +} + + +/* assert some CurlMultiObject invariants */ +static void +assert_multi_state(const CurlMultiObject *self) +{ + assert(self != NULL); + assert(self->ob_type == p_CurlMulti_Type); + if (self->state != NULL) { + assert(self->multi_handle != NULL); + } +} + + +/* check state for methods */ +static int +check_curl_state(const CurlObject *self, int flags, const char *name) +{ + assert_curl_state(self); + if ((flags & 1) && self->handle == NULL) { + PyErr_Format(ErrorObject, "cannot invoke %s() - no curl handle", name); + return -1; + } + if ((flags & 2) && get_thread_state(self) != NULL) { + PyErr_Format(ErrorObject, "cannot invoke %s() - perform() is currently running", name); + return -1; + } + return 0; +} + +static int +check_multi_state(const CurlMultiObject *self, int flags, const char *name) +{ + assert_multi_state(self); + if ((flags & 1) && self->multi_handle == NULL) { + PyErr_Format(ErrorObject, "cannot invoke %s() - no multi handle", name); + return -1; + } + if ((flags & 2) && self->state != NULL) { + PyErr_Format(ErrorObject, "cannot invoke %s() - multi_perform() is currently running", name); + return -1; + } + return 0; +} + + +/************************************************************************* +// CurlObject +**************************************************************************/ + +/* --------------- construct/destruct (i.e. open/close) --------------- */ + +/* Allocate a new python curl object */ +static CurlObject * +util_curl_new(void) +{ + CurlObject *self; + + self = (CurlObject *) PyObject_GC_New(CurlObject, p_Curl_Type); + if (self == NULL) + return NULL; + PyObject_GC_Track(self); + + /* Set python curl object initial values */ + self->dict = NULL; + self->handle = NULL; + self->state = NULL; + self->multi_stack = NULL; + self->httppost = NULL; + self->httpheader = NULL; + self->http200aliases = NULL; + self->quote = NULL; + self->postquote = NULL; + self->prequote = NULL; + self->source_postquote = NULL; + self->source_prequote = NULL; + + /* Set callback pointers to NULL by default */ + self->w_cb = NULL; + self->h_cb = NULL; + self->r_cb = NULL; + self->pro_cb = NULL; + self->debug_cb = NULL; + self->ioctl_cb = NULL; + + /* Set file object pointers to NULL by default */ + self->readdata_fp = NULL; + self->writedata_fp = NULL; + self->writeheader_fp = NULL; + + /* Zero string pointer memory buffer used by setopt */ + memset(self->options, 0, sizeof(self->options)); + memset(self->error, 0, sizeof(self->error)); + + return self; +} + + +/* constructor - this is a module-level function returning a new instance */ +static CurlObject * +do_curl_new(PyObject *dummy) +{ + CurlObject *self = NULL; + int res; + char *s = NULL; + + UNUSED(dummy); + + /* Allocate python curl object */ + self = util_curl_new(); + if (self == NULL) + return NULL; + + /* Initialize curl handle */ + self->handle = curl_easy_init(); + if (self->handle == NULL) + goto error; + + /* Set curl error buffer and zero it */ + res = curl_easy_setopt(self->handle, CURLOPT_ERRORBUFFER, self->error); + if (res != CURLE_OK) + goto error; + memset(self->error, 0, sizeof(self->error)); + + /* Set backreference */ + res = curl_easy_setopt(self->handle, CURLOPT_PRIVATE, (char *) self); + if (res != CURLE_OK) + goto error; + + /* Enable NOPROGRESS by default, i.e. no progress output */ + res = curl_easy_setopt(self->handle, CURLOPT_NOPROGRESS, (long)1); + if (res != CURLE_OK) + goto error; + + /* Disable VERBOSE by default, i.e. no verbose output */ + res = curl_easy_setopt(self->handle, CURLOPT_VERBOSE, (long)0); + if (res != CURLE_OK) + goto error; + + /* Set FTP_ACCOUNT to NULL by default */ + res = curl_easy_setopt(self->handle, CURLOPT_FTP_ACCOUNT, NULL); + if (res != CURLE_OK) + goto error; + + /* Set default USERAGENT */ + s = (char *) malloc(7 + strlen(LIBCURL_VERSION) + 1); + if (s == NULL) + goto error; + strcpy(s, "PycURL/"); strcpy(s+7, LIBCURL_VERSION); + res = curl_easy_setopt(self->handle, CURLOPT_USERAGENT, (char *) s); + if (res != CURLE_OK) { + free(s); + goto error; + } + self->options[ OPT_INDEX(CURLOPT_USERAGENT) ] = s; s = NULL; + + /* Success - return new object */ + return self; + +error: + Py_DECREF(self); /* this also closes self->handle */ + PyErr_SetString(ErrorObject, "initializing curl failed"); + return NULL; +} + + +/* util function shared by close() and clear() */ +static void +util_curl_xdecref(CurlObject *self, int flags, CURL *handle) +{ + if (flags & 1) { + /* Decrement refcount for attributes dictionary. */ + ZAP(self->dict); + } + + if (flags & 2) { + /* Decrement refcount for multi_stack. */ + if (self->multi_stack != NULL) { + CurlMultiObject *multi_stack = self->multi_stack; + self->multi_stack = NULL; + if (multi_stack->multi_handle != NULL && handle != NULL) { + (void) curl_multi_remove_handle(multi_stack->multi_handle, handle); + } + Py_DECREF(multi_stack); + } + } + + if (flags & 4) { + /* Decrement refcount for python callbacks. */ + ZAP(self->w_cb); + ZAP(self->h_cb); + ZAP(self->r_cb); + ZAP(self->pro_cb); + ZAP(self->debug_cb); + ZAP(self->ioctl_cb); + } + + if (flags & 8) { + /* Decrement refcount for python file objects. */ + ZAP(self->readdata_fp); + ZAP(self->writedata_fp); + ZAP(self->writeheader_fp); + } +} + + +static void +util_curl_close(CurlObject *self) +{ + CURL *handle; + int i; + + /* Zero handle and thread-state to disallow any operations to be run + * from now on */ + assert(self != NULL); + assert(self->ob_type == p_Curl_Type); + handle = self->handle; + self->handle = NULL; + if (handle == NULL) { + /* Some paranoia assertions just to make sure the object + * deallocation problem is finally really fixed... */ + assert(self->state == NULL); + assert(self->multi_stack == NULL); + return; /* already closed */ + } + self->state = NULL; + + /* Decref multi stuff which uses this handle */ + util_curl_xdecref(self, 2, handle); + + /* Cleanup curl handle - must be done without the gil */ + Py_BEGIN_ALLOW_THREADS + curl_easy_cleanup(handle); + Py_END_ALLOW_THREADS + handle = NULL; + + /* Decref callbacks and file handles */ + util_curl_xdecref(self, 4 | 8, handle); + + /* Free all variables allocated by setopt */ +#undef SFREE +#define SFREE(v) if ((v) != NULL) (curl_formfree(v), (v) = NULL) + SFREE(self->httppost); +#undef SFREE +#define SFREE(v) if ((v) != NULL) (curl_slist_free_all(v), (v) = NULL) + SFREE(self->httpheader); + SFREE(self->http200aliases); + SFREE(self->quote); + SFREE(self->postquote); + SFREE(self->prequote); + SFREE(self->source_postquote); + SFREE(self->source_prequote); +#undef SFREE + + /* Last, free the options. This must be done after the curl handle + * is closed since libcurl assumes that some options are valid when + * invoking curl_easy_cleanup(). */ + for (i = 0; i < OPTIONS_SIZE; i++) { + if (self->options[i] != NULL) { + free(self->options[i]); + self->options[i] = NULL; + } + } +} + + +static void +do_curl_dealloc(CurlObject *self) +{ + PyObject_GC_UnTrack(self); + Py_TRASHCAN_SAFE_BEGIN(self) + + ZAP(self->dict); + util_curl_close(self); + + PyObject_GC_Del(self); + Py_TRASHCAN_SAFE_END(self) +} + + +static PyObject * +do_curl_close(CurlObject *self) +{ + if (check_curl_state(self, 2, "close") != 0) { + return NULL; + } + util_curl_close(self); + Py_INCREF(Py_None); + return Py_None; +} + + +static PyObject * +do_curl_errstr(CurlObject *self) +{ + if (check_curl_state(self, 1 | 2, "errstr") != 0) { + return NULL; + } + self->error[sizeof(self->error) - 1] = 0; + return PyString_FromString(self->error); +} + + +/* --------------- GC support --------------- */ + +/* Drop references that may have created reference cycles. */ +static int +do_curl_clear(CurlObject *self) +{ + assert(get_thread_state(self) == NULL); + util_curl_xdecref(self, 1 | 2 | 4 | 8, self->handle); + return 0; +} + +/* Traverse all refcounted objects. */ +static int +do_curl_traverse(CurlObject *self, visitproc visit, void *arg) +{ + int err; +#undef VISIT +#define VISIT(v) if ((v) != NULL && ((err = visit(v, arg)) != 0)) return err + + VISIT(self->dict); + VISIT((PyObject *) self->multi_stack); + + VISIT(self->w_cb); + VISIT(self->h_cb); + VISIT(self->r_cb); + VISIT(self->pro_cb); + VISIT(self->debug_cb); + VISIT(self->ioctl_cb); + + VISIT(self->readdata_fp); + VISIT(self->writedata_fp); + VISIT(self->writeheader_fp); + + return 0; +#undef VISIT +} + + +/* --------------- perform --------------- */ + +static PyObject * +do_curl_perform(CurlObject *self) +{ + int res; + + if (check_curl_state(self, 1 | 2, "perform") != 0) { + return NULL; + } + + /* Save handle to current thread (used as context for python callbacks) */ + self->state = PyThreadState_Get(); + assert(self->state != NULL); + + /* Release global lock and start */ + Py_BEGIN_ALLOW_THREADS + res = curl_easy_perform(self->handle); + Py_END_ALLOW_THREADS + + /* Zero thread-state to disallow callbacks to be run from now on */ + self->state = NULL; + + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + Py_INCREF(Py_None); + return Py_None; +} + + +/* --------------- callback handlers --------------- */ + +/* IMPORTANT NOTE: due to threading issues, we cannot call _any_ Python + * function without acquiring the thread state in the callback handlers. + */ + +static size_t +util_write_callback(int flags, char *ptr, size_t size, size_t nmemb, void *stream) +{ + CurlObject *self; + PyThreadState *tmp_state; + PyObject *arglist; + PyObject *result = NULL; + size_t ret = 0; /* assume error */ + PyObject *cb; + int total_size; + + /* acquire thread */ + self = (CurlObject *)stream; + tmp_state = get_thread_state(self); + if (tmp_state == NULL) + return ret; + PyEval_AcquireThread(tmp_state); + + /* check args */ + cb = flags ? self->h_cb : self->w_cb; + if (cb == NULL) + goto silent_error; + if (size <= 0 || nmemb <= 0) + goto done; + total_size = (int)(size * nmemb); + if (total_size < 0 || (size_t)total_size / size != nmemb) { + PyErr_SetString(ErrorObject, "integer overflow in write callback"); + goto verbose_error; + } + + /* run callback */ + arglist = Py_BuildValue("(s#)", ptr, total_size); + if (arglist == NULL) + goto verbose_error; + result = PyEval_CallObject(cb, arglist); + Py_DECREF(arglist); + if (result == NULL) + goto verbose_error; + + /* handle result */ + if (result == Py_None) { + ret = total_size; /* None means success */ + } + else if (PyInt_Check(result)) { + long obj_size = PyInt_AsLong(result); + if (obj_size < 0 || obj_size > total_size) { + PyErr_Format(ErrorObject, "invalid return value for write callback %ld %ld", (long)obj_size, (long)total_size); + goto verbose_error; + } + ret = (size_t) obj_size; /* success */ + } + else if (PyLong_Check(result)) { + long obj_size = PyLong_AsLong(result); + if (obj_size < 0 || obj_size > total_size) { + PyErr_Format(ErrorObject, "invalid return value for write callback %ld %ld", (long)obj_size, (long)total_size); + goto verbose_error; + } + ret = (size_t) obj_size; /* success */ + } + else { + PyErr_SetString(ErrorObject, "write callback must return int or None"); + goto verbose_error; + } + +done: +silent_error: + Py_XDECREF(result); + PyEval_ReleaseThread(tmp_state); + return ret; +verbose_error: + PyErr_Print(); + goto silent_error; +} + + +static size_t +write_callback(char *ptr, size_t size, size_t nmemb, void *stream) +{ + return util_write_callback(0, ptr, size, nmemb, stream); +} + +static size_t +header_callback(char *ptr, size_t size, size_t nmemb, void *stream) +{ + return util_write_callback(1, ptr, size, nmemb, stream); +} + + +static size_t +read_callback(char *ptr, size_t size, size_t nmemb, void *stream) +{ + CurlObject *self; + PyThreadState *tmp_state; + PyObject *arglist; + PyObject *result = NULL; + + size_t ret = CURL_READFUNC_ABORT; /* assume error, this actually works */ + int total_size; + + /* acquire thread */ + self = (CurlObject *)stream; + tmp_state = get_thread_state(self); + if (tmp_state == NULL) + return ret; + PyEval_AcquireThread(tmp_state); + + /* check args */ + if (self->r_cb == NULL) + goto silent_error; + if (size <= 0 || nmemb <= 0) + goto done; + total_size = (int)(size * nmemb); + if (total_size < 0 || (size_t)total_size / size != nmemb) { + PyErr_SetString(ErrorObject, "integer overflow in read callback"); + goto verbose_error; + } + + /* run callback */ + arglist = Py_BuildValue("(i)", total_size); + if (arglist == NULL) + goto verbose_error; + result = PyEval_CallObject(self->r_cb, arglist); + Py_DECREF(arglist); + if (result == NULL) + goto verbose_error; + + /* handle result */ + if (PyString_Check(result)) { + char *buf = NULL; + int obj_size = -1; + int r; + r = PyString_AsStringAndSize(result, &buf, &obj_size); + if (r != 0 || obj_size < 0 || obj_size > total_size) { + PyErr_Format(ErrorObject, "invalid return value for read callback %ld %ld", (long)obj_size, (long)total_size); + goto verbose_error; + } + memcpy(ptr, buf, obj_size); + ret = obj_size; /* success */ + } + else if (PyInt_Check(result)) { + long r = PyInt_AsLong(result); + if (r != CURL_READFUNC_ABORT) { + goto type_error; + } + /* ret is CURL_READUNC_ABORT */ + } + else if (PyLong_Check(result)) { + long r = PyLong_AsLong(result); + if (r != CURL_READFUNC_ABORT) { + goto type_error; + } + /* ret is CURL_READUNC_ABORT */ + } + else { + type_error: + PyErr_SetString(ErrorObject, "read callback must return string"); + goto verbose_error; + } + +done: +silent_error: + Py_XDECREF(result); + PyEval_ReleaseThread(tmp_state); + return ret; +verbose_error: + PyErr_Print(); + goto silent_error; +} + + +static int +progress_callback(void *stream, + double dltotal, double dlnow, double ultotal, double ulnow) +{ + CurlObject *self; + PyThreadState *tmp_state; + PyObject *arglist; + PyObject *result = NULL; + int ret = 1; /* assume error */ + + /* acquire thread */ + self = (CurlObject *)stream; + tmp_state = get_thread_state(self); + if (tmp_state == NULL) + return ret; + PyEval_AcquireThread(tmp_state); + + /* check args */ + if (self->pro_cb == NULL) + goto silent_error; + + /* run callback */ + arglist = Py_BuildValue("(dddd)", dltotal, dlnow, ultotal, ulnow); + if (arglist == NULL) + goto verbose_error; + result = PyEval_CallObject(self->pro_cb, arglist); + Py_DECREF(arglist); + if (result == NULL) + goto verbose_error; + + /* handle result */ + if (result == Py_None) { + ret = 0; /* None means success */ + } + else if (PyInt_Check(result)) { + ret = (int) PyInt_AsLong(result); + } + else { + ret = PyObject_IsTrue(result); /* FIXME ??? */ + } + +silent_error: + Py_XDECREF(result); + PyEval_ReleaseThread(tmp_state); + return ret; +verbose_error: + PyErr_Print(); + goto silent_error; +} + + +static int +debug_callback(CURL *curlobj, curl_infotype type, + char *buffer, size_t total_size, void *stream) +{ + CurlObject *self; + PyThreadState *tmp_state; + PyObject *arglist; + PyObject *result = NULL; + int ret = 0; /* always success */ + + UNUSED(curlobj); + + /* acquire thread */ + self = (CurlObject *)stream; + tmp_state = get_thread_state(self); + if (tmp_state == NULL) + return ret; + PyEval_AcquireThread(tmp_state); + + /* check args */ + if (self->debug_cb == NULL) + goto silent_error; + if ((int)total_size < 0 || (size_t)((int)total_size) != total_size) { + PyErr_SetString(ErrorObject, "integer overflow in debug callback"); + goto verbose_error; + } + + /* run callback */ + arglist = Py_BuildValue("(is#)", (int)type, buffer, (int)total_size); + if (arglist == NULL) + goto verbose_error; + result = PyEval_CallObject(self->debug_cb, arglist); + Py_DECREF(arglist); + if (result == NULL) + goto verbose_error; + + /* return values from debug callbacks should be ignored */ + +silent_error: + Py_XDECREF(result); + PyEval_ReleaseThread(tmp_state); + return ret; +verbose_error: + PyErr_Print(); + goto silent_error; +} + + +static curlioerr +ioctl_callback(CURL *curlobj, int cmd, void *stream) +{ + CurlObject *self; + PyThreadState *tmp_state; + PyObject *arglist; + PyObject *result = NULL; + int ret = CURLIOE_FAILRESTART; /* assume error */ + + UNUSED(curlobj); + + /* acquire thread */ + self = (CurlObject *)stream; + tmp_state = get_thread_state(self); + if (tmp_state == NULL) + return (curlioerr) ret; + PyEval_AcquireThread(tmp_state); + + /* check args */ + if (self->ioctl_cb == NULL) + goto silent_error; + + /* run callback */ + arglist = Py_BuildValue("(i)", (int)cmd); + if (arglist == NULL) + goto verbose_error; + result = PyEval_CallObject(self->ioctl_cb, arglist); + Py_DECREF(arglist); + if (result == NULL) + goto verbose_error; + + /* handle result */ + if (result == Py_None) { + ret = CURLIOE_OK; /* None means success */ + } + else if (PyInt_Check(result)) { + ret = (int) PyInt_AsLong(result); + if (ret >= CURLIOE_LAST || ret < 0) { + PyErr_SetString(ErrorObject, "ioctl callback returned invalid value"); + goto verbose_error; + } + } + +silent_error: + Py_XDECREF(result); + PyEval_ReleaseThread(tmp_state); + return (curlioerr) ret; +verbose_error: + PyErr_Print(); + goto silent_error; +} + + +/* --------------- unsetopt/setopt/getinfo --------------- */ + +static PyObject * +util_curl_unsetopt(CurlObject *self, int option) +{ + int res; + int opt_index = -1; + +#define SETOPT2(o,x) \ + if ((res = curl_easy_setopt(self->handle, (o), (x))) != CURLE_OK) goto error +#define SETOPT(x) SETOPT2((CURLoption)option, (x)) + + /* FIXME: implement more options. Have to carefully check lib/url.c in the + * libcurl source code to see if it's actually safe to simply + * unset the option. */ + switch (option) + { + case CURLOPT_HTTPPOST: + SETOPT((void *) 0); + curl_formfree(self->httppost); + self->httppost = NULL; + /* FIXME: what about data->set.httpreq ?? */ + break; + case CURLOPT_INFILESIZE: + SETOPT((long) -1); + break; + case CURLOPT_WRITEHEADER: + SETOPT((void *) 0); + ZAP(self->writeheader_fp); + break; + case CURLOPT_CAINFO: + case CURLOPT_CAPATH: + case CURLOPT_COOKIE: + case CURLOPT_COOKIEJAR: + case CURLOPT_CUSTOMREQUEST: + case CURLOPT_EGDSOCKET: + case CURLOPT_FTPPORT: + case CURLOPT_PROXYUSERPWD: + case CURLOPT_RANDOM_FILE: + case CURLOPT_SSL_CIPHER_LIST: + case CURLOPT_USERPWD: + SETOPT((char *) 0); + opt_index = OPT_INDEX(option); + break; + + /* info: we explicitly list unsupported options here */ + case CURLOPT_COOKIEFILE: + default: + PyErr_SetString(PyExc_TypeError, "unsetopt() is not supported for this option"); + return NULL; + } + + if (opt_index >= 0 && self->options[opt_index] != NULL) { + free(self->options[opt_index]); + self->options[opt_index] = NULL; + } + + Py_INCREF(Py_None); + return Py_None; + +error: + CURLERROR_RETVAL(); + +#undef SETOPT +#undef SETOPT2 +} + + +static PyObject * +do_curl_unsetopt(CurlObject *self, PyObject *args) +{ + int option; + + if (!PyArg_ParseTuple(args, "i:unsetopt", &option)) { + return NULL; + } + if (check_curl_state(self, 1 | 2, "unsetopt") != 0) { + return NULL; + } + + /* early checks of option value */ + if (option <= 0) + goto error; + if (option >= (int)CURLOPTTYPE_OFF_T + OPTIONS_SIZE) + goto error; + if (option % 10000 >= OPTIONS_SIZE) + goto error; + + return util_curl_unsetopt(self, option); + +error: + PyErr_SetString(PyExc_TypeError, "invalid arguments to unsetopt"); + return NULL; +} + + +static PyObject * +do_curl_setopt(CurlObject *self, PyObject *args) +{ + int option; + PyObject *obj; + int res; + + if (!PyArg_ParseTuple(args, "iO:setopt", &option, &obj)) + return NULL; + if (check_curl_state(self, 1 | 2, "setopt") != 0) + return NULL; + + /* early checks of option value */ + if (option <= 0) + goto error; + if (option >= (int)CURLOPTTYPE_OFF_T + OPTIONS_SIZE) + goto error; + if (option % 10000 >= OPTIONS_SIZE) + goto error; + +#if 0 /* XXX - should we ??? */ + /* Handle the case of None */ + if (obj == Py_None) { + return util_curl_unsetopt(self, option); + } +#endif + + /* Handle the case of string arguments */ + if (PyString_Check(obj)) { + char *str = NULL; + int len = -1; + char *buf; + int opt_index; + + /* Check that the option specified a string as well as the input */ + switch (option) { + case CURLOPT_CAINFO: + case CURLOPT_CAPATH: + case CURLOPT_COOKIE: + case CURLOPT_COOKIEFILE: + case CURLOPT_COOKIEJAR: + case CURLOPT_CUSTOMREQUEST: + case CURLOPT_EGDSOCKET: + case CURLOPT_ENCODING: + case CURLOPT_FTPPORT: + case CURLOPT_INTERFACE: + case CURLOPT_KRB4LEVEL: + case CURLOPT_NETRC_FILE: + case CURLOPT_PROXY: + case CURLOPT_PROXYUSERPWD: + case CURLOPT_RANDOM_FILE: + case CURLOPT_RANGE: + case CURLOPT_REFERER: + case CURLOPT_SSLCERT: + case CURLOPT_SSLCERTTYPE: + case CURLOPT_SSLENGINE: + case CURLOPT_SSLKEY: + case CURLOPT_SSLKEYPASSWD: + case CURLOPT_SSLKEYTYPE: + case CURLOPT_SSL_CIPHER_LIST: + case CURLOPT_URL: + case CURLOPT_USERAGENT: + case CURLOPT_USERPWD: + case CURLOPT_SOURCE_HOST: + case CURLOPT_SOURCE_USERPWD: + case CURLOPT_SOURCE_PATH: +/* FIXME: check if more of these options allow binary data */ + str = PyString_AsString_NoNUL(obj); + if (str == NULL) + return NULL; + break; + case CURLOPT_POSTFIELDS: + if (PyString_AsStringAndSize(obj, &str, &len) != 0) + return NULL; + /* automatically set POSTFIELDSIZE */ + res = curl_easy_setopt(self->handle, CURLOPT_POSTFIELDSIZE, (long)len); + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + break; + default: + PyErr_SetString(PyExc_TypeError, "strings are not supported for this option"); + return NULL; + } + /* Allocate memory to hold the string */ + assert(str != NULL); + if (len <= 0) + buf = strdup(str); + else { + buf = (char *) malloc(len); + if (buf) memcpy(buf, str, len); + } + if (buf == NULL) + return PyErr_NoMemory(); + /* Call setopt */ + res = curl_easy_setopt(self->handle, (CURLoption)option, buf); + /* Check for errors */ + if (res != CURLE_OK) { + free(buf); + CURLERROR_RETVAL(); + } + /* Save allocated option buffer */ + opt_index = OPT_INDEX(option); + if (self->options[opt_index] != NULL) { + free(self->options[opt_index]); + self->options[opt_index] = NULL; + } + self->options[opt_index] = buf; + Py_INCREF(Py_None); + return Py_None; + } + +#define IS_LONG_OPTION(o) (o < CURLOPTTYPE_OBJECTPOINT) +#define IS_OFF_T_OPTION(o) (o >= CURLOPTTYPE_OFF_T) + + /* Handle the case of integer arguments */ + if (PyInt_Check(obj)) { + long d = PyInt_AsLong(obj); + + if (IS_LONG_OPTION(option)) + res = curl_easy_setopt(self->handle, (CURLoption)option, (long)d); + else if (IS_OFF_T_OPTION(option)) + res = curl_easy_setopt(self->handle, (CURLoption)option, (curl_off_t)d); + else { + PyErr_SetString(PyExc_TypeError, "integers are not supported for this option"); + return NULL; + } + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + Py_INCREF(Py_None); + return Py_None; + } + + /* Handle the case of long arguments (used by *_LARGE options) */ + if (PyLong_Check(obj)) { + PY_LONG_LONG d = PyLong_AsLongLong(obj); + if (d == -1 && PyErr_Occurred()) + return NULL; + + if (IS_LONG_OPTION(option) && (long)d == d) + res = curl_easy_setopt(self->handle, (CURLoption)option, (long)d); + else if (IS_OFF_T_OPTION(option) && (curl_off_t)d == d) + res = curl_easy_setopt(self->handle, (CURLoption)option, (curl_off_t)d); + else { + PyErr_SetString(PyExc_TypeError, "longs are not supported for this option"); + return NULL; + } + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + Py_INCREF(Py_None); + return Py_None; + } + +#undef IS_LONG_OPTION +#undef IS_OFF_T_OPTION + + /* Handle the case of file objects */ + if (PyFile_Check(obj)) { + FILE *fp; + + /* Ensure the option specified a file as well as the input */ + switch (option) { + case CURLOPT_READDATA: + case CURLOPT_WRITEDATA: + break; + case CURLOPT_WRITEHEADER: + if (self->w_cb != NULL) { + PyErr_SetString(ErrorObject, "cannot combine WRITEHEADER with WRITEFUNCTION."); + return NULL; + } + break; + default: + PyErr_SetString(PyExc_TypeError, "files are not supported for this option"); + return NULL; + } + + fp = PyFile_AsFile(obj); + if (fp == NULL) { + PyErr_SetString(PyExc_TypeError, "second argument must be open file"); + return NULL; + } + res = curl_easy_setopt(self->handle, (CURLoption)option, fp); + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + Py_INCREF(obj); + + switch (option) { + case CURLOPT_READDATA: + ZAP(self->readdata_fp); + self->readdata_fp = obj; + break; + case CURLOPT_WRITEDATA: + ZAP(self->writedata_fp); + self->writedata_fp = obj; + break; + case CURLOPT_WRITEHEADER: + ZAP(self->writeheader_fp); + self->writeheader_fp = obj; + break; + default: + assert(0); + break; + } + /* Return success */ + Py_INCREF(Py_None); + return Py_None; + } + + /* Handle the case of list objects */ + if (PyList_Check(obj)) { + struct curl_slist **old_slist = NULL; + struct curl_slist *slist = NULL; + int i, len; + + switch (option) { + case CURLOPT_HTTP200ALIASES: + old_slist = &self->http200aliases; + break; + case CURLOPT_HTTPHEADER: + old_slist = &self->httpheader; + break; + case CURLOPT_QUOTE: + old_slist = &self->quote; + break; + case CURLOPT_POSTQUOTE: + old_slist = &self->postquote; + break; + case CURLOPT_PREQUOTE: + old_slist = &self->prequote; + break; + case CURLOPT_SOURCE_PREQUOTE: + old_slist = &self->source_prequote; + break; + case CURLOPT_SOURCE_POSTQUOTE: + old_slist = &self->source_postquote; + break; + case CURLOPT_HTTPPOST: + break; + default: + /* None of the list options were recognized, throw exception */ + PyErr_SetString(PyExc_TypeError, "lists are not supported for this option"); + return NULL; + } + + len = PyList_Size(obj); + if (len == 0) { + /* Empty list - do nothing */ + Py_INCREF(Py_None); + return Py_None; + } + + /* Handle HTTPPOST different since we construct a HttpPost form struct */ + if (option == CURLOPT_HTTPPOST) { + struct curl_httppost *post = NULL; + struct curl_httppost *last = NULL; + + for (i = 0; i < len; i++) { + char *nstr = NULL, *cstr = NULL; + int nlen = -1, clen = -1; + PyObject *listitem = PyList_GetItem(obj, i); + + if (!PyTuple_Check(listitem)) { + curl_formfree(post); + PyErr_SetString(PyExc_TypeError, "list items must be tuple objects"); + return NULL; + } + if (PyTuple_GET_SIZE(listitem) != 2) { + curl_formfree(post); + PyErr_SetString(PyExc_TypeError, "tuple must contain two elements (name, value)"); + return NULL; + } + if (PyString_AsStringAndSize(PyTuple_GET_ITEM(listitem, 0), &nstr, &nlen) != 0) { + curl_formfree(post); + PyErr_SetString(PyExc_TypeError, "tuple must contain string as first element"); + return NULL; + } + if (PyString_Check(PyTuple_GET_ITEM(listitem, 1))) { + /* Handle strings as second argument for backwards compatibility */ + PyString_AsStringAndSize(PyTuple_GET_ITEM(listitem, 1), &cstr, &clen); + /* INFO: curl_formadd() internally does memdup() the data, so + * embedded NUL characters _are_ allowed here. */ + res = curl_formadd(&post, &last, + CURLFORM_COPYNAME, nstr, + CURLFORM_NAMELENGTH, (long) nlen, + CURLFORM_COPYCONTENTS, cstr, + CURLFORM_CONTENTSLENGTH, (long) clen, + CURLFORM_END); + if (res != CURLE_OK) { + curl_formfree(post); + CURLERROR_RETVAL(); + } + } + else if (PyTuple_Check(PyTuple_GET_ITEM(listitem, 1))) { + /* Supports content, file and content-type */ + PyObject *t = PyTuple_GET_ITEM(listitem, 1); + int tlen = PyTuple_Size(t); + int j, k, l; + struct curl_forms *forms = NULL; + + /* Sanity check that there are at least two tuple items */ + if (tlen < 2) { + curl_formfree(post); + PyErr_SetString(PyExc_TypeError, "tuple must contain at least one option and one value"); + return NULL; + } + + /* Allocate enough space to accommodate length options for content */ + forms = PyMem_Malloc(sizeof(struct curl_forms) * ((tlen*2) + 1)); + if (forms == NULL) { + curl_formfree(post); + PyErr_NoMemory(); + return NULL; + } + + /* Iterate all the tuple members pairwise */ + for (j = 0, k = 0, l = 0; j < tlen; j += 2, l++) { + char *ostr; + int olen, val; + + if (j == (tlen-1)) { + PyErr_SetString(PyExc_TypeError, "expected value"); + PyMem_Free(forms); + curl_formfree(post); + return NULL; + } + if (!PyInt_Check(PyTuple_GET_ITEM(t, j))) { + PyErr_SetString(PyExc_TypeError, "option must be long"); + PyMem_Free(forms); + curl_formfree(post); + return NULL; + } + if (!PyString_Check(PyTuple_GET_ITEM(t, j+1))) { + PyErr_SetString(PyExc_TypeError, "value must be string"); + PyMem_Free(forms); + curl_formfree(post); + return NULL; + } + + val = PyLong_AsLong(PyTuple_GET_ITEM(t, j)); + if (val != CURLFORM_COPYCONTENTS && + val != CURLFORM_FILE && + val != CURLFORM_CONTENTTYPE) + { + PyErr_SetString(PyExc_TypeError, "unsupported option"); + PyMem_Free(forms); + curl_formfree(post); + return NULL; + } + PyString_AsStringAndSize(PyTuple_GET_ITEM(t, j+1), &ostr, &olen); + forms[k].option = val; + forms[k].value = ostr; + ++k; + if (val == CURLFORM_COPYCONTENTS) { + /* Contents can contain \0 bytes so we specify the length */ + forms[k].option = CURLFORM_CONTENTSLENGTH; + forms[k].value = (char *)olen; + ++k; + } + } + forms[k].option = CURLFORM_END; + res = curl_formadd(&post, &last, + CURLFORM_COPYNAME, nstr, + CURLFORM_NAMELENGTH, (long) nlen, + CURLFORM_ARRAY, forms, + CURLFORM_END); + PyMem_Free(forms); + if (res != CURLE_OK) { + curl_formfree(post); + CURLERROR_RETVAL(); + } + } else { + /* Some other type was given, ignore */ + curl_formfree(post); + PyErr_SetString(PyExc_TypeError, "unsupported second type in tuple"); + return NULL; + } + } + res = curl_easy_setopt(self->handle, CURLOPT_HTTPPOST, post); + /* Check for errors */ + if (res != CURLE_OK) { + curl_formfree(post); + CURLERROR_RETVAL(); + } + /* Finally, free previously allocated httppost and update */ + curl_formfree(self->httppost); + self->httppost = post; + + Py_INCREF(Py_None); + return Py_None; + } + + /* Just to be sure we do not bug off here */ + assert(old_slist != NULL && slist == NULL); + + /* Handle regular list operations on the other options */ + for (i = 0; i < len; i++) { + PyObject *listitem = PyList_GetItem(obj, i); + struct curl_slist *nlist; + char *str; + + if (!PyString_Check(listitem)) { + curl_slist_free_all(slist); + PyErr_SetString(PyExc_TypeError, "list items must be string objects"); + return NULL; + } + /* INFO: curl_slist_append() internally does strdup() the data, so + * no embedded NUL characters allowed here. */ + str = PyString_AsString_NoNUL(listitem); + if (str == NULL) { + curl_slist_free_all(slist); + return NULL; + } + nlist = curl_slist_append(slist, str); + if (nlist == NULL || nlist->data == NULL) { + curl_slist_free_all(slist); + return PyErr_NoMemory(); + } + slist = nlist; + } + res = curl_easy_setopt(self->handle, (CURLoption)option, slist); + /* Check for errors */ + if (res != CURLE_OK) { + curl_slist_free_all(slist); + CURLERROR_RETVAL(); + } + /* Finally, free previously allocated list and update */ + curl_slist_free_all(*old_slist); + *old_slist = slist; + + Py_INCREF(Py_None); + return Py_None; + } + + /* Handle the case of function objects for callbacks */ + if (PyFunction_Check(obj) || PyCFunction_Check(obj) || PyMethod_Check(obj)) { + /* We use function types here to make sure that our callback + * definitions exactly match the interface. + */ + const curl_write_callback w_cb = write_callback; + const curl_write_callback h_cb = header_callback; + const curl_read_callback r_cb = read_callback; + const curl_progress_callback pro_cb = progress_callback; + const curl_debug_callback debug_cb = debug_callback; + const curl_ioctl_callback ioctl_cb = ioctl_callback; + + switch(option) { + case CURLOPT_WRITEFUNCTION: + if (self->writeheader_fp != NULL) { + PyErr_SetString(ErrorObject, "cannot combine WRITEFUNCTION with WRITEHEADER option."); + return NULL; + } + Py_INCREF(obj); + ZAP(self->writedata_fp); + ZAP(self->w_cb); + self->w_cb = obj; + curl_easy_setopt(self->handle, CURLOPT_WRITEFUNCTION, w_cb); + curl_easy_setopt(self->handle, CURLOPT_WRITEDATA, self); + break; + case CURLOPT_HEADERFUNCTION: + Py_INCREF(obj); + ZAP(self->h_cb); + self->h_cb = obj; + curl_easy_setopt(self->handle, CURLOPT_HEADERFUNCTION, h_cb); + curl_easy_setopt(self->handle, CURLOPT_WRITEHEADER, self); + break; + case CURLOPT_READFUNCTION: + Py_INCREF(obj); + ZAP(self->readdata_fp); + ZAP(self->r_cb); + self->r_cb = obj; + curl_easy_setopt(self->handle, CURLOPT_READFUNCTION, r_cb); + curl_easy_setopt(self->handle, CURLOPT_READDATA, self); + break; + case CURLOPT_PROGRESSFUNCTION: + Py_INCREF(obj); + ZAP(self->pro_cb); + self->pro_cb = obj; + curl_easy_setopt(self->handle, CURLOPT_PROGRESSFUNCTION, pro_cb); + curl_easy_setopt(self->handle, CURLOPT_PROGRESSDATA, self); + break; + case CURLOPT_DEBUGFUNCTION: + Py_INCREF(obj); + ZAP(self->debug_cb); + self->debug_cb = obj; + curl_easy_setopt(self->handle, CURLOPT_DEBUGFUNCTION, debug_cb); + curl_easy_setopt(self->handle, CURLOPT_DEBUGDATA, self); + break; + case CURLOPT_IOCTLFUNCTION: + Py_INCREF(obj); + ZAP(self->ioctl_cb); + self->ioctl_cb = obj; + curl_easy_setopt(self->handle, CURLOPT_IOCTLFUNCTION, ioctl_cb); + curl_easy_setopt(self->handle, CURLOPT_IOCTLDATA, self); + break; + + default: + /* None of the function options were recognized, throw exception */ + PyErr_SetString(PyExc_TypeError, "functions are not supported for this option"); + return NULL; + } + Py_INCREF(Py_None); + return Py_None; + } + + /* Failed to match any of the function signatures -- return error */ +error: + PyErr_SetString(PyExc_TypeError, "invalid arguments to setopt"); + return NULL; +} + + +static PyObject * +do_curl_getinfo(CurlObject *self, PyObject *args) +{ + int option; + int res; + + if (!PyArg_ParseTuple(args, "i:getinfo", &option)) { + return NULL; + } + if (check_curl_state(self, 1 | 2, "getinfo") != 0) { + return NULL; + } + + switch (option) { + case CURLINFO_FILETIME: + case CURLINFO_HEADER_SIZE: + case CURLINFO_HTTP_CODE: + case CURLINFO_REDIRECT_COUNT: + case CURLINFO_REQUEST_SIZE: + case CURLINFO_SSL_VERIFYRESULT: + case CURLINFO_HTTP_CONNECTCODE: + case CURLINFO_HTTPAUTH_AVAIL: + case CURLINFO_PROXYAUTH_AVAIL: + case CURLINFO_OS_ERRNO: + case CURLINFO_NUM_CONNECTS: + { + /* Return PyInt as result */ + long l_res = -1; + + res = curl_easy_getinfo(self->handle, (CURLINFO)option, &l_res); + /* Check for errors and return result */ + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + return PyInt_FromLong(l_res); + } + + case CURLINFO_CONTENT_TYPE: + case CURLINFO_EFFECTIVE_URL: + { + /* Return PyString as result */ + char *s_res = NULL; + + res = curl_easy_getinfo(self->handle, (CURLINFO)option, &s_res); + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + /* If the resulting string is NULL, return None */ + if (s_res == NULL) { + Py_INCREF(Py_None); + return Py_None; + } + return PyString_FromString(s_res); + } + + case CURLINFO_CONNECT_TIME: + case CURLINFO_CONTENT_LENGTH_DOWNLOAD: + case CURLINFO_CONTENT_LENGTH_UPLOAD: + case CURLINFO_NAMELOOKUP_TIME: + case CURLINFO_PRETRANSFER_TIME: + case CURLINFO_REDIRECT_TIME: + case CURLINFO_SIZE_DOWNLOAD: + case CURLINFO_SIZE_UPLOAD: + case CURLINFO_SPEED_DOWNLOAD: + case CURLINFO_SPEED_UPLOAD: + case CURLINFO_STARTTRANSFER_TIME: + case CURLINFO_TOTAL_TIME: + { + /* Return PyFloat as result */ + double d_res = 0.0; + + res = curl_easy_getinfo(self->handle, (CURLINFO)option, &d_res); + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + return PyFloat_FromDouble(d_res); + } + + case CURLINFO_SSL_ENGINES: + { + /* Return a list of strings */ + struct curl_slist *slist = NULL; + + res = curl_easy_getinfo(self->handle, (CURLINFO)option, &slist); + if (res != CURLE_OK) { + CURLERROR_RETVAL(); + } + return convert_slist(slist, 1 | 2); + } + } + + /* Got wrong option on the method call */ + PyErr_SetString(PyExc_ValueError, "invalid argument to getinfo"); + return NULL; +} + + +/************************************************************************* +// CurlMultiObject +**************************************************************************/ + +/* --------------- construct/destruct (i.e. open/close) --------------- */ + +/* constructor - this is a module-level function returning a new instance */ +static CurlMultiObject * +do_multi_new(PyObject *dummy) +{ + CurlMultiObject *self; + + UNUSED(dummy); + + /* Allocate python curl-multi object */ + self = (CurlMultiObject *) PyObject_GC_New(CurlMultiObject, p_CurlMulti_Type); + if (self) { + PyObject_GC_Track(self); + } + else { + return NULL; + } + + /* Initialize object attributes */ + self->dict = NULL; + self->state = NULL; + + /* Allocate libcurl multi handle */ + self->multi_handle = curl_multi_init(); + if (self->multi_handle == NULL) { + Py_DECREF(self); + PyErr_SetString(ErrorObject, "initializing curl-multi failed"); + return NULL; + } + return self; +} + + +static void +util_multi_close(CurlMultiObject *self) +{ + assert(self != NULL); + self->state = NULL; + if (self->multi_handle != NULL) { + CURLM *multi_handle = self->multi_handle; + self->multi_handle = NULL; + curl_multi_cleanup(multi_handle); + } +} + + +static void +do_multi_dealloc(CurlMultiObject *self) +{ + PyObject_GC_UnTrack(self); + Py_TRASHCAN_SAFE_BEGIN(self) + + ZAP(self->dict); + util_multi_close(self); + + PyObject_GC_Del(self); + Py_TRASHCAN_SAFE_END(self) +} + + +static PyObject * +do_multi_close(CurlMultiObject *self) +{ + if (check_multi_state(self, 2, "close") != 0) { + return NULL; + } + util_multi_close(self); + Py_INCREF(Py_None); + return Py_None; +} + + +/* --------------- GC support --------------- */ + +/* Drop references that may have created reference cycles. */ +static int +do_multi_clear(CurlMultiObject *self) +{ + ZAP(self->dict); + return 0; +} + +static int +do_multi_traverse(CurlMultiObject *self, visitproc visit, void *arg) +{ + int err; +#undef VISIT +#define VISIT(v) if ((v) != NULL && ((err = visit(v, arg)) != 0)) return err + + VISIT(self->dict); + + return 0; +#undef VISIT +} + +/* --------------- perform --------------- */ + + +static PyObject * +do_multi_perform(CurlMultiObject *self) +{ + CURLMcode res; + int running = -1; + + if (check_multi_state(self, 1 | 2, "perform") != 0) { + return NULL; + } + + /* Release global lock and start */ + self->state = PyThreadState_Get(); + assert(self->state != NULL); + Py_BEGIN_ALLOW_THREADS + res = curl_multi_perform(self->multi_handle, &running); + Py_END_ALLOW_THREADS + self->state = NULL; + + /* We assume these errors are ok, otherwise throw exception */ + if (res != CURLM_OK && res != CURLM_CALL_MULTI_PERFORM) { + CURLERROR_MSG("perform failed"); + } + + /* Return a tuple with the result and the number of running handles */ + return Py_BuildValue("(ii)", (int)res, running); +} + + +/* --------------- add_handle/remove_handle --------------- */ + +/* static utility function */ +static int +check_multi_add_remove(const CurlMultiObject *self, const CurlObject *obj) +{ + /* check CurlMultiObject status */ + assert_multi_state(self); + if (self->multi_handle == NULL) { + PyErr_SetString(ErrorObject, "cannot add/remove handle - multi-stack is closed"); + return -1; + } + if (self->state != NULL) { + PyErr_SetString(ErrorObject, "cannot add/remove handle - multi_perform() already running"); + return -1; + } + /* check CurlObject status */ + assert_curl_state(obj); + if (obj->state != NULL) { + PyErr_SetString(ErrorObject, "cannot add/remove handle - perform() of curl object already running"); + return -1; + } + if (obj->multi_stack != NULL && obj->multi_stack != self) { + PyErr_SetString(ErrorObject, "cannot add/remove handle - curl object already on another multi-stack"); + return -1; + } + return 0; +} + + +static PyObject * +do_multi_add_handle(CurlMultiObject *self, PyObject *args) +{ + CurlObject *obj; + CURLMcode res; + + if (!PyArg_ParseTuple(args, "O!:add_handle", p_Curl_Type, &obj)) { + return NULL; + } + if (check_multi_add_remove(self, obj) != 0) { + return NULL; + } + if (obj->handle == NULL) { + PyErr_SetString(ErrorObject, "curl object already closed"); + return NULL; + } + if (obj->multi_stack == self) { + PyErr_SetString(ErrorObject, "curl object already on this multi-stack"); + return NULL; + } + assert(obj->multi_stack == NULL); + res = curl_multi_add_handle(self->multi_handle, obj->handle); + if (res != CURLM_OK) { + CURLERROR_MSG("curl_multi_add_handle() failed due to internal errors"); + } + obj->multi_stack = self; + Py_INCREF(self); + Py_INCREF(Py_None); + return Py_None; +} + + +static PyObject * +do_multi_remove_handle(CurlMultiObject *self, PyObject *args) +{ + CurlObject *obj; + CURLMcode res; + + if (!PyArg_ParseTuple(args, "O!:remove_handle", p_Curl_Type, &obj)) { + return NULL; + } + if (check_multi_add_remove(self, obj) != 0) { + return NULL; + } + if (obj->handle == NULL) { + /* CurlObject handle already closed -- ignore */ + goto done; + } + if (obj->multi_stack != self) { + PyErr_SetString(ErrorObject, "curl object not on this multi-stack"); + return NULL; + } + res = curl_multi_remove_handle(self->multi_handle, obj->handle); + if (res != CURLM_OK) { + CURLERROR_MSG("curl_multi_remove_handle() failed due to internal errors"); + } + assert(obj->multi_stack == self); + obj->multi_stack = NULL; + Py_DECREF(self); +done: + Py_INCREF(Py_None); + return Py_None; +} + + +/* --------------- fdset ---------------------- */ + +static PyObject * +do_multi_fdset(CurlMultiObject *self) +{ + CURLMcode res; + int max_fd = -1, fd; + PyObject *ret = NULL; + PyObject *read_list = NULL, *write_list = NULL, *except_list = NULL; + PyObject *py_fd = NULL; + + if (check_multi_state(self, 1 | 2, "fdset") != 0) { + return NULL; + } + + /* Clear file descriptor sets */ + FD_ZERO(&self->read_fd_set); + FD_ZERO(&self->write_fd_set); + FD_ZERO(&self->exc_fd_set); + + /* Don't bother releasing the gil as this is just a data structure operation */ + res = curl_multi_fdset(self->multi_handle, &self->read_fd_set, + &self->write_fd_set, &self->exc_fd_set, &max_fd); + if (res != CURLM_OK || max_fd < 0) { + CURLERROR_MSG("curl_multi_fdset() failed due to internal errors"); + } + + /* Allocate lists. */ + if ((read_list = PyList_New(0)) == NULL) goto error; + if ((write_list = PyList_New(0)) == NULL) goto error; + if ((except_list = PyList_New(0)) == NULL) goto error; + + /* Populate lists */ + for (fd = 0; fd < max_fd + 1; fd++) { + if (FD_ISSET(fd, &self->read_fd_set)) { + if ((py_fd = PyInt_FromLong((long)fd)) == NULL) goto error; + if (PyList_Append(read_list, py_fd) != 0) goto error; + Py_DECREF(py_fd); + py_fd = NULL; + } + if (FD_ISSET(fd, &self->write_fd_set)) { + if ((py_fd = PyInt_FromLong((long)fd)) == NULL) goto error; + if (PyList_Append(write_list, py_fd) != 0) goto error; + Py_DECREF(py_fd); + py_fd = NULL; + } + if (FD_ISSET(fd, &self->exc_fd_set)) { + if ((py_fd = PyInt_FromLong((long)fd)) == NULL) goto error; + if (PyList_Append(except_list, py_fd) != 0) goto error; + Py_DECREF(py_fd); + py_fd = NULL; + } + } + + /* Return a tuple with the 3 lists */ + ret = Py_BuildValue("(OOO)", read_list, write_list, except_list); +error: + Py_XDECREF(py_fd); + Py_XDECREF(except_list); + Py_XDECREF(write_list); + Py_XDECREF(read_list); + return ret; +} + + +/* --------------- info_read --------------- */ + +static PyObject * +do_multi_info_read(CurlMultiObject *self, PyObject *args) +{ + PyObject *ret = NULL; + PyObject *ok_list = NULL, *err_list = NULL; + CURLMsg *msg; + int in_queue = 0, num_results = INT_MAX; + + /* Sanity checks */ + if (!PyArg_ParseTuple(args, "|i:info_read", &num_results)) { + return NULL; + } + if (num_results <= 0) { + PyErr_SetString(ErrorObject, "argument to info_read must be greater than zero"); + return NULL; + } + if (check_multi_state(self, 1 | 2, "info_read") != 0) { + return NULL; + } + + if ((ok_list = PyList_New(0)) == NULL) goto error; + if ((err_list = PyList_New(0)) == NULL) goto error; + + /* Loop through all messages */ + while ((msg = curl_multi_info_read(self->multi_handle, &in_queue)) != NULL) { + CURLcode res; + CurlObject *co = NULL; + + /* Check for termination as specified by the user */ + if (num_results-- <= 0) { + break; + } + + /* Fetch the curl object that corresponds to the curl handle in the message */ + res = curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &co); + if (res != CURLE_OK || co == NULL) { + Py_DECREF(err_list); + Py_DECREF(ok_list); + CURLERROR_MSG("Unable to fetch curl handle from curl object"); + } + assert(co->ob_type == p_Curl_Type); + if (msg->msg != CURLMSG_DONE) { + /* FIXME: what does this mean ??? */ + } + if (msg->data.result == CURLE_OK) { + /* Append curl object to list of objects which succeeded */ + if (PyList_Append(ok_list, (PyObject *)co) != 0) { + goto error; + } + } + else { + /* Create a result tuple that will get added to err_list. */ + PyObject *v = Py_BuildValue("(Ois)", (PyObject *)co, (int)msg->data.result, co->error); + /* Append curl object to list of objects which failed */ + if (v == NULL || PyList_Append(err_list, v) != 0) { + Py_XDECREF(v); + goto error; + } + Py_DECREF(v); + } + } + /* Return (number of queued messages, [ok_objects], [error_objects]) */ + ret = Py_BuildValue("(iOO)", in_queue, ok_list, err_list); +error: + Py_XDECREF(err_list); + Py_XDECREF(ok_list); + return ret; +} + + +/* --------------- select --------------- */ + +static PyObject * +do_multi_select(CurlMultiObject *self, PyObject *args) +{ + int max_fd = -1, n; + double timeout = -1.0; + struct timeval tv, *tvp; + CURLMcode res; + + if (!PyArg_ParseTuple(args, "|d:select", &timeout)) { + return NULL; + } + if (check_multi_state(self, 1 | 2, "select") != 0) { + return NULL; + } + + if (timeout == -1.0) { + /* no timeout given - wait forever */ + tvp = NULL; + } else if (timeout < 0 || timeout >= 365 * 24 * 60 * 60) { + PyErr_SetString(PyExc_OverflowError, "invalid timeout period"); + return NULL; + } else { + long seconds = (long)timeout; + timeout = timeout - (double)seconds; + assert(timeout >= 0.0); assert(timeout < 1.0); + tv.tv_sec = seconds; + tv.tv_usec = (long)(timeout*1000000.0); + tvp = &tv; + } + + FD_ZERO(&self->read_fd_set); + FD_ZERO(&self->write_fd_set); + FD_ZERO(&self->exc_fd_set); + + res = curl_multi_fdset(self->multi_handle, &self->read_fd_set, + &self->write_fd_set, &self->exc_fd_set, &max_fd); + if (res != CURLM_OK) { + CURLERROR_MSG("multi_fdset failed"); + } + + if (max_fd < 0) { + n = 0; + } + else { + Py_BEGIN_ALLOW_THREADS + n = select(max_fd + 1, &self->read_fd_set, &self->write_fd_set, &self->exc_fd_set, tvp); + Py_END_ALLOW_THREADS + /* info: like Python's socketmodule.c we do not raise an exception + * if select() fails - we'll leave it to the actual libcurl + * socket code to report any errors. + */ + } + + return PyInt_FromLong(n); +} + + +/************************************************************************* +// type definitions +**************************************************************************/ + +/* --------------- methods --------------- */ + +static char co_close_doc [] = "close() -> None. Close handle and end curl session.\n"; +static char co_errstr_doc [] = "errstr() -> String. Return the internal libcurl error buffer string.\n"; +static char co_getinfo_doc [] = "getinfo(info) -> Res. Extract and return information from a curl session. Throws pycurl.error exception upon failure.\n"; +static char co_perform_doc [] = "perform() -> None. Perform a file transfer. Throws pycurl.error exception upon failure.\n"; +static char co_setopt_doc [] = "setopt(option, parameter) -> None. Set curl session option. Throws pycurl.error exception upon failure.\n"; +static char co_unsetopt_doc [] = "unsetopt(option) -> None. Reset curl session option to default value. Throws pycurl.error exception upon failure.\n"; + +static char co_multi_fdset_doc [] = "fdset() -> Tuple. Returns a tuple of three lists that can be passed to the select.select() method .\n"; +static char co_multi_info_read_doc [] = "info_read([max_objects]) -> Tuple. Returns a tuple (number of queued handles, [curl objects]).\n"; +static char co_multi_select_doc [] = "select([timeout]) -> Int. Returns result from doing a select() on the curl multi file descriptor with the given timeout.\n"; + +static PyMethodDef curlobject_methods[] = { + {"close", (PyCFunction)do_curl_close, METH_NOARGS, co_close_doc}, + {"errstr", (PyCFunction)do_curl_errstr, METH_NOARGS, co_errstr_doc}, + {"getinfo", (PyCFunction)do_curl_getinfo, METH_VARARGS, co_getinfo_doc}, + {"perform", (PyCFunction)do_curl_perform, METH_NOARGS, co_perform_doc}, + {"setopt", (PyCFunction)do_curl_setopt, METH_VARARGS, co_setopt_doc}, + {"unsetopt", (PyCFunction)do_curl_unsetopt, METH_VARARGS, co_unsetopt_doc}, + {NULL, NULL, 0, NULL} +}; + +static PyMethodDef curlmultiobject_methods[] = { + {"add_handle", (PyCFunction)do_multi_add_handle, METH_VARARGS, NULL}, + {"close", (PyCFunction)do_multi_close, METH_NOARGS, NULL}, + {"fdset", (PyCFunction)do_multi_fdset, METH_NOARGS, co_multi_fdset_doc}, + {"info_read", (PyCFunction)do_multi_info_read, METH_VARARGS, co_multi_info_read_doc}, + {"perform", (PyCFunction)do_multi_perform, METH_NOARGS, NULL}, + {"remove_handle", (PyCFunction)do_multi_remove_handle, METH_VARARGS, NULL}, + {"select", (PyCFunction)do_multi_select, METH_VARARGS, co_multi_select_doc}, + {NULL, NULL, 0, NULL} +}; + + +/* --------------- setattr/getattr --------------- */ + +static PyObject *curlobject_constants = NULL; +static PyObject *curlmultiobject_constants = NULL; + +static int +my_setattr(PyObject **dict, char *name, PyObject *v) +{ + if (v == NULL) { + int rv = -1; + if (*dict != NULL) + rv = PyDict_DelItemString(*dict, name); + if (rv < 0) + PyErr_SetString(PyExc_AttributeError, "delete non-existing attribute"); + return rv; + } + if (*dict == NULL) { + *dict = PyDict_New(); + if (*dict == NULL) + return -1; + } + return PyDict_SetItemString(*dict, name, v); +} + +static PyObject * +my_getattr(PyObject *co, char *name, PyObject *dict1, PyObject *dict2, PyMethodDef *m) +{ + PyObject *v = NULL; + if (v == NULL && dict1 != NULL) + v = PyDict_GetItemString(dict1, name); + if (v == NULL && dict2 != NULL) + v = PyDict_GetItemString(dict2, name); + if (v != NULL) { + Py_INCREF(v); + return v; + } + return Py_FindMethod(m, co, name); +} + +static int +do_curl_setattr(CurlObject *co, char *name, PyObject *v) +{ + assert_curl_state(co); + return my_setattr(&co->dict, name, v); +} + +static int +do_multi_setattr(CurlMultiObject *co, char *name, PyObject *v) +{ + assert_multi_state(co); + return my_setattr(&co->dict, name, v); +} + +static PyObject * +do_curl_getattr(CurlObject *co, char *name) +{ + assert_curl_state(co); + return my_getattr((PyObject *)co, name, co->dict, + curlobject_constants, curlobject_methods); +} + +static PyObject * +do_multi_getattr(CurlMultiObject *co, char *name) +{ + assert_multi_state(co); + return my_getattr((PyObject *)co, name, co->dict, + curlmultiobject_constants, curlmultiobject_methods); +} + + +/* --------------- actual type definitions --------------- */ + +static PyTypeObject Curl_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "pycurl.Curl", /* tp_name */ + sizeof(CurlObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* Methods */ + (destructor)do_curl_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)do_curl_getattr, /* tp_getattr */ + (setattrfunc)do_curl_setattr, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_HAVE_GC, /* tp_flags */ + 0, /* tp_doc */ + (traverseproc)do_curl_traverse, /* tp_traverse */ + (inquiry)do_curl_clear /* tp_clear */ + /* More fields follow here, depending on your Python version. You can + * safely ignore any compiler warnings about missing initializers. + */ +}; + +static PyTypeObject CurlMulti_Type = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "pycurl.CurlMulti", /* tp_name */ + sizeof(CurlMultiObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* Methods */ + (destructor)do_multi_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + (getattrfunc)do_multi_getattr, /* tp_getattr */ + (setattrfunc)do_multi_setattr, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_HAVE_GC, /* tp_flags */ + 0, /* tp_doc */ + (traverseproc)do_multi_traverse, /* tp_traverse */ + (inquiry)do_multi_clear /* tp_clear */ + /* More fields follow here, depending on your Python version. You can + * safely ignore any compiler warnings about missing initializers. + */ +}; + + +/************************************************************************* +// module level +// Note that the object constructors (do_curl_new, do_multi_new) +// are module-level functions as well. +**************************************************************************/ + +static PyObject * +do_global_init(PyObject *dummy, PyObject *args) +{ + int res, option; + + UNUSED(dummy); + if (!PyArg_ParseTuple(args, "i:global_init", &option)) { + return NULL; + } + + if (!(option == CURL_GLOBAL_SSL || + option == CURL_GLOBAL_WIN32 || + option == CURL_GLOBAL_ALL || + option == CURL_GLOBAL_NOTHING)) { + PyErr_SetString(PyExc_ValueError, "invalid option to global_init"); + return NULL; + } + + res = curl_global_init(option); + if (res != CURLE_OK) { + PyErr_SetString(ErrorObject, "unable to set global option"); + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + + +static PyObject * +do_global_cleanup(PyObject *dummy) +{ + UNUSED(dummy); + curl_global_cleanup(); + Py_INCREF(Py_None); + return Py_None; +} + + + +static PyObject *vi_str(const char *s) +{ + if (s == NULL) { + Py_INCREF(Py_None); + return Py_None; + } + while (*s == ' ' || *s == '\t') + s++; + return PyString_FromString(s); +} + +static PyObject * +do_version_info(PyObject *dummy, PyObject *args) +{ + const curl_version_info_data *vi; + PyObject *ret = NULL; + PyObject *protocols = NULL; + PyObject *tmp; + int i; + int stamp = CURLVERSION_NOW; + + UNUSED(dummy); + if (!PyArg_ParseTuple(args, "|i:version_info", &stamp)) { + return NULL; + } + vi = curl_version_info((CURLversion) stamp); + if (vi == NULL) { + PyErr_SetString(ErrorObject, "unable to get version info"); + return NULL; + } + + /* Note: actually libcurl in lib/version.c does ignore + * the "stamp" parm, and so do we */ + + for (i = 0; vi->protocols[i] != NULL; ) + i++; + protocols = PyTuple_New(i); + if (protocols == NULL) + goto error; + for (i = 0; vi->protocols[i] != NULL; i++) { + tmp = vi_str(vi->protocols[i]); + if (tmp == NULL) + goto error; + PyTuple_SET_ITEM(protocols, i, tmp); + } + ret = PyTuple_New(12); + if (ret == NULL) + goto error; + +#define SET(i, v) \ + tmp = (v); if (tmp == NULL) goto error; PyTuple_SET_ITEM(ret, i, tmp) + SET(0, PyInt_FromLong((long) vi->age)); + SET(1, vi_str(vi->version)); + SET(2, PyInt_FromLong(vi->version_num)); + SET(3, vi_str(vi->host)); + SET(4, PyInt_FromLong(vi->features)); + SET(5, vi_str(vi->ssl_version)); + SET(6, PyInt_FromLong(vi->ssl_version_num)); + SET(7, vi_str(vi->libz_version)); + SET(8, protocols); + SET(9, vi_str(vi->ares)); + SET(10, PyInt_FromLong(vi->ares_num)); + SET(11, vi_str(vi->libidn)); +#undef SET + return ret; + +error: + Py_XDECREF(ret); + Py_XDECREF(protocols); + return NULL; +} + + +/* Per function docstrings */ +static char pycurl_global_init_doc [] = +"global_init(option) -> None. Initialize curl environment.\n"; + +static char pycurl_global_cleanup_doc [] = +"global_cleanup() -> None. Cleanup curl environment.\n"; + +static char pycurl_version_info_doc [] = +"version_info() -> tuple. Returns a 12-tuple with the version info.\n"; + +static char pycurl_curl_new_doc [] = +"Curl() -> New curl object. Implicitly calls global_init() if not called.\n"; + +static char pycurl_multi_new_doc [] = +"CurlMulti() -> New curl multi-object.\n"; + + +/* List of functions defined in this module */ +static PyMethodDef curl_methods[] = { + {"global_init", (PyCFunction)do_global_init, METH_VARARGS, pycurl_global_init_doc}, + {"global_cleanup", (PyCFunction)do_global_cleanup, METH_NOARGS, pycurl_global_cleanup_doc}, + {"version_info", (PyCFunction)do_version_info, METH_VARARGS, pycurl_version_info_doc}, + {"Curl", (PyCFunction)do_curl_new, METH_NOARGS, pycurl_curl_new_doc}, + {"CurlMulti", (PyCFunction)do_multi_new, METH_NOARGS, pycurl_multi_new_doc}, + {NULL, NULL, 0, NULL} +}; + + +/* Module docstring */ +static char module_doc [] = +"This module implements an interface to the cURL library.\n" +"\n" +"Types:\n" +"\n" +"Curl() -> New object. Create a new curl object.\n" +"CurlMulti() -> New object. Create a new curl multi-object.\n" +"\n" +"Functions:\n" +"\n" +"global_init(option) -> None. Initialize curl environment.\n" +"global_cleanup() -> None. Cleanup curl environment.\n" +"version_info() -> tuple. Return version information.\n" +; + + +/* Helper functions for inserting constants into the module namespace */ + +static void +insobj2(PyObject *dict1, PyObject *dict2, char *name, PyObject *value) +{ + /* Insert an object into one or two dicts. Eats a reference to value. + * See also the implementation of PyDict_SetItemString(). */ + PyObject *key = NULL; + + if (dict1 == NULL && dict2 == NULL) + goto error; + if (value == NULL) + goto error; + key = PyString_FromString(name); + if (key == NULL) + goto error; +#if 0 + PyString_InternInPlace(&key); /* XXX Should we really? */ +#endif + if (dict1 != NULL) { + assert(PyDict_GetItem(dict1, key) == NULL); + if (PyDict_SetItem(dict1, key, value) != 0) + goto error; + } + if (dict2 != NULL && dict2 != dict1) { + assert(PyDict_GetItem(dict2, key) == NULL); + if (PyDict_SetItem(dict2, key, value) != 0) + goto error; + } + Py_DECREF(key); + Py_DECREF(value); + return; +error: + Py_FatalError("pycurl: FATAL: insobj2() failed"); + assert(0); +} + +static void +insstr(PyObject *d, char *name, char *value) +{ + PyObject *v = PyString_FromString(value); + insobj2(d, NULL, name, v); +} + +static void +insint(PyObject *d, char *name, long value) +{ + PyObject *v = PyInt_FromLong(value); + insobj2(d, NULL, name, v); +} + +static void +insint_c(PyObject *d, char *name, long value) +{ + PyObject *v = PyInt_FromLong(value); + insobj2(d, curlobject_constants, name, v); +} + +static void +insint_m(PyObject *d, char *name, long value) +{ + PyObject *v = PyInt_FromLong(value); + insobj2(d, curlmultiobject_constants, name, v); +} + + +/* Initialization function for the module */ +#if defined(PyMODINIT_FUNC) +PyMODINIT_FUNC +#else +#if defined(__cplusplus) +extern "C" +#endif +DL_EXPORT(void) +#endif +initpycurl(void) +{ + PyObject *m, *d; + const curl_version_info_data *vi; + + /* Initialize the type of the new type objects here; doing it here + * is required for portability to Windows without requiring C++. */ + p_Curl_Type = &Curl_Type; + p_CurlMulti_Type = &CurlMulti_Type; + Curl_Type.ob_type = &PyType_Type; + CurlMulti_Type.ob_type = &PyType_Type; + + /* Create the module and add the functions */ + m = Py_InitModule3("pycurl", curl_methods, module_doc); + assert(m != NULL && PyModule_Check(m)); + + /* Add error object to the module */ + d = PyModule_GetDict(m); + assert(d != NULL); + ErrorObject = PyErr_NewException("pycurl.error", NULL, NULL); + assert(ErrorObject != NULL); + PyDict_SetItemString(d, "error", ErrorObject); + + curlobject_constants = PyDict_New(); + assert(curlobject_constants != NULL); + + /* Add version strings to the module */ + insstr(d, "version", curl_version()); + insstr(d, "COMPILE_DATE", __DATE__ " " __TIME__); + insint(d, "COMPILE_PY_VERSION_HEX", PY_VERSION_HEX); + insint(d, "COMPILE_LIBCURL_VERSION_NUM", LIBCURL_VERSION_NUM); + + /** + ** the order of these constants mostly follows + **/ + + /* Abort curl_read_callback(). */ + insint_c(d, "READFUNC_ABORT", CURL_READFUNC_ABORT); + + /* constants for ioctl callback return values */ + insint_c(d, "IOE_OK", CURLIOE_OK); + insint_c(d, "IOE_UNKNOWNCMD", CURLIOE_UNKNOWNCMD); + insint_c(d, "IOE_FAILRESTART", CURLIOE_FAILRESTART); + + /* curl_infotype: the kind of data that is passed to information_callback */ +/* XXX do we actually need curl_infotype in pycurl ??? */ + insint_c(d, "INFOTYPE_TEXT", CURLINFO_TEXT); + insint_c(d, "INFOTYPE_HEADER_IN", CURLINFO_HEADER_IN); + insint_c(d, "INFOTYPE_HEADER_OUT", CURLINFO_HEADER_OUT); + insint_c(d, "INFOTYPE_DATA_IN", CURLINFO_DATA_IN); + insint_c(d, "INFOTYPE_DATA_OUT", CURLINFO_DATA_OUT); + insint_c(d, "INFOTYPE_SSL_DATA_IN", CURLINFO_SSL_DATA_IN); + insint_c(d, "INFOTYPE_SSL_DATA_OUT", CURLINFO_SSL_DATA_OUT); + + /* CURLcode: error codes */ +/* FIXME: lots of error codes are missing */ + insint_c(d, "E_OK", CURLE_OK); + insint_c(d, "E_UNSUPPORTED_PROTOCOL", CURLE_UNSUPPORTED_PROTOCOL); + + /* curl_proxytype: constants for setopt(PROXYTYPE, x) */ + insint_c(d, "PROXYTYPE_HTTP", CURLPROXY_HTTP); + insint_c(d, "PROXYTYPE_SOCKS4", CURLPROXY_SOCKS4); + insint_c(d, "PROXYTYPE_SOCKS5", CURLPROXY_SOCKS5); + + /* curl_httpauth: constants for setopt(HTTPAUTH, x) */ + insint_c(d, "HTTPAUTH_NONE", CURLAUTH_NONE); + insint_c(d, "HTTPAUTH_BASIC", CURLAUTH_BASIC); + insint_c(d, "HTTPAUTH_DIGEST", CURLAUTH_DIGEST); + insint_c(d, "HTTPAUTH_GSSNEGOTIATE", CURLAUTH_GSSNEGOTIATE); + insint_c(d, "HTTPAUTH_NTLM", CURLAUTH_NTLM); + insint_c(d, "HTTPAUTH_ANY", CURLAUTH_ANY); + insint_c(d, "HTTPAUTH_ANYSAFE", CURLAUTH_ANYSAFE); + + /* curl_ftpssl: constants for setopt(FTP_SSL, x) */ + insint_c(d, "FTPSSL_NONE", CURLFTPSSL_NONE); + insint_c(d, "FTPSSL_TRY", CURLFTPSSL_TRY); + insint_c(d, "FTPSSL_CONTROL", CURLFTPSSL_CONTROL); + insint_c(d, "FTPSSL_ALL", CURLFTPSSL_ALL); + + /* curl_ftpauth: constants for setopt(FTPSSLAUTH, x) */ + insint_c(d, "FTPAUTH_DEFAULT", CURLFTPAUTH_DEFAULT); + insint_c(d, "FTPAUTH_SSL", CURLFTPAUTH_SSL); + insint_c(d, "FTPAUTH_TLS", CURLFTPAUTH_TLS); + + /* curl_ftpauth: constants for setopt(FTPSSLAUTH, x) */ + insint_c(d, "FORM_CONTENTS", CURLFORM_COPYCONTENTS); + insint_c(d, "FORM_FILE", CURLFORM_FILE); + insint_c(d, "FORM_CONTENTTYPE", CURLFORM_CONTENTTYPE); + + /* CURLoption: symbolic constants for setopt() */ +/* FIXME: reorder these to match */ + insint_c(d, "FILE", CURLOPT_WRITEDATA); + insint_c(d, "URL", CURLOPT_URL); + insint_c(d, "PORT", CURLOPT_PORT); + insint_c(d, "PROXY", CURLOPT_PROXY); + insint_c(d, "USERPWD", CURLOPT_USERPWD); + insint_c(d, "PROXYUSERPWD", CURLOPT_PROXYUSERPWD); + insint_c(d, "RANGE", CURLOPT_RANGE); + insint_c(d, "INFILE", CURLOPT_READDATA); + /* ERRORBUFFER is not supported */ + insint_c(d, "WRITEFUNCTION", CURLOPT_WRITEFUNCTION); + insint_c(d, "READFUNCTION", CURLOPT_READFUNCTION); + insint_c(d, "TIMEOUT", CURLOPT_TIMEOUT); + insint_c(d, "INFILESIZE", CURLOPT_INFILESIZE_LARGE); /* _LARGE ! */ + insint_c(d, "POSTFIELDS", CURLOPT_POSTFIELDS); + insint_c(d, "REFERER", CURLOPT_REFERER); + insint_c(d, "FTPPORT", CURLOPT_FTPPORT); + insint_c(d, "USERAGENT", CURLOPT_USERAGENT); + insint_c(d, "LOW_SPEED_LIMIT", CURLOPT_LOW_SPEED_LIMIT); + insint_c(d, "LOW_SPEED_TIME", CURLOPT_LOW_SPEED_TIME); + insint_c(d, "RESUME_FROM", CURLOPT_RESUME_FROM_LARGE); /* _LARGE ! */ + insint_c(d, "WRITEDATA", CURLOPT_WRITEDATA); + insint_c(d, "READDATA", CURLOPT_READDATA); + insint_c(d, "PROXYPORT", CURLOPT_PROXYPORT); + insint_c(d, "HTTPPROXYTUNNEL", CURLOPT_HTTPPROXYTUNNEL); + insint_c(d, "VERBOSE", CURLOPT_VERBOSE); + insint_c(d, "HEADER", CURLOPT_HEADER); + insint_c(d, "NOPROGRESS", CURLOPT_NOPROGRESS); + insint_c(d, "NOBODY", CURLOPT_NOBODY); + insint_c(d, "FAILONERROR", CURLOPT_FAILONERROR); + insint_c(d, "UPLOAD", CURLOPT_UPLOAD); + insint_c(d, "POST", CURLOPT_POST); + insint_c(d, "FTPLISTONLY", CURLOPT_FTPLISTONLY); + insint_c(d, "FTPAPPEND", CURLOPT_FTPAPPEND); + insint_c(d, "NETRC", CURLOPT_NETRC); + insint_c(d, "FOLLOWLOCATION", CURLOPT_FOLLOWLOCATION); + insint_c(d, "TRANSFERTEXT", CURLOPT_TRANSFERTEXT); + insint_c(d, "PUT", CURLOPT_PUT); + insint_c(d, "POSTFIELDSIZE", CURLOPT_POSTFIELDSIZE_LARGE); /* _LARGE ! */ + insint_c(d, "COOKIE", CURLOPT_COOKIE); + insint_c(d, "HTTPHEADER", CURLOPT_HTTPHEADER); + insint_c(d, "HTTPPOST", CURLOPT_HTTPPOST); + insint_c(d, "SSLCERT", CURLOPT_SSLCERT); + insint_c(d, "SSLCERTPASSWD", CURLOPT_SSLCERTPASSWD); + insint_c(d, "CRLF", CURLOPT_CRLF); + insint_c(d, "QUOTE", CURLOPT_QUOTE); + insint_c(d, "POSTQUOTE", CURLOPT_POSTQUOTE); + insint_c(d, "PREQUOTE", CURLOPT_PREQUOTE); + insint_c(d, "WRITEHEADER", CURLOPT_WRITEHEADER); + insint_c(d, "HEADERFUNCTION", CURLOPT_HEADERFUNCTION); + insint_c(d, "COOKIEFILE", CURLOPT_COOKIEFILE); + insint_c(d, "SSLVERSION", CURLOPT_SSLVERSION); + insint_c(d, "TIMECONDITION", CURLOPT_TIMECONDITION); + insint_c(d, "TIMEVALUE", CURLOPT_TIMEVALUE); + insint_c(d, "CUSTOMREQUEST", CURLOPT_CUSTOMREQUEST); + insint_c(d, "STDERR", CURLOPT_STDERR); + insint_c(d, "INTERFACE", CURLOPT_INTERFACE); + insint_c(d, "KRB4LEVEL", CURLOPT_KRB4LEVEL); + insint_c(d, "PROGRESSFUNCTION", CURLOPT_PROGRESSFUNCTION); + insint_c(d, "SSL_VERIFYPEER", CURLOPT_SSL_VERIFYPEER); + insint_c(d, "CAPATH", CURLOPT_CAPATH); + insint_c(d, "CAINFO", CURLOPT_CAINFO); + insint_c(d, "OPT_FILETIME", CURLOPT_FILETIME); + insint_c(d, "MAXREDIRS", CURLOPT_MAXREDIRS); + insint_c(d, "MAXCONNECTS", CURLOPT_MAXCONNECTS); + insint_c(d, "CLOSEPOLICY", CURLOPT_CLOSEPOLICY); + insint_c(d, "FRESH_CONNECT", CURLOPT_FRESH_CONNECT); + insint_c(d, "FORBID_REUSE", CURLOPT_FORBID_REUSE); + insint_c(d, "RANDOM_FILE", CURLOPT_RANDOM_FILE); + insint_c(d, "EGDSOCKET", CURLOPT_EGDSOCKET); + insint_c(d, "CONNECTTIMEOUT", CURLOPT_CONNECTTIMEOUT); + insint_c(d, "HTTPGET", CURLOPT_HTTPGET); + insint_c(d, "SSL_VERIFYHOST", CURLOPT_SSL_VERIFYHOST); + insint_c(d, "COOKIEJAR", CURLOPT_COOKIEJAR); + insint_c(d, "SSL_CIPHER_LIST", CURLOPT_SSL_CIPHER_LIST); + insint_c(d, "HTTP_VERSION", CURLOPT_HTTP_VERSION); + insint_c(d, "FTP_USE_EPSV", CURLOPT_FTP_USE_EPSV); + insint_c(d, "SSLCERTTYPE", CURLOPT_SSLCERTTYPE); + insint_c(d, "SSLKEY", CURLOPT_SSLKEY); + insint_c(d, "SSLKEYTYPE", CURLOPT_SSLKEYTYPE); + insint_c(d, "SSLKEYPASSWD", CURLOPT_SSLKEYPASSWD); + insint_c(d, "SSLENGINE", CURLOPT_SSLENGINE); + insint_c(d, "SSLENGINE_DEFAULT", CURLOPT_SSLENGINE_DEFAULT); + insint_c(d, "DNS_CACHE_TIMEOUT", CURLOPT_DNS_CACHE_TIMEOUT); + insint_c(d, "DNS_USE_GLOBAL_CACHE", CURLOPT_DNS_USE_GLOBAL_CACHE); + insint_c(d, "DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION); + insint_c(d, "BUFFERSIZE", CURLOPT_BUFFERSIZE); + insint_c(d, "NOSIGNAL", CURLOPT_NOSIGNAL); + insint_c(d, "SHARE", CURLOPT_SHARE); + insint_c(d, "PROXYTYPE", CURLOPT_PROXYTYPE); + insint_c(d, "ENCODING", CURLOPT_ENCODING); + insint_c(d, "HTTP200ALIASES", CURLOPT_HTTP200ALIASES); + insint_c(d, "UNRESTRICTED_AUTH", CURLOPT_UNRESTRICTED_AUTH); + insint_c(d, "FTP_USE_EPRT", CURLOPT_FTP_USE_EPRT); + insint_c(d, "HTTPAUTH", CURLOPT_HTTPAUTH); + insint_c(d, "FTP_CREATE_MISSING_DIRS", CURLOPT_FTP_CREATE_MISSING_DIRS); + insint_c(d, "PROXYAUTH", CURLOPT_PROXYAUTH); + insint_c(d, "FTP_RESPONSE_TIMEOUT", CURLOPT_FTP_RESPONSE_TIMEOUT); + insint_c(d, "IPRESOLVE", CURLOPT_IPRESOLVE); + insint_c(d, "MAXFILESIZE", CURLOPT_MAXFILESIZE_LARGE); /* _LARGE ! */ + insint_c(d, "INFILESIZE_LARGE", CURLOPT_INFILESIZE_LARGE); + insint_c(d, "RESUME_FROM_LARGE", CURLOPT_RESUME_FROM_LARGE); + insint_c(d, "MAXFILESIZE_LARGE", CURLOPT_MAXFILESIZE_LARGE); + insint_c(d, "NETRC_FILE", CURLOPT_NETRC_FILE); + insint_c(d, "FTP_SSL", CURLOPT_FTP_SSL); + insint_c(d, "POSTFIELDSIZE_LARGE", CURLOPT_POSTFIELDSIZE_LARGE); + insint_c(d, "TCP_NODELAY", CURLOPT_TCP_NODELAY); + insint_c(d, "SOURCE_USERPWD", CURLOPT_SOURCE_USERPWD); + insint_c(d, "SOURCE_PREQUOTE", CURLOPT_SOURCE_PREQUOTE); + insint_c(d, "SOURCE_POSTQUOTE", CURLOPT_SOURCE_POSTQUOTE); + insint_c(d, "FTPSSLAUTH", CURLOPT_FTPSSLAUTH); + insint_c(d, "IOCTLFUNCTION", CURLOPT_IOCTLFUNCTION); + insint_c(d, "IOCTLDATA", CURLOPT_IOCTLDATA); + insint_c(d, "SOURCE_URL", CURLOPT_SOURCE_URL); + insint_c(d, "SOURCE_QUOTE", CURLOPT_SOURCE_QUOTE); + insint_c(d, "FTP_ACCOUNT", CURLOPT_FTP_ACCOUNT); + + /* constants for setopt(IPRESOLVE, x) */ + insint_c(d, "IPRESOLVE_WHATEVER", CURL_IPRESOLVE_WHATEVER); + insint_c(d, "IPRESOLVE_V4", CURL_IPRESOLVE_V4); + insint_c(d, "IPRESOLVE_V6", CURL_IPRESOLVE_V6); + + /* constants for setopt(HTTP_VERSION, x) */ + insint_c(d, "CURL_HTTP_VERSION_NONE", CURL_HTTP_VERSION_NONE); + insint_c(d, "CURL_HTTP_VERSION_1_0", CURL_HTTP_VERSION_1_0); + insint_c(d, "CURL_HTTP_VERSION_1_1", CURL_HTTP_VERSION_1_1); + insint_c(d, "CURL_HTTP_VERSION_LAST", CURL_HTTP_VERSION_LAST); + + /* CURL_NETRC_OPTION: constants for setopt(NETRC, x) */ + insint_c(d, "NETRC_OPTIONAL", CURL_NETRC_OPTIONAL); + insint_c(d, "NETRC_IGNORED", CURL_NETRC_IGNORED); + insint_c(d, "NETRC_REQUIRED", CURL_NETRC_REQUIRED); + + /* constants for setopt(SSLVERSION, x) */ + insint_c(d, "SSLVERSION_DEFAULT", CURL_SSLVERSION_DEFAULT); + insint_c(d, "SSLVERSION_TLSv1", CURL_SSLVERSION_TLSv1); + insint_c(d, "SSLVERSION_SSLv2", CURL_SSLVERSION_SSLv2); + insint_c(d, "SSLVERSION_SSLv3", CURL_SSLVERSION_SSLv3); + + /* curl_TimeCond: constants for setopt(TIMECONDITION, x) */ + insint_c(d, "TIMECONDITION_NONE", CURL_TIMECOND_NONE); + insint_c(d, "TIMECONDITION_IFMODSINCE", CURL_TIMECOND_IFMODSINCE); + insint_c(d, "TIMECONDITION_IFUNMODSINCE", CURL_TIMECOND_IFUNMODSINCE); + insint_c(d, "TIMECONDITION_LASTMOD", CURL_TIMECOND_LASTMOD); + + /* CURLINFO: symbolic constants for getinfo(x) */ + insint_c(d, "EFFECTIVE_URL", CURLINFO_EFFECTIVE_URL); + insint_c(d, "HTTP_CODE", CURLINFO_HTTP_CODE); + insint_c(d, "RESPONSE_CODE", CURLINFO_HTTP_CODE); + insint_c(d, "TOTAL_TIME", CURLINFO_TOTAL_TIME); + insint_c(d, "NAMELOOKUP_TIME", CURLINFO_NAMELOOKUP_TIME); + insint_c(d, "CONNECT_TIME", CURLINFO_CONNECT_TIME); + insint_c(d, "PRETRANSFER_TIME", CURLINFO_PRETRANSFER_TIME); + insint_c(d, "SIZE_UPLOAD", CURLINFO_SIZE_UPLOAD); + insint_c(d, "SIZE_DOWNLOAD", CURLINFO_SIZE_DOWNLOAD); + insint_c(d, "SPEED_DOWNLOAD", CURLINFO_SPEED_DOWNLOAD); + insint_c(d, "SPEED_UPLOAD", CURLINFO_SPEED_UPLOAD); + insint_c(d, "HEADER_SIZE", CURLINFO_HEADER_SIZE); + insint_c(d, "REQUEST_SIZE", CURLINFO_REQUEST_SIZE); + insint_c(d, "SSL_VERIFYRESULT", CURLINFO_SSL_VERIFYRESULT); + insint_c(d, "INFO_FILETIME", CURLINFO_FILETIME); + insint_c(d, "CONTENT_LENGTH_DOWNLOAD", CURLINFO_CONTENT_LENGTH_DOWNLOAD); + insint_c(d, "CONTENT_LENGTH_UPLOAD", CURLINFO_CONTENT_LENGTH_UPLOAD); + insint_c(d, "STARTTRANSFER_TIME", CURLINFO_STARTTRANSFER_TIME); + insint_c(d, "CONTENT_TYPE", CURLINFO_CONTENT_TYPE); + insint_c(d, "REDIRECT_TIME", CURLINFO_REDIRECT_TIME); + insint_c(d, "REDIRECT_COUNT", CURLINFO_REDIRECT_COUNT); + insint_c(d, "HTTP_CONNECTCODE", CURLINFO_HTTP_CONNECTCODE); + insint_c(d, "HTTPAUTH_AVAIL", CURLINFO_HTTPAUTH_AVAIL); + insint_c(d, "PROXYAUTH_AVAIL", CURLINFO_PROXYAUTH_AVAIL); + insint_c(d, "OS_ERRNO", CURLINFO_OS_ERRNO); + insint_c(d, "NUM_CONNECTS", CURLINFO_NUM_CONNECTS); + insint_c(d, "SSL_ENGINES", CURLINFO_SSL_ENGINES); + + /* curl_closepolicy: constants for setopt(CLOSEPOLICY, x) */ + insint_c(d, "CLOSEPOLICY_OLDEST", CURLCLOSEPOLICY_OLDEST); + insint_c(d, "CLOSEPOLICY_LEAST_RECENTLY_USED", CURLCLOSEPOLICY_LEAST_RECENTLY_USED); + insint_c(d, "CLOSEPOLICY_LEAST_TRAFFIC", CURLCLOSEPOLICY_LEAST_TRAFFIC); + insint_c(d, "CLOSEPOLICY_SLOWEST", CURLCLOSEPOLICY_SLOWEST); + insint_c(d, "CLOSEPOLICY_CALLBACK", CURLCLOSEPOLICY_CALLBACK); + + /* options for global_init() */ + insint(d, "GLOBAL_SSL", CURL_GLOBAL_SSL); + insint(d, "GLOBAL_WIN32", CURL_GLOBAL_WIN32); + insint(d, "GLOBAL_ALL", CURL_GLOBAL_ALL); + insint(d, "GLOBAL_NOTHING", CURL_GLOBAL_NOTHING); + insint(d, "GLOBAL_DEFAULT", CURL_GLOBAL_DEFAULT); + + /* curl_lock_data: XXX do we need this in pycurl ??? */ + /* curl_lock_access: XXX do we need this in pycurl ??? */ + /* CURLSHcode: XXX do we need this in pycurl ??? */ + /* CURLSHoption: XXX do we need this in pycurl ??? */ + + /* CURLversion: constants for curl_version_info(x) */ +#if 0 + /* XXX - do we need these ?? */ + insint(d, "VERSION_FIRST", CURLVERSION_FIRST); + insint(d, "VERSION_SECOND", CURLVERSION_SECOND); + insint(d, "VERSION_THIRD", CURLVERSION_THIRD); + insint(d, "VERSION_NOW", CURLVERSION_NOW); +#endif + + /* version features - bitmasks for curl_version_info_data.features */ +#if 0 + /* XXX - do we need these ?? */ + /* XXX - should we really rename these ?? */ + insint(d, "VERSION_FEATURE_IPV6", CURL_VERSION_IPV6); + insint(d, "VERSION_FEATURE_KERBEROS4", CURL_VERSION_KERBEROS4); + insint(d, "VERSION_FEATURE_SSL", CURL_VERSION_SSL); + insint(d, "VERSION_FEATURE_LIBZ", CURL_VERSION_LIBZ); + insint(d, "VERSION_FEATURE_NTLM", CURL_VERSION_NTLM); + insint(d, "VERSION_FEATURE_GSSNEGOTIATE", CURL_VERSION_GSSNEGOTIATE); + insint(d, "VERSION_FEATURE_DEBUG", CURL_VERSION_DEBUG); + insint(d, "VERSION_FEATURE_ASYNCHDNS", CURL_VERSION_ASYNCHDNS); + insint(d, "VERSION_FEATURE_SPNEGO", CURL_VERSION_SPNEGO); + insint(d, "VERSION_FEATURE_LARGEFILE", CURL_VERSION_LARGEFILE); + insint(d, "VERSION_FEATURE_IDN", CURL_VERSION_IDN); +#endif + + /** + ** the order of these constants mostly follows + **/ + + /* CURLMcode: multi error codes */ + insint_m(d, "E_CALL_MULTI_PERFORM", CURLM_CALL_MULTI_PERFORM); + insint_m(d, "E_MULTI_OK", CURLM_OK); + insint_m(d, "E_MULTI_BAD_HANDLE", CURLM_BAD_HANDLE); + insint_m(d, "E_MULTI_BAD_EASY_HANDLE", CURLM_BAD_EASY_HANDLE); + insint_m(d, "E_MULTI_OUT_OF_MEMORY", CURLM_OUT_OF_MEMORY); + insint_m(d, "E_MULTI_INTERNAL_ERROR", CURLM_INTERNAL_ERROR); + + /* Check the version, as this has caused nasty problems in + * some cases. */ + vi = curl_version_info(CURLVERSION_NOW); + if (vi == NULL) { + Py_FatalError("pycurl: FATAL: curl_version_info() failed"); + assert(0); + } + if (vi->version_num < LIBCURL_VERSION_NUM) { + Py_FatalError("pycurl: FATAL: libcurl link-time version is older than compile-time version"); + assert(0); + } + + /* Finally initialize global interpreter lock */ + PyEval_InitThreads(); +} + +/* vi:ts=4:et:nowrap + */ diff --git a/trunk/pycurl/tests/test.py b/trunk/pycurl/tests/test.py new file mode 100644 index 0000000..743c311 --- /dev/null +++ b/trunk/pycurl/tests/test.py @@ -0,0 +1,74 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys, threading, time +import pycurl + +# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see +# the libcurl tutorial for more info. +try: + import signal + from signal import SIGPIPE, SIG_IGN + signal.signal(signal.SIGPIPE, signal.SIG_IGN) +except ImportError: + pass + + +class Test(threading.Thread): + def __init__(self, url, ofile): + threading.Thread.__init__(self) + self.curl = pycurl.Curl() + self.curl.setopt(pycurl.URL, url) + self.curl.setopt(pycurl.WRITEDATA, ofile) + self.curl.setopt(pycurl.FOLLOWLOCATION, 1) + self.curl.setopt(pycurl.MAXREDIRS, 5) + self.curl.setopt(pycurl.NOSIGNAL, 1) + + def run(self): + self.curl.perform() + self.curl.close() + sys.stdout.write(".") + sys.stdout.flush() + + +# Read list of URIs from file specified on commandline +try: + urls = open(sys.argv[1]).readlines() +except IndexError: + # No file was specified, show usage string + print "Usage: %s " % sys.argv[0] + raise SystemExit + +# Initialize thread array and the file number +threads = [] +fileno = 0 + +# Start one thread per URI in parallel +t1 = time.time() +for url in urls: + f = open(str(fileno), "wb") + t = Test(url, f) + t.start() + threads.append((t, f)) + fileno = fileno + 1 +# Wait for all threads to finish +for thread, file in threads: + thread.join() + file.close() +t2 = time.time() +print "\n** Multithreading, %d seconds elapsed for %d uris" % (int(t2-t1), len(urls)) + +# Start one thread per URI in sequence +fileno = 0 +t1 = time.time() +for url in urls: + f = open(str(fileno), "wb") + t = Test(url, f) + t.start() + fileno = fileno + 1 + t.join() + f.close() +t2 = time.time() +print "\n** Singlethreading, %d seconds elapsed for %d uris" % (int(t2-t1), len(urls)) diff --git a/trunk/pycurl/tests/test_cb.py b/trunk/pycurl/tests/test_cb.py new file mode 100644 index 0000000..1be305c --- /dev/null +++ b/trunk/pycurl/tests/test_cb.py @@ -0,0 +1,28 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys +import pycurl + +## Callback function invoked when body data is ready +def body(buf): + # Print body data to stdout + sys.stdout.write(buf) + +## Callback function invoked when header data is ready +def header(buf): + # Print header data to stderr + sys.stderr.write(buf) + +c = pycurl.Curl() +c.setopt(pycurl.URL, 'http://www.python.org/') +c.setopt(pycurl.WRITEFUNCTION, body) +c.setopt(pycurl.HEADERFUNCTION, header) +c.setopt(pycurl.FOLLOWLOCATION, 1) +c.setopt(pycurl.MAXREDIRS, 5) +c.perform() +c.setopt(pycurl.URL, 'http://curl.haxx.se/') +c.perform() +c.close() diff --git a/trunk/pycurl/tests/test_debug.py b/trunk/pycurl/tests/test_debug.py new file mode 100644 index 0000000..d439b16 --- /dev/null +++ b/trunk/pycurl/tests/test_debug.py @@ -0,0 +1,16 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import pycurl + +def test(t, b): + print "debug(%d): %s" % (t, b) + +c = pycurl.Curl() +c.setopt(pycurl.URL, 'http://curl.haxx.se/') +c.setopt(pycurl.VERBOSE, 1) +c.setopt(pycurl.DEBUGFUNCTION, test) +c.perform() +c.close() diff --git a/trunk/pycurl/tests/test_getinfo.py b/trunk/pycurl/tests/test_getinfo.py new file mode 100644 index 0000000..ed64594 --- /dev/null +++ b/trunk/pycurl/tests/test_getinfo.py @@ -0,0 +1,49 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import time +import pycurl + + +## Callback function invoked when progress information is updated +def progress(download_t, download_d, upload_t, upload_d): + print "Total to download %d bytes, have %d bytes so far" % \ + (download_t, download_d) + +url = "http://www.cnn.com" + +print "Starting downloading", url +print +f = open("body", "wb") +h = open("header", "wb") +c = pycurl.Curl() +c.setopt(c.URL, url) +c.setopt(c.WRITEDATA, f) +c.setopt(c.NOPROGRESS, 0) +c.setopt(c.PROGRESSFUNCTION, progress) +c.setopt(c.FOLLOWLOCATION, 1) +c.setopt(c.MAXREDIRS, 5) +c.setopt(c.WRITEHEADER, h) +c.setopt(c.OPT_FILETIME, 1) +c.perform() + +print +print "HTTP-code:", c.getinfo(c.HTTP_CODE) +print "Total-time:", c.getinfo(c.TOTAL_TIME) +print "Download speed: %.2f bytes/second" % c.getinfo(c.SPEED_DOWNLOAD) +print "Document size: %d bytes" % c.getinfo(c.SIZE_DOWNLOAD) +print "Effective URL:", c.getinfo(c.EFFECTIVE_URL) +print "Content-type:", c.getinfo(c.CONTENT_TYPE) +print "Namelookup-time:", c.getinfo(c.NAMELOOKUP_TIME) +print "Redirect-time:", c.getinfo(c.REDIRECT_TIME) +print "Redirect-count:", c.getinfo(c.REDIRECT_COUNT) +epoch = c.getinfo(c.INFO_FILETIME) +print "Filetime: %d (%s)" % (epoch, time.ctime(epoch)) +print +print "Header is in file 'header', body is in file 'body'" + +c.close() +f.close() +h.close() diff --git a/trunk/pycurl/tests/test_gtk.py b/trunk/pycurl/tests/test_gtk.py new file mode 100644 index 0000000..9626310 --- /dev/null +++ b/trunk/pycurl/tests/test_gtk.py @@ -0,0 +1,93 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys, threading +from gtk import * +import pycurl + +# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see +# the libcurl tutorial for more info. +try: + import signal + from signal import SIGPIPE, SIG_IGN + signal.signal(signal.SIGPIPE, signal.SIG_IGN) +except ImportError: + pass + + +class ProgressBar: + def __init__(self, uri): + self.round = 0.0 + win = GtkDialog() + win.set_title("PycURL progress") + win.show() + vbox = GtkVBox(spacing=5) + vbox.set_border_width(10) + win.vbox.pack_start(vbox) + win.set_default_size(200, 20) + vbox.show() + label = GtkLabel("Downloading %s" % uri) + label.set_alignment(0, 0.5) + vbox.pack_start(label, expand=FALSE) + label.show() + pbar = GtkProgressBar() + pbar.show() + self.pbar = pbar + vbox.pack_start(pbar) + win.connect("destroy", self.close_app) + win.connect("delete_event", self.close_app) + + def progress(self, download_t, download_d, upload_t, upload_d): + threads_enter() + if download_t == 0: + self.round = self.round + 0.1 + if self.round >= 1.0: self.round = 0.0 + else: + self.round = float(download_d) / float(download_t) + self.pbar.update(self.round) + threads_leave() + + def mainloop(self): + threads_enter() + mainloop() + threads_leave() + + def close_app(self, *args): + args[0].destroy() + mainquit() + + +class Test(threading.Thread): + def __init__(self, url, target_file, progress): + threading.Thread.__init__(self) + self.target_file = target_file + self.progress = progress + self.curl = pycurl.Curl() + self.curl.setopt(pycurl.URL, url) + self.curl.setopt(pycurl.WRITEDATA, self.target_file) + self.curl.setopt(pycurl.FOLLOWLOCATION, 1) + self.curl.setopt(pycurl.NOPROGRESS, 0) + self.curl.setopt(pycurl.PROGRESSFUNCTION, self.progress) + self.curl.setopt(pycurl.MAXREDIRS, 5) + self.curl.setopt(pycurl.NOSIGNAL, 1) + + def run(self): + self.curl.perform() + self.curl.close() + self.target_file.close() + self.progress(1.0, 1.0, 0, 0) + + +# Check command line args +if len(sys.argv) < 3: + print "Usage: %s " % sys.argv[0] + raise SystemExit + +# Make a progress bar window +p = ProgressBar(sys.argv[1]) +# Start thread for fetching url +Test(sys.argv[1], open(sys.argv[2], 'wb'), p.progress).start() +# Enter the GTK mainloop +p.mainloop() diff --git a/trunk/pycurl/tests/test_internals.py b/trunk/pycurl/tests/test_internals.py new file mode 100644 index 0000000..a1a6533 --- /dev/null +++ b/trunk/pycurl/tests/test_internals.py @@ -0,0 +1,253 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +# +# a simple self-test +# + +try: + # need Python 2.2 or better for garbage collection + from gc import get_objects + import gc + del get_objects + gc.enable() +except ImportError: + gc = None +import copy, os, sys +from StringIO import StringIO +try: + import cPickle +except ImportError: + cPickle = None +try: + import pickle +except ImportError: + pickle = None + +# update sys.path when running in the build directory +from util import get_sys_path +sys.path = get_sys_path() + +import pycurl +from pycurl import Curl, CurlMulti + + +class opts: + verbose = 1 + +if "-q" in sys.argv: + opts.verbose = opts.verbose - 1 + + +print "Python", sys.version +print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM) +print "PycURL version info", pycurl.version_info() +print " %s, compiled %s" % (pycurl.__file__, pycurl.COMPILE_DATE) + + +# /*********************************************************************** +# // test misc +# ************************************************************************/ + +if 1: + c = Curl() + assert c.URL is pycurl.URL + del c + + +# /*********************************************************************** +# // test handles +# ************************************************************************/ + +# remove an invalid handle: this should fail +if 1: + m = CurlMulti() + c = Curl() + try: + m.remove_handle(c) + except pycurl.error: + pass + else: + assert 0, "internal error" + del m, c + + +# remove an invalid but closed handle +if 1: + m = CurlMulti() + c = Curl() + c.close() + m.remove_handle(c) + del m, c + + +# add a closed handle: this should fail +if 1: + m = CurlMulti() + c = Curl() + c.close() + try: + m.add_handle(c) + except pycurl.error: + pass + else: + assert 0, "internal error" + m.close() + del m, c + + +# add a handle twice: this should fail +if 1: + m = CurlMulti() + c = Curl() + m.add_handle(c) + try: + m.add_handle(c) + except pycurl.error: + pass + else: + assert 0, "internal error" + del m, c + + +# add a handle on multiple stacks: this should fail +if 1: + m1 = CurlMulti() + m2 = CurlMulti() + c = Curl() + m1.add_handle(c) + try: + m2.add_handle(c) + except pycurl.error: + pass + else: + assert 0, "internal error" + del m1, m2, c + + +# move a handle +if 1: + m1 = CurlMulti() + m2 = CurlMulti() + c = Curl() + m1.add_handle(c) + m1.remove_handle(c) + m2.add_handle(c) + del m1, m2, c + + +# /*********************************************************************** +# // test copying and pickling - copying and pickling of +# // instances of Curl and CurlMulti is not allowed +# ************************************************************************/ + +if 1 and copy: + c = Curl() + m = CurlMulti() + try: + copy.copy(c) + except copy.Error: + pass + else: + assert 0, "internal error - copying should fail" + try: + copy.copy(m) + except copy.Error: + pass + else: + assert 0, "internal error - copying should fail" + +if 1 and pickle: + c = Curl() + m = CurlMulti() + fp = StringIO() + p = pickle.Pickler(fp, 1) + try: + p.dump(c) + except pickle.PicklingError: + pass + else: + assert 0, "internal error - pickling should fail" + try: + p.dump(m) + except pickle.PicklingError: + pass + else: + assert 0, "internal error - pickling should fail" + del c, m, fp, p + +if 1 and cPickle: + c = Curl() + m = CurlMulti() + fp = StringIO() + p = cPickle.Pickler(fp, 1) + try: + p.dump(c) + except cPickle.PicklingError: + pass + else: + assert 0, "internal error - pickling should fail" + try: + p.dump(m) + except cPickle.PicklingError: + pass + else: + assert 0, "internal error - pickling should fail" + del c, m, fp, p + + +# /*********************************************************************** +# // test refcounts +# ************************************************************************/ + +# basic check of reference counting (use a memory checker like valgrind) +if 1: + c = Curl() + m = CurlMulti() + m.add_handle(c) + del m + m = CurlMulti() + c.close() + del m, c + +# basic check of cyclic garbage collection +if 1 and gc: + gc.collect() + c = Curl() + c.m = CurlMulti() + c.m.add_handle(c) + # create some nasty cyclic references + c.c = c + c.c.c1 = c + c.c.c2 = c + c.c.c3 = c.c + c.c.c4 = c.m + c.m.c = c + c.m.m = c.m + c.m.c = c + # delete + gc.collect() + flags = gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_OBJECTS + if opts.verbose >= 1: + flags = flags | gc.DEBUG_STATS + gc.set_debug(flags) + gc.collect() + ##print gc.get_referrers(c) + ##print gc.get_objects() + if opts.verbose >= 1: + print "Tracked objects:", len(gc.get_objects()) + # The `del' below should delete these 4 objects: + # Curl + internal dict, CurlMulti + internal dict + del c + gc.collect() + if opts.verbose >= 1: + print "Tracked objects:", len(gc.get_objects()) + + +# /*********************************************************************** +# // done +# ************************************************************************/ + +print "All tests passed." diff --git a/trunk/pycurl/tests/test_memleak.py b/trunk/pycurl/tests/test_memleak.py new file mode 100644 index 0000000..8577b97 --- /dev/null +++ b/trunk/pycurl/tests/test_memleak.py @@ -0,0 +1,53 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +# +# just a simple self-test +# need Python 2.2 or better for garbage collection +# + +import gc, pycurl, sys +gc.enable() + + +print "Python", sys.version +print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM) +##print "PycURL version info", pycurl.version_info() +print " %s, compiled %s" % (pycurl.__file__, pycurl.COMPILE_DATE) + + +gc.collect() +flags = gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_OBJECTS +if 1: + flags = flags | gc.DEBUG_STATS +gc.set_debug(flags) +gc.collect() + +print "Tracked objects:", len(gc.get_objects()) + +multi = pycurl.CurlMulti() +t = [] +for a in range(100): + curl = pycurl.Curl() + multi.add_handle(curl) + t.append(curl) + +print "Tracked objects:", len(gc.get_objects()) + +for curl in t: + curl.close() + multi.remove_handle(curl) + +print "Tracked objects:", len(gc.get_objects()) + +del curl +del t +del multi + +print "Tracked objects:", len(gc.get_objects()) +gc.collect() +print "Tracked objects:", len(gc.get_objects()) + + diff --git a/trunk/pycurl/tests/test_multi.py b/trunk/pycurl/tests/test_multi.py new file mode 100644 index 0000000..01312be --- /dev/null +++ b/trunk/pycurl/tests/test_multi.py @@ -0,0 +1,33 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import pycurl + +m = pycurl.CurlMulti() +m.handles = [] +c1 = pycurl.Curl() +c2 = pycurl.Curl() +c1.setopt(c1.URL, 'http://curl.haxx.se') +c2.setopt(c2.URL, 'http://cnn.com') +c2.setopt(c2.FOLLOWLOCATION, 1) +m.add_handle(c1) +m.add_handle(c2) +m.handles.append(c1) +m.handles.append(c2) + +num_handles = len(m.handles) +while num_handles: + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + m.select() + +m.remove_handle(c2) +m.remove_handle(c1) +del m.handles +m.close() +c1.close() +c2.close() diff --git a/trunk/pycurl/tests/test_multi2.py b/trunk/pycurl/tests/test_multi2.py new file mode 100644 index 0000000..182e0dc --- /dev/null +++ b/trunk/pycurl/tests/test_multi2.py @@ -0,0 +1,72 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import os, sys +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +import pycurl + + +urls = ( + "http://curl.haxx.se", + "http://www.python.org", + "http://pycurl.sourceforge.net", + "http://pycurl.sourceforge.net/tests/403_FORBIDDEN", # that actually exists ;-) + "http://pycurl.sourceforge.net/tests/404_NOT_FOUND", +) + +# Read list of URIs from file specified on commandline +try: + urls = open(sys.argv[1], "rb").readlines() +except IndexError: + # No file was specified + pass + +# init +m = pycurl.CurlMulti() +m.handles = [] +for url in urls: + c = pycurl.Curl() + # save info in standard Python attributes + c.url = url + c.body = StringIO() + c.http_code = -1 + m.handles.append(c) + # pycurl API calls + c.setopt(c.URL, c.url) + c.setopt(c.WRITEFUNCTION, c.body.write) + m.add_handle(c) + +# get data +num_handles = len(m.handles) +while num_handles: + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + # currently no more I/O is pending, could do something in the meantime + # (display a progress bar, etc.) + m.select() + +# close handles +for c in m.handles: + # save info in standard Python attributes + c.http_code = c.getinfo(c.HTTP_CODE) + # pycurl API calls + m.remove_handle(c) + c.close() +m.close() + +# print result +for c in m.handles: + data = c.body.getvalue() + if 0: + print "**********", c.url, "**********" + print data + else: + print "%-53s http_code %3d, %6d bytes" % (c.url, c.http_code, len(data)) + diff --git a/trunk/pycurl/tests/test_multi3.py b/trunk/pycurl/tests/test_multi3.py new file mode 100644 index 0000000..0ef514a --- /dev/null +++ b/trunk/pycurl/tests/test_multi3.py @@ -0,0 +1,87 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +# same as test_multi2.py, but enforce some debugging and strange API-calls + +import os, sys +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +import pycurl + + +urls = ( + "http://curl.haxx.se", + "http://www.python.org", + "http://pycurl.sourceforge.net", + "http://pycurl.sourceforge.net/THIS_HANDLE_IS_CLOSED", +) + +# init +m = pycurl.CurlMulti() +m.handles = [] +for url in urls: + c = pycurl.Curl() + # save info in standard Python attributes + c.url = url + c.body = StringIO() + c.http_code = -1 + c.debug = 0 + m.handles.append(c) + # pycurl API calls + c.setopt(c.URL, c.url) + c.setopt(c.WRITEFUNCTION, c.body.write) + m.add_handle(c) + +# debug - close a handle +if 1: + c = m.handles[3] + c.debug = 1 + c.close() + +# get data +num_handles = len(m.handles) +while num_handles: + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + # currently no more I/O is pending, could do something in the meantime + # (display a progress bar, etc.) + m.select() + +# close handles +for c in m.handles: + # save info in standard Python attributes + try: + c.http_code = c.getinfo(c.HTTP_CODE) + except pycurl.error: + # handle already closed - see debug above + assert c.debug + c.http_code = -1 + # pycurl API calls + if 0: + m.remove_handle(c) + c.close() + elif 0: + # in the C API this is the wrong calling order, but pycurl + # handles this automatically + c.close() + m.remove_handle(c) + else: + # actually, remove_handle is called automatically on close + c.close() +m.close() + +# print result +for c in m.handles: + data = c.body.getvalue() + if 0: + print "**********", c.url, "**********" + print data + else: + print "%-53s http_code %3d, %6d bytes" % (c.url, c.http_code, len(data)) + diff --git a/trunk/pycurl/tests/test_multi4.py b/trunk/pycurl/tests/test_multi4.py new file mode 100644 index 0000000..0c024a4 --- /dev/null +++ b/trunk/pycurl/tests/test_multi4.py @@ -0,0 +1,57 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys, select, time +import pycurl + +c1 = pycurl.Curl() +c2 = pycurl.Curl() +c3 = pycurl.Curl() +c1.setopt(c1.URL, "http://www.python.org") +c2.setopt(c2.URL, "http://curl.haxx.se") +c3.setopt(c3.URL, "http://slashdot.org") +c1.body = open("doc1", "wb") +c2.body = open("doc2", "wb") +c3.body = open("doc3", "wb") +c1.setopt(c1.WRITEFUNCTION, c1.body.write) +c2.setopt(c2.WRITEFUNCTION, c2.body.write) +c3.setopt(c3.WRITEFUNCTION, c3.body.write) + +m = pycurl.CurlMulti() +m.add_handle(c1) +m.add_handle(c2) +m.add_handle(c3) + +# Number of seconds to wait for a timeout to happen +SELECT_TIMEOUT = 10 + +# Stir the state machine into action +while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + +# Keep going until all the connections have terminated +while num_handles: + apply(select.select, m.fdset() + (SELECT_TIMEOUT,)) + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + +# Cleanup +m.remove_handle(c3) +m.remove_handle(c2) +m.remove_handle(c1) +m.close() +c1.body.close() +c2.body.close() +c3.body.close() +c1.close() +c2.close() +c3.close() +print "http://www.python.org is in file doc1" +print "http://curl.haxx.se is in file doc2" +print "http://slashdot.org is in file doc3" diff --git a/trunk/pycurl/tests/test_multi5.py b/trunk/pycurl/tests/test_multi5.py new file mode 100644 index 0000000..b55dd7e --- /dev/null +++ b/trunk/pycurl/tests/test_multi5.py @@ -0,0 +1,60 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys, select, time +import pycurl + +c1 = pycurl.Curl() +c2 = pycurl.Curl() +c3 = pycurl.Curl() +c1.setopt(c1.URL, "http://www.python.org") +c2.setopt(c2.URL, "http://curl.haxx.se") +c3.setopt(c3.URL, "http://slashdot.org") +c1.body = open("doc1", "wb") +c2.body = open("doc2", "wb") +c3.body = open("doc3", "wb") +c1.setopt(c1.WRITEFUNCTION, c1.body.write) +c2.setopt(c2.WRITEFUNCTION, c2.body.write) +c3.setopt(c3.WRITEFUNCTION, c3.body.write) + +m = pycurl.CurlMulti() +m.add_handle(c1) +m.add_handle(c2) +m.add_handle(c3) + +# Number of seconds to wait for a timeout to happen +SELECT_TIMEOUT = 10 + +# Stir the state machine into action +while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + +# Keep going until all the connections have terminated +while num_handles: + # The select method uses fdset internally to determine which file descriptors + # to check. + m.select(SELECT_TIMEOUT) + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + +# Cleanup +m.remove_handle(c3) +m.remove_handle(c2) +m.remove_handle(c1) +m.close() +c1.body.close() +c2.body.close() +c3.body.close() +c1.close() +c2.close() +c3.close() +print "http://www.python.org is in file doc1" +print "http://curl.haxx.se is in file doc2" +print "http://slashdot.org is in file doc3" + diff --git a/trunk/pycurl/tests/test_multi6.py b/trunk/pycurl/tests/test_multi6.py new file mode 100644 index 0000000..6ff8e92 --- /dev/null +++ b/trunk/pycurl/tests/test_multi6.py @@ -0,0 +1,62 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys, select, time +import pycurl + +c1 = pycurl.Curl() +c2 = pycurl.Curl() +c3 = pycurl.Curl() +c1.setopt(c1.URL, "http://www.python.org") +c2.setopt(c2.URL, "http://curl.haxx.se") +c3.setopt(c3.URL, "http://slashdot.org") +c1.body = open("doc1", "wb") +c2.body = open("doc2", "wb") +c3.body = open("doc3", "wb") +c1.setopt(c1.WRITEFUNCTION, c1.body.write) +c2.setopt(c2.WRITEFUNCTION, c2.body.write) +c3.setopt(c3.WRITEFUNCTION, c3.body.write) + +m = pycurl.CurlMulti() +m.add_handle(c1) +m.add_handle(c2) +m.add_handle(c3) + +# Number of seconds to wait for a timeout to happen +SELECT_TIMEOUT = 10 + +# Stir the state machine into action +while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + +# Keep going until all the connections have terminated +while num_handles: + # The select method uses fdset internally to determine which file descriptors + # to check. + m.select(SELECT_TIMEOUT) + while 1: + ret, num_handles = m.perform() + # Print the message, if any + print m.info_read(1) + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + +# Cleanup +m.remove_handle(c3) +m.remove_handle(c2) +m.remove_handle(c1) +m.close() +c1.body.close() +c2.body.close() +c3.body.close() +c1.close() +c2.close() +c3.close() +print "http://www.python.org is in file doc1" +print "http://curl.haxx.se is in file doc2" +print "http://slashdot.org is in file doc3" + diff --git a/trunk/pycurl/tests/test_multi_vs_thread.py b/trunk/pycurl/tests/test_multi_vs_thread.py new file mode 100644 index 0000000..c242d30 --- /dev/null +++ b/trunk/pycurl/tests/test_multi_vs_thread.py @@ -0,0 +1,262 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import os, sys, time +from threading import Thread, RLock +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +import pycurl + +# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see +# the libcurl tutorial for more info. +try: + import signal + from signal import SIGPIPE, SIG_IGN + signal.signal(signal.SIGPIPE, signal.SIG_IGN) +except ImportError: + pass + +# The conclusion is: the multi interface is fastest! + +NUM_PAGES = 30 +NUM_THREADS = 10 +assert NUM_PAGES % NUM_THREADS == 0 + +##URL = "http://pycurl.sourceforge.net/tests/testgetvars.php?%d" +URL = "http://pycurl.sourceforge.net/tests/teststaticpage.html?%d" + + +# +# util +# + +class Curl: + def __init__(self, url): + self.url = url + self.body = StringIO() + self.http_code = -1 + # pycurl API calls + self._curl = pycurl.Curl() + self._curl.setopt(pycurl.URL, self.url) + self._curl.setopt(pycurl.WRITEFUNCTION, self.body.write) + self._curl.setopt(pycurl.NOSIGNAL, 1) + + def perform(self): + self._curl.perform() + + def close(self): + self.http_code = self._curl.getinfo(pycurl.HTTP_CODE) + self._curl.close() + + +def print_result(items): + return # DO NOTHING + # + for c in items: + data = c.body.getvalue() + if 0: + print "**********", c.url, "**********" + print data + elif 1: + print "%-60s %3d %6d" % (c.url, c.http_code, len(data)) + + +### +### 1) multi +### + +def test_multi(): + clock1 = time.time() + + # init + handles = [] + m = pycurl.CurlMulti() + for i in range(NUM_PAGES): + c = Curl(URL %i) + m.add_handle(c._curl) + handles.append(c) + + clock2 = time.time() + + # stir state machine into action + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + + # get data + while num_handles: + m.select() + while 1: + ret, num_handles = m.perform() + if ret != pycurl.E_CALL_MULTI_PERFORM: + break + + clock3 = time.time() + + # close handles + for c in handles: + c.close() + m.close() + + clock4 = time.time() + print "multi interface: %d pages: perform %5.2f secs, total %5.2f secs" % (NUM_PAGES, clock3 - clock2, clock4 - clock1) + + # print result + print_result(handles) + + + +### +### 2) thread +### + +class Test(Thread): + def __init__(self, lock=None): + Thread.__init__(self) + self.lock = lock + self.items = [] + + def run(self): + if self.lock: + self.lock.acquire() + self.lock.release() + for c in self.items: + c.perform() + + +def test_threads(lock=None): + clock1 = time.time() + + # create and start threads, but block them + if lock: + lock.acquire() + + # init (FIXME - this is ugly) + threads = [] + handles = [] + t = None + for i in range(NUM_PAGES): + if i % (NUM_PAGES / NUM_THREADS) == 0: + t = Test(lock) + if lock: + t.start() + threads.append(t) + c = Curl(URL % i) + t.items.append(c) + handles.append(c) + assert len(handles) == NUM_PAGES + assert len(threads) == NUM_THREADS + + clock2 = time.time() + + # + if lock: + # release lock to let the blocked threads run + lock.release() + else: + # start threads + for t in threads: + t.start() + # wait for threads to finish + for t in threads: + t.join() + + clock3 = time.time() + + # close handles + for c in handles: + c.close() + + clock4 = time.time() + if lock: + print "thread interface [lock]: %d pages: perform %5.2f secs, total %5.2f secs" % (NUM_PAGES, clock3 - clock2, clock4 - clock1) + else: + print "thread interface: %d pages: perform %5.2f secs, total %5.2f secs" % (NUM_PAGES, clock3 - clock2, clock4 - clock1) + + # print result + print_result(handles) + + + +### +### 3) thread - threads grab curl objects on demand from a shared pool +### + +class TestPool(Thread): + def __init__(self, lock, pool): + Thread.__init__(self) + self.lock = lock + self.pool = pool + + def run(self): + while 1: + self.lock.acquire() + c = None + if self.pool: + c = self.pool.pop() + self.lock.release() + if c is None: + break + c.perform() + + +def test_thread_pool(lock): + clock1 = time.time() + + # init + handles = [] + for i in range(NUM_PAGES): + c = Curl(URL %i) + handles.append(c) + + # create and start threads, but block them + lock.acquire() + threads = [] + pool = handles[:] # shallow copy of the list, shared for pop() + for i in range(NUM_THREADS): + t = TestPool(lock, pool) + t.start() + threads.append(t) + assert len(pool) == NUM_PAGES + assert len(threads) == NUM_THREADS + + clock2 = time.time() + + # release lock to let the blocked threads run + lock.release() + + # wait for threads to finish + for t in threads: + t.join() + + clock3 = time.time() + + # close handles + for c in handles: + c.close() + + clock4 = time.time() + print "thread interface [pool]: %d pages: perform %5.2f secs, total %5.2f secs" % (NUM_PAGES, clock3 - clock2, clock4 - clock1) + + # print result + print_result(handles) + + + +lock = RLock() +if 1: + test_multi() + test_threads() + test_threads(lock) + test_thread_pool(lock) +else: + test_thread_pool(lock) + test_threads(lock) + test_threads() + test_multi() + diff --git a/trunk/pycurl/tests/test_post.py b/trunk/pycurl/tests/test_post.py new file mode 100644 index 0000000..f0a8ad0 --- /dev/null +++ b/trunk/pycurl/tests/test_post.py @@ -0,0 +1,24 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import urllib +import pycurl + +# simple +pf = {'field1': 'value1'} + +# multiple fields +pf = {'field1':'value1', 'field2':'value2 with blanks', 'field3':'value3'} + +# multiple fields with & in field +pf = {'field1':'value1', 'field2':'value2 with blanks and & chars', + 'field3':'value3'} + +c = pycurl.Curl() +c.setopt(c.URL, 'http://pycurl.sourceforge.net/tests/testpostvars.php') +c.setopt(c.POSTFIELDS, urllib.urlencode(pf)) +c.setopt(c.VERBOSE, 1) +c.perform() +c.close() diff --git a/trunk/pycurl/tests/test_post2.py b/trunk/pycurl/tests/test_post2.py new file mode 100644 index 0000000..74a6eca --- /dev/null +++ b/trunk/pycurl/tests/test_post2.py @@ -0,0 +1,18 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import pycurl + +pf = [('field1', 'this is a test using httppost & stuff'), + ('field2', (pycurl.FORM_FILE, 'test_post.py', pycurl.FORM_FILE, 'test_post2.py')), + ('field3', (pycurl.FORM_CONTENTS, 'this is wei\000rd, but null-bytes are okay')) + ] + +c = pycurl.Curl() +c.setopt(c.URL, 'http://www.contactor.se/~dast/postit.cgi') +c.setopt(c.HTTPPOST, pf) +c.setopt(c.VERBOSE, 1) +c.perform() +c.close() diff --git a/trunk/pycurl/tests/test_post3.py b/trunk/pycurl/tests/test_post3.py new file mode 100644 index 0000000..617eba2 --- /dev/null +++ b/trunk/pycurl/tests/test_post3.py @@ -0,0 +1,32 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import urllib +POSTSTRING = urllib.urlencode({'field1':'value1', 'field2':'value2 with blanks', 'field3':'value3'}) + +class test: + + def __init__(self): + self.finished = False + + def read_cb(self, size): + assert len(POSTSTRING) <= size + if not self.finished: + self.finished = True + return POSTSTRING + else: + # Nothing more to read + return "" + +import pycurl +c = pycurl.Curl() +t = test() +c.setopt(c.URL, 'http://pycurl.sourceforge.net/tests/testpostvars.php') +c.setopt(c.POST, 1) +c.setopt(c.POSTFIELDSIZE, len(POSTSTRING)) +c.setopt(c.READFUNCTION, t.read_cb) +c.setopt(c.VERBOSE, 1) +c.perform() +c.close() diff --git a/trunk/pycurl/tests/test_stringio.py b/trunk/pycurl/tests/test_stringio.py new file mode 100644 index 0000000..25e639b --- /dev/null +++ b/trunk/pycurl/tests/test_stringio.py @@ -0,0 +1,25 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import sys +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +import pycurl + +url = "http://curl.haxx.se/dev/" + +print "Testing", pycurl.version + +body = StringIO() +c = pycurl.Curl() +c.setopt(c.URL, url) +c.setopt(c.WRITEFUNCTION, body.write) +c.perform() +c.close() + +contents = body.getvalue() +print contents diff --git a/trunk/pycurl/tests/test_xmlrpc.py b/trunk/pycurl/tests/test_xmlrpc.py new file mode 100644 index 0000000..bc5953e --- /dev/null +++ b/trunk/pycurl/tests/test_xmlrpc.py @@ -0,0 +1,29 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +## XML-RPC lib included in python2.2 +import xmlrpclib +import pycurl + +# Header fields passed in request +xmlrpc_header = [ + "User-Agent: PycURL XML-RPC Test", "Content-Type: text/xml" + ] + +# XML-RPC request template +xmlrpc_template = """ +%s%s +""" + +# Engage +c = pycurl.Curl() +c.setopt(c.URL, 'http://betty.userland.com/RPC2') +c.setopt(c.POST, 1) +c.setopt(c.HTTPHEADER, xmlrpc_header) +c.setopt(c.POSTFIELDS, xmlrpc_template % ("examples.getStateName", xmlrpclib.dumps((5,)))) + +print 'Response from http://betty.userland.com/' +c.perform() +c.close() diff --git a/trunk/pycurl/tests/util.py b/trunk/pycurl/tests/util.py new file mode 100644 index 0000000..a1a9978 --- /dev/null +++ b/trunk/pycurl/tests/util.py @@ -0,0 +1,38 @@ +# -*- coding: iso-8859-1 -*- +# vi:ts=4:et +# $Id$ + +import os, sys + +# +# prepare sys.path in case we are still in the build directory +# see also: distutils/command/build.py (build_platlib) +# + +def get_sys_path(p=None): + if p is None: p = sys.path + p = p[:] + try: + from distutils.util import get_platform + except ImportError: + return p + p0 = "" + if p: p0 = p[0] + # + plat = get_platform() + plat_specifier = "%s-%s" % (plat, sys.version[:3]) + ##print plat, plat_specifier + # + for prefix in (p0, os.curdir, os.pardir,): + if not prefix: + continue + d = os.path.join(prefix, "build") + for subdir in ("lib", "lib." + plat_specifier, "lib." + plat): + dir = os.path.normpath(os.path.join(d, subdir)) + if os.path.isdir(dir): + if dir not in p: + p.insert(1, dir) + # + return p + + diff --git a/trunk/refresh-peer.py b/trunk/refresh-peer.py new file mode 100644 index 0000000..7c55224 --- /dev/null +++ b/trunk/refresh-peer.py @@ -0,0 +1,38 @@ +#!/usr/bin/env plcsh +# $Id$ + +import sys,os,time + +def Run (peername): + timestring=time.strftime("%Y-%m-%d-%H-%M-%S") + print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',peername + print 'RefreshPeer on %s - starting on %s'%(peername,timestring) + print 'xxxxxxxxxx' + sys.stdout.flush() + start=time.time() + result=RefreshPeer(peername) + finish=time.time() + + print 'Total duration',finish-start + print 'xxxxxxxxxx timers:' + keys=result.keys() + keys.sort() + for key in keys: + print key,result[key] + sys.stdout.flush() + sys.stderr.flush() + +def RunInLog (peername): + logname="/var/log/refresh-peer-%s.log"%(peername) + sys.stdout=open(logname,'a') + sys.stderr=sys.stdout + Run(peername) + sys.stderr.close() + sys.stdout.close() + +if __name__ == "__main__": + + for peername in sys.argv[1:]: + RunInLog (peername) + + diff --git a/trunk/setup.py b/trunk/setup.py new file mode 100755 index 0000000..7206a9e --- /dev/null +++ b/trunk/setup.py @@ -0,0 +1,20 @@ +#!/usr/bin/python +# +# Setup script for PLCAPI +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +from distutils.core import setup +from glob import glob + +setup(py_modules = ['ModPython'], + packages = ['PLC', 'PLC/Methods', 'PLC/Methods/system'], + scripts = ['plcsh', 'Server.py'], + data_files = [('', ['planetlab4.sql']), + ('php', ['php/plc_api.php']), + ('migrations', ['migrations/README.txt'] + glob('migrations/[0-9][0-9][0-9]*')), + ]) diff --git a/trunk/tests/Makefile b/trunk/tests/Makefile new file mode 100644 index 0000000..788861a --- /dev/null +++ b/trunk/tests/Makefile @@ -0,0 +1,436 @@ +### -*-Makefile-*- +# $Id$ +PLC1=plc1.inria.fr +PLC2=plc2.inria.fr + +CHROOTJAIL=/plc/root +CHROOT=chroot $(CHROOTJAIL) +PORT=5432 +SITEDIR=/etc/planetlab/configs +SITE=site.xml +APIDIR=/usr/share/plc_api +ROOTAPIDIR=/plc/root$(APIDIR) +WORKDIR=new_plc_api/tests + +PLC1SSH=root@$(PLC1) +PLC2SSH=root@$(PLC2) + +PY=python -u + +PLCS=-1 -2 +SIZES=-m -n -b -h + +all:help + +# if make is invoked with -n, run rsync, but with --dry-run +RSYNC_EXCLUDES := --exclude .svn --exclude '*~' --exclude '*.pyc' +RSYNC_CMD := rsync +RSYNC_COND_DRY_RUN := $(if $(findstring n,$(MAKEFLAGS)),--dry-run,) +RSYNC_ARGS += $(RSYNC_COND_DRY_RUN) $(RSYNC_EXCLUDES) +RSYNC := $(RSYNC_CMD) $(RSYNC_ARGS) + +#################### remote invokation and chroot hops +# rule to invoke a target within the chroot context +%.chroot: target=$(subst .chroot,,$@) +%.chroot: + $(CHROOT) $(MAKE) -C $(APIDIR)/tests INCHROOT=true $(target) + -cp $(ROOTAPIDIR)/tests/$(target) . + +# generic rules to ssh and make +# need to explicitly export MAKEFLAGS that cannot be exported by make through ssh +%.1: prefix=$(subst .1,,$@) +%.1: output=$(subst .chroot,,$(prefix)) +%.1: + @echo ">>>>>>>> entering ssh $(PLC1SSH)" + ssh $(PLC1SSH) $(MAKE) MAKEFLAGS=$(MAKEFLAGS) -C $(WORKDIR) PLCEND=1 $(prefix) + @echo "<<<<<<<< exiting ssh $(PLC1SSH)" + -scp $(PLC1SSH):$(WORKDIR)/$(output) . 2> /dev/null +%.2: prefix=$(subst .2,,$@) +%.2: output=$(subst .chroot,,$(prefix)) +%.2: + @echo ">>>>>>>> entering ssh $(PLC2SSH)" + ssh $(PLC2SSH) $(MAKE) MAKEFLAGS=$(MAKEFLAGS) -C $(WORKDIR) PLCEND=2 $(prefix) + @echo "<<<<<<<< exiting ssh $(PLC2SSH)" + -scp $(PLC2SSH):$(WORKDIR)/$(output) . 2> /dev/null + +# cannot just depend on .1 and .2 because they are phony +%.3: prefix=$(subst .3,,$@) +%.3: + $(MAKE) $(prefix).1 $(prefix).2 + +%.both: prefix=$(subst .both,,$@) +%.both: + $(MAKE) $(prefix).chroot.1 $(prefix).chroot.2 + +#################### +# phony targets MUST NOT try to get their result through scp +# usage: ssh_phony_target +define ssh_phony_target +$(1).chroot: + $(CHROOT) $(MAKE) -C $(APIDIR)/tests INCHROOT=true $(1) +$(1).1: + @echo ">>>>>>>> entering ssh $(PLC1SSH)" + ssh $(PLC1SSH) $(MAKE) MAKEFLAGS=$(MAKEFLAGS) -C $(WORKDIR) PLCEND=1 $(1) + @echo "<<<<<<<< exiting ssh $(PLC1SSH)" +$(1).2: + @echo ">>>>>>>> entering ssh $(PLC2SSH)" + ssh $(PLC2SSH) $(MAKE) MAKEFLAGS=$(MAKEFLAGS) -C $(WORKDIR) PLCEND=2 $(1) + @echo "<<<<<<<< exiting ssh $(PLC2SSH)" +endef + +#################### +define here_and_proceed_target +PHONIES += $(1) +ifdef INCHROOT +$(1): + $(2) +else +ifdef PLCEND +$(1): $(1).chroot + $(2) +else +$(1): $(1).3 + $(2) +endif +endif +endef + +#################### +#################### +#################### +PLC-PUSHS= ../PLC ../planetlab4.sql ../migrations ../plcsh ../tests + +PUSH += pclean +pclean: + -find .. '(' -name '*.pyc' -o -name '*~' ')' | xargs rm +PUSH += proot1 +proot1: + +$(RSYNC) -a -v -C ../ root@$(PLC1):new_plc_api/ +PUSH += pchroot1 +pchroot1: + +$(RSYNC) -a -v -C $(PLC-PUSHS) root@$(PLC1):$(CHROOTJAIL)$(APIDIR)/ +PUSH += proot2 +proot2: + +$(RSYNC) -a -v -C ../ root@$(PLC2):new_plc_api/ +PUSH += pchroot2 +pchroot2: + +$(RSYNC) -a -v -C $(PLC-PUSHS) root@$(PLC2):$(CHROOTJAIL)$(APIDIR)/ + +push: $(PUSH) +push.1: proot1 pchroot1 +push.2: proot2 pchroot2 +# DONT! mention this in PHONIES +.PHONY: push push.1 push.2 + +PHONIES += $(PUSH) + +#################### +PEERS += peer-gpg-1 +peer-gpg-1: + ssh $(PLC1SSH) "gpg --homedir=/etc/planetlab --export --armor > /etc/planetlab/gpg_plc1.pub" +PEERS += peer-gpg-2 +peer-gpg-2: + ssh $(PLC2SSH) "gpg --homedir=/etc/planetlab --export --armor > /etc/planetlab/gpg_plc2.pub" +# directly scp'ing from one url to the other does not work, looks like +# first host tries to connect the second one +PEERS += peer-push-gpg-1 +peer-push-gpg-1: + scp $(PLC1SSH):/etc/planetlab/gpg_plc1.pub ./ + scp ./gpg_plc1.pub $(PLC2SSH):/etc/planetlab/ +PEERS += peer-push-gpg-2 +peer-push-gpg-2: + scp $(PLC2SSH):/etc/planetlab/gpg_plc2.pub ./ + scp ./gpg_plc2.pub $(PLC1SSH):/etc/planetlab/ +PEERS += peer-push-cacert-1 +peer-push-cacert-1: + scp $(PLC1SSH):/etc/planetlab/api_ca_ssl.crt ./api_plc1.crt + scp ./api_plc1.crt $(PLC2SSH):/etc/planetlab/ + scp ./api_plc1.crt $(PLC1SSH):/etc/planetlab/ +PEERS += peer-push-cacert-2 +peer-push-cacert-2: + scp $(PLC2SSH):/etc/planetlab/api_ca_ssl.crt ./api_plc2.crt + scp ./api_plc2.crt $(PLC1SSH):/etc/planetlab/ + scp ./api_plc2.crt $(PLC2SSH):/etc/planetlab/ + +PHONIES += $(PEERS) + +PHONIES += peers +peers: $(PEERS) + +PHONIES += peers-clean +peers-clean: + rm -f /etc/planetlab/*plc[12]* + +HELP += peers-clean.3 +#################### +# upgrade : install the most recent myplc rpm found in /root/$(WORKDIR) +RPM=$(shell ls -rt /root/$(WORKDIR)/myplc*rpm | tail -1) +HELP += rpm +PHONIES += rpm +rpm: + @echo upgrade would install latest rpm : $(RPM) +HELP += version +PHONIES += version +version: + rpm -q myplc + +#### how to upgrade +UPGRADE += plc-stop +plc-stop: + -$(CHROOT) service plc safestop +UPGRADE += plc-preserve +plc-preserve: + cp $(SITEDIR)/$(SITE) . +UPGRADE += plc-uninstall +plc-uninstall: + rpm -e myplc +UPGRADE += plc-clean +plc-clean: + -rm -rf /plc/root /plc/data +UPGRADE += plc-install +plc-install: + rpm -i $(RPM) +UPGRADE += plc-reconfig +plc-reconfig: + service plc mount + mkdir -p $(SITEDIR) + cp $(SITE) $(SITEDIR) + (echo w; echo q) | $(CHROOT) plc-config-tty +UPGRADE += plc-start +plc-start: + $(CHROOT) service plc start + +PHONIES += $(UPGRADE) + +PHONIES += upgrade +upgrade: $(UPGRADE) + +#################### +# cleaning the database + +DB += db-drop +db-drop: + $(CHROOT) psql -U postgres --port $(PORT) template1 -c 'drop database planetlab4' +DB += db-restart +db-restart: + service plc stop db postgresql httpd + service plc start httpd postgresql db +DB += db-clean-save +db-clean-save: + $(CHROOT) pg_dump -c -U pgsqluser planetlab4 > test-clean.sql +DB += db-safeclean +db-safeclean: db-drop db-restart db-clean-save + +DB += db-clean +db-clean: + $(CHROOT) psql -U pgsqluser --port $(PORT) -d planetlab4 < test-clean.sql &> test-clean.restore + +PHONIES += $(DB) + +#################### +# TestPeers options : +# -m -b -h : allow to select test size (mini, normal, big, huge) +# -l 1|2 required for running -p locally from a given end for performance +# -1 | -2 shorthands for -l 1 and -l 2 - for integration with this Makefile +### the idea is: +# first clean off dbs +# run populate separately on both ends +# optionally save database at this point +# then run end of script locally +#################### + +### for a given 'targetname' like, e.g. 'e-n', we define the following targets +# testpeers..out -- for running the test +# testpeers..diff -- to compute the difference with expected result +# testpeers..adopt -- phony target for adopting new result - no commit done + +### +# generic rule for running TestPeers +# make testpeers.-option.some.stuff.out +# => python -u ./TestPeers.py -option some stuff > testpeers.-option.some.stuff.out 2>&1 +testpeers.%.out: prefix=$(subst .out,,$@) +testpeers.%.out: dotargs=$(subst testpeers.,,$(prefix)) +testpeers.%.out: args=$(subst ., ,$(dotargs)) +testpeers.%.out: + $(PY) ./TestPeers.py $(args) > $@ 2>&1 ; if [ "$$?" != 0 ] ; then mv $@ $@.fail ; exit 1; fi + +### generic rule for computing differences -- +# xxx this requires changes in TestPeers due to the new return code of RefreshPeers +# remove time/delay dependent output +normalize = egrep -v "'expires':|^+++.*ellapsed" +%.nout: %.out + $(normalize) $*.out > $@ +%.nref: %.ref + $(normalize) $*.ref > $@ + +testpeers.%.diff: out=$(subst .diff,.out,$@) +testpeers.%.diff: nout=$(subst .diff,.nout,$@) +testpeers.%.diff: ref=$(subst .diff,.ref,$@) +testpeers.%.diff: nref=$(subst .diff,.nref,$@) +testpeers.%.diff: + @if [ ! -f $(out) ] ; then echo "Could not locate $(out)" ; exit 1 ; fi + @if [ ! -f $(ref) ] ; then echo "Could not locate $(ref)" ; exit 1 ; fi + $(MAKE) $(nref) $(nout) + diff $(nref) $(nout) > $@ + +### generic rule for adopting current result +testpeers.%.ckp: prefix=$(subst .ckp,,$@) +testpeers.%.ckp: out=$(subst .ckp,.out,$@) +testpeers.%.ckp: ref=$(subst .ckp,.ref,$@) +testpeers.%.ckp: + @if [ ! -f $(out) ] ; then echo "Could not locate $(out)" ; exit 1 ; fi + cp $(out) $(ref) + rm -f $(prefix).{diff,nout,nref} + +testpeers.%.clean: prefix=$(subst .clean,,$@) +testpeers.%.clean: + rm -f $(prefix).{out,nout,nref,diff} + + +HELP += testpeers-clean +$(eval $(call here_and_proceed_target,testpeers-clean,rm -f testpeers*.nref testpeers*.nout)) + +HELP += testpeers-distclean +$(eval $(call here_and_proceed_target,testpeers-distclean,rm -f testpeers*.out testpeers*.sql testpeers*.nref testpeers*.nout)) + +HELP += clean +clean: testpeers-clean +HELP += sqlclean +$(eval $(call here_and_proceed_target,sqlclean,rm test*.sql)) +HELP += distclean +distclean: testpeers-distclean +PHONIES += clean distclean + +HELP += sql-clean +$(eval $(call here_and_proceed_target,sql-clean,rm testpeers.*.sql)) + +############################## +# creating a snapshot of the databases +# for efficiency this is done from a Direct API method, thus under a chroot + +define snapshot_and_restore_size_plc +testpeers.$(1).$(2).sql: testpeers.$(1).$(2).out + pg_dump -c -U pgsqluser planetlab4 > testpeers.$(1).$(2).sql + +testpeers.$(1).$(2).restore: testpeers.$(1).$(2).sql + echo Restoring testpeers.$(1).$(2).sql + psql -U pgsqluser --port $(PORT) -d planetlab4 -f testpeers.$(1).$(2).sql &> testpeers.$(1).$(2).restore +DB-SQL += testpeers.$(1).$(2).sql +DB-RESTORE += testpeers.$(1).$(2).restore +endef + +define snapshot_and_restore_size +$(foreach plc,$(PLCS),$(eval $(call snapshot_and_restore_size_plc,$(1),$(plc).populate))) +endef + +$(foreach size,$(SIZES),$(eval $(call snapshot_and_restore_size,$(size)))) + +define populate_shortcut +ifndef PLCEND +populate$(1): populate$(1).init populate$(1).run +populate$(1).all: db-clean.3 populate$(1).clean populate$(1).init populate$(1).run +populate$(1).init: testpeers.$(1).-1.populate.out.chroot.1 testpeers.$(1).-1.populate.sql.chroot.1 +populate$(1).init: testpeers.$(1).-2.populate.out.chroot.2 testpeers.$(1).-2.populate.sql.chroot.2 +populate$(1).restore: testpeers.$(1).-1.populate.restore.chroot.1 testpeers.$(1).-2.populate.restore.chroot.2 +populate$(1).run: testpeers.$(1).populate_end.out +populate$(1).diff: testpeers.$(1).-1.populate.diff testpeers.$(1).-2.populate.diff testpeers.$(1).populate_end.diff +populate$(1).ckp: testpeers.$(1).-1.populate.ckp testpeers.$(1).-2.populate.ckp testpeers.$(1).populate_end.ckp +$(eval $(call here_and_proceed_target,populate$(1).clean,rm -f testpeers.$(1)*populate*.out testpeers.$(1)*populate*.restore)) +$(eval $(call here_and_proceed_target,populate$(1).sqlclean,rm -f testpeers.$(1)*populate*.sql)) +endif +endef + +$(foreach size,$(SIZES),$(eval $(call populate_shortcut,$(size)))) + +populate.help: + @echo "====================" + @echo "populate test targets" + @echo -e "populate-n\t\truns .init and .run" + @echo -e "populate-b.init\t\texpects a clean db, populates only and dumps" + @echo -e "populate-b.all\t\tcleans the db and former test results, runs the full test" + @echo -e "populate-m.run\t\truns the actual test after both plcs were inited" + @echo -e "populate-h.restore\t\trestores both plcs as if just inited" + @echo -e "populate-n.ckp\t\tcheckpoints out files as references" + @echo -e "populate-n.diff\t\tcompares out files against reference" + +#################### +define testpeers_shortcut +ifndef PLCEND +testpeers$(1).run: testpeers.$(1).test_all.out +testpeers$(1).all: db-clean.3 testpeers.$(1).test_all.out +testpeers$(1).diff: testpeers.$(1).test_all.diff +testpeers$(1).ckp: testpeers.$(1).test_all.ckp +endif +endef + +$(foreach size,$(SIZES),$(eval $(call testpeers_shortcut,$(size)))) + +testpeers.help: + @echo "Available sizes" $(SIZES) + @echo "testpeers targets" + @echo -e "testpeers-n.run\t\truns the test" + @echo -e "testpeers-b.all\t\tcleans the db and former test results, runs the full test" + @echo -e "testpeers-m.run\t\truns the actual test after both plcs were inited" + @echo -e "testpeers-h.restore\t\trestores both plcs as if just inited" + @echo -e "testpeers-n.ckp\t\tcheckpoints out files as references" + @echo -e "testpeers-n.diff\t\tcompares out files against reference" + + +#################### +RUN += api +api: + $(CHROOT) /usr/bin/plcsh +RUN += sql +sql: + $(CHROOT) psql -U pgsqluser planetlab4 +RUN += log +log: + emacs /plc/data/var/log/httpd/error_log /plc/data/var/log/boot.log + +PHONIES += $(RUN) + + +$(foreach phony,$(PHONIES),$(eval $(call ssh_phony_target,$(phony)))) + +####### +help: testpeers.help populate.help + @echo "====================" + @echo "other known targets:" + @echo "db family:" $(DB) + @echo -e "e.g.\tmake db-clean.3" + @echo "push:" $(PUSH) + @echo "peers:" $(PEERS) + @echo "====================" + @echo "For running on plc1, on plc2, or both:" + @echo -e "\t make .1 .2 " + @echo "For running in a chroot jail" + @echo -e "\t make .chroot" + @echo "So for running on both nodes chroots" + @echo -e "\t make .chroot.3" + @echo "for running TestPeers : testpeers=.out" + @echo -e "\t e.g. make testpeers.-m.test_all" + @echo -e "\t e.g. make testpeers.-h.-1.populate" + @echo "comparing run with reference : testpeers..diff" + @echo "adopt run as reference : testpeers..ckp" + @echo -e "\t e.g. make testpeers.-m.test_all" + @echo -e "\t e.g. make testpeers.-h.-1.populate" + @echo "====================" + @echo "Supported size variants:" $(SIZES) + @echo "Supported plc ids:" $(PLCS) + @echo "snapshotting the DB : " $(DB-SQL) $(DB-RESTORE) + @echo "====================" + @echo "upgrade:" $(UPGRADE) + @echo "run family (convenience):" $(RUN) + @echo "OTHERS:" $(HELP) + + +#################### convenience, for debugging only +# make +foo : prints the value of $(foo) +# make ++foo : idem but verbose, i.e. foo=$(foo) +++%: varname=$(subst +,,$@) +++%: + @echo "$(varname)=$($(varname))" ++%: varname=$(subst +,,$@) ++%: + @echo "$($(varname))" + diff --git a/trunk/tests/Test.py b/trunk/tests/Test.py new file mode 100755 index 0000000..8ff3ad2 --- /dev/null +++ b/trunk/tests/Test.py @@ -0,0 +1,281 @@ +#!/usr/bin/python +# +# Test script for peer caching +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +""" +Test script for peer caching. Intended for testing multiple PLCs +running on the same machine in different chroots. Here is how I set +things up after installing and configuring MyPLC: + +# Shut down MyPLC +service plc stop + +# Copy to /plc2 +cp -ra /plc /plc2 +ln -sf plc /etc/init.d/plc2 +echo 'PLC_ROOT=/plc2/root' > /etc/sysconfig/plc2 +echo 'PLC_DATA=/plc2/data' >> /etc/sysconfig/plc2 + +# Edit /plc2/data/etc/planetlab/plc_config.xml and change at least the +# following so that they do not conflict with the defaults: +# +# PLC_NAME (e.g., PlanetLab Two) +# PLC_SLICE_PREFIX (e.g., two) +# PLC_ROOT_USER (e.g., root@planetlab.two) +# PLC_API_MAINTENANCE_USER (e.g., maint@planetlab.two) +# PLC_DB_PORT (e.g., 5433) +# PLC_WWW_PORT (e.g., 81) +# PLC_WWW_SSL_PORT (e.g., 444) +# PLC_API_PORT (must be the same as PLC_WWW_SSL_PORT, e.g., 444) +# PLC_BOOT_SSL_PORT (must be the same as PLC_WWW_SSL_PORT, e.g., 444) +# PLC_BOOT_PORT (may be the same as PLC_WWW_PORT, e.g., 81) + +# Start up both MyPLC instances +service plc start +service plc2 start + +# Run test +./Test.py -f /etc/planetlab/plc_config -f /plc2/data/etc/planetlab/plc_config + +# If the test fails and your databases are corrupt and/or you want to +# start over, you can always just blow the databases away. +service plc stop +rm -rf /plc/data/var/lib/pgsql/data +service plc start + +service plc2 stop +rm -rf /plc2/data/var/lib/pgsql/data +service plc2 start +""" + +import re +from optparse import OptionParser + +from PLC.Config import Config +from PLC.GPG import gpg_export +from PLC.Shell import Shell +from PLC.Test import Test + +def todict(list_of_dicts, key): + """ + Turn a list of dicts into a dict keyed on key. + """ + + return dict([(d[key], d) for d in list_of_dicts]) + +def RefreshPeers(plcs): + """ + Refresh each peer with each other. + """ + + for plc in plcs: + for peer in plcs: + if peer == plc: + continue + + print plc.config.PLC_NAME, "refreshing", peer.config.PLC_NAME + plc.RefreshPeer(peer.config.PLC_NAME) + + peer_id = plc.GetPeers([peer.config.PLC_NAME])[0]['peer_id'] + + peer_sites = todict(plc.GetSites({'peer_id': peer_id}), 'site_id') + sites_at_peer = todict(peer.GetSites(), 'site_id') + + peer_keys = todict(plc.GetKeys({'peer_id': peer_id}), 'key_id') + keys_at_peer = todict(peer.GetKeys(), 'key_id') + + peer_persons = todict(plc.GetPersons({'peer_id': peer_id}), 'person_id') + persons_at_peer = todict(peer.GetPersons(), 'person_id') + + peer_nodes = todict(plc.GetNodes({'peer_id': peer_id}), 'node_id') + nodes_at_peer = todict(peer.GetNodes(), 'node_id') + + our_nodes = todict(plc.GetNodes({'peer_id': None}), 'node_id') + our_peer_id_at_peer = peer.GetPeers([plc.config.PLC_NAME])[0]['peer_id'] + our_nodes_at_peer = todict(peer.GetNodes({'peer_id': our_peer_id_at_peer, + 'peer_node_id': our_nodes.keys()}), 'peer_node_id') + + peer_slices = todict(plc.GetSlices({'peer_id': peer_id}), 'peer_slice_id') + slices_at_peer = todict(peer.GetSlices(), 'slice_id') + + for site_id, site in peer_sites.iteritems(): + # Verify that this site exists at the peer + peer_site_id = site['peer_site_id'] + assert peer_site_id in sites_at_peer + peer_site = sites_at_peer[peer_site_id] + + # And is the same + for field in ['name', 'abbreviated_name', 'login_base', 'is_public', + 'latitude', 'longitude', 'url', + 'max_slices', 'max_slivers',]: + assert site[field] == peer_site[field] + + for key_id, key in peer_keys.iteritems(): + # Verify that this key exists at the peer + peer_key_id = key['peer_key_id'] + assert peer_key_id in keys_at_peer + peer_key = keys_at_peer[peer_key_id] + + # And is the same + for field in ['key_type', 'key']: + assert key[field] == peer_key[field] + + for person_id, person in peer_persons.iteritems(): + # Verify that this user exists at the peer + peer_person_id = person['peer_person_id'] + assert peer_person_id in persons_at_peer + peer_person = persons_at_peer[peer_person_id] + + # And is the same + for field in ['first_name', 'last_name', 'title', 'email', 'phone', + 'url', 'bio', 'enabled']: + assert person[field] == peer_person[field] + + for key_id in person['key_ids']: + # Verify that the user is not associated with any local keys + assert key_id in peer_keys + key = peer_keys[key_id] + peer_key_id = key['peer_key_id'] + + # Verify that this key exists at the peer + assert peer_key_id in keys_at_peer + peer_key = keys_at_peer[peer_key_id] + + # And is related to the same user at the peer + assert peer_key['key_id'] in peer_person['key_ids'] + + for node_id, node in peer_nodes.iteritems(): + # Verify that this node exists at the peer + peer_node_id = node['peer_node_id'] + assert peer_node_id in nodes_at_peer + peer_node = nodes_at_peer[peer_node_id] + + # And is the same + for field in ['boot_state', 'ssh_rsa_key', 'hostname', + 'version', 'model']: + assert node[field] == peer_node[field] + + # Verify that the node is not associated with any local sites + assert node['site_id'] in peer_sites + site = peer_sites[node['site_id']] + + # Verify that this site exists at the peer + peer_site_id = site['peer_site_id'] + assert peer_site_id in sites_at_peer + peer_site = sites_at_peer[peer_site_id] + + # And is related to the same node at the peer + assert peer_site['site_id'] == peer_node['site_id'] + + for slice_id, slice in peer_slices.iteritems(): + # Verify that this slice exists at the peer + peer_slice_id = slice['peer_slice_id'] + assert peer_slice_id in slices_at_peer + peer_slice = slices_at_peer[peer_slice_id] + + # And is the same + for field in ['name', 'instantiation', 'url', 'description', + 'max_nodes', 'expires']: + assert slice[field] == peer_slice[field] + + for node_id in slice['node_ids']: + # Verify that the slice is associated only with + # the peer's own nodes, or with our nodes as + # last cached by the peer. + assert node_id in peer_nodes or node_id in our_nodes_at_peer + if node_id in peer_nodes: + node = peer_nodes[node_id] + peer_node_id = node['peer_node_id'] + elif node_id in our_nodes_at_peer: + peer_node = our_nodes_at_peer[node_id] + peer_node_id = peer_node['node_id'] + + # Verify that this node exists at the peer + assert peer_node_id in nodes_at_peer + + # And is related to the same slice at the peer + assert peer_node_id in peer_slice['node_ids'] + +def TestPeers(plcs, check = True, verbose = True, tiny = False): + # Register each peer with each other + for plc in plcs: + for peer in plcs: + if peer == plc: + continue + + key = gpg_export(peer.chroot + peer.config.PLC_ROOT_GPG_KEY_PUB) + cacert = file(peer.chroot + peer.config.PLC_API_CA_SSL_CRT).read() + + if plc.GetPeers([peer.config.PLC_NAME]): + print plc.config.PLC_NAME, "updating peer", peer.config.PLC_NAME + plc.UpdatePeer(peer.config.PLC_NAME, + {'peer_url': peer.url, 'key': key, 'cacert': cacert}) + else: + print plc.config.PLC_NAME, "adding peer", peer.config.PLC_NAME + plc.AddPeer({'peername': peer.config.PLC_NAME, + 'peer_url': peer.url, 'key': key, 'cacert': cacert}) + + # Populate the DB + plc.test = Test(api = plc, check = check, verbose = verbose) + + if tiny: + params = Test.tiny + else: + params = Test.default + + print "Populating", plc.config.PLC_NAME + plc.test.Add(**params) + + # Refresh each other + RefreshPeers(plcs) + + # Change some things + for plc in plcs: + print "Updating", plc.config.PLC_NAME + plc.test.Update() + + # Refresh each other again + RefreshPeers(plcs) + +def main(): + parser = OptionParser() + parser.add_option("-f", "--config", dest = "configs", action = "append", default = [], help = "Configuration file (default: %default)") + parser.add_option("-c", "--check", action = "store_true", default = False, help = "Verify actions (default: %default)") + parser.add_option("-q", "--quiet", action = "store_true", default = False, help = "Be quiet (default: %default)") + parser.add_option("-t", "--tiny", action = "store_true", default = False, help = "Run a tiny test (default: %default)") + (options, args) = parser.parse_args() + + # Test single peer by default + if not options.configs: + options.configs = ["/etc/planetlab/plc_config"] + + plcs = [] + for path in options.configs: + # Load configuration file + config = Config(path) + + # Determine path to chroot + m = re.match(r'(.*)/etc/planetlab', path) + if m is not None: + chroot = m.group(1) + else: + chroot = "" + + # Fix up path to SSL certificate + cacert = chroot + config.PLC_API_CA_SSL_CRT + + # Always connect with XML-RPC + plc = Shell(config = path, cacert = cacert, xmlrpc = True) + plc.chroot = chroot + plcs.append(plc) + + TestPeers(plcs, check = options.check, verbose = not options.quiet, tiny = options.tiny) + +if __name__ == "__main__": + main() diff --git a/trunk/tests/TestCases.py b/trunk/tests/TestCases.py new file mode 100755 index 0000000..c46e12f --- /dev/null +++ b/trunk/tests/TestCases.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +import sys + +class TestCases: + + def __init__ (self): + pass + + def initialize (self): + print "Performing : initialize" + print "current options",self.options + print "e.g. verbose=",self.options.verbose + + def cleanup (self): + print "Cleaning up" + + def testcase_1 (self): + print "\tRunning testcase 1" + + def testcase_2 (self): + print "\tRunning testcase 2" + + def testcase_3 (self): + print "\tRunning testcase 3" + + def testcase_standard (self): + print "\tRunning testcase standard" + + def main (self): + + from optparse import OptionParser + usage="""Usage: %prog [options] steps +steps can include + like in %prog 1 2+3""" + parser = OptionParser (usage=usage) + parser.add_option ("-v","--verbose",action="store_true", + dest="verbose",default=False, + help="run in verbose mode") + parser.add_option ("-a","--all",action="store_true", + dest="all",default=False, + help="Run all known testcases") + (self.options, args)=parser.parse_args() + + ### get the list of steps to run + steps=[] + if self.options.all: + # locates all local methods starting with "testcase_" + for method_name in dir(self): + # does it start with testcase_ + if (method_name.find('testcase_',0,len('testcase_'))==0): + print 'considering method',method_name + steps+=[method_name] + else: + for arg in args: + # support for the 2+3 syntax + steplist=arg.split("+") + for step in steplist: + steps += [ 'testcase_'+step] + + ### run them + # args contains the steps to run + for method_name in steps: + method=getattr(self,method_name) + if method: + print '============================== TestCases mainloop' + self.initialize() + method() + self.cleanup() + +if __name__ == "__main__": + TestCases().main() diff --git a/trunk/tests/TestPeers.py b/trunk/tests/TestPeers.py new file mode 100755 index 0000000..5013317 --- /dev/null +++ b/trunk/tests/TestPeers.py @@ -0,0 +1,1205 @@ +#!/usr/bin/env python +### +############################## +### +### preparation / requirements +### +### two separate instances of myplc +### for now they are located on the same box on lurch +### +### requirements : +### your myplcs should more or less come out of the box, +### I prefer not to alter the default PLC_ROOT_USER value, +### instead we create a PI account on the site_id=1 +### +############################## + +subversion_id="$Id$" + +import sys +import time +import os + +sys.path.append("..") + +from PLC.Shell import Shell +import PLC.Methods + +#################### + +## try to support reload +try: + globals()['plc'] +except: + plc=[None,None,None] +try: + globals()['s'] +except: + s=[None,None,None] + +#################### +plc[1]={ 'plcname':'FederationTestPlc1', + 'hostname':'plc1.inria.fr', + 'url-format':'https://%s:443/PLCAPI/', + 'builtin-admin-id':'root@plc1.inria.fr', + 'builtin-admin-password':'root', + 'peer-admin-name':'peer1@planet-lab.eu', + 'peer-admin-password':'peer', + 'node-format':'n1-%03d.plc1.org', + 'plainname' : 'one', + 'site-format':'one%s', + 'person-format' : 'user-%d@plc.org', + 'key-format':'ssh-rsa somekey4plctestbed user%d-key%d', + 'person-password' : 'password1', + 'gpg-keyring':'gpg_plc2.pub', + 'api-cacert':'api_plc2.crt', + } +plc[2]={ 'plcname':'FederationTestPlc2', + 'hostname':'plc2.inria.fr', + 'url-format':'https://%s:443/PLCAPI/', + 'builtin-admin-id':'root@plc2.inria.fr', + 'builtin-admin-password':'root', + 'peer-admin-name':'peer2@planet-lab.eu', + 'peer-admin-password':'peer', + 'node-format':'n2-%03d.plc2.org', + 'plainname' : 'two', + 'site-format':'two%s', + 'person-format' : 'user-%d@plc.org', + 'key-format':'ssh-rsa somekey4plctestbed user%d-key%d', + 'person-password' : 'password2', + 'gpg-keyring':'gpg_plc1.pub', + 'api-cacert':'api_plc1.crt', + } + +#################### +# when running locally, we might wish to run only our local stuff +dummy_print_methods = [ 'RefreshPeer' ] +class DummyShell: + class Callable: + def __init__(self,method,index): + self.method=method + self.index=index + self.printed=False + def __call__ (self, *args, **kwds): + if not self.printed or self.method in dummy_print_methods: + print "Dummy method %s on remote peer %d skipped"%(self.method,self.index) + self.printed=True + return 0 + def __init__(self,index): + self.index=index + for method in PLC.Methods.methods: + # ignore path-defined methods for now + if "." not in method: + setattr(self,method,DummyShell.Callable(method,self.index)) + +#################### +# predefined stuff +# number of 'system' persons +# builtin maint, local root, 1 person for the peering +system_persons = 3 +# among that, 1 gets refreshed - other ones are considered 'system' +system_persons_cross = 1 + +system_slices_ids = (1,) +def system_slices (): + return len(system_slices_ids) +def total_slices (): + return number_slices+system_slices() + +def system_slivers (): + return len(system_slices_ids) + +# too tedious to do the maths : how many slices attached to node 1 +expected_slivers=None +def total_slivers (): + global expected_slivers + if expected_slivers is None: + expected_slivers=0 + actual_nodes_per_slice = min (number_nodes,number_nodes_per_slice) + for ns in myrange(number_slices): + slice_range = [ map_on_node (n+ns) for n in range(actual_nodes_per_slice)] + if 1 in slice_range: + expected_slivers += 1 + return expected_slivers+system_slivers() + +#################### +# set initial conditions +# actual persons_per_slice is min(number_persons,number_persons_per_slice) +# actual nodes_per_slice is min(number_nodes,number_nodes_per_slice) +# this is to prevent quadractic test times on big tests +def define_test (sites,persons,nodes,slices, + keys_per_person,nodes_per_slice,persons_per_slice,fast_mode=None): + global number_sites, number_persons, number_nodes, number_slices + global number_keys_per_person, number_nodes_per_slice, number_persons_per_slice, fast_flag + number_sites = sites + number_persons=persons + number_nodes=nodes + number_slices=slices + number_keys_per_person=keys_per_person + number_nodes_per_slice=nodes_per_slice + number_persons_per_slice=persons_per_slice + if fast_mode is not None: + fast_flag=fast_mode + +# when we run locally on a given peer +local_peer=None + +def show_test(): + print '%d sites, %d persons, %d nodes & %d slices'%( + number_sites,number_persons,number_nodes,number_slices) + print '%d keys/person, %d nodes/slice & %d persons/slice'%( + number_keys_per_person,number_nodes_per_slice,number_persons_per_slice) + print 'fast_flag',fast_flag + if local_peer is not None: + print 'Running locally on index %d'%local_peer + +def mini(): + define_test(1,1,1,1,1,1,1,True) + +def normal(): + define_test (sites=4,persons=4,nodes=5,slices=4, + keys_per_person=2,nodes_per_slice=3,persons_per_slice=6,fast_mode=False) + +def apply_factor (factor): + global number_sites, number_persons, number_nodes, number_slices + [number_sites, number_persons, number_nodes, number_slices] = \ + [factor*x for x in [number_sites, number_persons, number_nodes, number_slices]] + + +# use only 1 key in this case +big_factor=4 +def big(): + global number_sites, number_persons, number_nodes, number_slices + number_sites=200 + number_persons=500 + number_nodes=350 + number_slices=500 + global nodes_per_slice + nodes_per_slice=3 + global number_keys_per_person + number_keys_per_person=1 + global number_persons_per_slice + number_persons_per_slice=3 + +#huge_factor=1000 +def huge(): + global number_sites, number_persons, number_nodes, number_slices + number_sites=1000 + number_persons=2000 + number_nodes=3000 + number_slices=2000 + global nodes_per_slice + nodes_per_slice=3 + global number_keys_per_person + number_keys_per_person=1 + global number_persons_per_slice + number_persons_per_slice=3 + +# use mini test by default in interactive mode +mini() +#normal() + +#################### +# argh, for login_name that doesn't accept digits +plain_numbers=['zero','one','two','three','four','five','six','seven','eight','nine','ten', + 'eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen','twenty'] +plain_digits=['a','b','c','d','e','f','g','h','i','j'] +#################### +def peer_index(i): + return 3-i + +def plc_name (i): + return plc[i]['plcname'] + +def site_name (i,n): + x=site_login_base(i,n) + return 'Site fullname '+x + +def site_login_base (i,n): + # for huge + if number_sites%s'%(i,url), + if builtin_person: + user=plc[i]['builtin-admin-id'] + password=plc[i]['builtin-admin-password'] + else: + user=plc[i]['peer-admin-name'] + password=plc[i]['peer-admin-password'] + s[i]=Shell(url=url, + user=user, + password=password) + print 'user=',user + elif local_peer == i: + # local mode - use Shell's Direct mode - use /etc/planetlab/plc_config + s[i]=Shell() + else: + # remote peer in local mode : use dummy shell instead + s[i]=DummyShell(i) + +# use new person's account + +def test00_print (args=[1,2]): + for i in args: + print '==================== s[%d]'%i +# s[i].show_config() + print 'show_config obsoleted' + print '====================' + +def check_nodes (el,ef,args=[1,2]): + for i in args: + # use a single request and sort afterwards for efficiency + # could have used GetNodes's scope as well + all_nodes = s[i].GetNodes() + n = len ([ x for x in all_nodes if x['peer_id'] is None]) + f = len ([ x for x in all_nodes if x['peer_id'] is not None]) + print '%02d: Checking nodes: got %d local (e=%d) & %d foreign (e=%d)'%(i,n,el,f,ef) + myassert ('local nodes',n==el) + myassert ('foreign nodes',f==ef) + +def check_keys (el,ef,args=[1,2]): + for i in args: + # use a single request and sort afterwards for efficiency + # could have used GetKeys's scope as well + all_keys = s[i].GetKeys() + n = len ([ x for x in all_keys if x['peer_id'] is None]) + f = len ([ x for x in all_keys if x['peer_id'] is not None]) + print '%02d: Checking keys: got %d local (e=%d) & %d foreign (e=%d)'%(i,n,el,f,ef) + myassert ('local keys',n==el) + myassert ('foreign_keys',f==ef) + +def check_persons (el,ef,args=[1,2]): + for i in args: + # use a single request and sort afterwards for efficiency + # could have used GetPersons's scope as well + all_persons = s[i].GetPersons() + n = len ([ x for x in all_persons if x['peer_id'] is None]) + f = len ([ x for x in all_persons if x['peer_id'] is not None]) + print '%02d: Checking persons: got %d local (e=%d) & %d foreign (e=%d)'%(i,n,el,f,ef) + myassert ('local persons',n==el) + myassert ('foreign persons',f==ef) + +# expected : local slices, foreign slices +def check_slices (els,efs,args=[1,2]): + for i in args: + ls=len(s[i].GetSlices({'peer_id':None})) + fs=len(s[i].GetSlices({'~peer_id':None})) + print '%02d: Checking slices: got %d local (e=%d) & %d foreign (e=%d)'%(i,ls,els,fs,efs) + myassert ('local slices',els==ls) + myassert ('foreign slices',efs==fs) + +def show_nodes (i,node_ids): + # same as above + all_nodes = s[i].GetNodes(node_ids) + loc_nodes = filter (lambda n: n['peer_id'] is None, all_nodes) + for_nodes = filter (lambda n: n['peer_id'] is not None, all_nodes) + + for message,nodes in [ ['LOC',loc_nodes], ['FOR',for_nodes] ] : + if nodes: + print '[%s:%d] : '%(message,len(nodes)), + for node in nodes: + print node['hostname']+' ', + print '' + +def check_slice_nodes (expected_nodes, is_local_slice, args=[1,2]): + for ns in myrange(number_slices): + check_slice_nodes_n (ns,expected_nodes, is_local_slice, args) + +def check_slice_nodes_n (ns,expected_nodes, is_local_slice, args=[1,2]): + for i in args: + peer=peer_index(i) + if is_local_slice: + sname=slice_name(i,ns) + slice=s[i].GetSlices({'name':[sname],'peer_id':None})[0] + message='local' + else: + sname=slice_name(peer,ns) + slice=s[i].GetSlices({'name':[sname],'~peer_id':None})[0] + message='foreign' + print '%02d: %s slice %s (e=%d) '%(i,message,sname,expected_nodes), + slice_node_ids=slice['node_ids'] + print 'on nodes ',slice_node_ids + show_nodes (i,slice_node_ids) + myassert ('slice nodes',len(slice_node_ids)>=expected_nodes) + if len(slice_node_ids) != expected_nodes: + print 'TEMPORARY' + +# expected : nodes on local slice +def check_local_slice_nodes (expected, args=[1,2]): + check_slice_nodes(expected,True,args) + +# expected : nodes on foreign slice +def check_foreign_slice_nodes (expected, args=[1,2]): + check_slice_nodes(expected,False,args) + +def check_conf_files (args=[1,2]): + for nn in myrange(number_nodes): + check_conf_files_n (nn,args) + +def check_conf_files_n (nn,args=[1,2]): + for i in args: + nodename=node_name(i,nn) + ndict= s[i].GetSlivers([nodename])[0] + myassert ('conf files',ndict['hostname'] == nodename) + conf_files = ndict['conf_files'] + print '%02d: %d conf_files in GetSlivers for node %s'%(i,len(conf_files),nodename) + for conf_file in conf_files: + print 'source=',conf_file['source'],'|', + print 'dest=',conf_file['dest'],'|', + print 'enabled=',conf_file['enabled'],'|', + print '' + +import pprint +pp = pprint.PrettyPrinter(indent=3) + +def check_slivers (esn,args=[1,2]): + for nn in myrange(number_nodes): + check_slivers_n (nn,esn,args) + +# too verbose to check all nodes, let's check only the first one +def check_slivers_1 (esn,args=[1,2]): + check_slivers_n (1,esn,args) + +def check_slivers_n (nn,esn,args=[1,2]): + for i in args: + nodename=node_name(i,nn) + ndict= s[i].GetSlivers(nodename) + myassert ('slivers hostname',ndict['hostname'] == nodename) + slivers = ndict['slivers'] + print '%02d: %d slivers (exp. %d) in GetSlivers for node %s'\ + %(i,len(slivers),esn,nodename) + for sliver in slivers: + print '>>slivername = ',sliver['name'] + pretty_printer.pprint(sliver) + myassert ('slivers count',len(slivers) == esn) + + +#################### +def test00_admin_person (args=[1,2]): + global plc + for i in args: + email = plc[i]['peer-admin-name'] + try: + p=s[i].GetPersons([email])[0] + plc[i]['peer-admin-id']=p['person_id'] + except: + person_id=s[i].AddPerson({'first_name':'Local', + 'last_name':'PeerPoint', + 'role_ids':[10], + 'email':email, + 'password':plc[i]['peer-admin-password']}) + if person_id: + print '%02d:== created peer admin account %d, %s - %s'%( + i, person_id,plc[i]['peer-admin-name'],plc[i]['peer-admin-password']) + plc[i]['peer-admin-id']=person_id + +def test00_admin_enable (args=[1,2]): + for i in args: + if s[i].AdmSetPersonEnabled(plc[i]['peer-admin-id'],True): + s[i].AddRoleToPerson('admin',plc[i]['peer-admin-id']) + print '%02d:== enabled+admin on account %d:%s'%(i,plc[i]['peer-admin-id'],plc[i]['peer-admin-name']) + +#################### +def locate_key (filename): + " tries to locate a key file, either in . or in /etc/planetlab" + try: + return file("./"+filename).read() + except: + try: + return file("/etc/planetlab/"+filename).read() + except: + raise Exception,"Could not locate key %s"%filename + + +def test00_peer (args=[1,2]): + global plc + for i in args: + peer=peer_index(i) + peername = plc_name(peer) + try: + p=s[i].GetPeers ( [peername])[0] + except: + try: + keyringname=plc[i]['gpg-keyring'] + cacertname=plc[i]['api-cacert'] + print 'Trying to locate keys for peer on plc[%d]'%i, + print 'in %s and %s'%(keyringname,cacertname) + + keyring=locate_key(keyringname) + cacert=locate_key(cacertname) + peer_id=s[i].AddPeer ( {'peername':peername, + 'peer_url':plc[peer]['url'], + 'key':keyring, + 'cacert': cacert, + }) + print '%02d:Created peer %d'%(i,peer_id) + except Exception,e: + print 'Could not create peer,',e + +# this one gets cached +def get_peer_id (i): + try: + return plc[i]['peer_id'] + except: + peername = plc_name (peer_index(i)) + peer_id = s[i].GetPeers([peername])[0]['peer_id'] + plc[i]['peer_id'] = peer_id + return peer_id + +############################## +def test00_refresh (message,args=[1,2]): + print '=== refresh',message + timer_show() + for i in args: + print '%02d:== Refreshing peer'%(i) + timers=s[i].RefreshPeer(get_peer_id(i)) + print "+++ ellapsed: {", + keys=timers.keys() + keys.sort() + for key in keys: + print key,timers[key], + print "}" + timer_show() + +#################### +def test01_site (args=[1,2]): + for ns in myrange(number_sites): + test01_site_n (ns,True,args) + +def test01_del_site (args=[1,2]): + for ns in myrange(number_sites): + test01_site_n (ns,False,args) + +def test01_site_n (ns,add_if_true,args=[1,2]): + for i in args: + login_base = site_login_base (i,ns) + try: + site_id = s[i].GetSites([login_base])[0]['site_id'] + if not add_if_true: + if s[i].DeleteSite(site_id): + print "%02d:== deleted site_id %d"%(i,site_id) + except: + if add_if_true: + sitename=site_name(i,ns) + abbrev_name="abbr"+str(i) + max_slices = number_slices + site_id=s[i].AddSite ( {'name':plc_name(i), + 'abbreviated_name': abbrev_name, + 'login_base': login_base, + 'is_public': True, + 'url': 'http://%s.com/'%abbrev_name, + 'max_slices':max_slices}) + ### max_slices does not seem taken into account at that stage + if site_id: + s[i].UpdateSite(site_id,{'max_slices':max_slices}) + print '%02d:== Created site %d with max_slices=%d'%(i,site_id,max_slices) + +#################### +def test02_person (args=[1,2]): + for np in myrange(number_persons): + test02_person_n (np,True,args) + +def test02_del_person (args=[1,2]): + for np in myrange(number_persons): + test02_person_n (np,False,args) + +def test02_person_n (np,add_if_true,args=[1,2]): + test02_person_n_ks (np, myrange(number_keys_per_person),add_if_true,args) + +def test02_person_n_ks (np,nks,add_if_true,args=[1,2]): + for i in args: + email = person_name(i,np) + try: + person_id=s[i].GetPersons([email])[0]['person_id'] + if not add_if_true: + if s[i].DeletePerson(person_id): + print "%02d:== deleted person_id %d"%(i,person_id) + except: + if add_if_true: + password = plc[i]['person-password'] + person_id=s[i].AddPerson({'first_name':'Your average', + 'last_name':'User%d'%np, + 'role_ids':[30], + 'email':email, + 'password': password }) + if person_id: + print '%02d:== created user account %d, %s - %s'%(i, person_id,email,password) + for nk in nks: + key=key_name(i,np,nk) + s[i].AddPersonKey(email,{'key_type':'ssh', 'key':key}) + print '%02d:== added key %s to person %s'%(i,key,email) + +#################### +# retrieves node_id from hostname - checks for local nodes only +def get_local_node_id(i,nodename): + return s[i].GetNodes({'hostname':nodename,'peer_id':None})[0]['node_id'] + +# clean all local nodes - foreign nodes are not supposed to be cleaned up manually +def clean_all_nodes (args=[1,2]): + for i in args: + print '%02d:== Cleaning all nodes'%i + local_nodes = s[i].GetNodes({'peer_id':None}) + if local_nodes: + for node in local_nodes: + print '%02d:==== Cleaning node %d'%(i,node['node_id']) + s[i].DeleteNode(node['node_id']) + +def test03_node (args=[1,2]): + for nn in myrange(number_nodes): + test03_node_n (nn,args) + +def test03_node_n (nn,args=[1,2]): + for i in args: + nodename = node_name(i,nn) + try: + get_local_node_id(i,nodename) + except: + login_base=site_login_base(i,map_on_site(nn)) + n=s[i].AddNode(login_base,{'hostname': nodename}) + if n: + print '%02d:== Added node %d %s'%(i,n,node_name(i,nn)) + +def test02_delnode (args=[1,2]): + for nn in myrange(number_nodes): + test02_delnode_n (nn,args) + +def test02_delnode_n (nn,args=[1,2]): + for i in args: + nodename = node_name(i,nn) + node_id = get_local_node_id (i,nodename) + retcod=s[i].DeleteNode(nodename) + if retcod: + print '%02d:== Deleted node %d, returns %s'%(i,node_id,retcod) + +#################### +def clean_all_slices (args=[1,2]): + for i in args: + print '%02d:== Cleaning all slices'%i + for slice in s[i].GetSlices({'peer_id':None}): + slice_id = slice['slice_id'] + if slice_id not in system_slices_ids: + if s[i].DeleteSlice(slice_id): + print '%02d:==== Cleaned slice %d'%(i,slice_id) + +def test04_slice (args=[1,2]): + for n in myrange(number_slices): + test04_slice_n (n,args) + +def test04_slice_n (ns,args=[1,2]): + for i in args: + peer=peer_index(i) + plcname=plc_name(i) + slicename=slice_name(i,ns) + max_nodes=number_nodes + try: + s[i].GetSlices([slicename])[0] + except: + slice_id=s[i].AddSlice ({'name':slicename, + 'description':'slice %s on %s'%(slicename,plcname), + 'url':'http://planet-lab.org/%s'%slicename, + 'max_nodes':max_nodes, + 'instanciation':'plc-instantiated', + }) + if slice_id: + print '%02d:== created slice %d - max nodes=%d'%(i,slice_id,max_nodes) + actual_persons_per_slice = min (number_persons,number_persons_per_slice) + person_indexes=[map_on_person (p+ns) for p in range(actual_persons_per_slice)] + for np in person_indexes: + email = person_name (i,np) + retcod = s[i].AddPersonToSlice (email, slicename) + print '%02d:== Attached person %s to slice %s'%(i,email,slicename) + + +def test04_node_slice (is_local, add_if_true, args=[1,2]): + for ns in myrange(number_slices): + test04_node_slice_ns (ns,is_local, add_if_true, args) + +def test04_node_slice_ns (ns,is_local, add_if_true, args=[1,2]): + actual_nodes_per_slice = min (number_nodes,number_nodes_per_slice) + node_indexes = [ map_on_node (n+ns) for n in range(actual_nodes_per_slice)] + test04_node_slice_nl_n (node_indexes,ns,is_local, add_if_true, args) + +def test04_node_slice_nl_n (nnl,ns,is_local, add_if_true, args=[1,2]): + for i in args: + peer=peer_index(i) + sname = slice_name (i,ns) + + if is_local: + hostnames=[node_name(i,nn) for nn in nnl] + nodetype='local' + else: + hostnames=[node_name(peer,nn) for nn in nnl] + nodetype='foreign' + if add_if_true: + res=s[i].AddSliceToNodes (sname,hostnames) + message="added" + else: + res=s[i].DeleteSliceFromNodes (sname,hostnames) + message="deleted" + if res: + print '%02d:== %s in slice %s %s '%(i,message,sname,nodetype), + print hostnames + +def test04_slice_add_lnode (args=[1,2]): + test04_node_slice (True,True,args) + +def test04_slice_add_fnode (args=[1,2]): + test04_node_slice (False,True,args) + +def test04_slice_del_lnode (args=[1,2]): + test04_node_slice (True,False,args) + +def test04_slice_del_fnode (args=[1,2]): + test04_node_slice (False,False,args) + +#################### +def test05_sat (args=[1,2]): + for i in args: + name = sat_name(i) + try: + sat_id=s[i].GetSliceAttributeTypes ([name])[0] + except: + description="custom sat on plc%d"%i + min_role_id=10 + sat_id=s[i].AddSliceAttributeType ({ 'name':name, + 'description': description, + 'min_role_id' : min_role_id}) + if sat_id: + print '%02d:== created SliceAttributeType = %d'%(i,sat_id) + +# for test, we create 4 slice_attributes +# on slice1 - sat=custom_made (see above) - all nodes +# on slice1 - sat=custom_made (see above) - node=n1 +# on slice1 - sat='net_max' - all nodes +# on slice1 - sat='net_max' - node=n1 + +def test05_sa_atom (slice_name,sat_name,value,node,i): + sa_id=s[i].GetSliceAttributes({'name':sat_name, + 'value':value}) + if not sa_id: + if node: + sa_id=s[i].AddSliceAttribute(slice_name, + sat_name, + value, + node) + else: + print 'slice_name',slice_name,'sat_name',sat_name + sa_id=s[i].AddSliceAttribute(slice_name, + sat_name, + value) + if sa_id: + print '%02d:== created SliceAttribute = %d'%(i,sa_id), + print 'On slice',slice_name,'and node',node + +def test05_sa (args=[1,2]): + for i in args: + test05_sa_atom (slice_name(i,1),sat_name(i),'custom sat/all nodes',None,i) + test05_sa_atom (slice_name(i,1),sat_name(i),'custom sat/node1',node_name(i,1),i) + test05_sa_atom (slice_name(i,1),'vref','predefined sat/all nodes',None,i) + test05_sa_atom (slice_name(i,1),'vref','predefined sat/node1',node_name(i,1),i) + +############################## +# readable dumps +############################## +def p_site (s): + print s['site_id'],s['peer_id'],s['login_base'],s['name'],s['node_ids'] + +def p_key (k): + print k['key_id'],k['peer_id'],k['key'] + +def p_person (p): + print p['person_id'],p['peer_id'],p['email'],'keys:',p['key_ids'],'sites:',p['site_ids'] + +def p_node(n): + print n['node_id'],n['peer_id'],n['hostname'],'sls=',n['slice_ids'],'site=',n['site_id'] + +def p_slice(s): + print 'name: %-12s'%s['name'],'id: %02d'%s['slice_id'],'peer:',s['peer_id'],'nodes=',s['node_ids'],'persons=',s['person_ids'] + print '---','sa_ids=',s['slice_attribute_ids'],'creator: %03r'%s['creator_person_id'] + print "--- 'expires':",s['expires'] + +def p_sat(sat): + print 'sat_id: %02d'%sat['attribute_type_id'], 'min_role_id:',sat['min_role_id'], + print 'name:', sat['name'],'<',sat['description'],'>' + +def p_sa (sa): + print 'name: %-12s'%sa['name'], + print 'sa_id: %02d'%sa['slice_attribute_id'],'sat_id: %02d'%sa['attribute_type_id'], + print 'sl=%02d'%sa['slice_id'],'v=',sa['value'],'n=',sa['node_id'] + +import pprint +pretty_printer=pprint.PrettyPrinter(5) + +def p_sliver (margin,x): + print margin,'SLIVERS for : hostname',x['hostname'] + print margin,'%d config files'%len(x['conf_files']) + for sv in x['slivers']: + p_sliver_slice(margin,sv,x['hostname']) + +def p_sliver_slice(margin,sliver,hostname): + print margin,'SLIVER on hostname %s, s='%hostname,sliver['name'] + print margin,'KEYS', + pretty_printer.pprint(sliver['keys']) + print margin,'ATTRIBUTES', + pretty_printer.pprint(sliver['attributes']) + +def dump (args=[1,2]): + for i in args: + print '%02d:============================== DUMPING'%i + print '%02d: SITES'%i + [p_site(x) for x in s[i].GetSites()] + print '%02d: KEYS'%i + [p_key(x) for x in s[i].GetKeys()] + print '%02d: PERSONS'%i + [p_person(x) for x in s[i].GetPersons()] + print '%02d: NODES'%i + [p_node(x) for x in s[i].GetNodes()] + print '%02d: SLICES'%i + [p_slice(x) for x in s[i].GetSlices()] + print '%02d: Slice Attribute Types'%i + [p_sat(x) for x in s[i].GetSliceAttributeTypes()] + print '%02d: Slice Attributes'%i + [p_sa(x) for x in s[i].GetSliceAttributes()] + timer_show() + snodes=min(3,number_nodes) + print '%02d: SLIVERS for first %d nodes'%(i,snodes) + print 'WARNING - GetSlivers needs fix' +# for id in myrange(snodes): +# p_sliver('%02d:'%i,s[i].GetSlivers(id)) + + print '%02d:============================== END DUMP'%i + + +## for usage under the api +def pt (): + for x in GetSites(): + p_site(x) + +def pk (): + for x in GetKeys(): + print (x['key_id'],x['peer_id'],x['key']) + +def pp (): + for x in GetPersons(): + p_person(x) + +def pn (): + for x in GetNodes(): + p_node(x) + +def ps (): + for x in GetSlices(): + p_slice(x) + +def psat(): + for x in GetSliceAttributeTypes(): + p_sat(x) + +def psa(): + for x in GetSliceAttributes(): + p_sa(x) + +def pv (): + for s in GetSlivers(): + p_sliver('',s) + +def all(): + print 'SITES' + pt() + print 'KEYS' + pk() + print 'PERSONS' + pp() + print 'NODES' + pn() + print 'SLICES' + ps() + print 'SLICE ATTR TYPES' + psat() + print 'SLICE ATTRS' + psa() + print 'SLIVERS' + pv() + + +#################### +def test_all_init (): + message ("INIT") + test00_init (builtin_person=True) + test00_print () + test00_admin_person () + test00_admin_enable () + test00_init (builtin_person=False) +# required before we can add peers +# use make -f peers-test.mk peers instead +# test00_push_public_peer_material() + test00_peer () + +def test_all_sites (): + test01_site () + test00_refresh ('after site creation') + +def test_all_persons (): + test02_del_person() + test00_refresh ('before persons&keys creation') + check_keys(0,0) + check_persons(system_persons,system_persons_cross) + message ("Creating persons&keys") + test02_person () + if not fast_flag: + message ("1 extra del/add cycle for unique indexes") + test02_del_person([2]) + test02_person([2]) + check_keys(number_persons*number_keys_per_person,0) + check_persons(system_persons+number_persons,system_persons_cross) + test00_refresh ('after persons&keys creation') + check_keys(number_persons*number_keys_per_person,number_persons*number_keys_per_person) + check_persons(system_persons+number_persons,system_persons_cross+number_persons) + +def test_all_nodes (): + + message ("RESETTING NODES") + clean_all_nodes () + test00_refresh ('cleaned nodes') + check_nodes(0,0) + + # create one node on each site + message ("CREATING NODES") + test03_node () + check_nodes(number_nodes,0) + test00_refresh ('after node creation') + check_nodes(number_nodes,number_nodes) + test02_delnode([2]) + if not fast_flag: + message ("2 extra del/add cycles on plc2 for different indexes") + test03_node ([2]) + test02_delnode([2]) + test03_node ([2]) + test02_delnode([2]) + check_nodes(0,number_nodes,[2]) + test00_refresh('after deletion on plc2') + check_nodes(number_nodes,0,[1]) + check_nodes(0,number_nodes,[2]) + message ("ADD on plc2 for different indexes") + test03_node ([2]) + check_nodes (number_nodes,0,[1]) + check_nodes (number_nodes,number_nodes,[2]) + test00_refresh('after re-creation on plc2') + check_nodes (number_nodes,number_nodes,) + +def test_all_addslices (): + + # reset + message ("RESETTING SLICES TEST") + clean_all_nodes () + test03_node () + clean_all_slices () + test00_refresh ("After slices init") + + # create slices on plc1 + message ("CREATING SLICES on plc1") + test04_slice ([1]) + + check_slices (total_slices(),0,[1]) + check_slices (system_slices(),0,[2]) + test00_refresh ("after slice created on plc1") + check_slices (total_slices(),0,[1]) + check_slices (system_slices(),number_slices,[2]) + # no slice has any node yet + check_local_slice_nodes(0,[1]) + check_foreign_slice_nodes(0,[2]) + + # insert local nodes in local slice on plc1 + message ("ADDING LOCAL NODES IN SLICES") + test04_slice_add_lnode ([1]) + # of course the change is only local + check_local_slice_nodes (number_nodes_per_slice,[1]) + check_foreign_slice_nodes(0,[2]) + + # refreshing + test00_refresh ("After local nodes were added on plc1") + check_local_slice_nodes (number_nodes_per_slice,[1]) + check_foreign_slice_nodes (number_nodes_per_slice,[2]) + + # now we add foreign nodes into local slice + message ("ADDING FOREIGN NODES IN SLICES") + test04_slice_add_fnode ([1]) + check_local_slice_nodes (2*number_nodes_per_slice,[1]) + check_foreign_slice_nodes (number_nodes_per_slice,[2]) + + # refreshing + test00_refresh ("After foreign nodes were added in plc1") + # remember that foreign slices only know about LOCAL nodes + # so this does not do anything + check_local_slice_nodes (2*number_nodes_per_slice,[1]) + check_foreign_slice_nodes (2*number_nodes_per_slice,[2]) + + check_slivers_1(total_slivers()) + +def test_all_delslices (): + + message ("DELETING FOREIGN NODES FROM SLICES") + test04_slice_del_fnode([1]) + check_local_slice_nodes (number_nodes_per_slice,[1]) + check_foreign_slice_nodes (2*number_nodes_per_slice,[2]) + # mmh? + check_slivers_1(total_slivers(),[1]) + + test00_refresh ("After foreign nodes were removed on plc1") + check_local_slice_nodes (number_nodes_per_slice,[1]) + check_foreign_slice_nodes (number_nodes_per_slice,[2]) + + message ("DELETING LOCAL NODES FROM SLICES") + test04_slice_del_lnode([1]) + check_local_slice_nodes (0,[1]) + check_foreign_slice_nodes (number_nodes_per_slice,[2]) + + test00_refresh ("After local nodes were removed on plc1") + check_local_slice_nodes (0,[1]) + check_foreign_slice_nodes (0,[2]) + + message ("CHECKING SLICES CLEAN UP") + clean_all_slices([1]) + check_slices (system_slices(),0,[1]) + check_slices (system_slices(),number_slices,[2]) + test00_refresh ("After slices clenaup") + check_slices(system_slices(),0) + +def test_all_slices (): + test_all_addslices () + test_all_delslices () + +def test_all_sats (): + test05_sat () + test00_refresh("after SliceAttributeType creation") + +def test_all (): + test_all_init () + timer_show() + test_all_sites () + timer_show() + test_all_persons () + timer_show() + test_all_nodes () + timer_show() + test_all_slices () + timer_show() + test_all_sats () + timer_show() + dump() + timer_show() + message("END") + +### ad hoc test sequences +# we just create objects here so we can dump the DB +def populate (): + timer_start() + test_all_init() + timer_show() + test01_site() + timer_show() + test02_person() + timer_show() + test03_node() + timer_show() + test04_slice([1]) + timer_show() + test04_slice_add_lnode([1]) + timer_show() + test05_sat() + timer_show() + test05_sa([1]) + timer_show() + message("END") + +def populate_end(): + test00_init(builtin_person=False) + test00_refresh ("Peer 1 for publishing foreign nodes from 2",[1]) + timer_show() + test04_slice_add_fnode([1]) + timer_show() + test00_refresh("populate: refresh all") + timer_show() + test00_refresh("empty refresh") + dump() + timer_show() + message("END") + +# temporary - scratch as needed +def test_now (): + test_all_init() + +# populate() +# test00_refresh('peer 1 gets plc2 nodes',[1]) +# test04_slice_add_fnode([1]) +# test00_refresh('final',[1]) +# +# test_all_sites () +# clean_all_nodes() +# clean_all_slices() +# populate() + +from optparse import OptionParser +def main (): + usage = "Usage: %prog [options] [ [function1] .. fn]" + + parser=OptionParser(usage=usage,version="%prog "+subversion_id) + parser.add_option("-m","--mini",action="store_const", const="mini",dest="size", + help="run in mini mode (1 instance of each class)") + parser.add_option("-n","--normal",action="store_const", const="normal",dest="size", + default="normal", + help="performs big run") + parser.add_option("-b","--big",action="store_const", const="big",dest="size", + help="performs big run") + parser.add_option("-H","--huge",action="store_const", const="huge",dest="size", + help="performs huge run") + parser.add_option("-f","--factor",action="store", dest="factor",default=1, + help="multiply size by FACTOR") + + parser.add_option("-l","--local",action="store", dest="local_peer", + help="tester runs locally for peer LOCAL_PEER, rather than through xmlrpc") + parser.add_option("-1",action="store_const", const=1, dest="local_peer", + help="shortcut for -l 1") + parser.add_option("-2",action="store_const", const=2, dest="local_peer", + help="shortcut for -l 2") + + parser.add_option("--plc1",action="store",dest="plc1", default="", + help="specifies plc1 hostname") + parser.add_option("--plc2",action="store",dest="plc2", default="", + help="specifies plc2 hostname") + + parser.add_option("-d","--debug",dest="debug",action="store_true",default=False, + help="Just shows what would be done") + + (options,args) = parser.parse_args() + + print 'options',options,'args',args + + steps = [] + if len(args) > 0: + steps=args + else: + steps = [ 'test_all'] + + # perform size initialisation + size_func=globals()[options.size] + size_func() + # apply factor + apply_factor(int(options.factor)) + + # support for the --plc options + global plc + if options.plc1: + plc[1]['hostname']=options.plc1 + if options.plc2: + plc[2]['hostname']=options.plc2 + + # update global local_peer + global local_peer + local_peer=options.local_peer + + show_test() + + for funcname in steps: + print 'funcname',funcname + print 'dir()',dir() + if funcname not in globals(): + print 'Unknown step',funcname,'skipped' + else: + if options.debug: + print "Would invoke function",funcname + else: + func = globals()[funcname] + func() + timer_show() + epilogue() + +if __name__ == '__main__': + main() + diff --git a/trunk/tests/readme.txt b/trunk/tests/readme.txt new file mode 100644 index 0000000..43ed829 --- /dev/null +++ b/trunk/tests/readme.txt @@ -0,0 +1,149 @@ +==== requirements +you need to have +(*) one master test machine (abbreved 'test') - this is where you +trigger everything from +(*) two servers with myplc installed (abbreved 'plc1' and 'plc2') +at this stage the myplc configuration needs to be done by hand +you also need root ssh access from the test box to the two plc boxes in both boxes + +-- configuring the plc servers: +(*) set their names in the Makefile (PLC1 and PLC2) +(*) edit TestPeers.py too -- xxx should be improved + +To some extent this stuff can be ran to control a single plc. + +==== concepts +right now, 4 tests sizes are supported, they are named +* m (minimal) 1 object of each kind is created +* n (normal) a few of each kind +* b (big) a few hundreds +* h (huge) a few thousands + +two modes are supported: + +(1) single run mode: everything is ran from the 'test' box +this is a convenient, but very slow mode, especially for large sizes +because each individual object is created in a single xmlrpc command +>>> xxx btw, I did not know about begin/commit at that time, but I do not + think it can speed up to the point where the second mode does +In this mode, both DB's are populated together, and various checks can +be done on the fly + +(2) populate-and-run mode +where the DB populating parts are done beforehand, and separately, +from each plc's chroot jail for direct access to the DB +This mode allows for dump&restore of the populated DB + +==== preparation + +(*) manually install both myplc, do the configs manually (once and for +good, see upgrades below) + +(*) initial setup +- check Makefile and TestPeers.py for correct identification of + +(*) push the stuff +$ make push +so the local repository gets synced on all nodes. + +(*) get and push peers information +$ make peers +(at least once) so the gpg and other authentication materials get pushed to both nodes + +==== use cases + +IMPORTANT: for cleaning up previous tests if needed + +$ make db-clean.3 +=> cleans up both databases if needed +<<< xxx this uses the initscripts to perform the job, it's a bit slow on +old boxes, could probably be improved by snapshotting the db right +after plc gets started>>> + +(1) + +$ make testpeers.help + +$ make testpeers-m.run +assumes the dbs are clean, and runs the test locally + +$ make testpeers-b.all +cleans both dbs and runs .run + +$ make testpeers-m.diff +checks the output agaist the .ref file that chould be under subversion + +$ make testpeers-m.ckp +adopts the current .out as a reference for that test - does *not* +commit under subversion, just copies the .out into .ref + +(2) + +$ make populate.help + +$ make populate-m.all +cleans both dbs, cleans any former result, then runs .init and .run + +$ make populate-b.init +assumes both dbs are clean, populates both databases and dumps database in the .sql files + +$ make populate-b.run +performs the populate_end part of the test from the populated database + +$ make populate-b.restore +restores the database from the stage where it just populated + +$ make populate-b.clean +cleans everything except the sql files + +$ make populate-b.sqlclean +cleans the .sql files + +==== various utilities + +(*) upgrading both plcs (xxx could be improved): +- log as root on both plc servers and manually curl the myplc rpm you +want, in /root/new_plc_api/tests +- back to the server node: +$ make upgrade.3 + +if you want to upgrade only one, of course just use targets upgrade.1 +or upgrade.2 + +(*) cleaning the database +$ make db-clean.1 (or .2 or .3) + + + +==== implementation notes +I've designed this thing so everything can be invoked from the test +server, even when things need to be actually triggered from a chroot + +For this reason the same pieces of code (namely Makefile and +TestPeers.py) needs to be accessible from +(*) the test server +(*) root's homedir on both plc's, namely in /root/new_plc_api/tests +(*) chroot jail on both plc's, namely in /plc/root/usr/share/plc_api/tests + +This is where the 'push' target comes in +xxx at this stage the push target pushes the whole API, because I used this +to test the code that I was patching on the test node. this can be improved + +TARGET structure + +If you need to invoke something on a given plc, append '.1' or '.2' to the target name +$ make db-clean.1 +Will run the 'db-clean' target on the plc1 node + +for convenience: +$ make db-clean.3 +will run db-clean on both plc's + +When something needs to be ran in the chroot jail, run +$ make sometarget.chroot +that will make sometarget from the chroot jail + +So from the test server +$ make sometarget.chroot.3 +runs in both chroot jails + diff --git a/trunk/tests/regrtests.cron b/trunk/tests/regrtests.cron new file mode 100644 index 0000000..0712923 --- /dev/null +++ b/trunk/tests/regrtests.cron @@ -0,0 +1,26 @@ +PL_PATH = "/u/jbagdis/planetlab/tests" + +# update plots +*/3 * * * * cd $PL_PATH; python -c 'import tests; tests.make_plots()' + +# fill/empty slice +0 */6 * * * cd $PL_PATH; python -c 'import tests; tests.empty_slice("princeton_jbagdis")' +0 3-23/6 * * * cd $PL_PATH; python -c 'import tests; tests.fill_slice("princeton_jbagdis")' +0 */4 * * * cd $PL_PATH; python -c 'import tests; tests.empty_slice("princeton_bagdis2")' +5 */4 * * * cd $PL_PATH; python -c 'import tests; tests.fill_slice("princeton_bagdis2")' +0 1-23/4 * * * cd $PL_PATH; python -c 'import tests; tests.add_key("key1")' +0 2-23/4 * * * cd $PL_PATH; python -c 'import tests; tests.update_key("key1", "key2")' +0 3-23/4 * * * cd $PL_PATH; python -c 'import tests; tests.delete_key("key2")' + + + +# count nodes +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_in_slice_by_api("princeton_jbagdis")' >> $PL_PATH/data/nodes_in_slice +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_in_slice_by_api("princeton_bagdis2")' >> $PL_PATH/data/nodes_in_slice2 +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_by_api()' >> $PL_PATH/data/nodes +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_can_ssh("princeton_jbagdis", "key0")' >> $PL_PATH/data/nodes_can_ssh +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_good_by_comon()' >> $PL_PATH/data/nodes_good +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_can_ssh("princeton_bagdis2", "key0")' >> $PL_PATH/data/nodes_can_ssh2_key0 +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_can_ssh("princeton_bagdis2", "key1")' >> $PL_PATH/data/nodes_can_ssh2_key1 +* * * * * cd $PL_PATH; python -c 'import tests; tests.count_nodes_can_ssh("princeton_bagdis2", "key2")' >> $PL_PATH/data/nodes_can_ssh2_key2 + diff --git a/trunk/tests/regrtests.py b/trunk/tests/regrtests.py new file mode 100644 index 0000000..602a145 --- /dev/null +++ b/trunk/tests/regrtests.py @@ -0,0 +1,308 @@ +#!/usr/bin/python + +import time, sys, urllib, os, tempfile, random + +# set up the api +import xmlrpclib +api = xmlrpclib.Server('https://www.planet-lab.org/PLCAPI/') + +# create auth struct +auth = {} +auth['Username'] = "USERNAME GOES HERE" +auth['AuthMethod'] = "password" +auth['AuthString'] = "PASSWORD GOES HERE" +auth['Role'] = "user" + +multiquery_path = "PATH/TO/CODEPLOY/multiquery" +gnuplot_path = "/PATH/TO/gnuplot" + +# create plots +def make_plots(): + plot_fill_empty() + plot_keys() + #os.system("cp plots/*.png ~/public_html/planetlab/tests") + + +# get formatted tic string for gnuplot +def getTimeTicString(t1, t2, step): + first_hour = list(time.localtime(t1)) + if not first_hour[4] == first_hour[5] == 0: + first_hour[4] = 0 + first_hour[5] = 0 + + first_hour_time = int(time.mktime(first_hour)) + first_hour_time += 3600 + + backsteps = (first_hour_time - t1) + backsteps /= step + start = first_hour_time - backsteps * step + + tics = [] + thistime = start + while thistime < t2: + tics.append("\"%s\" %d" % \ + (time.strftime("%H:%M", time.localtime(thistime)), thistime)) + thistime += step + + ticstr = ", ".join(tics) + return ticstr + + +# count total number of nodes in PlanetLab, according to the api +def count_nodes_by_api(): + all_nodes = [row['node_id'] for row in api.GetNodes(auth, {}, ['node_id'])] + print "%d\t%d" % (round(time.time()), len(all_nodes)) + + +# count total number of nodes in slice, according to the api +def count_nodes_in_slice_by_api(slice=None): + if slice is None: + return + + slice_id = [row['slice_id'] for row in \ + api.GetSlices(auth, {'name': slice}, ['slice_id'])][0] + + all_nodes = [row['node_id'] for row in \ + api.GetNodes(auth, {}, ['node_id', 'slice_ids']) \ + if slice_id in row['slice_ids']] + + print "%d\t%d" % (round(time.time()), len(all_nodes)) + + +# count total number of "good" nodes, according to CoMon +def count_nodes_good_by_comon(): + comon = urllib.urlopen("http://summer.cs.princeton.edu/status/tabulator.cgi?table=table_nodeviewshort&format=nameonly&select='resptime%20%3E%200%20&&%20((drift%20%3E%201m%20||%20(dns1udp%20%3E%2080%20&&%20dns2udp%20%3E%2080)%20||%20gbfree%20%3C%205%20||%20sshstatus%20%3E%202h)%20==%200)'") + good_nodes = comon.readlines() + + print "%d\t%d" % (round(time.time()), len(good_nodes)) + +# estimate total number of nodes reachable by ssh +def count_nodes_can_ssh(slice=None, key=None): + if slice is None: + return + if key is None: + return + + pollnum = 20 + + all_nodes = ["%s\n" % row['hostname'] for row in \ + api.GetNodes(auth, {}, ['hostname'])] + + rand_nodes = [] + for i in range(pollnum): + rand_nodes.append(all_nodes[random.randint(0,len(all_nodes)-1)]) + + tmpfilename = tempfile.mktemp() + tmpfile = open(tmpfilename, 'w') + tmpfile.writelines(rand_nodes) + tmpfile.close() + + tmpfilename2 = tempfile.mktemp() + tmpfile2 = open(tmpfilename2, 'w') + tmpfile2.writelines(""" + export MQ_SLICE="$1" + export MQ_NODES="$2" + + eval `ssh-agent` >/dev/null 2>&1 + trap "kill $SSH_AGENT_PID" 0 + ssh-add ./keys/$3 >/dev/null 2>&1 + + %s 'uname' 2>/dev/null | + grep "bytes" | + grep -v ": 0 bytes" | + wc -l + """ % multiquery_path) + tmpfile2.close() + + ssh_result = os.popen("bash %s %s %s %s 2>/dev/null" % (tmpfilename2, slice, tmpfilename, key)).readlines() + if len(ssh_result) > 0: + ssh_count = float(ssh_result[0].strip()) * len(all_nodes) / pollnum + print "%d\t%d" % (round(time.time()), round(ssh_count)) + + if os.path.exists(tmpfilename): + os.unlink(tmpfilename) + + + + +# remove all nodes from a slice +def empty_slice(slice=None): + if slice is None: + return + + all_nodes = [row['node_id'] for row in api.GetNodes(auth, {}, ['node_id'])] + api.DeleteSliceFromNodes(auth, slice, all_nodes) + + +# add all nodes to a slice +def fill_slice(slice=None): + all_nodes = [row['node_id'] for row in api.GetNodes(auth, {}, ['node_id'])] + api.AddSliceToNodes(auth, slice, all_nodes) + + +# add a key to a user +def add_key(key=None): + if key is None: + return + + key_value = open("keys/%s.pub" % key).readline() + + api.AddPersonKey(auth, auth['Username'], {'key_type': 'ssh', 'key': key_value}) + + +# update a user's key +def update_key(oldkey=None, newkey=None): + if oldkey is None: + return + if newkey is None: + return + + oldkeyval = open("keys/%s.pub" % oldkey).readline() + newkeyval = open("keys/%s.pub" % newkey).readline() + keyid = [row['key_id'] for row in api.GetKeys(auth) if row['key'] == oldkeyval] + if len(keyid) == 0: + return + keyid = keyid[0] + api.UpdateKey(auth, keyid, {'key_type': 'ssh', 'key': newkeyval}) + + +# delete a key from the user +def delete_key(delkey=None): + if delkey is None: + return + + delkeyval = open("keys/%s.pub" % delkey).readline() + delkeyid = [row['key_id'] for row in api.GetKeys(auth) if row['key'] == delkeyval] + if len(delkeyid) == 0: + return + delkeyid = delkeyid[0] + api.DeleteKey(auth, delkeyid) + + +# create the fill/empty plot +def plot_fill_empty(): + #ticstep = 3600 # 1 hour + #plotlength = 36000 # 10 hours + ticstep = 1800 + plotlength = 10800 + + tmpfilename = tempfile.mktemp() + tmpfile = open(tmpfilename, 'w') + + starttime = -1 + stoptime = -1 + for datafilename in ['data/nodes', 'data/nodes_in_slice', \ + 'data/nodes_can_ssh', 'data/nodes_good']: + datafile = open(datafilename, 'r') + line1 = datafile.readline() + datafile.seek(-32,2) + line2 = datafile.readlines().pop() + thisstarttime = int(line1.split("\t")[0]) + if starttime == -1 or thisstarttime < starttime: + starttime = thisstarttime + thisstoptime = int(line2.split("\t")[0]) + if stoptime == -1 or thisstoptime > stoptime: + stoptime = thisstoptime + + stopx = stoptime + startx = max(starttime, stopx - plotlength) + starttime = startx + + tics = getTimeTicString(starttime, stoptime, ticstep) + + startdate = time.strftime("%b %m, %Y - %H:%M", time.localtime(startx)) + stopdate = time.strftime("%H:%M", time.localtime(stopx)) + + tmpfile.write(""" + set term png + set output "plots/fill_empty.png" + + set title "Number of Nodes / Time - %s to %s" + set xlabel "Time" + set ylabel "Number of Nodes" + + set xtics (%s) + set xrange[%d:%d] + set yrange[0:950] + + plot "data/nodes" u 1:2 w lines title "Total Nodes", \ + "data/nodes_in_slice" u 1:2 w lines title "Nodes in Slice", \ + "data/nodes_good" u 1:2 w lines title \ + "Healthy Nodes (according to CoMon)", \ + "data/nodes_can_ssh" u 1:2 w lines title "Nodes Reachable by SSH" + + """ % (startdate, stopdate, tics, startx, stopx)) + + tmpfile.close() + + os.system("%s %s" % (gnuplot_path, tmpfilename)) + + if os.path.exists(tmpfilename): + os.unlink(tmpfilename) + + + +# create the keys plot +def plot_keys(): + #ticstep = 3600 # 1 hour + #plotlength = 36000 # 10 hours + ticstep = 1800 + plotlength = 10800 + + tmpfilename = tempfile.mktemp() + tmpfile = open(tmpfilename, 'w') + + starttime = -1 + stoptime = -1 + for datafilename in ['data/nodes', 'data/nodes_in_slice2', \ + 'data/nodes_good', 'data/nodes_can_ssh2_key0', 'data/nodes_can_ssh2_key1', \ + 'data/nodes_can_ssh2_key2']: + datafile = open(datafilename, 'r') + line1 = datafile.readline() + datafile.seek(-32,2) + line2 = datafile.readlines().pop() + thisstarttime = int(line1.split("\t")[0]) + if starttime == -1 or thisstarttime < starttime: + starttime = thisstarttime + thisstoptime = int(line2.split("\t")[0]) + if stoptime == -1 or thisstoptime > stoptime: + stoptime = thisstoptime + + stopx = stoptime + startx = max(starttime, stopx - plotlength) + starttime = startx + + tics = getTimeTicString(starttime, stoptime, ticstep) + + startdate = time.strftime("%b %m, %Y - %H:%M", time.localtime(startx)) + stopdate = time.strftime("%H:%M", time.localtime(stopx)) + + tmpfile.write(""" + set term png + set output "plots/keys.png" + + set title "Number of Nodes / Time - %s to %s" + set xlabel "Time" + set ylabel "Number of Nodes" + + set xtics (%s) + set xrange[%d:%d] + set yrange[0:1000] + + plot "data/nodes" u 1:2 w lines title "Total Nodes", \ + "data/nodes_in_slice2" u 1:2 w lines title "Nodes in Slice", \ + "data/nodes_good" u 1:2 w lines title \ + "Healthy Nodes (according to CoMon)", \ + "data/nodes_can_ssh2_key0" u 1:2 w lines title "Nodes Accepting Key 0", \ + "data/nodes_can_ssh2_key1" u 1:2 w lines title "Nodes Accepting Key 1", \ + "data/nodes_can_ssh2_key2" u 1:2 w lines title "Nodes Accepting Key 2" + + """ % (startdate, stopdate, tics, startx, stopx)) + + tmpfile.close() + + os.system("%s %s" % (gnuplot_path, tmpfilename)) + + if os.path.exists(tmpfilename): + os.unlink(tmpfilename) + diff --git a/trunk/tests/testpeers.-b.-1.populate.ref b/trunk/tests/testpeers.-b.-1.populate.ref new file mode 100644 index 0000000..87ccb6e --- /dev/null +++ b/trunk/tests/testpeers.-b.-1.populate.ref @@ -0,0 +1,4102 @@ +options {'local_peer': 1, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'big'} args ['populate'] +200 sites, 500 persons, 350 nodes & 500 slices +1 keys/person, 1 nodes/slice & 3 persons/slice +fast_flag True +Running locally on index 1 +funcname populate +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +==================== ('INIT',) ++++ timer start +==================== s[1] +show_config obsoleted +==================== s[2] +show_config obsoleted +==================== +01:== created peer admin account 3, peer1@planet-lab.org - peer +Dummy method GetPersons on remote peer 2 skipped +Dummy method AddPerson on remote peer 2 skipped +01:== enabled+admin on account 3:peer1@planet-lab.org +Dummy method AdmSetPersonEnabled on remote peer 2 skipped ++++ timer start +Trying to locate keys for peer on plc[1] in gpg_plc2.pub and api_plc2.crt +01:Created peer 1 +Dummy method GetPeers on remote peer 2 skipped +Trying to locate keys for peer on plc[2] in gpg_plc1.pub and api_plc1.crt +Dummy method AddPeer on remote peer 2 skipped +02:Created peer 0 ++++ 0.35 seconds ellapsed (0.35) +01:== Created site 2 with max_slices=500 +Dummy method GetSites on remote peer 2 skipped +Dummy method AddSite on remote peer 2 skipped +01:== Created site 3 with max_slices=500 +01:== Created site 4 with max_slices=500 +01:== Created site 5 with max_slices=500 +01:== Created site 6 with max_slices=500 +01:== Created site 7 with max_slices=500 +01:== Created site 8 with max_slices=500 +01:== Created site 9 with max_slices=500 +01:== Created site 10 with max_slices=500 +01:== Created site 11 with max_slices=500 +01:== Created site 12 with max_slices=500 +01:== Created site 13 with max_slices=500 +01:== Created site 14 with max_slices=500 +01:== Created site 15 with max_slices=500 +01:== Created site 16 with max_slices=500 +01:== Created site 17 with max_slices=500 +01:== Created site 18 with max_slices=500 +01:== Created site 19 with max_slices=500 +01:== Created site 20 with max_slices=500 +01:== Created site 21 with max_slices=500 +01:== Created site 22 with max_slices=500 +01:== Created site 23 with max_slices=500 +01:== Created site 24 with max_slices=500 +01:== Created site 25 with max_slices=500 +01:== Created site 26 with max_slices=500 +01:== Created site 27 with max_slices=500 +01:== Created site 28 with max_slices=500 +01:== Created site 29 with max_slices=500 +01:== Created site 30 with max_slices=500 +01:== Created site 31 with max_slices=500 +01:== Created site 32 with max_slices=500 +01:== Created site 33 with max_slices=500 +01:== Created site 34 with max_slices=500 +01:== Created site 35 with max_slices=500 +01:== Created site 36 with max_slices=500 +01:== Created site 37 with max_slices=500 +01:== Created site 38 with max_slices=500 +01:== Created site 39 with max_slices=500 +01:== Created site 40 with max_slices=500 +01:== Created site 41 with max_slices=500 +01:== Created site 42 with max_slices=500 +01:== Created site 43 with max_slices=500 +01:== Created site 44 with max_slices=500 +01:== Created site 45 with max_slices=500 +01:== Created site 46 with max_slices=500 +01:== Created site 47 with max_slices=500 +01:== Created site 48 with max_slices=500 +01:== Created site 49 with max_slices=500 +01:== Created site 50 with max_slices=500 +01:== Created site 51 with max_slices=500 +01:== Created site 52 with max_slices=500 +01:== Created site 53 with max_slices=500 +01:== Created site 54 with max_slices=500 +01:== Created site 55 with max_slices=500 +01:== Created site 56 with max_slices=500 +01:== Created site 57 with max_slices=500 +01:== Created site 58 with max_slices=500 +01:== Created site 59 with max_slices=500 +01:== Created site 60 with max_slices=500 +01:== Created site 61 with max_slices=500 +01:== Created site 62 with max_slices=500 +01:== Created site 63 with max_slices=500 +01:== Created site 64 with max_slices=500 +01:== Created site 65 with max_slices=500 +01:== Created site 66 with max_slices=500 +01:== Created site 67 with max_slices=500 +01:== Created site 68 with max_slices=500 +01:== Created site 69 with max_slices=500 +01:== Created site 70 with max_slices=500 +01:== Created site 71 with max_slices=500 +01:== Created site 72 with max_slices=500 +01:== Created site 73 with max_slices=500 +01:== Created site 74 with max_slices=500 +01:== Created site 75 with max_slices=500 +01:== Created site 76 with max_slices=500 +01:== Created site 77 with max_slices=500 +01:== Created site 78 with max_slices=500 +01:== Created site 79 with max_slices=500 +01:== Created site 80 with max_slices=500 +01:== Created site 81 with max_slices=500 +01:== Created site 82 with max_slices=500 +01:== Created site 83 with max_slices=500 +01:== Created site 84 with max_slices=500 +01:== Created site 85 with max_slices=500 +01:== Created site 86 with max_slices=500 +01:== Created site 87 with max_slices=500 +01:== Created site 88 with max_slices=500 +01:== Created site 89 with max_slices=500 +01:== Created site 90 with max_slices=500 +01:== Created site 91 with max_slices=500 +01:== Created site 92 with max_slices=500 +01:== Created site 93 with max_slices=500 +01:== Created site 94 with max_slices=500 +01:== Created site 95 with max_slices=500 +01:== Created site 96 with max_slices=500 +01:== Created site 97 with max_slices=500 +01:== Created site 98 with max_slices=500 +01:== Created site 99 with max_slices=500 +01:== Created site 100 with max_slices=500 +01:== Created site 101 with max_slices=500 +01:== Created site 102 with max_slices=500 +01:== Created site 103 with max_slices=500 +01:== Created site 104 with max_slices=500 +01:== Created site 105 with max_slices=500 +01:== Created site 106 with max_slices=500 +01:== Created site 107 with max_slices=500 +01:== Created site 108 with max_slices=500 +01:== Created site 109 with max_slices=500 +01:== Created site 110 with max_slices=500 +01:== Created site 111 with max_slices=500 +01:== Created site 112 with max_slices=500 +01:== Created site 113 with max_slices=500 +01:== Created site 114 with max_slices=500 +01:== Created site 115 with max_slices=500 +01:== Created site 116 with max_slices=500 +01:== Created site 117 with max_slices=500 +01:== Created site 118 with max_slices=500 +01:== Created site 119 with max_slices=500 +01:== Created site 120 with max_slices=500 +01:== Created site 121 with max_slices=500 +01:== Created site 122 with max_slices=500 +01:== Created site 123 with max_slices=500 +01:== Created site 124 with max_slices=500 +01:== Created site 125 with max_slices=500 +01:== Created site 126 with max_slices=500 +01:== Created site 127 with max_slices=500 +01:== Created site 128 with max_slices=500 +01:== Created site 129 with max_slices=500 +01:== Created site 130 with max_slices=500 +01:== Created site 131 with max_slices=500 +01:== Created site 132 with max_slices=500 +01:== Created site 133 with max_slices=500 +01:== Created site 134 with max_slices=500 +01:== Created site 135 with max_slices=500 +01:== Created site 136 with max_slices=500 +01:== Created site 137 with max_slices=500 +01:== Created site 138 with max_slices=500 +01:== Created site 139 with max_slices=500 +01:== Created site 140 with max_slices=500 +01:== Created site 141 with max_slices=500 +01:== Created site 142 with max_slices=500 +01:== Created site 143 with max_slices=500 +01:== Created site 144 with max_slices=500 +01:== Created site 145 with max_slices=500 +01:== Created site 146 with max_slices=500 +01:== Created site 147 with max_slices=500 +01:== Created site 148 with max_slices=500 +01:== Created site 149 with max_slices=500 +01:== Created site 150 with max_slices=500 +01:== Created site 151 with max_slices=500 +01:== Created site 152 with max_slices=500 +01:== Created site 153 with max_slices=500 +01:== Created site 154 with max_slices=500 +01:== Created site 155 with max_slices=500 +01:== Created site 156 with max_slices=500 +01:== Created site 157 with max_slices=500 +01:== Created site 158 with max_slices=500 +01:== Created site 159 with max_slices=500 +01:== Created site 160 with max_slices=500 +01:== Created site 161 with max_slices=500 +01:== Created site 162 with max_slices=500 +01:== Created site 163 with max_slices=500 +01:== Created site 164 with max_slices=500 +01:== Created site 165 with max_slices=500 +01:== Created site 166 with max_slices=500 +01:== Created site 167 with max_slices=500 +01:== Created site 168 with max_slices=500 +01:== Created site 169 with max_slices=500 +01:== Created site 170 with max_slices=500 +01:== Created site 171 with max_slices=500 +01:== Created site 172 with max_slices=500 +01:== Created site 173 with max_slices=500 +01:== Created site 174 with max_slices=500 +01:== Created site 175 with max_slices=500 +01:== Created site 176 with max_slices=500 +01:== Created site 177 with max_slices=500 +01:== Created site 178 with max_slices=500 +01:== Created site 179 with max_slices=500 +01:== Created site 180 with max_slices=500 +01:== Created site 181 with max_slices=500 +01:== Created site 182 with max_slices=500 +01:== Created site 183 with max_slices=500 +01:== Created site 184 with max_slices=500 +01:== Created site 185 with max_slices=500 +01:== Created site 186 with max_slices=500 +01:== Created site 187 with max_slices=500 +01:== Created site 188 with max_slices=500 +01:== Created site 189 with max_slices=500 +01:== Created site 190 with max_slices=500 +01:== Created site 191 with max_slices=500 +01:== Created site 192 with max_slices=500 +01:== Created site 193 with max_slices=500 +01:== Created site 194 with max_slices=500 +01:== Created site 195 with max_slices=500 +01:== Created site 196 with max_slices=500 +01:== Created site 197 with max_slices=500 +01:== Created site 198 with max_slices=500 +01:== Created site 199 with max_slices=500 +01:== Created site 200 with max_slices=500 +01:== Created site 201 with max_slices=500 ++++ 16.31 seconds ellapsed (15.96) +01:== created user account 4, user-1@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org +Dummy method GetPersons on remote peer 2 skipped +Dummy method AddPerson on remote peer 2 skipped +01:== created user account 5, user-2@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user2-key1 to person user-2@plc.org +01:== created user account 6, user-3@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user3-key1 to person user-3@plc.org +01:== created user account 7, user-4@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user4-key1 to person user-4@plc.org +01:== created user account 8, user-5@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user5-key1 to person user-5@plc.org +01:== created user account 9, user-6@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user6-key1 to person user-6@plc.org +01:== created user account 10, user-7@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user7-key1 to person user-7@plc.org +01:== created user account 11, user-8@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user8-key1 to person user-8@plc.org +01:== created user account 12, user-9@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user9-key1 to person user-9@plc.org +01:== created user account 13, user-10@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user10-key1 to person user-10@plc.org +01:== created user account 14, user-11@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user11-key1 to person user-11@plc.org +01:== created user account 15, user-12@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user12-key1 to person user-12@plc.org +01:== created user account 16, user-13@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user13-key1 to person user-13@plc.org +01:== created user account 17, user-14@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user14-key1 to person user-14@plc.org +01:== created user account 18, user-15@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user15-key1 to person user-15@plc.org +01:== created user account 19, user-16@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user16-key1 to person user-16@plc.org +01:== created user account 20, user-17@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user17-key1 to person user-17@plc.org +01:== created user account 21, user-18@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user18-key1 to person user-18@plc.org +01:== created user account 22, user-19@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user19-key1 to person user-19@plc.org +01:== created user account 23, user-20@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user20-key1 to person user-20@plc.org +01:== created user account 24, user-21@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user21-key1 to person user-21@plc.org +01:== created user account 25, user-22@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user22-key1 to person user-22@plc.org +01:== created user account 26, user-23@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user23-key1 to person user-23@plc.org +01:== created user account 27, user-24@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user24-key1 to person user-24@plc.org +01:== created user account 28, user-25@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user25-key1 to person user-25@plc.org +01:== created user account 29, user-26@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user26-key1 to person user-26@plc.org +01:== created user account 30, user-27@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user27-key1 to person user-27@plc.org +01:== created user account 31, user-28@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user28-key1 to person user-28@plc.org +01:== created user account 32, user-29@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user29-key1 to person user-29@plc.org +01:== created user account 33, user-30@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user30-key1 to person user-30@plc.org +01:== created user account 34, user-31@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user31-key1 to person user-31@plc.org +01:== created user account 35, user-32@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user32-key1 to person user-32@plc.org +01:== created user account 36, user-33@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user33-key1 to person user-33@plc.org +01:== created user account 37, user-34@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user34-key1 to person user-34@plc.org +01:== created user account 38, user-35@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user35-key1 to person user-35@plc.org +01:== created user account 39, user-36@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user36-key1 to person user-36@plc.org +01:== created user account 40, user-37@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user37-key1 to person user-37@plc.org +01:== created user account 41, user-38@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user38-key1 to person user-38@plc.org +01:== created user account 42, user-39@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user39-key1 to person user-39@plc.org +01:== created user account 43, user-40@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user40-key1 to person user-40@plc.org +01:== created user account 44, user-41@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user41-key1 to person user-41@plc.org +01:== created user account 45, user-42@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user42-key1 to person user-42@plc.org +01:== created user account 46, user-43@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user43-key1 to person user-43@plc.org +01:== created user account 47, user-44@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user44-key1 to person user-44@plc.org +01:== created user account 48, user-45@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user45-key1 to person user-45@plc.org +01:== created user account 49, user-46@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user46-key1 to person user-46@plc.org +01:== created user account 50, user-47@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user47-key1 to person user-47@plc.org +01:== created user account 51, user-48@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user48-key1 to person user-48@plc.org +01:== created user account 52, user-49@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user49-key1 to person user-49@plc.org +01:== created user account 53, user-50@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user50-key1 to person user-50@plc.org +01:== created user account 54, user-51@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user51-key1 to person user-51@plc.org +01:== created user account 55, user-52@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user52-key1 to person user-52@plc.org +01:== created user account 56, user-53@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user53-key1 to person user-53@plc.org +01:== created user account 57, user-54@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user54-key1 to person user-54@plc.org +01:== created user account 58, user-55@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user55-key1 to person user-55@plc.org +01:== created user account 59, user-56@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user56-key1 to person user-56@plc.org +01:== created user account 60, user-57@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user57-key1 to person user-57@plc.org +01:== created user account 61, user-58@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user58-key1 to person user-58@plc.org +01:== created user account 62, user-59@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user59-key1 to person user-59@plc.org +01:== created user account 63, user-60@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user60-key1 to person user-60@plc.org +01:== created user account 64, user-61@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user61-key1 to person user-61@plc.org +01:== created user account 65, user-62@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user62-key1 to person user-62@plc.org +01:== created user account 66, user-63@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user63-key1 to person user-63@plc.org +01:== created user account 67, user-64@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user64-key1 to person user-64@plc.org +01:== created user account 68, user-65@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user65-key1 to person user-65@plc.org +01:== created user account 69, user-66@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user66-key1 to person user-66@plc.org +01:== created user account 70, user-67@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user67-key1 to person user-67@plc.org +01:== created user account 71, user-68@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user68-key1 to person user-68@plc.org +01:== created user account 72, user-69@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user69-key1 to person user-69@plc.org +01:== created user account 73, user-70@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user70-key1 to person user-70@plc.org +01:== created user account 74, user-71@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user71-key1 to person user-71@plc.org +01:== created user account 75, user-72@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user72-key1 to person user-72@plc.org +01:== created user account 76, user-73@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user73-key1 to person user-73@plc.org +01:== created user account 77, user-74@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user74-key1 to person user-74@plc.org +01:== created user account 78, user-75@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user75-key1 to person user-75@plc.org +01:== created user account 79, user-76@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user76-key1 to person user-76@plc.org +01:== created user account 80, user-77@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user77-key1 to person user-77@plc.org +01:== created user account 81, user-78@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user78-key1 to person user-78@plc.org +01:== created user account 82, user-79@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user79-key1 to person user-79@plc.org +01:== created user account 83, user-80@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user80-key1 to person user-80@plc.org +01:== created user account 84, user-81@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user81-key1 to person user-81@plc.org +01:== created user account 85, user-82@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user82-key1 to person user-82@plc.org +01:== created user account 86, user-83@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user83-key1 to person user-83@plc.org +01:== created user account 87, user-84@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user84-key1 to person user-84@plc.org +01:== created user account 88, user-85@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user85-key1 to person user-85@plc.org +01:== created user account 89, user-86@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user86-key1 to person user-86@plc.org +01:== created user account 90, user-87@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user87-key1 to person user-87@plc.org +01:== created user account 91, user-88@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user88-key1 to person user-88@plc.org +01:== created user account 92, user-89@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user89-key1 to person user-89@plc.org +01:== created user account 93, user-90@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user90-key1 to person user-90@plc.org +01:== created user account 94, user-91@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user91-key1 to person user-91@plc.org +01:== created user account 95, user-92@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user92-key1 to person user-92@plc.org +01:== created user account 96, user-93@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user93-key1 to person user-93@plc.org +01:== created user account 97, user-94@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user94-key1 to person user-94@plc.org +01:== created user account 98, user-95@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user95-key1 to person user-95@plc.org +01:== created user account 99, user-96@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user96-key1 to person user-96@plc.org +01:== created user account 100, user-97@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user97-key1 to person user-97@plc.org +01:== created user account 101, user-98@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user98-key1 to person user-98@plc.org +01:== created user account 102, user-99@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user99-key1 to person user-99@plc.org +01:== created user account 103, user-100@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user100-key1 to person user-100@plc.org +01:== created user account 104, user-101@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user101-key1 to person user-101@plc.org +01:== created user account 105, user-102@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user102-key1 to person user-102@plc.org +01:== created user account 106, user-103@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user103-key1 to person user-103@plc.org +01:== created user account 107, user-104@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user104-key1 to person user-104@plc.org +01:== created user account 108, user-105@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user105-key1 to person user-105@plc.org +01:== created user account 109, user-106@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user106-key1 to person user-106@plc.org +01:== created user account 110, user-107@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user107-key1 to person user-107@plc.org +01:== created user account 111, user-108@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user108-key1 to person user-108@plc.org +01:== created user account 112, user-109@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user109-key1 to person user-109@plc.org +01:== created user account 113, user-110@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user110-key1 to person user-110@plc.org +01:== created user account 114, user-111@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user111-key1 to person user-111@plc.org +01:== created user account 115, user-112@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user112-key1 to person user-112@plc.org +01:== created user account 116, user-113@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user113-key1 to person user-113@plc.org +01:== created user account 117, user-114@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user114-key1 to person user-114@plc.org +01:== created user account 118, user-115@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user115-key1 to person user-115@plc.org +01:== created user account 119, user-116@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user116-key1 to person user-116@plc.org +01:== created user account 120, user-117@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user117-key1 to person user-117@plc.org +01:== created user account 121, user-118@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user118-key1 to person user-118@plc.org +01:== created user account 122, user-119@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user119-key1 to person user-119@plc.org +01:== created user account 123, user-120@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user120-key1 to person user-120@plc.org +01:== created user account 124, user-121@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user121-key1 to person user-121@plc.org +01:== created user account 125, user-122@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user122-key1 to person user-122@plc.org +01:== created user account 126, user-123@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user123-key1 to person user-123@plc.org +01:== created user account 127, user-124@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user124-key1 to person user-124@plc.org +01:== created user account 128, user-125@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user125-key1 to person user-125@plc.org +01:== created user account 129, user-126@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user126-key1 to person user-126@plc.org +01:== created user account 130, user-127@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user127-key1 to person user-127@plc.org +01:== created user account 131, user-128@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user128-key1 to person user-128@plc.org +01:== created user account 132, user-129@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user129-key1 to person user-129@plc.org +01:== created user account 133, user-130@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user130-key1 to person user-130@plc.org +01:== created user account 134, user-131@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user131-key1 to person user-131@plc.org +01:== created user account 135, user-132@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user132-key1 to person user-132@plc.org +01:== created user account 136, user-133@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user133-key1 to person user-133@plc.org +01:== created user account 137, user-134@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user134-key1 to person user-134@plc.org +01:== created user account 138, user-135@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user135-key1 to person user-135@plc.org +01:== created user account 139, user-136@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user136-key1 to person user-136@plc.org +01:== created user account 140, user-137@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user137-key1 to person user-137@plc.org +01:== created user account 141, user-138@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user138-key1 to person user-138@plc.org +01:== created user account 142, user-139@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user139-key1 to person user-139@plc.org +01:== created user account 143, user-140@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user140-key1 to person user-140@plc.org +01:== created user account 144, user-141@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user141-key1 to person user-141@plc.org +01:== created user account 145, user-142@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user142-key1 to person user-142@plc.org +01:== created user account 146, user-143@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user143-key1 to person user-143@plc.org +01:== created user account 147, user-144@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user144-key1 to person user-144@plc.org +01:== created user account 148, user-145@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user145-key1 to person user-145@plc.org +01:== created user account 149, user-146@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user146-key1 to person user-146@plc.org +01:== created user account 150, user-147@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user147-key1 to person user-147@plc.org +01:== created user account 151, user-148@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user148-key1 to person user-148@plc.org +01:== created user account 152, user-149@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user149-key1 to person user-149@plc.org +01:== created user account 153, user-150@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user150-key1 to person user-150@plc.org +01:== created user account 154, user-151@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user151-key1 to person user-151@plc.org +01:== created user account 155, user-152@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user152-key1 to person user-152@plc.org +01:== created user account 156, user-153@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user153-key1 to person user-153@plc.org +01:== created user account 157, user-154@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user154-key1 to person user-154@plc.org +01:== created user account 158, user-155@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user155-key1 to person user-155@plc.org +01:== created user account 159, user-156@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user156-key1 to person user-156@plc.org +01:== created user account 160, user-157@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user157-key1 to person user-157@plc.org +01:== created user account 161, user-158@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user158-key1 to person user-158@plc.org +01:== created user account 162, user-159@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user159-key1 to person user-159@plc.org +01:== created user account 163, user-160@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user160-key1 to person user-160@plc.org +01:== created user account 164, user-161@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user161-key1 to person user-161@plc.org +01:== created user account 165, user-162@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user162-key1 to person user-162@plc.org +01:== created user account 166, user-163@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user163-key1 to person user-163@plc.org +01:== created user account 167, user-164@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user164-key1 to person user-164@plc.org +01:== created user account 168, user-165@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user165-key1 to person user-165@plc.org +01:== created user account 169, user-166@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user166-key1 to person user-166@plc.org +01:== created user account 170, user-167@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user167-key1 to person user-167@plc.org +01:== created user account 171, user-168@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user168-key1 to person user-168@plc.org +01:== created user account 172, user-169@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user169-key1 to person user-169@plc.org +01:== created user account 173, user-170@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user170-key1 to person user-170@plc.org +01:== created user account 174, user-171@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user171-key1 to person user-171@plc.org +01:== created user account 175, user-172@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user172-key1 to person user-172@plc.org +01:== created user account 176, user-173@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user173-key1 to person user-173@plc.org +01:== created user account 177, user-174@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user174-key1 to person user-174@plc.org +01:== created user account 178, user-175@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user175-key1 to person user-175@plc.org +01:== created user account 179, user-176@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user176-key1 to person user-176@plc.org +01:== created user account 180, user-177@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user177-key1 to person user-177@plc.org +01:== created user account 181, user-178@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user178-key1 to person user-178@plc.org +01:== created user account 182, user-179@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user179-key1 to person user-179@plc.org +01:== created user account 183, user-180@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user180-key1 to person user-180@plc.org +01:== created user account 184, user-181@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user181-key1 to person user-181@plc.org +01:== created user account 185, user-182@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user182-key1 to person user-182@plc.org +01:== created user account 186, user-183@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user183-key1 to person user-183@plc.org +01:== created user account 187, user-184@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user184-key1 to person user-184@plc.org +01:== created user account 188, user-185@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user185-key1 to person user-185@plc.org +01:== created user account 189, user-186@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user186-key1 to person user-186@plc.org +01:== created user account 190, user-187@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user187-key1 to person user-187@plc.org +01:== created user account 191, user-188@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user188-key1 to person user-188@plc.org +01:== created user account 192, user-189@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user189-key1 to person user-189@plc.org +01:== created user account 193, user-190@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user190-key1 to person user-190@plc.org +01:== created user account 194, user-191@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user191-key1 to person user-191@plc.org +01:== created user account 195, user-192@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user192-key1 to person user-192@plc.org +01:== created user account 196, user-193@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user193-key1 to person user-193@plc.org +01:== created user account 197, user-194@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user194-key1 to person user-194@plc.org +01:== created user account 198, user-195@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user195-key1 to person user-195@plc.org +01:== created user account 199, user-196@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user196-key1 to person user-196@plc.org +01:== created user account 200, user-197@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user197-key1 to person user-197@plc.org +01:== created user account 201, user-198@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user198-key1 to person user-198@plc.org +01:== created user account 202, user-199@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user199-key1 to person user-199@plc.org +01:== created user account 203, user-200@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user200-key1 to person user-200@plc.org +01:== created user account 204, user-201@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user201-key1 to person user-201@plc.org +01:== created user account 205, user-202@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user202-key1 to person user-202@plc.org +01:== created user account 206, user-203@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user203-key1 to person user-203@plc.org +01:== created user account 207, user-204@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user204-key1 to person user-204@plc.org +01:== created user account 208, user-205@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user205-key1 to person user-205@plc.org +01:== created user account 209, user-206@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user206-key1 to person user-206@plc.org +01:== created user account 210, user-207@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user207-key1 to person user-207@plc.org +01:== created user account 211, user-208@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user208-key1 to person user-208@plc.org +01:== created user account 212, user-209@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user209-key1 to person user-209@plc.org +01:== created user account 213, user-210@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user210-key1 to person user-210@plc.org +01:== created user account 214, user-211@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user211-key1 to person user-211@plc.org +01:== created user account 215, user-212@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user212-key1 to person user-212@plc.org +01:== created user account 216, user-213@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user213-key1 to person user-213@plc.org +01:== created user account 217, user-214@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user214-key1 to person user-214@plc.org +01:== created user account 218, user-215@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user215-key1 to person user-215@plc.org +01:== created user account 219, user-216@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user216-key1 to person user-216@plc.org +01:== created user account 220, user-217@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user217-key1 to person user-217@plc.org +01:== created user account 221, user-218@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user218-key1 to person user-218@plc.org +01:== created user account 222, user-219@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user219-key1 to person user-219@plc.org +01:== created user account 223, user-220@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user220-key1 to person user-220@plc.org +01:== created user account 224, user-221@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user221-key1 to person user-221@plc.org +01:== created user account 225, user-222@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user222-key1 to person user-222@plc.org +01:== created user account 226, user-223@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user223-key1 to person user-223@plc.org +01:== created user account 227, user-224@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user224-key1 to person user-224@plc.org +01:== created user account 228, user-225@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user225-key1 to person user-225@plc.org +01:== created user account 229, user-226@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user226-key1 to person user-226@plc.org +01:== created user account 230, user-227@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user227-key1 to person user-227@plc.org +01:== created user account 231, user-228@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user228-key1 to person user-228@plc.org +01:== created user account 232, user-229@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user229-key1 to person user-229@plc.org +01:== created user account 233, user-230@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user230-key1 to person user-230@plc.org +01:== created user account 234, user-231@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user231-key1 to person user-231@plc.org +01:== created user account 235, user-232@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user232-key1 to person user-232@plc.org +01:== created user account 236, user-233@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user233-key1 to person user-233@plc.org +01:== created user account 237, user-234@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user234-key1 to person user-234@plc.org +01:== created user account 238, user-235@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user235-key1 to person user-235@plc.org +01:== created user account 239, user-236@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user236-key1 to person user-236@plc.org +01:== created user account 240, user-237@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user237-key1 to person user-237@plc.org +01:== created user account 241, user-238@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user238-key1 to person user-238@plc.org +01:== created user account 242, user-239@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user239-key1 to person user-239@plc.org +01:== created user account 243, user-240@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user240-key1 to person user-240@plc.org +01:== created user account 244, user-241@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user241-key1 to person user-241@plc.org +01:== created user account 245, user-242@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user242-key1 to person user-242@plc.org +01:== created user account 246, user-243@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user243-key1 to person user-243@plc.org +01:== created user account 247, user-244@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user244-key1 to person user-244@plc.org +01:== created user account 248, user-245@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user245-key1 to person user-245@plc.org +01:== created user account 249, user-246@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user246-key1 to person user-246@plc.org +01:== created user account 250, user-247@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user247-key1 to person user-247@plc.org +01:== created user account 251, user-248@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user248-key1 to person user-248@plc.org +01:== created user account 252, user-249@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user249-key1 to person user-249@plc.org +01:== created user account 253, user-250@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user250-key1 to person user-250@plc.org +01:== created user account 254, user-251@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user251-key1 to person user-251@plc.org +01:== created user account 255, user-252@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user252-key1 to person user-252@plc.org +01:== created user account 256, user-253@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user253-key1 to person user-253@plc.org +01:== created user account 257, user-254@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user254-key1 to person user-254@plc.org +01:== created user account 258, user-255@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user255-key1 to person user-255@plc.org +01:== created user account 259, user-256@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user256-key1 to person user-256@plc.org +01:== created user account 260, user-257@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user257-key1 to person user-257@plc.org +01:== created user account 261, user-258@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user258-key1 to person user-258@plc.org +01:== created user account 262, user-259@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user259-key1 to person user-259@plc.org +01:== created user account 263, user-260@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user260-key1 to person user-260@plc.org +01:== created user account 264, user-261@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user261-key1 to person user-261@plc.org +01:== created user account 265, user-262@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user262-key1 to person user-262@plc.org +01:== created user account 266, user-263@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user263-key1 to person user-263@plc.org +01:== created user account 267, user-264@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user264-key1 to person user-264@plc.org +01:== created user account 268, user-265@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user265-key1 to person user-265@plc.org +01:== created user account 269, user-266@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user266-key1 to person user-266@plc.org +01:== created user account 270, user-267@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user267-key1 to person user-267@plc.org +01:== created user account 271, user-268@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user268-key1 to person user-268@plc.org +01:== created user account 272, user-269@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user269-key1 to person user-269@plc.org +01:== created user account 273, user-270@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user270-key1 to person user-270@plc.org +01:== created user account 274, user-271@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user271-key1 to person user-271@plc.org +01:== created user account 275, user-272@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user272-key1 to person user-272@plc.org +01:== created user account 276, user-273@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user273-key1 to person user-273@plc.org +01:== created user account 277, user-274@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user274-key1 to person user-274@plc.org +01:== created user account 278, user-275@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user275-key1 to person user-275@plc.org +01:== created user account 279, user-276@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user276-key1 to person user-276@plc.org +01:== created user account 280, user-277@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user277-key1 to person user-277@plc.org +01:== created user account 281, user-278@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user278-key1 to person user-278@plc.org +01:== created user account 282, user-279@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user279-key1 to person user-279@plc.org +01:== created user account 283, user-280@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user280-key1 to person user-280@plc.org +01:== created user account 284, user-281@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user281-key1 to person user-281@plc.org +01:== created user account 285, user-282@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user282-key1 to person user-282@plc.org +01:== created user account 286, user-283@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user283-key1 to person user-283@plc.org +01:== created user account 287, user-284@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user284-key1 to person user-284@plc.org +01:== created user account 288, user-285@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user285-key1 to person user-285@plc.org +01:== created user account 289, user-286@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user286-key1 to person user-286@plc.org +01:== created user account 290, user-287@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user287-key1 to person user-287@plc.org +01:== created user account 291, user-288@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user288-key1 to person user-288@plc.org +01:== created user account 292, user-289@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user289-key1 to person user-289@plc.org +01:== created user account 293, user-290@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user290-key1 to person user-290@plc.org +01:== created user account 294, user-291@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user291-key1 to person user-291@plc.org +01:== created user account 295, user-292@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user292-key1 to person user-292@plc.org +01:== created user account 296, user-293@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user293-key1 to person user-293@plc.org +01:== created user account 297, user-294@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user294-key1 to person user-294@plc.org +01:== created user account 298, user-295@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user295-key1 to person user-295@plc.org +01:== created user account 299, user-296@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user296-key1 to person user-296@plc.org +01:== created user account 300, user-297@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user297-key1 to person user-297@plc.org +01:== created user account 301, user-298@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user298-key1 to person user-298@plc.org +01:== created user account 302, user-299@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user299-key1 to person user-299@plc.org +01:== created user account 303, user-300@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user300-key1 to person user-300@plc.org +01:== created user account 304, user-301@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user301-key1 to person user-301@plc.org +01:== created user account 305, user-302@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user302-key1 to person user-302@plc.org +01:== created user account 306, user-303@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user303-key1 to person user-303@plc.org +01:== created user account 307, user-304@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user304-key1 to person user-304@plc.org +01:== created user account 308, user-305@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user305-key1 to person user-305@plc.org +01:== created user account 309, user-306@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user306-key1 to person user-306@plc.org +01:== created user account 310, user-307@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user307-key1 to person user-307@plc.org +01:== created user account 311, user-308@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user308-key1 to person user-308@plc.org +01:== created user account 312, user-309@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user309-key1 to person user-309@plc.org +01:== created user account 313, user-310@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user310-key1 to person user-310@plc.org +01:== created user account 314, user-311@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user311-key1 to person user-311@plc.org +01:== created user account 315, user-312@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user312-key1 to person user-312@plc.org +01:== created user account 316, user-313@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user313-key1 to person user-313@plc.org +01:== created user account 317, user-314@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user314-key1 to person user-314@plc.org +01:== created user account 318, user-315@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user315-key1 to person user-315@plc.org +01:== created user account 319, user-316@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user316-key1 to person user-316@plc.org +01:== created user account 320, user-317@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user317-key1 to person user-317@plc.org +01:== created user account 321, user-318@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user318-key1 to person user-318@plc.org +01:== created user account 322, user-319@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user319-key1 to person user-319@plc.org +01:== created user account 323, user-320@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user320-key1 to person user-320@plc.org +01:== created user account 324, user-321@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user321-key1 to person user-321@plc.org +01:== created user account 325, user-322@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user322-key1 to person user-322@plc.org +01:== created user account 326, user-323@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user323-key1 to person user-323@plc.org +01:== created user account 327, user-324@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user324-key1 to person user-324@plc.org +01:== created user account 328, user-325@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user325-key1 to person user-325@plc.org +01:== created user account 329, user-326@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user326-key1 to person user-326@plc.org +01:== created user account 330, user-327@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user327-key1 to person user-327@plc.org +01:== created user account 331, user-328@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user328-key1 to person user-328@plc.org +01:== created user account 332, user-329@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user329-key1 to person user-329@plc.org +01:== created user account 333, user-330@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user330-key1 to person user-330@plc.org +01:== created user account 334, user-331@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user331-key1 to person user-331@plc.org +01:== created user account 335, user-332@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user332-key1 to person user-332@plc.org +01:== created user account 336, user-333@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user333-key1 to person user-333@plc.org +01:== created user account 337, user-334@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user334-key1 to person user-334@plc.org +01:== created user account 338, user-335@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user335-key1 to person user-335@plc.org +01:== created user account 339, user-336@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user336-key1 to person user-336@plc.org +01:== created user account 340, user-337@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user337-key1 to person user-337@plc.org +01:== created user account 341, user-338@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user338-key1 to person user-338@plc.org +01:== created user account 342, user-339@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user339-key1 to person user-339@plc.org +01:== created user account 343, user-340@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user340-key1 to person user-340@plc.org +01:== created user account 344, user-341@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user341-key1 to person user-341@plc.org +01:== created user account 345, user-342@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user342-key1 to person user-342@plc.org +01:== created user account 346, user-343@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user343-key1 to person user-343@plc.org +01:== created user account 347, user-344@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user344-key1 to person user-344@plc.org +01:== created user account 348, user-345@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user345-key1 to person user-345@plc.org +01:== created user account 349, user-346@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user346-key1 to person user-346@plc.org +01:== created user account 350, user-347@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user347-key1 to person user-347@plc.org +01:== created user account 351, user-348@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user348-key1 to person user-348@plc.org +01:== created user account 352, user-349@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user349-key1 to person user-349@plc.org +01:== created user account 353, user-350@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user350-key1 to person user-350@plc.org +01:== created user account 354, user-351@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user351-key1 to person user-351@plc.org +01:== created user account 355, user-352@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user352-key1 to person user-352@plc.org +01:== created user account 356, user-353@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user353-key1 to person user-353@plc.org +01:== created user account 357, user-354@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user354-key1 to person user-354@plc.org +01:== created user account 358, user-355@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user355-key1 to person user-355@plc.org +01:== created user account 359, user-356@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user356-key1 to person user-356@plc.org +01:== created user account 360, user-357@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user357-key1 to person user-357@plc.org +01:== created user account 361, user-358@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user358-key1 to person user-358@plc.org +01:== created user account 362, user-359@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user359-key1 to person user-359@plc.org +01:== created user account 363, user-360@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user360-key1 to person user-360@plc.org +01:== created user account 364, user-361@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user361-key1 to person user-361@plc.org +01:== created user account 365, user-362@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user362-key1 to person user-362@plc.org +01:== created user account 366, user-363@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user363-key1 to person user-363@plc.org +01:== created user account 367, user-364@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user364-key1 to person user-364@plc.org +01:== created user account 368, user-365@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user365-key1 to person user-365@plc.org +01:== created user account 369, user-366@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user366-key1 to person user-366@plc.org +01:== created user account 370, user-367@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user367-key1 to person user-367@plc.org +01:== created user account 371, user-368@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user368-key1 to person user-368@plc.org +01:== created user account 372, user-369@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user369-key1 to person user-369@plc.org +01:== created user account 373, user-370@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user370-key1 to person user-370@plc.org +01:== created user account 374, user-371@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user371-key1 to person user-371@plc.org +01:== created user account 375, user-372@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user372-key1 to person user-372@plc.org +01:== created user account 376, user-373@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user373-key1 to person user-373@plc.org +01:== created user account 377, user-374@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user374-key1 to person user-374@plc.org +01:== created user account 378, user-375@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user375-key1 to person user-375@plc.org +01:== created user account 379, user-376@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user376-key1 to person user-376@plc.org +01:== created user account 380, user-377@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user377-key1 to person user-377@plc.org +01:== created user account 381, user-378@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user378-key1 to person user-378@plc.org +01:== created user account 382, user-379@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user379-key1 to person user-379@plc.org +01:== created user account 383, user-380@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user380-key1 to person user-380@plc.org +01:== created user account 384, user-381@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user381-key1 to person user-381@plc.org +01:== created user account 385, user-382@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user382-key1 to person user-382@plc.org +01:== created user account 386, user-383@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user383-key1 to person user-383@plc.org +01:== created user account 387, user-384@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user384-key1 to person user-384@plc.org +01:== created user account 388, user-385@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user385-key1 to person user-385@plc.org +01:== created user account 389, user-386@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user386-key1 to person user-386@plc.org +01:== created user account 390, user-387@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user387-key1 to person user-387@plc.org +01:== created user account 391, user-388@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user388-key1 to person user-388@plc.org +01:== created user account 392, user-389@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user389-key1 to person user-389@plc.org +01:== created user account 393, user-390@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user390-key1 to person user-390@plc.org +01:== created user account 394, user-391@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user391-key1 to person user-391@plc.org +01:== created user account 395, user-392@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user392-key1 to person user-392@plc.org +01:== created user account 396, user-393@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user393-key1 to person user-393@plc.org +01:== created user account 397, user-394@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user394-key1 to person user-394@plc.org +01:== created user account 398, user-395@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user395-key1 to person user-395@plc.org +01:== created user account 399, user-396@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user396-key1 to person user-396@plc.org +01:== created user account 400, user-397@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user397-key1 to person user-397@plc.org +01:== created user account 401, user-398@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user398-key1 to person user-398@plc.org +01:== created user account 402, user-399@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user399-key1 to person user-399@plc.org +01:== created user account 403, user-400@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user400-key1 to person user-400@plc.org +01:== created user account 404, user-401@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user401-key1 to person user-401@plc.org +01:== created user account 405, user-402@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user402-key1 to person user-402@plc.org +01:== created user account 406, user-403@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user403-key1 to person user-403@plc.org +01:== created user account 407, user-404@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user404-key1 to person user-404@plc.org +01:== created user account 408, user-405@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user405-key1 to person user-405@plc.org +01:== created user account 409, user-406@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user406-key1 to person user-406@plc.org +01:== created user account 410, user-407@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user407-key1 to person user-407@plc.org +01:== created user account 411, user-408@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user408-key1 to person user-408@plc.org +01:== created user account 412, user-409@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user409-key1 to person user-409@plc.org +01:== created user account 413, user-410@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user410-key1 to person user-410@plc.org +01:== created user account 414, user-411@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user411-key1 to person user-411@plc.org +01:== created user account 415, user-412@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user412-key1 to person user-412@plc.org +01:== created user account 416, user-413@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user413-key1 to person user-413@plc.org +01:== created user account 417, user-414@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user414-key1 to person user-414@plc.org +01:== created user account 418, user-415@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user415-key1 to person user-415@plc.org +01:== created user account 419, user-416@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user416-key1 to person user-416@plc.org +01:== created user account 420, user-417@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user417-key1 to person user-417@plc.org +01:== created user account 421, user-418@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user418-key1 to person user-418@plc.org +01:== created user account 422, user-419@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user419-key1 to person user-419@plc.org +01:== created user account 423, user-420@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user420-key1 to person user-420@plc.org +01:== created user account 424, user-421@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user421-key1 to person user-421@plc.org +01:== created user account 425, user-422@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user422-key1 to person user-422@plc.org +01:== created user account 426, user-423@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user423-key1 to person user-423@plc.org +01:== created user account 427, user-424@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user424-key1 to person user-424@plc.org +01:== created user account 428, user-425@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user425-key1 to person user-425@plc.org +01:== created user account 429, user-426@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user426-key1 to person user-426@plc.org +01:== created user account 430, user-427@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user427-key1 to person user-427@plc.org +01:== created user account 431, user-428@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user428-key1 to person user-428@plc.org +01:== created user account 432, user-429@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user429-key1 to person user-429@plc.org +01:== created user account 433, user-430@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user430-key1 to person user-430@plc.org +01:== created user account 434, user-431@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user431-key1 to person user-431@plc.org +01:== created user account 435, user-432@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user432-key1 to person user-432@plc.org +01:== created user account 436, user-433@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user433-key1 to person user-433@plc.org +01:== created user account 437, user-434@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user434-key1 to person user-434@plc.org +01:== created user account 438, user-435@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user435-key1 to person user-435@plc.org +01:== created user account 439, user-436@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user436-key1 to person user-436@plc.org +01:== created user account 440, user-437@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user437-key1 to person user-437@plc.org +01:== created user account 441, user-438@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user438-key1 to person user-438@plc.org +01:== created user account 442, user-439@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user439-key1 to person user-439@plc.org +01:== created user account 443, user-440@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user440-key1 to person user-440@plc.org +01:== created user account 444, user-441@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user441-key1 to person user-441@plc.org +01:== created user account 445, user-442@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user442-key1 to person user-442@plc.org +01:== created user account 446, user-443@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user443-key1 to person user-443@plc.org +01:== created user account 447, user-444@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user444-key1 to person user-444@plc.org +01:== created user account 448, user-445@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user445-key1 to person user-445@plc.org +01:== created user account 449, user-446@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user446-key1 to person user-446@plc.org +01:== created user account 450, user-447@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user447-key1 to person user-447@plc.org +01:== created user account 451, user-448@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user448-key1 to person user-448@plc.org +01:== created user account 452, user-449@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user449-key1 to person user-449@plc.org +01:== created user account 453, user-450@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user450-key1 to person user-450@plc.org +01:== created user account 454, user-451@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user451-key1 to person user-451@plc.org +01:== created user account 455, user-452@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user452-key1 to person user-452@plc.org +01:== created user account 456, user-453@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user453-key1 to person user-453@plc.org +01:== created user account 457, user-454@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user454-key1 to person user-454@plc.org +01:== created user account 458, user-455@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user455-key1 to person user-455@plc.org +01:== created user account 459, user-456@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user456-key1 to person user-456@plc.org +01:== created user account 460, user-457@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user457-key1 to person user-457@plc.org +01:== created user account 461, user-458@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user458-key1 to person user-458@plc.org +01:== created user account 462, user-459@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user459-key1 to person user-459@plc.org +01:== created user account 463, user-460@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user460-key1 to person user-460@plc.org +01:== created user account 464, user-461@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user461-key1 to person user-461@plc.org +01:== created user account 465, user-462@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user462-key1 to person user-462@plc.org +01:== created user account 466, user-463@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user463-key1 to person user-463@plc.org +01:== created user account 467, user-464@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user464-key1 to person user-464@plc.org +01:== created user account 468, user-465@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user465-key1 to person user-465@plc.org +01:== created user account 469, user-466@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user466-key1 to person user-466@plc.org +01:== created user account 470, user-467@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user467-key1 to person user-467@plc.org +01:== created user account 471, user-468@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user468-key1 to person user-468@plc.org +01:== created user account 472, user-469@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user469-key1 to person user-469@plc.org +01:== created user account 473, user-470@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user470-key1 to person user-470@plc.org +01:== created user account 474, user-471@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user471-key1 to person user-471@plc.org +01:== created user account 475, user-472@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user472-key1 to person user-472@plc.org +01:== created user account 476, user-473@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user473-key1 to person user-473@plc.org +01:== created user account 477, user-474@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user474-key1 to person user-474@plc.org +01:== created user account 478, user-475@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user475-key1 to person user-475@plc.org +01:== created user account 479, user-476@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user476-key1 to person user-476@plc.org +01:== created user account 480, user-477@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user477-key1 to person user-477@plc.org +01:== created user account 481, user-478@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user478-key1 to person user-478@plc.org +01:== created user account 482, user-479@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user479-key1 to person user-479@plc.org +01:== created user account 483, user-480@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user480-key1 to person user-480@plc.org +01:== created user account 484, user-481@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user481-key1 to person user-481@plc.org +01:== created user account 485, user-482@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user482-key1 to person user-482@plc.org +01:== created user account 486, user-483@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user483-key1 to person user-483@plc.org +01:== created user account 487, user-484@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user484-key1 to person user-484@plc.org +01:== created user account 488, user-485@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user485-key1 to person user-485@plc.org +01:== created user account 489, user-486@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user486-key1 to person user-486@plc.org +01:== created user account 490, user-487@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user487-key1 to person user-487@plc.org +01:== created user account 491, user-488@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user488-key1 to person user-488@plc.org +01:== created user account 492, user-489@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user489-key1 to person user-489@plc.org +01:== created user account 493, user-490@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user490-key1 to person user-490@plc.org +01:== created user account 494, user-491@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user491-key1 to person user-491@plc.org +01:== created user account 495, user-492@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user492-key1 to person user-492@plc.org +01:== created user account 496, user-493@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user493-key1 to person user-493@plc.org +01:== created user account 497, user-494@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user494-key1 to person user-494@plc.org +01:== created user account 498, user-495@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user495-key1 to person user-495@plc.org +01:== created user account 499, user-496@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user496-key1 to person user-496@plc.org +01:== created user account 500, user-497@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user497-key1 to person user-497@plc.org +01:== created user account 501, user-498@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user498-key1 to person user-498@plc.org +01:== created user account 502, user-499@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user499-key1 to person user-499@plc.org +01:== created user account 503, user-500@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user500-key1 to person user-500@plc.org ++++ 60.11 seconds ellapsed (43.79) +01:== Added node 1 n1-001.plc1.org +Dummy method GetNodes on remote peer 2 skipped +Dummy method AddNode on remote peer 2 skipped +01:== Added node 2 n1-002.plc1.org +01:== Added node 3 n1-003.plc1.org +01:== Added node 4 n1-004.plc1.org +01:== Added node 5 n1-005.plc1.org +01:== Added node 6 n1-006.plc1.org +01:== Added node 7 n1-007.plc1.org +01:== Added node 8 n1-008.plc1.org +01:== Added node 9 n1-009.plc1.org +01:== Added node 10 n1-010.plc1.org +01:== Added node 11 n1-011.plc1.org +01:== Added node 12 n1-012.plc1.org +01:== Added node 13 n1-013.plc1.org +01:== Added node 14 n1-014.plc1.org +01:== Added node 15 n1-015.plc1.org +01:== Added node 16 n1-016.plc1.org +01:== Added node 17 n1-017.plc1.org +01:== Added node 18 n1-018.plc1.org +01:== Added node 19 n1-019.plc1.org +01:== Added node 20 n1-020.plc1.org +01:== Added node 21 n1-021.plc1.org +01:== Added node 22 n1-022.plc1.org +01:== Added node 23 n1-023.plc1.org +01:== Added node 24 n1-024.plc1.org +01:== Added node 25 n1-025.plc1.org +01:== Added node 26 n1-026.plc1.org +01:== Added node 27 n1-027.plc1.org +01:== Added node 28 n1-028.plc1.org +01:== Added node 29 n1-029.plc1.org +01:== Added node 30 n1-030.plc1.org +01:== Added node 31 n1-031.plc1.org +01:== Added node 32 n1-032.plc1.org +01:== Added node 33 n1-033.plc1.org +01:== Added node 34 n1-034.plc1.org +01:== Added node 35 n1-035.plc1.org +01:== Added node 36 n1-036.plc1.org +01:== Added node 37 n1-037.plc1.org +01:== Added node 38 n1-038.plc1.org +01:== Added node 39 n1-039.plc1.org +01:== Added node 40 n1-040.plc1.org +01:== Added node 41 n1-041.plc1.org +01:== Added node 42 n1-042.plc1.org +01:== Added node 43 n1-043.plc1.org +01:== Added node 44 n1-044.plc1.org +01:== Added node 45 n1-045.plc1.org +01:== Added node 46 n1-046.plc1.org +01:== Added node 47 n1-047.plc1.org +01:== Added node 48 n1-048.plc1.org +01:== Added node 49 n1-049.plc1.org +01:== Added node 50 n1-050.plc1.org +01:== Added node 51 n1-051.plc1.org +01:== Added node 52 n1-052.plc1.org +01:== Added node 53 n1-053.plc1.org +01:== Added node 54 n1-054.plc1.org +01:== Added node 55 n1-055.plc1.org +01:== Added node 56 n1-056.plc1.org +01:== Added node 57 n1-057.plc1.org +01:== Added node 58 n1-058.plc1.org +01:== Added node 59 n1-059.plc1.org +01:== Added node 60 n1-060.plc1.org +01:== Added node 61 n1-061.plc1.org +01:== Added node 62 n1-062.plc1.org +01:== Added node 63 n1-063.plc1.org +01:== Added node 64 n1-064.plc1.org +01:== Added node 65 n1-065.plc1.org +01:== Added node 66 n1-066.plc1.org +01:== Added node 67 n1-067.plc1.org +01:== Added node 68 n1-068.plc1.org +01:== Added node 69 n1-069.plc1.org +01:== Added node 70 n1-070.plc1.org +01:== Added node 71 n1-071.plc1.org +01:== Added node 72 n1-072.plc1.org +01:== Added node 73 n1-073.plc1.org +01:== Added node 74 n1-074.plc1.org +01:== Added node 75 n1-075.plc1.org +01:== Added node 76 n1-076.plc1.org +01:== Added node 77 n1-077.plc1.org +01:== Added node 78 n1-078.plc1.org +01:== Added node 79 n1-079.plc1.org +01:== Added node 80 n1-080.plc1.org +01:== Added node 81 n1-081.plc1.org +01:== Added node 82 n1-082.plc1.org +01:== Added node 83 n1-083.plc1.org +01:== Added node 84 n1-084.plc1.org +01:== Added node 85 n1-085.plc1.org +01:== Added node 86 n1-086.plc1.org +01:== Added node 87 n1-087.plc1.org +01:== Added node 88 n1-088.plc1.org +01:== Added node 89 n1-089.plc1.org +01:== Added node 90 n1-090.plc1.org +01:== Added node 91 n1-091.plc1.org +01:== Added node 92 n1-092.plc1.org +01:== Added node 93 n1-093.plc1.org +01:== Added node 94 n1-094.plc1.org +01:== Added node 95 n1-095.plc1.org +01:== Added node 96 n1-096.plc1.org +01:== Added node 97 n1-097.plc1.org +01:== Added node 98 n1-098.plc1.org +01:== Added node 99 n1-099.plc1.org +01:== Added node 100 n1-100.plc1.org +01:== Added node 101 n1-101.plc1.org +01:== Added node 102 n1-102.plc1.org +01:== Added node 103 n1-103.plc1.org +01:== Added node 104 n1-104.plc1.org +01:== Added node 105 n1-105.plc1.org +01:== Added node 106 n1-106.plc1.org +01:== Added node 107 n1-107.plc1.org +01:== Added node 108 n1-108.plc1.org +01:== Added node 109 n1-109.plc1.org +01:== Added node 110 n1-110.plc1.org +01:== Added node 111 n1-111.plc1.org +01:== Added node 112 n1-112.plc1.org +01:== Added node 113 n1-113.plc1.org +01:== Added node 114 n1-114.plc1.org +01:== Added node 115 n1-115.plc1.org +01:== Added node 116 n1-116.plc1.org +01:== Added node 117 n1-117.plc1.org +01:== Added node 118 n1-118.plc1.org +01:== Added node 119 n1-119.plc1.org +01:== Added node 120 n1-120.plc1.org +01:== Added node 121 n1-121.plc1.org +01:== Added node 122 n1-122.plc1.org +01:== Added node 123 n1-123.plc1.org +01:== Added node 124 n1-124.plc1.org +01:== Added node 125 n1-125.plc1.org +01:== Added node 126 n1-126.plc1.org +01:== Added node 127 n1-127.plc1.org +01:== Added node 128 n1-128.plc1.org +01:== Added node 129 n1-129.plc1.org +01:== Added node 130 n1-130.plc1.org +01:== Added node 131 n1-131.plc1.org +01:== Added node 132 n1-132.plc1.org +01:== Added node 133 n1-133.plc1.org +01:== Added node 134 n1-134.plc1.org +01:== Added node 135 n1-135.plc1.org +01:== Added node 136 n1-136.plc1.org +01:== Added node 137 n1-137.plc1.org +01:== Added node 138 n1-138.plc1.org +01:== Added node 139 n1-139.plc1.org +01:== Added node 140 n1-140.plc1.org +01:== Added node 141 n1-141.plc1.org +01:== Added node 142 n1-142.plc1.org +01:== Added node 143 n1-143.plc1.org +01:== Added node 144 n1-144.plc1.org +01:== Added node 145 n1-145.plc1.org +01:== Added node 146 n1-146.plc1.org +01:== Added node 147 n1-147.plc1.org +01:== Added node 148 n1-148.plc1.org +01:== Added node 149 n1-149.plc1.org +01:== Added node 150 n1-150.plc1.org +01:== Added node 151 n1-151.plc1.org +01:== Added node 152 n1-152.plc1.org +01:== Added node 153 n1-153.plc1.org +01:== Added node 154 n1-154.plc1.org +01:== Added node 155 n1-155.plc1.org +01:== Added node 156 n1-156.plc1.org +01:== Added node 157 n1-157.plc1.org +01:== Added node 158 n1-158.plc1.org +01:== Added node 159 n1-159.plc1.org +01:== Added node 160 n1-160.plc1.org +01:== Added node 161 n1-161.plc1.org +01:== Added node 162 n1-162.plc1.org +01:== Added node 163 n1-163.plc1.org +01:== Added node 164 n1-164.plc1.org +01:== Added node 165 n1-165.plc1.org +01:== Added node 166 n1-166.plc1.org +01:== Added node 167 n1-167.plc1.org +01:== Added node 168 n1-168.plc1.org +01:== Added node 169 n1-169.plc1.org +01:== Added node 170 n1-170.plc1.org +01:== Added node 171 n1-171.plc1.org +01:== Added node 172 n1-172.plc1.org +01:== Added node 173 n1-173.plc1.org +01:== Added node 174 n1-174.plc1.org +01:== Added node 175 n1-175.plc1.org +01:== Added node 176 n1-176.plc1.org +01:== Added node 177 n1-177.plc1.org +01:== Added node 178 n1-178.plc1.org +01:== Added node 179 n1-179.plc1.org +01:== Added node 180 n1-180.plc1.org +01:== Added node 181 n1-181.plc1.org +01:== Added node 182 n1-182.plc1.org +01:== Added node 183 n1-183.plc1.org +01:== Added node 184 n1-184.plc1.org +01:== Added node 185 n1-185.plc1.org +01:== Added node 186 n1-186.plc1.org +01:== Added node 187 n1-187.plc1.org +01:== Added node 188 n1-188.plc1.org +01:== Added node 189 n1-189.plc1.org +01:== Added node 190 n1-190.plc1.org +01:== Added node 191 n1-191.plc1.org +01:== Added node 192 n1-192.plc1.org +01:== Added node 193 n1-193.plc1.org +01:== Added node 194 n1-194.plc1.org +01:== Added node 195 n1-195.plc1.org +01:== Added node 196 n1-196.plc1.org +01:== Added node 197 n1-197.plc1.org +01:== Added node 198 n1-198.plc1.org +01:== Added node 199 n1-199.plc1.org +01:== Added node 200 n1-200.plc1.org +01:== Added node 201 n1-201.plc1.org +01:== Added node 202 n1-202.plc1.org +01:== Added node 203 n1-203.plc1.org +01:== Added node 204 n1-204.plc1.org +01:== Added node 205 n1-205.plc1.org +01:== Added node 206 n1-206.plc1.org +01:== Added node 207 n1-207.plc1.org +01:== Added node 208 n1-208.plc1.org +01:== Added node 209 n1-209.plc1.org +01:== Added node 210 n1-210.plc1.org +01:== Added node 211 n1-211.plc1.org +01:== Added node 212 n1-212.plc1.org +01:== Added node 213 n1-213.plc1.org +01:== Added node 214 n1-214.plc1.org +01:== Added node 215 n1-215.plc1.org +01:== Added node 216 n1-216.plc1.org +01:== Added node 217 n1-217.plc1.org +01:== Added node 218 n1-218.plc1.org +01:== Added node 219 n1-219.plc1.org +01:== Added node 220 n1-220.plc1.org +01:== Added node 221 n1-221.plc1.org +01:== Added node 222 n1-222.plc1.org +01:== Added node 223 n1-223.plc1.org +01:== Added node 224 n1-224.plc1.org +01:== Added node 225 n1-225.plc1.org +01:== Added node 226 n1-226.plc1.org +01:== Added node 227 n1-227.plc1.org +01:== Added node 228 n1-228.plc1.org +01:== Added node 229 n1-229.plc1.org +01:== Added node 230 n1-230.plc1.org +01:== Added node 231 n1-231.plc1.org +01:== Added node 232 n1-232.plc1.org +01:== Added node 233 n1-233.plc1.org +01:== Added node 234 n1-234.plc1.org +01:== Added node 235 n1-235.plc1.org +01:== Added node 236 n1-236.plc1.org +01:== Added node 237 n1-237.plc1.org +01:== Added node 238 n1-238.plc1.org +01:== Added node 239 n1-239.plc1.org +01:== Added node 240 n1-240.plc1.org +01:== Added node 241 n1-241.plc1.org +01:== Added node 242 n1-242.plc1.org +01:== Added node 243 n1-243.plc1.org +01:== Added node 244 n1-244.plc1.org +01:== Added node 245 n1-245.plc1.org +01:== Added node 246 n1-246.plc1.org +01:== Added node 247 n1-247.plc1.org +01:== Added node 248 n1-248.plc1.org +01:== Added node 249 n1-249.plc1.org +01:== Added node 250 n1-250.plc1.org +01:== Added node 251 n1-251.plc1.org +01:== Added node 252 n1-252.plc1.org +01:== Added node 253 n1-253.plc1.org +01:== Added node 254 n1-254.plc1.org +01:== Added node 255 n1-255.plc1.org +01:== Added node 256 n1-256.plc1.org +01:== Added node 257 n1-257.plc1.org +01:== Added node 258 n1-258.plc1.org +01:== Added node 259 n1-259.plc1.org +01:== Added node 260 n1-260.plc1.org +01:== Added node 261 n1-261.plc1.org +01:== Added node 262 n1-262.plc1.org +01:== Added node 263 n1-263.plc1.org +01:== Added node 264 n1-264.plc1.org +01:== Added node 265 n1-265.plc1.org +01:== Added node 266 n1-266.plc1.org +01:== Added node 267 n1-267.plc1.org +01:== Added node 268 n1-268.plc1.org +01:== Added node 269 n1-269.plc1.org +01:== Added node 270 n1-270.plc1.org +01:== Added node 271 n1-271.plc1.org +01:== Added node 272 n1-272.plc1.org +01:== Added node 273 n1-273.plc1.org +01:== Added node 274 n1-274.plc1.org +01:== Added node 275 n1-275.plc1.org +01:== Added node 276 n1-276.plc1.org +01:== Added node 277 n1-277.plc1.org +01:== Added node 278 n1-278.plc1.org +01:== Added node 279 n1-279.plc1.org +01:== Added node 280 n1-280.plc1.org +01:== Added node 281 n1-281.plc1.org +01:== Added node 282 n1-282.plc1.org +01:== Added node 283 n1-283.plc1.org +01:== Added node 284 n1-284.plc1.org +01:== Added node 285 n1-285.plc1.org +01:== Added node 286 n1-286.plc1.org +01:== Added node 287 n1-287.plc1.org +01:== Added node 288 n1-288.plc1.org +01:== Added node 289 n1-289.plc1.org +01:== Added node 290 n1-290.plc1.org +01:== Added node 291 n1-291.plc1.org +01:== Added node 292 n1-292.plc1.org +01:== Added node 293 n1-293.plc1.org +01:== Added node 294 n1-294.plc1.org +01:== Added node 295 n1-295.plc1.org +01:== Added node 296 n1-296.plc1.org +01:== Added node 297 n1-297.plc1.org +01:== Added node 298 n1-298.plc1.org +01:== Added node 299 n1-299.plc1.org +01:== Added node 300 n1-300.plc1.org +01:== Added node 301 n1-301.plc1.org +01:== Added node 302 n1-302.plc1.org +01:== Added node 303 n1-303.plc1.org +01:== Added node 304 n1-304.plc1.org +01:== Added node 305 n1-305.plc1.org +01:== Added node 306 n1-306.plc1.org +01:== Added node 307 n1-307.plc1.org +01:== Added node 308 n1-308.plc1.org +01:== Added node 309 n1-309.plc1.org +01:== Added node 310 n1-310.plc1.org +01:== Added node 311 n1-311.plc1.org +01:== Added node 312 n1-312.plc1.org +01:== Added node 313 n1-313.plc1.org +01:== Added node 314 n1-314.plc1.org +01:== Added node 315 n1-315.plc1.org +01:== Added node 316 n1-316.plc1.org +01:== Added node 317 n1-317.plc1.org +01:== Added node 318 n1-318.plc1.org +01:== Added node 319 n1-319.plc1.org +01:== Added node 320 n1-320.plc1.org +01:== Added node 321 n1-321.plc1.org +01:== Added node 322 n1-322.plc1.org +01:== Added node 323 n1-323.plc1.org +01:== Added node 324 n1-324.plc1.org +01:== Added node 325 n1-325.plc1.org +01:== Added node 326 n1-326.plc1.org +01:== Added node 327 n1-327.plc1.org +01:== Added node 328 n1-328.plc1.org +01:== Added node 329 n1-329.plc1.org +01:== Added node 330 n1-330.plc1.org +01:== Added node 331 n1-331.plc1.org +01:== Added node 332 n1-332.plc1.org +01:== Added node 333 n1-333.plc1.org +01:== Added node 334 n1-334.plc1.org +01:== Added node 335 n1-335.plc1.org +01:== Added node 336 n1-336.plc1.org +01:== Added node 337 n1-337.plc1.org +01:== Added node 338 n1-338.plc1.org +01:== Added node 339 n1-339.plc1.org +01:== Added node 340 n1-340.plc1.org +01:== Added node 341 n1-341.plc1.org +01:== Added node 342 n1-342.plc1.org +01:== Added node 343 n1-343.plc1.org +01:== Added node 344 n1-344.plc1.org +01:== Added node 345 n1-345.plc1.org +01:== Added node 346 n1-346.plc1.org +01:== Added node 347 n1-347.plc1.org +01:== Added node 348 n1-348.plc1.org +01:== Added node 349 n1-349.plc1.org +01:== Added node 350 n1-350.plc1.org ++++ 81.72 seconds ellapsed (21.62) +01:== created slice 2 - max nodes=350 +01:== Attached person user-1@plc.org to slice oneb_slice1 +01:== Attached person user-2@plc.org to slice oneb_slice1 +01:== Attached person user-3@plc.org to slice oneb_slice1 +01:== created slice 3 - max nodes=350 +01:== Attached person user-2@plc.org to slice onec_slice2 +01:== Attached person user-3@plc.org to slice onec_slice2 +01:== Attached person user-4@plc.org to slice onec_slice2 +01:== created slice 4 - max nodes=350 +01:== Attached person user-3@plc.org to slice oned_slice3 +01:== Attached person user-4@plc.org to slice oned_slice3 +01:== Attached person user-5@plc.org to slice oned_slice3 +01:== created slice 5 - max nodes=350 +01:== Attached person user-4@plc.org to slice onee_slice4 +01:== Attached person user-5@plc.org to slice onee_slice4 +01:== Attached person user-6@plc.org to slice onee_slice4 +01:== created slice 6 - max nodes=350 +01:== Attached person user-5@plc.org to slice onef_slice5 +01:== Attached person user-6@plc.org to slice onef_slice5 +01:== Attached person user-7@plc.org to slice onef_slice5 +01:== created slice 7 - max nodes=350 +01:== Attached person user-6@plc.org to slice oneg_slice6 +01:== Attached person user-7@plc.org to slice oneg_slice6 +01:== Attached person user-8@plc.org to slice oneg_slice6 +01:== created slice 8 - max nodes=350 +01:== Attached person user-7@plc.org to slice oneh_slice7 +01:== Attached person user-8@plc.org to slice oneh_slice7 +01:== Attached person user-9@plc.org to slice oneh_slice7 +01:== created slice 9 - max nodes=350 +01:== Attached person user-8@plc.org to slice onei_slice8 +01:== Attached person user-9@plc.org to slice onei_slice8 +01:== Attached person user-10@plc.org to slice onei_slice8 +01:== created slice 10 - max nodes=350 +01:== Attached person user-9@plc.org to slice onej_slice9 +01:== Attached person user-10@plc.org to slice onej_slice9 +01:== Attached person user-11@plc.org to slice onej_slice9 +01:== created slice 11 - max nodes=350 +01:== Attached person user-10@plc.org to slice oneba_slice10 +01:== Attached person user-11@plc.org to slice oneba_slice10 +01:== Attached person user-12@plc.org to slice oneba_slice10 +01:== created slice 12 - max nodes=350 +01:== Attached person user-11@plc.org to slice onebb_slice11 +01:== Attached person user-12@plc.org to slice onebb_slice11 +01:== Attached person user-13@plc.org to slice onebb_slice11 +01:== created slice 13 - max nodes=350 +01:== Attached person user-12@plc.org to slice onebc_slice12 +01:== Attached person user-13@plc.org to slice onebc_slice12 +01:== Attached person user-14@plc.org to slice onebc_slice12 +01:== created slice 14 - max nodes=350 +01:== Attached person user-13@plc.org to slice onebd_slice13 +01:== Attached person user-14@plc.org to slice onebd_slice13 +01:== Attached person user-15@plc.org to slice onebd_slice13 +01:== created slice 15 - max nodes=350 +01:== Attached person user-14@plc.org to slice onebe_slice14 +01:== Attached person user-15@plc.org to slice onebe_slice14 +01:== Attached person user-16@plc.org to slice onebe_slice14 +01:== created slice 16 - max nodes=350 +01:== Attached person user-15@plc.org to slice onebf_slice15 +01:== Attached person user-16@plc.org to slice onebf_slice15 +01:== Attached person user-17@plc.org to slice onebf_slice15 +01:== created slice 17 - max nodes=350 +01:== Attached person user-16@plc.org to slice onebg_slice16 +01:== Attached person user-17@plc.org to slice onebg_slice16 +01:== Attached person user-18@plc.org to slice onebg_slice16 +01:== created slice 18 - max nodes=350 +01:== Attached person user-17@plc.org to slice onebh_slice17 +01:== Attached person user-18@plc.org to slice onebh_slice17 +01:== Attached person user-19@plc.org to slice onebh_slice17 +01:== created slice 19 - max nodes=350 +01:== Attached person user-18@plc.org to slice onebi_slice18 +01:== Attached person user-19@plc.org to slice onebi_slice18 +01:== Attached person user-20@plc.org to slice onebi_slice18 +01:== created slice 20 - max nodes=350 +01:== Attached person user-19@plc.org to slice onebj_slice19 +01:== Attached person user-20@plc.org to slice onebj_slice19 +01:== Attached person user-21@plc.org to slice onebj_slice19 +01:== created slice 21 - max nodes=350 +01:== Attached person user-20@plc.org to slice oneca_slice20 +01:== Attached person user-21@plc.org to slice oneca_slice20 +01:== Attached person user-22@plc.org to slice oneca_slice20 +01:== created slice 22 - max nodes=350 +01:== Attached person user-21@plc.org to slice onecb_slice21 +01:== Attached person user-22@plc.org to slice onecb_slice21 +01:== Attached person user-23@plc.org to slice onecb_slice21 +01:== created slice 23 - max nodes=350 +01:== Attached person user-22@plc.org to slice onecc_slice22 +01:== Attached person user-23@plc.org to slice onecc_slice22 +01:== Attached person user-24@plc.org to slice onecc_slice22 +01:== created slice 24 - max nodes=350 +01:== Attached person user-23@plc.org to slice onecd_slice23 +01:== Attached person user-24@plc.org to slice onecd_slice23 +01:== Attached person user-25@plc.org to slice onecd_slice23 +01:== created slice 25 - max nodes=350 +01:== Attached person user-24@plc.org to slice onece_slice24 +01:== Attached person user-25@plc.org to slice onece_slice24 +01:== Attached person user-26@plc.org to slice onece_slice24 +01:== created slice 26 - max nodes=350 +01:== Attached person user-25@plc.org to slice onecf_slice25 +01:== Attached person user-26@plc.org to slice onecf_slice25 +01:== Attached person user-27@plc.org to slice onecf_slice25 +01:== created slice 27 - max nodes=350 +01:== Attached person user-26@plc.org to slice onecg_slice26 +01:== Attached person user-27@plc.org to slice onecg_slice26 +01:== Attached person user-28@plc.org to slice onecg_slice26 +01:== created slice 28 - max nodes=350 +01:== Attached person user-27@plc.org to slice onech_slice27 +01:== Attached person user-28@plc.org to slice onech_slice27 +01:== Attached person user-29@plc.org to slice onech_slice27 +01:== created slice 29 - max nodes=350 +01:== Attached person user-28@plc.org to slice oneci_slice28 +01:== Attached person user-29@plc.org to slice oneci_slice28 +01:== Attached person user-30@plc.org to slice oneci_slice28 +01:== created slice 30 - max nodes=350 +01:== Attached person user-29@plc.org to slice onecj_slice29 +01:== Attached person user-30@plc.org to slice onecj_slice29 +01:== Attached person user-31@plc.org to slice onecj_slice29 +01:== created slice 31 - max nodes=350 +01:== Attached person user-30@plc.org to slice oneda_slice30 +01:== Attached person user-31@plc.org to slice oneda_slice30 +01:== Attached person user-32@plc.org to slice oneda_slice30 +01:== created slice 32 - max nodes=350 +01:== Attached person user-31@plc.org to slice onedb_slice31 +01:== Attached person user-32@plc.org to slice onedb_slice31 +01:== Attached person user-33@plc.org to slice onedb_slice31 +01:== created slice 33 - max nodes=350 +01:== Attached person user-32@plc.org to slice onedc_slice32 +01:== Attached person user-33@plc.org to slice onedc_slice32 +01:== Attached person user-34@plc.org to slice onedc_slice32 +01:== created slice 34 - max nodes=350 +01:== Attached person user-33@plc.org to slice onedd_slice33 +01:== Attached person user-34@plc.org to slice onedd_slice33 +01:== Attached person user-35@plc.org to slice onedd_slice33 +01:== created slice 35 - max nodes=350 +01:== Attached person user-34@plc.org to slice onede_slice34 +01:== Attached person user-35@plc.org to slice onede_slice34 +01:== Attached person user-36@plc.org to slice onede_slice34 +01:== created slice 36 - max nodes=350 +01:== Attached person user-35@plc.org to slice onedf_slice35 +01:== Attached person user-36@plc.org to slice onedf_slice35 +01:== Attached person user-37@plc.org to slice onedf_slice35 +01:== created slice 37 - max nodes=350 +01:== Attached person user-36@plc.org to slice onedg_slice36 +01:== Attached person user-37@plc.org to slice onedg_slice36 +01:== Attached person user-38@plc.org to slice onedg_slice36 +01:== created slice 38 - max nodes=350 +01:== Attached person user-37@plc.org to slice onedh_slice37 +01:== Attached person user-38@plc.org to slice onedh_slice37 +01:== Attached person user-39@plc.org to slice onedh_slice37 +01:== created slice 39 - max nodes=350 +01:== Attached person user-38@plc.org to slice onedi_slice38 +01:== Attached person user-39@plc.org to slice onedi_slice38 +01:== Attached person user-40@plc.org to slice onedi_slice38 +01:== created slice 40 - max nodes=350 +01:== Attached person user-39@plc.org to slice onedj_slice39 +01:== Attached person user-40@plc.org to slice onedj_slice39 +01:== Attached person user-41@plc.org to slice onedj_slice39 +01:== created slice 41 - max nodes=350 +01:== Attached person user-40@plc.org to slice oneea_slice40 +01:== Attached person user-41@plc.org to slice oneea_slice40 +01:== Attached person user-42@plc.org to slice oneea_slice40 +01:== created slice 42 - max nodes=350 +01:== Attached person user-41@plc.org to slice oneeb_slice41 +01:== Attached person user-42@plc.org to slice oneeb_slice41 +01:== Attached person user-43@plc.org to slice oneeb_slice41 +01:== created slice 43 - max nodes=350 +01:== Attached person user-42@plc.org to slice oneec_slice42 +01:== Attached person user-43@plc.org to slice oneec_slice42 +01:== Attached person user-44@plc.org to slice oneec_slice42 +01:== created slice 44 - max nodes=350 +01:== Attached person user-43@plc.org to slice oneed_slice43 +01:== Attached person user-44@plc.org to slice oneed_slice43 +01:== Attached person user-45@plc.org to slice oneed_slice43 +01:== created slice 45 - max nodes=350 +01:== Attached person user-44@plc.org to slice oneee_slice44 +01:== Attached person user-45@plc.org to slice oneee_slice44 +01:== Attached person user-46@plc.org to slice oneee_slice44 +01:== created slice 46 - max nodes=350 +01:== Attached person user-45@plc.org to slice oneef_slice45 +01:== Attached person user-46@plc.org to slice oneef_slice45 +01:== Attached person user-47@plc.org to slice oneef_slice45 +01:== created slice 47 - max nodes=350 +01:== Attached person user-46@plc.org to slice oneeg_slice46 +01:== Attached person user-47@plc.org to slice oneeg_slice46 +01:== Attached person user-48@plc.org to slice oneeg_slice46 +01:== created slice 48 - max nodes=350 +01:== Attached person user-47@plc.org to slice oneeh_slice47 +01:== Attached person user-48@plc.org to slice oneeh_slice47 +01:== Attached person user-49@plc.org to slice oneeh_slice47 +01:== created slice 49 - max nodes=350 +01:== Attached person user-48@plc.org to slice oneei_slice48 +01:== Attached person user-49@plc.org to slice oneei_slice48 +01:== Attached person user-50@plc.org to slice oneei_slice48 +01:== created slice 50 - max nodes=350 +01:== Attached person user-49@plc.org to slice oneej_slice49 +01:== Attached person user-50@plc.org to slice oneej_slice49 +01:== Attached person user-51@plc.org to slice oneej_slice49 +01:== created slice 51 - max nodes=350 +01:== Attached person user-50@plc.org to slice onefa_slice50 +01:== Attached person user-51@plc.org to slice onefa_slice50 +01:== Attached person user-52@plc.org to slice onefa_slice50 +01:== created slice 52 - max nodes=350 +01:== Attached person user-51@plc.org to slice onefb_slice51 +01:== Attached person user-52@plc.org to slice onefb_slice51 +01:== Attached person user-53@plc.org to slice onefb_slice51 +01:== created slice 53 - max nodes=350 +01:== Attached person user-52@plc.org to slice onefc_slice52 +01:== Attached person user-53@plc.org to slice onefc_slice52 +01:== Attached person user-54@plc.org to slice onefc_slice52 +01:== created slice 54 - max nodes=350 +01:== Attached person user-53@plc.org to slice onefd_slice53 +01:== Attached person user-54@plc.org to slice onefd_slice53 +01:== Attached person user-55@plc.org to slice onefd_slice53 +01:== created slice 55 - max nodes=350 +01:== Attached person user-54@plc.org to slice onefe_slice54 +01:== Attached person user-55@plc.org to slice onefe_slice54 +01:== Attached person user-56@plc.org to slice onefe_slice54 +01:== created slice 56 - max nodes=350 +01:== Attached person user-55@plc.org to slice oneff_slice55 +01:== Attached person user-56@plc.org to slice oneff_slice55 +01:== Attached person user-57@plc.org to slice oneff_slice55 +01:== created slice 57 - max nodes=350 +01:== Attached person user-56@plc.org to slice onefg_slice56 +01:== Attached person user-57@plc.org to slice onefg_slice56 +01:== Attached person user-58@plc.org to slice onefg_slice56 +01:== created slice 58 - max nodes=350 +01:== Attached person user-57@plc.org to slice onefh_slice57 +01:== Attached person user-58@plc.org to slice onefh_slice57 +01:== Attached person user-59@plc.org to slice onefh_slice57 +01:== created slice 59 - max nodes=350 +01:== Attached person user-58@plc.org to slice onefi_slice58 +01:== Attached person user-59@plc.org to slice onefi_slice58 +01:== Attached person user-60@plc.org to slice onefi_slice58 +01:== created slice 60 - max nodes=350 +01:== Attached person user-59@plc.org to slice onefj_slice59 +01:== Attached person user-60@plc.org to slice onefj_slice59 +01:== Attached person user-61@plc.org to slice onefj_slice59 +01:== created slice 61 - max nodes=350 +01:== Attached person user-60@plc.org to slice onega_slice60 +01:== Attached person user-61@plc.org to slice onega_slice60 +01:== Attached person user-62@plc.org to slice onega_slice60 +01:== created slice 62 - max nodes=350 +01:== Attached person user-61@plc.org to slice onegb_slice61 +01:== Attached person user-62@plc.org to slice onegb_slice61 +01:== Attached person user-63@plc.org to slice onegb_slice61 +01:== created slice 63 - max nodes=350 +01:== Attached person user-62@plc.org to slice onegc_slice62 +01:== Attached person user-63@plc.org to slice onegc_slice62 +01:== Attached person user-64@plc.org to slice onegc_slice62 +01:== created slice 64 - max nodes=350 +01:== Attached person user-63@plc.org to slice onegd_slice63 +01:== Attached person user-64@plc.org to slice onegd_slice63 +01:== Attached person user-65@plc.org to slice onegd_slice63 +01:== created slice 65 - max nodes=350 +01:== Attached person user-64@plc.org to slice onege_slice64 +01:== Attached person user-65@plc.org to slice onege_slice64 +01:== Attached person user-66@plc.org to slice onege_slice64 +01:== created slice 66 - max nodes=350 +01:== Attached person user-65@plc.org to slice onegf_slice65 +01:== Attached person user-66@plc.org to slice onegf_slice65 +01:== Attached person user-67@plc.org to slice onegf_slice65 +01:== created slice 67 - max nodes=350 +01:== Attached person user-66@plc.org to slice onegg_slice66 +01:== Attached person user-67@plc.org to slice onegg_slice66 +01:== Attached person user-68@plc.org to slice onegg_slice66 +01:== created slice 68 - max nodes=350 +01:== Attached person user-67@plc.org to slice onegh_slice67 +01:== Attached person user-68@plc.org to slice onegh_slice67 +01:== Attached person user-69@plc.org to slice onegh_slice67 +01:== created slice 69 - max nodes=350 +01:== Attached person user-68@plc.org to slice onegi_slice68 +01:== Attached person user-69@plc.org to slice onegi_slice68 +01:== Attached person user-70@plc.org to slice onegi_slice68 +01:== created slice 70 - max nodes=350 +01:== Attached person user-69@plc.org to slice onegj_slice69 +01:== Attached person user-70@plc.org to slice onegj_slice69 +01:== Attached person user-71@plc.org to slice onegj_slice69 +01:== created slice 71 - max nodes=350 +01:== Attached person user-70@plc.org to slice oneha_slice70 +01:== Attached person user-71@plc.org to slice oneha_slice70 +01:== Attached person user-72@plc.org to slice oneha_slice70 +01:== created slice 72 - max nodes=350 +01:== Attached person user-71@plc.org to slice onehb_slice71 +01:== Attached person user-72@plc.org to slice onehb_slice71 +01:== Attached person user-73@plc.org to slice onehb_slice71 +01:== created slice 73 - max nodes=350 +01:== Attached person user-72@plc.org to slice onehc_slice72 +01:== Attached person user-73@plc.org to slice onehc_slice72 +01:== Attached person user-74@plc.org to slice onehc_slice72 +01:== created slice 74 - max nodes=350 +01:== Attached person user-73@plc.org to slice onehd_slice73 +01:== Attached person user-74@plc.org to slice onehd_slice73 +01:== Attached person user-75@plc.org to slice onehd_slice73 +01:== created slice 75 - max nodes=350 +01:== Attached person user-74@plc.org to slice onehe_slice74 +01:== Attached person user-75@plc.org to slice onehe_slice74 +01:== Attached person user-76@plc.org to slice onehe_slice74 +01:== created slice 76 - max nodes=350 +01:== Attached person user-75@plc.org to slice onehf_slice75 +01:== Attached person user-76@plc.org to slice onehf_slice75 +01:== Attached person user-77@plc.org to slice onehf_slice75 +01:== created slice 77 - max nodes=350 +01:== Attached person user-76@plc.org to slice onehg_slice76 +01:== Attached person user-77@plc.org to slice onehg_slice76 +01:== Attached person user-78@plc.org to slice onehg_slice76 +01:== created slice 78 - max nodes=350 +01:== Attached person user-77@plc.org to slice onehh_slice77 +01:== Attached person user-78@plc.org to slice onehh_slice77 +01:== Attached person user-79@plc.org to slice onehh_slice77 +01:== created slice 79 - max nodes=350 +01:== Attached person user-78@plc.org to slice onehi_slice78 +01:== Attached person user-79@plc.org to slice onehi_slice78 +01:== Attached person user-80@plc.org to slice onehi_slice78 +01:== created slice 80 - max nodes=350 +01:== Attached person user-79@plc.org to slice onehj_slice79 +01:== Attached person user-80@plc.org to slice onehj_slice79 +01:== Attached person user-81@plc.org to slice onehj_slice79 +01:== created slice 81 - max nodes=350 +01:== Attached person user-80@plc.org to slice oneia_slice80 +01:== Attached person user-81@plc.org to slice oneia_slice80 +01:== Attached person user-82@plc.org to slice oneia_slice80 +01:== created slice 82 - max nodes=350 +01:== Attached person user-81@plc.org to slice oneib_slice81 +01:== Attached person user-82@plc.org to slice oneib_slice81 +01:== Attached person user-83@plc.org to slice oneib_slice81 +01:== created slice 83 - max nodes=350 +01:== Attached person user-82@plc.org to slice oneic_slice82 +01:== Attached person user-83@plc.org to slice oneic_slice82 +01:== Attached person user-84@plc.org to slice oneic_slice82 +01:== created slice 84 - max nodes=350 +01:== Attached person user-83@plc.org to slice oneid_slice83 +01:== Attached person user-84@plc.org to slice oneid_slice83 +01:== Attached person user-85@plc.org to slice oneid_slice83 +01:== created slice 85 - max nodes=350 +01:== Attached person user-84@plc.org to slice oneie_slice84 +01:== Attached person user-85@plc.org to slice oneie_slice84 +01:== Attached person user-86@plc.org to slice oneie_slice84 +01:== created slice 86 - max nodes=350 +01:== Attached person user-85@plc.org to slice oneif_slice85 +01:== Attached person user-86@plc.org to slice oneif_slice85 +01:== Attached person user-87@plc.org to slice oneif_slice85 +01:== created slice 87 - max nodes=350 +01:== Attached person user-86@plc.org to slice oneig_slice86 +01:== Attached person user-87@plc.org to slice oneig_slice86 +01:== Attached person user-88@plc.org to slice oneig_slice86 +01:== created slice 88 - max nodes=350 +01:== Attached person user-87@plc.org to slice oneih_slice87 +01:== Attached person user-88@plc.org to slice oneih_slice87 +01:== Attached person user-89@plc.org to slice oneih_slice87 +01:== created slice 89 - max nodes=350 +01:== Attached person user-88@plc.org to slice oneii_slice88 +01:== Attached person user-89@plc.org to slice oneii_slice88 +01:== Attached person user-90@plc.org to slice oneii_slice88 +01:== created slice 90 - max nodes=350 +01:== Attached person user-89@plc.org to slice oneij_slice89 +01:== Attached person user-90@plc.org to slice oneij_slice89 +01:== Attached person user-91@plc.org to slice oneij_slice89 +01:== created slice 91 - max nodes=350 +01:== Attached person user-90@plc.org to slice oneja_slice90 +01:== Attached person user-91@plc.org to slice oneja_slice90 +01:== Attached person user-92@plc.org to slice oneja_slice90 +01:== created slice 92 - max nodes=350 +01:== Attached person user-91@plc.org to slice onejb_slice91 +01:== Attached person user-92@plc.org to slice onejb_slice91 +01:== Attached person user-93@plc.org to slice onejb_slice91 +01:== created slice 93 - max nodes=350 +01:== Attached person user-92@plc.org to slice onejc_slice92 +01:== Attached person user-93@plc.org to slice onejc_slice92 +01:== Attached person user-94@plc.org to slice onejc_slice92 +01:== created slice 94 - max nodes=350 +01:== Attached person user-93@plc.org to slice onejd_slice93 +01:== Attached person user-94@plc.org to slice onejd_slice93 +01:== Attached person user-95@plc.org to slice onejd_slice93 +01:== created slice 95 - max nodes=350 +01:== Attached person user-94@plc.org to slice oneje_slice94 +01:== Attached person user-95@plc.org to slice oneje_slice94 +01:== Attached person user-96@plc.org to slice oneje_slice94 +01:== created slice 96 - max nodes=350 +01:== Attached person user-95@plc.org to slice onejf_slice95 +01:== Attached person user-96@plc.org to slice onejf_slice95 +01:== Attached person user-97@plc.org to slice onejf_slice95 +01:== created slice 97 - max nodes=350 +01:== Attached person user-96@plc.org to slice onejg_slice96 +01:== Attached person user-97@plc.org to slice onejg_slice96 +01:== Attached person user-98@plc.org to slice onejg_slice96 +01:== created slice 98 - max nodes=350 +01:== Attached person user-97@plc.org to slice onejh_slice97 +01:== Attached person user-98@plc.org to slice onejh_slice97 +01:== Attached person user-99@plc.org to slice onejh_slice97 +01:== created slice 99 - max nodes=350 +01:== Attached person user-98@plc.org to slice oneji_slice98 +01:== Attached person user-99@plc.org to slice oneji_slice98 +01:== Attached person user-100@plc.org to slice oneji_slice98 +01:== created slice 100 - max nodes=350 +01:== Attached person user-99@plc.org to slice onejj_slice99 +01:== Attached person user-100@plc.org to slice onejj_slice99 +01:== Attached person user-101@plc.org to slice onejj_slice99 +01:== created slice 101 - max nodes=350 +01:== Attached person user-100@plc.org to slice onebaa_slice100 +01:== Attached person user-101@plc.org to slice onebaa_slice100 +01:== Attached person user-102@plc.org to slice onebaa_slice100 +01:== created slice 102 - max nodes=350 +01:== Attached person user-101@plc.org to slice onebab_slice101 +01:== Attached person user-102@plc.org to slice onebab_slice101 +01:== Attached person user-103@plc.org to slice onebab_slice101 +01:== created slice 103 - max nodes=350 +01:== Attached person user-102@plc.org to slice onebac_slice102 +01:== Attached person user-103@plc.org to slice onebac_slice102 +01:== Attached person user-104@plc.org to slice onebac_slice102 +01:== created slice 104 - max nodes=350 +01:== Attached person user-103@plc.org to slice onebad_slice103 +01:== Attached person user-104@plc.org to slice onebad_slice103 +01:== Attached person user-105@plc.org to slice onebad_slice103 +01:== created slice 105 - max nodes=350 +01:== Attached person user-104@plc.org to slice onebae_slice104 +01:== Attached person user-105@plc.org to slice onebae_slice104 +01:== Attached person user-106@plc.org to slice onebae_slice104 +01:== created slice 106 - max nodes=350 +01:== Attached person user-105@plc.org to slice onebaf_slice105 +01:== Attached person user-106@plc.org to slice onebaf_slice105 +01:== Attached person user-107@plc.org to slice onebaf_slice105 +01:== created slice 107 - max nodes=350 +01:== Attached person user-106@plc.org to slice onebag_slice106 +01:== Attached person user-107@plc.org to slice onebag_slice106 +01:== Attached person user-108@plc.org to slice onebag_slice106 +01:== created slice 108 - max nodes=350 +01:== Attached person user-107@plc.org to slice onebah_slice107 +01:== Attached person user-108@plc.org to slice onebah_slice107 +01:== Attached person user-109@plc.org to slice onebah_slice107 +01:== created slice 109 - max nodes=350 +01:== Attached person user-108@plc.org to slice onebai_slice108 +01:== Attached person user-109@plc.org to slice onebai_slice108 +01:== Attached person user-110@plc.org to slice onebai_slice108 +01:== created slice 110 - max nodes=350 +01:== Attached person user-109@plc.org to slice onebaj_slice109 +01:== Attached person user-110@plc.org to slice onebaj_slice109 +01:== Attached person user-111@plc.org to slice onebaj_slice109 +01:== created slice 111 - max nodes=350 +01:== Attached person user-110@plc.org to slice onebba_slice110 +01:== Attached person user-111@plc.org to slice onebba_slice110 +01:== Attached person user-112@plc.org to slice onebba_slice110 +01:== created slice 112 - max nodes=350 +01:== Attached person user-111@plc.org to slice onebbb_slice111 +01:== Attached person user-112@plc.org to slice onebbb_slice111 +01:== Attached person user-113@plc.org to slice onebbb_slice111 +01:== created slice 113 - max nodes=350 +01:== Attached person user-112@plc.org to slice onebbc_slice112 +01:== Attached person user-113@plc.org to slice onebbc_slice112 +01:== Attached person user-114@plc.org to slice onebbc_slice112 +01:== created slice 114 - max nodes=350 +01:== Attached person user-113@plc.org to slice onebbd_slice113 +01:== Attached person user-114@plc.org to slice onebbd_slice113 +01:== Attached person user-115@plc.org to slice onebbd_slice113 +01:== created slice 115 - max nodes=350 +01:== Attached person user-114@plc.org to slice onebbe_slice114 +01:== Attached person user-115@plc.org to slice onebbe_slice114 +01:== Attached person user-116@plc.org to slice onebbe_slice114 +01:== created slice 116 - max nodes=350 +01:== Attached person user-115@plc.org to slice onebbf_slice115 +01:== Attached person user-116@plc.org to slice onebbf_slice115 +01:== Attached person user-117@plc.org to slice onebbf_slice115 +01:== created slice 117 - max nodes=350 +01:== Attached person user-116@plc.org to slice onebbg_slice116 +01:== Attached person user-117@plc.org to slice onebbg_slice116 +01:== Attached person user-118@plc.org to slice onebbg_slice116 +01:== created slice 118 - max nodes=350 +01:== Attached person user-117@plc.org to slice onebbh_slice117 +01:== Attached person user-118@plc.org to slice onebbh_slice117 +01:== Attached person user-119@plc.org to slice onebbh_slice117 +01:== created slice 119 - max nodes=350 +01:== Attached person user-118@plc.org to slice onebbi_slice118 +01:== Attached person user-119@plc.org to slice onebbi_slice118 +01:== Attached person user-120@plc.org to slice onebbi_slice118 +01:== created slice 120 - max nodes=350 +01:== Attached person user-119@plc.org to slice onebbj_slice119 +01:== Attached person user-120@plc.org to slice onebbj_slice119 +01:== Attached person user-121@plc.org to slice onebbj_slice119 +01:== created slice 121 - max nodes=350 +01:== Attached person user-120@plc.org to slice onebca_slice120 +01:== Attached person user-121@plc.org to slice onebca_slice120 +01:== Attached person user-122@plc.org to slice onebca_slice120 +01:== created slice 122 - max nodes=350 +01:== Attached person user-121@plc.org to slice onebcb_slice121 +01:== Attached person user-122@plc.org to slice onebcb_slice121 +01:== Attached person user-123@plc.org to slice onebcb_slice121 +01:== created slice 123 - max nodes=350 +01:== Attached person user-122@plc.org to slice onebcc_slice122 +01:== Attached person user-123@plc.org to slice onebcc_slice122 +01:== Attached person user-124@plc.org to slice onebcc_slice122 +01:== created slice 124 - max nodes=350 +01:== Attached person user-123@plc.org to slice onebcd_slice123 +01:== Attached person user-124@plc.org to slice onebcd_slice123 +01:== Attached person user-125@plc.org to slice onebcd_slice123 +01:== created slice 125 - max nodes=350 +01:== Attached person user-124@plc.org to slice onebce_slice124 +01:== Attached person user-125@plc.org to slice onebce_slice124 +01:== Attached person user-126@plc.org to slice onebce_slice124 +01:== created slice 126 - max nodes=350 +01:== Attached person user-125@plc.org to slice onebcf_slice125 +01:== Attached person user-126@plc.org to slice onebcf_slice125 +01:== Attached person user-127@plc.org to slice onebcf_slice125 +01:== created slice 127 - max nodes=350 +01:== Attached person user-126@plc.org to slice onebcg_slice126 +01:== Attached person user-127@plc.org to slice onebcg_slice126 +01:== Attached person user-128@plc.org to slice onebcg_slice126 +01:== created slice 128 - max nodes=350 +01:== Attached person user-127@plc.org to slice onebch_slice127 +01:== Attached person user-128@plc.org to slice onebch_slice127 +01:== Attached person user-129@plc.org to slice onebch_slice127 +01:== created slice 129 - max nodes=350 +01:== Attached person user-128@plc.org to slice onebci_slice128 +01:== Attached person user-129@plc.org to slice onebci_slice128 +01:== Attached person user-130@plc.org to slice onebci_slice128 +01:== created slice 130 - max nodes=350 +01:== Attached person user-129@plc.org to slice onebcj_slice129 +01:== Attached person user-130@plc.org to slice onebcj_slice129 +01:== Attached person user-131@plc.org to slice onebcj_slice129 +01:== created slice 131 - max nodes=350 +01:== Attached person user-130@plc.org to slice onebda_slice130 +01:== Attached person user-131@plc.org to slice onebda_slice130 +01:== Attached person user-132@plc.org to slice onebda_slice130 +01:== created slice 132 - max nodes=350 +01:== Attached person user-131@plc.org to slice onebdb_slice131 +01:== Attached person user-132@plc.org to slice onebdb_slice131 +01:== Attached person user-133@plc.org to slice onebdb_slice131 +01:== created slice 133 - max nodes=350 +01:== Attached person user-132@plc.org to slice onebdc_slice132 +01:== Attached person user-133@plc.org to slice onebdc_slice132 +01:== Attached person user-134@plc.org to slice onebdc_slice132 +01:== created slice 134 - max nodes=350 +01:== Attached person user-133@plc.org to slice onebdd_slice133 +01:== Attached person user-134@plc.org to slice onebdd_slice133 +01:== Attached person user-135@plc.org to slice onebdd_slice133 +01:== created slice 135 - max nodes=350 +01:== Attached person user-134@plc.org to slice onebde_slice134 +01:== Attached person user-135@plc.org to slice onebde_slice134 +01:== Attached person user-136@plc.org to slice onebde_slice134 +01:== created slice 136 - max nodes=350 +01:== Attached person user-135@plc.org to slice onebdf_slice135 +01:== Attached person user-136@plc.org to slice onebdf_slice135 +01:== Attached person user-137@plc.org to slice onebdf_slice135 +01:== created slice 137 - max nodes=350 +01:== Attached person user-136@plc.org to slice onebdg_slice136 +01:== Attached person user-137@plc.org to slice onebdg_slice136 +01:== Attached person user-138@plc.org to slice onebdg_slice136 +01:== created slice 138 - max nodes=350 +01:== Attached person user-137@plc.org to slice onebdh_slice137 +01:== Attached person user-138@plc.org to slice onebdh_slice137 +01:== Attached person user-139@plc.org to slice onebdh_slice137 +01:== created slice 139 - max nodes=350 +01:== Attached person user-138@plc.org to slice onebdi_slice138 +01:== Attached person user-139@plc.org to slice onebdi_slice138 +01:== Attached person user-140@plc.org to slice onebdi_slice138 +01:== created slice 140 - max nodes=350 +01:== Attached person user-139@plc.org to slice onebdj_slice139 +01:== Attached person user-140@plc.org to slice onebdj_slice139 +01:== Attached person user-141@plc.org to slice onebdj_slice139 +01:== created slice 141 - max nodes=350 +01:== Attached person user-140@plc.org to slice onebea_slice140 +01:== Attached person user-141@plc.org to slice onebea_slice140 +01:== Attached person user-142@plc.org to slice onebea_slice140 +01:== created slice 142 - max nodes=350 +01:== Attached person user-141@plc.org to slice onebeb_slice141 +01:== Attached person user-142@plc.org to slice onebeb_slice141 +01:== Attached person user-143@plc.org to slice onebeb_slice141 +01:== created slice 143 - max nodes=350 +01:== Attached person user-142@plc.org to slice onebec_slice142 +01:== Attached person user-143@plc.org to slice onebec_slice142 +01:== Attached person user-144@plc.org to slice onebec_slice142 +01:== created slice 144 - max nodes=350 +01:== Attached person user-143@plc.org to slice onebed_slice143 +01:== Attached person user-144@plc.org to slice onebed_slice143 +01:== Attached person user-145@plc.org to slice onebed_slice143 +01:== created slice 145 - max nodes=350 +01:== Attached person user-144@plc.org to slice onebee_slice144 +01:== Attached person user-145@plc.org to slice onebee_slice144 +01:== Attached person user-146@plc.org to slice onebee_slice144 +01:== created slice 146 - max nodes=350 +01:== Attached person user-145@plc.org to slice onebef_slice145 +01:== Attached person user-146@plc.org to slice onebef_slice145 +01:== Attached person user-147@plc.org to slice onebef_slice145 +01:== created slice 147 - max nodes=350 +01:== Attached person user-146@plc.org to slice onebeg_slice146 +01:== Attached person user-147@plc.org to slice onebeg_slice146 +01:== Attached person user-148@plc.org to slice onebeg_slice146 +01:== created slice 148 - max nodes=350 +01:== Attached person user-147@plc.org to slice onebeh_slice147 +01:== Attached person user-148@plc.org to slice onebeh_slice147 +01:== Attached person user-149@plc.org to slice onebeh_slice147 +01:== created slice 149 - max nodes=350 +01:== Attached person user-148@plc.org to slice onebei_slice148 +01:== Attached person user-149@plc.org to slice onebei_slice148 +01:== Attached person user-150@plc.org to slice onebei_slice148 +01:== created slice 150 - max nodes=350 +01:== Attached person user-149@plc.org to slice onebej_slice149 +01:== Attached person user-150@plc.org to slice onebej_slice149 +01:== Attached person user-151@plc.org to slice onebej_slice149 +01:== created slice 151 - max nodes=350 +01:== Attached person user-150@plc.org to slice onebfa_slice150 +01:== Attached person user-151@plc.org to slice onebfa_slice150 +01:== Attached person user-152@plc.org to slice onebfa_slice150 +01:== created slice 152 - max nodes=350 +01:== Attached person user-151@plc.org to slice onebfb_slice151 +01:== Attached person user-152@plc.org to slice onebfb_slice151 +01:== Attached person user-153@plc.org to slice onebfb_slice151 +01:== created slice 153 - max nodes=350 +01:== Attached person user-152@plc.org to slice onebfc_slice152 +01:== Attached person user-153@plc.org to slice onebfc_slice152 +01:== Attached person user-154@plc.org to slice onebfc_slice152 +01:== created slice 154 - max nodes=350 +01:== Attached person user-153@plc.org to slice onebfd_slice153 +01:== Attached person user-154@plc.org to slice onebfd_slice153 +01:== Attached person user-155@plc.org to slice onebfd_slice153 +01:== created slice 155 - max nodes=350 +01:== Attached person user-154@plc.org to slice onebfe_slice154 +01:== Attached person user-155@plc.org to slice onebfe_slice154 +01:== Attached person user-156@plc.org to slice onebfe_slice154 +01:== created slice 156 - max nodes=350 +01:== Attached person user-155@plc.org to slice onebff_slice155 +01:== Attached person user-156@plc.org to slice onebff_slice155 +01:== Attached person user-157@plc.org to slice onebff_slice155 +01:== created slice 157 - max nodes=350 +01:== Attached person user-156@plc.org to slice onebfg_slice156 +01:== Attached person user-157@plc.org to slice onebfg_slice156 +01:== Attached person user-158@plc.org to slice onebfg_slice156 +01:== created slice 158 - max nodes=350 +01:== Attached person user-157@plc.org to slice onebfh_slice157 +01:== Attached person user-158@plc.org to slice onebfh_slice157 +01:== Attached person user-159@plc.org to slice onebfh_slice157 +01:== created slice 159 - max nodes=350 +01:== Attached person user-158@plc.org to slice onebfi_slice158 +01:== Attached person user-159@plc.org to slice onebfi_slice158 +01:== Attached person user-160@plc.org to slice onebfi_slice158 +01:== created slice 160 - max nodes=350 +01:== Attached person user-159@plc.org to slice onebfj_slice159 +01:== Attached person user-160@plc.org to slice onebfj_slice159 +01:== Attached person user-161@plc.org to slice onebfj_slice159 +01:== created slice 161 - max nodes=350 +01:== Attached person user-160@plc.org to slice onebga_slice160 +01:== Attached person user-161@plc.org to slice onebga_slice160 +01:== Attached person user-162@plc.org to slice onebga_slice160 +01:== created slice 162 - max nodes=350 +01:== Attached person user-161@plc.org to slice onebgb_slice161 +01:== Attached person user-162@plc.org to slice onebgb_slice161 +01:== Attached person user-163@plc.org to slice onebgb_slice161 +01:== created slice 163 - max nodes=350 +01:== Attached person user-162@plc.org to slice onebgc_slice162 +01:== Attached person user-163@plc.org to slice onebgc_slice162 +01:== Attached person user-164@plc.org to slice onebgc_slice162 +01:== created slice 164 - max nodes=350 +01:== Attached person user-163@plc.org to slice onebgd_slice163 +01:== Attached person user-164@plc.org to slice onebgd_slice163 +01:== Attached person user-165@plc.org to slice onebgd_slice163 +01:== created slice 165 - max nodes=350 +01:== Attached person user-164@plc.org to slice onebge_slice164 +01:== Attached person user-165@plc.org to slice onebge_slice164 +01:== Attached person user-166@plc.org to slice onebge_slice164 +01:== created slice 166 - max nodes=350 +01:== Attached person user-165@plc.org to slice onebgf_slice165 +01:== Attached person user-166@plc.org to slice onebgf_slice165 +01:== Attached person user-167@plc.org to slice onebgf_slice165 +01:== created slice 167 - max nodes=350 +01:== Attached person user-166@plc.org to slice onebgg_slice166 +01:== Attached person user-167@plc.org to slice onebgg_slice166 +01:== Attached person user-168@plc.org to slice onebgg_slice166 +01:== created slice 168 - max nodes=350 +01:== Attached person user-167@plc.org to slice onebgh_slice167 +01:== Attached person user-168@plc.org to slice onebgh_slice167 +01:== Attached person user-169@plc.org to slice onebgh_slice167 +01:== created slice 169 - max nodes=350 +01:== Attached person user-168@plc.org to slice onebgi_slice168 +01:== Attached person user-169@plc.org to slice onebgi_slice168 +01:== Attached person user-170@plc.org to slice onebgi_slice168 +01:== created slice 170 - max nodes=350 +01:== Attached person user-169@plc.org to slice onebgj_slice169 +01:== Attached person user-170@plc.org to slice onebgj_slice169 +01:== Attached person user-171@plc.org to slice onebgj_slice169 +01:== created slice 171 - max nodes=350 +01:== Attached person user-170@plc.org to slice onebha_slice170 +01:== Attached person user-171@plc.org to slice onebha_slice170 +01:== Attached person user-172@plc.org to slice onebha_slice170 +01:== created slice 172 - max nodes=350 +01:== Attached person user-171@plc.org to slice onebhb_slice171 +01:== Attached person user-172@plc.org to slice onebhb_slice171 +01:== Attached person user-173@plc.org to slice onebhb_slice171 +01:== created slice 173 - max nodes=350 +01:== Attached person user-172@plc.org to slice onebhc_slice172 +01:== Attached person user-173@plc.org to slice onebhc_slice172 +01:== Attached person user-174@plc.org to slice onebhc_slice172 +01:== created slice 174 - max nodes=350 +01:== Attached person user-173@plc.org to slice onebhd_slice173 +01:== Attached person user-174@plc.org to slice onebhd_slice173 +01:== Attached person user-175@plc.org to slice onebhd_slice173 +01:== created slice 175 - max nodes=350 +01:== Attached person user-174@plc.org to slice onebhe_slice174 +01:== Attached person user-175@plc.org to slice onebhe_slice174 +01:== Attached person user-176@plc.org to slice onebhe_slice174 +01:== created slice 176 - max nodes=350 +01:== Attached person user-175@plc.org to slice onebhf_slice175 +01:== Attached person user-176@plc.org to slice onebhf_slice175 +01:== Attached person user-177@plc.org to slice onebhf_slice175 +01:== created slice 177 - max nodes=350 +01:== Attached person user-176@plc.org to slice onebhg_slice176 +01:== Attached person user-177@plc.org to slice onebhg_slice176 +01:== Attached person user-178@plc.org to slice onebhg_slice176 +01:== created slice 178 - max nodes=350 +01:== Attached person user-177@plc.org to slice onebhh_slice177 +01:== Attached person user-178@plc.org to slice onebhh_slice177 +01:== Attached person user-179@plc.org to slice onebhh_slice177 +01:== created slice 179 - max nodes=350 +01:== Attached person user-178@plc.org to slice onebhi_slice178 +01:== Attached person user-179@plc.org to slice onebhi_slice178 +01:== Attached person user-180@plc.org to slice onebhi_slice178 +01:== created slice 180 - max nodes=350 +01:== Attached person user-179@plc.org to slice onebhj_slice179 +01:== Attached person user-180@plc.org to slice onebhj_slice179 +01:== Attached person user-181@plc.org to slice onebhj_slice179 +01:== created slice 181 - max nodes=350 +01:== Attached person user-180@plc.org to slice onebia_slice180 +01:== Attached person user-181@plc.org to slice onebia_slice180 +01:== Attached person user-182@plc.org to slice onebia_slice180 +01:== created slice 182 - max nodes=350 +01:== Attached person user-181@plc.org to slice onebib_slice181 +01:== Attached person user-182@plc.org to slice onebib_slice181 +01:== Attached person user-183@plc.org to slice onebib_slice181 +01:== created slice 183 - max nodes=350 +01:== Attached person user-182@plc.org to slice onebic_slice182 +01:== Attached person user-183@plc.org to slice onebic_slice182 +01:== Attached person user-184@plc.org to slice onebic_slice182 +01:== created slice 184 - max nodes=350 +01:== Attached person user-183@plc.org to slice onebid_slice183 +01:== Attached person user-184@plc.org to slice onebid_slice183 +01:== Attached person user-185@plc.org to slice onebid_slice183 +01:== created slice 185 - max nodes=350 +01:== Attached person user-184@plc.org to slice onebie_slice184 +01:== Attached person user-185@plc.org to slice onebie_slice184 +01:== Attached person user-186@plc.org to slice onebie_slice184 +01:== created slice 186 - max nodes=350 +01:== Attached person user-185@plc.org to slice onebif_slice185 +01:== Attached person user-186@plc.org to slice onebif_slice185 +01:== Attached person user-187@plc.org to slice onebif_slice185 +01:== created slice 187 - max nodes=350 +01:== Attached person user-186@plc.org to slice onebig_slice186 +01:== Attached person user-187@plc.org to slice onebig_slice186 +01:== Attached person user-188@plc.org to slice onebig_slice186 +01:== created slice 188 - max nodes=350 +01:== Attached person user-187@plc.org to slice onebih_slice187 +01:== Attached person user-188@plc.org to slice onebih_slice187 +01:== Attached person user-189@plc.org to slice onebih_slice187 +01:== created slice 189 - max nodes=350 +01:== Attached person user-188@plc.org to slice onebii_slice188 +01:== Attached person user-189@plc.org to slice onebii_slice188 +01:== Attached person user-190@plc.org to slice onebii_slice188 +01:== created slice 190 - max nodes=350 +01:== Attached person user-189@plc.org to slice onebij_slice189 +01:== Attached person user-190@plc.org to slice onebij_slice189 +01:== Attached person user-191@plc.org to slice onebij_slice189 +01:== created slice 191 - max nodes=350 +01:== Attached person user-190@plc.org to slice onebja_slice190 +01:== Attached person user-191@plc.org to slice onebja_slice190 +01:== Attached person user-192@plc.org to slice onebja_slice190 +01:== created slice 192 - max nodes=350 +01:== Attached person user-191@plc.org to slice onebjb_slice191 +01:== Attached person user-192@plc.org to slice onebjb_slice191 +01:== Attached person user-193@plc.org to slice onebjb_slice191 +01:== created slice 193 - max nodes=350 +01:== Attached person user-192@plc.org to slice onebjc_slice192 +01:== Attached person user-193@plc.org to slice onebjc_slice192 +01:== Attached person user-194@plc.org to slice onebjc_slice192 +01:== created slice 194 - max nodes=350 +01:== Attached person user-193@plc.org to slice onebjd_slice193 +01:== Attached person user-194@plc.org to slice onebjd_slice193 +01:== Attached person user-195@plc.org to slice onebjd_slice193 +01:== created slice 195 - max nodes=350 +01:== Attached person user-194@plc.org to slice onebje_slice194 +01:== Attached person user-195@plc.org to slice onebje_slice194 +01:== Attached person user-196@plc.org to slice onebje_slice194 +01:== created slice 196 - max nodes=350 +01:== Attached person user-195@plc.org to slice onebjf_slice195 +01:== Attached person user-196@plc.org to slice onebjf_slice195 +01:== Attached person user-197@plc.org to slice onebjf_slice195 +01:== created slice 197 - max nodes=350 +01:== Attached person user-196@plc.org to slice onebjg_slice196 +01:== Attached person user-197@plc.org to slice onebjg_slice196 +01:== Attached person user-198@plc.org to slice onebjg_slice196 +01:== created slice 198 - max nodes=350 +01:== Attached person user-197@plc.org to slice onebjh_slice197 +01:== Attached person user-198@plc.org to slice onebjh_slice197 +01:== Attached person user-199@plc.org to slice onebjh_slice197 +01:== created slice 199 - max nodes=350 +01:== Attached person user-198@plc.org to slice onebji_slice198 +01:== Attached person user-199@plc.org to slice onebji_slice198 +01:== Attached person user-200@plc.org to slice onebji_slice198 +01:== created slice 200 - max nodes=350 +01:== Attached person user-199@plc.org to slice onebjj_slice199 +01:== Attached person user-200@plc.org to slice onebjj_slice199 +01:== Attached person user-201@plc.org to slice onebjj_slice199 +01:== created slice 201 - max nodes=350 +01:== Attached person user-200@plc.org to slice onecaa_slice200 +01:== Attached person user-201@plc.org to slice onecaa_slice200 +01:== Attached person user-202@plc.org to slice onecaa_slice200 +01:== created slice 202 - max nodes=350 +01:== Attached person user-201@plc.org to slice oneb_slice201 +01:== Attached person user-202@plc.org to slice oneb_slice201 +01:== Attached person user-203@plc.org to slice oneb_slice201 +01:== created slice 203 - max nodes=350 +01:== Attached person user-202@plc.org to slice onec_slice202 +01:== Attached person user-203@plc.org to slice onec_slice202 +01:== Attached person user-204@plc.org to slice onec_slice202 +01:== created slice 204 - max nodes=350 +01:== Attached person user-203@plc.org to slice oned_slice203 +01:== Attached person user-204@plc.org to slice oned_slice203 +01:== Attached person user-205@plc.org to slice oned_slice203 +01:== created slice 205 - max nodes=350 +01:== Attached person user-204@plc.org to slice onee_slice204 +01:== Attached person user-205@plc.org to slice onee_slice204 +01:== Attached person user-206@plc.org to slice onee_slice204 +01:== created slice 206 - max nodes=350 +01:== Attached person user-205@plc.org to slice onef_slice205 +01:== Attached person user-206@plc.org to slice onef_slice205 +01:== Attached person user-207@plc.org to slice onef_slice205 +01:== created slice 207 - max nodes=350 +01:== Attached person user-206@plc.org to slice oneg_slice206 +01:== Attached person user-207@plc.org to slice oneg_slice206 +01:== Attached person user-208@plc.org to slice oneg_slice206 +01:== created slice 208 - max nodes=350 +01:== Attached person user-207@plc.org to slice oneh_slice207 +01:== Attached person user-208@plc.org to slice oneh_slice207 +01:== Attached person user-209@plc.org to slice oneh_slice207 +01:== created slice 209 - max nodes=350 +01:== Attached person user-208@plc.org to slice onei_slice208 +01:== Attached person user-209@plc.org to slice onei_slice208 +01:== Attached person user-210@plc.org to slice onei_slice208 +01:== created slice 210 - max nodes=350 +01:== Attached person user-209@plc.org to slice onej_slice209 +01:== Attached person user-210@plc.org to slice onej_slice209 +01:== Attached person user-211@plc.org to slice onej_slice209 +01:== created slice 211 - max nodes=350 +01:== Attached person user-210@plc.org to slice oneba_slice210 +01:== Attached person user-211@plc.org to slice oneba_slice210 +01:== Attached person user-212@plc.org to slice oneba_slice210 +01:== created slice 212 - max nodes=350 +01:== Attached person user-211@plc.org to slice onebb_slice211 +01:== Attached person user-212@plc.org to slice onebb_slice211 +01:== Attached person user-213@plc.org to slice onebb_slice211 +01:== created slice 213 - max nodes=350 +01:== Attached person user-212@plc.org to slice onebc_slice212 +01:== Attached person user-213@plc.org to slice onebc_slice212 +01:== Attached person user-214@plc.org to slice onebc_slice212 +01:== created slice 214 - max nodes=350 +01:== Attached person user-213@plc.org to slice onebd_slice213 +01:== Attached person user-214@plc.org to slice onebd_slice213 +01:== Attached person user-215@plc.org to slice onebd_slice213 +01:== created slice 215 - max nodes=350 +01:== Attached person user-214@plc.org to slice onebe_slice214 +01:== Attached person user-215@plc.org to slice onebe_slice214 +01:== Attached person user-216@plc.org to slice onebe_slice214 +01:== created slice 216 - max nodes=350 +01:== Attached person user-215@plc.org to slice onebf_slice215 +01:== Attached person user-216@plc.org to slice onebf_slice215 +01:== Attached person user-217@plc.org to slice onebf_slice215 +01:== created slice 217 - max nodes=350 +01:== Attached person user-216@plc.org to slice onebg_slice216 +01:== Attached person user-217@plc.org to slice onebg_slice216 +01:== Attached person user-218@plc.org to slice onebg_slice216 +01:== created slice 218 - max nodes=350 +01:== Attached person user-217@plc.org to slice onebh_slice217 +01:== Attached person user-218@plc.org to slice onebh_slice217 +01:== Attached person user-219@plc.org to slice onebh_slice217 +01:== created slice 219 - max nodes=350 +01:== Attached person user-218@plc.org to slice onebi_slice218 +01:== Attached person user-219@plc.org to slice onebi_slice218 +01:== Attached person user-220@plc.org to slice onebi_slice218 +01:== created slice 220 - max nodes=350 +01:== Attached person user-219@plc.org to slice onebj_slice219 +01:== Attached person user-220@plc.org to slice onebj_slice219 +01:== Attached person user-221@plc.org to slice onebj_slice219 +01:== created slice 221 - max nodes=350 +01:== Attached person user-220@plc.org to slice oneca_slice220 +01:== Attached person user-221@plc.org to slice oneca_slice220 +01:== Attached person user-222@plc.org to slice oneca_slice220 +01:== created slice 222 - max nodes=350 +01:== Attached person user-221@plc.org to slice onecb_slice221 +01:== Attached person user-222@plc.org to slice onecb_slice221 +01:== Attached person user-223@plc.org to slice onecb_slice221 +01:== created slice 223 - max nodes=350 +01:== Attached person user-222@plc.org to slice onecc_slice222 +01:== Attached person user-223@plc.org to slice onecc_slice222 +01:== Attached person user-224@plc.org to slice onecc_slice222 +01:== created slice 224 - max nodes=350 +01:== Attached person user-223@plc.org to slice onecd_slice223 +01:== Attached person user-224@plc.org to slice onecd_slice223 +01:== Attached person user-225@plc.org to slice onecd_slice223 +01:== created slice 225 - max nodes=350 +01:== Attached person user-224@plc.org to slice onece_slice224 +01:== Attached person user-225@plc.org to slice onece_slice224 +01:== Attached person user-226@plc.org to slice onece_slice224 +01:== created slice 226 - max nodes=350 +01:== Attached person user-225@plc.org to slice onecf_slice225 +01:== Attached person user-226@plc.org to slice onecf_slice225 +01:== Attached person user-227@plc.org to slice onecf_slice225 +01:== created slice 227 - max nodes=350 +01:== Attached person user-226@plc.org to slice onecg_slice226 +01:== Attached person user-227@plc.org to slice onecg_slice226 +01:== Attached person user-228@plc.org to slice onecg_slice226 +01:== created slice 228 - max nodes=350 +01:== Attached person user-227@plc.org to slice onech_slice227 +01:== Attached person user-228@plc.org to slice onech_slice227 +01:== Attached person user-229@plc.org to slice onech_slice227 +01:== created slice 229 - max nodes=350 +01:== Attached person user-228@plc.org to slice oneci_slice228 +01:== Attached person user-229@plc.org to slice oneci_slice228 +01:== Attached person user-230@plc.org to slice oneci_slice228 +01:== created slice 230 - max nodes=350 +01:== Attached person user-229@plc.org to slice onecj_slice229 +01:== Attached person user-230@plc.org to slice onecj_slice229 +01:== Attached person user-231@plc.org to slice onecj_slice229 +01:== created slice 231 - max nodes=350 +01:== Attached person user-230@plc.org to slice oneda_slice230 +01:== Attached person user-231@plc.org to slice oneda_slice230 +01:== Attached person user-232@plc.org to slice oneda_slice230 +01:== created slice 232 - max nodes=350 +01:== Attached person user-231@plc.org to slice onedb_slice231 +01:== Attached person user-232@plc.org to slice onedb_slice231 +01:== Attached person user-233@plc.org to slice onedb_slice231 +01:== created slice 233 - max nodes=350 +01:== Attached person user-232@plc.org to slice onedc_slice232 +01:== Attached person user-233@plc.org to slice onedc_slice232 +01:== Attached person user-234@plc.org to slice onedc_slice232 +01:== created slice 234 - max nodes=350 +01:== Attached person user-233@plc.org to slice onedd_slice233 +01:== Attached person user-234@plc.org to slice onedd_slice233 +01:== Attached person user-235@plc.org to slice onedd_slice233 +01:== created slice 235 - max nodes=350 +01:== Attached person user-234@plc.org to slice onede_slice234 +01:== Attached person user-235@plc.org to slice onede_slice234 +01:== Attached person user-236@plc.org to slice onede_slice234 +01:== created slice 236 - max nodes=350 +01:== Attached person user-235@plc.org to slice onedf_slice235 +01:== Attached person user-236@plc.org to slice onedf_slice235 +01:== Attached person user-237@plc.org to slice onedf_slice235 +01:== created slice 237 - max nodes=350 +01:== Attached person user-236@plc.org to slice onedg_slice236 +01:== Attached person user-237@plc.org to slice onedg_slice236 +01:== Attached person user-238@plc.org to slice onedg_slice236 +01:== created slice 238 - max nodes=350 +01:== Attached person user-237@plc.org to slice onedh_slice237 +01:== Attached person user-238@plc.org to slice onedh_slice237 +01:== Attached person user-239@plc.org to slice onedh_slice237 +01:== created slice 239 - max nodes=350 +01:== Attached person user-238@plc.org to slice onedi_slice238 +01:== Attached person user-239@plc.org to slice onedi_slice238 +01:== Attached person user-240@plc.org to slice onedi_slice238 +01:== created slice 240 - max nodes=350 +01:== Attached person user-239@plc.org to slice onedj_slice239 +01:== Attached person user-240@plc.org to slice onedj_slice239 +01:== Attached person user-241@plc.org to slice onedj_slice239 +01:== created slice 241 - max nodes=350 +01:== Attached person user-240@plc.org to slice oneea_slice240 +01:== Attached person user-241@plc.org to slice oneea_slice240 +01:== Attached person user-242@plc.org to slice oneea_slice240 +01:== created slice 242 - max nodes=350 +01:== Attached person user-241@plc.org to slice oneeb_slice241 +01:== Attached person user-242@plc.org to slice oneeb_slice241 +01:== Attached person user-243@plc.org to slice oneeb_slice241 +01:== created slice 243 - max nodes=350 +01:== Attached person user-242@plc.org to slice oneec_slice242 +01:== Attached person user-243@plc.org to slice oneec_slice242 +01:== Attached person user-244@plc.org to slice oneec_slice242 +01:== created slice 244 - max nodes=350 +01:== Attached person user-243@plc.org to slice oneed_slice243 +01:== Attached person user-244@plc.org to slice oneed_slice243 +01:== Attached person user-245@plc.org to slice oneed_slice243 +01:== created slice 245 - max nodes=350 +01:== Attached person user-244@plc.org to slice oneee_slice244 +01:== Attached person user-245@plc.org to slice oneee_slice244 +01:== Attached person user-246@plc.org to slice oneee_slice244 +01:== created slice 246 - max nodes=350 +01:== Attached person user-245@plc.org to slice oneef_slice245 +01:== Attached person user-246@plc.org to slice oneef_slice245 +01:== Attached person user-247@plc.org to slice oneef_slice245 +01:== created slice 247 - max nodes=350 +01:== Attached person user-246@plc.org to slice oneeg_slice246 +01:== Attached person user-247@plc.org to slice oneeg_slice246 +01:== Attached person user-248@plc.org to slice oneeg_slice246 +01:== created slice 248 - max nodes=350 +01:== Attached person user-247@plc.org to slice oneeh_slice247 +01:== Attached person user-248@plc.org to slice oneeh_slice247 +01:== Attached person user-249@plc.org to slice oneeh_slice247 +01:== created slice 249 - max nodes=350 +01:== Attached person user-248@plc.org to slice oneei_slice248 +01:== Attached person user-249@plc.org to slice oneei_slice248 +01:== Attached person user-250@plc.org to slice oneei_slice248 +01:== created slice 250 - max nodes=350 +01:== Attached person user-249@plc.org to slice oneej_slice249 +01:== Attached person user-250@plc.org to slice oneej_slice249 +01:== Attached person user-251@plc.org to slice oneej_slice249 +01:== created slice 251 - max nodes=350 +01:== Attached person user-250@plc.org to slice onefa_slice250 +01:== Attached person user-251@plc.org to slice onefa_slice250 +01:== Attached person user-252@plc.org to slice onefa_slice250 +01:== created slice 252 - max nodes=350 +01:== Attached person user-251@plc.org to slice onefb_slice251 +01:== Attached person user-252@plc.org to slice onefb_slice251 +01:== Attached person user-253@plc.org to slice onefb_slice251 +01:== created slice 253 - max nodes=350 +01:== Attached person user-252@plc.org to slice onefc_slice252 +01:== Attached person user-253@plc.org to slice onefc_slice252 +01:== Attached person user-254@plc.org to slice onefc_slice252 +01:== created slice 254 - max nodes=350 +01:== Attached person user-253@plc.org to slice onefd_slice253 +01:== Attached person user-254@plc.org to slice onefd_slice253 +01:== Attached person user-255@plc.org to slice onefd_slice253 +01:== created slice 255 - max nodes=350 +01:== Attached person user-254@plc.org to slice onefe_slice254 +01:== Attached person user-255@plc.org to slice onefe_slice254 +01:== Attached person user-256@plc.org to slice onefe_slice254 +01:== created slice 256 - max nodes=350 +01:== Attached person user-255@plc.org to slice oneff_slice255 +01:== Attached person user-256@plc.org to slice oneff_slice255 +01:== Attached person user-257@plc.org to slice oneff_slice255 +01:== created slice 257 - max nodes=350 +01:== Attached person user-256@plc.org to slice onefg_slice256 +01:== Attached person user-257@plc.org to slice onefg_slice256 +01:== Attached person user-258@plc.org to slice onefg_slice256 +01:== created slice 258 - max nodes=350 +01:== Attached person user-257@plc.org to slice onefh_slice257 +01:== Attached person user-258@plc.org to slice onefh_slice257 +01:== Attached person user-259@plc.org to slice onefh_slice257 +01:== created slice 259 - max nodes=350 +01:== Attached person user-258@plc.org to slice onefi_slice258 +01:== Attached person user-259@plc.org to slice onefi_slice258 +01:== Attached person user-260@plc.org to slice onefi_slice258 +01:== created slice 260 - max nodes=350 +01:== Attached person user-259@plc.org to slice onefj_slice259 +01:== Attached person user-260@plc.org to slice onefj_slice259 +01:== Attached person user-261@plc.org to slice onefj_slice259 +01:== created slice 261 - max nodes=350 +01:== Attached person user-260@plc.org to slice onega_slice260 +01:== Attached person user-261@plc.org to slice onega_slice260 +01:== Attached person user-262@plc.org to slice onega_slice260 +01:== created slice 262 - max nodes=350 +01:== Attached person user-261@plc.org to slice onegb_slice261 +01:== Attached person user-262@plc.org to slice onegb_slice261 +01:== Attached person user-263@plc.org to slice onegb_slice261 +01:== created slice 263 - max nodes=350 +01:== Attached person user-262@plc.org to slice onegc_slice262 +01:== Attached person user-263@plc.org to slice onegc_slice262 +01:== Attached person user-264@plc.org to slice onegc_slice262 +01:== created slice 264 - max nodes=350 +01:== Attached person user-263@plc.org to slice onegd_slice263 +01:== Attached person user-264@plc.org to slice onegd_slice263 +01:== Attached person user-265@plc.org to slice onegd_slice263 +01:== created slice 265 - max nodes=350 +01:== Attached person user-264@plc.org to slice onege_slice264 +01:== Attached person user-265@plc.org to slice onege_slice264 +01:== Attached person user-266@plc.org to slice onege_slice264 +01:== created slice 266 - max nodes=350 +01:== Attached person user-265@plc.org to slice onegf_slice265 +01:== Attached person user-266@plc.org to slice onegf_slice265 +01:== Attached person user-267@plc.org to slice onegf_slice265 +01:== created slice 267 - max nodes=350 +01:== Attached person user-266@plc.org to slice onegg_slice266 +01:== Attached person user-267@plc.org to slice onegg_slice266 +01:== Attached person user-268@plc.org to slice onegg_slice266 +01:== created slice 268 - max nodes=350 +01:== Attached person user-267@plc.org to slice onegh_slice267 +01:== Attached person user-268@plc.org to slice onegh_slice267 +01:== Attached person user-269@plc.org to slice onegh_slice267 +01:== created slice 269 - max nodes=350 +01:== Attached person user-268@plc.org to slice onegi_slice268 +01:== Attached person user-269@plc.org to slice onegi_slice268 +01:== Attached person user-270@plc.org to slice onegi_slice268 +01:== created slice 270 - max nodes=350 +01:== Attached person user-269@plc.org to slice onegj_slice269 +01:== Attached person user-270@plc.org to slice onegj_slice269 +01:== Attached person user-271@plc.org to slice onegj_slice269 +01:== created slice 271 - max nodes=350 +01:== Attached person user-270@plc.org to slice oneha_slice270 +01:== Attached person user-271@plc.org to slice oneha_slice270 +01:== Attached person user-272@plc.org to slice oneha_slice270 +01:== created slice 272 - max nodes=350 +01:== Attached person user-271@plc.org to slice onehb_slice271 +01:== Attached person user-272@plc.org to slice onehb_slice271 +01:== Attached person user-273@plc.org to slice onehb_slice271 +01:== created slice 273 - max nodes=350 +01:== Attached person user-272@plc.org to slice onehc_slice272 +01:== Attached person user-273@plc.org to slice onehc_slice272 +01:== Attached person user-274@plc.org to slice onehc_slice272 +01:== created slice 274 - max nodes=350 +01:== Attached person user-273@plc.org to slice onehd_slice273 +01:== Attached person user-274@plc.org to slice onehd_slice273 +01:== Attached person user-275@plc.org to slice onehd_slice273 +01:== created slice 275 - max nodes=350 +01:== Attached person user-274@plc.org to slice onehe_slice274 +01:== Attached person user-275@plc.org to slice onehe_slice274 +01:== Attached person user-276@plc.org to slice onehe_slice274 +01:== created slice 276 - max nodes=350 +01:== Attached person user-275@plc.org to slice onehf_slice275 +01:== Attached person user-276@plc.org to slice onehf_slice275 +01:== Attached person user-277@plc.org to slice onehf_slice275 +01:== created slice 277 - max nodes=350 +01:== Attached person user-276@plc.org to slice onehg_slice276 +01:== Attached person user-277@plc.org to slice onehg_slice276 +01:== Attached person user-278@plc.org to slice onehg_slice276 +01:== created slice 278 - max nodes=350 +01:== Attached person user-277@plc.org to slice onehh_slice277 +01:== Attached person user-278@plc.org to slice onehh_slice277 +01:== Attached person user-279@plc.org to slice onehh_slice277 +01:== created slice 279 - max nodes=350 +01:== Attached person user-278@plc.org to slice onehi_slice278 +01:== Attached person user-279@plc.org to slice onehi_slice278 +01:== Attached person user-280@plc.org to slice onehi_slice278 +01:== created slice 280 - max nodes=350 +01:== Attached person user-279@plc.org to slice onehj_slice279 +01:== Attached person user-280@plc.org to slice onehj_slice279 +01:== Attached person user-281@plc.org to slice onehj_slice279 +01:== created slice 281 - max nodes=350 +01:== Attached person user-280@plc.org to slice oneia_slice280 +01:== Attached person user-281@plc.org to slice oneia_slice280 +01:== Attached person user-282@plc.org to slice oneia_slice280 +01:== created slice 282 - max nodes=350 +01:== Attached person user-281@plc.org to slice oneib_slice281 +01:== Attached person user-282@plc.org to slice oneib_slice281 +01:== Attached person user-283@plc.org to slice oneib_slice281 +01:== created slice 283 - max nodes=350 +01:== Attached person user-282@plc.org to slice oneic_slice282 +01:== Attached person user-283@plc.org to slice oneic_slice282 +01:== Attached person user-284@plc.org to slice oneic_slice282 +01:== created slice 284 - max nodes=350 +01:== Attached person user-283@plc.org to slice oneid_slice283 +01:== Attached person user-284@plc.org to slice oneid_slice283 +01:== Attached person user-285@plc.org to slice oneid_slice283 +01:== created slice 285 - max nodes=350 +01:== Attached person user-284@plc.org to slice oneie_slice284 +01:== Attached person user-285@plc.org to slice oneie_slice284 +01:== Attached person user-286@plc.org to slice oneie_slice284 +01:== created slice 286 - max nodes=350 +01:== Attached person user-285@plc.org to slice oneif_slice285 +01:== Attached person user-286@plc.org to slice oneif_slice285 +01:== Attached person user-287@plc.org to slice oneif_slice285 +01:== created slice 287 - max nodes=350 +01:== Attached person user-286@plc.org to slice oneig_slice286 +01:== Attached person user-287@plc.org to slice oneig_slice286 +01:== Attached person user-288@plc.org to slice oneig_slice286 +01:== created slice 288 - max nodes=350 +01:== Attached person user-287@plc.org to slice oneih_slice287 +01:== Attached person user-288@plc.org to slice oneih_slice287 +01:== Attached person user-289@plc.org to slice oneih_slice287 +01:== created slice 289 - max nodes=350 +01:== Attached person user-288@plc.org to slice oneii_slice288 +01:== Attached person user-289@plc.org to slice oneii_slice288 +01:== Attached person user-290@plc.org to slice oneii_slice288 +01:== created slice 290 - max nodes=350 +01:== Attached person user-289@plc.org to slice oneij_slice289 +01:== Attached person user-290@plc.org to slice oneij_slice289 +01:== Attached person user-291@plc.org to slice oneij_slice289 +01:== created slice 291 - max nodes=350 +01:== Attached person user-290@plc.org to slice oneja_slice290 +01:== Attached person user-291@plc.org to slice oneja_slice290 +01:== Attached person user-292@plc.org to slice oneja_slice290 +01:== created slice 292 - max nodes=350 +01:== Attached person user-291@plc.org to slice onejb_slice291 +01:== Attached person user-292@plc.org to slice onejb_slice291 +01:== Attached person user-293@plc.org to slice onejb_slice291 +01:== created slice 293 - max nodes=350 +01:== Attached person user-292@plc.org to slice onejc_slice292 +01:== Attached person user-293@plc.org to slice onejc_slice292 +01:== Attached person user-294@plc.org to slice onejc_slice292 +01:== created slice 294 - max nodes=350 +01:== Attached person user-293@plc.org to slice onejd_slice293 +01:== Attached person user-294@plc.org to slice onejd_slice293 +01:== Attached person user-295@plc.org to slice onejd_slice293 +01:== created slice 295 - max nodes=350 +01:== Attached person user-294@plc.org to slice oneje_slice294 +01:== Attached person user-295@plc.org to slice oneje_slice294 +01:== Attached person user-296@plc.org to slice oneje_slice294 +01:== created slice 296 - max nodes=350 +01:== Attached person user-295@plc.org to slice onejf_slice295 +01:== Attached person user-296@plc.org to slice onejf_slice295 +01:== Attached person user-297@plc.org to slice onejf_slice295 +01:== created slice 297 - max nodes=350 +01:== Attached person user-296@plc.org to slice onejg_slice296 +01:== Attached person user-297@plc.org to slice onejg_slice296 +01:== Attached person user-298@plc.org to slice onejg_slice296 +01:== created slice 298 - max nodes=350 +01:== Attached person user-297@plc.org to slice onejh_slice297 +01:== Attached person user-298@plc.org to slice onejh_slice297 +01:== Attached person user-299@plc.org to slice onejh_slice297 +01:== created slice 299 - max nodes=350 +01:== Attached person user-298@plc.org to slice oneji_slice298 +01:== Attached person user-299@plc.org to slice oneji_slice298 +01:== Attached person user-300@plc.org to slice oneji_slice298 +01:== created slice 300 - max nodes=350 +01:== Attached person user-299@plc.org to slice onejj_slice299 +01:== Attached person user-300@plc.org to slice onejj_slice299 +01:== Attached person user-301@plc.org to slice onejj_slice299 +01:== created slice 301 - max nodes=350 +01:== Attached person user-300@plc.org to slice onebaa_slice300 +01:== Attached person user-301@plc.org to slice onebaa_slice300 +01:== Attached person user-302@plc.org to slice onebaa_slice300 +01:== created slice 302 - max nodes=350 +01:== Attached person user-301@plc.org to slice onebab_slice301 +01:== Attached person user-302@plc.org to slice onebab_slice301 +01:== Attached person user-303@plc.org to slice onebab_slice301 +01:== created slice 303 - max nodes=350 +01:== Attached person user-302@plc.org to slice onebac_slice302 +01:== Attached person user-303@plc.org to slice onebac_slice302 +01:== Attached person user-304@plc.org to slice onebac_slice302 +01:== created slice 304 - max nodes=350 +01:== Attached person user-303@plc.org to slice onebad_slice303 +01:== Attached person user-304@plc.org to slice onebad_slice303 +01:== Attached person user-305@plc.org to slice onebad_slice303 +01:== created slice 305 - max nodes=350 +01:== Attached person user-304@plc.org to slice onebae_slice304 +01:== Attached person user-305@plc.org to slice onebae_slice304 +01:== Attached person user-306@plc.org to slice onebae_slice304 +01:== created slice 306 - max nodes=350 +01:== Attached person user-305@plc.org to slice onebaf_slice305 +01:== Attached person user-306@plc.org to slice onebaf_slice305 +01:== Attached person user-307@plc.org to slice onebaf_slice305 +01:== created slice 307 - max nodes=350 +01:== Attached person user-306@plc.org to slice onebag_slice306 +01:== Attached person user-307@plc.org to slice onebag_slice306 +01:== Attached person user-308@plc.org to slice onebag_slice306 +01:== created slice 308 - max nodes=350 +01:== Attached person user-307@plc.org to slice onebah_slice307 +01:== Attached person user-308@plc.org to slice onebah_slice307 +01:== Attached person user-309@plc.org to slice onebah_slice307 +01:== created slice 309 - max nodes=350 +01:== Attached person user-308@plc.org to slice onebai_slice308 +01:== Attached person user-309@plc.org to slice onebai_slice308 +01:== Attached person user-310@plc.org to slice onebai_slice308 +01:== created slice 310 - max nodes=350 +01:== Attached person user-309@plc.org to slice onebaj_slice309 +01:== Attached person user-310@plc.org to slice onebaj_slice309 +01:== Attached person user-311@plc.org to slice onebaj_slice309 +01:== created slice 311 - max nodes=350 +01:== Attached person user-310@plc.org to slice onebba_slice310 +01:== Attached person user-311@plc.org to slice onebba_slice310 +01:== Attached person user-312@plc.org to slice onebba_slice310 +01:== created slice 312 - max nodes=350 +01:== Attached person user-311@plc.org to slice onebbb_slice311 +01:== Attached person user-312@plc.org to slice onebbb_slice311 +01:== Attached person user-313@plc.org to slice onebbb_slice311 +01:== created slice 313 - max nodes=350 +01:== Attached person user-312@plc.org to slice onebbc_slice312 +01:== Attached person user-313@plc.org to slice onebbc_slice312 +01:== Attached person user-314@plc.org to slice onebbc_slice312 +01:== created slice 314 - max nodes=350 +01:== Attached person user-313@plc.org to slice onebbd_slice313 +01:== Attached person user-314@plc.org to slice onebbd_slice313 +01:== Attached person user-315@plc.org to slice onebbd_slice313 +01:== created slice 315 - max nodes=350 +01:== Attached person user-314@plc.org to slice onebbe_slice314 +01:== Attached person user-315@plc.org to slice onebbe_slice314 +01:== Attached person user-316@plc.org to slice onebbe_slice314 +01:== created slice 316 - max nodes=350 +01:== Attached person user-315@plc.org to slice onebbf_slice315 +01:== Attached person user-316@plc.org to slice onebbf_slice315 +01:== Attached person user-317@plc.org to slice onebbf_slice315 +01:== created slice 317 - max nodes=350 +01:== Attached person user-316@plc.org to slice onebbg_slice316 +01:== Attached person user-317@plc.org to slice onebbg_slice316 +01:== Attached person user-318@plc.org to slice onebbg_slice316 +01:== created slice 318 - max nodes=350 +01:== Attached person user-317@plc.org to slice onebbh_slice317 +01:== Attached person user-318@plc.org to slice onebbh_slice317 +01:== Attached person user-319@plc.org to slice onebbh_slice317 +01:== created slice 319 - max nodes=350 +01:== Attached person user-318@plc.org to slice onebbi_slice318 +01:== Attached person user-319@plc.org to slice onebbi_slice318 +01:== Attached person user-320@plc.org to slice onebbi_slice318 +01:== created slice 320 - max nodes=350 +01:== Attached person user-319@plc.org to slice onebbj_slice319 +01:== Attached person user-320@plc.org to slice onebbj_slice319 +01:== Attached person user-321@plc.org to slice onebbj_slice319 +01:== created slice 321 - max nodes=350 +01:== Attached person user-320@plc.org to slice onebca_slice320 +01:== Attached person user-321@plc.org to slice onebca_slice320 +01:== Attached person user-322@plc.org to slice onebca_slice320 +01:== created slice 322 - max nodes=350 +01:== Attached person user-321@plc.org to slice onebcb_slice321 +01:== Attached person user-322@plc.org to slice onebcb_slice321 +01:== Attached person user-323@plc.org to slice onebcb_slice321 +01:== created slice 323 - max nodes=350 +01:== Attached person user-322@plc.org to slice onebcc_slice322 +01:== Attached person user-323@plc.org to slice onebcc_slice322 +01:== Attached person user-324@plc.org to slice onebcc_slice322 +01:== created slice 324 - max nodes=350 +01:== Attached person user-323@plc.org to slice onebcd_slice323 +01:== Attached person user-324@plc.org to slice onebcd_slice323 +01:== Attached person user-325@plc.org to slice onebcd_slice323 +01:== created slice 325 - max nodes=350 +01:== Attached person user-324@plc.org to slice onebce_slice324 +01:== Attached person user-325@plc.org to slice onebce_slice324 +01:== Attached person user-326@plc.org to slice onebce_slice324 +01:== created slice 326 - max nodes=350 +01:== Attached person user-325@plc.org to slice onebcf_slice325 +01:== Attached person user-326@plc.org to slice onebcf_slice325 +01:== Attached person user-327@plc.org to slice onebcf_slice325 +01:== created slice 327 - max nodes=350 +01:== Attached person user-326@plc.org to slice onebcg_slice326 +01:== Attached person user-327@plc.org to slice onebcg_slice326 +01:== Attached person user-328@plc.org to slice onebcg_slice326 +01:== created slice 328 - max nodes=350 +01:== Attached person user-327@plc.org to slice onebch_slice327 +01:== Attached person user-328@plc.org to slice onebch_slice327 +01:== Attached person user-329@plc.org to slice onebch_slice327 +01:== created slice 329 - max nodes=350 +01:== Attached person user-328@plc.org to slice onebci_slice328 +01:== Attached person user-329@plc.org to slice onebci_slice328 +01:== Attached person user-330@plc.org to slice onebci_slice328 +01:== created slice 330 - max nodes=350 +01:== Attached person user-329@plc.org to slice onebcj_slice329 +01:== Attached person user-330@plc.org to slice onebcj_slice329 +01:== Attached person user-331@plc.org to slice onebcj_slice329 +01:== created slice 331 - max nodes=350 +01:== Attached person user-330@plc.org to slice onebda_slice330 +01:== Attached person user-331@plc.org to slice onebda_slice330 +01:== Attached person user-332@plc.org to slice onebda_slice330 +01:== created slice 332 - max nodes=350 +01:== Attached person user-331@plc.org to slice onebdb_slice331 +01:== Attached person user-332@plc.org to slice onebdb_slice331 +01:== Attached person user-333@plc.org to slice onebdb_slice331 +01:== created slice 333 - max nodes=350 +01:== Attached person user-332@plc.org to slice onebdc_slice332 +01:== Attached person user-333@plc.org to slice onebdc_slice332 +01:== Attached person user-334@plc.org to slice onebdc_slice332 +01:== created slice 334 - max nodes=350 +01:== Attached person user-333@plc.org to slice onebdd_slice333 +01:== Attached person user-334@plc.org to slice onebdd_slice333 +01:== Attached person user-335@plc.org to slice onebdd_slice333 +01:== created slice 335 - max nodes=350 +01:== Attached person user-334@plc.org to slice onebde_slice334 +01:== Attached person user-335@plc.org to slice onebde_slice334 +01:== Attached person user-336@plc.org to slice onebde_slice334 +01:== created slice 336 - max nodes=350 +01:== Attached person user-335@plc.org to slice onebdf_slice335 +01:== Attached person user-336@plc.org to slice onebdf_slice335 +01:== Attached person user-337@plc.org to slice onebdf_slice335 +01:== created slice 337 - max nodes=350 +01:== Attached person user-336@plc.org to slice onebdg_slice336 +01:== Attached person user-337@plc.org to slice onebdg_slice336 +01:== Attached person user-338@plc.org to slice onebdg_slice336 +01:== created slice 338 - max nodes=350 +01:== Attached person user-337@plc.org to slice onebdh_slice337 +01:== Attached person user-338@plc.org to slice onebdh_slice337 +01:== Attached person user-339@plc.org to slice onebdh_slice337 +01:== created slice 339 - max nodes=350 +01:== Attached person user-338@plc.org to slice onebdi_slice338 +01:== Attached person user-339@plc.org to slice onebdi_slice338 +01:== Attached person user-340@plc.org to slice onebdi_slice338 +01:== created slice 340 - max nodes=350 +01:== Attached person user-339@plc.org to slice onebdj_slice339 +01:== Attached person user-340@plc.org to slice onebdj_slice339 +01:== Attached person user-341@plc.org to slice onebdj_slice339 +01:== created slice 341 - max nodes=350 +01:== Attached person user-340@plc.org to slice onebea_slice340 +01:== Attached person user-341@plc.org to slice onebea_slice340 +01:== Attached person user-342@plc.org to slice onebea_slice340 +01:== created slice 342 - max nodes=350 +01:== Attached person user-341@plc.org to slice onebeb_slice341 +01:== Attached person user-342@plc.org to slice onebeb_slice341 +01:== Attached person user-343@plc.org to slice onebeb_slice341 +01:== created slice 343 - max nodes=350 +01:== Attached person user-342@plc.org to slice onebec_slice342 +01:== Attached person user-343@plc.org to slice onebec_slice342 +01:== Attached person user-344@plc.org to slice onebec_slice342 +01:== created slice 344 - max nodes=350 +01:== Attached person user-343@plc.org to slice onebed_slice343 +01:== Attached person user-344@plc.org to slice onebed_slice343 +01:== Attached person user-345@plc.org to slice onebed_slice343 +01:== created slice 345 - max nodes=350 +01:== Attached person user-344@plc.org to slice onebee_slice344 +01:== Attached person user-345@plc.org to slice onebee_slice344 +01:== Attached person user-346@plc.org to slice onebee_slice344 +01:== created slice 346 - max nodes=350 +01:== Attached person user-345@plc.org to slice onebef_slice345 +01:== Attached person user-346@plc.org to slice onebef_slice345 +01:== Attached person user-347@plc.org to slice onebef_slice345 +01:== created slice 347 - max nodes=350 +01:== Attached person user-346@plc.org to slice onebeg_slice346 +01:== Attached person user-347@plc.org to slice onebeg_slice346 +01:== Attached person user-348@plc.org to slice onebeg_slice346 +01:== created slice 348 - max nodes=350 +01:== Attached person user-347@plc.org to slice onebeh_slice347 +01:== Attached person user-348@plc.org to slice onebeh_slice347 +01:== Attached person user-349@plc.org to slice onebeh_slice347 +01:== created slice 349 - max nodes=350 +01:== Attached person user-348@plc.org to slice onebei_slice348 +01:== Attached person user-349@plc.org to slice onebei_slice348 +01:== Attached person user-350@plc.org to slice onebei_slice348 +01:== created slice 350 - max nodes=350 +01:== Attached person user-349@plc.org to slice onebej_slice349 +01:== Attached person user-350@plc.org to slice onebej_slice349 +01:== Attached person user-351@plc.org to slice onebej_slice349 +01:== created slice 351 - max nodes=350 +01:== Attached person user-350@plc.org to slice onebfa_slice350 +01:== Attached person user-351@plc.org to slice onebfa_slice350 +01:== Attached person user-352@plc.org to slice onebfa_slice350 +01:== created slice 352 - max nodes=350 +01:== Attached person user-351@plc.org to slice onebfb_slice351 +01:== Attached person user-352@plc.org to slice onebfb_slice351 +01:== Attached person user-353@plc.org to slice onebfb_slice351 +01:== created slice 353 - max nodes=350 +01:== Attached person user-352@plc.org to slice onebfc_slice352 +01:== Attached person user-353@plc.org to slice onebfc_slice352 +01:== Attached person user-354@plc.org to slice onebfc_slice352 +01:== created slice 354 - max nodes=350 +01:== Attached person user-353@plc.org to slice onebfd_slice353 +01:== Attached person user-354@plc.org to slice onebfd_slice353 +01:== Attached person user-355@plc.org to slice onebfd_slice353 +01:== created slice 355 - max nodes=350 +01:== Attached person user-354@plc.org to slice onebfe_slice354 +01:== Attached person user-355@plc.org to slice onebfe_slice354 +01:== Attached person user-356@plc.org to slice onebfe_slice354 +01:== created slice 356 - max nodes=350 +01:== Attached person user-355@plc.org to slice onebff_slice355 +01:== Attached person user-356@plc.org to slice onebff_slice355 +01:== Attached person user-357@plc.org to slice onebff_slice355 +01:== created slice 357 - max nodes=350 +01:== Attached person user-356@plc.org to slice onebfg_slice356 +01:== Attached person user-357@plc.org to slice onebfg_slice356 +01:== Attached person user-358@plc.org to slice onebfg_slice356 +01:== created slice 358 - max nodes=350 +01:== Attached person user-357@plc.org to slice onebfh_slice357 +01:== Attached person user-358@plc.org to slice onebfh_slice357 +01:== Attached person user-359@plc.org to slice onebfh_slice357 +01:== created slice 359 - max nodes=350 +01:== Attached person user-358@plc.org to slice onebfi_slice358 +01:== Attached person user-359@plc.org to slice onebfi_slice358 +01:== Attached person user-360@plc.org to slice onebfi_slice358 +01:== created slice 360 - max nodes=350 +01:== Attached person user-359@plc.org to slice onebfj_slice359 +01:== Attached person user-360@plc.org to slice onebfj_slice359 +01:== Attached person user-361@plc.org to slice onebfj_slice359 +01:== created slice 361 - max nodes=350 +01:== Attached person user-360@plc.org to slice onebga_slice360 +01:== Attached person user-361@plc.org to slice onebga_slice360 +01:== Attached person user-362@plc.org to slice onebga_slice360 +01:== created slice 362 - max nodes=350 +01:== Attached person user-361@plc.org to slice onebgb_slice361 +01:== Attached person user-362@plc.org to slice onebgb_slice361 +01:== Attached person user-363@plc.org to slice onebgb_slice361 +01:== created slice 363 - max nodes=350 +01:== Attached person user-362@plc.org to slice onebgc_slice362 +01:== Attached person user-363@plc.org to slice onebgc_slice362 +01:== Attached person user-364@plc.org to slice onebgc_slice362 +01:== created slice 364 - max nodes=350 +01:== Attached person user-363@plc.org to slice onebgd_slice363 +01:== Attached person user-364@plc.org to slice onebgd_slice363 +01:== Attached person user-365@plc.org to slice onebgd_slice363 +01:== created slice 365 - max nodes=350 +01:== Attached person user-364@plc.org to slice onebge_slice364 +01:== Attached person user-365@plc.org to slice onebge_slice364 +01:== Attached person user-366@plc.org to slice onebge_slice364 +01:== created slice 366 - max nodes=350 +01:== Attached person user-365@plc.org to slice onebgf_slice365 +01:== Attached person user-366@plc.org to slice onebgf_slice365 +01:== Attached person user-367@plc.org to slice onebgf_slice365 +01:== created slice 367 - max nodes=350 +01:== Attached person user-366@plc.org to slice onebgg_slice366 +01:== Attached person user-367@plc.org to slice onebgg_slice366 +01:== Attached person user-368@plc.org to slice onebgg_slice366 +01:== created slice 368 - max nodes=350 +01:== Attached person user-367@plc.org to slice onebgh_slice367 +01:== Attached person user-368@plc.org to slice onebgh_slice367 +01:== Attached person user-369@plc.org to slice onebgh_slice367 +01:== created slice 369 - max nodes=350 +01:== Attached person user-368@plc.org to slice onebgi_slice368 +01:== Attached person user-369@plc.org to slice onebgi_slice368 +01:== Attached person user-370@plc.org to slice onebgi_slice368 +01:== created slice 370 - max nodes=350 +01:== Attached person user-369@plc.org to slice onebgj_slice369 +01:== Attached person user-370@plc.org to slice onebgj_slice369 +01:== Attached person user-371@plc.org to slice onebgj_slice369 +01:== created slice 371 - max nodes=350 +01:== Attached person user-370@plc.org to slice onebha_slice370 +01:== Attached person user-371@plc.org to slice onebha_slice370 +01:== Attached person user-372@plc.org to slice onebha_slice370 +01:== created slice 372 - max nodes=350 +01:== Attached person user-371@plc.org to slice onebhb_slice371 +01:== Attached person user-372@plc.org to slice onebhb_slice371 +01:== Attached person user-373@plc.org to slice onebhb_slice371 +01:== created slice 373 - max nodes=350 +01:== Attached person user-372@plc.org to slice onebhc_slice372 +01:== Attached person user-373@plc.org to slice onebhc_slice372 +01:== Attached person user-374@plc.org to slice onebhc_slice372 +01:== created slice 374 - max nodes=350 +01:== Attached person user-373@plc.org to slice onebhd_slice373 +01:== Attached person user-374@plc.org to slice onebhd_slice373 +01:== Attached person user-375@plc.org to slice onebhd_slice373 +01:== created slice 375 - max nodes=350 +01:== Attached person user-374@plc.org to slice onebhe_slice374 +01:== Attached person user-375@plc.org to slice onebhe_slice374 +01:== Attached person user-376@plc.org to slice onebhe_slice374 +01:== created slice 376 - max nodes=350 +01:== Attached person user-375@plc.org to slice onebhf_slice375 +01:== Attached person user-376@plc.org to slice onebhf_slice375 +01:== Attached person user-377@plc.org to slice onebhf_slice375 +01:== created slice 377 - max nodes=350 +01:== Attached person user-376@plc.org to slice onebhg_slice376 +01:== Attached person user-377@plc.org to slice onebhg_slice376 +01:== Attached person user-378@plc.org to slice onebhg_slice376 +01:== created slice 378 - max nodes=350 +01:== Attached person user-377@plc.org to slice onebhh_slice377 +01:== Attached person user-378@plc.org to slice onebhh_slice377 +01:== Attached person user-379@plc.org to slice onebhh_slice377 +01:== created slice 379 - max nodes=350 +01:== Attached person user-378@plc.org to slice onebhi_slice378 +01:== Attached person user-379@plc.org to slice onebhi_slice378 +01:== Attached person user-380@plc.org to slice onebhi_slice378 +01:== created slice 380 - max nodes=350 +01:== Attached person user-379@plc.org to slice onebhj_slice379 +01:== Attached person user-380@plc.org to slice onebhj_slice379 +01:== Attached person user-381@plc.org to slice onebhj_slice379 +01:== created slice 381 - max nodes=350 +01:== Attached person user-380@plc.org to slice onebia_slice380 +01:== Attached person user-381@plc.org to slice onebia_slice380 +01:== Attached person user-382@plc.org to slice onebia_slice380 +01:== created slice 382 - max nodes=350 +01:== Attached person user-381@plc.org to slice onebib_slice381 +01:== Attached person user-382@plc.org to slice onebib_slice381 +01:== Attached person user-383@plc.org to slice onebib_slice381 +01:== created slice 383 - max nodes=350 +01:== Attached person user-382@plc.org to slice onebic_slice382 +01:== Attached person user-383@plc.org to slice onebic_slice382 +01:== Attached person user-384@plc.org to slice onebic_slice382 +01:== created slice 384 - max nodes=350 +01:== Attached person user-383@plc.org to slice onebid_slice383 +01:== Attached person user-384@plc.org to slice onebid_slice383 +01:== Attached person user-385@plc.org to slice onebid_slice383 +01:== created slice 385 - max nodes=350 +01:== Attached person user-384@plc.org to slice onebie_slice384 +01:== Attached person user-385@plc.org to slice onebie_slice384 +01:== Attached person user-386@plc.org to slice onebie_slice384 +01:== created slice 386 - max nodes=350 +01:== Attached person user-385@plc.org to slice onebif_slice385 +01:== Attached person user-386@plc.org to slice onebif_slice385 +01:== Attached person user-387@plc.org to slice onebif_slice385 +01:== created slice 387 - max nodes=350 +01:== Attached person user-386@plc.org to slice onebig_slice386 +01:== Attached person user-387@plc.org to slice onebig_slice386 +01:== Attached person user-388@plc.org to slice onebig_slice386 +01:== created slice 388 - max nodes=350 +01:== Attached person user-387@plc.org to slice onebih_slice387 +01:== Attached person user-388@plc.org to slice onebih_slice387 +01:== Attached person user-389@plc.org to slice onebih_slice387 +01:== created slice 389 - max nodes=350 +01:== Attached person user-388@plc.org to slice onebii_slice388 +01:== Attached person user-389@plc.org to slice onebii_slice388 +01:== Attached person user-390@plc.org to slice onebii_slice388 +01:== created slice 390 - max nodes=350 +01:== Attached person user-389@plc.org to slice onebij_slice389 +01:== Attached person user-390@plc.org to slice onebij_slice389 +01:== Attached person user-391@plc.org to slice onebij_slice389 +01:== created slice 391 - max nodes=350 +01:== Attached person user-390@plc.org to slice onebja_slice390 +01:== Attached person user-391@plc.org to slice onebja_slice390 +01:== Attached person user-392@plc.org to slice onebja_slice390 +01:== created slice 392 - max nodes=350 +01:== Attached person user-391@plc.org to slice onebjb_slice391 +01:== Attached person user-392@plc.org to slice onebjb_slice391 +01:== Attached person user-393@plc.org to slice onebjb_slice391 +01:== created slice 393 - max nodes=350 +01:== Attached person user-392@plc.org to slice onebjc_slice392 +01:== Attached person user-393@plc.org to slice onebjc_slice392 +01:== Attached person user-394@plc.org to slice onebjc_slice392 +01:== created slice 394 - max nodes=350 +01:== Attached person user-393@plc.org to slice onebjd_slice393 +01:== Attached person user-394@plc.org to slice onebjd_slice393 +01:== Attached person user-395@plc.org to slice onebjd_slice393 +01:== created slice 395 - max nodes=350 +01:== Attached person user-394@plc.org to slice onebje_slice394 +01:== Attached person user-395@plc.org to slice onebje_slice394 +01:== Attached person user-396@plc.org to slice onebje_slice394 +01:== created slice 396 - max nodes=350 +01:== Attached person user-395@plc.org to slice onebjf_slice395 +01:== Attached person user-396@plc.org to slice onebjf_slice395 +01:== Attached person user-397@plc.org to slice onebjf_slice395 +01:== created slice 397 - max nodes=350 +01:== Attached person user-396@plc.org to slice onebjg_slice396 +01:== Attached person user-397@plc.org to slice onebjg_slice396 +01:== Attached person user-398@plc.org to slice onebjg_slice396 +01:== created slice 398 - max nodes=350 +01:== Attached person user-397@plc.org to slice onebjh_slice397 +01:== Attached person user-398@plc.org to slice onebjh_slice397 +01:== Attached person user-399@plc.org to slice onebjh_slice397 +01:== created slice 399 - max nodes=350 +01:== Attached person user-398@plc.org to slice onebji_slice398 +01:== Attached person user-399@plc.org to slice onebji_slice398 +01:== Attached person user-400@plc.org to slice onebji_slice398 +01:== created slice 400 - max nodes=350 +01:== Attached person user-399@plc.org to slice onebjj_slice399 +01:== Attached person user-400@plc.org to slice onebjj_slice399 +01:== Attached person user-401@plc.org to slice onebjj_slice399 +01:== created slice 401 - max nodes=350 +01:== Attached person user-400@plc.org to slice onecaa_slice400 +01:== Attached person user-401@plc.org to slice onecaa_slice400 +01:== Attached person user-402@plc.org to slice onecaa_slice400 +01:== created slice 402 - max nodes=350 +01:== Attached person user-401@plc.org to slice oneb_slice401 +01:== Attached person user-402@plc.org to slice oneb_slice401 +01:== Attached person user-403@plc.org to slice oneb_slice401 +01:== created slice 403 - max nodes=350 +01:== Attached person user-402@plc.org to slice onec_slice402 +01:== Attached person user-403@plc.org to slice onec_slice402 +01:== Attached person user-404@plc.org to slice onec_slice402 +01:== created slice 404 - max nodes=350 +01:== Attached person user-403@plc.org to slice oned_slice403 +01:== Attached person user-404@plc.org to slice oned_slice403 +01:== Attached person user-405@plc.org to slice oned_slice403 +01:== created slice 405 - max nodes=350 +01:== Attached person user-404@plc.org to slice onee_slice404 +01:== Attached person user-405@plc.org to slice onee_slice404 +01:== Attached person user-406@plc.org to slice onee_slice404 +01:== created slice 406 - max nodes=350 +01:== Attached person user-405@plc.org to slice onef_slice405 +01:== Attached person user-406@plc.org to slice onef_slice405 +01:== Attached person user-407@plc.org to slice onef_slice405 +01:== created slice 407 - max nodes=350 +01:== Attached person user-406@plc.org to slice oneg_slice406 +01:== Attached person user-407@plc.org to slice oneg_slice406 +01:== Attached person user-408@plc.org to slice oneg_slice406 +01:== created slice 408 - max nodes=350 +01:== Attached person user-407@plc.org to slice oneh_slice407 +01:== Attached person user-408@plc.org to slice oneh_slice407 +01:== Attached person user-409@plc.org to slice oneh_slice407 +01:== created slice 409 - max nodes=350 +01:== Attached person user-408@plc.org to slice onei_slice408 +01:== Attached person user-409@plc.org to slice onei_slice408 +01:== Attached person user-410@plc.org to slice onei_slice408 +01:== created slice 410 - max nodes=350 +01:== Attached person user-409@plc.org to slice onej_slice409 +01:== Attached person user-410@plc.org to slice onej_slice409 +01:== Attached person user-411@plc.org to slice onej_slice409 +01:== created slice 411 - max nodes=350 +01:== Attached person user-410@plc.org to slice oneba_slice410 +01:== Attached person user-411@plc.org to slice oneba_slice410 +01:== Attached person user-412@plc.org to slice oneba_slice410 +01:== created slice 412 - max nodes=350 +01:== Attached person user-411@plc.org to slice onebb_slice411 +01:== Attached person user-412@plc.org to slice onebb_slice411 +01:== Attached person user-413@plc.org to slice onebb_slice411 +01:== created slice 413 - max nodes=350 +01:== Attached person user-412@plc.org to slice onebc_slice412 +01:== Attached person user-413@plc.org to slice onebc_slice412 +01:== Attached person user-414@plc.org to slice onebc_slice412 +01:== created slice 414 - max nodes=350 +01:== Attached person user-413@plc.org to slice onebd_slice413 +01:== Attached person user-414@plc.org to slice onebd_slice413 +01:== Attached person user-415@plc.org to slice onebd_slice413 +01:== created slice 415 - max nodes=350 +01:== Attached person user-414@plc.org to slice onebe_slice414 +01:== Attached person user-415@plc.org to slice onebe_slice414 +01:== Attached person user-416@plc.org to slice onebe_slice414 +01:== created slice 416 - max nodes=350 +01:== Attached person user-415@plc.org to slice onebf_slice415 +01:== Attached person user-416@plc.org to slice onebf_slice415 +01:== Attached person user-417@plc.org to slice onebf_slice415 +01:== created slice 417 - max nodes=350 +01:== Attached person user-416@plc.org to slice onebg_slice416 +01:== Attached person user-417@plc.org to slice onebg_slice416 +01:== Attached person user-418@plc.org to slice onebg_slice416 +01:== created slice 418 - max nodes=350 +01:== Attached person user-417@plc.org to slice onebh_slice417 +01:== Attached person user-418@plc.org to slice onebh_slice417 +01:== Attached person user-419@plc.org to slice onebh_slice417 +01:== created slice 419 - max nodes=350 +01:== Attached person user-418@plc.org to slice onebi_slice418 +01:== Attached person user-419@plc.org to slice onebi_slice418 +01:== Attached person user-420@plc.org to slice onebi_slice418 +01:== created slice 420 - max nodes=350 +01:== Attached person user-419@plc.org to slice onebj_slice419 +01:== Attached person user-420@plc.org to slice onebj_slice419 +01:== Attached person user-421@plc.org to slice onebj_slice419 +01:== created slice 421 - max nodes=350 +01:== Attached person user-420@plc.org to slice oneca_slice420 +01:== Attached person user-421@plc.org to slice oneca_slice420 +01:== Attached person user-422@plc.org to slice oneca_slice420 +01:== created slice 422 - max nodes=350 +01:== Attached person user-421@plc.org to slice onecb_slice421 +01:== Attached person user-422@plc.org to slice onecb_slice421 +01:== Attached person user-423@plc.org to slice onecb_slice421 +01:== created slice 423 - max nodes=350 +01:== Attached person user-422@plc.org to slice onecc_slice422 +01:== Attached person user-423@plc.org to slice onecc_slice422 +01:== Attached person user-424@plc.org to slice onecc_slice422 +01:== created slice 424 - max nodes=350 +01:== Attached person user-423@plc.org to slice onecd_slice423 +01:== Attached person user-424@plc.org to slice onecd_slice423 +01:== Attached person user-425@plc.org to slice onecd_slice423 +01:== created slice 425 - max nodes=350 +01:== Attached person user-424@plc.org to slice onece_slice424 +01:== Attached person user-425@plc.org to slice onece_slice424 +01:== Attached person user-426@plc.org to slice onece_slice424 +01:== created slice 426 - max nodes=350 +01:== Attached person user-425@plc.org to slice onecf_slice425 +01:== Attached person user-426@plc.org to slice onecf_slice425 +01:== Attached person user-427@plc.org to slice onecf_slice425 +01:== created slice 427 - max nodes=350 +01:== Attached person user-426@plc.org to slice onecg_slice426 +01:== Attached person user-427@plc.org to slice onecg_slice426 +01:== Attached person user-428@plc.org to slice onecg_slice426 +01:== created slice 428 - max nodes=350 +01:== Attached person user-427@plc.org to slice onech_slice427 +01:== Attached person user-428@plc.org to slice onech_slice427 +01:== Attached person user-429@plc.org to slice onech_slice427 +01:== created slice 429 - max nodes=350 +01:== Attached person user-428@plc.org to slice oneci_slice428 +01:== Attached person user-429@plc.org to slice oneci_slice428 +01:== Attached person user-430@plc.org to slice oneci_slice428 +01:== created slice 430 - max nodes=350 +01:== Attached person user-429@plc.org to slice onecj_slice429 +01:== Attached person user-430@plc.org to slice onecj_slice429 +01:== Attached person user-431@plc.org to slice onecj_slice429 +01:== created slice 431 - max nodes=350 +01:== Attached person user-430@plc.org to slice oneda_slice430 +01:== Attached person user-431@plc.org to slice oneda_slice430 +01:== Attached person user-432@plc.org to slice oneda_slice430 +01:== created slice 432 - max nodes=350 +01:== Attached person user-431@plc.org to slice onedb_slice431 +01:== Attached person user-432@plc.org to slice onedb_slice431 +01:== Attached person user-433@plc.org to slice onedb_slice431 +01:== created slice 433 - max nodes=350 +01:== Attached person user-432@plc.org to slice onedc_slice432 +01:== Attached person user-433@plc.org to slice onedc_slice432 +01:== Attached person user-434@plc.org to slice onedc_slice432 +01:== created slice 434 - max nodes=350 +01:== Attached person user-433@plc.org to slice onedd_slice433 +01:== Attached person user-434@plc.org to slice onedd_slice433 +01:== Attached person user-435@plc.org to slice onedd_slice433 +01:== created slice 435 - max nodes=350 +01:== Attached person user-434@plc.org to slice onede_slice434 +01:== Attached person user-435@plc.org to slice onede_slice434 +01:== Attached person user-436@plc.org to slice onede_slice434 +01:== created slice 436 - max nodes=350 +01:== Attached person user-435@plc.org to slice onedf_slice435 +01:== Attached person user-436@plc.org to slice onedf_slice435 +01:== Attached person user-437@plc.org to slice onedf_slice435 +01:== created slice 437 - max nodes=350 +01:== Attached person user-436@plc.org to slice onedg_slice436 +01:== Attached person user-437@plc.org to slice onedg_slice436 +01:== Attached person user-438@plc.org to slice onedg_slice436 +01:== created slice 438 - max nodes=350 +01:== Attached person user-437@plc.org to slice onedh_slice437 +01:== Attached person user-438@plc.org to slice onedh_slice437 +01:== Attached person user-439@plc.org to slice onedh_slice437 +01:== created slice 439 - max nodes=350 +01:== Attached person user-438@plc.org to slice onedi_slice438 +01:== Attached person user-439@plc.org to slice onedi_slice438 +01:== Attached person user-440@plc.org to slice onedi_slice438 +01:== created slice 440 - max nodes=350 +01:== Attached person user-439@plc.org to slice onedj_slice439 +01:== Attached person user-440@plc.org to slice onedj_slice439 +01:== Attached person user-441@plc.org to slice onedj_slice439 +01:== created slice 441 - max nodes=350 +01:== Attached person user-440@plc.org to slice oneea_slice440 +01:== Attached person user-441@plc.org to slice oneea_slice440 +01:== Attached person user-442@plc.org to slice oneea_slice440 +01:== created slice 442 - max nodes=350 +01:== Attached person user-441@plc.org to slice oneeb_slice441 +01:== Attached person user-442@plc.org to slice oneeb_slice441 +01:== Attached person user-443@plc.org to slice oneeb_slice441 +01:== created slice 443 - max nodes=350 +01:== Attached person user-442@plc.org to slice oneec_slice442 +01:== Attached person user-443@plc.org to slice oneec_slice442 +01:== Attached person user-444@plc.org to slice oneec_slice442 +01:== created slice 444 - max nodes=350 +01:== Attached person user-443@plc.org to slice oneed_slice443 +01:== Attached person user-444@plc.org to slice oneed_slice443 +01:== Attached person user-445@plc.org to slice oneed_slice443 +01:== created slice 445 - max nodes=350 +01:== Attached person user-444@plc.org to slice oneee_slice444 +01:== Attached person user-445@plc.org to slice oneee_slice444 +01:== Attached person user-446@plc.org to slice oneee_slice444 +01:== created slice 446 - max nodes=350 +01:== Attached person user-445@plc.org to slice oneef_slice445 +01:== Attached person user-446@plc.org to slice oneef_slice445 +01:== Attached person user-447@plc.org to slice oneef_slice445 +01:== created slice 447 - max nodes=350 +01:== Attached person user-446@plc.org to slice oneeg_slice446 +01:== Attached person user-447@plc.org to slice oneeg_slice446 +01:== Attached person user-448@plc.org to slice oneeg_slice446 +01:== created slice 448 - max nodes=350 +01:== Attached person user-447@plc.org to slice oneeh_slice447 +01:== Attached person user-448@plc.org to slice oneeh_slice447 +01:== Attached person user-449@plc.org to slice oneeh_slice447 +01:== created slice 449 - max nodes=350 +01:== Attached person user-448@plc.org to slice oneei_slice448 +01:== Attached person user-449@plc.org to slice oneei_slice448 +01:== Attached person user-450@plc.org to slice oneei_slice448 +01:== created slice 450 - max nodes=350 +01:== Attached person user-449@plc.org to slice oneej_slice449 +01:== Attached person user-450@plc.org to slice oneej_slice449 +01:== Attached person user-451@plc.org to slice oneej_slice449 +01:== created slice 451 - max nodes=350 +01:== Attached person user-450@plc.org to slice onefa_slice450 +01:== Attached person user-451@plc.org to slice onefa_slice450 +01:== Attached person user-452@plc.org to slice onefa_slice450 +01:== created slice 452 - max nodes=350 +01:== Attached person user-451@plc.org to slice onefb_slice451 +01:== Attached person user-452@plc.org to slice onefb_slice451 +01:== Attached person user-453@plc.org to slice onefb_slice451 +01:== created slice 453 - max nodes=350 +01:== Attached person user-452@plc.org to slice onefc_slice452 +01:== Attached person user-453@plc.org to slice onefc_slice452 +01:== Attached person user-454@plc.org to slice onefc_slice452 +01:== created slice 454 - max nodes=350 +01:== Attached person user-453@plc.org to slice onefd_slice453 +01:== Attached person user-454@plc.org to slice onefd_slice453 +01:== Attached person user-455@plc.org to slice onefd_slice453 +01:== created slice 455 - max nodes=350 +01:== Attached person user-454@plc.org to slice onefe_slice454 +01:== Attached person user-455@plc.org to slice onefe_slice454 +01:== Attached person user-456@plc.org to slice onefe_slice454 +01:== created slice 456 - max nodes=350 +01:== Attached person user-455@plc.org to slice oneff_slice455 +01:== Attached person user-456@plc.org to slice oneff_slice455 +01:== Attached person user-457@plc.org to slice oneff_slice455 +01:== created slice 457 - max nodes=350 +01:== Attached person user-456@plc.org to slice onefg_slice456 +01:== Attached person user-457@plc.org to slice onefg_slice456 +01:== Attached person user-458@plc.org to slice onefg_slice456 +01:== created slice 458 - max nodes=350 +01:== Attached person user-457@plc.org to slice onefh_slice457 +01:== Attached person user-458@plc.org to slice onefh_slice457 +01:== Attached person user-459@plc.org to slice onefh_slice457 +01:== created slice 459 - max nodes=350 +01:== Attached person user-458@plc.org to slice onefi_slice458 +01:== Attached person user-459@plc.org to slice onefi_slice458 +01:== Attached person user-460@plc.org to slice onefi_slice458 +01:== created slice 460 - max nodes=350 +01:== Attached person user-459@plc.org to slice onefj_slice459 +01:== Attached person user-460@plc.org to slice onefj_slice459 +01:== Attached person user-461@plc.org to slice onefj_slice459 +01:== created slice 461 - max nodes=350 +01:== Attached person user-460@plc.org to slice onega_slice460 +01:== Attached person user-461@plc.org to slice onega_slice460 +01:== Attached person user-462@plc.org to slice onega_slice460 +01:== created slice 462 - max nodes=350 +01:== Attached person user-461@plc.org to slice onegb_slice461 +01:== Attached person user-462@plc.org to slice onegb_slice461 +01:== Attached person user-463@plc.org to slice onegb_slice461 +01:== created slice 463 - max nodes=350 +01:== Attached person user-462@plc.org to slice onegc_slice462 +01:== Attached person user-463@plc.org to slice onegc_slice462 +01:== Attached person user-464@plc.org to slice onegc_slice462 +01:== created slice 464 - max nodes=350 +01:== Attached person user-463@plc.org to slice onegd_slice463 +01:== Attached person user-464@plc.org to slice onegd_slice463 +01:== Attached person user-465@plc.org to slice onegd_slice463 +01:== created slice 465 - max nodes=350 +01:== Attached person user-464@plc.org to slice onege_slice464 +01:== Attached person user-465@plc.org to slice onege_slice464 +01:== Attached person user-466@plc.org to slice onege_slice464 +01:== created slice 466 - max nodes=350 +01:== Attached person user-465@plc.org to slice onegf_slice465 +01:== Attached person user-466@plc.org to slice onegf_slice465 +01:== Attached person user-467@plc.org to slice onegf_slice465 +01:== created slice 467 - max nodes=350 +01:== Attached person user-466@plc.org to slice onegg_slice466 +01:== Attached person user-467@plc.org to slice onegg_slice466 +01:== Attached person user-468@plc.org to slice onegg_slice466 +01:== created slice 468 - max nodes=350 +01:== Attached person user-467@plc.org to slice onegh_slice467 +01:== Attached person user-468@plc.org to slice onegh_slice467 +01:== Attached person user-469@plc.org to slice onegh_slice467 +01:== created slice 469 - max nodes=350 +01:== Attached person user-468@plc.org to slice onegi_slice468 +01:== Attached person user-469@plc.org to slice onegi_slice468 +01:== Attached person user-470@plc.org to slice onegi_slice468 +01:== created slice 470 - max nodes=350 +01:== Attached person user-469@plc.org to slice onegj_slice469 +01:== Attached person user-470@plc.org to slice onegj_slice469 +01:== Attached person user-471@plc.org to slice onegj_slice469 +01:== created slice 471 - max nodes=350 +01:== Attached person user-470@plc.org to slice oneha_slice470 +01:== Attached person user-471@plc.org to slice oneha_slice470 +01:== Attached person user-472@plc.org to slice oneha_slice470 +01:== created slice 472 - max nodes=350 +01:== Attached person user-471@plc.org to slice onehb_slice471 +01:== Attached person user-472@plc.org to slice onehb_slice471 +01:== Attached person user-473@plc.org to slice onehb_slice471 +01:== created slice 473 - max nodes=350 +01:== Attached person user-472@plc.org to slice onehc_slice472 +01:== Attached person user-473@plc.org to slice onehc_slice472 +01:== Attached person user-474@plc.org to slice onehc_slice472 +01:== created slice 474 - max nodes=350 +01:== Attached person user-473@plc.org to slice onehd_slice473 +01:== Attached person user-474@plc.org to slice onehd_slice473 +01:== Attached person user-475@plc.org to slice onehd_slice473 +01:== created slice 475 - max nodes=350 +01:== Attached person user-474@plc.org to slice onehe_slice474 +01:== Attached person user-475@plc.org to slice onehe_slice474 +01:== Attached person user-476@plc.org to slice onehe_slice474 +01:== created slice 476 - max nodes=350 +01:== Attached person user-475@plc.org to slice onehf_slice475 +01:== Attached person user-476@plc.org to slice onehf_slice475 +01:== Attached person user-477@plc.org to slice onehf_slice475 +01:== created slice 477 - max nodes=350 +01:== Attached person user-476@plc.org to slice onehg_slice476 +01:== Attached person user-477@plc.org to slice onehg_slice476 +01:== Attached person user-478@plc.org to slice onehg_slice476 +01:== created slice 478 - max nodes=350 +01:== Attached person user-477@plc.org to slice onehh_slice477 +01:== Attached person user-478@plc.org to slice onehh_slice477 +01:== Attached person user-479@plc.org to slice onehh_slice477 +01:== created slice 479 - max nodes=350 +01:== Attached person user-478@plc.org to slice onehi_slice478 +01:== Attached person user-479@plc.org to slice onehi_slice478 +01:== Attached person user-480@plc.org to slice onehi_slice478 +01:== created slice 480 - max nodes=350 +01:== Attached person user-479@plc.org to slice onehj_slice479 +01:== Attached person user-480@plc.org to slice onehj_slice479 +01:== Attached person user-481@plc.org to slice onehj_slice479 +01:== created slice 481 - max nodes=350 +01:== Attached person user-480@plc.org to slice oneia_slice480 +01:== Attached person user-481@plc.org to slice oneia_slice480 +01:== Attached person user-482@plc.org to slice oneia_slice480 +01:== created slice 482 - max nodes=350 +01:== Attached person user-481@plc.org to slice oneib_slice481 +01:== Attached person user-482@plc.org to slice oneib_slice481 +01:== Attached person user-483@plc.org to slice oneib_slice481 +01:== created slice 483 - max nodes=350 +01:== Attached person user-482@plc.org to slice oneic_slice482 +01:== Attached person user-483@plc.org to slice oneic_slice482 +01:== Attached person user-484@plc.org to slice oneic_slice482 +01:== created slice 484 - max nodes=350 +01:== Attached person user-483@plc.org to slice oneid_slice483 +01:== Attached person user-484@plc.org to slice oneid_slice483 +01:== Attached person user-485@plc.org to slice oneid_slice483 +01:== created slice 485 - max nodes=350 +01:== Attached person user-484@plc.org to slice oneie_slice484 +01:== Attached person user-485@plc.org to slice oneie_slice484 +01:== Attached person user-486@plc.org to slice oneie_slice484 +01:== created slice 486 - max nodes=350 +01:== Attached person user-485@plc.org to slice oneif_slice485 +01:== Attached person user-486@plc.org to slice oneif_slice485 +01:== Attached person user-487@plc.org to slice oneif_slice485 +01:== created slice 487 - max nodes=350 +01:== Attached person user-486@plc.org to slice oneig_slice486 +01:== Attached person user-487@plc.org to slice oneig_slice486 +01:== Attached person user-488@plc.org to slice oneig_slice486 +01:== created slice 488 - max nodes=350 +01:== Attached person user-487@plc.org to slice oneih_slice487 +01:== Attached person user-488@plc.org to slice oneih_slice487 +01:== Attached person user-489@plc.org to slice oneih_slice487 +01:== created slice 489 - max nodes=350 +01:== Attached person user-488@plc.org to slice oneii_slice488 +01:== Attached person user-489@plc.org to slice oneii_slice488 +01:== Attached person user-490@plc.org to slice oneii_slice488 +01:== created slice 490 - max nodes=350 +01:== Attached person user-489@plc.org to slice oneij_slice489 +01:== Attached person user-490@plc.org to slice oneij_slice489 +01:== Attached person user-491@plc.org to slice oneij_slice489 +01:== created slice 491 - max nodes=350 +01:== Attached person user-490@plc.org to slice oneja_slice490 +01:== Attached person user-491@plc.org to slice oneja_slice490 +01:== Attached person user-492@plc.org to slice oneja_slice490 +01:== created slice 492 - max nodes=350 +01:== Attached person user-491@plc.org to slice onejb_slice491 +01:== Attached person user-492@plc.org to slice onejb_slice491 +01:== Attached person user-493@plc.org to slice onejb_slice491 +01:== created slice 493 - max nodes=350 +01:== Attached person user-492@plc.org to slice onejc_slice492 +01:== Attached person user-493@plc.org to slice onejc_slice492 +01:== Attached person user-494@plc.org to slice onejc_slice492 +01:== created slice 494 - max nodes=350 +01:== Attached person user-493@plc.org to slice onejd_slice493 +01:== Attached person user-494@plc.org to slice onejd_slice493 +01:== Attached person user-495@plc.org to slice onejd_slice493 +01:== created slice 495 - max nodes=350 +01:== Attached person user-494@plc.org to slice oneje_slice494 +01:== Attached person user-495@plc.org to slice oneje_slice494 +01:== Attached person user-496@plc.org to slice oneje_slice494 +01:== created slice 496 - max nodes=350 +01:== Attached person user-495@plc.org to slice onejf_slice495 +01:== Attached person user-496@plc.org to slice onejf_slice495 +01:== Attached person user-497@plc.org to slice onejf_slice495 +01:== created slice 497 - max nodes=350 +01:== Attached person user-496@plc.org to slice onejg_slice496 +01:== Attached person user-497@plc.org to slice onejg_slice496 +01:== Attached person user-498@plc.org to slice onejg_slice496 +01:== created slice 498 - max nodes=350 +01:== Attached person user-497@plc.org to slice onejh_slice497 +01:== Attached person user-498@plc.org to slice onejh_slice497 +01:== Attached person user-499@plc.org to slice onejh_slice497 +01:== created slice 499 - max nodes=350 +01:== Attached person user-498@plc.org to slice oneji_slice498 +01:== Attached person user-499@plc.org to slice oneji_slice498 +01:== Attached person user-500@plc.org to slice oneji_slice498 +01:== created slice 500 - max nodes=350 +01:== Attached person user-499@plc.org to slice onejj_slice499 +01:== Attached person user-500@plc.org to slice onejj_slice499 +01:== Attached person user-1@plc.org to slice onejj_slice499 +01:== created slice 501 - max nodes=350 +01:== Attached person user-500@plc.org to slice onebaa_slice500 +01:== Attached person user-1@plc.org to slice onebaa_slice500 +01:== Attached person user-2@plc.org to slice onebaa_slice500 ++++ 147.48 seconds ellapsed (65.76) +01:== added in slice oneb_slice1 local ['n1-001.plc1.org'] +01:== added in slice onec_slice2 local ['n1-002.plc1.org'] +01:== added in slice oned_slice3 local ['n1-003.plc1.org'] +01:== added in slice onee_slice4 local ['n1-004.plc1.org'] +01:== added in slice onef_slice5 local ['n1-005.plc1.org'] +01:== added in slice oneg_slice6 local ['n1-006.plc1.org'] +01:== added in slice oneh_slice7 local ['n1-007.plc1.org'] +01:== added in slice onei_slice8 local ['n1-008.plc1.org'] +01:== added in slice onej_slice9 local ['n1-009.plc1.org'] +01:== added in slice oneba_slice10 local ['n1-010.plc1.org'] +01:== added in slice onebb_slice11 local ['n1-011.plc1.org'] +01:== added in slice onebc_slice12 local ['n1-012.plc1.org'] +01:== added in slice onebd_slice13 local ['n1-013.plc1.org'] +01:== added in slice onebe_slice14 local ['n1-014.plc1.org'] +01:== added in slice onebf_slice15 local ['n1-015.plc1.org'] +01:== added in slice onebg_slice16 local ['n1-016.plc1.org'] +01:== added in slice onebh_slice17 local ['n1-017.plc1.org'] +01:== added in slice onebi_slice18 local ['n1-018.plc1.org'] +01:== added in slice onebj_slice19 local ['n1-019.plc1.org'] +01:== added in slice oneca_slice20 local ['n1-020.plc1.org'] +01:== added in slice onecb_slice21 local ['n1-021.plc1.org'] +01:== added in slice onecc_slice22 local ['n1-022.plc1.org'] +01:== added in slice onecd_slice23 local ['n1-023.plc1.org'] +01:== added in slice onece_slice24 local ['n1-024.plc1.org'] +01:== added in slice onecf_slice25 local ['n1-025.plc1.org'] +01:== added in slice onecg_slice26 local ['n1-026.plc1.org'] +01:== added in slice onech_slice27 local ['n1-027.plc1.org'] +01:== added in slice oneci_slice28 local ['n1-028.plc1.org'] +01:== added in slice onecj_slice29 local ['n1-029.plc1.org'] +01:== added in slice oneda_slice30 local ['n1-030.plc1.org'] +01:== added in slice onedb_slice31 local ['n1-031.plc1.org'] +01:== added in slice onedc_slice32 local ['n1-032.plc1.org'] +01:== added in slice onedd_slice33 local ['n1-033.plc1.org'] +01:== added in slice onede_slice34 local ['n1-034.plc1.org'] +01:== added in slice onedf_slice35 local ['n1-035.plc1.org'] +01:== added in slice onedg_slice36 local ['n1-036.plc1.org'] +01:== added in slice onedh_slice37 local ['n1-037.plc1.org'] +01:== added in slice onedi_slice38 local ['n1-038.plc1.org'] +01:== added in slice onedj_slice39 local ['n1-039.plc1.org'] +01:== added in slice oneea_slice40 local ['n1-040.plc1.org'] +01:== added in slice oneeb_slice41 local ['n1-041.plc1.org'] +01:== added in slice oneec_slice42 local ['n1-042.plc1.org'] +01:== added in slice oneed_slice43 local ['n1-043.plc1.org'] +01:== added in slice oneee_slice44 local ['n1-044.plc1.org'] +01:== added in slice oneef_slice45 local ['n1-045.plc1.org'] +01:== added in slice oneeg_slice46 local ['n1-046.plc1.org'] +01:== added in slice oneeh_slice47 local ['n1-047.plc1.org'] +01:== added in slice oneei_slice48 local ['n1-048.plc1.org'] +01:== added in slice oneej_slice49 local ['n1-049.plc1.org'] +01:== added in slice onefa_slice50 local ['n1-050.plc1.org'] +01:== added in slice onefb_slice51 local ['n1-051.plc1.org'] +01:== added in slice onefc_slice52 local ['n1-052.plc1.org'] +01:== added in slice onefd_slice53 local ['n1-053.plc1.org'] +01:== added in slice onefe_slice54 local ['n1-054.plc1.org'] +01:== added in slice oneff_slice55 local ['n1-055.plc1.org'] +01:== added in slice onefg_slice56 local ['n1-056.plc1.org'] +01:== added in slice onefh_slice57 local ['n1-057.plc1.org'] +01:== added in slice onefi_slice58 local ['n1-058.plc1.org'] +01:== added in slice onefj_slice59 local ['n1-059.plc1.org'] +01:== added in slice onega_slice60 local ['n1-060.plc1.org'] +01:== added in slice onegb_slice61 local ['n1-061.plc1.org'] +01:== added in slice onegc_slice62 local ['n1-062.plc1.org'] +01:== added in slice onegd_slice63 local ['n1-063.plc1.org'] +01:== added in slice onege_slice64 local ['n1-064.plc1.org'] +01:== added in slice onegf_slice65 local ['n1-065.plc1.org'] +01:== added in slice onegg_slice66 local ['n1-066.plc1.org'] +01:== added in slice onegh_slice67 local ['n1-067.plc1.org'] +01:== added in slice onegi_slice68 local ['n1-068.plc1.org'] +01:== added in slice onegj_slice69 local ['n1-069.plc1.org'] +01:== added in slice oneha_slice70 local ['n1-070.plc1.org'] +01:== added in slice onehb_slice71 local ['n1-071.plc1.org'] +01:== added in slice onehc_slice72 local ['n1-072.plc1.org'] +01:== added in slice onehd_slice73 local ['n1-073.plc1.org'] +01:== added in slice onehe_slice74 local ['n1-074.plc1.org'] +01:== added in slice onehf_slice75 local ['n1-075.plc1.org'] +01:== added in slice onehg_slice76 local ['n1-076.plc1.org'] +01:== added in slice onehh_slice77 local ['n1-077.plc1.org'] +01:== added in slice onehi_slice78 local ['n1-078.plc1.org'] +01:== added in slice onehj_slice79 local ['n1-079.plc1.org'] +01:== added in slice oneia_slice80 local ['n1-080.plc1.org'] +01:== added in slice oneib_slice81 local ['n1-081.plc1.org'] +01:== added in slice oneic_slice82 local ['n1-082.plc1.org'] +01:== added in slice oneid_slice83 local ['n1-083.plc1.org'] +01:== added in slice oneie_slice84 local ['n1-084.plc1.org'] +01:== added in slice oneif_slice85 local ['n1-085.plc1.org'] +01:== added in slice oneig_slice86 local ['n1-086.plc1.org'] +01:== added in slice oneih_slice87 local ['n1-087.plc1.org'] +01:== added in slice oneii_slice88 local ['n1-088.plc1.org'] +01:== added in slice oneij_slice89 local ['n1-089.plc1.org'] +01:== added in slice oneja_slice90 local ['n1-090.plc1.org'] +01:== added in slice onejb_slice91 local ['n1-091.plc1.org'] +01:== added in slice onejc_slice92 local ['n1-092.plc1.org'] +01:== added in slice onejd_slice93 local ['n1-093.plc1.org'] +01:== added in slice oneje_slice94 local ['n1-094.plc1.org'] +01:== added in slice onejf_slice95 local ['n1-095.plc1.org'] +01:== added in slice onejg_slice96 local ['n1-096.plc1.org'] +01:== added in slice onejh_slice97 local ['n1-097.plc1.org'] +01:== added in slice oneji_slice98 local ['n1-098.plc1.org'] +01:== added in slice onejj_slice99 local ['n1-099.plc1.org'] +01:== added in slice onebaa_slice100 local ['n1-100.plc1.org'] +01:== added in slice onebab_slice101 local ['n1-101.plc1.org'] +01:== added in slice onebac_slice102 local ['n1-102.plc1.org'] +01:== added in slice onebad_slice103 local ['n1-103.plc1.org'] +01:== added in slice onebae_slice104 local ['n1-104.plc1.org'] +01:== added in slice onebaf_slice105 local ['n1-105.plc1.org'] +01:== added in slice onebag_slice106 local ['n1-106.plc1.org'] +01:== added in slice onebah_slice107 local ['n1-107.plc1.org'] +01:== added in slice onebai_slice108 local ['n1-108.plc1.org'] +01:== added in slice onebaj_slice109 local ['n1-109.plc1.org'] +01:== added in slice onebba_slice110 local ['n1-110.plc1.org'] +01:== added in slice onebbb_slice111 local ['n1-111.plc1.org'] +01:== added in slice onebbc_slice112 local ['n1-112.plc1.org'] +01:== added in slice onebbd_slice113 local ['n1-113.plc1.org'] +01:== added in slice onebbe_slice114 local ['n1-114.plc1.org'] +01:== added in slice onebbf_slice115 local ['n1-115.plc1.org'] +01:== added in slice onebbg_slice116 local ['n1-116.plc1.org'] +01:== added in slice onebbh_slice117 local ['n1-117.plc1.org'] +01:== added in slice onebbi_slice118 local ['n1-118.plc1.org'] +01:== added in slice onebbj_slice119 local ['n1-119.plc1.org'] +01:== added in slice onebca_slice120 local ['n1-120.plc1.org'] +01:== added in slice onebcb_slice121 local ['n1-121.plc1.org'] +01:== added in slice onebcc_slice122 local ['n1-122.plc1.org'] +01:== added in slice onebcd_slice123 local ['n1-123.plc1.org'] +01:== added in slice onebce_slice124 local ['n1-124.plc1.org'] +01:== added in slice onebcf_slice125 local ['n1-125.plc1.org'] +01:== added in slice onebcg_slice126 local ['n1-126.plc1.org'] +01:== added in slice onebch_slice127 local ['n1-127.plc1.org'] +01:== added in slice onebci_slice128 local ['n1-128.plc1.org'] +01:== added in slice onebcj_slice129 local ['n1-129.plc1.org'] +01:== added in slice onebda_slice130 local ['n1-130.plc1.org'] +01:== added in slice onebdb_slice131 local ['n1-131.plc1.org'] +01:== added in slice onebdc_slice132 local ['n1-132.plc1.org'] +01:== added in slice onebdd_slice133 local ['n1-133.plc1.org'] +01:== added in slice onebde_slice134 local ['n1-134.plc1.org'] +01:== added in slice onebdf_slice135 local ['n1-135.plc1.org'] +01:== added in slice onebdg_slice136 local ['n1-136.plc1.org'] +01:== added in slice onebdh_slice137 local ['n1-137.plc1.org'] +01:== added in slice onebdi_slice138 local ['n1-138.plc1.org'] +01:== added in slice onebdj_slice139 local ['n1-139.plc1.org'] +01:== added in slice onebea_slice140 local ['n1-140.plc1.org'] +01:== added in slice onebeb_slice141 local ['n1-141.plc1.org'] +01:== added in slice onebec_slice142 local ['n1-142.plc1.org'] +01:== added in slice onebed_slice143 local ['n1-143.plc1.org'] +01:== added in slice onebee_slice144 local ['n1-144.plc1.org'] +01:== added in slice onebef_slice145 local ['n1-145.plc1.org'] +01:== added in slice onebeg_slice146 local ['n1-146.plc1.org'] +01:== added in slice onebeh_slice147 local ['n1-147.plc1.org'] +01:== added in slice onebei_slice148 local ['n1-148.plc1.org'] +01:== added in slice onebej_slice149 local ['n1-149.plc1.org'] +01:== added in slice onebfa_slice150 local ['n1-150.plc1.org'] +01:== added in slice onebfb_slice151 local ['n1-151.plc1.org'] +01:== added in slice onebfc_slice152 local ['n1-152.plc1.org'] +01:== added in slice onebfd_slice153 local ['n1-153.plc1.org'] +01:== added in slice onebfe_slice154 local ['n1-154.plc1.org'] +01:== added in slice onebff_slice155 local ['n1-155.plc1.org'] +01:== added in slice onebfg_slice156 local ['n1-156.plc1.org'] +01:== added in slice onebfh_slice157 local ['n1-157.plc1.org'] +01:== added in slice onebfi_slice158 local ['n1-158.plc1.org'] +01:== added in slice onebfj_slice159 local ['n1-159.plc1.org'] +01:== added in slice onebga_slice160 local ['n1-160.plc1.org'] +01:== added in slice onebgb_slice161 local ['n1-161.plc1.org'] +01:== added in slice onebgc_slice162 local ['n1-162.plc1.org'] +01:== added in slice onebgd_slice163 local ['n1-163.plc1.org'] +01:== added in slice onebge_slice164 local ['n1-164.plc1.org'] +01:== added in slice onebgf_slice165 local ['n1-165.plc1.org'] +01:== added in slice onebgg_slice166 local ['n1-166.plc1.org'] +01:== added in slice onebgh_slice167 local ['n1-167.plc1.org'] +01:== added in slice onebgi_slice168 local ['n1-168.plc1.org'] +01:== added in slice onebgj_slice169 local ['n1-169.plc1.org'] +01:== added in slice onebha_slice170 local ['n1-170.plc1.org'] +01:== added in slice onebhb_slice171 local ['n1-171.plc1.org'] +01:== added in slice onebhc_slice172 local ['n1-172.plc1.org'] +01:== added in slice onebhd_slice173 local ['n1-173.plc1.org'] +01:== added in slice onebhe_slice174 local ['n1-174.plc1.org'] +01:== added in slice onebhf_slice175 local ['n1-175.plc1.org'] +01:== added in slice onebhg_slice176 local ['n1-176.plc1.org'] +01:== added in slice onebhh_slice177 local ['n1-177.plc1.org'] +01:== added in slice onebhi_slice178 local ['n1-178.plc1.org'] +01:== added in slice onebhj_slice179 local ['n1-179.plc1.org'] +01:== added in slice onebia_slice180 local ['n1-180.plc1.org'] +01:== added in slice onebib_slice181 local ['n1-181.plc1.org'] +01:== added in slice onebic_slice182 local ['n1-182.plc1.org'] +01:== added in slice onebid_slice183 local ['n1-183.plc1.org'] +01:== added in slice onebie_slice184 local ['n1-184.plc1.org'] +01:== added in slice onebif_slice185 local ['n1-185.plc1.org'] +01:== added in slice onebig_slice186 local ['n1-186.plc1.org'] +01:== added in slice onebih_slice187 local ['n1-187.plc1.org'] +01:== added in slice onebii_slice188 local ['n1-188.plc1.org'] +01:== added in slice onebij_slice189 local ['n1-189.plc1.org'] +01:== added in slice onebja_slice190 local ['n1-190.plc1.org'] +01:== added in slice onebjb_slice191 local ['n1-191.plc1.org'] +01:== added in slice onebjc_slice192 local ['n1-192.plc1.org'] +01:== added in slice onebjd_slice193 local ['n1-193.plc1.org'] +01:== added in slice onebje_slice194 local ['n1-194.plc1.org'] +01:== added in slice onebjf_slice195 local ['n1-195.plc1.org'] +01:== added in slice onebjg_slice196 local ['n1-196.plc1.org'] +01:== added in slice onebjh_slice197 local ['n1-197.plc1.org'] +01:== added in slice onebji_slice198 local ['n1-198.plc1.org'] +01:== added in slice onebjj_slice199 local ['n1-199.plc1.org'] +01:== added in slice onecaa_slice200 local ['n1-200.plc1.org'] +01:== added in slice oneb_slice201 local ['n1-201.plc1.org'] +01:== added in slice onec_slice202 local ['n1-202.plc1.org'] +01:== added in slice oned_slice203 local ['n1-203.plc1.org'] +01:== added in slice onee_slice204 local ['n1-204.plc1.org'] +01:== added in slice onef_slice205 local ['n1-205.plc1.org'] +01:== added in slice oneg_slice206 local ['n1-206.plc1.org'] +01:== added in slice oneh_slice207 local ['n1-207.plc1.org'] +01:== added in slice onei_slice208 local ['n1-208.plc1.org'] +01:== added in slice onej_slice209 local ['n1-209.plc1.org'] +01:== added in slice oneba_slice210 local ['n1-210.plc1.org'] +01:== added in slice onebb_slice211 local ['n1-211.plc1.org'] +01:== added in slice onebc_slice212 local ['n1-212.plc1.org'] +01:== added in slice onebd_slice213 local ['n1-213.plc1.org'] +01:== added in slice onebe_slice214 local ['n1-214.plc1.org'] +01:== added in slice onebf_slice215 local ['n1-215.plc1.org'] +01:== added in slice onebg_slice216 local ['n1-216.plc1.org'] +01:== added in slice onebh_slice217 local ['n1-217.plc1.org'] +01:== added in slice onebi_slice218 local ['n1-218.plc1.org'] +01:== added in slice onebj_slice219 local ['n1-219.plc1.org'] +01:== added in slice oneca_slice220 local ['n1-220.plc1.org'] +01:== added in slice onecb_slice221 local ['n1-221.plc1.org'] +01:== added in slice onecc_slice222 local ['n1-222.plc1.org'] +01:== added in slice onecd_slice223 local ['n1-223.plc1.org'] +01:== added in slice onece_slice224 local ['n1-224.plc1.org'] +01:== added in slice onecf_slice225 local ['n1-225.plc1.org'] +01:== added in slice onecg_slice226 local ['n1-226.plc1.org'] +01:== added in slice onech_slice227 local ['n1-227.plc1.org'] +01:== added in slice oneci_slice228 local ['n1-228.plc1.org'] +01:== added in slice onecj_slice229 local ['n1-229.plc1.org'] +01:== added in slice oneda_slice230 local ['n1-230.plc1.org'] +01:== added in slice onedb_slice231 local ['n1-231.plc1.org'] +01:== added in slice onedc_slice232 local ['n1-232.plc1.org'] +01:== added in slice onedd_slice233 local ['n1-233.plc1.org'] +01:== added in slice onede_slice234 local ['n1-234.plc1.org'] +01:== added in slice onedf_slice235 local ['n1-235.plc1.org'] +01:== added in slice onedg_slice236 local ['n1-236.plc1.org'] +01:== added in slice onedh_slice237 local ['n1-237.plc1.org'] +01:== added in slice onedi_slice238 local ['n1-238.plc1.org'] +01:== added in slice onedj_slice239 local ['n1-239.plc1.org'] +01:== added in slice oneea_slice240 local ['n1-240.plc1.org'] +01:== added in slice oneeb_slice241 local ['n1-241.plc1.org'] +01:== added in slice oneec_slice242 local ['n1-242.plc1.org'] +01:== added in slice oneed_slice243 local ['n1-243.plc1.org'] +01:== added in slice oneee_slice244 local ['n1-244.plc1.org'] +01:== added in slice oneef_slice245 local ['n1-245.plc1.org'] +01:== added in slice oneeg_slice246 local ['n1-246.plc1.org'] +01:== added in slice oneeh_slice247 local ['n1-247.plc1.org'] +01:== added in slice oneei_slice248 local ['n1-248.plc1.org'] +01:== added in slice oneej_slice249 local ['n1-249.plc1.org'] +01:== added in slice onefa_slice250 local ['n1-250.plc1.org'] +01:== added in slice onefb_slice251 local ['n1-251.plc1.org'] +01:== added in slice onefc_slice252 local ['n1-252.plc1.org'] +01:== added in slice onefd_slice253 local ['n1-253.plc1.org'] +01:== added in slice onefe_slice254 local ['n1-254.plc1.org'] +01:== added in slice oneff_slice255 local ['n1-255.plc1.org'] +01:== added in slice onefg_slice256 local ['n1-256.plc1.org'] +01:== added in slice onefh_slice257 local ['n1-257.plc1.org'] +01:== added in slice onefi_slice258 local ['n1-258.plc1.org'] +01:== added in slice onefj_slice259 local ['n1-259.plc1.org'] +01:== added in slice onega_slice260 local ['n1-260.plc1.org'] +01:== added in slice onegb_slice261 local ['n1-261.plc1.org'] +01:== added in slice onegc_slice262 local ['n1-262.plc1.org'] +01:== added in slice onegd_slice263 local ['n1-263.plc1.org'] +01:== added in slice onege_slice264 local ['n1-264.plc1.org'] +01:== added in slice onegf_slice265 local ['n1-265.plc1.org'] +01:== added in slice onegg_slice266 local ['n1-266.plc1.org'] +01:== added in slice onegh_slice267 local ['n1-267.plc1.org'] +01:== added in slice onegi_slice268 local ['n1-268.plc1.org'] +01:== added in slice onegj_slice269 local ['n1-269.plc1.org'] +01:== added in slice oneha_slice270 local ['n1-270.plc1.org'] +01:== added in slice onehb_slice271 local ['n1-271.plc1.org'] +01:== added in slice onehc_slice272 local ['n1-272.plc1.org'] +01:== added in slice onehd_slice273 local ['n1-273.plc1.org'] +01:== added in slice onehe_slice274 local ['n1-274.plc1.org'] +01:== added in slice onehf_slice275 local ['n1-275.plc1.org'] +01:== added in slice onehg_slice276 local ['n1-276.plc1.org'] +01:== added in slice onehh_slice277 local ['n1-277.plc1.org'] +01:== added in slice onehi_slice278 local ['n1-278.plc1.org'] +01:== added in slice onehj_slice279 local ['n1-279.plc1.org'] +01:== added in slice oneia_slice280 local ['n1-280.plc1.org'] +01:== added in slice oneib_slice281 local ['n1-281.plc1.org'] +01:== added in slice oneic_slice282 local ['n1-282.plc1.org'] +01:== added in slice oneid_slice283 local ['n1-283.plc1.org'] +01:== added in slice oneie_slice284 local ['n1-284.plc1.org'] +01:== added in slice oneif_slice285 local ['n1-285.plc1.org'] +01:== added in slice oneig_slice286 local ['n1-286.plc1.org'] +01:== added in slice oneih_slice287 local ['n1-287.plc1.org'] +01:== added in slice oneii_slice288 local ['n1-288.plc1.org'] +01:== added in slice oneij_slice289 local ['n1-289.plc1.org'] +01:== added in slice oneja_slice290 local ['n1-290.plc1.org'] +01:== added in slice onejb_slice291 local ['n1-291.plc1.org'] +01:== added in slice onejc_slice292 local ['n1-292.plc1.org'] +01:== added in slice onejd_slice293 local ['n1-293.plc1.org'] +01:== added in slice oneje_slice294 local ['n1-294.plc1.org'] +01:== added in slice onejf_slice295 local ['n1-295.plc1.org'] +01:== added in slice onejg_slice296 local ['n1-296.plc1.org'] +01:== added in slice onejh_slice297 local ['n1-297.plc1.org'] +01:== added in slice oneji_slice298 local ['n1-298.plc1.org'] +01:== added in slice onejj_slice299 local ['n1-299.plc1.org'] +01:== added in slice onebaa_slice300 local ['n1-300.plc1.org'] +01:== added in slice onebab_slice301 local ['n1-301.plc1.org'] +01:== added in slice onebac_slice302 local ['n1-302.plc1.org'] +01:== added in slice onebad_slice303 local ['n1-303.plc1.org'] +01:== added in slice onebae_slice304 local ['n1-304.plc1.org'] +01:== added in slice onebaf_slice305 local ['n1-305.plc1.org'] +01:== added in slice onebag_slice306 local ['n1-306.plc1.org'] +01:== added in slice onebah_slice307 local ['n1-307.plc1.org'] +01:== added in slice onebai_slice308 local ['n1-308.plc1.org'] +01:== added in slice onebaj_slice309 local ['n1-309.plc1.org'] +01:== added in slice onebba_slice310 local ['n1-310.plc1.org'] +01:== added in slice onebbb_slice311 local ['n1-311.plc1.org'] +01:== added in slice onebbc_slice312 local ['n1-312.plc1.org'] +01:== added in slice onebbd_slice313 local ['n1-313.plc1.org'] +01:== added in slice onebbe_slice314 local ['n1-314.plc1.org'] +01:== added in slice onebbf_slice315 local ['n1-315.plc1.org'] +01:== added in slice onebbg_slice316 local ['n1-316.plc1.org'] +01:== added in slice onebbh_slice317 local ['n1-317.plc1.org'] +01:== added in slice onebbi_slice318 local ['n1-318.plc1.org'] +01:== added in slice onebbj_slice319 local ['n1-319.plc1.org'] +01:== added in slice onebca_slice320 local ['n1-320.plc1.org'] +01:== added in slice onebcb_slice321 local ['n1-321.plc1.org'] +01:== added in slice onebcc_slice322 local ['n1-322.plc1.org'] +01:== added in slice onebcd_slice323 local ['n1-323.plc1.org'] +01:== added in slice onebce_slice324 local ['n1-324.plc1.org'] +01:== added in slice onebcf_slice325 local ['n1-325.plc1.org'] +01:== added in slice onebcg_slice326 local ['n1-326.plc1.org'] +01:== added in slice onebch_slice327 local ['n1-327.plc1.org'] +01:== added in slice onebci_slice328 local ['n1-328.plc1.org'] +01:== added in slice onebcj_slice329 local ['n1-329.plc1.org'] +01:== added in slice onebda_slice330 local ['n1-330.plc1.org'] +01:== added in slice onebdb_slice331 local ['n1-331.plc1.org'] +01:== added in slice onebdc_slice332 local ['n1-332.plc1.org'] +01:== added in slice onebdd_slice333 local ['n1-333.plc1.org'] +01:== added in slice onebde_slice334 local ['n1-334.plc1.org'] +01:== added in slice onebdf_slice335 local ['n1-335.plc1.org'] +01:== added in slice onebdg_slice336 local ['n1-336.plc1.org'] +01:== added in slice onebdh_slice337 local ['n1-337.plc1.org'] +01:== added in slice onebdi_slice338 local ['n1-338.plc1.org'] +01:== added in slice onebdj_slice339 local ['n1-339.plc1.org'] +01:== added in slice onebea_slice340 local ['n1-340.plc1.org'] +01:== added in slice onebeb_slice341 local ['n1-341.plc1.org'] +01:== added in slice onebec_slice342 local ['n1-342.plc1.org'] +01:== added in slice onebed_slice343 local ['n1-343.plc1.org'] +01:== added in slice onebee_slice344 local ['n1-344.plc1.org'] +01:== added in slice onebef_slice345 local ['n1-345.plc1.org'] +01:== added in slice onebeg_slice346 local ['n1-346.plc1.org'] +01:== added in slice onebeh_slice347 local ['n1-347.plc1.org'] +01:== added in slice onebei_slice348 local ['n1-348.plc1.org'] +01:== added in slice onebej_slice349 local ['n1-349.plc1.org'] +01:== added in slice onebfa_slice350 local ['n1-350.plc1.org'] +01:== added in slice onebfb_slice351 local ['n1-001.plc1.org'] +01:== added in slice onebfc_slice352 local ['n1-002.plc1.org'] +01:== added in slice onebfd_slice353 local ['n1-003.plc1.org'] +01:== added in slice onebfe_slice354 local ['n1-004.plc1.org'] +01:== added in slice onebff_slice355 local ['n1-005.plc1.org'] +01:== added in slice onebfg_slice356 local ['n1-006.plc1.org'] +01:== added in slice onebfh_slice357 local ['n1-007.plc1.org'] +01:== added in slice onebfi_slice358 local ['n1-008.plc1.org'] +01:== added in slice onebfj_slice359 local ['n1-009.plc1.org'] +01:== added in slice onebga_slice360 local ['n1-010.plc1.org'] +01:== added in slice onebgb_slice361 local ['n1-011.plc1.org'] +01:== added in slice onebgc_slice362 local ['n1-012.plc1.org'] +01:== added in slice onebgd_slice363 local ['n1-013.plc1.org'] +01:== added in slice onebge_slice364 local ['n1-014.plc1.org'] +01:== added in slice onebgf_slice365 local ['n1-015.plc1.org'] +01:== added in slice onebgg_slice366 local ['n1-016.plc1.org'] +01:== added in slice onebgh_slice367 local ['n1-017.plc1.org'] +01:== added in slice onebgi_slice368 local ['n1-018.plc1.org'] +01:== added in slice onebgj_slice369 local ['n1-019.plc1.org'] +01:== added in slice onebha_slice370 local ['n1-020.plc1.org'] +01:== added in slice onebhb_slice371 local ['n1-021.plc1.org'] +01:== added in slice onebhc_slice372 local ['n1-022.plc1.org'] +01:== added in slice onebhd_slice373 local ['n1-023.plc1.org'] +01:== added in slice onebhe_slice374 local ['n1-024.plc1.org'] +01:== added in slice onebhf_slice375 local ['n1-025.plc1.org'] +01:== added in slice onebhg_slice376 local ['n1-026.plc1.org'] +01:== added in slice onebhh_slice377 local ['n1-027.plc1.org'] +01:== added in slice onebhi_slice378 local ['n1-028.plc1.org'] +01:== added in slice onebhj_slice379 local ['n1-029.plc1.org'] +01:== added in slice onebia_slice380 local ['n1-030.plc1.org'] +01:== added in slice onebib_slice381 local ['n1-031.plc1.org'] +01:== added in slice onebic_slice382 local ['n1-032.plc1.org'] +01:== added in slice onebid_slice383 local ['n1-033.plc1.org'] +01:== added in slice onebie_slice384 local ['n1-034.plc1.org'] +01:== added in slice onebif_slice385 local ['n1-035.plc1.org'] +01:== added in slice onebig_slice386 local ['n1-036.plc1.org'] +01:== added in slice onebih_slice387 local ['n1-037.plc1.org'] +01:== added in slice onebii_slice388 local ['n1-038.plc1.org'] +01:== added in slice onebij_slice389 local ['n1-039.plc1.org'] +01:== added in slice onebja_slice390 local ['n1-040.plc1.org'] +01:== added in slice onebjb_slice391 local ['n1-041.plc1.org'] +01:== added in slice onebjc_slice392 local ['n1-042.plc1.org'] +01:== added in slice onebjd_slice393 local ['n1-043.plc1.org'] +01:== added in slice onebje_slice394 local ['n1-044.plc1.org'] +01:== added in slice onebjf_slice395 local ['n1-045.plc1.org'] +01:== added in slice onebjg_slice396 local ['n1-046.plc1.org'] +01:== added in slice onebjh_slice397 local ['n1-047.plc1.org'] +01:== added in slice onebji_slice398 local ['n1-048.plc1.org'] +01:== added in slice onebjj_slice399 local ['n1-049.plc1.org'] +01:== added in slice onecaa_slice400 local ['n1-050.plc1.org'] +01:== added in slice oneb_slice401 local ['n1-051.plc1.org'] +01:== added in slice onec_slice402 local ['n1-052.plc1.org'] +01:== added in slice oned_slice403 local ['n1-053.plc1.org'] +01:== added in slice onee_slice404 local ['n1-054.plc1.org'] +01:== added in slice onef_slice405 local ['n1-055.plc1.org'] +01:== added in slice oneg_slice406 local ['n1-056.plc1.org'] +01:== added in slice oneh_slice407 local ['n1-057.plc1.org'] +01:== added in slice onei_slice408 local ['n1-058.plc1.org'] +01:== added in slice onej_slice409 local ['n1-059.plc1.org'] +01:== added in slice oneba_slice410 local ['n1-060.plc1.org'] +01:== added in slice onebb_slice411 local ['n1-061.plc1.org'] +01:== added in slice onebc_slice412 local ['n1-062.plc1.org'] +01:== added in slice onebd_slice413 local ['n1-063.plc1.org'] +01:== added in slice onebe_slice414 local ['n1-064.plc1.org'] +01:== added in slice onebf_slice415 local ['n1-065.plc1.org'] +01:== added in slice onebg_slice416 local ['n1-066.plc1.org'] +01:== added in slice onebh_slice417 local ['n1-067.plc1.org'] +01:== added in slice onebi_slice418 local ['n1-068.plc1.org'] +01:== added in slice onebj_slice419 local ['n1-069.plc1.org'] +01:== added in slice oneca_slice420 local ['n1-070.plc1.org'] +01:== added in slice onecb_slice421 local ['n1-071.plc1.org'] +01:== added in slice onecc_slice422 local ['n1-072.plc1.org'] +01:== added in slice onecd_slice423 local ['n1-073.plc1.org'] +01:== added in slice onece_slice424 local ['n1-074.plc1.org'] +01:== added in slice onecf_slice425 local ['n1-075.plc1.org'] +01:== added in slice onecg_slice426 local ['n1-076.plc1.org'] +01:== added in slice onech_slice427 local ['n1-077.plc1.org'] +01:== added in slice oneci_slice428 local ['n1-078.plc1.org'] +01:== added in slice onecj_slice429 local ['n1-079.plc1.org'] +01:== added in slice oneda_slice430 local ['n1-080.plc1.org'] +01:== added in slice onedb_slice431 local ['n1-081.plc1.org'] +01:== added in slice onedc_slice432 local ['n1-082.plc1.org'] +01:== added in slice onedd_slice433 local ['n1-083.plc1.org'] +01:== added in slice onede_slice434 local ['n1-084.plc1.org'] +01:== added in slice onedf_slice435 local ['n1-085.plc1.org'] +01:== added in slice onedg_slice436 local ['n1-086.plc1.org'] +01:== added in slice onedh_slice437 local ['n1-087.plc1.org'] +01:== added in slice onedi_slice438 local ['n1-088.plc1.org'] +01:== added in slice onedj_slice439 local ['n1-089.plc1.org'] +01:== added in slice oneea_slice440 local ['n1-090.plc1.org'] +01:== added in slice oneeb_slice441 local ['n1-091.plc1.org'] +01:== added in slice oneec_slice442 local ['n1-092.plc1.org'] +01:== added in slice oneed_slice443 local ['n1-093.plc1.org'] +01:== added in slice oneee_slice444 local ['n1-094.plc1.org'] +01:== added in slice oneef_slice445 local ['n1-095.plc1.org'] +01:== added in slice oneeg_slice446 local ['n1-096.plc1.org'] +01:== added in slice oneeh_slice447 local ['n1-097.plc1.org'] +01:== added in slice oneei_slice448 local ['n1-098.plc1.org'] +01:== added in slice oneej_slice449 local ['n1-099.plc1.org'] +01:== added in slice onefa_slice450 local ['n1-100.plc1.org'] +01:== added in slice onefb_slice451 local ['n1-101.plc1.org'] +01:== added in slice onefc_slice452 local ['n1-102.plc1.org'] +01:== added in slice onefd_slice453 local ['n1-103.plc1.org'] +01:== added in slice onefe_slice454 local ['n1-104.plc1.org'] +01:== added in slice oneff_slice455 local ['n1-105.plc1.org'] +01:== added in slice onefg_slice456 local ['n1-106.plc1.org'] +01:== added in slice onefh_slice457 local ['n1-107.plc1.org'] +01:== added in slice onefi_slice458 local ['n1-108.plc1.org'] +01:== added in slice onefj_slice459 local ['n1-109.plc1.org'] +01:== added in slice onega_slice460 local ['n1-110.plc1.org'] +01:== added in slice onegb_slice461 local ['n1-111.plc1.org'] +01:== added in slice onegc_slice462 local ['n1-112.plc1.org'] +01:== added in slice onegd_slice463 local ['n1-113.plc1.org'] +01:== added in slice onege_slice464 local ['n1-114.plc1.org'] +01:== added in slice onegf_slice465 local ['n1-115.plc1.org'] +01:== added in slice onegg_slice466 local ['n1-116.plc1.org'] +01:== added in slice onegh_slice467 local ['n1-117.plc1.org'] +01:== added in slice onegi_slice468 local ['n1-118.plc1.org'] +01:== added in slice onegj_slice469 local ['n1-119.plc1.org'] +01:== added in slice oneha_slice470 local ['n1-120.plc1.org'] +01:== added in slice onehb_slice471 local ['n1-121.plc1.org'] +01:== added in slice onehc_slice472 local ['n1-122.plc1.org'] +01:== added in slice onehd_slice473 local ['n1-123.plc1.org'] +01:== added in slice onehe_slice474 local ['n1-124.plc1.org'] +01:== added in slice onehf_slice475 local ['n1-125.plc1.org'] +01:== added in slice onehg_slice476 local ['n1-126.plc1.org'] +01:== added in slice onehh_slice477 local ['n1-127.plc1.org'] +01:== added in slice onehi_slice478 local ['n1-128.plc1.org'] +01:== added in slice onehj_slice479 local ['n1-129.plc1.org'] +01:== added in slice oneia_slice480 local ['n1-130.plc1.org'] +01:== added in slice oneib_slice481 local ['n1-131.plc1.org'] +01:== added in slice oneic_slice482 local ['n1-132.plc1.org'] +01:== added in slice oneid_slice483 local ['n1-133.plc1.org'] +01:== added in slice oneie_slice484 local ['n1-134.plc1.org'] +01:== added in slice oneif_slice485 local ['n1-135.plc1.org'] +01:== added in slice oneig_slice486 local ['n1-136.plc1.org'] +01:== added in slice oneih_slice487 local ['n1-137.plc1.org'] +01:== added in slice oneii_slice488 local ['n1-138.plc1.org'] +01:== added in slice oneij_slice489 local ['n1-139.plc1.org'] +01:== added in slice oneja_slice490 local ['n1-140.plc1.org'] +01:== added in slice onejb_slice491 local ['n1-141.plc1.org'] +01:== added in slice onejc_slice492 local ['n1-142.plc1.org'] +01:== added in slice onejd_slice493 local ['n1-143.plc1.org'] +01:== added in slice oneje_slice494 local ['n1-144.plc1.org'] +01:== added in slice onejf_slice495 local ['n1-145.plc1.org'] +01:== added in slice onejg_slice496 local ['n1-146.plc1.org'] +01:== added in slice onejh_slice497 local ['n1-147.plc1.org'] +01:== added in slice oneji_slice498 local ['n1-148.plc1.org'] +01:== added in slice onejj_slice499 local ['n1-149.plc1.org'] +01:== added in slice onebaa_slice500 local ['n1-150.plc1.org'] ++++ 168.23 seconds ellapsed (20.75) +01:== created SliceAttributeType = 23 +Dummy method GetSliceAttributeTypes on remote peer 2 skipped +Dummy method AddSliceAttributeType on remote peer 2 skipped ++++ 168.26 seconds ellapsed (0.03) +slice_name oneb_slice1 sat_name sat_1 +01:== created SliceAttribute = 6 On slice oneb_slice1 and node None +01:== created SliceAttribute = 7 On slice oneb_slice1 and node n1-001.plc1.org +slice_name oneb_slice1 sat_name vref +01:== created SliceAttribute = 8 On slice oneb_slice1 and node None +01:== created SliceAttribute = 9 On slice oneb_slice1 and node n1-001.plc1.org ++++ 168.43 seconds ellapsed (0.17) +==================== ('END',) ++++ 168.43 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-b.-2.populate.ref b/trunk/tests/testpeers.-b.-2.populate.ref new file mode 100644 index 0000000..d0bcff7 --- /dev/null +++ b/trunk/tests/testpeers.-b.-2.populate.ref @@ -0,0 +1,1603 @@ +options {'local_peer': 2, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'big'} args ['populate'] +200 sites, 500 persons, 350 nodes & 500 slices +1 keys/person, 1 nodes/slice & 3 persons/slice +fast_flag True +Running locally on index 2 +funcname populate +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +==================== ('INIT',) ++++ timer start +==================== s[1] +show_config obsoleted +==================== s[2] +show_config obsoleted +==================== +Dummy method GetPersons on remote peer 1 skipped +Dummy method AddPerson on remote peer 1 skipped +02:== created peer admin account 3, peer2@planet-lab.org - peer +Dummy method AdmSetPersonEnabled on remote peer 1 skipped +02:== enabled+admin on account 3:peer2@planet-lab.org ++++ timer start +Dummy method GetPeers on remote peer 1 skipped +Trying to locate keys for peer on plc[1] in gpg_plc2.pub and api_plc2.crt +Dummy method AddPeer on remote peer 1 skipped +01:Created peer 0 +Trying to locate keys for peer on plc[2] in gpg_plc1.pub and api_plc1.crt +02:Created peer 1 ++++ 0.35 seconds ellapsed (0.35) +Dummy method GetSites on remote peer 1 skipped +Dummy method AddSite on remote peer 1 skipped +02:== Created site 2 with max_slices=500 +02:== Created site 3 with max_slices=500 +02:== Created site 4 with max_slices=500 +02:== Created site 5 with max_slices=500 +02:== Created site 6 with max_slices=500 +02:== Created site 7 with max_slices=500 +02:== Created site 8 with max_slices=500 +02:== Created site 9 with max_slices=500 +02:== Created site 10 with max_slices=500 +02:== Created site 11 with max_slices=500 +02:== Created site 12 with max_slices=500 +02:== Created site 13 with max_slices=500 +02:== Created site 14 with max_slices=500 +02:== Created site 15 with max_slices=500 +02:== Created site 16 with max_slices=500 +02:== Created site 17 with max_slices=500 +02:== Created site 18 with max_slices=500 +02:== Created site 19 with max_slices=500 +02:== Created site 20 with max_slices=500 +02:== Created site 21 with max_slices=500 +02:== Created site 22 with max_slices=500 +02:== Created site 23 with max_slices=500 +02:== Created site 24 with max_slices=500 +02:== Created site 25 with max_slices=500 +02:== Created site 26 with max_slices=500 +02:== Created site 27 with max_slices=500 +02:== Created site 28 with max_slices=500 +02:== Created site 29 with max_slices=500 +02:== Created site 30 with max_slices=500 +02:== Created site 31 with max_slices=500 +02:== Created site 32 with max_slices=500 +02:== Created site 33 with max_slices=500 +02:== Created site 34 with max_slices=500 +02:== Created site 35 with max_slices=500 +02:== Created site 36 with max_slices=500 +02:== Created site 37 with max_slices=500 +02:== Created site 38 with max_slices=500 +02:== Created site 39 with max_slices=500 +02:== Created site 40 with max_slices=500 +02:== Created site 41 with max_slices=500 +02:== Created site 42 with max_slices=500 +02:== Created site 43 with max_slices=500 +02:== Created site 44 with max_slices=500 +02:== Created site 45 with max_slices=500 +02:== Created site 46 with max_slices=500 +02:== Created site 47 with max_slices=500 +02:== Created site 48 with max_slices=500 +02:== Created site 49 with max_slices=500 +02:== Created site 50 with max_slices=500 +02:== Created site 51 with max_slices=500 +02:== Created site 52 with max_slices=500 +02:== Created site 53 with max_slices=500 +02:== Created site 54 with max_slices=500 +02:== Created site 55 with max_slices=500 +02:== Created site 56 with max_slices=500 +02:== Created site 57 with max_slices=500 +02:== Created site 58 with max_slices=500 +02:== Created site 59 with max_slices=500 +02:== Created site 60 with max_slices=500 +02:== Created site 61 with max_slices=500 +02:== Created site 62 with max_slices=500 +02:== Created site 63 with max_slices=500 +02:== Created site 64 with max_slices=500 +02:== Created site 65 with max_slices=500 +02:== Created site 66 with max_slices=500 +02:== Created site 67 with max_slices=500 +02:== Created site 68 with max_slices=500 +02:== Created site 69 with max_slices=500 +02:== Created site 70 with max_slices=500 +02:== Created site 71 with max_slices=500 +02:== Created site 72 with max_slices=500 +02:== Created site 73 with max_slices=500 +02:== Created site 74 with max_slices=500 +02:== Created site 75 with max_slices=500 +02:== Created site 76 with max_slices=500 +02:== Created site 77 with max_slices=500 +02:== Created site 78 with max_slices=500 +02:== Created site 79 with max_slices=500 +02:== Created site 80 with max_slices=500 +02:== Created site 81 with max_slices=500 +02:== Created site 82 with max_slices=500 +02:== Created site 83 with max_slices=500 +02:== Created site 84 with max_slices=500 +02:== Created site 85 with max_slices=500 +02:== Created site 86 with max_slices=500 +02:== Created site 87 with max_slices=500 +02:== Created site 88 with max_slices=500 +02:== Created site 89 with max_slices=500 +02:== Created site 90 with max_slices=500 +02:== Created site 91 with max_slices=500 +02:== Created site 92 with max_slices=500 +02:== Created site 93 with max_slices=500 +02:== Created site 94 with max_slices=500 +02:== Created site 95 with max_slices=500 +02:== Created site 96 with max_slices=500 +02:== Created site 97 with max_slices=500 +02:== Created site 98 with max_slices=500 +02:== Created site 99 with max_slices=500 +02:== Created site 100 with max_slices=500 +02:== Created site 101 with max_slices=500 +02:== Created site 102 with max_slices=500 +02:== Created site 103 with max_slices=500 +02:== Created site 104 with max_slices=500 +02:== Created site 105 with max_slices=500 +02:== Created site 106 with max_slices=500 +02:== Created site 107 with max_slices=500 +02:== Created site 108 with max_slices=500 +02:== Created site 109 with max_slices=500 +02:== Created site 110 with max_slices=500 +02:== Created site 111 with max_slices=500 +02:== Created site 112 with max_slices=500 +02:== Created site 113 with max_slices=500 +02:== Created site 114 with max_slices=500 +02:== Created site 115 with max_slices=500 +02:== Created site 116 with max_slices=500 +02:== Created site 117 with max_slices=500 +02:== Created site 118 with max_slices=500 +02:== Created site 119 with max_slices=500 +02:== Created site 120 with max_slices=500 +02:== Created site 121 with max_slices=500 +02:== Created site 122 with max_slices=500 +02:== Created site 123 with max_slices=500 +02:== Created site 124 with max_slices=500 +02:== Created site 125 with max_slices=500 +02:== Created site 126 with max_slices=500 +02:== Created site 127 with max_slices=500 +02:== Created site 128 with max_slices=500 +02:== Created site 129 with max_slices=500 +02:== Created site 130 with max_slices=500 +02:== Created site 131 with max_slices=500 +02:== Created site 132 with max_slices=500 +02:== Created site 133 with max_slices=500 +02:== Created site 134 with max_slices=500 +02:== Created site 135 with max_slices=500 +02:== Created site 136 with max_slices=500 +02:== Created site 137 with max_slices=500 +02:== Created site 138 with max_slices=500 +02:== Created site 139 with max_slices=500 +02:== Created site 140 with max_slices=500 +02:== Created site 141 with max_slices=500 +02:== Created site 142 with max_slices=500 +02:== Created site 143 with max_slices=500 +02:== Created site 144 with max_slices=500 +02:== Created site 145 with max_slices=500 +02:== Created site 146 with max_slices=500 +02:== Created site 147 with max_slices=500 +02:== Created site 148 with max_slices=500 +02:== Created site 149 with max_slices=500 +02:== Created site 150 with max_slices=500 +02:== Created site 151 with max_slices=500 +02:== Created site 152 with max_slices=500 +02:== Created site 153 with max_slices=500 +02:== Created site 154 with max_slices=500 +02:== Created site 155 with max_slices=500 +02:== Created site 156 with max_slices=500 +02:== Created site 157 with max_slices=500 +02:== Created site 158 with max_slices=500 +02:== Created site 159 with max_slices=500 +02:== Created site 160 with max_slices=500 +02:== Created site 161 with max_slices=500 +02:== Created site 162 with max_slices=500 +02:== Created site 163 with max_slices=500 +02:== Created site 164 with max_slices=500 +02:== Created site 165 with max_slices=500 +02:== Created site 166 with max_slices=500 +02:== Created site 167 with max_slices=500 +02:== Created site 168 with max_slices=500 +02:== Created site 169 with max_slices=500 +02:== Created site 170 with max_slices=500 +02:== Created site 171 with max_slices=500 +02:== Created site 172 with max_slices=500 +02:== Created site 173 with max_slices=500 +02:== Created site 174 with max_slices=500 +02:== Created site 175 with max_slices=500 +02:== Created site 176 with max_slices=500 +02:== Created site 177 with max_slices=500 +02:== Created site 178 with max_slices=500 +02:== Created site 179 with max_slices=500 +02:== Created site 180 with max_slices=500 +02:== Created site 181 with max_slices=500 +02:== Created site 182 with max_slices=500 +02:== Created site 183 with max_slices=500 +02:== Created site 184 with max_slices=500 +02:== Created site 185 with max_slices=500 +02:== Created site 186 with max_slices=500 +02:== Created site 187 with max_slices=500 +02:== Created site 188 with max_slices=500 +02:== Created site 189 with max_slices=500 +02:== Created site 190 with max_slices=500 +02:== Created site 191 with max_slices=500 +02:== Created site 192 with max_slices=500 +02:== Created site 193 with max_slices=500 +02:== Created site 194 with max_slices=500 +02:== Created site 195 with max_slices=500 +02:== Created site 196 with max_slices=500 +02:== Created site 197 with max_slices=500 +02:== Created site 198 with max_slices=500 +02:== Created site 199 with max_slices=500 +02:== Created site 200 with max_slices=500 +02:== Created site 201 with max_slices=500 ++++ 16.43 seconds ellapsed (16.08) +Dummy method GetPersons on remote peer 1 skipped +Dummy method AddPerson on remote peer 1 skipped +02:== created user account 4, user-1@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org +02:== created user account 5, user-2@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user2-key1 to person user-2@plc.org +02:== created user account 6, user-3@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user3-key1 to person user-3@plc.org +02:== created user account 7, user-4@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user4-key1 to person user-4@plc.org +02:== created user account 8, user-5@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user5-key1 to person user-5@plc.org +02:== created user account 9, user-6@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user6-key1 to person user-6@plc.org +02:== created user account 10, user-7@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user7-key1 to person user-7@plc.org +02:== created user account 11, user-8@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user8-key1 to person user-8@plc.org +02:== created user account 12, user-9@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user9-key1 to person user-9@plc.org +02:== created user account 13, user-10@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user10-key1 to person user-10@plc.org +02:== created user account 14, user-11@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user11-key1 to person user-11@plc.org +02:== created user account 15, user-12@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user12-key1 to person user-12@plc.org +02:== created user account 16, user-13@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user13-key1 to person user-13@plc.org +02:== created user account 17, user-14@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user14-key1 to person user-14@plc.org +02:== created user account 18, user-15@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user15-key1 to person user-15@plc.org +02:== created user account 19, user-16@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user16-key1 to person user-16@plc.org +02:== created user account 20, user-17@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user17-key1 to person user-17@plc.org +02:== created user account 21, user-18@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user18-key1 to person user-18@plc.org +02:== created user account 22, user-19@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user19-key1 to person user-19@plc.org +02:== created user account 23, user-20@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user20-key1 to person user-20@plc.org +02:== created user account 24, user-21@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user21-key1 to person user-21@plc.org +02:== created user account 25, user-22@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user22-key1 to person user-22@plc.org +02:== created user account 26, user-23@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user23-key1 to person user-23@plc.org +02:== created user account 27, user-24@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user24-key1 to person user-24@plc.org +02:== created user account 28, user-25@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user25-key1 to person user-25@plc.org +02:== created user account 29, user-26@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user26-key1 to person user-26@plc.org +02:== created user account 30, user-27@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user27-key1 to person user-27@plc.org +02:== created user account 31, user-28@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user28-key1 to person user-28@plc.org +02:== created user account 32, user-29@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user29-key1 to person user-29@plc.org +02:== created user account 33, user-30@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user30-key1 to person user-30@plc.org +02:== created user account 34, user-31@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user31-key1 to person user-31@plc.org +02:== created user account 35, user-32@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user32-key1 to person user-32@plc.org +02:== created user account 36, user-33@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user33-key1 to person user-33@plc.org +02:== created user account 37, user-34@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user34-key1 to person user-34@plc.org +02:== created user account 38, user-35@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user35-key1 to person user-35@plc.org +02:== created user account 39, user-36@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user36-key1 to person user-36@plc.org +02:== created user account 40, user-37@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user37-key1 to person user-37@plc.org +02:== created user account 41, user-38@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user38-key1 to person user-38@plc.org +02:== created user account 42, user-39@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user39-key1 to person user-39@plc.org +02:== created user account 43, user-40@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user40-key1 to person user-40@plc.org +02:== created user account 44, user-41@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user41-key1 to person user-41@plc.org +02:== created user account 45, user-42@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user42-key1 to person user-42@plc.org +02:== created user account 46, user-43@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user43-key1 to person user-43@plc.org +02:== created user account 47, user-44@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user44-key1 to person user-44@plc.org +02:== created user account 48, user-45@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user45-key1 to person user-45@plc.org +02:== created user account 49, user-46@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user46-key1 to person user-46@plc.org +02:== created user account 50, user-47@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user47-key1 to person user-47@plc.org +02:== created user account 51, user-48@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user48-key1 to person user-48@plc.org +02:== created user account 52, user-49@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user49-key1 to person user-49@plc.org +02:== created user account 53, user-50@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user50-key1 to person user-50@plc.org +02:== created user account 54, user-51@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user51-key1 to person user-51@plc.org +02:== created user account 55, user-52@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user52-key1 to person user-52@plc.org +02:== created user account 56, user-53@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user53-key1 to person user-53@plc.org +02:== created user account 57, user-54@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user54-key1 to person user-54@plc.org +02:== created user account 58, user-55@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user55-key1 to person user-55@plc.org +02:== created user account 59, user-56@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user56-key1 to person user-56@plc.org +02:== created user account 60, user-57@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user57-key1 to person user-57@plc.org +02:== created user account 61, user-58@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user58-key1 to person user-58@plc.org +02:== created user account 62, user-59@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user59-key1 to person user-59@plc.org +02:== created user account 63, user-60@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user60-key1 to person user-60@plc.org +02:== created user account 64, user-61@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user61-key1 to person user-61@plc.org +02:== created user account 65, user-62@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user62-key1 to person user-62@plc.org +02:== created user account 66, user-63@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user63-key1 to person user-63@plc.org +02:== created user account 67, user-64@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user64-key1 to person user-64@plc.org +02:== created user account 68, user-65@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user65-key1 to person user-65@plc.org +02:== created user account 69, user-66@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user66-key1 to person user-66@plc.org +02:== created user account 70, user-67@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user67-key1 to person user-67@plc.org +02:== created user account 71, user-68@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user68-key1 to person user-68@plc.org +02:== created user account 72, user-69@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user69-key1 to person user-69@plc.org +02:== created user account 73, user-70@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user70-key1 to person user-70@plc.org +02:== created user account 74, user-71@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user71-key1 to person user-71@plc.org +02:== created user account 75, user-72@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user72-key1 to person user-72@plc.org +02:== created user account 76, user-73@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user73-key1 to person user-73@plc.org +02:== created user account 77, user-74@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user74-key1 to person user-74@plc.org +02:== created user account 78, user-75@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user75-key1 to person user-75@plc.org +02:== created user account 79, user-76@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user76-key1 to person user-76@plc.org +02:== created user account 80, user-77@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user77-key1 to person user-77@plc.org +02:== created user account 81, user-78@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user78-key1 to person user-78@plc.org +02:== created user account 82, user-79@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user79-key1 to person user-79@plc.org +02:== created user account 83, user-80@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user80-key1 to person user-80@plc.org +02:== created user account 84, user-81@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user81-key1 to person user-81@plc.org +02:== created user account 85, user-82@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user82-key1 to person user-82@plc.org +02:== created user account 86, user-83@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user83-key1 to person user-83@plc.org +02:== created user account 87, user-84@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user84-key1 to person user-84@plc.org +02:== created user account 88, user-85@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user85-key1 to person user-85@plc.org +02:== created user account 89, user-86@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user86-key1 to person user-86@plc.org +02:== created user account 90, user-87@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user87-key1 to person user-87@plc.org +02:== created user account 91, user-88@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user88-key1 to person user-88@plc.org +02:== created user account 92, user-89@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user89-key1 to person user-89@plc.org +02:== created user account 93, user-90@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user90-key1 to person user-90@plc.org +02:== created user account 94, user-91@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user91-key1 to person user-91@plc.org +02:== created user account 95, user-92@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user92-key1 to person user-92@plc.org +02:== created user account 96, user-93@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user93-key1 to person user-93@plc.org +02:== created user account 97, user-94@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user94-key1 to person user-94@plc.org +02:== created user account 98, user-95@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user95-key1 to person user-95@plc.org +02:== created user account 99, user-96@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user96-key1 to person user-96@plc.org +02:== created user account 100, user-97@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user97-key1 to person user-97@plc.org +02:== created user account 101, user-98@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user98-key1 to person user-98@plc.org +02:== created user account 102, user-99@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user99-key1 to person user-99@plc.org +02:== created user account 103, user-100@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user100-key1 to person user-100@plc.org +02:== created user account 104, user-101@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user101-key1 to person user-101@plc.org +02:== created user account 105, user-102@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user102-key1 to person user-102@plc.org +02:== created user account 106, user-103@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user103-key1 to person user-103@plc.org +02:== created user account 107, user-104@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user104-key1 to person user-104@plc.org +02:== created user account 108, user-105@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user105-key1 to person user-105@plc.org +02:== created user account 109, user-106@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user106-key1 to person user-106@plc.org +02:== created user account 110, user-107@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user107-key1 to person user-107@plc.org +02:== created user account 111, user-108@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user108-key1 to person user-108@plc.org +02:== created user account 112, user-109@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user109-key1 to person user-109@plc.org +02:== created user account 113, user-110@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user110-key1 to person user-110@plc.org +02:== created user account 114, user-111@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user111-key1 to person user-111@plc.org +02:== created user account 115, user-112@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user112-key1 to person user-112@plc.org +02:== created user account 116, user-113@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user113-key1 to person user-113@plc.org +02:== created user account 117, user-114@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user114-key1 to person user-114@plc.org +02:== created user account 118, user-115@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user115-key1 to person user-115@plc.org +02:== created user account 119, user-116@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user116-key1 to person user-116@plc.org +02:== created user account 120, user-117@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user117-key1 to person user-117@plc.org +02:== created user account 121, user-118@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user118-key1 to person user-118@plc.org +02:== created user account 122, user-119@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user119-key1 to person user-119@plc.org +02:== created user account 123, user-120@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user120-key1 to person user-120@plc.org +02:== created user account 124, user-121@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user121-key1 to person user-121@plc.org +02:== created user account 125, user-122@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user122-key1 to person user-122@plc.org +02:== created user account 126, user-123@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user123-key1 to person user-123@plc.org +02:== created user account 127, user-124@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user124-key1 to person user-124@plc.org +02:== created user account 128, user-125@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user125-key1 to person user-125@plc.org +02:== created user account 129, user-126@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user126-key1 to person user-126@plc.org +02:== created user account 130, user-127@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user127-key1 to person user-127@plc.org +02:== created user account 131, user-128@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user128-key1 to person user-128@plc.org +02:== created user account 132, user-129@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user129-key1 to person user-129@plc.org +02:== created user account 133, user-130@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user130-key1 to person user-130@plc.org +02:== created user account 134, user-131@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user131-key1 to person user-131@plc.org +02:== created user account 135, user-132@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user132-key1 to person user-132@plc.org +02:== created user account 136, user-133@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user133-key1 to person user-133@plc.org +02:== created user account 137, user-134@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user134-key1 to person user-134@plc.org +02:== created user account 138, user-135@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user135-key1 to person user-135@plc.org +02:== created user account 139, user-136@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user136-key1 to person user-136@plc.org +02:== created user account 140, user-137@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user137-key1 to person user-137@plc.org +02:== created user account 141, user-138@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user138-key1 to person user-138@plc.org +02:== created user account 142, user-139@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user139-key1 to person user-139@plc.org +02:== created user account 143, user-140@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user140-key1 to person user-140@plc.org +02:== created user account 144, user-141@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user141-key1 to person user-141@plc.org +02:== created user account 145, user-142@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user142-key1 to person user-142@plc.org +02:== created user account 146, user-143@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user143-key1 to person user-143@plc.org +02:== created user account 147, user-144@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user144-key1 to person user-144@plc.org +02:== created user account 148, user-145@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user145-key1 to person user-145@plc.org +02:== created user account 149, user-146@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user146-key1 to person user-146@plc.org +02:== created user account 150, user-147@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user147-key1 to person user-147@plc.org +02:== created user account 151, user-148@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user148-key1 to person user-148@plc.org +02:== created user account 152, user-149@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user149-key1 to person user-149@plc.org +02:== created user account 153, user-150@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user150-key1 to person user-150@plc.org +02:== created user account 154, user-151@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user151-key1 to person user-151@plc.org +02:== created user account 155, user-152@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user152-key1 to person user-152@plc.org +02:== created user account 156, user-153@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user153-key1 to person user-153@plc.org +02:== created user account 157, user-154@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user154-key1 to person user-154@plc.org +02:== created user account 158, user-155@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user155-key1 to person user-155@plc.org +02:== created user account 159, user-156@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user156-key1 to person user-156@plc.org +02:== created user account 160, user-157@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user157-key1 to person user-157@plc.org +02:== created user account 161, user-158@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user158-key1 to person user-158@plc.org +02:== created user account 162, user-159@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user159-key1 to person user-159@plc.org +02:== created user account 163, user-160@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user160-key1 to person user-160@plc.org +02:== created user account 164, user-161@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user161-key1 to person user-161@plc.org +02:== created user account 165, user-162@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user162-key1 to person user-162@plc.org +02:== created user account 166, user-163@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user163-key1 to person user-163@plc.org +02:== created user account 167, user-164@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user164-key1 to person user-164@plc.org +02:== created user account 168, user-165@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user165-key1 to person user-165@plc.org +02:== created user account 169, user-166@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user166-key1 to person user-166@plc.org +02:== created user account 170, user-167@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user167-key1 to person user-167@plc.org +02:== created user account 171, user-168@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user168-key1 to person user-168@plc.org +02:== created user account 172, user-169@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user169-key1 to person user-169@plc.org +02:== created user account 173, user-170@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user170-key1 to person user-170@plc.org +02:== created user account 174, user-171@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user171-key1 to person user-171@plc.org +02:== created user account 175, user-172@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user172-key1 to person user-172@plc.org +02:== created user account 176, user-173@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user173-key1 to person user-173@plc.org +02:== created user account 177, user-174@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user174-key1 to person user-174@plc.org +02:== created user account 178, user-175@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user175-key1 to person user-175@plc.org +02:== created user account 179, user-176@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user176-key1 to person user-176@plc.org +02:== created user account 180, user-177@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user177-key1 to person user-177@plc.org +02:== created user account 181, user-178@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user178-key1 to person user-178@plc.org +02:== created user account 182, user-179@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user179-key1 to person user-179@plc.org +02:== created user account 183, user-180@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user180-key1 to person user-180@plc.org +02:== created user account 184, user-181@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user181-key1 to person user-181@plc.org +02:== created user account 185, user-182@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user182-key1 to person user-182@plc.org +02:== created user account 186, user-183@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user183-key1 to person user-183@plc.org +02:== created user account 187, user-184@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user184-key1 to person user-184@plc.org +02:== created user account 188, user-185@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user185-key1 to person user-185@plc.org +02:== created user account 189, user-186@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user186-key1 to person user-186@plc.org +02:== created user account 190, user-187@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user187-key1 to person user-187@plc.org +02:== created user account 191, user-188@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user188-key1 to person user-188@plc.org +02:== created user account 192, user-189@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user189-key1 to person user-189@plc.org +02:== created user account 193, user-190@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user190-key1 to person user-190@plc.org +02:== created user account 194, user-191@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user191-key1 to person user-191@plc.org +02:== created user account 195, user-192@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user192-key1 to person user-192@plc.org +02:== created user account 196, user-193@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user193-key1 to person user-193@plc.org +02:== created user account 197, user-194@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user194-key1 to person user-194@plc.org +02:== created user account 198, user-195@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user195-key1 to person user-195@plc.org +02:== created user account 199, user-196@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user196-key1 to person user-196@plc.org +02:== created user account 200, user-197@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user197-key1 to person user-197@plc.org +02:== created user account 201, user-198@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user198-key1 to person user-198@plc.org +02:== created user account 202, user-199@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user199-key1 to person user-199@plc.org +02:== created user account 203, user-200@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user200-key1 to person user-200@plc.org +02:== created user account 204, user-201@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user201-key1 to person user-201@plc.org +02:== created user account 205, user-202@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user202-key1 to person user-202@plc.org +02:== created user account 206, user-203@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user203-key1 to person user-203@plc.org +02:== created user account 207, user-204@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user204-key1 to person user-204@plc.org +02:== created user account 208, user-205@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user205-key1 to person user-205@plc.org +02:== created user account 209, user-206@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user206-key1 to person user-206@plc.org +02:== created user account 210, user-207@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user207-key1 to person user-207@plc.org +02:== created user account 211, user-208@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user208-key1 to person user-208@plc.org +02:== created user account 212, user-209@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user209-key1 to person user-209@plc.org +02:== created user account 213, user-210@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user210-key1 to person user-210@plc.org +02:== created user account 214, user-211@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user211-key1 to person user-211@plc.org +02:== created user account 215, user-212@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user212-key1 to person user-212@plc.org +02:== created user account 216, user-213@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user213-key1 to person user-213@plc.org +02:== created user account 217, user-214@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user214-key1 to person user-214@plc.org +02:== created user account 218, user-215@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user215-key1 to person user-215@plc.org +02:== created user account 219, user-216@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user216-key1 to person user-216@plc.org +02:== created user account 220, user-217@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user217-key1 to person user-217@plc.org +02:== created user account 221, user-218@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user218-key1 to person user-218@plc.org +02:== created user account 222, user-219@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user219-key1 to person user-219@plc.org +02:== created user account 223, user-220@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user220-key1 to person user-220@plc.org +02:== created user account 224, user-221@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user221-key1 to person user-221@plc.org +02:== created user account 225, user-222@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user222-key1 to person user-222@plc.org +02:== created user account 226, user-223@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user223-key1 to person user-223@plc.org +02:== created user account 227, user-224@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user224-key1 to person user-224@plc.org +02:== created user account 228, user-225@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user225-key1 to person user-225@plc.org +02:== created user account 229, user-226@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user226-key1 to person user-226@plc.org +02:== created user account 230, user-227@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user227-key1 to person user-227@plc.org +02:== created user account 231, user-228@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user228-key1 to person user-228@plc.org +02:== created user account 232, user-229@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user229-key1 to person user-229@plc.org +02:== created user account 233, user-230@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user230-key1 to person user-230@plc.org +02:== created user account 234, user-231@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user231-key1 to person user-231@plc.org +02:== created user account 235, user-232@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user232-key1 to person user-232@plc.org +02:== created user account 236, user-233@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user233-key1 to person user-233@plc.org +02:== created user account 237, user-234@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user234-key1 to person user-234@plc.org +02:== created user account 238, user-235@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user235-key1 to person user-235@plc.org +02:== created user account 239, user-236@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user236-key1 to person user-236@plc.org +02:== created user account 240, user-237@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user237-key1 to person user-237@plc.org +02:== created user account 241, user-238@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user238-key1 to person user-238@plc.org +02:== created user account 242, user-239@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user239-key1 to person user-239@plc.org +02:== created user account 243, user-240@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user240-key1 to person user-240@plc.org +02:== created user account 244, user-241@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user241-key1 to person user-241@plc.org +02:== created user account 245, user-242@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user242-key1 to person user-242@plc.org +02:== created user account 246, user-243@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user243-key1 to person user-243@plc.org +02:== created user account 247, user-244@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user244-key1 to person user-244@plc.org +02:== created user account 248, user-245@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user245-key1 to person user-245@plc.org +02:== created user account 249, user-246@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user246-key1 to person user-246@plc.org +02:== created user account 250, user-247@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user247-key1 to person user-247@plc.org +02:== created user account 251, user-248@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user248-key1 to person user-248@plc.org +02:== created user account 252, user-249@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user249-key1 to person user-249@plc.org +02:== created user account 253, user-250@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user250-key1 to person user-250@plc.org +02:== created user account 254, user-251@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user251-key1 to person user-251@plc.org +02:== created user account 255, user-252@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user252-key1 to person user-252@plc.org +02:== created user account 256, user-253@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user253-key1 to person user-253@plc.org +02:== created user account 257, user-254@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user254-key1 to person user-254@plc.org +02:== created user account 258, user-255@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user255-key1 to person user-255@plc.org +02:== created user account 259, user-256@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user256-key1 to person user-256@plc.org +02:== created user account 260, user-257@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user257-key1 to person user-257@plc.org +02:== created user account 261, user-258@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user258-key1 to person user-258@plc.org +02:== created user account 262, user-259@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user259-key1 to person user-259@plc.org +02:== created user account 263, user-260@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user260-key1 to person user-260@plc.org +02:== created user account 264, user-261@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user261-key1 to person user-261@plc.org +02:== created user account 265, user-262@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user262-key1 to person user-262@plc.org +02:== created user account 266, user-263@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user263-key1 to person user-263@plc.org +02:== created user account 267, user-264@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user264-key1 to person user-264@plc.org +02:== created user account 268, user-265@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user265-key1 to person user-265@plc.org +02:== created user account 269, user-266@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user266-key1 to person user-266@plc.org +02:== created user account 270, user-267@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user267-key1 to person user-267@plc.org +02:== created user account 271, user-268@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user268-key1 to person user-268@plc.org +02:== created user account 272, user-269@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user269-key1 to person user-269@plc.org +02:== created user account 273, user-270@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user270-key1 to person user-270@plc.org +02:== created user account 274, user-271@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user271-key1 to person user-271@plc.org +02:== created user account 275, user-272@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user272-key1 to person user-272@plc.org +02:== created user account 276, user-273@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user273-key1 to person user-273@plc.org +02:== created user account 277, user-274@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user274-key1 to person user-274@plc.org +02:== created user account 278, user-275@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user275-key1 to person user-275@plc.org +02:== created user account 279, user-276@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user276-key1 to person user-276@plc.org +02:== created user account 280, user-277@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user277-key1 to person user-277@plc.org +02:== created user account 281, user-278@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user278-key1 to person user-278@plc.org +02:== created user account 282, user-279@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user279-key1 to person user-279@plc.org +02:== created user account 283, user-280@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user280-key1 to person user-280@plc.org +02:== created user account 284, user-281@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user281-key1 to person user-281@plc.org +02:== created user account 285, user-282@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user282-key1 to person user-282@plc.org +02:== created user account 286, user-283@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user283-key1 to person user-283@plc.org +02:== created user account 287, user-284@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user284-key1 to person user-284@plc.org +02:== created user account 288, user-285@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user285-key1 to person user-285@plc.org +02:== created user account 289, user-286@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user286-key1 to person user-286@plc.org +02:== created user account 290, user-287@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user287-key1 to person user-287@plc.org +02:== created user account 291, user-288@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user288-key1 to person user-288@plc.org +02:== created user account 292, user-289@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user289-key1 to person user-289@plc.org +02:== created user account 293, user-290@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user290-key1 to person user-290@plc.org +02:== created user account 294, user-291@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user291-key1 to person user-291@plc.org +02:== created user account 295, user-292@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user292-key1 to person user-292@plc.org +02:== created user account 296, user-293@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user293-key1 to person user-293@plc.org +02:== created user account 297, user-294@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user294-key1 to person user-294@plc.org +02:== created user account 298, user-295@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user295-key1 to person user-295@plc.org +02:== created user account 299, user-296@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user296-key1 to person user-296@plc.org +02:== created user account 300, user-297@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user297-key1 to person user-297@plc.org +02:== created user account 301, user-298@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user298-key1 to person user-298@plc.org +02:== created user account 302, user-299@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user299-key1 to person user-299@plc.org +02:== created user account 303, user-300@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user300-key1 to person user-300@plc.org +02:== created user account 304, user-301@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user301-key1 to person user-301@plc.org +02:== created user account 305, user-302@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user302-key1 to person user-302@plc.org +02:== created user account 306, user-303@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user303-key1 to person user-303@plc.org +02:== created user account 307, user-304@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user304-key1 to person user-304@plc.org +02:== created user account 308, user-305@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user305-key1 to person user-305@plc.org +02:== created user account 309, user-306@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user306-key1 to person user-306@plc.org +02:== created user account 310, user-307@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user307-key1 to person user-307@plc.org +02:== created user account 311, user-308@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user308-key1 to person user-308@plc.org +02:== created user account 312, user-309@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user309-key1 to person user-309@plc.org +02:== created user account 313, user-310@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user310-key1 to person user-310@plc.org +02:== created user account 314, user-311@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user311-key1 to person user-311@plc.org +02:== created user account 315, user-312@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user312-key1 to person user-312@plc.org +02:== created user account 316, user-313@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user313-key1 to person user-313@plc.org +02:== created user account 317, user-314@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user314-key1 to person user-314@plc.org +02:== created user account 318, user-315@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user315-key1 to person user-315@plc.org +02:== created user account 319, user-316@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user316-key1 to person user-316@plc.org +02:== created user account 320, user-317@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user317-key1 to person user-317@plc.org +02:== created user account 321, user-318@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user318-key1 to person user-318@plc.org +02:== created user account 322, user-319@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user319-key1 to person user-319@plc.org +02:== created user account 323, user-320@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user320-key1 to person user-320@plc.org +02:== created user account 324, user-321@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user321-key1 to person user-321@plc.org +02:== created user account 325, user-322@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user322-key1 to person user-322@plc.org +02:== created user account 326, user-323@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user323-key1 to person user-323@plc.org +02:== created user account 327, user-324@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user324-key1 to person user-324@plc.org +02:== created user account 328, user-325@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user325-key1 to person user-325@plc.org +02:== created user account 329, user-326@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user326-key1 to person user-326@plc.org +02:== created user account 330, user-327@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user327-key1 to person user-327@plc.org +02:== created user account 331, user-328@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user328-key1 to person user-328@plc.org +02:== created user account 332, user-329@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user329-key1 to person user-329@plc.org +02:== created user account 333, user-330@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user330-key1 to person user-330@plc.org +02:== created user account 334, user-331@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user331-key1 to person user-331@plc.org +02:== created user account 335, user-332@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user332-key1 to person user-332@plc.org +02:== created user account 336, user-333@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user333-key1 to person user-333@plc.org +02:== created user account 337, user-334@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user334-key1 to person user-334@plc.org +02:== created user account 338, user-335@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user335-key1 to person user-335@plc.org +02:== created user account 339, user-336@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user336-key1 to person user-336@plc.org +02:== created user account 340, user-337@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user337-key1 to person user-337@plc.org +02:== created user account 341, user-338@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user338-key1 to person user-338@plc.org +02:== created user account 342, user-339@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user339-key1 to person user-339@plc.org +02:== created user account 343, user-340@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user340-key1 to person user-340@plc.org +02:== created user account 344, user-341@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user341-key1 to person user-341@plc.org +02:== created user account 345, user-342@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user342-key1 to person user-342@plc.org +02:== created user account 346, user-343@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user343-key1 to person user-343@plc.org +02:== created user account 347, user-344@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user344-key1 to person user-344@plc.org +02:== created user account 348, user-345@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user345-key1 to person user-345@plc.org +02:== created user account 349, user-346@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user346-key1 to person user-346@plc.org +02:== created user account 350, user-347@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user347-key1 to person user-347@plc.org +02:== created user account 351, user-348@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user348-key1 to person user-348@plc.org +02:== created user account 352, user-349@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user349-key1 to person user-349@plc.org +02:== created user account 353, user-350@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user350-key1 to person user-350@plc.org +02:== created user account 354, user-351@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user351-key1 to person user-351@plc.org +02:== created user account 355, user-352@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user352-key1 to person user-352@plc.org +02:== created user account 356, user-353@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user353-key1 to person user-353@plc.org +02:== created user account 357, user-354@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user354-key1 to person user-354@plc.org +02:== created user account 358, user-355@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user355-key1 to person user-355@plc.org +02:== created user account 359, user-356@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user356-key1 to person user-356@plc.org +02:== created user account 360, user-357@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user357-key1 to person user-357@plc.org +02:== created user account 361, user-358@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user358-key1 to person user-358@plc.org +02:== created user account 362, user-359@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user359-key1 to person user-359@plc.org +02:== created user account 363, user-360@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user360-key1 to person user-360@plc.org +02:== created user account 364, user-361@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user361-key1 to person user-361@plc.org +02:== created user account 365, user-362@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user362-key1 to person user-362@plc.org +02:== created user account 366, user-363@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user363-key1 to person user-363@plc.org +02:== created user account 367, user-364@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user364-key1 to person user-364@plc.org +02:== created user account 368, user-365@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user365-key1 to person user-365@plc.org +02:== created user account 369, user-366@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user366-key1 to person user-366@plc.org +02:== created user account 370, user-367@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user367-key1 to person user-367@plc.org +02:== created user account 371, user-368@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user368-key1 to person user-368@plc.org +02:== created user account 372, user-369@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user369-key1 to person user-369@plc.org +02:== created user account 373, user-370@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user370-key1 to person user-370@plc.org +02:== created user account 374, user-371@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user371-key1 to person user-371@plc.org +02:== created user account 375, user-372@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user372-key1 to person user-372@plc.org +02:== created user account 376, user-373@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user373-key1 to person user-373@plc.org +02:== created user account 377, user-374@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user374-key1 to person user-374@plc.org +02:== created user account 378, user-375@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user375-key1 to person user-375@plc.org +02:== created user account 379, user-376@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user376-key1 to person user-376@plc.org +02:== created user account 380, user-377@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user377-key1 to person user-377@plc.org +02:== created user account 381, user-378@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user378-key1 to person user-378@plc.org +02:== created user account 382, user-379@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user379-key1 to person user-379@plc.org +02:== created user account 383, user-380@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user380-key1 to person user-380@plc.org +02:== created user account 384, user-381@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user381-key1 to person user-381@plc.org +02:== created user account 385, user-382@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user382-key1 to person user-382@plc.org +02:== created user account 386, user-383@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user383-key1 to person user-383@plc.org +02:== created user account 387, user-384@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user384-key1 to person user-384@plc.org +02:== created user account 388, user-385@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user385-key1 to person user-385@plc.org +02:== created user account 389, user-386@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user386-key1 to person user-386@plc.org +02:== created user account 390, user-387@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user387-key1 to person user-387@plc.org +02:== created user account 391, user-388@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user388-key1 to person user-388@plc.org +02:== created user account 392, user-389@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user389-key1 to person user-389@plc.org +02:== created user account 393, user-390@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user390-key1 to person user-390@plc.org +02:== created user account 394, user-391@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user391-key1 to person user-391@plc.org +02:== created user account 395, user-392@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user392-key1 to person user-392@plc.org +02:== created user account 396, user-393@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user393-key1 to person user-393@plc.org +02:== created user account 397, user-394@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user394-key1 to person user-394@plc.org +02:== created user account 398, user-395@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user395-key1 to person user-395@plc.org +02:== created user account 399, user-396@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user396-key1 to person user-396@plc.org +02:== created user account 400, user-397@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user397-key1 to person user-397@plc.org +02:== created user account 401, user-398@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user398-key1 to person user-398@plc.org +02:== created user account 402, user-399@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user399-key1 to person user-399@plc.org +02:== created user account 403, user-400@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user400-key1 to person user-400@plc.org +02:== created user account 404, user-401@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user401-key1 to person user-401@plc.org +02:== created user account 405, user-402@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user402-key1 to person user-402@plc.org +02:== created user account 406, user-403@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user403-key1 to person user-403@plc.org +02:== created user account 407, user-404@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user404-key1 to person user-404@plc.org +02:== created user account 408, user-405@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user405-key1 to person user-405@plc.org +02:== created user account 409, user-406@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user406-key1 to person user-406@plc.org +02:== created user account 410, user-407@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user407-key1 to person user-407@plc.org +02:== created user account 411, user-408@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user408-key1 to person user-408@plc.org +02:== created user account 412, user-409@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user409-key1 to person user-409@plc.org +02:== created user account 413, user-410@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user410-key1 to person user-410@plc.org +02:== created user account 414, user-411@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user411-key1 to person user-411@plc.org +02:== created user account 415, user-412@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user412-key1 to person user-412@plc.org +02:== created user account 416, user-413@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user413-key1 to person user-413@plc.org +02:== created user account 417, user-414@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user414-key1 to person user-414@plc.org +02:== created user account 418, user-415@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user415-key1 to person user-415@plc.org +02:== created user account 419, user-416@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user416-key1 to person user-416@plc.org +02:== created user account 420, user-417@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user417-key1 to person user-417@plc.org +02:== created user account 421, user-418@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user418-key1 to person user-418@plc.org +02:== created user account 422, user-419@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user419-key1 to person user-419@plc.org +02:== created user account 423, user-420@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user420-key1 to person user-420@plc.org +02:== created user account 424, user-421@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user421-key1 to person user-421@plc.org +02:== created user account 425, user-422@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user422-key1 to person user-422@plc.org +02:== created user account 426, user-423@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user423-key1 to person user-423@plc.org +02:== created user account 427, user-424@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user424-key1 to person user-424@plc.org +02:== created user account 428, user-425@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user425-key1 to person user-425@plc.org +02:== created user account 429, user-426@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user426-key1 to person user-426@plc.org +02:== created user account 430, user-427@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user427-key1 to person user-427@plc.org +02:== created user account 431, user-428@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user428-key1 to person user-428@plc.org +02:== created user account 432, user-429@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user429-key1 to person user-429@plc.org +02:== created user account 433, user-430@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user430-key1 to person user-430@plc.org +02:== created user account 434, user-431@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user431-key1 to person user-431@plc.org +02:== created user account 435, user-432@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user432-key1 to person user-432@plc.org +02:== created user account 436, user-433@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user433-key1 to person user-433@plc.org +02:== created user account 437, user-434@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user434-key1 to person user-434@plc.org +02:== created user account 438, user-435@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user435-key1 to person user-435@plc.org +02:== created user account 439, user-436@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user436-key1 to person user-436@plc.org +02:== created user account 440, user-437@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user437-key1 to person user-437@plc.org +02:== created user account 441, user-438@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user438-key1 to person user-438@plc.org +02:== created user account 442, user-439@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user439-key1 to person user-439@plc.org +02:== created user account 443, user-440@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user440-key1 to person user-440@plc.org +02:== created user account 444, user-441@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user441-key1 to person user-441@plc.org +02:== created user account 445, user-442@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user442-key1 to person user-442@plc.org +02:== created user account 446, user-443@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user443-key1 to person user-443@plc.org +02:== created user account 447, user-444@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user444-key1 to person user-444@plc.org +02:== created user account 448, user-445@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user445-key1 to person user-445@plc.org +02:== created user account 449, user-446@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user446-key1 to person user-446@plc.org +02:== created user account 450, user-447@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user447-key1 to person user-447@plc.org +02:== created user account 451, user-448@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user448-key1 to person user-448@plc.org +02:== created user account 452, user-449@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user449-key1 to person user-449@plc.org +02:== created user account 453, user-450@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user450-key1 to person user-450@plc.org +02:== created user account 454, user-451@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user451-key1 to person user-451@plc.org +02:== created user account 455, user-452@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user452-key1 to person user-452@plc.org +02:== created user account 456, user-453@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user453-key1 to person user-453@plc.org +02:== created user account 457, user-454@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user454-key1 to person user-454@plc.org +02:== created user account 458, user-455@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user455-key1 to person user-455@plc.org +02:== created user account 459, user-456@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user456-key1 to person user-456@plc.org +02:== created user account 460, user-457@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user457-key1 to person user-457@plc.org +02:== created user account 461, user-458@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user458-key1 to person user-458@plc.org +02:== created user account 462, user-459@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user459-key1 to person user-459@plc.org +02:== created user account 463, user-460@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user460-key1 to person user-460@plc.org +02:== created user account 464, user-461@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user461-key1 to person user-461@plc.org +02:== created user account 465, user-462@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user462-key1 to person user-462@plc.org +02:== created user account 466, user-463@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user463-key1 to person user-463@plc.org +02:== created user account 467, user-464@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user464-key1 to person user-464@plc.org +02:== created user account 468, user-465@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user465-key1 to person user-465@plc.org +02:== created user account 469, user-466@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user466-key1 to person user-466@plc.org +02:== created user account 470, user-467@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user467-key1 to person user-467@plc.org +02:== created user account 471, user-468@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user468-key1 to person user-468@plc.org +02:== created user account 472, user-469@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user469-key1 to person user-469@plc.org +02:== created user account 473, user-470@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user470-key1 to person user-470@plc.org +02:== created user account 474, user-471@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user471-key1 to person user-471@plc.org +02:== created user account 475, user-472@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user472-key1 to person user-472@plc.org +02:== created user account 476, user-473@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user473-key1 to person user-473@plc.org +02:== created user account 477, user-474@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user474-key1 to person user-474@plc.org +02:== created user account 478, user-475@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user475-key1 to person user-475@plc.org +02:== created user account 479, user-476@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user476-key1 to person user-476@plc.org +02:== created user account 480, user-477@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user477-key1 to person user-477@plc.org +02:== created user account 481, user-478@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user478-key1 to person user-478@plc.org +02:== created user account 482, user-479@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user479-key1 to person user-479@plc.org +02:== created user account 483, user-480@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user480-key1 to person user-480@plc.org +02:== created user account 484, user-481@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user481-key1 to person user-481@plc.org +02:== created user account 485, user-482@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user482-key1 to person user-482@plc.org +02:== created user account 486, user-483@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user483-key1 to person user-483@plc.org +02:== created user account 487, user-484@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user484-key1 to person user-484@plc.org +02:== created user account 488, user-485@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user485-key1 to person user-485@plc.org +02:== created user account 489, user-486@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user486-key1 to person user-486@plc.org +02:== created user account 490, user-487@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user487-key1 to person user-487@plc.org +02:== created user account 491, user-488@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user488-key1 to person user-488@plc.org +02:== created user account 492, user-489@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user489-key1 to person user-489@plc.org +02:== created user account 493, user-490@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user490-key1 to person user-490@plc.org +02:== created user account 494, user-491@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user491-key1 to person user-491@plc.org +02:== created user account 495, user-492@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user492-key1 to person user-492@plc.org +02:== created user account 496, user-493@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user493-key1 to person user-493@plc.org +02:== created user account 497, user-494@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user494-key1 to person user-494@plc.org +02:== created user account 498, user-495@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user495-key1 to person user-495@plc.org +02:== created user account 499, user-496@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user496-key1 to person user-496@plc.org +02:== created user account 500, user-497@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user497-key1 to person user-497@plc.org +02:== created user account 501, user-498@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user498-key1 to person user-498@plc.org +02:== created user account 502, user-499@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user499-key1 to person user-499@plc.org +02:== created user account 503, user-500@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user500-key1 to person user-500@plc.org ++++ 60.48 seconds ellapsed (44.05) +Dummy method GetNodes on remote peer 1 skipped +Dummy method AddNode on remote peer 1 skipped +02:== Added node 1 n2-001.plc2.org +02:== Added node 2 n2-002.plc2.org +02:== Added node 3 n2-003.plc2.org +02:== Added node 4 n2-004.plc2.org +02:== Added node 5 n2-005.plc2.org +02:== Added node 6 n2-006.plc2.org +02:== Added node 7 n2-007.plc2.org +02:== Added node 8 n2-008.plc2.org +02:== Added node 9 n2-009.plc2.org +02:== Added node 10 n2-010.plc2.org +02:== Added node 11 n2-011.plc2.org +02:== Added node 12 n2-012.plc2.org +02:== Added node 13 n2-013.plc2.org +02:== Added node 14 n2-014.plc2.org +02:== Added node 15 n2-015.plc2.org +02:== Added node 16 n2-016.plc2.org +02:== Added node 17 n2-017.plc2.org +02:== Added node 18 n2-018.plc2.org +02:== Added node 19 n2-019.plc2.org +02:== Added node 20 n2-020.plc2.org +02:== Added node 21 n2-021.plc2.org +02:== Added node 22 n2-022.plc2.org +02:== Added node 23 n2-023.plc2.org +02:== Added node 24 n2-024.plc2.org +02:== Added node 25 n2-025.plc2.org +02:== Added node 26 n2-026.plc2.org +02:== Added node 27 n2-027.plc2.org +02:== Added node 28 n2-028.plc2.org +02:== Added node 29 n2-029.plc2.org +02:== Added node 30 n2-030.plc2.org +02:== Added node 31 n2-031.plc2.org +02:== Added node 32 n2-032.plc2.org +02:== Added node 33 n2-033.plc2.org +02:== Added node 34 n2-034.plc2.org +02:== Added node 35 n2-035.plc2.org +02:== Added node 36 n2-036.plc2.org +02:== Added node 37 n2-037.plc2.org +02:== Added node 38 n2-038.plc2.org +02:== Added node 39 n2-039.plc2.org +02:== Added node 40 n2-040.plc2.org +02:== Added node 41 n2-041.plc2.org +02:== Added node 42 n2-042.plc2.org +02:== Added node 43 n2-043.plc2.org +02:== Added node 44 n2-044.plc2.org +02:== Added node 45 n2-045.plc2.org +02:== Added node 46 n2-046.plc2.org +02:== Added node 47 n2-047.plc2.org +02:== Added node 48 n2-048.plc2.org +02:== Added node 49 n2-049.plc2.org +02:== Added node 50 n2-050.plc2.org +02:== Added node 51 n2-051.plc2.org +02:== Added node 52 n2-052.plc2.org +02:== Added node 53 n2-053.plc2.org +02:== Added node 54 n2-054.plc2.org +02:== Added node 55 n2-055.plc2.org +02:== Added node 56 n2-056.plc2.org +02:== Added node 57 n2-057.plc2.org +02:== Added node 58 n2-058.plc2.org +02:== Added node 59 n2-059.plc2.org +02:== Added node 60 n2-060.plc2.org +02:== Added node 61 n2-061.plc2.org +02:== Added node 62 n2-062.plc2.org +02:== Added node 63 n2-063.plc2.org +02:== Added node 64 n2-064.plc2.org +02:== Added node 65 n2-065.plc2.org +02:== Added node 66 n2-066.plc2.org +02:== Added node 67 n2-067.plc2.org +02:== Added node 68 n2-068.plc2.org +02:== Added node 69 n2-069.plc2.org +02:== Added node 70 n2-070.plc2.org +02:== Added node 71 n2-071.plc2.org +02:== Added node 72 n2-072.plc2.org +02:== Added node 73 n2-073.plc2.org +02:== Added node 74 n2-074.plc2.org +02:== Added node 75 n2-075.plc2.org +02:== Added node 76 n2-076.plc2.org +02:== Added node 77 n2-077.plc2.org +02:== Added node 78 n2-078.plc2.org +02:== Added node 79 n2-079.plc2.org +02:== Added node 80 n2-080.plc2.org +02:== Added node 81 n2-081.plc2.org +02:== Added node 82 n2-082.plc2.org +02:== Added node 83 n2-083.plc2.org +02:== Added node 84 n2-084.plc2.org +02:== Added node 85 n2-085.plc2.org +02:== Added node 86 n2-086.plc2.org +02:== Added node 87 n2-087.plc2.org +02:== Added node 88 n2-088.plc2.org +02:== Added node 89 n2-089.plc2.org +02:== Added node 90 n2-090.plc2.org +02:== Added node 91 n2-091.plc2.org +02:== Added node 92 n2-092.plc2.org +02:== Added node 93 n2-093.plc2.org +02:== Added node 94 n2-094.plc2.org +02:== Added node 95 n2-095.plc2.org +02:== Added node 96 n2-096.plc2.org +02:== Added node 97 n2-097.plc2.org +02:== Added node 98 n2-098.plc2.org +02:== Added node 99 n2-099.plc2.org +02:== Added node 100 n2-100.plc2.org +02:== Added node 101 n2-101.plc2.org +02:== Added node 102 n2-102.plc2.org +02:== Added node 103 n2-103.plc2.org +02:== Added node 104 n2-104.plc2.org +02:== Added node 105 n2-105.plc2.org +02:== Added node 106 n2-106.plc2.org +02:== Added node 107 n2-107.plc2.org +02:== Added node 108 n2-108.plc2.org +02:== Added node 109 n2-109.plc2.org +02:== Added node 110 n2-110.plc2.org +02:== Added node 111 n2-111.plc2.org +02:== Added node 112 n2-112.plc2.org +02:== Added node 113 n2-113.plc2.org +02:== Added node 114 n2-114.plc2.org +02:== Added node 115 n2-115.plc2.org +02:== Added node 116 n2-116.plc2.org +02:== Added node 117 n2-117.plc2.org +02:== Added node 118 n2-118.plc2.org +02:== Added node 119 n2-119.plc2.org +02:== Added node 120 n2-120.plc2.org +02:== Added node 121 n2-121.plc2.org +02:== Added node 122 n2-122.plc2.org +02:== Added node 123 n2-123.plc2.org +02:== Added node 124 n2-124.plc2.org +02:== Added node 125 n2-125.plc2.org +02:== Added node 126 n2-126.plc2.org +02:== Added node 127 n2-127.plc2.org +02:== Added node 128 n2-128.plc2.org +02:== Added node 129 n2-129.plc2.org +02:== Added node 130 n2-130.plc2.org +02:== Added node 131 n2-131.plc2.org +02:== Added node 132 n2-132.plc2.org +02:== Added node 133 n2-133.plc2.org +02:== Added node 134 n2-134.plc2.org +02:== Added node 135 n2-135.plc2.org +02:== Added node 136 n2-136.plc2.org +02:== Added node 137 n2-137.plc2.org +02:== Added node 138 n2-138.plc2.org +02:== Added node 139 n2-139.plc2.org +02:== Added node 140 n2-140.plc2.org +02:== Added node 141 n2-141.plc2.org +02:== Added node 142 n2-142.plc2.org +02:== Added node 143 n2-143.plc2.org +02:== Added node 144 n2-144.plc2.org +02:== Added node 145 n2-145.plc2.org +02:== Added node 146 n2-146.plc2.org +02:== Added node 147 n2-147.plc2.org +02:== Added node 148 n2-148.plc2.org +02:== Added node 149 n2-149.plc2.org +02:== Added node 150 n2-150.plc2.org +02:== Added node 151 n2-151.plc2.org +02:== Added node 152 n2-152.plc2.org +02:== Added node 153 n2-153.plc2.org +02:== Added node 154 n2-154.plc2.org +02:== Added node 155 n2-155.plc2.org +02:== Added node 156 n2-156.plc2.org +02:== Added node 157 n2-157.plc2.org +02:== Added node 158 n2-158.plc2.org +02:== Added node 159 n2-159.plc2.org +02:== Added node 160 n2-160.plc2.org +02:== Added node 161 n2-161.plc2.org +02:== Added node 162 n2-162.plc2.org +02:== Added node 163 n2-163.plc2.org +02:== Added node 164 n2-164.plc2.org +02:== Added node 165 n2-165.plc2.org +02:== Added node 166 n2-166.plc2.org +02:== Added node 167 n2-167.plc2.org +02:== Added node 168 n2-168.plc2.org +02:== Added node 169 n2-169.plc2.org +02:== Added node 170 n2-170.plc2.org +02:== Added node 171 n2-171.plc2.org +02:== Added node 172 n2-172.plc2.org +02:== Added node 173 n2-173.plc2.org +02:== Added node 174 n2-174.plc2.org +02:== Added node 175 n2-175.plc2.org +02:== Added node 176 n2-176.plc2.org +02:== Added node 177 n2-177.plc2.org +02:== Added node 178 n2-178.plc2.org +02:== Added node 179 n2-179.plc2.org +02:== Added node 180 n2-180.plc2.org +02:== Added node 181 n2-181.plc2.org +02:== Added node 182 n2-182.plc2.org +02:== Added node 183 n2-183.plc2.org +02:== Added node 184 n2-184.plc2.org +02:== Added node 185 n2-185.plc2.org +02:== Added node 186 n2-186.plc2.org +02:== Added node 187 n2-187.plc2.org +02:== Added node 188 n2-188.plc2.org +02:== Added node 189 n2-189.plc2.org +02:== Added node 190 n2-190.plc2.org +02:== Added node 191 n2-191.plc2.org +02:== Added node 192 n2-192.plc2.org +02:== Added node 193 n2-193.plc2.org +02:== Added node 194 n2-194.plc2.org +02:== Added node 195 n2-195.plc2.org +02:== Added node 196 n2-196.plc2.org +02:== Added node 197 n2-197.plc2.org +02:== Added node 198 n2-198.plc2.org +02:== Added node 199 n2-199.plc2.org +02:== Added node 200 n2-200.plc2.org +02:== Added node 201 n2-201.plc2.org +02:== Added node 202 n2-202.plc2.org +02:== Added node 203 n2-203.plc2.org +02:== Added node 204 n2-204.plc2.org +02:== Added node 205 n2-205.plc2.org +02:== Added node 206 n2-206.plc2.org +02:== Added node 207 n2-207.plc2.org +02:== Added node 208 n2-208.plc2.org +02:== Added node 209 n2-209.plc2.org +02:== Added node 210 n2-210.plc2.org +02:== Added node 211 n2-211.plc2.org +02:== Added node 212 n2-212.plc2.org +02:== Added node 213 n2-213.plc2.org +02:== Added node 214 n2-214.plc2.org +02:== Added node 215 n2-215.plc2.org +02:== Added node 216 n2-216.plc2.org +02:== Added node 217 n2-217.plc2.org +02:== Added node 218 n2-218.plc2.org +02:== Added node 219 n2-219.plc2.org +02:== Added node 220 n2-220.plc2.org +02:== Added node 221 n2-221.plc2.org +02:== Added node 222 n2-222.plc2.org +02:== Added node 223 n2-223.plc2.org +02:== Added node 224 n2-224.plc2.org +02:== Added node 225 n2-225.plc2.org +02:== Added node 226 n2-226.plc2.org +02:== Added node 227 n2-227.plc2.org +02:== Added node 228 n2-228.plc2.org +02:== Added node 229 n2-229.plc2.org +02:== Added node 230 n2-230.plc2.org +02:== Added node 231 n2-231.plc2.org +02:== Added node 232 n2-232.plc2.org +02:== Added node 233 n2-233.plc2.org +02:== Added node 234 n2-234.plc2.org +02:== Added node 235 n2-235.plc2.org +02:== Added node 236 n2-236.plc2.org +02:== Added node 237 n2-237.plc2.org +02:== Added node 238 n2-238.plc2.org +02:== Added node 239 n2-239.plc2.org +02:== Added node 240 n2-240.plc2.org +02:== Added node 241 n2-241.plc2.org +02:== Added node 242 n2-242.plc2.org +02:== Added node 243 n2-243.plc2.org +02:== Added node 244 n2-244.plc2.org +02:== Added node 245 n2-245.plc2.org +02:== Added node 246 n2-246.plc2.org +02:== Added node 247 n2-247.plc2.org +02:== Added node 248 n2-248.plc2.org +02:== Added node 249 n2-249.plc2.org +02:== Added node 250 n2-250.plc2.org +02:== Added node 251 n2-251.plc2.org +02:== Added node 252 n2-252.plc2.org +02:== Added node 253 n2-253.plc2.org +02:== Added node 254 n2-254.plc2.org +02:== Added node 255 n2-255.plc2.org +02:== Added node 256 n2-256.plc2.org +02:== Added node 257 n2-257.plc2.org +02:== Added node 258 n2-258.plc2.org +02:== Added node 259 n2-259.plc2.org +02:== Added node 260 n2-260.plc2.org +02:== Added node 261 n2-261.plc2.org +02:== Added node 262 n2-262.plc2.org +02:== Added node 263 n2-263.plc2.org +02:== Added node 264 n2-264.plc2.org +02:== Added node 265 n2-265.plc2.org +02:== Added node 266 n2-266.plc2.org +02:== Added node 267 n2-267.plc2.org +02:== Added node 268 n2-268.plc2.org +02:== Added node 269 n2-269.plc2.org +02:== Added node 270 n2-270.plc2.org +02:== Added node 271 n2-271.plc2.org +02:== Added node 272 n2-272.plc2.org +02:== Added node 273 n2-273.plc2.org +02:== Added node 274 n2-274.plc2.org +02:== Added node 275 n2-275.plc2.org +02:== Added node 276 n2-276.plc2.org +02:== Added node 277 n2-277.plc2.org +02:== Added node 278 n2-278.plc2.org +02:== Added node 279 n2-279.plc2.org +02:== Added node 280 n2-280.plc2.org +02:== Added node 281 n2-281.plc2.org +02:== Added node 282 n2-282.plc2.org +02:== Added node 283 n2-283.plc2.org +02:== Added node 284 n2-284.plc2.org +02:== Added node 285 n2-285.plc2.org +02:== Added node 286 n2-286.plc2.org +02:== Added node 287 n2-287.plc2.org +02:== Added node 288 n2-288.plc2.org +02:== Added node 289 n2-289.plc2.org +02:== Added node 290 n2-290.plc2.org +02:== Added node 291 n2-291.plc2.org +02:== Added node 292 n2-292.plc2.org +02:== Added node 293 n2-293.plc2.org +02:== Added node 294 n2-294.plc2.org +02:== Added node 295 n2-295.plc2.org +02:== Added node 296 n2-296.plc2.org +02:== Added node 297 n2-297.plc2.org +02:== Added node 298 n2-298.plc2.org +02:== Added node 299 n2-299.plc2.org +02:== Added node 300 n2-300.plc2.org +02:== Added node 301 n2-301.plc2.org +02:== Added node 302 n2-302.plc2.org +02:== Added node 303 n2-303.plc2.org +02:== Added node 304 n2-304.plc2.org +02:== Added node 305 n2-305.plc2.org +02:== Added node 306 n2-306.plc2.org +02:== Added node 307 n2-307.plc2.org +02:== Added node 308 n2-308.plc2.org +02:== Added node 309 n2-309.plc2.org +02:== Added node 310 n2-310.plc2.org +02:== Added node 311 n2-311.plc2.org +02:== Added node 312 n2-312.plc2.org +02:== Added node 313 n2-313.plc2.org +02:== Added node 314 n2-314.plc2.org +02:== Added node 315 n2-315.plc2.org +02:== Added node 316 n2-316.plc2.org +02:== Added node 317 n2-317.plc2.org +02:== Added node 318 n2-318.plc2.org +02:== Added node 319 n2-319.plc2.org +02:== Added node 320 n2-320.plc2.org +02:== Added node 321 n2-321.plc2.org +02:== Added node 322 n2-322.plc2.org +02:== Added node 323 n2-323.plc2.org +02:== Added node 324 n2-324.plc2.org +02:== Added node 325 n2-325.plc2.org +02:== Added node 326 n2-326.plc2.org +02:== Added node 327 n2-327.plc2.org +02:== Added node 328 n2-328.plc2.org +02:== Added node 329 n2-329.plc2.org +02:== Added node 330 n2-330.plc2.org +02:== Added node 331 n2-331.plc2.org +02:== Added node 332 n2-332.plc2.org +02:== Added node 333 n2-333.plc2.org +02:== Added node 334 n2-334.plc2.org +02:== Added node 335 n2-335.plc2.org +02:== Added node 336 n2-336.plc2.org +02:== Added node 337 n2-337.plc2.org +02:== Added node 338 n2-338.plc2.org +02:== Added node 339 n2-339.plc2.org +02:== Added node 340 n2-340.plc2.org +02:== Added node 341 n2-341.plc2.org +02:== Added node 342 n2-342.plc2.org +02:== Added node 343 n2-343.plc2.org +02:== Added node 344 n2-344.plc2.org +02:== Added node 345 n2-345.plc2.org +02:== Added node 346 n2-346.plc2.org +02:== Added node 347 n2-347.plc2.org +02:== Added node 348 n2-348.plc2.org +02:== Added node 349 n2-349.plc2.org +02:== Added node 350 n2-350.plc2.org ++++ 82.48 seconds ellapsed (22.00) +Dummy method GetSlices on remote peer 1 skipped +Dummy method AddSlice on remote peer 1 skipped ++++ 82.52 seconds ellapsed (0.04) +Dummy method AddSliceToNodes on remote peer 1 skipped ++++ 82.55 seconds ellapsed (0.03) +Dummy method GetSliceAttributeTypes on remote peer 1 skipped +Dummy method AddSliceAttributeType on remote peer 1 skipped +02:== created SliceAttributeType = 23 ++++ 82.59 seconds ellapsed (0.04) +Dummy method GetSliceAttributes on remote peer 1 skipped +slice_name oneb_slice1 sat_name sat_1 +Dummy method AddSliceAttribute on remote peer 1 skipped +slice_name oneb_slice1 sat_name vref ++++ 82.59 seconds ellapsed (0.00) +==================== ('END',) ++++ 82.59 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-b.populate_end.ref b/trunk/tests/testpeers.-b.populate_end.ref new file mode 100644 index 0000000..5828012 --- /dev/null +++ b/trunk/tests/testpeers.-b.populate_end.ref @@ -0,0 +1,9838 @@ +options {'local_peer': None, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'big'} args ['populate_end'] +200 sites, 500 persons, 350 nodes & 500 slices +1 keys/person, 1 nodes/slice & 3 persons/slice +fast_flag True +funcname populate_end +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +initializing s[1]=>https://caicol.inria.fr:443/PLCAPI/ user= peer1@planet-lab.org +initializing s[2]=>https://jamaica.inria.fr:443/PLCAPI/ user= peer2@planet-lab.org +=== refresh Peer 1 for publishing foreign nodes from 2 ++++ 0.23 seconds ellapsed (0.23) +01:== Refreshing peer ++++ ellapsed: { keys 3.86614894867 local_nodes 0.370403051376 nodes 5.45698714256 peer_db 0.487825870514 persons 7.62666392326 site 2.57800078392 slices 0.0184271335602 transport 8.18339824677 } ++++ 31.18 seconds ellapsed (30.95) ++++ 31.18 seconds ellapsed (0.00) +01:== added in slice oneb_slice1 foreign ['n2-001.plc2.org'] +01:== added in slice onec_slice2 foreign ['n2-002.plc2.org'] +01:== added in slice oned_slice3 foreign ['n2-003.plc2.org'] +01:== added in slice onee_slice4 foreign ['n2-004.plc2.org'] +01:== added in slice onef_slice5 foreign ['n2-005.plc2.org'] +01:== added in slice oneg_slice6 foreign ['n2-006.plc2.org'] +01:== added in slice oneh_slice7 foreign ['n2-007.plc2.org'] +01:== added in slice onei_slice8 foreign ['n2-008.plc2.org'] +01:== added in slice onej_slice9 foreign ['n2-009.plc2.org'] +01:== added in slice oneba_slice10 foreign ['n2-010.plc2.org'] +01:== added in slice onebb_slice11 foreign ['n2-011.plc2.org'] +01:== added in slice onebc_slice12 foreign ['n2-012.plc2.org'] +01:== added in slice onebd_slice13 foreign ['n2-013.plc2.org'] +01:== added in slice onebe_slice14 foreign ['n2-014.plc2.org'] +01:== added in slice onebf_slice15 foreign ['n2-015.plc2.org'] +01:== added in slice onebg_slice16 foreign ['n2-016.plc2.org'] +01:== added in slice onebh_slice17 foreign ['n2-017.plc2.org'] +01:== added in slice onebi_slice18 foreign ['n2-018.plc2.org'] +01:== added in slice onebj_slice19 foreign ['n2-019.plc2.org'] +01:== added in slice oneca_slice20 foreign ['n2-020.plc2.org'] +01:== added in slice onecb_slice21 foreign ['n2-021.plc2.org'] +01:== added in slice onecc_slice22 foreign ['n2-022.plc2.org'] +01:== added in slice onecd_slice23 foreign ['n2-023.plc2.org'] +01:== added in slice onece_slice24 foreign ['n2-024.plc2.org'] +01:== added in slice onecf_slice25 foreign ['n2-025.plc2.org'] +01:== added in slice onecg_slice26 foreign ['n2-026.plc2.org'] +01:== added in slice onech_slice27 foreign ['n2-027.plc2.org'] +01:== added in slice oneci_slice28 foreign ['n2-028.plc2.org'] +01:== added in slice onecj_slice29 foreign ['n2-029.plc2.org'] +01:== added in slice oneda_slice30 foreign ['n2-030.plc2.org'] +01:== added in slice onedb_slice31 foreign ['n2-031.plc2.org'] +01:== added in slice onedc_slice32 foreign ['n2-032.plc2.org'] +01:== added in slice onedd_slice33 foreign ['n2-033.plc2.org'] +01:== added in slice onede_slice34 foreign ['n2-034.plc2.org'] +01:== added in slice onedf_slice35 foreign ['n2-035.plc2.org'] +01:== added in slice onedg_slice36 foreign ['n2-036.plc2.org'] +01:== added in slice onedh_slice37 foreign ['n2-037.plc2.org'] +01:== added in slice onedi_slice38 foreign ['n2-038.plc2.org'] +01:== added in slice onedj_slice39 foreign ['n2-039.plc2.org'] +01:== added in slice oneea_slice40 foreign ['n2-040.plc2.org'] +01:== added in slice oneeb_slice41 foreign ['n2-041.plc2.org'] +01:== added in slice oneec_slice42 foreign ['n2-042.plc2.org'] +01:== added in slice oneed_slice43 foreign ['n2-043.plc2.org'] +01:== added in slice oneee_slice44 foreign ['n2-044.plc2.org'] +01:== added in slice oneef_slice45 foreign ['n2-045.plc2.org'] +01:== added in slice oneeg_slice46 foreign ['n2-046.plc2.org'] +01:== added in slice oneeh_slice47 foreign ['n2-047.plc2.org'] +01:== added in slice oneei_slice48 foreign ['n2-048.plc2.org'] +01:== added in slice oneej_slice49 foreign ['n2-049.plc2.org'] +01:== added in slice onefa_slice50 foreign ['n2-050.plc2.org'] +01:== added in slice onefb_slice51 foreign ['n2-051.plc2.org'] +01:== added in slice onefc_slice52 foreign ['n2-052.plc2.org'] +01:== added in slice onefd_slice53 foreign ['n2-053.plc2.org'] +01:== added in slice onefe_slice54 foreign ['n2-054.plc2.org'] +01:== added in slice oneff_slice55 foreign ['n2-055.plc2.org'] +01:== added in slice onefg_slice56 foreign ['n2-056.plc2.org'] +01:== added in slice onefh_slice57 foreign ['n2-057.plc2.org'] +01:== added in slice onefi_slice58 foreign ['n2-058.plc2.org'] +01:== added in slice onefj_slice59 foreign ['n2-059.plc2.org'] +01:== added in slice onega_slice60 foreign ['n2-060.plc2.org'] +01:== added in slice onegb_slice61 foreign ['n2-061.plc2.org'] +01:== added in slice onegc_slice62 foreign ['n2-062.plc2.org'] +01:== added in slice onegd_slice63 foreign ['n2-063.plc2.org'] +01:== added in slice onege_slice64 foreign ['n2-064.plc2.org'] +01:== added in slice onegf_slice65 foreign ['n2-065.plc2.org'] +01:== added in slice onegg_slice66 foreign ['n2-066.plc2.org'] +01:== added in slice onegh_slice67 foreign ['n2-067.plc2.org'] +01:== added in slice onegi_slice68 foreign ['n2-068.plc2.org'] +01:== added in slice onegj_slice69 foreign ['n2-069.plc2.org'] +01:== added in slice oneha_slice70 foreign ['n2-070.plc2.org'] +01:== added in slice onehb_slice71 foreign ['n2-071.plc2.org'] +01:== added in slice onehc_slice72 foreign ['n2-072.plc2.org'] +01:== added in slice onehd_slice73 foreign ['n2-073.plc2.org'] +01:== added in slice onehe_slice74 foreign ['n2-074.plc2.org'] +01:== added in slice onehf_slice75 foreign ['n2-075.plc2.org'] +01:== added in slice onehg_slice76 foreign ['n2-076.plc2.org'] +01:== added in slice onehh_slice77 foreign ['n2-077.plc2.org'] +01:== added in slice onehi_slice78 foreign ['n2-078.plc2.org'] +01:== added in slice onehj_slice79 foreign ['n2-079.plc2.org'] +01:== added in slice oneia_slice80 foreign ['n2-080.plc2.org'] +01:== added in slice oneib_slice81 foreign ['n2-081.plc2.org'] +01:== added in slice oneic_slice82 foreign ['n2-082.plc2.org'] +01:== added in slice oneid_slice83 foreign ['n2-083.plc2.org'] +01:== added in slice oneie_slice84 foreign ['n2-084.plc2.org'] +01:== added in slice oneif_slice85 foreign ['n2-085.plc2.org'] +01:== added in slice oneig_slice86 foreign ['n2-086.plc2.org'] +01:== added in slice oneih_slice87 foreign ['n2-087.plc2.org'] +01:== added in slice oneii_slice88 foreign ['n2-088.plc2.org'] +01:== added in slice oneij_slice89 foreign ['n2-089.plc2.org'] +01:== added in slice oneja_slice90 foreign ['n2-090.plc2.org'] +01:== added in slice onejb_slice91 foreign ['n2-091.plc2.org'] +01:== added in slice onejc_slice92 foreign ['n2-092.plc2.org'] +01:== added in slice onejd_slice93 foreign ['n2-093.plc2.org'] +01:== added in slice oneje_slice94 foreign ['n2-094.plc2.org'] +01:== added in slice onejf_slice95 foreign ['n2-095.plc2.org'] +01:== added in slice onejg_slice96 foreign ['n2-096.plc2.org'] +01:== added in slice onejh_slice97 foreign ['n2-097.plc2.org'] +01:== added in slice oneji_slice98 foreign ['n2-098.plc2.org'] +01:== added in slice onejj_slice99 foreign ['n2-099.plc2.org'] +01:== added in slice onebaa_slice100 foreign ['n2-100.plc2.org'] +01:== added in slice onebab_slice101 foreign ['n2-101.plc2.org'] +01:== added in slice onebac_slice102 foreign ['n2-102.plc2.org'] +01:== added in slice onebad_slice103 foreign ['n2-103.plc2.org'] +01:== added in slice onebae_slice104 foreign ['n2-104.plc2.org'] +01:== added in slice onebaf_slice105 foreign ['n2-105.plc2.org'] +01:== added in slice onebag_slice106 foreign ['n2-106.plc2.org'] +01:== added in slice onebah_slice107 foreign ['n2-107.plc2.org'] +01:== added in slice onebai_slice108 foreign ['n2-108.plc2.org'] +01:== added in slice onebaj_slice109 foreign ['n2-109.plc2.org'] +01:== added in slice onebba_slice110 foreign ['n2-110.plc2.org'] +01:== added in slice onebbb_slice111 foreign ['n2-111.plc2.org'] +01:== added in slice onebbc_slice112 foreign ['n2-112.plc2.org'] +01:== added in slice onebbd_slice113 foreign ['n2-113.plc2.org'] +01:== added in slice onebbe_slice114 foreign ['n2-114.plc2.org'] +01:== added in slice onebbf_slice115 foreign ['n2-115.plc2.org'] +01:== added in slice onebbg_slice116 foreign ['n2-116.plc2.org'] +01:== added in slice onebbh_slice117 foreign ['n2-117.plc2.org'] +01:== added in slice onebbi_slice118 foreign ['n2-118.plc2.org'] +01:== added in slice onebbj_slice119 foreign ['n2-119.plc2.org'] +01:== added in slice onebca_slice120 foreign ['n2-120.plc2.org'] +01:== added in slice onebcb_slice121 foreign ['n2-121.plc2.org'] +01:== added in slice onebcc_slice122 foreign ['n2-122.plc2.org'] +01:== added in slice onebcd_slice123 foreign ['n2-123.plc2.org'] +01:== added in slice onebce_slice124 foreign ['n2-124.plc2.org'] +01:== added in slice onebcf_slice125 foreign ['n2-125.plc2.org'] +01:== added in slice onebcg_slice126 foreign ['n2-126.plc2.org'] +01:== added in slice onebch_slice127 foreign ['n2-127.plc2.org'] +01:== added in slice onebci_slice128 foreign ['n2-128.plc2.org'] +01:== added in slice onebcj_slice129 foreign ['n2-129.plc2.org'] +01:== added in slice onebda_slice130 foreign ['n2-130.plc2.org'] +01:== added in slice onebdb_slice131 foreign ['n2-131.plc2.org'] +01:== added in slice onebdc_slice132 foreign ['n2-132.plc2.org'] +01:== added in slice onebdd_slice133 foreign ['n2-133.plc2.org'] +01:== added in slice onebde_slice134 foreign ['n2-134.plc2.org'] +01:== added in slice onebdf_slice135 foreign ['n2-135.plc2.org'] +01:== added in slice onebdg_slice136 foreign ['n2-136.plc2.org'] +01:== added in slice onebdh_slice137 foreign ['n2-137.plc2.org'] +01:== added in slice onebdi_slice138 foreign ['n2-138.plc2.org'] +01:== added in slice onebdj_slice139 foreign ['n2-139.plc2.org'] +01:== added in slice onebea_slice140 foreign ['n2-140.plc2.org'] +01:== added in slice onebeb_slice141 foreign ['n2-141.plc2.org'] +01:== added in slice onebec_slice142 foreign ['n2-142.plc2.org'] +01:== added in slice onebed_slice143 foreign ['n2-143.plc2.org'] +01:== added in slice onebee_slice144 foreign ['n2-144.plc2.org'] +01:== added in slice onebef_slice145 foreign ['n2-145.plc2.org'] +01:== added in slice onebeg_slice146 foreign ['n2-146.plc2.org'] +01:== added in slice onebeh_slice147 foreign ['n2-147.plc2.org'] +01:== added in slice onebei_slice148 foreign ['n2-148.plc2.org'] +01:== added in slice onebej_slice149 foreign ['n2-149.plc2.org'] +01:== added in slice onebfa_slice150 foreign ['n2-150.plc2.org'] +01:== added in slice onebfb_slice151 foreign ['n2-151.plc2.org'] +01:== added in slice onebfc_slice152 foreign ['n2-152.plc2.org'] +01:== added in slice onebfd_slice153 foreign ['n2-153.plc2.org'] +01:== added in slice onebfe_slice154 foreign ['n2-154.plc2.org'] +01:== added in slice onebff_slice155 foreign ['n2-155.plc2.org'] +01:== added in slice onebfg_slice156 foreign ['n2-156.plc2.org'] +01:== added in slice onebfh_slice157 foreign ['n2-157.plc2.org'] +01:== added in slice onebfi_slice158 foreign ['n2-158.plc2.org'] +01:== added in slice onebfj_slice159 foreign ['n2-159.plc2.org'] +01:== added in slice onebga_slice160 foreign ['n2-160.plc2.org'] +01:== added in slice onebgb_slice161 foreign ['n2-161.plc2.org'] +01:== added in slice onebgc_slice162 foreign ['n2-162.plc2.org'] +01:== added in slice onebgd_slice163 foreign ['n2-163.plc2.org'] +01:== added in slice onebge_slice164 foreign ['n2-164.plc2.org'] +01:== added in slice onebgf_slice165 foreign ['n2-165.plc2.org'] +01:== added in slice onebgg_slice166 foreign ['n2-166.plc2.org'] +01:== added in slice onebgh_slice167 foreign ['n2-167.plc2.org'] +01:== added in slice onebgi_slice168 foreign ['n2-168.plc2.org'] +01:== added in slice onebgj_slice169 foreign ['n2-169.plc2.org'] +01:== added in slice onebha_slice170 foreign ['n2-170.plc2.org'] +01:== added in slice onebhb_slice171 foreign ['n2-171.plc2.org'] +01:== added in slice onebhc_slice172 foreign ['n2-172.plc2.org'] +01:== added in slice onebhd_slice173 foreign ['n2-173.plc2.org'] +01:== added in slice onebhe_slice174 foreign ['n2-174.plc2.org'] +01:== added in slice onebhf_slice175 foreign ['n2-175.plc2.org'] +01:== added in slice onebhg_slice176 foreign ['n2-176.plc2.org'] +01:== added in slice onebhh_slice177 foreign ['n2-177.plc2.org'] +01:== added in slice onebhi_slice178 foreign ['n2-178.plc2.org'] +01:== added in slice onebhj_slice179 foreign ['n2-179.plc2.org'] +01:== added in slice onebia_slice180 foreign ['n2-180.plc2.org'] +01:== added in slice onebib_slice181 foreign ['n2-181.plc2.org'] +01:== added in slice onebic_slice182 foreign ['n2-182.plc2.org'] +01:== added in slice onebid_slice183 foreign ['n2-183.plc2.org'] +01:== added in slice onebie_slice184 foreign ['n2-184.plc2.org'] +01:== added in slice onebif_slice185 foreign ['n2-185.plc2.org'] +01:== added in slice onebig_slice186 foreign ['n2-186.plc2.org'] +01:== added in slice onebih_slice187 foreign ['n2-187.plc2.org'] +01:== added in slice onebii_slice188 foreign ['n2-188.plc2.org'] +01:== added in slice onebij_slice189 foreign ['n2-189.plc2.org'] +01:== added in slice onebja_slice190 foreign ['n2-190.plc2.org'] +01:== added in slice onebjb_slice191 foreign ['n2-191.plc2.org'] +01:== added in slice onebjc_slice192 foreign ['n2-192.plc2.org'] +01:== added in slice onebjd_slice193 foreign ['n2-193.plc2.org'] +01:== added in slice onebje_slice194 foreign ['n2-194.plc2.org'] +01:== added in slice onebjf_slice195 foreign ['n2-195.plc2.org'] +01:== added in slice onebjg_slice196 foreign ['n2-196.plc2.org'] +01:== added in slice onebjh_slice197 foreign ['n2-197.plc2.org'] +01:== added in slice onebji_slice198 foreign ['n2-198.plc2.org'] +01:== added in slice onebjj_slice199 foreign ['n2-199.plc2.org'] +01:== added in slice onecaa_slice200 foreign ['n2-200.plc2.org'] +01:== added in slice oneb_slice201 foreign ['n2-201.plc2.org'] +01:== added in slice onec_slice202 foreign ['n2-202.plc2.org'] +01:== added in slice oned_slice203 foreign ['n2-203.plc2.org'] +01:== added in slice onee_slice204 foreign ['n2-204.plc2.org'] +01:== added in slice onef_slice205 foreign ['n2-205.plc2.org'] +01:== added in slice oneg_slice206 foreign ['n2-206.plc2.org'] +01:== added in slice oneh_slice207 foreign ['n2-207.plc2.org'] +01:== added in slice onei_slice208 foreign ['n2-208.plc2.org'] +01:== added in slice onej_slice209 foreign ['n2-209.plc2.org'] +01:== added in slice oneba_slice210 foreign ['n2-210.plc2.org'] +01:== added in slice onebb_slice211 foreign ['n2-211.plc2.org'] +01:== added in slice onebc_slice212 foreign ['n2-212.plc2.org'] +01:== added in slice onebd_slice213 foreign ['n2-213.plc2.org'] +01:== added in slice onebe_slice214 foreign ['n2-214.plc2.org'] +01:== added in slice onebf_slice215 foreign ['n2-215.plc2.org'] +01:== added in slice onebg_slice216 foreign ['n2-216.plc2.org'] +01:== added in slice onebh_slice217 foreign ['n2-217.plc2.org'] +01:== added in slice onebi_slice218 foreign ['n2-218.plc2.org'] +01:== added in slice onebj_slice219 foreign ['n2-219.plc2.org'] +01:== added in slice oneca_slice220 foreign ['n2-220.plc2.org'] +01:== added in slice onecb_slice221 foreign ['n2-221.plc2.org'] +01:== added in slice onecc_slice222 foreign ['n2-222.plc2.org'] +01:== added in slice onecd_slice223 foreign ['n2-223.plc2.org'] +01:== added in slice onece_slice224 foreign ['n2-224.plc2.org'] +01:== added in slice onecf_slice225 foreign ['n2-225.plc2.org'] +01:== added in slice onecg_slice226 foreign ['n2-226.plc2.org'] +01:== added in slice onech_slice227 foreign ['n2-227.plc2.org'] +01:== added in slice oneci_slice228 foreign ['n2-228.plc2.org'] +01:== added in slice onecj_slice229 foreign ['n2-229.plc2.org'] +01:== added in slice oneda_slice230 foreign ['n2-230.plc2.org'] +01:== added in slice onedb_slice231 foreign ['n2-231.plc2.org'] +01:== added in slice onedc_slice232 foreign ['n2-232.plc2.org'] +01:== added in slice onedd_slice233 foreign ['n2-233.plc2.org'] +01:== added in slice onede_slice234 foreign ['n2-234.plc2.org'] +01:== added in slice onedf_slice235 foreign ['n2-235.plc2.org'] +01:== added in slice onedg_slice236 foreign ['n2-236.plc2.org'] +01:== added in slice onedh_slice237 foreign ['n2-237.plc2.org'] +01:== added in slice onedi_slice238 foreign ['n2-238.plc2.org'] +01:== added in slice onedj_slice239 foreign ['n2-239.plc2.org'] +01:== added in slice oneea_slice240 foreign ['n2-240.plc2.org'] +01:== added in slice oneeb_slice241 foreign ['n2-241.plc2.org'] +01:== added in slice oneec_slice242 foreign ['n2-242.plc2.org'] +01:== added in slice oneed_slice243 foreign ['n2-243.plc2.org'] +01:== added in slice oneee_slice244 foreign ['n2-244.plc2.org'] +01:== added in slice oneef_slice245 foreign ['n2-245.plc2.org'] +01:== added in slice oneeg_slice246 foreign ['n2-246.plc2.org'] +01:== added in slice oneeh_slice247 foreign ['n2-247.plc2.org'] +01:== added in slice oneei_slice248 foreign ['n2-248.plc2.org'] +01:== added in slice oneej_slice249 foreign ['n2-249.plc2.org'] +01:== added in slice onefa_slice250 foreign ['n2-250.plc2.org'] +01:== added in slice onefb_slice251 foreign ['n2-251.plc2.org'] +01:== added in slice onefc_slice252 foreign ['n2-252.plc2.org'] +01:== added in slice onefd_slice253 foreign ['n2-253.plc2.org'] +01:== added in slice onefe_slice254 foreign ['n2-254.plc2.org'] +01:== added in slice oneff_slice255 foreign ['n2-255.plc2.org'] +01:== added in slice onefg_slice256 foreign ['n2-256.plc2.org'] +01:== added in slice onefh_slice257 foreign ['n2-257.plc2.org'] +01:== added in slice onefi_slice258 foreign ['n2-258.plc2.org'] +01:== added in slice onefj_slice259 foreign ['n2-259.plc2.org'] +01:== added in slice onega_slice260 foreign ['n2-260.plc2.org'] +01:== added in slice onegb_slice261 foreign ['n2-261.plc2.org'] +01:== added in slice onegc_slice262 foreign ['n2-262.plc2.org'] +01:== added in slice onegd_slice263 foreign ['n2-263.plc2.org'] +01:== added in slice onege_slice264 foreign ['n2-264.plc2.org'] +01:== added in slice onegf_slice265 foreign ['n2-265.plc2.org'] +01:== added in slice onegg_slice266 foreign ['n2-266.plc2.org'] +01:== added in slice onegh_slice267 foreign ['n2-267.plc2.org'] +01:== added in slice onegi_slice268 foreign ['n2-268.plc2.org'] +01:== added in slice onegj_slice269 foreign ['n2-269.plc2.org'] +01:== added in slice oneha_slice270 foreign ['n2-270.plc2.org'] +01:== added in slice onehb_slice271 foreign ['n2-271.plc2.org'] +01:== added in slice onehc_slice272 foreign ['n2-272.plc2.org'] +01:== added in slice onehd_slice273 foreign ['n2-273.plc2.org'] +01:== added in slice onehe_slice274 foreign ['n2-274.plc2.org'] +01:== added in slice onehf_slice275 foreign ['n2-275.plc2.org'] +01:== added in slice onehg_slice276 foreign ['n2-276.plc2.org'] +01:== added in slice onehh_slice277 foreign ['n2-277.plc2.org'] +01:== added in slice onehi_slice278 foreign ['n2-278.plc2.org'] +01:== added in slice onehj_slice279 foreign ['n2-279.plc2.org'] +01:== added in slice oneia_slice280 foreign ['n2-280.plc2.org'] +01:== added in slice oneib_slice281 foreign ['n2-281.plc2.org'] +01:== added in slice oneic_slice282 foreign ['n2-282.plc2.org'] +01:== added in slice oneid_slice283 foreign ['n2-283.plc2.org'] +01:== added in slice oneie_slice284 foreign ['n2-284.plc2.org'] +01:== added in slice oneif_slice285 foreign ['n2-285.plc2.org'] +01:== added in slice oneig_slice286 foreign ['n2-286.plc2.org'] +01:== added in slice oneih_slice287 foreign ['n2-287.plc2.org'] +01:== added in slice oneii_slice288 foreign ['n2-288.plc2.org'] +01:== added in slice oneij_slice289 foreign ['n2-289.plc2.org'] +01:== added in slice oneja_slice290 foreign ['n2-290.plc2.org'] +01:== added in slice onejb_slice291 foreign ['n2-291.plc2.org'] +01:== added in slice onejc_slice292 foreign ['n2-292.plc2.org'] +01:== added in slice onejd_slice293 foreign ['n2-293.plc2.org'] +01:== added in slice oneje_slice294 foreign ['n2-294.plc2.org'] +01:== added in slice onejf_slice295 foreign ['n2-295.plc2.org'] +01:== added in slice onejg_slice296 foreign ['n2-296.plc2.org'] +01:== added in slice onejh_slice297 foreign ['n2-297.plc2.org'] +01:== added in slice oneji_slice298 foreign ['n2-298.plc2.org'] +01:== added in slice onejj_slice299 foreign ['n2-299.plc2.org'] +01:== added in slice onebaa_slice300 foreign ['n2-300.plc2.org'] +01:== added in slice onebab_slice301 foreign ['n2-301.plc2.org'] +01:== added in slice onebac_slice302 foreign ['n2-302.plc2.org'] +01:== added in slice onebad_slice303 foreign ['n2-303.plc2.org'] +01:== added in slice onebae_slice304 foreign ['n2-304.plc2.org'] +01:== added in slice onebaf_slice305 foreign ['n2-305.plc2.org'] +01:== added in slice onebag_slice306 foreign ['n2-306.plc2.org'] +01:== added in slice onebah_slice307 foreign ['n2-307.plc2.org'] +01:== added in slice onebai_slice308 foreign ['n2-308.plc2.org'] +01:== added in slice onebaj_slice309 foreign ['n2-309.plc2.org'] +01:== added in slice onebba_slice310 foreign ['n2-310.plc2.org'] +01:== added in slice onebbb_slice311 foreign ['n2-311.plc2.org'] +01:== added in slice onebbc_slice312 foreign ['n2-312.plc2.org'] +01:== added in slice onebbd_slice313 foreign ['n2-313.plc2.org'] +01:== added in slice onebbe_slice314 foreign ['n2-314.plc2.org'] +01:== added in slice onebbf_slice315 foreign ['n2-315.plc2.org'] +01:== added in slice onebbg_slice316 foreign ['n2-316.plc2.org'] +01:== added in slice onebbh_slice317 foreign ['n2-317.plc2.org'] +01:== added in slice onebbi_slice318 foreign ['n2-318.plc2.org'] +01:== added in slice onebbj_slice319 foreign ['n2-319.plc2.org'] +01:== added in slice onebca_slice320 foreign ['n2-320.plc2.org'] +01:== added in slice onebcb_slice321 foreign ['n2-321.plc2.org'] +01:== added in slice onebcc_slice322 foreign ['n2-322.plc2.org'] +01:== added in slice onebcd_slice323 foreign ['n2-323.plc2.org'] +01:== added in slice onebce_slice324 foreign ['n2-324.plc2.org'] +01:== added in slice onebcf_slice325 foreign ['n2-325.plc2.org'] +01:== added in slice onebcg_slice326 foreign ['n2-326.plc2.org'] +01:== added in slice onebch_slice327 foreign ['n2-327.plc2.org'] +01:== added in slice onebci_slice328 foreign ['n2-328.plc2.org'] +01:== added in slice onebcj_slice329 foreign ['n2-329.plc2.org'] +01:== added in slice onebda_slice330 foreign ['n2-330.plc2.org'] +01:== added in slice onebdb_slice331 foreign ['n2-331.plc2.org'] +01:== added in slice onebdc_slice332 foreign ['n2-332.plc2.org'] +01:== added in slice onebdd_slice333 foreign ['n2-333.plc2.org'] +01:== added in slice onebde_slice334 foreign ['n2-334.plc2.org'] +01:== added in slice onebdf_slice335 foreign ['n2-335.plc2.org'] +01:== added in slice onebdg_slice336 foreign ['n2-336.plc2.org'] +01:== added in slice onebdh_slice337 foreign ['n2-337.plc2.org'] +01:== added in slice onebdi_slice338 foreign ['n2-338.plc2.org'] +01:== added in slice onebdj_slice339 foreign ['n2-339.plc2.org'] +01:== added in slice onebea_slice340 foreign ['n2-340.plc2.org'] +01:== added in slice onebeb_slice341 foreign ['n2-341.plc2.org'] +01:== added in slice onebec_slice342 foreign ['n2-342.plc2.org'] +01:== added in slice onebed_slice343 foreign ['n2-343.plc2.org'] +01:== added in slice onebee_slice344 foreign ['n2-344.plc2.org'] +01:== added in slice onebef_slice345 foreign ['n2-345.plc2.org'] +01:== added in slice onebeg_slice346 foreign ['n2-346.plc2.org'] +01:== added in slice onebeh_slice347 foreign ['n2-347.plc2.org'] +01:== added in slice onebei_slice348 foreign ['n2-348.plc2.org'] +01:== added in slice onebej_slice349 foreign ['n2-349.plc2.org'] +01:== added in slice onebfa_slice350 foreign ['n2-350.plc2.org'] +01:== added in slice onebfb_slice351 foreign ['n2-001.plc2.org'] +01:== added in slice onebfc_slice352 foreign ['n2-002.plc2.org'] +01:== added in slice onebfd_slice353 foreign ['n2-003.plc2.org'] +01:== added in slice onebfe_slice354 foreign ['n2-004.plc2.org'] +01:== added in slice onebff_slice355 foreign ['n2-005.plc2.org'] +01:== added in slice onebfg_slice356 foreign ['n2-006.plc2.org'] +01:== added in slice onebfh_slice357 foreign ['n2-007.plc2.org'] +01:== added in slice onebfi_slice358 foreign ['n2-008.plc2.org'] +01:== added in slice onebfj_slice359 foreign ['n2-009.plc2.org'] +01:== added in slice onebga_slice360 foreign ['n2-010.plc2.org'] +01:== added in slice onebgb_slice361 foreign ['n2-011.plc2.org'] +01:== added in slice onebgc_slice362 foreign ['n2-012.plc2.org'] +01:== added in slice onebgd_slice363 foreign ['n2-013.plc2.org'] +01:== added in slice onebge_slice364 foreign ['n2-014.plc2.org'] +01:== added in slice onebgf_slice365 foreign ['n2-015.plc2.org'] +01:== added in slice onebgg_slice366 foreign ['n2-016.plc2.org'] +01:== added in slice onebgh_slice367 foreign ['n2-017.plc2.org'] +01:== added in slice onebgi_slice368 foreign ['n2-018.plc2.org'] +01:== added in slice onebgj_slice369 foreign ['n2-019.plc2.org'] +01:== added in slice onebha_slice370 foreign ['n2-020.plc2.org'] +01:== added in slice onebhb_slice371 foreign ['n2-021.plc2.org'] +01:== added in slice onebhc_slice372 foreign ['n2-022.plc2.org'] +01:== added in slice onebhd_slice373 foreign ['n2-023.plc2.org'] +01:== added in slice onebhe_slice374 foreign ['n2-024.plc2.org'] +01:== added in slice onebhf_slice375 foreign ['n2-025.plc2.org'] +01:== added in slice onebhg_slice376 foreign ['n2-026.plc2.org'] +01:== added in slice onebhh_slice377 foreign ['n2-027.plc2.org'] +01:== added in slice onebhi_slice378 foreign ['n2-028.plc2.org'] +01:== added in slice onebhj_slice379 foreign ['n2-029.plc2.org'] +01:== added in slice onebia_slice380 foreign ['n2-030.plc2.org'] +01:== added in slice onebib_slice381 foreign ['n2-031.plc2.org'] +01:== added in slice onebic_slice382 foreign ['n2-032.plc2.org'] +01:== added in slice onebid_slice383 foreign ['n2-033.plc2.org'] +01:== added in slice onebie_slice384 foreign ['n2-034.plc2.org'] +01:== added in slice onebif_slice385 foreign ['n2-035.plc2.org'] +01:== added in slice onebig_slice386 foreign ['n2-036.plc2.org'] +01:== added in slice onebih_slice387 foreign ['n2-037.plc2.org'] +01:== added in slice onebii_slice388 foreign ['n2-038.plc2.org'] +01:== added in slice onebij_slice389 foreign ['n2-039.plc2.org'] +01:== added in slice onebja_slice390 foreign ['n2-040.plc2.org'] +01:== added in slice onebjb_slice391 foreign ['n2-041.plc2.org'] +01:== added in slice onebjc_slice392 foreign ['n2-042.plc2.org'] +01:== added in slice onebjd_slice393 foreign ['n2-043.plc2.org'] +01:== added in slice onebje_slice394 foreign ['n2-044.plc2.org'] +01:== added in slice onebjf_slice395 foreign ['n2-045.plc2.org'] +01:== added in slice onebjg_slice396 foreign ['n2-046.plc2.org'] +01:== added in slice onebjh_slice397 foreign ['n2-047.plc2.org'] +01:== added in slice onebji_slice398 foreign ['n2-048.plc2.org'] +01:== added in slice onebjj_slice399 foreign ['n2-049.plc2.org'] +01:== added in slice onecaa_slice400 foreign ['n2-050.plc2.org'] +01:== added in slice oneb_slice401 foreign ['n2-051.plc2.org'] +01:== added in slice onec_slice402 foreign ['n2-052.plc2.org'] +01:== added in slice oned_slice403 foreign ['n2-053.plc2.org'] +01:== added in slice onee_slice404 foreign ['n2-054.plc2.org'] +01:== added in slice onef_slice405 foreign ['n2-055.plc2.org'] +01:== added in slice oneg_slice406 foreign ['n2-056.plc2.org'] +01:== added in slice oneh_slice407 foreign ['n2-057.plc2.org'] +01:== added in slice onei_slice408 foreign ['n2-058.plc2.org'] +01:== added in slice onej_slice409 foreign ['n2-059.plc2.org'] +01:== added in slice oneba_slice410 foreign ['n2-060.plc2.org'] +01:== added in slice onebb_slice411 foreign ['n2-061.plc2.org'] +01:== added in slice onebc_slice412 foreign ['n2-062.plc2.org'] +01:== added in slice onebd_slice413 foreign ['n2-063.plc2.org'] +01:== added in slice onebe_slice414 foreign ['n2-064.plc2.org'] +01:== added in slice onebf_slice415 foreign ['n2-065.plc2.org'] +01:== added in slice onebg_slice416 foreign ['n2-066.plc2.org'] +01:== added in slice onebh_slice417 foreign ['n2-067.plc2.org'] +01:== added in slice onebi_slice418 foreign ['n2-068.plc2.org'] +01:== added in slice onebj_slice419 foreign ['n2-069.plc2.org'] +01:== added in slice oneca_slice420 foreign ['n2-070.plc2.org'] +01:== added in slice onecb_slice421 foreign ['n2-071.plc2.org'] +01:== added in slice onecc_slice422 foreign ['n2-072.plc2.org'] +01:== added in slice onecd_slice423 foreign ['n2-073.plc2.org'] +01:== added in slice onece_slice424 foreign ['n2-074.plc2.org'] +01:== added in slice onecf_slice425 foreign ['n2-075.plc2.org'] +01:== added in slice onecg_slice426 foreign ['n2-076.plc2.org'] +01:== added in slice onech_slice427 foreign ['n2-077.plc2.org'] +01:== added in slice oneci_slice428 foreign ['n2-078.plc2.org'] +01:== added in slice onecj_slice429 foreign ['n2-079.plc2.org'] +01:== added in slice oneda_slice430 foreign ['n2-080.plc2.org'] +01:== added in slice onedb_slice431 foreign ['n2-081.plc2.org'] +01:== added in slice onedc_slice432 foreign ['n2-082.plc2.org'] +01:== added in slice onedd_slice433 foreign ['n2-083.plc2.org'] +01:== added in slice onede_slice434 foreign ['n2-084.plc2.org'] +01:== added in slice onedf_slice435 foreign ['n2-085.plc2.org'] +01:== added in slice onedg_slice436 foreign ['n2-086.plc2.org'] +01:== added in slice onedh_slice437 foreign ['n2-087.plc2.org'] +01:== added in slice onedi_slice438 foreign ['n2-088.plc2.org'] +01:== added in slice onedj_slice439 foreign ['n2-089.plc2.org'] +01:== added in slice oneea_slice440 foreign ['n2-090.plc2.org'] +01:== added in slice oneeb_slice441 foreign ['n2-091.plc2.org'] +01:== added in slice oneec_slice442 foreign ['n2-092.plc2.org'] +01:== added in slice oneed_slice443 foreign ['n2-093.plc2.org'] +01:== added in slice oneee_slice444 foreign ['n2-094.plc2.org'] +01:== added in slice oneef_slice445 foreign ['n2-095.plc2.org'] +01:== added in slice oneeg_slice446 foreign ['n2-096.plc2.org'] +01:== added in slice oneeh_slice447 foreign ['n2-097.plc2.org'] +01:== added in slice oneei_slice448 foreign ['n2-098.plc2.org'] +01:== added in slice oneej_slice449 foreign ['n2-099.plc2.org'] +01:== added in slice onefa_slice450 foreign ['n2-100.plc2.org'] +01:== added in slice onefb_slice451 foreign ['n2-101.plc2.org'] +01:== added in slice onefc_slice452 foreign ['n2-102.plc2.org'] +01:== added in slice onefd_slice453 foreign ['n2-103.plc2.org'] +01:== added in slice onefe_slice454 foreign ['n2-104.plc2.org'] +01:== added in slice oneff_slice455 foreign ['n2-105.plc2.org'] +01:== added in slice onefg_slice456 foreign ['n2-106.plc2.org'] +01:== added in slice onefh_slice457 foreign ['n2-107.plc2.org'] +01:== added in slice onefi_slice458 foreign ['n2-108.plc2.org'] +01:== added in slice onefj_slice459 foreign ['n2-109.plc2.org'] +01:== added in slice onega_slice460 foreign ['n2-110.plc2.org'] +01:== added in slice onegb_slice461 foreign ['n2-111.plc2.org'] +01:== added in slice onegc_slice462 foreign ['n2-112.plc2.org'] +01:== added in slice onegd_slice463 foreign ['n2-113.plc2.org'] +01:== added in slice onege_slice464 foreign ['n2-114.plc2.org'] +01:== added in slice onegf_slice465 foreign ['n2-115.plc2.org'] +01:== added in slice onegg_slice466 foreign ['n2-116.plc2.org'] +01:== added in slice onegh_slice467 foreign ['n2-117.plc2.org'] +01:== added in slice onegi_slice468 foreign ['n2-118.plc2.org'] +01:== added in slice onegj_slice469 foreign ['n2-119.plc2.org'] +01:== added in slice oneha_slice470 foreign ['n2-120.plc2.org'] +01:== added in slice onehb_slice471 foreign ['n2-121.plc2.org'] +01:== added in slice onehc_slice472 foreign ['n2-122.plc2.org'] +01:== added in slice onehd_slice473 foreign ['n2-123.plc2.org'] +01:== added in slice onehe_slice474 foreign ['n2-124.plc2.org'] +01:== added in slice onehf_slice475 foreign ['n2-125.plc2.org'] +01:== added in slice onehg_slice476 foreign ['n2-126.plc2.org'] +01:== added in slice onehh_slice477 foreign ['n2-127.plc2.org'] +01:== added in slice onehi_slice478 foreign ['n2-128.plc2.org'] +01:== added in slice onehj_slice479 foreign ['n2-129.plc2.org'] +01:== added in slice oneia_slice480 foreign ['n2-130.plc2.org'] +01:== added in slice oneib_slice481 foreign ['n2-131.plc2.org'] +01:== added in slice oneic_slice482 foreign ['n2-132.plc2.org'] +01:== added in slice oneid_slice483 foreign ['n2-133.plc2.org'] +01:== added in slice oneie_slice484 foreign ['n2-134.plc2.org'] +01:== added in slice oneif_slice485 foreign ['n2-135.plc2.org'] +01:== added in slice oneig_slice486 foreign ['n2-136.plc2.org'] +01:== added in slice oneih_slice487 foreign ['n2-137.plc2.org'] +01:== added in slice oneii_slice488 foreign ['n2-138.plc2.org'] +01:== added in slice oneij_slice489 foreign ['n2-139.plc2.org'] +01:== added in slice oneja_slice490 foreign ['n2-140.plc2.org'] +01:== added in slice onejb_slice491 foreign ['n2-141.plc2.org'] +01:== added in slice onejc_slice492 foreign ['n2-142.plc2.org'] +01:== added in slice onejd_slice493 foreign ['n2-143.plc2.org'] +01:== added in slice oneje_slice494 foreign ['n2-144.plc2.org'] +01:== added in slice onejf_slice495 foreign ['n2-145.plc2.org'] +01:== added in slice onejg_slice496 foreign ['n2-146.plc2.org'] +01:== added in slice onejh_slice497 foreign ['n2-147.plc2.org'] +01:== added in slice oneji_slice498 foreign ['n2-148.plc2.org'] +01:== added in slice onejj_slice499 foreign ['n2-149.plc2.org'] +01:== added in slice onebaa_slice500 foreign ['n2-150.plc2.org'] ++++ 134.55 seconds ellapsed (103.37) +=== refresh populate: refresh all ++++ 134.55 seconds ellapsed (0.00) +01:== Refreshing peer ++++ ellapsed: { keys 0.189713001251 local_nodes 0.345396995544 nodes 0.457951068878 peer_db 0.482037067413 persons 0.598115921021 site 0.326417922974 slices 0.0121240615845 transport 8.19845294952 } ++++ 146.52 seconds ellapsed (11.97) +02:== Refreshing peer ++++ ellapsed: { keys 4.21245408058 local_nodes 0.361541986465 nodes 5.58370709419 peer_db 1.05979800224 persons 7.13460898399 site 2.56579399109 slices 13.3192181587 transport 13.8261630535 } ++++ 197.10 seconds ellapsed (50.58) ++++ 197.10 seconds ellapsed (0.00) +=== refresh empty refresh ++++ 197.10 seconds ellapsed (0.00) +01:== Refreshing peer ++++ ellapsed: { keys 0.188363790512 local_nodes 0.366487979889 nodes 0.43279004097 peer_db 0.65917801857 persons 0.625756025314 site 0.302524089813 slices 0.0138368606567 transport 10.787113905 } ++++ 211.93 seconds ellapsed (14.83) +02:== Refreshing peer ++++ ellapsed: { keys 0.18791103363 local_nodes 0.379804849625 nodes 0.428311109543 peer_db 1.13953304291 persons 0.818680047989 site 0.309503793716 slices 0.593018054962 transport 13.9470081329 } ++++ 231.62 seconds ellapsed (19.69) +01:============================== DUMPING +01: SITES +1 None plc1 FederationTestPlc1 Central [] +2 None oneb FederationTestPlc1 [201, 1] +3 None onec FederationTestPlc1 [202, 2] +4 None oned FederationTestPlc1 [203, 3] +5 None onee FederationTestPlc1 [204, 4] +6 None onef FederationTestPlc1 [205, 5] +7 None oneg FederationTestPlc1 [206, 6] +8 None oneh FederationTestPlc1 [207, 7] +9 None onei FederationTestPlc1 [208, 8] +10 None onej FederationTestPlc1 [209, 9] +11 None oneba FederationTestPlc1 [210, 10] +12 None onebb FederationTestPlc1 [211, 11] +13 None onebc FederationTestPlc1 [212, 12] +14 None onebd FederationTestPlc1 [213, 13] +15 None onebe FederationTestPlc1 [214, 14] +16 None onebf FederationTestPlc1 [215, 15] +17 None onebg FederationTestPlc1 [216, 16] +18 None onebh FederationTestPlc1 [217, 17] +19 None onebi FederationTestPlc1 [218, 18] +20 None onebj FederationTestPlc1 [219, 19] +21 None oneca FederationTestPlc1 [220, 20] +22 None onecb FederationTestPlc1 [221, 21] +23 None onecc FederationTestPlc1 [222, 22] +24 None onecd FederationTestPlc1 [223, 23] +25 None onece FederationTestPlc1 [224, 24] +26 None onecf FederationTestPlc1 [225, 25] +27 None onecg FederationTestPlc1 [226, 26] +28 None onech FederationTestPlc1 [227, 27] +29 None oneci FederationTestPlc1 [228, 28] +30 None onecj FederationTestPlc1 [229, 29] +31 None oneda FederationTestPlc1 [230, 30] +32 None onedb FederationTestPlc1 [231, 31] +33 None onedc FederationTestPlc1 [232, 32] +34 None onedd FederationTestPlc1 [233, 33] +35 None onede FederationTestPlc1 [234, 34] +36 None onedf FederationTestPlc1 [235, 35] +37 None onedg FederationTestPlc1 [236, 36] +38 None onedh FederationTestPlc1 [237, 37] +39 None onedi FederationTestPlc1 [238, 38] +40 None onedj FederationTestPlc1 [239, 39] +41 None oneea FederationTestPlc1 [240, 40] +42 None oneeb FederationTestPlc1 [241, 41] +43 None oneec FederationTestPlc1 [242, 42] +44 None oneed FederationTestPlc1 [243, 43] +45 None oneee FederationTestPlc1 [244, 44] +46 None oneef FederationTestPlc1 [245, 45] +47 None oneeg FederationTestPlc1 [246, 46] +48 None oneeh FederationTestPlc1 [247, 47] +49 None oneei FederationTestPlc1 [248, 48] +50 None oneej FederationTestPlc1 [249, 49] +51 None onefa FederationTestPlc1 [250, 50] +52 None onefb FederationTestPlc1 [251, 51] +53 None onefc FederationTestPlc1 [252, 52] +54 None onefd FederationTestPlc1 [253, 53] +55 None onefe FederationTestPlc1 [254, 54] +56 None oneff FederationTestPlc1 [255, 55] +57 None onefg FederationTestPlc1 [256, 56] +58 None onefh FederationTestPlc1 [257, 57] +59 None onefi FederationTestPlc1 [258, 58] +60 None onefj FederationTestPlc1 [259, 59] +61 None onega FederationTestPlc1 [260, 60] +62 None onegb FederationTestPlc1 [261, 61] +63 None onegc FederationTestPlc1 [262, 62] +64 None onegd FederationTestPlc1 [263, 63] +65 None onege FederationTestPlc1 [264, 64] +66 None onegf FederationTestPlc1 [265, 65] +67 None onegg FederationTestPlc1 [266, 66] +68 None onegh FederationTestPlc1 [267, 67] +69 None onegi FederationTestPlc1 [268, 68] +70 None onegj FederationTestPlc1 [269, 69] +71 None oneha FederationTestPlc1 [270, 70] +72 None onehb FederationTestPlc1 [271, 71] +73 None onehc FederationTestPlc1 [272, 72] +74 None onehd FederationTestPlc1 [273, 73] +75 None onehe FederationTestPlc1 [274, 74] +76 None onehf FederationTestPlc1 [275, 75] +77 None onehg FederationTestPlc1 [276, 76] +78 None onehh FederationTestPlc1 [277, 77] +79 None onehi FederationTestPlc1 [278, 78] +80 None onehj FederationTestPlc1 [279, 79] +81 None oneia FederationTestPlc1 [280, 80] +82 None oneib FederationTestPlc1 [281, 81] +83 None oneic FederationTestPlc1 [282, 82] +84 None oneid FederationTestPlc1 [283, 83] +85 None oneie FederationTestPlc1 [284, 84] +86 None oneif FederationTestPlc1 [285, 85] +87 None oneig FederationTestPlc1 [286, 86] +88 None oneih FederationTestPlc1 [287, 87] +89 None oneii FederationTestPlc1 [288, 88] +90 None oneij FederationTestPlc1 [289, 89] +91 None oneja FederationTestPlc1 [290, 90] +92 None onejb FederationTestPlc1 [291, 91] +93 None onejc FederationTestPlc1 [292, 92] +94 None onejd FederationTestPlc1 [293, 93] +95 None oneje FederationTestPlc1 [294, 94] +96 None onejf FederationTestPlc1 [295, 95] +97 None onejg FederationTestPlc1 [296, 96] +98 None onejh FederationTestPlc1 [297, 97] +99 None oneji FederationTestPlc1 [298, 98] +100 None onejj FederationTestPlc1 [299, 99] +101 None onebaa FederationTestPlc1 [300, 100] +102 None onebab FederationTestPlc1 [301, 101] +103 None onebac FederationTestPlc1 [302, 102] +104 None onebad FederationTestPlc1 [303, 103] +105 None onebae FederationTestPlc1 [304, 104] +106 None onebaf FederationTestPlc1 [305, 105] +107 None onebag FederationTestPlc1 [306, 106] +108 None onebah FederationTestPlc1 [307, 107] +109 None onebai FederationTestPlc1 [308, 108] +110 None onebaj FederationTestPlc1 [309, 109] +111 None onebba FederationTestPlc1 [310, 110] +112 None onebbb FederationTestPlc1 [311, 111] +113 None onebbc FederationTestPlc1 [312, 112] +114 None onebbd FederationTestPlc1 [313, 113] +115 None onebbe FederationTestPlc1 [314, 114] +116 None onebbf FederationTestPlc1 [315, 115] +117 None onebbg FederationTestPlc1 [316, 116] +118 None onebbh FederationTestPlc1 [317, 117] +119 None onebbi FederationTestPlc1 [318, 118] +120 None onebbj FederationTestPlc1 [319, 119] +121 None onebca FederationTestPlc1 [320, 120] +122 None onebcb FederationTestPlc1 [321, 121] +123 None onebcc FederationTestPlc1 [322, 122] +124 None onebcd FederationTestPlc1 [323, 123] +125 None onebce FederationTestPlc1 [324, 124] +126 None onebcf FederationTestPlc1 [325, 125] +127 None onebcg FederationTestPlc1 [326, 126] +128 None onebch FederationTestPlc1 [327, 127] +129 None onebci FederationTestPlc1 [328, 128] +130 None onebcj FederationTestPlc1 [329, 129] +131 None onebda FederationTestPlc1 [330, 130] +132 None onebdb FederationTestPlc1 [331, 131] +133 None onebdc FederationTestPlc1 [332, 132] +134 None onebdd FederationTestPlc1 [333, 133] +135 None onebde FederationTestPlc1 [334, 134] +136 None onebdf FederationTestPlc1 [335, 135] +137 None onebdg FederationTestPlc1 [336, 136] +138 None onebdh FederationTestPlc1 [337, 137] +139 None onebdi FederationTestPlc1 [338, 138] +140 None onebdj FederationTestPlc1 [339, 139] +141 None onebea FederationTestPlc1 [340, 140] +142 None onebeb FederationTestPlc1 [341, 141] +143 None onebec FederationTestPlc1 [342, 142] +144 None onebed FederationTestPlc1 [343, 143] +145 None onebee FederationTestPlc1 [344, 144] +146 None onebef FederationTestPlc1 [345, 145] +147 None onebeg FederationTestPlc1 [346, 146] +148 None onebeh FederationTestPlc1 [347, 147] +149 None onebei FederationTestPlc1 [348, 148] +150 None onebej FederationTestPlc1 [349, 149] +151 None onebfa FederationTestPlc1 [350, 150] +152 None onebfb FederationTestPlc1 [151] +153 None onebfc FederationTestPlc1 [152] +154 None onebfd FederationTestPlc1 [153] +155 None onebfe FederationTestPlc1 [154] +156 None onebff FederationTestPlc1 [155] +157 None onebfg FederationTestPlc1 [156] +158 None onebfh FederationTestPlc1 [157] +159 None onebfi FederationTestPlc1 [158] +160 None onebfj FederationTestPlc1 [159] +161 None onebga FederationTestPlc1 [160] +162 None onebgb FederationTestPlc1 [161] +163 None onebgc FederationTestPlc1 [162] +164 None onebgd FederationTestPlc1 [163] +165 None onebge FederationTestPlc1 [164] +166 None onebgf FederationTestPlc1 [165] +167 None onebgg FederationTestPlc1 [166] +168 None onebgh FederationTestPlc1 [167] +169 None onebgi FederationTestPlc1 [168] +170 None onebgj FederationTestPlc1 [169] +171 None onebha FederationTestPlc1 [170] +172 None onebhb FederationTestPlc1 [171] +173 None onebhc FederationTestPlc1 [172] +174 None onebhd FederationTestPlc1 [173] +175 None onebhe FederationTestPlc1 [174] +176 None onebhf FederationTestPlc1 [175] +177 None onebhg FederationTestPlc1 [176] +178 None onebhh FederationTestPlc1 [177] +179 None onebhi FederationTestPlc1 [178] +180 None onebhj FederationTestPlc1 [179] +181 None onebia FederationTestPlc1 [180] +182 None onebib FederationTestPlc1 [181] +183 None onebic FederationTestPlc1 [182] +184 None onebid FederationTestPlc1 [183] +185 None onebie FederationTestPlc1 [184] +186 None onebif FederationTestPlc1 [185] +187 None onebig FederationTestPlc1 [186] +188 None onebih FederationTestPlc1 [187] +189 None onebii FederationTestPlc1 [188] +190 None onebij FederationTestPlc1 [189] +191 None onebja FederationTestPlc1 [190] +192 None onebjb FederationTestPlc1 [191] +193 None onebjc FederationTestPlc1 [192] +194 None onebjd FederationTestPlc1 [193] +195 None onebje FederationTestPlc1 [194] +196 None onebjf FederationTestPlc1 [195] +197 None onebjg FederationTestPlc1 [196] +198 None onebjh FederationTestPlc1 [197] +199 None onebji FederationTestPlc1 [198] +200 None onebjj FederationTestPlc1 [199] +201 None onecaa FederationTestPlc1 [200] +202 1 plc2 FederationTestPlc2 Central [] +203 1 twob FederationTestPlc2 [551, 351] +204 1 twoc FederationTestPlc2 [552, 352] +205 1 twod FederationTestPlc2 [553, 353] +206 1 twoe FederationTestPlc2 [554, 354] +207 1 twof FederationTestPlc2 [555, 355] +208 1 twog FederationTestPlc2 [556, 356] +209 1 twoh FederationTestPlc2 [557, 357] +210 1 twoi FederationTestPlc2 [558, 358] +211 1 twoj FederationTestPlc2 [559, 359] +212 1 twoba FederationTestPlc2 [560, 360] +213 1 twobb FederationTestPlc2 [561, 361] +214 1 twobc FederationTestPlc2 [562, 362] +215 1 twobd FederationTestPlc2 [563, 363] +216 1 twobe FederationTestPlc2 [564, 364] +217 1 twobf FederationTestPlc2 [565, 365] +218 1 twobg FederationTestPlc2 [566, 366] +219 1 twobh FederationTestPlc2 [567, 367] +220 1 twobi FederationTestPlc2 [568, 368] +221 1 twobj FederationTestPlc2 [569, 369] +222 1 twoca FederationTestPlc2 [570, 370] +223 1 twocb FederationTestPlc2 [571, 371] +224 1 twocc FederationTestPlc2 [572, 372] +225 1 twocd FederationTestPlc2 [573, 373] +226 1 twoce FederationTestPlc2 [574, 374] +227 1 twocf FederationTestPlc2 [575, 375] +228 1 twocg FederationTestPlc2 [576, 376] +229 1 twoch FederationTestPlc2 [577, 377] +230 1 twoci FederationTestPlc2 [578, 378] +231 1 twocj FederationTestPlc2 [579, 379] +232 1 twoda FederationTestPlc2 [580, 380] +233 1 twodb FederationTestPlc2 [581, 381] +234 1 twodc FederationTestPlc2 [582, 382] +235 1 twodd FederationTestPlc2 [583, 383] +236 1 twode FederationTestPlc2 [584, 384] +237 1 twodf FederationTestPlc2 [585, 385] +238 1 twodg FederationTestPlc2 [586, 386] +239 1 twodh FederationTestPlc2 [587, 387] +240 1 twodi FederationTestPlc2 [588, 388] +241 1 twodj FederationTestPlc2 [589, 389] +242 1 twoea FederationTestPlc2 [590, 390] +243 1 twoeb FederationTestPlc2 [591, 391] +244 1 twoec FederationTestPlc2 [592, 392] +245 1 twoed FederationTestPlc2 [593, 393] +246 1 twoee FederationTestPlc2 [594, 394] +247 1 twoef FederationTestPlc2 [595, 395] +248 1 twoeg FederationTestPlc2 [596, 396] +249 1 twoeh FederationTestPlc2 [597, 397] +250 1 twoei FederationTestPlc2 [598, 398] +251 1 twoej FederationTestPlc2 [599, 399] +252 1 twofa FederationTestPlc2 [600, 400] +253 1 twofb FederationTestPlc2 [601, 401] +254 1 twofc FederationTestPlc2 [602, 402] +255 1 twofd FederationTestPlc2 [603, 403] +256 1 twofe FederationTestPlc2 [604, 404] +257 1 twoff FederationTestPlc2 [605, 405] +258 1 twofg FederationTestPlc2 [606, 406] +259 1 twofh FederationTestPlc2 [607, 407] +260 1 twofi FederationTestPlc2 [608, 408] +261 1 twofj FederationTestPlc2 [609, 409] +262 1 twoga FederationTestPlc2 [610, 410] +263 1 twogb FederationTestPlc2 [611, 411] +264 1 twogc FederationTestPlc2 [612, 412] +265 1 twogd FederationTestPlc2 [613, 413] +266 1 twoge FederationTestPlc2 [614, 414] +267 1 twogf FederationTestPlc2 [615, 415] +268 1 twogg FederationTestPlc2 [616, 416] +269 1 twogh FederationTestPlc2 [617, 417] +270 1 twogi FederationTestPlc2 [618, 418] +271 1 twogj FederationTestPlc2 [619, 419] +272 1 twoha FederationTestPlc2 [620, 420] +273 1 twohb FederationTestPlc2 [621, 421] +274 1 twohc FederationTestPlc2 [622, 422] +275 1 twohd FederationTestPlc2 [623, 423] +276 1 twohe FederationTestPlc2 [624, 424] +277 1 twohf FederationTestPlc2 [625, 425] +278 1 twohg FederationTestPlc2 [626, 426] +279 1 twohh FederationTestPlc2 [627, 427] +280 1 twohi FederationTestPlc2 [628, 428] +281 1 twohj FederationTestPlc2 [629, 429] +282 1 twoia FederationTestPlc2 [630, 430] +283 1 twoib FederationTestPlc2 [631, 431] +284 1 twoic FederationTestPlc2 [632, 432] +285 1 twoid FederationTestPlc2 [633, 433] +286 1 twoie FederationTestPlc2 [634, 434] +287 1 twoif FederationTestPlc2 [635, 435] +288 1 twoig FederationTestPlc2 [636, 436] +289 1 twoih FederationTestPlc2 [637, 437] +290 1 twoii FederationTestPlc2 [638, 438] +291 1 twoij FederationTestPlc2 [639, 439] +292 1 twoja FederationTestPlc2 [640, 440] +293 1 twojb FederationTestPlc2 [641, 441] +294 1 twojc FederationTestPlc2 [642, 442] +295 1 twojd FederationTestPlc2 [643, 443] +296 1 twoje FederationTestPlc2 [644, 444] +297 1 twojf FederationTestPlc2 [645, 445] +298 1 twojg FederationTestPlc2 [646, 446] +299 1 twojh FederationTestPlc2 [647, 447] +300 1 twoji FederationTestPlc2 [648, 448] +301 1 twojj FederationTestPlc2 [649, 449] +302 1 twobaa FederationTestPlc2 [650, 450] +303 1 twobab FederationTestPlc2 [651, 451] +304 1 twobac FederationTestPlc2 [652, 452] +305 1 twobad FederationTestPlc2 [653, 453] +306 1 twobae FederationTestPlc2 [654, 454] +307 1 twobaf FederationTestPlc2 [655, 455] +308 1 twobag FederationTestPlc2 [656, 456] +309 1 twobah FederationTestPlc2 [657, 457] +310 1 twobai FederationTestPlc2 [658, 458] +311 1 twobaj FederationTestPlc2 [659, 459] +312 1 twobba FederationTestPlc2 [660, 460] +313 1 twobbb FederationTestPlc2 [661, 461] +314 1 twobbc FederationTestPlc2 [662, 462] +315 1 twobbd FederationTestPlc2 [663, 463] +316 1 twobbe FederationTestPlc2 [664, 464] +317 1 twobbf FederationTestPlc2 [665, 465] +318 1 twobbg FederationTestPlc2 [666, 466] +319 1 twobbh FederationTestPlc2 [667, 467] +320 1 twobbi FederationTestPlc2 [668, 468] +321 1 twobbj FederationTestPlc2 [669, 469] +322 1 twobca FederationTestPlc2 [670, 470] +323 1 twobcb FederationTestPlc2 [671, 471] +324 1 twobcc FederationTestPlc2 [672, 472] +325 1 twobcd FederationTestPlc2 [673, 473] +326 1 twobce FederationTestPlc2 [674, 474] +327 1 twobcf FederationTestPlc2 [675, 475] +328 1 twobcg FederationTestPlc2 [676, 476] +329 1 twobch FederationTestPlc2 [677, 477] +330 1 twobci FederationTestPlc2 [678, 478] +331 1 twobcj FederationTestPlc2 [679, 479] +332 1 twobda FederationTestPlc2 [680, 480] +333 1 twobdb FederationTestPlc2 [681, 481] +334 1 twobdc FederationTestPlc2 [682, 482] +335 1 twobdd FederationTestPlc2 [683, 483] +336 1 twobde FederationTestPlc2 [684, 484] +337 1 twobdf FederationTestPlc2 [685, 485] +338 1 twobdg FederationTestPlc2 [686, 486] +339 1 twobdh FederationTestPlc2 [687, 487] +340 1 twobdi FederationTestPlc2 [688, 488] +341 1 twobdj FederationTestPlc2 [689, 489] +342 1 twobea FederationTestPlc2 [690, 490] +343 1 twobeb FederationTestPlc2 [691, 491] +344 1 twobec FederationTestPlc2 [692, 492] +345 1 twobed FederationTestPlc2 [693, 493] +346 1 twobee FederationTestPlc2 [694, 494] +347 1 twobef FederationTestPlc2 [695, 495] +348 1 twobeg FederationTestPlc2 [696, 496] +349 1 twobeh FederationTestPlc2 [697, 497] +350 1 twobei FederationTestPlc2 [698, 498] +351 1 twobej FederationTestPlc2 [699, 499] +352 1 twobfa FederationTestPlc2 [700, 500] +353 1 twobfb FederationTestPlc2 [501] +354 1 twobfc FederationTestPlc2 [502] +355 1 twobfd FederationTestPlc2 [503] +356 1 twobfe FederationTestPlc2 [504] +357 1 twobff FederationTestPlc2 [505] +358 1 twobfg FederationTestPlc2 [506] +359 1 twobfh FederationTestPlc2 [507] +360 1 twobfi FederationTestPlc2 [508] +361 1 twobfj FederationTestPlc2 [509] +362 1 twobga FederationTestPlc2 [510] +363 1 twobgb FederationTestPlc2 [511] +364 1 twobgc FederationTestPlc2 [512] +365 1 twobgd FederationTestPlc2 [513] +366 1 twobge FederationTestPlc2 [514] +367 1 twobgf FederationTestPlc2 [515] +368 1 twobgg FederationTestPlc2 [516] +369 1 twobgh FederationTestPlc2 [517] +370 1 twobgi FederationTestPlc2 [518] +371 1 twobgj FederationTestPlc2 [519] +372 1 twobha FederationTestPlc2 [520] +373 1 twobhb FederationTestPlc2 [521] +374 1 twobhc FederationTestPlc2 [522] +375 1 twobhd FederationTestPlc2 [523] +376 1 twobhe FederationTestPlc2 [524] +377 1 twobhf FederationTestPlc2 [525] +378 1 twobhg FederationTestPlc2 [526] +379 1 twobhh FederationTestPlc2 [527] +380 1 twobhi FederationTestPlc2 [528] +381 1 twobhj FederationTestPlc2 [529] +382 1 twobia FederationTestPlc2 [530] +383 1 twobib FederationTestPlc2 [531] +384 1 twobic FederationTestPlc2 [532] +385 1 twobid FederationTestPlc2 [533] +386 1 twobie FederationTestPlc2 [534] +387 1 twobif FederationTestPlc2 [535] +388 1 twobig FederationTestPlc2 [536] +389 1 twobih FederationTestPlc2 [537] +390 1 twobii FederationTestPlc2 [538] +391 1 twobij FederationTestPlc2 [539] +392 1 twobja FederationTestPlc2 [540] +393 1 twobjb FederationTestPlc2 [541] +394 1 twobjc FederationTestPlc2 [542] +395 1 twobjd FederationTestPlc2 [543] +396 1 twobje FederationTestPlc2 [544] +397 1 twobjf FederationTestPlc2 [545] +398 1 twobjg FederationTestPlc2 [546] +399 1 twobjh FederationTestPlc2 [547] +400 1 twobji FederationTestPlc2 [548] +401 1 twobjj FederationTestPlc2 [549] +402 1 twocaa FederationTestPlc2 [550] +01: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 None ssh-rsa somekey4plctestbed user2-key1 +3 None ssh-rsa somekey4plctestbed user3-key1 +4 None ssh-rsa somekey4plctestbed user4-key1 +5 None ssh-rsa somekey4plctestbed user5-key1 +6 None ssh-rsa somekey4plctestbed user6-key1 +7 None ssh-rsa somekey4plctestbed user7-key1 +8 None ssh-rsa somekey4plctestbed user8-key1 +9 None ssh-rsa somekey4plctestbed user9-key1 +10 None ssh-rsa somekey4plctestbed user10-key1 +11 None ssh-rsa somekey4plctestbed user11-key1 +12 None ssh-rsa somekey4plctestbed user12-key1 +13 None ssh-rsa somekey4plctestbed user13-key1 +14 None ssh-rsa somekey4plctestbed user14-key1 +15 None ssh-rsa somekey4plctestbed user15-key1 +16 None ssh-rsa somekey4plctestbed user16-key1 +17 None ssh-rsa somekey4plctestbed user17-key1 +18 None ssh-rsa somekey4plctestbed user18-key1 +19 None ssh-rsa somekey4plctestbed user19-key1 +20 None ssh-rsa somekey4plctestbed user20-key1 +21 None ssh-rsa somekey4plctestbed user21-key1 +22 None ssh-rsa somekey4plctestbed user22-key1 +23 None ssh-rsa somekey4plctestbed user23-key1 +24 None ssh-rsa somekey4plctestbed user24-key1 +25 None ssh-rsa somekey4plctestbed user25-key1 +26 None ssh-rsa somekey4plctestbed user26-key1 +27 None ssh-rsa somekey4plctestbed user27-key1 +28 None ssh-rsa somekey4plctestbed user28-key1 +29 None ssh-rsa somekey4plctestbed user29-key1 +30 None ssh-rsa somekey4plctestbed user30-key1 +31 None ssh-rsa somekey4plctestbed user31-key1 +32 None ssh-rsa somekey4plctestbed user32-key1 +33 None ssh-rsa somekey4plctestbed user33-key1 +34 None ssh-rsa somekey4plctestbed user34-key1 +35 None ssh-rsa somekey4plctestbed user35-key1 +36 None ssh-rsa somekey4plctestbed user36-key1 +37 None ssh-rsa somekey4plctestbed user37-key1 +38 None ssh-rsa somekey4plctestbed user38-key1 +39 None ssh-rsa somekey4plctestbed user39-key1 +40 None ssh-rsa somekey4plctestbed user40-key1 +41 None ssh-rsa somekey4plctestbed user41-key1 +42 None ssh-rsa somekey4plctestbed user42-key1 +43 None ssh-rsa somekey4plctestbed user43-key1 +44 None ssh-rsa somekey4plctestbed user44-key1 +45 None ssh-rsa somekey4plctestbed user45-key1 +46 None ssh-rsa somekey4plctestbed user46-key1 +47 None ssh-rsa somekey4plctestbed user47-key1 +48 None ssh-rsa somekey4plctestbed user48-key1 +49 None ssh-rsa somekey4plctestbed user49-key1 +50 None ssh-rsa somekey4plctestbed user50-key1 +51 None ssh-rsa somekey4plctestbed user51-key1 +52 None ssh-rsa somekey4plctestbed user52-key1 +53 None ssh-rsa somekey4plctestbed user53-key1 +54 None ssh-rsa somekey4plctestbed user54-key1 +55 None ssh-rsa somekey4plctestbed user55-key1 +56 None ssh-rsa somekey4plctestbed user56-key1 +57 None ssh-rsa somekey4plctestbed user57-key1 +58 None ssh-rsa somekey4plctestbed user58-key1 +59 None ssh-rsa somekey4plctestbed user59-key1 +60 None ssh-rsa somekey4plctestbed user60-key1 +61 None ssh-rsa somekey4plctestbed user61-key1 +62 None ssh-rsa somekey4plctestbed user62-key1 +63 None ssh-rsa somekey4plctestbed user63-key1 +64 None ssh-rsa somekey4plctestbed user64-key1 +65 None ssh-rsa somekey4plctestbed user65-key1 +66 None ssh-rsa somekey4plctestbed user66-key1 +67 None ssh-rsa somekey4plctestbed user67-key1 +68 None ssh-rsa somekey4plctestbed user68-key1 +69 None ssh-rsa somekey4plctestbed user69-key1 +70 None ssh-rsa somekey4plctestbed user70-key1 +71 None ssh-rsa somekey4plctestbed user71-key1 +72 None ssh-rsa somekey4plctestbed user72-key1 +73 None ssh-rsa somekey4plctestbed user73-key1 +74 None ssh-rsa somekey4plctestbed user74-key1 +75 None ssh-rsa somekey4plctestbed user75-key1 +76 None ssh-rsa somekey4plctestbed user76-key1 +77 None ssh-rsa somekey4plctestbed user77-key1 +78 None ssh-rsa somekey4plctestbed user78-key1 +79 None ssh-rsa somekey4plctestbed user79-key1 +80 None ssh-rsa somekey4plctestbed user80-key1 +81 None ssh-rsa somekey4plctestbed user81-key1 +82 None ssh-rsa somekey4plctestbed user82-key1 +83 None ssh-rsa somekey4plctestbed user83-key1 +84 None ssh-rsa somekey4plctestbed user84-key1 +85 None ssh-rsa somekey4plctestbed user85-key1 +86 None ssh-rsa somekey4plctestbed user86-key1 +87 None ssh-rsa somekey4plctestbed user87-key1 +88 None ssh-rsa somekey4plctestbed user88-key1 +89 None ssh-rsa somekey4plctestbed user89-key1 +90 None ssh-rsa somekey4plctestbed user90-key1 +91 None ssh-rsa somekey4plctestbed user91-key1 +92 None ssh-rsa somekey4plctestbed user92-key1 +93 None ssh-rsa somekey4plctestbed user93-key1 +94 None ssh-rsa somekey4plctestbed user94-key1 +95 None ssh-rsa somekey4plctestbed user95-key1 +96 None ssh-rsa somekey4plctestbed user96-key1 +97 None ssh-rsa somekey4plctestbed user97-key1 +98 None ssh-rsa somekey4plctestbed user98-key1 +99 None ssh-rsa somekey4plctestbed user99-key1 +100 None ssh-rsa somekey4plctestbed user100-key1 +101 None ssh-rsa somekey4plctestbed user101-key1 +102 None ssh-rsa somekey4plctestbed user102-key1 +103 None ssh-rsa somekey4plctestbed user103-key1 +104 None ssh-rsa somekey4plctestbed user104-key1 +105 None ssh-rsa somekey4plctestbed user105-key1 +106 None ssh-rsa somekey4plctestbed user106-key1 +107 None ssh-rsa somekey4plctestbed user107-key1 +108 None ssh-rsa somekey4plctestbed user108-key1 +109 None ssh-rsa somekey4plctestbed user109-key1 +110 None ssh-rsa somekey4plctestbed user110-key1 +111 None ssh-rsa somekey4plctestbed user111-key1 +112 None ssh-rsa somekey4plctestbed user112-key1 +113 None ssh-rsa somekey4plctestbed user113-key1 +114 None ssh-rsa somekey4plctestbed user114-key1 +115 None ssh-rsa somekey4plctestbed user115-key1 +116 None ssh-rsa somekey4plctestbed user116-key1 +117 None ssh-rsa somekey4plctestbed user117-key1 +118 None ssh-rsa somekey4plctestbed user118-key1 +119 None ssh-rsa somekey4plctestbed user119-key1 +120 None ssh-rsa somekey4plctestbed user120-key1 +121 None ssh-rsa somekey4plctestbed user121-key1 +122 None ssh-rsa somekey4plctestbed user122-key1 +123 None ssh-rsa somekey4plctestbed user123-key1 +124 None ssh-rsa somekey4plctestbed user124-key1 +125 None ssh-rsa somekey4plctestbed user125-key1 +126 None ssh-rsa somekey4plctestbed user126-key1 +127 None ssh-rsa somekey4plctestbed user127-key1 +128 None ssh-rsa somekey4plctestbed user128-key1 +129 None ssh-rsa somekey4plctestbed user129-key1 +130 None ssh-rsa somekey4plctestbed user130-key1 +131 None ssh-rsa somekey4plctestbed user131-key1 +132 None ssh-rsa somekey4plctestbed user132-key1 +133 None ssh-rsa somekey4plctestbed user133-key1 +134 None ssh-rsa somekey4plctestbed user134-key1 +135 None ssh-rsa somekey4plctestbed user135-key1 +136 None ssh-rsa somekey4plctestbed user136-key1 +137 None ssh-rsa somekey4plctestbed user137-key1 +138 None ssh-rsa somekey4plctestbed user138-key1 +139 None ssh-rsa somekey4plctestbed user139-key1 +140 None ssh-rsa somekey4plctestbed user140-key1 +141 None ssh-rsa somekey4plctestbed user141-key1 +142 None ssh-rsa somekey4plctestbed user142-key1 +143 None ssh-rsa somekey4plctestbed user143-key1 +144 None ssh-rsa somekey4plctestbed user144-key1 +145 None ssh-rsa somekey4plctestbed user145-key1 +146 None ssh-rsa somekey4plctestbed user146-key1 +147 None ssh-rsa somekey4plctestbed user147-key1 +148 None ssh-rsa somekey4plctestbed user148-key1 +149 None ssh-rsa somekey4plctestbed user149-key1 +150 None ssh-rsa somekey4plctestbed user150-key1 +151 None ssh-rsa somekey4plctestbed user151-key1 +152 None ssh-rsa somekey4plctestbed user152-key1 +153 None ssh-rsa somekey4plctestbed user153-key1 +154 None ssh-rsa somekey4plctestbed user154-key1 +155 None ssh-rsa somekey4plctestbed user155-key1 +156 None ssh-rsa somekey4plctestbed user156-key1 +157 None ssh-rsa somekey4plctestbed user157-key1 +158 None ssh-rsa somekey4plctestbed user158-key1 +159 None ssh-rsa somekey4plctestbed user159-key1 +160 None ssh-rsa somekey4plctestbed user160-key1 +161 None ssh-rsa somekey4plctestbed user161-key1 +162 None ssh-rsa somekey4plctestbed user162-key1 +163 None ssh-rsa somekey4plctestbed user163-key1 +164 None ssh-rsa somekey4plctestbed user164-key1 +165 None ssh-rsa somekey4plctestbed user165-key1 +166 None ssh-rsa somekey4plctestbed user166-key1 +167 None ssh-rsa somekey4plctestbed user167-key1 +168 None ssh-rsa somekey4plctestbed user168-key1 +169 None ssh-rsa somekey4plctestbed user169-key1 +170 None ssh-rsa somekey4plctestbed user170-key1 +171 None ssh-rsa somekey4plctestbed user171-key1 +172 None ssh-rsa somekey4plctestbed user172-key1 +173 None ssh-rsa somekey4plctestbed user173-key1 +174 None ssh-rsa somekey4plctestbed user174-key1 +175 None ssh-rsa somekey4plctestbed user175-key1 +176 None ssh-rsa somekey4plctestbed user176-key1 +177 None ssh-rsa somekey4plctestbed user177-key1 +178 None ssh-rsa somekey4plctestbed user178-key1 +179 None ssh-rsa somekey4plctestbed user179-key1 +180 None ssh-rsa somekey4plctestbed user180-key1 +181 None ssh-rsa somekey4plctestbed user181-key1 +182 None ssh-rsa somekey4plctestbed user182-key1 +183 None ssh-rsa somekey4plctestbed user183-key1 +184 None ssh-rsa somekey4plctestbed user184-key1 +185 None ssh-rsa somekey4plctestbed user185-key1 +186 None ssh-rsa somekey4plctestbed user186-key1 +187 None ssh-rsa somekey4plctestbed user187-key1 +188 None ssh-rsa somekey4plctestbed user188-key1 +189 None ssh-rsa somekey4plctestbed user189-key1 +190 None ssh-rsa somekey4plctestbed user190-key1 +191 None ssh-rsa somekey4plctestbed user191-key1 +192 None ssh-rsa somekey4plctestbed user192-key1 +193 None ssh-rsa somekey4plctestbed user193-key1 +194 None ssh-rsa somekey4plctestbed user194-key1 +195 None ssh-rsa somekey4plctestbed user195-key1 +196 None ssh-rsa somekey4plctestbed user196-key1 +197 None ssh-rsa somekey4plctestbed user197-key1 +198 None ssh-rsa somekey4plctestbed user198-key1 +199 None ssh-rsa somekey4plctestbed user199-key1 +200 None ssh-rsa somekey4plctestbed user200-key1 +201 None ssh-rsa somekey4plctestbed user201-key1 +202 None ssh-rsa somekey4plctestbed user202-key1 +203 None ssh-rsa somekey4plctestbed user203-key1 +204 None ssh-rsa somekey4plctestbed user204-key1 +205 None ssh-rsa somekey4plctestbed user205-key1 +206 None ssh-rsa somekey4plctestbed user206-key1 +207 None ssh-rsa somekey4plctestbed user207-key1 +208 None ssh-rsa somekey4plctestbed user208-key1 +209 None ssh-rsa somekey4plctestbed user209-key1 +210 None ssh-rsa somekey4plctestbed user210-key1 +211 None ssh-rsa somekey4plctestbed user211-key1 +212 None ssh-rsa somekey4plctestbed user212-key1 +213 None ssh-rsa somekey4plctestbed user213-key1 +214 None ssh-rsa somekey4plctestbed user214-key1 +215 None ssh-rsa somekey4plctestbed user215-key1 +216 None ssh-rsa somekey4plctestbed user216-key1 +217 None ssh-rsa somekey4plctestbed user217-key1 +218 None ssh-rsa somekey4plctestbed user218-key1 +219 None ssh-rsa somekey4plctestbed user219-key1 +220 None ssh-rsa somekey4plctestbed user220-key1 +221 None ssh-rsa somekey4plctestbed user221-key1 +222 None ssh-rsa somekey4plctestbed user222-key1 +223 None ssh-rsa somekey4plctestbed user223-key1 +224 None ssh-rsa somekey4plctestbed user224-key1 +225 None ssh-rsa somekey4plctestbed user225-key1 +226 None ssh-rsa somekey4plctestbed user226-key1 +227 None ssh-rsa somekey4plctestbed user227-key1 +228 None ssh-rsa somekey4plctestbed user228-key1 +229 None ssh-rsa somekey4plctestbed user229-key1 +230 None ssh-rsa somekey4plctestbed user230-key1 +231 None ssh-rsa somekey4plctestbed user231-key1 +232 None ssh-rsa somekey4plctestbed user232-key1 +233 None ssh-rsa somekey4plctestbed user233-key1 +234 None ssh-rsa somekey4plctestbed user234-key1 +235 None ssh-rsa somekey4plctestbed user235-key1 +236 None ssh-rsa somekey4plctestbed user236-key1 +237 None ssh-rsa somekey4plctestbed user237-key1 +238 None ssh-rsa somekey4plctestbed user238-key1 +239 None ssh-rsa somekey4plctestbed user239-key1 +240 None ssh-rsa somekey4plctestbed user240-key1 +241 None ssh-rsa somekey4plctestbed user241-key1 +242 None ssh-rsa somekey4plctestbed user242-key1 +243 None ssh-rsa somekey4plctestbed user243-key1 +244 None ssh-rsa somekey4plctestbed user244-key1 +245 None ssh-rsa somekey4plctestbed user245-key1 +246 None ssh-rsa somekey4plctestbed user246-key1 +247 None ssh-rsa somekey4plctestbed user247-key1 +248 None ssh-rsa somekey4plctestbed user248-key1 +249 None ssh-rsa somekey4plctestbed user249-key1 +250 None ssh-rsa somekey4plctestbed user250-key1 +251 None ssh-rsa somekey4plctestbed user251-key1 +252 None ssh-rsa somekey4plctestbed user252-key1 +253 None ssh-rsa somekey4plctestbed user253-key1 +254 None ssh-rsa somekey4plctestbed user254-key1 +255 None ssh-rsa somekey4plctestbed user255-key1 +256 None ssh-rsa somekey4plctestbed user256-key1 +257 None ssh-rsa somekey4plctestbed user257-key1 +258 None ssh-rsa somekey4plctestbed user258-key1 +259 None ssh-rsa somekey4plctestbed user259-key1 +260 None ssh-rsa somekey4plctestbed user260-key1 +261 None ssh-rsa somekey4plctestbed user261-key1 +262 None ssh-rsa somekey4plctestbed user262-key1 +263 None ssh-rsa somekey4plctestbed user263-key1 +264 None ssh-rsa somekey4plctestbed user264-key1 +265 None ssh-rsa somekey4plctestbed user265-key1 +266 None ssh-rsa somekey4plctestbed user266-key1 +267 None ssh-rsa somekey4plctestbed user267-key1 +268 None ssh-rsa somekey4plctestbed user268-key1 +269 None ssh-rsa somekey4plctestbed user269-key1 +270 None ssh-rsa somekey4plctestbed user270-key1 +271 None ssh-rsa somekey4plctestbed user271-key1 +272 None ssh-rsa somekey4plctestbed user272-key1 +273 None ssh-rsa somekey4plctestbed user273-key1 +274 None ssh-rsa somekey4plctestbed user274-key1 +275 None ssh-rsa somekey4plctestbed user275-key1 +276 None ssh-rsa somekey4plctestbed user276-key1 +277 None ssh-rsa somekey4plctestbed user277-key1 +278 None ssh-rsa somekey4plctestbed user278-key1 +279 None ssh-rsa somekey4plctestbed user279-key1 +280 None ssh-rsa somekey4plctestbed user280-key1 +281 None ssh-rsa somekey4plctestbed user281-key1 +282 None ssh-rsa somekey4plctestbed user282-key1 +283 None ssh-rsa somekey4plctestbed user283-key1 +284 None ssh-rsa somekey4plctestbed user284-key1 +285 None ssh-rsa somekey4plctestbed user285-key1 +286 None ssh-rsa somekey4plctestbed user286-key1 +287 None ssh-rsa somekey4plctestbed user287-key1 +288 None ssh-rsa somekey4plctestbed user288-key1 +289 None ssh-rsa somekey4plctestbed user289-key1 +290 None ssh-rsa somekey4plctestbed user290-key1 +291 None ssh-rsa somekey4plctestbed user291-key1 +292 None ssh-rsa somekey4plctestbed user292-key1 +293 None ssh-rsa somekey4plctestbed user293-key1 +294 None ssh-rsa somekey4plctestbed user294-key1 +295 None ssh-rsa somekey4plctestbed user295-key1 +296 None ssh-rsa somekey4plctestbed user296-key1 +297 None ssh-rsa somekey4plctestbed user297-key1 +298 None ssh-rsa somekey4plctestbed user298-key1 +299 None ssh-rsa somekey4plctestbed user299-key1 +300 None ssh-rsa somekey4plctestbed user300-key1 +301 None ssh-rsa somekey4plctestbed user301-key1 +302 None ssh-rsa somekey4plctestbed user302-key1 +303 None ssh-rsa somekey4plctestbed user303-key1 +304 None ssh-rsa somekey4plctestbed user304-key1 +305 None ssh-rsa somekey4plctestbed user305-key1 +306 None ssh-rsa somekey4plctestbed user306-key1 +307 None ssh-rsa somekey4plctestbed user307-key1 +308 None ssh-rsa somekey4plctestbed user308-key1 +309 None ssh-rsa somekey4plctestbed user309-key1 +310 None ssh-rsa somekey4plctestbed user310-key1 +311 None ssh-rsa somekey4plctestbed user311-key1 +312 None ssh-rsa somekey4plctestbed user312-key1 +313 None ssh-rsa somekey4plctestbed user313-key1 +314 None ssh-rsa somekey4plctestbed user314-key1 +315 None ssh-rsa somekey4plctestbed user315-key1 +316 None ssh-rsa somekey4plctestbed user316-key1 +317 None ssh-rsa somekey4plctestbed user317-key1 +318 None ssh-rsa somekey4plctestbed user318-key1 +319 None ssh-rsa somekey4plctestbed user319-key1 +320 None ssh-rsa somekey4plctestbed user320-key1 +321 None ssh-rsa somekey4plctestbed user321-key1 +322 None ssh-rsa somekey4plctestbed user322-key1 +323 None ssh-rsa somekey4plctestbed user323-key1 +324 None ssh-rsa somekey4plctestbed user324-key1 +325 None ssh-rsa somekey4plctestbed user325-key1 +326 None ssh-rsa somekey4plctestbed user326-key1 +327 None ssh-rsa somekey4plctestbed user327-key1 +328 None ssh-rsa somekey4plctestbed user328-key1 +329 None ssh-rsa somekey4plctestbed user329-key1 +330 None ssh-rsa somekey4plctestbed user330-key1 +331 None ssh-rsa somekey4plctestbed user331-key1 +332 None ssh-rsa somekey4plctestbed user332-key1 +333 None ssh-rsa somekey4plctestbed user333-key1 +334 None ssh-rsa somekey4plctestbed user334-key1 +335 None ssh-rsa somekey4plctestbed user335-key1 +336 None ssh-rsa somekey4plctestbed user336-key1 +337 None ssh-rsa somekey4plctestbed user337-key1 +338 None ssh-rsa somekey4plctestbed user338-key1 +339 None ssh-rsa somekey4plctestbed user339-key1 +340 None ssh-rsa somekey4plctestbed user340-key1 +341 None ssh-rsa somekey4plctestbed user341-key1 +342 None ssh-rsa somekey4plctestbed user342-key1 +343 None ssh-rsa somekey4plctestbed user343-key1 +344 None ssh-rsa somekey4plctestbed user344-key1 +345 None ssh-rsa somekey4plctestbed user345-key1 +346 None ssh-rsa somekey4plctestbed user346-key1 +347 None ssh-rsa somekey4plctestbed user347-key1 +348 None ssh-rsa somekey4plctestbed user348-key1 +349 None ssh-rsa somekey4plctestbed user349-key1 +350 None ssh-rsa somekey4plctestbed user350-key1 +351 None ssh-rsa somekey4plctestbed user351-key1 +352 None ssh-rsa somekey4plctestbed user352-key1 +353 None ssh-rsa somekey4plctestbed user353-key1 +354 None ssh-rsa somekey4plctestbed user354-key1 +355 None ssh-rsa somekey4plctestbed user355-key1 +356 None ssh-rsa somekey4plctestbed user356-key1 +357 None ssh-rsa somekey4plctestbed user357-key1 +358 None ssh-rsa somekey4plctestbed user358-key1 +359 None ssh-rsa somekey4plctestbed user359-key1 +360 None ssh-rsa somekey4plctestbed user360-key1 +361 None ssh-rsa somekey4plctestbed user361-key1 +362 None ssh-rsa somekey4plctestbed user362-key1 +363 None ssh-rsa somekey4plctestbed user363-key1 +364 None ssh-rsa somekey4plctestbed user364-key1 +365 None ssh-rsa somekey4plctestbed user365-key1 +366 None ssh-rsa somekey4plctestbed user366-key1 +367 None ssh-rsa somekey4plctestbed user367-key1 +368 None ssh-rsa somekey4plctestbed user368-key1 +369 None ssh-rsa somekey4plctestbed user369-key1 +370 None ssh-rsa somekey4plctestbed user370-key1 +371 None ssh-rsa somekey4plctestbed user371-key1 +372 None ssh-rsa somekey4plctestbed user372-key1 +373 None ssh-rsa somekey4plctestbed user373-key1 +374 None ssh-rsa somekey4plctestbed user374-key1 +375 None ssh-rsa somekey4plctestbed user375-key1 +376 None ssh-rsa somekey4plctestbed user376-key1 +377 None ssh-rsa somekey4plctestbed user377-key1 +378 None ssh-rsa somekey4plctestbed user378-key1 +379 None ssh-rsa somekey4plctestbed user379-key1 +380 None ssh-rsa somekey4plctestbed user380-key1 +381 None ssh-rsa somekey4plctestbed user381-key1 +382 None ssh-rsa somekey4plctestbed user382-key1 +383 None ssh-rsa somekey4plctestbed user383-key1 +384 None ssh-rsa somekey4plctestbed user384-key1 +385 None ssh-rsa somekey4plctestbed user385-key1 +386 None ssh-rsa somekey4plctestbed user386-key1 +387 None ssh-rsa somekey4plctestbed user387-key1 +388 None ssh-rsa somekey4plctestbed user388-key1 +389 None ssh-rsa somekey4plctestbed user389-key1 +390 None ssh-rsa somekey4plctestbed user390-key1 +391 None ssh-rsa somekey4plctestbed user391-key1 +392 None ssh-rsa somekey4plctestbed user392-key1 +393 None ssh-rsa somekey4plctestbed user393-key1 +394 None ssh-rsa somekey4plctestbed user394-key1 +395 None ssh-rsa somekey4plctestbed user395-key1 +396 None ssh-rsa somekey4plctestbed user396-key1 +397 None ssh-rsa somekey4plctestbed user397-key1 +398 None ssh-rsa somekey4plctestbed user398-key1 +399 None ssh-rsa somekey4plctestbed user399-key1 +400 None ssh-rsa somekey4plctestbed user400-key1 +401 None ssh-rsa somekey4plctestbed user401-key1 +402 None ssh-rsa somekey4plctestbed user402-key1 +403 None ssh-rsa somekey4plctestbed user403-key1 +404 None ssh-rsa somekey4plctestbed user404-key1 +405 None ssh-rsa somekey4plctestbed user405-key1 +406 None ssh-rsa somekey4plctestbed user406-key1 +407 None ssh-rsa somekey4plctestbed user407-key1 +408 None ssh-rsa somekey4plctestbed user408-key1 +409 None ssh-rsa somekey4plctestbed user409-key1 +410 None ssh-rsa somekey4plctestbed user410-key1 +411 None ssh-rsa somekey4plctestbed user411-key1 +412 None ssh-rsa somekey4plctestbed user412-key1 +413 None ssh-rsa somekey4plctestbed user413-key1 +414 None ssh-rsa somekey4plctestbed user414-key1 +415 None ssh-rsa somekey4plctestbed user415-key1 +416 None ssh-rsa somekey4plctestbed user416-key1 +417 None ssh-rsa somekey4plctestbed user417-key1 +418 None ssh-rsa somekey4plctestbed user418-key1 +419 None ssh-rsa somekey4plctestbed user419-key1 +420 None ssh-rsa somekey4plctestbed user420-key1 +421 None ssh-rsa somekey4plctestbed user421-key1 +422 None ssh-rsa somekey4plctestbed user422-key1 +423 None ssh-rsa somekey4plctestbed user423-key1 +424 None ssh-rsa somekey4plctestbed user424-key1 +425 None ssh-rsa somekey4plctestbed user425-key1 +426 None ssh-rsa somekey4plctestbed user426-key1 +427 None ssh-rsa somekey4plctestbed user427-key1 +428 None ssh-rsa somekey4plctestbed user428-key1 +429 None ssh-rsa somekey4plctestbed user429-key1 +430 None ssh-rsa somekey4plctestbed user430-key1 +431 None ssh-rsa somekey4plctestbed user431-key1 +432 None ssh-rsa somekey4plctestbed user432-key1 +433 None ssh-rsa somekey4plctestbed user433-key1 +434 None ssh-rsa somekey4plctestbed user434-key1 +435 None ssh-rsa somekey4plctestbed user435-key1 +436 None ssh-rsa somekey4plctestbed user436-key1 +437 None ssh-rsa somekey4plctestbed user437-key1 +438 None ssh-rsa somekey4plctestbed user438-key1 +439 None ssh-rsa somekey4plctestbed user439-key1 +440 None ssh-rsa somekey4plctestbed user440-key1 +441 None ssh-rsa somekey4plctestbed user441-key1 +442 None ssh-rsa somekey4plctestbed user442-key1 +443 None ssh-rsa somekey4plctestbed user443-key1 +444 None ssh-rsa somekey4plctestbed user444-key1 +445 None ssh-rsa somekey4plctestbed user445-key1 +446 None ssh-rsa somekey4plctestbed user446-key1 +447 None ssh-rsa somekey4plctestbed user447-key1 +448 None ssh-rsa somekey4plctestbed user448-key1 +449 None ssh-rsa somekey4plctestbed user449-key1 +450 None ssh-rsa somekey4plctestbed user450-key1 +451 None ssh-rsa somekey4plctestbed user451-key1 +452 None ssh-rsa somekey4plctestbed user452-key1 +453 None ssh-rsa somekey4plctestbed user453-key1 +454 None ssh-rsa somekey4plctestbed user454-key1 +455 None ssh-rsa somekey4plctestbed user455-key1 +456 None ssh-rsa somekey4plctestbed user456-key1 +457 None ssh-rsa somekey4plctestbed user457-key1 +458 None ssh-rsa somekey4plctestbed user458-key1 +459 None ssh-rsa somekey4plctestbed user459-key1 +460 None ssh-rsa somekey4plctestbed user460-key1 +461 None ssh-rsa somekey4plctestbed user461-key1 +462 None ssh-rsa somekey4plctestbed user462-key1 +463 None ssh-rsa somekey4plctestbed user463-key1 +464 None ssh-rsa somekey4plctestbed user464-key1 +465 None ssh-rsa somekey4plctestbed user465-key1 +466 None ssh-rsa somekey4plctestbed user466-key1 +467 None ssh-rsa somekey4plctestbed user467-key1 +468 None ssh-rsa somekey4plctestbed user468-key1 +469 None ssh-rsa somekey4plctestbed user469-key1 +470 None ssh-rsa somekey4plctestbed user470-key1 +471 None ssh-rsa somekey4plctestbed user471-key1 +472 None ssh-rsa somekey4plctestbed user472-key1 +473 None ssh-rsa somekey4plctestbed user473-key1 +474 None ssh-rsa somekey4plctestbed user474-key1 +475 None ssh-rsa somekey4plctestbed user475-key1 +476 None ssh-rsa somekey4plctestbed user476-key1 +477 None ssh-rsa somekey4plctestbed user477-key1 +478 None ssh-rsa somekey4plctestbed user478-key1 +479 None ssh-rsa somekey4plctestbed user479-key1 +480 None ssh-rsa somekey4plctestbed user480-key1 +481 None ssh-rsa somekey4plctestbed user481-key1 +482 None ssh-rsa somekey4plctestbed user482-key1 +483 None ssh-rsa somekey4plctestbed user483-key1 +484 None ssh-rsa somekey4plctestbed user484-key1 +485 None ssh-rsa somekey4plctestbed user485-key1 +486 None ssh-rsa somekey4plctestbed user486-key1 +487 None ssh-rsa somekey4plctestbed user487-key1 +488 None ssh-rsa somekey4plctestbed user488-key1 +489 None ssh-rsa somekey4plctestbed user489-key1 +490 None ssh-rsa somekey4plctestbed user490-key1 +491 None ssh-rsa somekey4plctestbed user491-key1 +492 None ssh-rsa somekey4plctestbed user492-key1 +493 None ssh-rsa somekey4plctestbed user493-key1 +494 None ssh-rsa somekey4plctestbed user494-key1 +495 None ssh-rsa somekey4plctestbed user495-key1 +496 None ssh-rsa somekey4plctestbed user496-key1 +497 None ssh-rsa somekey4plctestbed user497-key1 +498 None ssh-rsa somekey4plctestbed user498-key1 +499 None ssh-rsa somekey4plctestbed user499-key1 +500 None ssh-rsa somekey4plctestbed user500-key1 +501 1 ssh-rsa somekey4plctestbed user1-key1 +502 1 ssh-rsa somekey4plctestbed user2-key1 +503 1 ssh-rsa somekey4plctestbed user3-key1 +504 1 ssh-rsa somekey4plctestbed user4-key1 +505 1 ssh-rsa somekey4plctestbed user5-key1 +506 1 ssh-rsa somekey4plctestbed user6-key1 +507 1 ssh-rsa somekey4plctestbed user7-key1 +508 1 ssh-rsa somekey4plctestbed user8-key1 +509 1 ssh-rsa somekey4plctestbed user9-key1 +510 1 ssh-rsa somekey4plctestbed user10-key1 +511 1 ssh-rsa somekey4plctestbed user11-key1 +512 1 ssh-rsa somekey4plctestbed user12-key1 +513 1 ssh-rsa somekey4plctestbed user13-key1 +514 1 ssh-rsa somekey4plctestbed user14-key1 +515 1 ssh-rsa somekey4plctestbed user15-key1 +516 1 ssh-rsa somekey4plctestbed user16-key1 +517 1 ssh-rsa somekey4plctestbed user17-key1 +518 1 ssh-rsa somekey4plctestbed user18-key1 +519 1 ssh-rsa somekey4plctestbed user19-key1 +520 1 ssh-rsa somekey4plctestbed user20-key1 +521 1 ssh-rsa somekey4plctestbed user21-key1 +522 1 ssh-rsa somekey4plctestbed user22-key1 +523 1 ssh-rsa somekey4plctestbed user23-key1 +524 1 ssh-rsa somekey4plctestbed user24-key1 +525 1 ssh-rsa somekey4plctestbed user25-key1 +526 1 ssh-rsa somekey4plctestbed user26-key1 +527 1 ssh-rsa somekey4plctestbed user27-key1 +528 1 ssh-rsa somekey4plctestbed user28-key1 +529 1 ssh-rsa somekey4plctestbed user29-key1 +530 1 ssh-rsa somekey4plctestbed user30-key1 +531 1 ssh-rsa somekey4plctestbed user31-key1 +532 1 ssh-rsa somekey4plctestbed user32-key1 +533 1 ssh-rsa somekey4plctestbed user33-key1 +534 1 ssh-rsa somekey4plctestbed user34-key1 +535 1 ssh-rsa somekey4plctestbed user35-key1 +536 1 ssh-rsa somekey4plctestbed user36-key1 +537 1 ssh-rsa somekey4plctestbed user37-key1 +538 1 ssh-rsa somekey4plctestbed user38-key1 +539 1 ssh-rsa somekey4plctestbed user39-key1 +540 1 ssh-rsa somekey4plctestbed user40-key1 +541 1 ssh-rsa somekey4plctestbed user41-key1 +542 1 ssh-rsa somekey4plctestbed user42-key1 +543 1 ssh-rsa somekey4plctestbed user43-key1 +544 1 ssh-rsa somekey4plctestbed user44-key1 +545 1 ssh-rsa somekey4plctestbed user45-key1 +546 1 ssh-rsa somekey4plctestbed user46-key1 +547 1 ssh-rsa somekey4plctestbed user47-key1 +548 1 ssh-rsa somekey4plctestbed user48-key1 +549 1 ssh-rsa somekey4plctestbed user49-key1 +550 1 ssh-rsa somekey4plctestbed user50-key1 +551 1 ssh-rsa somekey4plctestbed user51-key1 +552 1 ssh-rsa somekey4plctestbed user52-key1 +553 1 ssh-rsa somekey4plctestbed user53-key1 +554 1 ssh-rsa somekey4plctestbed user54-key1 +555 1 ssh-rsa somekey4plctestbed user55-key1 +556 1 ssh-rsa somekey4plctestbed user56-key1 +557 1 ssh-rsa somekey4plctestbed user57-key1 +558 1 ssh-rsa somekey4plctestbed user58-key1 +559 1 ssh-rsa somekey4plctestbed user59-key1 +560 1 ssh-rsa somekey4plctestbed user60-key1 +561 1 ssh-rsa somekey4plctestbed user61-key1 +562 1 ssh-rsa somekey4plctestbed user62-key1 +563 1 ssh-rsa somekey4plctestbed user63-key1 +564 1 ssh-rsa somekey4plctestbed user64-key1 +565 1 ssh-rsa somekey4plctestbed user65-key1 +566 1 ssh-rsa somekey4plctestbed user66-key1 +567 1 ssh-rsa somekey4plctestbed user67-key1 +568 1 ssh-rsa somekey4plctestbed user68-key1 +569 1 ssh-rsa somekey4plctestbed user69-key1 +570 1 ssh-rsa somekey4plctestbed user70-key1 +571 1 ssh-rsa somekey4plctestbed user71-key1 +572 1 ssh-rsa somekey4plctestbed user72-key1 +573 1 ssh-rsa somekey4plctestbed user73-key1 +574 1 ssh-rsa somekey4plctestbed user74-key1 +575 1 ssh-rsa somekey4plctestbed user75-key1 +576 1 ssh-rsa somekey4plctestbed user76-key1 +577 1 ssh-rsa somekey4plctestbed user77-key1 +578 1 ssh-rsa somekey4plctestbed user78-key1 +579 1 ssh-rsa somekey4plctestbed user79-key1 +580 1 ssh-rsa somekey4plctestbed user80-key1 +581 1 ssh-rsa somekey4plctestbed user81-key1 +582 1 ssh-rsa somekey4plctestbed user82-key1 +583 1 ssh-rsa somekey4plctestbed user83-key1 +584 1 ssh-rsa somekey4plctestbed user84-key1 +585 1 ssh-rsa somekey4plctestbed user85-key1 +586 1 ssh-rsa somekey4plctestbed user86-key1 +587 1 ssh-rsa somekey4plctestbed user87-key1 +588 1 ssh-rsa somekey4plctestbed user88-key1 +589 1 ssh-rsa somekey4plctestbed user89-key1 +590 1 ssh-rsa somekey4plctestbed user90-key1 +591 1 ssh-rsa somekey4plctestbed user91-key1 +592 1 ssh-rsa somekey4plctestbed user92-key1 +593 1 ssh-rsa somekey4plctestbed user93-key1 +594 1 ssh-rsa somekey4plctestbed user94-key1 +595 1 ssh-rsa somekey4plctestbed user95-key1 +596 1 ssh-rsa somekey4plctestbed user96-key1 +597 1 ssh-rsa somekey4plctestbed user97-key1 +598 1 ssh-rsa somekey4plctestbed user98-key1 +599 1 ssh-rsa somekey4plctestbed user99-key1 +600 1 ssh-rsa somekey4plctestbed user100-key1 +601 1 ssh-rsa somekey4plctestbed user101-key1 +602 1 ssh-rsa somekey4plctestbed user102-key1 +603 1 ssh-rsa somekey4plctestbed user103-key1 +604 1 ssh-rsa somekey4plctestbed user104-key1 +605 1 ssh-rsa somekey4plctestbed user105-key1 +606 1 ssh-rsa somekey4plctestbed user106-key1 +607 1 ssh-rsa somekey4plctestbed user107-key1 +608 1 ssh-rsa somekey4plctestbed user108-key1 +609 1 ssh-rsa somekey4plctestbed user109-key1 +610 1 ssh-rsa somekey4plctestbed user110-key1 +611 1 ssh-rsa somekey4plctestbed user111-key1 +612 1 ssh-rsa somekey4plctestbed user112-key1 +613 1 ssh-rsa somekey4plctestbed user113-key1 +614 1 ssh-rsa somekey4plctestbed user114-key1 +615 1 ssh-rsa somekey4plctestbed user115-key1 +616 1 ssh-rsa somekey4plctestbed user116-key1 +617 1 ssh-rsa somekey4plctestbed user117-key1 +618 1 ssh-rsa somekey4plctestbed user118-key1 +619 1 ssh-rsa somekey4plctestbed user119-key1 +620 1 ssh-rsa somekey4plctestbed user120-key1 +621 1 ssh-rsa somekey4plctestbed user121-key1 +622 1 ssh-rsa somekey4plctestbed user122-key1 +623 1 ssh-rsa somekey4plctestbed user123-key1 +624 1 ssh-rsa somekey4plctestbed user124-key1 +625 1 ssh-rsa somekey4plctestbed user125-key1 +626 1 ssh-rsa somekey4plctestbed user126-key1 +627 1 ssh-rsa somekey4plctestbed user127-key1 +628 1 ssh-rsa somekey4plctestbed user128-key1 +629 1 ssh-rsa somekey4plctestbed user129-key1 +630 1 ssh-rsa somekey4plctestbed user130-key1 +631 1 ssh-rsa somekey4plctestbed user131-key1 +632 1 ssh-rsa somekey4plctestbed user132-key1 +633 1 ssh-rsa somekey4plctestbed user133-key1 +634 1 ssh-rsa somekey4plctestbed user134-key1 +635 1 ssh-rsa somekey4plctestbed user135-key1 +636 1 ssh-rsa somekey4plctestbed user136-key1 +637 1 ssh-rsa somekey4plctestbed user137-key1 +638 1 ssh-rsa somekey4plctestbed user138-key1 +639 1 ssh-rsa somekey4plctestbed user139-key1 +640 1 ssh-rsa somekey4plctestbed user140-key1 +641 1 ssh-rsa somekey4plctestbed user141-key1 +642 1 ssh-rsa somekey4plctestbed user142-key1 +643 1 ssh-rsa somekey4plctestbed user143-key1 +644 1 ssh-rsa somekey4plctestbed user144-key1 +645 1 ssh-rsa somekey4plctestbed user145-key1 +646 1 ssh-rsa somekey4plctestbed user146-key1 +647 1 ssh-rsa somekey4plctestbed user147-key1 +648 1 ssh-rsa somekey4plctestbed user148-key1 +649 1 ssh-rsa somekey4plctestbed user149-key1 +650 1 ssh-rsa somekey4plctestbed user150-key1 +651 1 ssh-rsa somekey4plctestbed user151-key1 +652 1 ssh-rsa somekey4plctestbed user152-key1 +653 1 ssh-rsa somekey4plctestbed user153-key1 +654 1 ssh-rsa somekey4plctestbed user154-key1 +655 1 ssh-rsa somekey4plctestbed user155-key1 +656 1 ssh-rsa somekey4plctestbed user156-key1 +657 1 ssh-rsa somekey4plctestbed user157-key1 +658 1 ssh-rsa somekey4plctestbed user158-key1 +659 1 ssh-rsa somekey4plctestbed user159-key1 +660 1 ssh-rsa somekey4plctestbed user160-key1 +661 1 ssh-rsa somekey4plctestbed user161-key1 +662 1 ssh-rsa somekey4plctestbed user162-key1 +663 1 ssh-rsa somekey4plctestbed user163-key1 +664 1 ssh-rsa somekey4plctestbed user164-key1 +665 1 ssh-rsa somekey4plctestbed user165-key1 +666 1 ssh-rsa somekey4plctestbed user166-key1 +667 1 ssh-rsa somekey4plctestbed user167-key1 +668 1 ssh-rsa somekey4plctestbed user168-key1 +669 1 ssh-rsa somekey4plctestbed user169-key1 +670 1 ssh-rsa somekey4plctestbed user170-key1 +671 1 ssh-rsa somekey4plctestbed user171-key1 +672 1 ssh-rsa somekey4plctestbed user172-key1 +673 1 ssh-rsa somekey4plctestbed user173-key1 +674 1 ssh-rsa somekey4plctestbed user174-key1 +675 1 ssh-rsa somekey4plctestbed user175-key1 +676 1 ssh-rsa somekey4plctestbed user176-key1 +677 1 ssh-rsa somekey4plctestbed user177-key1 +678 1 ssh-rsa somekey4plctestbed user178-key1 +679 1 ssh-rsa somekey4plctestbed user179-key1 +680 1 ssh-rsa somekey4plctestbed user180-key1 +681 1 ssh-rsa somekey4plctestbed user181-key1 +682 1 ssh-rsa somekey4plctestbed user182-key1 +683 1 ssh-rsa somekey4plctestbed user183-key1 +684 1 ssh-rsa somekey4plctestbed user184-key1 +685 1 ssh-rsa somekey4plctestbed user185-key1 +686 1 ssh-rsa somekey4plctestbed user186-key1 +687 1 ssh-rsa somekey4plctestbed user187-key1 +688 1 ssh-rsa somekey4plctestbed user188-key1 +689 1 ssh-rsa somekey4plctestbed user189-key1 +690 1 ssh-rsa somekey4plctestbed user190-key1 +691 1 ssh-rsa somekey4plctestbed user191-key1 +692 1 ssh-rsa somekey4plctestbed user192-key1 +693 1 ssh-rsa somekey4plctestbed user193-key1 +694 1 ssh-rsa somekey4plctestbed user194-key1 +695 1 ssh-rsa somekey4plctestbed user195-key1 +696 1 ssh-rsa somekey4plctestbed user196-key1 +697 1 ssh-rsa somekey4plctestbed user197-key1 +698 1 ssh-rsa somekey4plctestbed user198-key1 +699 1 ssh-rsa somekey4plctestbed user199-key1 +700 1 ssh-rsa somekey4plctestbed user200-key1 +701 1 ssh-rsa somekey4plctestbed user201-key1 +702 1 ssh-rsa somekey4plctestbed user202-key1 +703 1 ssh-rsa somekey4plctestbed user203-key1 +704 1 ssh-rsa somekey4plctestbed user204-key1 +705 1 ssh-rsa somekey4plctestbed user205-key1 +706 1 ssh-rsa somekey4plctestbed user206-key1 +707 1 ssh-rsa somekey4plctestbed user207-key1 +708 1 ssh-rsa somekey4plctestbed user208-key1 +709 1 ssh-rsa somekey4plctestbed user209-key1 +710 1 ssh-rsa somekey4plctestbed user210-key1 +711 1 ssh-rsa somekey4plctestbed user211-key1 +712 1 ssh-rsa somekey4plctestbed user212-key1 +713 1 ssh-rsa somekey4plctestbed user213-key1 +714 1 ssh-rsa somekey4plctestbed user214-key1 +715 1 ssh-rsa somekey4plctestbed user215-key1 +716 1 ssh-rsa somekey4plctestbed user216-key1 +717 1 ssh-rsa somekey4plctestbed user217-key1 +718 1 ssh-rsa somekey4plctestbed user218-key1 +719 1 ssh-rsa somekey4plctestbed user219-key1 +720 1 ssh-rsa somekey4plctestbed user220-key1 +721 1 ssh-rsa somekey4plctestbed user221-key1 +722 1 ssh-rsa somekey4plctestbed user222-key1 +723 1 ssh-rsa somekey4plctestbed user223-key1 +724 1 ssh-rsa somekey4plctestbed user224-key1 +725 1 ssh-rsa somekey4plctestbed user225-key1 +726 1 ssh-rsa somekey4plctestbed user226-key1 +727 1 ssh-rsa somekey4plctestbed user227-key1 +728 1 ssh-rsa somekey4plctestbed user228-key1 +729 1 ssh-rsa somekey4plctestbed user229-key1 +730 1 ssh-rsa somekey4plctestbed user230-key1 +731 1 ssh-rsa somekey4plctestbed user231-key1 +732 1 ssh-rsa somekey4plctestbed user232-key1 +733 1 ssh-rsa somekey4plctestbed user233-key1 +734 1 ssh-rsa somekey4plctestbed user234-key1 +735 1 ssh-rsa somekey4plctestbed user235-key1 +736 1 ssh-rsa somekey4plctestbed user236-key1 +737 1 ssh-rsa somekey4plctestbed user237-key1 +738 1 ssh-rsa somekey4plctestbed user238-key1 +739 1 ssh-rsa somekey4plctestbed user239-key1 +740 1 ssh-rsa somekey4plctestbed user240-key1 +741 1 ssh-rsa somekey4plctestbed user241-key1 +742 1 ssh-rsa somekey4plctestbed user242-key1 +743 1 ssh-rsa somekey4plctestbed user243-key1 +744 1 ssh-rsa somekey4plctestbed user244-key1 +745 1 ssh-rsa somekey4plctestbed user245-key1 +746 1 ssh-rsa somekey4plctestbed user246-key1 +747 1 ssh-rsa somekey4plctestbed user247-key1 +748 1 ssh-rsa somekey4plctestbed user248-key1 +749 1 ssh-rsa somekey4plctestbed user249-key1 +750 1 ssh-rsa somekey4plctestbed user250-key1 +751 1 ssh-rsa somekey4plctestbed user251-key1 +752 1 ssh-rsa somekey4plctestbed user252-key1 +753 1 ssh-rsa somekey4plctestbed user253-key1 +754 1 ssh-rsa somekey4plctestbed user254-key1 +755 1 ssh-rsa somekey4plctestbed user255-key1 +756 1 ssh-rsa somekey4plctestbed user256-key1 +757 1 ssh-rsa somekey4plctestbed user257-key1 +758 1 ssh-rsa somekey4plctestbed user258-key1 +759 1 ssh-rsa somekey4plctestbed user259-key1 +760 1 ssh-rsa somekey4plctestbed user260-key1 +761 1 ssh-rsa somekey4plctestbed user261-key1 +762 1 ssh-rsa somekey4plctestbed user262-key1 +763 1 ssh-rsa somekey4plctestbed user263-key1 +764 1 ssh-rsa somekey4plctestbed user264-key1 +765 1 ssh-rsa somekey4plctestbed user265-key1 +766 1 ssh-rsa somekey4plctestbed user266-key1 +767 1 ssh-rsa somekey4plctestbed user267-key1 +768 1 ssh-rsa somekey4plctestbed user268-key1 +769 1 ssh-rsa somekey4plctestbed user269-key1 +770 1 ssh-rsa somekey4plctestbed user270-key1 +771 1 ssh-rsa somekey4plctestbed user271-key1 +772 1 ssh-rsa somekey4plctestbed user272-key1 +773 1 ssh-rsa somekey4plctestbed user273-key1 +774 1 ssh-rsa somekey4plctestbed user274-key1 +775 1 ssh-rsa somekey4plctestbed user275-key1 +776 1 ssh-rsa somekey4plctestbed user276-key1 +777 1 ssh-rsa somekey4plctestbed user277-key1 +778 1 ssh-rsa somekey4plctestbed user278-key1 +779 1 ssh-rsa somekey4plctestbed user279-key1 +780 1 ssh-rsa somekey4plctestbed user280-key1 +781 1 ssh-rsa somekey4plctestbed user281-key1 +782 1 ssh-rsa somekey4plctestbed user282-key1 +783 1 ssh-rsa somekey4plctestbed user283-key1 +784 1 ssh-rsa somekey4plctestbed user284-key1 +785 1 ssh-rsa somekey4plctestbed user285-key1 +786 1 ssh-rsa somekey4plctestbed user286-key1 +787 1 ssh-rsa somekey4plctestbed user287-key1 +788 1 ssh-rsa somekey4plctestbed user288-key1 +789 1 ssh-rsa somekey4plctestbed user289-key1 +790 1 ssh-rsa somekey4plctestbed user290-key1 +791 1 ssh-rsa somekey4plctestbed user291-key1 +792 1 ssh-rsa somekey4plctestbed user292-key1 +793 1 ssh-rsa somekey4plctestbed user293-key1 +794 1 ssh-rsa somekey4plctestbed user294-key1 +795 1 ssh-rsa somekey4plctestbed user295-key1 +796 1 ssh-rsa somekey4plctestbed user296-key1 +797 1 ssh-rsa somekey4plctestbed user297-key1 +798 1 ssh-rsa somekey4plctestbed user298-key1 +799 1 ssh-rsa somekey4plctestbed user299-key1 +800 1 ssh-rsa somekey4plctestbed user300-key1 +801 1 ssh-rsa somekey4plctestbed user301-key1 +802 1 ssh-rsa somekey4plctestbed user302-key1 +803 1 ssh-rsa somekey4plctestbed user303-key1 +804 1 ssh-rsa somekey4plctestbed user304-key1 +805 1 ssh-rsa somekey4plctestbed user305-key1 +806 1 ssh-rsa somekey4plctestbed user306-key1 +807 1 ssh-rsa somekey4plctestbed user307-key1 +808 1 ssh-rsa somekey4plctestbed user308-key1 +809 1 ssh-rsa somekey4plctestbed user309-key1 +810 1 ssh-rsa somekey4plctestbed user310-key1 +811 1 ssh-rsa somekey4plctestbed user311-key1 +812 1 ssh-rsa somekey4plctestbed user312-key1 +813 1 ssh-rsa somekey4plctestbed user313-key1 +814 1 ssh-rsa somekey4plctestbed user314-key1 +815 1 ssh-rsa somekey4plctestbed user315-key1 +816 1 ssh-rsa somekey4plctestbed user316-key1 +817 1 ssh-rsa somekey4plctestbed user317-key1 +818 1 ssh-rsa somekey4plctestbed user318-key1 +819 1 ssh-rsa somekey4plctestbed user319-key1 +820 1 ssh-rsa somekey4plctestbed user320-key1 +821 1 ssh-rsa somekey4plctestbed user321-key1 +822 1 ssh-rsa somekey4plctestbed user322-key1 +823 1 ssh-rsa somekey4plctestbed user323-key1 +824 1 ssh-rsa somekey4plctestbed user324-key1 +825 1 ssh-rsa somekey4plctestbed user325-key1 +826 1 ssh-rsa somekey4plctestbed user326-key1 +827 1 ssh-rsa somekey4plctestbed user327-key1 +828 1 ssh-rsa somekey4plctestbed user328-key1 +829 1 ssh-rsa somekey4plctestbed user329-key1 +830 1 ssh-rsa somekey4plctestbed user330-key1 +831 1 ssh-rsa somekey4plctestbed user331-key1 +832 1 ssh-rsa somekey4plctestbed user332-key1 +833 1 ssh-rsa somekey4plctestbed user333-key1 +834 1 ssh-rsa somekey4plctestbed user334-key1 +835 1 ssh-rsa somekey4plctestbed user335-key1 +836 1 ssh-rsa somekey4plctestbed user336-key1 +837 1 ssh-rsa somekey4plctestbed user337-key1 +838 1 ssh-rsa somekey4plctestbed user338-key1 +839 1 ssh-rsa somekey4plctestbed user339-key1 +840 1 ssh-rsa somekey4plctestbed user340-key1 +841 1 ssh-rsa somekey4plctestbed user341-key1 +842 1 ssh-rsa somekey4plctestbed user342-key1 +843 1 ssh-rsa somekey4plctestbed user343-key1 +844 1 ssh-rsa somekey4plctestbed user344-key1 +845 1 ssh-rsa somekey4plctestbed user345-key1 +846 1 ssh-rsa somekey4plctestbed user346-key1 +847 1 ssh-rsa somekey4plctestbed user347-key1 +848 1 ssh-rsa somekey4plctestbed user348-key1 +849 1 ssh-rsa somekey4plctestbed user349-key1 +850 1 ssh-rsa somekey4plctestbed user350-key1 +851 1 ssh-rsa somekey4plctestbed user351-key1 +852 1 ssh-rsa somekey4plctestbed user352-key1 +853 1 ssh-rsa somekey4plctestbed user353-key1 +854 1 ssh-rsa somekey4plctestbed user354-key1 +855 1 ssh-rsa somekey4plctestbed user355-key1 +856 1 ssh-rsa somekey4plctestbed user356-key1 +857 1 ssh-rsa somekey4plctestbed user357-key1 +858 1 ssh-rsa somekey4plctestbed user358-key1 +859 1 ssh-rsa somekey4plctestbed user359-key1 +860 1 ssh-rsa somekey4plctestbed user360-key1 +861 1 ssh-rsa somekey4plctestbed user361-key1 +862 1 ssh-rsa somekey4plctestbed user362-key1 +863 1 ssh-rsa somekey4plctestbed user363-key1 +864 1 ssh-rsa somekey4plctestbed user364-key1 +865 1 ssh-rsa somekey4plctestbed user365-key1 +866 1 ssh-rsa somekey4plctestbed user366-key1 +867 1 ssh-rsa somekey4plctestbed user367-key1 +868 1 ssh-rsa somekey4plctestbed user368-key1 +869 1 ssh-rsa somekey4plctestbed user369-key1 +870 1 ssh-rsa somekey4plctestbed user370-key1 +871 1 ssh-rsa somekey4plctestbed user371-key1 +872 1 ssh-rsa somekey4plctestbed user372-key1 +873 1 ssh-rsa somekey4plctestbed user373-key1 +874 1 ssh-rsa somekey4plctestbed user374-key1 +875 1 ssh-rsa somekey4plctestbed user375-key1 +876 1 ssh-rsa somekey4plctestbed user376-key1 +877 1 ssh-rsa somekey4plctestbed user377-key1 +878 1 ssh-rsa somekey4plctestbed user378-key1 +879 1 ssh-rsa somekey4plctestbed user379-key1 +880 1 ssh-rsa somekey4plctestbed user380-key1 +881 1 ssh-rsa somekey4plctestbed user381-key1 +882 1 ssh-rsa somekey4plctestbed user382-key1 +883 1 ssh-rsa somekey4plctestbed user383-key1 +884 1 ssh-rsa somekey4plctestbed user384-key1 +885 1 ssh-rsa somekey4plctestbed user385-key1 +886 1 ssh-rsa somekey4plctestbed user386-key1 +887 1 ssh-rsa somekey4plctestbed user387-key1 +888 1 ssh-rsa somekey4plctestbed user388-key1 +889 1 ssh-rsa somekey4plctestbed user389-key1 +890 1 ssh-rsa somekey4plctestbed user390-key1 +891 1 ssh-rsa somekey4plctestbed user391-key1 +892 1 ssh-rsa somekey4plctestbed user392-key1 +893 1 ssh-rsa somekey4plctestbed user393-key1 +894 1 ssh-rsa somekey4plctestbed user394-key1 +895 1 ssh-rsa somekey4plctestbed user395-key1 +896 1 ssh-rsa somekey4plctestbed user396-key1 +897 1 ssh-rsa somekey4plctestbed user397-key1 +898 1 ssh-rsa somekey4plctestbed user398-key1 +899 1 ssh-rsa somekey4plctestbed user399-key1 +900 1 ssh-rsa somekey4plctestbed user400-key1 +901 1 ssh-rsa somekey4plctestbed user401-key1 +902 1 ssh-rsa somekey4plctestbed user402-key1 +903 1 ssh-rsa somekey4plctestbed user403-key1 +904 1 ssh-rsa somekey4plctestbed user404-key1 +905 1 ssh-rsa somekey4plctestbed user405-key1 +906 1 ssh-rsa somekey4plctestbed user406-key1 +907 1 ssh-rsa somekey4plctestbed user407-key1 +908 1 ssh-rsa somekey4plctestbed user408-key1 +909 1 ssh-rsa somekey4plctestbed user409-key1 +910 1 ssh-rsa somekey4plctestbed user410-key1 +911 1 ssh-rsa somekey4plctestbed user411-key1 +912 1 ssh-rsa somekey4plctestbed user412-key1 +913 1 ssh-rsa somekey4plctestbed user413-key1 +914 1 ssh-rsa somekey4plctestbed user414-key1 +915 1 ssh-rsa somekey4plctestbed user415-key1 +916 1 ssh-rsa somekey4plctestbed user416-key1 +917 1 ssh-rsa somekey4plctestbed user417-key1 +918 1 ssh-rsa somekey4plctestbed user418-key1 +919 1 ssh-rsa somekey4plctestbed user419-key1 +920 1 ssh-rsa somekey4plctestbed user420-key1 +921 1 ssh-rsa somekey4plctestbed user421-key1 +922 1 ssh-rsa somekey4plctestbed user422-key1 +923 1 ssh-rsa somekey4plctestbed user423-key1 +924 1 ssh-rsa somekey4plctestbed user424-key1 +925 1 ssh-rsa somekey4plctestbed user425-key1 +926 1 ssh-rsa somekey4plctestbed user426-key1 +927 1 ssh-rsa somekey4plctestbed user427-key1 +928 1 ssh-rsa somekey4plctestbed user428-key1 +929 1 ssh-rsa somekey4plctestbed user429-key1 +930 1 ssh-rsa somekey4plctestbed user430-key1 +931 1 ssh-rsa somekey4plctestbed user431-key1 +932 1 ssh-rsa somekey4plctestbed user432-key1 +933 1 ssh-rsa somekey4plctestbed user433-key1 +934 1 ssh-rsa somekey4plctestbed user434-key1 +935 1 ssh-rsa somekey4plctestbed user435-key1 +936 1 ssh-rsa somekey4plctestbed user436-key1 +937 1 ssh-rsa somekey4plctestbed user437-key1 +938 1 ssh-rsa somekey4plctestbed user438-key1 +939 1 ssh-rsa somekey4plctestbed user439-key1 +940 1 ssh-rsa somekey4plctestbed user440-key1 +941 1 ssh-rsa somekey4plctestbed user441-key1 +942 1 ssh-rsa somekey4plctestbed user442-key1 +943 1 ssh-rsa somekey4plctestbed user443-key1 +944 1 ssh-rsa somekey4plctestbed user444-key1 +945 1 ssh-rsa somekey4plctestbed user445-key1 +946 1 ssh-rsa somekey4plctestbed user446-key1 +947 1 ssh-rsa somekey4plctestbed user447-key1 +948 1 ssh-rsa somekey4plctestbed user448-key1 +949 1 ssh-rsa somekey4plctestbed user449-key1 +950 1 ssh-rsa somekey4plctestbed user450-key1 +951 1 ssh-rsa somekey4plctestbed user451-key1 +952 1 ssh-rsa somekey4plctestbed user452-key1 +953 1 ssh-rsa somekey4plctestbed user453-key1 +954 1 ssh-rsa somekey4plctestbed user454-key1 +955 1 ssh-rsa somekey4plctestbed user455-key1 +956 1 ssh-rsa somekey4plctestbed user456-key1 +957 1 ssh-rsa somekey4plctestbed user457-key1 +958 1 ssh-rsa somekey4plctestbed user458-key1 +959 1 ssh-rsa somekey4plctestbed user459-key1 +960 1 ssh-rsa somekey4plctestbed user460-key1 +961 1 ssh-rsa somekey4plctestbed user461-key1 +962 1 ssh-rsa somekey4plctestbed user462-key1 +963 1 ssh-rsa somekey4plctestbed user463-key1 +964 1 ssh-rsa somekey4plctestbed user464-key1 +965 1 ssh-rsa somekey4plctestbed user465-key1 +966 1 ssh-rsa somekey4plctestbed user466-key1 +967 1 ssh-rsa somekey4plctestbed user467-key1 +968 1 ssh-rsa somekey4plctestbed user468-key1 +969 1 ssh-rsa somekey4plctestbed user469-key1 +970 1 ssh-rsa somekey4plctestbed user470-key1 +971 1 ssh-rsa somekey4plctestbed user471-key1 +972 1 ssh-rsa somekey4plctestbed user472-key1 +973 1 ssh-rsa somekey4plctestbed user473-key1 +974 1 ssh-rsa somekey4plctestbed user474-key1 +975 1 ssh-rsa somekey4plctestbed user475-key1 +976 1 ssh-rsa somekey4plctestbed user476-key1 +977 1 ssh-rsa somekey4plctestbed user477-key1 +978 1 ssh-rsa somekey4plctestbed user478-key1 +979 1 ssh-rsa somekey4plctestbed user479-key1 +980 1 ssh-rsa somekey4plctestbed user480-key1 +981 1 ssh-rsa somekey4plctestbed user481-key1 +982 1 ssh-rsa somekey4plctestbed user482-key1 +983 1 ssh-rsa somekey4plctestbed user483-key1 +984 1 ssh-rsa somekey4plctestbed user484-key1 +985 1 ssh-rsa somekey4plctestbed user485-key1 +986 1 ssh-rsa somekey4plctestbed user486-key1 +987 1 ssh-rsa somekey4plctestbed user487-key1 +988 1 ssh-rsa somekey4plctestbed user488-key1 +989 1 ssh-rsa somekey4plctestbed user489-key1 +990 1 ssh-rsa somekey4plctestbed user490-key1 +991 1 ssh-rsa somekey4plctestbed user491-key1 +992 1 ssh-rsa somekey4plctestbed user492-key1 +993 1 ssh-rsa somekey4plctestbed user493-key1 +994 1 ssh-rsa somekey4plctestbed user494-key1 +995 1 ssh-rsa somekey4plctestbed user495-key1 +996 1 ssh-rsa somekey4plctestbed user496-key1 +997 1 ssh-rsa somekey4plctestbed user497-key1 +998 1 ssh-rsa somekey4plctestbed user498-key1 +999 1 ssh-rsa somekey4plctestbed user499-key1 +1000 1 ssh-rsa somekey4plctestbed user500-key1 +01: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc1.inria.fr keys: [] sites: [1] +3 None peer1@planet-lab.org keys: [] sites: [] +4 None user-1@plc.org keys: [1] sites: [] +5 None user-2@plc.org keys: [2] sites: [] +6 None user-3@plc.org keys: [3] sites: [] +7 None user-4@plc.org keys: [4] sites: [] +8 None user-5@plc.org keys: [5] sites: [] +9 None user-6@plc.org keys: [6] sites: [] +10 None user-7@plc.org keys: [7] sites: [] +11 None user-8@plc.org keys: [8] sites: [] +12 None user-9@plc.org keys: [9] sites: [] +13 None user-10@plc.org keys: [10] sites: [] +14 None user-11@plc.org keys: [11] sites: [] +15 None user-12@plc.org keys: [12] sites: [] +16 None user-13@plc.org keys: [13] sites: [] +17 None user-14@plc.org keys: [14] sites: [] +18 None user-15@plc.org keys: [15] sites: [] +19 None user-16@plc.org keys: [16] sites: [] +20 None user-17@plc.org keys: [17] sites: [] +21 None user-18@plc.org keys: [18] sites: [] +22 None user-19@plc.org keys: [19] sites: [] +23 None user-20@plc.org keys: [20] sites: [] +24 None user-21@plc.org keys: [21] sites: [] +25 None user-22@plc.org keys: [22] sites: [] +26 None user-23@plc.org keys: [23] sites: [] +27 None user-24@plc.org keys: [24] sites: [] +28 None user-25@plc.org keys: [25] sites: [] +29 None user-26@plc.org keys: [26] sites: [] +30 None user-27@plc.org keys: [27] sites: [] +31 None user-28@plc.org keys: [28] sites: [] +32 None user-29@plc.org keys: [29] sites: [] +33 None user-30@plc.org keys: [30] sites: [] +34 None user-31@plc.org keys: [31] sites: [] +35 None user-32@plc.org keys: [32] sites: [] +36 None user-33@plc.org keys: [33] sites: [] +37 None user-34@plc.org keys: [34] sites: [] +38 None user-35@plc.org keys: [35] sites: [] +39 None user-36@plc.org keys: [36] sites: [] +40 None user-37@plc.org keys: [37] sites: [] +41 None user-38@plc.org keys: [38] sites: [] +42 None user-39@plc.org keys: [39] sites: [] +43 None user-40@plc.org keys: [40] sites: [] +44 None user-41@plc.org keys: [41] sites: [] +45 None user-42@plc.org keys: [42] sites: [] +46 None user-43@plc.org keys: [43] sites: [] +47 None user-44@plc.org keys: [44] sites: [] +48 None user-45@plc.org keys: [45] sites: [] +49 None user-46@plc.org keys: [46] sites: [] +50 None user-47@plc.org keys: [47] sites: [] +51 None user-48@plc.org keys: [48] sites: [] +52 None user-49@plc.org keys: [49] sites: [] +53 None user-50@plc.org keys: [50] sites: [] +54 None user-51@plc.org keys: [51] sites: [] +55 None user-52@plc.org keys: [52] sites: [] +56 None user-53@plc.org keys: [53] sites: [] +57 None user-54@plc.org keys: [54] sites: [] +58 None user-55@plc.org keys: [55] sites: [] +59 None user-56@plc.org keys: [56] sites: [] +60 None user-57@plc.org keys: [57] sites: [] +61 None user-58@plc.org keys: [58] sites: [] +62 None user-59@plc.org keys: [59] sites: [] +63 None user-60@plc.org keys: [60] sites: [] +64 None user-61@plc.org keys: [61] sites: [] +65 None user-62@plc.org keys: [62] sites: [] +66 None user-63@plc.org keys: [63] sites: [] +67 None user-64@plc.org keys: [64] sites: [] +68 None user-65@plc.org keys: [65] sites: [] +69 None user-66@plc.org keys: [66] sites: [] +70 None user-67@plc.org keys: [67] sites: [] +71 None user-68@plc.org keys: [68] sites: [] +72 None user-69@plc.org keys: [69] sites: [] +73 None user-70@plc.org keys: [70] sites: [] +74 None user-71@plc.org keys: [71] sites: [] +75 None user-72@plc.org keys: [72] sites: [] +76 None user-73@plc.org keys: [73] sites: [] +77 None user-74@plc.org keys: [74] sites: [] +78 None user-75@plc.org keys: [75] sites: [] +79 None user-76@plc.org keys: [76] sites: [] +80 None user-77@plc.org keys: [77] sites: [] +81 None user-78@plc.org keys: [78] sites: [] +82 None user-79@plc.org keys: [79] sites: [] +83 None user-80@plc.org keys: [80] sites: [] +84 None user-81@plc.org keys: [81] sites: [] +85 None user-82@plc.org keys: [82] sites: [] +86 None user-83@plc.org keys: [83] sites: [] +87 None user-84@plc.org keys: [84] sites: [] +88 None user-85@plc.org keys: [85] sites: [] +89 None user-86@plc.org keys: [86] sites: [] +90 None user-87@plc.org keys: [87] sites: [] +91 None user-88@plc.org keys: [88] sites: [] +92 None user-89@plc.org keys: [89] sites: [] +93 None user-90@plc.org keys: [90] sites: [] +94 None user-91@plc.org keys: [91] sites: [] +95 None user-92@plc.org keys: [92] sites: [] +96 None user-93@plc.org keys: [93] sites: [] +97 None user-94@plc.org keys: [94] sites: [] +98 None user-95@plc.org keys: [95] sites: [] +99 None user-96@plc.org keys: [96] sites: [] +100 None user-97@plc.org keys: [97] sites: [] +101 None user-98@plc.org keys: [98] sites: [] +102 None user-99@plc.org keys: [99] sites: [] +103 None user-100@plc.org keys: [100] sites: [] +104 None user-101@plc.org keys: [101] sites: [] +105 None user-102@plc.org keys: [102] sites: [] +106 None user-103@plc.org keys: [103] sites: [] +107 None user-104@plc.org keys: [104] sites: [] +108 None user-105@plc.org keys: [105] sites: [] +109 None user-106@plc.org keys: [106] sites: [] +110 None user-107@plc.org keys: [107] sites: [] +111 None user-108@plc.org keys: [108] sites: [] +112 None user-109@plc.org keys: [109] sites: [] +113 None user-110@plc.org keys: [110] sites: [] +114 None user-111@plc.org keys: [111] sites: [] +115 None user-112@plc.org keys: [112] sites: [] +116 None user-113@plc.org keys: [113] sites: [] +117 None user-114@plc.org keys: [114] sites: [] +118 None user-115@plc.org keys: [115] sites: [] +119 None user-116@plc.org keys: [116] sites: [] +120 None user-117@plc.org keys: [117] sites: [] +121 None user-118@plc.org keys: [118] sites: [] +122 None user-119@plc.org keys: [119] sites: [] +123 None user-120@plc.org keys: [120] sites: [] +124 None user-121@plc.org keys: [121] sites: [] +125 None user-122@plc.org keys: [122] sites: [] +126 None user-123@plc.org keys: [123] sites: [] +127 None user-124@plc.org keys: [124] sites: [] +128 None user-125@plc.org keys: [125] sites: [] +129 None user-126@plc.org keys: [126] sites: [] +130 None user-127@plc.org keys: [127] sites: [] +131 None user-128@plc.org keys: [128] sites: [] +132 None user-129@plc.org keys: [129] sites: [] +133 None user-130@plc.org keys: [130] sites: [] +134 None user-131@plc.org keys: [131] sites: [] +135 None user-132@plc.org keys: [132] sites: [] +136 None user-133@plc.org keys: [133] sites: [] +137 None user-134@plc.org keys: [134] sites: [] +138 None user-135@plc.org keys: [135] sites: [] +139 None user-136@plc.org keys: [136] sites: [] +140 None user-137@plc.org keys: [137] sites: [] +141 None user-138@plc.org keys: [138] sites: [] +142 None user-139@plc.org keys: [139] sites: [] +143 None user-140@plc.org keys: [140] sites: [] +144 None user-141@plc.org keys: [141] sites: [] +145 None user-142@plc.org keys: [142] sites: [] +146 None user-143@plc.org keys: [143] sites: [] +147 None user-144@plc.org keys: [144] sites: [] +148 None user-145@plc.org keys: [145] sites: [] +149 None user-146@plc.org keys: [146] sites: [] +150 None user-147@plc.org keys: [147] sites: [] +151 None user-148@plc.org keys: [148] sites: [] +152 None user-149@plc.org keys: [149] sites: [] +153 None user-150@plc.org keys: [150] sites: [] +154 None user-151@plc.org keys: [151] sites: [] +155 None user-152@plc.org keys: [152] sites: [] +156 None user-153@plc.org keys: [153] sites: [] +157 None user-154@plc.org keys: [154] sites: [] +158 None user-155@plc.org keys: [155] sites: [] +159 None user-156@plc.org keys: [156] sites: [] +160 None user-157@plc.org keys: [157] sites: [] +161 None user-158@plc.org keys: [158] sites: [] +162 None user-159@plc.org keys: [159] sites: [] +163 None user-160@plc.org keys: [160] sites: [] +164 None user-161@plc.org keys: [161] sites: [] +165 None user-162@plc.org keys: [162] sites: [] +166 None user-163@plc.org keys: [163] sites: [] +167 None user-164@plc.org keys: [164] sites: [] +168 None user-165@plc.org keys: [165] sites: [] +169 None user-166@plc.org keys: [166] sites: [] +170 None user-167@plc.org keys: [167] sites: [] +171 None user-168@plc.org keys: [168] sites: [] +172 None user-169@plc.org keys: [169] sites: [] +173 None user-170@plc.org keys: [170] sites: [] +174 None user-171@plc.org keys: [171] sites: [] +175 None user-172@plc.org keys: [172] sites: [] +176 None user-173@plc.org keys: [173] sites: [] +177 None user-174@plc.org keys: [174] sites: [] +178 None user-175@plc.org keys: [175] sites: [] +179 None user-176@plc.org keys: [176] sites: [] +180 None user-177@plc.org keys: [177] sites: [] +181 None user-178@plc.org keys: [178] sites: [] +182 None user-179@plc.org keys: [179] sites: [] +183 None user-180@plc.org keys: [180] sites: [] +184 None user-181@plc.org keys: [181] sites: [] +185 None user-182@plc.org keys: [182] sites: [] +186 None user-183@plc.org keys: [183] sites: [] +187 None user-184@plc.org keys: [184] sites: [] +188 None user-185@plc.org keys: [185] sites: [] +189 None user-186@plc.org keys: [186] sites: [] +190 None user-187@plc.org keys: [187] sites: [] +191 None user-188@plc.org keys: [188] sites: [] +192 None user-189@plc.org keys: [189] sites: [] +193 None user-190@plc.org keys: [190] sites: [] +194 None user-191@plc.org keys: [191] sites: [] +195 None user-192@plc.org keys: [192] sites: [] +196 None user-193@plc.org keys: [193] sites: [] +197 None user-194@plc.org keys: [194] sites: [] +198 None user-195@plc.org keys: [195] sites: [] +199 None user-196@plc.org keys: [196] sites: [] +200 None user-197@plc.org keys: [197] sites: [] +201 None user-198@plc.org keys: [198] sites: [] +202 None user-199@plc.org keys: [199] sites: [] +203 None user-200@plc.org keys: [200] sites: [] +204 None user-201@plc.org keys: [201] sites: [] +205 None user-202@plc.org keys: [202] sites: [] +206 None user-203@plc.org keys: [203] sites: [] +207 None user-204@plc.org keys: [204] sites: [] +208 None user-205@plc.org keys: [205] sites: [] +209 None user-206@plc.org keys: [206] sites: [] +210 None user-207@plc.org keys: [207] sites: [] +211 None user-208@plc.org keys: [208] sites: [] +212 None user-209@plc.org keys: [209] sites: [] +213 None user-210@plc.org keys: [210] sites: [] +214 None user-211@plc.org keys: [211] sites: [] +215 None user-212@plc.org keys: [212] sites: [] +216 None user-213@plc.org keys: [213] sites: [] +217 None user-214@plc.org keys: [214] sites: [] +218 None user-215@plc.org keys: [215] sites: [] +219 None user-216@plc.org keys: [216] sites: [] +220 None user-217@plc.org keys: [217] sites: [] +221 None user-218@plc.org keys: [218] sites: [] +222 None user-219@plc.org keys: [219] sites: [] +223 None user-220@plc.org keys: [220] sites: [] +224 None user-221@plc.org keys: [221] sites: [] +225 None user-222@plc.org keys: [222] sites: [] +226 None user-223@plc.org keys: [223] sites: [] +227 None user-224@plc.org keys: [224] sites: [] +228 None user-225@plc.org keys: [225] sites: [] +229 None user-226@plc.org keys: [226] sites: [] +230 None user-227@plc.org keys: [227] sites: [] +231 None user-228@plc.org keys: [228] sites: [] +232 None user-229@plc.org keys: [229] sites: [] +233 None user-230@plc.org keys: [230] sites: [] +234 None user-231@plc.org keys: [231] sites: [] +235 None user-232@plc.org keys: [232] sites: [] +236 None user-233@plc.org keys: [233] sites: [] +237 None user-234@plc.org keys: [234] sites: [] +238 None user-235@plc.org keys: [235] sites: [] +239 None user-236@plc.org keys: [236] sites: [] +240 None user-237@plc.org keys: [237] sites: [] +241 None user-238@plc.org keys: [238] sites: [] +242 None user-239@plc.org keys: [239] sites: [] +243 None user-240@plc.org keys: [240] sites: [] +244 None user-241@plc.org keys: [241] sites: [] +245 None user-242@plc.org keys: [242] sites: [] +246 None user-243@plc.org keys: [243] sites: [] +247 None user-244@plc.org keys: [244] sites: [] +248 None user-245@plc.org keys: [245] sites: [] +249 None user-246@plc.org keys: [246] sites: [] +250 None user-247@plc.org keys: [247] sites: [] +251 None user-248@plc.org keys: [248] sites: [] +252 None user-249@plc.org keys: [249] sites: [] +253 None user-250@plc.org keys: [250] sites: [] +254 None user-251@plc.org keys: [251] sites: [] +255 None user-252@plc.org keys: [252] sites: [] +256 None user-253@plc.org keys: [253] sites: [] +257 None user-254@plc.org keys: [254] sites: [] +258 None user-255@plc.org keys: [255] sites: [] +259 None user-256@plc.org keys: [256] sites: [] +260 None user-257@plc.org keys: [257] sites: [] +261 None user-258@plc.org keys: [258] sites: [] +262 None user-259@plc.org keys: [259] sites: [] +263 None user-260@plc.org keys: [260] sites: [] +264 None user-261@plc.org keys: [261] sites: [] +265 None user-262@plc.org keys: [262] sites: [] +266 None user-263@plc.org keys: [263] sites: [] +267 None user-264@plc.org keys: [264] sites: [] +268 None user-265@plc.org keys: [265] sites: [] +269 None user-266@plc.org keys: [266] sites: [] +270 None user-267@plc.org keys: [267] sites: [] +271 None user-268@plc.org keys: [268] sites: [] +272 None user-269@plc.org keys: [269] sites: [] +273 None user-270@plc.org keys: [270] sites: [] +274 None user-271@plc.org keys: [271] sites: [] +275 None user-272@plc.org keys: [272] sites: [] +276 None user-273@plc.org keys: [273] sites: [] +277 None user-274@plc.org keys: [274] sites: [] +278 None user-275@plc.org keys: [275] sites: [] +279 None user-276@plc.org keys: [276] sites: [] +280 None user-277@plc.org keys: [277] sites: [] +281 None user-278@plc.org keys: [278] sites: [] +282 None user-279@plc.org keys: [279] sites: [] +283 None user-280@plc.org keys: [280] sites: [] +284 None user-281@plc.org keys: [281] sites: [] +285 None user-282@plc.org keys: [282] sites: [] +286 None user-283@plc.org keys: [283] sites: [] +287 None user-284@plc.org keys: [284] sites: [] +288 None user-285@plc.org keys: [285] sites: [] +289 None user-286@plc.org keys: [286] sites: [] +290 None user-287@plc.org keys: [287] sites: [] +291 None user-288@plc.org keys: [288] sites: [] +292 None user-289@plc.org keys: [289] sites: [] +293 None user-290@plc.org keys: [290] sites: [] +294 None user-291@plc.org keys: [291] sites: [] +295 None user-292@plc.org keys: [292] sites: [] +296 None user-293@plc.org keys: [293] sites: [] +297 None user-294@plc.org keys: [294] sites: [] +298 None user-295@plc.org keys: [295] sites: [] +299 None user-296@plc.org keys: [296] sites: [] +300 None user-297@plc.org keys: [297] sites: [] +301 None user-298@plc.org keys: [298] sites: [] +302 None user-299@plc.org keys: [299] sites: [] +303 None user-300@plc.org keys: [300] sites: [] +304 None user-301@plc.org keys: [301] sites: [] +305 None user-302@plc.org keys: [302] sites: [] +306 None user-303@plc.org keys: [303] sites: [] +307 None user-304@plc.org keys: [304] sites: [] +308 None user-305@plc.org keys: [305] sites: [] +309 None user-306@plc.org keys: [306] sites: [] +310 None user-307@plc.org keys: [307] sites: [] +311 None user-308@plc.org keys: [308] sites: [] +312 None user-309@plc.org keys: [309] sites: [] +313 None user-310@plc.org keys: [310] sites: [] +314 None user-311@plc.org keys: [311] sites: [] +315 None user-312@plc.org keys: [312] sites: [] +316 None user-313@plc.org keys: [313] sites: [] +317 None user-314@plc.org keys: [314] sites: [] +318 None user-315@plc.org keys: [315] sites: [] +319 None user-316@plc.org keys: [316] sites: [] +320 None user-317@plc.org keys: [317] sites: [] +321 None user-318@plc.org keys: [318] sites: [] +322 None user-319@plc.org keys: [319] sites: [] +323 None user-320@plc.org keys: [320] sites: [] +324 None user-321@plc.org keys: [321] sites: [] +325 None user-322@plc.org keys: [322] sites: [] +326 None user-323@plc.org keys: [323] sites: [] +327 None user-324@plc.org keys: [324] sites: [] +328 None user-325@plc.org keys: [325] sites: [] +329 None user-326@plc.org keys: [326] sites: [] +330 None user-327@plc.org keys: [327] sites: [] +331 None user-328@plc.org keys: [328] sites: [] +332 None user-329@plc.org keys: [329] sites: [] +333 None user-330@plc.org keys: [330] sites: [] +334 None user-331@plc.org keys: [331] sites: [] +335 None user-332@plc.org keys: [332] sites: [] +336 None user-333@plc.org keys: [333] sites: [] +337 None user-334@plc.org keys: [334] sites: [] +338 None user-335@plc.org keys: [335] sites: [] +339 None user-336@plc.org keys: [336] sites: [] +340 None user-337@plc.org keys: [337] sites: [] +341 None user-338@plc.org keys: [338] sites: [] +342 None user-339@plc.org keys: [339] sites: [] +343 None user-340@plc.org keys: [340] sites: [] +344 None user-341@plc.org keys: [341] sites: [] +345 None user-342@plc.org keys: [342] sites: [] +346 None user-343@plc.org keys: [343] sites: [] +347 None user-344@plc.org keys: [344] sites: [] +348 None user-345@plc.org keys: [345] sites: [] +349 None user-346@plc.org keys: [346] sites: [] +350 None user-347@plc.org keys: [347] sites: [] +351 None user-348@plc.org keys: [348] sites: [] +352 None user-349@plc.org keys: [349] sites: [] +353 None user-350@plc.org keys: [350] sites: [] +354 None user-351@plc.org keys: [351] sites: [] +355 None user-352@plc.org keys: [352] sites: [] +356 None user-353@plc.org keys: [353] sites: [] +357 None user-354@plc.org keys: [354] sites: [] +358 None user-355@plc.org keys: [355] sites: [] +359 None user-356@plc.org keys: [356] sites: [] +360 None user-357@plc.org keys: [357] sites: [] +361 None user-358@plc.org keys: [358] sites: [] +362 None user-359@plc.org keys: [359] sites: [] +363 None user-360@plc.org keys: [360] sites: [] +364 None user-361@plc.org keys: [361] sites: [] +365 None user-362@plc.org keys: [362] sites: [] +366 None user-363@plc.org keys: [363] sites: [] +367 None user-364@plc.org keys: [364] sites: [] +368 None user-365@plc.org keys: [365] sites: [] +369 None user-366@plc.org keys: [366] sites: [] +370 None user-367@plc.org keys: [367] sites: [] +371 None user-368@plc.org keys: [368] sites: [] +372 None user-369@plc.org keys: [369] sites: [] +373 None user-370@plc.org keys: [370] sites: [] +374 None user-371@plc.org keys: [371] sites: [] +375 None user-372@plc.org keys: [372] sites: [] +376 None user-373@plc.org keys: [373] sites: [] +377 None user-374@plc.org keys: [374] sites: [] +378 None user-375@plc.org keys: [375] sites: [] +379 None user-376@plc.org keys: [376] sites: [] +380 None user-377@plc.org keys: [377] sites: [] +381 None user-378@plc.org keys: [378] sites: [] +382 None user-379@plc.org keys: [379] sites: [] +383 None user-380@plc.org keys: [380] sites: [] +384 None user-381@plc.org keys: [381] sites: [] +385 None user-382@plc.org keys: [382] sites: [] +386 None user-383@plc.org keys: [383] sites: [] +387 None user-384@plc.org keys: [384] sites: [] +388 None user-385@plc.org keys: [385] sites: [] +389 None user-386@plc.org keys: [386] sites: [] +390 None user-387@plc.org keys: [387] sites: [] +391 None user-388@plc.org keys: [388] sites: [] +392 None user-389@plc.org keys: [389] sites: [] +393 None user-390@plc.org keys: [390] sites: [] +394 None user-391@plc.org keys: [391] sites: [] +395 None user-392@plc.org keys: [392] sites: [] +396 None user-393@plc.org keys: [393] sites: [] +397 None user-394@plc.org keys: [394] sites: [] +398 None user-395@plc.org keys: [395] sites: [] +399 None user-396@plc.org keys: [396] sites: [] +400 None user-397@plc.org keys: [397] sites: [] +401 None user-398@plc.org keys: [398] sites: [] +402 None user-399@plc.org keys: [399] sites: [] +403 None user-400@plc.org keys: [400] sites: [] +404 None user-401@plc.org keys: [401] sites: [] +405 None user-402@plc.org keys: [402] sites: [] +406 None user-403@plc.org keys: [403] sites: [] +407 None user-404@plc.org keys: [404] sites: [] +408 None user-405@plc.org keys: [405] sites: [] +409 None user-406@plc.org keys: [406] sites: [] +410 None user-407@plc.org keys: [407] sites: [] +411 None user-408@plc.org keys: [408] sites: [] +412 None user-409@plc.org keys: [409] sites: [] +413 None user-410@plc.org keys: [410] sites: [] +414 None user-411@plc.org keys: [411] sites: [] +415 None user-412@plc.org keys: [412] sites: [] +416 None user-413@plc.org keys: [413] sites: [] +417 None user-414@plc.org keys: [414] sites: [] +418 None user-415@plc.org keys: [415] sites: [] +419 None user-416@plc.org keys: [416] sites: [] +420 None user-417@plc.org keys: [417] sites: [] +421 None user-418@plc.org keys: [418] sites: [] +422 None user-419@plc.org keys: [419] sites: [] +423 None user-420@plc.org keys: [420] sites: [] +424 None user-421@plc.org keys: [421] sites: [] +425 None user-422@plc.org keys: [422] sites: [] +426 None user-423@plc.org keys: [423] sites: [] +427 None user-424@plc.org keys: [424] sites: [] +428 None user-425@plc.org keys: [425] sites: [] +429 None user-426@plc.org keys: [426] sites: [] +430 None user-427@plc.org keys: [427] sites: [] +431 None user-428@plc.org keys: [428] sites: [] +432 None user-429@plc.org keys: [429] sites: [] +433 None user-430@plc.org keys: [430] sites: [] +434 None user-431@plc.org keys: [431] sites: [] +435 None user-432@plc.org keys: [432] sites: [] +436 None user-433@plc.org keys: [433] sites: [] +437 None user-434@plc.org keys: [434] sites: [] +438 None user-435@plc.org keys: [435] sites: [] +439 None user-436@plc.org keys: [436] sites: [] +440 None user-437@plc.org keys: [437] sites: [] +441 None user-438@plc.org keys: [438] sites: [] +442 None user-439@plc.org keys: [439] sites: [] +443 None user-440@plc.org keys: [440] sites: [] +444 None user-441@plc.org keys: [441] sites: [] +445 None user-442@plc.org keys: [442] sites: [] +446 None user-443@plc.org keys: [443] sites: [] +447 None user-444@plc.org keys: [444] sites: [] +448 None user-445@plc.org keys: [445] sites: [] +449 None user-446@plc.org keys: [446] sites: [] +450 None user-447@plc.org keys: [447] sites: [] +451 None user-448@plc.org keys: [448] sites: [] +452 None user-449@plc.org keys: [449] sites: [] +453 None user-450@plc.org keys: [450] sites: [] +454 None user-451@plc.org keys: [451] sites: [] +455 None user-452@plc.org keys: [452] sites: [] +456 None user-453@plc.org keys: [453] sites: [] +457 None user-454@plc.org keys: [454] sites: [] +458 None user-455@plc.org keys: [455] sites: [] +459 None user-456@plc.org keys: [456] sites: [] +460 None user-457@plc.org keys: [457] sites: [] +461 None user-458@plc.org keys: [458] sites: [] +462 None user-459@plc.org keys: [459] sites: [] +463 None user-460@plc.org keys: [460] sites: [] +464 None user-461@plc.org keys: [461] sites: [] +465 None user-462@plc.org keys: [462] sites: [] +466 None user-463@plc.org keys: [463] sites: [] +467 None user-464@plc.org keys: [464] sites: [] +468 None user-465@plc.org keys: [465] sites: [] +469 None user-466@plc.org keys: [466] sites: [] +470 None user-467@plc.org keys: [467] sites: [] +471 None user-468@plc.org keys: [468] sites: [] +472 None user-469@plc.org keys: [469] sites: [] +473 None user-470@plc.org keys: [470] sites: [] +474 None user-471@plc.org keys: [471] sites: [] +475 None user-472@plc.org keys: [472] sites: [] +476 None user-473@plc.org keys: [473] sites: [] +477 None user-474@plc.org keys: [474] sites: [] +478 None user-475@plc.org keys: [475] sites: [] +479 None user-476@plc.org keys: [476] sites: [] +480 None user-477@plc.org keys: [477] sites: [] +481 None user-478@plc.org keys: [478] sites: [] +482 None user-479@plc.org keys: [479] sites: [] +483 None user-480@plc.org keys: [480] sites: [] +484 None user-481@plc.org keys: [481] sites: [] +485 None user-482@plc.org keys: [482] sites: [] +486 None user-483@plc.org keys: [483] sites: [] +487 None user-484@plc.org keys: [484] sites: [] +488 None user-485@plc.org keys: [485] sites: [] +489 None user-486@plc.org keys: [486] sites: [] +490 None user-487@plc.org keys: [487] sites: [] +491 None user-488@plc.org keys: [488] sites: [] +492 None user-489@plc.org keys: [489] sites: [] +493 None user-490@plc.org keys: [490] sites: [] +494 None user-491@plc.org keys: [491] sites: [] +495 None user-492@plc.org keys: [492] sites: [] +496 None user-493@plc.org keys: [493] sites: [] +497 None user-494@plc.org keys: [494] sites: [] +498 None user-495@plc.org keys: [495] sites: [] +499 None user-496@plc.org keys: [496] sites: [] +500 None user-497@plc.org keys: [497] sites: [] +501 None user-498@plc.org keys: [498] sites: [] +502 None user-499@plc.org keys: [499] sites: [] +503 None user-500@plc.org keys: [500] sites: [] +504 1 peer2@planet-lab.org keys: [] sites: [] +505 1 user-1@plc.org keys: [501] sites: [] +506 1 user-2@plc.org keys: [502] sites: [] +507 1 user-3@plc.org keys: [503] sites: [] +508 1 user-4@plc.org keys: [504] sites: [] +509 1 user-5@plc.org keys: [505] sites: [] +510 1 user-6@plc.org keys: [506] sites: [] +511 1 user-7@plc.org keys: [507] sites: [] +512 1 user-8@plc.org keys: [508] sites: [] +513 1 user-9@plc.org keys: [509] sites: [] +514 1 user-10@plc.org keys: [510] sites: [] +515 1 user-11@plc.org keys: [511] sites: [] +516 1 user-12@plc.org keys: [512] sites: [] +517 1 user-13@plc.org keys: [513] sites: [] +518 1 user-14@plc.org keys: [514] sites: [] +519 1 user-15@plc.org keys: [515] sites: [] +520 1 user-16@plc.org keys: [516] sites: [] +521 1 user-17@plc.org keys: [517] sites: [] +522 1 user-18@plc.org keys: [518] sites: [] +523 1 user-19@plc.org keys: [519] sites: [] +524 1 user-20@plc.org keys: [520] sites: [] +525 1 user-21@plc.org keys: [521] sites: [] +526 1 user-22@plc.org keys: [522] sites: [] +527 1 user-23@plc.org keys: [523] sites: [] +528 1 user-24@plc.org keys: [524] sites: [] +529 1 user-25@plc.org keys: [525] sites: [] +530 1 user-26@plc.org keys: [526] sites: [] +531 1 user-27@plc.org keys: [527] sites: [] +532 1 user-28@plc.org keys: [528] sites: [] +533 1 user-29@plc.org keys: [529] sites: [] +534 1 user-30@plc.org keys: [530] sites: [] +535 1 user-31@plc.org keys: [531] sites: [] +536 1 user-32@plc.org keys: [532] sites: [] +537 1 user-33@plc.org keys: [533] sites: [] +538 1 user-34@plc.org keys: [534] sites: [] +539 1 user-35@plc.org keys: [535] sites: [] +540 1 user-36@plc.org keys: [536] sites: [] +541 1 user-37@plc.org keys: [537] sites: [] +542 1 user-38@plc.org keys: [538] sites: [] +543 1 user-39@plc.org keys: [539] sites: [] +544 1 user-40@plc.org keys: [540] sites: [] +545 1 user-41@plc.org keys: [541] sites: [] +546 1 user-42@plc.org keys: [542] sites: [] +547 1 user-43@plc.org keys: [543] sites: [] +548 1 user-44@plc.org keys: [544] sites: [] +549 1 user-45@plc.org keys: [545] sites: [] +550 1 user-46@plc.org keys: [546] sites: [] +551 1 user-47@plc.org keys: [547] sites: [] +552 1 user-48@plc.org keys: [548] sites: [] +553 1 user-49@plc.org keys: [549] sites: [] +554 1 user-50@plc.org keys: [550] sites: [] +555 1 user-51@plc.org keys: [551] sites: [] +556 1 user-52@plc.org keys: [552] sites: [] +557 1 user-53@plc.org keys: [553] sites: [] +558 1 user-54@plc.org keys: [554] sites: [] +559 1 user-55@plc.org keys: [555] sites: [] +560 1 user-56@plc.org keys: [556] sites: [] +561 1 user-57@plc.org keys: [557] sites: [] +562 1 user-58@plc.org keys: [558] sites: [] +563 1 user-59@plc.org keys: [559] sites: [] +564 1 user-60@plc.org keys: [560] sites: [] +565 1 user-61@plc.org keys: [561] sites: [] +566 1 user-62@plc.org keys: [562] sites: [] +567 1 user-63@plc.org keys: [563] sites: [] +568 1 user-64@plc.org keys: [564] sites: [] +569 1 user-65@plc.org keys: [565] sites: [] +570 1 user-66@plc.org keys: [566] sites: [] +571 1 user-67@plc.org keys: [567] sites: [] +572 1 user-68@plc.org keys: [568] sites: [] +573 1 user-69@plc.org keys: [569] sites: [] +574 1 user-70@plc.org keys: [570] sites: [] +575 1 user-71@plc.org keys: [571] sites: [] +576 1 user-72@plc.org keys: [572] sites: [] +577 1 user-73@plc.org keys: [573] sites: [] +578 1 user-74@plc.org keys: [574] sites: [] +579 1 user-75@plc.org keys: [575] sites: [] +580 1 user-76@plc.org keys: [576] sites: [] +581 1 user-77@plc.org keys: [577] sites: [] +582 1 user-78@plc.org keys: [578] sites: [] +583 1 user-79@plc.org keys: [579] sites: [] +584 1 user-80@plc.org keys: [580] sites: [] +585 1 user-81@plc.org keys: [581] sites: [] +586 1 user-82@plc.org keys: [582] sites: [] +587 1 user-83@plc.org keys: [583] sites: [] +588 1 user-84@plc.org keys: [584] sites: [] +589 1 user-85@plc.org keys: [585] sites: [] +590 1 user-86@plc.org keys: [586] sites: [] +591 1 user-87@plc.org keys: [587] sites: [] +592 1 user-88@plc.org keys: [588] sites: [] +593 1 user-89@plc.org keys: [589] sites: [] +594 1 user-90@plc.org keys: [590] sites: [] +595 1 user-91@plc.org keys: [591] sites: [] +596 1 user-92@plc.org keys: [592] sites: [] +597 1 user-93@plc.org keys: [593] sites: [] +598 1 user-94@plc.org keys: [594] sites: [] +599 1 user-95@plc.org keys: [595] sites: [] +600 1 user-96@plc.org keys: [596] sites: [] +601 1 user-97@plc.org keys: [597] sites: [] +602 1 user-98@plc.org keys: [598] sites: [] +603 1 user-99@plc.org keys: [599] sites: [] +604 1 user-100@plc.org keys: [600] sites: [] +605 1 user-101@plc.org keys: [601] sites: [] +606 1 user-102@plc.org keys: [602] sites: [] +607 1 user-103@plc.org keys: [603] sites: [] +608 1 user-104@plc.org keys: [604] sites: [] +609 1 user-105@plc.org keys: [605] sites: [] +610 1 user-106@plc.org keys: [606] sites: [] +611 1 user-107@plc.org keys: [607] sites: [] +612 1 user-108@plc.org keys: [608] sites: [] +613 1 user-109@plc.org keys: [609] sites: [] +614 1 user-110@plc.org keys: [610] sites: [] +615 1 user-111@plc.org keys: [611] sites: [] +616 1 user-112@plc.org keys: [612] sites: [] +617 1 user-113@plc.org keys: [613] sites: [] +618 1 user-114@plc.org keys: [614] sites: [] +619 1 user-115@plc.org keys: [615] sites: [] +620 1 user-116@plc.org keys: [616] sites: [] +621 1 user-117@plc.org keys: [617] sites: [] +622 1 user-118@plc.org keys: [618] sites: [] +623 1 user-119@plc.org keys: [619] sites: [] +624 1 user-120@plc.org keys: [620] sites: [] +625 1 user-121@plc.org keys: [621] sites: [] +626 1 user-122@plc.org keys: [622] sites: [] +627 1 user-123@plc.org keys: [623] sites: [] +628 1 user-124@plc.org keys: [624] sites: [] +629 1 user-125@plc.org keys: [625] sites: [] +630 1 user-126@plc.org keys: [626] sites: [] +631 1 user-127@plc.org keys: [627] sites: [] +632 1 user-128@plc.org keys: [628] sites: [] +633 1 user-129@plc.org keys: [629] sites: [] +634 1 user-130@plc.org keys: [630] sites: [] +635 1 user-131@plc.org keys: [631] sites: [] +636 1 user-132@plc.org keys: [632] sites: [] +637 1 user-133@plc.org keys: [633] sites: [] +638 1 user-134@plc.org keys: [634] sites: [] +639 1 user-135@plc.org keys: [635] sites: [] +640 1 user-136@plc.org keys: [636] sites: [] +641 1 user-137@plc.org keys: [637] sites: [] +642 1 user-138@plc.org keys: [638] sites: [] +643 1 user-139@plc.org keys: [639] sites: [] +644 1 user-140@plc.org keys: [640] sites: [] +645 1 user-141@plc.org keys: [641] sites: [] +646 1 user-142@plc.org keys: [642] sites: [] +647 1 user-143@plc.org keys: [643] sites: [] +648 1 user-144@plc.org keys: [644] sites: [] +649 1 user-145@plc.org keys: [645] sites: [] +650 1 user-146@plc.org keys: [646] sites: [] +651 1 user-147@plc.org keys: [647] sites: [] +652 1 user-148@plc.org keys: [648] sites: [] +653 1 user-149@plc.org keys: [649] sites: [] +654 1 user-150@plc.org keys: [650] sites: [] +655 1 user-151@plc.org keys: [651] sites: [] +656 1 user-152@plc.org keys: [652] sites: [] +657 1 user-153@plc.org keys: [653] sites: [] +658 1 user-154@plc.org keys: [654] sites: [] +659 1 user-155@plc.org keys: [655] sites: [] +660 1 user-156@plc.org keys: [656] sites: [] +661 1 user-157@plc.org keys: [657] sites: [] +662 1 user-158@plc.org keys: [658] sites: [] +663 1 user-159@plc.org keys: [659] sites: [] +664 1 user-160@plc.org keys: [660] sites: [] +665 1 user-161@plc.org keys: [661] sites: [] +666 1 user-162@plc.org keys: [662] sites: [] +667 1 user-163@plc.org keys: [663] sites: [] +668 1 user-164@plc.org keys: [664] sites: [] +669 1 user-165@plc.org keys: [665] sites: [] +670 1 user-166@plc.org keys: [666] sites: [] +671 1 user-167@plc.org keys: [667] sites: [] +672 1 user-168@plc.org keys: [668] sites: [] +673 1 user-169@plc.org keys: [669] sites: [] +674 1 user-170@plc.org keys: [670] sites: [] +675 1 user-171@plc.org keys: [671] sites: [] +676 1 user-172@plc.org keys: [672] sites: [] +677 1 user-173@plc.org keys: [673] sites: [] +678 1 user-174@plc.org keys: [674] sites: [] +679 1 user-175@plc.org keys: [675] sites: [] +680 1 user-176@plc.org keys: [676] sites: [] +681 1 user-177@plc.org keys: [677] sites: [] +682 1 user-178@plc.org keys: [678] sites: [] +683 1 user-179@plc.org keys: [679] sites: [] +684 1 user-180@plc.org keys: [680] sites: [] +685 1 user-181@plc.org keys: [681] sites: [] +686 1 user-182@plc.org keys: [682] sites: [] +687 1 user-183@plc.org keys: [683] sites: [] +688 1 user-184@plc.org keys: [684] sites: [] +689 1 user-185@plc.org keys: [685] sites: [] +690 1 user-186@plc.org keys: [686] sites: [] +691 1 user-187@plc.org keys: [687] sites: [] +692 1 user-188@plc.org keys: [688] sites: [] +693 1 user-189@plc.org keys: [689] sites: [] +694 1 user-190@plc.org keys: [690] sites: [] +695 1 user-191@plc.org keys: [691] sites: [] +696 1 user-192@plc.org keys: [692] sites: [] +697 1 user-193@plc.org keys: [693] sites: [] +698 1 user-194@plc.org keys: [694] sites: [] +699 1 user-195@plc.org keys: [695] sites: [] +700 1 user-196@plc.org keys: [696] sites: [] +701 1 user-197@plc.org keys: [697] sites: [] +702 1 user-198@plc.org keys: [698] sites: [] +703 1 user-199@plc.org keys: [699] sites: [] +704 1 user-200@plc.org keys: [700] sites: [] +705 1 user-201@plc.org keys: [701] sites: [] +706 1 user-202@plc.org keys: [702] sites: [] +707 1 user-203@plc.org keys: [703] sites: [] +708 1 user-204@plc.org keys: [704] sites: [] +709 1 user-205@plc.org keys: [705] sites: [] +710 1 user-206@plc.org keys: [706] sites: [] +711 1 user-207@plc.org keys: [707] sites: [] +712 1 user-208@plc.org keys: [708] sites: [] +713 1 user-209@plc.org keys: [709] sites: [] +714 1 user-210@plc.org keys: [710] sites: [] +715 1 user-211@plc.org keys: [711] sites: [] +716 1 user-212@plc.org keys: [712] sites: [] +717 1 user-213@plc.org keys: [713] sites: [] +718 1 user-214@plc.org keys: [714] sites: [] +719 1 user-215@plc.org keys: [715] sites: [] +720 1 user-216@plc.org keys: [716] sites: [] +721 1 user-217@plc.org keys: [717] sites: [] +722 1 user-218@plc.org keys: [718] sites: [] +723 1 user-219@plc.org keys: [719] sites: [] +724 1 user-220@plc.org keys: [720] sites: [] +725 1 user-221@plc.org keys: [721] sites: [] +726 1 user-222@plc.org keys: [722] sites: [] +727 1 user-223@plc.org keys: [723] sites: [] +728 1 user-224@plc.org keys: [724] sites: [] +729 1 user-225@plc.org keys: [725] sites: [] +730 1 user-226@plc.org keys: [726] sites: [] +731 1 user-227@plc.org keys: [727] sites: [] +732 1 user-228@plc.org keys: [728] sites: [] +733 1 user-229@plc.org keys: [729] sites: [] +734 1 user-230@plc.org keys: [730] sites: [] +735 1 user-231@plc.org keys: [731] sites: [] +736 1 user-232@plc.org keys: [732] sites: [] +737 1 user-233@plc.org keys: [733] sites: [] +738 1 user-234@plc.org keys: [734] sites: [] +739 1 user-235@plc.org keys: [735] sites: [] +740 1 user-236@plc.org keys: [736] sites: [] +741 1 user-237@plc.org keys: [737] sites: [] +742 1 user-238@plc.org keys: [738] sites: [] +743 1 user-239@plc.org keys: [739] sites: [] +744 1 user-240@plc.org keys: [740] sites: [] +745 1 user-241@plc.org keys: [741] sites: [] +746 1 user-242@plc.org keys: [742] sites: [] +747 1 user-243@plc.org keys: [743] sites: [] +748 1 user-244@plc.org keys: [744] sites: [] +749 1 user-245@plc.org keys: [745] sites: [] +750 1 user-246@plc.org keys: [746] sites: [] +751 1 user-247@plc.org keys: [747] sites: [] +752 1 user-248@plc.org keys: [748] sites: [] +753 1 user-249@plc.org keys: [749] sites: [] +754 1 user-250@plc.org keys: [750] sites: [] +755 1 user-251@plc.org keys: [751] sites: [] +756 1 user-252@plc.org keys: [752] sites: [] +757 1 user-253@plc.org keys: [753] sites: [] +758 1 user-254@plc.org keys: [754] sites: [] +759 1 user-255@plc.org keys: [755] sites: [] +760 1 user-256@plc.org keys: [756] sites: [] +761 1 user-257@plc.org keys: [757] sites: [] +762 1 user-258@plc.org keys: [758] sites: [] +763 1 user-259@plc.org keys: [759] sites: [] +764 1 user-260@plc.org keys: [760] sites: [] +765 1 user-261@plc.org keys: [761] sites: [] +766 1 user-262@plc.org keys: [762] sites: [] +767 1 user-263@plc.org keys: [763] sites: [] +768 1 user-264@plc.org keys: [764] sites: [] +769 1 user-265@plc.org keys: [765] sites: [] +770 1 user-266@plc.org keys: [766] sites: [] +771 1 user-267@plc.org keys: [767] sites: [] +772 1 user-268@plc.org keys: [768] sites: [] +773 1 user-269@plc.org keys: [769] sites: [] +774 1 user-270@plc.org keys: [770] sites: [] +775 1 user-271@plc.org keys: [771] sites: [] +776 1 user-272@plc.org keys: [772] sites: [] +777 1 user-273@plc.org keys: [773] sites: [] +778 1 user-274@plc.org keys: [774] sites: [] +779 1 user-275@plc.org keys: [775] sites: [] +780 1 user-276@plc.org keys: [776] sites: [] +781 1 user-277@plc.org keys: [777] sites: [] +782 1 user-278@plc.org keys: [778] sites: [] +783 1 user-279@plc.org keys: [779] sites: [] +784 1 user-280@plc.org keys: [780] sites: [] +785 1 user-281@plc.org keys: [781] sites: [] +786 1 user-282@plc.org keys: [782] sites: [] +787 1 user-283@plc.org keys: [783] sites: [] +788 1 user-284@plc.org keys: [784] sites: [] +789 1 user-285@plc.org keys: [785] sites: [] +790 1 user-286@plc.org keys: [786] sites: [] +791 1 user-287@plc.org keys: [787] sites: [] +792 1 user-288@plc.org keys: [788] sites: [] +793 1 user-289@plc.org keys: [789] sites: [] +794 1 user-290@plc.org keys: [790] sites: [] +795 1 user-291@plc.org keys: [791] sites: [] +796 1 user-292@plc.org keys: [792] sites: [] +797 1 user-293@plc.org keys: [793] sites: [] +798 1 user-294@plc.org keys: [794] sites: [] +799 1 user-295@plc.org keys: [795] sites: [] +800 1 user-296@plc.org keys: [796] sites: [] +801 1 user-297@plc.org keys: [797] sites: [] +802 1 user-298@plc.org keys: [798] sites: [] +803 1 user-299@plc.org keys: [799] sites: [] +804 1 user-300@plc.org keys: [800] sites: [] +805 1 user-301@plc.org keys: [801] sites: [] +806 1 user-302@plc.org keys: [802] sites: [] +807 1 user-303@plc.org keys: [803] sites: [] +808 1 user-304@plc.org keys: [804] sites: [] +809 1 user-305@plc.org keys: [805] sites: [] +810 1 user-306@plc.org keys: [806] sites: [] +811 1 user-307@plc.org keys: [807] sites: [] +812 1 user-308@plc.org keys: [808] sites: [] +813 1 user-309@plc.org keys: [809] sites: [] +814 1 user-310@plc.org keys: [810] sites: [] +815 1 user-311@plc.org keys: [811] sites: [] +816 1 user-312@plc.org keys: [812] sites: [] +817 1 user-313@plc.org keys: [813] sites: [] +818 1 user-314@plc.org keys: [814] sites: [] +819 1 user-315@plc.org keys: [815] sites: [] +820 1 user-316@plc.org keys: [816] sites: [] +821 1 user-317@plc.org keys: [817] sites: [] +822 1 user-318@plc.org keys: [818] sites: [] +823 1 user-319@plc.org keys: [819] sites: [] +824 1 user-320@plc.org keys: [820] sites: [] +825 1 user-321@plc.org keys: [821] sites: [] +826 1 user-322@plc.org keys: [822] sites: [] +827 1 user-323@plc.org keys: [823] sites: [] +828 1 user-324@plc.org keys: [824] sites: [] +829 1 user-325@plc.org keys: [825] sites: [] +830 1 user-326@plc.org keys: [826] sites: [] +831 1 user-327@plc.org keys: [827] sites: [] +832 1 user-328@plc.org keys: [828] sites: [] +833 1 user-329@plc.org keys: [829] sites: [] +834 1 user-330@plc.org keys: [830] sites: [] +835 1 user-331@plc.org keys: [831] sites: [] +836 1 user-332@plc.org keys: [832] sites: [] +837 1 user-333@plc.org keys: [833] sites: [] +838 1 user-334@plc.org keys: [834] sites: [] +839 1 user-335@plc.org keys: [835] sites: [] +840 1 user-336@plc.org keys: [836] sites: [] +841 1 user-337@plc.org keys: [837] sites: [] +842 1 user-338@plc.org keys: [838] sites: [] +843 1 user-339@plc.org keys: [839] sites: [] +844 1 user-340@plc.org keys: [840] sites: [] +845 1 user-341@plc.org keys: [841] sites: [] +846 1 user-342@plc.org keys: [842] sites: [] +847 1 user-343@plc.org keys: [843] sites: [] +848 1 user-344@plc.org keys: [844] sites: [] +849 1 user-345@plc.org keys: [845] sites: [] +850 1 user-346@plc.org keys: [846] sites: [] +851 1 user-347@plc.org keys: [847] sites: [] +852 1 user-348@plc.org keys: [848] sites: [] +853 1 user-349@plc.org keys: [849] sites: [] +854 1 user-350@plc.org keys: [850] sites: [] +855 1 user-351@plc.org keys: [851] sites: [] +856 1 user-352@plc.org keys: [852] sites: [] +857 1 user-353@plc.org keys: [853] sites: [] +858 1 user-354@plc.org keys: [854] sites: [] +859 1 user-355@plc.org keys: [855] sites: [] +860 1 user-356@plc.org keys: [856] sites: [] +861 1 user-357@plc.org keys: [857] sites: [] +862 1 user-358@plc.org keys: [858] sites: [] +863 1 user-359@plc.org keys: [859] sites: [] +864 1 user-360@plc.org keys: [860] sites: [] +865 1 user-361@plc.org keys: [861] sites: [] +866 1 user-362@plc.org keys: [862] sites: [] +867 1 user-363@plc.org keys: [863] sites: [] +868 1 user-364@plc.org keys: [864] sites: [] +869 1 user-365@plc.org keys: [865] sites: [] +870 1 user-366@plc.org keys: [866] sites: [] +871 1 user-367@plc.org keys: [867] sites: [] +872 1 user-368@plc.org keys: [868] sites: [] +873 1 user-369@plc.org keys: [869] sites: [] +874 1 user-370@plc.org keys: [870] sites: [] +875 1 user-371@plc.org keys: [871] sites: [] +876 1 user-372@plc.org keys: [872] sites: [] +877 1 user-373@plc.org keys: [873] sites: [] +878 1 user-374@plc.org keys: [874] sites: [] +879 1 user-375@plc.org keys: [875] sites: [] +880 1 user-376@plc.org keys: [876] sites: [] +881 1 user-377@plc.org keys: [877] sites: [] +882 1 user-378@plc.org keys: [878] sites: [] +883 1 user-379@plc.org keys: [879] sites: [] +884 1 user-380@plc.org keys: [880] sites: [] +885 1 user-381@plc.org keys: [881] sites: [] +886 1 user-382@plc.org keys: [882] sites: [] +887 1 user-383@plc.org keys: [883] sites: [] +888 1 user-384@plc.org keys: [884] sites: [] +889 1 user-385@plc.org keys: [885] sites: [] +890 1 user-386@plc.org keys: [886] sites: [] +891 1 user-387@plc.org keys: [887] sites: [] +892 1 user-388@plc.org keys: [888] sites: [] +893 1 user-389@plc.org keys: [889] sites: [] +894 1 user-390@plc.org keys: [890] sites: [] +895 1 user-391@plc.org keys: [891] sites: [] +896 1 user-392@plc.org keys: [892] sites: [] +897 1 user-393@plc.org keys: [893] sites: [] +898 1 user-394@plc.org keys: [894] sites: [] +899 1 user-395@plc.org keys: [895] sites: [] +900 1 user-396@plc.org keys: [896] sites: [] +901 1 user-397@plc.org keys: [897] sites: [] +902 1 user-398@plc.org keys: [898] sites: [] +903 1 user-399@plc.org keys: [899] sites: [] +904 1 user-400@plc.org keys: [900] sites: [] +905 1 user-401@plc.org keys: [901] sites: [] +906 1 user-402@plc.org keys: [902] sites: [] +907 1 user-403@plc.org keys: [903] sites: [] +908 1 user-404@plc.org keys: [904] sites: [] +909 1 user-405@plc.org keys: [905] sites: [] +910 1 user-406@plc.org keys: [906] sites: [] +911 1 user-407@plc.org keys: [907] sites: [] +912 1 user-408@plc.org keys: [908] sites: [] +913 1 user-409@plc.org keys: [909] sites: [] +914 1 user-410@plc.org keys: [910] sites: [] +915 1 user-411@plc.org keys: [911] sites: [] +916 1 user-412@plc.org keys: [912] sites: [] +917 1 user-413@plc.org keys: [913] sites: [] +918 1 user-414@plc.org keys: [914] sites: [] +919 1 user-415@plc.org keys: [915] sites: [] +920 1 user-416@plc.org keys: [916] sites: [] +921 1 user-417@plc.org keys: [917] sites: [] +922 1 user-418@plc.org keys: [918] sites: [] +923 1 user-419@plc.org keys: [919] sites: [] +924 1 user-420@plc.org keys: [920] sites: [] +925 1 user-421@plc.org keys: [921] sites: [] +926 1 user-422@plc.org keys: [922] sites: [] +927 1 user-423@plc.org keys: [923] sites: [] +928 1 user-424@plc.org keys: [924] sites: [] +929 1 user-425@plc.org keys: [925] sites: [] +930 1 user-426@plc.org keys: [926] sites: [] +931 1 user-427@plc.org keys: [927] sites: [] +932 1 user-428@plc.org keys: [928] sites: [] +933 1 user-429@plc.org keys: [929] sites: [] +934 1 user-430@plc.org keys: [930] sites: [] +935 1 user-431@plc.org keys: [931] sites: [] +936 1 user-432@plc.org keys: [932] sites: [] +937 1 user-433@plc.org keys: [933] sites: [] +938 1 user-434@plc.org keys: [934] sites: [] +939 1 user-435@plc.org keys: [935] sites: [] +940 1 user-436@plc.org keys: [936] sites: [] +941 1 user-437@plc.org keys: [937] sites: [] +942 1 user-438@plc.org keys: [938] sites: [] +943 1 user-439@plc.org keys: [939] sites: [] +944 1 user-440@plc.org keys: [940] sites: [] +945 1 user-441@plc.org keys: [941] sites: [] +946 1 user-442@plc.org keys: [942] sites: [] +947 1 user-443@plc.org keys: [943] sites: [] +948 1 user-444@plc.org keys: [944] sites: [] +949 1 user-445@plc.org keys: [945] sites: [] +950 1 user-446@plc.org keys: [946] sites: [] +951 1 user-447@plc.org keys: [947] sites: [] +952 1 user-448@plc.org keys: [948] sites: [] +953 1 user-449@plc.org keys: [949] sites: [] +954 1 user-450@plc.org keys: [950] sites: [] +955 1 user-451@plc.org keys: [951] sites: [] +956 1 user-452@plc.org keys: [952] sites: [] +957 1 user-453@plc.org keys: [953] sites: [] +958 1 user-454@plc.org keys: [954] sites: [] +959 1 user-455@plc.org keys: [955] sites: [] +960 1 user-456@plc.org keys: [956] sites: [] +961 1 user-457@plc.org keys: [957] sites: [] +962 1 user-458@plc.org keys: [958] sites: [] +963 1 user-459@plc.org keys: [959] sites: [] +964 1 user-460@plc.org keys: [960] sites: [] +965 1 user-461@plc.org keys: [961] sites: [] +966 1 user-462@plc.org keys: [962] sites: [] +967 1 user-463@plc.org keys: [963] sites: [] +968 1 user-464@plc.org keys: [964] sites: [] +969 1 user-465@plc.org keys: [965] sites: [] +970 1 user-466@plc.org keys: [966] sites: [] +971 1 user-467@plc.org keys: [967] sites: [] +972 1 user-468@plc.org keys: [968] sites: [] +973 1 user-469@plc.org keys: [969] sites: [] +974 1 user-470@plc.org keys: [970] sites: [] +975 1 user-471@plc.org keys: [971] sites: [] +976 1 user-472@plc.org keys: [972] sites: [] +977 1 user-473@plc.org keys: [973] sites: [] +978 1 user-474@plc.org keys: [974] sites: [] +979 1 user-475@plc.org keys: [975] sites: [] +980 1 user-476@plc.org keys: [976] sites: [] +981 1 user-477@plc.org keys: [977] sites: [] +982 1 user-478@plc.org keys: [978] sites: [] +983 1 user-479@plc.org keys: [979] sites: [] +984 1 user-480@plc.org keys: [980] sites: [] +985 1 user-481@plc.org keys: [981] sites: [] +986 1 user-482@plc.org keys: [982] sites: [] +987 1 user-483@plc.org keys: [983] sites: [] +988 1 user-484@plc.org keys: [984] sites: [] +989 1 user-485@plc.org keys: [985] sites: [] +990 1 user-486@plc.org keys: [986] sites: [] +991 1 user-487@plc.org keys: [987] sites: [] +992 1 user-488@plc.org keys: [988] sites: [] +993 1 user-489@plc.org keys: [989] sites: [] +994 1 user-490@plc.org keys: [990] sites: [] +995 1 user-491@plc.org keys: [991] sites: [] +996 1 user-492@plc.org keys: [992] sites: [] +997 1 user-493@plc.org keys: [993] sites: [] +998 1 user-494@plc.org keys: [994] sites: [] +999 1 user-495@plc.org keys: [995] sites: [] +1000 1 user-496@plc.org keys: [996] sites: [] +1001 1 user-497@plc.org keys: [997] sites: [] +1002 1 user-498@plc.org keys: [998] sites: [] +1003 1 user-499@plc.org keys: [999] sites: [] +1004 1 user-500@plc.org keys: [1000] sites: [] +01: NODES +1 None n1-001.plc1.org sls= [352, 2] site= 2 +2 None n1-002.plc1.org sls= [353, 3] site= 3 +3 None n1-003.plc1.org sls= [354, 4] site= 4 +4 None n1-004.plc1.org sls= [355, 5] site= 5 +5 None n1-005.plc1.org sls= [356, 6] site= 6 +6 None n1-006.plc1.org sls= [357, 7] site= 7 +7 None n1-007.plc1.org sls= [358, 8] site= 8 +8 None n1-008.plc1.org sls= [359, 9] site= 9 +9 None n1-009.plc1.org sls= [360, 10] site= 10 +10 None n1-010.plc1.org sls= [361, 11] site= 11 +11 None n1-011.plc1.org sls= [362, 12] site= 12 +12 None n1-012.plc1.org sls= [363, 13] site= 13 +13 None n1-013.plc1.org sls= [364, 14] site= 14 +14 None n1-014.plc1.org sls= [365, 15] site= 15 +15 None n1-015.plc1.org sls= [366, 16] site= 16 +16 None n1-016.plc1.org sls= [367, 17] site= 17 +17 None n1-017.plc1.org sls= [368, 18] site= 18 +18 None n1-018.plc1.org sls= [369, 19] site= 19 +19 None n1-019.plc1.org sls= [370, 20] site= 20 +20 None n1-020.plc1.org sls= [371, 21] site= 21 +21 None n1-021.plc1.org sls= [372, 22] site= 22 +22 None n1-022.plc1.org sls= [373, 23] site= 23 +23 None n1-023.plc1.org sls= [374, 24] site= 24 +24 None n1-024.plc1.org sls= [375, 25] site= 25 +25 None n1-025.plc1.org sls= [376, 26] site= 26 +26 None n1-026.plc1.org sls= [377, 27] site= 27 +27 None n1-027.plc1.org sls= [378, 28] site= 28 +28 None n1-028.plc1.org sls= [379, 29] site= 29 +29 None n1-029.plc1.org sls= [380, 30] site= 30 +30 None n1-030.plc1.org sls= [381, 31] site= 31 +31 None n1-031.plc1.org sls= [382, 32] site= 32 +32 None n1-032.plc1.org sls= [383, 33] site= 33 +33 None n1-033.plc1.org sls= [384, 34] site= 34 +34 None n1-034.plc1.org sls= [385, 35] site= 35 +35 None n1-035.plc1.org sls= [386, 36] site= 36 +36 None n1-036.plc1.org sls= [387, 37] site= 37 +37 None n1-037.plc1.org sls= [388, 38] site= 38 +38 None n1-038.plc1.org sls= [389, 39] site= 39 +39 None n1-039.plc1.org sls= [390, 40] site= 40 +40 None n1-040.plc1.org sls= [391, 41] site= 41 +41 None n1-041.plc1.org sls= [392, 42] site= 42 +42 None n1-042.plc1.org sls= [393, 43] site= 43 +43 None n1-043.plc1.org sls= [394, 44] site= 44 +44 None n1-044.plc1.org sls= [395, 45] site= 45 +45 None n1-045.plc1.org sls= [396, 46] site= 46 +46 None n1-046.plc1.org sls= [397, 47] site= 47 +47 None n1-047.plc1.org sls= [398, 48] site= 48 +48 None n1-048.plc1.org sls= [399, 49] site= 49 +49 None n1-049.plc1.org sls= [400, 50] site= 50 +50 None n1-050.plc1.org sls= [401, 51] site= 51 +51 None n1-051.plc1.org sls= [402, 52] site= 52 +52 None n1-052.plc1.org sls= [403, 53] site= 53 +53 None n1-053.plc1.org sls= [404, 54] site= 54 +54 None n1-054.plc1.org sls= [405, 55] site= 55 +55 None n1-055.plc1.org sls= [406, 56] site= 56 +56 None n1-056.plc1.org sls= [407, 57] site= 57 +57 None n1-057.plc1.org sls= [408, 58] site= 58 +58 None n1-058.plc1.org sls= [409, 59] site= 59 +59 None n1-059.plc1.org sls= [410, 60] site= 60 +60 None n1-060.plc1.org sls= [411, 61] site= 61 +61 None n1-061.plc1.org sls= [412, 62] site= 62 +62 None n1-062.plc1.org sls= [413, 63] site= 63 +63 None n1-063.plc1.org sls= [414, 64] site= 64 +64 None n1-064.plc1.org sls= [415, 65] site= 65 +65 None n1-065.plc1.org sls= [416, 66] site= 66 +66 None n1-066.plc1.org sls= [417, 67] site= 67 +67 None n1-067.plc1.org sls= [418, 68] site= 68 +68 None n1-068.plc1.org sls= [419, 69] site= 69 +69 None n1-069.plc1.org sls= [420, 70] site= 70 +70 None n1-070.plc1.org sls= [421, 71] site= 71 +71 None n1-071.plc1.org sls= [422, 72] site= 72 +72 None n1-072.plc1.org sls= [423, 73] site= 73 +73 None n1-073.plc1.org sls= [424, 74] site= 74 +74 None n1-074.plc1.org sls= [425, 75] site= 75 +75 None n1-075.plc1.org sls= [426, 76] site= 76 +76 None n1-076.plc1.org sls= [427, 77] site= 77 +77 None n1-077.plc1.org sls= [428, 78] site= 78 +78 None n1-078.plc1.org sls= [429, 79] site= 79 +79 None n1-079.plc1.org sls= [430, 80] site= 80 +80 None n1-080.plc1.org sls= [431, 81] site= 81 +81 None n1-081.plc1.org sls= [432, 82] site= 82 +82 None n1-082.plc1.org sls= [433, 83] site= 83 +83 None n1-083.plc1.org sls= [434, 84] site= 84 +84 None n1-084.plc1.org sls= [435, 85] site= 85 +85 None n1-085.plc1.org sls= [436, 86] site= 86 +86 None n1-086.plc1.org sls= [437, 87] site= 87 +87 None n1-087.plc1.org sls= [438, 88] site= 88 +88 None n1-088.plc1.org sls= [439, 89] site= 89 +89 None n1-089.plc1.org sls= [440, 90] site= 90 +90 None n1-090.plc1.org sls= [441, 91] site= 91 +91 None n1-091.plc1.org sls= [442, 92] site= 92 +92 None n1-092.plc1.org sls= [443, 93] site= 93 +93 None n1-093.plc1.org sls= [444, 94] site= 94 +94 None n1-094.plc1.org sls= [445, 95] site= 95 +95 None n1-095.plc1.org sls= [446, 96] site= 96 +96 None n1-096.plc1.org sls= [447, 97] site= 97 +97 None n1-097.plc1.org sls= [448, 98] site= 98 +98 None n1-098.plc1.org sls= [449, 99] site= 99 +99 None n1-099.plc1.org sls= [450, 100] site= 100 +100 None n1-100.plc1.org sls= [451, 101] site= 101 +101 None n1-101.plc1.org sls= [452, 102] site= 102 +102 None n1-102.plc1.org sls= [453, 103] site= 103 +103 None n1-103.plc1.org sls= [454, 104] site= 104 +104 None n1-104.plc1.org sls= [455, 105] site= 105 +105 None n1-105.plc1.org sls= [456, 106] site= 106 +106 None n1-106.plc1.org sls= [457, 107] site= 107 +107 None n1-107.plc1.org sls= [458, 108] site= 108 +108 None n1-108.plc1.org sls= [459, 109] site= 109 +109 None n1-109.plc1.org sls= [460, 110] site= 110 +110 None n1-110.plc1.org sls= [461, 111] site= 111 +111 None n1-111.plc1.org sls= [462, 112] site= 112 +112 None n1-112.plc1.org sls= [463, 113] site= 113 +113 None n1-113.plc1.org sls= [464, 114] site= 114 +114 None n1-114.plc1.org sls= [465, 115] site= 115 +115 None n1-115.plc1.org sls= [466, 116] site= 116 +116 None n1-116.plc1.org sls= [467, 117] site= 117 +117 None n1-117.plc1.org sls= [468, 118] site= 118 +118 None n1-118.plc1.org sls= [469, 119] site= 119 +119 None n1-119.plc1.org sls= [470, 120] site= 120 +120 None n1-120.plc1.org sls= [471, 121] site= 121 +121 None n1-121.plc1.org sls= [472, 122] site= 122 +122 None n1-122.plc1.org sls= [473, 123] site= 123 +123 None n1-123.plc1.org sls= [474, 124] site= 124 +124 None n1-124.plc1.org sls= [475, 125] site= 125 +125 None n1-125.plc1.org sls= [476, 126] site= 126 +126 None n1-126.plc1.org sls= [477, 127] site= 127 +127 None n1-127.plc1.org sls= [478, 128] site= 128 +128 None n1-128.plc1.org sls= [479, 129] site= 129 +129 None n1-129.plc1.org sls= [480, 130] site= 130 +130 None n1-130.plc1.org sls= [481, 131] site= 131 +131 None n1-131.plc1.org sls= [482, 132] site= 132 +132 None n1-132.plc1.org sls= [483, 133] site= 133 +133 None n1-133.plc1.org sls= [484, 134] site= 134 +134 None n1-134.plc1.org sls= [485, 135] site= 135 +135 None n1-135.plc1.org sls= [486, 136] site= 136 +136 None n1-136.plc1.org sls= [487, 137] site= 137 +137 None n1-137.plc1.org sls= [488, 138] site= 138 +138 None n1-138.plc1.org sls= [489, 139] site= 139 +139 None n1-139.plc1.org sls= [490, 140] site= 140 +140 None n1-140.plc1.org sls= [491, 141] site= 141 +141 None n1-141.plc1.org sls= [492, 142] site= 142 +142 None n1-142.plc1.org sls= [493, 143] site= 143 +143 None n1-143.plc1.org sls= [494, 144] site= 144 +144 None n1-144.plc1.org sls= [495, 145] site= 145 +145 None n1-145.plc1.org sls= [496, 146] site= 146 +146 None n1-146.plc1.org sls= [497, 147] site= 147 +147 None n1-147.plc1.org sls= [498, 148] site= 148 +148 None n1-148.plc1.org sls= [499, 149] site= 149 +149 None n1-149.plc1.org sls= [500, 150] site= 150 +150 None n1-150.plc1.org sls= [501, 151] site= 151 +151 None n1-151.plc1.org sls= [152] site= 152 +152 None n1-152.plc1.org sls= [153] site= 153 +153 None n1-153.plc1.org sls= [154] site= 154 +154 None n1-154.plc1.org sls= [155] site= 155 +155 None n1-155.plc1.org sls= [156] site= 156 +156 None n1-156.plc1.org sls= [157] site= 157 +157 None n1-157.plc1.org sls= [158] site= 158 +158 None n1-158.plc1.org sls= [159] site= 159 +159 None n1-159.plc1.org sls= [160] site= 160 +160 None n1-160.plc1.org sls= [161] site= 161 +161 None n1-161.plc1.org sls= [162] site= 162 +162 None n1-162.plc1.org sls= [163] site= 163 +163 None n1-163.plc1.org sls= [164] site= 164 +164 None n1-164.plc1.org sls= [165] site= 165 +165 None n1-165.plc1.org sls= [166] site= 166 +166 None n1-166.plc1.org sls= [167] site= 167 +167 None n1-167.plc1.org sls= [168] site= 168 +168 None n1-168.plc1.org sls= [169] site= 169 +169 None n1-169.plc1.org sls= [170] site= 170 +170 None n1-170.plc1.org sls= [171] site= 171 +171 None n1-171.plc1.org sls= [172] site= 172 +172 None n1-172.plc1.org sls= [173] site= 173 +173 None n1-173.plc1.org sls= [174] site= 174 +174 None n1-174.plc1.org sls= [175] site= 175 +175 None n1-175.plc1.org sls= [176] site= 176 +176 None n1-176.plc1.org sls= [177] site= 177 +177 None n1-177.plc1.org sls= [178] site= 178 +178 None n1-178.plc1.org sls= [179] site= 179 +179 None n1-179.plc1.org sls= [180] site= 180 +180 None n1-180.plc1.org sls= [181] site= 181 +181 None n1-181.plc1.org sls= [182] site= 182 +182 None n1-182.plc1.org sls= [183] site= 183 +183 None n1-183.plc1.org sls= [184] site= 184 +184 None n1-184.plc1.org sls= [185] site= 185 +185 None n1-185.plc1.org sls= [186] site= 186 +186 None n1-186.plc1.org sls= [187] site= 187 +187 None n1-187.plc1.org sls= [188] site= 188 +188 None n1-188.plc1.org sls= [189] site= 189 +189 None n1-189.plc1.org sls= [190] site= 190 +190 None n1-190.plc1.org sls= [191] site= 191 +191 None n1-191.plc1.org sls= [192] site= 192 +192 None n1-192.plc1.org sls= [193] site= 193 +193 None n1-193.plc1.org sls= [194] site= 194 +194 None n1-194.plc1.org sls= [195] site= 195 +195 None n1-195.plc1.org sls= [196] site= 196 +196 None n1-196.plc1.org sls= [197] site= 197 +197 None n1-197.plc1.org sls= [198] site= 198 +198 None n1-198.plc1.org sls= [199] site= 199 +199 None n1-199.plc1.org sls= [200] site= 200 +200 None n1-200.plc1.org sls= [201] site= 201 +201 None n1-201.plc1.org sls= [202] site= 2 +202 None n1-202.plc1.org sls= [203] site= 3 +203 None n1-203.plc1.org sls= [204] site= 4 +204 None n1-204.plc1.org sls= [205] site= 5 +205 None n1-205.plc1.org sls= [206] site= 6 +206 None n1-206.plc1.org sls= [207] site= 7 +207 None n1-207.plc1.org sls= [208] site= 8 +208 None n1-208.plc1.org sls= [209] site= 9 +209 None n1-209.plc1.org sls= [210] site= 10 +210 None n1-210.plc1.org sls= [211] site= 11 +211 None n1-211.plc1.org sls= [212] site= 12 +212 None n1-212.plc1.org sls= [213] site= 13 +213 None n1-213.plc1.org sls= [214] site= 14 +214 None n1-214.plc1.org sls= [215] site= 15 +215 None n1-215.plc1.org sls= [216] site= 16 +216 None n1-216.plc1.org sls= [217] site= 17 +217 None n1-217.plc1.org sls= [218] site= 18 +218 None n1-218.plc1.org sls= [219] site= 19 +219 None n1-219.plc1.org sls= [220] site= 20 +220 None n1-220.plc1.org sls= [221] site= 21 +221 None n1-221.plc1.org sls= [222] site= 22 +222 None n1-222.plc1.org sls= [223] site= 23 +223 None n1-223.plc1.org sls= [224] site= 24 +224 None n1-224.plc1.org sls= [225] site= 25 +225 None n1-225.plc1.org sls= [226] site= 26 +226 None n1-226.plc1.org sls= [227] site= 27 +227 None n1-227.plc1.org sls= [228] site= 28 +228 None n1-228.plc1.org sls= [229] site= 29 +229 None n1-229.plc1.org sls= [230] site= 30 +230 None n1-230.plc1.org sls= [231] site= 31 +231 None n1-231.plc1.org sls= [232] site= 32 +232 None n1-232.plc1.org sls= [233] site= 33 +233 None n1-233.plc1.org sls= [234] site= 34 +234 None n1-234.plc1.org sls= [235] site= 35 +235 None n1-235.plc1.org sls= [236] site= 36 +236 None n1-236.plc1.org sls= [237] site= 37 +237 None n1-237.plc1.org sls= [238] site= 38 +238 None n1-238.plc1.org sls= [239] site= 39 +239 None n1-239.plc1.org sls= [240] site= 40 +240 None n1-240.plc1.org sls= [241] site= 41 +241 None n1-241.plc1.org sls= [242] site= 42 +242 None n1-242.plc1.org sls= [243] site= 43 +243 None n1-243.plc1.org sls= [244] site= 44 +244 None n1-244.plc1.org sls= [245] site= 45 +245 None n1-245.plc1.org sls= [246] site= 46 +246 None n1-246.plc1.org sls= [247] site= 47 +247 None n1-247.plc1.org sls= [248] site= 48 +248 None n1-248.plc1.org sls= [249] site= 49 +249 None n1-249.plc1.org sls= [250] site= 50 +250 None n1-250.plc1.org sls= [251] site= 51 +251 None n1-251.plc1.org sls= [252] site= 52 +252 None n1-252.plc1.org sls= [253] site= 53 +253 None n1-253.plc1.org sls= [254] site= 54 +254 None n1-254.plc1.org sls= [255] site= 55 +255 None n1-255.plc1.org sls= [256] site= 56 +256 None n1-256.plc1.org sls= [257] site= 57 +257 None n1-257.plc1.org sls= [258] site= 58 +258 None n1-258.plc1.org sls= [259] site= 59 +259 None n1-259.plc1.org sls= [260] site= 60 +260 None n1-260.plc1.org sls= [261] site= 61 +261 None n1-261.plc1.org sls= [262] site= 62 +262 None n1-262.plc1.org sls= [263] site= 63 +263 None n1-263.plc1.org sls= [264] site= 64 +264 None n1-264.plc1.org sls= [265] site= 65 +265 None n1-265.plc1.org sls= [266] site= 66 +266 None n1-266.plc1.org sls= [267] site= 67 +267 None n1-267.plc1.org sls= [268] site= 68 +268 None n1-268.plc1.org sls= [269] site= 69 +269 None n1-269.plc1.org sls= [270] site= 70 +270 None n1-270.plc1.org sls= [271] site= 71 +271 None n1-271.plc1.org sls= [272] site= 72 +272 None n1-272.plc1.org sls= [273] site= 73 +273 None n1-273.plc1.org sls= [274] site= 74 +274 None n1-274.plc1.org sls= [275] site= 75 +275 None n1-275.plc1.org sls= [276] site= 76 +276 None n1-276.plc1.org sls= [277] site= 77 +277 None n1-277.plc1.org sls= [278] site= 78 +278 None n1-278.plc1.org sls= [279] site= 79 +279 None n1-279.plc1.org sls= [280] site= 80 +280 None n1-280.plc1.org sls= [281] site= 81 +281 None n1-281.plc1.org sls= [282] site= 82 +282 None n1-282.plc1.org sls= [283] site= 83 +283 None n1-283.plc1.org sls= [284] site= 84 +284 None n1-284.plc1.org sls= [285] site= 85 +285 None n1-285.plc1.org sls= [286] site= 86 +286 None n1-286.plc1.org sls= [287] site= 87 +287 None n1-287.plc1.org sls= [288] site= 88 +288 None n1-288.plc1.org sls= [289] site= 89 +289 None n1-289.plc1.org sls= [290] site= 90 +290 None n1-290.plc1.org sls= [291] site= 91 +291 None n1-291.plc1.org sls= [292] site= 92 +292 None n1-292.plc1.org sls= [293] site= 93 +293 None n1-293.plc1.org sls= [294] site= 94 +294 None n1-294.plc1.org sls= [295] site= 95 +295 None n1-295.plc1.org sls= [296] site= 96 +296 None n1-296.plc1.org sls= [297] site= 97 +297 None n1-297.plc1.org sls= [298] site= 98 +298 None n1-298.plc1.org sls= [299] site= 99 +299 None n1-299.plc1.org sls= [300] site= 100 +300 None n1-300.plc1.org sls= [301] site= 101 +301 None n1-301.plc1.org sls= [302] site= 102 +302 None n1-302.plc1.org sls= [303] site= 103 +303 None n1-303.plc1.org sls= [304] site= 104 +304 None n1-304.plc1.org sls= [305] site= 105 +305 None n1-305.plc1.org sls= [306] site= 106 +306 None n1-306.plc1.org sls= [307] site= 107 +307 None n1-307.plc1.org sls= [308] site= 108 +308 None n1-308.plc1.org sls= [309] site= 109 +309 None n1-309.plc1.org sls= [310] site= 110 +310 None n1-310.plc1.org sls= [311] site= 111 +311 None n1-311.plc1.org sls= [312] site= 112 +312 None n1-312.plc1.org sls= [313] site= 113 +313 None n1-313.plc1.org sls= [314] site= 114 +314 None n1-314.plc1.org sls= [315] site= 115 +315 None n1-315.plc1.org sls= [316] site= 116 +316 None n1-316.plc1.org sls= [317] site= 117 +317 None n1-317.plc1.org sls= [318] site= 118 +318 None n1-318.plc1.org sls= [319] site= 119 +319 None n1-319.plc1.org sls= [320] site= 120 +320 None n1-320.plc1.org sls= [321] site= 121 +321 None n1-321.plc1.org sls= [322] site= 122 +322 None n1-322.plc1.org sls= [323] site= 123 +323 None n1-323.plc1.org sls= [324] site= 124 +324 None n1-324.plc1.org sls= [325] site= 125 +325 None n1-325.plc1.org sls= [326] site= 126 +326 None n1-326.plc1.org sls= [327] site= 127 +327 None n1-327.plc1.org sls= [328] site= 128 +328 None n1-328.plc1.org sls= [329] site= 129 +329 None n1-329.plc1.org sls= [330] site= 130 +330 None n1-330.plc1.org sls= [331] site= 131 +331 None n1-331.plc1.org sls= [332] site= 132 +332 None n1-332.plc1.org sls= [333] site= 133 +333 None n1-333.plc1.org sls= [334] site= 134 +334 None n1-334.plc1.org sls= [335] site= 135 +335 None n1-335.plc1.org sls= [336] site= 136 +336 None n1-336.plc1.org sls= [337] site= 137 +337 None n1-337.plc1.org sls= [338] site= 138 +338 None n1-338.plc1.org sls= [339] site= 139 +339 None n1-339.plc1.org sls= [340] site= 140 +340 None n1-340.plc1.org sls= [341] site= 141 +341 None n1-341.plc1.org sls= [342] site= 142 +342 None n1-342.plc1.org sls= [343] site= 143 +343 None n1-343.plc1.org sls= [344] site= 144 +344 None n1-344.plc1.org sls= [345] site= 145 +345 None n1-345.plc1.org sls= [346] site= 146 +346 None n1-346.plc1.org sls= [347] site= 147 +347 None n1-347.plc1.org sls= [348] site= 148 +348 None n1-348.plc1.org sls= [349] site= 149 +349 None n1-349.plc1.org sls= [350] site= 150 +350 None n1-350.plc1.org sls= [351] site= 151 +351 1 n2-001.plc2.org sls= [352, 2] site= 203 +352 1 n2-002.plc2.org sls= [353, 3] site= 204 +353 1 n2-003.plc2.org sls= [354, 4] site= 205 +354 1 n2-004.plc2.org sls= [355, 5] site= 206 +355 1 n2-005.plc2.org sls= [356, 6] site= 207 +356 1 n2-006.plc2.org sls= [357, 7] site= 208 +357 1 n2-007.plc2.org sls= [358, 8] site= 209 +358 1 n2-008.plc2.org sls= [359, 9] site= 210 +359 1 n2-009.plc2.org sls= [360, 10] site= 211 +360 1 n2-010.plc2.org sls= [361, 11] site= 212 +361 1 n2-011.plc2.org sls= [362, 12] site= 213 +362 1 n2-012.plc2.org sls= [363, 13] site= 214 +363 1 n2-013.plc2.org sls= [364, 14] site= 215 +364 1 n2-014.plc2.org sls= [365, 15] site= 216 +365 1 n2-015.plc2.org sls= [366, 16] site= 217 +366 1 n2-016.plc2.org sls= [367, 17] site= 218 +367 1 n2-017.plc2.org sls= [368, 18] site= 219 +368 1 n2-018.plc2.org sls= [369, 19] site= 220 +369 1 n2-019.plc2.org sls= [370, 20] site= 221 +370 1 n2-020.plc2.org sls= [371, 21] site= 222 +371 1 n2-021.plc2.org sls= [372, 22] site= 223 +372 1 n2-022.plc2.org sls= [373, 23] site= 224 +373 1 n2-023.plc2.org sls= [374, 24] site= 225 +374 1 n2-024.plc2.org sls= [375, 25] site= 226 +375 1 n2-025.plc2.org sls= [376, 26] site= 227 +376 1 n2-026.plc2.org sls= [377, 27] site= 228 +377 1 n2-027.plc2.org sls= [378, 28] site= 229 +378 1 n2-028.plc2.org sls= [379, 29] site= 230 +379 1 n2-029.plc2.org sls= [380, 30] site= 231 +380 1 n2-030.plc2.org sls= [381, 31] site= 232 +381 1 n2-031.plc2.org sls= [382, 32] site= 233 +382 1 n2-032.plc2.org sls= [383, 33] site= 234 +383 1 n2-033.plc2.org sls= [384, 34] site= 235 +384 1 n2-034.plc2.org sls= [385, 35] site= 236 +385 1 n2-035.plc2.org sls= [386, 36] site= 237 +386 1 n2-036.plc2.org sls= [387, 37] site= 238 +387 1 n2-037.plc2.org sls= [388, 38] site= 239 +388 1 n2-038.plc2.org sls= [389, 39] site= 240 +389 1 n2-039.plc2.org sls= [390, 40] site= 241 +390 1 n2-040.plc2.org sls= [391, 41] site= 242 +391 1 n2-041.plc2.org sls= [392, 42] site= 243 +392 1 n2-042.plc2.org sls= [393, 43] site= 244 +393 1 n2-043.plc2.org sls= [394, 44] site= 245 +394 1 n2-044.plc2.org sls= [395, 45] site= 246 +395 1 n2-045.plc2.org sls= [396, 46] site= 247 +396 1 n2-046.plc2.org sls= [397, 47] site= 248 +397 1 n2-047.plc2.org sls= [398, 48] site= 249 +398 1 n2-048.plc2.org sls= [399, 49] site= 250 +399 1 n2-049.plc2.org sls= [400, 50] site= 251 +400 1 n2-050.plc2.org sls= [401, 51] site= 252 +401 1 n2-051.plc2.org sls= [402, 52] site= 253 +402 1 n2-052.plc2.org sls= [403, 53] site= 254 +403 1 n2-053.plc2.org sls= [404, 54] site= 255 +404 1 n2-054.plc2.org sls= [405, 55] site= 256 +405 1 n2-055.plc2.org sls= [406, 56] site= 257 +406 1 n2-056.plc2.org sls= [407, 57] site= 258 +407 1 n2-057.plc2.org sls= [408, 58] site= 259 +408 1 n2-058.plc2.org sls= [409, 59] site= 260 +409 1 n2-059.plc2.org sls= [410, 60] site= 261 +410 1 n2-060.plc2.org sls= [411, 61] site= 262 +411 1 n2-061.plc2.org sls= [412, 62] site= 263 +412 1 n2-062.plc2.org sls= [413, 63] site= 264 +413 1 n2-063.plc2.org sls= [414, 64] site= 265 +414 1 n2-064.plc2.org sls= [415, 65] site= 266 +415 1 n2-065.plc2.org sls= [416, 66] site= 267 +416 1 n2-066.plc2.org sls= [417, 67] site= 268 +417 1 n2-067.plc2.org sls= [418, 68] site= 269 +418 1 n2-068.plc2.org sls= [419, 69] site= 270 +419 1 n2-069.plc2.org sls= [420, 70] site= 271 +420 1 n2-070.plc2.org sls= [421, 71] site= 272 +421 1 n2-071.plc2.org sls= [422, 72] site= 273 +422 1 n2-072.plc2.org sls= [423, 73] site= 274 +423 1 n2-073.plc2.org sls= [424, 74] site= 275 +424 1 n2-074.plc2.org sls= [425, 75] site= 276 +425 1 n2-075.plc2.org sls= [426, 76] site= 277 +426 1 n2-076.plc2.org sls= [427, 77] site= 278 +427 1 n2-077.plc2.org sls= [428, 78] site= 279 +428 1 n2-078.plc2.org sls= [429, 79] site= 280 +429 1 n2-079.plc2.org sls= [430, 80] site= 281 +430 1 n2-080.plc2.org sls= [431, 81] site= 282 +431 1 n2-081.plc2.org sls= [432, 82] site= 283 +432 1 n2-082.plc2.org sls= [433, 83] site= 284 +433 1 n2-083.plc2.org sls= [434, 84] site= 285 +434 1 n2-084.plc2.org sls= [435, 85] site= 286 +435 1 n2-085.plc2.org sls= [436, 86] site= 287 +436 1 n2-086.plc2.org sls= [437, 87] site= 288 +437 1 n2-087.plc2.org sls= [438, 88] site= 289 +438 1 n2-088.plc2.org sls= [439, 89] site= 290 +439 1 n2-089.plc2.org sls= [440, 90] site= 291 +440 1 n2-090.plc2.org sls= [441, 91] site= 292 +441 1 n2-091.plc2.org sls= [442, 92] site= 293 +442 1 n2-092.plc2.org sls= [443, 93] site= 294 +443 1 n2-093.plc2.org sls= [444, 94] site= 295 +444 1 n2-094.plc2.org sls= [445, 95] site= 296 +445 1 n2-095.plc2.org sls= [446, 96] site= 297 +446 1 n2-096.plc2.org sls= [447, 97] site= 298 +447 1 n2-097.plc2.org sls= [448, 98] site= 299 +448 1 n2-098.plc2.org sls= [449, 99] site= 300 +449 1 n2-099.plc2.org sls= [450, 100] site= 301 +450 1 n2-100.plc2.org sls= [451, 101] site= 302 +451 1 n2-101.plc2.org sls= [452, 102] site= 303 +452 1 n2-102.plc2.org sls= [453, 103] site= 304 +453 1 n2-103.plc2.org sls= [454, 104] site= 305 +454 1 n2-104.plc2.org sls= [455, 105] site= 306 +455 1 n2-105.plc2.org sls= [456, 106] site= 307 +456 1 n2-106.plc2.org sls= [457, 107] site= 308 +457 1 n2-107.plc2.org sls= [458, 108] site= 309 +458 1 n2-108.plc2.org sls= [459, 109] site= 310 +459 1 n2-109.plc2.org sls= [460, 110] site= 311 +460 1 n2-110.plc2.org sls= [461, 111] site= 312 +461 1 n2-111.plc2.org sls= [462, 112] site= 313 +462 1 n2-112.plc2.org sls= [463, 113] site= 314 +463 1 n2-113.plc2.org sls= [464, 114] site= 315 +464 1 n2-114.plc2.org sls= [465, 115] site= 316 +465 1 n2-115.plc2.org sls= [466, 116] site= 317 +466 1 n2-116.plc2.org sls= [467, 117] site= 318 +467 1 n2-117.plc2.org sls= [468, 118] site= 319 +468 1 n2-118.plc2.org sls= [469, 119] site= 320 +469 1 n2-119.plc2.org sls= [470, 120] site= 321 +470 1 n2-120.plc2.org sls= [471, 121] site= 322 +471 1 n2-121.plc2.org sls= [472, 122] site= 323 +472 1 n2-122.plc2.org sls= [473, 123] site= 324 +473 1 n2-123.plc2.org sls= [474, 124] site= 325 +474 1 n2-124.plc2.org sls= [475, 125] site= 326 +475 1 n2-125.plc2.org sls= [476, 126] site= 327 +476 1 n2-126.plc2.org sls= [477, 127] site= 328 +477 1 n2-127.plc2.org sls= [478, 128] site= 329 +478 1 n2-128.plc2.org sls= [479, 129] site= 330 +479 1 n2-129.plc2.org sls= [480, 130] site= 331 +480 1 n2-130.plc2.org sls= [481, 131] site= 332 +481 1 n2-131.plc2.org sls= [482, 132] site= 333 +482 1 n2-132.plc2.org sls= [483, 133] site= 334 +483 1 n2-133.plc2.org sls= [484, 134] site= 335 +484 1 n2-134.plc2.org sls= [485, 135] site= 336 +485 1 n2-135.plc2.org sls= [486, 136] site= 337 +486 1 n2-136.plc2.org sls= [487, 137] site= 338 +487 1 n2-137.plc2.org sls= [488, 138] site= 339 +488 1 n2-138.plc2.org sls= [489, 139] site= 340 +489 1 n2-139.plc2.org sls= [490, 140] site= 341 +490 1 n2-140.plc2.org sls= [491, 141] site= 342 +491 1 n2-141.plc2.org sls= [492, 142] site= 343 +492 1 n2-142.plc2.org sls= [493, 143] site= 344 +493 1 n2-143.plc2.org sls= [494, 144] site= 345 +494 1 n2-144.plc2.org sls= [495, 145] site= 346 +495 1 n2-145.plc2.org sls= [496, 146] site= 347 +496 1 n2-146.plc2.org sls= [497, 147] site= 348 +497 1 n2-147.plc2.org sls= [498, 148] site= 349 +498 1 n2-148.plc2.org sls= [499, 149] site= 350 +499 1 n2-149.plc2.org sls= [500, 150] site= 351 +500 1 n2-150.plc2.org sls= [501, 151] site= 352 +501 1 n2-151.plc2.org sls= [152] site= 353 +502 1 n2-152.plc2.org sls= [153] site= 354 +503 1 n2-153.plc2.org sls= [154] site= 355 +504 1 n2-154.plc2.org sls= [155] site= 356 +505 1 n2-155.plc2.org sls= [156] site= 357 +506 1 n2-156.plc2.org sls= [157] site= 358 +507 1 n2-157.plc2.org sls= [158] site= 359 +508 1 n2-158.plc2.org sls= [159] site= 360 +509 1 n2-159.plc2.org sls= [160] site= 361 +510 1 n2-160.plc2.org sls= [161] site= 362 +511 1 n2-161.plc2.org sls= [162] site= 363 +512 1 n2-162.plc2.org sls= [163] site= 364 +513 1 n2-163.plc2.org sls= [164] site= 365 +514 1 n2-164.plc2.org sls= [165] site= 366 +515 1 n2-165.plc2.org sls= [166] site= 367 +516 1 n2-166.plc2.org sls= [167] site= 368 +517 1 n2-167.plc2.org sls= [168] site= 369 +518 1 n2-168.plc2.org sls= [169] site= 370 +519 1 n2-169.plc2.org sls= [170] site= 371 +520 1 n2-170.plc2.org sls= [171] site= 372 +521 1 n2-171.plc2.org sls= [172] site= 373 +522 1 n2-172.plc2.org sls= [173] site= 374 +523 1 n2-173.plc2.org sls= [174] site= 375 +524 1 n2-174.plc2.org sls= [175] site= 376 +525 1 n2-175.plc2.org sls= [176] site= 377 +526 1 n2-176.plc2.org sls= [177] site= 378 +527 1 n2-177.plc2.org sls= [178] site= 379 +528 1 n2-178.plc2.org sls= [179] site= 380 +529 1 n2-179.plc2.org sls= [180] site= 381 +530 1 n2-180.plc2.org sls= [181] site= 382 +531 1 n2-181.plc2.org sls= [182] site= 383 +532 1 n2-182.plc2.org sls= [183] site= 384 +533 1 n2-183.plc2.org sls= [184] site= 385 +534 1 n2-184.plc2.org sls= [185] site= 386 +535 1 n2-185.plc2.org sls= [186] site= 387 +536 1 n2-186.plc2.org sls= [187] site= 388 +537 1 n2-187.plc2.org sls= [188] site= 389 +538 1 n2-188.plc2.org sls= [189] site= 390 +539 1 n2-189.plc2.org sls= [190] site= 391 +540 1 n2-190.plc2.org sls= [191] site= 392 +541 1 n2-191.plc2.org sls= [192] site= 393 +542 1 n2-192.plc2.org sls= [193] site= 394 +543 1 n2-193.plc2.org sls= [194] site= 395 +544 1 n2-194.plc2.org sls= [195] site= 396 +545 1 n2-195.plc2.org sls= [196] site= 397 +546 1 n2-196.plc2.org sls= [197] site= 398 +547 1 n2-197.plc2.org sls= [198] site= 399 +548 1 n2-198.plc2.org sls= [199] site= 400 +549 1 n2-199.plc2.org sls= [200] site= 401 +550 1 n2-200.plc2.org sls= [201] site= 402 +551 1 n2-201.plc2.org sls= [202] site= 203 +552 1 n2-202.plc2.org sls= [203] site= 204 +553 1 n2-203.plc2.org sls= [204] site= 205 +554 1 n2-204.plc2.org sls= [205] site= 206 +555 1 n2-205.plc2.org sls= [206] site= 207 +556 1 n2-206.plc2.org sls= [207] site= 208 +557 1 n2-207.plc2.org sls= [208] site= 209 +558 1 n2-208.plc2.org sls= [209] site= 210 +559 1 n2-209.plc2.org sls= [210] site= 211 +560 1 n2-210.plc2.org sls= [211] site= 212 +561 1 n2-211.plc2.org sls= [212] site= 213 +562 1 n2-212.plc2.org sls= [213] site= 214 +563 1 n2-213.plc2.org sls= [214] site= 215 +564 1 n2-214.plc2.org sls= [215] site= 216 +565 1 n2-215.plc2.org sls= [216] site= 217 +566 1 n2-216.plc2.org sls= [217] site= 218 +567 1 n2-217.plc2.org sls= [218] site= 219 +568 1 n2-218.plc2.org sls= [219] site= 220 +569 1 n2-219.plc2.org sls= [220] site= 221 +570 1 n2-220.plc2.org sls= [221] site= 222 +571 1 n2-221.plc2.org sls= [222] site= 223 +572 1 n2-222.plc2.org sls= [223] site= 224 +573 1 n2-223.plc2.org sls= [224] site= 225 +574 1 n2-224.plc2.org sls= [225] site= 226 +575 1 n2-225.plc2.org sls= [226] site= 227 +576 1 n2-226.plc2.org sls= [227] site= 228 +577 1 n2-227.plc2.org sls= [228] site= 229 +578 1 n2-228.plc2.org sls= [229] site= 230 +579 1 n2-229.plc2.org sls= [230] site= 231 +580 1 n2-230.plc2.org sls= [231] site= 232 +581 1 n2-231.plc2.org sls= [232] site= 233 +582 1 n2-232.plc2.org sls= [233] site= 234 +583 1 n2-233.plc2.org sls= [234] site= 235 +584 1 n2-234.plc2.org sls= [235] site= 236 +585 1 n2-235.plc2.org sls= [236] site= 237 +586 1 n2-236.plc2.org sls= [237] site= 238 +587 1 n2-237.plc2.org sls= [238] site= 239 +588 1 n2-238.plc2.org sls= [239] site= 240 +589 1 n2-239.plc2.org sls= [240] site= 241 +590 1 n2-240.plc2.org sls= [241] site= 242 +591 1 n2-241.plc2.org sls= [242] site= 243 +592 1 n2-242.plc2.org sls= [243] site= 244 +593 1 n2-243.plc2.org sls= [244] site= 245 +594 1 n2-244.plc2.org sls= [245] site= 246 +595 1 n2-245.plc2.org sls= [246] site= 247 +596 1 n2-246.plc2.org sls= [247] site= 248 +597 1 n2-247.plc2.org sls= [248] site= 249 +598 1 n2-248.plc2.org sls= [249] site= 250 +599 1 n2-249.plc2.org sls= [250] site= 251 +600 1 n2-250.plc2.org sls= [251] site= 252 +601 1 n2-251.plc2.org sls= [252] site= 253 +602 1 n2-252.plc2.org sls= [253] site= 254 +603 1 n2-253.plc2.org sls= [254] site= 255 +604 1 n2-254.plc2.org sls= [255] site= 256 +605 1 n2-255.plc2.org sls= [256] site= 257 +606 1 n2-256.plc2.org sls= [257] site= 258 +607 1 n2-257.plc2.org sls= [258] site= 259 +608 1 n2-258.plc2.org sls= [259] site= 260 +609 1 n2-259.plc2.org sls= [260] site= 261 +610 1 n2-260.plc2.org sls= [261] site= 262 +611 1 n2-261.plc2.org sls= [262] site= 263 +612 1 n2-262.plc2.org sls= [263] site= 264 +613 1 n2-263.plc2.org sls= [264] site= 265 +614 1 n2-264.plc2.org sls= [265] site= 266 +615 1 n2-265.plc2.org sls= [266] site= 267 +616 1 n2-266.plc2.org sls= [267] site= 268 +617 1 n2-267.plc2.org sls= [268] site= 269 +618 1 n2-268.plc2.org sls= [269] site= 270 +619 1 n2-269.plc2.org sls= [270] site= 271 +620 1 n2-270.plc2.org sls= [271] site= 272 +621 1 n2-271.plc2.org sls= [272] site= 273 +622 1 n2-272.plc2.org sls= [273] site= 274 +623 1 n2-273.plc2.org sls= [274] site= 275 +624 1 n2-274.plc2.org sls= [275] site= 276 +625 1 n2-275.plc2.org sls= [276] site= 277 +626 1 n2-276.plc2.org sls= [277] site= 278 +627 1 n2-277.plc2.org sls= [278] site= 279 +628 1 n2-278.plc2.org sls= [279] site= 280 +629 1 n2-279.plc2.org sls= [280] site= 281 +630 1 n2-280.plc2.org sls= [281] site= 282 +631 1 n2-281.plc2.org sls= [282] site= 283 +632 1 n2-282.plc2.org sls= [283] site= 284 +633 1 n2-283.plc2.org sls= [284] site= 285 +634 1 n2-284.plc2.org sls= [285] site= 286 +635 1 n2-285.plc2.org sls= [286] site= 287 +636 1 n2-286.plc2.org sls= [287] site= 288 +637 1 n2-287.plc2.org sls= [288] site= 289 +638 1 n2-288.plc2.org sls= [289] site= 290 +639 1 n2-289.plc2.org sls= [290] site= 291 +640 1 n2-290.plc2.org sls= [291] site= 292 +641 1 n2-291.plc2.org sls= [292] site= 293 +642 1 n2-292.plc2.org sls= [293] site= 294 +643 1 n2-293.plc2.org sls= [294] site= 295 +644 1 n2-294.plc2.org sls= [295] site= 296 +645 1 n2-295.plc2.org sls= [296] site= 297 +646 1 n2-296.plc2.org sls= [297] site= 298 +647 1 n2-297.plc2.org sls= [298] site= 299 +648 1 n2-298.plc2.org sls= [299] site= 300 +649 1 n2-299.plc2.org sls= [300] site= 301 +650 1 n2-300.plc2.org sls= [301] site= 302 +651 1 n2-301.plc2.org sls= [302] site= 303 +652 1 n2-302.plc2.org sls= [303] site= 304 +653 1 n2-303.plc2.org sls= [304] site= 305 +654 1 n2-304.plc2.org sls= [305] site= 306 +655 1 n2-305.plc2.org sls= [306] site= 307 +656 1 n2-306.plc2.org sls= [307] site= 308 +657 1 n2-307.plc2.org sls= [308] site= 309 +658 1 n2-308.plc2.org sls= [309] site= 310 +659 1 n2-309.plc2.org sls= [310] site= 311 +660 1 n2-310.plc2.org sls= [311] site= 312 +661 1 n2-311.plc2.org sls= [312] site= 313 +662 1 n2-312.plc2.org sls= [313] site= 314 +663 1 n2-313.plc2.org sls= [314] site= 315 +664 1 n2-314.plc2.org sls= [315] site= 316 +665 1 n2-315.plc2.org sls= [316] site= 317 +666 1 n2-316.plc2.org sls= [317] site= 318 +667 1 n2-317.plc2.org sls= [318] site= 319 +668 1 n2-318.plc2.org sls= [319] site= 320 +669 1 n2-319.plc2.org sls= [320] site= 321 +670 1 n2-320.plc2.org sls= [321] site= 322 +671 1 n2-321.plc2.org sls= [322] site= 323 +672 1 n2-322.plc2.org sls= [323] site= 324 +673 1 n2-323.plc2.org sls= [324] site= 325 +674 1 n2-324.plc2.org sls= [325] site= 326 +675 1 n2-325.plc2.org sls= [326] site= 327 +676 1 n2-326.plc2.org sls= [327] site= 328 +677 1 n2-327.plc2.org sls= [328] site= 329 +678 1 n2-328.plc2.org sls= [329] site= 330 +679 1 n2-329.plc2.org sls= [330] site= 331 +680 1 n2-330.plc2.org sls= [331] site= 332 +681 1 n2-331.plc2.org sls= [332] site= 333 +682 1 n2-332.plc2.org sls= [333] site= 334 +683 1 n2-333.plc2.org sls= [334] site= 335 +684 1 n2-334.plc2.org sls= [335] site= 336 +685 1 n2-335.plc2.org sls= [336] site= 337 +686 1 n2-336.plc2.org sls= [337] site= 338 +687 1 n2-337.plc2.org sls= [338] site= 339 +688 1 n2-338.plc2.org sls= [339] site= 340 +689 1 n2-339.plc2.org sls= [340] site= 341 +690 1 n2-340.plc2.org sls= [341] site= 342 +691 1 n2-341.plc2.org sls= [342] site= 343 +692 1 n2-342.plc2.org sls= [343] site= 344 +693 1 n2-343.plc2.org sls= [344] site= 345 +694 1 n2-344.plc2.org sls= [345] site= 346 +695 1 n2-345.plc2.org sls= [346] site= 347 +696 1 n2-346.plc2.org sls= [347] site= 348 +697 1 n2-347.plc2.org sls= [348] site= 349 +698 1 n2-348.plc2.org sls= [349] site= 350 +699 1 n2-349.plc2.org sls= [350] site= 351 +700 1 n2-350.plc2.org sls= [351] site= 352 +01: SLICES +name: plc1_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183553992 +name: oneb_slice1 id: 02 peer: None nodes= [351, 1] persons= [6, 5, 4] +--- sa_ids= [6, 7, 8, 9] creator: 1 +--- 'expires': 1183554314 +name: onec_slice2 id: 03 peer: None nodes= [352, 2] persons= [7, 6, 5] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554314 +name: oned_slice3 id: 04 peer: None nodes= [353, 3] persons= [8, 7, 6] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554314 +name: onee_slice4 id: 05 peer: None nodes= [354, 4] persons= [9, 8, 7] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554314 +name: onef_slice5 id: 06 peer: None nodes= [355, 5] persons= [10, 9, 8] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554314 +name: oneg_slice6 id: 07 peer: None nodes= [356, 6] persons= [11, 10, 9] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: oneh_slice7 id: 08 peer: None nodes= [357, 7] persons= [12, 11, 10] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: onei_slice8 id: 09 peer: None nodes= [358, 8] persons= [13, 12, 11] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: onej_slice9 id: 10 peer: None nodes= [359, 9] persons= [14, 13, 12] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: oneba_slice10 id: 11 peer: None nodes= [360, 10] persons= [15, 14, 13] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: onebb_slice11 id: 12 peer: None nodes= [361, 11] persons= [16, 15, 14] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: onebc_slice12 id: 13 peer: None nodes= [362, 12] persons= [17, 16, 15] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: onebd_slice13 id: 14 peer: None nodes= [363, 13] persons= [18, 17, 16] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: onebe_slice14 id: 15 peer: None nodes= [364, 14] persons= [19, 18, 17] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554315 +name: onebf_slice15 id: 16 peer: None nodes= [365, 15] persons= [20, 19, 18] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onebg_slice16 id: 17 peer: None nodes= [366, 16] persons= [21, 20, 19] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onebh_slice17 id: 18 peer: None nodes= [367, 17] persons= [22, 21, 20] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onebi_slice18 id: 19 peer: None nodes= [368, 18] persons= [23, 22, 21] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onebj_slice19 id: 20 peer: None nodes= [369, 19] persons= [24, 23, 22] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: oneca_slice20 id: 21 peer: None nodes= [370, 20] persons= [25, 24, 23] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onecb_slice21 id: 22 peer: None nodes= [371, 21] persons= [26, 25, 24] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onecc_slice22 id: 23 peer: None nodes= [372, 22] persons= [27, 26, 25] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onecd_slice23 id: 24 peer: None nodes= [373, 23] persons= [28, 27, 26] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554316 +name: onece_slice24 id: 25 peer: None nodes= [374, 24] persons= [29, 28, 27] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: onecf_slice25 id: 26 peer: None nodes= [375, 25] persons= [30, 29, 28] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: onecg_slice26 id: 27 peer: None nodes= [376, 26] persons= [31, 30, 29] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: onech_slice27 id: 28 peer: None nodes= [377, 27] persons= [32, 31, 30] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: oneci_slice28 id: 29 peer: None nodes= [378, 28] persons= [33, 32, 31] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: onecj_slice29 id: 30 peer: None nodes= [379, 29] persons= [34, 33, 32] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: oneda_slice30 id: 31 peer: None nodes= [380, 30] persons= [35, 34, 33] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: onedb_slice31 id: 32 peer: None nodes= [381, 31] persons= [36, 35, 34] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554317 +name: onedc_slice32 id: 33 peer: None nodes= [382, 32] persons= [37, 36, 35] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: onedd_slice33 id: 34 peer: None nodes= [383, 33] persons= [38, 37, 36] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: onede_slice34 id: 35 peer: None nodes= [384, 34] persons= [39, 38, 37] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: onedf_slice35 id: 36 peer: None nodes= [385, 35] persons= [40, 39, 38] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: onedg_slice36 id: 37 peer: None nodes= [386, 36] persons= [41, 40, 39] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: onedh_slice37 id: 38 peer: None nodes= [387, 37] persons= [42, 41, 40] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: onedi_slice38 id: 39 peer: None nodes= [388, 38] persons= [43, 42, 41] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: onedj_slice39 id: 40 peer: None nodes= [389, 39] persons= [44, 43, 42] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: oneea_slice40 id: 41 peer: None nodes= [390, 40] persons= [45, 44, 43] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554318 +name: oneeb_slice41 id: 42 peer: None nodes= [391, 41] persons= [46, 45, 44] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneec_slice42 id: 43 peer: None nodes= [392, 42] persons= [47, 46, 45] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneed_slice43 id: 44 peer: None nodes= [393, 43] persons= [48, 47, 46] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneee_slice44 id: 45 peer: None nodes= [394, 44] persons= [49, 48, 47] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneef_slice45 id: 46 peer: None nodes= [395, 45] persons= [50, 49, 48] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneeg_slice46 id: 47 peer: None nodes= [396, 46] persons= [51, 50, 49] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneeh_slice47 id: 48 peer: None nodes= [397, 47] persons= [52, 51, 50] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneei_slice48 id: 49 peer: None nodes= [398, 48] persons= [53, 52, 51] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: oneej_slice49 id: 50 peer: None nodes= [399, 49] persons= [54, 53, 52] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554319 +name: onefa_slice50 id: 51 peer: None nodes= [400, 50] persons= [55, 54, 53] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: onefb_slice51 id: 52 peer: None nodes= [401, 51] persons= [56, 55, 54] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: onefc_slice52 id: 53 peer: None nodes= [402, 52] persons= [57, 56, 55] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: onefd_slice53 id: 54 peer: None nodes= [403, 53] persons= [58, 57, 56] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: onefe_slice54 id: 55 peer: None nodes= [404, 54] persons= [59, 58, 57] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: oneff_slice55 id: 56 peer: None nodes= [405, 55] persons= [60, 59, 58] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: onefg_slice56 id: 57 peer: None nodes= [406, 56] persons= [61, 60, 59] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: onefh_slice57 id: 58 peer: None nodes= [407, 57] persons= [62, 61, 60] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554320 +name: onefi_slice58 id: 59 peer: None nodes= [408, 58] persons= [63, 62, 61] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onefj_slice59 id: 60 peer: None nodes= [409, 59] persons= [64, 63, 62] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onega_slice60 id: 61 peer: None nodes= [410, 60] persons= [65, 64, 63] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onegb_slice61 id: 62 peer: None nodes= [411, 61] persons= [66, 65, 64] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onegc_slice62 id: 63 peer: None nodes= [412, 62] persons= [67, 66, 65] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onegd_slice63 id: 64 peer: None nodes= [413, 63] persons= [68, 67, 66] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onege_slice64 id: 65 peer: None nodes= [414, 64] persons= [69, 68, 67] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onegf_slice65 id: 66 peer: None nodes= [415, 65] persons= [70, 69, 68] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onegg_slice66 id: 67 peer: None nodes= [416, 66] persons= [71, 70, 69] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554321 +name: onegh_slice67 id: 68 peer: None nodes= [417, 67] persons= [72, 71, 70] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: onegi_slice68 id: 69 peer: None nodes= [418, 68] persons= [73, 72, 71] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: onegj_slice69 id: 70 peer: None nodes= [419, 69] persons= [74, 73, 72] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: oneha_slice70 id: 71 peer: None nodes= [420, 70] persons= [75, 74, 73] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: onehb_slice71 id: 72 peer: None nodes= [421, 71] persons= [76, 75, 74] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: onehc_slice72 id: 73 peer: None nodes= [422, 72] persons= [77, 76, 75] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: onehd_slice73 id: 74 peer: None nodes= [423, 73] persons= [78, 77, 76] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: onehe_slice74 id: 75 peer: None nodes= [424, 74] persons= [79, 78, 77] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554322 +name: onehf_slice75 id: 76 peer: None nodes= [425, 75] persons= [80, 79, 78] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: onehg_slice76 id: 77 peer: None nodes= [426, 76] persons= [81, 80, 79] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: onehh_slice77 id: 78 peer: None nodes= [427, 77] persons= [82, 81, 80] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: onehi_slice78 id: 79 peer: None nodes= [428, 78] persons= [83, 82, 81] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: onehj_slice79 id: 80 peer: None nodes= [429, 79] persons= [84, 83, 82] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: oneia_slice80 id: 81 peer: None nodes= [430, 80] persons= [85, 84, 83] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: oneib_slice81 id: 82 peer: None nodes= [431, 81] persons= [86, 85, 84] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: oneic_slice82 id: 83 peer: None nodes= [432, 82] persons= [87, 86, 85] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554323 +name: oneid_slice83 id: 84 peer: None nodes= [433, 83] persons= [88, 87, 86] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: oneie_slice84 id: 85 peer: None nodes= [434, 84] persons= [89, 88, 87] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: oneif_slice85 id: 86 peer: None nodes= [435, 85] persons= [90, 89, 88] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: oneig_slice86 id: 87 peer: None nodes= [436, 86] persons= [91, 90, 89] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: oneih_slice87 id: 88 peer: None nodes= [437, 87] persons= [92, 91, 90] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: oneii_slice88 id: 89 peer: None nodes= [438, 88] persons= [93, 92, 91] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: oneij_slice89 id: 90 peer: None nodes= [439, 89] persons= [94, 93, 92] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: oneja_slice90 id: 91 peer: None nodes= [440, 90] persons= [95, 94, 93] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: onejb_slice91 id: 92 peer: None nodes= [441, 91] persons= [96, 95, 94] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554324 +name: onejc_slice92 id: 93 peer: None nodes= [442, 92] persons= [97, 96, 95] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: onejd_slice93 id: 94 peer: None nodes= [443, 93] persons= [98, 97, 96] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: oneje_slice94 id: 95 peer: None nodes= [444, 94] persons= [99, 98, 97] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: onejf_slice95 id: 96 peer: None nodes= [445, 95] persons= [100, 99, 98] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: onejg_slice96 id: 97 peer: None nodes= [446, 96] persons= [101, 100, 99] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: onejh_slice97 id: 98 peer: None nodes= [447, 97] persons= [102, 101, 100] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: oneji_slice98 id: 99 peer: None nodes= [448, 98] persons= [103, 102, 101] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: onejj_slice99 id: 100 peer: None nodes= [449, 99] persons= [104, 103, 102] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554325 +name: onebaa_slice100 id: 101 peer: None nodes= [450, 100] persons= [105, 104, 103] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebab_slice101 id: 102 peer: None nodes= [451, 101] persons= [106, 105, 104] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebac_slice102 id: 103 peer: None nodes= [452, 102] persons= [107, 106, 105] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebad_slice103 id: 104 peer: None nodes= [453, 103] persons= [108, 107, 106] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebae_slice104 id: 105 peer: None nodes= [454, 104] persons= [109, 108, 107] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebaf_slice105 id: 106 peer: None nodes= [455, 105] persons= [110, 109, 108] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebag_slice106 id: 107 peer: None nodes= [456, 106] persons= [111, 110, 109] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebah_slice107 id: 108 peer: None nodes= [457, 107] persons= [112, 111, 110] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554326 +name: onebai_slice108 id: 109 peer: None nodes= [458, 108] persons= [113, 112, 111] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebaj_slice109 id: 110 peer: None nodes= [459, 109] persons= [114, 113, 112] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebba_slice110 id: 111 peer: None nodes= [460, 110] persons= [115, 114, 113] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebbb_slice111 id: 112 peer: None nodes= [461, 111] persons= [116, 115, 114] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebbc_slice112 id: 113 peer: None nodes= [462, 112] persons= [117, 116, 115] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebbd_slice113 id: 114 peer: None nodes= [463, 113] persons= [118, 117, 116] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebbe_slice114 id: 115 peer: None nodes= [464, 114] persons= [119, 118, 117] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebbf_slice115 id: 116 peer: None nodes= [465, 115] persons= [120, 119, 118] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebbg_slice116 id: 117 peer: None nodes= [466, 116] persons= [121, 120, 119] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554327 +name: onebbh_slice117 id: 118 peer: None nodes= [467, 117] persons= [122, 121, 120] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebbi_slice118 id: 119 peer: None nodes= [468, 118] persons= [123, 122, 121] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebbj_slice119 id: 120 peer: None nodes= [469, 119] persons= [124, 123, 122] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebca_slice120 id: 121 peer: None nodes= [470, 120] persons= [125, 124, 123] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebcb_slice121 id: 122 peer: None nodes= [471, 121] persons= [126, 125, 124] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebcc_slice122 id: 123 peer: None nodes= [472, 122] persons= [127, 126, 125] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebcd_slice123 id: 124 peer: None nodes= [473, 123] persons= [128, 127, 126] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebce_slice124 id: 125 peer: None nodes= [474, 124] persons= [129, 128, 127] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554328 +name: onebcf_slice125 id: 126 peer: None nodes= [475, 125] persons= [130, 129, 128] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebcg_slice126 id: 127 peer: None nodes= [476, 126] persons= [131, 130, 129] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebch_slice127 id: 128 peer: None nodes= [477, 127] persons= [132, 131, 130] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebci_slice128 id: 129 peer: None nodes= [478, 128] persons= [133, 132, 131] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebcj_slice129 id: 130 peer: None nodes= [479, 129] persons= [134, 133, 132] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebda_slice130 id: 131 peer: None nodes= [480, 130] persons= [135, 134, 133] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebdb_slice131 id: 132 peer: None nodes= [481, 131] persons= [136, 135, 134] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebdc_slice132 id: 133 peer: None nodes= [482, 132] persons= [137, 136, 135] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554329 +name: onebdd_slice133 id: 134 peer: None nodes= [483, 133] persons= [138, 137, 136] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebde_slice134 id: 135 peer: None nodes= [484, 134] persons= [139, 138, 137] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebdf_slice135 id: 136 peer: None nodes= [485, 135] persons= [140, 139, 138] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebdg_slice136 id: 137 peer: None nodes= [486, 136] persons= [141, 140, 139] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebdh_slice137 id: 138 peer: None nodes= [487, 137] persons= [142, 141, 140] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebdi_slice138 id: 139 peer: None nodes= [488, 138] persons= [143, 142, 141] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebdj_slice139 id: 140 peer: None nodes= [489, 139] persons= [144, 143, 142] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebea_slice140 id: 141 peer: None nodes= [490, 140] persons= [145, 144, 143] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554330 +name: onebeb_slice141 id: 142 peer: None nodes= [491, 141] persons= [146, 145, 144] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebec_slice142 id: 143 peer: None nodes= [492, 142] persons= [147, 146, 145] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebed_slice143 id: 144 peer: None nodes= [493, 143] persons= [148, 147, 146] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebee_slice144 id: 145 peer: None nodes= [494, 144] persons= [149, 148, 147] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebef_slice145 id: 146 peer: None nodes= [495, 145] persons= [150, 149, 148] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebeg_slice146 id: 147 peer: None nodes= [496, 146] persons= [151, 150, 149] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebeh_slice147 id: 148 peer: None nodes= [497, 147] persons= [152, 151, 150] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebei_slice148 id: 149 peer: None nodes= [498, 148] persons= [153, 152, 151] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554331 +name: onebej_slice149 id: 150 peer: None nodes= [499, 149] persons= [154, 153, 152] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebfa_slice150 id: 151 peer: None nodes= [500, 150] persons= [155, 154, 153] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebfb_slice151 id: 152 peer: None nodes= [501, 151] persons= [156, 155, 154] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebfc_slice152 id: 153 peer: None nodes= [502, 152] persons= [157, 156, 155] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebfd_slice153 id: 154 peer: None nodes= [503, 153] persons= [158, 157, 156] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebfe_slice154 id: 155 peer: None nodes= [504, 154] persons= [159, 158, 157] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebff_slice155 id: 156 peer: None nodes= [505, 155] persons= [160, 159, 158] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebfg_slice156 id: 157 peer: None nodes= [506, 156] persons= [161, 160, 159] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554332 +name: onebfh_slice157 id: 158 peer: None nodes= [507, 157] persons= [162, 161, 160] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebfi_slice158 id: 159 peer: None nodes= [508, 158] persons= [163, 162, 161] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebfj_slice159 id: 160 peer: None nodes= [509, 159] persons= [164, 163, 162] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebga_slice160 id: 161 peer: None nodes= [510, 160] persons= [165, 164, 163] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebgb_slice161 id: 162 peer: None nodes= [511, 161] persons= [166, 165, 164] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebgc_slice162 id: 163 peer: None nodes= [512, 162] persons= [167, 166, 165] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebgd_slice163 id: 164 peer: None nodes= [513, 163] persons= [168, 167, 166] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebge_slice164 id: 165 peer: None nodes= [514, 164] persons= [169, 168, 167] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554333 +name: onebgf_slice165 id: 166 peer: None nodes= [515, 165] persons= [170, 169, 168] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebgg_slice166 id: 167 peer: None nodes= [516, 166] persons= [171, 170, 169] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebgh_slice167 id: 168 peer: None nodes= [517, 167] persons= [172, 171, 170] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebgi_slice168 id: 169 peer: None nodes= [518, 168] persons= [173, 172, 171] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebgj_slice169 id: 170 peer: None nodes= [519, 169] persons= [174, 173, 172] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebha_slice170 id: 171 peer: None nodes= [520, 170] persons= [175, 174, 173] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebhb_slice171 id: 172 peer: None nodes= [521, 171] persons= [176, 175, 174] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebhc_slice172 id: 173 peer: None nodes= [522, 172] persons= [177, 176, 175] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554334 +name: onebhd_slice173 id: 174 peer: None nodes= [523, 173] persons= [178, 177, 176] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebhe_slice174 id: 175 peer: None nodes= [524, 174] persons= [179, 178, 177] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebhf_slice175 id: 176 peer: None nodes= [525, 175] persons= [180, 179, 178] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebhg_slice176 id: 177 peer: None nodes= [526, 176] persons= [181, 180, 179] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebhh_slice177 id: 178 peer: None nodes= [527, 177] persons= [182, 181, 180] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebhi_slice178 id: 179 peer: None nodes= [528, 178] persons= [183, 182, 181] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebhj_slice179 id: 180 peer: None nodes= [529, 179] persons= [184, 183, 182] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebia_slice180 id: 181 peer: None nodes= [530, 180] persons= [185, 184, 183] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554335 +name: onebib_slice181 id: 182 peer: None nodes= [531, 181] persons= [186, 185, 184] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebic_slice182 id: 183 peer: None nodes= [532, 182] persons= [187, 186, 185] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebid_slice183 id: 184 peer: None nodes= [533, 183] persons= [188, 187, 186] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebie_slice184 id: 185 peer: None nodes= [534, 184] persons= [189, 188, 187] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebif_slice185 id: 186 peer: None nodes= [535, 185] persons= [190, 189, 188] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebig_slice186 id: 187 peer: None nodes= [536, 186] persons= [191, 190, 189] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebih_slice187 id: 188 peer: None nodes= [537, 187] persons= [192, 191, 190] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebii_slice188 id: 189 peer: None nodes= [538, 188] persons= [193, 192, 191] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554336 +name: onebij_slice189 id: 190 peer: None nodes= [539, 189] persons= [194, 193, 192] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebja_slice190 id: 191 peer: None nodes= [540, 190] persons= [195, 194, 193] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebjb_slice191 id: 192 peer: None nodes= [541, 191] persons= [196, 195, 194] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebjc_slice192 id: 193 peer: None nodes= [542, 192] persons= [197, 196, 195] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebjd_slice193 id: 194 peer: None nodes= [543, 193] persons= [198, 197, 196] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebje_slice194 id: 195 peer: None nodes= [544, 194] persons= [199, 198, 197] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebjf_slice195 id: 196 peer: None nodes= [545, 195] persons= [200, 199, 198] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebjg_slice196 id: 197 peer: None nodes= [546, 196] persons= [201, 200, 199] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554337 +name: onebjh_slice197 id: 198 peer: None nodes= [547, 197] persons= [202, 201, 200] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554338 +name: onebji_slice198 id: 199 peer: None nodes= [548, 198] persons= [203, 202, 201] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554338 +name: onebjj_slice199 id: 200 peer: None nodes= [549, 199] persons= [204, 203, 202] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554338 +name: onecaa_slice200 id: 201 peer: None nodes= [550, 200] persons= [205, 204, 203] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554338 +name: oneb_slice201 id: 202 peer: None nodes= [551, 201] persons= [206, 205, 204] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554338 +name: onec_slice202 id: 203 peer: None nodes= [552, 202] persons= [207, 206, 205] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554338 +name: oned_slice203 id: 204 peer: None nodes= [553, 203] persons= [208, 207, 206] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554338 +name: onee_slice204 id: 205 peer: None nodes= [554, 204] persons= [209, 208, 207] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: onef_slice205 id: 206 peer: None nodes= [555, 205] persons= [210, 209, 208] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: oneg_slice206 id: 207 peer: None nodes= [556, 206] persons= [211, 210, 209] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: oneh_slice207 id: 208 peer: None nodes= [557, 207] persons= [212, 211, 210] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: onei_slice208 id: 209 peer: None nodes= [558, 208] persons= [213, 212, 211] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: onej_slice209 id: 210 peer: None nodes= [559, 209] persons= [214, 213, 212] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: oneba_slice210 id: 211 peer: None nodes= [560, 210] persons= [215, 214, 213] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: onebb_slice211 id: 212 peer: None nodes= [561, 211] persons= [216, 215, 214] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554339 +name: onebc_slice212 id: 213 peer: None nodes= [562, 212] persons= [217, 216, 215] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: onebd_slice213 id: 214 peer: None nodes= [563, 213] persons= [218, 217, 216] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: onebe_slice214 id: 215 peer: None nodes= [564, 214] persons= [219, 218, 217] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: onebf_slice215 id: 216 peer: None nodes= [565, 215] persons= [220, 219, 218] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: onebg_slice216 id: 217 peer: None nodes= [566, 216] persons= [221, 220, 219] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: onebh_slice217 id: 218 peer: None nodes= [567, 217] persons= [222, 221, 220] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: onebi_slice218 id: 219 peer: None nodes= [568, 218] persons= [223, 222, 221] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: onebj_slice219 id: 220 peer: None nodes= [569, 219] persons= [224, 223, 222] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554340 +name: oneca_slice220 id: 221 peer: None nodes= [570, 220] persons= [225, 224, 223] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: onecb_slice221 id: 222 peer: None nodes= [571, 221] persons= [226, 225, 224] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: onecc_slice222 id: 223 peer: None nodes= [572, 222] persons= [227, 226, 225] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: onecd_slice223 id: 224 peer: None nodes= [573, 223] persons= [228, 227, 226] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: onece_slice224 id: 225 peer: None nodes= [574, 224] persons= [229, 228, 227] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: onecf_slice225 id: 226 peer: None nodes= [575, 225] persons= [230, 229, 228] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: onecg_slice226 id: 227 peer: None nodes= [576, 226] persons= [231, 230, 229] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: onech_slice227 id: 228 peer: None nodes= [577, 227] persons= [232, 231, 230] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554341 +name: oneci_slice228 id: 229 peer: None nodes= [578, 228] persons= [233, 232, 231] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554342 +name: onecj_slice229 id: 230 peer: None nodes= [579, 229] persons= [234, 233, 232] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554342 +name: oneda_slice230 id: 231 peer: None nodes= [580, 230] persons= [235, 234, 233] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554342 +name: onedb_slice231 id: 232 peer: None nodes= [581, 231] persons= [236, 235, 234] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554342 +name: onedc_slice232 id: 233 peer: None nodes= [582, 232] persons= [237, 236, 235] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554342 +name: onedd_slice233 id: 234 peer: None nodes= [583, 233] persons= [238, 237, 236] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554342 +name: onede_slice234 id: 235 peer: None nodes= [584, 234] persons= [239, 238, 237] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554342 +name: onedf_slice235 id: 236 peer: None nodes= [585, 235] persons= [240, 239, 238] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: onedg_slice236 id: 237 peer: None nodes= [586, 236] persons= [241, 240, 239] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: onedh_slice237 id: 238 peer: None nodes= [587, 237] persons= [242, 241, 240] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: onedi_slice238 id: 239 peer: None nodes= [588, 238] persons= [243, 242, 241] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: onedj_slice239 id: 240 peer: None nodes= [589, 239] persons= [244, 243, 242] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: oneea_slice240 id: 241 peer: None nodes= [590, 240] persons= [245, 244, 243] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: oneeb_slice241 id: 242 peer: None nodes= [591, 241] persons= [246, 245, 244] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: oneec_slice242 id: 243 peer: None nodes= [592, 242] persons= [247, 246, 245] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554343 +name: oneed_slice243 id: 244 peer: None nodes= [593, 243] persons= [248, 247, 246] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: oneee_slice244 id: 245 peer: None nodes= [594, 244] persons= [249, 248, 247] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: oneef_slice245 id: 246 peer: None nodes= [595, 245] persons= [250, 249, 248] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: oneeg_slice246 id: 247 peer: None nodes= [596, 246] persons= [251, 250, 249] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: oneeh_slice247 id: 248 peer: None nodes= [597, 247] persons= [252, 251, 250] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: oneei_slice248 id: 249 peer: None nodes= [598, 248] persons= [253, 252, 251] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: oneej_slice249 id: 250 peer: None nodes= [599, 249] persons= [254, 253, 252] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: onefa_slice250 id: 251 peer: None nodes= [600, 250] persons= [255, 254, 253] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554344 +name: onefb_slice251 id: 252 peer: None nodes= [601, 251] persons= [256, 255, 254] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554345 +name: onefc_slice252 id: 253 peer: None nodes= [602, 252] persons= [257, 256, 255] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554345 +name: onefd_slice253 id: 254 peer: None nodes= [603, 253] persons= [258, 257, 256] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554345 +name: onefe_slice254 id: 255 peer: None nodes= [604, 254] persons= [259, 258, 257] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554345 +name: oneff_slice255 id: 256 peer: None nodes= [605, 255] persons= [260, 259, 258] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554345 +name: onefg_slice256 id: 257 peer: None nodes= [606, 256] persons= [261, 260, 259] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554345 +name: onefh_slice257 id: 258 peer: None nodes= [607, 257] persons= [262, 261, 260] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554345 +name: onefi_slice258 id: 259 peer: None nodes= [608, 258] persons= [263, 262, 261] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onefj_slice259 id: 260 peer: None nodes= [609, 259] persons= [264, 263, 262] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onega_slice260 id: 261 peer: None nodes= [610, 260] persons= [265, 264, 263] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onegb_slice261 id: 262 peer: None nodes= [611, 261] persons= [266, 265, 264] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onegc_slice262 id: 263 peer: None nodes= [612, 262] persons= [267, 266, 265] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onegd_slice263 id: 264 peer: None nodes= [613, 263] persons= [268, 267, 266] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onege_slice264 id: 265 peer: None nodes= [614, 264] persons= [269, 268, 267] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onegf_slice265 id: 266 peer: None nodes= [615, 265] persons= [270, 269, 268] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554346 +name: onegg_slice266 id: 267 peer: None nodes= [616, 266] persons= [271, 270, 269] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554347 +name: onegh_slice267 id: 268 peer: None nodes= [617, 267] persons= [272, 271, 270] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554347 +name: onegi_slice268 id: 269 peer: None nodes= [618, 268] persons= [273, 272, 271] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554347 +name: onegj_slice269 id: 270 peer: None nodes= [619, 269] persons= [274, 273, 272] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554347 +name: oneha_slice270 id: 271 peer: None nodes= [620, 270] persons= [275, 274, 273] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554347 +name: onehb_slice271 id: 272 peer: None nodes= [621, 271] persons= [276, 275, 274] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554347 +name: onehc_slice272 id: 273 peer: None nodes= [622, 272] persons= [277, 276, 275] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554347 +name: onehd_slice273 id: 274 peer: None nodes= [623, 273] persons= [278, 277, 276] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: onehe_slice274 id: 275 peer: None nodes= [624, 274] persons= [279, 278, 277] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: onehf_slice275 id: 276 peer: None nodes= [625, 275] persons= [280, 279, 278] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: onehg_slice276 id: 277 peer: None nodes= [626, 276] persons= [281, 280, 279] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: onehh_slice277 id: 278 peer: None nodes= [627, 277] persons= [282, 281, 280] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: onehi_slice278 id: 279 peer: None nodes= [628, 278] persons= [283, 282, 281] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: onehj_slice279 id: 280 peer: None nodes= [629, 279] persons= [284, 283, 282] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: oneia_slice280 id: 281 peer: None nodes= [630, 280] persons= [285, 284, 283] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554348 +name: oneib_slice281 id: 282 peer: None nodes= [631, 281] persons= [286, 285, 284] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554349 +name: oneic_slice282 id: 283 peer: None nodes= [632, 282] persons= [287, 286, 285] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554349 +name: oneid_slice283 id: 284 peer: None nodes= [633, 283] persons= [288, 287, 286] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554349 +name: oneie_slice284 id: 285 peer: None nodes= [634, 284] persons= [289, 288, 287] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554349 +name: oneif_slice285 id: 286 peer: None nodes= [635, 285] persons= [290, 289, 288] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554349 +name: oneig_slice286 id: 287 peer: None nodes= [636, 286] persons= [291, 290, 289] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554349 +name: oneih_slice287 id: 288 peer: None nodes= [637, 287] persons= [292, 291, 290] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554349 +name: oneii_slice288 id: 289 peer: None nodes= [638, 288] persons= [293, 292, 291] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554350 +name: oneij_slice289 id: 290 peer: None nodes= [639, 289] persons= [294, 293, 292] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554350 +name: oneja_slice290 id: 291 peer: None nodes= [640, 290] persons= [295, 294, 293] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554350 +name: onejb_slice291 id: 292 peer: None nodes= [641, 291] persons= [296, 295, 294] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554350 +name: onejc_slice292 id: 293 peer: None nodes= [642, 292] persons= [297, 296, 295] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554350 +name: onejd_slice293 id: 294 peer: None nodes= [643, 293] persons= [298, 297, 296] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554350 +name: oneje_slice294 id: 295 peer: None nodes= [644, 294] persons= [299, 298, 297] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554350 +name: onejf_slice295 id: 296 peer: None nodes= [645, 295] persons= [300, 299, 298] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: onejg_slice296 id: 297 peer: None nodes= [646, 296] persons= [301, 300, 299] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: onejh_slice297 id: 298 peer: None nodes= [647, 297] persons= [302, 301, 300] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: oneji_slice298 id: 299 peer: None nodes= [648, 298] persons= [303, 302, 301] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: onejj_slice299 id: 300 peer: None nodes= [649, 299] persons= [304, 303, 302] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: onebaa_slice300 id: 301 peer: None nodes= [650, 300] persons= [305, 304, 303] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: onebab_slice301 id: 302 peer: None nodes= [651, 301] persons= [306, 305, 304] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: onebac_slice302 id: 303 peer: None nodes= [652, 302] persons= [307, 306, 305] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554351 +name: onebad_slice303 id: 304 peer: None nodes= [653, 303] persons= [308, 307, 306] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554352 +name: onebae_slice304 id: 305 peer: None nodes= [654, 304] persons= [309, 308, 307] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554352 +name: onebaf_slice305 id: 306 peer: None nodes= [655, 305] persons= [310, 309, 308] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554352 +name: onebag_slice306 id: 307 peer: None nodes= [656, 306] persons= [311, 310, 309] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554352 +name: onebah_slice307 id: 308 peer: None nodes= [657, 307] persons= [312, 311, 310] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554352 +name: onebai_slice308 id: 309 peer: None nodes= [658, 308] persons= [313, 312, 311] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554352 +name: onebaj_slice309 id: 310 peer: None nodes= [659, 309] persons= [314, 313, 312] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554352 +name: onebba_slice310 id: 311 peer: None nodes= [660, 310] persons= [315, 314, 313] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbb_slice311 id: 312 peer: None nodes= [661, 311] persons= [316, 315, 314] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbc_slice312 id: 313 peer: None nodes= [662, 312] persons= [317, 316, 315] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbd_slice313 id: 314 peer: None nodes= [663, 313] persons= [318, 317, 316] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbe_slice314 id: 315 peer: None nodes= [664, 314] persons= [319, 318, 317] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbf_slice315 id: 316 peer: None nodes= [665, 315] persons= [320, 319, 318] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbg_slice316 id: 317 peer: None nodes= [666, 316] persons= [321, 320, 319] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbh_slice317 id: 318 peer: None nodes= [667, 317] persons= [322, 321, 320] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554353 +name: onebbi_slice318 id: 319 peer: None nodes= [668, 318] persons= [323, 322, 321] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554354 +name: onebbj_slice319 id: 320 peer: None nodes= [669, 319] persons= [324, 323, 322] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554354 +name: onebca_slice320 id: 321 peer: None nodes= [670, 320] persons= [325, 324, 323] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554354 +name: onebcb_slice321 id: 322 peer: None nodes= [671, 321] persons= [326, 325, 324] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554354 +name: onebcc_slice322 id: 323 peer: None nodes= [672, 322] persons= [327, 326, 325] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554354 +name: onebcd_slice323 id: 324 peer: None nodes= [673, 323] persons= [328, 327, 326] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554354 +name: onebce_slice324 id: 325 peer: None nodes= [674, 324] persons= [329, 328, 327] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554354 +name: onebcf_slice325 id: 326 peer: None nodes= [675, 325] persons= [330, 329, 328] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554355 +name: onebcg_slice326 id: 327 peer: None nodes= [676, 326] persons= [331, 330, 329] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554355 +name: onebch_slice327 id: 328 peer: None nodes= [677, 327] persons= [332, 331, 330] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554355 +name: onebci_slice328 id: 329 peer: None nodes= [678, 328] persons= [333, 332, 331] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554355 +name: onebcj_slice329 id: 330 peer: None nodes= [679, 329] persons= [334, 333, 332] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554355 +name: onebda_slice330 id: 331 peer: None nodes= [680, 330] persons= [335, 334, 333] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554355 +name: onebdb_slice331 id: 332 peer: None nodes= [681, 331] persons= [336, 335, 334] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554355 +name: onebdc_slice332 id: 333 peer: None nodes= [682, 332] persons= [337, 336, 335] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebdd_slice333 id: 334 peer: None nodes= [683, 333] persons= [338, 337, 336] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebde_slice334 id: 335 peer: None nodes= [684, 334] persons= [339, 338, 337] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebdf_slice335 id: 336 peer: None nodes= [685, 335] persons= [340, 339, 338] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebdg_slice336 id: 337 peer: None nodes= [686, 336] persons= [341, 340, 339] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebdh_slice337 id: 338 peer: None nodes= [687, 337] persons= [342, 341, 340] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebdi_slice338 id: 339 peer: None nodes= [688, 338] persons= [343, 342, 341] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebdj_slice339 id: 340 peer: None nodes= [689, 339] persons= [344, 343, 342] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554356 +name: onebea_slice340 id: 341 peer: None nodes= [690, 340] persons= [345, 344, 343] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554357 +name: onebeb_slice341 id: 342 peer: None nodes= [691, 341] persons= [346, 345, 344] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554357 +name: onebec_slice342 id: 343 peer: None nodes= [692, 342] persons= [347, 346, 345] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554357 +name: onebed_slice343 id: 344 peer: None nodes= [693, 343] persons= [348, 347, 346] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554357 +name: onebee_slice344 id: 345 peer: None nodes= [694, 344] persons= [349, 348, 347] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554357 +name: onebef_slice345 id: 346 peer: None nodes= [695, 345] persons= [350, 349, 348] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554357 +name: onebeg_slice346 id: 347 peer: None nodes= [696, 346] persons= [351, 350, 349] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554357 +name: onebeh_slice347 id: 348 peer: None nodes= [697, 347] persons= [352, 351, 350] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554358 +name: onebei_slice348 id: 349 peer: None nodes= [698, 348] persons= [353, 352, 351] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554358 +name: onebej_slice349 id: 350 peer: None nodes= [699, 349] persons= [354, 353, 352] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554358 +name: onebfa_slice350 id: 351 peer: None nodes= [700, 350] persons= [355, 354, 353] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554358 +name: onebfb_slice351 id: 352 peer: None nodes= [351, 1] persons= [356, 355, 354] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554358 +name: onebfc_slice352 id: 353 peer: None nodes= [352, 2] persons= [357, 356, 355] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554358 +name: onebfd_slice353 id: 354 peer: None nodes= [353, 3] persons= [358, 357, 356] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554358 +name: onebfe_slice354 id: 355 peer: None nodes= [354, 4] persons= [359, 358, 357] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554359 +name: onebff_slice355 id: 356 peer: None nodes= [355, 5] persons= [360, 359, 358] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554359 +name: onebfg_slice356 id: 357 peer: None nodes= [356, 6] persons= [361, 360, 359] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554359 +name: onebfh_slice357 id: 358 peer: None nodes= [357, 7] persons= [362, 361, 360] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554359 +name: onebfi_slice358 id: 359 peer: None nodes= [358, 8] persons= [363, 362, 361] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554359 +name: onebfj_slice359 id: 360 peer: None nodes= [359, 9] persons= [364, 363, 362] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554359 +name: onebga_slice360 id: 361 peer: None nodes= [360, 10] persons= [365, 364, 363] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554359 +name: onebgb_slice361 id: 362 peer: None nodes= [361, 11] persons= [366, 365, 364] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554360 +name: onebgc_slice362 id: 363 peer: None nodes= [362, 12] persons= [367, 366, 365] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554360 +name: onebgd_slice363 id: 364 peer: None nodes= [363, 13] persons= [368, 367, 366] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554360 +name: onebge_slice364 id: 365 peer: None nodes= [364, 14] persons= [369, 368, 367] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554360 +name: onebgf_slice365 id: 366 peer: None nodes= [365, 15] persons= [370, 369, 368] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554360 +name: onebgg_slice366 id: 367 peer: None nodes= [366, 16] persons= [371, 370, 369] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554360 +name: onebgh_slice367 id: 368 peer: None nodes= [367, 17] persons= [372, 371, 370] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554360 +name: onebgi_slice368 id: 369 peer: None nodes= [368, 18] persons= [373, 372, 371] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebgj_slice369 id: 370 peer: None nodes= [369, 19] persons= [374, 373, 372] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebha_slice370 id: 371 peer: None nodes= [370, 20] persons= [375, 374, 373] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebhb_slice371 id: 372 peer: None nodes= [371, 21] persons= [376, 375, 374] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebhc_slice372 id: 373 peer: None nodes= [372, 22] persons= [377, 376, 375] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebhd_slice373 id: 374 peer: None nodes= [373, 23] persons= [378, 377, 376] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebhe_slice374 id: 375 peer: None nodes= [374, 24] persons= [379, 378, 377] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebhf_slice375 id: 376 peer: None nodes= [375, 25] persons= [380, 379, 378] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554361 +name: onebhg_slice376 id: 377 peer: None nodes= [376, 26] persons= [381, 380, 379] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554362 +name: onebhh_slice377 id: 378 peer: None nodes= [377, 27] persons= [382, 381, 380] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554362 +name: onebhi_slice378 id: 379 peer: None nodes= [378, 28] persons= [383, 382, 381] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554362 +name: onebhj_slice379 id: 380 peer: None nodes= [379, 29] persons= [384, 383, 382] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554362 +name: onebia_slice380 id: 381 peer: None nodes= [380, 30] persons= [385, 384, 383] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554362 +name: onebib_slice381 id: 382 peer: None nodes= [381, 31] persons= [386, 385, 384] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554362 +name: onebic_slice382 id: 383 peer: None nodes= [382, 32] persons= [387, 386, 385] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554362 +name: onebid_slice383 id: 384 peer: None nodes= [383, 33] persons= [388, 387, 386] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554363 +name: onebie_slice384 id: 385 peer: None nodes= [384, 34] persons= [389, 388, 387] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554363 +name: onebif_slice385 id: 386 peer: None nodes= [385, 35] persons= [390, 389, 388] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554363 +name: onebig_slice386 id: 387 peer: None nodes= [386, 36] persons= [391, 390, 389] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554363 +name: onebih_slice387 id: 388 peer: None nodes= [387, 37] persons= [392, 391, 390] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554363 +name: onebii_slice388 id: 389 peer: None nodes= [388, 38] persons= [393, 392, 391] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554363 +name: onebij_slice389 id: 390 peer: None nodes= [389, 39] persons= [394, 393, 392] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554363 +name: onebja_slice390 id: 391 peer: None nodes= [390, 40] persons= [395, 394, 393] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554364 +name: onebjb_slice391 id: 392 peer: None nodes= [391, 41] persons= [396, 395, 394] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554364 +name: onebjc_slice392 id: 393 peer: None nodes= [392, 42] persons= [397, 396, 395] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554364 +name: onebjd_slice393 id: 394 peer: None nodes= [393, 43] persons= [398, 397, 396] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554364 +name: onebje_slice394 id: 395 peer: None nodes= [394, 44] persons= [399, 398, 397] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554364 +name: onebjf_slice395 id: 396 peer: None nodes= [395, 45] persons= [400, 399, 398] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554364 +name: onebjg_slice396 id: 397 peer: None nodes= [396, 46] persons= [401, 400, 399] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554364 +name: onebjh_slice397 id: 398 peer: None nodes= [397, 47] persons= [402, 401, 400] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554365 +name: onebji_slice398 id: 399 peer: None nodes= [398, 48] persons= [403, 402, 401] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554365 +name: onebjj_slice399 id: 400 peer: None nodes= [399, 49] persons= [404, 403, 402] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554365 +name: onecaa_slice400 id: 401 peer: None nodes= [400, 50] persons= [405, 404, 403] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554365 +name: oneb_slice401 id: 402 peer: None nodes= [401, 51] persons= [406, 405, 404] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554365 +name: onec_slice402 id: 403 peer: None nodes= [402, 52] persons= [407, 406, 405] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554365 +name: oned_slice403 id: 404 peer: None nodes= [403, 53] persons= [408, 407, 406] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554365 +name: onee_slice404 id: 405 peer: None nodes= [404, 54] persons= [409, 408, 407] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554366 +name: onef_slice405 id: 406 peer: None nodes= [405, 55] persons= [410, 409, 408] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554366 +name: oneg_slice406 id: 407 peer: None nodes= [406, 56] persons= [411, 410, 409] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554366 +name: oneh_slice407 id: 408 peer: None nodes= [407, 57] persons= [412, 411, 410] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554366 +name: onei_slice408 id: 409 peer: None nodes= [408, 58] persons= [413, 412, 411] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554366 +name: onej_slice409 id: 410 peer: None nodes= [409, 59] persons= [414, 413, 412] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554366 +name: oneba_slice410 id: 411 peer: None nodes= [410, 60] persons= [415, 414, 413] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554366 +name: onebb_slice411 id: 412 peer: None nodes= [411, 61] persons= [416, 415, 414] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554367 +name: onebc_slice412 id: 413 peer: None nodes= [412, 62] persons= [417, 416, 415] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554367 +name: onebd_slice413 id: 414 peer: None nodes= [413, 63] persons= [418, 417, 416] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554367 +name: onebe_slice414 id: 415 peer: None nodes= [414, 64] persons= [419, 418, 417] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554367 +name: onebf_slice415 id: 416 peer: None nodes= [415, 65] persons= [420, 419, 418] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554367 +name: onebg_slice416 id: 417 peer: None nodes= [416, 66] persons= [421, 420, 419] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554367 +name: onebh_slice417 id: 418 peer: None nodes= [417, 67] persons= [422, 421, 420] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554367 +name: onebi_slice418 id: 419 peer: None nodes= [418, 68] persons= [423, 422, 421] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554368 +name: onebj_slice419 id: 420 peer: None nodes= [419, 69] persons= [424, 423, 422] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554368 +name: oneca_slice420 id: 421 peer: None nodes= [420, 70] persons= [425, 424, 423] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554368 +name: onecb_slice421 id: 422 peer: None nodes= [421, 71] persons= [426, 425, 424] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554368 +name: onecc_slice422 id: 423 peer: None nodes= [422, 72] persons= [427, 426, 425] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554368 +name: onecd_slice423 id: 424 peer: None nodes= [423, 73] persons= [428, 427, 426] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554368 +name: onece_slice424 id: 425 peer: None nodes= [424, 74] persons= [429, 428, 427] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554368 +name: onecf_slice425 id: 426 peer: None nodes= [425, 75] persons= [430, 429, 428] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554369 +name: onecg_slice426 id: 427 peer: None nodes= [426, 76] persons= [431, 430, 429] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554369 +name: onech_slice427 id: 428 peer: None nodes= [427, 77] persons= [432, 431, 430] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554369 +name: oneci_slice428 id: 429 peer: None nodes= [428, 78] persons= [433, 432, 431] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554369 +name: onecj_slice429 id: 430 peer: None nodes= [429, 79] persons= [434, 433, 432] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554369 +name: oneda_slice430 id: 431 peer: None nodes= [430, 80] persons= [435, 434, 433] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554369 +name: onedb_slice431 id: 432 peer: None nodes= [431, 81] persons= [436, 435, 434] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554369 +name: onedc_slice432 id: 433 peer: None nodes= [432, 82] persons= [437, 436, 435] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554370 +name: onedd_slice433 id: 434 peer: None nodes= [433, 83] persons= [438, 437, 436] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554370 +name: onede_slice434 id: 435 peer: None nodes= [434, 84] persons= [439, 438, 437] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554370 +name: onedf_slice435 id: 436 peer: None nodes= [435, 85] persons= [440, 439, 438] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554370 +name: onedg_slice436 id: 437 peer: None nodes= [436, 86] persons= [441, 440, 439] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554370 +name: onedh_slice437 id: 438 peer: None nodes= [437, 87] persons= [442, 441, 440] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554370 +name: onedi_slice438 id: 439 peer: None nodes= [438, 88] persons= [443, 442, 441] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554370 +name: onedj_slice439 id: 440 peer: None nodes= [439, 89] persons= [444, 443, 442] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554371 +name: oneea_slice440 id: 441 peer: None nodes= [440, 90] persons= [445, 444, 443] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554371 +name: oneeb_slice441 id: 442 peer: None nodes= [441, 91] persons= [446, 445, 444] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554371 +name: oneec_slice442 id: 443 peer: None nodes= [442, 92] persons= [447, 446, 445] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554371 +name: oneed_slice443 id: 444 peer: None nodes= [443, 93] persons= [448, 447, 446] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554371 +name: oneee_slice444 id: 445 peer: None nodes= [444, 94] persons= [449, 448, 447] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554371 +name: oneef_slice445 id: 446 peer: None nodes= [445, 95] persons= [450, 449, 448] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554371 +name: oneeg_slice446 id: 447 peer: None nodes= [446, 96] persons= [451, 450, 449] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554372 +name: oneeh_slice447 id: 448 peer: None nodes= [447, 97] persons= [452, 451, 450] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554372 +name: oneei_slice448 id: 449 peer: None nodes= [448, 98] persons= [453, 452, 451] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554372 +name: oneej_slice449 id: 450 peer: None nodes= [449, 99] persons= [454, 453, 452] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554372 +name: onefa_slice450 id: 451 peer: None nodes= [450, 100] persons= [455, 454, 453] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554372 +name: onefb_slice451 id: 452 peer: None nodes= [451, 101] persons= [456, 455, 454] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554372 +name: onefc_slice452 id: 453 peer: None nodes= [452, 102] persons= [457, 456, 455] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554373 +name: onefd_slice453 id: 454 peer: None nodes= [453, 103] persons= [458, 457, 456] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554373 +name: onefe_slice454 id: 455 peer: None nodes= [454, 104] persons= [459, 458, 457] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554373 +name: oneff_slice455 id: 456 peer: None nodes= [455, 105] persons= [460, 459, 458] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554373 +name: onefg_slice456 id: 457 peer: None nodes= [456, 106] persons= [461, 460, 459] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554373 +name: onefh_slice457 id: 458 peer: None nodes= [457, 107] persons= [462, 461, 460] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554373 +name: onefi_slice458 id: 459 peer: None nodes= [458, 108] persons= [463, 462, 461] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554373 +name: onefj_slice459 id: 460 peer: None nodes= [459, 109] persons= [464, 463, 462] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554374 +name: onega_slice460 id: 461 peer: None nodes= [460, 110] persons= [465, 464, 463] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554374 +name: onegb_slice461 id: 462 peer: None nodes= [461, 111] persons= [466, 465, 464] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554374 +name: onegc_slice462 id: 463 peer: None nodes= [462, 112] persons= [467, 466, 465] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554374 +name: onegd_slice463 id: 464 peer: None nodes= [463, 113] persons= [468, 467, 466] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554374 +name: onege_slice464 id: 465 peer: None nodes= [464, 114] persons= [469, 468, 467] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554374 +name: onegf_slice465 id: 466 peer: None nodes= [465, 115] persons= [470, 469, 468] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554374 +name: onegg_slice466 id: 467 peer: None nodes= [466, 116] persons= [471, 470, 469] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554375 +name: onegh_slice467 id: 468 peer: None nodes= [467, 117] persons= [472, 471, 470] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554375 +name: onegi_slice468 id: 469 peer: None nodes= [468, 118] persons= [473, 472, 471] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554375 +name: onegj_slice469 id: 470 peer: None nodes= [469, 119] persons= [474, 473, 472] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554375 +name: oneha_slice470 id: 471 peer: None nodes= [470, 120] persons= [475, 474, 473] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554375 +name: onehb_slice471 id: 472 peer: None nodes= [471, 121] persons= [476, 475, 474] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554375 +name: onehc_slice472 id: 473 peer: None nodes= [472, 122] persons= [477, 476, 475] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554375 +name: onehd_slice473 id: 474 peer: None nodes= [473, 123] persons= [478, 477, 476] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554376 +name: onehe_slice474 id: 475 peer: None nodes= [474, 124] persons= [479, 478, 477] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554376 +name: onehf_slice475 id: 476 peer: None nodes= [475, 125] persons= [480, 479, 478] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554376 +name: onehg_slice476 id: 477 peer: None nodes= [476, 126] persons= [481, 480, 479] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554376 +name: onehh_slice477 id: 478 peer: None nodes= [477, 127] persons= [482, 481, 480] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554376 +name: onehi_slice478 id: 479 peer: None nodes= [478, 128] persons= [483, 482, 481] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554376 +name: onehj_slice479 id: 480 peer: None nodes= [479, 129] persons= [484, 483, 482] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554376 +name: oneia_slice480 id: 481 peer: None nodes= [480, 130] persons= [485, 484, 483] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554377 +name: oneib_slice481 id: 482 peer: None nodes= [481, 131] persons= [486, 485, 484] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554377 +name: oneic_slice482 id: 483 peer: None nodes= [482, 132] persons= [487, 486, 485] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554377 +name: oneid_slice483 id: 484 peer: None nodes= [483, 133] persons= [488, 487, 486] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554377 +name: oneie_slice484 id: 485 peer: None nodes= [484, 134] persons= [489, 488, 487] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554377 +name: oneif_slice485 id: 486 peer: None nodes= [485, 135] persons= [490, 489, 488] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554377 +name: oneig_slice486 id: 487 peer: None nodes= [486, 136] persons= [491, 490, 489] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554377 +name: oneih_slice487 id: 488 peer: None nodes= [487, 137] persons= [492, 491, 490] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554378 +name: oneii_slice488 id: 489 peer: None nodes= [488, 138] persons= [493, 492, 491] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554378 +name: oneij_slice489 id: 490 peer: None nodes= [489, 139] persons= [494, 493, 492] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554378 +name: oneja_slice490 id: 491 peer: None nodes= [490, 140] persons= [495, 494, 493] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554378 +name: onejb_slice491 id: 492 peer: None nodes= [491, 141] persons= [496, 495, 494] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554378 +name: onejc_slice492 id: 493 peer: None nodes= [492, 142] persons= [497, 496, 495] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554378 +name: onejd_slice493 id: 494 peer: None nodes= [493, 143] persons= [498, 497, 496] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554379 +name: oneje_slice494 id: 495 peer: None nodes= [494, 144] persons= [499, 498, 497] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554379 +name: onejf_slice495 id: 496 peer: None nodes= [495, 145] persons= [500, 499, 498] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554379 +name: onejg_slice496 id: 497 peer: None nodes= [496, 146] persons= [501, 500, 499] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554379 +name: onejh_slice497 id: 498 peer: None nodes= [497, 147] persons= [502, 501, 500] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554379 +name: oneji_slice498 id: 499 peer: None nodes= [498, 148] persons= [503, 502, 501] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554379 +name: onejj_slice499 id: 500 peer: None nodes= [499, 149] persons= [4, 503, 502] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554379 +name: onebaa_slice500 id: 501 peer: None nodes= [500, 150] persons= [5, 4, 503] +--- sa_ids= [] creator: 1 +--- 'expires': 1183554380 +01: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_1 < custom sat on plc1 > +01: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 09 sat_id: 04 sl=02 v= predefined sat/node1 n= 1 +name: vref sa_id: 08 sat_id: 04 sl=02 v= predefined sat/all nodes n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None +name: sat_1 sa_id: 07 sat_id: 23 sl=02 v= custom sat/node1 n= 1 +name: sat_1 sa_id: 06 sat_id: 23 sl=02 v= custom sat/all nodes n= None ++++ 241.24 seconds ellapsed (9.62) +01: SLIVERS for first 3 nodes +WARNING - GetSlivers needs fix +01:============================== END DUMP +02:============================== DUMPING +02: SITES +1 None plc2 FederationTestPlc2 Central [] +2 None twob FederationTestPlc2 [201, 1] +3 None twoc FederationTestPlc2 [202, 2] +4 None twod FederationTestPlc2 [203, 3] +5 None twoe FederationTestPlc2 [204, 4] +6 None twof FederationTestPlc2 [205, 5] +7 None twog FederationTestPlc2 [206, 6] +8 None twoh FederationTestPlc2 [207, 7] +9 None twoi FederationTestPlc2 [208, 8] +10 None twoj FederationTestPlc2 [209, 9] +11 None twoba FederationTestPlc2 [210, 10] +12 None twobb FederationTestPlc2 [211, 11] +13 None twobc FederationTestPlc2 [212, 12] +14 None twobd FederationTestPlc2 [213, 13] +15 None twobe FederationTestPlc2 [214, 14] +16 None twobf FederationTestPlc2 [215, 15] +17 None twobg FederationTestPlc2 [216, 16] +18 None twobh FederationTestPlc2 [217, 17] +19 None twobi FederationTestPlc2 [218, 18] +20 None twobj FederationTestPlc2 [219, 19] +21 None twoca FederationTestPlc2 [220, 20] +22 None twocb FederationTestPlc2 [221, 21] +23 None twocc FederationTestPlc2 [222, 22] +24 None twocd FederationTestPlc2 [223, 23] +25 None twoce FederationTestPlc2 [224, 24] +26 None twocf FederationTestPlc2 [225, 25] +27 None twocg FederationTestPlc2 [226, 26] +28 None twoch FederationTestPlc2 [227, 27] +29 None twoci FederationTestPlc2 [228, 28] +30 None twocj FederationTestPlc2 [229, 29] +31 None twoda FederationTestPlc2 [230, 30] +32 None twodb FederationTestPlc2 [231, 31] +33 None twodc FederationTestPlc2 [232, 32] +34 None twodd FederationTestPlc2 [233, 33] +35 None twode FederationTestPlc2 [234, 34] +36 None twodf FederationTestPlc2 [235, 35] +37 None twodg FederationTestPlc2 [236, 36] +38 None twodh FederationTestPlc2 [237, 37] +39 None twodi FederationTestPlc2 [238, 38] +40 None twodj FederationTestPlc2 [239, 39] +41 None twoea FederationTestPlc2 [240, 40] +42 None twoeb FederationTestPlc2 [241, 41] +43 None twoec FederationTestPlc2 [242, 42] +44 None twoed FederationTestPlc2 [243, 43] +45 None twoee FederationTestPlc2 [244, 44] +46 None twoef FederationTestPlc2 [245, 45] +47 None twoeg FederationTestPlc2 [246, 46] +48 None twoeh FederationTestPlc2 [247, 47] +49 None twoei FederationTestPlc2 [248, 48] +50 None twoej FederationTestPlc2 [249, 49] +51 None twofa FederationTestPlc2 [250, 50] +52 None twofb FederationTestPlc2 [251, 51] +53 None twofc FederationTestPlc2 [252, 52] +54 None twofd FederationTestPlc2 [253, 53] +55 None twofe FederationTestPlc2 [254, 54] +56 None twoff FederationTestPlc2 [255, 55] +57 None twofg FederationTestPlc2 [256, 56] +58 None twofh FederationTestPlc2 [257, 57] +59 None twofi FederationTestPlc2 [258, 58] +60 None twofj FederationTestPlc2 [259, 59] +61 None twoga FederationTestPlc2 [260, 60] +62 None twogb FederationTestPlc2 [261, 61] +63 None twogc FederationTestPlc2 [262, 62] +64 None twogd FederationTestPlc2 [263, 63] +65 None twoge FederationTestPlc2 [264, 64] +66 None twogf FederationTestPlc2 [265, 65] +67 None twogg FederationTestPlc2 [266, 66] +68 None twogh FederationTestPlc2 [267, 67] +69 None twogi FederationTestPlc2 [268, 68] +70 None twogj FederationTestPlc2 [269, 69] +71 None twoha FederationTestPlc2 [270, 70] +72 None twohb FederationTestPlc2 [271, 71] +73 None twohc FederationTestPlc2 [272, 72] +74 None twohd FederationTestPlc2 [273, 73] +75 None twohe FederationTestPlc2 [274, 74] +76 None twohf FederationTestPlc2 [275, 75] +77 None twohg FederationTestPlc2 [276, 76] +78 None twohh FederationTestPlc2 [277, 77] +79 None twohi FederationTestPlc2 [278, 78] +80 None twohj FederationTestPlc2 [279, 79] +81 None twoia FederationTestPlc2 [280, 80] +82 None twoib FederationTestPlc2 [281, 81] +83 None twoic FederationTestPlc2 [282, 82] +84 None twoid FederationTestPlc2 [283, 83] +85 None twoie FederationTestPlc2 [284, 84] +86 None twoif FederationTestPlc2 [285, 85] +87 None twoig FederationTestPlc2 [286, 86] +88 None twoih FederationTestPlc2 [287, 87] +89 None twoii FederationTestPlc2 [288, 88] +90 None twoij FederationTestPlc2 [289, 89] +91 None twoja FederationTestPlc2 [290, 90] +92 None twojb FederationTestPlc2 [291, 91] +93 None twojc FederationTestPlc2 [292, 92] +94 None twojd FederationTestPlc2 [293, 93] +95 None twoje FederationTestPlc2 [294, 94] +96 None twojf FederationTestPlc2 [295, 95] +97 None twojg FederationTestPlc2 [296, 96] +98 None twojh FederationTestPlc2 [297, 97] +99 None twoji FederationTestPlc2 [298, 98] +100 None twojj FederationTestPlc2 [299, 99] +101 None twobaa FederationTestPlc2 [300, 100] +102 None twobab FederationTestPlc2 [301, 101] +103 None twobac FederationTestPlc2 [302, 102] +104 None twobad FederationTestPlc2 [303, 103] +105 None twobae FederationTestPlc2 [304, 104] +106 None twobaf FederationTestPlc2 [305, 105] +107 None twobag FederationTestPlc2 [306, 106] +108 None twobah FederationTestPlc2 [307, 107] +109 None twobai FederationTestPlc2 [308, 108] +110 None twobaj FederationTestPlc2 [309, 109] +111 None twobba FederationTestPlc2 [310, 110] +112 None twobbb FederationTestPlc2 [311, 111] +113 None twobbc FederationTestPlc2 [312, 112] +114 None twobbd FederationTestPlc2 [313, 113] +115 None twobbe FederationTestPlc2 [314, 114] +116 None twobbf FederationTestPlc2 [315, 115] +117 None twobbg FederationTestPlc2 [316, 116] +118 None twobbh FederationTestPlc2 [317, 117] +119 None twobbi FederationTestPlc2 [318, 118] +120 None twobbj FederationTestPlc2 [319, 119] +121 None twobca FederationTestPlc2 [320, 120] +122 None twobcb FederationTestPlc2 [321, 121] +123 None twobcc FederationTestPlc2 [322, 122] +124 None twobcd FederationTestPlc2 [323, 123] +125 None twobce FederationTestPlc2 [324, 124] +126 None twobcf FederationTestPlc2 [325, 125] +127 None twobcg FederationTestPlc2 [326, 126] +128 None twobch FederationTestPlc2 [327, 127] +129 None twobci FederationTestPlc2 [328, 128] +130 None twobcj FederationTestPlc2 [329, 129] +131 None twobda FederationTestPlc2 [330, 130] +132 None twobdb FederationTestPlc2 [331, 131] +133 None twobdc FederationTestPlc2 [332, 132] +134 None twobdd FederationTestPlc2 [333, 133] +135 None twobde FederationTestPlc2 [334, 134] +136 None twobdf FederationTestPlc2 [335, 135] +137 None twobdg FederationTestPlc2 [336, 136] +138 None twobdh FederationTestPlc2 [337, 137] +139 None twobdi FederationTestPlc2 [338, 138] +140 None twobdj FederationTestPlc2 [339, 139] +141 None twobea FederationTestPlc2 [340, 140] +142 None twobeb FederationTestPlc2 [341, 141] +143 None twobec FederationTestPlc2 [342, 142] +144 None twobed FederationTestPlc2 [343, 143] +145 None twobee FederationTestPlc2 [344, 144] +146 None twobef FederationTestPlc2 [345, 145] +147 None twobeg FederationTestPlc2 [346, 146] +148 None twobeh FederationTestPlc2 [347, 147] +149 None twobei FederationTestPlc2 [348, 148] +150 None twobej FederationTestPlc2 [349, 149] +151 None twobfa FederationTestPlc2 [350, 150] +152 None twobfb FederationTestPlc2 [151] +153 None twobfc FederationTestPlc2 [152] +154 None twobfd FederationTestPlc2 [153] +155 None twobfe FederationTestPlc2 [154] +156 None twobff FederationTestPlc2 [155] +157 None twobfg FederationTestPlc2 [156] +158 None twobfh FederationTestPlc2 [157] +159 None twobfi FederationTestPlc2 [158] +160 None twobfj FederationTestPlc2 [159] +161 None twobga FederationTestPlc2 [160] +162 None twobgb FederationTestPlc2 [161] +163 None twobgc FederationTestPlc2 [162] +164 None twobgd FederationTestPlc2 [163] +165 None twobge FederationTestPlc2 [164] +166 None twobgf FederationTestPlc2 [165] +167 None twobgg FederationTestPlc2 [166] +168 None twobgh FederationTestPlc2 [167] +169 None twobgi FederationTestPlc2 [168] +170 None twobgj FederationTestPlc2 [169] +171 None twobha FederationTestPlc2 [170] +172 None twobhb FederationTestPlc2 [171] +173 None twobhc FederationTestPlc2 [172] +174 None twobhd FederationTestPlc2 [173] +175 None twobhe FederationTestPlc2 [174] +176 None twobhf FederationTestPlc2 [175] +177 None twobhg FederationTestPlc2 [176] +178 None twobhh FederationTestPlc2 [177] +179 None twobhi FederationTestPlc2 [178] +180 None twobhj FederationTestPlc2 [179] +181 None twobia FederationTestPlc2 [180] +182 None twobib FederationTestPlc2 [181] +183 None twobic FederationTestPlc2 [182] +184 None twobid FederationTestPlc2 [183] +185 None twobie FederationTestPlc2 [184] +186 None twobif FederationTestPlc2 [185] +187 None twobig FederationTestPlc2 [186] +188 None twobih FederationTestPlc2 [187] +189 None twobii FederationTestPlc2 [188] +190 None twobij FederationTestPlc2 [189] +191 None twobja FederationTestPlc2 [190] +192 None twobjb FederationTestPlc2 [191] +193 None twobjc FederationTestPlc2 [192] +194 None twobjd FederationTestPlc2 [193] +195 None twobje FederationTestPlc2 [194] +196 None twobjf FederationTestPlc2 [195] +197 None twobjg FederationTestPlc2 [196] +198 None twobjh FederationTestPlc2 [197] +199 None twobji FederationTestPlc2 [198] +200 None twobjj FederationTestPlc2 [199] +201 None twocaa FederationTestPlc2 [200] +202 1 plc1 FederationTestPlc1 Central [] +203 1 oneb FederationTestPlc1 [551, 351] +204 1 onec FederationTestPlc1 [552, 352] +205 1 oned FederationTestPlc1 [553, 353] +206 1 onee FederationTestPlc1 [554, 354] +207 1 onef FederationTestPlc1 [555, 355] +208 1 oneg FederationTestPlc1 [556, 356] +209 1 oneh FederationTestPlc1 [557, 357] +210 1 onei FederationTestPlc1 [558, 358] +211 1 onej FederationTestPlc1 [559, 359] +212 1 oneba FederationTestPlc1 [560, 360] +213 1 onebb FederationTestPlc1 [561, 361] +214 1 onebc FederationTestPlc1 [562, 362] +215 1 onebd FederationTestPlc1 [563, 363] +216 1 onebe FederationTestPlc1 [564, 364] +217 1 onebf FederationTestPlc1 [565, 365] +218 1 onebg FederationTestPlc1 [566, 366] +219 1 onebh FederationTestPlc1 [567, 367] +220 1 onebi FederationTestPlc1 [568, 368] +221 1 onebj FederationTestPlc1 [569, 369] +222 1 oneca FederationTestPlc1 [570, 370] +223 1 onecb FederationTestPlc1 [571, 371] +224 1 onecc FederationTestPlc1 [572, 372] +225 1 onecd FederationTestPlc1 [573, 373] +226 1 onece FederationTestPlc1 [574, 374] +227 1 onecf FederationTestPlc1 [575, 375] +228 1 onecg FederationTestPlc1 [576, 376] +229 1 onech FederationTestPlc1 [577, 377] +230 1 oneci FederationTestPlc1 [578, 378] +231 1 onecj FederationTestPlc1 [579, 379] +232 1 oneda FederationTestPlc1 [580, 380] +233 1 onedb FederationTestPlc1 [581, 381] +234 1 onedc FederationTestPlc1 [582, 382] +235 1 onedd FederationTestPlc1 [583, 383] +236 1 onede FederationTestPlc1 [584, 384] +237 1 onedf FederationTestPlc1 [585, 385] +238 1 onedg FederationTestPlc1 [586, 386] +239 1 onedh FederationTestPlc1 [587, 387] +240 1 onedi FederationTestPlc1 [588, 388] +241 1 onedj FederationTestPlc1 [589, 389] +242 1 oneea FederationTestPlc1 [590, 390] +243 1 oneeb FederationTestPlc1 [591, 391] +244 1 oneec FederationTestPlc1 [592, 392] +245 1 oneed FederationTestPlc1 [593, 393] +246 1 oneee FederationTestPlc1 [594, 394] +247 1 oneef FederationTestPlc1 [595, 395] +248 1 oneeg FederationTestPlc1 [596, 396] +249 1 oneeh FederationTestPlc1 [597, 397] +250 1 oneei FederationTestPlc1 [598, 398] +251 1 oneej FederationTestPlc1 [599, 399] +252 1 onefa FederationTestPlc1 [600, 400] +253 1 onefb FederationTestPlc1 [601, 401] +254 1 onefc FederationTestPlc1 [602, 402] +255 1 onefd FederationTestPlc1 [603, 403] +256 1 onefe FederationTestPlc1 [604, 404] +257 1 oneff FederationTestPlc1 [605, 405] +258 1 onefg FederationTestPlc1 [606, 406] +259 1 onefh FederationTestPlc1 [607, 407] +260 1 onefi FederationTestPlc1 [608, 408] +261 1 onefj FederationTestPlc1 [609, 409] +262 1 onega FederationTestPlc1 [610, 410] +263 1 onegb FederationTestPlc1 [611, 411] +264 1 onegc FederationTestPlc1 [612, 412] +265 1 onegd FederationTestPlc1 [613, 413] +266 1 onege FederationTestPlc1 [614, 414] +267 1 onegf FederationTestPlc1 [615, 415] +268 1 onegg FederationTestPlc1 [616, 416] +269 1 onegh FederationTestPlc1 [617, 417] +270 1 onegi FederationTestPlc1 [618, 418] +271 1 onegj FederationTestPlc1 [619, 419] +272 1 oneha FederationTestPlc1 [620, 420] +273 1 onehb FederationTestPlc1 [621, 421] +274 1 onehc FederationTestPlc1 [622, 422] +275 1 onehd FederationTestPlc1 [623, 423] +276 1 onehe FederationTestPlc1 [624, 424] +277 1 onehf FederationTestPlc1 [625, 425] +278 1 onehg FederationTestPlc1 [626, 426] +279 1 onehh FederationTestPlc1 [627, 427] +280 1 onehi FederationTestPlc1 [628, 428] +281 1 onehj FederationTestPlc1 [629, 429] +282 1 oneia FederationTestPlc1 [630, 430] +283 1 oneib FederationTestPlc1 [631, 431] +284 1 oneic FederationTestPlc1 [632, 432] +285 1 oneid FederationTestPlc1 [633, 433] +286 1 oneie FederationTestPlc1 [634, 434] +287 1 oneif FederationTestPlc1 [635, 435] +288 1 oneig FederationTestPlc1 [636, 436] +289 1 oneih FederationTestPlc1 [637, 437] +290 1 oneii FederationTestPlc1 [638, 438] +291 1 oneij FederationTestPlc1 [639, 439] +292 1 oneja FederationTestPlc1 [640, 440] +293 1 onejb FederationTestPlc1 [641, 441] +294 1 onejc FederationTestPlc1 [642, 442] +295 1 onejd FederationTestPlc1 [643, 443] +296 1 oneje FederationTestPlc1 [644, 444] +297 1 onejf FederationTestPlc1 [645, 445] +298 1 onejg FederationTestPlc1 [646, 446] +299 1 onejh FederationTestPlc1 [647, 447] +300 1 oneji FederationTestPlc1 [648, 448] +301 1 onejj FederationTestPlc1 [649, 449] +302 1 onebaa FederationTestPlc1 [650, 450] +303 1 onebab FederationTestPlc1 [651, 451] +304 1 onebac FederationTestPlc1 [652, 452] +305 1 onebad FederationTestPlc1 [653, 453] +306 1 onebae FederationTestPlc1 [654, 454] +307 1 onebaf FederationTestPlc1 [655, 455] +308 1 onebag FederationTestPlc1 [656, 456] +309 1 onebah FederationTestPlc1 [657, 457] +310 1 onebai FederationTestPlc1 [658, 458] +311 1 onebaj FederationTestPlc1 [659, 459] +312 1 onebba FederationTestPlc1 [660, 460] +313 1 onebbb FederationTestPlc1 [661, 461] +314 1 onebbc FederationTestPlc1 [662, 462] +315 1 onebbd FederationTestPlc1 [663, 463] +316 1 onebbe FederationTestPlc1 [664, 464] +317 1 onebbf FederationTestPlc1 [665, 465] +318 1 onebbg FederationTestPlc1 [666, 466] +319 1 onebbh FederationTestPlc1 [667, 467] +320 1 onebbi FederationTestPlc1 [668, 468] +321 1 onebbj FederationTestPlc1 [669, 469] +322 1 onebca FederationTestPlc1 [670, 470] +323 1 onebcb FederationTestPlc1 [671, 471] +324 1 onebcc FederationTestPlc1 [672, 472] +325 1 onebcd FederationTestPlc1 [673, 473] +326 1 onebce FederationTestPlc1 [674, 474] +327 1 onebcf FederationTestPlc1 [675, 475] +328 1 onebcg FederationTestPlc1 [676, 476] +329 1 onebch FederationTestPlc1 [677, 477] +330 1 onebci FederationTestPlc1 [678, 478] +331 1 onebcj FederationTestPlc1 [679, 479] +332 1 onebda FederationTestPlc1 [680, 480] +333 1 onebdb FederationTestPlc1 [681, 481] +334 1 onebdc FederationTestPlc1 [682, 482] +335 1 onebdd FederationTestPlc1 [683, 483] +336 1 onebde FederationTestPlc1 [684, 484] +337 1 onebdf FederationTestPlc1 [685, 485] +338 1 onebdg FederationTestPlc1 [686, 486] +339 1 onebdh FederationTestPlc1 [687, 487] +340 1 onebdi FederationTestPlc1 [688, 488] +341 1 onebdj FederationTestPlc1 [689, 489] +342 1 onebea FederationTestPlc1 [690, 490] +343 1 onebeb FederationTestPlc1 [691, 491] +344 1 onebec FederationTestPlc1 [692, 492] +345 1 onebed FederationTestPlc1 [693, 493] +346 1 onebee FederationTestPlc1 [694, 494] +347 1 onebef FederationTestPlc1 [695, 495] +348 1 onebeg FederationTestPlc1 [696, 496] +349 1 onebeh FederationTestPlc1 [697, 497] +350 1 onebei FederationTestPlc1 [698, 498] +351 1 onebej FederationTestPlc1 [699, 499] +352 1 onebfa FederationTestPlc1 [700, 500] +353 1 onebfb FederationTestPlc1 [501] +354 1 onebfc FederationTestPlc1 [502] +355 1 onebfd FederationTestPlc1 [503] +356 1 onebfe FederationTestPlc1 [504] +357 1 onebff FederationTestPlc1 [505] +358 1 onebfg FederationTestPlc1 [506] +359 1 onebfh FederationTestPlc1 [507] +360 1 onebfi FederationTestPlc1 [508] +361 1 onebfj FederationTestPlc1 [509] +362 1 onebga FederationTestPlc1 [510] +363 1 onebgb FederationTestPlc1 [511] +364 1 onebgc FederationTestPlc1 [512] +365 1 onebgd FederationTestPlc1 [513] +366 1 onebge FederationTestPlc1 [514] +367 1 onebgf FederationTestPlc1 [515] +368 1 onebgg FederationTestPlc1 [516] +369 1 onebgh FederationTestPlc1 [517] +370 1 onebgi FederationTestPlc1 [518] +371 1 onebgj FederationTestPlc1 [519] +372 1 onebha FederationTestPlc1 [520] +373 1 onebhb FederationTestPlc1 [521] +374 1 onebhc FederationTestPlc1 [522] +375 1 onebhd FederationTestPlc1 [523] +376 1 onebhe FederationTestPlc1 [524] +377 1 onebhf FederationTestPlc1 [525] +378 1 onebhg FederationTestPlc1 [526] +379 1 onebhh FederationTestPlc1 [527] +380 1 onebhi FederationTestPlc1 [528] +381 1 onebhj FederationTestPlc1 [529] +382 1 onebia FederationTestPlc1 [530] +383 1 onebib FederationTestPlc1 [531] +384 1 onebic FederationTestPlc1 [532] +385 1 onebid FederationTestPlc1 [533] +386 1 onebie FederationTestPlc1 [534] +387 1 onebif FederationTestPlc1 [535] +388 1 onebig FederationTestPlc1 [536] +389 1 onebih FederationTestPlc1 [537] +390 1 onebii FederationTestPlc1 [538] +391 1 onebij FederationTestPlc1 [539] +392 1 onebja FederationTestPlc1 [540] +393 1 onebjb FederationTestPlc1 [541] +394 1 onebjc FederationTestPlc1 [542] +395 1 onebjd FederationTestPlc1 [543] +396 1 onebje FederationTestPlc1 [544] +397 1 onebjf FederationTestPlc1 [545] +398 1 onebjg FederationTestPlc1 [546] +399 1 onebjh FederationTestPlc1 [547] +400 1 onebji FederationTestPlc1 [548] +401 1 onebjj FederationTestPlc1 [549] +402 1 onecaa FederationTestPlc1 [550] +02: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 None ssh-rsa somekey4plctestbed user2-key1 +3 None ssh-rsa somekey4plctestbed user3-key1 +4 None ssh-rsa somekey4plctestbed user4-key1 +5 None ssh-rsa somekey4plctestbed user5-key1 +6 None ssh-rsa somekey4plctestbed user6-key1 +7 None ssh-rsa somekey4plctestbed user7-key1 +8 None ssh-rsa somekey4plctestbed user8-key1 +9 None ssh-rsa somekey4plctestbed user9-key1 +10 None ssh-rsa somekey4plctestbed user10-key1 +11 None ssh-rsa somekey4plctestbed user11-key1 +12 None ssh-rsa somekey4plctestbed user12-key1 +13 None ssh-rsa somekey4plctestbed user13-key1 +14 None ssh-rsa somekey4plctestbed user14-key1 +15 None ssh-rsa somekey4plctestbed user15-key1 +16 None ssh-rsa somekey4plctestbed user16-key1 +17 None ssh-rsa somekey4plctestbed user17-key1 +18 None ssh-rsa somekey4plctestbed user18-key1 +19 None ssh-rsa somekey4plctestbed user19-key1 +20 None ssh-rsa somekey4plctestbed user20-key1 +21 None ssh-rsa somekey4plctestbed user21-key1 +22 None ssh-rsa somekey4plctestbed user22-key1 +23 None ssh-rsa somekey4plctestbed user23-key1 +24 None ssh-rsa somekey4plctestbed user24-key1 +25 None ssh-rsa somekey4plctestbed user25-key1 +26 None ssh-rsa somekey4plctestbed user26-key1 +27 None ssh-rsa somekey4plctestbed user27-key1 +28 None ssh-rsa somekey4plctestbed user28-key1 +29 None ssh-rsa somekey4plctestbed user29-key1 +30 None ssh-rsa somekey4plctestbed user30-key1 +31 None ssh-rsa somekey4plctestbed user31-key1 +32 None ssh-rsa somekey4plctestbed user32-key1 +33 None ssh-rsa somekey4plctestbed user33-key1 +34 None ssh-rsa somekey4plctestbed user34-key1 +35 None ssh-rsa somekey4plctestbed user35-key1 +36 None ssh-rsa somekey4plctestbed user36-key1 +37 None ssh-rsa somekey4plctestbed user37-key1 +38 None ssh-rsa somekey4plctestbed user38-key1 +39 None ssh-rsa somekey4plctestbed user39-key1 +40 None ssh-rsa somekey4plctestbed user40-key1 +41 None ssh-rsa somekey4plctestbed user41-key1 +42 None ssh-rsa somekey4plctestbed user42-key1 +43 None ssh-rsa somekey4plctestbed user43-key1 +44 None ssh-rsa somekey4plctestbed user44-key1 +45 None ssh-rsa somekey4plctestbed user45-key1 +46 None ssh-rsa somekey4plctestbed user46-key1 +47 None ssh-rsa somekey4plctestbed user47-key1 +48 None ssh-rsa somekey4plctestbed user48-key1 +49 None ssh-rsa somekey4plctestbed user49-key1 +50 None ssh-rsa somekey4plctestbed user50-key1 +51 None ssh-rsa somekey4plctestbed user51-key1 +52 None ssh-rsa somekey4plctestbed user52-key1 +53 None ssh-rsa somekey4plctestbed user53-key1 +54 None ssh-rsa somekey4plctestbed user54-key1 +55 None ssh-rsa somekey4plctestbed user55-key1 +56 None ssh-rsa somekey4plctestbed user56-key1 +57 None ssh-rsa somekey4plctestbed user57-key1 +58 None ssh-rsa somekey4plctestbed user58-key1 +59 None ssh-rsa somekey4plctestbed user59-key1 +60 None ssh-rsa somekey4plctestbed user60-key1 +61 None ssh-rsa somekey4plctestbed user61-key1 +62 None ssh-rsa somekey4plctestbed user62-key1 +63 None ssh-rsa somekey4plctestbed user63-key1 +64 None ssh-rsa somekey4plctestbed user64-key1 +65 None ssh-rsa somekey4plctestbed user65-key1 +66 None ssh-rsa somekey4plctestbed user66-key1 +67 None ssh-rsa somekey4plctestbed user67-key1 +68 None ssh-rsa somekey4plctestbed user68-key1 +69 None ssh-rsa somekey4plctestbed user69-key1 +70 None ssh-rsa somekey4plctestbed user70-key1 +71 None ssh-rsa somekey4plctestbed user71-key1 +72 None ssh-rsa somekey4plctestbed user72-key1 +73 None ssh-rsa somekey4plctestbed user73-key1 +74 None ssh-rsa somekey4plctestbed user74-key1 +75 None ssh-rsa somekey4plctestbed user75-key1 +76 None ssh-rsa somekey4plctestbed user76-key1 +77 None ssh-rsa somekey4plctestbed user77-key1 +78 None ssh-rsa somekey4plctestbed user78-key1 +79 None ssh-rsa somekey4plctestbed user79-key1 +80 None ssh-rsa somekey4plctestbed user80-key1 +81 None ssh-rsa somekey4plctestbed user81-key1 +82 None ssh-rsa somekey4plctestbed user82-key1 +83 None ssh-rsa somekey4plctestbed user83-key1 +84 None ssh-rsa somekey4plctestbed user84-key1 +85 None ssh-rsa somekey4plctestbed user85-key1 +86 None ssh-rsa somekey4plctestbed user86-key1 +87 None ssh-rsa somekey4plctestbed user87-key1 +88 None ssh-rsa somekey4plctestbed user88-key1 +89 None ssh-rsa somekey4plctestbed user89-key1 +90 None ssh-rsa somekey4plctestbed user90-key1 +91 None ssh-rsa somekey4plctestbed user91-key1 +92 None ssh-rsa somekey4plctestbed user92-key1 +93 None ssh-rsa somekey4plctestbed user93-key1 +94 None ssh-rsa somekey4plctestbed user94-key1 +95 None ssh-rsa somekey4plctestbed user95-key1 +96 None ssh-rsa somekey4plctestbed user96-key1 +97 None ssh-rsa somekey4plctestbed user97-key1 +98 None ssh-rsa somekey4plctestbed user98-key1 +99 None ssh-rsa somekey4plctestbed user99-key1 +100 None ssh-rsa somekey4plctestbed user100-key1 +101 None ssh-rsa somekey4plctestbed user101-key1 +102 None ssh-rsa somekey4plctestbed user102-key1 +103 None ssh-rsa somekey4plctestbed user103-key1 +104 None ssh-rsa somekey4plctestbed user104-key1 +105 None ssh-rsa somekey4plctestbed user105-key1 +106 None ssh-rsa somekey4plctestbed user106-key1 +107 None ssh-rsa somekey4plctestbed user107-key1 +108 None ssh-rsa somekey4plctestbed user108-key1 +109 None ssh-rsa somekey4plctestbed user109-key1 +110 None ssh-rsa somekey4plctestbed user110-key1 +111 None ssh-rsa somekey4plctestbed user111-key1 +112 None ssh-rsa somekey4plctestbed user112-key1 +113 None ssh-rsa somekey4plctestbed user113-key1 +114 None ssh-rsa somekey4plctestbed user114-key1 +115 None ssh-rsa somekey4plctestbed user115-key1 +116 None ssh-rsa somekey4plctestbed user116-key1 +117 None ssh-rsa somekey4plctestbed user117-key1 +118 None ssh-rsa somekey4plctestbed user118-key1 +119 None ssh-rsa somekey4plctestbed user119-key1 +120 None ssh-rsa somekey4plctestbed user120-key1 +121 None ssh-rsa somekey4plctestbed user121-key1 +122 None ssh-rsa somekey4plctestbed user122-key1 +123 None ssh-rsa somekey4plctestbed user123-key1 +124 None ssh-rsa somekey4plctestbed user124-key1 +125 None ssh-rsa somekey4plctestbed user125-key1 +126 None ssh-rsa somekey4plctestbed user126-key1 +127 None ssh-rsa somekey4plctestbed user127-key1 +128 None ssh-rsa somekey4plctestbed user128-key1 +129 None ssh-rsa somekey4plctestbed user129-key1 +130 None ssh-rsa somekey4plctestbed user130-key1 +131 None ssh-rsa somekey4plctestbed user131-key1 +132 None ssh-rsa somekey4plctestbed user132-key1 +133 None ssh-rsa somekey4plctestbed user133-key1 +134 None ssh-rsa somekey4plctestbed user134-key1 +135 None ssh-rsa somekey4plctestbed user135-key1 +136 None ssh-rsa somekey4plctestbed user136-key1 +137 None ssh-rsa somekey4plctestbed user137-key1 +138 None ssh-rsa somekey4plctestbed user138-key1 +139 None ssh-rsa somekey4plctestbed user139-key1 +140 None ssh-rsa somekey4plctestbed user140-key1 +141 None ssh-rsa somekey4plctestbed user141-key1 +142 None ssh-rsa somekey4plctestbed user142-key1 +143 None ssh-rsa somekey4plctestbed user143-key1 +144 None ssh-rsa somekey4plctestbed user144-key1 +145 None ssh-rsa somekey4plctestbed user145-key1 +146 None ssh-rsa somekey4plctestbed user146-key1 +147 None ssh-rsa somekey4plctestbed user147-key1 +148 None ssh-rsa somekey4plctestbed user148-key1 +149 None ssh-rsa somekey4plctestbed user149-key1 +150 None ssh-rsa somekey4plctestbed user150-key1 +151 None ssh-rsa somekey4plctestbed user151-key1 +152 None ssh-rsa somekey4plctestbed user152-key1 +153 None ssh-rsa somekey4plctestbed user153-key1 +154 None ssh-rsa somekey4plctestbed user154-key1 +155 None ssh-rsa somekey4plctestbed user155-key1 +156 None ssh-rsa somekey4plctestbed user156-key1 +157 None ssh-rsa somekey4plctestbed user157-key1 +158 None ssh-rsa somekey4plctestbed user158-key1 +159 None ssh-rsa somekey4plctestbed user159-key1 +160 None ssh-rsa somekey4plctestbed user160-key1 +161 None ssh-rsa somekey4plctestbed user161-key1 +162 None ssh-rsa somekey4plctestbed user162-key1 +163 None ssh-rsa somekey4plctestbed user163-key1 +164 None ssh-rsa somekey4plctestbed user164-key1 +165 None ssh-rsa somekey4plctestbed user165-key1 +166 None ssh-rsa somekey4plctestbed user166-key1 +167 None ssh-rsa somekey4plctestbed user167-key1 +168 None ssh-rsa somekey4plctestbed user168-key1 +169 None ssh-rsa somekey4plctestbed user169-key1 +170 None ssh-rsa somekey4plctestbed user170-key1 +171 None ssh-rsa somekey4plctestbed user171-key1 +172 None ssh-rsa somekey4plctestbed user172-key1 +173 None ssh-rsa somekey4plctestbed user173-key1 +174 None ssh-rsa somekey4plctestbed user174-key1 +175 None ssh-rsa somekey4plctestbed user175-key1 +176 None ssh-rsa somekey4plctestbed user176-key1 +177 None ssh-rsa somekey4plctestbed user177-key1 +178 None ssh-rsa somekey4plctestbed user178-key1 +179 None ssh-rsa somekey4plctestbed user179-key1 +180 None ssh-rsa somekey4plctestbed user180-key1 +181 None ssh-rsa somekey4plctestbed user181-key1 +182 None ssh-rsa somekey4plctestbed user182-key1 +183 None ssh-rsa somekey4plctestbed user183-key1 +184 None ssh-rsa somekey4plctestbed user184-key1 +185 None ssh-rsa somekey4plctestbed user185-key1 +186 None ssh-rsa somekey4plctestbed user186-key1 +187 None ssh-rsa somekey4plctestbed user187-key1 +188 None ssh-rsa somekey4plctestbed user188-key1 +189 None ssh-rsa somekey4plctestbed user189-key1 +190 None ssh-rsa somekey4plctestbed user190-key1 +191 None ssh-rsa somekey4plctestbed user191-key1 +192 None ssh-rsa somekey4plctestbed user192-key1 +193 None ssh-rsa somekey4plctestbed user193-key1 +194 None ssh-rsa somekey4plctestbed user194-key1 +195 None ssh-rsa somekey4plctestbed user195-key1 +196 None ssh-rsa somekey4plctestbed user196-key1 +197 None ssh-rsa somekey4plctestbed user197-key1 +198 None ssh-rsa somekey4plctestbed user198-key1 +199 None ssh-rsa somekey4plctestbed user199-key1 +200 None ssh-rsa somekey4plctestbed user200-key1 +201 None ssh-rsa somekey4plctestbed user201-key1 +202 None ssh-rsa somekey4plctestbed user202-key1 +203 None ssh-rsa somekey4plctestbed user203-key1 +204 None ssh-rsa somekey4plctestbed user204-key1 +205 None ssh-rsa somekey4plctestbed user205-key1 +206 None ssh-rsa somekey4plctestbed user206-key1 +207 None ssh-rsa somekey4plctestbed user207-key1 +208 None ssh-rsa somekey4plctestbed user208-key1 +209 None ssh-rsa somekey4plctestbed user209-key1 +210 None ssh-rsa somekey4plctestbed user210-key1 +211 None ssh-rsa somekey4plctestbed user211-key1 +212 None ssh-rsa somekey4plctestbed user212-key1 +213 None ssh-rsa somekey4plctestbed user213-key1 +214 None ssh-rsa somekey4plctestbed user214-key1 +215 None ssh-rsa somekey4plctestbed user215-key1 +216 None ssh-rsa somekey4plctestbed user216-key1 +217 None ssh-rsa somekey4plctestbed user217-key1 +218 None ssh-rsa somekey4plctestbed user218-key1 +219 None ssh-rsa somekey4plctestbed user219-key1 +220 None ssh-rsa somekey4plctestbed user220-key1 +221 None ssh-rsa somekey4plctestbed user221-key1 +222 None ssh-rsa somekey4plctestbed user222-key1 +223 None ssh-rsa somekey4plctestbed user223-key1 +224 None ssh-rsa somekey4plctestbed user224-key1 +225 None ssh-rsa somekey4plctestbed user225-key1 +226 None ssh-rsa somekey4plctestbed user226-key1 +227 None ssh-rsa somekey4plctestbed user227-key1 +228 None ssh-rsa somekey4plctestbed user228-key1 +229 None ssh-rsa somekey4plctestbed user229-key1 +230 None ssh-rsa somekey4plctestbed user230-key1 +231 None ssh-rsa somekey4plctestbed user231-key1 +232 None ssh-rsa somekey4plctestbed user232-key1 +233 None ssh-rsa somekey4plctestbed user233-key1 +234 None ssh-rsa somekey4plctestbed user234-key1 +235 None ssh-rsa somekey4plctestbed user235-key1 +236 None ssh-rsa somekey4plctestbed user236-key1 +237 None ssh-rsa somekey4plctestbed user237-key1 +238 None ssh-rsa somekey4plctestbed user238-key1 +239 None ssh-rsa somekey4plctestbed user239-key1 +240 None ssh-rsa somekey4plctestbed user240-key1 +241 None ssh-rsa somekey4plctestbed user241-key1 +242 None ssh-rsa somekey4plctestbed user242-key1 +243 None ssh-rsa somekey4plctestbed user243-key1 +244 None ssh-rsa somekey4plctestbed user244-key1 +245 None ssh-rsa somekey4plctestbed user245-key1 +246 None ssh-rsa somekey4plctestbed user246-key1 +247 None ssh-rsa somekey4plctestbed user247-key1 +248 None ssh-rsa somekey4plctestbed user248-key1 +249 None ssh-rsa somekey4plctestbed user249-key1 +250 None ssh-rsa somekey4plctestbed user250-key1 +251 None ssh-rsa somekey4plctestbed user251-key1 +252 None ssh-rsa somekey4plctestbed user252-key1 +253 None ssh-rsa somekey4plctestbed user253-key1 +254 None ssh-rsa somekey4plctestbed user254-key1 +255 None ssh-rsa somekey4plctestbed user255-key1 +256 None ssh-rsa somekey4plctestbed user256-key1 +257 None ssh-rsa somekey4plctestbed user257-key1 +258 None ssh-rsa somekey4plctestbed user258-key1 +259 None ssh-rsa somekey4plctestbed user259-key1 +260 None ssh-rsa somekey4plctestbed user260-key1 +261 None ssh-rsa somekey4plctestbed user261-key1 +262 None ssh-rsa somekey4plctestbed user262-key1 +263 None ssh-rsa somekey4plctestbed user263-key1 +264 None ssh-rsa somekey4plctestbed user264-key1 +265 None ssh-rsa somekey4plctestbed user265-key1 +266 None ssh-rsa somekey4plctestbed user266-key1 +267 None ssh-rsa somekey4plctestbed user267-key1 +268 None ssh-rsa somekey4plctestbed user268-key1 +269 None ssh-rsa somekey4plctestbed user269-key1 +270 None ssh-rsa somekey4plctestbed user270-key1 +271 None ssh-rsa somekey4plctestbed user271-key1 +272 None ssh-rsa somekey4plctestbed user272-key1 +273 None ssh-rsa somekey4plctestbed user273-key1 +274 None ssh-rsa somekey4plctestbed user274-key1 +275 None ssh-rsa somekey4plctestbed user275-key1 +276 None ssh-rsa somekey4plctestbed user276-key1 +277 None ssh-rsa somekey4plctestbed user277-key1 +278 None ssh-rsa somekey4plctestbed user278-key1 +279 None ssh-rsa somekey4plctestbed user279-key1 +280 None ssh-rsa somekey4plctestbed user280-key1 +281 None ssh-rsa somekey4plctestbed user281-key1 +282 None ssh-rsa somekey4plctestbed user282-key1 +283 None ssh-rsa somekey4plctestbed user283-key1 +284 None ssh-rsa somekey4plctestbed user284-key1 +285 None ssh-rsa somekey4plctestbed user285-key1 +286 None ssh-rsa somekey4plctestbed user286-key1 +287 None ssh-rsa somekey4plctestbed user287-key1 +288 None ssh-rsa somekey4plctestbed user288-key1 +289 None ssh-rsa somekey4plctestbed user289-key1 +290 None ssh-rsa somekey4plctestbed user290-key1 +291 None ssh-rsa somekey4plctestbed user291-key1 +292 None ssh-rsa somekey4plctestbed user292-key1 +293 None ssh-rsa somekey4plctestbed user293-key1 +294 None ssh-rsa somekey4plctestbed user294-key1 +295 None ssh-rsa somekey4plctestbed user295-key1 +296 None ssh-rsa somekey4plctestbed user296-key1 +297 None ssh-rsa somekey4plctestbed user297-key1 +298 None ssh-rsa somekey4plctestbed user298-key1 +299 None ssh-rsa somekey4plctestbed user299-key1 +300 None ssh-rsa somekey4plctestbed user300-key1 +301 None ssh-rsa somekey4plctestbed user301-key1 +302 None ssh-rsa somekey4plctestbed user302-key1 +303 None ssh-rsa somekey4plctestbed user303-key1 +304 None ssh-rsa somekey4plctestbed user304-key1 +305 None ssh-rsa somekey4plctestbed user305-key1 +306 None ssh-rsa somekey4plctestbed user306-key1 +307 None ssh-rsa somekey4plctestbed user307-key1 +308 None ssh-rsa somekey4plctestbed user308-key1 +309 None ssh-rsa somekey4plctestbed user309-key1 +310 None ssh-rsa somekey4plctestbed user310-key1 +311 None ssh-rsa somekey4plctestbed user311-key1 +312 None ssh-rsa somekey4plctestbed user312-key1 +313 None ssh-rsa somekey4plctestbed user313-key1 +314 None ssh-rsa somekey4plctestbed user314-key1 +315 None ssh-rsa somekey4plctestbed user315-key1 +316 None ssh-rsa somekey4plctestbed user316-key1 +317 None ssh-rsa somekey4plctestbed user317-key1 +318 None ssh-rsa somekey4plctestbed user318-key1 +319 None ssh-rsa somekey4plctestbed user319-key1 +320 None ssh-rsa somekey4plctestbed user320-key1 +321 None ssh-rsa somekey4plctestbed user321-key1 +322 None ssh-rsa somekey4plctestbed user322-key1 +323 None ssh-rsa somekey4plctestbed user323-key1 +324 None ssh-rsa somekey4plctestbed user324-key1 +325 None ssh-rsa somekey4plctestbed user325-key1 +326 None ssh-rsa somekey4plctestbed user326-key1 +327 None ssh-rsa somekey4plctestbed user327-key1 +328 None ssh-rsa somekey4plctestbed user328-key1 +329 None ssh-rsa somekey4plctestbed user329-key1 +330 None ssh-rsa somekey4plctestbed user330-key1 +331 None ssh-rsa somekey4plctestbed user331-key1 +332 None ssh-rsa somekey4plctestbed user332-key1 +333 None ssh-rsa somekey4plctestbed user333-key1 +334 None ssh-rsa somekey4plctestbed user334-key1 +335 None ssh-rsa somekey4plctestbed user335-key1 +336 None ssh-rsa somekey4plctestbed user336-key1 +337 None ssh-rsa somekey4plctestbed user337-key1 +338 None ssh-rsa somekey4plctestbed user338-key1 +339 None ssh-rsa somekey4plctestbed user339-key1 +340 None ssh-rsa somekey4plctestbed user340-key1 +341 None ssh-rsa somekey4plctestbed user341-key1 +342 None ssh-rsa somekey4plctestbed user342-key1 +343 None ssh-rsa somekey4plctestbed user343-key1 +344 None ssh-rsa somekey4plctestbed user344-key1 +345 None ssh-rsa somekey4plctestbed user345-key1 +346 None ssh-rsa somekey4plctestbed user346-key1 +347 None ssh-rsa somekey4plctestbed user347-key1 +348 None ssh-rsa somekey4plctestbed user348-key1 +349 None ssh-rsa somekey4plctestbed user349-key1 +350 None ssh-rsa somekey4plctestbed user350-key1 +351 None ssh-rsa somekey4plctestbed user351-key1 +352 None ssh-rsa somekey4plctestbed user352-key1 +353 None ssh-rsa somekey4plctestbed user353-key1 +354 None ssh-rsa somekey4plctestbed user354-key1 +355 None ssh-rsa somekey4plctestbed user355-key1 +356 None ssh-rsa somekey4plctestbed user356-key1 +357 None ssh-rsa somekey4plctestbed user357-key1 +358 None ssh-rsa somekey4plctestbed user358-key1 +359 None ssh-rsa somekey4plctestbed user359-key1 +360 None ssh-rsa somekey4plctestbed user360-key1 +361 None ssh-rsa somekey4plctestbed user361-key1 +362 None ssh-rsa somekey4plctestbed user362-key1 +363 None ssh-rsa somekey4plctestbed user363-key1 +364 None ssh-rsa somekey4plctestbed user364-key1 +365 None ssh-rsa somekey4plctestbed user365-key1 +366 None ssh-rsa somekey4plctestbed user366-key1 +367 None ssh-rsa somekey4plctestbed user367-key1 +368 None ssh-rsa somekey4plctestbed user368-key1 +369 None ssh-rsa somekey4plctestbed user369-key1 +370 None ssh-rsa somekey4plctestbed user370-key1 +371 None ssh-rsa somekey4plctestbed user371-key1 +372 None ssh-rsa somekey4plctestbed user372-key1 +373 None ssh-rsa somekey4plctestbed user373-key1 +374 None ssh-rsa somekey4plctestbed user374-key1 +375 None ssh-rsa somekey4plctestbed user375-key1 +376 None ssh-rsa somekey4plctestbed user376-key1 +377 None ssh-rsa somekey4plctestbed user377-key1 +378 None ssh-rsa somekey4plctestbed user378-key1 +379 None ssh-rsa somekey4plctestbed user379-key1 +380 None ssh-rsa somekey4plctestbed user380-key1 +381 None ssh-rsa somekey4plctestbed user381-key1 +382 None ssh-rsa somekey4plctestbed user382-key1 +383 None ssh-rsa somekey4plctestbed user383-key1 +384 None ssh-rsa somekey4plctestbed user384-key1 +385 None ssh-rsa somekey4plctestbed user385-key1 +386 None ssh-rsa somekey4plctestbed user386-key1 +387 None ssh-rsa somekey4plctestbed user387-key1 +388 None ssh-rsa somekey4plctestbed user388-key1 +389 None ssh-rsa somekey4plctestbed user389-key1 +390 None ssh-rsa somekey4plctestbed user390-key1 +391 None ssh-rsa somekey4plctestbed user391-key1 +392 None ssh-rsa somekey4plctestbed user392-key1 +393 None ssh-rsa somekey4plctestbed user393-key1 +394 None ssh-rsa somekey4plctestbed user394-key1 +395 None ssh-rsa somekey4plctestbed user395-key1 +396 None ssh-rsa somekey4plctestbed user396-key1 +397 None ssh-rsa somekey4plctestbed user397-key1 +398 None ssh-rsa somekey4plctestbed user398-key1 +399 None ssh-rsa somekey4plctestbed user399-key1 +400 None ssh-rsa somekey4plctestbed user400-key1 +401 None ssh-rsa somekey4plctestbed user401-key1 +402 None ssh-rsa somekey4plctestbed user402-key1 +403 None ssh-rsa somekey4plctestbed user403-key1 +404 None ssh-rsa somekey4plctestbed user404-key1 +405 None ssh-rsa somekey4plctestbed user405-key1 +406 None ssh-rsa somekey4plctestbed user406-key1 +407 None ssh-rsa somekey4plctestbed user407-key1 +408 None ssh-rsa somekey4plctestbed user408-key1 +409 None ssh-rsa somekey4plctestbed user409-key1 +410 None ssh-rsa somekey4plctestbed user410-key1 +411 None ssh-rsa somekey4plctestbed user411-key1 +412 None ssh-rsa somekey4plctestbed user412-key1 +413 None ssh-rsa somekey4plctestbed user413-key1 +414 None ssh-rsa somekey4plctestbed user414-key1 +415 None ssh-rsa somekey4plctestbed user415-key1 +416 None ssh-rsa somekey4plctestbed user416-key1 +417 None ssh-rsa somekey4plctestbed user417-key1 +418 None ssh-rsa somekey4plctestbed user418-key1 +419 None ssh-rsa somekey4plctestbed user419-key1 +420 None ssh-rsa somekey4plctestbed user420-key1 +421 None ssh-rsa somekey4plctestbed user421-key1 +422 None ssh-rsa somekey4plctestbed user422-key1 +423 None ssh-rsa somekey4plctestbed user423-key1 +424 None ssh-rsa somekey4plctestbed user424-key1 +425 None ssh-rsa somekey4plctestbed user425-key1 +426 None ssh-rsa somekey4plctestbed user426-key1 +427 None ssh-rsa somekey4plctestbed user427-key1 +428 None ssh-rsa somekey4plctestbed user428-key1 +429 None ssh-rsa somekey4plctestbed user429-key1 +430 None ssh-rsa somekey4plctestbed user430-key1 +431 None ssh-rsa somekey4plctestbed user431-key1 +432 None ssh-rsa somekey4plctestbed user432-key1 +433 None ssh-rsa somekey4plctestbed user433-key1 +434 None ssh-rsa somekey4plctestbed user434-key1 +435 None ssh-rsa somekey4plctestbed user435-key1 +436 None ssh-rsa somekey4plctestbed user436-key1 +437 None ssh-rsa somekey4plctestbed user437-key1 +438 None ssh-rsa somekey4plctestbed user438-key1 +439 None ssh-rsa somekey4plctestbed user439-key1 +440 None ssh-rsa somekey4plctestbed user440-key1 +441 None ssh-rsa somekey4plctestbed user441-key1 +442 None ssh-rsa somekey4plctestbed user442-key1 +443 None ssh-rsa somekey4plctestbed user443-key1 +444 None ssh-rsa somekey4plctestbed user444-key1 +445 None ssh-rsa somekey4plctestbed user445-key1 +446 None ssh-rsa somekey4plctestbed user446-key1 +447 None ssh-rsa somekey4plctestbed user447-key1 +448 None ssh-rsa somekey4plctestbed user448-key1 +449 None ssh-rsa somekey4plctestbed user449-key1 +450 None ssh-rsa somekey4plctestbed user450-key1 +451 None ssh-rsa somekey4plctestbed user451-key1 +452 None ssh-rsa somekey4plctestbed user452-key1 +453 None ssh-rsa somekey4plctestbed user453-key1 +454 None ssh-rsa somekey4plctestbed user454-key1 +455 None ssh-rsa somekey4plctestbed user455-key1 +456 None ssh-rsa somekey4plctestbed user456-key1 +457 None ssh-rsa somekey4plctestbed user457-key1 +458 None ssh-rsa somekey4plctestbed user458-key1 +459 None ssh-rsa somekey4plctestbed user459-key1 +460 None ssh-rsa somekey4plctestbed user460-key1 +461 None ssh-rsa somekey4plctestbed user461-key1 +462 None ssh-rsa somekey4plctestbed user462-key1 +463 None ssh-rsa somekey4plctestbed user463-key1 +464 None ssh-rsa somekey4plctestbed user464-key1 +465 None ssh-rsa somekey4plctestbed user465-key1 +466 None ssh-rsa somekey4plctestbed user466-key1 +467 None ssh-rsa somekey4plctestbed user467-key1 +468 None ssh-rsa somekey4plctestbed user468-key1 +469 None ssh-rsa somekey4plctestbed user469-key1 +470 None ssh-rsa somekey4plctestbed user470-key1 +471 None ssh-rsa somekey4plctestbed user471-key1 +472 None ssh-rsa somekey4plctestbed user472-key1 +473 None ssh-rsa somekey4plctestbed user473-key1 +474 None ssh-rsa somekey4plctestbed user474-key1 +475 None ssh-rsa somekey4plctestbed user475-key1 +476 None ssh-rsa somekey4plctestbed user476-key1 +477 None ssh-rsa somekey4plctestbed user477-key1 +478 None ssh-rsa somekey4plctestbed user478-key1 +479 None ssh-rsa somekey4plctestbed user479-key1 +480 None ssh-rsa somekey4plctestbed user480-key1 +481 None ssh-rsa somekey4plctestbed user481-key1 +482 None ssh-rsa somekey4plctestbed user482-key1 +483 None ssh-rsa somekey4plctestbed user483-key1 +484 None ssh-rsa somekey4plctestbed user484-key1 +485 None ssh-rsa somekey4plctestbed user485-key1 +486 None ssh-rsa somekey4plctestbed user486-key1 +487 None ssh-rsa somekey4plctestbed user487-key1 +488 None ssh-rsa somekey4plctestbed user488-key1 +489 None ssh-rsa somekey4plctestbed user489-key1 +490 None ssh-rsa somekey4plctestbed user490-key1 +491 None ssh-rsa somekey4plctestbed user491-key1 +492 None ssh-rsa somekey4plctestbed user492-key1 +493 None ssh-rsa somekey4plctestbed user493-key1 +494 None ssh-rsa somekey4plctestbed user494-key1 +495 None ssh-rsa somekey4plctestbed user495-key1 +496 None ssh-rsa somekey4plctestbed user496-key1 +497 None ssh-rsa somekey4plctestbed user497-key1 +498 None ssh-rsa somekey4plctestbed user498-key1 +499 None ssh-rsa somekey4plctestbed user499-key1 +500 None ssh-rsa somekey4plctestbed user500-key1 +501 1 ssh-rsa somekey4plctestbed user1-key1 +502 1 ssh-rsa somekey4plctestbed user2-key1 +503 1 ssh-rsa somekey4plctestbed user3-key1 +504 1 ssh-rsa somekey4plctestbed user4-key1 +505 1 ssh-rsa somekey4plctestbed user5-key1 +506 1 ssh-rsa somekey4plctestbed user6-key1 +507 1 ssh-rsa somekey4plctestbed user7-key1 +508 1 ssh-rsa somekey4plctestbed user8-key1 +509 1 ssh-rsa somekey4plctestbed user9-key1 +510 1 ssh-rsa somekey4plctestbed user10-key1 +511 1 ssh-rsa somekey4plctestbed user11-key1 +512 1 ssh-rsa somekey4plctestbed user12-key1 +513 1 ssh-rsa somekey4plctestbed user13-key1 +514 1 ssh-rsa somekey4plctestbed user14-key1 +515 1 ssh-rsa somekey4plctestbed user15-key1 +516 1 ssh-rsa somekey4plctestbed user16-key1 +517 1 ssh-rsa somekey4plctestbed user17-key1 +518 1 ssh-rsa somekey4plctestbed user18-key1 +519 1 ssh-rsa somekey4plctestbed user19-key1 +520 1 ssh-rsa somekey4plctestbed user20-key1 +521 1 ssh-rsa somekey4plctestbed user21-key1 +522 1 ssh-rsa somekey4plctestbed user22-key1 +523 1 ssh-rsa somekey4plctestbed user23-key1 +524 1 ssh-rsa somekey4plctestbed user24-key1 +525 1 ssh-rsa somekey4plctestbed user25-key1 +526 1 ssh-rsa somekey4plctestbed user26-key1 +527 1 ssh-rsa somekey4plctestbed user27-key1 +528 1 ssh-rsa somekey4plctestbed user28-key1 +529 1 ssh-rsa somekey4plctestbed user29-key1 +530 1 ssh-rsa somekey4plctestbed user30-key1 +531 1 ssh-rsa somekey4plctestbed user31-key1 +532 1 ssh-rsa somekey4plctestbed user32-key1 +533 1 ssh-rsa somekey4plctestbed user33-key1 +534 1 ssh-rsa somekey4plctestbed user34-key1 +535 1 ssh-rsa somekey4plctestbed user35-key1 +536 1 ssh-rsa somekey4plctestbed user36-key1 +537 1 ssh-rsa somekey4plctestbed user37-key1 +538 1 ssh-rsa somekey4plctestbed user38-key1 +539 1 ssh-rsa somekey4plctestbed user39-key1 +540 1 ssh-rsa somekey4plctestbed user40-key1 +541 1 ssh-rsa somekey4plctestbed user41-key1 +542 1 ssh-rsa somekey4plctestbed user42-key1 +543 1 ssh-rsa somekey4plctestbed user43-key1 +544 1 ssh-rsa somekey4plctestbed user44-key1 +545 1 ssh-rsa somekey4plctestbed user45-key1 +546 1 ssh-rsa somekey4plctestbed user46-key1 +547 1 ssh-rsa somekey4plctestbed user47-key1 +548 1 ssh-rsa somekey4plctestbed user48-key1 +549 1 ssh-rsa somekey4plctestbed user49-key1 +550 1 ssh-rsa somekey4plctestbed user50-key1 +551 1 ssh-rsa somekey4plctestbed user51-key1 +552 1 ssh-rsa somekey4plctestbed user52-key1 +553 1 ssh-rsa somekey4plctestbed user53-key1 +554 1 ssh-rsa somekey4plctestbed user54-key1 +555 1 ssh-rsa somekey4plctestbed user55-key1 +556 1 ssh-rsa somekey4plctestbed user56-key1 +557 1 ssh-rsa somekey4plctestbed user57-key1 +558 1 ssh-rsa somekey4plctestbed user58-key1 +559 1 ssh-rsa somekey4plctestbed user59-key1 +560 1 ssh-rsa somekey4plctestbed user60-key1 +561 1 ssh-rsa somekey4plctestbed user61-key1 +562 1 ssh-rsa somekey4plctestbed user62-key1 +563 1 ssh-rsa somekey4plctestbed user63-key1 +564 1 ssh-rsa somekey4plctestbed user64-key1 +565 1 ssh-rsa somekey4plctestbed user65-key1 +566 1 ssh-rsa somekey4plctestbed user66-key1 +567 1 ssh-rsa somekey4plctestbed user67-key1 +568 1 ssh-rsa somekey4plctestbed user68-key1 +569 1 ssh-rsa somekey4plctestbed user69-key1 +570 1 ssh-rsa somekey4plctestbed user70-key1 +571 1 ssh-rsa somekey4plctestbed user71-key1 +572 1 ssh-rsa somekey4plctestbed user72-key1 +573 1 ssh-rsa somekey4plctestbed user73-key1 +574 1 ssh-rsa somekey4plctestbed user74-key1 +575 1 ssh-rsa somekey4plctestbed user75-key1 +576 1 ssh-rsa somekey4plctestbed user76-key1 +577 1 ssh-rsa somekey4plctestbed user77-key1 +578 1 ssh-rsa somekey4plctestbed user78-key1 +579 1 ssh-rsa somekey4plctestbed user79-key1 +580 1 ssh-rsa somekey4plctestbed user80-key1 +581 1 ssh-rsa somekey4plctestbed user81-key1 +582 1 ssh-rsa somekey4plctestbed user82-key1 +583 1 ssh-rsa somekey4plctestbed user83-key1 +584 1 ssh-rsa somekey4plctestbed user84-key1 +585 1 ssh-rsa somekey4plctestbed user85-key1 +586 1 ssh-rsa somekey4plctestbed user86-key1 +587 1 ssh-rsa somekey4plctestbed user87-key1 +588 1 ssh-rsa somekey4plctestbed user88-key1 +589 1 ssh-rsa somekey4plctestbed user89-key1 +590 1 ssh-rsa somekey4plctestbed user90-key1 +591 1 ssh-rsa somekey4plctestbed user91-key1 +592 1 ssh-rsa somekey4plctestbed user92-key1 +593 1 ssh-rsa somekey4plctestbed user93-key1 +594 1 ssh-rsa somekey4plctestbed user94-key1 +595 1 ssh-rsa somekey4plctestbed user95-key1 +596 1 ssh-rsa somekey4plctestbed user96-key1 +597 1 ssh-rsa somekey4plctestbed user97-key1 +598 1 ssh-rsa somekey4plctestbed user98-key1 +599 1 ssh-rsa somekey4plctestbed user99-key1 +600 1 ssh-rsa somekey4plctestbed user100-key1 +601 1 ssh-rsa somekey4plctestbed user101-key1 +602 1 ssh-rsa somekey4plctestbed user102-key1 +603 1 ssh-rsa somekey4plctestbed user103-key1 +604 1 ssh-rsa somekey4plctestbed user104-key1 +605 1 ssh-rsa somekey4plctestbed user105-key1 +606 1 ssh-rsa somekey4plctestbed user106-key1 +607 1 ssh-rsa somekey4plctestbed user107-key1 +608 1 ssh-rsa somekey4plctestbed user108-key1 +609 1 ssh-rsa somekey4plctestbed user109-key1 +610 1 ssh-rsa somekey4plctestbed user110-key1 +611 1 ssh-rsa somekey4plctestbed user111-key1 +612 1 ssh-rsa somekey4plctestbed user112-key1 +613 1 ssh-rsa somekey4plctestbed user113-key1 +614 1 ssh-rsa somekey4plctestbed user114-key1 +615 1 ssh-rsa somekey4plctestbed user115-key1 +616 1 ssh-rsa somekey4plctestbed user116-key1 +617 1 ssh-rsa somekey4plctestbed user117-key1 +618 1 ssh-rsa somekey4plctestbed user118-key1 +619 1 ssh-rsa somekey4plctestbed user119-key1 +620 1 ssh-rsa somekey4plctestbed user120-key1 +621 1 ssh-rsa somekey4plctestbed user121-key1 +622 1 ssh-rsa somekey4plctestbed user122-key1 +623 1 ssh-rsa somekey4plctestbed user123-key1 +624 1 ssh-rsa somekey4plctestbed user124-key1 +625 1 ssh-rsa somekey4plctestbed user125-key1 +626 1 ssh-rsa somekey4plctestbed user126-key1 +627 1 ssh-rsa somekey4plctestbed user127-key1 +628 1 ssh-rsa somekey4plctestbed user128-key1 +629 1 ssh-rsa somekey4plctestbed user129-key1 +630 1 ssh-rsa somekey4plctestbed user130-key1 +631 1 ssh-rsa somekey4plctestbed user131-key1 +632 1 ssh-rsa somekey4plctestbed user132-key1 +633 1 ssh-rsa somekey4plctestbed user133-key1 +634 1 ssh-rsa somekey4plctestbed user134-key1 +635 1 ssh-rsa somekey4plctestbed user135-key1 +636 1 ssh-rsa somekey4plctestbed user136-key1 +637 1 ssh-rsa somekey4plctestbed user137-key1 +638 1 ssh-rsa somekey4plctestbed user138-key1 +639 1 ssh-rsa somekey4plctestbed user139-key1 +640 1 ssh-rsa somekey4plctestbed user140-key1 +641 1 ssh-rsa somekey4plctestbed user141-key1 +642 1 ssh-rsa somekey4plctestbed user142-key1 +643 1 ssh-rsa somekey4plctestbed user143-key1 +644 1 ssh-rsa somekey4plctestbed user144-key1 +645 1 ssh-rsa somekey4plctestbed user145-key1 +646 1 ssh-rsa somekey4plctestbed user146-key1 +647 1 ssh-rsa somekey4plctestbed user147-key1 +648 1 ssh-rsa somekey4plctestbed user148-key1 +649 1 ssh-rsa somekey4plctestbed user149-key1 +650 1 ssh-rsa somekey4plctestbed user150-key1 +651 1 ssh-rsa somekey4plctestbed user151-key1 +652 1 ssh-rsa somekey4plctestbed user152-key1 +653 1 ssh-rsa somekey4plctestbed user153-key1 +654 1 ssh-rsa somekey4plctestbed user154-key1 +655 1 ssh-rsa somekey4plctestbed user155-key1 +656 1 ssh-rsa somekey4plctestbed user156-key1 +657 1 ssh-rsa somekey4plctestbed user157-key1 +658 1 ssh-rsa somekey4plctestbed user158-key1 +659 1 ssh-rsa somekey4plctestbed user159-key1 +660 1 ssh-rsa somekey4plctestbed user160-key1 +661 1 ssh-rsa somekey4plctestbed user161-key1 +662 1 ssh-rsa somekey4plctestbed user162-key1 +663 1 ssh-rsa somekey4plctestbed user163-key1 +664 1 ssh-rsa somekey4plctestbed user164-key1 +665 1 ssh-rsa somekey4plctestbed user165-key1 +666 1 ssh-rsa somekey4plctestbed user166-key1 +667 1 ssh-rsa somekey4plctestbed user167-key1 +668 1 ssh-rsa somekey4plctestbed user168-key1 +669 1 ssh-rsa somekey4plctestbed user169-key1 +670 1 ssh-rsa somekey4plctestbed user170-key1 +671 1 ssh-rsa somekey4plctestbed user171-key1 +672 1 ssh-rsa somekey4plctestbed user172-key1 +673 1 ssh-rsa somekey4plctestbed user173-key1 +674 1 ssh-rsa somekey4plctestbed user174-key1 +675 1 ssh-rsa somekey4plctestbed user175-key1 +676 1 ssh-rsa somekey4plctestbed user176-key1 +677 1 ssh-rsa somekey4plctestbed user177-key1 +678 1 ssh-rsa somekey4plctestbed user178-key1 +679 1 ssh-rsa somekey4plctestbed user179-key1 +680 1 ssh-rsa somekey4plctestbed user180-key1 +681 1 ssh-rsa somekey4plctestbed user181-key1 +682 1 ssh-rsa somekey4plctestbed user182-key1 +683 1 ssh-rsa somekey4plctestbed user183-key1 +684 1 ssh-rsa somekey4plctestbed user184-key1 +685 1 ssh-rsa somekey4plctestbed user185-key1 +686 1 ssh-rsa somekey4plctestbed user186-key1 +687 1 ssh-rsa somekey4plctestbed user187-key1 +688 1 ssh-rsa somekey4plctestbed user188-key1 +689 1 ssh-rsa somekey4plctestbed user189-key1 +690 1 ssh-rsa somekey4plctestbed user190-key1 +691 1 ssh-rsa somekey4plctestbed user191-key1 +692 1 ssh-rsa somekey4plctestbed user192-key1 +693 1 ssh-rsa somekey4plctestbed user193-key1 +694 1 ssh-rsa somekey4plctestbed user194-key1 +695 1 ssh-rsa somekey4plctestbed user195-key1 +696 1 ssh-rsa somekey4plctestbed user196-key1 +697 1 ssh-rsa somekey4plctestbed user197-key1 +698 1 ssh-rsa somekey4plctestbed user198-key1 +699 1 ssh-rsa somekey4plctestbed user199-key1 +700 1 ssh-rsa somekey4plctestbed user200-key1 +701 1 ssh-rsa somekey4plctestbed user201-key1 +702 1 ssh-rsa somekey4plctestbed user202-key1 +703 1 ssh-rsa somekey4plctestbed user203-key1 +704 1 ssh-rsa somekey4plctestbed user204-key1 +705 1 ssh-rsa somekey4plctestbed user205-key1 +706 1 ssh-rsa somekey4plctestbed user206-key1 +707 1 ssh-rsa somekey4plctestbed user207-key1 +708 1 ssh-rsa somekey4plctestbed user208-key1 +709 1 ssh-rsa somekey4plctestbed user209-key1 +710 1 ssh-rsa somekey4plctestbed user210-key1 +711 1 ssh-rsa somekey4plctestbed user211-key1 +712 1 ssh-rsa somekey4plctestbed user212-key1 +713 1 ssh-rsa somekey4plctestbed user213-key1 +714 1 ssh-rsa somekey4plctestbed user214-key1 +715 1 ssh-rsa somekey4plctestbed user215-key1 +716 1 ssh-rsa somekey4plctestbed user216-key1 +717 1 ssh-rsa somekey4plctestbed user217-key1 +718 1 ssh-rsa somekey4plctestbed user218-key1 +719 1 ssh-rsa somekey4plctestbed user219-key1 +720 1 ssh-rsa somekey4plctestbed user220-key1 +721 1 ssh-rsa somekey4plctestbed user221-key1 +722 1 ssh-rsa somekey4plctestbed user222-key1 +723 1 ssh-rsa somekey4plctestbed user223-key1 +724 1 ssh-rsa somekey4plctestbed user224-key1 +725 1 ssh-rsa somekey4plctestbed user225-key1 +726 1 ssh-rsa somekey4plctestbed user226-key1 +727 1 ssh-rsa somekey4plctestbed user227-key1 +728 1 ssh-rsa somekey4plctestbed user228-key1 +729 1 ssh-rsa somekey4plctestbed user229-key1 +730 1 ssh-rsa somekey4plctestbed user230-key1 +731 1 ssh-rsa somekey4plctestbed user231-key1 +732 1 ssh-rsa somekey4plctestbed user232-key1 +733 1 ssh-rsa somekey4plctestbed user233-key1 +734 1 ssh-rsa somekey4plctestbed user234-key1 +735 1 ssh-rsa somekey4plctestbed user235-key1 +736 1 ssh-rsa somekey4plctestbed user236-key1 +737 1 ssh-rsa somekey4plctestbed user237-key1 +738 1 ssh-rsa somekey4plctestbed user238-key1 +739 1 ssh-rsa somekey4plctestbed user239-key1 +740 1 ssh-rsa somekey4plctestbed user240-key1 +741 1 ssh-rsa somekey4plctestbed user241-key1 +742 1 ssh-rsa somekey4plctestbed user242-key1 +743 1 ssh-rsa somekey4plctestbed user243-key1 +744 1 ssh-rsa somekey4plctestbed user244-key1 +745 1 ssh-rsa somekey4plctestbed user245-key1 +746 1 ssh-rsa somekey4plctestbed user246-key1 +747 1 ssh-rsa somekey4plctestbed user247-key1 +748 1 ssh-rsa somekey4plctestbed user248-key1 +749 1 ssh-rsa somekey4plctestbed user249-key1 +750 1 ssh-rsa somekey4plctestbed user250-key1 +751 1 ssh-rsa somekey4plctestbed user251-key1 +752 1 ssh-rsa somekey4plctestbed user252-key1 +753 1 ssh-rsa somekey4plctestbed user253-key1 +754 1 ssh-rsa somekey4plctestbed user254-key1 +755 1 ssh-rsa somekey4plctestbed user255-key1 +756 1 ssh-rsa somekey4plctestbed user256-key1 +757 1 ssh-rsa somekey4plctestbed user257-key1 +758 1 ssh-rsa somekey4plctestbed user258-key1 +759 1 ssh-rsa somekey4plctestbed user259-key1 +760 1 ssh-rsa somekey4plctestbed user260-key1 +761 1 ssh-rsa somekey4plctestbed user261-key1 +762 1 ssh-rsa somekey4plctestbed user262-key1 +763 1 ssh-rsa somekey4plctestbed user263-key1 +764 1 ssh-rsa somekey4plctestbed user264-key1 +765 1 ssh-rsa somekey4plctestbed user265-key1 +766 1 ssh-rsa somekey4plctestbed user266-key1 +767 1 ssh-rsa somekey4plctestbed user267-key1 +768 1 ssh-rsa somekey4plctestbed user268-key1 +769 1 ssh-rsa somekey4plctestbed user269-key1 +770 1 ssh-rsa somekey4plctestbed user270-key1 +771 1 ssh-rsa somekey4plctestbed user271-key1 +772 1 ssh-rsa somekey4plctestbed user272-key1 +773 1 ssh-rsa somekey4plctestbed user273-key1 +774 1 ssh-rsa somekey4plctestbed user274-key1 +775 1 ssh-rsa somekey4plctestbed user275-key1 +776 1 ssh-rsa somekey4plctestbed user276-key1 +777 1 ssh-rsa somekey4plctestbed user277-key1 +778 1 ssh-rsa somekey4plctestbed user278-key1 +779 1 ssh-rsa somekey4plctestbed user279-key1 +780 1 ssh-rsa somekey4plctestbed user280-key1 +781 1 ssh-rsa somekey4plctestbed user281-key1 +782 1 ssh-rsa somekey4plctestbed user282-key1 +783 1 ssh-rsa somekey4plctestbed user283-key1 +784 1 ssh-rsa somekey4plctestbed user284-key1 +785 1 ssh-rsa somekey4plctestbed user285-key1 +786 1 ssh-rsa somekey4plctestbed user286-key1 +787 1 ssh-rsa somekey4plctestbed user287-key1 +788 1 ssh-rsa somekey4plctestbed user288-key1 +789 1 ssh-rsa somekey4plctestbed user289-key1 +790 1 ssh-rsa somekey4plctestbed user290-key1 +791 1 ssh-rsa somekey4plctestbed user291-key1 +792 1 ssh-rsa somekey4plctestbed user292-key1 +793 1 ssh-rsa somekey4plctestbed user293-key1 +794 1 ssh-rsa somekey4plctestbed user294-key1 +795 1 ssh-rsa somekey4plctestbed user295-key1 +796 1 ssh-rsa somekey4plctestbed user296-key1 +797 1 ssh-rsa somekey4plctestbed user297-key1 +798 1 ssh-rsa somekey4plctestbed user298-key1 +799 1 ssh-rsa somekey4plctestbed user299-key1 +800 1 ssh-rsa somekey4plctestbed user300-key1 +801 1 ssh-rsa somekey4plctestbed user301-key1 +802 1 ssh-rsa somekey4plctestbed user302-key1 +803 1 ssh-rsa somekey4plctestbed user303-key1 +804 1 ssh-rsa somekey4plctestbed user304-key1 +805 1 ssh-rsa somekey4plctestbed user305-key1 +806 1 ssh-rsa somekey4plctestbed user306-key1 +807 1 ssh-rsa somekey4plctestbed user307-key1 +808 1 ssh-rsa somekey4plctestbed user308-key1 +809 1 ssh-rsa somekey4plctestbed user309-key1 +810 1 ssh-rsa somekey4plctestbed user310-key1 +811 1 ssh-rsa somekey4plctestbed user311-key1 +812 1 ssh-rsa somekey4plctestbed user312-key1 +813 1 ssh-rsa somekey4plctestbed user313-key1 +814 1 ssh-rsa somekey4plctestbed user314-key1 +815 1 ssh-rsa somekey4plctestbed user315-key1 +816 1 ssh-rsa somekey4plctestbed user316-key1 +817 1 ssh-rsa somekey4plctestbed user317-key1 +818 1 ssh-rsa somekey4plctestbed user318-key1 +819 1 ssh-rsa somekey4plctestbed user319-key1 +820 1 ssh-rsa somekey4plctestbed user320-key1 +821 1 ssh-rsa somekey4plctestbed user321-key1 +822 1 ssh-rsa somekey4plctestbed user322-key1 +823 1 ssh-rsa somekey4plctestbed user323-key1 +824 1 ssh-rsa somekey4plctestbed user324-key1 +825 1 ssh-rsa somekey4plctestbed user325-key1 +826 1 ssh-rsa somekey4plctestbed user326-key1 +827 1 ssh-rsa somekey4plctestbed user327-key1 +828 1 ssh-rsa somekey4plctestbed user328-key1 +829 1 ssh-rsa somekey4plctestbed user329-key1 +830 1 ssh-rsa somekey4plctestbed user330-key1 +831 1 ssh-rsa somekey4plctestbed user331-key1 +832 1 ssh-rsa somekey4plctestbed user332-key1 +833 1 ssh-rsa somekey4plctestbed user333-key1 +834 1 ssh-rsa somekey4plctestbed user334-key1 +835 1 ssh-rsa somekey4plctestbed user335-key1 +836 1 ssh-rsa somekey4plctestbed user336-key1 +837 1 ssh-rsa somekey4plctestbed user337-key1 +838 1 ssh-rsa somekey4plctestbed user338-key1 +839 1 ssh-rsa somekey4plctestbed user339-key1 +840 1 ssh-rsa somekey4plctestbed user340-key1 +841 1 ssh-rsa somekey4plctestbed user341-key1 +842 1 ssh-rsa somekey4plctestbed user342-key1 +843 1 ssh-rsa somekey4plctestbed user343-key1 +844 1 ssh-rsa somekey4plctestbed user344-key1 +845 1 ssh-rsa somekey4plctestbed user345-key1 +846 1 ssh-rsa somekey4plctestbed user346-key1 +847 1 ssh-rsa somekey4plctestbed user347-key1 +848 1 ssh-rsa somekey4plctestbed user348-key1 +849 1 ssh-rsa somekey4plctestbed user349-key1 +850 1 ssh-rsa somekey4plctestbed user350-key1 +851 1 ssh-rsa somekey4plctestbed user351-key1 +852 1 ssh-rsa somekey4plctestbed user352-key1 +853 1 ssh-rsa somekey4plctestbed user353-key1 +854 1 ssh-rsa somekey4plctestbed user354-key1 +855 1 ssh-rsa somekey4plctestbed user355-key1 +856 1 ssh-rsa somekey4plctestbed user356-key1 +857 1 ssh-rsa somekey4plctestbed user357-key1 +858 1 ssh-rsa somekey4plctestbed user358-key1 +859 1 ssh-rsa somekey4plctestbed user359-key1 +860 1 ssh-rsa somekey4plctestbed user360-key1 +861 1 ssh-rsa somekey4plctestbed user361-key1 +862 1 ssh-rsa somekey4plctestbed user362-key1 +863 1 ssh-rsa somekey4plctestbed user363-key1 +864 1 ssh-rsa somekey4plctestbed user364-key1 +865 1 ssh-rsa somekey4plctestbed user365-key1 +866 1 ssh-rsa somekey4plctestbed user366-key1 +867 1 ssh-rsa somekey4plctestbed user367-key1 +868 1 ssh-rsa somekey4plctestbed user368-key1 +869 1 ssh-rsa somekey4plctestbed user369-key1 +870 1 ssh-rsa somekey4plctestbed user370-key1 +871 1 ssh-rsa somekey4plctestbed user371-key1 +872 1 ssh-rsa somekey4plctestbed user372-key1 +873 1 ssh-rsa somekey4plctestbed user373-key1 +874 1 ssh-rsa somekey4plctestbed user374-key1 +875 1 ssh-rsa somekey4plctestbed user375-key1 +876 1 ssh-rsa somekey4plctestbed user376-key1 +877 1 ssh-rsa somekey4plctestbed user377-key1 +878 1 ssh-rsa somekey4plctestbed user378-key1 +879 1 ssh-rsa somekey4plctestbed user379-key1 +880 1 ssh-rsa somekey4plctestbed user380-key1 +881 1 ssh-rsa somekey4plctestbed user381-key1 +882 1 ssh-rsa somekey4plctestbed user382-key1 +883 1 ssh-rsa somekey4plctestbed user383-key1 +884 1 ssh-rsa somekey4plctestbed user384-key1 +885 1 ssh-rsa somekey4plctestbed user385-key1 +886 1 ssh-rsa somekey4plctestbed user386-key1 +887 1 ssh-rsa somekey4plctestbed user387-key1 +888 1 ssh-rsa somekey4plctestbed user388-key1 +889 1 ssh-rsa somekey4plctestbed user389-key1 +890 1 ssh-rsa somekey4plctestbed user390-key1 +891 1 ssh-rsa somekey4plctestbed user391-key1 +892 1 ssh-rsa somekey4plctestbed user392-key1 +893 1 ssh-rsa somekey4plctestbed user393-key1 +894 1 ssh-rsa somekey4plctestbed user394-key1 +895 1 ssh-rsa somekey4plctestbed user395-key1 +896 1 ssh-rsa somekey4plctestbed user396-key1 +897 1 ssh-rsa somekey4plctestbed user397-key1 +898 1 ssh-rsa somekey4plctestbed user398-key1 +899 1 ssh-rsa somekey4plctestbed user399-key1 +900 1 ssh-rsa somekey4plctestbed user400-key1 +901 1 ssh-rsa somekey4plctestbed user401-key1 +902 1 ssh-rsa somekey4plctestbed user402-key1 +903 1 ssh-rsa somekey4plctestbed user403-key1 +904 1 ssh-rsa somekey4plctestbed user404-key1 +905 1 ssh-rsa somekey4plctestbed user405-key1 +906 1 ssh-rsa somekey4plctestbed user406-key1 +907 1 ssh-rsa somekey4plctestbed user407-key1 +908 1 ssh-rsa somekey4plctestbed user408-key1 +909 1 ssh-rsa somekey4plctestbed user409-key1 +910 1 ssh-rsa somekey4plctestbed user410-key1 +911 1 ssh-rsa somekey4plctestbed user411-key1 +912 1 ssh-rsa somekey4plctestbed user412-key1 +913 1 ssh-rsa somekey4plctestbed user413-key1 +914 1 ssh-rsa somekey4plctestbed user414-key1 +915 1 ssh-rsa somekey4plctestbed user415-key1 +916 1 ssh-rsa somekey4plctestbed user416-key1 +917 1 ssh-rsa somekey4plctestbed user417-key1 +918 1 ssh-rsa somekey4plctestbed user418-key1 +919 1 ssh-rsa somekey4plctestbed user419-key1 +920 1 ssh-rsa somekey4plctestbed user420-key1 +921 1 ssh-rsa somekey4plctestbed user421-key1 +922 1 ssh-rsa somekey4plctestbed user422-key1 +923 1 ssh-rsa somekey4plctestbed user423-key1 +924 1 ssh-rsa somekey4plctestbed user424-key1 +925 1 ssh-rsa somekey4plctestbed user425-key1 +926 1 ssh-rsa somekey4plctestbed user426-key1 +927 1 ssh-rsa somekey4plctestbed user427-key1 +928 1 ssh-rsa somekey4plctestbed user428-key1 +929 1 ssh-rsa somekey4plctestbed user429-key1 +930 1 ssh-rsa somekey4plctestbed user430-key1 +931 1 ssh-rsa somekey4plctestbed user431-key1 +932 1 ssh-rsa somekey4plctestbed user432-key1 +933 1 ssh-rsa somekey4plctestbed user433-key1 +934 1 ssh-rsa somekey4plctestbed user434-key1 +935 1 ssh-rsa somekey4plctestbed user435-key1 +936 1 ssh-rsa somekey4plctestbed user436-key1 +937 1 ssh-rsa somekey4plctestbed user437-key1 +938 1 ssh-rsa somekey4plctestbed user438-key1 +939 1 ssh-rsa somekey4plctestbed user439-key1 +940 1 ssh-rsa somekey4plctestbed user440-key1 +941 1 ssh-rsa somekey4plctestbed user441-key1 +942 1 ssh-rsa somekey4plctestbed user442-key1 +943 1 ssh-rsa somekey4plctestbed user443-key1 +944 1 ssh-rsa somekey4plctestbed user444-key1 +945 1 ssh-rsa somekey4plctestbed user445-key1 +946 1 ssh-rsa somekey4plctestbed user446-key1 +947 1 ssh-rsa somekey4plctestbed user447-key1 +948 1 ssh-rsa somekey4plctestbed user448-key1 +949 1 ssh-rsa somekey4plctestbed user449-key1 +950 1 ssh-rsa somekey4plctestbed user450-key1 +951 1 ssh-rsa somekey4plctestbed user451-key1 +952 1 ssh-rsa somekey4plctestbed user452-key1 +953 1 ssh-rsa somekey4plctestbed user453-key1 +954 1 ssh-rsa somekey4plctestbed user454-key1 +955 1 ssh-rsa somekey4plctestbed user455-key1 +956 1 ssh-rsa somekey4plctestbed user456-key1 +957 1 ssh-rsa somekey4plctestbed user457-key1 +958 1 ssh-rsa somekey4plctestbed user458-key1 +959 1 ssh-rsa somekey4plctestbed user459-key1 +960 1 ssh-rsa somekey4plctestbed user460-key1 +961 1 ssh-rsa somekey4plctestbed user461-key1 +962 1 ssh-rsa somekey4plctestbed user462-key1 +963 1 ssh-rsa somekey4plctestbed user463-key1 +964 1 ssh-rsa somekey4plctestbed user464-key1 +965 1 ssh-rsa somekey4plctestbed user465-key1 +966 1 ssh-rsa somekey4plctestbed user466-key1 +967 1 ssh-rsa somekey4plctestbed user467-key1 +968 1 ssh-rsa somekey4plctestbed user468-key1 +969 1 ssh-rsa somekey4plctestbed user469-key1 +970 1 ssh-rsa somekey4plctestbed user470-key1 +971 1 ssh-rsa somekey4plctestbed user471-key1 +972 1 ssh-rsa somekey4plctestbed user472-key1 +973 1 ssh-rsa somekey4plctestbed user473-key1 +974 1 ssh-rsa somekey4plctestbed user474-key1 +975 1 ssh-rsa somekey4plctestbed user475-key1 +976 1 ssh-rsa somekey4plctestbed user476-key1 +977 1 ssh-rsa somekey4plctestbed user477-key1 +978 1 ssh-rsa somekey4plctestbed user478-key1 +979 1 ssh-rsa somekey4plctestbed user479-key1 +980 1 ssh-rsa somekey4plctestbed user480-key1 +981 1 ssh-rsa somekey4plctestbed user481-key1 +982 1 ssh-rsa somekey4plctestbed user482-key1 +983 1 ssh-rsa somekey4plctestbed user483-key1 +984 1 ssh-rsa somekey4plctestbed user484-key1 +985 1 ssh-rsa somekey4plctestbed user485-key1 +986 1 ssh-rsa somekey4plctestbed user486-key1 +987 1 ssh-rsa somekey4plctestbed user487-key1 +988 1 ssh-rsa somekey4plctestbed user488-key1 +989 1 ssh-rsa somekey4plctestbed user489-key1 +990 1 ssh-rsa somekey4plctestbed user490-key1 +991 1 ssh-rsa somekey4plctestbed user491-key1 +992 1 ssh-rsa somekey4plctestbed user492-key1 +993 1 ssh-rsa somekey4plctestbed user493-key1 +994 1 ssh-rsa somekey4plctestbed user494-key1 +995 1 ssh-rsa somekey4plctestbed user495-key1 +996 1 ssh-rsa somekey4plctestbed user496-key1 +997 1 ssh-rsa somekey4plctestbed user497-key1 +998 1 ssh-rsa somekey4plctestbed user498-key1 +999 1 ssh-rsa somekey4plctestbed user499-key1 +1000 1 ssh-rsa somekey4plctestbed user500-key1 +02: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc2.inria.fr keys: [] sites: [1] +3 None peer2@planet-lab.org keys: [] sites: [] +4 None user-1@plc.org keys: [1] sites: [] +5 None user-2@plc.org keys: [2] sites: [] +6 None user-3@plc.org keys: [3] sites: [] +7 None user-4@plc.org keys: [4] sites: [] +8 None user-5@plc.org keys: [5] sites: [] +9 None user-6@plc.org keys: [6] sites: [] +10 None user-7@plc.org keys: [7] sites: [] +11 None user-8@plc.org keys: [8] sites: [] +12 None user-9@plc.org keys: [9] sites: [] +13 None user-10@plc.org keys: [10] sites: [] +14 None user-11@plc.org keys: [11] sites: [] +15 None user-12@plc.org keys: [12] sites: [] +16 None user-13@plc.org keys: [13] sites: [] +17 None user-14@plc.org keys: [14] sites: [] +18 None user-15@plc.org keys: [15] sites: [] +19 None user-16@plc.org keys: [16] sites: [] +20 None user-17@plc.org keys: [17] sites: [] +21 None user-18@plc.org keys: [18] sites: [] +22 None user-19@plc.org keys: [19] sites: [] +23 None user-20@plc.org keys: [20] sites: [] +24 None user-21@plc.org keys: [21] sites: [] +25 None user-22@plc.org keys: [22] sites: [] +26 None user-23@plc.org keys: [23] sites: [] +27 None user-24@plc.org keys: [24] sites: [] +28 None user-25@plc.org keys: [25] sites: [] +29 None user-26@plc.org keys: [26] sites: [] +30 None user-27@plc.org keys: [27] sites: [] +31 None user-28@plc.org keys: [28] sites: [] +32 None user-29@plc.org keys: [29] sites: [] +33 None user-30@plc.org keys: [30] sites: [] +34 None user-31@plc.org keys: [31] sites: [] +35 None user-32@plc.org keys: [32] sites: [] +36 None user-33@plc.org keys: [33] sites: [] +37 None user-34@plc.org keys: [34] sites: [] +38 None user-35@plc.org keys: [35] sites: [] +39 None user-36@plc.org keys: [36] sites: [] +40 None user-37@plc.org keys: [37] sites: [] +41 None user-38@plc.org keys: [38] sites: [] +42 None user-39@plc.org keys: [39] sites: [] +43 None user-40@plc.org keys: [40] sites: [] +44 None user-41@plc.org keys: [41] sites: [] +45 None user-42@plc.org keys: [42] sites: [] +46 None user-43@plc.org keys: [43] sites: [] +47 None user-44@plc.org keys: [44] sites: [] +48 None user-45@plc.org keys: [45] sites: [] +49 None user-46@plc.org keys: [46] sites: [] +50 None user-47@plc.org keys: [47] sites: [] +51 None user-48@plc.org keys: [48] sites: [] +52 None user-49@plc.org keys: [49] sites: [] +53 None user-50@plc.org keys: [50] sites: [] +54 None user-51@plc.org keys: [51] sites: [] +55 None user-52@plc.org keys: [52] sites: [] +56 None user-53@plc.org keys: [53] sites: [] +57 None user-54@plc.org keys: [54] sites: [] +58 None user-55@plc.org keys: [55] sites: [] +59 None user-56@plc.org keys: [56] sites: [] +60 None user-57@plc.org keys: [57] sites: [] +61 None user-58@plc.org keys: [58] sites: [] +62 None user-59@plc.org keys: [59] sites: [] +63 None user-60@plc.org keys: [60] sites: [] +64 None user-61@plc.org keys: [61] sites: [] +65 None user-62@plc.org keys: [62] sites: [] +66 None user-63@plc.org keys: [63] sites: [] +67 None user-64@plc.org keys: [64] sites: [] +68 None user-65@plc.org keys: [65] sites: [] +69 None user-66@plc.org keys: [66] sites: [] +70 None user-67@plc.org keys: [67] sites: [] +71 None user-68@plc.org keys: [68] sites: [] +72 None user-69@plc.org keys: [69] sites: [] +73 None user-70@plc.org keys: [70] sites: [] +74 None user-71@plc.org keys: [71] sites: [] +75 None user-72@plc.org keys: [72] sites: [] +76 None user-73@plc.org keys: [73] sites: [] +77 None user-74@plc.org keys: [74] sites: [] +78 None user-75@plc.org keys: [75] sites: [] +79 None user-76@plc.org keys: [76] sites: [] +80 None user-77@plc.org keys: [77] sites: [] +81 None user-78@plc.org keys: [78] sites: [] +82 None user-79@plc.org keys: [79] sites: [] +83 None user-80@plc.org keys: [80] sites: [] +84 None user-81@plc.org keys: [81] sites: [] +85 None user-82@plc.org keys: [82] sites: [] +86 None user-83@plc.org keys: [83] sites: [] +87 None user-84@plc.org keys: [84] sites: [] +88 None user-85@plc.org keys: [85] sites: [] +89 None user-86@plc.org keys: [86] sites: [] +90 None user-87@plc.org keys: [87] sites: [] +91 None user-88@plc.org keys: [88] sites: [] +92 None user-89@plc.org keys: [89] sites: [] +93 None user-90@plc.org keys: [90] sites: [] +94 None user-91@plc.org keys: [91] sites: [] +95 None user-92@plc.org keys: [92] sites: [] +96 None user-93@plc.org keys: [93] sites: [] +97 None user-94@plc.org keys: [94] sites: [] +98 None user-95@plc.org keys: [95] sites: [] +99 None user-96@plc.org keys: [96] sites: [] +100 None user-97@plc.org keys: [97] sites: [] +101 None user-98@plc.org keys: [98] sites: [] +102 None user-99@plc.org keys: [99] sites: [] +103 None user-100@plc.org keys: [100] sites: [] +104 None user-101@plc.org keys: [101] sites: [] +105 None user-102@plc.org keys: [102] sites: [] +106 None user-103@plc.org keys: [103] sites: [] +107 None user-104@plc.org keys: [104] sites: [] +108 None user-105@plc.org keys: [105] sites: [] +109 None user-106@plc.org keys: [106] sites: [] +110 None user-107@plc.org keys: [107] sites: [] +111 None user-108@plc.org keys: [108] sites: [] +112 None user-109@plc.org keys: [109] sites: [] +113 None user-110@plc.org keys: [110] sites: [] +114 None user-111@plc.org keys: [111] sites: [] +115 None user-112@plc.org keys: [112] sites: [] +116 None user-113@plc.org keys: [113] sites: [] +117 None user-114@plc.org keys: [114] sites: [] +118 None user-115@plc.org keys: [115] sites: [] +119 None user-116@plc.org keys: [116] sites: [] +120 None user-117@plc.org keys: [117] sites: [] +121 None user-118@plc.org keys: [118] sites: [] +122 None user-119@plc.org keys: [119] sites: [] +123 None user-120@plc.org keys: [120] sites: [] +124 None user-121@plc.org keys: [121] sites: [] +125 None user-122@plc.org keys: [122] sites: [] +126 None user-123@plc.org keys: [123] sites: [] +127 None user-124@plc.org keys: [124] sites: [] +128 None user-125@plc.org keys: [125] sites: [] +129 None user-126@plc.org keys: [126] sites: [] +130 None user-127@plc.org keys: [127] sites: [] +131 None user-128@plc.org keys: [128] sites: [] +132 None user-129@plc.org keys: [129] sites: [] +133 None user-130@plc.org keys: [130] sites: [] +134 None user-131@plc.org keys: [131] sites: [] +135 None user-132@plc.org keys: [132] sites: [] +136 None user-133@plc.org keys: [133] sites: [] +137 None user-134@plc.org keys: [134] sites: [] +138 None user-135@plc.org keys: [135] sites: [] +139 None user-136@plc.org keys: [136] sites: [] +140 None user-137@plc.org keys: [137] sites: [] +141 None user-138@plc.org keys: [138] sites: [] +142 None user-139@plc.org keys: [139] sites: [] +143 None user-140@plc.org keys: [140] sites: [] +144 None user-141@plc.org keys: [141] sites: [] +145 None user-142@plc.org keys: [142] sites: [] +146 None user-143@plc.org keys: [143] sites: [] +147 None user-144@plc.org keys: [144] sites: [] +148 None user-145@plc.org keys: [145] sites: [] +149 None user-146@plc.org keys: [146] sites: [] +150 None user-147@plc.org keys: [147] sites: [] +151 None user-148@plc.org keys: [148] sites: [] +152 None user-149@plc.org keys: [149] sites: [] +153 None user-150@plc.org keys: [150] sites: [] +154 None user-151@plc.org keys: [151] sites: [] +155 None user-152@plc.org keys: [152] sites: [] +156 None user-153@plc.org keys: [153] sites: [] +157 None user-154@plc.org keys: [154] sites: [] +158 None user-155@plc.org keys: [155] sites: [] +159 None user-156@plc.org keys: [156] sites: [] +160 None user-157@plc.org keys: [157] sites: [] +161 None user-158@plc.org keys: [158] sites: [] +162 None user-159@plc.org keys: [159] sites: [] +163 None user-160@plc.org keys: [160] sites: [] +164 None user-161@plc.org keys: [161] sites: [] +165 None user-162@plc.org keys: [162] sites: [] +166 None user-163@plc.org keys: [163] sites: [] +167 None user-164@plc.org keys: [164] sites: [] +168 None user-165@plc.org keys: [165] sites: [] +169 None user-166@plc.org keys: [166] sites: [] +170 None user-167@plc.org keys: [167] sites: [] +171 None user-168@plc.org keys: [168] sites: [] +172 None user-169@plc.org keys: [169] sites: [] +173 None user-170@plc.org keys: [170] sites: [] +174 None user-171@plc.org keys: [171] sites: [] +175 None user-172@plc.org keys: [172] sites: [] +176 None user-173@plc.org keys: [173] sites: [] +177 None user-174@plc.org keys: [174] sites: [] +178 None user-175@plc.org keys: [175] sites: [] +179 None user-176@plc.org keys: [176] sites: [] +180 None user-177@plc.org keys: [177] sites: [] +181 None user-178@plc.org keys: [178] sites: [] +182 None user-179@plc.org keys: [179] sites: [] +183 None user-180@plc.org keys: [180] sites: [] +184 None user-181@plc.org keys: [181] sites: [] +185 None user-182@plc.org keys: [182] sites: [] +186 None user-183@plc.org keys: [183] sites: [] +187 None user-184@plc.org keys: [184] sites: [] +188 None user-185@plc.org keys: [185] sites: [] +189 None user-186@plc.org keys: [186] sites: [] +190 None user-187@plc.org keys: [187] sites: [] +191 None user-188@plc.org keys: [188] sites: [] +192 None user-189@plc.org keys: [189] sites: [] +193 None user-190@plc.org keys: [190] sites: [] +194 None user-191@plc.org keys: [191] sites: [] +195 None user-192@plc.org keys: [192] sites: [] +196 None user-193@plc.org keys: [193] sites: [] +197 None user-194@plc.org keys: [194] sites: [] +198 None user-195@plc.org keys: [195] sites: [] +199 None user-196@plc.org keys: [196] sites: [] +200 None user-197@plc.org keys: [197] sites: [] +201 None user-198@plc.org keys: [198] sites: [] +202 None user-199@plc.org keys: [199] sites: [] +203 None user-200@plc.org keys: [200] sites: [] +204 None user-201@plc.org keys: [201] sites: [] +205 None user-202@plc.org keys: [202] sites: [] +206 None user-203@plc.org keys: [203] sites: [] +207 None user-204@plc.org keys: [204] sites: [] +208 None user-205@plc.org keys: [205] sites: [] +209 None user-206@plc.org keys: [206] sites: [] +210 None user-207@plc.org keys: [207] sites: [] +211 None user-208@plc.org keys: [208] sites: [] +212 None user-209@plc.org keys: [209] sites: [] +213 None user-210@plc.org keys: [210] sites: [] +214 None user-211@plc.org keys: [211] sites: [] +215 None user-212@plc.org keys: [212] sites: [] +216 None user-213@plc.org keys: [213] sites: [] +217 None user-214@plc.org keys: [214] sites: [] +218 None user-215@plc.org keys: [215] sites: [] +219 None user-216@plc.org keys: [216] sites: [] +220 None user-217@plc.org keys: [217] sites: [] +221 None user-218@plc.org keys: [218] sites: [] +222 None user-219@plc.org keys: [219] sites: [] +223 None user-220@plc.org keys: [220] sites: [] +224 None user-221@plc.org keys: [221] sites: [] +225 None user-222@plc.org keys: [222] sites: [] +226 None user-223@plc.org keys: [223] sites: [] +227 None user-224@plc.org keys: [224] sites: [] +228 None user-225@plc.org keys: [225] sites: [] +229 None user-226@plc.org keys: [226] sites: [] +230 None user-227@plc.org keys: [227] sites: [] +231 None user-228@plc.org keys: [228] sites: [] +232 None user-229@plc.org keys: [229] sites: [] +233 None user-230@plc.org keys: [230] sites: [] +234 None user-231@plc.org keys: [231] sites: [] +235 None user-232@plc.org keys: [232] sites: [] +236 None user-233@plc.org keys: [233] sites: [] +237 None user-234@plc.org keys: [234] sites: [] +238 None user-235@plc.org keys: [235] sites: [] +239 None user-236@plc.org keys: [236] sites: [] +240 None user-237@plc.org keys: [237] sites: [] +241 None user-238@plc.org keys: [238] sites: [] +242 None user-239@plc.org keys: [239] sites: [] +243 None user-240@plc.org keys: [240] sites: [] +244 None user-241@plc.org keys: [241] sites: [] +245 None user-242@plc.org keys: [242] sites: [] +246 None user-243@plc.org keys: [243] sites: [] +247 None user-244@plc.org keys: [244] sites: [] +248 None user-245@plc.org keys: [245] sites: [] +249 None user-246@plc.org keys: [246] sites: [] +250 None user-247@plc.org keys: [247] sites: [] +251 None user-248@plc.org keys: [248] sites: [] +252 None user-249@plc.org keys: [249] sites: [] +253 None user-250@plc.org keys: [250] sites: [] +254 None user-251@plc.org keys: [251] sites: [] +255 None user-252@plc.org keys: [252] sites: [] +256 None user-253@plc.org keys: [253] sites: [] +257 None user-254@plc.org keys: [254] sites: [] +258 None user-255@plc.org keys: [255] sites: [] +259 None user-256@plc.org keys: [256] sites: [] +260 None user-257@plc.org keys: [257] sites: [] +261 None user-258@plc.org keys: [258] sites: [] +262 None user-259@plc.org keys: [259] sites: [] +263 None user-260@plc.org keys: [260] sites: [] +264 None user-261@plc.org keys: [261] sites: [] +265 None user-262@plc.org keys: [262] sites: [] +266 None user-263@plc.org keys: [263] sites: [] +267 None user-264@plc.org keys: [264] sites: [] +268 None user-265@plc.org keys: [265] sites: [] +269 None user-266@plc.org keys: [266] sites: [] +270 None user-267@plc.org keys: [267] sites: [] +271 None user-268@plc.org keys: [268] sites: [] +272 None user-269@plc.org keys: [269] sites: [] +273 None user-270@plc.org keys: [270] sites: [] +274 None user-271@plc.org keys: [271] sites: [] +275 None user-272@plc.org keys: [272] sites: [] +276 None user-273@plc.org keys: [273] sites: [] +277 None user-274@plc.org keys: [274] sites: [] +278 None user-275@plc.org keys: [275] sites: [] +279 None user-276@plc.org keys: [276] sites: [] +280 None user-277@plc.org keys: [277] sites: [] +281 None user-278@plc.org keys: [278] sites: [] +282 None user-279@plc.org keys: [279] sites: [] +283 None user-280@plc.org keys: [280] sites: [] +284 None user-281@plc.org keys: [281] sites: [] +285 None user-282@plc.org keys: [282] sites: [] +286 None user-283@plc.org keys: [283] sites: [] +287 None user-284@plc.org keys: [284] sites: [] +288 None user-285@plc.org keys: [285] sites: [] +289 None user-286@plc.org keys: [286] sites: [] +290 None user-287@plc.org keys: [287] sites: [] +291 None user-288@plc.org keys: [288] sites: [] +292 None user-289@plc.org keys: [289] sites: [] +293 None user-290@plc.org keys: [290] sites: [] +294 None user-291@plc.org keys: [291] sites: [] +295 None user-292@plc.org keys: [292] sites: [] +296 None user-293@plc.org keys: [293] sites: [] +297 None user-294@plc.org keys: [294] sites: [] +298 None user-295@plc.org keys: [295] sites: [] +299 None user-296@plc.org keys: [296] sites: [] +300 None user-297@plc.org keys: [297] sites: [] +301 None user-298@plc.org keys: [298] sites: [] +302 None user-299@plc.org keys: [299] sites: [] +303 None user-300@plc.org keys: [300] sites: [] +304 None user-301@plc.org keys: [301] sites: [] +305 None user-302@plc.org keys: [302] sites: [] +306 None user-303@plc.org keys: [303] sites: [] +307 None user-304@plc.org keys: [304] sites: [] +308 None user-305@plc.org keys: [305] sites: [] +309 None user-306@plc.org keys: [306] sites: [] +310 None user-307@plc.org keys: [307] sites: [] +311 None user-308@plc.org keys: [308] sites: [] +312 None user-309@plc.org keys: [309] sites: [] +313 None user-310@plc.org keys: [310] sites: [] +314 None user-311@plc.org keys: [311] sites: [] +315 None user-312@plc.org keys: [312] sites: [] +316 None user-313@plc.org keys: [313] sites: [] +317 None user-314@plc.org keys: [314] sites: [] +318 None user-315@plc.org keys: [315] sites: [] +319 None user-316@plc.org keys: [316] sites: [] +320 None user-317@plc.org keys: [317] sites: [] +321 None user-318@plc.org keys: [318] sites: [] +322 None user-319@plc.org keys: [319] sites: [] +323 None user-320@plc.org keys: [320] sites: [] +324 None user-321@plc.org keys: [321] sites: [] +325 None user-322@plc.org keys: [322] sites: [] +326 None user-323@plc.org keys: [323] sites: [] +327 None user-324@plc.org keys: [324] sites: [] +328 None user-325@plc.org keys: [325] sites: [] +329 None user-326@plc.org keys: [326] sites: [] +330 None user-327@plc.org keys: [327] sites: [] +331 None user-328@plc.org keys: [328] sites: [] +332 None user-329@plc.org keys: [329] sites: [] +333 None user-330@plc.org keys: [330] sites: [] +334 None user-331@plc.org keys: [331] sites: [] +335 None user-332@plc.org keys: [332] sites: [] +336 None user-333@plc.org keys: [333] sites: [] +337 None user-334@plc.org keys: [334] sites: [] +338 None user-335@plc.org keys: [335] sites: [] +339 None user-336@plc.org keys: [336] sites: [] +340 None user-337@plc.org keys: [337] sites: [] +341 None user-338@plc.org keys: [338] sites: [] +342 None user-339@plc.org keys: [339] sites: [] +343 None user-340@plc.org keys: [340] sites: [] +344 None user-341@plc.org keys: [341] sites: [] +345 None user-342@plc.org keys: [342] sites: [] +346 None user-343@plc.org keys: [343] sites: [] +347 None user-344@plc.org keys: [344] sites: [] +348 None user-345@plc.org keys: [345] sites: [] +349 None user-346@plc.org keys: [346] sites: [] +350 None user-347@plc.org keys: [347] sites: [] +351 None user-348@plc.org keys: [348] sites: [] +352 None user-349@plc.org keys: [349] sites: [] +353 None user-350@plc.org keys: [350] sites: [] +354 None user-351@plc.org keys: [351] sites: [] +355 None user-352@plc.org keys: [352] sites: [] +356 None user-353@plc.org keys: [353] sites: [] +357 None user-354@plc.org keys: [354] sites: [] +358 None user-355@plc.org keys: [355] sites: [] +359 None user-356@plc.org keys: [356] sites: [] +360 None user-357@plc.org keys: [357] sites: [] +361 None user-358@plc.org keys: [358] sites: [] +362 None user-359@plc.org keys: [359] sites: [] +363 None user-360@plc.org keys: [360] sites: [] +364 None user-361@plc.org keys: [361] sites: [] +365 None user-362@plc.org keys: [362] sites: [] +366 None user-363@plc.org keys: [363] sites: [] +367 None user-364@plc.org keys: [364] sites: [] +368 None user-365@plc.org keys: [365] sites: [] +369 None user-366@plc.org keys: [366] sites: [] +370 None user-367@plc.org keys: [367] sites: [] +371 None user-368@plc.org keys: [368] sites: [] +372 None user-369@plc.org keys: [369] sites: [] +373 None user-370@plc.org keys: [370] sites: [] +374 None user-371@plc.org keys: [371] sites: [] +375 None user-372@plc.org keys: [372] sites: [] +376 None user-373@plc.org keys: [373] sites: [] +377 None user-374@plc.org keys: [374] sites: [] +378 None user-375@plc.org keys: [375] sites: [] +379 None user-376@plc.org keys: [376] sites: [] +380 None user-377@plc.org keys: [377] sites: [] +381 None user-378@plc.org keys: [378] sites: [] +382 None user-379@plc.org keys: [379] sites: [] +383 None user-380@plc.org keys: [380] sites: [] +384 None user-381@plc.org keys: [381] sites: [] +385 None user-382@plc.org keys: [382] sites: [] +386 None user-383@plc.org keys: [383] sites: [] +387 None user-384@plc.org keys: [384] sites: [] +388 None user-385@plc.org keys: [385] sites: [] +389 None user-386@plc.org keys: [386] sites: [] +390 None user-387@plc.org keys: [387] sites: [] +391 None user-388@plc.org keys: [388] sites: [] +392 None user-389@plc.org keys: [389] sites: [] +393 None user-390@plc.org keys: [390] sites: [] +394 None user-391@plc.org keys: [391] sites: [] +395 None user-392@plc.org keys: [392] sites: [] +396 None user-393@plc.org keys: [393] sites: [] +397 None user-394@plc.org keys: [394] sites: [] +398 None user-395@plc.org keys: [395] sites: [] +399 None user-396@plc.org keys: [396] sites: [] +400 None user-397@plc.org keys: [397] sites: [] +401 None user-398@plc.org keys: [398] sites: [] +402 None user-399@plc.org keys: [399] sites: [] +403 None user-400@plc.org keys: [400] sites: [] +404 None user-401@plc.org keys: [401] sites: [] +405 None user-402@plc.org keys: [402] sites: [] +406 None user-403@plc.org keys: [403] sites: [] +407 None user-404@plc.org keys: [404] sites: [] +408 None user-405@plc.org keys: [405] sites: [] +409 None user-406@plc.org keys: [406] sites: [] +410 None user-407@plc.org keys: [407] sites: [] +411 None user-408@plc.org keys: [408] sites: [] +412 None user-409@plc.org keys: [409] sites: [] +413 None user-410@plc.org keys: [410] sites: [] +414 None user-411@plc.org keys: [411] sites: [] +415 None user-412@plc.org keys: [412] sites: [] +416 None user-413@plc.org keys: [413] sites: [] +417 None user-414@plc.org keys: [414] sites: [] +418 None user-415@plc.org keys: [415] sites: [] +419 None user-416@plc.org keys: [416] sites: [] +420 None user-417@plc.org keys: [417] sites: [] +421 None user-418@plc.org keys: [418] sites: [] +422 None user-419@plc.org keys: [419] sites: [] +423 None user-420@plc.org keys: [420] sites: [] +424 None user-421@plc.org keys: [421] sites: [] +425 None user-422@plc.org keys: [422] sites: [] +426 None user-423@plc.org keys: [423] sites: [] +427 None user-424@plc.org keys: [424] sites: [] +428 None user-425@plc.org keys: [425] sites: [] +429 None user-426@plc.org keys: [426] sites: [] +430 None user-427@plc.org keys: [427] sites: [] +431 None user-428@plc.org keys: [428] sites: [] +432 None user-429@plc.org keys: [429] sites: [] +433 None user-430@plc.org keys: [430] sites: [] +434 None user-431@plc.org keys: [431] sites: [] +435 None user-432@plc.org keys: [432] sites: [] +436 None user-433@plc.org keys: [433] sites: [] +437 None user-434@plc.org keys: [434] sites: [] +438 None user-435@plc.org keys: [435] sites: [] +439 None user-436@plc.org keys: [436] sites: [] +440 None user-437@plc.org keys: [437] sites: [] +441 None user-438@plc.org keys: [438] sites: [] +442 None user-439@plc.org keys: [439] sites: [] +443 None user-440@plc.org keys: [440] sites: [] +444 None user-441@plc.org keys: [441] sites: [] +445 None user-442@plc.org keys: [442] sites: [] +446 None user-443@plc.org keys: [443] sites: [] +447 None user-444@plc.org keys: [444] sites: [] +448 None user-445@plc.org keys: [445] sites: [] +449 None user-446@plc.org keys: [446] sites: [] +450 None user-447@plc.org keys: [447] sites: [] +451 None user-448@plc.org keys: [448] sites: [] +452 None user-449@plc.org keys: [449] sites: [] +453 None user-450@plc.org keys: [450] sites: [] +454 None user-451@plc.org keys: [451] sites: [] +455 None user-452@plc.org keys: [452] sites: [] +456 None user-453@plc.org keys: [453] sites: [] +457 None user-454@plc.org keys: [454] sites: [] +458 None user-455@plc.org keys: [455] sites: [] +459 None user-456@plc.org keys: [456] sites: [] +460 None user-457@plc.org keys: [457] sites: [] +461 None user-458@plc.org keys: [458] sites: [] +462 None user-459@plc.org keys: [459] sites: [] +463 None user-460@plc.org keys: [460] sites: [] +464 None user-461@plc.org keys: [461] sites: [] +465 None user-462@plc.org keys: [462] sites: [] +466 None user-463@plc.org keys: [463] sites: [] +467 None user-464@plc.org keys: [464] sites: [] +468 None user-465@plc.org keys: [465] sites: [] +469 None user-466@plc.org keys: [466] sites: [] +470 None user-467@plc.org keys: [467] sites: [] +471 None user-468@plc.org keys: [468] sites: [] +472 None user-469@plc.org keys: [469] sites: [] +473 None user-470@plc.org keys: [470] sites: [] +474 None user-471@plc.org keys: [471] sites: [] +475 None user-472@plc.org keys: [472] sites: [] +476 None user-473@plc.org keys: [473] sites: [] +477 None user-474@plc.org keys: [474] sites: [] +478 None user-475@plc.org keys: [475] sites: [] +479 None user-476@plc.org keys: [476] sites: [] +480 None user-477@plc.org keys: [477] sites: [] +481 None user-478@plc.org keys: [478] sites: [] +482 None user-479@plc.org keys: [479] sites: [] +483 None user-480@plc.org keys: [480] sites: [] +484 None user-481@plc.org keys: [481] sites: [] +485 None user-482@plc.org keys: [482] sites: [] +486 None user-483@plc.org keys: [483] sites: [] +487 None user-484@plc.org keys: [484] sites: [] +488 None user-485@plc.org keys: [485] sites: [] +489 None user-486@plc.org keys: [486] sites: [] +490 None user-487@plc.org keys: [487] sites: [] +491 None user-488@plc.org keys: [488] sites: [] +492 None user-489@plc.org keys: [489] sites: [] +493 None user-490@plc.org keys: [490] sites: [] +494 None user-491@plc.org keys: [491] sites: [] +495 None user-492@plc.org keys: [492] sites: [] +496 None user-493@plc.org keys: [493] sites: [] +497 None user-494@plc.org keys: [494] sites: [] +498 None user-495@plc.org keys: [495] sites: [] +499 None user-496@plc.org keys: [496] sites: [] +500 None user-497@plc.org keys: [497] sites: [] +501 None user-498@plc.org keys: [498] sites: [] +502 None user-499@plc.org keys: [499] sites: [] +503 None user-500@plc.org keys: [500] sites: [] +504 1 peer1@planet-lab.org keys: [] sites: [] +505 1 user-1@plc.org keys: [501] sites: [] +506 1 user-2@plc.org keys: [502] sites: [] +507 1 user-3@plc.org keys: [503] sites: [] +508 1 user-4@plc.org keys: [504] sites: [] +509 1 user-5@plc.org keys: [505] sites: [] +510 1 user-6@plc.org keys: [506] sites: [] +511 1 user-7@plc.org keys: [507] sites: [] +512 1 user-8@plc.org keys: [508] sites: [] +513 1 user-9@plc.org keys: [509] sites: [] +514 1 user-10@plc.org keys: [510] sites: [] +515 1 user-11@plc.org keys: [511] sites: [] +516 1 user-12@plc.org keys: [512] sites: [] +517 1 user-13@plc.org keys: [513] sites: [] +518 1 user-14@plc.org keys: [514] sites: [] +519 1 user-15@plc.org keys: [515] sites: [] +520 1 user-16@plc.org keys: [516] sites: [] +521 1 user-17@plc.org keys: [517] sites: [] +522 1 user-18@plc.org keys: [518] sites: [] +523 1 user-19@plc.org keys: [519] sites: [] +524 1 user-20@plc.org keys: [520] sites: [] +525 1 user-21@plc.org keys: [521] sites: [] +526 1 user-22@plc.org keys: [522] sites: [] +527 1 user-23@plc.org keys: [523] sites: [] +528 1 user-24@plc.org keys: [524] sites: [] +529 1 user-25@plc.org keys: [525] sites: [] +530 1 user-26@plc.org keys: [526] sites: [] +531 1 user-27@plc.org keys: [527] sites: [] +532 1 user-28@plc.org keys: [528] sites: [] +533 1 user-29@plc.org keys: [529] sites: [] +534 1 user-30@plc.org keys: [530] sites: [] +535 1 user-31@plc.org keys: [531] sites: [] +536 1 user-32@plc.org keys: [532] sites: [] +537 1 user-33@plc.org keys: [533] sites: [] +538 1 user-34@plc.org keys: [534] sites: [] +539 1 user-35@plc.org keys: [535] sites: [] +540 1 user-36@plc.org keys: [536] sites: [] +541 1 user-37@plc.org keys: [537] sites: [] +542 1 user-38@plc.org keys: [538] sites: [] +543 1 user-39@plc.org keys: [539] sites: [] +544 1 user-40@plc.org keys: [540] sites: [] +545 1 user-41@plc.org keys: [541] sites: [] +546 1 user-42@plc.org keys: [542] sites: [] +547 1 user-43@plc.org keys: [543] sites: [] +548 1 user-44@plc.org keys: [544] sites: [] +549 1 user-45@plc.org keys: [545] sites: [] +550 1 user-46@plc.org keys: [546] sites: [] +551 1 user-47@plc.org keys: [547] sites: [] +552 1 user-48@plc.org keys: [548] sites: [] +553 1 user-49@plc.org keys: [549] sites: [] +554 1 user-50@plc.org keys: [550] sites: [] +555 1 user-51@plc.org keys: [551] sites: [] +556 1 user-52@plc.org keys: [552] sites: [] +557 1 user-53@plc.org keys: [553] sites: [] +558 1 user-54@plc.org keys: [554] sites: [] +559 1 user-55@plc.org keys: [555] sites: [] +560 1 user-56@plc.org keys: [556] sites: [] +561 1 user-57@plc.org keys: [557] sites: [] +562 1 user-58@plc.org keys: [558] sites: [] +563 1 user-59@plc.org keys: [559] sites: [] +564 1 user-60@plc.org keys: [560] sites: [] +565 1 user-61@plc.org keys: [561] sites: [] +566 1 user-62@plc.org keys: [562] sites: [] +567 1 user-63@plc.org keys: [563] sites: [] +568 1 user-64@plc.org keys: [564] sites: [] +569 1 user-65@plc.org keys: [565] sites: [] +570 1 user-66@plc.org keys: [566] sites: [] +571 1 user-67@plc.org keys: [567] sites: [] +572 1 user-68@plc.org keys: [568] sites: [] +573 1 user-69@plc.org keys: [569] sites: [] +574 1 user-70@plc.org keys: [570] sites: [] +575 1 user-71@plc.org keys: [571] sites: [] +576 1 user-72@plc.org keys: [572] sites: [] +577 1 user-73@plc.org keys: [573] sites: [] +578 1 user-74@plc.org keys: [574] sites: [] +579 1 user-75@plc.org keys: [575] sites: [] +580 1 user-76@plc.org keys: [576] sites: [] +581 1 user-77@plc.org keys: [577] sites: [] +582 1 user-78@plc.org keys: [578] sites: [] +583 1 user-79@plc.org keys: [579] sites: [] +584 1 user-80@plc.org keys: [580] sites: [] +585 1 user-81@plc.org keys: [581] sites: [] +586 1 user-82@plc.org keys: [582] sites: [] +587 1 user-83@plc.org keys: [583] sites: [] +588 1 user-84@plc.org keys: [584] sites: [] +589 1 user-85@plc.org keys: [585] sites: [] +590 1 user-86@plc.org keys: [586] sites: [] +591 1 user-87@plc.org keys: [587] sites: [] +592 1 user-88@plc.org keys: [588] sites: [] +593 1 user-89@plc.org keys: [589] sites: [] +594 1 user-90@plc.org keys: [590] sites: [] +595 1 user-91@plc.org keys: [591] sites: [] +596 1 user-92@plc.org keys: [592] sites: [] +597 1 user-93@plc.org keys: [593] sites: [] +598 1 user-94@plc.org keys: [594] sites: [] +599 1 user-95@plc.org keys: [595] sites: [] +600 1 user-96@plc.org keys: [596] sites: [] +601 1 user-97@plc.org keys: [597] sites: [] +602 1 user-98@plc.org keys: [598] sites: [] +603 1 user-99@plc.org keys: [599] sites: [] +604 1 user-100@plc.org keys: [600] sites: [] +605 1 user-101@plc.org keys: [601] sites: [] +606 1 user-102@plc.org keys: [602] sites: [] +607 1 user-103@plc.org keys: [603] sites: [] +608 1 user-104@plc.org keys: [604] sites: [] +609 1 user-105@plc.org keys: [605] sites: [] +610 1 user-106@plc.org keys: [606] sites: [] +611 1 user-107@plc.org keys: [607] sites: [] +612 1 user-108@plc.org keys: [608] sites: [] +613 1 user-109@plc.org keys: [609] sites: [] +614 1 user-110@plc.org keys: [610] sites: [] +615 1 user-111@plc.org keys: [611] sites: [] +616 1 user-112@plc.org keys: [612] sites: [] +617 1 user-113@plc.org keys: [613] sites: [] +618 1 user-114@plc.org keys: [614] sites: [] +619 1 user-115@plc.org keys: [615] sites: [] +620 1 user-116@plc.org keys: [616] sites: [] +621 1 user-117@plc.org keys: [617] sites: [] +622 1 user-118@plc.org keys: [618] sites: [] +623 1 user-119@plc.org keys: [619] sites: [] +624 1 user-120@plc.org keys: [620] sites: [] +625 1 user-121@plc.org keys: [621] sites: [] +626 1 user-122@plc.org keys: [622] sites: [] +627 1 user-123@plc.org keys: [623] sites: [] +628 1 user-124@plc.org keys: [624] sites: [] +629 1 user-125@plc.org keys: [625] sites: [] +630 1 user-126@plc.org keys: [626] sites: [] +631 1 user-127@plc.org keys: [627] sites: [] +632 1 user-128@plc.org keys: [628] sites: [] +633 1 user-129@plc.org keys: [629] sites: [] +634 1 user-130@plc.org keys: [630] sites: [] +635 1 user-131@plc.org keys: [631] sites: [] +636 1 user-132@plc.org keys: [632] sites: [] +637 1 user-133@plc.org keys: [633] sites: [] +638 1 user-134@plc.org keys: [634] sites: [] +639 1 user-135@plc.org keys: [635] sites: [] +640 1 user-136@plc.org keys: [636] sites: [] +641 1 user-137@plc.org keys: [637] sites: [] +642 1 user-138@plc.org keys: [638] sites: [] +643 1 user-139@plc.org keys: [639] sites: [] +644 1 user-140@plc.org keys: [640] sites: [] +645 1 user-141@plc.org keys: [641] sites: [] +646 1 user-142@plc.org keys: [642] sites: [] +647 1 user-143@plc.org keys: [643] sites: [] +648 1 user-144@plc.org keys: [644] sites: [] +649 1 user-145@plc.org keys: [645] sites: [] +650 1 user-146@plc.org keys: [646] sites: [] +651 1 user-147@plc.org keys: [647] sites: [] +652 1 user-148@plc.org keys: [648] sites: [] +653 1 user-149@plc.org keys: [649] sites: [] +654 1 user-150@plc.org keys: [650] sites: [] +655 1 user-151@plc.org keys: [651] sites: [] +656 1 user-152@plc.org keys: [652] sites: [] +657 1 user-153@plc.org keys: [653] sites: [] +658 1 user-154@plc.org keys: [654] sites: [] +659 1 user-155@plc.org keys: [655] sites: [] +660 1 user-156@plc.org keys: [656] sites: [] +661 1 user-157@plc.org keys: [657] sites: [] +662 1 user-158@plc.org keys: [658] sites: [] +663 1 user-159@plc.org keys: [659] sites: [] +664 1 user-160@plc.org keys: [660] sites: [] +665 1 user-161@plc.org keys: [661] sites: [] +666 1 user-162@plc.org keys: [662] sites: [] +667 1 user-163@plc.org keys: [663] sites: [] +668 1 user-164@plc.org keys: [664] sites: [] +669 1 user-165@plc.org keys: [665] sites: [] +670 1 user-166@plc.org keys: [666] sites: [] +671 1 user-167@plc.org keys: [667] sites: [] +672 1 user-168@plc.org keys: [668] sites: [] +673 1 user-169@plc.org keys: [669] sites: [] +674 1 user-170@plc.org keys: [670] sites: [] +675 1 user-171@plc.org keys: [671] sites: [] +676 1 user-172@plc.org keys: [672] sites: [] +677 1 user-173@plc.org keys: [673] sites: [] +678 1 user-174@plc.org keys: [674] sites: [] +679 1 user-175@plc.org keys: [675] sites: [] +680 1 user-176@plc.org keys: [676] sites: [] +681 1 user-177@plc.org keys: [677] sites: [] +682 1 user-178@plc.org keys: [678] sites: [] +683 1 user-179@plc.org keys: [679] sites: [] +684 1 user-180@plc.org keys: [680] sites: [] +685 1 user-181@plc.org keys: [681] sites: [] +686 1 user-182@plc.org keys: [682] sites: [] +687 1 user-183@plc.org keys: [683] sites: [] +688 1 user-184@plc.org keys: [684] sites: [] +689 1 user-185@plc.org keys: [685] sites: [] +690 1 user-186@plc.org keys: [686] sites: [] +691 1 user-187@plc.org keys: [687] sites: [] +692 1 user-188@plc.org keys: [688] sites: [] +693 1 user-189@plc.org keys: [689] sites: [] +694 1 user-190@plc.org keys: [690] sites: [] +695 1 user-191@plc.org keys: [691] sites: [] +696 1 user-192@plc.org keys: [692] sites: [] +697 1 user-193@plc.org keys: [693] sites: [] +698 1 user-194@plc.org keys: [694] sites: [] +699 1 user-195@plc.org keys: [695] sites: [] +700 1 user-196@plc.org keys: [696] sites: [] +701 1 user-197@plc.org keys: [697] sites: [] +702 1 user-198@plc.org keys: [698] sites: [] +703 1 user-199@plc.org keys: [699] sites: [] +704 1 user-200@plc.org keys: [700] sites: [] +705 1 user-201@plc.org keys: [701] sites: [] +706 1 user-202@plc.org keys: [702] sites: [] +707 1 user-203@plc.org keys: [703] sites: [] +708 1 user-204@plc.org keys: [704] sites: [] +709 1 user-205@plc.org keys: [705] sites: [] +710 1 user-206@plc.org keys: [706] sites: [] +711 1 user-207@plc.org keys: [707] sites: [] +712 1 user-208@plc.org keys: [708] sites: [] +713 1 user-209@plc.org keys: [709] sites: [] +714 1 user-210@plc.org keys: [710] sites: [] +715 1 user-211@plc.org keys: [711] sites: [] +716 1 user-212@plc.org keys: [712] sites: [] +717 1 user-213@plc.org keys: [713] sites: [] +718 1 user-214@plc.org keys: [714] sites: [] +719 1 user-215@plc.org keys: [715] sites: [] +720 1 user-216@plc.org keys: [716] sites: [] +721 1 user-217@plc.org keys: [717] sites: [] +722 1 user-218@plc.org keys: [718] sites: [] +723 1 user-219@plc.org keys: [719] sites: [] +724 1 user-220@plc.org keys: [720] sites: [] +725 1 user-221@plc.org keys: [721] sites: [] +726 1 user-222@plc.org keys: [722] sites: [] +727 1 user-223@plc.org keys: [723] sites: [] +728 1 user-224@plc.org keys: [724] sites: [] +729 1 user-225@plc.org keys: [725] sites: [] +730 1 user-226@plc.org keys: [726] sites: [] +731 1 user-227@plc.org keys: [727] sites: [] +732 1 user-228@plc.org keys: [728] sites: [] +733 1 user-229@plc.org keys: [729] sites: [] +734 1 user-230@plc.org keys: [730] sites: [] +735 1 user-231@plc.org keys: [731] sites: [] +736 1 user-232@plc.org keys: [732] sites: [] +737 1 user-233@plc.org keys: [733] sites: [] +738 1 user-234@plc.org keys: [734] sites: [] +739 1 user-235@plc.org keys: [735] sites: [] +740 1 user-236@plc.org keys: [736] sites: [] +741 1 user-237@plc.org keys: [737] sites: [] +742 1 user-238@plc.org keys: [738] sites: [] +743 1 user-239@plc.org keys: [739] sites: [] +744 1 user-240@plc.org keys: [740] sites: [] +745 1 user-241@plc.org keys: [741] sites: [] +746 1 user-242@plc.org keys: [742] sites: [] +747 1 user-243@plc.org keys: [743] sites: [] +748 1 user-244@plc.org keys: [744] sites: [] +749 1 user-245@plc.org keys: [745] sites: [] +750 1 user-246@plc.org keys: [746] sites: [] +751 1 user-247@plc.org keys: [747] sites: [] +752 1 user-248@plc.org keys: [748] sites: [] +753 1 user-249@plc.org keys: [749] sites: [] +754 1 user-250@plc.org keys: [750] sites: [] +755 1 user-251@plc.org keys: [751] sites: [] +756 1 user-252@plc.org keys: [752] sites: [] +757 1 user-253@plc.org keys: [753] sites: [] +758 1 user-254@plc.org keys: [754] sites: [] +759 1 user-255@plc.org keys: [755] sites: [] +760 1 user-256@plc.org keys: [756] sites: [] +761 1 user-257@plc.org keys: [757] sites: [] +762 1 user-258@plc.org keys: [758] sites: [] +763 1 user-259@plc.org keys: [759] sites: [] +764 1 user-260@plc.org keys: [760] sites: [] +765 1 user-261@plc.org keys: [761] sites: [] +766 1 user-262@plc.org keys: [762] sites: [] +767 1 user-263@plc.org keys: [763] sites: [] +768 1 user-264@plc.org keys: [764] sites: [] +769 1 user-265@plc.org keys: [765] sites: [] +770 1 user-266@plc.org keys: [766] sites: [] +771 1 user-267@plc.org keys: [767] sites: [] +772 1 user-268@plc.org keys: [768] sites: [] +773 1 user-269@plc.org keys: [769] sites: [] +774 1 user-270@plc.org keys: [770] sites: [] +775 1 user-271@plc.org keys: [771] sites: [] +776 1 user-272@plc.org keys: [772] sites: [] +777 1 user-273@plc.org keys: [773] sites: [] +778 1 user-274@plc.org keys: [774] sites: [] +779 1 user-275@plc.org keys: [775] sites: [] +780 1 user-276@plc.org keys: [776] sites: [] +781 1 user-277@plc.org keys: [777] sites: [] +782 1 user-278@plc.org keys: [778] sites: [] +783 1 user-279@plc.org keys: [779] sites: [] +784 1 user-280@plc.org keys: [780] sites: [] +785 1 user-281@plc.org keys: [781] sites: [] +786 1 user-282@plc.org keys: [782] sites: [] +787 1 user-283@plc.org keys: [783] sites: [] +788 1 user-284@plc.org keys: [784] sites: [] +789 1 user-285@plc.org keys: [785] sites: [] +790 1 user-286@plc.org keys: [786] sites: [] +791 1 user-287@plc.org keys: [787] sites: [] +792 1 user-288@plc.org keys: [788] sites: [] +793 1 user-289@plc.org keys: [789] sites: [] +794 1 user-290@plc.org keys: [790] sites: [] +795 1 user-291@plc.org keys: [791] sites: [] +796 1 user-292@plc.org keys: [792] sites: [] +797 1 user-293@plc.org keys: [793] sites: [] +798 1 user-294@plc.org keys: [794] sites: [] +799 1 user-295@plc.org keys: [795] sites: [] +800 1 user-296@plc.org keys: [796] sites: [] +801 1 user-297@plc.org keys: [797] sites: [] +802 1 user-298@plc.org keys: [798] sites: [] +803 1 user-299@plc.org keys: [799] sites: [] +804 1 user-300@plc.org keys: [800] sites: [] +805 1 user-301@plc.org keys: [801] sites: [] +806 1 user-302@plc.org keys: [802] sites: [] +807 1 user-303@plc.org keys: [803] sites: [] +808 1 user-304@plc.org keys: [804] sites: [] +809 1 user-305@plc.org keys: [805] sites: [] +810 1 user-306@plc.org keys: [806] sites: [] +811 1 user-307@plc.org keys: [807] sites: [] +812 1 user-308@plc.org keys: [808] sites: [] +813 1 user-309@plc.org keys: [809] sites: [] +814 1 user-310@plc.org keys: [810] sites: [] +815 1 user-311@plc.org keys: [811] sites: [] +816 1 user-312@plc.org keys: [812] sites: [] +817 1 user-313@plc.org keys: [813] sites: [] +818 1 user-314@plc.org keys: [814] sites: [] +819 1 user-315@plc.org keys: [815] sites: [] +820 1 user-316@plc.org keys: [816] sites: [] +821 1 user-317@plc.org keys: [817] sites: [] +822 1 user-318@plc.org keys: [818] sites: [] +823 1 user-319@plc.org keys: [819] sites: [] +824 1 user-320@plc.org keys: [820] sites: [] +825 1 user-321@plc.org keys: [821] sites: [] +826 1 user-322@plc.org keys: [822] sites: [] +827 1 user-323@plc.org keys: [823] sites: [] +828 1 user-324@plc.org keys: [824] sites: [] +829 1 user-325@plc.org keys: [825] sites: [] +830 1 user-326@plc.org keys: [826] sites: [] +831 1 user-327@plc.org keys: [827] sites: [] +832 1 user-328@plc.org keys: [828] sites: [] +833 1 user-329@plc.org keys: [829] sites: [] +834 1 user-330@plc.org keys: [830] sites: [] +835 1 user-331@plc.org keys: [831] sites: [] +836 1 user-332@plc.org keys: [832] sites: [] +837 1 user-333@plc.org keys: [833] sites: [] +838 1 user-334@plc.org keys: [834] sites: [] +839 1 user-335@plc.org keys: [835] sites: [] +840 1 user-336@plc.org keys: [836] sites: [] +841 1 user-337@plc.org keys: [837] sites: [] +842 1 user-338@plc.org keys: [838] sites: [] +843 1 user-339@plc.org keys: [839] sites: [] +844 1 user-340@plc.org keys: [840] sites: [] +845 1 user-341@plc.org keys: [841] sites: [] +846 1 user-342@plc.org keys: [842] sites: [] +847 1 user-343@plc.org keys: [843] sites: [] +848 1 user-344@plc.org keys: [844] sites: [] +849 1 user-345@plc.org keys: [845] sites: [] +850 1 user-346@plc.org keys: [846] sites: [] +851 1 user-347@plc.org keys: [847] sites: [] +852 1 user-348@plc.org keys: [848] sites: [] +853 1 user-349@plc.org keys: [849] sites: [] +854 1 user-350@plc.org keys: [850] sites: [] +855 1 user-351@plc.org keys: [851] sites: [] +856 1 user-352@plc.org keys: [852] sites: [] +857 1 user-353@plc.org keys: [853] sites: [] +858 1 user-354@plc.org keys: [854] sites: [] +859 1 user-355@plc.org keys: [855] sites: [] +860 1 user-356@plc.org keys: [856] sites: [] +861 1 user-357@plc.org keys: [857] sites: [] +862 1 user-358@plc.org keys: [858] sites: [] +863 1 user-359@plc.org keys: [859] sites: [] +864 1 user-360@plc.org keys: [860] sites: [] +865 1 user-361@plc.org keys: [861] sites: [] +866 1 user-362@plc.org keys: [862] sites: [] +867 1 user-363@plc.org keys: [863] sites: [] +868 1 user-364@plc.org keys: [864] sites: [] +869 1 user-365@plc.org keys: [865] sites: [] +870 1 user-366@plc.org keys: [866] sites: [] +871 1 user-367@plc.org keys: [867] sites: [] +872 1 user-368@plc.org keys: [868] sites: [] +873 1 user-369@plc.org keys: [869] sites: [] +874 1 user-370@plc.org keys: [870] sites: [] +875 1 user-371@plc.org keys: [871] sites: [] +876 1 user-372@plc.org keys: [872] sites: [] +877 1 user-373@plc.org keys: [873] sites: [] +878 1 user-374@plc.org keys: [874] sites: [] +879 1 user-375@plc.org keys: [875] sites: [] +880 1 user-376@plc.org keys: [876] sites: [] +881 1 user-377@plc.org keys: [877] sites: [] +882 1 user-378@plc.org keys: [878] sites: [] +883 1 user-379@plc.org keys: [879] sites: [] +884 1 user-380@plc.org keys: [880] sites: [] +885 1 user-381@plc.org keys: [881] sites: [] +886 1 user-382@plc.org keys: [882] sites: [] +887 1 user-383@plc.org keys: [883] sites: [] +888 1 user-384@plc.org keys: [884] sites: [] +889 1 user-385@plc.org keys: [885] sites: [] +890 1 user-386@plc.org keys: [886] sites: [] +891 1 user-387@plc.org keys: [887] sites: [] +892 1 user-388@plc.org keys: [888] sites: [] +893 1 user-389@plc.org keys: [889] sites: [] +894 1 user-390@plc.org keys: [890] sites: [] +895 1 user-391@plc.org keys: [891] sites: [] +896 1 user-392@plc.org keys: [892] sites: [] +897 1 user-393@plc.org keys: [893] sites: [] +898 1 user-394@plc.org keys: [894] sites: [] +899 1 user-395@plc.org keys: [895] sites: [] +900 1 user-396@plc.org keys: [896] sites: [] +901 1 user-397@plc.org keys: [897] sites: [] +902 1 user-398@plc.org keys: [898] sites: [] +903 1 user-399@plc.org keys: [899] sites: [] +904 1 user-400@plc.org keys: [900] sites: [] +905 1 user-401@plc.org keys: [901] sites: [] +906 1 user-402@plc.org keys: [902] sites: [] +907 1 user-403@plc.org keys: [903] sites: [] +908 1 user-404@plc.org keys: [904] sites: [] +909 1 user-405@plc.org keys: [905] sites: [] +910 1 user-406@plc.org keys: [906] sites: [] +911 1 user-407@plc.org keys: [907] sites: [] +912 1 user-408@plc.org keys: [908] sites: [] +913 1 user-409@plc.org keys: [909] sites: [] +914 1 user-410@plc.org keys: [910] sites: [] +915 1 user-411@plc.org keys: [911] sites: [] +916 1 user-412@plc.org keys: [912] sites: [] +917 1 user-413@plc.org keys: [913] sites: [] +918 1 user-414@plc.org keys: [914] sites: [] +919 1 user-415@plc.org keys: [915] sites: [] +920 1 user-416@plc.org keys: [916] sites: [] +921 1 user-417@plc.org keys: [917] sites: [] +922 1 user-418@plc.org keys: [918] sites: [] +923 1 user-419@plc.org keys: [919] sites: [] +924 1 user-420@plc.org keys: [920] sites: [] +925 1 user-421@plc.org keys: [921] sites: [] +926 1 user-422@plc.org keys: [922] sites: [] +927 1 user-423@plc.org keys: [923] sites: [] +928 1 user-424@plc.org keys: [924] sites: [] +929 1 user-425@plc.org keys: [925] sites: [] +930 1 user-426@plc.org keys: [926] sites: [] +931 1 user-427@plc.org keys: [927] sites: [] +932 1 user-428@plc.org keys: [928] sites: [] +933 1 user-429@plc.org keys: [929] sites: [] +934 1 user-430@plc.org keys: [930] sites: [] +935 1 user-431@plc.org keys: [931] sites: [] +936 1 user-432@plc.org keys: [932] sites: [] +937 1 user-433@plc.org keys: [933] sites: [] +938 1 user-434@plc.org keys: [934] sites: [] +939 1 user-435@plc.org keys: [935] sites: [] +940 1 user-436@plc.org keys: [936] sites: [] +941 1 user-437@plc.org keys: [937] sites: [] +942 1 user-438@plc.org keys: [938] sites: [] +943 1 user-439@plc.org keys: [939] sites: [] +944 1 user-440@plc.org keys: [940] sites: [] +945 1 user-441@plc.org keys: [941] sites: [] +946 1 user-442@plc.org keys: [942] sites: [] +947 1 user-443@plc.org keys: [943] sites: [] +948 1 user-444@plc.org keys: [944] sites: [] +949 1 user-445@plc.org keys: [945] sites: [] +950 1 user-446@plc.org keys: [946] sites: [] +951 1 user-447@plc.org keys: [947] sites: [] +952 1 user-448@plc.org keys: [948] sites: [] +953 1 user-449@plc.org keys: [949] sites: [] +954 1 user-450@plc.org keys: [950] sites: [] +955 1 user-451@plc.org keys: [951] sites: [] +956 1 user-452@plc.org keys: [952] sites: [] +957 1 user-453@plc.org keys: [953] sites: [] +958 1 user-454@plc.org keys: [954] sites: [] +959 1 user-455@plc.org keys: [955] sites: [] +960 1 user-456@plc.org keys: [956] sites: [] +961 1 user-457@plc.org keys: [957] sites: [] +962 1 user-458@plc.org keys: [958] sites: [] +963 1 user-459@plc.org keys: [959] sites: [] +964 1 user-460@plc.org keys: [960] sites: [] +965 1 user-461@plc.org keys: [961] sites: [] +966 1 user-462@plc.org keys: [962] sites: [] +967 1 user-463@plc.org keys: [963] sites: [] +968 1 user-464@plc.org keys: [964] sites: [] +969 1 user-465@plc.org keys: [965] sites: [] +970 1 user-466@plc.org keys: [966] sites: [] +971 1 user-467@plc.org keys: [967] sites: [] +972 1 user-468@plc.org keys: [968] sites: [] +973 1 user-469@plc.org keys: [969] sites: [] +974 1 user-470@plc.org keys: [970] sites: [] +975 1 user-471@plc.org keys: [971] sites: [] +976 1 user-472@plc.org keys: [972] sites: [] +977 1 user-473@plc.org keys: [973] sites: [] +978 1 user-474@plc.org keys: [974] sites: [] +979 1 user-475@plc.org keys: [975] sites: [] +980 1 user-476@plc.org keys: [976] sites: [] +981 1 user-477@plc.org keys: [977] sites: [] +982 1 user-478@plc.org keys: [978] sites: [] +983 1 user-479@plc.org keys: [979] sites: [] +984 1 user-480@plc.org keys: [980] sites: [] +985 1 user-481@plc.org keys: [981] sites: [] +986 1 user-482@plc.org keys: [982] sites: [] +987 1 user-483@plc.org keys: [983] sites: [] +988 1 user-484@plc.org keys: [984] sites: [] +989 1 user-485@plc.org keys: [985] sites: [] +990 1 user-486@plc.org keys: [986] sites: [] +991 1 user-487@plc.org keys: [987] sites: [] +992 1 user-488@plc.org keys: [988] sites: [] +993 1 user-489@plc.org keys: [989] sites: [] +994 1 user-490@plc.org keys: [990] sites: [] +995 1 user-491@plc.org keys: [991] sites: [] +996 1 user-492@plc.org keys: [992] sites: [] +997 1 user-493@plc.org keys: [993] sites: [] +998 1 user-494@plc.org keys: [994] sites: [] +999 1 user-495@plc.org keys: [995] sites: [] +1000 1 user-496@plc.org keys: [996] sites: [] +1001 1 user-497@plc.org keys: [997] sites: [] +1002 1 user-498@plc.org keys: [998] sites: [] +1003 1 user-499@plc.org keys: [999] sites: [] +1004 1 user-500@plc.org keys: [1000] sites: [] +02: NODES +1 None n2-001.plc2.org sls= [352, 2] site= 2 +2 None n2-002.plc2.org sls= [353, 3] site= 3 +3 None n2-003.plc2.org sls= [354, 4] site= 4 +4 None n2-004.plc2.org sls= [355, 5] site= 5 +5 None n2-005.plc2.org sls= [356, 6] site= 6 +6 None n2-006.plc2.org sls= [357, 7] site= 7 +7 None n2-007.plc2.org sls= [358, 8] site= 8 +8 None n2-008.plc2.org sls= [359, 9] site= 9 +9 None n2-009.plc2.org sls= [360, 10] site= 10 +10 None n2-010.plc2.org sls= [361, 11] site= 11 +11 None n2-011.plc2.org sls= [362, 12] site= 12 +12 None n2-012.plc2.org sls= [363, 13] site= 13 +13 None n2-013.plc2.org sls= [364, 14] site= 14 +14 None n2-014.plc2.org sls= [365, 15] site= 15 +15 None n2-015.plc2.org sls= [366, 16] site= 16 +16 None n2-016.plc2.org sls= [367, 17] site= 17 +17 None n2-017.plc2.org sls= [368, 18] site= 18 +18 None n2-018.plc2.org sls= [369, 19] site= 19 +19 None n2-019.plc2.org sls= [370, 20] site= 20 +20 None n2-020.plc2.org sls= [371, 21] site= 21 +21 None n2-021.plc2.org sls= [372, 22] site= 22 +22 None n2-022.plc2.org sls= [373, 23] site= 23 +23 None n2-023.plc2.org sls= [374, 24] site= 24 +24 None n2-024.plc2.org sls= [375, 25] site= 25 +25 None n2-025.plc2.org sls= [376, 26] site= 26 +26 None n2-026.plc2.org sls= [377, 27] site= 27 +27 None n2-027.plc2.org sls= [378, 28] site= 28 +28 None n2-028.plc2.org sls= [379, 29] site= 29 +29 None n2-029.plc2.org sls= [380, 30] site= 30 +30 None n2-030.plc2.org sls= [381, 31] site= 31 +31 None n2-031.plc2.org sls= [382, 32] site= 32 +32 None n2-032.plc2.org sls= [383, 33] site= 33 +33 None n2-033.plc2.org sls= [384, 34] site= 34 +34 None n2-034.plc2.org sls= [385, 35] site= 35 +35 None n2-035.plc2.org sls= [386, 36] site= 36 +36 None n2-036.plc2.org sls= [387, 37] site= 37 +37 None n2-037.plc2.org sls= [388, 38] site= 38 +38 None n2-038.plc2.org sls= [389, 39] site= 39 +39 None n2-039.plc2.org sls= [390, 40] site= 40 +40 None n2-040.plc2.org sls= [391, 41] site= 41 +41 None n2-041.plc2.org sls= [392, 42] site= 42 +42 None n2-042.plc2.org sls= [393, 43] site= 43 +43 None n2-043.plc2.org sls= [394, 44] site= 44 +44 None n2-044.plc2.org sls= [395, 45] site= 45 +45 None n2-045.plc2.org sls= [396, 46] site= 46 +46 None n2-046.plc2.org sls= [397, 47] site= 47 +47 None n2-047.plc2.org sls= [398, 48] site= 48 +48 None n2-048.plc2.org sls= [399, 49] site= 49 +49 None n2-049.plc2.org sls= [400, 50] site= 50 +50 None n2-050.plc2.org sls= [401, 51] site= 51 +51 None n2-051.plc2.org sls= [402, 52] site= 52 +52 None n2-052.plc2.org sls= [403, 53] site= 53 +53 None n2-053.plc2.org sls= [404, 54] site= 54 +54 None n2-054.plc2.org sls= [405, 55] site= 55 +55 None n2-055.plc2.org sls= [406, 56] site= 56 +56 None n2-056.plc2.org sls= [407, 57] site= 57 +57 None n2-057.plc2.org sls= [408, 58] site= 58 +58 None n2-058.plc2.org sls= [409, 59] site= 59 +59 None n2-059.plc2.org sls= [410, 60] site= 60 +60 None n2-060.plc2.org sls= [411, 61] site= 61 +61 None n2-061.plc2.org sls= [412, 62] site= 62 +62 None n2-062.plc2.org sls= [413, 63] site= 63 +63 None n2-063.plc2.org sls= [414, 64] site= 64 +64 None n2-064.plc2.org sls= [415, 65] site= 65 +65 None n2-065.plc2.org sls= [416, 66] site= 66 +66 None n2-066.plc2.org sls= [417, 67] site= 67 +67 None n2-067.plc2.org sls= [418, 68] site= 68 +68 None n2-068.plc2.org sls= [419, 69] site= 69 +69 None n2-069.plc2.org sls= [420, 70] site= 70 +70 None n2-070.plc2.org sls= [421, 71] site= 71 +71 None n2-071.plc2.org sls= [422, 72] site= 72 +72 None n2-072.plc2.org sls= [423, 73] site= 73 +73 None n2-073.plc2.org sls= [424, 74] site= 74 +74 None n2-074.plc2.org sls= [425, 75] site= 75 +75 None n2-075.plc2.org sls= [426, 76] site= 76 +76 None n2-076.plc2.org sls= [427, 77] site= 77 +77 None n2-077.plc2.org sls= [428, 78] site= 78 +78 None n2-078.plc2.org sls= [429, 79] site= 79 +79 None n2-079.plc2.org sls= [430, 80] site= 80 +80 None n2-080.plc2.org sls= [431, 81] site= 81 +81 None n2-081.plc2.org sls= [432, 82] site= 82 +82 None n2-082.plc2.org sls= [433, 83] site= 83 +83 None n2-083.plc2.org sls= [434, 84] site= 84 +84 None n2-084.plc2.org sls= [435, 85] site= 85 +85 None n2-085.plc2.org sls= [436, 86] site= 86 +86 None n2-086.plc2.org sls= [437, 87] site= 87 +87 None n2-087.plc2.org sls= [438, 88] site= 88 +88 None n2-088.plc2.org sls= [439, 89] site= 89 +89 None n2-089.plc2.org sls= [440, 90] site= 90 +90 None n2-090.plc2.org sls= [441, 91] site= 91 +91 None n2-091.plc2.org sls= [442, 92] site= 92 +92 None n2-092.plc2.org sls= [443, 93] site= 93 +93 None n2-093.plc2.org sls= [444, 94] site= 94 +94 None n2-094.plc2.org sls= [445, 95] site= 95 +95 None n2-095.plc2.org sls= [446, 96] site= 96 +96 None n2-096.plc2.org sls= [447, 97] site= 97 +97 None n2-097.plc2.org sls= [448, 98] site= 98 +98 None n2-098.plc2.org sls= [449, 99] site= 99 +99 None n2-099.plc2.org sls= [450, 100] site= 100 +100 None n2-100.plc2.org sls= [451, 101] site= 101 +101 None n2-101.plc2.org sls= [452, 102] site= 102 +102 None n2-102.plc2.org sls= [453, 103] site= 103 +103 None n2-103.plc2.org sls= [454, 104] site= 104 +104 None n2-104.plc2.org sls= [455, 105] site= 105 +105 None n2-105.plc2.org sls= [456, 106] site= 106 +106 None n2-106.plc2.org sls= [457, 107] site= 107 +107 None n2-107.plc2.org sls= [458, 108] site= 108 +108 None n2-108.plc2.org sls= [459, 109] site= 109 +109 None n2-109.plc2.org sls= [460, 110] site= 110 +110 None n2-110.plc2.org sls= [461, 111] site= 111 +111 None n2-111.plc2.org sls= [462, 112] site= 112 +112 None n2-112.plc2.org sls= [463, 113] site= 113 +113 None n2-113.plc2.org sls= [464, 114] site= 114 +114 None n2-114.plc2.org sls= [465, 115] site= 115 +115 None n2-115.plc2.org sls= [466, 116] site= 116 +116 None n2-116.plc2.org sls= [467, 117] site= 117 +117 None n2-117.plc2.org sls= [468, 118] site= 118 +118 None n2-118.plc2.org sls= [469, 119] site= 119 +119 None n2-119.plc2.org sls= [470, 120] site= 120 +120 None n2-120.plc2.org sls= [471, 121] site= 121 +121 None n2-121.plc2.org sls= [472, 122] site= 122 +122 None n2-122.plc2.org sls= [473, 123] site= 123 +123 None n2-123.plc2.org sls= [474, 124] site= 124 +124 None n2-124.plc2.org sls= [475, 125] site= 125 +125 None n2-125.plc2.org sls= [476, 126] site= 126 +126 None n2-126.plc2.org sls= [477, 127] site= 127 +127 None n2-127.plc2.org sls= [478, 128] site= 128 +128 None n2-128.plc2.org sls= [479, 129] site= 129 +129 None n2-129.plc2.org sls= [480, 130] site= 130 +130 None n2-130.plc2.org sls= [481, 131] site= 131 +131 None n2-131.plc2.org sls= [482, 132] site= 132 +132 None n2-132.plc2.org sls= [483, 133] site= 133 +133 None n2-133.plc2.org sls= [484, 134] site= 134 +134 None n2-134.plc2.org sls= [485, 135] site= 135 +135 None n2-135.plc2.org sls= [486, 136] site= 136 +136 None n2-136.plc2.org sls= [487, 137] site= 137 +137 None n2-137.plc2.org sls= [488, 138] site= 138 +138 None n2-138.plc2.org sls= [489, 139] site= 139 +139 None n2-139.plc2.org sls= [490, 140] site= 140 +140 None n2-140.plc2.org sls= [491, 141] site= 141 +141 None n2-141.plc2.org sls= [492, 142] site= 142 +142 None n2-142.plc2.org sls= [493, 143] site= 143 +143 None n2-143.plc2.org sls= [494, 144] site= 144 +144 None n2-144.plc2.org sls= [495, 145] site= 145 +145 None n2-145.plc2.org sls= [496, 146] site= 146 +146 None n2-146.plc2.org sls= [497, 147] site= 147 +147 None n2-147.plc2.org sls= [498, 148] site= 148 +148 None n2-148.plc2.org sls= [499, 149] site= 149 +149 None n2-149.plc2.org sls= [500, 150] site= 150 +150 None n2-150.plc2.org sls= [501, 151] site= 151 +151 None n2-151.plc2.org sls= [152] site= 152 +152 None n2-152.plc2.org sls= [153] site= 153 +153 None n2-153.plc2.org sls= [154] site= 154 +154 None n2-154.plc2.org sls= [155] site= 155 +155 None n2-155.plc2.org sls= [156] site= 156 +156 None n2-156.plc2.org sls= [157] site= 157 +157 None n2-157.plc2.org sls= [158] site= 158 +158 None n2-158.plc2.org sls= [159] site= 159 +159 None n2-159.plc2.org sls= [160] site= 160 +160 None n2-160.plc2.org sls= [161] site= 161 +161 None n2-161.plc2.org sls= [162] site= 162 +162 None n2-162.plc2.org sls= [163] site= 163 +163 None n2-163.plc2.org sls= [164] site= 164 +164 None n2-164.plc2.org sls= [165] site= 165 +165 None n2-165.plc2.org sls= [166] site= 166 +166 None n2-166.plc2.org sls= [167] site= 167 +167 None n2-167.plc2.org sls= [168] site= 168 +168 None n2-168.plc2.org sls= [169] site= 169 +169 None n2-169.plc2.org sls= [170] site= 170 +170 None n2-170.plc2.org sls= [171] site= 171 +171 None n2-171.plc2.org sls= [172] site= 172 +172 None n2-172.plc2.org sls= [173] site= 173 +173 None n2-173.plc2.org sls= [174] site= 174 +174 None n2-174.plc2.org sls= [175] site= 175 +175 None n2-175.plc2.org sls= [176] site= 176 +176 None n2-176.plc2.org sls= [177] site= 177 +177 None n2-177.plc2.org sls= [178] site= 178 +178 None n2-178.plc2.org sls= [179] site= 179 +179 None n2-179.plc2.org sls= [180] site= 180 +180 None n2-180.plc2.org sls= [181] site= 181 +181 None n2-181.plc2.org sls= [182] site= 182 +182 None n2-182.plc2.org sls= [183] site= 183 +183 None n2-183.plc2.org sls= [184] site= 184 +184 None n2-184.plc2.org sls= [185] site= 185 +185 None n2-185.plc2.org sls= [186] site= 186 +186 None n2-186.plc2.org sls= [187] site= 187 +187 None n2-187.plc2.org sls= [188] site= 188 +188 None n2-188.plc2.org sls= [189] site= 189 +189 None n2-189.plc2.org sls= [190] site= 190 +190 None n2-190.plc2.org sls= [191] site= 191 +191 None n2-191.plc2.org sls= [192] site= 192 +192 None n2-192.plc2.org sls= [193] site= 193 +193 None n2-193.plc2.org sls= [194] site= 194 +194 None n2-194.plc2.org sls= [195] site= 195 +195 None n2-195.plc2.org sls= [196] site= 196 +196 None n2-196.plc2.org sls= [197] site= 197 +197 None n2-197.plc2.org sls= [198] site= 198 +198 None n2-198.plc2.org sls= [199] site= 199 +199 None n2-199.plc2.org sls= [200] site= 200 +200 None n2-200.plc2.org sls= [201] site= 201 +201 None n2-201.plc2.org sls= [202] site= 2 +202 None n2-202.plc2.org sls= [203] site= 3 +203 None n2-203.plc2.org sls= [204] site= 4 +204 None n2-204.plc2.org sls= [205] site= 5 +205 None n2-205.plc2.org sls= [206] site= 6 +206 None n2-206.plc2.org sls= [207] site= 7 +207 None n2-207.plc2.org sls= [208] site= 8 +208 None n2-208.plc2.org sls= [209] site= 9 +209 None n2-209.plc2.org sls= [210] site= 10 +210 None n2-210.plc2.org sls= [211] site= 11 +211 None n2-211.plc2.org sls= [212] site= 12 +212 None n2-212.plc2.org sls= [213] site= 13 +213 None n2-213.plc2.org sls= [214] site= 14 +214 None n2-214.plc2.org sls= [215] site= 15 +215 None n2-215.plc2.org sls= [216] site= 16 +216 None n2-216.plc2.org sls= [217] site= 17 +217 None n2-217.plc2.org sls= [218] site= 18 +218 None n2-218.plc2.org sls= [219] site= 19 +219 None n2-219.plc2.org sls= [220] site= 20 +220 None n2-220.plc2.org sls= [221] site= 21 +221 None n2-221.plc2.org sls= [222] site= 22 +222 None n2-222.plc2.org sls= [223] site= 23 +223 None n2-223.plc2.org sls= [224] site= 24 +224 None n2-224.plc2.org sls= [225] site= 25 +225 None n2-225.plc2.org sls= [226] site= 26 +226 None n2-226.plc2.org sls= [227] site= 27 +227 None n2-227.plc2.org sls= [228] site= 28 +228 None n2-228.plc2.org sls= [229] site= 29 +229 None n2-229.plc2.org sls= [230] site= 30 +230 None n2-230.plc2.org sls= [231] site= 31 +231 None n2-231.plc2.org sls= [232] site= 32 +232 None n2-232.plc2.org sls= [233] site= 33 +233 None n2-233.plc2.org sls= [234] site= 34 +234 None n2-234.plc2.org sls= [235] site= 35 +235 None n2-235.plc2.org sls= [236] site= 36 +236 None n2-236.plc2.org sls= [237] site= 37 +237 None n2-237.plc2.org sls= [238] site= 38 +238 None n2-238.plc2.org sls= [239] site= 39 +239 None n2-239.plc2.org sls= [240] site= 40 +240 None n2-240.plc2.org sls= [241] site= 41 +241 None n2-241.plc2.org sls= [242] site= 42 +242 None n2-242.plc2.org sls= [243] site= 43 +243 None n2-243.plc2.org sls= [244] site= 44 +244 None n2-244.plc2.org sls= [245] site= 45 +245 None n2-245.plc2.org sls= [246] site= 46 +246 None n2-246.plc2.org sls= [247] site= 47 +247 None n2-247.plc2.org sls= [248] site= 48 +248 None n2-248.plc2.org sls= [249] site= 49 +249 None n2-249.plc2.org sls= [250] site= 50 +250 None n2-250.plc2.org sls= [251] site= 51 +251 None n2-251.plc2.org sls= [252] site= 52 +252 None n2-252.plc2.org sls= [253] site= 53 +253 None n2-253.plc2.org sls= [254] site= 54 +254 None n2-254.plc2.org sls= [255] site= 55 +255 None n2-255.plc2.org sls= [256] site= 56 +256 None n2-256.plc2.org sls= [257] site= 57 +257 None n2-257.plc2.org sls= [258] site= 58 +258 None n2-258.plc2.org sls= [259] site= 59 +259 None n2-259.plc2.org sls= [260] site= 60 +260 None n2-260.plc2.org sls= [261] site= 61 +261 None n2-261.plc2.org sls= [262] site= 62 +262 None n2-262.plc2.org sls= [263] site= 63 +263 None n2-263.plc2.org sls= [264] site= 64 +264 None n2-264.plc2.org sls= [265] site= 65 +265 None n2-265.plc2.org sls= [266] site= 66 +266 None n2-266.plc2.org sls= [267] site= 67 +267 None n2-267.plc2.org sls= [268] site= 68 +268 None n2-268.plc2.org sls= [269] site= 69 +269 None n2-269.plc2.org sls= [270] site= 70 +270 None n2-270.plc2.org sls= [271] site= 71 +271 None n2-271.plc2.org sls= [272] site= 72 +272 None n2-272.plc2.org sls= [273] site= 73 +273 None n2-273.plc2.org sls= [274] site= 74 +274 None n2-274.plc2.org sls= [275] site= 75 +275 None n2-275.plc2.org sls= [276] site= 76 +276 None n2-276.plc2.org sls= [277] site= 77 +277 None n2-277.plc2.org sls= [278] site= 78 +278 None n2-278.plc2.org sls= [279] site= 79 +279 None n2-279.plc2.org sls= [280] site= 80 +280 None n2-280.plc2.org sls= [281] site= 81 +281 None n2-281.plc2.org sls= [282] site= 82 +282 None n2-282.plc2.org sls= [283] site= 83 +283 None n2-283.plc2.org sls= [284] site= 84 +284 None n2-284.plc2.org sls= [285] site= 85 +285 None n2-285.plc2.org sls= [286] site= 86 +286 None n2-286.plc2.org sls= [287] site= 87 +287 None n2-287.plc2.org sls= [288] site= 88 +288 None n2-288.plc2.org sls= [289] site= 89 +289 None n2-289.plc2.org sls= [290] site= 90 +290 None n2-290.plc2.org sls= [291] site= 91 +291 None n2-291.plc2.org sls= [292] site= 92 +292 None n2-292.plc2.org sls= [293] site= 93 +293 None n2-293.plc2.org sls= [294] site= 94 +294 None n2-294.plc2.org sls= [295] site= 95 +295 None n2-295.plc2.org sls= [296] site= 96 +296 None n2-296.plc2.org sls= [297] site= 97 +297 None n2-297.plc2.org sls= [298] site= 98 +298 None n2-298.plc2.org sls= [299] site= 99 +299 None n2-299.plc2.org sls= [300] site= 100 +300 None n2-300.plc2.org sls= [301] site= 101 +301 None n2-301.plc2.org sls= [302] site= 102 +302 None n2-302.plc2.org sls= [303] site= 103 +303 None n2-303.plc2.org sls= [304] site= 104 +304 None n2-304.plc2.org sls= [305] site= 105 +305 None n2-305.plc2.org sls= [306] site= 106 +306 None n2-306.plc2.org sls= [307] site= 107 +307 None n2-307.plc2.org sls= [308] site= 108 +308 None n2-308.plc2.org sls= [309] site= 109 +309 None n2-309.plc2.org sls= [310] site= 110 +310 None n2-310.plc2.org sls= [311] site= 111 +311 None n2-311.plc2.org sls= [312] site= 112 +312 None n2-312.plc2.org sls= [313] site= 113 +313 None n2-313.plc2.org sls= [314] site= 114 +314 None n2-314.plc2.org sls= [315] site= 115 +315 None n2-315.plc2.org sls= [316] site= 116 +316 None n2-316.plc2.org sls= [317] site= 117 +317 None n2-317.plc2.org sls= [318] site= 118 +318 None n2-318.plc2.org sls= [319] site= 119 +319 None n2-319.plc2.org sls= [320] site= 120 +320 None n2-320.plc2.org sls= [321] site= 121 +321 None n2-321.plc2.org sls= [322] site= 122 +322 None n2-322.plc2.org sls= [323] site= 123 +323 None n2-323.plc2.org sls= [324] site= 124 +324 None n2-324.plc2.org sls= [325] site= 125 +325 None n2-325.plc2.org sls= [326] site= 126 +326 None n2-326.plc2.org sls= [327] site= 127 +327 None n2-327.plc2.org sls= [328] site= 128 +328 None n2-328.plc2.org sls= [329] site= 129 +329 None n2-329.plc2.org sls= [330] site= 130 +330 None n2-330.plc2.org sls= [331] site= 131 +331 None n2-331.plc2.org sls= [332] site= 132 +332 None n2-332.plc2.org sls= [333] site= 133 +333 None n2-333.plc2.org sls= [334] site= 134 +334 None n2-334.plc2.org sls= [335] site= 135 +335 None n2-335.plc2.org sls= [336] site= 136 +336 None n2-336.plc2.org sls= [337] site= 137 +337 None n2-337.plc2.org sls= [338] site= 138 +338 None n2-338.plc2.org sls= [339] site= 139 +339 None n2-339.plc2.org sls= [340] site= 140 +340 None n2-340.plc2.org sls= [341] site= 141 +341 None n2-341.plc2.org sls= [342] site= 142 +342 None n2-342.plc2.org sls= [343] site= 143 +343 None n2-343.plc2.org sls= [344] site= 144 +344 None n2-344.plc2.org sls= [345] site= 145 +345 None n2-345.plc2.org sls= [346] site= 146 +346 None n2-346.plc2.org sls= [347] site= 147 +347 None n2-347.plc2.org sls= [348] site= 148 +348 None n2-348.plc2.org sls= [349] site= 149 +349 None n2-349.plc2.org sls= [350] site= 150 +350 None n2-350.plc2.org sls= [351] site= 151 +351 1 n1-001.plc1.org sls= [352, 2] site= 203 +352 1 n1-002.plc1.org sls= [353, 3] site= 204 +353 1 n1-003.plc1.org sls= [354, 4] site= 205 +354 1 n1-004.plc1.org sls= [355, 5] site= 206 +355 1 n1-005.plc1.org sls= [356, 6] site= 207 +356 1 n1-006.plc1.org sls= [357, 7] site= 208 +357 1 n1-007.plc1.org sls= [358, 8] site= 209 +358 1 n1-008.plc1.org sls= [359, 9] site= 210 +359 1 n1-009.plc1.org sls= [360, 10] site= 211 +360 1 n1-010.plc1.org sls= [361, 11] site= 212 +361 1 n1-011.plc1.org sls= [362, 12] site= 213 +362 1 n1-012.plc1.org sls= [363, 13] site= 214 +363 1 n1-013.plc1.org sls= [364, 14] site= 215 +364 1 n1-014.plc1.org sls= [365, 15] site= 216 +365 1 n1-015.plc1.org sls= [366, 16] site= 217 +366 1 n1-016.plc1.org sls= [367, 17] site= 218 +367 1 n1-017.plc1.org sls= [368, 18] site= 219 +368 1 n1-018.plc1.org sls= [369, 19] site= 220 +369 1 n1-019.plc1.org sls= [370, 20] site= 221 +370 1 n1-020.plc1.org sls= [371, 21] site= 222 +371 1 n1-021.plc1.org sls= [372, 22] site= 223 +372 1 n1-022.plc1.org sls= [373, 23] site= 224 +373 1 n1-023.plc1.org sls= [374, 24] site= 225 +374 1 n1-024.plc1.org sls= [375, 25] site= 226 +375 1 n1-025.plc1.org sls= [376, 26] site= 227 +376 1 n1-026.plc1.org sls= [377, 27] site= 228 +377 1 n1-027.plc1.org sls= [378, 28] site= 229 +378 1 n1-028.plc1.org sls= [379, 29] site= 230 +379 1 n1-029.plc1.org sls= [380, 30] site= 231 +380 1 n1-030.plc1.org sls= [381, 31] site= 232 +381 1 n1-031.plc1.org sls= [382, 32] site= 233 +382 1 n1-032.plc1.org sls= [383, 33] site= 234 +383 1 n1-033.plc1.org sls= [384, 34] site= 235 +384 1 n1-034.plc1.org sls= [385, 35] site= 236 +385 1 n1-035.plc1.org sls= [386, 36] site= 237 +386 1 n1-036.plc1.org sls= [387, 37] site= 238 +387 1 n1-037.plc1.org sls= [388, 38] site= 239 +388 1 n1-038.plc1.org sls= [389, 39] site= 240 +389 1 n1-039.plc1.org sls= [390, 40] site= 241 +390 1 n1-040.plc1.org sls= [391, 41] site= 242 +391 1 n1-041.plc1.org sls= [392, 42] site= 243 +392 1 n1-042.plc1.org sls= [393, 43] site= 244 +393 1 n1-043.plc1.org sls= [394, 44] site= 245 +394 1 n1-044.plc1.org sls= [395, 45] site= 246 +395 1 n1-045.plc1.org sls= [396, 46] site= 247 +396 1 n1-046.plc1.org sls= [397, 47] site= 248 +397 1 n1-047.plc1.org sls= [398, 48] site= 249 +398 1 n1-048.plc1.org sls= [399, 49] site= 250 +399 1 n1-049.plc1.org sls= [400, 50] site= 251 +400 1 n1-050.plc1.org sls= [401, 51] site= 252 +401 1 n1-051.plc1.org sls= [402, 52] site= 253 +402 1 n1-052.plc1.org sls= [403, 53] site= 254 +403 1 n1-053.plc1.org sls= [404, 54] site= 255 +404 1 n1-054.plc1.org sls= [405, 55] site= 256 +405 1 n1-055.plc1.org sls= [406, 56] site= 257 +406 1 n1-056.plc1.org sls= [407, 57] site= 258 +407 1 n1-057.plc1.org sls= [408, 58] site= 259 +408 1 n1-058.plc1.org sls= [409, 59] site= 260 +409 1 n1-059.plc1.org sls= [410, 60] site= 261 +410 1 n1-060.plc1.org sls= [411, 61] site= 262 +411 1 n1-061.plc1.org sls= [412, 62] site= 263 +412 1 n1-062.plc1.org sls= [413, 63] site= 264 +413 1 n1-063.plc1.org sls= [414, 64] site= 265 +414 1 n1-064.plc1.org sls= [415, 65] site= 266 +415 1 n1-065.plc1.org sls= [416, 66] site= 267 +416 1 n1-066.plc1.org sls= [417, 67] site= 268 +417 1 n1-067.plc1.org sls= [418, 68] site= 269 +418 1 n1-068.plc1.org sls= [419, 69] site= 270 +419 1 n1-069.plc1.org sls= [420, 70] site= 271 +420 1 n1-070.plc1.org sls= [421, 71] site= 272 +421 1 n1-071.plc1.org sls= [422, 72] site= 273 +422 1 n1-072.plc1.org sls= [423, 73] site= 274 +423 1 n1-073.plc1.org sls= [424, 74] site= 275 +424 1 n1-074.plc1.org sls= [425, 75] site= 276 +425 1 n1-075.plc1.org sls= [426, 76] site= 277 +426 1 n1-076.plc1.org sls= [427, 77] site= 278 +427 1 n1-077.plc1.org sls= [428, 78] site= 279 +428 1 n1-078.plc1.org sls= [429, 79] site= 280 +429 1 n1-079.plc1.org sls= [430, 80] site= 281 +430 1 n1-080.plc1.org sls= [431, 81] site= 282 +431 1 n1-081.plc1.org sls= [432, 82] site= 283 +432 1 n1-082.plc1.org sls= [433, 83] site= 284 +433 1 n1-083.plc1.org sls= [434, 84] site= 285 +434 1 n1-084.plc1.org sls= [435, 85] site= 286 +435 1 n1-085.plc1.org sls= [436, 86] site= 287 +436 1 n1-086.plc1.org sls= [437, 87] site= 288 +437 1 n1-087.plc1.org sls= [438, 88] site= 289 +438 1 n1-088.plc1.org sls= [439, 89] site= 290 +439 1 n1-089.plc1.org sls= [440, 90] site= 291 +440 1 n1-090.plc1.org sls= [441, 91] site= 292 +441 1 n1-091.plc1.org sls= [442, 92] site= 293 +442 1 n1-092.plc1.org sls= [443, 93] site= 294 +443 1 n1-093.plc1.org sls= [444, 94] site= 295 +444 1 n1-094.plc1.org sls= [445, 95] site= 296 +445 1 n1-095.plc1.org sls= [446, 96] site= 297 +446 1 n1-096.plc1.org sls= [447, 97] site= 298 +447 1 n1-097.plc1.org sls= [448, 98] site= 299 +448 1 n1-098.plc1.org sls= [449, 99] site= 300 +449 1 n1-099.plc1.org sls= [450, 100] site= 301 +450 1 n1-100.plc1.org sls= [451, 101] site= 302 +451 1 n1-101.plc1.org sls= [452, 102] site= 303 +452 1 n1-102.plc1.org sls= [453, 103] site= 304 +453 1 n1-103.plc1.org sls= [454, 104] site= 305 +454 1 n1-104.plc1.org sls= [455, 105] site= 306 +455 1 n1-105.plc1.org sls= [456, 106] site= 307 +456 1 n1-106.plc1.org sls= [457, 107] site= 308 +457 1 n1-107.plc1.org sls= [458, 108] site= 309 +458 1 n1-108.plc1.org sls= [459, 109] site= 310 +459 1 n1-109.plc1.org sls= [460, 110] site= 311 +460 1 n1-110.plc1.org sls= [461, 111] site= 312 +461 1 n1-111.plc1.org sls= [462, 112] site= 313 +462 1 n1-112.plc1.org sls= [463, 113] site= 314 +463 1 n1-113.plc1.org sls= [464, 114] site= 315 +464 1 n1-114.plc1.org sls= [465, 115] site= 316 +465 1 n1-115.plc1.org sls= [466, 116] site= 317 +466 1 n1-116.plc1.org sls= [467, 117] site= 318 +467 1 n1-117.plc1.org sls= [468, 118] site= 319 +468 1 n1-118.plc1.org sls= [469, 119] site= 320 +469 1 n1-119.plc1.org sls= [470, 120] site= 321 +470 1 n1-120.plc1.org sls= [471, 121] site= 322 +471 1 n1-121.plc1.org sls= [472, 122] site= 323 +472 1 n1-122.plc1.org sls= [473, 123] site= 324 +473 1 n1-123.plc1.org sls= [474, 124] site= 325 +474 1 n1-124.plc1.org sls= [475, 125] site= 326 +475 1 n1-125.plc1.org sls= [476, 126] site= 327 +476 1 n1-126.plc1.org sls= [477, 127] site= 328 +477 1 n1-127.plc1.org sls= [478, 128] site= 329 +478 1 n1-128.plc1.org sls= [479, 129] site= 330 +479 1 n1-129.plc1.org sls= [480, 130] site= 331 +480 1 n1-130.plc1.org sls= [481, 131] site= 332 +481 1 n1-131.plc1.org sls= [482, 132] site= 333 +482 1 n1-132.plc1.org sls= [483, 133] site= 334 +483 1 n1-133.plc1.org sls= [484, 134] site= 335 +484 1 n1-134.plc1.org sls= [485, 135] site= 336 +485 1 n1-135.plc1.org sls= [486, 136] site= 337 +486 1 n1-136.plc1.org sls= [487, 137] site= 338 +487 1 n1-137.plc1.org sls= [488, 138] site= 339 +488 1 n1-138.plc1.org sls= [489, 139] site= 340 +489 1 n1-139.plc1.org sls= [490, 140] site= 341 +490 1 n1-140.plc1.org sls= [491, 141] site= 342 +491 1 n1-141.plc1.org sls= [492, 142] site= 343 +492 1 n1-142.plc1.org sls= [493, 143] site= 344 +493 1 n1-143.plc1.org sls= [494, 144] site= 345 +494 1 n1-144.plc1.org sls= [495, 145] site= 346 +495 1 n1-145.plc1.org sls= [496, 146] site= 347 +496 1 n1-146.plc1.org sls= [497, 147] site= 348 +497 1 n1-147.plc1.org sls= [498, 148] site= 349 +498 1 n1-148.plc1.org sls= [499, 149] site= 350 +499 1 n1-149.plc1.org sls= [500, 150] site= 351 +500 1 n1-150.plc1.org sls= [501, 151] site= 352 +501 1 n1-151.plc1.org sls= [152] site= 353 +502 1 n1-152.plc1.org sls= [153] site= 354 +503 1 n1-153.plc1.org sls= [154] site= 355 +504 1 n1-154.plc1.org sls= [155] site= 356 +505 1 n1-155.plc1.org sls= [156] site= 357 +506 1 n1-156.plc1.org sls= [157] site= 358 +507 1 n1-157.plc1.org sls= [158] site= 359 +508 1 n1-158.plc1.org sls= [159] site= 360 +509 1 n1-159.plc1.org sls= [160] site= 361 +510 1 n1-160.plc1.org sls= [161] site= 362 +511 1 n1-161.plc1.org sls= [162] site= 363 +512 1 n1-162.plc1.org sls= [163] site= 364 +513 1 n1-163.plc1.org sls= [164] site= 365 +514 1 n1-164.plc1.org sls= [165] site= 366 +515 1 n1-165.plc1.org sls= [166] site= 367 +516 1 n1-166.plc1.org sls= [167] site= 368 +517 1 n1-167.plc1.org sls= [168] site= 369 +518 1 n1-168.plc1.org sls= [169] site= 370 +519 1 n1-169.plc1.org sls= [170] site= 371 +520 1 n1-170.plc1.org sls= [171] site= 372 +521 1 n1-171.plc1.org sls= [172] site= 373 +522 1 n1-172.plc1.org sls= [173] site= 374 +523 1 n1-173.plc1.org sls= [174] site= 375 +524 1 n1-174.plc1.org sls= [175] site= 376 +525 1 n1-175.plc1.org sls= [176] site= 377 +526 1 n1-176.plc1.org sls= [177] site= 378 +527 1 n1-177.plc1.org sls= [178] site= 379 +528 1 n1-178.plc1.org sls= [179] site= 380 +529 1 n1-179.plc1.org sls= [180] site= 381 +530 1 n1-180.plc1.org sls= [181] site= 382 +531 1 n1-181.plc1.org sls= [182] site= 383 +532 1 n1-182.plc1.org sls= [183] site= 384 +533 1 n1-183.plc1.org sls= [184] site= 385 +534 1 n1-184.plc1.org sls= [185] site= 386 +535 1 n1-185.plc1.org sls= [186] site= 387 +536 1 n1-186.plc1.org sls= [187] site= 388 +537 1 n1-187.plc1.org sls= [188] site= 389 +538 1 n1-188.plc1.org sls= [189] site= 390 +539 1 n1-189.plc1.org sls= [190] site= 391 +540 1 n1-190.plc1.org sls= [191] site= 392 +541 1 n1-191.plc1.org sls= [192] site= 393 +542 1 n1-192.plc1.org sls= [193] site= 394 +543 1 n1-193.plc1.org sls= [194] site= 395 +544 1 n1-194.plc1.org sls= [195] site= 396 +545 1 n1-195.plc1.org sls= [196] site= 397 +546 1 n1-196.plc1.org sls= [197] site= 398 +547 1 n1-197.plc1.org sls= [198] site= 399 +548 1 n1-198.plc1.org sls= [199] site= 400 +549 1 n1-199.plc1.org sls= [200] site= 401 +550 1 n1-200.plc1.org sls= [201] site= 402 +551 1 n1-201.plc1.org sls= [202] site= 203 +552 1 n1-202.plc1.org sls= [203] site= 204 +553 1 n1-203.plc1.org sls= [204] site= 205 +554 1 n1-204.plc1.org sls= [205] site= 206 +555 1 n1-205.plc1.org sls= [206] site= 207 +556 1 n1-206.plc1.org sls= [207] site= 208 +557 1 n1-207.plc1.org sls= [208] site= 209 +558 1 n1-208.plc1.org sls= [209] site= 210 +559 1 n1-209.plc1.org sls= [210] site= 211 +560 1 n1-210.plc1.org sls= [211] site= 212 +561 1 n1-211.plc1.org sls= [212] site= 213 +562 1 n1-212.plc1.org sls= [213] site= 214 +563 1 n1-213.plc1.org sls= [214] site= 215 +564 1 n1-214.plc1.org sls= [215] site= 216 +565 1 n1-215.plc1.org sls= [216] site= 217 +566 1 n1-216.plc1.org sls= [217] site= 218 +567 1 n1-217.plc1.org sls= [218] site= 219 +568 1 n1-218.plc1.org sls= [219] site= 220 +569 1 n1-219.plc1.org sls= [220] site= 221 +570 1 n1-220.plc1.org sls= [221] site= 222 +571 1 n1-221.plc1.org sls= [222] site= 223 +572 1 n1-222.plc1.org sls= [223] site= 224 +573 1 n1-223.plc1.org sls= [224] site= 225 +574 1 n1-224.plc1.org sls= [225] site= 226 +575 1 n1-225.plc1.org sls= [226] site= 227 +576 1 n1-226.plc1.org sls= [227] site= 228 +577 1 n1-227.plc1.org sls= [228] site= 229 +578 1 n1-228.plc1.org sls= [229] site= 230 +579 1 n1-229.plc1.org sls= [230] site= 231 +580 1 n1-230.plc1.org sls= [231] site= 232 +581 1 n1-231.plc1.org sls= [232] site= 233 +582 1 n1-232.plc1.org sls= [233] site= 234 +583 1 n1-233.plc1.org sls= [234] site= 235 +584 1 n1-234.plc1.org sls= [235] site= 236 +585 1 n1-235.plc1.org sls= [236] site= 237 +586 1 n1-236.plc1.org sls= [237] site= 238 +587 1 n1-237.plc1.org sls= [238] site= 239 +588 1 n1-238.plc1.org sls= [239] site= 240 +589 1 n1-239.plc1.org sls= [240] site= 241 +590 1 n1-240.plc1.org sls= [241] site= 242 +591 1 n1-241.plc1.org sls= [242] site= 243 +592 1 n1-242.plc1.org sls= [243] site= 244 +593 1 n1-243.plc1.org sls= [244] site= 245 +594 1 n1-244.plc1.org sls= [245] site= 246 +595 1 n1-245.plc1.org sls= [246] site= 247 +596 1 n1-246.plc1.org sls= [247] site= 248 +597 1 n1-247.plc1.org sls= [248] site= 249 +598 1 n1-248.plc1.org sls= [249] site= 250 +599 1 n1-249.plc1.org sls= [250] site= 251 +600 1 n1-250.plc1.org sls= [251] site= 252 +601 1 n1-251.plc1.org sls= [252] site= 253 +602 1 n1-252.plc1.org sls= [253] site= 254 +603 1 n1-253.plc1.org sls= [254] site= 255 +604 1 n1-254.plc1.org sls= [255] site= 256 +605 1 n1-255.plc1.org sls= [256] site= 257 +606 1 n1-256.plc1.org sls= [257] site= 258 +607 1 n1-257.plc1.org sls= [258] site= 259 +608 1 n1-258.plc1.org sls= [259] site= 260 +609 1 n1-259.plc1.org sls= [260] site= 261 +610 1 n1-260.plc1.org sls= [261] site= 262 +611 1 n1-261.plc1.org sls= [262] site= 263 +612 1 n1-262.plc1.org sls= [263] site= 264 +613 1 n1-263.plc1.org sls= [264] site= 265 +614 1 n1-264.plc1.org sls= [265] site= 266 +615 1 n1-265.plc1.org sls= [266] site= 267 +616 1 n1-266.plc1.org sls= [267] site= 268 +617 1 n1-267.plc1.org sls= [268] site= 269 +618 1 n1-268.plc1.org sls= [269] site= 270 +619 1 n1-269.plc1.org sls= [270] site= 271 +620 1 n1-270.plc1.org sls= [271] site= 272 +621 1 n1-271.plc1.org sls= [272] site= 273 +622 1 n1-272.plc1.org sls= [273] site= 274 +623 1 n1-273.plc1.org sls= [274] site= 275 +624 1 n1-274.plc1.org sls= [275] site= 276 +625 1 n1-275.plc1.org sls= [276] site= 277 +626 1 n1-276.plc1.org sls= [277] site= 278 +627 1 n1-277.plc1.org sls= [278] site= 279 +628 1 n1-278.plc1.org sls= [279] site= 280 +629 1 n1-279.plc1.org sls= [280] site= 281 +630 1 n1-280.plc1.org sls= [281] site= 282 +631 1 n1-281.plc1.org sls= [282] site= 283 +632 1 n1-282.plc1.org sls= [283] site= 284 +633 1 n1-283.plc1.org sls= [284] site= 285 +634 1 n1-284.plc1.org sls= [285] site= 286 +635 1 n1-285.plc1.org sls= [286] site= 287 +636 1 n1-286.plc1.org sls= [287] site= 288 +637 1 n1-287.plc1.org sls= [288] site= 289 +638 1 n1-288.plc1.org sls= [289] site= 290 +639 1 n1-289.plc1.org sls= [290] site= 291 +640 1 n1-290.plc1.org sls= [291] site= 292 +641 1 n1-291.plc1.org sls= [292] site= 293 +642 1 n1-292.plc1.org sls= [293] site= 294 +643 1 n1-293.plc1.org sls= [294] site= 295 +644 1 n1-294.plc1.org sls= [295] site= 296 +645 1 n1-295.plc1.org sls= [296] site= 297 +646 1 n1-296.plc1.org sls= [297] site= 298 +647 1 n1-297.plc1.org sls= [298] site= 299 +648 1 n1-298.plc1.org sls= [299] site= 300 +649 1 n1-299.plc1.org sls= [300] site= 301 +650 1 n1-300.plc1.org sls= [301] site= 302 +651 1 n1-301.plc1.org sls= [302] site= 303 +652 1 n1-302.plc1.org sls= [303] site= 304 +653 1 n1-303.plc1.org sls= [304] site= 305 +654 1 n1-304.plc1.org sls= [305] site= 306 +655 1 n1-305.plc1.org sls= [306] site= 307 +656 1 n1-306.plc1.org sls= [307] site= 308 +657 1 n1-307.plc1.org sls= [308] site= 309 +658 1 n1-308.plc1.org sls= [309] site= 310 +659 1 n1-309.plc1.org sls= [310] site= 311 +660 1 n1-310.plc1.org sls= [311] site= 312 +661 1 n1-311.plc1.org sls= [312] site= 313 +662 1 n1-312.plc1.org sls= [313] site= 314 +663 1 n1-313.plc1.org sls= [314] site= 315 +664 1 n1-314.plc1.org sls= [315] site= 316 +665 1 n1-315.plc1.org sls= [316] site= 317 +666 1 n1-316.plc1.org sls= [317] site= 318 +667 1 n1-317.plc1.org sls= [318] site= 319 +668 1 n1-318.plc1.org sls= [319] site= 320 +669 1 n1-319.plc1.org sls= [320] site= 321 +670 1 n1-320.plc1.org sls= [321] site= 322 +671 1 n1-321.plc1.org sls= [322] site= 323 +672 1 n1-322.plc1.org sls= [323] site= 324 +673 1 n1-323.plc1.org sls= [324] site= 325 +674 1 n1-324.plc1.org sls= [325] site= 326 +675 1 n1-325.plc1.org sls= [326] site= 327 +676 1 n1-326.plc1.org sls= [327] site= 328 +677 1 n1-327.plc1.org sls= [328] site= 329 +678 1 n1-328.plc1.org sls= [329] site= 330 +679 1 n1-329.plc1.org sls= [330] site= 331 +680 1 n1-330.plc1.org sls= [331] site= 332 +681 1 n1-331.plc1.org sls= [332] site= 333 +682 1 n1-332.plc1.org sls= [333] site= 334 +683 1 n1-333.plc1.org sls= [334] site= 335 +684 1 n1-334.plc1.org sls= [335] site= 336 +685 1 n1-335.plc1.org sls= [336] site= 337 +686 1 n1-336.plc1.org sls= [337] site= 338 +687 1 n1-337.plc1.org sls= [338] site= 339 +688 1 n1-338.plc1.org sls= [339] site= 340 +689 1 n1-339.plc1.org sls= [340] site= 341 +690 1 n1-340.plc1.org sls= [341] site= 342 +691 1 n1-341.plc1.org sls= [342] site= 343 +692 1 n1-342.plc1.org sls= [343] site= 344 +693 1 n1-343.plc1.org sls= [344] site= 345 +694 1 n1-344.plc1.org sls= [345] site= 346 +695 1 n1-345.plc1.org sls= [346] site= 347 +696 1 n1-346.plc1.org sls= [347] site= 348 +697 1 n1-347.plc1.org sls= [348] site= 349 +698 1 n1-348.plc1.org sls= [349] site= 350 +699 1 n1-349.plc1.org sls= [350] site= 351 +700 1 n1-350.plc1.org sls= [351] site= 352 +02: SLICES +name: plc2_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183554012 +name: oneb_slice1 id: 02 peer: 1 nodes= [1, 351] persons= [507, 506, 505] +--- sa_ids= [] creator: None +--- 'expires': 1183554314 +name: onec_slice2 id: 03 peer: 1 nodes= [352, 2] persons= [508, 507, 506] +--- sa_ids= [] creator: None +--- 'expires': 1183554314 +name: oned_slice3 id: 04 peer: 1 nodes= [353, 3] persons= [508, 507, 509] +--- sa_ids= [] creator: None +--- 'expires': 1183554314 +name: onee_slice4 id: 05 peer: 1 nodes= [354, 4] persons= [508, 510, 509] +--- sa_ids= [] creator: None +--- 'expires': 1183554314 +name: onef_slice5 id: 06 peer: 1 nodes= [355, 5] persons= [511, 510, 509] +--- sa_ids= [] creator: None +--- 'expires': 1183554314 +name: oneg_slice6 id: 07 peer: 1 nodes= [356, 6] persons= [512, 511, 510] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: oneh_slice7 id: 08 peer: 1 nodes= [357, 7] persons= [513, 512, 511] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: onei_slice8 id: 09 peer: 1 nodes= [8, 358] persons= [514, 513, 512] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: onej_slice9 id: 10 peer: 1 nodes= [9, 359] persons= [515, 514, 513] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: oneba_slice10 id: 11 peer: 1 nodes= [360, 10] persons= [516, 515, 514] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: onebb_slice11 id: 12 peer: 1 nodes= [361, 11] persons= [516, 515, 517] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: onebc_slice12 id: 13 peer: 1 nodes= [362, 12] persons= [516, 518, 517] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: onebd_slice13 id: 14 peer: 1 nodes= [363, 13] persons= [519, 518, 517] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: onebe_slice14 id: 15 peer: 1 nodes= [364, 14] persons= [520, 519, 518] +--- sa_ids= [] creator: None +--- 'expires': 1183554315 +name: onebf_slice15 id: 16 peer: 1 nodes= [365, 15] persons= [521, 520, 519] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onebg_slice16 id: 17 peer: 1 nodes= [16, 366] persons= [522, 521, 520] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onebh_slice17 id: 18 peer: 1 nodes= [17, 367] persons= [523, 522, 521] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onebi_slice18 id: 19 peer: 1 nodes= [368, 18] persons= [524, 523, 522] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onebj_slice19 id: 20 peer: 1 nodes= [369, 19] persons= [524, 523, 525] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: oneca_slice20 id: 21 peer: 1 nodes= [370, 20] persons= [524, 526, 525] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onecb_slice21 id: 22 peer: 1 nodes= [371, 21] persons= [527, 526, 525] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onecc_slice22 id: 23 peer: 1 nodes= [372, 22] persons= [528, 527, 526] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onecd_slice23 id: 24 peer: 1 nodes= [373, 23] persons= [529, 528, 527] +--- sa_ids= [] creator: None +--- 'expires': 1183554316 +name: onece_slice24 id: 25 peer: 1 nodes= [24, 374] persons= [530, 529, 528] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: onecf_slice25 id: 26 peer: 1 nodes= [25, 375] persons= [531, 530, 529] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: onecg_slice26 id: 27 peer: 1 nodes= [376, 26] persons= [532, 531, 530] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: onech_slice27 id: 28 peer: 1 nodes= [377, 27] persons= [532, 531, 533] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: oneci_slice28 id: 29 peer: 1 nodes= [378, 28] persons= [532, 534, 533] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: onecj_slice29 id: 30 peer: 1 nodes= [379, 29] persons= [535, 534, 533] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: oneda_slice30 id: 31 peer: 1 nodes= [380, 30] persons= [536, 535, 534] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: onedb_slice31 id: 32 peer: 1 nodes= [381, 31] persons= [537, 536, 535] +--- sa_ids= [] creator: None +--- 'expires': 1183554317 +name: onedc_slice32 id: 33 peer: 1 nodes= [32, 382] persons= [538, 537, 536] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: onedd_slice33 id: 34 peer: 1 nodes= [33, 383] persons= [539, 538, 537] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: onede_slice34 id: 35 peer: 1 nodes= [384, 34] persons= [540, 539, 538] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: onedf_slice35 id: 36 peer: 1 nodes= [385, 35] persons= [540, 539, 541] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: onedg_slice36 id: 37 peer: 1 nodes= [386, 36] persons= [540, 542, 541] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: onedh_slice37 id: 38 peer: 1 nodes= [387, 37] persons= [543, 542, 541] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: onedi_slice38 id: 39 peer: 1 nodes= [388, 38] persons= [544, 543, 542] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: onedj_slice39 id: 40 peer: 1 nodes= [389, 39] persons= [545, 544, 543] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: oneea_slice40 id: 41 peer: 1 nodes= [40, 390] persons= [546, 545, 544] +--- sa_ids= [] creator: None +--- 'expires': 1183554318 +name: oneeb_slice41 id: 42 peer: 1 nodes= [41, 391] persons= [547, 546, 545] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneec_slice42 id: 43 peer: 1 nodes= [392, 42] persons= [548, 547, 546] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneed_slice43 id: 44 peer: 1 nodes= [393, 43] persons= [548, 547, 549] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneee_slice44 id: 45 peer: 1 nodes= [394, 44] persons= [548, 550, 549] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneef_slice45 id: 46 peer: 1 nodes= [395, 45] persons= [551, 550, 549] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneeg_slice46 id: 47 peer: 1 nodes= [396, 46] persons= [552, 551, 550] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneeh_slice47 id: 48 peer: 1 nodes= [397, 47] persons= [553, 552, 551] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneei_slice48 id: 49 peer: 1 nodes= [48, 398] persons= [554, 553, 552] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: oneej_slice49 id: 50 peer: 1 nodes= [49, 399] persons= [555, 554, 553] +--- sa_ids= [] creator: None +--- 'expires': 1183554319 +name: onefa_slice50 id: 51 peer: 1 nodes= [400, 50] persons= [556, 555, 554] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: onefb_slice51 id: 52 peer: 1 nodes= [401, 51] persons= [556, 555, 557] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: onefc_slice52 id: 53 peer: 1 nodes= [402, 52] persons= [556, 558, 557] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: onefd_slice53 id: 54 peer: 1 nodes= [403, 53] persons= [559, 558, 557] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: onefe_slice54 id: 55 peer: 1 nodes= [404, 54] persons= [560, 559, 558] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: oneff_slice55 id: 56 peer: 1 nodes= [405, 55] persons= [561, 560, 559] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: onefg_slice56 id: 57 peer: 1 nodes= [56, 406] persons= [562, 561, 560] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: onefh_slice57 id: 58 peer: 1 nodes= [57, 407] persons= [563, 562, 561] +--- sa_ids= [] creator: None +--- 'expires': 1183554320 +name: onefi_slice58 id: 59 peer: 1 nodes= [408, 58] persons= [564, 563, 562] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onefj_slice59 id: 60 peer: 1 nodes= [409, 59] persons= [564, 563, 565] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onega_slice60 id: 61 peer: 1 nodes= [410, 60] persons= [564, 566, 565] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onegb_slice61 id: 62 peer: 1 nodes= [411, 61] persons= [567, 566, 565] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onegc_slice62 id: 63 peer: 1 nodes= [412, 62] persons= [568, 567, 566] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onegd_slice63 id: 64 peer: 1 nodes= [413, 63] persons= [569, 568, 567] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onege_slice64 id: 65 peer: 1 nodes= [64, 414] persons= [570, 569, 568] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onegf_slice65 id: 66 peer: 1 nodes= [65, 415] persons= [571, 570, 569] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onegg_slice66 id: 67 peer: 1 nodes= [416, 66] persons= [572, 571, 570] +--- sa_ids= [] creator: None +--- 'expires': 1183554321 +name: onegh_slice67 id: 68 peer: 1 nodes= [417, 67] persons= [572, 571, 573] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: onegi_slice68 id: 69 peer: 1 nodes= [418, 68] persons= [572, 574, 573] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: onegj_slice69 id: 70 peer: 1 nodes= [419, 69] persons= [575, 574, 573] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: oneha_slice70 id: 71 peer: 1 nodes= [420, 70] persons= [576, 575, 574] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: onehb_slice71 id: 72 peer: 1 nodes= [421, 71] persons= [577, 576, 575] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: onehc_slice72 id: 73 peer: 1 nodes= [72, 422] persons= [578, 577, 576] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: onehd_slice73 id: 74 peer: 1 nodes= [73, 423] persons= [579, 578, 577] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: onehe_slice74 id: 75 peer: 1 nodes= [424, 74] persons= [580, 579, 578] +--- sa_ids= [] creator: None +--- 'expires': 1183554322 +name: onehf_slice75 id: 76 peer: 1 nodes= [425, 75] persons= [580, 579, 581] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: onehg_slice76 id: 77 peer: 1 nodes= [426, 76] persons= [580, 582, 581] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: onehh_slice77 id: 78 peer: 1 nodes= [427, 77] persons= [583, 582, 581] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: onehi_slice78 id: 79 peer: 1 nodes= [428, 78] persons= [584, 583, 582] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: onehj_slice79 id: 80 peer: 1 nodes= [429, 79] persons= [585, 584, 583] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: oneia_slice80 id: 81 peer: 1 nodes= [80, 430] persons= [586, 585, 584] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: oneib_slice81 id: 82 peer: 1 nodes= [81, 431] persons= [587, 586, 585] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: oneic_slice82 id: 83 peer: 1 nodes= [432, 82] persons= [588, 587, 586] +--- sa_ids= [] creator: None +--- 'expires': 1183554323 +name: oneid_slice83 id: 84 peer: 1 nodes= [433, 83] persons= [588, 587, 589] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: oneie_slice84 id: 85 peer: 1 nodes= [434, 84] persons= [588, 590, 589] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: oneif_slice85 id: 86 peer: 1 nodes= [435, 85] persons= [591, 590, 589] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: oneig_slice86 id: 87 peer: 1 nodes= [436, 86] persons= [592, 591, 590] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: oneih_slice87 id: 88 peer: 1 nodes= [437, 87] persons= [593, 592, 591] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: oneii_slice88 id: 89 peer: 1 nodes= [88, 438] persons= [594, 593, 592] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: oneij_slice89 id: 90 peer: 1 nodes= [89, 439] persons= [595, 594, 593] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: oneja_slice90 id: 91 peer: 1 nodes= [440, 90] persons= [596, 595, 594] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: onejb_slice91 id: 92 peer: 1 nodes= [441, 91] persons= [596, 595, 597] +--- sa_ids= [] creator: None +--- 'expires': 1183554324 +name: onejc_slice92 id: 93 peer: 1 nodes= [442, 92] persons= [596, 598, 597] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: onejd_slice93 id: 94 peer: 1 nodes= [443, 93] persons= [599, 598, 597] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: oneje_slice94 id: 95 peer: 1 nodes= [444, 94] persons= [600, 599, 598] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: onejf_slice95 id: 96 peer: 1 nodes= [445, 95] persons= [601, 600, 599] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: onejg_slice96 id: 97 peer: 1 nodes= [96, 446] persons= [602, 601, 600] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: onejh_slice97 id: 98 peer: 1 nodes= [97, 447] persons= [603, 602, 601] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: oneji_slice98 id: 99 peer: 1 nodes= [448, 98] persons= [604, 603, 602] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: onejj_slice99 id: 100 peer: 1 nodes= [449, 99] persons= [604, 603, 605] +--- sa_ids= [] creator: None +--- 'expires': 1183554325 +name: onebaa_slice100 id: 101 peer: 1 nodes= [450, 100] persons= [604, 606, 605] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebab_slice101 id: 102 peer: 1 nodes= [451, 101] persons= [607, 606, 605] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebac_slice102 id: 103 peer: 1 nodes= [452, 102] persons= [608, 607, 606] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebad_slice103 id: 104 peer: 1 nodes= [453, 103] persons= [609, 608, 607] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebae_slice104 id: 105 peer: 1 nodes= [104, 454] persons= [610, 609, 608] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebaf_slice105 id: 106 peer: 1 nodes= [105, 455] persons= [611, 610, 609] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebag_slice106 id: 107 peer: 1 nodes= [456, 106] persons= [612, 611, 610] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebah_slice107 id: 108 peer: 1 nodes= [457, 107] persons= [612, 611, 613] +--- sa_ids= [] creator: None +--- 'expires': 1183554326 +name: onebai_slice108 id: 109 peer: 1 nodes= [458, 108] persons= [612, 614, 613] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebaj_slice109 id: 110 peer: 1 nodes= [459, 109] persons= [615, 614, 613] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebba_slice110 id: 111 peer: 1 nodes= [460, 110] persons= [616, 615, 614] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebbb_slice111 id: 112 peer: 1 nodes= [461, 111] persons= [617, 616, 615] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebbc_slice112 id: 113 peer: 1 nodes= [112, 462] persons= [618, 617, 616] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebbd_slice113 id: 114 peer: 1 nodes= [113, 463] persons= [619, 618, 617] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebbe_slice114 id: 115 peer: 1 nodes= [464, 114] persons= [620, 619, 618] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebbf_slice115 id: 116 peer: 1 nodes= [465, 115] persons= [620, 619, 621] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebbg_slice116 id: 117 peer: 1 nodes= [466, 116] persons= [620, 622, 621] +--- sa_ids= [] creator: None +--- 'expires': 1183554327 +name: onebbh_slice117 id: 118 peer: 1 nodes= [467, 117] persons= [623, 622, 621] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebbi_slice118 id: 119 peer: 1 nodes= [468, 118] persons= [624, 623, 622] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebbj_slice119 id: 120 peer: 1 nodes= [469, 119] persons= [625, 624, 623] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebca_slice120 id: 121 peer: 1 nodes= [120, 470] persons= [626, 625, 624] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebcb_slice121 id: 122 peer: 1 nodes= [121, 471] persons= [627, 626, 625] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebcc_slice122 id: 123 peer: 1 nodes= [472, 122] persons= [628, 627, 626] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebcd_slice123 id: 124 peer: 1 nodes= [473, 123] persons= [628, 627, 629] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebce_slice124 id: 125 peer: 1 nodes= [474, 124] persons= [628, 630, 629] +--- sa_ids= [] creator: None +--- 'expires': 1183554328 +name: onebcf_slice125 id: 126 peer: 1 nodes= [475, 125] persons= [631, 630, 629] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebcg_slice126 id: 127 peer: 1 nodes= [476, 126] persons= [632, 631, 630] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebch_slice127 id: 128 peer: 1 nodes= [477, 127] persons= [633, 632, 631] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebci_slice128 id: 129 peer: 1 nodes= [128, 478] persons= [634, 633, 632] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebcj_slice129 id: 130 peer: 1 nodes= [129, 479] persons= [635, 634, 633] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebda_slice130 id: 131 peer: 1 nodes= [480, 130] persons= [636, 635, 634] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebdb_slice131 id: 132 peer: 1 nodes= [481, 131] persons= [636, 635, 637] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebdc_slice132 id: 133 peer: 1 nodes= [482, 132] persons= [636, 638, 637] +--- sa_ids= [] creator: None +--- 'expires': 1183554329 +name: onebdd_slice133 id: 134 peer: 1 nodes= [483, 133] persons= [639, 638, 637] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebde_slice134 id: 135 peer: 1 nodes= [484, 134] persons= [640, 639, 638] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebdf_slice135 id: 136 peer: 1 nodes= [485, 135] persons= [641, 640, 639] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebdg_slice136 id: 137 peer: 1 nodes= [136, 486] persons= [642, 641, 640] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebdh_slice137 id: 138 peer: 1 nodes= [137, 487] persons= [643, 642, 641] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebdi_slice138 id: 139 peer: 1 nodes= [488, 138] persons= [644, 643, 642] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebdj_slice139 id: 140 peer: 1 nodes= [489, 139] persons= [644, 643, 645] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebea_slice140 id: 141 peer: 1 nodes= [490, 140] persons= [644, 646, 645] +--- sa_ids= [] creator: None +--- 'expires': 1183554330 +name: onebeb_slice141 id: 142 peer: 1 nodes= [491, 141] persons= [647, 646, 645] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebec_slice142 id: 143 peer: 1 nodes= [492, 142] persons= [648, 647, 646] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebed_slice143 id: 144 peer: 1 nodes= [493, 143] persons= [649, 648, 647] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebee_slice144 id: 145 peer: 1 nodes= [144, 494] persons= [650, 649, 648] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebef_slice145 id: 146 peer: 1 nodes= [145, 495] persons= [651, 650, 649] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebeg_slice146 id: 147 peer: 1 nodes= [496, 146] persons= [652, 651, 650] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebeh_slice147 id: 148 peer: 1 nodes= [497, 147] persons= [652, 651, 653] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebei_slice148 id: 149 peer: 1 nodes= [498, 148] persons= [652, 654, 653] +--- sa_ids= [] creator: None +--- 'expires': 1183554331 +name: onebej_slice149 id: 150 peer: 1 nodes= [499, 149] persons= [655, 654, 653] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebfa_slice150 id: 151 peer: 1 nodes= [500, 150] persons= [656, 655, 654] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebfb_slice151 id: 152 peer: 1 nodes= [501, 151] persons= [657, 656, 655] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebfc_slice152 id: 153 peer: 1 nodes= [152, 502] persons= [658, 657, 656] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebfd_slice153 id: 154 peer: 1 nodes= [153, 503] persons= [659, 658, 657] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebfe_slice154 id: 155 peer: 1 nodes= [504, 154] persons= [660, 659, 658] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebff_slice155 id: 156 peer: 1 nodes= [505, 155] persons= [660, 659, 661] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebfg_slice156 id: 157 peer: 1 nodes= [506, 156] persons= [660, 662, 661] +--- sa_ids= [] creator: None +--- 'expires': 1183554332 +name: onebfh_slice157 id: 158 peer: 1 nodes= [507, 157] persons= [663, 662, 661] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebfi_slice158 id: 159 peer: 1 nodes= [508, 158] persons= [664, 663, 662] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebfj_slice159 id: 160 peer: 1 nodes= [509, 159] persons= [665, 664, 663] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebga_slice160 id: 161 peer: 1 nodes= [160, 510] persons= [666, 665, 664] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebgb_slice161 id: 162 peer: 1 nodes= [161, 511] persons= [667, 666, 665] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebgc_slice162 id: 163 peer: 1 nodes= [512, 162] persons= [668, 667, 666] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebgd_slice163 id: 164 peer: 1 nodes= [513, 163] persons= [668, 667, 669] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebge_slice164 id: 165 peer: 1 nodes= [514, 164] persons= [668, 670, 669] +--- sa_ids= [] creator: None +--- 'expires': 1183554333 +name: onebgf_slice165 id: 166 peer: 1 nodes= [515, 165] persons= [671, 670, 669] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebgg_slice166 id: 167 peer: 1 nodes= [516, 166] persons= [672, 671, 670] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebgh_slice167 id: 168 peer: 1 nodes= [517, 167] persons= [673, 672, 671] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebgi_slice168 id: 169 peer: 1 nodes= [168, 518] persons= [674, 673, 672] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebgj_slice169 id: 170 peer: 1 nodes= [169, 519] persons= [675, 674, 673] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebha_slice170 id: 171 peer: 1 nodes= [520, 170] persons= [676, 675, 674] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebhb_slice171 id: 172 peer: 1 nodes= [521, 171] persons= [676, 675, 677] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebhc_slice172 id: 173 peer: 1 nodes= [522, 172] persons= [676, 678, 677] +--- sa_ids= [] creator: None +--- 'expires': 1183554334 +name: onebhd_slice173 id: 174 peer: 1 nodes= [523, 173] persons= [679, 678, 677] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebhe_slice174 id: 175 peer: 1 nodes= [524, 174] persons= [680, 679, 678] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebhf_slice175 id: 176 peer: 1 nodes= [525, 175] persons= [681, 680, 679] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebhg_slice176 id: 177 peer: 1 nodes= [176, 526] persons= [682, 681, 680] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebhh_slice177 id: 178 peer: 1 nodes= [177, 527] persons= [683, 682, 681] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebhi_slice178 id: 179 peer: 1 nodes= [528, 178] persons= [684, 683, 682] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebhj_slice179 id: 180 peer: 1 nodes= [529, 179] persons= [684, 683, 685] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebia_slice180 id: 181 peer: 1 nodes= [530, 180] persons= [684, 686, 685] +--- sa_ids= [] creator: None +--- 'expires': 1183554335 +name: onebib_slice181 id: 182 peer: 1 nodes= [531, 181] persons= [687, 686, 685] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebic_slice182 id: 183 peer: 1 nodes= [532, 182] persons= [688, 687, 686] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebid_slice183 id: 184 peer: 1 nodes= [533, 183] persons= [689, 688, 687] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebie_slice184 id: 185 peer: 1 nodes= [184, 534] persons= [690, 689, 688] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebif_slice185 id: 186 peer: 1 nodes= [185, 535] persons= [691, 690, 689] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebig_slice186 id: 187 peer: 1 nodes= [536, 186] persons= [692, 691, 690] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebih_slice187 id: 188 peer: 1 nodes= [537, 187] persons= [692, 691, 693] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebii_slice188 id: 189 peer: 1 nodes= [538, 188] persons= [692, 694, 693] +--- sa_ids= [] creator: None +--- 'expires': 1183554336 +name: onebij_slice189 id: 190 peer: 1 nodes= [539, 189] persons= [695, 694, 693] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebja_slice190 id: 191 peer: 1 nodes= [540, 190] persons= [696, 695, 694] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebjb_slice191 id: 192 peer: 1 nodes= [541, 191] persons= [697, 696, 695] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebjc_slice192 id: 193 peer: 1 nodes= [192, 542] persons= [698, 697, 696] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebjd_slice193 id: 194 peer: 1 nodes= [193, 543] persons= [699, 698, 697] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebje_slice194 id: 195 peer: 1 nodes= [544, 194] persons= [700, 699, 698] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebjf_slice195 id: 196 peer: 1 nodes= [545, 195] persons= [700, 699, 701] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebjg_slice196 id: 197 peer: 1 nodes= [546, 196] persons= [700, 702, 701] +--- sa_ids= [] creator: None +--- 'expires': 1183554337 +name: onebjh_slice197 id: 198 peer: 1 nodes= [547, 197] persons= [703, 702, 701] +--- sa_ids= [] creator: None +--- 'expires': 1183554338 +name: onebji_slice198 id: 199 peer: 1 nodes= [548, 198] persons= [704, 703, 702] +--- sa_ids= [] creator: None +--- 'expires': 1183554338 +name: onebjj_slice199 id: 200 peer: 1 nodes= [549, 199] persons= [705, 704, 703] +--- sa_ids= [] creator: None +--- 'expires': 1183554338 +name: onecaa_slice200 id: 201 peer: 1 nodes= [200, 550] persons= [706, 705, 704] +--- sa_ids= [] creator: None +--- 'expires': 1183554338 +name: oneb_slice201 id: 202 peer: 1 nodes= [201, 551] persons= [707, 706, 705] +--- sa_ids= [] creator: None +--- 'expires': 1183554338 +name: onec_slice202 id: 203 peer: 1 nodes= [552, 202] persons= [708, 707, 706] +--- sa_ids= [] creator: None +--- 'expires': 1183554338 +name: oned_slice203 id: 204 peer: 1 nodes= [553, 203] persons= [708, 707, 709] +--- sa_ids= [] creator: None +--- 'expires': 1183554338 +name: onee_slice204 id: 205 peer: 1 nodes= [554, 204] persons= [708, 710, 709] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: onef_slice205 id: 206 peer: 1 nodes= [555, 205] persons= [711, 710, 709] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: oneg_slice206 id: 207 peer: 1 nodes= [556, 206] persons= [712, 711, 710] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: oneh_slice207 id: 208 peer: 1 nodes= [557, 207] persons= [713, 712, 711] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: onei_slice208 id: 209 peer: 1 nodes= [208, 558] persons= [714, 713, 712] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: onej_slice209 id: 210 peer: 1 nodes= [209, 559] persons= [715, 714, 713] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: oneba_slice210 id: 211 peer: 1 nodes= [560, 210] persons= [716, 715, 714] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: onebb_slice211 id: 212 peer: 1 nodes= [561, 211] persons= [716, 715, 717] +--- sa_ids= [] creator: None +--- 'expires': 1183554339 +name: onebc_slice212 id: 213 peer: 1 nodes= [562, 212] persons= [716, 718, 717] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: onebd_slice213 id: 214 peer: 1 nodes= [563, 213] persons= [719, 718, 717] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: onebe_slice214 id: 215 peer: 1 nodes= [564, 214] persons= [720, 719, 718] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: onebf_slice215 id: 216 peer: 1 nodes= [565, 215] persons= [721, 720, 719] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: onebg_slice216 id: 217 peer: 1 nodes= [216, 566] persons= [722, 721, 720] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: onebh_slice217 id: 218 peer: 1 nodes= [217, 567] persons= [723, 722, 721] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: onebi_slice218 id: 219 peer: 1 nodes= [568, 218] persons= [724, 723, 722] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: onebj_slice219 id: 220 peer: 1 nodes= [569, 219] persons= [724, 723, 725] +--- sa_ids= [] creator: None +--- 'expires': 1183554340 +name: oneca_slice220 id: 221 peer: 1 nodes= [570, 220] persons= [724, 726, 725] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: onecb_slice221 id: 222 peer: 1 nodes= [571, 221] persons= [727, 726, 725] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: onecc_slice222 id: 223 peer: 1 nodes= [572, 222] persons= [728, 727, 726] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: onecd_slice223 id: 224 peer: 1 nodes= [573, 223] persons= [729, 728, 727] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: onece_slice224 id: 225 peer: 1 nodes= [224, 574] persons= [730, 729, 728] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: onecf_slice225 id: 226 peer: 1 nodes= [225, 575] persons= [731, 730, 729] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: onecg_slice226 id: 227 peer: 1 nodes= [576, 226] persons= [732, 731, 730] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: onech_slice227 id: 228 peer: 1 nodes= [577, 227] persons= [732, 731, 733] +--- sa_ids= [] creator: None +--- 'expires': 1183554341 +name: oneci_slice228 id: 229 peer: 1 nodes= [578, 228] persons= [732, 734, 733] +--- sa_ids= [] creator: None +--- 'expires': 1183554342 +name: onecj_slice229 id: 230 peer: 1 nodes= [579, 229] persons= [735, 734, 733] +--- sa_ids= [] creator: None +--- 'expires': 1183554342 +name: oneda_slice230 id: 231 peer: 1 nodes= [580, 230] persons= [736, 735, 734] +--- sa_ids= [] creator: None +--- 'expires': 1183554342 +name: onedb_slice231 id: 232 peer: 1 nodes= [581, 231] persons= [737, 736, 735] +--- sa_ids= [] creator: None +--- 'expires': 1183554342 +name: onedc_slice232 id: 233 peer: 1 nodes= [232, 582] persons= [738, 737, 736] +--- sa_ids= [] creator: None +--- 'expires': 1183554342 +name: onedd_slice233 id: 234 peer: 1 nodes= [233, 583] persons= [739, 738, 737] +--- sa_ids= [] creator: None +--- 'expires': 1183554342 +name: onede_slice234 id: 235 peer: 1 nodes= [584, 234] persons= [740, 739, 738] +--- sa_ids= [] creator: None +--- 'expires': 1183554342 +name: onedf_slice235 id: 236 peer: 1 nodes= [585, 235] persons= [740, 739, 741] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: onedg_slice236 id: 237 peer: 1 nodes= [586, 236] persons= [740, 742, 741] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: onedh_slice237 id: 238 peer: 1 nodes= [587, 237] persons= [743, 742, 741] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: onedi_slice238 id: 239 peer: 1 nodes= [588, 238] persons= [744, 743, 742] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: onedj_slice239 id: 240 peer: 1 nodes= [589, 239] persons= [745, 744, 743] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: oneea_slice240 id: 241 peer: 1 nodes= [240, 590] persons= [746, 745, 744] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: oneeb_slice241 id: 242 peer: 1 nodes= [241, 591] persons= [747, 746, 745] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: oneec_slice242 id: 243 peer: 1 nodes= [592, 242] persons= [748, 747, 746] +--- sa_ids= [] creator: None +--- 'expires': 1183554343 +name: oneed_slice243 id: 244 peer: 1 nodes= [593, 243] persons= [748, 747, 749] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: oneee_slice244 id: 245 peer: 1 nodes= [594, 244] persons= [748, 750, 749] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: oneef_slice245 id: 246 peer: 1 nodes= [595, 245] persons= [751, 750, 749] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: oneeg_slice246 id: 247 peer: 1 nodes= [596, 246] persons= [752, 751, 750] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: oneeh_slice247 id: 248 peer: 1 nodes= [597, 247] persons= [753, 752, 751] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: oneei_slice248 id: 249 peer: 1 nodes= [248, 598] persons= [754, 753, 752] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: oneej_slice249 id: 250 peer: 1 nodes= [249, 599] persons= [755, 754, 753] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: onefa_slice250 id: 251 peer: 1 nodes= [600, 250] persons= [756, 755, 754] +--- sa_ids= [] creator: None +--- 'expires': 1183554344 +name: onefb_slice251 id: 252 peer: 1 nodes= [601, 251] persons= [756, 755, 757] +--- sa_ids= [] creator: None +--- 'expires': 1183554345 +name: onefc_slice252 id: 253 peer: 1 nodes= [602, 252] persons= [756, 758, 757] +--- sa_ids= [] creator: None +--- 'expires': 1183554345 +name: onefd_slice253 id: 254 peer: 1 nodes= [603, 253] persons= [759, 758, 757] +--- sa_ids= [] creator: None +--- 'expires': 1183554345 +name: onefe_slice254 id: 255 peer: 1 nodes= [604, 254] persons= [760, 759, 758] +--- sa_ids= [] creator: None +--- 'expires': 1183554345 +name: oneff_slice255 id: 256 peer: 1 nodes= [605, 255] persons= [761, 760, 759] +--- sa_ids= [] creator: None +--- 'expires': 1183554345 +name: onefg_slice256 id: 257 peer: 1 nodes= [256, 606] persons= [762, 761, 760] +--- sa_ids= [] creator: None +--- 'expires': 1183554345 +name: onefh_slice257 id: 258 peer: 1 nodes= [257, 607] persons= [763, 762, 761] +--- sa_ids= [] creator: None +--- 'expires': 1183554345 +name: onefi_slice258 id: 259 peer: 1 nodes= [608, 258] persons= [764, 763, 762] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onefj_slice259 id: 260 peer: 1 nodes= [609, 259] persons= [764, 763, 765] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onega_slice260 id: 261 peer: 1 nodes= [610, 260] persons= [764, 766, 765] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onegb_slice261 id: 262 peer: 1 nodes= [611, 261] persons= [767, 766, 765] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onegc_slice262 id: 263 peer: 1 nodes= [612, 262] persons= [768, 767, 766] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onegd_slice263 id: 264 peer: 1 nodes= [613, 263] persons= [769, 768, 767] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onege_slice264 id: 265 peer: 1 nodes= [264, 614] persons= [770, 769, 768] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onegf_slice265 id: 266 peer: 1 nodes= [265, 615] persons= [771, 770, 769] +--- sa_ids= [] creator: None +--- 'expires': 1183554346 +name: onegg_slice266 id: 267 peer: 1 nodes= [616, 266] persons= [772, 771, 770] +--- sa_ids= [] creator: None +--- 'expires': 1183554347 +name: onegh_slice267 id: 268 peer: 1 nodes= [617, 267] persons= [772, 771, 773] +--- sa_ids= [] creator: None +--- 'expires': 1183554347 +name: onegi_slice268 id: 269 peer: 1 nodes= [618, 268] persons= [772, 774, 773] +--- sa_ids= [] creator: None +--- 'expires': 1183554347 +name: onegj_slice269 id: 270 peer: 1 nodes= [619, 269] persons= [775, 774, 773] +--- sa_ids= [] creator: None +--- 'expires': 1183554347 +name: oneha_slice270 id: 271 peer: 1 nodes= [620, 270] persons= [776, 775, 774] +--- sa_ids= [] creator: None +--- 'expires': 1183554347 +name: onehb_slice271 id: 272 peer: 1 nodes= [621, 271] persons= [777, 776, 775] +--- sa_ids= [] creator: None +--- 'expires': 1183554347 +name: onehc_slice272 id: 273 peer: 1 nodes= [272, 622] persons= [778, 777, 776] +--- sa_ids= [] creator: None +--- 'expires': 1183554347 +name: onehd_slice273 id: 274 peer: 1 nodes= [273, 623] persons= [779, 778, 777] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: onehe_slice274 id: 275 peer: 1 nodes= [624, 274] persons= [780, 779, 778] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: onehf_slice275 id: 276 peer: 1 nodes= [625, 275] persons= [780, 779, 781] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: onehg_slice276 id: 277 peer: 1 nodes= [626, 276] persons= [780, 782, 781] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: onehh_slice277 id: 278 peer: 1 nodes= [627, 277] persons= [783, 782, 781] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: onehi_slice278 id: 279 peer: 1 nodes= [628, 278] persons= [784, 783, 782] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: onehj_slice279 id: 280 peer: 1 nodes= [629, 279] persons= [785, 784, 783] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: oneia_slice280 id: 281 peer: 1 nodes= [280, 630] persons= [786, 785, 784] +--- sa_ids= [] creator: None +--- 'expires': 1183554348 +name: oneib_slice281 id: 282 peer: 1 nodes= [281, 631] persons= [787, 786, 785] +--- sa_ids= [] creator: None +--- 'expires': 1183554349 +name: oneic_slice282 id: 283 peer: 1 nodes= [632, 282] persons= [788, 787, 786] +--- sa_ids= [] creator: None +--- 'expires': 1183554349 +name: oneid_slice283 id: 284 peer: 1 nodes= [633, 283] persons= [788, 787, 789] +--- sa_ids= [] creator: None +--- 'expires': 1183554349 +name: oneie_slice284 id: 285 peer: 1 nodes= [634, 284] persons= [788, 790, 789] +--- sa_ids= [] creator: None +--- 'expires': 1183554349 +name: oneif_slice285 id: 286 peer: 1 nodes= [635, 285] persons= [791, 790, 789] +--- sa_ids= [] creator: None +--- 'expires': 1183554349 +name: oneig_slice286 id: 287 peer: 1 nodes= [636, 286] persons= [792, 791, 790] +--- sa_ids= [] creator: None +--- 'expires': 1183554349 +name: oneih_slice287 id: 288 peer: 1 nodes= [637, 287] persons= [793, 792, 791] +--- sa_ids= [] creator: None +--- 'expires': 1183554349 +name: oneii_slice288 id: 289 peer: 1 nodes= [288, 638] persons= [794, 793, 792] +--- sa_ids= [] creator: None +--- 'expires': 1183554350 +name: oneij_slice289 id: 290 peer: 1 nodes= [289, 639] persons= [795, 794, 793] +--- sa_ids= [] creator: None +--- 'expires': 1183554350 +name: oneja_slice290 id: 291 peer: 1 nodes= [640, 290] persons= [796, 795, 794] +--- sa_ids= [] creator: None +--- 'expires': 1183554350 +name: onejb_slice291 id: 292 peer: 1 nodes= [641, 291] persons= [796, 795, 797] +--- sa_ids= [] creator: None +--- 'expires': 1183554350 +name: onejc_slice292 id: 293 peer: 1 nodes= [642, 292] persons= [796, 798, 797] +--- sa_ids= [] creator: None +--- 'expires': 1183554350 +name: onejd_slice293 id: 294 peer: 1 nodes= [643, 293] persons= [799, 798, 797] +--- sa_ids= [] creator: None +--- 'expires': 1183554350 +name: oneje_slice294 id: 295 peer: 1 nodes= [644, 294] persons= [800, 799, 798] +--- sa_ids= [] creator: None +--- 'expires': 1183554350 +name: onejf_slice295 id: 296 peer: 1 nodes= [645, 295] persons= [801, 800, 799] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: onejg_slice296 id: 297 peer: 1 nodes= [296, 646] persons= [802, 801, 800] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: onejh_slice297 id: 298 peer: 1 nodes= [297, 647] persons= [803, 802, 801] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: oneji_slice298 id: 299 peer: 1 nodes= [648, 298] persons= [804, 803, 802] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: onejj_slice299 id: 300 peer: 1 nodes= [649, 299] persons= [804, 803, 805] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: onebaa_slice300 id: 301 peer: 1 nodes= [650, 300] persons= [804, 806, 805] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: onebab_slice301 id: 302 peer: 1 nodes= [651, 301] persons= [807, 806, 805] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: onebac_slice302 id: 303 peer: 1 nodes= [652, 302] persons= [808, 807, 806] +--- sa_ids= [] creator: None +--- 'expires': 1183554351 +name: onebad_slice303 id: 304 peer: 1 nodes= [653, 303] persons= [809, 808, 807] +--- sa_ids= [] creator: None +--- 'expires': 1183554352 +name: onebae_slice304 id: 305 peer: 1 nodes= [304, 654] persons= [810, 809, 808] +--- sa_ids= [] creator: None +--- 'expires': 1183554352 +name: onebaf_slice305 id: 306 peer: 1 nodes= [305, 655] persons= [811, 810, 809] +--- sa_ids= [] creator: None +--- 'expires': 1183554352 +name: onebag_slice306 id: 307 peer: 1 nodes= [656, 306] persons= [812, 811, 810] +--- sa_ids= [] creator: None +--- 'expires': 1183554352 +name: onebah_slice307 id: 308 peer: 1 nodes= [657, 307] persons= [812, 811, 813] +--- sa_ids= [] creator: None +--- 'expires': 1183554352 +name: onebai_slice308 id: 309 peer: 1 nodes= [658, 308] persons= [812, 814, 813] +--- sa_ids= [] creator: None +--- 'expires': 1183554352 +name: onebaj_slice309 id: 310 peer: 1 nodes= [659, 309] persons= [815, 814, 813] +--- sa_ids= [] creator: None +--- 'expires': 1183554352 +name: onebba_slice310 id: 311 peer: 1 nodes= [660, 310] persons= [816, 815, 814] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbb_slice311 id: 312 peer: 1 nodes= [661, 311] persons= [817, 816, 815] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbc_slice312 id: 313 peer: 1 nodes= [312, 662] persons= [818, 817, 816] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbd_slice313 id: 314 peer: 1 nodes= [313, 663] persons= [819, 818, 817] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbe_slice314 id: 315 peer: 1 nodes= [664, 314] persons= [820, 819, 818] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbf_slice315 id: 316 peer: 1 nodes= [665, 315] persons= [820, 819, 821] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbg_slice316 id: 317 peer: 1 nodes= [666, 316] persons= [820, 822, 821] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbh_slice317 id: 318 peer: 1 nodes= [667, 317] persons= [823, 822, 821] +--- sa_ids= [] creator: None +--- 'expires': 1183554353 +name: onebbi_slice318 id: 319 peer: 1 nodes= [668, 318] persons= [824, 823, 822] +--- sa_ids= [] creator: None +--- 'expires': 1183554354 +name: onebbj_slice319 id: 320 peer: 1 nodes= [669, 319] persons= [825, 824, 823] +--- sa_ids= [] creator: None +--- 'expires': 1183554354 +name: onebca_slice320 id: 321 peer: 1 nodes= [320, 670] persons= [826, 825, 824] +--- sa_ids= [] creator: None +--- 'expires': 1183554354 +name: onebcb_slice321 id: 322 peer: 1 nodes= [321, 671] persons= [827, 826, 825] +--- sa_ids= [] creator: None +--- 'expires': 1183554354 +name: onebcc_slice322 id: 323 peer: 1 nodes= [672, 322] persons= [828, 827, 826] +--- sa_ids= [] creator: None +--- 'expires': 1183554354 +name: onebcd_slice323 id: 324 peer: 1 nodes= [673, 323] persons= [828, 827, 829] +--- sa_ids= [] creator: None +--- 'expires': 1183554354 +name: onebce_slice324 id: 325 peer: 1 nodes= [674, 324] persons= [828, 830, 829] +--- sa_ids= [] creator: None +--- 'expires': 1183554354 +name: onebcf_slice325 id: 326 peer: 1 nodes= [675, 325] persons= [831, 830, 829] +--- sa_ids= [] creator: None +--- 'expires': 1183554355 +name: onebcg_slice326 id: 327 peer: 1 nodes= [676, 326] persons= [832, 831, 830] +--- sa_ids= [] creator: None +--- 'expires': 1183554355 +name: onebch_slice327 id: 328 peer: 1 nodes= [677, 327] persons= [833, 832, 831] +--- sa_ids= [] creator: None +--- 'expires': 1183554355 +name: onebci_slice328 id: 329 peer: 1 nodes= [328, 678] persons= [834, 833, 832] +--- sa_ids= [] creator: None +--- 'expires': 1183554355 +name: onebcj_slice329 id: 330 peer: 1 nodes= [329, 679] persons= [835, 834, 833] +--- sa_ids= [] creator: None +--- 'expires': 1183554355 +name: onebda_slice330 id: 331 peer: 1 nodes= [680, 330] persons= [836, 835, 834] +--- sa_ids= [] creator: None +--- 'expires': 1183554355 +name: onebdb_slice331 id: 332 peer: 1 nodes= [681, 331] persons= [836, 835, 837] +--- sa_ids= [] creator: None +--- 'expires': 1183554355 +name: onebdc_slice332 id: 333 peer: 1 nodes= [682, 332] persons= [836, 838, 837] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebdd_slice333 id: 334 peer: 1 nodes= [683, 333] persons= [839, 838, 837] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebde_slice334 id: 335 peer: 1 nodes= [684, 334] persons= [840, 839, 838] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebdf_slice335 id: 336 peer: 1 nodes= [685, 335] persons= [841, 840, 839] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebdg_slice336 id: 337 peer: 1 nodes= [336, 686] persons= [842, 841, 840] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebdh_slice337 id: 338 peer: 1 nodes= [337, 687] persons= [843, 842, 841] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebdi_slice338 id: 339 peer: 1 nodes= [688, 338] persons= [844, 843, 842] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebdj_slice339 id: 340 peer: 1 nodes= [689, 339] persons= [844, 843, 845] +--- sa_ids= [] creator: None +--- 'expires': 1183554356 +name: onebea_slice340 id: 341 peer: 1 nodes= [690, 340] persons= [844, 846, 845] +--- sa_ids= [] creator: None +--- 'expires': 1183554357 +name: onebeb_slice341 id: 342 peer: 1 nodes= [691, 341] persons= [847, 846, 845] +--- sa_ids= [] creator: None +--- 'expires': 1183554357 +name: onebec_slice342 id: 343 peer: 1 nodes= [692, 342] persons= [848, 847, 846] +--- sa_ids= [] creator: None +--- 'expires': 1183554357 +name: onebed_slice343 id: 344 peer: 1 nodes= [693, 343] persons= [849, 848, 847] +--- sa_ids= [] creator: None +--- 'expires': 1183554357 +name: onebee_slice344 id: 345 peer: 1 nodes= [344, 694] persons= [850, 849, 848] +--- sa_ids= [] creator: None +--- 'expires': 1183554357 +name: onebef_slice345 id: 346 peer: 1 nodes= [345, 695] persons= [851, 850, 849] +--- sa_ids= [] creator: None +--- 'expires': 1183554357 +name: onebeg_slice346 id: 347 peer: 1 nodes= [696, 346] persons= [852, 851, 850] +--- sa_ids= [] creator: None +--- 'expires': 1183554357 +name: onebeh_slice347 id: 348 peer: 1 nodes= [697, 347] persons= [852, 851, 853] +--- sa_ids= [] creator: None +--- 'expires': 1183554358 +name: onebei_slice348 id: 349 peer: 1 nodes= [698, 348] persons= [852, 854, 853] +--- sa_ids= [] creator: None +--- 'expires': 1183554358 +name: onebej_slice349 id: 350 peer: 1 nodes= [699, 349] persons= [855, 854, 853] +--- sa_ids= [] creator: None +--- 'expires': 1183554358 +name: onebfa_slice350 id: 351 peer: 1 nodes= [700, 350] persons= [856, 855, 854] +--- sa_ids= [] creator: None +--- 'expires': 1183554358 +name: onebfb_slice351 id: 352 peer: 1 nodes= [1, 351] persons= [857, 856, 855] +--- sa_ids= [] creator: None +--- 'expires': 1183554358 +name: onebfc_slice352 id: 353 peer: 1 nodes= [352, 2] persons= [858, 857, 856] +--- sa_ids= [] creator: None +--- 'expires': 1183554358 +name: onebfd_slice353 id: 354 peer: 1 nodes= [353, 3] persons= [859, 858, 857] +--- sa_ids= [] creator: None +--- 'expires': 1183554358 +name: onebfe_slice354 id: 355 peer: 1 nodes= [354, 4] persons= [860, 859, 858] +--- sa_ids= [] creator: None +--- 'expires': 1183554359 +name: onebff_slice355 id: 356 peer: 1 nodes= [355, 5] persons= [860, 859, 861] +--- sa_ids= [] creator: None +--- 'expires': 1183554359 +name: onebfg_slice356 id: 357 peer: 1 nodes= [356, 6] persons= [860, 862, 861] +--- sa_ids= [] creator: None +--- 'expires': 1183554359 +name: onebfh_slice357 id: 358 peer: 1 nodes= [357, 7] persons= [863, 862, 861] +--- sa_ids= [] creator: None +--- 'expires': 1183554359 +name: onebfi_slice358 id: 359 peer: 1 nodes= [8, 358] persons= [864, 863, 862] +--- sa_ids= [] creator: None +--- 'expires': 1183554359 +name: onebfj_slice359 id: 360 peer: 1 nodes= [9, 359] persons= [865, 864, 863] +--- sa_ids= [] creator: None +--- 'expires': 1183554359 +name: onebga_slice360 id: 361 peer: 1 nodes= [360, 10] persons= [866, 865, 864] +--- sa_ids= [] creator: None +--- 'expires': 1183554359 +name: onebgb_slice361 id: 362 peer: 1 nodes= [361, 11] persons= [867, 866, 865] +--- sa_ids= [] creator: None +--- 'expires': 1183554360 +name: onebgc_slice362 id: 363 peer: 1 nodes= [362, 12] persons= [868, 867, 866] +--- sa_ids= [] creator: None +--- 'expires': 1183554360 +name: onebgd_slice363 id: 364 peer: 1 nodes= [363, 13] persons= [868, 867, 869] +--- sa_ids= [] creator: None +--- 'expires': 1183554360 +name: onebge_slice364 id: 365 peer: 1 nodes= [364, 14] persons= [868, 870, 869] +--- sa_ids= [] creator: None +--- 'expires': 1183554360 +name: onebgf_slice365 id: 366 peer: 1 nodes= [365, 15] persons= [871, 870, 869] +--- sa_ids= [] creator: None +--- 'expires': 1183554360 +name: onebgg_slice366 id: 367 peer: 1 nodes= [16, 366] persons= [872, 871, 870] +--- sa_ids= [] creator: None +--- 'expires': 1183554360 +name: onebgh_slice367 id: 368 peer: 1 nodes= [17, 367] persons= [873, 872, 871] +--- sa_ids= [] creator: None +--- 'expires': 1183554360 +name: onebgi_slice368 id: 369 peer: 1 nodes= [368, 18] persons= [874, 873, 872] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebgj_slice369 id: 370 peer: 1 nodes= [369, 19] persons= [875, 874, 873] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebha_slice370 id: 371 peer: 1 nodes= [370, 20] persons= [876, 875, 874] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebhb_slice371 id: 372 peer: 1 nodes= [371, 21] persons= [876, 875, 877] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebhc_slice372 id: 373 peer: 1 nodes= [372, 22] persons= [876, 878, 877] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebhd_slice373 id: 374 peer: 1 nodes= [373, 23] persons= [879, 878, 877] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebhe_slice374 id: 375 peer: 1 nodes= [24, 374] persons= [880, 879, 878] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebhf_slice375 id: 376 peer: 1 nodes= [25, 375] persons= [881, 880, 879] +--- sa_ids= [] creator: None +--- 'expires': 1183554361 +name: onebhg_slice376 id: 377 peer: 1 nodes= [376, 26] persons= [882, 881, 880] +--- sa_ids= [] creator: None +--- 'expires': 1183554362 +name: onebhh_slice377 id: 378 peer: 1 nodes= [377, 27] persons= [883, 882, 881] +--- sa_ids= [] creator: None +--- 'expires': 1183554362 +name: onebhi_slice378 id: 379 peer: 1 nodes= [378, 28] persons= [884, 883, 882] +--- sa_ids= [] creator: None +--- 'expires': 1183554362 +name: onebhj_slice379 id: 380 peer: 1 nodes= [379, 29] persons= [884, 883, 885] +--- sa_ids= [] creator: None +--- 'expires': 1183554362 +name: onebia_slice380 id: 381 peer: 1 nodes= [380, 30] persons= [884, 886, 885] +--- sa_ids= [] creator: None +--- 'expires': 1183554362 +name: onebib_slice381 id: 382 peer: 1 nodes= [381, 31] persons= [887, 886, 885] +--- sa_ids= [] creator: None +--- 'expires': 1183554362 +name: onebic_slice382 id: 383 peer: 1 nodes= [32, 382] persons= [888, 887, 886] +--- sa_ids= [] creator: None +--- 'expires': 1183554362 +name: onebid_slice383 id: 384 peer: 1 nodes= [33, 383] persons= [889, 888, 887] +--- sa_ids= [] creator: None +--- 'expires': 1183554363 +name: onebie_slice384 id: 385 peer: 1 nodes= [384, 34] persons= [890, 889, 888] +--- sa_ids= [] creator: None +--- 'expires': 1183554363 +name: onebif_slice385 id: 386 peer: 1 nodes= [385, 35] persons= [891, 890, 889] +--- sa_ids= [] creator: None +--- 'expires': 1183554363 +name: onebig_slice386 id: 387 peer: 1 nodes= [386, 36] persons= [892, 891, 890] +--- sa_ids= [] creator: None +--- 'expires': 1183554363 +name: onebih_slice387 id: 388 peer: 1 nodes= [387, 37] persons= [892, 891, 893] +--- sa_ids= [] creator: None +--- 'expires': 1183554363 +name: onebii_slice388 id: 389 peer: 1 nodes= [388, 38] persons= [892, 894, 893] +--- sa_ids= [] creator: None +--- 'expires': 1183554363 +name: onebij_slice389 id: 390 peer: 1 nodes= [389, 39] persons= [895, 894, 893] +--- sa_ids= [] creator: None +--- 'expires': 1183554363 +name: onebja_slice390 id: 391 peer: 1 nodes= [40, 390] persons= [896, 895, 894] +--- sa_ids= [] creator: None +--- 'expires': 1183554364 +name: onebjb_slice391 id: 392 peer: 1 nodes= [41, 391] persons= [897, 896, 895] +--- sa_ids= [] creator: None +--- 'expires': 1183554364 +name: onebjc_slice392 id: 393 peer: 1 nodes= [392, 42] persons= [898, 897, 896] +--- sa_ids= [] creator: None +--- 'expires': 1183554364 +name: onebjd_slice393 id: 394 peer: 1 nodes= [393, 43] persons= [899, 898, 897] +--- sa_ids= [] creator: None +--- 'expires': 1183554364 +name: onebje_slice394 id: 395 peer: 1 nodes= [394, 44] persons= [900, 899, 898] +--- sa_ids= [] creator: None +--- 'expires': 1183554364 +name: onebjf_slice395 id: 396 peer: 1 nodes= [395, 45] persons= [900, 899, 901] +--- sa_ids= [] creator: None +--- 'expires': 1183554364 +name: onebjg_slice396 id: 397 peer: 1 nodes= [396, 46] persons= [900, 902, 901] +--- sa_ids= [] creator: None +--- 'expires': 1183554364 +name: onebjh_slice397 id: 398 peer: 1 nodes= [397, 47] persons= [903, 902, 901] +--- sa_ids= [] creator: None +--- 'expires': 1183554365 +name: onebji_slice398 id: 399 peer: 1 nodes= [48, 398] persons= [904, 903, 902] +--- sa_ids= [] creator: None +--- 'expires': 1183554365 +name: onebjj_slice399 id: 400 peer: 1 nodes= [49, 399] persons= [905, 904, 903] +--- sa_ids= [] creator: None +--- 'expires': 1183554365 +name: onecaa_slice400 id: 401 peer: 1 nodes= [400, 50] persons= [906, 905, 904] +--- sa_ids= [] creator: None +--- 'expires': 1183554365 +name: oneb_slice401 id: 402 peer: 1 nodes= [401, 51] persons= [907, 906, 905] +--- sa_ids= [] creator: None +--- 'expires': 1183554365 +name: onec_slice402 id: 403 peer: 1 nodes= [402, 52] persons= [908, 907, 906] +--- sa_ids= [] creator: None +--- 'expires': 1183554365 +name: oned_slice403 id: 404 peer: 1 nodes= [403, 53] persons= [908, 907, 909] +--- sa_ids= [] creator: None +--- 'expires': 1183554365 +name: onee_slice404 id: 405 peer: 1 nodes= [404, 54] persons= [908, 910, 909] +--- sa_ids= [] creator: None +--- 'expires': 1183554366 +name: onef_slice405 id: 406 peer: 1 nodes= [405, 55] persons= [911, 910, 909] +--- sa_ids= [] creator: None +--- 'expires': 1183554366 +name: oneg_slice406 id: 407 peer: 1 nodes= [56, 406] persons= [912, 911, 910] +--- sa_ids= [] creator: None +--- 'expires': 1183554366 +name: oneh_slice407 id: 408 peer: 1 nodes= [57, 407] persons= [913, 912, 911] +--- sa_ids= [] creator: None +--- 'expires': 1183554366 +name: onei_slice408 id: 409 peer: 1 nodes= [408, 58] persons= [914, 913, 912] +--- sa_ids= [] creator: None +--- 'expires': 1183554366 +name: onej_slice409 id: 410 peer: 1 nodes= [409, 59] persons= [915, 914, 913] +--- sa_ids= [] creator: None +--- 'expires': 1183554366 +name: oneba_slice410 id: 411 peer: 1 nodes= [410, 60] persons= [916, 915, 914] +--- sa_ids= [] creator: None +--- 'expires': 1183554366 +name: onebb_slice411 id: 412 peer: 1 nodes= [411, 61] persons= [916, 915, 917] +--- sa_ids= [] creator: None +--- 'expires': 1183554367 +name: onebc_slice412 id: 413 peer: 1 nodes= [412, 62] persons= [916, 918, 917] +--- sa_ids= [] creator: None +--- 'expires': 1183554367 +name: onebd_slice413 id: 414 peer: 1 nodes= [413, 63] persons= [919, 918, 917] +--- sa_ids= [] creator: None +--- 'expires': 1183554367 +name: onebe_slice414 id: 415 peer: 1 nodes= [64, 414] persons= [920, 919, 918] +--- sa_ids= [] creator: None +--- 'expires': 1183554367 +name: onebf_slice415 id: 416 peer: 1 nodes= [65, 415] persons= [921, 920, 919] +--- sa_ids= [] creator: None +--- 'expires': 1183554367 +name: onebg_slice416 id: 417 peer: 1 nodes= [416, 66] persons= [922, 921, 920] +--- sa_ids= [] creator: None +--- 'expires': 1183554367 +name: onebh_slice417 id: 418 peer: 1 nodes= [417, 67] persons= [923, 922, 921] +--- sa_ids= [] creator: None +--- 'expires': 1183554367 +name: onebi_slice418 id: 419 peer: 1 nodes= [418, 68] persons= [924, 923, 922] +--- sa_ids= [] creator: None +--- 'expires': 1183554368 +name: onebj_slice419 id: 420 peer: 1 nodes= [419, 69] persons= [924, 923, 925] +--- sa_ids= [] creator: None +--- 'expires': 1183554368 +name: oneca_slice420 id: 421 peer: 1 nodes= [420, 70] persons= [924, 926, 925] +--- sa_ids= [] creator: None +--- 'expires': 1183554368 +name: onecb_slice421 id: 422 peer: 1 nodes= [421, 71] persons= [927, 926, 925] +--- sa_ids= [] creator: None +--- 'expires': 1183554368 +name: onecc_slice422 id: 423 peer: 1 nodes= [72, 422] persons= [928, 927, 926] +--- sa_ids= [] creator: None +--- 'expires': 1183554368 +name: onecd_slice423 id: 424 peer: 1 nodes= [73, 423] persons= [929, 928, 927] +--- sa_ids= [] creator: None +--- 'expires': 1183554368 +name: onece_slice424 id: 425 peer: 1 nodes= [424, 74] persons= [930, 929, 928] +--- sa_ids= [] creator: None +--- 'expires': 1183554368 +name: onecf_slice425 id: 426 peer: 1 nodes= [425, 75] persons= [931, 930, 929] +--- sa_ids= [] creator: None +--- 'expires': 1183554369 +name: onecg_slice426 id: 427 peer: 1 nodes= [426, 76] persons= [932, 931, 930] +--- sa_ids= [] creator: None +--- 'expires': 1183554369 +name: onech_slice427 id: 428 peer: 1 nodes= [427, 77] persons= [932, 931, 933] +--- sa_ids= [] creator: None +--- 'expires': 1183554369 +name: oneci_slice428 id: 429 peer: 1 nodes= [428, 78] persons= [932, 934, 933] +--- sa_ids= [] creator: None +--- 'expires': 1183554369 +name: onecj_slice429 id: 430 peer: 1 nodes= [429, 79] persons= [935, 934, 933] +--- sa_ids= [] creator: None +--- 'expires': 1183554369 +name: oneda_slice430 id: 431 peer: 1 nodes= [80, 430] persons= [936, 935, 934] +--- sa_ids= [] creator: None +--- 'expires': 1183554369 +name: onedb_slice431 id: 432 peer: 1 nodes= [81, 431] persons= [937, 936, 935] +--- sa_ids= [] creator: None +--- 'expires': 1183554369 +name: onedc_slice432 id: 433 peer: 1 nodes= [432, 82] persons= [938, 937, 936] +--- sa_ids= [] creator: None +--- 'expires': 1183554370 +name: onedd_slice433 id: 434 peer: 1 nodes= [433, 83] persons= [939, 938, 937] +--- sa_ids= [] creator: None +--- 'expires': 1183554370 +name: onede_slice434 id: 435 peer: 1 nodes= [434, 84] persons= [940, 939, 938] +--- sa_ids= [] creator: None +--- 'expires': 1183554370 +name: onedf_slice435 id: 436 peer: 1 nodes= [435, 85] persons= [940, 939, 941] +--- sa_ids= [] creator: None +--- 'expires': 1183554370 +name: onedg_slice436 id: 437 peer: 1 nodes= [436, 86] persons= [940, 942, 941] +--- sa_ids= [] creator: None +--- 'expires': 1183554370 +name: onedh_slice437 id: 438 peer: 1 nodes= [437, 87] persons= [943, 942, 941] +--- sa_ids= [] creator: None +--- 'expires': 1183554370 +name: onedi_slice438 id: 439 peer: 1 nodes= [88, 438] persons= [944, 943, 942] +--- sa_ids= [] creator: None +--- 'expires': 1183554370 +name: onedj_slice439 id: 440 peer: 1 nodes= [89, 439] persons= [945, 944, 943] +--- sa_ids= [] creator: None +--- 'expires': 1183554371 +name: oneea_slice440 id: 441 peer: 1 nodes= [440, 90] persons= [946, 945, 944] +--- sa_ids= [] creator: None +--- 'expires': 1183554371 +name: oneeb_slice441 id: 442 peer: 1 nodes= [441, 91] persons= [947, 946, 945] +--- sa_ids= [] creator: None +--- 'expires': 1183554371 +name: oneec_slice442 id: 443 peer: 1 nodes= [442, 92] persons= [948, 947, 946] +--- sa_ids= [] creator: None +--- 'expires': 1183554371 +name: oneed_slice443 id: 444 peer: 1 nodes= [443, 93] persons= [948, 947, 949] +--- sa_ids= [] creator: None +--- 'expires': 1183554371 +name: oneee_slice444 id: 445 peer: 1 nodes= [444, 94] persons= [948, 950, 949] +--- sa_ids= [] creator: None +--- 'expires': 1183554371 +name: oneef_slice445 id: 446 peer: 1 nodes= [445, 95] persons= [951, 950, 949] +--- sa_ids= [] creator: None +--- 'expires': 1183554371 +name: oneeg_slice446 id: 447 peer: 1 nodes= [96, 446] persons= [952, 951, 950] +--- sa_ids= [] creator: None +--- 'expires': 1183554372 +name: oneeh_slice447 id: 448 peer: 1 nodes= [97, 447] persons= [953, 952, 951] +--- sa_ids= [] creator: None +--- 'expires': 1183554372 +name: oneei_slice448 id: 449 peer: 1 nodes= [448, 98] persons= [954, 953, 952] +--- sa_ids= [] creator: None +--- 'expires': 1183554372 +name: oneej_slice449 id: 450 peer: 1 nodes= [449, 99] persons= [955, 954, 953] +--- sa_ids= [] creator: None +--- 'expires': 1183554372 +name: onefa_slice450 id: 451 peer: 1 nodes= [450, 100] persons= [956, 955, 954] +--- sa_ids= [] creator: None +--- 'expires': 1183554372 +name: onefb_slice451 id: 452 peer: 1 nodes= [451, 101] persons= [956, 955, 957] +--- sa_ids= [] creator: None +--- 'expires': 1183554372 +name: onefc_slice452 id: 453 peer: 1 nodes= [452, 102] persons= [956, 958, 957] +--- sa_ids= [] creator: None +--- 'expires': 1183554373 +name: onefd_slice453 id: 454 peer: 1 nodes= [453, 103] persons= [959, 958, 957] +--- sa_ids= [] creator: None +--- 'expires': 1183554373 +name: onefe_slice454 id: 455 peer: 1 nodes= [104, 454] persons= [960, 959, 958] +--- sa_ids= [] creator: None +--- 'expires': 1183554373 +name: oneff_slice455 id: 456 peer: 1 nodes= [105, 455] persons= [961, 960, 959] +--- sa_ids= [] creator: None +--- 'expires': 1183554373 +name: onefg_slice456 id: 457 peer: 1 nodes= [456, 106] persons= [962, 961, 960] +--- sa_ids= [] creator: None +--- 'expires': 1183554373 +name: onefh_slice457 id: 458 peer: 1 nodes= [457, 107] persons= [963, 962, 961] +--- sa_ids= [] creator: None +--- 'expires': 1183554373 +name: onefi_slice458 id: 459 peer: 1 nodes= [458, 108] persons= [964, 963, 962] +--- sa_ids= [] creator: None +--- 'expires': 1183554373 +name: onefj_slice459 id: 460 peer: 1 nodes= [459, 109] persons= [964, 963, 965] +--- sa_ids= [] creator: None +--- 'expires': 1183554374 +name: onega_slice460 id: 461 peer: 1 nodes= [460, 110] persons= [964, 966, 965] +--- sa_ids= [] creator: None +--- 'expires': 1183554374 +name: onegb_slice461 id: 462 peer: 1 nodes= [461, 111] persons= [967, 966, 965] +--- sa_ids= [] creator: None +--- 'expires': 1183554374 +name: onegc_slice462 id: 463 peer: 1 nodes= [112, 462] persons= [968, 967, 966] +--- sa_ids= [] creator: None +--- 'expires': 1183554374 +name: onegd_slice463 id: 464 peer: 1 nodes= [113, 463] persons= [969, 968, 967] +--- sa_ids= [] creator: None +--- 'expires': 1183554374 +name: onege_slice464 id: 465 peer: 1 nodes= [464, 114] persons= [970, 969, 968] +--- sa_ids= [] creator: None +--- 'expires': 1183554374 +name: onegf_slice465 id: 466 peer: 1 nodes= [465, 115] persons= [971, 970, 969] +--- sa_ids= [] creator: None +--- 'expires': 1183554374 +name: onegg_slice466 id: 467 peer: 1 nodes= [466, 116] persons= [972, 971, 970] +--- sa_ids= [] creator: None +--- 'expires': 1183554375 +name: onegh_slice467 id: 468 peer: 1 nodes= [467, 117] persons= [972, 971, 973] +--- sa_ids= [] creator: None +--- 'expires': 1183554375 +name: onegi_slice468 id: 469 peer: 1 nodes= [468, 118] persons= [972, 974, 973] +--- sa_ids= [] creator: None +--- 'expires': 1183554375 +name: onegj_slice469 id: 470 peer: 1 nodes= [469, 119] persons= [975, 974, 973] +--- sa_ids= [] creator: None +--- 'expires': 1183554375 +name: oneha_slice470 id: 471 peer: 1 nodes= [120, 470] persons= [976, 975, 974] +--- sa_ids= [] creator: None +--- 'expires': 1183554375 +name: onehb_slice471 id: 472 peer: 1 nodes= [121, 471] persons= [977, 976, 975] +--- sa_ids= [] creator: None +--- 'expires': 1183554375 +name: onehc_slice472 id: 473 peer: 1 nodes= [472, 122] persons= [978, 977, 976] +--- sa_ids= [] creator: None +--- 'expires': 1183554375 +name: onehd_slice473 id: 474 peer: 1 nodes= [473, 123] persons= [979, 978, 977] +--- sa_ids= [] creator: None +--- 'expires': 1183554376 +name: onehe_slice474 id: 475 peer: 1 nodes= [474, 124] persons= [980, 979, 978] +--- sa_ids= [] creator: None +--- 'expires': 1183554376 +name: onehf_slice475 id: 476 peer: 1 nodes= [475, 125] persons= [980, 979, 981] +--- sa_ids= [] creator: None +--- 'expires': 1183554376 +name: onehg_slice476 id: 477 peer: 1 nodes= [476, 126] persons= [980, 982, 981] +--- sa_ids= [] creator: None +--- 'expires': 1183554376 +name: onehh_slice477 id: 478 peer: 1 nodes= [477, 127] persons= [983, 982, 981] +--- sa_ids= [] creator: None +--- 'expires': 1183554376 +name: onehi_slice478 id: 479 peer: 1 nodes= [128, 478] persons= [984, 983, 982] +--- sa_ids= [] creator: None +--- 'expires': 1183554376 +name: onehj_slice479 id: 480 peer: 1 nodes= [129, 479] persons= [985, 984, 983] +--- sa_ids= [] creator: None +--- 'expires': 1183554376 +name: oneia_slice480 id: 481 peer: 1 nodes= [480, 130] persons= [986, 985, 984] +--- sa_ids= [] creator: None +--- 'expires': 1183554377 +name: oneib_slice481 id: 482 peer: 1 nodes= [481, 131] persons= [987, 986, 985] +--- sa_ids= [] creator: None +--- 'expires': 1183554377 +name: oneic_slice482 id: 483 peer: 1 nodes= [482, 132] persons= [988, 987, 986] +--- sa_ids= [] creator: None +--- 'expires': 1183554377 +name: oneid_slice483 id: 484 peer: 1 nodes= [483, 133] persons= [988, 987, 989] +--- sa_ids= [] creator: None +--- 'expires': 1183554377 +name: oneie_slice484 id: 485 peer: 1 nodes= [484, 134] persons= [988, 990, 989] +--- sa_ids= [] creator: None +--- 'expires': 1183554377 +name: oneif_slice485 id: 486 peer: 1 nodes= [485, 135] persons= [991, 990, 989] +--- sa_ids= [] creator: None +--- 'expires': 1183554377 +name: oneig_slice486 id: 487 peer: 1 nodes= [136, 486] persons= [992, 991, 990] +--- sa_ids= [] creator: None +--- 'expires': 1183554377 +name: oneih_slice487 id: 488 peer: 1 nodes= [137, 487] persons= [993, 992, 991] +--- sa_ids= [] creator: None +--- 'expires': 1183554378 +name: oneii_slice488 id: 489 peer: 1 nodes= [488, 138] persons= [994, 993, 992] +--- sa_ids= [] creator: None +--- 'expires': 1183554378 +name: oneij_slice489 id: 490 peer: 1 nodes= [489, 139] persons= [995, 994, 993] +--- sa_ids= [] creator: None +--- 'expires': 1183554378 +name: oneja_slice490 id: 491 peer: 1 nodes= [490, 140] persons= [996, 995, 994] +--- sa_ids= [] creator: None +--- 'expires': 1183554378 +name: onejb_slice491 id: 492 peer: 1 nodes= [491, 141] persons= [996, 995, 997] +--- sa_ids= [] creator: None +--- 'expires': 1183554378 +name: onejc_slice492 id: 493 peer: 1 nodes= [492, 142] persons= [996, 998, 997] +--- sa_ids= [] creator: None +--- 'expires': 1183554378 +name: onejd_slice493 id: 494 peer: 1 nodes= [493, 143] persons= [999, 998, 997] +--- sa_ids= [] creator: None +--- 'expires': 1183554379 +name: oneje_slice494 id: 495 peer: 1 nodes= [144, 494] persons= [1000, 999, 998] +--- sa_ids= [] creator: None +--- 'expires': 1183554379 +name: onejf_slice495 id: 496 peer: 1 nodes= [145, 495] persons= [1001, 1000, 999] +--- sa_ids= [] creator: None +--- 'expires': 1183554379 +name: onejg_slice496 id: 497 peer: 1 nodes= [496, 146] persons= [1002, 1001, 1000] +--- sa_ids= [] creator: None +--- 'expires': 1183554379 +name: onejh_slice497 id: 498 peer: 1 nodes= [497, 147] persons= [1003, 1002, 1001] +--- sa_ids= [] creator: None +--- 'expires': 1183554379 +name: oneji_slice498 id: 499 peer: 1 nodes= [498, 148] persons= [1004, 1003, 1002] +--- sa_ids= [] creator: None +--- 'expires': 1183554379 +name: onejj_slice499 id: 500 peer: 1 nodes= [499, 149] persons= [1004, 1003, 505] +--- sa_ids= [] creator: None +--- 'expires': 1183554379 +name: onebaa_slice500 id: 501 peer: 1 nodes= [500, 150] persons= [1004, 506, 505] +--- sa_ids= [] creator: None +--- 'expires': 1183554380 +02: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_2 < custom sat on plc2 > +02: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None ++++ 251.90 seconds ellapsed (10.67) +02: SLIVERS for first 3 nodes +WARNING - GetSlivers needs fix +02:============================== END DUMP ++++ 251.90 seconds ellapsed (0.00) +==================== ('END',) ++++ 251.90 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-h.populate_end.ref b/trunk/tests/testpeers.-h.populate_end.ref new file mode 100644 index 0000000..6b90268 --- /dev/null +++ b/trunk/tests/testpeers.-h.populate_end.ref @@ -0,0 +1,46281 @@ +Running populate_end +1000 sites, 2000 persons, 3000 nodes & 2000 slices +1 keys/person, 3 nodes/slice & 3 persons/slice +fast_flag False ++++ timer start +initializing s[1]=>https://planetlab-devbox.inria.fr:443/PLCAPI/ +initializing s[2]=>https://lurch.cs.princeton.edu:443/PLCAPI/ +=== refresh Peer 1 for publishing foreign nodes from 2 ++++ 0.45 seconds ellapsed (0.45) +01:== Refreshing peer Result: { new_keys 2000 new_nodes 3000 new_persons 2001 new_sites 1001 new_slice_attribute_types 1 new_slice_attributes 5 new_slices 1 peername Thierry plc2 } ++++ ellapsed: { process-keys 24.5056829453 process-nodes 246.490015984 process-persons 82.4104459286 process-sa 1.37920308113 process-sat 0.0163571834564 process-sites 24.8073971272 process-slices 3.42446088791 time_all 407.676270008 time_gather 0.733674049377 time_process 383.033581972 time_transmit 23.9090139866 } ++++ 410.11 seconds ellapsed (409.66) ++++ 410.11 seconds ellapsed (0.00) +01:== added in slice oneb_slice1 foreign ['n2-001.plc2.org', 'n2-002.plc2.org', 'n2-003.plc2.org'] +01:== added in slice onec_slice2 foreign ['n2-002.plc2.org', 'n2-003.plc2.org', 'n2-004.plc2.org'] +01:== added in slice oned_slice3 foreign ['n2-003.plc2.org', 'n2-004.plc2.org', 'n2-005.plc2.org'] +01:== added in slice onee_slice4 foreign ['n2-004.plc2.org', 'n2-005.plc2.org', 'n2-006.plc2.org'] +01:== added in slice onef_slice5 foreign ['n2-005.plc2.org', 'n2-006.plc2.org', 'n2-007.plc2.org'] +01:== added in slice oneg_slice6 foreign ['n2-006.plc2.org', 'n2-007.plc2.org', 'n2-008.plc2.org'] +01:== added in slice oneh_slice7 foreign ['n2-007.plc2.org', 'n2-008.plc2.org', 'n2-009.plc2.org'] +01:== added in slice onei_slice8 foreign ['n2-008.plc2.org', 'n2-009.plc2.org', 'n2-010.plc2.org'] +01:== added in slice onej_slice9 foreign ['n2-009.plc2.org', 'n2-010.plc2.org', 'n2-011.plc2.org'] +01:== added in slice oneba_slice10 foreign ['n2-010.plc2.org', 'n2-011.plc2.org', 'n2-012.plc2.org'] +01:== added in slice onebb_slice11 foreign ['n2-011.plc2.org', 'n2-012.plc2.org', 'n2-013.plc2.org'] +01:== added in slice onebc_slice12 foreign ['n2-012.plc2.org', 'n2-013.plc2.org', 'n2-014.plc2.org'] +01:== added in slice onebd_slice13 foreign ['n2-013.plc2.org', 'n2-014.plc2.org', 'n2-015.plc2.org'] +01:== added in slice onebe_slice14 foreign ['n2-014.plc2.org', 'n2-015.plc2.org', 'n2-016.plc2.org'] +01:== added in slice onebf_slice15 foreign ['n2-015.plc2.org', 'n2-016.plc2.org', 'n2-017.plc2.org'] +01:== added in slice onebg_slice16 foreign ['n2-016.plc2.org', 'n2-017.plc2.org', 'n2-018.plc2.org'] +01:== added in slice onebh_slice17 foreign ['n2-017.plc2.org', 'n2-018.plc2.org', 'n2-019.plc2.org'] +01:== added in slice onebi_slice18 foreign ['n2-018.plc2.org', 'n2-019.plc2.org', 'n2-020.plc2.org'] +01:== added in slice onebj_slice19 foreign ['n2-019.plc2.org', 'n2-020.plc2.org', 'n2-021.plc2.org'] +01:== added in slice oneca_slice20 foreign ['n2-020.plc2.org', 'n2-021.plc2.org', 'n2-022.plc2.org'] +01:== added in slice onecb_slice21 foreign ['n2-021.plc2.org', 'n2-022.plc2.org', 'n2-023.plc2.org'] +01:== added in slice onecc_slice22 foreign ['n2-022.plc2.org', 'n2-023.plc2.org', 'n2-024.plc2.org'] +01:== added in slice onecd_slice23 foreign ['n2-023.plc2.org', 'n2-024.plc2.org', 'n2-025.plc2.org'] +01:== added in slice onece_slice24 foreign ['n2-024.plc2.org', 'n2-025.plc2.org', 'n2-026.plc2.org'] +01:== added in slice onecf_slice25 foreign ['n2-025.plc2.org', 'n2-026.plc2.org', 'n2-027.plc2.org'] +01:== added in slice onecg_slice26 foreign ['n2-026.plc2.org', 'n2-027.plc2.org', 'n2-028.plc2.org'] +01:== added in slice onech_slice27 foreign ['n2-027.plc2.org', 'n2-028.plc2.org', 'n2-029.plc2.org'] +01:== added in slice oneci_slice28 foreign ['n2-028.plc2.org', 'n2-029.plc2.org', 'n2-030.plc2.org'] +01:== added in slice onecj_slice29 foreign ['n2-029.plc2.org', 'n2-030.plc2.org', 'n2-031.plc2.org'] +01:== added in slice oneda_slice30 foreign ['n2-030.plc2.org', 'n2-031.plc2.org', 'n2-032.plc2.org'] +01:== added in slice onedb_slice31 foreign ['n2-031.plc2.org', 'n2-032.plc2.org', 'n2-033.plc2.org'] +01:== added in slice onedc_slice32 foreign ['n2-032.plc2.org', 'n2-033.plc2.org', 'n2-034.plc2.org'] +01:== added in slice onedd_slice33 foreign ['n2-033.plc2.org', 'n2-034.plc2.org', 'n2-035.plc2.org'] +01:== added in slice onede_slice34 foreign ['n2-034.plc2.org', 'n2-035.plc2.org', 'n2-036.plc2.org'] +01:== added in slice onedf_slice35 foreign ['n2-035.plc2.org', 'n2-036.plc2.org', 'n2-037.plc2.org'] +01:== added in slice onedg_slice36 foreign ['n2-036.plc2.org', 'n2-037.plc2.org', 'n2-038.plc2.org'] +01:== added in slice onedh_slice37 foreign ['n2-037.plc2.org', 'n2-038.plc2.org', 'n2-039.plc2.org'] +01:== added in slice onedi_slice38 foreign ['n2-038.plc2.org', 'n2-039.plc2.org', 'n2-040.plc2.org'] +01:== added in slice onedj_slice39 foreign ['n2-039.plc2.org', 'n2-040.plc2.org', 'n2-041.plc2.org'] +01:== added in slice oneea_slice40 foreign ['n2-040.plc2.org', 'n2-041.plc2.org', 'n2-042.plc2.org'] +01:== added in slice oneeb_slice41 foreign ['n2-041.plc2.org', 'n2-042.plc2.org', 'n2-043.plc2.org'] +01:== added in slice oneec_slice42 foreign ['n2-042.plc2.org', 'n2-043.plc2.org', 'n2-044.plc2.org'] +01:== added in slice oneed_slice43 foreign ['n2-043.plc2.org', 'n2-044.plc2.org', 'n2-045.plc2.org'] +01:== added in slice oneee_slice44 foreign ['n2-044.plc2.org', 'n2-045.plc2.org', 'n2-046.plc2.org'] +01:== added in slice oneef_slice45 foreign ['n2-045.plc2.org', 'n2-046.plc2.org', 'n2-047.plc2.org'] +01:== added in slice oneeg_slice46 foreign ['n2-046.plc2.org', 'n2-047.plc2.org', 'n2-048.plc2.org'] +01:== added in slice oneeh_slice47 foreign ['n2-047.plc2.org', 'n2-048.plc2.org', 'n2-049.plc2.org'] +01:== added in slice oneei_slice48 foreign ['n2-048.plc2.org', 'n2-049.plc2.org', 'n2-050.plc2.org'] +01:== added in slice oneej_slice49 foreign ['n2-049.plc2.org', 'n2-050.plc2.org', 'n2-051.plc2.org'] +01:== added in slice onefa_slice50 foreign ['n2-050.plc2.org', 'n2-051.plc2.org', 'n2-052.plc2.org'] +01:== added in slice onefb_slice51 foreign ['n2-051.plc2.org', 'n2-052.plc2.org', 'n2-053.plc2.org'] +01:== added in slice onefc_slice52 foreign ['n2-052.plc2.org', 'n2-053.plc2.org', 'n2-054.plc2.org'] +01:== added in slice onefd_slice53 foreign ['n2-053.plc2.org', 'n2-054.plc2.org', 'n2-055.plc2.org'] +01:== added in slice onefe_slice54 foreign ['n2-054.plc2.org', 'n2-055.plc2.org', 'n2-056.plc2.org'] +01:== added in slice oneff_slice55 foreign ['n2-055.plc2.org', 'n2-056.plc2.org', 'n2-057.plc2.org'] +01:== added in slice onefg_slice56 foreign ['n2-056.plc2.org', 'n2-057.plc2.org', 'n2-058.plc2.org'] +01:== added in slice onefh_slice57 foreign ['n2-057.plc2.org', 'n2-058.plc2.org', 'n2-059.plc2.org'] +01:== added in slice onefi_slice58 foreign ['n2-058.plc2.org', 'n2-059.plc2.org', 'n2-060.plc2.org'] +01:== added in slice onefj_slice59 foreign ['n2-059.plc2.org', 'n2-060.plc2.org', 'n2-061.plc2.org'] +01:== added in slice onega_slice60 foreign ['n2-060.plc2.org', 'n2-061.plc2.org', 'n2-062.plc2.org'] +01:== added in slice onegb_slice61 foreign ['n2-061.plc2.org', 'n2-062.plc2.org', 'n2-063.plc2.org'] +01:== added in slice onegc_slice62 foreign ['n2-062.plc2.org', 'n2-063.plc2.org', 'n2-064.plc2.org'] +01:== added in slice onegd_slice63 foreign ['n2-063.plc2.org', 'n2-064.plc2.org', 'n2-065.plc2.org'] +01:== added in slice onege_slice64 foreign ['n2-064.plc2.org', 'n2-065.plc2.org', 'n2-066.plc2.org'] +01:== added in slice onegf_slice65 foreign ['n2-065.plc2.org', 'n2-066.plc2.org', 'n2-067.plc2.org'] +01:== added in slice onegg_slice66 foreign ['n2-066.plc2.org', 'n2-067.plc2.org', 'n2-068.plc2.org'] +01:== added in slice onegh_slice67 foreign ['n2-067.plc2.org', 'n2-068.plc2.org', 'n2-069.plc2.org'] +01:== added in slice onegi_slice68 foreign ['n2-068.plc2.org', 'n2-069.plc2.org', 'n2-070.plc2.org'] +01:== added in slice onegj_slice69 foreign ['n2-069.plc2.org', 'n2-070.plc2.org', 'n2-071.plc2.org'] +01:== added in slice oneha_slice70 foreign ['n2-070.plc2.org', 'n2-071.plc2.org', 'n2-072.plc2.org'] +01:== added in slice onehb_slice71 foreign ['n2-071.plc2.org', 'n2-072.plc2.org', 'n2-073.plc2.org'] +01:== added in slice onehc_slice72 foreign ['n2-072.plc2.org', 'n2-073.plc2.org', 'n2-074.plc2.org'] +01:== added in slice onehd_slice73 foreign ['n2-073.plc2.org', 'n2-074.plc2.org', 'n2-075.plc2.org'] +01:== added in slice onehe_slice74 foreign ['n2-074.plc2.org', 'n2-075.plc2.org', 'n2-076.plc2.org'] +01:== added in slice onehf_slice75 foreign ['n2-075.plc2.org', 'n2-076.plc2.org', 'n2-077.plc2.org'] +01:== added in slice onehg_slice76 foreign ['n2-076.plc2.org', 'n2-077.plc2.org', 'n2-078.plc2.org'] +01:== added in slice onehh_slice77 foreign ['n2-077.plc2.org', 'n2-078.plc2.org', 'n2-079.plc2.org'] +01:== added in slice onehi_slice78 foreign ['n2-078.plc2.org', 'n2-079.plc2.org', 'n2-080.plc2.org'] +01:== added in slice onehj_slice79 foreign ['n2-079.plc2.org', 'n2-080.plc2.org', 'n2-081.plc2.org'] +01:== added in slice oneia_slice80 foreign ['n2-080.plc2.org', 'n2-081.plc2.org', 'n2-082.plc2.org'] +01:== added in slice oneib_slice81 foreign ['n2-081.plc2.org', 'n2-082.plc2.org', 'n2-083.plc2.org'] +01:== added in slice oneic_slice82 foreign ['n2-082.plc2.org', 'n2-083.plc2.org', 'n2-084.plc2.org'] +01:== added in slice oneid_slice83 foreign ['n2-083.plc2.org', 'n2-084.plc2.org', 'n2-085.plc2.org'] +01:== added in slice oneie_slice84 foreign ['n2-084.plc2.org', 'n2-085.plc2.org', 'n2-086.plc2.org'] +01:== added in slice oneif_slice85 foreign ['n2-085.plc2.org', 'n2-086.plc2.org', 'n2-087.plc2.org'] +01:== added in slice oneig_slice86 foreign ['n2-086.plc2.org', 'n2-087.plc2.org', 'n2-088.plc2.org'] +01:== added in slice oneih_slice87 foreign ['n2-087.plc2.org', 'n2-088.plc2.org', 'n2-089.plc2.org'] +01:== added in slice oneii_slice88 foreign ['n2-088.plc2.org', 'n2-089.plc2.org', 'n2-090.plc2.org'] +01:== added in slice oneij_slice89 foreign ['n2-089.plc2.org', 'n2-090.plc2.org', 'n2-091.plc2.org'] +01:== added in slice oneja_slice90 foreign ['n2-090.plc2.org', 'n2-091.plc2.org', 'n2-092.plc2.org'] +01:== added in slice onejb_slice91 foreign ['n2-091.plc2.org', 'n2-092.plc2.org', 'n2-093.plc2.org'] +01:== added in slice onejc_slice92 foreign ['n2-092.plc2.org', 'n2-093.plc2.org', 'n2-094.plc2.org'] +01:== added in slice onejd_slice93 foreign ['n2-093.plc2.org', 'n2-094.plc2.org', 'n2-095.plc2.org'] +01:== added in slice oneje_slice94 foreign ['n2-094.plc2.org', 'n2-095.plc2.org', 'n2-096.plc2.org'] +01:== added in slice onejf_slice95 foreign ['n2-095.plc2.org', 'n2-096.plc2.org', 'n2-097.plc2.org'] +01:== added in slice onejg_slice96 foreign ['n2-096.plc2.org', 'n2-097.plc2.org', 'n2-098.plc2.org'] +01:== added in slice onejh_slice97 foreign ['n2-097.plc2.org', 'n2-098.plc2.org', 'n2-099.plc2.org'] +01:== added in slice oneji_slice98 foreign ['n2-098.plc2.org', 'n2-099.plc2.org', 'n2-100.plc2.org'] +01:== added in slice onejj_slice99 foreign ['n2-099.plc2.org', 'n2-100.plc2.org', 'n2-101.plc2.org'] +01:== added in slice onebaa_slice100 foreign ['n2-100.plc2.org', 'n2-101.plc2.org', 'n2-102.plc2.org'] +01:== added in slice onebab_slice101 foreign ['n2-101.plc2.org', 'n2-102.plc2.org', 'n2-103.plc2.org'] +01:== added in slice onebac_slice102 foreign ['n2-102.plc2.org', 'n2-103.plc2.org', 'n2-104.plc2.org'] +01:== added in slice onebad_slice103 foreign ['n2-103.plc2.org', 'n2-104.plc2.org', 'n2-105.plc2.org'] +01:== added in slice onebae_slice104 foreign ['n2-104.plc2.org', 'n2-105.plc2.org', 'n2-106.plc2.org'] +01:== added in slice onebaf_slice105 foreign ['n2-105.plc2.org', 'n2-106.plc2.org', 'n2-107.plc2.org'] +01:== added in slice onebag_slice106 foreign ['n2-106.plc2.org', 'n2-107.plc2.org', 'n2-108.plc2.org'] +01:== added in slice onebah_slice107 foreign ['n2-107.plc2.org', 'n2-108.plc2.org', 'n2-109.plc2.org'] +01:== added in slice onebai_slice108 foreign ['n2-108.plc2.org', 'n2-109.plc2.org', 'n2-110.plc2.org'] +01:== added in slice onebaj_slice109 foreign ['n2-109.plc2.org', 'n2-110.plc2.org', 'n2-111.plc2.org'] +01:== added in slice onebba_slice110 foreign ['n2-110.plc2.org', 'n2-111.plc2.org', 'n2-112.plc2.org'] +01:== added in slice onebbb_slice111 foreign ['n2-111.plc2.org', 'n2-112.plc2.org', 'n2-113.plc2.org'] +01:== added in slice onebbc_slice112 foreign ['n2-112.plc2.org', 'n2-113.plc2.org', 'n2-114.plc2.org'] +01:== added in slice onebbd_slice113 foreign ['n2-113.plc2.org', 'n2-114.plc2.org', 'n2-115.plc2.org'] +01:== added in slice onebbe_slice114 foreign ['n2-114.plc2.org', 'n2-115.plc2.org', 'n2-116.plc2.org'] +01:== added in slice onebbf_slice115 foreign ['n2-115.plc2.org', 'n2-116.plc2.org', 'n2-117.plc2.org'] +01:== added in slice onebbg_slice116 foreign ['n2-116.plc2.org', 'n2-117.plc2.org', 'n2-118.plc2.org'] +01:== added in slice onebbh_slice117 foreign ['n2-117.plc2.org', 'n2-118.plc2.org', 'n2-119.plc2.org'] +01:== added in slice onebbi_slice118 foreign ['n2-118.plc2.org', 'n2-119.plc2.org', 'n2-120.plc2.org'] +01:== added in slice onebbj_slice119 foreign ['n2-119.plc2.org', 'n2-120.plc2.org', 'n2-121.plc2.org'] +01:== added in slice onebca_slice120 foreign ['n2-120.plc2.org', 'n2-121.plc2.org', 'n2-122.plc2.org'] +01:== added in slice onebcb_slice121 foreign ['n2-121.plc2.org', 'n2-122.plc2.org', 'n2-123.plc2.org'] +01:== added in slice onebcc_slice122 foreign ['n2-122.plc2.org', 'n2-123.plc2.org', 'n2-124.plc2.org'] +01:== added in slice onebcd_slice123 foreign ['n2-123.plc2.org', 'n2-124.plc2.org', 'n2-125.plc2.org'] +01:== added in slice onebce_slice124 foreign ['n2-124.plc2.org', 'n2-125.plc2.org', 'n2-126.plc2.org'] +01:== added in slice onebcf_slice125 foreign ['n2-125.plc2.org', 'n2-126.plc2.org', 'n2-127.plc2.org'] +01:== added in slice onebcg_slice126 foreign ['n2-126.plc2.org', 'n2-127.plc2.org', 'n2-128.plc2.org'] +01:== added in slice onebch_slice127 foreign ['n2-127.plc2.org', 'n2-128.plc2.org', 'n2-129.plc2.org'] +01:== added in slice onebci_slice128 foreign ['n2-128.plc2.org', 'n2-129.plc2.org', 'n2-130.plc2.org'] +01:== added in slice onebcj_slice129 foreign ['n2-129.plc2.org', 'n2-130.plc2.org', 'n2-131.plc2.org'] +01:== added in slice onebda_slice130 foreign ['n2-130.plc2.org', 'n2-131.plc2.org', 'n2-132.plc2.org'] +01:== added in slice onebdb_slice131 foreign ['n2-131.plc2.org', 'n2-132.plc2.org', 'n2-133.plc2.org'] +01:== added in slice onebdc_slice132 foreign ['n2-132.plc2.org', 'n2-133.plc2.org', 'n2-134.plc2.org'] +01:== added in slice onebdd_slice133 foreign ['n2-133.plc2.org', 'n2-134.plc2.org', 'n2-135.plc2.org'] +01:== added in slice onebde_slice134 foreign ['n2-134.plc2.org', 'n2-135.plc2.org', 'n2-136.plc2.org'] +01:== added in slice onebdf_slice135 foreign ['n2-135.plc2.org', 'n2-136.plc2.org', 'n2-137.plc2.org'] +01:== added in slice onebdg_slice136 foreign ['n2-136.plc2.org', 'n2-137.plc2.org', 'n2-138.plc2.org'] +01:== added in slice onebdh_slice137 foreign ['n2-137.plc2.org', 'n2-138.plc2.org', 'n2-139.plc2.org'] +01:== added in slice onebdi_slice138 foreign ['n2-138.plc2.org', 'n2-139.plc2.org', 'n2-140.plc2.org'] +01:== added in slice onebdj_slice139 foreign ['n2-139.plc2.org', 'n2-140.plc2.org', 'n2-141.plc2.org'] +01:== added in slice onebea_slice140 foreign ['n2-140.plc2.org', 'n2-141.plc2.org', 'n2-142.plc2.org'] +01:== added in slice onebeb_slice141 foreign ['n2-141.plc2.org', 'n2-142.plc2.org', 'n2-143.plc2.org'] +01:== added in slice onebec_slice142 foreign ['n2-142.plc2.org', 'n2-143.plc2.org', 'n2-144.plc2.org'] +01:== added in slice onebed_slice143 foreign ['n2-143.plc2.org', 'n2-144.plc2.org', 'n2-145.plc2.org'] +01:== added in slice onebee_slice144 foreign ['n2-144.plc2.org', 'n2-145.plc2.org', 'n2-146.plc2.org'] +01:== added in slice onebef_slice145 foreign ['n2-145.plc2.org', 'n2-146.plc2.org', 'n2-147.plc2.org'] +01:== added in slice onebeg_slice146 foreign ['n2-146.plc2.org', 'n2-147.plc2.org', 'n2-148.plc2.org'] +01:== added in slice onebeh_slice147 foreign ['n2-147.plc2.org', 'n2-148.plc2.org', 'n2-149.plc2.org'] +01:== added in slice onebei_slice148 foreign ['n2-148.plc2.org', 'n2-149.plc2.org', 'n2-150.plc2.org'] +01:== added in slice onebej_slice149 foreign ['n2-149.plc2.org', 'n2-150.plc2.org', 'n2-151.plc2.org'] +01:== added in slice onebfa_slice150 foreign ['n2-150.plc2.org', 'n2-151.plc2.org', 'n2-152.plc2.org'] +01:== added in slice onebfb_slice151 foreign ['n2-151.plc2.org', 'n2-152.plc2.org', 'n2-153.plc2.org'] +01:== added in slice onebfc_slice152 foreign ['n2-152.plc2.org', 'n2-153.plc2.org', 'n2-154.plc2.org'] +01:== added in slice onebfd_slice153 foreign ['n2-153.plc2.org', 'n2-154.plc2.org', 'n2-155.plc2.org'] +01:== added in slice onebfe_slice154 foreign ['n2-154.plc2.org', 'n2-155.plc2.org', 'n2-156.plc2.org'] +01:== added in slice onebff_slice155 foreign ['n2-155.plc2.org', 'n2-156.plc2.org', 'n2-157.plc2.org'] +01:== added in slice onebfg_slice156 foreign ['n2-156.plc2.org', 'n2-157.plc2.org', 'n2-158.plc2.org'] +01:== added in slice onebfh_slice157 foreign ['n2-157.plc2.org', 'n2-158.plc2.org', 'n2-159.plc2.org'] +01:== added in slice onebfi_slice158 foreign ['n2-158.plc2.org', 'n2-159.plc2.org', 'n2-160.plc2.org'] +01:== added in slice onebfj_slice159 foreign ['n2-159.plc2.org', 'n2-160.plc2.org', 'n2-161.plc2.org'] +01:== added in slice onebga_slice160 foreign ['n2-160.plc2.org', 'n2-161.plc2.org', 'n2-162.plc2.org'] +01:== added in slice onebgb_slice161 foreign ['n2-161.plc2.org', 'n2-162.plc2.org', 'n2-163.plc2.org'] +01:== added in slice onebgc_slice162 foreign ['n2-162.plc2.org', 'n2-163.plc2.org', 'n2-164.plc2.org'] +01:== added in slice onebgd_slice163 foreign ['n2-163.plc2.org', 'n2-164.plc2.org', 'n2-165.plc2.org'] +01:== added in slice onebge_slice164 foreign ['n2-164.plc2.org', 'n2-165.plc2.org', 'n2-166.plc2.org'] +01:== added in slice onebgf_slice165 foreign ['n2-165.plc2.org', 'n2-166.plc2.org', 'n2-167.plc2.org'] +01:== added in slice onebgg_slice166 foreign ['n2-166.plc2.org', 'n2-167.plc2.org', 'n2-168.plc2.org'] +01:== added in slice onebgh_slice167 foreign ['n2-167.plc2.org', 'n2-168.plc2.org', 'n2-169.plc2.org'] +01:== added in slice onebgi_slice168 foreign ['n2-168.plc2.org', 'n2-169.plc2.org', 'n2-170.plc2.org'] +01:== added in slice onebgj_slice169 foreign ['n2-169.plc2.org', 'n2-170.plc2.org', 'n2-171.plc2.org'] +01:== added in slice onebha_slice170 foreign ['n2-170.plc2.org', 'n2-171.plc2.org', 'n2-172.plc2.org'] +01:== added in slice onebhb_slice171 foreign ['n2-171.plc2.org', 'n2-172.plc2.org', 'n2-173.plc2.org'] +01:== added in slice onebhc_slice172 foreign ['n2-172.plc2.org', 'n2-173.plc2.org', 'n2-174.plc2.org'] +01:== added in slice onebhd_slice173 foreign ['n2-173.plc2.org', 'n2-174.plc2.org', 'n2-175.plc2.org'] +01:== added in slice onebhe_slice174 foreign ['n2-174.plc2.org', 'n2-175.plc2.org', 'n2-176.plc2.org'] +01:== added in slice onebhf_slice175 foreign ['n2-175.plc2.org', 'n2-176.plc2.org', 'n2-177.plc2.org'] +01:== added in slice onebhg_slice176 foreign ['n2-176.plc2.org', 'n2-177.plc2.org', 'n2-178.plc2.org'] +01:== added in slice onebhh_slice177 foreign ['n2-177.plc2.org', 'n2-178.plc2.org', 'n2-179.plc2.org'] +01:== added in slice onebhi_slice178 foreign ['n2-178.plc2.org', 'n2-179.plc2.org', 'n2-180.plc2.org'] +01:== added in slice onebhj_slice179 foreign ['n2-179.plc2.org', 'n2-180.plc2.org', 'n2-181.plc2.org'] +01:== added in slice onebia_slice180 foreign ['n2-180.plc2.org', 'n2-181.plc2.org', 'n2-182.plc2.org'] +01:== added in slice onebib_slice181 foreign ['n2-181.plc2.org', 'n2-182.plc2.org', 'n2-183.plc2.org'] +01:== added in slice onebic_slice182 foreign ['n2-182.plc2.org', 'n2-183.plc2.org', 'n2-184.plc2.org'] +01:== added in slice onebid_slice183 foreign ['n2-183.plc2.org', 'n2-184.plc2.org', 'n2-185.plc2.org'] +01:== added in slice onebie_slice184 foreign ['n2-184.plc2.org', 'n2-185.plc2.org', 'n2-186.plc2.org'] +01:== added in slice onebif_slice185 foreign ['n2-185.plc2.org', 'n2-186.plc2.org', 'n2-187.plc2.org'] +01:== added in slice onebig_slice186 foreign ['n2-186.plc2.org', 'n2-187.plc2.org', 'n2-188.plc2.org'] +01:== added in slice onebih_slice187 foreign ['n2-187.plc2.org', 'n2-188.plc2.org', 'n2-189.plc2.org'] +01:== added in slice onebii_slice188 foreign ['n2-188.plc2.org', 'n2-189.plc2.org', 'n2-190.plc2.org'] +01:== added in slice onebij_slice189 foreign ['n2-189.plc2.org', 'n2-190.plc2.org', 'n2-191.plc2.org'] +01:== added in slice onebja_slice190 foreign ['n2-190.plc2.org', 'n2-191.plc2.org', 'n2-192.plc2.org'] +01:== added in slice onebjb_slice191 foreign ['n2-191.plc2.org', 'n2-192.plc2.org', 'n2-193.plc2.org'] +01:== added in slice onebjc_slice192 foreign ['n2-192.plc2.org', 'n2-193.plc2.org', 'n2-194.plc2.org'] +01:== added in slice onebjd_slice193 foreign ['n2-193.plc2.org', 'n2-194.plc2.org', 'n2-195.plc2.org'] +01:== added in slice onebje_slice194 foreign ['n2-194.plc2.org', 'n2-195.plc2.org', 'n2-196.plc2.org'] +01:== added in slice onebjf_slice195 foreign ['n2-195.plc2.org', 'n2-196.plc2.org', 'n2-197.plc2.org'] +01:== added in slice onebjg_slice196 foreign ['n2-196.plc2.org', 'n2-197.plc2.org', 'n2-198.plc2.org'] +01:== added in slice onebjh_slice197 foreign ['n2-197.plc2.org', 'n2-198.plc2.org', 'n2-199.plc2.org'] +01:== added in slice onebji_slice198 foreign ['n2-198.plc2.org', 'n2-199.plc2.org', 'n2-200.plc2.org'] +01:== added in slice onebjj_slice199 foreign ['n2-199.plc2.org', 'n2-200.plc2.org', 'n2-201.plc2.org'] +01:== added in slice onecaa_slice200 foreign ['n2-200.plc2.org', 'n2-201.plc2.org', 'n2-202.plc2.org'] +01:== added in slice onecab_slice201 foreign ['n2-201.plc2.org', 'n2-202.plc2.org', 'n2-203.plc2.org'] +01:== added in slice onecac_slice202 foreign ['n2-202.plc2.org', 'n2-203.plc2.org', 'n2-204.plc2.org'] +01:== added in slice onecad_slice203 foreign ['n2-203.plc2.org', 'n2-204.plc2.org', 'n2-205.plc2.org'] +01:== added in slice onecae_slice204 foreign ['n2-204.plc2.org', 'n2-205.plc2.org', 'n2-206.plc2.org'] +01:== added in slice onecaf_slice205 foreign ['n2-205.plc2.org', 'n2-206.plc2.org', 'n2-207.plc2.org'] +01:== added in slice onecag_slice206 foreign ['n2-206.plc2.org', 'n2-207.plc2.org', 'n2-208.plc2.org'] +01:== added in slice onecah_slice207 foreign ['n2-207.plc2.org', 'n2-208.plc2.org', 'n2-209.plc2.org'] +01:== added in slice onecai_slice208 foreign ['n2-208.plc2.org', 'n2-209.plc2.org', 'n2-210.plc2.org'] +01:== added in slice onecaj_slice209 foreign ['n2-209.plc2.org', 'n2-210.plc2.org', 'n2-211.plc2.org'] +01:== added in slice onecba_slice210 foreign ['n2-210.plc2.org', 'n2-211.plc2.org', 'n2-212.plc2.org'] +01:== added in slice onecbb_slice211 foreign ['n2-211.plc2.org', 'n2-212.plc2.org', 'n2-213.plc2.org'] +01:== added in slice onecbc_slice212 foreign ['n2-212.plc2.org', 'n2-213.plc2.org', 'n2-214.plc2.org'] +01:== added in slice onecbd_slice213 foreign ['n2-213.plc2.org', 'n2-214.plc2.org', 'n2-215.plc2.org'] +01:== added in slice onecbe_slice214 foreign ['n2-214.plc2.org', 'n2-215.plc2.org', 'n2-216.plc2.org'] +01:== added in slice onecbf_slice215 foreign ['n2-215.plc2.org', 'n2-216.plc2.org', 'n2-217.plc2.org'] +01:== added in slice onecbg_slice216 foreign ['n2-216.plc2.org', 'n2-217.plc2.org', 'n2-218.plc2.org'] +01:== added in slice onecbh_slice217 foreign ['n2-217.plc2.org', 'n2-218.plc2.org', 'n2-219.plc2.org'] +01:== added in slice onecbi_slice218 foreign ['n2-218.plc2.org', 'n2-219.plc2.org', 'n2-220.plc2.org'] +01:== added in slice onecbj_slice219 foreign ['n2-219.plc2.org', 'n2-220.plc2.org', 'n2-221.plc2.org'] +01:== added in slice onecca_slice220 foreign ['n2-220.plc2.org', 'n2-221.plc2.org', 'n2-222.plc2.org'] +01:== added in slice oneccb_slice221 foreign ['n2-221.plc2.org', 'n2-222.plc2.org', 'n2-223.plc2.org'] +01:== added in slice oneccc_slice222 foreign ['n2-222.plc2.org', 'n2-223.plc2.org', 'n2-224.plc2.org'] +01:== added in slice oneccd_slice223 foreign ['n2-223.plc2.org', 'n2-224.plc2.org', 'n2-225.plc2.org'] +01:== added in slice onecce_slice224 foreign ['n2-224.plc2.org', 'n2-225.plc2.org', 'n2-226.plc2.org'] +01:== added in slice oneccf_slice225 foreign ['n2-225.plc2.org', 'n2-226.plc2.org', 'n2-227.plc2.org'] +01:== added in slice oneccg_slice226 foreign ['n2-226.plc2.org', 'n2-227.plc2.org', 'n2-228.plc2.org'] +01:== added in slice onecch_slice227 foreign ['n2-227.plc2.org', 'n2-228.plc2.org', 'n2-229.plc2.org'] +01:== added in slice onecci_slice228 foreign ['n2-228.plc2.org', 'n2-229.plc2.org', 'n2-230.plc2.org'] +01:== added in slice oneccj_slice229 foreign ['n2-229.plc2.org', 'n2-230.plc2.org', 'n2-231.plc2.org'] +01:== added in slice onecda_slice230 foreign ['n2-230.plc2.org', 'n2-231.plc2.org', 'n2-232.plc2.org'] +01:== added in slice onecdb_slice231 foreign ['n2-231.plc2.org', 'n2-232.plc2.org', 'n2-233.plc2.org'] +01:== added in slice onecdc_slice232 foreign ['n2-232.plc2.org', 'n2-233.plc2.org', 'n2-234.plc2.org'] +01:== added in slice onecdd_slice233 foreign ['n2-233.plc2.org', 'n2-234.plc2.org', 'n2-235.plc2.org'] +01:== added in slice onecde_slice234 foreign ['n2-234.plc2.org', 'n2-235.plc2.org', 'n2-236.plc2.org'] +01:== added in slice onecdf_slice235 foreign ['n2-235.plc2.org', 'n2-236.plc2.org', 'n2-237.plc2.org'] +01:== added in slice onecdg_slice236 foreign ['n2-236.plc2.org', 'n2-237.plc2.org', 'n2-238.plc2.org'] +01:== added in slice onecdh_slice237 foreign ['n2-237.plc2.org', 'n2-238.plc2.org', 'n2-239.plc2.org'] +01:== added in slice onecdi_slice238 foreign ['n2-238.plc2.org', 'n2-239.plc2.org', 'n2-240.plc2.org'] +01:== added in slice onecdj_slice239 foreign ['n2-239.plc2.org', 'n2-240.plc2.org', 'n2-241.plc2.org'] +01:== added in slice onecea_slice240 foreign ['n2-240.plc2.org', 'n2-241.plc2.org', 'n2-242.plc2.org'] +01:== added in slice oneceb_slice241 foreign ['n2-241.plc2.org', 'n2-242.plc2.org', 'n2-243.plc2.org'] +01:== added in slice onecec_slice242 foreign ['n2-242.plc2.org', 'n2-243.plc2.org', 'n2-244.plc2.org'] +01:== added in slice oneced_slice243 foreign ['n2-243.plc2.org', 'n2-244.plc2.org', 'n2-245.plc2.org'] +01:== added in slice onecee_slice244 foreign ['n2-244.plc2.org', 'n2-245.plc2.org', 'n2-246.plc2.org'] +01:== added in slice onecef_slice245 foreign ['n2-245.plc2.org', 'n2-246.plc2.org', 'n2-247.plc2.org'] +01:== added in slice oneceg_slice246 foreign ['n2-246.plc2.org', 'n2-247.plc2.org', 'n2-248.plc2.org'] +01:== added in slice oneceh_slice247 foreign ['n2-247.plc2.org', 'n2-248.plc2.org', 'n2-249.plc2.org'] +01:== added in slice onecei_slice248 foreign ['n2-248.plc2.org', 'n2-249.plc2.org', 'n2-250.plc2.org'] +01:== added in slice onecej_slice249 foreign ['n2-249.plc2.org', 'n2-250.plc2.org', 'n2-251.plc2.org'] +01:== added in slice onecfa_slice250 foreign ['n2-250.plc2.org', 'n2-251.plc2.org', 'n2-252.plc2.org'] +01:== added in slice onecfb_slice251 foreign ['n2-251.plc2.org', 'n2-252.plc2.org', 'n2-253.plc2.org'] +01:== added in slice onecfc_slice252 foreign ['n2-252.plc2.org', 'n2-253.plc2.org', 'n2-254.plc2.org'] +01:== added in slice onecfd_slice253 foreign ['n2-253.plc2.org', 'n2-254.plc2.org', 'n2-255.plc2.org'] +01:== added in slice onecfe_slice254 foreign ['n2-254.plc2.org', 'n2-255.plc2.org', 'n2-256.plc2.org'] +01:== added in slice onecff_slice255 foreign ['n2-255.plc2.org', 'n2-256.plc2.org', 'n2-257.plc2.org'] +01:== added in slice onecfg_slice256 foreign ['n2-256.plc2.org', 'n2-257.plc2.org', 'n2-258.plc2.org'] +01:== added in slice onecfh_slice257 foreign ['n2-257.plc2.org', 'n2-258.plc2.org', 'n2-259.plc2.org'] +01:== added in slice onecfi_slice258 foreign ['n2-258.plc2.org', 'n2-259.plc2.org', 'n2-260.plc2.org'] +01:== added in slice onecfj_slice259 foreign ['n2-259.plc2.org', 'n2-260.plc2.org', 'n2-261.plc2.org'] +01:== added in slice onecga_slice260 foreign ['n2-260.plc2.org', 'n2-261.plc2.org', 'n2-262.plc2.org'] +01:== added in slice onecgb_slice261 foreign ['n2-261.plc2.org', 'n2-262.plc2.org', 'n2-263.plc2.org'] +01:== added in slice onecgc_slice262 foreign ['n2-262.plc2.org', 'n2-263.plc2.org', 'n2-264.plc2.org'] +01:== added in slice onecgd_slice263 foreign ['n2-263.plc2.org', 'n2-264.plc2.org', 'n2-265.plc2.org'] +01:== added in slice onecge_slice264 foreign ['n2-264.plc2.org', 'n2-265.plc2.org', 'n2-266.plc2.org'] +01:== added in slice onecgf_slice265 foreign ['n2-265.plc2.org', 'n2-266.plc2.org', 'n2-267.plc2.org'] +01:== added in slice onecgg_slice266 foreign ['n2-266.plc2.org', 'n2-267.plc2.org', 'n2-268.plc2.org'] +01:== added in slice onecgh_slice267 foreign ['n2-267.plc2.org', 'n2-268.plc2.org', 'n2-269.plc2.org'] +01:== added in slice onecgi_slice268 foreign ['n2-268.plc2.org', 'n2-269.plc2.org', 'n2-270.plc2.org'] +01:== added in slice onecgj_slice269 foreign ['n2-269.plc2.org', 'n2-270.plc2.org', 'n2-271.plc2.org'] +01:== added in slice onecha_slice270 foreign ['n2-270.plc2.org', 'n2-271.plc2.org', 'n2-272.plc2.org'] +01:== added in slice onechb_slice271 foreign ['n2-271.plc2.org', 'n2-272.plc2.org', 'n2-273.plc2.org'] +01:== added in slice onechc_slice272 foreign ['n2-272.plc2.org', 'n2-273.plc2.org', 'n2-274.plc2.org'] +01:== added in slice onechd_slice273 foreign ['n2-273.plc2.org', 'n2-274.plc2.org', 'n2-275.plc2.org'] +01:== added in slice oneche_slice274 foreign ['n2-274.plc2.org', 'n2-275.plc2.org', 'n2-276.plc2.org'] +01:== added in slice onechf_slice275 foreign ['n2-275.plc2.org', 'n2-276.plc2.org', 'n2-277.plc2.org'] +01:== added in slice onechg_slice276 foreign ['n2-276.plc2.org', 'n2-277.plc2.org', 'n2-278.plc2.org'] +01:== added in slice onechh_slice277 foreign ['n2-277.plc2.org', 'n2-278.plc2.org', 'n2-279.plc2.org'] +01:== added in slice onechi_slice278 foreign ['n2-278.plc2.org', 'n2-279.plc2.org', 'n2-280.plc2.org'] +01:== added in slice onechj_slice279 foreign ['n2-279.plc2.org', 'n2-280.plc2.org', 'n2-281.plc2.org'] +01:== added in slice onecia_slice280 foreign ['n2-280.plc2.org', 'n2-281.plc2.org', 'n2-282.plc2.org'] +01:== added in slice onecib_slice281 foreign ['n2-281.plc2.org', 'n2-282.plc2.org', 'n2-283.plc2.org'] +01:== added in slice onecic_slice282 foreign ['n2-282.plc2.org', 'n2-283.plc2.org', 'n2-284.plc2.org'] +01:== added in slice onecid_slice283 foreign ['n2-283.plc2.org', 'n2-284.plc2.org', 'n2-285.plc2.org'] +01:== added in slice onecie_slice284 foreign ['n2-284.plc2.org', 'n2-285.plc2.org', 'n2-286.plc2.org'] +01:== added in slice onecif_slice285 foreign ['n2-285.plc2.org', 'n2-286.plc2.org', 'n2-287.plc2.org'] +01:== added in slice onecig_slice286 foreign ['n2-286.plc2.org', 'n2-287.plc2.org', 'n2-288.plc2.org'] +01:== added in slice onecih_slice287 foreign ['n2-287.plc2.org', 'n2-288.plc2.org', 'n2-289.plc2.org'] +01:== added in slice onecii_slice288 foreign ['n2-288.plc2.org', 'n2-289.plc2.org', 'n2-290.plc2.org'] +01:== added in slice onecij_slice289 foreign ['n2-289.plc2.org', 'n2-290.plc2.org', 'n2-291.plc2.org'] +01:== added in slice onecja_slice290 foreign ['n2-290.plc2.org', 'n2-291.plc2.org', 'n2-292.plc2.org'] +01:== added in slice onecjb_slice291 foreign ['n2-291.plc2.org', 'n2-292.plc2.org', 'n2-293.plc2.org'] +01:== added in slice onecjc_slice292 foreign ['n2-292.plc2.org', 'n2-293.plc2.org', 'n2-294.plc2.org'] +01:== added in slice onecjd_slice293 foreign ['n2-293.plc2.org', 'n2-294.plc2.org', 'n2-295.plc2.org'] +01:== added in slice onecje_slice294 foreign ['n2-294.plc2.org', 'n2-295.plc2.org', 'n2-296.plc2.org'] +01:== added in slice onecjf_slice295 foreign ['n2-295.plc2.org', 'n2-296.plc2.org', 'n2-297.plc2.org'] +01:== added in slice onecjg_slice296 foreign ['n2-296.plc2.org', 'n2-297.plc2.org', 'n2-298.plc2.org'] +01:== added in slice onecjh_slice297 foreign ['n2-297.plc2.org', 'n2-298.plc2.org', 'n2-299.plc2.org'] +01:== added in slice onecji_slice298 foreign ['n2-298.plc2.org', 'n2-299.plc2.org', 'n2-300.plc2.org'] +01:== added in slice onecjj_slice299 foreign ['n2-299.plc2.org', 'n2-300.plc2.org', 'n2-301.plc2.org'] +01:== added in slice onedaa_slice300 foreign ['n2-300.plc2.org', 'n2-301.plc2.org', 'n2-302.plc2.org'] +01:== added in slice onedab_slice301 foreign ['n2-301.plc2.org', 'n2-302.plc2.org', 'n2-303.plc2.org'] +01:== added in slice onedac_slice302 foreign ['n2-302.plc2.org', 'n2-303.plc2.org', 'n2-304.plc2.org'] +01:== added in slice onedad_slice303 foreign ['n2-303.plc2.org', 'n2-304.plc2.org', 'n2-305.plc2.org'] +01:== added in slice onedae_slice304 foreign ['n2-304.plc2.org', 'n2-305.plc2.org', 'n2-306.plc2.org'] +01:== added in slice onedaf_slice305 foreign ['n2-305.plc2.org', 'n2-306.plc2.org', 'n2-307.plc2.org'] +01:== added in slice onedag_slice306 foreign ['n2-306.plc2.org', 'n2-307.plc2.org', 'n2-308.plc2.org'] +01:== added in slice onedah_slice307 foreign ['n2-307.plc2.org', 'n2-308.plc2.org', 'n2-309.plc2.org'] +01:== added in slice onedai_slice308 foreign ['n2-308.plc2.org', 'n2-309.plc2.org', 'n2-310.plc2.org'] +01:== added in slice onedaj_slice309 foreign ['n2-309.plc2.org', 'n2-310.plc2.org', 'n2-311.plc2.org'] +01:== added in slice onedba_slice310 foreign ['n2-310.plc2.org', 'n2-311.plc2.org', 'n2-312.plc2.org'] +01:== added in slice onedbb_slice311 foreign ['n2-311.plc2.org', 'n2-312.plc2.org', 'n2-313.plc2.org'] +01:== added in slice onedbc_slice312 foreign ['n2-312.plc2.org', 'n2-313.plc2.org', 'n2-314.plc2.org'] +01:== added in slice onedbd_slice313 foreign ['n2-313.plc2.org', 'n2-314.plc2.org', 'n2-315.plc2.org'] +01:== added in slice onedbe_slice314 foreign ['n2-314.plc2.org', 'n2-315.plc2.org', 'n2-316.plc2.org'] +01:== added in slice onedbf_slice315 foreign ['n2-315.plc2.org', 'n2-316.plc2.org', 'n2-317.plc2.org'] +01:== added in slice onedbg_slice316 foreign ['n2-316.plc2.org', 'n2-317.plc2.org', 'n2-318.plc2.org'] +01:== added in slice onedbh_slice317 foreign ['n2-317.plc2.org', 'n2-318.plc2.org', 'n2-319.plc2.org'] +01:== added in slice onedbi_slice318 foreign ['n2-318.plc2.org', 'n2-319.plc2.org', 'n2-320.plc2.org'] +01:== added in slice onedbj_slice319 foreign ['n2-319.plc2.org', 'n2-320.plc2.org', 'n2-321.plc2.org'] +01:== added in slice onedca_slice320 foreign ['n2-320.plc2.org', 'n2-321.plc2.org', 'n2-322.plc2.org'] +01:== added in slice onedcb_slice321 foreign ['n2-321.plc2.org', 'n2-322.plc2.org', 'n2-323.plc2.org'] +01:== added in slice onedcc_slice322 foreign ['n2-322.plc2.org', 'n2-323.plc2.org', 'n2-324.plc2.org'] +01:== added in slice onedcd_slice323 foreign ['n2-323.plc2.org', 'n2-324.plc2.org', 'n2-325.plc2.org'] +01:== added in slice onedce_slice324 foreign ['n2-324.plc2.org', 'n2-325.plc2.org', 'n2-326.plc2.org'] +01:== added in slice onedcf_slice325 foreign ['n2-325.plc2.org', 'n2-326.plc2.org', 'n2-327.plc2.org'] +01:== added in slice onedcg_slice326 foreign ['n2-326.plc2.org', 'n2-327.plc2.org', 'n2-328.plc2.org'] +01:== added in slice onedch_slice327 foreign ['n2-327.plc2.org', 'n2-328.plc2.org', 'n2-329.plc2.org'] +01:== added in slice onedci_slice328 foreign ['n2-328.plc2.org', 'n2-329.plc2.org', 'n2-330.plc2.org'] +01:== added in slice onedcj_slice329 foreign ['n2-329.plc2.org', 'n2-330.plc2.org', 'n2-331.plc2.org'] +01:== added in slice onedda_slice330 foreign ['n2-330.plc2.org', 'n2-331.plc2.org', 'n2-332.plc2.org'] +01:== added in slice oneddb_slice331 foreign ['n2-331.plc2.org', 'n2-332.plc2.org', 'n2-333.plc2.org'] +01:== added in slice oneddc_slice332 foreign ['n2-332.plc2.org', 'n2-333.plc2.org', 'n2-334.plc2.org'] +01:== added in slice oneddd_slice333 foreign ['n2-333.plc2.org', 'n2-334.plc2.org', 'n2-335.plc2.org'] +01:== added in slice onedde_slice334 foreign ['n2-334.plc2.org', 'n2-335.plc2.org', 'n2-336.plc2.org'] +01:== added in slice oneddf_slice335 foreign ['n2-335.plc2.org', 'n2-336.plc2.org', 'n2-337.plc2.org'] +01:== added in slice oneddg_slice336 foreign ['n2-336.plc2.org', 'n2-337.plc2.org', 'n2-338.plc2.org'] +01:== added in slice oneddh_slice337 foreign ['n2-337.plc2.org', 'n2-338.plc2.org', 'n2-339.plc2.org'] +01:== added in slice oneddi_slice338 foreign ['n2-338.plc2.org', 'n2-339.plc2.org', 'n2-340.plc2.org'] +01:== added in slice oneddj_slice339 foreign ['n2-339.plc2.org', 'n2-340.plc2.org', 'n2-341.plc2.org'] +01:== added in slice onedea_slice340 foreign ['n2-340.plc2.org', 'n2-341.plc2.org', 'n2-342.plc2.org'] +01:== added in slice onedeb_slice341 foreign ['n2-341.plc2.org', 'n2-342.plc2.org', 'n2-343.plc2.org'] +01:== added in slice onedec_slice342 foreign ['n2-342.plc2.org', 'n2-343.plc2.org', 'n2-344.plc2.org'] +01:== added in slice oneded_slice343 foreign ['n2-343.plc2.org', 'n2-344.plc2.org', 'n2-345.plc2.org'] +01:== added in slice onedee_slice344 foreign ['n2-344.plc2.org', 'n2-345.plc2.org', 'n2-346.plc2.org'] +01:== added in slice onedef_slice345 foreign ['n2-345.plc2.org', 'n2-346.plc2.org', 'n2-347.plc2.org'] +01:== added in slice onedeg_slice346 foreign ['n2-346.plc2.org', 'n2-347.plc2.org', 'n2-348.plc2.org'] +01:== added in slice onedeh_slice347 foreign ['n2-347.plc2.org', 'n2-348.plc2.org', 'n2-349.plc2.org'] +01:== added in slice onedei_slice348 foreign ['n2-348.plc2.org', 'n2-349.plc2.org', 'n2-350.plc2.org'] +01:== added in slice onedej_slice349 foreign ['n2-349.plc2.org', 'n2-350.plc2.org', 'n2-351.plc2.org'] +01:== added in slice onedfa_slice350 foreign ['n2-350.plc2.org', 'n2-351.plc2.org', 'n2-352.plc2.org'] +01:== added in slice onedfb_slice351 foreign ['n2-351.plc2.org', 'n2-352.plc2.org', 'n2-353.plc2.org'] +01:== added in slice onedfc_slice352 foreign ['n2-352.plc2.org', 'n2-353.plc2.org', 'n2-354.plc2.org'] +01:== added in slice onedfd_slice353 foreign ['n2-353.plc2.org', 'n2-354.plc2.org', 'n2-355.plc2.org'] +01:== added in slice onedfe_slice354 foreign ['n2-354.plc2.org', 'n2-355.plc2.org', 'n2-356.plc2.org'] +01:== added in slice onedff_slice355 foreign ['n2-355.plc2.org', 'n2-356.plc2.org', 'n2-357.plc2.org'] +01:== added in slice onedfg_slice356 foreign ['n2-356.plc2.org', 'n2-357.plc2.org', 'n2-358.plc2.org'] +01:== added in slice onedfh_slice357 foreign ['n2-357.plc2.org', 'n2-358.plc2.org', 'n2-359.plc2.org'] +01:== added in slice onedfi_slice358 foreign ['n2-358.plc2.org', 'n2-359.plc2.org', 'n2-360.plc2.org'] +01:== added in slice onedfj_slice359 foreign ['n2-359.plc2.org', 'n2-360.plc2.org', 'n2-361.plc2.org'] +01:== added in slice onedga_slice360 foreign ['n2-360.plc2.org', 'n2-361.plc2.org', 'n2-362.plc2.org'] +01:== added in slice onedgb_slice361 foreign ['n2-361.plc2.org', 'n2-362.plc2.org', 'n2-363.plc2.org'] +01:== added in slice onedgc_slice362 foreign ['n2-362.plc2.org', 'n2-363.plc2.org', 'n2-364.plc2.org'] +01:== added in slice onedgd_slice363 foreign ['n2-363.plc2.org', 'n2-364.plc2.org', 'n2-365.plc2.org'] +01:== added in slice onedge_slice364 foreign ['n2-364.plc2.org', 'n2-365.plc2.org', 'n2-366.plc2.org'] +01:== added in slice onedgf_slice365 foreign ['n2-365.plc2.org', 'n2-366.plc2.org', 'n2-367.plc2.org'] +01:== added in slice onedgg_slice366 foreign ['n2-366.plc2.org', 'n2-367.plc2.org', 'n2-368.plc2.org'] +01:== added in slice onedgh_slice367 foreign ['n2-367.plc2.org', 'n2-368.plc2.org', 'n2-369.plc2.org'] +01:== added in slice onedgi_slice368 foreign ['n2-368.plc2.org', 'n2-369.plc2.org', 'n2-370.plc2.org'] +01:== added in slice onedgj_slice369 foreign ['n2-369.plc2.org', 'n2-370.plc2.org', 'n2-371.plc2.org'] +01:== added in slice onedha_slice370 foreign ['n2-370.plc2.org', 'n2-371.plc2.org', 'n2-372.plc2.org'] +01:== added in slice onedhb_slice371 foreign ['n2-371.plc2.org', 'n2-372.plc2.org', 'n2-373.plc2.org'] +01:== added in slice onedhc_slice372 foreign ['n2-372.plc2.org', 'n2-373.plc2.org', 'n2-374.plc2.org'] +01:== added in slice onedhd_slice373 foreign ['n2-373.plc2.org', 'n2-374.plc2.org', 'n2-375.plc2.org'] +01:== added in slice onedhe_slice374 foreign ['n2-374.plc2.org', 'n2-375.plc2.org', 'n2-376.plc2.org'] +01:== added in slice onedhf_slice375 foreign ['n2-375.plc2.org', 'n2-376.plc2.org', 'n2-377.plc2.org'] +01:== added in slice onedhg_slice376 foreign ['n2-376.plc2.org', 'n2-377.plc2.org', 'n2-378.plc2.org'] +01:== added in slice onedhh_slice377 foreign ['n2-377.plc2.org', 'n2-378.plc2.org', 'n2-379.plc2.org'] +01:== added in slice onedhi_slice378 foreign ['n2-378.plc2.org', 'n2-379.plc2.org', 'n2-380.plc2.org'] +01:== added in slice onedhj_slice379 foreign ['n2-379.plc2.org', 'n2-380.plc2.org', 'n2-381.plc2.org'] +01:== added in slice onedia_slice380 foreign ['n2-380.plc2.org', 'n2-381.plc2.org', 'n2-382.plc2.org'] +01:== added in slice onedib_slice381 foreign ['n2-381.plc2.org', 'n2-382.plc2.org', 'n2-383.plc2.org'] +01:== added in slice onedic_slice382 foreign ['n2-382.plc2.org', 'n2-383.plc2.org', 'n2-384.plc2.org'] +01:== added in slice onedid_slice383 foreign ['n2-383.plc2.org', 'n2-384.plc2.org', 'n2-385.plc2.org'] +01:== added in slice onedie_slice384 foreign ['n2-384.plc2.org', 'n2-385.plc2.org', 'n2-386.plc2.org'] +01:== added in slice onedif_slice385 foreign ['n2-385.plc2.org', 'n2-386.plc2.org', 'n2-387.plc2.org'] +01:== added in slice onedig_slice386 foreign ['n2-386.plc2.org', 'n2-387.plc2.org', 'n2-388.plc2.org'] +01:== added in slice onedih_slice387 foreign ['n2-387.plc2.org', 'n2-388.plc2.org', 'n2-389.plc2.org'] +01:== added in slice onedii_slice388 foreign ['n2-388.plc2.org', 'n2-389.plc2.org', 'n2-390.plc2.org'] +01:== added in slice onedij_slice389 foreign ['n2-389.plc2.org', 'n2-390.plc2.org', 'n2-391.plc2.org'] +01:== added in slice onedja_slice390 foreign ['n2-390.plc2.org', 'n2-391.plc2.org', 'n2-392.plc2.org'] +01:== added in slice onedjb_slice391 foreign ['n2-391.plc2.org', 'n2-392.plc2.org', 'n2-393.plc2.org'] +01:== added in slice onedjc_slice392 foreign ['n2-392.plc2.org', 'n2-393.plc2.org', 'n2-394.plc2.org'] +01:== added in slice onedjd_slice393 foreign ['n2-393.plc2.org', 'n2-394.plc2.org', 'n2-395.plc2.org'] +01:== added in slice onedje_slice394 foreign ['n2-394.plc2.org', 'n2-395.plc2.org', 'n2-396.plc2.org'] +01:== added in slice onedjf_slice395 foreign ['n2-395.plc2.org', 'n2-396.plc2.org', 'n2-397.plc2.org'] +01:== added in slice onedjg_slice396 foreign ['n2-396.plc2.org', 'n2-397.plc2.org', 'n2-398.plc2.org'] +01:== added in slice onedjh_slice397 foreign ['n2-397.plc2.org', 'n2-398.plc2.org', 'n2-399.plc2.org'] +01:== added in slice onedji_slice398 foreign ['n2-398.plc2.org', 'n2-399.plc2.org', 'n2-400.plc2.org'] +01:== added in slice onedjj_slice399 foreign ['n2-399.plc2.org', 'n2-400.plc2.org', 'n2-401.plc2.org'] +01:== added in slice oneeaa_slice400 foreign ['n2-400.plc2.org', 'n2-401.plc2.org', 'n2-402.plc2.org'] +01:== added in slice oneeab_slice401 foreign ['n2-401.plc2.org', 'n2-402.plc2.org', 'n2-403.plc2.org'] +01:== added in slice oneeac_slice402 foreign ['n2-402.plc2.org', 'n2-403.plc2.org', 'n2-404.plc2.org'] +01:== added in slice oneead_slice403 foreign ['n2-403.plc2.org', 'n2-404.plc2.org', 'n2-405.plc2.org'] +01:== added in slice oneeae_slice404 foreign ['n2-404.plc2.org', 'n2-405.plc2.org', 'n2-406.plc2.org'] +01:== added in slice oneeaf_slice405 foreign ['n2-405.plc2.org', 'n2-406.plc2.org', 'n2-407.plc2.org'] +01:== added in slice oneeag_slice406 foreign ['n2-406.plc2.org', 'n2-407.plc2.org', 'n2-408.plc2.org'] +01:== added in slice oneeah_slice407 foreign ['n2-407.plc2.org', 'n2-408.plc2.org', 'n2-409.plc2.org'] +01:== added in slice oneeai_slice408 foreign ['n2-408.plc2.org', 'n2-409.plc2.org', 'n2-410.plc2.org'] +01:== added in slice oneeaj_slice409 foreign ['n2-409.plc2.org', 'n2-410.plc2.org', 'n2-411.plc2.org'] +01:== added in slice oneeba_slice410 foreign ['n2-410.plc2.org', 'n2-411.plc2.org', 'n2-412.plc2.org'] +01:== added in slice oneebb_slice411 foreign ['n2-411.plc2.org', 'n2-412.plc2.org', 'n2-413.plc2.org'] +01:== added in slice oneebc_slice412 foreign ['n2-412.plc2.org', 'n2-413.plc2.org', 'n2-414.plc2.org'] +01:== added in slice oneebd_slice413 foreign ['n2-413.plc2.org', 'n2-414.plc2.org', 'n2-415.plc2.org'] +01:== added in slice oneebe_slice414 foreign ['n2-414.plc2.org', 'n2-415.plc2.org', 'n2-416.plc2.org'] +01:== added in slice oneebf_slice415 foreign ['n2-415.plc2.org', 'n2-416.plc2.org', 'n2-417.plc2.org'] +01:== added in slice oneebg_slice416 foreign ['n2-416.plc2.org', 'n2-417.plc2.org', 'n2-418.plc2.org'] +01:== added in slice oneebh_slice417 foreign ['n2-417.plc2.org', 'n2-418.plc2.org', 'n2-419.plc2.org'] +01:== added in slice oneebi_slice418 foreign ['n2-418.plc2.org', 'n2-419.plc2.org', 'n2-420.plc2.org'] +01:== added in slice oneebj_slice419 foreign ['n2-419.plc2.org', 'n2-420.plc2.org', 'n2-421.plc2.org'] +01:== added in slice oneeca_slice420 foreign ['n2-420.plc2.org', 'n2-421.plc2.org', 'n2-422.plc2.org'] +01:== added in slice oneecb_slice421 foreign ['n2-421.plc2.org', 'n2-422.plc2.org', 'n2-423.plc2.org'] +01:== added in slice oneecc_slice422 foreign ['n2-422.plc2.org', 'n2-423.plc2.org', 'n2-424.plc2.org'] +01:== added in slice oneecd_slice423 foreign ['n2-423.plc2.org', 'n2-424.plc2.org', 'n2-425.plc2.org'] +01:== added in slice oneece_slice424 foreign ['n2-424.plc2.org', 'n2-425.plc2.org', 'n2-426.plc2.org'] +01:== added in slice oneecf_slice425 foreign ['n2-425.plc2.org', 'n2-426.plc2.org', 'n2-427.plc2.org'] +01:== added in slice oneecg_slice426 foreign ['n2-426.plc2.org', 'n2-427.plc2.org', 'n2-428.plc2.org'] +01:== added in slice oneech_slice427 foreign ['n2-427.plc2.org', 'n2-428.plc2.org', 'n2-429.plc2.org'] +01:== added in slice oneeci_slice428 foreign ['n2-428.plc2.org', 'n2-429.plc2.org', 'n2-430.plc2.org'] +01:== added in slice oneecj_slice429 foreign ['n2-429.plc2.org', 'n2-430.plc2.org', 'n2-431.plc2.org'] +01:== added in slice oneeda_slice430 foreign ['n2-430.plc2.org', 'n2-431.plc2.org', 'n2-432.plc2.org'] +01:== added in slice oneedb_slice431 foreign ['n2-431.plc2.org', 'n2-432.plc2.org', 'n2-433.plc2.org'] +01:== added in slice oneedc_slice432 foreign ['n2-432.plc2.org', 'n2-433.plc2.org', 'n2-434.plc2.org'] +01:== added in slice oneedd_slice433 foreign ['n2-433.plc2.org', 'n2-434.plc2.org', 'n2-435.plc2.org'] +01:== added in slice oneede_slice434 foreign ['n2-434.plc2.org', 'n2-435.plc2.org', 'n2-436.plc2.org'] +01:== added in slice oneedf_slice435 foreign ['n2-435.plc2.org', 'n2-436.plc2.org', 'n2-437.plc2.org'] +01:== added in slice oneedg_slice436 foreign ['n2-436.plc2.org', 'n2-437.plc2.org', 'n2-438.plc2.org'] +01:== added in slice oneedh_slice437 foreign ['n2-437.plc2.org', 'n2-438.plc2.org', 'n2-439.plc2.org'] +01:== added in slice oneedi_slice438 foreign ['n2-438.plc2.org', 'n2-439.plc2.org', 'n2-440.plc2.org'] +01:== added in slice oneedj_slice439 foreign ['n2-439.plc2.org', 'n2-440.plc2.org', 'n2-441.plc2.org'] +01:== added in slice oneeea_slice440 foreign ['n2-440.plc2.org', 'n2-441.plc2.org', 'n2-442.plc2.org'] +01:== added in slice oneeeb_slice441 foreign ['n2-441.plc2.org', 'n2-442.plc2.org', 'n2-443.plc2.org'] +01:== added in slice oneeec_slice442 foreign ['n2-442.plc2.org', 'n2-443.plc2.org', 'n2-444.plc2.org'] +01:== added in slice oneeed_slice443 foreign ['n2-443.plc2.org', 'n2-444.plc2.org', 'n2-445.plc2.org'] +01:== added in slice oneeee_slice444 foreign ['n2-444.plc2.org', 'n2-445.plc2.org', 'n2-446.plc2.org'] +01:== added in slice oneeef_slice445 foreign ['n2-445.plc2.org', 'n2-446.plc2.org', 'n2-447.plc2.org'] +01:== added in slice oneeeg_slice446 foreign ['n2-446.plc2.org', 'n2-447.plc2.org', 'n2-448.plc2.org'] +01:== added in slice oneeeh_slice447 foreign ['n2-447.plc2.org', 'n2-448.plc2.org', 'n2-449.plc2.org'] +01:== added in slice oneeei_slice448 foreign ['n2-448.plc2.org', 'n2-449.plc2.org', 'n2-450.plc2.org'] +01:== added in slice oneeej_slice449 foreign ['n2-449.plc2.org', 'n2-450.plc2.org', 'n2-451.plc2.org'] +01:== added in slice oneefa_slice450 foreign ['n2-450.plc2.org', 'n2-451.plc2.org', 'n2-452.plc2.org'] +01:== added in slice oneefb_slice451 foreign ['n2-451.plc2.org', 'n2-452.plc2.org', 'n2-453.plc2.org'] +01:== added in slice oneefc_slice452 foreign ['n2-452.plc2.org', 'n2-453.plc2.org', 'n2-454.plc2.org'] +01:== added in slice oneefd_slice453 foreign ['n2-453.plc2.org', 'n2-454.plc2.org', 'n2-455.plc2.org'] +01:== added in slice oneefe_slice454 foreign ['n2-454.plc2.org', 'n2-455.plc2.org', 'n2-456.plc2.org'] +01:== added in slice oneeff_slice455 foreign ['n2-455.plc2.org', 'n2-456.plc2.org', 'n2-457.plc2.org'] +01:== added in slice oneefg_slice456 foreign ['n2-456.plc2.org', 'n2-457.plc2.org', 'n2-458.plc2.org'] +01:== added in slice oneefh_slice457 foreign ['n2-457.plc2.org', 'n2-458.plc2.org', 'n2-459.plc2.org'] +01:== added in slice oneefi_slice458 foreign ['n2-458.plc2.org', 'n2-459.plc2.org', 'n2-460.plc2.org'] +01:== added in slice oneefj_slice459 foreign ['n2-459.plc2.org', 'n2-460.plc2.org', 'n2-461.plc2.org'] +01:== added in slice oneega_slice460 foreign ['n2-460.plc2.org', 'n2-461.plc2.org', 'n2-462.plc2.org'] +01:== added in slice oneegb_slice461 foreign ['n2-461.plc2.org', 'n2-462.plc2.org', 'n2-463.plc2.org'] +01:== added in slice oneegc_slice462 foreign ['n2-462.plc2.org', 'n2-463.plc2.org', 'n2-464.plc2.org'] +01:== added in slice oneegd_slice463 foreign ['n2-463.plc2.org', 'n2-464.plc2.org', 'n2-465.plc2.org'] +01:== added in slice oneege_slice464 foreign ['n2-464.plc2.org', 'n2-465.plc2.org', 'n2-466.plc2.org'] +01:== added in slice oneegf_slice465 foreign ['n2-465.plc2.org', 'n2-466.plc2.org', 'n2-467.plc2.org'] +01:== added in slice oneegg_slice466 foreign ['n2-466.plc2.org', 'n2-467.plc2.org', 'n2-468.plc2.org'] +01:== added in slice oneegh_slice467 foreign ['n2-467.plc2.org', 'n2-468.plc2.org', 'n2-469.plc2.org'] +01:== added in slice oneegi_slice468 foreign ['n2-468.plc2.org', 'n2-469.plc2.org', 'n2-470.plc2.org'] +01:== added in slice oneegj_slice469 foreign ['n2-469.plc2.org', 'n2-470.plc2.org', 'n2-471.plc2.org'] +01:== added in slice oneeha_slice470 foreign ['n2-470.plc2.org', 'n2-471.plc2.org', 'n2-472.plc2.org'] +01:== added in slice oneehb_slice471 foreign ['n2-471.plc2.org', 'n2-472.plc2.org', 'n2-473.plc2.org'] +01:== added in slice oneehc_slice472 foreign ['n2-472.plc2.org', 'n2-473.plc2.org', 'n2-474.plc2.org'] +01:== added in slice oneehd_slice473 foreign ['n2-473.plc2.org', 'n2-474.plc2.org', 'n2-475.plc2.org'] +01:== added in slice oneehe_slice474 foreign ['n2-474.plc2.org', 'n2-475.plc2.org', 'n2-476.plc2.org'] +01:== added in slice oneehf_slice475 foreign ['n2-475.plc2.org', 'n2-476.plc2.org', 'n2-477.plc2.org'] +01:== added in slice oneehg_slice476 foreign ['n2-476.plc2.org', 'n2-477.plc2.org', 'n2-478.plc2.org'] +01:== added in slice oneehh_slice477 foreign ['n2-477.plc2.org', 'n2-478.plc2.org', 'n2-479.plc2.org'] +01:== added in slice oneehi_slice478 foreign ['n2-478.plc2.org', 'n2-479.plc2.org', 'n2-480.plc2.org'] +01:== added in slice oneehj_slice479 foreign ['n2-479.plc2.org', 'n2-480.plc2.org', 'n2-481.plc2.org'] +01:== added in slice oneeia_slice480 foreign ['n2-480.plc2.org', 'n2-481.plc2.org', 'n2-482.plc2.org'] +01:== added in slice oneeib_slice481 foreign ['n2-481.plc2.org', 'n2-482.plc2.org', 'n2-483.plc2.org'] +01:== added in slice oneeic_slice482 foreign ['n2-482.plc2.org', 'n2-483.plc2.org', 'n2-484.plc2.org'] +01:== added in slice oneeid_slice483 foreign ['n2-483.plc2.org', 'n2-484.plc2.org', 'n2-485.plc2.org'] +01:== added in slice oneeie_slice484 foreign ['n2-484.plc2.org', 'n2-485.plc2.org', 'n2-486.plc2.org'] +01:== added in slice oneeif_slice485 foreign ['n2-485.plc2.org', 'n2-486.plc2.org', 'n2-487.plc2.org'] +01:== added in slice oneeig_slice486 foreign ['n2-486.plc2.org', 'n2-487.plc2.org', 'n2-488.plc2.org'] +01:== added in slice oneeih_slice487 foreign ['n2-487.plc2.org', 'n2-488.plc2.org', 'n2-489.plc2.org'] +01:== added in slice oneeii_slice488 foreign ['n2-488.plc2.org', 'n2-489.plc2.org', 'n2-490.plc2.org'] +01:== added in slice oneeij_slice489 foreign ['n2-489.plc2.org', 'n2-490.plc2.org', 'n2-491.plc2.org'] +01:== added in slice oneeja_slice490 foreign ['n2-490.plc2.org', 'n2-491.plc2.org', 'n2-492.plc2.org'] +01:== added in slice oneejb_slice491 foreign ['n2-491.plc2.org', 'n2-492.plc2.org', 'n2-493.plc2.org'] +01:== added in slice oneejc_slice492 foreign ['n2-492.plc2.org', 'n2-493.plc2.org', 'n2-494.plc2.org'] +01:== added in slice oneejd_slice493 foreign ['n2-493.plc2.org', 'n2-494.plc2.org', 'n2-495.plc2.org'] +01:== added in slice oneeje_slice494 foreign ['n2-494.plc2.org', 'n2-495.plc2.org', 'n2-496.plc2.org'] +01:== added in slice oneejf_slice495 foreign ['n2-495.plc2.org', 'n2-496.plc2.org', 'n2-497.plc2.org'] +01:== added in slice oneejg_slice496 foreign ['n2-496.plc2.org', 'n2-497.plc2.org', 'n2-498.plc2.org'] +01:== added in slice oneejh_slice497 foreign ['n2-497.plc2.org', 'n2-498.plc2.org', 'n2-499.plc2.org'] +01:== added in slice oneeji_slice498 foreign ['n2-498.plc2.org', 'n2-499.plc2.org', 'n2-500.plc2.org'] +01:== added in slice oneejj_slice499 foreign ['n2-499.plc2.org', 'n2-500.plc2.org', 'n2-501.plc2.org'] +01:== added in slice onefaa_slice500 foreign ['n2-500.plc2.org', 'n2-501.plc2.org', 'n2-502.plc2.org'] +01:== added in slice onefab_slice501 foreign ['n2-501.plc2.org', 'n2-502.plc2.org', 'n2-503.plc2.org'] +01:== added in slice onefac_slice502 foreign ['n2-502.plc2.org', 'n2-503.plc2.org', 'n2-504.plc2.org'] +01:== added in slice onefad_slice503 foreign ['n2-503.plc2.org', 'n2-504.plc2.org', 'n2-505.plc2.org'] +01:== added in slice onefae_slice504 foreign ['n2-504.plc2.org', 'n2-505.plc2.org', 'n2-506.plc2.org'] +01:== added in slice onefaf_slice505 foreign ['n2-505.plc2.org', 'n2-506.plc2.org', 'n2-507.plc2.org'] +01:== added in slice onefag_slice506 foreign ['n2-506.plc2.org', 'n2-507.plc2.org', 'n2-508.plc2.org'] +01:== added in slice onefah_slice507 foreign ['n2-507.plc2.org', 'n2-508.plc2.org', 'n2-509.plc2.org'] +01:== added in slice onefai_slice508 foreign ['n2-508.plc2.org', 'n2-509.plc2.org', 'n2-510.plc2.org'] +01:== added in slice onefaj_slice509 foreign ['n2-509.plc2.org', 'n2-510.plc2.org', 'n2-511.plc2.org'] +01:== added in slice onefba_slice510 foreign ['n2-510.plc2.org', 'n2-511.plc2.org', 'n2-512.plc2.org'] +01:== added in slice onefbb_slice511 foreign ['n2-511.plc2.org', 'n2-512.plc2.org', 'n2-513.plc2.org'] +01:== added in slice onefbc_slice512 foreign ['n2-512.plc2.org', 'n2-513.plc2.org', 'n2-514.plc2.org'] +01:== added in slice onefbd_slice513 foreign ['n2-513.plc2.org', 'n2-514.plc2.org', 'n2-515.plc2.org'] +01:== added in slice onefbe_slice514 foreign ['n2-514.plc2.org', 'n2-515.plc2.org', 'n2-516.plc2.org'] +01:== added in slice onefbf_slice515 foreign ['n2-515.plc2.org', 'n2-516.plc2.org', 'n2-517.plc2.org'] +01:== added in slice onefbg_slice516 foreign ['n2-516.plc2.org', 'n2-517.plc2.org', 'n2-518.plc2.org'] +01:== added in slice onefbh_slice517 foreign ['n2-517.plc2.org', 'n2-518.plc2.org', 'n2-519.plc2.org'] +01:== added in slice onefbi_slice518 foreign ['n2-518.plc2.org', 'n2-519.plc2.org', 'n2-520.plc2.org'] +01:== added in slice onefbj_slice519 foreign ['n2-519.plc2.org', 'n2-520.plc2.org', 'n2-521.plc2.org'] +01:== added in slice onefca_slice520 foreign ['n2-520.plc2.org', 'n2-521.plc2.org', 'n2-522.plc2.org'] +01:== added in slice onefcb_slice521 foreign ['n2-521.plc2.org', 'n2-522.plc2.org', 'n2-523.plc2.org'] +01:== added in slice onefcc_slice522 foreign ['n2-522.plc2.org', 'n2-523.plc2.org', 'n2-524.plc2.org'] +01:== added in slice onefcd_slice523 foreign ['n2-523.plc2.org', 'n2-524.plc2.org', 'n2-525.plc2.org'] +01:== added in slice onefce_slice524 foreign ['n2-524.plc2.org', 'n2-525.plc2.org', 'n2-526.plc2.org'] +01:== added in slice onefcf_slice525 foreign ['n2-525.plc2.org', 'n2-526.plc2.org', 'n2-527.plc2.org'] +01:== added in slice onefcg_slice526 foreign ['n2-526.plc2.org', 'n2-527.plc2.org', 'n2-528.plc2.org'] +01:== added in slice onefch_slice527 foreign ['n2-527.plc2.org', 'n2-528.plc2.org', 'n2-529.plc2.org'] +01:== added in slice onefci_slice528 foreign ['n2-528.plc2.org', 'n2-529.plc2.org', 'n2-530.plc2.org'] +01:== added in slice onefcj_slice529 foreign ['n2-529.plc2.org', 'n2-530.plc2.org', 'n2-531.plc2.org'] +01:== added in slice onefda_slice530 foreign ['n2-530.plc2.org', 'n2-531.plc2.org', 'n2-532.plc2.org'] +01:== added in slice onefdb_slice531 foreign ['n2-531.plc2.org', 'n2-532.plc2.org', 'n2-533.plc2.org'] +01:== added in slice onefdc_slice532 foreign ['n2-532.plc2.org', 'n2-533.plc2.org', 'n2-534.plc2.org'] +01:== added in slice onefdd_slice533 foreign ['n2-533.plc2.org', 'n2-534.plc2.org', 'n2-535.plc2.org'] +01:== added in slice onefde_slice534 foreign ['n2-534.plc2.org', 'n2-535.plc2.org', 'n2-536.plc2.org'] +01:== added in slice onefdf_slice535 foreign ['n2-535.plc2.org', 'n2-536.plc2.org', 'n2-537.plc2.org'] +01:== added in slice onefdg_slice536 foreign ['n2-536.plc2.org', 'n2-537.plc2.org', 'n2-538.plc2.org'] +01:== added in slice onefdh_slice537 foreign ['n2-537.plc2.org', 'n2-538.plc2.org', 'n2-539.plc2.org'] +01:== added in slice onefdi_slice538 foreign ['n2-538.plc2.org', 'n2-539.plc2.org', 'n2-540.plc2.org'] +01:== added in slice onefdj_slice539 foreign ['n2-539.plc2.org', 'n2-540.plc2.org', 'n2-541.plc2.org'] +01:== added in slice onefea_slice540 foreign ['n2-540.plc2.org', 'n2-541.plc2.org', 'n2-542.plc2.org'] +01:== added in slice onefeb_slice541 foreign ['n2-541.plc2.org', 'n2-542.plc2.org', 'n2-543.plc2.org'] +01:== added in slice onefec_slice542 foreign ['n2-542.plc2.org', 'n2-543.plc2.org', 'n2-544.plc2.org'] +01:== added in slice onefed_slice543 foreign ['n2-543.plc2.org', 'n2-544.plc2.org', 'n2-545.plc2.org'] +01:== added in slice onefee_slice544 foreign ['n2-544.plc2.org', 'n2-545.plc2.org', 'n2-546.plc2.org'] +01:== added in slice onefef_slice545 foreign ['n2-545.plc2.org', 'n2-546.plc2.org', 'n2-547.plc2.org'] +01:== added in slice onefeg_slice546 foreign ['n2-546.plc2.org', 'n2-547.plc2.org', 'n2-548.plc2.org'] +01:== added in slice onefeh_slice547 foreign ['n2-547.plc2.org', 'n2-548.plc2.org', 'n2-549.plc2.org'] +01:== added in slice onefei_slice548 foreign ['n2-548.plc2.org', 'n2-549.plc2.org', 'n2-550.plc2.org'] +01:== added in slice onefej_slice549 foreign ['n2-549.plc2.org', 'n2-550.plc2.org', 'n2-551.plc2.org'] +01:== added in slice oneffa_slice550 foreign ['n2-550.plc2.org', 'n2-551.plc2.org', 'n2-552.plc2.org'] +01:== added in slice oneffb_slice551 foreign ['n2-551.plc2.org', 'n2-552.plc2.org', 'n2-553.plc2.org'] +01:== added in slice oneffc_slice552 foreign ['n2-552.plc2.org', 'n2-553.plc2.org', 'n2-554.plc2.org'] +01:== added in slice oneffd_slice553 foreign ['n2-553.plc2.org', 'n2-554.plc2.org', 'n2-555.plc2.org'] +01:== added in slice oneffe_slice554 foreign ['n2-554.plc2.org', 'n2-555.plc2.org', 'n2-556.plc2.org'] +01:== added in slice onefff_slice555 foreign ['n2-555.plc2.org', 'n2-556.plc2.org', 'n2-557.plc2.org'] +01:== added in slice oneffg_slice556 foreign ['n2-556.plc2.org', 'n2-557.plc2.org', 'n2-558.plc2.org'] +01:== added in slice oneffh_slice557 foreign ['n2-557.plc2.org', 'n2-558.plc2.org', 'n2-559.plc2.org'] +01:== added in slice oneffi_slice558 foreign ['n2-558.plc2.org', 'n2-559.plc2.org', 'n2-560.plc2.org'] +01:== added in slice oneffj_slice559 foreign ['n2-559.plc2.org', 'n2-560.plc2.org', 'n2-561.plc2.org'] +01:== added in slice onefga_slice560 foreign ['n2-560.plc2.org', 'n2-561.plc2.org', 'n2-562.plc2.org'] +01:== added in slice onefgb_slice561 foreign ['n2-561.plc2.org', 'n2-562.plc2.org', 'n2-563.plc2.org'] +01:== added in slice onefgc_slice562 foreign ['n2-562.plc2.org', 'n2-563.plc2.org', 'n2-564.plc2.org'] +01:== added in slice onefgd_slice563 foreign ['n2-563.plc2.org', 'n2-564.plc2.org', 'n2-565.plc2.org'] +01:== added in slice onefge_slice564 foreign ['n2-564.plc2.org', 'n2-565.plc2.org', 'n2-566.plc2.org'] +01:== added in slice onefgf_slice565 foreign ['n2-565.plc2.org', 'n2-566.plc2.org', 'n2-567.plc2.org'] +01:== added in slice onefgg_slice566 foreign ['n2-566.plc2.org', 'n2-567.plc2.org', 'n2-568.plc2.org'] +01:== added in slice onefgh_slice567 foreign ['n2-567.plc2.org', 'n2-568.plc2.org', 'n2-569.plc2.org'] +01:== added in slice onefgi_slice568 foreign ['n2-568.plc2.org', 'n2-569.plc2.org', 'n2-570.plc2.org'] +01:== added in slice onefgj_slice569 foreign ['n2-569.plc2.org', 'n2-570.plc2.org', 'n2-571.plc2.org'] +01:== added in slice onefha_slice570 foreign ['n2-570.plc2.org', 'n2-571.plc2.org', 'n2-572.plc2.org'] +01:== added in slice onefhb_slice571 foreign ['n2-571.plc2.org', 'n2-572.plc2.org', 'n2-573.plc2.org'] +01:== added in slice onefhc_slice572 foreign ['n2-572.plc2.org', 'n2-573.plc2.org', 'n2-574.plc2.org'] +01:== added in slice onefhd_slice573 foreign ['n2-573.plc2.org', 'n2-574.plc2.org', 'n2-575.plc2.org'] +01:== added in slice onefhe_slice574 foreign ['n2-574.plc2.org', 'n2-575.plc2.org', 'n2-576.plc2.org'] +01:== added in slice onefhf_slice575 foreign ['n2-575.plc2.org', 'n2-576.plc2.org', 'n2-577.plc2.org'] +01:== added in slice onefhg_slice576 foreign ['n2-576.plc2.org', 'n2-577.plc2.org', 'n2-578.plc2.org'] +01:== added in slice onefhh_slice577 foreign ['n2-577.plc2.org', 'n2-578.plc2.org', 'n2-579.plc2.org'] +01:== added in slice onefhi_slice578 foreign ['n2-578.plc2.org', 'n2-579.plc2.org', 'n2-580.plc2.org'] +01:== added in slice onefhj_slice579 foreign ['n2-579.plc2.org', 'n2-580.plc2.org', 'n2-581.plc2.org'] +01:== added in slice onefia_slice580 foreign ['n2-580.plc2.org', 'n2-581.plc2.org', 'n2-582.plc2.org'] +01:== added in slice onefib_slice581 foreign ['n2-581.plc2.org', 'n2-582.plc2.org', 'n2-583.plc2.org'] +01:== added in slice onefic_slice582 foreign ['n2-582.plc2.org', 'n2-583.plc2.org', 'n2-584.plc2.org'] +01:== added in slice onefid_slice583 foreign ['n2-583.plc2.org', 'n2-584.plc2.org', 'n2-585.plc2.org'] +01:== added in slice onefie_slice584 foreign ['n2-584.plc2.org', 'n2-585.plc2.org', 'n2-586.plc2.org'] +01:== added in slice onefif_slice585 foreign ['n2-585.plc2.org', 'n2-586.plc2.org', 'n2-587.plc2.org'] +01:== added in slice onefig_slice586 foreign ['n2-586.plc2.org', 'n2-587.plc2.org', 'n2-588.plc2.org'] +01:== added in slice onefih_slice587 foreign ['n2-587.plc2.org', 'n2-588.plc2.org', 'n2-589.plc2.org'] +01:== added in slice onefii_slice588 foreign ['n2-588.plc2.org', 'n2-589.plc2.org', 'n2-590.plc2.org'] +01:== added in slice onefij_slice589 foreign ['n2-589.plc2.org', 'n2-590.plc2.org', 'n2-591.plc2.org'] +01:== added in slice onefja_slice590 foreign ['n2-590.plc2.org', 'n2-591.plc2.org', 'n2-592.plc2.org'] +01:== added in slice onefjb_slice591 foreign ['n2-591.plc2.org', 'n2-592.plc2.org', 'n2-593.plc2.org'] +01:== added in slice onefjc_slice592 foreign ['n2-592.plc2.org', 'n2-593.plc2.org', 'n2-594.plc2.org'] +01:== added in slice onefjd_slice593 foreign ['n2-593.plc2.org', 'n2-594.plc2.org', 'n2-595.plc2.org'] +01:== added in slice onefje_slice594 foreign ['n2-594.plc2.org', 'n2-595.plc2.org', 'n2-596.plc2.org'] +01:== added in slice onefjf_slice595 foreign ['n2-595.plc2.org', 'n2-596.plc2.org', 'n2-597.plc2.org'] +01:== added in slice onefjg_slice596 foreign ['n2-596.plc2.org', 'n2-597.plc2.org', 'n2-598.plc2.org'] +01:== added in slice onefjh_slice597 foreign ['n2-597.plc2.org', 'n2-598.plc2.org', 'n2-599.plc2.org'] +01:== added in slice onefji_slice598 foreign ['n2-598.plc2.org', 'n2-599.plc2.org', 'n2-600.plc2.org'] +01:== added in slice onefjj_slice599 foreign ['n2-599.plc2.org', 'n2-600.plc2.org', 'n2-601.plc2.org'] +01:== added in slice onegaa_slice600 foreign ['n2-600.plc2.org', 'n2-601.plc2.org', 'n2-602.plc2.org'] +01:== added in slice onegab_slice601 foreign ['n2-601.plc2.org', 'n2-602.plc2.org', 'n2-603.plc2.org'] +01:== added in slice onegac_slice602 foreign ['n2-602.plc2.org', 'n2-603.plc2.org', 'n2-604.plc2.org'] +01:== added in slice onegad_slice603 foreign ['n2-603.plc2.org', 'n2-604.plc2.org', 'n2-605.plc2.org'] +01:== added in slice onegae_slice604 foreign ['n2-604.plc2.org', 'n2-605.plc2.org', 'n2-606.plc2.org'] +01:== added in slice onegaf_slice605 foreign ['n2-605.plc2.org', 'n2-606.plc2.org', 'n2-607.plc2.org'] +01:== added in slice onegag_slice606 foreign ['n2-606.plc2.org', 'n2-607.plc2.org', 'n2-608.plc2.org'] +01:== added in slice onegah_slice607 foreign ['n2-607.plc2.org', 'n2-608.plc2.org', 'n2-609.plc2.org'] +01:== added in slice onegai_slice608 foreign ['n2-608.plc2.org', 'n2-609.plc2.org', 'n2-610.plc2.org'] +01:== added in slice onegaj_slice609 foreign ['n2-609.plc2.org', 'n2-610.plc2.org', 'n2-611.plc2.org'] +01:== added in slice onegba_slice610 foreign ['n2-610.plc2.org', 'n2-611.plc2.org', 'n2-612.plc2.org'] +01:== added in slice onegbb_slice611 foreign ['n2-611.plc2.org', 'n2-612.plc2.org', 'n2-613.plc2.org'] +01:== added in slice onegbc_slice612 foreign ['n2-612.plc2.org', 'n2-613.plc2.org', 'n2-614.plc2.org'] +01:== added in slice onegbd_slice613 foreign ['n2-613.plc2.org', 'n2-614.plc2.org', 'n2-615.plc2.org'] +01:== added in slice onegbe_slice614 foreign ['n2-614.plc2.org', 'n2-615.plc2.org', 'n2-616.plc2.org'] +01:== added in slice onegbf_slice615 foreign ['n2-615.plc2.org', 'n2-616.plc2.org', 'n2-617.plc2.org'] +01:== added in slice onegbg_slice616 foreign ['n2-616.plc2.org', 'n2-617.plc2.org', 'n2-618.plc2.org'] +01:== added in slice onegbh_slice617 foreign ['n2-617.plc2.org', 'n2-618.plc2.org', 'n2-619.plc2.org'] +01:== added in slice onegbi_slice618 foreign ['n2-618.plc2.org', 'n2-619.plc2.org', 'n2-620.plc2.org'] +01:== added in slice onegbj_slice619 foreign ['n2-619.plc2.org', 'n2-620.plc2.org', 'n2-621.plc2.org'] +01:== added in slice onegca_slice620 foreign ['n2-620.plc2.org', 'n2-621.plc2.org', 'n2-622.plc2.org'] +01:== added in slice onegcb_slice621 foreign ['n2-621.plc2.org', 'n2-622.plc2.org', 'n2-623.plc2.org'] +01:== added in slice onegcc_slice622 foreign ['n2-622.plc2.org', 'n2-623.plc2.org', 'n2-624.plc2.org'] +01:== added in slice onegcd_slice623 foreign ['n2-623.plc2.org', 'n2-624.plc2.org', 'n2-625.plc2.org'] +01:== added in slice onegce_slice624 foreign ['n2-624.plc2.org', 'n2-625.plc2.org', 'n2-626.plc2.org'] +01:== added in slice onegcf_slice625 foreign ['n2-625.plc2.org', 'n2-626.plc2.org', 'n2-627.plc2.org'] +01:== added in slice onegcg_slice626 foreign ['n2-626.plc2.org', 'n2-627.plc2.org', 'n2-628.plc2.org'] +01:== added in slice onegch_slice627 foreign ['n2-627.plc2.org', 'n2-628.plc2.org', 'n2-629.plc2.org'] +01:== added in slice onegci_slice628 foreign ['n2-628.plc2.org', 'n2-629.plc2.org', 'n2-630.plc2.org'] +01:== added in slice onegcj_slice629 foreign ['n2-629.plc2.org', 'n2-630.plc2.org', 'n2-631.plc2.org'] +01:== added in slice onegda_slice630 foreign ['n2-630.plc2.org', 'n2-631.plc2.org', 'n2-632.plc2.org'] +01:== added in slice onegdb_slice631 foreign ['n2-631.plc2.org', 'n2-632.plc2.org', 'n2-633.plc2.org'] +01:== added in slice onegdc_slice632 foreign ['n2-632.plc2.org', 'n2-633.plc2.org', 'n2-634.plc2.org'] +01:== added in slice onegdd_slice633 foreign ['n2-633.plc2.org', 'n2-634.plc2.org', 'n2-635.plc2.org'] +01:== added in slice onegde_slice634 foreign ['n2-634.plc2.org', 'n2-635.plc2.org', 'n2-636.plc2.org'] +01:== added in slice onegdf_slice635 foreign ['n2-635.plc2.org', 'n2-636.plc2.org', 'n2-637.plc2.org'] +01:== added in slice onegdg_slice636 foreign ['n2-636.plc2.org', 'n2-637.plc2.org', 'n2-638.plc2.org'] +01:== added in slice onegdh_slice637 foreign ['n2-637.plc2.org', 'n2-638.plc2.org', 'n2-639.plc2.org'] +01:== added in slice onegdi_slice638 foreign ['n2-638.plc2.org', 'n2-639.plc2.org', 'n2-640.plc2.org'] +01:== added in slice onegdj_slice639 foreign ['n2-639.plc2.org', 'n2-640.plc2.org', 'n2-641.plc2.org'] +01:== added in slice onegea_slice640 foreign ['n2-640.plc2.org', 'n2-641.plc2.org', 'n2-642.plc2.org'] +01:== added in slice onegeb_slice641 foreign ['n2-641.plc2.org', 'n2-642.plc2.org', 'n2-643.plc2.org'] +01:== added in slice onegec_slice642 foreign ['n2-642.plc2.org', 'n2-643.plc2.org', 'n2-644.plc2.org'] +01:== added in slice oneged_slice643 foreign ['n2-643.plc2.org', 'n2-644.plc2.org', 'n2-645.plc2.org'] +01:== added in slice onegee_slice644 foreign ['n2-644.plc2.org', 'n2-645.plc2.org', 'n2-646.plc2.org'] +01:== added in slice onegef_slice645 foreign ['n2-645.plc2.org', 'n2-646.plc2.org', 'n2-647.plc2.org'] +01:== added in slice onegeg_slice646 foreign ['n2-646.plc2.org', 'n2-647.plc2.org', 'n2-648.plc2.org'] +01:== added in slice onegeh_slice647 foreign ['n2-647.plc2.org', 'n2-648.plc2.org', 'n2-649.plc2.org'] +01:== added in slice onegei_slice648 foreign ['n2-648.plc2.org', 'n2-649.plc2.org', 'n2-650.plc2.org'] +01:== added in slice onegej_slice649 foreign ['n2-649.plc2.org', 'n2-650.plc2.org', 'n2-651.plc2.org'] +01:== added in slice onegfa_slice650 foreign ['n2-650.plc2.org', 'n2-651.plc2.org', 'n2-652.plc2.org'] +01:== added in slice onegfb_slice651 foreign ['n2-651.plc2.org', 'n2-652.plc2.org', 'n2-653.plc2.org'] +01:== added in slice onegfc_slice652 foreign ['n2-652.plc2.org', 'n2-653.plc2.org', 'n2-654.plc2.org'] +01:== added in slice onegfd_slice653 foreign ['n2-653.plc2.org', 'n2-654.plc2.org', 'n2-655.plc2.org'] +01:== added in slice onegfe_slice654 foreign ['n2-654.plc2.org', 'n2-655.plc2.org', 'n2-656.plc2.org'] +01:== added in slice onegff_slice655 foreign ['n2-655.plc2.org', 'n2-656.plc2.org', 'n2-657.plc2.org'] +01:== added in slice onegfg_slice656 foreign ['n2-656.plc2.org', 'n2-657.plc2.org', 'n2-658.plc2.org'] +01:== added in slice onegfh_slice657 foreign ['n2-657.plc2.org', 'n2-658.plc2.org', 'n2-659.plc2.org'] +01:== added in slice onegfi_slice658 foreign ['n2-658.plc2.org', 'n2-659.plc2.org', 'n2-660.plc2.org'] +01:== added in slice onegfj_slice659 foreign ['n2-659.plc2.org', 'n2-660.plc2.org', 'n2-661.plc2.org'] +01:== added in slice onegga_slice660 foreign ['n2-660.plc2.org', 'n2-661.plc2.org', 'n2-662.plc2.org'] +01:== added in slice oneggb_slice661 foreign ['n2-661.plc2.org', 'n2-662.plc2.org', 'n2-663.plc2.org'] +01:== added in slice oneggc_slice662 foreign ['n2-662.plc2.org', 'n2-663.plc2.org', 'n2-664.plc2.org'] +01:== added in slice oneggd_slice663 foreign ['n2-663.plc2.org', 'n2-664.plc2.org', 'n2-665.plc2.org'] +01:== added in slice onegge_slice664 foreign ['n2-664.plc2.org', 'n2-665.plc2.org', 'n2-666.plc2.org'] +01:== added in slice oneggf_slice665 foreign ['n2-665.plc2.org', 'n2-666.plc2.org', 'n2-667.plc2.org'] +01:== added in slice oneggg_slice666 foreign ['n2-666.plc2.org', 'n2-667.plc2.org', 'n2-668.plc2.org'] +01:== added in slice oneggh_slice667 foreign ['n2-667.plc2.org', 'n2-668.plc2.org', 'n2-669.plc2.org'] +01:== added in slice oneggi_slice668 foreign ['n2-668.plc2.org', 'n2-669.plc2.org', 'n2-670.plc2.org'] +01:== added in slice oneggj_slice669 foreign ['n2-669.plc2.org', 'n2-670.plc2.org', 'n2-671.plc2.org'] +01:== added in slice onegha_slice670 foreign ['n2-670.plc2.org', 'n2-671.plc2.org', 'n2-672.plc2.org'] +01:== added in slice oneghb_slice671 foreign ['n2-671.plc2.org', 'n2-672.plc2.org', 'n2-673.plc2.org'] +01:== added in slice oneghc_slice672 foreign ['n2-672.plc2.org', 'n2-673.plc2.org', 'n2-674.plc2.org'] +01:== added in slice oneghd_slice673 foreign ['n2-673.plc2.org', 'n2-674.plc2.org', 'n2-675.plc2.org'] +01:== added in slice oneghe_slice674 foreign ['n2-674.plc2.org', 'n2-675.plc2.org', 'n2-676.plc2.org'] +01:== added in slice oneghf_slice675 foreign ['n2-675.plc2.org', 'n2-676.plc2.org', 'n2-677.plc2.org'] +01:== added in slice oneghg_slice676 foreign ['n2-676.plc2.org', 'n2-677.plc2.org', 'n2-678.plc2.org'] +01:== added in slice oneghh_slice677 foreign ['n2-677.plc2.org', 'n2-678.plc2.org', 'n2-679.plc2.org'] +01:== added in slice oneghi_slice678 foreign ['n2-678.plc2.org', 'n2-679.plc2.org', 'n2-680.plc2.org'] +01:== added in slice oneghj_slice679 foreign ['n2-679.plc2.org', 'n2-680.plc2.org', 'n2-681.plc2.org'] +01:== added in slice onegia_slice680 foreign ['n2-680.plc2.org', 'n2-681.plc2.org', 'n2-682.plc2.org'] +01:== added in slice onegib_slice681 foreign ['n2-681.plc2.org', 'n2-682.plc2.org', 'n2-683.plc2.org'] +01:== added in slice onegic_slice682 foreign ['n2-682.plc2.org', 'n2-683.plc2.org', 'n2-684.plc2.org'] +01:== added in slice onegid_slice683 foreign ['n2-683.plc2.org', 'n2-684.plc2.org', 'n2-685.plc2.org'] +01:== added in slice onegie_slice684 foreign ['n2-684.plc2.org', 'n2-685.plc2.org', 'n2-686.plc2.org'] +01:== added in slice onegif_slice685 foreign ['n2-685.plc2.org', 'n2-686.plc2.org', 'n2-687.plc2.org'] +01:== added in slice onegig_slice686 foreign ['n2-686.plc2.org', 'n2-687.plc2.org', 'n2-688.plc2.org'] +01:== added in slice onegih_slice687 foreign ['n2-687.plc2.org', 'n2-688.plc2.org', 'n2-689.plc2.org'] +01:== added in slice onegii_slice688 foreign ['n2-688.plc2.org', 'n2-689.plc2.org', 'n2-690.plc2.org'] +01:== added in slice onegij_slice689 foreign ['n2-689.plc2.org', 'n2-690.plc2.org', 'n2-691.plc2.org'] +01:== added in slice onegja_slice690 foreign ['n2-690.plc2.org', 'n2-691.plc2.org', 'n2-692.plc2.org'] +01:== added in slice onegjb_slice691 foreign ['n2-691.plc2.org', 'n2-692.plc2.org', 'n2-693.plc2.org'] +01:== added in slice onegjc_slice692 foreign ['n2-692.plc2.org', 'n2-693.plc2.org', 'n2-694.plc2.org'] +01:== added in slice onegjd_slice693 foreign ['n2-693.plc2.org', 'n2-694.plc2.org', 'n2-695.plc2.org'] +01:== added in slice onegje_slice694 foreign ['n2-694.plc2.org', 'n2-695.plc2.org', 'n2-696.plc2.org'] +01:== added in slice onegjf_slice695 foreign ['n2-695.plc2.org', 'n2-696.plc2.org', 'n2-697.plc2.org'] +01:== added in slice onegjg_slice696 foreign ['n2-696.plc2.org', 'n2-697.plc2.org', 'n2-698.plc2.org'] +01:== added in slice onegjh_slice697 foreign ['n2-697.plc2.org', 'n2-698.plc2.org', 'n2-699.plc2.org'] +01:== added in slice onegji_slice698 foreign ['n2-698.plc2.org', 'n2-699.plc2.org', 'n2-700.plc2.org'] +01:== added in slice onegjj_slice699 foreign ['n2-699.plc2.org', 'n2-700.plc2.org', 'n2-701.plc2.org'] +01:== added in slice onehaa_slice700 foreign ['n2-700.plc2.org', 'n2-701.plc2.org', 'n2-702.plc2.org'] +01:== added in slice onehab_slice701 foreign ['n2-701.plc2.org', 'n2-702.plc2.org', 'n2-703.plc2.org'] +01:== added in slice onehac_slice702 foreign ['n2-702.plc2.org', 'n2-703.plc2.org', 'n2-704.plc2.org'] +01:== added in slice onehad_slice703 foreign ['n2-703.plc2.org', 'n2-704.plc2.org', 'n2-705.plc2.org'] +01:== added in slice onehae_slice704 foreign ['n2-704.plc2.org', 'n2-705.plc2.org', 'n2-706.plc2.org'] +01:== added in slice onehaf_slice705 foreign ['n2-705.plc2.org', 'n2-706.plc2.org', 'n2-707.plc2.org'] +01:== added in slice onehag_slice706 foreign ['n2-706.plc2.org', 'n2-707.plc2.org', 'n2-708.plc2.org'] +01:== added in slice onehah_slice707 foreign ['n2-707.plc2.org', 'n2-708.plc2.org', 'n2-709.plc2.org'] +01:== added in slice onehai_slice708 foreign ['n2-708.plc2.org', 'n2-709.plc2.org', 'n2-710.plc2.org'] +01:== added in slice onehaj_slice709 foreign ['n2-709.plc2.org', 'n2-710.plc2.org', 'n2-711.plc2.org'] +01:== added in slice onehba_slice710 foreign ['n2-710.plc2.org', 'n2-711.plc2.org', 'n2-712.plc2.org'] +01:== added in slice onehbb_slice711 foreign ['n2-711.plc2.org', 'n2-712.plc2.org', 'n2-713.plc2.org'] +01:== added in slice onehbc_slice712 foreign ['n2-712.plc2.org', 'n2-713.plc2.org', 'n2-714.plc2.org'] +01:== added in slice onehbd_slice713 foreign ['n2-713.plc2.org', 'n2-714.plc2.org', 'n2-715.plc2.org'] +01:== added in slice onehbe_slice714 foreign ['n2-714.plc2.org', 'n2-715.plc2.org', 'n2-716.plc2.org'] +01:== added in slice onehbf_slice715 foreign ['n2-715.plc2.org', 'n2-716.plc2.org', 'n2-717.plc2.org'] +01:== added in slice onehbg_slice716 foreign ['n2-716.plc2.org', 'n2-717.plc2.org', 'n2-718.plc2.org'] +01:== added in slice onehbh_slice717 foreign ['n2-717.plc2.org', 'n2-718.plc2.org', 'n2-719.plc2.org'] +01:== added in slice onehbi_slice718 foreign ['n2-718.plc2.org', 'n2-719.plc2.org', 'n2-720.plc2.org'] +01:== added in slice onehbj_slice719 foreign ['n2-719.plc2.org', 'n2-720.plc2.org', 'n2-721.plc2.org'] +01:== added in slice onehca_slice720 foreign ['n2-720.plc2.org', 'n2-721.plc2.org', 'n2-722.plc2.org'] +01:== added in slice onehcb_slice721 foreign ['n2-721.plc2.org', 'n2-722.plc2.org', 'n2-723.plc2.org'] +01:== added in slice onehcc_slice722 foreign ['n2-722.plc2.org', 'n2-723.plc2.org', 'n2-724.plc2.org'] +01:== added in slice onehcd_slice723 foreign ['n2-723.plc2.org', 'n2-724.plc2.org', 'n2-725.plc2.org'] +01:== added in slice onehce_slice724 foreign ['n2-724.plc2.org', 'n2-725.plc2.org', 'n2-726.plc2.org'] +01:== added in slice onehcf_slice725 foreign ['n2-725.plc2.org', 'n2-726.plc2.org', 'n2-727.plc2.org'] +01:== added in slice onehcg_slice726 foreign ['n2-726.plc2.org', 'n2-727.plc2.org', 'n2-728.plc2.org'] +01:== added in slice onehch_slice727 foreign ['n2-727.plc2.org', 'n2-728.plc2.org', 'n2-729.plc2.org'] +01:== added in slice onehci_slice728 foreign ['n2-728.plc2.org', 'n2-729.plc2.org', 'n2-730.plc2.org'] +01:== added in slice onehcj_slice729 foreign ['n2-729.plc2.org', 'n2-730.plc2.org', 'n2-731.plc2.org'] +01:== added in slice onehda_slice730 foreign ['n2-730.plc2.org', 'n2-731.plc2.org', 'n2-732.plc2.org'] +01:== added in slice onehdb_slice731 foreign ['n2-731.plc2.org', 'n2-732.plc2.org', 'n2-733.plc2.org'] +01:== added in slice onehdc_slice732 foreign ['n2-732.plc2.org', 'n2-733.plc2.org', 'n2-734.plc2.org'] +01:== added in slice onehdd_slice733 foreign ['n2-733.plc2.org', 'n2-734.plc2.org', 'n2-735.plc2.org'] +01:== added in slice onehde_slice734 foreign ['n2-734.plc2.org', 'n2-735.plc2.org', 'n2-736.plc2.org'] +01:== added in slice onehdf_slice735 foreign ['n2-735.plc2.org', 'n2-736.plc2.org', 'n2-737.plc2.org'] +01:== added in slice onehdg_slice736 foreign ['n2-736.plc2.org', 'n2-737.plc2.org', 'n2-738.plc2.org'] +01:== added in slice onehdh_slice737 foreign ['n2-737.plc2.org', 'n2-738.plc2.org', 'n2-739.plc2.org'] +01:== added in slice onehdi_slice738 foreign ['n2-738.plc2.org', 'n2-739.plc2.org', 'n2-740.plc2.org'] +01:== added in slice onehdj_slice739 foreign ['n2-739.plc2.org', 'n2-740.plc2.org', 'n2-741.plc2.org'] +01:== added in slice onehea_slice740 foreign ['n2-740.plc2.org', 'n2-741.plc2.org', 'n2-742.plc2.org'] +01:== added in slice oneheb_slice741 foreign ['n2-741.plc2.org', 'n2-742.plc2.org', 'n2-743.plc2.org'] +01:== added in slice onehec_slice742 foreign ['n2-742.plc2.org', 'n2-743.plc2.org', 'n2-744.plc2.org'] +01:== added in slice onehed_slice743 foreign ['n2-743.plc2.org', 'n2-744.plc2.org', 'n2-745.plc2.org'] +01:== added in slice onehee_slice744 foreign ['n2-744.plc2.org', 'n2-745.plc2.org', 'n2-746.plc2.org'] +01:== added in slice onehef_slice745 foreign ['n2-745.plc2.org', 'n2-746.plc2.org', 'n2-747.plc2.org'] +01:== added in slice oneheg_slice746 foreign ['n2-746.plc2.org', 'n2-747.plc2.org', 'n2-748.plc2.org'] +01:== added in slice oneheh_slice747 foreign ['n2-747.plc2.org', 'n2-748.plc2.org', 'n2-749.plc2.org'] +01:== added in slice onehei_slice748 foreign ['n2-748.plc2.org', 'n2-749.plc2.org', 'n2-750.plc2.org'] +01:== added in slice onehej_slice749 foreign ['n2-749.plc2.org', 'n2-750.plc2.org', 'n2-751.plc2.org'] +01:== added in slice onehfa_slice750 foreign ['n2-750.plc2.org', 'n2-751.plc2.org', 'n2-752.plc2.org'] +01:== added in slice onehfb_slice751 foreign ['n2-751.plc2.org', 'n2-752.plc2.org', 'n2-753.plc2.org'] +01:== added in slice onehfc_slice752 foreign ['n2-752.plc2.org', 'n2-753.plc2.org', 'n2-754.plc2.org'] +01:== added in slice onehfd_slice753 foreign ['n2-753.plc2.org', 'n2-754.plc2.org', 'n2-755.plc2.org'] +01:== added in slice onehfe_slice754 foreign ['n2-754.plc2.org', 'n2-755.plc2.org', 'n2-756.plc2.org'] +01:== added in slice onehff_slice755 foreign ['n2-755.plc2.org', 'n2-756.plc2.org', 'n2-757.plc2.org'] +01:== added in slice onehfg_slice756 foreign ['n2-756.plc2.org', 'n2-757.plc2.org', 'n2-758.plc2.org'] +01:== added in slice onehfh_slice757 foreign ['n2-757.plc2.org', 'n2-758.plc2.org', 'n2-759.plc2.org'] +01:== added in slice onehfi_slice758 foreign ['n2-758.plc2.org', 'n2-759.plc2.org', 'n2-760.plc2.org'] +01:== added in slice onehfj_slice759 foreign ['n2-759.plc2.org', 'n2-760.plc2.org', 'n2-761.plc2.org'] +01:== added in slice onehga_slice760 foreign ['n2-760.plc2.org', 'n2-761.plc2.org', 'n2-762.plc2.org'] +01:== added in slice onehgb_slice761 foreign ['n2-761.plc2.org', 'n2-762.plc2.org', 'n2-763.plc2.org'] +01:== added in slice onehgc_slice762 foreign ['n2-762.plc2.org', 'n2-763.plc2.org', 'n2-764.plc2.org'] +01:== added in slice onehgd_slice763 foreign ['n2-763.plc2.org', 'n2-764.plc2.org', 'n2-765.plc2.org'] +01:== added in slice onehge_slice764 foreign ['n2-764.plc2.org', 'n2-765.plc2.org', 'n2-766.plc2.org'] +01:== added in slice onehgf_slice765 foreign ['n2-765.plc2.org', 'n2-766.plc2.org', 'n2-767.plc2.org'] +01:== added in slice onehgg_slice766 foreign ['n2-766.plc2.org', 'n2-767.plc2.org', 'n2-768.plc2.org'] +01:== added in slice onehgh_slice767 foreign ['n2-767.plc2.org', 'n2-768.plc2.org', 'n2-769.plc2.org'] +01:== added in slice onehgi_slice768 foreign ['n2-768.plc2.org', 'n2-769.plc2.org', 'n2-770.plc2.org'] +01:== added in slice onehgj_slice769 foreign ['n2-769.plc2.org', 'n2-770.plc2.org', 'n2-771.plc2.org'] +01:== added in slice onehha_slice770 foreign ['n2-770.plc2.org', 'n2-771.plc2.org', 'n2-772.plc2.org'] +01:== added in slice onehhb_slice771 foreign ['n2-771.plc2.org', 'n2-772.plc2.org', 'n2-773.plc2.org'] +01:== added in slice onehhc_slice772 foreign ['n2-772.plc2.org', 'n2-773.plc2.org', 'n2-774.plc2.org'] +01:== added in slice onehhd_slice773 foreign ['n2-773.plc2.org', 'n2-774.plc2.org', 'n2-775.plc2.org'] +01:== added in slice onehhe_slice774 foreign ['n2-774.plc2.org', 'n2-775.plc2.org', 'n2-776.plc2.org'] +01:== added in slice onehhf_slice775 foreign ['n2-775.plc2.org', 'n2-776.plc2.org', 'n2-777.plc2.org'] +01:== added in slice onehhg_slice776 foreign ['n2-776.plc2.org', 'n2-777.plc2.org', 'n2-778.plc2.org'] +01:== added in slice onehhh_slice777 foreign ['n2-777.plc2.org', 'n2-778.plc2.org', 'n2-779.plc2.org'] +01:== added in slice onehhi_slice778 foreign ['n2-778.plc2.org', 'n2-779.plc2.org', 'n2-780.plc2.org'] +01:== added in slice onehhj_slice779 foreign ['n2-779.plc2.org', 'n2-780.plc2.org', 'n2-781.plc2.org'] +01:== added in slice onehia_slice780 foreign ['n2-780.plc2.org', 'n2-781.plc2.org', 'n2-782.plc2.org'] +01:== added in slice onehib_slice781 foreign ['n2-781.plc2.org', 'n2-782.plc2.org', 'n2-783.plc2.org'] +01:== added in slice onehic_slice782 foreign ['n2-782.plc2.org', 'n2-783.plc2.org', 'n2-784.plc2.org'] +01:== added in slice onehid_slice783 foreign ['n2-783.plc2.org', 'n2-784.plc2.org', 'n2-785.plc2.org'] +01:== added in slice onehie_slice784 foreign ['n2-784.plc2.org', 'n2-785.plc2.org', 'n2-786.plc2.org'] +01:== added in slice onehif_slice785 foreign ['n2-785.plc2.org', 'n2-786.plc2.org', 'n2-787.plc2.org'] +01:== added in slice onehig_slice786 foreign ['n2-786.plc2.org', 'n2-787.plc2.org', 'n2-788.plc2.org'] +01:== added in slice onehih_slice787 foreign ['n2-787.plc2.org', 'n2-788.plc2.org', 'n2-789.plc2.org'] +01:== added in slice onehii_slice788 foreign ['n2-788.plc2.org', 'n2-789.plc2.org', 'n2-790.plc2.org'] +01:== added in slice onehij_slice789 foreign ['n2-789.plc2.org', 'n2-790.plc2.org', 'n2-791.plc2.org'] +01:== added in slice onehja_slice790 foreign ['n2-790.plc2.org', 'n2-791.plc2.org', 'n2-792.plc2.org'] +01:== added in slice onehjb_slice791 foreign ['n2-791.plc2.org', 'n2-792.plc2.org', 'n2-793.plc2.org'] +01:== added in slice onehjc_slice792 foreign ['n2-792.plc2.org', 'n2-793.plc2.org', 'n2-794.plc2.org'] +01:== added in slice onehjd_slice793 foreign ['n2-793.plc2.org', 'n2-794.plc2.org', 'n2-795.plc2.org'] +01:== added in slice onehje_slice794 foreign ['n2-794.plc2.org', 'n2-795.plc2.org', 'n2-796.plc2.org'] +01:== added in slice onehjf_slice795 foreign ['n2-795.plc2.org', 'n2-796.plc2.org', 'n2-797.plc2.org'] +01:== added in slice onehjg_slice796 foreign ['n2-796.plc2.org', 'n2-797.plc2.org', 'n2-798.plc2.org'] +01:== added in slice onehjh_slice797 foreign ['n2-797.plc2.org', 'n2-798.plc2.org', 'n2-799.plc2.org'] +01:== added in slice onehji_slice798 foreign ['n2-798.plc2.org', 'n2-799.plc2.org', 'n2-800.plc2.org'] +01:== added in slice onehjj_slice799 foreign ['n2-799.plc2.org', 'n2-800.plc2.org', 'n2-801.plc2.org'] +01:== added in slice oneiaa_slice800 foreign ['n2-800.plc2.org', 'n2-801.plc2.org', 'n2-802.plc2.org'] +01:== added in slice oneiab_slice801 foreign ['n2-801.plc2.org', 'n2-802.plc2.org', 'n2-803.plc2.org'] +01:== added in slice oneiac_slice802 foreign ['n2-802.plc2.org', 'n2-803.plc2.org', 'n2-804.plc2.org'] +01:== added in slice oneiad_slice803 foreign ['n2-803.plc2.org', 'n2-804.plc2.org', 'n2-805.plc2.org'] +01:== added in slice oneiae_slice804 foreign ['n2-804.plc2.org', 'n2-805.plc2.org', 'n2-806.plc2.org'] +01:== added in slice oneiaf_slice805 foreign ['n2-805.plc2.org', 'n2-806.plc2.org', 'n2-807.plc2.org'] +01:== added in slice oneiag_slice806 foreign ['n2-806.plc2.org', 'n2-807.plc2.org', 'n2-808.plc2.org'] +01:== added in slice oneiah_slice807 foreign ['n2-807.plc2.org', 'n2-808.plc2.org', 'n2-809.plc2.org'] +01:== added in slice oneiai_slice808 foreign ['n2-808.plc2.org', 'n2-809.plc2.org', 'n2-810.plc2.org'] +01:== added in slice oneiaj_slice809 foreign ['n2-809.plc2.org', 'n2-810.plc2.org', 'n2-811.plc2.org'] +01:== added in slice oneiba_slice810 foreign ['n2-810.plc2.org', 'n2-811.plc2.org', 'n2-812.plc2.org'] +01:== added in slice oneibb_slice811 foreign ['n2-811.plc2.org', 'n2-812.plc2.org', 'n2-813.plc2.org'] +01:== added in slice oneibc_slice812 foreign ['n2-812.plc2.org', 'n2-813.plc2.org', 'n2-814.plc2.org'] +01:== added in slice oneibd_slice813 foreign ['n2-813.plc2.org', 'n2-814.plc2.org', 'n2-815.plc2.org'] +01:== added in slice oneibe_slice814 foreign ['n2-814.plc2.org', 'n2-815.plc2.org', 'n2-816.plc2.org'] +01:== added in slice oneibf_slice815 foreign ['n2-815.plc2.org', 'n2-816.plc2.org', 'n2-817.plc2.org'] +01:== added in slice oneibg_slice816 foreign ['n2-816.plc2.org', 'n2-817.plc2.org', 'n2-818.plc2.org'] +01:== added in slice oneibh_slice817 foreign ['n2-817.plc2.org', 'n2-818.plc2.org', 'n2-819.plc2.org'] +01:== added in slice oneibi_slice818 foreign ['n2-818.plc2.org', 'n2-819.plc2.org', 'n2-820.plc2.org'] +01:== added in slice oneibj_slice819 foreign ['n2-819.plc2.org', 'n2-820.plc2.org', 'n2-821.plc2.org'] +01:== added in slice oneica_slice820 foreign ['n2-820.plc2.org', 'n2-821.plc2.org', 'n2-822.plc2.org'] +01:== added in slice oneicb_slice821 foreign ['n2-821.plc2.org', 'n2-822.plc2.org', 'n2-823.plc2.org'] +01:== added in slice oneicc_slice822 foreign ['n2-822.plc2.org', 'n2-823.plc2.org', 'n2-824.plc2.org'] +01:== added in slice oneicd_slice823 foreign ['n2-823.plc2.org', 'n2-824.plc2.org', 'n2-825.plc2.org'] +01:== added in slice oneice_slice824 foreign ['n2-824.plc2.org', 'n2-825.plc2.org', 'n2-826.plc2.org'] +01:== added in slice oneicf_slice825 foreign ['n2-825.plc2.org', 'n2-826.plc2.org', 'n2-827.plc2.org'] +01:== added in slice oneicg_slice826 foreign ['n2-826.plc2.org', 'n2-827.plc2.org', 'n2-828.plc2.org'] +01:== added in slice oneich_slice827 foreign ['n2-827.plc2.org', 'n2-828.plc2.org', 'n2-829.plc2.org'] +01:== added in slice oneici_slice828 foreign ['n2-828.plc2.org', 'n2-829.plc2.org', 'n2-830.plc2.org'] +01:== added in slice oneicj_slice829 foreign ['n2-829.plc2.org', 'n2-830.plc2.org', 'n2-831.plc2.org'] +01:== added in slice oneida_slice830 foreign ['n2-830.plc2.org', 'n2-831.plc2.org', 'n2-832.plc2.org'] +01:== added in slice oneidb_slice831 foreign ['n2-831.plc2.org', 'n2-832.plc2.org', 'n2-833.plc2.org'] +01:== added in slice oneidc_slice832 foreign ['n2-832.plc2.org', 'n2-833.plc2.org', 'n2-834.plc2.org'] +01:== added in slice oneidd_slice833 foreign ['n2-833.plc2.org', 'n2-834.plc2.org', 'n2-835.plc2.org'] +01:== added in slice oneide_slice834 foreign ['n2-834.plc2.org', 'n2-835.plc2.org', 'n2-836.plc2.org'] +01:== added in slice oneidf_slice835 foreign ['n2-835.plc2.org', 'n2-836.plc2.org', 'n2-837.plc2.org'] +01:== added in slice oneidg_slice836 foreign ['n2-836.plc2.org', 'n2-837.plc2.org', 'n2-838.plc2.org'] +01:== added in slice oneidh_slice837 foreign ['n2-837.plc2.org', 'n2-838.plc2.org', 'n2-839.plc2.org'] +01:== added in slice oneidi_slice838 foreign ['n2-838.plc2.org', 'n2-839.plc2.org', 'n2-840.plc2.org'] +01:== added in slice oneidj_slice839 foreign ['n2-839.plc2.org', 'n2-840.plc2.org', 'n2-841.plc2.org'] +01:== added in slice oneiea_slice840 foreign ['n2-840.plc2.org', 'n2-841.plc2.org', 'n2-842.plc2.org'] +01:== added in slice oneieb_slice841 foreign ['n2-841.plc2.org', 'n2-842.plc2.org', 'n2-843.plc2.org'] +01:== added in slice oneiec_slice842 foreign ['n2-842.plc2.org', 'n2-843.plc2.org', 'n2-844.plc2.org'] +01:== added in slice oneied_slice843 foreign ['n2-843.plc2.org', 'n2-844.plc2.org', 'n2-845.plc2.org'] +01:== added in slice oneiee_slice844 foreign ['n2-844.plc2.org', 'n2-845.plc2.org', 'n2-846.plc2.org'] +01:== added in slice oneief_slice845 foreign ['n2-845.plc2.org', 'n2-846.plc2.org', 'n2-847.plc2.org'] +01:== added in slice oneieg_slice846 foreign ['n2-846.plc2.org', 'n2-847.plc2.org', 'n2-848.plc2.org'] +01:== added in slice oneieh_slice847 foreign ['n2-847.plc2.org', 'n2-848.plc2.org', 'n2-849.plc2.org'] +01:== added in slice oneiei_slice848 foreign ['n2-848.plc2.org', 'n2-849.plc2.org', 'n2-850.plc2.org'] +01:== added in slice oneiej_slice849 foreign ['n2-849.plc2.org', 'n2-850.plc2.org', 'n2-851.plc2.org'] +01:== added in slice oneifa_slice850 foreign ['n2-850.plc2.org', 'n2-851.plc2.org', 'n2-852.plc2.org'] +01:== added in slice oneifb_slice851 foreign ['n2-851.plc2.org', 'n2-852.plc2.org', 'n2-853.plc2.org'] +01:== added in slice oneifc_slice852 foreign ['n2-852.plc2.org', 'n2-853.plc2.org', 'n2-854.plc2.org'] +01:== added in slice oneifd_slice853 foreign ['n2-853.plc2.org', 'n2-854.plc2.org', 'n2-855.plc2.org'] +01:== added in slice oneife_slice854 foreign ['n2-854.plc2.org', 'n2-855.plc2.org', 'n2-856.plc2.org'] +01:== added in slice oneiff_slice855 foreign ['n2-855.plc2.org', 'n2-856.plc2.org', 'n2-857.plc2.org'] +01:== added in slice oneifg_slice856 foreign ['n2-856.plc2.org', 'n2-857.plc2.org', 'n2-858.plc2.org'] +01:== added in slice oneifh_slice857 foreign ['n2-857.plc2.org', 'n2-858.plc2.org', 'n2-859.plc2.org'] +01:== added in slice oneifi_slice858 foreign ['n2-858.plc2.org', 'n2-859.plc2.org', 'n2-860.plc2.org'] +01:== added in slice oneifj_slice859 foreign ['n2-859.plc2.org', 'n2-860.plc2.org', 'n2-861.plc2.org'] +01:== added in slice oneiga_slice860 foreign ['n2-860.plc2.org', 'n2-861.plc2.org', 'n2-862.plc2.org'] +01:== added in slice oneigb_slice861 foreign ['n2-861.plc2.org', 'n2-862.plc2.org', 'n2-863.plc2.org'] +01:== added in slice oneigc_slice862 foreign ['n2-862.plc2.org', 'n2-863.plc2.org', 'n2-864.plc2.org'] +01:== added in slice oneigd_slice863 foreign ['n2-863.plc2.org', 'n2-864.plc2.org', 'n2-865.plc2.org'] +01:== added in slice oneige_slice864 foreign ['n2-864.plc2.org', 'n2-865.plc2.org', 'n2-866.plc2.org'] +01:== added in slice oneigf_slice865 foreign ['n2-865.plc2.org', 'n2-866.plc2.org', 'n2-867.plc2.org'] +01:== added in slice oneigg_slice866 foreign ['n2-866.plc2.org', 'n2-867.plc2.org', 'n2-868.plc2.org'] +01:== added in slice oneigh_slice867 foreign ['n2-867.plc2.org', 'n2-868.plc2.org', 'n2-869.plc2.org'] +01:== added in slice oneigi_slice868 foreign ['n2-868.plc2.org', 'n2-869.plc2.org', 'n2-870.plc2.org'] +01:== added in slice oneigj_slice869 foreign ['n2-869.plc2.org', 'n2-870.plc2.org', 'n2-871.plc2.org'] +01:== added in slice oneiha_slice870 foreign ['n2-870.plc2.org', 'n2-871.plc2.org', 'n2-872.plc2.org'] +01:== added in slice oneihb_slice871 foreign ['n2-871.plc2.org', 'n2-872.plc2.org', 'n2-873.plc2.org'] +01:== added in slice oneihc_slice872 foreign ['n2-872.plc2.org', 'n2-873.plc2.org', 'n2-874.plc2.org'] +01:== added in slice oneihd_slice873 foreign ['n2-873.plc2.org', 'n2-874.plc2.org', 'n2-875.plc2.org'] +01:== added in slice oneihe_slice874 foreign ['n2-874.plc2.org', 'n2-875.plc2.org', 'n2-876.plc2.org'] +01:== added in slice oneihf_slice875 foreign ['n2-875.plc2.org', 'n2-876.plc2.org', 'n2-877.plc2.org'] +01:== added in slice oneihg_slice876 foreign ['n2-876.plc2.org', 'n2-877.plc2.org', 'n2-878.plc2.org'] +01:== added in slice oneihh_slice877 foreign ['n2-877.plc2.org', 'n2-878.plc2.org', 'n2-879.plc2.org'] +01:== added in slice oneihi_slice878 foreign ['n2-878.plc2.org', 'n2-879.plc2.org', 'n2-880.plc2.org'] +01:== added in slice oneihj_slice879 foreign ['n2-879.plc2.org', 'n2-880.plc2.org', 'n2-881.plc2.org'] +01:== added in slice oneiia_slice880 foreign ['n2-880.plc2.org', 'n2-881.plc2.org', 'n2-882.plc2.org'] +01:== added in slice oneiib_slice881 foreign ['n2-881.plc2.org', 'n2-882.plc2.org', 'n2-883.plc2.org'] +01:== added in slice oneiic_slice882 foreign ['n2-882.plc2.org', 'n2-883.plc2.org', 'n2-884.plc2.org'] +01:== added in slice oneiid_slice883 foreign ['n2-883.plc2.org', 'n2-884.plc2.org', 'n2-885.plc2.org'] +01:== added in slice oneiie_slice884 foreign ['n2-884.plc2.org', 'n2-885.plc2.org', 'n2-886.plc2.org'] +01:== added in slice oneiif_slice885 foreign ['n2-885.plc2.org', 'n2-886.plc2.org', 'n2-887.plc2.org'] +01:== added in slice oneiig_slice886 foreign ['n2-886.plc2.org', 'n2-887.plc2.org', 'n2-888.plc2.org'] +01:== added in slice oneiih_slice887 foreign ['n2-887.plc2.org', 'n2-888.plc2.org', 'n2-889.plc2.org'] +01:== added in slice oneiii_slice888 foreign ['n2-888.plc2.org', 'n2-889.plc2.org', 'n2-890.plc2.org'] +01:== added in slice oneiij_slice889 foreign ['n2-889.plc2.org', 'n2-890.plc2.org', 'n2-891.plc2.org'] +01:== added in slice oneija_slice890 foreign ['n2-890.plc2.org', 'n2-891.plc2.org', 'n2-892.plc2.org'] +01:== added in slice oneijb_slice891 foreign ['n2-891.plc2.org', 'n2-892.plc2.org', 'n2-893.plc2.org'] +01:== added in slice oneijc_slice892 foreign ['n2-892.plc2.org', 'n2-893.plc2.org', 'n2-894.plc2.org'] +01:== added in slice oneijd_slice893 foreign ['n2-893.plc2.org', 'n2-894.plc2.org', 'n2-895.plc2.org'] +01:== added in slice oneije_slice894 foreign ['n2-894.plc2.org', 'n2-895.plc2.org', 'n2-896.plc2.org'] +01:== added in slice oneijf_slice895 foreign ['n2-895.plc2.org', 'n2-896.plc2.org', 'n2-897.plc2.org'] +01:== added in slice oneijg_slice896 foreign ['n2-896.plc2.org', 'n2-897.plc2.org', 'n2-898.plc2.org'] +01:== added in slice oneijh_slice897 foreign ['n2-897.plc2.org', 'n2-898.plc2.org', 'n2-899.plc2.org'] +01:== added in slice oneiji_slice898 foreign ['n2-898.plc2.org', 'n2-899.plc2.org', 'n2-900.plc2.org'] +01:== added in slice oneijj_slice899 foreign ['n2-899.plc2.org', 'n2-900.plc2.org', 'n2-901.plc2.org'] +01:== added in slice onejaa_slice900 foreign ['n2-900.plc2.org', 'n2-901.plc2.org', 'n2-902.plc2.org'] +01:== added in slice onejab_slice901 foreign ['n2-901.plc2.org', 'n2-902.plc2.org', 'n2-903.plc2.org'] +01:== added in slice onejac_slice902 foreign ['n2-902.plc2.org', 'n2-903.plc2.org', 'n2-904.plc2.org'] +01:== added in slice onejad_slice903 foreign ['n2-903.plc2.org', 'n2-904.plc2.org', 'n2-905.plc2.org'] +01:== added in slice onejae_slice904 foreign ['n2-904.plc2.org', 'n2-905.plc2.org', 'n2-906.plc2.org'] +01:== added in slice onejaf_slice905 foreign ['n2-905.plc2.org', 'n2-906.plc2.org', 'n2-907.plc2.org'] +01:== added in slice onejag_slice906 foreign ['n2-906.plc2.org', 'n2-907.plc2.org', 'n2-908.plc2.org'] +01:== added in slice onejah_slice907 foreign ['n2-907.plc2.org', 'n2-908.plc2.org', 'n2-909.plc2.org'] +01:== added in slice onejai_slice908 foreign ['n2-908.plc2.org', 'n2-909.plc2.org', 'n2-910.plc2.org'] +01:== added in slice onejaj_slice909 foreign ['n2-909.plc2.org', 'n2-910.plc2.org', 'n2-911.plc2.org'] +01:== added in slice onejba_slice910 foreign ['n2-910.plc2.org', 'n2-911.plc2.org', 'n2-912.plc2.org'] +01:== added in slice onejbb_slice911 foreign ['n2-911.plc2.org', 'n2-912.plc2.org', 'n2-913.plc2.org'] +01:== added in slice onejbc_slice912 foreign ['n2-912.plc2.org', 'n2-913.plc2.org', 'n2-914.plc2.org'] +01:== added in slice onejbd_slice913 foreign ['n2-913.plc2.org', 'n2-914.plc2.org', 'n2-915.plc2.org'] +01:== added in slice onejbe_slice914 foreign ['n2-914.plc2.org', 'n2-915.plc2.org', 'n2-916.plc2.org'] +01:== added in slice onejbf_slice915 foreign ['n2-915.plc2.org', 'n2-916.plc2.org', 'n2-917.plc2.org'] +01:== added in slice onejbg_slice916 foreign ['n2-916.plc2.org', 'n2-917.plc2.org', 'n2-918.plc2.org'] +01:== added in slice onejbh_slice917 foreign ['n2-917.plc2.org', 'n2-918.plc2.org', 'n2-919.plc2.org'] +01:== added in slice onejbi_slice918 foreign ['n2-918.plc2.org', 'n2-919.plc2.org', 'n2-920.plc2.org'] +01:== added in slice onejbj_slice919 foreign ['n2-919.plc2.org', 'n2-920.plc2.org', 'n2-921.plc2.org'] +01:== added in slice onejca_slice920 foreign ['n2-920.plc2.org', 'n2-921.plc2.org', 'n2-922.plc2.org'] +01:== added in slice onejcb_slice921 foreign ['n2-921.plc2.org', 'n2-922.plc2.org', 'n2-923.plc2.org'] +01:== added in slice onejcc_slice922 foreign ['n2-922.plc2.org', 'n2-923.plc2.org', 'n2-924.plc2.org'] +01:== added in slice onejcd_slice923 foreign ['n2-923.plc2.org', 'n2-924.plc2.org', 'n2-925.plc2.org'] +01:== added in slice onejce_slice924 foreign ['n2-924.plc2.org', 'n2-925.plc2.org', 'n2-926.plc2.org'] +01:== added in slice onejcf_slice925 foreign ['n2-925.plc2.org', 'n2-926.plc2.org', 'n2-927.plc2.org'] +01:== added in slice onejcg_slice926 foreign ['n2-926.plc2.org', 'n2-927.plc2.org', 'n2-928.plc2.org'] +01:== added in slice onejch_slice927 foreign ['n2-927.plc2.org', 'n2-928.plc2.org', 'n2-929.plc2.org'] +01:== added in slice onejci_slice928 foreign ['n2-928.plc2.org', 'n2-929.plc2.org', 'n2-930.plc2.org'] +01:== added in slice onejcj_slice929 foreign ['n2-929.plc2.org', 'n2-930.plc2.org', 'n2-931.plc2.org'] +01:== added in slice onejda_slice930 foreign ['n2-930.plc2.org', 'n2-931.plc2.org', 'n2-932.plc2.org'] +01:== added in slice onejdb_slice931 foreign ['n2-931.plc2.org', 'n2-932.plc2.org', 'n2-933.plc2.org'] +01:== added in slice onejdc_slice932 foreign ['n2-932.plc2.org', 'n2-933.plc2.org', 'n2-934.plc2.org'] +01:== added in slice onejdd_slice933 foreign ['n2-933.plc2.org', 'n2-934.plc2.org', 'n2-935.plc2.org'] +01:== added in slice onejde_slice934 foreign ['n2-934.plc2.org', 'n2-935.plc2.org', 'n2-936.plc2.org'] +01:== added in slice onejdf_slice935 foreign ['n2-935.plc2.org', 'n2-936.plc2.org', 'n2-937.plc2.org'] +01:== added in slice onejdg_slice936 foreign ['n2-936.plc2.org', 'n2-937.plc2.org', 'n2-938.plc2.org'] +01:== added in slice onejdh_slice937 foreign ['n2-937.plc2.org', 'n2-938.plc2.org', 'n2-939.plc2.org'] +01:== added in slice onejdi_slice938 foreign ['n2-938.plc2.org', 'n2-939.plc2.org', 'n2-940.plc2.org'] +01:== added in slice onejdj_slice939 foreign ['n2-939.plc2.org', 'n2-940.plc2.org', 'n2-941.plc2.org'] +01:== added in slice onejea_slice940 foreign ['n2-940.plc2.org', 'n2-941.plc2.org', 'n2-942.plc2.org'] +01:== added in slice onejeb_slice941 foreign ['n2-941.plc2.org', 'n2-942.plc2.org', 'n2-943.plc2.org'] +01:== added in slice onejec_slice942 foreign ['n2-942.plc2.org', 'n2-943.plc2.org', 'n2-944.plc2.org'] +01:== added in slice onejed_slice943 foreign ['n2-943.plc2.org', 'n2-944.plc2.org', 'n2-945.plc2.org'] +01:== added in slice onejee_slice944 foreign ['n2-944.plc2.org', 'n2-945.plc2.org', 'n2-946.plc2.org'] +01:== added in slice onejef_slice945 foreign ['n2-945.plc2.org', 'n2-946.plc2.org', 'n2-947.plc2.org'] +01:== added in slice onejeg_slice946 foreign ['n2-946.plc2.org', 'n2-947.plc2.org', 'n2-948.plc2.org'] +01:== added in slice onejeh_slice947 foreign ['n2-947.plc2.org', 'n2-948.plc2.org', 'n2-949.plc2.org'] +01:== added in slice onejei_slice948 foreign ['n2-948.plc2.org', 'n2-949.plc2.org', 'n2-950.plc2.org'] +01:== added in slice onejej_slice949 foreign ['n2-949.plc2.org', 'n2-950.plc2.org', 'n2-951.plc2.org'] +01:== added in slice onejfa_slice950 foreign ['n2-950.plc2.org', 'n2-951.plc2.org', 'n2-952.plc2.org'] +01:== added in slice onejfb_slice951 foreign ['n2-951.plc2.org', 'n2-952.plc2.org', 'n2-953.plc2.org'] +01:== added in slice onejfc_slice952 foreign ['n2-952.plc2.org', 'n2-953.plc2.org', 'n2-954.plc2.org'] +01:== added in slice onejfd_slice953 foreign ['n2-953.plc2.org', 'n2-954.plc2.org', 'n2-955.plc2.org'] +01:== added in slice onejfe_slice954 foreign ['n2-954.plc2.org', 'n2-955.plc2.org', 'n2-956.plc2.org'] +01:== added in slice onejff_slice955 foreign ['n2-955.plc2.org', 'n2-956.plc2.org', 'n2-957.plc2.org'] +01:== added in slice onejfg_slice956 foreign ['n2-956.plc2.org', 'n2-957.plc2.org', 'n2-958.plc2.org'] +01:== added in slice onejfh_slice957 foreign ['n2-957.plc2.org', 'n2-958.plc2.org', 'n2-959.plc2.org'] +01:== added in slice onejfi_slice958 foreign ['n2-958.plc2.org', 'n2-959.plc2.org', 'n2-960.plc2.org'] +01:== added in slice onejfj_slice959 foreign ['n2-959.plc2.org', 'n2-960.plc2.org', 'n2-961.plc2.org'] +01:== added in slice onejga_slice960 foreign ['n2-960.plc2.org', 'n2-961.plc2.org', 'n2-962.plc2.org'] +01:== added in slice onejgb_slice961 foreign ['n2-961.plc2.org', 'n2-962.plc2.org', 'n2-963.plc2.org'] +01:== added in slice onejgc_slice962 foreign ['n2-962.plc2.org', 'n2-963.plc2.org', 'n2-964.plc2.org'] +01:== added in slice onejgd_slice963 foreign ['n2-963.plc2.org', 'n2-964.plc2.org', 'n2-965.plc2.org'] +01:== added in slice onejge_slice964 foreign ['n2-964.plc2.org', 'n2-965.plc2.org', 'n2-966.plc2.org'] +01:== added in slice onejgf_slice965 foreign ['n2-965.plc2.org', 'n2-966.plc2.org', 'n2-967.plc2.org'] +01:== added in slice onejgg_slice966 foreign ['n2-966.plc2.org', 'n2-967.plc2.org', 'n2-968.plc2.org'] +01:== added in slice onejgh_slice967 foreign ['n2-967.plc2.org', 'n2-968.plc2.org', 'n2-969.plc2.org'] +01:== added in slice onejgi_slice968 foreign ['n2-968.plc2.org', 'n2-969.plc2.org', 'n2-970.plc2.org'] +01:== added in slice onejgj_slice969 foreign ['n2-969.plc2.org', 'n2-970.plc2.org', 'n2-971.plc2.org'] +01:== added in slice onejha_slice970 foreign ['n2-970.plc2.org', 'n2-971.plc2.org', 'n2-972.plc2.org'] +01:== added in slice onejhb_slice971 foreign ['n2-971.plc2.org', 'n2-972.plc2.org', 'n2-973.plc2.org'] +01:== added in slice onejhc_slice972 foreign ['n2-972.plc2.org', 'n2-973.plc2.org', 'n2-974.plc2.org'] +01:== added in slice onejhd_slice973 foreign ['n2-973.plc2.org', 'n2-974.plc2.org', 'n2-975.plc2.org'] +01:== added in slice onejhe_slice974 foreign ['n2-974.plc2.org', 'n2-975.plc2.org', 'n2-976.plc2.org'] +01:== added in slice onejhf_slice975 foreign ['n2-975.plc2.org', 'n2-976.plc2.org', 'n2-977.plc2.org'] +01:== added in slice onejhg_slice976 foreign ['n2-976.plc2.org', 'n2-977.plc2.org', 'n2-978.plc2.org'] +01:== added in slice onejhh_slice977 foreign ['n2-977.plc2.org', 'n2-978.plc2.org', 'n2-979.plc2.org'] +01:== added in slice onejhi_slice978 foreign ['n2-978.plc2.org', 'n2-979.plc2.org', 'n2-980.plc2.org'] +01:== added in slice onejhj_slice979 foreign ['n2-979.plc2.org', 'n2-980.plc2.org', 'n2-981.plc2.org'] +01:== added in slice onejia_slice980 foreign ['n2-980.plc2.org', 'n2-981.plc2.org', 'n2-982.plc2.org'] +01:== added in slice onejib_slice981 foreign ['n2-981.plc2.org', 'n2-982.plc2.org', 'n2-983.plc2.org'] +01:== added in slice onejic_slice982 foreign ['n2-982.plc2.org', 'n2-983.plc2.org', 'n2-984.plc2.org'] +01:== added in slice onejid_slice983 foreign ['n2-983.plc2.org', 'n2-984.plc2.org', 'n2-985.plc2.org'] +01:== added in slice onejie_slice984 foreign ['n2-984.plc2.org', 'n2-985.plc2.org', 'n2-986.plc2.org'] +01:== added in slice onejif_slice985 foreign ['n2-985.plc2.org', 'n2-986.plc2.org', 'n2-987.plc2.org'] +01:== added in slice onejig_slice986 foreign ['n2-986.plc2.org', 'n2-987.plc2.org', 'n2-988.plc2.org'] +01:== added in slice onejih_slice987 foreign ['n2-987.plc2.org', 'n2-988.plc2.org', 'n2-989.plc2.org'] +01:== added in slice onejii_slice988 foreign ['n2-988.plc2.org', 'n2-989.plc2.org', 'n2-990.plc2.org'] +01:== added in slice onejij_slice989 foreign ['n2-989.plc2.org', 'n2-990.plc2.org', 'n2-991.plc2.org'] +01:== added in slice onejja_slice990 foreign ['n2-990.plc2.org', 'n2-991.plc2.org', 'n2-992.plc2.org'] +01:== added in slice onejjb_slice991 foreign ['n2-991.plc2.org', 'n2-992.plc2.org', 'n2-993.plc2.org'] +01:== added in slice onejjc_slice992 foreign ['n2-992.plc2.org', 'n2-993.plc2.org', 'n2-994.plc2.org'] +01:== added in slice onejjd_slice993 foreign ['n2-993.plc2.org', 'n2-994.plc2.org', 'n2-995.plc2.org'] +01:== added in slice onejje_slice994 foreign ['n2-994.plc2.org', 'n2-995.plc2.org', 'n2-996.plc2.org'] +01:== added in slice onejjf_slice995 foreign ['n2-995.plc2.org', 'n2-996.plc2.org', 'n2-997.plc2.org'] +01:== added in slice onejjg_slice996 foreign ['n2-996.plc2.org', 'n2-997.plc2.org', 'n2-998.plc2.org'] +01:== added in slice onejjh_slice997 foreign ['n2-997.plc2.org', 'n2-998.plc2.org', 'n2-999.plc2.org'] +01:== added in slice onejji_slice998 foreign ['n2-998.plc2.org', 'n2-999.plc2.org', 'n2-1000.plc2.org'] +01:== added in slice onejjj_slice999 foreign ['n2-999.plc2.org', 'n2-1000.plc2.org', 'n2-1001.plc2.org'] +01:== added in slice onebaaa_slice1000 foreign ['n2-1000.plc2.org', 'n2-1001.plc2.org', 'n2-1002.plc2.org'] +01:== added in slice oneb_slice1001 foreign ['n2-1001.plc2.org', 'n2-1002.plc2.org', 'n2-1003.plc2.org'] +01:== added in slice onec_slice1002 foreign ['n2-1002.plc2.org', 'n2-1003.plc2.org', 'n2-1004.plc2.org'] +01:== added in slice oned_slice1003 foreign ['n2-1003.plc2.org', 'n2-1004.plc2.org', 'n2-1005.plc2.org'] +01:== added in slice onee_slice1004 foreign ['n2-1004.plc2.org', 'n2-1005.plc2.org', 'n2-1006.plc2.org'] +01:== added in slice onef_slice1005 foreign ['n2-1005.plc2.org', 'n2-1006.plc2.org', 'n2-1007.plc2.org'] +01:== added in slice oneg_slice1006 foreign ['n2-1006.plc2.org', 'n2-1007.plc2.org', 'n2-1008.plc2.org'] +01:== added in slice oneh_slice1007 foreign ['n2-1007.plc2.org', 'n2-1008.plc2.org', 'n2-1009.plc2.org'] +01:== added in slice onei_slice1008 foreign ['n2-1008.plc2.org', 'n2-1009.plc2.org', 'n2-1010.plc2.org'] +01:== added in slice onej_slice1009 foreign ['n2-1009.plc2.org', 'n2-1010.plc2.org', 'n2-1011.plc2.org'] +01:== added in slice oneba_slice1010 foreign ['n2-1010.plc2.org', 'n2-1011.plc2.org', 'n2-1012.plc2.org'] +01:== added in slice onebb_slice1011 foreign ['n2-1011.plc2.org', 'n2-1012.plc2.org', 'n2-1013.plc2.org'] +01:== added in slice onebc_slice1012 foreign ['n2-1012.plc2.org', 'n2-1013.plc2.org', 'n2-1014.plc2.org'] +01:== added in slice onebd_slice1013 foreign ['n2-1013.plc2.org', 'n2-1014.plc2.org', 'n2-1015.plc2.org'] +01:== added in slice onebe_slice1014 foreign ['n2-1014.plc2.org', 'n2-1015.plc2.org', 'n2-1016.plc2.org'] +01:== added in slice onebf_slice1015 foreign ['n2-1015.plc2.org', 'n2-1016.plc2.org', 'n2-1017.plc2.org'] +01:== added in slice onebg_slice1016 foreign ['n2-1016.plc2.org', 'n2-1017.plc2.org', 'n2-1018.plc2.org'] +01:== added in slice onebh_slice1017 foreign ['n2-1017.plc2.org', 'n2-1018.plc2.org', 'n2-1019.plc2.org'] +01:== added in slice onebi_slice1018 foreign ['n2-1018.plc2.org', 'n2-1019.plc2.org', 'n2-1020.plc2.org'] +01:== added in slice onebj_slice1019 foreign ['n2-1019.plc2.org', 'n2-1020.plc2.org', 'n2-1021.plc2.org'] +01:== added in slice oneca_slice1020 foreign ['n2-1020.plc2.org', 'n2-1021.plc2.org', 'n2-1022.plc2.org'] +01:== added in slice onecb_slice1021 foreign ['n2-1021.plc2.org', 'n2-1022.plc2.org', 'n2-1023.plc2.org'] +01:== added in slice onecc_slice1022 foreign ['n2-1022.plc2.org', 'n2-1023.plc2.org', 'n2-1024.plc2.org'] +01:== added in slice onecd_slice1023 foreign ['n2-1023.plc2.org', 'n2-1024.plc2.org', 'n2-1025.plc2.org'] +01:== added in slice onece_slice1024 foreign ['n2-1024.plc2.org', 'n2-1025.plc2.org', 'n2-1026.plc2.org'] +01:== added in slice onecf_slice1025 foreign ['n2-1025.plc2.org', 'n2-1026.plc2.org', 'n2-1027.plc2.org'] +01:== added in slice onecg_slice1026 foreign ['n2-1026.plc2.org', 'n2-1027.plc2.org', 'n2-1028.plc2.org'] +01:== added in slice onech_slice1027 foreign ['n2-1027.plc2.org', 'n2-1028.plc2.org', 'n2-1029.plc2.org'] +01:== added in slice oneci_slice1028 foreign ['n2-1028.plc2.org', 'n2-1029.plc2.org', 'n2-1030.plc2.org'] +01:== added in slice onecj_slice1029 foreign ['n2-1029.plc2.org', 'n2-1030.plc2.org', 'n2-1031.plc2.org'] +01:== added in slice oneda_slice1030 foreign ['n2-1030.plc2.org', 'n2-1031.plc2.org', 'n2-1032.plc2.org'] +01:== added in slice onedb_slice1031 foreign ['n2-1031.plc2.org', 'n2-1032.plc2.org', 'n2-1033.plc2.org'] +01:== added in slice onedc_slice1032 foreign ['n2-1032.plc2.org', 'n2-1033.plc2.org', 'n2-1034.plc2.org'] +01:== added in slice onedd_slice1033 foreign ['n2-1033.plc2.org', 'n2-1034.plc2.org', 'n2-1035.plc2.org'] +01:== added in slice onede_slice1034 foreign ['n2-1034.plc2.org', 'n2-1035.plc2.org', 'n2-1036.plc2.org'] +01:== added in slice onedf_slice1035 foreign ['n2-1035.plc2.org', 'n2-1036.plc2.org', 'n2-1037.plc2.org'] +01:== added in slice onedg_slice1036 foreign ['n2-1036.plc2.org', 'n2-1037.plc2.org', 'n2-1038.plc2.org'] +01:== added in slice onedh_slice1037 foreign ['n2-1037.plc2.org', 'n2-1038.plc2.org', 'n2-1039.plc2.org'] +01:== added in slice onedi_slice1038 foreign ['n2-1038.plc2.org', 'n2-1039.plc2.org', 'n2-1040.plc2.org'] +01:== added in slice onedj_slice1039 foreign ['n2-1039.plc2.org', 'n2-1040.plc2.org', 'n2-1041.plc2.org'] +01:== added in slice oneea_slice1040 foreign ['n2-1040.plc2.org', 'n2-1041.plc2.org', 'n2-1042.plc2.org'] +01:== added in slice oneeb_slice1041 foreign ['n2-1041.plc2.org', 'n2-1042.plc2.org', 'n2-1043.plc2.org'] +01:== added in slice oneec_slice1042 foreign ['n2-1042.plc2.org', 'n2-1043.plc2.org', 'n2-1044.plc2.org'] +01:== added in slice oneed_slice1043 foreign ['n2-1043.plc2.org', 'n2-1044.plc2.org', 'n2-1045.plc2.org'] +01:== added in slice oneee_slice1044 foreign ['n2-1044.plc2.org', 'n2-1045.plc2.org', 'n2-1046.plc2.org'] +01:== added in slice oneef_slice1045 foreign ['n2-1045.plc2.org', 'n2-1046.plc2.org', 'n2-1047.plc2.org'] +01:== added in slice oneeg_slice1046 foreign ['n2-1046.plc2.org', 'n2-1047.plc2.org', 'n2-1048.plc2.org'] +01:== added in slice oneeh_slice1047 foreign ['n2-1047.plc2.org', 'n2-1048.plc2.org', 'n2-1049.plc2.org'] +01:== added in slice oneei_slice1048 foreign ['n2-1048.plc2.org', 'n2-1049.plc2.org', 'n2-1050.plc2.org'] +01:== added in slice oneej_slice1049 foreign ['n2-1049.plc2.org', 'n2-1050.plc2.org', 'n2-1051.plc2.org'] +01:== added in slice onefa_slice1050 foreign ['n2-1050.plc2.org', 'n2-1051.plc2.org', 'n2-1052.plc2.org'] +01:== added in slice onefb_slice1051 foreign ['n2-1051.plc2.org', 'n2-1052.plc2.org', 'n2-1053.plc2.org'] +01:== added in slice onefc_slice1052 foreign ['n2-1052.plc2.org', 'n2-1053.plc2.org', 'n2-1054.plc2.org'] +01:== added in slice onefd_slice1053 foreign ['n2-1053.plc2.org', 'n2-1054.plc2.org', 'n2-1055.plc2.org'] +01:== added in slice onefe_slice1054 foreign ['n2-1054.plc2.org', 'n2-1055.plc2.org', 'n2-1056.plc2.org'] +01:== added in slice oneff_slice1055 foreign ['n2-1055.plc2.org', 'n2-1056.plc2.org', 'n2-1057.plc2.org'] +01:== added in slice onefg_slice1056 foreign ['n2-1056.plc2.org', 'n2-1057.plc2.org', 'n2-1058.plc2.org'] +01:== added in slice onefh_slice1057 foreign ['n2-1057.plc2.org', 'n2-1058.plc2.org', 'n2-1059.plc2.org'] +01:== added in slice onefi_slice1058 foreign ['n2-1058.plc2.org', 'n2-1059.plc2.org', 'n2-1060.plc2.org'] +01:== added in slice onefj_slice1059 foreign ['n2-1059.plc2.org', 'n2-1060.plc2.org', 'n2-1061.plc2.org'] +01:== added in slice onega_slice1060 foreign ['n2-1060.plc2.org', 'n2-1061.plc2.org', 'n2-1062.plc2.org'] +01:== added in slice onegb_slice1061 foreign ['n2-1061.plc2.org', 'n2-1062.plc2.org', 'n2-1063.plc2.org'] +01:== added in slice onegc_slice1062 foreign ['n2-1062.plc2.org', 'n2-1063.plc2.org', 'n2-1064.plc2.org'] +01:== added in slice onegd_slice1063 foreign ['n2-1063.plc2.org', 'n2-1064.plc2.org', 'n2-1065.plc2.org'] +01:== added in slice onege_slice1064 foreign ['n2-1064.plc2.org', 'n2-1065.plc2.org', 'n2-1066.plc2.org'] +01:== added in slice onegf_slice1065 foreign ['n2-1065.plc2.org', 'n2-1066.plc2.org', 'n2-1067.plc2.org'] +01:== added in slice onegg_slice1066 foreign ['n2-1066.plc2.org', 'n2-1067.plc2.org', 'n2-1068.plc2.org'] +01:== added in slice onegh_slice1067 foreign ['n2-1067.plc2.org', 'n2-1068.plc2.org', 'n2-1069.plc2.org'] +01:== added in slice onegi_slice1068 foreign ['n2-1068.plc2.org', 'n2-1069.plc2.org', 'n2-1070.plc2.org'] +01:== added in slice onegj_slice1069 foreign ['n2-1069.plc2.org', 'n2-1070.plc2.org', 'n2-1071.plc2.org'] +01:== added in slice oneha_slice1070 foreign ['n2-1070.plc2.org', 'n2-1071.plc2.org', 'n2-1072.plc2.org'] +01:== added in slice onehb_slice1071 foreign ['n2-1071.plc2.org', 'n2-1072.plc2.org', 'n2-1073.plc2.org'] +01:== added in slice onehc_slice1072 foreign ['n2-1072.plc2.org', 'n2-1073.plc2.org', 'n2-1074.plc2.org'] +01:== added in slice onehd_slice1073 foreign ['n2-1073.plc2.org', 'n2-1074.plc2.org', 'n2-1075.plc2.org'] +01:== added in slice onehe_slice1074 foreign ['n2-1074.plc2.org', 'n2-1075.plc2.org', 'n2-1076.plc2.org'] +01:== added in slice onehf_slice1075 foreign ['n2-1075.plc2.org', 'n2-1076.plc2.org', 'n2-1077.plc2.org'] +01:== added in slice onehg_slice1076 foreign ['n2-1076.plc2.org', 'n2-1077.plc2.org', 'n2-1078.plc2.org'] +01:== added in slice onehh_slice1077 foreign ['n2-1077.plc2.org', 'n2-1078.plc2.org', 'n2-1079.plc2.org'] +01:== added in slice onehi_slice1078 foreign ['n2-1078.plc2.org', 'n2-1079.plc2.org', 'n2-1080.plc2.org'] +01:== added in slice onehj_slice1079 foreign ['n2-1079.plc2.org', 'n2-1080.plc2.org', 'n2-1081.plc2.org'] +01:== added in slice oneia_slice1080 foreign ['n2-1080.plc2.org', 'n2-1081.plc2.org', 'n2-1082.plc2.org'] +01:== added in slice oneib_slice1081 foreign ['n2-1081.plc2.org', 'n2-1082.plc2.org', 'n2-1083.plc2.org'] +01:== added in slice oneic_slice1082 foreign ['n2-1082.plc2.org', 'n2-1083.plc2.org', 'n2-1084.plc2.org'] +01:== added in slice oneid_slice1083 foreign ['n2-1083.plc2.org', 'n2-1084.plc2.org', 'n2-1085.plc2.org'] +01:== added in slice oneie_slice1084 foreign ['n2-1084.plc2.org', 'n2-1085.plc2.org', 'n2-1086.plc2.org'] +01:== added in slice oneif_slice1085 foreign ['n2-1085.plc2.org', 'n2-1086.plc2.org', 'n2-1087.plc2.org'] +01:== added in slice oneig_slice1086 foreign ['n2-1086.plc2.org', 'n2-1087.plc2.org', 'n2-1088.plc2.org'] +01:== added in slice oneih_slice1087 foreign ['n2-1087.plc2.org', 'n2-1088.plc2.org', 'n2-1089.plc2.org'] +01:== added in slice oneii_slice1088 foreign ['n2-1088.plc2.org', 'n2-1089.plc2.org', 'n2-1090.plc2.org'] +01:== added in slice oneij_slice1089 foreign ['n2-1089.plc2.org', 'n2-1090.plc2.org', 'n2-1091.plc2.org'] +01:== added in slice oneja_slice1090 foreign ['n2-1090.plc2.org', 'n2-1091.plc2.org', 'n2-1092.plc2.org'] +01:== added in slice onejb_slice1091 foreign ['n2-1091.plc2.org', 'n2-1092.plc2.org', 'n2-1093.plc2.org'] +01:== added in slice onejc_slice1092 foreign ['n2-1092.plc2.org', 'n2-1093.plc2.org', 'n2-1094.plc2.org'] +01:== added in slice onejd_slice1093 foreign ['n2-1093.plc2.org', 'n2-1094.plc2.org', 'n2-1095.plc2.org'] +01:== added in slice oneje_slice1094 foreign ['n2-1094.plc2.org', 'n2-1095.plc2.org', 'n2-1096.plc2.org'] +01:== added in slice onejf_slice1095 foreign ['n2-1095.plc2.org', 'n2-1096.plc2.org', 'n2-1097.plc2.org'] +01:== added in slice onejg_slice1096 foreign ['n2-1096.plc2.org', 'n2-1097.plc2.org', 'n2-1098.plc2.org'] +01:== added in slice onejh_slice1097 foreign ['n2-1097.plc2.org', 'n2-1098.plc2.org', 'n2-1099.plc2.org'] +01:== added in slice oneji_slice1098 foreign ['n2-1098.plc2.org', 'n2-1099.plc2.org', 'n2-1100.plc2.org'] +01:== added in slice onejj_slice1099 foreign ['n2-1099.plc2.org', 'n2-1100.plc2.org', 'n2-1101.plc2.org'] +01:== added in slice onebaa_slice1100 foreign ['n2-1100.plc2.org', 'n2-1101.plc2.org', 'n2-1102.plc2.org'] +01:== added in slice onebab_slice1101 foreign ['n2-1101.plc2.org', 'n2-1102.plc2.org', 'n2-1103.plc2.org'] +01:== added in slice onebac_slice1102 foreign ['n2-1102.plc2.org', 'n2-1103.plc2.org', 'n2-1104.plc2.org'] +01:== added in slice onebad_slice1103 foreign ['n2-1103.plc2.org', 'n2-1104.plc2.org', 'n2-1105.plc2.org'] +01:== added in slice onebae_slice1104 foreign ['n2-1104.plc2.org', 'n2-1105.plc2.org', 'n2-1106.plc2.org'] +01:== added in slice onebaf_slice1105 foreign ['n2-1105.plc2.org', 'n2-1106.plc2.org', 'n2-1107.plc2.org'] +01:== added in slice onebag_slice1106 foreign ['n2-1106.plc2.org', 'n2-1107.plc2.org', 'n2-1108.plc2.org'] +01:== added in slice onebah_slice1107 foreign ['n2-1107.plc2.org', 'n2-1108.plc2.org', 'n2-1109.plc2.org'] +01:== added in slice onebai_slice1108 foreign ['n2-1108.plc2.org', 'n2-1109.plc2.org', 'n2-1110.plc2.org'] +01:== added in slice onebaj_slice1109 foreign ['n2-1109.plc2.org', 'n2-1110.plc2.org', 'n2-1111.plc2.org'] +01:== added in slice onebba_slice1110 foreign ['n2-1110.plc2.org', 'n2-1111.plc2.org', 'n2-1112.plc2.org'] +01:== added in slice onebbb_slice1111 foreign ['n2-1111.plc2.org', 'n2-1112.plc2.org', 'n2-1113.plc2.org'] +01:== added in slice onebbc_slice1112 foreign ['n2-1112.plc2.org', 'n2-1113.plc2.org', 'n2-1114.plc2.org'] +01:== added in slice onebbd_slice1113 foreign ['n2-1113.plc2.org', 'n2-1114.plc2.org', 'n2-1115.plc2.org'] +01:== added in slice onebbe_slice1114 foreign ['n2-1114.plc2.org', 'n2-1115.plc2.org', 'n2-1116.plc2.org'] +01:== added in slice onebbf_slice1115 foreign ['n2-1115.plc2.org', 'n2-1116.plc2.org', 'n2-1117.plc2.org'] +01:== added in slice onebbg_slice1116 foreign ['n2-1116.plc2.org', 'n2-1117.plc2.org', 'n2-1118.plc2.org'] +01:== added in slice onebbh_slice1117 foreign ['n2-1117.plc2.org', 'n2-1118.plc2.org', 'n2-1119.plc2.org'] +01:== added in slice onebbi_slice1118 foreign ['n2-1118.plc2.org', 'n2-1119.plc2.org', 'n2-1120.plc2.org'] +01:== added in slice onebbj_slice1119 foreign ['n2-1119.plc2.org', 'n2-1120.plc2.org', 'n2-1121.plc2.org'] +01:== added in slice onebca_slice1120 foreign ['n2-1120.plc2.org', 'n2-1121.plc2.org', 'n2-1122.plc2.org'] +01:== added in slice onebcb_slice1121 foreign ['n2-1121.plc2.org', 'n2-1122.plc2.org', 'n2-1123.plc2.org'] +01:== added in slice onebcc_slice1122 foreign ['n2-1122.plc2.org', 'n2-1123.plc2.org', 'n2-1124.plc2.org'] +01:== added in slice onebcd_slice1123 foreign ['n2-1123.plc2.org', 'n2-1124.plc2.org', 'n2-1125.plc2.org'] +01:== added in slice onebce_slice1124 foreign ['n2-1124.plc2.org', 'n2-1125.plc2.org', 'n2-1126.plc2.org'] +01:== added in slice onebcf_slice1125 foreign ['n2-1125.plc2.org', 'n2-1126.plc2.org', 'n2-1127.plc2.org'] +01:== added in slice onebcg_slice1126 foreign ['n2-1126.plc2.org', 'n2-1127.plc2.org', 'n2-1128.plc2.org'] +01:== added in slice onebch_slice1127 foreign ['n2-1127.plc2.org', 'n2-1128.plc2.org', 'n2-1129.plc2.org'] +01:== added in slice onebci_slice1128 foreign ['n2-1128.plc2.org', 'n2-1129.plc2.org', 'n2-1130.plc2.org'] +01:== added in slice onebcj_slice1129 foreign ['n2-1129.plc2.org', 'n2-1130.plc2.org', 'n2-1131.plc2.org'] +01:== added in slice onebda_slice1130 foreign ['n2-1130.plc2.org', 'n2-1131.plc2.org', 'n2-1132.plc2.org'] +01:== added in slice onebdb_slice1131 foreign ['n2-1131.plc2.org', 'n2-1132.plc2.org', 'n2-1133.plc2.org'] +01:== added in slice onebdc_slice1132 foreign ['n2-1132.plc2.org', 'n2-1133.plc2.org', 'n2-1134.plc2.org'] +01:== added in slice onebdd_slice1133 foreign ['n2-1133.plc2.org', 'n2-1134.plc2.org', 'n2-1135.plc2.org'] +01:== added in slice onebde_slice1134 foreign ['n2-1134.plc2.org', 'n2-1135.plc2.org', 'n2-1136.plc2.org'] +01:== added in slice onebdf_slice1135 foreign ['n2-1135.plc2.org', 'n2-1136.plc2.org', 'n2-1137.plc2.org'] +01:== added in slice onebdg_slice1136 foreign ['n2-1136.plc2.org', 'n2-1137.plc2.org', 'n2-1138.plc2.org'] +01:== added in slice onebdh_slice1137 foreign ['n2-1137.plc2.org', 'n2-1138.plc2.org', 'n2-1139.plc2.org'] +01:== added in slice onebdi_slice1138 foreign ['n2-1138.plc2.org', 'n2-1139.plc2.org', 'n2-1140.plc2.org'] +01:== added in slice onebdj_slice1139 foreign ['n2-1139.plc2.org', 'n2-1140.plc2.org', 'n2-1141.plc2.org'] +01:== added in slice onebea_slice1140 foreign ['n2-1140.plc2.org', 'n2-1141.plc2.org', 'n2-1142.plc2.org'] +01:== added in slice onebeb_slice1141 foreign ['n2-1141.plc2.org', 'n2-1142.plc2.org', 'n2-1143.plc2.org'] +01:== added in slice onebec_slice1142 foreign ['n2-1142.plc2.org', 'n2-1143.plc2.org', 'n2-1144.plc2.org'] +01:== added in slice onebed_slice1143 foreign ['n2-1143.plc2.org', 'n2-1144.plc2.org', 'n2-1145.plc2.org'] +01:== added in slice onebee_slice1144 foreign ['n2-1144.plc2.org', 'n2-1145.plc2.org', 'n2-1146.plc2.org'] +01:== added in slice onebef_slice1145 foreign ['n2-1145.plc2.org', 'n2-1146.plc2.org', 'n2-1147.plc2.org'] +01:== added in slice onebeg_slice1146 foreign ['n2-1146.plc2.org', 'n2-1147.plc2.org', 'n2-1148.plc2.org'] +01:== added in slice onebeh_slice1147 foreign ['n2-1147.plc2.org', 'n2-1148.plc2.org', 'n2-1149.plc2.org'] +01:== added in slice onebei_slice1148 foreign ['n2-1148.plc2.org', 'n2-1149.plc2.org', 'n2-1150.plc2.org'] +01:== added in slice onebej_slice1149 foreign ['n2-1149.plc2.org', 'n2-1150.plc2.org', 'n2-1151.plc2.org'] +01:== added in slice onebfa_slice1150 foreign ['n2-1150.plc2.org', 'n2-1151.plc2.org', 'n2-1152.plc2.org'] +01:== added in slice onebfb_slice1151 foreign ['n2-1151.plc2.org', 'n2-1152.plc2.org', 'n2-1153.plc2.org'] +01:== added in slice onebfc_slice1152 foreign ['n2-1152.plc2.org', 'n2-1153.plc2.org', 'n2-1154.plc2.org'] +01:== added in slice onebfd_slice1153 foreign ['n2-1153.plc2.org', 'n2-1154.plc2.org', 'n2-1155.plc2.org'] +01:== added in slice onebfe_slice1154 foreign ['n2-1154.plc2.org', 'n2-1155.plc2.org', 'n2-1156.plc2.org'] +01:== added in slice onebff_slice1155 foreign ['n2-1155.plc2.org', 'n2-1156.plc2.org', 'n2-1157.plc2.org'] +01:== added in slice onebfg_slice1156 foreign ['n2-1156.plc2.org', 'n2-1157.plc2.org', 'n2-1158.plc2.org'] +01:== added in slice onebfh_slice1157 foreign ['n2-1157.plc2.org', 'n2-1158.plc2.org', 'n2-1159.plc2.org'] +01:== added in slice onebfi_slice1158 foreign ['n2-1158.plc2.org', 'n2-1159.plc2.org', 'n2-1160.plc2.org'] +01:== added in slice onebfj_slice1159 foreign ['n2-1159.plc2.org', 'n2-1160.plc2.org', 'n2-1161.plc2.org'] +01:== added in slice onebga_slice1160 foreign ['n2-1160.plc2.org', 'n2-1161.plc2.org', 'n2-1162.plc2.org'] +01:== added in slice onebgb_slice1161 foreign ['n2-1161.plc2.org', 'n2-1162.plc2.org', 'n2-1163.plc2.org'] +01:== added in slice onebgc_slice1162 foreign ['n2-1162.plc2.org', 'n2-1163.plc2.org', 'n2-1164.plc2.org'] +01:== added in slice onebgd_slice1163 foreign ['n2-1163.plc2.org', 'n2-1164.plc2.org', 'n2-1165.plc2.org'] +01:== added in slice onebge_slice1164 foreign ['n2-1164.plc2.org', 'n2-1165.plc2.org', 'n2-1166.plc2.org'] +01:== added in slice onebgf_slice1165 foreign ['n2-1165.plc2.org', 'n2-1166.plc2.org', 'n2-1167.plc2.org'] +01:== added in slice onebgg_slice1166 foreign ['n2-1166.plc2.org', 'n2-1167.plc2.org', 'n2-1168.plc2.org'] +01:== added in slice onebgh_slice1167 foreign ['n2-1167.plc2.org', 'n2-1168.plc2.org', 'n2-1169.plc2.org'] +01:== added in slice onebgi_slice1168 foreign ['n2-1168.plc2.org', 'n2-1169.plc2.org', 'n2-1170.plc2.org'] +01:== added in slice onebgj_slice1169 foreign ['n2-1169.plc2.org', 'n2-1170.plc2.org', 'n2-1171.plc2.org'] +01:== added in slice onebha_slice1170 foreign ['n2-1170.plc2.org', 'n2-1171.plc2.org', 'n2-1172.plc2.org'] +01:== added in slice onebhb_slice1171 foreign ['n2-1171.plc2.org', 'n2-1172.plc2.org', 'n2-1173.plc2.org'] +01:== added in slice onebhc_slice1172 foreign ['n2-1172.plc2.org', 'n2-1173.plc2.org', 'n2-1174.plc2.org'] +01:== added in slice onebhd_slice1173 foreign ['n2-1173.plc2.org', 'n2-1174.plc2.org', 'n2-1175.plc2.org'] +01:== added in slice onebhe_slice1174 foreign ['n2-1174.plc2.org', 'n2-1175.plc2.org', 'n2-1176.plc2.org'] +01:== added in slice onebhf_slice1175 foreign ['n2-1175.plc2.org', 'n2-1176.plc2.org', 'n2-1177.plc2.org'] +01:== added in slice onebhg_slice1176 foreign ['n2-1176.plc2.org', 'n2-1177.plc2.org', 'n2-1178.plc2.org'] +01:== added in slice onebhh_slice1177 foreign ['n2-1177.plc2.org', 'n2-1178.plc2.org', 'n2-1179.plc2.org'] +01:== added in slice onebhi_slice1178 foreign ['n2-1178.plc2.org', 'n2-1179.plc2.org', 'n2-1180.plc2.org'] +01:== added in slice onebhj_slice1179 foreign ['n2-1179.plc2.org', 'n2-1180.plc2.org', 'n2-1181.plc2.org'] +01:== added in slice onebia_slice1180 foreign ['n2-1180.plc2.org', 'n2-1181.plc2.org', 'n2-1182.plc2.org'] +01:== added in slice onebib_slice1181 foreign ['n2-1181.plc2.org', 'n2-1182.plc2.org', 'n2-1183.plc2.org'] +01:== added in slice onebic_slice1182 foreign ['n2-1182.plc2.org', 'n2-1183.plc2.org', 'n2-1184.plc2.org'] +01:== added in slice onebid_slice1183 foreign ['n2-1183.plc2.org', 'n2-1184.plc2.org', 'n2-1185.plc2.org'] +01:== added in slice onebie_slice1184 foreign ['n2-1184.plc2.org', 'n2-1185.plc2.org', 'n2-1186.plc2.org'] +01:== added in slice onebif_slice1185 foreign ['n2-1185.plc2.org', 'n2-1186.plc2.org', 'n2-1187.plc2.org'] +01:== added in slice onebig_slice1186 foreign ['n2-1186.plc2.org', 'n2-1187.plc2.org', 'n2-1188.plc2.org'] +01:== added in slice onebih_slice1187 foreign ['n2-1187.plc2.org', 'n2-1188.plc2.org', 'n2-1189.plc2.org'] +01:== added in slice onebii_slice1188 foreign ['n2-1188.plc2.org', 'n2-1189.plc2.org', 'n2-1190.plc2.org'] +01:== added in slice onebij_slice1189 foreign ['n2-1189.plc2.org', 'n2-1190.plc2.org', 'n2-1191.plc2.org'] +01:== added in slice onebja_slice1190 foreign ['n2-1190.plc2.org', 'n2-1191.plc2.org', 'n2-1192.plc2.org'] +01:== added in slice onebjb_slice1191 foreign ['n2-1191.plc2.org', 'n2-1192.plc2.org', 'n2-1193.plc2.org'] +01:== added in slice onebjc_slice1192 foreign ['n2-1192.plc2.org', 'n2-1193.plc2.org', 'n2-1194.plc2.org'] +01:== added in slice onebjd_slice1193 foreign ['n2-1193.plc2.org', 'n2-1194.plc2.org', 'n2-1195.plc2.org'] +01:== added in slice onebje_slice1194 foreign ['n2-1194.plc2.org', 'n2-1195.plc2.org', 'n2-1196.plc2.org'] +01:== added in slice onebjf_slice1195 foreign ['n2-1195.plc2.org', 'n2-1196.plc2.org', 'n2-1197.plc2.org'] +01:== added in slice onebjg_slice1196 foreign ['n2-1196.plc2.org', 'n2-1197.plc2.org', 'n2-1198.plc2.org'] +01:== added in slice onebjh_slice1197 foreign ['n2-1197.plc2.org', 'n2-1198.plc2.org', 'n2-1199.plc2.org'] +01:== added in slice onebji_slice1198 foreign ['n2-1198.plc2.org', 'n2-1199.plc2.org', 'n2-1200.plc2.org'] +01:== added in slice onebjj_slice1199 foreign ['n2-1199.plc2.org', 'n2-1200.plc2.org', 'n2-1201.plc2.org'] +01:== added in slice onecaa_slice1200 foreign ['n2-1200.plc2.org', 'n2-1201.plc2.org', 'n2-1202.plc2.org'] +01:== added in slice onecab_slice1201 foreign ['n2-1201.plc2.org', 'n2-1202.plc2.org', 'n2-1203.plc2.org'] +01:== added in slice onecac_slice1202 foreign ['n2-1202.plc2.org', 'n2-1203.plc2.org', 'n2-1204.plc2.org'] +01:== added in slice onecad_slice1203 foreign ['n2-1203.plc2.org', 'n2-1204.plc2.org', 'n2-1205.plc2.org'] +01:== added in slice onecae_slice1204 foreign ['n2-1204.plc2.org', 'n2-1205.plc2.org', 'n2-1206.plc2.org'] +01:== added in slice onecaf_slice1205 foreign ['n2-1205.plc2.org', 'n2-1206.plc2.org', 'n2-1207.plc2.org'] +01:== added in slice onecag_slice1206 foreign ['n2-1206.plc2.org', 'n2-1207.plc2.org', 'n2-1208.plc2.org'] +01:== added in slice onecah_slice1207 foreign ['n2-1207.plc2.org', 'n2-1208.plc2.org', 'n2-1209.plc2.org'] +01:== added in slice onecai_slice1208 foreign ['n2-1208.plc2.org', 'n2-1209.plc2.org', 'n2-1210.plc2.org'] +01:== added in slice onecaj_slice1209 foreign ['n2-1209.plc2.org', 'n2-1210.plc2.org', 'n2-1211.plc2.org'] +01:== added in slice onecba_slice1210 foreign ['n2-1210.plc2.org', 'n2-1211.plc2.org', 'n2-1212.plc2.org'] +01:== added in slice onecbb_slice1211 foreign ['n2-1211.plc2.org', 'n2-1212.plc2.org', 'n2-1213.plc2.org'] +01:== added in slice onecbc_slice1212 foreign ['n2-1212.plc2.org', 'n2-1213.plc2.org', 'n2-1214.plc2.org'] +01:== added in slice onecbd_slice1213 foreign ['n2-1213.plc2.org', 'n2-1214.plc2.org', 'n2-1215.plc2.org'] +01:== added in slice onecbe_slice1214 foreign ['n2-1214.plc2.org', 'n2-1215.plc2.org', 'n2-1216.plc2.org'] +01:== added in slice onecbf_slice1215 foreign ['n2-1215.plc2.org', 'n2-1216.plc2.org', 'n2-1217.plc2.org'] +01:== added in slice onecbg_slice1216 foreign ['n2-1216.plc2.org', 'n2-1217.plc2.org', 'n2-1218.plc2.org'] +01:== added in slice onecbh_slice1217 foreign ['n2-1217.plc2.org', 'n2-1218.plc2.org', 'n2-1219.plc2.org'] +01:== added in slice onecbi_slice1218 foreign ['n2-1218.plc2.org', 'n2-1219.plc2.org', 'n2-1220.plc2.org'] +01:== added in slice onecbj_slice1219 foreign ['n2-1219.plc2.org', 'n2-1220.plc2.org', 'n2-1221.plc2.org'] +01:== added in slice onecca_slice1220 foreign ['n2-1220.plc2.org', 'n2-1221.plc2.org', 'n2-1222.plc2.org'] +01:== added in slice oneccb_slice1221 foreign ['n2-1221.plc2.org', 'n2-1222.plc2.org', 'n2-1223.plc2.org'] +01:== added in slice oneccc_slice1222 foreign ['n2-1222.plc2.org', 'n2-1223.plc2.org', 'n2-1224.plc2.org'] +01:== added in slice oneccd_slice1223 foreign ['n2-1223.plc2.org', 'n2-1224.plc2.org', 'n2-1225.plc2.org'] +01:== added in slice onecce_slice1224 foreign ['n2-1224.plc2.org', 'n2-1225.plc2.org', 'n2-1226.plc2.org'] +01:== added in slice oneccf_slice1225 foreign ['n2-1225.plc2.org', 'n2-1226.plc2.org', 'n2-1227.plc2.org'] +01:== added in slice oneccg_slice1226 foreign ['n2-1226.plc2.org', 'n2-1227.plc2.org', 'n2-1228.plc2.org'] +01:== added in slice onecch_slice1227 foreign ['n2-1227.plc2.org', 'n2-1228.plc2.org', 'n2-1229.plc2.org'] +01:== added in slice onecci_slice1228 foreign ['n2-1228.plc2.org', 'n2-1229.plc2.org', 'n2-1230.plc2.org'] +01:== added in slice oneccj_slice1229 foreign ['n2-1229.plc2.org', 'n2-1230.plc2.org', 'n2-1231.plc2.org'] +01:== added in slice onecda_slice1230 foreign ['n2-1230.plc2.org', 'n2-1231.plc2.org', 'n2-1232.plc2.org'] +01:== added in slice onecdb_slice1231 foreign ['n2-1231.plc2.org', 'n2-1232.plc2.org', 'n2-1233.plc2.org'] +01:== added in slice onecdc_slice1232 foreign ['n2-1232.plc2.org', 'n2-1233.plc2.org', 'n2-1234.plc2.org'] +01:== added in slice onecdd_slice1233 foreign ['n2-1233.plc2.org', 'n2-1234.plc2.org', 'n2-1235.plc2.org'] +01:== added in slice onecde_slice1234 foreign ['n2-1234.plc2.org', 'n2-1235.plc2.org', 'n2-1236.plc2.org'] +01:== added in slice onecdf_slice1235 foreign ['n2-1235.plc2.org', 'n2-1236.plc2.org', 'n2-1237.plc2.org'] +01:== added in slice onecdg_slice1236 foreign ['n2-1236.plc2.org', 'n2-1237.plc2.org', 'n2-1238.plc2.org'] +01:== added in slice onecdh_slice1237 foreign ['n2-1237.plc2.org', 'n2-1238.plc2.org', 'n2-1239.plc2.org'] +01:== added in slice onecdi_slice1238 foreign ['n2-1238.plc2.org', 'n2-1239.plc2.org', 'n2-1240.plc2.org'] +01:== added in slice onecdj_slice1239 foreign ['n2-1239.plc2.org', 'n2-1240.plc2.org', 'n2-1241.plc2.org'] +01:== added in slice onecea_slice1240 foreign ['n2-1240.plc2.org', 'n2-1241.plc2.org', 'n2-1242.plc2.org'] +01:== added in slice oneceb_slice1241 foreign ['n2-1241.plc2.org', 'n2-1242.plc2.org', 'n2-1243.plc2.org'] +01:== added in slice onecec_slice1242 foreign ['n2-1242.plc2.org', 'n2-1243.plc2.org', 'n2-1244.plc2.org'] +01:== added in slice oneced_slice1243 foreign ['n2-1243.plc2.org', 'n2-1244.plc2.org', 'n2-1245.plc2.org'] +01:== added in slice onecee_slice1244 foreign ['n2-1244.plc2.org', 'n2-1245.plc2.org', 'n2-1246.plc2.org'] +01:== added in slice onecef_slice1245 foreign ['n2-1245.plc2.org', 'n2-1246.plc2.org', 'n2-1247.plc2.org'] +01:== added in slice oneceg_slice1246 foreign ['n2-1246.plc2.org', 'n2-1247.plc2.org', 'n2-1248.plc2.org'] +01:== added in slice oneceh_slice1247 foreign ['n2-1247.plc2.org', 'n2-1248.plc2.org', 'n2-1249.plc2.org'] +01:== added in slice onecei_slice1248 foreign ['n2-1248.plc2.org', 'n2-1249.plc2.org', 'n2-1250.plc2.org'] +01:== added in slice onecej_slice1249 foreign ['n2-1249.plc2.org', 'n2-1250.plc2.org', 'n2-1251.plc2.org'] +01:== added in slice onecfa_slice1250 foreign ['n2-1250.plc2.org', 'n2-1251.plc2.org', 'n2-1252.plc2.org'] +01:== added in slice onecfb_slice1251 foreign ['n2-1251.plc2.org', 'n2-1252.plc2.org', 'n2-1253.plc2.org'] +01:== added in slice onecfc_slice1252 foreign ['n2-1252.plc2.org', 'n2-1253.plc2.org', 'n2-1254.plc2.org'] +01:== added in slice onecfd_slice1253 foreign ['n2-1253.plc2.org', 'n2-1254.plc2.org', 'n2-1255.plc2.org'] +01:== added in slice onecfe_slice1254 foreign ['n2-1254.plc2.org', 'n2-1255.plc2.org', 'n2-1256.plc2.org'] +01:== added in slice onecff_slice1255 foreign ['n2-1255.plc2.org', 'n2-1256.plc2.org', 'n2-1257.plc2.org'] +01:== added in slice onecfg_slice1256 foreign ['n2-1256.plc2.org', 'n2-1257.plc2.org', 'n2-1258.plc2.org'] +01:== added in slice onecfh_slice1257 foreign ['n2-1257.plc2.org', 'n2-1258.plc2.org', 'n2-1259.plc2.org'] +01:== added in slice onecfi_slice1258 foreign ['n2-1258.plc2.org', 'n2-1259.plc2.org', 'n2-1260.plc2.org'] +01:== added in slice onecfj_slice1259 foreign ['n2-1259.plc2.org', 'n2-1260.plc2.org', 'n2-1261.plc2.org'] +01:== added in slice onecga_slice1260 foreign ['n2-1260.plc2.org', 'n2-1261.plc2.org', 'n2-1262.plc2.org'] +01:== added in slice onecgb_slice1261 foreign ['n2-1261.plc2.org', 'n2-1262.plc2.org', 'n2-1263.plc2.org'] +01:== added in slice onecgc_slice1262 foreign ['n2-1262.plc2.org', 'n2-1263.plc2.org', 'n2-1264.plc2.org'] +01:== added in slice onecgd_slice1263 foreign ['n2-1263.plc2.org', 'n2-1264.plc2.org', 'n2-1265.plc2.org'] +01:== added in slice onecge_slice1264 foreign ['n2-1264.plc2.org', 'n2-1265.plc2.org', 'n2-1266.plc2.org'] +01:== added in slice onecgf_slice1265 foreign ['n2-1265.plc2.org', 'n2-1266.plc2.org', 'n2-1267.plc2.org'] +01:== added in slice onecgg_slice1266 foreign ['n2-1266.plc2.org', 'n2-1267.plc2.org', 'n2-1268.plc2.org'] +01:== added in slice onecgh_slice1267 foreign ['n2-1267.plc2.org', 'n2-1268.plc2.org', 'n2-1269.plc2.org'] +01:== added in slice onecgi_slice1268 foreign ['n2-1268.plc2.org', 'n2-1269.plc2.org', 'n2-1270.plc2.org'] +01:== added in slice onecgj_slice1269 foreign ['n2-1269.plc2.org', 'n2-1270.plc2.org', 'n2-1271.plc2.org'] +01:== added in slice onecha_slice1270 foreign ['n2-1270.plc2.org', 'n2-1271.plc2.org', 'n2-1272.plc2.org'] +01:== added in slice onechb_slice1271 foreign ['n2-1271.plc2.org', 'n2-1272.plc2.org', 'n2-1273.plc2.org'] +01:== added in slice onechc_slice1272 foreign ['n2-1272.plc2.org', 'n2-1273.plc2.org', 'n2-1274.plc2.org'] +01:== added in slice onechd_slice1273 foreign ['n2-1273.plc2.org', 'n2-1274.plc2.org', 'n2-1275.plc2.org'] +01:== added in slice oneche_slice1274 foreign ['n2-1274.plc2.org', 'n2-1275.plc2.org', 'n2-1276.plc2.org'] +01:== added in slice onechf_slice1275 foreign ['n2-1275.plc2.org', 'n2-1276.plc2.org', 'n2-1277.plc2.org'] +01:== added in slice onechg_slice1276 foreign ['n2-1276.plc2.org', 'n2-1277.plc2.org', 'n2-1278.plc2.org'] +01:== added in slice onechh_slice1277 foreign ['n2-1277.plc2.org', 'n2-1278.plc2.org', 'n2-1279.plc2.org'] +01:== added in slice onechi_slice1278 foreign ['n2-1278.plc2.org', 'n2-1279.plc2.org', 'n2-1280.plc2.org'] +01:== added in slice onechj_slice1279 foreign ['n2-1279.plc2.org', 'n2-1280.plc2.org', 'n2-1281.plc2.org'] +01:== added in slice onecia_slice1280 foreign ['n2-1280.plc2.org', 'n2-1281.plc2.org', 'n2-1282.plc2.org'] +01:== added in slice onecib_slice1281 foreign ['n2-1281.plc2.org', 'n2-1282.plc2.org', 'n2-1283.plc2.org'] +01:== added in slice onecic_slice1282 foreign ['n2-1282.plc2.org', 'n2-1283.plc2.org', 'n2-1284.plc2.org'] +01:== added in slice onecid_slice1283 foreign ['n2-1283.plc2.org', 'n2-1284.plc2.org', 'n2-1285.plc2.org'] +01:== added in slice onecie_slice1284 foreign ['n2-1284.plc2.org', 'n2-1285.plc2.org', 'n2-1286.plc2.org'] +01:== added in slice onecif_slice1285 foreign ['n2-1285.plc2.org', 'n2-1286.plc2.org', 'n2-1287.plc2.org'] +01:== added in slice onecig_slice1286 foreign ['n2-1286.plc2.org', 'n2-1287.plc2.org', 'n2-1288.plc2.org'] +01:== added in slice onecih_slice1287 foreign ['n2-1287.plc2.org', 'n2-1288.plc2.org', 'n2-1289.plc2.org'] +01:== added in slice onecii_slice1288 foreign ['n2-1288.plc2.org', 'n2-1289.plc2.org', 'n2-1290.plc2.org'] +01:== added in slice onecij_slice1289 foreign ['n2-1289.plc2.org', 'n2-1290.plc2.org', 'n2-1291.plc2.org'] +01:== added in slice onecja_slice1290 foreign ['n2-1290.plc2.org', 'n2-1291.plc2.org', 'n2-1292.plc2.org'] +01:== added in slice onecjb_slice1291 foreign ['n2-1291.plc2.org', 'n2-1292.plc2.org', 'n2-1293.plc2.org'] +01:== added in slice onecjc_slice1292 foreign ['n2-1292.plc2.org', 'n2-1293.plc2.org', 'n2-1294.plc2.org'] +01:== added in slice onecjd_slice1293 foreign ['n2-1293.plc2.org', 'n2-1294.plc2.org', 'n2-1295.plc2.org'] +01:== added in slice onecje_slice1294 foreign ['n2-1294.plc2.org', 'n2-1295.plc2.org', 'n2-1296.plc2.org'] +01:== added in slice onecjf_slice1295 foreign ['n2-1295.plc2.org', 'n2-1296.plc2.org', 'n2-1297.plc2.org'] +01:== added in slice onecjg_slice1296 foreign ['n2-1296.plc2.org', 'n2-1297.plc2.org', 'n2-1298.plc2.org'] +01:== added in slice onecjh_slice1297 foreign ['n2-1297.plc2.org', 'n2-1298.plc2.org', 'n2-1299.plc2.org'] +01:== added in slice onecji_slice1298 foreign ['n2-1298.plc2.org', 'n2-1299.plc2.org', 'n2-1300.plc2.org'] +01:== added in slice onecjj_slice1299 foreign ['n2-1299.plc2.org', 'n2-1300.plc2.org', 'n2-1301.plc2.org'] +01:== added in slice onedaa_slice1300 foreign ['n2-1300.plc2.org', 'n2-1301.plc2.org', 'n2-1302.plc2.org'] +01:== added in slice onedab_slice1301 foreign ['n2-1301.plc2.org', 'n2-1302.plc2.org', 'n2-1303.plc2.org'] +01:== added in slice onedac_slice1302 foreign ['n2-1302.plc2.org', 'n2-1303.plc2.org', 'n2-1304.plc2.org'] +01:== added in slice onedad_slice1303 foreign ['n2-1303.plc2.org', 'n2-1304.plc2.org', 'n2-1305.plc2.org'] +01:== added in slice onedae_slice1304 foreign ['n2-1304.plc2.org', 'n2-1305.plc2.org', 'n2-1306.plc2.org'] +01:== added in slice onedaf_slice1305 foreign ['n2-1305.plc2.org', 'n2-1306.plc2.org', 'n2-1307.plc2.org'] +01:== added in slice onedag_slice1306 foreign ['n2-1306.plc2.org', 'n2-1307.plc2.org', 'n2-1308.plc2.org'] +01:== added in slice onedah_slice1307 foreign ['n2-1307.plc2.org', 'n2-1308.plc2.org', 'n2-1309.plc2.org'] +01:== added in slice onedai_slice1308 foreign ['n2-1308.plc2.org', 'n2-1309.plc2.org', 'n2-1310.plc2.org'] +01:== added in slice onedaj_slice1309 foreign ['n2-1309.plc2.org', 'n2-1310.plc2.org', 'n2-1311.plc2.org'] +01:== added in slice onedba_slice1310 foreign ['n2-1310.plc2.org', 'n2-1311.plc2.org', 'n2-1312.plc2.org'] +01:== added in slice onedbb_slice1311 foreign ['n2-1311.plc2.org', 'n2-1312.plc2.org', 'n2-1313.plc2.org'] +01:== added in slice onedbc_slice1312 foreign ['n2-1312.plc2.org', 'n2-1313.plc2.org', 'n2-1314.plc2.org'] +01:== added in slice onedbd_slice1313 foreign ['n2-1313.plc2.org', 'n2-1314.plc2.org', 'n2-1315.plc2.org'] +01:== added in slice onedbe_slice1314 foreign ['n2-1314.plc2.org', 'n2-1315.plc2.org', 'n2-1316.plc2.org'] +01:== added in slice onedbf_slice1315 foreign ['n2-1315.plc2.org', 'n2-1316.plc2.org', 'n2-1317.plc2.org'] +01:== added in slice onedbg_slice1316 foreign ['n2-1316.plc2.org', 'n2-1317.plc2.org', 'n2-1318.plc2.org'] +01:== added in slice onedbh_slice1317 foreign ['n2-1317.plc2.org', 'n2-1318.plc2.org', 'n2-1319.plc2.org'] +01:== added in slice onedbi_slice1318 foreign ['n2-1318.plc2.org', 'n2-1319.plc2.org', 'n2-1320.plc2.org'] +01:== added in slice onedbj_slice1319 foreign ['n2-1319.plc2.org', 'n2-1320.plc2.org', 'n2-1321.plc2.org'] +01:== added in slice onedca_slice1320 foreign ['n2-1320.plc2.org', 'n2-1321.plc2.org', 'n2-1322.plc2.org'] +01:== added in slice onedcb_slice1321 foreign ['n2-1321.plc2.org', 'n2-1322.plc2.org', 'n2-1323.plc2.org'] +01:== added in slice onedcc_slice1322 foreign ['n2-1322.plc2.org', 'n2-1323.plc2.org', 'n2-1324.plc2.org'] +01:== added in slice onedcd_slice1323 foreign ['n2-1323.plc2.org', 'n2-1324.plc2.org', 'n2-1325.plc2.org'] +01:== added in slice onedce_slice1324 foreign ['n2-1324.plc2.org', 'n2-1325.plc2.org', 'n2-1326.plc2.org'] +01:== added in slice onedcf_slice1325 foreign ['n2-1325.plc2.org', 'n2-1326.plc2.org', 'n2-1327.plc2.org'] +01:== added in slice onedcg_slice1326 foreign ['n2-1326.plc2.org', 'n2-1327.plc2.org', 'n2-1328.plc2.org'] +01:== added in slice onedch_slice1327 foreign ['n2-1327.plc2.org', 'n2-1328.plc2.org', 'n2-1329.plc2.org'] +01:== added in slice onedci_slice1328 foreign ['n2-1328.plc2.org', 'n2-1329.plc2.org', 'n2-1330.plc2.org'] +01:== added in slice onedcj_slice1329 foreign ['n2-1329.plc2.org', 'n2-1330.plc2.org', 'n2-1331.plc2.org'] +01:== added in slice onedda_slice1330 foreign ['n2-1330.plc2.org', 'n2-1331.plc2.org', 'n2-1332.plc2.org'] +01:== added in slice oneddb_slice1331 foreign ['n2-1331.plc2.org', 'n2-1332.plc2.org', 'n2-1333.plc2.org'] +01:== added in slice oneddc_slice1332 foreign ['n2-1332.plc2.org', 'n2-1333.plc2.org', 'n2-1334.plc2.org'] +01:== added in slice oneddd_slice1333 foreign ['n2-1333.plc2.org', 'n2-1334.plc2.org', 'n2-1335.plc2.org'] +01:== added in slice onedde_slice1334 foreign ['n2-1334.plc2.org', 'n2-1335.plc2.org', 'n2-1336.plc2.org'] +01:== added in slice oneddf_slice1335 foreign ['n2-1335.plc2.org', 'n2-1336.plc2.org', 'n2-1337.plc2.org'] +01:== added in slice oneddg_slice1336 foreign ['n2-1336.plc2.org', 'n2-1337.plc2.org', 'n2-1338.plc2.org'] +01:== added in slice oneddh_slice1337 foreign ['n2-1337.plc2.org', 'n2-1338.plc2.org', 'n2-1339.plc2.org'] +01:== added in slice oneddi_slice1338 foreign ['n2-1338.plc2.org', 'n2-1339.plc2.org', 'n2-1340.plc2.org'] +01:== added in slice oneddj_slice1339 foreign ['n2-1339.plc2.org', 'n2-1340.plc2.org', 'n2-1341.plc2.org'] +01:== added in slice onedea_slice1340 foreign ['n2-1340.plc2.org', 'n2-1341.plc2.org', 'n2-1342.plc2.org'] +01:== added in slice onedeb_slice1341 foreign ['n2-1341.plc2.org', 'n2-1342.plc2.org', 'n2-1343.plc2.org'] +01:== added in slice onedec_slice1342 foreign ['n2-1342.plc2.org', 'n2-1343.plc2.org', 'n2-1344.plc2.org'] +01:== added in slice oneded_slice1343 foreign ['n2-1343.plc2.org', 'n2-1344.plc2.org', 'n2-1345.plc2.org'] +01:== added in slice onedee_slice1344 foreign ['n2-1344.plc2.org', 'n2-1345.plc2.org', 'n2-1346.plc2.org'] +01:== added in slice onedef_slice1345 foreign ['n2-1345.plc2.org', 'n2-1346.plc2.org', 'n2-1347.plc2.org'] +01:== added in slice onedeg_slice1346 foreign ['n2-1346.plc2.org', 'n2-1347.plc2.org', 'n2-1348.plc2.org'] +01:== added in slice onedeh_slice1347 foreign ['n2-1347.plc2.org', 'n2-1348.plc2.org', 'n2-1349.plc2.org'] +01:== added in slice onedei_slice1348 foreign ['n2-1348.plc2.org', 'n2-1349.plc2.org', 'n2-1350.plc2.org'] +01:== added in slice onedej_slice1349 foreign ['n2-1349.plc2.org', 'n2-1350.plc2.org', 'n2-1351.plc2.org'] +01:== added in slice onedfa_slice1350 foreign ['n2-1350.plc2.org', 'n2-1351.plc2.org', 'n2-1352.plc2.org'] +01:== added in slice onedfb_slice1351 foreign ['n2-1351.plc2.org', 'n2-1352.plc2.org', 'n2-1353.plc2.org'] +01:== added in slice onedfc_slice1352 foreign ['n2-1352.plc2.org', 'n2-1353.plc2.org', 'n2-1354.plc2.org'] +01:== added in slice onedfd_slice1353 foreign ['n2-1353.plc2.org', 'n2-1354.plc2.org', 'n2-1355.plc2.org'] +01:== added in slice onedfe_slice1354 foreign ['n2-1354.plc2.org', 'n2-1355.plc2.org', 'n2-1356.plc2.org'] +01:== added in slice onedff_slice1355 foreign ['n2-1355.plc2.org', 'n2-1356.plc2.org', 'n2-1357.plc2.org'] +01:== added in slice onedfg_slice1356 foreign ['n2-1356.plc2.org', 'n2-1357.plc2.org', 'n2-1358.plc2.org'] +01:== added in slice onedfh_slice1357 foreign ['n2-1357.plc2.org', 'n2-1358.plc2.org', 'n2-1359.plc2.org'] +01:== added in slice onedfi_slice1358 foreign ['n2-1358.plc2.org', 'n2-1359.plc2.org', 'n2-1360.plc2.org'] +01:== added in slice onedfj_slice1359 foreign ['n2-1359.plc2.org', 'n2-1360.plc2.org', 'n2-1361.plc2.org'] +01:== added in slice onedga_slice1360 foreign ['n2-1360.plc2.org', 'n2-1361.plc2.org', 'n2-1362.plc2.org'] +01:== added in slice onedgb_slice1361 foreign ['n2-1361.plc2.org', 'n2-1362.plc2.org', 'n2-1363.plc2.org'] +01:== added in slice onedgc_slice1362 foreign ['n2-1362.plc2.org', 'n2-1363.plc2.org', 'n2-1364.plc2.org'] +01:== added in slice onedgd_slice1363 foreign ['n2-1363.plc2.org', 'n2-1364.plc2.org', 'n2-1365.plc2.org'] +01:== added in slice onedge_slice1364 foreign ['n2-1364.plc2.org', 'n2-1365.plc2.org', 'n2-1366.plc2.org'] +01:== added in slice onedgf_slice1365 foreign ['n2-1365.plc2.org', 'n2-1366.plc2.org', 'n2-1367.plc2.org'] +01:== added in slice onedgg_slice1366 foreign ['n2-1366.plc2.org', 'n2-1367.plc2.org', 'n2-1368.plc2.org'] +01:== added in slice onedgh_slice1367 foreign ['n2-1367.plc2.org', 'n2-1368.plc2.org', 'n2-1369.plc2.org'] +01:== added in slice onedgi_slice1368 foreign ['n2-1368.plc2.org', 'n2-1369.plc2.org', 'n2-1370.plc2.org'] +01:== added in slice onedgj_slice1369 foreign ['n2-1369.plc2.org', 'n2-1370.plc2.org', 'n2-1371.plc2.org'] +01:== added in slice onedha_slice1370 foreign ['n2-1370.plc2.org', 'n2-1371.plc2.org', 'n2-1372.plc2.org'] +01:== added in slice onedhb_slice1371 foreign ['n2-1371.plc2.org', 'n2-1372.plc2.org', 'n2-1373.plc2.org'] +01:== added in slice onedhc_slice1372 foreign ['n2-1372.plc2.org', 'n2-1373.plc2.org', 'n2-1374.plc2.org'] +01:== added in slice onedhd_slice1373 foreign ['n2-1373.plc2.org', 'n2-1374.plc2.org', 'n2-1375.plc2.org'] +01:== added in slice onedhe_slice1374 foreign ['n2-1374.plc2.org', 'n2-1375.plc2.org', 'n2-1376.plc2.org'] +01:== added in slice onedhf_slice1375 foreign ['n2-1375.plc2.org', 'n2-1376.plc2.org', 'n2-1377.plc2.org'] +01:== added in slice onedhg_slice1376 foreign ['n2-1376.plc2.org', 'n2-1377.plc2.org', 'n2-1378.plc2.org'] +01:== added in slice onedhh_slice1377 foreign ['n2-1377.plc2.org', 'n2-1378.plc2.org', 'n2-1379.plc2.org'] +01:== added in slice onedhi_slice1378 foreign ['n2-1378.plc2.org', 'n2-1379.plc2.org', 'n2-1380.plc2.org'] +01:== added in slice onedhj_slice1379 foreign ['n2-1379.plc2.org', 'n2-1380.plc2.org', 'n2-1381.plc2.org'] +01:== added in slice onedia_slice1380 foreign ['n2-1380.plc2.org', 'n2-1381.plc2.org', 'n2-1382.plc2.org'] +01:== added in slice onedib_slice1381 foreign ['n2-1381.plc2.org', 'n2-1382.plc2.org', 'n2-1383.plc2.org'] +01:== added in slice onedic_slice1382 foreign ['n2-1382.plc2.org', 'n2-1383.plc2.org', 'n2-1384.plc2.org'] +01:== added in slice onedid_slice1383 foreign ['n2-1383.plc2.org', 'n2-1384.plc2.org', 'n2-1385.plc2.org'] +01:== added in slice onedie_slice1384 foreign ['n2-1384.plc2.org', 'n2-1385.plc2.org', 'n2-1386.plc2.org'] +01:== added in slice onedif_slice1385 foreign ['n2-1385.plc2.org', 'n2-1386.plc2.org', 'n2-1387.plc2.org'] +01:== added in slice onedig_slice1386 foreign ['n2-1386.plc2.org', 'n2-1387.plc2.org', 'n2-1388.plc2.org'] +01:== added in slice onedih_slice1387 foreign ['n2-1387.plc2.org', 'n2-1388.plc2.org', 'n2-1389.plc2.org'] +01:== added in slice onedii_slice1388 foreign ['n2-1388.plc2.org', 'n2-1389.plc2.org', 'n2-1390.plc2.org'] +01:== added in slice onedij_slice1389 foreign ['n2-1389.plc2.org', 'n2-1390.plc2.org', 'n2-1391.plc2.org'] +01:== added in slice onedja_slice1390 foreign ['n2-1390.plc2.org', 'n2-1391.plc2.org', 'n2-1392.plc2.org'] +01:== added in slice onedjb_slice1391 foreign ['n2-1391.plc2.org', 'n2-1392.plc2.org', 'n2-1393.plc2.org'] +01:== added in slice onedjc_slice1392 foreign ['n2-1392.plc2.org', 'n2-1393.plc2.org', 'n2-1394.plc2.org'] +01:== added in slice onedjd_slice1393 foreign ['n2-1393.plc2.org', 'n2-1394.plc2.org', 'n2-1395.plc2.org'] +01:== added in slice onedje_slice1394 foreign ['n2-1394.plc2.org', 'n2-1395.plc2.org', 'n2-1396.plc2.org'] +01:== added in slice onedjf_slice1395 foreign ['n2-1395.plc2.org', 'n2-1396.plc2.org', 'n2-1397.plc2.org'] +01:== added in slice onedjg_slice1396 foreign ['n2-1396.plc2.org', 'n2-1397.plc2.org', 'n2-1398.plc2.org'] +01:== added in slice onedjh_slice1397 foreign ['n2-1397.plc2.org', 'n2-1398.plc2.org', 'n2-1399.plc2.org'] +01:== added in slice onedji_slice1398 foreign ['n2-1398.plc2.org', 'n2-1399.plc2.org', 'n2-1400.plc2.org'] +01:== added in slice onedjj_slice1399 foreign ['n2-1399.plc2.org', 'n2-1400.plc2.org', 'n2-1401.plc2.org'] +01:== added in slice oneeaa_slice1400 foreign ['n2-1400.plc2.org', 'n2-1401.plc2.org', 'n2-1402.plc2.org'] +01:== added in slice oneeab_slice1401 foreign ['n2-1401.plc2.org', 'n2-1402.plc2.org', 'n2-1403.plc2.org'] +01:== added in slice oneeac_slice1402 foreign ['n2-1402.plc2.org', 'n2-1403.plc2.org', 'n2-1404.plc2.org'] +01:== added in slice oneead_slice1403 foreign ['n2-1403.plc2.org', 'n2-1404.plc2.org', 'n2-1405.plc2.org'] +01:== added in slice oneeae_slice1404 foreign ['n2-1404.plc2.org', 'n2-1405.plc2.org', 'n2-1406.plc2.org'] +01:== added in slice oneeaf_slice1405 foreign ['n2-1405.plc2.org', 'n2-1406.plc2.org', 'n2-1407.plc2.org'] +01:== added in slice oneeag_slice1406 foreign ['n2-1406.plc2.org', 'n2-1407.plc2.org', 'n2-1408.plc2.org'] +01:== added in slice oneeah_slice1407 foreign ['n2-1407.plc2.org', 'n2-1408.plc2.org', 'n2-1409.plc2.org'] +01:== added in slice oneeai_slice1408 foreign ['n2-1408.plc2.org', 'n2-1409.plc2.org', 'n2-1410.plc2.org'] +01:== added in slice oneeaj_slice1409 foreign ['n2-1409.plc2.org', 'n2-1410.plc2.org', 'n2-1411.plc2.org'] +01:== added in slice oneeba_slice1410 foreign ['n2-1410.plc2.org', 'n2-1411.plc2.org', 'n2-1412.plc2.org'] +01:== added in slice oneebb_slice1411 foreign ['n2-1411.plc2.org', 'n2-1412.plc2.org', 'n2-1413.plc2.org'] +01:== added in slice oneebc_slice1412 foreign ['n2-1412.plc2.org', 'n2-1413.plc2.org', 'n2-1414.plc2.org'] +01:== added in slice oneebd_slice1413 foreign ['n2-1413.plc2.org', 'n2-1414.plc2.org', 'n2-1415.plc2.org'] +01:== added in slice oneebe_slice1414 foreign ['n2-1414.plc2.org', 'n2-1415.plc2.org', 'n2-1416.plc2.org'] +01:== added in slice oneebf_slice1415 foreign ['n2-1415.plc2.org', 'n2-1416.plc2.org', 'n2-1417.plc2.org'] +01:== added in slice oneebg_slice1416 foreign ['n2-1416.plc2.org', 'n2-1417.plc2.org', 'n2-1418.plc2.org'] +01:== added in slice oneebh_slice1417 foreign ['n2-1417.plc2.org', 'n2-1418.plc2.org', 'n2-1419.plc2.org'] +01:== added in slice oneebi_slice1418 foreign ['n2-1418.plc2.org', 'n2-1419.plc2.org', 'n2-1420.plc2.org'] +01:== added in slice oneebj_slice1419 foreign ['n2-1419.plc2.org', 'n2-1420.plc2.org', 'n2-1421.plc2.org'] +01:== added in slice oneeca_slice1420 foreign ['n2-1420.plc2.org', 'n2-1421.plc2.org', 'n2-1422.plc2.org'] +01:== added in slice oneecb_slice1421 foreign ['n2-1421.plc2.org', 'n2-1422.plc2.org', 'n2-1423.plc2.org'] +01:== added in slice oneecc_slice1422 foreign ['n2-1422.plc2.org', 'n2-1423.plc2.org', 'n2-1424.plc2.org'] +01:== added in slice oneecd_slice1423 foreign ['n2-1423.plc2.org', 'n2-1424.plc2.org', 'n2-1425.plc2.org'] +01:== added in slice oneece_slice1424 foreign ['n2-1424.plc2.org', 'n2-1425.plc2.org', 'n2-1426.plc2.org'] +01:== added in slice oneecf_slice1425 foreign ['n2-1425.plc2.org', 'n2-1426.plc2.org', 'n2-1427.plc2.org'] +01:== added in slice oneecg_slice1426 foreign ['n2-1426.plc2.org', 'n2-1427.plc2.org', 'n2-1428.plc2.org'] +01:== added in slice oneech_slice1427 foreign ['n2-1427.plc2.org', 'n2-1428.plc2.org', 'n2-1429.plc2.org'] +01:== added in slice oneeci_slice1428 foreign ['n2-1428.plc2.org', 'n2-1429.plc2.org', 'n2-1430.plc2.org'] +01:== added in slice oneecj_slice1429 foreign ['n2-1429.plc2.org', 'n2-1430.plc2.org', 'n2-1431.plc2.org'] +01:== added in slice oneeda_slice1430 foreign ['n2-1430.plc2.org', 'n2-1431.plc2.org', 'n2-1432.plc2.org'] +01:== added in slice oneedb_slice1431 foreign ['n2-1431.plc2.org', 'n2-1432.plc2.org', 'n2-1433.plc2.org'] +01:== added in slice oneedc_slice1432 foreign ['n2-1432.plc2.org', 'n2-1433.plc2.org', 'n2-1434.plc2.org'] +01:== added in slice oneedd_slice1433 foreign ['n2-1433.plc2.org', 'n2-1434.plc2.org', 'n2-1435.plc2.org'] +01:== added in slice oneede_slice1434 foreign ['n2-1434.plc2.org', 'n2-1435.plc2.org', 'n2-1436.plc2.org'] +01:== added in slice oneedf_slice1435 foreign ['n2-1435.plc2.org', 'n2-1436.plc2.org', 'n2-1437.plc2.org'] +01:== added in slice oneedg_slice1436 foreign ['n2-1436.plc2.org', 'n2-1437.plc2.org', 'n2-1438.plc2.org'] +01:== added in slice oneedh_slice1437 foreign ['n2-1437.plc2.org', 'n2-1438.plc2.org', 'n2-1439.plc2.org'] +01:== added in slice oneedi_slice1438 foreign ['n2-1438.plc2.org', 'n2-1439.plc2.org', 'n2-1440.plc2.org'] +01:== added in slice oneedj_slice1439 foreign ['n2-1439.plc2.org', 'n2-1440.plc2.org', 'n2-1441.plc2.org'] +01:== added in slice oneeea_slice1440 foreign ['n2-1440.plc2.org', 'n2-1441.plc2.org', 'n2-1442.plc2.org'] +01:== added in slice oneeeb_slice1441 foreign ['n2-1441.plc2.org', 'n2-1442.plc2.org', 'n2-1443.plc2.org'] +01:== added in slice oneeec_slice1442 foreign ['n2-1442.plc2.org', 'n2-1443.plc2.org', 'n2-1444.plc2.org'] +01:== added in slice oneeed_slice1443 foreign ['n2-1443.plc2.org', 'n2-1444.plc2.org', 'n2-1445.plc2.org'] +01:== added in slice oneeee_slice1444 foreign ['n2-1444.plc2.org', 'n2-1445.plc2.org', 'n2-1446.plc2.org'] +01:== added in slice oneeef_slice1445 foreign ['n2-1445.plc2.org', 'n2-1446.plc2.org', 'n2-1447.plc2.org'] +01:== added in slice oneeeg_slice1446 foreign ['n2-1446.plc2.org', 'n2-1447.plc2.org', 'n2-1448.plc2.org'] +01:== added in slice oneeeh_slice1447 foreign ['n2-1447.plc2.org', 'n2-1448.plc2.org', 'n2-1449.plc2.org'] +01:== added in slice oneeei_slice1448 foreign ['n2-1448.plc2.org', 'n2-1449.plc2.org', 'n2-1450.plc2.org'] +01:== added in slice oneeej_slice1449 foreign ['n2-1449.plc2.org', 'n2-1450.plc2.org', 'n2-1451.plc2.org'] +01:== added in slice oneefa_slice1450 foreign ['n2-1450.plc2.org', 'n2-1451.plc2.org', 'n2-1452.plc2.org'] +01:== added in slice oneefb_slice1451 foreign ['n2-1451.plc2.org', 'n2-1452.plc2.org', 'n2-1453.plc2.org'] +01:== added in slice oneefc_slice1452 foreign ['n2-1452.plc2.org', 'n2-1453.plc2.org', 'n2-1454.plc2.org'] +01:== added in slice oneefd_slice1453 foreign ['n2-1453.plc2.org', 'n2-1454.plc2.org', 'n2-1455.plc2.org'] +01:== added in slice oneefe_slice1454 foreign ['n2-1454.plc2.org', 'n2-1455.plc2.org', 'n2-1456.plc2.org'] +01:== added in slice oneeff_slice1455 foreign ['n2-1455.plc2.org', 'n2-1456.plc2.org', 'n2-1457.plc2.org'] +01:== added in slice oneefg_slice1456 foreign ['n2-1456.plc2.org', 'n2-1457.plc2.org', 'n2-1458.plc2.org'] +01:== added in slice oneefh_slice1457 foreign ['n2-1457.plc2.org', 'n2-1458.plc2.org', 'n2-1459.plc2.org'] +01:== added in slice oneefi_slice1458 foreign ['n2-1458.plc2.org', 'n2-1459.plc2.org', 'n2-1460.plc2.org'] +01:== added in slice oneefj_slice1459 foreign ['n2-1459.plc2.org', 'n2-1460.plc2.org', 'n2-1461.plc2.org'] +01:== added in slice oneega_slice1460 foreign ['n2-1460.plc2.org', 'n2-1461.plc2.org', 'n2-1462.plc2.org'] +01:== added in slice oneegb_slice1461 foreign ['n2-1461.plc2.org', 'n2-1462.plc2.org', 'n2-1463.plc2.org'] +01:== added in slice oneegc_slice1462 foreign ['n2-1462.plc2.org', 'n2-1463.plc2.org', 'n2-1464.plc2.org'] +01:== added in slice oneegd_slice1463 foreign ['n2-1463.plc2.org', 'n2-1464.plc2.org', 'n2-1465.plc2.org'] +01:== added in slice oneege_slice1464 foreign ['n2-1464.plc2.org', 'n2-1465.plc2.org', 'n2-1466.plc2.org'] +01:== added in slice oneegf_slice1465 foreign ['n2-1465.plc2.org', 'n2-1466.plc2.org', 'n2-1467.plc2.org'] +01:== added in slice oneegg_slice1466 foreign ['n2-1466.plc2.org', 'n2-1467.plc2.org', 'n2-1468.plc2.org'] +01:== added in slice oneegh_slice1467 foreign ['n2-1467.plc2.org', 'n2-1468.plc2.org', 'n2-1469.plc2.org'] +01:== added in slice oneegi_slice1468 foreign ['n2-1468.plc2.org', 'n2-1469.plc2.org', 'n2-1470.plc2.org'] +01:== added in slice oneegj_slice1469 foreign ['n2-1469.plc2.org', 'n2-1470.plc2.org', 'n2-1471.plc2.org'] +01:== added in slice oneeha_slice1470 foreign ['n2-1470.plc2.org', 'n2-1471.plc2.org', 'n2-1472.plc2.org'] +01:== added in slice oneehb_slice1471 foreign ['n2-1471.plc2.org', 'n2-1472.plc2.org', 'n2-1473.plc2.org'] +01:== added in slice oneehc_slice1472 foreign ['n2-1472.plc2.org', 'n2-1473.plc2.org', 'n2-1474.plc2.org'] +01:== added in slice oneehd_slice1473 foreign ['n2-1473.plc2.org', 'n2-1474.plc2.org', 'n2-1475.plc2.org'] +01:== added in slice oneehe_slice1474 foreign ['n2-1474.plc2.org', 'n2-1475.plc2.org', 'n2-1476.plc2.org'] +01:== added in slice oneehf_slice1475 foreign ['n2-1475.plc2.org', 'n2-1476.plc2.org', 'n2-1477.plc2.org'] +01:== added in slice oneehg_slice1476 foreign ['n2-1476.plc2.org', 'n2-1477.plc2.org', 'n2-1478.plc2.org'] +01:== added in slice oneehh_slice1477 foreign ['n2-1477.plc2.org', 'n2-1478.plc2.org', 'n2-1479.plc2.org'] +01:== added in slice oneehi_slice1478 foreign ['n2-1478.plc2.org', 'n2-1479.plc2.org', 'n2-1480.plc2.org'] +01:== added in slice oneehj_slice1479 foreign ['n2-1479.plc2.org', 'n2-1480.plc2.org', 'n2-1481.plc2.org'] +01:== added in slice oneeia_slice1480 foreign ['n2-1480.plc2.org', 'n2-1481.plc2.org', 'n2-1482.plc2.org'] +01:== added in slice oneeib_slice1481 foreign ['n2-1481.plc2.org', 'n2-1482.plc2.org', 'n2-1483.plc2.org'] +01:== added in slice oneeic_slice1482 foreign ['n2-1482.plc2.org', 'n2-1483.plc2.org', 'n2-1484.plc2.org'] +01:== added in slice oneeid_slice1483 foreign ['n2-1483.plc2.org', 'n2-1484.plc2.org', 'n2-1485.plc2.org'] +01:== added in slice oneeie_slice1484 foreign ['n2-1484.plc2.org', 'n2-1485.plc2.org', 'n2-1486.plc2.org'] +01:== added in slice oneeif_slice1485 foreign ['n2-1485.plc2.org', 'n2-1486.plc2.org', 'n2-1487.plc2.org'] +01:== added in slice oneeig_slice1486 foreign ['n2-1486.plc2.org', 'n2-1487.plc2.org', 'n2-1488.plc2.org'] +01:== added in slice oneeih_slice1487 foreign ['n2-1487.plc2.org', 'n2-1488.plc2.org', 'n2-1489.plc2.org'] +01:== added in slice oneeii_slice1488 foreign ['n2-1488.plc2.org', 'n2-1489.plc2.org', 'n2-1490.plc2.org'] +01:== added in slice oneeij_slice1489 foreign ['n2-1489.plc2.org', 'n2-1490.plc2.org', 'n2-1491.plc2.org'] +01:== added in slice oneeja_slice1490 foreign ['n2-1490.plc2.org', 'n2-1491.plc2.org', 'n2-1492.plc2.org'] +01:== added in slice oneejb_slice1491 foreign ['n2-1491.plc2.org', 'n2-1492.plc2.org', 'n2-1493.plc2.org'] +01:== added in slice oneejc_slice1492 foreign ['n2-1492.plc2.org', 'n2-1493.plc2.org', 'n2-1494.plc2.org'] +01:== added in slice oneejd_slice1493 foreign ['n2-1493.plc2.org', 'n2-1494.plc2.org', 'n2-1495.plc2.org'] +01:== added in slice oneeje_slice1494 foreign ['n2-1494.plc2.org', 'n2-1495.plc2.org', 'n2-1496.plc2.org'] +01:== added in slice oneejf_slice1495 foreign ['n2-1495.plc2.org', 'n2-1496.plc2.org', 'n2-1497.plc2.org'] +01:== added in slice oneejg_slice1496 foreign ['n2-1496.plc2.org', 'n2-1497.plc2.org', 'n2-1498.plc2.org'] +01:== added in slice oneejh_slice1497 foreign ['n2-1497.plc2.org', 'n2-1498.plc2.org', 'n2-1499.plc2.org'] +01:== added in slice oneeji_slice1498 foreign ['n2-1498.plc2.org', 'n2-1499.plc2.org', 'n2-1500.plc2.org'] +01:== added in slice oneejj_slice1499 foreign ['n2-1499.plc2.org', 'n2-1500.plc2.org', 'n2-1501.plc2.org'] +01:== added in slice onefaa_slice1500 foreign ['n2-1500.plc2.org', 'n2-1501.plc2.org', 'n2-1502.plc2.org'] +01:== added in slice onefab_slice1501 foreign ['n2-1501.plc2.org', 'n2-1502.plc2.org', 'n2-1503.plc2.org'] +01:== added in slice onefac_slice1502 foreign ['n2-1502.plc2.org', 'n2-1503.plc2.org', 'n2-1504.plc2.org'] +01:== added in slice onefad_slice1503 foreign ['n2-1503.plc2.org', 'n2-1504.plc2.org', 'n2-1505.plc2.org'] +01:== added in slice onefae_slice1504 foreign ['n2-1504.plc2.org', 'n2-1505.plc2.org', 'n2-1506.plc2.org'] +01:== added in slice onefaf_slice1505 foreign ['n2-1505.plc2.org', 'n2-1506.plc2.org', 'n2-1507.plc2.org'] +01:== added in slice onefag_slice1506 foreign ['n2-1506.plc2.org', 'n2-1507.plc2.org', 'n2-1508.plc2.org'] +01:== added in slice onefah_slice1507 foreign ['n2-1507.plc2.org', 'n2-1508.plc2.org', 'n2-1509.plc2.org'] +01:== added in slice onefai_slice1508 foreign ['n2-1508.plc2.org', 'n2-1509.plc2.org', 'n2-1510.plc2.org'] +01:== added in slice onefaj_slice1509 foreign ['n2-1509.plc2.org', 'n2-1510.plc2.org', 'n2-1511.plc2.org'] +01:== added in slice onefba_slice1510 foreign ['n2-1510.plc2.org', 'n2-1511.plc2.org', 'n2-1512.plc2.org'] +01:== added in slice onefbb_slice1511 foreign ['n2-1511.plc2.org', 'n2-1512.plc2.org', 'n2-1513.plc2.org'] +01:== added in slice onefbc_slice1512 foreign ['n2-1512.plc2.org', 'n2-1513.plc2.org', 'n2-1514.plc2.org'] +01:== added in slice onefbd_slice1513 foreign ['n2-1513.plc2.org', 'n2-1514.plc2.org', 'n2-1515.plc2.org'] +01:== added in slice onefbe_slice1514 foreign ['n2-1514.plc2.org', 'n2-1515.plc2.org', 'n2-1516.plc2.org'] +01:== added in slice onefbf_slice1515 foreign ['n2-1515.plc2.org', 'n2-1516.plc2.org', 'n2-1517.plc2.org'] +01:== added in slice onefbg_slice1516 foreign ['n2-1516.plc2.org', 'n2-1517.plc2.org', 'n2-1518.plc2.org'] +01:== added in slice onefbh_slice1517 foreign ['n2-1517.plc2.org', 'n2-1518.plc2.org', 'n2-1519.plc2.org'] +01:== added in slice onefbi_slice1518 foreign ['n2-1518.plc2.org', 'n2-1519.plc2.org', 'n2-1520.plc2.org'] +01:== added in slice onefbj_slice1519 foreign ['n2-1519.plc2.org', 'n2-1520.plc2.org', 'n2-1521.plc2.org'] +01:== added in slice onefca_slice1520 foreign ['n2-1520.plc2.org', 'n2-1521.plc2.org', 'n2-1522.plc2.org'] +01:== added in slice onefcb_slice1521 foreign ['n2-1521.plc2.org', 'n2-1522.plc2.org', 'n2-1523.plc2.org'] +01:== added in slice onefcc_slice1522 foreign ['n2-1522.plc2.org', 'n2-1523.plc2.org', 'n2-1524.plc2.org'] +01:== added in slice onefcd_slice1523 foreign ['n2-1523.plc2.org', 'n2-1524.plc2.org', 'n2-1525.plc2.org'] +01:== added in slice onefce_slice1524 foreign ['n2-1524.plc2.org', 'n2-1525.plc2.org', 'n2-1526.plc2.org'] +01:== added in slice onefcf_slice1525 foreign ['n2-1525.plc2.org', 'n2-1526.plc2.org', 'n2-1527.plc2.org'] +01:== added in slice onefcg_slice1526 foreign ['n2-1526.plc2.org', 'n2-1527.plc2.org', 'n2-1528.plc2.org'] +01:== added in slice onefch_slice1527 foreign ['n2-1527.plc2.org', 'n2-1528.plc2.org', 'n2-1529.plc2.org'] +01:== added in slice onefci_slice1528 foreign ['n2-1528.plc2.org', 'n2-1529.plc2.org', 'n2-1530.plc2.org'] +01:== added in slice onefcj_slice1529 foreign ['n2-1529.plc2.org', 'n2-1530.plc2.org', 'n2-1531.plc2.org'] +01:== added in slice onefda_slice1530 foreign ['n2-1530.plc2.org', 'n2-1531.plc2.org', 'n2-1532.plc2.org'] +01:== added in slice onefdb_slice1531 foreign ['n2-1531.plc2.org', 'n2-1532.plc2.org', 'n2-1533.plc2.org'] +01:== added in slice onefdc_slice1532 foreign ['n2-1532.plc2.org', 'n2-1533.plc2.org', 'n2-1534.plc2.org'] +01:== added in slice onefdd_slice1533 foreign ['n2-1533.plc2.org', 'n2-1534.plc2.org', 'n2-1535.plc2.org'] +01:== added in slice onefde_slice1534 foreign ['n2-1534.plc2.org', 'n2-1535.plc2.org', 'n2-1536.plc2.org'] +01:== added in slice onefdf_slice1535 foreign ['n2-1535.plc2.org', 'n2-1536.plc2.org', 'n2-1537.plc2.org'] +01:== added in slice onefdg_slice1536 foreign ['n2-1536.plc2.org', 'n2-1537.plc2.org', 'n2-1538.plc2.org'] +01:== added in slice onefdh_slice1537 foreign ['n2-1537.plc2.org', 'n2-1538.plc2.org', 'n2-1539.plc2.org'] +01:== added in slice onefdi_slice1538 foreign ['n2-1538.plc2.org', 'n2-1539.plc2.org', 'n2-1540.plc2.org'] +01:== added in slice onefdj_slice1539 foreign ['n2-1539.plc2.org', 'n2-1540.plc2.org', 'n2-1541.plc2.org'] +01:== added in slice onefea_slice1540 foreign ['n2-1540.plc2.org', 'n2-1541.plc2.org', 'n2-1542.plc2.org'] +01:== added in slice onefeb_slice1541 foreign ['n2-1541.plc2.org', 'n2-1542.plc2.org', 'n2-1543.plc2.org'] +01:== added in slice onefec_slice1542 foreign ['n2-1542.plc2.org', 'n2-1543.plc2.org', 'n2-1544.plc2.org'] +01:== added in slice onefed_slice1543 foreign ['n2-1543.plc2.org', 'n2-1544.plc2.org', 'n2-1545.plc2.org'] +01:== added in slice onefee_slice1544 foreign ['n2-1544.plc2.org', 'n2-1545.plc2.org', 'n2-1546.plc2.org'] +01:== added in slice onefef_slice1545 foreign ['n2-1545.plc2.org', 'n2-1546.plc2.org', 'n2-1547.plc2.org'] +01:== added in slice onefeg_slice1546 foreign ['n2-1546.plc2.org', 'n2-1547.plc2.org', 'n2-1548.plc2.org'] +01:== added in slice onefeh_slice1547 foreign ['n2-1547.plc2.org', 'n2-1548.plc2.org', 'n2-1549.plc2.org'] +01:== added in slice onefei_slice1548 foreign ['n2-1548.plc2.org', 'n2-1549.plc2.org', 'n2-1550.plc2.org'] +01:== added in slice onefej_slice1549 foreign ['n2-1549.plc2.org', 'n2-1550.plc2.org', 'n2-1551.plc2.org'] +01:== added in slice oneffa_slice1550 foreign ['n2-1550.plc2.org', 'n2-1551.plc2.org', 'n2-1552.plc2.org'] +01:== added in slice oneffb_slice1551 foreign ['n2-1551.plc2.org', 'n2-1552.plc2.org', 'n2-1553.plc2.org'] +01:== added in slice oneffc_slice1552 foreign ['n2-1552.plc2.org', 'n2-1553.plc2.org', 'n2-1554.plc2.org'] +01:== added in slice oneffd_slice1553 foreign ['n2-1553.plc2.org', 'n2-1554.plc2.org', 'n2-1555.plc2.org'] +01:== added in slice oneffe_slice1554 foreign ['n2-1554.plc2.org', 'n2-1555.plc2.org', 'n2-1556.plc2.org'] +01:== added in slice onefff_slice1555 foreign ['n2-1555.plc2.org', 'n2-1556.plc2.org', 'n2-1557.plc2.org'] +01:== added in slice oneffg_slice1556 foreign ['n2-1556.plc2.org', 'n2-1557.plc2.org', 'n2-1558.plc2.org'] +01:== added in slice oneffh_slice1557 foreign ['n2-1557.plc2.org', 'n2-1558.plc2.org', 'n2-1559.plc2.org'] +01:== added in slice oneffi_slice1558 foreign ['n2-1558.plc2.org', 'n2-1559.plc2.org', 'n2-1560.plc2.org'] +01:== added in slice oneffj_slice1559 foreign ['n2-1559.plc2.org', 'n2-1560.plc2.org', 'n2-1561.plc2.org'] +01:== added in slice onefga_slice1560 foreign ['n2-1560.plc2.org', 'n2-1561.plc2.org', 'n2-1562.plc2.org'] +01:== added in slice onefgb_slice1561 foreign ['n2-1561.plc2.org', 'n2-1562.plc2.org', 'n2-1563.plc2.org'] +01:== added in slice onefgc_slice1562 foreign ['n2-1562.plc2.org', 'n2-1563.plc2.org', 'n2-1564.plc2.org'] +01:== added in slice onefgd_slice1563 foreign ['n2-1563.plc2.org', 'n2-1564.plc2.org', 'n2-1565.plc2.org'] +01:== added in slice onefge_slice1564 foreign ['n2-1564.plc2.org', 'n2-1565.plc2.org', 'n2-1566.plc2.org'] +01:== added in slice onefgf_slice1565 foreign ['n2-1565.plc2.org', 'n2-1566.plc2.org', 'n2-1567.plc2.org'] +01:== added in slice onefgg_slice1566 foreign ['n2-1566.plc2.org', 'n2-1567.plc2.org', 'n2-1568.plc2.org'] +01:== added in slice onefgh_slice1567 foreign ['n2-1567.plc2.org', 'n2-1568.plc2.org', 'n2-1569.plc2.org'] +01:== added in slice onefgi_slice1568 foreign ['n2-1568.plc2.org', 'n2-1569.plc2.org', 'n2-1570.plc2.org'] +01:== added in slice onefgj_slice1569 foreign ['n2-1569.plc2.org', 'n2-1570.plc2.org', 'n2-1571.plc2.org'] +01:== added in slice onefha_slice1570 foreign ['n2-1570.plc2.org', 'n2-1571.plc2.org', 'n2-1572.plc2.org'] +01:== added in slice onefhb_slice1571 foreign ['n2-1571.plc2.org', 'n2-1572.plc2.org', 'n2-1573.plc2.org'] +01:== added in slice onefhc_slice1572 foreign ['n2-1572.plc2.org', 'n2-1573.plc2.org', 'n2-1574.plc2.org'] +01:== added in slice onefhd_slice1573 foreign ['n2-1573.plc2.org', 'n2-1574.plc2.org', 'n2-1575.plc2.org'] +01:== added in slice onefhe_slice1574 foreign ['n2-1574.plc2.org', 'n2-1575.plc2.org', 'n2-1576.plc2.org'] +01:== added in slice onefhf_slice1575 foreign ['n2-1575.plc2.org', 'n2-1576.plc2.org', 'n2-1577.plc2.org'] +01:== added in slice onefhg_slice1576 foreign ['n2-1576.plc2.org', 'n2-1577.plc2.org', 'n2-1578.plc2.org'] +01:== added in slice onefhh_slice1577 foreign ['n2-1577.plc2.org', 'n2-1578.plc2.org', 'n2-1579.plc2.org'] +01:== added in slice onefhi_slice1578 foreign ['n2-1578.plc2.org', 'n2-1579.plc2.org', 'n2-1580.plc2.org'] +01:== added in slice onefhj_slice1579 foreign ['n2-1579.plc2.org', 'n2-1580.plc2.org', 'n2-1581.plc2.org'] +01:== added in slice onefia_slice1580 foreign ['n2-1580.plc2.org', 'n2-1581.plc2.org', 'n2-1582.plc2.org'] +01:== added in slice onefib_slice1581 foreign ['n2-1581.plc2.org', 'n2-1582.plc2.org', 'n2-1583.plc2.org'] +01:== added in slice onefic_slice1582 foreign ['n2-1582.plc2.org', 'n2-1583.plc2.org', 'n2-1584.plc2.org'] +01:== added in slice onefid_slice1583 foreign ['n2-1583.plc2.org', 'n2-1584.plc2.org', 'n2-1585.plc2.org'] +01:== added in slice onefie_slice1584 foreign ['n2-1584.plc2.org', 'n2-1585.plc2.org', 'n2-1586.plc2.org'] +01:== added in slice onefif_slice1585 foreign ['n2-1585.plc2.org', 'n2-1586.plc2.org', 'n2-1587.plc2.org'] +01:== added in slice onefig_slice1586 foreign ['n2-1586.plc2.org', 'n2-1587.plc2.org', 'n2-1588.plc2.org'] +01:== added in slice onefih_slice1587 foreign ['n2-1587.plc2.org', 'n2-1588.plc2.org', 'n2-1589.plc2.org'] +01:== added in slice onefii_slice1588 foreign ['n2-1588.plc2.org', 'n2-1589.plc2.org', 'n2-1590.plc2.org'] +01:== added in slice onefij_slice1589 foreign ['n2-1589.plc2.org', 'n2-1590.plc2.org', 'n2-1591.plc2.org'] +01:== added in slice onefja_slice1590 foreign ['n2-1590.plc2.org', 'n2-1591.plc2.org', 'n2-1592.plc2.org'] +01:== added in slice onefjb_slice1591 foreign ['n2-1591.plc2.org', 'n2-1592.plc2.org', 'n2-1593.plc2.org'] +01:== added in slice onefjc_slice1592 foreign ['n2-1592.plc2.org', 'n2-1593.plc2.org', 'n2-1594.plc2.org'] +01:== added in slice onefjd_slice1593 foreign ['n2-1593.plc2.org', 'n2-1594.plc2.org', 'n2-1595.plc2.org'] +01:== added in slice onefje_slice1594 foreign ['n2-1594.plc2.org', 'n2-1595.plc2.org', 'n2-1596.plc2.org'] +01:== added in slice onefjf_slice1595 foreign ['n2-1595.plc2.org', 'n2-1596.plc2.org', 'n2-1597.plc2.org'] +01:== added in slice onefjg_slice1596 foreign ['n2-1596.plc2.org', 'n2-1597.plc2.org', 'n2-1598.plc2.org'] +01:== added in slice onefjh_slice1597 foreign ['n2-1597.plc2.org', 'n2-1598.plc2.org', 'n2-1599.plc2.org'] +01:== added in slice onefji_slice1598 foreign ['n2-1598.plc2.org', 'n2-1599.plc2.org', 'n2-1600.plc2.org'] +01:== added in slice onefjj_slice1599 foreign ['n2-1599.plc2.org', 'n2-1600.plc2.org', 'n2-1601.plc2.org'] +01:== added in slice onegaa_slice1600 foreign ['n2-1600.plc2.org', 'n2-1601.plc2.org', 'n2-1602.plc2.org'] +01:== added in slice onegab_slice1601 foreign ['n2-1601.plc2.org', 'n2-1602.plc2.org', 'n2-1603.plc2.org'] +01:== added in slice onegac_slice1602 foreign ['n2-1602.plc2.org', 'n2-1603.plc2.org', 'n2-1604.plc2.org'] +01:== added in slice onegad_slice1603 foreign ['n2-1603.plc2.org', 'n2-1604.plc2.org', 'n2-1605.plc2.org'] +01:== added in slice onegae_slice1604 foreign ['n2-1604.plc2.org', 'n2-1605.plc2.org', 'n2-1606.plc2.org'] +01:== added in slice onegaf_slice1605 foreign ['n2-1605.plc2.org', 'n2-1606.plc2.org', 'n2-1607.plc2.org'] +01:== added in slice onegag_slice1606 foreign ['n2-1606.plc2.org', 'n2-1607.plc2.org', 'n2-1608.plc2.org'] +01:== added in slice onegah_slice1607 foreign ['n2-1607.plc2.org', 'n2-1608.plc2.org', 'n2-1609.plc2.org'] +01:== added in slice onegai_slice1608 foreign ['n2-1608.plc2.org', 'n2-1609.plc2.org', 'n2-1610.plc2.org'] +01:== added in slice onegaj_slice1609 foreign ['n2-1609.plc2.org', 'n2-1610.plc2.org', 'n2-1611.plc2.org'] +01:== added in slice onegba_slice1610 foreign ['n2-1610.plc2.org', 'n2-1611.plc2.org', 'n2-1612.plc2.org'] +01:== added in slice onegbb_slice1611 foreign ['n2-1611.plc2.org', 'n2-1612.plc2.org', 'n2-1613.plc2.org'] +01:== added in slice onegbc_slice1612 foreign ['n2-1612.plc2.org', 'n2-1613.plc2.org', 'n2-1614.plc2.org'] +01:== added in slice onegbd_slice1613 foreign ['n2-1613.plc2.org', 'n2-1614.plc2.org', 'n2-1615.plc2.org'] +01:== added in slice onegbe_slice1614 foreign ['n2-1614.plc2.org', 'n2-1615.plc2.org', 'n2-1616.plc2.org'] +01:== added in slice onegbf_slice1615 foreign ['n2-1615.plc2.org', 'n2-1616.plc2.org', 'n2-1617.plc2.org'] +01:== added in slice onegbg_slice1616 foreign ['n2-1616.plc2.org', 'n2-1617.plc2.org', 'n2-1618.plc2.org'] +01:== added in slice onegbh_slice1617 foreign ['n2-1617.plc2.org', 'n2-1618.plc2.org', 'n2-1619.plc2.org'] +01:== added in slice onegbi_slice1618 foreign ['n2-1618.plc2.org', 'n2-1619.plc2.org', 'n2-1620.plc2.org'] +01:== added in slice onegbj_slice1619 foreign ['n2-1619.plc2.org', 'n2-1620.plc2.org', 'n2-1621.plc2.org'] +01:== added in slice onegca_slice1620 foreign ['n2-1620.plc2.org', 'n2-1621.plc2.org', 'n2-1622.plc2.org'] +01:== added in slice onegcb_slice1621 foreign ['n2-1621.plc2.org', 'n2-1622.plc2.org', 'n2-1623.plc2.org'] +01:== added in slice onegcc_slice1622 foreign ['n2-1622.plc2.org', 'n2-1623.plc2.org', 'n2-1624.plc2.org'] +01:== added in slice onegcd_slice1623 foreign ['n2-1623.plc2.org', 'n2-1624.plc2.org', 'n2-1625.plc2.org'] +01:== added in slice onegce_slice1624 foreign ['n2-1624.plc2.org', 'n2-1625.plc2.org', 'n2-1626.plc2.org'] +01:== added in slice onegcf_slice1625 foreign ['n2-1625.plc2.org', 'n2-1626.plc2.org', 'n2-1627.plc2.org'] +01:== added in slice onegcg_slice1626 foreign ['n2-1626.plc2.org', 'n2-1627.plc2.org', 'n2-1628.plc2.org'] +01:== added in slice onegch_slice1627 foreign ['n2-1627.plc2.org', 'n2-1628.plc2.org', 'n2-1629.plc2.org'] +01:== added in slice onegci_slice1628 foreign ['n2-1628.plc2.org', 'n2-1629.plc2.org', 'n2-1630.plc2.org'] +01:== added in slice onegcj_slice1629 foreign ['n2-1629.plc2.org', 'n2-1630.plc2.org', 'n2-1631.plc2.org'] +01:== added in slice onegda_slice1630 foreign ['n2-1630.plc2.org', 'n2-1631.plc2.org', 'n2-1632.plc2.org'] +01:== added in slice onegdb_slice1631 foreign ['n2-1631.plc2.org', 'n2-1632.plc2.org', 'n2-1633.plc2.org'] +01:== added in slice onegdc_slice1632 foreign ['n2-1632.plc2.org', 'n2-1633.plc2.org', 'n2-1634.plc2.org'] +01:== added in slice onegdd_slice1633 foreign ['n2-1633.plc2.org', 'n2-1634.plc2.org', 'n2-1635.plc2.org'] +01:== added in slice onegde_slice1634 foreign ['n2-1634.plc2.org', 'n2-1635.plc2.org', 'n2-1636.plc2.org'] +01:== added in slice onegdf_slice1635 foreign ['n2-1635.plc2.org', 'n2-1636.plc2.org', 'n2-1637.plc2.org'] +01:== added in slice onegdg_slice1636 foreign ['n2-1636.plc2.org', 'n2-1637.plc2.org', 'n2-1638.plc2.org'] +01:== added in slice onegdh_slice1637 foreign ['n2-1637.plc2.org', 'n2-1638.plc2.org', 'n2-1639.plc2.org'] +01:== added in slice onegdi_slice1638 foreign ['n2-1638.plc2.org', 'n2-1639.plc2.org', 'n2-1640.plc2.org'] +01:== added in slice onegdj_slice1639 foreign ['n2-1639.plc2.org', 'n2-1640.plc2.org', 'n2-1641.plc2.org'] +01:== added in slice onegea_slice1640 foreign ['n2-1640.plc2.org', 'n2-1641.plc2.org', 'n2-1642.plc2.org'] +01:== added in slice onegeb_slice1641 foreign ['n2-1641.plc2.org', 'n2-1642.plc2.org', 'n2-1643.plc2.org'] +01:== added in slice onegec_slice1642 foreign ['n2-1642.plc2.org', 'n2-1643.plc2.org', 'n2-1644.plc2.org'] +01:== added in slice oneged_slice1643 foreign ['n2-1643.plc2.org', 'n2-1644.plc2.org', 'n2-1645.plc2.org'] +01:== added in slice onegee_slice1644 foreign ['n2-1644.plc2.org', 'n2-1645.plc2.org', 'n2-1646.plc2.org'] +01:== added in slice onegef_slice1645 foreign ['n2-1645.plc2.org', 'n2-1646.plc2.org', 'n2-1647.plc2.org'] +01:== added in slice onegeg_slice1646 foreign ['n2-1646.plc2.org', 'n2-1647.plc2.org', 'n2-1648.plc2.org'] +01:== added in slice onegeh_slice1647 foreign ['n2-1647.plc2.org', 'n2-1648.plc2.org', 'n2-1649.plc2.org'] +01:== added in slice onegei_slice1648 foreign ['n2-1648.plc2.org', 'n2-1649.plc2.org', 'n2-1650.plc2.org'] +01:== added in slice onegej_slice1649 foreign ['n2-1649.plc2.org', 'n2-1650.plc2.org', 'n2-1651.plc2.org'] +01:== added in slice onegfa_slice1650 foreign ['n2-1650.plc2.org', 'n2-1651.plc2.org', 'n2-1652.plc2.org'] +01:== added in slice onegfb_slice1651 foreign ['n2-1651.plc2.org', 'n2-1652.plc2.org', 'n2-1653.plc2.org'] +01:== added in slice onegfc_slice1652 foreign ['n2-1652.plc2.org', 'n2-1653.plc2.org', 'n2-1654.plc2.org'] +01:== added in slice onegfd_slice1653 foreign ['n2-1653.plc2.org', 'n2-1654.plc2.org', 'n2-1655.plc2.org'] +01:== added in slice onegfe_slice1654 foreign ['n2-1654.plc2.org', 'n2-1655.plc2.org', 'n2-1656.plc2.org'] +01:== added in slice onegff_slice1655 foreign ['n2-1655.plc2.org', 'n2-1656.plc2.org', 'n2-1657.plc2.org'] +01:== added in slice onegfg_slice1656 foreign ['n2-1656.plc2.org', 'n2-1657.plc2.org', 'n2-1658.plc2.org'] +01:== added in slice onegfh_slice1657 foreign ['n2-1657.plc2.org', 'n2-1658.plc2.org', 'n2-1659.plc2.org'] +01:== added in slice onegfi_slice1658 foreign ['n2-1658.plc2.org', 'n2-1659.plc2.org', 'n2-1660.plc2.org'] +01:== added in slice onegfj_slice1659 foreign ['n2-1659.plc2.org', 'n2-1660.plc2.org', 'n2-1661.plc2.org'] +01:== added in slice onegga_slice1660 foreign ['n2-1660.plc2.org', 'n2-1661.plc2.org', 'n2-1662.plc2.org'] +01:== added in slice oneggb_slice1661 foreign ['n2-1661.plc2.org', 'n2-1662.plc2.org', 'n2-1663.plc2.org'] +01:== added in slice oneggc_slice1662 foreign ['n2-1662.plc2.org', 'n2-1663.plc2.org', 'n2-1664.plc2.org'] +01:== added in slice oneggd_slice1663 foreign ['n2-1663.plc2.org', 'n2-1664.plc2.org', 'n2-1665.plc2.org'] +01:== added in slice onegge_slice1664 foreign ['n2-1664.plc2.org', 'n2-1665.plc2.org', 'n2-1666.plc2.org'] +01:== added in slice oneggf_slice1665 foreign ['n2-1665.plc2.org', 'n2-1666.plc2.org', 'n2-1667.plc2.org'] +01:== added in slice oneggg_slice1666 foreign ['n2-1666.plc2.org', 'n2-1667.plc2.org', 'n2-1668.plc2.org'] +01:== added in slice oneggh_slice1667 foreign ['n2-1667.plc2.org', 'n2-1668.plc2.org', 'n2-1669.plc2.org'] +01:== added in slice oneggi_slice1668 foreign ['n2-1668.plc2.org', 'n2-1669.plc2.org', 'n2-1670.plc2.org'] +01:== added in slice oneggj_slice1669 foreign ['n2-1669.plc2.org', 'n2-1670.plc2.org', 'n2-1671.plc2.org'] +01:== added in slice onegha_slice1670 foreign ['n2-1670.plc2.org', 'n2-1671.plc2.org', 'n2-1672.plc2.org'] +01:== added in slice oneghb_slice1671 foreign ['n2-1671.plc2.org', 'n2-1672.plc2.org', 'n2-1673.plc2.org'] +01:== added in slice oneghc_slice1672 foreign ['n2-1672.plc2.org', 'n2-1673.plc2.org', 'n2-1674.plc2.org'] +01:== added in slice oneghd_slice1673 foreign ['n2-1673.plc2.org', 'n2-1674.plc2.org', 'n2-1675.plc2.org'] +01:== added in slice oneghe_slice1674 foreign ['n2-1674.plc2.org', 'n2-1675.plc2.org', 'n2-1676.plc2.org'] +01:== added in slice oneghf_slice1675 foreign ['n2-1675.plc2.org', 'n2-1676.plc2.org', 'n2-1677.plc2.org'] +01:== added in slice oneghg_slice1676 foreign ['n2-1676.plc2.org', 'n2-1677.plc2.org', 'n2-1678.plc2.org'] +01:== added in slice oneghh_slice1677 foreign ['n2-1677.plc2.org', 'n2-1678.plc2.org', 'n2-1679.plc2.org'] +01:== added in slice oneghi_slice1678 foreign ['n2-1678.plc2.org', 'n2-1679.plc2.org', 'n2-1680.plc2.org'] +01:== added in slice oneghj_slice1679 foreign ['n2-1679.plc2.org', 'n2-1680.plc2.org', 'n2-1681.plc2.org'] +01:== added in slice onegia_slice1680 foreign ['n2-1680.plc2.org', 'n2-1681.plc2.org', 'n2-1682.plc2.org'] +01:== added in slice onegib_slice1681 foreign ['n2-1681.plc2.org', 'n2-1682.plc2.org', 'n2-1683.plc2.org'] +01:== added in slice onegic_slice1682 foreign ['n2-1682.plc2.org', 'n2-1683.plc2.org', 'n2-1684.plc2.org'] +01:== added in slice onegid_slice1683 foreign ['n2-1683.plc2.org', 'n2-1684.plc2.org', 'n2-1685.plc2.org'] +01:== added in slice onegie_slice1684 foreign ['n2-1684.plc2.org', 'n2-1685.plc2.org', 'n2-1686.plc2.org'] +01:== added in slice onegif_slice1685 foreign ['n2-1685.plc2.org', 'n2-1686.plc2.org', 'n2-1687.plc2.org'] +01:== added in slice onegig_slice1686 foreign ['n2-1686.plc2.org', 'n2-1687.plc2.org', 'n2-1688.plc2.org'] +01:== added in slice onegih_slice1687 foreign ['n2-1687.plc2.org', 'n2-1688.plc2.org', 'n2-1689.plc2.org'] +01:== added in slice onegii_slice1688 foreign ['n2-1688.plc2.org', 'n2-1689.plc2.org', 'n2-1690.plc2.org'] +01:== added in slice onegij_slice1689 foreign ['n2-1689.plc2.org', 'n2-1690.plc2.org', 'n2-1691.plc2.org'] +01:== added in slice onegja_slice1690 foreign ['n2-1690.plc2.org', 'n2-1691.plc2.org', 'n2-1692.plc2.org'] +01:== added in slice onegjb_slice1691 foreign ['n2-1691.plc2.org', 'n2-1692.plc2.org', 'n2-1693.plc2.org'] +01:== added in slice onegjc_slice1692 foreign ['n2-1692.plc2.org', 'n2-1693.plc2.org', 'n2-1694.plc2.org'] +01:== added in slice onegjd_slice1693 foreign ['n2-1693.plc2.org', 'n2-1694.plc2.org', 'n2-1695.plc2.org'] +01:== added in slice onegje_slice1694 foreign ['n2-1694.plc2.org', 'n2-1695.plc2.org', 'n2-1696.plc2.org'] +01:== added in slice onegjf_slice1695 foreign ['n2-1695.plc2.org', 'n2-1696.plc2.org', 'n2-1697.plc2.org'] +01:== added in slice onegjg_slice1696 foreign ['n2-1696.plc2.org', 'n2-1697.plc2.org', 'n2-1698.plc2.org'] +01:== added in slice onegjh_slice1697 foreign ['n2-1697.plc2.org', 'n2-1698.plc2.org', 'n2-1699.plc2.org'] +01:== added in slice onegji_slice1698 foreign ['n2-1698.plc2.org', 'n2-1699.plc2.org', 'n2-1700.plc2.org'] +01:== added in slice onegjj_slice1699 foreign ['n2-1699.plc2.org', 'n2-1700.plc2.org', 'n2-1701.plc2.org'] +01:== added in slice onehaa_slice1700 foreign ['n2-1700.plc2.org', 'n2-1701.plc2.org', 'n2-1702.plc2.org'] +01:== added in slice onehab_slice1701 foreign ['n2-1701.plc2.org', 'n2-1702.plc2.org', 'n2-1703.plc2.org'] +01:== added in slice onehac_slice1702 foreign ['n2-1702.plc2.org', 'n2-1703.plc2.org', 'n2-1704.plc2.org'] +01:== added in slice onehad_slice1703 foreign ['n2-1703.plc2.org', 'n2-1704.plc2.org', 'n2-1705.plc2.org'] +01:== added in slice onehae_slice1704 foreign ['n2-1704.plc2.org', 'n2-1705.plc2.org', 'n2-1706.plc2.org'] +01:== added in slice onehaf_slice1705 foreign ['n2-1705.plc2.org', 'n2-1706.plc2.org', 'n2-1707.plc2.org'] +01:== added in slice onehag_slice1706 foreign ['n2-1706.plc2.org', 'n2-1707.plc2.org', 'n2-1708.plc2.org'] +01:== added in slice onehah_slice1707 foreign ['n2-1707.plc2.org', 'n2-1708.plc2.org', 'n2-1709.plc2.org'] +01:== added in slice onehai_slice1708 foreign ['n2-1708.plc2.org', 'n2-1709.plc2.org', 'n2-1710.plc2.org'] +01:== added in slice onehaj_slice1709 foreign ['n2-1709.plc2.org', 'n2-1710.plc2.org', 'n2-1711.plc2.org'] +01:== added in slice onehba_slice1710 foreign ['n2-1710.plc2.org', 'n2-1711.plc2.org', 'n2-1712.plc2.org'] +01:== added in slice onehbb_slice1711 foreign ['n2-1711.plc2.org', 'n2-1712.plc2.org', 'n2-1713.plc2.org'] +01:== added in slice onehbc_slice1712 foreign ['n2-1712.plc2.org', 'n2-1713.plc2.org', 'n2-1714.plc2.org'] +01:== added in slice onehbd_slice1713 foreign ['n2-1713.plc2.org', 'n2-1714.plc2.org', 'n2-1715.plc2.org'] +01:== added in slice onehbe_slice1714 foreign ['n2-1714.plc2.org', 'n2-1715.plc2.org', 'n2-1716.plc2.org'] +01:== added in slice onehbf_slice1715 foreign ['n2-1715.plc2.org', 'n2-1716.plc2.org', 'n2-1717.plc2.org'] +01:== added in slice onehbg_slice1716 foreign ['n2-1716.plc2.org', 'n2-1717.plc2.org', 'n2-1718.plc2.org'] +01:== added in slice onehbh_slice1717 foreign ['n2-1717.plc2.org', 'n2-1718.plc2.org', 'n2-1719.plc2.org'] +01:== added in slice onehbi_slice1718 foreign ['n2-1718.plc2.org', 'n2-1719.plc2.org', 'n2-1720.plc2.org'] +01:== added in slice onehbj_slice1719 foreign ['n2-1719.plc2.org', 'n2-1720.plc2.org', 'n2-1721.plc2.org'] +01:== added in slice onehca_slice1720 foreign ['n2-1720.plc2.org', 'n2-1721.plc2.org', 'n2-1722.plc2.org'] +01:== added in slice onehcb_slice1721 foreign ['n2-1721.plc2.org', 'n2-1722.plc2.org', 'n2-1723.plc2.org'] +01:== added in slice onehcc_slice1722 foreign ['n2-1722.plc2.org', 'n2-1723.plc2.org', 'n2-1724.plc2.org'] +01:== added in slice onehcd_slice1723 foreign ['n2-1723.plc2.org', 'n2-1724.plc2.org', 'n2-1725.plc2.org'] +01:== added in slice onehce_slice1724 foreign ['n2-1724.plc2.org', 'n2-1725.plc2.org', 'n2-1726.plc2.org'] +01:== added in slice onehcf_slice1725 foreign ['n2-1725.plc2.org', 'n2-1726.plc2.org', 'n2-1727.plc2.org'] +01:== added in slice onehcg_slice1726 foreign ['n2-1726.plc2.org', 'n2-1727.plc2.org', 'n2-1728.plc2.org'] +01:== added in slice onehch_slice1727 foreign ['n2-1727.plc2.org', 'n2-1728.plc2.org', 'n2-1729.plc2.org'] +01:== added in slice onehci_slice1728 foreign ['n2-1728.plc2.org', 'n2-1729.plc2.org', 'n2-1730.plc2.org'] +01:== added in slice onehcj_slice1729 foreign ['n2-1729.plc2.org', 'n2-1730.plc2.org', 'n2-1731.plc2.org'] +01:== added in slice onehda_slice1730 foreign ['n2-1730.plc2.org', 'n2-1731.plc2.org', 'n2-1732.plc2.org'] +01:== added in slice onehdb_slice1731 foreign ['n2-1731.plc2.org', 'n2-1732.plc2.org', 'n2-1733.plc2.org'] +01:== added in slice onehdc_slice1732 foreign ['n2-1732.plc2.org', 'n2-1733.plc2.org', 'n2-1734.plc2.org'] +01:== added in slice onehdd_slice1733 foreign ['n2-1733.plc2.org', 'n2-1734.plc2.org', 'n2-1735.plc2.org'] +01:== added in slice onehde_slice1734 foreign ['n2-1734.plc2.org', 'n2-1735.plc2.org', 'n2-1736.plc2.org'] +01:== added in slice onehdf_slice1735 foreign ['n2-1735.plc2.org', 'n2-1736.plc2.org', 'n2-1737.plc2.org'] +01:== added in slice onehdg_slice1736 foreign ['n2-1736.plc2.org', 'n2-1737.plc2.org', 'n2-1738.plc2.org'] +01:== added in slice onehdh_slice1737 foreign ['n2-1737.plc2.org', 'n2-1738.plc2.org', 'n2-1739.plc2.org'] +01:== added in slice onehdi_slice1738 foreign ['n2-1738.plc2.org', 'n2-1739.plc2.org', 'n2-1740.plc2.org'] +01:== added in slice onehdj_slice1739 foreign ['n2-1739.plc2.org', 'n2-1740.plc2.org', 'n2-1741.plc2.org'] +01:== added in slice onehea_slice1740 foreign ['n2-1740.plc2.org', 'n2-1741.plc2.org', 'n2-1742.plc2.org'] +01:== added in slice oneheb_slice1741 foreign ['n2-1741.plc2.org', 'n2-1742.plc2.org', 'n2-1743.plc2.org'] +01:== added in slice onehec_slice1742 foreign ['n2-1742.plc2.org', 'n2-1743.plc2.org', 'n2-1744.plc2.org'] +01:== added in slice onehed_slice1743 foreign ['n2-1743.plc2.org', 'n2-1744.plc2.org', 'n2-1745.plc2.org'] +01:== added in slice onehee_slice1744 foreign ['n2-1744.plc2.org', 'n2-1745.plc2.org', 'n2-1746.plc2.org'] +01:== added in slice onehef_slice1745 foreign ['n2-1745.plc2.org', 'n2-1746.plc2.org', 'n2-1747.plc2.org'] +01:== added in slice oneheg_slice1746 foreign ['n2-1746.plc2.org', 'n2-1747.plc2.org', 'n2-1748.plc2.org'] +01:== added in slice oneheh_slice1747 foreign ['n2-1747.plc2.org', 'n2-1748.plc2.org', 'n2-1749.plc2.org'] +01:== added in slice onehei_slice1748 foreign ['n2-1748.plc2.org', 'n2-1749.plc2.org', 'n2-1750.plc2.org'] +01:== added in slice onehej_slice1749 foreign ['n2-1749.plc2.org', 'n2-1750.plc2.org', 'n2-1751.plc2.org'] +01:== added in slice onehfa_slice1750 foreign ['n2-1750.plc2.org', 'n2-1751.plc2.org', 'n2-1752.plc2.org'] +01:== added in slice onehfb_slice1751 foreign ['n2-1751.plc2.org', 'n2-1752.plc2.org', 'n2-1753.plc2.org'] +01:== added in slice onehfc_slice1752 foreign ['n2-1752.plc2.org', 'n2-1753.plc2.org', 'n2-1754.plc2.org'] +01:== added in slice onehfd_slice1753 foreign ['n2-1753.plc2.org', 'n2-1754.plc2.org', 'n2-1755.plc2.org'] +01:== added in slice onehfe_slice1754 foreign ['n2-1754.plc2.org', 'n2-1755.plc2.org', 'n2-1756.plc2.org'] +01:== added in slice onehff_slice1755 foreign ['n2-1755.plc2.org', 'n2-1756.plc2.org', 'n2-1757.plc2.org'] +01:== added in slice onehfg_slice1756 foreign ['n2-1756.plc2.org', 'n2-1757.plc2.org', 'n2-1758.plc2.org'] +01:== added in slice onehfh_slice1757 foreign ['n2-1757.plc2.org', 'n2-1758.plc2.org', 'n2-1759.plc2.org'] +01:== added in slice onehfi_slice1758 foreign ['n2-1758.plc2.org', 'n2-1759.plc2.org', 'n2-1760.plc2.org'] +01:== added in slice onehfj_slice1759 foreign ['n2-1759.plc2.org', 'n2-1760.plc2.org', 'n2-1761.plc2.org'] +01:== added in slice onehga_slice1760 foreign ['n2-1760.plc2.org', 'n2-1761.plc2.org', 'n2-1762.plc2.org'] +01:== added in slice onehgb_slice1761 foreign ['n2-1761.plc2.org', 'n2-1762.plc2.org', 'n2-1763.plc2.org'] +01:== added in slice onehgc_slice1762 foreign ['n2-1762.plc2.org', 'n2-1763.plc2.org', 'n2-1764.plc2.org'] +01:== added in slice onehgd_slice1763 foreign ['n2-1763.plc2.org', 'n2-1764.plc2.org', 'n2-1765.plc2.org'] +01:== added in slice onehge_slice1764 foreign ['n2-1764.plc2.org', 'n2-1765.plc2.org', 'n2-1766.plc2.org'] +01:== added in slice onehgf_slice1765 foreign ['n2-1765.plc2.org', 'n2-1766.plc2.org', 'n2-1767.plc2.org'] +01:== added in slice onehgg_slice1766 foreign ['n2-1766.plc2.org', 'n2-1767.plc2.org', 'n2-1768.plc2.org'] +01:== added in slice onehgh_slice1767 foreign ['n2-1767.plc2.org', 'n2-1768.plc2.org', 'n2-1769.plc2.org'] +01:== added in slice onehgi_slice1768 foreign ['n2-1768.plc2.org', 'n2-1769.plc2.org', 'n2-1770.plc2.org'] +01:== added in slice onehgj_slice1769 foreign ['n2-1769.plc2.org', 'n2-1770.plc2.org', 'n2-1771.plc2.org'] +01:== added in slice onehha_slice1770 foreign ['n2-1770.plc2.org', 'n2-1771.plc2.org', 'n2-1772.plc2.org'] +01:== added in slice onehhb_slice1771 foreign ['n2-1771.plc2.org', 'n2-1772.plc2.org', 'n2-1773.plc2.org'] +01:== added in slice onehhc_slice1772 foreign ['n2-1772.plc2.org', 'n2-1773.plc2.org', 'n2-1774.plc2.org'] +01:== added in slice onehhd_slice1773 foreign ['n2-1773.plc2.org', 'n2-1774.plc2.org', 'n2-1775.plc2.org'] +01:== added in slice onehhe_slice1774 foreign ['n2-1774.plc2.org', 'n2-1775.plc2.org', 'n2-1776.plc2.org'] +01:== added in slice onehhf_slice1775 foreign ['n2-1775.plc2.org', 'n2-1776.plc2.org', 'n2-1777.plc2.org'] +01:== added in slice onehhg_slice1776 foreign ['n2-1776.plc2.org', 'n2-1777.plc2.org', 'n2-1778.plc2.org'] +01:== added in slice onehhh_slice1777 foreign ['n2-1777.plc2.org', 'n2-1778.plc2.org', 'n2-1779.plc2.org'] +01:== added in slice onehhi_slice1778 foreign ['n2-1778.plc2.org', 'n2-1779.plc2.org', 'n2-1780.plc2.org'] +01:== added in slice onehhj_slice1779 foreign ['n2-1779.plc2.org', 'n2-1780.plc2.org', 'n2-1781.plc2.org'] +01:== added in slice onehia_slice1780 foreign ['n2-1780.plc2.org', 'n2-1781.plc2.org', 'n2-1782.plc2.org'] +01:== added in slice onehib_slice1781 foreign ['n2-1781.plc2.org', 'n2-1782.plc2.org', 'n2-1783.plc2.org'] +01:== added in slice onehic_slice1782 foreign ['n2-1782.plc2.org', 'n2-1783.plc2.org', 'n2-1784.plc2.org'] +01:== added in slice onehid_slice1783 foreign ['n2-1783.plc2.org', 'n2-1784.plc2.org', 'n2-1785.plc2.org'] +01:== added in slice onehie_slice1784 foreign ['n2-1784.plc2.org', 'n2-1785.plc2.org', 'n2-1786.plc2.org'] +01:== added in slice onehif_slice1785 foreign ['n2-1785.plc2.org', 'n2-1786.plc2.org', 'n2-1787.plc2.org'] +01:== added in slice onehig_slice1786 foreign ['n2-1786.plc2.org', 'n2-1787.plc2.org', 'n2-1788.plc2.org'] +01:== added in slice onehih_slice1787 foreign ['n2-1787.plc2.org', 'n2-1788.plc2.org', 'n2-1789.plc2.org'] +01:== added in slice onehii_slice1788 foreign ['n2-1788.plc2.org', 'n2-1789.plc2.org', 'n2-1790.plc2.org'] +01:== added in slice onehij_slice1789 foreign ['n2-1789.plc2.org', 'n2-1790.plc2.org', 'n2-1791.plc2.org'] +01:== added in slice onehja_slice1790 foreign ['n2-1790.plc2.org', 'n2-1791.plc2.org', 'n2-1792.plc2.org'] +01:== added in slice onehjb_slice1791 foreign ['n2-1791.plc2.org', 'n2-1792.plc2.org', 'n2-1793.plc2.org'] +01:== added in slice onehjc_slice1792 foreign ['n2-1792.plc2.org', 'n2-1793.plc2.org', 'n2-1794.plc2.org'] +01:== added in slice onehjd_slice1793 foreign ['n2-1793.plc2.org', 'n2-1794.plc2.org', 'n2-1795.plc2.org'] +01:== added in slice onehje_slice1794 foreign ['n2-1794.plc2.org', 'n2-1795.plc2.org', 'n2-1796.plc2.org'] +01:== added in slice onehjf_slice1795 foreign ['n2-1795.plc2.org', 'n2-1796.plc2.org', 'n2-1797.plc2.org'] +01:== added in slice onehjg_slice1796 foreign ['n2-1796.plc2.org', 'n2-1797.plc2.org', 'n2-1798.plc2.org'] +01:== added in slice onehjh_slice1797 foreign ['n2-1797.plc2.org', 'n2-1798.plc2.org', 'n2-1799.plc2.org'] +01:== added in slice onehji_slice1798 foreign ['n2-1798.plc2.org', 'n2-1799.plc2.org', 'n2-1800.plc2.org'] +01:== added in slice onehjj_slice1799 foreign ['n2-1799.plc2.org', 'n2-1800.plc2.org', 'n2-1801.plc2.org'] +01:== added in slice oneiaa_slice1800 foreign ['n2-1800.plc2.org', 'n2-1801.plc2.org', 'n2-1802.plc2.org'] +01:== added in slice oneiab_slice1801 foreign ['n2-1801.plc2.org', 'n2-1802.plc2.org', 'n2-1803.plc2.org'] +01:== added in slice oneiac_slice1802 foreign ['n2-1802.plc2.org', 'n2-1803.plc2.org', 'n2-1804.plc2.org'] +01:== added in slice oneiad_slice1803 foreign ['n2-1803.plc2.org', 'n2-1804.plc2.org', 'n2-1805.plc2.org'] +01:== added in slice oneiae_slice1804 foreign ['n2-1804.plc2.org', 'n2-1805.plc2.org', 'n2-1806.plc2.org'] +01:== added in slice oneiaf_slice1805 foreign ['n2-1805.plc2.org', 'n2-1806.plc2.org', 'n2-1807.plc2.org'] +01:== added in slice oneiag_slice1806 foreign ['n2-1806.plc2.org', 'n2-1807.plc2.org', 'n2-1808.plc2.org'] +01:== added in slice oneiah_slice1807 foreign ['n2-1807.plc2.org', 'n2-1808.plc2.org', 'n2-1809.plc2.org'] +01:== added in slice oneiai_slice1808 foreign ['n2-1808.plc2.org', 'n2-1809.plc2.org', 'n2-1810.plc2.org'] +01:== added in slice oneiaj_slice1809 foreign ['n2-1809.plc2.org', 'n2-1810.plc2.org', 'n2-1811.plc2.org'] +01:== added in slice oneiba_slice1810 foreign ['n2-1810.plc2.org', 'n2-1811.plc2.org', 'n2-1812.plc2.org'] +01:== added in slice oneibb_slice1811 foreign ['n2-1811.plc2.org', 'n2-1812.plc2.org', 'n2-1813.plc2.org'] +01:== added in slice oneibc_slice1812 foreign ['n2-1812.plc2.org', 'n2-1813.plc2.org', 'n2-1814.plc2.org'] +01:== added in slice oneibd_slice1813 foreign ['n2-1813.plc2.org', 'n2-1814.plc2.org', 'n2-1815.plc2.org'] +01:== added in slice oneibe_slice1814 foreign ['n2-1814.plc2.org', 'n2-1815.plc2.org', 'n2-1816.plc2.org'] +01:== added in slice oneibf_slice1815 foreign ['n2-1815.plc2.org', 'n2-1816.plc2.org', 'n2-1817.plc2.org'] +01:== added in slice oneibg_slice1816 foreign ['n2-1816.plc2.org', 'n2-1817.plc2.org', 'n2-1818.plc2.org'] +01:== added in slice oneibh_slice1817 foreign ['n2-1817.plc2.org', 'n2-1818.plc2.org', 'n2-1819.plc2.org'] +01:== added in slice oneibi_slice1818 foreign ['n2-1818.plc2.org', 'n2-1819.plc2.org', 'n2-1820.plc2.org'] +01:== added in slice oneibj_slice1819 foreign ['n2-1819.plc2.org', 'n2-1820.plc2.org', 'n2-1821.plc2.org'] +01:== added in slice oneica_slice1820 foreign ['n2-1820.plc2.org', 'n2-1821.plc2.org', 'n2-1822.plc2.org'] +01:== added in slice oneicb_slice1821 foreign ['n2-1821.plc2.org', 'n2-1822.plc2.org', 'n2-1823.plc2.org'] +01:== added in slice oneicc_slice1822 foreign ['n2-1822.plc2.org', 'n2-1823.plc2.org', 'n2-1824.plc2.org'] +01:== added in slice oneicd_slice1823 foreign ['n2-1823.plc2.org', 'n2-1824.plc2.org', 'n2-1825.plc2.org'] +01:== added in slice oneice_slice1824 foreign ['n2-1824.plc2.org', 'n2-1825.plc2.org', 'n2-1826.plc2.org'] +01:== added in slice oneicf_slice1825 foreign ['n2-1825.plc2.org', 'n2-1826.plc2.org', 'n2-1827.plc2.org'] +01:== added in slice oneicg_slice1826 foreign ['n2-1826.plc2.org', 'n2-1827.plc2.org', 'n2-1828.plc2.org'] +01:== added in slice oneich_slice1827 foreign ['n2-1827.plc2.org', 'n2-1828.plc2.org', 'n2-1829.plc2.org'] +01:== added in slice oneici_slice1828 foreign ['n2-1828.plc2.org', 'n2-1829.plc2.org', 'n2-1830.plc2.org'] +01:== added in slice oneicj_slice1829 foreign ['n2-1829.plc2.org', 'n2-1830.plc2.org', 'n2-1831.plc2.org'] +01:== added in slice oneida_slice1830 foreign ['n2-1830.plc2.org', 'n2-1831.plc2.org', 'n2-1832.plc2.org'] +01:== added in slice oneidb_slice1831 foreign ['n2-1831.plc2.org', 'n2-1832.plc2.org', 'n2-1833.plc2.org'] +01:== added in slice oneidc_slice1832 foreign ['n2-1832.plc2.org', 'n2-1833.plc2.org', 'n2-1834.plc2.org'] +01:== added in slice oneidd_slice1833 foreign ['n2-1833.plc2.org', 'n2-1834.plc2.org', 'n2-1835.plc2.org'] +01:== added in slice oneide_slice1834 foreign ['n2-1834.plc2.org', 'n2-1835.plc2.org', 'n2-1836.plc2.org'] +01:== added in slice oneidf_slice1835 foreign ['n2-1835.plc2.org', 'n2-1836.plc2.org', 'n2-1837.plc2.org'] +01:== added in slice oneidg_slice1836 foreign ['n2-1836.plc2.org', 'n2-1837.plc2.org', 'n2-1838.plc2.org'] +01:== added in slice oneidh_slice1837 foreign ['n2-1837.plc2.org', 'n2-1838.plc2.org', 'n2-1839.plc2.org'] +01:== added in slice oneidi_slice1838 foreign ['n2-1838.plc2.org', 'n2-1839.plc2.org', 'n2-1840.plc2.org'] +01:== added in slice oneidj_slice1839 foreign ['n2-1839.plc2.org', 'n2-1840.plc2.org', 'n2-1841.plc2.org'] +01:== added in slice oneiea_slice1840 foreign ['n2-1840.plc2.org', 'n2-1841.plc2.org', 'n2-1842.plc2.org'] +01:== added in slice oneieb_slice1841 foreign ['n2-1841.plc2.org', 'n2-1842.plc2.org', 'n2-1843.plc2.org'] +01:== added in slice oneiec_slice1842 foreign ['n2-1842.plc2.org', 'n2-1843.plc2.org', 'n2-1844.plc2.org'] +01:== added in slice oneied_slice1843 foreign ['n2-1843.plc2.org', 'n2-1844.plc2.org', 'n2-1845.plc2.org'] +01:== added in slice oneiee_slice1844 foreign ['n2-1844.plc2.org', 'n2-1845.plc2.org', 'n2-1846.plc2.org'] +01:== added in slice oneief_slice1845 foreign ['n2-1845.plc2.org', 'n2-1846.plc2.org', 'n2-1847.plc2.org'] +01:== added in slice oneieg_slice1846 foreign ['n2-1846.plc2.org', 'n2-1847.plc2.org', 'n2-1848.plc2.org'] +01:== added in slice oneieh_slice1847 foreign ['n2-1847.plc2.org', 'n2-1848.plc2.org', 'n2-1849.plc2.org'] +01:== added in slice oneiei_slice1848 foreign ['n2-1848.plc2.org', 'n2-1849.plc2.org', 'n2-1850.plc2.org'] +01:== added in slice oneiej_slice1849 foreign ['n2-1849.plc2.org', 'n2-1850.plc2.org', 'n2-1851.plc2.org'] +01:== added in slice oneifa_slice1850 foreign ['n2-1850.plc2.org', 'n2-1851.plc2.org', 'n2-1852.plc2.org'] +01:== added in slice oneifb_slice1851 foreign ['n2-1851.plc2.org', 'n2-1852.plc2.org', 'n2-1853.plc2.org'] +01:== added in slice oneifc_slice1852 foreign ['n2-1852.plc2.org', 'n2-1853.plc2.org', 'n2-1854.plc2.org'] +01:== added in slice oneifd_slice1853 foreign ['n2-1853.plc2.org', 'n2-1854.plc2.org', 'n2-1855.plc2.org'] +01:== added in slice oneife_slice1854 foreign ['n2-1854.plc2.org', 'n2-1855.plc2.org', 'n2-1856.plc2.org'] +01:== added in slice oneiff_slice1855 foreign ['n2-1855.plc2.org', 'n2-1856.plc2.org', 'n2-1857.plc2.org'] +01:== added in slice oneifg_slice1856 foreign ['n2-1856.plc2.org', 'n2-1857.plc2.org', 'n2-1858.plc2.org'] +01:== added in slice oneifh_slice1857 foreign ['n2-1857.plc2.org', 'n2-1858.plc2.org', 'n2-1859.plc2.org'] +01:== added in slice oneifi_slice1858 foreign ['n2-1858.plc2.org', 'n2-1859.plc2.org', 'n2-1860.plc2.org'] +01:== added in slice oneifj_slice1859 foreign ['n2-1859.plc2.org', 'n2-1860.plc2.org', 'n2-1861.plc2.org'] +01:== added in slice oneiga_slice1860 foreign ['n2-1860.plc2.org', 'n2-1861.plc2.org', 'n2-1862.plc2.org'] +01:== added in slice oneigb_slice1861 foreign ['n2-1861.plc2.org', 'n2-1862.plc2.org', 'n2-1863.plc2.org'] +01:== added in slice oneigc_slice1862 foreign ['n2-1862.plc2.org', 'n2-1863.plc2.org', 'n2-1864.plc2.org'] +01:== added in slice oneigd_slice1863 foreign ['n2-1863.plc2.org', 'n2-1864.plc2.org', 'n2-1865.plc2.org'] +01:== added in slice oneige_slice1864 foreign ['n2-1864.plc2.org', 'n2-1865.plc2.org', 'n2-1866.plc2.org'] +01:== added in slice oneigf_slice1865 foreign ['n2-1865.plc2.org', 'n2-1866.plc2.org', 'n2-1867.plc2.org'] +01:== added in slice oneigg_slice1866 foreign ['n2-1866.plc2.org', 'n2-1867.plc2.org', 'n2-1868.plc2.org'] +01:== added in slice oneigh_slice1867 foreign ['n2-1867.plc2.org', 'n2-1868.plc2.org', 'n2-1869.plc2.org'] +01:== added in slice oneigi_slice1868 foreign ['n2-1868.plc2.org', 'n2-1869.plc2.org', 'n2-1870.plc2.org'] +01:== added in slice oneigj_slice1869 foreign ['n2-1869.plc2.org', 'n2-1870.plc2.org', 'n2-1871.plc2.org'] +01:== added in slice oneiha_slice1870 foreign ['n2-1870.plc2.org', 'n2-1871.plc2.org', 'n2-1872.plc2.org'] +01:== added in slice oneihb_slice1871 foreign ['n2-1871.plc2.org', 'n2-1872.plc2.org', 'n2-1873.plc2.org'] +01:== added in slice oneihc_slice1872 foreign ['n2-1872.plc2.org', 'n2-1873.plc2.org', 'n2-1874.plc2.org'] +01:== added in slice oneihd_slice1873 foreign ['n2-1873.plc2.org', 'n2-1874.plc2.org', 'n2-1875.plc2.org'] +01:== added in slice oneihe_slice1874 foreign ['n2-1874.plc2.org', 'n2-1875.plc2.org', 'n2-1876.plc2.org'] +01:== added in slice oneihf_slice1875 foreign ['n2-1875.plc2.org', 'n2-1876.plc2.org', 'n2-1877.plc2.org'] +01:== added in slice oneihg_slice1876 foreign ['n2-1876.plc2.org', 'n2-1877.plc2.org', 'n2-1878.plc2.org'] +01:== added in slice oneihh_slice1877 foreign ['n2-1877.plc2.org', 'n2-1878.plc2.org', 'n2-1879.plc2.org'] +01:== added in slice oneihi_slice1878 foreign ['n2-1878.plc2.org', 'n2-1879.plc2.org', 'n2-1880.plc2.org'] +01:== added in slice oneihj_slice1879 foreign ['n2-1879.plc2.org', 'n2-1880.plc2.org', 'n2-1881.plc2.org'] +01:== added in slice oneiia_slice1880 foreign ['n2-1880.plc2.org', 'n2-1881.plc2.org', 'n2-1882.plc2.org'] +01:== added in slice oneiib_slice1881 foreign ['n2-1881.plc2.org', 'n2-1882.plc2.org', 'n2-1883.plc2.org'] +01:== added in slice oneiic_slice1882 foreign ['n2-1882.plc2.org', 'n2-1883.plc2.org', 'n2-1884.plc2.org'] +01:== added in slice oneiid_slice1883 foreign ['n2-1883.plc2.org', 'n2-1884.plc2.org', 'n2-1885.plc2.org'] +01:== added in slice oneiie_slice1884 foreign ['n2-1884.plc2.org', 'n2-1885.plc2.org', 'n2-1886.plc2.org'] +01:== added in slice oneiif_slice1885 foreign ['n2-1885.plc2.org', 'n2-1886.plc2.org', 'n2-1887.plc2.org'] +01:== added in slice oneiig_slice1886 foreign ['n2-1886.plc2.org', 'n2-1887.plc2.org', 'n2-1888.plc2.org'] +01:== added in slice oneiih_slice1887 foreign ['n2-1887.plc2.org', 'n2-1888.plc2.org', 'n2-1889.plc2.org'] +01:== added in slice oneiii_slice1888 foreign ['n2-1888.plc2.org', 'n2-1889.plc2.org', 'n2-1890.plc2.org'] +01:== added in slice oneiij_slice1889 foreign ['n2-1889.plc2.org', 'n2-1890.plc2.org', 'n2-1891.plc2.org'] +01:== added in slice oneija_slice1890 foreign ['n2-1890.plc2.org', 'n2-1891.plc2.org', 'n2-1892.plc2.org'] +01:== added in slice oneijb_slice1891 foreign ['n2-1891.plc2.org', 'n2-1892.plc2.org', 'n2-1893.plc2.org'] +01:== added in slice oneijc_slice1892 foreign ['n2-1892.plc2.org', 'n2-1893.plc2.org', 'n2-1894.plc2.org'] +01:== added in slice oneijd_slice1893 foreign ['n2-1893.plc2.org', 'n2-1894.plc2.org', 'n2-1895.plc2.org'] +01:== added in slice oneije_slice1894 foreign ['n2-1894.plc2.org', 'n2-1895.plc2.org', 'n2-1896.plc2.org'] +01:== added in slice oneijf_slice1895 foreign ['n2-1895.plc2.org', 'n2-1896.plc2.org', 'n2-1897.plc2.org'] +01:== added in slice oneijg_slice1896 foreign ['n2-1896.plc2.org', 'n2-1897.plc2.org', 'n2-1898.plc2.org'] +01:== added in slice oneijh_slice1897 foreign ['n2-1897.plc2.org', 'n2-1898.plc2.org', 'n2-1899.plc2.org'] +01:== added in slice oneiji_slice1898 foreign ['n2-1898.plc2.org', 'n2-1899.plc2.org', 'n2-1900.plc2.org'] +01:== added in slice oneijj_slice1899 foreign ['n2-1899.plc2.org', 'n2-1900.plc2.org', 'n2-1901.plc2.org'] +01:== added in slice onejaa_slice1900 foreign ['n2-1900.plc2.org', 'n2-1901.plc2.org', 'n2-1902.plc2.org'] +01:== added in slice onejab_slice1901 foreign ['n2-1901.plc2.org', 'n2-1902.plc2.org', 'n2-1903.plc2.org'] +01:== added in slice onejac_slice1902 foreign ['n2-1902.plc2.org', 'n2-1903.plc2.org', 'n2-1904.plc2.org'] +01:== added in slice onejad_slice1903 foreign ['n2-1903.plc2.org', 'n2-1904.plc2.org', 'n2-1905.plc2.org'] +01:== added in slice onejae_slice1904 foreign ['n2-1904.plc2.org', 'n2-1905.plc2.org', 'n2-1906.plc2.org'] +01:== added in slice onejaf_slice1905 foreign ['n2-1905.plc2.org', 'n2-1906.plc2.org', 'n2-1907.plc2.org'] +01:== added in slice onejag_slice1906 foreign ['n2-1906.plc2.org', 'n2-1907.plc2.org', 'n2-1908.plc2.org'] +01:== added in slice onejah_slice1907 foreign ['n2-1907.plc2.org', 'n2-1908.plc2.org', 'n2-1909.plc2.org'] +01:== added in slice onejai_slice1908 foreign ['n2-1908.plc2.org', 'n2-1909.plc2.org', 'n2-1910.plc2.org'] +01:== added in slice onejaj_slice1909 foreign ['n2-1909.plc2.org', 'n2-1910.plc2.org', 'n2-1911.plc2.org'] +01:== added in slice onejba_slice1910 foreign ['n2-1910.plc2.org', 'n2-1911.plc2.org', 'n2-1912.plc2.org'] +01:== added in slice onejbb_slice1911 foreign ['n2-1911.plc2.org', 'n2-1912.plc2.org', 'n2-1913.plc2.org'] +01:== added in slice onejbc_slice1912 foreign ['n2-1912.plc2.org', 'n2-1913.plc2.org', 'n2-1914.plc2.org'] +01:== added in slice onejbd_slice1913 foreign ['n2-1913.plc2.org', 'n2-1914.plc2.org', 'n2-1915.plc2.org'] +01:== added in slice onejbe_slice1914 foreign ['n2-1914.plc2.org', 'n2-1915.plc2.org', 'n2-1916.plc2.org'] +01:== added in slice onejbf_slice1915 foreign ['n2-1915.plc2.org', 'n2-1916.plc2.org', 'n2-1917.plc2.org'] +01:== added in slice onejbg_slice1916 foreign ['n2-1916.plc2.org', 'n2-1917.plc2.org', 'n2-1918.plc2.org'] +01:== added in slice onejbh_slice1917 foreign ['n2-1917.plc2.org', 'n2-1918.plc2.org', 'n2-1919.plc2.org'] +01:== added in slice onejbi_slice1918 foreign ['n2-1918.plc2.org', 'n2-1919.plc2.org', 'n2-1920.plc2.org'] +01:== added in slice onejbj_slice1919 foreign ['n2-1919.plc2.org', 'n2-1920.plc2.org', 'n2-1921.plc2.org'] +01:== added in slice onejca_slice1920 foreign ['n2-1920.plc2.org', 'n2-1921.plc2.org', 'n2-1922.plc2.org'] +01:== added in slice onejcb_slice1921 foreign ['n2-1921.plc2.org', 'n2-1922.plc2.org', 'n2-1923.plc2.org'] +01:== added in slice onejcc_slice1922 foreign ['n2-1922.plc2.org', 'n2-1923.plc2.org', 'n2-1924.plc2.org'] +01:== added in slice onejcd_slice1923 foreign ['n2-1923.plc2.org', 'n2-1924.plc2.org', 'n2-1925.plc2.org'] +01:== added in slice onejce_slice1924 foreign ['n2-1924.plc2.org', 'n2-1925.plc2.org', 'n2-1926.plc2.org'] +01:== added in slice onejcf_slice1925 foreign ['n2-1925.plc2.org', 'n2-1926.plc2.org', 'n2-1927.plc2.org'] +01:== added in slice onejcg_slice1926 foreign ['n2-1926.plc2.org', 'n2-1927.plc2.org', 'n2-1928.plc2.org'] +01:== added in slice onejch_slice1927 foreign ['n2-1927.plc2.org', 'n2-1928.plc2.org', 'n2-1929.plc2.org'] +01:== added in slice onejci_slice1928 foreign ['n2-1928.plc2.org', 'n2-1929.plc2.org', 'n2-1930.plc2.org'] +01:== added in slice onejcj_slice1929 foreign ['n2-1929.plc2.org', 'n2-1930.plc2.org', 'n2-1931.plc2.org'] +01:== added in slice onejda_slice1930 foreign ['n2-1930.plc2.org', 'n2-1931.plc2.org', 'n2-1932.plc2.org'] +01:== added in slice onejdb_slice1931 foreign ['n2-1931.plc2.org', 'n2-1932.plc2.org', 'n2-1933.plc2.org'] +01:== added in slice onejdc_slice1932 foreign ['n2-1932.plc2.org', 'n2-1933.plc2.org', 'n2-1934.plc2.org'] +01:== added in slice onejdd_slice1933 foreign ['n2-1933.plc2.org', 'n2-1934.plc2.org', 'n2-1935.plc2.org'] +01:== added in slice onejde_slice1934 foreign ['n2-1934.plc2.org', 'n2-1935.plc2.org', 'n2-1936.plc2.org'] +01:== added in slice onejdf_slice1935 foreign ['n2-1935.plc2.org', 'n2-1936.plc2.org', 'n2-1937.plc2.org'] +01:== added in slice onejdg_slice1936 foreign ['n2-1936.plc2.org', 'n2-1937.plc2.org', 'n2-1938.plc2.org'] +01:== added in slice onejdh_slice1937 foreign ['n2-1937.plc2.org', 'n2-1938.plc2.org', 'n2-1939.plc2.org'] +01:== added in slice onejdi_slice1938 foreign ['n2-1938.plc2.org', 'n2-1939.plc2.org', 'n2-1940.plc2.org'] +01:== added in slice onejdj_slice1939 foreign ['n2-1939.plc2.org', 'n2-1940.plc2.org', 'n2-1941.plc2.org'] +01:== added in slice onejea_slice1940 foreign ['n2-1940.plc2.org', 'n2-1941.plc2.org', 'n2-1942.plc2.org'] +01:== added in slice onejeb_slice1941 foreign ['n2-1941.plc2.org', 'n2-1942.plc2.org', 'n2-1943.plc2.org'] +01:== added in slice onejec_slice1942 foreign ['n2-1942.plc2.org', 'n2-1943.plc2.org', 'n2-1944.plc2.org'] +01:== added in slice onejed_slice1943 foreign ['n2-1943.plc2.org', 'n2-1944.plc2.org', 'n2-1945.plc2.org'] +01:== added in slice onejee_slice1944 foreign ['n2-1944.plc2.org', 'n2-1945.plc2.org', 'n2-1946.plc2.org'] +01:== added in slice onejef_slice1945 foreign ['n2-1945.plc2.org', 'n2-1946.plc2.org', 'n2-1947.plc2.org'] +01:== added in slice onejeg_slice1946 foreign ['n2-1946.plc2.org', 'n2-1947.plc2.org', 'n2-1948.plc2.org'] +01:== added in slice onejeh_slice1947 foreign ['n2-1947.plc2.org', 'n2-1948.plc2.org', 'n2-1949.plc2.org'] +01:== added in slice onejei_slice1948 foreign ['n2-1948.plc2.org', 'n2-1949.plc2.org', 'n2-1950.plc2.org'] +01:== added in slice onejej_slice1949 foreign ['n2-1949.plc2.org', 'n2-1950.plc2.org', 'n2-1951.plc2.org'] +01:== added in slice onejfa_slice1950 foreign ['n2-1950.plc2.org', 'n2-1951.plc2.org', 'n2-1952.plc2.org'] +01:== added in slice onejfb_slice1951 foreign ['n2-1951.plc2.org', 'n2-1952.plc2.org', 'n2-1953.plc2.org'] +01:== added in slice onejfc_slice1952 foreign ['n2-1952.plc2.org', 'n2-1953.plc2.org', 'n2-1954.plc2.org'] +01:== added in slice onejfd_slice1953 foreign ['n2-1953.plc2.org', 'n2-1954.plc2.org', 'n2-1955.plc2.org'] +01:== added in slice onejfe_slice1954 foreign ['n2-1954.plc2.org', 'n2-1955.plc2.org', 'n2-1956.plc2.org'] +01:== added in slice onejff_slice1955 foreign ['n2-1955.plc2.org', 'n2-1956.plc2.org', 'n2-1957.plc2.org'] +01:== added in slice onejfg_slice1956 foreign ['n2-1956.plc2.org', 'n2-1957.plc2.org', 'n2-1958.plc2.org'] +01:== added in slice onejfh_slice1957 foreign ['n2-1957.plc2.org', 'n2-1958.plc2.org', 'n2-1959.plc2.org'] +01:== added in slice onejfi_slice1958 foreign ['n2-1958.plc2.org', 'n2-1959.plc2.org', 'n2-1960.plc2.org'] +01:== added in slice onejfj_slice1959 foreign ['n2-1959.plc2.org', 'n2-1960.plc2.org', 'n2-1961.plc2.org'] +01:== added in slice onejga_slice1960 foreign ['n2-1960.plc2.org', 'n2-1961.plc2.org', 'n2-1962.plc2.org'] +01:== added in slice onejgb_slice1961 foreign ['n2-1961.plc2.org', 'n2-1962.plc2.org', 'n2-1963.plc2.org'] +01:== added in slice onejgc_slice1962 foreign ['n2-1962.plc2.org', 'n2-1963.plc2.org', 'n2-1964.plc2.org'] +01:== added in slice onejgd_slice1963 foreign ['n2-1963.plc2.org', 'n2-1964.plc2.org', 'n2-1965.plc2.org'] +01:== added in slice onejge_slice1964 foreign ['n2-1964.plc2.org', 'n2-1965.plc2.org', 'n2-1966.plc2.org'] +01:== added in slice onejgf_slice1965 foreign ['n2-1965.plc2.org', 'n2-1966.plc2.org', 'n2-1967.plc2.org'] +01:== added in slice onejgg_slice1966 foreign ['n2-1966.plc2.org', 'n2-1967.plc2.org', 'n2-1968.plc2.org'] +01:== added in slice onejgh_slice1967 foreign ['n2-1967.plc2.org', 'n2-1968.plc2.org', 'n2-1969.plc2.org'] +01:== added in slice onejgi_slice1968 foreign ['n2-1968.plc2.org', 'n2-1969.plc2.org', 'n2-1970.plc2.org'] +01:== added in slice onejgj_slice1969 foreign ['n2-1969.plc2.org', 'n2-1970.plc2.org', 'n2-1971.plc2.org'] +01:== added in slice onejha_slice1970 foreign ['n2-1970.plc2.org', 'n2-1971.plc2.org', 'n2-1972.plc2.org'] +01:== added in slice onejhb_slice1971 foreign ['n2-1971.plc2.org', 'n2-1972.plc2.org', 'n2-1973.plc2.org'] +01:== added in slice onejhc_slice1972 foreign ['n2-1972.plc2.org', 'n2-1973.plc2.org', 'n2-1974.plc2.org'] +01:== added in slice onejhd_slice1973 foreign ['n2-1973.plc2.org', 'n2-1974.plc2.org', 'n2-1975.plc2.org'] +01:== added in slice onejhe_slice1974 foreign ['n2-1974.plc2.org', 'n2-1975.plc2.org', 'n2-1976.plc2.org'] +01:== added in slice onejhf_slice1975 foreign ['n2-1975.plc2.org', 'n2-1976.plc2.org', 'n2-1977.plc2.org'] +01:== added in slice onejhg_slice1976 foreign ['n2-1976.plc2.org', 'n2-1977.plc2.org', 'n2-1978.plc2.org'] +01:== added in slice onejhh_slice1977 foreign ['n2-1977.plc2.org', 'n2-1978.plc2.org', 'n2-1979.plc2.org'] +01:== added in slice onejhi_slice1978 foreign ['n2-1978.plc2.org', 'n2-1979.plc2.org', 'n2-1980.plc2.org'] +01:== added in slice onejhj_slice1979 foreign ['n2-1979.plc2.org', 'n2-1980.plc2.org', 'n2-1981.plc2.org'] +01:== added in slice onejia_slice1980 foreign ['n2-1980.plc2.org', 'n2-1981.plc2.org', 'n2-1982.plc2.org'] +01:== added in slice onejib_slice1981 foreign ['n2-1981.plc2.org', 'n2-1982.plc2.org', 'n2-1983.plc2.org'] +01:== added in slice onejic_slice1982 foreign ['n2-1982.plc2.org', 'n2-1983.plc2.org', 'n2-1984.plc2.org'] +01:== added in slice onejid_slice1983 foreign ['n2-1983.plc2.org', 'n2-1984.plc2.org', 'n2-1985.plc2.org'] +01:== added in slice onejie_slice1984 foreign ['n2-1984.plc2.org', 'n2-1985.plc2.org', 'n2-1986.plc2.org'] +01:== added in slice onejif_slice1985 foreign ['n2-1985.plc2.org', 'n2-1986.plc2.org', 'n2-1987.plc2.org'] +01:== added in slice onejig_slice1986 foreign ['n2-1986.plc2.org', 'n2-1987.plc2.org', 'n2-1988.plc2.org'] +01:== added in slice onejih_slice1987 foreign ['n2-1987.plc2.org', 'n2-1988.plc2.org', 'n2-1989.plc2.org'] +01:== added in slice onejii_slice1988 foreign ['n2-1988.plc2.org', 'n2-1989.plc2.org', 'n2-1990.plc2.org'] +01:== added in slice onejij_slice1989 foreign ['n2-1989.plc2.org', 'n2-1990.plc2.org', 'n2-1991.plc2.org'] +01:== added in slice onejja_slice1990 foreign ['n2-1990.plc2.org', 'n2-1991.plc2.org', 'n2-1992.plc2.org'] +01:== added in slice onejjb_slice1991 foreign ['n2-1991.plc2.org', 'n2-1992.plc2.org', 'n2-1993.plc2.org'] +01:== added in slice onejjc_slice1992 foreign ['n2-1992.plc2.org', 'n2-1993.plc2.org', 'n2-1994.plc2.org'] +01:== added in slice onejjd_slice1993 foreign ['n2-1993.plc2.org', 'n2-1994.plc2.org', 'n2-1995.plc2.org'] +01:== added in slice onejje_slice1994 foreign ['n2-1994.plc2.org', 'n2-1995.plc2.org', 'n2-1996.plc2.org'] +01:== added in slice onejjf_slice1995 foreign ['n2-1995.plc2.org', 'n2-1996.plc2.org', 'n2-1997.plc2.org'] +01:== added in slice onejjg_slice1996 foreign ['n2-1996.plc2.org', 'n2-1997.plc2.org', 'n2-1998.plc2.org'] +01:== added in slice onejjh_slice1997 foreign ['n2-1997.plc2.org', 'n2-1998.plc2.org', 'n2-1999.plc2.org'] +01:== added in slice onejji_slice1998 foreign ['n2-1998.plc2.org', 'n2-1999.plc2.org', 'n2-2000.plc2.org'] +01:== added in slice onejjj_slice1999 foreign ['n2-1999.plc2.org', 'n2-2000.plc2.org', 'n2-2001.plc2.org'] +01:== added in slice onebaaa_slice2000 foreign ['n2-2000.plc2.org', 'n2-2001.plc2.org', 'n2-2002.plc2.org'] ++++ 1119.90 seconds ellapsed (709.79) +=== refresh populate: refresh all ++++ 1119.90 seconds ellapsed (0.00) +01:== Refreshing peer Result: { new_keys 0 new_nodes 0 new_persons 0 new_sites 0 new_slice_attribute_types 0 new_slice_attributes 2 new_slices 0 peername Thierry plc2 } ++++ ellapsed: { process-keys 0.365176916122 process-nodes 1.5574119091 process-persons 1.64435815811 process-sa 9.34812998772 process-sat 0.00666284561157 process-sites 0.464575052261 process-slices 4.07847309113 time_all 42.5785849094 time_gather 0.733295202255 time_process 17.4648058414 time_transmit 24.3804838657 } ++++ 1163.73 seconds ellapsed (43.83) +02:== Refreshing peer Result: { new_keys 2000 new_nodes 3000 new_persons 2001 new_sites 1001 new_slice_attribute_types 1 new_slice_attributes 9 new_slices 2001 peername Thierry plc1 } ++++ ellapsed: { process-keys 18.9454190731 process-nodes 85.7590579987 process-persons 46.2589879036 process-sa 1.086550951 process-sat 0.0137100219727 process-sites 18.8839168549 process-slices 206.782188177 time_all 449.22248888 time_gather 2.65623903275 time_process 377.729847908 time_transmit 68.8364019394 } ++++ 1615.68 seconds ellapsed (451.95) ++++ 1615.68 seconds ellapsed (0.00) +=== refresh empty refresh ++++ 1615.68 seconds ellapsed (0.00) +01:== Refreshing peer Result: { new_keys 0 new_nodes 0 new_persons 0 new_sites 0 new_slice_attribute_types 0 new_slice_attributes 5 new_slices 0 peername Thierry plc2 } ++++ ellapsed: { process-keys 0.28697514534 process-nodes 1.7382979393 process-persons 1.75849199295 process-sa 1.54591608047 process-sat 0.00726008415222 process-sites 0.45644402504 process-slices 3.34001088142 time_all 67.3552000523 time_gather 2.00459694862 time_process 9.13341403008 time_transmit 56.2171890736 } ++++ 1684.36 seconds ellapsed (68.69) +02:== Refreshing peer Result: { new_keys 0 new_nodes 0 new_persons 0 new_sites 0 new_slice_attribute_types 0 new_slice_attributes 2 new_slices 0 peername Thierry plc1 } ++++ ellapsed: { process-keys 0.210376024246 process-nodes 1.34099602699 process-persons 1.33594107628 process-sa 1.20864582062 process-sat 0.00609683990479 process-sites 0.341688871384 process-slices 2.97055220604 time_all 66.6665620804 time_gather 2.66325616837 time_process 7.41431498528 time_transmit 56.5889909267 } ++++ 1752.90 seconds ellapsed (68.54) +01:============================== DUMPING +01: SITES +1 None thone Thierry plc1 Central [] +2 None oneb Thierry plc1 [1, 1001, 2001] +3 None onec Thierry plc1 [2, 1002, 2002] +4 None oned Thierry plc1 [3, 1003, 2003] +5 None onee Thierry plc1 [4, 1004, 2004] +6 None onef Thierry plc1 [5, 1005, 2005] +7 None oneg Thierry plc1 [6, 1006, 2006] +8 None oneh Thierry plc1 [7, 1007, 2007] +9 None onei Thierry plc1 [8, 1008, 2008] +10 None onej Thierry plc1 [9, 1009, 2009] +11 None oneba Thierry plc1 [10, 1010, 2010] +12 None onebb Thierry plc1 [11, 1011, 2011] +13 None onebc Thierry plc1 [12, 1012, 2012] +14 None onebd Thierry plc1 [13, 1013, 2013] +15 None onebe Thierry plc1 [14, 1014, 2014] +16 None onebf Thierry plc1 [15, 1015, 2015] +17 None onebg Thierry plc1 [16, 1016, 2016] +18 None onebh Thierry plc1 [17, 1017, 2017] +19 None onebi Thierry plc1 [18, 1018, 2018] +20 None onebj Thierry plc1 [19, 1019, 2019] +21 None oneca Thierry plc1 [20, 1020, 2020] +22 None onecb Thierry plc1 [21, 1021, 2021] +23 None onecc Thierry plc1 [22, 1022, 2022] +24 None onecd Thierry plc1 [23, 1023, 2023] +25 None onece Thierry plc1 [24, 1024, 2024] +26 None onecf Thierry plc1 [25, 1025, 2025] +27 None onecg Thierry plc1 [26, 1026, 2026] +28 None onech Thierry plc1 [27, 1027, 2027] +29 None oneci Thierry plc1 [28, 1028, 2028] +30 None onecj Thierry plc1 [29, 1029, 2029] +31 None oneda Thierry plc1 [30, 1030, 2030] +32 None onedb Thierry plc1 [31, 1031, 2031] +33 None onedc Thierry plc1 [32, 1032, 2032] +34 None onedd Thierry plc1 [33, 1033, 2033] +35 None onede Thierry plc1 [34, 1034, 2034] +36 None onedf Thierry plc1 [35, 1035, 2035] +37 None onedg Thierry plc1 [36, 1036, 2036] +38 None onedh Thierry plc1 [37, 1037, 2037] +39 None onedi Thierry plc1 [38, 1038, 2038] +40 None onedj Thierry plc1 [39, 1039, 2039] +41 None oneea Thierry plc1 [40, 1040, 2040] +42 None oneeb Thierry plc1 [41, 1041, 2041] +43 None oneec Thierry plc1 [42, 1042, 2042] +44 None oneed Thierry plc1 [43, 1043, 2043] +45 None oneee Thierry plc1 [44, 1044, 2044] +46 None oneef Thierry plc1 [45, 1045, 2045] +47 None oneeg Thierry plc1 [46, 1046, 2046] +48 None oneeh Thierry plc1 [47, 1047, 2047] +49 None oneei Thierry plc1 [48, 1048, 2048] +50 None oneej Thierry plc1 [49, 1049, 2049] +51 None onefa Thierry plc1 [50, 1050, 2050] +52 None onefb Thierry plc1 [51, 1051, 2051] +53 None onefc Thierry plc1 [52, 1052, 2052] +54 None onefd Thierry plc1 [53, 1053, 2053] +55 None onefe Thierry plc1 [54, 1054, 2054] +56 None oneff Thierry plc1 [55, 1055, 2055] +57 None onefg Thierry plc1 [56, 1056, 2056] +58 None onefh Thierry plc1 [57, 1057, 2057] +59 None onefi Thierry plc1 [58, 1058, 2058] +60 None onefj Thierry plc1 [59, 1059, 2059] +61 None onega Thierry plc1 [60, 1060, 2060] +62 None onegb Thierry plc1 [61, 1061, 2061] +63 None onegc Thierry plc1 [62, 1062, 2062] +64 None onegd Thierry plc1 [63, 1063, 2063] +65 None onege Thierry plc1 [64, 1064, 2064] +66 None onegf Thierry plc1 [65, 1065, 2065] +67 None onegg Thierry plc1 [66, 1066, 2066] +68 None onegh Thierry plc1 [67, 1067, 2067] +69 None onegi Thierry plc1 [68, 1068, 2068] +70 None onegj Thierry plc1 [69, 1069, 2069] +71 None oneha Thierry plc1 [70, 1070, 2070] +72 None onehb Thierry plc1 [71, 1071, 2071] +73 None onehc Thierry plc1 [72, 1072, 2072] +74 None onehd Thierry plc1 [73, 1073, 2073] +75 None onehe Thierry plc1 [74, 1074, 2074] +76 None onehf Thierry plc1 [75, 1075, 2075] +77 None onehg Thierry plc1 [76, 1076, 2076] +78 None onehh Thierry plc1 [77, 1077, 2077] +79 None onehi Thierry plc1 [78, 1078, 2078] +80 None onehj Thierry plc1 [79, 1079, 2079] +81 None oneia Thierry plc1 [80, 1080, 2080] +82 None oneib Thierry plc1 [81, 1081, 2081] +83 None oneic Thierry plc1 [82, 1082, 2082] +84 None oneid Thierry plc1 [83, 1083, 2083] +85 None oneie Thierry plc1 [84, 1084, 2084] +86 None oneif Thierry plc1 [85, 1085, 2085] +87 None oneig Thierry plc1 [86, 1086, 2086] +88 None oneih Thierry plc1 [87, 1087, 2087] +89 None oneii Thierry plc1 [88, 1088, 2088] +90 None oneij Thierry plc1 [89, 1089, 2089] +91 None oneja Thierry plc1 [90, 1090, 2090] +92 None onejb Thierry plc1 [91, 1091, 2091] +93 None onejc Thierry plc1 [92, 1092, 2092] +94 None onejd Thierry plc1 [93, 1093, 2093] +95 None oneje Thierry plc1 [94, 1094, 2094] +96 None onejf Thierry plc1 [95, 1095, 2095] +97 None onejg Thierry plc1 [96, 1096, 2096] +98 None onejh Thierry plc1 [97, 1097, 2097] +99 None oneji Thierry plc1 [98, 1098, 2098] +100 None onejj Thierry plc1 [99, 1099, 2099] +101 None onebaa Thierry plc1 [100, 1100, 2100] +102 None onebab Thierry plc1 [101, 1101, 2101] +103 None onebac Thierry plc1 [102, 1102, 2102] +104 None onebad Thierry plc1 [103, 1103, 2103] +105 None onebae Thierry plc1 [104, 1104, 2104] +106 None onebaf Thierry plc1 [105, 1105, 2105] +107 None onebag Thierry plc1 [106, 1106, 2106] +108 None onebah Thierry plc1 [107, 1107, 2107] +109 None onebai Thierry plc1 [108, 1108, 2108] +110 None onebaj Thierry plc1 [109, 1109, 2109] +111 None onebba Thierry plc1 [110, 1110, 2110] +112 None onebbb Thierry plc1 [111, 1111, 2111] +113 None onebbc Thierry plc1 [112, 1112, 2112] +114 None onebbd Thierry plc1 [113, 1113, 2113] +115 None onebbe Thierry plc1 [114, 1114, 2114] +116 None onebbf Thierry plc1 [115, 1115, 2115] +117 None onebbg Thierry plc1 [116, 1116, 2116] +118 None onebbh Thierry plc1 [117, 1117, 2117] +119 None onebbi Thierry plc1 [118, 1118, 2118] +120 None onebbj Thierry plc1 [119, 1119, 2119] +121 None onebca Thierry plc1 [120, 1120, 2120] +122 None onebcb Thierry plc1 [121, 1121, 2121] +123 None onebcc Thierry plc1 [122, 1122, 2122] +124 None onebcd Thierry plc1 [123, 1123, 2123] +125 None onebce Thierry plc1 [124, 1124, 2124] +126 None onebcf Thierry plc1 [125, 1125, 2125] +127 None onebcg Thierry plc1 [126, 1126, 2126] +128 None onebch Thierry plc1 [127, 1127, 2127] +129 None onebci Thierry plc1 [128, 1128, 2128] +130 None onebcj Thierry plc1 [129, 1129, 2129] +131 None onebda Thierry plc1 [130, 1130, 2130] +132 None onebdb Thierry plc1 [131, 1131, 2131] +133 None onebdc Thierry plc1 [132, 1132, 2132] +134 None onebdd Thierry plc1 [133, 1133, 2133] +135 None onebde Thierry plc1 [134, 1134, 2134] +136 None onebdf Thierry plc1 [135, 1135, 2135] +137 None onebdg Thierry plc1 [136, 1136, 2136] +138 None onebdh Thierry plc1 [137, 1137, 2137] +139 None onebdi Thierry plc1 [138, 1138, 2138] +140 None onebdj Thierry plc1 [139, 1139, 2139] +141 None onebea Thierry plc1 [140, 1140, 2140] +142 None onebeb Thierry plc1 [141, 1141, 2141] +143 None onebec Thierry plc1 [142, 1142, 2142] +144 None onebed Thierry plc1 [143, 1143, 2143] +145 None onebee Thierry plc1 [144, 1144, 2144] +146 None onebef Thierry plc1 [145, 1145, 2145] +147 None onebeg Thierry plc1 [146, 1146, 2146] +148 None onebeh Thierry plc1 [147, 1147, 2147] +149 None onebei Thierry plc1 [148, 1148, 2148] +150 None onebej Thierry plc1 [149, 1149, 2149] +151 None onebfa Thierry plc1 [150, 1150, 2150] +152 None onebfb Thierry plc1 [151, 1151, 2151] +153 None onebfc Thierry plc1 [152, 1152, 2152] +154 None onebfd Thierry plc1 [153, 1153, 2153] +155 None onebfe Thierry plc1 [154, 1154, 2154] +156 None onebff Thierry plc1 [155, 1155, 2155] +157 None onebfg Thierry plc1 [156, 1156, 2156] +158 None onebfh Thierry plc1 [157, 1157, 2157] +159 None onebfi Thierry plc1 [158, 1158, 2158] +160 None onebfj Thierry plc1 [159, 1159, 2159] +161 None onebga Thierry plc1 [160, 1160, 2160] +162 None onebgb Thierry plc1 [161, 1161, 2161] +163 None onebgc Thierry plc1 [162, 1162, 2162] +164 None onebgd Thierry plc1 [163, 1163, 2163] +165 None onebge Thierry plc1 [164, 1164, 2164] +166 None onebgf Thierry plc1 [165, 1165, 2165] +167 None onebgg Thierry plc1 [166, 1166, 2166] +168 None onebgh Thierry plc1 [167, 1167, 2167] +169 None onebgi Thierry plc1 [168, 1168, 2168] +170 None onebgj Thierry plc1 [169, 1169, 2169] +171 None onebha Thierry plc1 [170, 1170, 2170] +172 None onebhb Thierry plc1 [171, 1171, 2171] +173 None onebhc Thierry plc1 [172, 1172, 2172] +174 None onebhd Thierry plc1 [173, 1173, 2173] +175 None onebhe Thierry plc1 [174, 1174, 2174] +176 None onebhf Thierry plc1 [175, 1175, 2175] +177 None onebhg Thierry plc1 [176, 1176, 2176] +178 None onebhh Thierry plc1 [177, 1177, 2177] +179 None onebhi Thierry plc1 [178, 1178, 2178] +180 None onebhj Thierry plc1 [179, 1179, 2179] +181 None onebia Thierry plc1 [180, 1180, 2180] +182 None onebib Thierry plc1 [181, 1181, 2181] +183 None onebic Thierry plc1 [182, 1182, 2182] +184 None onebid Thierry plc1 [183, 1183, 2183] +185 None onebie Thierry plc1 [184, 1184, 2184] +186 None onebif Thierry plc1 [185, 1185, 2185] +187 None onebig Thierry plc1 [186, 1186, 2186] +188 None onebih Thierry plc1 [187, 1187, 2187] +189 None onebii Thierry plc1 [188, 1188, 2188] +190 None onebij Thierry plc1 [189, 1189, 2189] +191 None onebja Thierry plc1 [190, 1190, 2190] +192 None onebjb Thierry plc1 [191, 1191, 2191] +193 None onebjc Thierry plc1 [192, 1192, 2192] +194 None onebjd Thierry plc1 [193, 1193, 2193] +195 None onebje Thierry plc1 [194, 1194, 2194] +196 None onebjf Thierry plc1 [195, 1195, 2195] +197 None onebjg Thierry plc1 [196, 1196, 2196] +198 None onebjh Thierry plc1 [197, 1197, 2197] +199 None onebji Thierry plc1 [198, 1198, 2198] +200 None onebjj Thierry plc1 [199, 1199, 2199] +201 None onecaa Thierry plc1 [200, 1200, 2200] +202 None onecab Thierry plc1 [201, 1201, 2201] +203 None onecac Thierry plc1 [202, 1202, 2202] +204 None onecad Thierry plc1 [203, 1203, 2203] +205 None onecae Thierry plc1 [204, 1204, 2204] +206 None onecaf Thierry plc1 [205, 1205, 2205] +207 None onecag Thierry plc1 [206, 1206, 2206] +208 None onecah Thierry plc1 [207, 1207, 2207] +209 None onecai Thierry plc1 [208, 1208, 2208] +210 None onecaj Thierry plc1 [209, 1209, 2209] +211 None onecba Thierry plc1 [210, 1210, 2210] +212 None onecbb Thierry plc1 [211, 1211, 2211] +213 None onecbc Thierry plc1 [212, 1212, 2212] +214 None onecbd Thierry plc1 [213, 1213, 2213] +215 None onecbe Thierry plc1 [214, 1214, 2214] +216 None onecbf Thierry plc1 [215, 1215, 2215] +217 None onecbg Thierry plc1 [216, 1216, 2216] +218 None onecbh Thierry plc1 [217, 1217, 2217] +219 None onecbi Thierry plc1 [218, 1218, 2218] +220 None onecbj Thierry plc1 [219, 1219, 2219] +221 None onecca Thierry plc1 [220, 1220, 2220] +222 None oneccb Thierry plc1 [221, 1221, 2221] +223 None oneccc Thierry plc1 [222, 1222, 2222] +224 None oneccd Thierry plc1 [223, 1223, 2223] +225 None onecce Thierry plc1 [224, 1224, 2224] +226 None oneccf Thierry plc1 [225, 1225, 2225] +227 None oneccg Thierry plc1 [226, 1226, 2226] +228 None onecch Thierry plc1 [227, 1227, 2227] +229 None onecci Thierry plc1 [228, 1228, 2228] +230 None oneccj Thierry plc1 [229, 1229, 2229] +231 None onecda Thierry plc1 [230, 1230, 2230] +232 None onecdb Thierry plc1 [231, 1231, 2231] +233 None onecdc Thierry plc1 [232, 1232, 2232] +234 None onecdd Thierry plc1 [233, 1233, 2233] +235 None onecde Thierry plc1 [234, 1234, 2234] +236 None onecdf Thierry plc1 [235, 1235, 2235] +237 None onecdg Thierry plc1 [236, 1236, 2236] +238 None onecdh Thierry plc1 [237, 1237, 2237] +239 None onecdi Thierry plc1 [238, 1238, 2238] +240 None onecdj Thierry plc1 [239, 1239, 2239] +241 None onecea Thierry plc1 [240, 1240, 2240] +242 None oneceb Thierry plc1 [241, 1241, 2241] +243 None onecec Thierry plc1 [242, 1242, 2242] +244 None oneced Thierry plc1 [243, 1243, 2243] +245 None onecee Thierry plc1 [244, 1244, 2244] +246 None onecef Thierry plc1 [245, 1245, 2245] +247 None oneceg Thierry plc1 [246, 1246, 2246] +248 None oneceh Thierry plc1 [247, 1247, 2247] +249 None onecei Thierry plc1 [248, 1248, 2248] +250 None onecej Thierry plc1 [249, 1249, 2249] +251 None onecfa Thierry plc1 [250, 1250, 2250] +252 None onecfb Thierry plc1 [251, 1251, 2251] +253 None onecfc Thierry plc1 [252, 1252, 2252] +254 None onecfd Thierry plc1 [253, 1253, 2253] +255 None onecfe Thierry plc1 [254, 1254, 2254] +256 None onecff Thierry plc1 [255, 1255, 2255] +257 None onecfg Thierry plc1 [256, 1256, 2256] +258 None onecfh Thierry plc1 [257, 1257, 2257] +259 None onecfi Thierry plc1 [258, 1258, 2258] +260 None onecfj Thierry plc1 [259, 1259, 2259] +261 None onecga Thierry plc1 [260, 1260, 2260] +262 None onecgb Thierry plc1 [261, 1261, 2261] +263 None onecgc Thierry plc1 [262, 1262, 2262] +264 None onecgd Thierry plc1 [263, 1263, 2263] +265 None onecge Thierry plc1 [264, 1264, 2264] +266 None onecgf Thierry plc1 [265, 1265, 2265] +267 None onecgg Thierry plc1 [266, 1266, 2266] +268 None onecgh Thierry plc1 [267, 1267, 2267] +269 None onecgi Thierry plc1 [268, 1268, 2268] +270 None onecgj Thierry plc1 [269, 1269, 2269] +271 None onecha Thierry plc1 [270, 1270, 2270] +272 None onechb Thierry plc1 [271, 1271, 2271] +273 None onechc Thierry plc1 [272, 1272, 2272] +274 None onechd Thierry plc1 [273, 1273, 2273] +275 None oneche Thierry plc1 [274, 1274, 2274] +276 None onechf Thierry plc1 [275, 1275, 2275] +277 None onechg Thierry plc1 [276, 1276, 2276] +278 None onechh Thierry plc1 [277, 1277, 2277] +279 None onechi Thierry plc1 [278, 1278, 2278] +280 None onechj Thierry plc1 [279, 1279, 2279] +281 None onecia Thierry plc1 [280, 1280, 2280] +282 None onecib Thierry plc1 [281, 1281, 2281] +283 None onecic Thierry plc1 [282, 1282, 2282] +284 None onecid Thierry plc1 [283, 1283, 2283] +285 None onecie Thierry plc1 [284, 1284, 2284] +286 None onecif Thierry plc1 [285, 1285, 2285] +287 None onecig Thierry plc1 [286, 1286, 2286] +288 None onecih Thierry plc1 [287, 1287, 2287] +289 None onecii Thierry plc1 [288, 1288, 2288] +290 None onecij Thierry plc1 [289, 1289, 2289] +291 None onecja Thierry plc1 [290, 1290, 2290] +292 None onecjb Thierry plc1 [291, 1291, 2291] +293 None onecjc Thierry plc1 [292, 1292, 2292] +294 None onecjd Thierry plc1 [293, 1293, 2293] +295 None onecje Thierry plc1 [294, 1294, 2294] +296 None onecjf Thierry plc1 [295, 1295, 2295] +297 None onecjg Thierry plc1 [296, 1296, 2296] +298 None onecjh Thierry plc1 [297, 1297, 2297] +299 None onecji Thierry plc1 [298, 1298, 2298] +300 None onecjj Thierry plc1 [299, 1299, 2299] +301 None onedaa Thierry plc1 [300, 1300, 2300] +302 None onedab Thierry plc1 [301, 1301, 2301] +303 None onedac Thierry plc1 [302, 1302, 2302] +304 None onedad Thierry plc1 [303, 1303, 2303] +305 None onedae Thierry plc1 [304, 1304, 2304] +306 None onedaf Thierry plc1 [305, 1305, 2305] +307 None onedag Thierry plc1 [306, 1306, 2306] +308 None onedah Thierry plc1 [307, 1307, 2307] +309 None onedai Thierry plc1 [308, 1308, 2308] +310 None onedaj Thierry plc1 [309, 1309, 2309] +311 None onedba Thierry plc1 [310, 1310, 2310] +312 None onedbb Thierry plc1 [311, 1311, 2311] +313 None onedbc Thierry plc1 [312, 1312, 2312] +314 None onedbd Thierry plc1 [313, 1313, 2313] +315 None onedbe Thierry plc1 [314, 1314, 2314] +316 None onedbf Thierry plc1 [315, 1315, 2315] +317 None onedbg Thierry plc1 [316, 1316, 2316] +318 None onedbh Thierry plc1 [317, 1317, 2317] +319 None onedbi Thierry plc1 [318, 1318, 2318] +320 None onedbj Thierry plc1 [319, 1319, 2319] +321 None onedca Thierry plc1 [320, 1320, 2320] +322 None onedcb Thierry plc1 [321, 1321, 2321] +323 None onedcc Thierry plc1 [322, 1322, 2322] +324 None onedcd Thierry plc1 [323, 1323, 2323] +325 None onedce Thierry plc1 [324, 1324, 2324] +326 None onedcf Thierry plc1 [325, 1325, 2325] +327 None onedcg Thierry plc1 [326, 1326, 2326] +328 None onedch Thierry plc1 [327, 1327, 2327] +329 None onedci Thierry plc1 [328, 1328, 2328] +330 None onedcj Thierry plc1 [329, 1329, 2329] +331 None onedda Thierry plc1 [330, 1330, 2330] +332 None oneddb Thierry plc1 [331, 1331, 2331] +333 None oneddc Thierry plc1 [332, 1332, 2332] +334 None oneddd Thierry plc1 [333, 1333, 2333] +335 None onedde Thierry plc1 [334, 1334, 2334] +336 None oneddf Thierry plc1 [335, 1335, 2335] +337 None oneddg Thierry plc1 [336, 1336, 2336] +338 None oneddh Thierry plc1 [337, 1337, 2337] +339 None oneddi Thierry plc1 [338, 1338, 2338] +340 None oneddj Thierry plc1 [339, 1339, 2339] +341 None onedea Thierry plc1 [340, 1340, 2340] +342 None onedeb Thierry plc1 [341, 1341, 2341] +343 None onedec Thierry plc1 [342, 1342, 2342] +344 None oneded Thierry plc1 [343, 1343, 2343] +345 None onedee Thierry plc1 [344, 1344, 2344] +346 None onedef Thierry plc1 [345, 1345, 2345] +347 None onedeg Thierry plc1 [346, 1346, 2346] +348 None onedeh Thierry plc1 [347, 1347, 2347] +349 None onedei Thierry plc1 [348, 1348, 2348] +350 None onedej Thierry plc1 [349, 1349, 2349] +351 None onedfa Thierry plc1 [350, 1350, 2350] +352 None onedfb Thierry plc1 [351, 1351, 2351] +353 None onedfc Thierry plc1 [352, 1352, 2352] +354 None onedfd Thierry plc1 [353, 1353, 2353] +355 None onedfe Thierry plc1 [354, 1354, 2354] +356 None onedff Thierry plc1 [355, 1355, 2355] +357 None onedfg Thierry plc1 [356, 1356, 2356] +358 None onedfh Thierry plc1 [357, 1357, 2357] +359 None onedfi Thierry plc1 [358, 1358, 2358] +360 None onedfj Thierry plc1 [359, 1359, 2359] +361 None onedga Thierry plc1 [360, 1360, 2360] +362 None onedgb Thierry plc1 [361, 1361, 2361] +363 None onedgc Thierry plc1 [362, 1362, 2362] +364 None onedgd Thierry plc1 [363, 1363, 2363] +365 None onedge Thierry plc1 [364, 1364, 2364] +366 None onedgf Thierry plc1 [365, 1365, 2365] +367 None onedgg Thierry plc1 [366, 1366, 2366] +368 None onedgh Thierry plc1 [367, 1367, 2367] +369 None onedgi Thierry plc1 [368, 1368, 2368] +370 None onedgj Thierry plc1 [369, 1369, 2369] +371 None onedha Thierry plc1 [370, 1370, 2370] +372 None onedhb Thierry plc1 [371, 1371, 2371] +373 None onedhc Thierry plc1 [372, 1372, 2372] +374 None onedhd Thierry plc1 [373, 1373, 2373] +375 None onedhe Thierry plc1 [374, 1374, 2374] +376 None onedhf Thierry plc1 [375, 1375, 2375] +377 None onedhg Thierry plc1 [376, 1376, 2376] +378 None onedhh Thierry plc1 [377, 1377, 2377] +379 None onedhi Thierry plc1 [378, 1378, 2378] +380 None onedhj Thierry plc1 [379, 1379, 2379] +381 None onedia Thierry plc1 [380, 1380, 2380] +382 None onedib Thierry plc1 [381, 1381, 2381] +383 None onedic Thierry plc1 [382, 1382, 2382] +384 None onedid Thierry plc1 [383, 1383, 2383] +385 None onedie Thierry plc1 [384, 1384, 2384] +386 None onedif Thierry plc1 [385, 1385, 2385] +387 None onedig Thierry plc1 [386, 1386, 2386] +388 None onedih Thierry plc1 [387, 1387, 2387] +389 None onedii Thierry plc1 [388, 1388, 2388] +390 None onedij Thierry plc1 [389, 1389, 2389] +391 None onedja Thierry plc1 [390, 1390, 2390] +392 None onedjb Thierry plc1 [391, 1391, 2391] +393 None onedjc Thierry plc1 [392, 1392, 2392] +394 None onedjd Thierry plc1 [393, 1393, 2393] +395 None onedje Thierry plc1 [394, 1394, 2394] +396 None onedjf Thierry plc1 [395, 1395, 2395] +397 None onedjg Thierry plc1 [396, 1396, 2396] +398 None onedjh Thierry plc1 [397, 1397, 2397] +399 None onedji Thierry plc1 [398, 1398, 2398] +400 None onedjj Thierry plc1 [399, 1399, 2399] +401 None oneeaa Thierry plc1 [400, 1400, 2400] +402 None oneeab Thierry plc1 [401, 1401, 2401] +403 None oneeac Thierry plc1 [402, 1402, 2402] +404 None oneead Thierry plc1 [403, 1403, 2403] +405 None oneeae Thierry plc1 [404, 1404, 2404] +406 None oneeaf Thierry plc1 [405, 1405, 2405] +407 None oneeag Thierry plc1 [406, 1406, 2406] +408 None oneeah Thierry plc1 [407, 1407, 2407] +409 None oneeai Thierry plc1 [408, 1408, 2408] +410 None oneeaj Thierry plc1 [409, 1409, 2409] +411 None oneeba Thierry plc1 [410, 1410, 2410] +412 None oneebb Thierry plc1 [411, 1411, 2411] +413 None oneebc Thierry plc1 [412, 1412, 2412] +414 None oneebd Thierry plc1 [413, 1413, 2413] +415 None oneebe Thierry plc1 [414, 1414, 2414] +416 None oneebf Thierry plc1 [415, 1415, 2415] +417 None oneebg Thierry plc1 [416, 1416, 2416] +418 None oneebh Thierry plc1 [417, 1417, 2417] +419 None oneebi Thierry plc1 [418, 1418, 2418] +420 None oneebj Thierry plc1 [419, 1419, 2419] +421 None oneeca Thierry plc1 [420, 1420, 2420] +422 None oneecb Thierry plc1 [421, 1421, 2421] +423 None oneecc Thierry plc1 [422, 1422, 2422] +424 None oneecd Thierry plc1 [423, 1423, 2423] +425 None oneece Thierry plc1 [424, 1424, 2424] +426 None oneecf Thierry plc1 [425, 1425, 2425] +427 None oneecg Thierry plc1 [426, 1426, 2426] +428 None oneech Thierry plc1 [427, 1427, 2427] +429 None oneeci Thierry plc1 [428, 1428, 2428] +430 None oneecj Thierry plc1 [429, 1429, 2429] +431 None oneeda Thierry plc1 [430, 1430, 2430] +432 None oneedb Thierry plc1 [431, 1431, 2431] +433 None oneedc Thierry plc1 [432, 1432, 2432] +434 None oneedd Thierry plc1 [433, 1433, 2433] +435 None oneede Thierry plc1 [434, 1434, 2434] +436 None oneedf Thierry plc1 [435, 1435, 2435] +437 None oneedg Thierry plc1 [436, 1436, 2436] +438 None oneedh Thierry plc1 [437, 1437, 2437] +439 None oneedi Thierry plc1 [438, 1438, 2438] +440 None oneedj Thierry plc1 [439, 1439, 2439] +441 None oneeea Thierry plc1 [440, 1440, 2440] +442 None oneeeb Thierry plc1 [441, 1441, 2441] +443 None oneeec Thierry plc1 [442, 1442, 2442] +444 None oneeed Thierry plc1 [443, 1443, 2443] +445 None oneeee Thierry plc1 [444, 1444, 2444] +446 None oneeef Thierry plc1 [445, 1445, 2445] +447 None oneeeg Thierry plc1 [446, 1446, 2446] +448 None oneeeh Thierry plc1 [447, 1447, 2447] +449 None oneeei Thierry plc1 [448, 1448, 2448] +450 None oneeej Thierry plc1 [449, 1449, 2449] +451 None oneefa Thierry plc1 [450, 1450, 2450] +452 None oneefb Thierry plc1 [451, 1451, 2451] +453 None oneefc Thierry plc1 [452, 1452, 2452] +454 None oneefd Thierry plc1 [453, 1453, 2453] +455 None oneefe Thierry plc1 [454, 1454, 2454] +456 None oneeff Thierry plc1 [455, 1455, 2455] +457 None oneefg Thierry plc1 [456, 1456, 2456] +458 None oneefh Thierry plc1 [457, 1457, 2457] +459 None oneefi Thierry plc1 [458, 1458, 2458] +460 None oneefj Thierry plc1 [459, 1459, 2459] +461 None oneega Thierry plc1 [460, 1460, 2460] +462 None oneegb Thierry plc1 [461, 1461, 2461] +463 None oneegc Thierry plc1 [462, 1462, 2462] +464 None oneegd Thierry plc1 [463, 1463, 2463] +465 None oneege Thierry plc1 [464, 1464, 2464] +466 None oneegf Thierry plc1 [465, 1465, 2465] +467 None oneegg Thierry plc1 [466, 1466, 2466] +468 None oneegh Thierry plc1 [467, 1467, 2467] +469 None oneegi Thierry plc1 [468, 1468, 2468] +470 None oneegj Thierry plc1 [469, 1469, 2469] +471 None oneeha Thierry plc1 [470, 1470, 2470] +472 None oneehb Thierry plc1 [471, 1471, 2471] +473 None oneehc Thierry plc1 [472, 1472, 2472] +474 None oneehd Thierry plc1 [473, 1473, 2473] +475 None oneehe Thierry plc1 [474, 1474, 2474] +476 None oneehf Thierry plc1 [475, 1475, 2475] +477 None oneehg Thierry plc1 [476, 1476, 2476] +478 None oneehh Thierry plc1 [477, 1477, 2477] +479 None oneehi Thierry plc1 [478, 1478, 2478] +480 None oneehj Thierry plc1 [479, 1479, 2479] +481 None oneeia Thierry plc1 [480, 1480, 2480] +482 None oneeib Thierry plc1 [481, 1481, 2481] +483 None oneeic Thierry plc1 [482, 1482, 2482] +484 None oneeid Thierry plc1 [483, 1483, 2483] +485 None oneeie Thierry plc1 [484, 1484, 2484] +486 None oneeif Thierry plc1 [485, 1485, 2485] +487 None oneeig Thierry plc1 [486, 1486, 2486] +488 None oneeih Thierry plc1 [487, 1487, 2487] +489 None oneeii Thierry plc1 [488, 1488, 2488] +490 None oneeij Thierry plc1 [489, 1489, 2489] +491 None oneeja Thierry plc1 [490, 1490, 2490] +492 None oneejb Thierry plc1 [491, 1491, 2491] +493 None oneejc Thierry plc1 [492, 1492, 2492] +494 None oneejd Thierry plc1 [493, 1493, 2493] +495 None oneeje Thierry plc1 [494, 1494, 2494] +496 None oneejf Thierry plc1 [495, 1495, 2495] +497 None oneejg Thierry plc1 [496, 1496, 2496] +498 None oneejh Thierry plc1 [497, 1497, 2497] +499 None oneeji Thierry plc1 [498, 1498, 2498] +500 None oneejj Thierry plc1 [499, 1499, 2499] +501 None onefaa Thierry plc1 [500, 1500, 2500] +502 None onefab Thierry plc1 [501, 1501, 2501] +503 None onefac Thierry plc1 [502, 1502, 2502] +504 None onefad Thierry plc1 [503, 1503, 2503] +505 None onefae Thierry plc1 [504, 1504, 2504] +506 None onefaf Thierry plc1 [505, 1505, 2505] +507 None onefag Thierry plc1 [506, 1506, 2506] +508 None onefah Thierry plc1 [507, 1507, 2507] +509 None onefai Thierry plc1 [508, 1508, 2508] +510 None onefaj Thierry plc1 [509, 1509, 2509] +511 None onefba Thierry plc1 [510, 1510, 2510] +512 None onefbb Thierry plc1 [511, 1511, 2511] +513 None onefbc Thierry plc1 [512, 1512, 2512] +514 None onefbd Thierry plc1 [513, 1513, 2513] +515 None onefbe Thierry plc1 [514, 1514, 2514] +516 None onefbf Thierry plc1 [515, 1515, 2515] +517 None onefbg Thierry plc1 [516, 1516, 2516] +518 None onefbh Thierry plc1 [517, 1517, 2517] +519 None onefbi Thierry plc1 [518, 1518, 2518] +520 None onefbj Thierry plc1 [519, 1519, 2519] +521 None onefca Thierry plc1 [520, 1520, 2520] +522 None onefcb Thierry plc1 [521, 1521, 2521] +523 None onefcc Thierry plc1 [522, 1522, 2522] +524 None onefcd Thierry plc1 [523, 1523, 2523] +525 None onefce Thierry plc1 [524, 1524, 2524] +526 None onefcf Thierry plc1 [525, 1525, 2525] +527 None onefcg Thierry plc1 [526, 1526, 2526] +528 None onefch Thierry plc1 [527, 1527, 2527] +529 None onefci Thierry plc1 [528, 1528, 2528] +530 None onefcj Thierry plc1 [529, 1529, 2529] +531 None onefda Thierry plc1 [530, 1530, 2530] +532 None onefdb Thierry plc1 [531, 1531, 2531] +533 None onefdc Thierry plc1 [532, 1532, 2532] +534 None onefdd Thierry plc1 [533, 1533, 2533] +535 None onefde Thierry plc1 [534, 1534, 2534] +536 None onefdf Thierry plc1 [535, 1535, 2535] +537 None onefdg Thierry plc1 [536, 1536, 2536] +538 None onefdh Thierry plc1 [537, 1537, 2537] +539 None onefdi Thierry plc1 [538, 1538, 2538] +540 None onefdj Thierry plc1 [539, 1539, 2539] +541 None onefea Thierry plc1 [540, 1540, 2540] +542 None onefeb Thierry plc1 [541, 1541, 2541] +543 None onefec Thierry plc1 [542, 1542, 2542] +544 None onefed Thierry plc1 [543, 1543, 2543] +545 None onefee Thierry plc1 [544, 1544, 2544] +546 None onefef Thierry plc1 [545, 1545, 2545] +547 None onefeg Thierry plc1 [546, 1546, 2546] +548 None onefeh Thierry plc1 [547, 1547, 2547] +549 None onefei Thierry plc1 [548, 1548, 2548] +550 None onefej Thierry plc1 [549, 1549, 2549] +551 None oneffa Thierry plc1 [550, 1550, 2550] +552 None oneffb Thierry plc1 [551, 1551, 2551] +553 None oneffc Thierry plc1 [552, 1552, 2552] +554 None oneffd Thierry plc1 [553, 1553, 2553] +555 None oneffe Thierry plc1 [554, 1554, 2554] +556 None onefff Thierry plc1 [555, 1555, 2555] +557 None oneffg Thierry plc1 [556, 1556, 2556] +558 None oneffh Thierry plc1 [557, 1557, 2557] +559 None oneffi Thierry plc1 [558, 1558, 2558] +560 None oneffj Thierry plc1 [559, 1559, 2559] +561 None onefga Thierry plc1 [560, 1560, 2560] +562 None onefgb Thierry plc1 [561, 1561, 2561] +563 None onefgc Thierry plc1 [562, 1562, 2562] +564 None onefgd Thierry plc1 [563, 1563, 2563] +565 None onefge Thierry plc1 [564, 1564, 2564] +566 None onefgf Thierry plc1 [565, 1565, 2565] +567 None onefgg Thierry plc1 [566, 1566, 2566] +568 None onefgh Thierry plc1 [567, 1567, 2567] +569 None onefgi Thierry plc1 [568, 1568, 2568] +570 None onefgj Thierry plc1 [569, 1569, 2569] +571 None onefha Thierry plc1 [570, 1570, 2570] +572 None onefhb Thierry plc1 [571, 1571, 2571] +573 None onefhc Thierry plc1 [572, 1572, 2572] +574 None onefhd Thierry plc1 [573, 1573, 2573] +575 None onefhe Thierry plc1 [574, 1574, 2574] +576 None onefhf Thierry plc1 [575, 1575, 2575] +577 None onefhg Thierry plc1 [576, 1576, 2576] +578 None onefhh Thierry plc1 [577, 1577, 2577] +579 None onefhi Thierry plc1 [578, 1578, 2578] +580 None onefhj Thierry plc1 [579, 1579, 2579] +581 None onefia Thierry plc1 [580, 1580, 2580] +582 None onefib Thierry plc1 [581, 1581, 2581] +583 None onefic Thierry plc1 [582, 1582, 2582] +584 None onefid Thierry plc1 [583, 1583, 2583] +585 None onefie Thierry plc1 [584, 1584, 2584] +586 None onefif Thierry plc1 [585, 1585, 2585] +587 None onefig Thierry plc1 [586, 1586, 2586] +588 None onefih Thierry plc1 [587, 1587, 2587] +589 None onefii Thierry plc1 [588, 1588, 2588] +590 None onefij Thierry plc1 [589, 1589, 2589] +591 None onefja Thierry plc1 [590, 1590, 2590] +592 None onefjb Thierry plc1 [591, 1591, 2591] +593 None onefjc Thierry plc1 [592, 1592, 2592] +594 None onefjd Thierry plc1 [593, 1593, 2593] +595 None onefje Thierry plc1 [594, 1594, 2594] +596 None onefjf Thierry plc1 [595, 1595, 2595] +597 None onefjg Thierry plc1 [596, 1596, 2596] +598 None onefjh Thierry plc1 [597, 1597, 2597] +599 None onefji Thierry plc1 [598, 1598, 2598] +600 None onefjj Thierry plc1 [599, 1599, 2599] +601 None onegaa Thierry plc1 [600, 1600, 2600] +602 None onegab Thierry plc1 [601, 1601, 2601] +603 None onegac Thierry plc1 [602, 1602, 2602] +604 None onegad Thierry plc1 [603, 1603, 2603] +605 None onegae Thierry plc1 [604, 1604, 2604] +606 None onegaf Thierry plc1 [605, 1605, 2605] +607 None onegag Thierry plc1 [606, 1606, 2606] +608 None onegah Thierry plc1 [607, 1607, 2607] +609 None onegai Thierry plc1 [608, 1608, 2608] +610 None onegaj Thierry plc1 [609, 1609, 2609] +611 None onegba Thierry plc1 [610, 1610, 2610] +612 None onegbb Thierry plc1 [611, 1611, 2611] +613 None onegbc Thierry plc1 [612, 1612, 2612] +614 None onegbd Thierry plc1 [613, 1613, 2613] +615 None onegbe Thierry plc1 [614, 1614, 2614] +616 None onegbf Thierry plc1 [615, 1615, 2615] +617 None onegbg Thierry plc1 [616, 1616, 2616] +618 None onegbh Thierry plc1 [617, 1617, 2617] +619 None onegbi Thierry plc1 [618, 1618, 2618] +620 None onegbj Thierry plc1 [619, 1619, 2619] +621 None onegca Thierry plc1 [620, 1620, 2620] +622 None onegcb Thierry plc1 [621, 1621, 2621] +623 None onegcc Thierry plc1 [622, 1622, 2622] +624 None onegcd Thierry plc1 [623, 1623, 2623] +625 None onegce Thierry plc1 [624, 1624, 2624] +626 None onegcf Thierry plc1 [625, 1625, 2625] +627 None onegcg Thierry plc1 [626, 1626, 2626] +628 None onegch Thierry plc1 [627, 1627, 2627] +629 None onegci Thierry plc1 [628, 1628, 2628] +630 None onegcj Thierry plc1 [629, 1629, 2629] +631 None onegda Thierry plc1 [630, 1630, 2630] +632 None onegdb Thierry plc1 [631, 1631, 2631] +633 None onegdc Thierry plc1 [632, 1632, 2632] +634 None onegdd Thierry plc1 [633, 1633, 2633] +635 None onegde Thierry plc1 [634, 1634, 2634] +636 None onegdf Thierry plc1 [635, 1635, 2635] +637 None onegdg Thierry plc1 [636, 1636, 2636] +638 None onegdh Thierry plc1 [637, 1637, 2637] +639 None onegdi Thierry plc1 [638, 1638, 2638] +640 None onegdj Thierry plc1 [639, 1639, 2639] +641 None onegea Thierry plc1 [640, 1640, 2640] +642 None onegeb Thierry plc1 [641, 1641, 2641] +643 None onegec Thierry plc1 [642, 1642, 2642] +644 None oneged Thierry plc1 [643, 1643, 2643] +645 None onegee Thierry plc1 [644, 1644, 2644] +646 None onegef Thierry plc1 [645, 1645, 2645] +647 None onegeg Thierry plc1 [646, 1646, 2646] +648 None onegeh Thierry plc1 [647, 1647, 2647] +649 None onegei Thierry plc1 [648, 1648, 2648] +650 None onegej Thierry plc1 [649, 1649, 2649] +651 None onegfa Thierry plc1 [650, 1650, 2650] +652 None onegfb Thierry plc1 [651, 1651, 2651] +653 None onegfc Thierry plc1 [652, 1652, 2652] +654 None onegfd Thierry plc1 [653, 1653, 2653] +655 None onegfe Thierry plc1 [654, 1654, 2654] +656 None onegff Thierry plc1 [655, 1655, 2655] +657 None onegfg Thierry plc1 [656, 1656, 2656] +658 None onegfh Thierry plc1 [657, 1657, 2657] +659 None onegfi Thierry plc1 [658, 1658, 2658] +660 None onegfj Thierry plc1 [659, 1659, 2659] +661 None onegga Thierry plc1 [660, 1660, 2660] +662 None oneggb Thierry plc1 [661, 1661, 2661] +663 None oneggc Thierry plc1 [662, 1662, 2662] +664 None oneggd Thierry plc1 [663, 1663, 2663] +665 None onegge Thierry plc1 [664, 1664, 2664] +666 None oneggf Thierry plc1 [665, 1665, 2665] +667 None oneggg Thierry plc1 [666, 1666, 2666] +668 None oneggh Thierry plc1 [667, 1667, 2667] +669 None oneggi Thierry plc1 [668, 1668, 2668] +670 None oneggj Thierry plc1 [669, 1669, 2669] +671 None onegha Thierry plc1 [670, 1670, 2670] +672 None oneghb Thierry plc1 [671, 1671, 2671] +673 None oneghc Thierry plc1 [672, 1672, 2672] +674 None oneghd Thierry plc1 [673, 1673, 2673] +675 None oneghe Thierry plc1 [674, 1674, 2674] +676 None oneghf Thierry plc1 [675, 1675, 2675] +677 None oneghg Thierry plc1 [676, 1676, 2676] +678 None oneghh Thierry plc1 [677, 1677, 2677] +679 None oneghi Thierry plc1 [678, 1678, 2678] +680 None oneghj Thierry plc1 [679, 1679, 2679] +681 None onegia Thierry plc1 [680, 1680, 2680] +682 None onegib Thierry plc1 [681, 1681, 2681] +683 None onegic Thierry plc1 [682, 1682, 2682] +684 None onegid Thierry plc1 [683, 1683, 2683] +685 None onegie Thierry plc1 [684, 1684, 2684] +686 None onegif Thierry plc1 [685, 1685, 2685] +687 None onegig Thierry plc1 [686, 1686, 2686] +688 None onegih Thierry plc1 [687, 1687, 2687] +689 None onegii Thierry plc1 [688, 1688, 2688] +690 None onegij Thierry plc1 [689, 1689, 2689] +691 None onegja Thierry plc1 [690, 1690, 2690] +692 None onegjb Thierry plc1 [691, 1691, 2691] +693 None onegjc Thierry plc1 [692, 1692, 2692] +694 None onegjd Thierry plc1 [693, 1693, 2693] +695 None onegje Thierry plc1 [694, 1694, 2694] +696 None onegjf Thierry plc1 [695, 1695, 2695] +697 None onegjg Thierry plc1 [696, 1696, 2696] +698 None onegjh Thierry plc1 [697, 1697, 2697] +699 None onegji Thierry plc1 [698, 1698, 2698] +700 None onegjj Thierry plc1 [699, 1699, 2699] +701 None onehaa Thierry plc1 [700, 1700, 2700] +702 None onehab Thierry plc1 [701, 1701, 2701] +703 None onehac Thierry plc1 [702, 1702, 2702] +704 None onehad Thierry plc1 [703, 1703, 2703] +705 None onehae Thierry plc1 [704, 1704, 2704] +706 None onehaf Thierry plc1 [705, 1705, 2705] +707 None onehag Thierry plc1 [706, 1706, 2706] +708 None onehah Thierry plc1 [707, 1707, 2707] +709 None onehai Thierry plc1 [708, 1708, 2708] +710 None onehaj Thierry plc1 [709, 1709, 2709] +711 None onehba Thierry plc1 [710, 1710, 2710] +712 None onehbb Thierry plc1 [711, 1711, 2711] +713 None onehbc Thierry plc1 [712, 1712, 2712] +714 None onehbd Thierry plc1 [713, 1713, 2713] +715 None onehbe Thierry plc1 [714, 1714, 2714] +716 None onehbf Thierry plc1 [715, 1715, 2715] +717 None onehbg Thierry plc1 [716, 1716, 2716] +718 None onehbh Thierry plc1 [717, 1717, 2717] +719 None onehbi Thierry plc1 [718, 1718, 2718] +720 None onehbj Thierry plc1 [719, 1719, 2719] +721 None onehca Thierry plc1 [720, 1720, 2720] +722 None onehcb Thierry plc1 [721, 1721, 2721] +723 None onehcc Thierry plc1 [722, 1722, 2722] +724 None onehcd Thierry plc1 [723, 1723, 2723] +725 None onehce Thierry plc1 [724, 1724, 2724] +726 None onehcf Thierry plc1 [725, 1725, 2725] +727 None onehcg Thierry plc1 [726, 1726, 2726] +728 None onehch Thierry plc1 [727, 1727, 2727] +729 None onehci Thierry plc1 [728, 1728, 2728] +730 None onehcj Thierry plc1 [729, 1729, 2729] +731 None onehda Thierry plc1 [730, 1730, 2730] +732 None onehdb Thierry plc1 [731, 1731, 2731] +733 None onehdc Thierry plc1 [732, 1732, 2732] +734 None onehdd Thierry plc1 [733, 1733, 2733] +735 None onehde Thierry plc1 [734, 1734, 2734] +736 None onehdf Thierry plc1 [735, 1735, 2735] +737 None onehdg Thierry plc1 [736, 1736, 2736] +738 None onehdh Thierry plc1 [737, 1737, 2737] +739 None onehdi Thierry plc1 [738, 1738, 2738] +740 None onehdj Thierry plc1 [739, 1739, 2739] +741 None onehea Thierry plc1 [740, 1740, 2740] +742 None oneheb Thierry plc1 [741, 1741, 2741] +743 None onehec Thierry plc1 [742, 1742, 2742] +744 None onehed Thierry plc1 [743, 1743, 2743] +745 None onehee Thierry plc1 [744, 1744, 2744] +746 None onehef Thierry plc1 [745, 1745, 2745] +747 None oneheg Thierry plc1 [746, 1746, 2746] +748 None oneheh Thierry plc1 [747, 1747, 2747] +749 None onehei Thierry plc1 [748, 1748, 2748] +750 None onehej Thierry plc1 [749, 1749, 2749] +751 None onehfa Thierry plc1 [750, 1750, 2750] +752 None onehfb Thierry plc1 [751, 1751, 2751] +753 None onehfc Thierry plc1 [752, 1752, 2752] +754 None onehfd Thierry plc1 [753, 1753, 2753] +755 None onehfe Thierry plc1 [754, 1754, 2754] +756 None onehff Thierry plc1 [755, 1755, 2755] +757 None onehfg Thierry plc1 [756, 1756, 2756] +758 None onehfh Thierry plc1 [757, 1757, 2757] +759 None onehfi Thierry plc1 [758, 1758, 2758] +760 None onehfj Thierry plc1 [759, 1759, 2759] +761 None onehga Thierry plc1 [760, 1760, 2760] +762 None onehgb Thierry plc1 [761, 1761, 2761] +763 None onehgc Thierry plc1 [762, 1762, 2762] +764 None onehgd Thierry plc1 [763, 1763, 2763] +765 None onehge Thierry plc1 [764, 1764, 2764] +766 None onehgf Thierry plc1 [765, 1765, 2765] +767 None onehgg Thierry plc1 [766, 1766, 2766] +768 None onehgh Thierry plc1 [767, 1767, 2767] +769 None onehgi Thierry plc1 [768, 1768, 2768] +770 None onehgj Thierry plc1 [769, 1769, 2769] +771 None onehha Thierry plc1 [770, 1770, 2770] +772 None onehhb Thierry plc1 [771, 1771, 2771] +773 None onehhc Thierry plc1 [772, 1772, 2772] +774 None onehhd Thierry plc1 [773, 1773, 2773] +775 None onehhe Thierry plc1 [774, 1774, 2774] +776 None onehhf Thierry plc1 [775, 1775, 2775] +777 None onehhg Thierry plc1 [776, 1776, 2776] +778 None onehhh Thierry plc1 [777, 1777, 2777] +779 None onehhi Thierry plc1 [778, 1778, 2778] +780 None onehhj Thierry plc1 [779, 1779, 2779] +781 None onehia Thierry plc1 [780, 1780, 2780] +782 None onehib Thierry plc1 [781, 1781, 2781] +783 None onehic Thierry plc1 [782, 1782, 2782] +784 None onehid Thierry plc1 [783, 1783, 2783] +785 None onehie Thierry plc1 [784, 1784, 2784] +786 None onehif Thierry plc1 [785, 1785, 2785] +787 None onehig Thierry plc1 [786, 1786, 2786] +788 None onehih Thierry plc1 [787, 1787, 2787] +789 None onehii Thierry plc1 [788, 1788, 2788] +790 None onehij Thierry plc1 [789, 1789, 2789] +791 None onehja Thierry plc1 [790, 1790, 2790] +792 None onehjb Thierry plc1 [791, 1791, 2791] +793 None onehjc Thierry plc1 [792, 1792, 2792] +794 None onehjd Thierry plc1 [793, 1793, 2793] +795 None onehje Thierry plc1 [794, 1794, 2794] +796 None onehjf Thierry plc1 [795, 1795, 2795] +797 None onehjg Thierry plc1 [796, 1796, 2796] +798 None onehjh Thierry plc1 [797, 1797, 2797] +799 None onehji Thierry plc1 [798, 1798, 2798] +800 None onehjj Thierry plc1 [799, 1799, 2799] +801 None oneiaa Thierry plc1 [800, 1800, 2800] +802 None oneiab Thierry plc1 [801, 1801, 2801] +803 None oneiac Thierry plc1 [802, 1802, 2802] +804 None oneiad Thierry plc1 [803, 1803, 2803] +805 None oneiae Thierry plc1 [804, 1804, 2804] +806 None oneiaf Thierry plc1 [805, 1805, 2805] +807 None oneiag Thierry plc1 [806, 1806, 2806] +808 None oneiah Thierry plc1 [807, 1807, 2807] +809 None oneiai Thierry plc1 [808, 1808, 2808] +810 None oneiaj Thierry plc1 [809, 1809, 2809] +811 None oneiba Thierry plc1 [810, 1810, 2810] +812 None oneibb Thierry plc1 [811, 1811, 2811] +813 None oneibc Thierry plc1 [812, 1812, 2812] +814 None oneibd Thierry plc1 [813, 1813, 2813] +815 None oneibe Thierry plc1 [814, 1814, 2814] +816 None oneibf Thierry plc1 [815, 1815, 2815] +817 None oneibg Thierry plc1 [816, 1816, 2816] +818 None oneibh Thierry plc1 [817, 1817, 2817] +819 None oneibi Thierry plc1 [818, 1818, 2818] +820 None oneibj Thierry plc1 [819, 1819, 2819] +821 None oneica Thierry plc1 [820, 1820, 2820] +822 None oneicb Thierry plc1 [821, 1821, 2821] +823 None oneicc Thierry plc1 [822, 1822, 2822] +824 None oneicd Thierry plc1 [823, 1823, 2823] +825 None oneice Thierry plc1 [824, 1824, 2824] +826 None oneicf Thierry plc1 [825, 1825, 2825] +827 None oneicg Thierry plc1 [826, 1826, 2826] +828 None oneich Thierry plc1 [827, 1827, 2827] +829 None oneici Thierry plc1 [828, 1828, 2828] +830 None oneicj Thierry plc1 [829, 1829, 2829] +831 None oneida Thierry plc1 [830, 1830, 2830] +832 None oneidb Thierry plc1 [831, 1831, 2831] +833 None oneidc Thierry plc1 [832, 1832, 2832] +834 None oneidd Thierry plc1 [833, 1833, 2833] +835 None oneide Thierry plc1 [834, 1834, 2834] +836 None oneidf Thierry plc1 [835, 1835, 2835] +837 None oneidg Thierry plc1 [836, 1836, 2836] +838 None oneidh Thierry plc1 [837, 1837, 2837] +839 None oneidi Thierry plc1 [838, 1838, 2838] +840 None oneidj Thierry plc1 [839, 1839, 2839] +841 None oneiea Thierry plc1 [840, 1840, 2840] +842 None oneieb Thierry plc1 [841, 1841, 2841] +843 None oneiec Thierry plc1 [842, 1842, 2842] +844 None oneied Thierry plc1 [843, 1843, 2843] +845 None oneiee Thierry plc1 [844, 1844, 2844] +846 None oneief Thierry plc1 [845, 1845, 2845] +847 None oneieg Thierry plc1 [846, 1846, 2846] +848 None oneieh Thierry plc1 [847, 1847, 2847] +849 None oneiei Thierry plc1 [848, 1848, 2848] +850 None oneiej Thierry plc1 [849, 1849, 2849] +851 None oneifa Thierry plc1 [850, 1850, 2850] +852 None oneifb Thierry plc1 [851, 1851, 2851] +853 None oneifc Thierry plc1 [852, 1852, 2852] +854 None oneifd Thierry plc1 [853, 1853, 2853] +855 None oneife Thierry plc1 [854, 1854, 2854] +856 None oneiff Thierry plc1 [855, 1855, 2855] +857 None oneifg Thierry plc1 [856, 1856, 2856] +858 None oneifh Thierry plc1 [857, 1857, 2857] +859 None oneifi Thierry plc1 [858, 1858, 2858] +860 None oneifj Thierry plc1 [859, 1859, 2859] +861 None oneiga Thierry plc1 [860, 1860, 2860] +862 None oneigb Thierry plc1 [861, 1861, 2861] +863 None oneigc Thierry plc1 [862, 1862, 2862] +864 None oneigd Thierry plc1 [863, 1863, 2863] +865 None oneige Thierry plc1 [864, 1864, 2864] +866 None oneigf Thierry plc1 [865, 1865, 2865] +867 None oneigg Thierry plc1 [866, 1866, 2866] +868 None oneigh Thierry plc1 [867, 1867, 2867] +869 None oneigi Thierry plc1 [868, 1868, 2868] +870 None oneigj Thierry plc1 [869, 1869, 2869] +871 None oneiha Thierry plc1 [870, 1870, 2870] +872 None oneihb Thierry plc1 [871, 1871, 2871] +873 None oneihc Thierry plc1 [872, 1872, 2872] +874 None oneihd Thierry plc1 [873, 1873, 2873] +875 None oneihe Thierry plc1 [874, 1874, 2874] +876 None oneihf Thierry plc1 [875, 1875, 2875] +877 None oneihg Thierry plc1 [876, 1876, 2876] +878 None oneihh Thierry plc1 [877, 1877, 2877] +879 None oneihi Thierry plc1 [878, 1878, 2878] +880 None oneihj Thierry plc1 [879, 1879, 2879] +881 None oneiia Thierry plc1 [880, 1880, 2880] +882 None oneiib Thierry plc1 [881, 1881, 2881] +883 None oneiic Thierry plc1 [882, 1882, 2882] +884 None oneiid Thierry plc1 [883, 1883, 2883] +885 None oneiie Thierry plc1 [884, 1884, 2884] +886 None oneiif Thierry plc1 [885, 1885, 2885] +887 None oneiig Thierry plc1 [886, 1886, 2886] +888 None oneiih Thierry plc1 [887, 1887, 2887] +889 None oneiii Thierry plc1 [888, 1888, 2888] +890 None oneiij Thierry plc1 [889, 1889, 2889] +891 None oneija Thierry plc1 [890, 1890, 2890] +892 None oneijb Thierry plc1 [891, 1891, 2891] +893 None oneijc Thierry plc1 [892, 1892, 2892] +894 None oneijd Thierry plc1 [893, 1893, 2893] +895 None oneije Thierry plc1 [894, 1894, 2894] +896 None oneijf Thierry plc1 [895, 1895, 2895] +897 None oneijg Thierry plc1 [896, 1896, 2896] +898 None oneijh Thierry plc1 [897, 1897, 2897] +899 None oneiji Thierry plc1 [898, 1898, 2898] +900 None oneijj Thierry plc1 [899, 1899, 2899] +901 None onejaa Thierry plc1 [900, 1900, 2900] +902 None onejab Thierry plc1 [901, 1901, 2901] +903 None onejac Thierry plc1 [902, 1902, 2902] +904 None onejad Thierry plc1 [903, 1903, 2903] +905 None onejae Thierry plc1 [904, 1904, 2904] +906 None onejaf Thierry plc1 [905, 1905, 2905] +907 None onejag Thierry plc1 [906, 1906, 2906] +908 None onejah Thierry plc1 [907, 1907, 2907] +909 None onejai Thierry plc1 [908, 1908, 2908] +910 None onejaj Thierry plc1 [909, 1909, 2909] +911 None onejba Thierry plc1 [910, 1910, 2910] +912 None onejbb Thierry plc1 [911, 1911, 2911] +913 None onejbc Thierry plc1 [912, 1912, 2912] +914 None onejbd Thierry plc1 [913, 1913, 2913] +915 None onejbe Thierry plc1 [914, 1914, 2914] +916 None onejbf Thierry plc1 [915, 1915, 2915] +917 None onejbg Thierry plc1 [916, 1916, 2916] +918 None onejbh Thierry plc1 [917, 1917, 2917] +919 None onejbi Thierry plc1 [918, 1918, 2918] +920 None onejbj Thierry plc1 [919, 1919, 2919] +921 None onejca Thierry plc1 [920, 1920, 2920] +922 None onejcb Thierry plc1 [921, 1921, 2921] +923 None onejcc Thierry plc1 [922, 1922, 2922] +924 None onejcd Thierry plc1 [923, 1923, 2923] +925 None onejce Thierry plc1 [924, 1924, 2924] +926 None onejcf Thierry plc1 [925, 1925, 2925] +927 None onejcg Thierry plc1 [926, 1926, 2926] +928 None onejch Thierry plc1 [927, 1927, 2927] +929 None onejci Thierry plc1 [928, 1928, 2928] +930 None onejcj Thierry plc1 [929, 1929, 2929] +931 None onejda Thierry plc1 [930, 1930, 2930] +932 None onejdb Thierry plc1 [931, 1931, 2931] +933 None onejdc Thierry plc1 [932, 1932, 2932] +934 None onejdd Thierry plc1 [933, 1933, 2933] +935 None onejde Thierry plc1 [934, 1934, 2934] +936 None onejdf Thierry plc1 [935, 1935, 2935] +937 None onejdg Thierry plc1 [936, 1936, 2936] +938 None onejdh Thierry plc1 [937, 1937, 2937] +939 None onejdi Thierry plc1 [938, 1938, 2938] +940 None onejdj Thierry plc1 [939, 1939, 2939] +941 None onejea Thierry plc1 [940, 1940, 2940] +942 None onejeb Thierry plc1 [941, 1941, 2941] +943 None onejec Thierry plc1 [942, 1942, 2942] +944 None onejed Thierry plc1 [943, 1943, 2943] +945 None onejee Thierry plc1 [944, 1944, 2944] +946 None onejef Thierry plc1 [945, 1945, 2945] +947 None onejeg Thierry plc1 [946, 1946, 2946] +948 None onejeh Thierry plc1 [947, 1947, 2947] +949 None onejei Thierry plc1 [948, 1948, 2948] +950 None onejej Thierry plc1 [949, 1949, 2949] +951 None onejfa Thierry plc1 [950, 1950, 2950] +952 None onejfb Thierry plc1 [951, 1951, 2951] +953 None onejfc Thierry plc1 [952, 1952, 2952] +954 None onejfd Thierry plc1 [953, 1953, 2953] +955 None onejfe Thierry plc1 [954, 1954, 2954] +956 None onejff Thierry plc1 [955, 1955, 2955] +957 None onejfg Thierry plc1 [956, 1956, 2956] +958 None onejfh Thierry plc1 [957, 1957, 2957] +959 None onejfi Thierry plc1 [958, 1958, 2958] +960 None onejfj Thierry plc1 [959, 1959, 2959] +961 None onejga Thierry plc1 [960, 1960, 2960] +962 None onejgb Thierry plc1 [961, 1961, 2961] +963 None onejgc Thierry plc1 [962, 1962, 2962] +964 None onejgd Thierry plc1 [963, 1963, 2963] +965 None onejge Thierry plc1 [964, 1964, 2964] +966 None onejgf Thierry plc1 [965, 1965, 2965] +967 None onejgg Thierry plc1 [966, 1966, 2966] +968 None onejgh Thierry plc1 [967, 1967, 2967] +969 None onejgi Thierry plc1 [968, 1968, 2968] +970 None onejgj Thierry plc1 [969, 1969, 2969] +971 None onejha Thierry plc1 [970, 1970, 2970] +972 None onejhb Thierry plc1 [971, 1971, 2971] +973 None onejhc Thierry plc1 [972, 1972, 2972] +974 None onejhd Thierry plc1 [973, 1973, 2973] +975 None onejhe Thierry plc1 [974, 1974, 2974] +976 None onejhf Thierry plc1 [975, 1975, 2975] +977 None onejhg Thierry plc1 [976, 1976, 2976] +978 None onejhh Thierry plc1 [977, 1977, 2977] +979 None onejhi Thierry plc1 [978, 1978, 2978] +980 None onejhj Thierry plc1 [979, 1979, 2979] +981 None onejia Thierry plc1 [980, 1980, 2980] +982 None onejib Thierry plc1 [981, 1981, 2981] +983 None onejic Thierry plc1 [982, 1982, 2982] +984 None onejid Thierry plc1 [983, 1983, 2983] +985 None onejie Thierry plc1 [984, 1984, 2984] +986 None onejif Thierry plc1 [985, 1985, 2985] +987 None onejig Thierry plc1 [986, 1986, 2986] +988 None onejih Thierry plc1 [987, 1987, 2987] +989 None onejii Thierry plc1 [988, 1988, 2988] +990 None onejij Thierry plc1 [989, 1989, 2989] +991 None onejja Thierry plc1 [990, 1990, 2990] +992 None onejjb Thierry plc1 [991, 1991, 2991] +993 None onejjc Thierry plc1 [992, 1992, 2992] +994 None onejjd Thierry plc1 [993, 1993, 2993] +995 None onejje Thierry plc1 [994, 1994, 2994] +996 None onejjf Thierry plc1 [995, 1995, 2995] +997 None onejjg Thierry plc1 [996, 1996, 2996] +998 None onejjh Thierry plc1 [997, 1997, 2997] +999 None onejji Thierry plc1 [998, 1998, 2998] +1000 None onejjj Thierry plc1 [999, 1999, 2999] +1001 None onebaaa Thierry plc1 [1000, 2000, 3000] +1002 1 thtwo Thierry plc2 Central [] +1003 1 twob Thierry plc2 [3001, 4001, 5001] +1004 1 twoc Thierry plc2 [3002, 4002, 5002] +1005 1 twod Thierry plc2 [3003, 4003, 5003] +1006 1 twoe Thierry plc2 [3004, 4004, 5004] +1007 1 twof Thierry plc2 [3005, 4005, 5005] +1008 1 twog Thierry plc2 [3006, 4006, 5006] +1009 1 twoh Thierry plc2 [3007, 4007, 5007] +1010 1 twoi Thierry plc2 [3008, 4008, 5008] +1011 1 twoj Thierry plc2 [3009, 4009, 5009] +1012 1 twoba Thierry plc2 [3010, 4010, 5010] +1013 1 twobb Thierry plc2 [3011, 4011, 5011] +1014 1 twobc Thierry plc2 [3012, 4012, 5012] +1015 1 twobd Thierry plc2 [3013, 4013, 5013] +1016 1 twobe Thierry plc2 [3014, 4014, 5014] +1017 1 twobf Thierry plc2 [3015, 4015, 5015] +1018 1 twobg Thierry plc2 [3016, 4016, 5016] +1019 1 twobh Thierry plc2 [3017, 4017, 5017] +1020 1 twobi Thierry plc2 [3018, 4018, 5018] +1021 1 twobj Thierry plc2 [3019, 4019, 5019] +1022 1 twoca Thierry plc2 [3020, 4020, 5020] +1023 1 twocb Thierry plc2 [3021, 4021, 5021] +1024 1 twocc Thierry plc2 [3022, 4022, 5022] +1025 1 twocd Thierry plc2 [3023, 4023, 5023] +1026 1 twoce Thierry plc2 [3024, 4024, 5024] +1027 1 twocf Thierry plc2 [3025, 4025, 5025] +1028 1 twocg Thierry plc2 [3026, 4026, 5026] +1029 1 twoch Thierry plc2 [3027, 4027, 5027] +1030 1 twoci Thierry plc2 [3028, 4028, 5028] +1031 1 twocj Thierry plc2 [3029, 4029, 5029] +1032 1 twoda Thierry plc2 [3030, 4030, 5030] +1033 1 twodb Thierry plc2 [3031, 4031, 5031] +1034 1 twodc Thierry plc2 [3032, 4032, 5032] +1035 1 twodd Thierry plc2 [3033, 4033, 5033] +1036 1 twode Thierry plc2 [3034, 4034, 5034] +1037 1 twodf Thierry plc2 [3035, 4035, 5035] +1038 1 twodg Thierry plc2 [3036, 4036, 5036] +1039 1 twodh Thierry plc2 [3037, 4037, 5037] +1040 1 twodi Thierry plc2 [3038, 4038, 5038] +1041 1 twodj Thierry plc2 [3039, 4039, 5039] +1042 1 twoea Thierry plc2 [3040, 4040, 5040] +1043 1 twoeb Thierry plc2 [3041, 4041, 5041] +1044 1 twoec Thierry plc2 [3042, 4042, 5042] +1045 1 twoed Thierry plc2 [3043, 4043, 5043] +1046 1 twoee Thierry plc2 [3044, 4044, 5044] +1047 1 twoef Thierry plc2 [3045, 4045, 5045] +1048 1 twoeg Thierry plc2 [3046, 4046, 5046] +1049 1 twoeh Thierry plc2 [3047, 4047, 5047] +1050 1 twoei Thierry plc2 [3048, 4048, 5048] +1051 1 twoej Thierry plc2 [3049, 4049, 5049] +1052 1 twofa Thierry plc2 [3050, 4050, 5050] +1053 1 twofb Thierry plc2 [3051, 4051, 5051] +1054 1 twofc Thierry plc2 [3052, 4052, 5052] +1055 1 twofd Thierry plc2 [3053, 4053, 5053] +1056 1 twofe Thierry plc2 [3054, 4054, 5054] +1057 1 twoff Thierry plc2 [3055, 4055, 5055] +1058 1 twofg Thierry plc2 [3056, 4056, 5056] +1059 1 twofh Thierry plc2 [3057, 4057, 5057] +1060 1 twofi Thierry plc2 [3058, 4058, 5058] +1061 1 twofj Thierry plc2 [3059, 4059, 5059] +1062 1 twoga Thierry plc2 [3060, 4060, 5060] +1063 1 twogb Thierry plc2 [3061, 4061, 5061] +1064 1 twogc Thierry plc2 [3062, 4062, 5062] +1065 1 twogd Thierry plc2 [3063, 4063, 5063] +1066 1 twoge Thierry plc2 [3064, 4064, 5064] +1067 1 twogf Thierry plc2 [3065, 4065, 5065] +1068 1 twogg Thierry plc2 [3066, 4066, 5066] +1069 1 twogh Thierry plc2 [3067, 4067, 5067] +1070 1 twogi Thierry plc2 [3068, 4068, 5068] +1071 1 twogj Thierry plc2 [3069, 4069, 5069] +1072 1 twoha Thierry plc2 [3070, 4070, 5070] +1073 1 twohb Thierry plc2 [3071, 4071, 5071] +1074 1 twohc Thierry plc2 [3072, 4072, 5072] +1075 1 twohd Thierry plc2 [3073, 4073, 5073] +1076 1 twohe Thierry plc2 [3074, 4074, 5074] +1077 1 twohf Thierry plc2 [3075, 4075, 5075] +1078 1 twohg Thierry plc2 [3076, 4076, 5076] +1079 1 twohh Thierry plc2 [3077, 4077, 5077] +1080 1 twohi Thierry plc2 [3078, 4078, 5078] +1081 1 twohj Thierry plc2 [3079, 4079, 5079] +1082 1 twoia Thierry plc2 [3080, 4080, 5080] +1083 1 twoib Thierry plc2 [3081, 4081, 5081] +1084 1 twoic Thierry plc2 [3082, 4082, 5082] +1085 1 twoid Thierry plc2 [3083, 4083, 5083] +1086 1 twoie Thierry plc2 [3084, 4084, 5084] +1087 1 twoif Thierry plc2 [3085, 4085, 5085] +1088 1 twoig Thierry plc2 [3086, 4086, 5086] +1089 1 twoih Thierry plc2 [3087, 4087, 5087] +1090 1 twoii Thierry plc2 [3088, 4088, 5088] +1091 1 twoij Thierry plc2 [3089, 4089, 5089] +1092 1 twoja Thierry plc2 [3090, 4090, 5090] +1093 1 twojb Thierry plc2 [3091, 4091, 5091] +1094 1 twojc Thierry plc2 [3092, 4092, 5092] +1095 1 twojd Thierry plc2 [3093, 4093, 5093] +1096 1 twoje Thierry plc2 [3094, 4094, 5094] +1097 1 twojf Thierry plc2 [3095, 4095, 5095] +1098 1 twojg Thierry plc2 [3096, 4096, 5096] +1099 1 twojh Thierry plc2 [3097, 4097, 5097] +1100 1 twoji Thierry plc2 [3098, 4098, 5098] +1101 1 twojj Thierry plc2 [3099, 4099, 5099] +1102 1 twobaa Thierry plc2 [3100, 4100, 5100] +1103 1 twobab Thierry plc2 [3101, 4101, 5101] +1104 1 twobac Thierry plc2 [3102, 4102, 5102] +1105 1 twobad Thierry plc2 [3103, 4103, 5103] +1106 1 twobae Thierry plc2 [3104, 4104, 5104] +1107 1 twobaf Thierry plc2 [3105, 4105, 5105] +1108 1 twobag Thierry plc2 [3106, 4106, 5106] +1109 1 twobah Thierry plc2 [3107, 4107, 5107] +1110 1 twobai Thierry plc2 [3108, 4108, 5108] +1111 1 twobaj Thierry plc2 [3109, 4109, 5109] +1112 1 twobba Thierry plc2 [3110, 4110, 5110] +1113 1 twobbb Thierry plc2 [3111, 4111, 5111] +1114 1 twobbc Thierry plc2 [3112, 4112, 5112] +1115 1 twobbd Thierry plc2 [3113, 4113, 5113] +1116 1 twobbe Thierry plc2 [3114, 4114, 5114] +1117 1 twobbf Thierry plc2 [3115, 4115, 5115] +1118 1 twobbg Thierry plc2 [3116, 4116, 5116] +1119 1 twobbh Thierry plc2 [3117, 4117, 5117] +1120 1 twobbi Thierry plc2 [3118, 4118, 5118] +1121 1 twobbj Thierry plc2 [3119, 4119, 5119] +1122 1 twobca Thierry plc2 [3120, 4120, 5120] +1123 1 twobcb Thierry plc2 [3121, 4121, 5121] +1124 1 twobcc Thierry plc2 [3122, 4122, 5122] +1125 1 twobcd Thierry plc2 [3123, 4123, 5123] +1126 1 twobce Thierry plc2 [3124, 4124, 5124] +1127 1 twobcf Thierry plc2 [3125, 4125, 5125] +1128 1 twobcg Thierry plc2 [3126, 4126, 5126] +1129 1 twobch Thierry plc2 [3127, 4127, 5127] +1130 1 twobci Thierry plc2 [3128, 4128, 5128] +1131 1 twobcj Thierry plc2 [3129, 4129, 5129] +1132 1 twobda Thierry plc2 [3130, 4130, 5130] +1133 1 twobdb Thierry plc2 [3131, 4131, 5131] +1134 1 twobdc Thierry plc2 [3132, 4132, 5132] +1135 1 twobdd Thierry plc2 [3133, 4133, 5133] +1136 1 twobde Thierry plc2 [3134, 4134, 5134] +1137 1 twobdf Thierry plc2 [3135, 4135, 5135] +1138 1 twobdg Thierry plc2 [3136, 4136, 5136] +1139 1 twobdh Thierry plc2 [3137, 4137, 5137] +1140 1 twobdi Thierry plc2 [3138, 4138, 5138] +1141 1 twobdj Thierry plc2 [3139, 4139, 5139] +1142 1 twobea Thierry plc2 [3140, 4140, 5140] +1143 1 twobeb Thierry plc2 [3141, 4141, 5141] +1144 1 twobec Thierry plc2 [3142, 4142, 5142] +1145 1 twobed Thierry plc2 [3143, 4143, 5143] +1146 1 twobee Thierry plc2 [3144, 4144, 5144] +1147 1 twobef Thierry plc2 [3145, 4145, 5145] +1148 1 twobeg Thierry plc2 [3146, 4146, 5146] +1149 1 twobeh Thierry plc2 [3147, 4147, 5147] +1150 1 twobei Thierry plc2 [3148, 4148, 5148] +1151 1 twobej Thierry plc2 [3149, 4149, 5149] +1152 1 twobfa Thierry plc2 [3150, 4150, 5150] +1153 1 twobfb Thierry plc2 [3151, 4151, 5151] +1154 1 twobfc Thierry plc2 [3152, 4152, 5152] +1155 1 twobfd Thierry plc2 [3153, 4153, 5153] +1156 1 twobfe Thierry plc2 [3154, 4154, 5154] +1157 1 twobff Thierry plc2 [3155, 4155, 5155] +1158 1 twobfg Thierry plc2 [3156, 4156, 5156] +1159 1 twobfh Thierry plc2 [3157, 4157, 5157] +1160 1 twobfi Thierry plc2 [3158, 4158, 5158] +1161 1 twobfj Thierry plc2 [3159, 4159, 5159] +1162 1 twobga Thierry plc2 [3160, 4160, 5160] +1163 1 twobgb Thierry plc2 [3161, 4161, 5161] +1164 1 twobgc Thierry plc2 [3162, 4162, 5162] +1165 1 twobgd Thierry plc2 [3163, 4163, 5163] +1166 1 twobge Thierry plc2 [3164, 4164, 5164] +1167 1 twobgf Thierry plc2 [3165, 4165, 5165] +1168 1 twobgg Thierry plc2 [3166, 4166, 5166] +1169 1 twobgh Thierry plc2 [3167, 4167, 5167] +1170 1 twobgi Thierry plc2 [3168, 4168, 5168] +1171 1 twobgj Thierry plc2 [3169, 4169, 5169] +1172 1 twobha Thierry plc2 [3170, 4170, 5170] +1173 1 twobhb Thierry plc2 [3171, 4171, 5171] +1174 1 twobhc Thierry plc2 [3172, 4172, 5172] +1175 1 twobhd Thierry plc2 [3173, 4173, 5173] +1176 1 twobhe Thierry plc2 [3174, 4174, 5174] +1177 1 twobhf Thierry plc2 [3175, 4175, 5175] +1178 1 twobhg Thierry plc2 [3176, 4176, 5176] +1179 1 twobhh Thierry plc2 [3177, 4177, 5177] +1180 1 twobhi Thierry plc2 [3178, 4178, 5178] +1181 1 twobhj Thierry plc2 [3179, 4179, 5179] +1182 1 twobia Thierry plc2 [3180, 4180, 5180] +1183 1 twobib Thierry plc2 [3181, 4181, 5181] +1184 1 twobic Thierry plc2 [3182, 4182, 5182] +1185 1 twobid Thierry plc2 [3183, 4183, 5183] +1186 1 twobie Thierry plc2 [3184, 4184, 5184] +1187 1 twobif Thierry plc2 [3185, 4185, 5185] +1188 1 twobig Thierry plc2 [3186, 4186, 5186] +1189 1 twobih Thierry plc2 [3187, 4187, 5187] +1190 1 twobii Thierry plc2 [3188, 4188, 5188] +1191 1 twobij Thierry plc2 [3189, 4189, 5189] +1192 1 twobja Thierry plc2 [3190, 4190, 5190] +1193 1 twobjb Thierry plc2 [3191, 4191, 5191] +1194 1 twobjc Thierry plc2 [3192, 4192, 5192] +1195 1 twobjd Thierry plc2 [3193, 4193, 5193] +1196 1 twobje Thierry plc2 [3194, 4194, 5194] +1197 1 twobjf Thierry plc2 [3195, 4195, 5195] +1198 1 twobjg Thierry plc2 [3196, 4196, 5196] +1199 1 twobjh Thierry plc2 [3197, 4197, 5197] +1200 1 twobji Thierry plc2 [3198, 4198, 5198] +1201 1 twobjj Thierry plc2 [3199, 4199, 5199] +1202 1 twocaa Thierry plc2 [3200, 4200, 5200] +1203 1 twocab Thierry plc2 [3201, 4201, 5201] +1204 1 twocac Thierry plc2 [3202, 4202, 5202] +1205 1 twocad Thierry plc2 [3203, 4203, 5203] +1206 1 twocae Thierry plc2 [3204, 4204, 5204] +1207 1 twocaf Thierry plc2 [3205, 4205, 5205] +1208 1 twocag Thierry plc2 [3206, 4206, 5206] +1209 1 twocah Thierry plc2 [3207, 4207, 5207] +1210 1 twocai Thierry plc2 [3208, 4208, 5208] +1211 1 twocaj Thierry plc2 [3209, 4209, 5209] +1212 1 twocba Thierry plc2 [3210, 4210, 5210] +1213 1 twocbb Thierry plc2 [3211, 4211, 5211] +1214 1 twocbc Thierry plc2 [3212, 4212, 5212] +1215 1 twocbd Thierry plc2 [3213, 4213, 5213] +1216 1 twocbe Thierry plc2 [3214, 4214, 5214] +1217 1 twocbf Thierry plc2 [3215, 4215, 5215] +1218 1 twocbg Thierry plc2 [3216, 4216, 5216] +1219 1 twocbh Thierry plc2 [3217, 4217, 5217] +1220 1 twocbi Thierry plc2 [3218, 4218, 5218] +1221 1 twocbj Thierry plc2 [3219, 4219, 5219] +1222 1 twocca Thierry plc2 [3220, 4220, 5220] +1223 1 twoccb Thierry plc2 [3221, 4221, 5221] +1224 1 twoccc Thierry plc2 [3222, 4222, 5222] +1225 1 twoccd Thierry plc2 [3223, 4223, 5223] +1226 1 twocce Thierry plc2 [3224, 4224, 5224] +1227 1 twoccf Thierry plc2 [3225, 4225, 5225] +1228 1 twoccg Thierry plc2 [3226, 4226, 5226] +1229 1 twocch Thierry plc2 [3227, 4227, 5227] +1230 1 twocci Thierry plc2 [3228, 4228, 5228] +1231 1 twoccj Thierry plc2 [3229, 4229, 5229] +1232 1 twocda Thierry plc2 [3230, 4230, 5230] +1233 1 twocdb Thierry plc2 [3231, 4231, 5231] +1234 1 twocdc Thierry plc2 [3232, 4232, 5232] +1235 1 twocdd Thierry plc2 [3233, 4233, 5233] +1236 1 twocde Thierry plc2 [3234, 4234, 5234] +1237 1 twocdf Thierry plc2 [3235, 4235, 5235] +1238 1 twocdg Thierry plc2 [3236, 4236, 5236] +1239 1 twocdh Thierry plc2 [3237, 4237, 5237] +1240 1 twocdi Thierry plc2 [3238, 4238, 5238] +1241 1 twocdj Thierry plc2 [3239, 4239, 5239] +1242 1 twocea Thierry plc2 [3240, 4240, 5240] +1243 1 twoceb Thierry plc2 [3241, 4241, 5241] +1244 1 twocec Thierry plc2 [3242, 4242, 5242] +1245 1 twoced Thierry plc2 [3243, 4243, 5243] +1246 1 twocee Thierry plc2 [3244, 4244, 5244] +1247 1 twocef Thierry plc2 [3245, 4245, 5245] +1248 1 twoceg Thierry plc2 [3246, 4246, 5246] +1249 1 twoceh Thierry plc2 [3247, 4247, 5247] +1250 1 twocei Thierry plc2 [3248, 4248, 5248] +1251 1 twocej Thierry plc2 [3249, 4249, 5249] +1252 1 twocfa Thierry plc2 [3250, 4250, 5250] +1253 1 twocfb Thierry plc2 [3251, 4251, 5251] +1254 1 twocfc Thierry plc2 [3252, 4252, 5252] +1255 1 twocfd Thierry plc2 [3253, 4253, 5253] +1256 1 twocfe Thierry plc2 [3254, 4254, 5254] +1257 1 twocff Thierry plc2 [3255, 4255, 5255] +1258 1 twocfg Thierry plc2 [3256, 4256, 5256] +1259 1 twocfh Thierry plc2 [3257, 4257, 5257] +1260 1 twocfi Thierry plc2 [3258, 4258, 5258] +1261 1 twocfj Thierry plc2 [3259, 4259, 5259] +1262 1 twocga Thierry plc2 [3260, 4260, 5260] +1263 1 twocgb Thierry plc2 [3261, 4261, 5261] +1264 1 twocgc Thierry plc2 [3262, 4262, 5262] +1265 1 twocgd Thierry plc2 [3263, 4263, 5263] +1266 1 twocge Thierry plc2 [3264, 4264, 5264] +1267 1 twocgf Thierry plc2 [3265, 4265, 5265] +1268 1 twocgg Thierry plc2 [3266, 4266, 5266] +1269 1 twocgh Thierry plc2 [3267, 4267, 5267] +1270 1 twocgi Thierry plc2 [3268, 4268, 5268] +1271 1 twocgj Thierry plc2 [3269, 4269, 5269] +1272 1 twocha Thierry plc2 [3270, 4270, 5270] +1273 1 twochb Thierry plc2 [3271, 4271, 5271] +1274 1 twochc Thierry plc2 [3272, 4272, 5272] +1275 1 twochd Thierry plc2 [3273, 4273, 5273] +1276 1 twoche Thierry plc2 [3274, 4274, 5274] +1277 1 twochf Thierry plc2 [3275, 4275, 5275] +1278 1 twochg Thierry plc2 [3276, 4276, 5276] +1279 1 twochh Thierry plc2 [3277, 4277, 5277] +1280 1 twochi Thierry plc2 [3278, 4278, 5278] +1281 1 twochj Thierry plc2 [3279, 4279, 5279] +1282 1 twocia Thierry plc2 [3280, 4280, 5280] +1283 1 twocib Thierry plc2 [3281, 4281, 5281] +1284 1 twocic Thierry plc2 [3282, 4282, 5282] +1285 1 twocid Thierry plc2 [3283, 4283, 5283] +1286 1 twocie Thierry plc2 [3284, 4284, 5284] +1287 1 twocif Thierry plc2 [3285, 4285, 5285] +1288 1 twocig Thierry plc2 [3286, 4286, 5286] +1289 1 twocih Thierry plc2 [3287, 4287, 5287] +1290 1 twocii Thierry plc2 [3288, 4288, 5288] +1291 1 twocij Thierry plc2 [3289, 4289, 5289] +1292 1 twocja Thierry plc2 [3290, 4290, 5290] +1293 1 twocjb Thierry plc2 [3291, 4291, 5291] +1294 1 twocjc Thierry plc2 [3292, 4292, 5292] +1295 1 twocjd Thierry plc2 [3293, 4293, 5293] +1296 1 twocje Thierry plc2 [3294, 4294, 5294] +1297 1 twocjf Thierry plc2 [3295, 4295, 5295] +1298 1 twocjg Thierry plc2 [3296, 4296, 5296] +1299 1 twocjh Thierry plc2 [3297, 4297, 5297] +1300 1 twocji Thierry plc2 [3298, 4298, 5298] +1301 1 twocjj Thierry plc2 [3299, 4299, 5299] +1302 1 twodaa Thierry plc2 [3300, 4300, 5300] +1303 1 twodab Thierry plc2 [3301, 4301, 5301] +1304 1 twodac Thierry plc2 [3302, 4302, 5302] +1305 1 twodad Thierry plc2 [3303, 4303, 5303] +1306 1 twodae Thierry plc2 [3304, 4304, 5304] +1307 1 twodaf Thierry plc2 [3305, 4305, 5305] +1308 1 twodag Thierry plc2 [3306, 4306, 5306] +1309 1 twodah Thierry plc2 [3307, 4307, 5307] +1310 1 twodai Thierry plc2 [3308, 4308, 5308] +1311 1 twodaj Thierry plc2 [3309, 4309, 5309] +1312 1 twodba Thierry plc2 [3310, 4310, 5310] +1313 1 twodbb Thierry plc2 [3311, 4311, 5311] +1314 1 twodbc Thierry plc2 [3312, 4312, 5312] +1315 1 twodbd Thierry plc2 [3313, 4313, 5313] +1316 1 twodbe Thierry plc2 [3314, 4314, 5314] +1317 1 twodbf Thierry plc2 [3315, 4315, 5315] +1318 1 twodbg Thierry plc2 [3316, 4316, 5316] +1319 1 twodbh Thierry plc2 [3317, 4317, 5317] +1320 1 twodbi Thierry plc2 [3318, 4318, 5318] +1321 1 twodbj Thierry plc2 [3319, 4319, 5319] +1322 1 twodca Thierry plc2 [3320, 4320, 5320] +1323 1 twodcb Thierry plc2 [3321, 4321, 5321] +1324 1 twodcc Thierry plc2 [3322, 4322, 5322] +1325 1 twodcd Thierry plc2 [3323, 4323, 5323] +1326 1 twodce Thierry plc2 [3324, 4324, 5324] +1327 1 twodcf Thierry plc2 [3325, 4325, 5325] +1328 1 twodcg Thierry plc2 [3326, 4326, 5326] +1329 1 twodch Thierry plc2 [3327, 4327, 5327] +1330 1 twodci Thierry plc2 [3328, 4328, 5328] +1331 1 twodcj Thierry plc2 [3329, 4329, 5329] +1332 1 twodda Thierry plc2 [3330, 4330, 5330] +1333 1 twoddb Thierry plc2 [3331, 4331, 5331] +1334 1 twoddc Thierry plc2 [3332, 4332, 5332] +1335 1 twoddd Thierry plc2 [3333, 4333, 5333] +1336 1 twodde Thierry plc2 [3334, 4334, 5334] +1337 1 twoddf Thierry plc2 [3335, 4335, 5335] +1338 1 twoddg Thierry plc2 [3336, 4336, 5336] +1339 1 twoddh Thierry plc2 [3337, 4337, 5337] +1340 1 twoddi Thierry plc2 [3338, 4338, 5338] +1341 1 twoddj Thierry plc2 [3339, 4339, 5339] +1342 1 twodea Thierry plc2 [3340, 4340, 5340] +1343 1 twodeb Thierry plc2 [3341, 4341, 5341] +1344 1 twodec Thierry plc2 [3342, 4342, 5342] +1345 1 twoded Thierry plc2 [3343, 4343, 5343] +1346 1 twodee Thierry plc2 [3344, 4344, 5344] +1347 1 twodef Thierry plc2 [3345, 4345, 5345] +1348 1 twodeg Thierry plc2 [3346, 4346, 5346] +1349 1 twodeh Thierry plc2 [3347, 4347, 5347] +1350 1 twodei Thierry plc2 [3348, 4348, 5348] +1351 1 twodej Thierry plc2 [3349, 4349, 5349] +1352 1 twodfa Thierry plc2 [3350, 4350, 5350] +1353 1 twodfb Thierry plc2 [3351, 4351, 5351] +1354 1 twodfc Thierry plc2 [3352, 4352, 5352] +1355 1 twodfd Thierry plc2 [3353, 4353, 5353] +1356 1 twodfe Thierry plc2 [3354, 4354, 5354] +1357 1 twodff Thierry plc2 [3355, 4355, 5355] +1358 1 twodfg Thierry plc2 [3356, 4356, 5356] +1359 1 twodfh Thierry plc2 [3357, 4357, 5357] +1360 1 twodfi Thierry plc2 [3358, 4358, 5358] +1361 1 twodfj Thierry plc2 [3359, 4359, 5359] +1362 1 twodga Thierry plc2 [3360, 4360, 5360] +1363 1 twodgb Thierry plc2 [3361, 4361, 5361] +1364 1 twodgc Thierry plc2 [3362, 4362, 5362] +1365 1 twodgd Thierry plc2 [3363, 4363, 5363] +1366 1 twodge Thierry plc2 [3364, 4364, 5364] +1367 1 twodgf Thierry plc2 [3365, 4365, 5365] +1368 1 twodgg Thierry plc2 [3366, 4366, 5366] +1369 1 twodgh Thierry plc2 [3367, 4367, 5367] +1370 1 twodgi Thierry plc2 [3368, 4368, 5368] +1371 1 twodgj Thierry plc2 [3369, 4369, 5369] +1372 1 twodha Thierry plc2 [3370, 4370, 5370] +1373 1 twodhb Thierry plc2 [3371, 4371, 5371] +1374 1 twodhc Thierry plc2 [3372, 4372, 5372] +1375 1 twodhd Thierry plc2 [3373, 4373, 5373] +1376 1 twodhe Thierry plc2 [3374, 4374, 5374] +1377 1 twodhf Thierry plc2 [3375, 4375, 5375] +1378 1 twodhg Thierry plc2 [3376, 4376, 5376] +1379 1 twodhh Thierry plc2 [3377, 4377, 5377] +1380 1 twodhi Thierry plc2 [3378, 4378, 5378] +1381 1 twodhj Thierry plc2 [3379, 4379, 5379] +1382 1 twodia Thierry plc2 [3380, 4380, 5380] +1383 1 twodib Thierry plc2 [3381, 4381, 5381] +1384 1 twodic Thierry plc2 [3382, 4382, 5382] +1385 1 twodid Thierry plc2 [3383, 4383, 5383] +1386 1 twodie Thierry plc2 [3384, 4384, 5384] +1387 1 twodif Thierry plc2 [3385, 4385, 5385] +1388 1 twodig Thierry plc2 [3386, 4386, 5386] +1389 1 twodih Thierry plc2 [3387, 4387, 5387] +1390 1 twodii Thierry plc2 [3388, 4388, 5388] +1391 1 twodij Thierry plc2 [3389, 4389, 5389] +1392 1 twodja Thierry plc2 [3390, 4390, 5390] +1393 1 twodjb Thierry plc2 [3391, 4391, 5391] +1394 1 twodjc Thierry plc2 [3392, 4392, 5392] +1395 1 twodjd Thierry plc2 [3393, 4393, 5393] +1396 1 twodje Thierry plc2 [3394, 4394, 5394] +1397 1 twodjf Thierry plc2 [3395, 4395, 5395] +1398 1 twodjg Thierry plc2 [3396, 4396, 5396] +1399 1 twodjh Thierry plc2 [3397, 4397, 5397] +1400 1 twodji Thierry plc2 [3398, 4398, 5398] +1401 1 twodjj Thierry plc2 [3399, 4399, 5399] +1402 1 twoeaa Thierry plc2 [3400, 4400, 5400] +1403 1 twoeab Thierry plc2 [3401, 4401, 5401] +1404 1 twoeac Thierry plc2 [3402, 4402, 5402] +1405 1 twoead Thierry plc2 [3403, 4403, 5403] +1406 1 twoeae Thierry plc2 [3404, 4404, 5404] +1407 1 twoeaf Thierry plc2 [3405, 4405, 5405] +1408 1 twoeag Thierry plc2 [3406, 4406, 5406] +1409 1 twoeah Thierry plc2 [3407, 4407, 5407] +1410 1 twoeai Thierry plc2 [3408, 4408, 5408] +1411 1 twoeaj Thierry plc2 [3409, 4409, 5409] +1412 1 twoeba Thierry plc2 [3410, 4410, 5410] +1413 1 twoebb Thierry plc2 [3411, 4411, 5411] +1414 1 twoebc Thierry plc2 [3412, 4412, 5412] +1415 1 twoebd Thierry plc2 [3413, 4413, 5413] +1416 1 twoebe Thierry plc2 [3414, 4414, 5414] +1417 1 twoebf Thierry plc2 [3415, 4415, 5415] +1418 1 twoebg Thierry plc2 [3416, 4416, 5416] +1419 1 twoebh Thierry plc2 [3417, 4417, 5417] +1420 1 twoebi Thierry plc2 [3418, 4418, 5418] +1421 1 twoebj Thierry plc2 [3419, 4419, 5419] +1422 1 twoeca Thierry plc2 [3420, 4420, 5420] +1423 1 twoecb Thierry plc2 [3421, 4421, 5421] +1424 1 twoecc Thierry plc2 [3422, 4422, 5422] +1425 1 twoecd Thierry plc2 [3423, 4423, 5423] +1426 1 twoece Thierry plc2 [3424, 4424, 5424] +1427 1 twoecf Thierry plc2 [3425, 4425, 5425] +1428 1 twoecg Thierry plc2 [3426, 4426, 5426] +1429 1 twoech Thierry plc2 [3427, 4427, 5427] +1430 1 twoeci Thierry plc2 [3428, 4428, 5428] +1431 1 twoecj Thierry plc2 [3429, 4429, 5429] +1432 1 twoeda Thierry plc2 [3430, 4430, 5430] +1433 1 twoedb Thierry plc2 [3431, 4431, 5431] +1434 1 twoedc Thierry plc2 [3432, 4432, 5432] +1435 1 twoedd Thierry plc2 [3433, 4433, 5433] +1436 1 twoede Thierry plc2 [3434, 4434, 5434] +1437 1 twoedf Thierry plc2 [3435, 4435, 5435] +1438 1 twoedg Thierry plc2 [3436, 4436, 5436] +1439 1 twoedh Thierry plc2 [3437, 4437, 5437] +1440 1 twoedi Thierry plc2 [3438, 4438, 5438] +1441 1 twoedj Thierry plc2 [3439, 4439, 5439] +1442 1 twoeea Thierry plc2 [3440, 4440, 5440] +1443 1 twoeeb Thierry plc2 [3441, 4441, 5441] +1444 1 twoeec Thierry plc2 [3442, 4442, 5442] +1445 1 twoeed Thierry plc2 [3443, 4443, 5443] +1446 1 twoeee Thierry plc2 [3444, 4444, 5444] +1447 1 twoeef Thierry plc2 [3445, 4445, 5445] +1448 1 twoeeg Thierry plc2 [3446, 4446, 5446] +1449 1 twoeeh Thierry plc2 [3447, 4447, 5447] +1450 1 twoeei Thierry plc2 [3448, 4448, 5448] +1451 1 twoeej Thierry plc2 [3449, 4449, 5449] +1452 1 twoefa Thierry plc2 [3450, 4450, 5450] +1453 1 twoefb Thierry plc2 [3451, 4451, 5451] +1454 1 twoefc Thierry plc2 [3452, 4452, 5452] +1455 1 twoefd Thierry plc2 [3453, 4453, 5453] +1456 1 twoefe Thierry plc2 [3454, 4454, 5454] +1457 1 twoeff Thierry plc2 [3455, 4455, 5455] +1458 1 twoefg Thierry plc2 [3456, 4456, 5456] +1459 1 twoefh Thierry plc2 [3457, 4457, 5457] +1460 1 twoefi Thierry plc2 [3458, 4458, 5458] +1461 1 twoefj Thierry plc2 [3459, 4459, 5459] +1462 1 twoega Thierry plc2 [3460, 4460, 5460] +1463 1 twoegb Thierry plc2 [3461, 4461, 5461] +1464 1 twoegc Thierry plc2 [3462, 4462, 5462] +1465 1 twoegd Thierry plc2 [3463, 4463, 5463] +1466 1 twoege Thierry plc2 [3464, 4464, 5464] +1467 1 twoegf Thierry plc2 [3465, 4465, 5465] +1468 1 twoegg Thierry plc2 [3466, 4466, 5466] +1469 1 twoegh Thierry plc2 [3467, 4467, 5467] +1470 1 twoegi Thierry plc2 [3468, 4468, 5468] +1471 1 twoegj Thierry plc2 [3469, 4469, 5469] +1472 1 twoeha Thierry plc2 [3470, 4470, 5470] +1473 1 twoehb Thierry plc2 [3471, 4471, 5471] +1474 1 twoehc Thierry plc2 [3472, 4472, 5472] +1475 1 twoehd Thierry plc2 [3473, 4473, 5473] +1476 1 twoehe Thierry plc2 [3474, 4474, 5474] +1477 1 twoehf Thierry plc2 [3475, 4475, 5475] +1478 1 twoehg Thierry plc2 [3476, 4476, 5476] +1479 1 twoehh Thierry plc2 [3477, 4477, 5477] +1480 1 twoehi Thierry plc2 [3478, 4478, 5478] +1481 1 twoehj Thierry plc2 [3479, 4479, 5479] +1482 1 twoeia Thierry plc2 [3480, 4480, 5480] +1483 1 twoeib Thierry plc2 [3481, 4481, 5481] +1484 1 twoeic Thierry plc2 [3482, 4482, 5482] +1485 1 twoeid Thierry plc2 [3483, 4483, 5483] +1486 1 twoeie Thierry plc2 [3484, 4484, 5484] +1487 1 twoeif Thierry plc2 [3485, 4485, 5485] +1488 1 twoeig Thierry plc2 [3486, 4486, 5486] +1489 1 twoeih Thierry plc2 [3487, 4487, 5487] +1490 1 twoeii Thierry plc2 [3488, 4488, 5488] +1491 1 twoeij Thierry plc2 [3489, 4489, 5489] +1492 1 twoeja Thierry plc2 [3490, 4490, 5490] +1493 1 twoejb Thierry plc2 [3491, 4491, 5491] +1494 1 twoejc Thierry plc2 [3492, 4492, 5492] +1495 1 twoejd Thierry plc2 [3493, 4493, 5493] +1496 1 twoeje Thierry plc2 [3494, 4494, 5494] +1497 1 twoejf Thierry plc2 [3495, 4495, 5495] +1498 1 twoejg Thierry plc2 [3496, 4496, 5496] +1499 1 twoejh Thierry plc2 [3497, 4497, 5497] +1500 1 twoeji Thierry plc2 [3498, 4498, 5498] +1501 1 twoejj Thierry plc2 [3499, 4499, 5499] +1502 1 twofaa Thierry plc2 [3500, 4500, 5500] +1503 1 twofab Thierry plc2 [3501, 4501, 5501] +1504 1 twofac Thierry plc2 [3502, 4502, 5502] +1505 1 twofad Thierry plc2 [3503, 4503, 5503] +1506 1 twofae Thierry plc2 [3504, 4504, 5504] +1507 1 twofaf Thierry plc2 [3505, 4505, 5505] +1508 1 twofag Thierry plc2 [3506, 4506, 5506] +1509 1 twofah Thierry plc2 [3507, 4507, 5507] +1510 1 twofai Thierry plc2 [3508, 4508, 5508] +1511 1 twofaj Thierry plc2 [3509, 4509, 5509] +1512 1 twofba Thierry plc2 [3510, 4510, 5510] +1513 1 twofbb Thierry plc2 [3511, 4511, 5511] +1514 1 twofbc Thierry plc2 [3512, 4512, 5512] +1515 1 twofbd Thierry plc2 [3513, 4513, 5513] +1516 1 twofbe Thierry plc2 [3514, 4514, 5514] +1517 1 twofbf Thierry plc2 [3515, 4515, 5515] +1518 1 twofbg Thierry plc2 [3516, 4516, 5516] +1519 1 twofbh Thierry plc2 [3517, 4517, 5517] +1520 1 twofbi Thierry plc2 [3518, 4518, 5518] +1521 1 twofbj Thierry plc2 [3519, 4519, 5519] +1522 1 twofca Thierry plc2 [3520, 4520, 5520] +1523 1 twofcb Thierry plc2 [3521, 4521, 5521] +1524 1 twofcc Thierry plc2 [3522, 4522, 5522] +1525 1 twofcd Thierry plc2 [3523, 4523, 5523] +1526 1 twofce Thierry plc2 [3524, 4524, 5524] +1527 1 twofcf Thierry plc2 [3525, 4525, 5525] +1528 1 twofcg Thierry plc2 [3526, 4526, 5526] +1529 1 twofch Thierry plc2 [3527, 4527, 5527] +1530 1 twofci Thierry plc2 [3528, 4528, 5528] +1531 1 twofcj Thierry plc2 [3529, 4529, 5529] +1532 1 twofda Thierry plc2 [3530, 4530, 5530] +1533 1 twofdb Thierry plc2 [3531, 4531, 5531] +1534 1 twofdc Thierry plc2 [3532, 4532, 5532] +1535 1 twofdd Thierry plc2 [3533, 4533, 5533] +1536 1 twofde Thierry plc2 [3534, 4534, 5534] +1537 1 twofdf Thierry plc2 [3535, 4535, 5535] +1538 1 twofdg Thierry plc2 [3536, 4536, 5536] +1539 1 twofdh Thierry plc2 [3537, 4537, 5537] +1540 1 twofdi Thierry plc2 [3538, 4538, 5538] +1541 1 twofdj Thierry plc2 [3539, 4539, 5539] +1542 1 twofea Thierry plc2 [3540, 4540, 5540] +1543 1 twofeb Thierry plc2 [3541, 4541, 5541] +1544 1 twofec Thierry plc2 [3542, 4542, 5542] +1545 1 twofed Thierry plc2 [3543, 4543, 5543] +1546 1 twofee Thierry plc2 [3544, 4544, 5544] +1547 1 twofef Thierry plc2 [3545, 4545, 5545] +1548 1 twofeg Thierry plc2 [3546, 4546, 5546] +1549 1 twofeh Thierry plc2 [3547, 4547, 5547] +1550 1 twofei Thierry plc2 [3548, 4548, 5548] +1551 1 twofej Thierry plc2 [3549, 4549, 5549] +1552 1 twoffa Thierry plc2 [3550, 4550, 5550] +1553 1 twoffb Thierry plc2 [3551, 4551, 5551] +1554 1 twoffc Thierry plc2 [3552, 4552, 5552] +1555 1 twoffd Thierry plc2 [3553, 4553, 5553] +1556 1 twoffe Thierry plc2 [3554, 4554, 5554] +1557 1 twofff Thierry plc2 [3555, 4555, 5555] +1558 1 twoffg Thierry plc2 [3556, 4556, 5556] +1559 1 twoffh Thierry plc2 [3557, 4557, 5557] +1560 1 twoffi Thierry plc2 [3558, 4558, 5558] +1561 1 twoffj Thierry plc2 [3559, 4559, 5559] +1562 1 twofga Thierry plc2 [3560, 4560, 5560] +1563 1 twofgb Thierry plc2 [3561, 4561, 5561] +1564 1 twofgc Thierry plc2 [3562, 4562, 5562] +1565 1 twofgd Thierry plc2 [3563, 4563, 5563] +1566 1 twofge Thierry plc2 [3564, 4564, 5564] +1567 1 twofgf Thierry plc2 [3565, 4565, 5565] +1568 1 twofgg Thierry plc2 [3566, 4566, 5566] +1569 1 twofgh Thierry plc2 [3567, 4567, 5567] +1570 1 twofgi Thierry plc2 [3568, 4568, 5568] +1571 1 twofgj Thierry plc2 [3569, 4569, 5569] +1572 1 twofha Thierry plc2 [3570, 4570, 5570] +1573 1 twofhb Thierry plc2 [3571, 4571, 5571] +1574 1 twofhc Thierry plc2 [3572, 4572, 5572] +1575 1 twofhd Thierry plc2 [3573, 4573, 5573] +1576 1 twofhe Thierry plc2 [3574, 4574, 5574] +1577 1 twofhf Thierry plc2 [3575, 4575, 5575] +1578 1 twofhg Thierry plc2 [3576, 4576, 5576] +1579 1 twofhh Thierry plc2 [3577, 4577, 5577] +1580 1 twofhi Thierry plc2 [3578, 4578, 5578] +1581 1 twofhj Thierry plc2 [3579, 4579, 5579] +1582 1 twofia Thierry plc2 [3580, 4580, 5580] +1583 1 twofib Thierry plc2 [3581, 4581, 5581] +1584 1 twofic Thierry plc2 [3582, 4582, 5582] +1585 1 twofid Thierry plc2 [3583, 4583, 5583] +1586 1 twofie Thierry plc2 [3584, 4584, 5584] +1587 1 twofif Thierry plc2 [3585, 4585, 5585] +1588 1 twofig Thierry plc2 [3586, 4586, 5586] +1589 1 twofih Thierry plc2 [3587, 4587, 5587] +1590 1 twofii Thierry plc2 [3588, 4588, 5588] +1591 1 twofij Thierry plc2 [3589, 4589, 5589] +1592 1 twofja Thierry plc2 [3590, 4590, 5590] +1593 1 twofjb Thierry plc2 [3591, 4591, 5591] +1594 1 twofjc Thierry plc2 [3592, 4592, 5592] +1595 1 twofjd Thierry plc2 [3593, 4593, 5593] +1596 1 twofje Thierry plc2 [3594, 4594, 5594] +1597 1 twofjf Thierry plc2 [3595, 4595, 5595] +1598 1 twofjg Thierry plc2 [3596, 4596, 5596] +1599 1 twofjh Thierry plc2 [3597, 4597, 5597] +1600 1 twofji Thierry plc2 [3598, 4598, 5598] +1601 1 twofjj Thierry plc2 [3599, 4599, 5599] +1602 1 twogaa Thierry plc2 [3600, 4600, 5600] +1603 1 twogab Thierry plc2 [3601, 4601, 5601] +1604 1 twogac Thierry plc2 [3602, 4602, 5602] +1605 1 twogad Thierry plc2 [3603, 4603, 5603] +1606 1 twogae Thierry plc2 [3604, 4604, 5604] +1607 1 twogaf Thierry plc2 [3605, 4605, 5605] +1608 1 twogag Thierry plc2 [3606, 4606, 5606] +1609 1 twogah Thierry plc2 [3607, 4607, 5607] +1610 1 twogai Thierry plc2 [3608, 4608, 5608] +1611 1 twogaj Thierry plc2 [3609, 4609, 5609] +1612 1 twogba Thierry plc2 [3610, 4610, 5610] +1613 1 twogbb Thierry plc2 [3611, 4611, 5611] +1614 1 twogbc Thierry plc2 [3612, 4612, 5612] +1615 1 twogbd Thierry plc2 [3613, 4613, 5613] +1616 1 twogbe Thierry plc2 [3614, 4614, 5614] +1617 1 twogbf Thierry plc2 [3615, 4615, 5615] +1618 1 twogbg Thierry plc2 [3616, 4616, 5616] +1619 1 twogbh Thierry plc2 [3617, 4617, 5617] +1620 1 twogbi Thierry plc2 [3618, 4618, 5618] +1621 1 twogbj Thierry plc2 [3619, 4619, 5619] +1622 1 twogca Thierry plc2 [3620, 4620, 5620] +1623 1 twogcb Thierry plc2 [3621, 4621, 5621] +1624 1 twogcc Thierry plc2 [3622, 4622, 5622] +1625 1 twogcd Thierry plc2 [3623, 4623, 5623] +1626 1 twogce Thierry plc2 [3624, 4624, 5624] +1627 1 twogcf Thierry plc2 [3625, 4625, 5625] +1628 1 twogcg Thierry plc2 [3626, 4626, 5626] +1629 1 twogch Thierry plc2 [3627, 4627, 5627] +1630 1 twogci Thierry plc2 [3628, 4628, 5628] +1631 1 twogcj Thierry plc2 [3629, 4629, 5629] +1632 1 twogda Thierry plc2 [3630, 4630, 5630] +1633 1 twogdb Thierry plc2 [3631, 4631, 5631] +1634 1 twogdc Thierry plc2 [3632, 4632, 5632] +1635 1 twogdd Thierry plc2 [3633, 4633, 5633] +1636 1 twogde Thierry plc2 [3634, 4634, 5634] +1637 1 twogdf Thierry plc2 [3635, 4635, 5635] +1638 1 twogdg Thierry plc2 [3636, 4636, 5636] +1639 1 twogdh Thierry plc2 [3637, 4637, 5637] +1640 1 twogdi Thierry plc2 [3638, 4638, 5638] +1641 1 twogdj Thierry plc2 [3639, 4639, 5639] +1642 1 twogea Thierry plc2 [3640, 4640, 5640] +1643 1 twogeb Thierry plc2 [3641, 4641, 5641] +1644 1 twogec Thierry plc2 [3642, 4642, 5642] +1645 1 twoged Thierry plc2 [3643, 4643, 5643] +1646 1 twogee Thierry plc2 [3644, 4644, 5644] +1647 1 twogef Thierry plc2 [3645, 4645, 5645] +1648 1 twogeg Thierry plc2 [3646, 4646, 5646] +1649 1 twogeh Thierry plc2 [3647, 4647, 5647] +1650 1 twogei Thierry plc2 [3648, 4648, 5648] +1651 1 twogej Thierry plc2 [3649, 4649, 5649] +1652 1 twogfa Thierry plc2 [3650, 4650, 5650] +1653 1 twogfb Thierry plc2 [3651, 4651, 5651] +1654 1 twogfc Thierry plc2 [3652, 4652, 5652] +1655 1 twogfd Thierry plc2 [3653, 4653, 5653] +1656 1 twogfe Thierry plc2 [3654, 4654, 5654] +1657 1 twogff Thierry plc2 [3655, 4655, 5655] +1658 1 twogfg Thierry plc2 [3656, 4656, 5656] +1659 1 twogfh Thierry plc2 [3657, 4657, 5657] +1660 1 twogfi Thierry plc2 [3658, 4658, 5658] +1661 1 twogfj Thierry plc2 [3659, 4659, 5659] +1662 1 twogga Thierry plc2 [3660, 4660, 5660] +1663 1 twoggb Thierry plc2 [3661, 4661, 5661] +1664 1 twoggc Thierry plc2 [3662, 4662, 5662] +1665 1 twoggd Thierry plc2 [3663, 4663, 5663] +1666 1 twogge Thierry plc2 [3664, 4664, 5664] +1667 1 twoggf Thierry plc2 [3665, 4665, 5665] +1668 1 twoggg Thierry plc2 [3666, 4666, 5666] +1669 1 twoggh Thierry plc2 [3667, 4667, 5667] +1670 1 twoggi Thierry plc2 [3668, 4668, 5668] +1671 1 twoggj Thierry plc2 [3669, 4669, 5669] +1672 1 twogha Thierry plc2 [3670, 4670, 5670] +1673 1 twoghb Thierry plc2 [3671, 4671, 5671] +1674 1 twoghc Thierry plc2 [3672, 4672, 5672] +1675 1 twoghd Thierry plc2 [3673, 4673, 5673] +1676 1 twoghe Thierry plc2 [3674, 4674, 5674] +1677 1 twoghf Thierry plc2 [3675, 4675, 5675] +1678 1 twoghg Thierry plc2 [3676, 4676, 5676] +1679 1 twoghh Thierry plc2 [3677, 4677, 5677] +1680 1 twoghi Thierry plc2 [3678, 4678, 5678] +1681 1 twoghj Thierry plc2 [3679, 4679, 5679] +1682 1 twogia Thierry plc2 [3680, 4680, 5680] +1683 1 twogib Thierry plc2 [3681, 4681, 5681] +1684 1 twogic Thierry plc2 [3682, 4682, 5682] +1685 1 twogid Thierry plc2 [3683, 4683, 5683] +1686 1 twogie Thierry plc2 [3684, 4684, 5684] +1687 1 twogif Thierry plc2 [3685, 4685, 5685] +1688 1 twogig Thierry plc2 [3686, 4686, 5686] +1689 1 twogih Thierry plc2 [3687, 4687, 5687] +1690 1 twogii Thierry plc2 [3688, 4688, 5688] +1691 1 twogij Thierry plc2 [3689, 4689, 5689] +1692 1 twogja Thierry plc2 [3690, 4690, 5690] +1693 1 twogjb Thierry plc2 [3691, 4691, 5691] +1694 1 twogjc Thierry plc2 [3692, 4692, 5692] +1695 1 twogjd Thierry plc2 [3693, 4693, 5693] +1696 1 twogje Thierry plc2 [3694, 4694, 5694] +1697 1 twogjf Thierry plc2 [3695, 4695, 5695] +1698 1 twogjg Thierry plc2 [3696, 4696, 5696] +1699 1 twogjh Thierry plc2 [3697, 4697, 5697] +1700 1 twogji Thierry plc2 [3698, 4698, 5698] +1701 1 twogjj Thierry plc2 [3699, 4699, 5699] +1702 1 twohaa Thierry plc2 [3700, 4700, 5700] +1703 1 twohab Thierry plc2 [3701, 4701, 5701] +1704 1 twohac Thierry plc2 [3702, 4702, 5702] +1705 1 twohad Thierry plc2 [3703, 4703, 5703] +1706 1 twohae Thierry plc2 [3704, 4704, 5704] +1707 1 twohaf Thierry plc2 [3705, 4705, 5705] +1708 1 twohag Thierry plc2 [3706, 4706, 5706] +1709 1 twohah Thierry plc2 [3707, 4707, 5707] +1710 1 twohai Thierry plc2 [3708, 4708, 5708] +1711 1 twohaj Thierry plc2 [3709, 4709, 5709] +1712 1 twohba Thierry plc2 [3710, 4710, 5710] +1713 1 twohbb Thierry plc2 [3711, 4711, 5711] +1714 1 twohbc Thierry plc2 [3712, 4712, 5712] +1715 1 twohbd Thierry plc2 [3713, 4713, 5713] +1716 1 twohbe Thierry plc2 [3714, 4714, 5714] +1717 1 twohbf Thierry plc2 [3715, 4715, 5715] +1718 1 twohbg Thierry plc2 [3716, 4716, 5716] +1719 1 twohbh Thierry plc2 [3717, 4717, 5717] +1720 1 twohbi Thierry plc2 [3718, 4718, 5718] +1721 1 twohbj Thierry plc2 [3719, 4719, 5719] +1722 1 twohca Thierry plc2 [3720, 4720, 5720] +1723 1 twohcb Thierry plc2 [3721, 4721, 5721] +1724 1 twohcc Thierry plc2 [3722, 4722, 5722] +1725 1 twohcd Thierry plc2 [3723, 4723, 5723] +1726 1 twohce Thierry plc2 [3724, 4724, 5724] +1727 1 twohcf Thierry plc2 [3725, 4725, 5725] +1728 1 twohcg Thierry plc2 [3726, 4726, 5726] +1729 1 twohch Thierry plc2 [3727, 4727, 5727] +1730 1 twohci Thierry plc2 [3728, 4728, 5728] +1731 1 twohcj Thierry plc2 [3729, 4729, 5729] +1732 1 twohda Thierry plc2 [3730, 4730, 5730] +1733 1 twohdb Thierry plc2 [3731, 4731, 5731] +1734 1 twohdc Thierry plc2 [3732, 4732, 5732] +1735 1 twohdd Thierry plc2 [3733, 4733, 5733] +1736 1 twohde Thierry plc2 [3734, 4734, 5734] +1737 1 twohdf Thierry plc2 [3735, 4735, 5735] +1738 1 twohdg Thierry plc2 [3736, 4736, 5736] +1739 1 twohdh Thierry plc2 [3737, 4737, 5737] +1740 1 twohdi Thierry plc2 [3738, 4738, 5738] +1741 1 twohdj Thierry plc2 [3739, 4739, 5739] +1742 1 twohea Thierry plc2 [3740, 4740, 5740] +1743 1 twoheb Thierry plc2 [3741, 4741, 5741] +1744 1 twohec Thierry plc2 [3742, 4742, 5742] +1745 1 twohed Thierry plc2 [3743, 4743, 5743] +1746 1 twohee Thierry plc2 [3744, 4744, 5744] +1747 1 twohef Thierry plc2 [3745, 4745, 5745] +1748 1 twoheg Thierry plc2 [3746, 4746, 5746] +1749 1 twoheh Thierry plc2 [3747, 4747, 5747] +1750 1 twohei Thierry plc2 [3748, 4748, 5748] +1751 1 twohej Thierry plc2 [3749, 4749, 5749] +1752 1 twohfa Thierry plc2 [3750, 4750, 5750] +1753 1 twohfb Thierry plc2 [3751, 4751, 5751] +1754 1 twohfc Thierry plc2 [3752, 4752, 5752] +1755 1 twohfd Thierry plc2 [3753, 4753, 5753] +1756 1 twohfe Thierry plc2 [3754, 4754, 5754] +1757 1 twohff Thierry plc2 [3755, 4755, 5755] +1758 1 twohfg Thierry plc2 [3756, 4756, 5756] +1759 1 twohfh Thierry plc2 [3757, 4757, 5757] +1760 1 twohfi Thierry plc2 [3758, 4758, 5758] +1761 1 twohfj Thierry plc2 [3759, 4759, 5759] +1762 1 twohga Thierry plc2 [3760, 4760, 5760] +1763 1 twohgb Thierry plc2 [3761, 4761, 5761] +1764 1 twohgc Thierry plc2 [3762, 4762, 5762] +1765 1 twohgd Thierry plc2 [3763, 4763, 5763] +1766 1 twohge Thierry plc2 [3764, 4764, 5764] +1767 1 twohgf Thierry plc2 [3765, 4765, 5765] +1768 1 twohgg Thierry plc2 [3766, 4766, 5766] +1769 1 twohgh Thierry plc2 [3767, 4767, 5767] +1770 1 twohgi Thierry plc2 [3768, 4768, 5768] +1771 1 twohgj Thierry plc2 [3769, 4769, 5769] +1772 1 twohha Thierry plc2 [3770, 4770, 5770] +1773 1 twohhb Thierry plc2 [3771, 4771, 5771] +1774 1 twohhc Thierry plc2 [3772, 4772, 5772] +1775 1 twohhd Thierry plc2 [3773, 4773, 5773] +1776 1 twohhe Thierry plc2 [3774, 4774, 5774] +1777 1 twohhf Thierry plc2 [3775, 4775, 5775] +1778 1 twohhg Thierry plc2 [3776, 4776, 5776] +1779 1 twohhh Thierry plc2 [3777, 4777, 5777] +1780 1 twohhi Thierry plc2 [3778, 4778, 5778] +1781 1 twohhj Thierry plc2 [3779, 4779, 5779] +1782 1 twohia Thierry plc2 [3780, 4780, 5780] +1783 1 twohib Thierry plc2 [3781, 4781, 5781] +1784 1 twohic Thierry plc2 [3782, 4782, 5782] +1785 1 twohid Thierry plc2 [3783, 4783, 5783] +1786 1 twohie Thierry plc2 [3784, 4784, 5784] +1787 1 twohif Thierry plc2 [3785, 4785, 5785] +1788 1 twohig Thierry plc2 [3786, 4786, 5786] +1789 1 twohih Thierry plc2 [3787, 4787, 5787] +1790 1 twohii Thierry plc2 [3788, 4788, 5788] +1791 1 twohij Thierry plc2 [3789, 4789, 5789] +1792 1 twohja Thierry plc2 [3790, 4790, 5790] +1793 1 twohjb Thierry plc2 [3791, 4791, 5791] +1794 1 twohjc Thierry plc2 [3792, 4792, 5792] +1795 1 twohjd Thierry plc2 [3793, 4793, 5793] +1796 1 twohje Thierry plc2 [3794, 4794, 5794] +1797 1 twohjf Thierry plc2 [3795, 4795, 5795] +1798 1 twohjg Thierry plc2 [3796, 4796, 5796] +1799 1 twohjh Thierry plc2 [3797, 4797, 5797] +1800 1 twohji Thierry plc2 [3798, 4798, 5798] +1801 1 twohjj Thierry plc2 [3799, 4799, 5799] +1802 1 twoiaa Thierry plc2 [3800, 4800, 5800] +1803 1 twoiab Thierry plc2 [3801, 4801, 5801] +1804 1 twoiac Thierry plc2 [3802, 4802, 5802] +1805 1 twoiad Thierry plc2 [3803, 4803, 5803] +1806 1 twoiae Thierry plc2 [3804, 4804, 5804] +1807 1 twoiaf Thierry plc2 [3805, 4805, 5805] +1808 1 twoiag Thierry plc2 [3806, 4806, 5806] +1809 1 twoiah Thierry plc2 [3807, 4807, 5807] +1810 1 twoiai Thierry plc2 [3808, 4808, 5808] +1811 1 twoiaj Thierry plc2 [3809, 4809, 5809] +1812 1 twoiba Thierry plc2 [3810, 4810, 5810] +1813 1 twoibb Thierry plc2 [3811, 4811, 5811] +1814 1 twoibc Thierry plc2 [3812, 4812, 5812] +1815 1 twoibd Thierry plc2 [3813, 4813, 5813] +1816 1 twoibe Thierry plc2 [3814, 4814, 5814] +1817 1 twoibf Thierry plc2 [3815, 4815, 5815] +1818 1 twoibg Thierry plc2 [3816, 4816, 5816] +1819 1 twoibh Thierry plc2 [3817, 4817, 5817] +1820 1 twoibi Thierry plc2 [3818, 4818, 5818] +1821 1 twoibj Thierry plc2 [3819, 4819, 5819] +1822 1 twoica Thierry plc2 [3820, 4820, 5820] +1823 1 twoicb Thierry plc2 [3821, 4821, 5821] +1824 1 twoicc Thierry plc2 [3822, 4822, 5822] +1825 1 twoicd Thierry plc2 [3823, 4823, 5823] +1826 1 twoice Thierry plc2 [3824, 4824, 5824] +1827 1 twoicf Thierry plc2 [3825, 4825, 5825] +1828 1 twoicg Thierry plc2 [3826, 4826, 5826] +1829 1 twoich Thierry plc2 [3827, 4827, 5827] +1830 1 twoici Thierry plc2 [3828, 4828, 5828] +1831 1 twoicj Thierry plc2 [3829, 4829, 5829] +1832 1 twoida Thierry plc2 [3830, 4830, 5830] +1833 1 twoidb Thierry plc2 [3831, 4831, 5831] +1834 1 twoidc Thierry plc2 [3832, 4832, 5832] +1835 1 twoidd Thierry plc2 [3833, 4833, 5833] +1836 1 twoide Thierry plc2 [3834, 4834, 5834] +1837 1 twoidf Thierry plc2 [3835, 4835, 5835] +1838 1 twoidg Thierry plc2 [3836, 4836, 5836] +1839 1 twoidh Thierry plc2 [3837, 4837, 5837] +1840 1 twoidi Thierry plc2 [3838, 4838, 5838] +1841 1 twoidj Thierry plc2 [3839, 4839, 5839] +1842 1 twoiea Thierry plc2 [3840, 4840, 5840] +1843 1 twoieb Thierry plc2 [3841, 4841, 5841] +1844 1 twoiec Thierry plc2 [3842, 4842, 5842] +1845 1 twoied Thierry plc2 [3843, 4843, 5843] +1846 1 twoiee Thierry plc2 [3844, 4844, 5844] +1847 1 twoief Thierry plc2 [3845, 4845, 5845] +1848 1 twoieg Thierry plc2 [3846, 4846, 5846] +1849 1 twoieh Thierry plc2 [3847, 4847, 5847] +1850 1 twoiei Thierry plc2 [3848, 4848, 5848] +1851 1 twoiej Thierry plc2 [3849, 4849, 5849] +1852 1 twoifa Thierry plc2 [3850, 4850, 5850] +1853 1 twoifb Thierry plc2 [3851, 4851, 5851] +1854 1 twoifc Thierry plc2 [3852, 4852, 5852] +1855 1 twoifd Thierry plc2 [3853, 4853, 5853] +1856 1 twoife Thierry plc2 [3854, 4854, 5854] +1857 1 twoiff Thierry plc2 [3855, 4855, 5855] +1858 1 twoifg Thierry plc2 [3856, 4856, 5856] +1859 1 twoifh Thierry plc2 [3857, 4857, 5857] +1860 1 twoifi Thierry plc2 [3858, 4858, 5858] +1861 1 twoifj Thierry plc2 [3859, 4859, 5859] +1862 1 twoiga Thierry plc2 [3860, 4860, 5860] +1863 1 twoigb Thierry plc2 [3861, 4861, 5861] +1864 1 twoigc Thierry plc2 [3862, 4862, 5862] +1865 1 twoigd Thierry plc2 [3863, 4863, 5863] +1866 1 twoige Thierry plc2 [3864, 4864, 5864] +1867 1 twoigf Thierry plc2 [3865, 4865, 5865] +1868 1 twoigg Thierry plc2 [3866, 4866, 5866] +1869 1 twoigh Thierry plc2 [3867, 4867, 5867] +1870 1 twoigi Thierry plc2 [3868, 4868, 5868] +1871 1 twoigj Thierry plc2 [3869, 4869, 5869] +1872 1 twoiha Thierry plc2 [3870, 4870, 5870] +1873 1 twoihb Thierry plc2 [3871, 4871, 5871] +1874 1 twoihc Thierry plc2 [3872, 4872, 5872] +1875 1 twoihd Thierry plc2 [3873, 4873, 5873] +1876 1 twoihe Thierry plc2 [3874, 4874, 5874] +1877 1 twoihf Thierry plc2 [3875, 4875, 5875] +1878 1 twoihg Thierry plc2 [3876, 4876, 5876] +1879 1 twoihh Thierry plc2 [3877, 4877, 5877] +1880 1 twoihi Thierry plc2 [3878, 4878, 5878] +1881 1 twoihj Thierry plc2 [3879, 4879, 5879] +1882 1 twoiia Thierry plc2 [3880, 4880, 5880] +1883 1 twoiib Thierry plc2 [3881, 4881, 5881] +1884 1 twoiic Thierry plc2 [3882, 4882, 5882] +1885 1 twoiid Thierry plc2 [3883, 4883, 5883] +1886 1 twoiie Thierry plc2 [3884, 4884, 5884] +1887 1 twoiif Thierry plc2 [3885, 4885, 5885] +1888 1 twoiig Thierry plc2 [3886, 4886, 5886] +1889 1 twoiih Thierry plc2 [3887, 4887, 5887] +1890 1 twoiii Thierry plc2 [3888, 4888, 5888] +1891 1 twoiij Thierry plc2 [3889, 4889, 5889] +1892 1 twoija Thierry plc2 [3890, 4890, 5890] +1893 1 twoijb Thierry plc2 [3891, 4891, 5891] +1894 1 twoijc Thierry plc2 [3892, 4892, 5892] +1895 1 twoijd Thierry plc2 [3893, 4893, 5893] +1896 1 twoije Thierry plc2 [3894, 4894, 5894] +1897 1 twoijf Thierry plc2 [3895, 4895, 5895] +1898 1 twoijg Thierry plc2 [3896, 4896, 5896] +1899 1 twoijh Thierry plc2 [3897, 4897, 5897] +1900 1 twoiji Thierry plc2 [3898, 4898, 5898] +1901 1 twoijj Thierry plc2 [3899, 4899, 5899] +1902 1 twojaa Thierry plc2 [3900, 4900, 5900] +1903 1 twojab Thierry plc2 [3901, 4901, 5901] +1904 1 twojac Thierry plc2 [3902, 4902, 5902] +1905 1 twojad Thierry plc2 [3903, 4903, 5903] +1906 1 twojae Thierry plc2 [3904, 4904, 5904] +1907 1 twojaf Thierry plc2 [3905, 4905, 5905] +1908 1 twojag Thierry plc2 [3906, 4906, 5906] +1909 1 twojah Thierry plc2 [3907, 4907, 5907] +1910 1 twojai Thierry plc2 [3908, 4908, 5908] +1911 1 twojaj Thierry plc2 [3909, 4909, 5909] +1912 1 twojba Thierry plc2 [3910, 4910, 5910] +1913 1 twojbb Thierry plc2 [3911, 4911, 5911] +1914 1 twojbc Thierry plc2 [3912, 4912, 5912] +1915 1 twojbd Thierry plc2 [3913, 4913, 5913] +1916 1 twojbe Thierry plc2 [3914, 4914, 5914] +1917 1 twojbf Thierry plc2 [3915, 4915, 5915] +1918 1 twojbg Thierry plc2 [3916, 4916, 5916] +1919 1 twojbh Thierry plc2 [3917, 4917, 5917] +1920 1 twojbi Thierry plc2 [3918, 4918, 5918] +1921 1 twojbj Thierry plc2 [3919, 4919, 5919] +1922 1 twojca Thierry plc2 [3920, 4920, 5920] +1923 1 twojcb Thierry plc2 [3921, 4921, 5921] +1924 1 twojcc Thierry plc2 [3922, 4922, 5922] +1925 1 twojcd Thierry plc2 [3923, 4923, 5923] +1926 1 twojce Thierry plc2 [3924, 4924, 5924] +1927 1 twojcf Thierry plc2 [3925, 4925, 5925] +1928 1 twojcg Thierry plc2 [3926, 4926, 5926] +1929 1 twojch Thierry plc2 [3927, 4927, 5927] +1930 1 twojci Thierry plc2 [3928, 4928, 5928] +1931 1 twojcj Thierry plc2 [3929, 4929, 5929] +1932 1 twojda Thierry plc2 [3930, 4930, 5930] +1933 1 twojdb Thierry plc2 [3931, 4931, 5931] +1934 1 twojdc Thierry plc2 [3932, 4932, 5932] +1935 1 twojdd Thierry plc2 [3933, 4933, 5933] +1936 1 twojde Thierry plc2 [3934, 4934, 5934] +1937 1 twojdf Thierry plc2 [3935, 4935, 5935] +1938 1 twojdg Thierry plc2 [3936, 4936, 5936] +1939 1 twojdh Thierry plc2 [3937, 4937, 5937] +1940 1 twojdi Thierry plc2 [3938, 4938, 5938] +1941 1 twojdj Thierry plc2 [3939, 4939, 5939] +1942 1 twojea Thierry plc2 [3940, 4940, 5940] +1943 1 twojeb Thierry plc2 [3941, 4941, 5941] +1944 1 twojec Thierry plc2 [3942, 4942, 5942] +1945 1 twojed Thierry plc2 [3943, 4943, 5943] +1946 1 twojee Thierry plc2 [3944, 4944, 5944] +1947 1 twojef Thierry plc2 [3945, 4945, 5945] +1948 1 twojeg Thierry plc2 [3946, 4946, 5946] +1949 1 twojeh Thierry plc2 [3947, 4947, 5947] +1950 1 twojei Thierry plc2 [3948, 4948, 5948] +1951 1 twojej Thierry plc2 [3949, 4949, 5949] +1952 1 twojfa Thierry plc2 [3950, 4950, 5950] +1953 1 twojfb Thierry plc2 [3951, 4951, 5951] +1954 1 twojfc Thierry plc2 [3952, 4952, 5952] +1955 1 twojfd Thierry plc2 [3953, 4953, 5953] +1956 1 twojfe Thierry plc2 [3954, 4954, 5954] +1957 1 twojff Thierry plc2 [3955, 4955, 5955] +1958 1 twojfg Thierry plc2 [3956, 4956, 5956] +1959 1 twojfh Thierry plc2 [3957, 4957, 5957] +1960 1 twojfi Thierry plc2 [3958, 4958, 5958] +1961 1 twojfj Thierry plc2 [3959, 4959, 5959] +1962 1 twojga Thierry plc2 [3960, 4960, 5960] +1963 1 twojgb Thierry plc2 [3961, 4961, 5961] +1964 1 twojgc Thierry plc2 [3962, 4962, 5962] +1965 1 twojgd Thierry plc2 [3963, 4963, 5963] +1966 1 twojge Thierry plc2 [3964, 4964, 5964] +1967 1 twojgf Thierry plc2 [3965, 4965, 5965] +1968 1 twojgg Thierry plc2 [3966, 4966, 5966] +1969 1 twojgh Thierry plc2 [3967, 4967, 5967] +1970 1 twojgi Thierry plc2 [3968, 4968, 5968] +1971 1 twojgj Thierry plc2 [3969, 4969, 5969] +1972 1 twojha Thierry plc2 [3970, 4970, 5970] +1973 1 twojhb Thierry plc2 [3971, 4971, 5971] +1974 1 twojhc Thierry plc2 [3972, 4972, 5972] +1975 1 twojhd Thierry plc2 [3973, 4973, 5973] +1976 1 twojhe Thierry plc2 [3974, 4974, 5974] +1977 1 twojhf Thierry plc2 [3975, 4975, 5975] +1978 1 twojhg Thierry plc2 [3976, 4976, 5976] +1979 1 twojhh Thierry plc2 [3977, 4977, 5977] +1980 1 twojhi Thierry plc2 [3978, 4978, 5978] +1981 1 twojhj Thierry plc2 [3979, 4979, 5979] +1982 1 twojia Thierry plc2 [3980, 4980, 5980] +1983 1 twojib Thierry plc2 [3981, 4981, 5981] +1984 1 twojic Thierry plc2 [3982, 4982, 5982] +1985 1 twojid Thierry plc2 [3983, 4983, 5983] +1986 1 twojie Thierry plc2 [3984, 4984, 5984] +1987 1 twojif Thierry plc2 [3985, 4985, 5985] +1988 1 twojig Thierry plc2 [3986, 4986, 5986] +1989 1 twojih Thierry plc2 [3987, 4987, 5987] +1990 1 twojii Thierry plc2 [3988, 4988, 5988] +1991 1 twojij Thierry plc2 [3989, 4989, 5989] +1992 1 twojja Thierry plc2 [3990, 4990, 5990] +1993 1 twojjb Thierry plc2 [3991, 4991, 5991] +1994 1 twojjc Thierry plc2 [3992, 4992, 5992] +1995 1 twojjd Thierry plc2 [3993, 4993, 5993] +1996 1 twojje Thierry plc2 [3994, 4994, 5994] +1997 1 twojjf Thierry plc2 [3995, 4995, 5995] +1998 1 twojjg Thierry plc2 [3996, 4996, 5996] +1999 1 twojjh Thierry plc2 [3997, 4997, 5997] +2000 1 twojji Thierry plc2 [3998, 4998, 5998] +2001 1 twojjj Thierry plc2 [3999, 4999, 5999] +2002 1 twobaaa Thierry plc2 [4000, 5000, 6000] +01: KEYS +1 None ssh-rsa 11key4plc11 user1-key1 +2 None ssh-rsa 11key4plc11 user2-key1 +3 None ssh-rsa 11key4plc11 user3-key1 +4 None ssh-rsa 11key4plc11 user4-key1 +5 None ssh-rsa 11key4plc11 user5-key1 +6 None ssh-rsa 11key4plc11 user6-key1 +7 None ssh-rsa 11key4plc11 user7-key1 +8 None ssh-rsa 11key4plc11 user8-key1 +9 None ssh-rsa 11key4plc11 user9-key1 +10 None ssh-rsa 11key4plc11 user10-key1 +11 None ssh-rsa 11key4plc11 user11-key1 +12 None ssh-rsa 11key4plc11 user12-key1 +13 None ssh-rsa 11key4plc11 user13-key1 +14 None ssh-rsa 11key4plc11 user14-key1 +15 None ssh-rsa 11key4plc11 user15-key1 +16 None ssh-rsa 11key4plc11 user16-key1 +17 None ssh-rsa 11key4plc11 user17-key1 +18 None ssh-rsa 11key4plc11 user18-key1 +19 None ssh-rsa 11key4plc11 user19-key1 +20 None ssh-rsa 11key4plc11 user20-key1 +21 None ssh-rsa 11key4plc11 user21-key1 +22 None ssh-rsa 11key4plc11 user22-key1 +23 None ssh-rsa 11key4plc11 user23-key1 +24 None ssh-rsa 11key4plc11 user24-key1 +25 None ssh-rsa 11key4plc11 user25-key1 +26 None ssh-rsa 11key4plc11 user26-key1 +27 None ssh-rsa 11key4plc11 user27-key1 +28 None ssh-rsa 11key4plc11 user28-key1 +29 None ssh-rsa 11key4plc11 user29-key1 +30 None ssh-rsa 11key4plc11 user30-key1 +31 None ssh-rsa 11key4plc11 user31-key1 +32 None ssh-rsa 11key4plc11 user32-key1 +33 None ssh-rsa 11key4plc11 user33-key1 +34 None ssh-rsa 11key4plc11 user34-key1 +35 None ssh-rsa 11key4plc11 user35-key1 +36 None ssh-rsa 11key4plc11 user36-key1 +37 None ssh-rsa 11key4plc11 user37-key1 +38 None ssh-rsa 11key4plc11 user38-key1 +39 None ssh-rsa 11key4plc11 user39-key1 +40 None ssh-rsa 11key4plc11 user40-key1 +41 None ssh-rsa 11key4plc11 user41-key1 +42 None ssh-rsa 11key4plc11 user42-key1 +43 None ssh-rsa 11key4plc11 user43-key1 +44 None ssh-rsa 11key4plc11 user44-key1 +45 None ssh-rsa 11key4plc11 user45-key1 +46 None ssh-rsa 11key4plc11 user46-key1 +47 None ssh-rsa 11key4plc11 user47-key1 +48 None ssh-rsa 11key4plc11 user48-key1 +49 None ssh-rsa 11key4plc11 user49-key1 +50 None ssh-rsa 11key4plc11 user50-key1 +51 None ssh-rsa 11key4plc11 user51-key1 +52 None ssh-rsa 11key4plc11 user52-key1 +53 None ssh-rsa 11key4plc11 user53-key1 +54 None ssh-rsa 11key4plc11 user54-key1 +55 None ssh-rsa 11key4plc11 user55-key1 +56 None ssh-rsa 11key4plc11 user56-key1 +57 None ssh-rsa 11key4plc11 user57-key1 +58 None ssh-rsa 11key4plc11 user58-key1 +59 None ssh-rsa 11key4plc11 user59-key1 +60 None ssh-rsa 11key4plc11 user60-key1 +61 None ssh-rsa 11key4plc11 user61-key1 +62 None ssh-rsa 11key4plc11 user62-key1 +63 None ssh-rsa 11key4plc11 user63-key1 +64 None ssh-rsa 11key4plc11 user64-key1 +65 None ssh-rsa 11key4plc11 user65-key1 +66 None ssh-rsa 11key4plc11 user66-key1 +67 None ssh-rsa 11key4plc11 user67-key1 +68 None ssh-rsa 11key4plc11 user68-key1 +69 None ssh-rsa 11key4plc11 user69-key1 +70 None ssh-rsa 11key4plc11 user70-key1 +71 None ssh-rsa 11key4plc11 user71-key1 +72 None ssh-rsa 11key4plc11 user72-key1 +73 None ssh-rsa 11key4plc11 user73-key1 +74 None ssh-rsa 11key4plc11 user74-key1 +75 None ssh-rsa 11key4plc11 user75-key1 +76 None ssh-rsa 11key4plc11 user76-key1 +77 None ssh-rsa 11key4plc11 user77-key1 +78 None ssh-rsa 11key4plc11 user78-key1 +79 None ssh-rsa 11key4plc11 user79-key1 +80 None ssh-rsa 11key4plc11 user80-key1 +81 None ssh-rsa 11key4plc11 user81-key1 +82 None ssh-rsa 11key4plc11 user82-key1 +83 None ssh-rsa 11key4plc11 user83-key1 +84 None ssh-rsa 11key4plc11 user84-key1 +85 None ssh-rsa 11key4plc11 user85-key1 +86 None ssh-rsa 11key4plc11 user86-key1 +87 None ssh-rsa 11key4plc11 user87-key1 +88 None ssh-rsa 11key4plc11 user88-key1 +89 None ssh-rsa 11key4plc11 user89-key1 +90 None ssh-rsa 11key4plc11 user90-key1 +91 None ssh-rsa 11key4plc11 user91-key1 +92 None ssh-rsa 11key4plc11 user92-key1 +93 None ssh-rsa 11key4plc11 user93-key1 +94 None ssh-rsa 11key4plc11 user94-key1 +95 None ssh-rsa 11key4plc11 user95-key1 +96 None ssh-rsa 11key4plc11 user96-key1 +97 None ssh-rsa 11key4plc11 user97-key1 +98 None ssh-rsa 11key4plc11 user98-key1 +99 None ssh-rsa 11key4plc11 user99-key1 +100 None ssh-rsa 11key4plc11 user100-key1 +101 None ssh-rsa 11key4plc11 user101-key1 +102 None ssh-rsa 11key4plc11 user102-key1 +103 None ssh-rsa 11key4plc11 user103-key1 +104 None ssh-rsa 11key4plc11 user104-key1 +105 None ssh-rsa 11key4plc11 user105-key1 +106 None ssh-rsa 11key4plc11 user106-key1 +107 None ssh-rsa 11key4plc11 user107-key1 +108 None ssh-rsa 11key4plc11 user108-key1 +109 None ssh-rsa 11key4plc11 user109-key1 +110 None ssh-rsa 11key4plc11 user110-key1 +111 None ssh-rsa 11key4plc11 user111-key1 +112 None ssh-rsa 11key4plc11 user112-key1 +113 None ssh-rsa 11key4plc11 user113-key1 +114 None ssh-rsa 11key4plc11 user114-key1 +115 None ssh-rsa 11key4plc11 user115-key1 +116 None ssh-rsa 11key4plc11 user116-key1 +117 None ssh-rsa 11key4plc11 user117-key1 +118 None ssh-rsa 11key4plc11 user118-key1 +119 None ssh-rsa 11key4plc11 user119-key1 +120 None ssh-rsa 11key4plc11 user120-key1 +121 None ssh-rsa 11key4plc11 user121-key1 +122 None ssh-rsa 11key4plc11 user122-key1 +123 None ssh-rsa 11key4plc11 user123-key1 +124 None ssh-rsa 11key4plc11 user124-key1 +125 None ssh-rsa 11key4plc11 user125-key1 +126 None ssh-rsa 11key4plc11 user126-key1 +127 None ssh-rsa 11key4plc11 user127-key1 +128 None ssh-rsa 11key4plc11 user128-key1 +129 None ssh-rsa 11key4plc11 user129-key1 +130 None ssh-rsa 11key4plc11 user130-key1 +131 None ssh-rsa 11key4plc11 user131-key1 +132 None ssh-rsa 11key4plc11 user132-key1 +133 None ssh-rsa 11key4plc11 user133-key1 +134 None ssh-rsa 11key4plc11 user134-key1 +135 None ssh-rsa 11key4plc11 user135-key1 +136 None ssh-rsa 11key4plc11 user136-key1 +137 None ssh-rsa 11key4plc11 user137-key1 +138 None ssh-rsa 11key4plc11 user138-key1 +139 None ssh-rsa 11key4plc11 user139-key1 +140 None ssh-rsa 11key4plc11 user140-key1 +141 None ssh-rsa 11key4plc11 user141-key1 +142 None ssh-rsa 11key4plc11 user142-key1 +143 None ssh-rsa 11key4plc11 user143-key1 +144 None ssh-rsa 11key4plc11 user144-key1 +145 None ssh-rsa 11key4plc11 user145-key1 +146 None ssh-rsa 11key4plc11 user146-key1 +147 None ssh-rsa 11key4plc11 user147-key1 +148 None ssh-rsa 11key4plc11 user148-key1 +149 None ssh-rsa 11key4plc11 user149-key1 +150 None ssh-rsa 11key4plc11 user150-key1 +151 None ssh-rsa 11key4plc11 user151-key1 +152 None ssh-rsa 11key4plc11 user152-key1 +153 None ssh-rsa 11key4plc11 user153-key1 +154 None ssh-rsa 11key4plc11 user154-key1 +155 None ssh-rsa 11key4plc11 user155-key1 +156 None ssh-rsa 11key4plc11 user156-key1 +157 None ssh-rsa 11key4plc11 user157-key1 +158 None ssh-rsa 11key4plc11 user158-key1 +159 None ssh-rsa 11key4plc11 user159-key1 +160 None ssh-rsa 11key4plc11 user160-key1 +161 None ssh-rsa 11key4plc11 user161-key1 +162 None ssh-rsa 11key4plc11 user162-key1 +163 None ssh-rsa 11key4plc11 user163-key1 +164 None ssh-rsa 11key4plc11 user164-key1 +165 None ssh-rsa 11key4plc11 user165-key1 +166 None ssh-rsa 11key4plc11 user166-key1 +167 None ssh-rsa 11key4plc11 user167-key1 +168 None ssh-rsa 11key4plc11 user168-key1 +169 None ssh-rsa 11key4plc11 user169-key1 +170 None ssh-rsa 11key4plc11 user170-key1 +171 None ssh-rsa 11key4plc11 user171-key1 +172 None ssh-rsa 11key4plc11 user172-key1 +173 None ssh-rsa 11key4plc11 user173-key1 +174 None ssh-rsa 11key4plc11 user174-key1 +175 None ssh-rsa 11key4plc11 user175-key1 +176 None ssh-rsa 11key4plc11 user176-key1 +177 None ssh-rsa 11key4plc11 user177-key1 +178 None ssh-rsa 11key4plc11 user178-key1 +179 None ssh-rsa 11key4plc11 user179-key1 +180 None ssh-rsa 11key4plc11 user180-key1 +181 None ssh-rsa 11key4plc11 user181-key1 +182 None ssh-rsa 11key4plc11 user182-key1 +183 None ssh-rsa 11key4plc11 user183-key1 +184 None ssh-rsa 11key4plc11 user184-key1 +185 None ssh-rsa 11key4plc11 user185-key1 +186 None ssh-rsa 11key4plc11 user186-key1 +187 None ssh-rsa 11key4plc11 user187-key1 +188 None ssh-rsa 11key4plc11 user188-key1 +189 None ssh-rsa 11key4plc11 user189-key1 +190 None ssh-rsa 11key4plc11 user190-key1 +191 None ssh-rsa 11key4plc11 user191-key1 +192 None ssh-rsa 11key4plc11 user192-key1 +193 None ssh-rsa 11key4plc11 user193-key1 +194 None ssh-rsa 11key4plc11 user194-key1 +195 None ssh-rsa 11key4plc11 user195-key1 +196 None ssh-rsa 11key4plc11 user196-key1 +197 None ssh-rsa 11key4plc11 user197-key1 +198 None ssh-rsa 11key4plc11 user198-key1 +199 None ssh-rsa 11key4plc11 user199-key1 +200 None ssh-rsa 11key4plc11 user200-key1 +201 None ssh-rsa 11key4plc11 user201-key1 +202 None ssh-rsa 11key4plc11 user202-key1 +203 None ssh-rsa 11key4plc11 user203-key1 +204 None ssh-rsa 11key4plc11 user204-key1 +205 None ssh-rsa 11key4plc11 user205-key1 +206 None ssh-rsa 11key4plc11 user206-key1 +207 None ssh-rsa 11key4plc11 user207-key1 +208 None ssh-rsa 11key4plc11 user208-key1 +209 None ssh-rsa 11key4plc11 user209-key1 +210 None ssh-rsa 11key4plc11 user210-key1 +211 None ssh-rsa 11key4plc11 user211-key1 +212 None ssh-rsa 11key4plc11 user212-key1 +213 None ssh-rsa 11key4plc11 user213-key1 +214 None ssh-rsa 11key4plc11 user214-key1 +215 None ssh-rsa 11key4plc11 user215-key1 +216 None ssh-rsa 11key4plc11 user216-key1 +217 None ssh-rsa 11key4plc11 user217-key1 +218 None ssh-rsa 11key4plc11 user218-key1 +219 None ssh-rsa 11key4plc11 user219-key1 +220 None ssh-rsa 11key4plc11 user220-key1 +221 None ssh-rsa 11key4plc11 user221-key1 +222 None ssh-rsa 11key4plc11 user222-key1 +223 None ssh-rsa 11key4plc11 user223-key1 +224 None ssh-rsa 11key4plc11 user224-key1 +225 None ssh-rsa 11key4plc11 user225-key1 +226 None ssh-rsa 11key4plc11 user226-key1 +227 None ssh-rsa 11key4plc11 user227-key1 +228 None ssh-rsa 11key4plc11 user228-key1 +229 None ssh-rsa 11key4plc11 user229-key1 +230 None ssh-rsa 11key4plc11 user230-key1 +231 None ssh-rsa 11key4plc11 user231-key1 +232 None ssh-rsa 11key4plc11 user232-key1 +233 None ssh-rsa 11key4plc11 user233-key1 +234 None ssh-rsa 11key4plc11 user234-key1 +235 None ssh-rsa 11key4plc11 user235-key1 +236 None ssh-rsa 11key4plc11 user236-key1 +237 None ssh-rsa 11key4plc11 user237-key1 +238 None ssh-rsa 11key4plc11 user238-key1 +239 None ssh-rsa 11key4plc11 user239-key1 +240 None ssh-rsa 11key4plc11 user240-key1 +241 None ssh-rsa 11key4plc11 user241-key1 +242 None ssh-rsa 11key4plc11 user242-key1 +243 None ssh-rsa 11key4plc11 user243-key1 +244 None ssh-rsa 11key4plc11 user244-key1 +245 None ssh-rsa 11key4plc11 user245-key1 +246 None ssh-rsa 11key4plc11 user246-key1 +247 None ssh-rsa 11key4plc11 user247-key1 +248 None ssh-rsa 11key4plc11 user248-key1 +249 None ssh-rsa 11key4plc11 user249-key1 +250 None ssh-rsa 11key4plc11 user250-key1 +251 None ssh-rsa 11key4plc11 user251-key1 +252 None ssh-rsa 11key4plc11 user252-key1 +253 None ssh-rsa 11key4plc11 user253-key1 +254 None ssh-rsa 11key4plc11 user254-key1 +255 None ssh-rsa 11key4plc11 user255-key1 +256 None ssh-rsa 11key4plc11 user256-key1 +257 None ssh-rsa 11key4plc11 user257-key1 +258 None ssh-rsa 11key4plc11 user258-key1 +259 None ssh-rsa 11key4plc11 user259-key1 +260 None ssh-rsa 11key4plc11 user260-key1 +261 None ssh-rsa 11key4plc11 user261-key1 +262 None ssh-rsa 11key4plc11 user262-key1 +263 None ssh-rsa 11key4plc11 user263-key1 +264 None ssh-rsa 11key4plc11 user264-key1 +265 None ssh-rsa 11key4plc11 user265-key1 +266 None ssh-rsa 11key4plc11 user266-key1 +267 None ssh-rsa 11key4plc11 user267-key1 +268 None ssh-rsa 11key4plc11 user268-key1 +269 None ssh-rsa 11key4plc11 user269-key1 +270 None ssh-rsa 11key4plc11 user270-key1 +271 None ssh-rsa 11key4plc11 user271-key1 +272 None ssh-rsa 11key4plc11 user272-key1 +273 None ssh-rsa 11key4plc11 user273-key1 +274 None ssh-rsa 11key4plc11 user274-key1 +275 None ssh-rsa 11key4plc11 user275-key1 +276 None ssh-rsa 11key4plc11 user276-key1 +277 None ssh-rsa 11key4plc11 user277-key1 +278 None ssh-rsa 11key4plc11 user278-key1 +279 None ssh-rsa 11key4plc11 user279-key1 +280 None ssh-rsa 11key4plc11 user280-key1 +281 None ssh-rsa 11key4plc11 user281-key1 +282 None ssh-rsa 11key4plc11 user282-key1 +283 None ssh-rsa 11key4plc11 user283-key1 +284 None ssh-rsa 11key4plc11 user284-key1 +285 None ssh-rsa 11key4plc11 user285-key1 +286 None ssh-rsa 11key4plc11 user286-key1 +287 None ssh-rsa 11key4plc11 user287-key1 +288 None ssh-rsa 11key4plc11 user288-key1 +289 None ssh-rsa 11key4plc11 user289-key1 +290 None ssh-rsa 11key4plc11 user290-key1 +291 None ssh-rsa 11key4plc11 user291-key1 +292 None ssh-rsa 11key4plc11 user292-key1 +293 None ssh-rsa 11key4plc11 user293-key1 +294 None ssh-rsa 11key4plc11 user294-key1 +295 None ssh-rsa 11key4plc11 user295-key1 +296 None ssh-rsa 11key4plc11 user296-key1 +297 None ssh-rsa 11key4plc11 user297-key1 +298 None ssh-rsa 11key4plc11 user298-key1 +299 None ssh-rsa 11key4plc11 user299-key1 +300 None ssh-rsa 11key4plc11 user300-key1 +301 None ssh-rsa 11key4plc11 user301-key1 +302 None ssh-rsa 11key4plc11 user302-key1 +303 None ssh-rsa 11key4plc11 user303-key1 +304 None ssh-rsa 11key4plc11 user304-key1 +305 None ssh-rsa 11key4plc11 user305-key1 +306 None ssh-rsa 11key4plc11 user306-key1 +307 None ssh-rsa 11key4plc11 user307-key1 +308 None ssh-rsa 11key4plc11 user308-key1 +309 None ssh-rsa 11key4plc11 user309-key1 +310 None ssh-rsa 11key4plc11 user310-key1 +311 None ssh-rsa 11key4plc11 user311-key1 +312 None ssh-rsa 11key4plc11 user312-key1 +313 None ssh-rsa 11key4plc11 user313-key1 +314 None ssh-rsa 11key4plc11 user314-key1 +315 None ssh-rsa 11key4plc11 user315-key1 +316 None ssh-rsa 11key4plc11 user316-key1 +317 None ssh-rsa 11key4plc11 user317-key1 +318 None ssh-rsa 11key4plc11 user318-key1 +319 None ssh-rsa 11key4plc11 user319-key1 +320 None ssh-rsa 11key4plc11 user320-key1 +321 None ssh-rsa 11key4plc11 user321-key1 +322 None ssh-rsa 11key4plc11 user322-key1 +323 None ssh-rsa 11key4plc11 user323-key1 +324 None ssh-rsa 11key4plc11 user324-key1 +325 None ssh-rsa 11key4plc11 user325-key1 +326 None ssh-rsa 11key4plc11 user326-key1 +327 None ssh-rsa 11key4plc11 user327-key1 +328 None ssh-rsa 11key4plc11 user328-key1 +329 None ssh-rsa 11key4plc11 user329-key1 +330 None ssh-rsa 11key4plc11 user330-key1 +331 None ssh-rsa 11key4plc11 user331-key1 +332 None ssh-rsa 11key4plc11 user332-key1 +333 None ssh-rsa 11key4plc11 user333-key1 +334 None ssh-rsa 11key4plc11 user334-key1 +335 None ssh-rsa 11key4plc11 user335-key1 +336 None ssh-rsa 11key4plc11 user336-key1 +337 None ssh-rsa 11key4plc11 user337-key1 +338 None ssh-rsa 11key4plc11 user338-key1 +339 None ssh-rsa 11key4plc11 user339-key1 +340 None ssh-rsa 11key4plc11 user340-key1 +341 None ssh-rsa 11key4plc11 user341-key1 +342 None ssh-rsa 11key4plc11 user342-key1 +343 None ssh-rsa 11key4plc11 user343-key1 +344 None ssh-rsa 11key4plc11 user344-key1 +345 None ssh-rsa 11key4plc11 user345-key1 +346 None ssh-rsa 11key4plc11 user346-key1 +347 None ssh-rsa 11key4plc11 user347-key1 +348 None ssh-rsa 11key4plc11 user348-key1 +349 None ssh-rsa 11key4plc11 user349-key1 +350 None ssh-rsa 11key4plc11 user350-key1 +351 None ssh-rsa 11key4plc11 user351-key1 +352 None ssh-rsa 11key4plc11 user352-key1 +353 None ssh-rsa 11key4plc11 user353-key1 +354 None ssh-rsa 11key4plc11 user354-key1 +355 None ssh-rsa 11key4plc11 user355-key1 +356 None ssh-rsa 11key4plc11 user356-key1 +357 None ssh-rsa 11key4plc11 user357-key1 +358 None ssh-rsa 11key4plc11 user358-key1 +359 None ssh-rsa 11key4plc11 user359-key1 +360 None ssh-rsa 11key4plc11 user360-key1 +361 None ssh-rsa 11key4plc11 user361-key1 +362 None ssh-rsa 11key4plc11 user362-key1 +363 None ssh-rsa 11key4plc11 user363-key1 +364 None ssh-rsa 11key4plc11 user364-key1 +365 None ssh-rsa 11key4plc11 user365-key1 +366 None ssh-rsa 11key4plc11 user366-key1 +367 None ssh-rsa 11key4plc11 user367-key1 +368 None ssh-rsa 11key4plc11 user368-key1 +369 None ssh-rsa 11key4plc11 user369-key1 +370 None ssh-rsa 11key4plc11 user370-key1 +371 None ssh-rsa 11key4plc11 user371-key1 +372 None ssh-rsa 11key4plc11 user372-key1 +373 None ssh-rsa 11key4plc11 user373-key1 +374 None ssh-rsa 11key4plc11 user374-key1 +375 None ssh-rsa 11key4plc11 user375-key1 +376 None ssh-rsa 11key4plc11 user376-key1 +377 None ssh-rsa 11key4plc11 user377-key1 +378 None ssh-rsa 11key4plc11 user378-key1 +379 None ssh-rsa 11key4plc11 user379-key1 +380 None ssh-rsa 11key4plc11 user380-key1 +381 None ssh-rsa 11key4plc11 user381-key1 +382 None ssh-rsa 11key4plc11 user382-key1 +383 None ssh-rsa 11key4plc11 user383-key1 +384 None ssh-rsa 11key4plc11 user384-key1 +385 None ssh-rsa 11key4plc11 user385-key1 +386 None ssh-rsa 11key4plc11 user386-key1 +387 None ssh-rsa 11key4plc11 user387-key1 +388 None ssh-rsa 11key4plc11 user388-key1 +389 None ssh-rsa 11key4plc11 user389-key1 +390 None ssh-rsa 11key4plc11 user390-key1 +391 None ssh-rsa 11key4plc11 user391-key1 +392 None ssh-rsa 11key4plc11 user392-key1 +393 None ssh-rsa 11key4plc11 user393-key1 +394 None ssh-rsa 11key4plc11 user394-key1 +395 None ssh-rsa 11key4plc11 user395-key1 +396 None ssh-rsa 11key4plc11 user396-key1 +397 None ssh-rsa 11key4plc11 user397-key1 +398 None ssh-rsa 11key4plc11 user398-key1 +399 None ssh-rsa 11key4plc11 user399-key1 +400 None ssh-rsa 11key4plc11 user400-key1 +401 None ssh-rsa 11key4plc11 user401-key1 +402 None ssh-rsa 11key4plc11 user402-key1 +403 None ssh-rsa 11key4plc11 user403-key1 +404 None ssh-rsa 11key4plc11 user404-key1 +405 None ssh-rsa 11key4plc11 user405-key1 +406 None ssh-rsa 11key4plc11 user406-key1 +407 None ssh-rsa 11key4plc11 user407-key1 +408 None ssh-rsa 11key4plc11 user408-key1 +409 None ssh-rsa 11key4plc11 user409-key1 +410 None ssh-rsa 11key4plc11 user410-key1 +411 None ssh-rsa 11key4plc11 user411-key1 +412 None ssh-rsa 11key4plc11 user412-key1 +413 None ssh-rsa 11key4plc11 user413-key1 +414 None ssh-rsa 11key4plc11 user414-key1 +415 None ssh-rsa 11key4plc11 user415-key1 +416 None ssh-rsa 11key4plc11 user416-key1 +417 None ssh-rsa 11key4plc11 user417-key1 +418 None ssh-rsa 11key4plc11 user418-key1 +419 None ssh-rsa 11key4plc11 user419-key1 +420 None ssh-rsa 11key4plc11 user420-key1 +421 None ssh-rsa 11key4plc11 user421-key1 +422 None ssh-rsa 11key4plc11 user422-key1 +423 None ssh-rsa 11key4plc11 user423-key1 +424 None ssh-rsa 11key4plc11 user424-key1 +425 None ssh-rsa 11key4plc11 user425-key1 +426 None ssh-rsa 11key4plc11 user426-key1 +427 None ssh-rsa 11key4plc11 user427-key1 +428 None ssh-rsa 11key4plc11 user428-key1 +429 None ssh-rsa 11key4plc11 user429-key1 +430 None ssh-rsa 11key4plc11 user430-key1 +431 None ssh-rsa 11key4plc11 user431-key1 +432 None ssh-rsa 11key4plc11 user432-key1 +433 None ssh-rsa 11key4plc11 user433-key1 +434 None ssh-rsa 11key4plc11 user434-key1 +435 None ssh-rsa 11key4plc11 user435-key1 +436 None ssh-rsa 11key4plc11 user436-key1 +437 None ssh-rsa 11key4plc11 user437-key1 +438 None ssh-rsa 11key4plc11 user438-key1 +439 None ssh-rsa 11key4plc11 user439-key1 +440 None ssh-rsa 11key4plc11 user440-key1 +441 None ssh-rsa 11key4plc11 user441-key1 +442 None ssh-rsa 11key4plc11 user442-key1 +443 None ssh-rsa 11key4plc11 user443-key1 +444 None ssh-rsa 11key4plc11 user444-key1 +445 None ssh-rsa 11key4plc11 user445-key1 +446 None ssh-rsa 11key4plc11 user446-key1 +447 None ssh-rsa 11key4plc11 user447-key1 +448 None ssh-rsa 11key4plc11 user448-key1 +449 None ssh-rsa 11key4plc11 user449-key1 +450 None ssh-rsa 11key4plc11 user450-key1 +451 None ssh-rsa 11key4plc11 user451-key1 +452 None ssh-rsa 11key4plc11 user452-key1 +453 None ssh-rsa 11key4plc11 user453-key1 +454 None ssh-rsa 11key4plc11 user454-key1 +455 None ssh-rsa 11key4plc11 user455-key1 +456 None ssh-rsa 11key4plc11 user456-key1 +457 None ssh-rsa 11key4plc11 user457-key1 +458 None ssh-rsa 11key4plc11 user458-key1 +459 None ssh-rsa 11key4plc11 user459-key1 +460 None ssh-rsa 11key4plc11 user460-key1 +461 None ssh-rsa 11key4plc11 user461-key1 +462 None ssh-rsa 11key4plc11 user462-key1 +463 None ssh-rsa 11key4plc11 user463-key1 +464 None ssh-rsa 11key4plc11 user464-key1 +465 None ssh-rsa 11key4plc11 user465-key1 +466 None ssh-rsa 11key4plc11 user466-key1 +467 None ssh-rsa 11key4plc11 user467-key1 +468 None ssh-rsa 11key4plc11 user468-key1 +469 None ssh-rsa 11key4plc11 user469-key1 +470 None ssh-rsa 11key4plc11 user470-key1 +471 None ssh-rsa 11key4plc11 user471-key1 +472 None ssh-rsa 11key4plc11 user472-key1 +473 None ssh-rsa 11key4plc11 user473-key1 +474 None ssh-rsa 11key4plc11 user474-key1 +475 None ssh-rsa 11key4plc11 user475-key1 +476 None ssh-rsa 11key4plc11 user476-key1 +477 None ssh-rsa 11key4plc11 user477-key1 +478 None ssh-rsa 11key4plc11 user478-key1 +479 None ssh-rsa 11key4plc11 user479-key1 +480 None ssh-rsa 11key4plc11 user480-key1 +481 None ssh-rsa 11key4plc11 user481-key1 +482 None ssh-rsa 11key4plc11 user482-key1 +483 None ssh-rsa 11key4plc11 user483-key1 +484 None ssh-rsa 11key4plc11 user484-key1 +485 None ssh-rsa 11key4plc11 user485-key1 +486 None ssh-rsa 11key4plc11 user486-key1 +487 None ssh-rsa 11key4plc11 user487-key1 +488 None ssh-rsa 11key4plc11 user488-key1 +489 None ssh-rsa 11key4plc11 user489-key1 +490 None ssh-rsa 11key4plc11 user490-key1 +491 None ssh-rsa 11key4plc11 user491-key1 +492 None ssh-rsa 11key4plc11 user492-key1 +493 None ssh-rsa 11key4plc11 user493-key1 +494 None ssh-rsa 11key4plc11 user494-key1 +495 None ssh-rsa 11key4plc11 user495-key1 +496 None ssh-rsa 11key4plc11 user496-key1 +497 None ssh-rsa 11key4plc11 user497-key1 +498 None ssh-rsa 11key4plc11 user498-key1 +499 None ssh-rsa 11key4plc11 user499-key1 +500 None ssh-rsa 11key4plc11 user500-key1 +501 None ssh-rsa 11key4plc11 user501-key1 +502 None ssh-rsa 11key4plc11 user502-key1 +503 None ssh-rsa 11key4plc11 user503-key1 +504 None ssh-rsa 11key4plc11 user504-key1 +505 None ssh-rsa 11key4plc11 user505-key1 +506 None ssh-rsa 11key4plc11 user506-key1 +507 None ssh-rsa 11key4plc11 user507-key1 +508 None ssh-rsa 11key4plc11 user508-key1 +509 None ssh-rsa 11key4plc11 user509-key1 +510 None ssh-rsa 11key4plc11 user510-key1 +511 None ssh-rsa 11key4plc11 user511-key1 +512 None ssh-rsa 11key4plc11 user512-key1 +513 None ssh-rsa 11key4plc11 user513-key1 +514 None ssh-rsa 11key4plc11 user514-key1 +515 None ssh-rsa 11key4plc11 user515-key1 +516 None ssh-rsa 11key4plc11 user516-key1 +517 None ssh-rsa 11key4plc11 user517-key1 +518 None ssh-rsa 11key4plc11 user518-key1 +519 None ssh-rsa 11key4plc11 user519-key1 +520 None ssh-rsa 11key4plc11 user520-key1 +521 None ssh-rsa 11key4plc11 user521-key1 +522 None ssh-rsa 11key4plc11 user522-key1 +523 None ssh-rsa 11key4plc11 user523-key1 +524 None ssh-rsa 11key4plc11 user524-key1 +525 None ssh-rsa 11key4plc11 user525-key1 +526 None ssh-rsa 11key4plc11 user526-key1 +527 None ssh-rsa 11key4plc11 user527-key1 +528 None ssh-rsa 11key4plc11 user528-key1 +529 None ssh-rsa 11key4plc11 user529-key1 +530 None ssh-rsa 11key4plc11 user530-key1 +531 None ssh-rsa 11key4plc11 user531-key1 +532 None ssh-rsa 11key4plc11 user532-key1 +533 None ssh-rsa 11key4plc11 user533-key1 +534 None ssh-rsa 11key4plc11 user534-key1 +535 None ssh-rsa 11key4plc11 user535-key1 +536 None ssh-rsa 11key4plc11 user536-key1 +537 None ssh-rsa 11key4plc11 user537-key1 +538 None ssh-rsa 11key4plc11 user538-key1 +539 None ssh-rsa 11key4plc11 user539-key1 +540 None ssh-rsa 11key4plc11 user540-key1 +541 None ssh-rsa 11key4plc11 user541-key1 +542 None ssh-rsa 11key4plc11 user542-key1 +543 None ssh-rsa 11key4plc11 user543-key1 +544 None ssh-rsa 11key4plc11 user544-key1 +545 None ssh-rsa 11key4plc11 user545-key1 +546 None ssh-rsa 11key4plc11 user546-key1 +547 None ssh-rsa 11key4plc11 user547-key1 +548 None ssh-rsa 11key4plc11 user548-key1 +549 None ssh-rsa 11key4plc11 user549-key1 +550 None ssh-rsa 11key4plc11 user550-key1 +551 None ssh-rsa 11key4plc11 user551-key1 +552 None ssh-rsa 11key4plc11 user552-key1 +553 None ssh-rsa 11key4plc11 user553-key1 +554 None ssh-rsa 11key4plc11 user554-key1 +555 None ssh-rsa 11key4plc11 user555-key1 +556 None ssh-rsa 11key4plc11 user556-key1 +557 None ssh-rsa 11key4plc11 user557-key1 +558 None ssh-rsa 11key4plc11 user558-key1 +559 None ssh-rsa 11key4plc11 user559-key1 +560 None ssh-rsa 11key4plc11 user560-key1 +561 None ssh-rsa 11key4plc11 user561-key1 +562 None ssh-rsa 11key4plc11 user562-key1 +563 None ssh-rsa 11key4plc11 user563-key1 +564 None ssh-rsa 11key4plc11 user564-key1 +565 None ssh-rsa 11key4plc11 user565-key1 +566 None ssh-rsa 11key4plc11 user566-key1 +567 None ssh-rsa 11key4plc11 user567-key1 +568 None ssh-rsa 11key4plc11 user568-key1 +569 None ssh-rsa 11key4plc11 user569-key1 +570 None ssh-rsa 11key4plc11 user570-key1 +571 None ssh-rsa 11key4plc11 user571-key1 +572 None ssh-rsa 11key4plc11 user572-key1 +573 None ssh-rsa 11key4plc11 user573-key1 +574 None ssh-rsa 11key4plc11 user574-key1 +575 None ssh-rsa 11key4plc11 user575-key1 +576 None ssh-rsa 11key4plc11 user576-key1 +577 None ssh-rsa 11key4plc11 user577-key1 +578 None ssh-rsa 11key4plc11 user578-key1 +579 None ssh-rsa 11key4plc11 user579-key1 +580 None ssh-rsa 11key4plc11 user580-key1 +581 None ssh-rsa 11key4plc11 user581-key1 +582 None ssh-rsa 11key4plc11 user582-key1 +583 None ssh-rsa 11key4plc11 user583-key1 +584 None ssh-rsa 11key4plc11 user584-key1 +585 None ssh-rsa 11key4plc11 user585-key1 +586 None ssh-rsa 11key4plc11 user586-key1 +587 None ssh-rsa 11key4plc11 user587-key1 +588 None ssh-rsa 11key4plc11 user588-key1 +589 None ssh-rsa 11key4plc11 user589-key1 +590 None ssh-rsa 11key4plc11 user590-key1 +591 None ssh-rsa 11key4plc11 user591-key1 +592 None ssh-rsa 11key4plc11 user592-key1 +593 None ssh-rsa 11key4plc11 user593-key1 +594 None ssh-rsa 11key4plc11 user594-key1 +595 None ssh-rsa 11key4plc11 user595-key1 +596 None ssh-rsa 11key4plc11 user596-key1 +597 None ssh-rsa 11key4plc11 user597-key1 +598 None ssh-rsa 11key4plc11 user598-key1 +599 None ssh-rsa 11key4plc11 user599-key1 +600 None ssh-rsa 11key4plc11 user600-key1 +601 None ssh-rsa 11key4plc11 user601-key1 +602 None ssh-rsa 11key4plc11 user602-key1 +603 None ssh-rsa 11key4plc11 user603-key1 +604 None ssh-rsa 11key4plc11 user604-key1 +605 None ssh-rsa 11key4plc11 user605-key1 +606 None ssh-rsa 11key4plc11 user606-key1 +607 None ssh-rsa 11key4plc11 user607-key1 +608 None ssh-rsa 11key4plc11 user608-key1 +609 None ssh-rsa 11key4plc11 user609-key1 +610 None ssh-rsa 11key4plc11 user610-key1 +611 None ssh-rsa 11key4plc11 user611-key1 +612 None ssh-rsa 11key4plc11 user612-key1 +613 None ssh-rsa 11key4plc11 user613-key1 +614 None ssh-rsa 11key4plc11 user614-key1 +615 None ssh-rsa 11key4plc11 user615-key1 +616 None ssh-rsa 11key4plc11 user616-key1 +617 None ssh-rsa 11key4plc11 user617-key1 +618 None ssh-rsa 11key4plc11 user618-key1 +619 None ssh-rsa 11key4plc11 user619-key1 +620 None ssh-rsa 11key4plc11 user620-key1 +621 None ssh-rsa 11key4plc11 user621-key1 +622 None ssh-rsa 11key4plc11 user622-key1 +623 None ssh-rsa 11key4plc11 user623-key1 +624 None ssh-rsa 11key4plc11 user624-key1 +625 None ssh-rsa 11key4plc11 user625-key1 +626 None ssh-rsa 11key4plc11 user626-key1 +627 None ssh-rsa 11key4plc11 user627-key1 +628 None ssh-rsa 11key4plc11 user628-key1 +629 None ssh-rsa 11key4plc11 user629-key1 +630 None ssh-rsa 11key4plc11 user630-key1 +631 None ssh-rsa 11key4plc11 user631-key1 +632 None ssh-rsa 11key4plc11 user632-key1 +633 None ssh-rsa 11key4plc11 user633-key1 +634 None ssh-rsa 11key4plc11 user634-key1 +635 None ssh-rsa 11key4plc11 user635-key1 +636 None ssh-rsa 11key4plc11 user636-key1 +637 None ssh-rsa 11key4plc11 user637-key1 +638 None ssh-rsa 11key4plc11 user638-key1 +639 None ssh-rsa 11key4plc11 user639-key1 +640 None ssh-rsa 11key4plc11 user640-key1 +641 None ssh-rsa 11key4plc11 user641-key1 +642 None ssh-rsa 11key4plc11 user642-key1 +643 None ssh-rsa 11key4plc11 user643-key1 +644 None ssh-rsa 11key4plc11 user644-key1 +645 None ssh-rsa 11key4plc11 user645-key1 +646 None ssh-rsa 11key4plc11 user646-key1 +647 None ssh-rsa 11key4plc11 user647-key1 +648 None ssh-rsa 11key4plc11 user648-key1 +649 None ssh-rsa 11key4plc11 user649-key1 +650 None ssh-rsa 11key4plc11 user650-key1 +651 None ssh-rsa 11key4plc11 user651-key1 +652 None ssh-rsa 11key4plc11 user652-key1 +653 None ssh-rsa 11key4plc11 user653-key1 +654 None ssh-rsa 11key4plc11 user654-key1 +655 None ssh-rsa 11key4plc11 user655-key1 +656 None ssh-rsa 11key4plc11 user656-key1 +657 None ssh-rsa 11key4plc11 user657-key1 +658 None ssh-rsa 11key4plc11 user658-key1 +659 None ssh-rsa 11key4plc11 user659-key1 +660 None ssh-rsa 11key4plc11 user660-key1 +661 None ssh-rsa 11key4plc11 user661-key1 +662 None ssh-rsa 11key4plc11 user662-key1 +663 None ssh-rsa 11key4plc11 user663-key1 +664 None ssh-rsa 11key4plc11 user664-key1 +665 None ssh-rsa 11key4plc11 user665-key1 +666 None ssh-rsa 11key4plc11 user666-key1 +667 None ssh-rsa 11key4plc11 user667-key1 +668 None ssh-rsa 11key4plc11 user668-key1 +669 None ssh-rsa 11key4plc11 user669-key1 +670 None ssh-rsa 11key4plc11 user670-key1 +671 None ssh-rsa 11key4plc11 user671-key1 +672 None ssh-rsa 11key4plc11 user672-key1 +673 None ssh-rsa 11key4plc11 user673-key1 +674 None ssh-rsa 11key4plc11 user674-key1 +675 None ssh-rsa 11key4plc11 user675-key1 +676 None ssh-rsa 11key4plc11 user676-key1 +677 None ssh-rsa 11key4plc11 user677-key1 +678 None ssh-rsa 11key4plc11 user678-key1 +679 None ssh-rsa 11key4plc11 user679-key1 +680 None ssh-rsa 11key4plc11 user680-key1 +681 None ssh-rsa 11key4plc11 user681-key1 +682 None ssh-rsa 11key4plc11 user682-key1 +683 None ssh-rsa 11key4plc11 user683-key1 +684 None ssh-rsa 11key4plc11 user684-key1 +685 None ssh-rsa 11key4plc11 user685-key1 +686 None ssh-rsa 11key4plc11 user686-key1 +687 None ssh-rsa 11key4plc11 user687-key1 +688 None ssh-rsa 11key4plc11 user688-key1 +689 None ssh-rsa 11key4plc11 user689-key1 +690 None ssh-rsa 11key4plc11 user690-key1 +691 None ssh-rsa 11key4plc11 user691-key1 +692 None ssh-rsa 11key4plc11 user692-key1 +693 None ssh-rsa 11key4plc11 user693-key1 +694 None ssh-rsa 11key4plc11 user694-key1 +695 None ssh-rsa 11key4plc11 user695-key1 +696 None ssh-rsa 11key4plc11 user696-key1 +697 None ssh-rsa 11key4plc11 user697-key1 +698 None ssh-rsa 11key4plc11 user698-key1 +699 None ssh-rsa 11key4plc11 user699-key1 +700 None ssh-rsa 11key4plc11 user700-key1 +701 None ssh-rsa 11key4plc11 user701-key1 +702 None ssh-rsa 11key4plc11 user702-key1 +703 None ssh-rsa 11key4plc11 user703-key1 +704 None ssh-rsa 11key4plc11 user704-key1 +705 None ssh-rsa 11key4plc11 user705-key1 +706 None ssh-rsa 11key4plc11 user706-key1 +707 None ssh-rsa 11key4plc11 user707-key1 +708 None ssh-rsa 11key4plc11 user708-key1 +709 None ssh-rsa 11key4plc11 user709-key1 +710 None ssh-rsa 11key4plc11 user710-key1 +711 None ssh-rsa 11key4plc11 user711-key1 +712 None ssh-rsa 11key4plc11 user712-key1 +713 None ssh-rsa 11key4plc11 user713-key1 +714 None ssh-rsa 11key4plc11 user714-key1 +715 None ssh-rsa 11key4plc11 user715-key1 +716 None ssh-rsa 11key4plc11 user716-key1 +717 None ssh-rsa 11key4plc11 user717-key1 +718 None ssh-rsa 11key4plc11 user718-key1 +719 None ssh-rsa 11key4plc11 user719-key1 +720 None ssh-rsa 11key4plc11 user720-key1 +721 None ssh-rsa 11key4plc11 user721-key1 +722 None ssh-rsa 11key4plc11 user722-key1 +723 None ssh-rsa 11key4plc11 user723-key1 +724 None ssh-rsa 11key4plc11 user724-key1 +725 None ssh-rsa 11key4plc11 user725-key1 +726 None ssh-rsa 11key4plc11 user726-key1 +727 None ssh-rsa 11key4plc11 user727-key1 +728 None ssh-rsa 11key4plc11 user728-key1 +729 None ssh-rsa 11key4plc11 user729-key1 +730 None ssh-rsa 11key4plc11 user730-key1 +731 None ssh-rsa 11key4plc11 user731-key1 +732 None ssh-rsa 11key4plc11 user732-key1 +733 None ssh-rsa 11key4plc11 user733-key1 +734 None ssh-rsa 11key4plc11 user734-key1 +735 None ssh-rsa 11key4plc11 user735-key1 +736 None ssh-rsa 11key4plc11 user736-key1 +737 None ssh-rsa 11key4plc11 user737-key1 +738 None ssh-rsa 11key4plc11 user738-key1 +739 None ssh-rsa 11key4plc11 user739-key1 +740 None ssh-rsa 11key4plc11 user740-key1 +741 None ssh-rsa 11key4plc11 user741-key1 +742 None ssh-rsa 11key4plc11 user742-key1 +743 None ssh-rsa 11key4plc11 user743-key1 +744 None ssh-rsa 11key4plc11 user744-key1 +745 None ssh-rsa 11key4plc11 user745-key1 +746 None ssh-rsa 11key4plc11 user746-key1 +747 None ssh-rsa 11key4plc11 user747-key1 +748 None ssh-rsa 11key4plc11 user748-key1 +749 None ssh-rsa 11key4plc11 user749-key1 +750 None ssh-rsa 11key4plc11 user750-key1 +751 None ssh-rsa 11key4plc11 user751-key1 +752 None ssh-rsa 11key4plc11 user752-key1 +753 None ssh-rsa 11key4plc11 user753-key1 +754 None ssh-rsa 11key4plc11 user754-key1 +755 None ssh-rsa 11key4plc11 user755-key1 +756 None ssh-rsa 11key4plc11 user756-key1 +757 None ssh-rsa 11key4plc11 user757-key1 +758 None ssh-rsa 11key4plc11 user758-key1 +759 None ssh-rsa 11key4plc11 user759-key1 +760 None ssh-rsa 11key4plc11 user760-key1 +761 None ssh-rsa 11key4plc11 user761-key1 +762 None ssh-rsa 11key4plc11 user762-key1 +763 None ssh-rsa 11key4plc11 user763-key1 +764 None ssh-rsa 11key4plc11 user764-key1 +765 None ssh-rsa 11key4plc11 user765-key1 +766 None ssh-rsa 11key4plc11 user766-key1 +767 None ssh-rsa 11key4plc11 user767-key1 +768 None ssh-rsa 11key4plc11 user768-key1 +769 None ssh-rsa 11key4plc11 user769-key1 +770 None ssh-rsa 11key4plc11 user770-key1 +771 None ssh-rsa 11key4plc11 user771-key1 +772 None ssh-rsa 11key4plc11 user772-key1 +773 None ssh-rsa 11key4plc11 user773-key1 +774 None ssh-rsa 11key4plc11 user774-key1 +775 None ssh-rsa 11key4plc11 user775-key1 +776 None ssh-rsa 11key4plc11 user776-key1 +777 None ssh-rsa 11key4plc11 user777-key1 +778 None ssh-rsa 11key4plc11 user778-key1 +779 None ssh-rsa 11key4plc11 user779-key1 +780 None ssh-rsa 11key4plc11 user780-key1 +781 None ssh-rsa 11key4plc11 user781-key1 +782 None ssh-rsa 11key4plc11 user782-key1 +783 None ssh-rsa 11key4plc11 user783-key1 +784 None ssh-rsa 11key4plc11 user784-key1 +785 None ssh-rsa 11key4plc11 user785-key1 +786 None ssh-rsa 11key4plc11 user786-key1 +787 None ssh-rsa 11key4plc11 user787-key1 +788 None ssh-rsa 11key4plc11 user788-key1 +789 None ssh-rsa 11key4plc11 user789-key1 +790 None ssh-rsa 11key4plc11 user790-key1 +791 None ssh-rsa 11key4plc11 user791-key1 +792 None ssh-rsa 11key4plc11 user792-key1 +793 None ssh-rsa 11key4plc11 user793-key1 +794 None ssh-rsa 11key4plc11 user794-key1 +795 None ssh-rsa 11key4plc11 user795-key1 +796 None ssh-rsa 11key4plc11 user796-key1 +797 None ssh-rsa 11key4plc11 user797-key1 +798 None ssh-rsa 11key4plc11 user798-key1 +799 None ssh-rsa 11key4plc11 user799-key1 +800 None ssh-rsa 11key4plc11 user800-key1 +801 None ssh-rsa 11key4plc11 user801-key1 +802 None ssh-rsa 11key4plc11 user802-key1 +803 None ssh-rsa 11key4plc11 user803-key1 +804 None ssh-rsa 11key4plc11 user804-key1 +805 None ssh-rsa 11key4plc11 user805-key1 +806 None ssh-rsa 11key4plc11 user806-key1 +807 None ssh-rsa 11key4plc11 user807-key1 +808 None ssh-rsa 11key4plc11 user808-key1 +809 None ssh-rsa 11key4plc11 user809-key1 +810 None ssh-rsa 11key4plc11 user810-key1 +811 None ssh-rsa 11key4plc11 user811-key1 +812 None ssh-rsa 11key4plc11 user812-key1 +813 None ssh-rsa 11key4plc11 user813-key1 +814 None ssh-rsa 11key4plc11 user814-key1 +815 None ssh-rsa 11key4plc11 user815-key1 +816 None ssh-rsa 11key4plc11 user816-key1 +817 None ssh-rsa 11key4plc11 user817-key1 +818 None ssh-rsa 11key4plc11 user818-key1 +819 None ssh-rsa 11key4plc11 user819-key1 +820 None ssh-rsa 11key4plc11 user820-key1 +821 None ssh-rsa 11key4plc11 user821-key1 +822 None ssh-rsa 11key4plc11 user822-key1 +823 None ssh-rsa 11key4plc11 user823-key1 +824 None ssh-rsa 11key4plc11 user824-key1 +825 None ssh-rsa 11key4plc11 user825-key1 +826 None ssh-rsa 11key4plc11 user826-key1 +827 None ssh-rsa 11key4plc11 user827-key1 +828 None ssh-rsa 11key4plc11 user828-key1 +829 None ssh-rsa 11key4plc11 user829-key1 +830 None ssh-rsa 11key4plc11 user830-key1 +831 None ssh-rsa 11key4plc11 user831-key1 +832 None ssh-rsa 11key4plc11 user832-key1 +833 None ssh-rsa 11key4plc11 user833-key1 +834 None ssh-rsa 11key4plc11 user834-key1 +835 None ssh-rsa 11key4plc11 user835-key1 +836 None ssh-rsa 11key4plc11 user836-key1 +837 None ssh-rsa 11key4plc11 user837-key1 +838 None ssh-rsa 11key4plc11 user838-key1 +839 None ssh-rsa 11key4plc11 user839-key1 +840 None ssh-rsa 11key4plc11 user840-key1 +841 None ssh-rsa 11key4plc11 user841-key1 +842 None ssh-rsa 11key4plc11 user842-key1 +843 None ssh-rsa 11key4plc11 user843-key1 +844 None ssh-rsa 11key4plc11 user844-key1 +845 None ssh-rsa 11key4plc11 user845-key1 +846 None ssh-rsa 11key4plc11 user846-key1 +847 None ssh-rsa 11key4plc11 user847-key1 +848 None ssh-rsa 11key4plc11 user848-key1 +849 None ssh-rsa 11key4plc11 user849-key1 +850 None ssh-rsa 11key4plc11 user850-key1 +851 None ssh-rsa 11key4plc11 user851-key1 +852 None ssh-rsa 11key4plc11 user852-key1 +853 None ssh-rsa 11key4plc11 user853-key1 +854 None ssh-rsa 11key4plc11 user854-key1 +855 None ssh-rsa 11key4plc11 user855-key1 +856 None ssh-rsa 11key4plc11 user856-key1 +857 None ssh-rsa 11key4plc11 user857-key1 +858 None ssh-rsa 11key4plc11 user858-key1 +859 None ssh-rsa 11key4plc11 user859-key1 +860 None ssh-rsa 11key4plc11 user860-key1 +861 None ssh-rsa 11key4plc11 user861-key1 +862 None ssh-rsa 11key4plc11 user862-key1 +863 None ssh-rsa 11key4plc11 user863-key1 +864 None ssh-rsa 11key4plc11 user864-key1 +865 None ssh-rsa 11key4plc11 user865-key1 +866 None ssh-rsa 11key4plc11 user866-key1 +867 None ssh-rsa 11key4plc11 user867-key1 +868 None ssh-rsa 11key4plc11 user868-key1 +869 None ssh-rsa 11key4plc11 user869-key1 +870 None ssh-rsa 11key4plc11 user870-key1 +871 None ssh-rsa 11key4plc11 user871-key1 +872 None ssh-rsa 11key4plc11 user872-key1 +873 None ssh-rsa 11key4plc11 user873-key1 +874 None ssh-rsa 11key4plc11 user874-key1 +875 None ssh-rsa 11key4plc11 user875-key1 +876 None ssh-rsa 11key4plc11 user876-key1 +877 None ssh-rsa 11key4plc11 user877-key1 +878 None ssh-rsa 11key4plc11 user878-key1 +879 None ssh-rsa 11key4plc11 user879-key1 +880 None ssh-rsa 11key4plc11 user880-key1 +881 None ssh-rsa 11key4plc11 user881-key1 +882 None ssh-rsa 11key4plc11 user882-key1 +883 None ssh-rsa 11key4plc11 user883-key1 +884 None ssh-rsa 11key4plc11 user884-key1 +885 None ssh-rsa 11key4plc11 user885-key1 +886 None ssh-rsa 11key4plc11 user886-key1 +887 None ssh-rsa 11key4plc11 user887-key1 +888 None ssh-rsa 11key4plc11 user888-key1 +889 None ssh-rsa 11key4plc11 user889-key1 +890 None ssh-rsa 11key4plc11 user890-key1 +891 None ssh-rsa 11key4plc11 user891-key1 +892 None ssh-rsa 11key4plc11 user892-key1 +893 None ssh-rsa 11key4plc11 user893-key1 +894 None ssh-rsa 11key4plc11 user894-key1 +895 None ssh-rsa 11key4plc11 user895-key1 +896 None ssh-rsa 11key4plc11 user896-key1 +897 None ssh-rsa 11key4plc11 user897-key1 +898 None ssh-rsa 11key4plc11 user898-key1 +899 None ssh-rsa 11key4plc11 user899-key1 +900 None ssh-rsa 11key4plc11 user900-key1 +901 None ssh-rsa 11key4plc11 user901-key1 +902 None ssh-rsa 11key4plc11 user902-key1 +903 None ssh-rsa 11key4plc11 user903-key1 +904 None ssh-rsa 11key4plc11 user904-key1 +905 None ssh-rsa 11key4plc11 user905-key1 +906 None ssh-rsa 11key4plc11 user906-key1 +907 None ssh-rsa 11key4plc11 user907-key1 +908 None ssh-rsa 11key4plc11 user908-key1 +909 None ssh-rsa 11key4plc11 user909-key1 +910 None ssh-rsa 11key4plc11 user910-key1 +911 None ssh-rsa 11key4plc11 user911-key1 +912 None ssh-rsa 11key4plc11 user912-key1 +913 None ssh-rsa 11key4plc11 user913-key1 +914 None ssh-rsa 11key4plc11 user914-key1 +915 None ssh-rsa 11key4plc11 user915-key1 +916 None ssh-rsa 11key4plc11 user916-key1 +917 None ssh-rsa 11key4plc11 user917-key1 +918 None ssh-rsa 11key4plc11 user918-key1 +919 None ssh-rsa 11key4plc11 user919-key1 +920 None ssh-rsa 11key4plc11 user920-key1 +921 None ssh-rsa 11key4plc11 user921-key1 +922 None ssh-rsa 11key4plc11 user922-key1 +923 None ssh-rsa 11key4plc11 user923-key1 +924 None ssh-rsa 11key4plc11 user924-key1 +925 None ssh-rsa 11key4plc11 user925-key1 +926 None ssh-rsa 11key4plc11 user926-key1 +927 None ssh-rsa 11key4plc11 user927-key1 +928 None ssh-rsa 11key4plc11 user928-key1 +929 None ssh-rsa 11key4plc11 user929-key1 +930 None ssh-rsa 11key4plc11 user930-key1 +931 None ssh-rsa 11key4plc11 user931-key1 +932 None ssh-rsa 11key4plc11 user932-key1 +933 None ssh-rsa 11key4plc11 user933-key1 +934 None ssh-rsa 11key4plc11 user934-key1 +935 None ssh-rsa 11key4plc11 user935-key1 +936 None ssh-rsa 11key4plc11 user936-key1 +937 None ssh-rsa 11key4plc11 user937-key1 +938 None ssh-rsa 11key4plc11 user938-key1 +939 None ssh-rsa 11key4plc11 user939-key1 +940 None ssh-rsa 11key4plc11 user940-key1 +941 None ssh-rsa 11key4plc11 user941-key1 +942 None ssh-rsa 11key4plc11 user942-key1 +943 None ssh-rsa 11key4plc11 user943-key1 +944 None ssh-rsa 11key4plc11 user944-key1 +945 None ssh-rsa 11key4plc11 user945-key1 +946 None ssh-rsa 11key4plc11 user946-key1 +947 None ssh-rsa 11key4plc11 user947-key1 +948 None ssh-rsa 11key4plc11 user948-key1 +949 None ssh-rsa 11key4plc11 user949-key1 +950 None ssh-rsa 11key4plc11 user950-key1 +951 None ssh-rsa 11key4plc11 user951-key1 +952 None ssh-rsa 11key4plc11 user952-key1 +953 None ssh-rsa 11key4plc11 user953-key1 +954 None ssh-rsa 11key4plc11 user954-key1 +955 None ssh-rsa 11key4plc11 user955-key1 +956 None ssh-rsa 11key4plc11 user956-key1 +957 None ssh-rsa 11key4plc11 user957-key1 +958 None ssh-rsa 11key4plc11 user958-key1 +959 None ssh-rsa 11key4plc11 user959-key1 +960 None ssh-rsa 11key4plc11 user960-key1 +961 None ssh-rsa 11key4plc11 user961-key1 +962 None ssh-rsa 11key4plc11 user962-key1 +963 None ssh-rsa 11key4plc11 user963-key1 +964 None ssh-rsa 11key4plc11 user964-key1 +965 None ssh-rsa 11key4plc11 user965-key1 +966 None ssh-rsa 11key4plc11 user966-key1 +967 None ssh-rsa 11key4plc11 user967-key1 +968 None ssh-rsa 11key4plc11 user968-key1 +969 None ssh-rsa 11key4plc11 user969-key1 +970 None ssh-rsa 11key4plc11 user970-key1 +971 None ssh-rsa 11key4plc11 user971-key1 +972 None ssh-rsa 11key4plc11 user972-key1 +973 None ssh-rsa 11key4plc11 user973-key1 +974 None ssh-rsa 11key4plc11 user974-key1 +975 None ssh-rsa 11key4plc11 user975-key1 +976 None ssh-rsa 11key4plc11 user976-key1 +977 None ssh-rsa 11key4plc11 user977-key1 +978 None ssh-rsa 11key4plc11 user978-key1 +979 None ssh-rsa 11key4plc11 user979-key1 +980 None ssh-rsa 11key4plc11 user980-key1 +981 None ssh-rsa 11key4plc11 user981-key1 +982 None ssh-rsa 11key4plc11 user982-key1 +983 None ssh-rsa 11key4plc11 user983-key1 +984 None ssh-rsa 11key4plc11 user984-key1 +985 None ssh-rsa 11key4plc11 user985-key1 +986 None ssh-rsa 11key4plc11 user986-key1 +987 None ssh-rsa 11key4plc11 user987-key1 +988 None ssh-rsa 11key4plc11 user988-key1 +989 None ssh-rsa 11key4plc11 user989-key1 +990 None ssh-rsa 11key4plc11 user990-key1 +991 None ssh-rsa 11key4plc11 user991-key1 +992 None ssh-rsa 11key4plc11 user992-key1 +993 None ssh-rsa 11key4plc11 user993-key1 +994 None ssh-rsa 11key4plc11 user994-key1 +995 None ssh-rsa 11key4plc11 user995-key1 +996 None ssh-rsa 11key4plc11 user996-key1 +997 None ssh-rsa 11key4plc11 user997-key1 +998 None ssh-rsa 11key4plc11 user998-key1 +999 None ssh-rsa 11key4plc11 user999-key1 +1000 None ssh-rsa 11key4plc11 user1000-key1 +1001 None ssh-rsa 11key4plc11 user1001-key1 +1002 None ssh-rsa 11key4plc11 user1002-key1 +1003 None ssh-rsa 11key4plc11 user1003-key1 +1004 None ssh-rsa 11key4plc11 user1004-key1 +1005 None ssh-rsa 11key4plc11 user1005-key1 +1006 None ssh-rsa 11key4plc11 user1006-key1 +1007 None ssh-rsa 11key4plc11 user1007-key1 +1008 None ssh-rsa 11key4plc11 user1008-key1 +1009 None ssh-rsa 11key4plc11 user1009-key1 +1010 None ssh-rsa 11key4plc11 user1010-key1 +1011 None ssh-rsa 11key4plc11 user1011-key1 +1012 None ssh-rsa 11key4plc11 user1012-key1 +1013 None ssh-rsa 11key4plc11 user1013-key1 +1014 None ssh-rsa 11key4plc11 user1014-key1 +1015 None ssh-rsa 11key4plc11 user1015-key1 +1016 None ssh-rsa 11key4plc11 user1016-key1 +1017 None ssh-rsa 11key4plc11 user1017-key1 +1018 None ssh-rsa 11key4plc11 user1018-key1 +1019 None ssh-rsa 11key4plc11 user1019-key1 +1020 None ssh-rsa 11key4plc11 user1020-key1 +1021 None ssh-rsa 11key4plc11 user1021-key1 +1022 None ssh-rsa 11key4plc11 user1022-key1 +1023 None ssh-rsa 11key4plc11 user1023-key1 +1024 None ssh-rsa 11key4plc11 user1024-key1 +1025 None ssh-rsa 11key4plc11 user1025-key1 +1026 None ssh-rsa 11key4plc11 user1026-key1 +1027 None ssh-rsa 11key4plc11 user1027-key1 +1028 None ssh-rsa 11key4plc11 user1028-key1 +1029 None ssh-rsa 11key4plc11 user1029-key1 +1030 None ssh-rsa 11key4plc11 user1030-key1 +1031 None ssh-rsa 11key4plc11 user1031-key1 +1032 None ssh-rsa 11key4plc11 user1032-key1 +1033 None ssh-rsa 11key4plc11 user1033-key1 +1034 None ssh-rsa 11key4plc11 user1034-key1 +1035 None ssh-rsa 11key4plc11 user1035-key1 +1036 None ssh-rsa 11key4plc11 user1036-key1 +1037 None ssh-rsa 11key4plc11 user1037-key1 +1038 None ssh-rsa 11key4plc11 user1038-key1 +1039 None ssh-rsa 11key4plc11 user1039-key1 +1040 None ssh-rsa 11key4plc11 user1040-key1 +1041 None ssh-rsa 11key4plc11 user1041-key1 +1042 None ssh-rsa 11key4plc11 user1042-key1 +1043 None ssh-rsa 11key4plc11 user1043-key1 +1044 None ssh-rsa 11key4plc11 user1044-key1 +1045 None ssh-rsa 11key4plc11 user1045-key1 +1046 None ssh-rsa 11key4plc11 user1046-key1 +1047 None ssh-rsa 11key4plc11 user1047-key1 +1048 None ssh-rsa 11key4plc11 user1048-key1 +1049 None ssh-rsa 11key4plc11 user1049-key1 +1050 None ssh-rsa 11key4plc11 user1050-key1 +1051 None ssh-rsa 11key4plc11 user1051-key1 +1052 None ssh-rsa 11key4plc11 user1052-key1 +1053 None ssh-rsa 11key4plc11 user1053-key1 +1054 None ssh-rsa 11key4plc11 user1054-key1 +1055 None ssh-rsa 11key4plc11 user1055-key1 +1056 None ssh-rsa 11key4plc11 user1056-key1 +1057 None ssh-rsa 11key4plc11 user1057-key1 +1058 None ssh-rsa 11key4plc11 user1058-key1 +1059 None ssh-rsa 11key4plc11 user1059-key1 +1060 None ssh-rsa 11key4plc11 user1060-key1 +1061 None ssh-rsa 11key4plc11 user1061-key1 +1062 None ssh-rsa 11key4plc11 user1062-key1 +1063 None ssh-rsa 11key4plc11 user1063-key1 +1064 None ssh-rsa 11key4plc11 user1064-key1 +1065 None ssh-rsa 11key4plc11 user1065-key1 +1066 None ssh-rsa 11key4plc11 user1066-key1 +1067 None ssh-rsa 11key4plc11 user1067-key1 +1068 None ssh-rsa 11key4plc11 user1068-key1 +1069 None ssh-rsa 11key4plc11 user1069-key1 +1070 None ssh-rsa 11key4plc11 user1070-key1 +1071 None ssh-rsa 11key4plc11 user1071-key1 +1072 None ssh-rsa 11key4plc11 user1072-key1 +1073 None ssh-rsa 11key4plc11 user1073-key1 +1074 None ssh-rsa 11key4plc11 user1074-key1 +1075 None ssh-rsa 11key4plc11 user1075-key1 +1076 None ssh-rsa 11key4plc11 user1076-key1 +1077 None ssh-rsa 11key4plc11 user1077-key1 +1078 None ssh-rsa 11key4plc11 user1078-key1 +1079 None ssh-rsa 11key4plc11 user1079-key1 +1080 None ssh-rsa 11key4plc11 user1080-key1 +1081 None ssh-rsa 11key4plc11 user1081-key1 +1082 None ssh-rsa 11key4plc11 user1082-key1 +1083 None ssh-rsa 11key4plc11 user1083-key1 +1084 None ssh-rsa 11key4plc11 user1084-key1 +1085 None ssh-rsa 11key4plc11 user1085-key1 +1086 None ssh-rsa 11key4plc11 user1086-key1 +1087 None ssh-rsa 11key4plc11 user1087-key1 +1088 None ssh-rsa 11key4plc11 user1088-key1 +1089 None ssh-rsa 11key4plc11 user1089-key1 +1090 None ssh-rsa 11key4plc11 user1090-key1 +1091 None ssh-rsa 11key4plc11 user1091-key1 +1092 None ssh-rsa 11key4plc11 user1092-key1 +1093 None ssh-rsa 11key4plc11 user1093-key1 +1094 None ssh-rsa 11key4plc11 user1094-key1 +1095 None ssh-rsa 11key4plc11 user1095-key1 +1096 None ssh-rsa 11key4plc11 user1096-key1 +1097 None ssh-rsa 11key4plc11 user1097-key1 +1098 None ssh-rsa 11key4plc11 user1098-key1 +1099 None ssh-rsa 11key4plc11 user1099-key1 +1100 None ssh-rsa 11key4plc11 user1100-key1 +1101 None ssh-rsa 11key4plc11 user1101-key1 +1102 None ssh-rsa 11key4plc11 user1102-key1 +1103 None ssh-rsa 11key4plc11 user1103-key1 +1104 None ssh-rsa 11key4plc11 user1104-key1 +1105 None ssh-rsa 11key4plc11 user1105-key1 +1106 None ssh-rsa 11key4plc11 user1106-key1 +1107 None ssh-rsa 11key4plc11 user1107-key1 +1108 None ssh-rsa 11key4plc11 user1108-key1 +1109 None ssh-rsa 11key4plc11 user1109-key1 +1110 None ssh-rsa 11key4plc11 user1110-key1 +1111 None ssh-rsa 11key4plc11 user1111-key1 +1112 None ssh-rsa 11key4plc11 user1112-key1 +1113 None ssh-rsa 11key4plc11 user1113-key1 +1114 None ssh-rsa 11key4plc11 user1114-key1 +1115 None ssh-rsa 11key4plc11 user1115-key1 +1116 None ssh-rsa 11key4plc11 user1116-key1 +1117 None ssh-rsa 11key4plc11 user1117-key1 +1118 None ssh-rsa 11key4plc11 user1118-key1 +1119 None ssh-rsa 11key4plc11 user1119-key1 +1120 None ssh-rsa 11key4plc11 user1120-key1 +1121 None ssh-rsa 11key4plc11 user1121-key1 +1122 None ssh-rsa 11key4plc11 user1122-key1 +1123 None ssh-rsa 11key4plc11 user1123-key1 +1124 None ssh-rsa 11key4plc11 user1124-key1 +1125 None ssh-rsa 11key4plc11 user1125-key1 +1126 None ssh-rsa 11key4plc11 user1126-key1 +1127 None ssh-rsa 11key4plc11 user1127-key1 +1128 None ssh-rsa 11key4plc11 user1128-key1 +1129 None ssh-rsa 11key4plc11 user1129-key1 +1130 None ssh-rsa 11key4plc11 user1130-key1 +1131 None ssh-rsa 11key4plc11 user1131-key1 +1132 None ssh-rsa 11key4plc11 user1132-key1 +1133 None ssh-rsa 11key4plc11 user1133-key1 +1134 None ssh-rsa 11key4plc11 user1134-key1 +1135 None ssh-rsa 11key4plc11 user1135-key1 +1136 None ssh-rsa 11key4plc11 user1136-key1 +1137 None ssh-rsa 11key4plc11 user1137-key1 +1138 None ssh-rsa 11key4plc11 user1138-key1 +1139 None ssh-rsa 11key4plc11 user1139-key1 +1140 None ssh-rsa 11key4plc11 user1140-key1 +1141 None ssh-rsa 11key4plc11 user1141-key1 +1142 None ssh-rsa 11key4plc11 user1142-key1 +1143 None ssh-rsa 11key4plc11 user1143-key1 +1144 None ssh-rsa 11key4plc11 user1144-key1 +1145 None ssh-rsa 11key4plc11 user1145-key1 +1146 None ssh-rsa 11key4plc11 user1146-key1 +1147 None ssh-rsa 11key4plc11 user1147-key1 +1148 None ssh-rsa 11key4plc11 user1148-key1 +1149 None ssh-rsa 11key4plc11 user1149-key1 +1150 None ssh-rsa 11key4plc11 user1150-key1 +1151 None ssh-rsa 11key4plc11 user1151-key1 +1152 None ssh-rsa 11key4plc11 user1152-key1 +1153 None ssh-rsa 11key4plc11 user1153-key1 +1154 None ssh-rsa 11key4plc11 user1154-key1 +1155 None ssh-rsa 11key4plc11 user1155-key1 +1156 None ssh-rsa 11key4plc11 user1156-key1 +1157 None ssh-rsa 11key4plc11 user1157-key1 +1158 None ssh-rsa 11key4plc11 user1158-key1 +1159 None ssh-rsa 11key4plc11 user1159-key1 +1160 None ssh-rsa 11key4plc11 user1160-key1 +1161 None ssh-rsa 11key4plc11 user1161-key1 +1162 None ssh-rsa 11key4plc11 user1162-key1 +1163 None ssh-rsa 11key4plc11 user1163-key1 +1164 None ssh-rsa 11key4plc11 user1164-key1 +1165 None ssh-rsa 11key4plc11 user1165-key1 +1166 None ssh-rsa 11key4plc11 user1166-key1 +1167 None ssh-rsa 11key4plc11 user1167-key1 +1168 None ssh-rsa 11key4plc11 user1168-key1 +1169 None ssh-rsa 11key4plc11 user1169-key1 +1170 None ssh-rsa 11key4plc11 user1170-key1 +1171 None ssh-rsa 11key4plc11 user1171-key1 +1172 None ssh-rsa 11key4plc11 user1172-key1 +1173 None ssh-rsa 11key4plc11 user1173-key1 +1174 None ssh-rsa 11key4plc11 user1174-key1 +1175 None ssh-rsa 11key4plc11 user1175-key1 +1176 None ssh-rsa 11key4plc11 user1176-key1 +1177 None ssh-rsa 11key4plc11 user1177-key1 +1178 None ssh-rsa 11key4plc11 user1178-key1 +1179 None ssh-rsa 11key4plc11 user1179-key1 +1180 None ssh-rsa 11key4plc11 user1180-key1 +1181 None ssh-rsa 11key4plc11 user1181-key1 +1182 None ssh-rsa 11key4plc11 user1182-key1 +1183 None ssh-rsa 11key4plc11 user1183-key1 +1184 None ssh-rsa 11key4plc11 user1184-key1 +1185 None ssh-rsa 11key4plc11 user1185-key1 +1186 None ssh-rsa 11key4plc11 user1186-key1 +1187 None ssh-rsa 11key4plc11 user1187-key1 +1188 None ssh-rsa 11key4plc11 user1188-key1 +1189 None ssh-rsa 11key4plc11 user1189-key1 +1190 None ssh-rsa 11key4plc11 user1190-key1 +1191 None ssh-rsa 11key4plc11 user1191-key1 +1192 None ssh-rsa 11key4plc11 user1192-key1 +1193 None ssh-rsa 11key4plc11 user1193-key1 +1194 None ssh-rsa 11key4plc11 user1194-key1 +1195 None ssh-rsa 11key4plc11 user1195-key1 +1196 None ssh-rsa 11key4plc11 user1196-key1 +1197 None ssh-rsa 11key4plc11 user1197-key1 +1198 None ssh-rsa 11key4plc11 user1198-key1 +1199 None ssh-rsa 11key4plc11 user1199-key1 +1200 None ssh-rsa 11key4plc11 user1200-key1 +1201 None ssh-rsa 11key4plc11 user1201-key1 +1202 None ssh-rsa 11key4plc11 user1202-key1 +1203 None ssh-rsa 11key4plc11 user1203-key1 +1204 None ssh-rsa 11key4plc11 user1204-key1 +1205 None ssh-rsa 11key4plc11 user1205-key1 +1206 None ssh-rsa 11key4plc11 user1206-key1 +1207 None ssh-rsa 11key4plc11 user1207-key1 +1208 None ssh-rsa 11key4plc11 user1208-key1 +1209 None ssh-rsa 11key4plc11 user1209-key1 +1210 None ssh-rsa 11key4plc11 user1210-key1 +1211 None ssh-rsa 11key4plc11 user1211-key1 +1212 None ssh-rsa 11key4plc11 user1212-key1 +1213 None ssh-rsa 11key4plc11 user1213-key1 +1214 None ssh-rsa 11key4plc11 user1214-key1 +1215 None ssh-rsa 11key4plc11 user1215-key1 +1216 None ssh-rsa 11key4plc11 user1216-key1 +1217 None ssh-rsa 11key4plc11 user1217-key1 +1218 None ssh-rsa 11key4plc11 user1218-key1 +1219 None ssh-rsa 11key4plc11 user1219-key1 +1220 None ssh-rsa 11key4plc11 user1220-key1 +1221 None ssh-rsa 11key4plc11 user1221-key1 +1222 None ssh-rsa 11key4plc11 user1222-key1 +1223 None ssh-rsa 11key4plc11 user1223-key1 +1224 None ssh-rsa 11key4plc11 user1224-key1 +1225 None ssh-rsa 11key4plc11 user1225-key1 +1226 None ssh-rsa 11key4plc11 user1226-key1 +1227 None ssh-rsa 11key4plc11 user1227-key1 +1228 None ssh-rsa 11key4plc11 user1228-key1 +1229 None ssh-rsa 11key4plc11 user1229-key1 +1230 None ssh-rsa 11key4plc11 user1230-key1 +1231 None ssh-rsa 11key4plc11 user1231-key1 +1232 None ssh-rsa 11key4plc11 user1232-key1 +1233 None ssh-rsa 11key4plc11 user1233-key1 +1234 None ssh-rsa 11key4plc11 user1234-key1 +1235 None ssh-rsa 11key4plc11 user1235-key1 +1236 None ssh-rsa 11key4plc11 user1236-key1 +1237 None ssh-rsa 11key4plc11 user1237-key1 +1238 None ssh-rsa 11key4plc11 user1238-key1 +1239 None ssh-rsa 11key4plc11 user1239-key1 +1240 None ssh-rsa 11key4plc11 user1240-key1 +1241 None ssh-rsa 11key4plc11 user1241-key1 +1242 None ssh-rsa 11key4plc11 user1242-key1 +1243 None ssh-rsa 11key4plc11 user1243-key1 +1244 None ssh-rsa 11key4plc11 user1244-key1 +1245 None ssh-rsa 11key4plc11 user1245-key1 +1246 None ssh-rsa 11key4plc11 user1246-key1 +1247 None ssh-rsa 11key4plc11 user1247-key1 +1248 None ssh-rsa 11key4plc11 user1248-key1 +1249 None ssh-rsa 11key4plc11 user1249-key1 +1250 None ssh-rsa 11key4plc11 user1250-key1 +1251 None ssh-rsa 11key4plc11 user1251-key1 +1252 None ssh-rsa 11key4plc11 user1252-key1 +1253 None ssh-rsa 11key4plc11 user1253-key1 +1254 None ssh-rsa 11key4plc11 user1254-key1 +1255 None ssh-rsa 11key4plc11 user1255-key1 +1256 None ssh-rsa 11key4plc11 user1256-key1 +1257 None ssh-rsa 11key4plc11 user1257-key1 +1258 None ssh-rsa 11key4plc11 user1258-key1 +1259 None ssh-rsa 11key4plc11 user1259-key1 +1260 None ssh-rsa 11key4plc11 user1260-key1 +1261 None ssh-rsa 11key4plc11 user1261-key1 +1262 None ssh-rsa 11key4plc11 user1262-key1 +1263 None ssh-rsa 11key4plc11 user1263-key1 +1264 None ssh-rsa 11key4plc11 user1264-key1 +1265 None ssh-rsa 11key4plc11 user1265-key1 +1266 None ssh-rsa 11key4plc11 user1266-key1 +1267 None ssh-rsa 11key4plc11 user1267-key1 +1268 None ssh-rsa 11key4plc11 user1268-key1 +1269 None ssh-rsa 11key4plc11 user1269-key1 +1270 None ssh-rsa 11key4plc11 user1270-key1 +1271 None ssh-rsa 11key4plc11 user1271-key1 +1272 None ssh-rsa 11key4plc11 user1272-key1 +1273 None ssh-rsa 11key4plc11 user1273-key1 +1274 None ssh-rsa 11key4plc11 user1274-key1 +1275 None ssh-rsa 11key4plc11 user1275-key1 +1276 None ssh-rsa 11key4plc11 user1276-key1 +1277 None ssh-rsa 11key4plc11 user1277-key1 +1278 None ssh-rsa 11key4plc11 user1278-key1 +1279 None ssh-rsa 11key4plc11 user1279-key1 +1280 None ssh-rsa 11key4plc11 user1280-key1 +1281 None ssh-rsa 11key4plc11 user1281-key1 +1282 None ssh-rsa 11key4plc11 user1282-key1 +1283 None ssh-rsa 11key4plc11 user1283-key1 +1284 None ssh-rsa 11key4plc11 user1284-key1 +1285 None ssh-rsa 11key4plc11 user1285-key1 +1286 None ssh-rsa 11key4plc11 user1286-key1 +1287 None ssh-rsa 11key4plc11 user1287-key1 +1288 None ssh-rsa 11key4plc11 user1288-key1 +1289 None ssh-rsa 11key4plc11 user1289-key1 +1290 None ssh-rsa 11key4plc11 user1290-key1 +1291 None ssh-rsa 11key4plc11 user1291-key1 +1292 None ssh-rsa 11key4plc11 user1292-key1 +1293 None ssh-rsa 11key4plc11 user1293-key1 +1294 None ssh-rsa 11key4plc11 user1294-key1 +1295 None ssh-rsa 11key4plc11 user1295-key1 +1296 None ssh-rsa 11key4plc11 user1296-key1 +1297 None ssh-rsa 11key4plc11 user1297-key1 +1298 None ssh-rsa 11key4plc11 user1298-key1 +1299 None ssh-rsa 11key4plc11 user1299-key1 +1300 None ssh-rsa 11key4plc11 user1300-key1 +1301 None ssh-rsa 11key4plc11 user1301-key1 +1302 None ssh-rsa 11key4plc11 user1302-key1 +1303 None ssh-rsa 11key4plc11 user1303-key1 +1304 None ssh-rsa 11key4plc11 user1304-key1 +1305 None ssh-rsa 11key4plc11 user1305-key1 +1306 None ssh-rsa 11key4plc11 user1306-key1 +1307 None ssh-rsa 11key4plc11 user1307-key1 +1308 None ssh-rsa 11key4plc11 user1308-key1 +1309 None ssh-rsa 11key4plc11 user1309-key1 +1310 None ssh-rsa 11key4plc11 user1310-key1 +1311 None ssh-rsa 11key4plc11 user1311-key1 +1312 None ssh-rsa 11key4plc11 user1312-key1 +1313 None ssh-rsa 11key4plc11 user1313-key1 +1314 None ssh-rsa 11key4plc11 user1314-key1 +1315 None ssh-rsa 11key4plc11 user1315-key1 +1316 None ssh-rsa 11key4plc11 user1316-key1 +1317 None ssh-rsa 11key4plc11 user1317-key1 +1318 None ssh-rsa 11key4plc11 user1318-key1 +1319 None ssh-rsa 11key4plc11 user1319-key1 +1320 None ssh-rsa 11key4plc11 user1320-key1 +1321 None ssh-rsa 11key4plc11 user1321-key1 +1322 None ssh-rsa 11key4plc11 user1322-key1 +1323 None ssh-rsa 11key4plc11 user1323-key1 +1324 None ssh-rsa 11key4plc11 user1324-key1 +1325 None ssh-rsa 11key4plc11 user1325-key1 +1326 None ssh-rsa 11key4plc11 user1326-key1 +1327 None ssh-rsa 11key4plc11 user1327-key1 +1328 None ssh-rsa 11key4plc11 user1328-key1 +1329 None ssh-rsa 11key4plc11 user1329-key1 +1330 None ssh-rsa 11key4plc11 user1330-key1 +1331 None ssh-rsa 11key4plc11 user1331-key1 +1332 None ssh-rsa 11key4plc11 user1332-key1 +1333 None ssh-rsa 11key4plc11 user1333-key1 +1334 None ssh-rsa 11key4plc11 user1334-key1 +1335 None ssh-rsa 11key4plc11 user1335-key1 +1336 None ssh-rsa 11key4plc11 user1336-key1 +1337 None ssh-rsa 11key4plc11 user1337-key1 +1338 None ssh-rsa 11key4plc11 user1338-key1 +1339 None ssh-rsa 11key4plc11 user1339-key1 +1340 None ssh-rsa 11key4plc11 user1340-key1 +1341 None ssh-rsa 11key4plc11 user1341-key1 +1342 None ssh-rsa 11key4plc11 user1342-key1 +1343 None ssh-rsa 11key4plc11 user1343-key1 +1344 None ssh-rsa 11key4plc11 user1344-key1 +1345 None ssh-rsa 11key4plc11 user1345-key1 +1346 None ssh-rsa 11key4plc11 user1346-key1 +1347 None ssh-rsa 11key4plc11 user1347-key1 +1348 None ssh-rsa 11key4plc11 user1348-key1 +1349 None ssh-rsa 11key4plc11 user1349-key1 +1350 None ssh-rsa 11key4plc11 user1350-key1 +1351 None ssh-rsa 11key4plc11 user1351-key1 +1352 None ssh-rsa 11key4plc11 user1352-key1 +1353 None ssh-rsa 11key4plc11 user1353-key1 +1354 None ssh-rsa 11key4plc11 user1354-key1 +1355 None ssh-rsa 11key4plc11 user1355-key1 +1356 None ssh-rsa 11key4plc11 user1356-key1 +1357 None ssh-rsa 11key4plc11 user1357-key1 +1358 None ssh-rsa 11key4plc11 user1358-key1 +1359 None ssh-rsa 11key4plc11 user1359-key1 +1360 None ssh-rsa 11key4plc11 user1360-key1 +1361 None ssh-rsa 11key4plc11 user1361-key1 +1362 None ssh-rsa 11key4plc11 user1362-key1 +1363 None ssh-rsa 11key4plc11 user1363-key1 +1364 None ssh-rsa 11key4plc11 user1364-key1 +1365 None ssh-rsa 11key4plc11 user1365-key1 +1366 None ssh-rsa 11key4plc11 user1366-key1 +1367 None ssh-rsa 11key4plc11 user1367-key1 +1368 None ssh-rsa 11key4plc11 user1368-key1 +1369 None ssh-rsa 11key4plc11 user1369-key1 +1370 None ssh-rsa 11key4plc11 user1370-key1 +1371 None ssh-rsa 11key4plc11 user1371-key1 +1372 None ssh-rsa 11key4plc11 user1372-key1 +1373 None ssh-rsa 11key4plc11 user1373-key1 +1374 None ssh-rsa 11key4plc11 user1374-key1 +1375 None ssh-rsa 11key4plc11 user1375-key1 +1376 None ssh-rsa 11key4plc11 user1376-key1 +1377 None ssh-rsa 11key4plc11 user1377-key1 +1378 None ssh-rsa 11key4plc11 user1378-key1 +1379 None ssh-rsa 11key4plc11 user1379-key1 +1380 None ssh-rsa 11key4plc11 user1380-key1 +1381 None ssh-rsa 11key4plc11 user1381-key1 +1382 None ssh-rsa 11key4plc11 user1382-key1 +1383 None ssh-rsa 11key4plc11 user1383-key1 +1384 None ssh-rsa 11key4plc11 user1384-key1 +1385 None ssh-rsa 11key4plc11 user1385-key1 +1386 None ssh-rsa 11key4plc11 user1386-key1 +1387 None ssh-rsa 11key4plc11 user1387-key1 +1388 None ssh-rsa 11key4plc11 user1388-key1 +1389 None ssh-rsa 11key4plc11 user1389-key1 +1390 None ssh-rsa 11key4plc11 user1390-key1 +1391 None ssh-rsa 11key4plc11 user1391-key1 +1392 None ssh-rsa 11key4plc11 user1392-key1 +1393 None ssh-rsa 11key4plc11 user1393-key1 +1394 None ssh-rsa 11key4plc11 user1394-key1 +1395 None ssh-rsa 11key4plc11 user1395-key1 +1396 None ssh-rsa 11key4plc11 user1396-key1 +1397 None ssh-rsa 11key4plc11 user1397-key1 +1398 None ssh-rsa 11key4plc11 user1398-key1 +1399 None ssh-rsa 11key4plc11 user1399-key1 +1400 None ssh-rsa 11key4plc11 user1400-key1 +1401 None ssh-rsa 11key4plc11 user1401-key1 +1402 None ssh-rsa 11key4plc11 user1402-key1 +1403 None ssh-rsa 11key4plc11 user1403-key1 +1404 None ssh-rsa 11key4plc11 user1404-key1 +1405 None ssh-rsa 11key4plc11 user1405-key1 +1406 None ssh-rsa 11key4plc11 user1406-key1 +1407 None ssh-rsa 11key4plc11 user1407-key1 +1408 None ssh-rsa 11key4plc11 user1408-key1 +1409 None ssh-rsa 11key4plc11 user1409-key1 +1410 None ssh-rsa 11key4plc11 user1410-key1 +1411 None ssh-rsa 11key4plc11 user1411-key1 +1412 None ssh-rsa 11key4plc11 user1412-key1 +1413 None ssh-rsa 11key4plc11 user1413-key1 +1414 None ssh-rsa 11key4plc11 user1414-key1 +1415 None ssh-rsa 11key4plc11 user1415-key1 +1416 None ssh-rsa 11key4plc11 user1416-key1 +1417 None ssh-rsa 11key4plc11 user1417-key1 +1418 None ssh-rsa 11key4plc11 user1418-key1 +1419 None ssh-rsa 11key4plc11 user1419-key1 +1420 None ssh-rsa 11key4plc11 user1420-key1 +1421 None ssh-rsa 11key4plc11 user1421-key1 +1422 None ssh-rsa 11key4plc11 user1422-key1 +1423 None ssh-rsa 11key4plc11 user1423-key1 +1424 None ssh-rsa 11key4plc11 user1424-key1 +1425 None ssh-rsa 11key4plc11 user1425-key1 +1426 None ssh-rsa 11key4plc11 user1426-key1 +1427 None ssh-rsa 11key4plc11 user1427-key1 +1428 None ssh-rsa 11key4plc11 user1428-key1 +1429 None ssh-rsa 11key4plc11 user1429-key1 +1430 None ssh-rsa 11key4plc11 user1430-key1 +1431 None ssh-rsa 11key4plc11 user1431-key1 +1432 None ssh-rsa 11key4plc11 user1432-key1 +1433 None ssh-rsa 11key4plc11 user1433-key1 +1434 None ssh-rsa 11key4plc11 user1434-key1 +1435 None ssh-rsa 11key4plc11 user1435-key1 +1436 None ssh-rsa 11key4plc11 user1436-key1 +1437 None ssh-rsa 11key4plc11 user1437-key1 +1438 None ssh-rsa 11key4plc11 user1438-key1 +1439 None ssh-rsa 11key4plc11 user1439-key1 +1440 None ssh-rsa 11key4plc11 user1440-key1 +1441 None ssh-rsa 11key4plc11 user1441-key1 +1442 None ssh-rsa 11key4plc11 user1442-key1 +1443 None ssh-rsa 11key4plc11 user1443-key1 +1444 None ssh-rsa 11key4plc11 user1444-key1 +1445 None ssh-rsa 11key4plc11 user1445-key1 +1446 None ssh-rsa 11key4plc11 user1446-key1 +1447 None ssh-rsa 11key4plc11 user1447-key1 +1448 None ssh-rsa 11key4plc11 user1448-key1 +1449 None ssh-rsa 11key4plc11 user1449-key1 +1450 None ssh-rsa 11key4plc11 user1450-key1 +1451 None ssh-rsa 11key4plc11 user1451-key1 +1452 None ssh-rsa 11key4plc11 user1452-key1 +1453 None ssh-rsa 11key4plc11 user1453-key1 +1454 None ssh-rsa 11key4plc11 user1454-key1 +1455 None ssh-rsa 11key4plc11 user1455-key1 +1456 None ssh-rsa 11key4plc11 user1456-key1 +1457 None ssh-rsa 11key4plc11 user1457-key1 +1458 None ssh-rsa 11key4plc11 user1458-key1 +1459 None ssh-rsa 11key4plc11 user1459-key1 +1460 None ssh-rsa 11key4plc11 user1460-key1 +1461 None ssh-rsa 11key4plc11 user1461-key1 +1462 None ssh-rsa 11key4plc11 user1462-key1 +1463 None ssh-rsa 11key4plc11 user1463-key1 +1464 None ssh-rsa 11key4plc11 user1464-key1 +1465 None ssh-rsa 11key4plc11 user1465-key1 +1466 None ssh-rsa 11key4plc11 user1466-key1 +1467 None ssh-rsa 11key4plc11 user1467-key1 +1468 None ssh-rsa 11key4plc11 user1468-key1 +1469 None ssh-rsa 11key4plc11 user1469-key1 +1470 None ssh-rsa 11key4plc11 user1470-key1 +1471 None ssh-rsa 11key4plc11 user1471-key1 +1472 None ssh-rsa 11key4plc11 user1472-key1 +1473 None ssh-rsa 11key4plc11 user1473-key1 +1474 None ssh-rsa 11key4plc11 user1474-key1 +1475 None ssh-rsa 11key4plc11 user1475-key1 +1476 None ssh-rsa 11key4plc11 user1476-key1 +1477 None ssh-rsa 11key4plc11 user1477-key1 +1478 None ssh-rsa 11key4plc11 user1478-key1 +1479 None ssh-rsa 11key4plc11 user1479-key1 +1480 None ssh-rsa 11key4plc11 user1480-key1 +1481 None ssh-rsa 11key4plc11 user1481-key1 +1482 None ssh-rsa 11key4plc11 user1482-key1 +1483 None ssh-rsa 11key4plc11 user1483-key1 +1484 None ssh-rsa 11key4plc11 user1484-key1 +1485 None ssh-rsa 11key4plc11 user1485-key1 +1486 None ssh-rsa 11key4plc11 user1486-key1 +1487 None ssh-rsa 11key4plc11 user1487-key1 +1488 None ssh-rsa 11key4plc11 user1488-key1 +1489 None ssh-rsa 11key4plc11 user1489-key1 +1490 None ssh-rsa 11key4plc11 user1490-key1 +1491 None ssh-rsa 11key4plc11 user1491-key1 +1492 None ssh-rsa 11key4plc11 user1492-key1 +1493 None ssh-rsa 11key4plc11 user1493-key1 +1494 None ssh-rsa 11key4plc11 user1494-key1 +1495 None ssh-rsa 11key4plc11 user1495-key1 +1496 None ssh-rsa 11key4plc11 user1496-key1 +1497 None ssh-rsa 11key4plc11 user1497-key1 +1498 None ssh-rsa 11key4plc11 user1498-key1 +1499 None ssh-rsa 11key4plc11 user1499-key1 +1500 None ssh-rsa 11key4plc11 user1500-key1 +1501 None ssh-rsa 11key4plc11 user1501-key1 +1502 None ssh-rsa 11key4plc11 user1502-key1 +1503 None ssh-rsa 11key4plc11 user1503-key1 +1504 None ssh-rsa 11key4plc11 user1504-key1 +1505 None ssh-rsa 11key4plc11 user1505-key1 +1506 None ssh-rsa 11key4plc11 user1506-key1 +1507 None ssh-rsa 11key4plc11 user1507-key1 +1508 None ssh-rsa 11key4plc11 user1508-key1 +1509 None ssh-rsa 11key4plc11 user1509-key1 +1510 None ssh-rsa 11key4plc11 user1510-key1 +1511 None ssh-rsa 11key4plc11 user1511-key1 +1512 None ssh-rsa 11key4plc11 user1512-key1 +1513 None ssh-rsa 11key4plc11 user1513-key1 +1514 None ssh-rsa 11key4plc11 user1514-key1 +1515 None ssh-rsa 11key4plc11 user1515-key1 +1516 None ssh-rsa 11key4plc11 user1516-key1 +1517 None ssh-rsa 11key4plc11 user1517-key1 +1518 None ssh-rsa 11key4plc11 user1518-key1 +1519 None ssh-rsa 11key4plc11 user1519-key1 +1520 None ssh-rsa 11key4plc11 user1520-key1 +1521 None ssh-rsa 11key4plc11 user1521-key1 +1522 None ssh-rsa 11key4plc11 user1522-key1 +1523 None ssh-rsa 11key4plc11 user1523-key1 +1524 None ssh-rsa 11key4plc11 user1524-key1 +1525 None ssh-rsa 11key4plc11 user1525-key1 +1526 None ssh-rsa 11key4plc11 user1526-key1 +1527 None ssh-rsa 11key4plc11 user1527-key1 +1528 None ssh-rsa 11key4plc11 user1528-key1 +1529 None ssh-rsa 11key4plc11 user1529-key1 +1530 None ssh-rsa 11key4plc11 user1530-key1 +1531 None ssh-rsa 11key4plc11 user1531-key1 +1532 None ssh-rsa 11key4plc11 user1532-key1 +1533 None ssh-rsa 11key4plc11 user1533-key1 +1534 None ssh-rsa 11key4plc11 user1534-key1 +1535 None ssh-rsa 11key4plc11 user1535-key1 +1536 None ssh-rsa 11key4plc11 user1536-key1 +1537 None ssh-rsa 11key4plc11 user1537-key1 +1538 None ssh-rsa 11key4plc11 user1538-key1 +1539 None ssh-rsa 11key4plc11 user1539-key1 +1540 None ssh-rsa 11key4plc11 user1540-key1 +1541 None ssh-rsa 11key4plc11 user1541-key1 +1542 None ssh-rsa 11key4plc11 user1542-key1 +1543 None ssh-rsa 11key4plc11 user1543-key1 +1544 None ssh-rsa 11key4plc11 user1544-key1 +1545 None ssh-rsa 11key4plc11 user1545-key1 +1546 None ssh-rsa 11key4plc11 user1546-key1 +1547 None ssh-rsa 11key4plc11 user1547-key1 +1548 None ssh-rsa 11key4plc11 user1548-key1 +1549 None ssh-rsa 11key4plc11 user1549-key1 +1550 None ssh-rsa 11key4plc11 user1550-key1 +1551 None ssh-rsa 11key4plc11 user1551-key1 +1552 None ssh-rsa 11key4plc11 user1552-key1 +1553 None ssh-rsa 11key4plc11 user1553-key1 +1554 None ssh-rsa 11key4plc11 user1554-key1 +1555 None ssh-rsa 11key4plc11 user1555-key1 +1556 None ssh-rsa 11key4plc11 user1556-key1 +1557 None ssh-rsa 11key4plc11 user1557-key1 +1558 None ssh-rsa 11key4plc11 user1558-key1 +1559 None ssh-rsa 11key4plc11 user1559-key1 +1560 None ssh-rsa 11key4plc11 user1560-key1 +1561 None ssh-rsa 11key4plc11 user1561-key1 +1562 None ssh-rsa 11key4plc11 user1562-key1 +1563 None ssh-rsa 11key4plc11 user1563-key1 +1564 None ssh-rsa 11key4plc11 user1564-key1 +1565 None ssh-rsa 11key4plc11 user1565-key1 +1566 None ssh-rsa 11key4plc11 user1566-key1 +1567 None ssh-rsa 11key4plc11 user1567-key1 +1568 None ssh-rsa 11key4plc11 user1568-key1 +1569 None ssh-rsa 11key4plc11 user1569-key1 +1570 None ssh-rsa 11key4plc11 user1570-key1 +1571 None ssh-rsa 11key4plc11 user1571-key1 +1572 None ssh-rsa 11key4plc11 user1572-key1 +1573 None ssh-rsa 11key4plc11 user1573-key1 +1574 None ssh-rsa 11key4plc11 user1574-key1 +1575 None ssh-rsa 11key4plc11 user1575-key1 +1576 None ssh-rsa 11key4plc11 user1576-key1 +1577 None ssh-rsa 11key4plc11 user1577-key1 +1578 None ssh-rsa 11key4plc11 user1578-key1 +1579 None ssh-rsa 11key4plc11 user1579-key1 +1580 None ssh-rsa 11key4plc11 user1580-key1 +1581 None ssh-rsa 11key4plc11 user1581-key1 +1582 None ssh-rsa 11key4plc11 user1582-key1 +1583 None ssh-rsa 11key4plc11 user1583-key1 +1584 None ssh-rsa 11key4plc11 user1584-key1 +1585 None ssh-rsa 11key4plc11 user1585-key1 +1586 None ssh-rsa 11key4plc11 user1586-key1 +1587 None ssh-rsa 11key4plc11 user1587-key1 +1588 None ssh-rsa 11key4plc11 user1588-key1 +1589 None ssh-rsa 11key4plc11 user1589-key1 +1590 None ssh-rsa 11key4plc11 user1590-key1 +1591 None ssh-rsa 11key4plc11 user1591-key1 +1592 None ssh-rsa 11key4plc11 user1592-key1 +1593 None ssh-rsa 11key4plc11 user1593-key1 +1594 None ssh-rsa 11key4plc11 user1594-key1 +1595 None ssh-rsa 11key4plc11 user1595-key1 +1596 None ssh-rsa 11key4plc11 user1596-key1 +1597 None ssh-rsa 11key4plc11 user1597-key1 +1598 None ssh-rsa 11key4plc11 user1598-key1 +1599 None ssh-rsa 11key4plc11 user1599-key1 +1600 None ssh-rsa 11key4plc11 user1600-key1 +1601 None ssh-rsa 11key4plc11 user1601-key1 +1602 None ssh-rsa 11key4plc11 user1602-key1 +1603 None ssh-rsa 11key4plc11 user1603-key1 +1604 None ssh-rsa 11key4plc11 user1604-key1 +1605 None ssh-rsa 11key4plc11 user1605-key1 +1606 None ssh-rsa 11key4plc11 user1606-key1 +1607 None ssh-rsa 11key4plc11 user1607-key1 +1608 None ssh-rsa 11key4plc11 user1608-key1 +1609 None ssh-rsa 11key4plc11 user1609-key1 +1610 None ssh-rsa 11key4plc11 user1610-key1 +1611 None ssh-rsa 11key4plc11 user1611-key1 +1612 None ssh-rsa 11key4plc11 user1612-key1 +1613 None ssh-rsa 11key4plc11 user1613-key1 +1614 None ssh-rsa 11key4plc11 user1614-key1 +1615 None ssh-rsa 11key4plc11 user1615-key1 +1616 None ssh-rsa 11key4plc11 user1616-key1 +1617 None ssh-rsa 11key4plc11 user1617-key1 +1618 None ssh-rsa 11key4plc11 user1618-key1 +1619 None ssh-rsa 11key4plc11 user1619-key1 +1620 None ssh-rsa 11key4plc11 user1620-key1 +1621 None ssh-rsa 11key4plc11 user1621-key1 +1622 None ssh-rsa 11key4plc11 user1622-key1 +1623 None ssh-rsa 11key4plc11 user1623-key1 +1624 None ssh-rsa 11key4plc11 user1624-key1 +1625 None ssh-rsa 11key4plc11 user1625-key1 +1626 None ssh-rsa 11key4plc11 user1626-key1 +1627 None ssh-rsa 11key4plc11 user1627-key1 +1628 None ssh-rsa 11key4plc11 user1628-key1 +1629 None ssh-rsa 11key4plc11 user1629-key1 +1630 None ssh-rsa 11key4plc11 user1630-key1 +1631 None ssh-rsa 11key4plc11 user1631-key1 +1632 None ssh-rsa 11key4plc11 user1632-key1 +1633 None ssh-rsa 11key4plc11 user1633-key1 +1634 None ssh-rsa 11key4plc11 user1634-key1 +1635 None ssh-rsa 11key4plc11 user1635-key1 +1636 None ssh-rsa 11key4plc11 user1636-key1 +1637 None ssh-rsa 11key4plc11 user1637-key1 +1638 None ssh-rsa 11key4plc11 user1638-key1 +1639 None ssh-rsa 11key4plc11 user1639-key1 +1640 None ssh-rsa 11key4plc11 user1640-key1 +1641 None ssh-rsa 11key4plc11 user1641-key1 +1642 None ssh-rsa 11key4plc11 user1642-key1 +1643 None ssh-rsa 11key4plc11 user1643-key1 +1644 None ssh-rsa 11key4plc11 user1644-key1 +1645 None ssh-rsa 11key4plc11 user1645-key1 +1646 None ssh-rsa 11key4plc11 user1646-key1 +1647 None ssh-rsa 11key4plc11 user1647-key1 +1648 None ssh-rsa 11key4plc11 user1648-key1 +1649 None ssh-rsa 11key4plc11 user1649-key1 +1650 None ssh-rsa 11key4plc11 user1650-key1 +1651 None ssh-rsa 11key4plc11 user1651-key1 +1652 None ssh-rsa 11key4plc11 user1652-key1 +1653 None ssh-rsa 11key4plc11 user1653-key1 +1654 None ssh-rsa 11key4plc11 user1654-key1 +1655 None ssh-rsa 11key4plc11 user1655-key1 +1656 None ssh-rsa 11key4plc11 user1656-key1 +1657 None ssh-rsa 11key4plc11 user1657-key1 +1658 None ssh-rsa 11key4plc11 user1658-key1 +1659 None ssh-rsa 11key4plc11 user1659-key1 +1660 None ssh-rsa 11key4plc11 user1660-key1 +1661 None ssh-rsa 11key4plc11 user1661-key1 +1662 None ssh-rsa 11key4plc11 user1662-key1 +1663 None ssh-rsa 11key4plc11 user1663-key1 +1664 None ssh-rsa 11key4plc11 user1664-key1 +1665 None ssh-rsa 11key4plc11 user1665-key1 +1666 None ssh-rsa 11key4plc11 user1666-key1 +1667 None ssh-rsa 11key4plc11 user1667-key1 +1668 None ssh-rsa 11key4plc11 user1668-key1 +1669 None ssh-rsa 11key4plc11 user1669-key1 +1670 None ssh-rsa 11key4plc11 user1670-key1 +1671 None ssh-rsa 11key4plc11 user1671-key1 +1672 None ssh-rsa 11key4plc11 user1672-key1 +1673 None ssh-rsa 11key4plc11 user1673-key1 +1674 None ssh-rsa 11key4plc11 user1674-key1 +1675 None ssh-rsa 11key4plc11 user1675-key1 +1676 None ssh-rsa 11key4plc11 user1676-key1 +1677 None ssh-rsa 11key4plc11 user1677-key1 +1678 None ssh-rsa 11key4plc11 user1678-key1 +1679 None ssh-rsa 11key4plc11 user1679-key1 +1680 None ssh-rsa 11key4plc11 user1680-key1 +1681 None ssh-rsa 11key4plc11 user1681-key1 +1682 None ssh-rsa 11key4plc11 user1682-key1 +1683 None ssh-rsa 11key4plc11 user1683-key1 +1684 None ssh-rsa 11key4plc11 user1684-key1 +1685 None ssh-rsa 11key4plc11 user1685-key1 +1686 None ssh-rsa 11key4plc11 user1686-key1 +1687 None ssh-rsa 11key4plc11 user1687-key1 +1688 None ssh-rsa 11key4plc11 user1688-key1 +1689 None ssh-rsa 11key4plc11 user1689-key1 +1690 None ssh-rsa 11key4plc11 user1690-key1 +1691 None ssh-rsa 11key4plc11 user1691-key1 +1692 None ssh-rsa 11key4plc11 user1692-key1 +1693 None ssh-rsa 11key4plc11 user1693-key1 +1694 None ssh-rsa 11key4plc11 user1694-key1 +1695 None ssh-rsa 11key4plc11 user1695-key1 +1696 None ssh-rsa 11key4plc11 user1696-key1 +1697 None ssh-rsa 11key4plc11 user1697-key1 +1698 None ssh-rsa 11key4plc11 user1698-key1 +1699 None ssh-rsa 11key4plc11 user1699-key1 +1700 None ssh-rsa 11key4plc11 user1700-key1 +1701 None ssh-rsa 11key4plc11 user1701-key1 +1702 None ssh-rsa 11key4plc11 user1702-key1 +1703 None ssh-rsa 11key4plc11 user1703-key1 +1704 None ssh-rsa 11key4plc11 user1704-key1 +1705 None ssh-rsa 11key4plc11 user1705-key1 +1706 None ssh-rsa 11key4plc11 user1706-key1 +1707 None ssh-rsa 11key4plc11 user1707-key1 +1708 None ssh-rsa 11key4plc11 user1708-key1 +1709 None ssh-rsa 11key4plc11 user1709-key1 +1710 None ssh-rsa 11key4plc11 user1710-key1 +1711 None ssh-rsa 11key4plc11 user1711-key1 +1712 None ssh-rsa 11key4plc11 user1712-key1 +1713 None ssh-rsa 11key4plc11 user1713-key1 +1714 None ssh-rsa 11key4plc11 user1714-key1 +1715 None ssh-rsa 11key4plc11 user1715-key1 +1716 None ssh-rsa 11key4plc11 user1716-key1 +1717 None ssh-rsa 11key4plc11 user1717-key1 +1718 None ssh-rsa 11key4plc11 user1718-key1 +1719 None ssh-rsa 11key4plc11 user1719-key1 +1720 None ssh-rsa 11key4plc11 user1720-key1 +1721 None ssh-rsa 11key4plc11 user1721-key1 +1722 None ssh-rsa 11key4plc11 user1722-key1 +1723 None ssh-rsa 11key4plc11 user1723-key1 +1724 None ssh-rsa 11key4plc11 user1724-key1 +1725 None ssh-rsa 11key4plc11 user1725-key1 +1726 None ssh-rsa 11key4plc11 user1726-key1 +1727 None ssh-rsa 11key4plc11 user1727-key1 +1728 None ssh-rsa 11key4plc11 user1728-key1 +1729 None ssh-rsa 11key4plc11 user1729-key1 +1730 None ssh-rsa 11key4plc11 user1730-key1 +1731 None ssh-rsa 11key4plc11 user1731-key1 +1732 None ssh-rsa 11key4plc11 user1732-key1 +1733 None ssh-rsa 11key4plc11 user1733-key1 +1734 None ssh-rsa 11key4plc11 user1734-key1 +1735 None ssh-rsa 11key4plc11 user1735-key1 +1736 None ssh-rsa 11key4plc11 user1736-key1 +1737 None ssh-rsa 11key4plc11 user1737-key1 +1738 None ssh-rsa 11key4plc11 user1738-key1 +1739 None ssh-rsa 11key4plc11 user1739-key1 +1740 None ssh-rsa 11key4plc11 user1740-key1 +1741 None ssh-rsa 11key4plc11 user1741-key1 +1742 None ssh-rsa 11key4plc11 user1742-key1 +1743 None ssh-rsa 11key4plc11 user1743-key1 +1744 None ssh-rsa 11key4plc11 user1744-key1 +1745 None ssh-rsa 11key4plc11 user1745-key1 +1746 None ssh-rsa 11key4plc11 user1746-key1 +1747 None ssh-rsa 11key4plc11 user1747-key1 +1748 None ssh-rsa 11key4plc11 user1748-key1 +1749 None ssh-rsa 11key4plc11 user1749-key1 +1750 None ssh-rsa 11key4plc11 user1750-key1 +1751 None ssh-rsa 11key4plc11 user1751-key1 +1752 None ssh-rsa 11key4plc11 user1752-key1 +1753 None ssh-rsa 11key4plc11 user1753-key1 +1754 None ssh-rsa 11key4plc11 user1754-key1 +1755 None ssh-rsa 11key4plc11 user1755-key1 +1756 None ssh-rsa 11key4plc11 user1756-key1 +1757 None ssh-rsa 11key4plc11 user1757-key1 +1758 None ssh-rsa 11key4plc11 user1758-key1 +1759 None ssh-rsa 11key4plc11 user1759-key1 +1760 None ssh-rsa 11key4plc11 user1760-key1 +1761 None ssh-rsa 11key4plc11 user1761-key1 +1762 None ssh-rsa 11key4plc11 user1762-key1 +1763 None ssh-rsa 11key4plc11 user1763-key1 +1764 None ssh-rsa 11key4plc11 user1764-key1 +1765 None ssh-rsa 11key4plc11 user1765-key1 +1766 None ssh-rsa 11key4plc11 user1766-key1 +1767 None ssh-rsa 11key4plc11 user1767-key1 +1768 None ssh-rsa 11key4plc11 user1768-key1 +1769 None ssh-rsa 11key4plc11 user1769-key1 +1770 None ssh-rsa 11key4plc11 user1770-key1 +1771 None ssh-rsa 11key4plc11 user1771-key1 +1772 None ssh-rsa 11key4plc11 user1772-key1 +1773 None ssh-rsa 11key4plc11 user1773-key1 +1774 None ssh-rsa 11key4plc11 user1774-key1 +1775 None ssh-rsa 11key4plc11 user1775-key1 +1776 None ssh-rsa 11key4plc11 user1776-key1 +1777 None ssh-rsa 11key4plc11 user1777-key1 +1778 None ssh-rsa 11key4plc11 user1778-key1 +1779 None ssh-rsa 11key4plc11 user1779-key1 +1780 None ssh-rsa 11key4plc11 user1780-key1 +1781 None ssh-rsa 11key4plc11 user1781-key1 +1782 None ssh-rsa 11key4plc11 user1782-key1 +1783 None ssh-rsa 11key4plc11 user1783-key1 +1784 None ssh-rsa 11key4plc11 user1784-key1 +1785 None ssh-rsa 11key4plc11 user1785-key1 +1786 None ssh-rsa 11key4plc11 user1786-key1 +1787 None ssh-rsa 11key4plc11 user1787-key1 +1788 None ssh-rsa 11key4plc11 user1788-key1 +1789 None ssh-rsa 11key4plc11 user1789-key1 +1790 None ssh-rsa 11key4plc11 user1790-key1 +1791 None ssh-rsa 11key4plc11 user1791-key1 +1792 None ssh-rsa 11key4plc11 user1792-key1 +1793 None ssh-rsa 11key4plc11 user1793-key1 +1794 None ssh-rsa 11key4plc11 user1794-key1 +1795 None ssh-rsa 11key4plc11 user1795-key1 +1796 None ssh-rsa 11key4plc11 user1796-key1 +1797 None ssh-rsa 11key4plc11 user1797-key1 +1798 None ssh-rsa 11key4plc11 user1798-key1 +1799 None ssh-rsa 11key4plc11 user1799-key1 +1800 None ssh-rsa 11key4plc11 user1800-key1 +1801 None ssh-rsa 11key4plc11 user1801-key1 +1802 None ssh-rsa 11key4plc11 user1802-key1 +1803 None ssh-rsa 11key4plc11 user1803-key1 +1804 None ssh-rsa 11key4plc11 user1804-key1 +1805 None ssh-rsa 11key4plc11 user1805-key1 +1806 None ssh-rsa 11key4plc11 user1806-key1 +1807 None ssh-rsa 11key4plc11 user1807-key1 +1808 None ssh-rsa 11key4plc11 user1808-key1 +1809 None ssh-rsa 11key4plc11 user1809-key1 +1810 None ssh-rsa 11key4plc11 user1810-key1 +1811 None ssh-rsa 11key4plc11 user1811-key1 +1812 None ssh-rsa 11key4plc11 user1812-key1 +1813 None ssh-rsa 11key4plc11 user1813-key1 +1814 None ssh-rsa 11key4plc11 user1814-key1 +1815 None ssh-rsa 11key4plc11 user1815-key1 +1816 None ssh-rsa 11key4plc11 user1816-key1 +1817 None ssh-rsa 11key4plc11 user1817-key1 +1818 None ssh-rsa 11key4plc11 user1818-key1 +1819 None ssh-rsa 11key4plc11 user1819-key1 +1820 None ssh-rsa 11key4plc11 user1820-key1 +1821 None ssh-rsa 11key4plc11 user1821-key1 +1822 None ssh-rsa 11key4plc11 user1822-key1 +1823 None ssh-rsa 11key4plc11 user1823-key1 +1824 None ssh-rsa 11key4plc11 user1824-key1 +1825 None ssh-rsa 11key4plc11 user1825-key1 +1826 None ssh-rsa 11key4plc11 user1826-key1 +1827 None ssh-rsa 11key4plc11 user1827-key1 +1828 None ssh-rsa 11key4plc11 user1828-key1 +1829 None ssh-rsa 11key4plc11 user1829-key1 +1830 None ssh-rsa 11key4plc11 user1830-key1 +1831 None ssh-rsa 11key4plc11 user1831-key1 +1832 None ssh-rsa 11key4plc11 user1832-key1 +1833 None ssh-rsa 11key4plc11 user1833-key1 +1834 None ssh-rsa 11key4plc11 user1834-key1 +1835 None ssh-rsa 11key4plc11 user1835-key1 +1836 None ssh-rsa 11key4plc11 user1836-key1 +1837 None ssh-rsa 11key4plc11 user1837-key1 +1838 None ssh-rsa 11key4plc11 user1838-key1 +1839 None ssh-rsa 11key4plc11 user1839-key1 +1840 None ssh-rsa 11key4plc11 user1840-key1 +1841 None ssh-rsa 11key4plc11 user1841-key1 +1842 None ssh-rsa 11key4plc11 user1842-key1 +1843 None ssh-rsa 11key4plc11 user1843-key1 +1844 None ssh-rsa 11key4plc11 user1844-key1 +1845 None ssh-rsa 11key4plc11 user1845-key1 +1846 None ssh-rsa 11key4plc11 user1846-key1 +1847 None ssh-rsa 11key4plc11 user1847-key1 +1848 None ssh-rsa 11key4plc11 user1848-key1 +1849 None ssh-rsa 11key4plc11 user1849-key1 +1850 None ssh-rsa 11key4plc11 user1850-key1 +1851 None ssh-rsa 11key4plc11 user1851-key1 +1852 None ssh-rsa 11key4plc11 user1852-key1 +1853 None ssh-rsa 11key4plc11 user1853-key1 +1854 None ssh-rsa 11key4plc11 user1854-key1 +1855 None ssh-rsa 11key4plc11 user1855-key1 +1856 None ssh-rsa 11key4plc11 user1856-key1 +1857 None ssh-rsa 11key4plc11 user1857-key1 +1858 None ssh-rsa 11key4plc11 user1858-key1 +1859 None ssh-rsa 11key4plc11 user1859-key1 +1860 None ssh-rsa 11key4plc11 user1860-key1 +1861 None ssh-rsa 11key4plc11 user1861-key1 +1862 None ssh-rsa 11key4plc11 user1862-key1 +1863 None ssh-rsa 11key4plc11 user1863-key1 +1864 None ssh-rsa 11key4plc11 user1864-key1 +1865 None ssh-rsa 11key4plc11 user1865-key1 +1866 None ssh-rsa 11key4plc11 user1866-key1 +1867 None ssh-rsa 11key4plc11 user1867-key1 +1868 None ssh-rsa 11key4plc11 user1868-key1 +1869 None ssh-rsa 11key4plc11 user1869-key1 +1870 None ssh-rsa 11key4plc11 user1870-key1 +1871 None ssh-rsa 11key4plc11 user1871-key1 +1872 None ssh-rsa 11key4plc11 user1872-key1 +1873 None ssh-rsa 11key4plc11 user1873-key1 +1874 None ssh-rsa 11key4plc11 user1874-key1 +1875 None ssh-rsa 11key4plc11 user1875-key1 +1876 None ssh-rsa 11key4plc11 user1876-key1 +1877 None ssh-rsa 11key4plc11 user1877-key1 +1878 None ssh-rsa 11key4plc11 user1878-key1 +1879 None ssh-rsa 11key4plc11 user1879-key1 +1880 None ssh-rsa 11key4plc11 user1880-key1 +1881 None ssh-rsa 11key4plc11 user1881-key1 +1882 None ssh-rsa 11key4plc11 user1882-key1 +1883 None ssh-rsa 11key4plc11 user1883-key1 +1884 None ssh-rsa 11key4plc11 user1884-key1 +1885 None ssh-rsa 11key4plc11 user1885-key1 +1886 None ssh-rsa 11key4plc11 user1886-key1 +1887 None ssh-rsa 11key4plc11 user1887-key1 +1888 None ssh-rsa 11key4plc11 user1888-key1 +1889 None ssh-rsa 11key4plc11 user1889-key1 +1890 None ssh-rsa 11key4plc11 user1890-key1 +1891 None ssh-rsa 11key4plc11 user1891-key1 +1892 None ssh-rsa 11key4plc11 user1892-key1 +1893 None ssh-rsa 11key4plc11 user1893-key1 +1894 None ssh-rsa 11key4plc11 user1894-key1 +1895 None ssh-rsa 11key4plc11 user1895-key1 +1896 None ssh-rsa 11key4plc11 user1896-key1 +1897 None ssh-rsa 11key4plc11 user1897-key1 +1898 None ssh-rsa 11key4plc11 user1898-key1 +1899 None ssh-rsa 11key4plc11 user1899-key1 +1900 None ssh-rsa 11key4plc11 user1900-key1 +1901 None ssh-rsa 11key4plc11 user1901-key1 +1902 None ssh-rsa 11key4plc11 user1902-key1 +1903 None ssh-rsa 11key4plc11 user1903-key1 +1904 None ssh-rsa 11key4plc11 user1904-key1 +1905 None ssh-rsa 11key4plc11 user1905-key1 +1906 None ssh-rsa 11key4plc11 user1906-key1 +1907 None ssh-rsa 11key4plc11 user1907-key1 +1908 None ssh-rsa 11key4plc11 user1908-key1 +1909 None ssh-rsa 11key4plc11 user1909-key1 +1910 None ssh-rsa 11key4plc11 user1910-key1 +1911 None ssh-rsa 11key4plc11 user1911-key1 +1912 None ssh-rsa 11key4plc11 user1912-key1 +1913 None ssh-rsa 11key4plc11 user1913-key1 +1914 None ssh-rsa 11key4plc11 user1914-key1 +1915 None ssh-rsa 11key4plc11 user1915-key1 +1916 None ssh-rsa 11key4plc11 user1916-key1 +1917 None ssh-rsa 11key4plc11 user1917-key1 +1918 None ssh-rsa 11key4plc11 user1918-key1 +1919 None ssh-rsa 11key4plc11 user1919-key1 +1920 None ssh-rsa 11key4plc11 user1920-key1 +1921 None ssh-rsa 11key4plc11 user1921-key1 +1922 None ssh-rsa 11key4plc11 user1922-key1 +1923 None ssh-rsa 11key4plc11 user1923-key1 +1924 None ssh-rsa 11key4plc11 user1924-key1 +1925 None ssh-rsa 11key4plc11 user1925-key1 +1926 None ssh-rsa 11key4plc11 user1926-key1 +1927 None ssh-rsa 11key4plc11 user1927-key1 +1928 None ssh-rsa 11key4plc11 user1928-key1 +1929 None ssh-rsa 11key4plc11 user1929-key1 +1930 None ssh-rsa 11key4plc11 user1930-key1 +1931 None ssh-rsa 11key4plc11 user1931-key1 +1932 None ssh-rsa 11key4plc11 user1932-key1 +1933 None ssh-rsa 11key4plc11 user1933-key1 +1934 None ssh-rsa 11key4plc11 user1934-key1 +1935 None ssh-rsa 11key4plc11 user1935-key1 +1936 None ssh-rsa 11key4plc11 user1936-key1 +1937 None ssh-rsa 11key4plc11 user1937-key1 +1938 None ssh-rsa 11key4plc11 user1938-key1 +1939 None ssh-rsa 11key4plc11 user1939-key1 +1940 None ssh-rsa 11key4plc11 user1940-key1 +1941 None ssh-rsa 11key4plc11 user1941-key1 +1942 None ssh-rsa 11key4plc11 user1942-key1 +1943 None ssh-rsa 11key4plc11 user1943-key1 +1944 None ssh-rsa 11key4plc11 user1944-key1 +1945 None ssh-rsa 11key4plc11 user1945-key1 +1946 None ssh-rsa 11key4plc11 user1946-key1 +1947 None ssh-rsa 11key4plc11 user1947-key1 +1948 None ssh-rsa 11key4plc11 user1948-key1 +1949 None ssh-rsa 11key4plc11 user1949-key1 +1950 None ssh-rsa 11key4plc11 user1950-key1 +1951 None ssh-rsa 11key4plc11 user1951-key1 +1952 None ssh-rsa 11key4plc11 user1952-key1 +1953 None ssh-rsa 11key4plc11 user1953-key1 +1954 None ssh-rsa 11key4plc11 user1954-key1 +1955 None ssh-rsa 11key4plc11 user1955-key1 +1956 None ssh-rsa 11key4plc11 user1956-key1 +1957 None ssh-rsa 11key4plc11 user1957-key1 +1958 None ssh-rsa 11key4plc11 user1958-key1 +1959 None ssh-rsa 11key4plc11 user1959-key1 +1960 None ssh-rsa 11key4plc11 user1960-key1 +1961 None ssh-rsa 11key4plc11 user1961-key1 +1962 None ssh-rsa 11key4plc11 user1962-key1 +1963 None ssh-rsa 11key4plc11 user1963-key1 +1964 None ssh-rsa 11key4plc11 user1964-key1 +1965 None ssh-rsa 11key4plc11 user1965-key1 +1966 None ssh-rsa 11key4plc11 user1966-key1 +1967 None ssh-rsa 11key4plc11 user1967-key1 +1968 None ssh-rsa 11key4plc11 user1968-key1 +1969 None ssh-rsa 11key4plc11 user1969-key1 +1970 None ssh-rsa 11key4plc11 user1970-key1 +1971 None ssh-rsa 11key4plc11 user1971-key1 +1972 None ssh-rsa 11key4plc11 user1972-key1 +1973 None ssh-rsa 11key4plc11 user1973-key1 +1974 None ssh-rsa 11key4plc11 user1974-key1 +1975 None ssh-rsa 11key4plc11 user1975-key1 +1976 None ssh-rsa 11key4plc11 user1976-key1 +1977 None ssh-rsa 11key4plc11 user1977-key1 +1978 None ssh-rsa 11key4plc11 user1978-key1 +1979 None ssh-rsa 11key4plc11 user1979-key1 +1980 None ssh-rsa 11key4plc11 user1980-key1 +1981 None ssh-rsa 11key4plc11 user1981-key1 +1982 None ssh-rsa 11key4plc11 user1982-key1 +1983 None ssh-rsa 11key4plc11 user1983-key1 +1984 None ssh-rsa 11key4plc11 user1984-key1 +1985 None ssh-rsa 11key4plc11 user1985-key1 +1986 None ssh-rsa 11key4plc11 user1986-key1 +1987 None ssh-rsa 11key4plc11 user1987-key1 +1988 None ssh-rsa 11key4plc11 user1988-key1 +1989 None ssh-rsa 11key4plc11 user1989-key1 +1990 None ssh-rsa 11key4plc11 user1990-key1 +1991 None ssh-rsa 11key4plc11 user1991-key1 +1992 None ssh-rsa 11key4plc11 user1992-key1 +1993 None ssh-rsa 11key4plc11 user1993-key1 +1994 None ssh-rsa 11key4plc11 user1994-key1 +1995 None ssh-rsa 11key4plc11 user1995-key1 +1996 None ssh-rsa 11key4plc11 user1996-key1 +1997 None ssh-rsa 11key4plc11 user1997-key1 +1998 None ssh-rsa 11key4plc11 user1998-key1 +1999 None ssh-rsa 11key4plc11 user1999-key1 +2000 None ssh-rsa 11key4plc11 user2000-key1 +2001 1 ssh-rsa 22key4plc22 user1-key1 +2002 1 ssh-rsa 22key4plc22 user2-key1 +2003 1 ssh-rsa 22key4plc22 user3-key1 +2004 1 ssh-rsa 22key4plc22 user4-key1 +2005 1 ssh-rsa 22key4plc22 user5-key1 +2006 1 ssh-rsa 22key4plc22 user6-key1 +2007 1 ssh-rsa 22key4plc22 user7-key1 +2008 1 ssh-rsa 22key4plc22 user8-key1 +2009 1 ssh-rsa 22key4plc22 user9-key1 +2010 1 ssh-rsa 22key4plc22 user10-key1 +2011 1 ssh-rsa 22key4plc22 user11-key1 +2012 1 ssh-rsa 22key4plc22 user12-key1 +2013 1 ssh-rsa 22key4plc22 user13-key1 +2014 1 ssh-rsa 22key4plc22 user14-key1 +2015 1 ssh-rsa 22key4plc22 user15-key1 +2016 1 ssh-rsa 22key4plc22 user16-key1 +2017 1 ssh-rsa 22key4plc22 user17-key1 +2018 1 ssh-rsa 22key4plc22 user18-key1 +2019 1 ssh-rsa 22key4plc22 user19-key1 +2020 1 ssh-rsa 22key4plc22 user20-key1 +2021 1 ssh-rsa 22key4plc22 user21-key1 +2022 1 ssh-rsa 22key4plc22 user22-key1 +2023 1 ssh-rsa 22key4plc22 user23-key1 +2024 1 ssh-rsa 22key4plc22 user24-key1 +2025 1 ssh-rsa 22key4plc22 user25-key1 +2026 1 ssh-rsa 22key4plc22 user26-key1 +2027 1 ssh-rsa 22key4plc22 user27-key1 +2028 1 ssh-rsa 22key4plc22 user28-key1 +2029 1 ssh-rsa 22key4plc22 user29-key1 +2030 1 ssh-rsa 22key4plc22 user30-key1 +2031 1 ssh-rsa 22key4plc22 user31-key1 +2032 1 ssh-rsa 22key4plc22 user32-key1 +2033 1 ssh-rsa 22key4plc22 user33-key1 +2034 1 ssh-rsa 22key4plc22 user34-key1 +2035 1 ssh-rsa 22key4plc22 user35-key1 +2036 1 ssh-rsa 22key4plc22 user36-key1 +2037 1 ssh-rsa 22key4plc22 user37-key1 +2038 1 ssh-rsa 22key4plc22 user38-key1 +2039 1 ssh-rsa 22key4plc22 user39-key1 +2040 1 ssh-rsa 22key4plc22 user40-key1 +2041 1 ssh-rsa 22key4plc22 user41-key1 +2042 1 ssh-rsa 22key4plc22 user42-key1 +2043 1 ssh-rsa 22key4plc22 user43-key1 +2044 1 ssh-rsa 22key4plc22 user44-key1 +2045 1 ssh-rsa 22key4plc22 user45-key1 +2046 1 ssh-rsa 22key4plc22 user46-key1 +2047 1 ssh-rsa 22key4plc22 user47-key1 +2048 1 ssh-rsa 22key4plc22 user48-key1 +2049 1 ssh-rsa 22key4plc22 user49-key1 +2050 1 ssh-rsa 22key4plc22 user50-key1 +2051 1 ssh-rsa 22key4plc22 user51-key1 +2052 1 ssh-rsa 22key4plc22 user52-key1 +2053 1 ssh-rsa 22key4plc22 user53-key1 +2054 1 ssh-rsa 22key4plc22 user54-key1 +2055 1 ssh-rsa 22key4plc22 user55-key1 +2056 1 ssh-rsa 22key4plc22 user56-key1 +2057 1 ssh-rsa 22key4plc22 user57-key1 +2058 1 ssh-rsa 22key4plc22 user58-key1 +2059 1 ssh-rsa 22key4plc22 user59-key1 +2060 1 ssh-rsa 22key4plc22 user60-key1 +2061 1 ssh-rsa 22key4plc22 user61-key1 +2062 1 ssh-rsa 22key4plc22 user62-key1 +2063 1 ssh-rsa 22key4plc22 user63-key1 +2064 1 ssh-rsa 22key4plc22 user64-key1 +2065 1 ssh-rsa 22key4plc22 user65-key1 +2066 1 ssh-rsa 22key4plc22 user66-key1 +2067 1 ssh-rsa 22key4plc22 user67-key1 +2068 1 ssh-rsa 22key4plc22 user68-key1 +2069 1 ssh-rsa 22key4plc22 user69-key1 +2070 1 ssh-rsa 22key4plc22 user70-key1 +2071 1 ssh-rsa 22key4plc22 user71-key1 +2072 1 ssh-rsa 22key4plc22 user72-key1 +2073 1 ssh-rsa 22key4plc22 user73-key1 +2074 1 ssh-rsa 22key4plc22 user74-key1 +2075 1 ssh-rsa 22key4plc22 user75-key1 +2076 1 ssh-rsa 22key4plc22 user76-key1 +2077 1 ssh-rsa 22key4plc22 user77-key1 +2078 1 ssh-rsa 22key4plc22 user78-key1 +2079 1 ssh-rsa 22key4plc22 user79-key1 +2080 1 ssh-rsa 22key4plc22 user80-key1 +2081 1 ssh-rsa 22key4plc22 user81-key1 +2082 1 ssh-rsa 22key4plc22 user82-key1 +2083 1 ssh-rsa 22key4plc22 user83-key1 +2084 1 ssh-rsa 22key4plc22 user84-key1 +2085 1 ssh-rsa 22key4plc22 user85-key1 +2086 1 ssh-rsa 22key4plc22 user86-key1 +2087 1 ssh-rsa 22key4plc22 user87-key1 +2088 1 ssh-rsa 22key4plc22 user88-key1 +2089 1 ssh-rsa 22key4plc22 user89-key1 +2090 1 ssh-rsa 22key4plc22 user90-key1 +2091 1 ssh-rsa 22key4plc22 user91-key1 +2092 1 ssh-rsa 22key4plc22 user92-key1 +2093 1 ssh-rsa 22key4plc22 user93-key1 +2094 1 ssh-rsa 22key4plc22 user94-key1 +2095 1 ssh-rsa 22key4plc22 user95-key1 +2096 1 ssh-rsa 22key4plc22 user96-key1 +2097 1 ssh-rsa 22key4plc22 user97-key1 +2098 1 ssh-rsa 22key4plc22 user98-key1 +2099 1 ssh-rsa 22key4plc22 user99-key1 +2100 1 ssh-rsa 22key4plc22 user100-key1 +2101 1 ssh-rsa 22key4plc22 user101-key1 +2102 1 ssh-rsa 22key4plc22 user102-key1 +2103 1 ssh-rsa 22key4plc22 user103-key1 +2104 1 ssh-rsa 22key4plc22 user104-key1 +2105 1 ssh-rsa 22key4plc22 user105-key1 +2106 1 ssh-rsa 22key4plc22 user106-key1 +2107 1 ssh-rsa 22key4plc22 user107-key1 +2108 1 ssh-rsa 22key4plc22 user108-key1 +2109 1 ssh-rsa 22key4plc22 user109-key1 +2110 1 ssh-rsa 22key4plc22 user110-key1 +2111 1 ssh-rsa 22key4plc22 user111-key1 +2112 1 ssh-rsa 22key4plc22 user112-key1 +2113 1 ssh-rsa 22key4plc22 user113-key1 +2114 1 ssh-rsa 22key4plc22 user114-key1 +2115 1 ssh-rsa 22key4plc22 user115-key1 +2116 1 ssh-rsa 22key4plc22 user116-key1 +2117 1 ssh-rsa 22key4plc22 user117-key1 +2118 1 ssh-rsa 22key4plc22 user118-key1 +2119 1 ssh-rsa 22key4plc22 user119-key1 +2120 1 ssh-rsa 22key4plc22 user120-key1 +2121 1 ssh-rsa 22key4plc22 user121-key1 +2122 1 ssh-rsa 22key4plc22 user122-key1 +2123 1 ssh-rsa 22key4plc22 user123-key1 +2124 1 ssh-rsa 22key4plc22 user124-key1 +2125 1 ssh-rsa 22key4plc22 user125-key1 +2126 1 ssh-rsa 22key4plc22 user126-key1 +2127 1 ssh-rsa 22key4plc22 user127-key1 +2128 1 ssh-rsa 22key4plc22 user128-key1 +2129 1 ssh-rsa 22key4plc22 user129-key1 +2130 1 ssh-rsa 22key4plc22 user130-key1 +2131 1 ssh-rsa 22key4plc22 user131-key1 +2132 1 ssh-rsa 22key4plc22 user132-key1 +2133 1 ssh-rsa 22key4plc22 user133-key1 +2134 1 ssh-rsa 22key4plc22 user134-key1 +2135 1 ssh-rsa 22key4plc22 user135-key1 +2136 1 ssh-rsa 22key4plc22 user136-key1 +2137 1 ssh-rsa 22key4plc22 user137-key1 +2138 1 ssh-rsa 22key4plc22 user138-key1 +2139 1 ssh-rsa 22key4plc22 user139-key1 +2140 1 ssh-rsa 22key4plc22 user140-key1 +2141 1 ssh-rsa 22key4plc22 user141-key1 +2142 1 ssh-rsa 22key4plc22 user142-key1 +2143 1 ssh-rsa 22key4plc22 user143-key1 +2144 1 ssh-rsa 22key4plc22 user144-key1 +2145 1 ssh-rsa 22key4plc22 user145-key1 +2146 1 ssh-rsa 22key4plc22 user146-key1 +2147 1 ssh-rsa 22key4plc22 user147-key1 +2148 1 ssh-rsa 22key4plc22 user148-key1 +2149 1 ssh-rsa 22key4plc22 user149-key1 +2150 1 ssh-rsa 22key4plc22 user150-key1 +2151 1 ssh-rsa 22key4plc22 user151-key1 +2152 1 ssh-rsa 22key4plc22 user152-key1 +2153 1 ssh-rsa 22key4plc22 user153-key1 +2154 1 ssh-rsa 22key4plc22 user154-key1 +2155 1 ssh-rsa 22key4plc22 user155-key1 +2156 1 ssh-rsa 22key4plc22 user156-key1 +2157 1 ssh-rsa 22key4plc22 user157-key1 +2158 1 ssh-rsa 22key4plc22 user158-key1 +2159 1 ssh-rsa 22key4plc22 user159-key1 +2160 1 ssh-rsa 22key4plc22 user160-key1 +2161 1 ssh-rsa 22key4plc22 user161-key1 +2162 1 ssh-rsa 22key4plc22 user162-key1 +2163 1 ssh-rsa 22key4plc22 user163-key1 +2164 1 ssh-rsa 22key4plc22 user164-key1 +2165 1 ssh-rsa 22key4plc22 user165-key1 +2166 1 ssh-rsa 22key4plc22 user166-key1 +2167 1 ssh-rsa 22key4plc22 user167-key1 +2168 1 ssh-rsa 22key4plc22 user168-key1 +2169 1 ssh-rsa 22key4plc22 user169-key1 +2170 1 ssh-rsa 22key4plc22 user170-key1 +2171 1 ssh-rsa 22key4plc22 user171-key1 +2172 1 ssh-rsa 22key4plc22 user172-key1 +2173 1 ssh-rsa 22key4plc22 user173-key1 +2174 1 ssh-rsa 22key4plc22 user174-key1 +2175 1 ssh-rsa 22key4plc22 user175-key1 +2176 1 ssh-rsa 22key4plc22 user176-key1 +2177 1 ssh-rsa 22key4plc22 user177-key1 +2178 1 ssh-rsa 22key4plc22 user178-key1 +2179 1 ssh-rsa 22key4plc22 user179-key1 +2180 1 ssh-rsa 22key4plc22 user180-key1 +2181 1 ssh-rsa 22key4plc22 user181-key1 +2182 1 ssh-rsa 22key4plc22 user182-key1 +2183 1 ssh-rsa 22key4plc22 user183-key1 +2184 1 ssh-rsa 22key4plc22 user184-key1 +2185 1 ssh-rsa 22key4plc22 user185-key1 +2186 1 ssh-rsa 22key4plc22 user186-key1 +2187 1 ssh-rsa 22key4plc22 user187-key1 +2188 1 ssh-rsa 22key4plc22 user188-key1 +2189 1 ssh-rsa 22key4plc22 user189-key1 +2190 1 ssh-rsa 22key4plc22 user190-key1 +2191 1 ssh-rsa 22key4plc22 user191-key1 +2192 1 ssh-rsa 22key4plc22 user192-key1 +2193 1 ssh-rsa 22key4plc22 user193-key1 +2194 1 ssh-rsa 22key4plc22 user194-key1 +2195 1 ssh-rsa 22key4plc22 user195-key1 +2196 1 ssh-rsa 22key4plc22 user196-key1 +2197 1 ssh-rsa 22key4plc22 user197-key1 +2198 1 ssh-rsa 22key4plc22 user198-key1 +2199 1 ssh-rsa 22key4plc22 user199-key1 +2200 1 ssh-rsa 22key4plc22 user200-key1 +2201 1 ssh-rsa 22key4plc22 user201-key1 +2202 1 ssh-rsa 22key4plc22 user202-key1 +2203 1 ssh-rsa 22key4plc22 user203-key1 +2204 1 ssh-rsa 22key4plc22 user204-key1 +2205 1 ssh-rsa 22key4plc22 user205-key1 +2206 1 ssh-rsa 22key4plc22 user206-key1 +2207 1 ssh-rsa 22key4plc22 user207-key1 +2208 1 ssh-rsa 22key4plc22 user208-key1 +2209 1 ssh-rsa 22key4plc22 user209-key1 +2210 1 ssh-rsa 22key4plc22 user210-key1 +2211 1 ssh-rsa 22key4plc22 user211-key1 +2212 1 ssh-rsa 22key4plc22 user212-key1 +2213 1 ssh-rsa 22key4plc22 user213-key1 +2214 1 ssh-rsa 22key4plc22 user214-key1 +2215 1 ssh-rsa 22key4plc22 user215-key1 +2216 1 ssh-rsa 22key4plc22 user216-key1 +2217 1 ssh-rsa 22key4plc22 user217-key1 +2218 1 ssh-rsa 22key4plc22 user218-key1 +2219 1 ssh-rsa 22key4plc22 user219-key1 +2220 1 ssh-rsa 22key4plc22 user220-key1 +2221 1 ssh-rsa 22key4plc22 user221-key1 +2222 1 ssh-rsa 22key4plc22 user222-key1 +2223 1 ssh-rsa 22key4plc22 user223-key1 +2224 1 ssh-rsa 22key4plc22 user224-key1 +2225 1 ssh-rsa 22key4plc22 user225-key1 +2226 1 ssh-rsa 22key4plc22 user226-key1 +2227 1 ssh-rsa 22key4plc22 user227-key1 +2228 1 ssh-rsa 22key4plc22 user228-key1 +2229 1 ssh-rsa 22key4plc22 user229-key1 +2230 1 ssh-rsa 22key4plc22 user230-key1 +2231 1 ssh-rsa 22key4plc22 user231-key1 +2232 1 ssh-rsa 22key4plc22 user232-key1 +2233 1 ssh-rsa 22key4plc22 user233-key1 +2234 1 ssh-rsa 22key4plc22 user234-key1 +2235 1 ssh-rsa 22key4plc22 user235-key1 +2236 1 ssh-rsa 22key4plc22 user236-key1 +2237 1 ssh-rsa 22key4plc22 user237-key1 +2238 1 ssh-rsa 22key4plc22 user238-key1 +2239 1 ssh-rsa 22key4plc22 user239-key1 +2240 1 ssh-rsa 22key4plc22 user240-key1 +2241 1 ssh-rsa 22key4plc22 user241-key1 +2242 1 ssh-rsa 22key4plc22 user242-key1 +2243 1 ssh-rsa 22key4plc22 user243-key1 +2244 1 ssh-rsa 22key4plc22 user244-key1 +2245 1 ssh-rsa 22key4plc22 user245-key1 +2246 1 ssh-rsa 22key4plc22 user246-key1 +2247 1 ssh-rsa 22key4plc22 user247-key1 +2248 1 ssh-rsa 22key4plc22 user248-key1 +2249 1 ssh-rsa 22key4plc22 user249-key1 +2250 1 ssh-rsa 22key4plc22 user250-key1 +2251 1 ssh-rsa 22key4plc22 user251-key1 +2252 1 ssh-rsa 22key4plc22 user252-key1 +2253 1 ssh-rsa 22key4plc22 user253-key1 +2254 1 ssh-rsa 22key4plc22 user254-key1 +2255 1 ssh-rsa 22key4plc22 user255-key1 +2256 1 ssh-rsa 22key4plc22 user256-key1 +2257 1 ssh-rsa 22key4plc22 user257-key1 +2258 1 ssh-rsa 22key4plc22 user258-key1 +2259 1 ssh-rsa 22key4plc22 user259-key1 +2260 1 ssh-rsa 22key4plc22 user260-key1 +2261 1 ssh-rsa 22key4plc22 user261-key1 +2262 1 ssh-rsa 22key4plc22 user262-key1 +2263 1 ssh-rsa 22key4plc22 user263-key1 +2264 1 ssh-rsa 22key4plc22 user264-key1 +2265 1 ssh-rsa 22key4plc22 user265-key1 +2266 1 ssh-rsa 22key4plc22 user266-key1 +2267 1 ssh-rsa 22key4plc22 user267-key1 +2268 1 ssh-rsa 22key4plc22 user268-key1 +2269 1 ssh-rsa 22key4plc22 user269-key1 +2270 1 ssh-rsa 22key4plc22 user270-key1 +2271 1 ssh-rsa 22key4plc22 user271-key1 +2272 1 ssh-rsa 22key4plc22 user272-key1 +2273 1 ssh-rsa 22key4plc22 user273-key1 +2274 1 ssh-rsa 22key4plc22 user274-key1 +2275 1 ssh-rsa 22key4plc22 user275-key1 +2276 1 ssh-rsa 22key4plc22 user276-key1 +2277 1 ssh-rsa 22key4plc22 user277-key1 +2278 1 ssh-rsa 22key4plc22 user278-key1 +2279 1 ssh-rsa 22key4plc22 user279-key1 +2280 1 ssh-rsa 22key4plc22 user280-key1 +2281 1 ssh-rsa 22key4plc22 user281-key1 +2282 1 ssh-rsa 22key4plc22 user282-key1 +2283 1 ssh-rsa 22key4plc22 user283-key1 +2284 1 ssh-rsa 22key4plc22 user284-key1 +2285 1 ssh-rsa 22key4plc22 user285-key1 +2286 1 ssh-rsa 22key4plc22 user286-key1 +2287 1 ssh-rsa 22key4plc22 user287-key1 +2288 1 ssh-rsa 22key4plc22 user288-key1 +2289 1 ssh-rsa 22key4plc22 user289-key1 +2290 1 ssh-rsa 22key4plc22 user290-key1 +2291 1 ssh-rsa 22key4plc22 user291-key1 +2292 1 ssh-rsa 22key4plc22 user292-key1 +2293 1 ssh-rsa 22key4plc22 user293-key1 +2294 1 ssh-rsa 22key4plc22 user294-key1 +2295 1 ssh-rsa 22key4plc22 user295-key1 +2296 1 ssh-rsa 22key4plc22 user296-key1 +2297 1 ssh-rsa 22key4plc22 user297-key1 +2298 1 ssh-rsa 22key4plc22 user298-key1 +2299 1 ssh-rsa 22key4plc22 user299-key1 +2300 1 ssh-rsa 22key4plc22 user300-key1 +2301 1 ssh-rsa 22key4plc22 user301-key1 +2302 1 ssh-rsa 22key4plc22 user302-key1 +2303 1 ssh-rsa 22key4plc22 user303-key1 +2304 1 ssh-rsa 22key4plc22 user304-key1 +2305 1 ssh-rsa 22key4plc22 user305-key1 +2306 1 ssh-rsa 22key4plc22 user306-key1 +2307 1 ssh-rsa 22key4plc22 user307-key1 +2308 1 ssh-rsa 22key4plc22 user308-key1 +2309 1 ssh-rsa 22key4plc22 user309-key1 +2310 1 ssh-rsa 22key4plc22 user310-key1 +2311 1 ssh-rsa 22key4plc22 user311-key1 +2312 1 ssh-rsa 22key4plc22 user312-key1 +2313 1 ssh-rsa 22key4plc22 user313-key1 +2314 1 ssh-rsa 22key4plc22 user314-key1 +2315 1 ssh-rsa 22key4plc22 user315-key1 +2316 1 ssh-rsa 22key4plc22 user316-key1 +2317 1 ssh-rsa 22key4plc22 user317-key1 +2318 1 ssh-rsa 22key4plc22 user318-key1 +2319 1 ssh-rsa 22key4plc22 user319-key1 +2320 1 ssh-rsa 22key4plc22 user320-key1 +2321 1 ssh-rsa 22key4plc22 user321-key1 +2322 1 ssh-rsa 22key4plc22 user322-key1 +2323 1 ssh-rsa 22key4plc22 user323-key1 +2324 1 ssh-rsa 22key4plc22 user324-key1 +2325 1 ssh-rsa 22key4plc22 user325-key1 +2326 1 ssh-rsa 22key4plc22 user326-key1 +2327 1 ssh-rsa 22key4plc22 user327-key1 +2328 1 ssh-rsa 22key4plc22 user328-key1 +2329 1 ssh-rsa 22key4plc22 user329-key1 +2330 1 ssh-rsa 22key4plc22 user330-key1 +2331 1 ssh-rsa 22key4plc22 user331-key1 +2332 1 ssh-rsa 22key4plc22 user332-key1 +2333 1 ssh-rsa 22key4plc22 user333-key1 +2334 1 ssh-rsa 22key4plc22 user334-key1 +2335 1 ssh-rsa 22key4plc22 user335-key1 +2336 1 ssh-rsa 22key4plc22 user336-key1 +2337 1 ssh-rsa 22key4plc22 user337-key1 +2338 1 ssh-rsa 22key4plc22 user338-key1 +2339 1 ssh-rsa 22key4plc22 user339-key1 +2340 1 ssh-rsa 22key4plc22 user340-key1 +2341 1 ssh-rsa 22key4plc22 user341-key1 +2342 1 ssh-rsa 22key4plc22 user342-key1 +2343 1 ssh-rsa 22key4plc22 user343-key1 +2344 1 ssh-rsa 22key4plc22 user344-key1 +2345 1 ssh-rsa 22key4plc22 user345-key1 +2346 1 ssh-rsa 22key4plc22 user346-key1 +2347 1 ssh-rsa 22key4plc22 user347-key1 +2348 1 ssh-rsa 22key4plc22 user348-key1 +2349 1 ssh-rsa 22key4plc22 user349-key1 +2350 1 ssh-rsa 22key4plc22 user350-key1 +2351 1 ssh-rsa 22key4plc22 user351-key1 +2352 1 ssh-rsa 22key4plc22 user352-key1 +2353 1 ssh-rsa 22key4plc22 user353-key1 +2354 1 ssh-rsa 22key4plc22 user354-key1 +2355 1 ssh-rsa 22key4plc22 user355-key1 +2356 1 ssh-rsa 22key4plc22 user356-key1 +2357 1 ssh-rsa 22key4plc22 user357-key1 +2358 1 ssh-rsa 22key4plc22 user358-key1 +2359 1 ssh-rsa 22key4plc22 user359-key1 +2360 1 ssh-rsa 22key4plc22 user360-key1 +2361 1 ssh-rsa 22key4plc22 user361-key1 +2362 1 ssh-rsa 22key4plc22 user362-key1 +2363 1 ssh-rsa 22key4plc22 user363-key1 +2364 1 ssh-rsa 22key4plc22 user364-key1 +2365 1 ssh-rsa 22key4plc22 user365-key1 +2366 1 ssh-rsa 22key4plc22 user366-key1 +2367 1 ssh-rsa 22key4plc22 user367-key1 +2368 1 ssh-rsa 22key4plc22 user368-key1 +2369 1 ssh-rsa 22key4plc22 user369-key1 +2370 1 ssh-rsa 22key4plc22 user370-key1 +2371 1 ssh-rsa 22key4plc22 user371-key1 +2372 1 ssh-rsa 22key4plc22 user372-key1 +2373 1 ssh-rsa 22key4plc22 user373-key1 +2374 1 ssh-rsa 22key4plc22 user374-key1 +2375 1 ssh-rsa 22key4plc22 user375-key1 +2376 1 ssh-rsa 22key4plc22 user376-key1 +2377 1 ssh-rsa 22key4plc22 user377-key1 +2378 1 ssh-rsa 22key4plc22 user378-key1 +2379 1 ssh-rsa 22key4plc22 user379-key1 +2380 1 ssh-rsa 22key4plc22 user380-key1 +2381 1 ssh-rsa 22key4plc22 user381-key1 +2382 1 ssh-rsa 22key4plc22 user382-key1 +2383 1 ssh-rsa 22key4plc22 user383-key1 +2384 1 ssh-rsa 22key4plc22 user384-key1 +2385 1 ssh-rsa 22key4plc22 user385-key1 +2386 1 ssh-rsa 22key4plc22 user386-key1 +2387 1 ssh-rsa 22key4plc22 user387-key1 +2388 1 ssh-rsa 22key4plc22 user388-key1 +2389 1 ssh-rsa 22key4plc22 user389-key1 +2390 1 ssh-rsa 22key4plc22 user390-key1 +2391 1 ssh-rsa 22key4plc22 user391-key1 +2392 1 ssh-rsa 22key4plc22 user392-key1 +2393 1 ssh-rsa 22key4plc22 user393-key1 +2394 1 ssh-rsa 22key4plc22 user394-key1 +2395 1 ssh-rsa 22key4plc22 user395-key1 +2396 1 ssh-rsa 22key4plc22 user396-key1 +2397 1 ssh-rsa 22key4plc22 user397-key1 +2398 1 ssh-rsa 22key4plc22 user398-key1 +2399 1 ssh-rsa 22key4plc22 user399-key1 +2400 1 ssh-rsa 22key4plc22 user400-key1 +2401 1 ssh-rsa 22key4plc22 user401-key1 +2402 1 ssh-rsa 22key4plc22 user402-key1 +2403 1 ssh-rsa 22key4plc22 user403-key1 +2404 1 ssh-rsa 22key4plc22 user404-key1 +2405 1 ssh-rsa 22key4plc22 user405-key1 +2406 1 ssh-rsa 22key4plc22 user406-key1 +2407 1 ssh-rsa 22key4plc22 user407-key1 +2408 1 ssh-rsa 22key4plc22 user408-key1 +2409 1 ssh-rsa 22key4plc22 user409-key1 +2410 1 ssh-rsa 22key4plc22 user410-key1 +2411 1 ssh-rsa 22key4plc22 user411-key1 +2412 1 ssh-rsa 22key4plc22 user412-key1 +2413 1 ssh-rsa 22key4plc22 user413-key1 +2414 1 ssh-rsa 22key4plc22 user414-key1 +2415 1 ssh-rsa 22key4plc22 user415-key1 +2416 1 ssh-rsa 22key4plc22 user416-key1 +2417 1 ssh-rsa 22key4plc22 user417-key1 +2418 1 ssh-rsa 22key4plc22 user418-key1 +2419 1 ssh-rsa 22key4plc22 user419-key1 +2420 1 ssh-rsa 22key4plc22 user420-key1 +2421 1 ssh-rsa 22key4plc22 user421-key1 +2422 1 ssh-rsa 22key4plc22 user422-key1 +2423 1 ssh-rsa 22key4plc22 user423-key1 +2424 1 ssh-rsa 22key4plc22 user424-key1 +2425 1 ssh-rsa 22key4plc22 user425-key1 +2426 1 ssh-rsa 22key4plc22 user426-key1 +2427 1 ssh-rsa 22key4plc22 user427-key1 +2428 1 ssh-rsa 22key4plc22 user428-key1 +2429 1 ssh-rsa 22key4plc22 user429-key1 +2430 1 ssh-rsa 22key4plc22 user430-key1 +2431 1 ssh-rsa 22key4plc22 user431-key1 +2432 1 ssh-rsa 22key4plc22 user432-key1 +2433 1 ssh-rsa 22key4plc22 user433-key1 +2434 1 ssh-rsa 22key4plc22 user434-key1 +2435 1 ssh-rsa 22key4plc22 user435-key1 +2436 1 ssh-rsa 22key4plc22 user436-key1 +2437 1 ssh-rsa 22key4plc22 user437-key1 +2438 1 ssh-rsa 22key4plc22 user438-key1 +2439 1 ssh-rsa 22key4plc22 user439-key1 +2440 1 ssh-rsa 22key4plc22 user440-key1 +2441 1 ssh-rsa 22key4plc22 user441-key1 +2442 1 ssh-rsa 22key4plc22 user442-key1 +2443 1 ssh-rsa 22key4plc22 user443-key1 +2444 1 ssh-rsa 22key4plc22 user444-key1 +2445 1 ssh-rsa 22key4plc22 user445-key1 +2446 1 ssh-rsa 22key4plc22 user446-key1 +2447 1 ssh-rsa 22key4plc22 user447-key1 +2448 1 ssh-rsa 22key4plc22 user448-key1 +2449 1 ssh-rsa 22key4plc22 user449-key1 +2450 1 ssh-rsa 22key4plc22 user450-key1 +2451 1 ssh-rsa 22key4plc22 user451-key1 +2452 1 ssh-rsa 22key4plc22 user452-key1 +2453 1 ssh-rsa 22key4plc22 user453-key1 +2454 1 ssh-rsa 22key4plc22 user454-key1 +2455 1 ssh-rsa 22key4plc22 user455-key1 +2456 1 ssh-rsa 22key4plc22 user456-key1 +2457 1 ssh-rsa 22key4plc22 user457-key1 +2458 1 ssh-rsa 22key4plc22 user458-key1 +2459 1 ssh-rsa 22key4plc22 user459-key1 +2460 1 ssh-rsa 22key4plc22 user460-key1 +2461 1 ssh-rsa 22key4plc22 user461-key1 +2462 1 ssh-rsa 22key4plc22 user462-key1 +2463 1 ssh-rsa 22key4plc22 user463-key1 +2464 1 ssh-rsa 22key4plc22 user464-key1 +2465 1 ssh-rsa 22key4plc22 user465-key1 +2466 1 ssh-rsa 22key4plc22 user466-key1 +2467 1 ssh-rsa 22key4plc22 user467-key1 +2468 1 ssh-rsa 22key4plc22 user468-key1 +2469 1 ssh-rsa 22key4plc22 user469-key1 +2470 1 ssh-rsa 22key4plc22 user470-key1 +2471 1 ssh-rsa 22key4plc22 user471-key1 +2472 1 ssh-rsa 22key4plc22 user472-key1 +2473 1 ssh-rsa 22key4plc22 user473-key1 +2474 1 ssh-rsa 22key4plc22 user474-key1 +2475 1 ssh-rsa 22key4plc22 user475-key1 +2476 1 ssh-rsa 22key4plc22 user476-key1 +2477 1 ssh-rsa 22key4plc22 user477-key1 +2478 1 ssh-rsa 22key4plc22 user478-key1 +2479 1 ssh-rsa 22key4plc22 user479-key1 +2480 1 ssh-rsa 22key4plc22 user480-key1 +2481 1 ssh-rsa 22key4plc22 user481-key1 +2482 1 ssh-rsa 22key4plc22 user482-key1 +2483 1 ssh-rsa 22key4plc22 user483-key1 +2484 1 ssh-rsa 22key4plc22 user484-key1 +2485 1 ssh-rsa 22key4plc22 user485-key1 +2486 1 ssh-rsa 22key4plc22 user486-key1 +2487 1 ssh-rsa 22key4plc22 user487-key1 +2488 1 ssh-rsa 22key4plc22 user488-key1 +2489 1 ssh-rsa 22key4plc22 user489-key1 +2490 1 ssh-rsa 22key4plc22 user490-key1 +2491 1 ssh-rsa 22key4plc22 user491-key1 +2492 1 ssh-rsa 22key4plc22 user492-key1 +2493 1 ssh-rsa 22key4plc22 user493-key1 +2494 1 ssh-rsa 22key4plc22 user494-key1 +2495 1 ssh-rsa 22key4plc22 user495-key1 +2496 1 ssh-rsa 22key4plc22 user496-key1 +2497 1 ssh-rsa 22key4plc22 user497-key1 +2498 1 ssh-rsa 22key4plc22 user498-key1 +2499 1 ssh-rsa 22key4plc22 user499-key1 +2500 1 ssh-rsa 22key4plc22 user500-key1 +2501 1 ssh-rsa 22key4plc22 user501-key1 +2502 1 ssh-rsa 22key4plc22 user502-key1 +2503 1 ssh-rsa 22key4plc22 user503-key1 +2504 1 ssh-rsa 22key4plc22 user504-key1 +2505 1 ssh-rsa 22key4plc22 user505-key1 +2506 1 ssh-rsa 22key4plc22 user506-key1 +2507 1 ssh-rsa 22key4plc22 user507-key1 +2508 1 ssh-rsa 22key4plc22 user508-key1 +2509 1 ssh-rsa 22key4plc22 user509-key1 +2510 1 ssh-rsa 22key4plc22 user510-key1 +2511 1 ssh-rsa 22key4plc22 user511-key1 +2512 1 ssh-rsa 22key4plc22 user512-key1 +2513 1 ssh-rsa 22key4plc22 user513-key1 +2514 1 ssh-rsa 22key4plc22 user514-key1 +2515 1 ssh-rsa 22key4plc22 user515-key1 +2516 1 ssh-rsa 22key4plc22 user516-key1 +2517 1 ssh-rsa 22key4plc22 user517-key1 +2518 1 ssh-rsa 22key4plc22 user518-key1 +2519 1 ssh-rsa 22key4plc22 user519-key1 +2520 1 ssh-rsa 22key4plc22 user520-key1 +2521 1 ssh-rsa 22key4plc22 user521-key1 +2522 1 ssh-rsa 22key4plc22 user522-key1 +2523 1 ssh-rsa 22key4plc22 user523-key1 +2524 1 ssh-rsa 22key4plc22 user524-key1 +2525 1 ssh-rsa 22key4plc22 user525-key1 +2526 1 ssh-rsa 22key4plc22 user526-key1 +2527 1 ssh-rsa 22key4plc22 user527-key1 +2528 1 ssh-rsa 22key4plc22 user528-key1 +2529 1 ssh-rsa 22key4plc22 user529-key1 +2530 1 ssh-rsa 22key4plc22 user530-key1 +2531 1 ssh-rsa 22key4plc22 user531-key1 +2532 1 ssh-rsa 22key4plc22 user532-key1 +2533 1 ssh-rsa 22key4plc22 user533-key1 +2534 1 ssh-rsa 22key4plc22 user534-key1 +2535 1 ssh-rsa 22key4plc22 user535-key1 +2536 1 ssh-rsa 22key4plc22 user536-key1 +2537 1 ssh-rsa 22key4plc22 user537-key1 +2538 1 ssh-rsa 22key4plc22 user538-key1 +2539 1 ssh-rsa 22key4plc22 user539-key1 +2540 1 ssh-rsa 22key4plc22 user540-key1 +2541 1 ssh-rsa 22key4plc22 user541-key1 +2542 1 ssh-rsa 22key4plc22 user542-key1 +2543 1 ssh-rsa 22key4plc22 user543-key1 +2544 1 ssh-rsa 22key4plc22 user544-key1 +2545 1 ssh-rsa 22key4plc22 user545-key1 +2546 1 ssh-rsa 22key4plc22 user546-key1 +2547 1 ssh-rsa 22key4plc22 user547-key1 +2548 1 ssh-rsa 22key4plc22 user548-key1 +2549 1 ssh-rsa 22key4plc22 user549-key1 +2550 1 ssh-rsa 22key4plc22 user550-key1 +2551 1 ssh-rsa 22key4plc22 user551-key1 +2552 1 ssh-rsa 22key4plc22 user552-key1 +2553 1 ssh-rsa 22key4plc22 user553-key1 +2554 1 ssh-rsa 22key4plc22 user554-key1 +2555 1 ssh-rsa 22key4plc22 user555-key1 +2556 1 ssh-rsa 22key4plc22 user556-key1 +2557 1 ssh-rsa 22key4plc22 user557-key1 +2558 1 ssh-rsa 22key4plc22 user558-key1 +2559 1 ssh-rsa 22key4plc22 user559-key1 +2560 1 ssh-rsa 22key4plc22 user560-key1 +2561 1 ssh-rsa 22key4plc22 user561-key1 +2562 1 ssh-rsa 22key4plc22 user562-key1 +2563 1 ssh-rsa 22key4plc22 user563-key1 +2564 1 ssh-rsa 22key4plc22 user564-key1 +2565 1 ssh-rsa 22key4plc22 user565-key1 +2566 1 ssh-rsa 22key4plc22 user566-key1 +2567 1 ssh-rsa 22key4plc22 user567-key1 +2568 1 ssh-rsa 22key4plc22 user568-key1 +2569 1 ssh-rsa 22key4plc22 user569-key1 +2570 1 ssh-rsa 22key4plc22 user570-key1 +2571 1 ssh-rsa 22key4plc22 user571-key1 +2572 1 ssh-rsa 22key4plc22 user572-key1 +2573 1 ssh-rsa 22key4plc22 user573-key1 +2574 1 ssh-rsa 22key4plc22 user574-key1 +2575 1 ssh-rsa 22key4plc22 user575-key1 +2576 1 ssh-rsa 22key4plc22 user576-key1 +2577 1 ssh-rsa 22key4plc22 user577-key1 +2578 1 ssh-rsa 22key4plc22 user578-key1 +2579 1 ssh-rsa 22key4plc22 user579-key1 +2580 1 ssh-rsa 22key4plc22 user580-key1 +2581 1 ssh-rsa 22key4plc22 user581-key1 +2582 1 ssh-rsa 22key4plc22 user582-key1 +2583 1 ssh-rsa 22key4plc22 user583-key1 +2584 1 ssh-rsa 22key4plc22 user584-key1 +2585 1 ssh-rsa 22key4plc22 user585-key1 +2586 1 ssh-rsa 22key4plc22 user586-key1 +2587 1 ssh-rsa 22key4plc22 user587-key1 +2588 1 ssh-rsa 22key4plc22 user588-key1 +2589 1 ssh-rsa 22key4plc22 user589-key1 +2590 1 ssh-rsa 22key4plc22 user590-key1 +2591 1 ssh-rsa 22key4plc22 user591-key1 +2592 1 ssh-rsa 22key4plc22 user592-key1 +2593 1 ssh-rsa 22key4plc22 user593-key1 +2594 1 ssh-rsa 22key4plc22 user594-key1 +2595 1 ssh-rsa 22key4plc22 user595-key1 +2596 1 ssh-rsa 22key4plc22 user596-key1 +2597 1 ssh-rsa 22key4plc22 user597-key1 +2598 1 ssh-rsa 22key4plc22 user598-key1 +2599 1 ssh-rsa 22key4plc22 user599-key1 +2600 1 ssh-rsa 22key4plc22 user600-key1 +2601 1 ssh-rsa 22key4plc22 user601-key1 +2602 1 ssh-rsa 22key4plc22 user602-key1 +2603 1 ssh-rsa 22key4plc22 user603-key1 +2604 1 ssh-rsa 22key4plc22 user604-key1 +2605 1 ssh-rsa 22key4plc22 user605-key1 +2606 1 ssh-rsa 22key4plc22 user606-key1 +2607 1 ssh-rsa 22key4plc22 user607-key1 +2608 1 ssh-rsa 22key4plc22 user608-key1 +2609 1 ssh-rsa 22key4plc22 user609-key1 +2610 1 ssh-rsa 22key4plc22 user610-key1 +2611 1 ssh-rsa 22key4plc22 user611-key1 +2612 1 ssh-rsa 22key4plc22 user612-key1 +2613 1 ssh-rsa 22key4plc22 user613-key1 +2614 1 ssh-rsa 22key4plc22 user614-key1 +2615 1 ssh-rsa 22key4plc22 user615-key1 +2616 1 ssh-rsa 22key4plc22 user616-key1 +2617 1 ssh-rsa 22key4plc22 user617-key1 +2618 1 ssh-rsa 22key4plc22 user618-key1 +2619 1 ssh-rsa 22key4plc22 user619-key1 +2620 1 ssh-rsa 22key4plc22 user620-key1 +2621 1 ssh-rsa 22key4plc22 user621-key1 +2622 1 ssh-rsa 22key4plc22 user622-key1 +2623 1 ssh-rsa 22key4plc22 user623-key1 +2624 1 ssh-rsa 22key4plc22 user624-key1 +2625 1 ssh-rsa 22key4plc22 user625-key1 +2626 1 ssh-rsa 22key4plc22 user626-key1 +2627 1 ssh-rsa 22key4plc22 user627-key1 +2628 1 ssh-rsa 22key4plc22 user628-key1 +2629 1 ssh-rsa 22key4plc22 user629-key1 +2630 1 ssh-rsa 22key4plc22 user630-key1 +2631 1 ssh-rsa 22key4plc22 user631-key1 +2632 1 ssh-rsa 22key4plc22 user632-key1 +2633 1 ssh-rsa 22key4plc22 user633-key1 +2634 1 ssh-rsa 22key4plc22 user634-key1 +2635 1 ssh-rsa 22key4plc22 user635-key1 +2636 1 ssh-rsa 22key4plc22 user636-key1 +2637 1 ssh-rsa 22key4plc22 user637-key1 +2638 1 ssh-rsa 22key4plc22 user638-key1 +2639 1 ssh-rsa 22key4plc22 user639-key1 +2640 1 ssh-rsa 22key4plc22 user640-key1 +2641 1 ssh-rsa 22key4plc22 user641-key1 +2642 1 ssh-rsa 22key4plc22 user642-key1 +2643 1 ssh-rsa 22key4plc22 user643-key1 +2644 1 ssh-rsa 22key4plc22 user644-key1 +2645 1 ssh-rsa 22key4plc22 user645-key1 +2646 1 ssh-rsa 22key4plc22 user646-key1 +2647 1 ssh-rsa 22key4plc22 user647-key1 +2648 1 ssh-rsa 22key4plc22 user648-key1 +2649 1 ssh-rsa 22key4plc22 user649-key1 +2650 1 ssh-rsa 22key4plc22 user650-key1 +2651 1 ssh-rsa 22key4plc22 user651-key1 +2652 1 ssh-rsa 22key4plc22 user652-key1 +2653 1 ssh-rsa 22key4plc22 user653-key1 +2654 1 ssh-rsa 22key4plc22 user654-key1 +2655 1 ssh-rsa 22key4plc22 user655-key1 +2656 1 ssh-rsa 22key4plc22 user656-key1 +2657 1 ssh-rsa 22key4plc22 user657-key1 +2658 1 ssh-rsa 22key4plc22 user658-key1 +2659 1 ssh-rsa 22key4plc22 user659-key1 +2660 1 ssh-rsa 22key4plc22 user660-key1 +2661 1 ssh-rsa 22key4plc22 user661-key1 +2662 1 ssh-rsa 22key4plc22 user662-key1 +2663 1 ssh-rsa 22key4plc22 user663-key1 +2664 1 ssh-rsa 22key4plc22 user664-key1 +2665 1 ssh-rsa 22key4plc22 user665-key1 +2666 1 ssh-rsa 22key4plc22 user666-key1 +2667 1 ssh-rsa 22key4plc22 user667-key1 +2668 1 ssh-rsa 22key4plc22 user668-key1 +2669 1 ssh-rsa 22key4plc22 user669-key1 +2670 1 ssh-rsa 22key4plc22 user670-key1 +2671 1 ssh-rsa 22key4plc22 user671-key1 +2672 1 ssh-rsa 22key4plc22 user672-key1 +2673 1 ssh-rsa 22key4plc22 user673-key1 +2674 1 ssh-rsa 22key4plc22 user674-key1 +2675 1 ssh-rsa 22key4plc22 user675-key1 +2676 1 ssh-rsa 22key4plc22 user676-key1 +2677 1 ssh-rsa 22key4plc22 user677-key1 +2678 1 ssh-rsa 22key4plc22 user678-key1 +2679 1 ssh-rsa 22key4plc22 user679-key1 +2680 1 ssh-rsa 22key4plc22 user680-key1 +2681 1 ssh-rsa 22key4plc22 user681-key1 +2682 1 ssh-rsa 22key4plc22 user682-key1 +2683 1 ssh-rsa 22key4plc22 user683-key1 +2684 1 ssh-rsa 22key4plc22 user684-key1 +2685 1 ssh-rsa 22key4plc22 user685-key1 +2686 1 ssh-rsa 22key4plc22 user686-key1 +2687 1 ssh-rsa 22key4plc22 user687-key1 +2688 1 ssh-rsa 22key4plc22 user688-key1 +2689 1 ssh-rsa 22key4plc22 user689-key1 +2690 1 ssh-rsa 22key4plc22 user690-key1 +2691 1 ssh-rsa 22key4plc22 user691-key1 +2692 1 ssh-rsa 22key4plc22 user692-key1 +2693 1 ssh-rsa 22key4plc22 user693-key1 +2694 1 ssh-rsa 22key4plc22 user694-key1 +2695 1 ssh-rsa 22key4plc22 user695-key1 +2696 1 ssh-rsa 22key4plc22 user696-key1 +2697 1 ssh-rsa 22key4plc22 user697-key1 +2698 1 ssh-rsa 22key4plc22 user698-key1 +2699 1 ssh-rsa 22key4plc22 user699-key1 +2700 1 ssh-rsa 22key4plc22 user700-key1 +2701 1 ssh-rsa 22key4plc22 user701-key1 +2702 1 ssh-rsa 22key4plc22 user702-key1 +2703 1 ssh-rsa 22key4plc22 user703-key1 +2704 1 ssh-rsa 22key4plc22 user704-key1 +2705 1 ssh-rsa 22key4plc22 user705-key1 +2706 1 ssh-rsa 22key4plc22 user706-key1 +2707 1 ssh-rsa 22key4plc22 user707-key1 +2708 1 ssh-rsa 22key4plc22 user708-key1 +2709 1 ssh-rsa 22key4plc22 user709-key1 +2710 1 ssh-rsa 22key4plc22 user710-key1 +2711 1 ssh-rsa 22key4plc22 user711-key1 +2712 1 ssh-rsa 22key4plc22 user712-key1 +2713 1 ssh-rsa 22key4plc22 user713-key1 +2714 1 ssh-rsa 22key4plc22 user714-key1 +2715 1 ssh-rsa 22key4plc22 user715-key1 +2716 1 ssh-rsa 22key4plc22 user716-key1 +2717 1 ssh-rsa 22key4plc22 user717-key1 +2718 1 ssh-rsa 22key4plc22 user718-key1 +2719 1 ssh-rsa 22key4plc22 user719-key1 +2720 1 ssh-rsa 22key4plc22 user720-key1 +2721 1 ssh-rsa 22key4plc22 user721-key1 +2722 1 ssh-rsa 22key4plc22 user722-key1 +2723 1 ssh-rsa 22key4plc22 user723-key1 +2724 1 ssh-rsa 22key4plc22 user724-key1 +2725 1 ssh-rsa 22key4plc22 user725-key1 +2726 1 ssh-rsa 22key4plc22 user726-key1 +2727 1 ssh-rsa 22key4plc22 user727-key1 +2728 1 ssh-rsa 22key4plc22 user728-key1 +2729 1 ssh-rsa 22key4plc22 user729-key1 +2730 1 ssh-rsa 22key4plc22 user730-key1 +2731 1 ssh-rsa 22key4plc22 user731-key1 +2732 1 ssh-rsa 22key4plc22 user732-key1 +2733 1 ssh-rsa 22key4plc22 user733-key1 +2734 1 ssh-rsa 22key4plc22 user734-key1 +2735 1 ssh-rsa 22key4plc22 user735-key1 +2736 1 ssh-rsa 22key4plc22 user736-key1 +2737 1 ssh-rsa 22key4plc22 user737-key1 +2738 1 ssh-rsa 22key4plc22 user738-key1 +2739 1 ssh-rsa 22key4plc22 user739-key1 +2740 1 ssh-rsa 22key4plc22 user740-key1 +2741 1 ssh-rsa 22key4plc22 user741-key1 +2742 1 ssh-rsa 22key4plc22 user742-key1 +2743 1 ssh-rsa 22key4plc22 user743-key1 +2744 1 ssh-rsa 22key4plc22 user744-key1 +2745 1 ssh-rsa 22key4plc22 user745-key1 +2746 1 ssh-rsa 22key4plc22 user746-key1 +2747 1 ssh-rsa 22key4plc22 user747-key1 +2748 1 ssh-rsa 22key4plc22 user748-key1 +2749 1 ssh-rsa 22key4plc22 user749-key1 +2750 1 ssh-rsa 22key4plc22 user750-key1 +2751 1 ssh-rsa 22key4plc22 user751-key1 +2752 1 ssh-rsa 22key4plc22 user752-key1 +2753 1 ssh-rsa 22key4plc22 user753-key1 +2754 1 ssh-rsa 22key4plc22 user754-key1 +2755 1 ssh-rsa 22key4plc22 user755-key1 +2756 1 ssh-rsa 22key4plc22 user756-key1 +2757 1 ssh-rsa 22key4plc22 user757-key1 +2758 1 ssh-rsa 22key4plc22 user758-key1 +2759 1 ssh-rsa 22key4plc22 user759-key1 +2760 1 ssh-rsa 22key4plc22 user760-key1 +2761 1 ssh-rsa 22key4plc22 user761-key1 +2762 1 ssh-rsa 22key4plc22 user762-key1 +2763 1 ssh-rsa 22key4plc22 user763-key1 +2764 1 ssh-rsa 22key4plc22 user764-key1 +2765 1 ssh-rsa 22key4plc22 user765-key1 +2766 1 ssh-rsa 22key4plc22 user766-key1 +2767 1 ssh-rsa 22key4plc22 user767-key1 +2768 1 ssh-rsa 22key4plc22 user768-key1 +2769 1 ssh-rsa 22key4plc22 user769-key1 +2770 1 ssh-rsa 22key4plc22 user770-key1 +2771 1 ssh-rsa 22key4plc22 user771-key1 +2772 1 ssh-rsa 22key4plc22 user772-key1 +2773 1 ssh-rsa 22key4plc22 user773-key1 +2774 1 ssh-rsa 22key4plc22 user774-key1 +2775 1 ssh-rsa 22key4plc22 user775-key1 +2776 1 ssh-rsa 22key4plc22 user776-key1 +2777 1 ssh-rsa 22key4plc22 user777-key1 +2778 1 ssh-rsa 22key4plc22 user778-key1 +2779 1 ssh-rsa 22key4plc22 user779-key1 +2780 1 ssh-rsa 22key4plc22 user780-key1 +2781 1 ssh-rsa 22key4plc22 user781-key1 +2782 1 ssh-rsa 22key4plc22 user782-key1 +2783 1 ssh-rsa 22key4plc22 user783-key1 +2784 1 ssh-rsa 22key4plc22 user784-key1 +2785 1 ssh-rsa 22key4plc22 user785-key1 +2786 1 ssh-rsa 22key4plc22 user786-key1 +2787 1 ssh-rsa 22key4plc22 user787-key1 +2788 1 ssh-rsa 22key4plc22 user788-key1 +2789 1 ssh-rsa 22key4plc22 user789-key1 +2790 1 ssh-rsa 22key4plc22 user790-key1 +2791 1 ssh-rsa 22key4plc22 user791-key1 +2792 1 ssh-rsa 22key4plc22 user792-key1 +2793 1 ssh-rsa 22key4plc22 user793-key1 +2794 1 ssh-rsa 22key4plc22 user794-key1 +2795 1 ssh-rsa 22key4plc22 user795-key1 +2796 1 ssh-rsa 22key4plc22 user796-key1 +2797 1 ssh-rsa 22key4plc22 user797-key1 +2798 1 ssh-rsa 22key4plc22 user798-key1 +2799 1 ssh-rsa 22key4plc22 user799-key1 +2800 1 ssh-rsa 22key4plc22 user800-key1 +2801 1 ssh-rsa 22key4plc22 user801-key1 +2802 1 ssh-rsa 22key4plc22 user802-key1 +2803 1 ssh-rsa 22key4plc22 user803-key1 +2804 1 ssh-rsa 22key4plc22 user804-key1 +2805 1 ssh-rsa 22key4plc22 user805-key1 +2806 1 ssh-rsa 22key4plc22 user806-key1 +2807 1 ssh-rsa 22key4plc22 user807-key1 +2808 1 ssh-rsa 22key4plc22 user808-key1 +2809 1 ssh-rsa 22key4plc22 user809-key1 +2810 1 ssh-rsa 22key4plc22 user810-key1 +2811 1 ssh-rsa 22key4plc22 user811-key1 +2812 1 ssh-rsa 22key4plc22 user812-key1 +2813 1 ssh-rsa 22key4plc22 user813-key1 +2814 1 ssh-rsa 22key4plc22 user814-key1 +2815 1 ssh-rsa 22key4plc22 user815-key1 +2816 1 ssh-rsa 22key4plc22 user816-key1 +2817 1 ssh-rsa 22key4plc22 user817-key1 +2818 1 ssh-rsa 22key4plc22 user818-key1 +2819 1 ssh-rsa 22key4plc22 user819-key1 +2820 1 ssh-rsa 22key4plc22 user820-key1 +2821 1 ssh-rsa 22key4plc22 user821-key1 +2822 1 ssh-rsa 22key4plc22 user822-key1 +2823 1 ssh-rsa 22key4plc22 user823-key1 +2824 1 ssh-rsa 22key4plc22 user824-key1 +2825 1 ssh-rsa 22key4plc22 user825-key1 +2826 1 ssh-rsa 22key4plc22 user826-key1 +2827 1 ssh-rsa 22key4plc22 user827-key1 +2828 1 ssh-rsa 22key4plc22 user828-key1 +2829 1 ssh-rsa 22key4plc22 user829-key1 +2830 1 ssh-rsa 22key4plc22 user830-key1 +2831 1 ssh-rsa 22key4plc22 user831-key1 +2832 1 ssh-rsa 22key4plc22 user832-key1 +2833 1 ssh-rsa 22key4plc22 user833-key1 +2834 1 ssh-rsa 22key4plc22 user834-key1 +2835 1 ssh-rsa 22key4plc22 user835-key1 +2836 1 ssh-rsa 22key4plc22 user836-key1 +2837 1 ssh-rsa 22key4plc22 user837-key1 +2838 1 ssh-rsa 22key4plc22 user838-key1 +2839 1 ssh-rsa 22key4plc22 user839-key1 +2840 1 ssh-rsa 22key4plc22 user840-key1 +2841 1 ssh-rsa 22key4plc22 user841-key1 +2842 1 ssh-rsa 22key4plc22 user842-key1 +2843 1 ssh-rsa 22key4plc22 user843-key1 +2844 1 ssh-rsa 22key4plc22 user844-key1 +2845 1 ssh-rsa 22key4plc22 user845-key1 +2846 1 ssh-rsa 22key4plc22 user846-key1 +2847 1 ssh-rsa 22key4plc22 user847-key1 +2848 1 ssh-rsa 22key4plc22 user848-key1 +2849 1 ssh-rsa 22key4plc22 user849-key1 +2850 1 ssh-rsa 22key4plc22 user850-key1 +2851 1 ssh-rsa 22key4plc22 user851-key1 +2852 1 ssh-rsa 22key4plc22 user852-key1 +2853 1 ssh-rsa 22key4plc22 user853-key1 +2854 1 ssh-rsa 22key4plc22 user854-key1 +2855 1 ssh-rsa 22key4plc22 user855-key1 +2856 1 ssh-rsa 22key4plc22 user856-key1 +2857 1 ssh-rsa 22key4plc22 user857-key1 +2858 1 ssh-rsa 22key4plc22 user858-key1 +2859 1 ssh-rsa 22key4plc22 user859-key1 +2860 1 ssh-rsa 22key4plc22 user860-key1 +2861 1 ssh-rsa 22key4plc22 user861-key1 +2862 1 ssh-rsa 22key4plc22 user862-key1 +2863 1 ssh-rsa 22key4plc22 user863-key1 +2864 1 ssh-rsa 22key4plc22 user864-key1 +2865 1 ssh-rsa 22key4plc22 user865-key1 +2866 1 ssh-rsa 22key4plc22 user866-key1 +2867 1 ssh-rsa 22key4plc22 user867-key1 +2868 1 ssh-rsa 22key4plc22 user868-key1 +2869 1 ssh-rsa 22key4plc22 user869-key1 +2870 1 ssh-rsa 22key4plc22 user870-key1 +2871 1 ssh-rsa 22key4plc22 user871-key1 +2872 1 ssh-rsa 22key4plc22 user872-key1 +2873 1 ssh-rsa 22key4plc22 user873-key1 +2874 1 ssh-rsa 22key4plc22 user874-key1 +2875 1 ssh-rsa 22key4plc22 user875-key1 +2876 1 ssh-rsa 22key4plc22 user876-key1 +2877 1 ssh-rsa 22key4plc22 user877-key1 +2878 1 ssh-rsa 22key4plc22 user878-key1 +2879 1 ssh-rsa 22key4plc22 user879-key1 +2880 1 ssh-rsa 22key4plc22 user880-key1 +2881 1 ssh-rsa 22key4plc22 user881-key1 +2882 1 ssh-rsa 22key4plc22 user882-key1 +2883 1 ssh-rsa 22key4plc22 user883-key1 +2884 1 ssh-rsa 22key4plc22 user884-key1 +2885 1 ssh-rsa 22key4plc22 user885-key1 +2886 1 ssh-rsa 22key4plc22 user886-key1 +2887 1 ssh-rsa 22key4plc22 user887-key1 +2888 1 ssh-rsa 22key4plc22 user888-key1 +2889 1 ssh-rsa 22key4plc22 user889-key1 +2890 1 ssh-rsa 22key4plc22 user890-key1 +2891 1 ssh-rsa 22key4plc22 user891-key1 +2892 1 ssh-rsa 22key4plc22 user892-key1 +2893 1 ssh-rsa 22key4plc22 user893-key1 +2894 1 ssh-rsa 22key4plc22 user894-key1 +2895 1 ssh-rsa 22key4plc22 user895-key1 +2896 1 ssh-rsa 22key4plc22 user896-key1 +2897 1 ssh-rsa 22key4plc22 user897-key1 +2898 1 ssh-rsa 22key4plc22 user898-key1 +2899 1 ssh-rsa 22key4plc22 user899-key1 +2900 1 ssh-rsa 22key4plc22 user900-key1 +2901 1 ssh-rsa 22key4plc22 user901-key1 +2902 1 ssh-rsa 22key4plc22 user902-key1 +2903 1 ssh-rsa 22key4plc22 user903-key1 +2904 1 ssh-rsa 22key4plc22 user904-key1 +2905 1 ssh-rsa 22key4plc22 user905-key1 +2906 1 ssh-rsa 22key4plc22 user906-key1 +2907 1 ssh-rsa 22key4plc22 user907-key1 +2908 1 ssh-rsa 22key4plc22 user908-key1 +2909 1 ssh-rsa 22key4plc22 user909-key1 +2910 1 ssh-rsa 22key4plc22 user910-key1 +2911 1 ssh-rsa 22key4plc22 user911-key1 +2912 1 ssh-rsa 22key4plc22 user912-key1 +2913 1 ssh-rsa 22key4plc22 user913-key1 +2914 1 ssh-rsa 22key4plc22 user914-key1 +2915 1 ssh-rsa 22key4plc22 user915-key1 +2916 1 ssh-rsa 22key4plc22 user916-key1 +2917 1 ssh-rsa 22key4plc22 user917-key1 +2918 1 ssh-rsa 22key4plc22 user918-key1 +2919 1 ssh-rsa 22key4plc22 user919-key1 +2920 1 ssh-rsa 22key4plc22 user920-key1 +2921 1 ssh-rsa 22key4plc22 user921-key1 +2922 1 ssh-rsa 22key4plc22 user922-key1 +2923 1 ssh-rsa 22key4plc22 user923-key1 +2924 1 ssh-rsa 22key4plc22 user924-key1 +2925 1 ssh-rsa 22key4plc22 user925-key1 +2926 1 ssh-rsa 22key4plc22 user926-key1 +2927 1 ssh-rsa 22key4plc22 user927-key1 +2928 1 ssh-rsa 22key4plc22 user928-key1 +2929 1 ssh-rsa 22key4plc22 user929-key1 +2930 1 ssh-rsa 22key4plc22 user930-key1 +2931 1 ssh-rsa 22key4plc22 user931-key1 +2932 1 ssh-rsa 22key4plc22 user932-key1 +2933 1 ssh-rsa 22key4plc22 user933-key1 +2934 1 ssh-rsa 22key4plc22 user934-key1 +2935 1 ssh-rsa 22key4plc22 user935-key1 +2936 1 ssh-rsa 22key4plc22 user936-key1 +2937 1 ssh-rsa 22key4plc22 user937-key1 +2938 1 ssh-rsa 22key4plc22 user938-key1 +2939 1 ssh-rsa 22key4plc22 user939-key1 +2940 1 ssh-rsa 22key4plc22 user940-key1 +2941 1 ssh-rsa 22key4plc22 user941-key1 +2942 1 ssh-rsa 22key4plc22 user942-key1 +2943 1 ssh-rsa 22key4plc22 user943-key1 +2944 1 ssh-rsa 22key4plc22 user944-key1 +2945 1 ssh-rsa 22key4plc22 user945-key1 +2946 1 ssh-rsa 22key4plc22 user946-key1 +2947 1 ssh-rsa 22key4plc22 user947-key1 +2948 1 ssh-rsa 22key4plc22 user948-key1 +2949 1 ssh-rsa 22key4plc22 user949-key1 +2950 1 ssh-rsa 22key4plc22 user950-key1 +2951 1 ssh-rsa 22key4plc22 user951-key1 +2952 1 ssh-rsa 22key4plc22 user952-key1 +2953 1 ssh-rsa 22key4plc22 user953-key1 +2954 1 ssh-rsa 22key4plc22 user954-key1 +2955 1 ssh-rsa 22key4plc22 user955-key1 +2956 1 ssh-rsa 22key4plc22 user956-key1 +2957 1 ssh-rsa 22key4plc22 user957-key1 +2958 1 ssh-rsa 22key4plc22 user958-key1 +2959 1 ssh-rsa 22key4plc22 user959-key1 +2960 1 ssh-rsa 22key4plc22 user960-key1 +2961 1 ssh-rsa 22key4plc22 user961-key1 +2962 1 ssh-rsa 22key4plc22 user962-key1 +2963 1 ssh-rsa 22key4plc22 user963-key1 +2964 1 ssh-rsa 22key4plc22 user964-key1 +2965 1 ssh-rsa 22key4plc22 user965-key1 +2966 1 ssh-rsa 22key4plc22 user966-key1 +2967 1 ssh-rsa 22key4plc22 user967-key1 +2968 1 ssh-rsa 22key4plc22 user968-key1 +2969 1 ssh-rsa 22key4plc22 user969-key1 +2970 1 ssh-rsa 22key4plc22 user970-key1 +2971 1 ssh-rsa 22key4plc22 user971-key1 +2972 1 ssh-rsa 22key4plc22 user972-key1 +2973 1 ssh-rsa 22key4plc22 user973-key1 +2974 1 ssh-rsa 22key4plc22 user974-key1 +2975 1 ssh-rsa 22key4plc22 user975-key1 +2976 1 ssh-rsa 22key4plc22 user976-key1 +2977 1 ssh-rsa 22key4plc22 user977-key1 +2978 1 ssh-rsa 22key4plc22 user978-key1 +2979 1 ssh-rsa 22key4plc22 user979-key1 +2980 1 ssh-rsa 22key4plc22 user980-key1 +2981 1 ssh-rsa 22key4plc22 user981-key1 +2982 1 ssh-rsa 22key4plc22 user982-key1 +2983 1 ssh-rsa 22key4plc22 user983-key1 +2984 1 ssh-rsa 22key4plc22 user984-key1 +2985 1 ssh-rsa 22key4plc22 user985-key1 +2986 1 ssh-rsa 22key4plc22 user986-key1 +2987 1 ssh-rsa 22key4plc22 user987-key1 +2988 1 ssh-rsa 22key4plc22 user988-key1 +2989 1 ssh-rsa 22key4plc22 user989-key1 +2990 1 ssh-rsa 22key4plc22 user990-key1 +2991 1 ssh-rsa 22key4plc22 user991-key1 +2992 1 ssh-rsa 22key4plc22 user992-key1 +2993 1 ssh-rsa 22key4plc22 user993-key1 +2994 1 ssh-rsa 22key4plc22 user994-key1 +2995 1 ssh-rsa 22key4plc22 user995-key1 +2996 1 ssh-rsa 22key4plc22 user996-key1 +2997 1 ssh-rsa 22key4plc22 user997-key1 +2998 1 ssh-rsa 22key4plc22 user998-key1 +2999 1 ssh-rsa 22key4plc22 user999-key1 +3000 1 ssh-rsa 22key4plc22 user1000-key1 +3001 1 ssh-rsa 22key4plc22 user1001-key1 +3002 1 ssh-rsa 22key4plc22 user1002-key1 +3003 1 ssh-rsa 22key4plc22 user1003-key1 +3004 1 ssh-rsa 22key4plc22 user1004-key1 +3005 1 ssh-rsa 22key4plc22 user1005-key1 +3006 1 ssh-rsa 22key4plc22 user1006-key1 +3007 1 ssh-rsa 22key4plc22 user1007-key1 +3008 1 ssh-rsa 22key4plc22 user1008-key1 +3009 1 ssh-rsa 22key4plc22 user1009-key1 +3010 1 ssh-rsa 22key4plc22 user1010-key1 +3011 1 ssh-rsa 22key4plc22 user1011-key1 +3012 1 ssh-rsa 22key4plc22 user1012-key1 +3013 1 ssh-rsa 22key4plc22 user1013-key1 +3014 1 ssh-rsa 22key4plc22 user1014-key1 +3015 1 ssh-rsa 22key4plc22 user1015-key1 +3016 1 ssh-rsa 22key4plc22 user1016-key1 +3017 1 ssh-rsa 22key4plc22 user1017-key1 +3018 1 ssh-rsa 22key4plc22 user1018-key1 +3019 1 ssh-rsa 22key4plc22 user1019-key1 +3020 1 ssh-rsa 22key4plc22 user1020-key1 +3021 1 ssh-rsa 22key4plc22 user1021-key1 +3022 1 ssh-rsa 22key4plc22 user1022-key1 +3023 1 ssh-rsa 22key4plc22 user1023-key1 +3024 1 ssh-rsa 22key4plc22 user1024-key1 +3025 1 ssh-rsa 22key4plc22 user1025-key1 +3026 1 ssh-rsa 22key4plc22 user1026-key1 +3027 1 ssh-rsa 22key4plc22 user1027-key1 +3028 1 ssh-rsa 22key4plc22 user1028-key1 +3029 1 ssh-rsa 22key4plc22 user1029-key1 +3030 1 ssh-rsa 22key4plc22 user1030-key1 +3031 1 ssh-rsa 22key4plc22 user1031-key1 +3032 1 ssh-rsa 22key4plc22 user1032-key1 +3033 1 ssh-rsa 22key4plc22 user1033-key1 +3034 1 ssh-rsa 22key4plc22 user1034-key1 +3035 1 ssh-rsa 22key4plc22 user1035-key1 +3036 1 ssh-rsa 22key4plc22 user1036-key1 +3037 1 ssh-rsa 22key4plc22 user1037-key1 +3038 1 ssh-rsa 22key4plc22 user1038-key1 +3039 1 ssh-rsa 22key4plc22 user1039-key1 +3040 1 ssh-rsa 22key4plc22 user1040-key1 +3041 1 ssh-rsa 22key4plc22 user1041-key1 +3042 1 ssh-rsa 22key4plc22 user1042-key1 +3043 1 ssh-rsa 22key4plc22 user1043-key1 +3044 1 ssh-rsa 22key4plc22 user1044-key1 +3045 1 ssh-rsa 22key4plc22 user1045-key1 +3046 1 ssh-rsa 22key4plc22 user1046-key1 +3047 1 ssh-rsa 22key4plc22 user1047-key1 +3048 1 ssh-rsa 22key4plc22 user1048-key1 +3049 1 ssh-rsa 22key4plc22 user1049-key1 +3050 1 ssh-rsa 22key4plc22 user1050-key1 +3051 1 ssh-rsa 22key4plc22 user1051-key1 +3052 1 ssh-rsa 22key4plc22 user1052-key1 +3053 1 ssh-rsa 22key4plc22 user1053-key1 +3054 1 ssh-rsa 22key4plc22 user1054-key1 +3055 1 ssh-rsa 22key4plc22 user1055-key1 +3056 1 ssh-rsa 22key4plc22 user1056-key1 +3057 1 ssh-rsa 22key4plc22 user1057-key1 +3058 1 ssh-rsa 22key4plc22 user1058-key1 +3059 1 ssh-rsa 22key4plc22 user1059-key1 +3060 1 ssh-rsa 22key4plc22 user1060-key1 +3061 1 ssh-rsa 22key4plc22 user1061-key1 +3062 1 ssh-rsa 22key4plc22 user1062-key1 +3063 1 ssh-rsa 22key4plc22 user1063-key1 +3064 1 ssh-rsa 22key4plc22 user1064-key1 +3065 1 ssh-rsa 22key4plc22 user1065-key1 +3066 1 ssh-rsa 22key4plc22 user1066-key1 +3067 1 ssh-rsa 22key4plc22 user1067-key1 +3068 1 ssh-rsa 22key4plc22 user1068-key1 +3069 1 ssh-rsa 22key4plc22 user1069-key1 +3070 1 ssh-rsa 22key4plc22 user1070-key1 +3071 1 ssh-rsa 22key4plc22 user1071-key1 +3072 1 ssh-rsa 22key4plc22 user1072-key1 +3073 1 ssh-rsa 22key4plc22 user1073-key1 +3074 1 ssh-rsa 22key4plc22 user1074-key1 +3075 1 ssh-rsa 22key4plc22 user1075-key1 +3076 1 ssh-rsa 22key4plc22 user1076-key1 +3077 1 ssh-rsa 22key4plc22 user1077-key1 +3078 1 ssh-rsa 22key4plc22 user1078-key1 +3079 1 ssh-rsa 22key4plc22 user1079-key1 +3080 1 ssh-rsa 22key4plc22 user1080-key1 +3081 1 ssh-rsa 22key4plc22 user1081-key1 +3082 1 ssh-rsa 22key4plc22 user1082-key1 +3083 1 ssh-rsa 22key4plc22 user1083-key1 +3084 1 ssh-rsa 22key4plc22 user1084-key1 +3085 1 ssh-rsa 22key4plc22 user1085-key1 +3086 1 ssh-rsa 22key4plc22 user1086-key1 +3087 1 ssh-rsa 22key4plc22 user1087-key1 +3088 1 ssh-rsa 22key4plc22 user1088-key1 +3089 1 ssh-rsa 22key4plc22 user1089-key1 +3090 1 ssh-rsa 22key4plc22 user1090-key1 +3091 1 ssh-rsa 22key4plc22 user1091-key1 +3092 1 ssh-rsa 22key4plc22 user1092-key1 +3093 1 ssh-rsa 22key4plc22 user1093-key1 +3094 1 ssh-rsa 22key4plc22 user1094-key1 +3095 1 ssh-rsa 22key4plc22 user1095-key1 +3096 1 ssh-rsa 22key4plc22 user1096-key1 +3097 1 ssh-rsa 22key4plc22 user1097-key1 +3098 1 ssh-rsa 22key4plc22 user1098-key1 +3099 1 ssh-rsa 22key4plc22 user1099-key1 +3100 1 ssh-rsa 22key4plc22 user1100-key1 +3101 1 ssh-rsa 22key4plc22 user1101-key1 +3102 1 ssh-rsa 22key4plc22 user1102-key1 +3103 1 ssh-rsa 22key4plc22 user1103-key1 +3104 1 ssh-rsa 22key4plc22 user1104-key1 +3105 1 ssh-rsa 22key4plc22 user1105-key1 +3106 1 ssh-rsa 22key4plc22 user1106-key1 +3107 1 ssh-rsa 22key4plc22 user1107-key1 +3108 1 ssh-rsa 22key4plc22 user1108-key1 +3109 1 ssh-rsa 22key4plc22 user1109-key1 +3110 1 ssh-rsa 22key4plc22 user1110-key1 +3111 1 ssh-rsa 22key4plc22 user1111-key1 +3112 1 ssh-rsa 22key4plc22 user1112-key1 +3113 1 ssh-rsa 22key4plc22 user1113-key1 +3114 1 ssh-rsa 22key4plc22 user1114-key1 +3115 1 ssh-rsa 22key4plc22 user1115-key1 +3116 1 ssh-rsa 22key4plc22 user1116-key1 +3117 1 ssh-rsa 22key4plc22 user1117-key1 +3118 1 ssh-rsa 22key4plc22 user1118-key1 +3119 1 ssh-rsa 22key4plc22 user1119-key1 +3120 1 ssh-rsa 22key4plc22 user1120-key1 +3121 1 ssh-rsa 22key4plc22 user1121-key1 +3122 1 ssh-rsa 22key4plc22 user1122-key1 +3123 1 ssh-rsa 22key4plc22 user1123-key1 +3124 1 ssh-rsa 22key4plc22 user1124-key1 +3125 1 ssh-rsa 22key4plc22 user1125-key1 +3126 1 ssh-rsa 22key4plc22 user1126-key1 +3127 1 ssh-rsa 22key4plc22 user1127-key1 +3128 1 ssh-rsa 22key4plc22 user1128-key1 +3129 1 ssh-rsa 22key4plc22 user1129-key1 +3130 1 ssh-rsa 22key4plc22 user1130-key1 +3131 1 ssh-rsa 22key4plc22 user1131-key1 +3132 1 ssh-rsa 22key4plc22 user1132-key1 +3133 1 ssh-rsa 22key4plc22 user1133-key1 +3134 1 ssh-rsa 22key4plc22 user1134-key1 +3135 1 ssh-rsa 22key4plc22 user1135-key1 +3136 1 ssh-rsa 22key4plc22 user1136-key1 +3137 1 ssh-rsa 22key4plc22 user1137-key1 +3138 1 ssh-rsa 22key4plc22 user1138-key1 +3139 1 ssh-rsa 22key4plc22 user1139-key1 +3140 1 ssh-rsa 22key4plc22 user1140-key1 +3141 1 ssh-rsa 22key4plc22 user1141-key1 +3142 1 ssh-rsa 22key4plc22 user1142-key1 +3143 1 ssh-rsa 22key4plc22 user1143-key1 +3144 1 ssh-rsa 22key4plc22 user1144-key1 +3145 1 ssh-rsa 22key4plc22 user1145-key1 +3146 1 ssh-rsa 22key4plc22 user1146-key1 +3147 1 ssh-rsa 22key4plc22 user1147-key1 +3148 1 ssh-rsa 22key4plc22 user1148-key1 +3149 1 ssh-rsa 22key4plc22 user1149-key1 +3150 1 ssh-rsa 22key4plc22 user1150-key1 +3151 1 ssh-rsa 22key4plc22 user1151-key1 +3152 1 ssh-rsa 22key4plc22 user1152-key1 +3153 1 ssh-rsa 22key4plc22 user1153-key1 +3154 1 ssh-rsa 22key4plc22 user1154-key1 +3155 1 ssh-rsa 22key4plc22 user1155-key1 +3156 1 ssh-rsa 22key4plc22 user1156-key1 +3157 1 ssh-rsa 22key4plc22 user1157-key1 +3158 1 ssh-rsa 22key4plc22 user1158-key1 +3159 1 ssh-rsa 22key4plc22 user1159-key1 +3160 1 ssh-rsa 22key4plc22 user1160-key1 +3161 1 ssh-rsa 22key4plc22 user1161-key1 +3162 1 ssh-rsa 22key4plc22 user1162-key1 +3163 1 ssh-rsa 22key4plc22 user1163-key1 +3164 1 ssh-rsa 22key4plc22 user1164-key1 +3165 1 ssh-rsa 22key4plc22 user1165-key1 +3166 1 ssh-rsa 22key4plc22 user1166-key1 +3167 1 ssh-rsa 22key4plc22 user1167-key1 +3168 1 ssh-rsa 22key4plc22 user1168-key1 +3169 1 ssh-rsa 22key4plc22 user1169-key1 +3170 1 ssh-rsa 22key4plc22 user1170-key1 +3171 1 ssh-rsa 22key4plc22 user1171-key1 +3172 1 ssh-rsa 22key4plc22 user1172-key1 +3173 1 ssh-rsa 22key4plc22 user1173-key1 +3174 1 ssh-rsa 22key4plc22 user1174-key1 +3175 1 ssh-rsa 22key4plc22 user1175-key1 +3176 1 ssh-rsa 22key4plc22 user1176-key1 +3177 1 ssh-rsa 22key4plc22 user1177-key1 +3178 1 ssh-rsa 22key4plc22 user1178-key1 +3179 1 ssh-rsa 22key4plc22 user1179-key1 +3180 1 ssh-rsa 22key4plc22 user1180-key1 +3181 1 ssh-rsa 22key4plc22 user1181-key1 +3182 1 ssh-rsa 22key4plc22 user1182-key1 +3183 1 ssh-rsa 22key4plc22 user1183-key1 +3184 1 ssh-rsa 22key4plc22 user1184-key1 +3185 1 ssh-rsa 22key4plc22 user1185-key1 +3186 1 ssh-rsa 22key4plc22 user1186-key1 +3187 1 ssh-rsa 22key4plc22 user1187-key1 +3188 1 ssh-rsa 22key4plc22 user1188-key1 +3189 1 ssh-rsa 22key4plc22 user1189-key1 +3190 1 ssh-rsa 22key4plc22 user1190-key1 +3191 1 ssh-rsa 22key4plc22 user1191-key1 +3192 1 ssh-rsa 22key4plc22 user1192-key1 +3193 1 ssh-rsa 22key4plc22 user1193-key1 +3194 1 ssh-rsa 22key4plc22 user1194-key1 +3195 1 ssh-rsa 22key4plc22 user1195-key1 +3196 1 ssh-rsa 22key4plc22 user1196-key1 +3197 1 ssh-rsa 22key4plc22 user1197-key1 +3198 1 ssh-rsa 22key4plc22 user1198-key1 +3199 1 ssh-rsa 22key4plc22 user1199-key1 +3200 1 ssh-rsa 22key4plc22 user1200-key1 +3201 1 ssh-rsa 22key4plc22 user1201-key1 +3202 1 ssh-rsa 22key4plc22 user1202-key1 +3203 1 ssh-rsa 22key4plc22 user1203-key1 +3204 1 ssh-rsa 22key4plc22 user1204-key1 +3205 1 ssh-rsa 22key4plc22 user1205-key1 +3206 1 ssh-rsa 22key4plc22 user1206-key1 +3207 1 ssh-rsa 22key4plc22 user1207-key1 +3208 1 ssh-rsa 22key4plc22 user1208-key1 +3209 1 ssh-rsa 22key4plc22 user1209-key1 +3210 1 ssh-rsa 22key4plc22 user1210-key1 +3211 1 ssh-rsa 22key4plc22 user1211-key1 +3212 1 ssh-rsa 22key4plc22 user1212-key1 +3213 1 ssh-rsa 22key4plc22 user1213-key1 +3214 1 ssh-rsa 22key4plc22 user1214-key1 +3215 1 ssh-rsa 22key4plc22 user1215-key1 +3216 1 ssh-rsa 22key4plc22 user1216-key1 +3217 1 ssh-rsa 22key4plc22 user1217-key1 +3218 1 ssh-rsa 22key4plc22 user1218-key1 +3219 1 ssh-rsa 22key4plc22 user1219-key1 +3220 1 ssh-rsa 22key4plc22 user1220-key1 +3221 1 ssh-rsa 22key4plc22 user1221-key1 +3222 1 ssh-rsa 22key4plc22 user1222-key1 +3223 1 ssh-rsa 22key4plc22 user1223-key1 +3224 1 ssh-rsa 22key4plc22 user1224-key1 +3225 1 ssh-rsa 22key4plc22 user1225-key1 +3226 1 ssh-rsa 22key4plc22 user1226-key1 +3227 1 ssh-rsa 22key4plc22 user1227-key1 +3228 1 ssh-rsa 22key4plc22 user1228-key1 +3229 1 ssh-rsa 22key4plc22 user1229-key1 +3230 1 ssh-rsa 22key4plc22 user1230-key1 +3231 1 ssh-rsa 22key4plc22 user1231-key1 +3232 1 ssh-rsa 22key4plc22 user1232-key1 +3233 1 ssh-rsa 22key4plc22 user1233-key1 +3234 1 ssh-rsa 22key4plc22 user1234-key1 +3235 1 ssh-rsa 22key4plc22 user1235-key1 +3236 1 ssh-rsa 22key4plc22 user1236-key1 +3237 1 ssh-rsa 22key4plc22 user1237-key1 +3238 1 ssh-rsa 22key4plc22 user1238-key1 +3239 1 ssh-rsa 22key4plc22 user1239-key1 +3240 1 ssh-rsa 22key4plc22 user1240-key1 +3241 1 ssh-rsa 22key4plc22 user1241-key1 +3242 1 ssh-rsa 22key4plc22 user1242-key1 +3243 1 ssh-rsa 22key4plc22 user1243-key1 +3244 1 ssh-rsa 22key4plc22 user1244-key1 +3245 1 ssh-rsa 22key4plc22 user1245-key1 +3246 1 ssh-rsa 22key4plc22 user1246-key1 +3247 1 ssh-rsa 22key4plc22 user1247-key1 +3248 1 ssh-rsa 22key4plc22 user1248-key1 +3249 1 ssh-rsa 22key4plc22 user1249-key1 +3250 1 ssh-rsa 22key4plc22 user1250-key1 +3251 1 ssh-rsa 22key4plc22 user1251-key1 +3252 1 ssh-rsa 22key4plc22 user1252-key1 +3253 1 ssh-rsa 22key4plc22 user1253-key1 +3254 1 ssh-rsa 22key4plc22 user1254-key1 +3255 1 ssh-rsa 22key4plc22 user1255-key1 +3256 1 ssh-rsa 22key4plc22 user1256-key1 +3257 1 ssh-rsa 22key4plc22 user1257-key1 +3258 1 ssh-rsa 22key4plc22 user1258-key1 +3259 1 ssh-rsa 22key4plc22 user1259-key1 +3260 1 ssh-rsa 22key4plc22 user1260-key1 +3261 1 ssh-rsa 22key4plc22 user1261-key1 +3262 1 ssh-rsa 22key4plc22 user1262-key1 +3263 1 ssh-rsa 22key4plc22 user1263-key1 +3264 1 ssh-rsa 22key4plc22 user1264-key1 +3265 1 ssh-rsa 22key4plc22 user1265-key1 +3266 1 ssh-rsa 22key4plc22 user1266-key1 +3267 1 ssh-rsa 22key4plc22 user1267-key1 +3268 1 ssh-rsa 22key4plc22 user1268-key1 +3269 1 ssh-rsa 22key4plc22 user1269-key1 +3270 1 ssh-rsa 22key4plc22 user1270-key1 +3271 1 ssh-rsa 22key4plc22 user1271-key1 +3272 1 ssh-rsa 22key4plc22 user1272-key1 +3273 1 ssh-rsa 22key4plc22 user1273-key1 +3274 1 ssh-rsa 22key4plc22 user1274-key1 +3275 1 ssh-rsa 22key4plc22 user1275-key1 +3276 1 ssh-rsa 22key4plc22 user1276-key1 +3277 1 ssh-rsa 22key4plc22 user1277-key1 +3278 1 ssh-rsa 22key4plc22 user1278-key1 +3279 1 ssh-rsa 22key4plc22 user1279-key1 +3280 1 ssh-rsa 22key4plc22 user1280-key1 +3281 1 ssh-rsa 22key4plc22 user1281-key1 +3282 1 ssh-rsa 22key4plc22 user1282-key1 +3283 1 ssh-rsa 22key4plc22 user1283-key1 +3284 1 ssh-rsa 22key4plc22 user1284-key1 +3285 1 ssh-rsa 22key4plc22 user1285-key1 +3286 1 ssh-rsa 22key4plc22 user1286-key1 +3287 1 ssh-rsa 22key4plc22 user1287-key1 +3288 1 ssh-rsa 22key4plc22 user1288-key1 +3289 1 ssh-rsa 22key4plc22 user1289-key1 +3290 1 ssh-rsa 22key4plc22 user1290-key1 +3291 1 ssh-rsa 22key4plc22 user1291-key1 +3292 1 ssh-rsa 22key4plc22 user1292-key1 +3293 1 ssh-rsa 22key4plc22 user1293-key1 +3294 1 ssh-rsa 22key4plc22 user1294-key1 +3295 1 ssh-rsa 22key4plc22 user1295-key1 +3296 1 ssh-rsa 22key4plc22 user1296-key1 +3297 1 ssh-rsa 22key4plc22 user1297-key1 +3298 1 ssh-rsa 22key4plc22 user1298-key1 +3299 1 ssh-rsa 22key4plc22 user1299-key1 +3300 1 ssh-rsa 22key4plc22 user1300-key1 +3301 1 ssh-rsa 22key4plc22 user1301-key1 +3302 1 ssh-rsa 22key4plc22 user1302-key1 +3303 1 ssh-rsa 22key4plc22 user1303-key1 +3304 1 ssh-rsa 22key4plc22 user1304-key1 +3305 1 ssh-rsa 22key4plc22 user1305-key1 +3306 1 ssh-rsa 22key4plc22 user1306-key1 +3307 1 ssh-rsa 22key4plc22 user1307-key1 +3308 1 ssh-rsa 22key4plc22 user1308-key1 +3309 1 ssh-rsa 22key4plc22 user1309-key1 +3310 1 ssh-rsa 22key4plc22 user1310-key1 +3311 1 ssh-rsa 22key4plc22 user1311-key1 +3312 1 ssh-rsa 22key4plc22 user1312-key1 +3313 1 ssh-rsa 22key4plc22 user1313-key1 +3314 1 ssh-rsa 22key4plc22 user1314-key1 +3315 1 ssh-rsa 22key4plc22 user1315-key1 +3316 1 ssh-rsa 22key4plc22 user1316-key1 +3317 1 ssh-rsa 22key4plc22 user1317-key1 +3318 1 ssh-rsa 22key4plc22 user1318-key1 +3319 1 ssh-rsa 22key4plc22 user1319-key1 +3320 1 ssh-rsa 22key4plc22 user1320-key1 +3321 1 ssh-rsa 22key4plc22 user1321-key1 +3322 1 ssh-rsa 22key4plc22 user1322-key1 +3323 1 ssh-rsa 22key4plc22 user1323-key1 +3324 1 ssh-rsa 22key4plc22 user1324-key1 +3325 1 ssh-rsa 22key4plc22 user1325-key1 +3326 1 ssh-rsa 22key4plc22 user1326-key1 +3327 1 ssh-rsa 22key4plc22 user1327-key1 +3328 1 ssh-rsa 22key4plc22 user1328-key1 +3329 1 ssh-rsa 22key4plc22 user1329-key1 +3330 1 ssh-rsa 22key4plc22 user1330-key1 +3331 1 ssh-rsa 22key4plc22 user1331-key1 +3332 1 ssh-rsa 22key4plc22 user1332-key1 +3333 1 ssh-rsa 22key4plc22 user1333-key1 +3334 1 ssh-rsa 22key4plc22 user1334-key1 +3335 1 ssh-rsa 22key4plc22 user1335-key1 +3336 1 ssh-rsa 22key4plc22 user1336-key1 +3337 1 ssh-rsa 22key4plc22 user1337-key1 +3338 1 ssh-rsa 22key4plc22 user1338-key1 +3339 1 ssh-rsa 22key4plc22 user1339-key1 +3340 1 ssh-rsa 22key4plc22 user1340-key1 +3341 1 ssh-rsa 22key4plc22 user1341-key1 +3342 1 ssh-rsa 22key4plc22 user1342-key1 +3343 1 ssh-rsa 22key4plc22 user1343-key1 +3344 1 ssh-rsa 22key4plc22 user1344-key1 +3345 1 ssh-rsa 22key4plc22 user1345-key1 +3346 1 ssh-rsa 22key4plc22 user1346-key1 +3347 1 ssh-rsa 22key4plc22 user1347-key1 +3348 1 ssh-rsa 22key4plc22 user1348-key1 +3349 1 ssh-rsa 22key4plc22 user1349-key1 +3350 1 ssh-rsa 22key4plc22 user1350-key1 +3351 1 ssh-rsa 22key4plc22 user1351-key1 +3352 1 ssh-rsa 22key4plc22 user1352-key1 +3353 1 ssh-rsa 22key4plc22 user1353-key1 +3354 1 ssh-rsa 22key4plc22 user1354-key1 +3355 1 ssh-rsa 22key4plc22 user1355-key1 +3356 1 ssh-rsa 22key4plc22 user1356-key1 +3357 1 ssh-rsa 22key4plc22 user1357-key1 +3358 1 ssh-rsa 22key4plc22 user1358-key1 +3359 1 ssh-rsa 22key4plc22 user1359-key1 +3360 1 ssh-rsa 22key4plc22 user1360-key1 +3361 1 ssh-rsa 22key4plc22 user1361-key1 +3362 1 ssh-rsa 22key4plc22 user1362-key1 +3363 1 ssh-rsa 22key4plc22 user1363-key1 +3364 1 ssh-rsa 22key4plc22 user1364-key1 +3365 1 ssh-rsa 22key4plc22 user1365-key1 +3366 1 ssh-rsa 22key4plc22 user1366-key1 +3367 1 ssh-rsa 22key4plc22 user1367-key1 +3368 1 ssh-rsa 22key4plc22 user1368-key1 +3369 1 ssh-rsa 22key4plc22 user1369-key1 +3370 1 ssh-rsa 22key4plc22 user1370-key1 +3371 1 ssh-rsa 22key4plc22 user1371-key1 +3372 1 ssh-rsa 22key4plc22 user1372-key1 +3373 1 ssh-rsa 22key4plc22 user1373-key1 +3374 1 ssh-rsa 22key4plc22 user1374-key1 +3375 1 ssh-rsa 22key4plc22 user1375-key1 +3376 1 ssh-rsa 22key4plc22 user1376-key1 +3377 1 ssh-rsa 22key4plc22 user1377-key1 +3378 1 ssh-rsa 22key4plc22 user1378-key1 +3379 1 ssh-rsa 22key4plc22 user1379-key1 +3380 1 ssh-rsa 22key4plc22 user1380-key1 +3381 1 ssh-rsa 22key4plc22 user1381-key1 +3382 1 ssh-rsa 22key4plc22 user1382-key1 +3383 1 ssh-rsa 22key4plc22 user1383-key1 +3384 1 ssh-rsa 22key4plc22 user1384-key1 +3385 1 ssh-rsa 22key4plc22 user1385-key1 +3386 1 ssh-rsa 22key4plc22 user1386-key1 +3387 1 ssh-rsa 22key4plc22 user1387-key1 +3388 1 ssh-rsa 22key4plc22 user1388-key1 +3389 1 ssh-rsa 22key4plc22 user1389-key1 +3390 1 ssh-rsa 22key4plc22 user1390-key1 +3391 1 ssh-rsa 22key4plc22 user1391-key1 +3392 1 ssh-rsa 22key4plc22 user1392-key1 +3393 1 ssh-rsa 22key4plc22 user1393-key1 +3394 1 ssh-rsa 22key4plc22 user1394-key1 +3395 1 ssh-rsa 22key4plc22 user1395-key1 +3396 1 ssh-rsa 22key4plc22 user1396-key1 +3397 1 ssh-rsa 22key4plc22 user1397-key1 +3398 1 ssh-rsa 22key4plc22 user1398-key1 +3399 1 ssh-rsa 22key4plc22 user1399-key1 +3400 1 ssh-rsa 22key4plc22 user1400-key1 +3401 1 ssh-rsa 22key4plc22 user1401-key1 +3402 1 ssh-rsa 22key4plc22 user1402-key1 +3403 1 ssh-rsa 22key4plc22 user1403-key1 +3404 1 ssh-rsa 22key4plc22 user1404-key1 +3405 1 ssh-rsa 22key4plc22 user1405-key1 +3406 1 ssh-rsa 22key4plc22 user1406-key1 +3407 1 ssh-rsa 22key4plc22 user1407-key1 +3408 1 ssh-rsa 22key4plc22 user1408-key1 +3409 1 ssh-rsa 22key4plc22 user1409-key1 +3410 1 ssh-rsa 22key4plc22 user1410-key1 +3411 1 ssh-rsa 22key4plc22 user1411-key1 +3412 1 ssh-rsa 22key4plc22 user1412-key1 +3413 1 ssh-rsa 22key4plc22 user1413-key1 +3414 1 ssh-rsa 22key4plc22 user1414-key1 +3415 1 ssh-rsa 22key4plc22 user1415-key1 +3416 1 ssh-rsa 22key4plc22 user1416-key1 +3417 1 ssh-rsa 22key4plc22 user1417-key1 +3418 1 ssh-rsa 22key4plc22 user1418-key1 +3419 1 ssh-rsa 22key4plc22 user1419-key1 +3420 1 ssh-rsa 22key4plc22 user1420-key1 +3421 1 ssh-rsa 22key4plc22 user1421-key1 +3422 1 ssh-rsa 22key4plc22 user1422-key1 +3423 1 ssh-rsa 22key4plc22 user1423-key1 +3424 1 ssh-rsa 22key4plc22 user1424-key1 +3425 1 ssh-rsa 22key4plc22 user1425-key1 +3426 1 ssh-rsa 22key4plc22 user1426-key1 +3427 1 ssh-rsa 22key4plc22 user1427-key1 +3428 1 ssh-rsa 22key4plc22 user1428-key1 +3429 1 ssh-rsa 22key4plc22 user1429-key1 +3430 1 ssh-rsa 22key4plc22 user1430-key1 +3431 1 ssh-rsa 22key4plc22 user1431-key1 +3432 1 ssh-rsa 22key4plc22 user1432-key1 +3433 1 ssh-rsa 22key4plc22 user1433-key1 +3434 1 ssh-rsa 22key4plc22 user1434-key1 +3435 1 ssh-rsa 22key4plc22 user1435-key1 +3436 1 ssh-rsa 22key4plc22 user1436-key1 +3437 1 ssh-rsa 22key4plc22 user1437-key1 +3438 1 ssh-rsa 22key4plc22 user1438-key1 +3439 1 ssh-rsa 22key4plc22 user1439-key1 +3440 1 ssh-rsa 22key4plc22 user1440-key1 +3441 1 ssh-rsa 22key4plc22 user1441-key1 +3442 1 ssh-rsa 22key4plc22 user1442-key1 +3443 1 ssh-rsa 22key4plc22 user1443-key1 +3444 1 ssh-rsa 22key4plc22 user1444-key1 +3445 1 ssh-rsa 22key4plc22 user1445-key1 +3446 1 ssh-rsa 22key4plc22 user1446-key1 +3447 1 ssh-rsa 22key4plc22 user1447-key1 +3448 1 ssh-rsa 22key4plc22 user1448-key1 +3449 1 ssh-rsa 22key4plc22 user1449-key1 +3450 1 ssh-rsa 22key4plc22 user1450-key1 +3451 1 ssh-rsa 22key4plc22 user1451-key1 +3452 1 ssh-rsa 22key4plc22 user1452-key1 +3453 1 ssh-rsa 22key4plc22 user1453-key1 +3454 1 ssh-rsa 22key4plc22 user1454-key1 +3455 1 ssh-rsa 22key4plc22 user1455-key1 +3456 1 ssh-rsa 22key4plc22 user1456-key1 +3457 1 ssh-rsa 22key4plc22 user1457-key1 +3458 1 ssh-rsa 22key4plc22 user1458-key1 +3459 1 ssh-rsa 22key4plc22 user1459-key1 +3460 1 ssh-rsa 22key4plc22 user1460-key1 +3461 1 ssh-rsa 22key4plc22 user1461-key1 +3462 1 ssh-rsa 22key4plc22 user1462-key1 +3463 1 ssh-rsa 22key4plc22 user1463-key1 +3464 1 ssh-rsa 22key4plc22 user1464-key1 +3465 1 ssh-rsa 22key4plc22 user1465-key1 +3466 1 ssh-rsa 22key4plc22 user1466-key1 +3467 1 ssh-rsa 22key4plc22 user1467-key1 +3468 1 ssh-rsa 22key4plc22 user1468-key1 +3469 1 ssh-rsa 22key4plc22 user1469-key1 +3470 1 ssh-rsa 22key4plc22 user1470-key1 +3471 1 ssh-rsa 22key4plc22 user1471-key1 +3472 1 ssh-rsa 22key4plc22 user1472-key1 +3473 1 ssh-rsa 22key4plc22 user1473-key1 +3474 1 ssh-rsa 22key4plc22 user1474-key1 +3475 1 ssh-rsa 22key4plc22 user1475-key1 +3476 1 ssh-rsa 22key4plc22 user1476-key1 +3477 1 ssh-rsa 22key4plc22 user1477-key1 +3478 1 ssh-rsa 22key4plc22 user1478-key1 +3479 1 ssh-rsa 22key4plc22 user1479-key1 +3480 1 ssh-rsa 22key4plc22 user1480-key1 +3481 1 ssh-rsa 22key4plc22 user1481-key1 +3482 1 ssh-rsa 22key4plc22 user1482-key1 +3483 1 ssh-rsa 22key4plc22 user1483-key1 +3484 1 ssh-rsa 22key4plc22 user1484-key1 +3485 1 ssh-rsa 22key4plc22 user1485-key1 +3486 1 ssh-rsa 22key4plc22 user1486-key1 +3487 1 ssh-rsa 22key4plc22 user1487-key1 +3488 1 ssh-rsa 22key4plc22 user1488-key1 +3489 1 ssh-rsa 22key4plc22 user1489-key1 +3490 1 ssh-rsa 22key4plc22 user1490-key1 +3491 1 ssh-rsa 22key4plc22 user1491-key1 +3492 1 ssh-rsa 22key4plc22 user1492-key1 +3493 1 ssh-rsa 22key4plc22 user1493-key1 +3494 1 ssh-rsa 22key4plc22 user1494-key1 +3495 1 ssh-rsa 22key4plc22 user1495-key1 +3496 1 ssh-rsa 22key4plc22 user1496-key1 +3497 1 ssh-rsa 22key4plc22 user1497-key1 +3498 1 ssh-rsa 22key4plc22 user1498-key1 +3499 1 ssh-rsa 22key4plc22 user1499-key1 +3500 1 ssh-rsa 22key4plc22 user1500-key1 +3501 1 ssh-rsa 22key4plc22 user1501-key1 +3502 1 ssh-rsa 22key4plc22 user1502-key1 +3503 1 ssh-rsa 22key4plc22 user1503-key1 +3504 1 ssh-rsa 22key4plc22 user1504-key1 +3505 1 ssh-rsa 22key4plc22 user1505-key1 +3506 1 ssh-rsa 22key4plc22 user1506-key1 +3507 1 ssh-rsa 22key4plc22 user1507-key1 +3508 1 ssh-rsa 22key4plc22 user1508-key1 +3509 1 ssh-rsa 22key4plc22 user1509-key1 +3510 1 ssh-rsa 22key4plc22 user1510-key1 +3511 1 ssh-rsa 22key4plc22 user1511-key1 +3512 1 ssh-rsa 22key4plc22 user1512-key1 +3513 1 ssh-rsa 22key4plc22 user1513-key1 +3514 1 ssh-rsa 22key4plc22 user1514-key1 +3515 1 ssh-rsa 22key4plc22 user1515-key1 +3516 1 ssh-rsa 22key4plc22 user1516-key1 +3517 1 ssh-rsa 22key4plc22 user1517-key1 +3518 1 ssh-rsa 22key4plc22 user1518-key1 +3519 1 ssh-rsa 22key4plc22 user1519-key1 +3520 1 ssh-rsa 22key4plc22 user1520-key1 +3521 1 ssh-rsa 22key4plc22 user1521-key1 +3522 1 ssh-rsa 22key4plc22 user1522-key1 +3523 1 ssh-rsa 22key4plc22 user1523-key1 +3524 1 ssh-rsa 22key4plc22 user1524-key1 +3525 1 ssh-rsa 22key4plc22 user1525-key1 +3526 1 ssh-rsa 22key4plc22 user1526-key1 +3527 1 ssh-rsa 22key4plc22 user1527-key1 +3528 1 ssh-rsa 22key4plc22 user1528-key1 +3529 1 ssh-rsa 22key4plc22 user1529-key1 +3530 1 ssh-rsa 22key4plc22 user1530-key1 +3531 1 ssh-rsa 22key4plc22 user1531-key1 +3532 1 ssh-rsa 22key4plc22 user1532-key1 +3533 1 ssh-rsa 22key4plc22 user1533-key1 +3534 1 ssh-rsa 22key4plc22 user1534-key1 +3535 1 ssh-rsa 22key4plc22 user1535-key1 +3536 1 ssh-rsa 22key4plc22 user1536-key1 +3537 1 ssh-rsa 22key4plc22 user1537-key1 +3538 1 ssh-rsa 22key4plc22 user1538-key1 +3539 1 ssh-rsa 22key4plc22 user1539-key1 +3540 1 ssh-rsa 22key4plc22 user1540-key1 +3541 1 ssh-rsa 22key4plc22 user1541-key1 +3542 1 ssh-rsa 22key4plc22 user1542-key1 +3543 1 ssh-rsa 22key4plc22 user1543-key1 +3544 1 ssh-rsa 22key4plc22 user1544-key1 +3545 1 ssh-rsa 22key4plc22 user1545-key1 +3546 1 ssh-rsa 22key4plc22 user1546-key1 +3547 1 ssh-rsa 22key4plc22 user1547-key1 +3548 1 ssh-rsa 22key4plc22 user1548-key1 +3549 1 ssh-rsa 22key4plc22 user1549-key1 +3550 1 ssh-rsa 22key4plc22 user1550-key1 +3551 1 ssh-rsa 22key4plc22 user1551-key1 +3552 1 ssh-rsa 22key4plc22 user1552-key1 +3553 1 ssh-rsa 22key4plc22 user1553-key1 +3554 1 ssh-rsa 22key4plc22 user1554-key1 +3555 1 ssh-rsa 22key4plc22 user1555-key1 +3556 1 ssh-rsa 22key4plc22 user1556-key1 +3557 1 ssh-rsa 22key4plc22 user1557-key1 +3558 1 ssh-rsa 22key4plc22 user1558-key1 +3559 1 ssh-rsa 22key4plc22 user1559-key1 +3560 1 ssh-rsa 22key4plc22 user1560-key1 +3561 1 ssh-rsa 22key4plc22 user1561-key1 +3562 1 ssh-rsa 22key4plc22 user1562-key1 +3563 1 ssh-rsa 22key4plc22 user1563-key1 +3564 1 ssh-rsa 22key4plc22 user1564-key1 +3565 1 ssh-rsa 22key4plc22 user1565-key1 +3566 1 ssh-rsa 22key4plc22 user1566-key1 +3567 1 ssh-rsa 22key4plc22 user1567-key1 +3568 1 ssh-rsa 22key4plc22 user1568-key1 +3569 1 ssh-rsa 22key4plc22 user1569-key1 +3570 1 ssh-rsa 22key4plc22 user1570-key1 +3571 1 ssh-rsa 22key4plc22 user1571-key1 +3572 1 ssh-rsa 22key4plc22 user1572-key1 +3573 1 ssh-rsa 22key4plc22 user1573-key1 +3574 1 ssh-rsa 22key4plc22 user1574-key1 +3575 1 ssh-rsa 22key4plc22 user1575-key1 +3576 1 ssh-rsa 22key4plc22 user1576-key1 +3577 1 ssh-rsa 22key4plc22 user1577-key1 +3578 1 ssh-rsa 22key4plc22 user1578-key1 +3579 1 ssh-rsa 22key4plc22 user1579-key1 +3580 1 ssh-rsa 22key4plc22 user1580-key1 +3581 1 ssh-rsa 22key4plc22 user1581-key1 +3582 1 ssh-rsa 22key4plc22 user1582-key1 +3583 1 ssh-rsa 22key4plc22 user1583-key1 +3584 1 ssh-rsa 22key4plc22 user1584-key1 +3585 1 ssh-rsa 22key4plc22 user1585-key1 +3586 1 ssh-rsa 22key4plc22 user1586-key1 +3587 1 ssh-rsa 22key4plc22 user1587-key1 +3588 1 ssh-rsa 22key4plc22 user1588-key1 +3589 1 ssh-rsa 22key4plc22 user1589-key1 +3590 1 ssh-rsa 22key4plc22 user1590-key1 +3591 1 ssh-rsa 22key4plc22 user1591-key1 +3592 1 ssh-rsa 22key4plc22 user1592-key1 +3593 1 ssh-rsa 22key4plc22 user1593-key1 +3594 1 ssh-rsa 22key4plc22 user1594-key1 +3595 1 ssh-rsa 22key4plc22 user1595-key1 +3596 1 ssh-rsa 22key4plc22 user1596-key1 +3597 1 ssh-rsa 22key4plc22 user1597-key1 +3598 1 ssh-rsa 22key4plc22 user1598-key1 +3599 1 ssh-rsa 22key4plc22 user1599-key1 +3600 1 ssh-rsa 22key4plc22 user1600-key1 +3601 1 ssh-rsa 22key4plc22 user1601-key1 +3602 1 ssh-rsa 22key4plc22 user1602-key1 +3603 1 ssh-rsa 22key4plc22 user1603-key1 +3604 1 ssh-rsa 22key4plc22 user1604-key1 +3605 1 ssh-rsa 22key4plc22 user1605-key1 +3606 1 ssh-rsa 22key4plc22 user1606-key1 +3607 1 ssh-rsa 22key4plc22 user1607-key1 +3608 1 ssh-rsa 22key4plc22 user1608-key1 +3609 1 ssh-rsa 22key4plc22 user1609-key1 +3610 1 ssh-rsa 22key4plc22 user1610-key1 +3611 1 ssh-rsa 22key4plc22 user1611-key1 +3612 1 ssh-rsa 22key4plc22 user1612-key1 +3613 1 ssh-rsa 22key4plc22 user1613-key1 +3614 1 ssh-rsa 22key4plc22 user1614-key1 +3615 1 ssh-rsa 22key4plc22 user1615-key1 +3616 1 ssh-rsa 22key4plc22 user1616-key1 +3617 1 ssh-rsa 22key4plc22 user1617-key1 +3618 1 ssh-rsa 22key4plc22 user1618-key1 +3619 1 ssh-rsa 22key4plc22 user1619-key1 +3620 1 ssh-rsa 22key4plc22 user1620-key1 +3621 1 ssh-rsa 22key4plc22 user1621-key1 +3622 1 ssh-rsa 22key4plc22 user1622-key1 +3623 1 ssh-rsa 22key4plc22 user1623-key1 +3624 1 ssh-rsa 22key4plc22 user1624-key1 +3625 1 ssh-rsa 22key4plc22 user1625-key1 +3626 1 ssh-rsa 22key4plc22 user1626-key1 +3627 1 ssh-rsa 22key4plc22 user1627-key1 +3628 1 ssh-rsa 22key4plc22 user1628-key1 +3629 1 ssh-rsa 22key4plc22 user1629-key1 +3630 1 ssh-rsa 22key4plc22 user1630-key1 +3631 1 ssh-rsa 22key4plc22 user1631-key1 +3632 1 ssh-rsa 22key4plc22 user1632-key1 +3633 1 ssh-rsa 22key4plc22 user1633-key1 +3634 1 ssh-rsa 22key4plc22 user1634-key1 +3635 1 ssh-rsa 22key4plc22 user1635-key1 +3636 1 ssh-rsa 22key4plc22 user1636-key1 +3637 1 ssh-rsa 22key4plc22 user1637-key1 +3638 1 ssh-rsa 22key4plc22 user1638-key1 +3639 1 ssh-rsa 22key4plc22 user1639-key1 +3640 1 ssh-rsa 22key4plc22 user1640-key1 +3641 1 ssh-rsa 22key4plc22 user1641-key1 +3642 1 ssh-rsa 22key4plc22 user1642-key1 +3643 1 ssh-rsa 22key4plc22 user1643-key1 +3644 1 ssh-rsa 22key4plc22 user1644-key1 +3645 1 ssh-rsa 22key4plc22 user1645-key1 +3646 1 ssh-rsa 22key4plc22 user1646-key1 +3647 1 ssh-rsa 22key4plc22 user1647-key1 +3648 1 ssh-rsa 22key4plc22 user1648-key1 +3649 1 ssh-rsa 22key4plc22 user1649-key1 +3650 1 ssh-rsa 22key4plc22 user1650-key1 +3651 1 ssh-rsa 22key4plc22 user1651-key1 +3652 1 ssh-rsa 22key4plc22 user1652-key1 +3653 1 ssh-rsa 22key4plc22 user1653-key1 +3654 1 ssh-rsa 22key4plc22 user1654-key1 +3655 1 ssh-rsa 22key4plc22 user1655-key1 +3656 1 ssh-rsa 22key4plc22 user1656-key1 +3657 1 ssh-rsa 22key4plc22 user1657-key1 +3658 1 ssh-rsa 22key4plc22 user1658-key1 +3659 1 ssh-rsa 22key4plc22 user1659-key1 +3660 1 ssh-rsa 22key4plc22 user1660-key1 +3661 1 ssh-rsa 22key4plc22 user1661-key1 +3662 1 ssh-rsa 22key4plc22 user1662-key1 +3663 1 ssh-rsa 22key4plc22 user1663-key1 +3664 1 ssh-rsa 22key4plc22 user1664-key1 +3665 1 ssh-rsa 22key4plc22 user1665-key1 +3666 1 ssh-rsa 22key4plc22 user1666-key1 +3667 1 ssh-rsa 22key4plc22 user1667-key1 +3668 1 ssh-rsa 22key4plc22 user1668-key1 +3669 1 ssh-rsa 22key4plc22 user1669-key1 +3670 1 ssh-rsa 22key4plc22 user1670-key1 +3671 1 ssh-rsa 22key4plc22 user1671-key1 +3672 1 ssh-rsa 22key4plc22 user1672-key1 +3673 1 ssh-rsa 22key4plc22 user1673-key1 +3674 1 ssh-rsa 22key4plc22 user1674-key1 +3675 1 ssh-rsa 22key4plc22 user1675-key1 +3676 1 ssh-rsa 22key4plc22 user1676-key1 +3677 1 ssh-rsa 22key4plc22 user1677-key1 +3678 1 ssh-rsa 22key4plc22 user1678-key1 +3679 1 ssh-rsa 22key4plc22 user1679-key1 +3680 1 ssh-rsa 22key4plc22 user1680-key1 +3681 1 ssh-rsa 22key4plc22 user1681-key1 +3682 1 ssh-rsa 22key4plc22 user1682-key1 +3683 1 ssh-rsa 22key4plc22 user1683-key1 +3684 1 ssh-rsa 22key4plc22 user1684-key1 +3685 1 ssh-rsa 22key4plc22 user1685-key1 +3686 1 ssh-rsa 22key4plc22 user1686-key1 +3687 1 ssh-rsa 22key4plc22 user1687-key1 +3688 1 ssh-rsa 22key4plc22 user1688-key1 +3689 1 ssh-rsa 22key4plc22 user1689-key1 +3690 1 ssh-rsa 22key4plc22 user1690-key1 +3691 1 ssh-rsa 22key4plc22 user1691-key1 +3692 1 ssh-rsa 22key4plc22 user1692-key1 +3693 1 ssh-rsa 22key4plc22 user1693-key1 +3694 1 ssh-rsa 22key4plc22 user1694-key1 +3695 1 ssh-rsa 22key4plc22 user1695-key1 +3696 1 ssh-rsa 22key4plc22 user1696-key1 +3697 1 ssh-rsa 22key4plc22 user1697-key1 +3698 1 ssh-rsa 22key4plc22 user1698-key1 +3699 1 ssh-rsa 22key4plc22 user1699-key1 +3700 1 ssh-rsa 22key4plc22 user1700-key1 +3701 1 ssh-rsa 22key4plc22 user1701-key1 +3702 1 ssh-rsa 22key4plc22 user1702-key1 +3703 1 ssh-rsa 22key4plc22 user1703-key1 +3704 1 ssh-rsa 22key4plc22 user1704-key1 +3705 1 ssh-rsa 22key4plc22 user1705-key1 +3706 1 ssh-rsa 22key4plc22 user1706-key1 +3707 1 ssh-rsa 22key4plc22 user1707-key1 +3708 1 ssh-rsa 22key4plc22 user1708-key1 +3709 1 ssh-rsa 22key4plc22 user1709-key1 +3710 1 ssh-rsa 22key4plc22 user1710-key1 +3711 1 ssh-rsa 22key4plc22 user1711-key1 +3712 1 ssh-rsa 22key4plc22 user1712-key1 +3713 1 ssh-rsa 22key4plc22 user1713-key1 +3714 1 ssh-rsa 22key4plc22 user1714-key1 +3715 1 ssh-rsa 22key4plc22 user1715-key1 +3716 1 ssh-rsa 22key4plc22 user1716-key1 +3717 1 ssh-rsa 22key4plc22 user1717-key1 +3718 1 ssh-rsa 22key4plc22 user1718-key1 +3719 1 ssh-rsa 22key4plc22 user1719-key1 +3720 1 ssh-rsa 22key4plc22 user1720-key1 +3721 1 ssh-rsa 22key4plc22 user1721-key1 +3722 1 ssh-rsa 22key4plc22 user1722-key1 +3723 1 ssh-rsa 22key4plc22 user1723-key1 +3724 1 ssh-rsa 22key4plc22 user1724-key1 +3725 1 ssh-rsa 22key4plc22 user1725-key1 +3726 1 ssh-rsa 22key4plc22 user1726-key1 +3727 1 ssh-rsa 22key4plc22 user1727-key1 +3728 1 ssh-rsa 22key4plc22 user1728-key1 +3729 1 ssh-rsa 22key4plc22 user1729-key1 +3730 1 ssh-rsa 22key4plc22 user1730-key1 +3731 1 ssh-rsa 22key4plc22 user1731-key1 +3732 1 ssh-rsa 22key4plc22 user1732-key1 +3733 1 ssh-rsa 22key4plc22 user1733-key1 +3734 1 ssh-rsa 22key4plc22 user1734-key1 +3735 1 ssh-rsa 22key4plc22 user1735-key1 +3736 1 ssh-rsa 22key4plc22 user1736-key1 +3737 1 ssh-rsa 22key4plc22 user1737-key1 +3738 1 ssh-rsa 22key4plc22 user1738-key1 +3739 1 ssh-rsa 22key4plc22 user1739-key1 +3740 1 ssh-rsa 22key4plc22 user1740-key1 +3741 1 ssh-rsa 22key4plc22 user1741-key1 +3742 1 ssh-rsa 22key4plc22 user1742-key1 +3743 1 ssh-rsa 22key4plc22 user1743-key1 +3744 1 ssh-rsa 22key4plc22 user1744-key1 +3745 1 ssh-rsa 22key4plc22 user1745-key1 +3746 1 ssh-rsa 22key4plc22 user1746-key1 +3747 1 ssh-rsa 22key4plc22 user1747-key1 +3748 1 ssh-rsa 22key4plc22 user1748-key1 +3749 1 ssh-rsa 22key4plc22 user1749-key1 +3750 1 ssh-rsa 22key4plc22 user1750-key1 +3751 1 ssh-rsa 22key4plc22 user1751-key1 +3752 1 ssh-rsa 22key4plc22 user1752-key1 +3753 1 ssh-rsa 22key4plc22 user1753-key1 +3754 1 ssh-rsa 22key4plc22 user1754-key1 +3755 1 ssh-rsa 22key4plc22 user1755-key1 +3756 1 ssh-rsa 22key4plc22 user1756-key1 +3757 1 ssh-rsa 22key4plc22 user1757-key1 +3758 1 ssh-rsa 22key4plc22 user1758-key1 +3759 1 ssh-rsa 22key4plc22 user1759-key1 +3760 1 ssh-rsa 22key4plc22 user1760-key1 +3761 1 ssh-rsa 22key4plc22 user1761-key1 +3762 1 ssh-rsa 22key4plc22 user1762-key1 +3763 1 ssh-rsa 22key4plc22 user1763-key1 +3764 1 ssh-rsa 22key4plc22 user1764-key1 +3765 1 ssh-rsa 22key4plc22 user1765-key1 +3766 1 ssh-rsa 22key4plc22 user1766-key1 +3767 1 ssh-rsa 22key4plc22 user1767-key1 +3768 1 ssh-rsa 22key4plc22 user1768-key1 +3769 1 ssh-rsa 22key4plc22 user1769-key1 +3770 1 ssh-rsa 22key4plc22 user1770-key1 +3771 1 ssh-rsa 22key4plc22 user1771-key1 +3772 1 ssh-rsa 22key4plc22 user1772-key1 +3773 1 ssh-rsa 22key4plc22 user1773-key1 +3774 1 ssh-rsa 22key4plc22 user1774-key1 +3775 1 ssh-rsa 22key4plc22 user1775-key1 +3776 1 ssh-rsa 22key4plc22 user1776-key1 +3777 1 ssh-rsa 22key4plc22 user1777-key1 +3778 1 ssh-rsa 22key4plc22 user1778-key1 +3779 1 ssh-rsa 22key4plc22 user1779-key1 +3780 1 ssh-rsa 22key4plc22 user1780-key1 +3781 1 ssh-rsa 22key4plc22 user1781-key1 +3782 1 ssh-rsa 22key4plc22 user1782-key1 +3783 1 ssh-rsa 22key4plc22 user1783-key1 +3784 1 ssh-rsa 22key4plc22 user1784-key1 +3785 1 ssh-rsa 22key4plc22 user1785-key1 +3786 1 ssh-rsa 22key4plc22 user1786-key1 +3787 1 ssh-rsa 22key4plc22 user1787-key1 +3788 1 ssh-rsa 22key4plc22 user1788-key1 +3789 1 ssh-rsa 22key4plc22 user1789-key1 +3790 1 ssh-rsa 22key4plc22 user1790-key1 +3791 1 ssh-rsa 22key4plc22 user1791-key1 +3792 1 ssh-rsa 22key4plc22 user1792-key1 +3793 1 ssh-rsa 22key4plc22 user1793-key1 +3794 1 ssh-rsa 22key4plc22 user1794-key1 +3795 1 ssh-rsa 22key4plc22 user1795-key1 +3796 1 ssh-rsa 22key4plc22 user1796-key1 +3797 1 ssh-rsa 22key4plc22 user1797-key1 +3798 1 ssh-rsa 22key4plc22 user1798-key1 +3799 1 ssh-rsa 22key4plc22 user1799-key1 +3800 1 ssh-rsa 22key4plc22 user1800-key1 +3801 1 ssh-rsa 22key4plc22 user1801-key1 +3802 1 ssh-rsa 22key4plc22 user1802-key1 +3803 1 ssh-rsa 22key4plc22 user1803-key1 +3804 1 ssh-rsa 22key4plc22 user1804-key1 +3805 1 ssh-rsa 22key4plc22 user1805-key1 +3806 1 ssh-rsa 22key4plc22 user1806-key1 +3807 1 ssh-rsa 22key4plc22 user1807-key1 +3808 1 ssh-rsa 22key4plc22 user1808-key1 +3809 1 ssh-rsa 22key4plc22 user1809-key1 +3810 1 ssh-rsa 22key4plc22 user1810-key1 +3811 1 ssh-rsa 22key4plc22 user1811-key1 +3812 1 ssh-rsa 22key4plc22 user1812-key1 +3813 1 ssh-rsa 22key4plc22 user1813-key1 +3814 1 ssh-rsa 22key4plc22 user1814-key1 +3815 1 ssh-rsa 22key4plc22 user1815-key1 +3816 1 ssh-rsa 22key4plc22 user1816-key1 +3817 1 ssh-rsa 22key4plc22 user1817-key1 +3818 1 ssh-rsa 22key4plc22 user1818-key1 +3819 1 ssh-rsa 22key4plc22 user1819-key1 +3820 1 ssh-rsa 22key4plc22 user1820-key1 +3821 1 ssh-rsa 22key4plc22 user1821-key1 +3822 1 ssh-rsa 22key4plc22 user1822-key1 +3823 1 ssh-rsa 22key4plc22 user1823-key1 +3824 1 ssh-rsa 22key4plc22 user1824-key1 +3825 1 ssh-rsa 22key4plc22 user1825-key1 +3826 1 ssh-rsa 22key4plc22 user1826-key1 +3827 1 ssh-rsa 22key4plc22 user1827-key1 +3828 1 ssh-rsa 22key4plc22 user1828-key1 +3829 1 ssh-rsa 22key4plc22 user1829-key1 +3830 1 ssh-rsa 22key4plc22 user1830-key1 +3831 1 ssh-rsa 22key4plc22 user1831-key1 +3832 1 ssh-rsa 22key4plc22 user1832-key1 +3833 1 ssh-rsa 22key4plc22 user1833-key1 +3834 1 ssh-rsa 22key4plc22 user1834-key1 +3835 1 ssh-rsa 22key4plc22 user1835-key1 +3836 1 ssh-rsa 22key4plc22 user1836-key1 +3837 1 ssh-rsa 22key4plc22 user1837-key1 +3838 1 ssh-rsa 22key4plc22 user1838-key1 +3839 1 ssh-rsa 22key4plc22 user1839-key1 +3840 1 ssh-rsa 22key4plc22 user1840-key1 +3841 1 ssh-rsa 22key4plc22 user1841-key1 +3842 1 ssh-rsa 22key4plc22 user1842-key1 +3843 1 ssh-rsa 22key4plc22 user1843-key1 +3844 1 ssh-rsa 22key4plc22 user1844-key1 +3845 1 ssh-rsa 22key4plc22 user1845-key1 +3846 1 ssh-rsa 22key4plc22 user1846-key1 +3847 1 ssh-rsa 22key4plc22 user1847-key1 +3848 1 ssh-rsa 22key4plc22 user1848-key1 +3849 1 ssh-rsa 22key4plc22 user1849-key1 +3850 1 ssh-rsa 22key4plc22 user1850-key1 +3851 1 ssh-rsa 22key4plc22 user1851-key1 +3852 1 ssh-rsa 22key4plc22 user1852-key1 +3853 1 ssh-rsa 22key4plc22 user1853-key1 +3854 1 ssh-rsa 22key4plc22 user1854-key1 +3855 1 ssh-rsa 22key4plc22 user1855-key1 +3856 1 ssh-rsa 22key4plc22 user1856-key1 +3857 1 ssh-rsa 22key4plc22 user1857-key1 +3858 1 ssh-rsa 22key4plc22 user1858-key1 +3859 1 ssh-rsa 22key4plc22 user1859-key1 +3860 1 ssh-rsa 22key4plc22 user1860-key1 +3861 1 ssh-rsa 22key4plc22 user1861-key1 +3862 1 ssh-rsa 22key4plc22 user1862-key1 +3863 1 ssh-rsa 22key4plc22 user1863-key1 +3864 1 ssh-rsa 22key4plc22 user1864-key1 +3865 1 ssh-rsa 22key4plc22 user1865-key1 +3866 1 ssh-rsa 22key4plc22 user1866-key1 +3867 1 ssh-rsa 22key4plc22 user1867-key1 +3868 1 ssh-rsa 22key4plc22 user1868-key1 +3869 1 ssh-rsa 22key4plc22 user1869-key1 +3870 1 ssh-rsa 22key4plc22 user1870-key1 +3871 1 ssh-rsa 22key4plc22 user1871-key1 +3872 1 ssh-rsa 22key4plc22 user1872-key1 +3873 1 ssh-rsa 22key4plc22 user1873-key1 +3874 1 ssh-rsa 22key4plc22 user1874-key1 +3875 1 ssh-rsa 22key4plc22 user1875-key1 +3876 1 ssh-rsa 22key4plc22 user1876-key1 +3877 1 ssh-rsa 22key4plc22 user1877-key1 +3878 1 ssh-rsa 22key4plc22 user1878-key1 +3879 1 ssh-rsa 22key4plc22 user1879-key1 +3880 1 ssh-rsa 22key4plc22 user1880-key1 +3881 1 ssh-rsa 22key4plc22 user1881-key1 +3882 1 ssh-rsa 22key4plc22 user1882-key1 +3883 1 ssh-rsa 22key4plc22 user1883-key1 +3884 1 ssh-rsa 22key4plc22 user1884-key1 +3885 1 ssh-rsa 22key4plc22 user1885-key1 +3886 1 ssh-rsa 22key4plc22 user1886-key1 +3887 1 ssh-rsa 22key4plc22 user1887-key1 +3888 1 ssh-rsa 22key4plc22 user1888-key1 +3889 1 ssh-rsa 22key4plc22 user1889-key1 +3890 1 ssh-rsa 22key4plc22 user1890-key1 +3891 1 ssh-rsa 22key4plc22 user1891-key1 +3892 1 ssh-rsa 22key4plc22 user1892-key1 +3893 1 ssh-rsa 22key4plc22 user1893-key1 +3894 1 ssh-rsa 22key4plc22 user1894-key1 +3895 1 ssh-rsa 22key4plc22 user1895-key1 +3896 1 ssh-rsa 22key4plc22 user1896-key1 +3897 1 ssh-rsa 22key4plc22 user1897-key1 +3898 1 ssh-rsa 22key4plc22 user1898-key1 +3899 1 ssh-rsa 22key4plc22 user1899-key1 +3900 1 ssh-rsa 22key4plc22 user1900-key1 +3901 1 ssh-rsa 22key4plc22 user1901-key1 +3902 1 ssh-rsa 22key4plc22 user1902-key1 +3903 1 ssh-rsa 22key4plc22 user1903-key1 +3904 1 ssh-rsa 22key4plc22 user1904-key1 +3905 1 ssh-rsa 22key4plc22 user1905-key1 +3906 1 ssh-rsa 22key4plc22 user1906-key1 +3907 1 ssh-rsa 22key4plc22 user1907-key1 +3908 1 ssh-rsa 22key4plc22 user1908-key1 +3909 1 ssh-rsa 22key4plc22 user1909-key1 +3910 1 ssh-rsa 22key4plc22 user1910-key1 +3911 1 ssh-rsa 22key4plc22 user1911-key1 +3912 1 ssh-rsa 22key4plc22 user1912-key1 +3913 1 ssh-rsa 22key4plc22 user1913-key1 +3914 1 ssh-rsa 22key4plc22 user1914-key1 +3915 1 ssh-rsa 22key4plc22 user1915-key1 +3916 1 ssh-rsa 22key4plc22 user1916-key1 +3917 1 ssh-rsa 22key4plc22 user1917-key1 +3918 1 ssh-rsa 22key4plc22 user1918-key1 +3919 1 ssh-rsa 22key4plc22 user1919-key1 +3920 1 ssh-rsa 22key4plc22 user1920-key1 +3921 1 ssh-rsa 22key4plc22 user1921-key1 +3922 1 ssh-rsa 22key4plc22 user1922-key1 +3923 1 ssh-rsa 22key4plc22 user1923-key1 +3924 1 ssh-rsa 22key4plc22 user1924-key1 +3925 1 ssh-rsa 22key4plc22 user1925-key1 +3926 1 ssh-rsa 22key4plc22 user1926-key1 +3927 1 ssh-rsa 22key4plc22 user1927-key1 +3928 1 ssh-rsa 22key4plc22 user1928-key1 +3929 1 ssh-rsa 22key4plc22 user1929-key1 +3930 1 ssh-rsa 22key4plc22 user1930-key1 +3931 1 ssh-rsa 22key4plc22 user1931-key1 +3932 1 ssh-rsa 22key4plc22 user1932-key1 +3933 1 ssh-rsa 22key4plc22 user1933-key1 +3934 1 ssh-rsa 22key4plc22 user1934-key1 +3935 1 ssh-rsa 22key4plc22 user1935-key1 +3936 1 ssh-rsa 22key4plc22 user1936-key1 +3937 1 ssh-rsa 22key4plc22 user1937-key1 +3938 1 ssh-rsa 22key4plc22 user1938-key1 +3939 1 ssh-rsa 22key4plc22 user1939-key1 +3940 1 ssh-rsa 22key4plc22 user1940-key1 +3941 1 ssh-rsa 22key4plc22 user1941-key1 +3942 1 ssh-rsa 22key4plc22 user1942-key1 +3943 1 ssh-rsa 22key4plc22 user1943-key1 +3944 1 ssh-rsa 22key4plc22 user1944-key1 +3945 1 ssh-rsa 22key4plc22 user1945-key1 +3946 1 ssh-rsa 22key4plc22 user1946-key1 +3947 1 ssh-rsa 22key4plc22 user1947-key1 +3948 1 ssh-rsa 22key4plc22 user1948-key1 +3949 1 ssh-rsa 22key4plc22 user1949-key1 +3950 1 ssh-rsa 22key4plc22 user1950-key1 +3951 1 ssh-rsa 22key4plc22 user1951-key1 +3952 1 ssh-rsa 22key4plc22 user1952-key1 +3953 1 ssh-rsa 22key4plc22 user1953-key1 +3954 1 ssh-rsa 22key4plc22 user1954-key1 +3955 1 ssh-rsa 22key4plc22 user1955-key1 +3956 1 ssh-rsa 22key4plc22 user1956-key1 +3957 1 ssh-rsa 22key4plc22 user1957-key1 +3958 1 ssh-rsa 22key4plc22 user1958-key1 +3959 1 ssh-rsa 22key4plc22 user1959-key1 +3960 1 ssh-rsa 22key4plc22 user1960-key1 +3961 1 ssh-rsa 22key4plc22 user1961-key1 +3962 1 ssh-rsa 22key4plc22 user1962-key1 +3963 1 ssh-rsa 22key4plc22 user1963-key1 +3964 1 ssh-rsa 22key4plc22 user1964-key1 +3965 1 ssh-rsa 22key4plc22 user1965-key1 +3966 1 ssh-rsa 22key4plc22 user1966-key1 +3967 1 ssh-rsa 22key4plc22 user1967-key1 +3968 1 ssh-rsa 22key4plc22 user1968-key1 +3969 1 ssh-rsa 22key4plc22 user1969-key1 +3970 1 ssh-rsa 22key4plc22 user1970-key1 +3971 1 ssh-rsa 22key4plc22 user1971-key1 +3972 1 ssh-rsa 22key4plc22 user1972-key1 +3973 1 ssh-rsa 22key4plc22 user1973-key1 +3974 1 ssh-rsa 22key4plc22 user1974-key1 +3975 1 ssh-rsa 22key4plc22 user1975-key1 +3976 1 ssh-rsa 22key4plc22 user1976-key1 +3977 1 ssh-rsa 22key4plc22 user1977-key1 +3978 1 ssh-rsa 22key4plc22 user1978-key1 +3979 1 ssh-rsa 22key4plc22 user1979-key1 +3980 1 ssh-rsa 22key4plc22 user1980-key1 +3981 1 ssh-rsa 22key4plc22 user1981-key1 +3982 1 ssh-rsa 22key4plc22 user1982-key1 +3983 1 ssh-rsa 22key4plc22 user1983-key1 +3984 1 ssh-rsa 22key4plc22 user1984-key1 +3985 1 ssh-rsa 22key4plc22 user1985-key1 +3986 1 ssh-rsa 22key4plc22 user1986-key1 +3987 1 ssh-rsa 22key4plc22 user1987-key1 +3988 1 ssh-rsa 22key4plc22 user1988-key1 +3989 1 ssh-rsa 22key4plc22 user1989-key1 +3990 1 ssh-rsa 22key4plc22 user1990-key1 +3991 1 ssh-rsa 22key4plc22 user1991-key1 +3992 1 ssh-rsa 22key4plc22 user1992-key1 +3993 1 ssh-rsa 22key4plc22 user1993-key1 +3994 1 ssh-rsa 22key4plc22 user1994-key1 +3995 1 ssh-rsa 22key4plc22 user1995-key1 +3996 1 ssh-rsa 22key4plc22 user1996-key1 +3997 1 ssh-rsa 22key4plc22 user1997-key1 +3998 1 ssh-rsa 22key4plc22 user1998-key1 +3999 1 ssh-rsa 22key4plc22 user1999-key1 +4000 1 ssh-rsa 22key4plc22 user2000-key1 +01: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc1.org keys: [] sites: [1] +3 None peer1@planet-lab.org keys: [] sites: [] +4 None peer2@planet-lab.org keys: [] sites: [] +5 None user1-1@plc1.org keys: [1] sites: [] +6 None user1-2@plc1.org keys: [2] sites: [] +7 None user1-3@plc1.org keys: [3] sites: [] +8 None user1-4@plc1.org keys: [4] sites: [] +9 None user1-5@plc1.org keys: [5] sites: [] +10 None user1-6@plc1.org keys: [6] sites: [] +11 None user1-7@plc1.org keys: [7] sites: [] +12 None user1-8@plc1.org keys: [8] sites: [] +13 None user1-9@plc1.org keys: [9] sites: [] +14 None user1-10@plc1.org keys: [10] sites: [] +15 None user1-11@plc1.org keys: [11] sites: [] +16 None user1-12@plc1.org keys: [12] sites: [] +17 None user1-13@plc1.org keys: [13] sites: [] +18 None user1-14@plc1.org keys: [14] sites: [] +19 None user1-15@plc1.org keys: [15] sites: [] +20 None user1-16@plc1.org keys: [16] sites: [] +21 None user1-17@plc1.org keys: [17] sites: [] +22 None user1-18@plc1.org keys: [18] sites: [] +23 None user1-19@plc1.org keys: [19] sites: [] +24 None user1-20@plc1.org keys: [20] sites: [] +25 None user1-21@plc1.org keys: [21] sites: [] +26 None user1-22@plc1.org keys: [22] sites: [] +27 None user1-23@plc1.org keys: [23] sites: [] +28 None user1-24@plc1.org keys: [24] sites: [] +29 None user1-25@plc1.org keys: [25] sites: [] +30 None user1-26@plc1.org keys: [26] sites: [] +31 None user1-27@plc1.org keys: [27] sites: [] +32 None user1-28@plc1.org keys: [28] sites: [] +33 None user1-29@plc1.org keys: [29] sites: [] +34 None user1-30@plc1.org keys: [30] sites: [] +35 None user1-31@plc1.org keys: [31] sites: [] +36 None user1-32@plc1.org keys: [32] sites: [] +37 None user1-33@plc1.org keys: [33] sites: [] +38 None user1-34@plc1.org keys: [34] sites: [] +39 None user1-35@plc1.org keys: [35] sites: [] +40 None user1-36@plc1.org keys: [36] sites: [] +41 None user1-37@plc1.org keys: [37] sites: [] +42 None user1-38@plc1.org keys: [38] sites: [] +43 None user1-39@plc1.org keys: [39] sites: [] +44 None user1-40@plc1.org keys: [40] sites: [] +45 None user1-41@plc1.org keys: [41] sites: [] +46 None user1-42@plc1.org keys: [42] sites: [] +47 None user1-43@plc1.org keys: [43] sites: [] +48 None user1-44@plc1.org keys: [44] sites: [] +49 None user1-45@plc1.org keys: [45] sites: [] +50 None user1-46@plc1.org keys: [46] sites: [] +51 None user1-47@plc1.org keys: [47] sites: [] +52 None user1-48@plc1.org keys: [48] sites: [] +53 None user1-49@plc1.org keys: [49] sites: [] +54 None user1-50@plc1.org keys: [50] sites: [] +55 None user1-51@plc1.org keys: [51] sites: [] +56 None user1-52@plc1.org keys: [52] sites: [] +57 None user1-53@plc1.org keys: [53] sites: [] +58 None user1-54@plc1.org keys: [54] sites: [] +59 None user1-55@plc1.org keys: [55] sites: [] +60 None user1-56@plc1.org keys: [56] sites: [] +61 None user1-57@plc1.org keys: [57] sites: [] +62 None user1-58@plc1.org keys: [58] sites: [] +63 None user1-59@plc1.org keys: [59] sites: [] +64 None user1-60@plc1.org keys: [60] sites: [] +65 None user1-61@plc1.org keys: [61] sites: [] +66 None user1-62@plc1.org keys: [62] sites: [] +67 None user1-63@plc1.org keys: [63] sites: [] +68 None user1-64@plc1.org keys: [64] sites: [] +69 None user1-65@plc1.org keys: [65] sites: [] +70 None user1-66@plc1.org keys: [66] sites: [] +71 None user1-67@plc1.org keys: [67] sites: [] +72 None user1-68@plc1.org keys: [68] sites: [] +73 None user1-69@plc1.org keys: [69] sites: [] +74 None user1-70@plc1.org keys: [70] sites: [] +75 None user1-71@plc1.org keys: [71] sites: [] +76 None user1-72@plc1.org keys: [72] sites: [] +77 None user1-73@plc1.org keys: [73] sites: [] +78 None user1-74@plc1.org keys: [74] sites: [] +79 None user1-75@plc1.org keys: [75] sites: [] +80 None user1-76@plc1.org keys: [76] sites: [] +81 None user1-77@plc1.org keys: [77] sites: [] +82 None user1-78@plc1.org keys: [78] sites: [] +83 None user1-79@plc1.org keys: [79] sites: [] +84 None user1-80@plc1.org keys: [80] sites: [] +85 None user1-81@plc1.org keys: [81] sites: [] +86 None user1-82@plc1.org keys: [82] sites: [] +87 None user1-83@plc1.org keys: [83] sites: [] +88 None user1-84@plc1.org keys: [84] sites: [] +89 None user1-85@plc1.org keys: [85] sites: [] +90 None user1-86@plc1.org keys: [86] sites: [] +91 None user1-87@plc1.org keys: [87] sites: [] +92 None user1-88@plc1.org keys: [88] sites: [] +93 None user1-89@plc1.org keys: [89] sites: [] +94 None user1-90@plc1.org keys: [90] sites: [] +95 None user1-91@plc1.org keys: [91] sites: [] +96 None user1-92@plc1.org keys: [92] sites: [] +97 None user1-93@plc1.org keys: [93] sites: [] +98 None user1-94@plc1.org keys: [94] sites: [] +99 None user1-95@plc1.org keys: [95] sites: [] +100 None user1-96@plc1.org keys: [96] sites: [] +101 None user1-97@plc1.org keys: [97] sites: [] +102 None user1-98@plc1.org keys: [98] sites: [] +103 None user1-99@plc1.org keys: [99] sites: [] +104 None user1-100@plc1.org keys: [100] sites: [] +105 None user1-101@plc1.org keys: [101] sites: [] +106 None user1-102@plc1.org keys: [102] sites: [] +107 None user1-103@plc1.org keys: [103] sites: [] +108 None user1-104@plc1.org keys: [104] sites: [] +109 None user1-105@plc1.org keys: [105] sites: [] +110 None user1-106@plc1.org keys: [106] sites: [] +111 None user1-107@plc1.org keys: [107] sites: [] +112 None user1-108@plc1.org keys: [108] sites: [] +113 None user1-109@plc1.org keys: [109] sites: [] +114 None user1-110@plc1.org keys: [110] sites: [] +115 None user1-111@plc1.org keys: [111] sites: [] +116 None user1-112@plc1.org keys: [112] sites: [] +117 None user1-113@plc1.org keys: [113] sites: [] +118 None user1-114@plc1.org keys: [114] sites: [] +119 None user1-115@plc1.org keys: [115] sites: [] +120 None user1-116@plc1.org keys: [116] sites: [] +121 None user1-117@plc1.org keys: [117] sites: [] +122 None user1-118@plc1.org keys: [118] sites: [] +123 None user1-119@plc1.org keys: [119] sites: [] +124 None user1-120@plc1.org keys: [120] sites: [] +125 None user1-121@plc1.org keys: [121] sites: [] +126 None user1-122@plc1.org keys: [122] sites: [] +127 None user1-123@plc1.org keys: [123] sites: [] +128 None user1-124@plc1.org keys: [124] sites: [] +129 None user1-125@plc1.org keys: [125] sites: [] +130 None user1-126@plc1.org keys: [126] sites: [] +131 None user1-127@plc1.org keys: [127] sites: [] +132 None user1-128@plc1.org keys: [128] sites: [] +133 None user1-129@plc1.org keys: [129] sites: [] +134 None user1-130@plc1.org keys: [130] sites: [] +135 None user1-131@plc1.org keys: [131] sites: [] +136 None user1-132@plc1.org keys: [132] sites: [] +137 None user1-133@plc1.org keys: [133] sites: [] +138 None user1-134@plc1.org keys: [134] sites: [] +139 None user1-135@plc1.org keys: [135] sites: [] +140 None user1-136@plc1.org keys: [136] sites: [] +141 None user1-137@plc1.org keys: [137] sites: [] +142 None user1-138@plc1.org keys: [138] sites: [] +143 None user1-139@plc1.org keys: [139] sites: [] +144 None user1-140@plc1.org keys: [140] sites: [] +145 None user1-141@plc1.org keys: [141] sites: [] +146 None user1-142@plc1.org keys: [142] sites: [] +147 None user1-143@plc1.org keys: [143] sites: [] +148 None user1-144@plc1.org keys: [144] sites: [] +149 None user1-145@plc1.org keys: [145] sites: [] +150 None user1-146@plc1.org keys: [146] sites: [] +151 None user1-147@plc1.org keys: [147] sites: [] +152 None user1-148@plc1.org keys: [148] sites: [] +153 None user1-149@plc1.org keys: [149] sites: [] +154 None user1-150@plc1.org keys: [150] sites: [] +155 None user1-151@plc1.org keys: [151] sites: [] +156 None user1-152@plc1.org keys: [152] sites: [] +157 None user1-153@plc1.org keys: [153] sites: [] +158 None user1-154@plc1.org keys: [154] sites: [] +159 None user1-155@plc1.org keys: [155] sites: [] +160 None user1-156@plc1.org keys: [156] sites: [] +161 None user1-157@plc1.org keys: [157] sites: [] +162 None user1-158@plc1.org keys: [158] sites: [] +163 None user1-159@plc1.org keys: [159] sites: [] +164 None user1-160@plc1.org keys: [160] sites: [] +165 None user1-161@plc1.org keys: [161] sites: [] +166 None user1-162@plc1.org keys: [162] sites: [] +167 None user1-163@plc1.org keys: [163] sites: [] +168 None user1-164@plc1.org keys: [164] sites: [] +169 None user1-165@plc1.org keys: [165] sites: [] +170 None user1-166@plc1.org keys: [166] sites: [] +171 None user1-167@plc1.org keys: [167] sites: [] +172 None user1-168@plc1.org keys: [168] sites: [] +173 None user1-169@plc1.org keys: [169] sites: [] +174 None user1-170@plc1.org keys: [170] sites: [] +175 None user1-171@plc1.org keys: [171] sites: [] +176 None user1-172@plc1.org keys: [172] sites: [] +177 None user1-173@plc1.org keys: [173] sites: [] +178 None user1-174@plc1.org keys: [174] sites: [] +179 None user1-175@plc1.org keys: [175] sites: [] +180 None user1-176@plc1.org keys: [176] sites: [] +181 None user1-177@plc1.org keys: [177] sites: [] +182 None user1-178@plc1.org keys: [178] sites: [] +183 None user1-179@plc1.org keys: [179] sites: [] +184 None user1-180@plc1.org keys: [180] sites: [] +185 None user1-181@plc1.org keys: [181] sites: [] +186 None user1-182@plc1.org keys: [182] sites: [] +187 None user1-183@plc1.org keys: [183] sites: [] +188 None user1-184@plc1.org keys: [184] sites: [] +189 None user1-185@plc1.org keys: [185] sites: [] +190 None user1-186@plc1.org keys: [186] sites: [] +191 None user1-187@plc1.org keys: [187] sites: [] +192 None user1-188@plc1.org keys: [188] sites: [] +193 None user1-189@plc1.org keys: [189] sites: [] +194 None user1-190@plc1.org keys: [190] sites: [] +195 None user1-191@plc1.org keys: [191] sites: [] +196 None user1-192@plc1.org keys: [192] sites: [] +197 None user1-193@plc1.org keys: [193] sites: [] +198 None user1-194@plc1.org keys: [194] sites: [] +199 None user1-195@plc1.org keys: [195] sites: [] +200 None user1-196@plc1.org keys: [196] sites: [] +201 None user1-197@plc1.org keys: [197] sites: [] +202 None user1-198@plc1.org keys: [198] sites: [] +203 None user1-199@plc1.org keys: [199] sites: [] +204 None user1-200@plc1.org keys: [200] sites: [] +205 None user1-201@plc1.org keys: [201] sites: [] +206 None user1-202@plc1.org keys: [202] sites: [] +207 None user1-203@plc1.org keys: [203] sites: [] +208 None user1-204@plc1.org keys: [204] sites: [] +209 None user1-205@plc1.org keys: [205] sites: [] +210 None user1-206@plc1.org keys: [206] sites: [] +211 None user1-207@plc1.org keys: [207] sites: [] +212 None user1-208@plc1.org keys: [208] sites: [] +213 None user1-209@plc1.org keys: [209] sites: [] +214 None user1-210@plc1.org keys: [210] sites: [] +215 None user1-211@plc1.org keys: [211] sites: [] +216 None user1-212@plc1.org keys: [212] sites: [] +217 None user1-213@plc1.org keys: [213] sites: [] +218 None user1-214@plc1.org keys: [214] sites: [] +219 None user1-215@plc1.org keys: [215] sites: [] +220 None user1-216@plc1.org keys: [216] sites: [] +221 None user1-217@plc1.org keys: [217] sites: [] +222 None user1-218@plc1.org keys: [218] sites: [] +223 None user1-219@plc1.org keys: [219] sites: [] +224 None user1-220@plc1.org keys: [220] sites: [] +225 None user1-221@plc1.org keys: [221] sites: [] +226 None user1-222@plc1.org keys: [222] sites: [] +227 None user1-223@plc1.org keys: [223] sites: [] +228 None user1-224@plc1.org keys: [224] sites: [] +229 None user1-225@plc1.org keys: [225] sites: [] +230 None user1-226@plc1.org keys: [226] sites: [] +231 None user1-227@plc1.org keys: [227] sites: [] +232 None user1-228@plc1.org keys: [228] sites: [] +233 None user1-229@plc1.org keys: [229] sites: [] +234 None user1-230@plc1.org keys: [230] sites: [] +235 None user1-231@plc1.org keys: [231] sites: [] +236 None user1-232@plc1.org keys: [232] sites: [] +237 None user1-233@plc1.org keys: [233] sites: [] +238 None user1-234@plc1.org keys: [234] sites: [] +239 None user1-235@plc1.org keys: [235] sites: [] +240 None user1-236@plc1.org keys: [236] sites: [] +241 None user1-237@plc1.org keys: [237] sites: [] +242 None user1-238@plc1.org keys: [238] sites: [] +243 None user1-239@plc1.org keys: [239] sites: [] +244 None user1-240@plc1.org keys: [240] sites: [] +245 None user1-241@plc1.org keys: [241] sites: [] +246 None user1-242@plc1.org keys: [242] sites: [] +247 None user1-243@plc1.org keys: [243] sites: [] +248 None user1-244@plc1.org keys: [244] sites: [] +249 None user1-245@plc1.org keys: [245] sites: [] +250 None user1-246@plc1.org keys: [246] sites: [] +251 None user1-247@plc1.org keys: [247] sites: [] +252 None user1-248@plc1.org keys: [248] sites: [] +253 None user1-249@plc1.org keys: [249] sites: [] +254 None user1-250@plc1.org keys: [250] sites: [] +255 None user1-251@plc1.org keys: [251] sites: [] +256 None user1-252@plc1.org keys: [252] sites: [] +257 None user1-253@plc1.org keys: [253] sites: [] +258 None user1-254@plc1.org keys: [254] sites: [] +259 None user1-255@plc1.org keys: [255] sites: [] +260 None user1-256@plc1.org keys: [256] sites: [] +261 None user1-257@plc1.org keys: [257] sites: [] +262 None user1-258@plc1.org keys: [258] sites: [] +263 None user1-259@plc1.org keys: [259] sites: [] +264 None user1-260@plc1.org keys: [260] sites: [] +265 None user1-261@plc1.org keys: [261] sites: [] +266 None user1-262@plc1.org keys: [262] sites: [] +267 None user1-263@plc1.org keys: [263] sites: [] +268 None user1-264@plc1.org keys: [264] sites: [] +269 None user1-265@plc1.org keys: [265] sites: [] +270 None user1-266@plc1.org keys: [266] sites: [] +271 None user1-267@plc1.org keys: [267] sites: [] +272 None user1-268@plc1.org keys: [268] sites: [] +273 None user1-269@plc1.org keys: [269] sites: [] +274 None user1-270@plc1.org keys: [270] sites: [] +275 None user1-271@plc1.org keys: [271] sites: [] +276 None user1-272@plc1.org keys: [272] sites: [] +277 None user1-273@plc1.org keys: [273] sites: [] +278 None user1-274@plc1.org keys: [274] sites: [] +279 None user1-275@plc1.org keys: [275] sites: [] +280 None user1-276@plc1.org keys: [276] sites: [] +281 None user1-277@plc1.org keys: [277] sites: [] +282 None user1-278@plc1.org keys: [278] sites: [] +283 None user1-279@plc1.org keys: [279] sites: [] +284 None user1-280@plc1.org keys: [280] sites: [] +285 None user1-281@plc1.org keys: [281] sites: [] +286 None user1-282@plc1.org keys: [282] sites: [] +287 None user1-283@plc1.org keys: [283] sites: [] +288 None user1-284@plc1.org keys: [284] sites: [] +289 None user1-285@plc1.org keys: [285] sites: [] +290 None user1-286@plc1.org keys: [286] sites: [] +291 None user1-287@plc1.org keys: [287] sites: [] +292 None user1-288@plc1.org keys: [288] sites: [] +293 None user1-289@plc1.org keys: [289] sites: [] +294 None user1-290@plc1.org keys: [290] sites: [] +295 None user1-291@plc1.org keys: [291] sites: [] +296 None user1-292@plc1.org keys: [292] sites: [] +297 None user1-293@plc1.org keys: [293] sites: [] +298 None user1-294@plc1.org keys: [294] sites: [] +299 None user1-295@plc1.org keys: [295] sites: [] +300 None user1-296@plc1.org keys: [296] sites: [] +301 None user1-297@plc1.org keys: [297] sites: [] +302 None user1-298@plc1.org keys: [298] sites: [] +303 None user1-299@plc1.org keys: [299] sites: [] +304 None user1-300@plc1.org keys: [300] sites: [] +305 None user1-301@plc1.org keys: [301] sites: [] +306 None user1-302@plc1.org keys: [302] sites: [] +307 None user1-303@plc1.org keys: [303] sites: [] +308 None user1-304@plc1.org keys: [304] sites: [] +309 None user1-305@plc1.org keys: [305] sites: [] +310 None user1-306@plc1.org keys: [306] sites: [] +311 None user1-307@plc1.org keys: [307] sites: [] +312 None user1-308@plc1.org keys: [308] sites: [] +313 None user1-309@plc1.org keys: [309] sites: [] +314 None user1-310@plc1.org keys: [310] sites: [] +315 None user1-311@plc1.org keys: [311] sites: [] +316 None user1-312@plc1.org keys: [312] sites: [] +317 None user1-313@plc1.org keys: [313] sites: [] +318 None user1-314@plc1.org keys: [314] sites: [] +319 None user1-315@plc1.org keys: [315] sites: [] +320 None user1-316@plc1.org keys: [316] sites: [] +321 None user1-317@plc1.org keys: [317] sites: [] +322 None user1-318@plc1.org keys: [318] sites: [] +323 None user1-319@plc1.org keys: [319] sites: [] +324 None user1-320@plc1.org keys: [320] sites: [] +325 None user1-321@plc1.org keys: [321] sites: [] +326 None user1-322@plc1.org keys: [322] sites: [] +327 None user1-323@plc1.org keys: [323] sites: [] +328 None user1-324@plc1.org keys: [324] sites: [] +329 None user1-325@plc1.org keys: [325] sites: [] +330 None user1-326@plc1.org keys: [326] sites: [] +331 None user1-327@plc1.org keys: [327] sites: [] +332 None user1-328@plc1.org keys: [328] sites: [] +333 None user1-329@plc1.org keys: [329] sites: [] +334 None user1-330@plc1.org keys: [330] sites: [] +335 None user1-331@plc1.org keys: [331] sites: [] +336 None user1-332@plc1.org keys: [332] sites: [] +337 None user1-333@plc1.org keys: [333] sites: [] +338 None user1-334@plc1.org keys: [334] sites: [] +339 None user1-335@plc1.org keys: [335] sites: [] +340 None user1-336@plc1.org keys: [336] sites: [] +341 None user1-337@plc1.org keys: [337] sites: [] +342 None user1-338@plc1.org keys: [338] sites: [] +343 None user1-339@plc1.org keys: [339] sites: [] +344 None user1-340@plc1.org keys: [340] sites: [] +345 None user1-341@plc1.org keys: [341] sites: [] +346 None user1-342@plc1.org keys: [342] sites: [] +347 None user1-343@plc1.org keys: [343] sites: [] +348 None user1-344@plc1.org keys: [344] sites: [] +349 None user1-345@plc1.org keys: [345] sites: [] +350 None user1-346@plc1.org keys: [346] sites: [] +351 None user1-347@plc1.org keys: [347] sites: [] +352 None user1-348@plc1.org keys: [348] sites: [] +353 None user1-349@plc1.org keys: [349] sites: [] +354 None user1-350@plc1.org keys: [350] sites: [] +355 None user1-351@plc1.org keys: [351] sites: [] +356 None user1-352@plc1.org keys: [352] sites: [] +357 None user1-353@plc1.org keys: [353] sites: [] +358 None user1-354@plc1.org keys: [354] sites: [] +359 None user1-355@plc1.org keys: [355] sites: [] +360 None user1-356@plc1.org keys: [356] sites: [] +361 None user1-357@plc1.org keys: [357] sites: [] +362 None user1-358@plc1.org keys: [358] sites: [] +363 None user1-359@plc1.org keys: [359] sites: [] +364 None user1-360@plc1.org keys: [360] sites: [] +365 None user1-361@plc1.org keys: [361] sites: [] +366 None user1-362@plc1.org keys: [362] sites: [] +367 None user1-363@plc1.org keys: [363] sites: [] +368 None user1-364@plc1.org keys: [364] sites: [] +369 None user1-365@plc1.org keys: [365] sites: [] +370 None user1-366@plc1.org keys: [366] sites: [] +371 None user1-367@plc1.org keys: [367] sites: [] +372 None user1-368@plc1.org keys: [368] sites: [] +373 None user1-369@plc1.org keys: [369] sites: [] +374 None user1-370@plc1.org keys: [370] sites: [] +375 None user1-371@plc1.org keys: [371] sites: [] +376 None user1-372@plc1.org keys: [372] sites: [] +377 None user1-373@plc1.org keys: [373] sites: [] +378 None user1-374@plc1.org keys: [374] sites: [] +379 None user1-375@plc1.org keys: [375] sites: [] +380 None user1-376@plc1.org keys: [376] sites: [] +381 None user1-377@plc1.org keys: [377] sites: [] +382 None user1-378@plc1.org keys: [378] sites: [] +383 None user1-379@plc1.org keys: [379] sites: [] +384 None user1-380@plc1.org keys: [380] sites: [] +385 None user1-381@plc1.org keys: [381] sites: [] +386 None user1-382@plc1.org keys: [382] sites: [] +387 None user1-383@plc1.org keys: [383] sites: [] +388 None user1-384@plc1.org keys: [384] sites: [] +389 None user1-385@plc1.org keys: [385] sites: [] +390 None user1-386@plc1.org keys: [386] sites: [] +391 None user1-387@plc1.org keys: [387] sites: [] +392 None user1-388@plc1.org keys: [388] sites: [] +393 None user1-389@plc1.org keys: [389] sites: [] +394 None user1-390@plc1.org keys: [390] sites: [] +395 None user1-391@plc1.org keys: [391] sites: [] +396 None user1-392@plc1.org keys: [392] sites: [] +397 None user1-393@plc1.org keys: [393] sites: [] +398 None user1-394@plc1.org keys: [394] sites: [] +399 None user1-395@plc1.org keys: [395] sites: [] +400 None user1-396@plc1.org keys: [396] sites: [] +401 None user1-397@plc1.org keys: [397] sites: [] +402 None user1-398@plc1.org keys: [398] sites: [] +403 None user1-399@plc1.org keys: [399] sites: [] +404 None user1-400@plc1.org keys: [400] sites: [] +405 None user1-401@plc1.org keys: [401] sites: [] +406 None user1-402@plc1.org keys: [402] sites: [] +407 None user1-403@plc1.org keys: [403] sites: [] +408 None user1-404@plc1.org keys: [404] sites: [] +409 None user1-405@plc1.org keys: [405] sites: [] +410 None user1-406@plc1.org keys: [406] sites: [] +411 None user1-407@plc1.org keys: [407] sites: [] +412 None user1-408@plc1.org keys: [408] sites: [] +413 None user1-409@plc1.org keys: [409] sites: [] +414 None user1-410@plc1.org keys: [410] sites: [] +415 None user1-411@plc1.org keys: [411] sites: [] +416 None user1-412@plc1.org keys: [412] sites: [] +417 None user1-413@plc1.org keys: [413] sites: [] +418 None user1-414@plc1.org keys: [414] sites: [] +419 None user1-415@plc1.org keys: [415] sites: [] +420 None user1-416@plc1.org keys: [416] sites: [] +421 None user1-417@plc1.org keys: [417] sites: [] +422 None user1-418@plc1.org keys: [418] sites: [] +423 None user1-419@plc1.org keys: [419] sites: [] +424 None user1-420@plc1.org keys: [420] sites: [] +425 None user1-421@plc1.org keys: [421] sites: [] +426 None user1-422@plc1.org keys: [422] sites: [] +427 None user1-423@plc1.org keys: [423] sites: [] +428 None user1-424@plc1.org keys: [424] sites: [] +429 None user1-425@plc1.org keys: [425] sites: [] +430 None user1-426@plc1.org keys: [426] sites: [] +431 None user1-427@plc1.org keys: [427] sites: [] +432 None user1-428@plc1.org keys: [428] sites: [] +433 None user1-429@plc1.org keys: [429] sites: [] +434 None user1-430@plc1.org keys: [430] sites: [] +435 None user1-431@plc1.org keys: [431] sites: [] +436 None user1-432@plc1.org keys: [432] sites: [] +437 None user1-433@plc1.org keys: [433] sites: [] +438 None user1-434@plc1.org keys: [434] sites: [] +439 None user1-435@plc1.org keys: [435] sites: [] +440 None user1-436@plc1.org keys: [436] sites: [] +441 None user1-437@plc1.org keys: [437] sites: [] +442 None user1-438@plc1.org keys: [438] sites: [] +443 None user1-439@plc1.org keys: [439] sites: [] +444 None user1-440@plc1.org keys: [440] sites: [] +445 None user1-441@plc1.org keys: [441] sites: [] +446 None user1-442@plc1.org keys: [442] sites: [] +447 None user1-443@plc1.org keys: [443] sites: [] +448 None user1-444@plc1.org keys: [444] sites: [] +449 None user1-445@plc1.org keys: [445] sites: [] +450 None user1-446@plc1.org keys: [446] sites: [] +451 None user1-447@plc1.org keys: [447] sites: [] +452 None user1-448@plc1.org keys: [448] sites: [] +453 None user1-449@plc1.org keys: [449] sites: [] +454 None user1-450@plc1.org keys: [450] sites: [] +455 None user1-451@plc1.org keys: [451] sites: [] +456 None user1-452@plc1.org keys: [452] sites: [] +457 None user1-453@plc1.org keys: [453] sites: [] +458 None user1-454@plc1.org keys: [454] sites: [] +459 None user1-455@plc1.org keys: [455] sites: [] +460 None user1-456@plc1.org keys: [456] sites: [] +461 None user1-457@plc1.org keys: [457] sites: [] +462 None user1-458@plc1.org keys: [458] sites: [] +463 None user1-459@plc1.org keys: [459] sites: [] +464 None user1-460@plc1.org keys: [460] sites: [] +465 None user1-461@plc1.org keys: [461] sites: [] +466 None user1-462@plc1.org keys: [462] sites: [] +467 None user1-463@plc1.org keys: [463] sites: [] +468 None user1-464@plc1.org keys: [464] sites: [] +469 None user1-465@plc1.org keys: [465] sites: [] +470 None user1-466@plc1.org keys: [466] sites: [] +471 None user1-467@plc1.org keys: [467] sites: [] +472 None user1-468@plc1.org keys: [468] sites: [] +473 None user1-469@plc1.org keys: [469] sites: [] +474 None user1-470@plc1.org keys: [470] sites: [] +475 None user1-471@plc1.org keys: [471] sites: [] +476 None user1-472@plc1.org keys: [472] sites: [] +477 None user1-473@plc1.org keys: [473] sites: [] +478 None user1-474@plc1.org keys: [474] sites: [] +479 None user1-475@plc1.org keys: [475] sites: [] +480 None user1-476@plc1.org keys: [476] sites: [] +481 None user1-477@plc1.org keys: [477] sites: [] +482 None user1-478@plc1.org keys: [478] sites: [] +483 None user1-479@plc1.org keys: [479] sites: [] +484 None user1-480@plc1.org keys: [480] sites: [] +485 None user1-481@plc1.org keys: [481] sites: [] +486 None user1-482@plc1.org keys: [482] sites: [] +487 None user1-483@plc1.org keys: [483] sites: [] +488 None user1-484@plc1.org keys: [484] sites: [] +489 None user1-485@plc1.org keys: [485] sites: [] +490 None user1-486@plc1.org keys: [486] sites: [] +491 None user1-487@plc1.org keys: [487] sites: [] +492 None user1-488@plc1.org keys: [488] sites: [] +493 None user1-489@plc1.org keys: [489] sites: [] +494 None user1-490@plc1.org keys: [490] sites: [] +495 None user1-491@plc1.org keys: [491] sites: [] +496 None user1-492@plc1.org keys: [492] sites: [] +497 None user1-493@plc1.org keys: [493] sites: [] +498 None user1-494@plc1.org keys: [494] sites: [] +499 None user1-495@plc1.org keys: [495] sites: [] +500 None user1-496@plc1.org keys: [496] sites: [] +501 None user1-497@plc1.org keys: [497] sites: [] +502 None user1-498@plc1.org keys: [498] sites: [] +503 None user1-499@plc1.org keys: [499] sites: [] +504 None user1-500@plc1.org keys: [500] sites: [] +505 None user1-501@plc1.org keys: [501] sites: [] +506 None user1-502@plc1.org keys: [502] sites: [] +507 None user1-503@plc1.org keys: [503] sites: [] +508 None user1-504@plc1.org keys: [504] sites: [] +509 None user1-505@plc1.org keys: [505] sites: [] +510 None user1-506@plc1.org keys: [506] sites: [] +511 None user1-507@plc1.org keys: [507] sites: [] +512 None user1-508@plc1.org keys: [508] sites: [] +513 None user1-509@plc1.org keys: [509] sites: [] +514 None user1-510@plc1.org keys: [510] sites: [] +515 None user1-511@plc1.org keys: [511] sites: [] +516 None user1-512@plc1.org keys: [512] sites: [] +517 None user1-513@plc1.org keys: [513] sites: [] +518 None user1-514@plc1.org keys: [514] sites: [] +519 None user1-515@plc1.org keys: [515] sites: [] +520 None user1-516@plc1.org keys: [516] sites: [] +521 None user1-517@plc1.org keys: [517] sites: [] +522 None user1-518@plc1.org keys: [518] sites: [] +523 None user1-519@plc1.org keys: [519] sites: [] +524 None user1-520@plc1.org keys: [520] sites: [] +525 None user1-521@plc1.org keys: [521] sites: [] +526 None user1-522@plc1.org keys: [522] sites: [] +527 None user1-523@plc1.org keys: [523] sites: [] +528 None user1-524@plc1.org keys: [524] sites: [] +529 None user1-525@plc1.org keys: [525] sites: [] +530 None user1-526@plc1.org keys: [526] sites: [] +531 None user1-527@plc1.org keys: [527] sites: [] +532 None user1-528@plc1.org keys: [528] sites: [] +533 None user1-529@plc1.org keys: [529] sites: [] +534 None user1-530@plc1.org keys: [530] sites: [] +535 None user1-531@plc1.org keys: [531] sites: [] +536 None user1-532@plc1.org keys: [532] sites: [] +537 None user1-533@plc1.org keys: [533] sites: [] +538 None user1-534@plc1.org keys: [534] sites: [] +539 None user1-535@plc1.org keys: [535] sites: [] +540 None user1-536@plc1.org keys: [536] sites: [] +541 None user1-537@plc1.org keys: [537] sites: [] +542 None user1-538@plc1.org keys: [538] sites: [] +543 None user1-539@plc1.org keys: [539] sites: [] +544 None user1-540@plc1.org keys: [540] sites: [] +545 None user1-541@plc1.org keys: [541] sites: [] +546 None user1-542@plc1.org keys: [542] sites: [] +547 None user1-543@plc1.org keys: [543] sites: [] +548 None user1-544@plc1.org keys: [544] sites: [] +549 None user1-545@plc1.org keys: [545] sites: [] +550 None user1-546@plc1.org keys: [546] sites: [] +551 None user1-547@plc1.org keys: [547] sites: [] +552 None user1-548@plc1.org keys: [548] sites: [] +553 None user1-549@plc1.org keys: [549] sites: [] +554 None user1-550@plc1.org keys: [550] sites: [] +555 None user1-551@plc1.org keys: [551] sites: [] +556 None user1-552@plc1.org keys: [552] sites: [] +557 None user1-553@plc1.org keys: [553] sites: [] +558 None user1-554@plc1.org keys: [554] sites: [] +559 None user1-555@plc1.org keys: [555] sites: [] +560 None user1-556@plc1.org keys: [556] sites: [] +561 None user1-557@plc1.org keys: [557] sites: [] +562 None user1-558@plc1.org keys: [558] sites: [] +563 None user1-559@plc1.org keys: [559] sites: [] +564 None user1-560@plc1.org keys: [560] sites: [] +565 None user1-561@plc1.org keys: [561] sites: [] +566 None user1-562@plc1.org keys: [562] sites: [] +567 None user1-563@plc1.org keys: [563] sites: [] +568 None user1-564@plc1.org keys: [564] sites: [] +569 None user1-565@plc1.org keys: [565] sites: [] +570 None user1-566@plc1.org keys: [566] sites: [] +571 None user1-567@plc1.org keys: [567] sites: [] +572 None user1-568@plc1.org keys: [568] sites: [] +573 None user1-569@plc1.org keys: [569] sites: [] +574 None user1-570@plc1.org keys: [570] sites: [] +575 None user1-571@plc1.org keys: [571] sites: [] +576 None user1-572@plc1.org keys: [572] sites: [] +577 None user1-573@plc1.org keys: [573] sites: [] +578 None user1-574@plc1.org keys: [574] sites: [] +579 None user1-575@plc1.org keys: [575] sites: [] +580 None user1-576@plc1.org keys: [576] sites: [] +581 None user1-577@plc1.org keys: [577] sites: [] +582 None user1-578@plc1.org keys: [578] sites: [] +583 None user1-579@plc1.org keys: [579] sites: [] +584 None user1-580@plc1.org keys: [580] sites: [] +585 None user1-581@plc1.org keys: [581] sites: [] +586 None user1-582@plc1.org keys: [582] sites: [] +587 None user1-583@plc1.org keys: [583] sites: [] +588 None user1-584@plc1.org keys: [584] sites: [] +589 None user1-585@plc1.org keys: [585] sites: [] +590 None user1-586@plc1.org keys: [586] sites: [] +591 None user1-587@plc1.org keys: [587] sites: [] +592 None user1-588@plc1.org keys: [588] sites: [] +593 None user1-589@plc1.org keys: [589] sites: [] +594 None user1-590@plc1.org keys: [590] sites: [] +595 None user1-591@plc1.org keys: [591] sites: [] +596 None user1-592@plc1.org keys: [592] sites: [] +597 None user1-593@plc1.org keys: [593] sites: [] +598 None user1-594@plc1.org keys: [594] sites: [] +599 None user1-595@plc1.org keys: [595] sites: [] +600 None user1-596@plc1.org keys: [596] sites: [] +601 None user1-597@plc1.org keys: [597] sites: [] +602 None user1-598@plc1.org keys: [598] sites: [] +603 None user1-599@plc1.org keys: [599] sites: [] +604 None user1-600@plc1.org keys: [600] sites: [] +605 None user1-601@plc1.org keys: [601] sites: [] +606 None user1-602@plc1.org keys: [602] sites: [] +607 None user1-603@plc1.org keys: [603] sites: [] +608 None user1-604@plc1.org keys: [604] sites: [] +609 None user1-605@plc1.org keys: [605] sites: [] +610 None user1-606@plc1.org keys: [606] sites: [] +611 None user1-607@plc1.org keys: [607] sites: [] +612 None user1-608@plc1.org keys: [608] sites: [] +613 None user1-609@plc1.org keys: [609] sites: [] +614 None user1-610@plc1.org keys: [610] sites: [] +615 None user1-611@plc1.org keys: [611] sites: [] +616 None user1-612@plc1.org keys: [612] sites: [] +617 None user1-613@plc1.org keys: [613] sites: [] +618 None user1-614@plc1.org keys: [614] sites: [] +619 None user1-615@plc1.org keys: [615] sites: [] +620 None user1-616@plc1.org keys: [616] sites: [] +621 None user1-617@plc1.org keys: [617] sites: [] +622 None user1-618@plc1.org keys: [618] sites: [] +623 None user1-619@plc1.org keys: [619] sites: [] +624 None user1-620@plc1.org keys: [620] sites: [] +625 None user1-621@plc1.org keys: [621] sites: [] +626 None user1-622@plc1.org keys: [622] sites: [] +627 None user1-623@plc1.org keys: [623] sites: [] +628 None user1-624@plc1.org keys: [624] sites: [] +629 None user1-625@plc1.org keys: [625] sites: [] +630 None user1-626@plc1.org keys: [626] sites: [] +631 None user1-627@plc1.org keys: [627] sites: [] +632 None user1-628@plc1.org keys: [628] sites: [] +633 None user1-629@plc1.org keys: [629] sites: [] +634 None user1-630@plc1.org keys: [630] sites: [] +635 None user1-631@plc1.org keys: [631] sites: [] +636 None user1-632@plc1.org keys: [632] sites: [] +637 None user1-633@plc1.org keys: [633] sites: [] +638 None user1-634@plc1.org keys: [634] sites: [] +639 None user1-635@plc1.org keys: [635] sites: [] +640 None user1-636@plc1.org keys: [636] sites: [] +641 None user1-637@plc1.org keys: [637] sites: [] +642 None user1-638@plc1.org keys: [638] sites: [] +643 None user1-639@plc1.org keys: [639] sites: [] +644 None user1-640@plc1.org keys: [640] sites: [] +645 None user1-641@plc1.org keys: [641] sites: [] +646 None user1-642@plc1.org keys: [642] sites: [] +647 None user1-643@plc1.org keys: [643] sites: [] +648 None user1-644@plc1.org keys: [644] sites: [] +649 None user1-645@plc1.org keys: [645] sites: [] +650 None user1-646@plc1.org keys: [646] sites: [] +651 None user1-647@plc1.org keys: [647] sites: [] +652 None user1-648@plc1.org keys: [648] sites: [] +653 None user1-649@plc1.org keys: [649] sites: [] +654 None user1-650@plc1.org keys: [650] sites: [] +655 None user1-651@plc1.org keys: [651] sites: [] +656 None user1-652@plc1.org keys: [652] sites: [] +657 None user1-653@plc1.org keys: [653] sites: [] +658 None user1-654@plc1.org keys: [654] sites: [] +659 None user1-655@plc1.org keys: [655] sites: [] +660 None user1-656@plc1.org keys: [656] sites: [] +661 None user1-657@plc1.org keys: [657] sites: [] +662 None user1-658@plc1.org keys: [658] sites: [] +663 None user1-659@plc1.org keys: [659] sites: [] +664 None user1-660@plc1.org keys: [660] sites: [] +665 None user1-661@plc1.org keys: [661] sites: [] +666 None user1-662@plc1.org keys: [662] sites: [] +667 None user1-663@plc1.org keys: [663] sites: [] +668 None user1-664@plc1.org keys: [664] sites: [] +669 None user1-665@plc1.org keys: [665] sites: [] +670 None user1-666@plc1.org keys: [666] sites: [] +671 None user1-667@plc1.org keys: [667] sites: [] +672 None user1-668@plc1.org keys: [668] sites: [] +673 None user1-669@plc1.org keys: [669] sites: [] +674 None user1-670@plc1.org keys: [670] sites: [] +675 None user1-671@plc1.org keys: [671] sites: [] +676 None user1-672@plc1.org keys: [672] sites: [] +677 None user1-673@plc1.org keys: [673] sites: [] +678 None user1-674@plc1.org keys: [674] sites: [] +679 None user1-675@plc1.org keys: [675] sites: [] +680 None user1-676@plc1.org keys: [676] sites: [] +681 None user1-677@plc1.org keys: [677] sites: [] +682 None user1-678@plc1.org keys: [678] sites: [] +683 None user1-679@plc1.org keys: [679] sites: [] +684 None user1-680@plc1.org keys: [680] sites: [] +685 None user1-681@plc1.org keys: [681] sites: [] +686 None user1-682@plc1.org keys: [682] sites: [] +687 None user1-683@plc1.org keys: [683] sites: [] +688 None user1-684@plc1.org keys: [684] sites: [] +689 None user1-685@plc1.org keys: [685] sites: [] +690 None user1-686@plc1.org keys: [686] sites: [] +691 None user1-687@plc1.org keys: [687] sites: [] +692 None user1-688@plc1.org keys: [688] sites: [] +693 None user1-689@plc1.org keys: [689] sites: [] +694 None user1-690@plc1.org keys: [690] sites: [] +695 None user1-691@plc1.org keys: [691] sites: [] +696 None user1-692@plc1.org keys: [692] sites: [] +697 None user1-693@plc1.org keys: [693] sites: [] +698 None user1-694@plc1.org keys: [694] sites: [] +699 None user1-695@plc1.org keys: [695] sites: [] +700 None user1-696@plc1.org keys: [696] sites: [] +701 None user1-697@plc1.org keys: [697] sites: [] +702 None user1-698@plc1.org keys: [698] sites: [] +703 None user1-699@plc1.org keys: [699] sites: [] +704 None user1-700@plc1.org keys: [700] sites: [] +705 None user1-701@plc1.org keys: [701] sites: [] +706 None user1-702@plc1.org keys: [702] sites: [] +707 None user1-703@plc1.org keys: [703] sites: [] +708 None user1-704@plc1.org keys: [704] sites: [] +709 None user1-705@plc1.org keys: [705] sites: [] +710 None user1-706@plc1.org keys: [706] sites: [] +711 None user1-707@plc1.org keys: [707] sites: [] +712 None user1-708@plc1.org keys: [708] sites: [] +713 None user1-709@plc1.org keys: [709] sites: [] +714 None user1-710@plc1.org keys: [710] sites: [] +715 None user1-711@plc1.org keys: [711] sites: [] +716 None user1-712@plc1.org keys: [712] sites: [] +717 None user1-713@plc1.org keys: [713] sites: [] +718 None user1-714@plc1.org keys: [714] sites: [] +719 None user1-715@plc1.org keys: [715] sites: [] +720 None user1-716@plc1.org keys: [716] sites: [] +721 None user1-717@plc1.org keys: [717] sites: [] +722 None user1-718@plc1.org keys: [718] sites: [] +723 None user1-719@plc1.org keys: [719] sites: [] +724 None user1-720@plc1.org keys: [720] sites: [] +725 None user1-721@plc1.org keys: [721] sites: [] +726 None user1-722@plc1.org keys: [722] sites: [] +727 None user1-723@plc1.org keys: [723] sites: [] +728 None user1-724@plc1.org keys: [724] sites: [] +729 None user1-725@plc1.org keys: [725] sites: [] +730 None user1-726@plc1.org keys: [726] sites: [] +731 None user1-727@plc1.org keys: [727] sites: [] +732 None user1-728@plc1.org keys: [728] sites: [] +733 None user1-729@plc1.org keys: [729] sites: [] +734 None user1-730@plc1.org keys: [730] sites: [] +735 None user1-731@plc1.org keys: [731] sites: [] +736 None user1-732@plc1.org keys: [732] sites: [] +737 None user1-733@plc1.org keys: [733] sites: [] +738 None user1-734@plc1.org keys: [734] sites: [] +739 None user1-735@plc1.org keys: [735] sites: [] +740 None user1-736@plc1.org keys: [736] sites: [] +741 None user1-737@plc1.org keys: [737] sites: [] +742 None user1-738@plc1.org keys: [738] sites: [] +743 None user1-739@plc1.org keys: [739] sites: [] +744 None user1-740@plc1.org keys: [740] sites: [] +745 None user1-741@plc1.org keys: [741] sites: [] +746 None user1-742@plc1.org keys: [742] sites: [] +747 None user1-743@plc1.org keys: [743] sites: [] +748 None user1-744@plc1.org keys: [744] sites: [] +749 None user1-745@plc1.org keys: [745] sites: [] +750 None user1-746@plc1.org keys: [746] sites: [] +751 None user1-747@plc1.org keys: [747] sites: [] +752 None user1-748@plc1.org keys: [748] sites: [] +753 None user1-749@plc1.org keys: [749] sites: [] +754 None user1-750@plc1.org keys: [750] sites: [] +755 None user1-751@plc1.org keys: [751] sites: [] +756 None user1-752@plc1.org keys: [752] sites: [] +757 None user1-753@plc1.org keys: [753] sites: [] +758 None user1-754@plc1.org keys: [754] sites: [] +759 None user1-755@plc1.org keys: [755] sites: [] +760 None user1-756@plc1.org keys: [756] sites: [] +761 None user1-757@plc1.org keys: [757] sites: [] +762 None user1-758@plc1.org keys: [758] sites: [] +763 None user1-759@plc1.org keys: [759] sites: [] +764 None user1-760@plc1.org keys: [760] sites: [] +765 None user1-761@plc1.org keys: [761] sites: [] +766 None user1-762@plc1.org keys: [762] sites: [] +767 None user1-763@plc1.org keys: [763] sites: [] +768 None user1-764@plc1.org keys: [764] sites: [] +769 None user1-765@plc1.org keys: [765] sites: [] +770 None user1-766@plc1.org keys: [766] sites: [] +771 None user1-767@plc1.org keys: [767] sites: [] +772 None user1-768@plc1.org keys: [768] sites: [] +773 None user1-769@plc1.org keys: [769] sites: [] +774 None user1-770@plc1.org keys: [770] sites: [] +775 None user1-771@plc1.org keys: [771] sites: [] +776 None user1-772@plc1.org keys: [772] sites: [] +777 None user1-773@plc1.org keys: [773] sites: [] +778 None user1-774@plc1.org keys: [774] sites: [] +779 None user1-775@plc1.org keys: [775] sites: [] +780 None user1-776@plc1.org keys: [776] sites: [] +781 None user1-777@plc1.org keys: [777] sites: [] +782 None user1-778@plc1.org keys: [778] sites: [] +783 None user1-779@plc1.org keys: [779] sites: [] +784 None user1-780@plc1.org keys: [780] sites: [] +785 None user1-781@plc1.org keys: [781] sites: [] +786 None user1-782@plc1.org keys: [782] sites: [] +787 None user1-783@plc1.org keys: [783] sites: [] +788 None user1-784@plc1.org keys: [784] sites: [] +789 None user1-785@plc1.org keys: [785] sites: [] +790 None user1-786@plc1.org keys: [786] sites: [] +791 None user1-787@plc1.org keys: [787] sites: [] +792 None user1-788@plc1.org keys: [788] sites: [] +793 None user1-789@plc1.org keys: [789] sites: [] +794 None user1-790@plc1.org keys: [790] sites: [] +795 None user1-791@plc1.org keys: [791] sites: [] +796 None user1-792@plc1.org keys: [792] sites: [] +797 None user1-793@plc1.org keys: [793] sites: [] +798 None user1-794@plc1.org keys: [794] sites: [] +799 None user1-795@plc1.org keys: [795] sites: [] +800 None user1-796@plc1.org keys: [796] sites: [] +801 None user1-797@plc1.org keys: [797] sites: [] +802 None user1-798@plc1.org keys: [798] sites: [] +803 None user1-799@plc1.org keys: [799] sites: [] +804 None user1-800@plc1.org keys: [800] sites: [] +805 None user1-801@plc1.org keys: [801] sites: [] +806 None user1-802@plc1.org keys: [802] sites: [] +807 None user1-803@plc1.org keys: [803] sites: [] +808 None user1-804@plc1.org keys: [804] sites: [] +809 None user1-805@plc1.org keys: [805] sites: [] +810 None user1-806@plc1.org keys: [806] sites: [] +811 None user1-807@plc1.org keys: [807] sites: [] +812 None user1-808@plc1.org keys: [808] sites: [] +813 None user1-809@plc1.org keys: [809] sites: [] +814 None user1-810@plc1.org keys: [810] sites: [] +815 None user1-811@plc1.org keys: [811] sites: [] +816 None user1-812@plc1.org keys: [812] sites: [] +817 None user1-813@plc1.org keys: [813] sites: [] +818 None user1-814@plc1.org keys: [814] sites: [] +819 None user1-815@plc1.org keys: [815] sites: [] +820 None user1-816@plc1.org keys: [816] sites: [] +821 None user1-817@plc1.org keys: [817] sites: [] +822 None user1-818@plc1.org keys: [818] sites: [] +823 None user1-819@plc1.org keys: [819] sites: [] +824 None user1-820@plc1.org keys: [820] sites: [] +825 None user1-821@plc1.org keys: [821] sites: [] +826 None user1-822@plc1.org keys: [822] sites: [] +827 None user1-823@plc1.org keys: [823] sites: [] +828 None user1-824@plc1.org keys: [824] sites: [] +829 None user1-825@plc1.org keys: [825] sites: [] +830 None user1-826@plc1.org keys: [826] sites: [] +831 None user1-827@plc1.org keys: [827] sites: [] +832 None user1-828@plc1.org keys: [828] sites: [] +833 None user1-829@plc1.org keys: [829] sites: [] +834 None user1-830@plc1.org keys: [830] sites: [] +835 None user1-831@plc1.org keys: [831] sites: [] +836 None user1-832@plc1.org keys: [832] sites: [] +837 None user1-833@plc1.org keys: [833] sites: [] +838 None user1-834@plc1.org keys: [834] sites: [] +839 None user1-835@plc1.org keys: [835] sites: [] +840 None user1-836@plc1.org keys: [836] sites: [] +841 None user1-837@plc1.org keys: [837] sites: [] +842 None user1-838@plc1.org keys: [838] sites: [] +843 None user1-839@plc1.org keys: [839] sites: [] +844 None user1-840@plc1.org keys: [840] sites: [] +845 None user1-841@plc1.org keys: [841] sites: [] +846 None user1-842@plc1.org keys: [842] sites: [] +847 None user1-843@plc1.org keys: [843] sites: [] +848 None user1-844@plc1.org keys: [844] sites: [] +849 None user1-845@plc1.org keys: [845] sites: [] +850 None user1-846@plc1.org keys: [846] sites: [] +851 None user1-847@plc1.org keys: [847] sites: [] +852 None user1-848@plc1.org keys: [848] sites: [] +853 None user1-849@plc1.org keys: [849] sites: [] +854 None user1-850@plc1.org keys: [850] sites: [] +855 None user1-851@plc1.org keys: [851] sites: [] +856 None user1-852@plc1.org keys: [852] sites: [] +857 None user1-853@plc1.org keys: [853] sites: [] +858 None user1-854@plc1.org keys: [854] sites: [] +859 None user1-855@plc1.org keys: [855] sites: [] +860 None user1-856@plc1.org keys: [856] sites: [] +861 None user1-857@plc1.org keys: [857] sites: [] +862 None user1-858@plc1.org keys: [858] sites: [] +863 None user1-859@plc1.org keys: [859] sites: [] +864 None user1-860@plc1.org keys: [860] sites: [] +865 None user1-861@plc1.org keys: [861] sites: [] +866 None user1-862@plc1.org keys: [862] sites: [] +867 None user1-863@plc1.org keys: [863] sites: [] +868 None user1-864@plc1.org keys: [864] sites: [] +869 None user1-865@plc1.org keys: [865] sites: [] +870 None user1-866@plc1.org keys: [866] sites: [] +871 None user1-867@plc1.org keys: [867] sites: [] +872 None user1-868@plc1.org keys: [868] sites: [] +873 None user1-869@plc1.org keys: [869] sites: [] +874 None user1-870@plc1.org keys: [870] sites: [] +875 None user1-871@plc1.org keys: [871] sites: [] +876 None user1-872@plc1.org keys: [872] sites: [] +877 None user1-873@plc1.org keys: [873] sites: [] +878 None user1-874@plc1.org keys: [874] sites: [] +879 None user1-875@plc1.org keys: [875] sites: [] +880 None user1-876@plc1.org keys: [876] sites: [] +881 None user1-877@plc1.org keys: [877] sites: [] +882 None user1-878@plc1.org keys: [878] sites: [] +883 None user1-879@plc1.org keys: [879] sites: [] +884 None user1-880@plc1.org keys: [880] sites: [] +885 None user1-881@plc1.org keys: [881] sites: [] +886 None user1-882@plc1.org keys: [882] sites: [] +887 None user1-883@plc1.org keys: [883] sites: [] +888 None user1-884@plc1.org keys: [884] sites: [] +889 None user1-885@plc1.org keys: [885] sites: [] +890 None user1-886@plc1.org keys: [886] sites: [] +891 None user1-887@plc1.org keys: [887] sites: [] +892 None user1-888@plc1.org keys: [888] sites: [] +893 None user1-889@plc1.org keys: [889] sites: [] +894 None user1-890@plc1.org keys: [890] sites: [] +895 None user1-891@plc1.org keys: [891] sites: [] +896 None user1-892@plc1.org keys: [892] sites: [] +897 None user1-893@plc1.org keys: [893] sites: [] +898 None user1-894@plc1.org keys: [894] sites: [] +899 None user1-895@plc1.org keys: [895] sites: [] +900 None user1-896@plc1.org keys: [896] sites: [] +901 None user1-897@plc1.org keys: [897] sites: [] +902 None user1-898@plc1.org keys: [898] sites: [] +903 None user1-899@plc1.org keys: [899] sites: [] +904 None user1-900@plc1.org keys: [900] sites: [] +905 None user1-901@plc1.org keys: [901] sites: [] +906 None user1-902@plc1.org keys: [902] sites: [] +907 None user1-903@plc1.org keys: [903] sites: [] +908 None user1-904@plc1.org keys: [904] sites: [] +909 None user1-905@plc1.org keys: [905] sites: [] +910 None user1-906@plc1.org keys: [906] sites: [] +911 None user1-907@plc1.org keys: [907] sites: [] +912 None user1-908@plc1.org keys: [908] sites: [] +913 None user1-909@plc1.org keys: [909] sites: [] +914 None user1-910@plc1.org keys: [910] sites: [] +915 None user1-911@plc1.org keys: [911] sites: [] +916 None user1-912@plc1.org keys: [912] sites: [] +917 None user1-913@plc1.org keys: [913] sites: [] +918 None user1-914@plc1.org keys: [914] sites: [] +919 None user1-915@plc1.org keys: [915] sites: [] +920 None user1-916@plc1.org keys: [916] sites: [] +921 None user1-917@plc1.org keys: [917] sites: [] +922 None user1-918@plc1.org keys: [918] sites: [] +923 None user1-919@plc1.org keys: [919] sites: [] +924 None user1-920@plc1.org keys: [920] sites: [] +925 None user1-921@plc1.org keys: [921] sites: [] +926 None user1-922@plc1.org keys: [922] sites: [] +927 None user1-923@plc1.org keys: [923] sites: [] +928 None user1-924@plc1.org keys: [924] sites: [] +929 None user1-925@plc1.org keys: [925] sites: [] +930 None user1-926@plc1.org keys: [926] sites: [] +931 None user1-927@plc1.org keys: [927] sites: [] +932 None user1-928@plc1.org keys: [928] sites: [] +933 None user1-929@plc1.org keys: [929] sites: [] +934 None user1-930@plc1.org keys: [930] sites: [] +935 None user1-931@plc1.org keys: [931] sites: [] +936 None user1-932@plc1.org keys: [932] sites: [] +937 None user1-933@plc1.org keys: [933] sites: [] +938 None user1-934@plc1.org keys: [934] sites: [] +939 None user1-935@plc1.org keys: [935] sites: [] +940 None user1-936@plc1.org keys: [936] sites: [] +941 None user1-937@plc1.org keys: [937] sites: [] +942 None user1-938@plc1.org keys: [938] sites: [] +943 None user1-939@plc1.org keys: [939] sites: [] +944 None user1-940@plc1.org keys: [940] sites: [] +945 None user1-941@plc1.org keys: [941] sites: [] +946 None user1-942@plc1.org keys: [942] sites: [] +947 None user1-943@plc1.org keys: [943] sites: [] +948 None user1-944@plc1.org keys: [944] sites: [] +949 None user1-945@plc1.org keys: [945] sites: [] +950 None user1-946@plc1.org keys: [946] sites: [] +951 None user1-947@plc1.org keys: [947] sites: [] +952 None user1-948@plc1.org keys: [948] sites: [] +953 None user1-949@plc1.org keys: [949] sites: [] +954 None user1-950@plc1.org keys: [950] sites: [] +955 None user1-951@plc1.org keys: [951] sites: [] +956 None user1-952@plc1.org keys: [952] sites: [] +957 None user1-953@plc1.org keys: [953] sites: [] +958 None user1-954@plc1.org keys: [954] sites: [] +959 None user1-955@plc1.org keys: [955] sites: [] +960 None user1-956@plc1.org keys: [956] sites: [] +961 None user1-957@plc1.org keys: [957] sites: [] +962 None user1-958@plc1.org keys: [958] sites: [] +963 None user1-959@plc1.org keys: [959] sites: [] +964 None user1-960@plc1.org keys: [960] sites: [] +965 None user1-961@plc1.org keys: [961] sites: [] +966 None user1-962@plc1.org keys: [962] sites: [] +967 None user1-963@plc1.org keys: [963] sites: [] +968 None user1-964@plc1.org keys: [964] sites: [] +969 None user1-965@plc1.org keys: [965] sites: [] +970 None user1-966@plc1.org keys: [966] sites: [] +971 None user1-967@plc1.org keys: [967] sites: [] +972 None user1-968@plc1.org keys: [968] sites: [] +973 None user1-969@plc1.org keys: [969] sites: [] +974 None user1-970@plc1.org keys: [970] sites: [] +975 None user1-971@plc1.org keys: [971] sites: [] +976 None user1-972@plc1.org keys: [972] sites: [] +977 None user1-973@plc1.org keys: [973] sites: [] +978 None user1-974@plc1.org keys: [974] sites: [] +979 None user1-975@plc1.org keys: [975] sites: [] +980 None user1-976@plc1.org keys: [976] sites: [] +981 None user1-977@plc1.org keys: [977] sites: [] +982 None user1-978@plc1.org keys: [978] sites: [] +983 None user1-979@plc1.org keys: [979] sites: [] +984 None user1-980@plc1.org keys: [980] sites: [] +985 None user1-981@plc1.org keys: [981] sites: [] +986 None user1-982@plc1.org keys: [982] sites: [] +987 None user1-983@plc1.org keys: [983] sites: [] +988 None user1-984@plc1.org keys: [984] sites: [] +989 None user1-985@plc1.org keys: [985] sites: [] +990 None user1-986@plc1.org keys: [986] sites: [] +991 None user1-987@plc1.org keys: [987] sites: [] +992 None user1-988@plc1.org keys: [988] sites: [] +993 None user1-989@plc1.org keys: [989] sites: [] +994 None user1-990@plc1.org keys: [990] sites: [] +995 None user1-991@plc1.org keys: [991] sites: [] +996 None user1-992@plc1.org keys: [992] sites: [] +997 None user1-993@plc1.org keys: [993] sites: [] +998 None user1-994@plc1.org keys: [994] sites: [] +999 None user1-995@plc1.org keys: [995] sites: [] +1000 None user1-996@plc1.org keys: [996] sites: [] +1001 None user1-997@plc1.org keys: [997] sites: [] +1002 None user1-998@plc1.org keys: [998] sites: [] +1003 None user1-999@plc1.org keys: [999] sites: [] +1004 None user1-1000@plc1.org keys: [1000] sites: [] +1005 None user1-1001@plc1.org keys: [1001] sites: [] +1006 None user1-1002@plc1.org keys: [1002] sites: [] +1007 None user1-1003@plc1.org keys: [1003] sites: [] +1008 None user1-1004@plc1.org keys: [1004] sites: [] +1009 None user1-1005@plc1.org keys: [1005] sites: [] +1010 None user1-1006@plc1.org keys: [1006] sites: [] +1011 None user1-1007@plc1.org keys: [1007] sites: [] +1012 None user1-1008@plc1.org keys: [1008] sites: [] +1013 None user1-1009@plc1.org keys: [1009] sites: [] +1014 None user1-1010@plc1.org keys: [1010] sites: [] +1015 None user1-1011@plc1.org keys: [1011] sites: [] +1016 None user1-1012@plc1.org keys: [1012] sites: [] +1017 None user1-1013@plc1.org keys: [1013] sites: [] +1018 None user1-1014@plc1.org keys: [1014] sites: [] +1019 None user1-1015@plc1.org keys: [1015] sites: [] +1020 None user1-1016@plc1.org keys: [1016] sites: [] +1021 None user1-1017@plc1.org keys: [1017] sites: [] +1022 None user1-1018@plc1.org keys: [1018] sites: [] +1023 None user1-1019@plc1.org keys: [1019] sites: [] +1024 None user1-1020@plc1.org keys: [1020] sites: [] +1025 None user1-1021@plc1.org keys: [1021] sites: [] +1026 None user1-1022@plc1.org keys: [1022] sites: [] +1027 None user1-1023@plc1.org keys: [1023] sites: [] +1028 None user1-1024@plc1.org keys: [1024] sites: [] +1029 None user1-1025@plc1.org keys: [1025] sites: [] +1030 None user1-1026@plc1.org keys: [1026] sites: [] +1031 None user1-1027@plc1.org keys: [1027] sites: [] +1032 None user1-1028@plc1.org keys: [1028] sites: [] +1033 None user1-1029@plc1.org keys: [1029] sites: [] +1034 None user1-1030@plc1.org keys: [1030] sites: [] +1035 None user1-1031@plc1.org keys: [1031] sites: [] +1036 None user1-1032@plc1.org keys: [1032] sites: [] +1037 None user1-1033@plc1.org keys: [1033] sites: [] +1038 None user1-1034@plc1.org keys: [1034] sites: [] +1039 None user1-1035@plc1.org keys: [1035] sites: [] +1040 None user1-1036@plc1.org keys: [1036] sites: [] +1041 None user1-1037@plc1.org keys: [1037] sites: [] +1042 None user1-1038@plc1.org keys: [1038] sites: [] +1043 None user1-1039@plc1.org keys: [1039] sites: [] +1044 None user1-1040@plc1.org keys: [1040] sites: [] +1045 None user1-1041@plc1.org keys: [1041] sites: [] +1046 None user1-1042@plc1.org keys: [1042] sites: [] +1047 None user1-1043@plc1.org keys: [1043] sites: [] +1048 None user1-1044@plc1.org keys: [1044] sites: [] +1049 None user1-1045@plc1.org keys: [1045] sites: [] +1050 None user1-1046@plc1.org keys: [1046] sites: [] +1051 None user1-1047@plc1.org keys: [1047] sites: [] +1052 None user1-1048@plc1.org keys: [1048] sites: [] +1053 None user1-1049@plc1.org keys: [1049] sites: [] +1054 None user1-1050@plc1.org keys: [1050] sites: [] +1055 None user1-1051@plc1.org keys: [1051] sites: [] +1056 None user1-1052@plc1.org keys: [1052] sites: [] +1057 None user1-1053@plc1.org keys: [1053] sites: [] +1058 None user1-1054@plc1.org keys: [1054] sites: [] +1059 None user1-1055@plc1.org keys: [1055] sites: [] +1060 None user1-1056@plc1.org keys: [1056] sites: [] +1061 None user1-1057@plc1.org keys: [1057] sites: [] +1062 None user1-1058@plc1.org keys: [1058] sites: [] +1063 None user1-1059@plc1.org keys: [1059] sites: [] +1064 None user1-1060@plc1.org keys: [1060] sites: [] +1065 None user1-1061@plc1.org keys: [1061] sites: [] +1066 None user1-1062@plc1.org keys: [1062] sites: [] +1067 None user1-1063@plc1.org keys: [1063] sites: [] +1068 None user1-1064@plc1.org keys: [1064] sites: [] +1069 None user1-1065@plc1.org keys: [1065] sites: [] +1070 None user1-1066@plc1.org keys: [1066] sites: [] +1071 None user1-1067@plc1.org keys: [1067] sites: [] +1072 None user1-1068@plc1.org keys: [1068] sites: [] +1073 None user1-1069@plc1.org keys: [1069] sites: [] +1074 None user1-1070@plc1.org keys: [1070] sites: [] +1075 None user1-1071@plc1.org keys: [1071] sites: [] +1076 None user1-1072@plc1.org keys: [1072] sites: [] +1077 None user1-1073@plc1.org keys: [1073] sites: [] +1078 None user1-1074@plc1.org keys: [1074] sites: [] +1079 None user1-1075@plc1.org keys: [1075] sites: [] +1080 None user1-1076@plc1.org keys: [1076] sites: [] +1081 None user1-1077@plc1.org keys: [1077] sites: [] +1082 None user1-1078@plc1.org keys: [1078] sites: [] +1083 None user1-1079@plc1.org keys: [1079] sites: [] +1084 None user1-1080@plc1.org keys: [1080] sites: [] +1085 None user1-1081@plc1.org keys: [1081] sites: [] +1086 None user1-1082@plc1.org keys: [1082] sites: [] +1087 None user1-1083@plc1.org keys: [1083] sites: [] +1088 None user1-1084@plc1.org keys: [1084] sites: [] +1089 None user1-1085@plc1.org keys: [1085] sites: [] +1090 None user1-1086@plc1.org keys: [1086] sites: [] +1091 None user1-1087@plc1.org keys: [1087] sites: [] +1092 None user1-1088@plc1.org keys: [1088] sites: [] +1093 None user1-1089@plc1.org keys: [1089] sites: [] +1094 None user1-1090@plc1.org keys: [1090] sites: [] +1095 None user1-1091@plc1.org keys: [1091] sites: [] +1096 None user1-1092@plc1.org keys: [1092] sites: [] +1097 None user1-1093@plc1.org keys: [1093] sites: [] +1098 None user1-1094@plc1.org keys: [1094] sites: [] +1099 None user1-1095@plc1.org keys: [1095] sites: [] +1100 None user1-1096@plc1.org keys: [1096] sites: [] +1101 None user1-1097@plc1.org keys: [1097] sites: [] +1102 None user1-1098@plc1.org keys: [1098] sites: [] +1103 None user1-1099@plc1.org keys: [1099] sites: [] +1104 None user1-1100@plc1.org keys: [1100] sites: [] +1105 None user1-1101@plc1.org keys: [1101] sites: [] +1106 None user1-1102@plc1.org keys: [1102] sites: [] +1107 None user1-1103@plc1.org keys: [1103] sites: [] +1108 None user1-1104@plc1.org keys: [1104] sites: [] +1109 None user1-1105@plc1.org keys: [1105] sites: [] +1110 None user1-1106@plc1.org keys: [1106] sites: [] +1111 None user1-1107@plc1.org keys: [1107] sites: [] +1112 None user1-1108@plc1.org keys: [1108] sites: [] +1113 None user1-1109@plc1.org keys: [1109] sites: [] +1114 None user1-1110@plc1.org keys: [1110] sites: [] +1115 None user1-1111@plc1.org keys: [1111] sites: [] +1116 None user1-1112@plc1.org keys: [1112] sites: [] +1117 None user1-1113@plc1.org keys: [1113] sites: [] +1118 None user1-1114@plc1.org keys: [1114] sites: [] +1119 None user1-1115@plc1.org keys: [1115] sites: [] +1120 None user1-1116@plc1.org keys: [1116] sites: [] +1121 None user1-1117@plc1.org keys: [1117] sites: [] +1122 None user1-1118@plc1.org keys: [1118] sites: [] +1123 None user1-1119@plc1.org keys: [1119] sites: [] +1124 None user1-1120@plc1.org keys: [1120] sites: [] +1125 None user1-1121@plc1.org keys: [1121] sites: [] +1126 None user1-1122@plc1.org keys: [1122] sites: [] +1127 None user1-1123@plc1.org keys: [1123] sites: [] +1128 None user1-1124@plc1.org keys: [1124] sites: [] +1129 None user1-1125@plc1.org keys: [1125] sites: [] +1130 None user1-1126@plc1.org keys: [1126] sites: [] +1131 None user1-1127@plc1.org keys: [1127] sites: [] +1132 None user1-1128@plc1.org keys: [1128] sites: [] +1133 None user1-1129@plc1.org keys: [1129] sites: [] +1134 None user1-1130@plc1.org keys: [1130] sites: [] +1135 None user1-1131@plc1.org keys: [1131] sites: [] +1136 None user1-1132@plc1.org keys: [1132] sites: [] +1137 None user1-1133@plc1.org keys: [1133] sites: [] +1138 None user1-1134@plc1.org keys: [1134] sites: [] +1139 None user1-1135@plc1.org keys: [1135] sites: [] +1140 None user1-1136@plc1.org keys: [1136] sites: [] +1141 None user1-1137@plc1.org keys: [1137] sites: [] +1142 None user1-1138@plc1.org keys: [1138] sites: [] +1143 None user1-1139@plc1.org keys: [1139] sites: [] +1144 None user1-1140@plc1.org keys: [1140] sites: [] +1145 None user1-1141@plc1.org keys: [1141] sites: [] +1146 None user1-1142@plc1.org keys: [1142] sites: [] +1147 None user1-1143@plc1.org keys: [1143] sites: [] +1148 None user1-1144@plc1.org keys: [1144] sites: [] +1149 None user1-1145@plc1.org keys: [1145] sites: [] +1150 None user1-1146@plc1.org keys: [1146] sites: [] +1151 None user1-1147@plc1.org keys: [1147] sites: [] +1152 None user1-1148@plc1.org keys: [1148] sites: [] +1153 None user1-1149@plc1.org keys: [1149] sites: [] +1154 None user1-1150@plc1.org keys: [1150] sites: [] +1155 None user1-1151@plc1.org keys: [1151] sites: [] +1156 None user1-1152@plc1.org keys: [1152] sites: [] +1157 None user1-1153@plc1.org keys: [1153] sites: [] +1158 None user1-1154@plc1.org keys: [1154] sites: [] +1159 None user1-1155@plc1.org keys: [1155] sites: [] +1160 None user1-1156@plc1.org keys: [1156] sites: [] +1161 None user1-1157@plc1.org keys: [1157] sites: [] +1162 None user1-1158@plc1.org keys: [1158] sites: [] +1163 None user1-1159@plc1.org keys: [1159] sites: [] +1164 None user1-1160@plc1.org keys: [1160] sites: [] +1165 None user1-1161@plc1.org keys: [1161] sites: [] +1166 None user1-1162@plc1.org keys: [1162] sites: [] +1167 None user1-1163@plc1.org keys: [1163] sites: [] +1168 None user1-1164@plc1.org keys: [1164] sites: [] +1169 None user1-1165@plc1.org keys: [1165] sites: [] +1170 None user1-1166@plc1.org keys: [1166] sites: [] +1171 None user1-1167@plc1.org keys: [1167] sites: [] +1172 None user1-1168@plc1.org keys: [1168] sites: [] +1173 None user1-1169@plc1.org keys: [1169] sites: [] +1174 None user1-1170@plc1.org keys: [1170] sites: [] +1175 None user1-1171@plc1.org keys: [1171] sites: [] +1176 None user1-1172@plc1.org keys: [1172] sites: [] +1177 None user1-1173@plc1.org keys: [1173] sites: [] +1178 None user1-1174@plc1.org keys: [1174] sites: [] +1179 None user1-1175@plc1.org keys: [1175] sites: [] +1180 None user1-1176@plc1.org keys: [1176] sites: [] +1181 None user1-1177@plc1.org keys: [1177] sites: [] +1182 None user1-1178@plc1.org keys: [1178] sites: [] +1183 None user1-1179@plc1.org keys: [1179] sites: [] +1184 None user1-1180@plc1.org keys: [1180] sites: [] +1185 None user1-1181@plc1.org keys: [1181] sites: [] +1186 None user1-1182@plc1.org keys: [1182] sites: [] +1187 None user1-1183@plc1.org keys: [1183] sites: [] +1188 None user1-1184@plc1.org keys: [1184] sites: [] +1189 None user1-1185@plc1.org keys: [1185] sites: [] +1190 None user1-1186@plc1.org keys: [1186] sites: [] +1191 None user1-1187@plc1.org keys: [1187] sites: [] +1192 None user1-1188@plc1.org keys: [1188] sites: [] +1193 None user1-1189@plc1.org keys: [1189] sites: [] +1194 None user1-1190@plc1.org keys: [1190] sites: [] +1195 None user1-1191@plc1.org keys: [1191] sites: [] +1196 None user1-1192@plc1.org keys: [1192] sites: [] +1197 None user1-1193@plc1.org keys: [1193] sites: [] +1198 None user1-1194@plc1.org keys: [1194] sites: [] +1199 None user1-1195@plc1.org keys: [1195] sites: [] +1200 None user1-1196@plc1.org keys: [1196] sites: [] +1201 None user1-1197@plc1.org keys: [1197] sites: [] +1202 None user1-1198@plc1.org keys: [1198] sites: [] +1203 None user1-1199@plc1.org keys: [1199] sites: [] +1204 None user1-1200@plc1.org keys: [1200] sites: [] +1205 None user1-1201@plc1.org keys: [1201] sites: [] +1206 None user1-1202@plc1.org keys: [1202] sites: [] +1207 None user1-1203@plc1.org keys: [1203] sites: [] +1208 None user1-1204@plc1.org keys: [1204] sites: [] +1209 None user1-1205@plc1.org keys: [1205] sites: [] +1210 None user1-1206@plc1.org keys: [1206] sites: [] +1211 None user1-1207@plc1.org keys: [1207] sites: [] +1212 None user1-1208@plc1.org keys: [1208] sites: [] +1213 None user1-1209@plc1.org keys: [1209] sites: [] +1214 None user1-1210@plc1.org keys: [1210] sites: [] +1215 None user1-1211@plc1.org keys: [1211] sites: [] +1216 None user1-1212@plc1.org keys: [1212] sites: [] +1217 None user1-1213@plc1.org keys: [1213] sites: [] +1218 None user1-1214@plc1.org keys: [1214] sites: [] +1219 None user1-1215@plc1.org keys: [1215] sites: [] +1220 None user1-1216@plc1.org keys: [1216] sites: [] +1221 None user1-1217@plc1.org keys: [1217] sites: [] +1222 None user1-1218@plc1.org keys: [1218] sites: [] +1223 None user1-1219@plc1.org keys: [1219] sites: [] +1224 None user1-1220@plc1.org keys: [1220] sites: [] +1225 None user1-1221@plc1.org keys: [1221] sites: [] +1226 None user1-1222@plc1.org keys: [1222] sites: [] +1227 None user1-1223@plc1.org keys: [1223] sites: [] +1228 None user1-1224@plc1.org keys: [1224] sites: [] +1229 None user1-1225@plc1.org keys: [1225] sites: [] +1230 None user1-1226@plc1.org keys: [1226] sites: [] +1231 None user1-1227@plc1.org keys: [1227] sites: [] +1232 None user1-1228@plc1.org keys: [1228] sites: [] +1233 None user1-1229@plc1.org keys: [1229] sites: [] +1234 None user1-1230@plc1.org keys: [1230] sites: [] +1235 None user1-1231@plc1.org keys: [1231] sites: [] +1236 None user1-1232@plc1.org keys: [1232] sites: [] +1237 None user1-1233@plc1.org keys: [1233] sites: [] +1238 None user1-1234@plc1.org keys: [1234] sites: [] +1239 None user1-1235@plc1.org keys: [1235] sites: [] +1240 None user1-1236@plc1.org keys: [1236] sites: [] +1241 None user1-1237@plc1.org keys: [1237] sites: [] +1242 None user1-1238@plc1.org keys: [1238] sites: [] +1243 None user1-1239@plc1.org keys: [1239] sites: [] +1244 None user1-1240@plc1.org keys: [1240] sites: [] +1245 None user1-1241@plc1.org keys: [1241] sites: [] +1246 None user1-1242@plc1.org keys: [1242] sites: [] +1247 None user1-1243@plc1.org keys: [1243] sites: [] +1248 None user1-1244@plc1.org keys: [1244] sites: [] +1249 None user1-1245@plc1.org keys: [1245] sites: [] +1250 None user1-1246@plc1.org keys: [1246] sites: [] +1251 None user1-1247@plc1.org keys: [1247] sites: [] +1252 None user1-1248@plc1.org keys: [1248] sites: [] +1253 None user1-1249@plc1.org keys: [1249] sites: [] +1254 None user1-1250@plc1.org keys: [1250] sites: [] +1255 None user1-1251@plc1.org keys: [1251] sites: [] +1256 None user1-1252@plc1.org keys: [1252] sites: [] +1257 None user1-1253@plc1.org keys: [1253] sites: [] +1258 None user1-1254@plc1.org keys: [1254] sites: [] +1259 None user1-1255@plc1.org keys: [1255] sites: [] +1260 None user1-1256@plc1.org keys: [1256] sites: [] +1261 None user1-1257@plc1.org keys: [1257] sites: [] +1262 None user1-1258@plc1.org keys: [1258] sites: [] +1263 None user1-1259@plc1.org keys: [1259] sites: [] +1264 None user1-1260@plc1.org keys: [1260] sites: [] +1265 None user1-1261@plc1.org keys: [1261] sites: [] +1266 None user1-1262@plc1.org keys: [1262] sites: [] +1267 None user1-1263@plc1.org keys: [1263] sites: [] +1268 None user1-1264@plc1.org keys: [1264] sites: [] +1269 None user1-1265@plc1.org keys: [1265] sites: [] +1270 None user1-1266@plc1.org keys: [1266] sites: [] +1271 None user1-1267@plc1.org keys: [1267] sites: [] +1272 None user1-1268@plc1.org keys: [1268] sites: [] +1273 None user1-1269@plc1.org keys: [1269] sites: [] +1274 None user1-1270@plc1.org keys: [1270] sites: [] +1275 None user1-1271@plc1.org keys: [1271] sites: [] +1276 None user1-1272@plc1.org keys: [1272] sites: [] +1277 None user1-1273@plc1.org keys: [1273] sites: [] +1278 None user1-1274@plc1.org keys: [1274] sites: [] +1279 None user1-1275@plc1.org keys: [1275] sites: [] +1280 None user1-1276@plc1.org keys: [1276] sites: [] +1281 None user1-1277@plc1.org keys: [1277] sites: [] +1282 None user1-1278@plc1.org keys: [1278] sites: [] +1283 None user1-1279@plc1.org keys: [1279] sites: [] +1284 None user1-1280@plc1.org keys: [1280] sites: [] +1285 None user1-1281@plc1.org keys: [1281] sites: [] +1286 None user1-1282@plc1.org keys: [1282] sites: [] +1287 None user1-1283@plc1.org keys: [1283] sites: [] +1288 None user1-1284@plc1.org keys: [1284] sites: [] +1289 None user1-1285@plc1.org keys: [1285] sites: [] +1290 None user1-1286@plc1.org keys: [1286] sites: [] +1291 None user1-1287@plc1.org keys: [1287] sites: [] +1292 None user1-1288@plc1.org keys: [1288] sites: [] +1293 None user1-1289@plc1.org keys: [1289] sites: [] +1294 None user1-1290@plc1.org keys: [1290] sites: [] +1295 None user1-1291@plc1.org keys: [1291] sites: [] +1296 None user1-1292@plc1.org keys: [1292] sites: [] +1297 None user1-1293@plc1.org keys: [1293] sites: [] +1298 None user1-1294@plc1.org keys: [1294] sites: [] +1299 None user1-1295@plc1.org keys: [1295] sites: [] +1300 None user1-1296@plc1.org keys: [1296] sites: [] +1301 None user1-1297@plc1.org keys: [1297] sites: [] +1302 None user1-1298@plc1.org keys: [1298] sites: [] +1303 None user1-1299@plc1.org keys: [1299] sites: [] +1304 None user1-1300@plc1.org keys: [1300] sites: [] +1305 None user1-1301@plc1.org keys: [1301] sites: [] +1306 None user1-1302@plc1.org keys: [1302] sites: [] +1307 None user1-1303@plc1.org keys: [1303] sites: [] +1308 None user1-1304@plc1.org keys: [1304] sites: [] +1309 None user1-1305@plc1.org keys: [1305] sites: [] +1310 None user1-1306@plc1.org keys: [1306] sites: [] +1311 None user1-1307@plc1.org keys: [1307] sites: [] +1312 None user1-1308@plc1.org keys: [1308] sites: [] +1313 None user1-1309@plc1.org keys: [1309] sites: [] +1314 None user1-1310@plc1.org keys: [1310] sites: [] +1315 None user1-1311@plc1.org keys: [1311] sites: [] +1316 None user1-1312@plc1.org keys: [1312] sites: [] +1317 None user1-1313@plc1.org keys: [1313] sites: [] +1318 None user1-1314@plc1.org keys: [1314] sites: [] +1319 None user1-1315@plc1.org keys: [1315] sites: [] +1320 None user1-1316@plc1.org keys: [1316] sites: [] +1321 None user1-1317@plc1.org keys: [1317] sites: [] +1322 None user1-1318@plc1.org keys: [1318] sites: [] +1323 None user1-1319@plc1.org keys: [1319] sites: [] +1324 None user1-1320@plc1.org keys: [1320] sites: [] +1325 None user1-1321@plc1.org keys: [1321] sites: [] +1326 None user1-1322@plc1.org keys: [1322] sites: [] +1327 None user1-1323@plc1.org keys: [1323] sites: [] +1328 None user1-1324@plc1.org keys: [1324] sites: [] +1329 None user1-1325@plc1.org keys: [1325] sites: [] +1330 None user1-1326@plc1.org keys: [1326] sites: [] +1331 None user1-1327@plc1.org keys: [1327] sites: [] +1332 None user1-1328@plc1.org keys: [1328] sites: [] +1333 None user1-1329@plc1.org keys: [1329] sites: [] +1334 None user1-1330@plc1.org keys: [1330] sites: [] +1335 None user1-1331@plc1.org keys: [1331] sites: [] +1336 None user1-1332@plc1.org keys: [1332] sites: [] +1337 None user1-1333@plc1.org keys: [1333] sites: [] +1338 None user1-1334@plc1.org keys: [1334] sites: [] +1339 None user1-1335@plc1.org keys: [1335] sites: [] +1340 None user1-1336@plc1.org keys: [1336] sites: [] +1341 None user1-1337@plc1.org keys: [1337] sites: [] +1342 None user1-1338@plc1.org keys: [1338] sites: [] +1343 None user1-1339@plc1.org keys: [1339] sites: [] +1344 None user1-1340@plc1.org keys: [1340] sites: [] +1345 None user1-1341@plc1.org keys: [1341] sites: [] +1346 None user1-1342@plc1.org keys: [1342] sites: [] +1347 None user1-1343@plc1.org keys: [1343] sites: [] +1348 None user1-1344@plc1.org keys: [1344] sites: [] +1349 None user1-1345@plc1.org keys: [1345] sites: [] +1350 None user1-1346@plc1.org keys: [1346] sites: [] +1351 None user1-1347@plc1.org keys: [1347] sites: [] +1352 None user1-1348@plc1.org keys: [1348] sites: [] +1353 None user1-1349@plc1.org keys: [1349] sites: [] +1354 None user1-1350@plc1.org keys: [1350] sites: [] +1355 None user1-1351@plc1.org keys: [1351] sites: [] +1356 None user1-1352@plc1.org keys: [1352] sites: [] +1357 None user1-1353@plc1.org keys: [1353] sites: [] +1358 None user1-1354@plc1.org keys: [1354] sites: [] +1359 None user1-1355@plc1.org keys: [1355] sites: [] +1360 None user1-1356@plc1.org keys: [1356] sites: [] +1361 None user1-1357@plc1.org keys: [1357] sites: [] +1362 None user1-1358@plc1.org keys: [1358] sites: [] +1363 None user1-1359@plc1.org keys: [1359] sites: [] +1364 None user1-1360@plc1.org keys: [1360] sites: [] +1365 None user1-1361@plc1.org keys: [1361] sites: [] +1366 None user1-1362@plc1.org keys: [1362] sites: [] +1367 None user1-1363@plc1.org keys: [1363] sites: [] +1368 None user1-1364@plc1.org keys: [1364] sites: [] +1369 None user1-1365@plc1.org keys: [1365] sites: [] +1370 None user1-1366@plc1.org keys: [1366] sites: [] +1371 None user1-1367@plc1.org keys: [1367] sites: [] +1372 None user1-1368@plc1.org keys: [1368] sites: [] +1373 None user1-1369@plc1.org keys: [1369] sites: [] +1374 None user1-1370@plc1.org keys: [1370] sites: [] +1375 None user1-1371@plc1.org keys: [1371] sites: [] +1376 None user1-1372@plc1.org keys: [1372] sites: [] +1377 None user1-1373@plc1.org keys: [1373] sites: [] +1378 None user1-1374@plc1.org keys: [1374] sites: [] +1379 None user1-1375@plc1.org keys: [1375] sites: [] +1380 None user1-1376@plc1.org keys: [1376] sites: [] +1381 None user1-1377@plc1.org keys: [1377] sites: [] +1382 None user1-1378@plc1.org keys: [1378] sites: [] +1383 None user1-1379@plc1.org keys: [1379] sites: [] +1384 None user1-1380@plc1.org keys: [1380] sites: [] +1385 None user1-1381@plc1.org keys: [1381] sites: [] +1386 None user1-1382@plc1.org keys: [1382] sites: [] +1387 None user1-1383@plc1.org keys: [1383] sites: [] +1388 None user1-1384@plc1.org keys: [1384] sites: [] +1389 None user1-1385@plc1.org keys: [1385] sites: [] +1390 None user1-1386@plc1.org keys: [1386] sites: [] +1391 None user1-1387@plc1.org keys: [1387] sites: [] +1392 None user1-1388@plc1.org keys: [1388] sites: [] +1393 None user1-1389@plc1.org keys: [1389] sites: [] +1394 None user1-1390@plc1.org keys: [1390] sites: [] +1395 None user1-1391@plc1.org keys: [1391] sites: [] +1396 None user1-1392@plc1.org keys: [1392] sites: [] +1397 None user1-1393@plc1.org keys: [1393] sites: [] +1398 None user1-1394@plc1.org keys: [1394] sites: [] +1399 None user1-1395@plc1.org keys: [1395] sites: [] +1400 None user1-1396@plc1.org keys: [1396] sites: [] +1401 None user1-1397@plc1.org keys: [1397] sites: [] +1402 None user1-1398@plc1.org keys: [1398] sites: [] +1403 None user1-1399@plc1.org keys: [1399] sites: [] +1404 None user1-1400@plc1.org keys: [1400] sites: [] +1405 None user1-1401@plc1.org keys: [1401] sites: [] +1406 None user1-1402@plc1.org keys: [1402] sites: [] +1407 None user1-1403@plc1.org keys: [1403] sites: [] +1408 None user1-1404@plc1.org keys: [1404] sites: [] +1409 None user1-1405@plc1.org keys: [1405] sites: [] +1410 None user1-1406@plc1.org keys: [1406] sites: [] +1411 None user1-1407@plc1.org keys: [1407] sites: [] +1412 None user1-1408@plc1.org keys: [1408] sites: [] +1413 None user1-1409@plc1.org keys: [1409] sites: [] +1414 None user1-1410@plc1.org keys: [1410] sites: [] +1415 None user1-1411@plc1.org keys: [1411] sites: [] +1416 None user1-1412@plc1.org keys: [1412] sites: [] +1417 None user1-1413@plc1.org keys: [1413] sites: [] +1418 None user1-1414@plc1.org keys: [1414] sites: [] +1419 None user1-1415@plc1.org keys: [1415] sites: [] +1420 None user1-1416@plc1.org keys: [1416] sites: [] +1421 None user1-1417@plc1.org keys: [1417] sites: [] +1422 None user1-1418@plc1.org keys: [1418] sites: [] +1423 None user1-1419@plc1.org keys: [1419] sites: [] +1424 None user1-1420@plc1.org keys: [1420] sites: [] +1425 None user1-1421@plc1.org keys: [1421] sites: [] +1426 None user1-1422@plc1.org keys: [1422] sites: [] +1427 None user1-1423@plc1.org keys: [1423] sites: [] +1428 None user1-1424@plc1.org keys: [1424] sites: [] +1429 None user1-1425@plc1.org keys: [1425] sites: [] +1430 None user1-1426@plc1.org keys: [1426] sites: [] +1431 None user1-1427@plc1.org keys: [1427] sites: [] +1432 None user1-1428@plc1.org keys: [1428] sites: [] +1433 None user1-1429@plc1.org keys: [1429] sites: [] +1434 None user1-1430@plc1.org keys: [1430] sites: [] +1435 None user1-1431@plc1.org keys: [1431] sites: [] +1436 None user1-1432@plc1.org keys: [1432] sites: [] +1437 None user1-1433@plc1.org keys: [1433] sites: [] +1438 None user1-1434@plc1.org keys: [1434] sites: [] +1439 None user1-1435@plc1.org keys: [1435] sites: [] +1440 None user1-1436@plc1.org keys: [1436] sites: [] +1441 None user1-1437@plc1.org keys: [1437] sites: [] +1442 None user1-1438@plc1.org keys: [1438] sites: [] +1443 None user1-1439@plc1.org keys: [1439] sites: [] +1444 None user1-1440@plc1.org keys: [1440] sites: [] +1445 None user1-1441@plc1.org keys: [1441] sites: [] +1446 None user1-1442@plc1.org keys: [1442] sites: [] +1447 None user1-1443@plc1.org keys: [1443] sites: [] +1448 None user1-1444@plc1.org keys: [1444] sites: [] +1449 None user1-1445@plc1.org keys: [1445] sites: [] +1450 None user1-1446@plc1.org keys: [1446] sites: [] +1451 None user1-1447@plc1.org keys: [1447] sites: [] +1452 None user1-1448@plc1.org keys: [1448] sites: [] +1453 None user1-1449@plc1.org keys: [1449] sites: [] +1454 None user1-1450@plc1.org keys: [1450] sites: [] +1455 None user1-1451@plc1.org keys: [1451] sites: [] +1456 None user1-1452@plc1.org keys: [1452] sites: [] +1457 None user1-1453@plc1.org keys: [1453] sites: [] +1458 None user1-1454@plc1.org keys: [1454] sites: [] +1459 None user1-1455@plc1.org keys: [1455] sites: [] +1460 None user1-1456@plc1.org keys: [1456] sites: [] +1461 None user1-1457@plc1.org keys: [1457] sites: [] +1462 None user1-1458@plc1.org keys: [1458] sites: [] +1463 None user1-1459@plc1.org keys: [1459] sites: [] +1464 None user1-1460@plc1.org keys: [1460] sites: [] +1465 None user1-1461@plc1.org keys: [1461] sites: [] +1466 None user1-1462@plc1.org keys: [1462] sites: [] +1467 None user1-1463@plc1.org keys: [1463] sites: [] +1468 None user1-1464@plc1.org keys: [1464] sites: [] +1469 None user1-1465@plc1.org keys: [1465] sites: [] +1470 None user1-1466@plc1.org keys: [1466] sites: [] +1471 None user1-1467@plc1.org keys: [1467] sites: [] +1472 None user1-1468@plc1.org keys: [1468] sites: [] +1473 None user1-1469@plc1.org keys: [1469] sites: [] +1474 None user1-1470@plc1.org keys: [1470] sites: [] +1475 None user1-1471@plc1.org keys: [1471] sites: [] +1476 None user1-1472@plc1.org keys: [1472] sites: [] +1477 None user1-1473@plc1.org keys: [1473] sites: [] +1478 None user1-1474@plc1.org keys: [1474] sites: [] +1479 None user1-1475@plc1.org keys: [1475] sites: [] +1480 None user1-1476@plc1.org keys: [1476] sites: [] +1481 None user1-1477@plc1.org keys: [1477] sites: [] +1482 None user1-1478@plc1.org keys: [1478] sites: [] +1483 None user1-1479@plc1.org keys: [1479] sites: [] +1484 None user1-1480@plc1.org keys: [1480] sites: [] +1485 None user1-1481@plc1.org keys: [1481] sites: [] +1486 None user1-1482@plc1.org keys: [1482] sites: [] +1487 None user1-1483@plc1.org keys: [1483] sites: [] +1488 None user1-1484@plc1.org keys: [1484] sites: [] +1489 None user1-1485@plc1.org keys: [1485] sites: [] +1490 None user1-1486@plc1.org keys: [1486] sites: [] +1491 None user1-1487@plc1.org keys: [1487] sites: [] +1492 None user1-1488@plc1.org keys: [1488] sites: [] +1493 None user1-1489@plc1.org keys: [1489] sites: [] +1494 None user1-1490@plc1.org keys: [1490] sites: [] +1495 None user1-1491@plc1.org keys: [1491] sites: [] +1496 None user1-1492@plc1.org keys: [1492] sites: [] +1497 None user1-1493@plc1.org keys: [1493] sites: [] +1498 None user1-1494@plc1.org keys: [1494] sites: [] +1499 None user1-1495@plc1.org keys: [1495] sites: [] +1500 None user1-1496@plc1.org keys: [1496] sites: [] +1501 None user1-1497@plc1.org keys: [1497] sites: [] +1502 None user1-1498@plc1.org keys: [1498] sites: [] +1503 None user1-1499@plc1.org keys: [1499] sites: [] +1504 None user1-1500@plc1.org keys: [1500] sites: [] +1505 None user1-1501@plc1.org keys: [1501] sites: [] +1506 None user1-1502@plc1.org keys: [1502] sites: [] +1507 None user1-1503@plc1.org keys: [1503] sites: [] +1508 None user1-1504@plc1.org keys: [1504] sites: [] +1509 None user1-1505@plc1.org keys: [1505] sites: [] +1510 None user1-1506@plc1.org keys: [1506] sites: [] +1511 None user1-1507@plc1.org keys: [1507] sites: [] +1512 None user1-1508@plc1.org keys: [1508] sites: [] +1513 None user1-1509@plc1.org keys: [1509] sites: [] +1514 None user1-1510@plc1.org keys: [1510] sites: [] +1515 None user1-1511@plc1.org keys: [1511] sites: [] +1516 None user1-1512@plc1.org keys: [1512] sites: [] +1517 None user1-1513@plc1.org keys: [1513] sites: [] +1518 None user1-1514@plc1.org keys: [1514] sites: [] +1519 None user1-1515@plc1.org keys: [1515] sites: [] +1520 None user1-1516@plc1.org keys: [1516] sites: [] +1521 None user1-1517@plc1.org keys: [1517] sites: [] +1522 None user1-1518@plc1.org keys: [1518] sites: [] +1523 None user1-1519@plc1.org keys: [1519] sites: [] +1524 None user1-1520@plc1.org keys: [1520] sites: [] +1525 None user1-1521@plc1.org keys: [1521] sites: [] +1526 None user1-1522@plc1.org keys: [1522] sites: [] +1527 None user1-1523@plc1.org keys: [1523] sites: [] +1528 None user1-1524@plc1.org keys: [1524] sites: [] +1529 None user1-1525@plc1.org keys: [1525] sites: [] +1530 None user1-1526@plc1.org keys: [1526] sites: [] +1531 None user1-1527@plc1.org keys: [1527] sites: [] +1532 None user1-1528@plc1.org keys: [1528] sites: [] +1533 None user1-1529@plc1.org keys: [1529] sites: [] +1534 None user1-1530@plc1.org keys: [1530] sites: [] +1535 None user1-1531@plc1.org keys: [1531] sites: [] +1536 None user1-1532@plc1.org keys: [1532] sites: [] +1537 None user1-1533@plc1.org keys: [1533] sites: [] +1538 None user1-1534@plc1.org keys: [1534] sites: [] +1539 None user1-1535@plc1.org keys: [1535] sites: [] +1540 None user1-1536@plc1.org keys: [1536] sites: [] +1541 None user1-1537@plc1.org keys: [1537] sites: [] +1542 None user1-1538@plc1.org keys: [1538] sites: [] +1543 None user1-1539@plc1.org keys: [1539] sites: [] +1544 None user1-1540@plc1.org keys: [1540] sites: [] +1545 None user1-1541@plc1.org keys: [1541] sites: [] +1546 None user1-1542@plc1.org keys: [1542] sites: [] +1547 None user1-1543@plc1.org keys: [1543] sites: [] +1548 None user1-1544@plc1.org keys: [1544] sites: [] +1549 None user1-1545@plc1.org keys: [1545] sites: [] +1550 None user1-1546@plc1.org keys: [1546] sites: [] +1551 None user1-1547@plc1.org keys: [1547] sites: [] +1552 None user1-1548@plc1.org keys: [1548] sites: [] +1553 None user1-1549@plc1.org keys: [1549] sites: [] +1554 None user1-1550@plc1.org keys: [1550] sites: [] +1555 None user1-1551@plc1.org keys: [1551] sites: [] +1556 None user1-1552@plc1.org keys: [1552] sites: [] +1557 None user1-1553@plc1.org keys: [1553] sites: [] +1558 None user1-1554@plc1.org keys: [1554] sites: [] +1559 None user1-1555@plc1.org keys: [1555] sites: [] +1560 None user1-1556@plc1.org keys: [1556] sites: [] +1561 None user1-1557@plc1.org keys: [1557] sites: [] +1562 None user1-1558@plc1.org keys: [1558] sites: [] +1563 None user1-1559@plc1.org keys: [1559] sites: [] +1564 None user1-1560@plc1.org keys: [1560] sites: [] +1565 None user1-1561@plc1.org keys: [1561] sites: [] +1566 None user1-1562@plc1.org keys: [1562] sites: [] +1567 None user1-1563@plc1.org keys: [1563] sites: [] +1568 None user1-1564@plc1.org keys: [1564] sites: [] +1569 None user1-1565@plc1.org keys: [1565] sites: [] +1570 None user1-1566@plc1.org keys: [1566] sites: [] +1571 None user1-1567@plc1.org keys: [1567] sites: [] +1572 None user1-1568@plc1.org keys: [1568] sites: [] +1573 None user1-1569@plc1.org keys: [1569] sites: [] +1574 None user1-1570@plc1.org keys: [1570] sites: [] +1575 None user1-1571@plc1.org keys: [1571] sites: [] +1576 None user1-1572@plc1.org keys: [1572] sites: [] +1577 None user1-1573@plc1.org keys: [1573] sites: [] +1578 None user1-1574@plc1.org keys: [1574] sites: [] +1579 None user1-1575@plc1.org keys: [1575] sites: [] +1580 None user1-1576@plc1.org keys: [1576] sites: [] +1581 None user1-1577@plc1.org keys: [1577] sites: [] +1582 None user1-1578@plc1.org keys: [1578] sites: [] +1583 None user1-1579@plc1.org keys: [1579] sites: [] +1584 None user1-1580@plc1.org keys: [1580] sites: [] +1585 None user1-1581@plc1.org keys: [1581] sites: [] +1586 None user1-1582@plc1.org keys: [1582] sites: [] +1587 None user1-1583@plc1.org keys: [1583] sites: [] +1588 None user1-1584@plc1.org keys: [1584] sites: [] +1589 None user1-1585@plc1.org keys: [1585] sites: [] +1590 None user1-1586@plc1.org keys: [1586] sites: [] +1591 None user1-1587@plc1.org keys: [1587] sites: [] +1592 None user1-1588@plc1.org keys: [1588] sites: [] +1593 None user1-1589@plc1.org keys: [1589] sites: [] +1594 None user1-1590@plc1.org keys: [1590] sites: [] +1595 None user1-1591@plc1.org keys: [1591] sites: [] +1596 None user1-1592@plc1.org keys: [1592] sites: [] +1597 None user1-1593@plc1.org keys: [1593] sites: [] +1598 None user1-1594@plc1.org keys: [1594] sites: [] +1599 None user1-1595@plc1.org keys: [1595] sites: [] +1600 None user1-1596@plc1.org keys: [1596] sites: [] +1601 None user1-1597@plc1.org keys: [1597] sites: [] +1602 None user1-1598@plc1.org keys: [1598] sites: [] +1603 None user1-1599@plc1.org keys: [1599] sites: [] +1604 None user1-1600@plc1.org keys: [1600] sites: [] +1605 None user1-1601@plc1.org keys: [1601] sites: [] +1606 None user1-1602@plc1.org keys: [1602] sites: [] +1607 None user1-1603@plc1.org keys: [1603] sites: [] +1608 None user1-1604@plc1.org keys: [1604] sites: [] +1609 None user1-1605@plc1.org keys: [1605] sites: [] +1610 None user1-1606@plc1.org keys: [1606] sites: [] +1611 None user1-1607@plc1.org keys: [1607] sites: [] +1612 None user1-1608@plc1.org keys: [1608] sites: [] +1613 None user1-1609@plc1.org keys: [1609] sites: [] +1614 None user1-1610@plc1.org keys: [1610] sites: [] +1615 None user1-1611@plc1.org keys: [1611] sites: [] +1616 None user1-1612@plc1.org keys: [1612] sites: [] +1617 None user1-1613@plc1.org keys: [1613] sites: [] +1618 None user1-1614@plc1.org keys: [1614] sites: [] +1619 None user1-1615@plc1.org keys: [1615] sites: [] +1620 None user1-1616@plc1.org keys: [1616] sites: [] +1621 None user1-1617@plc1.org keys: [1617] sites: [] +1622 None user1-1618@plc1.org keys: [1618] sites: [] +1623 None user1-1619@plc1.org keys: [1619] sites: [] +1624 None user1-1620@plc1.org keys: [1620] sites: [] +1625 None user1-1621@plc1.org keys: [1621] sites: [] +1626 None user1-1622@plc1.org keys: [1622] sites: [] +1627 None user1-1623@plc1.org keys: [1623] sites: [] +1628 None user1-1624@plc1.org keys: [1624] sites: [] +1629 None user1-1625@plc1.org keys: [1625] sites: [] +1630 None user1-1626@plc1.org keys: [1626] sites: [] +1631 None user1-1627@plc1.org keys: [1627] sites: [] +1632 None user1-1628@plc1.org keys: [1628] sites: [] +1633 None user1-1629@plc1.org keys: [1629] sites: [] +1634 None user1-1630@plc1.org keys: [1630] sites: [] +1635 None user1-1631@plc1.org keys: [1631] sites: [] +1636 None user1-1632@plc1.org keys: [1632] sites: [] +1637 None user1-1633@plc1.org keys: [1633] sites: [] +1638 None user1-1634@plc1.org keys: [1634] sites: [] +1639 None user1-1635@plc1.org keys: [1635] sites: [] +1640 None user1-1636@plc1.org keys: [1636] sites: [] +1641 None user1-1637@plc1.org keys: [1637] sites: [] +1642 None user1-1638@plc1.org keys: [1638] sites: [] +1643 None user1-1639@plc1.org keys: [1639] sites: [] +1644 None user1-1640@plc1.org keys: [1640] sites: [] +1645 None user1-1641@plc1.org keys: [1641] sites: [] +1646 None user1-1642@plc1.org keys: [1642] sites: [] +1647 None user1-1643@plc1.org keys: [1643] sites: [] +1648 None user1-1644@plc1.org keys: [1644] sites: [] +1649 None user1-1645@plc1.org keys: [1645] sites: [] +1650 None user1-1646@plc1.org keys: [1646] sites: [] +1651 None user1-1647@plc1.org keys: [1647] sites: [] +1652 None user1-1648@plc1.org keys: [1648] sites: [] +1653 None user1-1649@plc1.org keys: [1649] sites: [] +1654 None user1-1650@plc1.org keys: [1650] sites: [] +1655 None user1-1651@plc1.org keys: [1651] sites: [] +1656 None user1-1652@plc1.org keys: [1652] sites: [] +1657 None user1-1653@plc1.org keys: [1653] sites: [] +1658 None user1-1654@plc1.org keys: [1654] sites: [] +1659 None user1-1655@plc1.org keys: [1655] sites: [] +1660 None user1-1656@plc1.org keys: [1656] sites: [] +1661 None user1-1657@plc1.org keys: [1657] sites: [] +1662 None user1-1658@plc1.org keys: [1658] sites: [] +1663 None user1-1659@plc1.org keys: [1659] sites: [] +1664 None user1-1660@plc1.org keys: [1660] sites: [] +1665 None user1-1661@plc1.org keys: [1661] sites: [] +1666 None user1-1662@plc1.org keys: [1662] sites: [] +1667 None user1-1663@plc1.org keys: [1663] sites: [] +1668 None user1-1664@plc1.org keys: [1664] sites: [] +1669 None user1-1665@plc1.org keys: [1665] sites: [] +1670 None user1-1666@plc1.org keys: [1666] sites: [] +1671 None user1-1667@plc1.org keys: [1667] sites: [] +1672 None user1-1668@plc1.org keys: [1668] sites: [] +1673 None user1-1669@plc1.org keys: [1669] sites: [] +1674 None user1-1670@plc1.org keys: [1670] sites: [] +1675 None user1-1671@plc1.org keys: [1671] sites: [] +1676 None user1-1672@plc1.org keys: [1672] sites: [] +1677 None user1-1673@plc1.org keys: [1673] sites: [] +1678 None user1-1674@plc1.org keys: [1674] sites: [] +1679 None user1-1675@plc1.org keys: [1675] sites: [] +1680 None user1-1676@plc1.org keys: [1676] sites: [] +1681 None user1-1677@plc1.org keys: [1677] sites: [] +1682 None user1-1678@plc1.org keys: [1678] sites: [] +1683 None user1-1679@plc1.org keys: [1679] sites: [] +1684 None user1-1680@plc1.org keys: [1680] sites: [] +1685 None user1-1681@plc1.org keys: [1681] sites: [] +1686 None user1-1682@plc1.org keys: [1682] sites: [] +1687 None user1-1683@plc1.org keys: [1683] sites: [] +1688 None user1-1684@plc1.org keys: [1684] sites: [] +1689 None user1-1685@plc1.org keys: [1685] sites: [] +1690 None user1-1686@plc1.org keys: [1686] sites: [] +1691 None user1-1687@plc1.org keys: [1687] sites: [] +1692 None user1-1688@plc1.org keys: [1688] sites: [] +1693 None user1-1689@plc1.org keys: [1689] sites: [] +1694 None user1-1690@plc1.org keys: [1690] sites: [] +1695 None user1-1691@plc1.org keys: [1691] sites: [] +1696 None user1-1692@plc1.org keys: [1692] sites: [] +1697 None user1-1693@plc1.org keys: [1693] sites: [] +1698 None user1-1694@plc1.org keys: [1694] sites: [] +1699 None user1-1695@plc1.org keys: [1695] sites: [] +1700 None user1-1696@plc1.org keys: [1696] sites: [] +1701 None user1-1697@plc1.org keys: [1697] sites: [] +1702 None user1-1698@plc1.org keys: [1698] sites: [] +1703 None user1-1699@plc1.org keys: [1699] sites: [] +1704 None user1-1700@plc1.org keys: [1700] sites: [] +1705 None user1-1701@plc1.org keys: [1701] sites: [] +1706 None user1-1702@plc1.org keys: [1702] sites: [] +1707 None user1-1703@plc1.org keys: [1703] sites: [] +1708 None user1-1704@plc1.org keys: [1704] sites: [] +1709 None user1-1705@plc1.org keys: [1705] sites: [] +1710 None user1-1706@plc1.org keys: [1706] sites: [] +1711 None user1-1707@plc1.org keys: [1707] sites: [] +1712 None user1-1708@plc1.org keys: [1708] sites: [] +1713 None user1-1709@plc1.org keys: [1709] sites: [] +1714 None user1-1710@plc1.org keys: [1710] sites: [] +1715 None user1-1711@plc1.org keys: [1711] sites: [] +1716 None user1-1712@plc1.org keys: [1712] sites: [] +1717 None user1-1713@plc1.org keys: [1713] sites: [] +1718 None user1-1714@plc1.org keys: [1714] sites: [] +1719 None user1-1715@plc1.org keys: [1715] sites: [] +1720 None user1-1716@plc1.org keys: [1716] sites: [] +1721 None user1-1717@plc1.org keys: [1717] sites: [] +1722 None user1-1718@plc1.org keys: [1718] sites: [] +1723 None user1-1719@plc1.org keys: [1719] sites: [] +1724 None user1-1720@plc1.org keys: [1720] sites: [] +1725 None user1-1721@plc1.org keys: [1721] sites: [] +1726 None user1-1722@plc1.org keys: [1722] sites: [] +1727 None user1-1723@plc1.org keys: [1723] sites: [] +1728 None user1-1724@plc1.org keys: [1724] sites: [] +1729 None user1-1725@plc1.org keys: [1725] sites: [] +1730 None user1-1726@plc1.org keys: [1726] sites: [] +1731 None user1-1727@plc1.org keys: [1727] sites: [] +1732 None user1-1728@plc1.org keys: [1728] sites: [] +1733 None user1-1729@plc1.org keys: [1729] sites: [] +1734 None user1-1730@plc1.org keys: [1730] sites: [] +1735 None user1-1731@plc1.org keys: [1731] sites: [] +1736 None user1-1732@plc1.org keys: [1732] sites: [] +1737 None user1-1733@plc1.org keys: [1733] sites: [] +1738 None user1-1734@plc1.org keys: [1734] sites: [] +1739 None user1-1735@plc1.org keys: [1735] sites: [] +1740 None user1-1736@plc1.org keys: [1736] sites: [] +1741 None user1-1737@plc1.org keys: [1737] sites: [] +1742 None user1-1738@plc1.org keys: [1738] sites: [] +1743 None user1-1739@plc1.org keys: [1739] sites: [] +1744 None user1-1740@plc1.org keys: [1740] sites: [] +1745 None user1-1741@plc1.org keys: [1741] sites: [] +1746 None user1-1742@plc1.org keys: [1742] sites: [] +1747 None user1-1743@plc1.org keys: [1743] sites: [] +1748 None user1-1744@plc1.org keys: [1744] sites: [] +1749 None user1-1745@plc1.org keys: [1745] sites: [] +1750 None user1-1746@plc1.org keys: [1746] sites: [] +1751 None user1-1747@plc1.org keys: [1747] sites: [] +1752 None user1-1748@plc1.org keys: [1748] sites: [] +1753 None user1-1749@plc1.org keys: [1749] sites: [] +1754 None user1-1750@plc1.org keys: [1750] sites: [] +1755 None user1-1751@plc1.org keys: [1751] sites: [] +1756 None user1-1752@plc1.org keys: [1752] sites: [] +1757 None user1-1753@plc1.org keys: [1753] sites: [] +1758 None user1-1754@plc1.org keys: [1754] sites: [] +1759 None user1-1755@plc1.org keys: [1755] sites: [] +1760 None user1-1756@plc1.org keys: [1756] sites: [] +1761 None user1-1757@plc1.org keys: [1757] sites: [] +1762 None user1-1758@plc1.org keys: [1758] sites: [] +1763 None user1-1759@plc1.org keys: [1759] sites: [] +1764 None user1-1760@plc1.org keys: [1760] sites: [] +1765 None user1-1761@plc1.org keys: [1761] sites: [] +1766 None user1-1762@plc1.org keys: [1762] sites: [] +1767 None user1-1763@plc1.org keys: [1763] sites: [] +1768 None user1-1764@plc1.org keys: [1764] sites: [] +1769 None user1-1765@plc1.org keys: [1765] sites: [] +1770 None user1-1766@plc1.org keys: [1766] sites: [] +1771 None user1-1767@plc1.org keys: [1767] sites: [] +1772 None user1-1768@plc1.org keys: [1768] sites: [] +1773 None user1-1769@plc1.org keys: [1769] sites: [] +1774 None user1-1770@plc1.org keys: [1770] sites: [] +1775 None user1-1771@plc1.org keys: [1771] sites: [] +1776 None user1-1772@plc1.org keys: [1772] sites: [] +1777 None user1-1773@plc1.org keys: [1773] sites: [] +1778 None user1-1774@plc1.org keys: [1774] sites: [] +1779 None user1-1775@plc1.org keys: [1775] sites: [] +1780 None user1-1776@plc1.org keys: [1776] sites: [] +1781 None user1-1777@plc1.org keys: [1777] sites: [] +1782 None user1-1778@plc1.org keys: [1778] sites: [] +1783 None user1-1779@plc1.org keys: [1779] sites: [] +1784 None user1-1780@plc1.org keys: [1780] sites: [] +1785 None user1-1781@plc1.org keys: [1781] sites: [] +1786 None user1-1782@plc1.org keys: [1782] sites: [] +1787 None user1-1783@plc1.org keys: [1783] sites: [] +1788 None user1-1784@plc1.org keys: [1784] sites: [] +1789 None user1-1785@plc1.org keys: [1785] sites: [] +1790 None user1-1786@plc1.org keys: [1786] sites: [] +1791 None user1-1787@plc1.org keys: [1787] sites: [] +1792 None user1-1788@plc1.org keys: [1788] sites: [] +1793 None user1-1789@plc1.org keys: [1789] sites: [] +1794 None user1-1790@plc1.org keys: [1790] sites: [] +1795 None user1-1791@plc1.org keys: [1791] sites: [] +1796 None user1-1792@plc1.org keys: [1792] sites: [] +1797 None user1-1793@plc1.org keys: [1793] sites: [] +1798 None user1-1794@plc1.org keys: [1794] sites: [] +1799 None user1-1795@plc1.org keys: [1795] sites: [] +1800 None user1-1796@plc1.org keys: [1796] sites: [] +1801 None user1-1797@plc1.org keys: [1797] sites: [] +1802 None user1-1798@plc1.org keys: [1798] sites: [] +1803 None user1-1799@plc1.org keys: [1799] sites: [] +1804 None user1-1800@plc1.org keys: [1800] sites: [] +1805 None user1-1801@plc1.org keys: [1801] sites: [] +1806 None user1-1802@plc1.org keys: [1802] sites: [] +1807 None user1-1803@plc1.org keys: [1803] sites: [] +1808 None user1-1804@plc1.org keys: [1804] sites: [] +1809 None user1-1805@plc1.org keys: [1805] sites: [] +1810 None user1-1806@plc1.org keys: [1806] sites: [] +1811 None user1-1807@plc1.org keys: [1807] sites: [] +1812 None user1-1808@plc1.org keys: [1808] sites: [] +1813 None user1-1809@plc1.org keys: [1809] sites: [] +1814 None user1-1810@plc1.org keys: [1810] sites: [] +1815 None user1-1811@plc1.org keys: [1811] sites: [] +1816 None user1-1812@plc1.org keys: [1812] sites: [] +1817 None user1-1813@plc1.org keys: [1813] sites: [] +1818 None user1-1814@plc1.org keys: [1814] sites: [] +1819 None user1-1815@plc1.org keys: [1815] sites: [] +1820 None user1-1816@plc1.org keys: [1816] sites: [] +1821 None user1-1817@plc1.org keys: [1817] sites: [] +1822 None user1-1818@plc1.org keys: [1818] sites: [] +1823 None user1-1819@plc1.org keys: [1819] sites: [] +1824 None user1-1820@plc1.org keys: [1820] sites: [] +1825 None user1-1821@plc1.org keys: [1821] sites: [] +1826 None user1-1822@plc1.org keys: [1822] sites: [] +1827 None user1-1823@plc1.org keys: [1823] sites: [] +1828 None user1-1824@plc1.org keys: [1824] sites: [] +1829 None user1-1825@plc1.org keys: [1825] sites: [] +1830 None user1-1826@plc1.org keys: [1826] sites: [] +1831 None user1-1827@plc1.org keys: [1827] sites: [] +1832 None user1-1828@plc1.org keys: [1828] sites: [] +1833 None user1-1829@plc1.org keys: [1829] sites: [] +1834 None user1-1830@plc1.org keys: [1830] sites: [] +1835 None user1-1831@plc1.org keys: [1831] sites: [] +1836 None user1-1832@plc1.org keys: [1832] sites: [] +1837 None user1-1833@plc1.org keys: [1833] sites: [] +1838 None user1-1834@plc1.org keys: [1834] sites: [] +1839 None user1-1835@plc1.org keys: [1835] sites: [] +1840 None user1-1836@plc1.org keys: [1836] sites: [] +1841 None user1-1837@plc1.org keys: [1837] sites: [] +1842 None user1-1838@plc1.org keys: [1838] sites: [] +1843 None user1-1839@plc1.org keys: [1839] sites: [] +1844 None user1-1840@plc1.org keys: [1840] sites: [] +1845 None user1-1841@plc1.org keys: [1841] sites: [] +1846 None user1-1842@plc1.org keys: [1842] sites: [] +1847 None user1-1843@plc1.org keys: [1843] sites: [] +1848 None user1-1844@plc1.org keys: [1844] sites: [] +1849 None user1-1845@plc1.org keys: [1845] sites: [] +1850 None user1-1846@plc1.org keys: [1846] sites: [] +1851 None user1-1847@plc1.org keys: [1847] sites: [] +1852 None user1-1848@plc1.org keys: [1848] sites: [] +1853 None user1-1849@plc1.org keys: [1849] sites: [] +1854 None user1-1850@plc1.org keys: [1850] sites: [] +1855 None user1-1851@plc1.org keys: [1851] sites: [] +1856 None user1-1852@plc1.org keys: [1852] sites: [] +1857 None user1-1853@plc1.org keys: [1853] sites: [] +1858 None user1-1854@plc1.org keys: [1854] sites: [] +1859 None user1-1855@plc1.org keys: [1855] sites: [] +1860 None user1-1856@plc1.org keys: [1856] sites: [] +1861 None user1-1857@plc1.org keys: [1857] sites: [] +1862 None user1-1858@plc1.org keys: [1858] sites: [] +1863 None user1-1859@plc1.org keys: [1859] sites: [] +1864 None user1-1860@plc1.org keys: [1860] sites: [] +1865 None user1-1861@plc1.org keys: [1861] sites: [] +1866 None user1-1862@plc1.org keys: [1862] sites: [] +1867 None user1-1863@plc1.org keys: [1863] sites: [] +1868 None user1-1864@plc1.org keys: [1864] sites: [] +1869 None user1-1865@plc1.org keys: [1865] sites: [] +1870 None user1-1866@plc1.org keys: [1866] sites: [] +1871 None user1-1867@plc1.org keys: [1867] sites: [] +1872 None user1-1868@plc1.org keys: [1868] sites: [] +1873 None user1-1869@plc1.org keys: [1869] sites: [] +1874 None user1-1870@plc1.org keys: [1870] sites: [] +1875 None user1-1871@plc1.org keys: [1871] sites: [] +1876 None user1-1872@plc1.org keys: [1872] sites: [] +1877 None user1-1873@plc1.org keys: [1873] sites: [] +1878 None user1-1874@plc1.org keys: [1874] sites: [] +1879 None user1-1875@plc1.org keys: [1875] sites: [] +1880 None user1-1876@plc1.org keys: [1876] sites: [] +1881 None user1-1877@plc1.org keys: [1877] sites: [] +1882 None user1-1878@plc1.org keys: [1878] sites: [] +1883 None user1-1879@plc1.org keys: [1879] sites: [] +1884 None user1-1880@plc1.org keys: [1880] sites: [] +1885 None user1-1881@plc1.org keys: [1881] sites: [] +1886 None user1-1882@plc1.org keys: [1882] sites: [] +1887 None user1-1883@plc1.org keys: [1883] sites: [] +1888 None user1-1884@plc1.org keys: [1884] sites: [] +1889 None user1-1885@plc1.org keys: [1885] sites: [] +1890 None user1-1886@plc1.org keys: [1886] sites: [] +1891 None user1-1887@plc1.org keys: [1887] sites: [] +1892 None user1-1888@plc1.org keys: [1888] sites: [] +1893 None user1-1889@plc1.org keys: [1889] sites: [] +1894 None user1-1890@plc1.org keys: [1890] sites: [] +1895 None user1-1891@plc1.org keys: [1891] sites: [] +1896 None user1-1892@plc1.org keys: [1892] sites: [] +1897 None user1-1893@plc1.org keys: [1893] sites: [] +1898 None user1-1894@plc1.org keys: [1894] sites: [] +1899 None user1-1895@plc1.org keys: [1895] sites: [] +1900 None user1-1896@plc1.org keys: [1896] sites: [] +1901 None user1-1897@plc1.org keys: [1897] sites: [] +1902 None user1-1898@plc1.org keys: [1898] sites: [] +1903 None user1-1899@plc1.org keys: [1899] sites: [] +1904 None user1-1900@plc1.org keys: [1900] sites: [] +1905 None user1-1901@plc1.org keys: [1901] sites: [] +1906 None user1-1902@plc1.org keys: [1902] sites: [] +1907 None user1-1903@plc1.org keys: [1903] sites: [] +1908 None user1-1904@plc1.org keys: [1904] sites: [] +1909 None user1-1905@plc1.org keys: [1905] sites: [] +1910 None user1-1906@plc1.org keys: [1906] sites: [] +1911 None user1-1907@plc1.org keys: [1907] sites: [] +1912 None user1-1908@plc1.org keys: [1908] sites: [] +1913 None user1-1909@plc1.org keys: [1909] sites: [] +1914 None user1-1910@plc1.org keys: [1910] sites: [] +1915 None user1-1911@plc1.org keys: [1911] sites: [] +1916 None user1-1912@plc1.org keys: [1912] sites: [] +1917 None user1-1913@plc1.org keys: [1913] sites: [] +1918 None user1-1914@plc1.org keys: [1914] sites: [] +1919 None user1-1915@plc1.org keys: [1915] sites: [] +1920 None user1-1916@plc1.org keys: [1916] sites: [] +1921 None user1-1917@plc1.org keys: [1917] sites: [] +1922 None user1-1918@plc1.org keys: [1918] sites: [] +1923 None user1-1919@plc1.org keys: [1919] sites: [] +1924 None user1-1920@plc1.org keys: [1920] sites: [] +1925 None user1-1921@plc1.org keys: [1921] sites: [] +1926 None user1-1922@plc1.org keys: [1922] sites: [] +1927 None user1-1923@plc1.org keys: [1923] sites: [] +1928 None user1-1924@plc1.org keys: [1924] sites: [] +1929 None user1-1925@plc1.org keys: [1925] sites: [] +1930 None user1-1926@plc1.org keys: [1926] sites: [] +1931 None user1-1927@plc1.org keys: [1927] sites: [] +1932 None user1-1928@plc1.org keys: [1928] sites: [] +1933 None user1-1929@plc1.org keys: [1929] sites: [] +1934 None user1-1930@plc1.org keys: [1930] sites: [] +1935 None user1-1931@plc1.org keys: [1931] sites: [] +1936 None user1-1932@plc1.org keys: [1932] sites: [] +1937 None user1-1933@plc1.org keys: [1933] sites: [] +1938 None user1-1934@plc1.org keys: [1934] sites: [] +1939 None user1-1935@plc1.org keys: [1935] sites: [] +1940 None user1-1936@plc1.org keys: [1936] sites: [] +1941 None user1-1937@plc1.org keys: [1937] sites: [] +1942 None user1-1938@plc1.org keys: [1938] sites: [] +1943 None user1-1939@plc1.org keys: [1939] sites: [] +1944 None user1-1940@plc1.org keys: [1940] sites: [] +1945 None user1-1941@plc1.org keys: [1941] sites: [] +1946 None user1-1942@plc1.org keys: [1942] sites: [] +1947 None user1-1943@plc1.org keys: [1943] sites: [] +1948 None user1-1944@plc1.org keys: [1944] sites: [] +1949 None user1-1945@plc1.org keys: [1945] sites: [] +1950 None user1-1946@plc1.org keys: [1946] sites: [] +1951 None user1-1947@plc1.org keys: [1947] sites: [] +1952 None user1-1948@plc1.org keys: [1948] sites: [] +1953 None user1-1949@plc1.org keys: [1949] sites: [] +1954 None user1-1950@plc1.org keys: [1950] sites: [] +1955 None user1-1951@plc1.org keys: [1951] sites: [] +1956 None user1-1952@plc1.org keys: [1952] sites: [] +1957 None user1-1953@plc1.org keys: [1953] sites: [] +1958 None user1-1954@plc1.org keys: [1954] sites: [] +1959 None user1-1955@plc1.org keys: [1955] sites: [] +1960 None user1-1956@plc1.org keys: [1956] sites: [] +1961 None user1-1957@plc1.org keys: [1957] sites: [] +1962 None user1-1958@plc1.org keys: [1958] sites: [] +1963 None user1-1959@plc1.org keys: [1959] sites: [] +1964 None user1-1960@plc1.org keys: [1960] sites: [] +1965 None user1-1961@plc1.org keys: [1961] sites: [] +1966 None user1-1962@plc1.org keys: [1962] sites: [] +1967 None user1-1963@plc1.org keys: [1963] sites: [] +1968 None user1-1964@plc1.org keys: [1964] sites: [] +1969 None user1-1965@plc1.org keys: [1965] sites: [] +1970 None user1-1966@plc1.org keys: [1966] sites: [] +1971 None user1-1967@plc1.org keys: [1967] sites: [] +1972 None user1-1968@plc1.org keys: [1968] sites: [] +1973 None user1-1969@plc1.org keys: [1969] sites: [] +1974 None user1-1970@plc1.org keys: [1970] sites: [] +1975 None user1-1971@plc1.org keys: [1971] sites: [] +1976 None user1-1972@plc1.org keys: [1972] sites: [] +1977 None user1-1973@plc1.org keys: [1973] sites: [] +1978 None user1-1974@plc1.org keys: [1974] sites: [] +1979 None user1-1975@plc1.org keys: [1975] sites: [] +1980 None user1-1976@plc1.org keys: [1976] sites: [] +1981 None user1-1977@plc1.org keys: [1977] sites: [] +1982 None user1-1978@plc1.org keys: [1978] sites: [] +1983 None user1-1979@plc1.org keys: [1979] sites: [] +1984 None user1-1980@plc1.org keys: [1980] sites: [] +1985 None user1-1981@plc1.org keys: [1981] sites: [] +1986 None user1-1982@plc1.org keys: [1982] sites: [] +1987 None user1-1983@plc1.org keys: [1983] sites: [] +1988 None user1-1984@plc1.org keys: [1984] sites: [] +1989 None user1-1985@plc1.org keys: [1985] sites: [] +1990 None user1-1986@plc1.org keys: [1986] sites: [] +1991 None user1-1987@plc1.org keys: [1987] sites: [] +1992 None user1-1988@plc1.org keys: [1988] sites: [] +1993 None user1-1989@plc1.org keys: [1989] sites: [] +1994 None user1-1990@plc1.org keys: [1990] sites: [] +1995 None user1-1991@plc1.org keys: [1991] sites: [] +1996 None user1-1992@plc1.org keys: [1992] sites: [] +1997 None user1-1993@plc1.org keys: [1993] sites: [] +1998 None user1-1994@plc1.org keys: [1994] sites: [] +1999 None user1-1995@plc1.org keys: [1995] sites: [] +2000 None user1-1996@plc1.org keys: [1996] sites: [] +2001 None user1-1997@plc1.org keys: [1997] sites: [] +2002 None user1-1998@plc1.org keys: [1998] sites: [] +2003 None user1-1999@plc1.org keys: [1999] sites: [] +2004 None user1-2000@plc1.org keys: [2000] sites: [] +2005 1 root@plc2.org keys: [] sites: [1002] +2006 1 user2-1@plc2.org keys: [2001] sites: [] +2007 1 user2-2@plc2.org keys: [2002] sites: [] +2008 1 user2-3@plc2.org keys: [2003] sites: [] +2009 1 user2-4@plc2.org keys: [2004] sites: [] +2010 1 user2-5@plc2.org keys: [2005] sites: [] +2011 1 user2-6@plc2.org keys: [2006] sites: [] +2012 1 user2-7@plc2.org keys: [2007] sites: [] +2013 1 user2-8@plc2.org keys: [2008] sites: [] +2014 1 user2-9@plc2.org keys: [2009] sites: [] +2015 1 user2-10@plc2.org keys: [2010] sites: [] +2016 1 user2-11@plc2.org keys: [2011] sites: [] +2017 1 user2-12@plc2.org keys: [2012] sites: [] +2018 1 user2-13@plc2.org keys: [2013] sites: [] +2019 1 user2-14@plc2.org keys: [2014] sites: [] +2020 1 user2-15@plc2.org keys: [2015] sites: [] +2021 1 user2-16@plc2.org keys: [2016] sites: [] +2022 1 user2-17@plc2.org keys: [2017] sites: [] +2023 1 user2-18@plc2.org keys: [2018] sites: [] +2024 1 user2-19@plc2.org keys: [2019] sites: [] +2025 1 user2-20@plc2.org keys: [2020] sites: [] +2026 1 user2-21@plc2.org keys: [2021] sites: [] +2027 1 user2-22@plc2.org keys: [2022] sites: [] +2028 1 user2-23@plc2.org keys: [2023] sites: [] +2029 1 user2-24@plc2.org keys: [2024] sites: [] +2030 1 user2-25@plc2.org keys: [2025] sites: [] +2031 1 user2-26@plc2.org keys: [2026] sites: [] +2032 1 user2-27@plc2.org keys: [2027] sites: [] +2033 1 user2-28@plc2.org keys: [2028] sites: [] +2034 1 user2-29@plc2.org keys: [2029] sites: [] +2035 1 user2-30@plc2.org keys: [2030] sites: [] +2036 1 user2-31@plc2.org keys: [2031] sites: [] +2037 1 user2-32@plc2.org keys: [2032] sites: [] +2038 1 user2-33@plc2.org keys: [2033] sites: [] +2039 1 user2-34@plc2.org keys: [2034] sites: [] +2040 1 user2-35@plc2.org keys: [2035] sites: [] +2041 1 user2-36@plc2.org keys: [2036] sites: [] +2042 1 user2-37@plc2.org keys: [2037] sites: [] +2043 1 user2-38@plc2.org keys: [2038] sites: [] +2044 1 user2-39@plc2.org keys: [2039] sites: [] +2045 1 user2-40@plc2.org keys: [2040] sites: [] +2046 1 user2-41@plc2.org keys: [2041] sites: [] +2047 1 user2-42@plc2.org keys: [2042] sites: [] +2048 1 user2-43@plc2.org keys: [2043] sites: [] +2049 1 user2-44@plc2.org keys: [2044] sites: [] +2050 1 user2-45@plc2.org keys: [2045] sites: [] +2051 1 user2-46@plc2.org keys: [2046] sites: [] +2052 1 user2-47@plc2.org keys: [2047] sites: [] +2053 1 user2-48@plc2.org keys: [2048] sites: [] +2054 1 user2-49@plc2.org keys: [2049] sites: [] +2055 1 user2-50@plc2.org keys: [2050] sites: [] +2056 1 user2-51@plc2.org keys: [2051] sites: [] +2057 1 user2-52@plc2.org keys: [2052] sites: [] +2058 1 user2-53@plc2.org keys: [2053] sites: [] +2059 1 user2-54@plc2.org keys: [2054] sites: [] +2060 1 user2-55@plc2.org keys: [2055] sites: [] +2061 1 user2-56@plc2.org keys: [2056] sites: [] +2062 1 user2-57@plc2.org keys: [2057] sites: [] +2063 1 user2-58@plc2.org keys: [2058] sites: [] +2064 1 user2-59@plc2.org keys: [2059] sites: [] +2065 1 user2-60@plc2.org keys: [2060] sites: [] +2066 1 user2-61@plc2.org keys: [2061] sites: [] +2067 1 user2-62@plc2.org keys: [2062] sites: [] +2068 1 user2-63@plc2.org keys: [2063] sites: [] +2069 1 user2-64@plc2.org keys: [2064] sites: [] +2070 1 user2-65@plc2.org keys: [2065] sites: [] +2071 1 user2-66@plc2.org keys: [2066] sites: [] +2072 1 user2-67@plc2.org keys: [2067] sites: [] +2073 1 user2-68@plc2.org keys: [2068] sites: [] +2074 1 user2-69@plc2.org keys: [2069] sites: [] +2075 1 user2-70@plc2.org keys: [2070] sites: [] +2076 1 user2-71@plc2.org keys: [2071] sites: [] +2077 1 user2-72@plc2.org keys: [2072] sites: [] +2078 1 user2-73@plc2.org keys: [2073] sites: [] +2079 1 user2-74@plc2.org keys: [2074] sites: [] +2080 1 user2-75@plc2.org keys: [2075] sites: [] +2081 1 user2-76@plc2.org keys: [2076] sites: [] +2082 1 user2-77@plc2.org keys: [2077] sites: [] +2083 1 user2-78@plc2.org keys: [2078] sites: [] +2084 1 user2-79@plc2.org keys: [2079] sites: [] +2085 1 user2-80@plc2.org keys: [2080] sites: [] +2086 1 user2-81@plc2.org keys: [2081] sites: [] +2087 1 user2-82@plc2.org keys: [2082] sites: [] +2088 1 user2-83@plc2.org keys: [2083] sites: [] +2089 1 user2-84@plc2.org keys: [2084] sites: [] +2090 1 user2-85@plc2.org keys: [2085] sites: [] +2091 1 user2-86@plc2.org keys: [2086] sites: [] +2092 1 user2-87@plc2.org keys: [2087] sites: [] +2093 1 user2-88@plc2.org keys: [2088] sites: [] +2094 1 user2-89@plc2.org keys: [2089] sites: [] +2095 1 user2-90@plc2.org keys: [2090] sites: [] +2096 1 user2-91@plc2.org keys: [2091] sites: [] +2097 1 user2-92@plc2.org keys: [2092] sites: [] +2098 1 user2-93@plc2.org keys: [2093] sites: [] +2099 1 user2-94@plc2.org keys: [2094] sites: [] +2100 1 user2-95@plc2.org keys: [2095] sites: [] +2101 1 user2-96@plc2.org keys: [2096] sites: [] +2102 1 user2-97@plc2.org keys: [2097] sites: [] +2103 1 user2-98@plc2.org keys: [2098] sites: [] +2104 1 user2-99@plc2.org keys: [2099] sites: [] +2105 1 user2-100@plc2.org keys: [2100] sites: [] +2106 1 user2-101@plc2.org keys: [2101] sites: [] +2107 1 user2-102@plc2.org keys: [2102] sites: [] +2108 1 user2-103@plc2.org keys: [2103] sites: [] +2109 1 user2-104@plc2.org keys: [2104] sites: [] +2110 1 user2-105@plc2.org keys: [2105] sites: [] +2111 1 user2-106@plc2.org keys: [2106] sites: [] +2112 1 user2-107@plc2.org keys: [2107] sites: [] +2113 1 user2-108@plc2.org keys: [2108] sites: [] +2114 1 user2-109@plc2.org keys: [2109] sites: [] +2115 1 user2-110@plc2.org keys: [2110] sites: [] +2116 1 user2-111@plc2.org keys: [2111] sites: [] +2117 1 user2-112@plc2.org keys: [2112] sites: [] +2118 1 user2-113@plc2.org keys: [2113] sites: [] +2119 1 user2-114@plc2.org keys: [2114] sites: [] +2120 1 user2-115@plc2.org keys: [2115] sites: [] +2121 1 user2-116@plc2.org keys: [2116] sites: [] +2122 1 user2-117@plc2.org keys: [2117] sites: [] +2123 1 user2-118@plc2.org keys: [2118] sites: [] +2124 1 user2-119@plc2.org keys: [2119] sites: [] +2125 1 user2-120@plc2.org keys: [2120] sites: [] +2126 1 user2-121@plc2.org keys: [2121] sites: [] +2127 1 user2-122@plc2.org keys: [2122] sites: [] +2128 1 user2-123@plc2.org keys: [2123] sites: [] +2129 1 user2-124@plc2.org keys: [2124] sites: [] +2130 1 user2-125@plc2.org keys: [2125] sites: [] +2131 1 user2-126@plc2.org keys: [2126] sites: [] +2132 1 user2-127@plc2.org keys: [2127] sites: [] +2133 1 user2-128@plc2.org keys: [2128] sites: [] +2134 1 user2-129@plc2.org keys: [2129] sites: [] +2135 1 user2-130@plc2.org keys: [2130] sites: [] +2136 1 user2-131@plc2.org keys: [2131] sites: [] +2137 1 user2-132@plc2.org keys: [2132] sites: [] +2138 1 user2-133@plc2.org keys: [2133] sites: [] +2139 1 user2-134@plc2.org keys: [2134] sites: [] +2140 1 user2-135@plc2.org keys: [2135] sites: [] +2141 1 user2-136@plc2.org keys: [2136] sites: [] +2142 1 user2-137@plc2.org keys: [2137] sites: [] +2143 1 user2-138@plc2.org keys: [2138] sites: [] +2144 1 user2-139@plc2.org keys: [2139] sites: [] +2145 1 user2-140@plc2.org keys: [2140] sites: [] +2146 1 user2-141@plc2.org keys: [2141] sites: [] +2147 1 user2-142@plc2.org keys: [2142] sites: [] +2148 1 user2-143@plc2.org keys: [2143] sites: [] +2149 1 user2-144@plc2.org keys: [2144] sites: [] +2150 1 user2-145@plc2.org keys: [2145] sites: [] +2151 1 user2-146@plc2.org keys: [2146] sites: [] +2152 1 user2-147@plc2.org keys: [2147] sites: [] +2153 1 user2-148@plc2.org keys: [2148] sites: [] +2154 1 user2-149@plc2.org keys: [2149] sites: [] +2155 1 user2-150@plc2.org keys: [2150] sites: [] +2156 1 user2-151@plc2.org keys: [2151] sites: [] +2157 1 user2-152@plc2.org keys: [2152] sites: [] +2158 1 user2-153@plc2.org keys: [2153] sites: [] +2159 1 user2-154@plc2.org keys: [2154] sites: [] +2160 1 user2-155@plc2.org keys: [2155] sites: [] +2161 1 user2-156@plc2.org keys: [2156] sites: [] +2162 1 user2-157@plc2.org keys: [2157] sites: [] +2163 1 user2-158@plc2.org keys: [2158] sites: [] +2164 1 user2-159@plc2.org keys: [2159] sites: [] +2165 1 user2-160@plc2.org keys: [2160] sites: [] +2166 1 user2-161@plc2.org keys: [2161] sites: [] +2167 1 user2-162@plc2.org keys: [2162] sites: [] +2168 1 user2-163@plc2.org keys: [2163] sites: [] +2169 1 user2-164@plc2.org keys: [2164] sites: [] +2170 1 user2-165@plc2.org keys: [2165] sites: [] +2171 1 user2-166@plc2.org keys: [2166] sites: [] +2172 1 user2-167@plc2.org keys: [2167] sites: [] +2173 1 user2-168@plc2.org keys: [2168] sites: [] +2174 1 user2-169@plc2.org keys: [2169] sites: [] +2175 1 user2-170@plc2.org keys: [2170] sites: [] +2176 1 user2-171@plc2.org keys: [2171] sites: [] +2177 1 user2-172@plc2.org keys: [2172] sites: [] +2178 1 user2-173@plc2.org keys: [2173] sites: [] +2179 1 user2-174@plc2.org keys: [2174] sites: [] +2180 1 user2-175@plc2.org keys: [2175] sites: [] +2181 1 user2-176@plc2.org keys: [2176] sites: [] +2182 1 user2-177@plc2.org keys: [2177] sites: [] +2183 1 user2-178@plc2.org keys: [2178] sites: [] +2184 1 user2-179@plc2.org keys: [2179] sites: [] +2185 1 user2-180@plc2.org keys: [2180] sites: [] +2186 1 user2-181@plc2.org keys: [2181] sites: [] +2187 1 user2-182@plc2.org keys: [2182] sites: [] +2188 1 user2-183@plc2.org keys: [2183] sites: [] +2189 1 user2-184@plc2.org keys: [2184] sites: [] +2190 1 user2-185@plc2.org keys: [2185] sites: [] +2191 1 user2-186@plc2.org keys: [2186] sites: [] +2192 1 user2-187@plc2.org keys: [2187] sites: [] +2193 1 user2-188@plc2.org keys: [2188] sites: [] +2194 1 user2-189@plc2.org keys: [2189] sites: [] +2195 1 user2-190@plc2.org keys: [2190] sites: [] +2196 1 user2-191@plc2.org keys: [2191] sites: [] +2197 1 user2-192@plc2.org keys: [2192] sites: [] +2198 1 user2-193@plc2.org keys: [2193] sites: [] +2199 1 user2-194@plc2.org keys: [2194] sites: [] +2200 1 user2-195@plc2.org keys: [2195] sites: [] +2201 1 user2-196@plc2.org keys: [2196] sites: [] +2202 1 user2-197@plc2.org keys: [2197] sites: [] +2203 1 user2-198@plc2.org keys: [2198] sites: [] +2204 1 user2-199@plc2.org keys: [2199] sites: [] +2205 1 user2-200@plc2.org keys: [2200] sites: [] +2206 1 user2-201@plc2.org keys: [2201] sites: [] +2207 1 user2-202@plc2.org keys: [2202] sites: [] +2208 1 user2-203@plc2.org keys: [2203] sites: [] +2209 1 user2-204@plc2.org keys: [2204] sites: [] +2210 1 user2-205@plc2.org keys: [2205] sites: [] +2211 1 user2-206@plc2.org keys: [2206] sites: [] +2212 1 user2-207@plc2.org keys: [2207] sites: [] +2213 1 user2-208@plc2.org keys: [2208] sites: [] +2214 1 user2-209@plc2.org keys: [2209] sites: [] +2215 1 user2-210@plc2.org keys: [2210] sites: [] +2216 1 user2-211@plc2.org keys: [2211] sites: [] +2217 1 user2-212@plc2.org keys: [2212] sites: [] +2218 1 user2-213@plc2.org keys: [2213] sites: [] +2219 1 user2-214@plc2.org keys: [2214] sites: [] +2220 1 user2-215@plc2.org keys: [2215] sites: [] +2221 1 user2-216@plc2.org keys: [2216] sites: [] +2222 1 user2-217@plc2.org keys: [2217] sites: [] +2223 1 user2-218@plc2.org keys: [2218] sites: [] +2224 1 user2-219@plc2.org keys: [2219] sites: [] +2225 1 user2-220@plc2.org keys: [2220] sites: [] +2226 1 user2-221@plc2.org keys: [2221] sites: [] +2227 1 user2-222@plc2.org keys: [2222] sites: [] +2228 1 user2-223@plc2.org keys: [2223] sites: [] +2229 1 user2-224@plc2.org keys: [2224] sites: [] +2230 1 user2-225@plc2.org keys: [2225] sites: [] +2231 1 user2-226@plc2.org keys: [2226] sites: [] +2232 1 user2-227@plc2.org keys: [2227] sites: [] +2233 1 user2-228@plc2.org keys: [2228] sites: [] +2234 1 user2-229@plc2.org keys: [2229] sites: [] +2235 1 user2-230@plc2.org keys: [2230] sites: [] +2236 1 user2-231@plc2.org keys: [2231] sites: [] +2237 1 user2-232@plc2.org keys: [2232] sites: [] +2238 1 user2-233@plc2.org keys: [2233] sites: [] +2239 1 user2-234@plc2.org keys: [2234] sites: [] +2240 1 user2-235@plc2.org keys: [2235] sites: [] +2241 1 user2-236@plc2.org keys: [2236] sites: [] +2242 1 user2-237@plc2.org keys: [2237] sites: [] +2243 1 user2-238@plc2.org keys: [2238] sites: [] +2244 1 user2-239@plc2.org keys: [2239] sites: [] +2245 1 user2-240@plc2.org keys: [2240] sites: [] +2246 1 user2-241@plc2.org keys: [2241] sites: [] +2247 1 user2-242@plc2.org keys: [2242] sites: [] +2248 1 user2-243@plc2.org keys: [2243] sites: [] +2249 1 user2-244@plc2.org keys: [2244] sites: [] +2250 1 user2-245@plc2.org keys: [2245] sites: [] +2251 1 user2-246@plc2.org keys: [2246] sites: [] +2252 1 user2-247@plc2.org keys: [2247] sites: [] +2253 1 user2-248@plc2.org keys: [2248] sites: [] +2254 1 user2-249@plc2.org keys: [2249] sites: [] +2255 1 user2-250@plc2.org keys: [2250] sites: [] +2256 1 user2-251@plc2.org keys: [2251] sites: [] +2257 1 user2-252@plc2.org keys: [2252] sites: [] +2258 1 user2-253@plc2.org keys: [2253] sites: [] +2259 1 user2-254@plc2.org keys: [2254] sites: [] +2260 1 user2-255@plc2.org keys: [2255] sites: [] +2261 1 user2-256@plc2.org keys: [2256] sites: [] +2262 1 user2-257@plc2.org keys: [2257] sites: [] +2263 1 user2-258@plc2.org keys: [2258] sites: [] +2264 1 user2-259@plc2.org keys: [2259] sites: [] +2265 1 user2-260@plc2.org keys: [2260] sites: [] +2266 1 user2-261@plc2.org keys: [2261] sites: [] +2267 1 user2-262@plc2.org keys: [2262] sites: [] +2268 1 user2-263@plc2.org keys: [2263] sites: [] +2269 1 user2-264@plc2.org keys: [2264] sites: [] +2270 1 user2-265@plc2.org keys: [2265] sites: [] +2271 1 user2-266@plc2.org keys: [2266] sites: [] +2272 1 user2-267@plc2.org keys: [2267] sites: [] +2273 1 user2-268@plc2.org keys: [2268] sites: [] +2274 1 user2-269@plc2.org keys: [2269] sites: [] +2275 1 user2-270@plc2.org keys: [2270] sites: [] +2276 1 user2-271@plc2.org keys: [2271] sites: [] +2277 1 user2-272@plc2.org keys: [2272] sites: [] +2278 1 user2-273@plc2.org keys: [2273] sites: [] +2279 1 user2-274@plc2.org keys: [2274] sites: [] +2280 1 user2-275@plc2.org keys: [2275] sites: [] +2281 1 user2-276@plc2.org keys: [2276] sites: [] +2282 1 user2-277@plc2.org keys: [2277] sites: [] +2283 1 user2-278@plc2.org keys: [2278] sites: [] +2284 1 user2-279@plc2.org keys: [2279] sites: [] +2285 1 user2-280@plc2.org keys: [2280] sites: [] +2286 1 user2-281@plc2.org keys: [2281] sites: [] +2287 1 user2-282@plc2.org keys: [2282] sites: [] +2288 1 user2-283@plc2.org keys: [2283] sites: [] +2289 1 user2-284@plc2.org keys: [2284] sites: [] +2290 1 user2-285@plc2.org keys: [2285] sites: [] +2291 1 user2-286@plc2.org keys: [2286] sites: [] +2292 1 user2-287@plc2.org keys: [2287] sites: [] +2293 1 user2-288@plc2.org keys: [2288] sites: [] +2294 1 user2-289@plc2.org keys: [2289] sites: [] +2295 1 user2-290@plc2.org keys: [2290] sites: [] +2296 1 user2-291@plc2.org keys: [2291] sites: [] +2297 1 user2-292@plc2.org keys: [2292] sites: [] +2298 1 user2-293@plc2.org keys: [2293] sites: [] +2299 1 user2-294@plc2.org keys: [2294] sites: [] +2300 1 user2-295@plc2.org keys: [2295] sites: [] +2301 1 user2-296@plc2.org keys: [2296] sites: [] +2302 1 user2-297@plc2.org keys: [2297] sites: [] +2303 1 user2-298@plc2.org keys: [2298] sites: [] +2304 1 user2-299@plc2.org keys: [2299] sites: [] +2305 1 user2-300@plc2.org keys: [2300] sites: [] +2306 1 user2-301@plc2.org keys: [2301] sites: [] +2307 1 user2-302@plc2.org keys: [2302] sites: [] +2308 1 user2-303@plc2.org keys: [2303] sites: [] +2309 1 user2-304@plc2.org keys: [2304] sites: [] +2310 1 user2-305@plc2.org keys: [2305] sites: [] +2311 1 user2-306@plc2.org keys: [2306] sites: [] +2312 1 user2-307@plc2.org keys: [2307] sites: [] +2313 1 user2-308@plc2.org keys: [2308] sites: [] +2314 1 user2-309@plc2.org keys: [2309] sites: [] +2315 1 user2-310@plc2.org keys: [2310] sites: [] +2316 1 user2-311@plc2.org keys: [2311] sites: [] +2317 1 user2-312@plc2.org keys: [2312] sites: [] +2318 1 user2-313@plc2.org keys: [2313] sites: [] +2319 1 user2-314@plc2.org keys: [2314] sites: [] +2320 1 user2-315@plc2.org keys: [2315] sites: [] +2321 1 user2-316@plc2.org keys: [2316] sites: [] +2322 1 user2-317@plc2.org keys: [2317] sites: [] +2323 1 user2-318@plc2.org keys: [2318] sites: [] +2324 1 user2-319@plc2.org keys: [2319] sites: [] +2325 1 user2-320@plc2.org keys: [2320] sites: [] +2326 1 user2-321@plc2.org keys: [2321] sites: [] +2327 1 user2-322@plc2.org keys: [2322] sites: [] +2328 1 user2-323@plc2.org keys: [2323] sites: [] +2329 1 user2-324@plc2.org keys: [2324] sites: [] +2330 1 user2-325@plc2.org keys: [2325] sites: [] +2331 1 user2-326@plc2.org keys: [2326] sites: [] +2332 1 user2-327@plc2.org keys: [2327] sites: [] +2333 1 user2-328@plc2.org keys: [2328] sites: [] +2334 1 user2-329@plc2.org keys: [2329] sites: [] +2335 1 user2-330@plc2.org keys: [2330] sites: [] +2336 1 user2-331@plc2.org keys: [2331] sites: [] +2337 1 user2-332@plc2.org keys: [2332] sites: [] +2338 1 user2-333@plc2.org keys: [2333] sites: [] +2339 1 user2-334@plc2.org keys: [2334] sites: [] +2340 1 user2-335@plc2.org keys: [2335] sites: [] +2341 1 user2-336@plc2.org keys: [2336] sites: [] +2342 1 user2-337@plc2.org keys: [2337] sites: [] +2343 1 user2-338@plc2.org keys: [2338] sites: [] +2344 1 user2-339@plc2.org keys: [2339] sites: [] +2345 1 user2-340@plc2.org keys: [2340] sites: [] +2346 1 user2-341@plc2.org keys: [2341] sites: [] +2347 1 user2-342@plc2.org keys: [2342] sites: [] +2348 1 user2-343@plc2.org keys: [2343] sites: [] +2349 1 user2-344@plc2.org keys: [2344] sites: [] +2350 1 user2-345@plc2.org keys: [2345] sites: [] +2351 1 user2-346@plc2.org keys: [2346] sites: [] +2352 1 user2-347@plc2.org keys: [2347] sites: [] +2353 1 user2-348@plc2.org keys: [2348] sites: [] +2354 1 user2-349@plc2.org keys: [2349] sites: [] +2355 1 user2-350@plc2.org keys: [2350] sites: [] +2356 1 user2-351@plc2.org keys: [2351] sites: [] +2357 1 user2-352@plc2.org keys: [2352] sites: [] +2358 1 user2-353@plc2.org keys: [2353] sites: [] +2359 1 user2-354@plc2.org keys: [2354] sites: [] +2360 1 user2-355@plc2.org keys: [2355] sites: [] +2361 1 user2-356@plc2.org keys: [2356] sites: [] +2362 1 user2-357@plc2.org keys: [2357] sites: [] +2363 1 user2-358@plc2.org keys: [2358] sites: [] +2364 1 user2-359@plc2.org keys: [2359] sites: [] +2365 1 user2-360@plc2.org keys: [2360] sites: [] +2366 1 user2-361@plc2.org keys: [2361] sites: [] +2367 1 user2-362@plc2.org keys: [2362] sites: [] +2368 1 user2-363@plc2.org keys: [2363] sites: [] +2369 1 user2-364@plc2.org keys: [2364] sites: [] +2370 1 user2-365@plc2.org keys: [2365] sites: [] +2371 1 user2-366@plc2.org keys: [2366] sites: [] +2372 1 user2-367@plc2.org keys: [2367] sites: [] +2373 1 user2-368@plc2.org keys: [2368] sites: [] +2374 1 user2-369@plc2.org keys: [2369] sites: [] +2375 1 user2-370@plc2.org keys: [2370] sites: [] +2376 1 user2-371@plc2.org keys: [2371] sites: [] +2377 1 user2-372@plc2.org keys: [2372] sites: [] +2378 1 user2-373@plc2.org keys: [2373] sites: [] +2379 1 user2-374@plc2.org keys: [2374] sites: [] +2380 1 user2-375@plc2.org keys: [2375] sites: [] +2381 1 user2-376@plc2.org keys: [2376] sites: [] +2382 1 user2-377@plc2.org keys: [2377] sites: [] +2383 1 user2-378@plc2.org keys: [2378] sites: [] +2384 1 user2-379@plc2.org keys: [2379] sites: [] +2385 1 user2-380@plc2.org keys: [2380] sites: [] +2386 1 user2-381@plc2.org keys: [2381] sites: [] +2387 1 user2-382@plc2.org keys: [2382] sites: [] +2388 1 user2-383@plc2.org keys: [2383] sites: [] +2389 1 user2-384@plc2.org keys: [2384] sites: [] +2390 1 user2-385@plc2.org keys: [2385] sites: [] +2391 1 user2-386@plc2.org keys: [2386] sites: [] +2392 1 user2-387@plc2.org keys: [2387] sites: [] +2393 1 user2-388@plc2.org keys: [2388] sites: [] +2394 1 user2-389@plc2.org keys: [2389] sites: [] +2395 1 user2-390@plc2.org keys: [2390] sites: [] +2396 1 user2-391@plc2.org keys: [2391] sites: [] +2397 1 user2-392@plc2.org keys: [2392] sites: [] +2398 1 user2-393@plc2.org keys: [2393] sites: [] +2399 1 user2-394@plc2.org keys: [2394] sites: [] +2400 1 user2-395@plc2.org keys: [2395] sites: [] +2401 1 user2-396@plc2.org keys: [2396] sites: [] +2402 1 user2-397@plc2.org keys: [2397] sites: [] +2403 1 user2-398@plc2.org keys: [2398] sites: [] +2404 1 user2-399@plc2.org keys: [2399] sites: [] +2405 1 user2-400@plc2.org keys: [2400] sites: [] +2406 1 user2-401@plc2.org keys: [2401] sites: [] +2407 1 user2-402@plc2.org keys: [2402] sites: [] +2408 1 user2-403@plc2.org keys: [2403] sites: [] +2409 1 user2-404@plc2.org keys: [2404] sites: [] +2410 1 user2-405@plc2.org keys: [2405] sites: [] +2411 1 user2-406@plc2.org keys: [2406] sites: [] +2412 1 user2-407@plc2.org keys: [2407] sites: [] +2413 1 user2-408@plc2.org keys: [2408] sites: [] +2414 1 user2-409@plc2.org keys: [2409] sites: [] +2415 1 user2-410@plc2.org keys: [2410] sites: [] +2416 1 user2-411@plc2.org keys: [2411] sites: [] +2417 1 user2-412@plc2.org keys: [2412] sites: [] +2418 1 user2-413@plc2.org keys: [2413] sites: [] +2419 1 user2-414@plc2.org keys: [2414] sites: [] +2420 1 user2-415@plc2.org keys: [2415] sites: [] +2421 1 user2-416@plc2.org keys: [2416] sites: [] +2422 1 user2-417@plc2.org keys: [2417] sites: [] +2423 1 user2-418@plc2.org keys: [2418] sites: [] +2424 1 user2-419@plc2.org keys: [2419] sites: [] +2425 1 user2-420@plc2.org keys: [2420] sites: [] +2426 1 user2-421@plc2.org keys: [2421] sites: [] +2427 1 user2-422@plc2.org keys: [2422] sites: [] +2428 1 user2-423@plc2.org keys: [2423] sites: [] +2429 1 user2-424@plc2.org keys: [2424] sites: [] +2430 1 user2-425@plc2.org keys: [2425] sites: [] +2431 1 user2-426@plc2.org keys: [2426] sites: [] +2432 1 user2-427@plc2.org keys: [2427] sites: [] +2433 1 user2-428@plc2.org keys: [2428] sites: [] +2434 1 user2-429@plc2.org keys: [2429] sites: [] +2435 1 user2-430@plc2.org keys: [2430] sites: [] +2436 1 user2-431@plc2.org keys: [2431] sites: [] +2437 1 user2-432@plc2.org keys: [2432] sites: [] +2438 1 user2-433@plc2.org keys: [2433] sites: [] +2439 1 user2-434@plc2.org keys: [2434] sites: [] +2440 1 user2-435@plc2.org keys: [2435] sites: [] +2441 1 user2-436@plc2.org keys: [2436] sites: [] +2442 1 user2-437@plc2.org keys: [2437] sites: [] +2443 1 user2-438@plc2.org keys: [2438] sites: [] +2444 1 user2-439@plc2.org keys: [2439] sites: [] +2445 1 user2-440@plc2.org keys: [2440] sites: [] +2446 1 user2-441@plc2.org keys: [2441] sites: [] +2447 1 user2-442@plc2.org keys: [2442] sites: [] +2448 1 user2-443@plc2.org keys: [2443] sites: [] +2449 1 user2-444@plc2.org keys: [2444] sites: [] +2450 1 user2-445@plc2.org keys: [2445] sites: [] +2451 1 user2-446@plc2.org keys: [2446] sites: [] +2452 1 user2-447@plc2.org keys: [2447] sites: [] +2453 1 user2-448@plc2.org keys: [2448] sites: [] +2454 1 user2-449@plc2.org keys: [2449] sites: [] +2455 1 user2-450@plc2.org keys: [2450] sites: [] +2456 1 user2-451@plc2.org keys: [2451] sites: [] +2457 1 user2-452@plc2.org keys: [2452] sites: [] +2458 1 user2-453@plc2.org keys: [2453] sites: [] +2459 1 user2-454@plc2.org keys: [2454] sites: [] +2460 1 user2-455@plc2.org keys: [2455] sites: [] +2461 1 user2-456@plc2.org keys: [2456] sites: [] +2462 1 user2-457@plc2.org keys: [2457] sites: [] +2463 1 user2-458@plc2.org keys: [2458] sites: [] +2464 1 user2-459@plc2.org keys: [2459] sites: [] +2465 1 user2-460@plc2.org keys: [2460] sites: [] +2466 1 user2-461@plc2.org keys: [2461] sites: [] +2467 1 user2-462@plc2.org keys: [2462] sites: [] +2468 1 user2-463@plc2.org keys: [2463] sites: [] +2469 1 user2-464@plc2.org keys: [2464] sites: [] +2470 1 user2-465@plc2.org keys: [2465] sites: [] +2471 1 user2-466@plc2.org keys: [2466] sites: [] +2472 1 user2-467@plc2.org keys: [2467] sites: [] +2473 1 user2-468@plc2.org keys: [2468] sites: [] +2474 1 user2-469@plc2.org keys: [2469] sites: [] +2475 1 user2-470@plc2.org keys: [2470] sites: [] +2476 1 user2-471@plc2.org keys: [2471] sites: [] +2477 1 user2-472@plc2.org keys: [2472] sites: [] +2478 1 user2-473@plc2.org keys: [2473] sites: [] +2479 1 user2-474@plc2.org keys: [2474] sites: [] +2480 1 user2-475@plc2.org keys: [2475] sites: [] +2481 1 user2-476@plc2.org keys: [2476] sites: [] +2482 1 user2-477@plc2.org keys: [2477] sites: [] +2483 1 user2-478@plc2.org keys: [2478] sites: [] +2484 1 user2-479@plc2.org keys: [2479] sites: [] +2485 1 user2-480@plc2.org keys: [2480] sites: [] +2486 1 user2-481@plc2.org keys: [2481] sites: [] +2487 1 user2-482@plc2.org keys: [2482] sites: [] +2488 1 user2-483@plc2.org keys: [2483] sites: [] +2489 1 user2-484@plc2.org keys: [2484] sites: [] +2490 1 user2-485@plc2.org keys: [2485] sites: [] +2491 1 user2-486@plc2.org keys: [2486] sites: [] +2492 1 user2-487@plc2.org keys: [2487] sites: [] +2493 1 user2-488@plc2.org keys: [2488] sites: [] +2494 1 user2-489@plc2.org keys: [2489] sites: [] +2495 1 user2-490@plc2.org keys: [2490] sites: [] +2496 1 user2-491@plc2.org keys: [2491] sites: [] +2497 1 user2-492@plc2.org keys: [2492] sites: [] +2498 1 user2-493@plc2.org keys: [2493] sites: [] +2499 1 user2-494@plc2.org keys: [2494] sites: [] +2500 1 user2-495@plc2.org keys: [2495] sites: [] +2501 1 user2-496@plc2.org keys: [2496] sites: [] +2502 1 user2-497@plc2.org keys: [2497] sites: [] +2503 1 user2-498@plc2.org keys: [2498] sites: [] +2504 1 user2-499@plc2.org keys: [2499] sites: [] +2505 1 user2-500@plc2.org keys: [2500] sites: [] +2506 1 user2-501@plc2.org keys: [2501] sites: [] +2507 1 user2-502@plc2.org keys: [2502] sites: [] +2508 1 user2-503@plc2.org keys: [2503] sites: [] +2509 1 user2-504@plc2.org keys: [2504] sites: [] +2510 1 user2-505@plc2.org keys: [2505] sites: [] +2511 1 user2-506@plc2.org keys: [2506] sites: [] +2512 1 user2-507@plc2.org keys: [2507] sites: [] +2513 1 user2-508@plc2.org keys: [2508] sites: [] +2514 1 user2-509@plc2.org keys: [2509] sites: [] +2515 1 user2-510@plc2.org keys: [2510] sites: [] +2516 1 user2-511@plc2.org keys: [2511] sites: [] +2517 1 user2-512@plc2.org keys: [2512] sites: [] +2518 1 user2-513@plc2.org keys: [2513] sites: [] +2519 1 user2-514@plc2.org keys: [2514] sites: [] +2520 1 user2-515@plc2.org keys: [2515] sites: [] +2521 1 user2-516@plc2.org keys: [2516] sites: [] +2522 1 user2-517@plc2.org keys: [2517] sites: [] +2523 1 user2-518@plc2.org keys: [2518] sites: [] +2524 1 user2-519@plc2.org keys: [2519] sites: [] +2525 1 user2-520@plc2.org keys: [2520] sites: [] +2526 1 user2-521@plc2.org keys: [2521] sites: [] +2527 1 user2-522@plc2.org keys: [2522] sites: [] +2528 1 user2-523@plc2.org keys: [2523] sites: [] +2529 1 user2-524@plc2.org keys: [2524] sites: [] +2530 1 user2-525@plc2.org keys: [2525] sites: [] +2531 1 user2-526@plc2.org keys: [2526] sites: [] +2532 1 user2-527@plc2.org keys: [2527] sites: [] +2533 1 user2-528@plc2.org keys: [2528] sites: [] +2534 1 user2-529@plc2.org keys: [2529] sites: [] +2535 1 user2-530@plc2.org keys: [2530] sites: [] +2536 1 user2-531@plc2.org keys: [2531] sites: [] +2537 1 user2-532@plc2.org keys: [2532] sites: [] +2538 1 user2-533@plc2.org keys: [2533] sites: [] +2539 1 user2-534@plc2.org keys: [2534] sites: [] +2540 1 user2-535@plc2.org keys: [2535] sites: [] +2541 1 user2-536@plc2.org keys: [2536] sites: [] +2542 1 user2-537@plc2.org keys: [2537] sites: [] +2543 1 user2-538@plc2.org keys: [2538] sites: [] +2544 1 user2-539@plc2.org keys: [2539] sites: [] +2545 1 user2-540@plc2.org keys: [2540] sites: [] +2546 1 user2-541@plc2.org keys: [2541] sites: [] +2547 1 user2-542@plc2.org keys: [2542] sites: [] +2548 1 user2-543@plc2.org keys: [2543] sites: [] +2549 1 user2-544@plc2.org keys: [2544] sites: [] +2550 1 user2-545@plc2.org keys: [2545] sites: [] +2551 1 user2-546@plc2.org keys: [2546] sites: [] +2552 1 user2-547@plc2.org keys: [2547] sites: [] +2553 1 user2-548@plc2.org keys: [2548] sites: [] +2554 1 user2-549@plc2.org keys: [2549] sites: [] +2555 1 user2-550@plc2.org keys: [2550] sites: [] +2556 1 user2-551@plc2.org keys: [2551] sites: [] +2557 1 user2-552@plc2.org keys: [2552] sites: [] +2558 1 user2-553@plc2.org keys: [2553] sites: [] +2559 1 user2-554@plc2.org keys: [2554] sites: [] +2560 1 user2-555@plc2.org keys: [2555] sites: [] +2561 1 user2-556@plc2.org keys: [2556] sites: [] +2562 1 user2-557@plc2.org keys: [2557] sites: [] +2563 1 user2-558@plc2.org keys: [2558] sites: [] +2564 1 user2-559@plc2.org keys: [2559] sites: [] +2565 1 user2-560@plc2.org keys: [2560] sites: [] +2566 1 user2-561@plc2.org keys: [2561] sites: [] +2567 1 user2-562@plc2.org keys: [2562] sites: [] +2568 1 user2-563@plc2.org keys: [2563] sites: [] +2569 1 user2-564@plc2.org keys: [2564] sites: [] +2570 1 user2-565@plc2.org keys: [2565] sites: [] +2571 1 user2-566@plc2.org keys: [2566] sites: [] +2572 1 user2-567@plc2.org keys: [2567] sites: [] +2573 1 user2-568@plc2.org keys: [2568] sites: [] +2574 1 user2-569@plc2.org keys: [2569] sites: [] +2575 1 user2-570@plc2.org keys: [2570] sites: [] +2576 1 user2-571@plc2.org keys: [2571] sites: [] +2577 1 user2-572@plc2.org keys: [2572] sites: [] +2578 1 user2-573@plc2.org keys: [2573] sites: [] +2579 1 user2-574@plc2.org keys: [2574] sites: [] +2580 1 user2-575@plc2.org keys: [2575] sites: [] +2581 1 user2-576@plc2.org keys: [2576] sites: [] +2582 1 user2-577@plc2.org keys: [2577] sites: [] +2583 1 user2-578@plc2.org keys: [2578] sites: [] +2584 1 user2-579@plc2.org keys: [2579] sites: [] +2585 1 user2-580@plc2.org keys: [2580] sites: [] +2586 1 user2-581@plc2.org keys: [2581] sites: [] +2587 1 user2-582@plc2.org keys: [2582] sites: [] +2588 1 user2-583@plc2.org keys: [2583] sites: [] +2589 1 user2-584@plc2.org keys: [2584] sites: [] +2590 1 user2-585@plc2.org keys: [2585] sites: [] +2591 1 user2-586@plc2.org keys: [2586] sites: [] +2592 1 user2-587@plc2.org keys: [2587] sites: [] +2593 1 user2-588@plc2.org keys: [2588] sites: [] +2594 1 user2-589@plc2.org keys: [2589] sites: [] +2595 1 user2-590@plc2.org keys: [2590] sites: [] +2596 1 user2-591@plc2.org keys: [2591] sites: [] +2597 1 user2-592@plc2.org keys: [2592] sites: [] +2598 1 user2-593@plc2.org keys: [2593] sites: [] +2599 1 user2-594@plc2.org keys: [2594] sites: [] +2600 1 user2-595@plc2.org keys: [2595] sites: [] +2601 1 user2-596@plc2.org keys: [2596] sites: [] +2602 1 user2-597@plc2.org keys: [2597] sites: [] +2603 1 user2-598@plc2.org keys: [2598] sites: [] +2604 1 user2-599@plc2.org keys: [2599] sites: [] +2605 1 user2-600@plc2.org keys: [2600] sites: [] +2606 1 user2-601@plc2.org keys: [2601] sites: [] +2607 1 user2-602@plc2.org keys: [2602] sites: [] +2608 1 user2-603@plc2.org keys: [2603] sites: [] +2609 1 user2-604@plc2.org keys: [2604] sites: [] +2610 1 user2-605@plc2.org keys: [2605] sites: [] +2611 1 user2-606@plc2.org keys: [2606] sites: [] +2612 1 user2-607@plc2.org keys: [2607] sites: [] +2613 1 user2-608@plc2.org keys: [2608] sites: [] +2614 1 user2-609@plc2.org keys: [2609] sites: [] +2615 1 user2-610@plc2.org keys: [2610] sites: [] +2616 1 user2-611@plc2.org keys: [2611] sites: [] +2617 1 user2-612@plc2.org keys: [2612] sites: [] +2618 1 user2-613@plc2.org keys: [2613] sites: [] +2619 1 user2-614@plc2.org keys: [2614] sites: [] +2620 1 user2-615@plc2.org keys: [2615] sites: [] +2621 1 user2-616@plc2.org keys: [2616] sites: [] +2622 1 user2-617@plc2.org keys: [2617] sites: [] +2623 1 user2-618@plc2.org keys: [2618] sites: [] +2624 1 user2-619@plc2.org keys: [2619] sites: [] +2625 1 user2-620@plc2.org keys: [2620] sites: [] +2626 1 user2-621@plc2.org keys: [2621] sites: [] +2627 1 user2-622@plc2.org keys: [2622] sites: [] +2628 1 user2-623@plc2.org keys: [2623] sites: [] +2629 1 user2-624@plc2.org keys: [2624] sites: [] +2630 1 user2-625@plc2.org keys: [2625] sites: [] +2631 1 user2-626@plc2.org keys: [2626] sites: [] +2632 1 user2-627@plc2.org keys: [2627] sites: [] +2633 1 user2-628@plc2.org keys: [2628] sites: [] +2634 1 user2-629@plc2.org keys: [2629] sites: [] +2635 1 user2-630@plc2.org keys: [2630] sites: [] +2636 1 user2-631@plc2.org keys: [2631] sites: [] +2637 1 user2-632@plc2.org keys: [2632] sites: [] +2638 1 user2-633@plc2.org keys: [2633] sites: [] +2639 1 user2-634@plc2.org keys: [2634] sites: [] +2640 1 user2-635@plc2.org keys: [2635] sites: [] +2641 1 user2-636@plc2.org keys: [2636] sites: [] +2642 1 user2-637@plc2.org keys: [2637] sites: [] +2643 1 user2-638@plc2.org keys: [2638] sites: [] +2644 1 user2-639@plc2.org keys: [2639] sites: [] +2645 1 user2-640@plc2.org keys: [2640] sites: [] +2646 1 user2-641@plc2.org keys: [2641] sites: [] +2647 1 user2-642@plc2.org keys: [2642] sites: [] +2648 1 user2-643@plc2.org keys: [2643] sites: [] +2649 1 user2-644@plc2.org keys: [2644] sites: [] +2650 1 user2-645@plc2.org keys: [2645] sites: [] +2651 1 user2-646@plc2.org keys: [2646] sites: [] +2652 1 user2-647@plc2.org keys: [2647] sites: [] +2653 1 user2-648@plc2.org keys: [2648] sites: [] +2654 1 user2-649@plc2.org keys: [2649] sites: [] +2655 1 user2-650@plc2.org keys: [2650] sites: [] +2656 1 user2-651@plc2.org keys: [2651] sites: [] +2657 1 user2-652@plc2.org keys: [2652] sites: [] +2658 1 user2-653@plc2.org keys: [2653] sites: [] +2659 1 user2-654@plc2.org keys: [2654] sites: [] +2660 1 user2-655@plc2.org keys: [2655] sites: [] +2661 1 user2-656@plc2.org keys: [2656] sites: [] +2662 1 user2-657@plc2.org keys: [2657] sites: [] +2663 1 user2-658@plc2.org keys: [2658] sites: [] +2664 1 user2-659@plc2.org keys: [2659] sites: [] +2665 1 user2-660@plc2.org keys: [2660] sites: [] +2666 1 user2-661@plc2.org keys: [2661] sites: [] +2667 1 user2-662@plc2.org keys: [2662] sites: [] +2668 1 user2-663@plc2.org keys: [2663] sites: [] +2669 1 user2-664@plc2.org keys: [2664] sites: [] +2670 1 user2-665@plc2.org keys: [2665] sites: [] +2671 1 user2-666@plc2.org keys: [2666] sites: [] +2672 1 user2-667@plc2.org keys: [2667] sites: [] +2673 1 user2-668@plc2.org keys: [2668] sites: [] +2674 1 user2-669@plc2.org keys: [2669] sites: [] +2675 1 user2-670@plc2.org keys: [2670] sites: [] +2676 1 user2-671@plc2.org keys: [2671] sites: [] +2677 1 user2-672@plc2.org keys: [2672] sites: [] +2678 1 user2-673@plc2.org keys: [2673] sites: [] +2679 1 user2-674@plc2.org keys: [2674] sites: [] +2680 1 user2-675@plc2.org keys: [2675] sites: [] +2681 1 user2-676@plc2.org keys: [2676] sites: [] +2682 1 user2-677@plc2.org keys: [2677] sites: [] +2683 1 user2-678@plc2.org keys: [2678] sites: [] +2684 1 user2-679@plc2.org keys: [2679] sites: [] +2685 1 user2-680@plc2.org keys: [2680] sites: [] +2686 1 user2-681@plc2.org keys: [2681] sites: [] +2687 1 user2-682@plc2.org keys: [2682] sites: [] +2688 1 user2-683@plc2.org keys: [2683] sites: [] +2689 1 user2-684@plc2.org keys: [2684] sites: [] +2690 1 user2-685@plc2.org keys: [2685] sites: [] +2691 1 user2-686@plc2.org keys: [2686] sites: [] +2692 1 user2-687@plc2.org keys: [2687] sites: [] +2693 1 user2-688@plc2.org keys: [2688] sites: [] +2694 1 user2-689@plc2.org keys: [2689] sites: [] +2695 1 user2-690@plc2.org keys: [2690] sites: [] +2696 1 user2-691@plc2.org keys: [2691] sites: [] +2697 1 user2-692@plc2.org keys: [2692] sites: [] +2698 1 user2-693@plc2.org keys: [2693] sites: [] +2699 1 user2-694@plc2.org keys: [2694] sites: [] +2700 1 user2-695@plc2.org keys: [2695] sites: [] +2701 1 user2-696@plc2.org keys: [2696] sites: [] +2702 1 user2-697@plc2.org keys: [2697] sites: [] +2703 1 user2-698@plc2.org keys: [2698] sites: [] +2704 1 user2-699@plc2.org keys: [2699] sites: [] +2705 1 user2-700@plc2.org keys: [2700] sites: [] +2706 1 user2-701@plc2.org keys: [2701] sites: [] +2707 1 user2-702@plc2.org keys: [2702] sites: [] +2708 1 user2-703@plc2.org keys: [2703] sites: [] +2709 1 user2-704@plc2.org keys: [2704] sites: [] +2710 1 user2-705@plc2.org keys: [2705] sites: [] +2711 1 user2-706@plc2.org keys: [2706] sites: [] +2712 1 user2-707@plc2.org keys: [2707] sites: [] +2713 1 user2-708@plc2.org keys: [2708] sites: [] +2714 1 user2-709@plc2.org keys: [2709] sites: [] +2715 1 user2-710@plc2.org keys: [2710] sites: [] +2716 1 user2-711@plc2.org keys: [2711] sites: [] +2717 1 user2-712@plc2.org keys: [2712] sites: [] +2718 1 user2-713@plc2.org keys: [2713] sites: [] +2719 1 user2-714@plc2.org keys: [2714] sites: [] +2720 1 user2-715@plc2.org keys: [2715] sites: [] +2721 1 user2-716@plc2.org keys: [2716] sites: [] +2722 1 user2-717@plc2.org keys: [2717] sites: [] +2723 1 user2-718@plc2.org keys: [2718] sites: [] +2724 1 user2-719@plc2.org keys: [2719] sites: [] +2725 1 user2-720@plc2.org keys: [2720] sites: [] +2726 1 user2-721@plc2.org keys: [2721] sites: [] +2727 1 user2-722@plc2.org keys: [2722] sites: [] +2728 1 user2-723@plc2.org keys: [2723] sites: [] +2729 1 user2-724@plc2.org keys: [2724] sites: [] +2730 1 user2-725@plc2.org keys: [2725] sites: [] +2731 1 user2-726@plc2.org keys: [2726] sites: [] +2732 1 user2-727@plc2.org keys: [2727] sites: [] +2733 1 user2-728@plc2.org keys: [2728] sites: [] +2734 1 user2-729@plc2.org keys: [2729] sites: [] +2735 1 user2-730@plc2.org keys: [2730] sites: [] +2736 1 user2-731@plc2.org keys: [2731] sites: [] +2737 1 user2-732@plc2.org keys: [2732] sites: [] +2738 1 user2-733@plc2.org keys: [2733] sites: [] +2739 1 user2-734@plc2.org keys: [2734] sites: [] +2740 1 user2-735@plc2.org keys: [2735] sites: [] +2741 1 user2-736@plc2.org keys: [2736] sites: [] +2742 1 user2-737@plc2.org keys: [2737] sites: [] +2743 1 user2-738@plc2.org keys: [2738] sites: [] +2744 1 user2-739@plc2.org keys: [2739] sites: [] +2745 1 user2-740@plc2.org keys: [2740] sites: [] +2746 1 user2-741@plc2.org keys: [2741] sites: [] +2747 1 user2-742@plc2.org keys: [2742] sites: [] +2748 1 user2-743@plc2.org keys: [2743] sites: [] +2749 1 user2-744@plc2.org keys: [2744] sites: [] +2750 1 user2-745@plc2.org keys: [2745] sites: [] +2751 1 user2-746@plc2.org keys: [2746] sites: [] +2752 1 user2-747@plc2.org keys: [2747] sites: [] +2753 1 user2-748@plc2.org keys: [2748] sites: [] +2754 1 user2-749@plc2.org keys: [2749] sites: [] +2755 1 user2-750@plc2.org keys: [2750] sites: [] +2756 1 user2-751@plc2.org keys: [2751] sites: [] +2757 1 user2-752@plc2.org keys: [2752] sites: [] +2758 1 user2-753@plc2.org keys: [2753] sites: [] +2759 1 user2-754@plc2.org keys: [2754] sites: [] +2760 1 user2-755@plc2.org keys: [2755] sites: [] +2761 1 user2-756@plc2.org keys: [2756] sites: [] +2762 1 user2-757@plc2.org keys: [2757] sites: [] +2763 1 user2-758@plc2.org keys: [2758] sites: [] +2764 1 user2-759@plc2.org keys: [2759] sites: [] +2765 1 user2-760@plc2.org keys: [2760] sites: [] +2766 1 user2-761@plc2.org keys: [2761] sites: [] +2767 1 user2-762@plc2.org keys: [2762] sites: [] +2768 1 user2-763@plc2.org keys: [2763] sites: [] +2769 1 user2-764@plc2.org keys: [2764] sites: [] +2770 1 user2-765@plc2.org keys: [2765] sites: [] +2771 1 user2-766@plc2.org keys: [2766] sites: [] +2772 1 user2-767@plc2.org keys: [2767] sites: [] +2773 1 user2-768@plc2.org keys: [2768] sites: [] +2774 1 user2-769@plc2.org keys: [2769] sites: [] +2775 1 user2-770@plc2.org keys: [2770] sites: [] +2776 1 user2-771@plc2.org keys: [2771] sites: [] +2777 1 user2-772@plc2.org keys: [2772] sites: [] +2778 1 user2-773@plc2.org keys: [2773] sites: [] +2779 1 user2-774@plc2.org keys: [2774] sites: [] +2780 1 user2-775@plc2.org keys: [2775] sites: [] +2781 1 user2-776@plc2.org keys: [2776] sites: [] +2782 1 user2-777@plc2.org keys: [2777] sites: [] +2783 1 user2-778@plc2.org keys: [2778] sites: [] +2784 1 user2-779@plc2.org keys: [2779] sites: [] +2785 1 user2-780@plc2.org keys: [2780] sites: [] +2786 1 user2-781@plc2.org keys: [2781] sites: [] +2787 1 user2-782@plc2.org keys: [2782] sites: [] +2788 1 user2-783@plc2.org keys: [2783] sites: [] +2789 1 user2-784@plc2.org keys: [2784] sites: [] +2790 1 user2-785@plc2.org keys: [2785] sites: [] +2791 1 user2-786@plc2.org keys: [2786] sites: [] +2792 1 user2-787@plc2.org keys: [2787] sites: [] +2793 1 user2-788@plc2.org keys: [2788] sites: [] +2794 1 user2-789@plc2.org keys: [2789] sites: [] +2795 1 user2-790@plc2.org keys: [2790] sites: [] +2796 1 user2-791@plc2.org keys: [2791] sites: [] +2797 1 user2-792@plc2.org keys: [2792] sites: [] +2798 1 user2-793@plc2.org keys: [2793] sites: [] +2799 1 user2-794@plc2.org keys: [2794] sites: [] +2800 1 user2-795@plc2.org keys: [2795] sites: [] +2801 1 user2-796@plc2.org keys: [2796] sites: [] +2802 1 user2-797@plc2.org keys: [2797] sites: [] +2803 1 user2-798@plc2.org keys: [2798] sites: [] +2804 1 user2-799@plc2.org keys: [2799] sites: [] +2805 1 user2-800@plc2.org keys: [2800] sites: [] +2806 1 user2-801@plc2.org keys: [2801] sites: [] +2807 1 user2-802@plc2.org keys: [2802] sites: [] +2808 1 user2-803@plc2.org keys: [2803] sites: [] +2809 1 user2-804@plc2.org keys: [2804] sites: [] +2810 1 user2-805@plc2.org keys: [2805] sites: [] +2811 1 user2-806@plc2.org keys: [2806] sites: [] +2812 1 user2-807@plc2.org keys: [2807] sites: [] +2813 1 user2-808@plc2.org keys: [2808] sites: [] +2814 1 user2-809@plc2.org keys: [2809] sites: [] +2815 1 user2-810@plc2.org keys: [2810] sites: [] +2816 1 user2-811@plc2.org keys: [2811] sites: [] +2817 1 user2-812@plc2.org keys: [2812] sites: [] +2818 1 user2-813@plc2.org keys: [2813] sites: [] +2819 1 user2-814@plc2.org keys: [2814] sites: [] +2820 1 user2-815@plc2.org keys: [2815] sites: [] +2821 1 user2-816@plc2.org keys: [2816] sites: [] +2822 1 user2-817@plc2.org keys: [2817] sites: [] +2823 1 user2-818@plc2.org keys: [2818] sites: [] +2824 1 user2-819@plc2.org keys: [2819] sites: [] +2825 1 user2-820@plc2.org keys: [2820] sites: [] +2826 1 user2-821@plc2.org keys: [2821] sites: [] +2827 1 user2-822@plc2.org keys: [2822] sites: [] +2828 1 user2-823@plc2.org keys: [2823] sites: [] +2829 1 user2-824@plc2.org keys: [2824] sites: [] +2830 1 user2-825@plc2.org keys: [2825] sites: [] +2831 1 user2-826@plc2.org keys: [2826] sites: [] +2832 1 user2-827@plc2.org keys: [2827] sites: [] +2833 1 user2-828@plc2.org keys: [2828] sites: [] +2834 1 user2-829@plc2.org keys: [2829] sites: [] +2835 1 user2-830@plc2.org keys: [2830] sites: [] +2836 1 user2-831@plc2.org keys: [2831] sites: [] +2837 1 user2-832@plc2.org keys: [2832] sites: [] +2838 1 user2-833@plc2.org keys: [2833] sites: [] +2839 1 user2-834@plc2.org keys: [2834] sites: [] +2840 1 user2-835@plc2.org keys: [2835] sites: [] +2841 1 user2-836@plc2.org keys: [2836] sites: [] +2842 1 user2-837@plc2.org keys: [2837] sites: [] +2843 1 user2-838@plc2.org keys: [2838] sites: [] +2844 1 user2-839@plc2.org keys: [2839] sites: [] +2845 1 user2-840@plc2.org keys: [2840] sites: [] +2846 1 user2-841@plc2.org keys: [2841] sites: [] +2847 1 user2-842@plc2.org keys: [2842] sites: [] +2848 1 user2-843@plc2.org keys: [2843] sites: [] +2849 1 user2-844@plc2.org keys: [2844] sites: [] +2850 1 user2-845@plc2.org keys: [2845] sites: [] +2851 1 user2-846@plc2.org keys: [2846] sites: [] +2852 1 user2-847@plc2.org keys: [2847] sites: [] +2853 1 user2-848@plc2.org keys: [2848] sites: [] +2854 1 user2-849@plc2.org keys: [2849] sites: [] +2855 1 user2-850@plc2.org keys: [2850] sites: [] +2856 1 user2-851@plc2.org keys: [2851] sites: [] +2857 1 user2-852@plc2.org keys: [2852] sites: [] +2858 1 user2-853@plc2.org keys: [2853] sites: [] +2859 1 user2-854@plc2.org keys: [2854] sites: [] +2860 1 user2-855@plc2.org keys: [2855] sites: [] +2861 1 user2-856@plc2.org keys: [2856] sites: [] +2862 1 user2-857@plc2.org keys: [2857] sites: [] +2863 1 user2-858@plc2.org keys: [2858] sites: [] +2864 1 user2-859@plc2.org keys: [2859] sites: [] +2865 1 user2-860@plc2.org keys: [2860] sites: [] +2866 1 user2-861@plc2.org keys: [2861] sites: [] +2867 1 user2-862@plc2.org keys: [2862] sites: [] +2868 1 user2-863@plc2.org keys: [2863] sites: [] +2869 1 user2-864@plc2.org keys: [2864] sites: [] +2870 1 user2-865@plc2.org keys: [2865] sites: [] +2871 1 user2-866@plc2.org keys: [2866] sites: [] +2872 1 user2-867@plc2.org keys: [2867] sites: [] +2873 1 user2-868@plc2.org keys: [2868] sites: [] +2874 1 user2-869@plc2.org keys: [2869] sites: [] +2875 1 user2-870@plc2.org keys: [2870] sites: [] +2876 1 user2-871@plc2.org keys: [2871] sites: [] +2877 1 user2-872@plc2.org keys: [2872] sites: [] +2878 1 user2-873@plc2.org keys: [2873] sites: [] +2879 1 user2-874@plc2.org keys: [2874] sites: [] +2880 1 user2-875@plc2.org keys: [2875] sites: [] +2881 1 user2-876@plc2.org keys: [2876] sites: [] +2882 1 user2-877@plc2.org keys: [2877] sites: [] +2883 1 user2-878@plc2.org keys: [2878] sites: [] +2884 1 user2-879@plc2.org keys: [2879] sites: [] +2885 1 user2-880@plc2.org keys: [2880] sites: [] +2886 1 user2-881@plc2.org keys: [2881] sites: [] +2887 1 user2-882@plc2.org keys: [2882] sites: [] +2888 1 user2-883@plc2.org keys: [2883] sites: [] +2889 1 user2-884@plc2.org keys: [2884] sites: [] +2890 1 user2-885@plc2.org keys: [2885] sites: [] +2891 1 user2-886@plc2.org keys: [2886] sites: [] +2892 1 user2-887@plc2.org keys: [2887] sites: [] +2893 1 user2-888@plc2.org keys: [2888] sites: [] +2894 1 user2-889@plc2.org keys: [2889] sites: [] +2895 1 user2-890@plc2.org keys: [2890] sites: [] +2896 1 user2-891@plc2.org keys: [2891] sites: [] +2897 1 user2-892@plc2.org keys: [2892] sites: [] +2898 1 user2-893@plc2.org keys: [2893] sites: [] +2899 1 user2-894@plc2.org keys: [2894] sites: [] +2900 1 user2-895@plc2.org keys: [2895] sites: [] +2901 1 user2-896@plc2.org keys: [2896] sites: [] +2902 1 user2-897@plc2.org keys: [2897] sites: [] +2903 1 user2-898@plc2.org keys: [2898] sites: [] +2904 1 user2-899@plc2.org keys: [2899] sites: [] +2905 1 user2-900@plc2.org keys: [2900] sites: [] +2906 1 user2-901@plc2.org keys: [2901] sites: [] +2907 1 user2-902@plc2.org keys: [2902] sites: [] +2908 1 user2-903@plc2.org keys: [2903] sites: [] +2909 1 user2-904@plc2.org keys: [2904] sites: [] +2910 1 user2-905@plc2.org keys: [2905] sites: [] +2911 1 user2-906@plc2.org keys: [2906] sites: [] +2912 1 user2-907@plc2.org keys: [2907] sites: [] +2913 1 user2-908@plc2.org keys: [2908] sites: [] +2914 1 user2-909@plc2.org keys: [2909] sites: [] +2915 1 user2-910@plc2.org keys: [2910] sites: [] +2916 1 user2-911@plc2.org keys: [2911] sites: [] +2917 1 user2-912@plc2.org keys: [2912] sites: [] +2918 1 user2-913@plc2.org keys: [2913] sites: [] +2919 1 user2-914@plc2.org keys: [2914] sites: [] +2920 1 user2-915@plc2.org keys: [2915] sites: [] +2921 1 user2-916@plc2.org keys: [2916] sites: [] +2922 1 user2-917@plc2.org keys: [2917] sites: [] +2923 1 user2-918@plc2.org keys: [2918] sites: [] +2924 1 user2-919@plc2.org keys: [2919] sites: [] +2925 1 user2-920@plc2.org keys: [2920] sites: [] +2926 1 user2-921@plc2.org keys: [2921] sites: [] +2927 1 user2-922@plc2.org keys: [2922] sites: [] +2928 1 user2-923@plc2.org keys: [2923] sites: [] +2929 1 user2-924@plc2.org keys: [2924] sites: [] +2930 1 user2-925@plc2.org keys: [2925] sites: [] +2931 1 user2-926@plc2.org keys: [2926] sites: [] +2932 1 user2-927@plc2.org keys: [2927] sites: [] +2933 1 user2-928@plc2.org keys: [2928] sites: [] +2934 1 user2-929@plc2.org keys: [2929] sites: [] +2935 1 user2-930@plc2.org keys: [2930] sites: [] +2936 1 user2-931@plc2.org keys: [2931] sites: [] +2937 1 user2-932@plc2.org keys: [2932] sites: [] +2938 1 user2-933@plc2.org keys: [2933] sites: [] +2939 1 user2-934@plc2.org keys: [2934] sites: [] +2940 1 user2-935@plc2.org keys: [2935] sites: [] +2941 1 user2-936@plc2.org keys: [2936] sites: [] +2942 1 user2-937@plc2.org keys: [2937] sites: [] +2943 1 user2-938@plc2.org keys: [2938] sites: [] +2944 1 user2-939@plc2.org keys: [2939] sites: [] +2945 1 user2-940@plc2.org keys: [2940] sites: [] +2946 1 user2-941@plc2.org keys: [2941] sites: [] +2947 1 user2-942@plc2.org keys: [2942] sites: [] +2948 1 user2-943@plc2.org keys: [2943] sites: [] +2949 1 user2-944@plc2.org keys: [2944] sites: [] +2950 1 user2-945@plc2.org keys: [2945] sites: [] +2951 1 user2-946@plc2.org keys: [2946] sites: [] +2952 1 user2-947@plc2.org keys: [2947] sites: [] +2953 1 user2-948@plc2.org keys: [2948] sites: [] +2954 1 user2-949@plc2.org keys: [2949] sites: [] +2955 1 user2-950@plc2.org keys: [2950] sites: [] +2956 1 user2-951@plc2.org keys: [2951] sites: [] +2957 1 user2-952@plc2.org keys: [2952] sites: [] +2958 1 user2-953@plc2.org keys: [2953] sites: [] +2959 1 user2-954@plc2.org keys: [2954] sites: [] +2960 1 user2-955@plc2.org keys: [2955] sites: [] +2961 1 user2-956@plc2.org keys: [2956] sites: [] +2962 1 user2-957@plc2.org keys: [2957] sites: [] +2963 1 user2-958@plc2.org keys: [2958] sites: [] +2964 1 user2-959@plc2.org keys: [2959] sites: [] +2965 1 user2-960@plc2.org keys: [2960] sites: [] +2966 1 user2-961@plc2.org keys: [2961] sites: [] +2967 1 user2-962@plc2.org keys: [2962] sites: [] +2968 1 user2-963@plc2.org keys: [2963] sites: [] +2969 1 user2-964@plc2.org keys: [2964] sites: [] +2970 1 user2-965@plc2.org keys: [2965] sites: [] +2971 1 user2-966@plc2.org keys: [2966] sites: [] +2972 1 user2-967@plc2.org keys: [2967] sites: [] +2973 1 user2-968@plc2.org keys: [2968] sites: [] +2974 1 user2-969@plc2.org keys: [2969] sites: [] +2975 1 user2-970@plc2.org keys: [2970] sites: [] +2976 1 user2-971@plc2.org keys: [2971] sites: [] +2977 1 user2-972@plc2.org keys: [2972] sites: [] +2978 1 user2-973@plc2.org keys: [2973] sites: [] +2979 1 user2-974@plc2.org keys: [2974] sites: [] +2980 1 user2-975@plc2.org keys: [2975] sites: [] +2981 1 user2-976@plc2.org keys: [2976] sites: [] +2982 1 user2-977@plc2.org keys: [2977] sites: [] +2983 1 user2-978@plc2.org keys: [2978] sites: [] +2984 1 user2-979@plc2.org keys: [2979] sites: [] +2985 1 user2-980@plc2.org keys: [2980] sites: [] +2986 1 user2-981@plc2.org keys: [2981] sites: [] +2987 1 user2-982@plc2.org keys: [2982] sites: [] +2988 1 user2-983@plc2.org keys: [2983] sites: [] +2989 1 user2-984@plc2.org keys: [2984] sites: [] +2990 1 user2-985@plc2.org keys: [2985] sites: [] +2991 1 user2-986@plc2.org keys: [2986] sites: [] +2992 1 user2-987@plc2.org keys: [2987] sites: [] +2993 1 user2-988@plc2.org keys: [2988] sites: [] +2994 1 user2-989@plc2.org keys: [2989] sites: [] +2995 1 user2-990@plc2.org keys: [2990] sites: [] +2996 1 user2-991@plc2.org keys: [2991] sites: [] +2997 1 user2-992@plc2.org keys: [2992] sites: [] +2998 1 user2-993@plc2.org keys: [2993] sites: [] +2999 1 user2-994@plc2.org keys: [2994] sites: [] +3000 1 user2-995@plc2.org keys: [2995] sites: [] +3001 1 user2-996@plc2.org keys: [2996] sites: [] +3002 1 user2-997@plc2.org keys: [2997] sites: [] +3003 1 user2-998@plc2.org keys: [2998] sites: [] +3004 1 user2-999@plc2.org keys: [2999] sites: [] +3005 1 user2-1000@plc2.org keys: [3000] sites: [] +3006 1 user2-1001@plc2.org keys: [3001] sites: [] +3007 1 user2-1002@plc2.org keys: [3002] sites: [] +3008 1 user2-1003@plc2.org keys: [3003] sites: [] +3009 1 user2-1004@plc2.org keys: [3004] sites: [] +3010 1 user2-1005@plc2.org keys: [3005] sites: [] +3011 1 user2-1006@plc2.org keys: [3006] sites: [] +3012 1 user2-1007@plc2.org keys: [3007] sites: [] +3013 1 user2-1008@plc2.org keys: [3008] sites: [] +3014 1 user2-1009@plc2.org keys: [3009] sites: [] +3015 1 user2-1010@plc2.org keys: [3010] sites: [] +3016 1 user2-1011@plc2.org keys: [3011] sites: [] +3017 1 user2-1012@plc2.org keys: [3012] sites: [] +3018 1 user2-1013@plc2.org keys: [3013] sites: [] +3019 1 user2-1014@plc2.org keys: [3014] sites: [] +3020 1 user2-1015@plc2.org keys: [3015] sites: [] +3021 1 user2-1016@plc2.org keys: [3016] sites: [] +3022 1 user2-1017@plc2.org keys: [3017] sites: [] +3023 1 user2-1018@plc2.org keys: [3018] sites: [] +3024 1 user2-1019@plc2.org keys: [3019] sites: [] +3025 1 user2-1020@plc2.org keys: [3020] sites: [] +3026 1 user2-1021@plc2.org keys: [3021] sites: [] +3027 1 user2-1022@plc2.org keys: [3022] sites: [] +3028 1 user2-1023@plc2.org keys: [3023] sites: [] +3029 1 user2-1024@plc2.org keys: [3024] sites: [] +3030 1 user2-1025@plc2.org keys: [3025] sites: [] +3031 1 user2-1026@plc2.org keys: [3026] sites: [] +3032 1 user2-1027@plc2.org keys: [3027] sites: [] +3033 1 user2-1028@plc2.org keys: [3028] sites: [] +3034 1 user2-1029@plc2.org keys: [3029] sites: [] +3035 1 user2-1030@plc2.org keys: [3030] sites: [] +3036 1 user2-1031@plc2.org keys: [3031] sites: [] +3037 1 user2-1032@plc2.org keys: [3032] sites: [] +3038 1 user2-1033@plc2.org keys: [3033] sites: [] +3039 1 user2-1034@plc2.org keys: [3034] sites: [] +3040 1 user2-1035@plc2.org keys: [3035] sites: [] +3041 1 user2-1036@plc2.org keys: [3036] sites: [] +3042 1 user2-1037@plc2.org keys: [3037] sites: [] +3043 1 user2-1038@plc2.org keys: [3038] sites: [] +3044 1 user2-1039@plc2.org keys: [3039] sites: [] +3045 1 user2-1040@plc2.org keys: [3040] sites: [] +3046 1 user2-1041@plc2.org keys: [3041] sites: [] +3047 1 user2-1042@plc2.org keys: [3042] sites: [] +3048 1 user2-1043@plc2.org keys: [3043] sites: [] +3049 1 user2-1044@plc2.org keys: [3044] sites: [] +3050 1 user2-1045@plc2.org keys: [3045] sites: [] +3051 1 user2-1046@plc2.org keys: [3046] sites: [] +3052 1 user2-1047@plc2.org keys: [3047] sites: [] +3053 1 user2-1048@plc2.org keys: [3048] sites: [] +3054 1 user2-1049@plc2.org keys: [3049] sites: [] +3055 1 user2-1050@plc2.org keys: [3050] sites: [] +3056 1 user2-1051@plc2.org keys: [3051] sites: [] +3057 1 user2-1052@plc2.org keys: [3052] sites: [] +3058 1 user2-1053@plc2.org keys: [3053] sites: [] +3059 1 user2-1054@plc2.org keys: [3054] sites: [] +3060 1 user2-1055@plc2.org keys: [3055] sites: [] +3061 1 user2-1056@plc2.org keys: [3056] sites: [] +3062 1 user2-1057@plc2.org keys: [3057] sites: [] +3063 1 user2-1058@plc2.org keys: [3058] sites: [] +3064 1 user2-1059@plc2.org keys: [3059] sites: [] +3065 1 user2-1060@plc2.org keys: [3060] sites: [] +3066 1 user2-1061@plc2.org keys: [3061] sites: [] +3067 1 user2-1062@plc2.org keys: [3062] sites: [] +3068 1 user2-1063@plc2.org keys: [3063] sites: [] +3069 1 user2-1064@plc2.org keys: [3064] sites: [] +3070 1 user2-1065@plc2.org keys: [3065] sites: [] +3071 1 user2-1066@plc2.org keys: [3066] sites: [] +3072 1 user2-1067@plc2.org keys: [3067] sites: [] +3073 1 user2-1068@plc2.org keys: [3068] sites: [] +3074 1 user2-1069@plc2.org keys: [3069] sites: [] +3075 1 user2-1070@plc2.org keys: [3070] sites: [] +3076 1 user2-1071@plc2.org keys: [3071] sites: [] +3077 1 user2-1072@plc2.org keys: [3072] sites: [] +3078 1 user2-1073@plc2.org keys: [3073] sites: [] +3079 1 user2-1074@plc2.org keys: [3074] sites: [] +3080 1 user2-1075@plc2.org keys: [3075] sites: [] +3081 1 user2-1076@plc2.org keys: [3076] sites: [] +3082 1 user2-1077@plc2.org keys: [3077] sites: [] +3083 1 user2-1078@plc2.org keys: [3078] sites: [] +3084 1 user2-1079@plc2.org keys: [3079] sites: [] +3085 1 user2-1080@plc2.org keys: [3080] sites: [] +3086 1 user2-1081@plc2.org keys: [3081] sites: [] +3087 1 user2-1082@plc2.org keys: [3082] sites: [] +3088 1 user2-1083@plc2.org keys: [3083] sites: [] +3089 1 user2-1084@plc2.org keys: [3084] sites: [] +3090 1 user2-1085@plc2.org keys: [3085] sites: [] +3091 1 user2-1086@plc2.org keys: [3086] sites: [] +3092 1 user2-1087@plc2.org keys: [3087] sites: [] +3093 1 user2-1088@plc2.org keys: [3088] sites: [] +3094 1 user2-1089@plc2.org keys: [3089] sites: [] +3095 1 user2-1090@plc2.org keys: [3090] sites: [] +3096 1 user2-1091@plc2.org keys: [3091] sites: [] +3097 1 user2-1092@plc2.org keys: [3092] sites: [] +3098 1 user2-1093@plc2.org keys: [3093] sites: [] +3099 1 user2-1094@plc2.org keys: [3094] sites: [] +3100 1 user2-1095@plc2.org keys: [3095] sites: [] +3101 1 user2-1096@plc2.org keys: [3096] sites: [] +3102 1 user2-1097@plc2.org keys: [3097] sites: [] +3103 1 user2-1098@plc2.org keys: [3098] sites: [] +3104 1 user2-1099@plc2.org keys: [3099] sites: [] +3105 1 user2-1100@plc2.org keys: [3100] sites: [] +3106 1 user2-1101@plc2.org keys: [3101] sites: [] +3107 1 user2-1102@plc2.org keys: [3102] sites: [] +3108 1 user2-1103@plc2.org keys: [3103] sites: [] +3109 1 user2-1104@plc2.org keys: [3104] sites: [] +3110 1 user2-1105@plc2.org keys: [3105] sites: [] +3111 1 user2-1106@plc2.org keys: [3106] sites: [] +3112 1 user2-1107@plc2.org keys: [3107] sites: [] +3113 1 user2-1108@plc2.org keys: [3108] sites: [] +3114 1 user2-1109@plc2.org keys: [3109] sites: [] +3115 1 user2-1110@plc2.org keys: [3110] sites: [] +3116 1 user2-1111@plc2.org keys: [3111] sites: [] +3117 1 user2-1112@plc2.org keys: [3112] sites: [] +3118 1 user2-1113@plc2.org keys: [3113] sites: [] +3119 1 user2-1114@plc2.org keys: [3114] sites: [] +3120 1 user2-1115@plc2.org keys: [3115] sites: [] +3121 1 user2-1116@plc2.org keys: [3116] sites: [] +3122 1 user2-1117@plc2.org keys: [3117] sites: [] +3123 1 user2-1118@plc2.org keys: [3118] sites: [] +3124 1 user2-1119@plc2.org keys: [3119] sites: [] +3125 1 user2-1120@plc2.org keys: [3120] sites: [] +3126 1 user2-1121@plc2.org keys: [3121] sites: [] +3127 1 user2-1122@plc2.org keys: [3122] sites: [] +3128 1 user2-1123@plc2.org keys: [3123] sites: [] +3129 1 user2-1124@plc2.org keys: [3124] sites: [] +3130 1 user2-1125@plc2.org keys: [3125] sites: [] +3131 1 user2-1126@plc2.org keys: [3126] sites: [] +3132 1 user2-1127@plc2.org keys: [3127] sites: [] +3133 1 user2-1128@plc2.org keys: [3128] sites: [] +3134 1 user2-1129@plc2.org keys: [3129] sites: [] +3135 1 user2-1130@plc2.org keys: [3130] sites: [] +3136 1 user2-1131@plc2.org keys: [3131] sites: [] +3137 1 user2-1132@plc2.org keys: [3132] sites: [] +3138 1 user2-1133@plc2.org keys: [3133] sites: [] +3139 1 user2-1134@plc2.org keys: [3134] sites: [] +3140 1 user2-1135@plc2.org keys: [3135] sites: [] +3141 1 user2-1136@plc2.org keys: [3136] sites: [] +3142 1 user2-1137@plc2.org keys: [3137] sites: [] +3143 1 user2-1138@plc2.org keys: [3138] sites: [] +3144 1 user2-1139@plc2.org keys: [3139] sites: [] +3145 1 user2-1140@plc2.org keys: [3140] sites: [] +3146 1 user2-1141@plc2.org keys: [3141] sites: [] +3147 1 user2-1142@plc2.org keys: [3142] sites: [] +3148 1 user2-1143@plc2.org keys: [3143] sites: [] +3149 1 user2-1144@plc2.org keys: [3144] sites: [] +3150 1 user2-1145@plc2.org keys: [3145] sites: [] +3151 1 user2-1146@plc2.org keys: [3146] sites: [] +3152 1 user2-1147@plc2.org keys: [3147] sites: [] +3153 1 user2-1148@plc2.org keys: [3148] sites: [] +3154 1 user2-1149@plc2.org keys: [3149] sites: [] +3155 1 user2-1150@plc2.org keys: [3150] sites: [] +3156 1 user2-1151@plc2.org keys: [3151] sites: [] +3157 1 user2-1152@plc2.org keys: [3152] sites: [] +3158 1 user2-1153@plc2.org keys: [3153] sites: [] +3159 1 user2-1154@plc2.org keys: [3154] sites: [] +3160 1 user2-1155@plc2.org keys: [3155] sites: [] +3161 1 user2-1156@plc2.org keys: [3156] sites: [] +3162 1 user2-1157@plc2.org keys: [3157] sites: [] +3163 1 user2-1158@plc2.org keys: [3158] sites: [] +3164 1 user2-1159@plc2.org keys: [3159] sites: [] +3165 1 user2-1160@plc2.org keys: [3160] sites: [] +3166 1 user2-1161@plc2.org keys: [3161] sites: [] +3167 1 user2-1162@plc2.org keys: [3162] sites: [] +3168 1 user2-1163@plc2.org keys: [3163] sites: [] +3169 1 user2-1164@plc2.org keys: [3164] sites: [] +3170 1 user2-1165@plc2.org keys: [3165] sites: [] +3171 1 user2-1166@plc2.org keys: [3166] sites: [] +3172 1 user2-1167@plc2.org keys: [3167] sites: [] +3173 1 user2-1168@plc2.org keys: [3168] sites: [] +3174 1 user2-1169@plc2.org keys: [3169] sites: [] +3175 1 user2-1170@plc2.org keys: [3170] sites: [] +3176 1 user2-1171@plc2.org keys: [3171] sites: [] +3177 1 user2-1172@plc2.org keys: [3172] sites: [] +3178 1 user2-1173@plc2.org keys: [3173] sites: [] +3179 1 user2-1174@plc2.org keys: [3174] sites: [] +3180 1 user2-1175@plc2.org keys: [3175] sites: [] +3181 1 user2-1176@plc2.org keys: [3176] sites: [] +3182 1 user2-1177@plc2.org keys: [3177] sites: [] +3183 1 user2-1178@plc2.org keys: [3178] sites: [] +3184 1 user2-1179@plc2.org keys: [3179] sites: [] +3185 1 user2-1180@plc2.org keys: [3180] sites: [] +3186 1 user2-1181@plc2.org keys: [3181] sites: [] +3187 1 user2-1182@plc2.org keys: [3182] sites: [] +3188 1 user2-1183@plc2.org keys: [3183] sites: [] +3189 1 user2-1184@plc2.org keys: [3184] sites: [] +3190 1 user2-1185@plc2.org keys: [3185] sites: [] +3191 1 user2-1186@plc2.org keys: [3186] sites: [] +3192 1 user2-1187@plc2.org keys: [3187] sites: [] +3193 1 user2-1188@plc2.org keys: [3188] sites: [] +3194 1 user2-1189@plc2.org keys: [3189] sites: [] +3195 1 user2-1190@plc2.org keys: [3190] sites: [] +3196 1 user2-1191@plc2.org keys: [3191] sites: [] +3197 1 user2-1192@plc2.org keys: [3192] sites: [] +3198 1 user2-1193@plc2.org keys: [3193] sites: [] +3199 1 user2-1194@plc2.org keys: [3194] sites: [] +3200 1 user2-1195@plc2.org keys: [3195] sites: [] +3201 1 user2-1196@plc2.org keys: [3196] sites: [] +3202 1 user2-1197@plc2.org keys: [3197] sites: [] +3203 1 user2-1198@plc2.org keys: [3198] sites: [] +3204 1 user2-1199@plc2.org keys: [3199] sites: [] +3205 1 user2-1200@plc2.org keys: [3200] sites: [] +3206 1 user2-1201@plc2.org keys: [3201] sites: [] +3207 1 user2-1202@plc2.org keys: [3202] sites: [] +3208 1 user2-1203@plc2.org keys: [3203] sites: [] +3209 1 user2-1204@plc2.org keys: [3204] sites: [] +3210 1 user2-1205@plc2.org keys: [3205] sites: [] +3211 1 user2-1206@plc2.org keys: [3206] sites: [] +3212 1 user2-1207@plc2.org keys: [3207] sites: [] +3213 1 user2-1208@plc2.org keys: [3208] sites: [] +3214 1 user2-1209@plc2.org keys: [3209] sites: [] +3215 1 user2-1210@plc2.org keys: [3210] sites: [] +3216 1 user2-1211@plc2.org keys: [3211] sites: [] +3217 1 user2-1212@plc2.org keys: [3212] sites: [] +3218 1 user2-1213@plc2.org keys: [3213] sites: [] +3219 1 user2-1214@plc2.org keys: [3214] sites: [] +3220 1 user2-1215@plc2.org keys: [3215] sites: [] +3221 1 user2-1216@plc2.org keys: [3216] sites: [] +3222 1 user2-1217@plc2.org keys: [3217] sites: [] +3223 1 user2-1218@plc2.org keys: [3218] sites: [] +3224 1 user2-1219@plc2.org keys: [3219] sites: [] +3225 1 user2-1220@plc2.org keys: [3220] sites: [] +3226 1 user2-1221@plc2.org keys: [3221] sites: [] +3227 1 user2-1222@plc2.org keys: [3222] sites: [] +3228 1 user2-1223@plc2.org keys: [3223] sites: [] +3229 1 user2-1224@plc2.org keys: [3224] sites: [] +3230 1 user2-1225@plc2.org keys: [3225] sites: [] +3231 1 user2-1226@plc2.org keys: [3226] sites: [] +3232 1 user2-1227@plc2.org keys: [3227] sites: [] +3233 1 user2-1228@plc2.org keys: [3228] sites: [] +3234 1 user2-1229@plc2.org keys: [3229] sites: [] +3235 1 user2-1230@plc2.org keys: [3230] sites: [] +3236 1 user2-1231@plc2.org keys: [3231] sites: [] +3237 1 user2-1232@plc2.org keys: [3232] sites: [] +3238 1 user2-1233@plc2.org keys: [3233] sites: [] +3239 1 user2-1234@plc2.org keys: [3234] sites: [] +3240 1 user2-1235@plc2.org keys: [3235] sites: [] +3241 1 user2-1236@plc2.org keys: [3236] sites: [] +3242 1 user2-1237@plc2.org keys: [3237] sites: [] +3243 1 user2-1238@plc2.org keys: [3238] sites: [] +3244 1 user2-1239@plc2.org keys: [3239] sites: [] +3245 1 user2-1240@plc2.org keys: [3240] sites: [] +3246 1 user2-1241@plc2.org keys: [3241] sites: [] +3247 1 user2-1242@plc2.org keys: [3242] sites: [] +3248 1 user2-1243@plc2.org keys: [3243] sites: [] +3249 1 user2-1244@plc2.org keys: [3244] sites: [] +3250 1 user2-1245@plc2.org keys: [3245] sites: [] +3251 1 user2-1246@plc2.org keys: [3246] sites: [] +3252 1 user2-1247@plc2.org keys: [3247] sites: [] +3253 1 user2-1248@plc2.org keys: [3248] sites: [] +3254 1 user2-1249@plc2.org keys: [3249] sites: [] +3255 1 user2-1250@plc2.org keys: [3250] sites: [] +3256 1 user2-1251@plc2.org keys: [3251] sites: [] +3257 1 user2-1252@plc2.org keys: [3252] sites: [] +3258 1 user2-1253@plc2.org keys: [3253] sites: [] +3259 1 user2-1254@plc2.org keys: [3254] sites: [] +3260 1 user2-1255@plc2.org keys: [3255] sites: [] +3261 1 user2-1256@plc2.org keys: [3256] sites: [] +3262 1 user2-1257@plc2.org keys: [3257] sites: [] +3263 1 user2-1258@plc2.org keys: [3258] sites: [] +3264 1 user2-1259@plc2.org keys: [3259] sites: [] +3265 1 user2-1260@plc2.org keys: [3260] sites: [] +3266 1 user2-1261@plc2.org keys: [3261] sites: [] +3267 1 user2-1262@plc2.org keys: [3262] sites: [] +3268 1 user2-1263@plc2.org keys: [3263] sites: [] +3269 1 user2-1264@plc2.org keys: [3264] sites: [] +3270 1 user2-1265@plc2.org keys: [3265] sites: [] +3271 1 user2-1266@plc2.org keys: [3266] sites: [] +3272 1 user2-1267@plc2.org keys: [3267] sites: [] +3273 1 user2-1268@plc2.org keys: [3268] sites: [] +3274 1 user2-1269@plc2.org keys: [3269] sites: [] +3275 1 user2-1270@plc2.org keys: [3270] sites: [] +3276 1 user2-1271@plc2.org keys: [3271] sites: [] +3277 1 user2-1272@plc2.org keys: [3272] sites: [] +3278 1 user2-1273@plc2.org keys: [3273] sites: [] +3279 1 user2-1274@plc2.org keys: [3274] sites: [] +3280 1 user2-1275@plc2.org keys: [3275] sites: [] +3281 1 user2-1276@plc2.org keys: [3276] sites: [] +3282 1 user2-1277@plc2.org keys: [3277] sites: [] +3283 1 user2-1278@plc2.org keys: [3278] sites: [] +3284 1 user2-1279@plc2.org keys: [3279] sites: [] +3285 1 user2-1280@plc2.org keys: [3280] sites: [] +3286 1 user2-1281@plc2.org keys: [3281] sites: [] +3287 1 user2-1282@plc2.org keys: [3282] sites: [] +3288 1 user2-1283@plc2.org keys: [3283] sites: [] +3289 1 user2-1284@plc2.org keys: [3284] sites: [] +3290 1 user2-1285@plc2.org keys: [3285] sites: [] +3291 1 user2-1286@plc2.org keys: [3286] sites: [] +3292 1 user2-1287@plc2.org keys: [3287] sites: [] +3293 1 user2-1288@plc2.org keys: [3288] sites: [] +3294 1 user2-1289@plc2.org keys: [3289] sites: [] +3295 1 user2-1290@plc2.org keys: [3290] sites: [] +3296 1 user2-1291@plc2.org keys: [3291] sites: [] +3297 1 user2-1292@plc2.org keys: [3292] sites: [] +3298 1 user2-1293@plc2.org keys: [3293] sites: [] +3299 1 user2-1294@plc2.org keys: [3294] sites: [] +3300 1 user2-1295@plc2.org keys: [3295] sites: [] +3301 1 user2-1296@plc2.org keys: [3296] sites: [] +3302 1 user2-1297@plc2.org keys: [3297] sites: [] +3303 1 user2-1298@plc2.org keys: [3298] sites: [] +3304 1 user2-1299@plc2.org keys: [3299] sites: [] +3305 1 user2-1300@plc2.org keys: [3300] sites: [] +3306 1 user2-1301@plc2.org keys: [3301] sites: [] +3307 1 user2-1302@plc2.org keys: [3302] sites: [] +3308 1 user2-1303@plc2.org keys: [3303] sites: [] +3309 1 user2-1304@plc2.org keys: [3304] sites: [] +3310 1 user2-1305@plc2.org keys: [3305] sites: [] +3311 1 user2-1306@plc2.org keys: [3306] sites: [] +3312 1 user2-1307@plc2.org keys: [3307] sites: [] +3313 1 user2-1308@plc2.org keys: [3308] sites: [] +3314 1 user2-1309@plc2.org keys: [3309] sites: [] +3315 1 user2-1310@plc2.org keys: [3310] sites: [] +3316 1 user2-1311@plc2.org keys: [3311] sites: [] +3317 1 user2-1312@plc2.org keys: [3312] sites: [] +3318 1 user2-1313@plc2.org keys: [3313] sites: [] +3319 1 user2-1314@plc2.org keys: [3314] sites: [] +3320 1 user2-1315@plc2.org keys: [3315] sites: [] +3321 1 user2-1316@plc2.org keys: [3316] sites: [] +3322 1 user2-1317@plc2.org keys: [3317] sites: [] +3323 1 user2-1318@plc2.org keys: [3318] sites: [] +3324 1 user2-1319@plc2.org keys: [3319] sites: [] +3325 1 user2-1320@plc2.org keys: [3320] sites: [] +3326 1 user2-1321@plc2.org keys: [3321] sites: [] +3327 1 user2-1322@plc2.org keys: [3322] sites: [] +3328 1 user2-1323@plc2.org keys: [3323] sites: [] +3329 1 user2-1324@plc2.org keys: [3324] sites: [] +3330 1 user2-1325@plc2.org keys: [3325] sites: [] +3331 1 user2-1326@plc2.org keys: [3326] sites: [] +3332 1 user2-1327@plc2.org keys: [3327] sites: [] +3333 1 user2-1328@plc2.org keys: [3328] sites: [] +3334 1 user2-1329@plc2.org keys: [3329] sites: [] +3335 1 user2-1330@plc2.org keys: [3330] sites: [] +3336 1 user2-1331@plc2.org keys: [3331] sites: [] +3337 1 user2-1332@plc2.org keys: [3332] sites: [] +3338 1 user2-1333@plc2.org keys: [3333] sites: [] +3339 1 user2-1334@plc2.org keys: [3334] sites: [] +3340 1 user2-1335@plc2.org keys: [3335] sites: [] +3341 1 user2-1336@plc2.org keys: [3336] sites: [] +3342 1 user2-1337@plc2.org keys: [3337] sites: [] +3343 1 user2-1338@plc2.org keys: [3338] sites: [] +3344 1 user2-1339@plc2.org keys: [3339] sites: [] +3345 1 user2-1340@plc2.org keys: [3340] sites: [] +3346 1 user2-1341@plc2.org keys: [3341] sites: [] +3347 1 user2-1342@plc2.org keys: [3342] sites: [] +3348 1 user2-1343@plc2.org keys: [3343] sites: [] +3349 1 user2-1344@plc2.org keys: [3344] sites: [] +3350 1 user2-1345@plc2.org keys: [3345] sites: [] +3351 1 user2-1346@plc2.org keys: [3346] sites: [] +3352 1 user2-1347@plc2.org keys: [3347] sites: [] +3353 1 user2-1348@plc2.org keys: [3348] sites: [] +3354 1 user2-1349@plc2.org keys: [3349] sites: [] +3355 1 user2-1350@plc2.org keys: [3350] sites: [] +3356 1 user2-1351@plc2.org keys: [3351] sites: [] +3357 1 user2-1352@plc2.org keys: [3352] sites: [] +3358 1 user2-1353@plc2.org keys: [3353] sites: [] +3359 1 user2-1354@plc2.org keys: [3354] sites: [] +3360 1 user2-1355@plc2.org keys: [3355] sites: [] +3361 1 user2-1356@plc2.org keys: [3356] sites: [] +3362 1 user2-1357@plc2.org keys: [3357] sites: [] +3363 1 user2-1358@plc2.org keys: [3358] sites: [] +3364 1 user2-1359@plc2.org keys: [3359] sites: [] +3365 1 user2-1360@plc2.org keys: [3360] sites: [] +3366 1 user2-1361@plc2.org keys: [3361] sites: [] +3367 1 user2-1362@plc2.org keys: [3362] sites: [] +3368 1 user2-1363@plc2.org keys: [3363] sites: [] +3369 1 user2-1364@plc2.org keys: [3364] sites: [] +3370 1 user2-1365@plc2.org keys: [3365] sites: [] +3371 1 user2-1366@plc2.org keys: [3366] sites: [] +3372 1 user2-1367@plc2.org keys: [3367] sites: [] +3373 1 user2-1368@plc2.org keys: [3368] sites: [] +3374 1 user2-1369@plc2.org keys: [3369] sites: [] +3375 1 user2-1370@plc2.org keys: [3370] sites: [] +3376 1 user2-1371@plc2.org keys: [3371] sites: [] +3377 1 user2-1372@plc2.org keys: [3372] sites: [] +3378 1 user2-1373@plc2.org keys: [3373] sites: [] +3379 1 user2-1374@plc2.org keys: [3374] sites: [] +3380 1 user2-1375@plc2.org keys: [3375] sites: [] +3381 1 user2-1376@plc2.org keys: [3376] sites: [] +3382 1 user2-1377@plc2.org keys: [3377] sites: [] +3383 1 user2-1378@plc2.org keys: [3378] sites: [] +3384 1 user2-1379@plc2.org keys: [3379] sites: [] +3385 1 user2-1380@plc2.org keys: [3380] sites: [] +3386 1 user2-1381@plc2.org keys: [3381] sites: [] +3387 1 user2-1382@plc2.org keys: [3382] sites: [] +3388 1 user2-1383@plc2.org keys: [3383] sites: [] +3389 1 user2-1384@plc2.org keys: [3384] sites: [] +3390 1 user2-1385@plc2.org keys: [3385] sites: [] +3391 1 user2-1386@plc2.org keys: [3386] sites: [] +3392 1 user2-1387@plc2.org keys: [3387] sites: [] +3393 1 user2-1388@plc2.org keys: [3388] sites: [] +3394 1 user2-1389@plc2.org keys: [3389] sites: [] +3395 1 user2-1390@plc2.org keys: [3390] sites: [] +3396 1 user2-1391@plc2.org keys: [3391] sites: [] +3397 1 user2-1392@plc2.org keys: [3392] sites: [] +3398 1 user2-1393@plc2.org keys: [3393] sites: [] +3399 1 user2-1394@plc2.org keys: [3394] sites: [] +3400 1 user2-1395@plc2.org keys: [3395] sites: [] +3401 1 user2-1396@plc2.org keys: [3396] sites: [] +3402 1 user2-1397@plc2.org keys: [3397] sites: [] +3403 1 user2-1398@plc2.org keys: [3398] sites: [] +3404 1 user2-1399@plc2.org keys: [3399] sites: [] +3405 1 user2-1400@plc2.org keys: [3400] sites: [] +3406 1 user2-1401@plc2.org keys: [3401] sites: [] +3407 1 user2-1402@plc2.org keys: [3402] sites: [] +3408 1 user2-1403@plc2.org keys: [3403] sites: [] +3409 1 user2-1404@plc2.org keys: [3404] sites: [] +3410 1 user2-1405@plc2.org keys: [3405] sites: [] +3411 1 user2-1406@plc2.org keys: [3406] sites: [] +3412 1 user2-1407@plc2.org keys: [3407] sites: [] +3413 1 user2-1408@plc2.org keys: [3408] sites: [] +3414 1 user2-1409@plc2.org keys: [3409] sites: [] +3415 1 user2-1410@plc2.org keys: [3410] sites: [] +3416 1 user2-1411@plc2.org keys: [3411] sites: [] +3417 1 user2-1412@plc2.org keys: [3412] sites: [] +3418 1 user2-1413@plc2.org keys: [3413] sites: [] +3419 1 user2-1414@plc2.org keys: [3414] sites: [] +3420 1 user2-1415@plc2.org keys: [3415] sites: [] +3421 1 user2-1416@plc2.org keys: [3416] sites: [] +3422 1 user2-1417@plc2.org keys: [3417] sites: [] +3423 1 user2-1418@plc2.org keys: [3418] sites: [] +3424 1 user2-1419@plc2.org keys: [3419] sites: [] +3425 1 user2-1420@plc2.org keys: [3420] sites: [] +3426 1 user2-1421@plc2.org keys: [3421] sites: [] +3427 1 user2-1422@plc2.org keys: [3422] sites: [] +3428 1 user2-1423@plc2.org keys: [3423] sites: [] +3429 1 user2-1424@plc2.org keys: [3424] sites: [] +3430 1 user2-1425@plc2.org keys: [3425] sites: [] +3431 1 user2-1426@plc2.org keys: [3426] sites: [] +3432 1 user2-1427@plc2.org keys: [3427] sites: [] +3433 1 user2-1428@plc2.org keys: [3428] sites: [] +3434 1 user2-1429@plc2.org keys: [3429] sites: [] +3435 1 user2-1430@plc2.org keys: [3430] sites: [] +3436 1 user2-1431@plc2.org keys: [3431] sites: [] +3437 1 user2-1432@plc2.org keys: [3432] sites: [] +3438 1 user2-1433@plc2.org keys: [3433] sites: [] +3439 1 user2-1434@plc2.org keys: [3434] sites: [] +3440 1 user2-1435@plc2.org keys: [3435] sites: [] +3441 1 user2-1436@plc2.org keys: [3436] sites: [] +3442 1 user2-1437@plc2.org keys: [3437] sites: [] +3443 1 user2-1438@plc2.org keys: [3438] sites: [] +3444 1 user2-1439@plc2.org keys: [3439] sites: [] +3445 1 user2-1440@plc2.org keys: [3440] sites: [] +3446 1 user2-1441@plc2.org keys: [3441] sites: [] +3447 1 user2-1442@plc2.org keys: [3442] sites: [] +3448 1 user2-1443@plc2.org keys: [3443] sites: [] +3449 1 user2-1444@plc2.org keys: [3444] sites: [] +3450 1 user2-1445@plc2.org keys: [3445] sites: [] +3451 1 user2-1446@plc2.org keys: [3446] sites: [] +3452 1 user2-1447@plc2.org keys: [3447] sites: [] +3453 1 user2-1448@plc2.org keys: [3448] sites: [] +3454 1 user2-1449@plc2.org keys: [3449] sites: [] +3455 1 user2-1450@plc2.org keys: [3450] sites: [] +3456 1 user2-1451@plc2.org keys: [3451] sites: [] +3457 1 user2-1452@plc2.org keys: [3452] sites: [] +3458 1 user2-1453@plc2.org keys: [3453] sites: [] +3459 1 user2-1454@plc2.org keys: [3454] sites: [] +3460 1 user2-1455@plc2.org keys: [3455] sites: [] +3461 1 user2-1456@plc2.org keys: [3456] sites: [] +3462 1 user2-1457@plc2.org keys: [3457] sites: [] +3463 1 user2-1458@plc2.org keys: [3458] sites: [] +3464 1 user2-1459@plc2.org keys: [3459] sites: [] +3465 1 user2-1460@plc2.org keys: [3460] sites: [] +3466 1 user2-1461@plc2.org keys: [3461] sites: [] +3467 1 user2-1462@plc2.org keys: [3462] sites: [] +3468 1 user2-1463@plc2.org keys: [3463] sites: [] +3469 1 user2-1464@plc2.org keys: [3464] sites: [] +3470 1 user2-1465@plc2.org keys: [3465] sites: [] +3471 1 user2-1466@plc2.org keys: [3466] sites: [] +3472 1 user2-1467@plc2.org keys: [3467] sites: [] +3473 1 user2-1468@plc2.org keys: [3468] sites: [] +3474 1 user2-1469@plc2.org keys: [3469] sites: [] +3475 1 user2-1470@plc2.org keys: [3470] sites: [] +3476 1 user2-1471@plc2.org keys: [3471] sites: [] +3477 1 user2-1472@plc2.org keys: [3472] sites: [] +3478 1 user2-1473@plc2.org keys: [3473] sites: [] +3479 1 user2-1474@plc2.org keys: [3474] sites: [] +3480 1 user2-1475@plc2.org keys: [3475] sites: [] +3481 1 user2-1476@plc2.org keys: [3476] sites: [] +3482 1 user2-1477@plc2.org keys: [3477] sites: [] +3483 1 user2-1478@plc2.org keys: [3478] sites: [] +3484 1 user2-1479@plc2.org keys: [3479] sites: [] +3485 1 user2-1480@plc2.org keys: [3480] sites: [] +3486 1 user2-1481@plc2.org keys: [3481] sites: [] +3487 1 user2-1482@plc2.org keys: [3482] sites: [] +3488 1 user2-1483@plc2.org keys: [3483] sites: [] +3489 1 user2-1484@plc2.org keys: [3484] sites: [] +3490 1 user2-1485@plc2.org keys: [3485] sites: [] +3491 1 user2-1486@plc2.org keys: [3486] sites: [] +3492 1 user2-1487@plc2.org keys: [3487] sites: [] +3493 1 user2-1488@plc2.org keys: [3488] sites: [] +3494 1 user2-1489@plc2.org keys: [3489] sites: [] +3495 1 user2-1490@plc2.org keys: [3490] sites: [] +3496 1 user2-1491@plc2.org keys: [3491] sites: [] +3497 1 user2-1492@plc2.org keys: [3492] sites: [] +3498 1 user2-1493@plc2.org keys: [3493] sites: [] +3499 1 user2-1494@plc2.org keys: [3494] sites: [] +3500 1 user2-1495@plc2.org keys: [3495] sites: [] +3501 1 user2-1496@plc2.org keys: [3496] sites: [] +3502 1 user2-1497@plc2.org keys: [3497] sites: [] +3503 1 user2-1498@plc2.org keys: [3498] sites: [] +3504 1 user2-1499@plc2.org keys: [3499] sites: [] +3505 1 user2-1500@plc2.org keys: [3500] sites: [] +3506 1 user2-1501@plc2.org keys: [3501] sites: [] +3507 1 user2-1502@plc2.org keys: [3502] sites: [] +3508 1 user2-1503@plc2.org keys: [3503] sites: [] +3509 1 user2-1504@plc2.org keys: [3504] sites: [] +3510 1 user2-1505@plc2.org keys: [3505] sites: [] +3511 1 user2-1506@plc2.org keys: [3506] sites: [] +3512 1 user2-1507@plc2.org keys: [3507] sites: [] +3513 1 user2-1508@plc2.org keys: [3508] sites: [] +3514 1 user2-1509@plc2.org keys: [3509] sites: [] +3515 1 user2-1510@plc2.org keys: [3510] sites: [] +3516 1 user2-1511@plc2.org keys: [3511] sites: [] +3517 1 user2-1512@plc2.org keys: [3512] sites: [] +3518 1 user2-1513@plc2.org keys: [3513] sites: [] +3519 1 user2-1514@plc2.org keys: [3514] sites: [] +3520 1 user2-1515@plc2.org keys: [3515] sites: [] +3521 1 user2-1516@plc2.org keys: [3516] sites: [] +3522 1 user2-1517@plc2.org keys: [3517] sites: [] +3523 1 user2-1518@plc2.org keys: [3518] sites: [] +3524 1 user2-1519@plc2.org keys: [3519] sites: [] +3525 1 user2-1520@plc2.org keys: [3520] sites: [] +3526 1 user2-1521@plc2.org keys: [3521] sites: [] +3527 1 user2-1522@plc2.org keys: [3522] sites: [] +3528 1 user2-1523@plc2.org keys: [3523] sites: [] +3529 1 user2-1524@plc2.org keys: [3524] sites: [] +3530 1 user2-1525@plc2.org keys: [3525] sites: [] +3531 1 user2-1526@plc2.org keys: [3526] sites: [] +3532 1 user2-1527@plc2.org keys: [3527] sites: [] +3533 1 user2-1528@plc2.org keys: [3528] sites: [] +3534 1 user2-1529@plc2.org keys: [3529] sites: [] +3535 1 user2-1530@plc2.org keys: [3530] sites: [] +3536 1 user2-1531@plc2.org keys: [3531] sites: [] +3537 1 user2-1532@plc2.org keys: [3532] sites: [] +3538 1 user2-1533@plc2.org keys: [3533] sites: [] +3539 1 user2-1534@plc2.org keys: [3534] sites: [] +3540 1 user2-1535@plc2.org keys: [3535] sites: [] +3541 1 user2-1536@plc2.org keys: [3536] sites: [] +3542 1 user2-1537@plc2.org keys: [3537] sites: [] +3543 1 user2-1538@plc2.org keys: [3538] sites: [] +3544 1 user2-1539@plc2.org keys: [3539] sites: [] +3545 1 user2-1540@plc2.org keys: [3540] sites: [] +3546 1 user2-1541@plc2.org keys: [3541] sites: [] +3547 1 user2-1542@plc2.org keys: [3542] sites: [] +3548 1 user2-1543@plc2.org keys: [3543] sites: [] +3549 1 user2-1544@plc2.org keys: [3544] sites: [] +3550 1 user2-1545@plc2.org keys: [3545] sites: [] +3551 1 user2-1546@plc2.org keys: [3546] sites: [] +3552 1 user2-1547@plc2.org keys: [3547] sites: [] +3553 1 user2-1548@plc2.org keys: [3548] sites: [] +3554 1 user2-1549@plc2.org keys: [3549] sites: [] +3555 1 user2-1550@plc2.org keys: [3550] sites: [] +3556 1 user2-1551@plc2.org keys: [3551] sites: [] +3557 1 user2-1552@plc2.org keys: [3552] sites: [] +3558 1 user2-1553@plc2.org keys: [3553] sites: [] +3559 1 user2-1554@plc2.org keys: [3554] sites: [] +3560 1 user2-1555@plc2.org keys: [3555] sites: [] +3561 1 user2-1556@plc2.org keys: [3556] sites: [] +3562 1 user2-1557@plc2.org keys: [3557] sites: [] +3563 1 user2-1558@plc2.org keys: [3558] sites: [] +3564 1 user2-1559@plc2.org keys: [3559] sites: [] +3565 1 user2-1560@plc2.org keys: [3560] sites: [] +3566 1 user2-1561@plc2.org keys: [3561] sites: [] +3567 1 user2-1562@plc2.org keys: [3562] sites: [] +3568 1 user2-1563@plc2.org keys: [3563] sites: [] +3569 1 user2-1564@plc2.org keys: [3564] sites: [] +3570 1 user2-1565@plc2.org keys: [3565] sites: [] +3571 1 user2-1566@plc2.org keys: [3566] sites: [] +3572 1 user2-1567@plc2.org keys: [3567] sites: [] +3573 1 user2-1568@plc2.org keys: [3568] sites: [] +3574 1 user2-1569@plc2.org keys: [3569] sites: [] +3575 1 user2-1570@plc2.org keys: [3570] sites: [] +3576 1 user2-1571@plc2.org keys: [3571] sites: [] +3577 1 user2-1572@plc2.org keys: [3572] sites: [] +3578 1 user2-1573@plc2.org keys: [3573] sites: [] +3579 1 user2-1574@plc2.org keys: [3574] sites: [] +3580 1 user2-1575@plc2.org keys: [3575] sites: [] +3581 1 user2-1576@plc2.org keys: [3576] sites: [] +3582 1 user2-1577@plc2.org keys: [3577] sites: [] +3583 1 user2-1578@plc2.org keys: [3578] sites: [] +3584 1 user2-1579@plc2.org keys: [3579] sites: [] +3585 1 user2-1580@plc2.org keys: [3580] sites: [] +3586 1 user2-1581@plc2.org keys: [3581] sites: [] +3587 1 user2-1582@plc2.org keys: [3582] sites: [] +3588 1 user2-1583@plc2.org keys: [3583] sites: [] +3589 1 user2-1584@plc2.org keys: [3584] sites: [] +3590 1 user2-1585@plc2.org keys: [3585] sites: [] +3591 1 user2-1586@plc2.org keys: [3586] sites: [] +3592 1 user2-1587@plc2.org keys: [3587] sites: [] +3593 1 user2-1588@plc2.org keys: [3588] sites: [] +3594 1 user2-1589@plc2.org keys: [3589] sites: [] +3595 1 user2-1590@plc2.org keys: [3590] sites: [] +3596 1 user2-1591@plc2.org keys: [3591] sites: [] +3597 1 user2-1592@plc2.org keys: [3592] sites: [] +3598 1 user2-1593@plc2.org keys: [3593] sites: [] +3599 1 user2-1594@plc2.org keys: [3594] sites: [] +3600 1 user2-1595@plc2.org keys: [3595] sites: [] +3601 1 user2-1596@plc2.org keys: [3596] sites: [] +3602 1 user2-1597@plc2.org keys: [3597] sites: [] +3603 1 user2-1598@plc2.org keys: [3598] sites: [] +3604 1 user2-1599@plc2.org keys: [3599] sites: [] +3605 1 user2-1600@plc2.org keys: [3600] sites: [] +3606 1 user2-1601@plc2.org keys: [3601] sites: [] +3607 1 user2-1602@plc2.org keys: [3602] sites: [] +3608 1 user2-1603@plc2.org keys: [3603] sites: [] +3609 1 user2-1604@plc2.org keys: [3604] sites: [] +3610 1 user2-1605@plc2.org keys: [3605] sites: [] +3611 1 user2-1606@plc2.org keys: [3606] sites: [] +3612 1 user2-1607@plc2.org keys: [3607] sites: [] +3613 1 user2-1608@plc2.org keys: [3608] sites: [] +3614 1 user2-1609@plc2.org keys: [3609] sites: [] +3615 1 user2-1610@plc2.org keys: [3610] sites: [] +3616 1 user2-1611@plc2.org keys: [3611] sites: [] +3617 1 user2-1612@plc2.org keys: [3612] sites: [] +3618 1 user2-1613@plc2.org keys: [3613] sites: [] +3619 1 user2-1614@plc2.org keys: [3614] sites: [] +3620 1 user2-1615@plc2.org keys: [3615] sites: [] +3621 1 user2-1616@plc2.org keys: [3616] sites: [] +3622 1 user2-1617@plc2.org keys: [3617] sites: [] +3623 1 user2-1618@plc2.org keys: [3618] sites: [] +3624 1 user2-1619@plc2.org keys: [3619] sites: [] +3625 1 user2-1620@plc2.org keys: [3620] sites: [] +3626 1 user2-1621@plc2.org keys: [3621] sites: [] +3627 1 user2-1622@plc2.org keys: [3622] sites: [] +3628 1 user2-1623@plc2.org keys: [3623] sites: [] +3629 1 user2-1624@plc2.org keys: [3624] sites: [] +3630 1 user2-1625@plc2.org keys: [3625] sites: [] +3631 1 user2-1626@plc2.org keys: [3626] sites: [] +3632 1 user2-1627@plc2.org keys: [3627] sites: [] +3633 1 user2-1628@plc2.org keys: [3628] sites: [] +3634 1 user2-1629@plc2.org keys: [3629] sites: [] +3635 1 user2-1630@plc2.org keys: [3630] sites: [] +3636 1 user2-1631@plc2.org keys: [3631] sites: [] +3637 1 user2-1632@plc2.org keys: [3632] sites: [] +3638 1 user2-1633@plc2.org keys: [3633] sites: [] +3639 1 user2-1634@plc2.org keys: [3634] sites: [] +3640 1 user2-1635@plc2.org keys: [3635] sites: [] +3641 1 user2-1636@plc2.org keys: [3636] sites: [] +3642 1 user2-1637@plc2.org keys: [3637] sites: [] +3643 1 user2-1638@plc2.org keys: [3638] sites: [] +3644 1 user2-1639@plc2.org keys: [3639] sites: [] +3645 1 user2-1640@plc2.org keys: [3640] sites: [] +3646 1 user2-1641@plc2.org keys: [3641] sites: [] +3647 1 user2-1642@plc2.org keys: [3642] sites: [] +3648 1 user2-1643@plc2.org keys: [3643] sites: [] +3649 1 user2-1644@plc2.org keys: [3644] sites: [] +3650 1 user2-1645@plc2.org keys: [3645] sites: [] +3651 1 user2-1646@plc2.org keys: [3646] sites: [] +3652 1 user2-1647@plc2.org keys: [3647] sites: [] +3653 1 user2-1648@plc2.org keys: [3648] sites: [] +3654 1 user2-1649@plc2.org keys: [3649] sites: [] +3655 1 user2-1650@plc2.org keys: [3650] sites: [] +3656 1 user2-1651@plc2.org keys: [3651] sites: [] +3657 1 user2-1652@plc2.org keys: [3652] sites: [] +3658 1 user2-1653@plc2.org keys: [3653] sites: [] +3659 1 user2-1654@plc2.org keys: [3654] sites: [] +3660 1 user2-1655@plc2.org keys: [3655] sites: [] +3661 1 user2-1656@plc2.org keys: [3656] sites: [] +3662 1 user2-1657@plc2.org keys: [3657] sites: [] +3663 1 user2-1658@plc2.org keys: [3658] sites: [] +3664 1 user2-1659@plc2.org keys: [3659] sites: [] +3665 1 user2-1660@plc2.org keys: [3660] sites: [] +3666 1 user2-1661@plc2.org keys: [3661] sites: [] +3667 1 user2-1662@plc2.org keys: [3662] sites: [] +3668 1 user2-1663@plc2.org keys: [3663] sites: [] +3669 1 user2-1664@plc2.org keys: [3664] sites: [] +3670 1 user2-1665@plc2.org keys: [3665] sites: [] +3671 1 user2-1666@plc2.org keys: [3666] sites: [] +3672 1 user2-1667@plc2.org keys: [3667] sites: [] +3673 1 user2-1668@plc2.org keys: [3668] sites: [] +3674 1 user2-1669@plc2.org keys: [3669] sites: [] +3675 1 user2-1670@plc2.org keys: [3670] sites: [] +3676 1 user2-1671@plc2.org keys: [3671] sites: [] +3677 1 user2-1672@plc2.org keys: [3672] sites: [] +3678 1 user2-1673@plc2.org keys: [3673] sites: [] +3679 1 user2-1674@plc2.org keys: [3674] sites: [] +3680 1 user2-1675@plc2.org keys: [3675] sites: [] +3681 1 user2-1676@plc2.org keys: [3676] sites: [] +3682 1 user2-1677@plc2.org keys: [3677] sites: [] +3683 1 user2-1678@plc2.org keys: [3678] sites: [] +3684 1 user2-1679@plc2.org keys: [3679] sites: [] +3685 1 user2-1680@plc2.org keys: [3680] sites: [] +3686 1 user2-1681@plc2.org keys: [3681] sites: [] +3687 1 user2-1682@plc2.org keys: [3682] sites: [] +3688 1 user2-1683@plc2.org keys: [3683] sites: [] +3689 1 user2-1684@plc2.org keys: [3684] sites: [] +3690 1 user2-1685@plc2.org keys: [3685] sites: [] +3691 1 user2-1686@plc2.org keys: [3686] sites: [] +3692 1 user2-1687@plc2.org keys: [3687] sites: [] +3693 1 user2-1688@plc2.org keys: [3688] sites: [] +3694 1 user2-1689@plc2.org keys: [3689] sites: [] +3695 1 user2-1690@plc2.org keys: [3690] sites: [] +3696 1 user2-1691@plc2.org keys: [3691] sites: [] +3697 1 user2-1692@plc2.org keys: [3692] sites: [] +3698 1 user2-1693@plc2.org keys: [3693] sites: [] +3699 1 user2-1694@plc2.org keys: [3694] sites: [] +3700 1 user2-1695@plc2.org keys: [3695] sites: [] +3701 1 user2-1696@plc2.org keys: [3696] sites: [] +3702 1 user2-1697@plc2.org keys: [3697] sites: [] +3703 1 user2-1698@plc2.org keys: [3698] sites: [] +3704 1 user2-1699@plc2.org keys: [3699] sites: [] +3705 1 user2-1700@plc2.org keys: [3700] sites: [] +3706 1 user2-1701@plc2.org keys: [3701] sites: [] +3707 1 user2-1702@plc2.org keys: [3702] sites: [] +3708 1 user2-1703@plc2.org keys: [3703] sites: [] +3709 1 user2-1704@plc2.org keys: [3704] sites: [] +3710 1 user2-1705@plc2.org keys: [3705] sites: [] +3711 1 user2-1706@plc2.org keys: [3706] sites: [] +3712 1 user2-1707@plc2.org keys: [3707] sites: [] +3713 1 user2-1708@plc2.org keys: [3708] sites: [] +3714 1 user2-1709@plc2.org keys: [3709] sites: [] +3715 1 user2-1710@plc2.org keys: [3710] sites: [] +3716 1 user2-1711@plc2.org keys: [3711] sites: [] +3717 1 user2-1712@plc2.org keys: [3712] sites: [] +3718 1 user2-1713@plc2.org keys: [3713] sites: [] +3719 1 user2-1714@plc2.org keys: [3714] sites: [] +3720 1 user2-1715@plc2.org keys: [3715] sites: [] +3721 1 user2-1716@plc2.org keys: [3716] sites: [] +3722 1 user2-1717@plc2.org keys: [3717] sites: [] +3723 1 user2-1718@plc2.org keys: [3718] sites: [] +3724 1 user2-1719@plc2.org keys: [3719] sites: [] +3725 1 user2-1720@plc2.org keys: [3720] sites: [] +3726 1 user2-1721@plc2.org keys: [3721] sites: [] +3727 1 user2-1722@plc2.org keys: [3722] sites: [] +3728 1 user2-1723@plc2.org keys: [3723] sites: [] +3729 1 user2-1724@plc2.org keys: [3724] sites: [] +3730 1 user2-1725@plc2.org keys: [3725] sites: [] +3731 1 user2-1726@plc2.org keys: [3726] sites: [] +3732 1 user2-1727@plc2.org keys: [3727] sites: [] +3733 1 user2-1728@plc2.org keys: [3728] sites: [] +3734 1 user2-1729@plc2.org keys: [3729] sites: [] +3735 1 user2-1730@plc2.org keys: [3730] sites: [] +3736 1 user2-1731@plc2.org keys: [3731] sites: [] +3737 1 user2-1732@plc2.org keys: [3732] sites: [] +3738 1 user2-1733@plc2.org keys: [3733] sites: [] +3739 1 user2-1734@plc2.org keys: [3734] sites: [] +3740 1 user2-1735@plc2.org keys: [3735] sites: [] +3741 1 user2-1736@plc2.org keys: [3736] sites: [] +3742 1 user2-1737@plc2.org keys: [3737] sites: [] +3743 1 user2-1738@plc2.org keys: [3738] sites: [] +3744 1 user2-1739@plc2.org keys: [3739] sites: [] +3745 1 user2-1740@plc2.org keys: [3740] sites: [] +3746 1 user2-1741@plc2.org keys: [3741] sites: [] +3747 1 user2-1742@plc2.org keys: [3742] sites: [] +3748 1 user2-1743@plc2.org keys: [3743] sites: [] +3749 1 user2-1744@plc2.org keys: [3744] sites: [] +3750 1 user2-1745@plc2.org keys: [3745] sites: [] +3751 1 user2-1746@plc2.org keys: [3746] sites: [] +3752 1 user2-1747@plc2.org keys: [3747] sites: [] +3753 1 user2-1748@plc2.org keys: [3748] sites: [] +3754 1 user2-1749@plc2.org keys: [3749] sites: [] +3755 1 user2-1750@plc2.org keys: [3750] sites: [] +3756 1 user2-1751@plc2.org keys: [3751] sites: [] +3757 1 user2-1752@plc2.org keys: [3752] sites: [] +3758 1 user2-1753@plc2.org keys: [3753] sites: [] +3759 1 user2-1754@plc2.org keys: [3754] sites: [] +3760 1 user2-1755@plc2.org keys: [3755] sites: [] +3761 1 user2-1756@plc2.org keys: [3756] sites: [] +3762 1 user2-1757@plc2.org keys: [3757] sites: [] +3763 1 user2-1758@plc2.org keys: [3758] sites: [] +3764 1 user2-1759@plc2.org keys: [3759] sites: [] +3765 1 user2-1760@plc2.org keys: [3760] sites: [] +3766 1 user2-1761@plc2.org keys: [3761] sites: [] +3767 1 user2-1762@plc2.org keys: [3762] sites: [] +3768 1 user2-1763@plc2.org keys: [3763] sites: [] +3769 1 user2-1764@plc2.org keys: [3764] sites: [] +3770 1 user2-1765@plc2.org keys: [3765] sites: [] +3771 1 user2-1766@plc2.org keys: [3766] sites: [] +3772 1 user2-1767@plc2.org keys: [3767] sites: [] +3773 1 user2-1768@plc2.org keys: [3768] sites: [] +3774 1 user2-1769@plc2.org keys: [3769] sites: [] +3775 1 user2-1770@plc2.org keys: [3770] sites: [] +3776 1 user2-1771@plc2.org keys: [3771] sites: [] +3777 1 user2-1772@plc2.org keys: [3772] sites: [] +3778 1 user2-1773@plc2.org keys: [3773] sites: [] +3779 1 user2-1774@plc2.org keys: [3774] sites: [] +3780 1 user2-1775@plc2.org keys: [3775] sites: [] +3781 1 user2-1776@plc2.org keys: [3776] sites: [] +3782 1 user2-1777@plc2.org keys: [3777] sites: [] +3783 1 user2-1778@plc2.org keys: [3778] sites: [] +3784 1 user2-1779@plc2.org keys: [3779] sites: [] +3785 1 user2-1780@plc2.org keys: [3780] sites: [] +3786 1 user2-1781@plc2.org keys: [3781] sites: [] +3787 1 user2-1782@plc2.org keys: [3782] sites: [] +3788 1 user2-1783@plc2.org keys: [3783] sites: [] +3789 1 user2-1784@plc2.org keys: [3784] sites: [] +3790 1 user2-1785@plc2.org keys: [3785] sites: [] +3791 1 user2-1786@plc2.org keys: [3786] sites: [] +3792 1 user2-1787@plc2.org keys: [3787] sites: [] +3793 1 user2-1788@plc2.org keys: [3788] sites: [] +3794 1 user2-1789@plc2.org keys: [3789] sites: [] +3795 1 user2-1790@plc2.org keys: [3790] sites: [] +3796 1 user2-1791@plc2.org keys: [3791] sites: [] +3797 1 user2-1792@plc2.org keys: [3792] sites: [] +3798 1 user2-1793@plc2.org keys: [3793] sites: [] +3799 1 user2-1794@plc2.org keys: [3794] sites: [] +3800 1 user2-1795@plc2.org keys: [3795] sites: [] +3801 1 user2-1796@plc2.org keys: [3796] sites: [] +3802 1 user2-1797@plc2.org keys: [3797] sites: [] +3803 1 user2-1798@plc2.org keys: [3798] sites: [] +3804 1 user2-1799@plc2.org keys: [3799] sites: [] +3805 1 user2-1800@plc2.org keys: [3800] sites: [] +3806 1 user2-1801@plc2.org keys: [3801] sites: [] +3807 1 user2-1802@plc2.org keys: [3802] sites: [] +3808 1 user2-1803@plc2.org keys: [3803] sites: [] +3809 1 user2-1804@plc2.org keys: [3804] sites: [] +3810 1 user2-1805@plc2.org keys: [3805] sites: [] +3811 1 user2-1806@plc2.org keys: [3806] sites: [] +3812 1 user2-1807@plc2.org keys: [3807] sites: [] +3813 1 user2-1808@plc2.org keys: [3808] sites: [] +3814 1 user2-1809@plc2.org keys: [3809] sites: [] +3815 1 user2-1810@plc2.org keys: [3810] sites: [] +3816 1 user2-1811@plc2.org keys: [3811] sites: [] +3817 1 user2-1812@plc2.org keys: [3812] sites: [] +3818 1 user2-1813@plc2.org keys: [3813] sites: [] +3819 1 user2-1814@plc2.org keys: [3814] sites: [] +3820 1 user2-1815@plc2.org keys: [3815] sites: [] +3821 1 user2-1816@plc2.org keys: [3816] sites: [] +3822 1 user2-1817@plc2.org keys: [3817] sites: [] +3823 1 user2-1818@plc2.org keys: [3818] sites: [] +3824 1 user2-1819@plc2.org keys: [3819] sites: [] +3825 1 user2-1820@plc2.org keys: [3820] sites: [] +3826 1 user2-1821@plc2.org keys: [3821] sites: [] +3827 1 user2-1822@plc2.org keys: [3822] sites: [] +3828 1 user2-1823@plc2.org keys: [3823] sites: [] +3829 1 user2-1824@plc2.org keys: [3824] sites: [] +3830 1 user2-1825@plc2.org keys: [3825] sites: [] +3831 1 user2-1826@plc2.org keys: [3826] sites: [] +3832 1 user2-1827@plc2.org keys: [3827] sites: [] +3833 1 user2-1828@plc2.org keys: [3828] sites: [] +3834 1 user2-1829@plc2.org keys: [3829] sites: [] +3835 1 user2-1830@plc2.org keys: [3830] sites: [] +3836 1 user2-1831@plc2.org keys: [3831] sites: [] +3837 1 user2-1832@plc2.org keys: [3832] sites: [] +3838 1 user2-1833@plc2.org keys: [3833] sites: [] +3839 1 user2-1834@plc2.org keys: [3834] sites: [] +3840 1 user2-1835@plc2.org keys: [3835] sites: [] +3841 1 user2-1836@plc2.org keys: [3836] sites: [] +3842 1 user2-1837@plc2.org keys: [3837] sites: [] +3843 1 user2-1838@plc2.org keys: [3838] sites: [] +3844 1 user2-1839@plc2.org keys: [3839] sites: [] +3845 1 user2-1840@plc2.org keys: [3840] sites: [] +3846 1 user2-1841@plc2.org keys: [3841] sites: [] +3847 1 user2-1842@plc2.org keys: [3842] sites: [] +3848 1 user2-1843@plc2.org keys: [3843] sites: [] +3849 1 user2-1844@plc2.org keys: [3844] sites: [] +3850 1 user2-1845@plc2.org keys: [3845] sites: [] +3851 1 user2-1846@plc2.org keys: [3846] sites: [] +3852 1 user2-1847@plc2.org keys: [3847] sites: [] +3853 1 user2-1848@plc2.org keys: [3848] sites: [] +3854 1 user2-1849@plc2.org keys: [3849] sites: [] +3855 1 user2-1850@plc2.org keys: [3850] sites: [] +3856 1 user2-1851@plc2.org keys: [3851] sites: [] +3857 1 user2-1852@plc2.org keys: [3852] sites: [] +3858 1 user2-1853@plc2.org keys: [3853] sites: [] +3859 1 user2-1854@plc2.org keys: [3854] sites: [] +3860 1 user2-1855@plc2.org keys: [3855] sites: [] +3861 1 user2-1856@plc2.org keys: [3856] sites: [] +3862 1 user2-1857@plc2.org keys: [3857] sites: [] +3863 1 user2-1858@plc2.org keys: [3858] sites: [] +3864 1 user2-1859@plc2.org keys: [3859] sites: [] +3865 1 user2-1860@plc2.org keys: [3860] sites: [] +3866 1 user2-1861@plc2.org keys: [3861] sites: [] +3867 1 user2-1862@plc2.org keys: [3862] sites: [] +3868 1 user2-1863@plc2.org keys: [3863] sites: [] +3869 1 user2-1864@plc2.org keys: [3864] sites: [] +3870 1 user2-1865@plc2.org keys: [3865] sites: [] +3871 1 user2-1866@plc2.org keys: [3866] sites: [] +3872 1 user2-1867@plc2.org keys: [3867] sites: [] +3873 1 user2-1868@plc2.org keys: [3868] sites: [] +3874 1 user2-1869@plc2.org keys: [3869] sites: [] +3875 1 user2-1870@plc2.org keys: [3870] sites: [] +3876 1 user2-1871@plc2.org keys: [3871] sites: [] +3877 1 user2-1872@plc2.org keys: [3872] sites: [] +3878 1 user2-1873@plc2.org keys: [3873] sites: [] +3879 1 user2-1874@plc2.org keys: [3874] sites: [] +3880 1 user2-1875@plc2.org keys: [3875] sites: [] +3881 1 user2-1876@plc2.org keys: [3876] sites: [] +3882 1 user2-1877@plc2.org keys: [3877] sites: [] +3883 1 user2-1878@plc2.org keys: [3878] sites: [] +3884 1 user2-1879@plc2.org keys: [3879] sites: [] +3885 1 user2-1880@plc2.org keys: [3880] sites: [] +3886 1 user2-1881@plc2.org keys: [3881] sites: [] +3887 1 user2-1882@plc2.org keys: [3882] sites: [] +3888 1 user2-1883@plc2.org keys: [3883] sites: [] +3889 1 user2-1884@plc2.org keys: [3884] sites: [] +3890 1 user2-1885@plc2.org keys: [3885] sites: [] +3891 1 user2-1886@plc2.org keys: [3886] sites: [] +3892 1 user2-1887@plc2.org keys: [3887] sites: [] +3893 1 user2-1888@plc2.org keys: [3888] sites: [] +3894 1 user2-1889@plc2.org keys: [3889] sites: [] +3895 1 user2-1890@plc2.org keys: [3890] sites: [] +3896 1 user2-1891@plc2.org keys: [3891] sites: [] +3897 1 user2-1892@plc2.org keys: [3892] sites: [] +3898 1 user2-1893@plc2.org keys: [3893] sites: [] +3899 1 user2-1894@plc2.org keys: [3894] sites: [] +3900 1 user2-1895@plc2.org keys: [3895] sites: [] +3901 1 user2-1896@plc2.org keys: [3896] sites: [] +3902 1 user2-1897@plc2.org keys: [3897] sites: [] +3903 1 user2-1898@plc2.org keys: [3898] sites: [] +3904 1 user2-1899@plc2.org keys: [3899] sites: [] +3905 1 user2-1900@plc2.org keys: [3900] sites: [] +3906 1 user2-1901@plc2.org keys: [3901] sites: [] +3907 1 user2-1902@plc2.org keys: [3902] sites: [] +3908 1 user2-1903@plc2.org keys: [3903] sites: [] +3909 1 user2-1904@plc2.org keys: [3904] sites: [] +3910 1 user2-1905@plc2.org keys: [3905] sites: [] +3911 1 user2-1906@plc2.org keys: [3906] sites: [] +3912 1 user2-1907@plc2.org keys: [3907] sites: [] +3913 1 user2-1908@plc2.org keys: [3908] sites: [] +3914 1 user2-1909@plc2.org keys: [3909] sites: [] +3915 1 user2-1910@plc2.org keys: [3910] sites: [] +3916 1 user2-1911@plc2.org keys: [3911] sites: [] +3917 1 user2-1912@plc2.org keys: [3912] sites: [] +3918 1 user2-1913@plc2.org keys: [3913] sites: [] +3919 1 user2-1914@plc2.org keys: [3914] sites: [] +3920 1 user2-1915@plc2.org keys: [3915] sites: [] +3921 1 user2-1916@plc2.org keys: [3916] sites: [] +3922 1 user2-1917@plc2.org keys: [3917] sites: [] +3923 1 user2-1918@plc2.org keys: [3918] sites: [] +3924 1 user2-1919@plc2.org keys: [3919] sites: [] +3925 1 user2-1920@plc2.org keys: [3920] sites: [] +3926 1 user2-1921@plc2.org keys: [3921] sites: [] +3927 1 user2-1922@plc2.org keys: [3922] sites: [] +3928 1 user2-1923@plc2.org keys: [3923] sites: [] +3929 1 user2-1924@plc2.org keys: [3924] sites: [] +3930 1 user2-1925@plc2.org keys: [3925] sites: [] +3931 1 user2-1926@plc2.org keys: [3926] sites: [] +3932 1 user2-1927@plc2.org keys: [3927] sites: [] +3933 1 user2-1928@plc2.org keys: [3928] sites: [] +3934 1 user2-1929@plc2.org keys: [3929] sites: [] +3935 1 user2-1930@plc2.org keys: [3930] sites: [] +3936 1 user2-1931@plc2.org keys: [3931] sites: [] +3937 1 user2-1932@plc2.org keys: [3932] sites: [] +3938 1 user2-1933@plc2.org keys: [3933] sites: [] +3939 1 user2-1934@plc2.org keys: [3934] sites: [] +3940 1 user2-1935@plc2.org keys: [3935] sites: [] +3941 1 user2-1936@plc2.org keys: [3936] sites: [] +3942 1 user2-1937@plc2.org keys: [3937] sites: [] +3943 1 user2-1938@plc2.org keys: [3938] sites: [] +3944 1 user2-1939@plc2.org keys: [3939] sites: [] +3945 1 user2-1940@plc2.org keys: [3940] sites: [] +3946 1 user2-1941@plc2.org keys: [3941] sites: [] +3947 1 user2-1942@plc2.org keys: [3942] sites: [] +3948 1 user2-1943@plc2.org keys: [3943] sites: [] +3949 1 user2-1944@plc2.org keys: [3944] sites: [] +3950 1 user2-1945@plc2.org keys: [3945] sites: [] +3951 1 user2-1946@plc2.org keys: [3946] sites: [] +3952 1 user2-1947@plc2.org keys: [3947] sites: [] +3953 1 user2-1948@plc2.org keys: [3948] sites: [] +3954 1 user2-1949@plc2.org keys: [3949] sites: [] +3955 1 user2-1950@plc2.org keys: [3950] sites: [] +3956 1 user2-1951@plc2.org keys: [3951] sites: [] +3957 1 user2-1952@plc2.org keys: [3952] sites: [] +3958 1 user2-1953@plc2.org keys: [3953] sites: [] +3959 1 user2-1954@plc2.org keys: [3954] sites: [] +3960 1 user2-1955@plc2.org keys: [3955] sites: [] +3961 1 user2-1956@plc2.org keys: [3956] sites: [] +3962 1 user2-1957@plc2.org keys: [3957] sites: [] +3963 1 user2-1958@plc2.org keys: [3958] sites: [] +3964 1 user2-1959@plc2.org keys: [3959] sites: [] +3965 1 user2-1960@plc2.org keys: [3960] sites: [] +3966 1 user2-1961@plc2.org keys: [3961] sites: [] +3967 1 user2-1962@plc2.org keys: [3962] sites: [] +3968 1 user2-1963@plc2.org keys: [3963] sites: [] +3969 1 user2-1964@plc2.org keys: [3964] sites: [] +3970 1 user2-1965@plc2.org keys: [3965] sites: [] +3971 1 user2-1966@plc2.org keys: [3966] sites: [] +3972 1 user2-1967@plc2.org keys: [3967] sites: [] +3973 1 user2-1968@plc2.org keys: [3968] sites: [] +3974 1 user2-1969@plc2.org keys: [3969] sites: [] +3975 1 user2-1970@plc2.org keys: [3970] sites: [] +3976 1 user2-1971@plc2.org keys: [3971] sites: [] +3977 1 user2-1972@plc2.org keys: [3972] sites: [] +3978 1 user2-1973@plc2.org keys: [3973] sites: [] +3979 1 user2-1974@plc2.org keys: [3974] sites: [] +3980 1 user2-1975@plc2.org keys: [3975] sites: [] +3981 1 user2-1976@plc2.org keys: [3976] sites: [] +3982 1 user2-1977@plc2.org keys: [3977] sites: [] +3983 1 user2-1978@plc2.org keys: [3978] sites: [] +3984 1 user2-1979@plc2.org keys: [3979] sites: [] +3985 1 user2-1980@plc2.org keys: [3980] sites: [] +3986 1 user2-1981@plc2.org keys: [3981] sites: [] +3987 1 user2-1982@plc2.org keys: [3982] sites: [] +3988 1 user2-1983@plc2.org keys: [3983] sites: [] +3989 1 user2-1984@plc2.org keys: [3984] sites: [] +3990 1 user2-1985@plc2.org keys: [3985] sites: [] +3991 1 user2-1986@plc2.org keys: [3986] sites: [] +3992 1 user2-1987@plc2.org keys: [3987] sites: [] +3993 1 user2-1988@plc2.org keys: [3988] sites: [] +3994 1 user2-1989@plc2.org keys: [3989] sites: [] +3995 1 user2-1990@plc2.org keys: [3990] sites: [] +3996 1 user2-1991@plc2.org keys: [3991] sites: [] +3997 1 user2-1992@plc2.org keys: [3992] sites: [] +3998 1 user2-1993@plc2.org keys: [3993] sites: [] +3999 1 user2-1994@plc2.org keys: [3994] sites: [] +4000 1 user2-1995@plc2.org keys: [3995] sites: [] +4001 1 user2-1996@plc2.org keys: [3996] sites: [] +4002 1 user2-1997@plc2.org keys: [3997] sites: [] +4003 1 user2-1998@plc2.org keys: [3998] sites: [] +4004 1 user2-1999@plc2.org keys: [3999] sites: [] +4005 1 user2-2000@plc2.org keys: [4000] sites: [] +01: NODES +1 None n1-001.plc1.org sls= [2] site= 2 +2 None n1-002.plc1.org sls= [2, 3] site= 3 +3 None n1-003.plc1.org sls= [2, 3, 4] site= 4 +4 None n1-004.plc1.org sls= [3, 4, 5] site= 5 +5 None n1-005.plc1.org sls= [4, 5, 6] site= 6 +6 None n1-006.plc1.org sls= [5, 6, 7] site= 7 +7 None n1-007.plc1.org sls= [6, 7, 8] site= 8 +8 None n1-008.plc1.org sls= [7, 8, 9] site= 9 +9 None n1-009.plc1.org sls= [8, 9, 10] site= 10 +10 None n1-010.plc1.org sls= [9, 10, 11] site= 11 +11 None n1-011.plc1.org sls= [10, 11, 12] site= 12 +12 None n1-012.plc1.org sls= [11, 12, 13] site= 13 +13 None n1-013.plc1.org sls= [12, 13, 14] site= 14 +14 None n1-014.plc1.org sls= [13, 14, 15] site= 15 +15 None n1-015.plc1.org sls= [14, 15, 16] site= 16 +16 None n1-016.plc1.org sls= [15, 16, 17] site= 17 +17 None n1-017.plc1.org sls= [16, 17, 18] site= 18 +18 None n1-018.plc1.org sls= [17, 18, 19] site= 19 +19 None n1-019.plc1.org sls= [18, 19, 20] site= 20 +20 None n1-020.plc1.org sls= [19, 20, 21] site= 21 +21 None n1-021.plc1.org sls= [20, 21, 22] site= 22 +22 None n1-022.plc1.org sls= [21, 22, 23] site= 23 +23 None n1-023.plc1.org sls= [22, 23, 24] site= 24 +24 None n1-024.plc1.org sls= [23, 24, 25] site= 25 +25 None n1-025.plc1.org sls= [24, 25, 26] site= 26 +26 None n1-026.plc1.org sls= [25, 26, 27] site= 27 +27 None n1-027.plc1.org sls= [26, 27, 28] site= 28 +28 None n1-028.plc1.org sls= [27, 28, 29] site= 29 +29 None n1-029.plc1.org sls= [28, 29, 30] site= 30 +30 None n1-030.plc1.org sls= [29, 30, 31] site= 31 +31 None n1-031.plc1.org sls= [30, 31, 32] site= 32 +32 None n1-032.plc1.org sls= [31, 32, 33] site= 33 +33 None n1-033.plc1.org sls= [32, 33, 34] site= 34 +34 None n1-034.plc1.org sls= [33, 34, 35] site= 35 +35 None n1-035.plc1.org sls= [34, 35, 36] site= 36 +36 None n1-036.plc1.org sls= [35, 36, 37] site= 37 +37 None n1-037.plc1.org sls= [36, 37, 38] site= 38 +38 None n1-038.plc1.org sls= [37, 38, 39] site= 39 +39 None n1-039.plc1.org sls= [38, 39, 40] site= 40 +40 None n1-040.plc1.org sls= [39, 40, 41] site= 41 +41 None n1-041.plc1.org sls= [40, 41, 42] site= 42 +42 None n1-042.plc1.org sls= [41, 42, 43] site= 43 +43 None n1-043.plc1.org sls= [42, 43, 44] site= 44 +44 None n1-044.plc1.org sls= [43, 44, 45] site= 45 +45 None n1-045.plc1.org sls= [44, 45, 46] site= 46 +46 None n1-046.plc1.org sls= [45, 46, 47] site= 47 +47 None n1-047.plc1.org sls= [46, 47, 48] site= 48 +48 None n1-048.plc1.org sls= [47, 48, 49] site= 49 +49 None n1-049.plc1.org sls= [48, 49, 50] site= 50 +50 None n1-050.plc1.org sls= [49, 50, 51] site= 51 +51 None n1-051.plc1.org sls= [50, 51, 52] site= 52 +52 None n1-052.plc1.org sls= [51, 52, 53] site= 53 +53 None n1-053.plc1.org sls= [52, 53, 54] site= 54 +54 None n1-054.plc1.org sls= [53, 54, 55] site= 55 +55 None n1-055.plc1.org sls= [54, 55, 56] site= 56 +56 None n1-056.plc1.org sls= [55, 56, 57] site= 57 +57 None n1-057.plc1.org sls= [56, 57, 58] site= 58 +58 None n1-058.plc1.org sls= [57, 58, 59] site= 59 +59 None n1-059.plc1.org sls= [58, 59, 60] site= 60 +60 None n1-060.plc1.org sls= [59, 60, 61] site= 61 +61 None n1-061.plc1.org sls= [60, 61, 62] site= 62 +62 None n1-062.plc1.org sls= [61, 62, 63] site= 63 +63 None n1-063.plc1.org sls= [62, 63, 64] site= 64 +64 None n1-064.plc1.org sls= [63, 64, 65] site= 65 +65 None n1-065.plc1.org sls= [64, 65, 66] site= 66 +66 None n1-066.plc1.org sls= [65, 66, 67] site= 67 +67 None n1-067.plc1.org sls= [66, 67, 68] site= 68 +68 None n1-068.plc1.org sls= [67, 68, 69] site= 69 +69 None n1-069.plc1.org sls= [68, 69, 70] site= 70 +70 None n1-070.plc1.org sls= [69, 70, 71] site= 71 +71 None n1-071.plc1.org sls= [70, 71, 72] site= 72 +72 None n1-072.plc1.org sls= [71, 72, 73] site= 73 +73 None n1-073.plc1.org sls= [72, 73, 74] site= 74 +74 None n1-074.plc1.org sls= [73, 74, 75] site= 75 +75 None n1-075.plc1.org sls= [74, 75, 76] site= 76 +76 None n1-076.plc1.org sls= [75, 76, 77] site= 77 +77 None n1-077.plc1.org sls= [76, 77, 78] site= 78 +78 None n1-078.plc1.org sls= [77, 78, 79] site= 79 +79 None n1-079.plc1.org sls= [78, 79, 80] site= 80 +80 None n1-080.plc1.org sls= [79, 80, 81] site= 81 +81 None n1-081.plc1.org sls= [80, 81, 82] site= 82 +82 None n1-082.plc1.org sls= [81, 82, 83] site= 83 +83 None n1-083.plc1.org sls= [82, 83, 84] site= 84 +84 None n1-084.plc1.org sls= [83, 84, 85] site= 85 +85 None n1-085.plc1.org sls= [84, 85, 86] site= 86 +86 None n1-086.plc1.org sls= [85, 86, 87] site= 87 +87 None n1-087.plc1.org sls= [86, 87, 88] site= 88 +88 None n1-088.plc1.org sls= [87, 88, 89] site= 89 +89 None n1-089.plc1.org sls= [88, 89, 90] site= 90 +90 None n1-090.plc1.org sls= [89, 90, 91] site= 91 +91 None n1-091.plc1.org sls= [90, 91, 92] site= 92 +92 None n1-092.plc1.org sls= [91, 92, 93] site= 93 +93 None n1-093.plc1.org sls= [92, 93, 94] site= 94 +94 None n1-094.plc1.org sls= [93, 94, 95] site= 95 +95 None n1-095.plc1.org sls= [94, 95, 96] site= 96 +96 None n1-096.plc1.org sls= [95, 96, 97] site= 97 +97 None n1-097.plc1.org sls= [96, 97, 98] site= 98 +98 None n1-098.plc1.org sls= [97, 98, 99] site= 99 +99 None n1-099.plc1.org sls= [98, 99, 100] site= 100 +100 None n1-100.plc1.org sls= [99, 100, 101] site= 101 +101 None n1-101.plc1.org sls= [100, 101, 102] site= 102 +102 None n1-102.plc1.org sls= [101, 102, 103] site= 103 +103 None n1-103.plc1.org sls= [102, 103, 104] site= 104 +104 None n1-104.plc1.org sls= [103, 104, 105] site= 105 +105 None n1-105.plc1.org sls= [104, 105, 106] site= 106 +106 None n1-106.plc1.org sls= [105, 106, 107] site= 107 +107 None n1-107.plc1.org sls= [106, 107, 108] site= 108 +108 None n1-108.plc1.org sls= [107, 108, 109] site= 109 +109 None n1-109.plc1.org sls= [108, 109, 110] site= 110 +110 None n1-110.plc1.org sls= [109, 110, 111] site= 111 +111 None n1-111.plc1.org sls= [110, 111, 112] site= 112 +112 None n1-112.plc1.org sls= [111, 112, 113] site= 113 +113 None n1-113.plc1.org sls= [112, 113, 114] site= 114 +114 None n1-114.plc1.org sls= [113, 114, 115] site= 115 +115 None n1-115.plc1.org sls= [114, 115, 116] site= 116 +116 None n1-116.plc1.org sls= [115, 116, 117] site= 117 +117 None n1-117.plc1.org sls= [116, 117, 118] site= 118 +118 None n1-118.plc1.org sls= [117, 118, 119] site= 119 +119 None n1-119.plc1.org sls= [118, 119, 120] site= 120 +120 None n1-120.plc1.org sls= [119, 120, 121] site= 121 +121 None n1-121.plc1.org sls= [120, 121, 122] site= 122 +122 None n1-122.plc1.org sls= [121, 122, 123] site= 123 +123 None n1-123.plc1.org sls= [122, 123, 124] site= 124 +124 None n1-124.plc1.org sls= [123, 124, 125] site= 125 +125 None n1-125.plc1.org sls= [124, 125, 126] site= 126 +126 None n1-126.plc1.org sls= [125, 126, 127] site= 127 +127 None n1-127.plc1.org sls= [126, 127, 128] site= 128 +128 None n1-128.plc1.org sls= [127, 128, 129] site= 129 +129 None n1-129.plc1.org sls= [128, 129, 130] site= 130 +130 None n1-130.plc1.org sls= [129, 130, 131] site= 131 +131 None n1-131.plc1.org sls= [130, 131, 132] site= 132 +132 None n1-132.plc1.org sls= [131, 132, 133] site= 133 +133 None n1-133.plc1.org sls= [132, 133, 134] site= 134 +134 None n1-134.plc1.org sls= [133, 134, 135] site= 135 +135 None n1-135.plc1.org sls= [134, 135, 136] site= 136 +136 None n1-136.plc1.org sls= [135, 136, 137] site= 137 +137 None n1-137.plc1.org sls= [136, 137, 138] site= 138 +138 None n1-138.plc1.org sls= [137, 138, 139] site= 139 +139 None n1-139.plc1.org sls= [138, 139, 140] site= 140 +140 None n1-140.plc1.org sls= [139, 140, 141] site= 141 +141 None n1-141.plc1.org sls= [140, 141, 142] site= 142 +142 None n1-142.plc1.org sls= [141, 142, 143] site= 143 +143 None n1-143.plc1.org sls= [142, 143, 144] site= 144 +144 None n1-144.plc1.org sls= [143, 144, 145] site= 145 +145 None n1-145.plc1.org sls= [144, 145, 146] site= 146 +146 None n1-146.plc1.org sls= [145, 146, 147] site= 147 +147 None n1-147.plc1.org sls= [146, 147, 148] site= 148 +148 None n1-148.plc1.org sls= [147, 148, 149] site= 149 +149 None n1-149.plc1.org sls= [148, 149, 150] site= 150 +150 None n1-150.plc1.org sls= [149, 150, 151] site= 151 +151 None n1-151.plc1.org sls= [150, 151, 152] site= 152 +152 None n1-152.plc1.org sls= [151, 152, 153] site= 153 +153 None n1-153.plc1.org sls= [152, 153, 154] site= 154 +154 None n1-154.plc1.org sls= [153, 154, 155] site= 155 +155 None n1-155.plc1.org sls= [154, 155, 156] site= 156 +156 None n1-156.plc1.org sls= [155, 156, 157] site= 157 +157 None n1-157.plc1.org sls= [156, 157, 158] site= 158 +158 None n1-158.plc1.org sls= [157, 158, 159] site= 159 +159 None n1-159.plc1.org sls= [158, 159, 160] site= 160 +160 None n1-160.plc1.org sls= [159, 160, 161] site= 161 +161 None n1-161.plc1.org sls= [160, 161, 162] site= 162 +162 None n1-162.plc1.org sls= [161, 162, 163] site= 163 +163 None n1-163.plc1.org sls= [162, 163, 164] site= 164 +164 None n1-164.plc1.org sls= [163, 164, 165] site= 165 +165 None n1-165.plc1.org sls= [164, 165, 166] site= 166 +166 None n1-166.plc1.org sls= [165, 166, 167] site= 167 +167 None n1-167.plc1.org sls= [166, 167, 168] site= 168 +168 None n1-168.plc1.org sls= [167, 168, 169] site= 169 +169 None n1-169.plc1.org sls= [168, 169, 170] site= 170 +170 None n1-170.plc1.org sls= [169, 170, 171] site= 171 +171 None n1-171.plc1.org sls= [170, 171, 172] site= 172 +172 None n1-172.plc1.org sls= [171, 172, 173] site= 173 +173 None n1-173.plc1.org sls= [172, 173, 174] site= 174 +174 None n1-174.plc1.org sls= [173, 174, 175] site= 175 +175 None n1-175.plc1.org sls= [174, 175, 176] site= 176 +176 None n1-176.plc1.org sls= [175, 176, 177] site= 177 +177 None n1-177.plc1.org sls= [176, 177, 178] site= 178 +178 None n1-178.plc1.org sls= [177, 178, 179] site= 179 +179 None n1-179.plc1.org sls= [178, 179, 180] site= 180 +180 None n1-180.plc1.org sls= [179, 180, 181] site= 181 +181 None n1-181.plc1.org sls= [180, 181, 182] site= 182 +182 None n1-182.plc1.org sls= [181, 182, 183] site= 183 +183 None n1-183.plc1.org sls= [182, 183, 184] site= 184 +184 None n1-184.plc1.org sls= [183, 184, 185] site= 185 +185 None n1-185.plc1.org sls= [184, 185, 186] site= 186 +186 None n1-186.plc1.org sls= [185, 186, 187] site= 187 +187 None n1-187.plc1.org sls= [186, 187, 188] site= 188 +188 None n1-188.plc1.org sls= [187, 188, 189] site= 189 +189 None n1-189.plc1.org sls= [188, 189, 190] site= 190 +190 None n1-190.plc1.org sls= [189, 190, 191] site= 191 +191 None n1-191.plc1.org sls= [190, 191, 192] site= 192 +192 None n1-192.plc1.org sls= [191, 192, 193] site= 193 +193 None n1-193.plc1.org sls= [192, 193, 194] site= 194 +194 None n1-194.plc1.org sls= [193, 194, 195] site= 195 +195 None n1-195.plc1.org sls= [194, 195, 196] site= 196 +196 None n1-196.plc1.org sls= [195, 196, 197] site= 197 +197 None n1-197.plc1.org sls= [196, 197, 198] site= 198 +198 None n1-198.plc1.org sls= [197, 198, 199] site= 199 +199 None n1-199.plc1.org sls= [198, 199, 200] site= 200 +200 None n1-200.plc1.org sls= [199, 200, 201] site= 201 +201 None n1-201.plc1.org sls= [200, 201, 202] site= 202 +202 None n1-202.plc1.org sls= [201, 202, 203] site= 203 +203 None n1-203.plc1.org sls= [202, 203, 204] site= 204 +204 None n1-204.plc1.org sls= [203, 204, 205] site= 205 +205 None n1-205.plc1.org sls= [204, 205, 206] site= 206 +206 None n1-206.plc1.org sls= [205, 206, 207] site= 207 +207 None n1-207.plc1.org sls= [206, 207, 208] site= 208 +208 None n1-208.plc1.org sls= [207, 208, 209] site= 209 +209 None n1-209.plc1.org sls= [208, 209, 210] site= 210 +210 None n1-210.plc1.org sls= [209, 210, 211] site= 211 +211 None n1-211.plc1.org sls= [210, 211, 212] site= 212 +212 None n1-212.plc1.org sls= [211, 212, 213] site= 213 +213 None n1-213.plc1.org sls= [212, 213, 214] site= 214 +214 None n1-214.plc1.org sls= [213, 214, 215] site= 215 +215 None n1-215.plc1.org sls= [214, 215, 216] site= 216 +216 None n1-216.plc1.org sls= [215, 216, 217] site= 217 +217 None n1-217.plc1.org sls= [216, 217, 218] site= 218 +218 None n1-218.plc1.org sls= [217, 218, 219] site= 219 +219 None n1-219.plc1.org sls= [218, 219, 220] site= 220 +220 None n1-220.plc1.org sls= [219, 220, 221] site= 221 +221 None n1-221.plc1.org sls= [220, 221, 222] site= 222 +222 None n1-222.plc1.org sls= [221, 222, 223] site= 223 +223 None n1-223.plc1.org sls= [222, 223, 224] site= 224 +224 None n1-224.plc1.org sls= [223, 224, 225] site= 225 +225 None n1-225.plc1.org sls= [224, 225, 226] site= 226 +226 None n1-226.plc1.org sls= [225, 226, 227] site= 227 +227 None n1-227.plc1.org sls= [226, 227, 228] site= 228 +228 None n1-228.plc1.org sls= [227, 228, 229] site= 229 +229 None n1-229.plc1.org sls= [228, 229, 230] site= 230 +230 None n1-230.plc1.org sls= [229, 230, 231] site= 231 +231 None n1-231.plc1.org sls= [230, 231, 232] site= 232 +232 None n1-232.plc1.org sls= [231, 232, 233] site= 233 +233 None n1-233.plc1.org sls= [232, 233, 234] site= 234 +234 None n1-234.plc1.org sls= [233, 234, 235] site= 235 +235 None n1-235.plc1.org sls= [234, 235, 236] site= 236 +236 None n1-236.plc1.org sls= [235, 236, 237] site= 237 +237 None n1-237.plc1.org sls= [236, 237, 238] site= 238 +238 None n1-238.plc1.org sls= [237, 238, 239] site= 239 +239 None n1-239.plc1.org sls= [238, 239, 240] site= 240 +240 None n1-240.plc1.org sls= [239, 240, 241] site= 241 +241 None n1-241.plc1.org sls= [240, 241, 242] site= 242 +242 None n1-242.plc1.org sls= [241, 242, 243] site= 243 +243 None n1-243.plc1.org sls= [242, 243, 244] site= 244 +244 None n1-244.plc1.org sls= [243, 244, 245] site= 245 +245 None n1-245.plc1.org sls= [244, 245, 246] site= 246 +246 None n1-246.plc1.org sls= [245, 246, 247] site= 247 +247 None n1-247.plc1.org sls= [246, 247, 248] site= 248 +248 None n1-248.plc1.org sls= [247, 248, 249] site= 249 +249 None n1-249.plc1.org sls= [248, 249, 250] site= 250 +250 None n1-250.plc1.org sls= [249, 250, 251] site= 251 +251 None n1-251.plc1.org sls= [250, 251, 252] site= 252 +252 None n1-252.plc1.org sls= [251, 252, 253] site= 253 +253 None n1-253.plc1.org sls= [252, 253, 254] site= 254 +254 None n1-254.plc1.org sls= [253, 254, 255] site= 255 +255 None n1-255.plc1.org sls= [254, 255, 256] site= 256 +256 None n1-256.plc1.org sls= [255, 256, 257] site= 257 +257 None n1-257.plc1.org sls= [256, 257, 258] site= 258 +258 None n1-258.plc1.org sls= [257, 258, 259] site= 259 +259 None n1-259.plc1.org sls= [258, 259, 260] site= 260 +260 None n1-260.plc1.org sls= [259, 260, 261] site= 261 +261 None n1-261.plc1.org sls= [260, 261, 262] site= 262 +262 None n1-262.plc1.org sls= [261, 262, 263] site= 263 +263 None n1-263.plc1.org sls= [262, 263, 264] site= 264 +264 None n1-264.plc1.org sls= [263, 264, 265] site= 265 +265 None n1-265.plc1.org sls= [264, 265, 266] site= 266 +266 None n1-266.plc1.org sls= [265, 266, 267] site= 267 +267 None n1-267.plc1.org sls= [266, 267, 268] site= 268 +268 None n1-268.plc1.org sls= [267, 268, 269] site= 269 +269 None n1-269.plc1.org sls= [268, 269, 270] site= 270 +270 None n1-270.plc1.org sls= [269, 270, 271] site= 271 +271 None n1-271.plc1.org sls= [270, 271, 272] site= 272 +272 None n1-272.plc1.org sls= [271, 272, 273] site= 273 +273 None n1-273.plc1.org sls= [272, 273, 274] site= 274 +274 None n1-274.plc1.org sls= [273, 274, 275] site= 275 +275 None n1-275.plc1.org sls= [274, 275, 276] site= 276 +276 None n1-276.plc1.org sls= [275, 276, 277] site= 277 +277 None n1-277.plc1.org sls= [276, 277, 278] site= 278 +278 None n1-278.plc1.org sls= [277, 278, 279] site= 279 +279 None n1-279.plc1.org sls= [278, 279, 280] site= 280 +280 None n1-280.plc1.org sls= [279, 280, 281] site= 281 +281 None n1-281.plc1.org sls= [280, 281, 282] site= 282 +282 None n1-282.plc1.org sls= [281, 282, 283] site= 283 +283 None n1-283.plc1.org sls= [282, 283, 284] site= 284 +284 None n1-284.plc1.org sls= [283, 284, 285] site= 285 +285 None n1-285.plc1.org sls= [284, 285, 286] site= 286 +286 None n1-286.plc1.org sls= [285, 286, 287] site= 287 +287 None n1-287.plc1.org sls= [286, 287, 288] site= 288 +288 None n1-288.plc1.org sls= [287, 288, 289] site= 289 +289 None n1-289.plc1.org sls= [288, 289, 290] site= 290 +290 None n1-290.plc1.org sls= [289, 290, 291] site= 291 +291 None n1-291.plc1.org sls= [290, 291, 292] site= 292 +292 None n1-292.plc1.org sls= [291, 292, 293] site= 293 +293 None n1-293.plc1.org sls= [292, 293, 294] site= 294 +294 None n1-294.plc1.org sls= [293, 294, 295] site= 295 +295 None n1-295.plc1.org sls= [294, 295, 296] site= 296 +296 None n1-296.plc1.org sls= [295, 296, 297] site= 297 +297 None n1-297.plc1.org sls= [296, 297, 298] site= 298 +298 None n1-298.plc1.org sls= [297, 298, 299] site= 299 +299 None n1-299.plc1.org sls= [298, 299, 300] site= 300 +300 None n1-300.plc1.org sls= [299, 300, 301] site= 301 +301 None n1-301.plc1.org sls= [300, 301, 302] site= 302 +302 None n1-302.plc1.org sls= [301, 302, 303] site= 303 +303 None n1-303.plc1.org sls= [302, 303, 304] site= 304 +304 None n1-304.plc1.org sls= [303, 304, 305] site= 305 +305 None n1-305.plc1.org sls= [304, 305, 306] site= 306 +306 None n1-306.plc1.org sls= [305, 306, 307] site= 307 +307 None n1-307.plc1.org sls= [306, 307, 308] site= 308 +308 None n1-308.plc1.org sls= [307, 308, 309] site= 309 +309 None n1-309.plc1.org sls= [308, 309, 310] site= 310 +310 None n1-310.plc1.org sls= [309, 310, 311] site= 311 +311 None n1-311.plc1.org sls= [310, 311, 312] site= 312 +312 None n1-312.plc1.org sls= [311, 312, 313] site= 313 +313 None n1-313.plc1.org sls= [312, 313, 314] site= 314 +314 None n1-314.plc1.org sls= [313, 314, 315] site= 315 +315 None n1-315.plc1.org sls= [314, 315, 316] site= 316 +316 None n1-316.plc1.org sls= [315, 316, 317] site= 317 +317 None n1-317.plc1.org sls= [316, 317, 318] site= 318 +318 None n1-318.plc1.org sls= [317, 318, 319] site= 319 +319 None n1-319.plc1.org sls= [318, 319, 320] site= 320 +320 None n1-320.plc1.org sls= [319, 320, 321] site= 321 +321 None n1-321.plc1.org sls= [320, 321, 322] site= 322 +322 None n1-322.plc1.org sls= [321, 322, 323] site= 323 +323 None n1-323.plc1.org sls= [322, 323, 324] site= 324 +324 None n1-324.plc1.org sls= [323, 324, 325] site= 325 +325 None n1-325.plc1.org sls= [324, 325, 326] site= 326 +326 None n1-326.plc1.org sls= [325, 326, 327] site= 327 +327 None n1-327.plc1.org sls= [326, 327, 328] site= 328 +328 None n1-328.plc1.org sls= [327, 328, 329] site= 329 +329 None n1-329.plc1.org sls= [328, 329, 330] site= 330 +330 None n1-330.plc1.org sls= [329, 330, 331] site= 331 +331 None n1-331.plc1.org sls= [330, 331, 332] site= 332 +332 None n1-332.plc1.org sls= [331, 332, 333] site= 333 +333 None n1-333.plc1.org sls= [332, 333, 334] site= 334 +334 None n1-334.plc1.org sls= [333, 334, 335] site= 335 +335 None n1-335.plc1.org sls= [334, 335, 336] site= 336 +336 None n1-336.plc1.org sls= [335, 336, 337] site= 337 +337 None n1-337.plc1.org sls= [336, 337, 338] site= 338 +338 None n1-338.plc1.org sls= [337, 338, 339] site= 339 +339 None n1-339.plc1.org sls= [338, 339, 340] site= 340 +340 None n1-340.plc1.org sls= [339, 340, 341] site= 341 +341 None n1-341.plc1.org sls= [340, 341, 342] site= 342 +342 None n1-342.plc1.org sls= [341, 342, 343] site= 343 +343 None n1-343.plc1.org sls= [342, 343, 344] site= 344 +344 None n1-344.plc1.org sls= [343, 344, 345] site= 345 +345 None n1-345.plc1.org sls= [344, 345, 346] site= 346 +346 None n1-346.plc1.org sls= [345, 346, 347] site= 347 +347 None n1-347.plc1.org sls= [346, 347, 348] site= 348 +348 None n1-348.plc1.org sls= [347, 348, 349] site= 349 +349 None n1-349.plc1.org sls= [348, 349, 350] site= 350 +350 None n1-350.plc1.org sls= [349, 350, 351] site= 351 +351 None n1-351.plc1.org sls= [350, 351, 352] site= 352 +352 None n1-352.plc1.org sls= [351, 352, 353] site= 353 +353 None n1-353.plc1.org sls= [352, 353, 354] site= 354 +354 None n1-354.plc1.org sls= [353, 354, 355] site= 355 +355 None n1-355.plc1.org sls= [354, 355, 356] site= 356 +356 None n1-356.plc1.org sls= [355, 356, 357] site= 357 +357 None n1-357.plc1.org sls= [356, 357, 358] site= 358 +358 None n1-358.plc1.org sls= [357, 358, 359] site= 359 +359 None n1-359.plc1.org sls= [358, 359, 360] site= 360 +360 None n1-360.plc1.org sls= [359, 360, 361] site= 361 +361 None n1-361.plc1.org sls= [360, 361, 362] site= 362 +362 None n1-362.plc1.org sls= [361, 362, 363] site= 363 +363 None n1-363.plc1.org sls= [362, 363, 364] site= 364 +364 None n1-364.plc1.org sls= [363, 364, 365] site= 365 +365 None n1-365.plc1.org sls= [364, 365, 366] site= 366 +366 None n1-366.plc1.org sls= [365, 366, 367] site= 367 +367 None n1-367.plc1.org sls= [366, 367, 368] site= 368 +368 None n1-368.plc1.org sls= [367, 368, 369] site= 369 +369 None n1-369.plc1.org sls= [368, 369, 370] site= 370 +370 None n1-370.plc1.org sls= [369, 370, 371] site= 371 +371 None n1-371.plc1.org sls= [370, 371, 372] site= 372 +372 None n1-372.plc1.org sls= [371, 372, 373] site= 373 +373 None n1-373.plc1.org sls= [372, 373, 374] site= 374 +374 None n1-374.plc1.org sls= [373, 374, 375] site= 375 +375 None n1-375.plc1.org sls= [374, 375, 376] site= 376 +376 None n1-376.plc1.org sls= [375, 376, 377] site= 377 +377 None n1-377.plc1.org sls= [376, 377, 378] site= 378 +378 None n1-378.plc1.org sls= [377, 378, 379] site= 379 +379 None n1-379.plc1.org sls= [378, 379, 380] site= 380 +380 None n1-380.plc1.org sls= [379, 380, 381] site= 381 +381 None n1-381.plc1.org sls= [380, 381, 382] site= 382 +382 None n1-382.plc1.org sls= [381, 382, 383] site= 383 +383 None n1-383.plc1.org sls= [382, 383, 384] site= 384 +384 None n1-384.plc1.org sls= [383, 384, 385] site= 385 +385 None n1-385.plc1.org sls= [384, 385, 386] site= 386 +386 None n1-386.plc1.org sls= [385, 386, 387] site= 387 +387 None n1-387.plc1.org sls= [386, 387, 388] site= 388 +388 None n1-388.plc1.org sls= [387, 388, 389] site= 389 +389 None n1-389.plc1.org sls= [388, 389, 390] site= 390 +390 None n1-390.plc1.org sls= [389, 390, 391] site= 391 +391 None n1-391.plc1.org sls= [390, 391, 392] site= 392 +392 None n1-392.plc1.org sls= [391, 392, 393] site= 393 +393 None n1-393.plc1.org sls= [392, 393, 394] site= 394 +394 None n1-394.plc1.org sls= [393, 394, 395] site= 395 +395 None n1-395.plc1.org sls= [394, 395, 396] site= 396 +396 None n1-396.plc1.org sls= [395, 396, 397] site= 397 +397 None n1-397.plc1.org sls= [396, 397, 398] site= 398 +398 None n1-398.plc1.org sls= [397, 398, 399] site= 399 +399 None n1-399.plc1.org sls= [398, 399, 400] site= 400 +400 None n1-400.plc1.org sls= [399, 400, 401] site= 401 +401 None n1-401.plc1.org sls= [400, 401, 402] site= 402 +402 None n1-402.plc1.org sls= [401, 402, 403] site= 403 +403 None n1-403.plc1.org sls= [402, 403, 404] site= 404 +404 None n1-404.plc1.org sls= [403, 404, 405] site= 405 +405 None n1-405.plc1.org sls= [404, 405, 406] site= 406 +406 None n1-406.plc1.org sls= [405, 406, 407] site= 407 +407 None n1-407.plc1.org sls= [406, 407, 408] site= 408 +408 None n1-408.plc1.org sls= [407, 408, 409] site= 409 +409 None n1-409.plc1.org sls= [408, 409, 410] site= 410 +410 None n1-410.plc1.org sls= [409, 410, 411] site= 411 +411 None n1-411.plc1.org sls= [410, 411, 412] site= 412 +412 None n1-412.plc1.org sls= [411, 412, 413] site= 413 +413 None n1-413.plc1.org sls= [412, 413, 414] site= 414 +414 None n1-414.plc1.org sls= [413, 414, 415] site= 415 +415 None n1-415.plc1.org sls= [414, 415, 416] site= 416 +416 None n1-416.plc1.org sls= [415, 416, 417] site= 417 +417 None n1-417.plc1.org sls= [416, 417, 418] site= 418 +418 None n1-418.plc1.org sls= [417, 418, 419] site= 419 +419 None n1-419.plc1.org sls= [418, 419, 420] site= 420 +420 None n1-420.plc1.org sls= [419, 420, 421] site= 421 +421 None n1-421.plc1.org sls= [420, 421, 422] site= 422 +422 None n1-422.plc1.org sls= [421, 422, 423] site= 423 +423 None n1-423.plc1.org sls= [422, 423, 424] site= 424 +424 None n1-424.plc1.org sls= [423, 424, 425] site= 425 +425 None n1-425.plc1.org sls= [424, 425, 426] site= 426 +426 None n1-426.plc1.org sls= [425, 426, 427] site= 427 +427 None n1-427.plc1.org sls= [426, 427, 428] site= 428 +428 None n1-428.plc1.org sls= [427, 428, 429] site= 429 +429 None n1-429.plc1.org sls= [428, 429, 430] site= 430 +430 None n1-430.plc1.org sls= [429, 430, 431] site= 431 +431 None n1-431.plc1.org sls= [430, 431, 432] site= 432 +432 None n1-432.plc1.org sls= [431, 432, 433] site= 433 +433 None n1-433.plc1.org sls= [432, 433, 434] site= 434 +434 None n1-434.plc1.org sls= [433, 434, 435] site= 435 +435 None n1-435.plc1.org sls= [434, 435, 436] site= 436 +436 None n1-436.plc1.org sls= [435, 436, 437] site= 437 +437 None n1-437.plc1.org sls= [436, 437, 438] site= 438 +438 None n1-438.plc1.org sls= [437, 438, 439] site= 439 +439 None n1-439.plc1.org sls= [438, 439, 440] site= 440 +440 None n1-440.plc1.org sls= [439, 440, 441] site= 441 +441 None n1-441.plc1.org sls= [440, 441, 442] site= 442 +442 None n1-442.plc1.org sls= [441, 442, 443] site= 443 +443 None n1-443.plc1.org sls= [442, 443, 444] site= 444 +444 None n1-444.plc1.org sls= [443, 444, 445] site= 445 +445 None n1-445.plc1.org sls= [444, 445, 446] site= 446 +446 None n1-446.plc1.org sls= [445, 446, 447] site= 447 +447 None n1-447.plc1.org sls= [446, 447, 448] site= 448 +448 None n1-448.plc1.org sls= [447, 448, 449] site= 449 +449 None n1-449.plc1.org sls= [448, 449, 450] site= 450 +450 None n1-450.plc1.org sls= [449, 450, 451] site= 451 +451 None n1-451.plc1.org sls= [450, 451, 452] site= 452 +452 None n1-452.plc1.org sls= [451, 452, 453] site= 453 +453 None n1-453.plc1.org sls= [452, 453, 454] site= 454 +454 None n1-454.plc1.org sls= [453, 454, 455] site= 455 +455 None n1-455.plc1.org sls= [454, 455, 456] site= 456 +456 None n1-456.plc1.org sls= [455, 456, 457] site= 457 +457 None n1-457.plc1.org sls= [456, 457, 458] site= 458 +458 None n1-458.plc1.org sls= [457, 458, 459] site= 459 +459 None n1-459.plc1.org sls= [458, 459, 460] site= 460 +460 None n1-460.plc1.org sls= [459, 460, 461] site= 461 +461 None n1-461.plc1.org sls= [460, 461, 462] site= 462 +462 None n1-462.plc1.org sls= [461, 462, 463] site= 463 +463 None n1-463.plc1.org sls= [462, 463, 464] site= 464 +464 None n1-464.plc1.org sls= [463, 464, 465] site= 465 +465 None n1-465.plc1.org sls= [464, 465, 466] site= 466 +466 None n1-466.plc1.org sls= [465, 466, 467] site= 467 +467 None n1-467.plc1.org sls= [466, 467, 468] site= 468 +468 None n1-468.plc1.org sls= [467, 468, 469] site= 469 +469 None n1-469.plc1.org sls= [468, 469, 470] site= 470 +470 None n1-470.plc1.org sls= [469, 470, 471] site= 471 +471 None n1-471.plc1.org sls= [470, 471, 472] site= 472 +472 None n1-472.plc1.org sls= [471, 472, 473] site= 473 +473 None n1-473.plc1.org sls= [472, 473, 474] site= 474 +474 None n1-474.plc1.org sls= [473, 474, 475] site= 475 +475 None n1-475.plc1.org sls= [474, 475, 476] site= 476 +476 None n1-476.plc1.org sls= [475, 476, 477] site= 477 +477 None n1-477.plc1.org sls= [476, 477, 478] site= 478 +478 None n1-478.plc1.org sls= [477, 478, 479] site= 479 +479 None n1-479.plc1.org sls= [478, 479, 480] site= 480 +480 None n1-480.plc1.org sls= [479, 480, 481] site= 481 +481 None n1-481.plc1.org sls= [480, 481, 482] site= 482 +482 None n1-482.plc1.org sls= [481, 482, 483] site= 483 +483 None n1-483.plc1.org sls= [482, 483, 484] site= 484 +484 None n1-484.plc1.org sls= [483, 484, 485] site= 485 +485 None n1-485.plc1.org sls= [484, 485, 486] site= 486 +486 None n1-486.plc1.org sls= [485, 486, 487] site= 487 +487 None n1-487.plc1.org sls= [486, 487, 488] site= 488 +488 None n1-488.plc1.org sls= [487, 488, 489] site= 489 +489 None n1-489.plc1.org sls= [488, 489, 490] site= 490 +490 None n1-490.plc1.org sls= [489, 490, 491] site= 491 +491 None n1-491.plc1.org sls= [490, 491, 492] site= 492 +492 None n1-492.plc1.org sls= [491, 492, 493] site= 493 +493 None n1-493.plc1.org sls= [492, 493, 494] site= 494 +494 None n1-494.plc1.org sls= [493, 494, 495] site= 495 +495 None n1-495.plc1.org sls= [494, 495, 496] site= 496 +496 None n1-496.plc1.org sls= [495, 496, 497] site= 497 +497 None n1-497.plc1.org sls= [496, 497, 498] site= 498 +498 None n1-498.plc1.org sls= [497, 498, 499] site= 499 +499 None n1-499.plc1.org sls= [498, 499, 500] site= 500 +500 None n1-500.plc1.org sls= [499, 500, 501] site= 501 +501 None n1-501.plc1.org sls= [500, 501, 502] site= 502 +502 None n1-502.plc1.org sls= [501, 502, 503] site= 503 +503 None n1-503.plc1.org sls= [502, 503, 504] site= 504 +504 None n1-504.plc1.org sls= [503, 504, 505] site= 505 +505 None n1-505.plc1.org sls= [504, 505, 506] site= 506 +506 None n1-506.plc1.org sls= [505, 506, 507] site= 507 +507 None n1-507.plc1.org sls= [506, 507, 508] site= 508 +508 None n1-508.plc1.org sls= [507, 508, 509] site= 509 +509 None n1-509.plc1.org sls= [508, 509, 510] site= 510 +510 None n1-510.plc1.org sls= [509, 510, 511] site= 511 +511 None n1-511.plc1.org sls= [510, 511, 512] site= 512 +512 None n1-512.plc1.org sls= [511, 512, 513] site= 513 +513 None n1-513.plc1.org sls= [512, 513, 514] site= 514 +514 None n1-514.plc1.org sls= [513, 514, 515] site= 515 +515 None n1-515.plc1.org sls= [514, 515, 516] site= 516 +516 None n1-516.plc1.org sls= [515, 516, 517] site= 517 +517 None n1-517.plc1.org sls= [516, 517, 518] site= 518 +518 None n1-518.plc1.org sls= [517, 518, 519] site= 519 +519 None n1-519.plc1.org sls= [518, 519, 520] site= 520 +520 None n1-520.plc1.org sls= [519, 520, 521] site= 521 +521 None n1-521.plc1.org sls= [520, 521, 522] site= 522 +522 None n1-522.plc1.org sls= [521, 522, 523] site= 523 +523 None n1-523.plc1.org sls= [522, 523, 524] site= 524 +524 None n1-524.plc1.org sls= [523, 524, 525] site= 525 +525 None n1-525.plc1.org sls= [524, 525, 526] site= 526 +526 None n1-526.plc1.org sls= [525, 526, 527] site= 527 +527 None n1-527.plc1.org sls= [526, 527, 528] site= 528 +528 None n1-528.plc1.org sls= [527, 528, 529] site= 529 +529 None n1-529.plc1.org sls= [528, 529, 530] site= 530 +530 None n1-530.plc1.org sls= [529, 530, 531] site= 531 +531 None n1-531.plc1.org sls= [530, 531, 532] site= 532 +532 None n1-532.plc1.org sls= [531, 532, 533] site= 533 +533 None n1-533.plc1.org sls= [532, 533, 534] site= 534 +534 None n1-534.plc1.org sls= [533, 534, 535] site= 535 +535 None n1-535.plc1.org sls= [534, 535, 536] site= 536 +536 None n1-536.plc1.org sls= [535, 536, 537] site= 537 +537 None n1-537.plc1.org sls= [536, 537, 538] site= 538 +538 None n1-538.plc1.org sls= [537, 538, 539] site= 539 +539 None n1-539.plc1.org sls= [538, 539, 540] site= 540 +540 None n1-540.plc1.org sls= [539, 540, 541] site= 541 +541 None n1-541.plc1.org sls= [540, 541, 542] site= 542 +542 None n1-542.plc1.org sls= [541, 542, 543] site= 543 +543 None n1-543.plc1.org sls= [542, 543, 544] site= 544 +544 None n1-544.plc1.org sls= [543, 544, 545] site= 545 +545 None n1-545.plc1.org sls= [544, 545, 546] site= 546 +546 None n1-546.plc1.org sls= [545, 546, 547] site= 547 +547 None n1-547.plc1.org sls= [546, 547, 548] site= 548 +548 None n1-548.plc1.org sls= [547, 548, 549] site= 549 +549 None n1-549.plc1.org sls= [548, 549, 550] site= 550 +550 None n1-550.plc1.org sls= [549, 550, 551] site= 551 +551 None n1-551.plc1.org sls= [550, 551, 552] site= 552 +552 None n1-552.plc1.org sls= [551, 552, 553] site= 553 +553 None n1-553.plc1.org sls= [552, 553, 554] site= 554 +554 None n1-554.plc1.org sls= [553, 554, 555] site= 555 +555 None n1-555.plc1.org sls= [554, 555, 556] site= 556 +556 None n1-556.plc1.org sls= [555, 556, 557] site= 557 +557 None n1-557.plc1.org sls= [556, 557, 558] site= 558 +558 None n1-558.plc1.org sls= [557, 558, 559] site= 559 +559 None n1-559.plc1.org sls= [558, 559, 560] site= 560 +560 None n1-560.plc1.org sls= [559, 560, 561] site= 561 +561 None n1-561.plc1.org sls= [560, 561, 562] site= 562 +562 None n1-562.plc1.org sls= [561, 562, 563] site= 563 +563 None n1-563.plc1.org sls= [562, 563, 564] site= 564 +564 None n1-564.plc1.org sls= [563, 564, 565] site= 565 +565 None n1-565.plc1.org sls= [564, 565, 566] site= 566 +566 None n1-566.plc1.org sls= [565, 566, 567] site= 567 +567 None n1-567.plc1.org sls= [566, 567, 568] site= 568 +568 None n1-568.plc1.org sls= [567, 568, 569] site= 569 +569 None n1-569.plc1.org sls= [568, 569, 570] site= 570 +570 None n1-570.plc1.org sls= [569, 570, 571] site= 571 +571 None n1-571.plc1.org sls= [570, 571, 572] site= 572 +572 None n1-572.plc1.org sls= [571, 572, 573] site= 573 +573 None n1-573.plc1.org sls= [572, 573, 574] site= 574 +574 None n1-574.plc1.org sls= [573, 574, 575] site= 575 +575 None n1-575.plc1.org sls= [574, 575, 576] site= 576 +576 None n1-576.plc1.org sls= [575, 576, 577] site= 577 +577 None n1-577.plc1.org sls= [576, 577, 578] site= 578 +578 None n1-578.plc1.org sls= [577, 578, 579] site= 579 +579 None n1-579.plc1.org sls= [578, 579, 580] site= 580 +580 None n1-580.plc1.org sls= [579, 580, 581] site= 581 +581 None n1-581.plc1.org sls= [580, 581, 582] site= 582 +582 None n1-582.plc1.org sls= [581, 582, 583] site= 583 +583 None n1-583.plc1.org sls= [582, 583, 584] site= 584 +584 None n1-584.plc1.org sls= [583, 584, 585] site= 585 +585 None n1-585.plc1.org sls= [584, 585, 586] site= 586 +586 None n1-586.plc1.org sls= [585, 586, 587] site= 587 +587 None n1-587.plc1.org sls= [586, 587, 588] site= 588 +588 None n1-588.plc1.org sls= [587, 588, 589] site= 589 +589 None n1-589.plc1.org sls= [588, 589, 590] site= 590 +590 None n1-590.plc1.org sls= [589, 590, 591] site= 591 +591 None n1-591.plc1.org sls= [590, 591, 592] site= 592 +592 None n1-592.plc1.org sls= [591, 592, 593] site= 593 +593 None n1-593.plc1.org sls= [592, 593, 594] site= 594 +594 None n1-594.plc1.org sls= [593, 594, 595] site= 595 +595 None n1-595.plc1.org sls= [594, 595, 596] site= 596 +596 None n1-596.plc1.org sls= [595, 596, 597] site= 597 +597 None n1-597.plc1.org sls= [596, 597, 598] site= 598 +598 None n1-598.plc1.org sls= [597, 598, 599] site= 599 +599 None n1-599.plc1.org sls= [598, 599, 600] site= 600 +600 None n1-600.plc1.org sls= [599, 600, 601] site= 601 +601 None n1-601.plc1.org sls= [600, 601, 602] site= 602 +602 None n1-602.plc1.org sls= [601, 602, 603] site= 603 +603 None n1-603.plc1.org sls= [602, 603, 604] site= 604 +604 None n1-604.plc1.org sls= [603, 604, 605] site= 605 +605 None n1-605.plc1.org sls= [604, 605, 606] site= 606 +606 None n1-606.plc1.org sls= [605, 606, 607] site= 607 +607 None n1-607.plc1.org sls= [606, 607, 608] site= 608 +608 None n1-608.plc1.org sls= [607, 608, 609] site= 609 +609 None n1-609.plc1.org sls= [608, 609, 610] site= 610 +610 None n1-610.plc1.org sls= [609, 610, 611] site= 611 +611 None n1-611.plc1.org sls= [610, 611, 612] site= 612 +612 None n1-612.plc1.org sls= [611, 612, 613] site= 613 +613 None n1-613.plc1.org sls= [612, 613, 614] site= 614 +614 None n1-614.plc1.org sls= [613, 614, 615] site= 615 +615 None n1-615.plc1.org sls= [614, 615, 616] site= 616 +616 None n1-616.plc1.org sls= [615, 616, 617] site= 617 +617 None n1-617.plc1.org sls= [616, 617, 618] site= 618 +618 None n1-618.plc1.org sls= [617, 618, 619] site= 619 +619 None n1-619.plc1.org sls= [618, 619, 620] site= 620 +620 None n1-620.plc1.org sls= [619, 620, 621] site= 621 +621 None n1-621.plc1.org sls= [620, 621, 622] site= 622 +622 None n1-622.plc1.org sls= [621, 622, 623] site= 623 +623 None n1-623.plc1.org sls= [622, 623, 624] site= 624 +624 None n1-624.plc1.org sls= [623, 624, 625] site= 625 +625 None n1-625.plc1.org sls= [624, 625, 626] site= 626 +626 None n1-626.plc1.org sls= [625, 626, 627] site= 627 +627 None n1-627.plc1.org sls= [626, 627, 628] site= 628 +628 None n1-628.plc1.org sls= [627, 628, 629] site= 629 +629 None n1-629.plc1.org sls= [628, 629, 630] site= 630 +630 None n1-630.plc1.org sls= [629, 630, 631] site= 631 +631 None n1-631.plc1.org sls= [630, 631, 632] site= 632 +632 None n1-632.plc1.org sls= [631, 632, 633] site= 633 +633 None n1-633.plc1.org sls= [632, 633, 634] site= 634 +634 None n1-634.plc1.org sls= [633, 634, 635] site= 635 +635 None n1-635.plc1.org sls= [634, 635, 636] site= 636 +636 None n1-636.plc1.org sls= [635, 636, 637] site= 637 +637 None n1-637.plc1.org sls= [636, 637, 638] site= 638 +638 None n1-638.plc1.org sls= [637, 638, 639] site= 639 +639 None n1-639.plc1.org sls= [638, 639, 640] site= 640 +640 None n1-640.plc1.org sls= [639, 640, 641] site= 641 +641 None n1-641.plc1.org sls= [640, 641, 642] site= 642 +642 None n1-642.plc1.org sls= [641, 642, 643] site= 643 +643 None n1-643.plc1.org sls= [642, 643, 644] site= 644 +644 None n1-644.plc1.org sls= [643, 644, 645] site= 645 +645 None n1-645.plc1.org sls= [644, 645, 646] site= 646 +646 None n1-646.plc1.org sls= [645, 646, 647] site= 647 +647 None n1-647.plc1.org sls= [646, 647, 648] site= 648 +648 None n1-648.plc1.org sls= [647, 648, 649] site= 649 +649 None n1-649.plc1.org sls= [648, 649, 650] site= 650 +650 None n1-650.plc1.org sls= [649, 650, 651] site= 651 +651 None n1-651.plc1.org sls= [650, 651, 652] site= 652 +652 None n1-652.plc1.org sls= [651, 652, 653] site= 653 +653 None n1-653.plc1.org sls= [652, 653, 654] site= 654 +654 None n1-654.plc1.org sls= [653, 654, 655] site= 655 +655 None n1-655.plc1.org sls= [654, 655, 656] site= 656 +656 None n1-656.plc1.org sls= [655, 656, 657] site= 657 +657 None n1-657.plc1.org sls= [656, 657, 658] site= 658 +658 None n1-658.plc1.org sls= [657, 658, 659] site= 659 +659 None n1-659.plc1.org sls= [658, 659, 660] site= 660 +660 None n1-660.plc1.org sls= [659, 660, 661] site= 661 +661 None n1-661.plc1.org sls= [660, 661, 662] site= 662 +662 None n1-662.plc1.org sls= [661, 662, 663] site= 663 +663 None n1-663.plc1.org sls= [662, 663, 664] site= 664 +664 None n1-664.plc1.org sls= [663, 664, 665] site= 665 +665 None n1-665.plc1.org sls= [664, 665, 666] site= 666 +666 None n1-666.plc1.org sls= [665, 666, 667] site= 667 +667 None n1-667.plc1.org sls= [666, 667, 668] site= 668 +668 None n1-668.plc1.org sls= [667, 668, 669] site= 669 +669 None n1-669.plc1.org sls= [668, 669, 670] site= 670 +670 None n1-670.plc1.org sls= [669, 670, 671] site= 671 +671 None n1-671.plc1.org sls= [670, 671, 672] site= 672 +672 None n1-672.plc1.org sls= [671, 672, 673] site= 673 +673 None n1-673.plc1.org sls= [672, 673, 674] site= 674 +674 None n1-674.plc1.org sls= [673, 674, 675] site= 675 +675 None n1-675.plc1.org sls= [674, 675, 676] site= 676 +676 None n1-676.plc1.org sls= [675, 676, 677] site= 677 +677 None n1-677.plc1.org sls= [676, 677, 678] site= 678 +678 None n1-678.plc1.org sls= [677, 678, 679] site= 679 +679 None n1-679.plc1.org sls= [678, 679, 680] site= 680 +680 None n1-680.plc1.org sls= [679, 680, 681] site= 681 +681 None n1-681.plc1.org sls= [680, 681, 682] site= 682 +682 None n1-682.plc1.org sls= [681, 682, 683] site= 683 +683 None n1-683.plc1.org sls= [682, 683, 684] site= 684 +684 None n1-684.plc1.org sls= [683, 684, 685] site= 685 +685 None n1-685.plc1.org sls= [684, 685, 686] site= 686 +686 None n1-686.plc1.org sls= [685, 686, 687] site= 687 +687 None n1-687.plc1.org sls= [686, 687, 688] site= 688 +688 None n1-688.plc1.org sls= [687, 688, 689] site= 689 +689 None n1-689.plc1.org sls= [688, 689, 690] site= 690 +690 None n1-690.plc1.org sls= [689, 690, 691] site= 691 +691 None n1-691.plc1.org sls= [690, 691, 692] site= 692 +692 None n1-692.plc1.org sls= [691, 692, 693] site= 693 +693 None n1-693.plc1.org sls= [692, 693, 694] site= 694 +694 None n1-694.plc1.org sls= [693, 694, 695] site= 695 +695 None n1-695.plc1.org sls= [694, 695, 696] site= 696 +696 None n1-696.plc1.org sls= [695, 696, 697] site= 697 +697 None n1-697.plc1.org sls= [696, 697, 698] site= 698 +698 None n1-698.plc1.org sls= [697, 698, 699] site= 699 +699 None n1-699.plc1.org sls= [698, 699, 700] site= 700 +700 None n1-700.plc1.org sls= [699, 700, 701] site= 701 +701 None n1-701.plc1.org sls= [700, 701, 702] site= 702 +702 None n1-702.plc1.org sls= [701, 702, 703] site= 703 +703 None n1-703.plc1.org sls= [702, 703, 704] site= 704 +704 None n1-704.plc1.org sls= [703, 704, 705] site= 705 +705 None n1-705.plc1.org sls= [704, 705, 706] site= 706 +706 None n1-706.plc1.org sls= [705, 706, 707] site= 707 +707 None n1-707.plc1.org sls= [706, 707, 708] site= 708 +708 None n1-708.plc1.org sls= [707, 708, 709] site= 709 +709 None n1-709.plc1.org sls= [708, 709, 710] site= 710 +710 None n1-710.plc1.org sls= [709, 710, 711] site= 711 +711 None n1-711.plc1.org sls= [710, 711, 712] site= 712 +712 None n1-712.plc1.org sls= [711, 712, 713] site= 713 +713 None n1-713.plc1.org sls= [712, 713, 714] site= 714 +714 None n1-714.plc1.org sls= [713, 714, 715] site= 715 +715 None n1-715.plc1.org sls= [714, 715, 716] site= 716 +716 None n1-716.plc1.org sls= [715, 716, 717] site= 717 +717 None n1-717.plc1.org sls= [716, 717, 718] site= 718 +718 None n1-718.plc1.org sls= [717, 718, 719] site= 719 +719 None n1-719.plc1.org sls= [718, 719, 720] site= 720 +720 None n1-720.plc1.org sls= [719, 720, 721] site= 721 +721 None n1-721.plc1.org sls= [720, 721, 722] site= 722 +722 None n1-722.plc1.org sls= [721, 722, 723] site= 723 +723 None n1-723.plc1.org sls= [722, 723, 724] site= 724 +724 None n1-724.plc1.org sls= [723, 724, 725] site= 725 +725 None n1-725.plc1.org sls= [724, 725, 726] site= 726 +726 None n1-726.plc1.org sls= [725, 726, 727] site= 727 +727 None n1-727.plc1.org sls= [726, 727, 728] site= 728 +728 None n1-728.plc1.org sls= [727, 728, 729] site= 729 +729 None n1-729.plc1.org sls= [728, 729, 730] site= 730 +730 None n1-730.plc1.org sls= [729, 730, 731] site= 731 +731 None n1-731.plc1.org sls= [730, 731, 732] site= 732 +732 None n1-732.plc1.org sls= [731, 732, 733] site= 733 +733 None n1-733.plc1.org sls= [732, 733, 734] site= 734 +734 None n1-734.plc1.org sls= [733, 734, 735] site= 735 +735 None n1-735.plc1.org sls= [734, 735, 736] site= 736 +736 None n1-736.plc1.org sls= [735, 736, 737] site= 737 +737 None n1-737.plc1.org sls= [736, 737, 738] site= 738 +738 None n1-738.plc1.org sls= [737, 738, 739] site= 739 +739 None n1-739.plc1.org sls= [738, 739, 740] site= 740 +740 None n1-740.plc1.org sls= [739, 740, 741] site= 741 +741 None n1-741.plc1.org sls= [740, 741, 742] site= 742 +742 None n1-742.plc1.org sls= [741, 742, 743] site= 743 +743 None n1-743.plc1.org sls= [742, 743, 744] site= 744 +744 None n1-744.plc1.org sls= [743, 744, 745] site= 745 +745 None n1-745.plc1.org sls= [744, 745, 746] site= 746 +746 None n1-746.plc1.org sls= [745, 746, 747] site= 747 +747 None n1-747.plc1.org sls= [746, 747, 748] site= 748 +748 None n1-748.plc1.org sls= [747, 748, 749] site= 749 +749 None n1-749.plc1.org sls= [748, 749, 750] site= 750 +750 None n1-750.plc1.org sls= [749, 750, 751] site= 751 +751 None n1-751.plc1.org sls= [750, 751, 752] site= 752 +752 None n1-752.plc1.org sls= [751, 752, 753] site= 753 +753 None n1-753.plc1.org sls= [752, 753, 754] site= 754 +754 None n1-754.plc1.org sls= [753, 754, 755] site= 755 +755 None n1-755.plc1.org sls= [754, 755, 756] site= 756 +756 None n1-756.plc1.org sls= [755, 756, 757] site= 757 +757 None n1-757.plc1.org sls= [756, 757, 758] site= 758 +758 None n1-758.plc1.org sls= [757, 758, 759] site= 759 +759 None n1-759.plc1.org sls= [758, 759, 760] site= 760 +760 None n1-760.plc1.org sls= [759, 760, 761] site= 761 +761 None n1-761.plc1.org sls= [760, 761, 762] site= 762 +762 None n1-762.plc1.org sls= [761, 762, 763] site= 763 +763 None n1-763.plc1.org sls= [762, 763, 764] site= 764 +764 None n1-764.plc1.org sls= [763, 764, 765] site= 765 +765 None n1-765.plc1.org sls= [764, 765, 766] site= 766 +766 None n1-766.plc1.org sls= [765, 766, 767] site= 767 +767 None n1-767.plc1.org sls= [766, 767, 768] site= 768 +768 None n1-768.plc1.org sls= [767, 768, 769] site= 769 +769 None n1-769.plc1.org sls= [768, 769, 770] site= 770 +770 None n1-770.plc1.org sls= [769, 770, 771] site= 771 +771 None n1-771.plc1.org sls= [770, 771, 772] site= 772 +772 None n1-772.plc1.org sls= [771, 772, 773] site= 773 +773 None n1-773.plc1.org sls= [772, 773, 774] site= 774 +774 None n1-774.plc1.org sls= [773, 774, 775] site= 775 +775 None n1-775.plc1.org sls= [774, 775, 776] site= 776 +776 None n1-776.plc1.org sls= [775, 776, 777] site= 777 +777 None n1-777.plc1.org sls= [776, 777, 778] site= 778 +778 None n1-778.plc1.org sls= [777, 778, 779] site= 779 +779 None n1-779.plc1.org sls= [778, 779, 780] site= 780 +780 None n1-780.plc1.org sls= [779, 780, 781] site= 781 +781 None n1-781.plc1.org sls= [780, 781, 782] site= 782 +782 None n1-782.plc1.org sls= [781, 782, 783] site= 783 +783 None n1-783.plc1.org sls= [782, 783, 784] site= 784 +784 None n1-784.plc1.org sls= [783, 784, 785] site= 785 +785 None n1-785.plc1.org sls= [784, 785, 786] site= 786 +786 None n1-786.plc1.org sls= [785, 786, 787] site= 787 +787 None n1-787.plc1.org sls= [786, 787, 788] site= 788 +788 None n1-788.plc1.org sls= [787, 788, 789] site= 789 +789 None n1-789.plc1.org sls= [788, 789, 790] site= 790 +790 None n1-790.plc1.org sls= [789, 790, 791] site= 791 +791 None n1-791.plc1.org sls= [790, 791, 792] site= 792 +792 None n1-792.plc1.org sls= [791, 792, 793] site= 793 +793 None n1-793.plc1.org sls= [792, 793, 794] site= 794 +794 None n1-794.plc1.org sls= [793, 794, 795] site= 795 +795 None n1-795.plc1.org sls= [794, 795, 796] site= 796 +796 None n1-796.plc1.org sls= [795, 796, 797] site= 797 +797 None n1-797.plc1.org sls= [796, 797, 798] site= 798 +798 None n1-798.plc1.org sls= [797, 798, 799] site= 799 +799 None n1-799.plc1.org sls= [798, 799, 800] site= 800 +800 None n1-800.plc1.org sls= [799, 800, 801] site= 801 +801 None n1-801.plc1.org sls= [800, 801, 802] site= 802 +802 None n1-802.plc1.org sls= [801, 802, 803] site= 803 +803 None n1-803.plc1.org sls= [802, 803, 804] site= 804 +804 None n1-804.plc1.org sls= [803, 804, 805] site= 805 +805 None n1-805.plc1.org sls= [804, 805, 806] site= 806 +806 None n1-806.plc1.org sls= [805, 806, 807] site= 807 +807 None n1-807.plc1.org sls= [806, 807, 808] site= 808 +808 None n1-808.plc1.org sls= [807, 808, 809] site= 809 +809 None n1-809.plc1.org sls= [808, 809, 810] site= 810 +810 None n1-810.plc1.org sls= [809, 810, 811] site= 811 +811 None n1-811.plc1.org sls= [810, 811, 812] site= 812 +812 None n1-812.plc1.org sls= [811, 812, 813] site= 813 +813 None n1-813.plc1.org sls= [812, 813, 814] site= 814 +814 None n1-814.plc1.org sls= [813, 814, 815] site= 815 +815 None n1-815.plc1.org sls= [814, 815, 816] site= 816 +816 None n1-816.plc1.org sls= [815, 816, 817] site= 817 +817 None n1-817.plc1.org sls= [816, 817, 818] site= 818 +818 None n1-818.plc1.org sls= [817, 818, 819] site= 819 +819 None n1-819.plc1.org sls= [818, 819, 820] site= 820 +820 None n1-820.plc1.org sls= [819, 820, 821] site= 821 +821 None n1-821.plc1.org sls= [820, 821, 822] site= 822 +822 None n1-822.plc1.org sls= [821, 822, 823] site= 823 +823 None n1-823.plc1.org sls= [822, 823, 824] site= 824 +824 None n1-824.plc1.org sls= [823, 824, 825] site= 825 +825 None n1-825.plc1.org sls= [824, 825, 826] site= 826 +826 None n1-826.plc1.org sls= [825, 826, 827] site= 827 +827 None n1-827.plc1.org sls= [826, 827, 828] site= 828 +828 None n1-828.plc1.org sls= [827, 828, 829] site= 829 +829 None n1-829.plc1.org sls= [828, 829, 830] site= 830 +830 None n1-830.plc1.org sls= [829, 830, 831] site= 831 +831 None n1-831.plc1.org sls= [830, 831, 832] site= 832 +832 None n1-832.plc1.org sls= [831, 832, 833] site= 833 +833 None n1-833.plc1.org sls= [832, 833, 834] site= 834 +834 None n1-834.plc1.org sls= [833, 834, 835] site= 835 +835 None n1-835.plc1.org sls= [834, 835, 836] site= 836 +836 None n1-836.plc1.org sls= [835, 836, 837] site= 837 +837 None n1-837.plc1.org sls= [836, 837, 838] site= 838 +838 None n1-838.plc1.org sls= [837, 838, 839] site= 839 +839 None n1-839.plc1.org sls= [838, 839, 840] site= 840 +840 None n1-840.plc1.org sls= [839, 840, 841] site= 841 +841 None n1-841.plc1.org sls= [840, 841, 842] site= 842 +842 None n1-842.plc1.org sls= [841, 842, 843] site= 843 +843 None n1-843.plc1.org sls= [842, 843, 844] site= 844 +844 None n1-844.plc1.org sls= [843, 844, 845] site= 845 +845 None n1-845.plc1.org sls= [844, 845, 846] site= 846 +846 None n1-846.plc1.org sls= [845, 846, 847] site= 847 +847 None n1-847.plc1.org sls= [846, 847, 848] site= 848 +848 None n1-848.plc1.org sls= [847, 848, 849] site= 849 +849 None n1-849.plc1.org sls= [848, 849, 850] site= 850 +850 None n1-850.plc1.org sls= [849, 850, 851] site= 851 +851 None n1-851.plc1.org sls= [850, 851, 852] site= 852 +852 None n1-852.plc1.org sls= [851, 852, 853] site= 853 +853 None n1-853.plc1.org sls= [852, 853, 854] site= 854 +854 None n1-854.plc1.org sls= [853, 854, 855] site= 855 +855 None n1-855.plc1.org sls= [854, 855, 856] site= 856 +856 None n1-856.plc1.org sls= [855, 856, 857] site= 857 +857 None n1-857.plc1.org sls= [856, 857, 858] site= 858 +858 None n1-858.plc1.org sls= [857, 858, 859] site= 859 +859 None n1-859.plc1.org sls= [858, 859, 860] site= 860 +860 None n1-860.plc1.org sls= [859, 860, 861] site= 861 +861 None n1-861.plc1.org sls= [860, 861, 862] site= 862 +862 None n1-862.plc1.org sls= [861, 862, 863] site= 863 +863 None n1-863.plc1.org sls= [862, 863, 864] site= 864 +864 None n1-864.plc1.org sls= [863, 864, 865] site= 865 +865 None n1-865.plc1.org sls= [864, 865, 866] site= 866 +866 None n1-866.plc1.org sls= [865, 866, 867] site= 867 +867 None n1-867.plc1.org sls= [866, 867, 868] site= 868 +868 None n1-868.plc1.org sls= [867, 868, 869] site= 869 +869 None n1-869.plc1.org sls= [868, 869, 870] site= 870 +870 None n1-870.plc1.org sls= [869, 870, 871] site= 871 +871 None n1-871.plc1.org sls= [870, 871, 872] site= 872 +872 None n1-872.plc1.org sls= [871, 872, 873] site= 873 +873 None n1-873.plc1.org sls= [872, 873, 874] site= 874 +874 None n1-874.plc1.org sls= [873, 874, 875] site= 875 +875 None n1-875.plc1.org sls= [874, 875, 876] site= 876 +876 None n1-876.plc1.org sls= [875, 876, 877] site= 877 +877 None n1-877.plc1.org sls= [876, 877, 878] site= 878 +878 None n1-878.plc1.org sls= [877, 878, 879] site= 879 +879 None n1-879.plc1.org sls= [878, 879, 880] site= 880 +880 None n1-880.plc1.org sls= [879, 880, 881] site= 881 +881 None n1-881.plc1.org sls= [880, 881, 882] site= 882 +882 None n1-882.plc1.org sls= [881, 882, 883] site= 883 +883 None n1-883.plc1.org sls= [882, 883, 884] site= 884 +884 None n1-884.plc1.org sls= [883, 884, 885] site= 885 +885 None n1-885.plc1.org sls= [884, 885, 886] site= 886 +886 None n1-886.plc1.org sls= [885, 886, 887] site= 887 +887 None n1-887.plc1.org sls= [886, 887, 888] site= 888 +888 None n1-888.plc1.org sls= [887, 888, 889] site= 889 +889 None n1-889.plc1.org sls= [888, 889, 890] site= 890 +890 None n1-890.plc1.org sls= [889, 890, 891] site= 891 +891 None n1-891.plc1.org sls= [890, 891, 892] site= 892 +892 None n1-892.plc1.org sls= [891, 892, 893] site= 893 +893 None n1-893.plc1.org sls= [892, 893, 894] site= 894 +894 None n1-894.plc1.org sls= [893, 894, 895] site= 895 +895 None n1-895.plc1.org sls= [894, 895, 896] site= 896 +896 None n1-896.plc1.org sls= [895, 896, 897] site= 897 +897 None n1-897.plc1.org sls= [896, 897, 898] site= 898 +898 None n1-898.plc1.org sls= [897, 898, 899] site= 899 +899 None n1-899.plc1.org sls= [898, 899, 900] site= 900 +900 None n1-900.plc1.org sls= [899, 900, 901] site= 901 +901 None n1-901.plc1.org sls= [900, 901, 902] site= 902 +902 None n1-902.plc1.org sls= [901, 902, 903] site= 903 +903 None n1-903.plc1.org sls= [902, 903, 904] site= 904 +904 None n1-904.plc1.org sls= [903, 904, 905] site= 905 +905 None n1-905.plc1.org sls= [904, 905, 906] site= 906 +906 None n1-906.plc1.org sls= [905, 906, 907] site= 907 +907 None n1-907.plc1.org sls= [906, 907, 908] site= 908 +908 None n1-908.plc1.org sls= [907, 908, 909] site= 909 +909 None n1-909.plc1.org sls= [908, 909, 910] site= 910 +910 None n1-910.plc1.org sls= [909, 910, 911] site= 911 +911 None n1-911.plc1.org sls= [910, 911, 912] site= 912 +912 None n1-912.plc1.org sls= [911, 912, 913] site= 913 +913 None n1-913.plc1.org sls= [912, 913, 914] site= 914 +914 None n1-914.plc1.org sls= [913, 914, 915] site= 915 +915 None n1-915.plc1.org sls= [914, 915, 916] site= 916 +916 None n1-916.plc1.org sls= [915, 916, 917] site= 917 +917 None n1-917.plc1.org sls= [916, 917, 918] site= 918 +918 None n1-918.plc1.org sls= [917, 918, 919] site= 919 +919 None n1-919.plc1.org sls= [918, 919, 920] site= 920 +920 None n1-920.plc1.org sls= [919, 920, 921] site= 921 +921 None n1-921.plc1.org sls= [920, 921, 922] site= 922 +922 None n1-922.plc1.org sls= [921, 922, 923] site= 923 +923 None n1-923.plc1.org sls= [922, 923, 924] site= 924 +924 None n1-924.plc1.org sls= [923, 924, 925] site= 925 +925 None n1-925.plc1.org sls= [924, 925, 926] site= 926 +926 None n1-926.plc1.org sls= [925, 926, 927] site= 927 +927 None n1-927.plc1.org sls= [926, 927, 928] site= 928 +928 None n1-928.plc1.org sls= [927, 928, 929] site= 929 +929 None n1-929.plc1.org sls= [928, 929, 930] site= 930 +930 None n1-930.plc1.org sls= [929, 930, 931] site= 931 +931 None n1-931.plc1.org sls= [930, 931, 932] site= 932 +932 None n1-932.plc1.org sls= [931, 932, 933] site= 933 +933 None n1-933.plc1.org sls= [932, 933, 934] site= 934 +934 None n1-934.plc1.org sls= [933, 934, 935] site= 935 +935 None n1-935.plc1.org sls= [934, 935, 936] site= 936 +936 None n1-936.plc1.org sls= [935, 936, 937] site= 937 +937 None n1-937.plc1.org sls= [936, 937, 938] site= 938 +938 None n1-938.plc1.org sls= [937, 938, 939] site= 939 +939 None n1-939.plc1.org sls= [938, 939, 940] site= 940 +940 None n1-940.plc1.org sls= [939, 940, 941] site= 941 +941 None n1-941.plc1.org sls= [940, 941, 942] site= 942 +942 None n1-942.plc1.org sls= [941, 942, 943] site= 943 +943 None n1-943.plc1.org sls= [942, 943, 944] site= 944 +944 None n1-944.plc1.org sls= [943, 944, 945] site= 945 +945 None n1-945.plc1.org sls= [944, 945, 946] site= 946 +946 None n1-946.plc1.org sls= [945, 946, 947] site= 947 +947 None n1-947.plc1.org sls= [946, 947, 948] site= 948 +948 None n1-948.plc1.org sls= [947, 948, 949] site= 949 +949 None n1-949.plc1.org sls= [948, 949, 950] site= 950 +950 None n1-950.plc1.org sls= [949, 950, 951] site= 951 +951 None n1-951.plc1.org sls= [950, 951, 952] site= 952 +952 None n1-952.plc1.org sls= [951, 952, 953] site= 953 +953 None n1-953.plc1.org sls= [952, 953, 954] site= 954 +954 None n1-954.plc1.org sls= [953, 954, 955] site= 955 +955 None n1-955.plc1.org sls= [954, 955, 956] site= 956 +956 None n1-956.plc1.org sls= [955, 956, 957] site= 957 +957 None n1-957.plc1.org sls= [956, 957, 958] site= 958 +958 None n1-958.plc1.org sls= [957, 958, 959] site= 959 +959 None n1-959.plc1.org sls= [958, 959, 960] site= 960 +960 None n1-960.plc1.org sls= [959, 960, 961] site= 961 +961 None n1-961.plc1.org sls= [960, 961, 962] site= 962 +962 None n1-962.plc1.org sls= [961, 962, 963] site= 963 +963 None n1-963.plc1.org sls= [962, 963, 964] site= 964 +964 None n1-964.plc1.org sls= [963, 964, 965] site= 965 +965 None n1-965.plc1.org sls= [964, 965, 966] site= 966 +966 None n1-966.plc1.org sls= [965, 966, 967] site= 967 +967 None n1-967.plc1.org sls= [966, 967, 968] site= 968 +968 None n1-968.plc1.org sls= [967, 968, 969] site= 969 +969 None n1-969.plc1.org sls= [968, 969, 970] site= 970 +970 None n1-970.plc1.org sls= [969, 970, 971] site= 971 +971 None n1-971.plc1.org sls= [970, 971, 972] site= 972 +972 None n1-972.plc1.org sls= [971, 972, 973] site= 973 +973 None n1-973.plc1.org sls= [972, 973, 974] site= 974 +974 None n1-974.plc1.org sls= [973, 974, 975] site= 975 +975 None n1-975.plc1.org sls= [974, 975, 976] site= 976 +976 None n1-976.plc1.org sls= [975, 976, 977] site= 977 +977 None n1-977.plc1.org sls= [976, 977, 978] site= 978 +978 None n1-978.plc1.org sls= [977, 978, 979] site= 979 +979 None n1-979.plc1.org sls= [978, 979, 980] site= 980 +980 None n1-980.plc1.org sls= [979, 980, 981] site= 981 +981 None n1-981.plc1.org sls= [980, 981, 982] site= 982 +982 None n1-982.plc1.org sls= [981, 982, 983] site= 983 +983 None n1-983.plc1.org sls= [982, 983, 984] site= 984 +984 None n1-984.plc1.org sls= [983, 984, 985] site= 985 +985 None n1-985.plc1.org sls= [984, 985, 986] site= 986 +986 None n1-986.plc1.org sls= [985, 986, 987] site= 987 +987 None n1-987.plc1.org sls= [986, 987, 988] site= 988 +988 None n1-988.plc1.org sls= [987, 988, 989] site= 989 +989 None n1-989.plc1.org sls= [988, 989, 990] site= 990 +990 None n1-990.plc1.org sls= [989, 990, 991] site= 991 +991 None n1-991.plc1.org sls= [990, 991, 992] site= 992 +992 None n1-992.plc1.org sls= [991, 992, 993] site= 993 +993 None n1-993.plc1.org sls= [992, 993, 994] site= 994 +994 None n1-994.plc1.org sls= [993, 994, 995] site= 995 +995 None n1-995.plc1.org sls= [994, 995, 996] site= 996 +996 None n1-996.plc1.org sls= [995, 996, 997] site= 997 +997 None n1-997.plc1.org sls= [996, 997, 998] site= 998 +998 None n1-998.plc1.org sls= [997, 998, 999] site= 999 +999 None n1-999.plc1.org sls= [998, 999, 1000] site= 1000 +1000 None n1-1000.plc1.org sls= [999, 1000, 1001] site= 1001 +1001 None n1-1001.plc1.org sls= [1000, 1001, 1002] site= 2 +1002 None n1-1002.plc1.org sls= [1001, 1002, 1003] site= 3 +1003 None n1-1003.plc1.org sls= [1002, 1003, 1004] site= 4 +1004 None n1-1004.plc1.org sls= [1003, 1004, 1005] site= 5 +1005 None n1-1005.plc1.org sls= [1004, 1005, 1006] site= 6 +1006 None n1-1006.plc1.org sls= [1005, 1006, 1007] site= 7 +1007 None n1-1007.plc1.org sls= [1006, 1007, 1008] site= 8 +1008 None n1-1008.plc1.org sls= [1007, 1008, 1009] site= 9 +1009 None n1-1009.plc1.org sls= [1008, 1009, 1010] site= 10 +1010 None n1-1010.plc1.org sls= [1009, 1010, 1011] site= 11 +1011 None n1-1011.plc1.org sls= [1010, 1011, 1012] site= 12 +1012 None n1-1012.plc1.org sls= [1011, 1012, 1013] site= 13 +1013 None n1-1013.plc1.org sls= [1012, 1013, 1014] site= 14 +1014 None n1-1014.plc1.org sls= [1013, 1014, 1015] site= 15 +1015 None n1-1015.plc1.org sls= [1014, 1015, 1016] site= 16 +1016 None n1-1016.plc1.org sls= [1015, 1016, 1017] site= 17 +1017 None n1-1017.plc1.org sls= [1016, 1017, 1018] site= 18 +1018 None n1-1018.plc1.org sls= [1017, 1018, 1019] site= 19 +1019 None n1-1019.plc1.org sls= [1018, 1019, 1020] site= 20 +1020 None n1-1020.plc1.org sls= [1019, 1020, 1021] site= 21 +1021 None n1-1021.plc1.org sls= [1020, 1021, 1022] site= 22 +1022 None n1-1022.plc1.org sls= [1021, 1022, 1023] site= 23 +1023 None n1-1023.plc1.org sls= [1022, 1023, 1024] site= 24 +1024 None n1-1024.plc1.org sls= [1023, 1024, 1025] site= 25 +1025 None n1-1025.plc1.org sls= [1024, 1025, 1026] site= 26 +1026 None n1-1026.plc1.org sls= [1025, 1026, 1027] site= 27 +1027 None n1-1027.plc1.org sls= [1026, 1027, 1028] site= 28 +1028 None n1-1028.plc1.org sls= [1027, 1028, 1029] site= 29 +1029 None n1-1029.plc1.org sls= [1028, 1029, 1030] site= 30 +1030 None n1-1030.plc1.org sls= [1029, 1030, 1031] site= 31 +1031 None n1-1031.plc1.org sls= [1030, 1031, 1032] site= 32 +1032 None n1-1032.plc1.org sls= [1031, 1032, 1033] site= 33 +1033 None n1-1033.plc1.org sls= [1032, 1033, 1034] site= 34 +1034 None n1-1034.plc1.org sls= [1033, 1034, 1035] site= 35 +1035 None n1-1035.plc1.org sls= [1034, 1035, 1036] site= 36 +1036 None n1-1036.plc1.org sls= [1035, 1036, 1037] site= 37 +1037 None n1-1037.plc1.org sls= [1036, 1037, 1038] site= 38 +1038 None n1-1038.plc1.org sls= [1037, 1038, 1039] site= 39 +1039 None n1-1039.plc1.org sls= [1038, 1039, 1040] site= 40 +1040 None n1-1040.plc1.org sls= [1039, 1040, 1041] site= 41 +1041 None n1-1041.plc1.org sls= [1040, 1041, 1042] site= 42 +1042 None n1-1042.plc1.org sls= [1041, 1042, 1043] site= 43 +1043 None n1-1043.plc1.org sls= [1042, 1043, 1044] site= 44 +1044 None n1-1044.plc1.org sls= [1043, 1044, 1045] site= 45 +1045 None n1-1045.plc1.org sls= [1044, 1045, 1046] site= 46 +1046 None n1-1046.plc1.org sls= [1045, 1046, 1047] site= 47 +1047 None n1-1047.plc1.org sls= [1046, 1047, 1048] site= 48 +1048 None n1-1048.plc1.org sls= [1047, 1048, 1049] site= 49 +1049 None n1-1049.plc1.org sls= [1048, 1049, 1050] site= 50 +1050 None n1-1050.plc1.org sls= [1049, 1050, 1051] site= 51 +1051 None n1-1051.plc1.org sls= [1050, 1051, 1052] site= 52 +1052 None n1-1052.plc1.org sls= [1051, 1052, 1053] site= 53 +1053 None n1-1053.plc1.org sls= [1052, 1053, 1054] site= 54 +1054 None n1-1054.plc1.org sls= [1053, 1054, 1055] site= 55 +1055 None n1-1055.plc1.org sls= [1054, 1055, 1056] site= 56 +1056 None n1-1056.plc1.org sls= [1055, 1056, 1057] site= 57 +1057 None n1-1057.plc1.org sls= [1056, 1057, 1058] site= 58 +1058 None n1-1058.plc1.org sls= [1057, 1058, 1059] site= 59 +1059 None n1-1059.plc1.org sls= [1058, 1059, 1060] site= 60 +1060 None n1-1060.plc1.org sls= [1059, 1060, 1061] site= 61 +1061 None n1-1061.plc1.org sls= [1060, 1061, 1062] site= 62 +1062 None n1-1062.plc1.org sls= [1061, 1062, 1063] site= 63 +1063 None n1-1063.plc1.org sls= [1062, 1063, 1064] site= 64 +1064 None n1-1064.plc1.org sls= [1063, 1064, 1065] site= 65 +1065 None n1-1065.plc1.org sls= [1064, 1065, 1066] site= 66 +1066 None n1-1066.plc1.org sls= [1065, 1066, 1067] site= 67 +1067 None n1-1067.plc1.org sls= [1066, 1067, 1068] site= 68 +1068 None n1-1068.plc1.org sls= [1067, 1068, 1069] site= 69 +1069 None n1-1069.plc1.org sls= [1068, 1069, 1070] site= 70 +1070 None n1-1070.plc1.org sls= [1069, 1070, 1071] site= 71 +1071 None n1-1071.plc1.org sls= [1070, 1071, 1072] site= 72 +1072 None n1-1072.plc1.org sls= [1071, 1072, 1073] site= 73 +1073 None n1-1073.plc1.org sls= [1072, 1073, 1074] site= 74 +1074 None n1-1074.plc1.org sls= [1073, 1074, 1075] site= 75 +1075 None n1-1075.plc1.org sls= [1074, 1075, 1076] site= 76 +1076 None n1-1076.plc1.org sls= [1075, 1076, 1077] site= 77 +1077 None n1-1077.plc1.org sls= [1076, 1077, 1078] site= 78 +1078 None n1-1078.plc1.org sls= [1077, 1078, 1079] site= 79 +1079 None n1-1079.plc1.org sls= [1078, 1079, 1080] site= 80 +1080 None n1-1080.plc1.org sls= [1079, 1080, 1081] site= 81 +1081 None n1-1081.plc1.org sls= [1080, 1081, 1082] site= 82 +1082 None n1-1082.plc1.org sls= [1081, 1082, 1083] site= 83 +1083 None n1-1083.plc1.org sls= [1082, 1083, 1084] site= 84 +1084 None n1-1084.plc1.org sls= [1083, 1084, 1085] site= 85 +1085 None n1-1085.plc1.org sls= [1084, 1085, 1086] site= 86 +1086 None n1-1086.plc1.org sls= [1085, 1086, 1087] site= 87 +1087 None n1-1087.plc1.org sls= [1086, 1087, 1088] site= 88 +1088 None n1-1088.plc1.org sls= [1087, 1088, 1089] site= 89 +1089 None n1-1089.plc1.org sls= [1088, 1089, 1090] site= 90 +1090 None n1-1090.plc1.org sls= [1089, 1090, 1091] site= 91 +1091 None n1-1091.plc1.org sls= [1090, 1091, 1092] site= 92 +1092 None n1-1092.plc1.org sls= [1091, 1092, 1093] site= 93 +1093 None n1-1093.plc1.org sls= [1092, 1093, 1094] site= 94 +1094 None n1-1094.plc1.org sls= [1093, 1094, 1095] site= 95 +1095 None n1-1095.plc1.org sls= [1094, 1095, 1096] site= 96 +1096 None n1-1096.plc1.org sls= [1095, 1096, 1097] site= 97 +1097 None n1-1097.plc1.org sls= [1096, 1097, 1098] site= 98 +1098 None n1-1098.plc1.org sls= [1097, 1098, 1099] site= 99 +1099 None n1-1099.plc1.org sls= [1098, 1099, 1100] site= 100 +1100 None n1-1100.plc1.org sls= [1099, 1100, 1101] site= 101 +1101 None n1-1101.plc1.org sls= [1100, 1101, 1102] site= 102 +1102 None n1-1102.plc1.org sls= [1101, 1102, 1103] site= 103 +1103 None n1-1103.plc1.org sls= [1102, 1103, 1104] site= 104 +1104 None n1-1104.plc1.org sls= [1103, 1104, 1105] site= 105 +1105 None n1-1105.plc1.org sls= [1104, 1105, 1106] site= 106 +1106 None n1-1106.plc1.org sls= [1105, 1106, 1107] site= 107 +1107 None n1-1107.plc1.org sls= [1106, 1107, 1108] site= 108 +1108 None n1-1108.plc1.org sls= [1107, 1108, 1109] site= 109 +1109 None n1-1109.plc1.org sls= [1108, 1109, 1110] site= 110 +1110 None n1-1110.plc1.org sls= [1109, 1110, 1111] site= 111 +1111 None n1-1111.plc1.org sls= [1110, 1111, 1112] site= 112 +1112 None n1-1112.plc1.org sls= [1111, 1112, 1113] site= 113 +1113 None n1-1113.plc1.org sls= [1112, 1113, 1114] site= 114 +1114 None n1-1114.plc1.org sls= [1113, 1114, 1115] site= 115 +1115 None n1-1115.plc1.org sls= [1114, 1115, 1116] site= 116 +1116 None n1-1116.plc1.org sls= [1115, 1116, 1117] site= 117 +1117 None n1-1117.plc1.org sls= [1116, 1117, 1118] site= 118 +1118 None n1-1118.plc1.org sls= [1117, 1118, 1119] site= 119 +1119 None n1-1119.plc1.org sls= [1118, 1119, 1120] site= 120 +1120 None n1-1120.plc1.org sls= [1119, 1120, 1121] site= 121 +1121 None n1-1121.plc1.org sls= [1120, 1121, 1122] site= 122 +1122 None n1-1122.plc1.org sls= [1121, 1122, 1123] site= 123 +1123 None n1-1123.plc1.org sls= [1122, 1123, 1124] site= 124 +1124 None n1-1124.plc1.org sls= [1123, 1124, 1125] site= 125 +1125 None n1-1125.plc1.org sls= [1124, 1125, 1126] site= 126 +1126 None n1-1126.plc1.org sls= [1125, 1126, 1127] site= 127 +1127 None n1-1127.plc1.org sls= [1126, 1127, 1128] site= 128 +1128 None n1-1128.plc1.org sls= [1127, 1128, 1129] site= 129 +1129 None n1-1129.plc1.org sls= [1128, 1129, 1130] site= 130 +1130 None n1-1130.plc1.org sls= [1129, 1130, 1131] site= 131 +1131 None n1-1131.plc1.org sls= [1130, 1131, 1132] site= 132 +1132 None n1-1132.plc1.org sls= [1131, 1132, 1133] site= 133 +1133 None n1-1133.plc1.org sls= [1132, 1133, 1134] site= 134 +1134 None n1-1134.plc1.org sls= [1133, 1134, 1135] site= 135 +1135 None n1-1135.plc1.org sls= [1134, 1135, 1136] site= 136 +1136 None n1-1136.plc1.org sls= [1135, 1136, 1137] site= 137 +1137 None n1-1137.plc1.org sls= [1136, 1137, 1138] site= 138 +1138 None n1-1138.plc1.org sls= [1137, 1138, 1139] site= 139 +1139 None n1-1139.plc1.org sls= [1138, 1139, 1140] site= 140 +1140 None n1-1140.plc1.org sls= [1139, 1140, 1141] site= 141 +1141 None n1-1141.plc1.org sls= [1140, 1141, 1142] site= 142 +1142 None n1-1142.plc1.org sls= [1141, 1142, 1143] site= 143 +1143 None n1-1143.plc1.org sls= [1142, 1143, 1144] site= 144 +1144 None n1-1144.plc1.org sls= [1143, 1144, 1145] site= 145 +1145 None n1-1145.plc1.org sls= [1144, 1145, 1146] site= 146 +1146 None n1-1146.plc1.org sls= [1145, 1146, 1147] site= 147 +1147 None n1-1147.plc1.org sls= [1146, 1147, 1148] site= 148 +1148 None n1-1148.plc1.org sls= [1147, 1148, 1149] site= 149 +1149 None n1-1149.plc1.org sls= [1148, 1149, 1150] site= 150 +1150 None n1-1150.plc1.org sls= [1149, 1150, 1151] site= 151 +1151 None n1-1151.plc1.org sls= [1150, 1151, 1152] site= 152 +1152 None n1-1152.plc1.org sls= [1151, 1152, 1153] site= 153 +1153 None n1-1153.plc1.org sls= [1152, 1153, 1154] site= 154 +1154 None n1-1154.plc1.org sls= [1153, 1154, 1155] site= 155 +1155 None n1-1155.plc1.org sls= [1154, 1155, 1156] site= 156 +1156 None n1-1156.plc1.org sls= [1155, 1156, 1157] site= 157 +1157 None n1-1157.plc1.org sls= [1156, 1157, 1158] site= 158 +1158 None n1-1158.plc1.org sls= [1157, 1158, 1159] site= 159 +1159 None n1-1159.plc1.org sls= [1158, 1159, 1160] site= 160 +1160 None n1-1160.plc1.org sls= [1159, 1160, 1161] site= 161 +1161 None n1-1161.plc1.org sls= [1160, 1161, 1162] site= 162 +1162 None n1-1162.plc1.org sls= [1161, 1162, 1163] site= 163 +1163 None n1-1163.plc1.org sls= [1162, 1163, 1164] site= 164 +1164 None n1-1164.plc1.org sls= [1163, 1164, 1165] site= 165 +1165 None n1-1165.plc1.org sls= [1164, 1165, 1166] site= 166 +1166 None n1-1166.plc1.org sls= [1165, 1166, 1167] site= 167 +1167 None n1-1167.plc1.org sls= [1166, 1167, 1168] site= 168 +1168 None n1-1168.plc1.org sls= [1167, 1168, 1169] site= 169 +1169 None n1-1169.plc1.org sls= [1168, 1169, 1170] site= 170 +1170 None n1-1170.plc1.org sls= [1169, 1170, 1171] site= 171 +1171 None n1-1171.plc1.org sls= [1170, 1171, 1172] site= 172 +1172 None n1-1172.plc1.org sls= [1171, 1172, 1173] site= 173 +1173 None n1-1173.plc1.org sls= [1172, 1173, 1174] site= 174 +1174 None n1-1174.plc1.org sls= [1173, 1174, 1175] site= 175 +1175 None n1-1175.plc1.org sls= [1174, 1175, 1176] site= 176 +1176 None n1-1176.plc1.org sls= [1175, 1176, 1177] site= 177 +1177 None n1-1177.plc1.org sls= [1176, 1177, 1178] site= 178 +1178 None n1-1178.plc1.org sls= [1177, 1178, 1179] site= 179 +1179 None n1-1179.plc1.org sls= [1178, 1179, 1180] site= 180 +1180 None n1-1180.plc1.org sls= [1179, 1180, 1181] site= 181 +1181 None n1-1181.plc1.org sls= [1180, 1181, 1182] site= 182 +1182 None n1-1182.plc1.org sls= [1181, 1182, 1183] site= 183 +1183 None n1-1183.plc1.org sls= [1182, 1183, 1184] site= 184 +1184 None n1-1184.plc1.org sls= [1183, 1184, 1185] site= 185 +1185 None n1-1185.plc1.org sls= [1184, 1185, 1186] site= 186 +1186 None n1-1186.plc1.org sls= [1185, 1186, 1187] site= 187 +1187 None n1-1187.plc1.org sls= [1186, 1187, 1188] site= 188 +1188 None n1-1188.plc1.org sls= [1187, 1188, 1189] site= 189 +1189 None n1-1189.plc1.org sls= [1188, 1189, 1190] site= 190 +1190 None n1-1190.plc1.org sls= [1189, 1190, 1191] site= 191 +1191 None n1-1191.plc1.org sls= [1190, 1191, 1192] site= 192 +1192 None n1-1192.plc1.org sls= [1191, 1192, 1193] site= 193 +1193 None n1-1193.plc1.org sls= [1192, 1193, 1194] site= 194 +1194 None n1-1194.plc1.org sls= [1193, 1194, 1195] site= 195 +1195 None n1-1195.plc1.org sls= [1194, 1195, 1196] site= 196 +1196 None n1-1196.plc1.org sls= [1195, 1196, 1197] site= 197 +1197 None n1-1197.plc1.org sls= [1196, 1197, 1198] site= 198 +1198 None n1-1198.plc1.org sls= [1197, 1198, 1199] site= 199 +1199 None n1-1199.plc1.org sls= [1198, 1199, 1200] site= 200 +1200 None n1-1200.plc1.org sls= [1199, 1200, 1201] site= 201 +1201 None n1-1201.plc1.org sls= [1200, 1201, 1202] site= 202 +1202 None n1-1202.plc1.org sls= [1201, 1202, 1203] site= 203 +1203 None n1-1203.plc1.org sls= [1202, 1203, 1204] site= 204 +1204 None n1-1204.plc1.org sls= [1203, 1204, 1205] site= 205 +1205 None n1-1205.plc1.org sls= [1204, 1205, 1206] site= 206 +1206 None n1-1206.plc1.org sls= [1205, 1206, 1207] site= 207 +1207 None n1-1207.plc1.org sls= [1206, 1207, 1208] site= 208 +1208 None n1-1208.plc1.org sls= [1207, 1208, 1209] site= 209 +1209 None n1-1209.plc1.org sls= [1208, 1209, 1210] site= 210 +1210 None n1-1210.plc1.org sls= [1209, 1210, 1211] site= 211 +1211 None n1-1211.plc1.org sls= [1210, 1211, 1212] site= 212 +1212 None n1-1212.plc1.org sls= [1211, 1212, 1213] site= 213 +1213 None n1-1213.plc1.org sls= [1212, 1213, 1214] site= 214 +1214 None n1-1214.plc1.org sls= [1213, 1214, 1215] site= 215 +1215 None n1-1215.plc1.org sls= [1214, 1215, 1216] site= 216 +1216 None n1-1216.plc1.org sls= [1215, 1216, 1217] site= 217 +1217 None n1-1217.plc1.org sls= [1216, 1217, 1218] site= 218 +1218 None n1-1218.plc1.org sls= [1217, 1218, 1219] site= 219 +1219 None n1-1219.plc1.org sls= [1218, 1219, 1220] site= 220 +1220 None n1-1220.plc1.org sls= [1219, 1220, 1221] site= 221 +1221 None n1-1221.plc1.org sls= [1220, 1221, 1222] site= 222 +1222 None n1-1222.plc1.org sls= [1221, 1222, 1223] site= 223 +1223 None n1-1223.plc1.org sls= [1222, 1223, 1224] site= 224 +1224 None n1-1224.plc1.org sls= [1223, 1224, 1225] site= 225 +1225 None n1-1225.plc1.org sls= [1224, 1225, 1226] site= 226 +1226 None n1-1226.plc1.org sls= [1225, 1226, 1227] site= 227 +1227 None n1-1227.plc1.org sls= [1226, 1227, 1228] site= 228 +1228 None n1-1228.plc1.org sls= [1227, 1228, 1229] site= 229 +1229 None n1-1229.plc1.org sls= [1228, 1229, 1230] site= 230 +1230 None n1-1230.plc1.org sls= [1229, 1230, 1231] site= 231 +1231 None n1-1231.plc1.org sls= [1230, 1231, 1232] site= 232 +1232 None n1-1232.plc1.org sls= [1231, 1232, 1233] site= 233 +1233 None n1-1233.plc1.org sls= [1232, 1233, 1234] site= 234 +1234 None n1-1234.plc1.org sls= [1233, 1234, 1235] site= 235 +1235 None n1-1235.plc1.org sls= [1234, 1235, 1236] site= 236 +1236 None n1-1236.plc1.org sls= [1235, 1236, 1237] site= 237 +1237 None n1-1237.plc1.org sls= [1236, 1237, 1238] site= 238 +1238 None n1-1238.plc1.org sls= [1237, 1238, 1239] site= 239 +1239 None n1-1239.plc1.org sls= [1238, 1239, 1240] site= 240 +1240 None n1-1240.plc1.org sls= [1239, 1240, 1241] site= 241 +1241 None n1-1241.plc1.org sls= [1240, 1241, 1242] site= 242 +1242 None n1-1242.plc1.org sls= [1241, 1242, 1243] site= 243 +1243 None n1-1243.plc1.org sls= [1242, 1243, 1244] site= 244 +1244 None n1-1244.plc1.org sls= [1243, 1244, 1245] site= 245 +1245 None n1-1245.plc1.org sls= [1244, 1245, 1246] site= 246 +1246 None n1-1246.plc1.org sls= [1245, 1246, 1247] site= 247 +1247 None n1-1247.plc1.org sls= [1246, 1247, 1248] site= 248 +1248 None n1-1248.plc1.org sls= [1247, 1248, 1249] site= 249 +1249 None n1-1249.plc1.org sls= [1248, 1249, 1250] site= 250 +1250 None n1-1250.plc1.org sls= [1249, 1250, 1251] site= 251 +1251 None n1-1251.plc1.org sls= [1250, 1251, 1252] site= 252 +1252 None n1-1252.plc1.org sls= [1251, 1252, 1253] site= 253 +1253 None n1-1253.plc1.org sls= [1252, 1253, 1254] site= 254 +1254 None n1-1254.plc1.org sls= [1253, 1254, 1255] site= 255 +1255 None n1-1255.plc1.org sls= [1254, 1255, 1256] site= 256 +1256 None n1-1256.plc1.org sls= [1255, 1256, 1257] site= 257 +1257 None n1-1257.plc1.org sls= [1256, 1257, 1258] site= 258 +1258 None n1-1258.plc1.org sls= [1257, 1258, 1259] site= 259 +1259 None n1-1259.plc1.org sls= [1258, 1259, 1260] site= 260 +1260 None n1-1260.plc1.org sls= [1259, 1260, 1261] site= 261 +1261 None n1-1261.plc1.org sls= [1260, 1261, 1262] site= 262 +1262 None n1-1262.plc1.org sls= [1261, 1262, 1263] site= 263 +1263 None n1-1263.plc1.org sls= [1262, 1263, 1264] site= 264 +1264 None n1-1264.plc1.org sls= [1263, 1264, 1265] site= 265 +1265 None n1-1265.plc1.org sls= [1264, 1265, 1266] site= 266 +1266 None n1-1266.plc1.org sls= [1265, 1266, 1267] site= 267 +1267 None n1-1267.plc1.org sls= [1266, 1267, 1268] site= 268 +1268 None n1-1268.plc1.org sls= [1267, 1268, 1269] site= 269 +1269 None n1-1269.plc1.org sls= [1268, 1269, 1270] site= 270 +1270 None n1-1270.plc1.org sls= [1269, 1270, 1271] site= 271 +1271 None n1-1271.plc1.org sls= [1270, 1271, 1272] site= 272 +1272 None n1-1272.plc1.org sls= [1271, 1272, 1273] site= 273 +1273 None n1-1273.plc1.org sls= [1272, 1273, 1274] site= 274 +1274 None n1-1274.plc1.org sls= [1273, 1274, 1275] site= 275 +1275 None n1-1275.plc1.org sls= [1274, 1275, 1276] site= 276 +1276 None n1-1276.plc1.org sls= [1275, 1276, 1277] site= 277 +1277 None n1-1277.plc1.org sls= [1276, 1277, 1278] site= 278 +1278 None n1-1278.plc1.org sls= [1277, 1278, 1279] site= 279 +1279 None n1-1279.plc1.org sls= [1278, 1279, 1280] site= 280 +1280 None n1-1280.plc1.org sls= [1279, 1280, 1281] site= 281 +1281 None n1-1281.plc1.org sls= [1280, 1281, 1282] site= 282 +1282 None n1-1282.plc1.org sls= [1281, 1282, 1283] site= 283 +1283 None n1-1283.plc1.org sls= [1282, 1283, 1284] site= 284 +1284 None n1-1284.plc1.org sls= [1283, 1284, 1285] site= 285 +1285 None n1-1285.plc1.org sls= [1284, 1285, 1286] site= 286 +1286 None n1-1286.plc1.org sls= [1285, 1286, 1287] site= 287 +1287 None n1-1287.plc1.org sls= [1286, 1287, 1288] site= 288 +1288 None n1-1288.plc1.org sls= [1287, 1288, 1289] site= 289 +1289 None n1-1289.plc1.org sls= [1288, 1289, 1290] site= 290 +1290 None n1-1290.plc1.org sls= [1289, 1290, 1291] site= 291 +1291 None n1-1291.plc1.org sls= [1290, 1291, 1292] site= 292 +1292 None n1-1292.plc1.org sls= [1291, 1292, 1293] site= 293 +1293 None n1-1293.plc1.org sls= [1292, 1293, 1294] site= 294 +1294 None n1-1294.plc1.org sls= [1293, 1294, 1295] site= 295 +1295 None n1-1295.plc1.org sls= [1294, 1295, 1296] site= 296 +1296 None n1-1296.plc1.org sls= [1295, 1296, 1297] site= 297 +1297 None n1-1297.plc1.org sls= [1296, 1297, 1298] site= 298 +1298 None n1-1298.plc1.org sls= [1297, 1298, 1299] site= 299 +1299 None n1-1299.plc1.org sls= [1298, 1299, 1300] site= 300 +1300 None n1-1300.plc1.org sls= [1299, 1300, 1301] site= 301 +1301 None n1-1301.plc1.org sls= [1300, 1301, 1302] site= 302 +1302 None n1-1302.plc1.org sls= [1301, 1302, 1303] site= 303 +1303 None n1-1303.plc1.org sls= [1302, 1303, 1304] site= 304 +1304 None n1-1304.plc1.org sls= [1303, 1304, 1305] site= 305 +1305 None n1-1305.plc1.org sls= [1304, 1305, 1306] site= 306 +1306 None n1-1306.plc1.org sls= [1305, 1306, 1307] site= 307 +1307 None n1-1307.plc1.org sls= [1306, 1307, 1308] site= 308 +1308 None n1-1308.plc1.org sls= [1307, 1308, 1309] site= 309 +1309 None n1-1309.plc1.org sls= [1308, 1309, 1310] site= 310 +1310 None n1-1310.plc1.org sls= [1309, 1310, 1311] site= 311 +1311 None n1-1311.plc1.org sls= [1310, 1311, 1312] site= 312 +1312 None n1-1312.plc1.org sls= [1311, 1312, 1313] site= 313 +1313 None n1-1313.plc1.org sls= [1312, 1313, 1314] site= 314 +1314 None n1-1314.plc1.org sls= [1313, 1314, 1315] site= 315 +1315 None n1-1315.plc1.org sls= [1314, 1315, 1316] site= 316 +1316 None n1-1316.plc1.org sls= [1315, 1316, 1317] site= 317 +1317 None n1-1317.plc1.org sls= [1316, 1317, 1318] site= 318 +1318 None n1-1318.plc1.org sls= [1317, 1318, 1319] site= 319 +1319 None n1-1319.plc1.org sls= [1318, 1319, 1320] site= 320 +1320 None n1-1320.plc1.org sls= [1319, 1320, 1321] site= 321 +1321 None n1-1321.plc1.org sls= [1320, 1321, 1322] site= 322 +1322 None n1-1322.plc1.org sls= [1321, 1322, 1323] site= 323 +1323 None n1-1323.plc1.org sls= [1322, 1323, 1324] site= 324 +1324 None n1-1324.plc1.org sls= [1323, 1324, 1325] site= 325 +1325 None n1-1325.plc1.org sls= [1324, 1325, 1326] site= 326 +1326 None n1-1326.plc1.org sls= [1325, 1326, 1327] site= 327 +1327 None n1-1327.plc1.org sls= [1326, 1327, 1328] site= 328 +1328 None n1-1328.plc1.org sls= [1327, 1328, 1329] site= 329 +1329 None n1-1329.plc1.org sls= [1328, 1329, 1330] site= 330 +1330 None n1-1330.plc1.org sls= [1329, 1330, 1331] site= 331 +1331 None n1-1331.plc1.org sls= [1330, 1331, 1332] site= 332 +1332 None n1-1332.plc1.org sls= [1331, 1332, 1333] site= 333 +1333 None n1-1333.plc1.org sls= [1332, 1333, 1334] site= 334 +1334 None n1-1334.plc1.org sls= [1333, 1334, 1335] site= 335 +1335 None n1-1335.plc1.org sls= [1334, 1335, 1336] site= 336 +1336 None n1-1336.plc1.org sls= [1335, 1336, 1337] site= 337 +1337 None n1-1337.plc1.org sls= [1336, 1337, 1338] site= 338 +1338 None n1-1338.plc1.org sls= [1337, 1338, 1339] site= 339 +1339 None n1-1339.plc1.org sls= [1338, 1339, 1340] site= 340 +1340 None n1-1340.plc1.org sls= [1339, 1340, 1341] site= 341 +1341 None n1-1341.plc1.org sls= [1340, 1341, 1342] site= 342 +1342 None n1-1342.plc1.org sls= [1341, 1342, 1343] site= 343 +1343 None n1-1343.plc1.org sls= [1342, 1343, 1344] site= 344 +1344 None n1-1344.plc1.org sls= [1343, 1344, 1345] site= 345 +1345 None n1-1345.plc1.org sls= [1344, 1345, 1346] site= 346 +1346 None n1-1346.plc1.org sls= [1345, 1346, 1347] site= 347 +1347 None n1-1347.plc1.org sls= [1346, 1347, 1348] site= 348 +1348 None n1-1348.plc1.org sls= [1347, 1348, 1349] site= 349 +1349 None n1-1349.plc1.org sls= [1348, 1349, 1350] site= 350 +1350 None n1-1350.plc1.org sls= [1349, 1350, 1351] site= 351 +1351 None n1-1351.plc1.org sls= [1350, 1351, 1352] site= 352 +1352 None n1-1352.plc1.org sls= [1351, 1352, 1353] site= 353 +1353 None n1-1353.plc1.org sls= [1352, 1353, 1354] site= 354 +1354 None n1-1354.plc1.org sls= [1353, 1354, 1355] site= 355 +1355 None n1-1355.plc1.org sls= [1354, 1355, 1356] site= 356 +1356 None n1-1356.plc1.org sls= [1355, 1356, 1357] site= 357 +1357 None n1-1357.plc1.org sls= [1356, 1357, 1358] site= 358 +1358 None n1-1358.plc1.org sls= [1357, 1358, 1359] site= 359 +1359 None n1-1359.plc1.org sls= [1358, 1359, 1360] site= 360 +1360 None n1-1360.plc1.org sls= [1359, 1360, 1361] site= 361 +1361 None n1-1361.plc1.org sls= [1360, 1361, 1362] site= 362 +1362 None n1-1362.plc1.org sls= [1361, 1362, 1363] site= 363 +1363 None n1-1363.plc1.org sls= [1362, 1363, 1364] site= 364 +1364 None n1-1364.plc1.org sls= [1363, 1364, 1365] site= 365 +1365 None n1-1365.plc1.org sls= [1364, 1365, 1366] site= 366 +1366 None n1-1366.plc1.org sls= [1365, 1366, 1367] site= 367 +1367 None n1-1367.plc1.org sls= [1366, 1367, 1368] site= 368 +1368 None n1-1368.plc1.org sls= [1367, 1368, 1369] site= 369 +1369 None n1-1369.plc1.org sls= [1368, 1369, 1370] site= 370 +1370 None n1-1370.plc1.org sls= [1369, 1370, 1371] site= 371 +1371 None n1-1371.plc1.org sls= [1370, 1371, 1372] site= 372 +1372 None n1-1372.plc1.org sls= [1371, 1372, 1373] site= 373 +1373 None n1-1373.plc1.org sls= [1372, 1373, 1374] site= 374 +1374 None n1-1374.plc1.org sls= [1373, 1374, 1375] site= 375 +1375 None n1-1375.plc1.org sls= [1374, 1375, 1376] site= 376 +1376 None n1-1376.plc1.org sls= [1375, 1376, 1377] site= 377 +1377 None n1-1377.plc1.org sls= [1376, 1377, 1378] site= 378 +1378 None n1-1378.plc1.org sls= [1377, 1378, 1379] site= 379 +1379 None n1-1379.plc1.org sls= [1378, 1379, 1380] site= 380 +1380 None n1-1380.plc1.org sls= [1379, 1380, 1381] site= 381 +1381 None n1-1381.plc1.org sls= [1380, 1381, 1382] site= 382 +1382 None n1-1382.plc1.org sls= [1381, 1382, 1383] site= 383 +1383 None n1-1383.plc1.org sls= [1382, 1383, 1384] site= 384 +1384 None n1-1384.plc1.org sls= [1383, 1384, 1385] site= 385 +1385 None n1-1385.plc1.org sls= [1384, 1385, 1386] site= 386 +1386 None n1-1386.plc1.org sls= [1385, 1386, 1387] site= 387 +1387 None n1-1387.plc1.org sls= [1386, 1387, 1388] site= 388 +1388 None n1-1388.plc1.org sls= [1387, 1388, 1389] site= 389 +1389 None n1-1389.plc1.org sls= [1388, 1389, 1390] site= 390 +1390 None n1-1390.plc1.org sls= [1389, 1390, 1391] site= 391 +1391 None n1-1391.plc1.org sls= [1390, 1391, 1392] site= 392 +1392 None n1-1392.plc1.org sls= [1391, 1392, 1393] site= 393 +1393 None n1-1393.plc1.org sls= [1392, 1393, 1394] site= 394 +1394 None n1-1394.plc1.org sls= [1393, 1394, 1395] site= 395 +1395 None n1-1395.plc1.org sls= [1394, 1395, 1396] site= 396 +1396 None n1-1396.plc1.org sls= [1395, 1396, 1397] site= 397 +1397 None n1-1397.plc1.org sls= [1396, 1397, 1398] site= 398 +1398 None n1-1398.plc1.org sls= [1397, 1398, 1399] site= 399 +1399 None n1-1399.plc1.org sls= [1398, 1399, 1400] site= 400 +1400 None n1-1400.plc1.org sls= [1399, 1400, 1401] site= 401 +1401 None n1-1401.plc1.org sls= [1400, 1401, 1402] site= 402 +1402 None n1-1402.plc1.org sls= [1401, 1402, 1403] site= 403 +1403 None n1-1403.plc1.org sls= [1402, 1403, 1404] site= 404 +1404 None n1-1404.plc1.org sls= [1403, 1404, 1405] site= 405 +1405 None n1-1405.plc1.org sls= [1404, 1405, 1406] site= 406 +1406 None n1-1406.plc1.org sls= [1405, 1406, 1407] site= 407 +1407 None n1-1407.plc1.org sls= [1406, 1407, 1408] site= 408 +1408 None n1-1408.plc1.org sls= [1407, 1408, 1409] site= 409 +1409 None n1-1409.plc1.org sls= [1408, 1409, 1410] site= 410 +1410 None n1-1410.plc1.org sls= [1409, 1410, 1411] site= 411 +1411 None n1-1411.plc1.org sls= [1410, 1411, 1412] site= 412 +1412 None n1-1412.plc1.org sls= [1411, 1412, 1413] site= 413 +1413 None n1-1413.plc1.org sls= [1412, 1413, 1414] site= 414 +1414 None n1-1414.plc1.org sls= [1413, 1414, 1415] site= 415 +1415 None n1-1415.plc1.org sls= [1414, 1415, 1416] site= 416 +1416 None n1-1416.plc1.org sls= [1415, 1416, 1417] site= 417 +1417 None n1-1417.plc1.org sls= [1416, 1417, 1418] site= 418 +1418 None n1-1418.plc1.org sls= [1417, 1418, 1419] site= 419 +1419 None n1-1419.plc1.org sls= [1418, 1419, 1420] site= 420 +1420 None n1-1420.plc1.org sls= [1419, 1420, 1421] site= 421 +1421 None n1-1421.plc1.org sls= [1420, 1421, 1422] site= 422 +1422 None n1-1422.plc1.org sls= [1421, 1422, 1423] site= 423 +1423 None n1-1423.plc1.org sls= [1422, 1423, 1424] site= 424 +1424 None n1-1424.plc1.org sls= [1423, 1424, 1425] site= 425 +1425 None n1-1425.plc1.org sls= [1424, 1425, 1426] site= 426 +1426 None n1-1426.plc1.org sls= [1425, 1426, 1427] site= 427 +1427 None n1-1427.plc1.org sls= [1426, 1427, 1428] site= 428 +1428 None n1-1428.plc1.org sls= [1427, 1428, 1429] site= 429 +1429 None n1-1429.plc1.org sls= [1428, 1429, 1430] site= 430 +1430 None n1-1430.plc1.org sls= [1429, 1430, 1431] site= 431 +1431 None n1-1431.plc1.org sls= [1430, 1431, 1432] site= 432 +1432 None n1-1432.plc1.org sls= [1431, 1432, 1433] site= 433 +1433 None n1-1433.plc1.org sls= [1432, 1433, 1434] site= 434 +1434 None n1-1434.plc1.org sls= [1433, 1434, 1435] site= 435 +1435 None n1-1435.plc1.org sls= [1434, 1435, 1436] site= 436 +1436 None n1-1436.plc1.org sls= [1435, 1436, 1437] site= 437 +1437 None n1-1437.plc1.org sls= [1436, 1437, 1438] site= 438 +1438 None n1-1438.plc1.org sls= [1437, 1438, 1439] site= 439 +1439 None n1-1439.plc1.org sls= [1438, 1439, 1440] site= 440 +1440 None n1-1440.plc1.org sls= [1439, 1440, 1441] site= 441 +1441 None n1-1441.plc1.org sls= [1440, 1441, 1442] site= 442 +1442 None n1-1442.plc1.org sls= [1441, 1442, 1443] site= 443 +1443 None n1-1443.plc1.org sls= [1442, 1443, 1444] site= 444 +1444 None n1-1444.plc1.org sls= [1443, 1444, 1445] site= 445 +1445 None n1-1445.plc1.org sls= [1444, 1445, 1446] site= 446 +1446 None n1-1446.plc1.org sls= [1445, 1446, 1447] site= 447 +1447 None n1-1447.plc1.org sls= [1446, 1447, 1448] site= 448 +1448 None n1-1448.plc1.org sls= [1447, 1448, 1449] site= 449 +1449 None n1-1449.plc1.org sls= [1448, 1449, 1450] site= 450 +1450 None n1-1450.plc1.org sls= [1449, 1450, 1451] site= 451 +1451 None n1-1451.plc1.org sls= [1450, 1451, 1452] site= 452 +1452 None n1-1452.plc1.org sls= [1451, 1452, 1453] site= 453 +1453 None n1-1453.plc1.org sls= [1452, 1453, 1454] site= 454 +1454 None n1-1454.plc1.org sls= [1453, 1454, 1455] site= 455 +1455 None n1-1455.plc1.org sls= [1454, 1455, 1456] site= 456 +1456 None n1-1456.plc1.org sls= [1455, 1456, 1457] site= 457 +1457 None n1-1457.plc1.org sls= [1456, 1457, 1458] site= 458 +1458 None n1-1458.plc1.org sls= [1457, 1458, 1459] site= 459 +1459 None n1-1459.plc1.org sls= [1458, 1459, 1460] site= 460 +1460 None n1-1460.plc1.org sls= [1459, 1460, 1461] site= 461 +1461 None n1-1461.plc1.org sls= [1460, 1461, 1462] site= 462 +1462 None n1-1462.plc1.org sls= [1461, 1462, 1463] site= 463 +1463 None n1-1463.plc1.org sls= [1462, 1463, 1464] site= 464 +1464 None n1-1464.plc1.org sls= [1463, 1464, 1465] site= 465 +1465 None n1-1465.plc1.org sls= [1464, 1465, 1466] site= 466 +1466 None n1-1466.plc1.org sls= [1465, 1466, 1467] site= 467 +1467 None n1-1467.plc1.org sls= [1466, 1467, 1468] site= 468 +1468 None n1-1468.plc1.org sls= [1467, 1468, 1469] site= 469 +1469 None n1-1469.plc1.org sls= [1468, 1469, 1470] site= 470 +1470 None n1-1470.plc1.org sls= [1469, 1470, 1471] site= 471 +1471 None n1-1471.plc1.org sls= [1470, 1471, 1472] site= 472 +1472 None n1-1472.plc1.org sls= [1471, 1472, 1473] site= 473 +1473 None n1-1473.plc1.org sls= [1472, 1473, 1474] site= 474 +1474 None n1-1474.plc1.org sls= [1473, 1474, 1475] site= 475 +1475 None n1-1475.plc1.org sls= [1474, 1475, 1476] site= 476 +1476 None n1-1476.plc1.org sls= [1475, 1476, 1477] site= 477 +1477 None n1-1477.plc1.org sls= [1476, 1477, 1478] site= 478 +1478 None n1-1478.plc1.org sls= [1477, 1478, 1479] site= 479 +1479 None n1-1479.plc1.org sls= [1478, 1479, 1480] site= 480 +1480 None n1-1480.plc1.org sls= [1479, 1480, 1481] site= 481 +1481 None n1-1481.plc1.org sls= [1480, 1481, 1482] site= 482 +1482 None n1-1482.plc1.org sls= [1481, 1482, 1483] site= 483 +1483 None n1-1483.plc1.org sls= [1482, 1483, 1484] site= 484 +1484 None n1-1484.plc1.org sls= [1483, 1484, 1485] site= 485 +1485 None n1-1485.plc1.org sls= [1484, 1485, 1486] site= 486 +1486 None n1-1486.plc1.org sls= [1485, 1486, 1487] site= 487 +1487 None n1-1487.plc1.org sls= [1486, 1487, 1488] site= 488 +1488 None n1-1488.plc1.org sls= [1487, 1488, 1489] site= 489 +1489 None n1-1489.plc1.org sls= [1488, 1489, 1490] site= 490 +1490 None n1-1490.plc1.org sls= [1489, 1490, 1491] site= 491 +1491 None n1-1491.plc1.org sls= [1490, 1491, 1492] site= 492 +1492 None n1-1492.plc1.org sls= [1491, 1492, 1493] site= 493 +1493 None n1-1493.plc1.org sls= [1492, 1493, 1494] site= 494 +1494 None n1-1494.plc1.org sls= [1493, 1494, 1495] site= 495 +1495 None n1-1495.plc1.org sls= [1494, 1495, 1496] site= 496 +1496 None n1-1496.plc1.org sls= [1495, 1496, 1497] site= 497 +1497 None n1-1497.plc1.org sls= [1496, 1497, 1498] site= 498 +1498 None n1-1498.plc1.org sls= [1497, 1498, 1499] site= 499 +1499 None n1-1499.plc1.org sls= [1498, 1499, 1500] site= 500 +1500 None n1-1500.plc1.org sls= [1499, 1500, 1501] site= 501 +1501 None n1-1501.plc1.org sls= [1500, 1501, 1502] site= 502 +1502 None n1-1502.plc1.org sls= [1501, 1502, 1503] site= 503 +1503 None n1-1503.plc1.org sls= [1502, 1503, 1504] site= 504 +1504 None n1-1504.plc1.org sls= [1503, 1504, 1505] site= 505 +1505 None n1-1505.plc1.org sls= [1504, 1505, 1506] site= 506 +1506 None n1-1506.plc1.org sls= [1505, 1506, 1507] site= 507 +1507 None n1-1507.plc1.org sls= [1506, 1507, 1508] site= 508 +1508 None n1-1508.plc1.org sls= [1507, 1508, 1509] site= 509 +1509 None n1-1509.plc1.org sls= [1508, 1509, 1510] site= 510 +1510 None n1-1510.plc1.org sls= [1509, 1510, 1511] site= 511 +1511 None n1-1511.plc1.org sls= [1510, 1511, 1512] site= 512 +1512 None n1-1512.plc1.org sls= [1511, 1512, 1513] site= 513 +1513 None n1-1513.plc1.org sls= [1512, 1513, 1514] site= 514 +1514 None n1-1514.plc1.org sls= [1513, 1514, 1515] site= 515 +1515 None n1-1515.plc1.org sls= [1514, 1515, 1516] site= 516 +1516 None n1-1516.plc1.org sls= [1515, 1516, 1517] site= 517 +1517 None n1-1517.plc1.org sls= [1516, 1517, 1518] site= 518 +1518 None n1-1518.plc1.org sls= [1517, 1518, 1519] site= 519 +1519 None n1-1519.plc1.org sls= [1518, 1519, 1520] site= 520 +1520 None n1-1520.plc1.org sls= [1519, 1520, 1521] site= 521 +1521 None n1-1521.plc1.org sls= [1520, 1521, 1522] site= 522 +1522 None n1-1522.plc1.org sls= [1521, 1522, 1523] site= 523 +1523 None n1-1523.plc1.org sls= [1522, 1523, 1524] site= 524 +1524 None n1-1524.plc1.org sls= [1523, 1524, 1525] site= 525 +1525 None n1-1525.plc1.org sls= [1524, 1525, 1526] site= 526 +1526 None n1-1526.plc1.org sls= [1525, 1526, 1527] site= 527 +1527 None n1-1527.plc1.org sls= [1526, 1527, 1528] site= 528 +1528 None n1-1528.plc1.org sls= [1527, 1528, 1529] site= 529 +1529 None n1-1529.plc1.org sls= [1528, 1529, 1530] site= 530 +1530 None n1-1530.plc1.org sls= [1529, 1530, 1531] site= 531 +1531 None n1-1531.plc1.org sls= [1530, 1531, 1532] site= 532 +1532 None n1-1532.plc1.org sls= [1531, 1532, 1533] site= 533 +1533 None n1-1533.plc1.org sls= [1532, 1533, 1534] site= 534 +1534 None n1-1534.plc1.org sls= [1533, 1534, 1535] site= 535 +1535 None n1-1535.plc1.org sls= [1534, 1535, 1536] site= 536 +1536 None n1-1536.plc1.org sls= [1535, 1536, 1537] site= 537 +1537 None n1-1537.plc1.org sls= [1536, 1537, 1538] site= 538 +1538 None n1-1538.plc1.org sls= [1537, 1538, 1539] site= 539 +1539 None n1-1539.plc1.org sls= [1538, 1539, 1540] site= 540 +1540 None n1-1540.plc1.org sls= [1539, 1540, 1541] site= 541 +1541 None n1-1541.plc1.org sls= [1540, 1541, 1542] site= 542 +1542 None n1-1542.plc1.org sls= [1541, 1542, 1543] site= 543 +1543 None n1-1543.plc1.org sls= [1542, 1543, 1544] site= 544 +1544 None n1-1544.plc1.org sls= [1543, 1544, 1545] site= 545 +1545 None n1-1545.plc1.org sls= [1544, 1545, 1546] site= 546 +1546 None n1-1546.plc1.org sls= [1545, 1546, 1547] site= 547 +1547 None n1-1547.plc1.org sls= [1546, 1547, 1548] site= 548 +1548 None n1-1548.plc1.org sls= [1547, 1548, 1549] site= 549 +1549 None n1-1549.plc1.org sls= [1548, 1549, 1550] site= 550 +1550 None n1-1550.plc1.org sls= [1549, 1550, 1551] site= 551 +1551 None n1-1551.plc1.org sls= [1550, 1551, 1552] site= 552 +1552 None n1-1552.plc1.org sls= [1551, 1552, 1553] site= 553 +1553 None n1-1553.plc1.org sls= [1552, 1553, 1554] site= 554 +1554 None n1-1554.plc1.org sls= [1553, 1554, 1555] site= 555 +1555 None n1-1555.plc1.org sls= [1554, 1555, 1556] site= 556 +1556 None n1-1556.plc1.org sls= [1555, 1556, 1557] site= 557 +1557 None n1-1557.plc1.org sls= [1556, 1557, 1558] site= 558 +1558 None n1-1558.plc1.org sls= [1557, 1558, 1559] site= 559 +1559 None n1-1559.plc1.org sls= [1558, 1559, 1560] site= 560 +1560 None n1-1560.plc1.org sls= [1559, 1560, 1561] site= 561 +1561 None n1-1561.plc1.org sls= [1560, 1561, 1562] site= 562 +1562 None n1-1562.plc1.org sls= [1561, 1562, 1563] site= 563 +1563 None n1-1563.plc1.org sls= [1562, 1563, 1564] site= 564 +1564 None n1-1564.plc1.org sls= [1563, 1564, 1565] site= 565 +1565 None n1-1565.plc1.org sls= [1564, 1565, 1566] site= 566 +1566 None n1-1566.plc1.org sls= [1565, 1566, 1567] site= 567 +1567 None n1-1567.plc1.org sls= [1566, 1567, 1568] site= 568 +1568 None n1-1568.plc1.org sls= [1567, 1568, 1569] site= 569 +1569 None n1-1569.plc1.org sls= [1568, 1569, 1570] site= 570 +1570 None n1-1570.plc1.org sls= [1569, 1570, 1571] site= 571 +1571 None n1-1571.plc1.org sls= [1570, 1571, 1572] site= 572 +1572 None n1-1572.plc1.org sls= [1571, 1572, 1573] site= 573 +1573 None n1-1573.plc1.org sls= [1572, 1573, 1574] site= 574 +1574 None n1-1574.plc1.org sls= [1573, 1574, 1575] site= 575 +1575 None n1-1575.plc1.org sls= [1574, 1575, 1576] site= 576 +1576 None n1-1576.plc1.org sls= [1575, 1576, 1577] site= 577 +1577 None n1-1577.plc1.org sls= [1576, 1577, 1578] site= 578 +1578 None n1-1578.plc1.org sls= [1577, 1578, 1579] site= 579 +1579 None n1-1579.plc1.org sls= [1578, 1579, 1580] site= 580 +1580 None n1-1580.plc1.org sls= [1579, 1580, 1581] site= 581 +1581 None n1-1581.plc1.org sls= [1580, 1581, 1582] site= 582 +1582 None n1-1582.plc1.org sls= [1581, 1582, 1583] site= 583 +1583 None n1-1583.plc1.org sls= [1582, 1583, 1584] site= 584 +1584 None n1-1584.plc1.org sls= [1583, 1584, 1585] site= 585 +1585 None n1-1585.plc1.org sls= [1584, 1585, 1586] site= 586 +1586 None n1-1586.plc1.org sls= [1585, 1586, 1587] site= 587 +1587 None n1-1587.plc1.org sls= [1586, 1587, 1588] site= 588 +1588 None n1-1588.plc1.org sls= [1587, 1588, 1589] site= 589 +1589 None n1-1589.plc1.org sls= [1588, 1589, 1590] site= 590 +1590 None n1-1590.plc1.org sls= [1589, 1590, 1591] site= 591 +1591 None n1-1591.plc1.org sls= [1590, 1591, 1592] site= 592 +1592 None n1-1592.plc1.org sls= [1591, 1592, 1593] site= 593 +1593 None n1-1593.plc1.org sls= [1592, 1593, 1594] site= 594 +1594 None n1-1594.plc1.org sls= [1593, 1594, 1595] site= 595 +1595 None n1-1595.plc1.org sls= [1594, 1595, 1596] site= 596 +1596 None n1-1596.plc1.org sls= [1595, 1596, 1597] site= 597 +1597 None n1-1597.plc1.org sls= [1596, 1597, 1598] site= 598 +1598 None n1-1598.plc1.org sls= [1597, 1598, 1599] site= 599 +1599 None n1-1599.plc1.org sls= [1598, 1599, 1600] site= 600 +1600 None n1-1600.plc1.org sls= [1599, 1600, 1601] site= 601 +1601 None n1-1601.plc1.org sls= [1600, 1601, 1602] site= 602 +1602 None n1-1602.plc1.org sls= [1601, 1602, 1603] site= 603 +1603 None n1-1603.plc1.org sls= [1602, 1603, 1604] site= 604 +1604 None n1-1604.plc1.org sls= [1603, 1604, 1605] site= 605 +1605 None n1-1605.plc1.org sls= [1604, 1605, 1606] site= 606 +1606 None n1-1606.plc1.org sls= [1605, 1606, 1607] site= 607 +1607 None n1-1607.plc1.org sls= [1606, 1607, 1608] site= 608 +1608 None n1-1608.plc1.org sls= [1607, 1608, 1609] site= 609 +1609 None n1-1609.plc1.org sls= [1608, 1609, 1610] site= 610 +1610 None n1-1610.plc1.org sls= [1609, 1610, 1611] site= 611 +1611 None n1-1611.plc1.org sls= [1610, 1611, 1612] site= 612 +1612 None n1-1612.plc1.org sls= [1611, 1612, 1613] site= 613 +1613 None n1-1613.plc1.org sls= [1612, 1613, 1614] site= 614 +1614 None n1-1614.plc1.org sls= [1613, 1614, 1615] site= 615 +1615 None n1-1615.plc1.org sls= [1614, 1615, 1616] site= 616 +1616 None n1-1616.plc1.org sls= [1615, 1616, 1617] site= 617 +1617 None n1-1617.plc1.org sls= [1616, 1617, 1618] site= 618 +1618 None n1-1618.plc1.org sls= [1617, 1618, 1619] site= 619 +1619 None n1-1619.plc1.org sls= [1618, 1619, 1620] site= 620 +1620 None n1-1620.plc1.org sls= [1619, 1620, 1621] site= 621 +1621 None n1-1621.plc1.org sls= [1620, 1621, 1622] site= 622 +1622 None n1-1622.plc1.org sls= [1621, 1622, 1623] site= 623 +1623 None n1-1623.plc1.org sls= [1622, 1623, 1624] site= 624 +1624 None n1-1624.plc1.org sls= [1623, 1624, 1625] site= 625 +1625 None n1-1625.plc1.org sls= [1624, 1625, 1626] site= 626 +1626 None n1-1626.plc1.org sls= [1625, 1626, 1627] site= 627 +1627 None n1-1627.plc1.org sls= [1626, 1627, 1628] site= 628 +1628 None n1-1628.plc1.org sls= [1627, 1628, 1629] site= 629 +1629 None n1-1629.plc1.org sls= [1628, 1629, 1630] site= 630 +1630 None n1-1630.plc1.org sls= [1629, 1630, 1631] site= 631 +1631 None n1-1631.plc1.org sls= [1630, 1631, 1632] site= 632 +1632 None n1-1632.plc1.org sls= [1631, 1632, 1633] site= 633 +1633 None n1-1633.plc1.org sls= [1632, 1633, 1634] site= 634 +1634 None n1-1634.plc1.org sls= [1633, 1634, 1635] site= 635 +1635 None n1-1635.plc1.org sls= [1634, 1635, 1636] site= 636 +1636 None n1-1636.plc1.org sls= [1635, 1636, 1637] site= 637 +1637 None n1-1637.plc1.org sls= [1636, 1637, 1638] site= 638 +1638 None n1-1638.plc1.org sls= [1637, 1638, 1639] site= 639 +1639 None n1-1639.plc1.org sls= [1638, 1639, 1640] site= 640 +1640 None n1-1640.plc1.org sls= [1639, 1640, 1641] site= 641 +1641 None n1-1641.plc1.org sls= [1640, 1641, 1642] site= 642 +1642 None n1-1642.plc1.org sls= [1641, 1642, 1643] site= 643 +1643 None n1-1643.plc1.org sls= [1642, 1643, 1644] site= 644 +1644 None n1-1644.plc1.org sls= [1643, 1644, 1645] site= 645 +1645 None n1-1645.plc1.org sls= [1644, 1645, 1646] site= 646 +1646 None n1-1646.plc1.org sls= [1645, 1646, 1647] site= 647 +1647 None n1-1647.plc1.org sls= [1646, 1647, 1648] site= 648 +1648 None n1-1648.plc1.org sls= [1647, 1648, 1649] site= 649 +1649 None n1-1649.plc1.org sls= [1648, 1649, 1650] site= 650 +1650 None n1-1650.plc1.org sls= [1649, 1650, 1651] site= 651 +1651 None n1-1651.plc1.org sls= [1650, 1651, 1652] site= 652 +1652 None n1-1652.plc1.org sls= [1651, 1652, 1653] site= 653 +1653 None n1-1653.plc1.org sls= [1652, 1653, 1654] site= 654 +1654 None n1-1654.plc1.org sls= [1653, 1654, 1655] site= 655 +1655 None n1-1655.plc1.org sls= [1654, 1655, 1656] site= 656 +1656 None n1-1656.plc1.org sls= [1655, 1656, 1657] site= 657 +1657 None n1-1657.plc1.org sls= [1656, 1657, 1658] site= 658 +1658 None n1-1658.plc1.org sls= [1657, 1658, 1659] site= 659 +1659 None n1-1659.plc1.org sls= [1658, 1659, 1660] site= 660 +1660 None n1-1660.plc1.org sls= [1659, 1660, 1661] site= 661 +1661 None n1-1661.plc1.org sls= [1660, 1661, 1662] site= 662 +1662 None n1-1662.plc1.org sls= [1661, 1662, 1663] site= 663 +1663 None n1-1663.plc1.org sls= [1662, 1663, 1664] site= 664 +1664 None n1-1664.plc1.org sls= [1663, 1664, 1665] site= 665 +1665 None n1-1665.plc1.org sls= [1664, 1665, 1666] site= 666 +1666 None n1-1666.plc1.org sls= [1665, 1666, 1667] site= 667 +1667 None n1-1667.plc1.org sls= [1666, 1667, 1668] site= 668 +1668 None n1-1668.plc1.org sls= [1667, 1668, 1669] site= 669 +1669 None n1-1669.plc1.org sls= [1668, 1669, 1670] site= 670 +1670 None n1-1670.plc1.org sls= [1669, 1670, 1671] site= 671 +1671 None n1-1671.plc1.org sls= [1670, 1671, 1672] site= 672 +1672 None n1-1672.plc1.org sls= [1671, 1672, 1673] site= 673 +1673 None n1-1673.plc1.org sls= [1672, 1673, 1674] site= 674 +1674 None n1-1674.plc1.org sls= [1673, 1674, 1675] site= 675 +1675 None n1-1675.plc1.org sls= [1674, 1675, 1676] site= 676 +1676 None n1-1676.plc1.org sls= [1675, 1676, 1677] site= 677 +1677 None n1-1677.plc1.org sls= [1676, 1677, 1678] site= 678 +1678 None n1-1678.plc1.org sls= [1677, 1678, 1679] site= 679 +1679 None n1-1679.plc1.org sls= [1678, 1679, 1680] site= 680 +1680 None n1-1680.plc1.org sls= [1679, 1680, 1681] site= 681 +1681 None n1-1681.plc1.org sls= [1680, 1681, 1682] site= 682 +1682 None n1-1682.plc1.org sls= [1681, 1682, 1683] site= 683 +1683 None n1-1683.plc1.org sls= [1682, 1683, 1684] site= 684 +1684 None n1-1684.plc1.org sls= [1683, 1684, 1685] site= 685 +1685 None n1-1685.plc1.org sls= [1684, 1685, 1686] site= 686 +1686 None n1-1686.plc1.org sls= [1685, 1686, 1687] site= 687 +1687 None n1-1687.plc1.org sls= [1686, 1687, 1688] site= 688 +1688 None n1-1688.plc1.org sls= [1687, 1688, 1689] site= 689 +1689 None n1-1689.plc1.org sls= [1688, 1689, 1690] site= 690 +1690 None n1-1690.plc1.org sls= [1689, 1690, 1691] site= 691 +1691 None n1-1691.plc1.org sls= [1690, 1691, 1692] site= 692 +1692 None n1-1692.plc1.org sls= [1691, 1692, 1693] site= 693 +1693 None n1-1693.plc1.org sls= [1692, 1693, 1694] site= 694 +1694 None n1-1694.plc1.org sls= [1693, 1694, 1695] site= 695 +1695 None n1-1695.plc1.org sls= [1694, 1695, 1696] site= 696 +1696 None n1-1696.plc1.org sls= [1695, 1696, 1697] site= 697 +1697 None n1-1697.plc1.org sls= [1696, 1697, 1698] site= 698 +1698 None n1-1698.plc1.org sls= [1697, 1698, 1699] site= 699 +1699 None n1-1699.plc1.org sls= [1698, 1699, 1700] site= 700 +1700 None n1-1700.plc1.org sls= [1699, 1700, 1701] site= 701 +1701 None n1-1701.plc1.org sls= [1700, 1701, 1702] site= 702 +1702 None n1-1702.plc1.org sls= [1701, 1702, 1703] site= 703 +1703 None n1-1703.plc1.org sls= [1702, 1703, 1704] site= 704 +1704 None n1-1704.plc1.org sls= [1703, 1704, 1705] site= 705 +1705 None n1-1705.plc1.org sls= [1704, 1705, 1706] site= 706 +1706 None n1-1706.plc1.org sls= [1705, 1706, 1707] site= 707 +1707 None n1-1707.plc1.org sls= [1706, 1707, 1708] site= 708 +1708 None n1-1708.plc1.org sls= [1707, 1708, 1709] site= 709 +1709 None n1-1709.plc1.org sls= [1708, 1709, 1710] site= 710 +1710 None n1-1710.plc1.org sls= [1709, 1710, 1711] site= 711 +1711 None n1-1711.plc1.org sls= [1710, 1711, 1712] site= 712 +1712 None n1-1712.plc1.org sls= [1711, 1712, 1713] site= 713 +1713 None n1-1713.plc1.org sls= [1712, 1713, 1714] site= 714 +1714 None n1-1714.plc1.org sls= [1713, 1714, 1715] site= 715 +1715 None n1-1715.plc1.org sls= [1714, 1715, 1716] site= 716 +1716 None n1-1716.plc1.org sls= [1715, 1716, 1717] site= 717 +1717 None n1-1717.plc1.org sls= [1716, 1717, 1718] site= 718 +1718 None n1-1718.plc1.org sls= [1717, 1718, 1719] site= 719 +1719 None n1-1719.plc1.org sls= [1718, 1719, 1720] site= 720 +1720 None n1-1720.plc1.org sls= [1719, 1720, 1721] site= 721 +1721 None n1-1721.plc1.org sls= [1720, 1721, 1722] site= 722 +1722 None n1-1722.plc1.org sls= [1721, 1722, 1723] site= 723 +1723 None n1-1723.plc1.org sls= [1722, 1723, 1724] site= 724 +1724 None n1-1724.plc1.org sls= [1723, 1724, 1725] site= 725 +1725 None n1-1725.plc1.org sls= [1724, 1725, 1726] site= 726 +1726 None n1-1726.plc1.org sls= [1725, 1726, 1727] site= 727 +1727 None n1-1727.plc1.org sls= [1726, 1727, 1728] site= 728 +1728 None n1-1728.plc1.org sls= [1727, 1728, 1729] site= 729 +1729 None n1-1729.plc1.org sls= [1728, 1729, 1730] site= 730 +1730 None n1-1730.plc1.org sls= [1729, 1730, 1731] site= 731 +1731 None n1-1731.plc1.org sls= [1730, 1731, 1732] site= 732 +1732 None n1-1732.plc1.org sls= [1731, 1732, 1733] site= 733 +1733 None n1-1733.plc1.org sls= [1732, 1733, 1734] site= 734 +1734 None n1-1734.plc1.org sls= [1733, 1734, 1735] site= 735 +1735 None n1-1735.plc1.org sls= [1734, 1735, 1736] site= 736 +1736 None n1-1736.plc1.org sls= [1735, 1736, 1737] site= 737 +1737 None n1-1737.plc1.org sls= [1736, 1737, 1738] site= 738 +1738 None n1-1738.plc1.org sls= [1737, 1738, 1739] site= 739 +1739 None n1-1739.plc1.org sls= [1738, 1739, 1740] site= 740 +1740 None n1-1740.plc1.org sls= [1739, 1740, 1741] site= 741 +1741 None n1-1741.plc1.org sls= [1740, 1741, 1742] site= 742 +1742 None n1-1742.plc1.org sls= [1741, 1742, 1743] site= 743 +1743 None n1-1743.plc1.org sls= [1742, 1743, 1744] site= 744 +1744 None n1-1744.plc1.org sls= [1743, 1744, 1745] site= 745 +1745 None n1-1745.plc1.org sls= [1744, 1745, 1746] site= 746 +1746 None n1-1746.plc1.org sls= [1745, 1746, 1747] site= 747 +1747 None n1-1747.plc1.org sls= [1746, 1747, 1748] site= 748 +1748 None n1-1748.plc1.org sls= [1747, 1748, 1749] site= 749 +1749 None n1-1749.plc1.org sls= [1748, 1749, 1750] site= 750 +1750 None n1-1750.plc1.org sls= [1749, 1750, 1751] site= 751 +1751 None n1-1751.plc1.org sls= [1750, 1751, 1752] site= 752 +1752 None n1-1752.plc1.org sls= [1751, 1752, 1753] site= 753 +1753 None n1-1753.plc1.org sls= [1752, 1753, 1754] site= 754 +1754 None n1-1754.plc1.org sls= [1753, 1754, 1755] site= 755 +1755 None n1-1755.plc1.org sls= [1754, 1755, 1756] site= 756 +1756 None n1-1756.plc1.org sls= [1755, 1756, 1757] site= 757 +1757 None n1-1757.plc1.org sls= [1756, 1757, 1758] site= 758 +1758 None n1-1758.plc1.org sls= [1757, 1758, 1759] site= 759 +1759 None n1-1759.plc1.org sls= [1758, 1759, 1760] site= 760 +1760 None n1-1760.plc1.org sls= [1759, 1760, 1761] site= 761 +1761 None n1-1761.plc1.org sls= [1760, 1761, 1762] site= 762 +1762 None n1-1762.plc1.org sls= [1761, 1762, 1763] site= 763 +1763 None n1-1763.plc1.org sls= [1762, 1763, 1764] site= 764 +1764 None n1-1764.plc1.org sls= [1763, 1764, 1765] site= 765 +1765 None n1-1765.plc1.org sls= [1764, 1765, 1766] site= 766 +1766 None n1-1766.plc1.org sls= [1765, 1766, 1767] site= 767 +1767 None n1-1767.plc1.org sls= [1766, 1767, 1768] site= 768 +1768 None n1-1768.plc1.org sls= [1767, 1768, 1769] site= 769 +1769 None n1-1769.plc1.org sls= [1768, 1769, 1770] site= 770 +1770 None n1-1770.plc1.org sls= [1769, 1770, 1771] site= 771 +1771 None n1-1771.plc1.org sls= [1770, 1771, 1772] site= 772 +1772 None n1-1772.plc1.org sls= [1771, 1772, 1773] site= 773 +1773 None n1-1773.plc1.org sls= [1772, 1773, 1774] site= 774 +1774 None n1-1774.plc1.org sls= [1773, 1774, 1775] site= 775 +1775 None n1-1775.plc1.org sls= [1774, 1775, 1776] site= 776 +1776 None n1-1776.plc1.org sls= [1775, 1776, 1777] site= 777 +1777 None n1-1777.plc1.org sls= [1776, 1777, 1778] site= 778 +1778 None n1-1778.plc1.org sls= [1777, 1778, 1779] site= 779 +1779 None n1-1779.plc1.org sls= [1778, 1779, 1780] site= 780 +1780 None n1-1780.plc1.org sls= [1779, 1780, 1781] site= 781 +1781 None n1-1781.plc1.org sls= [1780, 1781, 1782] site= 782 +1782 None n1-1782.plc1.org sls= [1781, 1782, 1783] site= 783 +1783 None n1-1783.plc1.org sls= [1782, 1783, 1784] site= 784 +1784 None n1-1784.plc1.org sls= [1783, 1784, 1785] site= 785 +1785 None n1-1785.plc1.org sls= [1784, 1785, 1786] site= 786 +1786 None n1-1786.plc1.org sls= [1785, 1786, 1787] site= 787 +1787 None n1-1787.plc1.org sls= [1786, 1787, 1788] site= 788 +1788 None n1-1788.plc1.org sls= [1787, 1788, 1789] site= 789 +1789 None n1-1789.plc1.org sls= [1788, 1789, 1790] site= 790 +1790 None n1-1790.plc1.org sls= [1789, 1790, 1791] site= 791 +1791 None n1-1791.plc1.org sls= [1790, 1791, 1792] site= 792 +1792 None n1-1792.plc1.org sls= [1791, 1792, 1793] site= 793 +1793 None n1-1793.plc1.org sls= [1792, 1793, 1794] site= 794 +1794 None n1-1794.plc1.org sls= [1793, 1794, 1795] site= 795 +1795 None n1-1795.plc1.org sls= [1794, 1795, 1796] site= 796 +1796 None n1-1796.plc1.org sls= [1795, 1796, 1797] site= 797 +1797 None n1-1797.plc1.org sls= [1796, 1797, 1798] site= 798 +1798 None n1-1798.plc1.org sls= [1797, 1798, 1799] site= 799 +1799 None n1-1799.plc1.org sls= [1798, 1799, 1800] site= 800 +1800 None n1-1800.plc1.org sls= [1799, 1800, 1801] site= 801 +1801 None n1-1801.plc1.org sls= [1800, 1801, 1802] site= 802 +1802 None n1-1802.plc1.org sls= [1801, 1802, 1803] site= 803 +1803 None n1-1803.plc1.org sls= [1802, 1803, 1804] site= 804 +1804 None n1-1804.plc1.org sls= [1803, 1804, 1805] site= 805 +1805 None n1-1805.plc1.org sls= [1804, 1805, 1806] site= 806 +1806 None n1-1806.plc1.org sls= [1805, 1806, 1807] site= 807 +1807 None n1-1807.plc1.org sls= [1806, 1807, 1808] site= 808 +1808 None n1-1808.plc1.org sls= [1807, 1808, 1809] site= 809 +1809 None n1-1809.plc1.org sls= [1808, 1809, 1810] site= 810 +1810 None n1-1810.plc1.org sls= [1809, 1810, 1811] site= 811 +1811 None n1-1811.plc1.org sls= [1810, 1811, 1812] site= 812 +1812 None n1-1812.plc1.org sls= [1811, 1812, 1813] site= 813 +1813 None n1-1813.plc1.org sls= [1812, 1813, 1814] site= 814 +1814 None n1-1814.plc1.org sls= [1813, 1814, 1815] site= 815 +1815 None n1-1815.plc1.org sls= [1814, 1815, 1816] site= 816 +1816 None n1-1816.plc1.org sls= [1815, 1816, 1817] site= 817 +1817 None n1-1817.plc1.org sls= [1816, 1817, 1818] site= 818 +1818 None n1-1818.plc1.org sls= [1817, 1818, 1819] site= 819 +1819 None n1-1819.plc1.org sls= [1818, 1819, 1820] site= 820 +1820 None n1-1820.plc1.org sls= [1819, 1820, 1821] site= 821 +1821 None n1-1821.plc1.org sls= [1820, 1821, 1822] site= 822 +1822 None n1-1822.plc1.org sls= [1821, 1822, 1823] site= 823 +1823 None n1-1823.plc1.org sls= [1822, 1823, 1824] site= 824 +1824 None n1-1824.plc1.org sls= [1823, 1824, 1825] site= 825 +1825 None n1-1825.plc1.org sls= [1824, 1825, 1826] site= 826 +1826 None n1-1826.plc1.org sls= [1825, 1826, 1827] site= 827 +1827 None n1-1827.plc1.org sls= [1826, 1827, 1828] site= 828 +1828 None n1-1828.plc1.org sls= [1827, 1828, 1829] site= 829 +1829 None n1-1829.plc1.org sls= [1828, 1829, 1830] site= 830 +1830 None n1-1830.plc1.org sls= [1829, 1830, 1831] site= 831 +1831 None n1-1831.plc1.org sls= [1830, 1831, 1832] site= 832 +1832 None n1-1832.plc1.org sls= [1831, 1832, 1833] site= 833 +1833 None n1-1833.plc1.org sls= [1832, 1833, 1834] site= 834 +1834 None n1-1834.plc1.org sls= [1833, 1834, 1835] site= 835 +1835 None n1-1835.plc1.org sls= [1834, 1835, 1836] site= 836 +1836 None n1-1836.plc1.org sls= [1835, 1836, 1837] site= 837 +1837 None n1-1837.plc1.org sls= [1836, 1837, 1838] site= 838 +1838 None n1-1838.plc1.org sls= [1837, 1838, 1839] site= 839 +1839 None n1-1839.plc1.org sls= [1838, 1839, 1840] site= 840 +1840 None n1-1840.plc1.org sls= [1839, 1840, 1841] site= 841 +1841 None n1-1841.plc1.org sls= [1840, 1841, 1842] site= 842 +1842 None n1-1842.plc1.org sls= [1841, 1842, 1843] site= 843 +1843 None n1-1843.plc1.org sls= [1842, 1843, 1844] site= 844 +1844 None n1-1844.plc1.org sls= [1843, 1844, 1845] site= 845 +1845 None n1-1845.plc1.org sls= [1844, 1845, 1846] site= 846 +1846 None n1-1846.plc1.org sls= [1845, 1846, 1847] site= 847 +1847 None n1-1847.plc1.org sls= [1846, 1847, 1848] site= 848 +1848 None n1-1848.plc1.org sls= [1847, 1848, 1849] site= 849 +1849 None n1-1849.plc1.org sls= [1848, 1849, 1850] site= 850 +1850 None n1-1850.plc1.org sls= [1849, 1850, 1851] site= 851 +1851 None n1-1851.plc1.org sls= [1850, 1851, 1852] site= 852 +1852 None n1-1852.plc1.org sls= [1851, 1852, 1853] site= 853 +1853 None n1-1853.plc1.org sls= [1852, 1853, 1854] site= 854 +1854 None n1-1854.plc1.org sls= [1853, 1854, 1855] site= 855 +1855 None n1-1855.plc1.org sls= [1854, 1855, 1856] site= 856 +1856 None n1-1856.plc1.org sls= [1855, 1856, 1857] site= 857 +1857 None n1-1857.plc1.org sls= [1856, 1857, 1858] site= 858 +1858 None n1-1858.plc1.org sls= [1857, 1858, 1859] site= 859 +1859 None n1-1859.plc1.org sls= [1858, 1859, 1860] site= 860 +1860 None n1-1860.plc1.org sls= [1859, 1860, 1861] site= 861 +1861 None n1-1861.plc1.org sls= [1860, 1861, 1862] site= 862 +1862 None n1-1862.plc1.org sls= [1861, 1862, 1863] site= 863 +1863 None n1-1863.plc1.org sls= [1862, 1863, 1864] site= 864 +1864 None n1-1864.plc1.org sls= [1863, 1864, 1865] site= 865 +1865 None n1-1865.plc1.org sls= [1864, 1865, 1866] site= 866 +1866 None n1-1866.plc1.org sls= [1865, 1866, 1867] site= 867 +1867 None n1-1867.plc1.org sls= [1866, 1867, 1868] site= 868 +1868 None n1-1868.plc1.org sls= [1867, 1868, 1869] site= 869 +1869 None n1-1869.plc1.org sls= [1868, 1869, 1870] site= 870 +1870 None n1-1870.plc1.org sls= [1869, 1870, 1871] site= 871 +1871 None n1-1871.plc1.org sls= [1870, 1871, 1872] site= 872 +1872 None n1-1872.plc1.org sls= [1871, 1872, 1873] site= 873 +1873 None n1-1873.plc1.org sls= [1872, 1873, 1874] site= 874 +1874 None n1-1874.plc1.org sls= [1873, 1874, 1875] site= 875 +1875 None n1-1875.plc1.org sls= [1874, 1875, 1876] site= 876 +1876 None n1-1876.plc1.org sls= [1875, 1876, 1877] site= 877 +1877 None n1-1877.plc1.org sls= [1876, 1877, 1878] site= 878 +1878 None n1-1878.plc1.org sls= [1877, 1878, 1879] site= 879 +1879 None n1-1879.plc1.org sls= [1878, 1879, 1880] site= 880 +1880 None n1-1880.plc1.org sls= [1879, 1880, 1881] site= 881 +1881 None n1-1881.plc1.org sls= [1880, 1881, 1882] site= 882 +1882 None n1-1882.plc1.org sls= [1881, 1882, 1883] site= 883 +1883 None n1-1883.plc1.org sls= [1882, 1883, 1884] site= 884 +1884 None n1-1884.plc1.org sls= [1883, 1884, 1885] site= 885 +1885 None n1-1885.plc1.org sls= [1884, 1885, 1886] site= 886 +1886 None n1-1886.plc1.org sls= [1885, 1886, 1887] site= 887 +1887 None n1-1887.plc1.org sls= [1886, 1887, 1888] site= 888 +1888 None n1-1888.plc1.org sls= [1887, 1888, 1889] site= 889 +1889 None n1-1889.plc1.org sls= [1888, 1889, 1890] site= 890 +1890 None n1-1890.plc1.org sls= [1889, 1890, 1891] site= 891 +1891 None n1-1891.plc1.org sls= [1890, 1891, 1892] site= 892 +1892 None n1-1892.plc1.org sls= [1891, 1892, 1893] site= 893 +1893 None n1-1893.plc1.org sls= [1892, 1893, 1894] site= 894 +1894 None n1-1894.plc1.org sls= [1893, 1894, 1895] site= 895 +1895 None n1-1895.plc1.org sls= [1894, 1895, 1896] site= 896 +1896 None n1-1896.plc1.org sls= [1895, 1896, 1897] site= 897 +1897 None n1-1897.plc1.org sls= [1896, 1897, 1898] site= 898 +1898 None n1-1898.plc1.org sls= [1897, 1898, 1899] site= 899 +1899 None n1-1899.plc1.org sls= [1898, 1899, 1900] site= 900 +1900 None n1-1900.plc1.org sls= [1899, 1900, 1901] site= 901 +1901 None n1-1901.plc1.org sls= [1900, 1901, 1902] site= 902 +1902 None n1-1902.plc1.org sls= [1901, 1902, 1903] site= 903 +1903 None n1-1903.plc1.org sls= [1902, 1903, 1904] site= 904 +1904 None n1-1904.plc1.org sls= [1903, 1904, 1905] site= 905 +1905 None n1-1905.plc1.org sls= [1904, 1905, 1906] site= 906 +1906 None n1-1906.plc1.org sls= [1905, 1906, 1907] site= 907 +1907 None n1-1907.plc1.org sls= [1906, 1907, 1908] site= 908 +1908 None n1-1908.plc1.org sls= [1907, 1908, 1909] site= 909 +1909 None n1-1909.plc1.org sls= [1908, 1909, 1910] site= 910 +1910 None n1-1910.plc1.org sls= [1909, 1910, 1911] site= 911 +1911 None n1-1911.plc1.org sls= [1910, 1911, 1912] site= 912 +1912 None n1-1912.plc1.org sls= [1911, 1912, 1913] site= 913 +1913 None n1-1913.plc1.org sls= [1912, 1913, 1914] site= 914 +1914 None n1-1914.plc1.org sls= [1913, 1914, 1915] site= 915 +1915 None n1-1915.plc1.org sls= [1914, 1915, 1916] site= 916 +1916 None n1-1916.plc1.org sls= [1915, 1916, 1917] site= 917 +1917 None n1-1917.plc1.org sls= [1916, 1917, 1918] site= 918 +1918 None n1-1918.plc1.org sls= [1917, 1918, 1919] site= 919 +1919 None n1-1919.plc1.org sls= [1918, 1919, 1920] site= 920 +1920 None n1-1920.plc1.org sls= [1919, 1920, 1921] site= 921 +1921 None n1-1921.plc1.org sls= [1920, 1921, 1922] site= 922 +1922 None n1-1922.plc1.org sls= [1921, 1922, 1923] site= 923 +1923 None n1-1923.plc1.org sls= [1922, 1923, 1924] site= 924 +1924 None n1-1924.plc1.org sls= [1923, 1924, 1925] site= 925 +1925 None n1-1925.plc1.org sls= [1924, 1925, 1926] site= 926 +1926 None n1-1926.plc1.org sls= [1925, 1926, 1927] site= 927 +1927 None n1-1927.plc1.org sls= [1926, 1927, 1928] site= 928 +1928 None n1-1928.plc1.org sls= [1927, 1928, 1929] site= 929 +1929 None n1-1929.plc1.org sls= [1928, 1929, 1930] site= 930 +1930 None n1-1930.plc1.org sls= [1929, 1930, 1931] site= 931 +1931 None n1-1931.plc1.org sls= [1930, 1931, 1932] site= 932 +1932 None n1-1932.plc1.org sls= [1931, 1932, 1933] site= 933 +1933 None n1-1933.plc1.org sls= [1932, 1933, 1934] site= 934 +1934 None n1-1934.plc1.org sls= [1933, 1934, 1935] site= 935 +1935 None n1-1935.plc1.org sls= [1934, 1935, 1936] site= 936 +1936 None n1-1936.plc1.org sls= [1935, 1936, 1937] site= 937 +1937 None n1-1937.plc1.org sls= [1936, 1937, 1938] site= 938 +1938 None n1-1938.plc1.org sls= [1937, 1938, 1939] site= 939 +1939 None n1-1939.plc1.org sls= [1938, 1939, 1940] site= 940 +1940 None n1-1940.plc1.org sls= [1939, 1940, 1941] site= 941 +1941 None n1-1941.plc1.org sls= [1940, 1941, 1942] site= 942 +1942 None n1-1942.plc1.org sls= [1941, 1942, 1943] site= 943 +1943 None n1-1943.plc1.org sls= [1942, 1943, 1944] site= 944 +1944 None n1-1944.plc1.org sls= [1943, 1944, 1945] site= 945 +1945 None n1-1945.plc1.org sls= [1944, 1945, 1946] site= 946 +1946 None n1-1946.plc1.org sls= [1945, 1946, 1947] site= 947 +1947 None n1-1947.plc1.org sls= [1946, 1947, 1948] site= 948 +1948 None n1-1948.plc1.org sls= [1947, 1948, 1949] site= 949 +1949 None n1-1949.plc1.org sls= [1948, 1949, 1950] site= 950 +1950 None n1-1950.plc1.org sls= [1949, 1950, 1951] site= 951 +1951 None n1-1951.plc1.org sls= [1950, 1951, 1952] site= 952 +1952 None n1-1952.plc1.org sls= [1951, 1952, 1953] site= 953 +1953 None n1-1953.plc1.org sls= [1952, 1953, 1954] site= 954 +1954 None n1-1954.plc1.org sls= [1953, 1954, 1955] site= 955 +1955 None n1-1955.plc1.org sls= [1954, 1955, 1956] site= 956 +1956 None n1-1956.plc1.org sls= [1955, 1956, 1957] site= 957 +1957 None n1-1957.plc1.org sls= [1956, 1957, 1958] site= 958 +1958 None n1-1958.plc1.org sls= [1957, 1958, 1959] site= 959 +1959 None n1-1959.plc1.org sls= [1958, 1959, 1960] site= 960 +1960 None n1-1960.plc1.org sls= [1959, 1960, 1961] site= 961 +1961 None n1-1961.plc1.org sls= [1960, 1961, 1962] site= 962 +1962 None n1-1962.plc1.org sls= [1961, 1962, 1963] site= 963 +1963 None n1-1963.plc1.org sls= [1962, 1963, 1964] site= 964 +1964 None n1-1964.plc1.org sls= [1963, 1964, 1965] site= 965 +1965 None n1-1965.plc1.org sls= [1964, 1965, 1966] site= 966 +1966 None n1-1966.plc1.org sls= [1965, 1966, 1967] site= 967 +1967 None n1-1967.plc1.org sls= [1966, 1967, 1968] site= 968 +1968 None n1-1968.plc1.org sls= [1967, 1968, 1969] site= 969 +1969 None n1-1969.plc1.org sls= [1968, 1969, 1970] site= 970 +1970 None n1-1970.plc1.org sls= [1969, 1970, 1971] site= 971 +1971 None n1-1971.plc1.org sls= [1970, 1971, 1972] site= 972 +1972 None n1-1972.plc1.org sls= [1971, 1972, 1973] site= 973 +1973 None n1-1973.plc1.org sls= [1972, 1973, 1974] site= 974 +1974 None n1-1974.plc1.org sls= [1973, 1974, 1975] site= 975 +1975 None n1-1975.plc1.org sls= [1974, 1975, 1976] site= 976 +1976 None n1-1976.plc1.org sls= [1975, 1976, 1977] site= 977 +1977 None n1-1977.plc1.org sls= [1976, 1977, 1978] site= 978 +1978 None n1-1978.plc1.org sls= [1977, 1978, 1979] site= 979 +1979 None n1-1979.plc1.org sls= [1978, 1979, 1980] site= 980 +1980 None n1-1980.plc1.org sls= [1979, 1980, 1981] site= 981 +1981 None n1-1981.plc1.org sls= [1980, 1981, 1982] site= 982 +1982 None n1-1982.plc1.org sls= [1981, 1982, 1983] site= 983 +1983 None n1-1983.plc1.org sls= [1982, 1983, 1984] site= 984 +1984 None n1-1984.plc1.org sls= [1983, 1984, 1985] site= 985 +1985 None n1-1985.plc1.org sls= [1984, 1985, 1986] site= 986 +1986 None n1-1986.plc1.org sls= [1985, 1986, 1987] site= 987 +1987 None n1-1987.plc1.org sls= [1986, 1987, 1988] site= 988 +1988 None n1-1988.plc1.org sls= [1987, 1988, 1989] site= 989 +1989 None n1-1989.plc1.org sls= [1988, 1989, 1990] site= 990 +1990 None n1-1990.plc1.org sls= [1989, 1990, 1991] site= 991 +1991 None n1-1991.plc1.org sls= [1990, 1991, 1992] site= 992 +1992 None n1-1992.plc1.org sls= [1991, 1992, 1993] site= 993 +1993 None n1-1993.plc1.org sls= [1992, 1993, 1994] site= 994 +1994 None n1-1994.plc1.org sls= [1993, 1994, 1995] site= 995 +1995 None n1-1995.plc1.org sls= [1994, 1995, 1996] site= 996 +1996 None n1-1996.plc1.org sls= [1995, 1996, 1997] site= 997 +1997 None n1-1997.plc1.org sls= [1996, 1997, 1998] site= 998 +1998 None n1-1998.plc1.org sls= [1997, 1998, 1999] site= 999 +1999 None n1-1999.plc1.org sls= [1998, 1999, 2000] site= 1000 +2000 None n1-2000.plc1.org sls= [1999, 2000, 2001] site= 1001 +2001 None n1-2001.plc1.org sls= [2000, 2001] site= 2 +2002 None n1-2002.plc1.org sls= [2001] site= 3 +2003 None n1-2003.plc1.org sls= [] site= 4 +2004 None n1-2004.plc1.org sls= [] site= 5 +2005 None n1-2005.plc1.org sls= [] site= 6 +2006 None n1-2006.plc1.org sls= [] site= 7 +2007 None n1-2007.plc1.org sls= [] site= 8 +2008 None n1-2008.plc1.org sls= [] site= 9 +2009 None n1-2009.plc1.org sls= [] site= 10 +2010 None n1-2010.plc1.org sls= [] site= 11 +2011 None n1-2011.plc1.org sls= [] site= 12 +2012 None n1-2012.plc1.org sls= [] site= 13 +2013 None n1-2013.plc1.org sls= [] site= 14 +2014 None n1-2014.plc1.org sls= [] site= 15 +2015 None n1-2015.plc1.org sls= [] site= 16 +2016 None n1-2016.plc1.org sls= [] site= 17 +2017 None n1-2017.plc1.org sls= [] site= 18 +2018 None n1-2018.plc1.org sls= [] site= 19 +2019 None n1-2019.plc1.org sls= [] site= 20 +2020 None n1-2020.plc1.org sls= [] site= 21 +2021 None n1-2021.plc1.org sls= [] site= 22 +2022 None n1-2022.plc1.org sls= [] site= 23 +2023 None n1-2023.plc1.org sls= [] site= 24 +2024 None n1-2024.plc1.org sls= [] site= 25 +2025 None n1-2025.plc1.org sls= [] site= 26 +2026 None n1-2026.plc1.org sls= [] site= 27 +2027 None n1-2027.plc1.org sls= [] site= 28 +2028 None n1-2028.plc1.org sls= [] site= 29 +2029 None n1-2029.plc1.org sls= [] site= 30 +2030 None n1-2030.plc1.org sls= [] site= 31 +2031 None n1-2031.plc1.org sls= [] site= 32 +2032 None n1-2032.plc1.org sls= [] site= 33 +2033 None n1-2033.plc1.org sls= [] site= 34 +2034 None n1-2034.plc1.org sls= [] site= 35 +2035 None n1-2035.plc1.org sls= [] site= 36 +2036 None n1-2036.plc1.org sls= [] site= 37 +2037 None n1-2037.plc1.org sls= [] site= 38 +2038 None n1-2038.plc1.org sls= [] site= 39 +2039 None n1-2039.plc1.org sls= [] site= 40 +2040 None n1-2040.plc1.org sls= [] site= 41 +2041 None n1-2041.plc1.org sls= [] site= 42 +2042 None n1-2042.plc1.org sls= [] site= 43 +2043 None n1-2043.plc1.org sls= [] site= 44 +2044 None n1-2044.plc1.org sls= [] site= 45 +2045 None n1-2045.plc1.org sls= [] site= 46 +2046 None n1-2046.plc1.org sls= [] site= 47 +2047 None n1-2047.plc1.org sls= [] site= 48 +2048 None n1-2048.plc1.org sls= [] site= 49 +2049 None n1-2049.plc1.org sls= [] site= 50 +2050 None n1-2050.plc1.org sls= [] site= 51 +2051 None n1-2051.plc1.org sls= [] site= 52 +2052 None n1-2052.plc1.org sls= [] site= 53 +2053 None n1-2053.plc1.org sls= [] site= 54 +2054 None n1-2054.plc1.org sls= [] site= 55 +2055 None n1-2055.plc1.org sls= [] site= 56 +2056 None n1-2056.plc1.org sls= [] site= 57 +2057 None n1-2057.plc1.org sls= [] site= 58 +2058 None n1-2058.plc1.org sls= [] site= 59 +2059 None n1-2059.plc1.org sls= [] site= 60 +2060 None n1-2060.plc1.org sls= [] site= 61 +2061 None n1-2061.plc1.org sls= [] site= 62 +2062 None n1-2062.plc1.org sls= [] site= 63 +2063 None n1-2063.plc1.org sls= [] site= 64 +2064 None n1-2064.plc1.org sls= [] site= 65 +2065 None n1-2065.plc1.org sls= [] site= 66 +2066 None n1-2066.plc1.org sls= [] site= 67 +2067 None n1-2067.plc1.org sls= [] site= 68 +2068 None n1-2068.plc1.org sls= [] site= 69 +2069 None n1-2069.plc1.org sls= [] site= 70 +2070 None n1-2070.plc1.org sls= [] site= 71 +2071 None n1-2071.plc1.org sls= [] site= 72 +2072 None n1-2072.plc1.org sls= [] site= 73 +2073 None n1-2073.plc1.org sls= [] site= 74 +2074 None n1-2074.plc1.org sls= [] site= 75 +2075 None n1-2075.plc1.org sls= [] site= 76 +2076 None n1-2076.plc1.org sls= [] site= 77 +2077 None n1-2077.plc1.org sls= [] site= 78 +2078 None n1-2078.plc1.org sls= [] site= 79 +2079 None n1-2079.plc1.org sls= [] site= 80 +2080 None n1-2080.plc1.org sls= [] site= 81 +2081 None n1-2081.plc1.org sls= [] site= 82 +2082 None n1-2082.plc1.org sls= [] site= 83 +2083 None n1-2083.plc1.org sls= [] site= 84 +2084 None n1-2084.plc1.org sls= [] site= 85 +2085 None n1-2085.plc1.org sls= [] site= 86 +2086 None n1-2086.plc1.org sls= [] site= 87 +2087 None n1-2087.plc1.org sls= [] site= 88 +2088 None n1-2088.plc1.org sls= [] site= 89 +2089 None n1-2089.plc1.org sls= [] site= 90 +2090 None n1-2090.plc1.org sls= [] site= 91 +2091 None n1-2091.plc1.org sls= [] site= 92 +2092 None n1-2092.plc1.org sls= [] site= 93 +2093 None n1-2093.plc1.org sls= [] site= 94 +2094 None n1-2094.plc1.org sls= [] site= 95 +2095 None n1-2095.plc1.org sls= [] site= 96 +2096 None n1-2096.plc1.org sls= [] site= 97 +2097 None n1-2097.plc1.org sls= [] site= 98 +2098 None n1-2098.plc1.org sls= [] site= 99 +2099 None n1-2099.plc1.org sls= [] site= 100 +2100 None n1-2100.plc1.org sls= [] site= 101 +2101 None n1-2101.plc1.org sls= [] site= 102 +2102 None n1-2102.plc1.org sls= [] site= 103 +2103 None n1-2103.plc1.org sls= [] site= 104 +2104 None n1-2104.plc1.org sls= [] site= 105 +2105 None n1-2105.plc1.org sls= [] site= 106 +2106 None n1-2106.plc1.org sls= [] site= 107 +2107 None n1-2107.plc1.org sls= [] site= 108 +2108 None n1-2108.plc1.org sls= [] site= 109 +2109 None n1-2109.plc1.org sls= [] site= 110 +2110 None n1-2110.plc1.org sls= [] site= 111 +2111 None n1-2111.plc1.org sls= [] site= 112 +2112 None n1-2112.plc1.org sls= [] site= 113 +2113 None n1-2113.plc1.org sls= [] site= 114 +2114 None n1-2114.plc1.org sls= [] site= 115 +2115 None n1-2115.plc1.org sls= [] site= 116 +2116 None n1-2116.plc1.org sls= [] site= 117 +2117 None n1-2117.plc1.org sls= [] site= 118 +2118 None n1-2118.plc1.org sls= [] site= 119 +2119 None n1-2119.plc1.org sls= [] site= 120 +2120 None n1-2120.plc1.org sls= [] site= 121 +2121 None n1-2121.plc1.org sls= [] site= 122 +2122 None n1-2122.plc1.org sls= [] site= 123 +2123 None n1-2123.plc1.org sls= [] site= 124 +2124 None n1-2124.plc1.org sls= [] site= 125 +2125 None n1-2125.plc1.org sls= [] site= 126 +2126 None n1-2126.plc1.org sls= [] site= 127 +2127 None n1-2127.plc1.org sls= [] site= 128 +2128 None n1-2128.plc1.org sls= [] site= 129 +2129 None n1-2129.plc1.org sls= [] site= 130 +2130 None n1-2130.plc1.org sls= [] site= 131 +2131 None n1-2131.plc1.org sls= [] site= 132 +2132 None n1-2132.plc1.org sls= [] site= 133 +2133 None n1-2133.plc1.org sls= [] site= 134 +2134 None n1-2134.plc1.org sls= [] site= 135 +2135 None n1-2135.plc1.org sls= [] site= 136 +2136 None n1-2136.plc1.org sls= [] site= 137 +2137 None n1-2137.plc1.org sls= [] site= 138 +2138 None n1-2138.plc1.org sls= [] site= 139 +2139 None n1-2139.plc1.org sls= [] site= 140 +2140 None n1-2140.plc1.org sls= [] site= 141 +2141 None n1-2141.plc1.org sls= [] site= 142 +2142 None n1-2142.plc1.org sls= [] site= 143 +2143 None n1-2143.plc1.org sls= [] site= 144 +2144 None n1-2144.plc1.org sls= [] site= 145 +2145 None n1-2145.plc1.org sls= [] site= 146 +2146 None n1-2146.plc1.org sls= [] site= 147 +2147 None n1-2147.plc1.org sls= [] site= 148 +2148 None n1-2148.plc1.org sls= [] site= 149 +2149 None n1-2149.plc1.org sls= [] site= 150 +2150 None n1-2150.plc1.org sls= [] site= 151 +2151 None n1-2151.plc1.org sls= [] site= 152 +2152 None n1-2152.plc1.org sls= [] site= 153 +2153 None n1-2153.plc1.org sls= [] site= 154 +2154 None n1-2154.plc1.org sls= [] site= 155 +2155 None n1-2155.plc1.org sls= [] site= 156 +2156 None n1-2156.plc1.org sls= [] site= 157 +2157 None n1-2157.plc1.org sls= [] site= 158 +2158 None n1-2158.plc1.org sls= [] site= 159 +2159 None n1-2159.plc1.org sls= [] site= 160 +2160 None n1-2160.plc1.org sls= [] site= 161 +2161 None n1-2161.plc1.org sls= [] site= 162 +2162 None n1-2162.plc1.org sls= [] site= 163 +2163 None n1-2163.plc1.org sls= [] site= 164 +2164 None n1-2164.plc1.org sls= [] site= 165 +2165 None n1-2165.plc1.org sls= [] site= 166 +2166 None n1-2166.plc1.org sls= [] site= 167 +2167 None n1-2167.plc1.org sls= [] site= 168 +2168 None n1-2168.plc1.org sls= [] site= 169 +2169 None n1-2169.plc1.org sls= [] site= 170 +2170 None n1-2170.plc1.org sls= [] site= 171 +2171 None n1-2171.plc1.org sls= [] site= 172 +2172 None n1-2172.plc1.org sls= [] site= 173 +2173 None n1-2173.plc1.org sls= [] site= 174 +2174 None n1-2174.plc1.org sls= [] site= 175 +2175 None n1-2175.plc1.org sls= [] site= 176 +2176 None n1-2176.plc1.org sls= [] site= 177 +2177 None n1-2177.plc1.org sls= [] site= 178 +2178 None n1-2178.plc1.org sls= [] site= 179 +2179 None n1-2179.plc1.org sls= [] site= 180 +2180 None n1-2180.plc1.org sls= [] site= 181 +2181 None n1-2181.plc1.org sls= [] site= 182 +2182 None n1-2182.plc1.org sls= [] site= 183 +2183 None n1-2183.plc1.org sls= [] site= 184 +2184 None n1-2184.plc1.org sls= [] site= 185 +2185 None n1-2185.plc1.org sls= [] site= 186 +2186 None n1-2186.plc1.org sls= [] site= 187 +2187 None n1-2187.plc1.org sls= [] site= 188 +2188 None n1-2188.plc1.org sls= [] site= 189 +2189 None n1-2189.plc1.org sls= [] site= 190 +2190 None n1-2190.plc1.org sls= [] site= 191 +2191 None n1-2191.plc1.org sls= [] site= 192 +2192 None n1-2192.plc1.org sls= [] site= 193 +2193 None n1-2193.plc1.org sls= [] site= 194 +2194 None n1-2194.plc1.org sls= [] site= 195 +2195 None n1-2195.plc1.org sls= [] site= 196 +2196 None n1-2196.plc1.org sls= [] site= 197 +2197 None n1-2197.plc1.org sls= [] site= 198 +2198 None n1-2198.plc1.org sls= [] site= 199 +2199 None n1-2199.plc1.org sls= [] site= 200 +2200 None n1-2200.plc1.org sls= [] site= 201 +2201 None n1-2201.plc1.org sls= [] site= 202 +2202 None n1-2202.plc1.org sls= [] site= 203 +2203 None n1-2203.plc1.org sls= [] site= 204 +2204 None n1-2204.plc1.org sls= [] site= 205 +2205 None n1-2205.plc1.org sls= [] site= 206 +2206 None n1-2206.plc1.org sls= [] site= 207 +2207 None n1-2207.plc1.org sls= [] site= 208 +2208 None n1-2208.plc1.org sls= [] site= 209 +2209 None n1-2209.plc1.org sls= [] site= 210 +2210 None n1-2210.plc1.org sls= [] site= 211 +2211 None n1-2211.plc1.org sls= [] site= 212 +2212 None n1-2212.plc1.org sls= [] site= 213 +2213 None n1-2213.plc1.org sls= [] site= 214 +2214 None n1-2214.plc1.org sls= [] site= 215 +2215 None n1-2215.plc1.org sls= [] site= 216 +2216 None n1-2216.plc1.org sls= [] site= 217 +2217 None n1-2217.plc1.org sls= [] site= 218 +2218 None n1-2218.plc1.org sls= [] site= 219 +2219 None n1-2219.plc1.org sls= [] site= 220 +2220 None n1-2220.plc1.org sls= [] site= 221 +2221 None n1-2221.plc1.org sls= [] site= 222 +2222 None n1-2222.plc1.org sls= [] site= 223 +2223 None n1-2223.plc1.org sls= [] site= 224 +2224 None n1-2224.plc1.org sls= [] site= 225 +2225 None n1-2225.plc1.org sls= [] site= 226 +2226 None n1-2226.plc1.org sls= [] site= 227 +2227 None n1-2227.plc1.org sls= [] site= 228 +2228 None n1-2228.plc1.org sls= [] site= 229 +2229 None n1-2229.plc1.org sls= [] site= 230 +2230 None n1-2230.plc1.org sls= [] site= 231 +2231 None n1-2231.plc1.org sls= [] site= 232 +2232 None n1-2232.plc1.org sls= [] site= 233 +2233 None n1-2233.plc1.org sls= [] site= 234 +2234 None n1-2234.plc1.org sls= [] site= 235 +2235 None n1-2235.plc1.org sls= [] site= 236 +2236 None n1-2236.plc1.org sls= [] site= 237 +2237 None n1-2237.plc1.org sls= [] site= 238 +2238 None n1-2238.plc1.org sls= [] site= 239 +2239 None n1-2239.plc1.org sls= [] site= 240 +2240 None n1-2240.plc1.org sls= [] site= 241 +2241 None n1-2241.plc1.org sls= [] site= 242 +2242 None n1-2242.plc1.org sls= [] site= 243 +2243 None n1-2243.plc1.org sls= [] site= 244 +2244 None n1-2244.plc1.org sls= [] site= 245 +2245 None n1-2245.plc1.org sls= [] site= 246 +2246 None n1-2246.plc1.org sls= [] site= 247 +2247 None n1-2247.plc1.org sls= [] site= 248 +2248 None n1-2248.plc1.org sls= [] site= 249 +2249 None n1-2249.plc1.org sls= [] site= 250 +2250 None n1-2250.plc1.org sls= [] site= 251 +2251 None n1-2251.plc1.org sls= [] site= 252 +2252 None n1-2252.plc1.org sls= [] site= 253 +2253 None n1-2253.plc1.org sls= [] site= 254 +2254 None n1-2254.plc1.org sls= [] site= 255 +2255 None n1-2255.plc1.org sls= [] site= 256 +2256 None n1-2256.plc1.org sls= [] site= 257 +2257 None n1-2257.plc1.org sls= [] site= 258 +2258 None n1-2258.plc1.org sls= [] site= 259 +2259 None n1-2259.plc1.org sls= [] site= 260 +2260 None n1-2260.plc1.org sls= [] site= 261 +2261 None n1-2261.plc1.org sls= [] site= 262 +2262 None n1-2262.plc1.org sls= [] site= 263 +2263 None n1-2263.plc1.org sls= [] site= 264 +2264 None n1-2264.plc1.org sls= [] site= 265 +2265 None n1-2265.plc1.org sls= [] site= 266 +2266 None n1-2266.plc1.org sls= [] site= 267 +2267 None n1-2267.plc1.org sls= [] site= 268 +2268 None n1-2268.plc1.org sls= [] site= 269 +2269 None n1-2269.plc1.org sls= [] site= 270 +2270 None n1-2270.plc1.org sls= [] site= 271 +2271 None n1-2271.plc1.org sls= [] site= 272 +2272 None n1-2272.plc1.org sls= [] site= 273 +2273 None n1-2273.plc1.org sls= [] site= 274 +2274 None n1-2274.plc1.org sls= [] site= 275 +2275 None n1-2275.plc1.org sls= [] site= 276 +2276 None n1-2276.plc1.org sls= [] site= 277 +2277 None n1-2277.plc1.org sls= [] site= 278 +2278 None n1-2278.plc1.org sls= [] site= 279 +2279 None n1-2279.plc1.org sls= [] site= 280 +2280 None n1-2280.plc1.org sls= [] site= 281 +2281 None n1-2281.plc1.org sls= [] site= 282 +2282 None n1-2282.plc1.org sls= [] site= 283 +2283 None n1-2283.plc1.org sls= [] site= 284 +2284 None n1-2284.plc1.org sls= [] site= 285 +2285 None n1-2285.plc1.org sls= [] site= 286 +2286 None n1-2286.plc1.org sls= [] site= 287 +2287 None n1-2287.plc1.org sls= [] site= 288 +2288 None n1-2288.plc1.org sls= [] site= 289 +2289 None n1-2289.plc1.org sls= [] site= 290 +2290 None n1-2290.plc1.org sls= [] site= 291 +2291 None n1-2291.plc1.org sls= [] site= 292 +2292 None n1-2292.plc1.org sls= [] site= 293 +2293 None n1-2293.plc1.org sls= [] site= 294 +2294 None n1-2294.plc1.org sls= [] site= 295 +2295 None n1-2295.plc1.org sls= [] site= 296 +2296 None n1-2296.plc1.org sls= [] site= 297 +2297 None n1-2297.plc1.org sls= [] site= 298 +2298 None n1-2298.plc1.org sls= [] site= 299 +2299 None n1-2299.plc1.org sls= [] site= 300 +2300 None n1-2300.plc1.org sls= [] site= 301 +2301 None n1-2301.plc1.org sls= [] site= 302 +2302 None n1-2302.plc1.org sls= [] site= 303 +2303 None n1-2303.plc1.org sls= [] site= 304 +2304 None n1-2304.plc1.org sls= [] site= 305 +2305 None n1-2305.plc1.org sls= [] site= 306 +2306 None n1-2306.plc1.org sls= [] site= 307 +2307 None n1-2307.plc1.org sls= [] site= 308 +2308 None n1-2308.plc1.org sls= [] site= 309 +2309 None n1-2309.plc1.org sls= [] site= 310 +2310 None n1-2310.plc1.org sls= [] site= 311 +2311 None n1-2311.plc1.org sls= [] site= 312 +2312 None n1-2312.plc1.org sls= [] site= 313 +2313 None n1-2313.plc1.org sls= [] site= 314 +2314 None n1-2314.plc1.org sls= [] site= 315 +2315 None n1-2315.plc1.org sls= [] site= 316 +2316 None n1-2316.plc1.org sls= [] site= 317 +2317 None n1-2317.plc1.org sls= [] site= 318 +2318 None n1-2318.plc1.org sls= [] site= 319 +2319 None n1-2319.plc1.org sls= [] site= 320 +2320 None n1-2320.plc1.org sls= [] site= 321 +2321 None n1-2321.plc1.org sls= [] site= 322 +2322 None n1-2322.plc1.org sls= [] site= 323 +2323 None n1-2323.plc1.org sls= [] site= 324 +2324 None n1-2324.plc1.org sls= [] site= 325 +2325 None n1-2325.plc1.org sls= [] site= 326 +2326 None n1-2326.plc1.org sls= [] site= 327 +2327 None n1-2327.plc1.org sls= [] site= 328 +2328 None n1-2328.plc1.org sls= [] site= 329 +2329 None n1-2329.plc1.org sls= [] site= 330 +2330 None n1-2330.plc1.org sls= [] site= 331 +2331 None n1-2331.plc1.org sls= [] site= 332 +2332 None n1-2332.plc1.org sls= [] site= 333 +2333 None n1-2333.plc1.org sls= [] site= 334 +2334 None n1-2334.plc1.org sls= [] site= 335 +2335 None n1-2335.plc1.org sls= [] site= 336 +2336 None n1-2336.plc1.org sls= [] site= 337 +2337 None n1-2337.plc1.org sls= [] site= 338 +2338 None n1-2338.plc1.org sls= [] site= 339 +2339 None n1-2339.plc1.org sls= [] site= 340 +2340 None n1-2340.plc1.org sls= [] site= 341 +2341 None n1-2341.plc1.org sls= [] site= 342 +2342 None n1-2342.plc1.org sls= [] site= 343 +2343 None n1-2343.plc1.org sls= [] site= 344 +2344 None n1-2344.plc1.org sls= [] site= 345 +2345 None n1-2345.plc1.org sls= [] site= 346 +2346 None n1-2346.plc1.org sls= [] site= 347 +2347 None n1-2347.plc1.org sls= [] site= 348 +2348 None n1-2348.plc1.org sls= [] site= 349 +2349 None n1-2349.plc1.org sls= [] site= 350 +2350 None n1-2350.plc1.org sls= [] site= 351 +2351 None n1-2351.plc1.org sls= [] site= 352 +2352 None n1-2352.plc1.org sls= [] site= 353 +2353 None n1-2353.plc1.org sls= [] site= 354 +2354 None n1-2354.plc1.org sls= [] site= 355 +2355 None n1-2355.plc1.org sls= [] site= 356 +2356 None n1-2356.plc1.org sls= [] site= 357 +2357 None n1-2357.plc1.org sls= [] site= 358 +2358 None n1-2358.plc1.org sls= [] site= 359 +2359 None n1-2359.plc1.org sls= [] site= 360 +2360 None n1-2360.plc1.org sls= [] site= 361 +2361 None n1-2361.plc1.org sls= [] site= 362 +2362 None n1-2362.plc1.org sls= [] site= 363 +2363 None n1-2363.plc1.org sls= [] site= 364 +2364 None n1-2364.plc1.org sls= [] site= 365 +2365 None n1-2365.plc1.org sls= [] site= 366 +2366 None n1-2366.plc1.org sls= [] site= 367 +2367 None n1-2367.plc1.org sls= [] site= 368 +2368 None n1-2368.plc1.org sls= [] site= 369 +2369 None n1-2369.plc1.org sls= [] site= 370 +2370 None n1-2370.plc1.org sls= [] site= 371 +2371 None n1-2371.plc1.org sls= [] site= 372 +2372 None n1-2372.plc1.org sls= [] site= 373 +2373 None n1-2373.plc1.org sls= [] site= 374 +2374 None n1-2374.plc1.org sls= [] site= 375 +2375 None n1-2375.plc1.org sls= [] site= 376 +2376 None n1-2376.plc1.org sls= [] site= 377 +2377 None n1-2377.plc1.org sls= [] site= 378 +2378 None n1-2378.plc1.org sls= [] site= 379 +2379 None n1-2379.plc1.org sls= [] site= 380 +2380 None n1-2380.plc1.org sls= [] site= 381 +2381 None n1-2381.plc1.org sls= [] site= 382 +2382 None n1-2382.plc1.org sls= [] site= 383 +2383 None n1-2383.plc1.org sls= [] site= 384 +2384 None n1-2384.plc1.org sls= [] site= 385 +2385 None n1-2385.plc1.org sls= [] site= 386 +2386 None n1-2386.plc1.org sls= [] site= 387 +2387 None n1-2387.plc1.org sls= [] site= 388 +2388 None n1-2388.plc1.org sls= [] site= 389 +2389 None n1-2389.plc1.org sls= [] site= 390 +2390 None n1-2390.plc1.org sls= [] site= 391 +2391 None n1-2391.plc1.org sls= [] site= 392 +2392 None n1-2392.plc1.org sls= [] site= 393 +2393 None n1-2393.plc1.org sls= [] site= 394 +2394 None n1-2394.plc1.org sls= [] site= 395 +2395 None n1-2395.plc1.org sls= [] site= 396 +2396 None n1-2396.plc1.org sls= [] site= 397 +2397 None n1-2397.plc1.org sls= [] site= 398 +2398 None n1-2398.plc1.org sls= [] site= 399 +2399 None n1-2399.plc1.org sls= [] site= 400 +2400 None n1-2400.plc1.org sls= [] site= 401 +2401 None n1-2401.plc1.org sls= [] site= 402 +2402 None n1-2402.plc1.org sls= [] site= 403 +2403 None n1-2403.plc1.org sls= [] site= 404 +2404 None n1-2404.plc1.org sls= [] site= 405 +2405 None n1-2405.plc1.org sls= [] site= 406 +2406 None n1-2406.plc1.org sls= [] site= 407 +2407 None n1-2407.plc1.org sls= [] site= 408 +2408 None n1-2408.plc1.org sls= [] site= 409 +2409 None n1-2409.plc1.org sls= [] site= 410 +2410 None n1-2410.plc1.org sls= [] site= 411 +2411 None n1-2411.plc1.org sls= [] site= 412 +2412 None n1-2412.plc1.org sls= [] site= 413 +2413 None n1-2413.plc1.org sls= [] site= 414 +2414 None n1-2414.plc1.org sls= [] site= 415 +2415 None n1-2415.plc1.org sls= [] site= 416 +2416 None n1-2416.plc1.org sls= [] site= 417 +2417 None n1-2417.plc1.org sls= [] site= 418 +2418 None n1-2418.plc1.org sls= [] site= 419 +2419 None n1-2419.plc1.org sls= [] site= 420 +2420 None n1-2420.plc1.org sls= [] site= 421 +2421 None n1-2421.plc1.org sls= [] site= 422 +2422 None n1-2422.plc1.org sls= [] site= 423 +2423 None n1-2423.plc1.org sls= [] site= 424 +2424 None n1-2424.plc1.org sls= [] site= 425 +2425 None n1-2425.plc1.org sls= [] site= 426 +2426 None n1-2426.plc1.org sls= [] site= 427 +2427 None n1-2427.plc1.org sls= [] site= 428 +2428 None n1-2428.plc1.org sls= [] site= 429 +2429 None n1-2429.plc1.org sls= [] site= 430 +2430 None n1-2430.plc1.org sls= [] site= 431 +2431 None n1-2431.plc1.org sls= [] site= 432 +2432 None n1-2432.plc1.org sls= [] site= 433 +2433 None n1-2433.plc1.org sls= [] site= 434 +2434 None n1-2434.plc1.org sls= [] site= 435 +2435 None n1-2435.plc1.org sls= [] site= 436 +2436 None n1-2436.plc1.org sls= [] site= 437 +2437 None n1-2437.plc1.org sls= [] site= 438 +2438 None n1-2438.plc1.org sls= [] site= 439 +2439 None n1-2439.plc1.org sls= [] site= 440 +2440 None n1-2440.plc1.org sls= [] site= 441 +2441 None n1-2441.plc1.org sls= [] site= 442 +2442 None n1-2442.plc1.org sls= [] site= 443 +2443 None n1-2443.plc1.org sls= [] site= 444 +2444 None n1-2444.plc1.org sls= [] site= 445 +2445 None n1-2445.plc1.org sls= [] site= 446 +2446 None n1-2446.plc1.org sls= [] site= 447 +2447 None n1-2447.plc1.org sls= [] site= 448 +2448 None n1-2448.plc1.org sls= [] site= 449 +2449 None n1-2449.plc1.org sls= [] site= 450 +2450 None n1-2450.plc1.org sls= [] site= 451 +2451 None n1-2451.plc1.org sls= [] site= 452 +2452 None n1-2452.plc1.org sls= [] site= 453 +2453 None n1-2453.plc1.org sls= [] site= 454 +2454 None n1-2454.plc1.org sls= [] site= 455 +2455 None n1-2455.plc1.org sls= [] site= 456 +2456 None n1-2456.plc1.org sls= [] site= 457 +2457 None n1-2457.plc1.org sls= [] site= 458 +2458 None n1-2458.plc1.org sls= [] site= 459 +2459 None n1-2459.plc1.org sls= [] site= 460 +2460 None n1-2460.plc1.org sls= [] site= 461 +2461 None n1-2461.plc1.org sls= [] site= 462 +2462 None n1-2462.plc1.org sls= [] site= 463 +2463 None n1-2463.plc1.org sls= [] site= 464 +2464 None n1-2464.plc1.org sls= [] site= 465 +2465 None n1-2465.plc1.org sls= [] site= 466 +2466 None n1-2466.plc1.org sls= [] site= 467 +2467 None n1-2467.plc1.org sls= [] site= 468 +2468 None n1-2468.plc1.org sls= [] site= 469 +2469 None n1-2469.plc1.org sls= [] site= 470 +2470 None n1-2470.plc1.org sls= [] site= 471 +2471 None n1-2471.plc1.org sls= [] site= 472 +2472 None n1-2472.plc1.org sls= [] site= 473 +2473 None n1-2473.plc1.org sls= [] site= 474 +2474 None n1-2474.plc1.org sls= [] site= 475 +2475 None n1-2475.plc1.org sls= [] site= 476 +2476 None n1-2476.plc1.org sls= [] site= 477 +2477 None n1-2477.plc1.org sls= [] site= 478 +2478 None n1-2478.plc1.org sls= [] site= 479 +2479 None n1-2479.plc1.org sls= [] site= 480 +2480 None n1-2480.plc1.org sls= [] site= 481 +2481 None n1-2481.plc1.org sls= [] site= 482 +2482 None n1-2482.plc1.org sls= [] site= 483 +2483 None n1-2483.plc1.org sls= [] site= 484 +2484 None n1-2484.plc1.org sls= [] site= 485 +2485 None n1-2485.plc1.org sls= [] site= 486 +2486 None n1-2486.plc1.org sls= [] site= 487 +2487 None n1-2487.plc1.org sls= [] site= 488 +2488 None n1-2488.plc1.org sls= [] site= 489 +2489 None n1-2489.plc1.org sls= [] site= 490 +2490 None n1-2490.plc1.org sls= [] site= 491 +2491 None n1-2491.plc1.org sls= [] site= 492 +2492 None n1-2492.plc1.org sls= [] site= 493 +2493 None n1-2493.plc1.org sls= [] site= 494 +2494 None n1-2494.plc1.org sls= [] site= 495 +2495 None n1-2495.plc1.org sls= [] site= 496 +2496 None n1-2496.plc1.org sls= [] site= 497 +2497 None n1-2497.plc1.org sls= [] site= 498 +2498 None n1-2498.plc1.org sls= [] site= 499 +2499 None n1-2499.plc1.org sls= [] site= 500 +2500 None n1-2500.plc1.org sls= [] site= 501 +2501 None n1-2501.plc1.org sls= [] site= 502 +2502 None n1-2502.plc1.org sls= [] site= 503 +2503 None n1-2503.plc1.org sls= [] site= 504 +2504 None n1-2504.plc1.org sls= [] site= 505 +2505 None n1-2505.plc1.org sls= [] site= 506 +2506 None n1-2506.plc1.org sls= [] site= 507 +2507 None n1-2507.plc1.org sls= [] site= 508 +2508 None n1-2508.plc1.org sls= [] site= 509 +2509 None n1-2509.plc1.org sls= [] site= 510 +2510 None n1-2510.plc1.org sls= [] site= 511 +2511 None n1-2511.plc1.org sls= [] site= 512 +2512 None n1-2512.plc1.org sls= [] site= 513 +2513 None n1-2513.plc1.org sls= [] site= 514 +2514 None n1-2514.plc1.org sls= [] site= 515 +2515 None n1-2515.plc1.org sls= [] site= 516 +2516 None n1-2516.plc1.org sls= [] site= 517 +2517 None n1-2517.plc1.org sls= [] site= 518 +2518 None n1-2518.plc1.org sls= [] site= 519 +2519 None n1-2519.plc1.org sls= [] site= 520 +2520 None n1-2520.plc1.org sls= [] site= 521 +2521 None n1-2521.plc1.org sls= [] site= 522 +2522 None n1-2522.plc1.org sls= [] site= 523 +2523 None n1-2523.plc1.org sls= [] site= 524 +2524 None n1-2524.plc1.org sls= [] site= 525 +2525 None n1-2525.plc1.org sls= [] site= 526 +2526 None n1-2526.plc1.org sls= [] site= 527 +2527 None n1-2527.plc1.org sls= [] site= 528 +2528 None n1-2528.plc1.org sls= [] site= 529 +2529 None n1-2529.plc1.org sls= [] site= 530 +2530 None n1-2530.plc1.org sls= [] site= 531 +2531 None n1-2531.plc1.org sls= [] site= 532 +2532 None n1-2532.plc1.org sls= [] site= 533 +2533 None n1-2533.plc1.org sls= [] site= 534 +2534 None n1-2534.plc1.org sls= [] site= 535 +2535 None n1-2535.plc1.org sls= [] site= 536 +2536 None n1-2536.plc1.org sls= [] site= 537 +2537 None n1-2537.plc1.org sls= [] site= 538 +2538 None n1-2538.plc1.org sls= [] site= 539 +2539 None n1-2539.plc1.org sls= [] site= 540 +2540 None n1-2540.plc1.org sls= [] site= 541 +2541 None n1-2541.plc1.org sls= [] site= 542 +2542 None n1-2542.plc1.org sls= [] site= 543 +2543 None n1-2543.plc1.org sls= [] site= 544 +2544 None n1-2544.plc1.org sls= [] site= 545 +2545 None n1-2545.plc1.org sls= [] site= 546 +2546 None n1-2546.plc1.org sls= [] site= 547 +2547 None n1-2547.plc1.org sls= [] site= 548 +2548 None n1-2548.plc1.org sls= [] site= 549 +2549 None n1-2549.plc1.org sls= [] site= 550 +2550 None n1-2550.plc1.org sls= [] site= 551 +2551 None n1-2551.plc1.org sls= [] site= 552 +2552 None n1-2552.plc1.org sls= [] site= 553 +2553 None n1-2553.plc1.org sls= [] site= 554 +2554 None n1-2554.plc1.org sls= [] site= 555 +2555 None n1-2555.plc1.org sls= [] site= 556 +2556 None n1-2556.plc1.org sls= [] site= 557 +2557 None n1-2557.plc1.org sls= [] site= 558 +2558 None n1-2558.plc1.org sls= [] site= 559 +2559 None n1-2559.plc1.org sls= [] site= 560 +2560 None n1-2560.plc1.org sls= [] site= 561 +2561 None n1-2561.plc1.org sls= [] site= 562 +2562 None n1-2562.plc1.org sls= [] site= 563 +2563 None n1-2563.plc1.org sls= [] site= 564 +2564 None n1-2564.plc1.org sls= [] site= 565 +2565 None n1-2565.plc1.org sls= [] site= 566 +2566 None n1-2566.plc1.org sls= [] site= 567 +2567 None n1-2567.plc1.org sls= [] site= 568 +2568 None n1-2568.plc1.org sls= [] site= 569 +2569 None n1-2569.plc1.org sls= [] site= 570 +2570 None n1-2570.plc1.org sls= [] site= 571 +2571 None n1-2571.plc1.org sls= [] site= 572 +2572 None n1-2572.plc1.org sls= [] site= 573 +2573 None n1-2573.plc1.org sls= [] site= 574 +2574 None n1-2574.plc1.org sls= [] site= 575 +2575 None n1-2575.plc1.org sls= [] site= 576 +2576 None n1-2576.plc1.org sls= [] site= 577 +2577 None n1-2577.plc1.org sls= [] site= 578 +2578 None n1-2578.plc1.org sls= [] site= 579 +2579 None n1-2579.plc1.org sls= [] site= 580 +2580 None n1-2580.plc1.org sls= [] site= 581 +2581 None n1-2581.plc1.org sls= [] site= 582 +2582 None n1-2582.plc1.org sls= [] site= 583 +2583 None n1-2583.plc1.org sls= [] site= 584 +2584 None n1-2584.plc1.org sls= [] site= 585 +2585 None n1-2585.plc1.org sls= [] site= 586 +2586 None n1-2586.plc1.org sls= [] site= 587 +2587 None n1-2587.plc1.org sls= [] site= 588 +2588 None n1-2588.plc1.org sls= [] site= 589 +2589 None n1-2589.plc1.org sls= [] site= 590 +2590 None n1-2590.plc1.org sls= [] site= 591 +2591 None n1-2591.plc1.org sls= [] site= 592 +2592 None n1-2592.plc1.org sls= [] site= 593 +2593 None n1-2593.plc1.org sls= [] site= 594 +2594 None n1-2594.plc1.org sls= [] site= 595 +2595 None n1-2595.plc1.org sls= [] site= 596 +2596 None n1-2596.plc1.org sls= [] site= 597 +2597 None n1-2597.plc1.org sls= [] site= 598 +2598 None n1-2598.plc1.org sls= [] site= 599 +2599 None n1-2599.plc1.org sls= [] site= 600 +2600 None n1-2600.plc1.org sls= [] site= 601 +2601 None n1-2601.plc1.org sls= [] site= 602 +2602 None n1-2602.plc1.org sls= [] site= 603 +2603 None n1-2603.plc1.org sls= [] site= 604 +2604 None n1-2604.plc1.org sls= [] site= 605 +2605 None n1-2605.plc1.org sls= [] site= 606 +2606 None n1-2606.plc1.org sls= [] site= 607 +2607 None n1-2607.plc1.org sls= [] site= 608 +2608 None n1-2608.plc1.org sls= [] site= 609 +2609 None n1-2609.plc1.org sls= [] site= 610 +2610 None n1-2610.plc1.org sls= [] site= 611 +2611 None n1-2611.plc1.org sls= [] site= 612 +2612 None n1-2612.plc1.org sls= [] site= 613 +2613 None n1-2613.plc1.org sls= [] site= 614 +2614 None n1-2614.plc1.org sls= [] site= 615 +2615 None n1-2615.plc1.org sls= [] site= 616 +2616 None n1-2616.plc1.org sls= [] site= 617 +2617 None n1-2617.plc1.org sls= [] site= 618 +2618 None n1-2618.plc1.org sls= [] site= 619 +2619 None n1-2619.plc1.org sls= [] site= 620 +2620 None n1-2620.plc1.org sls= [] site= 621 +2621 None n1-2621.plc1.org sls= [] site= 622 +2622 None n1-2622.plc1.org sls= [] site= 623 +2623 None n1-2623.plc1.org sls= [] site= 624 +2624 None n1-2624.plc1.org sls= [] site= 625 +2625 None n1-2625.plc1.org sls= [] site= 626 +2626 None n1-2626.plc1.org sls= [] site= 627 +2627 None n1-2627.plc1.org sls= [] site= 628 +2628 None n1-2628.plc1.org sls= [] site= 629 +2629 None n1-2629.plc1.org sls= [] site= 630 +2630 None n1-2630.plc1.org sls= [] site= 631 +2631 None n1-2631.plc1.org sls= [] site= 632 +2632 None n1-2632.plc1.org sls= [] site= 633 +2633 None n1-2633.plc1.org sls= [] site= 634 +2634 None n1-2634.plc1.org sls= [] site= 635 +2635 None n1-2635.plc1.org sls= [] site= 636 +2636 None n1-2636.plc1.org sls= [] site= 637 +2637 None n1-2637.plc1.org sls= [] site= 638 +2638 None n1-2638.plc1.org sls= [] site= 639 +2639 None n1-2639.plc1.org sls= [] site= 640 +2640 None n1-2640.plc1.org sls= [] site= 641 +2641 None n1-2641.plc1.org sls= [] site= 642 +2642 None n1-2642.plc1.org sls= [] site= 643 +2643 None n1-2643.plc1.org sls= [] site= 644 +2644 None n1-2644.plc1.org sls= [] site= 645 +2645 None n1-2645.plc1.org sls= [] site= 646 +2646 None n1-2646.plc1.org sls= [] site= 647 +2647 None n1-2647.plc1.org sls= [] site= 648 +2648 None n1-2648.plc1.org sls= [] site= 649 +2649 None n1-2649.plc1.org sls= [] site= 650 +2650 None n1-2650.plc1.org sls= [] site= 651 +2651 None n1-2651.plc1.org sls= [] site= 652 +2652 None n1-2652.plc1.org sls= [] site= 653 +2653 None n1-2653.plc1.org sls= [] site= 654 +2654 None n1-2654.plc1.org sls= [] site= 655 +2655 None n1-2655.plc1.org sls= [] site= 656 +2656 None n1-2656.plc1.org sls= [] site= 657 +2657 None n1-2657.plc1.org sls= [] site= 658 +2658 None n1-2658.plc1.org sls= [] site= 659 +2659 None n1-2659.plc1.org sls= [] site= 660 +2660 None n1-2660.plc1.org sls= [] site= 661 +2661 None n1-2661.plc1.org sls= [] site= 662 +2662 None n1-2662.plc1.org sls= [] site= 663 +2663 None n1-2663.plc1.org sls= [] site= 664 +2664 None n1-2664.plc1.org sls= [] site= 665 +2665 None n1-2665.plc1.org sls= [] site= 666 +2666 None n1-2666.plc1.org sls= [] site= 667 +2667 None n1-2667.plc1.org sls= [] site= 668 +2668 None n1-2668.plc1.org sls= [] site= 669 +2669 None n1-2669.plc1.org sls= [] site= 670 +2670 None n1-2670.plc1.org sls= [] site= 671 +2671 None n1-2671.plc1.org sls= [] site= 672 +2672 None n1-2672.plc1.org sls= [] site= 673 +2673 None n1-2673.plc1.org sls= [] site= 674 +2674 None n1-2674.plc1.org sls= [] site= 675 +2675 None n1-2675.plc1.org sls= [] site= 676 +2676 None n1-2676.plc1.org sls= [] site= 677 +2677 None n1-2677.plc1.org sls= [] site= 678 +2678 None n1-2678.plc1.org sls= [] site= 679 +2679 None n1-2679.plc1.org sls= [] site= 680 +2680 None n1-2680.plc1.org sls= [] site= 681 +2681 None n1-2681.plc1.org sls= [] site= 682 +2682 None n1-2682.plc1.org sls= [] site= 683 +2683 None n1-2683.plc1.org sls= [] site= 684 +2684 None n1-2684.plc1.org sls= [] site= 685 +2685 None n1-2685.plc1.org sls= [] site= 686 +2686 None n1-2686.plc1.org sls= [] site= 687 +2687 None n1-2687.plc1.org sls= [] site= 688 +2688 None n1-2688.plc1.org sls= [] site= 689 +2689 None n1-2689.plc1.org sls= [] site= 690 +2690 None n1-2690.plc1.org sls= [] site= 691 +2691 None n1-2691.plc1.org sls= [] site= 692 +2692 None n1-2692.plc1.org sls= [] site= 693 +2693 None n1-2693.plc1.org sls= [] site= 694 +2694 None n1-2694.plc1.org sls= [] site= 695 +2695 None n1-2695.plc1.org sls= [] site= 696 +2696 None n1-2696.plc1.org sls= [] site= 697 +2697 None n1-2697.plc1.org sls= [] site= 698 +2698 None n1-2698.plc1.org sls= [] site= 699 +2699 None n1-2699.plc1.org sls= [] site= 700 +2700 None n1-2700.plc1.org sls= [] site= 701 +2701 None n1-2701.plc1.org sls= [] site= 702 +2702 None n1-2702.plc1.org sls= [] site= 703 +2703 None n1-2703.plc1.org sls= [] site= 704 +2704 None n1-2704.plc1.org sls= [] site= 705 +2705 None n1-2705.plc1.org sls= [] site= 706 +2706 None n1-2706.plc1.org sls= [] site= 707 +2707 None n1-2707.plc1.org sls= [] site= 708 +2708 None n1-2708.plc1.org sls= [] site= 709 +2709 None n1-2709.plc1.org sls= [] site= 710 +2710 None n1-2710.plc1.org sls= [] site= 711 +2711 None n1-2711.plc1.org sls= [] site= 712 +2712 None n1-2712.plc1.org sls= [] site= 713 +2713 None n1-2713.plc1.org sls= [] site= 714 +2714 None n1-2714.plc1.org sls= [] site= 715 +2715 None n1-2715.plc1.org sls= [] site= 716 +2716 None n1-2716.plc1.org sls= [] site= 717 +2717 None n1-2717.plc1.org sls= [] site= 718 +2718 None n1-2718.plc1.org sls= [] site= 719 +2719 None n1-2719.plc1.org sls= [] site= 720 +2720 None n1-2720.plc1.org sls= [] site= 721 +2721 None n1-2721.plc1.org sls= [] site= 722 +2722 None n1-2722.plc1.org sls= [] site= 723 +2723 None n1-2723.plc1.org sls= [] site= 724 +2724 None n1-2724.plc1.org sls= [] site= 725 +2725 None n1-2725.plc1.org sls= [] site= 726 +2726 None n1-2726.plc1.org sls= [] site= 727 +2727 None n1-2727.plc1.org sls= [] site= 728 +2728 None n1-2728.plc1.org sls= [] site= 729 +2729 None n1-2729.plc1.org sls= [] site= 730 +2730 None n1-2730.plc1.org sls= [] site= 731 +2731 None n1-2731.plc1.org sls= [] site= 732 +2732 None n1-2732.plc1.org sls= [] site= 733 +2733 None n1-2733.plc1.org sls= [] site= 734 +2734 None n1-2734.plc1.org sls= [] site= 735 +2735 None n1-2735.plc1.org sls= [] site= 736 +2736 None n1-2736.plc1.org sls= [] site= 737 +2737 None n1-2737.plc1.org sls= [] site= 738 +2738 None n1-2738.plc1.org sls= [] site= 739 +2739 None n1-2739.plc1.org sls= [] site= 740 +2740 None n1-2740.plc1.org sls= [] site= 741 +2741 None n1-2741.plc1.org sls= [] site= 742 +2742 None n1-2742.plc1.org sls= [] site= 743 +2743 None n1-2743.plc1.org sls= [] site= 744 +2744 None n1-2744.plc1.org sls= [] site= 745 +2745 None n1-2745.plc1.org sls= [] site= 746 +2746 None n1-2746.plc1.org sls= [] site= 747 +2747 None n1-2747.plc1.org sls= [] site= 748 +2748 None n1-2748.plc1.org sls= [] site= 749 +2749 None n1-2749.plc1.org sls= [] site= 750 +2750 None n1-2750.plc1.org sls= [] site= 751 +2751 None n1-2751.plc1.org sls= [] site= 752 +2752 None n1-2752.plc1.org sls= [] site= 753 +2753 None n1-2753.plc1.org sls= [] site= 754 +2754 None n1-2754.plc1.org sls= [] site= 755 +2755 None n1-2755.plc1.org sls= [] site= 756 +2756 None n1-2756.plc1.org sls= [] site= 757 +2757 None n1-2757.plc1.org sls= [] site= 758 +2758 None n1-2758.plc1.org sls= [] site= 759 +2759 None n1-2759.plc1.org sls= [] site= 760 +2760 None n1-2760.plc1.org sls= [] site= 761 +2761 None n1-2761.plc1.org sls= [] site= 762 +2762 None n1-2762.plc1.org sls= [] site= 763 +2763 None n1-2763.plc1.org sls= [] site= 764 +2764 None n1-2764.plc1.org sls= [] site= 765 +2765 None n1-2765.plc1.org sls= [] site= 766 +2766 None n1-2766.plc1.org sls= [] site= 767 +2767 None n1-2767.plc1.org sls= [] site= 768 +2768 None n1-2768.plc1.org sls= [] site= 769 +2769 None n1-2769.plc1.org sls= [] site= 770 +2770 None n1-2770.plc1.org sls= [] site= 771 +2771 None n1-2771.plc1.org sls= [] site= 772 +2772 None n1-2772.plc1.org sls= [] site= 773 +2773 None n1-2773.plc1.org sls= [] site= 774 +2774 None n1-2774.plc1.org sls= [] site= 775 +2775 None n1-2775.plc1.org sls= [] site= 776 +2776 None n1-2776.plc1.org sls= [] site= 777 +2777 None n1-2777.plc1.org sls= [] site= 778 +2778 None n1-2778.plc1.org sls= [] site= 779 +2779 None n1-2779.plc1.org sls= [] site= 780 +2780 None n1-2780.plc1.org sls= [] site= 781 +2781 None n1-2781.plc1.org sls= [] site= 782 +2782 None n1-2782.plc1.org sls= [] site= 783 +2783 None n1-2783.plc1.org sls= [] site= 784 +2784 None n1-2784.plc1.org sls= [] site= 785 +2785 None n1-2785.plc1.org sls= [] site= 786 +2786 None n1-2786.plc1.org sls= [] site= 787 +2787 None n1-2787.plc1.org sls= [] site= 788 +2788 None n1-2788.plc1.org sls= [] site= 789 +2789 None n1-2789.plc1.org sls= [] site= 790 +2790 None n1-2790.plc1.org sls= [] site= 791 +2791 None n1-2791.plc1.org sls= [] site= 792 +2792 None n1-2792.plc1.org sls= [] site= 793 +2793 None n1-2793.plc1.org sls= [] site= 794 +2794 None n1-2794.plc1.org sls= [] site= 795 +2795 None n1-2795.plc1.org sls= [] site= 796 +2796 None n1-2796.plc1.org sls= [] site= 797 +2797 None n1-2797.plc1.org sls= [] site= 798 +2798 None n1-2798.plc1.org sls= [] site= 799 +2799 None n1-2799.plc1.org sls= [] site= 800 +2800 None n1-2800.plc1.org sls= [] site= 801 +2801 None n1-2801.plc1.org sls= [] site= 802 +2802 None n1-2802.plc1.org sls= [] site= 803 +2803 None n1-2803.plc1.org sls= [] site= 804 +2804 None n1-2804.plc1.org sls= [] site= 805 +2805 None n1-2805.plc1.org sls= [] site= 806 +2806 None n1-2806.plc1.org sls= [] site= 807 +2807 None n1-2807.plc1.org sls= [] site= 808 +2808 None n1-2808.plc1.org sls= [] site= 809 +2809 None n1-2809.plc1.org sls= [] site= 810 +2810 None n1-2810.plc1.org sls= [] site= 811 +2811 None n1-2811.plc1.org sls= [] site= 812 +2812 None n1-2812.plc1.org sls= [] site= 813 +2813 None n1-2813.plc1.org sls= [] site= 814 +2814 None n1-2814.plc1.org sls= [] site= 815 +2815 None n1-2815.plc1.org sls= [] site= 816 +2816 None n1-2816.plc1.org sls= [] site= 817 +2817 None n1-2817.plc1.org sls= [] site= 818 +2818 None n1-2818.plc1.org sls= [] site= 819 +2819 None n1-2819.plc1.org sls= [] site= 820 +2820 None n1-2820.plc1.org sls= [] site= 821 +2821 None n1-2821.plc1.org sls= [] site= 822 +2822 None n1-2822.plc1.org sls= [] site= 823 +2823 None n1-2823.plc1.org sls= [] site= 824 +2824 None n1-2824.plc1.org sls= [] site= 825 +2825 None n1-2825.plc1.org sls= [] site= 826 +2826 None n1-2826.plc1.org sls= [] site= 827 +2827 None n1-2827.plc1.org sls= [] site= 828 +2828 None n1-2828.plc1.org sls= [] site= 829 +2829 None n1-2829.plc1.org sls= [] site= 830 +2830 None n1-2830.plc1.org sls= [] site= 831 +2831 None n1-2831.plc1.org sls= [] site= 832 +2832 None n1-2832.plc1.org sls= [] site= 833 +2833 None n1-2833.plc1.org sls= [] site= 834 +2834 None n1-2834.plc1.org sls= [] site= 835 +2835 None n1-2835.plc1.org sls= [] site= 836 +2836 None n1-2836.plc1.org sls= [] site= 837 +2837 None n1-2837.plc1.org sls= [] site= 838 +2838 None n1-2838.plc1.org sls= [] site= 839 +2839 None n1-2839.plc1.org sls= [] site= 840 +2840 None n1-2840.plc1.org sls= [] site= 841 +2841 None n1-2841.plc1.org sls= [] site= 842 +2842 None n1-2842.plc1.org sls= [] site= 843 +2843 None n1-2843.plc1.org sls= [] site= 844 +2844 None n1-2844.plc1.org sls= [] site= 845 +2845 None n1-2845.plc1.org sls= [] site= 846 +2846 None n1-2846.plc1.org sls= [] site= 847 +2847 None n1-2847.plc1.org sls= [] site= 848 +2848 None n1-2848.plc1.org sls= [] site= 849 +2849 None n1-2849.plc1.org sls= [] site= 850 +2850 None n1-2850.plc1.org sls= [] site= 851 +2851 None n1-2851.plc1.org sls= [] site= 852 +2852 None n1-2852.plc1.org sls= [] site= 853 +2853 None n1-2853.plc1.org sls= [] site= 854 +2854 None n1-2854.plc1.org sls= [] site= 855 +2855 None n1-2855.plc1.org sls= [] site= 856 +2856 None n1-2856.plc1.org sls= [] site= 857 +2857 None n1-2857.plc1.org sls= [] site= 858 +2858 None n1-2858.plc1.org sls= [] site= 859 +2859 None n1-2859.plc1.org sls= [] site= 860 +2860 None n1-2860.plc1.org sls= [] site= 861 +2861 None n1-2861.plc1.org sls= [] site= 862 +2862 None n1-2862.plc1.org sls= [] site= 863 +2863 None n1-2863.plc1.org sls= [] site= 864 +2864 None n1-2864.plc1.org sls= [] site= 865 +2865 None n1-2865.plc1.org sls= [] site= 866 +2866 None n1-2866.plc1.org sls= [] site= 867 +2867 None n1-2867.plc1.org sls= [] site= 868 +2868 None n1-2868.plc1.org sls= [] site= 869 +2869 None n1-2869.plc1.org sls= [] site= 870 +2870 None n1-2870.plc1.org sls= [] site= 871 +2871 None n1-2871.plc1.org sls= [] site= 872 +2872 None n1-2872.plc1.org sls= [] site= 873 +2873 None n1-2873.plc1.org sls= [] site= 874 +2874 None n1-2874.plc1.org sls= [] site= 875 +2875 None n1-2875.plc1.org sls= [] site= 876 +2876 None n1-2876.plc1.org sls= [] site= 877 +2877 None n1-2877.plc1.org sls= [] site= 878 +2878 None n1-2878.plc1.org sls= [] site= 879 +2879 None n1-2879.plc1.org sls= [] site= 880 +2880 None n1-2880.plc1.org sls= [] site= 881 +2881 None n1-2881.plc1.org sls= [] site= 882 +2882 None n1-2882.plc1.org sls= [] site= 883 +2883 None n1-2883.plc1.org sls= [] site= 884 +2884 None n1-2884.plc1.org sls= [] site= 885 +2885 None n1-2885.plc1.org sls= [] site= 886 +2886 None n1-2886.plc1.org sls= [] site= 887 +2887 None n1-2887.plc1.org sls= [] site= 888 +2888 None n1-2888.plc1.org sls= [] site= 889 +2889 None n1-2889.plc1.org sls= [] site= 890 +2890 None n1-2890.plc1.org sls= [] site= 891 +2891 None n1-2891.plc1.org sls= [] site= 892 +2892 None n1-2892.plc1.org sls= [] site= 893 +2893 None n1-2893.plc1.org sls= [] site= 894 +2894 None n1-2894.plc1.org sls= [] site= 895 +2895 None n1-2895.plc1.org sls= [] site= 896 +2896 None n1-2896.plc1.org sls= [] site= 897 +2897 None n1-2897.plc1.org sls= [] site= 898 +2898 None n1-2898.plc1.org sls= [] site= 899 +2899 None n1-2899.plc1.org sls= [] site= 900 +2900 None n1-2900.plc1.org sls= [] site= 901 +2901 None n1-2901.plc1.org sls= [] site= 902 +2902 None n1-2902.plc1.org sls= [] site= 903 +2903 None n1-2903.plc1.org sls= [] site= 904 +2904 None n1-2904.plc1.org sls= [] site= 905 +2905 None n1-2905.plc1.org sls= [] site= 906 +2906 None n1-2906.plc1.org sls= [] site= 907 +2907 None n1-2907.plc1.org sls= [] site= 908 +2908 None n1-2908.plc1.org sls= [] site= 909 +2909 None n1-2909.plc1.org sls= [] site= 910 +2910 None n1-2910.plc1.org sls= [] site= 911 +2911 None n1-2911.plc1.org sls= [] site= 912 +2912 None n1-2912.plc1.org sls= [] site= 913 +2913 None n1-2913.plc1.org sls= [] site= 914 +2914 None n1-2914.plc1.org sls= [] site= 915 +2915 None n1-2915.plc1.org sls= [] site= 916 +2916 None n1-2916.plc1.org sls= [] site= 917 +2917 None n1-2917.plc1.org sls= [] site= 918 +2918 None n1-2918.plc1.org sls= [] site= 919 +2919 None n1-2919.plc1.org sls= [] site= 920 +2920 None n1-2920.plc1.org sls= [] site= 921 +2921 None n1-2921.plc1.org sls= [] site= 922 +2922 None n1-2922.plc1.org sls= [] site= 923 +2923 None n1-2923.plc1.org sls= [] site= 924 +2924 None n1-2924.plc1.org sls= [] site= 925 +2925 None n1-2925.plc1.org sls= [] site= 926 +2926 None n1-2926.plc1.org sls= [] site= 927 +2927 None n1-2927.plc1.org sls= [] site= 928 +2928 None n1-2928.plc1.org sls= [] site= 929 +2929 None n1-2929.plc1.org sls= [] site= 930 +2930 None n1-2930.plc1.org sls= [] site= 931 +2931 None n1-2931.plc1.org sls= [] site= 932 +2932 None n1-2932.plc1.org sls= [] site= 933 +2933 None n1-2933.plc1.org sls= [] site= 934 +2934 None n1-2934.plc1.org sls= [] site= 935 +2935 None n1-2935.plc1.org sls= [] site= 936 +2936 None n1-2936.plc1.org sls= [] site= 937 +2937 None n1-2937.plc1.org sls= [] site= 938 +2938 None n1-2938.plc1.org sls= [] site= 939 +2939 None n1-2939.plc1.org sls= [] site= 940 +2940 None n1-2940.plc1.org sls= [] site= 941 +2941 None n1-2941.plc1.org sls= [] site= 942 +2942 None n1-2942.plc1.org sls= [] site= 943 +2943 None n1-2943.plc1.org sls= [] site= 944 +2944 None n1-2944.plc1.org sls= [] site= 945 +2945 None n1-2945.plc1.org sls= [] site= 946 +2946 None n1-2946.plc1.org sls= [] site= 947 +2947 None n1-2947.plc1.org sls= [] site= 948 +2948 None n1-2948.plc1.org sls= [] site= 949 +2949 None n1-2949.plc1.org sls= [] site= 950 +2950 None n1-2950.plc1.org sls= [] site= 951 +2951 None n1-2951.plc1.org sls= [] site= 952 +2952 None n1-2952.plc1.org sls= [] site= 953 +2953 None n1-2953.plc1.org sls= [] site= 954 +2954 None n1-2954.plc1.org sls= [] site= 955 +2955 None n1-2955.plc1.org sls= [] site= 956 +2956 None n1-2956.plc1.org sls= [] site= 957 +2957 None n1-2957.plc1.org sls= [] site= 958 +2958 None n1-2958.plc1.org sls= [] site= 959 +2959 None n1-2959.plc1.org sls= [] site= 960 +2960 None n1-2960.plc1.org sls= [] site= 961 +2961 None n1-2961.plc1.org sls= [] site= 962 +2962 None n1-2962.plc1.org sls= [] site= 963 +2963 None n1-2963.plc1.org sls= [] site= 964 +2964 None n1-2964.plc1.org sls= [] site= 965 +2965 None n1-2965.plc1.org sls= [] site= 966 +2966 None n1-2966.plc1.org sls= [] site= 967 +2967 None n1-2967.plc1.org sls= [] site= 968 +2968 None n1-2968.plc1.org sls= [] site= 969 +2969 None n1-2969.plc1.org sls= [] site= 970 +2970 None n1-2970.plc1.org sls= [] site= 971 +2971 None n1-2971.plc1.org sls= [] site= 972 +2972 None n1-2972.plc1.org sls= [] site= 973 +2973 None n1-2973.plc1.org sls= [] site= 974 +2974 None n1-2974.plc1.org sls= [] site= 975 +2975 None n1-2975.plc1.org sls= [] site= 976 +2976 None n1-2976.plc1.org sls= [] site= 977 +2977 None n1-2977.plc1.org sls= [] site= 978 +2978 None n1-2978.plc1.org sls= [] site= 979 +2979 None n1-2979.plc1.org sls= [] site= 980 +2980 None n1-2980.plc1.org sls= [] site= 981 +2981 None n1-2981.plc1.org sls= [] site= 982 +2982 None n1-2982.plc1.org sls= [] site= 983 +2983 None n1-2983.plc1.org sls= [] site= 984 +2984 None n1-2984.plc1.org sls= [] site= 985 +2985 None n1-2985.plc1.org sls= [] site= 986 +2986 None n1-2986.plc1.org sls= [] site= 987 +2987 None n1-2987.plc1.org sls= [] site= 988 +2988 None n1-2988.plc1.org sls= [] site= 989 +2989 None n1-2989.plc1.org sls= [] site= 990 +2990 None n1-2990.plc1.org sls= [] site= 991 +2991 None n1-2991.plc1.org sls= [] site= 992 +2992 None n1-2992.plc1.org sls= [] site= 993 +2993 None n1-2993.plc1.org sls= [] site= 994 +2994 None n1-2994.plc1.org sls= [] site= 995 +2995 None n1-2995.plc1.org sls= [] site= 996 +2996 None n1-2996.plc1.org sls= [] site= 997 +2997 None n1-2997.plc1.org sls= [] site= 998 +2998 None n1-2998.plc1.org sls= [] site= 999 +2999 None n1-2999.plc1.org sls= [] site= 1000 +3000 None n1-3000.plc1.org sls= [] site= 1001 +3001 1 n2-001.plc2.org sls= [2] site= 1003 +3002 1 n2-002.plc2.org sls= [2, 3] site= 1004 +3003 1 n2-003.plc2.org sls= [2, 3, 4] site= 1005 +3004 1 n2-004.plc2.org sls= [3, 4, 5] site= 1006 +3005 1 n2-005.plc2.org sls= [4, 5, 6] site= 1007 +3006 1 n2-006.plc2.org sls= [5, 6, 7] site= 1008 +3007 1 n2-007.plc2.org sls= [6, 7, 8] site= 1009 +3008 1 n2-008.plc2.org sls= [7, 8, 9] site= 1010 +3009 1 n2-009.plc2.org sls= [8, 9, 10] site= 1011 +3010 1 n2-010.plc2.org sls= [9, 10, 11] site= 1012 +3011 1 n2-011.plc2.org sls= [10, 11, 12] site= 1013 +3012 1 n2-012.plc2.org sls= [11, 12, 13] site= 1014 +3013 1 n2-013.plc2.org sls= [12, 13, 14] site= 1015 +3014 1 n2-014.plc2.org sls= [13, 14, 15] site= 1016 +3015 1 n2-015.plc2.org sls= [14, 15, 16] site= 1017 +3016 1 n2-016.plc2.org sls= [15, 16, 17] site= 1018 +3017 1 n2-017.plc2.org sls= [16, 17, 18] site= 1019 +3018 1 n2-018.plc2.org sls= [17, 18, 19] site= 1020 +3019 1 n2-019.plc2.org sls= [18, 19, 20] site= 1021 +3020 1 n2-020.plc2.org sls= [19, 20, 21] site= 1022 +3021 1 n2-021.plc2.org sls= [20, 21, 22] site= 1023 +3022 1 n2-022.plc2.org sls= [21, 22, 23] site= 1024 +3023 1 n2-023.plc2.org sls= [22, 23, 24] site= 1025 +3024 1 n2-024.plc2.org sls= [23, 24, 25] site= 1026 +3025 1 n2-025.plc2.org sls= [24, 25, 26] site= 1027 +3026 1 n2-026.plc2.org sls= [25, 26, 27] site= 1028 +3027 1 n2-027.plc2.org sls= [26, 27, 28] site= 1029 +3028 1 n2-028.plc2.org sls= [27, 28, 29] site= 1030 +3029 1 n2-029.plc2.org sls= [28, 29, 30] site= 1031 +3030 1 n2-030.plc2.org sls= [29, 30, 31] site= 1032 +3031 1 n2-031.plc2.org sls= [30, 31, 32] site= 1033 +3032 1 n2-032.plc2.org sls= [31, 32, 33] site= 1034 +3033 1 n2-033.plc2.org sls= [32, 33, 34] site= 1035 +3034 1 n2-034.plc2.org sls= [33, 34, 35] site= 1036 +3035 1 n2-035.plc2.org sls= [34, 35, 36] site= 1037 +3036 1 n2-036.plc2.org sls= [35, 36, 37] site= 1038 +3037 1 n2-037.plc2.org sls= [36, 37, 38] site= 1039 +3038 1 n2-038.plc2.org sls= [37, 38, 39] site= 1040 +3039 1 n2-039.plc2.org sls= [38, 39, 40] site= 1041 +3040 1 n2-040.plc2.org sls= [39, 40, 41] site= 1042 +3041 1 n2-041.plc2.org sls= [40, 41, 42] site= 1043 +3042 1 n2-042.plc2.org sls= [41, 42, 43] site= 1044 +3043 1 n2-043.plc2.org sls= [42, 43, 44] site= 1045 +3044 1 n2-044.plc2.org sls= [45, 43, 44] site= 1046 +3045 1 n2-045.plc2.org sls= [45, 46, 44] site= 1047 +3046 1 n2-046.plc2.org sls= [45, 46, 47] site= 1048 +3047 1 n2-047.plc2.org sls= [46, 47, 48] site= 1049 +3048 1 n2-048.plc2.org sls= [47, 48, 49] site= 1050 +3049 1 n2-049.plc2.org sls= [48, 49, 50] site= 1051 +3050 1 n2-050.plc2.org sls= [49, 50, 51] site= 1052 +3051 1 n2-051.plc2.org sls= [50, 51, 52] site= 1053 +3052 1 n2-052.plc2.org sls= [53, 51, 52] site= 1054 +3053 1 n2-053.plc2.org sls= [53, 54, 52] site= 1055 +3054 1 n2-054.plc2.org sls= [53, 54, 55] site= 1056 +3055 1 n2-055.plc2.org sls= [54, 55, 56] site= 1057 +3056 1 n2-056.plc2.org sls= [55, 56, 57] site= 1058 +3057 1 n2-057.plc2.org sls= [56, 57, 58] site= 1059 +3058 1 n2-058.plc2.org sls= [57, 58, 59] site= 1060 +3059 1 n2-059.plc2.org sls= [58, 59, 60] site= 1061 +3060 1 n2-060.plc2.org sls= [61, 59, 60] site= 1062 +3061 1 n2-061.plc2.org sls= [61, 62, 60] site= 1063 +3062 1 n2-062.plc2.org sls= [61, 62, 63] site= 1064 +3063 1 n2-063.plc2.org sls= [62, 63, 64] site= 1065 +3064 1 n2-064.plc2.org sls= [63, 64, 65] site= 1066 +3065 1 n2-065.plc2.org sls= [64, 65, 66] site= 1067 +3066 1 n2-066.plc2.org sls= [65, 66, 67] site= 1068 +3067 1 n2-067.plc2.org sls= [66, 67, 68] site= 1069 +3068 1 n2-068.plc2.org sls= [69, 67, 68] site= 1070 +3069 1 n2-069.plc2.org sls= [69, 70, 68] site= 1071 +3070 1 n2-070.plc2.org sls= [69, 70, 71] site= 1072 +3071 1 n2-071.plc2.org sls= [70, 71, 72] site= 1073 +3072 1 n2-072.plc2.org sls= [71, 72, 73] site= 1074 +3073 1 n2-073.plc2.org sls= [72, 73, 74] site= 1075 +3074 1 n2-074.plc2.org sls= [73, 74, 75] site= 1076 +3075 1 n2-075.plc2.org sls= [74, 75, 76] site= 1077 +3076 1 n2-076.plc2.org sls= [77, 75, 76] site= 1078 +3077 1 n2-077.plc2.org sls= [77, 78, 76] site= 1079 +3078 1 n2-078.plc2.org sls= [77, 78, 79] site= 1080 +3079 1 n2-079.plc2.org sls= [78, 79, 80] site= 1081 +3080 1 n2-080.plc2.org sls= [79, 80, 81] site= 1082 +3081 1 n2-081.plc2.org sls= [80, 81, 82] site= 1083 +3082 1 n2-082.plc2.org sls= [81, 82, 83] site= 1084 +3083 1 n2-083.plc2.org sls= [82, 83, 84] site= 1085 +3084 1 n2-084.plc2.org sls= [85, 83, 84] site= 1086 +3085 1 n2-085.plc2.org sls= [85, 86, 84] site= 1087 +3086 1 n2-086.plc2.org sls= [85, 86, 87] site= 1088 +3087 1 n2-087.plc2.org sls= [86, 87, 88] site= 1089 +3088 1 n2-088.plc2.org sls= [87, 88, 89] site= 1090 +3089 1 n2-089.plc2.org sls= [88, 89, 90] site= 1091 +3090 1 n2-090.plc2.org sls= [89, 90, 91] site= 1092 +3091 1 n2-091.plc2.org sls= [90, 91, 92] site= 1093 +3092 1 n2-092.plc2.org sls= [93, 91, 92] site= 1094 +3093 1 n2-093.plc2.org sls= [93, 94, 92] site= 1095 +3094 1 n2-094.plc2.org sls= [93, 94, 95] site= 1096 +3095 1 n2-095.plc2.org sls= [94, 95, 96] site= 1097 +3096 1 n2-096.plc2.org sls= [95, 96, 97] site= 1098 +3097 1 n2-097.plc2.org sls= [96, 97, 98] site= 1099 +3098 1 n2-098.plc2.org sls= [97, 98, 99] site= 1100 +3099 1 n2-099.plc2.org sls= [98, 99, 100] site= 1101 +3100 1 n2-100.plc2.org sls= [101, 99, 100] site= 1102 +3101 1 n2-101.plc2.org sls= [101, 102, 100] site= 1103 +3102 1 n2-102.plc2.org sls= [101, 102, 103] site= 1104 +3103 1 n2-103.plc2.org sls= [102, 103, 104] site= 1105 +3104 1 n2-104.plc2.org sls= [103, 104, 105] site= 1106 +3105 1 n2-105.plc2.org sls= [104, 105, 106] site= 1107 +3106 1 n2-106.plc2.org sls= [105, 106, 107] site= 1108 +3107 1 n2-107.plc2.org sls= [106, 107, 108] site= 1109 +3108 1 n2-108.plc2.org sls= [109, 107, 108] site= 1110 +3109 1 n2-109.plc2.org sls= [109, 110, 108] site= 1111 +3110 1 n2-110.plc2.org sls= [109, 110, 111] site= 1112 +3111 1 n2-111.plc2.org sls= [110, 111, 112] site= 1113 +3112 1 n2-112.plc2.org sls= [111, 112, 113] site= 1114 +3113 1 n2-113.plc2.org sls= [112, 113, 114] site= 1115 +3114 1 n2-114.plc2.org sls= [113, 114, 115] site= 1116 +3115 1 n2-115.plc2.org sls= [114, 115, 116] site= 1117 +3116 1 n2-116.plc2.org sls= [117, 115, 116] site= 1118 +3117 1 n2-117.plc2.org sls= [117, 118, 116] site= 1119 +3118 1 n2-118.plc2.org sls= [117, 118, 119] site= 1120 +3119 1 n2-119.plc2.org sls= [118, 119, 120] site= 1121 +3120 1 n2-120.plc2.org sls= [119, 120, 121] site= 1122 +3121 1 n2-121.plc2.org sls= [120, 121, 122] site= 1123 +3122 1 n2-122.plc2.org sls= [121, 122, 123] site= 1124 +3123 1 n2-123.plc2.org sls= [122, 123, 124] site= 1125 +3124 1 n2-124.plc2.org sls= [125, 123, 124] site= 1126 +3125 1 n2-125.plc2.org sls= [125, 126, 124] site= 1127 +3126 1 n2-126.plc2.org sls= [125, 126, 127] site= 1128 +3127 1 n2-127.plc2.org sls= [126, 127, 128] site= 1129 +3128 1 n2-128.plc2.org sls= [127, 128, 129] site= 1130 +3129 1 n2-129.plc2.org sls= [128, 129, 130] site= 1131 +3130 1 n2-130.plc2.org sls= [129, 130, 131] site= 1132 +3131 1 n2-131.plc2.org sls= [130, 131, 132] site= 1133 +3132 1 n2-132.plc2.org sls= [133, 131, 132] site= 1134 +3133 1 n2-133.plc2.org sls= [133, 134, 132] site= 1135 +3134 1 n2-134.plc2.org sls= [133, 134, 135] site= 1136 +3135 1 n2-135.plc2.org sls= [134, 135, 136] site= 1137 +3136 1 n2-136.plc2.org sls= [135, 136, 137] site= 1138 +3137 1 n2-137.plc2.org sls= [136, 137, 138] site= 1139 +3138 1 n2-138.plc2.org sls= [137, 138, 139] site= 1140 +3139 1 n2-139.plc2.org sls= [138, 139, 140] site= 1141 +3140 1 n2-140.plc2.org sls= [141, 139, 140] site= 1142 +3141 1 n2-141.plc2.org sls= [141, 142, 140] site= 1143 +3142 1 n2-142.plc2.org sls= [141, 142, 143] site= 1144 +3143 1 n2-143.plc2.org sls= [142, 143, 144] site= 1145 +3144 1 n2-144.plc2.org sls= [143, 144, 145] site= 1146 +3145 1 n2-145.plc2.org sls= [144, 145, 146] site= 1147 +3146 1 n2-146.plc2.org sls= [145, 146, 147] site= 1148 +3147 1 n2-147.plc2.org sls= [146, 147, 148] site= 1149 +3148 1 n2-148.plc2.org sls= [149, 147, 148] site= 1150 +3149 1 n2-149.plc2.org sls= [149, 150, 148] site= 1151 +3150 1 n2-150.plc2.org sls= [149, 150, 151] site= 1152 +3151 1 n2-151.plc2.org sls= [150, 151, 152] site= 1153 +3152 1 n2-152.plc2.org sls= [151, 152, 153] site= 1154 +3153 1 n2-153.plc2.org sls= [152, 153, 154] site= 1155 +3154 1 n2-154.plc2.org sls= [153, 154, 155] site= 1156 +3155 1 n2-155.plc2.org sls= [154, 155, 156] site= 1157 +3156 1 n2-156.plc2.org sls= [157, 155, 156] site= 1158 +3157 1 n2-157.plc2.org sls= [157, 158, 156] site= 1159 +3158 1 n2-158.plc2.org sls= [157, 158, 159] site= 1160 +3159 1 n2-159.plc2.org sls= [158, 159, 160] site= 1161 +3160 1 n2-160.plc2.org sls= [159, 160, 161] site= 1162 +3161 1 n2-161.plc2.org sls= [160, 161, 162] site= 1163 +3162 1 n2-162.plc2.org sls= [161, 162, 163] site= 1164 +3163 1 n2-163.plc2.org sls= [162, 163, 164] site= 1165 +3164 1 n2-164.plc2.org sls= [165, 163, 164] site= 1166 +3165 1 n2-165.plc2.org sls= [165, 166, 164] site= 1167 +3166 1 n2-166.plc2.org sls= [165, 166, 167] site= 1168 +3167 1 n2-167.plc2.org sls= [166, 167, 168] site= 1169 +3168 1 n2-168.plc2.org sls= [167, 168, 169] site= 1170 +3169 1 n2-169.plc2.org sls= [168, 169, 170] site= 1171 +3170 1 n2-170.plc2.org sls= [169, 170, 171] site= 1172 +3171 1 n2-171.plc2.org sls= [170, 171, 172] site= 1173 +3172 1 n2-172.plc2.org sls= [173, 171, 172] site= 1174 +3173 1 n2-173.plc2.org sls= [173, 174, 172] site= 1175 +3174 1 n2-174.plc2.org sls= [173, 174, 175] site= 1176 +3175 1 n2-175.plc2.org sls= [174, 175, 176] site= 1177 +3176 1 n2-176.plc2.org sls= [175, 176, 177] site= 1178 +3177 1 n2-177.plc2.org sls= [176, 177, 178] site= 1179 +3178 1 n2-178.plc2.org sls= [177, 178, 179] site= 1180 +3179 1 n2-179.plc2.org sls= [178, 179, 180] site= 1181 +3180 1 n2-180.plc2.org sls= [181, 179, 180] site= 1182 +3181 1 n2-181.plc2.org sls= [181, 182, 180] site= 1183 +3182 1 n2-182.plc2.org sls= [181, 182, 183] site= 1184 +3183 1 n2-183.plc2.org sls= [182, 183, 184] site= 1185 +3184 1 n2-184.plc2.org sls= [183, 184, 185] site= 1186 +3185 1 n2-185.plc2.org sls= [184, 185, 186] site= 1187 +3186 1 n2-186.plc2.org sls= [185, 186, 187] site= 1188 +3187 1 n2-187.plc2.org sls= [186, 187, 188] site= 1189 +3188 1 n2-188.plc2.org sls= [189, 187, 188] site= 1190 +3189 1 n2-189.plc2.org sls= [189, 190, 188] site= 1191 +3190 1 n2-190.plc2.org sls= [189, 190, 191] site= 1192 +3191 1 n2-191.plc2.org sls= [190, 191, 192] site= 1193 +3192 1 n2-192.plc2.org sls= [191, 192, 193] site= 1194 +3193 1 n2-193.plc2.org sls= [192, 193, 194] site= 1195 +3194 1 n2-194.plc2.org sls= [193, 194, 195] site= 1196 +3195 1 n2-195.plc2.org sls= [194, 195, 196] site= 1197 +3196 1 n2-196.plc2.org sls= [197, 195, 196] site= 1198 +3197 1 n2-197.plc2.org sls= [197, 198, 196] site= 1199 +3198 1 n2-198.plc2.org sls= [197, 198, 199] site= 1200 +3199 1 n2-199.plc2.org sls= [198, 199, 200] site= 1201 +3200 1 n2-200.plc2.org sls= [199, 200, 201] site= 1202 +3201 1 n2-201.plc2.org sls= [200, 201, 202] site= 1203 +3202 1 n2-202.plc2.org sls= [201, 202, 203] site= 1204 +3203 1 n2-203.plc2.org sls= [202, 203, 204] site= 1205 +3204 1 n2-204.plc2.org sls= [205, 203, 204] site= 1206 +3205 1 n2-205.plc2.org sls= [205, 206, 204] site= 1207 +3206 1 n2-206.plc2.org sls= [205, 206, 207] site= 1208 +3207 1 n2-207.plc2.org sls= [206, 207, 208] site= 1209 +3208 1 n2-208.plc2.org sls= [207, 208, 209] site= 1210 +3209 1 n2-209.plc2.org sls= [208, 209, 210] site= 1211 +3210 1 n2-210.plc2.org sls= [209, 210, 211] site= 1212 +3211 1 n2-211.plc2.org sls= [210, 211, 212] site= 1213 +3212 1 n2-212.plc2.org sls= [213, 211, 212] site= 1214 +3213 1 n2-213.plc2.org sls= [213, 214, 212] site= 1215 +3214 1 n2-214.plc2.org sls= [213, 214, 215] site= 1216 +3215 1 n2-215.plc2.org sls= [214, 215, 216] site= 1217 +3216 1 n2-216.plc2.org sls= [215, 216, 217] site= 1218 +3217 1 n2-217.plc2.org sls= [216, 217, 218] site= 1219 +3218 1 n2-218.plc2.org sls= [217, 218, 219] site= 1220 +3219 1 n2-219.plc2.org sls= [218, 219, 220] site= 1221 +3220 1 n2-220.plc2.org sls= [221, 219, 220] site= 1222 +3221 1 n2-221.plc2.org sls= [221, 222, 220] site= 1223 +3222 1 n2-222.plc2.org sls= [221, 222, 223] site= 1224 +3223 1 n2-223.plc2.org sls= [222, 223, 224] site= 1225 +3224 1 n2-224.plc2.org sls= [223, 224, 225] site= 1226 +3225 1 n2-225.plc2.org sls= [224, 225, 226] site= 1227 +3226 1 n2-226.plc2.org sls= [225, 226, 227] site= 1228 +3227 1 n2-227.plc2.org sls= [226, 227, 228] site= 1229 +3228 1 n2-228.plc2.org sls= [229, 227, 228] site= 1230 +3229 1 n2-229.plc2.org sls= [229, 230, 228] site= 1231 +3230 1 n2-230.plc2.org sls= [229, 230, 231] site= 1232 +3231 1 n2-231.plc2.org sls= [230, 231, 232] site= 1233 +3232 1 n2-232.plc2.org sls= [231, 232, 233] site= 1234 +3233 1 n2-233.plc2.org sls= [232, 233, 234] site= 1235 +3234 1 n2-234.plc2.org sls= [233, 234, 235] site= 1236 +3235 1 n2-235.plc2.org sls= [234, 235, 236] site= 1237 +3236 1 n2-236.plc2.org sls= [237, 235, 236] site= 1238 +3237 1 n2-237.plc2.org sls= [237, 238, 236] site= 1239 +3238 1 n2-238.plc2.org sls= [237, 238, 239] site= 1240 +3239 1 n2-239.plc2.org sls= [238, 239, 240] site= 1241 +3240 1 n2-240.plc2.org sls= [239, 240, 241] site= 1242 +3241 1 n2-241.plc2.org sls= [240, 241, 242] site= 1243 +3242 1 n2-242.plc2.org sls= [241, 242, 243] site= 1244 +3243 1 n2-243.plc2.org sls= [242, 243, 244] site= 1245 +3244 1 n2-244.plc2.org sls= [245, 243, 244] site= 1246 +3245 1 n2-245.plc2.org sls= [245, 246, 244] site= 1247 +3246 1 n2-246.plc2.org sls= [245, 246, 247] site= 1248 +3247 1 n2-247.plc2.org sls= [246, 247, 248] site= 1249 +3248 1 n2-248.plc2.org sls= [247, 248, 249] site= 1250 +3249 1 n2-249.plc2.org sls= [248, 249, 250] site= 1251 +3250 1 n2-250.plc2.org sls= [249, 250, 251] site= 1252 +3251 1 n2-251.plc2.org sls= [250, 251, 252] site= 1253 +3252 1 n2-252.plc2.org sls= [253, 251, 252] site= 1254 +3253 1 n2-253.plc2.org sls= [253, 254, 252] site= 1255 +3254 1 n2-254.plc2.org sls= [253, 254, 255] site= 1256 +3255 1 n2-255.plc2.org sls= [254, 255, 256] site= 1257 +3256 1 n2-256.plc2.org sls= [255, 256, 257] site= 1258 +3257 1 n2-257.plc2.org sls= [256, 257, 258] site= 1259 +3258 1 n2-258.plc2.org sls= [257, 258, 259] site= 1260 +3259 1 n2-259.plc2.org sls= [258, 259, 260] site= 1261 +3260 1 n2-260.plc2.org sls= [261, 259, 260] site= 1262 +3261 1 n2-261.plc2.org sls= [261, 262, 260] site= 1263 +3262 1 n2-262.plc2.org sls= [261, 262, 263] site= 1264 +3263 1 n2-263.plc2.org sls= [262, 263, 264] site= 1265 +3264 1 n2-264.plc2.org sls= [263, 264, 265] site= 1266 +3265 1 n2-265.plc2.org sls= [264, 265, 266] site= 1267 +3266 1 n2-266.plc2.org sls= [265, 266, 267] site= 1268 +3267 1 n2-267.plc2.org sls= [266, 267, 268] site= 1269 +3268 1 n2-268.plc2.org sls= [269, 267, 268] site= 1270 +3269 1 n2-269.plc2.org sls= [269, 270, 268] site= 1271 +3270 1 n2-270.plc2.org sls= [269, 270, 271] site= 1272 +3271 1 n2-271.plc2.org sls= [270, 271, 272] site= 1273 +3272 1 n2-272.plc2.org sls= [271, 272, 273] site= 1274 +3273 1 n2-273.plc2.org sls= [272, 273, 274] site= 1275 +3274 1 n2-274.plc2.org sls= [273, 274, 275] site= 1276 +3275 1 n2-275.plc2.org sls= [274, 275, 276] site= 1277 +3276 1 n2-276.plc2.org sls= [277, 275, 276] site= 1278 +3277 1 n2-277.plc2.org sls= [277, 278, 276] site= 1279 +3278 1 n2-278.plc2.org sls= [277, 278, 279] site= 1280 +3279 1 n2-279.plc2.org sls= [278, 279, 280] site= 1281 +3280 1 n2-280.plc2.org sls= [279, 280, 281] site= 1282 +3281 1 n2-281.plc2.org sls= [280, 281, 282] site= 1283 +3282 1 n2-282.plc2.org sls= [281, 282, 283] site= 1284 +3283 1 n2-283.plc2.org sls= [282, 283, 284] site= 1285 +3284 1 n2-284.plc2.org sls= [285, 283, 284] site= 1286 +3285 1 n2-285.plc2.org sls= [285, 286, 284] site= 1287 +3286 1 n2-286.plc2.org sls= [285, 286, 287] site= 1288 +3287 1 n2-287.plc2.org sls= [286, 287, 288] site= 1289 +3288 1 n2-288.plc2.org sls= [287, 288, 289] site= 1290 +3289 1 n2-289.plc2.org sls= [288, 289, 290] site= 1291 +3290 1 n2-290.plc2.org sls= [289, 290, 291] site= 1292 +3291 1 n2-291.plc2.org sls= [290, 291, 292] site= 1293 +3292 1 n2-292.plc2.org sls= [293, 291, 292] site= 1294 +3293 1 n2-293.plc2.org sls= [293, 294, 292] site= 1295 +3294 1 n2-294.plc2.org sls= [293, 294, 295] site= 1296 +3295 1 n2-295.plc2.org sls= [294, 295, 296] site= 1297 +3296 1 n2-296.plc2.org sls= [295, 296, 297] site= 1298 +3297 1 n2-297.plc2.org sls= [296, 297, 298] site= 1299 +3298 1 n2-298.plc2.org sls= [297, 298, 299] site= 1300 +3299 1 n2-299.plc2.org sls= [298, 299, 300] site= 1301 +3300 1 n2-300.plc2.org sls= [301, 299, 300] site= 1302 +3301 1 n2-301.plc2.org sls= [301, 302, 300] site= 1303 +3302 1 n2-302.plc2.org sls= [301, 302, 303] site= 1304 +3303 1 n2-303.plc2.org sls= [302, 303, 304] site= 1305 +3304 1 n2-304.plc2.org sls= [303, 304, 305] site= 1306 +3305 1 n2-305.plc2.org sls= [304, 305, 306] site= 1307 +3306 1 n2-306.plc2.org sls= [305, 306, 307] site= 1308 +3307 1 n2-307.plc2.org sls= [306, 307, 308] site= 1309 +3308 1 n2-308.plc2.org sls= [309, 307, 308] site= 1310 +3309 1 n2-309.plc2.org sls= [309, 310, 308] site= 1311 +3310 1 n2-310.plc2.org sls= [309, 310, 311] site= 1312 +3311 1 n2-311.plc2.org sls= [310, 311, 312] site= 1313 +3312 1 n2-312.plc2.org sls= [311, 312, 313] site= 1314 +3313 1 n2-313.plc2.org sls= [312, 313, 314] site= 1315 +3314 1 n2-314.plc2.org sls= [313, 314, 315] site= 1316 +3315 1 n2-315.plc2.org sls= [314, 315, 316] site= 1317 +3316 1 n2-316.plc2.org sls= [317, 315, 316] site= 1318 +3317 1 n2-317.plc2.org sls= [317, 318, 316] site= 1319 +3318 1 n2-318.plc2.org sls= [317, 318, 319] site= 1320 +3319 1 n2-319.plc2.org sls= [318, 319, 320] site= 1321 +3320 1 n2-320.plc2.org sls= [319, 320, 321] site= 1322 +3321 1 n2-321.plc2.org sls= [320, 321, 322] site= 1323 +3322 1 n2-322.plc2.org sls= [321, 322, 323] site= 1324 +3323 1 n2-323.plc2.org sls= [322, 323, 324] site= 1325 +3324 1 n2-324.plc2.org sls= [325, 323, 324] site= 1326 +3325 1 n2-325.plc2.org sls= [325, 326, 324] site= 1327 +3326 1 n2-326.plc2.org sls= [325, 326, 327] site= 1328 +3327 1 n2-327.plc2.org sls= [326, 327, 328] site= 1329 +3328 1 n2-328.plc2.org sls= [327, 328, 329] site= 1330 +3329 1 n2-329.plc2.org sls= [328, 329, 330] site= 1331 +3330 1 n2-330.plc2.org sls= [329, 330, 331] site= 1332 +3331 1 n2-331.plc2.org sls= [330, 331, 332] site= 1333 +3332 1 n2-332.plc2.org sls= [333, 331, 332] site= 1334 +3333 1 n2-333.plc2.org sls= [333, 334, 332] site= 1335 +3334 1 n2-334.plc2.org sls= [333, 334, 335] site= 1336 +3335 1 n2-335.plc2.org sls= [334, 335, 336] site= 1337 +3336 1 n2-336.plc2.org sls= [335, 336, 337] site= 1338 +3337 1 n2-337.plc2.org sls= [336, 337, 338] site= 1339 +3338 1 n2-338.plc2.org sls= [337, 338, 339] site= 1340 +3339 1 n2-339.plc2.org sls= [338, 339, 340] site= 1341 +3340 1 n2-340.plc2.org sls= [341, 339, 340] site= 1342 +3341 1 n2-341.plc2.org sls= [341, 342, 340] site= 1343 +3342 1 n2-342.plc2.org sls= [341, 342, 343] site= 1344 +3343 1 n2-343.plc2.org sls= [342, 343, 344] site= 1345 +3344 1 n2-344.plc2.org sls= [343, 344, 345] site= 1346 +3345 1 n2-345.plc2.org sls= [344, 345, 346] site= 1347 +3346 1 n2-346.plc2.org sls= [345, 346, 347] site= 1348 +3347 1 n2-347.plc2.org sls= [346, 347, 348] site= 1349 +3348 1 n2-348.plc2.org sls= [349, 347, 348] site= 1350 +3349 1 n2-349.plc2.org sls= [349, 350, 348] site= 1351 +3350 1 n2-350.plc2.org sls= [349, 350, 351] site= 1352 +3351 1 n2-351.plc2.org sls= [350, 351, 352] site= 1353 +3352 1 n2-352.plc2.org sls= [351, 352, 353] site= 1354 +3353 1 n2-353.plc2.org sls= [352, 353, 354] site= 1355 +3354 1 n2-354.plc2.org sls= [353, 354, 355] site= 1356 +3355 1 n2-355.plc2.org sls= [354, 355, 356] site= 1357 +3356 1 n2-356.plc2.org sls= [357, 355, 356] site= 1358 +3357 1 n2-357.plc2.org sls= [357, 358, 356] site= 1359 +3358 1 n2-358.plc2.org sls= [357, 358, 359] site= 1360 +3359 1 n2-359.plc2.org sls= [358, 359, 360] site= 1361 +3360 1 n2-360.plc2.org sls= [359, 360, 361] site= 1362 +3361 1 n2-361.plc2.org sls= [360, 361, 362] site= 1363 +3362 1 n2-362.plc2.org sls= [361, 362, 363] site= 1364 +3363 1 n2-363.plc2.org sls= [362, 363, 364] site= 1365 +3364 1 n2-364.plc2.org sls= [365, 363, 364] site= 1366 +3365 1 n2-365.plc2.org sls= [365, 366, 364] site= 1367 +3366 1 n2-366.plc2.org sls= [365, 366, 367] site= 1368 +3367 1 n2-367.plc2.org sls= [366, 367, 368] site= 1369 +3368 1 n2-368.plc2.org sls= [367, 368, 369] site= 1370 +3369 1 n2-369.plc2.org sls= [368, 369, 370] site= 1371 +3370 1 n2-370.plc2.org sls= [369, 370, 371] site= 1372 +3371 1 n2-371.plc2.org sls= [370, 371, 372] site= 1373 +3372 1 n2-372.plc2.org sls= [373, 371, 372] site= 1374 +3373 1 n2-373.plc2.org sls= [373, 374, 372] site= 1375 +3374 1 n2-374.plc2.org sls= [373, 374, 375] site= 1376 +3375 1 n2-375.plc2.org sls= [374, 375, 376] site= 1377 +3376 1 n2-376.plc2.org sls= [375, 376, 377] site= 1378 +3377 1 n2-377.plc2.org sls= [376, 377, 378] site= 1379 +3378 1 n2-378.plc2.org sls= [377, 378, 379] site= 1380 +3379 1 n2-379.plc2.org sls= [378, 379, 380] site= 1381 +3380 1 n2-380.plc2.org sls= [381, 379, 380] site= 1382 +3381 1 n2-381.plc2.org sls= [381, 382, 380] site= 1383 +3382 1 n2-382.plc2.org sls= [381, 382, 383] site= 1384 +3383 1 n2-383.plc2.org sls= [382, 383, 384] site= 1385 +3384 1 n2-384.plc2.org sls= [383, 384, 385] site= 1386 +3385 1 n2-385.plc2.org sls= [384, 385, 386] site= 1387 +3386 1 n2-386.plc2.org sls= [385, 386, 387] site= 1388 +3387 1 n2-387.plc2.org sls= [386, 387, 388] site= 1389 +3388 1 n2-388.plc2.org sls= [389, 387, 388] site= 1390 +3389 1 n2-389.plc2.org sls= [389, 390, 388] site= 1391 +3390 1 n2-390.plc2.org sls= [389, 390, 391] site= 1392 +3391 1 n2-391.plc2.org sls= [390, 391, 392] site= 1393 +3392 1 n2-392.plc2.org sls= [391, 392, 393] site= 1394 +3393 1 n2-393.plc2.org sls= [392, 393, 394] site= 1395 +3394 1 n2-394.plc2.org sls= [393, 394, 395] site= 1396 +3395 1 n2-395.plc2.org sls= [394, 395, 396] site= 1397 +3396 1 n2-396.plc2.org sls= [397, 395, 396] site= 1398 +3397 1 n2-397.plc2.org sls= [397, 398, 396] site= 1399 +3398 1 n2-398.plc2.org sls= [397, 398, 399] site= 1400 +3399 1 n2-399.plc2.org sls= [398, 399, 400] site= 1401 +3400 1 n2-400.plc2.org sls= [399, 400, 401] site= 1402 +3401 1 n2-401.plc2.org sls= [400, 401, 402] site= 1403 +3402 1 n2-402.plc2.org sls= [401, 402, 403] site= 1404 +3403 1 n2-403.plc2.org sls= [402, 403, 404] site= 1405 +3404 1 n2-404.plc2.org sls= [405, 403, 404] site= 1406 +3405 1 n2-405.plc2.org sls= [405, 406, 404] site= 1407 +3406 1 n2-406.plc2.org sls= [405, 406, 407] site= 1408 +3407 1 n2-407.plc2.org sls= [406, 407, 408] site= 1409 +3408 1 n2-408.plc2.org sls= [407, 408, 409] site= 1410 +3409 1 n2-409.plc2.org sls= [408, 409, 410] site= 1411 +3410 1 n2-410.plc2.org sls= [409, 410, 411] site= 1412 +3411 1 n2-411.plc2.org sls= [410, 411, 412] site= 1413 +3412 1 n2-412.plc2.org sls= [413, 411, 412] site= 1414 +3413 1 n2-413.plc2.org sls= [413, 414, 412] site= 1415 +3414 1 n2-414.plc2.org sls= [413, 414, 415] site= 1416 +3415 1 n2-415.plc2.org sls= [414, 415, 416] site= 1417 +3416 1 n2-416.plc2.org sls= [415, 416, 417] site= 1418 +3417 1 n2-417.plc2.org sls= [416, 417, 418] site= 1419 +3418 1 n2-418.plc2.org sls= [417, 418, 419] site= 1420 +3419 1 n2-419.plc2.org sls= [418, 419, 420] site= 1421 +3420 1 n2-420.plc2.org sls= [421, 419, 420] site= 1422 +3421 1 n2-421.plc2.org sls= [421, 422, 420] site= 1423 +3422 1 n2-422.plc2.org sls= [421, 422, 423] site= 1424 +3423 1 n2-423.plc2.org sls= [422, 423, 424] site= 1425 +3424 1 n2-424.plc2.org sls= [423, 424, 425] site= 1426 +3425 1 n2-425.plc2.org sls= [424, 425, 426] site= 1427 +3426 1 n2-426.plc2.org sls= [425, 426, 427] site= 1428 +3427 1 n2-427.plc2.org sls= [426, 427, 428] site= 1429 +3428 1 n2-428.plc2.org sls= [429, 427, 428] site= 1430 +3429 1 n2-429.plc2.org sls= [429, 430, 428] site= 1431 +3430 1 n2-430.plc2.org sls= [429, 430, 431] site= 1432 +3431 1 n2-431.plc2.org sls= [430, 431, 432] site= 1433 +3432 1 n2-432.plc2.org sls= [431, 432, 433] site= 1434 +3433 1 n2-433.plc2.org sls= [432, 433, 434] site= 1435 +3434 1 n2-434.plc2.org sls= [433, 434, 435] site= 1436 +3435 1 n2-435.plc2.org sls= [434, 435, 436] site= 1437 +3436 1 n2-436.plc2.org sls= [437, 435, 436] site= 1438 +3437 1 n2-437.plc2.org sls= [437, 438, 436] site= 1439 +3438 1 n2-438.plc2.org sls= [437, 438, 439] site= 1440 +3439 1 n2-439.plc2.org sls= [438, 439, 440] site= 1441 +3440 1 n2-440.plc2.org sls= [439, 440, 441] site= 1442 +3441 1 n2-441.plc2.org sls= [440, 441, 442] site= 1443 +3442 1 n2-442.plc2.org sls= [441, 442, 443] site= 1444 +3443 1 n2-443.plc2.org sls= [442, 443, 444] site= 1445 +3444 1 n2-444.plc2.org sls= [445, 443, 444] site= 1446 +3445 1 n2-445.plc2.org sls= [445, 446, 444] site= 1447 +3446 1 n2-446.plc2.org sls= [445, 446, 447] site= 1448 +3447 1 n2-447.plc2.org sls= [446, 447, 448] site= 1449 +3448 1 n2-448.plc2.org sls= [447, 448, 449] site= 1450 +3449 1 n2-449.plc2.org sls= [448, 449, 450] site= 1451 +3450 1 n2-450.plc2.org sls= [449, 450, 451] site= 1452 +3451 1 n2-451.plc2.org sls= [450, 451, 452] site= 1453 +3452 1 n2-452.plc2.org sls= [453, 451, 452] site= 1454 +3453 1 n2-453.plc2.org sls= [453, 454, 452] site= 1455 +3454 1 n2-454.plc2.org sls= [453, 454, 455] site= 1456 +3455 1 n2-455.plc2.org sls= [454, 455, 456] site= 1457 +3456 1 n2-456.plc2.org sls= [455, 456, 457] site= 1458 +3457 1 n2-457.plc2.org sls= [456, 457, 458] site= 1459 +3458 1 n2-458.plc2.org sls= [457, 458, 459] site= 1460 +3459 1 n2-459.plc2.org sls= [458, 459, 460] site= 1461 +3460 1 n2-460.plc2.org sls= [461, 459, 460] site= 1462 +3461 1 n2-461.plc2.org sls= [461, 462, 460] site= 1463 +3462 1 n2-462.plc2.org sls= [461, 462, 463] site= 1464 +3463 1 n2-463.plc2.org sls= [462, 463, 464] site= 1465 +3464 1 n2-464.plc2.org sls= [463, 464, 465] site= 1466 +3465 1 n2-465.plc2.org sls= [464, 465, 466] site= 1467 +3466 1 n2-466.plc2.org sls= [465, 466, 467] site= 1468 +3467 1 n2-467.plc2.org sls= [466, 467, 468] site= 1469 +3468 1 n2-468.plc2.org sls= [469, 467, 468] site= 1470 +3469 1 n2-469.plc2.org sls= [469, 470, 468] site= 1471 +3470 1 n2-470.plc2.org sls= [469, 470, 471] site= 1472 +3471 1 n2-471.plc2.org sls= [470, 471, 472] site= 1473 +3472 1 n2-472.plc2.org sls= [471, 472, 473] site= 1474 +3473 1 n2-473.plc2.org sls= [472, 473, 474] site= 1475 +3474 1 n2-474.plc2.org sls= [473, 474, 475] site= 1476 +3475 1 n2-475.plc2.org sls= [474, 475, 476] site= 1477 +3476 1 n2-476.plc2.org sls= [477, 475, 476] site= 1478 +3477 1 n2-477.plc2.org sls= [477, 478, 476] site= 1479 +3478 1 n2-478.plc2.org sls= [477, 478, 479] site= 1480 +3479 1 n2-479.plc2.org sls= [478, 479, 480] site= 1481 +3480 1 n2-480.plc2.org sls= [479, 480, 481] site= 1482 +3481 1 n2-481.plc2.org sls= [480, 481, 482] site= 1483 +3482 1 n2-482.plc2.org sls= [481, 482, 483] site= 1484 +3483 1 n2-483.plc2.org sls= [482, 483, 484] site= 1485 +3484 1 n2-484.plc2.org sls= [485, 483, 484] site= 1486 +3485 1 n2-485.plc2.org sls= [485, 486, 484] site= 1487 +3486 1 n2-486.plc2.org sls= [485, 486, 487] site= 1488 +3487 1 n2-487.plc2.org sls= [486, 487, 488] site= 1489 +3488 1 n2-488.plc2.org sls= [487, 488, 489] site= 1490 +3489 1 n2-489.plc2.org sls= [488, 489, 490] site= 1491 +3490 1 n2-490.plc2.org sls= [489, 490, 491] site= 1492 +3491 1 n2-491.plc2.org sls= [490, 491, 492] site= 1493 +3492 1 n2-492.plc2.org sls= [493, 491, 492] site= 1494 +3493 1 n2-493.plc2.org sls= [493, 494, 492] site= 1495 +3494 1 n2-494.plc2.org sls= [493, 494, 495] site= 1496 +3495 1 n2-495.plc2.org sls= [494, 495, 496] site= 1497 +3496 1 n2-496.plc2.org sls= [495, 496, 497] site= 1498 +3497 1 n2-497.plc2.org sls= [496, 497, 498] site= 1499 +3498 1 n2-498.plc2.org sls= [497, 498, 499] site= 1500 +3499 1 n2-499.plc2.org sls= [498, 499, 500] site= 1501 +3500 1 n2-500.plc2.org sls= [501, 499, 500] site= 1502 +3501 1 n2-501.plc2.org sls= [501, 502, 500] site= 1503 +3502 1 n2-502.plc2.org sls= [501, 502, 503] site= 1504 +3503 1 n2-503.plc2.org sls= [502, 503, 504] site= 1505 +3504 1 n2-504.plc2.org sls= [503, 504, 505] site= 1506 +3505 1 n2-505.plc2.org sls= [504, 505, 506] site= 1507 +3506 1 n2-506.plc2.org sls= [505, 506, 507] site= 1508 +3507 1 n2-507.plc2.org sls= [506, 507, 508] site= 1509 +3508 1 n2-508.plc2.org sls= [509, 507, 508] site= 1510 +3509 1 n2-509.plc2.org sls= [509, 510, 508] site= 1511 +3510 1 n2-510.plc2.org sls= [509, 510, 511] site= 1512 +3511 1 n2-511.plc2.org sls= [510, 511, 512] site= 1513 +3512 1 n2-512.plc2.org sls= [511, 512, 513] site= 1514 +3513 1 n2-513.plc2.org sls= [512, 513, 514] site= 1515 +3514 1 n2-514.plc2.org sls= [513, 514, 515] site= 1516 +3515 1 n2-515.plc2.org sls= [514, 515, 516] site= 1517 +3516 1 n2-516.plc2.org sls= [517, 515, 516] site= 1518 +3517 1 n2-517.plc2.org sls= [517, 518, 516] site= 1519 +3518 1 n2-518.plc2.org sls= [517, 518, 519] site= 1520 +3519 1 n2-519.plc2.org sls= [518, 519, 520] site= 1521 +3520 1 n2-520.plc2.org sls= [519, 520, 521] site= 1522 +3521 1 n2-521.plc2.org sls= [520, 521, 522] site= 1523 +3522 1 n2-522.plc2.org sls= [521, 522, 523] site= 1524 +3523 1 n2-523.plc2.org sls= [522, 523, 524] site= 1525 +3524 1 n2-524.plc2.org sls= [525, 523, 524] site= 1526 +3525 1 n2-525.plc2.org sls= [525, 526, 524] site= 1527 +3526 1 n2-526.plc2.org sls= [526, 527, 525] site= 1528 +3527 1 n2-527.plc2.org sls= [527, 528, 526] site= 1529 +3528 1 n2-528.plc2.org sls= [528, 529, 527] site= 1530 +3529 1 n2-529.plc2.org sls= [529, 530, 528] site= 1531 +3530 1 n2-530.plc2.org sls= [530, 531, 529] site= 1532 +3531 1 n2-531.plc2.org sls= [531, 532, 530] site= 1533 +3532 1 n2-532.plc2.org sls= [532, 533, 531] site= 1534 +3533 1 n2-533.plc2.org sls= [533, 534, 532] site= 1535 +3534 1 n2-534.plc2.org sls= [533, 534, 535] site= 1536 +3535 1 n2-535.plc2.org sls= [534, 535, 536] site= 1537 +3536 1 n2-536.plc2.org sls= [535, 536, 537] site= 1538 +3537 1 n2-537.plc2.org sls= [536, 537, 538] site= 1539 +3538 1 n2-538.plc2.org sls= [537, 538, 539] site= 1540 +3539 1 n2-539.plc2.org sls= [538, 539, 540] site= 1541 +3540 1 n2-540.plc2.org sls= [541, 539, 540] site= 1542 +3541 1 n2-541.plc2.org sls= [541, 542, 540] site= 1543 +3542 1 n2-542.plc2.org sls= [541, 542, 543] site= 1544 +3543 1 n2-543.plc2.org sls= [542, 543, 544] site= 1545 +3544 1 n2-544.plc2.org sls= [543, 544, 545] site= 1546 +3545 1 n2-545.plc2.org sls= [544, 545, 546] site= 1547 +3546 1 n2-546.plc2.org sls= [545, 546, 547] site= 1548 +3547 1 n2-547.plc2.org sls= [546, 547, 548] site= 1549 +3548 1 n2-548.plc2.org sls= [549, 547, 548] site= 1550 +3549 1 n2-549.plc2.org sls= [549, 550, 548] site= 1551 +3550 1 n2-550.plc2.org sls= [549, 550, 551] site= 1552 +3551 1 n2-551.plc2.org sls= [550, 551, 552] site= 1553 +3552 1 n2-552.plc2.org sls= [551, 552, 553] site= 1554 +3553 1 n2-553.plc2.org sls= [552, 553, 554] site= 1555 +3554 1 n2-554.plc2.org sls= [553, 554, 555] site= 1556 +3555 1 n2-555.plc2.org sls= [554, 555, 556] site= 1557 +3556 1 n2-556.plc2.org sls= [557, 555, 556] site= 1558 +3557 1 n2-557.plc2.org sls= [557, 558, 556] site= 1559 +3558 1 n2-558.plc2.org sls= [557, 558, 559] site= 1560 +3559 1 n2-559.plc2.org sls= [558, 559, 560] site= 1561 +3560 1 n2-560.plc2.org sls= [559, 560, 561] site= 1562 +3561 1 n2-561.plc2.org sls= [560, 561, 562] site= 1563 +3562 1 n2-562.plc2.org sls= [561, 562, 563] site= 1564 +3563 1 n2-563.plc2.org sls= [562, 563, 564] site= 1565 +3564 1 n2-564.plc2.org sls= [565, 563, 564] site= 1566 +3565 1 n2-565.plc2.org sls= [565, 566, 564] site= 1567 +3566 1 n2-566.plc2.org sls= [565, 566, 567] site= 1568 +3567 1 n2-567.plc2.org sls= [566, 567, 568] site= 1569 +3568 1 n2-568.plc2.org sls= [567, 568, 569] site= 1570 +3569 1 n2-569.plc2.org sls= [568, 569, 570] site= 1571 +3570 1 n2-570.plc2.org sls= [569, 570, 571] site= 1572 +3571 1 n2-571.plc2.org sls= [570, 571, 572] site= 1573 +3572 1 n2-572.plc2.org sls= [573, 571, 572] site= 1574 +3573 1 n2-573.plc2.org sls= [573, 574, 572] site= 1575 +3574 1 n2-574.plc2.org sls= [573, 574, 575] site= 1576 +3575 1 n2-575.plc2.org sls= [574, 575, 576] site= 1577 +3576 1 n2-576.plc2.org sls= [575, 576, 577] site= 1578 +3577 1 n2-577.plc2.org sls= [576, 577, 578] site= 1579 +3578 1 n2-578.plc2.org sls= [577, 578, 579] site= 1580 +3579 1 n2-579.plc2.org sls= [578, 579, 580] site= 1581 +3580 1 n2-580.plc2.org sls= [581, 579, 580] site= 1582 +3581 1 n2-581.plc2.org sls= [581, 582, 580] site= 1583 +3582 1 n2-582.plc2.org sls= [581, 582, 583] site= 1584 +3583 1 n2-583.plc2.org sls= [582, 583, 584] site= 1585 +3584 1 n2-584.plc2.org sls= [583, 584, 585] site= 1586 +3585 1 n2-585.plc2.org sls= [584, 585, 586] site= 1587 +3586 1 n2-586.plc2.org sls= [585, 586, 587] site= 1588 +3587 1 n2-587.plc2.org sls= [586, 587, 588] site= 1589 +3588 1 n2-588.plc2.org sls= [589, 587, 588] site= 1590 +3589 1 n2-589.plc2.org sls= [589, 590, 588] site= 1591 +3590 1 n2-590.plc2.org sls= [589, 590, 591] site= 1592 +3591 1 n2-591.plc2.org sls= [590, 591, 592] site= 1593 +3592 1 n2-592.plc2.org sls= [591, 592, 593] site= 1594 +3593 1 n2-593.plc2.org sls= [592, 593, 594] site= 1595 +3594 1 n2-594.plc2.org sls= [593, 594, 595] site= 1596 +3595 1 n2-595.plc2.org sls= [594, 595, 596] site= 1597 +3596 1 n2-596.plc2.org sls= [597, 595, 596] site= 1598 +3597 1 n2-597.plc2.org sls= [597, 598, 596] site= 1599 +3598 1 n2-598.plc2.org sls= [597, 598, 599] site= 1600 +3599 1 n2-599.plc2.org sls= [598, 599, 600] site= 1601 +3600 1 n2-600.plc2.org sls= [599, 600, 601] site= 1602 +3601 1 n2-601.plc2.org sls= [600, 601, 602] site= 1603 +3602 1 n2-602.plc2.org sls= [601, 602, 603] site= 1604 +3603 1 n2-603.plc2.org sls= [602, 603, 604] site= 1605 +3604 1 n2-604.plc2.org sls= [605, 603, 604] site= 1606 +3605 1 n2-605.plc2.org sls= [605, 606, 604] site= 1607 +3606 1 n2-606.plc2.org sls= [605, 606, 607] site= 1608 +3607 1 n2-607.plc2.org sls= [606, 607, 608] site= 1609 +3608 1 n2-608.plc2.org sls= [607, 608, 609] site= 1610 +3609 1 n2-609.plc2.org sls= [608, 609, 610] site= 1611 +3610 1 n2-610.plc2.org sls= [609, 610, 611] site= 1612 +3611 1 n2-611.plc2.org sls= [610, 611, 612] site= 1613 +3612 1 n2-612.plc2.org sls= [613, 611, 612] site= 1614 +3613 1 n2-613.plc2.org sls= [613, 614, 612] site= 1615 +3614 1 n2-614.plc2.org sls= [613, 614, 615] site= 1616 +3615 1 n2-615.plc2.org sls= [614, 615, 616] site= 1617 +3616 1 n2-616.plc2.org sls= [615, 616, 617] site= 1618 +3617 1 n2-617.plc2.org sls= [616, 617, 618] site= 1619 +3618 1 n2-618.plc2.org sls= [617, 618, 619] site= 1620 +3619 1 n2-619.plc2.org sls= [618, 619, 620] site= 1621 +3620 1 n2-620.plc2.org sls= [621, 619, 620] site= 1622 +3621 1 n2-621.plc2.org sls= [621, 622, 620] site= 1623 +3622 1 n2-622.plc2.org sls= [621, 622, 623] site= 1624 +3623 1 n2-623.plc2.org sls= [622, 623, 624] site= 1625 +3624 1 n2-624.plc2.org sls= [623, 624, 625] site= 1626 +3625 1 n2-625.plc2.org sls= [624, 625, 626] site= 1627 +3626 1 n2-626.plc2.org sls= [625, 626, 627] site= 1628 +3627 1 n2-627.plc2.org sls= [626, 627, 628] site= 1629 +3628 1 n2-628.plc2.org sls= [629, 627, 628] site= 1630 +3629 1 n2-629.plc2.org sls= [629, 630, 628] site= 1631 +3630 1 n2-630.plc2.org sls= [629, 630, 631] site= 1632 +3631 1 n2-631.plc2.org sls= [630, 631, 632] site= 1633 +3632 1 n2-632.plc2.org sls= [631, 632, 633] site= 1634 +3633 1 n2-633.plc2.org sls= [632, 633, 634] site= 1635 +3634 1 n2-634.plc2.org sls= [633, 634, 635] site= 1636 +3635 1 n2-635.plc2.org sls= [634, 635, 636] site= 1637 +3636 1 n2-636.plc2.org sls= [637, 635, 636] site= 1638 +3637 1 n2-637.plc2.org sls= [637, 638, 636] site= 1639 +3638 1 n2-638.plc2.org sls= [637, 638, 639] site= 1640 +3639 1 n2-639.plc2.org sls= [638, 639, 640] site= 1641 +3640 1 n2-640.plc2.org sls= [639, 640, 641] site= 1642 +3641 1 n2-641.plc2.org sls= [640, 641, 642] site= 1643 +3642 1 n2-642.plc2.org sls= [641, 642, 643] site= 1644 +3643 1 n2-643.plc2.org sls= [642, 643, 644] site= 1645 +3644 1 n2-644.plc2.org sls= [645, 643, 644] site= 1646 +3645 1 n2-645.plc2.org sls= [645, 646, 644] site= 1647 +3646 1 n2-646.plc2.org sls= [645, 646, 647] site= 1648 +3647 1 n2-647.plc2.org sls= [646, 647, 648] site= 1649 +3648 1 n2-648.plc2.org sls= [647, 648, 649] site= 1650 +3649 1 n2-649.plc2.org sls= [648, 649, 650] site= 1651 +3650 1 n2-650.plc2.org sls= [649, 650, 651] site= 1652 +3651 1 n2-651.plc2.org sls= [650, 651, 652] site= 1653 +3652 1 n2-652.plc2.org sls= [653, 651, 652] site= 1654 +3653 1 n2-653.plc2.org sls= [653, 654, 652] site= 1655 +3654 1 n2-654.plc2.org sls= [653, 654, 655] site= 1656 +3655 1 n2-655.plc2.org sls= [654, 655, 656] site= 1657 +3656 1 n2-656.plc2.org sls= [655, 656, 657] site= 1658 +3657 1 n2-657.plc2.org sls= [656, 657, 658] site= 1659 +3658 1 n2-658.plc2.org sls= [657, 658, 659] site= 1660 +3659 1 n2-659.plc2.org sls= [658, 659, 660] site= 1661 +3660 1 n2-660.plc2.org sls= [661, 659, 660] site= 1662 +3661 1 n2-661.plc2.org sls= [661, 662, 660] site= 1663 +3662 1 n2-662.plc2.org sls= [661, 662, 663] site= 1664 +3663 1 n2-663.plc2.org sls= [662, 663, 664] site= 1665 +3664 1 n2-664.plc2.org sls= [663, 664, 665] site= 1666 +3665 1 n2-665.plc2.org sls= [664, 665, 666] site= 1667 +3666 1 n2-666.plc2.org sls= [665, 666, 667] site= 1668 +3667 1 n2-667.plc2.org sls= [666, 667, 668] site= 1669 +3668 1 n2-668.plc2.org sls= [669, 667, 668] site= 1670 +3669 1 n2-669.plc2.org sls= [669, 670, 668] site= 1671 +3670 1 n2-670.plc2.org sls= [669, 670, 671] site= 1672 +3671 1 n2-671.plc2.org sls= [670, 671, 672] site= 1673 +3672 1 n2-672.plc2.org sls= [671, 672, 673] site= 1674 +3673 1 n2-673.plc2.org sls= [672, 673, 674] site= 1675 +3674 1 n2-674.plc2.org sls= [673, 674, 675] site= 1676 +3675 1 n2-675.plc2.org sls= [674, 675, 676] site= 1677 +3676 1 n2-676.plc2.org sls= [677, 675, 676] site= 1678 +3677 1 n2-677.plc2.org sls= [677, 678, 676] site= 1679 +3678 1 n2-678.plc2.org sls= [677, 678, 679] site= 1680 +3679 1 n2-679.plc2.org sls= [678, 679, 680] site= 1681 +3680 1 n2-680.plc2.org sls= [679, 680, 681] site= 1682 +3681 1 n2-681.plc2.org sls= [680, 681, 682] site= 1683 +3682 1 n2-682.plc2.org sls= [681, 682, 683] site= 1684 +3683 1 n2-683.plc2.org sls= [682, 683, 684] site= 1685 +3684 1 n2-684.plc2.org sls= [685, 683, 684] site= 1686 +3685 1 n2-685.plc2.org sls= [685, 686, 684] site= 1687 +3686 1 n2-686.plc2.org sls= [685, 686, 687] site= 1688 +3687 1 n2-687.plc2.org sls= [686, 687, 688] site= 1689 +3688 1 n2-688.plc2.org sls= [687, 688, 689] site= 1690 +3689 1 n2-689.plc2.org sls= [688, 689, 690] site= 1691 +3690 1 n2-690.plc2.org sls= [689, 690, 691] site= 1692 +3691 1 n2-691.plc2.org sls= [690, 691, 692] site= 1693 +3692 1 n2-692.plc2.org sls= [693, 691, 692] site= 1694 +3693 1 n2-693.plc2.org sls= [693, 694, 692] site= 1695 +3694 1 n2-694.plc2.org sls= [693, 694, 695] site= 1696 +3695 1 n2-695.plc2.org sls= [694, 695, 696] site= 1697 +3696 1 n2-696.plc2.org sls= [695, 696, 697] site= 1698 +3697 1 n2-697.plc2.org sls= [696, 697, 698] site= 1699 +3698 1 n2-698.plc2.org sls= [697, 698, 699] site= 1700 +3699 1 n2-699.plc2.org sls= [698, 699, 700] site= 1701 +3700 1 n2-700.plc2.org sls= [701, 699, 700] site= 1702 +3701 1 n2-701.plc2.org sls= [701, 702, 700] site= 1703 +3702 1 n2-702.plc2.org sls= [701, 702, 703] site= 1704 +3703 1 n2-703.plc2.org sls= [702, 703, 704] site= 1705 +3704 1 n2-704.plc2.org sls= [703, 704, 705] site= 1706 +3705 1 n2-705.plc2.org sls= [704, 705, 706] site= 1707 +3706 1 n2-706.plc2.org sls= [705, 706, 707] site= 1708 +3707 1 n2-707.plc2.org sls= [706, 707, 708] site= 1709 +3708 1 n2-708.plc2.org sls= [709, 707, 708] site= 1710 +3709 1 n2-709.plc2.org sls= [709, 710, 708] site= 1711 +3710 1 n2-710.plc2.org sls= [709, 710, 711] site= 1712 +3711 1 n2-711.plc2.org sls= [710, 711, 712] site= 1713 +3712 1 n2-712.plc2.org sls= [711, 712, 713] site= 1714 +3713 1 n2-713.plc2.org sls= [712, 713, 714] site= 1715 +3714 1 n2-714.plc2.org sls= [713, 714, 715] site= 1716 +3715 1 n2-715.plc2.org sls= [714, 715, 716] site= 1717 +3716 1 n2-716.plc2.org sls= [717, 715, 716] site= 1718 +3717 1 n2-717.plc2.org sls= [717, 718, 716] site= 1719 +3718 1 n2-718.plc2.org sls= [717, 718, 719] site= 1720 +3719 1 n2-719.plc2.org sls= [718, 719, 720] site= 1721 +3720 1 n2-720.plc2.org sls= [719, 720, 721] site= 1722 +3721 1 n2-721.plc2.org sls= [720, 721, 722] site= 1723 +3722 1 n2-722.plc2.org sls= [721, 722, 723] site= 1724 +3723 1 n2-723.plc2.org sls= [722, 723, 724] site= 1725 +3724 1 n2-724.plc2.org sls= [725, 723, 724] site= 1726 +3725 1 n2-725.plc2.org sls= [725, 726, 724] site= 1727 +3726 1 n2-726.plc2.org sls= [725, 726, 727] site= 1728 +3727 1 n2-727.plc2.org sls= [726, 727, 728] site= 1729 +3728 1 n2-728.plc2.org sls= [727, 728, 729] site= 1730 +3729 1 n2-729.plc2.org sls= [728, 729, 730] site= 1731 +3730 1 n2-730.plc2.org sls= [729, 730, 731] site= 1732 +3731 1 n2-731.plc2.org sls= [730, 731, 732] site= 1733 +3732 1 n2-732.plc2.org sls= [733, 731, 732] site= 1734 +3733 1 n2-733.plc2.org sls= [733, 734, 732] site= 1735 +3734 1 n2-734.plc2.org sls= [733, 734, 735] site= 1736 +3735 1 n2-735.plc2.org sls= [734, 735, 736] site= 1737 +3736 1 n2-736.plc2.org sls= [735, 736, 737] site= 1738 +3737 1 n2-737.plc2.org sls= [736, 737, 738] site= 1739 +3738 1 n2-738.plc2.org sls= [737, 738, 739] site= 1740 +3739 1 n2-739.plc2.org sls= [738, 739, 740] site= 1741 +3740 1 n2-740.plc2.org sls= [741, 739, 740] site= 1742 +3741 1 n2-741.plc2.org sls= [741, 742, 740] site= 1743 +3742 1 n2-742.plc2.org sls= [741, 742, 743] site= 1744 +3743 1 n2-743.plc2.org sls= [742, 743, 744] site= 1745 +3744 1 n2-744.plc2.org sls= [743, 744, 745] site= 1746 +3745 1 n2-745.plc2.org sls= [744, 745, 746] site= 1747 +3746 1 n2-746.plc2.org sls= [745, 746, 747] site= 1748 +3747 1 n2-747.plc2.org sls= [746, 747, 748] site= 1749 +3748 1 n2-748.plc2.org sls= [749, 747, 748] site= 1750 +3749 1 n2-749.plc2.org sls= [749, 750, 748] site= 1751 +3750 1 n2-750.plc2.org sls= [749, 750, 751] site= 1752 +3751 1 n2-751.plc2.org sls= [750, 751, 752] site= 1753 +3752 1 n2-752.plc2.org sls= [751, 752, 753] site= 1754 +3753 1 n2-753.plc2.org sls= [752, 753, 754] site= 1755 +3754 1 n2-754.plc2.org sls= [753, 754, 755] site= 1756 +3755 1 n2-755.plc2.org sls= [754, 755, 756] site= 1757 +3756 1 n2-756.plc2.org sls= [757, 755, 756] site= 1758 +3757 1 n2-757.plc2.org sls= [757, 758, 756] site= 1759 +3758 1 n2-758.plc2.org sls= [757, 758, 759] site= 1760 +3759 1 n2-759.plc2.org sls= [758, 759, 760] site= 1761 +3760 1 n2-760.plc2.org sls= [759, 760, 761] site= 1762 +3761 1 n2-761.plc2.org sls= [760, 761, 762] site= 1763 +3762 1 n2-762.plc2.org sls= [761, 762, 763] site= 1764 +3763 1 n2-763.plc2.org sls= [762, 763, 764] site= 1765 +3764 1 n2-764.plc2.org sls= [765, 763, 764] site= 1766 +3765 1 n2-765.plc2.org sls= [765, 766, 764] site= 1767 +3766 1 n2-766.plc2.org sls= [765, 766, 767] site= 1768 +3767 1 n2-767.plc2.org sls= [766, 767, 768] site= 1769 +3768 1 n2-768.plc2.org sls= [767, 768, 769] site= 1770 +3769 1 n2-769.plc2.org sls= [768, 769, 770] site= 1771 +3770 1 n2-770.plc2.org sls= [769, 770, 771] site= 1772 +3771 1 n2-771.plc2.org sls= [770, 771, 772] site= 1773 +3772 1 n2-772.plc2.org sls= [773, 771, 772] site= 1774 +3773 1 n2-773.plc2.org sls= [773, 774, 772] site= 1775 +3774 1 n2-774.plc2.org sls= [773, 774, 775] site= 1776 +3775 1 n2-775.plc2.org sls= [774, 775, 776] site= 1777 +3776 1 n2-776.plc2.org sls= [775, 776, 777] site= 1778 +3777 1 n2-777.plc2.org sls= [776, 777, 778] site= 1779 +3778 1 n2-778.plc2.org sls= [777, 778, 779] site= 1780 +3779 1 n2-779.plc2.org sls= [778, 779, 780] site= 1781 +3780 1 n2-780.plc2.org sls= [781, 779, 780] site= 1782 +3781 1 n2-781.plc2.org sls= [781, 782, 780] site= 1783 +3782 1 n2-782.plc2.org sls= [781, 782, 783] site= 1784 +3783 1 n2-783.plc2.org sls= [782, 783, 784] site= 1785 +3784 1 n2-784.plc2.org sls= [783, 784, 785] site= 1786 +3785 1 n2-785.plc2.org sls= [784, 785, 786] site= 1787 +3786 1 n2-786.plc2.org sls= [785, 786, 787] site= 1788 +3787 1 n2-787.plc2.org sls= [786, 787, 788] site= 1789 +3788 1 n2-788.plc2.org sls= [789, 787, 788] site= 1790 +3789 1 n2-789.plc2.org sls= [789, 790, 788] site= 1791 +3790 1 n2-790.plc2.org sls= [789, 790, 791] site= 1792 +3791 1 n2-791.plc2.org sls= [790, 791, 792] site= 1793 +3792 1 n2-792.plc2.org sls= [791, 792, 793] site= 1794 +3793 1 n2-793.plc2.org sls= [792, 793, 794] site= 1795 +3794 1 n2-794.plc2.org sls= [793, 794, 795] site= 1796 +3795 1 n2-795.plc2.org sls= [794, 795, 796] site= 1797 +3796 1 n2-796.plc2.org sls= [797, 795, 796] site= 1798 +3797 1 n2-797.plc2.org sls= [797, 798, 796] site= 1799 +3798 1 n2-798.plc2.org sls= [797, 798, 799] site= 1800 +3799 1 n2-799.plc2.org sls= [798, 799, 800] site= 1801 +3800 1 n2-800.plc2.org sls= [799, 800, 801] site= 1802 +3801 1 n2-801.plc2.org sls= [800, 801, 802] site= 1803 +3802 1 n2-802.plc2.org sls= [801, 802, 803] site= 1804 +3803 1 n2-803.plc2.org sls= [802, 803, 804] site= 1805 +3804 1 n2-804.plc2.org sls= [805, 803, 804] site= 1806 +3805 1 n2-805.plc2.org sls= [805, 806, 804] site= 1807 +3806 1 n2-806.plc2.org sls= [805, 806, 807] site= 1808 +3807 1 n2-807.plc2.org sls= [806, 807, 808] site= 1809 +3808 1 n2-808.plc2.org sls= [807, 808, 809] site= 1810 +3809 1 n2-809.plc2.org sls= [808, 809, 810] site= 1811 +3810 1 n2-810.plc2.org sls= [809, 810, 811] site= 1812 +3811 1 n2-811.plc2.org sls= [810, 811, 812] site= 1813 +3812 1 n2-812.plc2.org sls= [813, 811, 812] site= 1814 +3813 1 n2-813.plc2.org sls= [813, 814, 812] site= 1815 +3814 1 n2-814.plc2.org sls= [813, 814, 815] site= 1816 +3815 1 n2-815.plc2.org sls= [814, 815, 816] site= 1817 +3816 1 n2-816.plc2.org sls= [815, 816, 817] site= 1818 +3817 1 n2-817.plc2.org sls= [816, 817, 818] site= 1819 +3818 1 n2-818.plc2.org sls= [817, 818, 819] site= 1820 +3819 1 n2-819.plc2.org sls= [818, 819, 820] site= 1821 +3820 1 n2-820.plc2.org sls= [821, 819, 820] site= 1822 +3821 1 n2-821.plc2.org sls= [821, 822, 820] site= 1823 +3822 1 n2-822.plc2.org sls= [821, 822, 823] site= 1824 +3823 1 n2-823.plc2.org sls= [822, 823, 824] site= 1825 +3824 1 n2-824.plc2.org sls= [823, 824, 825] site= 1826 +3825 1 n2-825.plc2.org sls= [824, 825, 826] site= 1827 +3826 1 n2-826.plc2.org sls= [825, 826, 827] site= 1828 +3827 1 n2-827.plc2.org sls= [826, 827, 828] site= 1829 +3828 1 n2-828.plc2.org sls= [829, 827, 828] site= 1830 +3829 1 n2-829.plc2.org sls= [829, 830, 828] site= 1831 +3830 1 n2-830.plc2.org sls= [829, 830, 831] site= 1832 +3831 1 n2-831.plc2.org sls= [830, 831, 832] site= 1833 +3832 1 n2-832.plc2.org sls= [831, 832, 833] site= 1834 +3833 1 n2-833.plc2.org sls= [832, 833, 834] site= 1835 +3834 1 n2-834.plc2.org sls= [833, 834, 835] site= 1836 +3835 1 n2-835.plc2.org sls= [834, 835, 836] site= 1837 +3836 1 n2-836.plc2.org sls= [837, 835, 836] site= 1838 +3837 1 n2-837.plc2.org sls= [837, 838, 836] site= 1839 +3838 1 n2-838.plc2.org sls= [837, 838, 839] site= 1840 +3839 1 n2-839.plc2.org sls= [838, 839, 840] site= 1841 +3840 1 n2-840.plc2.org sls= [839, 840, 841] site= 1842 +3841 1 n2-841.plc2.org sls= [840, 841, 842] site= 1843 +3842 1 n2-842.plc2.org sls= [841, 842, 843] site= 1844 +3843 1 n2-843.plc2.org sls= [842, 843, 844] site= 1845 +3844 1 n2-844.plc2.org sls= [845, 843, 844] site= 1846 +3845 1 n2-845.plc2.org sls= [845, 846, 844] site= 1847 +3846 1 n2-846.plc2.org sls= [845, 846, 847] site= 1848 +3847 1 n2-847.plc2.org sls= [846, 847, 848] site= 1849 +3848 1 n2-848.plc2.org sls= [847, 848, 849] site= 1850 +3849 1 n2-849.plc2.org sls= [848, 849, 850] site= 1851 +3850 1 n2-850.plc2.org sls= [849, 850, 851] site= 1852 +3851 1 n2-851.plc2.org sls= [850, 851, 852] site= 1853 +3852 1 n2-852.plc2.org sls= [853, 851, 852] site= 1854 +3853 1 n2-853.plc2.org sls= [853, 854, 852] site= 1855 +3854 1 n2-854.plc2.org sls= [853, 854, 855] site= 1856 +3855 1 n2-855.plc2.org sls= [854, 855, 856] site= 1857 +3856 1 n2-856.plc2.org sls= [855, 856, 857] site= 1858 +3857 1 n2-857.plc2.org sls= [856, 857, 858] site= 1859 +3858 1 n2-858.plc2.org sls= [857, 858, 859] site= 1860 +3859 1 n2-859.plc2.org sls= [858, 859, 860] site= 1861 +3860 1 n2-860.plc2.org sls= [861, 859, 860] site= 1862 +3861 1 n2-861.plc2.org sls= [861, 862, 860] site= 1863 +3862 1 n2-862.plc2.org sls= [861, 862, 863] site= 1864 +3863 1 n2-863.plc2.org sls= [862, 863, 864] site= 1865 +3864 1 n2-864.plc2.org sls= [863, 864, 865] site= 1866 +3865 1 n2-865.plc2.org sls= [864, 865, 866] site= 1867 +3866 1 n2-866.plc2.org sls= [865, 866, 867] site= 1868 +3867 1 n2-867.plc2.org sls= [866, 867, 868] site= 1869 +3868 1 n2-868.plc2.org sls= [869, 867, 868] site= 1870 +3869 1 n2-869.plc2.org sls= [869, 870, 868] site= 1871 +3870 1 n2-870.plc2.org sls= [869, 870, 871] site= 1872 +3871 1 n2-871.plc2.org sls= [870, 871, 872] site= 1873 +3872 1 n2-872.plc2.org sls= [871, 872, 873] site= 1874 +3873 1 n2-873.plc2.org sls= [872, 873, 874] site= 1875 +3874 1 n2-874.plc2.org sls= [873, 874, 875] site= 1876 +3875 1 n2-875.plc2.org sls= [874, 875, 876] site= 1877 +3876 1 n2-876.plc2.org sls= [877, 875, 876] site= 1878 +3877 1 n2-877.plc2.org sls= [877, 878, 876] site= 1879 +3878 1 n2-878.plc2.org sls= [877, 878, 879] site= 1880 +3879 1 n2-879.plc2.org sls= [878, 879, 880] site= 1881 +3880 1 n2-880.plc2.org sls= [879, 880, 881] site= 1882 +3881 1 n2-881.plc2.org sls= [880, 881, 882] site= 1883 +3882 1 n2-882.plc2.org sls= [881, 882, 883] site= 1884 +3883 1 n2-883.plc2.org sls= [882, 883, 884] site= 1885 +3884 1 n2-884.plc2.org sls= [885, 883, 884] site= 1886 +3885 1 n2-885.plc2.org sls= [885, 886, 884] site= 1887 +3886 1 n2-886.plc2.org sls= [885, 886, 887] site= 1888 +3887 1 n2-887.plc2.org sls= [886, 887, 888] site= 1889 +3888 1 n2-888.plc2.org sls= [887, 888, 889] site= 1890 +3889 1 n2-889.plc2.org sls= [888, 889, 890] site= 1891 +3890 1 n2-890.plc2.org sls= [889, 890, 891] site= 1892 +3891 1 n2-891.plc2.org sls= [890, 891, 892] site= 1893 +3892 1 n2-892.plc2.org sls= [893, 891, 892] site= 1894 +3893 1 n2-893.plc2.org sls= [893, 894, 892] site= 1895 +3894 1 n2-894.plc2.org sls= [893, 894, 895] site= 1896 +3895 1 n2-895.plc2.org sls= [894, 895, 896] site= 1897 +3896 1 n2-896.plc2.org sls= [895, 896, 897] site= 1898 +3897 1 n2-897.plc2.org sls= [896, 897, 898] site= 1899 +3898 1 n2-898.plc2.org sls= [897, 898, 899] site= 1900 +3899 1 n2-899.plc2.org sls= [898, 899, 900] site= 1901 +3900 1 n2-900.plc2.org sls= [901, 899, 900] site= 1902 +3901 1 n2-901.plc2.org sls= [901, 902, 900] site= 1903 +3902 1 n2-902.plc2.org sls= [901, 902, 903] site= 1904 +3903 1 n2-903.plc2.org sls= [902, 903, 904] site= 1905 +3904 1 n2-904.plc2.org sls= [903, 904, 905] site= 1906 +3905 1 n2-905.plc2.org sls= [904, 905, 906] site= 1907 +3906 1 n2-906.plc2.org sls= [905, 906, 907] site= 1908 +3907 1 n2-907.plc2.org sls= [906, 907, 908] site= 1909 +3908 1 n2-908.plc2.org sls= [909, 907, 908] site= 1910 +3909 1 n2-909.plc2.org sls= [909, 910, 908] site= 1911 +3910 1 n2-910.plc2.org sls= [909, 910, 911] site= 1912 +3911 1 n2-911.plc2.org sls= [910, 911, 912] site= 1913 +3912 1 n2-912.plc2.org sls= [911, 912, 913] site= 1914 +3913 1 n2-913.plc2.org sls= [912, 913, 914] site= 1915 +3914 1 n2-914.plc2.org sls= [913, 914, 915] site= 1916 +3915 1 n2-915.plc2.org sls= [914, 915, 916] site= 1917 +3916 1 n2-916.plc2.org sls= [917, 915, 916] site= 1918 +3917 1 n2-917.plc2.org sls= [917, 918, 916] site= 1919 +3918 1 n2-918.plc2.org sls= [917, 918, 919] site= 1920 +3919 1 n2-919.plc2.org sls= [918, 919, 920] site= 1921 +3920 1 n2-920.plc2.org sls= [919, 920, 921] site= 1922 +3921 1 n2-921.plc2.org sls= [920, 921, 922] site= 1923 +3922 1 n2-922.plc2.org sls= [921, 922, 923] site= 1924 +3923 1 n2-923.plc2.org sls= [922, 923, 924] site= 1925 +3924 1 n2-924.plc2.org sls= [925, 923, 924] site= 1926 +3925 1 n2-925.plc2.org sls= [925, 926, 924] site= 1927 +3926 1 n2-926.plc2.org sls= [925, 926, 927] site= 1928 +3927 1 n2-927.plc2.org sls= [926, 927, 928] site= 1929 +3928 1 n2-928.plc2.org sls= [927, 928, 929] site= 1930 +3929 1 n2-929.plc2.org sls= [928, 929, 930] site= 1931 +3930 1 n2-930.plc2.org sls= [929, 930, 931] site= 1932 +3931 1 n2-931.plc2.org sls= [930, 931, 932] site= 1933 +3932 1 n2-932.plc2.org sls= [933, 931, 932] site= 1934 +3933 1 n2-933.plc2.org sls= [933, 934, 932] site= 1935 +3934 1 n2-934.plc2.org sls= [933, 934, 935] site= 1936 +3935 1 n2-935.plc2.org sls= [934, 935, 936] site= 1937 +3936 1 n2-936.plc2.org sls= [935, 936, 937] site= 1938 +3937 1 n2-937.plc2.org sls= [936, 937, 938] site= 1939 +3938 1 n2-938.plc2.org sls= [937, 938, 939] site= 1940 +3939 1 n2-939.plc2.org sls= [938, 939, 940] site= 1941 +3940 1 n2-940.plc2.org sls= [941, 939, 940] site= 1942 +3941 1 n2-941.plc2.org sls= [941, 942, 940] site= 1943 +3942 1 n2-942.plc2.org sls= [941, 942, 943] site= 1944 +3943 1 n2-943.plc2.org sls= [942, 943, 944] site= 1945 +3944 1 n2-944.plc2.org sls= [943, 944, 945] site= 1946 +3945 1 n2-945.plc2.org sls= [944, 945, 946] site= 1947 +3946 1 n2-946.plc2.org sls= [945, 946, 947] site= 1948 +3947 1 n2-947.plc2.org sls= [946, 947, 948] site= 1949 +3948 1 n2-948.plc2.org sls= [949, 947, 948] site= 1950 +3949 1 n2-949.plc2.org sls= [949, 950, 948] site= 1951 +3950 1 n2-950.plc2.org sls= [949, 950, 951] site= 1952 +3951 1 n2-951.plc2.org sls= [950, 951, 952] site= 1953 +3952 1 n2-952.plc2.org sls= [951, 952, 953] site= 1954 +3953 1 n2-953.plc2.org sls= [952, 953, 954] site= 1955 +3954 1 n2-954.plc2.org sls= [953, 954, 955] site= 1956 +3955 1 n2-955.plc2.org sls= [954, 955, 956] site= 1957 +3956 1 n2-956.plc2.org sls= [957, 955, 956] site= 1958 +3957 1 n2-957.plc2.org sls= [957, 958, 956] site= 1959 +3958 1 n2-958.plc2.org sls= [957, 958, 959] site= 1960 +3959 1 n2-959.plc2.org sls= [958, 959, 960] site= 1961 +3960 1 n2-960.plc2.org sls= [959, 960, 961] site= 1962 +3961 1 n2-961.plc2.org sls= [960, 961, 962] site= 1963 +3962 1 n2-962.plc2.org sls= [961, 962, 963] site= 1964 +3963 1 n2-963.plc2.org sls= [962, 963, 964] site= 1965 +3964 1 n2-964.plc2.org sls= [965, 963, 964] site= 1966 +3965 1 n2-965.plc2.org sls= [965, 966, 964] site= 1967 +3966 1 n2-966.plc2.org sls= [965, 966, 967] site= 1968 +3967 1 n2-967.plc2.org sls= [966, 967, 968] site= 1969 +3968 1 n2-968.plc2.org sls= [967, 968, 969] site= 1970 +3969 1 n2-969.plc2.org sls= [968, 969, 970] site= 1971 +3970 1 n2-970.plc2.org sls= [969, 970, 971] site= 1972 +3971 1 n2-971.plc2.org sls= [970, 971, 972] site= 1973 +3972 1 n2-972.plc2.org sls= [973, 971, 972] site= 1974 +3973 1 n2-973.plc2.org sls= [973, 974, 972] site= 1975 +3974 1 n2-974.plc2.org sls= [973, 974, 975] site= 1976 +3975 1 n2-975.plc2.org sls= [974, 975, 976] site= 1977 +3976 1 n2-976.plc2.org sls= [975, 976, 977] site= 1978 +3977 1 n2-977.plc2.org sls= [976, 977, 978] site= 1979 +3978 1 n2-978.plc2.org sls= [977, 978, 979] site= 1980 +3979 1 n2-979.plc2.org sls= [978, 979, 980] site= 1981 +3980 1 n2-980.plc2.org sls= [981, 979, 980] site= 1982 +3981 1 n2-981.plc2.org sls= [981, 982, 980] site= 1983 +3982 1 n2-982.plc2.org sls= [981, 982, 983] site= 1984 +3983 1 n2-983.plc2.org sls= [982, 983, 984] site= 1985 +3984 1 n2-984.plc2.org sls= [983, 984, 985] site= 1986 +3985 1 n2-985.plc2.org sls= [984, 985, 986] site= 1987 +3986 1 n2-986.plc2.org sls= [985, 986, 987] site= 1988 +3987 1 n2-987.plc2.org sls= [986, 987, 988] site= 1989 +3988 1 n2-988.plc2.org sls= [989, 987, 988] site= 1990 +3989 1 n2-989.plc2.org sls= [989, 990, 988] site= 1991 +3990 1 n2-990.plc2.org sls= [989, 990, 991] site= 1992 +3991 1 n2-991.plc2.org sls= [990, 991, 992] site= 1993 +3992 1 n2-992.plc2.org sls= [991, 992, 993] site= 1994 +3993 1 n2-993.plc2.org sls= [992, 993, 994] site= 1995 +3994 1 n2-994.plc2.org sls= [993, 994, 995] site= 1996 +3995 1 n2-995.plc2.org sls= [994, 995, 996] site= 1997 +3996 1 n2-996.plc2.org sls= [997, 995, 996] site= 1998 +3997 1 n2-997.plc2.org sls= [997, 998, 996] site= 1999 +3998 1 n2-998.plc2.org sls= [997, 998, 999] site= 2000 +3999 1 n2-999.plc2.org sls= [998, 999, 1000] site= 2001 +4000 1 n2-1000.plc2.org sls= [999, 1000, 1001] site= 2002 +4001 1 n2-1001.plc2.org sls= [1000, 1001, 1002] site= 1003 +4002 1 n2-1002.plc2.org sls= [1001, 1002, 1003] site= 1004 +4003 1 n2-1003.plc2.org sls= [1002, 1003, 1004] site= 1005 +4004 1 n2-1004.plc2.org sls= [1005, 1003, 1004] site= 1006 +4005 1 n2-1005.plc2.org sls= [1005, 1006, 1004] site= 1007 +4006 1 n2-1006.plc2.org sls= [1005, 1006, 1007] site= 1008 +4007 1 n2-1007.plc2.org sls= [1006, 1007, 1008] site= 1009 +4008 1 n2-1008.plc2.org sls= [1007, 1008, 1009] site= 1010 +4009 1 n2-1009.plc2.org sls= [1008, 1009, 1010] site= 1011 +4010 1 n2-1010.plc2.org sls= [1009, 1010, 1011] site= 1012 +4011 1 n2-1011.plc2.org sls= [1010, 1011, 1012] site= 1013 +4012 1 n2-1012.plc2.org sls= [1013, 1011, 1012] site= 1014 +4013 1 n2-1013.plc2.org sls= [1013, 1014, 1012] site= 1015 +4014 1 n2-1014.plc2.org sls= [1013, 1014, 1015] site= 1016 +4015 1 n2-1015.plc2.org sls= [1014, 1015, 1016] site= 1017 +4016 1 n2-1016.plc2.org sls= [1015, 1016, 1017] site= 1018 +4017 1 n2-1017.plc2.org sls= [1016, 1017, 1018] site= 1019 +4018 1 n2-1018.plc2.org sls= [1017, 1018, 1019] site= 1020 +4019 1 n2-1019.plc2.org sls= [1018, 1019, 1020] site= 1021 +4020 1 n2-1020.plc2.org sls= [1021, 1019, 1020] site= 1022 +4021 1 n2-1021.plc2.org sls= [1022, 1020, 1021] site= 1023 +4022 1 n2-1022.plc2.org sls= [1023, 1021, 1022] site= 1024 +4023 1 n2-1023.plc2.org sls= [1024, 1022, 1023] site= 1025 +4024 1 n2-1024.plc2.org sls= [1025, 1023, 1024] site= 1026 +4025 1 n2-1025.plc2.org sls= [1026, 1024, 1025] site= 1027 +4026 1 n2-1026.plc2.org sls= [1027, 1025, 1026] site= 1028 +4027 1 n2-1027.plc2.org sls= [1028, 1026, 1027] site= 1029 +4028 1 n2-1028.plc2.org sls= [1029, 1027, 1028] site= 1030 +4029 1 n2-1029.plc2.org sls= [1029, 1030, 1028] site= 1031 +4030 1 n2-1030.plc2.org sls= [1029, 1030, 1031] site= 1032 +4031 1 n2-1031.plc2.org sls= [1030, 1031, 1032] site= 1033 +4032 1 n2-1032.plc2.org sls= [1031, 1032, 1033] site= 1034 +4033 1 n2-1033.plc2.org sls= [1032, 1033, 1034] site= 1035 +4034 1 n2-1034.plc2.org sls= [1033, 1034, 1035] site= 1036 +4035 1 n2-1035.plc2.org sls= [1034, 1035, 1036] site= 1037 +4036 1 n2-1036.plc2.org sls= [1037, 1035, 1036] site= 1038 +4037 1 n2-1037.plc2.org sls= [1037, 1038, 1036] site= 1039 +4038 1 n2-1038.plc2.org sls= [1037, 1038, 1039] site= 1040 +4039 1 n2-1039.plc2.org sls= [1038, 1039, 1040] site= 1041 +4040 1 n2-1040.plc2.org sls= [1039, 1040, 1041] site= 1042 +4041 1 n2-1041.plc2.org sls= [1040, 1041, 1042] site= 1043 +4042 1 n2-1042.plc2.org sls= [1041, 1042, 1043] site= 1044 +4043 1 n2-1043.plc2.org sls= [1042, 1043, 1044] site= 1045 +4044 1 n2-1044.plc2.org sls= [1045, 1043, 1044] site= 1046 +4045 1 n2-1045.plc2.org sls= [1045, 1046, 1044] site= 1047 +4046 1 n2-1046.plc2.org sls= [1045, 1046, 1047] site= 1048 +4047 1 n2-1047.plc2.org sls= [1046, 1047, 1048] site= 1049 +4048 1 n2-1048.plc2.org sls= [1047, 1048, 1049] site= 1050 +4049 1 n2-1049.plc2.org sls= [1048, 1049, 1050] site= 1051 +4050 1 n2-1050.plc2.org sls= [1049, 1050, 1051] site= 1052 +4051 1 n2-1051.plc2.org sls= [1050, 1051, 1052] site= 1053 +4052 1 n2-1052.plc2.org sls= [1053, 1051, 1052] site= 1054 +4053 1 n2-1053.plc2.org sls= [1053, 1054, 1052] site= 1055 +4054 1 n2-1054.plc2.org sls= [1053, 1054, 1055] site= 1056 +4055 1 n2-1055.plc2.org sls= [1054, 1055, 1056] site= 1057 +4056 1 n2-1056.plc2.org sls= [1055, 1056, 1057] site= 1058 +4057 1 n2-1057.plc2.org sls= [1056, 1057, 1058] site= 1059 +4058 1 n2-1058.plc2.org sls= [1057, 1058, 1059] site= 1060 +4059 1 n2-1059.plc2.org sls= [1058, 1059, 1060] site= 1061 +4060 1 n2-1060.plc2.org sls= [1061, 1059, 1060] site= 1062 +4061 1 n2-1061.plc2.org sls= [1061, 1062, 1060] site= 1063 +4062 1 n2-1062.plc2.org sls= [1061, 1062, 1063] site= 1064 +4063 1 n2-1063.plc2.org sls= [1062, 1063, 1064] site= 1065 +4064 1 n2-1064.plc2.org sls= [1063, 1064, 1065] site= 1066 +4065 1 n2-1065.plc2.org sls= [1064, 1065, 1066] site= 1067 +4066 1 n2-1066.plc2.org sls= [1065, 1066, 1067] site= 1068 +4067 1 n2-1067.plc2.org sls= [1066, 1067, 1068] site= 1069 +4068 1 n2-1068.plc2.org sls= [1069, 1067, 1068] site= 1070 +4069 1 n2-1069.plc2.org sls= [1069, 1070, 1068] site= 1071 +4070 1 n2-1070.plc2.org sls= [1069, 1070, 1071] site= 1072 +4071 1 n2-1071.plc2.org sls= [1070, 1071, 1072] site= 1073 +4072 1 n2-1072.plc2.org sls= [1071, 1072, 1073] site= 1074 +4073 1 n2-1073.plc2.org sls= [1072, 1073, 1074] site= 1075 +4074 1 n2-1074.plc2.org sls= [1073, 1074, 1075] site= 1076 +4075 1 n2-1075.plc2.org sls= [1074, 1075, 1076] site= 1077 +4076 1 n2-1076.plc2.org sls= [1077, 1075, 1076] site= 1078 +4077 1 n2-1077.plc2.org sls= [1077, 1078, 1076] site= 1079 +4078 1 n2-1078.plc2.org sls= [1077, 1078, 1079] site= 1080 +4079 1 n2-1079.plc2.org sls= [1078, 1079, 1080] site= 1081 +4080 1 n2-1080.plc2.org sls= [1079, 1080, 1081] site= 1082 +4081 1 n2-1081.plc2.org sls= [1080, 1081, 1082] site= 1083 +4082 1 n2-1082.plc2.org sls= [1081, 1082, 1083] site= 1084 +4083 1 n2-1083.plc2.org sls= [1082, 1083, 1084] site= 1085 +4084 1 n2-1084.plc2.org sls= [1085, 1083, 1084] site= 1086 +4085 1 n2-1085.plc2.org sls= [1085, 1086, 1084] site= 1087 +4086 1 n2-1086.plc2.org sls= [1085, 1086, 1087] site= 1088 +4087 1 n2-1087.plc2.org sls= [1086, 1087, 1088] site= 1089 +4088 1 n2-1088.plc2.org sls= [1087, 1088, 1089] site= 1090 +4089 1 n2-1089.plc2.org sls= [1088, 1089, 1090] site= 1091 +4090 1 n2-1090.plc2.org sls= [1089, 1090, 1091] site= 1092 +4091 1 n2-1091.plc2.org sls= [1090, 1091, 1092] site= 1093 +4092 1 n2-1092.plc2.org sls= [1093, 1091, 1092] site= 1094 +4093 1 n2-1093.plc2.org sls= [1093, 1094, 1092] site= 1095 +4094 1 n2-1094.plc2.org sls= [1093, 1094, 1095] site= 1096 +4095 1 n2-1095.plc2.org sls= [1094, 1095, 1096] site= 1097 +4096 1 n2-1096.plc2.org sls= [1095, 1096, 1097] site= 1098 +4097 1 n2-1097.plc2.org sls= [1096, 1097, 1098] site= 1099 +4098 1 n2-1098.plc2.org sls= [1097, 1098, 1099] site= 1100 +4099 1 n2-1099.plc2.org sls= [1098, 1099, 1100] site= 1101 +4100 1 n2-1100.plc2.org sls= [1101, 1099, 1100] site= 1102 +4101 1 n2-1101.plc2.org sls= [1101, 1102, 1100] site= 1103 +4102 1 n2-1102.plc2.org sls= [1101, 1102, 1103] site= 1104 +4103 1 n2-1103.plc2.org sls= [1102, 1103, 1104] site= 1105 +4104 1 n2-1104.plc2.org sls= [1103, 1104, 1105] site= 1106 +4105 1 n2-1105.plc2.org sls= [1104, 1105, 1106] site= 1107 +4106 1 n2-1106.plc2.org sls= [1105, 1106, 1107] site= 1108 +4107 1 n2-1107.plc2.org sls= [1106, 1107, 1108] site= 1109 +4108 1 n2-1108.plc2.org sls= [1109, 1107, 1108] site= 1110 +4109 1 n2-1109.plc2.org sls= [1109, 1110, 1108] site= 1111 +4110 1 n2-1110.plc2.org sls= [1109, 1110, 1111] site= 1112 +4111 1 n2-1111.plc2.org sls= [1110, 1111, 1112] site= 1113 +4112 1 n2-1112.plc2.org sls= [1111, 1112, 1113] site= 1114 +4113 1 n2-1113.plc2.org sls= [1112, 1113, 1114] site= 1115 +4114 1 n2-1114.plc2.org sls= [1113, 1114, 1115] site= 1116 +4115 1 n2-1115.plc2.org sls= [1114, 1115, 1116] site= 1117 +4116 1 n2-1116.plc2.org sls= [1117, 1115, 1116] site= 1118 +4117 1 n2-1117.plc2.org sls= [1117, 1118, 1116] site= 1119 +4118 1 n2-1118.plc2.org sls= [1117, 1118, 1119] site= 1120 +4119 1 n2-1119.plc2.org sls= [1118, 1119, 1120] site= 1121 +4120 1 n2-1120.plc2.org sls= [1119, 1120, 1121] site= 1122 +4121 1 n2-1121.plc2.org sls= [1120, 1121, 1122] site= 1123 +4122 1 n2-1122.plc2.org sls= [1121, 1122, 1123] site= 1124 +4123 1 n2-1123.plc2.org sls= [1122, 1123, 1124] site= 1125 +4124 1 n2-1124.plc2.org sls= [1125, 1123, 1124] site= 1126 +4125 1 n2-1125.plc2.org sls= [1125, 1126, 1124] site= 1127 +4126 1 n2-1126.plc2.org sls= [1125, 1126, 1127] site= 1128 +4127 1 n2-1127.plc2.org sls= [1126, 1127, 1128] site= 1129 +4128 1 n2-1128.plc2.org sls= [1127, 1128, 1129] site= 1130 +4129 1 n2-1129.plc2.org sls= [1128, 1129, 1130] site= 1131 +4130 1 n2-1130.plc2.org sls= [1129, 1130, 1131] site= 1132 +4131 1 n2-1131.plc2.org sls= [1130, 1131, 1132] site= 1133 +4132 1 n2-1132.plc2.org sls= [1133, 1131, 1132] site= 1134 +4133 1 n2-1133.plc2.org sls= [1133, 1134, 1132] site= 1135 +4134 1 n2-1134.plc2.org sls= [1133, 1134, 1135] site= 1136 +4135 1 n2-1135.plc2.org sls= [1134, 1135, 1136] site= 1137 +4136 1 n2-1136.plc2.org sls= [1135, 1136, 1137] site= 1138 +4137 1 n2-1137.plc2.org sls= [1136, 1137, 1138] site= 1139 +4138 1 n2-1138.plc2.org sls= [1137, 1138, 1139] site= 1140 +4139 1 n2-1139.plc2.org sls= [1138, 1139, 1140] site= 1141 +4140 1 n2-1140.plc2.org sls= [1141, 1139, 1140] site= 1142 +4141 1 n2-1141.plc2.org sls= [1141, 1142, 1140] site= 1143 +4142 1 n2-1142.plc2.org sls= [1141, 1142, 1143] site= 1144 +4143 1 n2-1143.plc2.org sls= [1142, 1143, 1144] site= 1145 +4144 1 n2-1144.plc2.org sls= [1143, 1144, 1145] site= 1146 +4145 1 n2-1145.plc2.org sls= [1144, 1145, 1146] site= 1147 +4146 1 n2-1146.plc2.org sls= [1145, 1146, 1147] site= 1148 +4147 1 n2-1147.plc2.org sls= [1146, 1147, 1148] site= 1149 +4148 1 n2-1148.plc2.org sls= [1149, 1147, 1148] site= 1150 +4149 1 n2-1149.plc2.org sls= [1149, 1150, 1148] site= 1151 +4150 1 n2-1150.plc2.org sls= [1149, 1150, 1151] site= 1152 +4151 1 n2-1151.plc2.org sls= [1150, 1151, 1152] site= 1153 +4152 1 n2-1152.plc2.org sls= [1151, 1152, 1153] site= 1154 +4153 1 n2-1153.plc2.org sls= [1152, 1153, 1154] site= 1155 +4154 1 n2-1154.plc2.org sls= [1153, 1154, 1155] site= 1156 +4155 1 n2-1155.plc2.org sls= [1154, 1155, 1156] site= 1157 +4156 1 n2-1156.plc2.org sls= [1157, 1155, 1156] site= 1158 +4157 1 n2-1157.plc2.org sls= [1157, 1158, 1156] site= 1159 +4158 1 n2-1158.plc2.org sls= [1157, 1158, 1159] site= 1160 +4159 1 n2-1159.plc2.org sls= [1158, 1159, 1160] site= 1161 +4160 1 n2-1160.plc2.org sls= [1159, 1160, 1161] site= 1162 +4161 1 n2-1161.plc2.org sls= [1160, 1161, 1162] site= 1163 +4162 1 n2-1162.plc2.org sls= [1161, 1162, 1163] site= 1164 +4163 1 n2-1163.plc2.org sls= [1162, 1163, 1164] site= 1165 +4164 1 n2-1164.plc2.org sls= [1165, 1163, 1164] site= 1166 +4165 1 n2-1165.plc2.org sls= [1165, 1166, 1164] site= 1167 +4166 1 n2-1166.plc2.org sls= [1165, 1166, 1167] site= 1168 +4167 1 n2-1167.plc2.org sls= [1166, 1167, 1168] site= 1169 +4168 1 n2-1168.plc2.org sls= [1167, 1168, 1169] site= 1170 +4169 1 n2-1169.plc2.org sls= [1168, 1169, 1170] site= 1171 +4170 1 n2-1170.plc2.org sls= [1169, 1170, 1171] site= 1172 +4171 1 n2-1171.plc2.org sls= [1170, 1171, 1172] site= 1173 +4172 1 n2-1172.plc2.org sls= [1173, 1171, 1172] site= 1174 +4173 1 n2-1173.plc2.org sls= [1173, 1174, 1172] site= 1175 +4174 1 n2-1174.plc2.org sls= [1173, 1174, 1175] site= 1176 +4175 1 n2-1175.plc2.org sls= [1174, 1175, 1176] site= 1177 +4176 1 n2-1176.plc2.org sls= [1175, 1176, 1177] site= 1178 +4177 1 n2-1177.plc2.org sls= [1176, 1177, 1178] site= 1179 +4178 1 n2-1178.plc2.org sls= [1177, 1178, 1179] site= 1180 +4179 1 n2-1179.plc2.org sls= [1178, 1179, 1180] site= 1181 +4180 1 n2-1180.plc2.org sls= [1181, 1179, 1180] site= 1182 +4181 1 n2-1181.plc2.org sls= [1181, 1182, 1180] site= 1183 +4182 1 n2-1182.plc2.org sls= [1181, 1182, 1183] site= 1184 +4183 1 n2-1183.plc2.org sls= [1182, 1183, 1184] site= 1185 +4184 1 n2-1184.plc2.org sls= [1183, 1184, 1185] site= 1186 +4185 1 n2-1185.plc2.org sls= [1184, 1185, 1186] site= 1187 +4186 1 n2-1186.plc2.org sls= [1185, 1186, 1187] site= 1188 +4187 1 n2-1187.plc2.org sls= [1186, 1187, 1188] site= 1189 +4188 1 n2-1188.plc2.org sls= [1189, 1187, 1188] site= 1190 +4189 1 n2-1189.plc2.org sls= [1189, 1190, 1188] site= 1191 +4190 1 n2-1190.plc2.org sls= [1189, 1190, 1191] site= 1192 +4191 1 n2-1191.plc2.org sls= [1190, 1191, 1192] site= 1193 +4192 1 n2-1192.plc2.org sls= [1191, 1192, 1193] site= 1194 +4193 1 n2-1193.plc2.org sls= [1192, 1193, 1194] site= 1195 +4194 1 n2-1194.plc2.org sls= [1193, 1194, 1195] site= 1196 +4195 1 n2-1195.plc2.org sls= [1194, 1195, 1196] site= 1197 +4196 1 n2-1196.plc2.org sls= [1197, 1195, 1196] site= 1198 +4197 1 n2-1197.plc2.org sls= [1197, 1198, 1196] site= 1199 +4198 1 n2-1198.plc2.org sls= [1197, 1198, 1199] site= 1200 +4199 1 n2-1199.plc2.org sls= [1198, 1199, 1200] site= 1201 +4200 1 n2-1200.plc2.org sls= [1199, 1200, 1201] site= 1202 +4201 1 n2-1201.plc2.org sls= [1200, 1201, 1202] site= 1203 +4202 1 n2-1202.plc2.org sls= [1201, 1202, 1203] site= 1204 +4203 1 n2-1203.plc2.org sls= [1202, 1203, 1204] site= 1205 +4204 1 n2-1204.plc2.org sls= [1205, 1203, 1204] site= 1206 +4205 1 n2-1205.plc2.org sls= [1205, 1206, 1204] site= 1207 +4206 1 n2-1206.plc2.org sls= [1205, 1206, 1207] site= 1208 +4207 1 n2-1207.plc2.org sls= [1206, 1207, 1208] site= 1209 +4208 1 n2-1208.plc2.org sls= [1207, 1208, 1209] site= 1210 +4209 1 n2-1209.plc2.org sls= [1208, 1209, 1210] site= 1211 +4210 1 n2-1210.plc2.org sls= [1209, 1210, 1211] site= 1212 +4211 1 n2-1211.plc2.org sls= [1210, 1211, 1212] site= 1213 +4212 1 n2-1212.plc2.org sls= [1213, 1211, 1212] site= 1214 +4213 1 n2-1213.plc2.org sls= [1213, 1214, 1212] site= 1215 +4214 1 n2-1214.plc2.org sls= [1213, 1214, 1215] site= 1216 +4215 1 n2-1215.plc2.org sls= [1214, 1215, 1216] site= 1217 +4216 1 n2-1216.plc2.org sls= [1215, 1216, 1217] site= 1218 +4217 1 n2-1217.plc2.org sls= [1216, 1217, 1218] site= 1219 +4218 1 n2-1218.plc2.org sls= [1217, 1218, 1219] site= 1220 +4219 1 n2-1219.plc2.org sls= [1218, 1219, 1220] site= 1221 +4220 1 n2-1220.plc2.org sls= [1221, 1219, 1220] site= 1222 +4221 1 n2-1221.plc2.org sls= [1221, 1222, 1220] site= 1223 +4222 1 n2-1222.plc2.org sls= [1221, 1222, 1223] site= 1224 +4223 1 n2-1223.plc2.org sls= [1222, 1223, 1224] site= 1225 +4224 1 n2-1224.plc2.org sls= [1223, 1224, 1225] site= 1226 +4225 1 n2-1225.plc2.org sls= [1224, 1225, 1226] site= 1227 +4226 1 n2-1226.plc2.org sls= [1225, 1226, 1227] site= 1228 +4227 1 n2-1227.plc2.org sls= [1226, 1227, 1228] site= 1229 +4228 1 n2-1228.plc2.org sls= [1229, 1227, 1228] site= 1230 +4229 1 n2-1229.plc2.org sls= [1229, 1230, 1228] site= 1231 +4230 1 n2-1230.plc2.org sls= [1229, 1230, 1231] site= 1232 +4231 1 n2-1231.plc2.org sls= [1230, 1231, 1232] site= 1233 +4232 1 n2-1232.plc2.org sls= [1231, 1232, 1233] site= 1234 +4233 1 n2-1233.plc2.org sls= [1232, 1233, 1234] site= 1235 +4234 1 n2-1234.plc2.org sls= [1233, 1234, 1235] site= 1236 +4235 1 n2-1235.plc2.org sls= [1234, 1235, 1236] site= 1237 +4236 1 n2-1236.plc2.org sls= [1237, 1235, 1236] site= 1238 +4237 1 n2-1237.plc2.org sls= [1237, 1238, 1236] site= 1239 +4238 1 n2-1238.plc2.org sls= [1237, 1238, 1239] site= 1240 +4239 1 n2-1239.plc2.org sls= [1238, 1239, 1240] site= 1241 +4240 1 n2-1240.plc2.org sls= [1239, 1240, 1241] site= 1242 +4241 1 n2-1241.plc2.org sls= [1240, 1241, 1242] site= 1243 +4242 1 n2-1242.plc2.org sls= [1241, 1242, 1243] site= 1244 +4243 1 n2-1243.plc2.org sls= [1242, 1243, 1244] site= 1245 +4244 1 n2-1244.plc2.org sls= [1245, 1243, 1244] site= 1246 +4245 1 n2-1245.plc2.org sls= [1245, 1246, 1244] site= 1247 +4246 1 n2-1246.plc2.org sls= [1245, 1246, 1247] site= 1248 +4247 1 n2-1247.plc2.org sls= [1246, 1247, 1248] site= 1249 +4248 1 n2-1248.plc2.org sls= [1247, 1248, 1249] site= 1250 +4249 1 n2-1249.plc2.org sls= [1248, 1249, 1250] site= 1251 +4250 1 n2-1250.plc2.org sls= [1249, 1250, 1251] site= 1252 +4251 1 n2-1251.plc2.org sls= [1250, 1251, 1252] site= 1253 +4252 1 n2-1252.plc2.org sls= [1253, 1251, 1252] site= 1254 +4253 1 n2-1253.plc2.org sls= [1253, 1254, 1252] site= 1255 +4254 1 n2-1254.plc2.org sls= [1253, 1254, 1255] site= 1256 +4255 1 n2-1255.plc2.org sls= [1254, 1255, 1256] site= 1257 +4256 1 n2-1256.plc2.org sls= [1255, 1256, 1257] site= 1258 +4257 1 n2-1257.plc2.org sls= [1256, 1257, 1258] site= 1259 +4258 1 n2-1258.plc2.org sls= [1257, 1258, 1259] site= 1260 +4259 1 n2-1259.plc2.org sls= [1258, 1259, 1260] site= 1261 +4260 1 n2-1260.plc2.org sls= [1261, 1259, 1260] site= 1262 +4261 1 n2-1261.plc2.org sls= [1261, 1262, 1260] site= 1263 +4262 1 n2-1262.plc2.org sls= [1261, 1262, 1263] site= 1264 +4263 1 n2-1263.plc2.org sls= [1262, 1263, 1264] site= 1265 +4264 1 n2-1264.plc2.org sls= [1263, 1264, 1265] site= 1266 +4265 1 n2-1265.plc2.org sls= [1264, 1265, 1266] site= 1267 +4266 1 n2-1266.plc2.org sls= [1265, 1266, 1267] site= 1268 +4267 1 n2-1267.plc2.org sls= [1266, 1267, 1268] site= 1269 +4268 1 n2-1268.plc2.org sls= [1269, 1267, 1268] site= 1270 +4269 1 n2-1269.plc2.org sls= [1269, 1270, 1268] site= 1271 +4270 1 n2-1270.plc2.org sls= [1269, 1270, 1271] site= 1272 +4271 1 n2-1271.plc2.org sls= [1270, 1271, 1272] site= 1273 +4272 1 n2-1272.plc2.org sls= [1271, 1272, 1273] site= 1274 +4273 1 n2-1273.plc2.org sls= [1272, 1273, 1274] site= 1275 +4274 1 n2-1274.plc2.org sls= [1273, 1274, 1275] site= 1276 +4275 1 n2-1275.plc2.org sls= [1274, 1275, 1276] site= 1277 +4276 1 n2-1276.plc2.org sls= [1277, 1275, 1276] site= 1278 +4277 1 n2-1277.plc2.org sls= [1277, 1278, 1276] site= 1279 +4278 1 n2-1278.plc2.org sls= [1277, 1278, 1279] site= 1280 +4279 1 n2-1279.plc2.org sls= [1278, 1279, 1280] site= 1281 +4280 1 n2-1280.plc2.org sls= [1279, 1280, 1281] site= 1282 +4281 1 n2-1281.plc2.org sls= [1280, 1281, 1282] site= 1283 +4282 1 n2-1282.plc2.org sls= [1281, 1282, 1283] site= 1284 +4283 1 n2-1283.plc2.org sls= [1282, 1283, 1284] site= 1285 +4284 1 n2-1284.plc2.org sls= [1285, 1283, 1284] site= 1286 +4285 1 n2-1285.plc2.org sls= [1285, 1286, 1284] site= 1287 +4286 1 n2-1286.plc2.org sls= [1285, 1286, 1287] site= 1288 +4287 1 n2-1287.plc2.org sls= [1286, 1287, 1288] site= 1289 +4288 1 n2-1288.plc2.org sls= [1287, 1288, 1289] site= 1290 +4289 1 n2-1289.plc2.org sls= [1288, 1289, 1290] site= 1291 +4290 1 n2-1290.plc2.org sls= [1289, 1290, 1291] site= 1292 +4291 1 n2-1291.plc2.org sls= [1290, 1291, 1292] site= 1293 +4292 1 n2-1292.plc2.org sls= [1293, 1291, 1292] site= 1294 +4293 1 n2-1293.plc2.org sls= [1293, 1294, 1292] site= 1295 +4294 1 n2-1294.plc2.org sls= [1293, 1294, 1295] site= 1296 +4295 1 n2-1295.plc2.org sls= [1294, 1295, 1296] site= 1297 +4296 1 n2-1296.plc2.org sls= [1295, 1296, 1297] site= 1298 +4297 1 n2-1297.plc2.org sls= [1296, 1297, 1298] site= 1299 +4298 1 n2-1298.plc2.org sls= [1297, 1298, 1299] site= 1300 +4299 1 n2-1299.plc2.org sls= [1298, 1299, 1300] site= 1301 +4300 1 n2-1300.plc2.org sls= [1301, 1299, 1300] site= 1302 +4301 1 n2-1301.plc2.org sls= [1301, 1302, 1300] site= 1303 +4302 1 n2-1302.plc2.org sls= [1301, 1302, 1303] site= 1304 +4303 1 n2-1303.plc2.org sls= [1302, 1303, 1304] site= 1305 +4304 1 n2-1304.plc2.org sls= [1303, 1304, 1305] site= 1306 +4305 1 n2-1305.plc2.org sls= [1304, 1305, 1306] site= 1307 +4306 1 n2-1306.plc2.org sls= [1305, 1306, 1307] site= 1308 +4307 1 n2-1307.plc2.org sls= [1306, 1307, 1308] site= 1309 +4308 1 n2-1308.plc2.org sls= [1309, 1307, 1308] site= 1310 +4309 1 n2-1309.plc2.org sls= [1309, 1310, 1308] site= 1311 +4310 1 n2-1310.plc2.org sls= [1309, 1310, 1311] site= 1312 +4311 1 n2-1311.plc2.org sls= [1310, 1311, 1312] site= 1313 +4312 1 n2-1312.plc2.org sls= [1311, 1312, 1313] site= 1314 +4313 1 n2-1313.plc2.org sls= [1312, 1313, 1314] site= 1315 +4314 1 n2-1314.plc2.org sls= [1313, 1314, 1315] site= 1316 +4315 1 n2-1315.plc2.org sls= [1314, 1315, 1316] site= 1317 +4316 1 n2-1316.plc2.org sls= [1317, 1315, 1316] site= 1318 +4317 1 n2-1317.plc2.org sls= [1317, 1318, 1316] site= 1319 +4318 1 n2-1318.plc2.org sls= [1317, 1318, 1319] site= 1320 +4319 1 n2-1319.plc2.org sls= [1318, 1319, 1320] site= 1321 +4320 1 n2-1320.plc2.org sls= [1319, 1320, 1321] site= 1322 +4321 1 n2-1321.plc2.org sls= [1320, 1321, 1322] site= 1323 +4322 1 n2-1322.plc2.org sls= [1321, 1322, 1323] site= 1324 +4323 1 n2-1323.plc2.org sls= [1322, 1323, 1324] site= 1325 +4324 1 n2-1324.plc2.org sls= [1325, 1323, 1324] site= 1326 +4325 1 n2-1325.plc2.org sls= [1325, 1326, 1324] site= 1327 +4326 1 n2-1326.plc2.org sls= [1325, 1326, 1327] site= 1328 +4327 1 n2-1327.plc2.org sls= [1326, 1327, 1328] site= 1329 +4328 1 n2-1328.plc2.org sls= [1327, 1328, 1329] site= 1330 +4329 1 n2-1329.plc2.org sls= [1328, 1329, 1330] site= 1331 +4330 1 n2-1330.plc2.org sls= [1329, 1330, 1331] site= 1332 +4331 1 n2-1331.plc2.org sls= [1330, 1331, 1332] site= 1333 +4332 1 n2-1332.plc2.org sls= [1333, 1331, 1332] site= 1334 +4333 1 n2-1333.plc2.org sls= [1333, 1334, 1332] site= 1335 +4334 1 n2-1334.plc2.org sls= [1333, 1334, 1335] site= 1336 +4335 1 n2-1335.plc2.org sls= [1334, 1335, 1336] site= 1337 +4336 1 n2-1336.plc2.org sls= [1335, 1336, 1337] site= 1338 +4337 1 n2-1337.plc2.org sls= [1336, 1337, 1338] site= 1339 +4338 1 n2-1338.plc2.org sls= [1337, 1338, 1339] site= 1340 +4339 1 n2-1339.plc2.org sls= [1338, 1339, 1340] site= 1341 +4340 1 n2-1340.plc2.org sls= [1341, 1339, 1340] site= 1342 +4341 1 n2-1341.plc2.org sls= [1341, 1342, 1340] site= 1343 +4342 1 n2-1342.plc2.org sls= [1341, 1342, 1343] site= 1344 +4343 1 n2-1343.plc2.org sls= [1342, 1343, 1344] site= 1345 +4344 1 n2-1344.plc2.org sls= [1343, 1344, 1345] site= 1346 +4345 1 n2-1345.plc2.org sls= [1344, 1345, 1346] site= 1347 +4346 1 n2-1346.plc2.org sls= [1345, 1346, 1347] site= 1348 +4347 1 n2-1347.plc2.org sls= [1346, 1347, 1348] site= 1349 +4348 1 n2-1348.plc2.org sls= [1349, 1347, 1348] site= 1350 +4349 1 n2-1349.plc2.org sls= [1349, 1350, 1348] site= 1351 +4350 1 n2-1350.plc2.org sls= [1349, 1350, 1351] site= 1352 +4351 1 n2-1351.plc2.org sls= [1350, 1351, 1352] site= 1353 +4352 1 n2-1352.plc2.org sls= [1351, 1352, 1353] site= 1354 +4353 1 n2-1353.plc2.org sls= [1352, 1353, 1354] site= 1355 +4354 1 n2-1354.plc2.org sls= [1353, 1354, 1355] site= 1356 +4355 1 n2-1355.plc2.org sls= [1354, 1355, 1356] site= 1357 +4356 1 n2-1356.plc2.org sls= [1357, 1355, 1356] site= 1358 +4357 1 n2-1357.plc2.org sls= [1357, 1358, 1356] site= 1359 +4358 1 n2-1358.plc2.org sls= [1357, 1358, 1359] site= 1360 +4359 1 n2-1359.plc2.org sls= [1358, 1359, 1360] site= 1361 +4360 1 n2-1360.plc2.org sls= [1359, 1360, 1361] site= 1362 +4361 1 n2-1361.plc2.org sls= [1360, 1361, 1362] site= 1363 +4362 1 n2-1362.plc2.org sls= [1361, 1362, 1363] site= 1364 +4363 1 n2-1363.plc2.org sls= [1362, 1363, 1364] site= 1365 +4364 1 n2-1364.plc2.org sls= [1365, 1363, 1364] site= 1366 +4365 1 n2-1365.plc2.org sls= [1365, 1366, 1364] site= 1367 +4366 1 n2-1366.plc2.org sls= [1365, 1366, 1367] site= 1368 +4367 1 n2-1367.plc2.org sls= [1366, 1367, 1368] site= 1369 +4368 1 n2-1368.plc2.org sls= [1367, 1368, 1369] site= 1370 +4369 1 n2-1369.plc2.org sls= [1368, 1369, 1370] site= 1371 +4370 1 n2-1370.plc2.org sls= [1369, 1370, 1371] site= 1372 +4371 1 n2-1371.plc2.org sls= [1370, 1371, 1372] site= 1373 +4372 1 n2-1372.plc2.org sls= [1373, 1371, 1372] site= 1374 +4373 1 n2-1373.plc2.org sls= [1373, 1374, 1372] site= 1375 +4374 1 n2-1374.plc2.org sls= [1373, 1374, 1375] site= 1376 +4375 1 n2-1375.plc2.org sls= [1374, 1375, 1376] site= 1377 +4376 1 n2-1376.plc2.org sls= [1375, 1376, 1377] site= 1378 +4377 1 n2-1377.plc2.org sls= [1376, 1377, 1378] site= 1379 +4378 1 n2-1378.plc2.org sls= [1377, 1378, 1379] site= 1380 +4379 1 n2-1379.plc2.org sls= [1378, 1379, 1380] site= 1381 +4380 1 n2-1380.plc2.org sls= [1381, 1379, 1380] site= 1382 +4381 1 n2-1381.plc2.org sls= [1381, 1382, 1380] site= 1383 +4382 1 n2-1382.plc2.org sls= [1381, 1382, 1383] site= 1384 +4383 1 n2-1383.plc2.org sls= [1382, 1383, 1384] site= 1385 +4384 1 n2-1384.plc2.org sls= [1383, 1384, 1385] site= 1386 +4385 1 n2-1385.plc2.org sls= [1384, 1385, 1386] site= 1387 +4386 1 n2-1386.plc2.org sls= [1385, 1386, 1387] site= 1388 +4387 1 n2-1387.plc2.org sls= [1386, 1387, 1388] site= 1389 +4388 1 n2-1388.plc2.org sls= [1389, 1387, 1388] site= 1390 +4389 1 n2-1389.plc2.org sls= [1389, 1390, 1388] site= 1391 +4390 1 n2-1390.plc2.org sls= [1389, 1390, 1391] site= 1392 +4391 1 n2-1391.plc2.org sls= [1390, 1391, 1392] site= 1393 +4392 1 n2-1392.plc2.org sls= [1391, 1392, 1393] site= 1394 +4393 1 n2-1393.plc2.org sls= [1392, 1393, 1394] site= 1395 +4394 1 n2-1394.plc2.org sls= [1393, 1394, 1395] site= 1396 +4395 1 n2-1395.plc2.org sls= [1394, 1395, 1396] site= 1397 +4396 1 n2-1396.plc2.org sls= [1397, 1395, 1396] site= 1398 +4397 1 n2-1397.plc2.org sls= [1397, 1398, 1396] site= 1399 +4398 1 n2-1398.plc2.org sls= [1397, 1398, 1399] site= 1400 +4399 1 n2-1399.plc2.org sls= [1398, 1399, 1400] site= 1401 +4400 1 n2-1400.plc2.org sls= [1399, 1400, 1401] site= 1402 +4401 1 n2-1401.plc2.org sls= [1400, 1401, 1402] site= 1403 +4402 1 n2-1402.plc2.org sls= [1401, 1402, 1403] site= 1404 +4403 1 n2-1403.plc2.org sls= [1402, 1403, 1404] site= 1405 +4404 1 n2-1404.plc2.org sls= [1405, 1403, 1404] site= 1406 +4405 1 n2-1405.plc2.org sls= [1405, 1406, 1404] site= 1407 +4406 1 n2-1406.plc2.org sls= [1405, 1406, 1407] site= 1408 +4407 1 n2-1407.plc2.org sls= [1406, 1407, 1408] site= 1409 +4408 1 n2-1408.plc2.org sls= [1407, 1408, 1409] site= 1410 +4409 1 n2-1409.plc2.org sls= [1408, 1409, 1410] site= 1411 +4410 1 n2-1410.plc2.org sls= [1409, 1410, 1411] site= 1412 +4411 1 n2-1411.plc2.org sls= [1410, 1411, 1412] site= 1413 +4412 1 n2-1412.plc2.org sls= [1413, 1411, 1412] site= 1414 +4413 1 n2-1413.plc2.org sls= [1413, 1414, 1412] site= 1415 +4414 1 n2-1414.plc2.org sls= [1413, 1414, 1415] site= 1416 +4415 1 n2-1415.plc2.org sls= [1414, 1415, 1416] site= 1417 +4416 1 n2-1416.plc2.org sls= [1415, 1416, 1417] site= 1418 +4417 1 n2-1417.plc2.org sls= [1416, 1417, 1418] site= 1419 +4418 1 n2-1418.plc2.org sls= [1417, 1418, 1419] site= 1420 +4419 1 n2-1419.plc2.org sls= [1418, 1419, 1420] site= 1421 +4420 1 n2-1420.plc2.org sls= [1421, 1419, 1420] site= 1422 +4421 1 n2-1421.plc2.org sls= [1421, 1422, 1420] site= 1423 +4422 1 n2-1422.plc2.org sls= [1421, 1422, 1423] site= 1424 +4423 1 n2-1423.plc2.org sls= [1422, 1423, 1424] site= 1425 +4424 1 n2-1424.plc2.org sls= [1423, 1424, 1425] site= 1426 +4425 1 n2-1425.plc2.org sls= [1424, 1425, 1426] site= 1427 +4426 1 n2-1426.plc2.org sls= [1425, 1426, 1427] site= 1428 +4427 1 n2-1427.plc2.org sls= [1426, 1427, 1428] site= 1429 +4428 1 n2-1428.plc2.org sls= [1429, 1427, 1428] site= 1430 +4429 1 n2-1429.plc2.org sls= [1429, 1430, 1428] site= 1431 +4430 1 n2-1430.plc2.org sls= [1429, 1430, 1431] site= 1432 +4431 1 n2-1431.plc2.org sls= [1430, 1431, 1432] site= 1433 +4432 1 n2-1432.plc2.org sls= [1431, 1432, 1433] site= 1434 +4433 1 n2-1433.plc2.org sls= [1432, 1433, 1434] site= 1435 +4434 1 n2-1434.plc2.org sls= [1433, 1434, 1435] site= 1436 +4435 1 n2-1435.plc2.org sls= [1434, 1435, 1436] site= 1437 +4436 1 n2-1436.plc2.org sls= [1437, 1435, 1436] site= 1438 +4437 1 n2-1437.plc2.org sls= [1437, 1438, 1436] site= 1439 +4438 1 n2-1438.plc2.org sls= [1437, 1438, 1439] site= 1440 +4439 1 n2-1439.plc2.org sls= [1438, 1439, 1440] site= 1441 +4440 1 n2-1440.plc2.org sls= [1439, 1440, 1441] site= 1442 +4441 1 n2-1441.plc2.org sls= [1440, 1441, 1442] site= 1443 +4442 1 n2-1442.plc2.org sls= [1441, 1442, 1443] site= 1444 +4443 1 n2-1443.plc2.org sls= [1442, 1443, 1444] site= 1445 +4444 1 n2-1444.plc2.org sls= [1445, 1443, 1444] site= 1446 +4445 1 n2-1445.plc2.org sls= [1445, 1446, 1444] site= 1447 +4446 1 n2-1446.plc2.org sls= [1445, 1446, 1447] site= 1448 +4447 1 n2-1447.plc2.org sls= [1446, 1447, 1448] site= 1449 +4448 1 n2-1448.plc2.org sls= [1447, 1448, 1449] site= 1450 +4449 1 n2-1449.plc2.org sls= [1448, 1449, 1450] site= 1451 +4450 1 n2-1450.plc2.org sls= [1449, 1450, 1451] site= 1452 +4451 1 n2-1451.plc2.org sls= [1450, 1451, 1452] site= 1453 +4452 1 n2-1452.plc2.org sls= [1453, 1451, 1452] site= 1454 +4453 1 n2-1453.plc2.org sls= [1453, 1454, 1452] site= 1455 +4454 1 n2-1454.plc2.org sls= [1453, 1454, 1455] site= 1456 +4455 1 n2-1455.plc2.org sls= [1454, 1455, 1456] site= 1457 +4456 1 n2-1456.plc2.org sls= [1455, 1456, 1457] site= 1458 +4457 1 n2-1457.plc2.org sls= [1456, 1457, 1458] site= 1459 +4458 1 n2-1458.plc2.org sls= [1457, 1458, 1459] site= 1460 +4459 1 n2-1459.plc2.org sls= [1458, 1459, 1460] site= 1461 +4460 1 n2-1460.plc2.org sls= [1461, 1459, 1460] site= 1462 +4461 1 n2-1461.plc2.org sls= [1461, 1462, 1460] site= 1463 +4462 1 n2-1462.plc2.org sls= [1461, 1462, 1463] site= 1464 +4463 1 n2-1463.plc2.org sls= [1462, 1463, 1464] site= 1465 +4464 1 n2-1464.plc2.org sls= [1463, 1464, 1465] site= 1466 +4465 1 n2-1465.plc2.org sls= [1464, 1465, 1466] site= 1467 +4466 1 n2-1466.plc2.org sls= [1465, 1466, 1467] site= 1468 +4467 1 n2-1467.plc2.org sls= [1466, 1467, 1468] site= 1469 +4468 1 n2-1468.plc2.org sls= [1469, 1467, 1468] site= 1470 +4469 1 n2-1469.plc2.org sls= [1469, 1470, 1468] site= 1471 +4470 1 n2-1470.plc2.org sls= [1469, 1470, 1471] site= 1472 +4471 1 n2-1471.plc2.org sls= [1470, 1471, 1472] site= 1473 +4472 1 n2-1472.plc2.org sls= [1471, 1472, 1473] site= 1474 +4473 1 n2-1473.plc2.org sls= [1472, 1473, 1474] site= 1475 +4474 1 n2-1474.plc2.org sls= [1473, 1474, 1475] site= 1476 +4475 1 n2-1475.plc2.org sls= [1474, 1475, 1476] site= 1477 +4476 1 n2-1476.plc2.org sls= [1477, 1475, 1476] site= 1478 +4477 1 n2-1477.plc2.org sls= [1477, 1478, 1476] site= 1479 +4478 1 n2-1478.plc2.org sls= [1477, 1478, 1479] site= 1480 +4479 1 n2-1479.plc2.org sls= [1478, 1479, 1480] site= 1481 +4480 1 n2-1480.plc2.org sls= [1479, 1480, 1481] site= 1482 +4481 1 n2-1481.plc2.org sls= [1480, 1481, 1482] site= 1483 +4482 1 n2-1482.plc2.org sls= [1481, 1482, 1483] site= 1484 +4483 1 n2-1483.plc2.org sls= [1482, 1483, 1484] site= 1485 +4484 1 n2-1484.plc2.org sls= [1485, 1483, 1484] site= 1486 +4485 1 n2-1485.plc2.org sls= [1485, 1486, 1484] site= 1487 +4486 1 n2-1486.plc2.org sls= [1485, 1486, 1487] site= 1488 +4487 1 n2-1487.plc2.org sls= [1486, 1487, 1488] site= 1489 +4488 1 n2-1488.plc2.org sls= [1487, 1488, 1489] site= 1490 +4489 1 n2-1489.plc2.org sls= [1488, 1489, 1490] site= 1491 +4490 1 n2-1490.plc2.org sls= [1489, 1490, 1491] site= 1492 +4491 1 n2-1491.plc2.org sls= [1490, 1491, 1492] site= 1493 +4492 1 n2-1492.plc2.org sls= [1493, 1491, 1492] site= 1494 +4493 1 n2-1493.plc2.org sls= [1493, 1494, 1492] site= 1495 +4494 1 n2-1494.plc2.org sls= [1493, 1494, 1495] site= 1496 +4495 1 n2-1495.plc2.org sls= [1494, 1495, 1496] site= 1497 +4496 1 n2-1496.plc2.org sls= [1495, 1496, 1497] site= 1498 +4497 1 n2-1497.plc2.org sls= [1496, 1497, 1498] site= 1499 +4498 1 n2-1498.plc2.org sls= [1497, 1498, 1499] site= 1500 +4499 1 n2-1499.plc2.org sls= [1498, 1499, 1500] site= 1501 +4500 1 n2-1500.plc2.org sls= [1501, 1499, 1500] site= 1502 +4501 1 n2-1501.plc2.org sls= [1501, 1502, 1500] site= 1503 +4502 1 n2-1502.plc2.org sls= [1501, 1502, 1503] site= 1504 +4503 1 n2-1503.plc2.org sls= [1502, 1503, 1504] site= 1505 +4504 1 n2-1504.plc2.org sls= [1503, 1504, 1505] site= 1506 +4505 1 n2-1505.plc2.org sls= [1504, 1505, 1506] site= 1507 +4506 1 n2-1506.plc2.org sls= [1505, 1506, 1507] site= 1508 +4507 1 n2-1507.plc2.org sls= [1506, 1507, 1508] site= 1509 +4508 1 n2-1508.plc2.org sls= [1509, 1507, 1508] site= 1510 +4509 1 n2-1509.plc2.org sls= [1509, 1510, 1508] site= 1511 +4510 1 n2-1510.plc2.org sls= [1509, 1510, 1511] site= 1512 +4511 1 n2-1511.plc2.org sls= [1510, 1511, 1512] site= 1513 +4512 1 n2-1512.plc2.org sls= [1511, 1512, 1513] site= 1514 +4513 1 n2-1513.plc2.org sls= [1512, 1513, 1514] site= 1515 +4514 1 n2-1514.plc2.org sls= [1513, 1514, 1515] site= 1516 +4515 1 n2-1515.plc2.org sls= [1514, 1515, 1516] site= 1517 +4516 1 n2-1516.plc2.org sls= [1515, 1516, 1517] site= 1518 +4517 1 n2-1517.plc2.org sls= [1516, 1517, 1518] site= 1519 +4518 1 n2-1518.plc2.org sls= [1517, 1518, 1519] site= 1520 +4519 1 n2-1519.plc2.org sls= [1518, 1519, 1520] site= 1521 +4520 1 n2-1520.plc2.org sls= [1519, 1520, 1521] site= 1522 +4521 1 n2-1521.plc2.org sls= [1520, 1521, 1522] site= 1523 +4522 1 n2-1522.plc2.org sls= [1521, 1522, 1523] site= 1524 +4523 1 n2-1523.plc2.org sls= [1522, 1523, 1524] site= 1525 +4524 1 n2-1524.plc2.org sls= [1525, 1523, 1524] site= 1526 +4525 1 n2-1525.plc2.org sls= [1525, 1526, 1524] site= 1527 +4526 1 n2-1526.plc2.org sls= [1525, 1526, 1527] site= 1528 +4527 1 n2-1527.plc2.org sls= [1526, 1527, 1528] site= 1529 +4528 1 n2-1528.plc2.org sls= [1527, 1528, 1529] site= 1530 +4529 1 n2-1529.plc2.org sls= [1528, 1529, 1530] site= 1531 +4530 1 n2-1530.plc2.org sls= [1529, 1530, 1531] site= 1532 +4531 1 n2-1531.plc2.org sls= [1530, 1531, 1532] site= 1533 +4532 1 n2-1532.plc2.org sls= [1533, 1531, 1532] site= 1534 +4533 1 n2-1533.plc2.org sls= [1533, 1534, 1532] site= 1535 +4534 1 n2-1534.plc2.org sls= [1533, 1534, 1535] site= 1536 +4535 1 n2-1535.plc2.org sls= [1534, 1535, 1536] site= 1537 +4536 1 n2-1536.plc2.org sls= [1535, 1536, 1537] site= 1538 +4537 1 n2-1537.plc2.org sls= [1536, 1537, 1538] site= 1539 +4538 1 n2-1538.plc2.org sls= [1537, 1538, 1539] site= 1540 +4539 1 n2-1539.plc2.org sls= [1538, 1539, 1540] site= 1541 +4540 1 n2-1540.plc2.org sls= [1541, 1539, 1540] site= 1542 +4541 1 n2-1541.plc2.org sls= [1541, 1542, 1540] site= 1543 +4542 1 n2-1542.plc2.org sls= [1541, 1542, 1543] site= 1544 +4543 1 n2-1543.plc2.org sls= [1542, 1543, 1544] site= 1545 +4544 1 n2-1544.plc2.org sls= [1543, 1544, 1545] site= 1546 +4545 1 n2-1545.plc2.org sls= [1544, 1545, 1546] site= 1547 +4546 1 n2-1546.plc2.org sls= [1545, 1546, 1547] site= 1548 +4547 1 n2-1547.plc2.org sls= [1546, 1547, 1548] site= 1549 +4548 1 n2-1548.plc2.org sls= [1549, 1547, 1548] site= 1550 +4549 1 n2-1549.plc2.org sls= [1549, 1550, 1548] site= 1551 +4550 1 n2-1550.plc2.org sls= [1549, 1550, 1551] site= 1552 +4551 1 n2-1551.plc2.org sls= [1550, 1551, 1552] site= 1553 +4552 1 n2-1552.plc2.org sls= [1551, 1552, 1553] site= 1554 +4553 1 n2-1553.plc2.org sls= [1552, 1553, 1554] site= 1555 +4554 1 n2-1554.plc2.org sls= [1553, 1554, 1555] site= 1556 +4555 1 n2-1555.plc2.org sls= [1554, 1555, 1556] site= 1557 +4556 1 n2-1556.plc2.org sls= [1557, 1555, 1556] site= 1558 +4557 1 n2-1557.plc2.org sls= [1557, 1558, 1556] site= 1559 +4558 1 n2-1558.plc2.org sls= [1557, 1558, 1559] site= 1560 +4559 1 n2-1559.plc2.org sls= [1558, 1559, 1560] site= 1561 +4560 1 n2-1560.plc2.org sls= [1559, 1560, 1561] site= 1562 +4561 1 n2-1561.plc2.org sls= [1560, 1561, 1562] site= 1563 +4562 1 n2-1562.plc2.org sls= [1561, 1562, 1563] site= 1564 +4563 1 n2-1563.plc2.org sls= [1562, 1563, 1564] site= 1565 +4564 1 n2-1564.plc2.org sls= [1565, 1563, 1564] site= 1566 +4565 1 n2-1565.plc2.org sls= [1565, 1566, 1564] site= 1567 +4566 1 n2-1566.plc2.org sls= [1565, 1566, 1567] site= 1568 +4567 1 n2-1567.plc2.org sls= [1566, 1567, 1568] site= 1569 +4568 1 n2-1568.plc2.org sls= [1567, 1568, 1569] site= 1570 +4569 1 n2-1569.plc2.org sls= [1568, 1569, 1570] site= 1571 +4570 1 n2-1570.plc2.org sls= [1569, 1570, 1571] site= 1572 +4571 1 n2-1571.plc2.org sls= [1570, 1571, 1572] site= 1573 +4572 1 n2-1572.plc2.org sls= [1573, 1571, 1572] site= 1574 +4573 1 n2-1573.plc2.org sls= [1573, 1574, 1572] site= 1575 +4574 1 n2-1574.plc2.org sls= [1573, 1574, 1575] site= 1576 +4575 1 n2-1575.plc2.org sls= [1574, 1575, 1576] site= 1577 +4576 1 n2-1576.plc2.org sls= [1575, 1576, 1577] site= 1578 +4577 1 n2-1577.plc2.org sls= [1576, 1577, 1578] site= 1579 +4578 1 n2-1578.plc2.org sls= [1577, 1578, 1579] site= 1580 +4579 1 n2-1579.plc2.org sls= [1578, 1579, 1580] site= 1581 +4580 1 n2-1580.plc2.org sls= [1581, 1579, 1580] site= 1582 +4581 1 n2-1581.plc2.org sls= [1581, 1582, 1580] site= 1583 +4582 1 n2-1582.plc2.org sls= [1581, 1582, 1583] site= 1584 +4583 1 n2-1583.plc2.org sls= [1582, 1583, 1584] site= 1585 +4584 1 n2-1584.plc2.org sls= [1583, 1584, 1585] site= 1586 +4585 1 n2-1585.plc2.org sls= [1584, 1585, 1586] site= 1587 +4586 1 n2-1586.plc2.org sls= [1585, 1586, 1587] site= 1588 +4587 1 n2-1587.plc2.org sls= [1586, 1587, 1588] site= 1589 +4588 1 n2-1588.plc2.org sls= [1589, 1587, 1588] site= 1590 +4589 1 n2-1589.plc2.org sls= [1589, 1590, 1588] site= 1591 +4590 1 n2-1590.plc2.org sls= [1589, 1590, 1591] site= 1592 +4591 1 n2-1591.plc2.org sls= [1590, 1591, 1592] site= 1593 +4592 1 n2-1592.plc2.org sls= [1591, 1592, 1593] site= 1594 +4593 1 n2-1593.plc2.org sls= [1592, 1593, 1594] site= 1595 +4594 1 n2-1594.plc2.org sls= [1593, 1594, 1595] site= 1596 +4595 1 n2-1595.plc2.org sls= [1594, 1595, 1596] site= 1597 +4596 1 n2-1596.plc2.org sls= [1597, 1595, 1596] site= 1598 +4597 1 n2-1597.plc2.org sls= [1597, 1598, 1596] site= 1599 +4598 1 n2-1598.plc2.org sls= [1597, 1598, 1599] site= 1600 +4599 1 n2-1599.plc2.org sls= [1598, 1599, 1600] site= 1601 +4600 1 n2-1600.plc2.org sls= [1599, 1600, 1601] site= 1602 +4601 1 n2-1601.plc2.org sls= [1600, 1601, 1602] site= 1603 +4602 1 n2-1602.plc2.org sls= [1601, 1602, 1603] site= 1604 +4603 1 n2-1603.plc2.org sls= [1602, 1603, 1604] site= 1605 +4604 1 n2-1604.plc2.org sls= [1605, 1603, 1604] site= 1606 +4605 1 n2-1605.plc2.org sls= [1605, 1606, 1604] site= 1607 +4606 1 n2-1606.plc2.org sls= [1605, 1606, 1607] site= 1608 +4607 1 n2-1607.plc2.org sls= [1606, 1607, 1608] site= 1609 +4608 1 n2-1608.plc2.org sls= [1607, 1608, 1609] site= 1610 +4609 1 n2-1609.plc2.org sls= [1608, 1609, 1610] site= 1611 +4610 1 n2-1610.plc2.org sls= [1609, 1610, 1611] site= 1612 +4611 1 n2-1611.plc2.org sls= [1610, 1611, 1612] site= 1613 +4612 1 n2-1612.plc2.org sls= [1613, 1611, 1612] site= 1614 +4613 1 n2-1613.plc2.org sls= [1613, 1614, 1612] site= 1615 +4614 1 n2-1614.plc2.org sls= [1613, 1614, 1615] site= 1616 +4615 1 n2-1615.plc2.org sls= [1614, 1615, 1616] site= 1617 +4616 1 n2-1616.plc2.org sls= [1615, 1616, 1617] site= 1618 +4617 1 n2-1617.plc2.org sls= [1616, 1617, 1618] site= 1619 +4618 1 n2-1618.plc2.org sls= [1617, 1618, 1619] site= 1620 +4619 1 n2-1619.plc2.org sls= [1618, 1619, 1620] site= 1621 +4620 1 n2-1620.plc2.org sls= [1621, 1619, 1620] site= 1622 +4621 1 n2-1621.plc2.org sls= [1621, 1622, 1620] site= 1623 +4622 1 n2-1622.plc2.org sls= [1621, 1622, 1623] site= 1624 +4623 1 n2-1623.plc2.org sls= [1622, 1623, 1624] site= 1625 +4624 1 n2-1624.plc2.org sls= [1623, 1624, 1625] site= 1626 +4625 1 n2-1625.plc2.org sls= [1624, 1625, 1626] site= 1627 +4626 1 n2-1626.plc2.org sls= [1625, 1626, 1627] site= 1628 +4627 1 n2-1627.plc2.org sls= [1626, 1627, 1628] site= 1629 +4628 1 n2-1628.plc2.org sls= [1629, 1627, 1628] site= 1630 +4629 1 n2-1629.plc2.org sls= [1629, 1630, 1628] site= 1631 +4630 1 n2-1630.plc2.org sls= [1629, 1630, 1631] site= 1632 +4631 1 n2-1631.plc2.org sls= [1630, 1631, 1632] site= 1633 +4632 1 n2-1632.plc2.org sls= [1631, 1632, 1633] site= 1634 +4633 1 n2-1633.plc2.org sls= [1632, 1633, 1634] site= 1635 +4634 1 n2-1634.plc2.org sls= [1633, 1634, 1635] site= 1636 +4635 1 n2-1635.plc2.org sls= [1634, 1635, 1636] site= 1637 +4636 1 n2-1636.plc2.org sls= [1637, 1635, 1636] site= 1638 +4637 1 n2-1637.plc2.org sls= [1637, 1638, 1636] site= 1639 +4638 1 n2-1638.plc2.org sls= [1637, 1638, 1639] site= 1640 +4639 1 n2-1639.plc2.org sls= [1638, 1639, 1640] site= 1641 +4640 1 n2-1640.plc2.org sls= [1639, 1640, 1641] site= 1642 +4641 1 n2-1641.plc2.org sls= [1640, 1641, 1642] site= 1643 +4642 1 n2-1642.plc2.org sls= [1641, 1642, 1643] site= 1644 +4643 1 n2-1643.plc2.org sls= [1642, 1643, 1644] site= 1645 +4644 1 n2-1644.plc2.org sls= [1645, 1643, 1644] site= 1646 +4645 1 n2-1645.plc2.org sls= [1645, 1646, 1644] site= 1647 +4646 1 n2-1646.plc2.org sls= [1645, 1646, 1647] site= 1648 +4647 1 n2-1647.plc2.org sls= [1646, 1647, 1648] site= 1649 +4648 1 n2-1648.plc2.org sls= [1647, 1648, 1649] site= 1650 +4649 1 n2-1649.plc2.org sls= [1648, 1649, 1650] site= 1651 +4650 1 n2-1650.plc2.org sls= [1649, 1650, 1651] site= 1652 +4651 1 n2-1651.plc2.org sls= [1650, 1651, 1652] site= 1653 +4652 1 n2-1652.plc2.org sls= [1653, 1651, 1652] site= 1654 +4653 1 n2-1653.plc2.org sls= [1653, 1654, 1652] site= 1655 +4654 1 n2-1654.plc2.org sls= [1653, 1654, 1655] site= 1656 +4655 1 n2-1655.plc2.org sls= [1654, 1655, 1656] site= 1657 +4656 1 n2-1656.plc2.org sls= [1655, 1656, 1657] site= 1658 +4657 1 n2-1657.plc2.org sls= [1656, 1657, 1658] site= 1659 +4658 1 n2-1658.plc2.org sls= [1657, 1658, 1659] site= 1660 +4659 1 n2-1659.plc2.org sls= [1658, 1659, 1660] site= 1661 +4660 1 n2-1660.plc2.org sls= [1661, 1659, 1660] site= 1662 +4661 1 n2-1661.plc2.org sls= [1661, 1662, 1660] site= 1663 +4662 1 n2-1662.plc2.org sls= [1661, 1662, 1663] site= 1664 +4663 1 n2-1663.plc2.org sls= [1662, 1663, 1664] site= 1665 +4664 1 n2-1664.plc2.org sls= [1663, 1664, 1665] site= 1666 +4665 1 n2-1665.plc2.org sls= [1664, 1665, 1666] site= 1667 +4666 1 n2-1666.plc2.org sls= [1665, 1666, 1667] site= 1668 +4667 1 n2-1667.plc2.org sls= [1666, 1667, 1668] site= 1669 +4668 1 n2-1668.plc2.org sls= [1669, 1667, 1668] site= 1670 +4669 1 n2-1669.plc2.org sls= [1669, 1670, 1668] site= 1671 +4670 1 n2-1670.plc2.org sls= [1669, 1670, 1671] site= 1672 +4671 1 n2-1671.plc2.org sls= [1670, 1671, 1672] site= 1673 +4672 1 n2-1672.plc2.org sls= [1671, 1672, 1673] site= 1674 +4673 1 n2-1673.plc2.org sls= [1672, 1673, 1674] site= 1675 +4674 1 n2-1674.plc2.org sls= [1673, 1674, 1675] site= 1676 +4675 1 n2-1675.plc2.org sls= [1674, 1675, 1676] site= 1677 +4676 1 n2-1676.plc2.org sls= [1677, 1675, 1676] site= 1678 +4677 1 n2-1677.plc2.org sls= [1677, 1678, 1676] site= 1679 +4678 1 n2-1678.plc2.org sls= [1677, 1678, 1679] site= 1680 +4679 1 n2-1679.plc2.org sls= [1678, 1679, 1680] site= 1681 +4680 1 n2-1680.plc2.org sls= [1679, 1680, 1681] site= 1682 +4681 1 n2-1681.plc2.org sls= [1680, 1681, 1682] site= 1683 +4682 1 n2-1682.plc2.org sls= [1681, 1682, 1683] site= 1684 +4683 1 n2-1683.plc2.org sls= [1682, 1683, 1684] site= 1685 +4684 1 n2-1684.plc2.org sls= [1685, 1683, 1684] site= 1686 +4685 1 n2-1685.plc2.org sls= [1685, 1686, 1684] site= 1687 +4686 1 n2-1686.plc2.org sls= [1685, 1686, 1687] site= 1688 +4687 1 n2-1687.plc2.org sls= [1686, 1687, 1688] site= 1689 +4688 1 n2-1688.plc2.org sls= [1687, 1688, 1689] site= 1690 +4689 1 n2-1689.plc2.org sls= [1688, 1689, 1690] site= 1691 +4690 1 n2-1690.plc2.org sls= [1689, 1690, 1691] site= 1692 +4691 1 n2-1691.plc2.org sls= [1690, 1691, 1692] site= 1693 +4692 1 n2-1692.plc2.org sls= [1693, 1691, 1692] site= 1694 +4693 1 n2-1693.plc2.org sls= [1693, 1694, 1692] site= 1695 +4694 1 n2-1694.plc2.org sls= [1693, 1694, 1695] site= 1696 +4695 1 n2-1695.plc2.org sls= [1694, 1695, 1696] site= 1697 +4696 1 n2-1696.plc2.org sls= [1695, 1696, 1697] site= 1698 +4697 1 n2-1697.plc2.org sls= [1696, 1697, 1698] site= 1699 +4698 1 n2-1698.plc2.org sls= [1697, 1698, 1699] site= 1700 +4699 1 n2-1699.plc2.org sls= [1698, 1699, 1700] site= 1701 +4700 1 n2-1700.plc2.org sls= [1701, 1699, 1700] site= 1702 +4701 1 n2-1701.plc2.org sls= [1701, 1702, 1700] site= 1703 +4702 1 n2-1702.plc2.org sls= [1701, 1702, 1703] site= 1704 +4703 1 n2-1703.plc2.org sls= [1702, 1703, 1704] site= 1705 +4704 1 n2-1704.plc2.org sls= [1703, 1704, 1705] site= 1706 +4705 1 n2-1705.plc2.org sls= [1704, 1705, 1706] site= 1707 +4706 1 n2-1706.plc2.org sls= [1705, 1706, 1707] site= 1708 +4707 1 n2-1707.plc2.org sls= [1706, 1707, 1708] site= 1709 +4708 1 n2-1708.plc2.org sls= [1709, 1707, 1708] site= 1710 +4709 1 n2-1709.plc2.org sls= [1709, 1710, 1708] site= 1711 +4710 1 n2-1710.plc2.org sls= [1709, 1710, 1711] site= 1712 +4711 1 n2-1711.plc2.org sls= [1710, 1711, 1712] site= 1713 +4712 1 n2-1712.plc2.org sls= [1711, 1712, 1713] site= 1714 +4713 1 n2-1713.plc2.org sls= [1712, 1713, 1714] site= 1715 +4714 1 n2-1714.plc2.org sls= [1713, 1714, 1715] site= 1716 +4715 1 n2-1715.plc2.org sls= [1714, 1715, 1716] site= 1717 +4716 1 n2-1716.plc2.org sls= [1717, 1715, 1716] site= 1718 +4717 1 n2-1717.plc2.org sls= [1717, 1718, 1716] site= 1719 +4718 1 n2-1718.plc2.org sls= [1717, 1718, 1719] site= 1720 +4719 1 n2-1719.plc2.org sls= [1718, 1719, 1720] site= 1721 +4720 1 n2-1720.plc2.org sls= [1719, 1720, 1721] site= 1722 +4721 1 n2-1721.plc2.org sls= [1720, 1721, 1722] site= 1723 +4722 1 n2-1722.plc2.org sls= [1721, 1722, 1723] site= 1724 +4723 1 n2-1723.plc2.org sls= [1722, 1723, 1724] site= 1725 +4724 1 n2-1724.plc2.org sls= [1725, 1723, 1724] site= 1726 +4725 1 n2-1725.plc2.org sls= [1725, 1726, 1724] site= 1727 +4726 1 n2-1726.plc2.org sls= [1725, 1726, 1727] site= 1728 +4727 1 n2-1727.plc2.org sls= [1726, 1727, 1728] site= 1729 +4728 1 n2-1728.plc2.org sls= [1727, 1728, 1729] site= 1730 +4729 1 n2-1729.plc2.org sls= [1728, 1729, 1730] site= 1731 +4730 1 n2-1730.plc2.org sls= [1729, 1730, 1731] site= 1732 +4731 1 n2-1731.plc2.org sls= [1730, 1731, 1732] site= 1733 +4732 1 n2-1732.plc2.org sls= [1733, 1731, 1732] site= 1734 +4733 1 n2-1733.plc2.org sls= [1733, 1734, 1732] site= 1735 +4734 1 n2-1734.plc2.org sls= [1733, 1734, 1735] site= 1736 +4735 1 n2-1735.plc2.org sls= [1734, 1735, 1736] site= 1737 +4736 1 n2-1736.plc2.org sls= [1735, 1736, 1737] site= 1738 +4737 1 n2-1737.plc2.org sls= [1736, 1737, 1738] site= 1739 +4738 1 n2-1738.plc2.org sls= [1737, 1738, 1739] site= 1740 +4739 1 n2-1739.plc2.org sls= [1738, 1739, 1740] site= 1741 +4740 1 n2-1740.plc2.org sls= [1741, 1739, 1740] site= 1742 +4741 1 n2-1741.plc2.org sls= [1741, 1742, 1740] site= 1743 +4742 1 n2-1742.plc2.org sls= [1741, 1742, 1743] site= 1744 +4743 1 n2-1743.plc2.org sls= [1742, 1743, 1744] site= 1745 +4744 1 n2-1744.plc2.org sls= [1743, 1744, 1745] site= 1746 +4745 1 n2-1745.plc2.org sls= [1744, 1745, 1746] site= 1747 +4746 1 n2-1746.plc2.org sls= [1745, 1746, 1747] site= 1748 +4747 1 n2-1747.plc2.org sls= [1746, 1747, 1748] site= 1749 +4748 1 n2-1748.plc2.org sls= [1749, 1747, 1748] site= 1750 +4749 1 n2-1749.plc2.org sls= [1749, 1750, 1748] site= 1751 +4750 1 n2-1750.plc2.org sls= [1749, 1750, 1751] site= 1752 +4751 1 n2-1751.plc2.org sls= [1750, 1751, 1752] site= 1753 +4752 1 n2-1752.plc2.org sls= [1751, 1752, 1753] site= 1754 +4753 1 n2-1753.plc2.org sls= [1752, 1753, 1754] site= 1755 +4754 1 n2-1754.plc2.org sls= [1753, 1754, 1755] site= 1756 +4755 1 n2-1755.plc2.org sls= [1754, 1755, 1756] site= 1757 +4756 1 n2-1756.plc2.org sls= [1757, 1755, 1756] site= 1758 +4757 1 n2-1757.plc2.org sls= [1757, 1758, 1756] site= 1759 +4758 1 n2-1758.plc2.org sls= [1757, 1758, 1759] site= 1760 +4759 1 n2-1759.plc2.org sls= [1758, 1759, 1760] site= 1761 +4760 1 n2-1760.plc2.org sls= [1759, 1760, 1761] site= 1762 +4761 1 n2-1761.plc2.org sls= [1760, 1761, 1762] site= 1763 +4762 1 n2-1762.plc2.org sls= [1761, 1762, 1763] site= 1764 +4763 1 n2-1763.plc2.org sls= [1762, 1763, 1764] site= 1765 +4764 1 n2-1764.plc2.org sls= [1765, 1763, 1764] site= 1766 +4765 1 n2-1765.plc2.org sls= [1765, 1766, 1764] site= 1767 +4766 1 n2-1766.plc2.org sls= [1765, 1766, 1767] site= 1768 +4767 1 n2-1767.plc2.org sls= [1766, 1767, 1768] site= 1769 +4768 1 n2-1768.plc2.org sls= [1767, 1768, 1769] site= 1770 +4769 1 n2-1769.plc2.org sls= [1768, 1769, 1770] site= 1771 +4770 1 n2-1770.plc2.org sls= [1769, 1770, 1771] site= 1772 +4771 1 n2-1771.plc2.org sls= [1770, 1771, 1772] site= 1773 +4772 1 n2-1772.plc2.org sls= [1773, 1771, 1772] site= 1774 +4773 1 n2-1773.plc2.org sls= [1773, 1774, 1772] site= 1775 +4774 1 n2-1774.plc2.org sls= [1773, 1774, 1775] site= 1776 +4775 1 n2-1775.plc2.org sls= [1774, 1775, 1776] site= 1777 +4776 1 n2-1776.plc2.org sls= [1775, 1776, 1777] site= 1778 +4777 1 n2-1777.plc2.org sls= [1776, 1777, 1778] site= 1779 +4778 1 n2-1778.plc2.org sls= [1777, 1778, 1779] site= 1780 +4779 1 n2-1779.plc2.org sls= [1778, 1779, 1780] site= 1781 +4780 1 n2-1780.plc2.org sls= [1781, 1779, 1780] site= 1782 +4781 1 n2-1781.plc2.org sls= [1781, 1782, 1780] site= 1783 +4782 1 n2-1782.plc2.org sls= [1781, 1782, 1783] site= 1784 +4783 1 n2-1783.plc2.org sls= [1782, 1783, 1784] site= 1785 +4784 1 n2-1784.plc2.org sls= [1783, 1784, 1785] site= 1786 +4785 1 n2-1785.plc2.org sls= [1784, 1785, 1786] site= 1787 +4786 1 n2-1786.plc2.org sls= [1785, 1786, 1787] site= 1788 +4787 1 n2-1787.plc2.org sls= [1786, 1787, 1788] site= 1789 +4788 1 n2-1788.plc2.org sls= [1789, 1787, 1788] site= 1790 +4789 1 n2-1789.plc2.org sls= [1789, 1790, 1788] site= 1791 +4790 1 n2-1790.plc2.org sls= [1789, 1790, 1791] site= 1792 +4791 1 n2-1791.plc2.org sls= [1790, 1791, 1792] site= 1793 +4792 1 n2-1792.plc2.org sls= [1791, 1792, 1793] site= 1794 +4793 1 n2-1793.plc2.org sls= [1792, 1793, 1794] site= 1795 +4794 1 n2-1794.plc2.org sls= [1793, 1794, 1795] site= 1796 +4795 1 n2-1795.plc2.org sls= [1794, 1795, 1796] site= 1797 +4796 1 n2-1796.plc2.org sls= [1797, 1795, 1796] site= 1798 +4797 1 n2-1797.plc2.org sls= [1797, 1798, 1796] site= 1799 +4798 1 n2-1798.plc2.org sls= [1797, 1798, 1799] site= 1800 +4799 1 n2-1799.plc2.org sls= [1798, 1799, 1800] site= 1801 +4800 1 n2-1800.plc2.org sls= [1799, 1800, 1801] site= 1802 +4801 1 n2-1801.plc2.org sls= [1800, 1801, 1802] site= 1803 +4802 1 n2-1802.plc2.org sls= [1801, 1802, 1803] site= 1804 +4803 1 n2-1803.plc2.org sls= [1802, 1803, 1804] site= 1805 +4804 1 n2-1804.plc2.org sls= [1805, 1803, 1804] site= 1806 +4805 1 n2-1805.plc2.org sls= [1805, 1806, 1804] site= 1807 +4806 1 n2-1806.plc2.org sls= [1805, 1806, 1807] site= 1808 +4807 1 n2-1807.plc2.org sls= [1806, 1807, 1808] site= 1809 +4808 1 n2-1808.plc2.org sls= [1807, 1808, 1809] site= 1810 +4809 1 n2-1809.plc2.org sls= [1808, 1809, 1810] site= 1811 +4810 1 n2-1810.plc2.org sls= [1809, 1810, 1811] site= 1812 +4811 1 n2-1811.plc2.org sls= [1810, 1811, 1812] site= 1813 +4812 1 n2-1812.plc2.org sls= [1813, 1811, 1812] site= 1814 +4813 1 n2-1813.plc2.org sls= [1813, 1814, 1812] site= 1815 +4814 1 n2-1814.plc2.org sls= [1813, 1814, 1815] site= 1816 +4815 1 n2-1815.plc2.org sls= [1814, 1815, 1816] site= 1817 +4816 1 n2-1816.plc2.org sls= [1815, 1816, 1817] site= 1818 +4817 1 n2-1817.plc2.org sls= [1816, 1817, 1818] site= 1819 +4818 1 n2-1818.plc2.org sls= [1817, 1818, 1819] site= 1820 +4819 1 n2-1819.plc2.org sls= [1818, 1819, 1820] site= 1821 +4820 1 n2-1820.plc2.org sls= [1821, 1819, 1820] site= 1822 +4821 1 n2-1821.plc2.org sls= [1821, 1822, 1820] site= 1823 +4822 1 n2-1822.plc2.org sls= [1821, 1822, 1823] site= 1824 +4823 1 n2-1823.plc2.org sls= [1822, 1823, 1824] site= 1825 +4824 1 n2-1824.plc2.org sls= [1823, 1824, 1825] site= 1826 +4825 1 n2-1825.plc2.org sls= [1824, 1825, 1826] site= 1827 +4826 1 n2-1826.plc2.org sls= [1825, 1826, 1827] site= 1828 +4827 1 n2-1827.plc2.org sls= [1826, 1827, 1828] site= 1829 +4828 1 n2-1828.plc2.org sls= [1829, 1827, 1828] site= 1830 +4829 1 n2-1829.plc2.org sls= [1829, 1830, 1828] site= 1831 +4830 1 n2-1830.plc2.org sls= [1829, 1830, 1831] site= 1832 +4831 1 n2-1831.plc2.org sls= [1830, 1831, 1832] site= 1833 +4832 1 n2-1832.plc2.org sls= [1831, 1832, 1833] site= 1834 +4833 1 n2-1833.plc2.org sls= [1832, 1833, 1834] site= 1835 +4834 1 n2-1834.plc2.org sls= [1833, 1834, 1835] site= 1836 +4835 1 n2-1835.plc2.org sls= [1834, 1835, 1836] site= 1837 +4836 1 n2-1836.plc2.org sls= [1837, 1835, 1836] site= 1838 +4837 1 n2-1837.plc2.org sls= [1837, 1838, 1836] site= 1839 +4838 1 n2-1838.plc2.org sls= [1837, 1838, 1839] site= 1840 +4839 1 n2-1839.plc2.org sls= [1838, 1839, 1840] site= 1841 +4840 1 n2-1840.plc2.org sls= [1839, 1840, 1841] site= 1842 +4841 1 n2-1841.plc2.org sls= [1840, 1841, 1842] site= 1843 +4842 1 n2-1842.plc2.org sls= [1841, 1842, 1843] site= 1844 +4843 1 n2-1843.plc2.org sls= [1842, 1843, 1844] site= 1845 +4844 1 n2-1844.plc2.org sls= [1845, 1843, 1844] site= 1846 +4845 1 n2-1845.plc2.org sls= [1845, 1846, 1844] site= 1847 +4846 1 n2-1846.plc2.org sls= [1845, 1846, 1847] site= 1848 +4847 1 n2-1847.plc2.org sls= [1846, 1847, 1848] site= 1849 +4848 1 n2-1848.plc2.org sls= [1847, 1848, 1849] site= 1850 +4849 1 n2-1849.plc2.org sls= [1848, 1849, 1850] site= 1851 +4850 1 n2-1850.plc2.org sls= [1849, 1850, 1851] site= 1852 +4851 1 n2-1851.plc2.org sls= [1850, 1851, 1852] site= 1853 +4852 1 n2-1852.plc2.org sls= [1853, 1851, 1852] site= 1854 +4853 1 n2-1853.plc2.org sls= [1853, 1854, 1852] site= 1855 +4854 1 n2-1854.plc2.org sls= [1853, 1854, 1855] site= 1856 +4855 1 n2-1855.plc2.org sls= [1854, 1855, 1856] site= 1857 +4856 1 n2-1856.plc2.org sls= [1855, 1856, 1857] site= 1858 +4857 1 n2-1857.plc2.org sls= [1856, 1857, 1858] site= 1859 +4858 1 n2-1858.plc2.org sls= [1857, 1858, 1859] site= 1860 +4859 1 n2-1859.plc2.org sls= [1858, 1859, 1860] site= 1861 +4860 1 n2-1860.plc2.org sls= [1861, 1859, 1860] site= 1862 +4861 1 n2-1861.plc2.org sls= [1861, 1862, 1860] site= 1863 +4862 1 n2-1862.plc2.org sls= [1861, 1862, 1863] site= 1864 +4863 1 n2-1863.plc2.org sls= [1862, 1863, 1864] site= 1865 +4864 1 n2-1864.plc2.org sls= [1863, 1864, 1865] site= 1866 +4865 1 n2-1865.plc2.org sls= [1864, 1865, 1866] site= 1867 +4866 1 n2-1866.plc2.org sls= [1865, 1866, 1867] site= 1868 +4867 1 n2-1867.plc2.org sls= [1866, 1867, 1868] site= 1869 +4868 1 n2-1868.plc2.org sls= [1869, 1867, 1868] site= 1870 +4869 1 n2-1869.plc2.org sls= [1869, 1870, 1868] site= 1871 +4870 1 n2-1870.plc2.org sls= [1869, 1870, 1871] site= 1872 +4871 1 n2-1871.plc2.org sls= [1870, 1871, 1872] site= 1873 +4872 1 n2-1872.plc2.org sls= [1871, 1872, 1873] site= 1874 +4873 1 n2-1873.plc2.org sls= [1872, 1873, 1874] site= 1875 +4874 1 n2-1874.plc2.org sls= [1873, 1874, 1875] site= 1876 +4875 1 n2-1875.plc2.org sls= [1874, 1875, 1876] site= 1877 +4876 1 n2-1876.plc2.org sls= [1877, 1875, 1876] site= 1878 +4877 1 n2-1877.plc2.org sls= [1877, 1878, 1876] site= 1879 +4878 1 n2-1878.plc2.org sls= [1877, 1878, 1879] site= 1880 +4879 1 n2-1879.plc2.org sls= [1878, 1879, 1880] site= 1881 +4880 1 n2-1880.plc2.org sls= [1879, 1880, 1881] site= 1882 +4881 1 n2-1881.plc2.org sls= [1880, 1881, 1882] site= 1883 +4882 1 n2-1882.plc2.org sls= [1881, 1882, 1883] site= 1884 +4883 1 n2-1883.plc2.org sls= [1882, 1883, 1884] site= 1885 +4884 1 n2-1884.plc2.org sls= [1885, 1883, 1884] site= 1886 +4885 1 n2-1885.plc2.org sls= [1885, 1886, 1884] site= 1887 +4886 1 n2-1886.plc2.org sls= [1885, 1886, 1887] site= 1888 +4887 1 n2-1887.plc2.org sls= [1886, 1887, 1888] site= 1889 +4888 1 n2-1888.plc2.org sls= [1887, 1888, 1889] site= 1890 +4889 1 n2-1889.plc2.org sls= [1888, 1889, 1890] site= 1891 +4890 1 n2-1890.plc2.org sls= [1889, 1890, 1891] site= 1892 +4891 1 n2-1891.plc2.org sls= [1890, 1891, 1892] site= 1893 +4892 1 n2-1892.plc2.org sls= [1893, 1891, 1892] site= 1894 +4893 1 n2-1893.plc2.org sls= [1893, 1894, 1892] site= 1895 +4894 1 n2-1894.plc2.org sls= [1893, 1894, 1895] site= 1896 +4895 1 n2-1895.plc2.org sls= [1894, 1895, 1896] site= 1897 +4896 1 n2-1896.plc2.org sls= [1895, 1896, 1897] site= 1898 +4897 1 n2-1897.plc2.org sls= [1896, 1897, 1898] site= 1899 +4898 1 n2-1898.plc2.org sls= [1897, 1898, 1899] site= 1900 +4899 1 n2-1899.plc2.org sls= [1898, 1899, 1900] site= 1901 +4900 1 n2-1900.plc2.org sls= [1901, 1899, 1900] site= 1902 +4901 1 n2-1901.plc2.org sls= [1901, 1902, 1900] site= 1903 +4902 1 n2-1902.plc2.org sls= [1901, 1902, 1903] site= 1904 +4903 1 n2-1903.plc2.org sls= [1902, 1903, 1904] site= 1905 +4904 1 n2-1904.plc2.org sls= [1903, 1904, 1905] site= 1906 +4905 1 n2-1905.plc2.org sls= [1904, 1905, 1906] site= 1907 +4906 1 n2-1906.plc2.org sls= [1905, 1906, 1907] site= 1908 +4907 1 n2-1907.plc2.org sls= [1906, 1907, 1908] site= 1909 +4908 1 n2-1908.plc2.org sls= [1909, 1907, 1908] site= 1910 +4909 1 n2-1909.plc2.org sls= [1909, 1910, 1908] site= 1911 +4910 1 n2-1910.plc2.org sls= [1909, 1910, 1911] site= 1912 +4911 1 n2-1911.plc2.org sls= [1910, 1911, 1912] site= 1913 +4912 1 n2-1912.plc2.org sls= [1911, 1912, 1913] site= 1914 +4913 1 n2-1913.plc2.org sls= [1912, 1913, 1914] site= 1915 +4914 1 n2-1914.plc2.org sls= [1913, 1914, 1915] site= 1916 +4915 1 n2-1915.plc2.org sls= [1914, 1915, 1916] site= 1917 +4916 1 n2-1916.plc2.org sls= [1917, 1915, 1916] site= 1918 +4917 1 n2-1917.plc2.org sls= [1917, 1918, 1916] site= 1919 +4918 1 n2-1918.plc2.org sls= [1917, 1918, 1919] site= 1920 +4919 1 n2-1919.plc2.org sls= [1918, 1919, 1920] site= 1921 +4920 1 n2-1920.plc2.org sls= [1919, 1920, 1921] site= 1922 +4921 1 n2-1921.plc2.org sls= [1920, 1921, 1922] site= 1923 +4922 1 n2-1922.plc2.org sls= [1921, 1922, 1923] site= 1924 +4923 1 n2-1923.plc2.org sls= [1922, 1923, 1924] site= 1925 +4924 1 n2-1924.plc2.org sls= [1925, 1923, 1924] site= 1926 +4925 1 n2-1925.plc2.org sls= [1925, 1926, 1924] site= 1927 +4926 1 n2-1926.plc2.org sls= [1925, 1926, 1927] site= 1928 +4927 1 n2-1927.plc2.org sls= [1926, 1927, 1928] site= 1929 +4928 1 n2-1928.plc2.org sls= [1927, 1928, 1929] site= 1930 +4929 1 n2-1929.plc2.org sls= [1928, 1929, 1930] site= 1931 +4930 1 n2-1930.plc2.org sls= [1929, 1930, 1931] site= 1932 +4931 1 n2-1931.plc2.org sls= [1930, 1931, 1932] site= 1933 +4932 1 n2-1932.plc2.org sls= [1933, 1931, 1932] site= 1934 +4933 1 n2-1933.plc2.org sls= [1933, 1934, 1932] site= 1935 +4934 1 n2-1934.plc2.org sls= [1933, 1934, 1935] site= 1936 +4935 1 n2-1935.plc2.org sls= [1934, 1935, 1936] site= 1937 +4936 1 n2-1936.plc2.org sls= [1935, 1936, 1937] site= 1938 +4937 1 n2-1937.plc2.org sls= [1936, 1937, 1938] site= 1939 +4938 1 n2-1938.plc2.org sls= [1937, 1938, 1939] site= 1940 +4939 1 n2-1939.plc2.org sls= [1938, 1939, 1940] site= 1941 +4940 1 n2-1940.plc2.org sls= [1941, 1939, 1940] site= 1942 +4941 1 n2-1941.plc2.org sls= [1941, 1942, 1940] site= 1943 +4942 1 n2-1942.plc2.org sls= [1941, 1942, 1943] site= 1944 +4943 1 n2-1943.plc2.org sls= [1942, 1943, 1944] site= 1945 +4944 1 n2-1944.plc2.org sls= [1943, 1944, 1945] site= 1946 +4945 1 n2-1945.plc2.org sls= [1944, 1945, 1946] site= 1947 +4946 1 n2-1946.plc2.org sls= [1945, 1946, 1947] site= 1948 +4947 1 n2-1947.plc2.org sls= [1946, 1947, 1948] site= 1949 +4948 1 n2-1948.plc2.org sls= [1949, 1947, 1948] site= 1950 +4949 1 n2-1949.plc2.org sls= [1949, 1950, 1948] site= 1951 +4950 1 n2-1950.plc2.org sls= [1949, 1950, 1951] site= 1952 +4951 1 n2-1951.plc2.org sls= [1950, 1951, 1952] site= 1953 +4952 1 n2-1952.plc2.org sls= [1951, 1952, 1953] site= 1954 +4953 1 n2-1953.plc2.org sls= [1952, 1953, 1954] site= 1955 +4954 1 n2-1954.plc2.org sls= [1953, 1954, 1955] site= 1956 +4955 1 n2-1955.plc2.org sls= [1954, 1955, 1956] site= 1957 +4956 1 n2-1956.plc2.org sls= [1957, 1955, 1956] site= 1958 +4957 1 n2-1957.plc2.org sls= [1957, 1958, 1956] site= 1959 +4958 1 n2-1958.plc2.org sls= [1957, 1958, 1959] site= 1960 +4959 1 n2-1959.plc2.org sls= [1958, 1959, 1960] site= 1961 +4960 1 n2-1960.plc2.org sls= [1959, 1960, 1961] site= 1962 +4961 1 n2-1961.plc2.org sls= [1960, 1961, 1962] site= 1963 +4962 1 n2-1962.plc2.org sls= [1961, 1962, 1963] site= 1964 +4963 1 n2-1963.plc2.org sls= [1962, 1963, 1964] site= 1965 +4964 1 n2-1964.plc2.org sls= [1965, 1963, 1964] site= 1966 +4965 1 n2-1965.plc2.org sls= [1965, 1966, 1964] site= 1967 +4966 1 n2-1966.plc2.org sls= [1965, 1966, 1967] site= 1968 +4967 1 n2-1967.plc2.org sls= [1966, 1967, 1968] site= 1969 +4968 1 n2-1968.plc2.org sls= [1967, 1968, 1969] site= 1970 +4969 1 n2-1969.plc2.org sls= [1968, 1969, 1970] site= 1971 +4970 1 n2-1970.plc2.org sls= [1969, 1970, 1971] site= 1972 +4971 1 n2-1971.plc2.org sls= [1970, 1971, 1972] site= 1973 +4972 1 n2-1972.plc2.org sls= [1973, 1971, 1972] site= 1974 +4973 1 n2-1973.plc2.org sls= [1973, 1974, 1972] site= 1975 +4974 1 n2-1974.plc2.org sls= [1973, 1974, 1975] site= 1976 +4975 1 n2-1975.plc2.org sls= [1974, 1975, 1976] site= 1977 +4976 1 n2-1976.plc2.org sls= [1975, 1976, 1977] site= 1978 +4977 1 n2-1977.plc2.org sls= [1976, 1977, 1978] site= 1979 +4978 1 n2-1978.plc2.org sls= [1977, 1978, 1979] site= 1980 +4979 1 n2-1979.plc2.org sls= [1978, 1979, 1980] site= 1981 +4980 1 n2-1980.plc2.org sls= [1981, 1979, 1980] site= 1982 +4981 1 n2-1981.plc2.org sls= [1981, 1982, 1980] site= 1983 +4982 1 n2-1982.plc2.org sls= [1981, 1982, 1983] site= 1984 +4983 1 n2-1983.plc2.org sls= [1982, 1983, 1984] site= 1985 +4984 1 n2-1984.plc2.org sls= [1983, 1984, 1985] site= 1986 +4985 1 n2-1985.plc2.org sls= [1984, 1985, 1986] site= 1987 +4986 1 n2-1986.plc2.org sls= [1985, 1986, 1987] site= 1988 +4987 1 n2-1987.plc2.org sls= [1986, 1987, 1988] site= 1989 +4988 1 n2-1988.plc2.org sls= [1989, 1987, 1988] site= 1990 +4989 1 n2-1989.plc2.org sls= [1989, 1990, 1988] site= 1991 +4990 1 n2-1990.plc2.org sls= [1989, 1990, 1991] site= 1992 +4991 1 n2-1991.plc2.org sls= [1990, 1991, 1992] site= 1993 +4992 1 n2-1992.plc2.org sls= [1991, 1992, 1993] site= 1994 +4993 1 n2-1993.plc2.org sls= [1992, 1993, 1994] site= 1995 +4994 1 n2-1994.plc2.org sls= [1993, 1994, 1995] site= 1996 +4995 1 n2-1995.plc2.org sls= [1994, 1995, 1996] site= 1997 +4996 1 n2-1996.plc2.org sls= [1997, 1995, 1996] site= 1998 +4997 1 n2-1997.plc2.org sls= [1997, 1998, 1996] site= 1999 +4998 1 n2-1998.plc2.org sls= [1997, 1998, 1999] site= 2000 +4999 1 n2-1999.plc2.org sls= [1998, 1999, 2000] site= 2001 +5000 1 n2-2000.plc2.org sls= [1999, 2000, 2001] site= 2002 +5001 1 n2-2001.plc2.org sls= [2000, 2001] site= 1003 +5002 1 n2-2002.plc2.org sls= [2001] site= 1004 +5003 1 n2-2003.plc2.org sls= [] site= 1005 +5004 1 n2-2004.plc2.org sls= [] site= 1006 +5005 1 n2-2005.plc2.org sls= [] site= 1007 +5006 1 n2-2006.plc2.org sls= [] site= 1008 +5007 1 n2-2007.plc2.org sls= [] site= 1009 +5008 1 n2-2008.plc2.org sls= [] site= 1010 +5009 1 n2-2009.plc2.org sls= [] site= 1011 +5010 1 n2-2010.plc2.org sls= [] site= 1012 +5011 1 n2-2011.plc2.org sls= [] site= 1013 +5012 1 n2-2012.plc2.org sls= [] site= 1014 +5013 1 n2-2013.plc2.org sls= [] site= 1015 +5014 1 n2-2014.plc2.org sls= [] site= 1016 +5015 1 n2-2015.plc2.org sls= [] site= 1017 +5016 1 n2-2016.plc2.org sls= [] site= 1018 +5017 1 n2-2017.plc2.org sls= [] site= 1019 +5018 1 n2-2018.plc2.org sls= [] site= 1020 +5019 1 n2-2019.plc2.org sls= [] site= 1021 +5020 1 n2-2020.plc2.org sls= [] site= 1022 +5021 1 n2-2021.plc2.org sls= [] site= 1023 +5022 1 n2-2022.plc2.org sls= [] site= 1024 +5023 1 n2-2023.plc2.org sls= [] site= 1025 +5024 1 n2-2024.plc2.org sls= [] site= 1026 +5025 1 n2-2025.plc2.org sls= [] site= 1027 +5026 1 n2-2026.plc2.org sls= [] site= 1028 +5027 1 n2-2027.plc2.org sls= [] site= 1029 +5028 1 n2-2028.plc2.org sls= [] site= 1030 +5029 1 n2-2029.plc2.org sls= [] site= 1031 +5030 1 n2-2030.plc2.org sls= [] site= 1032 +5031 1 n2-2031.plc2.org sls= [] site= 1033 +5032 1 n2-2032.plc2.org sls= [] site= 1034 +5033 1 n2-2033.plc2.org sls= [] site= 1035 +5034 1 n2-2034.plc2.org sls= [] site= 1036 +5035 1 n2-2035.plc2.org sls= [] site= 1037 +5036 1 n2-2036.plc2.org sls= [] site= 1038 +5037 1 n2-2037.plc2.org sls= [] site= 1039 +5038 1 n2-2038.plc2.org sls= [] site= 1040 +5039 1 n2-2039.plc2.org sls= [] site= 1041 +5040 1 n2-2040.plc2.org sls= [] site= 1042 +5041 1 n2-2041.plc2.org sls= [] site= 1043 +5042 1 n2-2042.plc2.org sls= [] site= 1044 +5043 1 n2-2043.plc2.org sls= [] site= 1045 +5044 1 n2-2044.plc2.org sls= [] site= 1046 +5045 1 n2-2045.plc2.org sls= [] site= 1047 +5046 1 n2-2046.plc2.org sls= [] site= 1048 +5047 1 n2-2047.plc2.org sls= [] site= 1049 +5048 1 n2-2048.plc2.org sls= [] site= 1050 +5049 1 n2-2049.plc2.org sls= [] site= 1051 +5050 1 n2-2050.plc2.org sls= [] site= 1052 +5051 1 n2-2051.plc2.org sls= [] site= 1053 +5052 1 n2-2052.plc2.org sls= [] site= 1054 +5053 1 n2-2053.plc2.org sls= [] site= 1055 +5054 1 n2-2054.plc2.org sls= [] site= 1056 +5055 1 n2-2055.plc2.org sls= [] site= 1057 +5056 1 n2-2056.plc2.org sls= [] site= 1058 +5057 1 n2-2057.plc2.org sls= [] site= 1059 +5058 1 n2-2058.plc2.org sls= [] site= 1060 +5059 1 n2-2059.plc2.org sls= [] site= 1061 +5060 1 n2-2060.plc2.org sls= [] site= 1062 +5061 1 n2-2061.plc2.org sls= [] site= 1063 +5062 1 n2-2062.plc2.org sls= [] site= 1064 +5063 1 n2-2063.plc2.org sls= [] site= 1065 +5064 1 n2-2064.plc2.org sls= [] site= 1066 +5065 1 n2-2065.plc2.org sls= [] site= 1067 +5066 1 n2-2066.plc2.org sls= [] site= 1068 +5067 1 n2-2067.plc2.org sls= [] site= 1069 +5068 1 n2-2068.plc2.org sls= [] site= 1070 +5069 1 n2-2069.plc2.org sls= [] site= 1071 +5070 1 n2-2070.plc2.org sls= [] site= 1072 +5071 1 n2-2071.plc2.org sls= [] site= 1073 +5072 1 n2-2072.plc2.org sls= [] site= 1074 +5073 1 n2-2073.plc2.org sls= [] site= 1075 +5074 1 n2-2074.plc2.org sls= [] site= 1076 +5075 1 n2-2075.plc2.org sls= [] site= 1077 +5076 1 n2-2076.plc2.org sls= [] site= 1078 +5077 1 n2-2077.plc2.org sls= [] site= 1079 +5078 1 n2-2078.plc2.org sls= [] site= 1080 +5079 1 n2-2079.plc2.org sls= [] site= 1081 +5080 1 n2-2080.plc2.org sls= [] site= 1082 +5081 1 n2-2081.plc2.org sls= [] site= 1083 +5082 1 n2-2082.plc2.org sls= [] site= 1084 +5083 1 n2-2083.plc2.org sls= [] site= 1085 +5084 1 n2-2084.plc2.org sls= [] site= 1086 +5085 1 n2-2085.plc2.org sls= [] site= 1087 +5086 1 n2-2086.plc2.org sls= [] site= 1088 +5087 1 n2-2087.plc2.org sls= [] site= 1089 +5088 1 n2-2088.plc2.org sls= [] site= 1090 +5089 1 n2-2089.plc2.org sls= [] site= 1091 +5090 1 n2-2090.plc2.org sls= [] site= 1092 +5091 1 n2-2091.plc2.org sls= [] site= 1093 +5092 1 n2-2092.plc2.org sls= [] site= 1094 +5093 1 n2-2093.plc2.org sls= [] site= 1095 +5094 1 n2-2094.plc2.org sls= [] site= 1096 +5095 1 n2-2095.plc2.org sls= [] site= 1097 +5096 1 n2-2096.plc2.org sls= [] site= 1098 +5097 1 n2-2097.plc2.org sls= [] site= 1099 +5098 1 n2-2098.plc2.org sls= [] site= 1100 +5099 1 n2-2099.plc2.org sls= [] site= 1101 +5100 1 n2-2100.plc2.org sls= [] site= 1102 +5101 1 n2-2101.plc2.org sls= [] site= 1103 +5102 1 n2-2102.plc2.org sls= [] site= 1104 +5103 1 n2-2103.plc2.org sls= [] site= 1105 +5104 1 n2-2104.plc2.org sls= [] site= 1106 +5105 1 n2-2105.plc2.org sls= [] site= 1107 +5106 1 n2-2106.plc2.org sls= [] site= 1108 +5107 1 n2-2107.plc2.org sls= [] site= 1109 +5108 1 n2-2108.plc2.org sls= [] site= 1110 +5109 1 n2-2109.plc2.org sls= [] site= 1111 +5110 1 n2-2110.plc2.org sls= [] site= 1112 +5111 1 n2-2111.plc2.org sls= [] site= 1113 +5112 1 n2-2112.plc2.org sls= [] site= 1114 +5113 1 n2-2113.plc2.org sls= [] site= 1115 +5114 1 n2-2114.plc2.org sls= [] site= 1116 +5115 1 n2-2115.plc2.org sls= [] site= 1117 +5116 1 n2-2116.plc2.org sls= [] site= 1118 +5117 1 n2-2117.plc2.org sls= [] site= 1119 +5118 1 n2-2118.plc2.org sls= [] site= 1120 +5119 1 n2-2119.plc2.org sls= [] site= 1121 +5120 1 n2-2120.plc2.org sls= [] site= 1122 +5121 1 n2-2121.plc2.org sls= [] site= 1123 +5122 1 n2-2122.plc2.org sls= [] site= 1124 +5123 1 n2-2123.plc2.org sls= [] site= 1125 +5124 1 n2-2124.plc2.org sls= [] site= 1126 +5125 1 n2-2125.plc2.org sls= [] site= 1127 +5126 1 n2-2126.plc2.org sls= [] site= 1128 +5127 1 n2-2127.plc2.org sls= [] site= 1129 +5128 1 n2-2128.plc2.org sls= [] site= 1130 +5129 1 n2-2129.plc2.org sls= [] site= 1131 +5130 1 n2-2130.plc2.org sls= [] site= 1132 +5131 1 n2-2131.plc2.org sls= [] site= 1133 +5132 1 n2-2132.plc2.org sls= [] site= 1134 +5133 1 n2-2133.plc2.org sls= [] site= 1135 +5134 1 n2-2134.plc2.org sls= [] site= 1136 +5135 1 n2-2135.plc2.org sls= [] site= 1137 +5136 1 n2-2136.plc2.org sls= [] site= 1138 +5137 1 n2-2137.plc2.org sls= [] site= 1139 +5138 1 n2-2138.plc2.org sls= [] site= 1140 +5139 1 n2-2139.plc2.org sls= [] site= 1141 +5140 1 n2-2140.plc2.org sls= [] site= 1142 +5141 1 n2-2141.plc2.org sls= [] site= 1143 +5142 1 n2-2142.plc2.org sls= [] site= 1144 +5143 1 n2-2143.plc2.org sls= [] site= 1145 +5144 1 n2-2144.plc2.org sls= [] site= 1146 +5145 1 n2-2145.plc2.org sls= [] site= 1147 +5146 1 n2-2146.plc2.org sls= [] site= 1148 +5147 1 n2-2147.plc2.org sls= [] site= 1149 +5148 1 n2-2148.plc2.org sls= [] site= 1150 +5149 1 n2-2149.plc2.org sls= [] site= 1151 +5150 1 n2-2150.plc2.org sls= [] site= 1152 +5151 1 n2-2151.plc2.org sls= [] site= 1153 +5152 1 n2-2152.plc2.org sls= [] site= 1154 +5153 1 n2-2153.plc2.org sls= [] site= 1155 +5154 1 n2-2154.plc2.org sls= [] site= 1156 +5155 1 n2-2155.plc2.org sls= [] site= 1157 +5156 1 n2-2156.plc2.org sls= [] site= 1158 +5157 1 n2-2157.plc2.org sls= [] site= 1159 +5158 1 n2-2158.plc2.org sls= [] site= 1160 +5159 1 n2-2159.plc2.org sls= [] site= 1161 +5160 1 n2-2160.plc2.org sls= [] site= 1162 +5161 1 n2-2161.plc2.org sls= [] site= 1163 +5162 1 n2-2162.plc2.org sls= [] site= 1164 +5163 1 n2-2163.plc2.org sls= [] site= 1165 +5164 1 n2-2164.plc2.org sls= [] site= 1166 +5165 1 n2-2165.plc2.org sls= [] site= 1167 +5166 1 n2-2166.plc2.org sls= [] site= 1168 +5167 1 n2-2167.plc2.org sls= [] site= 1169 +5168 1 n2-2168.plc2.org sls= [] site= 1170 +5169 1 n2-2169.plc2.org sls= [] site= 1171 +5170 1 n2-2170.plc2.org sls= [] site= 1172 +5171 1 n2-2171.plc2.org sls= [] site= 1173 +5172 1 n2-2172.plc2.org sls= [] site= 1174 +5173 1 n2-2173.plc2.org sls= [] site= 1175 +5174 1 n2-2174.plc2.org sls= [] site= 1176 +5175 1 n2-2175.plc2.org sls= [] site= 1177 +5176 1 n2-2176.plc2.org sls= [] site= 1178 +5177 1 n2-2177.plc2.org sls= [] site= 1179 +5178 1 n2-2178.plc2.org sls= [] site= 1180 +5179 1 n2-2179.plc2.org sls= [] site= 1181 +5180 1 n2-2180.plc2.org sls= [] site= 1182 +5181 1 n2-2181.plc2.org sls= [] site= 1183 +5182 1 n2-2182.plc2.org sls= [] site= 1184 +5183 1 n2-2183.plc2.org sls= [] site= 1185 +5184 1 n2-2184.plc2.org sls= [] site= 1186 +5185 1 n2-2185.plc2.org sls= [] site= 1187 +5186 1 n2-2186.plc2.org sls= [] site= 1188 +5187 1 n2-2187.plc2.org sls= [] site= 1189 +5188 1 n2-2188.plc2.org sls= [] site= 1190 +5189 1 n2-2189.plc2.org sls= [] site= 1191 +5190 1 n2-2190.plc2.org sls= [] site= 1192 +5191 1 n2-2191.plc2.org sls= [] site= 1193 +5192 1 n2-2192.plc2.org sls= [] site= 1194 +5193 1 n2-2193.plc2.org sls= [] site= 1195 +5194 1 n2-2194.plc2.org sls= [] site= 1196 +5195 1 n2-2195.plc2.org sls= [] site= 1197 +5196 1 n2-2196.plc2.org sls= [] site= 1198 +5197 1 n2-2197.plc2.org sls= [] site= 1199 +5198 1 n2-2198.plc2.org sls= [] site= 1200 +5199 1 n2-2199.plc2.org sls= [] site= 1201 +5200 1 n2-2200.plc2.org sls= [] site= 1202 +5201 1 n2-2201.plc2.org sls= [] site= 1203 +5202 1 n2-2202.plc2.org sls= [] site= 1204 +5203 1 n2-2203.plc2.org sls= [] site= 1205 +5204 1 n2-2204.plc2.org sls= [] site= 1206 +5205 1 n2-2205.plc2.org sls= [] site= 1207 +5206 1 n2-2206.plc2.org sls= [] site= 1208 +5207 1 n2-2207.plc2.org sls= [] site= 1209 +5208 1 n2-2208.plc2.org sls= [] site= 1210 +5209 1 n2-2209.plc2.org sls= [] site= 1211 +5210 1 n2-2210.plc2.org sls= [] site= 1212 +5211 1 n2-2211.plc2.org sls= [] site= 1213 +5212 1 n2-2212.plc2.org sls= [] site= 1214 +5213 1 n2-2213.plc2.org sls= [] site= 1215 +5214 1 n2-2214.plc2.org sls= [] site= 1216 +5215 1 n2-2215.plc2.org sls= [] site= 1217 +5216 1 n2-2216.plc2.org sls= [] site= 1218 +5217 1 n2-2217.plc2.org sls= [] site= 1219 +5218 1 n2-2218.plc2.org sls= [] site= 1220 +5219 1 n2-2219.plc2.org sls= [] site= 1221 +5220 1 n2-2220.plc2.org sls= [] site= 1222 +5221 1 n2-2221.plc2.org sls= [] site= 1223 +5222 1 n2-2222.plc2.org sls= [] site= 1224 +5223 1 n2-2223.plc2.org sls= [] site= 1225 +5224 1 n2-2224.plc2.org sls= [] site= 1226 +5225 1 n2-2225.plc2.org sls= [] site= 1227 +5226 1 n2-2226.plc2.org sls= [] site= 1228 +5227 1 n2-2227.plc2.org sls= [] site= 1229 +5228 1 n2-2228.plc2.org sls= [] site= 1230 +5229 1 n2-2229.plc2.org sls= [] site= 1231 +5230 1 n2-2230.plc2.org sls= [] site= 1232 +5231 1 n2-2231.plc2.org sls= [] site= 1233 +5232 1 n2-2232.plc2.org sls= [] site= 1234 +5233 1 n2-2233.plc2.org sls= [] site= 1235 +5234 1 n2-2234.plc2.org sls= [] site= 1236 +5235 1 n2-2235.plc2.org sls= [] site= 1237 +5236 1 n2-2236.plc2.org sls= [] site= 1238 +5237 1 n2-2237.plc2.org sls= [] site= 1239 +5238 1 n2-2238.plc2.org sls= [] site= 1240 +5239 1 n2-2239.plc2.org sls= [] site= 1241 +5240 1 n2-2240.plc2.org sls= [] site= 1242 +5241 1 n2-2241.plc2.org sls= [] site= 1243 +5242 1 n2-2242.plc2.org sls= [] site= 1244 +5243 1 n2-2243.plc2.org sls= [] site= 1245 +5244 1 n2-2244.plc2.org sls= [] site= 1246 +5245 1 n2-2245.plc2.org sls= [] site= 1247 +5246 1 n2-2246.plc2.org sls= [] site= 1248 +5247 1 n2-2247.plc2.org sls= [] site= 1249 +5248 1 n2-2248.plc2.org sls= [] site= 1250 +5249 1 n2-2249.plc2.org sls= [] site= 1251 +5250 1 n2-2250.plc2.org sls= [] site= 1252 +5251 1 n2-2251.plc2.org sls= [] site= 1253 +5252 1 n2-2252.plc2.org sls= [] site= 1254 +5253 1 n2-2253.plc2.org sls= [] site= 1255 +5254 1 n2-2254.plc2.org sls= [] site= 1256 +5255 1 n2-2255.plc2.org sls= [] site= 1257 +5256 1 n2-2256.plc2.org sls= [] site= 1258 +5257 1 n2-2257.plc2.org sls= [] site= 1259 +5258 1 n2-2258.plc2.org sls= [] site= 1260 +5259 1 n2-2259.plc2.org sls= [] site= 1261 +5260 1 n2-2260.plc2.org sls= [] site= 1262 +5261 1 n2-2261.plc2.org sls= [] site= 1263 +5262 1 n2-2262.plc2.org sls= [] site= 1264 +5263 1 n2-2263.plc2.org sls= [] site= 1265 +5264 1 n2-2264.plc2.org sls= [] site= 1266 +5265 1 n2-2265.plc2.org sls= [] site= 1267 +5266 1 n2-2266.plc2.org sls= [] site= 1268 +5267 1 n2-2267.plc2.org sls= [] site= 1269 +5268 1 n2-2268.plc2.org sls= [] site= 1270 +5269 1 n2-2269.plc2.org sls= [] site= 1271 +5270 1 n2-2270.plc2.org sls= [] site= 1272 +5271 1 n2-2271.plc2.org sls= [] site= 1273 +5272 1 n2-2272.plc2.org sls= [] site= 1274 +5273 1 n2-2273.plc2.org sls= [] site= 1275 +5274 1 n2-2274.plc2.org sls= [] site= 1276 +5275 1 n2-2275.plc2.org sls= [] site= 1277 +5276 1 n2-2276.plc2.org sls= [] site= 1278 +5277 1 n2-2277.plc2.org sls= [] site= 1279 +5278 1 n2-2278.plc2.org sls= [] site= 1280 +5279 1 n2-2279.plc2.org sls= [] site= 1281 +5280 1 n2-2280.plc2.org sls= [] site= 1282 +5281 1 n2-2281.plc2.org sls= [] site= 1283 +5282 1 n2-2282.plc2.org sls= [] site= 1284 +5283 1 n2-2283.plc2.org sls= [] site= 1285 +5284 1 n2-2284.plc2.org sls= [] site= 1286 +5285 1 n2-2285.plc2.org sls= [] site= 1287 +5286 1 n2-2286.plc2.org sls= [] site= 1288 +5287 1 n2-2287.plc2.org sls= [] site= 1289 +5288 1 n2-2288.plc2.org sls= [] site= 1290 +5289 1 n2-2289.plc2.org sls= [] site= 1291 +5290 1 n2-2290.plc2.org sls= [] site= 1292 +5291 1 n2-2291.plc2.org sls= [] site= 1293 +5292 1 n2-2292.plc2.org sls= [] site= 1294 +5293 1 n2-2293.plc2.org sls= [] site= 1295 +5294 1 n2-2294.plc2.org sls= [] site= 1296 +5295 1 n2-2295.plc2.org sls= [] site= 1297 +5296 1 n2-2296.plc2.org sls= [] site= 1298 +5297 1 n2-2297.plc2.org sls= [] site= 1299 +5298 1 n2-2298.plc2.org sls= [] site= 1300 +5299 1 n2-2299.plc2.org sls= [] site= 1301 +5300 1 n2-2300.plc2.org sls= [] site= 1302 +5301 1 n2-2301.plc2.org sls= [] site= 1303 +5302 1 n2-2302.plc2.org sls= [] site= 1304 +5303 1 n2-2303.plc2.org sls= [] site= 1305 +5304 1 n2-2304.plc2.org sls= [] site= 1306 +5305 1 n2-2305.plc2.org sls= [] site= 1307 +5306 1 n2-2306.plc2.org sls= [] site= 1308 +5307 1 n2-2307.plc2.org sls= [] site= 1309 +5308 1 n2-2308.plc2.org sls= [] site= 1310 +5309 1 n2-2309.plc2.org sls= [] site= 1311 +5310 1 n2-2310.plc2.org sls= [] site= 1312 +5311 1 n2-2311.plc2.org sls= [] site= 1313 +5312 1 n2-2312.plc2.org sls= [] site= 1314 +5313 1 n2-2313.plc2.org sls= [] site= 1315 +5314 1 n2-2314.plc2.org sls= [] site= 1316 +5315 1 n2-2315.plc2.org sls= [] site= 1317 +5316 1 n2-2316.plc2.org sls= [] site= 1318 +5317 1 n2-2317.plc2.org sls= [] site= 1319 +5318 1 n2-2318.plc2.org sls= [] site= 1320 +5319 1 n2-2319.plc2.org sls= [] site= 1321 +5320 1 n2-2320.plc2.org sls= [] site= 1322 +5321 1 n2-2321.plc2.org sls= [] site= 1323 +5322 1 n2-2322.plc2.org sls= [] site= 1324 +5323 1 n2-2323.plc2.org sls= [] site= 1325 +5324 1 n2-2324.plc2.org sls= [] site= 1326 +5325 1 n2-2325.plc2.org sls= [] site= 1327 +5326 1 n2-2326.plc2.org sls= [] site= 1328 +5327 1 n2-2327.plc2.org sls= [] site= 1329 +5328 1 n2-2328.plc2.org sls= [] site= 1330 +5329 1 n2-2329.plc2.org sls= [] site= 1331 +5330 1 n2-2330.plc2.org sls= [] site= 1332 +5331 1 n2-2331.plc2.org sls= [] site= 1333 +5332 1 n2-2332.plc2.org sls= [] site= 1334 +5333 1 n2-2333.plc2.org sls= [] site= 1335 +5334 1 n2-2334.plc2.org sls= [] site= 1336 +5335 1 n2-2335.plc2.org sls= [] site= 1337 +5336 1 n2-2336.plc2.org sls= [] site= 1338 +5337 1 n2-2337.plc2.org sls= [] site= 1339 +5338 1 n2-2338.plc2.org sls= [] site= 1340 +5339 1 n2-2339.plc2.org sls= [] site= 1341 +5340 1 n2-2340.plc2.org sls= [] site= 1342 +5341 1 n2-2341.plc2.org sls= [] site= 1343 +5342 1 n2-2342.plc2.org sls= [] site= 1344 +5343 1 n2-2343.plc2.org sls= [] site= 1345 +5344 1 n2-2344.plc2.org sls= [] site= 1346 +5345 1 n2-2345.plc2.org sls= [] site= 1347 +5346 1 n2-2346.plc2.org sls= [] site= 1348 +5347 1 n2-2347.plc2.org sls= [] site= 1349 +5348 1 n2-2348.plc2.org sls= [] site= 1350 +5349 1 n2-2349.plc2.org sls= [] site= 1351 +5350 1 n2-2350.plc2.org sls= [] site= 1352 +5351 1 n2-2351.plc2.org sls= [] site= 1353 +5352 1 n2-2352.plc2.org sls= [] site= 1354 +5353 1 n2-2353.plc2.org sls= [] site= 1355 +5354 1 n2-2354.plc2.org sls= [] site= 1356 +5355 1 n2-2355.plc2.org sls= [] site= 1357 +5356 1 n2-2356.plc2.org sls= [] site= 1358 +5357 1 n2-2357.plc2.org sls= [] site= 1359 +5358 1 n2-2358.plc2.org sls= [] site= 1360 +5359 1 n2-2359.plc2.org sls= [] site= 1361 +5360 1 n2-2360.plc2.org sls= [] site= 1362 +5361 1 n2-2361.plc2.org sls= [] site= 1363 +5362 1 n2-2362.plc2.org sls= [] site= 1364 +5363 1 n2-2363.plc2.org sls= [] site= 1365 +5364 1 n2-2364.plc2.org sls= [] site= 1366 +5365 1 n2-2365.plc2.org sls= [] site= 1367 +5366 1 n2-2366.plc2.org sls= [] site= 1368 +5367 1 n2-2367.plc2.org sls= [] site= 1369 +5368 1 n2-2368.plc2.org sls= [] site= 1370 +5369 1 n2-2369.plc2.org sls= [] site= 1371 +5370 1 n2-2370.plc2.org sls= [] site= 1372 +5371 1 n2-2371.plc2.org sls= [] site= 1373 +5372 1 n2-2372.plc2.org sls= [] site= 1374 +5373 1 n2-2373.plc2.org sls= [] site= 1375 +5374 1 n2-2374.plc2.org sls= [] site= 1376 +5375 1 n2-2375.plc2.org sls= [] site= 1377 +5376 1 n2-2376.plc2.org sls= [] site= 1378 +5377 1 n2-2377.plc2.org sls= [] site= 1379 +5378 1 n2-2378.plc2.org sls= [] site= 1380 +5379 1 n2-2379.plc2.org sls= [] site= 1381 +5380 1 n2-2380.plc2.org sls= [] site= 1382 +5381 1 n2-2381.plc2.org sls= [] site= 1383 +5382 1 n2-2382.plc2.org sls= [] site= 1384 +5383 1 n2-2383.plc2.org sls= [] site= 1385 +5384 1 n2-2384.plc2.org sls= [] site= 1386 +5385 1 n2-2385.plc2.org sls= [] site= 1387 +5386 1 n2-2386.plc2.org sls= [] site= 1388 +5387 1 n2-2387.plc2.org sls= [] site= 1389 +5388 1 n2-2388.plc2.org sls= [] site= 1390 +5389 1 n2-2389.plc2.org sls= [] site= 1391 +5390 1 n2-2390.plc2.org sls= [] site= 1392 +5391 1 n2-2391.plc2.org sls= [] site= 1393 +5392 1 n2-2392.plc2.org sls= [] site= 1394 +5393 1 n2-2393.plc2.org sls= [] site= 1395 +5394 1 n2-2394.plc2.org sls= [] site= 1396 +5395 1 n2-2395.plc2.org sls= [] site= 1397 +5396 1 n2-2396.plc2.org sls= [] site= 1398 +5397 1 n2-2397.plc2.org sls= [] site= 1399 +5398 1 n2-2398.plc2.org sls= [] site= 1400 +5399 1 n2-2399.plc2.org sls= [] site= 1401 +5400 1 n2-2400.plc2.org sls= [] site= 1402 +5401 1 n2-2401.plc2.org sls= [] site= 1403 +5402 1 n2-2402.plc2.org sls= [] site= 1404 +5403 1 n2-2403.plc2.org sls= [] site= 1405 +5404 1 n2-2404.plc2.org sls= [] site= 1406 +5405 1 n2-2405.plc2.org sls= [] site= 1407 +5406 1 n2-2406.plc2.org sls= [] site= 1408 +5407 1 n2-2407.plc2.org sls= [] site= 1409 +5408 1 n2-2408.plc2.org sls= [] site= 1410 +5409 1 n2-2409.plc2.org sls= [] site= 1411 +5410 1 n2-2410.plc2.org sls= [] site= 1412 +5411 1 n2-2411.plc2.org sls= [] site= 1413 +5412 1 n2-2412.plc2.org sls= [] site= 1414 +5413 1 n2-2413.plc2.org sls= [] site= 1415 +5414 1 n2-2414.plc2.org sls= [] site= 1416 +5415 1 n2-2415.plc2.org sls= [] site= 1417 +5416 1 n2-2416.plc2.org sls= [] site= 1418 +5417 1 n2-2417.plc2.org sls= [] site= 1419 +5418 1 n2-2418.plc2.org sls= [] site= 1420 +5419 1 n2-2419.plc2.org sls= [] site= 1421 +5420 1 n2-2420.plc2.org sls= [] site= 1422 +5421 1 n2-2421.plc2.org sls= [] site= 1423 +5422 1 n2-2422.plc2.org sls= [] site= 1424 +5423 1 n2-2423.plc2.org sls= [] site= 1425 +5424 1 n2-2424.plc2.org sls= [] site= 1426 +5425 1 n2-2425.plc2.org sls= [] site= 1427 +5426 1 n2-2426.plc2.org sls= [] site= 1428 +5427 1 n2-2427.plc2.org sls= [] site= 1429 +5428 1 n2-2428.plc2.org sls= [] site= 1430 +5429 1 n2-2429.plc2.org sls= [] site= 1431 +5430 1 n2-2430.plc2.org sls= [] site= 1432 +5431 1 n2-2431.plc2.org sls= [] site= 1433 +5432 1 n2-2432.plc2.org sls= [] site= 1434 +5433 1 n2-2433.plc2.org sls= [] site= 1435 +5434 1 n2-2434.plc2.org sls= [] site= 1436 +5435 1 n2-2435.plc2.org sls= [] site= 1437 +5436 1 n2-2436.plc2.org sls= [] site= 1438 +5437 1 n2-2437.plc2.org sls= [] site= 1439 +5438 1 n2-2438.plc2.org sls= [] site= 1440 +5439 1 n2-2439.plc2.org sls= [] site= 1441 +5440 1 n2-2440.plc2.org sls= [] site= 1442 +5441 1 n2-2441.plc2.org sls= [] site= 1443 +5442 1 n2-2442.plc2.org sls= [] site= 1444 +5443 1 n2-2443.plc2.org sls= [] site= 1445 +5444 1 n2-2444.plc2.org sls= [] site= 1446 +5445 1 n2-2445.plc2.org sls= [] site= 1447 +5446 1 n2-2446.plc2.org sls= [] site= 1448 +5447 1 n2-2447.plc2.org sls= [] site= 1449 +5448 1 n2-2448.plc2.org sls= [] site= 1450 +5449 1 n2-2449.plc2.org sls= [] site= 1451 +5450 1 n2-2450.plc2.org sls= [] site= 1452 +5451 1 n2-2451.plc2.org sls= [] site= 1453 +5452 1 n2-2452.plc2.org sls= [] site= 1454 +5453 1 n2-2453.plc2.org sls= [] site= 1455 +5454 1 n2-2454.plc2.org sls= [] site= 1456 +5455 1 n2-2455.plc2.org sls= [] site= 1457 +5456 1 n2-2456.plc2.org sls= [] site= 1458 +5457 1 n2-2457.plc2.org sls= [] site= 1459 +5458 1 n2-2458.plc2.org sls= [] site= 1460 +5459 1 n2-2459.plc2.org sls= [] site= 1461 +5460 1 n2-2460.plc2.org sls= [] site= 1462 +5461 1 n2-2461.plc2.org sls= [] site= 1463 +5462 1 n2-2462.plc2.org sls= [] site= 1464 +5463 1 n2-2463.plc2.org sls= [] site= 1465 +5464 1 n2-2464.plc2.org sls= [] site= 1466 +5465 1 n2-2465.plc2.org sls= [] site= 1467 +5466 1 n2-2466.plc2.org sls= [] site= 1468 +5467 1 n2-2467.plc2.org sls= [] site= 1469 +5468 1 n2-2468.plc2.org sls= [] site= 1470 +5469 1 n2-2469.plc2.org sls= [] site= 1471 +5470 1 n2-2470.plc2.org sls= [] site= 1472 +5471 1 n2-2471.plc2.org sls= [] site= 1473 +5472 1 n2-2472.plc2.org sls= [] site= 1474 +5473 1 n2-2473.plc2.org sls= [] site= 1475 +5474 1 n2-2474.plc2.org sls= [] site= 1476 +5475 1 n2-2475.plc2.org sls= [] site= 1477 +5476 1 n2-2476.plc2.org sls= [] site= 1478 +5477 1 n2-2477.plc2.org sls= [] site= 1479 +5478 1 n2-2478.plc2.org sls= [] site= 1480 +5479 1 n2-2479.plc2.org sls= [] site= 1481 +5480 1 n2-2480.plc2.org sls= [] site= 1482 +5481 1 n2-2481.plc2.org sls= [] site= 1483 +5482 1 n2-2482.plc2.org sls= [] site= 1484 +5483 1 n2-2483.plc2.org sls= [] site= 1485 +5484 1 n2-2484.plc2.org sls= [] site= 1486 +5485 1 n2-2485.plc2.org sls= [] site= 1487 +5486 1 n2-2486.plc2.org sls= [] site= 1488 +5487 1 n2-2487.plc2.org sls= [] site= 1489 +5488 1 n2-2488.plc2.org sls= [] site= 1490 +5489 1 n2-2489.plc2.org sls= [] site= 1491 +5490 1 n2-2490.plc2.org sls= [] site= 1492 +5491 1 n2-2491.plc2.org sls= [] site= 1493 +5492 1 n2-2492.plc2.org sls= [] site= 1494 +5493 1 n2-2493.plc2.org sls= [] site= 1495 +5494 1 n2-2494.plc2.org sls= [] site= 1496 +5495 1 n2-2495.plc2.org sls= [] site= 1497 +5496 1 n2-2496.plc2.org sls= [] site= 1498 +5497 1 n2-2497.plc2.org sls= [] site= 1499 +5498 1 n2-2498.plc2.org sls= [] site= 1500 +5499 1 n2-2499.plc2.org sls= [] site= 1501 +5500 1 n2-2500.plc2.org sls= [] site= 1502 +5501 1 n2-2501.plc2.org sls= [] site= 1503 +5502 1 n2-2502.plc2.org sls= [] site= 1504 +5503 1 n2-2503.plc2.org sls= [] site= 1505 +5504 1 n2-2504.plc2.org sls= [] site= 1506 +5505 1 n2-2505.plc2.org sls= [] site= 1507 +5506 1 n2-2506.plc2.org sls= [] site= 1508 +5507 1 n2-2507.plc2.org sls= [] site= 1509 +5508 1 n2-2508.plc2.org sls= [] site= 1510 +5509 1 n2-2509.plc2.org sls= [] site= 1511 +5510 1 n2-2510.plc2.org sls= [] site= 1512 +5511 1 n2-2511.plc2.org sls= [] site= 1513 +5512 1 n2-2512.plc2.org sls= [] site= 1514 +5513 1 n2-2513.plc2.org sls= [] site= 1515 +5514 1 n2-2514.plc2.org sls= [] site= 1516 +5515 1 n2-2515.plc2.org sls= [] site= 1517 +5516 1 n2-2516.plc2.org sls= [] site= 1518 +5517 1 n2-2517.plc2.org sls= [] site= 1519 +5518 1 n2-2518.plc2.org sls= [] site= 1520 +5519 1 n2-2519.plc2.org sls= [] site= 1521 +5520 1 n2-2520.plc2.org sls= [] site= 1522 +5521 1 n2-2521.plc2.org sls= [] site= 1523 +5522 1 n2-2522.plc2.org sls= [] site= 1524 +5523 1 n2-2523.plc2.org sls= [] site= 1525 +5524 1 n2-2524.plc2.org sls= [] site= 1526 +5525 1 n2-2525.plc2.org sls= [] site= 1527 +5526 1 n2-2526.plc2.org sls= [] site= 1528 +5527 1 n2-2527.plc2.org sls= [] site= 1529 +5528 1 n2-2528.plc2.org sls= [] site= 1530 +5529 1 n2-2529.plc2.org sls= [] site= 1531 +5530 1 n2-2530.plc2.org sls= [] site= 1532 +5531 1 n2-2531.plc2.org sls= [] site= 1533 +5532 1 n2-2532.plc2.org sls= [] site= 1534 +5533 1 n2-2533.plc2.org sls= [] site= 1535 +5534 1 n2-2534.plc2.org sls= [] site= 1536 +5535 1 n2-2535.plc2.org sls= [] site= 1537 +5536 1 n2-2536.plc2.org sls= [] site= 1538 +5537 1 n2-2537.plc2.org sls= [] site= 1539 +5538 1 n2-2538.plc2.org sls= [] site= 1540 +5539 1 n2-2539.plc2.org sls= [] site= 1541 +5540 1 n2-2540.plc2.org sls= [] site= 1542 +5541 1 n2-2541.plc2.org sls= [] site= 1543 +5542 1 n2-2542.plc2.org sls= [] site= 1544 +5543 1 n2-2543.plc2.org sls= [] site= 1545 +5544 1 n2-2544.plc2.org sls= [] site= 1546 +5545 1 n2-2545.plc2.org sls= [] site= 1547 +5546 1 n2-2546.plc2.org sls= [] site= 1548 +5547 1 n2-2547.plc2.org sls= [] site= 1549 +5548 1 n2-2548.plc2.org sls= [] site= 1550 +5549 1 n2-2549.plc2.org sls= [] site= 1551 +5550 1 n2-2550.plc2.org sls= [] site= 1552 +5551 1 n2-2551.plc2.org sls= [] site= 1553 +5552 1 n2-2552.plc2.org sls= [] site= 1554 +5553 1 n2-2553.plc2.org sls= [] site= 1555 +5554 1 n2-2554.plc2.org sls= [] site= 1556 +5555 1 n2-2555.plc2.org sls= [] site= 1557 +5556 1 n2-2556.plc2.org sls= [] site= 1558 +5557 1 n2-2557.plc2.org sls= [] site= 1559 +5558 1 n2-2558.plc2.org sls= [] site= 1560 +5559 1 n2-2559.plc2.org sls= [] site= 1561 +5560 1 n2-2560.plc2.org sls= [] site= 1562 +5561 1 n2-2561.plc2.org sls= [] site= 1563 +5562 1 n2-2562.plc2.org sls= [] site= 1564 +5563 1 n2-2563.plc2.org sls= [] site= 1565 +5564 1 n2-2564.plc2.org sls= [] site= 1566 +5565 1 n2-2565.plc2.org sls= [] site= 1567 +5566 1 n2-2566.plc2.org sls= [] site= 1568 +5567 1 n2-2567.plc2.org sls= [] site= 1569 +5568 1 n2-2568.plc2.org sls= [] site= 1570 +5569 1 n2-2569.plc2.org sls= [] site= 1571 +5570 1 n2-2570.plc2.org sls= [] site= 1572 +5571 1 n2-2571.plc2.org sls= [] site= 1573 +5572 1 n2-2572.plc2.org sls= [] site= 1574 +5573 1 n2-2573.plc2.org sls= [] site= 1575 +5574 1 n2-2574.plc2.org sls= [] site= 1576 +5575 1 n2-2575.plc2.org sls= [] site= 1577 +5576 1 n2-2576.plc2.org sls= [] site= 1578 +5577 1 n2-2577.plc2.org sls= [] site= 1579 +5578 1 n2-2578.plc2.org sls= [] site= 1580 +5579 1 n2-2579.plc2.org sls= [] site= 1581 +5580 1 n2-2580.plc2.org sls= [] site= 1582 +5581 1 n2-2581.plc2.org sls= [] site= 1583 +5582 1 n2-2582.plc2.org sls= [] site= 1584 +5583 1 n2-2583.plc2.org sls= [] site= 1585 +5584 1 n2-2584.plc2.org sls= [] site= 1586 +5585 1 n2-2585.plc2.org sls= [] site= 1587 +5586 1 n2-2586.plc2.org sls= [] site= 1588 +5587 1 n2-2587.plc2.org sls= [] site= 1589 +5588 1 n2-2588.plc2.org sls= [] site= 1590 +5589 1 n2-2589.plc2.org sls= [] site= 1591 +5590 1 n2-2590.plc2.org sls= [] site= 1592 +5591 1 n2-2591.plc2.org sls= [] site= 1593 +5592 1 n2-2592.plc2.org sls= [] site= 1594 +5593 1 n2-2593.plc2.org sls= [] site= 1595 +5594 1 n2-2594.plc2.org sls= [] site= 1596 +5595 1 n2-2595.plc2.org sls= [] site= 1597 +5596 1 n2-2596.plc2.org sls= [] site= 1598 +5597 1 n2-2597.plc2.org sls= [] site= 1599 +5598 1 n2-2598.plc2.org sls= [] site= 1600 +5599 1 n2-2599.plc2.org sls= [] site= 1601 +5600 1 n2-2600.plc2.org sls= [] site= 1602 +5601 1 n2-2601.plc2.org sls= [] site= 1603 +5602 1 n2-2602.plc2.org sls= [] site= 1604 +5603 1 n2-2603.plc2.org sls= [] site= 1605 +5604 1 n2-2604.plc2.org sls= [] site= 1606 +5605 1 n2-2605.plc2.org sls= [] site= 1607 +5606 1 n2-2606.plc2.org sls= [] site= 1608 +5607 1 n2-2607.plc2.org sls= [] site= 1609 +5608 1 n2-2608.plc2.org sls= [] site= 1610 +5609 1 n2-2609.plc2.org sls= [] site= 1611 +5610 1 n2-2610.plc2.org sls= [] site= 1612 +5611 1 n2-2611.plc2.org sls= [] site= 1613 +5612 1 n2-2612.plc2.org sls= [] site= 1614 +5613 1 n2-2613.plc2.org sls= [] site= 1615 +5614 1 n2-2614.plc2.org sls= [] site= 1616 +5615 1 n2-2615.plc2.org sls= [] site= 1617 +5616 1 n2-2616.plc2.org sls= [] site= 1618 +5617 1 n2-2617.plc2.org sls= [] site= 1619 +5618 1 n2-2618.plc2.org sls= [] site= 1620 +5619 1 n2-2619.plc2.org sls= [] site= 1621 +5620 1 n2-2620.plc2.org sls= [] site= 1622 +5621 1 n2-2621.plc2.org sls= [] site= 1623 +5622 1 n2-2622.plc2.org sls= [] site= 1624 +5623 1 n2-2623.plc2.org sls= [] site= 1625 +5624 1 n2-2624.plc2.org sls= [] site= 1626 +5625 1 n2-2625.plc2.org sls= [] site= 1627 +5626 1 n2-2626.plc2.org sls= [] site= 1628 +5627 1 n2-2627.plc2.org sls= [] site= 1629 +5628 1 n2-2628.plc2.org sls= [] site= 1630 +5629 1 n2-2629.plc2.org sls= [] site= 1631 +5630 1 n2-2630.plc2.org sls= [] site= 1632 +5631 1 n2-2631.plc2.org sls= [] site= 1633 +5632 1 n2-2632.plc2.org sls= [] site= 1634 +5633 1 n2-2633.plc2.org sls= [] site= 1635 +5634 1 n2-2634.plc2.org sls= [] site= 1636 +5635 1 n2-2635.plc2.org sls= [] site= 1637 +5636 1 n2-2636.plc2.org sls= [] site= 1638 +5637 1 n2-2637.plc2.org sls= [] site= 1639 +5638 1 n2-2638.plc2.org sls= [] site= 1640 +5639 1 n2-2639.plc2.org sls= [] site= 1641 +5640 1 n2-2640.plc2.org sls= [] site= 1642 +5641 1 n2-2641.plc2.org sls= [] site= 1643 +5642 1 n2-2642.plc2.org sls= [] site= 1644 +5643 1 n2-2643.plc2.org sls= [] site= 1645 +5644 1 n2-2644.plc2.org sls= [] site= 1646 +5645 1 n2-2645.plc2.org sls= [] site= 1647 +5646 1 n2-2646.plc2.org sls= [] site= 1648 +5647 1 n2-2647.plc2.org sls= [] site= 1649 +5648 1 n2-2648.plc2.org sls= [] site= 1650 +5649 1 n2-2649.plc2.org sls= [] site= 1651 +5650 1 n2-2650.plc2.org sls= [] site= 1652 +5651 1 n2-2651.plc2.org sls= [] site= 1653 +5652 1 n2-2652.plc2.org sls= [] site= 1654 +5653 1 n2-2653.plc2.org sls= [] site= 1655 +5654 1 n2-2654.plc2.org sls= [] site= 1656 +5655 1 n2-2655.plc2.org sls= [] site= 1657 +5656 1 n2-2656.plc2.org sls= [] site= 1658 +5657 1 n2-2657.plc2.org sls= [] site= 1659 +5658 1 n2-2658.plc2.org sls= [] site= 1660 +5659 1 n2-2659.plc2.org sls= [] site= 1661 +5660 1 n2-2660.plc2.org sls= [] site= 1662 +5661 1 n2-2661.plc2.org sls= [] site= 1663 +5662 1 n2-2662.plc2.org sls= [] site= 1664 +5663 1 n2-2663.plc2.org sls= [] site= 1665 +5664 1 n2-2664.plc2.org sls= [] site= 1666 +5665 1 n2-2665.plc2.org sls= [] site= 1667 +5666 1 n2-2666.plc2.org sls= [] site= 1668 +5667 1 n2-2667.plc2.org sls= [] site= 1669 +5668 1 n2-2668.plc2.org sls= [] site= 1670 +5669 1 n2-2669.plc2.org sls= [] site= 1671 +5670 1 n2-2670.plc2.org sls= [] site= 1672 +5671 1 n2-2671.plc2.org sls= [] site= 1673 +5672 1 n2-2672.plc2.org sls= [] site= 1674 +5673 1 n2-2673.plc2.org sls= [] site= 1675 +5674 1 n2-2674.plc2.org sls= [] site= 1676 +5675 1 n2-2675.plc2.org sls= [] site= 1677 +5676 1 n2-2676.plc2.org sls= [] site= 1678 +5677 1 n2-2677.plc2.org sls= [] site= 1679 +5678 1 n2-2678.plc2.org sls= [] site= 1680 +5679 1 n2-2679.plc2.org sls= [] site= 1681 +5680 1 n2-2680.plc2.org sls= [] site= 1682 +5681 1 n2-2681.plc2.org sls= [] site= 1683 +5682 1 n2-2682.plc2.org sls= [] site= 1684 +5683 1 n2-2683.plc2.org sls= [] site= 1685 +5684 1 n2-2684.plc2.org sls= [] site= 1686 +5685 1 n2-2685.plc2.org sls= [] site= 1687 +5686 1 n2-2686.plc2.org sls= [] site= 1688 +5687 1 n2-2687.plc2.org sls= [] site= 1689 +5688 1 n2-2688.plc2.org sls= [] site= 1690 +5689 1 n2-2689.plc2.org sls= [] site= 1691 +5690 1 n2-2690.plc2.org sls= [] site= 1692 +5691 1 n2-2691.plc2.org sls= [] site= 1693 +5692 1 n2-2692.plc2.org sls= [] site= 1694 +5693 1 n2-2693.plc2.org sls= [] site= 1695 +5694 1 n2-2694.plc2.org sls= [] site= 1696 +5695 1 n2-2695.plc2.org sls= [] site= 1697 +5696 1 n2-2696.plc2.org sls= [] site= 1698 +5697 1 n2-2697.plc2.org sls= [] site= 1699 +5698 1 n2-2698.plc2.org sls= [] site= 1700 +5699 1 n2-2699.plc2.org sls= [] site= 1701 +5700 1 n2-2700.plc2.org sls= [] site= 1702 +5701 1 n2-2701.plc2.org sls= [] site= 1703 +5702 1 n2-2702.plc2.org sls= [] site= 1704 +5703 1 n2-2703.plc2.org sls= [] site= 1705 +5704 1 n2-2704.plc2.org sls= [] site= 1706 +5705 1 n2-2705.plc2.org sls= [] site= 1707 +5706 1 n2-2706.plc2.org sls= [] site= 1708 +5707 1 n2-2707.plc2.org sls= [] site= 1709 +5708 1 n2-2708.plc2.org sls= [] site= 1710 +5709 1 n2-2709.plc2.org sls= [] site= 1711 +5710 1 n2-2710.plc2.org sls= [] site= 1712 +5711 1 n2-2711.plc2.org sls= [] site= 1713 +5712 1 n2-2712.plc2.org sls= [] site= 1714 +5713 1 n2-2713.plc2.org sls= [] site= 1715 +5714 1 n2-2714.plc2.org sls= [] site= 1716 +5715 1 n2-2715.plc2.org sls= [] site= 1717 +5716 1 n2-2716.plc2.org sls= [] site= 1718 +5717 1 n2-2717.plc2.org sls= [] site= 1719 +5718 1 n2-2718.plc2.org sls= [] site= 1720 +5719 1 n2-2719.plc2.org sls= [] site= 1721 +5720 1 n2-2720.plc2.org sls= [] site= 1722 +5721 1 n2-2721.plc2.org sls= [] site= 1723 +5722 1 n2-2722.plc2.org sls= [] site= 1724 +5723 1 n2-2723.plc2.org sls= [] site= 1725 +5724 1 n2-2724.plc2.org sls= [] site= 1726 +5725 1 n2-2725.plc2.org sls= [] site= 1727 +5726 1 n2-2726.plc2.org sls= [] site= 1728 +5727 1 n2-2727.plc2.org sls= [] site= 1729 +5728 1 n2-2728.plc2.org sls= [] site= 1730 +5729 1 n2-2729.plc2.org sls= [] site= 1731 +5730 1 n2-2730.plc2.org sls= [] site= 1732 +5731 1 n2-2731.plc2.org sls= [] site= 1733 +5732 1 n2-2732.plc2.org sls= [] site= 1734 +5733 1 n2-2733.plc2.org sls= [] site= 1735 +5734 1 n2-2734.plc2.org sls= [] site= 1736 +5735 1 n2-2735.plc2.org sls= [] site= 1737 +5736 1 n2-2736.plc2.org sls= [] site= 1738 +5737 1 n2-2737.plc2.org sls= [] site= 1739 +5738 1 n2-2738.plc2.org sls= [] site= 1740 +5739 1 n2-2739.plc2.org sls= [] site= 1741 +5740 1 n2-2740.plc2.org sls= [] site= 1742 +5741 1 n2-2741.plc2.org sls= [] site= 1743 +5742 1 n2-2742.plc2.org sls= [] site= 1744 +5743 1 n2-2743.plc2.org sls= [] site= 1745 +5744 1 n2-2744.plc2.org sls= [] site= 1746 +5745 1 n2-2745.plc2.org sls= [] site= 1747 +5746 1 n2-2746.plc2.org sls= [] site= 1748 +5747 1 n2-2747.plc2.org sls= [] site= 1749 +5748 1 n2-2748.plc2.org sls= [] site= 1750 +5749 1 n2-2749.plc2.org sls= [] site= 1751 +5750 1 n2-2750.plc2.org sls= [] site= 1752 +5751 1 n2-2751.plc2.org sls= [] site= 1753 +5752 1 n2-2752.plc2.org sls= [] site= 1754 +5753 1 n2-2753.plc2.org sls= [] site= 1755 +5754 1 n2-2754.plc2.org sls= [] site= 1756 +5755 1 n2-2755.plc2.org sls= [] site= 1757 +5756 1 n2-2756.plc2.org sls= [] site= 1758 +5757 1 n2-2757.plc2.org sls= [] site= 1759 +5758 1 n2-2758.plc2.org sls= [] site= 1760 +5759 1 n2-2759.plc2.org sls= [] site= 1761 +5760 1 n2-2760.plc2.org sls= [] site= 1762 +5761 1 n2-2761.plc2.org sls= [] site= 1763 +5762 1 n2-2762.plc2.org sls= [] site= 1764 +5763 1 n2-2763.plc2.org sls= [] site= 1765 +5764 1 n2-2764.plc2.org sls= [] site= 1766 +5765 1 n2-2765.plc2.org sls= [] site= 1767 +5766 1 n2-2766.plc2.org sls= [] site= 1768 +5767 1 n2-2767.plc2.org sls= [] site= 1769 +5768 1 n2-2768.plc2.org sls= [] site= 1770 +5769 1 n2-2769.plc2.org sls= [] site= 1771 +5770 1 n2-2770.plc2.org sls= [] site= 1772 +5771 1 n2-2771.plc2.org sls= [] site= 1773 +5772 1 n2-2772.plc2.org sls= [] site= 1774 +5773 1 n2-2773.plc2.org sls= [] site= 1775 +5774 1 n2-2774.plc2.org sls= [] site= 1776 +5775 1 n2-2775.plc2.org sls= [] site= 1777 +5776 1 n2-2776.plc2.org sls= [] site= 1778 +5777 1 n2-2777.plc2.org sls= [] site= 1779 +5778 1 n2-2778.plc2.org sls= [] site= 1780 +5779 1 n2-2779.plc2.org sls= [] site= 1781 +5780 1 n2-2780.plc2.org sls= [] site= 1782 +5781 1 n2-2781.plc2.org sls= [] site= 1783 +5782 1 n2-2782.plc2.org sls= [] site= 1784 +5783 1 n2-2783.plc2.org sls= [] site= 1785 +5784 1 n2-2784.plc2.org sls= [] site= 1786 +5785 1 n2-2785.plc2.org sls= [] site= 1787 +5786 1 n2-2786.plc2.org sls= [] site= 1788 +5787 1 n2-2787.plc2.org sls= [] site= 1789 +5788 1 n2-2788.plc2.org sls= [] site= 1790 +5789 1 n2-2789.plc2.org sls= [] site= 1791 +5790 1 n2-2790.plc2.org sls= [] site= 1792 +5791 1 n2-2791.plc2.org sls= [] site= 1793 +5792 1 n2-2792.plc2.org sls= [] site= 1794 +5793 1 n2-2793.plc2.org sls= [] site= 1795 +5794 1 n2-2794.plc2.org sls= [] site= 1796 +5795 1 n2-2795.plc2.org sls= [] site= 1797 +5796 1 n2-2796.plc2.org sls= [] site= 1798 +5797 1 n2-2797.plc2.org sls= [] site= 1799 +5798 1 n2-2798.plc2.org sls= [] site= 1800 +5799 1 n2-2799.plc2.org sls= [] site= 1801 +5800 1 n2-2800.plc2.org sls= [] site= 1802 +5801 1 n2-2801.plc2.org sls= [] site= 1803 +5802 1 n2-2802.plc2.org sls= [] site= 1804 +5803 1 n2-2803.plc2.org sls= [] site= 1805 +5804 1 n2-2804.plc2.org sls= [] site= 1806 +5805 1 n2-2805.plc2.org sls= [] site= 1807 +5806 1 n2-2806.plc2.org sls= [] site= 1808 +5807 1 n2-2807.plc2.org sls= [] site= 1809 +5808 1 n2-2808.plc2.org sls= [] site= 1810 +5809 1 n2-2809.plc2.org sls= [] site= 1811 +5810 1 n2-2810.plc2.org sls= [] site= 1812 +5811 1 n2-2811.plc2.org sls= [] site= 1813 +5812 1 n2-2812.plc2.org sls= [] site= 1814 +5813 1 n2-2813.plc2.org sls= [] site= 1815 +5814 1 n2-2814.plc2.org sls= [] site= 1816 +5815 1 n2-2815.plc2.org sls= [] site= 1817 +5816 1 n2-2816.plc2.org sls= [] site= 1818 +5817 1 n2-2817.plc2.org sls= [] site= 1819 +5818 1 n2-2818.plc2.org sls= [] site= 1820 +5819 1 n2-2819.plc2.org sls= [] site= 1821 +5820 1 n2-2820.plc2.org sls= [] site= 1822 +5821 1 n2-2821.plc2.org sls= [] site= 1823 +5822 1 n2-2822.plc2.org sls= [] site= 1824 +5823 1 n2-2823.plc2.org sls= [] site= 1825 +5824 1 n2-2824.plc2.org sls= [] site= 1826 +5825 1 n2-2825.plc2.org sls= [] site= 1827 +5826 1 n2-2826.plc2.org sls= [] site= 1828 +5827 1 n2-2827.plc2.org sls= [] site= 1829 +5828 1 n2-2828.plc2.org sls= [] site= 1830 +5829 1 n2-2829.plc2.org sls= [] site= 1831 +5830 1 n2-2830.plc2.org sls= [] site= 1832 +5831 1 n2-2831.plc2.org sls= [] site= 1833 +5832 1 n2-2832.plc2.org sls= [] site= 1834 +5833 1 n2-2833.plc2.org sls= [] site= 1835 +5834 1 n2-2834.plc2.org sls= [] site= 1836 +5835 1 n2-2835.plc2.org sls= [] site= 1837 +5836 1 n2-2836.plc2.org sls= [] site= 1838 +5837 1 n2-2837.plc2.org sls= [] site= 1839 +5838 1 n2-2838.plc2.org sls= [] site= 1840 +5839 1 n2-2839.plc2.org sls= [] site= 1841 +5840 1 n2-2840.plc2.org sls= [] site= 1842 +5841 1 n2-2841.plc2.org sls= [] site= 1843 +5842 1 n2-2842.plc2.org sls= [] site= 1844 +5843 1 n2-2843.plc2.org sls= [] site= 1845 +5844 1 n2-2844.plc2.org sls= [] site= 1846 +5845 1 n2-2845.plc2.org sls= [] site= 1847 +5846 1 n2-2846.plc2.org sls= [] site= 1848 +5847 1 n2-2847.plc2.org sls= [] site= 1849 +5848 1 n2-2848.plc2.org sls= [] site= 1850 +5849 1 n2-2849.plc2.org sls= [] site= 1851 +5850 1 n2-2850.plc2.org sls= [] site= 1852 +5851 1 n2-2851.plc2.org sls= [] site= 1853 +5852 1 n2-2852.plc2.org sls= [] site= 1854 +5853 1 n2-2853.plc2.org sls= [] site= 1855 +5854 1 n2-2854.plc2.org sls= [] site= 1856 +5855 1 n2-2855.plc2.org sls= [] site= 1857 +5856 1 n2-2856.plc2.org sls= [] site= 1858 +5857 1 n2-2857.plc2.org sls= [] site= 1859 +5858 1 n2-2858.plc2.org sls= [] site= 1860 +5859 1 n2-2859.plc2.org sls= [] site= 1861 +5860 1 n2-2860.plc2.org sls= [] site= 1862 +5861 1 n2-2861.plc2.org sls= [] site= 1863 +5862 1 n2-2862.plc2.org sls= [] site= 1864 +5863 1 n2-2863.plc2.org sls= [] site= 1865 +5864 1 n2-2864.plc2.org sls= [] site= 1866 +5865 1 n2-2865.plc2.org sls= [] site= 1867 +5866 1 n2-2866.plc2.org sls= [] site= 1868 +5867 1 n2-2867.plc2.org sls= [] site= 1869 +5868 1 n2-2868.plc2.org sls= [] site= 1870 +5869 1 n2-2869.plc2.org sls= [] site= 1871 +5870 1 n2-2870.plc2.org sls= [] site= 1872 +5871 1 n2-2871.plc2.org sls= [] site= 1873 +5872 1 n2-2872.plc2.org sls= [] site= 1874 +5873 1 n2-2873.plc2.org sls= [] site= 1875 +5874 1 n2-2874.plc2.org sls= [] site= 1876 +5875 1 n2-2875.plc2.org sls= [] site= 1877 +5876 1 n2-2876.plc2.org sls= [] site= 1878 +5877 1 n2-2877.plc2.org sls= [] site= 1879 +5878 1 n2-2878.plc2.org sls= [] site= 1880 +5879 1 n2-2879.plc2.org sls= [] site= 1881 +5880 1 n2-2880.plc2.org sls= [] site= 1882 +5881 1 n2-2881.plc2.org sls= [] site= 1883 +5882 1 n2-2882.plc2.org sls= [] site= 1884 +5883 1 n2-2883.plc2.org sls= [] site= 1885 +5884 1 n2-2884.plc2.org sls= [] site= 1886 +5885 1 n2-2885.plc2.org sls= [] site= 1887 +5886 1 n2-2886.plc2.org sls= [] site= 1888 +5887 1 n2-2887.plc2.org sls= [] site= 1889 +5888 1 n2-2888.plc2.org sls= [] site= 1890 +5889 1 n2-2889.plc2.org sls= [] site= 1891 +5890 1 n2-2890.plc2.org sls= [] site= 1892 +5891 1 n2-2891.plc2.org sls= [] site= 1893 +5892 1 n2-2892.plc2.org sls= [] site= 1894 +5893 1 n2-2893.plc2.org sls= [] site= 1895 +5894 1 n2-2894.plc2.org sls= [] site= 1896 +5895 1 n2-2895.plc2.org sls= [] site= 1897 +5896 1 n2-2896.plc2.org sls= [] site= 1898 +5897 1 n2-2897.plc2.org sls= [] site= 1899 +5898 1 n2-2898.plc2.org sls= [] site= 1900 +5899 1 n2-2899.plc2.org sls= [] site= 1901 +5900 1 n2-2900.plc2.org sls= [] site= 1902 +5901 1 n2-2901.plc2.org sls= [] site= 1903 +5902 1 n2-2902.plc2.org sls= [] site= 1904 +5903 1 n2-2903.plc2.org sls= [] site= 1905 +5904 1 n2-2904.plc2.org sls= [] site= 1906 +5905 1 n2-2905.plc2.org sls= [] site= 1907 +5906 1 n2-2906.plc2.org sls= [] site= 1908 +5907 1 n2-2907.plc2.org sls= [] site= 1909 +5908 1 n2-2908.plc2.org sls= [] site= 1910 +5909 1 n2-2909.plc2.org sls= [] site= 1911 +5910 1 n2-2910.plc2.org sls= [] site= 1912 +5911 1 n2-2911.plc2.org sls= [] site= 1913 +5912 1 n2-2912.plc2.org sls= [] site= 1914 +5913 1 n2-2913.plc2.org sls= [] site= 1915 +5914 1 n2-2914.plc2.org sls= [] site= 1916 +5915 1 n2-2915.plc2.org sls= [] site= 1917 +5916 1 n2-2916.plc2.org sls= [] site= 1918 +5917 1 n2-2917.plc2.org sls= [] site= 1919 +5918 1 n2-2918.plc2.org sls= [] site= 1920 +5919 1 n2-2919.plc2.org sls= [] site= 1921 +5920 1 n2-2920.plc2.org sls= [] site= 1922 +5921 1 n2-2921.plc2.org sls= [] site= 1923 +5922 1 n2-2922.plc2.org sls= [] site= 1924 +5923 1 n2-2923.plc2.org sls= [] site= 1925 +5924 1 n2-2924.plc2.org sls= [] site= 1926 +5925 1 n2-2925.plc2.org sls= [] site= 1927 +5926 1 n2-2926.plc2.org sls= [] site= 1928 +5927 1 n2-2927.plc2.org sls= [] site= 1929 +5928 1 n2-2928.plc2.org sls= [] site= 1930 +5929 1 n2-2929.plc2.org sls= [] site= 1931 +5930 1 n2-2930.plc2.org sls= [] site= 1932 +5931 1 n2-2931.plc2.org sls= [] site= 1933 +5932 1 n2-2932.plc2.org sls= [] site= 1934 +5933 1 n2-2933.plc2.org sls= [] site= 1935 +5934 1 n2-2934.plc2.org sls= [] site= 1936 +5935 1 n2-2935.plc2.org sls= [] site= 1937 +5936 1 n2-2936.plc2.org sls= [] site= 1938 +5937 1 n2-2937.plc2.org sls= [] site= 1939 +5938 1 n2-2938.plc2.org sls= [] site= 1940 +5939 1 n2-2939.plc2.org sls= [] site= 1941 +5940 1 n2-2940.plc2.org sls= [] site= 1942 +5941 1 n2-2941.plc2.org sls= [] site= 1943 +5942 1 n2-2942.plc2.org sls= [] site= 1944 +5943 1 n2-2943.plc2.org sls= [] site= 1945 +5944 1 n2-2944.plc2.org sls= [] site= 1946 +5945 1 n2-2945.plc2.org sls= [] site= 1947 +5946 1 n2-2946.plc2.org sls= [] site= 1948 +5947 1 n2-2947.plc2.org sls= [] site= 1949 +5948 1 n2-2948.plc2.org sls= [] site= 1950 +5949 1 n2-2949.plc2.org sls= [] site= 1951 +5950 1 n2-2950.plc2.org sls= [] site= 1952 +5951 1 n2-2951.plc2.org sls= [] site= 1953 +5952 1 n2-2952.plc2.org sls= [] site= 1954 +5953 1 n2-2953.plc2.org sls= [] site= 1955 +5954 1 n2-2954.plc2.org sls= [] site= 1956 +5955 1 n2-2955.plc2.org sls= [] site= 1957 +5956 1 n2-2956.plc2.org sls= [] site= 1958 +5957 1 n2-2957.plc2.org sls= [] site= 1959 +5958 1 n2-2958.plc2.org sls= [] site= 1960 +5959 1 n2-2959.plc2.org sls= [] site= 1961 +5960 1 n2-2960.plc2.org sls= [] site= 1962 +5961 1 n2-2961.plc2.org sls= [] site= 1963 +5962 1 n2-2962.plc2.org sls= [] site= 1964 +5963 1 n2-2963.plc2.org sls= [] site= 1965 +5964 1 n2-2964.plc2.org sls= [] site= 1966 +5965 1 n2-2965.plc2.org sls= [] site= 1967 +5966 1 n2-2966.plc2.org sls= [] site= 1968 +5967 1 n2-2967.plc2.org sls= [] site= 1969 +5968 1 n2-2968.plc2.org sls= [] site= 1970 +5969 1 n2-2969.plc2.org sls= [] site= 1971 +5970 1 n2-2970.plc2.org sls= [] site= 1972 +5971 1 n2-2971.plc2.org sls= [] site= 1973 +5972 1 n2-2972.plc2.org sls= [] site= 1974 +5973 1 n2-2973.plc2.org sls= [] site= 1975 +5974 1 n2-2974.plc2.org sls= [] site= 1976 +5975 1 n2-2975.plc2.org sls= [] site= 1977 +5976 1 n2-2976.plc2.org sls= [] site= 1978 +5977 1 n2-2977.plc2.org sls= [] site= 1979 +5978 1 n2-2978.plc2.org sls= [] site= 1980 +5979 1 n2-2979.plc2.org sls= [] site= 1981 +5980 1 n2-2980.plc2.org sls= [] site= 1982 +5981 1 n2-2981.plc2.org sls= [] site= 1983 +5982 1 n2-2982.plc2.org sls= [] site= 1984 +5983 1 n2-2983.plc2.org sls= [] site= 1985 +5984 1 n2-2984.plc2.org sls= [] site= 1986 +5985 1 n2-2985.plc2.org sls= [] site= 1987 +5986 1 n2-2986.plc2.org sls= [] site= 1988 +5987 1 n2-2987.plc2.org sls= [] site= 1989 +5988 1 n2-2988.plc2.org sls= [] site= 1990 +5989 1 n2-2989.plc2.org sls= [] site= 1991 +5990 1 n2-2990.plc2.org sls= [] site= 1992 +5991 1 n2-2991.plc2.org sls= [] site= 1993 +5992 1 n2-2992.plc2.org sls= [] site= 1994 +5993 1 n2-2993.plc2.org sls= [] site= 1995 +5994 1 n2-2994.plc2.org sls= [] site= 1996 +5995 1 n2-2995.plc2.org sls= [] site= 1997 +5996 1 n2-2996.plc2.org sls= [] site= 1998 +5997 1 n2-2997.plc2.org sls= [] site= 1999 +5998 1 n2-2998.plc2.org sls= [] site= 2000 +5999 1 n2-2999.plc2.org sls= [] site= 2001 +6000 1 n2-3000.plc2.org sls= [] site= 2002 +01: SLICES +1 None thone_netflow nodes= [] persons= [] +--- sas= [1, 2, 3, 4, 5] thone_netflow crp= 1 +--- 'expires': 1167126457 +2 None oneb_slice1 nodes= [1, 2, 3, 3001, 3002, 3003] persons= [5, 6, 7] +--- sas= [6, 7, 8, 9] oneb_slice1 crp= 1 +--- 'expires': 1167126821 +3 None onec_slice2 nodes= [2, 3, 4, 3002, 3003, 3004] persons= [6, 7, 8] +--- sas= [] onec_slice2 crp= 1 +--- 'expires': 1167126821 +4 None oned_slice3 nodes= [3, 4, 5, 3003, 3004, 3005] persons= [7, 8, 9] +--- sas= [] oned_slice3 crp= 1 +--- 'expires': 1167126821 +5 None onee_slice4 nodes= [4, 5, 6, 3004, 3005, 3006] persons= [8, 9, 10] +--- sas= [] onee_slice4 crp= 1 +--- 'expires': 1167126822 +6 None onef_slice5 nodes= [5, 6, 7, 3005, 3006, 3007] persons= [9, 10, 11] +--- sas= [] onef_slice5 crp= 1 +--- 'expires': 1167126822 +7 None oneg_slice6 nodes= [6, 7, 8, 3006, 3007, 3008] persons= [10, 11, 12] +--- sas= [] oneg_slice6 crp= 1 +--- 'expires': 1167126822 +8 None oneh_slice7 nodes= [7, 8, 9, 3007, 3008, 3009] persons= [11, 12, 13] +--- sas= [] oneh_slice7 crp= 1 +--- 'expires': 1167126822 +9 None onei_slice8 nodes= [8, 9, 10, 3008, 3009, 3010] persons= [12, 13, 14] +--- sas= [] onei_slice8 crp= 1 +--- 'expires': 1167126822 +10 None onej_slice9 nodes= [9, 10, 11, 3009, 3010, 3011] persons= [13, 14, 15] +--- sas= [] onej_slice9 crp= 1 +--- 'expires': 1167126823 +11 None oneba_slice10 nodes= [10, 11, 12, 3010, 3011, 3012] persons= [14, 15, 16] +--- sas= [] oneba_slice10 crp= 1 +--- 'expires': 1167126823 +12 None onebb_slice11 nodes= [11, 12, 13, 3011, 3012, 3013] persons= [15, 16, 17] +--- sas= [] onebb_slice11 crp= 1 +--- 'expires': 1167126823 +13 None onebc_slice12 nodes= [12, 13, 14, 3012, 3013, 3014] persons= [16, 17, 18] +--- sas= [] onebc_slice12 crp= 1 +--- 'expires': 1167126823 +14 None onebd_slice13 nodes= [13, 14, 15, 3013, 3014, 3015] persons= [17, 18, 19] +--- sas= [] onebd_slice13 crp= 1 +--- 'expires': 1167126823 +15 None onebe_slice14 nodes= [14, 15, 16, 3014, 3015, 3016] persons= [18, 19, 20] +--- sas= [] onebe_slice14 crp= 1 +--- 'expires': 1167126824 +16 None onebf_slice15 nodes= [15, 16, 17, 3015, 3016, 3017] persons= [19, 20, 21] +--- sas= [] onebf_slice15 crp= 1 +--- 'expires': 1167126824 +17 None onebg_slice16 nodes= [16, 17, 18, 3016, 3017, 3018] persons= [20, 21, 22] +--- sas= [] onebg_slice16 crp= 1 +--- 'expires': 1167126824 +18 None onebh_slice17 nodes= [17, 18, 19, 3017, 3018, 3019] persons= [21, 22, 23] +--- sas= [] onebh_slice17 crp= 1 +--- 'expires': 1167126824 +19 None onebi_slice18 nodes= [18, 19, 20, 3018, 3019, 3020] persons= [22, 23, 24] +--- sas= [] onebi_slice18 crp= 1 +--- 'expires': 1167126824 +20 None onebj_slice19 nodes= [19, 20, 21, 3019, 3020, 3021] persons= [23, 24, 25] +--- sas= [] onebj_slice19 crp= 1 +--- 'expires': 1167126824 +21 None oneca_slice20 nodes= [20, 21, 22, 3020, 3021, 3022] persons= [24, 25, 26] +--- sas= [] oneca_slice20 crp= 1 +--- 'expires': 1167126825 +22 None onecb_slice21 nodes= [21, 22, 23, 3021, 3022, 3023] persons= [25, 26, 27] +--- sas= [] onecb_slice21 crp= 1 +--- 'expires': 1167126825 +23 None onecc_slice22 nodes= [22, 23, 24, 3022, 3023, 3024] persons= [26, 27, 28] +--- sas= [] onecc_slice22 crp= 1 +--- 'expires': 1167126825 +24 None onecd_slice23 nodes= [23, 24, 25, 3023, 3024, 3025] persons= [27, 28, 29] +--- sas= [] onecd_slice23 crp= 1 +--- 'expires': 1167126825 +25 None onece_slice24 nodes= [24, 25, 26, 3024, 3025, 3026] persons= [28, 29, 30] +--- sas= [] onece_slice24 crp= 1 +--- 'expires': 1167126825 +26 None onecf_slice25 nodes= [25, 26, 27, 3025, 3026, 3027] persons= [29, 30, 31] +--- sas= [] onecf_slice25 crp= 1 +--- 'expires': 1167126826 +27 None onecg_slice26 nodes= [26, 27, 28, 3026, 3027, 3028] persons= [30, 31, 32] +--- sas= [] onecg_slice26 crp= 1 +--- 'expires': 1167126826 +28 None onech_slice27 nodes= [27, 28, 29, 3027, 3028, 3029] persons= [31, 32, 33] +--- sas= [] onech_slice27 crp= 1 +--- 'expires': 1167126826 +29 None oneci_slice28 nodes= [28, 29, 30, 3028, 3029, 3030] persons= [32, 33, 34] +--- sas= [] oneci_slice28 crp= 1 +--- 'expires': 1167126826 +30 None onecj_slice29 nodes= [29, 30, 31, 3029, 3030, 3031] persons= [33, 34, 35] +--- sas= [] onecj_slice29 crp= 1 +--- 'expires': 1167126826 +31 None oneda_slice30 nodes= [30, 31, 32, 3030, 3031, 3032] persons= [34, 35, 36] +--- sas= [] oneda_slice30 crp= 1 +--- 'expires': 1167126827 +32 None onedb_slice31 nodes= [31, 32, 33, 3031, 3032, 3033] persons= [35, 36, 37] +--- sas= [] onedb_slice31 crp= 1 +--- 'expires': 1167126827 +33 None onedc_slice32 nodes= [32, 33, 34, 3032, 3033, 3034] persons= [36, 37, 38] +--- sas= [] onedc_slice32 crp= 1 +--- 'expires': 1167126827 +34 None onedd_slice33 nodes= [33, 34, 35, 3033, 3034, 3035] persons= [37, 38, 39] +--- sas= [] onedd_slice33 crp= 1 +--- 'expires': 1167126827 +35 None onede_slice34 nodes= [34, 35, 36, 3034, 3035, 3036] persons= [38, 39, 40] +--- sas= [] onede_slice34 crp= 1 +--- 'expires': 1167126827 +36 None onedf_slice35 nodes= [35, 36, 37, 3035, 3036, 3037] persons= [39, 40, 41] +--- sas= [] onedf_slice35 crp= 1 +--- 'expires': 1167126828 +37 None onedg_slice36 nodes= [36, 37, 38, 3036, 3037, 3038] persons= [40, 41, 42] +--- sas= [] onedg_slice36 crp= 1 +--- 'expires': 1167126828 +38 None onedh_slice37 nodes= [37, 38, 39, 3037, 3038, 3039] persons= [41, 42, 43] +--- sas= [] onedh_slice37 crp= 1 +--- 'expires': 1167126828 +39 None onedi_slice38 nodes= [38, 39, 40, 3038, 3039, 3040] persons= [42, 43, 44] +--- sas= [] onedi_slice38 crp= 1 +--- 'expires': 1167126828 +40 None onedj_slice39 nodes= [39, 40, 41, 3039, 3040, 3041] persons= [43, 44, 45] +--- sas= [] onedj_slice39 crp= 1 +--- 'expires': 1167126828 +41 None oneea_slice40 nodes= [40, 41, 42, 3040, 3041, 3042] persons= [44, 45, 46] +--- sas= [] oneea_slice40 crp= 1 +--- 'expires': 1167126828 +42 None oneeb_slice41 nodes= [41, 42, 43, 3041, 3042, 3043] persons= [45, 46, 47] +--- sas= [] oneeb_slice41 crp= 1 +--- 'expires': 1167126829 +43 None oneec_slice42 nodes= [42, 43, 44, 3042, 3043, 3044] persons= [46, 47, 48] +--- sas= [] oneec_slice42 crp= 1 +--- 'expires': 1167126829 +44 None oneed_slice43 nodes= [43, 44, 45, 3043, 3044, 3045] persons= [47, 48, 49] +--- sas= [] oneed_slice43 crp= 1 +--- 'expires': 1167126829 +45 None oneee_slice44 nodes= [44, 45, 46, 3044, 3045, 3046] persons= [48, 49, 50] +--- sas= [] oneee_slice44 crp= 1 +--- 'expires': 1167126829 +46 None oneef_slice45 nodes= [45, 46, 47, 3045, 3046, 3047] persons= [49, 50, 51] +--- sas= [] oneef_slice45 crp= 1 +--- 'expires': 1167126829 +47 None oneeg_slice46 nodes= [46, 47, 48, 3046, 3047, 3048] persons= [50, 51, 52] +--- sas= [] oneeg_slice46 crp= 1 +--- 'expires': 1167126830 +48 None oneeh_slice47 nodes= [47, 48, 49, 3047, 3048, 3049] persons= [51, 52, 53] +--- sas= [] oneeh_slice47 crp= 1 +--- 'expires': 1167126830 +49 None oneei_slice48 nodes= [48, 49, 50, 3048, 3049, 3050] persons= [52, 53, 54] +--- sas= [] oneei_slice48 crp= 1 +--- 'expires': 1167126830 +50 None oneej_slice49 nodes= [49, 50, 51, 3049, 3050, 3051] persons= [53, 54, 55] +--- sas= [] oneej_slice49 crp= 1 +--- 'expires': 1167126830 +51 None onefa_slice50 nodes= [50, 51, 52, 3050, 3051, 3052] persons= [54, 55, 56] +--- sas= [] onefa_slice50 crp= 1 +--- 'expires': 1167126830 +52 None onefb_slice51 nodes= [51, 52, 53, 3051, 3052, 3053] persons= [55, 56, 57] +--- sas= [] onefb_slice51 crp= 1 +--- 'expires': 1167126831 +53 None onefc_slice52 nodes= [52, 53, 54, 3052, 3053, 3054] persons= [56, 57, 58] +--- sas= [] onefc_slice52 crp= 1 +--- 'expires': 1167126831 +54 None onefd_slice53 nodes= [53, 54, 55, 3053, 3054, 3055] persons= [57, 58, 59] +--- sas= [] onefd_slice53 crp= 1 +--- 'expires': 1167126831 +55 None onefe_slice54 nodes= [54, 55, 56, 3054, 3055, 3056] persons= [58, 59, 60] +--- sas= [] onefe_slice54 crp= 1 +--- 'expires': 1167126831 +56 None oneff_slice55 nodes= [55, 56, 57, 3055, 3056, 3057] persons= [59, 60, 61] +--- sas= [] oneff_slice55 crp= 1 +--- 'expires': 1167126831 +57 None onefg_slice56 nodes= [56, 57, 58, 3056, 3057, 3058] persons= [60, 61, 62] +--- sas= [] onefg_slice56 crp= 1 +--- 'expires': 1167126832 +58 None onefh_slice57 nodes= [57, 58, 59, 3057, 3058, 3059] persons= [61, 62, 63] +--- sas= [] onefh_slice57 crp= 1 +--- 'expires': 1167126832 +59 None onefi_slice58 nodes= [58, 59, 60, 3058, 3059, 3060] persons= [62, 63, 64] +--- sas= [] onefi_slice58 crp= 1 +--- 'expires': 1167126832 +60 None onefj_slice59 nodes= [59, 60, 61, 3059, 3060, 3061] persons= [63, 64, 65] +--- sas= [] onefj_slice59 crp= 1 +--- 'expires': 1167126832 +61 None onega_slice60 nodes= [60, 61, 62, 3060, 3061, 3062] persons= [64, 65, 66] +--- sas= [] onega_slice60 crp= 1 +--- 'expires': 1167126832 +62 None onegb_slice61 nodes= [61, 62, 63, 3061, 3062, 3063] persons= [65, 66, 67] +--- sas= [] onegb_slice61 crp= 1 +--- 'expires': 1167126833 +63 None onegc_slice62 nodes= [62, 63, 64, 3062, 3063, 3064] persons= [66, 67, 68] +--- sas= [] onegc_slice62 crp= 1 +--- 'expires': 1167126833 +64 None onegd_slice63 nodes= [63, 64, 65, 3063, 3064, 3065] persons= [67, 68, 69] +--- sas= [] onegd_slice63 crp= 1 +--- 'expires': 1167126833 +65 None onege_slice64 nodes= [64, 65, 66, 3064, 3065, 3066] persons= [68, 69, 70] +--- sas= [] onege_slice64 crp= 1 +--- 'expires': 1167126833 +66 None onegf_slice65 nodes= [65, 66, 67, 3065, 3066, 3067] persons= [69, 70, 71] +--- sas= [] onegf_slice65 crp= 1 +--- 'expires': 1167126833 +67 None onegg_slice66 nodes= [66, 67, 68, 3066, 3067, 3068] persons= [70, 71, 72] +--- sas= [] onegg_slice66 crp= 1 +--- 'expires': 1167126834 +68 None onegh_slice67 nodes= [67, 68, 69, 3067, 3068, 3069] persons= [71, 72, 73] +--- sas= [] onegh_slice67 crp= 1 +--- 'expires': 1167126834 +69 None onegi_slice68 nodes= [68, 69, 70, 3068, 3069, 3070] persons= [72, 73, 74] +--- sas= [] onegi_slice68 crp= 1 +--- 'expires': 1167126834 +70 None onegj_slice69 nodes= [69, 70, 71, 3069, 3070, 3071] persons= [73, 74, 75] +--- sas= [] onegj_slice69 crp= 1 +--- 'expires': 1167126834 +71 None oneha_slice70 nodes= [70, 71, 72, 3070, 3071, 3072] persons= [74, 75, 76] +--- sas= [] oneha_slice70 crp= 1 +--- 'expires': 1167126834 +72 None onehb_slice71 nodes= [71, 72, 73, 3071, 3072, 3073] persons= [75, 76, 77] +--- sas= [] onehb_slice71 crp= 1 +--- 'expires': 1167126835 +73 None onehc_slice72 nodes= [72, 73, 74, 3072, 3073, 3074] persons= [76, 77, 78] +--- sas= [] onehc_slice72 crp= 1 +--- 'expires': 1167126835 +74 None onehd_slice73 nodes= [73, 74, 75, 3073, 3074, 3075] persons= [77, 78, 79] +--- sas= [] onehd_slice73 crp= 1 +--- 'expires': 1167126835 +75 None onehe_slice74 nodes= [74, 75, 76, 3074, 3075, 3076] persons= [78, 79, 80] +--- sas= [] onehe_slice74 crp= 1 +--- 'expires': 1167126835 +76 None onehf_slice75 nodes= [75, 76, 77, 3075, 3076, 3077] persons= [79, 80, 81] +--- sas= [] onehf_slice75 crp= 1 +--- 'expires': 1167126835 +77 None onehg_slice76 nodes= [76, 77, 78, 3076, 3077, 3078] persons= [80, 81, 82] +--- sas= [] onehg_slice76 crp= 1 +--- 'expires': 1167126836 +78 None onehh_slice77 nodes= [77, 78, 79, 3077, 3078, 3079] persons= [81, 82, 83] +--- sas= [] onehh_slice77 crp= 1 +--- 'expires': 1167126836 +79 None onehi_slice78 nodes= [78, 79, 80, 3078, 3079, 3080] persons= [82, 83, 84] +--- sas= [] onehi_slice78 crp= 1 +--- 'expires': 1167126836 +80 None onehj_slice79 nodes= [79, 80, 81, 3079, 3080, 3081] persons= [83, 84, 85] +--- sas= [] onehj_slice79 crp= 1 +--- 'expires': 1167126836 +81 None oneia_slice80 nodes= [80, 81, 82, 3080, 3081, 3082] persons= [84, 85, 86] +--- sas= [] oneia_slice80 crp= 1 +--- 'expires': 1167126836 +82 None oneib_slice81 nodes= [81, 82, 83, 3081, 3082, 3083] persons= [85, 86, 87] +--- sas= [] oneib_slice81 crp= 1 +--- 'expires': 1167126836 +83 None oneic_slice82 nodes= [82, 83, 84, 3082, 3083, 3084] persons= [86, 87, 88] +--- sas= [] oneic_slice82 crp= 1 +--- 'expires': 1167126837 +84 None oneid_slice83 nodes= [83, 84, 85, 3083, 3084, 3085] persons= [87, 88, 89] +--- sas= [] oneid_slice83 crp= 1 +--- 'expires': 1167126837 +85 None oneie_slice84 nodes= [84, 85, 86, 3084, 3085, 3086] persons= [88, 89, 90] +--- sas= [] oneie_slice84 crp= 1 +--- 'expires': 1167126837 +86 None oneif_slice85 nodes= [85, 86, 87, 3085, 3086, 3087] persons= [89, 90, 91] +--- sas= [] oneif_slice85 crp= 1 +--- 'expires': 1167126837 +87 None oneig_slice86 nodes= [86, 87, 88, 3086, 3087, 3088] persons= [90, 91, 92] +--- sas= [] oneig_slice86 crp= 1 +--- 'expires': 1167126837 +88 None oneih_slice87 nodes= [87, 88, 89, 3087, 3088, 3089] persons= [91, 92, 93] +--- sas= [] oneih_slice87 crp= 1 +--- 'expires': 1167126838 +89 None oneii_slice88 nodes= [88, 89, 90, 3088, 3089, 3090] persons= [92, 93, 94] +--- sas= [] oneii_slice88 crp= 1 +--- 'expires': 1167126838 +90 None oneij_slice89 nodes= [89, 90, 91, 3089, 3090, 3091] persons= [93, 94, 95] +--- sas= [] oneij_slice89 crp= 1 +--- 'expires': 1167126838 +91 None oneja_slice90 nodes= [90, 91, 92, 3090, 3091, 3092] persons= [94, 95, 96] +--- sas= [] oneja_slice90 crp= 1 +--- 'expires': 1167126838 +92 None onejb_slice91 nodes= [91, 92, 93, 3091, 3092, 3093] persons= [95, 96, 97] +--- sas= [] onejb_slice91 crp= 1 +--- 'expires': 1167126838 +93 None onejc_slice92 nodes= [92, 93, 94, 3092, 3093, 3094] persons= [96, 97, 98] +--- sas= [] onejc_slice92 crp= 1 +--- 'expires': 1167126839 +94 None onejd_slice93 nodes= [93, 94, 95, 3093, 3094, 3095] persons= [97, 98, 99] +--- sas= [] onejd_slice93 crp= 1 +--- 'expires': 1167126839 +95 None oneje_slice94 nodes= [94, 95, 96, 3094, 3095, 3096] persons= [98, 99, 100] +--- sas= [] oneje_slice94 crp= 1 +--- 'expires': 1167126839 +96 None onejf_slice95 nodes= [95, 96, 97, 3095, 3096, 3097] persons= [99, 100, 101] +--- sas= [] onejf_slice95 crp= 1 +--- 'expires': 1167126839 +97 None onejg_slice96 nodes= [96, 97, 98, 3096, 3097, 3098] persons= [100, 101, 102] +--- sas= [] onejg_slice96 crp= 1 +--- 'expires': 1167126839 +98 None onejh_slice97 nodes= [97, 98, 99, 3097, 3098, 3099] persons= [101, 102, 103] +--- sas= [] onejh_slice97 crp= 1 +--- 'expires': 1167126840 +99 None oneji_slice98 nodes= [98, 99, 100, 3098, 3099, 3100] persons= [102, 103, 104] +--- sas= [] oneji_slice98 crp= 1 +--- 'expires': 1167126840 +100 None onejj_slice99 nodes= [99, 100, 101, 3099, 3100, 3101] persons= [103, 104, 105] +--- sas= [] onejj_slice99 crp= 1 +--- 'expires': 1167126840 +101 None onebaa_slice100 nodes= [100, 101, 102, 3100, 3101, 3102] persons= [104, 105, 106] +--- sas= [] onebaa_slice100 crp= 1 +--- 'expires': 1167126840 +102 None onebab_slice101 nodes= [101, 102, 103, 3101, 3102, 3103] persons= [105, 106, 107] +--- sas= [] onebab_slice101 crp= 1 +--- 'expires': 1167126840 +103 None onebac_slice102 nodes= [102, 103, 104, 3102, 3103, 3104] persons= [106, 107, 108] +--- sas= [] onebac_slice102 crp= 1 +--- 'expires': 1167126841 +104 None onebad_slice103 nodes= [103, 104, 105, 3103, 3104, 3105] persons= [107, 108, 109] +--- sas= [] onebad_slice103 crp= 1 +--- 'expires': 1167126841 +105 None onebae_slice104 nodes= [104, 105, 106, 3104, 3105, 3106] persons= [108, 109, 110] +--- sas= [] onebae_slice104 crp= 1 +--- 'expires': 1167126841 +106 None onebaf_slice105 nodes= [105, 106, 107, 3105, 3106, 3107] persons= [109, 110, 111] +--- sas= [] onebaf_slice105 crp= 1 +--- 'expires': 1167126841 +107 None onebag_slice106 nodes= [106, 107, 108, 3106, 3107, 3108] persons= [110, 111, 112] +--- sas= [] onebag_slice106 crp= 1 +--- 'expires': 1167126841 +108 None onebah_slice107 nodes= [107, 108, 109, 3107, 3108, 3109] persons= [111, 112, 113] +--- sas= [] onebah_slice107 crp= 1 +--- 'expires': 1167126842 +109 None onebai_slice108 nodes= [108, 109, 110, 3108, 3109, 3110] persons= [112, 113, 114] +--- sas= [] onebai_slice108 crp= 1 +--- 'expires': 1167126842 +110 None onebaj_slice109 nodes= [109, 110, 111, 3109, 3110, 3111] persons= [113, 114, 115] +--- sas= [] onebaj_slice109 crp= 1 +--- 'expires': 1167126842 +111 None onebba_slice110 nodes= [110, 111, 112, 3110, 3111, 3112] persons= [114, 115, 116] +--- sas= [] onebba_slice110 crp= 1 +--- 'expires': 1167126842 +112 None onebbb_slice111 nodes= [111, 112, 113, 3111, 3112, 3113] persons= [115, 116, 117] +--- sas= [] onebbb_slice111 crp= 1 +--- 'expires': 1167126842 +113 None onebbc_slice112 nodes= [112, 113, 114, 3112, 3113, 3114] persons= [116, 117, 118] +--- sas= [] onebbc_slice112 crp= 1 +--- 'expires': 1167126843 +114 None onebbd_slice113 nodes= [113, 114, 115, 3113, 3114, 3115] persons= [117, 118, 119] +--- sas= [] onebbd_slice113 crp= 1 +--- 'expires': 1167126843 +115 None onebbe_slice114 nodes= [114, 115, 116, 3114, 3115, 3116] persons= [118, 119, 120] +--- sas= [] onebbe_slice114 crp= 1 +--- 'expires': 1167126843 +116 None onebbf_slice115 nodes= [115, 116, 117, 3115, 3116, 3117] persons= [119, 120, 121] +--- sas= [] onebbf_slice115 crp= 1 +--- 'expires': 1167126843 +117 None onebbg_slice116 nodes= [116, 117, 118, 3116, 3117, 3118] persons= [120, 121, 122] +--- sas= [] onebbg_slice116 crp= 1 +--- 'expires': 1167126843 +118 None onebbh_slice117 nodes= [117, 118, 119, 3117, 3118, 3119] persons= [121, 122, 123] +--- sas= [] onebbh_slice117 crp= 1 +--- 'expires': 1167126844 +119 None onebbi_slice118 nodes= [118, 119, 120, 3118, 3119, 3120] persons= [122, 123, 124] +--- sas= [] onebbi_slice118 crp= 1 +--- 'expires': 1167126844 +120 None onebbj_slice119 nodes= [119, 120, 121, 3119, 3120, 3121] persons= [123, 124, 125] +--- sas= [] onebbj_slice119 crp= 1 +--- 'expires': 1167126844 +121 None onebca_slice120 nodes= [120, 121, 122, 3120, 3121, 3122] persons= [124, 125, 126] +--- sas= [] onebca_slice120 crp= 1 +--- 'expires': 1167126844 +122 None onebcb_slice121 nodes= [121, 122, 123, 3121, 3122, 3123] persons= [125, 126, 127] +--- sas= [] onebcb_slice121 crp= 1 +--- 'expires': 1167126844 +123 None onebcc_slice122 nodes= [122, 123, 124, 3122, 3123, 3124] persons= [126, 127, 128] +--- sas= [] onebcc_slice122 crp= 1 +--- 'expires': 1167126845 +124 None onebcd_slice123 nodes= [123, 124, 125, 3123, 3124, 3125] persons= [127, 128, 129] +--- sas= [] onebcd_slice123 crp= 1 +--- 'expires': 1167126845 +125 None onebce_slice124 nodes= [124, 125, 126, 3124, 3125, 3126] persons= [128, 129, 130] +--- sas= [] onebce_slice124 crp= 1 +--- 'expires': 1167126845 +126 None onebcf_slice125 nodes= [125, 126, 127, 3125, 3126, 3127] persons= [129, 130, 131] +--- sas= [] onebcf_slice125 crp= 1 +--- 'expires': 1167126845 +127 None onebcg_slice126 nodes= [126, 127, 128, 3126, 3127, 3128] persons= [130, 131, 132] +--- sas= [] onebcg_slice126 crp= 1 +--- 'expires': 1167126846 +128 None onebch_slice127 nodes= [127, 128, 129, 3127, 3128, 3129] persons= [131, 132, 133] +--- sas= [] onebch_slice127 crp= 1 +--- 'expires': 1167126846 +129 None onebci_slice128 nodes= [128, 129, 130, 3128, 3129, 3130] persons= [132, 133, 134] +--- sas= [] onebci_slice128 crp= 1 +--- 'expires': 1167126846 +130 None onebcj_slice129 nodes= [129, 130, 131, 3129, 3130, 3131] persons= [133, 134, 135] +--- sas= [] onebcj_slice129 crp= 1 +--- 'expires': 1167126846 +131 None onebda_slice130 nodes= [130, 131, 132, 3130, 3131, 3132] persons= [134, 135, 136] +--- sas= [] onebda_slice130 crp= 1 +--- 'expires': 1167126846 +132 None onebdb_slice131 nodes= [131, 132, 133, 3131, 3132, 3133] persons= [135, 136, 137] +--- sas= [] onebdb_slice131 crp= 1 +--- 'expires': 1167126847 +133 None onebdc_slice132 nodes= [132, 133, 134, 3132, 3133, 3134] persons= [136, 137, 138] +--- sas= [] onebdc_slice132 crp= 1 +--- 'expires': 1167126847 +134 None onebdd_slice133 nodes= [133, 134, 135, 3133, 3134, 3135] persons= [137, 138, 139] +--- sas= [] onebdd_slice133 crp= 1 +--- 'expires': 1167126847 +135 None onebde_slice134 nodes= [134, 135, 136, 3134, 3135, 3136] persons= [138, 139, 140] +--- sas= [] onebde_slice134 crp= 1 +--- 'expires': 1167126847 +136 None onebdf_slice135 nodes= [135, 136, 137, 3135, 3136, 3137] persons= [139, 140, 141] +--- sas= [] onebdf_slice135 crp= 1 +--- 'expires': 1167126847 +137 None onebdg_slice136 nodes= [136, 137, 138, 3136, 3137, 3138] persons= [140, 141, 142] +--- sas= [] onebdg_slice136 crp= 1 +--- 'expires': 1167126848 +138 None onebdh_slice137 nodes= [137, 138, 139, 3137, 3138, 3139] persons= [141, 142, 143] +--- sas= [] onebdh_slice137 crp= 1 +--- 'expires': 1167126848 +139 None onebdi_slice138 nodes= [138, 139, 140, 3138, 3139, 3140] persons= [142, 143, 144] +--- sas= [] onebdi_slice138 crp= 1 +--- 'expires': 1167126848 +140 None onebdj_slice139 nodes= [139, 140, 141, 3139, 3140, 3141] persons= [143, 144, 145] +--- sas= [] onebdj_slice139 crp= 1 +--- 'expires': 1167126848 +141 None onebea_slice140 nodes= [140, 141, 142, 3140, 3141, 3142] persons= [144, 145, 146] +--- sas= [] onebea_slice140 crp= 1 +--- 'expires': 1167126848 +142 None onebeb_slice141 nodes= [141, 142, 143, 3141, 3142, 3143] persons= [145, 146, 147] +--- sas= [] onebeb_slice141 crp= 1 +--- 'expires': 1167126849 +143 None onebec_slice142 nodes= [142, 143, 144, 3142, 3143, 3144] persons= [146, 147, 148] +--- sas= [] onebec_slice142 crp= 1 +--- 'expires': 1167126849 +144 None onebed_slice143 nodes= [143, 144, 145, 3143, 3144, 3145] persons= [147, 148, 149] +--- sas= [] onebed_slice143 crp= 1 +--- 'expires': 1167126849 +145 None onebee_slice144 nodes= [144, 145, 146, 3144, 3145, 3146] persons= [148, 149, 150] +--- sas= [] onebee_slice144 crp= 1 +--- 'expires': 1167126849 +146 None onebef_slice145 nodes= [145, 146, 147, 3145, 3146, 3147] persons= [149, 150, 151] +--- sas= [] onebef_slice145 crp= 1 +--- 'expires': 1167126849 +147 None onebeg_slice146 nodes= [146, 147, 148, 3146, 3147, 3148] persons= [150, 151, 152] +--- sas= [] onebeg_slice146 crp= 1 +--- 'expires': 1167126850 +148 None onebeh_slice147 nodes= [147, 148, 149, 3147, 3148, 3149] persons= [151, 152, 153] +--- sas= [] onebeh_slice147 crp= 1 +--- 'expires': 1167126850 +149 None onebei_slice148 nodes= [148, 149, 150, 3148, 3149, 3150] persons= [152, 153, 154] +--- sas= [] onebei_slice148 crp= 1 +--- 'expires': 1167126850 +150 None onebej_slice149 nodes= [149, 150, 151, 3149, 3150, 3151] persons= [153, 154, 155] +--- sas= [] onebej_slice149 crp= 1 +--- 'expires': 1167126850 +151 None onebfa_slice150 nodes= [150, 151, 152, 3150, 3151, 3152] persons= [154, 155, 156] +--- sas= [] onebfa_slice150 crp= 1 +--- 'expires': 1167126850 +152 None onebfb_slice151 nodes= [151, 152, 153, 3151, 3152, 3153] persons= [155, 156, 157] +--- sas= [] onebfb_slice151 crp= 1 +--- 'expires': 1167126851 +153 None onebfc_slice152 nodes= [152, 153, 154, 3152, 3153, 3154] persons= [156, 157, 158] +--- sas= [] onebfc_slice152 crp= 1 +--- 'expires': 1167126851 +154 None onebfd_slice153 nodes= [153, 154, 155, 3153, 3154, 3155] persons= [157, 158, 159] +--- sas= [] onebfd_slice153 crp= 1 +--- 'expires': 1167126851 +155 None onebfe_slice154 nodes= [154, 155, 156, 3154, 3155, 3156] persons= [158, 159, 160] +--- sas= [] onebfe_slice154 crp= 1 +--- 'expires': 1167126851 +156 None onebff_slice155 nodes= [155, 156, 157, 3155, 3156, 3157] persons= [159, 160, 161] +--- sas= [] onebff_slice155 crp= 1 +--- 'expires': 1167126852 +157 None onebfg_slice156 nodes= [156, 157, 158, 3156, 3157, 3158] persons= [160, 161, 162] +--- sas= [] onebfg_slice156 crp= 1 +--- 'expires': 1167126852 +158 None onebfh_slice157 nodes= [157, 158, 159, 3157, 3158, 3159] persons= [161, 162, 163] +--- sas= [] onebfh_slice157 crp= 1 +--- 'expires': 1167126852 +159 None onebfi_slice158 nodes= [158, 159, 160, 3158, 3159, 3160] persons= [162, 163, 164] +--- sas= [] onebfi_slice158 crp= 1 +--- 'expires': 1167126852 +160 None onebfj_slice159 nodes= [159, 160, 161, 3159, 3160, 3161] persons= [163, 164, 165] +--- sas= [] onebfj_slice159 crp= 1 +--- 'expires': 1167126852 +161 None onebga_slice160 nodes= [160, 161, 162, 3160, 3161, 3162] persons= [164, 165, 166] +--- sas= [] onebga_slice160 crp= 1 +--- 'expires': 1167126853 +162 None onebgb_slice161 nodes= [161, 162, 163, 3161, 3162, 3163] persons= [165, 166, 167] +--- sas= [] onebgb_slice161 crp= 1 +--- 'expires': 1167126853 +163 None onebgc_slice162 nodes= [162, 163, 164, 3162, 3163, 3164] persons= [166, 167, 168] +--- sas= [] onebgc_slice162 crp= 1 +--- 'expires': 1167126853 +164 None onebgd_slice163 nodes= [163, 164, 165, 3163, 3164, 3165] persons= [167, 168, 169] +--- sas= [] onebgd_slice163 crp= 1 +--- 'expires': 1167126853 +165 None onebge_slice164 nodes= [164, 165, 166, 3164, 3165, 3166] persons= [168, 169, 170] +--- sas= [] onebge_slice164 crp= 1 +--- 'expires': 1167126853 +166 None onebgf_slice165 nodes= [165, 166, 167, 3165, 3166, 3167] persons= [169, 170, 171] +--- sas= [] onebgf_slice165 crp= 1 +--- 'expires': 1167126854 +167 None onebgg_slice166 nodes= [166, 167, 168, 3166, 3167, 3168] persons= [170, 171, 172] +--- sas= [] onebgg_slice166 crp= 1 +--- 'expires': 1167126854 +168 None onebgh_slice167 nodes= [167, 168, 169, 3167, 3168, 3169] persons= [171, 172, 173] +--- sas= [] onebgh_slice167 crp= 1 +--- 'expires': 1167126854 +169 None onebgi_slice168 nodes= [168, 169, 170, 3168, 3169, 3170] persons= [172, 173, 174] +--- sas= [] onebgi_slice168 crp= 1 +--- 'expires': 1167126854 +170 None onebgj_slice169 nodes= [169, 170, 171, 3169, 3170, 3171] persons= [173, 174, 175] +--- sas= [] onebgj_slice169 crp= 1 +--- 'expires': 1167126854 +171 None onebha_slice170 nodes= [170, 171, 172, 3170, 3171, 3172] persons= [174, 175, 176] +--- sas= [] onebha_slice170 crp= 1 +--- 'expires': 1167126855 +172 None onebhb_slice171 nodes= [171, 172, 173, 3171, 3172, 3173] persons= [175, 176, 177] +--- sas= [] onebhb_slice171 crp= 1 +--- 'expires': 1167126855 +173 None onebhc_slice172 nodes= [172, 173, 174, 3172, 3173, 3174] persons= [176, 177, 178] +--- sas= [] onebhc_slice172 crp= 1 +--- 'expires': 1167126855 +174 None onebhd_slice173 nodes= [173, 174, 175, 3173, 3174, 3175] persons= [177, 178, 179] +--- sas= [] onebhd_slice173 crp= 1 +--- 'expires': 1167126855 +175 None onebhe_slice174 nodes= [174, 175, 176, 3174, 3175, 3176] persons= [178, 179, 180] +--- sas= [] onebhe_slice174 crp= 1 +--- 'expires': 1167126856 +176 None onebhf_slice175 nodes= [175, 176, 177, 3175, 3176, 3177] persons= [179, 180, 181] +--- sas= [] onebhf_slice175 crp= 1 +--- 'expires': 1167126856 +177 None onebhg_slice176 nodes= [176, 177, 178, 3176, 3177, 3178] persons= [180, 181, 182] +--- sas= [] onebhg_slice176 crp= 1 +--- 'expires': 1167126856 +178 None onebhh_slice177 nodes= [177, 178, 179, 3177, 3178, 3179] persons= [181, 182, 183] +--- sas= [] onebhh_slice177 crp= 1 +--- 'expires': 1167126856 +179 None onebhi_slice178 nodes= [178, 179, 180, 3178, 3179, 3180] persons= [182, 183, 184] +--- sas= [] onebhi_slice178 crp= 1 +--- 'expires': 1167126856 +180 None onebhj_slice179 nodes= [179, 180, 181, 3179, 3180, 3181] persons= [183, 184, 185] +--- sas= [] onebhj_slice179 crp= 1 +--- 'expires': 1167126857 +181 None onebia_slice180 nodes= [180, 181, 182, 3180, 3181, 3182] persons= [184, 185, 186] +--- sas= [] onebia_slice180 crp= 1 +--- 'expires': 1167126857 +182 None onebib_slice181 nodes= [181, 182, 183, 3181, 3182, 3183] persons= [185, 186, 187] +--- sas= [] onebib_slice181 crp= 1 +--- 'expires': 1167126857 +183 None onebic_slice182 nodes= [182, 183, 184, 3182, 3183, 3184] persons= [186, 187, 188] +--- sas= [] onebic_slice182 crp= 1 +--- 'expires': 1167126857 +184 None onebid_slice183 nodes= [183, 184, 185, 3183, 3184, 3185] persons= [187, 188, 189] +--- sas= [] onebid_slice183 crp= 1 +--- 'expires': 1167126857 +185 None onebie_slice184 nodes= [184, 185, 186, 3184, 3185, 3186] persons= [188, 189, 190] +--- sas= [] onebie_slice184 crp= 1 +--- 'expires': 1167126858 +186 None onebif_slice185 nodes= [185, 186, 187, 3185, 3186, 3187] persons= [189, 190, 191] +--- sas= [] onebif_slice185 crp= 1 +--- 'expires': 1167126858 +187 None onebig_slice186 nodes= [186, 187, 188, 3186, 3187, 3188] persons= [190, 191, 192] +--- sas= [] onebig_slice186 crp= 1 +--- 'expires': 1167126858 +188 None onebih_slice187 nodes= [187, 188, 189, 3187, 3188, 3189] persons= [191, 192, 193] +--- sas= [] onebih_slice187 crp= 1 +--- 'expires': 1167126858 +189 None onebii_slice188 nodes= [188, 189, 190, 3188, 3189, 3190] persons= [192, 193, 194] +--- sas= [] onebii_slice188 crp= 1 +--- 'expires': 1167126859 +190 None onebij_slice189 nodes= [189, 190, 191, 3189, 3190, 3191] persons= [193, 194, 195] +--- sas= [] onebij_slice189 crp= 1 +--- 'expires': 1167126859 +191 None onebja_slice190 nodes= [190, 191, 192, 3190, 3191, 3192] persons= [194, 195, 196] +--- sas= [] onebja_slice190 crp= 1 +--- 'expires': 1167126859 +192 None onebjb_slice191 nodes= [191, 192, 193, 3191, 3192, 3193] persons= [195, 196, 197] +--- sas= [] onebjb_slice191 crp= 1 +--- 'expires': 1167126859 +193 None onebjc_slice192 nodes= [192, 193, 194, 3192, 3193, 3194] persons= [196, 197, 198] +--- sas= [] onebjc_slice192 crp= 1 +--- 'expires': 1167126859 +194 None onebjd_slice193 nodes= [193, 194, 195, 3193, 3194, 3195] persons= [197, 198, 199] +--- sas= [] onebjd_slice193 crp= 1 +--- 'expires': 1167126860 +195 None onebje_slice194 nodes= [194, 195, 196, 3194, 3195, 3196] persons= [198, 199, 200] +--- sas= [] onebje_slice194 crp= 1 +--- 'expires': 1167126860 +196 None onebjf_slice195 nodes= [195, 196, 197, 3195, 3196, 3197] persons= [199, 200, 201] +--- sas= [] onebjf_slice195 crp= 1 +--- 'expires': 1167126860 +197 None onebjg_slice196 nodes= [196, 197, 198, 3196, 3197, 3198] persons= [200, 201, 202] +--- sas= [] onebjg_slice196 crp= 1 +--- 'expires': 1167126860 +198 None onebjh_slice197 nodes= [197, 198, 199, 3197, 3198, 3199] persons= [201, 202, 203] +--- sas= [] onebjh_slice197 crp= 1 +--- 'expires': 1167126860 +199 None onebji_slice198 nodes= [198, 199, 200, 3198, 3199, 3200] persons= [202, 203, 204] +--- sas= [] onebji_slice198 crp= 1 +--- 'expires': 1167126861 +200 None onebjj_slice199 nodes= [199, 200, 201, 3199, 3200, 3201] persons= [203, 204, 205] +--- sas= [] onebjj_slice199 crp= 1 +--- 'expires': 1167126861 +201 None onecaa_slice200 nodes= [200, 201, 202, 3200, 3201, 3202] persons= [204, 205, 206] +--- sas= [] onecaa_slice200 crp= 1 +--- 'expires': 1167126861 +202 None onecab_slice201 nodes= [201, 202, 203, 3201, 3202, 3203] persons= [205, 206, 207] +--- sas= [] onecab_slice201 crp= 1 +--- 'expires': 1167126861 +203 None onecac_slice202 nodes= [202, 203, 204, 3202, 3203, 3204] persons= [206, 207, 208] +--- sas= [] onecac_slice202 crp= 1 +--- 'expires': 1167126862 +204 None onecad_slice203 nodes= [203, 204, 205, 3203, 3204, 3205] persons= [207, 208, 209] +--- sas= [] onecad_slice203 crp= 1 +--- 'expires': 1167126862 +205 None onecae_slice204 nodes= [204, 205, 206, 3204, 3205, 3206] persons= [208, 209, 210] +--- sas= [] onecae_slice204 crp= 1 +--- 'expires': 1167126862 +206 None onecaf_slice205 nodes= [205, 206, 207, 3205, 3206, 3207] persons= [209, 210, 211] +--- sas= [] onecaf_slice205 crp= 1 +--- 'expires': 1167126862 +207 None onecag_slice206 nodes= [206, 207, 208, 3206, 3207, 3208] persons= [210, 211, 212] +--- sas= [] onecag_slice206 crp= 1 +--- 'expires': 1167126862 +208 None onecah_slice207 nodes= [207, 208, 209, 3207, 3208, 3209] persons= [211, 212, 213] +--- sas= [] onecah_slice207 crp= 1 +--- 'expires': 1167126863 +209 None onecai_slice208 nodes= [208, 209, 210, 3208, 3209, 3210] persons= [212, 213, 214] +--- sas= [] onecai_slice208 crp= 1 +--- 'expires': 1167126863 +210 None onecaj_slice209 nodes= [209, 210, 211, 3209, 3210, 3211] persons= [213, 214, 215] +--- sas= [] onecaj_slice209 crp= 1 +--- 'expires': 1167126863 +211 None onecba_slice210 nodes= [210, 211, 212, 3210, 3211, 3212] persons= [214, 215, 216] +--- sas= [] onecba_slice210 crp= 1 +--- 'expires': 1167126863 +212 None onecbb_slice211 nodes= [211, 212, 213, 3211, 3212, 3213] persons= [215, 216, 217] +--- sas= [] onecbb_slice211 crp= 1 +--- 'expires': 1167126863 +213 None onecbc_slice212 nodes= [212, 213, 214, 3212, 3213, 3214] persons= [216, 217, 218] +--- sas= [] onecbc_slice212 crp= 1 +--- 'expires': 1167126864 +214 None onecbd_slice213 nodes= [213, 214, 215, 3213, 3214, 3215] persons= [217, 218, 219] +--- sas= [] onecbd_slice213 crp= 1 +--- 'expires': 1167126864 +215 None onecbe_slice214 nodes= [214, 215, 216, 3214, 3215, 3216] persons= [218, 219, 220] +--- sas= [] onecbe_slice214 crp= 1 +--- 'expires': 1167126864 +216 None onecbf_slice215 nodes= [215, 216, 217, 3215, 3216, 3217] persons= [219, 220, 221] +--- sas= [] onecbf_slice215 crp= 1 +--- 'expires': 1167126864 +217 None onecbg_slice216 nodes= [216, 217, 218, 3216, 3217, 3218] persons= [220, 221, 222] +--- sas= [] onecbg_slice216 crp= 1 +--- 'expires': 1167126865 +218 None onecbh_slice217 nodes= [217, 218, 219, 3217, 3218, 3219] persons= [221, 222, 223] +--- sas= [] onecbh_slice217 crp= 1 +--- 'expires': 1167126865 +219 None onecbi_slice218 nodes= [218, 219, 220, 3218, 3219, 3220] persons= [222, 223, 224] +--- sas= [] onecbi_slice218 crp= 1 +--- 'expires': 1167126865 +220 None onecbj_slice219 nodes= [219, 220, 221, 3219, 3220, 3221] persons= [223, 224, 225] +--- sas= [] onecbj_slice219 crp= 1 +--- 'expires': 1167126865 +221 None onecca_slice220 nodes= [220, 221, 222, 3220, 3221, 3222] persons= [224, 225, 226] +--- sas= [] onecca_slice220 crp= 1 +--- 'expires': 1167126865 +222 None oneccb_slice221 nodes= [221, 222, 223, 3221, 3222, 3223] persons= [225, 226, 227] +--- sas= [] oneccb_slice221 crp= 1 +--- 'expires': 1167126866 +223 None oneccc_slice222 nodes= [222, 223, 224, 3222, 3223, 3224] persons= [226, 227, 228] +--- sas= [] oneccc_slice222 crp= 1 +--- 'expires': 1167126866 +224 None oneccd_slice223 nodes= [223, 224, 225, 3223, 3224, 3225] persons= [227, 228, 229] +--- sas= [] oneccd_slice223 crp= 1 +--- 'expires': 1167126866 +225 None onecce_slice224 nodes= [224, 225, 226, 3224, 3225, 3226] persons= [228, 229, 230] +--- sas= [] onecce_slice224 crp= 1 +--- 'expires': 1167126866 +226 None oneccf_slice225 nodes= [225, 226, 227, 3225, 3226, 3227] persons= [229, 230, 231] +--- sas= [] oneccf_slice225 crp= 1 +--- 'expires': 1167126867 +227 None oneccg_slice226 nodes= [226, 227, 228, 3226, 3227, 3228] persons= [230, 231, 232] +--- sas= [] oneccg_slice226 crp= 1 +--- 'expires': 1167126867 +228 None onecch_slice227 nodes= [227, 228, 229, 3227, 3228, 3229] persons= [231, 232, 233] +--- sas= [] onecch_slice227 crp= 1 +--- 'expires': 1167126867 +229 None onecci_slice228 nodes= [228, 229, 230, 3228, 3229, 3230] persons= [232, 233, 234] +--- sas= [] onecci_slice228 crp= 1 +--- 'expires': 1167126867 +230 None oneccj_slice229 nodes= [229, 230, 231, 3229, 3230, 3231] persons= [233, 234, 235] +--- sas= [] oneccj_slice229 crp= 1 +--- 'expires': 1167126867 +231 None onecda_slice230 nodes= [230, 231, 232, 3230, 3231, 3232] persons= [234, 235, 236] +--- sas= [] onecda_slice230 crp= 1 +--- 'expires': 1167126868 +232 None onecdb_slice231 nodes= [231, 232, 233, 3231, 3232, 3233] persons= [235, 236, 237] +--- sas= [] onecdb_slice231 crp= 1 +--- 'expires': 1167126868 +233 None onecdc_slice232 nodes= [232, 233, 234, 3232, 3233, 3234] persons= [236, 237, 238] +--- sas= [] onecdc_slice232 crp= 1 +--- 'expires': 1167126868 +234 None onecdd_slice233 nodes= [233, 234, 235, 3233, 3234, 3235] persons= [237, 238, 239] +--- sas= [] onecdd_slice233 crp= 1 +--- 'expires': 1167126868 +235 None onecde_slice234 nodes= [234, 235, 236, 3234, 3235, 3236] persons= [238, 239, 240] +--- sas= [] onecde_slice234 crp= 1 +--- 'expires': 1167126869 +236 None onecdf_slice235 nodes= [235, 236, 237, 3235, 3236, 3237] persons= [239, 240, 241] +--- sas= [] onecdf_slice235 crp= 1 +--- 'expires': 1167126869 +237 None onecdg_slice236 nodes= [236, 237, 238, 3236, 3237, 3238] persons= [240, 241, 242] +--- sas= [] onecdg_slice236 crp= 1 +--- 'expires': 1167126869 +238 None onecdh_slice237 nodes= [237, 238, 239, 3237, 3238, 3239] persons= [241, 242, 243] +--- sas= [] onecdh_slice237 crp= 1 +--- 'expires': 1167126869 +239 None onecdi_slice238 nodes= [238, 239, 240, 3238, 3239, 3240] persons= [242, 243, 244] +--- sas= [] onecdi_slice238 crp= 1 +--- 'expires': 1167126869 +240 None onecdj_slice239 nodes= [239, 240, 241, 3239, 3240, 3241] persons= [243, 244, 245] +--- sas= [] onecdj_slice239 crp= 1 +--- 'expires': 1167126870 +241 None onecea_slice240 nodes= [240, 241, 242, 3240, 3241, 3242] persons= [244, 245, 246] +--- sas= [] onecea_slice240 crp= 1 +--- 'expires': 1167126870 +242 None oneceb_slice241 nodes= [241, 242, 243, 3241, 3242, 3243] persons= [245, 246, 247] +--- sas= [] oneceb_slice241 crp= 1 +--- 'expires': 1167126870 +243 None onecec_slice242 nodes= [242, 243, 244, 3242, 3243, 3244] persons= [246, 247, 248] +--- sas= [] onecec_slice242 crp= 1 +--- 'expires': 1167126870 +244 None oneced_slice243 nodes= [243, 244, 245, 3243, 3244, 3245] persons= [247, 248, 249] +--- sas= [] oneced_slice243 crp= 1 +--- 'expires': 1167126871 +245 None onecee_slice244 nodes= [244, 245, 246, 3244, 3245, 3246] persons= [248, 249, 250] +--- sas= [] onecee_slice244 crp= 1 +--- 'expires': 1167126871 +246 None onecef_slice245 nodes= [245, 246, 247, 3245, 3246, 3247] persons= [249, 250, 251] +--- sas= [] onecef_slice245 crp= 1 +--- 'expires': 1167126871 +247 None oneceg_slice246 nodes= [246, 247, 248, 3246, 3247, 3248] persons= [250, 251, 252] +--- sas= [] oneceg_slice246 crp= 1 +--- 'expires': 1167126871 +248 None oneceh_slice247 nodes= [247, 248, 249, 3247, 3248, 3249] persons= [251, 252, 253] +--- sas= [] oneceh_slice247 crp= 1 +--- 'expires': 1167126871 +249 None onecei_slice248 nodes= [248, 249, 250, 3248, 3249, 3250] persons= [252, 253, 254] +--- sas= [] onecei_slice248 crp= 1 +--- 'expires': 1167126872 +250 None onecej_slice249 nodes= [249, 250, 251, 3249, 3250, 3251] persons= [253, 254, 255] +--- sas= [] onecej_slice249 crp= 1 +--- 'expires': 1167126872 +251 None onecfa_slice250 nodes= [250, 251, 252, 3250, 3251, 3252] persons= [254, 255, 256] +--- sas= [] onecfa_slice250 crp= 1 +--- 'expires': 1167126872 +252 None onecfb_slice251 nodes= [251, 252, 253, 3251, 3252, 3253] persons= [255, 256, 257] +--- sas= [] onecfb_slice251 crp= 1 +--- 'expires': 1167126872 +253 None onecfc_slice252 nodes= [252, 253, 254, 3252, 3253, 3254] persons= [256, 257, 258] +--- sas= [] onecfc_slice252 crp= 1 +--- 'expires': 1167126873 +254 None onecfd_slice253 nodes= [253, 254, 255, 3253, 3254, 3255] persons= [257, 258, 259] +--- sas= [] onecfd_slice253 crp= 1 +--- 'expires': 1167126873 +255 None onecfe_slice254 nodes= [254, 255, 256, 3254, 3255, 3256] persons= [258, 259, 260] +--- sas= [] onecfe_slice254 crp= 1 +--- 'expires': 1167126873 +256 None onecff_slice255 nodes= [255, 256, 257, 3255, 3256, 3257] persons= [259, 260, 261] +--- sas= [] onecff_slice255 crp= 1 +--- 'expires': 1167126873 +257 None onecfg_slice256 nodes= [256, 257, 258, 3256, 3257, 3258] persons= [260, 261, 262] +--- sas= [] onecfg_slice256 crp= 1 +--- 'expires': 1167126873 +258 None onecfh_slice257 nodes= [257, 258, 259, 3257, 3258, 3259] persons= [261, 262, 263] +--- sas= [] onecfh_slice257 crp= 1 +--- 'expires': 1167126874 +259 None onecfi_slice258 nodes= [258, 259, 260, 3258, 3259, 3260] persons= [262, 263, 264] +--- sas= [] onecfi_slice258 crp= 1 +--- 'expires': 1167126874 +260 None onecfj_slice259 nodes= [259, 260, 261, 3259, 3260, 3261] persons= [263, 264, 265] +--- sas= [] onecfj_slice259 crp= 1 +--- 'expires': 1167126874 +261 None onecga_slice260 nodes= [260, 261, 262, 3260, 3261, 3262] persons= [264, 265, 266] +--- sas= [] onecga_slice260 crp= 1 +--- 'expires': 1167126874 +262 None onecgb_slice261 nodes= [261, 262, 263, 3261, 3262, 3263] persons= [265, 266, 267] +--- sas= [] onecgb_slice261 crp= 1 +--- 'expires': 1167126875 +263 None onecgc_slice262 nodes= [262, 263, 264, 3262, 3263, 3264] persons= [266, 267, 268] +--- sas= [] onecgc_slice262 crp= 1 +--- 'expires': 1167126875 +264 None onecgd_slice263 nodes= [263, 264, 265, 3263, 3264, 3265] persons= [267, 268, 269] +--- sas= [] onecgd_slice263 crp= 1 +--- 'expires': 1167126875 +265 None onecge_slice264 nodes= [264, 265, 266, 3264, 3265, 3266] persons= [268, 269, 270] +--- sas= [] onecge_slice264 crp= 1 +--- 'expires': 1167126875 +266 None onecgf_slice265 nodes= [265, 266, 267, 3265, 3266, 3267] persons= [269, 270, 271] +--- sas= [] onecgf_slice265 crp= 1 +--- 'expires': 1167126875 +267 None onecgg_slice266 nodes= [266, 267, 268, 3266, 3267, 3268] persons= [270, 271, 272] +--- sas= [] onecgg_slice266 crp= 1 +--- 'expires': 1167126876 +268 None onecgh_slice267 nodes= [267, 268, 269, 3267, 3268, 3269] persons= [271, 272, 273] +--- sas= [] onecgh_slice267 crp= 1 +--- 'expires': 1167126876 +269 None onecgi_slice268 nodes= [268, 269, 270, 3268, 3269, 3270] persons= [272, 273, 274] +--- sas= [] onecgi_slice268 crp= 1 +--- 'expires': 1167126876 +270 None onecgj_slice269 nodes= [269, 270, 271, 3269, 3270, 3271] persons= [273, 274, 275] +--- sas= [] onecgj_slice269 crp= 1 +--- 'expires': 1167126876 +271 None onecha_slice270 nodes= [270, 271, 272, 3270, 3271, 3272] persons= [274, 275, 276] +--- sas= [] onecha_slice270 crp= 1 +--- 'expires': 1167126877 +272 None onechb_slice271 nodes= [271, 272, 273, 3271, 3272, 3273] persons= [275, 276, 277] +--- sas= [] onechb_slice271 crp= 1 +--- 'expires': 1167126877 +273 None onechc_slice272 nodes= [272, 273, 274, 3272, 3273, 3274] persons= [276, 277, 278] +--- sas= [] onechc_slice272 crp= 1 +--- 'expires': 1167126877 +274 None onechd_slice273 nodes= [273, 274, 275, 3273, 3274, 3275] persons= [277, 278, 279] +--- sas= [] onechd_slice273 crp= 1 +--- 'expires': 1167126877 +275 None oneche_slice274 nodes= [274, 275, 276, 3274, 3275, 3276] persons= [278, 279, 280] +--- sas= [] oneche_slice274 crp= 1 +--- 'expires': 1167126878 +276 None onechf_slice275 nodes= [275, 276, 277, 3275, 3276, 3277] persons= [279, 280, 281] +--- sas= [] onechf_slice275 crp= 1 +--- 'expires': 1167126878 +277 None onechg_slice276 nodes= [276, 277, 278, 3276, 3277, 3278] persons= [280, 281, 282] +--- sas= [] onechg_slice276 crp= 1 +--- 'expires': 1167126878 +278 None onechh_slice277 nodes= [277, 278, 279, 3277, 3278, 3279] persons= [281, 282, 283] +--- sas= [] onechh_slice277 crp= 1 +--- 'expires': 1167126878 +279 None onechi_slice278 nodes= [278, 279, 280, 3278, 3279, 3280] persons= [282, 283, 284] +--- sas= [] onechi_slice278 crp= 1 +--- 'expires': 1167126878 +280 None onechj_slice279 nodes= [279, 280, 281, 3279, 3280, 3281] persons= [283, 284, 285] +--- sas= [] onechj_slice279 crp= 1 +--- 'expires': 1167126879 +281 None onecia_slice280 nodes= [280, 281, 282, 3280, 3281, 3282] persons= [284, 285, 286] +--- sas= [] onecia_slice280 crp= 1 +--- 'expires': 1167126879 +282 None onecib_slice281 nodes= [281, 282, 283, 3281, 3282, 3283] persons= [285, 286, 287] +--- sas= [] onecib_slice281 crp= 1 +--- 'expires': 1167126879 +283 None onecic_slice282 nodes= [282, 283, 284, 3282, 3283, 3284] persons= [286, 287, 288] +--- sas= [] onecic_slice282 crp= 1 +--- 'expires': 1167126879 +284 None onecid_slice283 nodes= [283, 284, 285, 3283, 3284, 3285] persons= [287, 288, 289] +--- sas= [] onecid_slice283 crp= 1 +--- 'expires': 1167126880 +285 None onecie_slice284 nodes= [284, 285, 286, 3284, 3285, 3286] persons= [288, 289, 290] +--- sas= [] onecie_slice284 crp= 1 +--- 'expires': 1167126880 +286 None onecif_slice285 nodes= [285, 286, 287, 3285, 3286, 3287] persons= [289, 290, 291] +--- sas= [] onecif_slice285 crp= 1 +--- 'expires': 1167126880 +287 None onecig_slice286 nodes= [286, 287, 288, 3286, 3287, 3288] persons= [290, 291, 292] +--- sas= [] onecig_slice286 crp= 1 +--- 'expires': 1167126880 +288 None onecih_slice287 nodes= [287, 288, 289, 3287, 3288, 3289] persons= [291, 292, 293] +--- sas= [] onecih_slice287 crp= 1 +--- 'expires': 1167126880 +289 None onecii_slice288 nodes= [288, 289, 290, 3288, 3289, 3290] persons= [292, 293, 294] +--- sas= [] onecii_slice288 crp= 1 +--- 'expires': 1167126881 +290 None onecij_slice289 nodes= [289, 290, 291, 3289, 3290, 3291] persons= [293, 294, 295] +--- sas= [] onecij_slice289 crp= 1 +--- 'expires': 1167126881 +291 None onecja_slice290 nodes= [290, 291, 292, 3290, 3291, 3292] persons= [294, 295, 296] +--- sas= [] onecja_slice290 crp= 1 +--- 'expires': 1167126881 +292 None onecjb_slice291 nodes= [291, 292, 293, 3291, 3292, 3293] persons= [295, 296, 297] +--- sas= [] onecjb_slice291 crp= 1 +--- 'expires': 1167126881 +293 None onecjc_slice292 nodes= [292, 293, 294, 3292, 3293, 3294] persons= [296, 297, 298] +--- sas= [] onecjc_slice292 crp= 1 +--- 'expires': 1167126882 +294 None onecjd_slice293 nodes= [293, 294, 295, 3293, 3294, 3295] persons= [297, 298, 299] +--- sas= [] onecjd_slice293 crp= 1 +--- 'expires': 1167126882 +295 None onecje_slice294 nodes= [294, 295, 296, 3294, 3295, 3296] persons= [298, 299, 300] +--- sas= [] onecje_slice294 crp= 1 +--- 'expires': 1167126882 +296 None onecjf_slice295 nodes= [295, 296, 297, 3295, 3296, 3297] persons= [299, 300, 301] +--- sas= [] onecjf_slice295 crp= 1 +--- 'expires': 1167126882 +297 None onecjg_slice296 nodes= [296, 297, 298, 3296, 3297, 3298] persons= [300, 301, 302] +--- sas= [] onecjg_slice296 crp= 1 +--- 'expires': 1167126883 +298 None onecjh_slice297 nodes= [297, 298, 299, 3297, 3298, 3299] persons= [301, 302, 303] +--- sas= [] onecjh_slice297 crp= 1 +--- 'expires': 1167126883 +299 None onecji_slice298 nodes= [298, 299, 300, 3298, 3299, 3300] persons= [302, 303, 304] +--- sas= [] onecji_slice298 crp= 1 +--- 'expires': 1167126883 +300 None onecjj_slice299 nodes= [299, 300, 301, 3299, 3300, 3301] persons= [303, 304, 305] +--- sas= [] onecjj_slice299 crp= 1 +--- 'expires': 1167126883 +301 None onedaa_slice300 nodes= [300, 301, 302, 3300, 3301, 3302] persons= [304, 305, 306] +--- sas= [] onedaa_slice300 crp= 1 +--- 'expires': 1167126883 +302 None onedab_slice301 nodes= [301, 302, 303, 3301, 3302, 3303] persons= [305, 306, 307] +--- sas= [] onedab_slice301 crp= 1 +--- 'expires': 1167126884 +303 None onedac_slice302 nodes= [302, 303, 304, 3302, 3303, 3304] persons= [306, 307, 308] +--- sas= [] onedac_slice302 crp= 1 +--- 'expires': 1167126884 +304 None onedad_slice303 nodes= [303, 304, 305, 3303, 3304, 3305] persons= [307, 308, 309] +--- sas= [] onedad_slice303 crp= 1 +--- 'expires': 1167126884 +305 None onedae_slice304 nodes= [304, 305, 306, 3304, 3305, 3306] persons= [308, 309, 310] +--- sas= [] onedae_slice304 crp= 1 +--- 'expires': 1167126884 +306 None onedaf_slice305 nodes= [305, 306, 307, 3305, 3306, 3307] persons= [309, 310, 311] +--- sas= [] onedaf_slice305 crp= 1 +--- 'expires': 1167126885 +307 None onedag_slice306 nodes= [306, 307, 308, 3306, 3307, 3308] persons= [310, 311, 312] +--- sas= [] onedag_slice306 crp= 1 +--- 'expires': 1167126885 +308 None onedah_slice307 nodes= [307, 308, 309, 3307, 3308, 3309] persons= [311, 312, 313] +--- sas= [] onedah_slice307 crp= 1 +--- 'expires': 1167126885 +309 None onedai_slice308 nodes= [308, 309, 310, 3308, 3309, 3310] persons= [312, 313, 314] +--- sas= [] onedai_slice308 crp= 1 +--- 'expires': 1167126885 +310 None onedaj_slice309 nodes= [309, 310, 311, 3309, 3310, 3311] persons= [313, 314, 315] +--- sas= [] onedaj_slice309 crp= 1 +--- 'expires': 1167126886 +311 None onedba_slice310 nodes= [310, 311, 312, 3310, 3311, 3312] persons= [314, 315, 316] +--- sas= [] onedba_slice310 crp= 1 +--- 'expires': 1167126886 +312 None onedbb_slice311 nodes= [311, 312, 313, 3311, 3312, 3313] persons= [315, 316, 317] +--- sas= [] onedbb_slice311 crp= 1 +--- 'expires': 1167126886 +313 None onedbc_slice312 nodes= [312, 313, 314, 3312, 3313, 3314] persons= [316, 317, 318] +--- sas= [] onedbc_slice312 crp= 1 +--- 'expires': 1167126886 +314 None onedbd_slice313 nodes= [313, 314, 315, 3313, 3314, 3315] persons= [317, 318, 319] +--- sas= [] onedbd_slice313 crp= 1 +--- 'expires': 1167126887 +315 None onedbe_slice314 nodes= [314, 315, 316, 3314, 3315, 3316] persons= [318, 319, 320] +--- sas= [] onedbe_slice314 crp= 1 +--- 'expires': 1167126887 +316 None onedbf_slice315 nodes= [315, 316, 317, 3315, 3316, 3317] persons= [319, 320, 321] +--- sas= [] onedbf_slice315 crp= 1 +--- 'expires': 1167126887 +317 None onedbg_slice316 nodes= [316, 317, 318, 3316, 3317, 3318] persons= [320, 321, 322] +--- sas= [] onedbg_slice316 crp= 1 +--- 'expires': 1167126887 +318 None onedbh_slice317 nodes= [317, 318, 319, 3317, 3318, 3319] persons= [321, 322, 323] +--- sas= [] onedbh_slice317 crp= 1 +--- 'expires': 1167126887 +319 None onedbi_slice318 nodes= [318, 319, 320, 3318, 3319, 3320] persons= [322, 323, 324] +--- sas= [] onedbi_slice318 crp= 1 +--- 'expires': 1167126888 +320 None onedbj_slice319 nodes= [319, 320, 321, 3319, 3320, 3321] persons= [323, 324, 325] +--- sas= [] onedbj_slice319 crp= 1 +--- 'expires': 1167126888 +321 None onedca_slice320 nodes= [320, 321, 322, 3320, 3321, 3322] persons= [324, 325, 326] +--- sas= [] onedca_slice320 crp= 1 +--- 'expires': 1167126888 +322 None onedcb_slice321 nodes= [321, 322, 323, 3321, 3322, 3323] persons= [325, 326, 327] +--- sas= [] onedcb_slice321 crp= 1 +--- 'expires': 1167126888 +323 None onedcc_slice322 nodes= [322, 323, 324, 3322, 3323, 3324] persons= [326, 327, 328] +--- sas= [] onedcc_slice322 crp= 1 +--- 'expires': 1167126889 +324 None onedcd_slice323 nodes= [323, 324, 325, 3323, 3324, 3325] persons= [327, 328, 329] +--- sas= [] onedcd_slice323 crp= 1 +--- 'expires': 1167126889 +325 None onedce_slice324 nodes= [324, 325, 326, 3324, 3325, 3326] persons= [328, 329, 330] +--- sas= [] onedce_slice324 crp= 1 +--- 'expires': 1167126889 +326 None onedcf_slice325 nodes= [325, 326, 327, 3325, 3326, 3327] persons= [329, 330, 331] +--- sas= [] onedcf_slice325 crp= 1 +--- 'expires': 1167126889 +327 None onedcg_slice326 nodes= [326, 327, 328, 3326, 3327, 3328] persons= [330, 331, 332] +--- sas= [] onedcg_slice326 crp= 1 +--- 'expires': 1167126890 +328 None onedch_slice327 nodes= [327, 328, 329, 3327, 3328, 3329] persons= [331, 332, 333] +--- sas= [] onedch_slice327 crp= 1 +--- 'expires': 1167126890 +329 None onedci_slice328 nodes= [328, 329, 330, 3328, 3329, 3330] persons= [332, 333, 334] +--- sas= [] onedci_slice328 crp= 1 +--- 'expires': 1167126890 +330 None onedcj_slice329 nodes= [329, 330, 331, 3329, 3330, 3331] persons= [333, 334, 335] +--- sas= [] onedcj_slice329 crp= 1 +--- 'expires': 1167126890 +331 None onedda_slice330 nodes= [330, 331, 332, 3330, 3331, 3332] persons= [334, 335, 336] +--- sas= [] onedda_slice330 crp= 1 +--- 'expires': 1167126891 +332 None oneddb_slice331 nodes= [331, 332, 333, 3331, 3332, 3333] persons= [335, 336, 337] +--- sas= [] oneddb_slice331 crp= 1 +--- 'expires': 1167126891 +333 None oneddc_slice332 nodes= [332, 333, 334, 3332, 3333, 3334] persons= [336, 337, 338] +--- sas= [] oneddc_slice332 crp= 1 +--- 'expires': 1167126891 +334 None oneddd_slice333 nodes= [333, 334, 335, 3333, 3334, 3335] persons= [337, 338, 339] +--- sas= [] oneddd_slice333 crp= 1 +--- 'expires': 1167126891 +335 None onedde_slice334 nodes= [334, 335, 336, 3334, 3335, 3336] persons= [338, 339, 340] +--- sas= [] onedde_slice334 crp= 1 +--- 'expires': 1167126891 +336 None oneddf_slice335 nodes= [335, 336, 337, 3335, 3336, 3337] persons= [339, 340, 341] +--- sas= [] oneddf_slice335 crp= 1 +--- 'expires': 1167126892 +337 None oneddg_slice336 nodes= [336, 337, 338, 3336, 3337, 3338] persons= [340, 341, 342] +--- sas= [] oneddg_slice336 crp= 1 +--- 'expires': 1167126892 +338 None oneddh_slice337 nodes= [337, 338, 339, 3337, 3338, 3339] persons= [341, 342, 343] +--- sas= [] oneddh_slice337 crp= 1 +--- 'expires': 1167126892 +339 None oneddi_slice338 nodes= [338, 339, 340, 3338, 3339, 3340] persons= [342, 343, 344] +--- sas= [] oneddi_slice338 crp= 1 +--- 'expires': 1167126892 +340 None oneddj_slice339 nodes= [339, 340, 341, 3339, 3340, 3341] persons= [343, 344, 345] +--- sas= [] oneddj_slice339 crp= 1 +--- 'expires': 1167126893 +341 None onedea_slice340 nodes= [340, 341, 342, 3340, 3341, 3342] persons= [344, 345, 346] +--- sas= [] onedea_slice340 crp= 1 +--- 'expires': 1167126893 +342 None onedeb_slice341 nodes= [341, 342, 343, 3341, 3342, 3343] persons= [345, 346, 347] +--- sas= [] onedeb_slice341 crp= 1 +--- 'expires': 1167126893 +343 None onedec_slice342 nodes= [342, 343, 344, 3342, 3343, 3344] persons= [346, 347, 348] +--- sas= [] onedec_slice342 crp= 1 +--- 'expires': 1167126893 +344 None oneded_slice343 nodes= [343, 344, 345, 3343, 3344, 3345] persons= [347, 348, 349] +--- sas= [] oneded_slice343 crp= 1 +--- 'expires': 1167126894 +345 None onedee_slice344 nodes= [344, 345, 346, 3344, 3345, 3346] persons= [348, 349, 350] +--- sas= [] onedee_slice344 crp= 1 +--- 'expires': 1167126894 +346 None onedef_slice345 nodes= [345, 346, 347, 3345, 3346, 3347] persons= [349, 350, 351] +--- sas= [] onedef_slice345 crp= 1 +--- 'expires': 1167126894 +347 None onedeg_slice346 nodes= [346, 347, 348, 3346, 3347, 3348] persons= [350, 351, 352] +--- sas= [] onedeg_slice346 crp= 1 +--- 'expires': 1167126894 +348 None onedeh_slice347 nodes= [347, 348, 349, 3347, 3348, 3349] persons= [351, 352, 353] +--- sas= [] onedeh_slice347 crp= 1 +--- 'expires': 1167126895 +349 None onedei_slice348 nodes= [348, 349, 350, 3348, 3349, 3350] persons= [352, 353, 354] +--- sas= [] onedei_slice348 crp= 1 +--- 'expires': 1167126895 +350 None onedej_slice349 nodes= [349, 350, 351, 3349, 3350, 3351] persons= [353, 354, 355] +--- sas= [] onedej_slice349 crp= 1 +--- 'expires': 1167126895 +351 None onedfa_slice350 nodes= [350, 351, 352, 3350, 3351, 3352] persons= [354, 355, 356] +--- sas= [] onedfa_slice350 crp= 1 +--- 'expires': 1167126895 +352 None onedfb_slice351 nodes= [351, 352, 353, 3351, 3352, 3353] persons= [355, 356, 357] +--- sas= [] onedfb_slice351 crp= 1 +--- 'expires': 1167126896 +353 None onedfc_slice352 nodes= [352, 353, 354, 3352, 3353, 3354] persons= [356, 357, 358] +--- sas= [] onedfc_slice352 crp= 1 +--- 'expires': 1167126896 +354 None onedfd_slice353 nodes= [353, 354, 355, 3353, 3354, 3355] persons= [357, 358, 359] +--- sas= [] onedfd_slice353 crp= 1 +--- 'expires': 1167126896 +355 None onedfe_slice354 nodes= [354, 355, 356, 3354, 3355, 3356] persons= [358, 359, 360] +--- sas= [] onedfe_slice354 crp= 1 +--- 'expires': 1167126896 +356 None onedff_slice355 nodes= [355, 356, 357, 3355, 3356, 3357] persons= [359, 360, 361] +--- sas= [] onedff_slice355 crp= 1 +--- 'expires': 1167126896 +357 None onedfg_slice356 nodes= [356, 357, 358, 3356, 3357, 3358] persons= [360, 361, 362] +--- sas= [] onedfg_slice356 crp= 1 +--- 'expires': 1167126897 +358 None onedfh_slice357 nodes= [357, 358, 359, 3357, 3358, 3359] persons= [361, 362, 363] +--- sas= [] onedfh_slice357 crp= 1 +--- 'expires': 1167126897 +359 None onedfi_slice358 nodes= [358, 359, 360, 3358, 3359, 3360] persons= [362, 363, 364] +--- sas= [] onedfi_slice358 crp= 1 +--- 'expires': 1167126897 +360 None onedfj_slice359 nodes= [359, 360, 361, 3359, 3360, 3361] persons= [363, 364, 365] +--- sas= [] onedfj_slice359 crp= 1 +--- 'expires': 1167126897 +361 None onedga_slice360 nodes= [360, 361, 362, 3360, 3361, 3362] persons= [364, 365, 366] +--- sas= [] onedga_slice360 crp= 1 +--- 'expires': 1167126898 +362 None onedgb_slice361 nodes= [361, 362, 363, 3361, 3362, 3363] persons= [365, 366, 367] +--- sas= [] onedgb_slice361 crp= 1 +--- 'expires': 1167126898 +363 None onedgc_slice362 nodes= [362, 363, 364, 3362, 3363, 3364] persons= [366, 367, 368] +--- sas= [] onedgc_slice362 crp= 1 +--- 'expires': 1167126898 +364 None onedgd_slice363 nodes= [363, 364, 365, 3363, 3364, 3365] persons= [367, 368, 369] +--- sas= [] onedgd_slice363 crp= 1 +--- 'expires': 1167126898 +365 None onedge_slice364 nodes= [364, 365, 366, 3364, 3365, 3366] persons= [368, 369, 370] +--- sas= [] onedge_slice364 crp= 1 +--- 'expires': 1167126899 +366 None onedgf_slice365 nodes= [365, 366, 367, 3365, 3366, 3367] persons= [369, 370, 371] +--- sas= [] onedgf_slice365 crp= 1 +--- 'expires': 1167126899 +367 None onedgg_slice366 nodes= [366, 367, 368, 3366, 3367, 3368] persons= [370, 371, 372] +--- sas= [] onedgg_slice366 crp= 1 +--- 'expires': 1167126899 +368 None onedgh_slice367 nodes= [367, 368, 369, 3367, 3368, 3369] persons= [371, 372, 373] +--- sas= [] onedgh_slice367 crp= 1 +--- 'expires': 1167126899 +369 None onedgi_slice368 nodes= [368, 369, 370, 3368, 3369, 3370] persons= [372, 373, 374] +--- sas= [] onedgi_slice368 crp= 1 +--- 'expires': 1167126900 +370 None onedgj_slice369 nodes= [369, 370, 371, 3369, 3370, 3371] persons= [373, 374, 375] +--- sas= [] onedgj_slice369 crp= 1 +--- 'expires': 1167126900 +371 None onedha_slice370 nodes= [370, 371, 372, 3370, 3371, 3372] persons= [374, 375, 376] +--- sas= [] onedha_slice370 crp= 1 +--- 'expires': 1167126900 +372 None onedhb_slice371 nodes= [371, 372, 373, 3371, 3372, 3373] persons= [375, 376, 377] +--- sas= [] onedhb_slice371 crp= 1 +--- 'expires': 1167126900 +373 None onedhc_slice372 nodes= [372, 373, 374, 3372, 3373, 3374] persons= [376, 377, 378] +--- sas= [] onedhc_slice372 crp= 1 +--- 'expires': 1167126901 +374 None onedhd_slice373 nodes= [373, 374, 375, 3373, 3374, 3375] persons= [377, 378, 379] +--- sas= [] onedhd_slice373 crp= 1 +--- 'expires': 1167126901 +375 None onedhe_slice374 nodes= [374, 375, 376, 3374, 3375, 3376] persons= [378, 379, 380] +--- sas= [] onedhe_slice374 crp= 1 +--- 'expires': 1167126901 +376 None onedhf_slice375 nodes= [375, 376, 377, 3375, 3376, 3377] persons= [379, 380, 381] +--- sas= [] onedhf_slice375 crp= 1 +--- 'expires': 1167126901 +377 None onedhg_slice376 nodes= [376, 377, 378, 3376, 3377, 3378] persons= [380, 381, 382] +--- sas= [] onedhg_slice376 crp= 1 +--- 'expires': 1167126902 +378 None onedhh_slice377 nodes= [377, 378, 379, 3377, 3378, 3379] persons= [381, 382, 383] +--- sas= [] onedhh_slice377 crp= 1 +--- 'expires': 1167126903 +379 None onedhi_slice378 nodes= [378, 379, 380, 3378, 3379, 3380] persons= [382, 383, 384] +--- sas= [] onedhi_slice378 crp= 1 +--- 'expires': 1167126904 +380 None onedhj_slice379 nodes= [379, 380, 381, 3379, 3380, 3381] persons= [383, 384, 385] +--- sas= [] onedhj_slice379 crp= 1 +--- 'expires': 1167126905 +381 None onedia_slice380 nodes= [380, 381, 382, 3380, 3381, 3382] persons= [384, 385, 386] +--- sas= [] onedia_slice380 crp= 1 +--- 'expires': 1167126906 +382 None onedib_slice381 nodes= [381, 382, 383, 3381, 3382, 3383] persons= [385, 386, 387] +--- sas= [] onedib_slice381 crp= 1 +--- 'expires': 1167126907 +383 None onedic_slice382 nodes= [382, 383, 384, 3382, 3383, 3384] persons= [386, 387, 388] +--- sas= [] onedic_slice382 crp= 1 +--- 'expires': 1167126908 +384 None onedid_slice383 nodes= [383, 384, 385, 3383, 3384, 3385] persons= [387, 388, 389] +--- sas= [] onedid_slice383 crp= 1 +--- 'expires': 1167126909 +385 None onedie_slice384 nodes= [384, 385, 386, 3384, 3385, 3386] persons= [388, 389, 390] +--- sas= [] onedie_slice384 crp= 1 +--- 'expires': 1167126910 +386 None onedif_slice385 nodes= [385, 386, 387, 3385, 3386, 3387] persons= [389, 390, 391] +--- sas= [] onedif_slice385 crp= 1 +--- 'expires': 1167126911 +387 None onedig_slice386 nodes= [386, 387, 388, 3386, 3387, 3388] persons= [390, 391, 392] +--- sas= [] onedig_slice386 crp= 1 +--- 'expires': 1167126912 +388 None onedih_slice387 nodes= [387, 388, 389, 3387, 3388, 3389] persons= [391, 392, 393] +--- sas= [] onedih_slice387 crp= 1 +--- 'expires': 1167126913 +389 None onedii_slice388 nodes= [388, 389, 390, 3388, 3389, 3390] persons= [392, 393, 394] +--- sas= [] onedii_slice388 crp= 1 +--- 'expires': 1167126914 +390 None onedij_slice389 nodes= [389, 390, 391, 3389, 3390, 3391] persons= [393, 394, 395] +--- sas= [] onedij_slice389 crp= 1 +--- 'expires': 1167126915 +391 None onedja_slice390 nodes= [390, 391, 392, 3390, 3391, 3392] persons= [394, 395, 396] +--- sas= [] onedja_slice390 crp= 1 +--- 'expires': 1167126916 +392 None onedjb_slice391 nodes= [391, 392, 393, 3391, 3392, 3393] persons= [395, 396, 397] +--- sas= [] onedjb_slice391 crp= 1 +--- 'expires': 1167126917 +393 None onedjc_slice392 nodes= [392, 393, 394, 3392, 3393, 3394] persons= [396, 397, 398] +--- sas= [] onedjc_slice392 crp= 1 +--- 'expires': 1167126918 +394 None onedjd_slice393 nodes= [393, 394, 395, 3393, 3394, 3395] persons= [397, 398, 399] +--- sas= [] onedjd_slice393 crp= 1 +--- 'expires': 1167126919 +395 None onedje_slice394 nodes= [394, 395, 396, 3394, 3395, 3396] persons= [398, 399, 400] +--- sas= [] onedje_slice394 crp= 1 +--- 'expires': 1167126920 +396 None onedjf_slice395 nodes= [395, 396, 397, 3395, 3396, 3397] persons= [399, 400, 401] +--- sas= [] onedjf_slice395 crp= 1 +--- 'expires': 1167126921 +397 None onedjg_slice396 nodes= [396, 397, 398, 3396, 3397, 3398] persons= [400, 401, 402] +--- sas= [] onedjg_slice396 crp= 1 +--- 'expires': 1167126921 +398 None onedjh_slice397 nodes= [397, 398, 399, 3397, 3398, 3399] persons= [401, 402, 403] +--- sas= [] onedjh_slice397 crp= 1 +--- 'expires': 1167126921 +399 None onedji_slice398 nodes= [398, 399, 400, 3398, 3399, 3400] persons= [402, 403, 404] +--- sas= [] onedji_slice398 crp= 1 +--- 'expires': 1167126922 +400 None onedjj_slice399 nodes= [399, 400, 401, 3399, 3400, 3401] persons= [403, 404, 405] +--- sas= [] onedjj_slice399 crp= 1 +--- 'expires': 1167126922 +401 None oneeaa_slice400 nodes= [400, 401, 402, 3400, 3401, 3402] persons= [404, 405, 406] +--- sas= [] oneeaa_slice400 crp= 1 +--- 'expires': 1167126922 +402 None oneeab_slice401 nodes= [401, 402, 403, 3401, 3402, 3403] persons= [405, 406, 407] +--- sas= [] oneeab_slice401 crp= 1 +--- 'expires': 1167126922 +403 None oneeac_slice402 nodes= [402, 403, 404, 3402, 3403, 3404] persons= [406, 407, 408] +--- sas= [] oneeac_slice402 crp= 1 +--- 'expires': 1167126923 +404 None oneead_slice403 nodes= [403, 404, 405, 3403, 3404, 3405] persons= [407, 408, 409] +--- sas= [] oneead_slice403 crp= 1 +--- 'expires': 1167126923 +405 None oneeae_slice404 nodes= [404, 405, 406, 3404, 3405, 3406] persons= [408, 409, 410] +--- sas= [] oneeae_slice404 crp= 1 +--- 'expires': 1167126923 +406 None oneeaf_slice405 nodes= [405, 406, 407, 3405, 3406, 3407] persons= [409, 410, 411] +--- sas= [] oneeaf_slice405 crp= 1 +--- 'expires': 1167126923 +407 None oneeag_slice406 nodes= [406, 407, 408, 3406, 3407, 3408] persons= [410, 411, 412] +--- sas= [] oneeag_slice406 crp= 1 +--- 'expires': 1167126924 +408 None oneeah_slice407 nodes= [407, 408, 409, 3407, 3408, 3409] persons= [411, 412, 413] +--- sas= [] oneeah_slice407 crp= 1 +--- 'expires': 1167126924 +409 None oneeai_slice408 nodes= [408, 409, 410, 3408, 3409, 3410] persons= [412, 413, 414] +--- sas= [] oneeai_slice408 crp= 1 +--- 'expires': 1167126924 +410 None oneeaj_slice409 nodes= [409, 410, 411, 3409, 3410, 3411] persons= [413, 414, 415] +--- sas= [] oneeaj_slice409 crp= 1 +--- 'expires': 1167126924 +411 None oneeba_slice410 nodes= [410, 411, 412, 3410, 3411, 3412] persons= [414, 415, 416] +--- sas= [] oneeba_slice410 crp= 1 +--- 'expires': 1167126925 +412 None oneebb_slice411 nodes= [411, 412, 413, 3411, 3412, 3413] persons= [415, 416, 417] +--- sas= [] oneebb_slice411 crp= 1 +--- 'expires': 1167126925 +413 None oneebc_slice412 nodes= [412, 413, 414, 3412, 3413, 3414] persons= [416, 417, 418] +--- sas= [] oneebc_slice412 crp= 1 +--- 'expires': 1167126925 +414 None oneebd_slice413 nodes= [413, 414, 415, 3413, 3414, 3415] persons= [417, 418, 419] +--- sas= [] oneebd_slice413 crp= 1 +--- 'expires': 1167126925 +415 None oneebe_slice414 nodes= [414, 415, 416, 3414, 3415, 3416] persons= [418, 419, 420] +--- sas= [] oneebe_slice414 crp= 1 +--- 'expires': 1167126926 +416 None oneebf_slice415 nodes= [415, 416, 417, 3415, 3416, 3417] persons= [419, 420, 421] +--- sas= [] oneebf_slice415 crp= 1 +--- 'expires': 1167126926 +417 None oneebg_slice416 nodes= [416, 417, 418, 3416, 3417, 3418] persons= [420, 421, 422] +--- sas= [] oneebg_slice416 crp= 1 +--- 'expires': 1167126926 +418 None oneebh_slice417 nodes= [417, 418, 419, 3417, 3418, 3419] persons= [421, 422, 423] +--- sas= [] oneebh_slice417 crp= 1 +--- 'expires': 1167126926 +419 None oneebi_slice418 nodes= [418, 419, 420, 3418, 3419, 3420] persons= [422, 423, 424] +--- sas= [] oneebi_slice418 crp= 1 +--- 'expires': 1167126927 +420 None oneebj_slice419 nodes= [419, 420, 421, 3419, 3420, 3421] persons= [423, 424, 425] +--- sas= [] oneebj_slice419 crp= 1 +--- 'expires': 1167126927 +421 None oneeca_slice420 nodes= [420, 421, 422, 3420, 3421, 3422] persons= [424, 425, 426] +--- sas= [] oneeca_slice420 crp= 1 +--- 'expires': 1167126927 +422 None oneecb_slice421 nodes= [421, 422, 423, 3421, 3422, 3423] persons= [425, 426, 427] +--- sas= [] oneecb_slice421 crp= 1 +--- 'expires': 1167126927 +423 None oneecc_slice422 nodes= [422, 423, 424, 3422, 3423, 3424] persons= [426, 427, 428] +--- sas= [] oneecc_slice422 crp= 1 +--- 'expires': 1167126928 +424 None oneecd_slice423 nodes= [423, 424, 425, 3423, 3424, 3425] persons= [427, 428, 429] +--- sas= [] oneecd_slice423 crp= 1 +--- 'expires': 1167126928 +425 None oneece_slice424 nodes= [424, 425, 426, 3424, 3425, 3426] persons= [428, 429, 430] +--- sas= [] oneece_slice424 crp= 1 +--- 'expires': 1167126928 +426 None oneecf_slice425 nodes= [425, 426, 427, 3425, 3426, 3427] persons= [429, 430, 431] +--- sas= [] oneecf_slice425 crp= 1 +--- 'expires': 1167126928 +427 None oneecg_slice426 nodes= [426, 427, 428, 3426, 3427, 3428] persons= [430, 431, 432] +--- sas= [] oneecg_slice426 crp= 1 +--- 'expires': 1167126929 +428 None oneech_slice427 nodes= [427, 428, 429, 3427, 3428, 3429] persons= [431, 432, 433] +--- sas= [] oneech_slice427 crp= 1 +--- 'expires': 1167126929 +429 None oneeci_slice428 nodes= [428, 429, 430, 3428, 3429, 3430] persons= [432, 433, 434] +--- sas= [] oneeci_slice428 crp= 1 +--- 'expires': 1167126929 +430 None oneecj_slice429 nodes= [429, 430, 431, 3429, 3430, 3431] persons= [433, 434, 435] +--- sas= [] oneecj_slice429 crp= 1 +--- 'expires': 1167126929 +431 None oneeda_slice430 nodes= [430, 431, 432, 3430, 3431, 3432] persons= [434, 435, 436] +--- sas= [] oneeda_slice430 crp= 1 +--- 'expires': 1167126930 +432 None oneedb_slice431 nodes= [431, 432, 433, 3431, 3432, 3433] persons= [435, 436, 437] +--- sas= [] oneedb_slice431 crp= 1 +--- 'expires': 1167126930 +433 None oneedc_slice432 nodes= [432, 433, 434, 3432, 3433, 3434] persons= [436, 437, 438] +--- sas= [] oneedc_slice432 crp= 1 +--- 'expires': 1167126930 +434 None oneedd_slice433 nodes= [433, 434, 435, 3433, 3434, 3435] persons= [437, 438, 439] +--- sas= [] oneedd_slice433 crp= 1 +--- 'expires': 1167126930 +435 None oneede_slice434 nodes= [434, 435, 436, 3434, 3435, 3436] persons= [438, 439, 440] +--- sas= [] oneede_slice434 crp= 1 +--- 'expires': 1167126931 +436 None oneedf_slice435 nodes= [435, 436, 437, 3435, 3436, 3437] persons= [439, 440, 441] +--- sas= [] oneedf_slice435 crp= 1 +--- 'expires': 1167126931 +437 None oneedg_slice436 nodes= [436, 437, 438, 3436, 3437, 3438] persons= [440, 441, 442] +--- sas= [] oneedg_slice436 crp= 1 +--- 'expires': 1167126931 +438 None oneedh_slice437 nodes= [437, 438, 439, 3437, 3438, 3439] persons= [441, 442, 443] +--- sas= [] oneedh_slice437 crp= 1 +--- 'expires': 1167126931 +439 None oneedi_slice438 nodes= [438, 439, 440, 3438, 3439, 3440] persons= [442, 443, 444] +--- sas= [] oneedi_slice438 crp= 1 +--- 'expires': 1167126932 +440 None oneedj_slice439 nodes= [439, 440, 441, 3439, 3440, 3441] persons= [443, 444, 445] +--- sas= [] oneedj_slice439 crp= 1 +--- 'expires': 1167126932 +441 None oneeea_slice440 nodes= [440, 441, 442, 3440, 3441, 3442] persons= [444, 445, 446] +--- sas= [] oneeea_slice440 crp= 1 +--- 'expires': 1167126932 +442 None oneeeb_slice441 nodes= [441, 442, 443, 3441, 3442, 3443] persons= [445, 446, 447] +--- sas= [] oneeeb_slice441 crp= 1 +--- 'expires': 1167126932 +443 None oneeec_slice442 nodes= [442, 443, 444, 3442, 3443, 3444] persons= [446, 447, 448] +--- sas= [] oneeec_slice442 crp= 1 +--- 'expires': 1167126933 +444 None oneeed_slice443 nodes= [443, 444, 445, 3443, 3444, 3445] persons= [447, 448, 449] +--- sas= [] oneeed_slice443 crp= 1 +--- 'expires': 1167126933 +445 None oneeee_slice444 nodes= [444, 445, 446, 3444, 3445, 3446] persons= [448, 449, 450] +--- sas= [] oneeee_slice444 crp= 1 +--- 'expires': 1167126933 +446 None oneeef_slice445 nodes= [445, 446, 447, 3445, 3446, 3447] persons= [449, 450, 451] +--- sas= [] oneeef_slice445 crp= 1 +--- 'expires': 1167126933 +447 None oneeeg_slice446 nodes= [446, 447, 448, 3446, 3447, 3448] persons= [450, 451, 452] +--- sas= [] oneeeg_slice446 crp= 1 +--- 'expires': 1167126934 +448 None oneeeh_slice447 nodes= [447, 448, 449, 3447, 3448, 3449] persons= [451, 452, 453] +--- sas= [] oneeeh_slice447 crp= 1 +--- 'expires': 1167126934 +449 None oneeei_slice448 nodes= [448, 449, 450, 3448, 3449, 3450] persons= [452, 453, 454] +--- sas= [] oneeei_slice448 crp= 1 +--- 'expires': 1167126934 +450 None oneeej_slice449 nodes= [449, 450, 451, 3449, 3450, 3451] persons= [453, 454, 455] +--- sas= [] oneeej_slice449 crp= 1 +--- 'expires': 1167126934 +451 None oneefa_slice450 nodes= [450, 451, 452, 3450, 3451, 3452] persons= [454, 455, 456] +--- sas= [] oneefa_slice450 crp= 1 +--- 'expires': 1167126935 +452 None oneefb_slice451 nodes= [451, 452, 453, 3451, 3452, 3453] persons= [455, 456, 457] +--- sas= [] oneefb_slice451 crp= 1 +--- 'expires': 1167126935 +453 None oneefc_slice452 nodes= [452, 453, 454, 3452, 3453, 3454] persons= [456, 457, 458] +--- sas= [] oneefc_slice452 crp= 1 +--- 'expires': 1167126935 +454 None oneefd_slice453 nodes= [453, 454, 455, 3453, 3454, 3455] persons= [457, 458, 459] +--- sas= [] oneefd_slice453 crp= 1 +--- 'expires': 1167126935 +455 None oneefe_slice454 nodes= [454, 455, 456, 3454, 3455, 3456] persons= [458, 459, 460] +--- sas= [] oneefe_slice454 crp= 1 +--- 'expires': 1167126936 +456 None oneeff_slice455 nodes= [455, 456, 457, 3455, 3456, 3457] persons= [459, 460, 461] +--- sas= [] oneeff_slice455 crp= 1 +--- 'expires': 1167126936 +457 None oneefg_slice456 nodes= [456, 457, 458, 3456, 3457, 3458] persons= [460, 461, 462] +--- sas= [] oneefg_slice456 crp= 1 +--- 'expires': 1167126936 +458 None oneefh_slice457 nodes= [457, 458, 459, 3457, 3458, 3459] persons= [461, 462, 463] +--- sas= [] oneefh_slice457 crp= 1 +--- 'expires': 1167126936 +459 None oneefi_slice458 nodes= [458, 459, 460, 3458, 3459, 3460] persons= [462, 463, 464] +--- sas= [] oneefi_slice458 crp= 1 +--- 'expires': 1167126937 +460 None oneefj_slice459 nodes= [459, 460, 461, 3459, 3460, 3461] persons= [463, 464, 465] +--- sas= [] oneefj_slice459 crp= 1 +--- 'expires': 1167126937 +461 None oneega_slice460 nodes= [460, 461, 462, 3460, 3461, 3462] persons= [464, 465, 466] +--- sas= [] oneega_slice460 crp= 1 +--- 'expires': 1167126937 +462 None oneegb_slice461 nodes= [461, 462, 463, 3461, 3462, 3463] persons= [465, 466, 467] +--- sas= [] oneegb_slice461 crp= 1 +--- 'expires': 1167126938 +463 None oneegc_slice462 nodes= [462, 463, 464, 3462, 3463, 3464] persons= [466, 467, 468] +--- sas= [] oneegc_slice462 crp= 1 +--- 'expires': 1167126938 +464 None oneegd_slice463 nodes= [463, 464, 465, 3463, 3464, 3465] persons= [467, 468, 469] +--- sas= [] oneegd_slice463 crp= 1 +--- 'expires': 1167126938 +465 None oneege_slice464 nodes= [464, 465, 466, 3464, 3465, 3466] persons= [468, 469, 470] +--- sas= [] oneege_slice464 crp= 1 +--- 'expires': 1167126938 +466 None oneegf_slice465 nodes= [465, 466, 467, 3465, 3466, 3467] persons= [469, 470, 471] +--- sas= [] oneegf_slice465 crp= 1 +--- 'expires': 1167126939 +467 None oneegg_slice466 nodes= [466, 467, 468, 3466, 3467, 3468] persons= [470, 471, 472] +--- sas= [] oneegg_slice466 crp= 1 +--- 'expires': 1167126939 +468 None oneegh_slice467 nodes= [467, 468, 469, 3467, 3468, 3469] persons= [471, 472, 473] +--- sas= [] oneegh_slice467 crp= 1 +--- 'expires': 1167126939 +469 None oneegi_slice468 nodes= [468, 469, 470, 3468, 3469, 3470] persons= [472, 473, 474] +--- sas= [] oneegi_slice468 crp= 1 +--- 'expires': 1167126939 +470 None oneegj_slice469 nodes= [469, 470, 471, 3469, 3470, 3471] persons= [473, 474, 475] +--- sas= [] oneegj_slice469 crp= 1 +--- 'expires': 1167126940 +471 None oneeha_slice470 nodes= [470, 471, 472, 3470, 3471, 3472] persons= [474, 475, 476] +--- sas= [] oneeha_slice470 crp= 1 +--- 'expires': 1167126940 +472 None oneehb_slice471 nodes= [471, 472, 473, 3471, 3472, 3473] persons= [475, 476, 477] +--- sas= [] oneehb_slice471 crp= 1 +--- 'expires': 1167126940 +473 None oneehc_slice472 nodes= [472, 473, 474, 3472, 3473, 3474] persons= [476, 477, 478] +--- sas= [] oneehc_slice472 crp= 1 +--- 'expires': 1167126940 +474 None oneehd_slice473 nodes= [473, 474, 475, 3473, 3474, 3475] persons= [477, 478, 479] +--- sas= [] oneehd_slice473 crp= 1 +--- 'expires': 1167126941 +475 None oneehe_slice474 nodes= [474, 475, 476, 3474, 3475, 3476] persons= [478, 479, 480] +--- sas= [] oneehe_slice474 crp= 1 +--- 'expires': 1167126941 +476 None oneehf_slice475 nodes= [475, 476, 477, 3475, 3476, 3477] persons= [479, 480, 481] +--- sas= [] oneehf_slice475 crp= 1 +--- 'expires': 1167126941 +477 None oneehg_slice476 nodes= [476, 477, 478, 3476, 3477, 3478] persons= [480, 481, 482] +--- sas= [] oneehg_slice476 crp= 1 +--- 'expires': 1167126941 +478 None oneehh_slice477 nodes= [477, 478, 479, 3477, 3478, 3479] persons= [481, 482, 483] +--- sas= [] oneehh_slice477 crp= 1 +--- 'expires': 1167126942 +479 None oneehi_slice478 nodes= [478, 479, 480, 3478, 3479, 3480] persons= [482, 483, 484] +--- sas= [] oneehi_slice478 crp= 1 +--- 'expires': 1167126942 +480 None oneehj_slice479 nodes= [479, 480, 481, 3479, 3480, 3481] persons= [483, 484, 485] +--- sas= [] oneehj_slice479 crp= 1 +--- 'expires': 1167126942 +481 None oneeia_slice480 nodes= [480, 481, 482, 3480, 3481, 3482] persons= [484, 485, 486] +--- sas= [] oneeia_slice480 crp= 1 +--- 'expires': 1167126942 +482 None oneeib_slice481 nodes= [481, 482, 483, 3481, 3482, 3483] persons= [485, 486, 487] +--- sas= [] oneeib_slice481 crp= 1 +--- 'expires': 1167126943 +483 None oneeic_slice482 nodes= [482, 483, 484, 3482, 3483, 3484] persons= [486, 487, 488] +--- sas= [] oneeic_slice482 crp= 1 +--- 'expires': 1167126943 +484 None oneeid_slice483 nodes= [483, 484, 485, 3483, 3484, 3485] persons= [487, 488, 489] +--- sas= [] oneeid_slice483 crp= 1 +--- 'expires': 1167126943 +485 None oneeie_slice484 nodes= [484, 485, 486, 3484, 3485, 3486] persons= [488, 489, 490] +--- sas= [] oneeie_slice484 crp= 1 +--- 'expires': 1167126943 +486 None oneeif_slice485 nodes= [485, 486, 487, 3485, 3486, 3487] persons= [489, 490, 491] +--- sas= [] oneeif_slice485 crp= 1 +--- 'expires': 1167126944 +487 None oneeig_slice486 nodes= [486, 487, 488, 3486, 3487, 3488] persons= [490, 491, 492] +--- sas= [] oneeig_slice486 crp= 1 +--- 'expires': 1167126944 +488 None oneeih_slice487 nodes= [487, 488, 489, 3487, 3488, 3489] persons= [491, 492, 493] +--- sas= [] oneeih_slice487 crp= 1 +--- 'expires': 1167126944 +489 None oneeii_slice488 nodes= [488, 489, 490, 3488, 3489, 3490] persons= [492, 493, 494] +--- sas= [] oneeii_slice488 crp= 1 +--- 'expires': 1167126945 +490 None oneeij_slice489 nodes= [489, 490, 491, 3489, 3490, 3491] persons= [493, 494, 495] +--- sas= [] oneeij_slice489 crp= 1 +--- 'expires': 1167126945 +491 None oneeja_slice490 nodes= [490, 491, 492, 3490, 3491, 3492] persons= [494, 495, 496] +--- sas= [] oneeja_slice490 crp= 1 +--- 'expires': 1167126945 +492 None oneejb_slice491 nodes= [491, 492, 493, 3491, 3492, 3493] persons= [495, 496, 497] +--- sas= [] oneejb_slice491 crp= 1 +--- 'expires': 1167126945 +493 None oneejc_slice492 nodes= [492, 493, 494, 3492, 3493, 3494] persons= [496, 497, 498] +--- sas= [] oneejc_slice492 crp= 1 +--- 'expires': 1167126946 +494 None oneejd_slice493 nodes= [493, 494, 495, 3493, 3494, 3495] persons= [497, 498, 499] +--- sas= [] oneejd_slice493 crp= 1 +--- 'expires': 1167126946 +495 None oneeje_slice494 nodes= [494, 495, 496, 3494, 3495, 3496] persons= [498, 499, 500] +--- sas= [] oneeje_slice494 crp= 1 +--- 'expires': 1167126946 +496 None oneejf_slice495 nodes= [495, 496, 497, 3495, 3496, 3497] persons= [499, 500, 501] +--- sas= [] oneejf_slice495 crp= 1 +--- 'expires': 1167126946 +497 None oneejg_slice496 nodes= [496, 497, 498, 3496, 3497, 3498] persons= [500, 501, 502] +--- sas= [] oneejg_slice496 crp= 1 +--- 'expires': 1167126947 +498 None oneejh_slice497 nodes= [497, 498, 499, 3497, 3498, 3499] persons= [501, 502, 503] +--- sas= [] oneejh_slice497 crp= 1 +--- 'expires': 1167126947 +499 None oneeji_slice498 nodes= [498, 499, 500, 3498, 3499, 3500] persons= [502, 503, 504] +--- sas= [] oneeji_slice498 crp= 1 +--- 'expires': 1167126947 +500 None oneejj_slice499 nodes= [499, 500, 501, 3499, 3500, 3501] persons= [503, 504, 505] +--- sas= [] oneejj_slice499 crp= 1 +--- 'expires': 1167126947 +501 None onefaa_slice500 nodes= [500, 501, 502, 3500, 3501, 3502] persons= [504, 505, 506] +--- sas= [] onefaa_slice500 crp= 1 +--- 'expires': 1167126948 +502 None onefab_slice501 nodes= [501, 502, 503, 3501, 3502, 3503] persons= [505, 506, 507] +--- sas= [] onefab_slice501 crp= 1 +--- 'expires': 1167126948 +503 None onefac_slice502 nodes= [502, 503, 504, 3502, 3503, 3504] persons= [506, 507, 508] +--- sas= [] onefac_slice502 crp= 1 +--- 'expires': 1167126948 +504 None onefad_slice503 nodes= [503, 504, 505, 3503, 3504, 3505] persons= [507, 508, 509] +--- sas= [] onefad_slice503 crp= 1 +--- 'expires': 1167126948 +505 None onefae_slice504 nodes= [504, 505, 506, 3504, 3505, 3506] persons= [508, 509, 510] +--- sas= [] onefae_slice504 crp= 1 +--- 'expires': 1167126949 +506 None onefaf_slice505 nodes= [505, 506, 507, 3505, 3506, 3507] persons= [509, 510, 511] +--- sas= [] onefaf_slice505 crp= 1 +--- 'expires': 1167126949 +507 None onefag_slice506 nodes= [506, 507, 508, 3506, 3507, 3508] persons= [510, 511, 512] +--- sas= [] onefag_slice506 crp= 1 +--- 'expires': 1167126949 +508 None onefah_slice507 nodes= [507, 508, 509, 3507, 3508, 3509] persons= [511, 512, 513] +--- sas= [] onefah_slice507 crp= 1 +--- 'expires': 1167126950 +509 None onefai_slice508 nodes= [508, 509, 510, 3508, 3509, 3510] persons= [512, 513, 514] +--- sas= [] onefai_slice508 crp= 1 +--- 'expires': 1167126950 +510 None onefaj_slice509 nodes= [509, 510, 511, 3509, 3510, 3511] persons= [513, 514, 515] +--- sas= [] onefaj_slice509 crp= 1 +--- 'expires': 1167126950 +511 None onefba_slice510 nodes= [510, 511, 512, 3510, 3511, 3512] persons= [514, 515, 516] +--- sas= [] onefba_slice510 crp= 1 +--- 'expires': 1167126950 +512 None onefbb_slice511 nodes= [511, 512, 513, 3511, 3512, 3513] persons= [515, 516, 517] +--- sas= [] onefbb_slice511 crp= 1 +--- 'expires': 1167126951 +513 None onefbc_slice512 nodes= [512, 513, 514, 3512, 3513, 3514] persons= [516, 517, 518] +--- sas= [] onefbc_slice512 crp= 1 +--- 'expires': 1167126951 +514 None onefbd_slice513 nodes= [513, 514, 515, 3513, 3514, 3515] persons= [517, 518, 519] +--- sas= [] onefbd_slice513 crp= 1 +--- 'expires': 1167126951 +515 None onefbe_slice514 nodes= [514, 515, 516, 3514, 3515, 3516] persons= [518, 519, 520] +--- sas= [] onefbe_slice514 crp= 1 +--- 'expires': 1167126951 +516 None onefbf_slice515 nodes= [515, 516, 517, 3515, 3516, 3517] persons= [519, 520, 521] +--- sas= [] onefbf_slice515 crp= 1 +--- 'expires': 1167126952 +517 None onefbg_slice516 nodes= [516, 517, 518, 3516, 3517, 3518] persons= [520, 521, 522] +--- sas= [] onefbg_slice516 crp= 1 +--- 'expires': 1167126952 +518 None onefbh_slice517 nodes= [517, 518, 519, 3517, 3518, 3519] persons= [521, 522, 523] +--- sas= [] onefbh_slice517 crp= 1 +--- 'expires': 1167126952 +519 None onefbi_slice518 nodes= [518, 519, 520, 3518, 3519, 3520] persons= [522, 523, 524] +--- sas= [] onefbi_slice518 crp= 1 +--- 'expires': 1167126952 +520 None onefbj_slice519 nodes= [519, 520, 521, 3519, 3520, 3521] persons= [523, 524, 525] +--- sas= [] onefbj_slice519 crp= 1 +--- 'expires': 1167126953 +521 None onefca_slice520 nodes= [520, 521, 522, 3520, 3521, 3522] persons= [524, 525, 526] +--- sas= [] onefca_slice520 crp= 1 +--- 'expires': 1167126953 +522 None onefcb_slice521 nodes= [521, 522, 523, 3521, 3522, 3523] persons= [525, 526, 527] +--- sas= [] onefcb_slice521 crp= 1 +--- 'expires': 1167126953 +523 None onefcc_slice522 nodes= [522, 523, 524, 3522, 3523, 3524] persons= [526, 527, 528] +--- sas= [] onefcc_slice522 crp= 1 +--- 'expires': 1167126954 +524 None onefcd_slice523 nodes= [523, 524, 525, 3523, 3524, 3525] persons= [527, 528, 529] +--- sas= [] onefcd_slice523 crp= 1 +--- 'expires': 1167126954 +525 None onefce_slice524 nodes= [524, 525, 526, 3524, 3525, 3526] persons= [528, 529, 530] +--- sas= [] onefce_slice524 crp= 1 +--- 'expires': 1167126954 +526 None onefcf_slice525 nodes= [525, 526, 527, 3525, 3526, 3527] persons= [529, 530, 531] +--- sas= [] onefcf_slice525 crp= 1 +--- 'expires': 1167126954 +527 None onefcg_slice526 nodes= [526, 527, 528, 3526, 3527, 3528] persons= [530, 531, 532] +--- sas= [] onefcg_slice526 crp= 1 +--- 'expires': 1167126955 +528 None onefch_slice527 nodes= [527, 528, 529, 3527, 3528, 3529] persons= [531, 532, 533] +--- sas= [] onefch_slice527 crp= 1 +--- 'expires': 1167126955 +529 None onefci_slice528 nodes= [528, 529, 530, 3528, 3529, 3530] persons= [532, 533, 534] +--- sas= [] onefci_slice528 crp= 1 +--- 'expires': 1167126955 +530 None onefcj_slice529 nodes= [529, 530, 531, 3529, 3530, 3531] persons= [533, 534, 535] +--- sas= [] onefcj_slice529 crp= 1 +--- 'expires': 1167126955 +531 None onefda_slice530 nodes= [530, 531, 532, 3530, 3531, 3532] persons= [534, 535, 536] +--- sas= [] onefda_slice530 crp= 1 +--- 'expires': 1167126956 +532 None onefdb_slice531 nodes= [531, 532, 533, 3531, 3532, 3533] persons= [535, 536, 537] +--- sas= [] onefdb_slice531 crp= 1 +--- 'expires': 1167126956 +533 None onefdc_slice532 nodes= [532, 533, 534, 3532, 3533, 3534] persons= [536, 537, 538] +--- sas= [] onefdc_slice532 crp= 1 +--- 'expires': 1167126956 +534 None onefdd_slice533 nodes= [533, 534, 535, 3533, 3534, 3535] persons= [537, 538, 539] +--- sas= [] onefdd_slice533 crp= 1 +--- 'expires': 1167126956 +535 None onefde_slice534 nodes= [534, 535, 536, 3534, 3535, 3536] persons= [538, 539, 540] +--- sas= [] onefde_slice534 crp= 1 +--- 'expires': 1167126957 +536 None onefdf_slice535 nodes= [535, 536, 537, 3535, 3536, 3537] persons= [539, 540, 541] +--- sas= [] onefdf_slice535 crp= 1 +--- 'expires': 1167126957 +537 None onefdg_slice536 nodes= [536, 537, 538, 3536, 3537, 3538] persons= [540, 541, 542] +--- sas= [] onefdg_slice536 crp= 1 +--- 'expires': 1167126957 +538 None onefdh_slice537 nodes= [537, 538, 539, 3537, 3538, 3539] persons= [541, 542, 543] +--- sas= [] onefdh_slice537 crp= 1 +--- 'expires': 1167126958 +539 None onefdi_slice538 nodes= [538, 539, 540, 3538, 3539, 3540] persons= [542, 543, 544] +--- sas= [] onefdi_slice538 crp= 1 +--- 'expires': 1167126958 +540 None onefdj_slice539 nodes= [539, 540, 541, 3539, 3540, 3541] persons= [543, 544, 545] +--- sas= [] onefdj_slice539 crp= 1 +--- 'expires': 1167126958 +541 None onefea_slice540 nodes= [540, 541, 542, 3540, 3541, 3542] persons= [544, 545, 546] +--- sas= [] onefea_slice540 crp= 1 +--- 'expires': 1167126958 +542 None onefeb_slice541 nodes= [541, 542, 543, 3541, 3542, 3543] persons= [545, 546, 547] +--- sas= [] onefeb_slice541 crp= 1 +--- 'expires': 1167126959 +543 None onefec_slice542 nodes= [542, 543, 544, 3542, 3543, 3544] persons= [546, 547, 548] +--- sas= [] onefec_slice542 crp= 1 +--- 'expires': 1167126959 +544 None onefed_slice543 nodes= [543, 544, 545, 3543, 3544, 3545] persons= [547, 548, 549] +--- sas= [] onefed_slice543 crp= 1 +--- 'expires': 1167126959 +545 None onefee_slice544 nodes= [544, 545, 546, 3544, 3545, 3546] persons= [548, 549, 550] +--- sas= [] onefee_slice544 crp= 1 +--- 'expires': 1167126959 +546 None onefef_slice545 nodes= [545, 546, 547, 3545, 3546, 3547] persons= [549, 550, 551] +--- sas= [] onefef_slice545 crp= 1 +--- 'expires': 1167126960 +547 None onefeg_slice546 nodes= [546, 547, 548, 3546, 3547, 3548] persons= [550, 551, 552] +--- sas= [] onefeg_slice546 crp= 1 +--- 'expires': 1167126960 +548 None onefeh_slice547 nodes= [547, 548, 549, 3547, 3548, 3549] persons= [551, 552, 553] +--- sas= [] onefeh_slice547 crp= 1 +--- 'expires': 1167126960 +549 None onefei_slice548 nodes= [548, 549, 550, 3548, 3549, 3550] persons= [552, 553, 554] +--- sas= [] onefei_slice548 crp= 1 +--- 'expires': 1167126961 +550 None onefej_slice549 nodes= [549, 550, 551, 3549, 3550, 3551] persons= [553, 554, 555] +--- sas= [] onefej_slice549 crp= 1 +--- 'expires': 1167126961 +551 None oneffa_slice550 nodes= [550, 551, 552, 3550, 3551, 3552] persons= [554, 555, 556] +--- sas= [] oneffa_slice550 crp= 1 +--- 'expires': 1167126961 +552 None oneffb_slice551 nodes= [551, 552, 553, 3551, 3552, 3553] persons= [555, 556, 557] +--- sas= [] oneffb_slice551 crp= 1 +--- 'expires': 1167126961 +553 None oneffc_slice552 nodes= [552, 553, 554, 3552, 3553, 3554] persons= [556, 557, 558] +--- sas= [] oneffc_slice552 crp= 1 +--- 'expires': 1167126962 +554 None oneffd_slice553 nodes= [553, 554, 555, 3553, 3554, 3555] persons= [557, 558, 559] +--- sas= [] oneffd_slice553 crp= 1 +--- 'expires': 1167126962 +555 None oneffe_slice554 nodes= [554, 555, 556, 3554, 3555, 3556] persons= [558, 559, 560] +--- sas= [] oneffe_slice554 crp= 1 +--- 'expires': 1167126962 +556 None onefff_slice555 nodes= [555, 556, 557, 3555, 3556, 3557] persons= [559, 560, 561] +--- sas= [] onefff_slice555 crp= 1 +--- 'expires': 1167126962 +557 None oneffg_slice556 nodes= [556, 557, 558, 3556, 3557, 3558] persons= [560, 561, 562] +--- sas= [] oneffg_slice556 crp= 1 +--- 'expires': 1167126963 +558 None oneffh_slice557 nodes= [557, 558, 559, 3557, 3558, 3559] persons= [561, 562, 563] +--- sas= [] oneffh_slice557 crp= 1 +--- 'expires': 1167126963 +559 None oneffi_slice558 nodes= [558, 559, 560, 3558, 3559, 3560] persons= [562, 563, 564] +--- sas= [] oneffi_slice558 crp= 1 +--- 'expires': 1167126963 +560 None oneffj_slice559 nodes= [559, 560, 561, 3559, 3560, 3561] persons= [563, 564, 565] +--- sas= [] oneffj_slice559 crp= 1 +--- 'expires': 1167126963 +561 None onefga_slice560 nodes= [560, 561, 562, 3560, 3561, 3562] persons= [564, 565, 566] +--- sas= [] onefga_slice560 crp= 1 +--- 'expires': 1167126964 +562 None onefgb_slice561 nodes= [561, 562, 563, 3561, 3562, 3563] persons= [565, 566, 567] +--- sas= [] onefgb_slice561 crp= 1 +--- 'expires': 1167126964 +563 None onefgc_slice562 nodes= [562, 563, 564, 3562, 3563, 3564] persons= [566, 567, 568] +--- sas= [] onefgc_slice562 crp= 1 +--- 'expires': 1167126964 +564 None onefgd_slice563 nodes= [563, 564, 565, 3563, 3564, 3565] persons= [567, 568, 569] +--- sas= [] onefgd_slice563 crp= 1 +--- 'expires': 1167126965 +565 None onefge_slice564 nodes= [564, 565, 566, 3564, 3565, 3566] persons= [568, 569, 570] +--- sas= [] onefge_slice564 crp= 1 +--- 'expires': 1167126965 +566 None onefgf_slice565 nodes= [565, 566, 567, 3565, 3566, 3567] persons= [569, 570, 571] +--- sas= [] onefgf_slice565 crp= 1 +--- 'expires': 1167126965 +567 None onefgg_slice566 nodes= [566, 567, 568, 3566, 3567, 3568] persons= [570, 571, 572] +--- sas= [] onefgg_slice566 crp= 1 +--- 'expires': 1167126965 +568 None onefgh_slice567 nodes= [567, 568, 569, 3567, 3568, 3569] persons= [571, 572, 573] +--- sas= [] onefgh_slice567 crp= 1 +--- 'expires': 1167126966 +569 None onefgi_slice568 nodes= [568, 569, 570, 3568, 3569, 3570] persons= [572, 573, 574] +--- sas= [] onefgi_slice568 crp= 1 +--- 'expires': 1167126966 +570 None onefgj_slice569 nodes= [569, 570, 571, 3569, 3570, 3571] persons= [573, 574, 575] +--- sas= [] onefgj_slice569 crp= 1 +--- 'expires': 1167126966 +571 None onefha_slice570 nodes= [570, 571, 572, 3570, 3571, 3572] persons= [574, 575, 576] +--- sas= [] onefha_slice570 crp= 1 +--- 'expires': 1167126967 +572 None onefhb_slice571 nodes= [571, 572, 573, 3571, 3572, 3573] persons= [575, 576, 577] +--- sas= [] onefhb_slice571 crp= 1 +--- 'expires': 1167126967 +573 None onefhc_slice572 nodes= [572, 573, 574, 3572, 3573, 3574] persons= [576, 577, 578] +--- sas= [] onefhc_slice572 crp= 1 +--- 'expires': 1167126967 +574 None onefhd_slice573 nodes= [573, 574, 575, 3573, 3574, 3575] persons= [577, 578, 579] +--- sas= [] onefhd_slice573 crp= 1 +--- 'expires': 1167126967 +575 None onefhe_slice574 nodes= [574, 575, 576, 3574, 3575, 3576] persons= [578, 579, 580] +--- sas= [] onefhe_slice574 crp= 1 +--- 'expires': 1167126968 +576 None onefhf_slice575 nodes= [575, 576, 577, 3575, 3576, 3577] persons= [579, 580, 581] +--- sas= [] onefhf_slice575 crp= 1 +--- 'expires': 1167126968 +577 None onefhg_slice576 nodes= [576, 577, 578, 3576, 3577, 3578] persons= [580, 581, 582] +--- sas= [] onefhg_slice576 crp= 1 +--- 'expires': 1167126968 +578 None onefhh_slice577 nodes= [577, 578, 579, 3577, 3578, 3579] persons= [581, 582, 583] +--- sas= [] onefhh_slice577 crp= 1 +--- 'expires': 1167126968 +579 None onefhi_slice578 nodes= [578, 579, 580, 3578, 3579, 3580] persons= [582, 583, 584] +--- sas= [] onefhi_slice578 crp= 1 +--- 'expires': 1167126969 +580 None onefhj_slice579 nodes= [579, 580, 581, 3579, 3580, 3581] persons= [583, 584, 585] +--- sas= [] onefhj_slice579 crp= 1 +--- 'expires': 1167126969 +581 None onefia_slice580 nodes= [580, 581, 582, 3580, 3581, 3582] persons= [584, 585, 586] +--- sas= [] onefia_slice580 crp= 1 +--- 'expires': 1167126969 +582 None onefib_slice581 nodes= [581, 582, 583, 3581, 3582, 3583] persons= [585, 586, 587] +--- sas= [] onefib_slice581 crp= 1 +--- 'expires': 1167126970 +583 None onefic_slice582 nodes= [582, 583, 584, 3582, 3583, 3584] persons= [586, 587, 588] +--- sas= [] onefic_slice582 crp= 1 +--- 'expires': 1167126970 +584 None onefid_slice583 nodes= [583, 584, 585, 3583, 3584, 3585] persons= [587, 588, 589] +--- sas= [] onefid_slice583 crp= 1 +--- 'expires': 1167126970 +585 None onefie_slice584 nodes= [584, 585, 586, 3584, 3585, 3586] persons= [588, 589, 590] +--- sas= [] onefie_slice584 crp= 1 +--- 'expires': 1167126970 +586 None onefif_slice585 nodes= [585, 586, 587, 3585, 3586, 3587] persons= [589, 590, 591] +--- sas= [] onefif_slice585 crp= 1 +--- 'expires': 1167126971 +587 None onefig_slice586 nodes= [586, 587, 588, 3586, 3587, 3588] persons= [590, 591, 592] +--- sas= [] onefig_slice586 crp= 1 +--- 'expires': 1167126971 +588 None onefih_slice587 nodes= [587, 588, 589, 3587, 3588, 3589] persons= [591, 592, 593] +--- sas= [] onefih_slice587 crp= 1 +--- 'expires': 1167126971 +589 None onefii_slice588 nodes= [588, 589, 590, 3588, 3589, 3590] persons= [592, 593, 594] +--- sas= [] onefii_slice588 crp= 1 +--- 'expires': 1167126971 +590 None onefij_slice589 nodes= [589, 590, 591, 3589, 3590, 3591] persons= [593, 594, 595] +--- sas= [] onefij_slice589 crp= 1 +--- 'expires': 1167126972 +591 None onefja_slice590 nodes= [590, 591, 592, 3590, 3591, 3592] persons= [594, 595, 596] +--- sas= [] onefja_slice590 crp= 1 +--- 'expires': 1167126972 +592 None onefjb_slice591 nodes= [591, 592, 593, 3591, 3592, 3593] persons= [595, 596, 597] +--- sas= [] onefjb_slice591 crp= 1 +--- 'expires': 1167126972 +593 None onefjc_slice592 nodes= [592, 593, 594, 3592, 3593, 3594] persons= [596, 597, 598] +--- sas= [] onefjc_slice592 crp= 1 +--- 'expires': 1167126973 +594 None onefjd_slice593 nodes= [593, 594, 595, 3593, 3594, 3595] persons= [597, 598, 599] +--- sas= [] onefjd_slice593 crp= 1 +--- 'expires': 1167126973 +595 None onefje_slice594 nodes= [594, 595, 596, 3594, 3595, 3596] persons= [598, 599, 600] +--- sas= [] onefje_slice594 crp= 1 +--- 'expires': 1167126973 +596 None onefjf_slice595 nodes= [595, 596, 597, 3595, 3596, 3597] persons= [599, 600, 601] +--- sas= [] onefjf_slice595 crp= 1 +--- 'expires': 1167126973 +597 None onefjg_slice596 nodes= [596, 597, 598, 3596, 3597, 3598] persons= [600, 601, 602] +--- sas= [] onefjg_slice596 crp= 1 +--- 'expires': 1167126974 +598 None onefjh_slice597 nodes= [597, 598, 599, 3597, 3598, 3599] persons= [601, 602, 603] +--- sas= [] onefjh_slice597 crp= 1 +--- 'expires': 1167126974 +599 None onefji_slice598 nodes= [598, 599, 600, 3598, 3599, 3600] persons= [602, 603, 604] +--- sas= [] onefji_slice598 crp= 1 +--- 'expires': 1167126974 +600 None onefjj_slice599 nodes= [599, 600, 601, 3599, 3600, 3601] persons= [603, 604, 605] +--- sas= [] onefjj_slice599 crp= 1 +--- 'expires': 1167126975 +601 None onegaa_slice600 nodes= [600, 601, 602, 3600, 3601, 3602] persons= [604, 605, 606] +--- sas= [] onegaa_slice600 crp= 1 +--- 'expires': 1167126975 +602 None onegab_slice601 nodes= [601, 602, 603, 3601, 3602, 3603] persons= [605, 606, 607] +--- sas= [] onegab_slice601 crp= 1 +--- 'expires': 1167126975 +603 None onegac_slice602 nodes= [602, 603, 604, 3602, 3603, 3604] persons= [606, 607, 608] +--- sas= [] onegac_slice602 crp= 1 +--- 'expires': 1167126975 +604 None onegad_slice603 nodes= [603, 604, 605, 3603, 3604, 3605] persons= [607, 608, 609] +--- sas= [] onegad_slice603 crp= 1 +--- 'expires': 1167126976 +605 None onegae_slice604 nodes= [604, 605, 606, 3604, 3605, 3606] persons= [608, 609, 610] +--- sas= [] onegae_slice604 crp= 1 +--- 'expires': 1167126976 +606 None onegaf_slice605 nodes= [605, 606, 607, 3605, 3606, 3607] persons= [609, 610, 611] +--- sas= [] onegaf_slice605 crp= 1 +--- 'expires': 1167126976 +607 None onegag_slice606 nodes= [606, 607, 608, 3606, 3607, 3608] persons= [610, 611, 612] +--- sas= [] onegag_slice606 crp= 1 +--- 'expires': 1167126977 +608 None onegah_slice607 nodes= [607, 608, 609, 3607, 3608, 3609] persons= [611, 612, 613] +--- sas= [] onegah_slice607 crp= 1 +--- 'expires': 1167126977 +609 None onegai_slice608 nodes= [608, 609, 610, 3608, 3609, 3610] persons= [612, 613, 614] +--- sas= [] onegai_slice608 crp= 1 +--- 'expires': 1167126977 +610 None onegaj_slice609 nodes= [609, 610, 611, 3609, 3610, 3611] persons= [613, 614, 615] +--- sas= [] onegaj_slice609 crp= 1 +--- 'expires': 1167126977 +611 None onegba_slice610 nodes= [610, 611, 612, 3610, 3611, 3612] persons= [614, 615, 616] +--- sas= [] onegba_slice610 crp= 1 +--- 'expires': 1167126978 +612 None onegbb_slice611 nodes= [611, 612, 613, 3611, 3612, 3613] persons= [615, 616, 617] +--- sas= [] onegbb_slice611 crp= 1 +--- 'expires': 1167126978 +613 None onegbc_slice612 nodes= [612, 613, 614, 3612, 3613, 3614] persons= [616, 617, 618] +--- sas= [] onegbc_slice612 crp= 1 +--- 'expires': 1167126978 +614 None onegbd_slice613 nodes= [613, 614, 615, 3613, 3614, 3615] persons= [617, 618, 619] +--- sas= [] onegbd_slice613 crp= 1 +--- 'expires': 1167126978 +615 None onegbe_slice614 nodes= [614, 615, 616, 3614, 3615, 3616] persons= [618, 619, 620] +--- sas= [] onegbe_slice614 crp= 1 +--- 'expires': 1167126979 +616 None onegbf_slice615 nodes= [615, 616, 617, 3615, 3616, 3617] persons= [619, 620, 621] +--- sas= [] onegbf_slice615 crp= 1 +--- 'expires': 1167126979 +617 None onegbg_slice616 nodes= [616, 617, 618, 3616, 3617, 3618] persons= [620, 621, 622] +--- sas= [] onegbg_slice616 crp= 1 +--- 'expires': 1167126979 +618 None onegbh_slice617 nodes= [617, 618, 619, 3617, 3618, 3619] persons= [621, 622, 623] +--- sas= [] onegbh_slice617 crp= 1 +--- 'expires': 1167126980 +619 None onegbi_slice618 nodes= [618, 619, 620, 3618, 3619, 3620] persons= [622, 623, 624] +--- sas= [] onegbi_slice618 crp= 1 +--- 'expires': 1167126980 +620 None onegbj_slice619 nodes= [619, 620, 621, 3619, 3620, 3621] persons= [623, 624, 625] +--- sas= [] onegbj_slice619 crp= 1 +--- 'expires': 1167126980 +621 None onegca_slice620 nodes= [620, 621, 622, 3620, 3621, 3622] persons= [624, 625, 626] +--- sas= [] onegca_slice620 crp= 1 +--- 'expires': 1167126980 +622 None onegcb_slice621 nodes= [621, 622, 623, 3621, 3622, 3623] persons= [625, 626, 627] +--- sas= [] onegcb_slice621 crp= 1 +--- 'expires': 1167126981 +623 None onegcc_slice622 nodes= [622, 623, 624, 3622, 3623, 3624] persons= [626, 627, 628] +--- sas= [] onegcc_slice622 crp= 1 +--- 'expires': 1167126981 +624 None onegcd_slice623 nodes= [623, 624, 625, 3623, 3624, 3625] persons= [627, 628, 629] +--- sas= [] onegcd_slice623 crp= 1 +--- 'expires': 1167126981 +625 None onegce_slice624 nodes= [624, 625, 626, 3624, 3625, 3626] persons= [628, 629, 630] +--- sas= [] onegce_slice624 crp= 1 +--- 'expires': 1167126982 +626 None onegcf_slice625 nodes= [625, 626, 627, 3625, 3626, 3627] persons= [629, 630, 631] +--- sas= [] onegcf_slice625 crp= 1 +--- 'expires': 1167126982 +627 None onegcg_slice626 nodes= [626, 627, 628, 3626, 3627, 3628] persons= [630, 631, 632] +--- sas= [] onegcg_slice626 crp= 1 +--- 'expires': 1167126982 +628 None onegch_slice627 nodes= [627, 628, 629, 3627, 3628, 3629] persons= [631, 632, 633] +--- sas= [] onegch_slice627 crp= 1 +--- 'expires': 1167126982 +629 None onegci_slice628 nodes= [628, 629, 630, 3628, 3629, 3630] persons= [632, 633, 634] +--- sas= [] onegci_slice628 crp= 1 +--- 'expires': 1167126983 +630 None onegcj_slice629 nodes= [629, 630, 631, 3629, 3630, 3631] persons= [633, 634, 635] +--- sas= [] onegcj_slice629 crp= 1 +--- 'expires': 1167126983 +631 None onegda_slice630 nodes= [630, 631, 632, 3630, 3631, 3632] persons= [634, 635, 636] +--- sas= [] onegda_slice630 crp= 1 +--- 'expires': 1167126983 +632 None onegdb_slice631 nodes= [631, 632, 633, 3631, 3632, 3633] persons= [635, 636, 637] +--- sas= [] onegdb_slice631 crp= 1 +--- 'expires': 1167126984 +633 None onegdc_slice632 nodes= [632, 633, 634, 3632, 3633, 3634] persons= [636, 637, 638] +--- sas= [] onegdc_slice632 crp= 1 +--- 'expires': 1167126984 +634 None onegdd_slice633 nodes= [633, 634, 635, 3633, 3634, 3635] persons= [637, 638, 639] +--- sas= [] onegdd_slice633 crp= 1 +--- 'expires': 1167126984 +635 None onegde_slice634 nodes= [634, 635, 636, 3634, 3635, 3636] persons= [638, 639, 640] +--- sas= [] onegde_slice634 crp= 1 +--- 'expires': 1167126984 +636 None onegdf_slice635 nodes= [635, 636, 637, 3635, 3636, 3637] persons= [639, 640, 641] +--- sas= [] onegdf_slice635 crp= 1 +--- 'expires': 1167126985 +637 None onegdg_slice636 nodes= [636, 637, 638, 3636, 3637, 3638] persons= [640, 641, 642] +--- sas= [] onegdg_slice636 crp= 1 +--- 'expires': 1167126985 +638 None onegdh_slice637 nodes= [637, 638, 639, 3637, 3638, 3639] persons= [641, 642, 643] +--- sas= [] onegdh_slice637 crp= 1 +--- 'expires': 1167126985 +639 None onegdi_slice638 nodes= [638, 639, 640, 3638, 3639, 3640] persons= [642, 643, 644] +--- sas= [] onegdi_slice638 crp= 1 +--- 'expires': 1167126986 +640 None onegdj_slice639 nodes= [639, 640, 641, 3639, 3640, 3641] persons= [643, 644, 645] +--- sas= [] onegdj_slice639 crp= 1 +--- 'expires': 1167126986 +641 None onegea_slice640 nodes= [640, 641, 642, 3640, 3641, 3642] persons= [644, 645, 646] +--- sas= [] onegea_slice640 crp= 1 +--- 'expires': 1167126986 +642 None onegeb_slice641 nodes= [641, 642, 643, 3641, 3642, 3643] persons= [645, 646, 647] +--- sas= [] onegeb_slice641 crp= 1 +--- 'expires': 1167126986 +643 None onegec_slice642 nodes= [642, 643, 644, 3642, 3643, 3644] persons= [646, 647, 648] +--- sas= [] onegec_slice642 crp= 1 +--- 'expires': 1167126987 +644 None oneged_slice643 nodes= [643, 644, 645, 3643, 3644, 3645] persons= [647, 648, 649] +--- sas= [] oneged_slice643 crp= 1 +--- 'expires': 1167126987 +645 None onegee_slice644 nodes= [644, 645, 646, 3644, 3645, 3646] persons= [648, 649, 650] +--- sas= [] onegee_slice644 crp= 1 +--- 'expires': 1167126987 +646 None onegef_slice645 nodes= [645, 646, 647, 3645, 3646, 3647] persons= [649, 650, 651] +--- sas= [] onegef_slice645 crp= 1 +--- 'expires': 1167126988 +647 None onegeg_slice646 nodes= [646, 647, 648, 3646, 3647, 3648] persons= [650, 651, 652] +--- sas= [] onegeg_slice646 crp= 1 +--- 'expires': 1167126988 +648 None onegeh_slice647 nodes= [647, 648, 649, 3647, 3648, 3649] persons= [651, 652, 653] +--- sas= [] onegeh_slice647 crp= 1 +--- 'expires': 1167126988 +649 None onegei_slice648 nodes= [648, 649, 650, 3648, 3649, 3650] persons= [652, 653, 654] +--- sas= [] onegei_slice648 crp= 1 +--- 'expires': 1167126988 +650 None onegej_slice649 nodes= [649, 650, 651, 3649, 3650, 3651] persons= [653, 654, 655] +--- sas= [] onegej_slice649 crp= 1 +--- 'expires': 1167126989 +651 None onegfa_slice650 nodes= [650, 651, 652, 3650, 3651, 3652] persons= [654, 655, 656] +--- sas= [] onegfa_slice650 crp= 1 +--- 'expires': 1167126989 +652 None onegfb_slice651 nodes= [651, 652, 653, 3651, 3652, 3653] persons= [655, 656, 657] +--- sas= [] onegfb_slice651 crp= 1 +--- 'expires': 1167126989 +653 None onegfc_slice652 nodes= [652, 653, 654, 3652, 3653, 3654] persons= [656, 657, 658] +--- sas= [] onegfc_slice652 crp= 1 +--- 'expires': 1167126990 +654 None onegfd_slice653 nodes= [653, 654, 655, 3653, 3654, 3655] persons= [657, 658, 659] +--- sas= [] onegfd_slice653 crp= 1 +--- 'expires': 1167126990 +655 None onegfe_slice654 nodes= [654, 655, 656, 3654, 3655, 3656] persons= [658, 659, 660] +--- sas= [] onegfe_slice654 crp= 1 +--- 'expires': 1167126990 +656 None onegff_slice655 nodes= [655, 656, 657, 3655, 3656, 3657] persons= [659, 660, 661] +--- sas= [] onegff_slice655 crp= 1 +--- 'expires': 1167126990 +657 None onegfg_slice656 nodes= [656, 657, 658, 3656, 3657, 3658] persons= [660, 661, 662] +--- sas= [] onegfg_slice656 crp= 1 +--- 'expires': 1167126991 +658 None onegfh_slice657 nodes= [657, 658, 659, 3657, 3658, 3659] persons= [661, 662, 663] +--- sas= [] onegfh_slice657 crp= 1 +--- 'expires': 1167126991 +659 None onegfi_slice658 nodes= [658, 659, 660, 3658, 3659, 3660] persons= [662, 663, 664] +--- sas= [] onegfi_slice658 crp= 1 +--- 'expires': 1167126991 +660 None onegfj_slice659 nodes= [659, 660, 661, 3659, 3660, 3661] persons= [663, 664, 665] +--- sas= [] onegfj_slice659 crp= 1 +--- 'expires': 1167126992 +661 None onegga_slice660 nodes= [660, 661, 662, 3660, 3661, 3662] persons= [664, 665, 666] +--- sas= [] onegga_slice660 crp= 1 +--- 'expires': 1167126992 +662 None oneggb_slice661 nodes= [661, 662, 663, 3661, 3662, 3663] persons= [665, 666, 667] +--- sas= [] oneggb_slice661 crp= 1 +--- 'expires': 1167126992 +663 None oneggc_slice662 nodes= [662, 663, 664, 3662, 3663, 3664] persons= [666, 667, 668] +--- sas= [] oneggc_slice662 crp= 1 +--- 'expires': 1167126992 +664 None oneggd_slice663 nodes= [663, 664, 665, 3663, 3664, 3665] persons= [667, 668, 669] +--- sas= [] oneggd_slice663 crp= 1 +--- 'expires': 1167126993 +665 None onegge_slice664 nodes= [664, 665, 666, 3664, 3665, 3666] persons= [668, 669, 670] +--- sas= [] onegge_slice664 crp= 1 +--- 'expires': 1167126993 +666 None oneggf_slice665 nodes= [665, 666, 667, 3665, 3666, 3667] persons= [669, 670, 671] +--- sas= [] oneggf_slice665 crp= 1 +--- 'expires': 1167126993 +667 None oneggg_slice666 nodes= [666, 667, 668, 3666, 3667, 3668] persons= [670, 671, 672] +--- sas= [] oneggg_slice666 crp= 1 +--- 'expires': 1167126994 +668 None oneggh_slice667 nodes= [667, 668, 669, 3667, 3668, 3669] persons= [671, 672, 673] +--- sas= [] oneggh_slice667 crp= 1 +--- 'expires': 1167126994 +669 None oneggi_slice668 nodes= [668, 669, 670, 3668, 3669, 3670] persons= [672, 673, 674] +--- sas= [] oneggi_slice668 crp= 1 +--- 'expires': 1167126994 +670 None oneggj_slice669 nodes= [669, 670, 671, 3669, 3670, 3671] persons= [673, 674, 675] +--- sas= [] oneggj_slice669 crp= 1 +--- 'expires': 1167126995 +671 None onegha_slice670 nodes= [670, 671, 672, 3670, 3671, 3672] persons= [674, 675, 676] +--- sas= [] onegha_slice670 crp= 1 +--- 'expires': 1167126995 +672 None oneghb_slice671 nodes= [671, 672, 673, 3671, 3672, 3673] persons= [675, 676, 677] +--- sas= [] oneghb_slice671 crp= 1 +--- 'expires': 1167126995 +673 None oneghc_slice672 nodes= [672, 673, 674, 3672, 3673, 3674] persons= [676, 677, 678] +--- sas= [] oneghc_slice672 crp= 1 +--- 'expires': 1167126995 +674 None oneghd_slice673 nodes= [673, 674, 675, 3673, 3674, 3675] persons= [677, 678, 679] +--- sas= [] oneghd_slice673 crp= 1 +--- 'expires': 1167126996 +675 None oneghe_slice674 nodes= [674, 675, 676, 3674, 3675, 3676] persons= [678, 679, 680] +--- sas= [] oneghe_slice674 crp= 1 +--- 'expires': 1167126996 +676 None oneghf_slice675 nodes= [675, 676, 677, 3675, 3676, 3677] persons= [679, 680, 681] +--- sas= [] oneghf_slice675 crp= 1 +--- 'expires': 1167126996 +677 None oneghg_slice676 nodes= [676, 677, 678, 3676, 3677, 3678] persons= [680, 681, 682] +--- sas= [] oneghg_slice676 crp= 1 +--- 'expires': 1167126997 +678 None oneghh_slice677 nodes= [677, 678, 679, 3677, 3678, 3679] persons= [681, 682, 683] +--- sas= [] oneghh_slice677 crp= 1 +--- 'expires': 1167126997 +679 None oneghi_slice678 nodes= [678, 679, 680, 3678, 3679, 3680] persons= [682, 683, 684] +--- sas= [] oneghi_slice678 crp= 1 +--- 'expires': 1167126997 +680 None oneghj_slice679 nodes= [679, 680, 681, 3679, 3680, 3681] persons= [683, 684, 685] +--- sas= [] oneghj_slice679 crp= 1 +--- 'expires': 1167126997 +681 None onegia_slice680 nodes= [680, 681, 682, 3680, 3681, 3682] persons= [684, 685, 686] +--- sas= [] onegia_slice680 crp= 1 +--- 'expires': 1167126998 +682 None onegib_slice681 nodes= [681, 682, 683, 3681, 3682, 3683] persons= [685, 686, 687] +--- sas= [] onegib_slice681 crp= 1 +--- 'expires': 1167126998 +683 None onegic_slice682 nodes= [682, 683, 684, 3682, 3683, 3684] persons= [686, 687, 688] +--- sas= [] onegic_slice682 crp= 1 +--- 'expires': 1167126998 +684 None onegid_slice683 nodes= [683, 684, 685, 3683, 3684, 3685] persons= [687, 688, 689] +--- sas= [] onegid_slice683 crp= 1 +--- 'expires': 1167126999 +685 None onegie_slice684 nodes= [684, 685, 686, 3684, 3685, 3686] persons= [688, 689, 690] +--- sas= [] onegie_slice684 crp= 1 +--- 'expires': 1167126999 +686 None onegif_slice685 nodes= [685, 686, 687, 3685, 3686, 3687] persons= [689, 690, 691] +--- sas= [] onegif_slice685 crp= 1 +--- 'expires': 1167126999 +687 None onegig_slice686 nodes= [686, 687, 688, 3686, 3687, 3688] persons= [690, 691, 692] +--- sas= [] onegig_slice686 crp= 1 +--- 'expires': 1167126999 +688 None onegih_slice687 nodes= [687, 688, 689, 3687, 3688, 3689] persons= [691, 692, 693] +--- sas= [] onegih_slice687 crp= 1 +--- 'expires': 1167127000 +689 None onegii_slice688 nodes= [688, 689, 690, 3688, 3689, 3690] persons= [692, 693, 694] +--- sas= [] onegii_slice688 crp= 1 +--- 'expires': 1167127000 +690 None onegij_slice689 nodes= [689, 690, 691, 3689, 3690, 3691] persons= [693, 694, 695] +--- sas= [] onegij_slice689 crp= 1 +--- 'expires': 1167127000 +691 None onegja_slice690 nodes= [690, 691, 692, 3690, 3691, 3692] persons= [694, 695, 696] +--- sas= [] onegja_slice690 crp= 1 +--- 'expires': 1167127001 +692 None onegjb_slice691 nodes= [691, 692, 693, 3691, 3692, 3693] persons= [695, 696, 697] +--- sas= [] onegjb_slice691 crp= 1 +--- 'expires': 1167127001 +693 None onegjc_slice692 nodes= [692, 693, 694, 3692, 3693, 3694] persons= [696, 697, 698] +--- sas= [] onegjc_slice692 crp= 1 +--- 'expires': 1167127001 +694 None onegjd_slice693 nodes= [693, 694, 695, 3693, 3694, 3695] persons= [697, 698, 699] +--- sas= [] onegjd_slice693 crp= 1 +--- 'expires': 1167127002 +695 None onegje_slice694 nodes= [694, 695, 696, 3694, 3695, 3696] persons= [698, 699, 700] +--- sas= [] onegje_slice694 crp= 1 +--- 'expires': 1167127002 +696 None onegjf_slice695 nodes= [695, 696, 697, 3695, 3696, 3697] persons= [699, 700, 701] +--- sas= [] onegjf_slice695 crp= 1 +--- 'expires': 1167127002 +697 None onegjg_slice696 nodes= [696, 697, 698, 3696, 3697, 3698] persons= [700, 701, 702] +--- sas= [] onegjg_slice696 crp= 1 +--- 'expires': 1167127002 +698 None onegjh_slice697 nodes= [697, 698, 699, 3697, 3698, 3699] persons= [701, 702, 703] +--- sas= [] onegjh_slice697 crp= 1 +--- 'expires': 1167127003 +699 None onegji_slice698 nodes= [698, 699, 700, 3698, 3699, 3700] persons= [702, 703, 704] +--- sas= [] onegji_slice698 crp= 1 +--- 'expires': 1167127003 +700 None onegjj_slice699 nodes= [699, 700, 701, 3699, 3700, 3701] persons= [703, 704, 705] +--- sas= [] onegjj_slice699 crp= 1 +--- 'expires': 1167127003 +701 None onehaa_slice700 nodes= [700, 701, 702, 3700, 3701, 3702] persons= [704, 705, 706] +--- sas= [] onehaa_slice700 crp= 1 +--- 'expires': 1167127004 +702 None onehab_slice701 nodes= [701, 702, 703, 3701, 3702, 3703] persons= [705, 706, 707] +--- sas= [] onehab_slice701 crp= 1 +--- 'expires': 1167127004 +703 None onehac_slice702 nodes= [702, 703, 704, 3702, 3703, 3704] persons= [706, 707, 708] +--- sas= [] onehac_slice702 crp= 1 +--- 'expires': 1167127004 +704 None onehad_slice703 nodes= [703, 704, 705, 3703, 3704, 3705] persons= [707, 708, 709] +--- sas= [] onehad_slice703 crp= 1 +--- 'expires': 1167127004 +705 None onehae_slice704 nodes= [704, 705, 706, 3704, 3705, 3706] persons= [708, 709, 710] +--- sas= [] onehae_slice704 crp= 1 +--- 'expires': 1167127005 +706 None onehaf_slice705 nodes= [705, 706, 707, 3705, 3706, 3707] persons= [709, 710, 711] +--- sas= [] onehaf_slice705 crp= 1 +--- 'expires': 1167127005 +707 None onehag_slice706 nodes= [706, 707, 708, 3706, 3707, 3708] persons= [710, 711, 712] +--- sas= [] onehag_slice706 crp= 1 +--- 'expires': 1167127005 +708 None onehah_slice707 nodes= [707, 708, 709, 3707, 3708, 3709] persons= [711, 712, 713] +--- sas= [] onehah_slice707 crp= 1 +--- 'expires': 1167127006 +709 None onehai_slice708 nodes= [708, 709, 710, 3708, 3709, 3710] persons= [712, 713, 714] +--- sas= [] onehai_slice708 crp= 1 +--- 'expires': 1167127006 +710 None onehaj_slice709 nodes= [709, 710, 711, 3709, 3710, 3711] persons= [713, 714, 715] +--- sas= [] onehaj_slice709 crp= 1 +--- 'expires': 1167127006 +711 None onehba_slice710 nodes= [710, 711, 712, 3710, 3711, 3712] persons= [714, 715, 716] +--- sas= [] onehba_slice710 crp= 1 +--- 'expires': 1167127007 +712 None onehbb_slice711 nodes= [711, 712, 713, 3711, 3712, 3713] persons= [715, 716, 717] +--- sas= [] onehbb_slice711 crp= 1 +--- 'expires': 1167127007 +713 None onehbc_slice712 nodes= [712, 713, 714, 3712, 3713, 3714] persons= [716, 717, 718] +--- sas= [] onehbc_slice712 crp= 1 +--- 'expires': 1167127007 +714 None onehbd_slice713 nodes= [713, 714, 715, 3713, 3714, 3715] persons= [717, 718, 719] +--- sas= [] onehbd_slice713 crp= 1 +--- 'expires': 1167127007 +715 None onehbe_slice714 nodes= [714, 715, 716, 3714, 3715, 3716] persons= [718, 719, 720] +--- sas= [] onehbe_slice714 crp= 1 +--- 'expires': 1167127008 +716 None onehbf_slice715 nodes= [715, 716, 717, 3715, 3716, 3717] persons= [719, 720, 721] +--- sas= [] onehbf_slice715 crp= 1 +--- 'expires': 1167127008 +717 None onehbg_slice716 nodes= [716, 717, 718, 3716, 3717, 3718] persons= [720, 721, 722] +--- sas= [] onehbg_slice716 crp= 1 +--- 'expires': 1167127008 +718 None onehbh_slice717 nodes= [717, 718, 719, 3717, 3718, 3719] persons= [721, 722, 723] +--- sas= [] onehbh_slice717 crp= 1 +--- 'expires': 1167127009 +719 None onehbi_slice718 nodes= [718, 719, 720, 3718, 3719, 3720] persons= [722, 723, 724] +--- sas= [] onehbi_slice718 crp= 1 +--- 'expires': 1167127009 +720 None onehbj_slice719 nodes= [719, 720, 721, 3719, 3720, 3721] persons= [723, 724, 725] +--- sas= [] onehbj_slice719 crp= 1 +--- 'expires': 1167127009 +721 None onehca_slice720 nodes= [720, 721, 722, 3720, 3721, 3722] persons= [724, 725, 726] +--- sas= [] onehca_slice720 crp= 1 +--- 'expires': 1167127010 +722 None onehcb_slice721 nodes= [721, 722, 723, 3721, 3722, 3723] persons= [725, 726, 727] +--- sas= [] onehcb_slice721 crp= 1 +--- 'expires': 1167127010 +723 None onehcc_slice722 nodes= [722, 723, 724, 3722, 3723, 3724] persons= [726, 727, 728] +--- sas= [] onehcc_slice722 crp= 1 +--- 'expires': 1167127010 +724 None onehcd_slice723 nodes= [723, 724, 725, 3723, 3724, 3725] persons= [727, 728, 729] +--- sas= [] onehcd_slice723 crp= 1 +--- 'expires': 1167127010 +725 None onehce_slice724 nodes= [724, 725, 726, 3724, 3725, 3726] persons= [728, 729, 730] +--- sas= [] onehce_slice724 crp= 1 +--- 'expires': 1167127011 +726 None onehcf_slice725 nodes= [725, 726, 727, 3725, 3726, 3727] persons= [729, 730, 731] +--- sas= [] onehcf_slice725 crp= 1 +--- 'expires': 1167127011 +727 None onehcg_slice726 nodes= [726, 727, 728, 3726, 3727, 3728] persons= [730, 731, 732] +--- sas= [] onehcg_slice726 crp= 1 +--- 'expires': 1167127011 +728 None onehch_slice727 nodes= [727, 728, 729, 3727, 3728, 3729] persons= [731, 732, 733] +--- sas= [] onehch_slice727 crp= 1 +--- 'expires': 1167127012 +729 None onehci_slice728 nodes= [728, 729, 730, 3728, 3729, 3730] persons= [732, 733, 734] +--- sas= [] onehci_slice728 crp= 1 +--- 'expires': 1167127012 +730 None onehcj_slice729 nodes= [729, 730, 731, 3729, 3730, 3731] persons= [733, 734, 735] +--- sas= [] onehcj_slice729 crp= 1 +--- 'expires': 1167127012 +731 None onehda_slice730 nodes= [730, 731, 732, 3730, 3731, 3732] persons= [734, 735, 736] +--- sas= [] onehda_slice730 crp= 1 +--- 'expires': 1167127013 +732 None onehdb_slice731 nodes= [731, 732, 733, 3731, 3732, 3733] persons= [735, 736, 737] +--- sas= [] onehdb_slice731 crp= 1 +--- 'expires': 1167127013 +733 None onehdc_slice732 nodes= [732, 733, 734, 3732, 3733, 3734] persons= [736, 737, 738] +--- sas= [] onehdc_slice732 crp= 1 +--- 'expires': 1167127013 +734 None onehdd_slice733 nodes= [733, 734, 735, 3733, 3734, 3735] persons= [737, 738, 739] +--- sas= [] onehdd_slice733 crp= 1 +--- 'expires': 1167127013 +735 None onehde_slice734 nodes= [734, 735, 736, 3734, 3735, 3736] persons= [738, 739, 740] +--- sas= [] onehde_slice734 crp= 1 +--- 'expires': 1167127014 +736 None onehdf_slice735 nodes= [735, 736, 737, 3735, 3736, 3737] persons= [739, 740, 741] +--- sas= [] onehdf_slice735 crp= 1 +--- 'expires': 1167127014 +737 None onehdg_slice736 nodes= [736, 737, 738, 3736, 3737, 3738] persons= [740, 741, 742] +--- sas= [] onehdg_slice736 crp= 1 +--- 'expires': 1167127014 +738 None onehdh_slice737 nodes= [737, 738, 739, 3737, 3738, 3739] persons= [741, 742, 743] +--- sas= [] onehdh_slice737 crp= 1 +--- 'expires': 1167127015 +739 None onehdi_slice738 nodes= [738, 739, 740, 3738, 3739, 3740] persons= [742, 743, 744] +--- sas= [] onehdi_slice738 crp= 1 +--- 'expires': 1167127015 +740 None onehdj_slice739 nodes= [739, 740, 741, 3739, 3740, 3741] persons= [743, 744, 745] +--- sas= [] onehdj_slice739 crp= 1 +--- 'expires': 1167127015 +741 None onehea_slice740 nodes= [740, 741, 742, 3740, 3741, 3742] persons= [744, 745, 746] +--- sas= [] onehea_slice740 crp= 1 +--- 'expires': 1167127016 +742 None oneheb_slice741 nodes= [741, 742, 743, 3741, 3742, 3743] persons= [745, 746, 747] +--- sas= [] oneheb_slice741 crp= 1 +--- 'expires': 1167127016 +743 None onehec_slice742 nodes= [742, 743, 744, 3742, 3743, 3744] persons= [746, 747, 748] +--- sas= [] onehec_slice742 crp= 1 +--- 'expires': 1167127016 +744 None onehed_slice743 nodes= [743, 744, 745, 3743, 3744, 3745] persons= [747, 748, 749] +--- sas= [] onehed_slice743 crp= 1 +--- 'expires': 1167127016 +745 None onehee_slice744 nodes= [744, 745, 746, 3744, 3745, 3746] persons= [748, 749, 750] +--- sas= [] onehee_slice744 crp= 1 +--- 'expires': 1167127017 +746 None onehef_slice745 nodes= [745, 746, 747, 3745, 3746, 3747] persons= [749, 750, 751] +--- sas= [] onehef_slice745 crp= 1 +--- 'expires': 1167127017 +747 None oneheg_slice746 nodes= [746, 747, 748, 3746, 3747, 3748] persons= [750, 751, 752] +--- sas= [] oneheg_slice746 crp= 1 +--- 'expires': 1167127017 +748 None oneheh_slice747 nodes= [747, 748, 749, 3747, 3748, 3749] persons= [751, 752, 753] +--- sas= [] oneheh_slice747 crp= 1 +--- 'expires': 1167127018 +749 None onehei_slice748 nodes= [748, 749, 750, 3748, 3749, 3750] persons= [752, 753, 754] +--- sas= [] onehei_slice748 crp= 1 +--- 'expires': 1167127018 +750 None onehej_slice749 nodes= [749, 750, 751, 3749, 3750, 3751] persons= [753, 754, 755] +--- sas= [] onehej_slice749 crp= 1 +--- 'expires': 1167127018 +751 None onehfa_slice750 nodes= [750, 751, 752, 3750, 3751, 3752] persons= [754, 755, 756] +--- sas= [] onehfa_slice750 crp= 1 +--- 'expires': 1167127019 +752 None onehfb_slice751 nodes= [751, 752, 753, 3751, 3752, 3753] persons= [755, 756, 757] +--- sas= [] onehfb_slice751 crp= 1 +--- 'expires': 1167127019 +753 None onehfc_slice752 nodes= [752, 753, 754, 3752, 3753, 3754] persons= [756, 757, 758] +--- sas= [] onehfc_slice752 crp= 1 +--- 'expires': 1167127019 +754 None onehfd_slice753 nodes= [753, 754, 755, 3753, 3754, 3755] persons= [757, 758, 759] +--- sas= [] onehfd_slice753 crp= 1 +--- 'expires': 1167127019 +755 None onehfe_slice754 nodes= [754, 755, 756, 3754, 3755, 3756] persons= [758, 759, 760] +--- sas= [] onehfe_slice754 crp= 1 +--- 'expires': 1167127020 +756 None onehff_slice755 nodes= [755, 756, 757, 3755, 3756, 3757] persons= [759, 760, 761] +--- sas= [] onehff_slice755 crp= 1 +--- 'expires': 1167127020 +757 None onehfg_slice756 nodes= [756, 757, 758, 3756, 3757, 3758] persons= [760, 761, 762] +--- sas= [] onehfg_slice756 crp= 1 +--- 'expires': 1167127020 +758 None onehfh_slice757 nodes= [757, 758, 759, 3757, 3758, 3759] persons= [761, 762, 763] +--- sas= [] onehfh_slice757 crp= 1 +--- 'expires': 1167127021 +759 None onehfi_slice758 nodes= [758, 759, 760, 3758, 3759, 3760] persons= [762, 763, 764] +--- sas= [] onehfi_slice758 crp= 1 +--- 'expires': 1167127021 +760 None onehfj_slice759 nodes= [759, 760, 761, 3759, 3760, 3761] persons= [763, 764, 765] +--- sas= [] onehfj_slice759 crp= 1 +--- 'expires': 1167127021 +761 None onehga_slice760 nodes= [760, 761, 762, 3760, 3761, 3762] persons= [764, 765, 766] +--- sas= [] onehga_slice760 crp= 1 +--- 'expires': 1167127022 +762 None onehgb_slice761 nodes= [761, 762, 763, 3761, 3762, 3763] persons= [765, 766, 767] +--- sas= [] onehgb_slice761 crp= 1 +--- 'expires': 1167127022 +763 None onehgc_slice762 nodes= [762, 763, 764, 3762, 3763, 3764] persons= [766, 767, 768] +--- sas= [] onehgc_slice762 crp= 1 +--- 'expires': 1167127022 +764 None onehgd_slice763 nodes= [763, 764, 765, 3763, 3764, 3765] persons= [767, 768, 769] +--- sas= [] onehgd_slice763 crp= 1 +--- 'expires': 1167127023 +765 None onehge_slice764 nodes= [764, 765, 766, 3764, 3765, 3766] persons= [768, 769, 770] +--- sas= [] onehge_slice764 crp= 1 +--- 'expires': 1167127023 +766 None onehgf_slice765 nodes= [765, 766, 767, 3765, 3766, 3767] persons= [769, 770, 771] +--- sas= [] onehgf_slice765 crp= 1 +--- 'expires': 1167127023 +767 None onehgg_slice766 nodes= [766, 767, 768, 3766, 3767, 3768] persons= [770, 771, 772] +--- sas= [] onehgg_slice766 crp= 1 +--- 'expires': 1167127023 +768 None onehgh_slice767 nodes= [767, 768, 769, 3767, 3768, 3769] persons= [771, 772, 773] +--- sas= [] onehgh_slice767 crp= 1 +--- 'expires': 1167127024 +769 None onehgi_slice768 nodes= [768, 769, 770, 3768, 3769, 3770] persons= [772, 773, 774] +--- sas= [] onehgi_slice768 crp= 1 +--- 'expires': 1167127024 +770 None onehgj_slice769 nodes= [769, 770, 771, 3769, 3770, 3771] persons= [773, 774, 775] +--- sas= [] onehgj_slice769 crp= 1 +--- 'expires': 1167127024 +771 None onehha_slice770 nodes= [770, 771, 772, 3770, 3771, 3772] persons= [774, 775, 776] +--- sas= [] onehha_slice770 crp= 1 +--- 'expires': 1167127025 +772 None onehhb_slice771 nodes= [771, 772, 773, 3771, 3772, 3773] persons= [775, 776, 777] +--- sas= [] onehhb_slice771 crp= 1 +--- 'expires': 1167127025 +773 None onehhc_slice772 nodes= [772, 773, 774, 3772, 3773, 3774] persons= [776, 777, 778] +--- sas= [] onehhc_slice772 crp= 1 +--- 'expires': 1167127025 +774 None onehhd_slice773 nodes= [773, 774, 775, 3773, 3774, 3775] persons= [777, 778, 779] +--- sas= [] onehhd_slice773 crp= 1 +--- 'expires': 1167127026 +775 None onehhe_slice774 nodes= [774, 775, 776, 3774, 3775, 3776] persons= [778, 779, 780] +--- sas= [] onehhe_slice774 crp= 1 +--- 'expires': 1167127026 +776 None onehhf_slice775 nodes= [775, 776, 777, 3775, 3776, 3777] persons= [779, 780, 781] +--- sas= [] onehhf_slice775 crp= 1 +--- 'expires': 1167127026 +777 None onehhg_slice776 nodes= [776, 777, 778, 3776, 3777, 3778] persons= [780, 781, 782] +--- sas= [] onehhg_slice776 crp= 1 +--- 'expires': 1167127027 +778 None onehhh_slice777 nodes= [777, 778, 779, 3777, 3778, 3779] persons= [781, 782, 783] +--- sas= [] onehhh_slice777 crp= 1 +--- 'expires': 1167127027 +779 None onehhi_slice778 nodes= [778, 779, 780, 3778, 3779, 3780] persons= [782, 783, 784] +--- sas= [] onehhi_slice778 crp= 1 +--- 'expires': 1167127027 +780 None onehhj_slice779 nodes= [779, 780, 781, 3779, 3780, 3781] persons= [783, 784, 785] +--- sas= [] onehhj_slice779 crp= 1 +--- 'expires': 1167127027 +781 None onehia_slice780 nodes= [780, 781, 782, 3780, 3781, 3782] persons= [784, 785, 786] +--- sas= [] onehia_slice780 crp= 1 +--- 'expires': 1167127028 +782 None onehib_slice781 nodes= [781, 782, 783, 3781, 3782, 3783] persons= [785, 786, 787] +--- sas= [] onehib_slice781 crp= 1 +--- 'expires': 1167127028 +783 None onehic_slice782 nodes= [782, 783, 784, 3782, 3783, 3784] persons= [786, 787, 788] +--- sas= [] onehic_slice782 crp= 1 +--- 'expires': 1167127028 +784 None onehid_slice783 nodes= [783, 784, 785, 3783, 3784, 3785] persons= [787, 788, 789] +--- sas= [] onehid_slice783 crp= 1 +--- 'expires': 1167127029 +785 None onehie_slice784 nodes= [784, 785, 786, 3784, 3785, 3786] persons= [788, 789, 790] +--- sas= [] onehie_slice784 crp= 1 +--- 'expires': 1167127029 +786 None onehif_slice785 nodes= [785, 786, 787, 3785, 3786, 3787] persons= [789, 790, 791] +--- sas= [] onehif_slice785 crp= 1 +--- 'expires': 1167127029 +787 None onehig_slice786 nodes= [786, 787, 788, 3786, 3787, 3788] persons= [790, 791, 792] +--- sas= [] onehig_slice786 crp= 1 +--- 'expires': 1167127030 +788 None onehih_slice787 nodes= [787, 788, 789, 3787, 3788, 3789] persons= [791, 792, 793] +--- sas= [] onehih_slice787 crp= 1 +--- 'expires': 1167127030 +789 None onehii_slice788 nodes= [788, 789, 790, 3788, 3789, 3790] persons= [792, 793, 794] +--- sas= [] onehii_slice788 crp= 1 +--- 'expires': 1167127030 +790 None onehij_slice789 nodes= [789, 790, 791, 3789, 3790, 3791] persons= [793, 794, 795] +--- sas= [] onehij_slice789 crp= 1 +--- 'expires': 1167127031 +791 None onehja_slice790 nodes= [790, 791, 792, 3790, 3791, 3792] persons= [794, 795, 796] +--- sas= [] onehja_slice790 crp= 1 +--- 'expires': 1167127031 +792 None onehjb_slice791 nodes= [791, 792, 793, 3791, 3792, 3793] persons= [795, 796, 797] +--- sas= [] onehjb_slice791 crp= 1 +--- 'expires': 1167127031 +793 None onehjc_slice792 nodes= [792, 793, 794, 3792, 3793, 3794] persons= [796, 797, 798] +--- sas= [] onehjc_slice792 crp= 1 +--- 'expires': 1167127031 +794 None onehjd_slice793 nodes= [793, 794, 795, 3793, 3794, 3795] persons= [797, 798, 799] +--- sas= [] onehjd_slice793 crp= 1 +--- 'expires': 1167127032 +795 None onehje_slice794 nodes= [794, 795, 796, 3794, 3795, 3796] persons= [798, 799, 800] +--- sas= [] onehje_slice794 crp= 1 +--- 'expires': 1167127032 +796 None onehjf_slice795 nodes= [795, 796, 797, 3795, 3796, 3797] persons= [799, 800, 801] +--- sas= [] onehjf_slice795 crp= 1 +--- 'expires': 1167127032 +797 None onehjg_slice796 nodes= [796, 797, 798, 3796, 3797, 3798] persons= [800, 801, 802] +--- sas= [] onehjg_slice796 crp= 1 +--- 'expires': 1167127033 +798 None onehjh_slice797 nodes= [797, 798, 799, 3797, 3798, 3799] persons= [801, 802, 803] +--- sas= [] onehjh_slice797 crp= 1 +--- 'expires': 1167127033 +799 None onehji_slice798 nodes= [798, 799, 800, 3798, 3799, 3800] persons= [802, 803, 804] +--- sas= [] onehji_slice798 crp= 1 +--- 'expires': 1167127033 +800 None onehjj_slice799 nodes= [799, 800, 801, 3799, 3800, 3801] persons= [803, 804, 805] +--- sas= [] onehjj_slice799 crp= 1 +--- 'expires': 1167127034 +801 None oneiaa_slice800 nodes= [800, 801, 802, 3800, 3801, 3802] persons= [804, 805, 806] +--- sas= [] oneiaa_slice800 crp= 1 +--- 'expires': 1167127034 +802 None oneiab_slice801 nodes= [801, 802, 803, 3801, 3802, 3803] persons= [805, 806, 807] +--- sas= [] oneiab_slice801 crp= 1 +--- 'expires': 1167127034 +803 None oneiac_slice802 nodes= [802, 803, 804, 3802, 3803, 3804] persons= [806, 807, 808] +--- sas= [] oneiac_slice802 crp= 1 +--- 'expires': 1167127035 +804 None oneiad_slice803 nodes= [803, 804, 805, 3803, 3804, 3805] persons= [807, 808, 809] +--- sas= [] oneiad_slice803 crp= 1 +--- 'expires': 1167127035 +805 None oneiae_slice804 nodes= [804, 805, 806, 3804, 3805, 3806] persons= [808, 809, 810] +--- sas= [] oneiae_slice804 crp= 1 +--- 'expires': 1167127035 +806 None oneiaf_slice805 nodes= [805, 806, 807, 3805, 3806, 3807] persons= [809, 810, 811] +--- sas= [] oneiaf_slice805 crp= 1 +--- 'expires': 1167127036 +807 None oneiag_slice806 nodes= [806, 807, 808, 3806, 3807, 3808] persons= [810, 811, 812] +--- sas= [] oneiag_slice806 crp= 1 +--- 'expires': 1167127036 +808 None oneiah_slice807 nodes= [807, 808, 809, 3807, 3808, 3809] persons= [811, 812, 813] +--- sas= [] oneiah_slice807 crp= 1 +--- 'expires': 1167127036 +809 None oneiai_slice808 nodes= [808, 809, 810, 3808, 3809, 3810] persons= [812, 813, 814] +--- sas= [] oneiai_slice808 crp= 1 +--- 'expires': 1167127036 +810 None oneiaj_slice809 nodes= [809, 810, 811, 3809, 3810, 3811] persons= [813, 814, 815] +--- sas= [] oneiaj_slice809 crp= 1 +--- 'expires': 1167127037 +811 None oneiba_slice810 nodes= [810, 811, 812, 3810, 3811, 3812] persons= [814, 815, 816] +--- sas= [] oneiba_slice810 crp= 1 +--- 'expires': 1167127037 +812 None oneibb_slice811 nodes= [811, 812, 813, 3811, 3812, 3813] persons= [815, 816, 817] +--- sas= [] oneibb_slice811 crp= 1 +--- 'expires': 1167127037 +813 None oneibc_slice812 nodes= [812, 813, 814, 3812, 3813, 3814] persons= [816, 817, 818] +--- sas= [] oneibc_slice812 crp= 1 +--- 'expires': 1167127038 +814 None oneibd_slice813 nodes= [813, 814, 815, 3813, 3814, 3815] persons= [817, 818, 819] +--- sas= [] oneibd_slice813 crp= 1 +--- 'expires': 1167127038 +815 None oneibe_slice814 nodes= [814, 815, 816, 3814, 3815, 3816] persons= [818, 819, 820] +--- sas= [] oneibe_slice814 crp= 1 +--- 'expires': 1167127038 +816 None oneibf_slice815 nodes= [815, 816, 817, 3815, 3816, 3817] persons= [819, 820, 821] +--- sas= [] oneibf_slice815 crp= 1 +--- 'expires': 1167127039 +817 None oneibg_slice816 nodes= [816, 817, 818, 3816, 3817, 3818] persons= [820, 821, 822] +--- sas= [] oneibg_slice816 crp= 1 +--- 'expires': 1167127039 +818 None oneibh_slice817 nodes= [817, 818, 819, 3817, 3818, 3819] persons= [821, 822, 823] +--- sas= [] oneibh_slice817 crp= 1 +--- 'expires': 1167127039 +819 None oneibi_slice818 nodes= [818, 819, 820, 3818, 3819, 3820] persons= [822, 823, 824] +--- sas= [] oneibi_slice818 crp= 1 +--- 'expires': 1167127040 +820 None oneibj_slice819 nodes= [819, 820, 821, 3819, 3820, 3821] persons= [823, 824, 825] +--- sas= [] oneibj_slice819 crp= 1 +--- 'expires': 1167127040 +821 None oneica_slice820 nodes= [820, 821, 822, 3820, 3821, 3822] persons= [824, 825, 826] +--- sas= [] oneica_slice820 crp= 1 +--- 'expires': 1167127040 +822 None oneicb_slice821 nodes= [821, 822, 823, 3821, 3822, 3823] persons= [825, 826, 827] +--- sas= [] oneicb_slice821 crp= 1 +--- 'expires': 1167127041 +823 None oneicc_slice822 nodes= [822, 823, 824, 3822, 3823, 3824] persons= [826, 827, 828] +--- sas= [] oneicc_slice822 crp= 1 +--- 'expires': 1167127041 +824 None oneicd_slice823 nodes= [823, 824, 825, 3823, 3824, 3825] persons= [827, 828, 829] +--- sas= [] oneicd_slice823 crp= 1 +--- 'expires': 1167127041 +825 None oneice_slice824 nodes= [824, 825, 826, 3824, 3825, 3826] persons= [828, 829, 830] +--- sas= [] oneice_slice824 crp= 1 +--- 'expires': 1167127042 +826 None oneicf_slice825 nodes= [825, 826, 827, 3825, 3826, 3827] persons= [829, 830, 831] +--- sas= [] oneicf_slice825 crp= 1 +--- 'expires': 1167127042 +827 None oneicg_slice826 nodes= [826, 827, 828, 3826, 3827, 3828] persons= [830, 831, 832] +--- sas= [] oneicg_slice826 crp= 1 +--- 'expires': 1167127042 +828 None oneich_slice827 nodes= [827, 828, 829, 3827, 3828, 3829] persons= [831, 832, 833] +--- sas= [] oneich_slice827 crp= 1 +--- 'expires': 1167127042 +829 None oneici_slice828 nodes= [828, 829, 830, 3828, 3829, 3830] persons= [832, 833, 834] +--- sas= [] oneici_slice828 crp= 1 +--- 'expires': 1167127043 +830 None oneicj_slice829 nodes= [829, 830, 831, 3829, 3830, 3831] persons= [833, 834, 835] +--- sas= [] oneicj_slice829 crp= 1 +--- 'expires': 1167127043 +831 None oneida_slice830 nodes= [830, 831, 832, 3830, 3831, 3832] persons= [834, 835, 836] +--- sas= [] oneida_slice830 crp= 1 +--- 'expires': 1167127043 +832 None oneidb_slice831 nodes= [831, 832, 833, 3831, 3832, 3833] persons= [835, 836, 837] +--- sas= [] oneidb_slice831 crp= 1 +--- 'expires': 1167127044 +833 None oneidc_slice832 nodes= [832, 833, 834, 3832, 3833, 3834] persons= [836, 837, 838] +--- sas= [] oneidc_slice832 crp= 1 +--- 'expires': 1167127044 +834 None oneidd_slice833 nodes= [833, 834, 835, 3833, 3834, 3835] persons= [837, 838, 839] +--- sas= [] oneidd_slice833 crp= 1 +--- 'expires': 1167127044 +835 None oneide_slice834 nodes= [834, 835, 836, 3834, 3835, 3836] persons= [838, 839, 840] +--- sas= [] oneide_slice834 crp= 1 +--- 'expires': 1167127045 +836 None oneidf_slice835 nodes= [835, 836, 837, 3835, 3836, 3837] persons= [839, 840, 841] +--- sas= [] oneidf_slice835 crp= 1 +--- 'expires': 1167127045 +837 None oneidg_slice836 nodes= [836, 837, 838, 3836, 3837, 3838] persons= [840, 841, 842] +--- sas= [] oneidg_slice836 crp= 1 +--- 'expires': 1167127045 +838 None oneidh_slice837 nodes= [837, 838, 839, 3837, 3838, 3839] persons= [841, 842, 843] +--- sas= [] oneidh_slice837 crp= 1 +--- 'expires': 1167127046 +839 None oneidi_slice838 nodes= [838, 839, 840, 3838, 3839, 3840] persons= [842, 843, 844] +--- sas= [] oneidi_slice838 crp= 1 +--- 'expires': 1167127046 +840 None oneidj_slice839 nodes= [839, 840, 841, 3839, 3840, 3841] persons= [843, 844, 845] +--- sas= [] oneidj_slice839 crp= 1 +--- 'expires': 1167127046 +841 None oneiea_slice840 nodes= [840, 841, 842, 3840, 3841, 3842] persons= [844, 845, 846] +--- sas= [] oneiea_slice840 crp= 1 +--- 'expires': 1167127047 +842 None oneieb_slice841 nodes= [841, 842, 843, 3841, 3842, 3843] persons= [845, 846, 847] +--- sas= [] oneieb_slice841 crp= 1 +--- 'expires': 1167127047 +843 None oneiec_slice842 nodes= [842, 843, 844, 3842, 3843, 3844] persons= [846, 847, 848] +--- sas= [] oneiec_slice842 crp= 1 +--- 'expires': 1167127047 +844 None oneied_slice843 nodes= [843, 844, 845, 3843, 3844, 3845] persons= [847, 848, 849] +--- sas= [] oneied_slice843 crp= 1 +--- 'expires': 1167127048 +845 None oneiee_slice844 nodes= [844, 845, 846, 3844, 3845, 3846] persons= [848, 849, 850] +--- sas= [] oneiee_slice844 crp= 1 +--- 'expires': 1167127048 +846 None oneief_slice845 nodes= [845, 846, 847, 3845, 3846, 3847] persons= [849, 850, 851] +--- sas= [] oneief_slice845 crp= 1 +--- 'expires': 1167127048 +847 None oneieg_slice846 nodes= [846, 847, 848, 3846, 3847, 3848] persons= [850, 851, 852] +--- sas= [] oneieg_slice846 crp= 1 +--- 'expires': 1167127048 +848 None oneieh_slice847 nodes= [847, 848, 849, 3847, 3848, 3849] persons= [851, 852, 853] +--- sas= [] oneieh_slice847 crp= 1 +--- 'expires': 1167127049 +849 None oneiei_slice848 nodes= [848, 849, 850, 3848, 3849, 3850] persons= [852, 853, 854] +--- sas= [] oneiei_slice848 crp= 1 +--- 'expires': 1167127049 +850 None oneiej_slice849 nodes= [849, 850, 851, 3849, 3850, 3851] persons= [853, 854, 855] +--- sas= [] oneiej_slice849 crp= 1 +--- 'expires': 1167127049 +851 None oneifa_slice850 nodes= [850, 851, 852, 3850, 3851, 3852] persons= [854, 855, 856] +--- sas= [] oneifa_slice850 crp= 1 +--- 'expires': 1167127050 +852 None oneifb_slice851 nodes= [851, 852, 853, 3851, 3852, 3853] persons= [855, 856, 857] +--- sas= [] oneifb_slice851 crp= 1 +--- 'expires': 1167127050 +853 None oneifc_slice852 nodes= [852, 853, 854, 3852, 3853, 3854] persons= [856, 857, 858] +--- sas= [] oneifc_slice852 crp= 1 +--- 'expires': 1167127050 +854 None oneifd_slice853 nodes= [853, 854, 855, 3853, 3854, 3855] persons= [857, 858, 859] +--- sas= [] oneifd_slice853 crp= 1 +--- 'expires': 1167127051 +855 None oneife_slice854 nodes= [854, 855, 856, 3854, 3855, 3856] persons= [858, 859, 860] +--- sas= [] oneife_slice854 crp= 1 +--- 'expires': 1167127051 +856 None oneiff_slice855 nodes= [855, 856, 857, 3855, 3856, 3857] persons= [859, 860, 861] +--- sas= [] oneiff_slice855 crp= 1 +--- 'expires': 1167127051 +857 None oneifg_slice856 nodes= [856, 857, 858, 3856, 3857, 3858] persons= [860, 861, 862] +--- sas= [] oneifg_slice856 crp= 1 +--- 'expires': 1167127052 +858 None oneifh_slice857 nodes= [857, 858, 859, 3857, 3858, 3859] persons= [861, 862, 863] +--- sas= [] oneifh_slice857 crp= 1 +--- 'expires': 1167127052 +859 None oneifi_slice858 nodes= [858, 859, 860, 3858, 3859, 3860] persons= [862, 863, 864] +--- sas= [] oneifi_slice858 crp= 1 +--- 'expires': 1167127052 +860 None oneifj_slice859 nodes= [859, 860, 861, 3859, 3860, 3861] persons= [863, 864, 865] +--- sas= [] oneifj_slice859 crp= 1 +--- 'expires': 1167127053 +861 None oneiga_slice860 nodes= [860, 861, 862, 3860, 3861, 3862] persons= [864, 865, 866] +--- sas= [] oneiga_slice860 crp= 1 +--- 'expires': 1167127053 +862 None oneigb_slice861 nodes= [861, 862, 863, 3861, 3862, 3863] persons= [865, 866, 867] +--- sas= [] oneigb_slice861 crp= 1 +--- 'expires': 1167127053 +863 None oneigc_slice862 nodes= [862, 863, 864, 3862, 3863, 3864] persons= [866, 867, 868] +--- sas= [] oneigc_slice862 crp= 1 +--- 'expires': 1167127054 +864 None oneigd_slice863 nodes= [863, 864, 865, 3863, 3864, 3865] persons= [867, 868, 869] +--- sas= [] oneigd_slice863 crp= 1 +--- 'expires': 1167127054 +865 None oneige_slice864 nodes= [864, 865, 866, 3864, 3865, 3866] persons= [868, 869, 870] +--- sas= [] oneige_slice864 crp= 1 +--- 'expires': 1167127054 +866 None oneigf_slice865 nodes= [865, 866, 867, 3865, 3866, 3867] persons= [869, 870, 871] +--- sas= [] oneigf_slice865 crp= 1 +--- 'expires': 1167127055 +867 None oneigg_slice866 nodes= [866, 867, 868, 3866, 3867, 3868] persons= [870, 871, 872] +--- sas= [] oneigg_slice866 crp= 1 +--- 'expires': 1167127055 +868 None oneigh_slice867 nodes= [867, 868, 869, 3867, 3868, 3869] persons= [871, 872, 873] +--- sas= [] oneigh_slice867 crp= 1 +--- 'expires': 1167127055 +869 None oneigi_slice868 nodes= [868, 869, 870, 3868, 3869, 3870] persons= [872, 873, 874] +--- sas= [] oneigi_slice868 crp= 1 +--- 'expires': 1167127056 +870 None oneigj_slice869 nodes= [869, 870, 871, 3869, 3870, 3871] persons= [873, 874, 875] +--- sas= [] oneigj_slice869 crp= 1 +--- 'expires': 1167127056 +871 None oneiha_slice870 nodes= [870, 871, 872, 3870, 3871, 3872] persons= [874, 875, 876] +--- sas= [] oneiha_slice870 crp= 1 +--- 'expires': 1167127056 +872 None oneihb_slice871 nodes= [871, 872, 873, 3871, 3872, 3873] persons= [875, 876, 877] +--- sas= [] oneihb_slice871 crp= 1 +--- 'expires': 1167127057 +873 None oneihc_slice872 nodes= [872, 873, 874, 3872, 3873, 3874] persons= [876, 877, 878] +--- sas= [] oneihc_slice872 crp= 1 +--- 'expires': 1167127057 +874 None oneihd_slice873 nodes= [873, 874, 875, 3873, 3874, 3875] persons= [877, 878, 879] +--- sas= [] oneihd_slice873 crp= 1 +--- 'expires': 1167127057 +875 None oneihe_slice874 nodes= [874, 875, 876, 3874, 3875, 3876] persons= [878, 879, 880] +--- sas= [] oneihe_slice874 crp= 1 +--- 'expires': 1167127058 +876 None oneihf_slice875 nodes= [875, 876, 877, 3875, 3876, 3877] persons= [879, 880, 881] +--- sas= [] oneihf_slice875 crp= 1 +--- 'expires': 1167127058 +877 None oneihg_slice876 nodes= [876, 877, 878, 3876, 3877, 3878] persons= [880, 881, 882] +--- sas= [] oneihg_slice876 crp= 1 +--- 'expires': 1167127059 +878 None oneihh_slice877 nodes= [877, 878, 879, 3877, 3878, 3879] persons= [881, 882, 883] +--- sas= [] oneihh_slice877 crp= 1 +--- 'expires': 1167127059 +879 None oneihi_slice878 nodes= [878, 879, 880, 3878, 3879, 3880] persons= [882, 883, 884] +--- sas= [] oneihi_slice878 crp= 1 +--- 'expires': 1167127059 +880 None oneihj_slice879 nodes= [879, 880, 881, 3879, 3880, 3881] persons= [883, 884, 885] +--- sas= [] oneihj_slice879 crp= 1 +--- 'expires': 1167127060 +881 None oneiia_slice880 nodes= [880, 881, 882, 3880, 3881, 3882] persons= [884, 885, 886] +--- sas= [] oneiia_slice880 crp= 1 +--- 'expires': 1167127060 +882 None oneiib_slice881 nodes= [881, 882, 883, 3881, 3882, 3883] persons= [885, 886, 887] +--- sas= [] oneiib_slice881 crp= 1 +--- 'expires': 1167127060 +883 None oneiic_slice882 nodes= [882, 883, 884, 3882, 3883, 3884] persons= [886, 887, 888] +--- sas= [] oneiic_slice882 crp= 1 +--- 'expires': 1167127061 +884 None oneiid_slice883 nodes= [883, 884, 885, 3883, 3884, 3885] persons= [887, 888, 889] +--- sas= [] oneiid_slice883 crp= 1 +--- 'expires': 1167127061 +885 None oneiie_slice884 nodes= [884, 885, 886, 3884, 3885, 3886] persons= [888, 889, 890] +--- sas= [] oneiie_slice884 crp= 1 +--- 'expires': 1167127061 +886 None oneiif_slice885 nodes= [885, 886, 887, 3885, 3886, 3887] persons= [889, 890, 891] +--- sas= [] oneiif_slice885 crp= 1 +--- 'expires': 1167127062 +887 None oneiig_slice886 nodes= [886, 887, 888, 3886, 3887, 3888] persons= [890, 891, 892] +--- sas= [] oneiig_slice886 crp= 1 +--- 'expires': 1167127062 +888 None oneiih_slice887 nodes= [887, 888, 889, 3887, 3888, 3889] persons= [891, 892, 893] +--- sas= [] oneiih_slice887 crp= 1 +--- 'expires': 1167127062 +889 None oneiii_slice888 nodes= [888, 889, 890, 3888, 3889, 3890] persons= [892, 893, 894] +--- sas= [] oneiii_slice888 crp= 1 +--- 'expires': 1167127063 +890 None oneiij_slice889 nodes= [889, 890, 891, 3889, 3890, 3891] persons= [893, 894, 895] +--- sas= [] oneiij_slice889 crp= 1 +--- 'expires': 1167127063 +891 None oneija_slice890 nodes= [890, 891, 892, 3890, 3891, 3892] persons= [894, 895, 896] +--- sas= [] oneija_slice890 crp= 1 +--- 'expires': 1167127063 +892 None oneijb_slice891 nodes= [891, 892, 893, 3891, 3892, 3893] persons= [895, 896, 897] +--- sas= [] oneijb_slice891 crp= 1 +--- 'expires': 1167127064 +893 None oneijc_slice892 nodes= [892, 893, 894, 3892, 3893, 3894] persons= [896, 897, 898] +--- sas= [] oneijc_slice892 crp= 1 +--- 'expires': 1167127064 +894 None oneijd_slice893 nodes= [893, 894, 895, 3893, 3894, 3895] persons= [897, 898, 899] +--- sas= [] oneijd_slice893 crp= 1 +--- 'expires': 1167127064 +895 None oneije_slice894 nodes= [894, 895, 896, 3894, 3895, 3896] persons= [898, 899, 900] +--- sas= [] oneije_slice894 crp= 1 +--- 'expires': 1167127065 +896 None oneijf_slice895 nodes= [895, 896, 897, 3895, 3896, 3897] persons= [899, 900, 901] +--- sas= [] oneijf_slice895 crp= 1 +--- 'expires': 1167127065 +897 None oneijg_slice896 nodes= [896, 897, 898, 3896, 3897, 3898] persons= [900, 901, 902] +--- sas= [] oneijg_slice896 crp= 1 +--- 'expires': 1167127065 +898 None oneijh_slice897 nodes= [897, 898, 899, 3897, 3898, 3899] persons= [901, 902, 903] +--- sas= [] oneijh_slice897 crp= 1 +--- 'expires': 1167127066 +899 None oneiji_slice898 nodes= [898, 899, 900, 3898, 3899, 3900] persons= [902, 903, 904] +--- sas= [] oneiji_slice898 crp= 1 +--- 'expires': 1167127066 +900 None oneijj_slice899 nodes= [899, 900, 901, 3899, 3900, 3901] persons= [903, 904, 905] +--- sas= [] oneijj_slice899 crp= 1 +--- 'expires': 1167127066 +901 None onejaa_slice900 nodes= [900, 901, 902, 3900, 3901, 3902] persons= [904, 905, 906] +--- sas= [] onejaa_slice900 crp= 1 +--- 'expires': 1167127067 +902 None onejab_slice901 nodes= [901, 902, 903, 3901, 3902, 3903] persons= [905, 906, 907] +--- sas= [] onejab_slice901 crp= 1 +--- 'expires': 1167127067 +903 None onejac_slice902 nodes= [902, 903, 904, 3902, 3903, 3904] persons= [906, 907, 908] +--- sas= [] onejac_slice902 crp= 1 +--- 'expires': 1167127067 +904 None onejad_slice903 nodes= [903, 904, 905, 3903, 3904, 3905] persons= [907, 908, 909] +--- sas= [] onejad_slice903 crp= 1 +--- 'expires': 1167127068 +905 None onejae_slice904 nodes= [904, 905, 906, 3904, 3905, 3906] persons= [908, 909, 910] +--- sas= [] onejae_slice904 crp= 1 +--- 'expires': 1167127068 +906 None onejaf_slice905 nodes= [905, 906, 907, 3905, 3906, 3907] persons= [909, 910, 911] +--- sas= [] onejaf_slice905 crp= 1 +--- 'expires': 1167127068 +907 None onejag_slice906 nodes= [906, 907, 908, 3906, 3907, 3908] persons= [910, 911, 912] +--- sas= [] onejag_slice906 crp= 1 +--- 'expires': 1167127069 +908 None onejah_slice907 nodes= [907, 908, 909, 3907, 3908, 3909] persons= [911, 912, 913] +--- sas= [] onejah_slice907 crp= 1 +--- 'expires': 1167127069 +909 None onejai_slice908 nodes= [908, 909, 910, 3908, 3909, 3910] persons= [912, 913, 914] +--- sas= [] onejai_slice908 crp= 1 +--- 'expires': 1167127069 +910 None onejaj_slice909 nodes= [909, 910, 911, 3909, 3910, 3911] persons= [913, 914, 915] +--- sas= [] onejaj_slice909 crp= 1 +--- 'expires': 1167127070 +911 None onejba_slice910 nodes= [910, 911, 912, 3910, 3911, 3912] persons= [914, 915, 916] +--- sas= [] onejba_slice910 crp= 1 +--- 'expires': 1167127070 +912 None onejbb_slice911 nodes= [911, 912, 913, 3911, 3912, 3913] persons= [915, 916, 917] +--- sas= [] onejbb_slice911 crp= 1 +--- 'expires': 1167127070 +913 None onejbc_slice912 nodes= [912, 913, 914, 3912, 3913, 3914] persons= [916, 917, 918] +--- sas= [] onejbc_slice912 crp= 1 +--- 'expires': 1167127071 +914 None onejbd_slice913 nodes= [913, 914, 915, 3913, 3914, 3915] persons= [917, 918, 919] +--- sas= [] onejbd_slice913 crp= 1 +--- 'expires': 1167127071 +915 None onejbe_slice914 nodes= [914, 915, 916, 3914, 3915, 3916] persons= [918, 919, 920] +--- sas= [] onejbe_slice914 crp= 1 +--- 'expires': 1167127071 +916 None onejbf_slice915 nodes= [915, 916, 917, 3915, 3916, 3917] persons= [919, 920, 921] +--- sas= [] onejbf_slice915 crp= 1 +--- 'expires': 1167127072 +917 None onejbg_slice916 nodes= [916, 917, 918, 3916, 3917, 3918] persons= [920, 921, 922] +--- sas= [] onejbg_slice916 crp= 1 +--- 'expires': 1167127072 +918 None onejbh_slice917 nodes= [917, 918, 919, 3917, 3918, 3919] persons= [921, 922, 923] +--- sas= [] onejbh_slice917 crp= 1 +--- 'expires': 1167127072 +919 None onejbi_slice918 nodes= [918, 919, 920, 3918, 3919, 3920] persons= [922, 923, 924] +--- sas= [] onejbi_slice918 crp= 1 +--- 'expires': 1167127073 +920 None onejbj_slice919 nodes= [919, 920, 921, 3919, 3920, 3921] persons= [923, 924, 925] +--- sas= [] onejbj_slice919 crp= 1 +--- 'expires': 1167127073 +921 None onejca_slice920 nodes= [920, 921, 922, 3920, 3921, 3922] persons= [924, 925, 926] +--- sas= [] onejca_slice920 crp= 1 +--- 'expires': 1167127073 +922 None onejcb_slice921 nodes= [921, 922, 923, 3921, 3922, 3923] persons= [925, 926, 927] +--- sas= [] onejcb_slice921 crp= 1 +--- 'expires': 1167127074 +923 None onejcc_slice922 nodes= [922, 923, 924, 3922, 3923, 3924] persons= [926, 927, 928] +--- sas= [] onejcc_slice922 crp= 1 +--- 'expires': 1167127074 +924 None onejcd_slice923 nodes= [923, 924, 925, 3923, 3924, 3925] persons= [927, 928, 929] +--- sas= [] onejcd_slice923 crp= 1 +--- 'expires': 1167127074 +925 None onejce_slice924 nodes= [924, 925, 926, 3924, 3925, 3926] persons= [928, 929, 930] +--- sas= [] onejce_slice924 crp= 1 +--- 'expires': 1167127075 +926 None onejcf_slice925 nodes= [925, 926, 927, 3925, 3926, 3927] persons= [929, 930, 931] +--- sas= [] onejcf_slice925 crp= 1 +--- 'expires': 1167127075 +927 None onejcg_slice926 nodes= [926, 927, 928, 3926, 3927, 3928] persons= [930, 931, 932] +--- sas= [] onejcg_slice926 crp= 1 +--- 'expires': 1167127075 +928 None onejch_slice927 nodes= [927, 928, 929, 3927, 3928, 3929] persons= [931, 932, 933] +--- sas= [] onejch_slice927 crp= 1 +--- 'expires': 1167127076 +929 None onejci_slice928 nodes= [928, 929, 930, 3928, 3929, 3930] persons= [932, 933, 934] +--- sas= [] onejci_slice928 crp= 1 +--- 'expires': 1167127076 +930 None onejcj_slice929 nodes= [929, 930, 931, 3929, 3930, 3931] persons= [933, 934, 935] +--- sas= [] onejcj_slice929 crp= 1 +--- 'expires': 1167127076 +931 None onejda_slice930 nodes= [930, 931, 932, 3930, 3931, 3932] persons= [934, 935, 936] +--- sas= [] onejda_slice930 crp= 1 +--- 'expires': 1167127077 +932 None onejdb_slice931 nodes= [931, 932, 933, 3931, 3932, 3933] persons= [935, 936, 937] +--- sas= [] onejdb_slice931 crp= 1 +--- 'expires': 1167127077 +933 None onejdc_slice932 nodes= [932, 933, 934, 3932, 3933, 3934] persons= [936, 937, 938] +--- sas= [] onejdc_slice932 crp= 1 +--- 'expires': 1167127077 +934 None onejdd_slice933 nodes= [933, 934, 935, 3933, 3934, 3935] persons= [937, 938, 939] +--- sas= [] onejdd_slice933 crp= 1 +--- 'expires': 1167127078 +935 None onejde_slice934 nodes= [934, 935, 936, 3934, 3935, 3936] persons= [938, 939, 940] +--- sas= [] onejde_slice934 crp= 1 +--- 'expires': 1167127078 +936 None onejdf_slice935 nodes= [935, 936, 937, 3935, 3936, 3937] persons= [939, 940, 941] +--- sas= [] onejdf_slice935 crp= 1 +--- 'expires': 1167127078 +937 None onejdg_slice936 nodes= [936, 937, 938, 3936, 3937, 3938] persons= [940, 941, 942] +--- sas= [] onejdg_slice936 crp= 1 +--- 'expires': 1167127079 +938 None onejdh_slice937 nodes= [937, 938, 939, 3937, 3938, 3939] persons= [941, 942, 943] +--- sas= [] onejdh_slice937 crp= 1 +--- 'expires': 1167127079 +939 None onejdi_slice938 nodes= [938, 939, 940, 3938, 3939, 3940] persons= [942, 943, 944] +--- sas= [] onejdi_slice938 crp= 1 +--- 'expires': 1167127079 +940 None onejdj_slice939 nodes= [939, 940, 941, 3939, 3940, 3941] persons= [943, 944, 945] +--- sas= [] onejdj_slice939 crp= 1 +--- 'expires': 1167127080 +941 None onejea_slice940 nodes= [940, 941, 942, 3940, 3941, 3942] persons= [944, 945, 946] +--- sas= [] onejea_slice940 crp= 1 +--- 'expires': 1167127080 +942 None onejeb_slice941 nodes= [941, 942, 943, 3941, 3942, 3943] persons= [945, 946, 947] +--- sas= [] onejeb_slice941 crp= 1 +--- 'expires': 1167127080 +943 None onejec_slice942 nodes= [942, 943, 944, 3942, 3943, 3944] persons= [946, 947, 948] +--- sas= [] onejec_slice942 crp= 1 +--- 'expires': 1167127081 +944 None onejed_slice943 nodes= [943, 944, 945, 3943, 3944, 3945] persons= [947, 948, 949] +--- sas= [] onejed_slice943 crp= 1 +--- 'expires': 1167127081 +945 None onejee_slice944 nodes= [944, 945, 946, 3944, 3945, 3946] persons= [948, 949, 950] +--- sas= [] onejee_slice944 crp= 1 +--- 'expires': 1167127081 +946 None onejef_slice945 nodes= [945, 946, 947, 3945, 3946, 3947] persons= [949, 950, 951] +--- sas= [] onejef_slice945 crp= 1 +--- 'expires': 1167127082 +947 None onejeg_slice946 nodes= [946, 947, 948, 3946, 3947, 3948] persons= [950, 951, 952] +--- sas= [] onejeg_slice946 crp= 1 +--- 'expires': 1167127082 +948 None onejeh_slice947 nodes= [947, 948, 949, 3947, 3948, 3949] persons= [951, 952, 953] +--- sas= [] onejeh_slice947 crp= 1 +--- 'expires': 1167127082 +949 None onejei_slice948 nodes= [948, 949, 950, 3948, 3949, 3950] persons= [952, 953, 954] +--- sas= [] onejei_slice948 crp= 1 +--- 'expires': 1167127083 +950 None onejej_slice949 nodes= [949, 950, 951, 3949, 3950, 3951] persons= [953, 954, 955] +--- sas= [] onejej_slice949 crp= 1 +--- 'expires': 1167127083 +951 None onejfa_slice950 nodes= [950, 951, 952, 3950, 3951, 3952] persons= [954, 955, 956] +--- sas= [] onejfa_slice950 crp= 1 +--- 'expires': 1167127083 +952 None onejfb_slice951 nodes= [951, 952, 953, 3951, 3952, 3953] persons= [955, 956, 957] +--- sas= [] onejfb_slice951 crp= 1 +--- 'expires': 1167127084 +953 None onejfc_slice952 nodes= [952, 953, 954, 3952, 3953, 3954] persons= [956, 957, 958] +--- sas= [] onejfc_slice952 crp= 1 +--- 'expires': 1167127084 +954 None onejfd_slice953 nodes= [953, 954, 955, 3953, 3954, 3955] persons= [957, 958, 959] +--- sas= [] onejfd_slice953 crp= 1 +--- 'expires': 1167127084 +955 None onejfe_slice954 nodes= [954, 955, 956, 3954, 3955, 3956] persons= [958, 959, 960] +--- sas= [] onejfe_slice954 crp= 1 +--- 'expires': 1167127085 +956 None onejff_slice955 nodes= [955, 956, 957, 3955, 3956, 3957] persons= [959, 960, 961] +--- sas= [] onejff_slice955 crp= 1 +--- 'expires': 1167127085 +957 None onejfg_slice956 nodes= [956, 957, 958, 3956, 3957, 3958] persons= [960, 961, 962] +--- sas= [] onejfg_slice956 crp= 1 +--- 'expires': 1167127085 +958 None onejfh_slice957 nodes= [957, 958, 959, 3957, 3958, 3959] persons= [961, 962, 963] +--- sas= [] onejfh_slice957 crp= 1 +--- 'expires': 1167127086 +959 None onejfi_slice958 nodes= [958, 959, 960, 3958, 3959, 3960] persons= [962, 963, 964] +--- sas= [] onejfi_slice958 crp= 1 +--- 'expires': 1167127086 +960 None onejfj_slice959 nodes= [959, 960, 961, 3959, 3960, 3961] persons= [963, 964, 965] +--- sas= [] onejfj_slice959 crp= 1 +--- 'expires': 1167127086 +961 None onejga_slice960 nodes= [960, 961, 962, 3960, 3961, 3962] persons= [964, 965, 966] +--- sas= [] onejga_slice960 crp= 1 +--- 'expires': 1167127087 +962 None onejgb_slice961 nodes= [961, 962, 963, 3961, 3962, 3963] persons= [965, 966, 967] +--- sas= [] onejgb_slice961 crp= 1 +--- 'expires': 1167127087 +963 None onejgc_slice962 nodes= [962, 963, 964, 3962, 3963, 3964] persons= [966, 967, 968] +--- sas= [] onejgc_slice962 crp= 1 +--- 'expires': 1167127087 +964 None onejgd_slice963 nodes= [963, 964, 965, 3963, 3964, 3965] persons= [967, 968, 969] +--- sas= [] onejgd_slice963 crp= 1 +--- 'expires': 1167127088 +965 None onejge_slice964 nodes= [964, 965, 966, 3964, 3965, 3966] persons= [968, 969, 970] +--- sas= [] onejge_slice964 crp= 1 +--- 'expires': 1167127088 +966 None onejgf_slice965 nodes= [965, 966, 967, 3965, 3966, 3967] persons= [969, 970, 971] +--- sas= [] onejgf_slice965 crp= 1 +--- 'expires': 1167127088 +967 None onejgg_slice966 nodes= [966, 967, 968, 3966, 3967, 3968] persons= [970, 971, 972] +--- sas= [] onejgg_slice966 crp= 1 +--- 'expires': 1167127089 +968 None onejgh_slice967 nodes= [967, 968, 969, 3967, 3968, 3969] persons= [971, 972, 973] +--- sas= [] onejgh_slice967 crp= 1 +--- 'expires': 1167127089 +969 None onejgi_slice968 nodes= [968, 969, 970, 3968, 3969, 3970] persons= [972, 973, 974] +--- sas= [] onejgi_slice968 crp= 1 +--- 'expires': 1167127089 +970 None onejgj_slice969 nodes= [969, 970, 971, 3969, 3970, 3971] persons= [973, 974, 975] +--- sas= [] onejgj_slice969 crp= 1 +--- 'expires': 1167127090 +971 None onejha_slice970 nodes= [970, 971, 972, 3970, 3971, 3972] persons= [974, 975, 976] +--- sas= [] onejha_slice970 crp= 1 +--- 'expires': 1167127090 +972 None onejhb_slice971 nodes= [971, 972, 973, 3971, 3972, 3973] persons= [975, 976, 977] +--- sas= [] onejhb_slice971 crp= 1 +--- 'expires': 1167127090 +973 None onejhc_slice972 nodes= [972, 973, 974, 3972, 3973, 3974] persons= [976, 977, 978] +--- sas= [] onejhc_slice972 crp= 1 +--- 'expires': 1167127091 +974 None onejhd_slice973 nodes= [973, 974, 975, 3973, 3974, 3975] persons= [977, 978, 979] +--- sas= [] onejhd_slice973 crp= 1 +--- 'expires': 1167127091 +975 None onejhe_slice974 nodes= [974, 975, 976, 3974, 3975, 3976] persons= [978, 979, 980] +--- sas= [] onejhe_slice974 crp= 1 +--- 'expires': 1167127091 +976 None onejhf_slice975 nodes= [975, 976, 977, 3975, 3976, 3977] persons= [979, 980, 981] +--- sas= [] onejhf_slice975 crp= 1 +--- 'expires': 1167127092 +977 None onejhg_slice976 nodes= [976, 977, 978, 3976, 3977, 3978] persons= [980, 981, 982] +--- sas= [] onejhg_slice976 crp= 1 +--- 'expires': 1167127092 +978 None onejhh_slice977 nodes= [977, 978, 979, 3977, 3978, 3979] persons= [981, 982, 983] +--- sas= [] onejhh_slice977 crp= 1 +--- 'expires': 1167127092 +979 None onejhi_slice978 nodes= [978, 979, 980, 3978, 3979, 3980] persons= [982, 983, 984] +--- sas= [] onejhi_slice978 crp= 1 +--- 'expires': 1167127093 +980 None onejhj_slice979 nodes= [979, 980, 981, 3979, 3980, 3981] persons= [983, 984, 985] +--- sas= [] onejhj_slice979 crp= 1 +--- 'expires': 1167127093 +981 None onejia_slice980 nodes= [980, 981, 982, 3980, 3981, 3982] persons= [984, 985, 986] +--- sas= [] onejia_slice980 crp= 1 +--- 'expires': 1167127093 +982 None onejib_slice981 nodes= [981, 982, 983, 3981, 3982, 3983] persons= [985, 986, 987] +--- sas= [] onejib_slice981 crp= 1 +--- 'expires': 1167127094 +983 None onejic_slice982 nodes= [982, 983, 984, 3982, 3983, 3984] persons= [986, 987, 988] +--- sas= [] onejic_slice982 crp= 1 +--- 'expires': 1167127094 +984 None onejid_slice983 nodes= [983, 984, 985, 3983, 3984, 3985] persons= [987, 988, 989] +--- sas= [] onejid_slice983 crp= 1 +--- 'expires': 1167127094 +985 None onejie_slice984 nodes= [984, 985, 986, 3984, 3985, 3986] persons= [988, 989, 990] +--- sas= [] onejie_slice984 crp= 1 +--- 'expires': 1167127095 +986 None onejif_slice985 nodes= [985, 986, 987, 3985, 3986, 3987] persons= [989, 990, 991] +--- sas= [] onejif_slice985 crp= 1 +--- 'expires': 1167127095 +987 None onejig_slice986 nodes= [986, 987, 988, 3986, 3987, 3988] persons= [990, 991, 992] +--- sas= [] onejig_slice986 crp= 1 +--- 'expires': 1167127095 +988 None onejih_slice987 nodes= [987, 988, 989, 3987, 3988, 3989] persons= [991, 992, 993] +--- sas= [] onejih_slice987 crp= 1 +--- 'expires': 1167127096 +989 None onejii_slice988 nodes= [988, 989, 990, 3988, 3989, 3990] persons= [992, 993, 994] +--- sas= [] onejii_slice988 crp= 1 +--- 'expires': 1167127096 +990 None onejij_slice989 nodes= [989, 990, 991, 3989, 3990, 3991] persons= [993, 994, 995] +--- sas= [] onejij_slice989 crp= 1 +--- 'expires': 1167127096 +991 None onejja_slice990 nodes= [990, 991, 992, 3990, 3991, 3992] persons= [994, 995, 996] +--- sas= [] onejja_slice990 crp= 1 +--- 'expires': 1167127097 +992 None onejjb_slice991 nodes= [991, 992, 993, 3991, 3992, 3993] persons= [995, 996, 997] +--- sas= [] onejjb_slice991 crp= 1 +--- 'expires': 1167127097 +993 None onejjc_slice992 nodes= [992, 993, 994, 3992, 3993, 3994] persons= [996, 997, 998] +--- sas= [] onejjc_slice992 crp= 1 +--- 'expires': 1167127097 +994 None onejjd_slice993 nodes= [993, 994, 995, 3993, 3994, 3995] persons= [997, 998, 999] +--- sas= [] onejjd_slice993 crp= 1 +--- 'expires': 1167127098 +995 None onejje_slice994 nodes= [994, 995, 996, 3994, 3995, 3996] persons= [998, 999, 1000] +--- sas= [] onejje_slice994 crp= 1 +--- 'expires': 1167127098 +996 None onejjf_slice995 nodes= [995, 996, 997, 3995, 3996, 3997] persons= [999, 1000, 1001] +--- sas= [] onejjf_slice995 crp= 1 +--- 'expires': 1167127098 +997 None onejjg_slice996 nodes= [996, 997, 998, 3996, 3997, 3998] persons= [1000, 1001, 1002] +--- sas= [] onejjg_slice996 crp= 1 +--- 'expires': 1167127099 +998 None onejjh_slice997 nodes= [997, 998, 999, 3997, 3998, 3999] persons= [1001, 1002, 1003] +--- sas= [] onejjh_slice997 crp= 1 +--- 'expires': 1167127099 +999 None onejji_slice998 nodes= [998, 999, 1000, 3998, 3999, 4000] persons= [1002, 1003, 1004] +--- sas= [] onejji_slice998 crp= 1 +--- 'expires': 1167127100 +1000 None onejjj_slice999 nodes= [999, 1000, 1001, 3999, 4000, 4001] persons= [1003, 1004, 1005] +--- sas= [] onejjj_slice999 crp= 1 +--- 'expires': 1167127100 +1001 None onebaaa_slice1000 nodes= [1000, 1001, 1002, 4000, 4001, 4002] persons= [1004, 1005, 1006] +--- sas= [] onebaaa_slice1000 crp= 1 +--- 'expires': 1167127100 +1002 None oneb_slice1001 nodes= [1001, 1002, 1003, 4001, 4002, 4003] persons= [1005, 1006, 1007] +--- sas= [] oneb_slice1001 crp= 1 +--- 'expires': 1167127101 +1003 None onec_slice1002 nodes= [1002, 1003, 1004, 4002, 4003, 4004] persons= [1006, 1007, 1008] +--- sas= [] onec_slice1002 crp= 1 +--- 'expires': 1167127101 +1004 None oned_slice1003 nodes= [1003, 1004, 1005, 4003, 4004, 4005] persons= [1007, 1008, 1009] +--- sas= [] oned_slice1003 crp= 1 +--- 'expires': 1167127101 +1005 None onee_slice1004 nodes= [1004, 1005, 1006, 4004, 4005, 4006] persons= [1008, 1009, 1010] +--- sas= [] onee_slice1004 crp= 1 +--- 'expires': 1167127102 +1006 None onef_slice1005 nodes= [1005, 1006, 1007, 4005, 4006, 4007] persons= [1009, 1010, 1011] +--- sas= [] onef_slice1005 crp= 1 +--- 'expires': 1167127102 +1007 None oneg_slice1006 nodes= [1006, 1007, 1008, 4006, 4007, 4008] persons= [1010, 1011, 1012] +--- sas= [] oneg_slice1006 crp= 1 +--- 'expires': 1167127102 +1008 None oneh_slice1007 nodes= [1007, 1008, 1009, 4007, 4008, 4009] persons= [1011, 1012, 1013] +--- sas= [] oneh_slice1007 crp= 1 +--- 'expires': 1167127103 +1009 None onei_slice1008 nodes= [1008, 1009, 1010, 4008, 4009, 4010] persons= [1012, 1013, 1014] +--- sas= [] onei_slice1008 crp= 1 +--- 'expires': 1167127103 +1010 None onej_slice1009 nodes= [1009, 1010, 1011, 4009, 4010, 4011] persons= [1013, 1014, 1015] +--- sas= [] onej_slice1009 crp= 1 +--- 'expires': 1167127103 +1011 None oneba_slice1010 nodes= [1010, 1011, 1012, 4010, 4011, 4012] persons= [1014, 1015, 1016] +--- sas= [] oneba_slice1010 crp= 1 +--- 'expires': 1167127104 +1012 None onebb_slice1011 nodes= [1011, 1012, 1013, 4011, 4012, 4013] persons= [1015, 1016, 1017] +--- sas= [] onebb_slice1011 crp= 1 +--- 'expires': 1167127104 +1013 None onebc_slice1012 nodes= [1012, 1013, 1014, 4012, 4013, 4014] persons= [1016, 1017, 1018] +--- sas= [] onebc_slice1012 crp= 1 +--- 'expires': 1167127104 +1014 None onebd_slice1013 nodes= [1013, 1014, 1015, 4013, 4014, 4015] persons= [1017, 1018, 1019] +--- sas= [] onebd_slice1013 crp= 1 +--- 'expires': 1167127105 +1015 None onebe_slice1014 nodes= [1014, 1015, 1016, 4014, 4015, 4016] persons= [1018, 1019, 1020] +--- sas= [] onebe_slice1014 crp= 1 +--- 'expires': 1167127105 +1016 None onebf_slice1015 nodes= [1015, 1016, 1017, 4015, 4016, 4017] persons= [1019, 1020, 1021] +--- sas= [] onebf_slice1015 crp= 1 +--- 'expires': 1167127105 +1017 None onebg_slice1016 nodes= [1016, 1017, 1018, 4016, 4017, 4018] persons= [1020, 1021, 1022] +--- sas= [] onebg_slice1016 crp= 1 +--- 'expires': 1167127106 +1018 None onebh_slice1017 nodes= [1017, 1018, 1019, 4017, 4018, 4019] persons= [1021, 1022, 1023] +--- sas= [] onebh_slice1017 crp= 1 +--- 'expires': 1167127106 +1019 None onebi_slice1018 nodes= [1018, 1019, 1020, 4018, 4019, 4020] persons= [1022, 1023, 1024] +--- sas= [] onebi_slice1018 crp= 1 +--- 'expires': 1167127106 +1020 None onebj_slice1019 nodes= [1019, 1020, 1021, 4019, 4020, 4021] persons= [1023, 1024, 1025] +--- sas= [] onebj_slice1019 crp= 1 +--- 'expires': 1167127107 +1021 None oneca_slice1020 nodes= [1020, 1021, 1022, 4020, 4021, 4022] persons= [1024, 1025, 1026] +--- sas= [] oneca_slice1020 crp= 1 +--- 'expires': 1167127107 +1022 None onecb_slice1021 nodes= [1021, 1022, 1023, 4021, 4022, 4023] persons= [1025, 1026, 1027] +--- sas= [] onecb_slice1021 crp= 1 +--- 'expires': 1167127107 +1023 None onecc_slice1022 nodes= [1022, 1023, 1024, 4022, 4023, 4024] persons= [1026, 1027, 1028] +--- sas= [] onecc_slice1022 crp= 1 +--- 'expires': 1167127108 +1024 None onecd_slice1023 nodes= [1023, 1024, 1025, 4023, 4024, 4025] persons= [1027, 1028, 1029] +--- sas= [] onecd_slice1023 crp= 1 +--- 'expires': 1167127108 +1025 None onece_slice1024 nodes= [1024, 1025, 1026, 4024, 4025, 4026] persons= [1028, 1029, 1030] +--- sas= [] onece_slice1024 crp= 1 +--- 'expires': 1167127108 +1026 None onecf_slice1025 nodes= [1025, 1026, 1027, 4025, 4026, 4027] persons= [1029, 1030, 1031] +--- sas= [] onecf_slice1025 crp= 1 +--- 'expires': 1167127109 +1027 None onecg_slice1026 nodes= [1026, 1027, 1028, 4026, 4027, 4028] persons= [1030, 1031, 1032] +--- sas= [] onecg_slice1026 crp= 1 +--- 'expires': 1167127109 +1028 None onech_slice1027 nodes= [1027, 1028, 1029, 4027, 4028, 4029] persons= [1031, 1032, 1033] +--- sas= [] onech_slice1027 crp= 1 +--- 'expires': 1167127110 +1029 None oneci_slice1028 nodes= [1028, 1029, 1030, 4028, 4029, 4030] persons= [1032, 1033, 1034] +--- sas= [] oneci_slice1028 crp= 1 +--- 'expires': 1167127110 +1030 None onecj_slice1029 nodes= [1029, 1030, 1031, 4029, 4030, 4031] persons= [1033, 1034, 1035] +--- sas= [] onecj_slice1029 crp= 1 +--- 'expires': 1167127110 +1031 None oneda_slice1030 nodes= [1030, 1031, 1032, 4030, 4031, 4032] persons= [1034, 1035, 1036] +--- sas= [] oneda_slice1030 crp= 1 +--- 'expires': 1167127111 +1032 None onedb_slice1031 nodes= [1031, 1032, 1033, 4031, 4032, 4033] persons= [1035, 1036, 1037] +--- sas= [] onedb_slice1031 crp= 1 +--- 'expires': 1167127111 +1033 None onedc_slice1032 nodes= [1032, 1033, 1034, 4032, 4033, 4034] persons= [1036, 1037, 1038] +--- sas= [] onedc_slice1032 crp= 1 +--- 'expires': 1167127111 +1034 None onedd_slice1033 nodes= [1033, 1034, 1035, 4033, 4034, 4035] persons= [1037, 1038, 1039] +--- sas= [] onedd_slice1033 crp= 1 +--- 'expires': 1167127112 +1035 None onede_slice1034 nodes= [1034, 1035, 1036, 4034, 4035, 4036] persons= [1038, 1039, 1040] +--- sas= [] onede_slice1034 crp= 1 +--- 'expires': 1167127112 +1036 None onedf_slice1035 nodes= [1035, 1036, 1037, 4035, 4036, 4037] persons= [1039, 1040, 1041] +--- sas= [] onedf_slice1035 crp= 1 +--- 'expires': 1167127112 +1037 None onedg_slice1036 nodes= [1036, 1037, 1038, 4036, 4037, 4038] persons= [1040, 1041, 1042] +--- sas= [] onedg_slice1036 crp= 1 +--- 'expires': 1167127113 +1038 None onedh_slice1037 nodes= [1037, 1038, 1039, 4037, 4038, 4039] persons= [1041, 1042, 1043] +--- sas= [] onedh_slice1037 crp= 1 +--- 'expires': 1167127113 +1039 None onedi_slice1038 nodes= [1038, 1039, 1040, 4038, 4039, 4040] persons= [1042, 1043, 1044] +--- sas= [] onedi_slice1038 crp= 1 +--- 'expires': 1167127113 +1040 None onedj_slice1039 nodes= [1039, 1040, 1041, 4039, 4040, 4041] persons= [1043, 1044, 1045] +--- sas= [] onedj_slice1039 crp= 1 +--- 'expires': 1167127114 +1041 None oneea_slice1040 nodes= [1040, 1041, 1042, 4040, 4041, 4042] persons= [1044, 1045, 1046] +--- sas= [] oneea_slice1040 crp= 1 +--- 'expires': 1167127114 +1042 None oneeb_slice1041 nodes= [1041, 1042, 1043, 4041, 4042, 4043] persons= [1045, 1046, 1047] +--- sas= [] oneeb_slice1041 crp= 1 +--- 'expires': 1167127114 +1043 None oneec_slice1042 nodes= [1042, 1043, 1044, 4042, 4043, 4044] persons= [1046, 1047, 1048] +--- sas= [] oneec_slice1042 crp= 1 +--- 'expires': 1167127115 +1044 None oneed_slice1043 nodes= [1043, 1044, 1045, 4043, 4044, 4045] persons= [1047, 1048, 1049] +--- sas= [] oneed_slice1043 crp= 1 +--- 'expires': 1167127115 +1045 None oneee_slice1044 nodes= [1044, 1045, 1046, 4044, 4045, 4046] persons= [1048, 1049, 1050] +--- sas= [] oneee_slice1044 crp= 1 +--- 'expires': 1167127115 +1046 None oneef_slice1045 nodes= [1045, 1046, 1047, 4045, 4046, 4047] persons= [1049, 1050, 1051] +--- sas= [] oneef_slice1045 crp= 1 +--- 'expires': 1167127116 +1047 None oneeg_slice1046 nodes= [1046, 1047, 1048, 4046, 4047, 4048] persons= [1050, 1051, 1052] +--- sas= [] oneeg_slice1046 crp= 1 +--- 'expires': 1167127116 +1048 None oneeh_slice1047 nodes= [1047, 1048, 1049, 4047, 4048, 4049] persons= [1051, 1052, 1053] +--- sas= [] oneeh_slice1047 crp= 1 +--- 'expires': 1167127117 +1049 None oneei_slice1048 nodes= [1048, 1049, 1050, 4048, 4049, 4050] persons= [1052, 1053, 1054] +--- sas= [] oneei_slice1048 crp= 1 +--- 'expires': 1167127117 +1050 None oneej_slice1049 nodes= [1049, 1050, 1051, 4049, 4050, 4051] persons= [1053, 1054, 1055] +--- sas= [] oneej_slice1049 crp= 1 +--- 'expires': 1167127117 +1051 None onefa_slice1050 nodes= [1050, 1051, 1052, 4050, 4051, 4052] persons= [1054, 1055, 1056] +--- sas= [] onefa_slice1050 crp= 1 +--- 'expires': 1167127118 +1052 None onefb_slice1051 nodes= [1051, 1052, 1053, 4051, 4052, 4053] persons= [1055, 1056, 1057] +--- sas= [] onefb_slice1051 crp= 1 +--- 'expires': 1167127118 +1053 None onefc_slice1052 nodes= [1052, 1053, 1054, 4052, 4053, 4054] persons= [1056, 1057, 1058] +--- sas= [] onefc_slice1052 crp= 1 +--- 'expires': 1167127118 +1054 None onefd_slice1053 nodes= [1053, 1054, 1055, 4053, 4054, 4055] persons= [1057, 1058, 1059] +--- sas= [] onefd_slice1053 crp= 1 +--- 'expires': 1167127119 +1055 None onefe_slice1054 nodes= [1054, 1055, 1056, 4054, 4055, 4056] persons= [1058, 1059, 1060] +--- sas= [] onefe_slice1054 crp= 1 +--- 'expires': 1167127119 +1056 None oneff_slice1055 nodes= [1055, 1056, 1057, 4055, 4056, 4057] persons= [1059, 1060, 1061] +--- sas= [] oneff_slice1055 crp= 1 +--- 'expires': 1167127119 +1057 None onefg_slice1056 nodes= [1056, 1057, 1058, 4056, 4057, 4058] persons= [1060, 1061, 1062] +--- sas= [] onefg_slice1056 crp= 1 +--- 'expires': 1167127120 +1058 None onefh_slice1057 nodes= [1057, 1058, 1059, 4057, 4058, 4059] persons= [1061, 1062, 1063] +--- sas= [] onefh_slice1057 crp= 1 +--- 'expires': 1167127120 +1059 None onefi_slice1058 nodes= [1058, 1059, 1060, 4058, 4059, 4060] persons= [1062, 1063, 1064] +--- sas= [] onefi_slice1058 crp= 1 +--- 'expires': 1167127120 +1060 None onefj_slice1059 nodes= [1059, 1060, 1061, 4059, 4060, 4061] persons= [1063, 1064, 1065] +--- sas= [] onefj_slice1059 crp= 1 +--- 'expires': 1167127121 +1061 None onega_slice1060 nodes= [1060, 1061, 1062, 4060, 4061, 4062] persons= [1064, 1065, 1066] +--- sas= [] onega_slice1060 crp= 1 +--- 'expires': 1167127121 +1062 None onegb_slice1061 nodes= [1061, 1062, 1063, 4061, 4062, 4063] persons= [1065, 1066, 1067] +--- sas= [] onegb_slice1061 crp= 1 +--- 'expires': 1167127121 +1063 None onegc_slice1062 nodes= [1062, 1063, 1064, 4062, 4063, 4064] persons= [1066, 1067, 1068] +--- sas= [] onegc_slice1062 crp= 1 +--- 'expires': 1167127122 +1064 None onegd_slice1063 nodes= [1063, 1064, 1065, 4063, 4064, 4065] persons= [1067, 1068, 1069] +--- sas= [] onegd_slice1063 crp= 1 +--- 'expires': 1167127122 +1065 None onege_slice1064 nodes= [1064, 1065, 1066, 4064, 4065, 4066] persons= [1068, 1069, 1070] +--- sas= [] onege_slice1064 crp= 1 +--- 'expires': 1167127123 +1066 None onegf_slice1065 nodes= [1065, 1066, 1067, 4065, 4066, 4067] persons= [1069, 1070, 1071] +--- sas= [] onegf_slice1065 crp= 1 +--- 'expires': 1167127123 +1067 None onegg_slice1066 nodes= [1066, 1067, 1068, 4066, 4067, 4068] persons= [1070, 1071, 1072] +--- sas= [] onegg_slice1066 crp= 1 +--- 'expires': 1167127123 +1068 None onegh_slice1067 nodes= [1067, 1068, 1069, 4067, 4068, 4069] persons= [1071, 1072, 1073] +--- sas= [] onegh_slice1067 crp= 1 +--- 'expires': 1167127124 +1069 None onegi_slice1068 nodes= [1068, 1069, 1070, 4068, 4069, 4070] persons= [1072, 1073, 1074] +--- sas= [] onegi_slice1068 crp= 1 +--- 'expires': 1167127124 +1070 None onegj_slice1069 nodes= [1069, 1070, 1071, 4069, 4070, 4071] persons= [1073, 1074, 1075] +--- sas= [] onegj_slice1069 crp= 1 +--- 'expires': 1167127124 +1071 None oneha_slice1070 nodes= [1070, 1071, 1072, 4070, 4071, 4072] persons= [1074, 1075, 1076] +--- sas= [] oneha_slice1070 crp= 1 +--- 'expires': 1167127125 +1072 None onehb_slice1071 nodes= [1071, 1072, 1073, 4071, 4072, 4073] persons= [1075, 1076, 1077] +--- sas= [] onehb_slice1071 crp= 1 +--- 'expires': 1167127125 +1073 None onehc_slice1072 nodes= [1072, 1073, 1074, 4072, 4073, 4074] persons= [1076, 1077, 1078] +--- sas= [] onehc_slice1072 crp= 1 +--- 'expires': 1167127125 +1074 None onehd_slice1073 nodes= [1073, 1074, 1075, 4073, 4074, 4075] persons= [1077, 1078, 1079] +--- sas= [] onehd_slice1073 crp= 1 +--- 'expires': 1167127126 +1075 None onehe_slice1074 nodes= [1074, 1075, 1076, 4074, 4075, 4076] persons= [1078, 1079, 1080] +--- sas= [] onehe_slice1074 crp= 1 +--- 'expires': 1167127126 +1076 None onehf_slice1075 nodes= [1075, 1076, 1077, 4075, 4076, 4077] persons= [1079, 1080, 1081] +--- sas= [] onehf_slice1075 crp= 1 +--- 'expires': 1167127126 +1077 None onehg_slice1076 nodes= [1076, 1077, 1078, 4076, 4077, 4078] persons= [1080, 1081, 1082] +--- sas= [] onehg_slice1076 crp= 1 +--- 'expires': 1167127127 +1078 None onehh_slice1077 nodes= [1077, 1078, 1079, 4077, 4078, 4079] persons= [1081, 1082, 1083] +--- sas= [] onehh_slice1077 crp= 1 +--- 'expires': 1167127127 +1079 None onehi_slice1078 nodes= [1078, 1079, 1080, 4078, 4079, 4080] persons= [1082, 1083, 1084] +--- sas= [] onehi_slice1078 crp= 1 +--- 'expires': 1167127127 +1080 None onehj_slice1079 nodes= [1079, 1080, 1081, 4079, 4080, 4081] persons= [1083, 1084, 1085] +--- sas= [] onehj_slice1079 crp= 1 +--- 'expires': 1167127128 +1081 None oneia_slice1080 nodes= [1080, 1081, 1082, 4080, 4081, 4082] persons= [1084, 1085, 1086] +--- sas= [] oneia_slice1080 crp= 1 +--- 'expires': 1167127128 +1082 None oneib_slice1081 nodes= [1081, 1082, 1083, 4081, 4082, 4083] persons= [1085, 1086, 1087] +--- sas= [] oneib_slice1081 crp= 1 +--- 'expires': 1167127129 +1083 None oneic_slice1082 nodes= [1082, 1083, 1084, 4082, 4083, 4084] persons= [1086, 1087, 1088] +--- sas= [] oneic_slice1082 crp= 1 +--- 'expires': 1167127129 +1084 None oneid_slice1083 nodes= [1083, 1084, 1085, 4083, 4084, 4085] persons= [1087, 1088, 1089] +--- sas= [] oneid_slice1083 crp= 1 +--- 'expires': 1167127129 +1085 None oneie_slice1084 nodes= [1084, 1085, 1086, 4084, 4085, 4086] persons= [1088, 1089, 1090] +--- sas= [] oneie_slice1084 crp= 1 +--- 'expires': 1167127130 +1086 None oneif_slice1085 nodes= [1085, 1086, 1087, 4085, 4086, 4087] persons= [1089, 1090, 1091] +--- sas= [] oneif_slice1085 crp= 1 +--- 'expires': 1167127130 +1087 None oneig_slice1086 nodes= [1086, 1087, 1088, 4086, 4087, 4088] persons= [1090, 1091, 1092] +--- sas= [] oneig_slice1086 crp= 1 +--- 'expires': 1167127130 +1088 None oneih_slice1087 nodes= [1087, 1088, 1089, 4087, 4088, 4089] persons= [1091, 1092, 1093] +--- sas= [] oneih_slice1087 crp= 1 +--- 'expires': 1167127131 +1089 None oneii_slice1088 nodes= [1088, 1089, 1090, 4088, 4089, 4090] persons= [1092, 1093, 1094] +--- sas= [] oneii_slice1088 crp= 1 +--- 'expires': 1167127131 +1090 None oneij_slice1089 nodes= [1089, 1090, 1091, 4089, 4090, 4091] persons= [1093, 1094, 1095] +--- sas= [] oneij_slice1089 crp= 1 +--- 'expires': 1167127131 +1091 None oneja_slice1090 nodes= [1090, 1091, 1092, 4090, 4091, 4092] persons= [1094, 1095, 1096] +--- sas= [] oneja_slice1090 crp= 1 +--- 'expires': 1167127132 +1092 None onejb_slice1091 nodes= [1091, 1092, 1093, 4091, 4092, 4093] persons= [1095, 1096, 1097] +--- sas= [] onejb_slice1091 crp= 1 +--- 'expires': 1167127132 +1093 None onejc_slice1092 nodes= [1092, 1093, 1094, 4092, 4093, 4094] persons= [1096, 1097, 1098] +--- sas= [] onejc_slice1092 crp= 1 +--- 'expires': 1167127132 +1094 None onejd_slice1093 nodes= [1093, 1094, 1095, 4093, 4094, 4095] persons= [1097, 1098, 1099] +--- sas= [] onejd_slice1093 crp= 1 +--- 'expires': 1167127133 +1095 None oneje_slice1094 nodes= [1094, 1095, 1096, 4094, 4095, 4096] persons= [1098, 1099, 1100] +--- sas= [] oneje_slice1094 crp= 1 +--- 'expires': 1167127133 +1096 None onejf_slice1095 nodes= [1095, 1096, 1097, 4095, 4096, 4097] persons= [1099, 1100, 1101] +--- sas= [] onejf_slice1095 crp= 1 +--- 'expires': 1167127134 +1097 None onejg_slice1096 nodes= [1096, 1097, 1098, 4096, 4097, 4098] persons= [1100, 1101, 1102] +--- sas= [] onejg_slice1096 crp= 1 +--- 'expires': 1167127134 +1098 None onejh_slice1097 nodes= [1097, 1098, 1099, 4097, 4098, 4099] persons= [1101, 1102, 1103] +--- sas= [] onejh_slice1097 crp= 1 +--- 'expires': 1167127134 +1099 None oneji_slice1098 nodes= [1098, 1099, 1100, 4098, 4099, 4100] persons= [1102, 1103, 1104] +--- sas= [] oneji_slice1098 crp= 1 +--- 'expires': 1167127135 +1100 None onejj_slice1099 nodes= [1099, 1100, 1101, 4099, 4100, 4101] persons= [1103, 1104, 1105] +--- sas= [] onejj_slice1099 crp= 1 +--- 'expires': 1167127135 +1101 None onebaa_slice1100 nodes= [1100, 1101, 1102, 4100, 4101, 4102] persons= [1104, 1105, 1106] +--- sas= [] onebaa_slice1100 crp= 1 +--- 'expires': 1167127135 +1102 None onebab_slice1101 nodes= [1101, 1102, 1103, 4101, 4102, 4103] persons= [1105, 1106, 1107] +--- sas= [] onebab_slice1101 crp= 1 +--- 'expires': 1167127136 +1103 None onebac_slice1102 nodes= [1102, 1103, 1104, 4102, 4103, 4104] persons= [1106, 1107, 1108] +--- sas= [] onebac_slice1102 crp= 1 +--- 'expires': 1167127136 +1104 None onebad_slice1103 nodes= [1103, 1104, 1105, 4103, 4104, 4105] persons= [1107, 1108, 1109] +--- sas= [] onebad_slice1103 crp= 1 +--- 'expires': 1167127136 +1105 None onebae_slice1104 nodes= [1104, 1105, 1106, 4104, 4105, 4106] persons= [1108, 1109, 1110] +--- sas= [] onebae_slice1104 crp= 1 +--- 'expires': 1167127137 +1106 None onebaf_slice1105 nodes= [1105, 1106, 1107, 4105, 4106, 4107] persons= [1109, 1110, 1111] +--- sas= [] onebaf_slice1105 crp= 1 +--- 'expires': 1167127137 +1107 None onebag_slice1106 nodes= [1106, 1107, 1108, 4106, 4107, 4108] persons= [1110, 1111, 1112] +--- sas= [] onebag_slice1106 crp= 1 +--- 'expires': 1167127137 +1108 None onebah_slice1107 nodes= [1107, 1108, 1109, 4107, 4108, 4109] persons= [1111, 1112, 1113] +--- sas= [] onebah_slice1107 crp= 1 +--- 'expires': 1167127138 +1109 None onebai_slice1108 nodes= [1108, 1109, 1110, 4108, 4109, 4110] persons= [1112, 1113, 1114] +--- sas= [] onebai_slice1108 crp= 1 +--- 'expires': 1167127138 +1110 None onebaj_slice1109 nodes= [1109, 1110, 1111, 4109, 4110, 4111] persons= [1113, 1114, 1115] +--- sas= [] onebaj_slice1109 crp= 1 +--- 'expires': 1167127139 +1111 None onebba_slice1110 nodes= [1110, 1111, 1112, 4110, 4111, 4112] persons= [1114, 1115, 1116] +--- sas= [] onebba_slice1110 crp= 1 +--- 'expires': 1167127139 +1112 None onebbb_slice1111 nodes= [1111, 1112, 1113, 4111, 4112, 4113] persons= [1115, 1116, 1117] +--- sas= [] onebbb_slice1111 crp= 1 +--- 'expires': 1167127139 +1113 None onebbc_slice1112 nodes= [1112, 1113, 1114, 4112, 4113, 4114] persons= [1116, 1117, 1118] +--- sas= [] onebbc_slice1112 crp= 1 +--- 'expires': 1167127140 +1114 None onebbd_slice1113 nodes= [1113, 1114, 1115, 4113, 4114, 4115] persons= [1117, 1118, 1119] +--- sas= [] onebbd_slice1113 crp= 1 +--- 'expires': 1167127140 +1115 None onebbe_slice1114 nodes= [1114, 1115, 1116, 4114, 4115, 4116] persons= [1118, 1119, 1120] +--- sas= [] onebbe_slice1114 crp= 1 +--- 'expires': 1167127140 +1116 None onebbf_slice1115 nodes= [1115, 1116, 1117, 4115, 4116, 4117] persons= [1119, 1120, 1121] +--- sas= [] onebbf_slice1115 crp= 1 +--- 'expires': 1167127141 +1117 None onebbg_slice1116 nodes= [1116, 1117, 1118, 4116, 4117, 4118] persons= [1120, 1121, 1122] +--- sas= [] onebbg_slice1116 crp= 1 +--- 'expires': 1167127141 +1118 None onebbh_slice1117 nodes= [1117, 1118, 1119, 4117, 4118, 4119] persons= [1121, 1122, 1123] +--- sas= [] onebbh_slice1117 crp= 1 +--- 'expires': 1167127141 +1119 None onebbi_slice1118 nodes= [1118, 1119, 1120, 4118, 4119, 4120] persons= [1122, 1123, 1124] +--- sas= [] onebbi_slice1118 crp= 1 +--- 'expires': 1167127142 +1120 None onebbj_slice1119 nodes= [1119, 1120, 1121, 4119, 4120, 4121] persons= [1123, 1124, 1125] +--- sas= [] onebbj_slice1119 crp= 1 +--- 'expires': 1167127142 +1121 None onebca_slice1120 nodes= [1120, 1121, 1122, 4120, 4121, 4122] persons= [1124, 1125, 1126] +--- sas= [] onebca_slice1120 crp= 1 +--- 'expires': 1167127143 +1122 None onebcb_slice1121 nodes= [1121, 1122, 1123, 4121, 4122, 4123] persons= [1125, 1126, 1127] +--- sas= [] onebcb_slice1121 crp= 1 +--- 'expires': 1167127143 +1123 None onebcc_slice1122 nodes= [1122, 1123, 1124, 4122, 4123, 4124] persons= [1126, 1127, 1128] +--- sas= [] onebcc_slice1122 crp= 1 +--- 'expires': 1167127143 +1124 None onebcd_slice1123 nodes= [1123, 1124, 1125, 4123, 4124, 4125] persons= [1127, 1128, 1129] +--- sas= [] onebcd_slice1123 crp= 1 +--- 'expires': 1167127144 +1125 None onebce_slice1124 nodes= [1124, 1125, 1126, 4124, 4125, 4126] persons= [1128, 1129, 1130] +--- sas= [] onebce_slice1124 crp= 1 +--- 'expires': 1167127144 +1126 None onebcf_slice1125 nodes= [1125, 1126, 1127, 4125, 4126, 4127] persons= [1129, 1130, 1131] +--- sas= [] onebcf_slice1125 crp= 1 +--- 'expires': 1167127144 +1127 None onebcg_slice1126 nodes= [1126, 1127, 1128, 4126, 4127, 4128] persons= [1130, 1131, 1132] +--- sas= [] onebcg_slice1126 crp= 1 +--- 'expires': 1167127145 +1128 None onebch_slice1127 nodes= [1127, 1128, 1129, 4127, 4128, 4129] persons= [1131, 1132, 1133] +--- sas= [] onebch_slice1127 crp= 1 +--- 'expires': 1167127145 +1129 None onebci_slice1128 nodes= [1128, 1129, 1130, 4128, 4129, 4130] persons= [1132, 1133, 1134] +--- sas= [] onebci_slice1128 crp= 1 +--- 'expires': 1167127145 +1130 None onebcj_slice1129 nodes= [1129, 1130, 1131, 4129, 4130, 4131] persons= [1133, 1134, 1135] +--- sas= [] onebcj_slice1129 crp= 1 +--- 'expires': 1167127146 +1131 None onebda_slice1130 nodes= [1130, 1131, 1132, 4130, 4131, 4132] persons= [1134, 1135, 1136] +--- sas= [] onebda_slice1130 crp= 1 +--- 'expires': 1167127146 +1132 None onebdb_slice1131 nodes= [1131, 1132, 1133, 4131, 4132, 4133] persons= [1135, 1136, 1137] +--- sas= [] onebdb_slice1131 crp= 1 +--- 'expires': 1167127147 +1133 None onebdc_slice1132 nodes= [1132, 1133, 1134, 4132, 4133, 4134] persons= [1136, 1137, 1138] +--- sas= [] onebdc_slice1132 crp= 1 +--- 'expires': 1167127147 +1134 None onebdd_slice1133 nodes= [1133, 1134, 1135, 4133, 4134, 4135] persons= [1137, 1138, 1139] +--- sas= [] onebdd_slice1133 crp= 1 +--- 'expires': 1167127147 +1135 None onebde_slice1134 nodes= [1134, 1135, 1136, 4134, 4135, 4136] persons= [1138, 1139, 1140] +--- sas= [] onebde_slice1134 crp= 1 +--- 'expires': 1167127148 +1136 None onebdf_slice1135 nodes= [1135, 1136, 1137, 4135, 4136, 4137] persons= [1139, 1140, 1141] +--- sas= [] onebdf_slice1135 crp= 1 +--- 'expires': 1167127148 +1137 None onebdg_slice1136 nodes= [1136, 1137, 1138, 4136, 4137, 4138] persons= [1140, 1141, 1142] +--- sas= [] onebdg_slice1136 crp= 1 +--- 'expires': 1167127148 +1138 None onebdh_slice1137 nodes= [1137, 1138, 1139, 4137, 4138, 4139] persons= [1141, 1142, 1143] +--- sas= [] onebdh_slice1137 crp= 1 +--- 'expires': 1167127149 +1139 None onebdi_slice1138 nodes= [1138, 1139, 1140, 4138, 4139, 4140] persons= [1142, 1143, 1144] +--- sas= [] onebdi_slice1138 crp= 1 +--- 'expires': 1167127149 +1140 None onebdj_slice1139 nodes= [1139, 1140, 1141, 4139, 4140, 4141] persons= [1143, 1144, 1145] +--- sas= [] onebdj_slice1139 crp= 1 +--- 'expires': 1167127149 +1141 None onebea_slice1140 nodes= [1140, 1141, 1142, 4140, 4141, 4142] persons= [1144, 1145, 1146] +--- sas= [] onebea_slice1140 crp= 1 +--- 'expires': 1167127150 +1142 None onebeb_slice1141 nodes= [1141, 1142, 1143, 4141, 4142, 4143] persons= [1145, 1146, 1147] +--- sas= [] onebeb_slice1141 crp= 1 +--- 'expires': 1167127150 +1143 None onebec_slice1142 nodes= [1142, 1143, 1144, 4142, 4143, 4144] persons= [1146, 1147, 1148] +--- sas= [] onebec_slice1142 crp= 1 +--- 'expires': 1167127151 +1144 None onebed_slice1143 nodes= [1143, 1144, 1145, 4143, 4144, 4145] persons= [1147, 1148, 1149] +--- sas= [] onebed_slice1143 crp= 1 +--- 'expires': 1167127151 +1145 None onebee_slice1144 nodes= [1144, 1145, 1146, 4144, 4145, 4146] persons= [1148, 1149, 1150] +--- sas= [] onebee_slice1144 crp= 1 +--- 'expires': 1167127151 +1146 None onebef_slice1145 nodes= [1145, 1146, 1147, 4145, 4146, 4147] persons= [1149, 1150, 1151] +--- sas= [] onebef_slice1145 crp= 1 +--- 'expires': 1167127152 +1147 None onebeg_slice1146 nodes= [1146, 1147, 1148, 4146, 4147, 4148] persons= [1150, 1151, 1152] +--- sas= [] onebeg_slice1146 crp= 1 +--- 'expires': 1167127152 +1148 None onebeh_slice1147 nodes= [1147, 1148, 1149, 4147, 4148, 4149] persons= [1151, 1152, 1153] +--- sas= [] onebeh_slice1147 crp= 1 +--- 'expires': 1167127152 +1149 None onebei_slice1148 nodes= [1148, 1149, 1150, 4148, 4149, 4150] persons= [1152, 1153, 1154] +--- sas= [] onebei_slice1148 crp= 1 +--- 'expires': 1167127153 +1150 None onebej_slice1149 nodes= [1149, 1150, 1151, 4149, 4150, 4151] persons= [1153, 1154, 1155] +--- sas= [] onebej_slice1149 crp= 1 +--- 'expires': 1167127153 +1151 None onebfa_slice1150 nodes= [1150, 1151, 1152, 4150, 4151, 4152] persons= [1154, 1155, 1156] +--- sas= [] onebfa_slice1150 crp= 1 +--- 'expires': 1167127153 +1152 None onebfb_slice1151 nodes= [1151, 1152, 1153, 4151, 4152, 4153] persons= [1155, 1156, 1157] +--- sas= [] onebfb_slice1151 crp= 1 +--- 'expires': 1167127154 +1153 None onebfc_slice1152 nodes= [1152, 1153, 1154, 4152, 4153, 4154] persons= [1156, 1157, 1158] +--- sas= [] onebfc_slice1152 crp= 1 +--- 'expires': 1167127154 +1154 None onebfd_slice1153 nodes= [1153, 1154, 1155, 4153, 4154, 4155] persons= [1157, 1158, 1159] +--- sas= [] onebfd_slice1153 crp= 1 +--- 'expires': 1167127155 +1155 None onebfe_slice1154 nodes= [1154, 1155, 1156, 4154, 4155, 4156] persons= [1158, 1159, 1160] +--- sas= [] onebfe_slice1154 crp= 1 +--- 'expires': 1167127155 +1156 None onebff_slice1155 nodes= [1155, 1156, 1157, 4155, 4156, 4157] persons= [1159, 1160, 1161] +--- sas= [] onebff_slice1155 crp= 1 +--- 'expires': 1167127155 +1157 None onebfg_slice1156 nodes= [1156, 1157, 1158, 4156, 4157, 4158] persons= [1160, 1161, 1162] +--- sas= [] onebfg_slice1156 crp= 1 +--- 'expires': 1167127156 +1158 None onebfh_slice1157 nodes= [1157, 1158, 1159, 4157, 4158, 4159] persons= [1161, 1162, 1163] +--- sas= [] onebfh_slice1157 crp= 1 +--- 'expires': 1167127156 +1159 None onebfi_slice1158 nodes= [1158, 1159, 1160, 4158, 4159, 4160] persons= [1162, 1163, 1164] +--- sas= [] onebfi_slice1158 crp= 1 +--- 'expires': 1167127156 +1160 None onebfj_slice1159 nodes= [1159, 1160, 1161, 4159, 4160, 4161] persons= [1163, 1164, 1165] +--- sas= [] onebfj_slice1159 crp= 1 +--- 'expires': 1167127157 +1161 None onebga_slice1160 nodes= [1160, 1161, 1162, 4160, 4161, 4162] persons= [1164, 1165, 1166] +--- sas= [] onebga_slice1160 crp= 1 +--- 'expires': 1167127157 +1162 None onebgb_slice1161 nodes= [1161, 1162, 1163, 4161, 4162, 4163] persons= [1165, 1166, 1167] +--- sas= [] onebgb_slice1161 crp= 1 +--- 'expires': 1167127157 +1163 None onebgc_slice1162 nodes= [1162, 1163, 1164, 4162, 4163, 4164] persons= [1166, 1167, 1168] +--- sas= [] onebgc_slice1162 crp= 1 +--- 'expires': 1167127158 +1164 None onebgd_slice1163 nodes= [1163, 1164, 1165, 4163, 4164, 4165] persons= [1167, 1168, 1169] +--- sas= [] onebgd_slice1163 crp= 1 +--- 'expires': 1167127158 +1165 None onebge_slice1164 nodes= [1164, 1165, 1166, 4164, 4165, 4166] persons= [1168, 1169, 1170] +--- sas= [] onebge_slice1164 crp= 1 +--- 'expires': 1167127159 +1166 None onebgf_slice1165 nodes= [1165, 1166, 1167, 4165, 4166, 4167] persons= [1169, 1170, 1171] +--- sas= [] onebgf_slice1165 crp= 1 +--- 'expires': 1167127159 +1167 None onebgg_slice1166 nodes= [1166, 1167, 1168, 4166, 4167, 4168] persons= [1170, 1171, 1172] +--- sas= [] onebgg_slice1166 crp= 1 +--- 'expires': 1167127159 +1168 None onebgh_slice1167 nodes= [1167, 1168, 1169, 4167, 4168, 4169] persons= [1171, 1172, 1173] +--- sas= [] onebgh_slice1167 crp= 1 +--- 'expires': 1167127160 +1169 None onebgi_slice1168 nodes= [1168, 1169, 1170, 4168, 4169, 4170] persons= [1172, 1173, 1174] +--- sas= [] onebgi_slice1168 crp= 1 +--- 'expires': 1167127160 +1170 None onebgj_slice1169 nodes= [1169, 1170, 1171, 4169, 4170, 4171] persons= [1173, 1174, 1175] +--- sas= [] onebgj_slice1169 crp= 1 +--- 'expires': 1167127161 +1171 None onebha_slice1170 nodes= [1170, 1171, 1172, 4170, 4171, 4172] persons= [1174, 1175, 1176] +--- sas= [] onebha_slice1170 crp= 1 +--- 'expires': 1167127161 +1172 None onebhb_slice1171 nodes= [1171, 1172, 1173, 4171, 4172, 4173] persons= [1175, 1176, 1177] +--- sas= [] onebhb_slice1171 crp= 1 +--- 'expires': 1167127161 +1173 None onebhc_slice1172 nodes= [1172, 1173, 1174, 4172, 4173, 4174] persons= [1176, 1177, 1178] +--- sas= [] onebhc_slice1172 crp= 1 +--- 'expires': 1167127162 +1174 None onebhd_slice1173 nodes= [1173, 1174, 1175, 4173, 4174, 4175] persons= [1177, 1178, 1179] +--- sas= [] onebhd_slice1173 crp= 1 +--- 'expires': 1167127162 +1175 None onebhe_slice1174 nodes= [1174, 1175, 1176, 4174, 4175, 4176] persons= [1178, 1179, 1180] +--- sas= [] onebhe_slice1174 crp= 1 +--- 'expires': 1167127163 +1176 None onebhf_slice1175 nodes= [1175, 1176, 1177, 4175, 4176, 4177] persons= [1179, 1180, 1181] +--- sas= [] onebhf_slice1175 crp= 1 +--- 'expires': 1167127163 +1177 None onebhg_slice1176 nodes= [1176, 1177, 1178, 4176, 4177, 4178] persons= [1180, 1181, 1182] +--- sas= [] onebhg_slice1176 crp= 1 +--- 'expires': 1167127163 +1178 None onebhh_slice1177 nodes= [1177, 1178, 1179, 4177, 4178, 4179] persons= [1181, 1182, 1183] +--- sas= [] onebhh_slice1177 crp= 1 +--- 'expires': 1167127164 +1179 None onebhi_slice1178 nodes= [1178, 1179, 1180, 4178, 4179, 4180] persons= [1182, 1183, 1184] +--- sas= [] onebhi_slice1178 crp= 1 +--- 'expires': 1167127164 +1180 None onebhj_slice1179 nodes= [1179, 1180, 1181, 4179, 4180, 4181] persons= [1183, 1184, 1185] +--- sas= [] onebhj_slice1179 crp= 1 +--- 'expires': 1167127165 +1181 None onebia_slice1180 nodes= [1180, 1181, 1182, 4180, 4181, 4182] persons= [1184, 1185, 1186] +--- sas= [] onebia_slice1180 crp= 1 +--- 'expires': 1167127165 +1182 None onebib_slice1181 nodes= [1181, 1182, 1183, 4181, 4182, 4183] persons= [1185, 1186, 1187] +--- sas= [] onebib_slice1181 crp= 1 +--- 'expires': 1167127165 +1183 None onebic_slice1182 nodes= [1182, 1183, 1184, 4182, 4183, 4184] persons= [1186, 1187, 1188] +--- sas= [] onebic_slice1182 crp= 1 +--- 'expires': 1167127166 +1184 None onebid_slice1183 nodes= [1183, 1184, 1185, 4183, 4184, 4185] persons= [1187, 1188, 1189] +--- sas= [] onebid_slice1183 crp= 1 +--- 'expires': 1167127166 +1185 None onebie_slice1184 nodes= [1184, 1185, 1186, 4184, 4185, 4186] persons= [1188, 1189, 1190] +--- sas= [] onebie_slice1184 crp= 1 +--- 'expires': 1167127167 +1186 None onebif_slice1185 nodes= [1185, 1186, 1187, 4185, 4186, 4187] persons= [1189, 1190, 1191] +--- sas= [] onebif_slice1185 crp= 1 +--- 'expires': 1167127167 +1187 None onebig_slice1186 nodes= [1186, 1187, 1188, 4186, 4187, 4188] persons= [1190, 1191, 1192] +--- sas= [] onebig_slice1186 crp= 1 +--- 'expires': 1167127167 +1188 None onebih_slice1187 nodes= [1187, 1188, 1189, 4187, 4188, 4189] persons= [1191, 1192, 1193] +--- sas= [] onebih_slice1187 crp= 1 +--- 'expires': 1167127168 +1189 None onebii_slice1188 nodes= [1188, 1189, 1190, 4188, 4189, 4190] persons= [1192, 1193, 1194] +--- sas= [] onebii_slice1188 crp= 1 +--- 'expires': 1167127168 +1190 None onebij_slice1189 nodes= [1189, 1190, 1191, 4189, 4190, 4191] persons= [1193, 1194, 1195] +--- sas= [] onebij_slice1189 crp= 1 +--- 'expires': 1167127169 +1191 None onebja_slice1190 nodes= [1190, 1191, 1192, 4190, 4191, 4192] persons= [1194, 1195, 1196] +--- sas= [] onebja_slice1190 crp= 1 +--- 'expires': 1167127169 +1192 None onebjb_slice1191 nodes= [1191, 1192, 1193, 4191, 4192, 4193] persons= [1195, 1196, 1197] +--- sas= [] onebjb_slice1191 crp= 1 +--- 'expires': 1167127169 +1193 None onebjc_slice1192 nodes= [1192, 1193, 1194, 4192, 4193, 4194] persons= [1196, 1197, 1198] +--- sas= [] onebjc_slice1192 crp= 1 +--- 'expires': 1167127170 +1194 None onebjd_slice1193 nodes= [1193, 1194, 1195, 4193, 4194, 4195] persons= [1197, 1198, 1199] +--- sas= [] onebjd_slice1193 crp= 1 +--- 'expires': 1167127170 +1195 None onebje_slice1194 nodes= [1194, 1195, 1196, 4194, 4195, 4196] persons= [1198, 1199, 1200] +--- sas= [] onebje_slice1194 crp= 1 +--- 'expires': 1167127171 +1196 None onebjf_slice1195 nodes= [1195, 1196, 1197, 4195, 4196, 4197] persons= [1199, 1200, 1201] +--- sas= [] onebjf_slice1195 crp= 1 +--- 'expires': 1167127171 +1197 None onebjg_slice1196 nodes= [1196, 1197, 1198, 4196, 4197, 4198] persons= [1200, 1201, 1202] +--- sas= [] onebjg_slice1196 crp= 1 +--- 'expires': 1167127171 +1198 None onebjh_slice1197 nodes= [1197, 1198, 1199, 4197, 4198, 4199] persons= [1201, 1202, 1203] +--- sas= [] onebjh_slice1197 crp= 1 +--- 'expires': 1167127172 +1199 None onebji_slice1198 nodes= [1198, 1199, 1200, 4198, 4199, 4200] persons= [1202, 1203, 1204] +--- sas= [] onebji_slice1198 crp= 1 +--- 'expires': 1167127172 +1200 None onebjj_slice1199 nodes= [1199, 1200, 1201, 4199, 4200, 4201] persons= [1203, 1204, 1205] +--- sas= [] onebjj_slice1199 crp= 1 +--- 'expires': 1167127173 +1201 None onecaa_slice1200 nodes= [1200, 1201, 1202, 4200, 4201, 4202] persons= [1204, 1205, 1206] +--- sas= [] onecaa_slice1200 crp= 1 +--- 'expires': 1167127173 +1202 None onecab_slice1201 nodes= [1201, 1202, 1203, 4201, 4202, 4203] persons= [1205, 1206, 1207] +--- sas= [] onecab_slice1201 crp= 1 +--- 'expires': 1167127173 +1203 None onecac_slice1202 nodes= [1202, 1203, 1204, 4202, 4203, 4204] persons= [1206, 1207, 1208] +--- sas= [] onecac_slice1202 crp= 1 +--- 'expires': 1167127174 +1204 None onecad_slice1203 nodes= [1203, 1204, 1205, 4203, 4204, 4205] persons= [1207, 1208, 1209] +--- sas= [] onecad_slice1203 crp= 1 +--- 'expires': 1167127174 +1205 None onecae_slice1204 nodes= [1204, 1205, 1206, 4204, 4205, 4206] persons= [1208, 1209, 1210] +--- sas= [] onecae_slice1204 crp= 1 +--- 'expires': 1167127175 +1206 None onecaf_slice1205 nodes= [1205, 1206, 1207, 4205, 4206, 4207] persons= [1209, 1210, 1211] +--- sas= [] onecaf_slice1205 crp= 1 +--- 'expires': 1167127175 +1207 None onecag_slice1206 nodes= [1206, 1207, 1208, 4206, 4207, 4208] persons= [1210, 1211, 1212] +--- sas= [] onecag_slice1206 crp= 1 +--- 'expires': 1167127175 +1208 None onecah_slice1207 nodes= [1207, 1208, 1209, 4207, 4208, 4209] persons= [1211, 1212, 1213] +--- sas= [] onecah_slice1207 crp= 1 +--- 'expires': 1167127176 +1209 None onecai_slice1208 nodes= [1208, 1209, 1210, 4208, 4209, 4210] persons= [1212, 1213, 1214] +--- sas= [] onecai_slice1208 crp= 1 +--- 'expires': 1167127176 +1210 None onecaj_slice1209 nodes= [1209, 1210, 1211, 4209, 4210, 4211] persons= [1213, 1214, 1215] +--- sas= [] onecaj_slice1209 crp= 1 +--- 'expires': 1167127177 +1211 None onecba_slice1210 nodes= [1210, 1211, 1212, 4210, 4211, 4212] persons= [1214, 1215, 1216] +--- sas= [] onecba_slice1210 crp= 1 +--- 'expires': 1167127177 +1212 None onecbb_slice1211 nodes= [1211, 1212, 1213, 4211, 4212, 4213] persons= [1215, 1216, 1217] +--- sas= [] onecbb_slice1211 crp= 1 +--- 'expires': 1167127177 +1213 None onecbc_slice1212 nodes= [1212, 1213, 1214, 4212, 4213, 4214] persons= [1216, 1217, 1218] +--- sas= [] onecbc_slice1212 crp= 1 +--- 'expires': 1167127178 +1214 None onecbd_slice1213 nodes= [1213, 1214, 1215, 4213, 4214, 4215] persons= [1217, 1218, 1219] +--- sas= [] onecbd_slice1213 crp= 1 +--- 'expires': 1167127178 +1215 None onecbe_slice1214 nodes= [1214, 1215, 1216, 4214, 4215, 4216] persons= [1218, 1219, 1220] +--- sas= [] onecbe_slice1214 crp= 1 +--- 'expires': 1167127179 +1216 None onecbf_slice1215 nodes= [1215, 1216, 1217, 4215, 4216, 4217] persons= [1219, 1220, 1221] +--- sas= [] onecbf_slice1215 crp= 1 +--- 'expires': 1167127179 +1217 None onecbg_slice1216 nodes= [1216, 1217, 1218, 4216, 4217, 4218] persons= [1220, 1221, 1222] +--- sas= [] onecbg_slice1216 crp= 1 +--- 'expires': 1167127179 +1218 None onecbh_slice1217 nodes= [1217, 1218, 1219, 4217, 4218, 4219] persons= [1221, 1222, 1223] +--- sas= [] onecbh_slice1217 crp= 1 +--- 'expires': 1167127180 +1219 None onecbi_slice1218 nodes= [1218, 1219, 1220, 4218, 4219, 4220] persons= [1222, 1223, 1224] +--- sas= [] onecbi_slice1218 crp= 1 +--- 'expires': 1167127180 +1220 None onecbj_slice1219 nodes= [1219, 1220, 1221, 4219, 4220, 4221] persons= [1223, 1224, 1225] +--- sas= [] onecbj_slice1219 crp= 1 +--- 'expires': 1167127181 +1221 None onecca_slice1220 nodes= [1220, 1221, 1222, 4220, 4221, 4222] persons= [1224, 1225, 1226] +--- sas= [] onecca_slice1220 crp= 1 +--- 'expires': 1167127181 +1222 None oneccb_slice1221 nodes= [1221, 1222, 1223, 4221, 4222, 4223] persons= [1225, 1226, 1227] +--- sas= [] oneccb_slice1221 crp= 1 +--- 'expires': 1167127182 +1223 None oneccc_slice1222 nodes= [1222, 1223, 1224, 4222, 4223, 4224] persons= [1226, 1227, 1228] +--- sas= [] oneccc_slice1222 crp= 1 +--- 'expires': 1167127182 +1224 None oneccd_slice1223 nodes= [1223, 1224, 1225, 4223, 4224, 4225] persons= [1227, 1228, 1229] +--- sas= [] oneccd_slice1223 crp= 1 +--- 'expires': 1167127182 +1225 None onecce_slice1224 nodes= [1224, 1225, 1226, 4224, 4225, 4226] persons= [1228, 1229, 1230] +--- sas= [] onecce_slice1224 crp= 1 +--- 'expires': 1167127183 +1226 None oneccf_slice1225 nodes= [1225, 1226, 1227, 4225, 4226, 4227] persons= [1229, 1230, 1231] +--- sas= [] oneccf_slice1225 crp= 1 +--- 'expires': 1167127183 +1227 None oneccg_slice1226 nodes= [1226, 1227, 1228, 4226, 4227, 4228] persons= [1230, 1231, 1232] +--- sas= [] oneccg_slice1226 crp= 1 +--- 'expires': 1167127184 +1228 None onecch_slice1227 nodes= [1227, 1228, 1229, 4227, 4228, 4229] persons= [1231, 1232, 1233] +--- sas= [] onecch_slice1227 crp= 1 +--- 'expires': 1167127184 +1229 None onecci_slice1228 nodes= [1228, 1229, 1230, 4228, 4229, 4230] persons= [1232, 1233, 1234] +--- sas= [] onecci_slice1228 crp= 1 +--- 'expires': 1167127184 +1230 None oneccj_slice1229 nodes= [1229, 1230, 1231, 4229, 4230, 4231] persons= [1233, 1234, 1235] +--- sas= [] oneccj_slice1229 crp= 1 +--- 'expires': 1167127185 +1231 None onecda_slice1230 nodes= [1230, 1231, 1232, 4230, 4231, 4232] persons= [1234, 1235, 1236] +--- sas= [] onecda_slice1230 crp= 1 +--- 'expires': 1167127185 +1232 None onecdb_slice1231 nodes= [1231, 1232, 1233, 4231, 4232, 4233] persons= [1235, 1236, 1237] +--- sas= [] onecdb_slice1231 crp= 1 +--- 'expires': 1167127186 +1233 None onecdc_slice1232 nodes= [1232, 1233, 1234, 4232, 4233, 4234] persons= [1236, 1237, 1238] +--- sas= [] onecdc_slice1232 crp= 1 +--- 'expires': 1167127186 +1234 None onecdd_slice1233 nodes= [1233, 1234, 1235, 4233, 4234, 4235] persons= [1237, 1238, 1239] +--- sas= [] onecdd_slice1233 crp= 1 +--- 'expires': 1167127186 +1235 None onecde_slice1234 nodes= [1234, 1235, 1236, 4234, 4235, 4236] persons= [1238, 1239, 1240] +--- sas= [] onecde_slice1234 crp= 1 +--- 'expires': 1167127187 +1236 None onecdf_slice1235 nodes= [1235, 1236, 1237, 4235, 4236, 4237] persons= [1239, 1240, 1241] +--- sas= [] onecdf_slice1235 crp= 1 +--- 'expires': 1167127187 +1237 None onecdg_slice1236 nodes= [1236, 1237, 1238, 4236, 4237, 4238] persons= [1240, 1241, 1242] +--- sas= [] onecdg_slice1236 crp= 1 +--- 'expires': 1167127188 +1238 None onecdh_slice1237 nodes= [1237, 1238, 1239, 4237, 4238, 4239] persons= [1241, 1242, 1243] +--- sas= [] onecdh_slice1237 crp= 1 +--- 'expires': 1167127188 +1239 None onecdi_slice1238 nodes= [1238, 1239, 1240, 4238, 4239, 4240] persons= [1242, 1243, 1244] +--- sas= [] onecdi_slice1238 crp= 1 +--- 'expires': 1167127188 +1240 None onecdj_slice1239 nodes= [1239, 1240, 1241, 4239, 4240, 4241] persons= [1243, 1244, 1245] +--- sas= [] onecdj_slice1239 crp= 1 +--- 'expires': 1167127189 +1241 None onecea_slice1240 nodes= [1240, 1241, 1242, 4240, 4241, 4242] persons= [1244, 1245, 1246] +--- sas= [] onecea_slice1240 crp= 1 +--- 'expires': 1167127189 +1242 None oneceb_slice1241 nodes= [1241, 1242, 1243, 4241, 4242, 4243] persons= [1245, 1246, 1247] +--- sas= [] oneceb_slice1241 crp= 1 +--- 'expires': 1167127190 +1243 None onecec_slice1242 nodes= [1242, 1243, 1244, 4242, 4243, 4244] persons= [1246, 1247, 1248] +--- sas= [] onecec_slice1242 crp= 1 +--- 'expires': 1167127190 +1244 None oneced_slice1243 nodes= [1243, 1244, 1245, 4243, 4244, 4245] persons= [1247, 1248, 1249] +--- sas= [] oneced_slice1243 crp= 1 +--- 'expires': 1167127190 +1245 None onecee_slice1244 nodes= [1244, 1245, 1246, 4244, 4245, 4246] persons= [1248, 1249, 1250] +--- sas= [] onecee_slice1244 crp= 1 +--- 'expires': 1167127191 +1246 None onecef_slice1245 nodes= [1245, 1246, 1247, 4245, 4246, 4247] persons= [1249, 1250, 1251] +--- sas= [] onecef_slice1245 crp= 1 +--- 'expires': 1167127191 +1247 None oneceg_slice1246 nodes= [1246, 1247, 1248, 4246, 4247, 4248] persons= [1250, 1251, 1252] +--- sas= [] oneceg_slice1246 crp= 1 +--- 'expires': 1167127192 +1248 None oneceh_slice1247 nodes= [1247, 1248, 1249, 4247, 4248, 4249] persons= [1251, 1252, 1253] +--- sas= [] oneceh_slice1247 crp= 1 +--- 'expires': 1167127192 +1249 None onecei_slice1248 nodes= [1248, 1249, 1250, 4248, 4249, 4250] persons= [1252, 1253, 1254] +--- sas= [] onecei_slice1248 crp= 1 +--- 'expires': 1167127193 +1250 None onecej_slice1249 nodes= [1249, 1250, 1251, 4249, 4250, 4251] persons= [1253, 1254, 1255] +--- sas= [] onecej_slice1249 crp= 1 +--- 'expires': 1167127193 +1251 None onecfa_slice1250 nodes= [1250, 1251, 1252, 4250, 4251, 4252] persons= [1254, 1255, 1256] +--- sas= [] onecfa_slice1250 crp= 1 +--- 'expires': 1167127193 +1252 None onecfb_slice1251 nodes= [1251, 1252, 1253, 4251, 4252, 4253] persons= [1255, 1256, 1257] +--- sas= [] onecfb_slice1251 crp= 1 +--- 'expires': 1167127194 +1253 None onecfc_slice1252 nodes= [1252, 1253, 1254, 4252, 4253, 4254] persons= [1256, 1257, 1258] +--- sas= [] onecfc_slice1252 crp= 1 +--- 'expires': 1167127194 +1254 None onecfd_slice1253 nodes= [1253, 1254, 1255, 4253, 4254, 4255] persons= [1257, 1258, 1259] +--- sas= [] onecfd_slice1253 crp= 1 +--- 'expires': 1167127195 +1255 None onecfe_slice1254 nodes= [1254, 1255, 1256, 4254, 4255, 4256] persons= [1258, 1259, 1260] +--- sas= [] onecfe_slice1254 crp= 1 +--- 'expires': 1167127195 +1256 None onecff_slice1255 nodes= [1255, 1256, 1257, 4255, 4256, 4257] persons= [1259, 1260, 1261] +--- sas= [] onecff_slice1255 crp= 1 +--- 'expires': 1167127195 +1257 None onecfg_slice1256 nodes= [1256, 1257, 1258, 4256, 4257, 4258] persons= [1260, 1261, 1262] +--- sas= [] onecfg_slice1256 crp= 1 +--- 'expires': 1167127196 +1258 None onecfh_slice1257 nodes= [1257, 1258, 1259, 4257, 4258, 4259] persons= [1261, 1262, 1263] +--- sas= [] onecfh_slice1257 crp= 1 +--- 'expires': 1167127196 +1259 None onecfi_slice1258 nodes= [1258, 1259, 1260, 4258, 4259, 4260] persons= [1262, 1263, 1264] +--- sas= [] onecfi_slice1258 crp= 1 +--- 'expires': 1167127197 +1260 None onecfj_slice1259 nodes= [1259, 1260, 1261, 4259, 4260, 4261] persons= [1263, 1264, 1265] +--- sas= [] onecfj_slice1259 crp= 1 +--- 'expires': 1167127197 +1261 None onecga_slice1260 nodes= [1260, 1261, 1262, 4260, 4261, 4262] persons= [1264, 1265, 1266] +--- sas= [] onecga_slice1260 crp= 1 +--- 'expires': 1167127197 +1262 None onecgb_slice1261 nodes= [1261, 1262, 1263, 4261, 4262, 4263] persons= [1265, 1266, 1267] +--- sas= [] onecgb_slice1261 crp= 1 +--- 'expires': 1167127198 +1263 None onecgc_slice1262 nodes= [1262, 1263, 1264, 4262, 4263, 4264] persons= [1266, 1267, 1268] +--- sas= [] onecgc_slice1262 crp= 1 +--- 'expires': 1167127198 +1264 None onecgd_slice1263 nodes= [1263, 1264, 1265, 4263, 4264, 4265] persons= [1267, 1268, 1269] +--- sas= [] onecgd_slice1263 crp= 1 +--- 'expires': 1167127199 +1265 None onecge_slice1264 nodes= [1264, 1265, 1266, 4264, 4265, 4266] persons= [1268, 1269, 1270] +--- sas= [] onecge_slice1264 crp= 1 +--- 'expires': 1167127199 +1266 None onecgf_slice1265 nodes= [1265, 1266, 1267, 4265, 4266, 4267] persons= [1269, 1270, 1271] +--- sas= [] onecgf_slice1265 crp= 1 +--- 'expires': 1167127200 +1267 None onecgg_slice1266 nodes= [1266, 1267, 1268, 4266, 4267, 4268] persons= [1270, 1271, 1272] +--- sas= [] onecgg_slice1266 crp= 1 +--- 'expires': 1167127200 +1268 None onecgh_slice1267 nodes= [1267, 1268, 1269, 4267, 4268, 4269] persons= [1271, 1272, 1273] +--- sas= [] onecgh_slice1267 crp= 1 +--- 'expires': 1167127200 +1269 None onecgi_slice1268 nodes= [1268, 1269, 1270, 4268, 4269, 4270] persons= [1272, 1273, 1274] +--- sas= [] onecgi_slice1268 crp= 1 +--- 'expires': 1167127201 +1270 None onecgj_slice1269 nodes= [1269, 1270, 1271, 4269, 4270, 4271] persons= [1273, 1274, 1275] +--- sas= [] onecgj_slice1269 crp= 1 +--- 'expires': 1167127201 +1271 None onecha_slice1270 nodes= [1270, 1271, 1272, 4270, 4271, 4272] persons= [1274, 1275, 1276] +--- sas= [] onecha_slice1270 crp= 1 +--- 'expires': 1167127202 +1272 None onechb_slice1271 nodes= [1271, 1272, 1273, 4271, 4272, 4273] persons= [1275, 1276, 1277] +--- sas= [] onechb_slice1271 crp= 1 +--- 'expires': 1167127210 +1273 None onechc_slice1272 nodes= [1272, 1273, 1274, 4272, 4273, 4274] persons= [1276, 1277, 1278] +--- sas= [] onechc_slice1272 crp= 1 +--- 'expires': 1167127211 +1274 None onechd_slice1273 nodes= [1273, 1274, 1275, 4273, 4274, 4275] persons= [1277, 1278, 1279] +--- sas= [] onechd_slice1273 crp= 1 +--- 'expires': 1167127214 +1275 None oneche_slice1274 nodes= [1274, 1275, 1276, 4274, 4275, 4276] persons= [1278, 1279, 1280] +--- sas= [] oneche_slice1274 crp= 1 +--- 'expires': 1167127216 +1276 None onechf_slice1275 nodes= [1275, 1276, 1277, 4275, 4276, 4277] persons= [1279, 1280, 1281] +--- sas= [] onechf_slice1275 crp= 1 +--- 'expires': 1167127217 +1277 None onechg_slice1276 nodes= [1276, 1277, 1278, 4276, 4277, 4278] persons= [1280, 1281, 1282] +--- sas= [] onechg_slice1276 crp= 1 +--- 'expires': 1167127219 +1278 None onechh_slice1277 nodes= [1277, 1278, 1279, 4277, 4278, 4279] persons= [1281, 1282, 1283] +--- sas= [] onechh_slice1277 crp= 1 +--- 'expires': 1167127220 +1279 None onechi_slice1278 nodes= [1278, 1279, 1280, 4278, 4279, 4280] persons= [1282, 1283, 1284] +--- sas= [] onechi_slice1278 crp= 1 +--- 'expires': 1167127222 +1280 None onechj_slice1279 nodes= [1279, 1280, 1281, 4279, 4280, 4281] persons= [1283, 1284, 1285] +--- sas= [] onechj_slice1279 crp= 1 +--- 'expires': 1167127223 +1281 None onecia_slice1280 nodes= [1280, 1281, 1282, 4280, 4281, 4282] persons= [1284, 1285, 1286] +--- sas= [] onecia_slice1280 crp= 1 +--- 'expires': 1167127224 +1282 None onecib_slice1281 nodes= [1281, 1282, 1283, 4281, 4282, 4283] persons= [1285, 1286, 1287] +--- sas= [] onecib_slice1281 crp= 1 +--- 'expires': 1167127226 +1283 None onecic_slice1282 nodes= [1282, 1283, 1284, 4282, 4283, 4284] persons= [1286, 1287, 1288] +--- sas= [] onecic_slice1282 crp= 1 +--- 'expires': 1167127227 +1284 None onecid_slice1283 nodes= [1283, 1284, 1285, 4283, 4284, 4285] persons= [1287, 1288, 1289] +--- sas= [] onecid_slice1283 crp= 1 +--- 'expires': 1167127229 +1285 None onecie_slice1284 nodes= [1284, 1285, 1286, 4284, 4285, 4286] persons= [1288, 1289, 1290] +--- sas= [] onecie_slice1284 crp= 1 +--- 'expires': 1167127230 +1286 None onecif_slice1285 nodes= [1285, 1286, 1287, 4285, 4286, 4287] persons= [1289, 1290, 1291] +--- sas= [] onecif_slice1285 crp= 1 +--- 'expires': 1167127231 +1287 None onecig_slice1286 nodes= [1286, 1287, 1288, 4286, 4287, 4288] persons= [1290, 1291, 1292] +--- sas= [] onecig_slice1286 crp= 1 +--- 'expires': 1167127233 +1288 None onecih_slice1287 nodes= [1287, 1288, 1289, 4287, 4288, 4289] persons= [1291, 1292, 1293] +--- sas= [] onecih_slice1287 crp= 1 +--- 'expires': 1167127234 +1289 None onecii_slice1288 nodes= [1288, 1289, 1290, 4288, 4289, 4290] persons= [1292, 1293, 1294] +--- sas= [] onecii_slice1288 crp= 1 +--- 'expires': 1167127235 +1290 None onecij_slice1289 nodes= [1289, 1290, 1291, 4289, 4290, 4291] persons= [1293, 1294, 1295] +--- sas= [] onecij_slice1289 crp= 1 +--- 'expires': 1167127237 +1291 None onecja_slice1290 nodes= [1290, 1291, 1292, 4290, 4291, 4292] persons= [1294, 1295, 1296] +--- sas= [] onecja_slice1290 crp= 1 +--- 'expires': 1167127239 +1292 None onecjb_slice1291 nodes= [1291, 1292, 1293, 4291, 4292, 4293] persons= [1295, 1296, 1297] +--- sas= [] onecjb_slice1291 crp= 1 +--- 'expires': 1167127240 +1293 None onecjc_slice1292 nodes= [1292, 1293, 1294, 4292, 4293, 4294] persons= [1296, 1297, 1298] +--- sas= [] onecjc_slice1292 crp= 1 +--- 'expires': 1167127241 +1294 None onecjd_slice1293 nodes= [1293, 1294, 1295, 4293, 4294, 4295] persons= [1297, 1298, 1299] +--- sas= [] onecjd_slice1293 crp= 1 +--- 'expires': 1167127243 +1295 None onecje_slice1294 nodes= [1294, 1295, 1296, 4294, 4295, 4296] persons= [1298, 1299, 1300] +--- sas= [] onecje_slice1294 crp= 1 +--- 'expires': 1167127244 +1296 None onecjf_slice1295 nodes= [1295, 1296, 1297, 4295, 4296, 4297] persons= [1299, 1300, 1301] +--- sas= [] onecjf_slice1295 crp= 1 +--- 'expires': 1167127245 +1297 None onecjg_slice1296 nodes= [1296, 1297, 1298, 4296, 4297, 4298] persons= [1300, 1301, 1302] +--- sas= [] onecjg_slice1296 crp= 1 +--- 'expires': 1167127247 +1298 None onecjh_slice1297 nodes= [1297, 1298, 1299, 4297, 4298, 4299] persons= [1301, 1302, 1303] +--- sas= [] onecjh_slice1297 crp= 1 +--- 'expires': 1167127248 +1299 None onecji_slice1298 nodes= [1298, 1299, 1300, 4298, 4299, 4300] persons= [1302, 1303, 1304] +--- sas= [] onecji_slice1298 crp= 1 +--- 'expires': 1167127250 +1300 None onecjj_slice1299 nodes= [1299, 1300, 1301, 4299, 4300, 4301] persons= [1303, 1304, 1305] +--- sas= [] onecjj_slice1299 crp= 1 +--- 'expires': 1167127251 +1301 None onedaa_slice1300 nodes= [1300, 1301, 1302, 4300, 4301, 4302] persons= [1304, 1305, 1306] +--- sas= [] onedaa_slice1300 crp= 1 +--- 'expires': 1167127253 +1302 None onedab_slice1301 nodes= [1301, 1302, 1303, 4301, 4302, 4303] persons= [1305, 1306, 1307] +--- sas= [] onedab_slice1301 crp= 1 +--- 'expires': 1167127254 +1303 None onedac_slice1302 nodes= [1302, 1303, 1304, 4302, 4303, 4304] persons= [1306, 1307, 1308] +--- sas= [] onedac_slice1302 crp= 1 +--- 'expires': 1167127256 +1304 None onedad_slice1303 nodes= [1303, 1304, 1305, 4303, 4304, 4305] persons= [1307, 1308, 1309] +--- sas= [] onedad_slice1303 crp= 1 +--- 'expires': 1167127257 +1305 None onedae_slice1304 nodes= [1304, 1305, 1306, 4304, 4305, 4306] persons= [1308, 1309, 1310] +--- sas= [] onedae_slice1304 crp= 1 +--- 'expires': 1167127259 +1306 None onedaf_slice1305 nodes= [1305, 1306, 1307, 4305, 4306, 4307] persons= [1309, 1310, 1311] +--- sas= [] onedaf_slice1305 crp= 1 +--- 'expires': 1167127260 +1307 None onedag_slice1306 nodes= [1306, 1307, 1308, 4306, 4307, 4308] persons= [1310, 1311, 1312] +--- sas= [] onedag_slice1306 crp= 1 +--- 'expires': 1167127262 +1308 None onedah_slice1307 nodes= [1307, 1308, 1309, 4307, 4308, 4309] persons= [1311, 1312, 1313] +--- sas= [] onedah_slice1307 crp= 1 +--- 'expires': 1167127263 +1309 None onedai_slice1308 nodes= [1308, 1309, 1310, 4308, 4309, 4310] persons= [1312, 1313, 1314] +--- sas= [] onedai_slice1308 crp= 1 +--- 'expires': 1167127264 +1310 None onedaj_slice1309 nodes= [1309, 1310, 1311, 4309, 4310, 4311] persons= [1313, 1314, 1315] +--- sas= [] onedaj_slice1309 crp= 1 +--- 'expires': 1167127266 +1311 None onedba_slice1310 nodes= [1310, 1311, 1312, 4310, 4311, 4312] persons= [1314, 1315, 1316] +--- sas= [] onedba_slice1310 crp= 1 +--- 'expires': 1167127267 +1312 None onedbb_slice1311 nodes= [1311, 1312, 1313, 4311, 4312, 4313] persons= [1315, 1316, 1317] +--- sas= [] onedbb_slice1311 crp= 1 +--- 'expires': 1167127269 +1313 None onedbc_slice1312 nodes= [1312, 1313, 1314, 4312, 4313, 4314] persons= [1316, 1317, 1318] +--- sas= [] onedbc_slice1312 crp= 1 +--- 'expires': 1167127270 +1314 None onedbd_slice1313 nodes= [1313, 1314, 1315, 4313, 4314, 4315] persons= [1317, 1318, 1319] +--- sas= [] onedbd_slice1313 crp= 1 +--- 'expires': 1167127271 +1315 None onedbe_slice1314 nodes= [1314, 1315, 1316, 4314, 4315, 4316] persons= [1318, 1319, 1320] +--- sas= [] onedbe_slice1314 crp= 1 +--- 'expires': 1167127273 +1316 None onedbf_slice1315 nodes= [1315, 1316, 1317, 4315, 4316, 4317] persons= [1319, 1320, 1321] +--- sas= [] onedbf_slice1315 crp= 1 +--- 'expires': 1167127274 +1317 None onedbg_slice1316 nodes= [1316, 1317, 1318, 4316, 4317, 4318] persons= [1320, 1321, 1322] +--- sas= [] onedbg_slice1316 crp= 1 +--- 'expires': 1167127276 +1318 None onedbh_slice1317 nodes= [1317, 1318, 1319, 4317, 4318, 4319] persons= [1321, 1322, 1323] +--- sas= [] onedbh_slice1317 crp= 1 +--- 'expires': 1167127277 +1319 None onedbi_slice1318 nodes= [1318, 1319, 1320, 4318, 4319, 4320] persons= [1322, 1323, 1324] +--- sas= [] onedbi_slice1318 crp= 1 +--- 'expires': 1167127278 +1320 None onedbj_slice1319 nodes= [1319, 1320, 1321, 4319, 4320, 4321] persons= [1323, 1324, 1325] +--- sas= [] onedbj_slice1319 crp= 1 +--- 'expires': 1167127280 +1321 None onedca_slice1320 nodes= [1320, 1321, 1322, 4320, 4321, 4322] persons= [1324, 1325, 1326] +--- sas= [] onedca_slice1320 crp= 1 +--- 'expires': 1167127281 +1322 None onedcb_slice1321 nodes= [1321, 1322, 1323, 4321, 4322, 4323] persons= [1325, 1326, 1327] +--- sas= [] onedcb_slice1321 crp= 1 +--- 'expires': 1167127283 +1323 None onedcc_slice1322 nodes= [1322, 1323, 1324, 4322, 4323, 4324] persons= [1326, 1327, 1328] +--- sas= [] onedcc_slice1322 crp= 1 +--- 'expires': 1167127284 +1324 None onedcd_slice1323 nodes= [1323, 1324, 1325, 4323, 4324, 4325] persons= [1327, 1328, 1329] +--- sas= [] onedcd_slice1323 crp= 1 +--- 'expires': 1167127285 +1325 None onedce_slice1324 nodes= [1324, 1325, 1326, 4324, 4325, 4326] persons= [1328, 1329, 1330] +--- sas= [] onedce_slice1324 crp= 1 +--- 'expires': 1167127287 +1326 None onedcf_slice1325 nodes= [1325, 1326, 1327, 4325, 4326, 4327] persons= [1329, 1330, 1331] +--- sas= [] onedcf_slice1325 crp= 1 +--- 'expires': 1167127288 +1327 None onedcg_slice1326 nodes= [1326, 1327, 1328, 4326, 4327, 4328] persons= [1330, 1331, 1332] +--- sas= [] onedcg_slice1326 crp= 1 +--- 'expires': 1167127290 +1328 None onedch_slice1327 nodes= [1327, 1328, 1329, 4327, 4328, 4329] persons= [1331, 1332, 1333] +--- sas= [] onedch_slice1327 crp= 1 +--- 'expires': 1167127291 +1329 None onedci_slice1328 nodes= [1328, 1329, 1330, 4328, 4329, 4330] persons= [1332, 1333, 1334] +--- sas= [] onedci_slice1328 crp= 1 +--- 'expires': 1167127293 +1330 None onedcj_slice1329 nodes= [1329, 1330, 1331, 4329, 4330, 4331] persons= [1333, 1334, 1335] +--- sas= [] onedcj_slice1329 crp= 1 +--- 'expires': 1167127294 +1331 None onedda_slice1330 nodes= [1330, 1331, 1332, 4330, 4331, 4332] persons= [1334, 1335, 1336] +--- sas= [] onedda_slice1330 crp= 1 +--- 'expires': 1167127296 +1332 None oneddb_slice1331 nodes= [1331, 1332, 1333, 4331, 4332, 4333] persons= [1335, 1336, 1337] +--- sas= [] oneddb_slice1331 crp= 1 +--- 'expires': 1167127297 +1333 None oneddc_slice1332 nodes= [1332, 1333, 1334, 4332, 4333, 4334] persons= [1336, 1337, 1338] +--- sas= [] oneddc_slice1332 crp= 1 +--- 'expires': 1167127298 +1334 None oneddd_slice1333 nodes= [1333, 1334, 1335, 4333, 4334, 4335] persons= [1337, 1338, 1339] +--- sas= [] oneddd_slice1333 crp= 1 +--- 'expires': 1167127300 +1335 None onedde_slice1334 nodes= [1334, 1335, 1336, 4334, 4335, 4336] persons= [1338, 1339, 1340] +--- sas= [] onedde_slice1334 crp= 1 +--- 'expires': 1167127301 +1336 None oneddf_slice1335 nodes= [1335, 1336, 1337, 4335, 4336, 4337] persons= [1339, 1340, 1341] +--- sas= [] oneddf_slice1335 crp= 1 +--- 'expires': 1167127303 +1337 None oneddg_slice1336 nodes= [1336, 1337, 1338, 4336, 4337, 4338] persons= [1340, 1341, 1342] +--- sas= [] oneddg_slice1336 crp= 1 +--- 'expires': 1167127304 +1338 None oneddh_slice1337 nodes= [1337, 1338, 1339, 4337, 4338, 4339] persons= [1341, 1342, 1343] +--- sas= [] oneddh_slice1337 crp= 1 +--- 'expires': 1167127305 +1339 None oneddi_slice1338 nodes= [1338, 1339, 1340, 4338, 4339, 4340] persons= [1342, 1343, 1344] +--- sas= [] oneddi_slice1338 crp= 1 +--- 'expires': 1167127307 +1340 None oneddj_slice1339 nodes= [1339, 1340, 1341, 4339, 4340, 4341] persons= [1343, 1344, 1345] +--- sas= [] oneddj_slice1339 crp= 1 +--- 'expires': 1167127308 +1341 None onedea_slice1340 nodes= [1340, 1341, 1342, 4340, 4341, 4342] persons= [1344, 1345, 1346] +--- sas= [] onedea_slice1340 crp= 1 +--- 'expires': 1167127310 +1342 None onedeb_slice1341 nodes= [1341, 1342, 1343, 4341, 4342, 4343] persons= [1345, 1346, 1347] +--- sas= [] onedeb_slice1341 crp= 1 +--- 'expires': 1167127311 +1343 None onedec_slice1342 nodes= [1342, 1343, 1344, 4342, 4343, 4344] persons= [1346, 1347, 1348] +--- sas= [] onedec_slice1342 crp= 1 +--- 'expires': 1167127313 +1344 None oneded_slice1343 nodes= [1343, 1344, 1345, 4343, 4344, 4345] persons= [1347, 1348, 1349] +--- sas= [] oneded_slice1343 crp= 1 +--- 'expires': 1167127314 +1345 None onedee_slice1344 nodes= [1344, 1345, 1346, 4344, 4345, 4346] persons= [1348, 1349, 1350] +--- sas= [] onedee_slice1344 crp= 1 +--- 'expires': 1167127315 +1346 None onedef_slice1345 nodes= [1345, 1346, 1347, 4345, 4346, 4347] persons= [1349, 1350, 1351] +--- sas= [] onedef_slice1345 crp= 1 +--- 'expires': 1167127317 +1347 None onedeg_slice1346 nodes= [1346, 1347, 1348, 4346, 4347, 4348] persons= [1350, 1351, 1352] +--- sas= [] onedeg_slice1346 crp= 1 +--- 'expires': 1167127318 +1348 None onedeh_slice1347 nodes= [1347, 1348, 1349, 4347, 4348, 4349] persons= [1351, 1352, 1353] +--- sas= [] onedeh_slice1347 crp= 1 +--- 'expires': 1167127320 +1349 None onedei_slice1348 nodes= [1348, 1349, 1350, 4348, 4349, 4350] persons= [1352, 1353, 1354] +--- sas= [] onedei_slice1348 crp= 1 +--- 'expires': 1167127321 +1350 None onedej_slice1349 nodes= [1349, 1350, 1351, 4349, 4350, 4351] persons= [1353, 1354, 1355] +--- sas= [] onedej_slice1349 crp= 1 +--- 'expires': 1167127323 +1351 None onedfa_slice1350 nodes= [1350, 1351, 1352, 4350, 4351, 4352] persons= [1354, 1355, 1356] +--- sas= [] onedfa_slice1350 crp= 1 +--- 'expires': 1167127324 +1352 None onedfb_slice1351 nodes= [1351, 1352, 1353, 4351, 4352, 4353] persons= [1355, 1356, 1357] +--- sas= [] onedfb_slice1351 crp= 1 +--- 'expires': 1167127325 +1353 None onedfc_slice1352 nodes= [1352, 1353, 1354, 4352, 4353, 4354] persons= [1356, 1357, 1358] +--- sas= [] onedfc_slice1352 crp= 1 +--- 'expires': 1167127327 +1354 None onedfd_slice1353 nodes= [1353, 1354, 1355, 4353, 4354, 4355] persons= [1357, 1358, 1359] +--- sas= [] onedfd_slice1353 crp= 1 +--- 'expires': 1167127328 +1355 None onedfe_slice1354 nodes= [1354, 1355, 1356, 4354, 4355, 4356] persons= [1358, 1359, 1360] +--- sas= [] onedfe_slice1354 crp= 1 +--- 'expires': 1167127330 +1356 None onedff_slice1355 nodes= [1355, 1356, 1357, 4355, 4356, 4357] persons= [1359, 1360, 1361] +--- sas= [] onedff_slice1355 crp= 1 +--- 'expires': 1167127331 +1357 None onedfg_slice1356 nodes= [1356, 1357, 1358, 4356, 4357, 4358] persons= [1360, 1361, 1362] +--- sas= [] onedfg_slice1356 crp= 1 +--- 'expires': 1167127332 +1358 None onedfh_slice1357 nodes= [1357, 1358, 1359, 4357, 4358, 4359] persons= [1361, 1362, 1363] +--- sas= [] onedfh_slice1357 crp= 1 +--- 'expires': 1167127334 +1359 None onedfi_slice1358 nodes= [1358, 1359, 1360, 4358, 4359, 4360] persons= [1362, 1363, 1364] +--- sas= [] onedfi_slice1358 crp= 1 +--- 'expires': 1167127335 +1360 None onedfj_slice1359 nodes= [1359, 1360, 1361, 4359, 4360, 4361] persons= [1363, 1364, 1365] +--- sas= [] onedfj_slice1359 crp= 1 +--- 'expires': 1167127337 +1361 None onedga_slice1360 nodes= [1360, 1361, 1362, 4360, 4361, 4362] persons= [1364, 1365, 1366] +--- sas= [] onedga_slice1360 crp= 1 +--- 'expires': 1167127338 +1362 None onedgb_slice1361 nodes= [1361, 1362, 1363, 4361, 4362, 4363] persons= [1365, 1366, 1367] +--- sas= [] onedgb_slice1361 crp= 1 +--- 'expires': 1167127340 +1363 None onedgc_slice1362 nodes= [1362, 1363, 1364, 4362, 4363, 4364] persons= [1366, 1367, 1368] +--- sas= [] onedgc_slice1362 crp= 1 +--- 'expires': 1167127341 +1364 None onedgd_slice1363 nodes= [1363, 1364, 1365, 4363, 4364, 4365] persons= [1367, 1368, 1369] +--- sas= [] onedgd_slice1363 crp= 1 +--- 'expires': 1167127343 +1365 None onedge_slice1364 nodes= [1364, 1365, 1366, 4364, 4365, 4366] persons= [1368, 1369, 1370] +--- sas= [] onedge_slice1364 crp= 1 +--- 'expires': 1167127344 +1366 None onedgf_slice1365 nodes= [1365, 1366, 1367, 4365, 4366, 4367] persons= [1369, 1370, 1371] +--- sas= [] onedgf_slice1365 crp= 1 +--- 'expires': 1167127346 +1367 None onedgg_slice1366 nodes= [1366, 1367, 1368, 4366, 4367, 4368] persons= [1370, 1371, 1372] +--- sas= [] onedgg_slice1366 crp= 1 +--- 'expires': 1167127347 +1368 None onedgh_slice1367 nodes= [1367, 1368, 1369, 4367, 4368, 4369] persons= [1371, 1372, 1373] +--- sas= [] onedgh_slice1367 crp= 1 +--- 'expires': 1167127349 +1369 None onedgi_slice1368 nodes= [1368, 1369, 1370, 4368, 4369, 4370] persons= [1372, 1373, 1374] +--- sas= [] onedgi_slice1368 crp= 1 +--- 'expires': 1167127350 +1370 None onedgj_slice1369 nodes= [1369, 1370, 1371, 4369, 4370, 4371] persons= [1373, 1374, 1375] +--- sas= [] onedgj_slice1369 crp= 1 +--- 'expires': 1167127352 +1371 None onedha_slice1370 nodes= [1370, 1371, 1372, 4370, 4371, 4372] persons= [1374, 1375, 1376] +--- sas= [] onedha_slice1370 crp= 1 +--- 'expires': 1167127353 +1372 None onedhb_slice1371 nodes= [1371, 1372, 1373, 4371, 4372, 4373] persons= [1375, 1376, 1377] +--- sas= [] onedhb_slice1371 crp= 1 +--- 'expires': 1167127355 +1373 None onedhc_slice1372 nodes= [1372, 1373, 1374, 4372, 4373, 4374] persons= [1376, 1377, 1378] +--- sas= [] onedhc_slice1372 crp= 1 +--- 'expires': 1167127356 +1374 None onedhd_slice1373 nodes= [1373, 1374, 1375, 4373, 4374, 4375] persons= [1377, 1378, 1379] +--- sas= [] onedhd_slice1373 crp= 1 +--- 'expires': 1167127357 +1375 None onedhe_slice1374 nodes= [1374, 1375, 1376, 4374, 4375, 4376] persons= [1378, 1379, 1380] +--- sas= [] onedhe_slice1374 crp= 1 +--- 'expires': 1167127359 +1376 None onedhf_slice1375 nodes= [1375, 1376, 1377, 4375, 4376, 4377] persons= [1379, 1380, 1381] +--- sas= [] onedhf_slice1375 crp= 1 +--- 'expires': 1167127360 +1377 None onedhg_slice1376 nodes= [1376, 1377, 1378, 4376, 4377, 4378] persons= [1380, 1381, 1382] +--- sas= [] onedhg_slice1376 crp= 1 +--- 'expires': 1167127362 +1378 None onedhh_slice1377 nodes= [1377, 1378, 1379, 4377, 4378, 4379] persons= [1381, 1382, 1383] +--- sas= [] onedhh_slice1377 crp= 1 +--- 'expires': 1167127363 +1379 None onedhi_slice1378 nodes= [1378, 1379, 1380, 4378, 4379, 4380] persons= [1382, 1383, 1384] +--- sas= [] onedhi_slice1378 crp= 1 +--- 'expires': 1167127365 +1380 None onedhj_slice1379 nodes= [1379, 1380, 1381, 4379, 4380, 4381] persons= [1383, 1384, 1385] +--- sas= [] onedhj_slice1379 crp= 1 +--- 'expires': 1167127366 +1381 None onedia_slice1380 nodes= [1380, 1381, 1382, 4380, 4381, 4382] persons= [1384, 1385, 1386] +--- sas= [] onedia_slice1380 crp= 1 +--- 'expires': 1167127368 +1382 None onedib_slice1381 nodes= [1381, 1382, 1383, 4381, 4382, 4383] persons= [1385, 1386, 1387] +--- sas= [] onedib_slice1381 crp= 1 +--- 'expires': 1167127369 +1383 None onedic_slice1382 nodes= [1382, 1383, 1384, 4382, 4383, 4384] persons= [1386, 1387, 1388] +--- sas= [] onedic_slice1382 crp= 1 +--- 'expires': 1167127371 +1384 None onedid_slice1383 nodes= [1383, 1384, 1385, 4383, 4384, 4385] persons= [1387, 1388, 1389] +--- sas= [] onedid_slice1383 crp= 1 +--- 'expires': 1167127372 +1385 None onedie_slice1384 nodes= [1384, 1385, 1386, 4384, 4385, 4386] persons= [1388, 1389, 1390] +--- sas= [] onedie_slice1384 crp= 1 +--- 'expires': 1167127374 +1386 None onedif_slice1385 nodes= [1385, 1386, 1387, 4385, 4386, 4387] persons= [1389, 1390, 1391] +--- sas= [] onedif_slice1385 crp= 1 +--- 'expires': 1167127375 +1387 None onedig_slice1386 nodes= [1386, 1387, 1388, 4386, 4387, 4388] persons= [1390, 1391, 1392] +--- sas= [] onedig_slice1386 crp= 1 +--- 'expires': 1167127376 +1388 None onedih_slice1387 nodes= [1387, 1388, 1389, 4387, 4388, 4389] persons= [1391, 1392, 1393] +--- sas= [] onedih_slice1387 crp= 1 +--- 'expires': 1167127378 +1389 None onedii_slice1388 nodes= [1388, 1389, 1390, 4388, 4389, 4390] persons= [1392, 1393, 1394] +--- sas= [] onedii_slice1388 crp= 1 +--- 'expires': 1167127379 +1390 None onedij_slice1389 nodes= [1389, 1390, 1391, 4389, 4390, 4391] persons= [1393, 1394, 1395] +--- sas= [] onedij_slice1389 crp= 1 +--- 'expires': 1167127381 +1391 None onedja_slice1390 nodes= [1390, 1391, 1392, 4390, 4391, 4392] persons= [1394, 1395, 1396] +--- sas= [] onedja_slice1390 crp= 1 +--- 'expires': 1167127382 +1392 None onedjb_slice1391 nodes= [1391, 1392, 1393, 4391, 4392, 4393] persons= [1395, 1396, 1397] +--- sas= [] onedjb_slice1391 crp= 1 +--- 'expires': 1167127384 +1393 None onedjc_slice1392 nodes= [1392, 1393, 1394, 4392, 4393, 4394] persons= [1396, 1397, 1398] +--- sas= [] onedjc_slice1392 crp= 1 +--- 'expires': 1167127385 +1394 None onedjd_slice1393 nodes= [1393, 1394, 1395, 4393, 4394, 4395] persons= [1397, 1398, 1399] +--- sas= [] onedjd_slice1393 crp= 1 +--- 'expires': 1167127387 +1395 None onedje_slice1394 nodes= [1394, 1395, 1396, 4394, 4395, 4396] persons= [1398, 1399, 1400] +--- sas= [] onedje_slice1394 crp= 1 +--- 'expires': 1167127388 +1396 None onedjf_slice1395 nodes= [1395, 1396, 1397, 4395, 4396, 4397] persons= [1399, 1400, 1401] +--- sas= [] onedjf_slice1395 crp= 1 +--- 'expires': 1167127389 +1397 None onedjg_slice1396 nodes= [1396, 1397, 1398, 4396, 4397, 4398] persons= [1400, 1401, 1402] +--- sas= [] onedjg_slice1396 crp= 1 +--- 'expires': 1167127391 +1398 None onedjh_slice1397 nodes= [1397, 1398, 1399, 4397, 4398, 4399] persons= [1401, 1402, 1403] +--- sas= [] onedjh_slice1397 crp= 1 +--- 'expires': 1167127392 +1399 None onedji_slice1398 nodes= [1398, 1399, 1400, 4398, 4399, 4400] persons= [1402, 1403, 1404] +--- sas= [] onedji_slice1398 crp= 1 +--- 'expires': 1167127394 +1400 None onedjj_slice1399 nodes= [1399, 1400, 1401, 4399, 4400, 4401] persons= [1403, 1404, 1405] +--- sas= [] onedjj_slice1399 crp= 1 +--- 'expires': 1167127395 +1401 None oneeaa_slice1400 nodes= [1400, 1401, 1402, 4400, 4401, 4402] persons= [1404, 1405, 1406] +--- sas= [] oneeaa_slice1400 crp= 1 +--- 'expires': 1167127397 +1402 None oneeab_slice1401 nodes= [1401, 1402, 1403, 4401, 4402, 4403] persons= [1405, 1406, 1407] +--- sas= [] oneeab_slice1401 crp= 1 +--- 'expires': 1167127398 +1403 None oneeac_slice1402 nodes= [1402, 1403, 1404, 4402, 4403, 4404] persons= [1406, 1407, 1408] +--- sas= [] oneeac_slice1402 crp= 1 +--- 'expires': 1167127400 +1404 None oneead_slice1403 nodes= [1403, 1404, 1405, 4403, 4404, 4405] persons= [1407, 1408, 1409] +--- sas= [] oneead_slice1403 crp= 1 +--- 'expires': 1167127401 +1405 None oneeae_slice1404 nodes= [1404, 1405, 1406, 4404, 4405, 4406] persons= [1408, 1409, 1410] +--- sas= [] oneeae_slice1404 crp= 1 +--- 'expires': 1167127403 +1406 None oneeaf_slice1405 nodes= [1405, 1406, 1407, 4405, 4406, 4407] persons= [1409, 1410, 1411] +--- sas= [] oneeaf_slice1405 crp= 1 +--- 'expires': 1167127404 +1407 None oneeag_slice1406 nodes= [1406, 1407, 1408, 4406, 4407, 4408] persons= [1410, 1411, 1412] +--- sas= [] oneeag_slice1406 crp= 1 +--- 'expires': 1167127406 +1408 None oneeah_slice1407 nodes= [1407, 1408, 1409, 4407, 4408, 4409] persons= [1411, 1412, 1413] +--- sas= [] oneeah_slice1407 crp= 1 +--- 'expires': 1167127407 +1409 None oneeai_slice1408 nodes= [1408, 1409, 1410, 4408, 4409, 4410] persons= [1412, 1413, 1414] +--- sas= [] oneeai_slice1408 crp= 1 +--- 'expires': 1167127409 +1410 None oneeaj_slice1409 nodes= [1409, 1410, 1411, 4409, 4410, 4411] persons= [1413, 1414, 1415] +--- sas= [] oneeaj_slice1409 crp= 1 +--- 'expires': 1167127410 +1411 None oneeba_slice1410 nodes= [1410, 1411, 1412, 4410, 4411, 4412] persons= [1414, 1415, 1416] +--- sas= [] oneeba_slice1410 crp= 1 +--- 'expires': 1167127411 +1412 None oneebb_slice1411 nodes= [1411, 1412, 1413, 4411, 4412, 4413] persons= [1415, 1416, 1417] +--- sas= [] oneebb_slice1411 crp= 1 +--- 'expires': 1167127413 +1413 None oneebc_slice1412 nodes= [1412, 1413, 1414, 4412, 4413, 4414] persons= [1416, 1417, 1418] +--- sas= [] oneebc_slice1412 crp= 1 +--- 'expires': 1167127414 +1414 None oneebd_slice1413 nodes= [1413, 1414, 1415, 4413, 4414, 4415] persons= [1417, 1418, 1419] +--- sas= [] oneebd_slice1413 crp= 1 +--- 'expires': 1167127416 +1415 None oneebe_slice1414 nodes= [1414, 1415, 1416, 4414, 4415, 4416] persons= [1418, 1419, 1420] +--- sas= [] oneebe_slice1414 crp= 1 +--- 'expires': 1167127417 +1416 None oneebf_slice1415 nodes= [1415, 1416, 1417, 4415, 4416, 4417] persons= [1419, 1420, 1421] +--- sas= [] oneebf_slice1415 crp= 1 +--- 'expires': 1167127418 +1417 None oneebg_slice1416 nodes= [1416, 1417, 1418, 4416, 4417, 4418] persons= [1420, 1421, 1422] +--- sas= [] oneebg_slice1416 crp= 1 +--- 'expires': 1167127418 +1418 None oneebh_slice1417 nodes= [1417, 1418, 1419, 4417, 4418, 4419] persons= [1421, 1422, 1423] +--- sas= [] oneebh_slice1417 crp= 1 +--- 'expires': 1167127419 +1419 None oneebi_slice1418 nodes= [1418, 1419, 1420, 4418, 4419, 4420] persons= [1422, 1423, 1424] +--- sas= [] oneebi_slice1418 crp= 1 +--- 'expires': 1167127419 +1420 None oneebj_slice1419 nodes= [1419, 1420, 1421, 4419, 4420, 4421] persons= [1423, 1424, 1425] +--- sas= [] oneebj_slice1419 crp= 1 +--- 'expires': 1167127420 +1421 None oneeca_slice1420 nodes= [1420, 1421, 1422, 4420, 4421, 4422] persons= [1424, 1425, 1426] +--- sas= [] oneeca_slice1420 crp= 1 +--- 'expires': 1167127420 +1422 None oneecb_slice1421 nodes= [1421, 1422, 1423, 4421, 4422, 4423] persons= [1425, 1426, 1427] +--- sas= [] oneecb_slice1421 crp= 1 +--- 'expires': 1167127421 +1423 None oneecc_slice1422 nodes= [1422, 1423, 1424, 4422, 4423, 4424] persons= [1426, 1427, 1428] +--- sas= [] oneecc_slice1422 crp= 1 +--- 'expires': 1167127421 +1424 None oneecd_slice1423 nodes= [1423, 1424, 1425, 4423, 4424, 4425] persons= [1427, 1428, 1429] +--- sas= [] oneecd_slice1423 crp= 1 +--- 'expires': 1167127422 +1425 None oneece_slice1424 nodes= [1424, 1425, 1426, 4424, 4425, 4426] persons= [1428, 1429, 1430] +--- sas= [] oneece_slice1424 crp= 1 +--- 'expires': 1167127422 +1426 None oneecf_slice1425 nodes= [1425, 1426, 1427, 4425, 4426, 4427] persons= [1429, 1430, 1431] +--- sas= [] oneecf_slice1425 crp= 1 +--- 'expires': 1167127422 +1427 None oneecg_slice1426 nodes= [1426, 1427, 1428, 4426, 4427, 4428] persons= [1430, 1431, 1432] +--- sas= [] oneecg_slice1426 crp= 1 +--- 'expires': 1167127423 +1428 None oneech_slice1427 nodes= [1427, 1428, 1429, 4427, 4428, 4429] persons= [1431, 1432, 1433] +--- sas= [] oneech_slice1427 crp= 1 +--- 'expires': 1167127423 +1429 None oneeci_slice1428 nodes= [1428, 1429, 1430, 4428, 4429, 4430] persons= [1432, 1433, 1434] +--- sas= [] oneeci_slice1428 crp= 1 +--- 'expires': 1167127424 +1430 None oneecj_slice1429 nodes= [1429, 1430, 1431, 4429, 4430, 4431] persons= [1433, 1434, 1435] +--- sas= [] oneecj_slice1429 crp= 1 +--- 'expires': 1167127424 +1431 None oneeda_slice1430 nodes= [1430, 1431, 1432, 4430, 4431, 4432] persons= [1434, 1435, 1436] +--- sas= [] oneeda_slice1430 crp= 1 +--- 'expires': 1167127425 +1432 None oneedb_slice1431 nodes= [1431, 1432, 1433, 4431, 4432, 4433] persons= [1435, 1436, 1437] +--- sas= [] oneedb_slice1431 crp= 1 +--- 'expires': 1167127425 +1433 None oneedc_slice1432 nodes= [1432, 1433, 1434, 4432, 4433, 4434] persons= [1436, 1437, 1438] +--- sas= [] oneedc_slice1432 crp= 1 +--- 'expires': 1167127426 +1434 None oneedd_slice1433 nodes= [1433, 1434, 1435, 4433, 4434, 4435] persons= [1437, 1438, 1439] +--- sas= [] oneedd_slice1433 crp= 1 +--- 'expires': 1167127426 +1435 None oneede_slice1434 nodes= [1434, 1435, 1436, 4434, 4435, 4436] persons= [1438, 1439, 1440] +--- sas= [] oneede_slice1434 crp= 1 +--- 'expires': 1167127426 +1436 None oneedf_slice1435 nodes= [1435, 1436, 1437, 4435, 4436, 4437] persons= [1439, 1440, 1441] +--- sas= [] oneedf_slice1435 crp= 1 +--- 'expires': 1167127427 +1437 None oneedg_slice1436 nodes= [1436, 1437, 1438, 4436, 4437, 4438] persons= [1440, 1441, 1442] +--- sas= [] oneedg_slice1436 crp= 1 +--- 'expires': 1167127427 +1438 None oneedh_slice1437 nodes= [1437, 1438, 1439, 4437, 4438, 4439] persons= [1441, 1442, 1443] +--- sas= [] oneedh_slice1437 crp= 1 +--- 'expires': 1167127428 +1439 None oneedi_slice1438 nodes= [1438, 1439, 1440, 4438, 4439, 4440] persons= [1442, 1443, 1444] +--- sas= [] oneedi_slice1438 crp= 1 +--- 'expires': 1167127428 +1440 None oneedj_slice1439 nodes= [1439, 1440, 1441, 4439, 4440, 4441] persons= [1443, 1444, 1445] +--- sas= [] oneedj_slice1439 crp= 1 +--- 'expires': 1167127429 +1441 None oneeea_slice1440 nodes= [1440, 1441, 1442, 4440, 4441, 4442] persons= [1444, 1445, 1446] +--- sas= [] oneeea_slice1440 crp= 1 +--- 'expires': 1167127429 +1442 None oneeeb_slice1441 nodes= [1441, 1442, 1443, 4441, 4442, 4443] persons= [1445, 1446, 1447] +--- sas= [] oneeeb_slice1441 crp= 1 +--- 'expires': 1167127430 +1443 None oneeec_slice1442 nodes= [1442, 1443, 1444, 4442, 4443, 4444] persons= [1446, 1447, 1448] +--- sas= [] oneeec_slice1442 crp= 1 +--- 'expires': 1167127430 +1444 None oneeed_slice1443 nodes= [1443, 1444, 1445, 4443, 4444, 4445] persons= [1447, 1448, 1449] +--- sas= [] oneeed_slice1443 crp= 1 +--- 'expires': 1167127430 +1445 None oneeee_slice1444 nodes= [1444, 1445, 1446, 4444, 4445, 4446] persons= [1448, 1449, 1450] +--- sas= [] oneeee_slice1444 crp= 1 +--- 'expires': 1167127431 +1446 None oneeef_slice1445 nodes= [1445, 1446, 1447, 4445, 4446, 4447] persons= [1449, 1450, 1451] +--- sas= [] oneeef_slice1445 crp= 1 +--- 'expires': 1167127431 +1447 None oneeeg_slice1446 nodes= [1446, 1447, 1448, 4446, 4447, 4448] persons= [1450, 1451, 1452] +--- sas= [] oneeeg_slice1446 crp= 1 +--- 'expires': 1167127432 +1448 None oneeeh_slice1447 nodes= [1447, 1448, 1449, 4447, 4448, 4449] persons= [1451, 1452, 1453] +--- sas= [] oneeeh_slice1447 crp= 1 +--- 'expires': 1167127432 +1449 None oneeei_slice1448 nodes= [1448, 1449, 1450, 4448, 4449, 4450] persons= [1452, 1453, 1454] +--- sas= [] oneeei_slice1448 crp= 1 +--- 'expires': 1167127433 +1450 None oneeej_slice1449 nodes= [1449, 1450, 1451, 4449, 4450, 4451] persons= [1453, 1454, 1455] +--- sas= [] oneeej_slice1449 crp= 1 +--- 'expires': 1167127433 +1451 None oneefa_slice1450 nodes= [1450, 1451, 1452, 4450, 4451, 4452] persons= [1454, 1455, 1456] +--- sas= [] oneefa_slice1450 crp= 1 +--- 'expires': 1167127433 +1452 None oneefb_slice1451 nodes= [1451, 1452, 1453, 4451, 4452, 4453] persons= [1455, 1456, 1457] +--- sas= [] oneefb_slice1451 crp= 1 +--- 'expires': 1167127434 +1453 None oneefc_slice1452 nodes= [1452, 1453, 1454, 4452, 4453, 4454] persons= [1456, 1457, 1458] +--- sas= [] oneefc_slice1452 crp= 1 +--- 'expires': 1167127434 +1454 None oneefd_slice1453 nodes= [1453, 1454, 1455, 4453, 4454, 4455] persons= [1457, 1458, 1459] +--- sas= [] oneefd_slice1453 crp= 1 +--- 'expires': 1167127435 +1455 None oneefe_slice1454 nodes= [1454, 1455, 1456, 4454, 4455, 4456] persons= [1458, 1459, 1460] +--- sas= [] oneefe_slice1454 crp= 1 +--- 'expires': 1167127435 +1456 None oneeff_slice1455 nodes= [1455, 1456, 1457, 4455, 4456, 4457] persons= [1459, 1460, 1461] +--- sas= [] oneeff_slice1455 crp= 1 +--- 'expires': 1167127436 +1457 None oneefg_slice1456 nodes= [1456, 1457, 1458, 4456, 4457, 4458] persons= [1460, 1461, 1462] +--- sas= [] oneefg_slice1456 crp= 1 +--- 'expires': 1167127436 +1458 None oneefh_slice1457 nodes= [1457, 1458, 1459, 4457, 4458, 4459] persons= [1461, 1462, 1463] +--- sas= [] oneefh_slice1457 crp= 1 +--- 'expires': 1167127436 +1459 None oneefi_slice1458 nodes= [1458, 1459, 1460, 4458, 4459, 4460] persons= [1462, 1463, 1464] +--- sas= [] oneefi_slice1458 crp= 1 +--- 'expires': 1167127437 +1460 None oneefj_slice1459 nodes= [1459, 1460, 1461, 4459, 4460, 4461] persons= [1463, 1464, 1465] +--- sas= [] oneefj_slice1459 crp= 1 +--- 'expires': 1167127437 +1461 None oneega_slice1460 nodes= [1460, 1461, 1462, 4460, 4461, 4462] persons= [1464, 1465, 1466] +--- sas= [] oneega_slice1460 crp= 1 +--- 'expires': 1167127438 +1462 None oneegb_slice1461 nodes= [1461, 1462, 1463, 4461, 4462, 4463] persons= [1465, 1466, 1467] +--- sas= [] oneegb_slice1461 crp= 1 +--- 'expires': 1167127438 +1463 None oneegc_slice1462 nodes= [1462, 1463, 1464, 4462, 4463, 4464] persons= [1466, 1467, 1468] +--- sas= [] oneegc_slice1462 crp= 1 +--- 'expires': 1167127439 +1464 None oneegd_slice1463 nodes= [1463, 1464, 1465, 4463, 4464, 4465] persons= [1467, 1468, 1469] +--- sas= [] oneegd_slice1463 crp= 1 +--- 'expires': 1167127439 +1465 None oneege_slice1464 nodes= [1464, 1465, 1466, 4464, 4465, 4466] persons= [1468, 1469, 1470] +--- sas= [] oneege_slice1464 crp= 1 +--- 'expires': 1167127439 +1466 None oneegf_slice1465 nodes= [1465, 1466, 1467, 4465, 4466, 4467] persons= [1469, 1470, 1471] +--- sas= [] oneegf_slice1465 crp= 1 +--- 'expires': 1167127440 +1467 None oneegg_slice1466 nodes= [1466, 1467, 1468, 4466, 4467, 4468] persons= [1470, 1471, 1472] +--- sas= [] oneegg_slice1466 crp= 1 +--- 'expires': 1167127440 +1468 None oneegh_slice1467 nodes= [1467, 1468, 1469, 4467, 4468, 4469] persons= [1471, 1472, 1473] +--- sas= [] oneegh_slice1467 crp= 1 +--- 'expires': 1167127441 +1469 None oneegi_slice1468 nodes= [1468, 1469, 1470, 4468, 4469, 4470] persons= [1472, 1473, 1474] +--- sas= [] oneegi_slice1468 crp= 1 +--- 'expires': 1167127441 +1470 None oneegj_slice1469 nodes= [1469, 1470, 1471, 4469, 4470, 4471] persons= [1473, 1474, 1475] +--- sas= [] oneegj_slice1469 crp= 1 +--- 'expires': 1167127442 +1471 None oneeha_slice1470 nodes= [1470, 1471, 1472, 4470, 4471, 4472] persons= [1474, 1475, 1476] +--- sas= [] oneeha_slice1470 crp= 1 +--- 'expires': 1167127442 +1472 None oneehb_slice1471 nodes= [1471, 1472, 1473, 4471, 4472, 4473] persons= [1475, 1476, 1477] +--- sas= [] oneehb_slice1471 crp= 1 +--- 'expires': 1167127442 +1473 None oneehc_slice1472 nodes= [1472, 1473, 1474, 4472, 4473, 4474] persons= [1476, 1477, 1478] +--- sas= [] oneehc_slice1472 crp= 1 +--- 'expires': 1167127443 +1474 None oneehd_slice1473 nodes= [1473, 1474, 1475, 4473, 4474, 4475] persons= [1477, 1478, 1479] +--- sas= [] oneehd_slice1473 crp= 1 +--- 'expires': 1167127443 +1475 None oneehe_slice1474 nodes= [1474, 1475, 1476, 4474, 4475, 4476] persons= [1478, 1479, 1480] +--- sas= [] oneehe_slice1474 crp= 1 +--- 'expires': 1167127444 +1476 None oneehf_slice1475 nodes= [1475, 1476, 1477, 4475, 4476, 4477] persons= [1479, 1480, 1481] +--- sas= [] oneehf_slice1475 crp= 1 +--- 'expires': 1167127444 +1477 None oneehg_slice1476 nodes= [1476, 1477, 1478, 4476, 4477, 4478] persons= [1480, 1481, 1482] +--- sas= [] oneehg_slice1476 crp= 1 +--- 'expires': 1167127445 +1478 None oneehh_slice1477 nodes= [1477, 1478, 1479, 4477, 4478, 4479] persons= [1481, 1482, 1483] +--- sas= [] oneehh_slice1477 crp= 1 +--- 'expires': 1167127445 +1479 None oneehi_slice1478 nodes= [1478, 1479, 1480, 4478, 4479, 4480] persons= [1482, 1483, 1484] +--- sas= [] oneehi_slice1478 crp= 1 +--- 'expires': 1167127446 +1480 None oneehj_slice1479 nodes= [1479, 1480, 1481, 4479, 4480, 4481] persons= [1483, 1484, 1485] +--- sas= [] oneehj_slice1479 crp= 1 +--- 'expires': 1167127446 +1481 None oneeia_slice1480 nodes= [1480, 1481, 1482, 4480, 4481, 4482] persons= [1484, 1485, 1486] +--- sas= [] oneeia_slice1480 crp= 1 +--- 'expires': 1167127446 +1482 None oneeib_slice1481 nodes= [1481, 1482, 1483, 4481, 4482, 4483] persons= [1485, 1486, 1487] +--- sas= [] oneeib_slice1481 crp= 1 +--- 'expires': 1167127447 +1483 None oneeic_slice1482 nodes= [1482, 1483, 1484, 4482, 4483, 4484] persons= [1486, 1487, 1488] +--- sas= [] oneeic_slice1482 crp= 1 +--- 'expires': 1167127447 +1484 None oneeid_slice1483 nodes= [1483, 1484, 1485, 4483, 4484, 4485] persons= [1487, 1488, 1489] +--- sas= [] oneeid_slice1483 crp= 1 +--- 'expires': 1167127448 +1485 None oneeie_slice1484 nodes= [1484, 1485, 1486, 4484, 4485, 4486] persons= [1488, 1489, 1490] +--- sas= [] oneeie_slice1484 crp= 1 +--- 'expires': 1167127448 +1486 None oneeif_slice1485 nodes= [1485, 1486, 1487, 4485, 4486, 4487] persons= [1489, 1490, 1491] +--- sas= [] oneeif_slice1485 crp= 1 +--- 'expires': 1167127449 +1487 None oneeig_slice1486 nodes= [1486, 1487, 1488, 4486, 4487, 4488] persons= [1490, 1491, 1492] +--- sas= [] oneeig_slice1486 crp= 1 +--- 'expires': 1167127449 +1488 None oneeih_slice1487 nodes= [1487, 1488, 1489, 4487, 4488, 4489] persons= [1491, 1492, 1493] +--- sas= [] oneeih_slice1487 crp= 1 +--- 'expires': 1167127449 +1489 None oneeii_slice1488 nodes= [1488, 1489, 1490, 4488, 4489, 4490] persons= [1492, 1493, 1494] +--- sas= [] oneeii_slice1488 crp= 1 +--- 'expires': 1167127450 +1490 None oneeij_slice1489 nodes= [1489, 1490, 1491, 4489, 4490, 4491] persons= [1493, 1494, 1495] +--- sas= [] oneeij_slice1489 crp= 1 +--- 'expires': 1167127450 +1491 None oneeja_slice1490 nodes= [1490, 1491, 1492, 4490, 4491, 4492] persons= [1494, 1495, 1496] +--- sas= [] oneeja_slice1490 crp= 1 +--- 'expires': 1167127451 +1492 None oneejb_slice1491 nodes= [1491, 1492, 1493, 4491, 4492, 4493] persons= [1495, 1496, 1497] +--- sas= [] oneejb_slice1491 crp= 1 +--- 'expires': 1167127451 +1493 None oneejc_slice1492 nodes= [1492, 1493, 1494, 4492, 4493, 4494] persons= [1496, 1497, 1498] +--- sas= [] oneejc_slice1492 crp= 1 +--- 'expires': 1167127452 +1494 None oneejd_slice1493 nodes= [1493, 1494, 1495, 4493, 4494, 4495] persons= [1497, 1498, 1499] +--- sas= [] oneejd_slice1493 crp= 1 +--- 'expires': 1167127452 +1495 None oneeje_slice1494 nodes= [1494, 1495, 1496, 4494, 4495, 4496] persons= [1498, 1499, 1500] +--- sas= [] oneeje_slice1494 crp= 1 +--- 'expires': 1167127453 +1496 None oneejf_slice1495 nodes= [1495, 1496, 1497, 4495, 4496, 4497] persons= [1499, 1500, 1501] +--- sas= [] oneejf_slice1495 crp= 1 +--- 'expires': 1167127453 +1497 None oneejg_slice1496 nodes= [1496, 1497, 1498, 4496, 4497, 4498] persons= [1500, 1501, 1502] +--- sas= [] oneejg_slice1496 crp= 1 +--- 'expires': 1167127453 +1498 None oneejh_slice1497 nodes= [1497, 1498, 1499, 4497, 4498, 4499] persons= [1501, 1502, 1503] +--- sas= [] oneejh_slice1497 crp= 1 +--- 'expires': 1167127454 +1499 None oneeji_slice1498 nodes= [1498, 1499, 1500, 4498, 4499, 4500] persons= [1502, 1503, 1504] +--- sas= [] oneeji_slice1498 crp= 1 +--- 'expires': 1167127454 +1500 None oneejj_slice1499 nodes= [1499, 1500, 1501, 4499, 4500, 4501] persons= [1503, 1504, 1505] +--- sas= [] oneejj_slice1499 crp= 1 +--- 'expires': 1167127455 +1501 None onefaa_slice1500 nodes= [1500, 1501, 1502, 4500, 4501, 4502] persons= [1504, 1505, 1506] +--- sas= [] onefaa_slice1500 crp= 1 +--- 'expires': 1167127455 +1502 None onefab_slice1501 nodes= [1501, 1502, 1503, 4501, 4502, 4503] persons= [1505, 1506, 1507] +--- sas= [] onefab_slice1501 crp= 1 +--- 'expires': 1167127456 +1503 None onefac_slice1502 nodes= [1502, 1503, 1504, 4502, 4503, 4504] persons= [1506, 1507, 1508] +--- sas= [] onefac_slice1502 crp= 1 +--- 'expires': 1167127456 +1504 None onefad_slice1503 nodes= [1503, 1504, 1505, 4503, 4504, 4505] persons= [1507, 1508, 1509] +--- sas= [] onefad_slice1503 crp= 1 +--- 'expires': 1167127457 +1505 None onefae_slice1504 nodes= [1504, 1505, 1506, 4504, 4505, 4506] persons= [1508, 1509, 1510] +--- sas= [] onefae_slice1504 crp= 1 +--- 'expires': 1167127457 +1506 None onefaf_slice1505 nodes= [1505, 1506, 1507, 4505, 4506, 4507] persons= [1509, 1510, 1511] +--- sas= [] onefaf_slice1505 crp= 1 +--- 'expires': 1167127457 +1507 None onefag_slice1506 nodes= [1506, 1507, 1508, 4506, 4507, 4508] persons= [1510, 1511, 1512] +--- sas= [] onefag_slice1506 crp= 1 +--- 'expires': 1167127458 +1508 None onefah_slice1507 nodes= [1507, 1508, 1509, 4507, 4508, 4509] persons= [1511, 1512, 1513] +--- sas= [] onefah_slice1507 crp= 1 +--- 'expires': 1167127458 +1509 None onefai_slice1508 nodes= [1508, 1509, 1510, 4508, 4509, 4510] persons= [1512, 1513, 1514] +--- sas= [] onefai_slice1508 crp= 1 +--- 'expires': 1167127459 +1510 None onefaj_slice1509 nodes= [1509, 1510, 1511, 4509, 4510, 4511] persons= [1513, 1514, 1515] +--- sas= [] onefaj_slice1509 crp= 1 +--- 'expires': 1167127459 +1511 None onefba_slice1510 nodes= [1510, 1511, 1512, 4510, 4511, 4512] persons= [1514, 1515, 1516] +--- sas= [] onefba_slice1510 crp= 1 +--- 'expires': 1167127460 +1512 None onefbb_slice1511 nodes= [1511, 1512, 1513, 4511, 4512, 4513] persons= [1515, 1516, 1517] +--- sas= [] onefbb_slice1511 crp= 1 +--- 'expires': 1167127460 +1513 None onefbc_slice1512 nodes= [1512, 1513, 1514, 4512, 4513, 4514] persons= [1516, 1517, 1518] +--- sas= [] onefbc_slice1512 crp= 1 +--- 'expires': 1167127460 +1514 None onefbd_slice1513 nodes= [1513, 1514, 1515, 4513, 4514, 4515] persons= [1517, 1518, 1519] +--- sas= [] onefbd_slice1513 crp= 1 +--- 'expires': 1167127461 +1515 None onefbe_slice1514 nodes= [1514, 1515, 1516, 4514, 4515, 4516] persons= [1518, 1519, 1520] +--- sas= [] onefbe_slice1514 crp= 1 +--- 'expires': 1167127461 +1516 None onefbf_slice1515 nodes= [1515, 1516, 1517, 4515, 4516, 4517] persons= [1519, 1520, 1521] +--- sas= [] onefbf_slice1515 crp= 1 +--- 'expires': 1167127462 +1517 None onefbg_slice1516 nodes= [1516, 1517, 1518, 4516, 4517, 4518] persons= [1520, 1521, 1522] +--- sas= [] onefbg_slice1516 crp= 1 +--- 'expires': 1167127462 +1518 None onefbh_slice1517 nodes= [1517, 1518, 1519, 4517, 4518, 4519] persons= [1521, 1522, 1523] +--- sas= [] onefbh_slice1517 crp= 1 +--- 'expires': 1167127463 +1519 None onefbi_slice1518 nodes= [1518, 1519, 1520, 4518, 4519, 4520] persons= [1522, 1523, 1524] +--- sas= [] onefbi_slice1518 crp= 1 +--- 'expires': 1167127463 +1520 None onefbj_slice1519 nodes= [1519, 1520, 1521, 4519, 4520, 4521] persons= [1523, 1524, 1525] +--- sas= [] onefbj_slice1519 crp= 1 +--- 'expires': 1167127464 +1521 None onefca_slice1520 nodes= [1520, 1521, 1522, 4520, 4521, 4522] persons= [1524, 1525, 1526] +--- sas= [] onefca_slice1520 crp= 1 +--- 'expires': 1167127464 +1522 None onefcb_slice1521 nodes= [1521, 1522, 1523, 4521, 4522, 4523] persons= [1525, 1526, 1527] +--- sas= [] onefcb_slice1521 crp= 1 +--- 'expires': 1167127464 +1523 None onefcc_slice1522 nodes= [1522, 1523, 1524, 4522, 4523, 4524] persons= [1526, 1527, 1528] +--- sas= [] onefcc_slice1522 crp= 1 +--- 'expires': 1167127465 +1524 None onefcd_slice1523 nodes= [1523, 1524, 1525, 4523, 4524, 4525] persons= [1527, 1528, 1529] +--- sas= [] onefcd_slice1523 crp= 1 +--- 'expires': 1167127465 +1525 None onefce_slice1524 nodes= [1524, 1525, 1526, 4524, 4525, 4526] persons= [1528, 1529, 1530] +--- sas= [] onefce_slice1524 crp= 1 +--- 'expires': 1167127466 +1526 None onefcf_slice1525 nodes= [1525, 1526, 1527, 4525, 4526, 4527] persons= [1529, 1530, 1531] +--- sas= [] onefcf_slice1525 crp= 1 +--- 'expires': 1167127466 +1527 None onefcg_slice1526 nodes= [1526, 1527, 1528, 4526, 4527, 4528] persons= [1530, 1531, 1532] +--- sas= [] onefcg_slice1526 crp= 1 +--- 'expires': 1167127467 +1528 None onefch_slice1527 nodes= [1527, 1528, 1529, 4527, 4528, 4529] persons= [1531, 1532, 1533] +--- sas= [] onefch_slice1527 crp= 1 +--- 'expires': 1167127467 +1529 None onefci_slice1528 nodes= [1528, 1529, 1530, 4528, 4529, 4530] persons= [1532, 1533, 1534] +--- sas= [] onefci_slice1528 crp= 1 +--- 'expires': 1167127468 +1530 None onefcj_slice1529 nodes= [1529, 1530, 1531, 4529, 4530, 4531] persons= [1533, 1534, 1535] +--- sas= [] onefcj_slice1529 crp= 1 +--- 'expires': 1167127468 +1531 None onefda_slice1530 nodes= [1530, 1531, 1532, 4530, 4531, 4532] persons= [1534, 1535, 1536] +--- sas= [] onefda_slice1530 crp= 1 +--- 'expires': 1167127468 +1532 None onefdb_slice1531 nodes= [1531, 1532, 1533, 4531, 4532, 4533] persons= [1535, 1536, 1537] +--- sas= [] onefdb_slice1531 crp= 1 +--- 'expires': 1167127469 +1533 None onefdc_slice1532 nodes= [1532, 1533, 1534, 4532, 4533, 4534] persons= [1536, 1537, 1538] +--- sas= [] onefdc_slice1532 crp= 1 +--- 'expires': 1167127469 +1534 None onefdd_slice1533 nodes= [1533, 1534, 1535, 4533, 4534, 4535] persons= [1537, 1538, 1539] +--- sas= [] onefdd_slice1533 crp= 1 +--- 'expires': 1167127470 +1535 None onefde_slice1534 nodes= [1534, 1535, 1536, 4534, 4535, 4536] persons= [1538, 1539, 1540] +--- sas= [] onefde_slice1534 crp= 1 +--- 'expires': 1167127470 +1536 None onefdf_slice1535 nodes= [1535, 1536, 1537, 4535, 4536, 4537] persons= [1539, 1540, 1541] +--- sas= [] onefdf_slice1535 crp= 1 +--- 'expires': 1167127471 +1537 None onefdg_slice1536 nodes= [1536, 1537, 1538, 4536, 4537, 4538] persons= [1540, 1541, 1542] +--- sas= [] onefdg_slice1536 crp= 1 +--- 'expires': 1167127471 +1538 None onefdh_slice1537 nodes= [1537, 1538, 1539, 4537, 4538, 4539] persons= [1541, 1542, 1543] +--- sas= [] onefdh_slice1537 crp= 1 +--- 'expires': 1167127472 +1539 None onefdi_slice1538 nodes= [1538, 1539, 1540, 4538, 4539, 4540] persons= [1542, 1543, 1544] +--- sas= [] onefdi_slice1538 crp= 1 +--- 'expires': 1167127472 +1540 None onefdj_slice1539 nodes= [1539, 1540, 1541, 4539, 4540, 4541] persons= [1543, 1544, 1545] +--- sas= [] onefdj_slice1539 crp= 1 +--- 'expires': 1167127472 +1541 None onefea_slice1540 nodes= [1540, 1541, 1542, 4540, 4541, 4542] persons= [1544, 1545, 1546] +--- sas= [] onefea_slice1540 crp= 1 +--- 'expires': 1167127473 +1542 None onefeb_slice1541 nodes= [1541, 1542, 1543, 4541, 4542, 4543] persons= [1545, 1546, 1547] +--- sas= [] onefeb_slice1541 crp= 1 +--- 'expires': 1167127473 +1543 None onefec_slice1542 nodes= [1542, 1543, 1544, 4542, 4543, 4544] persons= [1546, 1547, 1548] +--- sas= [] onefec_slice1542 crp= 1 +--- 'expires': 1167127474 +1544 None onefed_slice1543 nodes= [1543, 1544, 1545, 4543, 4544, 4545] persons= [1547, 1548, 1549] +--- sas= [] onefed_slice1543 crp= 1 +--- 'expires': 1167127474 +1545 None onefee_slice1544 nodes= [1544, 1545, 1546, 4544, 4545, 4546] persons= [1548, 1549, 1550] +--- sas= [] onefee_slice1544 crp= 1 +--- 'expires': 1167127475 +1546 None onefef_slice1545 nodes= [1545, 1546, 1547, 4545, 4546, 4547] persons= [1549, 1550, 1551] +--- sas= [] onefef_slice1545 crp= 1 +--- 'expires': 1167127475 +1547 None onefeg_slice1546 nodes= [1546, 1547, 1548, 4546, 4547, 4548] persons= [1550, 1551, 1552] +--- sas= [] onefeg_slice1546 crp= 1 +--- 'expires': 1167127476 +1548 None onefeh_slice1547 nodes= [1547, 1548, 1549, 4547, 4548, 4549] persons= [1551, 1552, 1553] +--- sas= [] onefeh_slice1547 crp= 1 +--- 'expires': 1167127476 +1549 None onefei_slice1548 nodes= [1548, 1549, 1550, 4548, 4549, 4550] persons= [1552, 1553, 1554] +--- sas= [] onefei_slice1548 crp= 1 +--- 'expires': 1167127476 +1550 None onefej_slice1549 nodes= [1549, 1550, 1551, 4549, 4550, 4551] persons= [1553, 1554, 1555] +--- sas= [] onefej_slice1549 crp= 1 +--- 'expires': 1167127477 +1551 None oneffa_slice1550 nodes= [1550, 1551, 1552, 4550, 4551, 4552] persons= [1554, 1555, 1556] +--- sas= [] oneffa_slice1550 crp= 1 +--- 'expires': 1167127477 +1552 None oneffb_slice1551 nodes= [1551, 1552, 1553, 4551, 4552, 4553] persons= [1555, 1556, 1557] +--- sas= [] oneffb_slice1551 crp= 1 +--- 'expires': 1167127478 +1553 None oneffc_slice1552 nodes= [1552, 1553, 1554, 4552, 4553, 4554] persons= [1556, 1557, 1558] +--- sas= [] oneffc_slice1552 crp= 1 +--- 'expires': 1167127478 +1554 None oneffd_slice1553 nodes= [1553, 1554, 1555, 4553, 4554, 4555] persons= [1557, 1558, 1559] +--- sas= [] oneffd_slice1553 crp= 1 +--- 'expires': 1167127479 +1555 None oneffe_slice1554 nodes= [1554, 1555, 1556, 4554, 4555, 4556] persons= [1558, 1559, 1560] +--- sas= [] oneffe_slice1554 crp= 1 +--- 'expires': 1167127479 +1556 None onefff_slice1555 nodes= [1555, 1556, 1557, 4555, 4556, 4557] persons= [1559, 1560, 1561] +--- sas= [] onefff_slice1555 crp= 1 +--- 'expires': 1167127480 +1557 None oneffg_slice1556 nodes= [1556, 1557, 1558, 4556, 4557, 4558] persons= [1560, 1561, 1562] +--- sas= [] oneffg_slice1556 crp= 1 +--- 'expires': 1167127480 +1558 None oneffh_slice1557 nodes= [1557, 1558, 1559, 4557, 4558, 4559] persons= [1561, 1562, 1563] +--- sas= [] oneffh_slice1557 crp= 1 +--- 'expires': 1167127480 +1559 None oneffi_slice1558 nodes= [1558, 1559, 1560, 4558, 4559, 4560] persons= [1562, 1563, 1564] +--- sas= [] oneffi_slice1558 crp= 1 +--- 'expires': 1167127481 +1560 None oneffj_slice1559 nodes= [1559, 1560, 1561, 4559, 4560, 4561] persons= [1563, 1564, 1565] +--- sas= [] oneffj_slice1559 crp= 1 +--- 'expires': 1167127481 +1561 None onefga_slice1560 nodes= [1560, 1561, 1562, 4560, 4561, 4562] persons= [1564, 1565, 1566] +--- sas= [] onefga_slice1560 crp= 1 +--- 'expires': 1167127482 +1562 None onefgb_slice1561 nodes= [1561, 1562, 1563, 4561, 4562, 4563] persons= [1565, 1566, 1567] +--- sas= [] onefgb_slice1561 crp= 1 +--- 'expires': 1167127482 +1563 None onefgc_slice1562 nodes= [1562, 1563, 1564, 4562, 4563, 4564] persons= [1566, 1567, 1568] +--- sas= [] onefgc_slice1562 crp= 1 +--- 'expires': 1167127483 +1564 None onefgd_slice1563 nodes= [1563, 1564, 1565, 4563, 4564, 4565] persons= [1567, 1568, 1569] +--- sas= [] onefgd_slice1563 crp= 1 +--- 'expires': 1167127483 +1565 None onefge_slice1564 nodes= [1564, 1565, 1566, 4564, 4565, 4566] persons= [1568, 1569, 1570] +--- sas= [] onefge_slice1564 crp= 1 +--- 'expires': 1167127484 +1566 None onefgf_slice1565 nodes= [1565, 1566, 1567, 4565, 4566, 4567] persons= [1569, 1570, 1571] +--- sas= [] onefgf_slice1565 crp= 1 +--- 'expires': 1167127484 +1567 None onefgg_slice1566 nodes= [1566, 1567, 1568, 4566, 4567, 4568] persons= [1570, 1571, 1572] +--- sas= [] onefgg_slice1566 crp= 1 +--- 'expires': 1167127485 +1568 None onefgh_slice1567 nodes= [1567, 1568, 1569, 4567, 4568, 4569] persons= [1571, 1572, 1573] +--- sas= [] onefgh_slice1567 crp= 1 +--- 'expires': 1167127485 +1569 None onefgi_slice1568 nodes= [1568, 1569, 1570, 4568, 4569, 4570] persons= [1572, 1573, 1574] +--- sas= [] onefgi_slice1568 crp= 1 +--- 'expires': 1167127485 +1570 None onefgj_slice1569 nodes= [1569, 1570, 1571, 4569, 4570, 4571] persons= [1573, 1574, 1575] +--- sas= [] onefgj_slice1569 crp= 1 +--- 'expires': 1167127486 +1571 None onefha_slice1570 nodes= [1570, 1571, 1572, 4570, 4571, 4572] persons= [1574, 1575, 1576] +--- sas= [] onefha_slice1570 crp= 1 +--- 'expires': 1167127486 +1572 None onefhb_slice1571 nodes= [1571, 1572, 1573, 4571, 4572, 4573] persons= [1575, 1576, 1577] +--- sas= [] onefhb_slice1571 crp= 1 +--- 'expires': 1167127487 +1573 None onefhc_slice1572 nodes= [1572, 1573, 1574, 4572, 4573, 4574] persons= [1576, 1577, 1578] +--- sas= [] onefhc_slice1572 crp= 1 +--- 'expires': 1167127487 +1574 None onefhd_slice1573 nodes= [1573, 1574, 1575, 4573, 4574, 4575] persons= [1577, 1578, 1579] +--- sas= [] onefhd_slice1573 crp= 1 +--- 'expires': 1167127488 +1575 None onefhe_slice1574 nodes= [1574, 1575, 1576, 4574, 4575, 4576] persons= [1578, 1579, 1580] +--- sas= [] onefhe_slice1574 crp= 1 +--- 'expires': 1167127488 +1576 None onefhf_slice1575 nodes= [1575, 1576, 1577, 4575, 4576, 4577] persons= [1579, 1580, 1581] +--- sas= [] onefhf_slice1575 crp= 1 +--- 'expires': 1167127489 +1577 None onefhg_slice1576 nodes= [1576, 1577, 1578, 4576, 4577, 4578] persons= [1580, 1581, 1582] +--- sas= [] onefhg_slice1576 crp= 1 +--- 'expires': 1167127489 +1578 None onefhh_slice1577 nodes= [1577, 1578, 1579, 4577, 4578, 4579] persons= [1581, 1582, 1583] +--- sas= [] onefhh_slice1577 crp= 1 +--- 'expires': 1167127490 +1579 None onefhi_slice1578 nodes= [1578, 1579, 1580, 4578, 4579, 4580] persons= [1582, 1583, 1584] +--- sas= [] onefhi_slice1578 crp= 1 +--- 'expires': 1167127490 +1580 None onefhj_slice1579 nodes= [1579, 1580, 1581, 4579, 4580, 4581] persons= [1583, 1584, 1585] +--- sas= [] onefhj_slice1579 crp= 1 +--- 'expires': 1167127490 +1581 None onefia_slice1580 nodes= [1580, 1581, 1582, 4580, 4581, 4582] persons= [1584, 1585, 1586] +--- sas= [] onefia_slice1580 crp= 1 +--- 'expires': 1167127491 +1582 None onefib_slice1581 nodes= [1581, 1582, 1583, 4581, 4582, 4583] persons= [1585, 1586, 1587] +--- sas= [] onefib_slice1581 crp= 1 +--- 'expires': 1167127491 +1583 None onefic_slice1582 nodes= [1582, 1583, 1584, 4582, 4583, 4584] persons= [1586, 1587, 1588] +--- sas= [] onefic_slice1582 crp= 1 +--- 'expires': 1167127492 +1584 None onefid_slice1583 nodes= [1583, 1584, 1585, 4583, 4584, 4585] persons= [1587, 1588, 1589] +--- sas= [] onefid_slice1583 crp= 1 +--- 'expires': 1167127492 +1585 None onefie_slice1584 nodes= [1584, 1585, 1586, 4584, 4585, 4586] persons= [1588, 1589, 1590] +--- sas= [] onefie_slice1584 crp= 1 +--- 'expires': 1167127493 +1586 None onefif_slice1585 nodes= [1585, 1586, 1587, 4585, 4586, 4587] persons= [1589, 1590, 1591] +--- sas= [] onefif_slice1585 crp= 1 +--- 'expires': 1167127493 +1587 None onefig_slice1586 nodes= [1586, 1587, 1588, 4586, 4587, 4588] persons= [1590, 1591, 1592] +--- sas= [] onefig_slice1586 crp= 1 +--- 'expires': 1167127494 +1588 None onefih_slice1587 nodes= [1587, 1588, 1589, 4587, 4588, 4589] persons= [1591, 1592, 1593] +--- sas= [] onefih_slice1587 crp= 1 +--- 'expires': 1167127494 +1589 None onefii_slice1588 nodes= [1588, 1589, 1590, 4588, 4589, 4590] persons= [1592, 1593, 1594] +--- sas= [] onefii_slice1588 crp= 1 +--- 'expires': 1167127494 +1590 None onefij_slice1589 nodes= [1589, 1590, 1591, 4589, 4590, 4591] persons= [1593, 1594, 1595] +--- sas= [] onefij_slice1589 crp= 1 +--- 'expires': 1167127495 +1591 None onefja_slice1590 nodes= [1590, 1591, 1592, 4590, 4591, 4592] persons= [1594, 1595, 1596] +--- sas= [] onefja_slice1590 crp= 1 +--- 'expires': 1167127495 +1592 None onefjb_slice1591 nodes= [1591, 1592, 1593, 4591, 4592, 4593] persons= [1595, 1596, 1597] +--- sas= [] onefjb_slice1591 crp= 1 +--- 'expires': 1167127496 +1593 None onefjc_slice1592 nodes= [1592, 1593, 1594, 4592, 4593, 4594] persons= [1596, 1597, 1598] +--- sas= [] onefjc_slice1592 crp= 1 +--- 'expires': 1167127496 +1594 None onefjd_slice1593 nodes= [1593, 1594, 1595, 4593, 4594, 4595] persons= [1597, 1598, 1599] +--- sas= [] onefjd_slice1593 crp= 1 +--- 'expires': 1167127497 +1595 None onefje_slice1594 nodes= [1594, 1595, 1596, 4594, 4595, 4596] persons= [1598, 1599, 1600] +--- sas= [] onefje_slice1594 crp= 1 +--- 'expires': 1167127497 +1596 None onefjf_slice1595 nodes= [1595, 1596, 1597, 4595, 4596, 4597] persons= [1599, 1600, 1601] +--- sas= [] onefjf_slice1595 crp= 1 +--- 'expires': 1167127498 +1597 None onefjg_slice1596 nodes= [1596, 1597, 1598, 4596, 4597, 4598] persons= [1600, 1601, 1602] +--- sas= [] onefjg_slice1596 crp= 1 +--- 'expires': 1167127498 +1598 None onefjh_slice1597 nodes= [1597, 1598, 1599, 4597, 4598, 4599] persons= [1601, 1602, 1603] +--- sas= [] onefjh_slice1597 crp= 1 +--- 'expires': 1167127499 +1599 None onefji_slice1598 nodes= [1598, 1599, 1600, 4598, 4599, 4600] persons= [1602, 1603, 1604] +--- sas= [] onefji_slice1598 crp= 1 +--- 'expires': 1167127499 +1600 None onefjj_slice1599 nodes= [1599, 1600, 1601, 4599, 4600, 4601] persons= [1603, 1604, 1605] +--- sas= [] onefjj_slice1599 crp= 1 +--- 'expires': 1167127500 +1601 None onegaa_slice1600 nodes= [1600, 1601, 1602, 4600, 4601, 4602] persons= [1604, 1605, 1606] +--- sas= [] onegaa_slice1600 crp= 1 +--- 'expires': 1167127500 +1602 None onegab_slice1601 nodes= [1601, 1602, 1603, 4601, 4602, 4603] persons= [1605, 1606, 1607] +--- sas= [] onegab_slice1601 crp= 1 +--- 'expires': 1167127500 +1603 None onegac_slice1602 nodes= [1602, 1603, 1604, 4602, 4603, 4604] persons= [1606, 1607, 1608] +--- sas= [] onegac_slice1602 crp= 1 +--- 'expires': 1167127501 +1604 None onegad_slice1603 nodes= [1603, 1604, 1605, 4603, 4604, 4605] persons= [1607, 1608, 1609] +--- sas= [] onegad_slice1603 crp= 1 +--- 'expires': 1167127501 +1605 None onegae_slice1604 nodes= [1604, 1605, 1606, 4604, 4605, 4606] persons= [1608, 1609, 1610] +--- sas= [] onegae_slice1604 crp= 1 +--- 'expires': 1167127502 +1606 None onegaf_slice1605 nodes= [1605, 1606, 1607, 4605, 4606, 4607] persons= [1609, 1610, 1611] +--- sas= [] onegaf_slice1605 crp= 1 +--- 'expires': 1167127505 +1607 None onegag_slice1606 nodes= [1606, 1607, 1608, 4606, 4607, 4608] persons= [1610, 1611, 1612] +--- sas= [] onegag_slice1606 crp= 1 +--- 'expires': 1167127508 +1608 None onegah_slice1607 nodes= [1607, 1608, 1609, 4607, 4608, 4609] persons= [1611, 1612, 1613] +--- sas= [] onegah_slice1607 crp= 1 +--- 'expires': 1167127509 +1609 None onegai_slice1608 nodes= [1608, 1609, 1610, 4608, 4609, 4610] persons= [1612, 1613, 1614] +--- sas= [] onegai_slice1608 crp= 1 +--- 'expires': 1167127511 +1610 None onegaj_slice1609 nodes= [1609, 1610, 1611, 4609, 4610, 4611] persons= [1613, 1614, 1615] +--- sas= [] onegaj_slice1609 crp= 1 +--- 'expires': 1167127512 +1611 None onegba_slice1610 nodes= [1610, 1611, 1612, 4610, 4611, 4612] persons= [1614, 1615, 1616] +--- sas= [] onegba_slice1610 crp= 1 +--- 'expires': 1167127514 +1612 None onegbb_slice1611 nodes= [1611, 1612, 1613, 4611, 4612, 4613] persons= [1615, 1616, 1617] +--- sas= [] onegbb_slice1611 crp= 1 +--- 'expires': 1167127515 +1613 None onegbc_slice1612 nodes= [1612, 1613, 1614, 4612, 4613, 4614] persons= [1616, 1617, 1618] +--- sas= [] onegbc_slice1612 crp= 1 +--- 'expires': 1167127517 +1614 None onegbd_slice1613 nodes= [1613, 1614, 1615, 4613, 4614, 4615] persons= [1617, 1618, 1619] +--- sas= [] onegbd_slice1613 crp= 1 +--- 'expires': 1167127518 +1615 None onegbe_slice1614 nodes= [1614, 1615, 1616, 4614, 4615, 4616] persons= [1618, 1619, 1620] +--- sas= [] onegbe_slice1614 crp= 1 +--- 'expires': 1167127519 +1616 None onegbf_slice1615 nodes= [1615, 1616, 1617, 4615, 4616, 4617] persons= [1619, 1620, 1621] +--- sas= [] onegbf_slice1615 crp= 1 +--- 'expires': 1167127521 +1617 None onegbg_slice1616 nodes= [1616, 1617, 1618, 4616, 4617, 4618] persons= [1620, 1621, 1622] +--- sas= [] onegbg_slice1616 crp= 1 +--- 'expires': 1167127522 +1618 None onegbh_slice1617 nodes= [1617, 1618, 1619, 4617, 4618, 4619] persons= [1621, 1622, 1623] +--- sas= [] onegbh_slice1617 crp= 1 +--- 'expires': 1167127524 +1619 None onegbi_slice1618 nodes= [1618, 1619, 1620, 4618, 4619, 4620] persons= [1622, 1623, 1624] +--- sas= [] onegbi_slice1618 crp= 1 +--- 'expires': 1167127525 +1620 None onegbj_slice1619 nodes= [1619, 1620, 1621, 4619, 4620, 4621] persons= [1623, 1624, 1625] +--- sas= [] onegbj_slice1619 crp= 1 +--- 'expires': 1167127527 +1621 None onegca_slice1620 nodes= [1620, 1621, 1622, 4620, 4621, 4622] persons= [1624, 1625, 1626] +--- sas= [] onegca_slice1620 crp= 1 +--- 'expires': 1167127529 +1622 None onegcb_slice1621 nodes= [1621, 1622, 1623, 4621, 4622, 4623] persons= [1625, 1626, 1627] +--- sas= [] onegcb_slice1621 crp= 1 +--- 'expires': 1167127530 +1623 None onegcc_slice1622 nodes= [1622, 1623, 1624, 4622, 4623, 4624] persons= [1626, 1627, 1628] +--- sas= [] onegcc_slice1622 crp= 1 +--- 'expires': 1167127532 +1624 None onegcd_slice1623 nodes= [1623, 1624, 1625, 4623, 4624, 4625] persons= [1627, 1628, 1629] +--- sas= [] onegcd_slice1623 crp= 1 +--- 'expires': 1167127533 +1625 None onegce_slice1624 nodes= [1624, 1625, 1626, 4624, 4625, 4626] persons= [1628, 1629, 1630] +--- sas= [] onegce_slice1624 crp= 1 +--- 'expires': 1167127535 +1626 None onegcf_slice1625 nodes= [1625, 1626, 1627, 4625, 4626, 4627] persons= [1629, 1630, 1631] +--- sas= [] onegcf_slice1625 crp= 1 +--- 'expires': 1167127536 +1627 None onegcg_slice1626 nodes= [1626, 1627, 1628, 4626, 4627, 4628] persons= [1630, 1631, 1632] +--- sas= [] onegcg_slice1626 crp= 1 +--- 'expires': 1167127538 +1628 None onegch_slice1627 nodes= [1627, 1628, 1629, 4627, 4628, 4629] persons= [1631, 1632, 1633] +--- sas= [] onegch_slice1627 crp= 1 +--- 'expires': 1167127539 +1629 None onegci_slice1628 nodes= [1628, 1629, 1630, 4628, 4629, 4630] persons= [1632, 1633, 1634] +--- sas= [] onegci_slice1628 crp= 1 +--- 'expires': 1167127541 +1630 None onegcj_slice1629 nodes= [1629, 1630, 1631, 4629, 4630, 4631] persons= [1633, 1634, 1635] +--- sas= [] onegcj_slice1629 crp= 1 +--- 'expires': 1167127542 +1631 None onegda_slice1630 nodes= [1630, 1631, 1632, 4630, 4631, 4632] persons= [1634, 1635, 1636] +--- sas= [] onegda_slice1630 crp= 1 +--- 'expires': 1167127544 +1632 None onegdb_slice1631 nodes= [1631, 1632, 1633, 4631, 4632, 4633] persons= [1635, 1636, 1637] +--- sas= [] onegdb_slice1631 crp= 1 +--- 'expires': 1167127545 +1633 None onegdc_slice1632 nodes= [1632, 1633, 1634, 4632, 4633, 4634] persons= [1636, 1637, 1638] +--- sas= [] onegdc_slice1632 crp= 1 +--- 'expires': 1167127547 +1634 None onegdd_slice1633 nodes= [1633, 1634, 1635, 4633, 4634, 4635] persons= [1637, 1638, 1639] +--- sas= [] onegdd_slice1633 crp= 1 +--- 'expires': 1167127548 +1635 None onegde_slice1634 nodes= [1634, 1635, 1636, 4634, 4635, 4636] persons= [1638, 1639, 1640] +--- sas= [] onegde_slice1634 crp= 1 +--- 'expires': 1167127550 +1636 None onegdf_slice1635 nodes= [1635, 1636, 1637, 4635, 4636, 4637] persons= [1639, 1640, 1641] +--- sas= [] onegdf_slice1635 crp= 1 +--- 'expires': 1167127551 +1637 None onegdg_slice1636 nodes= [1636, 1637, 1638, 4636, 4637, 4638] persons= [1640, 1641, 1642] +--- sas= [] onegdg_slice1636 crp= 1 +--- 'expires': 1167127553 +1638 None onegdh_slice1637 nodes= [1637, 1638, 1639, 4637, 4638, 4639] persons= [1641, 1642, 1643] +--- sas= [] onegdh_slice1637 crp= 1 +--- 'expires': 1167127554 +1639 None onegdi_slice1638 nodes= [1638, 1639, 1640, 4638, 4639, 4640] persons= [1642, 1643, 1644] +--- sas= [] onegdi_slice1638 crp= 1 +--- 'expires': 1167127556 +1640 None onegdj_slice1639 nodes= [1639, 1640, 1641, 4639, 4640, 4641] persons= [1643, 1644, 1645] +--- sas= [] onegdj_slice1639 crp= 1 +--- 'expires': 1167127557 +1641 None onegea_slice1640 nodes= [1640, 1641, 1642, 4640, 4641, 4642] persons= [1644, 1645, 1646] +--- sas= [] onegea_slice1640 crp= 1 +--- 'expires': 1167127559 +1642 None onegeb_slice1641 nodes= [1641, 1642, 1643, 4641, 4642, 4643] persons= [1645, 1646, 1647] +--- sas= [] onegeb_slice1641 crp= 1 +--- 'expires': 1167127560 +1643 None onegec_slice1642 nodes= [1642, 1643, 1644, 4642, 4643, 4644] persons= [1646, 1647, 1648] +--- sas= [] onegec_slice1642 crp= 1 +--- 'expires': 1167127562 +1644 None oneged_slice1643 nodes= [1643, 1644, 1645, 4643, 4644, 4645] persons= [1647, 1648, 1649] +--- sas= [] oneged_slice1643 crp= 1 +--- 'expires': 1167127563 +1645 None onegee_slice1644 nodes= [1644, 1645, 1646, 4644, 4645, 4646] persons= [1648, 1649, 1650] +--- sas= [] onegee_slice1644 crp= 1 +--- 'expires': 1167127565 +1646 None onegef_slice1645 nodes= [1645, 1646, 1647, 4645, 4646, 4647] persons= [1649, 1650, 1651] +--- sas= [] onegef_slice1645 crp= 1 +--- 'expires': 1167127566 +1647 None onegeg_slice1646 nodes= [1646, 1647, 1648, 4646, 4647, 4648] persons= [1650, 1651, 1652] +--- sas= [] onegeg_slice1646 crp= 1 +--- 'expires': 1167127568 +1648 None onegeh_slice1647 nodes= [1647, 1648, 1649, 4647, 4648, 4649] persons= [1651, 1652, 1653] +--- sas= [] onegeh_slice1647 crp= 1 +--- 'expires': 1167127570 +1649 None onegei_slice1648 nodes= [1648, 1649, 1650, 4648, 4649, 4650] persons= [1652, 1653, 1654] +--- sas= [] onegei_slice1648 crp= 1 +--- 'expires': 1167127571 +1650 None onegej_slice1649 nodes= [1649, 1650, 1651, 4649, 4650, 4651] persons= [1653, 1654, 1655] +--- sas= [] onegej_slice1649 crp= 1 +--- 'expires': 1167127573 +1651 None onegfa_slice1650 nodes= [1650, 1651, 1652, 4650, 4651, 4652] persons= [1654, 1655, 1656] +--- sas= [] onegfa_slice1650 crp= 1 +--- 'expires': 1167127575 +1652 None onegfb_slice1651 nodes= [1651, 1652, 1653, 4651, 4652, 4653] persons= [1655, 1656, 1657] +--- sas= [] onegfb_slice1651 crp= 1 +--- 'expires': 1167127576 +1653 None onegfc_slice1652 nodes= [1652, 1653, 1654, 4652, 4653, 4654] persons= [1656, 1657, 1658] +--- sas= [] onegfc_slice1652 crp= 1 +--- 'expires': 1167127578 +1654 None onegfd_slice1653 nodes= [1653, 1654, 1655, 4653, 4654, 4655] persons= [1657, 1658, 1659] +--- sas= [] onegfd_slice1653 crp= 1 +--- 'expires': 1167127580 +1655 None onegfe_slice1654 nodes= [1654, 1655, 1656, 4654, 4655, 4656] persons= [1658, 1659, 1660] +--- sas= [] onegfe_slice1654 crp= 1 +--- 'expires': 1167127581 +1656 None onegff_slice1655 nodes= [1655, 1656, 1657, 4655, 4656, 4657] persons= [1659, 1660, 1661] +--- sas= [] onegff_slice1655 crp= 1 +--- 'expires': 1167127583 +1657 None onegfg_slice1656 nodes= [1656, 1657, 1658, 4656, 4657, 4658] persons= [1660, 1661, 1662] +--- sas= [] onegfg_slice1656 crp= 1 +--- 'expires': 1167127584 +1658 None onegfh_slice1657 nodes= [1657, 1658, 1659, 4657, 4658, 4659] persons= [1661, 1662, 1663] +--- sas= [] onegfh_slice1657 crp= 1 +--- 'expires': 1167127586 +1659 None onegfi_slice1658 nodes= [1658, 1659, 1660, 4658, 4659, 4660] persons= [1662, 1663, 1664] +--- sas= [] onegfi_slice1658 crp= 1 +--- 'expires': 1167127587 +1660 None onegfj_slice1659 nodes= [1659, 1660, 1661, 4659, 4660, 4661] persons= [1663, 1664, 1665] +--- sas= [] onegfj_slice1659 crp= 1 +--- 'expires': 1167127589 +1661 None onegga_slice1660 nodes= [1660, 1661, 1662, 4660, 4661, 4662] persons= [1664, 1665, 1666] +--- sas= [] onegga_slice1660 crp= 1 +--- 'expires': 1167127590 +1662 None oneggb_slice1661 nodes= [1661, 1662, 1663, 4661, 4662, 4663] persons= [1665, 1666, 1667] +--- sas= [] oneggb_slice1661 crp= 1 +--- 'expires': 1167127592 +1663 None oneggc_slice1662 nodes= [1662, 1663, 1664, 4662, 4663, 4664] persons= [1666, 1667, 1668] +--- sas= [] oneggc_slice1662 crp= 1 +--- 'expires': 1167127593 +1664 None oneggd_slice1663 nodes= [1663, 1664, 1665, 4663, 4664, 4665] persons= [1667, 1668, 1669] +--- sas= [] oneggd_slice1663 crp= 1 +--- 'expires': 1167127595 +1665 None onegge_slice1664 nodes= [1664, 1665, 1666, 4664, 4665, 4666] persons= [1668, 1669, 1670] +--- sas= [] onegge_slice1664 crp= 1 +--- 'expires': 1167127597 +1666 None oneggf_slice1665 nodes= [1665, 1666, 1667, 4665, 4666, 4667] persons= [1669, 1670, 1671] +--- sas= [] oneggf_slice1665 crp= 1 +--- 'expires': 1167127598 +1667 None oneggg_slice1666 nodes= [1666, 1667, 1668, 4666, 4667, 4668] persons= [1670, 1671, 1672] +--- sas= [] oneggg_slice1666 crp= 1 +--- 'expires': 1167127600 +1668 None oneggh_slice1667 nodes= [1667, 1668, 1669, 4667, 4668, 4669] persons= [1671, 1672, 1673] +--- sas= [] oneggh_slice1667 crp= 1 +--- 'expires': 1167127602 +1669 None oneggi_slice1668 nodes= [1668, 1669, 1670, 4668, 4669, 4670] persons= [1672, 1673, 1674] +--- sas= [] oneggi_slice1668 crp= 1 +--- 'expires': 1167127603 +1670 None oneggj_slice1669 nodes= [1669, 1670, 1671, 4669, 4670, 4671] persons= [1673, 1674, 1675] +--- sas= [] oneggj_slice1669 crp= 1 +--- 'expires': 1167127605 +1671 None onegha_slice1670 nodes= [1670, 1671, 1672, 4670, 4671, 4672] persons= [1674, 1675, 1676] +--- sas= [] onegha_slice1670 crp= 1 +--- 'expires': 1167127606 +1672 None oneghb_slice1671 nodes= [1671, 1672, 1673, 4671, 4672, 4673] persons= [1675, 1676, 1677] +--- sas= [] oneghb_slice1671 crp= 1 +--- 'expires': 1167127608 +1673 None oneghc_slice1672 nodes= [1672, 1673, 1674, 4672, 4673, 4674] persons= [1676, 1677, 1678] +--- sas= [] oneghc_slice1672 crp= 1 +--- 'expires': 1167127609 +1674 None oneghd_slice1673 nodes= [1673, 1674, 1675, 4673, 4674, 4675] persons= [1677, 1678, 1679] +--- sas= [] oneghd_slice1673 crp= 1 +--- 'expires': 1167127611 +1675 None oneghe_slice1674 nodes= [1674, 1675, 1676, 4674, 4675, 4676] persons= [1678, 1679, 1680] +--- sas= [] oneghe_slice1674 crp= 1 +--- 'expires': 1167127612 +1676 None oneghf_slice1675 nodes= [1675, 1676, 1677, 4675, 4676, 4677] persons= [1679, 1680, 1681] +--- sas= [] oneghf_slice1675 crp= 1 +--- 'expires': 1167127614 +1677 None oneghg_slice1676 nodes= [1676, 1677, 1678, 4676, 4677, 4678] persons= [1680, 1681, 1682] +--- sas= [] oneghg_slice1676 crp= 1 +--- 'expires': 1167127616 +1678 None oneghh_slice1677 nodes= [1677, 1678, 1679, 4677, 4678, 4679] persons= [1681, 1682, 1683] +--- sas= [] oneghh_slice1677 crp= 1 +--- 'expires': 1167127617 +1679 None oneghi_slice1678 nodes= [1678, 1679, 1680, 4678, 4679, 4680] persons= [1682, 1683, 1684] +--- sas= [] oneghi_slice1678 crp= 1 +--- 'expires': 1167127619 +1680 None oneghj_slice1679 nodes= [1679, 1680, 1681, 4679, 4680, 4681] persons= [1683, 1684, 1685] +--- sas= [] oneghj_slice1679 crp= 1 +--- 'expires': 1167127620 +1681 None onegia_slice1680 nodes= [1680, 1681, 1682, 4680, 4681, 4682] persons= [1684, 1685, 1686] +--- sas= [] onegia_slice1680 crp= 1 +--- 'expires': 1167127622 +1682 None onegib_slice1681 nodes= [1681, 1682, 1683, 4681, 4682, 4683] persons= [1685, 1686, 1687] +--- sas= [] onegib_slice1681 crp= 1 +--- 'expires': 1167127623 +1683 None onegic_slice1682 nodes= [1682, 1683, 1684, 4682, 4683, 4684] persons= [1686, 1687, 1688] +--- sas= [] onegic_slice1682 crp= 1 +--- 'expires': 1167127625 +1684 None onegid_slice1683 nodes= [1683, 1684, 1685, 4683, 4684, 4685] persons= [1687, 1688, 1689] +--- sas= [] onegid_slice1683 crp= 1 +--- 'expires': 1167127627 +1685 None onegie_slice1684 nodes= [1684, 1685, 1686, 4684, 4685, 4686] persons= [1688, 1689, 1690] +--- sas= [] onegie_slice1684 crp= 1 +--- 'expires': 1167127628 +1686 None onegif_slice1685 nodes= [1685, 1686, 1687, 4685, 4686, 4687] persons= [1689, 1690, 1691] +--- sas= [] onegif_slice1685 crp= 1 +--- 'expires': 1167127630 +1687 None onegig_slice1686 nodes= [1686, 1687, 1688, 4686, 4687, 4688] persons= [1690, 1691, 1692] +--- sas= [] onegig_slice1686 crp= 1 +--- 'expires': 1167127631 +1688 None onegih_slice1687 nodes= [1687, 1688, 1689, 4687, 4688, 4689] persons= [1691, 1692, 1693] +--- sas= [] onegih_slice1687 crp= 1 +--- 'expires': 1167127633 +1689 None onegii_slice1688 nodes= [1688, 1689, 1690, 4688, 4689, 4690] persons= [1692, 1693, 1694] +--- sas= [] onegii_slice1688 crp= 1 +--- 'expires': 1167127634 +1690 None onegij_slice1689 nodes= [1689, 1690, 1691, 4689, 4690, 4691] persons= [1693, 1694, 1695] +--- sas= [] onegij_slice1689 crp= 1 +--- 'expires': 1167127636 +1691 None onegja_slice1690 nodes= [1690, 1691, 1692, 4690, 4691, 4692] persons= [1694, 1695, 1696] +--- sas= [] onegja_slice1690 crp= 1 +--- 'expires': 1167127637 +1692 None onegjb_slice1691 nodes= [1691, 1692, 1693, 4691, 4692, 4693] persons= [1695, 1696, 1697] +--- sas= [] onegjb_slice1691 crp= 1 +--- 'expires': 1167127639 +1693 None onegjc_slice1692 nodes= [1692, 1693, 1694, 4692, 4693, 4694] persons= [1696, 1697, 1698] +--- sas= [] onegjc_slice1692 crp= 1 +--- 'expires': 1167127640 +1694 None onegjd_slice1693 nodes= [1693, 1694, 1695, 4693, 4694, 4695] persons= [1697, 1698, 1699] +--- sas= [] onegjd_slice1693 crp= 1 +--- 'expires': 1167127642 +1695 None onegje_slice1694 nodes= [1694, 1695, 1696, 4694, 4695, 4696] persons= [1698, 1699, 1700] +--- sas= [] onegje_slice1694 crp= 1 +--- 'expires': 1167127644 +1696 None onegjf_slice1695 nodes= [1695, 1696, 1697, 4695, 4696, 4697] persons= [1699, 1700, 1701] +--- sas= [] onegjf_slice1695 crp= 1 +--- 'expires': 1167127645 +1697 None onegjg_slice1696 nodes= [1696, 1697, 1698, 4696, 4697, 4698] persons= [1700, 1701, 1702] +--- sas= [] onegjg_slice1696 crp= 1 +--- 'expires': 1167127647 +1698 None onegjh_slice1697 nodes= [1697, 1698, 1699, 4697, 4698, 4699] persons= [1701, 1702, 1703] +--- sas= [] onegjh_slice1697 crp= 1 +--- 'expires': 1167127648 +1699 None onegji_slice1698 nodes= [1698, 1699, 1700, 4698, 4699, 4700] persons= [1702, 1703, 1704] +--- sas= [] onegji_slice1698 crp= 1 +--- 'expires': 1167127650 +1700 None onegjj_slice1699 nodes= [1699, 1700, 1701, 4699, 4700, 4701] persons= [1703, 1704, 1705] +--- sas= [] onegjj_slice1699 crp= 1 +--- 'expires': 1167127651 +1701 None onehaa_slice1700 nodes= [1700, 1701, 1702, 4700, 4701, 4702] persons= [1704, 1705, 1706] +--- sas= [] onehaa_slice1700 crp= 1 +--- 'expires': 1167127653 +1702 None onehab_slice1701 nodes= [1701, 1702, 1703, 4701, 4702, 4703] persons= [1705, 1706, 1707] +--- sas= [] onehab_slice1701 crp= 1 +--- 'expires': 1167127655 +1703 None onehac_slice1702 nodes= [1702, 1703, 1704, 4702, 4703, 4704] persons= [1706, 1707, 1708] +--- sas= [] onehac_slice1702 crp= 1 +--- 'expires': 1167127656 +1704 None onehad_slice1703 nodes= [1703, 1704, 1705, 4703, 4704, 4705] persons= [1707, 1708, 1709] +--- sas= [] onehad_slice1703 crp= 1 +--- 'expires': 1167127658 +1705 None onehae_slice1704 nodes= [1704, 1705, 1706, 4704, 4705, 4706] persons= [1708, 1709, 1710] +--- sas= [] onehae_slice1704 crp= 1 +--- 'expires': 1167127659 +1706 None onehaf_slice1705 nodes= [1705, 1706, 1707, 4705, 4706, 4707] persons= [1709, 1710, 1711] +--- sas= [] onehaf_slice1705 crp= 1 +--- 'expires': 1167127661 +1707 None onehag_slice1706 nodes= [1706, 1707, 1708, 4706, 4707, 4708] persons= [1710, 1711, 1712] +--- sas= [] onehag_slice1706 crp= 1 +--- 'expires': 1167127662 +1708 None onehah_slice1707 nodes= [1707, 1708, 1709, 4707, 4708, 4709] persons= [1711, 1712, 1713] +--- sas= [] onehah_slice1707 crp= 1 +--- 'expires': 1167127664 +1709 None onehai_slice1708 nodes= [1708, 1709, 1710, 4708, 4709, 4710] persons= [1712, 1713, 1714] +--- sas= [] onehai_slice1708 crp= 1 +--- 'expires': 1167127666 +1710 None onehaj_slice1709 nodes= [1709, 1710, 1711, 4709, 4710, 4711] persons= [1713, 1714, 1715] +--- sas= [] onehaj_slice1709 crp= 1 +--- 'expires': 1167127667 +1711 None onehba_slice1710 nodes= [1710, 1711, 1712, 4710, 4711, 4712] persons= [1714, 1715, 1716] +--- sas= [] onehba_slice1710 crp= 1 +--- 'expires': 1167127669 +1712 None onehbb_slice1711 nodes= [1711, 1712, 1713, 4711, 4712, 4713] persons= [1715, 1716, 1717] +--- sas= [] onehbb_slice1711 crp= 1 +--- 'expires': 1167127670 +1713 None onehbc_slice1712 nodes= [1712, 1713, 1714, 4712, 4713, 4714] persons= [1716, 1717, 1718] +--- sas= [] onehbc_slice1712 crp= 1 +--- 'expires': 1167127672 +1714 None onehbd_slice1713 nodes= [1713, 1714, 1715, 4713, 4714, 4715] persons= [1717, 1718, 1719] +--- sas= [] onehbd_slice1713 crp= 1 +--- 'expires': 1167127673 +1715 None onehbe_slice1714 nodes= [1714, 1715, 1716, 4714, 4715, 4716] persons= [1718, 1719, 1720] +--- sas= [] onehbe_slice1714 crp= 1 +--- 'expires': 1167127675 +1716 None onehbf_slice1715 nodes= [1715, 1716, 1717, 4715, 4716, 4717] persons= [1719, 1720, 1721] +--- sas= [] onehbf_slice1715 crp= 1 +--- 'expires': 1167127677 +1717 None onehbg_slice1716 nodes= [1716, 1717, 1718, 4716, 4717, 4718] persons= [1720, 1721, 1722] +--- sas= [] onehbg_slice1716 crp= 1 +--- 'expires': 1167127678 +1718 None onehbh_slice1717 nodes= [1717, 1718, 1719, 4717, 4718, 4719] persons= [1721, 1722, 1723] +--- sas= [] onehbh_slice1717 crp= 1 +--- 'expires': 1167127680 +1719 None onehbi_slice1718 nodes= [1718, 1719, 1720, 4718, 4719, 4720] persons= [1722, 1723, 1724] +--- sas= [] onehbi_slice1718 crp= 1 +--- 'expires': 1167127681 +1720 None onehbj_slice1719 nodes= [1719, 1720, 1721, 4719, 4720, 4721] persons= [1723, 1724, 1725] +--- sas= [] onehbj_slice1719 crp= 1 +--- 'expires': 1167127683 +1721 None onehca_slice1720 nodes= [1720, 1721, 1722, 4720, 4721, 4722] persons= [1724, 1725, 1726] +--- sas= [] onehca_slice1720 crp= 1 +--- 'expires': 1167127685 +1722 None onehcb_slice1721 nodes= [1721, 1722, 1723, 4721, 4722, 4723] persons= [1725, 1726, 1727] +--- sas= [] onehcb_slice1721 crp= 1 +--- 'expires': 1167127686 +1723 None onehcc_slice1722 nodes= [1722, 1723, 1724, 4722, 4723, 4724] persons= [1726, 1727, 1728] +--- sas= [] onehcc_slice1722 crp= 1 +--- 'expires': 1167127688 +1724 None onehcd_slice1723 nodes= [1723, 1724, 1725, 4723, 4724, 4725] persons= [1727, 1728, 1729] +--- sas= [] onehcd_slice1723 crp= 1 +--- 'expires': 1167127689 +1725 None onehce_slice1724 nodes= [1724, 1725, 1726, 4724, 4725, 4726] persons= [1728, 1729, 1730] +--- sas= [] onehce_slice1724 crp= 1 +--- 'expires': 1167127691 +1726 None onehcf_slice1725 nodes= [1725, 1726, 1727, 4725, 4726, 4727] persons= [1729, 1730, 1731] +--- sas= [] onehcf_slice1725 crp= 1 +--- 'expires': 1167127693 +1727 None onehcg_slice1726 nodes= [1726, 1727, 1728, 4726, 4727, 4728] persons= [1730, 1731, 1732] +--- sas= [] onehcg_slice1726 crp= 1 +--- 'expires': 1167127694 +1728 None onehch_slice1727 nodes= [1727, 1728, 1729, 4727, 4728, 4729] persons= [1731, 1732, 1733] +--- sas= [] onehch_slice1727 crp= 1 +--- 'expires': 1167127696 +1729 None onehci_slice1728 nodes= [1728, 1729, 1730, 4728, 4729, 4730] persons= [1732, 1733, 1734] +--- sas= [] onehci_slice1728 crp= 1 +--- 'expires': 1167127697 +1730 None onehcj_slice1729 nodes= [1729, 1730, 1731, 4729, 4730, 4731] persons= [1733, 1734, 1735] +--- sas= [] onehcj_slice1729 crp= 1 +--- 'expires': 1167127699 +1731 None onehda_slice1730 nodes= [1730, 1731, 1732, 4730, 4731, 4732] persons= [1734, 1735, 1736] +--- sas= [] onehda_slice1730 crp= 1 +--- 'expires': 1167127700 +1732 None onehdb_slice1731 nodes= [1731, 1732, 1733, 4731, 4732, 4733] persons= [1735, 1736, 1737] +--- sas= [] onehdb_slice1731 crp= 1 +--- 'expires': 1167127702 +1733 None onehdc_slice1732 nodes= [1732, 1733, 1734, 4732, 4733, 4734] persons= [1736, 1737, 1738] +--- sas= [] onehdc_slice1732 crp= 1 +--- 'expires': 1167127704 +1734 None onehdd_slice1733 nodes= [1733, 1734, 1735, 4733, 4734, 4735] persons= [1737, 1738, 1739] +--- sas= [] onehdd_slice1733 crp= 1 +--- 'expires': 1167127705 +1735 None onehde_slice1734 nodes= [1734, 1735, 1736, 4734, 4735, 4736] persons= [1738, 1739, 1740] +--- sas= [] onehde_slice1734 crp= 1 +--- 'expires': 1167127706 +1736 None onehdf_slice1735 nodes= [1735, 1736, 1737, 4735, 4736, 4737] persons= [1739, 1740, 1741] +--- sas= [] onehdf_slice1735 crp= 1 +--- 'expires': 1167127708 +1737 None onehdg_slice1736 nodes= [1736, 1737, 1738, 4736, 4737, 4738] persons= [1740, 1741, 1742] +--- sas= [] onehdg_slice1736 crp= 1 +--- 'expires': 1167127709 +1738 None onehdh_slice1737 nodes= [1737, 1738, 1739, 4737, 4738, 4739] persons= [1741, 1742, 1743] +--- sas= [] onehdh_slice1737 crp= 1 +--- 'expires': 1167127711 +1739 None onehdi_slice1738 nodes= [1738, 1739, 1740, 4738, 4739, 4740] persons= [1742, 1743, 1744] +--- sas= [] onehdi_slice1738 crp= 1 +--- 'expires': 1167127713 +1740 None onehdj_slice1739 nodes= [1739, 1740, 1741, 4739, 4740, 4741] persons= [1743, 1744, 1745] +--- sas= [] onehdj_slice1739 crp= 1 +--- 'expires': 1167127714 +1741 None onehea_slice1740 nodes= [1740, 1741, 1742, 4740, 4741, 4742] persons= [1744, 1745, 1746] +--- sas= [] onehea_slice1740 crp= 1 +--- 'expires': 1167127716 +1742 None oneheb_slice1741 nodes= [1741, 1742, 1743, 4741, 4742, 4743] persons= [1745, 1746, 1747] +--- sas= [] oneheb_slice1741 crp= 1 +--- 'expires': 1167127717 +1743 None onehec_slice1742 nodes= [1742, 1743, 1744, 4742, 4743, 4744] persons= [1746, 1747, 1748] +--- sas= [] onehec_slice1742 crp= 1 +--- 'expires': 1167127719 +1744 None onehed_slice1743 nodes= [1743, 1744, 1745, 4743, 4744, 4745] persons= [1747, 1748, 1749] +--- sas= [] onehed_slice1743 crp= 1 +--- 'expires': 1167127720 +1745 None onehee_slice1744 nodes= [1744, 1745, 1746, 4744, 4745, 4746] persons= [1748, 1749, 1750] +--- sas= [] onehee_slice1744 crp= 1 +--- 'expires': 1167127722 +1746 None onehef_slice1745 nodes= [1745, 1746, 1747, 4745, 4746, 4747] persons= [1749, 1750, 1751] +--- sas= [] onehef_slice1745 crp= 1 +--- 'expires': 1167127724 +1747 None oneheg_slice1746 nodes= [1746, 1747, 1748, 4746, 4747, 4748] persons= [1750, 1751, 1752] +--- sas= [] oneheg_slice1746 crp= 1 +--- 'expires': 1167127725 +1748 None oneheh_slice1747 nodes= [1747, 1748, 1749, 4747, 4748, 4749] persons= [1751, 1752, 1753] +--- sas= [] oneheh_slice1747 crp= 1 +--- 'expires': 1167127727 +1749 None onehei_slice1748 nodes= [1748, 1749, 1750, 4748, 4749, 4750] persons= [1752, 1753, 1754] +--- sas= [] onehei_slice1748 crp= 1 +--- 'expires': 1167127728 +1750 None onehej_slice1749 nodes= [1749, 1750, 1751, 4749, 4750, 4751] persons= [1753, 1754, 1755] +--- sas= [] onehej_slice1749 crp= 1 +--- 'expires': 1167127730 +1751 None onehfa_slice1750 nodes= [1750, 1751, 1752, 4750, 4751, 4752] persons= [1754, 1755, 1756] +--- sas= [] onehfa_slice1750 crp= 1 +--- 'expires': 1167127732 +1752 None onehfb_slice1751 nodes= [1751, 1752, 1753, 4751, 4752, 4753] persons= [1755, 1756, 1757] +--- sas= [] onehfb_slice1751 crp= 1 +--- 'expires': 1167127733 +1753 None onehfc_slice1752 nodes= [1752, 1753, 1754, 4752, 4753, 4754] persons= [1756, 1757, 1758] +--- sas= [] onehfc_slice1752 crp= 1 +--- 'expires': 1167127735 +1754 None onehfd_slice1753 nodes= [1753, 1754, 1755, 4753, 4754, 4755] persons= [1757, 1758, 1759] +--- sas= [] onehfd_slice1753 crp= 1 +--- 'expires': 1167127737 +1755 None onehfe_slice1754 nodes= [1754, 1755, 1756, 4754, 4755, 4756] persons= [1758, 1759, 1760] +--- sas= [] onehfe_slice1754 crp= 1 +--- 'expires': 1167127739 +1756 None onehff_slice1755 nodes= [1755, 1756, 1757, 4755, 4756, 4757] persons= [1759, 1760, 1761] +--- sas= [] onehff_slice1755 crp= 1 +--- 'expires': 1167127740 +1757 None onehfg_slice1756 nodes= [1756, 1757, 1758, 4756, 4757, 4758] persons= [1760, 1761, 1762] +--- sas= [] onehfg_slice1756 crp= 1 +--- 'expires': 1167127742 +1758 None onehfh_slice1757 nodes= [1757, 1758, 1759, 4757, 4758, 4759] persons= [1761, 1762, 1763] +--- sas= [] onehfh_slice1757 crp= 1 +--- 'expires': 1167127743 +1759 None onehfi_slice1758 nodes= [1758, 1759, 1760, 4758, 4759, 4760] persons= [1762, 1763, 1764] +--- sas= [] onehfi_slice1758 crp= 1 +--- 'expires': 1167127745 +1760 None onehfj_slice1759 nodes= [1759, 1760, 1761, 4759, 4760, 4761] persons= [1763, 1764, 1765] +--- sas= [] onehfj_slice1759 crp= 1 +--- 'expires': 1167127746 +1761 None onehga_slice1760 nodes= [1760, 1761, 1762, 4760, 4761, 4762] persons= [1764, 1765, 1766] +--- sas= [] onehga_slice1760 crp= 1 +--- 'expires': 1167127748 +1762 None onehgb_slice1761 nodes= [1761, 1762, 1763, 4761, 4762, 4763] persons= [1765, 1766, 1767] +--- sas= [] onehgb_slice1761 crp= 1 +--- 'expires': 1167127750 +1763 None onehgc_slice1762 nodes= [1762, 1763, 1764, 4762, 4763, 4764] persons= [1766, 1767, 1768] +--- sas= [] onehgc_slice1762 crp= 1 +--- 'expires': 1167127751 +1764 None onehgd_slice1763 nodes= [1763, 1764, 1765, 4763, 4764, 4765] persons= [1767, 1768, 1769] +--- sas= [] onehgd_slice1763 crp= 1 +--- 'expires': 1167127753 +1765 None onehge_slice1764 nodes= [1764, 1765, 1766, 4764, 4765, 4766] persons= [1768, 1769, 1770] +--- sas= [] onehge_slice1764 crp= 1 +--- 'expires': 1167127755 +1766 None onehgf_slice1765 nodes= [1765, 1766, 1767, 4765, 4766, 4767] persons= [1769, 1770, 1771] +--- sas= [] onehgf_slice1765 crp= 1 +--- 'expires': 1167127756 +1767 None onehgg_slice1766 nodes= [1766, 1767, 1768, 4766, 4767, 4768] persons= [1770, 1771, 1772] +--- sas= [] onehgg_slice1766 crp= 1 +--- 'expires': 1167127758 +1768 None onehgh_slice1767 nodes= [1767, 1768, 1769, 4767, 4768, 4769] persons= [1771, 1772, 1773] +--- sas= [] onehgh_slice1767 crp= 1 +--- 'expires': 1167127759 +1769 None onehgi_slice1768 nodes= [1768, 1769, 1770, 4768, 4769, 4770] persons= [1772, 1773, 1774] +--- sas= [] onehgi_slice1768 crp= 1 +--- 'expires': 1167127761 +1770 None onehgj_slice1769 nodes= [1769, 1770, 1771, 4769, 4770, 4771] persons= [1773, 1774, 1775] +--- sas= [] onehgj_slice1769 crp= 1 +--- 'expires': 1167127762 +1771 None onehha_slice1770 nodes= [1770, 1771, 1772, 4770, 4771, 4772] persons= [1774, 1775, 1776] +--- sas= [] onehha_slice1770 crp= 1 +--- 'expires': 1167127764 +1772 None onehhb_slice1771 nodes= [1771, 1772, 1773, 4771, 4772, 4773] persons= [1775, 1776, 1777] +--- sas= [] onehhb_slice1771 crp= 1 +--- 'expires': 1167127766 +1773 None onehhc_slice1772 nodes= [1772, 1773, 1774, 4772, 4773, 4774] persons= [1776, 1777, 1778] +--- sas= [] onehhc_slice1772 crp= 1 +--- 'expires': 1167127767 +1774 None onehhd_slice1773 nodes= [1773, 1774, 1775, 4773, 4774, 4775] persons= [1777, 1778, 1779] +--- sas= [] onehhd_slice1773 crp= 1 +--- 'expires': 1167127769 +1775 None onehhe_slice1774 nodes= [1774, 1775, 1776, 4774, 4775, 4776] persons= [1778, 1779, 1780] +--- sas= [] onehhe_slice1774 crp= 1 +--- 'expires': 1167127771 +1776 None onehhf_slice1775 nodes= [1775, 1776, 1777, 4775, 4776, 4777] persons= [1779, 1780, 1781] +--- sas= [] onehhf_slice1775 crp= 1 +--- 'expires': 1167127772 +1777 None onehhg_slice1776 nodes= [1776, 1777, 1778, 4776, 4777, 4778] persons= [1780, 1781, 1782] +--- sas= [] onehhg_slice1776 crp= 1 +--- 'expires': 1167127774 +1778 None onehhh_slice1777 nodes= [1777, 1778, 1779, 4777, 4778, 4779] persons= [1781, 1782, 1783] +--- sas= [] onehhh_slice1777 crp= 1 +--- 'expires': 1167127775 +1779 None onehhi_slice1778 nodes= [1778, 1779, 1780, 4778, 4779, 4780] persons= [1782, 1783, 1784] +--- sas= [] onehhi_slice1778 crp= 1 +--- 'expires': 1167127777 +1780 None onehhj_slice1779 nodes= [1779, 1780, 1781, 4779, 4780, 4781] persons= [1783, 1784, 1785] +--- sas= [] onehhj_slice1779 crp= 1 +--- 'expires': 1167127779 +1781 None onehia_slice1780 nodes= [1780, 1781, 1782, 4780, 4781, 4782] persons= [1784, 1785, 1786] +--- sas= [] onehia_slice1780 crp= 1 +--- 'expires': 1167127781 +1782 None onehib_slice1781 nodes= [1781, 1782, 1783, 4781, 4782, 4783] persons= [1785, 1786, 1787] +--- sas= [] onehib_slice1781 crp= 1 +--- 'expires': 1167127782 +1783 None onehic_slice1782 nodes= [1782, 1783, 1784, 4782, 4783, 4784] persons= [1786, 1787, 1788] +--- sas= [] onehic_slice1782 crp= 1 +--- 'expires': 1167127784 +1784 None onehid_slice1783 nodes= [1783, 1784, 1785, 4783, 4784, 4785] persons= [1787, 1788, 1789] +--- sas= [] onehid_slice1783 crp= 1 +--- 'expires': 1167127785 +1785 None onehie_slice1784 nodes= [1784, 1785, 1786, 4784, 4785, 4786] persons= [1788, 1789, 1790] +--- sas= [] onehie_slice1784 crp= 1 +--- 'expires': 1167127787 +1786 None onehif_slice1785 nodes= [1785, 1786, 1787, 4785, 4786, 4787] persons= [1789, 1790, 1791] +--- sas= [] onehif_slice1785 crp= 1 +--- 'expires': 1167127789 +1787 None onehig_slice1786 nodes= [1786, 1787, 1788, 4786, 4787, 4788] persons= [1790, 1791, 1792] +--- sas= [] onehig_slice1786 crp= 1 +--- 'expires': 1167127791 +1788 None onehih_slice1787 nodes= [1787, 1788, 1789, 4787, 4788, 4789] persons= [1791, 1792, 1793] +--- sas= [] onehih_slice1787 crp= 1 +--- 'expires': 1167127792 +1789 None onehii_slice1788 nodes= [1788, 1789, 1790, 4788, 4789, 4790] persons= [1792, 1793, 1794] +--- sas= [] onehii_slice1788 crp= 1 +--- 'expires': 1167127794 +1790 None onehij_slice1789 nodes= [1789, 1790, 1791, 4789, 4790, 4791] persons= [1793, 1794, 1795] +--- sas= [] onehij_slice1789 crp= 1 +--- 'expires': 1167127795 +1791 None onehja_slice1790 nodes= [1790, 1791, 1792, 4790, 4791, 4792] persons= [1794, 1795, 1796] +--- sas= [] onehja_slice1790 crp= 1 +--- 'expires': 1167127797 +1792 None onehjb_slice1791 nodes= [1791, 1792, 1793, 4791, 4792, 4793] persons= [1795, 1796, 1797] +--- sas= [] onehjb_slice1791 crp= 1 +--- 'expires': 1167127799 +1793 None onehjc_slice1792 nodes= [1792, 1793, 1794, 4792, 4793, 4794] persons= [1796, 1797, 1798] +--- sas= [] onehjc_slice1792 crp= 1 +--- 'expires': 1167127800 +1794 None onehjd_slice1793 nodes= [1793, 1794, 1795, 4793, 4794, 4795] persons= [1797, 1798, 1799] +--- sas= [] onehjd_slice1793 crp= 1 +--- 'expires': 1167127803 +1795 None onehje_slice1794 nodes= [1794, 1795, 1796, 4794, 4795, 4796] persons= [1798, 1799, 1800] +--- sas= [] onehje_slice1794 crp= 1 +--- 'expires': 1167127804 +1796 None onehjf_slice1795 nodes= [1795, 1796, 1797, 4795, 4796, 4797] persons= [1799, 1800, 1801] +--- sas= [] onehjf_slice1795 crp= 1 +--- 'expires': 1167127806 +1797 None onehjg_slice1796 nodes= [1796, 1797, 1798, 4796, 4797, 4798] persons= [1800, 1801, 1802] +--- sas= [] onehjg_slice1796 crp= 1 +--- 'expires': 1167127808 +1798 None onehjh_slice1797 nodes= [1797, 1798, 1799, 4797, 4798, 4799] persons= [1801, 1802, 1803] +--- sas= [] onehjh_slice1797 crp= 1 +--- 'expires': 1167127809 +1799 None onehji_slice1798 nodes= [1798, 1799, 1800, 4798, 4799, 4800] persons= [1802, 1803, 1804] +--- sas= [] onehji_slice1798 crp= 1 +--- 'expires': 1167127811 +1800 None onehjj_slice1799 nodes= [1799, 1800, 1801, 4799, 4800, 4801] persons= [1803, 1804, 1805] +--- sas= [] onehjj_slice1799 crp= 1 +--- 'expires': 1167127813 +1801 None oneiaa_slice1800 nodes= [1800, 1801, 1802, 4800, 4801, 4802] persons= [1804, 1805, 1806] +--- sas= [] oneiaa_slice1800 crp= 1 +--- 'expires': 1167127814 +1802 None oneiab_slice1801 nodes= [1801, 1802, 1803, 4801, 4802, 4803] persons= [1805, 1806, 1807] +--- sas= [] oneiab_slice1801 crp= 1 +--- 'expires': 1167127816 +1803 None oneiac_slice1802 nodes= [1802, 1803, 1804, 4802, 4803, 4804] persons= [1806, 1807, 1808] +--- sas= [] oneiac_slice1802 crp= 1 +--- 'expires': 1167127817 +1804 None oneiad_slice1803 nodes= [1803, 1804, 1805, 4803, 4804, 4805] persons= [1807, 1808, 1809] +--- sas= [] oneiad_slice1803 crp= 1 +--- 'expires': 1167127819 +1805 None oneiae_slice1804 nodes= [1804, 1805, 1806, 4804, 4805, 4806] persons= [1808, 1809, 1810] +--- sas= [] oneiae_slice1804 crp= 1 +--- 'expires': 1167127820 +1806 None oneiaf_slice1805 nodes= [1805, 1806, 1807, 4805, 4806, 4807] persons= [1809, 1810, 1811] +--- sas= [] oneiaf_slice1805 crp= 1 +--- 'expires': 1167127822 +1807 None oneiag_slice1806 nodes= [1806, 1807, 1808, 4806, 4807, 4808] persons= [1810, 1811, 1812] +--- sas= [] oneiag_slice1806 crp= 1 +--- 'expires': 1167127824 +1808 None oneiah_slice1807 nodes= [1807, 1808, 1809, 4807, 4808, 4809] persons= [1811, 1812, 1813] +--- sas= [] oneiah_slice1807 crp= 1 +--- 'expires': 1167127825 +1809 None oneiai_slice1808 nodes= [1808, 1809, 1810, 4808, 4809, 4810] persons= [1812, 1813, 1814] +--- sas= [] oneiai_slice1808 crp= 1 +--- 'expires': 1167127827 +1810 None oneiaj_slice1809 nodes= [1809, 1810, 1811, 4809, 4810, 4811] persons= [1813, 1814, 1815] +--- sas= [] oneiaj_slice1809 crp= 1 +--- 'expires': 1167127829 +1811 None oneiba_slice1810 nodes= [1810, 1811, 1812, 4810, 4811, 4812] persons= [1814, 1815, 1816] +--- sas= [] oneiba_slice1810 crp= 1 +--- 'expires': 1167127830 +1812 None oneibb_slice1811 nodes= [1811, 1812, 1813, 4811, 4812, 4813] persons= [1815, 1816, 1817] +--- sas= [] oneibb_slice1811 crp= 1 +--- 'expires': 1167127832 +1813 None oneibc_slice1812 nodes= [1812, 1813, 1814, 4812, 4813, 4814] persons= [1816, 1817, 1818] +--- sas= [] oneibc_slice1812 crp= 1 +--- 'expires': 1167127833 +1814 None oneibd_slice1813 nodes= [1813, 1814, 1815, 4813, 4814, 4815] persons= [1817, 1818, 1819] +--- sas= [] oneibd_slice1813 crp= 1 +--- 'expires': 1167127835 +1815 None oneibe_slice1814 nodes= [1814, 1815, 1816, 4814, 4815, 4816] persons= [1818, 1819, 1820] +--- sas= [] oneibe_slice1814 crp= 1 +--- 'expires': 1167127836 +1816 None oneibf_slice1815 nodes= [1815, 1816, 1817, 4815, 4816, 4817] persons= [1819, 1820, 1821] +--- sas= [] oneibf_slice1815 crp= 1 +--- 'expires': 1167127837 +1817 None oneibg_slice1816 nodes= [1816, 1817, 1818, 4816, 4817, 4818] persons= [1820, 1821, 1822] +--- sas= [] oneibg_slice1816 crp= 1 +--- 'expires': 1167127837 +1818 None oneibh_slice1817 nodes= [1817, 1818, 1819, 4817, 4818, 4819] persons= [1821, 1822, 1823] +--- sas= [] oneibh_slice1817 crp= 1 +--- 'expires': 1167127838 +1819 None oneibi_slice1818 nodes= [1818, 1819, 1820, 4818, 4819, 4820] persons= [1822, 1823, 1824] +--- sas= [] oneibi_slice1818 crp= 1 +--- 'expires': 1167127838 +1820 None oneibj_slice1819 nodes= [1819, 1820, 1821, 4819, 4820, 4821] persons= [1823, 1824, 1825] +--- sas= [] oneibj_slice1819 crp= 1 +--- 'expires': 1167127839 +1821 None oneica_slice1820 nodes= [1820, 1821, 1822, 4820, 4821, 4822] persons= [1824, 1825, 1826] +--- sas= [] oneica_slice1820 crp= 1 +--- 'expires': 1167127839 +1822 None oneicb_slice1821 nodes= [1821, 1822, 1823, 4821, 4822, 4823] persons= [1825, 1826, 1827] +--- sas= [] oneicb_slice1821 crp= 1 +--- 'expires': 1167127840 +1823 None oneicc_slice1822 nodes= [1822, 1823, 1824, 4822, 4823, 4824] persons= [1826, 1827, 1828] +--- sas= [] oneicc_slice1822 crp= 1 +--- 'expires': 1167127840 +1824 None oneicd_slice1823 nodes= [1823, 1824, 1825, 4823, 4824, 4825] persons= [1827, 1828, 1829] +--- sas= [] oneicd_slice1823 crp= 1 +--- 'expires': 1167127841 +1825 None oneice_slice1824 nodes= [1824, 1825, 1826, 4824, 4825, 4826] persons= [1828, 1829, 1830] +--- sas= [] oneice_slice1824 crp= 1 +--- 'expires': 1167127841 +1826 None oneicf_slice1825 nodes= [1825, 1826, 1827, 4825, 4826, 4827] persons= [1829, 1830, 1831] +--- sas= [] oneicf_slice1825 crp= 1 +--- 'expires': 1167127842 +1827 None oneicg_slice1826 nodes= [1826, 1827, 1828, 4826, 4827, 4828] persons= [1830, 1831, 1832] +--- sas= [] oneicg_slice1826 crp= 1 +--- 'expires': 1167127842 +1828 None oneich_slice1827 nodes= [1827, 1828, 1829, 4827, 4828, 4829] persons= [1831, 1832, 1833] +--- sas= [] oneich_slice1827 crp= 1 +--- 'expires': 1167127843 +1829 None oneici_slice1828 nodes= [1828, 1829, 1830, 4828, 4829, 4830] persons= [1832, 1833, 1834] +--- sas= [] oneici_slice1828 crp= 1 +--- 'expires': 1167127843 +1830 None oneicj_slice1829 nodes= [1829, 1830, 1831, 4829, 4830, 4831] persons= [1833, 1834, 1835] +--- sas= [] oneicj_slice1829 crp= 1 +--- 'expires': 1167127844 +1831 None oneida_slice1830 nodes= [1830, 1831, 1832, 4830, 4831, 4832] persons= [1834, 1835, 1836] +--- sas= [] oneida_slice1830 crp= 1 +--- 'expires': 1167127844 +1832 None oneidb_slice1831 nodes= [1831, 1832, 1833, 4831, 4832, 4833] persons= [1835, 1836, 1837] +--- sas= [] oneidb_slice1831 crp= 1 +--- 'expires': 1167127845 +1833 None oneidc_slice1832 nodes= [1832, 1833, 1834, 4832, 4833, 4834] persons= [1836, 1837, 1838] +--- sas= [] oneidc_slice1832 crp= 1 +--- 'expires': 1167127845 +1834 None oneidd_slice1833 nodes= [1833, 1834, 1835, 4833, 4834, 4835] persons= [1837, 1838, 1839] +--- sas= [] oneidd_slice1833 crp= 1 +--- 'expires': 1167127846 +1835 None oneide_slice1834 nodes= [1834, 1835, 1836, 4834, 4835, 4836] persons= [1838, 1839, 1840] +--- sas= [] oneide_slice1834 crp= 1 +--- 'expires': 1167127846 +1836 None oneidf_slice1835 nodes= [1835, 1836, 1837, 4835, 4836, 4837] persons= [1839, 1840, 1841] +--- sas= [] oneidf_slice1835 crp= 1 +--- 'expires': 1167127847 +1837 None oneidg_slice1836 nodes= [1836, 1837, 1838, 4836, 4837, 4838] persons= [1840, 1841, 1842] +--- sas= [] oneidg_slice1836 crp= 1 +--- 'expires': 1167127847 +1838 None oneidh_slice1837 nodes= [1837, 1838, 1839, 4837, 4838, 4839] persons= [1841, 1842, 1843] +--- sas= [] oneidh_slice1837 crp= 1 +--- 'expires': 1167127848 +1839 None oneidi_slice1838 nodes= [1838, 1839, 1840, 4838, 4839, 4840] persons= [1842, 1843, 1844] +--- sas= [] oneidi_slice1838 crp= 1 +--- 'expires': 1167127848 +1840 None oneidj_slice1839 nodes= [1839, 1840, 1841, 4839, 4840, 4841] persons= [1843, 1844, 1845] +--- sas= [] oneidj_slice1839 crp= 1 +--- 'expires': 1167127849 +1841 None oneiea_slice1840 nodes= [1840, 1841, 1842, 4840, 4841, 4842] persons= [1844, 1845, 1846] +--- sas= [] oneiea_slice1840 crp= 1 +--- 'expires': 1167127849 +1842 None oneieb_slice1841 nodes= [1841, 1842, 1843, 4841, 4842, 4843] persons= [1845, 1846, 1847] +--- sas= [] oneieb_slice1841 crp= 1 +--- 'expires': 1167127850 +1843 None oneiec_slice1842 nodes= [1842, 1843, 1844, 4842, 4843, 4844] persons= [1846, 1847, 1848] +--- sas= [] oneiec_slice1842 crp= 1 +--- 'expires': 1167127850 +1844 None oneied_slice1843 nodes= [1843, 1844, 1845, 4843, 4844, 4845] persons= [1847, 1848, 1849] +--- sas= [] oneied_slice1843 crp= 1 +--- 'expires': 1167127851 +1845 None oneiee_slice1844 nodes= [1844, 1845, 1846, 4844, 4845, 4846] persons= [1848, 1849, 1850] +--- sas= [] oneiee_slice1844 crp= 1 +--- 'expires': 1167127851 +1846 None oneief_slice1845 nodes= [1845, 1846, 1847, 4845, 4846, 4847] persons= [1849, 1850, 1851] +--- sas= [] oneief_slice1845 crp= 1 +--- 'expires': 1167127852 +1847 None oneieg_slice1846 nodes= [1846, 1847, 1848, 4846, 4847, 4848] persons= [1850, 1851, 1852] +--- sas= [] oneieg_slice1846 crp= 1 +--- 'expires': 1167127852 +1848 None oneieh_slice1847 nodes= [1847, 1848, 1849, 4847, 4848, 4849] persons= [1851, 1852, 1853] +--- sas= [] oneieh_slice1847 crp= 1 +--- 'expires': 1167127853 +1849 None oneiei_slice1848 nodes= [1848, 1849, 1850, 4848, 4849, 4850] persons= [1852, 1853, 1854] +--- sas= [] oneiei_slice1848 crp= 1 +--- 'expires': 1167127853 +1850 None oneiej_slice1849 nodes= [1849, 1850, 1851, 4849, 4850, 4851] persons= [1853, 1854, 1855] +--- sas= [] oneiej_slice1849 crp= 1 +--- 'expires': 1167127854 +1851 None oneifa_slice1850 nodes= [1850, 1851, 1852, 4850, 4851, 4852] persons= [1854, 1855, 1856] +--- sas= [] oneifa_slice1850 crp= 1 +--- 'expires': 1167127854 +1852 None oneifb_slice1851 nodes= [1851, 1852, 1853, 4851, 4852, 4853] persons= [1855, 1856, 1857] +--- sas= [] oneifb_slice1851 crp= 1 +--- 'expires': 1167127855 +1853 None oneifc_slice1852 nodes= [1852, 1853, 1854, 4852, 4853, 4854] persons= [1856, 1857, 1858] +--- sas= [] oneifc_slice1852 crp= 1 +--- 'expires': 1167127855 +1854 None oneifd_slice1853 nodes= [1853, 1854, 1855, 4853, 4854, 4855] persons= [1857, 1858, 1859] +--- sas= [] oneifd_slice1853 crp= 1 +--- 'expires': 1167127856 +1855 None oneife_slice1854 nodes= [1854, 1855, 1856, 4854, 4855, 4856] persons= [1858, 1859, 1860] +--- sas= [] oneife_slice1854 crp= 1 +--- 'expires': 1167127856 +1856 None oneiff_slice1855 nodes= [1855, 1856, 1857, 4855, 4856, 4857] persons= [1859, 1860, 1861] +--- sas= [] oneiff_slice1855 crp= 1 +--- 'expires': 1167127857 +1857 None oneifg_slice1856 nodes= [1856, 1857, 1858, 4856, 4857, 4858] persons= [1860, 1861, 1862] +--- sas= [] oneifg_slice1856 crp= 1 +--- 'expires': 1167127857 +1858 None oneifh_slice1857 nodes= [1857, 1858, 1859, 4857, 4858, 4859] persons= [1861, 1862, 1863] +--- sas= [] oneifh_slice1857 crp= 1 +--- 'expires': 1167127858 +1859 None oneifi_slice1858 nodes= [1858, 1859, 1860, 4858, 4859, 4860] persons= [1862, 1863, 1864] +--- sas= [] oneifi_slice1858 crp= 1 +--- 'expires': 1167127858 +1860 None oneifj_slice1859 nodes= [1859, 1860, 1861, 4859, 4860, 4861] persons= [1863, 1864, 1865] +--- sas= [] oneifj_slice1859 crp= 1 +--- 'expires': 1167127859 +1861 None oneiga_slice1860 nodes= [1860, 1861, 1862, 4860, 4861, 4862] persons= [1864, 1865, 1866] +--- sas= [] oneiga_slice1860 crp= 1 +--- 'expires': 1167127859 +1862 None oneigb_slice1861 nodes= [1861, 1862, 1863, 4861, 4862, 4863] persons= [1865, 1866, 1867] +--- sas= [] oneigb_slice1861 crp= 1 +--- 'expires': 1167127860 +1863 None oneigc_slice1862 nodes= [1862, 1863, 1864, 4862, 4863, 4864] persons= [1866, 1867, 1868] +--- sas= [] oneigc_slice1862 crp= 1 +--- 'expires': 1167127860 +1864 None oneigd_slice1863 nodes= [1863, 1864, 1865, 4863, 4864, 4865] persons= [1867, 1868, 1869] +--- sas= [] oneigd_slice1863 crp= 1 +--- 'expires': 1167127861 +1865 None oneige_slice1864 nodes= [1864, 1865, 1866, 4864, 4865, 4866] persons= [1868, 1869, 1870] +--- sas= [] oneige_slice1864 crp= 1 +--- 'expires': 1167127861 +1866 None oneigf_slice1865 nodes= [1865, 1866, 1867, 4865, 4866, 4867] persons= [1869, 1870, 1871] +--- sas= [] oneigf_slice1865 crp= 1 +--- 'expires': 1167127862 +1867 None oneigg_slice1866 nodes= [1866, 1867, 1868, 4866, 4867, 4868] persons= [1870, 1871, 1872] +--- sas= [] oneigg_slice1866 crp= 1 +--- 'expires': 1167127862 +1868 None oneigh_slice1867 nodes= [1867, 1868, 1869, 4867, 4868, 4869] persons= [1871, 1872, 1873] +--- sas= [] oneigh_slice1867 crp= 1 +--- 'expires': 1167127863 +1869 None oneigi_slice1868 nodes= [1868, 1869, 1870, 4868, 4869, 4870] persons= [1872, 1873, 1874] +--- sas= [] oneigi_slice1868 crp= 1 +--- 'expires': 1167127863 +1870 None oneigj_slice1869 nodes= [1869, 1870, 1871, 4869, 4870, 4871] persons= [1873, 1874, 1875] +--- sas= [] oneigj_slice1869 crp= 1 +--- 'expires': 1167127864 +1871 None oneiha_slice1870 nodes= [1870, 1871, 1872, 4870, 4871, 4872] persons= [1874, 1875, 1876] +--- sas= [] oneiha_slice1870 crp= 1 +--- 'expires': 1167127864 +1872 None oneihb_slice1871 nodes= [1871, 1872, 1873, 4871, 4872, 4873] persons= [1875, 1876, 1877] +--- sas= [] oneihb_slice1871 crp= 1 +--- 'expires': 1167127865 +1873 None oneihc_slice1872 nodes= [1872, 1873, 1874, 4872, 4873, 4874] persons= [1876, 1877, 1878] +--- sas= [] oneihc_slice1872 crp= 1 +--- 'expires': 1167127865 +1874 None oneihd_slice1873 nodes= [1873, 1874, 1875, 4873, 4874, 4875] persons= [1877, 1878, 1879] +--- sas= [] oneihd_slice1873 crp= 1 +--- 'expires': 1167127866 +1875 None oneihe_slice1874 nodes= [1874, 1875, 1876, 4874, 4875, 4876] persons= [1878, 1879, 1880] +--- sas= [] oneihe_slice1874 crp= 1 +--- 'expires': 1167127866 +1876 None oneihf_slice1875 nodes= [1875, 1876, 1877, 4875, 4876, 4877] persons= [1879, 1880, 1881] +--- sas= [] oneihf_slice1875 crp= 1 +--- 'expires': 1167127867 +1877 None oneihg_slice1876 nodes= [1876, 1877, 1878, 4876, 4877, 4878] persons= [1880, 1881, 1882] +--- sas= [] oneihg_slice1876 crp= 1 +--- 'expires': 1167127867 +1878 None oneihh_slice1877 nodes= [1877, 1878, 1879, 4877, 4878, 4879] persons= [1881, 1882, 1883] +--- sas= [] oneihh_slice1877 crp= 1 +--- 'expires': 1167127868 +1879 None oneihi_slice1878 nodes= [1878, 1879, 1880, 4878, 4879, 4880] persons= [1882, 1883, 1884] +--- sas= [] oneihi_slice1878 crp= 1 +--- 'expires': 1167127868 +1880 None oneihj_slice1879 nodes= [1879, 1880, 1881, 4879, 4880, 4881] persons= [1883, 1884, 1885] +--- sas= [] oneihj_slice1879 crp= 1 +--- 'expires': 1167127869 +1881 None oneiia_slice1880 nodes= [1880, 1881, 1882, 4880, 4881, 4882] persons= [1884, 1885, 1886] +--- sas= [] oneiia_slice1880 crp= 1 +--- 'expires': 1167127869 +1882 None oneiib_slice1881 nodes= [1881, 1882, 1883, 4881, 4882, 4883] persons= [1885, 1886, 1887] +--- sas= [] oneiib_slice1881 crp= 1 +--- 'expires': 1167127870 +1883 None oneiic_slice1882 nodes= [1882, 1883, 1884, 4882, 4883, 4884] persons= [1886, 1887, 1888] +--- sas= [] oneiic_slice1882 crp= 1 +--- 'expires': 1167127870 +1884 None oneiid_slice1883 nodes= [1883, 1884, 1885, 4883, 4884, 4885] persons= [1887, 1888, 1889] +--- sas= [] oneiid_slice1883 crp= 1 +--- 'expires': 1167127871 +1885 None oneiie_slice1884 nodes= [1884, 1885, 1886, 4884, 4885, 4886] persons= [1888, 1889, 1890] +--- sas= [] oneiie_slice1884 crp= 1 +--- 'expires': 1167127871 +1886 None oneiif_slice1885 nodes= [1885, 1886, 1887, 4885, 4886, 4887] persons= [1889, 1890, 1891] +--- sas= [] oneiif_slice1885 crp= 1 +--- 'expires': 1167127872 +1887 None oneiig_slice1886 nodes= [1886, 1887, 1888, 4886, 4887, 4888] persons= [1890, 1891, 1892] +--- sas= [] oneiig_slice1886 crp= 1 +--- 'expires': 1167127872 +1888 None oneiih_slice1887 nodes= [1887, 1888, 1889, 4887, 4888, 4889] persons= [1891, 1892, 1893] +--- sas= [] oneiih_slice1887 crp= 1 +--- 'expires': 1167127873 +1889 None oneiii_slice1888 nodes= [1888, 1889, 1890, 4888, 4889, 4890] persons= [1892, 1893, 1894] +--- sas= [] oneiii_slice1888 crp= 1 +--- 'expires': 1167127873 +1890 None oneiij_slice1889 nodes= [1889, 1890, 1891, 4889, 4890, 4891] persons= [1893, 1894, 1895] +--- sas= [] oneiij_slice1889 crp= 1 +--- 'expires': 1167127874 +1891 None oneija_slice1890 nodes= [1890, 1891, 1892, 4890, 4891, 4892] persons= [1894, 1895, 1896] +--- sas= [] oneija_slice1890 crp= 1 +--- 'expires': 1167127874 +1892 None oneijb_slice1891 nodes= [1891, 1892, 1893, 4891, 4892, 4893] persons= [1895, 1896, 1897] +--- sas= [] oneijb_slice1891 crp= 1 +--- 'expires': 1167127875 +1893 None oneijc_slice1892 nodes= [1892, 1893, 1894, 4892, 4893, 4894] persons= [1896, 1897, 1898] +--- sas= [] oneijc_slice1892 crp= 1 +--- 'expires': 1167127875 +1894 None oneijd_slice1893 nodes= [1893, 1894, 1895, 4893, 4894, 4895] persons= [1897, 1898, 1899] +--- sas= [] oneijd_slice1893 crp= 1 +--- 'expires': 1167127876 +1895 None oneije_slice1894 nodes= [1894, 1895, 1896, 4894, 4895, 4896] persons= [1898, 1899, 1900] +--- sas= [] oneije_slice1894 crp= 1 +--- 'expires': 1167127876 +1896 None oneijf_slice1895 nodes= [1895, 1896, 1897, 4895, 4896, 4897] persons= [1899, 1900, 1901] +--- sas= [] oneijf_slice1895 crp= 1 +--- 'expires': 1167127877 +1897 None oneijg_slice1896 nodes= [1896, 1897, 1898, 4896, 4897, 4898] persons= [1900, 1901, 1902] +--- sas= [] oneijg_slice1896 crp= 1 +--- 'expires': 1167127877 +1898 None oneijh_slice1897 nodes= [1897, 1898, 1899, 4897, 4898, 4899] persons= [1901, 1902, 1903] +--- sas= [] oneijh_slice1897 crp= 1 +--- 'expires': 1167127878 +1899 None oneiji_slice1898 nodes= [1898, 1899, 1900, 4898, 4899, 4900] persons= [1902, 1903, 1904] +--- sas= [] oneiji_slice1898 crp= 1 +--- 'expires': 1167127878 +1900 None oneijj_slice1899 nodes= [1899, 1900, 1901, 4899, 4900, 4901] persons= [1903, 1904, 1905] +--- sas= [] oneijj_slice1899 crp= 1 +--- 'expires': 1167127879 +1901 None onejaa_slice1900 nodes= [1900, 1901, 1902, 4900, 4901, 4902] persons= [1904, 1905, 1906] +--- sas= [] onejaa_slice1900 crp= 1 +--- 'expires': 1167127879 +1902 None onejab_slice1901 nodes= [1901, 1902, 1903, 4901, 4902, 4903] persons= [1905, 1906, 1907] +--- sas= [] onejab_slice1901 crp= 1 +--- 'expires': 1167127880 +1903 None onejac_slice1902 nodes= [1902, 1903, 1904, 4902, 4903, 4904] persons= [1906, 1907, 1908] +--- sas= [] onejac_slice1902 crp= 1 +--- 'expires': 1167127880 +1904 None onejad_slice1903 nodes= [1903, 1904, 1905, 4903, 4904, 4905] persons= [1907, 1908, 1909] +--- sas= [] onejad_slice1903 crp= 1 +--- 'expires': 1167127881 +1905 None onejae_slice1904 nodes= [1904, 1905, 1906, 4904, 4905, 4906] persons= [1908, 1909, 1910] +--- sas= [] onejae_slice1904 crp= 1 +--- 'expires': 1167127881 +1906 None onejaf_slice1905 nodes= [1905, 1906, 1907, 4905, 4906, 4907] persons= [1909, 1910, 1911] +--- sas= [] onejaf_slice1905 crp= 1 +--- 'expires': 1167127882 +1907 None onejag_slice1906 nodes= [1906, 1907, 1908, 4906, 4907, 4908] persons= [1910, 1911, 1912] +--- sas= [] onejag_slice1906 crp= 1 +--- 'expires': 1167127882 +1908 None onejah_slice1907 nodes= [1907, 1908, 1909, 4907, 4908, 4909] persons= [1911, 1912, 1913] +--- sas= [] onejah_slice1907 crp= 1 +--- 'expires': 1167127883 +1909 None onejai_slice1908 nodes= [1908, 1909, 1910, 4908, 4909, 4910] persons= [1912, 1913, 1914] +--- sas= [] onejai_slice1908 crp= 1 +--- 'expires': 1167127883 +1910 None onejaj_slice1909 nodes= [1909, 1910, 1911, 4909, 4910, 4911] persons= [1913, 1914, 1915] +--- sas= [] onejaj_slice1909 crp= 1 +--- 'expires': 1167127884 +1911 None onejba_slice1910 nodes= [1910, 1911, 1912, 4910, 4911, 4912] persons= [1914, 1915, 1916] +--- sas= [] onejba_slice1910 crp= 1 +--- 'expires': 1167127884 +1912 None onejbb_slice1911 nodes= [1911, 1912, 1913, 4911, 4912, 4913] persons= [1915, 1916, 1917] +--- sas= [] onejbb_slice1911 crp= 1 +--- 'expires': 1167127885 +1913 None onejbc_slice1912 nodes= [1912, 1913, 1914, 4912, 4913, 4914] persons= [1916, 1917, 1918] +--- sas= [] onejbc_slice1912 crp= 1 +--- 'expires': 1167127885 +1914 None onejbd_slice1913 nodes= [1913, 1914, 1915, 4913, 4914, 4915] persons= [1917, 1918, 1919] +--- sas= [] onejbd_slice1913 crp= 1 +--- 'expires': 1167127886 +1915 None onejbe_slice1914 nodes= [1914, 1915, 1916, 4914, 4915, 4916] persons= [1918, 1919, 1920] +--- sas= [] onejbe_slice1914 crp= 1 +--- 'expires': 1167127886 +1916 None onejbf_slice1915 nodes= [1915, 1916, 1917, 4915, 4916, 4917] persons= [1919, 1920, 1921] +--- sas= [] onejbf_slice1915 crp= 1 +--- 'expires': 1167127887 +1917 None onejbg_slice1916 nodes= [1916, 1917, 1918, 4916, 4917, 4918] persons= [1920, 1921, 1922] +--- sas= [] onejbg_slice1916 crp= 1 +--- 'expires': 1167127887 +1918 None onejbh_slice1917 nodes= [1917, 1918, 1919, 4917, 4918, 4919] persons= [1921, 1922, 1923] +--- sas= [] onejbh_slice1917 crp= 1 +--- 'expires': 1167127888 +1919 None onejbi_slice1918 nodes= [1918, 1919, 1920, 4918, 4919, 4920] persons= [1922, 1923, 1924] +--- sas= [] onejbi_slice1918 crp= 1 +--- 'expires': 1167127888 +1920 None onejbj_slice1919 nodes= [1919, 1920, 1921, 4919, 4920, 4921] persons= [1923, 1924, 1925] +--- sas= [] onejbj_slice1919 crp= 1 +--- 'expires': 1167127889 +1921 None onejca_slice1920 nodes= [1920, 1921, 1922, 4920, 4921, 4922] persons= [1924, 1925, 1926] +--- sas= [] onejca_slice1920 crp= 1 +--- 'expires': 1167127889 +1922 None onejcb_slice1921 nodes= [1921, 1922, 1923, 4921, 4922, 4923] persons= [1925, 1926, 1927] +--- sas= [] onejcb_slice1921 crp= 1 +--- 'expires': 1167127890 +1923 None onejcc_slice1922 nodes= [1922, 1923, 1924, 4922, 4923, 4924] persons= [1926, 1927, 1928] +--- sas= [] onejcc_slice1922 crp= 1 +--- 'expires': 1167127890 +1924 None onejcd_slice1923 nodes= [1923, 1924, 1925, 4923, 4924, 4925] persons= [1927, 1928, 1929] +--- sas= [] onejcd_slice1923 crp= 1 +--- 'expires': 1167127891 +1925 None onejce_slice1924 nodes= [1924, 1925, 1926, 4924, 4925, 4926] persons= [1928, 1929, 1930] +--- sas= [] onejce_slice1924 crp= 1 +--- 'expires': 1167127891 +1926 None onejcf_slice1925 nodes= [1925, 1926, 1927, 4925, 4926, 4927] persons= [1929, 1930, 1931] +--- sas= [] onejcf_slice1925 crp= 1 +--- 'expires': 1167127892 +1927 None onejcg_slice1926 nodes= [1926, 1927, 1928, 4926, 4927, 4928] persons= [1930, 1931, 1932] +--- sas= [] onejcg_slice1926 crp= 1 +--- 'expires': 1167127892 +1928 None onejch_slice1927 nodes= [1927, 1928, 1929, 4927, 4928, 4929] persons= [1931, 1932, 1933] +--- sas= [] onejch_slice1927 crp= 1 +--- 'expires': 1167127893 +1929 None onejci_slice1928 nodes= [1928, 1929, 1930, 4928, 4929, 4930] persons= [1932, 1933, 1934] +--- sas= [] onejci_slice1928 crp= 1 +--- 'expires': 1167127893 +1930 None onejcj_slice1929 nodes= [1929, 1930, 1931, 4929, 4930, 4931] persons= [1933, 1934, 1935] +--- sas= [] onejcj_slice1929 crp= 1 +--- 'expires': 1167127894 +1931 None onejda_slice1930 nodes= [1930, 1931, 1932, 4930, 4931, 4932] persons= [1934, 1935, 1936] +--- sas= [] onejda_slice1930 crp= 1 +--- 'expires': 1167127894 +1932 None onejdb_slice1931 nodes= [1931, 1932, 1933, 4931, 4932, 4933] persons= [1935, 1936, 1937] +--- sas= [] onejdb_slice1931 crp= 1 +--- 'expires': 1167127895 +1933 None onejdc_slice1932 nodes= [1932, 1933, 1934, 4932, 4933, 4934] persons= [1936, 1937, 1938] +--- sas= [] onejdc_slice1932 crp= 1 +--- 'expires': 1167127895 +1934 None onejdd_slice1933 nodes= [1933, 1934, 1935, 4933, 4934, 4935] persons= [1937, 1938, 1939] +--- sas= [] onejdd_slice1933 crp= 1 +--- 'expires': 1167127896 +1935 None onejde_slice1934 nodes= [1934, 1935, 1936, 4934, 4935, 4936] persons= [1938, 1939, 1940] +--- sas= [] onejde_slice1934 crp= 1 +--- 'expires': 1167127896 +1936 None onejdf_slice1935 nodes= [1935, 1936, 1937, 4935, 4936, 4937] persons= [1939, 1940, 1941] +--- sas= [] onejdf_slice1935 crp= 1 +--- 'expires': 1167127897 +1937 None onejdg_slice1936 nodes= [1936, 1937, 1938, 4936, 4937, 4938] persons= [1940, 1941, 1942] +--- sas= [] onejdg_slice1936 crp= 1 +--- 'expires': 1167127897 +1938 None onejdh_slice1937 nodes= [1937, 1938, 1939, 4937, 4938, 4939] persons= [1941, 1942, 1943] +--- sas= [] onejdh_slice1937 crp= 1 +--- 'expires': 1167127898 +1939 None onejdi_slice1938 nodes= [1938, 1939, 1940, 4938, 4939, 4940] persons= [1942, 1943, 1944] +--- sas= [] onejdi_slice1938 crp= 1 +--- 'expires': 1167127898 +1940 None onejdj_slice1939 nodes= [1939, 1940, 1941, 4939, 4940, 4941] persons= [1943, 1944, 1945] +--- sas= [] onejdj_slice1939 crp= 1 +--- 'expires': 1167127899 +1941 None onejea_slice1940 nodes= [1940, 1941, 1942, 4940, 4941, 4942] persons= [1944, 1945, 1946] +--- sas= [] onejea_slice1940 crp= 1 +--- 'expires': 1167127899 +1942 None onejeb_slice1941 nodes= [1941, 1942, 1943, 4941, 4942, 4943] persons= [1945, 1946, 1947] +--- sas= [] onejeb_slice1941 crp= 1 +--- 'expires': 1167127900 +1943 None onejec_slice1942 nodes= [1942, 1943, 1944, 4942, 4943, 4944] persons= [1946, 1947, 1948] +--- sas= [] onejec_slice1942 crp= 1 +--- 'expires': 1167127901 +1944 None onejed_slice1943 nodes= [1943, 1944, 1945, 4943, 4944, 4945] persons= [1947, 1948, 1949] +--- sas= [] onejed_slice1943 crp= 1 +--- 'expires': 1167127901 +1945 None onejee_slice1944 nodes= [1944, 1945, 1946, 4944, 4945, 4946] persons= [1948, 1949, 1950] +--- sas= [] onejee_slice1944 crp= 1 +--- 'expires': 1167127902 +1946 None onejef_slice1945 nodes= [1945, 1946, 1947, 4945, 4946, 4947] persons= [1949, 1950, 1951] +--- sas= [] onejef_slice1945 crp= 1 +--- 'expires': 1167127902 +1947 None onejeg_slice1946 nodes= [1946, 1947, 1948, 4946, 4947, 4948] persons= [1950, 1951, 1952] +--- sas= [] onejeg_slice1946 crp= 1 +--- 'expires': 1167127903 +1948 None onejeh_slice1947 nodes= [1947, 1948, 1949, 4947, 4948, 4949] persons= [1951, 1952, 1953] +--- sas= [] onejeh_slice1947 crp= 1 +--- 'expires': 1167127903 +1949 None onejei_slice1948 nodes= [1948, 1949, 1950, 4948, 4949, 4950] persons= [1952, 1953, 1954] +--- sas= [] onejei_slice1948 crp= 1 +--- 'expires': 1167127904 +1950 None onejej_slice1949 nodes= [1949, 1950, 1951, 4949, 4950, 4951] persons= [1953, 1954, 1955] +--- sas= [] onejej_slice1949 crp= 1 +--- 'expires': 1167127904 +1951 None onejfa_slice1950 nodes= [1950, 1951, 1952, 4950, 4951, 4952] persons= [1954, 1955, 1956] +--- sas= [] onejfa_slice1950 crp= 1 +--- 'expires': 1167127905 +1952 None onejfb_slice1951 nodes= [1951, 1952, 1953, 4951, 4952, 4953] persons= [1955, 1956, 1957] +--- sas= [] onejfb_slice1951 crp= 1 +--- 'expires': 1167127905 +1953 None onejfc_slice1952 nodes= [1952, 1953, 1954, 4952, 4953, 4954] persons= [1956, 1957, 1958] +--- sas= [] onejfc_slice1952 crp= 1 +--- 'expires': 1167127906 +1954 None onejfd_slice1953 nodes= [1953, 1954, 1955, 4953, 4954, 4955] persons= [1957, 1958, 1959] +--- sas= [] onejfd_slice1953 crp= 1 +--- 'expires': 1167127906 +1955 None onejfe_slice1954 nodes= [1954, 1955, 1956, 4954, 4955, 4956] persons= [1958, 1959, 1960] +--- sas= [] onejfe_slice1954 crp= 1 +--- 'expires': 1167127907 +1956 None onejff_slice1955 nodes= [1955, 1956, 1957, 4955, 4956, 4957] persons= [1959, 1960, 1961] +--- sas= [] onejff_slice1955 crp= 1 +--- 'expires': 1167127907 +1957 None onejfg_slice1956 nodes= [1956, 1957, 1958, 4956, 4957, 4958] persons= [1960, 1961, 1962] +--- sas= [] onejfg_slice1956 crp= 1 +--- 'expires': 1167127908 +1958 None onejfh_slice1957 nodes= [1957, 1958, 1959, 4957, 4958, 4959] persons= [1961, 1962, 1963] +--- sas= [] onejfh_slice1957 crp= 1 +--- 'expires': 1167127908 +1959 None onejfi_slice1958 nodes= [1958, 1959, 1960, 4958, 4959, 4960] persons= [1962, 1963, 1964] +--- sas= [] onejfi_slice1958 crp= 1 +--- 'expires': 1167127909 +1960 None onejfj_slice1959 nodes= [1959, 1960, 1961, 4959, 4960, 4961] persons= [1963, 1964, 1965] +--- sas= [] onejfj_slice1959 crp= 1 +--- 'expires': 1167127909 +1961 None onejga_slice1960 nodes= [1960, 1961, 1962, 4960, 4961, 4962] persons= [1964, 1965, 1966] +--- sas= [] onejga_slice1960 crp= 1 +--- 'expires': 1167127910 +1962 None onejgb_slice1961 nodes= [1961, 1962, 1963, 4961, 4962, 4963] persons= [1965, 1966, 1967] +--- sas= [] onejgb_slice1961 crp= 1 +--- 'expires': 1167127910 +1963 None onejgc_slice1962 nodes= [1962, 1963, 1964, 4962, 4963, 4964] persons= [1966, 1967, 1968] +--- sas= [] onejgc_slice1962 crp= 1 +--- 'expires': 1167127911 +1964 None onejgd_slice1963 nodes= [1963, 1964, 1965, 4963, 4964, 4965] persons= [1967, 1968, 1969] +--- sas= [] onejgd_slice1963 crp= 1 +--- 'expires': 1167127911 +1965 None onejge_slice1964 nodes= [1964, 1965, 1966, 4964, 4965, 4966] persons= [1968, 1969, 1970] +--- sas= [] onejge_slice1964 crp= 1 +--- 'expires': 1167127912 +1966 None onejgf_slice1965 nodes= [1965, 1966, 1967, 4965, 4966, 4967] persons= [1969, 1970, 1971] +--- sas= [] onejgf_slice1965 crp= 1 +--- 'expires': 1167127912 +1967 None onejgg_slice1966 nodes= [1966, 1967, 1968, 4966, 4967, 4968] persons= [1970, 1971, 1972] +--- sas= [] onejgg_slice1966 crp= 1 +--- 'expires': 1167127913 +1968 None onejgh_slice1967 nodes= [1967, 1968, 1969, 4967, 4968, 4969] persons= [1971, 1972, 1973] +--- sas= [] onejgh_slice1967 crp= 1 +--- 'expires': 1167127913 +1969 None onejgi_slice1968 nodes= [1968, 1969, 1970, 4968, 4969, 4970] persons= [1972, 1973, 1974] +--- sas= [] onejgi_slice1968 crp= 1 +--- 'expires': 1167127914 +1970 None onejgj_slice1969 nodes= [1969, 1970, 1971, 4969, 4970, 4971] persons= [1973, 1974, 1975] +--- sas= [] onejgj_slice1969 crp= 1 +--- 'expires': 1167127914 +1971 None onejha_slice1970 nodes= [1970, 1971, 1972, 4970, 4971, 4972] persons= [1974, 1975, 1976] +--- sas= [] onejha_slice1970 crp= 1 +--- 'expires': 1167127915 +1972 None onejhb_slice1971 nodes= [1971, 1972, 1973, 4971, 4972, 4973] persons= [1975, 1976, 1977] +--- sas= [] onejhb_slice1971 crp= 1 +--- 'expires': 1167127915 +1973 None onejhc_slice1972 nodes= [1972, 1973, 1974, 4972, 4973, 4974] persons= [1976, 1977, 1978] +--- sas= [] onejhc_slice1972 crp= 1 +--- 'expires': 1167127916 +1974 None onejhd_slice1973 nodes= [1973, 1974, 1975, 4973, 4974, 4975] persons= [1977, 1978, 1979] +--- sas= [] onejhd_slice1973 crp= 1 +--- 'expires': 1167127916 +1975 None onejhe_slice1974 nodes= [1974, 1975, 1976, 4974, 4975, 4976] persons= [1978, 1979, 1980] +--- sas= [] onejhe_slice1974 crp= 1 +--- 'expires': 1167127917 +1976 None onejhf_slice1975 nodes= [1975, 1976, 1977, 4975, 4976, 4977] persons= [1979, 1980, 1981] +--- sas= [] onejhf_slice1975 crp= 1 +--- 'expires': 1167127918 +1977 None onejhg_slice1976 nodes= [1976, 1977, 1978, 4976, 4977, 4978] persons= [1980, 1981, 1982] +--- sas= [] onejhg_slice1976 crp= 1 +--- 'expires': 1167127918 +1978 None onejhh_slice1977 nodes= [1977, 1978, 1979, 4977, 4978, 4979] persons= [1981, 1982, 1983] +--- sas= [] onejhh_slice1977 crp= 1 +--- 'expires': 1167127919 +1979 None onejhi_slice1978 nodes= [1978, 1979, 1980, 4978, 4979, 4980] persons= [1982, 1983, 1984] +--- sas= [] onejhi_slice1978 crp= 1 +--- 'expires': 1167127919 +1980 None onejhj_slice1979 nodes= [1979, 1980, 1981, 4979, 4980, 4981] persons= [1983, 1984, 1985] +--- sas= [] onejhj_slice1979 crp= 1 +--- 'expires': 1167127920 +1981 None onejia_slice1980 nodes= [1980, 1981, 1982, 4980, 4981, 4982] persons= [1984, 1985, 1986] +--- sas= [] onejia_slice1980 crp= 1 +--- 'expires': 1167127920 +1982 None onejib_slice1981 nodes= [1981, 1982, 1983, 4981, 4982, 4983] persons= [1985, 1986, 1987] +--- sas= [] onejib_slice1981 crp= 1 +--- 'expires': 1167127921 +1983 None onejic_slice1982 nodes= [1982, 1983, 1984, 4982, 4983, 4984] persons= [1986, 1987, 1988] +--- sas= [] onejic_slice1982 crp= 1 +--- 'expires': 1167127921 +1984 None onejid_slice1983 nodes= [1983, 1984, 1985, 4983, 4984, 4985] persons= [1987, 1988, 1989] +--- sas= [] onejid_slice1983 crp= 1 +--- 'expires': 1167127922 +1985 None onejie_slice1984 nodes= [1984, 1985, 1986, 4984, 4985, 4986] persons= [1988, 1989, 1990] +--- sas= [] onejie_slice1984 crp= 1 +--- 'expires': 1167127922 +1986 None onejif_slice1985 nodes= [1985, 1986, 1987, 4985, 4986, 4987] persons= [1989, 1990, 1991] +--- sas= [] onejif_slice1985 crp= 1 +--- 'expires': 1167127923 +1987 None onejig_slice1986 nodes= [1986, 1987, 1988, 4986, 4987, 4988] persons= [1990, 1991, 1992] +--- sas= [] onejig_slice1986 crp= 1 +--- 'expires': 1167127923 +1988 None onejih_slice1987 nodes= [1987, 1988, 1989, 4987, 4988, 4989] persons= [1991, 1992, 1993] +--- sas= [] onejih_slice1987 crp= 1 +--- 'expires': 1167127924 +1989 None onejii_slice1988 nodes= [1988, 1989, 1990, 4988, 4989, 4990] persons= [1992, 1993, 1994] +--- sas= [] onejii_slice1988 crp= 1 +--- 'expires': 1167127924 +1990 None onejij_slice1989 nodes= [1989, 1990, 1991, 4989, 4990, 4991] persons= [1993, 1994, 1995] +--- sas= [] onejij_slice1989 crp= 1 +--- 'expires': 1167127925 +1991 None onejja_slice1990 nodes= [1990, 1991, 1992, 4990, 4991, 4992] persons= [1994, 1995, 1996] +--- sas= [] onejja_slice1990 crp= 1 +--- 'expires': 1167127925 +1992 None onejjb_slice1991 nodes= [1991, 1992, 1993, 4991, 4992, 4993] persons= [1995, 1996, 1997] +--- sas= [] onejjb_slice1991 crp= 1 +--- 'expires': 1167127926 +1993 None onejjc_slice1992 nodes= [1992, 1993, 1994, 4992, 4993, 4994] persons= [1996, 1997, 1998] +--- sas= [] onejjc_slice1992 crp= 1 +--- 'expires': 1167127926 +1994 None onejjd_slice1993 nodes= [1993, 1994, 1995, 4993, 4994, 4995] persons= [1997, 1998, 1999] +--- sas= [] onejjd_slice1993 crp= 1 +--- 'expires': 1167127927 +1995 None onejje_slice1994 nodes= [1994, 1995, 1996, 4994, 4995, 4996] persons= [1998, 1999, 2000] +--- sas= [] onejje_slice1994 crp= 1 +--- 'expires': 1167127927 +1996 None onejjf_slice1995 nodes= [1995, 1996, 1997, 4995, 4996, 4997] persons= [1999, 2000, 2001] +--- sas= [] onejjf_slice1995 crp= 1 +--- 'expires': 1167127928 +1997 None onejjg_slice1996 nodes= [1996, 1997, 1998, 4996, 4997, 4998] persons= [2000, 2001, 2002] +--- sas= [] onejjg_slice1996 crp= 1 +--- 'expires': 1167127928 +1998 None onejjh_slice1997 nodes= [1997, 1998, 1999, 4997, 4998, 4999] persons= [2001, 2002, 2003] +--- sas= [] onejjh_slice1997 crp= 1 +--- 'expires': 1167127929 +1999 None onejji_slice1998 nodes= [1998, 1999, 2000, 4998, 4999, 5000] persons= [2002, 2003, 2004] +--- sas= [] onejji_slice1998 crp= 1 +--- 'expires': 1167127929 +2000 None onejjj_slice1999 nodes= [1999, 2000, 2001, 4999, 5000, 5001] persons= [2003, 2004, 5] +--- sas= [] onejjj_slice1999 crp= 1 +--- 'expires': 1167127930 +2001 None onebaaa_slice2000 nodes= [2000, 2001, 2002, 5000, 5001, 5002] persons= [2004, 5, 6] +--- sas= [] onebaaa_slice2000 crp= 1 +--- 'expires': 1167127931 +2002 1 thtwo_netflow nodes= [] persons= [] +--- sas= [13, 14, 15] thtwo_netflow crp= 1 +--- 'expires': 1167126460 +01: Slice Attribute Types +1 None type 20 Type of slice (e.g. vserver) +2 None system 10 Is a default system slice (1) or not (0 or unset) +3 None enabled 10 Slice enabled (1 or unset) or suspended (0) +4 None vref 30 Reference image +5 None initscript 10 Slice initialization script +6 None cpu_min 10 Minimum CPU share (ms/s) +7 None cpu_share 10 Number of CPU shares +8 None net_min 10 Minimum bandwidth (bps) +9 None net_max 10 Maximum bandwidth (bps) +10 None net_avg 10 Average bandwidth (bps) +11 None net_share 10 Number of bandwidth shares +12 None net2_min 10 Minimum bandwidth over routes exempt from node bandwidth limits (bps) +13 None net2_max 10 Maximum bandwidth over routes exempt from node bandwidth limits (bps) +14 None net2_avg 10 Average bandwidth over routes exempt from node bandwidth limits (bps) +15 None net2_share 10 Number of bandwidth shares over routes exempt from node bandwidth limits +16 None disk_max 10 Disk quota (1k disk blocks) +17 None proper_op 10 Proper operation (e.g. bind_socket) +18 None plc_slice_type 20 Type of slice rspec to be created +19 None plc_agent_version 10 Version of PLC agent (slice creation service) software to be deployed +20 None plc_ticket_pubkey 10 Public key used to verify PLC-signed tickets +21 None sat_1 10 custom sat on plc1 +22 1 sat_2 10 custom sat on plc2 +01: Slice Attributes +1 None system AT_id: 2 +--- v= 1 sl= 1 n= None +2 None vref AT_id: 4 +--- v= planetflow sl= 1 n= None +3 None proper_op AT_id: 17 +--- v= open file=/etc/passwd, flags=r sl= 1 n= None +4 None proper_op AT_id: 17 +--- v= create_socket sl= 1 n= None +5 None proper_op AT_id: 17 +--- v= bind_socket sl= 1 n= None +6 None sat_1 AT_id: 21 +--- v= custom sat/all nodes sl= 2 n= None +7 None sat_1 AT_id: 21 +--- v= custom sat/node1 sl= 2 n= 1 +8 None net_max AT_id: 9 +--- v= predefined sat/all nodes sl= 2 n= None +9 None net_max AT_id: 9 +--- v= predefined sat/node1 sl= 2 n= 1 +13 1 system AT_id: 2 +--- v= 1 sl= 2002 n= None +14 1 vref AT_id: 4 +--- v= planetflow sl= 2002 n= None +15 1 proper_op AT_id: 17 +--- v= open file=/etc/passwd, flags=r sl= 2002 n= None ++++ 1800.80 seconds ellapsed (47.90) +01: Gathering all slivers ++++ 2337.45 seconds ellapsed (536.65) +01: SLIVERS for first 3 nodes +01: SLIVERS for : hostname n1-001.plc1.org +01: 31 config files +01: SLIVER on hostname n1-001.plc1.org, s= thone_netflow +01: KEYS[] +01: ATTRIBUTES[ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + {'name': 'proper_op', 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}] +01: SLIVER on hostname n1-001.plc1.org, s= oneb_slice1 +01: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user1-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}] +01: ATTRIBUTES[ {'name': 'sat_1', 'value': 'custom sat/node1'}, + {'name': 'net_max', 'value': 'predefined sat/node1'}] +01: SLIVERS for : hostname n1-002.plc1.org +01: 31 config files +01: SLIVER on hostname n1-002.plc1.org, s= thone_netflow +01: KEYS[] +01: ATTRIBUTES[ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + {'name': 'proper_op', 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}] +01: SLIVER on hostname n1-002.plc1.org, s= oneb_slice1 +01: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user1-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}] +01: ATTRIBUTES[ {'name': 'sat_1', 'value': 'custom sat/all nodes'}, + {'name': 'net_max', 'value': 'predefined sat/all nodes'}] +01: SLIVER on hostname n1-002.plc1.org, s= onec_slice2 +01: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user4-key1'}] +01: ATTRIBUTES[] +01: SLIVERS for : hostname n1-003.plc1.org +01: 31 config files +01: SLIVER on hostname n1-003.plc1.org, s= thone_netflow +01: KEYS[] +01: ATTRIBUTES[ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + {'name': 'proper_op', 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}] +01: SLIVER on hostname n1-003.plc1.org, s= oneb_slice1 +01: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user1-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}] +01: ATTRIBUTES[ {'name': 'sat_1', 'value': 'custom sat/all nodes'}, + {'name': 'net_max', 'value': 'predefined sat/all nodes'}] +01: SLIVER on hostname n1-003.plc1.org, s= onec_slice2 +01: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user4-key1'}] +01: ATTRIBUTES[] +01: SLIVER on hostname n1-003.plc1.org, s= oned_slice3 +01: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user4-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user5-key1'}] +01: ATTRIBUTES[] +01:============================== END DUMP +02:============================== DUMPING +02: SITES +1 None thtwo Thierry plc2 Central [] +2 None twob Thierry plc2 [1, 1001, 2001] +3 None twoc Thierry plc2 [2, 1002, 2002] +4 None twod Thierry plc2 [3, 1003, 2003] +5 None twoe Thierry plc2 [4, 1004, 2004] +6 None twof Thierry plc2 [5, 1005, 2005] +7 None twog Thierry plc2 [6, 1006, 2006] +8 None twoh Thierry plc2 [7, 1007, 2007] +9 None twoi Thierry plc2 [8, 1008, 2008] +10 None twoj Thierry plc2 [9, 1009, 2009] +11 None twoba Thierry plc2 [10, 1010, 2010] +12 None twobb Thierry plc2 [11, 1011, 2011] +13 None twobc Thierry plc2 [12, 1012, 2012] +14 None twobd Thierry plc2 [13, 1013, 2013] +15 None twobe Thierry plc2 [14, 1014, 2014] +16 None twobf Thierry plc2 [15, 1015, 2015] +17 None twobg Thierry plc2 [16, 1016, 2016] +18 None twobh Thierry plc2 [17, 1017, 2017] +19 None twobi Thierry plc2 [18, 1018, 2018] +20 None twobj Thierry plc2 [19, 1019, 2019] +21 None twoca Thierry plc2 [20, 1020, 2020] +22 None twocb Thierry plc2 [21, 1021, 2021] +23 None twocc Thierry plc2 [22, 1022, 2022] +24 None twocd Thierry plc2 [23, 1023, 2023] +25 None twoce Thierry plc2 [24, 1024, 2024] +26 None twocf Thierry plc2 [25, 1025, 2025] +27 None twocg Thierry plc2 [26, 1026, 2026] +28 None twoch Thierry plc2 [27, 1027, 2027] +29 None twoci Thierry plc2 [28, 1028, 2028] +30 None twocj Thierry plc2 [29, 1029, 2029] +31 None twoda Thierry plc2 [30, 1030, 2030] +32 None twodb Thierry plc2 [31, 1031, 2031] +33 None twodc Thierry plc2 [32, 1032, 2032] +34 None twodd Thierry plc2 [33, 1033, 2033] +35 None twode Thierry plc2 [34, 1034, 2034] +36 None twodf Thierry plc2 [35, 1035, 2035] +37 None twodg Thierry plc2 [36, 1036, 2036] +38 None twodh Thierry plc2 [37, 1037, 2037] +39 None twodi Thierry plc2 [38, 1038, 2038] +40 None twodj Thierry plc2 [39, 1039, 2039] +41 None twoea Thierry plc2 [40, 1040, 2040] +42 None twoeb Thierry plc2 [41, 1041, 2041] +43 None twoec Thierry plc2 [42, 1042, 2042] +44 None twoed Thierry plc2 [43, 1043, 2043] +45 None twoee Thierry plc2 [44, 1044, 2044] +46 None twoef Thierry plc2 [45, 1045, 2045] +47 None twoeg Thierry plc2 [46, 1046, 2046] +48 None twoeh Thierry plc2 [47, 1047, 2047] +49 None twoei Thierry plc2 [48, 1048, 2048] +50 None twoej Thierry plc2 [49, 1049, 2049] +51 None twofa Thierry plc2 [50, 1050, 2050] +52 None twofb Thierry plc2 [51, 1051, 2051] +53 None twofc Thierry plc2 [52, 1052, 2052] +54 None twofd Thierry plc2 [53, 1053, 2053] +55 None twofe Thierry plc2 [54, 1054, 2054] +56 None twoff Thierry plc2 [55, 1055, 2055] +57 None twofg Thierry plc2 [56, 1056, 2056] +58 None twofh Thierry plc2 [57, 1057, 2057] +59 None twofi Thierry plc2 [58, 1058, 2058] +60 None twofj Thierry plc2 [59, 1059, 2059] +61 None twoga Thierry plc2 [60, 1060, 2060] +62 None twogb Thierry plc2 [61, 1061, 2061] +63 None twogc Thierry plc2 [62, 1062, 2062] +64 None twogd Thierry plc2 [63, 1063, 2063] +65 None twoge Thierry plc2 [64, 1064, 2064] +66 None twogf Thierry plc2 [65, 1065, 2065] +67 None twogg Thierry plc2 [66, 1066, 2066] +68 None twogh Thierry plc2 [67, 1067, 2067] +69 None twogi Thierry plc2 [68, 1068, 2068] +70 None twogj Thierry plc2 [69, 1069, 2069] +71 None twoha Thierry plc2 [70, 1070, 2070] +72 None twohb Thierry plc2 [71, 1071, 2071] +73 None twohc Thierry plc2 [72, 1072, 2072] +74 None twohd Thierry plc2 [73, 1073, 2073] +75 None twohe Thierry plc2 [74, 1074, 2074] +76 None twohf Thierry plc2 [75, 1075, 2075] +77 None twohg Thierry plc2 [76, 1076, 2076] +78 None twohh Thierry plc2 [77, 1077, 2077] +79 None twohi Thierry plc2 [78, 1078, 2078] +80 None twohj Thierry plc2 [79, 1079, 2079] +81 None twoia Thierry plc2 [80, 1080, 2080] +82 None twoib Thierry plc2 [81, 1081, 2081] +83 None twoic Thierry plc2 [82, 1082, 2082] +84 None twoid Thierry plc2 [83, 1083, 2083] +85 None twoie Thierry plc2 [84, 1084, 2084] +86 None twoif Thierry plc2 [85, 1085, 2085] +87 None twoig Thierry plc2 [86, 1086, 2086] +88 None twoih Thierry plc2 [87, 1087, 2087] +89 None twoii Thierry plc2 [88, 1088, 2088] +90 None twoij Thierry plc2 [89, 1089, 2089] +91 None twoja Thierry plc2 [90, 1090, 2090] +92 None twojb Thierry plc2 [91, 1091, 2091] +93 None twojc Thierry plc2 [92, 1092, 2092] +94 None twojd Thierry plc2 [93, 1093, 2093] +95 None twoje Thierry plc2 [94, 1094, 2094] +96 None twojf Thierry plc2 [95, 1095, 2095] +97 None twojg Thierry plc2 [96, 1096, 2096] +98 None twojh Thierry plc2 [97, 1097, 2097] +99 None twoji Thierry plc2 [98, 1098, 2098] +100 None twojj Thierry plc2 [99, 1099, 2099] +101 None twobaa Thierry plc2 [100, 1100, 2100] +102 None twobab Thierry plc2 [101, 1101, 2101] +103 None twobac Thierry plc2 [102, 1102, 2102] +104 None twobad Thierry plc2 [103, 1103, 2103] +105 None twobae Thierry plc2 [104, 1104, 2104] +106 None twobaf Thierry plc2 [105, 1105, 2105] +107 None twobag Thierry plc2 [106, 1106, 2106] +108 None twobah Thierry plc2 [107, 1107, 2107] +109 None twobai Thierry plc2 [108, 1108, 2108] +110 None twobaj Thierry plc2 [109, 1109, 2109] +111 None twobba Thierry plc2 [110, 1110, 2110] +112 None twobbb Thierry plc2 [111, 1111, 2111] +113 None twobbc Thierry plc2 [112, 1112, 2112] +114 None twobbd Thierry plc2 [113, 1113, 2113] +115 None twobbe Thierry plc2 [114, 1114, 2114] +116 None twobbf Thierry plc2 [115, 1115, 2115] +117 None twobbg Thierry plc2 [116, 1116, 2116] +118 None twobbh Thierry plc2 [117, 1117, 2117] +119 None twobbi Thierry plc2 [118, 1118, 2118] +120 None twobbj Thierry plc2 [119, 1119, 2119] +121 None twobca Thierry plc2 [120, 1120, 2120] +122 None twobcb Thierry plc2 [121, 1121, 2121] +123 None twobcc Thierry plc2 [122, 1122, 2122] +124 None twobcd Thierry plc2 [123, 1123, 2123] +125 None twobce Thierry plc2 [124, 1124, 2124] +126 None twobcf Thierry plc2 [125, 1125, 2125] +127 None twobcg Thierry plc2 [126, 1126, 2126] +128 None twobch Thierry plc2 [127, 1127, 2127] +129 None twobci Thierry plc2 [128, 1128, 2128] +130 None twobcj Thierry plc2 [129, 1129, 2129] +131 None twobda Thierry plc2 [130, 1130, 2130] +132 None twobdb Thierry plc2 [131, 1131, 2131] +133 None twobdc Thierry plc2 [132, 1132, 2132] +134 None twobdd Thierry plc2 [133, 1133, 2133] +135 None twobde Thierry plc2 [134, 1134, 2134] +136 None twobdf Thierry plc2 [135, 1135, 2135] +137 None twobdg Thierry plc2 [136, 1136, 2136] +138 None twobdh Thierry plc2 [137, 1137, 2137] +139 None twobdi Thierry plc2 [138, 1138, 2138] +140 None twobdj Thierry plc2 [139, 1139, 2139] +141 None twobea Thierry plc2 [140, 1140, 2140] +142 None twobeb Thierry plc2 [141, 1141, 2141] +143 None twobec Thierry plc2 [142, 1142, 2142] +144 None twobed Thierry plc2 [143, 1143, 2143] +145 None twobee Thierry plc2 [144, 1144, 2144] +146 None twobef Thierry plc2 [145, 1145, 2145] +147 None twobeg Thierry plc2 [146, 1146, 2146] +148 None twobeh Thierry plc2 [147, 1147, 2147] +149 None twobei Thierry plc2 [148, 1148, 2148] +150 None twobej Thierry plc2 [149, 1149, 2149] +151 None twobfa Thierry plc2 [150, 1150, 2150] +152 None twobfb Thierry plc2 [151, 1151, 2151] +153 None twobfc Thierry plc2 [152, 1152, 2152] +154 None twobfd Thierry plc2 [153, 1153, 2153] +155 None twobfe Thierry plc2 [154, 1154, 2154] +156 None twobff Thierry plc2 [155, 1155, 2155] +157 None twobfg Thierry plc2 [156, 1156, 2156] +158 None twobfh Thierry plc2 [157, 1157, 2157] +159 None twobfi Thierry plc2 [158, 1158, 2158] +160 None twobfj Thierry plc2 [159, 1159, 2159] +161 None twobga Thierry plc2 [160, 1160, 2160] +162 None twobgb Thierry plc2 [161, 1161, 2161] +163 None twobgc Thierry plc2 [162, 1162, 2162] +164 None twobgd Thierry plc2 [163, 1163, 2163] +165 None twobge Thierry plc2 [164, 1164, 2164] +166 None twobgf Thierry plc2 [165, 1165, 2165] +167 None twobgg Thierry plc2 [166, 1166, 2166] +168 None twobgh Thierry plc2 [167, 1167, 2167] +169 None twobgi Thierry plc2 [168, 1168, 2168] +170 None twobgj Thierry plc2 [169, 1169, 2169] +171 None twobha Thierry plc2 [170, 1170, 2170] +172 None twobhb Thierry plc2 [171, 1171, 2171] +173 None twobhc Thierry plc2 [172, 1172, 2172] +174 None twobhd Thierry plc2 [173, 1173, 2173] +175 None twobhe Thierry plc2 [174, 1174, 2174] +176 None twobhf Thierry plc2 [175, 1175, 2175] +177 None twobhg Thierry plc2 [176, 1176, 2176] +178 None twobhh Thierry plc2 [177, 1177, 2177] +179 None twobhi Thierry plc2 [178, 1178, 2178] +180 None twobhj Thierry plc2 [179, 1179, 2179] +181 None twobia Thierry plc2 [180, 1180, 2180] +182 None twobib Thierry plc2 [181, 1181, 2181] +183 None twobic Thierry plc2 [182, 1182, 2182] +184 None twobid Thierry plc2 [183, 1183, 2183] +185 None twobie Thierry plc2 [184, 1184, 2184] +186 None twobif Thierry plc2 [185, 1185, 2185] +187 None twobig Thierry plc2 [186, 1186, 2186] +188 None twobih Thierry plc2 [187, 1187, 2187] +189 None twobii Thierry plc2 [188, 1188, 2188] +190 None twobij Thierry plc2 [189, 1189, 2189] +191 None twobja Thierry plc2 [190, 1190, 2190] +192 None twobjb Thierry plc2 [191, 1191, 2191] +193 None twobjc Thierry plc2 [192, 1192, 2192] +194 None twobjd Thierry plc2 [193, 1193, 2193] +195 None twobje Thierry plc2 [194, 1194, 2194] +196 None twobjf Thierry plc2 [195, 1195, 2195] +197 None twobjg Thierry plc2 [196, 1196, 2196] +198 None twobjh Thierry plc2 [197, 1197, 2197] +199 None twobji Thierry plc2 [198, 1198, 2198] +200 None twobjj Thierry plc2 [199, 1199, 2199] +201 None twocaa Thierry plc2 [200, 1200, 2200] +202 None twocab Thierry plc2 [201, 1201, 2201] +203 None twocac Thierry plc2 [202, 1202, 2202] +204 None twocad Thierry plc2 [203, 1203, 2203] +205 None twocae Thierry plc2 [204, 1204, 2204] +206 None twocaf Thierry plc2 [205, 1205, 2205] +207 None twocag Thierry plc2 [206, 1206, 2206] +208 None twocah Thierry plc2 [207, 1207, 2207] +209 None twocai Thierry plc2 [208, 1208, 2208] +210 None twocaj Thierry plc2 [209, 1209, 2209] +211 None twocba Thierry plc2 [210, 1210, 2210] +212 None twocbb Thierry plc2 [211, 1211, 2211] +213 None twocbc Thierry plc2 [212, 1212, 2212] +214 None twocbd Thierry plc2 [213, 1213, 2213] +215 None twocbe Thierry plc2 [214, 1214, 2214] +216 None twocbf Thierry plc2 [215, 1215, 2215] +217 None twocbg Thierry plc2 [216, 1216, 2216] +218 None twocbh Thierry plc2 [217, 1217, 2217] +219 None twocbi Thierry plc2 [218, 1218, 2218] +220 None twocbj Thierry plc2 [219, 1219, 2219] +221 None twocca Thierry plc2 [220, 1220, 2220] +222 None twoccb Thierry plc2 [221, 1221, 2221] +223 None twoccc Thierry plc2 [222, 1222, 2222] +224 None twoccd Thierry plc2 [223, 1223, 2223] +225 None twocce Thierry plc2 [224, 1224, 2224] +226 None twoccf Thierry plc2 [225, 1225, 2225] +227 None twoccg Thierry plc2 [226, 1226, 2226] +228 None twocch Thierry plc2 [227, 1227, 2227] +229 None twocci Thierry plc2 [228, 1228, 2228] +230 None twoccj Thierry plc2 [229, 1229, 2229] +231 None twocda Thierry plc2 [230, 1230, 2230] +232 None twocdb Thierry plc2 [231, 1231, 2231] +233 None twocdc Thierry plc2 [232, 1232, 2232] +234 None twocdd Thierry plc2 [233, 1233, 2233] +235 None twocde Thierry plc2 [234, 1234, 2234] +236 None twocdf Thierry plc2 [235, 1235, 2235] +237 None twocdg Thierry plc2 [236, 1236, 2236] +238 None twocdh Thierry plc2 [237, 1237, 2237] +239 None twocdi Thierry plc2 [238, 1238, 2238] +240 None twocdj Thierry plc2 [239, 1239, 2239] +241 None twocea Thierry plc2 [240, 1240, 2240] +242 None twoceb Thierry plc2 [241, 1241, 2241] +243 None twocec Thierry plc2 [242, 1242, 2242] +244 None twoced Thierry plc2 [243, 1243, 2243] +245 None twocee Thierry plc2 [244, 1244, 2244] +246 None twocef Thierry plc2 [245, 1245, 2245] +247 None twoceg Thierry plc2 [246, 1246, 2246] +248 None twoceh Thierry plc2 [247, 1247, 2247] +249 None twocei Thierry plc2 [248, 1248, 2248] +250 None twocej Thierry plc2 [249, 1249, 2249] +251 None twocfa Thierry plc2 [250, 1250, 2250] +252 None twocfb Thierry plc2 [251, 1251, 2251] +253 None twocfc Thierry plc2 [252, 1252, 2252] +254 None twocfd Thierry plc2 [253, 1253, 2253] +255 None twocfe Thierry plc2 [254, 1254, 2254] +256 None twocff Thierry plc2 [255, 1255, 2255] +257 None twocfg Thierry plc2 [256, 1256, 2256] +258 None twocfh Thierry plc2 [257, 1257, 2257] +259 None twocfi Thierry plc2 [258, 1258, 2258] +260 None twocfj Thierry plc2 [259, 1259, 2259] +261 None twocga Thierry plc2 [260, 1260, 2260] +262 None twocgb Thierry plc2 [261, 1261, 2261] +263 None twocgc Thierry plc2 [262, 1262, 2262] +264 None twocgd Thierry plc2 [263, 1263, 2263] +265 None twocge Thierry plc2 [264, 1264, 2264] +266 None twocgf Thierry plc2 [265, 1265, 2265] +267 None twocgg Thierry plc2 [266, 1266, 2266] +268 None twocgh Thierry plc2 [267, 1267, 2267] +269 None twocgi Thierry plc2 [268, 1268, 2268] +270 None twocgj Thierry plc2 [269, 1269, 2269] +271 None twocha Thierry plc2 [270, 1270, 2270] +272 None twochb Thierry plc2 [271, 1271, 2271] +273 None twochc Thierry plc2 [272, 1272, 2272] +274 None twochd Thierry plc2 [273, 1273, 2273] +275 None twoche Thierry plc2 [274, 1274, 2274] +276 None twochf Thierry plc2 [275, 1275, 2275] +277 None twochg Thierry plc2 [276, 1276, 2276] +278 None twochh Thierry plc2 [277, 1277, 2277] +279 None twochi Thierry plc2 [278, 1278, 2278] +280 None twochj Thierry plc2 [279, 1279, 2279] +281 None twocia Thierry plc2 [280, 1280, 2280] +282 None twocib Thierry plc2 [281, 1281, 2281] +283 None twocic Thierry plc2 [282, 1282, 2282] +284 None twocid Thierry plc2 [283, 1283, 2283] +285 None twocie Thierry plc2 [284, 1284, 2284] +286 None twocif Thierry plc2 [285, 1285, 2285] +287 None twocig Thierry plc2 [286, 1286, 2286] +288 None twocih Thierry plc2 [287, 1287, 2287] +289 None twocii Thierry plc2 [288, 1288, 2288] +290 None twocij Thierry plc2 [289, 1289, 2289] +291 None twocja Thierry plc2 [290, 1290, 2290] +292 None twocjb Thierry plc2 [291, 1291, 2291] +293 None twocjc Thierry plc2 [292, 1292, 2292] +294 None twocjd Thierry plc2 [293, 1293, 2293] +295 None twocje Thierry plc2 [294, 1294, 2294] +296 None twocjf Thierry plc2 [295, 1295, 2295] +297 None twocjg Thierry plc2 [296, 1296, 2296] +298 None twocjh Thierry plc2 [297, 1297, 2297] +299 None twocji Thierry plc2 [298, 1298, 2298] +300 None twocjj Thierry plc2 [299, 1299, 2299] +301 None twodaa Thierry plc2 [300, 1300, 2300] +302 None twodab Thierry plc2 [301, 1301, 2301] +303 None twodac Thierry plc2 [302, 1302, 2302] +304 None twodad Thierry plc2 [303, 1303, 2303] +305 None twodae Thierry plc2 [304, 1304, 2304] +306 None twodaf Thierry plc2 [305, 1305, 2305] +307 None twodag Thierry plc2 [306, 1306, 2306] +308 None twodah Thierry plc2 [307, 1307, 2307] +309 None twodai Thierry plc2 [308, 1308, 2308] +310 None twodaj Thierry plc2 [309, 1309, 2309] +311 None twodba Thierry plc2 [310, 1310, 2310] +312 None twodbb Thierry plc2 [311, 1311, 2311] +313 None twodbc Thierry plc2 [312, 1312, 2312] +314 None twodbd Thierry plc2 [313, 1313, 2313] +315 None twodbe Thierry plc2 [314, 1314, 2314] +316 None twodbf Thierry plc2 [315, 1315, 2315] +317 None twodbg Thierry plc2 [316, 1316, 2316] +318 None twodbh Thierry plc2 [317, 1317, 2317] +319 None twodbi Thierry plc2 [318, 1318, 2318] +320 None twodbj Thierry plc2 [319, 1319, 2319] +321 None twodca Thierry plc2 [320, 1320, 2320] +322 None twodcb Thierry plc2 [321, 1321, 2321] +323 None twodcc Thierry plc2 [322, 1322, 2322] +324 None twodcd Thierry plc2 [323, 1323, 2323] +325 None twodce Thierry plc2 [324, 1324, 2324] +326 None twodcf Thierry plc2 [325, 1325, 2325] +327 None twodcg Thierry plc2 [326, 1326, 2326] +328 None twodch Thierry plc2 [327, 1327, 2327] +329 None twodci Thierry plc2 [328, 1328, 2328] +330 None twodcj Thierry plc2 [329, 1329, 2329] +331 None twodda Thierry plc2 [330, 1330, 2330] +332 None twoddb Thierry plc2 [331, 1331, 2331] +333 None twoddc Thierry plc2 [332, 1332, 2332] +334 None twoddd Thierry plc2 [333, 1333, 2333] +335 None twodde Thierry plc2 [334, 1334, 2334] +336 None twoddf Thierry plc2 [335, 1335, 2335] +337 None twoddg Thierry plc2 [336, 1336, 2336] +338 None twoddh Thierry plc2 [337, 1337, 2337] +339 None twoddi Thierry plc2 [338, 1338, 2338] +340 None twoddj Thierry plc2 [339, 1339, 2339] +341 None twodea Thierry plc2 [340, 1340, 2340] +342 None twodeb Thierry plc2 [341, 1341, 2341] +343 None twodec Thierry plc2 [342, 1342, 2342] +344 None twoded Thierry plc2 [343, 1343, 2343] +345 None twodee Thierry plc2 [344, 1344, 2344] +346 None twodef Thierry plc2 [345, 1345, 2345] +347 None twodeg Thierry plc2 [346, 1346, 2346] +348 None twodeh Thierry plc2 [347, 1347, 2347] +349 None twodei Thierry plc2 [348, 1348, 2348] +350 None twodej Thierry plc2 [349, 1349, 2349] +351 None twodfa Thierry plc2 [350, 1350, 2350] +352 None twodfb Thierry plc2 [351, 1351, 2351] +353 None twodfc Thierry plc2 [352, 1352, 2352] +354 None twodfd Thierry plc2 [353, 1353, 2353] +355 None twodfe Thierry plc2 [354, 1354, 2354] +356 None twodff Thierry plc2 [355, 1355, 2355] +357 None twodfg Thierry plc2 [356, 1356, 2356] +358 None twodfh Thierry plc2 [357, 1357, 2357] +359 None twodfi Thierry plc2 [358, 1358, 2358] +360 None twodfj Thierry plc2 [359, 1359, 2359] +361 None twodga Thierry plc2 [360, 1360, 2360] +362 None twodgb Thierry plc2 [361, 1361, 2361] +363 None twodgc Thierry plc2 [362, 1362, 2362] +364 None twodgd Thierry plc2 [363, 1363, 2363] +365 None twodge Thierry plc2 [364, 1364, 2364] +366 None twodgf Thierry plc2 [365, 1365, 2365] +367 None twodgg Thierry plc2 [366, 1366, 2366] +368 None twodgh Thierry plc2 [367, 1367, 2367] +369 None twodgi Thierry plc2 [368, 1368, 2368] +370 None twodgj Thierry plc2 [369, 1369, 2369] +371 None twodha Thierry plc2 [370, 1370, 2370] +372 None twodhb Thierry plc2 [371, 1371, 2371] +373 None twodhc Thierry plc2 [372, 1372, 2372] +374 None twodhd Thierry plc2 [373, 1373, 2373] +375 None twodhe Thierry plc2 [374, 1374, 2374] +376 None twodhf Thierry plc2 [375, 1375, 2375] +377 None twodhg Thierry plc2 [376, 1376, 2376] +378 None twodhh Thierry plc2 [377, 1377, 2377] +379 None twodhi Thierry plc2 [378, 1378, 2378] +380 None twodhj Thierry plc2 [379, 1379, 2379] +381 None twodia Thierry plc2 [380, 1380, 2380] +382 None twodib Thierry plc2 [381, 1381, 2381] +383 None twodic Thierry plc2 [382, 1382, 2382] +384 None twodid Thierry plc2 [383, 1383, 2383] +385 None twodie Thierry plc2 [384, 1384, 2384] +386 None twodif Thierry plc2 [385, 1385, 2385] +387 None twodig Thierry plc2 [386, 1386, 2386] +388 None twodih Thierry plc2 [387, 1387, 2387] +389 None twodii Thierry plc2 [388, 1388, 2388] +390 None twodij Thierry plc2 [389, 1389, 2389] +391 None twodja Thierry plc2 [390, 1390, 2390] +392 None twodjb Thierry plc2 [391, 1391, 2391] +393 None twodjc Thierry plc2 [392, 1392, 2392] +394 None twodjd Thierry plc2 [393, 1393, 2393] +395 None twodje Thierry plc2 [394, 1394, 2394] +396 None twodjf Thierry plc2 [395, 1395, 2395] +397 None twodjg Thierry plc2 [396, 1396, 2396] +398 None twodjh Thierry plc2 [397, 1397, 2397] +399 None twodji Thierry plc2 [398, 1398, 2398] +400 None twodjj Thierry plc2 [399, 1399, 2399] +401 None twoeaa Thierry plc2 [400, 1400, 2400] +402 None twoeab Thierry plc2 [401, 1401, 2401] +403 None twoeac Thierry plc2 [402, 1402, 2402] +404 None twoead Thierry plc2 [403, 1403, 2403] +405 None twoeae Thierry plc2 [404, 1404, 2404] +406 None twoeaf Thierry plc2 [405, 1405, 2405] +407 None twoeag Thierry plc2 [406, 1406, 2406] +408 None twoeah Thierry plc2 [407, 1407, 2407] +409 None twoeai Thierry plc2 [408, 1408, 2408] +410 None twoeaj Thierry plc2 [409, 1409, 2409] +411 None twoeba Thierry plc2 [410, 1410, 2410] +412 None twoebb Thierry plc2 [411, 1411, 2411] +413 None twoebc Thierry plc2 [412, 1412, 2412] +414 None twoebd Thierry plc2 [413, 1413, 2413] +415 None twoebe Thierry plc2 [414, 1414, 2414] +416 None twoebf Thierry plc2 [415, 1415, 2415] +417 None twoebg Thierry plc2 [416, 1416, 2416] +418 None twoebh Thierry plc2 [417, 1417, 2417] +419 None twoebi Thierry plc2 [418, 1418, 2418] +420 None twoebj Thierry plc2 [419, 1419, 2419] +421 None twoeca Thierry plc2 [420, 1420, 2420] +422 None twoecb Thierry plc2 [421, 1421, 2421] +423 None twoecc Thierry plc2 [422, 1422, 2422] +424 None twoecd Thierry plc2 [423, 1423, 2423] +425 None twoece Thierry plc2 [424, 1424, 2424] +426 None twoecf Thierry plc2 [425, 1425, 2425] +427 None twoecg Thierry plc2 [426, 1426, 2426] +428 None twoech Thierry plc2 [427, 1427, 2427] +429 None twoeci Thierry plc2 [428, 1428, 2428] +430 None twoecj Thierry plc2 [429, 1429, 2429] +431 None twoeda Thierry plc2 [430, 1430, 2430] +432 None twoedb Thierry plc2 [431, 1431, 2431] +433 None twoedc Thierry plc2 [432, 1432, 2432] +434 None twoedd Thierry plc2 [433, 1433, 2433] +435 None twoede Thierry plc2 [434, 1434, 2434] +436 None twoedf Thierry plc2 [435, 1435, 2435] +437 None twoedg Thierry plc2 [436, 1436, 2436] +438 None twoedh Thierry plc2 [437, 1437, 2437] +439 None twoedi Thierry plc2 [438, 1438, 2438] +440 None twoedj Thierry plc2 [439, 1439, 2439] +441 None twoeea Thierry plc2 [440, 1440, 2440] +442 None twoeeb Thierry plc2 [441, 1441, 2441] +443 None twoeec Thierry plc2 [442, 1442, 2442] +444 None twoeed Thierry plc2 [443, 1443, 2443] +445 None twoeee Thierry plc2 [444, 1444, 2444] +446 None twoeef Thierry plc2 [445, 1445, 2445] +447 None twoeeg Thierry plc2 [446, 1446, 2446] +448 None twoeeh Thierry plc2 [447, 1447, 2447] +449 None twoeei Thierry plc2 [448, 1448, 2448] +450 None twoeej Thierry plc2 [449, 1449, 2449] +451 None twoefa Thierry plc2 [450, 1450, 2450] +452 None twoefb Thierry plc2 [451, 1451, 2451] +453 None twoefc Thierry plc2 [452, 1452, 2452] +454 None twoefd Thierry plc2 [453, 1453, 2453] +455 None twoefe Thierry plc2 [454, 1454, 2454] +456 None twoeff Thierry plc2 [455, 1455, 2455] +457 None twoefg Thierry plc2 [456, 1456, 2456] +458 None twoefh Thierry plc2 [457, 1457, 2457] +459 None twoefi Thierry plc2 [458, 1458, 2458] +460 None twoefj Thierry plc2 [459, 1459, 2459] +461 None twoega Thierry plc2 [460, 1460, 2460] +462 None twoegb Thierry plc2 [461, 1461, 2461] +463 None twoegc Thierry plc2 [462, 1462, 2462] +464 None twoegd Thierry plc2 [463, 1463, 2463] +465 None twoege Thierry plc2 [464, 1464, 2464] +466 None twoegf Thierry plc2 [465, 1465, 2465] +467 None twoegg Thierry plc2 [466, 1466, 2466] +468 None twoegh Thierry plc2 [467, 1467, 2467] +469 None twoegi Thierry plc2 [468, 1468, 2468] +470 None twoegj Thierry plc2 [469, 1469, 2469] +471 None twoeha Thierry plc2 [470, 1470, 2470] +472 None twoehb Thierry plc2 [471, 1471, 2471] +473 None twoehc Thierry plc2 [472, 1472, 2472] +474 None twoehd Thierry plc2 [473, 1473, 2473] +475 None twoehe Thierry plc2 [474, 1474, 2474] +476 None twoehf Thierry plc2 [475, 1475, 2475] +477 None twoehg Thierry plc2 [476, 1476, 2476] +478 None twoehh Thierry plc2 [477, 1477, 2477] +479 None twoehi Thierry plc2 [478, 1478, 2478] +480 None twoehj Thierry plc2 [479, 1479, 2479] +481 None twoeia Thierry plc2 [480, 1480, 2480] +482 None twoeib Thierry plc2 [481, 1481, 2481] +483 None twoeic Thierry plc2 [482, 1482, 2482] +484 None twoeid Thierry plc2 [483, 1483, 2483] +485 None twoeie Thierry plc2 [484, 1484, 2484] +486 None twoeif Thierry plc2 [485, 1485, 2485] +487 None twoeig Thierry plc2 [486, 1486, 2486] +488 None twoeih Thierry plc2 [487, 1487, 2487] +489 None twoeii Thierry plc2 [488, 1488, 2488] +490 None twoeij Thierry plc2 [489, 1489, 2489] +491 None twoeja Thierry plc2 [490, 1490, 2490] +492 None twoejb Thierry plc2 [491, 1491, 2491] +493 None twoejc Thierry plc2 [492, 1492, 2492] +494 None twoejd Thierry plc2 [493, 1493, 2493] +495 None twoeje Thierry plc2 [494, 1494, 2494] +496 None twoejf Thierry plc2 [495, 1495, 2495] +497 None twoejg Thierry plc2 [496, 1496, 2496] +498 None twoejh Thierry plc2 [497, 1497, 2497] +499 None twoeji Thierry plc2 [498, 1498, 2498] +500 None twoejj Thierry plc2 [499, 1499, 2499] +501 None twofaa Thierry plc2 [500, 1500, 2500] +502 None twofab Thierry plc2 [501, 1501, 2501] +503 None twofac Thierry plc2 [502, 1502, 2502] +504 None twofad Thierry plc2 [503, 1503, 2503] +505 None twofae Thierry plc2 [504, 1504, 2504] +506 None twofaf Thierry plc2 [505, 1505, 2505] +507 None twofag Thierry plc2 [506, 1506, 2506] +508 None twofah Thierry plc2 [507, 1507, 2507] +509 None twofai Thierry plc2 [508, 1508, 2508] +510 None twofaj Thierry plc2 [509, 1509, 2509] +511 None twofba Thierry plc2 [510, 1510, 2510] +512 None twofbb Thierry plc2 [511, 1511, 2511] +513 None twofbc Thierry plc2 [512, 1512, 2512] +514 None twofbd Thierry plc2 [513, 1513, 2513] +515 None twofbe Thierry plc2 [514, 1514, 2514] +516 None twofbf Thierry plc2 [515, 1515, 2515] +517 None twofbg Thierry plc2 [516, 1516, 2516] +518 None twofbh Thierry plc2 [517, 1517, 2517] +519 None twofbi Thierry plc2 [518, 1518, 2518] +520 None twofbj Thierry plc2 [519, 1519, 2519] +521 None twofca Thierry plc2 [520, 1520, 2520] +522 None twofcb Thierry plc2 [521, 1521, 2521] +523 None twofcc Thierry plc2 [522, 1522, 2522] +524 None twofcd Thierry plc2 [523, 1523, 2523] +525 None twofce Thierry plc2 [524, 1524, 2524] +526 None twofcf Thierry plc2 [525, 1525, 2525] +527 None twofcg Thierry plc2 [526, 1526, 2526] +528 None twofch Thierry plc2 [527, 1527, 2527] +529 None twofci Thierry plc2 [528, 1528, 2528] +530 None twofcj Thierry plc2 [529, 1529, 2529] +531 None twofda Thierry plc2 [530, 1530, 2530] +532 None twofdb Thierry plc2 [531, 1531, 2531] +533 None twofdc Thierry plc2 [532, 1532, 2532] +534 None twofdd Thierry plc2 [533, 1533, 2533] +535 None twofde Thierry plc2 [534, 1534, 2534] +536 None twofdf Thierry plc2 [535, 1535, 2535] +537 None twofdg Thierry plc2 [536, 1536, 2536] +538 None twofdh Thierry plc2 [537, 1537, 2537] +539 None twofdi Thierry plc2 [538, 1538, 2538] +540 None twofdj Thierry plc2 [539, 1539, 2539] +541 None twofea Thierry plc2 [540, 1540, 2540] +542 None twofeb Thierry plc2 [541, 1541, 2541] +543 None twofec Thierry plc2 [542, 1542, 2542] +544 None twofed Thierry plc2 [543, 1543, 2543] +545 None twofee Thierry plc2 [544, 1544, 2544] +546 None twofef Thierry plc2 [545, 1545, 2545] +547 None twofeg Thierry plc2 [546, 1546, 2546] +548 None twofeh Thierry plc2 [547, 1547, 2547] +549 None twofei Thierry plc2 [548, 1548, 2548] +550 None twofej Thierry plc2 [549, 1549, 2549] +551 None twoffa Thierry plc2 [550, 1550, 2550] +552 None twoffb Thierry plc2 [551, 1551, 2551] +553 None twoffc Thierry plc2 [552, 1552, 2552] +554 None twoffd Thierry plc2 [553, 1553, 2553] +555 None twoffe Thierry plc2 [554, 1554, 2554] +556 None twofff Thierry plc2 [555, 1555, 2555] +557 None twoffg Thierry plc2 [556, 1556, 2556] +558 None twoffh Thierry plc2 [557, 1557, 2557] +559 None twoffi Thierry plc2 [558, 1558, 2558] +560 None twoffj Thierry plc2 [559, 1559, 2559] +561 None twofga Thierry plc2 [560, 1560, 2560] +562 None twofgb Thierry plc2 [561, 1561, 2561] +563 None twofgc Thierry plc2 [562, 1562, 2562] +564 None twofgd Thierry plc2 [563, 1563, 2563] +565 None twofge Thierry plc2 [564, 1564, 2564] +566 None twofgf Thierry plc2 [565, 1565, 2565] +567 None twofgg Thierry plc2 [566, 1566, 2566] +568 None twofgh Thierry plc2 [567, 1567, 2567] +569 None twofgi Thierry plc2 [568, 1568, 2568] +570 None twofgj Thierry plc2 [569, 1569, 2569] +571 None twofha Thierry plc2 [570, 1570, 2570] +572 None twofhb Thierry plc2 [571, 1571, 2571] +573 None twofhc Thierry plc2 [572, 1572, 2572] +574 None twofhd Thierry plc2 [573, 1573, 2573] +575 None twofhe Thierry plc2 [574, 1574, 2574] +576 None twofhf Thierry plc2 [575, 1575, 2575] +577 None twofhg Thierry plc2 [576, 1576, 2576] +578 None twofhh Thierry plc2 [577, 1577, 2577] +579 None twofhi Thierry plc2 [578, 1578, 2578] +580 None twofhj Thierry plc2 [579, 1579, 2579] +581 None twofia Thierry plc2 [580, 1580, 2580] +582 None twofib Thierry plc2 [581, 1581, 2581] +583 None twofic Thierry plc2 [582, 1582, 2582] +584 None twofid Thierry plc2 [583, 1583, 2583] +585 None twofie Thierry plc2 [584, 1584, 2584] +586 None twofif Thierry plc2 [585, 1585, 2585] +587 None twofig Thierry plc2 [586, 1586, 2586] +588 None twofih Thierry plc2 [587, 1587, 2587] +589 None twofii Thierry plc2 [588, 1588, 2588] +590 None twofij Thierry plc2 [589, 1589, 2589] +591 None twofja Thierry plc2 [590, 1590, 2590] +592 None twofjb Thierry plc2 [591, 1591, 2591] +593 None twofjc Thierry plc2 [592, 1592, 2592] +594 None twofjd Thierry plc2 [593, 1593, 2593] +595 None twofje Thierry plc2 [594, 1594, 2594] +596 None twofjf Thierry plc2 [595, 1595, 2595] +597 None twofjg Thierry plc2 [596, 1596, 2596] +598 None twofjh Thierry plc2 [597, 1597, 2597] +599 None twofji Thierry plc2 [598, 1598, 2598] +600 None twofjj Thierry plc2 [599, 1599, 2599] +601 None twogaa Thierry plc2 [600, 1600, 2600] +602 None twogab Thierry plc2 [601, 1601, 2601] +603 None twogac Thierry plc2 [602, 1602, 2602] +604 None twogad Thierry plc2 [603, 1603, 2603] +605 None twogae Thierry plc2 [604, 1604, 2604] +606 None twogaf Thierry plc2 [605, 1605, 2605] +607 None twogag Thierry plc2 [606, 1606, 2606] +608 None twogah Thierry plc2 [607, 1607, 2607] +609 None twogai Thierry plc2 [608, 1608, 2608] +610 None twogaj Thierry plc2 [609, 1609, 2609] +611 None twogba Thierry plc2 [610, 1610, 2610] +612 None twogbb Thierry plc2 [611, 1611, 2611] +613 None twogbc Thierry plc2 [612, 1612, 2612] +614 None twogbd Thierry plc2 [613, 1613, 2613] +615 None twogbe Thierry plc2 [614, 1614, 2614] +616 None twogbf Thierry plc2 [615, 1615, 2615] +617 None twogbg Thierry plc2 [616, 1616, 2616] +618 None twogbh Thierry plc2 [617, 1617, 2617] +619 None twogbi Thierry plc2 [618, 1618, 2618] +620 None twogbj Thierry plc2 [619, 1619, 2619] +621 None twogca Thierry plc2 [620, 1620, 2620] +622 None twogcb Thierry plc2 [621, 1621, 2621] +623 None twogcc Thierry plc2 [622, 1622, 2622] +624 None twogcd Thierry plc2 [623, 1623, 2623] +625 None twogce Thierry plc2 [624, 1624, 2624] +626 None twogcf Thierry plc2 [625, 1625, 2625] +627 None twogcg Thierry plc2 [626, 1626, 2626] +628 None twogch Thierry plc2 [627, 1627, 2627] +629 None twogci Thierry plc2 [628, 1628, 2628] +630 None twogcj Thierry plc2 [629, 1629, 2629] +631 None twogda Thierry plc2 [630, 1630, 2630] +632 None twogdb Thierry plc2 [631, 1631, 2631] +633 None twogdc Thierry plc2 [632, 1632, 2632] +634 None twogdd Thierry plc2 [633, 1633, 2633] +635 None twogde Thierry plc2 [634, 1634, 2634] +636 None twogdf Thierry plc2 [635, 1635, 2635] +637 None twogdg Thierry plc2 [636, 1636, 2636] +638 None twogdh Thierry plc2 [637, 1637, 2637] +639 None twogdi Thierry plc2 [638, 1638, 2638] +640 None twogdj Thierry plc2 [639, 1639, 2639] +641 None twogea Thierry plc2 [640, 1640, 2640] +642 None twogeb Thierry plc2 [641, 1641, 2641] +643 None twogec Thierry plc2 [642, 1642, 2642] +644 None twoged Thierry plc2 [643, 1643, 2643] +645 None twogee Thierry plc2 [644, 1644, 2644] +646 None twogef Thierry plc2 [645, 1645, 2645] +647 None twogeg Thierry plc2 [646, 1646, 2646] +648 None twogeh Thierry plc2 [647, 1647, 2647] +649 None twogei Thierry plc2 [648, 1648, 2648] +650 None twogej Thierry plc2 [649, 1649, 2649] +651 None twogfa Thierry plc2 [650, 1650, 2650] +652 None twogfb Thierry plc2 [651, 1651, 2651] +653 None twogfc Thierry plc2 [652, 1652, 2652] +654 None twogfd Thierry plc2 [653, 1653, 2653] +655 None twogfe Thierry plc2 [654, 1654, 2654] +656 None twogff Thierry plc2 [655, 1655, 2655] +657 None twogfg Thierry plc2 [656, 1656, 2656] +658 None twogfh Thierry plc2 [657, 1657, 2657] +659 None twogfi Thierry plc2 [658, 1658, 2658] +660 None twogfj Thierry plc2 [659, 1659, 2659] +661 None twogga Thierry plc2 [660, 1660, 2660] +662 None twoggb Thierry plc2 [661, 1661, 2661] +663 None twoggc Thierry plc2 [662, 1662, 2662] +664 None twoggd Thierry plc2 [663, 1663, 2663] +665 None twogge Thierry plc2 [664, 1664, 2664] +666 None twoggf Thierry plc2 [665, 1665, 2665] +667 None twoggg Thierry plc2 [666, 1666, 2666] +668 None twoggh Thierry plc2 [667, 1667, 2667] +669 None twoggi Thierry plc2 [668, 1668, 2668] +670 None twoggj Thierry plc2 [669, 1669, 2669] +671 None twogha Thierry plc2 [670, 1670, 2670] +672 None twoghb Thierry plc2 [671, 1671, 2671] +673 None twoghc Thierry plc2 [672, 1672, 2672] +674 None twoghd Thierry plc2 [673, 1673, 2673] +675 None twoghe Thierry plc2 [674, 1674, 2674] +676 None twoghf Thierry plc2 [675, 1675, 2675] +677 None twoghg Thierry plc2 [676, 1676, 2676] +678 None twoghh Thierry plc2 [677, 1677, 2677] +679 None twoghi Thierry plc2 [678, 1678, 2678] +680 None twoghj Thierry plc2 [679, 1679, 2679] +681 None twogia Thierry plc2 [680, 1680, 2680] +682 None twogib Thierry plc2 [681, 1681, 2681] +683 None twogic Thierry plc2 [682, 1682, 2682] +684 None twogid Thierry plc2 [683, 1683, 2683] +685 None twogie Thierry plc2 [684, 1684, 2684] +686 None twogif Thierry plc2 [685, 1685, 2685] +687 None twogig Thierry plc2 [686, 1686, 2686] +688 None twogih Thierry plc2 [687, 1687, 2687] +689 None twogii Thierry plc2 [688, 1688, 2688] +690 None twogij Thierry plc2 [689, 1689, 2689] +691 None twogja Thierry plc2 [690, 1690, 2690] +692 None twogjb Thierry plc2 [691, 1691, 2691] +693 None twogjc Thierry plc2 [692, 1692, 2692] +694 None twogjd Thierry plc2 [693, 1693, 2693] +695 None twogje Thierry plc2 [694, 1694, 2694] +696 None twogjf Thierry plc2 [695, 1695, 2695] +697 None twogjg Thierry plc2 [696, 1696, 2696] +698 None twogjh Thierry plc2 [697, 1697, 2697] +699 None twogji Thierry plc2 [698, 1698, 2698] +700 None twogjj Thierry plc2 [699, 1699, 2699] +701 None twohaa Thierry plc2 [700, 1700, 2700] +702 None twohab Thierry plc2 [701, 1701, 2701] +703 None twohac Thierry plc2 [702, 1702, 2702] +704 None twohad Thierry plc2 [703, 1703, 2703] +705 None twohae Thierry plc2 [704, 1704, 2704] +706 None twohaf Thierry plc2 [705, 1705, 2705] +707 None twohag Thierry plc2 [706, 1706, 2706] +708 None twohah Thierry plc2 [707, 1707, 2707] +709 None twohai Thierry plc2 [708, 1708, 2708] +710 None twohaj Thierry plc2 [709, 1709, 2709] +711 None twohba Thierry plc2 [710, 1710, 2710] +712 None twohbb Thierry plc2 [711, 1711, 2711] +713 None twohbc Thierry plc2 [712, 1712, 2712] +714 None twohbd Thierry plc2 [713, 1713, 2713] +715 None twohbe Thierry plc2 [714, 1714, 2714] +716 None twohbf Thierry plc2 [715, 1715, 2715] +717 None twohbg Thierry plc2 [716, 1716, 2716] +718 None twohbh Thierry plc2 [717, 1717, 2717] +719 None twohbi Thierry plc2 [718, 1718, 2718] +720 None twohbj Thierry plc2 [719, 1719, 2719] +721 None twohca Thierry plc2 [720, 1720, 2720] +722 None twohcb Thierry plc2 [721, 1721, 2721] +723 None twohcc Thierry plc2 [722, 1722, 2722] +724 None twohcd Thierry plc2 [723, 1723, 2723] +725 None twohce Thierry plc2 [724, 1724, 2724] +726 None twohcf Thierry plc2 [725, 1725, 2725] +727 None twohcg Thierry plc2 [726, 1726, 2726] +728 None twohch Thierry plc2 [727, 1727, 2727] +729 None twohci Thierry plc2 [728, 1728, 2728] +730 None twohcj Thierry plc2 [729, 1729, 2729] +731 None twohda Thierry plc2 [730, 1730, 2730] +732 None twohdb Thierry plc2 [731, 1731, 2731] +733 None twohdc Thierry plc2 [732, 1732, 2732] +734 None twohdd Thierry plc2 [733, 1733, 2733] +735 None twohde Thierry plc2 [734, 1734, 2734] +736 None twohdf Thierry plc2 [735, 1735, 2735] +737 None twohdg Thierry plc2 [736, 1736, 2736] +738 None twohdh Thierry plc2 [737, 1737, 2737] +739 None twohdi Thierry plc2 [738, 1738, 2738] +740 None twohdj Thierry plc2 [739, 1739, 2739] +741 None twohea Thierry plc2 [740, 1740, 2740] +742 None twoheb Thierry plc2 [741, 1741, 2741] +743 None twohec Thierry plc2 [742, 1742, 2742] +744 None twohed Thierry plc2 [743, 1743, 2743] +745 None twohee Thierry plc2 [744, 1744, 2744] +746 None twohef Thierry plc2 [745, 1745, 2745] +747 None twoheg Thierry plc2 [746, 1746, 2746] +748 None twoheh Thierry plc2 [747, 1747, 2747] +749 None twohei Thierry plc2 [748, 1748, 2748] +750 None twohej Thierry plc2 [749, 1749, 2749] +751 None twohfa Thierry plc2 [750, 1750, 2750] +752 None twohfb Thierry plc2 [751, 1751, 2751] +753 None twohfc Thierry plc2 [752, 1752, 2752] +754 None twohfd Thierry plc2 [753, 1753, 2753] +755 None twohfe Thierry plc2 [754, 1754, 2754] +756 None twohff Thierry plc2 [755, 1755, 2755] +757 None twohfg Thierry plc2 [756, 1756, 2756] +758 None twohfh Thierry plc2 [757, 1757, 2757] +759 None twohfi Thierry plc2 [758, 1758, 2758] +760 None twohfj Thierry plc2 [759, 1759, 2759] +761 None twohga Thierry plc2 [760, 1760, 2760] +762 None twohgb Thierry plc2 [761, 1761, 2761] +763 None twohgc Thierry plc2 [762, 1762, 2762] +764 None twohgd Thierry plc2 [763, 1763, 2763] +765 None twohge Thierry plc2 [764, 1764, 2764] +766 None twohgf Thierry plc2 [765, 1765, 2765] +767 None twohgg Thierry plc2 [766, 1766, 2766] +768 None twohgh Thierry plc2 [767, 1767, 2767] +769 None twohgi Thierry plc2 [768, 1768, 2768] +770 None twohgj Thierry plc2 [769, 1769, 2769] +771 None twohha Thierry plc2 [770, 1770, 2770] +772 None twohhb Thierry plc2 [771, 1771, 2771] +773 None twohhc Thierry plc2 [772, 1772, 2772] +774 None twohhd Thierry plc2 [773, 1773, 2773] +775 None twohhe Thierry plc2 [774, 1774, 2774] +776 None twohhf Thierry plc2 [775, 1775, 2775] +777 None twohhg Thierry plc2 [776, 1776, 2776] +778 None twohhh Thierry plc2 [777, 1777, 2777] +779 None twohhi Thierry plc2 [778, 1778, 2778] +780 None twohhj Thierry plc2 [779, 1779, 2779] +781 None twohia Thierry plc2 [780, 1780, 2780] +782 None twohib Thierry plc2 [781, 1781, 2781] +783 None twohic Thierry plc2 [782, 1782, 2782] +784 None twohid Thierry plc2 [783, 1783, 2783] +785 None twohie Thierry plc2 [784, 1784, 2784] +786 None twohif Thierry plc2 [785, 1785, 2785] +787 None twohig Thierry plc2 [786, 1786, 2786] +788 None twohih Thierry plc2 [787, 1787, 2787] +789 None twohii Thierry plc2 [788, 1788, 2788] +790 None twohij Thierry plc2 [789, 1789, 2789] +791 None twohja Thierry plc2 [790, 1790, 2790] +792 None twohjb Thierry plc2 [791, 1791, 2791] +793 None twohjc Thierry plc2 [792, 1792, 2792] +794 None twohjd Thierry plc2 [793, 1793, 2793] +795 None twohje Thierry plc2 [794, 1794, 2794] +796 None twohjf Thierry plc2 [795, 1795, 2795] +797 None twohjg Thierry plc2 [796, 1796, 2796] +798 None twohjh Thierry plc2 [797, 1797, 2797] +799 None twohji Thierry plc2 [798, 1798, 2798] +800 None twohjj Thierry plc2 [799, 1799, 2799] +801 None twoiaa Thierry plc2 [800, 1800, 2800] +802 None twoiab Thierry plc2 [801, 1801, 2801] +803 None twoiac Thierry plc2 [802, 1802, 2802] +804 None twoiad Thierry plc2 [803, 1803, 2803] +805 None twoiae Thierry plc2 [804, 1804, 2804] +806 None twoiaf Thierry plc2 [805, 1805, 2805] +807 None twoiag Thierry plc2 [806, 1806, 2806] +808 None twoiah Thierry plc2 [807, 1807, 2807] +809 None twoiai Thierry plc2 [808, 1808, 2808] +810 None twoiaj Thierry plc2 [809, 1809, 2809] +811 None twoiba Thierry plc2 [810, 1810, 2810] +812 None twoibb Thierry plc2 [811, 1811, 2811] +813 None twoibc Thierry plc2 [812, 1812, 2812] +814 None twoibd Thierry plc2 [813, 1813, 2813] +815 None twoibe Thierry plc2 [814, 1814, 2814] +816 None twoibf Thierry plc2 [815, 1815, 2815] +817 None twoibg Thierry plc2 [816, 1816, 2816] +818 None twoibh Thierry plc2 [817, 1817, 2817] +819 None twoibi Thierry plc2 [818, 1818, 2818] +820 None twoibj Thierry plc2 [819, 1819, 2819] +821 None twoica Thierry plc2 [820, 1820, 2820] +822 None twoicb Thierry plc2 [821, 1821, 2821] +823 None twoicc Thierry plc2 [822, 1822, 2822] +824 None twoicd Thierry plc2 [823, 1823, 2823] +825 None twoice Thierry plc2 [824, 1824, 2824] +826 None twoicf Thierry plc2 [825, 1825, 2825] +827 None twoicg Thierry plc2 [826, 1826, 2826] +828 None twoich Thierry plc2 [827, 1827, 2827] +829 None twoici Thierry plc2 [828, 1828, 2828] +830 None twoicj Thierry plc2 [829, 1829, 2829] +831 None twoida Thierry plc2 [830, 1830, 2830] +832 None twoidb Thierry plc2 [831, 1831, 2831] +833 None twoidc Thierry plc2 [832, 1832, 2832] +834 None twoidd Thierry plc2 [833, 1833, 2833] +835 None twoide Thierry plc2 [834, 1834, 2834] +836 None twoidf Thierry plc2 [835, 1835, 2835] +837 None twoidg Thierry plc2 [836, 1836, 2836] +838 None twoidh Thierry plc2 [837, 1837, 2837] +839 None twoidi Thierry plc2 [838, 1838, 2838] +840 None twoidj Thierry plc2 [839, 1839, 2839] +841 None twoiea Thierry plc2 [840, 1840, 2840] +842 None twoieb Thierry plc2 [841, 1841, 2841] +843 None twoiec Thierry plc2 [842, 1842, 2842] +844 None twoied Thierry plc2 [843, 1843, 2843] +845 None twoiee Thierry plc2 [844, 1844, 2844] +846 None twoief Thierry plc2 [845, 1845, 2845] +847 None twoieg Thierry plc2 [846, 1846, 2846] +848 None twoieh Thierry plc2 [847, 1847, 2847] +849 None twoiei Thierry plc2 [848, 1848, 2848] +850 None twoiej Thierry plc2 [849, 1849, 2849] +851 None twoifa Thierry plc2 [850, 1850, 2850] +852 None twoifb Thierry plc2 [851, 1851, 2851] +853 None twoifc Thierry plc2 [852, 1852, 2852] +854 None twoifd Thierry plc2 [853, 1853, 2853] +855 None twoife Thierry plc2 [854, 1854, 2854] +856 None twoiff Thierry plc2 [855, 1855, 2855] +857 None twoifg Thierry plc2 [856, 1856, 2856] +858 None twoifh Thierry plc2 [857, 1857, 2857] +859 None twoifi Thierry plc2 [858, 1858, 2858] +860 None twoifj Thierry plc2 [859, 1859, 2859] +861 None twoiga Thierry plc2 [860, 1860, 2860] +862 None twoigb Thierry plc2 [861, 1861, 2861] +863 None twoigc Thierry plc2 [862, 1862, 2862] +864 None twoigd Thierry plc2 [863, 1863, 2863] +865 None twoige Thierry plc2 [864, 1864, 2864] +866 None twoigf Thierry plc2 [865, 1865, 2865] +867 None twoigg Thierry plc2 [866, 1866, 2866] +868 None twoigh Thierry plc2 [867, 1867, 2867] +869 None twoigi Thierry plc2 [868, 1868, 2868] +870 None twoigj Thierry plc2 [869, 1869, 2869] +871 None twoiha Thierry plc2 [870, 1870, 2870] +872 None twoihb Thierry plc2 [871, 1871, 2871] +873 None twoihc Thierry plc2 [872, 1872, 2872] +874 None twoihd Thierry plc2 [873, 1873, 2873] +875 None twoihe Thierry plc2 [874, 1874, 2874] +876 None twoihf Thierry plc2 [875, 1875, 2875] +877 None twoihg Thierry plc2 [876, 1876, 2876] +878 None twoihh Thierry plc2 [877, 1877, 2877] +879 None twoihi Thierry plc2 [878, 1878, 2878] +880 None twoihj Thierry plc2 [879, 1879, 2879] +881 None twoiia Thierry plc2 [880, 1880, 2880] +882 None twoiib Thierry plc2 [881, 1881, 2881] +883 None twoiic Thierry plc2 [882, 1882, 2882] +884 None twoiid Thierry plc2 [883, 1883, 2883] +885 None twoiie Thierry plc2 [884, 1884, 2884] +886 None twoiif Thierry plc2 [885, 1885, 2885] +887 None twoiig Thierry plc2 [886, 1886, 2886] +888 None twoiih Thierry plc2 [887, 1887, 2887] +889 None twoiii Thierry plc2 [888, 1888, 2888] +890 None twoiij Thierry plc2 [889, 1889, 2889] +891 None twoija Thierry plc2 [890, 1890, 2890] +892 None twoijb Thierry plc2 [891, 1891, 2891] +893 None twoijc Thierry plc2 [892, 1892, 2892] +894 None twoijd Thierry plc2 [893, 1893, 2893] +895 None twoije Thierry plc2 [894, 1894, 2894] +896 None twoijf Thierry plc2 [895, 1895, 2895] +897 None twoijg Thierry plc2 [896, 1896, 2896] +898 None twoijh Thierry plc2 [897, 1897, 2897] +899 None twoiji Thierry plc2 [898, 1898, 2898] +900 None twoijj Thierry plc2 [899, 1899, 2899] +901 None twojaa Thierry plc2 [900, 1900, 2900] +902 None twojab Thierry plc2 [901, 1901, 2901] +903 None twojac Thierry plc2 [902, 1902, 2902] +904 None twojad Thierry plc2 [903, 1903, 2903] +905 None twojae Thierry plc2 [904, 1904, 2904] +906 None twojaf Thierry plc2 [905, 1905, 2905] +907 None twojag Thierry plc2 [906, 1906, 2906] +908 None twojah Thierry plc2 [907, 1907, 2907] +909 None twojai Thierry plc2 [908, 1908, 2908] +910 None twojaj Thierry plc2 [909, 1909, 2909] +911 None twojba Thierry plc2 [910, 1910, 2910] +912 None twojbb Thierry plc2 [911, 1911, 2911] +913 None twojbc Thierry plc2 [912, 1912, 2912] +914 None twojbd Thierry plc2 [913, 1913, 2913] +915 None twojbe Thierry plc2 [914, 1914, 2914] +916 None twojbf Thierry plc2 [915, 1915, 2915] +917 None twojbg Thierry plc2 [916, 1916, 2916] +918 None twojbh Thierry plc2 [917, 1917, 2917] +919 None twojbi Thierry plc2 [918, 1918, 2918] +920 None twojbj Thierry plc2 [919, 1919, 2919] +921 None twojca Thierry plc2 [920, 1920, 2920] +922 None twojcb Thierry plc2 [921, 1921, 2921] +923 None twojcc Thierry plc2 [922, 1922, 2922] +924 None twojcd Thierry plc2 [923, 1923, 2923] +925 None twojce Thierry plc2 [924, 1924, 2924] +926 None twojcf Thierry plc2 [925, 1925, 2925] +927 None twojcg Thierry plc2 [926, 1926, 2926] +928 None twojch Thierry plc2 [927, 1927, 2927] +929 None twojci Thierry plc2 [928, 1928, 2928] +930 None twojcj Thierry plc2 [929, 1929, 2929] +931 None twojda Thierry plc2 [930, 1930, 2930] +932 None twojdb Thierry plc2 [931, 1931, 2931] +933 None twojdc Thierry plc2 [932, 1932, 2932] +934 None twojdd Thierry plc2 [933, 1933, 2933] +935 None twojde Thierry plc2 [934, 1934, 2934] +936 None twojdf Thierry plc2 [935, 1935, 2935] +937 None twojdg Thierry plc2 [936, 1936, 2936] +938 None twojdh Thierry plc2 [937, 1937, 2937] +939 None twojdi Thierry plc2 [938, 1938, 2938] +940 None twojdj Thierry plc2 [939, 1939, 2939] +941 None twojea Thierry plc2 [940, 1940, 2940] +942 None twojeb Thierry plc2 [941, 1941, 2941] +943 None twojec Thierry plc2 [942, 1942, 2942] +944 None twojed Thierry plc2 [943, 1943, 2943] +945 None twojee Thierry plc2 [944, 1944, 2944] +946 None twojef Thierry plc2 [945, 1945, 2945] +947 None twojeg Thierry plc2 [946, 1946, 2946] +948 None twojeh Thierry plc2 [947, 1947, 2947] +949 None twojei Thierry plc2 [948, 1948, 2948] +950 None twojej Thierry plc2 [949, 1949, 2949] +951 None twojfa Thierry plc2 [950, 1950, 2950] +952 None twojfb Thierry plc2 [951, 1951, 2951] +953 None twojfc Thierry plc2 [952, 1952, 2952] +954 None twojfd Thierry plc2 [953, 1953, 2953] +955 None twojfe Thierry plc2 [954, 1954, 2954] +956 None twojff Thierry plc2 [955, 1955, 2955] +957 None twojfg Thierry plc2 [956, 1956, 2956] +958 None twojfh Thierry plc2 [957, 1957, 2957] +959 None twojfi Thierry plc2 [958, 1958, 2958] +960 None twojfj Thierry plc2 [959, 1959, 2959] +961 None twojga Thierry plc2 [960, 1960, 2960] +962 None twojgb Thierry plc2 [961, 1961, 2961] +963 None twojgc Thierry plc2 [962, 1962, 2962] +964 None twojgd Thierry plc2 [963, 1963, 2963] +965 None twojge Thierry plc2 [964, 1964, 2964] +966 None twojgf Thierry plc2 [965, 1965, 2965] +967 None twojgg Thierry plc2 [966, 1966, 2966] +968 None twojgh Thierry plc2 [967, 1967, 2967] +969 None twojgi Thierry plc2 [968, 1968, 2968] +970 None twojgj Thierry plc2 [969, 1969, 2969] +971 None twojha Thierry plc2 [970, 1970, 2970] +972 None twojhb Thierry plc2 [971, 1971, 2971] +973 None twojhc Thierry plc2 [972, 1972, 2972] +974 None twojhd Thierry plc2 [973, 1973, 2973] +975 None twojhe Thierry plc2 [974, 1974, 2974] +976 None twojhf Thierry plc2 [975, 1975, 2975] +977 None twojhg Thierry plc2 [976, 1976, 2976] +978 None twojhh Thierry plc2 [977, 1977, 2977] +979 None twojhi Thierry plc2 [978, 1978, 2978] +980 None twojhj Thierry plc2 [979, 1979, 2979] +981 None twojia Thierry plc2 [980, 1980, 2980] +982 None twojib Thierry plc2 [981, 1981, 2981] +983 None twojic Thierry plc2 [982, 1982, 2982] +984 None twojid Thierry plc2 [983, 1983, 2983] +985 None twojie Thierry plc2 [984, 1984, 2984] +986 None twojif Thierry plc2 [985, 1985, 2985] +987 None twojig Thierry plc2 [986, 1986, 2986] +988 None twojih Thierry plc2 [987, 1987, 2987] +989 None twojii Thierry plc2 [988, 1988, 2988] +990 None twojij Thierry plc2 [989, 1989, 2989] +991 None twojja Thierry plc2 [990, 1990, 2990] +992 None twojjb Thierry plc2 [991, 1991, 2991] +993 None twojjc Thierry plc2 [992, 1992, 2992] +994 None twojjd Thierry plc2 [993, 1993, 2993] +995 None twojje Thierry plc2 [994, 1994, 2994] +996 None twojjf Thierry plc2 [995, 1995, 2995] +997 None twojjg Thierry plc2 [996, 1996, 2996] +998 None twojjh Thierry plc2 [997, 1997, 2997] +999 None twojji Thierry plc2 [998, 1998, 2998] +1000 None twojjj Thierry plc2 [999, 1999, 2999] +1001 None twobaaa Thierry plc2 [1000, 2000, 3000] +1002 1 thone Thierry plc1 Central [] +1003 1 oneb Thierry plc1 [3001, 4001, 5001] +1004 1 onec Thierry plc1 [3002, 4002, 5002] +1005 1 oned Thierry plc1 [3003, 4003, 5003] +1006 1 onee Thierry plc1 [3004, 4004, 5004] +1007 1 onef Thierry plc1 [3005, 4005, 5005] +1008 1 oneg Thierry plc1 [3006, 4006, 5006] +1009 1 oneh Thierry plc1 [3007, 4007, 5007] +1010 1 onei Thierry plc1 [3008, 4008, 5008] +1011 1 onej Thierry plc1 [3009, 4009, 5009] +1012 1 oneba Thierry plc1 [3010, 4010, 5010] +1013 1 onebb Thierry plc1 [3011, 4011, 5011] +1014 1 onebc Thierry plc1 [3012, 4012, 5012] +1015 1 onebd Thierry plc1 [3013, 4013, 5013] +1016 1 onebe Thierry plc1 [3014, 4014, 5014] +1017 1 onebf Thierry plc1 [3015, 4015, 5015] +1018 1 onebg Thierry plc1 [3016, 4016, 5016] +1019 1 onebh Thierry plc1 [3017, 4017, 5017] +1020 1 onebi Thierry plc1 [3018, 4018, 5018] +1021 1 onebj Thierry plc1 [3019, 4019, 5019] +1022 1 oneca Thierry plc1 [3020, 4020, 5020] +1023 1 onecb Thierry plc1 [3021, 4021, 5021] +1024 1 onecc Thierry plc1 [3022, 4022, 5022] +1025 1 onecd Thierry plc1 [3023, 4023, 5023] +1026 1 onece Thierry plc1 [3024, 4024, 5024] +1027 1 onecf Thierry plc1 [3025, 4025, 5025] +1028 1 onecg Thierry plc1 [3026, 4026, 5026] +1029 1 onech Thierry plc1 [3027, 4027, 5027] +1030 1 oneci Thierry plc1 [3028, 4028, 5028] +1031 1 onecj Thierry plc1 [3029, 4029, 5029] +1032 1 oneda Thierry plc1 [3030, 4030, 5030] +1033 1 onedb Thierry plc1 [3031, 4031, 5031] +1034 1 onedc Thierry plc1 [3032, 4032, 5032] +1035 1 onedd Thierry plc1 [3033, 4033, 5033] +1036 1 onede Thierry plc1 [3034, 4034, 5034] +1037 1 onedf Thierry plc1 [3035, 4035, 5035] +1038 1 onedg Thierry plc1 [3036, 4036, 5036] +1039 1 onedh Thierry plc1 [3037, 4037, 5037] +1040 1 onedi Thierry plc1 [3038, 4038, 5038] +1041 1 onedj Thierry plc1 [3039, 4039, 5039] +1042 1 oneea Thierry plc1 [3040, 4040, 5040] +1043 1 oneeb Thierry plc1 [3041, 4041, 5041] +1044 1 oneec Thierry plc1 [3042, 4042, 5042] +1045 1 oneed Thierry plc1 [3043, 4043, 5043] +1046 1 oneee Thierry plc1 [3044, 4044, 5044] +1047 1 oneef Thierry plc1 [3045, 4045, 5045] +1048 1 oneeg Thierry plc1 [3046, 4046, 5046] +1049 1 oneeh Thierry plc1 [3047, 4047, 5047] +1050 1 oneei Thierry plc1 [3048, 4048, 5048] +1051 1 oneej Thierry plc1 [3049, 4049, 5049] +1052 1 onefa Thierry plc1 [3050, 4050, 5050] +1053 1 onefb Thierry plc1 [3051, 4051, 5051] +1054 1 onefc Thierry plc1 [3052, 4052, 5052] +1055 1 onefd Thierry plc1 [3053, 4053, 5053] +1056 1 onefe Thierry plc1 [3054, 4054, 5054] +1057 1 oneff Thierry plc1 [3055, 4055, 5055] +1058 1 onefg Thierry plc1 [3056, 4056, 5056] +1059 1 onefh Thierry plc1 [3057, 4057, 5057] +1060 1 onefi Thierry plc1 [3058, 4058, 5058] +1061 1 onefj Thierry plc1 [3059, 4059, 5059] +1062 1 onega Thierry plc1 [3060, 4060, 5060] +1063 1 onegb Thierry plc1 [3061, 4061, 5061] +1064 1 onegc Thierry plc1 [3062, 4062, 5062] +1065 1 onegd Thierry plc1 [3063, 4063, 5063] +1066 1 onege Thierry plc1 [3064, 4064, 5064] +1067 1 onegf Thierry plc1 [3065, 4065, 5065] +1068 1 onegg Thierry plc1 [3066, 4066, 5066] +1069 1 onegh Thierry plc1 [3067, 4067, 5067] +1070 1 onegi Thierry plc1 [3068, 4068, 5068] +1071 1 onegj Thierry plc1 [3069, 4069, 5069] +1072 1 oneha Thierry plc1 [3070, 4070, 5070] +1073 1 onehb Thierry plc1 [3071, 4071, 5071] +1074 1 onehc Thierry plc1 [3072, 4072, 5072] +1075 1 onehd Thierry plc1 [3073, 4073, 5073] +1076 1 onehe Thierry plc1 [3074, 4074, 5074] +1077 1 onehf Thierry plc1 [3075, 4075, 5075] +1078 1 onehg Thierry plc1 [3076, 4076, 5076] +1079 1 onehh Thierry plc1 [3077, 4077, 5077] +1080 1 onehi Thierry plc1 [3078, 4078, 5078] +1081 1 onehj Thierry plc1 [3079, 4079, 5079] +1082 1 oneia Thierry plc1 [3080, 4080, 5080] +1083 1 oneib Thierry plc1 [3081, 4081, 5081] +1084 1 oneic Thierry plc1 [3082, 4082, 5082] +1085 1 oneid Thierry plc1 [3083, 4083, 5083] +1086 1 oneie Thierry plc1 [3084, 4084, 5084] +1087 1 oneif Thierry plc1 [3085, 4085, 5085] +1088 1 oneig Thierry plc1 [3086, 4086, 5086] +1089 1 oneih Thierry plc1 [3087, 4087, 5087] +1090 1 oneii Thierry plc1 [3088, 4088, 5088] +1091 1 oneij Thierry plc1 [3089, 4089, 5089] +1092 1 oneja Thierry plc1 [3090, 4090, 5090] +1093 1 onejb Thierry plc1 [3091, 4091, 5091] +1094 1 onejc Thierry plc1 [3092, 4092, 5092] +1095 1 onejd Thierry plc1 [3093, 4093, 5093] +1096 1 oneje Thierry plc1 [3094, 4094, 5094] +1097 1 onejf Thierry plc1 [3095, 4095, 5095] +1098 1 onejg Thierry plc1 [3096, 4096, 5096] +1099 1 onejh Thierry plc1 [3097, 4097, 5097] +1100 1 oneji Thierry plc1 [3098, 4098, 5098] +1101 1 onejj Thierry plc1 [3099, 4099, 5099] +1102 1 onebaa Thierry plc1 [3100, 4100, 5100] +1103 1 onebab Thierry plc1 [3101, 4101, 5101] +1104 1 onebac Thierry plc1 [3102, 4102, 5102] +1105 1 onebad Thierry plc1 [3103, 4103, 5103] +1106 1 onebae Thierry plc1 [3104, 4104, 5104] +1107 1 onebaf Thierry plc1 [3105, 4105, 5105] +1108 1 onebag Thierry plc1 [3106, 4106, 5106] +1109 1 onebah Thierry plc1 [3107, 4107, 5107] +1110 1 onebai Thierry plc1 [3108, 4108, 5108] +1111 1 onebaj Thierry plc1 [3109, 4109, 5109] +1112 1 onebba Thierry plc1 [3110, 4110, 5110] +1113 1 onebbb Thierry plc1 [3111, 4111, 5111] +1114 1 onebbc Thierry plc1 [3112, 4112, 5112] +1115 1 onebbd Thierry plc1 [3113, 4113, 5113] +1116 1 onebbe Thierry plc1 [3114, 4114, 5114] +1117 1 onebbf Thierry plc1 [3115, 4115, 5115] +1118 1 onebbg Thierry plc1 [3116, 4116, 5116] +1119 1 onebbh Thierry plc1 [3117, 4117, 5117] +1120 1 onebbi Thierry plc1 [3118, 4118, 5118] +1121 1 onebbj Thierry plc1 [3119, 4119, 5119] +1122 1 onebca Thierry plc1 [3120, 4120, 5120] +1123 1 onebcb Thierry plc1 [3121, 4121, 5121] +1124 1 onebcc Thierry plc1 [3122, 4122, 5122] +1125 1 onebcd Thierry plc1 [3123, 4123, 5123] +1126 1 onebce Thierry plc1 [3124, 4124, 5124] +1127 1 onebcf Thierry plc1 [3125, 4125, 5125] +1128 1 onebcg Thierry plc1 [3126, 4126, 5126] +1129 1 onebch Thierry plc1 [3127, 4127, 5127] +1130 1 onebci Thierry plc1 [3128, 4128, 5128] +1131 1 onebcj Thierry plc1 [3129, 4129, 5129] +1132 1 onebda Thierry plc1 [3130, 4130, 5130] +1133 1 onebdb Thierry plc1 [3131, 4131, 5131] +1134 1 onebdc Thierry plc1 [3132, 4132, 5132] +1135 1 onebdd Thierry plc1 [3133, 4133, 5133] +1136 1 onebde Thierry plc1 [3134, 4134, 5134] +1137 1 onebdf Thierry plc1 [3135, 4135, 5135] +1138 1 onebdg Thierry plc1 [3136, 4136, 5136] +1139 1 onebdh Thierry plc1 [3137, 4137, 5137] +1140 1 onebdi Thierry plc1 [3138, 4138, 5138] +1141 1 onebdj Thierry plc1 [3139, 4139, 5139] +1142 1 onebea Thierry plc1 [3140, 4140, 5140] +1143 1 onebeb Thierry plc1 [3141, 4141, 5141] +1144 1 onebec Thierry plc1 [3142, 4142, 5142] +1145 1 onebed Thierry plc1 [3143, 4143, 5143] +1146 1 onebee Thierry plc1 [3144, 4144, 5144] +1147 1 onebef Thierry plc1 [3145, 4145, 5145] +1148 1 onebeg Thierry plc1 [3146, 4146, 5146] +1149 1 onebeh Thierry plc1 [3147, 4147, 5147] +1150 1 onebei Thierry plc1 [3148, 4148, 5148] +1151 1 onebej Thierry plc1 [3149, 4149, 5149] +1152 1 onebfa Thierry plc1 [3150, 4150, 5150] +1153 1 onebfb Thierry plc1 [3151, 4151, 5151] +1154 1 onebfc Thierry plc1 [3152, 4152, 5152] +1155 1 onebfd Thierry plc1 [3153, 4153, 5153] +1156 1 onebfe Thierry plc1 [3154, 4154, 5154] +1157 1 onebff Thierry plc1 [3155, 4155, 5155] +1158 1 onebfg Thierry plc1 [3156, 4156, 5156] +1159 1 onebfh Thierry plc1 [3157, 4157, 5157] +1160 1 onebfi Thierry plc1 [3158, 4158, 5158] +1161 1 onebfj Thierry plc1 [3159, 4159, 5159] +1162 1 onebga Thierry plc1 [3160, 4160, 5160] +1163 1 onebgb Thierry plc1 [3161, 4161, 5161] +1164 1 onebgc Thierry plc1 [3162, 4162, 5162] +1165 1 onebgd Thierry plc1 [3163, 4163, 5163] +1166 1 onebge Thierry plc1 [3164, 4164, 5164] +1167 1 onebgf Thierry plc1 [3165, 4165, 5165] +1168 1 onebgg Thierry plc1 [3166, 4166, 5166] +1169 1 onebgh Thierry plc1 [3167, 4167, 5167] +1170 1 onebgi Thierry plc1 [3168, 4168, 5168] +1171 1 onebgj Thierry plc1 [3169, 4169, 5169] +1172 1 onebha Thierry plc1 [3170, 4170, 5170] +1173 1 onebhb Thierry plc1 [3171, 4171, 5171] +1174 1 onebhc Thierry plc1 [3172, 4172, 5172] +1175 1 onebhd Thierry plc1 [3173, 4173, 5173] +1176 1 onebhe Thierry plc1 [3174, 4174, 5174] +1177 1 onebhf Thierry plc1 [3175, 4175, 5175] +1178 1 onebhg Thierry plc1 [3176, 4176, 5176] +1179 1 onebhh Thierry plc1 [3177, 4177, 5177] +1180 1 onebhi Thierry plc1 [3178, 4178, 5178] +1181 1 onebhj Thierry plc1 [3179, 4179, 5179] +1182 1 onebia Thierry plc1 [3180, 4180, 5180] +1183 1 onebib Thierry plc1 [3181, 4181, 5181] +1184 1 onebic Thierry plc1 [3182, 4182, 5182] +1185 1 onebid Thierry plc1 [3183, 4183, 5183] +1186 1 onebie Thierry plc1 [3184, 4184, 5184] +1187 1 onebif Thierry plc1 [3185, 4185, 5185] +1188 1 onebig Thierry plc1 [3186, 4186, 5186] +1189 1 onebih Thierry plc1 [3187, 4187, 5187] +1190 1 onebii Thierry plc1 [3188, 4188, 5188] +1191 1 onebij Thierry plc1 [3189, 4189, 5189] +1192 1 onebja Thierry plc1 [3190, 4190, 5190] +1193 1 onebjb Thierry plc1 [3191, 4191, 5191] +1194 1 onebjc Thierry plc1 [3192, 4192, 5192] +1195 1 onebjd Thierry plc1 [3193, 4193, 5193] +1196 1 onebje Thierry plc1 [3194, 4194, 5194] +1197 1 onebjf Thierry plc1 [3195, 4195, 5195] +1198 1 onebjg Thierry plc1 [3196, 4196, 5196] +1199 1 onebjh Thierry plc1 [3197, 4197, 5197] +1200 1 onebji Thierry plc1 [3198, 4198, 5198] +1201 1 onebjj Thierry plc1 [3199, 4199, 5199] +1202 1 onecaa Thierry plc1 [3200, 4200, 5200] +1203 1 onecab Thierry plc1 [3201, 4201, 5201] +1204 1 onecac Thierry plc1 [3202, 4202, 5202] +1205 1 onecad Thierry plc1 [3203, 4203, 5203] +1206 1 onecae Thierry plc1 [3204, 4204, 5204] +1207 1 onecaf Thierry plc1 [3205, 4205, 5205] +1208 1 onecag Thierry plc1 [3206, 4206, 5206] +1209 1 onecah Thierry plc1 [3207, 4207, 5207] +1210 1 onecai Thierry plc1 [3208, 4208, 5208] +1211 1 onecaj Thierry plc1 [3209, 4209, 5209] +1212 1 onecba Thierry plc1 [3210, 4210, 5210] +1213 1 onecbb Thierry plc1 [3211, 4211, 5211] +1214 1 onecbc Thierry plc1 [3212, 4212, 5212] +1215 1 onecbd Thierry plc1 [3213, 4213, 5213] +1216 1 onecbe Thierry plc1 [3214, 4214, 5214] +1217 1 onecbf Thierry plc1 [3215, 4215, 5215] +1218 1 onecbg Thierry plc1 [3216, 4216, 5216] +1219 1 onecbh Thierry plc1 [3217, 4217, 5217] +1220 1 onecbi Thierry plc1 [3218, 4218, 5218] +1221 1 onecbj Thierry plc1 [3219, 4219, 5219] +1222 1 onecca Thierry plc1 [3220, 4220, 5220] +1223 1 oneccb Thierry plc1 [3221, 4221, 5221] +1224 1 oneccc Thierry plc1 [3222, 4222, 5222] +1225 1 oneccd Thierry plc1 [3223, 4223, 5223] +1226 1 onecce Thierry plc1 [3224, 4224, 5224] +1227 1 oneccf Thierry plc1 [3225, 4225, 5225] +1228 1 oneccg Thierry plc1 [3226, 4226, 5226] +1229 1 onecch Thierry plc1 [3227, 4227, 5227] +1230 1 onecci Thierry plc1 [3228, 4228, 5228] +1231 1 oneccj Thierry plc1 [3229, 4229, 5229] +1232 1 onecda Thierry plc1 [3230, 4230, 5230] +1233 1 onecdb Thierry plc1 [3231, 4231, 5231] +1234 1 onecdc Thierry plc1 [3232, 4232, 5232] +1235 1 onecdd Thierry plc1 [3233, 4233, 5233] +1236 1 onecde Thierry plc1 [3234, 4234, 5234] +1237 1 onecdf Thierry plc1 [3235, 4235, 5235] +1238 1 onecdg Thierry plc1 [3236, 4236, 5236] +1239 1 onecdh Thierry plc1 [3237, 4237, 5237] +1240 1 onecdi Thierry plc1 [3238, 4238, 5238] +1241 1 onecdj Thierry plc1 [3239, 4239, 5239] +1242 1 onecea Thierry plc1 [3240, 4240, 5240] +1243 1 oneceb Thierry plc1 [3241, 4241, 5241] +1244 1 onecec Thierry plc1 [3242, 4242, 5242] +1245 1 oneced Thierry plc1 [3243, 4243, 5243] +1246 1 onecee Thierry plc1 [3244, 4244, 5244] +1247 1 onecef Thierry plc1 [3245, 4245, 5245] +1248 1 oneceg Thierry plc1 [3246, 4246, 5246] +1249 1 oneceh Thierry plc1 [3247, 4247, 5247] +1250 1 onecei Thierry plc1 [3248, 4248, 5248] +1251 1 onecej Thierry plc1 [3249, 4249, 5249] +1252 1 onecfa Thierry plc1 [3250, 4250, 5250] +1253 1 onecfb Thierry plc1 [3251, 4251, 5251] +1254 1 onecfc Thierry plc1 [3252, 4252, 5252] +1255 1 onecfd Thierry plc1 [3253, 4253, 5253] +1256 1 onecfe Thierry plc1 [3254, 4254, 5254] +1257 1 onecff Thierry plc1 [3255, 4255, 5255] +1258 1 onecfg Thierry plc1 [3256, 4256, 5256] +1259 1 onecfh Thierry plc1 [3257, 4257, 5257] +1260 1 onecfi Thierry plc1 [3258, 4258, 5258] +1261 1 onecfj Thierry plc1 [3259, 4259, 5259] +1262 1 onecga Thierry plc1 [3260, 4260, 5260] +1263 1 onecgb Thierry plc1 [3261, 4261, 5261] +1264 1 onecgc Thierry plc1 [3262, 4262, 5262] +1265 1 onecgd Thierry plc1 [3263, 4263, 5263] +1266 1 onecge Thierry plc1 [3264, 4264, 5264] +1267 1 onecgf Thierry plc1 [3265, 4265, 5265] +1268 1 onecgg Thierry plc1 [3266, 4266, 5266] +1269 1 onecgh Thierry plc1 [3267, 4267, 5267] +1270 1 onecgi Thierry plc1 [3268, 4268, 5268] +1271 1 onecgj Thierry plc1 [3269, 4269, 5269] +1272 1 onecha Thierry plc1 [3270, 4270, 5270] +1273 1 onechb Thierry plc1 [3271, 4271, 5271] +1274 1 onechc Thierry plc1 [3272, 4272, 5272] +1275 1 onechd Thierry plc1 [3273, 4273, 5273] +1276 1 oneche Thierry plc1 [3274, 4274, 5274] +1277 1 onechf Thierry plc1 [3275, 4275, 5275] +1278 1 onechg Thierry plc1 [3276, 4276, 5276] +1279 1 onechh Thierry plc1 [3277, 4277, 5277] +1280 1 onechi Thierry plc1 [3278, 4278, 5278] +1281 1 onechj Thierry plc1 [3279, 4279, 5279] +1282 1 onecia Thierry plc1 [3280, 4280, 5280] +1283 1 onecib Thierry plc1 [3281, 4281, 5281] +1284 1 onecic Thierry plc1 [3282, 4282, 5282] +1285 1 onecid Thierry plc1 [3283, 4283, 5283] +1286 1 onecie Thierry plc1 [3284, 4284, 5284] +1287 1 onecif Thierry plc1 [3285, 4285, 5285] +1288 1 onecig Thierry plc1 [3286, 4286, 5286] +1289 1 onecih Thierry plc1 [3287, 4287, 5287] +1290 1 onecii Thierry plc1 [3288, 4288, 5288] +1291 1 onecij Thierry plc1 [3289, 4289, 5289] +1292 1 onecja Thierry plc1 [3290, 4290, 5290] +1293 1 onecjb Thierry plc1 [3291, 4291, 5291] +1294 1 onecjc Thierry plc1 [3292, 4292, 5292] +1295 1 onecjd Thierry plc1 [3293, 4293, 5293] +1296 1 onecje Thierry plc1 [3294, 4294, 5294] +1297 1 onecjf Thierry plc1 [3295, 4295, 5295] +1298 1 onecjg Thierry plc1 [3296, 4296, 5296] +1299 1 onecjh Thierry plc1 [3297, 4297, 5297] +1300 1 onecji Thierry plc1 [3298, 4298, 5298] +1301 1 onecjj Thierry plc1 [3299, 4299, 5299] +1302 1 onedaa Thierry plc1 [3300, 4300, 5300] +1303 1 onedab Thierry plc1 [3301, 4301, 5301] +1304 1 onedac Thierry plc1 [3302, 4302, 5302] +1305 1 onedad Thierry plc1 [3303, 4303, 5303] +1306 1 onedae Thierry plc1 [3304, 4304, 5304] +1307 1 onedaf Thierry plc1 [3305, 4305, 5305] +1308 1 onedag Thierry plc1 [3306, 4306, 5306] +1309 1 onedah Thierry plc1 [3307, 4307, 5307] +1310 1 onedai Thierry plc1 [3308, 4308, 5308] +1311 1 onedaj Thierry plc1 [3309, 4309, 5309] +1312 1 onedba Thierry plc1 [3310, 4310, 5310] +1313 1 onedbb Thierry plc1 [3311, 4311, 5311] +1314 1 onedbc Thierry plc1 [3312, 4312, 5312] +1315 1 onedbd Thierry plc1 [3313, 4313, 5313] +1316 1 onedbe Thierry plc1 [3314, 4314, 5314] +1317 1 onedbf Thierry plc1 [3315, 4315, 5315] +1318 1 onedbg Thierry plc1 [3316, 4316, 5316] +1319 1 onedbh Thierry plc1 [3317, 4317, 5317] +1320 1 onedbi Thierry plc1 [3318, 4318, 5318] +1321 1 onedbj Thierry plc1 [3319, 4319, 5319] +1322 1 onedca Thierry plc1 [3320, 4320, 5320] +1323 1 onedcb Thierry plc1 [3321, 4321, 5321] +1324 1 onedcc Thierry plc1 [3322, 4322, 5322] +1325 1 onedcd Thierry plc1 [3323, 4323, 5323] +1326 1 onedce Thierry plc1 [3324, 4324, 5324] +1327 1 onedcf Thierry plc1 [3325, 4325, 5325] +1328 1 onedcg Thierry plc1 [3326, 4326, 5326] +1329 1 onedch Thierry plc1 [3327, 4327, 5327] +1330 1 onedci Thierry plc1 [3328, 4328, 5328] +1331 1 onedcj Thierry plc1 [3329, 4329, 5329] +1332 1 onedda Thierry plc1 [3330, 4330, 5330] +1333 1 oneddb Thierry plc1 [3331, 4331, 5331] +1334 1 oneddc Thierry plc1 [3332, 4332, 5332] +1335 1 oneddd Thierry plc1 [3333, 4333, 5333] +1336 1 onedde Thierry plc1 [3334, 4334, 5334] +1337 1 oneddf Thierry plc1 [3335, 4335, 5335] +1338 1 oneddg Thierry plc1 [3336, 4336, 5336] +1339 1 oneddh Thierry plc1 [3337, 4337, 5337] +1340 1 oneddi Thierry plc1 [3338, 4338, 5338] +1341 1 oneddj Thierry plc1 [3339, 4339, 5339] +1342 1 onedea Thierry plc1 [3340, 4340, 5340] +1343 1 onedeb Thierry plc1 [3341, 4341, 5341] +1344 1 onedec Thierry plc1 [3342, 4342, 5342] +1345 1 oneded Thierry plc1 [3343, 4343, 5343] +1346 1 onedee Thierry plc1 [3344, 4344, 5344] +1347 1 onedef Thierry plc1 [3345, 4345, 5345] +1348 1 onedeg Thierry plc1 [3346, 4346, 5346] +1349 1 onedeh Thierry plc1 [3347, 4347, 5347] +1350 1 onedei Thierry plc1 [3348, 4348, 5348] +1351 1 onedej Thierry plc1 [3349, 4349, 5349] +1352 1 onedfa Thierry plc1 [3350, 4350, 5350] +1353 1 onedfb Thierry plc1 [3351, 4351, 5351] +1354 1 onedfc Thierry plc1 [3352, 4352, 5352] +1355 1 onedfd Thierry plc1 [3353, 4353, 5353] +1356 1 onedfe Thierry plc1 [3354, 4354, 5354] +1357 1 onedff Thierry plc1 [3355, 4355, 5355] +1358 1 onedfg Thierry plc1 [3356, 4356, 5356] +1359 1 onedfh Thierry plc1 [3357, 4357, 5357] +1360 1 onedfi Thierry plc1 [3358, 4358, 5358] +1361 1 onedfj Thierry plc1 [3359, 4359, 5359] +1362 1 onedga Thierry plc1 [3360, 4360, 5360] +1363 1 onedgb Thierry plc1 [3361, 4361, 5361] +1364 1 onedgc Thierry plc1 [3362, 4362, 5362] +1365 1 onedgd Thierry plc1 [3363, 4363, 5363] +1366 1 onedge Thierry plc1 [3364, 4364, 5364] +1367 1 onedgf Thierry plc1 [3365, 4365, 5365] +1368 1 onedgg Thierry plc1 [3366, 4366, 5366] +1369 1 onedgh Thierry plc1 [3367, 4367, 5367] +1370 1 onedgi Thierry plc1 [3368, 4368, 5368] +1371 1 onedgj Thierry plc1 [3369, 4369, 5369] +1372 1 onedha Thierry plc1 [3370, 4370, 5370] +1373 1 onedhb Thierry plc1 [3371, 4371, 5371] +1374 1 onedhc Thierry plc1 [3372, 4372, 5372] +1375 1 onedhd Thierry plc1 [3373, 4373, 5373] +1376 1 onedhe Thierry plc1 [3374, 4374, 5374] +1377 1 onedhf Thierry plc1 [3375, 4375, 5375] +1378 1 onedhg Thierry plc1 [3376, 4376, 5376] +1379 1 onedhh Thierry plc1 [3377, 4377, 5377] +1380 1 onedhi Thierry plc1 [3378, 4378, 5378] +1381 1 onedhj Thierry plc1 [3379, 4379, 5379] +1382 1 onedia Thierry plc1 [3380, 4380, 5380] +1383 1 onedib Thierry plc1 [3381, 4381, 5381] +1384 1 onedic Thierry plc1 [3382, 4382, 5382] +1385 1 onedid Thierry plc1 [3383, 4383, 5383] +1386 1 onedie Thierry plc1 [3384, 4384, 5384] +1387 1 onedif Thierry plc1 [3385, 4385, 5385] +1388 1 onedig Thierry plc1 [3386, 4386, 5386] +1389 1 onedih Thierry plc1 [3387, 4387, 5387] +1390 1 onedii Thierry plc1 [3388, 4388, 5388] +1391 1 onedij Thierry plc1 [3389, 4389, 5389] +1392 1 onedja Thierry plc1 [3390, 4390, 5390] +1393 1 onedjb Thierry plc1 [3391, 4391, 5391] +1394 1 onedjc Thierry plc1 [3392, 4392, 5392] +1395 1 onedjd Thierry plc1 [3393, 4393, 5393] +1396 1 onedje Thierry plc1 [3394, 4394, 5394] +1397 1 onedjf Thierry plc1 [3395, 4395, 5395] +1398 1 onedjg Thierry plc1 [3396, 4396, 5396] +1399 1 onedjh Thierry plc1 [3397, 4397, 5397] +1400 1 onedji Thierry plc1 [3398, 4398, 5398] +1401 1 onedjj Thierry plc1 [3399, 4399, 5399] +1402 1 oneeaa Thierry plc1 [3400, 4400, 5400] +1403 1 oneeab Thierry plc1 [3401, 4401, 5401] +1404 1 oneeac Thierry plc1 [3402, 4402, 5402] +1405 1 oneead Thierry plc1 [3403, 4403, 5403] +1406 1 oneeae Thierry plc1 [3404, 4404, 5404] +1407 1 oneeaf Thierry plc1 [3405, 4405, 5405] +1408 1 oneeag Thierry plc1 [3406, 4406, 5406] +1409 1 oneeah Thierry plc1 [3407, 4407, 5407] +1410 1 oneeai Thierry plc1 [3408, 4408, 5408] +1411 1 oneeaj Thierry plc1 [3409, 4409, 5409] +1412 1 oneeba Thierry plc1 [3410, 4410, 5410] +1413 1 oneebb Thierry plc1 [3411, 4411, 5411] +1414 1 oneebc Thierry plc1 [3412, 4412, 5412] +1415 1 oneebd Thierry plc1 [3413, 4413, 5413] +1416 1 oneebe Thierry plc1 [3414, 4414, 5414] +1417 1 oneebf Thierry plc1 [3415, 4415, 5415] +1418 1 oneebg Thierry plc1 [3416, 4416, 5416] +1419 1 oneebh Thierry plc1 [3417, 4417, 5417] +1420 1 oneebi Thierry plc1 [3418, 4418, 5418] +1421 1 oneebj Thierry plc1 [3419, 4419, 5419] +1422 1 oneeca Thierry plc1 [3420, 4420, 5420] +1423 1 oneecb Thierry plc1 [3421, 4421, 5421] +1424 1 oneecc Thierry plc1 [3422, 4422, 5422] +1425 1 oneecd Thierry plc1 [3423, 4423, 5423] +1426 1 oneece Thierry plc1 [3424, 4424, 5424] +1427 1 oneecf Thierry plc1 [3425, 4425, 5425] +1428 1 oneecg Thierry plc1 [3426, 4426, 5426] +1429 1 oneech Thierry plc1 [3427, 4427, 5427] +1430 1 oneeci Thierry plc1 [3428, 4428, 5428] +1431 1 oneecj Thierry plc1 [3429, 4429, 5429] +1432 1 oneeda Thierry plc1 [3430, 4430, 5430] +1433 1 oneedb Thierry plc1 [3431, 4431, 5431] +1434 1 oneedc Thierry plc1 [3432, 4432, 5432] +1435 1 oneedd Thierry plc1 [3433, 4433, 5433] +1436 1 oneede Thierry plc1 [3434, 4434, 5434] +1437 1 oneedf Thierry plc1 [3435, 4435, 5435] +1438 1 oneedg Thierry plc1 [3436, 4436, 5436] +1439 1 oneedh Thierry plc1 [3437, 4437, 5437] +1440 1 oneedi Thierry plc1 [3438, 4438, 5438] +1441 1 oneedj Thierry plc1 [3439, 4439, 5439] +1442 1 oneeea Thierry plc1 [3440, 4440, 5440] +1443 1 oneeeb Thierry plc1 [3441, 4441, 5441] +1444 1 oneeec Thierry plc1 [3442, 4442, 5442] +1445 1 oneeed Thierry plc1 [3443, 4443, 5443] +1446 1 oneeee Thierry plc1 [3444, 4444, 5444] +1447 1 oneeef Thierry plc1 [3445, 4445, 5445] +1448 1 oneeeg Thierry plc1 [3446, 4446, 5446] +1449 1 oneeeh Thierry plc1 [3447, 4447, 5447] +1450 1 oneeei Thierry plc1 [3448, 4448, 5448] +1451 1 oneeej Thierry plc1 [3449, 4449, 5449] +1452 1 oneefa Thierry plc1 [3450, 4450, 5450] +1453 1 oneefb Thierry plc1 [3451, 4451, 5451] +1454 1 oneefc Thierry plc1 [3452, 4452, 5452] +1455 1 oneefd Thierry plc1 [3453, 4453, 5453] +1456 1 oneefe Thierry plc1 [3454, 4454, 5454] +1457 1 oneeff Thierry plc1 [3455, 4455, 5455] +1458 1 oneefg Thierry plc1 [3456, 4456, 5456] +1459 1 oneefh Thierry plc1 [3457, 4457, 5457] +1460 1 oneefi Thierry plc1 [3458, 4458, 5458] +1461 1 oneefj Thierry plc1 [3459, 4459, 5459] +1462 1 oneega Thierry plc1 [3460, 4460, 5460] +1463 1 oneegb Thierry plc1 [3461, 4461, 5461] +1464 1 oneegc Thierry plc1 [3462, 4462, 5462] +1465 1 oneegd Thierry plc1 [3463, 4463, 5463] +1466 1 oneege Thierry plc1 [3464, 4464, 5464] +1467 1 oneegf Thierry plc1 [3465, 4465, 5465] +1468 1 oneegg Thierry plc1 [3466, 4466, 5466] +1469 1 oneegh Thierry plc1 [3467, 4467, 5467] +1470 1 oneegi Thierry plc1 [3468, 4468, 5468] +1471 1 oneegj Thierry plc1 [3469, 4469, 5469] +1472 1 oneeha Thierry plc1 [3470, 4470, 5470] +1473 1 oneehb Thierry plc1 [3471, 4471, 5471] +1474 1 oneehc Thierry plc1 [3472, 4472, 5472] +1475 1 oneehd Thierry plc1 [3473, 4473, 5473] +1476 1 oneehe Thierry plc1 [3474, 4474, 5474] +1477 1 oneehf Thierry plc1 [3475, 4475, 5475] +1478 1 oneehg Thierry plc1 [3476, 4476, 5476] +1479 1 oneehh Thierry plc1 [3477, 4477, 5477] +1480 1 oneehi Thierry plc1 [3478, 4478, 5478] +1481 1 oneehj Thierry plc1 [3479, 4479, 5479] +1482 1 oneeia Thierry plc1 [3480, 4480, 5480] +1483 1 oneeib Thierry plc1 [3481, 4481, 5481] +1484 1 oneeic Thierry plc1 [3482, 4482, 5482] +1485 1 oneeid Thierry plc1 [3483, 4483, 5483] +1486 1 oneeie Thierry plc1 [3484, 4484, 5484] +1487 1 oneeif Thierry plc1 [3485, 4485, 5485] +1488 1 oneeig Thierry plc1 [3486, 4486, 5486] +1489 1 oneeih Thierry plc1 [3487, 4487, 5487] +1490 1 oneeii Thierry plc1 [3488, 4488, 5488] +1491 1 oneeij Thierry plc1 [3489, 4489, 5489] +1492 1 oneeja Thierry plc1 [3490, 4490, 5490] +1493 1 oneejb Thierry plc1 [3491, 4491, 5491] +1494 1 oneejc Thierry plc1 [3492, 4492, 5492] +1495 1 oneejd Thierry plc1 [3493, 4493, 5493] +1496 1 oneeje Thierry plc1 [3494, 4494, 5494] +1497 1 oneejf Thierry plc1 [3495, 4495, 5495] +1498 1 oneejg Thierry plc1 [3496, 4496, 5496] +1499 1 oneejh Thierry plc1 [3497, 4497, 5497] +1500 1 oneeji Thierry plc1 [3498, 4498, 5498] +1501 1 oneejj Thierry plc1 [3499, 4499, 5499] +1502 1 onefaa Thierry plc1 [3500, 4500, 5500] +1503 1 onefab Thierry plc1 [3501, 4501, 5501] +1504 1 onefac Thierry plc1 [3502, 4502, 5502] +1505 1 onefad Thierry plc1 [3503, 4503, 5503] +1506 1 onefae Thierry plc1 [3504, 4504, 5504] +1507 1 onefaf Thierry plc1 [3505, 4505, 5505] +1508 1 onefag Thierry plc1 [3506, 4506, 5506] +1509 1 onefah Thierry plc1 [3507, 4507, 5507] +1510 1 onefai Thierry plc1 [3508, 4508, 5508] +1511 1 onefaj Thierry plc1 [3509, 4509, 5509] +1512 1 onefba Thierry plc1 [3510, 4510, 5510] +1513 1 onefbb Thierry plc1 [3511, 4511, 5511] +1514 1 onefbc Thierry plc1 [3512, 4512, 5512] +1515 1 onefbd Thierry plc1 [3513, 4513, 5513] +1516 1 onefbe Thierry plc1 [3514, 4514, 5514] +1517 1 onefbf Thierry plc1 [3515, 4515, 5515] +1518 1 onefbg Thierry plc1 [3516, 4516, 5516] +1519 1 onefbh Thierry plc1 [3517, 4517, 5517] +1520 1 onefbi Thierry plc1 [3518, 4518, 5518] +1521 1 onefbj Thierry plc1 [3519, 4519, 5519] +1522 1 onefca Thierry plc1 [3520, 4520, 5520] +1523 1 onefcb Thierry plc1 [3521, 4521, 5521] +1524 1 onefcc Thierry plc1 [3522, 4522, 5522] +1525 1 onefcd Thierry plc1 [3523, 4523, 5523] +1526 1 onefce Thierry plc1 [3524, 4524, 5524] +1527 1 onefcf Thierry plc1 [3525, 4525, 5525] +1528 1 onefcg Thierry plc1 [3526, 4526, 5526] +1529 1 onefch Thierry plc1 [3527, 4527, 5527] +1530 1 onefci Thierry plc1 [3528, 4528, 5528] +1531 1 onefcj Thierry plc1 [3529, 4529, 5529] +1532 1 onefda Thierry plc1 [3530, 4530, 5530] +1533 1 onefdb Thierry plc1 [3531, 4531, 5531] +1534 1 onefdc Thierry plc1 [3532, 4532, 5532] +1535 1 onefdd Thierry plc1 [3533, 4533, 5533] +1536 1 onefde Thierry plc1 [3534, 4534, 5534] +1537 1 onefdf Thierry plc1 [3535, 4535, 5535] +1538 1 onefdg Thierry plc1 [3536, 4536, 5536] +1539 1 onefdh Thierry plc1 [3537, 4537, 5537] +1540 1 onefdi Thierry plc1 [3538, 4538, 5538] +1541 1 onefdj Thierry plc1 [3539, 4539, 5539] +1542 1 onefea Thierry plc1 [3540, 4540, 5540] +1543 1 onefeb Thierry plc1 [3541, 4541, 5541] +1544 1 onefec Thierry plc1 [3542, 4542, 5542] +1545 1 onefed Thierry plc1 [3543, 4543, 5543] +1546 1 onefee Thierry plc1 [3544, 4544, 5544] +1547 1 onefef Thierry plc1 [3545, 4545, 5545] +1548 1 onefeg Thierry plc1 [3546, 4546, 5546] +1549 1 onefeh Thierry plc1 [3547, 4547, 5547] +1550 1 onefei Thierry plc1 [3548, 4548, 5548] +1551 1 onefej Thierry plc1 [3549, 4549, 5549] +1552 1 oneffa Thierry plc1 [3550, 4550, 5550] +1553 1 oneffb Thierry plc1 [3551, 4551, 5551] +1554 1 oneffc Thierry plc1 [3552, 4552, 5552] +1555 1 oneffd Thierry plc1 [3553, 4553, 5553] +1556 1 oneffe Thierry plc1 [3554, 4554, 5554] +1557 1 onefff Thierry plc1 [3555, 4555, 5555] +1558 1 oneffg Thierry plc1 [3556, 4556, 5556] +1559 1 oneffh Thierry plc1 [3557, 4557, 5557] +1560 1 oneffi Thierry plc1 [3558, 4558, 5558] +1561 1 oneffj Thierry plc1 [3559, 4559, 5559] +1562 1 onefga Thierry plc1 [3560, 4560, 5560] +1563 1 onefgb Thierry plc1 [3561, 4561, 5561] +1564 1 onefgc Thierry plc1 [3562, 4562, 5562] +1565 1 onefgd Thierry plc1 [3563, 4563, 5563] +1566 1 onefge Thierry plc1 [3564, 4564, 5564] +1567 1 onefgf Thierry plc1 [3565, 4565, 5565] +1568 1 onefgg Thierry plc1 [3566, 4566, 5566] +1569 1 onefgh Thierry plc1 [3567, 4567, 5567] +1570 1 onefgi Thierry plc1 [3568, 4568, 5568] +1571 1 onefgj Thierry plc1 [3569, 4569, 5569] +1572 1 onefha Thierry plc1 [3570, 4570, 5570] +1573 1 onefhb Thierry plc1 [3571, 4571, 5571] +1574 1 onefhc Thierry plc1 [3572, 4572, 5572] +1575 1 onefhd Thierry plc1 [3573, 4573, 5573] +1576 1 onefhe Thierry plc1 [3574, 4574, 5574] +1577 1 onefhf Thierry plc1 [3575, 4575, 5575] +1578 1 onefhg Thierry plc1 [3576, 4576, 5576] +1579 1 onefhh Thierry plc1 [3577, 4577, 5577] +1580 1 onefhi Thierry plc1 [3578, 4578, 5578] +1581 1 onefhj Thierry plc1 [3579, 4579, 5579] +1582 1 onefia Thierry plc1 [3580, 4580, 5580] +1583 1 onefib Thierry plc1 [3581, 4581, 5581] +1584 1 onefic Thierry plc1 [3582, 4582, 5582] +1585 1 onefid Thierry plc1 [3583, 4583, 5583] +1586 1 onefie Thierry plc1 [3584, 4584, 5584] +1587 1 onefif Thierry plc1 [3585, 4585, 5585] +1588 1 onefig Thierry plc1 [3586, 4586, 5586] +1589 1 onefih Thierry plc1 [3587, 4587, 5587] +1590 1 onefii Thierry plc1 [3588, 4588, 5588] +1591 1 onefij Thierry plc1 [3589, 4589, 5589] +1592 1 onefja Thierry plc1 [3590, 4590, 5590] +1593 1 onefjb Thierry plc1 [3591, 4591, 5591] +1594 1 onefjc Thierry plc1 [3592, 4592, 5592] +1595 1 onefjd Thierry plc1 [3593, 4593, 5593] +1596 1 onefje Thierry plc1 [3594, 4594, 5594] +1597 1 onefjf Thierry plc1 [3595, 4595, 5595] +1598 1 onefjg Thierry plc1 [3596, 4596, 5596] +1599 1 onefjh Thierry plc1 [3597, 4597, 5597] +1600 1 onefji Thierry plc1 [3598, 4598, 5598] +1601 1 onefjj Thierry plc1 [3599, 4599, 5599] +1602 1 onegaa Thierry plc1 [3600, 4600, 5600] +1603 1 onegab Thierry plc1 [3601, 4601, 5601] +1604 1 onegac Thierry plc1 [3602, 4602, 5602] +1605 1 onegad Thierry plc1 [3603, 4603, 5603] +1606 1 onegae Thierry plc1 [3604, 4604, 5604] +1607 1 onegaf Thierry plc1 [3605, 4605, 5605] +1608 1 onegag Thierry plc1 [3606, 4606, 5606] +1609 1 onegah Thierry plc1 [3607, 4607, 5607] +1610 1 onegai Thierry plc1 [3608, 4608, 5608] +1611 1 onegaj Thierry plc1 [3609, 4609, 5609] +1612 1 onegba Thierry plc1 [3610, 4610, 5610] +1613 1 onegbb Thierry plc1 [3611, 4611, 5611] +1614 1 onegbc Thierry plc1 [3612, 4612, 5612] +1615 1 onegbd Thierry plc1 [3613, 4613, 5613] +1616 1 onegbe Thierry plc1 [3614, 4614, 5614] +1617 1 onegbf Thierry plc1 [3615, 4615, 5615] +1618 1 onegbg Thierry plc1 [3616, 4616, 5616] +1619 1 onegbh Thierry plc1 [3617, 4617, 5617] +1620 1 onegbi Thierry plc1 [3618, 4618, 5618] +1621 1 onegbj Thierry plc1 [3619, 4619, 5619] +1622 1 onegca Thierry plc1 [3620, 4620, 5620] +1623 1 onegcb Thierry plc1 [3621, 4621, 5621] +1624 1 onegcc Thierry plc1 [3622, 4622, 5622] +1625 1 onegcd Thierry plc1 [3623, 4623, 5623] +1626 1 onegce Thierry plc1 [3624, 4624, 5624] +1627 1 onegcf Thierry plc1 [3625, 4625, 5625] +1628 1 onegcg Thierry plc1 [3626, 4626, 5626] +1629 1 onegch Thierry plc1 [3627, 4627, 5627] +1630 1 onegci Thierry plc1 [3628, 4628, 5628] +1631 1 onegcj Thierry plc1 [3629, 4629, 5629] +1632 1 onegda Thierry plc1 [3630, 4630, 5630] +1633 1 onegdb Thierry plc1 [3631, 4631, 5631] +1634 1 onegdc Thierry plc1 [3632, 4632, 5632] +1635 1 onegdd Thierry plc1 [3633, 4633, 5633] +1636 1 onegde Thierry plc1 [3634, 4634, 5634] +1637 1 onegdf Thierry plc1 [3635, 4635, 5635] +1638 1 onegdg Thierry plc1 [3636, 4636, 5636] +1639 1 onegdh Thierry plc1 [3637, 4637, 5637] +1640 1 onegdi Thierry plc1 [3638, 4638, 5638] +1641 1 onegdj Thierry plc1 [3639, 4639, 5639] +1642 1 onegea Thierry plc1 [3640, 4640, 5640] +1643 1 onegeb Thierry plc1 [3641, 4641, 5641] +1644 1 onegec Thierry plc1 [3642, 4642, 5642] +1645 1 oneged Thierry plc1 [3643, 4643, 5643] +1646 1 onegee Thierry plc1 [3644, 4644, 5644] +1647 1 onegef Thierry plc1 [3645, 4645, 5645] +1648 1 onegeg Thierry plc1 [3646, 4646, 5646] +1649 1 onegeh Thierry plc1 [3647, 4647, 5647] +1650 1 onegei Thierry plc1 [3648, 4648, 5648] +1651 1 onegej Thierry plc1 [3649, 4649, 5649] +1652 1 onegfa Thierry plc1 [3650, 4650, 5650] +1653 1 onegfb Thierry plc1 [3651, 4651, 5651] +1654 1 onegfc Thierry plc1 [3652, 4652, 5652] +1655 1 onegfd Thierry plc1 [3653, 4653, 5653] +1656 1 onegfe Thierry plc1 [3654, 4654, 5654] +1657 1 onegff Thierry plc1 [3655, 4655, 5655] +1658 1 onegfg Thierry plc1 [3656, 4656, 5656] +1659 1 onegfh Thierry plc1 [3657, 4657, 5657] +1660 1 onegfi Thierry plc1 [3658, 4658, 5658] +1661 1 onegfj Thierry plc1 [3659, 4659, 5659] +1662 1 onegga Thierry plc1 [3660, 4660, 5660] +1663 1 oneggb Thierry plc1 [3661, 4661, 5661] +1664 1 oneggc Thierry plc1 [3662, 4662, 5662] +1665 1 oneggd Thierry plc1 [3663, 4663, 5663] +1666 1 onegge Thierry plc1 [3664, 4664, 5664] +1667 1 oneggf Thierry plc1 [3665, 4665, 5665] +1668 1 oneggg Thierry plc1 [3666, 4666, 5666] +1669 1 oneggh Thierry plc1 [3667, 4667, 5667] +1670 1 oneggi Thierry plc1 [3668, 4668, 5668] +1671 1 oneggj Thierry plc1 [3669, 4669, 5669] +1672 1 onegha Thierry plc1 [3670, 4670, 5670] +1673 1 oneghb Thierry plc1 [3671, 4671, 5671] +1674 1 oneghc Thierry plc1 [3672, 4672, 5672] +1675 1 oneghd Thierry plc1 [3673, 4673, 5673] +1676 1 oneghe Thierry plc1 [3674, 4674, 5674] +1677 1 oneghf Thierry plc1 [3675, 4675, 5675] +1678 1 oneghg Thierry plc1 [3676, 4676, 5676] +1679 1 oneghh Thierry plc1 [3677, 4677, 5677] +1680 1 oneghi Thierry plc1 [3678, 4678, 5678] +1681 1 oneghj Thierry plc1 [3679, 4679, 5679] +1682 1 onegia Thierry plc1 [3680, 4680, 5680] +1683 1 onegib Thierry plc1 [3681, 4681, 5681] +1684 1 onegic Thierry plc1 [3682, 4682, 5682] +1685 1 onegid Thierry plc1 [3683, 4683, 5683] +1686 1 onegie Thierry plc1 [3684, 4684, 5684] +1687 1 onegif Thierry plc1 [3685, 4685, 5685] +1688 1 onegig Thierry plc1 [3686, 4686, 5686] +1689 1 onegih Thierry plc1 [3687, 4687, 5687] +1690 1 onegii Thierry plc1 [3688, 4688, 5688] +1691 1 onegij Thierry plc1 [3689, 4689, 5689] +1692 1 onegja Thierry plc1 [3690, 4690, 5690] +1693 1 onegjb Thierry plc1 [3691, 4691, 5691] +1694 1 onegjc Thierry plc1 [3692, 4692, 5692] +1695 1 onegjd Thierry plc1 [3693, 4693, 5693] +1696 1 onegje Thierry plc1 [3694, 4694, 5694] +1697 1 onegjf Thierry plc1 [3695, 4695, 5695] +1698 1 onegjg Thierry plc1 [3696, 4696, 5696] +1699 1 onegjh Thierry plc1 [3697, 4697, 5697] +1700 1 onegji Thierry plc1 [3698, 4698, 5698] +1701 1 onegjj Thierry plc1 [3699, 4699, 5699] +1702 1 onehaa Thierry plc1 [3700, 4700, 5700] +1703 1 onehab Thierry plc1 [3701, 4701, 5701] +1704 1 onehac Thierry plc1 [3702, 4702, 5702] +1705 1 onehad Thierry plc1 [3703, 4703, 5703] +1706 1 onehae Thierry plc1 [3704, 4704, 5704] +1707 1 onehaf Thierry plc1 [3705, 4705, 5705] +1708 1 onehag Thierry plc1 [3706, 4706, 5706] +1709 1 onehah Thierry plc1 [3707, 4707, 5707] +1710 1 onehai Thierry plc1 [3708, 4708, 5708] +1711 1 onehaj Thierry plc1 [3709, 4709, 5709] +1712 1 onehba Thierry plc1 [3710, 4710, 5710] +1713 1 onehbb Thierry plc1 [3711, 4711, 5711] +1714 1 onehbc Thierry plc1 [3712, 4712, 5712] +1715 1 onehbd Thierry plc1 [3713, 4713, 5713] +1716 1 onehbe Thierry plc1 [3714, 4714, 5714] +1717 1 onehbf Thierry plc1 [3715, 4715, 5715] +1718 1 onehbg Thierry plc1 [3716, 4716, 5716] +1719 1 onehbh Thierry plc1 [3717, 4717, 5717] +1720 1 onehbi Thierry plc1 [3718, 4718, 5718] +1721 1 onehbj Thierry plc1 [3719, 4719, 5719] +1722 1 onehca Thierry plc1 [3720, 4720, 5720] +1723 1 onehcb Thierry plc1 [3721, 4721, 5721] +1724 1 onehcc Thierry plc1 [3722, 4722, 5722] +1725 1 onehcd Thierry plc1 [3723, 4723, 5723] +1726 1 onehce Thierry plc1 [3724, 4724, 5724] +1727 1 onehcf Thierry plc1 [3725, 4725, 5725] +1728 1 onehcg Thierry plc1 [3726, 4726, 5726] +1729 1 onehch Thierry plc1 [3727, 4727, 5727] +1730 1 onehci Thierry plc1 [3728, 4728, 5728] +1731 1 onehcj Thierry plc1 [3729, 4729, 5729] +1732 1 onehda Thierry plc1 [3730, 4730, 5730] +1733 1 onehdb Thierry plc1 [3731, 4731, 5731] +1734 1 onehdc Thierry plc1 [3732, 4732, 5732] +1735 1 onehdd Thierry plc1 [3733, 4733, 5733] +1736 1 onehde Thierry plc1 [3734, 4734, 5734] +1737 1 onehdf Thierry plc1 [3735, 4735, 5735] +1738 1 onehdg Thierry plc1 [3736, 4736, 5736] +1739 1 onehdh Thierry plc1 [3737, 4737, 5737] +1740 1 onehdi Thierry plc1 [3738, 4738, 5738] +1741 1 onehdj Thierry plc1 [3739, 4739, 5739] +1742 1 onehea Thierry plc1 [3740, 4740, 5740] +1743 1 oneheb Thierry plc1 [3741, 4741, 5741] +1744 1 onehec Thierry plc1 [3742, 4742, 5742] +1745 1 onehed Thierry plc1 [3743, 4743, 5743] +1746 1 onehee Thierry plc1 [3744, 4744, 5744] +1747 1 onehef Thierry plc1 [3745, 4745, 5745] +1748 1 oneheg Thierry plc1 [3746, 4746, 5746] +1749 1 oneheh Thierry plc1 [3747, 4747, 5747] +1750 1 onehei Thierry plc1 [3748, 4748, 5748] +1751 1 onehej Thierry plc1 [3749, 4749, 5749] +1752 1 onehfa Thierry plc1 [3750, 4750, 5750] +1753 1 onehfb Thierry plc1 [3751, 4751, 5751] +1754 1 onehfc Thierry plc1 [3752, 4752, 5752] +1755 1 onehfd Thierry plc1 [3753, 4753, 5753] +1756 1 onehfe Thierry plc1 [3754, 4754, 5754] +1757 1 onehff Thierry plc1 [3755, 4755, 5755] +1758 1 onehfg Thierry plc1 [3756, 4756, 5756] +1759 1 onehfh Thierry plc1 [3757, 4757, 5757] +1760 1 onehfi Thierry plc1 [3758, 4758, 5758] +1761 1 onehfj Thierry plc1 [3759, 4759, 5759] +1762 1 onehga Thierry plc1 [3760, 4760, 5760] +1763 1 onehgb Thierry plc1 [3761, 4761, 5761] +1764 1 onehgc Thierry plc1 [3762, 4762, 5762] +1765 1 onehgd Thierry plc1 [3763, 4763, 5763] +1766 1 onehge Thierry plc1 [3764, 4764, 5764] +1767 1 onehgf Thierry plc1 [3765, 4765, 5765] +1768 1 onehgg Thierry plc1 [3766, 4766, 5766] +1769 1 onehgh Thierry plc1 [3767, 4767, 5767] +1770 1 onehgi Thierry plc1 [3768, 4768, 5768] +1771 1 onehgj Thierry plc1 [3769, 4769, 5769] +1772 1 onehha Thierry plc1 [3770, 4770, 5770] +1773 1 onehhb Thierry plc1 [3771, 4771, 5771] +1774 1 onehhc Thierry plc1 [3772, 4772, 5772] +1775 1 onehhd Thierry plc1 [3773, 4773, 5773] +1776 1 onehhe Thierry plc1 [3774, 4774, 5774] +1777 1 onehhf Thierry plc1 [3775, 4775, 5775] +1778 1 onehhg Thierry plc1 [3776, 4776, 5776] +1779 1 onehhh Thierry plc1 [3777, 4777, 5777] +1780 1 onehhi Thierry plc1 [3778, 4778, 5778] +1781 1 onehhj Thierry plc1 [3779, 4779, 5779] +1782 1 onehia Thierry plc1 [3780, 4780, 5780] +1783 1 onehib Thierry plc1 [3781, 4781, 5781] +1784 1 onehic Thierry plc1 [3782, 4782, 5782] +1785 1 onehid Thierry plc1 [3783, 4783, 5783] +1786 1 onehie Thierry plc1 [3784, 4784, 5784] +1787 1 onehif Thierry plc1 [3785, 4785, 5785] +1788 1 onehig Thierry plc1 [3786, 4786, 5786] +1789 1 onehih Thierry plc1 [3787, 4787, 5787] +1790 1 onehii Thierry plc1 [3788, 4788, 5788] +1791 1 onehij Thierry plc1 [3789, 4789, 5789] +1792 1 onehja Thierry plc1 [3790, 4790, 5790] +1793 1 onehjb Thierry plc1 [3791, 4791, 5791] +1794 1 onehjc Thierry plc1 [3792, 4792, 5792] +1795 1 onehjd Thierry plc1 [3793, 4793, 5793] +1796 1 onehje Thierry plc1 [3794, 4794, 5794] +1797 1 onehjf Thierry plc1 [3795, 4795, 5795] +1798 1 onehjg Thierry plc1 [3796, 4796, 5796] +1799 1 onehjh Thierry plc1 [3797, 4797, 5797] +1800 1 onehji Thierry plc1 [3798, 4798, 5798] +1801 1 onehjj Thierry plc1 [3799, 4799, 5799] +1802 1 oneiaa Thierry plc1 [3800, 4800, 5800] +1803 1 oneiab Thierry plc1 [3801, 4801, 5801] +1804 1 oneiac Thierry plc1 [3802, 4802, 5802] +1805 1 oneiad Thierry plc1 [3803, 4803, 5803] +1806 1 oneiae Thierry plc1 [3804, 4804, 5804] +1807 1 oneiaf Thierry plc1 [3805, 4805, 5805] +1808 1 oneiag Thierry plc1 [3806, 4806, 5806] +1809 1 oneiah Thierry plc1 [3807, 4807, 5807] +1810 1 oneiai Thierry plc1 [3808, 4808, 5808] +1811 1 oneiaj Thierry plc1 [3809, 4809, 5809] +1812 1 oneiba Thierry plc1 [3810, 4810, 5810] +1813 1 oneibb Thierry plc1 [3811, 4811, 5811] +1814 1 oneibc Thierry plc1 [3812, 4812, 5812] +1815 1 oneibd Thierry plc1 [3813, 4813, 5813] +1816 1 oneibe Thierry plc1 [3814, 4814, 5814] +1817 1 oneibf Thierry plc1 [3815, 4815, 5815] +1818 1 oneibg Thierry plc1 [3816, 4816, 5816] +1819 1 oneibh Thierry plc1 [3817, 4817, 5817] +1820 1 oneibi Thierry plc1 [3818, 4818, 5818] +1821 1 oneibj Thierry plc1 [3819, 4819, 5819] +1822 1 oneica Thierry plc1 [3820, 4820, 5820] +1823 1 oneicb Thierry plc1 [3821, 4821, 5821] +1824 1 oneicc Thierry plc1 [3822, 4822, 5822] +1825 1 oneicd Thierry plc1 [3823, 4823, 5823] +1826 1 oneice Thierry plc1 [3824, 4824, 5824] +1827 1 oneicf Thierry plc1 [3825, 4825, 5825] +1828 1 oneicg Thierry plc1 [3826, 4826, 5826] +1829 1 oneich Thierry plc1 [3827, 4827, 5827] +1830 1 oneici Thierry plc1 [3828, 4828, 5828] +1831 1 oneicj Thierry plc1 [3829, 4829, 5829] +1832 1 oneida Thierry plc1 [3830, 4830, 5830] +1833 1 oneidb Thierry plc1 [3831, 4831, 5831] +1834 1 oneidc Thierry plc1 [3832, 4832, 5832] +1835 1 oneidd Thierry plc1 [3833, 4833, 5833] +1836 1 oneide Thierry plc1 [3834, 4834, 5834] +1837 1 oneidf Thierry plc1 [3835, 4835, 5835] +1838 1 oneidg Thierry plc1 [3836, 4836, 5836] +1839 1 oneidh Thierry plc1 [3837, 4837, 5837] +1840 1 oneidi Thierry plc1 [3838, 4838, 5838] +1841 1 oneidj Thierry plc1 [3839, 4839, 5839] +1842 1 oneiea Thierry plc1 [3840, 4840, 5840] +1843 1 oneieb Thierry plc1 [3841, 4841, 5841] +1844 1 oneiec Thierry plc1 [3842, 4842, 5842] +1845 1 oneied Thierry plc1 [3843, 4843, 5843] +1846 1 oneiee Thierry plc1 [3844, 4844, 5844] +1847 1 oneief Thierry plc1 [3845, 4845, 5845] +1848 1 oneieg Thierry plc1 [3846, 4846, 5846] +1849 1 oneieh Thierry plc1 [3847, 4847, 5847] +1850 1 oneiei Thierry plc1 [3848, 4848, 5848] +1851 1 oneiej Thierry plc1 [3849, 4849, 5849] +1852 1 oneifa Thierry plc1 [3850, 4850, 5850] +1853 1 oneifb Thierry plc1 [3851, 4851, 5851] +1854 1 oneifc Thierry plc1 [3852, 4852, 5852] +1855 1 oneifd Thierry plc1 [3853, 4853, 5853] +1856 1 oneife Thierry plc1 [3854, 4854, 5854] +1857 1 oneiff Thierry plc1 [3855, 4855, 5855] +1858 1 oneifg Thierry plc1 [3856, 4856, 5856] +1859 1 oneifh Thierry plc1 [3857, 4857, 5857] +1860 1 oneifi Thierry plc1 [3858, 4858, 5858] +1861 1 oneifj Thierry plc1 [3859, 4859, 5859] +1862 1 oneiga Thierry plc1 [3860, 4860, 5860] +1863 1 oneigb Thierry plc1 [3861, 4861, 5861] +1864 1 oneigc Thierry plc1 [3862, 4862, 5862] +1865 1 oneigd Thierry plc1 [3863, 4863, 5863] +1866 1 oneige Thierry plc1 [3864, 4864, 5864] +1867 1 oneigf Thierry plc1 [3865, 4865, 5865] +1868 1 oneigg Thierry plc1 [3866, 4866, 5866] +1869 1 oneigh Thierry plc1 [3867, 4867, 5867] +1870 1 oneigi Thierry plc1 [3868, 4868, 5868] +1871 1 oneigj Thierry plc1 [3869, 4869, 5869] +1872 1 oneiha Thierry plc1 [3870, 4870, 5870] +1873 1 oneihb Thierry plc1 [3871, 4871, 5871] +1874 1 oneihc Thierry plc1 [3872, 4872, 5872] +1875 1 oneihd Thierry plc1 [3873, 4873, 5873] +1876 1 oneihe Thierry plc1 [3874, 4874, 5874] +1877 1 oneihf Thierry plc1 [3875, 4875, 5875] +1878 1 oneihg Thierry plc1 [3876, 4876, 5876] +1879 1 oneihh Thierry plc1 [3877, 4877, 5877] +1880 1 oneihi Thierry plc1 [3878, 4878, 5878] +1881 1 oneihj Thierry plc1 [3879, 4879, 5879] +1882 1 oneiia Thierry plc1 [3880, 4880, 5880] +1883 1 oneiib Thierry plc1 [3881, 4881, 5881] +1884 1 oneiic Thierry plc1 [3882, 4882, 5882] +1885 1 oneiid Thierry plc1 [3883, 4883, 5883] +1886 1 oneiie Thierry plc1 [3884, 4884, 5884] +1887 1 oneiif Thierry plc1 [3885, 4885, 5885] +1888 1 oneiig Thierry plc1 [3886, 4886, 5886] +1889 1 oneiih Thierry plc1 [3887, 4887, 5887] +1890 1 oneiii Thierry plc1 [3888, 4888, 5888] +1891 1 oneiij Thierry plc1 [3889, 4889, 5889] +1892 1 oneija Thierry plc1 [3890, 4890, 5890] +1893 1 oneijb Thierry plc1 [3891, 4891, 5891] +1894 1 oneijc Thierry plc1 [3892, 4892, 5892] +1895 1 oneijd Thierry plc1 [3893, 4893, 5893] +1896 1 oneije Thierry plc1 [3894, 4894, 5894] +1897 1 oneijf Thierry plc1 [3895, 4895, 5895] +1898 1 oneijg Thierry plc1 [3896, 4896, 5896] +1899 1 oneijh Thierry plc1 [3897, 4897, 5897] +1900 1 oneiji Thierry plc1 [3898, 4898, 5898] +1901 1 oneijj Thierry plc1 [3899, 4899, 5899] +1902 1 onejaa Thierry plc1 [3900, 4900, 5900] +1903 1 onejab Thierry plc1 [3901, 4901, 5901] +1904 1 onejac Thierry plc1 [3902, 4902, 5902] +1905 1 onejad Thierry plc1 [3903, 4903, 5903] +1906 1 onejae Thierry plc1 [3904, 4904, 5904] +1907 1 onejaf Thierry plc1 [3905, 4905, 5905] +1908 1 onejag Thierry plc1 [3906, 4906, 5906] +1909 1 onejah Thierry plc1 [3907, 4907, 5907] +1910 1 onejai Thierry plc1 [3908, 4908, 5908] +1911 1 onejaj Thierry plc1 [3909, 4909, 5909] +1912 1 onejba Thierry plc1 [3910, 4910, 5910] +1913 1 onejbb Thierry plc1 [3911, 4911, 5911] +1914 1 onejbc Thierry plc1 [3912, 4912, 5912] +1915 1 onejbd Thierry plc1 [3913, 4913, 5913] +1916 1 onejbe Thierry plc1 [3914, 4914, 5914] +1917 1 onejbf Thierry plc1 [3915, 4915, 5915] +1918 1 onejbg Thierry plc1 [3916, 4916, 5916] +1919 1 onejbh Thierry plc1 [3917, 4917, 5917] +1920 1 onejbi Thierry plc1 [3918, 4918, 5918] +1921 1 onejbj Thierry plc1 [3919, 4919, 5919] +1922 1 onejca Thierry plc1 [3920, 4920, 5920] +1923 1 onejcb Thierry plc1 [3921, 4921, 5921] +1924 1 onejcc Thierry plc1 [3922, 4922, 5922] +1925 1 onejcd Thierry plc1 [3923, 4923, 5923] +1926 1 onejce Thierry plc1 [3924, 4924, 5924] +1927 1 onejcf Thierry plc1 [3925, 4925, 5925] +1928 1 onejcg Thierry plc1 [3926, 4926, 5926] +1929 1 onejch Thierry plc1 [3927, 4927, 5927] +1930 1 onejci Thierry plc1 [3928, 4928, 5928] +1931 1 onejcj Thierry plc1 [3929, 4929, 5929] +1932 1 onejda Thierry plc1 [3930, 4930, 5930] +1933 1 onejdb Thierry plc1 [3931, 4931, 5931] +1934 1 onejdc Thierry plc1 [3932, 4932, 5932] +1935 1 onejdd Thierry plc1 [3933, 4933, 5933] +1936 1 onejde Thierry plc1 [3934, 4934, 5934] +1937 1 onejdf Thierry plc1 [3935, 4935, 5935] +1938 1 onejdg Thierry plc1 [3936, 4936, 5936] +1939 1 onejdh Thierry plc1 [3937, 4937, 5937] +1940 1 onejdi Thierry plc1 [3938, 4938, 5938] +1941 1 onejdj Thierry plc1 [3939, 4939, 5939] +1942 1 onejea Thierry plc1 [3940, 4940, 5940] +1943 1 onejeb Thierry plc1 [3941, 4941, 5941] +1944 1 onejec Thierry plc1 [3942, 4942, 5942] +1945 1 onejed Thierry plc1 [3943, 4943, 5943] +1946 1 onejee Thierry plc1 [3944, 4944, 5944] +1947 1 onejef Thierry plc1 [3945, 4945, 5945] +1948 1 onejeg Thierry plc1 [3946, 4946, 5946] +1949 1 onejeh Thierry plc1 [3947, 4947, 5947] +1950 1 onejei Thierry plc1 [3948, 4948, 5948] +1951 1 onejej Thierry plc1 [3949, 4949, 5949] +1952 1 onejfa Thierry plc1 [3950, 4950, 5950] +1953 1 onejfb Thierry plc1 [3951, 4951, 5951] +1954 1 onejfc Thierry plc1 [3952, 4952, 5952] +1955 1 onejfd Thierry plc1 [3953, 4953, 5953] +1956 1 onejfe Thierry plc1 [3954, 4954, 5954] +1957 1 onejff Thierry plc1 [3955, 4955, 5955] +1958 1 onejfg Thierry plc1 [3956, 4956, 5956] +1959 1 onejfh Thierry plc1 [3957, 4957, 5957] +1960 1 onejfi Thierry plc1 [3958, 4958, 5958] +1961 1 onejfj Thierry plc1 [3959, 4959, 5959] +1962 1 onejga Thierry plc1 [3960, 4960, 5960] +1963 1 onejgb Thierry plc1 [3961, 4961, 5961] +1964 1 onejgc Thierry plc1 [3962, 4962, 5962] +1965 1 onejgd Thierry plc1 [3963, 4963, 5963] +1966 1 onejge Thierry plc1 [3964, 4964, 5964] +1967 1 onejgf Thierry plc1 [3965, 4965, 5965] +1968 1 onejgg Thierry plc1 [3966, 4966, 5966] +1969 1 onejgh Thierry plc1 [3967, 4967, 5967] +1970 1 onejgi Thierry plc1 [3968, 4968, 5968] +1971 1 onejgj Thierry plc1 [3969, 4969, 5969] +1972 1 onejha Thierry plc1 [3970, 4970, 5970] +1973 1 onejhb Thierry plc1 [3971, 4971, 5971] +1974 1 onejhc Thierry plc1 [3972, 4972, 5972] +1975 1 onejhd Thierry plc1 [3973, 4973, 5973] +1976 1 onejhe Thierry plc1 [3974, 4974, 5974] +1977 1 onejhf Thierry plc1 [3975, 4975, 5975] +1978 1 onejhg Thierry plc1 [3976, 4976, 5976] +1979 1 onejhh Thierry plc1 [3977, 4977, 5977] +1980 1 onejhi Thierry plc1 [3978, 4978, 5978] +1981 1 onejhj Thierry plc1 [3979, 4979, 5979] +1982 1 onejia Thierry plc1 [3980, 4980, 5980] +1983 1 onejib Thierry plc1 [3981, 4981, 5981] +1984 1 onejic Thierry plc1 [3982, 4982, 5982] +1985 1 onejid Thierry plc1 [3983, 4983, 5983] +1986 1 onejie Thierry plc1 [3984, 4984, 5984] +1987 1 onejif Thierry plc1 [3985, 4985, 5985] +1988 1 onejig Thierry plc1 [3986, 4986, 5986] +1989 1 onejih Thierry plc1 [3987, 4987, 5987] +1990 1 onejii Thierry plc1 [3988, 4988, 5988] +1991 1 onejij Thierry plc1 [3989, 4989, 5989] +1992 1 onejja Thierry plc1 [3990, 4990, 5990] +1993 1 onejjb Thierry plc1 [3991, 4991, 5991] +1994 1 onejjc Thierry plc1 [3992, 4992, 5992] +1995 1 onejjd Thierry plc1 [3993, 4993, 5993] +1996 1 onejje Thierry plc1 [3994, 4994, 5994] +1997 1 onejjf Thierry plc1 [3995, 4995, 5995] +1998 1 onejjg Thierry plc1 [3996, 4996, 5996] +1999 1 onejjh Thierry plc1 [3997, 4997, 5997] +2000 1 onejji Thierry plc1 [3998, 4998, 5998] +2001 1 onejjj Thierry plc1 [3999, 4999, 5999] +2002 1 onebaaa Thierry plc1 [4000, 5000, 6000] +02: KEYS +1 None ssh-rsa 22key4plc22 user1-key1 +2 None ssh-rsa 22key4plc22 user2-key1 +3 None ssh-rsa 22key4plc22 user3-key1 +4 None ssh-rsa 22key4plc22 user4-key1 +5 None ssh-rsa 22key4plc22 user5-key1 +6 None ssh-rsa 22key4plc22 user6-key1 +7 None ssh-rsa 22key4plc22 user7-key1 +8 None ssh-rsa 22key4plc22 user8-key1 +9 None ssh-rsa 22key4plc22 user9-key1 +10 None ssh-rsa 22key4plc22 user10-key1 +11 None ssh-rsa 22key4plc22 user11-key1 +12 None ssh-rsa 22key4plc22 user12-key1 +13 None ssh-rsa 22key4plc22 user13-key1 +14 None ssh-rsa 22key4plc22 user14-key1 +15 None ssh-rsa 22key4plc22 user15-key1 +16 None ssh-rsa 22key4plc22 user16-key1 +17 None ssh-rsa 22key4plc22 user17-key1 +18 None ssh-rsa 22key4plc22 user18-key1 +19 None ssh-rsa 22key4plc22 user19-key1 +20 None ssh-rsa 22key4plc22 user20-key1 +21 None ssh-rsa 22key4plc22 user21-key1 +22 None ssh-rsa 22key4plc22 user22-key1 +23 None ssh-rsa 22key4plc22 user23-key1 +24 None ssh-rsa 22key4plc22 user24-key1 +25 None ssh-rsa 22key4plc22 user25-key1 +26 None ssh-rsa 22key4plc22 user26-key1 +27 None ssh-rsa 22key4plc22 user27-key1 +28 None ssh-rsa 22key4plc22 user28-key1 +29 None ssh-rsa 22key4plc22 user29-key1 +30 None ssh-rsa 22key4plc22 user30-key1 +31 None ssh-rsa 22key4plc22 user31-key1 +32 None ssh-rsa 22key4plc22 user32-key1 +33 None ssh-rsa 22key4plc22 user33-key1 +34 None ssh-rsa 22key4plc22 user34-key1 +35 None ssh-rsa 22key4plc22 user35-key1 +36 None ssh-rsa 22key4plc22 user36-key1 +37 None ssh-rsa 22key4plc22 user37-key1 +38 None ssh-rsa 22key4plc22 user38-key1 +39 None ssh-rsa 22key4plc22 user39-key1 +40 None ssh-rsa 22key4plc22 user40-key1 +41 None ssh-rsa 22key4plc22 user41-key1 +42 None ssh-rsa 22key4plc22 user42-key1 +43 None ssh-rsa 22key4plc22 user43-key1 +44 None ssh-rsa 22key4plc22 user44-key1 +45 None ssh-rsa 22key4plc22 user45-key1 +46 None ssh-rsa 22key4plc22 user46-key1 +47 None ssh-rsa 22key4plc22 user47-key1 +48 None ssh-rsa 22key4plc22 user48-key1 +49 None ssh-rsa 22key4plc22 user49-key1 +50 None ssh-rsa 22key4plc22 user50-key1 +51 None ssh-rsa 22key4plc22 user51-key1 +52 None ssh-rsa 22key4plc22 user52-key1 +53 None ssh-rsa 22key4plc22 user53-key1 +54 None ssh-rsa 22key4plc22 user54-key1 +55 None ssh-rsa 22key4plc22 user55-key1 +56 None ssh-rsa 22key4plc22 user56-key1 +57 None ssh-rsa 22key4plc22 user57-key1 +58 None ssh-rsa 22key4plc22 user58-key1 +59 None ssh-rsa 22key4plc22 user59-key1 +60 None ssh-rsa 22key4plc22 user60-key1 +61 None ssh-rsa 22key4plc22 user61-key1 +62 None ssh-rsa 22key4plc22 user62-key1 +63 None ssh-rsa 22key4plc22 user63-key1 +64 None ssh-rsa 22key4plc22 user64-key1 +65 None ssh-rsa 22key4plc22 user65-key1 +66 None ssh-rsa 22key4plc22 user66-key1 +67 None ssh-rsa 22key4plc22 user67-key1 +68 None ssh-rsa 22key4plc22 user68-key1 +69 None ssh-rsa 22key4plc22 user69-key1 +70 None ssh-rsa 22key4plc22 user70-key1 +71 None ssh-rsa 22key4plc22 user71-key1 +72 None ssh-rsa 22key4plc22 user72-key1 +73 None ssh-rsa 22key4plc22 user73-key1 +74 None ssh-rsa 22key4plc22 user74-key1 +75 None ssh-rsa 22key4plc22 user75-key1 +76 None ssh-rsa 22key4plc22 user76-key1 +77 None ssh-rsa 22key4plc22 user77-key1 +78 None ssh-rsa 22key4plc22 user78-key1 +79 None ssh-rsa 22key4plc22 user79-key1 +80 None ssh-rsa 22key4plc22 user80-key1 +81 None ssh-rsa 22key4plc22 user81-key1 +82 None ssh-rsa 22key4plc22 user82-key1 +83 None ssh-rsa 22key4plc22 user83-key1 +84 None ssh-rsa 22key4plc22 user84-key1 +85 None ssh-rsa 22key4plc22 user85-key1 +86 None ssh-rsa 22key4plc22 user86-key1 +87 None ssh-rsa 22key4plc22 user87-key1 +88 None ssh-rsa 22key4plc22 user88-key1 +89 None ssh-rsa 22key4plc22 user89-key1 +90 None ssh-rsa 22key4plc22 user90-key1 +91 None ssh-rsa 22key4plc22 user91-key1 +92 None ssh-rsa 22key4plc22 user92-key1 +93 None ssh-rsa 22key4plc22 user93-key1 +94 None ssh-rsa 22key4plc22 user94-key1 +95 None ssh-rsa 22key4plc22 user95-key1 +96 None ssh-rsa 22key4plc22 user96-key1 +97 None ssh-rsa 22key4plc22 user97-key1 +98 None ssh-rsa 22key4plc22 user98-key1 +99 None ssh-rsa 22key4plc22 user99-key1 +100 None ssh-rsa 22key4plc22 user100-key1 +101 None ssh-rsa 22key4plc22 user101-key1 +102 None ssh-rsa 22key4plc22 user102-key1 +103 None ssh-rsa 22key4plc22 user103-key1 +104 None ssh-rsa 22key4plc22 user104-key1 +105 None ssh-rsa 22key4plc22 user105-key1 +106 None ssh-rsa 22key4plc22 user106-key1 +107 None ssh-rsa 22key4plc22 user107-key1 +108 None ssh-rsa 22key4plc22 user108-key1 +109 None ssh-rsa 22key4plc22 user109-key1 +110 None ssh-rsa 22key4plc22 user110-key1 +111 None ssh-rsa 22key4plc22 user111-key1 +112 None ssh-rsa 22key4plc22 user112-key1 +113 None ssh-rsa 22key4plc22 user113-key1 +114 None ssh-rsa 22key4plc22 user114-key1 +115 None ssh-rsa 22key4plc22 user115-key1 +116 None ssh-rsa 22key4plc22 user116-key1 +117 None ssh-rsa 22key4plc22 user117-key1 +118 None ssh-rsa 22key4plc22 user118-key1 +119 None ssh-rsa 22key4plc22 user119-key1 +120 None ssh-rsa 22key4plc22 user120-key1 +121 None ssh-rsa 22key4plc22 user121-key1 +122 None ssh-rsa 22key4plc22 user122-key1 +123 None ssh-rsa 22key4plc22 user123-key1 +124 None ssh-rsa 22key4plc22 user124-key1 +125 None ssh-rsa 22key4plc22 user125-key1 +126 None ssh-rsa 22key4plc22 user126-key1 +127 None ssh-rsa 22key4plc22 user127-key1 +128 None ssh-rsa 22key4plc22 user128-key1 +129 None ssh-rsa 22key4plc22 user129-key1 +130 None ssh-rsa 22key4plc22 user130-key1 +131 None ssh-rsa 22key4plc22 user131-key1 +132 None ssh-rsa 22key4plc22 user132-key1 +133 None ssh-rsa 22key4plc22 user133-key1 +134 None ssh-rsa 22key4plc22 user134-key1 +135 None ssh-rsa 22key4plc22 user135-key1 +136 None ssh-rsa 22key4plc22 user136-key1 +137 None ssh-rsa 22key4plc22 user137-key1 +138 None ssh-rsa 22key4plc22 user138-key1 +139 None ssh-rsa 22key4plc22 user139-key1 +140 None ssh-rsa 22key4plc22 user140-key1 +141 None ssh-rsa 22key4plc22 user141-key1 +142 None ssh-rsa 22key4plc22 user142-key1 +143 None ssh-rsa 22key4plc22 user143-key1 +144 None ssh-rsa 22key4plc22 user144-key1 +145 None ssh-rsa 22key4plc22 user145-key1 +146 None ssh-rsa 22key4plc22 user146-key1 +147 None ssh-rsa 22key4plc22 user147-key1 +148 None ssh-rsa 22key4plc22 user148-key1 +149 None ssh-rsa 22key4plc22 user149-key1 +150 None ssh-rsa 22key4plc22 user150-key1 +151 None ssh-rsa 22key4plc22 user151-key1 +152 None ssh-rsa 22key4plc22 user152-key1 +153 None ssh-rsa 22key4plc22 user153-key1 +154 None ssh-rsa 22key4plc22 user154-key1 +155 None ssh-rsa 22key4plc22 user155-key1 +156 None ssh-rsa 22key4plc22 user156-key1 +157 None ssh-rsa 22key4plc22 user157-key1 +158 None ssh-rsa 22key4plc22 user158-key1 +159 None ssh-rsa 22key4plc22 user159-key1 +160 None ssh-rsa 22key4plc22 user160-key1 +161 None ssh-rsa 22key4plc22 user161-key1 +162 None ssh-rsa 22key4plc22 user162-key1 +163 None ssh-rsa 22key4plc22 user163-key1 +164 None ssh-rsa 22key4plc22 user164-key1 +165 None ssh-rsa 22key4plc22 user165-key1 +166 None ssh-rsa 22key4plc22 user166-key1 +167 None ssh-rsa 22key4plc22 user167-key1 +168 None ssh-rsa 22key4plc22 user168-key1 +169 None ssh-rsa 22key4plc22 user169-key1 +170 None ssh-rsa 22key4plc22 user170-key1 +171 None ssh-rsa 22key4plc22 user171-key1 +172 None ssh-rsa 22key4plc22 user172-key1 +173 None ssh-rsa 22key4plc22 user173-key1 +174 None ssh-rsa 22key4plc22 user174-key1 +175 None ssh-rsa 22key4plc22 user175-key1 +176 None ssh-rsa 22key4plc22 user176-key1 +177 None ssh-rsa 22key4plc22 user177-key1 +178 None ssh-rsa 22key4plc22 user178-key1 +179 None ssh-rsa 22key4plc22 user179-key1 +180 None ssh-rsa 22key4plc22 user180-key1 +181 None ssh-rsa 22key4plc22 user181-key1 +182 None ssh-rsa 22key4plc22 user182-key1 +183 None ssh-rsa 22key4plc22 user183-key1 +184 None ssh-rsa 22key4plc22 user184-key1 +185 None ssh-rsa 22key4plc22 user185-key1 +186 None ssh-rsa 22key4plc22 user186-key1 +187 None ssh-rsa 22key4plc22 user187-key1 +188 None ssh-rsa 22key4plc22 user188-key1 +189 None ssh-rsa 22key4plc22 user189-key1 +190 None ssh-rsa 22key4plc22 user190-key1 +191 None ssh-rsa 22key4plc22 user191-key1 +192 None ssh-rsa 22key4plc22 user192-key1 +193 None ssh-rsa 22key4plc22 user193-key1 +194 None ssh-rsa 22key4plc22 user194-key1 +195 None ssh-rsa 22key4plc22 user195-key1 +196 None ssh-rsa 22key4plc22 user196-key1 +197 None ssh-rsa 22key4plc22 user197-key1 +198 None ssh-rsa 22key4plc22 user198-key1 +199 None ssh-rsa 22key4plc22 user199-key1 +200 None ssh-rsa 22key4plc22 user200-key1 +201 None ssh-rsa 22key4plc22 user201-key1 +202 None ssh-rsa 22key4plc22 user202-key1 +203 None ssh-rsa 22key4plc22 user203-key1 +204 None ssh-rsa 22key4plc22 user204-key1 +205 None ssh-rsa 22key4plc22 user205-key1 +206 None ssh-rsa 22key4plc22 user206-key1 +207 None ssh-rsa 22key4plc22 user207-key1 +208 None ssh-rsa 22key4plc22 user208-key1 +209 None ssh-rsa 22key4plc22 user209-key1 +210 None ssh-rsa 22key4plc22 user210-key1 +211 None ssh-rsa 22key4plc22 user211-key1 +212 None ssh-rsa 22key4plc22 user212-key1 +213 None ssh-rsa 22key4plc22 user213-key1 +214 None ssh-rsa 22key4plc22 user214-key1 +215 None ssh-rsa 22key4plc22 user215-key1 +216 None ssh-rsa 22key4plc22 user216-key1 +217 None ssh-rsa 22key4plc22 user217-key1 +218 None ssh-rsa 22key4plc22 user218-key1 +219 None ssh-rsa 22key4plc22 user219-key1 +220 None ssh-rsa 22key4plc22 user220-key1 +221 None ssh-rsa 22key4plc22 user221-key1 +222 None ssh-rsa 22key4plc22 user222-key1 +223 None ssh-rsa 22key4plc22 user223-key1 +224 None ssh-rsa 22key4plc22 user224-key1 +225 None ssh-rsa 22key4plc22 user225-key1 +226 None ssh-rsa 22key4plc22 user226-key1 +227 None ssh-rsa 22key4plc22 user227-key1 +228 None ssh-rsa 22key4plc22 user228-key1 +229 None ssh-rsa 22key4plc22 user229-key1 +230 None ssh-rsa 22key4plc22 user230-key1 +231 None ssh-rsa 22key4plc22 user231-key1 +232 None ssh-rsa 22key4plc22 user232-key1 +233 None ssh-rsa 22key4plc22 user233-key1 +234 None ssh-rsa 22key4plc22 user234-key1 +235 None ssh-rsa 22key4plc22 user235-key1 +236 None ssh-rsa 22key4plc22 user236-key1 +237 None ssh-rsa 22key4plc22 user237-key1 +238 None ssh-rsa 22key4plc22 user238-key1 +239 None ssh-rsa 22key4plc22 user239-key1 +240 None ssh-rsa 22key4plc22 user240-key1 +241 None ssh-rsa 22key4plc22 user241-key1 +242 None ssh-rsa 22key4plc22 user242-key1 +243 None ssh-rsa 22key4plc22 user243-key1 +244 None ssh-rsa 22key4plc22 user244-key1 +245 None ssh-rsa 22key4plc22 user245-key1 +246 None ssh-rsa 22key4plc22 user246-key1 +247 None ssh-rsa 22key4plc22 user247-key1 +248 None ssh-rsa 22key4plc22 user248-key1 +249 None ssh-rsa 22key4plc22 user249-key1 +250 None ssh-rsa 22key4plc22 user250-key1 +251 None ssh-rsa 22key4plc22 user251-key1 +252 None ssh-rsa 22key4plc22 user252-key1 +253 None ssh-rsa 22key4plc22 user253-key1 +254 None ssh-rsa 22key4plc22 user254-key1 +255 None ssh-rsa 22key4plc22 user255-key1 +256 None ssh-rsa 22key4plc22 user256-key1 +257 None ssh-rsa 22key4plc22 user257-key1 +258 None ssh-rsa 22key4plc22 user258-key1 +259 None ssh-rsa 22key4plc22 user259-key1 +260 None ssh-rsa 22key4plc22 user260-key1 +261 None ssh-rsa 22key4plc22 user261-key1 +262 None ssh-rsa 22key4plc22 user262-key1 +263 None ssh-rsa 22key4plc22 user263-key1 +264 None ssh-rsa 22key4plc22 user264-key1 +265 None ssh-rsa 22key4plc22 user265-key1 +266 None ssh-rsa 22key4plc22 user266-key1 +267 None ssh-rsa 22key4plc22 user267-key1 +268 None ssh-rsa 22key4plc22 user268-key1 +269 None ssh-rsa 22key4plc22 user269-key1 +270 None ssh-rsa 22key4plc22 user270-key1 +271 None ssh-rsa 22key4plc22 user271-key1 +272 None ssh-rsa 22key4plc22 user272-key1 +273 None ssh-rsa 22key4plc22 user273-key1 +274 None ssh-rsa 22key4plc22 user274-key1 +275 None ssh-rsa 22key4plc22 user275-key1 +276 None ssh-rsa 22key4plc22 user276-key1 +277 None ssh-rsa 22key4plc22 user277-key1 +278 None ssh-rsa 22key4plc22 user278-key1 +279 None ssh-rsa 22key4plc22 user279-key1 +280 None ssh-rsa 22key4plc22 user280-key1 +281 None ssh-rsa 22key4plc22 user281-key1 +282 None ssh-rsa 22key4plc22 user282-key1 +283 None ssh-rsa 22key4plc22 user283-key1 +284 None ssh-rsa 22key4plc22 user284-key1 +285 None ssh-rsa 22key4plc22 user285-key1 +286 None ssh-rsa 22key4plc22 user286-key1 +287 None ssh-rsa 22key4plc22 user287-key1 +288 None ssh-rsa 22key4plc22 user288-key1 +289 None ssh-rsa 22key4plc22 user289-key1 +290 None ssh-rsa 22key4plc22 user290-key1 +291 None ssh-rsa 22key4plc22 user291-key1 +292 None ssh-rsa 22key4plc22 user292-key1 +293 None ssh-rsa 22key4plc22 user293-key1 +294 None ssh-rsa 22key4plc22 user294-key1 +295 None ssh-rsa 22key4plc22 user295-key1 +296 None ssh-rsa 22key4plc22 user296-key1 +297 None ssh-rsa 22key4plc22 user297-key1 +298 None ssh-rsa 22key4plc22 user298-key1 +299 None ssh-rsa 22key4plc22 user299-key1 +300 None ssh-rsa 22key4plc22 user300-key1 +301 None ssh-rsa 22key4plc22 user301-key1 +302 None ssh-rsa 22key4plc22 user302-key1 +303 None ssh-rsa 22key4plc22 user303-key1 +304 None ssh-rsa 22key4plc22 user304-key1 +305 None ssh-rsa 22key4plc22 user305-key1 +306 None ssh-rsa 22key4plc22 user306-key1 +307 None ssh-rsa 22key4plc22 user307-key1 +308 None ssh-rsa 22key4plc22 user308-key1 +309 None ssh-rsa 22key4plc22 user309-key1 +310 None ssh-rsa 22key4plc22 user310-key1 +311 None ssh-rsa 22key4plc22 user311-key1 +312 None ssh-rsa 22key4plc22 user312-key1 +313 None ssh-rsa 22key4plc22 user313-key1 +314 None ssh-rsa 22key4plc22 user314-key1 +315 None ssh-rsa 22key4plc22 user315-key1 +316 None ssh-rsa 22key4plc22 user316-key1 +317 None ssh-rsa 22key4plc22 user317-key1 +318 None ssh-rsa 22key4plc22 user318-key1 +319 None ssh-rsa 22key4plc22 user319-key1 +320 None ssh-rsa 22key4plc22 user320-key1 +321 None ssh-rsa 22key4plc22 user321-key1 +322 None ssh-rsa 22key4plc22 user322-key1 +323 None ssh-rsa 22key4plc22 user323-key1 +324 None ssh-rsa 22key4plc22 user324-key1 +325 None ssh-rsa 22key4plc22 user325-key1 +326 None ssh-rsa 22key4plc22 user326-key1 +327 None ssh-rsa 22key4plc22 user327-key1 +328 None ssh-rsa 22key4plc22 user328-key1 +329 None ssh-rsa 22key4plc22 user329-key1 +330 None ssh-rsa 22key4plc22 user330-key1 +331 None ssh-rsa 22key4plc22 user331-key1 +332 None ssh-rsa 22key4plc22 user332-key1 +333 None ssh-rsa 22key4plc22 user333-key1 +334 None ssh-rsa 22key4plc22 user334-key1 +335 None ssh-rsa 22key4plc22 user335-key1 +336 None ssh-rsa 22key4plc22 user336-key1 +337 None ssh-rsa 22key4plc22 user337-key1 +338 None ssh-rsa 22key4plc22 user338-key1 +339 None ssh-rsa 22key4plc22 user339-key1 +340 None ssh-rsa 22key4plc22 user340-key1 +341 None ssh-rsa 22key4plc22 user341-key1 +342 None ssh-rsa 22key4plc22 user342-key1 +343 None ssh-rsa 22key4plc22 user343-key1 +344 None ssh-rsa 22key4plc22 user344-key1 +345 None ssh-rsa 22key4plc22 user345-key1 +346 None ssh-rsa 22key4plc22 user346-key1 +347 None ssh-rsa 22key4plc22 user347-key1 +348 None ssh-rsa 22key4plc22 user348-key1 +349 None ssh-rsa 22key4plc22 user349-key1 +350 None ssh-rsa 22key4plc22 user350-key1 +351 None ssh-rsa 22key4plc22 user351-key1 +352 None ssh-rsa 22key4plc22 user352-key1 +353 None ssh-rsa 22key4plc22 user353-key1 +354 None ssh-rsa 22key4plc22 user354-key1 +355 None ssh-rsa 22key4plc22 user355-key1 +356 None ssh-rsa 22key4plc22 user356-key1 +357 None ssh-rsa 22key4plc22 user357-key1 +358 None ssh-rsa 22key4plc22 user358-key1 +359 None ssh-rsa 22key4plc22 user359-key1 +360 None ssh-rsa 22key4plc22 user360-key1 +361 None ssh-rsa 22key4plc22 user361-key1 +362 None ssh-rsa 22key4plc22 user362-key1 +363 None ssh-rsa 22key4plc22 user363-key1 +364 None ssh-rsa 22key4plc22 user364-key1 +365 None ssh-rsa 22key4plc22 user365-key1 +366 None ssh-rsa 22key4plc22 user366-key1 +367 None ssh-rsa 22key4plc22 user367-key1 +368 None ssh-rsa 22key4plc22 user368-key1 +369 None ssh-rsa 22key4plc22 user369-key1 +370 None ssh-rsa 22key4plc22 user370-key1 +371 None ssh-rsa 22key4plc22 user371-key1 +372 None ssh-rsa 22key4plc22 user372-key1 +373 None ssh-rsa 22key4plc22 user373-key1 +374 None ssh-rsa 22key4plc22 user374-key1 +375 None ssh-rsa 22key4plc22 user375-key1 +376 None ssh-rsa 22key4plc22 user376-key1 +377 None ssh-rsa 22key4plc22 user377-key1 +378 None ssh-rsa 22key4plc22 user378-key1 +379 None ssh-rsa 22key4plc22 user379-key1 +380 None ssh-rsa 22key4plc22 user380-key1 +381 None ssh-rsa 22key4plc22 user381-key1 +382 None ssh-rsa 22key4plc22 user382-key1 +383 None ssh-rsa 22key4plc22 user383-key1 +384 None ssh-rsa 22key4plc22 user384-key1 +385 None ssh-rsa 22key4plc22 user385-key1 +386 None ssh-rsa 22key4plc22 user386-key1 +387 None ssh-rsa 22key4plc22 user387-key1 +388 None ssh-rsa 22key4plc22 user388-key1 +389 None ssh-rsa 22key4plc22 user389-key1 +390 None ssh-rsa 22key4plc22 user390-key1 +391 None ssh-rsa 22key4plc22 user391-key1 +392 None ssh-rsa 22key4plc22 user392-key1 +393 None ssh-rsa 22key4plc22 user393-key1 +394 None ssh-rsa 22key4plc22 user394-key1 +395 None ssh-rsa 22key4plc22 user395-key1 +396 None ssh-rsa 22key4plc22 user396-key1 +397 None ssh-rsa 22key4plc22 user397-key1 +398 None ssh-rsa 22key4plc22 user398-key1 +399 None ssh-rsa 22key4plc22 user399-key1 +400 None ssh-rsa 22key4plc22 user400-key1 +401 None ssh-rsa 22key4plc22 user401-key1 +402 None ssh-rsa 22key4plc22 user402-key1 +403 None ssh-rsa 22key4plc22 user403-key1 +404 None ssh-rsa 22key4plc22 user404-key1 +405 None ssh-rsa 22key4plc22 user405-key1 +406 None ssh-rsa 22key4plc22 user406-key1 +407 None ssh-rsa 22key4plc22 user407-key1 +408 None ssh-rsa 22key4plc22 user408-key1 +409 None ssh-rsa 22key4plc22 user409-key1 +410 None ssh-rsa 22key4plc22 user410-key1 +411 None ssh-rsa 22key4plc22 user411-key1 +412 None ssh-rsa 22key4plc22 user412-key1 +413 None ssh-rsa 22key4plc22 user413-key1 +414 None ssh-rsa 22key4plc22 user414-key1 +415 None ssh-rsa 22key4plc22 user415-key1 +416 None ssh-rsa 22key4plc22 user416-key1 +417 None ssh-rsa 22key4plc22 user417-key1 +418 None ssh-rsa 22key4plc22 user418-key1 +419 None ssh-rsa 22key4plc22 user419-key1 +420 None ssh-rsa 22key4plc22 user420-key1 +421 None ssh-rsa 22key4plc22 user421-key1 +422 None ssh-rsa 22key4plc22 user422-key1 +423 None ssh-rsa 22key4plc22 user423-key1 +424 None ssh-rsa 22key4plc22 user424-key1 +425 None ssh-rsa 22key4plc22 user425-key1 +426 None ssh-rsa 22key4plc22 user426-key1 +427 None ssh-rsa 22key4plc22 user427-key1 +428 None ssh-rsa 22key4plc22 user428-key1 +429 None ssh-rsa 22key4plc22 user429-key1 +430 None ssh-rsa 22key4plc22 user430-key1 +431 None ssh-rsa 22key4plc22 user431-key1 +432 None ssh-rsa 22key4plc22 user432-key1 +433 None ssh-rsa 22key4plc22 user433-key1 +434 None ssh-rsa 22key4plc22 user434-key1 +435 None ssh-rsa 22key4plc22 user435-key1 +436 None ssh-rsa 22key4plc22 user436-key1 +437 None ssh-rsa 22key4plc22 user437-key1 +438 None ssh-rsa 22key4plc22 user438-key1 +439 None ssh-rsa 22key4plc22 user439-key1 +440 None ssh-rsa 22key4plc22 user440-key1 +441 None ssh-rsa 22key4plc22 user441-key1 +442 None ssh-rsa 22key4plc22 user442-key1 +443 None ssh-rsa 22key4plc22 user443-key1 +444 None ssh-rsa 22key4plc22 user444-key1 +445 None ssh-rsa 22key4plc22 user445-key1 +446 None ssh-rsa 22key4plc22 user446-key1 +447 None ssh-rsa 22key4plc22 user447-key1 +448 None ssh-rsa 22key4plc22 user448-key1 +449 None ssh-rsa 22key4plc22 user449-key1 +450 None ssh-rsa 22key4plc22 user450-key1 +451 None ssh-rsa 22key4plc22 user451-key1 +452 None ssh-rsa 22key4plc22 user452-key1 +453 None ssh-rsa 22key4plc22 user453-key1 +454 None ssh-rsa 22key4plc22 user454-key1 +455 None ssh-rsa 22key4plc22 user455-key1 +456 None ssh-rsa 22key4plc22 user456-key1 +457 None ssh-rsa 22key4plc22 user457-key1 +458 None ssh-rsa 22key4plc22 user458-key1 +459 None ssh-rsa 22key4plc22 user459-key1 +460 None ssh-rsa 22key4plc22 user460-key1 +461 None ssh-rsa 22key4plc22 user461-key1 +462 None ssh-rsa 22key4plc22 user462-key1 +463 None ssh-rsa 22key4plc22 user463-key1 +464 None ssh-rsa 22key4plc22 user464-key1 +465 None ssh-rsa 22key4plc22 user465-key1 +466 None ssh-rsa 22key4plc22 user466-key1 +467 None ssh-rsa 22key4plc22 user467-key1 +468 None ssh-rsa 22key4plc22 user468-key1 +469 None ssh-rsa 22key4plc22 user469-key1 +470 None ssh-rsa 22key4plc22 user470-key1 +471 None ssh-rsa 22key4plc22 user471-key1 +472 None ssh-rsa 22key4plc22 user472-key1 +473 None ssh-rsa 22key4plc22 user473-key1 +474 None ssh-rsa 22key4plc22 user474-key1 +475 None ssh-rsa 22key4plc22 user475-key1 +476 None ssh-rsa 22key4plc22 user476-key1 +477 None ssh-rsa 22key4plc22 user477-key1 +478 None ssh-rsa 22key4plc22 user478-key1 +479 None ssh-rsa 22key4plc22 user479-key1 +480 None ssh-rsa 22key4plc22 user480-key1 +481 None ssh-rsa 22key4plc22 user481-key1 +482 None ssh-rsa 22key4plc22 user482-key1 +483 None ssh-rsa 22key4plc22 user483-key1 +484 None ssh-rsa 22key4plc22 user484-key1 +485 None ssh-rsa 22key4plc22 user485-key1 +486 None ssh-rsa 22key4plc22 user486-key1 +487 None ssh-rsa 22key4plc22 user487-key1 +488 None ssh-rsa 22key4plc22 user488-key1 +489 None ssh-rsa 22key4plc22 user489-key1 +490 None ssh-rsa 22key4plc22 user490-key1 +491 None ssh-rsa 22key4plc22 user491-key1 +492 None ssh-rsa 22key4plc22 user492-key1 +493 None ssh-rsa 22key4plc22 user493-key1 +494 None ssh-rsa 22key4plc22 user494-key1 +495 None ssh-rsa 22key4plc22 user495-key1 +496 None ssh-rsa 22key4plc22 user496-key1 +497 None ssh-rsa 22key4plc22 user497-key1 +498 None ssh-rsa 22key4plc22 user498-key1 +499 None ssh-rsa 22key4plc22 user499-key1 +500 None ssh-rsa 22key4plc22 user500-key1 +501 None ssh-rsa 22key4plc22 user501-key1 +502 None ssh-rsa 22key4plc22 user502-key1 +503 None ssh-rsa 22key4plc22 user503-key1 +504 None ssh-rsa 22key4plc22 user504-key1 +505 None ssh-rsa 22key4plc22 user505-key1 +506 None ssh-rsa 22key4plc22 user506-key1 +507 None ssh-rsa 22key4plc22 user507-key1 +508 None ssh-rsa 22key4plc22 user508-key1 +509 None ssh-rsa 22key4plc22 user509-key1 +510 None ssh-rsa 22key4plc22 user510-key1 +511 None ssh-rsa 22key4plc22 user511-key1 +512 None ssh-rsa 22key4plc22 user512-key1 +513 None ssh-rsa 22key4plc22 user513-key1 +514 None ssh-rsa 22key4plc22 user514-key1 +515 None ssh-rsa 22key4plc22 user515-key1 +516 None ssh-rsa 22key4plc22 user516-key1 +517 None ssh-rsa 22key4plc22 user517-key1 +518 None ssh-rsa 22key4plc22 user518-key1 +519 None ssh-rsa 22key4plc22 user519-key1 +520 None ssh-rsa 22key4plc22 user520-key1 +521 None ssh-rsa 22key4plc22 user521-key1 +522 None ssh-rsa 22key4plc22 user522-key1 +523 None ssh-rsa 22key4plc22 user523-key1 +524 None ssh-rsa 22key4plc22 user524-key1 +525 None ssh-rsa 22key4plc22 user525-key1 +526 None ssh-rsa 22key4plc22 user526-key1 +527 None ssh-rsa 22key4plc22 user527-key1 +528 None ssh-rsa 22key4plc22 user528-key1 +529 None ssh-rsa 22key4plc22 user529-key1 +530 None ssh-rsa 22key4plc22 user530-key1 +531 None ssh-rsa 22key4plc22 user531-key1 +532 None ssh-rsa 22key4plc22 user532-key1 +533 None ssh-rsa 22key4plc22 user533-key1 +534 None ssh-rsa 22key4plc22 user534-key1 +535 None ssh-rsa 22key4plc22 user535-key1 +536 None ssh-rsa 22key4plc22 user536-key1 +537 None ssh-rsa 22key4plc22 user537-key1 +538 None ssh-rsa 22key4plc22 user538-key1 +539 None ssh-rsa 22key4plc22 user539-key1 +540 None ssh-rsa 22key4plc22 user540-key1 +541 None ssh-rsa 22key4plc22 user541-key1 +542 None ssh-rsa 22key4plc22 user542-key1 +543 None ssh-rsa 22key4plc22 user543-key1 +544 None ssh-rsa 22key4plc22 user544-key1 +545 None ssh-rsa 22key4plc22 user545-key1 +546 None ssh-rsa 22key4plc22 user546-key1 +547 None ssh-rsa 22key4plc22 user547-key1 +548 None ssh-rsa 22key4plc22 user548-key1 +549 None ssh-rsa 22key4plc22 user549-key1 +550 None ssh-rsa 22key4plc22 user550-key1 +551 None ssh-rsa 22key4plc22 user551-key1 +552 None ssh-rsa 22key4plc22 user552-key1 +553 None ssh-rsa 22key4plc22 user553-key1 +554 None ssh-rsa 22key4plc22 user554-key1 +555 None ssh-rsa 22key4plc22 user555-key1 +556 None ssh-rsa 22key4plc22 user556-key1 +557 None ssh-rsa 22key4plc22 user557-key1 +558 None ssh-rsa 22key4plc22 user558-key1 +559 None ssh-rsa 22key4plc22 user559-key1 +560 None ssh-rsa 22key4plc22 user560-key1 +561 None ssh-rsa 22key4plc22 user561-key1 +562 None ssh-rsa 22key4plc22 user562-key1 +563 None ssh-rsa 22key4plc22 user563-key1 +564 None ssh-rsa 22key4plc22 user564-key1 +565 None ssh-rsa 22key4plc22 user565-key1 +566 None ssh-rsa 22key4plc22 user566-key1 +567 None ssh-rsa 22key4plc22 user567-key1 +568 None ssh-rsa 22key4plc22 user568-key1 +569 None ssh-rsa 22key4plc22 user569-key1 +570 None ssh-rsa 22key4plc22 user570-key1 +571 None ssh-rsa 22key4plc22 user571-key1 +572 None ssh-rsa 22key4plc22 user572-key1 +573 None ssh-rsa 22key4plc22 user573-key1 +574 None ssh-rsa 22key4plc22 user574-key1 +575 None ssh-rsa 22key4plc22 user575-key1 +576 None ssh-rsa 22key4plc22 user576-key1 +577 None ssh-rsa 22key4plc22 user577-key1 +578 None ssh-rsa 22key4plc22 user578-key1 +579 None ssh-rsa 22key4plc22 user579-key1 +580 None ssh-rsa 22key4plc22 user580-key1 +581 None ssh-rsa 22key4plc22 user581-key1 +582 None ssh-rsa 22key4plc22 user582-key1 +583 None ssh-rsa 22key4plc22 user583-key1 +584 None ssh-rsa 22key4plc22 user584-key1 +585 None ssh-rsa 22key4plc22 user585-key1 +586 None ssh-rsa 22key4plc22 user586-key1 +587 None ssh-rsa 22key4plc22 user587-key1 +588 None ssh-rsa 22key4plc22 user588-key1 +589 None ssh-rsa 22key4plc22 user589-key1 +590 None ssh-rsa 22key4plc22 user590-key1 +591 None ssh-rsa 22key4plc22 user591-key1 +592 None ssh-rsa 22key4plc22 user592-key1 +593 None ssh-rsa 22key4plc22 user593-key1 +594 None ssh-rsa 22key4plc22 user594-key1 +595 None ssh-rsa 22key4plc22 user595-key1 +596 None ssh-rsa 22key4plc22 user596-key1 +597 None ssh-rsa 22key4plc22 user597-key1 +598 None ssh-rsa 22key4plc22 user598-key1 +599 None ssh-rsa 22key4plc22 user599-key1 +600 None ssh-rsa 22key4plc22 user600-key1 +601 None ssh-rsa 22key4plc22 user601-key1 +602 None ssh-rsa 22key4plc22 user602-key1 +603 None ssh-rsa 22key4plc22 user603-key1 +604 None ssh-rsa 22key4plc22 user604-key1 +605 None ssh-rsa 22key4plc22 user605-key1 +606 None ssh-rsa 22key4plc22 user606-key1 +607 None ssh-rsa 22key4plc22 user607-key1 +608 None ssh-rsa 22key4plc22 user608-key1 +609 None ssh-rsa 22key4plc22 user609-key1 +610 None ssh-rsa 22key4plc22 user610-key1 +611 None ssh-rsa 22key4plc22 user611-key1 +612 None ssh-rsa 22key4plc22 user612-key1 +613 None ssh-rsa 22key4plc22 user613-key1 +614 None ssh-rsa 22key4plc22 user614-key1 +615 None ssh-rsa 22key4plc22 user615-key1 +616 None ssh-rsa 22key4plc22 user616-key1 +617 None ssh-rsa 22key4plc22 user617-key1 +618 None ssh-rsa 22key4plc22 user618-key1 +619 None ssh-rsa 22key4plc22 user619-key1 +620 None ssh-rsa 22key4plc22 user620-key1 +621 None ssh-rsa 22key4plc22 user621-key1 +622 None ssh-rsa 22key4plc22 user622-key1 +623 None ssh-rsa 22key4plc22 user623-key1 +624 None ssh-rsa 22key4plc22 user624-key1 +625 None ssh-rsa 22key4plc22 user625-key1 +626 None ssh-rsa 22key4plc22 user626-key1 +627 None ssh-rsa 22key4plc22 user627-key1 +628 None ssh-rsa 22key4plc22 user628-key1 +629 None ssh-rsa 22key4plc22 user629-key1 +630 None ssh-rsa 22key4plc22 user630-key1 +631 None ssh-rsa 22key4plc22 user631-key1 +632 None ssh-rsa 22key4plc22 user632-key1 +633 None ssh-rsa 22key4plc22 user633-key1 +634 None ssh-rsa 22key4plc22 user634-key1 +635 None ssh-rsa 22key4plc22 user635-key1 +636 None ssh-rsa 22key4plc22 user636-key1 +637 None ssh-rsa 22key4plc22 user637-key1 +638 None ssh-rsa 22key4plc22 user638-key1 +639 None ssh-rsa 22key4plc22 user639-key1 +640 None ssh-rsa 22key4plc22 user640-key1 +641 None ssh-rsa 22key4plc22 user641-key1 +642 None ssh-rsa 22key4plc22 user642-key1 +643 None ssh-rsa 22key4plc22 user643-key1 +644 None ssh-rsa 22key4plc22 user644-key1 +645 None ssh-rsa 22key4plc22 user645-key1 +646 None ssh-rsa 22key4plc22 user646-key1 +647 None ssh-rsa 22key4plc22 user647-key1 +648 None ssh-rsa 22key4plc22 user648-key1 +649 None ssh-rsa 22key4plc22 user649-key1 +650 None ssh-rsa 22key4plc22 user650-key1 +651 None ssh-rsa 22key4plc22 user651-key1 +652 None ssh-rsa 22key4plc22 user652-key1 +653 None ssh-rsa 22key4plc22 user653-key1 +654 None ssh-rsa 22key4plc22 user654-key1 +655 None ssh-rsa 22key4plc22 user655-key1 +656 None ssh-rsa 22key4plc22 user656-key1 +657 None ssh-rsa 22key4plc22 user657-key1 +658 None ssh-rsa 22key4plc22 user658-key1 +659 None ssh-rsa 22key4plc22 user659-key1 +660 None ssh-rsa 22key4plc22 user660-key1 +661 None ssh-rsa 22key4plc22 user661-key1 +662 None ssh-rsa 22key4plc22 user662-key1 +663 None ssh-rsa 22key4plc22 user663-key1 +664 None ssh-rsa 22key4plc22 user664-key1 +665 None ssh-rsa 22key4plc22 user665-key1 +666 None ssh-rsa 22key4plc22 user666-key1 +667 None ssh-rsa 22key4plc22 user667-key1 +668 None ssh-rsa 22key4plc22 user668-key1 +669 None ssh-rsa 22key4plc22 user669-key1 +670 None ssh-rsa 22key4plc22 user670-key1 +671 None ssh-rsa 22key4plc22 user671-key1 +672 None ssh-rsa 22key4plc22 user672-key1 +673 None ssh-rsa 22key4plc22 user673-key1 +674 None ssh-rsa 22key4plc22 user674-key1 +675 None ssh-rsa 22key4plc22 user675-key1 +676 None ssh-rsa 22key4plc22 user676-key1 +677 None ssh-rsa 22key4plc22 user677-key1 +678 None ssh-rsa 22key4plc22 user678-key1 +679 None ssh-rsa 22key4plc22 user679-key1 +680 None ssh-rsa 22key4plc22 user680-key1 +681 None ssh-rsa 22key4plc22 user681-key1 +682 None ssh-rsa 22key4plc22 user682-key1 +683 None ssh-rsa 22key4plc22 user683-key1 +684 None ssh-rsa 22key4plc22 user684-key1 +685 None ssh-rsa 22key4plc22 user685-key1 +686 None ssh-rsa 22key4plc22 user686-key1 +687 None ssh-rsa 22key4plc22 user687-key1 +688 None ssh-rsa 22key4plc22 user688-key1 +689 None ssh-rsa 22key4plc22 user689-key1 +690 None ssh-rsa 22key4plc22 user690-key1 +691 None ssh-rsa 22key4plc22 user691-key1 +692 None ssh-rsa 22key4plc22 user692-key1 +693 None ssh-rsa 22key4plc22 user693-key1 +694 None ssh-rsa 22key4plc22 user694-key1 +695 None ssh-rsa 22key4plc22 user695-key1 +696 None ssh-rsa 22key4plc22 user696-key1 +697 None ssh-rsa 22key4plc22 user697-key1 +698 None ssh-rsa 22key4plc22 user698-key1 +699 None ssh-rsa 22key4plc22 user699-key1 +700 None ssh-rsa 22key4plc22 user700-key1 +701 None ssh-rsa 22key4plc22 user701-key1 +702 None ssh-rsa 22key4plc22 user702-key1 +703 None ssh-rsa 22key4plc22 user703-key1 +704 None ssh-rsa 22key4plc22 user704-key1 +705 None ssh-rsa 22key4plc22 user705-key1 +706 None ssh-rsa 22key4plc22 user706-key1 +707 None ssh-rsa 22key4plc22 user707-key1 +708 None ssh-rsa 22key4plc22 user708-key1 +709 None ssh-rsa 22key4plc22 user709-key1 +710 None ssh-rsa 22key4plc22 user710-key1 +711 None ssh-rsa 22key4plc22 user711-key1 +712 None ssh-rsa 22key4plc22 user712-key1 +713 None ssh-rsa 22key4plc22 user713-key1 +714 None ssh-rsa 22key4plc22 user714-key1 +715 None ssh-rsa 22key4plc22 user715-key1 +716 None ssh-rsa 22key4plc22 user716-key1 +717 None ssh-rsa 22key4plc22 user717-key1 +718 None ssh-rsa 22key4plc22 user718-key1 +719 None ssh-rsa 22key4plc22 user719-key1 +720 None ssh-rsa 22key4plc22 user720-key1 +721 None ssh-rsa 22key4plc22 user721-key1 +722 None ssh-rsa 22key4plc22 user722-key1 +723 None ssh-rsa 22key4plc22 user723-key1 +724 None ssh-rsa 22key4plc22 user724-key1 +725 None ssh-rsa 22key4plc22 user725-key1 +726 None ssh-rsa 22key4plc22 user726-key1 +727 None ssh-rsa 22key4plc22 user727-key1 +728 None ssh-rsa 22key4plc22 user728-key1 +729 None ssh-rsa 22key4plc22 user729-key1 +730 None ssh-rsa 22key4plc22 user730-key1 +731 None ssh-rsa 22key4plc22 user731-key1 +732 None ssh-rsa 22key4plc22 user732-key1 +733 None ssh-rsa 22key4plc22 user733-key1 +734 None ssh-rsa 22key4plc22 user734-key1 +735 None ssh-rsa 22key4plc22 user735-key1 +736 None ssh-rsa 22key4plc22 user736-key1 +737 None ssh-rsa 22key4plc22 user737-key1 +738 None ssh-rsa 22key4plc22 user738-key1 +739 None ssh-rsa 22key4plc22 user739-key1 +740 None ssh-rsa 22key4plc22 user740-key1 +741 None ssh-rsa 22key4plc22 user741-key1 +742 None ssh-rsa 22key4plc22 user742-key1 +743 None ssh-rsa 22key4plc22 user743-key1 +744 None ssh-rsa 22key4plc22 user744-key1 +745 None ssh-rsa 22key4plc22 user745-key1 +746 None ssh-rsa 22key4plc22 user746-key1 +747 None ssh-rsa 22key4plc22 user747-key1 +748 None ssh-rsa 22key4plc22 user748-key1 +749 None ssh-rsa 22key4plc22 user749-key1 +750 None ssh-rsa 22key4plc22 user750-key1 +751 None ssh-rsa 22key4plc22 user751-key1 +752 None ssh-rsa 22key4plc22 user752-key1 +753 None ssh-rsa 22key4plc22 user753-key1 +754 None ssh-rsa 22key4plc22 user754-key1 +755 None ssh-rsa 22key4plc22 user755-key1 +756 None ssh-rsa 22key4plc22 user756-key1 +757 None ssh-rsa 22key4plc22 user757-key1 +758 None ssh-rsa 22key4plc22 user758-key1 +759 None ssh-rsa 22key4plc22 user759-key1 +760 None ssh-rsa 22key4plc22 user760-key1 +761 None ssh-rsa 22key4plc22 user761-key1 +762 None ssh-rsa 22key4plc22 user762-key1 +763 None ssh-rsa 22key4plc22 user763-key1 +764 None ssh-rsa 22key4plc22 user764-key1 +765 None ssh-rsa 22key4plc22 user765-key1 +766 None ssh-rsa 22key4plc22 user766-key1 +767 None ssh-rsa 22key4plc22 user767-key1 +768 None ssh-rsa 22key4plc22 user768-key1 +769 None ssh-rsa 22key4plc22 user769-key1 +770 None ssh-rsa 22key4plc22 user770-key1 +771 None ssh-rsa 22key4plc22 user771-key1 +772 None ssh-rsa 22key4plc22 user772-key1 +773 None ssh-rsa 22key4plc22 user773-key1 +774 None ssh-rsa 22key4plc22 user774-key1 +775 None ssh-rsa 22key4plc22 user775-key1 +776 None ssh-rsa 22key4plc22 user776-key1 +777 None ssh-rsa 22key4plc22 user777-key1 +778 None ssh-rsa 22key4plc22 user778-key1 +779 None ssh-rsa 22key4plc22 user779-key1 +780 None ssh-rsa 22key4plc22 user780-key1 +781 None ssh-rsa 22key4plc22 user781-key1 +782 None ssh-rsa 22key4plc22 user782-key1 +783 None ssh-rsa 22key4plc22 user783-key1 +784 None ssh-rsa 22key4plc22 user784-key1 +785 None ssh-rsa 22key4plc22 user785-key1 +786 None ssh-rsa 22key4plc22 user786-key1 +787 None ssh-rsa 22key4plc22 user787-key1 +788 None ssh-rsa 22key4plc22 user788-key1 +789 None ssh-rsa 22key4plc22 user789-key1 +790 None ssh-rsa 22key4plc22 user790-key1 +791 None ssh-rsa 22key4plc22 user791-key1 +792 None ssh-rsa 22key4plc22 user792-key1 +793 None ssh-rsa 22key4plc22 user793-key1 +794 None ssh-rsa 22key4plc22 user794-key1 +795 None ssh-rsa 22key4plc22 user795-key1 +796 None ssh-rsa 22key4plc22 user796-key1 +797 None ssh-rsa 22key4plc22 user797-key1 +798 None ssh-rsa 22key4plc22 user798-key1 +799 None ssh-rsa 22key4plc22 user799-key1 +800 None ssh-rsa 22key4plc22 user800-key1 +801 None ssh-rsa 22key4plc22 user801-key1 +802 None ssh-rsa 22key4plc22 user802-key1 +803 None ssh-rsa 22key4plc22 user803-key1 +804 None ssh-rsa 22key4plc22 user804-key1 +805 None ssh-rsa 22key4plc22 user805-key1 +806 None ssh-rsa 22key4plc22 user806-key1 +807 None ssh-rsa 22key4plc22 user807-key1 +808 None ssh-rsa 22key4plc22 user808-key1 +809 None ssh-rsa 22key4plc22 user809-key1 +810 None ssh-rsa 22key4plc22 user810-key1 +811 None ssh-rsa 22key4plc22 user811-key1 +812 None ssh-rsa 22key4plc22 user812-key1 +813 None ssh-rsa 22key4plc22 user813-key1 +814 None ssh-rsa 22key4plc22 user814-key1 +815 None ssh-rsa 22key4plc22 user815-key1 +816 None ssh-rsa 22key4plc22 user816-key1 +817 None ssh-rsa 22key4plc22 user817-key1 +818 None ssh-rsa 22key4plc22 user818-key1 +819 None ssh-rsa 22key4plc22 user819-key1 +820 None ssh-rsa 22key4plc22 user820-key1 +821 None ssh-rsa 22key4plc22 user821-key1 +822 None ssh-rsa 22key4plc22 user822-key1 +823 None ssh-rsa 22key4plc22 user823-key1 +824 None ssh-rsa 22key4plc22 user824-key1 +825 None ssh-rsa 22key4plc22 user825-key1 +826 None ssh-rsa 22key4plc22 user826-key1 +827 None ssh-rsa 22key4plc22 user827-key1 +828 None ssh-rsa 22key4plc22 user828-key1 +829 None ssh-rsa 22key4plc22 user829-key1 +830 None ssh-rsa 22key4plc22 user830-key1 +831 None ssh-rsa 22key4plc22 user831-key1 +832 None ssh-rsa 22key4plc22 user832-key1 +833 None ssh-rsa 22key4plc22 user833-key1 +834 None ssh-rsa 22key4plc22 user834-key1 +835 None ssh-rsa 22key4plc22 user835-key1 +836 None ssh-rsa 22key4plc22 user836-key1 +837 None ssh-rsa 22key4plc22 user837-key1 +838 None ssh-rsa 22key4plc22 user838-key1 +839 None ssh-rsa 22key4plc22 user839-key1 +840 None ssh-rsa 22key4plc22 user840-key1 +841 None ssh-rsa 22key4plc22 user841-key1 +842 None ssh-rsa 22key4plc22 user842-key1 +843 None ssh-rsa 22key4plc22 user843-key1 +844 None ssh-rsa 22key4plc22 user844-key1 +845 None ssh-rsa 22key4plc22 user845-key1 +846 None ssh-rsa 22key4plc22 user846-key1 +847 None ssh-rsa 22key4plc22 user847-key1 +848 None ssh-rsa 22key4plc22 user848-key1 +849 None ssh-rsa 22key4plc22 user849-key1 +850 None ssh-rsa 22key4plc22 user850-key1 +851 None ssh-rsa 22key4plc22 user851-key1 +852 None ssh-rsa 22key4plc22 user852-key1 +853 None ssh-rsa 22key4plc22 user853-key1 +854 None ssh-rsa 22key4plc22 user854-key1 +855 None ssh-rsa 22key4plc22 user855-key1 +856 None ssh-rsa 22key4plc22 user856-key1 +857 None ssh-rsa 22key4plc22 user857-key1 +858 None ssh-rsa 22key4plc22 user858-key1 +859 None ssh-rsa 22key4plc22 user859-key1 +860 None ssh-rsa 22key4plc22 user860-key1 +861 None ssh-rsa 22key4plc22 user861-key1 +862 None ssh-rsa 22key4plc22 user862-key1 +863 None ssh-rsa 22key4plc22 user863-key1 +864 None ssh-rsa 22key4plc22 user864-key1 +865 None ssh-rsa 22key4plc22 user865-key1 +866 None ssh-rsa 22key4plc22 user866-key1 +867 None ssh-rsa 22key4plc22 user867-key1 +868 None ssh-rsa 22key4plc22 user868-key1 +869 None ssh-rsa 22key4plc22 user869-key1 +870 None ssh-rsa 22key4plc22 user870-key1 +871 None ssh-rsa 22key4plc22 user871-key1 +872 None ssh-rsa 22key4plc22 user872-key1 +873 None ssh-rsa 22key4plc22 user873-key1 +874 None ssh-rsa 22key4plc22 user874-key1 +875 None ssh-rsa 22key4plc22 user875-key1 +876 None ssh-rsa 22key4plc22 user876-key1 +877 None ssh-rsa 22key4plc22 user877-key1 +878 None ssh-rsa 22key4plc22 user878-key1 +879 None ssh-rsa 22key4plc22 user879-key1 +880 None ssh-rsa 22key4plc22 user880-key1 +881 None ssh-rsa 22key4plc22 user881-key1 +882 None ssh-rsa 22key4plc22 user882-key1 +883 None ssh-rsa 22key4plc22 user883-key1 +884 None ssh-rsa 22key4plc22 user884-key1 +885 None ssh-rsa 22key4plc22 user885-key1 +886 None ssh-rsa 22key4plc22 user886-key1 +887 None ssh-rsa 22key4plc22 user887-key1 +888 None ssh-rsa 22key4plc22 user888-key1 +889 None ssh-rsa 22key4plc22 user889-key1 +890 None ssh-rsa 22key4plc22 user890-key1 +891 None ssh-rsa 22key4plc22 user891-key1 +892 None ssh-rsa 22key4plc22 user892-key1 +893 None ssh-rsa 22key4plc22 user893-key1 +894 None ssh-rsa 22key4plc22 user894-key1 +895 None ssh-rsa 22key4plc22 user895-key1 +896 None ssh-rsa 22key4plc22 user896-key1 +897 None ssh-rsa 22key4plc22 user897-key1 +898 None ssh-rsa 22key4plc22 user898-key1 +899 None ssh-rsa 22key4plc22 user899-key1 +900 None ssh-rsa 22key4plc22 user900-key1 +901 None ssh-rsa 22key4plc22 user901-key1 +902 None ssh-rsa 22key4plc22 user902-key1 +903 None ssh-rsa 22key4plc22 user903-key1 +904 None ssh-rsa 22key4plc22 user904-key1 +905 None ssh-rsa 22key4plc22 user905-key1 +906 None ssh-rsa 22key4plc22 user906-key1 +907 None ssh-rsa 22key4plc22 user907-key1 +908 None ssh-rsa 22key4plc22 user908-key1 +909 None ssh-rsa 22key4plc22 user909-key1 +910 None ssh-rsa 22key4plc22 user910-key1 +911 None ssh-rsa 22key4plc22 user911-key1 +912 None ssh-rsa 22key4plc22 user912-key1 +913 None ssh-rsa 22key4plc22 user913-key1 +914 None ssh-rsa 22key4plc22 user914-key1 +915 None ssh-rsa 22key4plc22 user915-key1 +916 None ssh-rsa 22key4plc22 user916-key1 +917 None ssh-rsa 22key4plc22 user917-key1 +918 None ssh-rsa 22key4plc22 user918-key1 +919 None ssh-rsa 22key4plc22 user919-key1 +920 None ssh-rsa 22key4plc22 user920-key1 +921 None ssh-rsa 22key4plc22 user921-key1 +922 None ssh-rsa 22key4plc22 user922-key1 +923 None ssh-rsa 22key4plc22 user923-key1 +924 None ssh-rsa 22key4plc22 user924-key1 +925 None ssh-rsa 22key4plc22 user925-key1 +926 None ssh-rsa 22key4plc22 user926-key1 +927 None ssh-rsa 22key4plc22 user927-key1 +928 None ssh-rsa 22key4plc22 user928-key1 +929 None ssh-rsa 22key4plc22 user929-key1 +930 None ssh-rsa 22key4plc22 user930-key1 +931 None ssh-rsa 22key4plc22 user931-key1 +932 None ssh-rsa 22key4plc22 user932-key1 +933 None ssh-rsa 22key4plc22 user933-key1 +934 None ssh-rsa 22key4plc22 user934-key1 +935 None ssh-rsa 22key4plc22 user935-key1 +936 None ssh-rsa 22key4plc22 user936-key1 +937 None ssh-rsa 22key4plc22 user937-key1 +938 None ssh-rsa 22key4plc22 user938-key1 +939 None ssh-rsa 22key4plc22 user939-key1 +940 None ssh-rsa 22key4plc22 user940-key1 +941 None ssh-rsa 22key4plc22 user941-key1 +942 None ssh-rsa 22key4plc22 user942-key1 +943 None ssh-rsa 22key4plc22 user943-key1 +944 None ssh-rsa 22key4plc22 user944-key1 +945 None ssh-rsa 22key4plc22 user945-key1 +946 None ssh-rsa 22key4plc22 user946-key1 +947 None ssh-rsa 22key4plc22 user947-key1 +948 None ssh-rsa 22key4plc22 user948-key1 +949 None ssh-rsa 22key4plc22 user949-key1 +950 None ssh-rsa 22key4plc22 user950-key1 +951 None ssh-rsa 22key4plc22 user951-key1 +952 None ssh-rsa 22key4plc22 user952-key1 +953 None ssh-rsa 22key4plc22 user953-key1 +954 None ssh-rsa 22key4plc22 user954-key1 +955 None ssh-rsa 22key4plc22 user955-key1 +956 None ssh-rsa 22key4plc22 user956-key1 +957 None ssh-rsa 22key4plc22 user957-key1 +958 None ssh-rsa 22key4plc22 user958-key1 +959 None ssh-rsa 22key4plc22 user959-key1 +960 None ssh-rsa 22key4plc22 user960-key1 +961 None ssh-rsa 22key4plc22 user961-key1 +962 None ssh-rsa 22key4plc22 user962-key1 +963 None ssh-rsa 22key4plc22 user963-key1 +964 None ssh-rsa 22key4plc22 user964-key1 +965 None ssh-rsa 22key4plc22 user965-key1 +966 None ssh-rsa 22key4plc22 user966-key1 +967 None ssh-rsa 22key4plc22 user967-key1 +968 None ssh-rsa 22key4plc22 user968-key1 +969 None ssh-rsa 22key4plc22 user969-key1 +970 None ssh-rsa 22key4plc22 user970-key1 +971 None ssh-rsa 22key4plc22 user971-key1 +972 None ssh-rsa 22key4plc22 user972-key1 +973 None ssh-rsa 22key4plc22 user973-key1 +974 None ssh-rsa 22key4plc22 user974-key1 +975 None ssh-rsa 22key4plc22 user975-key1 +976 None ssh-rsa 22key4plc22 user976-key1 +977 None ssh-rsa 22key4plc22 user977-key1 +978 None ssh-rsa 22key4plc22 user978-key1 +979 None ssh-rsa 22key4plc22 user979-key1 +980 None ssh-rsa 22key4plc22 user980-key1 +981 None ssh-rsa 22key4plc22 user981-key1 +982 None ssh-rsa 22key4plc22 user982-key1 +983 None ssh-rsa 22key4plc22 user983-key1 +984 None ssh-rsa 22key4plc22 user984-key1 +985 None ssh-rsa 22key4plc22 user985-key1 +986 None ssh-rsa 22key4plc22 user986-key1 +987 None ssh-rsa 22key4plc22 user987-key1 +988 None ssh-rsa 22key4plc22 user988-key1 +989 None ssh-rsa 22key4plc22 user989-key1 +990 None ssh-rsa 22key4plc22 user990-key1 +991 None ssh-rsa 22key4plc22 user991-key1 +992 None ssh-rsa 22key4plc22 user992-key1 +993 None ssh-rsa 22key4plc22 user993-key1 +994 None ssh-rsa 22key4plc22 user994-key1 +995 None ssh-rsa 22key4plc22 user995-key1 +996 None ssh-rsa 22key4plc22 user996-key1 +997 None ssh-rsa 22key4plc22 user997-key1 +998 None ssh-rsa 22key4plc22 user998-key1 +999 None ssh-rsa 22key4plc22 user999-key1 +1000 None ssh-rsa 22key4plc22 user1000-key1 +1001 None ssh-rsa 22key4plc22 user1001-key1 +1002 None ssh-rsa 22key4plc22 user1002-key1 +1003 None ssh-rsa 22key4plc22 user1003-key1 +1004 None ssh-rsa 22key4plc22 user1004-key1 +1005 None ssh-rsa 22key4plc22 user1005-key1 +1006 None ssh-rsa 22key4plc22 user1006-key1 +1007 None ssh-rsa 22key4plc22 user1007-key1 +1008 None ssh-rsa 22key4plc22 user1008-key1 +1009 None ssh-rsa 22key4plc22 user1009-key1 +1010 None ssh-rsa 22key4plc22 user1010-key1 +1011 None ssh-rsa 22key4plc22 user1011-key1 +1012 None ssh-rsa 22key4plc22 user1012-key1 +1013 None ssh-rsa 22key4plc22 user1013-key1 +1014 None ssh-rsa 22key4plc22 user1014-key1 +1015 None ssh-rsa 22key4plc22 user1015-key1 +1016 None ssh-rsa 22key4plc22 user1016-key1 +1017 None ssh-rsa 22key4plc22 user1017-key1 +1018 None ssh-rsa 22key4plc22 user1018-key1 +1019 None ssh-rsa 22key4plc22 user1019-key1 +1020 None ssh-rsa 22key4plc22 user1020-key1 +1021 None ssh-rsa 22key4plc22 user1021-key1 +1022 None ssh-rsa 22key4plc22 user1022-key1 +1023 None ssh-rsa 22key4plc22 user1023-key1 +1024 None ssh-rsa 22key4plc22 user1024-key1 +1025 None ssh-rsa 22key4plc22 user1025-key1 +1026 None ssh-rsa 22key4plc22 user1026-key1 +1027 None ssh-rsa 22key4plc22 user1027-key1 +1028 None ssh-rsa 22key4plc22 user1028-key1 +1029 None ssh-rsa 22key4plc22 user1029-key1 +1030 None ssh-rsa 22key4plc22 user1030-key1 +1031 None ssh-rsa 22key4plc22 user1031-key1 +1032 None ssh-rsa 22key4plc22 user1032-key1 +1033 None ssh-rsa 22key4plc22 user1033-key1 +1034 None ssh-rsa 22key4plc22 user1034-key1 +1035 None ssh-rsa 22key4plc22 user1035-key1 +1036 None ssh-rsa 22key4plc22 user1036-key1 +1037 None ssh-rsa 22key4plc22 user1037-key1 +1038 None ssh-rsa 22key4plc22 user1038-key1 +1039 None ssh-rsa 22key4plc22 user1039-key1 +1040 None ssh-rsa 22key4plc22 user1040-key1 +1041 None ssh-rsa 22key4plc22 user1041-key1 +1042 None ssh-rsa 22key4plc22 user1042-key1 +1043 None ssh-rsa 22key4plc22 user1043-key1 +1044 None ssh-rsa 22key4plc22 user1044-key1 +1045 None ssh-rsa 22key4plc22 user1045-key1 +1046 None ssh-rsa 22key4plc22 user1046-key1 +1047 None ssh-rsa 22key4plc22 user1047-key1 +1048 None ssh-rsa 22key4plc22 user1048-key1 +1049 None ssh-rsa 22key4plc22 user1049-key1 +1050 None ssh-rsa 22key4plc22 user1050-key1 +1051 None ssh-rsa 22key4plc22 user1051-key1 +1052 None ssh-rsa 22key4plc22 user1052-key1 +1053 None ssh-rsa 22key4plc22 user1053-key1 +1054 None ssh-rsa 22key4plc22 user1054-key1 +1055 None ssh-rsa 22key4plc22 user1055-key1 +1056 None ssh-rsa 22key4plc22 user1056-key1 +1057 None ssh-rsa 22key4plc22 user1057-key1 +1058 None ssh-rsa 22key4plc22 user1058-key1 +1059 None ssh-rsa 22key4plc22 user1059-key1 +1060 None ssh-rsa 22key4plc22 user1060-key1 +1061 None ssh-rsa 22key4plc22 user1061-key1 +1062 None ssh-rsa 22key4plc22 user1062-key1 +1063 None ssh-rsa 22key4plc22 user1063-key1 +1064 None ssh-rsa 22key4plc22 user1064-key1 +1065 None ssh-rsa 22key4plc22 user1065-key1 +1066 None ssh-rsa 22key4plc22 user1066-key1 +1067 None ssh-rsa 22key4plc22 user1067-key1 +1068 None ssh-rsa 22key4plc22 user1068-key1 +1069 None ssh-rsa 22key4plc22 user1069-key1 +1070 None ssh-rsa 22key4plc22 user1070-key1 +1071 None ssh-rsa 22key4plc22 user1071-key1 +1072 None ssh-rsa 22key4plc22 user1072-key1 +1073 None ssh-rsa 22key4plc22 user1073-key1 +1074 None ssh-rsa 22key4plc22 user1074-key1 +1075 None ssh-rsa 22key4plc22 user1075-key1 +1076 None ssh-rsa 22key4plc22 user1076-key1 +1077 None ssh-rsa 22key4plc22 user1077-key1 +1078 None ssh-rsa 22key4plc22 user1078-key1 +1079 None ssh-rsa 22key4plc22 user1079-key1 +1080 None ssh-rsa 22key4plc22 user1080-key1 +1081 None ssh-rsa 22key4plc22 user1081-key1 +1082 None ssh-rsa 22key4plc22 user1082-key1 +1083 None ssh-rsa 22key4plc22 user1083-key1 +1084 None ssh-rsa 22key4plc22 user1084-key1 +1085 None ssh-rsa 22key4plc22 user1085-key1 +1086 None ssh-rsa 22key4plc22 user1086-key1 +1087 None ssh-rsa 22key4plc22 user1087-key1 +1088 None ssh-rsa 22key4plc22 user1088-key1 +1089 None ssh-rsa 22key4plc22 user1089-key1 +1090 None ssh-rsa 22key4plc22 user1090-key1 +1091 None ssh-rsa 22key4plc22 user1091-key1 +1092 None ssh-rsa 22key4plc22 user1092-key1 +1093 None ssh-rsa 22key4plc22 user1093-key1 +1094 None ssh-rsa 22key4plc22 user1094-key1 +1095 None ssh-rsa 22key4plc22 user1095-key1 +1096 None ssh-rsa 22key4plc22 user1096-key1 +1097 None ssh-rsa 22key4plc22 user1097-key1 +1098 None ssh-rsa 22key4plc22 user1098-key1 +1099 None ssh-rsa 22key4plc22 user1099-key1 +1100 None ssh-rsa 22key4plc22 user1100-key1 +1101 None ssh-rsa 22key4plc22 user1101-key1 +1102 None ssh-rsa 22key4plc22 user1102-key1 +1103 None ssh-rsa 22key4plc22 user1103-key1 +1104 None ssh-rsa 22key4plc22 user1104-key1 +1105 None ssh-rsa 22key4plc22 user1105-key1 +1106 None ssh-rsa 22key4plc22 user1106-key1 +1107 None ssh-rsa 22key4plc22 user1107-key1 +1108 None ssh-rsa 22key4plc22 user1108-key1 +1109 None ssh-rsa 22key4plc22 user1109-key1 +1110 None ssh-rsa 22key4plc22 user1110-key1 +1111 None ssh-rsa 22key4plc22 user1111-key1 +1112 None ssh-rsa 22key4plc22 user1112-key1 +1113 None ssh-rsa 22key4plc22 user1113-key1 +1114 None ssh-rsa 22key4plc22 user1114-key1 +1115 None ssh-rsa 22key4plc22 user1115-key1 +1116 None ssh-rsa 22key4plc22 user1116-key1 +1117 None ssh-rsa 22key4plc22 user1117-key1 +1118 None ssh-rsa 22key4plc22 user1118-key1 +1119 None ssh-rsa 22key4plc22 user1119-key1 +1120 None ssh-rsa 22key4plc22 user1120-key1 +1121 None ssh-rsa 22key4plc22 user1121-key1 +1122 None ssh-rsa 22key4plc22 user1122-key1 +1123 None ssh-rsa 22key4plc22 user1123-key1 +1124 None ssh-rsa 22key4plc22 user1124-key1 +1125 None ssh-rsa 22key4plc22 user1125-key1 +1126 None ssh-rsa 22key4plc22 user1126-key1 +1127 None ssh-rsa 22key4plc22 user1127-key1 +1128 None ssh-rsa 22key4plc22 user1128-key1 +1129 None ssh-rsa 22key4plc22 user1129-key1 +1130 None ssh-rsa 22key4plc22 user1130-key1 +1131 None ssh-rsa 22key4plc22 user1131-key1 +1132 None ssh-rsa 22key4plc22 user1132-key1 +1133 None ssh-rsa 22key4plc22 user1133-key1 +1134 None ssh-rsa 22key4plc22 user1134-key1 +1135 None ssh-rsa 22key4plc22 user1135-key1 +1136 None ssh-rsa 22key4plc22 user1136-key1 +1137 None ssh-rsa 22key4plc22 user1137-key1 +1138 None ssh-rsa 22key4plc22 user1138-key1 +1139 None ssh-rsa 22key4plc22 user1139-key1 +1140 None ssh-rsa 22key4plc22 user1140-key1 +1141 None ssh-rsa 22key4plc22 user1141-key1 +1142 None ssh-rsa 22key4plc22 user1142-key1 +1143 None ssh-rsa 22key4plc22 user1143-key1 +1144 None ssh-rsa 22key4plc22 user1144-key1 +1145 None ssh-rsa 22key4plc22 user1145-key1 +1146 None ssh-rsa 22key4plc22 user1146-key1 +1147 None ssh-rsa 22key4plc22 user1147-key1 +1148 None ssh-rsa 22key4plc22 user1148-key1 +1149 None ssh-rsa 22key4plc22 user1149-key1 +1150 None ssh-rsa 22key4plc22 user1150-key1 +1151 None ssh-rsa 22key4plc22 user1151-key1 +1152 None ssh-rsa 22key4plc22 user1152-key1 +1153 None ssh-rsa 22key4plc22 user1153-key1 +1154 None ssh-rsa 22key4plc22 user1154-key1 +1155 None ssh-rsa 22key4plc22 user1155-key1 +1156 None ssh-rsa 22key4plc22 user1156-key1 +1157 None ssh-rsa 22key4plc22 user1157-key1 +1158 None ssh-rsa 22key4plc22 user1158-key1 +1159 None ssh-rsa 22key4plc22 user1159-key1 +1160 None ssh-rsa 22key4plc22 user1160-key1 +1161 None ssh-rsa 22key4plc22 user1161-key1 +1162 None ssh-rsa 22key4plc22 user1162-key1 +1163 None ssh-rsa 22key4plc22 user1163-key1 +1164 None ssh-rsa 22key4plc22 user1164-key1 +1165 None ssh-rsa 22key4plc22 user1165-key1 +1166 None ssh-rsa 22key4plc22 user1166-key1 +1167 None ssh-rsa 22key4plc22 user1167-key1 +1168 None ssh-rsa 22key4plc22 user1168-key1 +1169 None ssh-rsa 22key4plc22 user1169-key1 +1170 None ssh-rsa 22key4plc22 user1170-key1 +1171 None ssh-rsa 22key4plc22 user1171-key1 +1172 None ssh-rsa 22key4plc22 user1172-key1 +1173 None ssh-rsa 22key4plc22 user1173-key1 +1174 None ssh-rsa 22key4plc22 user1174-key1 +1175 None ssh-rsa 22key4plc22 user1175-key1 +1176 None ssh-rsa 22key4plc22 user1176-key1 +1177 None ssh-rsa 22key4plc22 user1177-key1 +1178 None ssh-rsa 22key4plc22 user1178-key1 +1179 None ssh-rsa 22key4plc22 user1179-key1 +1180 None ssh-rsa 22key4plc22 user1180-key1 +1181 None ssh-rsa 22key4plc22 user1181-key1 +1182 None ssh-rsa 22key4plc22 user1182-key1 +1183 None ssh-rsa 22key4plc22 user1183-key1 +1184 None ssh-rsa 22key4plc22 user1184-key1 +1185 None ssh-rsa 22key4plc22 user1185-key1 +1186 None ssh-rsa 22key4plc22 user1186-key1 +1187 None ssh-rsa 22key4plc22 user1187-key1 +1188 None ssh-rsa 22key4plc22 user1188-key1 +1189 None ssh-rsa 22key4plc22 user1189-key1 +1190 None ssh-rsa 22key4plc22 user1190-key1 +1191 None ssh-rsa 22key4plc22 user1191-key1 +1192 None ssh-rsa 22key4plc22 user1192-key1 +1193 None ssh-rsa 22key4plc22 user1193-key1 +1194 None ssh-rsa 22key4plc22 user1194-key1 +1195 None ssh-rsa 22key4plc22 user1195-key1 +1196 None ssh-rsa 22key4plc22 user1196-key1 +1197 None ssh-rsa 22key4plc22 user1197-key1 +1198 None ssh-rsa 22key4plc22 user1198-key1 +1199 None ssh-rsa 22key4plc22 user1199-key1 +1200 None ssh-rsa 22key4plc22 user1200-key1 +1201 None ssh-rsa 22key4plc22 user1201-key1 +1202 None ssh-rsa 22key4plc22 user1202-key1 +1203 None ssh-rsa 22key4plc22 user1203-key1 +1204 None ssh-rsa 22key4plc22 user1204-key1 +1205 None ssh-rsa 22key4plc22 user1205-key1 +1206 None ssh-rsa 22key4plc22 user1206-key1 +1207 None ssh-rsa 22key4plc22 user1207-key1 +1208 None ssh-rsa 22key4plc22 user1208-key1 +1209 None ssh-rsa 22key4plc22 user1209-key1 +1210 None ssh-rsa 22key4plc22 user1210-key1 +1211 None ssh-rsa 22key4plc22 user1211-key1 +1212 None ssh-rsa 22key4plc22 user1212-key1 +1213 None ssh-rsa 22key4plc22 user1213-key1 +1214 None ssh-rsa 22key4plc22 user1214-key1 +1215 None ssh-rsa 22key4plc22 user1215-key1 +1216 None ssh-rsa 22key4plc22 user1216-key1 +1217 None ssh-rsa 22key4plc22 user1217-key1 +1218 None ssh-rsa 22key4plc22 user1218-key1 +1219 None ssh-rsa 22key4plc22 user1219-key1 +1220 None ssh-rsa 22key4plc22 user1220-key1 +1221 None ssh-rsa 22key4plc22 user1221-key1 +1222 None ssh-rsa 22key4plc22 user1222-key1 +1223 None ssh-rsa 22key4plc22 user1223-key1 +1224 None ssh-rsa 22key4plc22 user1224-key1 +1225 None ssh-rsa 22key4plc22 user1225-key1 +1226 None ssh-rsa 22key4plc22 user1226-key1 +1227 None ssh-rsa 22key4plc22 user1227-key1 +1228 None ssh-rsa 22key4plc22 user1228-key1 +1229 None ssh-rsa 22key4plc22 user1229-key1 +1230 None ssh-rsa 22key4plc22 user1230-key1 +1231 None ssh-rsa 22key4plc22 user1231-key1 +1232 None ssh-rsa 22key4plc22 user1232-key1 +1233 None ssh-rsa 22key4plc22 user1233-key1 +1234 None ssh-rsa 22key4plc22 user1234-key1 +1235 None ssh-rsa 22key4plc22 user1235-key1 +1236 None ssh-rsa 22key4plc22 user1236-key1 +1237 None ssh-rsa 22key4plc22 user1237-key1 +1238 None ssh-rsa 22key4plc22 user1238-key1 +1239 None ssh-rsa 22key4plc22 user1239-key1 +1240 None ssh-rsa 22key4plc22 user1240-key1 +1241 None ssh-rsa 22key4plc22 user1241-key1 +1242 None ssh-rsa 22key4plc22 user1242-key1 +1243 None ssh-rsa 22key4plc22 user1243-key1 +1244 None ssh-rsa 22key4plc22 user1244-key1 +1245 None ssh-rsa 22key4plc22 user1245-key1 +1246 None ssh-rsa 22key4plc22 user1246-key1 +1247 None ssh-rsa 22key4plc22 user1247-key1 +1248 None ssh-rsa 22key4plc22 user1248-key1 +1249 None ssh-rsa 22key4plc22 user1249-key1 +1250 None ssh-rsa 22key4plc22 user1250-key1 +1251 None ssh-rsa 22key4plc22 user1251-key1 +1252 None ssh-rsa 22key4plc22 user1252-key1 +1253 None ssh-rsa 22key4plc22 user1253-key1 +1254 None ssh-rsa 22key4plc22 user1254-key1 +1255 None ssh-rsa 22key4plc22 user1255-key1 +1256 None ssh-rsa 22key4plc22 user1256-key1 +1257 None ssh-rsa 22key4plc22 user1257-key1 +1258 None ssh-rsa 22key4plc22 user1258-key1 +1259 None ssh-rsa 22key4plc22 user1259-key1 +1260 None ssh-rsa 22key4plc22 user1260-key1 +1261 None ssh-rsa 22key4plc22 user1261-key1 +1262 None ssh-rsa 22key4plc22 user1262-key1 +1263 None ssh-rsa 22key4plc22 user1263-key1 +1264 None ssh-rsa 22key4plc22 user1264-key1 +1265 None ssh-rsa 22key4plc22 user1265-key1 +1266 None ssh-rsa 22key4plc22 user1266-key1 +1267 None ssh-rsa 22key4plc22 user1267-key1 +1268 None ssh-rsa 22key4plc22 user1268-key1 +1269 None ssh-rsa 22key4plc22 user1269-key1 +1270 None ssh-rsa 22key4plc22 user1270-key1 +1271 None ssh-rsa 22key4plc22 user1271-key1 +1272 None ssh-rsa 22key4plc22 user1272-key1 +1273 None ssh-rsa 22key4plc22 user1273-key1 +1274 None ssh-rsa 22key4plc22 user1274-key1 +1275 None ssh-rsa 22key4plc22 user1275-key1 +1276 None ssh-rsa 22key4plc22 user1276-key1 +1277 None ssh-rsa 22key4plc22 user1277-key1 +1278 None ssh-rsa 22key4plc22 user1278-key1 +1279 None ssh-rsa 22key4plc22 user1279-key1 +1280 None ssh-rsa 22key4plc22 user1280-key1 +1281 None ssh-rsa 22key4plc22 user1281-key1 +1282 None ssh-rsa 22key4plc22 user1282-key1 +1283 None ssh-rsa 22key4plc22 user1283-key1 +1284 None ssh-rsa 22key4plc22 user1284-key1 +1285 None ssh-rsa 22key4plc22 user1285-key1 +1286 None ssh-rsa 22key4plc22 user1286-key1 +1287 None ssh-rsa 22key4plc22 user1287-key1 +1288 None ssh-rsa 22key4plc22 user1288-key1 +1289 None ssh-rsa 22key4plc22 user1289-key1 +1290 None ssh-rsa 22key4plc22 user1290-key1 +1291 None ssh-rsa 22key4plc22 user1291-key1 +1292 None ssh-rsa 22key4plc22 user1292-key1 +1293 None ssh-rsa 22key4plc22 user1293-key1 +1294 None ssh-rsa 22key4plc22 user1294-key1 +1295 None ssh-rsa 22key4plc22 user1295-key1 +1296 None ssh-rsa 22key4plc22 user1296-key1 +1297 None ssh-rsa 22key4plc22 user1297-key1 +1298 None ssh-rsa 22key4plc22 user1298-key1 +1299 None ssh-rsa 22key4plc22 user1299-key1 +1300 None ssh-rsa 22key4plc22 user1300-key1 +1301 None ssh-rsa 22key4plc22 user1301-key1 +1302 None ssh-rsa 22key4plc22 user1302-key1 +1303 None ssh-rsa 22key4plc22 user1303-key1 +1304 None ssh-rsa 22key4plc22 user1304-key1 +1305 None ssh-rsa 22key4plc22 user1305-key1 +1306 None ssh-rsa 22key4plc22 user1306-key1 +1307 None ssh-rsa 22key4plc22 user1307-key1 +1308 None ssh-rsa 22key4plc22 user1308-key1 +1309 None ssh-rsa 22key4plc22 user1309-key1 +1310 None ssh-rsa 22key4plc22 user1310-key1 +1311 None ssh-rsa 22key4plc22 user1311-key1 +1312 None ssh-rsa 22key4plc22 user1312-key1 +1313 None ssh-rsa 22key4plc22 user1313-key1 +1314 None ssh-rsa 22key4plc22 user1314-key1 +1315 None ssh-rsa 22key4plc22 user1315-key1 +1316 None ssh-rsa 22key4plc22 user1316-key1 +1317 None ssh-rsa 22key4plc22 user1317-key1 +1318 None ssh-rsa 22key4plc22 user1318-key1 +1319 None ssh-rsa 22key4plc22 user1319-key1 +1320 None ssh-rsa 22key4plc22 user1320-key1 +1321 None ssh-rsa 22key4plc22 user1321-key1 +1322 None ssh-rsa 22key4plc22 user1322-key1 +1323 None ssh-rsa 22key4plc22 user1323-key1 +1324 None ssh-rsa 22key4plc22 user1324-key1 +1325 None ssh-rsa 22key4plc22 user1325-key1 +1326 None ssh-rsa 22key4plc22 user1326-key1 +1327 None ssh-rsa 22key4plc22 user1327-key1 +1328 None ssh-rsa 22key4plc22 user1328-key1 +1329 None ssh-rsa 22key4plc22 user1329-key1 +1330 None ssh-rsa 22key4plc22 user1330-key1 +1331 None ssh-rsa 22key4plc22 user1331-key1 +1332 None ssh-rsa 22key4plc22 user1332-key1 +1333 None ssh-rsa 22key4plc22 user1333-key1 +1334 None ssh-rsa 22key4plc22 user1334-key1 +1335 None ssh-rsa 22key4plc22 user1335-key1 +1336 None ssh-rsa 22key4plc22 user1336-key1 +1337 None ssh-rsa 22key4plc22 user1337-key1 +1338 None ssh-rsa 22key4plc22 user1338-key1 +1339 None ssh-rsa 22key4plc22 user1339-key1 +1340 None ssh-rsa 22key4plc22 user1340-key1 +1341 None ssh-rsa 22key4plc22 user1341-key1 +1342 None ssh-rsa 22key4plc22 user1342-key1 +1343 None ssh-rsa 22key4plc22 user1343-key1 +1344 None ssh-rsa 22key4plc22 user1344-key1 +1345 None ssh-rsa 22key4plc22 user1345-key1 +1346 None ssh-rsa 22key4plc22 user1346-key1 +1347 None ssh-rsa 22key4plc22 user1347-key1 +1348 None ssh-rsa 22key4plc22 user1348-key1 +1349 None ssh-rsa 22key4plc22 user1349-key1 +1350 None ssh-rsa 22key4plc22 user1350-key1 +1351 None ssh-rsa 22key4plc22 user1351-key1 +1352 None ssh-rsa 22key4plc22 user1352-key1 +1353 None ssh-rsa 22key4plc22 user1353-key1 +1354 None ssh-rsa 22key4plc22 user1354-key1 +1355 None ssh-rsa 22key4plc22 user1355-key1 +1356 None ssh-rsa 22key4plc22 user1356-key1 +1357 None ssh-rsa 22key4plc22 user1357-key1 +1358 None ssh-rsa 22key4plc22 user1358-key1 +1359 None ssh-rsa 22key4plc22 user1359-key1 +1360 None ssh-rsa 22key4plc22 user1360-key1 +1361 None ssh-rsa 22key4plc22 user1361-key1 +1362 None ssh-rsa 22key4plc22 user1362-key1 +1363 None ssh-rsa 22key4plc22 user1363-key1 +1364 None ssh-rsa 22key4plc22 user1364-key1 +1365 None ssh-rsa 22key4plc22 user1365-key1 +1366 None ssh-rsa 22key4plc22 user1366-key1 +1367 None ssh-rsa 22key4plc22 user1367-key1 +1368 None ssh-rsa 22key4plc22 user1368-key1 +1369 None ssh-rsa 22key4plc22 user1369-key1 +1370 None ssh-rsa 22key4plc22 user1370-key1 +1371 None ssh-rsa 22key4plc22 user1371-key1 +1372 None ssh-rsa 22key4plc22 user1372-key1 +1373 None ssh-rsa 22key4plc22 user1373-key1 +1374 None ssh-rsa 22key4plc22 user1374-key1 +1375 None ssh-rsa 22key4plc22 user1375-key1 +1376 None ssh-rsa 22key4plc22 user1376-key1 +1377 None ssh-rsa 22key4plc22 user1377-key1 +1378 None ssh-rsa 22key4plc22 user1378-key1 +1379 None ssh-rsa 22key4plc22 user1379-key1 +1380 None ssh-rsa 22key4plc22 user1380-key1 +1381 None ssh-rsa 22key4plc22 user1381-key1 +1382 None ssh-rsa 22key4plc22 user1382-key1 +1383 None ssh-rsa 22key4plc22 user1383-key1 +1384 None ssh-rsa 22key4plc22 user1384-key1 +1385 None ssh-rsa 22key4plc22 user1385-key1 +1386 None ssh-rsa 22key4plc22 user1386-key1 +1387 None ssh-rsa 22key4plc22 user1387-key1 +1388 None ssh-rsa 22key4plc22 user1388-key1 +1389 None ssh-rsa 22key4plc22 user1389-key1 +1390 None ssh-rsa 22key4plc22 user1390-key1 +1391 None ssh-rsa 22key4plc22 user1391-key1 +1392 None ssh-rsa 22key4plc22 user1392-key1 +1393 None ssh-rsa 22key4plc22 user1393-key1 +1394 None ssh-rsa 22key4plc22 user1394-key1 +1395 None ssh-rsa 22key4plc22 user1395-key1 +1396 None ssh-rsa 22key4plc22 user1396-key1 +1397 None ssh-rsa 22key4plc22 user1397-key1 +1398 None ssh-rsa 22key4plc22 user1398-key1 +1399 None ssh-rsa 22key4plc22 user1399-key1 +1400 None ssh-rsa 22key4plc22 user1400-key1 +1401 None ssh-rsa 22key4plc22 user1401-key1 +1402 None ssh-rsa 22key4plc22 user1402-key1 +1403 None ssh-rsa 22key4plc22 user1403-key1 +1404 None ssh-rsa 22key4plc22 user1404-key1 +1405 None ssh-rsa 22key4plc22 user1405-key1 +1406 None ssh-rsa 22key4plc22 user1406-key1 +1407 None ssh-rsa 22key4plc22 user1407-key1 +1408 None ssh-rsa 22key4plc22 user1408-key1 +1409 None ssh-rsa 22key4plc22 user1409-key1 +1410 None ssh-rsa 22key4plc22 user1410-key1 +1411 None ssh-rsa 22key4plc22 user1411-key1 +1412 None ssh-rsa 22key4plc22 user1412-key1 +1413 None ssh-rsa 22key4plc22 user1413-key1 +1414 None ssh-rsa 22key4plc22 user1414-key1 +1415 None ssh-rsa 22key4plc22 user1415-key1 +1416 None ssh-rsa 22key4plc22 user1416-key1 +1417 None ssh-rsa 22key4plc22 user1417-key1 +1418 None ssh-rsa 22key4plc22 user1418-key1 +1419 None ssh-rsa 22key4plc22 user1419-key1 +1420 None ssh-rsa 22key4plc22 user1420-key1 +1421 None ssh-rsa 22key4plc22 user1421-key1 +1422 None ssh-rsa 22key4plc22 user1422-key1 +1423 None ssh-rsa 22key4plc22 user1423-key1 +1424 None ssh-rsa 22key4plc22 user1424-key1 +1425 None ssh-rsa 22key4plc22 user1425-key1 +1426 None ssh-rsa 22key4plc22 user1426-key1 +1427 None ssh-rsa 22key4plc22 user1427-key1 +1428 None ssh-rsa 22key4plc22 user1428-key1 +1429 None ssh-rsa 22key4plc22 user1429-key1 +1430 None ssh-rsa 22key4plc22 user1430-key1 +1431 None ssh-rsa 22key4plc22 user1431-key1 +1432 None ssh-rsa 22key4plc22 user1432-key1 +1433 None ssh-rsa 22key4plc22 user1433-key1 +1434 None ssh-rsa 22key4plc22 user1434-key1 +1435 None ssh-rsa 22key4plc22 user1435-key1 +1436 None ssh-rsa 22key4plc22 user1436-key1 +1437 None ssh-rsa 22key4plc22 user1437-key1 +1438 None ssh-rsa 22key4plc22 user1438-key1 +1439 None ssh-rsa 22key4plc22 user1439-key1 +1440 None ssh-rsa 22key4plc22 user1440-key1 +1441 None ssh-rsa 22key4plc22 user1441-key1 +1442 None ssh-rsa 22key4plc22 user1442-key1 +1443 None ssh-rsa 22key4plc22 user1443-key1 +1444 None ssh-rsa 22key4plc22 user1444-key1 +1445 None ssh-rsa 22key4plc22 user1445-key1 +1446 None ssh-rsa 22key4plc22 user1446-key1 +1447 None ssh-rsa 22key4plc22 user1447-key1 +1448 None ssh-rsa 22key4plc22 user1448-key1 +1449 None ssh-rsa 22key4plc22 user1449-key1 +1450 None ssh-rsa 22key4plc22 user1450-key1 +1451 None ssh-rsa 22key4plc22 user1451-key1 +1452 None ssh-rsa 22key4plc22 user1452-key1 +1453 None ssh-rsa 22key4plc22 user1453-key1 +1454 None ssh-rsa 22key4plc22 user1454-key1 +1455 None ssh-rsa 22key4plc22 user1455-key1 +1456 None ssh-rsa 22key4plc22 user1456-key1 +1457 None ssh-rsa 22key4plc22 user1457-key1 +1458 None ssh-rsa 22key4plc22 user1458-key1 +1459 None ssh-rsa 22key4plc22 user1459-key1 +1460 None ssh-rsa 22key4plc22 user1460-key1 +1461 None ssh-rsa 22key4plc22 user1461-key1 +1462 None ssh-rsa 22key4plc22 user1462-key1 +1463 None ssh-rsa 22key4plc22 user1463-key1 +1464 None ssh-rsa 22key4plc22 user1464-key1 +1465 None ssh-rsa 22key4plc22 user1465-key1 +1466 None ssh-rsa 22key4plc22 user1466-key1 +1467 None ssh-rsa 22key4plc22 user1467-key1 +1468 None ssh-rsa 22key4plc22 user1468-key1 +1469 None ssh-rsa 22key4plc22 user1469-key1 +1470 None ssh-rsa 22key4plc22 user1470-key1 +1471 None ssh-rsa 22key4plc22 user1471-key1 +1472 None ssh-rsa 22key4plc22 user1472-key1 +1473 None ssh-rsa 22key4plc22 user1473-key1 +1474 None ssh-rsa 22key4plc22 user1474-key1 +1475 None ssh-rsa 22key4plc22 user1475-key1 +1476 None ssh-rsa 22key4plc22 user1476-key1 +1477 None ssh-rsa 22key4plc22 user1477-key1 +1478 None ssh-rsa 22key4plc22 user1478-key1 +1479 None ssh-rsa 22key4plc22 user1479-key1 +1480 None ssh-rsa 22key4plc22 user1480-key1 +1481 None ssh-rsa 22key4plc22 user1481-key1 +1482 None ssh-rsa 22key4plc22 user1482-key1 +1483 None ssh-rsa 22key4plc22 user1483-key1 +1484 None ssh-rsa 22key4plc22 user1484-key1 +1485 None ssh-rsa 22key4plc22 user1485-key1 +1486 None ssh-rsa 22key4plc22 user1486-key1 +1487 None ssh-rsa 22key4plc22 user1487-key1 +1488 None ssh-rsa 22key4plc22 user1488-key1 +1489 None ssh-rsa 22key4plc22 user1489-key1 +1490 None ssh-rsa 22key4plc22 user1490-key1 +1491 None ssh-rsa 22key4plc22 user1491-key1 +1492 None ssh-rsa 22key4plc22 user1492-key1 +1493 None ssh-rsa 22key4plc22 user1493-key1 +1494 None ssh-rsa 22key4plc22 user1494-key1 +1495 None ssh-rsa 22key4plc22 user1495-key1 +1496 None ssh-rsa 22key4plc22 user1496-key1 +1497 None ssh-rsa 22key4plc22 user1497-key1 +1498 None ssh-rsa 22key4plc22 user1498-key1 +1499 None ssh-rsa 22key4plc22 user1499-key1 +1500 None ssh-rsa 22key4plc22 user1500-key1 +1501 None ssh-rsa 22key4plc22 user1501-key1 +1502 None ssh-rsa 22key4plc22 user1502-key1 +1503 None ssh-rsa 22key4plc22 user1503-key1 +1504 None ssh-rsa 22key4plc22 user1504-key1 +1505 None ssh-rsa 22key4plc22 user1505-key1 +1506 None ssh-rsa 22key4plc22 user1506-key1 +1507 None ssh-rsa 22key4plc22 user1507-key1 +1508 None ssh-rsa 22key4plc22 user1508-key1 +1509 None ssh-rsa 22key4plc22 user1509-key1 +1510 None ssh-rsa 22key4plc22 user1510-key1 +1511 None ssh-rsa 22key4plc22 user1511-key1 +1512 None ssh-rsa 22key4plc22 user1512-key1 +1513 None ssh-rsa 22key4plc22 user1513-key1 +1514 None ssh-rsa 22key4plc22 user1514-key1 +1515 None ssh-rsa 22key4plc22 user1515-key1 +1516 None ssh-rsa 22key4plc22 user1516-key1 +1517 None ssh-rsa 22key4plc22 user1517-key1 +1518 None ssh-rsa 22key4plc22 user1518-key1 +1519 None ssh-rsa 22key4plc22 user1519-key1 +1520 None ssh-rsa 22key4plc22 user1520-key1 +1521 None ssh-rsa 22key4plc22 user1521-key1 +1522 None ssh-rsa 22key4plc22 user1522-key1 +1523 None ssh-rsa 22key4plc22 user1523-key1 +1524 None ssh-rsa 22key4plc22 user1524-key1 +1525 None ssh-rsa 22key4plc22 user1525-key1 +1526 None ssh-rsa 22key4plc22 user1526-key1 +1527 None ssh-rsa 22key4plc22 user1527-key1 +1528 None ssh-rsa 22key4plc22 user1528-key1 +1529 None ssh-rsa 22key4plc22 user1529-key1 +1530 None ssh-rsa 22key4plc22 user1530-key1 +1531 None ssh-rsa 22key4plc22 user1531-key1 +1532 None ssh-rsa 22key4plc22 user1532-key1 +1533 None ssh-rsa 22key4plc22 user1533-key1 +1534 None ssh-rsa 22key4plc22 user1534-key1 +1535 None ssh-rsa 22key4plc22 user1535-key1 +1536 None ssh-rsa 22key4plc22 user1536-key1 +1537 None ssh-rsa 22key4plc22 user1537-key1 +1538 None ssh-rsa 22key4plc22 user1538-key1 +1539 None ssh-rsa 22key4plc22 user1539-key1 +1540 None ssh-rsa 22key4plc22 user1540-key1 +1541 None ssh-rsa 22key4plc22 user1541-key1 +1542 None ssh-rsa 22key4plc22 user1542-key1 +1543 None ssh-rsa 22key4plc22 user1543-key1 +1544 None ssh-rsa 22key4plc22 user1544-key1 +1545 None ssh-rsa 22key4plc22 user1545-key1 +1546 None ssh-rsa 22key4plc22 user1546-key1 +1547 None ssh-rsa 22key4plc22 user1547-key1 +1548 None ssh-rsa 22key4plc22 user1548-key1 +1549 None ssh-rsa 22key4plc22 user1549-key1 +1550 None ssh-rsa 22key4plc22 user1550-key1 +1551 None ssh-rsa 22key4plc22 user1551-key1 +1552 None ssh-rsa 22key4plc22 user1552-key1 +1553 None ssh-rsa 22key4plc22 user1553-key1 +1554 None ssh-rsa 22key4plc22 user1554-key1 +1555 None ssh-rsa 22key4plc22 user1555-key1 +1556 None ssh-rsa 22key4plc22 user1556-key1 +1557 None ssh-rsa 22key4plc22 user1557-key1 +1558 None ssh-rsa 22key4plc22 user1558-key1 +1559 None ssh-rsa 22key4plc22 user1559-key1 +1560 None ssh-rsa 22key4plc22 user1560-key1 +1561 None ssh-rsa 22key4plc22 user1561-key1 +1562 None ssh-rsa 22key4plc22 user1562-key1 +1563 None ssh-rsa 22key4plc22 user1563-key1 +1564 None ssh-rsa 22key4plc22 user1564-key1 +1565 None ssh-rsa 22key4plc22 user1565-key1 +1566 None ssh-rsa 22key4plc22 user1566-key1 +1567 None ssh-rsa 22key4plc22 user1567-key1 +1568 None ssh-rsa 22key4plc22 user1568-key1 +1569 None ssh-rsa 22key4plc22 user1569-key1 +1570 None ssh-rsa 22key4plc22 user1570-key1 +1571 None ssh-rsa 22key4plc22 user1571-key1 +1572 None ssh-rsa 22key4plc22 user1572-key1 +1573 None ssh-rsa 22key4plc22 user1573-key1 +1574 None ssh-rsa 22key4plc22 user1574-key1 +1575 None ssh-rsa 22key4plc22 user1575-key1 +1576 None ssh-rsa 22key4plc22 user1576-key1 +1577 None ssh-rsa 22key4plc22 user1577-key1 +1578 None ssh-rsa 22key4plc22 user1578-key1 +1579 None ssh-rsa 22key4plc22 user1579-key1 +1580 None ssh-rsa 22key4plc22 user1580-key1 +1581 None ssh-rsa 22key4plc22 user1581-key1 +1582 None ssh-rsa 22key4plc22 user1582-key1 +1583 None ssh-rsa 22key4plc22 user1583-key1 +1584 None ssh-rsa 22key4plc22 user1584-key1 +1585 None ssh-rsa 22key4plc22 user1585-key1 +1586 None ssh-rsa 22key4plc22 user1586-key1 +1587 None ssh-rsa 22key4plc22 user1587-key1 +1588 None ssh-rsa 22key4plc22 user1588-key1 +1589 None ssh-rsa 22key4plc22 user1589-key1 +1590 None ssh-rsa 22key4plc22 user1590-key1 +1591 None ssh-rsa 22key4plc22 user1591-key1 +1592 None ssh-rsa 22key4plc22 user1592-key1 +1593 None ssh-rsa 22key4plc22 user1593-key1 +1594 None ssh-rsa 22key4plc22 user1594-key1 +1595 None ssh-rsa 22key4plc22 user1595-key1 +1596 None ssh-rsa 22key4plc22 user1596-key1 +1597 None ssh-rsa 22key4plc22 user1597-key1 +1598 None ssh-rsa 22key4plc22 user1598-key1 +1599 None ssh-rsa 22key4plc22 user1599-key1 +1600 None ssh-rsa 22key4plc22 user1600-key1 +1601 None ssh-rsa 22key4plc22 user1601-key1 +1602 None ssh-rsa 22key4plc22 user1602-key1 +1603 None ssh-rsa 22key4plc22 user1603-key1 +1604 None ssh-rsa 22key4plc22 user1604-key1 +1605 None ssh-rsa 22key4plc22 user1605-key1 +1606 None ssh-rsa 22key4plc22 user1606-key1 +1607 None ssh-rsa 22key4plc22 user1607-key1 +1608 None ssh-rsa 22key4plc22 user1608-key1 +1609 None ssh-rsa 22key4plc22 user1609-key1 +1610 None ssh-rsa 22key4plc22 user1610-key1 +1611 None ssh-rsa 22key4plc22 user1611-key1 +1612 None ssh-rsa 22key4plc22 user1612-key1 +1613 None ssh-rsa 22key4plc22 user1613-key1 +1614 None ssh-rsa 22key4plc22 user1614-key1 +1615 None ssh-rsa 22key4plc22 user1615-key1 +1616 None ssh-rsa 22key4plc22 user1616-key1 +1617 None ssh-rsa 22key4plc22 user1617-key1 +1618 None ssh-rsa 22key4plc22 user1618-key1 +1619 None ssh-rsa 22key4plc22 user1619-key1 +1620 None ssh-rsa 22key4plc22 user1620-key1 +1621 None ssh-rsa 22key4plc22 user1621-key1 +1622 None ssh-rsa 22key4plc22 user1622-key1 +1623 None ssh-rsa 22key4plc22 user1623-key1 +1624 None ssh-rsa 22key4plc22 user1624-key1 +1625 None ssh-rsa 22key4plc22 user1625-key1 +1626 None ssh-rsa 22key4plc22 user1626-key1 +1627 None ssh-rsa 22key4plc22 user1627-key1 +1628 None ssh-rsa 22key4plc22 user1628-key1 +1629 None ssh-rsa 22key4plc22 user1629-key1 +1630 None ssh-rsa 22key4plc22 user1630-key1 +1631 None ssh-rsa 22key4plc22 user1631-key1 +1632 None ssh-rsa 22key4plc22 user1632-key1 +1633 None ssh-rsa 22key4plc22 user1633-key1 +1634 None ssh-rsa 22key4plc22 user1634-key1 +1635 None ssh-rsa 22key4plc22 user1635-key1 +1636 None ssh-rsa 22key4plc22 user1636-key1 +1637 None ssh-rsa 22key4plc22 user1637-key1 +1638 None ssh-rsa 22key4plc22 user1638-key1 +1639 None ssh-rsa 22key4plc22 user1639-key1 +1640 None ssh-rsa 22key4plc22 user1640-key1 +1641 None ssh-rsa 22key4plc22 user1641-key1 +1642 None ssh-rsa 22key4plc22 user1642-key1 +1643 None ssh-rsa 22key4plc22 user1643-key1 +1644 None ssh-rsa 22key4plc22 user1644-key1 +1645 None ssh-rsa 22key4plc22 user1645-key1 +1646 None ssh-rsa 22key4plc22 user1646-key1 +1647 None ssh-rsa 22key4plc22 user1647-key1 +1648 None ssh-rsa 22key4plc22 user1648-key1 +1649 None ssh-rsa 22key4plc22 user1649-key1 +1650 None ssh-rsa 22key4plc22 user1650-key1 +1651 None ssh-rsa 22key4plc22 user1651-key1 +1652 None ssh-rsa 22key4plc22 user1652-key1 +1653 None ssh-rsa 22key4plc22 user1653-key1 +1654 None ssh-rsa 22key4plc22 user1654-key1 +1655 None ssh-rsa 22key4plc22 user1655-key1 +1656 None ssh-rsa 22key4plc22 user1656-key1 +1657 None ssh-rsa 22key4plc22 user1657-key1 +1658 None ssh-rsa 22key4plc22 user1658-key1 +1659 None ssh-rsa 22key4plc22 user1659-key1 +1660 None ssh-rsa 22key4plc22 user1660-key1 +1661 None ssh-rsa 22key4plc22 user1661-key1 +1662 None ssh-rsa 22key4plc22 user1662-key1 +1663 None ssh-rsa 22key4plc22 user1663-key1 +1664 None ssh-rsa 22key4plc22 user1664-key1 +1665 None ssh-rsa 22key4plc22 user1665-key1 +1666 None ssh-rsa 22key4plc22 user1666-key1 +1667 None ssh-rsa 22key4plc22 user1667-key1 +1668 None ssh-rsa 22key4plc22 user1668-key1 +1669 None ssh-rsa 22key4plc22 user1669-key1 +1670 None ssh-rsa 22key4plc22 user1670-key1 +1671 None ssh-rsa 22key4plc22 user1671-key1 +1672 None ssh-rsa 22key4plc22 user1672-key1 +1673 None ssh-rsa 22key4plc22 user1673-key1 +1674 None ssh-rsa 22key4plc22 user1674-key1 +1675 None ssh-rsa 22key4plc22 user1675-key1 +1676 None ssh-rsa 22key4plc22 user1676-key1 +1677 None ssh-rsa 22key4plc22 user1677-key1 +1678 None ssh-rsa 22key4plc22 user1678-key1 +1679 None ssh-rsa 22key4plc22 user1679-key1 +1680 None ssh-rsa 22key4plc22 user1680-key1 +1681 None ssh-rsa 22key4plc22 user1681-key1 +1682 None ssh-rsa 22key4plc22 user1682-key1 +1683 None ssh-rsa 22key4plc22 user1683-key1 +1684 None ssh-rsa 22key4plc22 user1684-key1 +1685 None ssh-rsa 22key4plc22 user1685-key1 +1686 None ssh-rsa 22key4plc22 user1686-key1 +1687 None ssh-rsa 22key4plc22 user1687-key1 +1688 None ssh-rsa 22key4plc22 user1688-key1 +1689 None ssh-rsa 22key4plc22 user1689-key1 +1690 None ssh-rsa 22key4plc22 user1690-key1 +1691 None ssh-rsa 22key4plc22 user1691-key1 +1692 None ssh-rsa 22key4plc22 user1692-key1 +1693 None ssh-rsa 22key4plc22 user1693-key1 +1694 None ssh-rsa 22key4plc22 user1694-key1 +1695 None ssh-rsa 22key4plc22 user1695-key1 +1696 None ssh-rsa 22key4plc22 user1696-key1 +1697 None ssh-rsa 22key4plc22 user1697-key1 +1698 None ssh-rsa 22key4plc22 user1698-key1 +1699 None ssh-rsa 22key4plc22 user1699-key1 +1700 None ssh-rsa 22key4plc22 user1700-key1 +1701 None ssh-rsa 22key4plc22 user1701-key1 +1702 None ssh-rsa 22key4plc22 user1702-key1 +1703 None ssh-rsa 22key4plc22 user1703-key1 +1704 None ssh-rsa 22key4plc22 user1704-key1 +1705 None ssh-rsa 22key4plc22 user1705-key1 +1706 None ssh-rsa 22key4plc22 user1706-key1 +1707 None ssh-rsa 22key4plc22 user1707-key1 +1708 None ssh-rsa 22key4plc22 user1708-key1 +1709 None ssh-rsa 22key4plc22 user1709-key1 +1710 None ssh-rsa 22key4plc22 user1710-key1 +1711 None ssh-rsa 22key4plc22 user1711-key1 +1712 None ssh-rsa 22key4plc22 user1712-key1 +1713 None ssh-rsa 22key4plc22 user1713-key1 +1714 None ssh-rsa 22key4plc22 user1714-key1 +1715 None ssh-rsa 22key4plc22 user1715-key1 +1716 None ssh-rsa 22key4plc22 user1716-key1 +1717 None ssh-rsa 22key4plc22 user1717-key1 +1718 None ssh-rsa 22key4plc22 user1718-key1 +1719 None ssh-rsa 22key4plc22 user1719-key1 +1720 None ssh-rsa 22key4plc22 user1720-key1 +1721 None ssh-rsa 22key4plc22 user1721-key1 +1722 None ssh-rsa 22key4plc22 user1722-key1 +1723 None ssh-rsa 22key4plc22 user1723-key1 +1724 None ssh-rsa 22key4plc22 user1724-key1 +1725 None ssh-rsa 22key4plc22 user1725-key1 +1726 None ssh-rsa 22key4plc22 user1726-key1 +1727 None ssh-rsa 22key4plc22 user1727-key1 +1728 None ssh-rsa 22key4plc22 user1728-key1 +1729 None ssh-rsa 22key4plc22 user1729-key1 +1730 None ssh-rsa 22key4plc22 user1730-key1 +1731 None ssh-rsa 22key4plc22 user1731-key1 +1732 None ssh-rsa 22key4plc22 user1732-key1 +1733 None ssh-rsa 22key4plc22 user1733-key1 +1734 None ssh-rsa 22key4plc22 user1734-key1 +1735 None ssh-rsa 22key4plc22 user1735-key1 +1736 None ssh-rsa 22key4plc22 user1736-key1 +1737 None ssh-rsa 22key4plc22 user1737-key1 +1738 None ssh-rsa 22key4plc22 user1738-key1 +1739 None ssh-rsa 22key4plc22 user1739-key1 +1740 None ssh-rsa 22key4plc22 user1740-key1 +1741 None ssh-rsa 22key4plc22 user1741-key1 +1742 None ssh-rsa 22key4plc22 user1742-key1 +1743 None ssh-rsa 22key4plc22 user1743-key1 +1744 None ssh-rsa 22key4plc22 user1744-key1 +1745 None ssh-rsa 22key4plc22 user1745-key1 +1746 None ssh-rsa 22key4plc22 user1746-key1 +1747 None ssh-rsa 22key4plc22 user1747-key1 +1748 None ssh-rsa 22key4plc22 user1748-key1 +1749 None ssh-rsa 22key4plc22 user1749-key1 +1750 None ssh-rsa 22key4plc22 user1750-key1 +1751 None ssh-rsa 22key4plc22 user1751-key1 +1752 None ssh-rsa 22key4plc22 user1752-key1 +1753 None ssh-rsa 22key4plc22 user1753-key1 +1754 None ssh-rsa 22key4plc22 user1754-key1 +1755 None ssh-rsa 22key4plc22 user1755-key1 +1756 None ssh-rsa 22key4plc22 user1756-key1 +1757 None ssh-rsa 22key4plc22 user1757-key1 +1758 None ssh-rsa 22key4plc22 user1758-key1 +1759 None ssh-rsa 22key4plc22 user1759-key1 +1760 None ssh-rsa 22key4plc22 user1760-key1 +1761 None ssh-rsa 22key4plc22 user1761-key1 +1762 None ssh-rsa 22key4plc22 user1762-key1 +1763 None ssh-rsa 22key4plc22 user1763-key1 +1764 None ssh-rsa 22key4plc22 user1764-key1 +1765 None ssh-rsa 22key4plc22 user1765-key1 +1766 None ssh-rsa 22key4plc22 user1766-key1 +1767 None ssh-rsa 22key4plc22 user1767-key1 +1768 None ssh-rsa 22key4plc22 user1768-key1 +1769 None ssh-rsa 22key4plc22 user1769-key1 +1770 None ssh-rsa 22key4plc22 user1770-key1 +1771 None ssh-rsa 22key4plc22 user1771-key1 +1772 None ssh-rsa 22key4plc22 user1772-key1 +1773 None ssh-rsa 22key4plc22 user1773-key1 +1774 None ssh-rsa 22key4plc22 user1774-key1 +1775 None ssh-rsa 22key4plc22 user1775-key1 +1776 None ssh-rsa 22key4plc22 user1776-key1 +1777 None ssh-rsa 22key4plc22 user1777-key1 +1778 None ssh-rsa 22key4plc22 user1778-key1 +1779 None ssh-rsa 22key4plc22 user1779-key1 +1780 None ssh-rsa 22key4plc22 user1780-key1 +1781 None ssh-rsa 22key4plc22 user1781-key1 +1782 None ssh-rsa 22key4plc22 user1782-key1 +1783 None ssh-rsa 22key4plc22 user1783-key1 +1784 None ssh-rsa 22key4plc22 user1784-key1 +1785 None ssh-rsa 22key4plc22 user1785-key1 +1786 None ssh-rsa 22key4plc22 user1786-key1 +1787 None ssh-rsa 22key4plc22 user1787-key1 +1788 None ssh-rsa 22key4plc22 user1788-key1 +1789 None ssh-rsa 22key4plc22 user1789-key1 +1790 None ssh-rsa 22key4plc22 user1790-key1 +1791 None ssh-rsa 22key4plc22 user1791-key1 +1792 None ssh-rsa 22key4plc22 user1792-key1 +1793 None ssh-rsa 22key4plc22 user1793-key1 +1794 None ssh-rsa 22key4plc22 user1794-key1 +1795 None ssh-rsa 22key4plc22 user1795-key1 +1796 None ssh-rsa 22key4plc22 user1796-key1 +1797 None ssh-rsa 22key4plc22 user1797-key1 +1798 None ssh-rsa 22key4plc22 user1798-key1 +1799 None ssh-rsa 22key4plc22 user1799-key1 +1800 None ssh-rsa 22key4plc22 user1800-key1 +1801 None ssh-rsa 22key4plc22 user1801-key1 +1802 None ssh-rsa 22key4plc22 user1802-key1 +1803 None ssh-rsa 22key4plc22 user1803-key1 +1804 None ssh-rsa 22key4plc22 user1804-key1 +1805 None ssh-rsa 22key4plc22 user1805-key1 +1806 None ssh-rsa 22key4plc22 user1806-key1 +1807 None ssh-rsa 22key4plc22 user1807-key1 +1808 None ssh-rsa 22key4plc22 user1808-key1 +1809 None ssh-rsa 22key4plc22 user1809-key1 +1810 None ssh-rsa 22key4plc22 user1810-key1 +1811 None ssh-rsa 22key4plc22 user1811-key1 +1812 None ssh-rsa 22key4plc22 user1812-key1 +1813 None ssh-rsa 22key4plc22 user1813-key1 +1814 None ssh-rsa 22key4plc22 user1814-key1 +1815 None ssh-rsa 22key4plc22 user1815-key1 +1816 None ssh-rsa 22key4plc22 user1816-key1 +1817 None ssh-rsa 22key4plc22 user1817-key1 +1818 None ssh-rsa 22key4plc22 user1818-key1 +1819 None ssh-rsa 22key4plc22 user1819-key1 +1820 None ssh-rsa 22key4plc22 user1820-key1 +1821 None ssh-rsa 22key4plc22 user1821-key1 +1822 None ssh-rsa 22key4plc22 user1822-key1 +1823 None ssh-rsa 22key4plc22 user1823-key1 +1824 None ssh-rsa 22key4plc22 user1824-key1 +1825 None ssh-rsa 22key4plc22 user1825-key1 +1826 None ssh-rsa 22key4plc22 user1826-key1 +1827 None ssh-rsa 22key4plc22 user1827-key1 +1828 None ssh-rsa 22key4plc22 user1828-key1 +1829 None ssh-rsa 22key4plc22 user1829-key1 +1830 None ssh-rsa 22key4plc22 user1830-key1 +1831 None ssh-rsa 22key4plc22 user1831-key1 +1832 None ssh-rsa 22key4plc22 user1832-key1 +1833 None ssh-rsa 22key4plc22 user1833-key1 +1834 None ssh-rsa 22key4plc22 user1834-key1 +1835 None ssh-rsa 22key4plc22 user1835-key1 +1836 None ssh-rsa 22key4plc22 user1836-key1 +1837 None ssh-rsa 22key4plc22 user1837-key1 +1838 None ssh-rsa 22key4plc22 user1838-key1 +1839 None ssh-rsa 22key4plc22 user1839-key1 +1840 None ssh-rsa 22key4plc22 user1840-key1 +1841 None ssh-rsa 22key4plc22 user1841-key1 +1842 None ssh-rsa 22key4plc22 user1842-key1 +1843 None ssh-rsa 22key4plc22 user1843-key1 +1844 None ssh-rsa 22key4plc22 user1844-key1 +1845 None ssh-rsa 22key4plc22 user1845-key1 +1846 None ssh-rsa 22key4plc22 user1846-key1 +1847 None ssh-rsa 22key4plc22 user1847-key1 +1848 None ssh-rsa 22key4plc22 user1848-key1 +1849 None ssh-rsa 22key4plc22 user1849-key1 +1850 None ssh-rsa 22key4plc22 user1850-key1 +1851 None ssh-rsa 22key4plc22 user1851-key1 +1852 None ssh-rsa 22key4plc22 user1852-key1 +1853 None ssh-rsa 22key4plc22 user1853-key1 +1854 None ssh-rsa 22key4plc22 user1854-key1 +1855 None ssh-rsa 22key4plc22 user1855-key1 +1856 None ssh-rsa 22key4plc22 user1856-key1 +1857 None ssh-rsa 22key4plc22 user1857-key1 +1858 None ssh-rsa 22key4plc22 user1858-key1 +1859 None ssh-rsa 22key4plc22 user1859-key1 +1860 None ssh-rsa 22key4plc22 user1860-key1 +1861 None ssh-rsa 22key4plc22 user1861-key1 +1862 None ssh-rsa 22key4plc22 user1862-key1 +1863 None ssh-rsa 22key4plc22 user1863-key1 +1864 None ssh-rsa 22key4plc22 user1864-key1 +1865 None ssh-rsa 22key4plc22 user1865-key1 +1866 None ssh-rsa 22key4plc22 user1866-key1 +1867 None ssh-rsa 22key4plc22 user1867-key1 +1868 None ssh-rsa 22key4plc22 user1868-key1 +1869 None ssh-rsa 22key4plc22 user1869-key1 +1870 None ssh-rsa 22key4plc22 user1870-key1 +1871 None ssh-rsa 22key4plc22 user1871-key1 +1872 None ssh-rsa 22key4plc22 user1872-key1 +1873 None ssh-rsa 22key4plc22 user1873-key1 +1874 None ssh-rsa 22key4plc22 user1874-key1 +1875 None ssh-rsa 22key4plc22 user1875-key1 +1876 None ssh-rsa 22key4plc22 user1876-key1 +1877 None ssh-rsa 22key4plc22 user1877-key1 +1878 None ssh-rsa 22key4plc22 user1878-key1 +1879 None ssh-rsa 22key4plc22 user1879-key1 +1880 None ssh-rsa 22key4plc22 user1880-key1 +1881 None ssh-rsa 22key4plc22 user1881-key1 +1882 None ssh-rsa 22key4plc22 user1882-key1 +1883 None ssh-rsa 22key4plc22 user1883-key1 +1884 None ssh-rsa 22key4plc22 user1884-key1 +1885 None ssh-rsa 22key4plc22 user1885-key1 +1886 None ssh-rsa 22key4plc22 user1886-key1 +1887 None ssh-rsa 22key4plc22 user1887-key1 +1888 None ssh-rsa 22key4plc22 user1888-key1 +1889 None ssh-rsa 22key4plc22 user1889-key1 +1890 None ssh-rsa 22key4plc22 user1890-key1 +1891 None ssh-rsa 22key4plc22 user1891-key1 +1892 None ssh-rsa 22key4plc22 user1892-key1 +1893 None ssh-rsa 22key4plc22 user1893-key1 +1894 None ssh-rsa 22key4plc22 user1894-key1 +1895 None ssh-rsa 22key4plc22 user1895-key1 +1896 None ssh-rsa 22key4plc22 user1896-key1 +1897 None ssh-rsa 22key4plc22 user1897-key1 +1898 None ssh-rsa 22key4plc22 user1898-key1 +1899 None ssh-rsa 22key4plc22 user1899-key1 +1900 None ssh-rsa 22key4plc22 user1900-key1 +1901 None ssh-rsa 22key4plc22 user1901-key1 +1902 None ssh-rsa 22key4plc22 user1902-key1 +1903 None ssh-rsa 22key4plc22 user1903-key1 +1904 None ssh-rsa 22key4plc22 user1904-key1 +1905 None ssh-rsa 22key4plc22 user1905-key1 +1906 None ssh-rsa 22key4plc22 user1906-key1 +1907 None ssh-rsa 22key4plc22 user1907-key1 +1908 None ssh-rsa 22key4plc22 user1908-key1 +1909 None ssh-rsa 22key4plc22 user1909-key1 +1910 None ssh-rsa 22key4plc22 user1910-key1 +1911 None ssh-rsa 22key4plc22 user1911-key1 +1912 None ssh-rsa 22key4plc22 user1912-key1 +1913 None ssh-rsa 22key4plc22 user1913-key1 +1914 None ssh-rsa 22key4plc22 user1914-key1 +1915 None ssh-rsa 22key4plc22 user1915-key1 +1916 None ssh-rsa 22key4plc22 user1916-key1 +1917 None ssh-rsa 22key4plc22 user1917-key1 +1918 None ssh-rsa 22key4plc22 user1918-key1 +1919 None ssh-rsa 22key4plc22 user1919-key1 +1920 None ssh-rsa 22key4plc22 user1920-key1 +1921 None ssh-rsa 22key4plc22 user1921-key1 +1922 None ssh-rsa 22key4plc22 user1922-key1 +1923 None ssh-rsa 22key4plc22 user1923-key1 +1924 None ssh-rsa 22key4plc22 user1924-key1 +1925 None ssh-rsa 22key4plc22 user1925-key1 +1926 None ssh-rsa 22key4plc22 user1926-key1 +1927 None ssh-rsa 22key4plc22 user1927-key1 +1928 None ssh-rsa 22key4plc22 user1928-key1 +1929 None ssh-rsa 22key4plc22 user1929-key1 +1930 None ssh-rsa 22key4plc22 user1930-key1 +1931 None ssh-rsa 22key4plc22 user1931-key1 +1932 None ssh-rsa 22key4plc22 user1932-key1 +1933 None ssh-rsa 22key4plc22 user1933-key1 +1934 None ssh-rsa 22key4plc22 user1934-key1 +1935 None ssh-rsa 22key4plc22 user1935-key1 +1936 None ssh-rsa 22key4plc22 user1936-key1 +1937 None ssh-rsa 22key4plc22 user1937-key1 +1938 None ssh-rsa 22key4plc22 user1938-key1 +1939 None ssh-rsa 22key4plc22 user1939-key1 +1940 None ssh-rsa 22key4plc22 user1940-key1 +1941 None ssh-rsa 22key4plc22 user1941-key1 +1942 None ssh-rsa 22key4plc22 user1942-key1 +1943 None ssh-rsa 22key4plc22 user1943-key1 +1944 None ssh-rsa 22key4plc22 user1944-key1 +1945 None ssh-rsa 22key4plc22 user1945-key1 +1946 None ssh-rsa 22key4plc22 user1946-key1 +1947 None ssh-rsa 22key4plc22 user1947-key1 +1948 None ssh-rsa 22key4plc22 user1948-key1 +1949 None ssh-rsa 22key4plc22 user1949-key1 +1950 None ssh-rsa 22key4plc22 user1950-key1 +1951 None ssh-rsa 22key4plc22 user1951-key1 +1952 None ssh-rsa 22key4plc22 user1952-key1 +1953 None ssh-rsa 22key4plc22 user1953-key1 +1954 None ssh-rsa 22key4plc22 user1954-key1 +1955 None ssh-rsa 22key4plc22 user1955-key1 +1956 None ssh-rsa 22key4plc22 user1956-key1 +1957 None ssh-rsa 22key4plc22 user1957-key1 +1958 None ssh-rsa 22key4plc22 user1958-key1 +1959 None ssh-rsa 22key4plc22 user1959-key1 +1960 None ssh-rsa 22key4plc22 user1960-key1 +1961 None ssh-rsa 22key4plc22 user1961-key1 +1962 None ssh-rsa 22key4plc22 user1962-key1 +1963 None ssh-rsa 22key4plc22 user1963-key1 +1964 None ssh-rsa 22key4plc22 user1964-key1 +1965 None ssh-rsa 22key4plc22 user1965-key1 +1966 None ssh-rsa 22key4plc22 user1966-key1 +1967 None ssh-rsa 22key4plc22 user1967-key1 +1968 None ssh-rsa 22key4plc22 user1968-key1 +1969 None ssh-rsa 22key4plc22 user1969-key1 +1970 None ssh-rsa 22key4plc22 user1970-key1 +1971 None ssh-rsa 22key4plc22 user1971-key1 +1972 None ssh-rsa 22key4plc22 user1972-key1 +1973 None ssh-rsa 22key4plc22 user1973-key1 +1974 None ssh-rsa 22key4plc22 user1974-key1 +1975 None ssh-rsa 22key4plc22 user1975-key1 +1976 None ssh-rsa 22key4plc22 user1976-key1 +1977 None ssh-rsa 22key4plc22 user1977-key1 +1978 None ssh-rsa 22key4plc22 user1978-key1 +1979 None ssh-rsa 22key4plc22 user1979-key1 +1980 None ssh-rsa 22key4plc22 user1980-key1 +1981 None ssh-rsa 22key4plc22 user1981-key1 +1982 None ssh-rsa 22key4plc22 user1982-key1 +1983 None ssh-rsa 22key4plc22 user1983-key1 +1984 None ssh-rsa 22key4plc22 user1984-key1 +1985 None ssh-rsa 22key4plc22 user1985-key1 +1986 None ssh-rsa 22key4plc22 user1986-key1 +1987 None ssh-rsa 22key4plc22 user1987-key1 +1988 None ssh-rsa 22key4plc22 user1988-key1 +1989 None ssh-rsa 22key4plc22 user1989-key1 +1990 None ssh-rsa 22key4plc22 user1990-key1 +1991 None ssh-rsa 22key4plc22 user1991-key1 +1992 None ssh-rsa 22key4plc22 user1992-key1 +1993 None ssh-rsa 22key4plc22 user1993-key1 +1994 None ssh-rsa 22key4plc22 user1994-key1 +1995 None ssh-rsa 22key4plc22 user1995-key1 +1996 None ssh-rsa 22key4plc22 user1996-key1 +1997 None ssh-rsa 22key4plc22 user1997-key1 +1998 None ssh-rsa 22key4plc22 user1998-key1 +1999 None ssh-rsa 22key4plc22 user1999-key1 +2000 None ssh-rsa 22key4plc22 user2000-key1 +2001 1 ssh-rsa 11key4plc11 user1-key1 +2002 1 ssh-rsa 11key4plc11 user2-key1 +2003 1 ssh-rsa 11key4plc11 user3-key1 +2004 1 ssh-rsa 11key4plc11 user4-key1 +2005 1 ssh-rsa 11key4plc11 user5-key1 +2006 1 ssh-rsa 11key4plc11 user6-key1 +2007 1 ssh-rsa 11key4plc11 user7-key1 +2008 1 ssh-rsa 11key4plc11 user8-key1 +2009 1 ssh-rsa 11key4plc11 user9-key1 +2010 1 ssh-rsa 11key4plc11 user10-key1 +2011 1 ssh-rsa 11key4plc11 user11-key1 +2012 1 ssh-rsa 11key4plc11 user12-key1 +2013 1 ssh-rsa 11key4plc11 user13-key1 +2014 1 ssh-rsa 11key4plc11 user14-key1 +2015 1 ssh-rsa 11key4plc11 user15-key1 +2016 1 ssh-rsa 11key4plc11 user16-key1 +2017 1 ssh-rsa 11key4plc11 user17-key1 +2018 1 ssh-rsa 11key4plc11 user18-key1 +2019 1 ssh-rsa 11key4plc11 user19-key1 +2020 1 ssh-rsa 11key4plc11 user20-key1 +2021 1 ssh-rsa 11key4plc11 user21-key1 +2022 1 ssh-rsa 11key4plc11 user22-key1 +2023 1 ssh-rsa 11key4plc11 user23-key1 +2024 1 ssh-rsa 11key4plc11 user24-key1 +2025 1 ssh-rsa 11key4plc11 user25-key1 +2026 1 ssh-rsa 11key4plc11 user26-key1 +2027 1 ssh-rsa 11key4plc11 user27-key1 +2028 1 ssh-rsa 11key4plc11 user28-key1 +2029 1 ssh-rsa 11key4plc11 user29-key1 +2030 1 ssh-rsa 11key4plc11 user30-key1 +2031 1 ssh-rsa 11key4plc11 user31-key1 +2032 1 ssh-rsa 11key4plc11 user32-key1 +2033 1 ssh-rsa 11key4plc11 user33-key1 +2034 1 ssh-rsa 11key4plc11 user34-key1 +2035 1 ssh-rsa 11key4plc11 user35-key1 +2036 1 ssh-rsa 11key4plc11 user36-key1 +2037 1 ssh-rsa 11key4plc11 user37-key1 +2038 1 ssh-rsa 11key4plc11 user38-key1 +2039 1 ssh-rsa 11key4plc11 user39-key1 +2040 1 ssh-rsa 11key4plc11 user40-key1 +2041 1 ssh-rsa 11key4plc11 user41-key1 +2042 1 ssh-rsa 11key4plc11 user42-key1 +2043 1 ssh-rsa 11key4plc11 user43-key1 +2044 1 ssh-rsa 11key4plc11 user44-key1 +2045 1 ssh-rsa 11key4plc11 user45-key1 +2046 1 ssh-rsa 11key4plc11 user46-key1 +2047 1 ssh-rsa 11key4plc11 user47-key1 +2048 1 ssh-rsa 11key4plc11 user48-key1 +2049 1 ssh-rsa 11key4plc11 user49-key1 +2050 1 ssh-rsa 11key4plc11 user50-key1 +2051 1 ssh-rsa 11key4plc11 user51-key1 +2052 1 ssh-rsa 11key4plc11 user52-key1 +2053 1 ssh-rsa 11key4plc11 user53-key1 +2054 1 ssh-rsa 11key4plc11 user54-key1 +2055 1 ssh-rsa 11key4plc11 user55-key1 +2056 1 ssh-rsa 11key4plc11 user56-key1 +2057 1 ssh-rsa 11key4plc11 user57-key1 +2058 1 ssh-rsa 11key4plc11 user58-key1 +2059 1 ssh-rsa 11key4plc11 user59-key1 +2060 1 ssh-rsa 11key4plc11 user60-key1 +2061 1 ssh-rsa 11key4plc11 user61-key1 +2062 1 ssh-rsa 11key4plc11 user62-key1 +2063 1 ssh-rsa 11key4plc11 user63-key1 +2064 1 ssh-rsa 11key4plc11 user64-key1 +2065 1 ssh-rsa 11key4plc11 user65-key1 +2066 1 ssh-rsa 11key4plc11 user66-key1 +2067 1 ssh-rsa 11key4plc11 user67-key1 +2068 1 ssh-rsa 11key4plc11 user68-key1 +2069 1 ssh-rsa 11key4plc11 user69-key1 +2070 1 ssh-rsa 11key4plc11 user70-key1 +2071 1 ssh-rsa 11key4plc11 user71-key1 +2072 1 ssh-rsa 11key4plc11 user72-key1 +2073 1 ssh-rsa 11key4plc11 user73-key1 +2074 1 ssh-rsa 11key4plc11 user74-key1 +2075 1 ssh-rsa 11key4plc11 user75-key1 +2076 1 ssh-rsa 11key4plc11 user76-key1 +2077 1 ssh-rsa 11key4plc11 user77-key1 +2078 1 ssh-rsa 11key4plc11 user78-key1 +2079 1 ssh-rsa 11key4plc11 user79-key1 +2080 1 ssh-rsa 11key4plc11 user80-key1 +2081 1 ssh-rsa 11key4plc11 user81-key1 +2082 1 ssh-rsa 11key4plc11 user82-key1 +2083 1 ssh-rsa 11key4plc11 user83-key1 +2084 1 ssh-rsa 11key4plc11 user84-key1 +2085 1 ssh-rsa 11key4plc11 user85-key1 +2086 1 ssh-rsa 11key4plc11 user86-key1 +2087 1 ssh-rsa 11key4plc11 user87-key1 +2088 1 ssh-rsa 11key4plc11 user88-key1 +2089 1 ssh-rsa 11key4plc11 user89-key1 +2090 1 ssh-rsa 11key4plc11 user90-key1 +2091 1 ssh-rsa 11key4plc11 user91-key1 +2092 1 ssh-rsa 11key4plc11 user92-key1 +2093 1 ssh-rsa 11key4plc11 user93-key1 +2094 1 ssh-rsa 11key4plc11 user94-key1 +2095 1 ssh-rsa 11key4plc11 user95-key1 +2096 1 ssh-rsa 11key4plc11 user96-key1 +2097 1 ssh-rsa 11key4plc11 user97-key1 +2098 1 ssh-rsa 11key4plc11 user98-key1 +2099 1 ssh-rsa 11key4plc11 user99-key1 +2100 1 ssh-rsa 11key4plc11 user100-key1 +2101 1 ssh-rsa 11key4plc11 user101-key1 +2102 1 ssh-rsa 11key4plc11 user102-key1 +2103 1 ssh-rsa 11key4plc11 user103-key1 +2104 1 ssh-rsa 11key4plc11 user104-key1 +2105 1 ssh-rsa 11key4plc11 user105-key1 +2106 1 ssh-rsa 11key4plc11 user106-key1 +2107 1 ssh-rsa 11key4plc11 user107-key1 +2108 1 ssh-rsa 11key4plc11 user108-key1 +2109 1 ssh-rsa 11key4plc11 user109-key1 +2110 1 ssh-rsa 11key4plc11 user110-key1 +2111 1 ssh-rsa 11key4plc11 user111-key1 +2112 1 ssh-rsa 11key4plc11 user112-key1 +2113 1 ssh-rsa 11key4plc11 user113-key1 +2114 1 ssh-rsa 11key4plc11 user114-key1 +2115 1 ssh-rsa 11key4plc11 user115-key1 +2116 1 ssh-rsa 11key4plc11 user116-key1 +2117 1 ssh-rsa 11key4plc11 user117-key1 +2118 1 ssh-rsa 11key4plc11 user118-key1 +2119 1 ssh-rsa 11key4plc11 user119-key1 +2120 1 ssh-rsa 11key4plc11 user120-key1 +2121 1 ssh-rsa 11key4plc11 user121-key1 +2122 1 ssh-rsa 11key4plc11 user122-key1 +2123 1 ssh-rsa 11key4plc11 user123-key1 +2124 1 ssh-rsa 11key4plc11 user124-key1 +2125 1 ssh-rsa 11key4plc11 user125-key1 +2126 1 ssh-rsa 11key4plc11 user126-key1 +2127 1 ssh-rsa 11key4plc11 user127-key1 +2128 1 ssh-rsa 11key4plc11 user128-key1 +2129 1 ssh-rsa 11key4plc11 user129-key1 +2130 1 ssh-rsa 11key4plc11 user130-key1 +2131 1 ssh-rsa 11key4plc11 user131-key1 +2132 1 ssh-rsa 11key4plc11 user132-key1 +2133 1 ssh-rsa 11key4plc11 user133-key1 +2134 1 ssh-rsa 11key4plc11 user134-key1 +2135 1 ssh-rsa 11key4plc11 user135-key1 +2136 1 ssh-rsa 11key4plc11 user136-key1 +2137 1 ssh-rsa 11key4plc11 user137-key1 +2138 1 ssh-rsa 11key4plc11 user138-key1 +2139 1 ssh-rsa 11key4plc11 user139-key1 +2140 1 ssh-rsa 11key4plc11 user140-key1 +2141 1 ssh-rsa 11key4plc11 user141-key1 +2142 1 ssh-rsa 11key4plc11 user142-key1 +2143 1 ssh-rsa 11key4plc11 user143-key1 +2144 1 ssh-rsa 11key4plc11 user144-key1 +2145 1 ssh-rsa 11key4plc11 user145-key1 +2146 1 ssh-rsa 11key4plc11 user146-key1 +2147 1 ssh-rsa 11key4plc11 user147-key1 +2148 1 ssh-rsa 11key4plc11 user148-key1 +2149 1 ssh-rsa 11key4plc11 user149-key1 +2150 1 ssh-rsa 11key4plc11 user150-key1 +2151 1 ssh-rsa 11key4plc11 user151-key1 +2152 1 ssh-rsa 11key4plc11 user152-key1 +2153 1 ssh-rsa 11key4plc11 user153-key1 +2154 1 ssh-rsa 11key4plc11 user154-key1 +2155 1 ssh-rsa 11key4plc11 user155-key1 +2156 1 ssh-rsa 11key4plc11 user156-key1 +2157 1 ssh-rsa 11key4plc11 user157-key1 +2158 1 ssh-rsa 11key4plc11 user158-key1 +2159 1 ssh-rsa 11key4plc11 user159-key1 +2160 1 ssh-rsa 11key4plc11 user160-key1 +2161 1 ssh-rsa 11key4plc11 user161-key1 +2162 1 ssh-rsa 11key4plc11 user162-key1 +2163 1 ssh-rsa 11key4plc11 user163-key1 +2164 1 ssh-rsa 11key4plc11 user164-key1 +2165 1 ssh-rsa 11key4plc11 user165-key1 +2166 1 ssh-rsa 11key4plc11 user166-key1 +2167 1 ssh-rsa 11key4plc11 user167-key1 +2168 1 ssh-rsa 11key4plc11 user168-key1 +2169 1 ssh-rsa 11key4plc11 user169-key1 +2170 1 ssh-rsa 11key4plc11 user170-key1 +2171 1 ssh-rsa 11key4plc11 user171-key1 +2172 1 ssh-rsa 11key4plc11 user172-key1 +2173 1 ssh-rsa 11key4plc11 user173-key1 +2174 1 ssh-rsa 11key4plc11 user174-key1 +2175 1 ssh-rsa 11key4plc11 user175-key1 +2176 1 ssh-rsa 11key4plc11 user176-key1 +2177 1 ssh-rsa 11key4plc11 user177-key1 +2178 1 ssh-rsa 11key4plc11 user178-key1 +2179 1 ssh-rsa 11key4plc11 user179-key1 +2180 1 ssh-rsa 11key4plc11 user180-key1 +2181 1 ssh-rsa 11key4plc11 user181-key1 +2182 1 ssh-rsa 11key4plc11 user182-key1 +2183 1 ssh-rsa 11key4plc11 user183-key1 +2184 1 ssh-rsa 11key4plc11 user184-key1 +2185 1 ssh-rsa 11key4plc11 user185-key1 +2186 1 ssh-rsa 11key4plc11 user186-key1 +2187 1 ssh-rsa 11key4plc11 user187-key1 +2188 1 ssh-rsa 11key4plc11 user188-key1 +2189 1 ssh-rsa 11key4plc11 user189-key1 +2190 1 ssh-rsa 11key4plc11 user190-key1 +2191 1 ssh-rsa 11key4plc11 user191-key1 +2192 1 ssh-rsa 11key4plc11 user192-key1 +2193 1 ssh-rsa 11key4plc11 user193-key1 +2194 1 ssh-rsa 11key4plc11 user194-key1 +2195 1 ssh-rsa 11key4plc11 user195-key1 +2196 1 ssh-rsa 11key4plc11 user196-key1 +2197 1 ssh-rsa 11key4plc11 user197-key1 +2198 1 ssh-rsa 11key4plc11 user198-key1 +2199 1 ssh-rsa 11key4plc11 user199-key1 +2200 1 ssh-rsa 11key4plc11 user200-key1 +2201 1 ssh-rsa 11key4plc11 user201-key1 +2202 1 ssh-rsa 11key4plc11 user202-key1 +2203 1 ssh-rsa 11key4plc11 user203-key1 +2204 1 ssh-rsa 11key4plc11 user204-key1 +2205 1 ssh-rsa 11key4plc11 user205-key1 +2206 1 ssh-rsa 11key4plc11 user206-key1 +2207 1 ssh-rsa 11key4plc11 user207-key1 +2208 1 ssh-rsa 11key4plc11 user208-key1 +2209 1 ssh-rsa 11key4plc11 user209-key1 +2210 1 ssh-rsa 11key4plc11 user210-key1 +2211 1 ssh-rsa 11key4plc11 user211-key1 +2212 1 ssh-rsa 11key4plc11 user212-key1 +2213 1 ssh-rsa 11key4plc11 user213-key1 +2214 1 ssh-rsa 11key4plc11 user214-key1 +2215 1 ssh-rsa 11key4plc11 user215-key1 +2216 1 ssh-rsa 11key4plc11 user216-key1 +2217 1 ssh-rsa 11key4plc11 user217-key1 +2218 1 ssh-rsa 11key4plc11 user218-key1 +2219 1 ssh-rsa 11key4plc11 user219-key1 +2220 1 ssh-rsa 11key4plc11 user220-key1 +2221 1 ssh-rsa 11key4plc11 user221-key1 +2222 1 ssh-rsa 11key4plc11 user222-key1 +2223 1 ssh-rsa 11key4plc11 user223-key1 +2224 1 ssh-rsa 11key4plc11 user224-key1 +2225 1 ssh-rsa 11key4plc11 user225-key1 +2226 1 ssh-rsa 11key4plc11 user226-key1 +2227 1 ssh-rsa 11key4plc11 user227-key1 +2228 1 ssh-rsa 11key4plc11 user228-key1 +2229 1 ssh-rsa 11key4plc11 user229-key1 +2230 1 ssh-rsa 11key4plc11 user230-key1 +2231 1 ssh-rsa 11key4plc11 user231-key1 +2232 1 ssh-rsa 11key4plc11 user232-key1 +2233 1 ssh-rsa 11key4plc11 user233-key1 +2234 1 ssh-rsa 11key4plc11 user234-key1 +2235 1 ssh-rsa 11key4plc11 user235-key1 +2236 1 ssh-rsa 11key4plc11 user236-key1 +2237 1 ssh-rsa 11key4plc11 user237-key1 +2238 1 ssh-rsa 11key4plc11 user238-key1 +2239 1 ssh-rsa 11key4plc11 user239-key1 +2240 1 ssh-rsa 11key4plc11 user240-key1 +2241 1 ssh-rsa 11key4plc11 user241-key1 +2242 1 ssh-rsa 11key4plc11 user242-key1 +2243 1 ssh-rsa 11key4plc11 user243-key1 +2244 1 ssh-rsa 11key4plc11 user244-key1 +2245 1 ssh-rsa 11key4plc11 user245-key1 +2246 1 ssh-rsa 11key4plc11 user246-key1 +2247 1 ssh-rsa 11key4plc11 user247-key1 +2248 1 ssh-rsa 11key4plc11 user248-key1 +2249 1 ssh-rsa 11key4plc11 user249-key1 +2250 1 ssh-rsa 11key4plc11 user250-key1 +2251 1 ssh-rsa 11key4plc11 user251-key1 +2252 1 ssh-rsa 11key4plc11 user252-key1 +2253 1 ssh-rsa 11key4plc11 user253-key1 +2254 1 ssh-rsa 11key4plc11 user254-key1 +2255 1 ssh-rsa 11key4plc11 user255-key1 +2256 1 ssh-rsa 11key4plc11 user256-key1 +2257 1 ssh-rsa 11key4plc11 user257-key1 +2258 1 ssh-rsa 11key4plc11 user258-key1 +2259 1 ssh-rsa 11key4plc11 user259-key1 +2260 1 ssh-rsa 11key4plc11 user260-key1 +2261 1 ssh-rsa 11key4plc11 user261-key1 +2262 1 ssh-rsa 11key4plc11 user262-key1 +2263 1 ssh-rsa 11key4plc11 user263-key1 +2264 1 ssh-rsa 11key4plc11 user264-key1 +2265 1 ssh-rsa 11key4plc11 user265-key1 +2266 1 ssh-rsa 11key4plc11 user266-key1 +2267 1 ssh-rsa 11key4plc11 user267-key1 +2268 1 ssh-rsa 11key4plc11 user268-key1 +2269 1 ssh-rsa 11key4plc11 user269-key1 +2270 1 ssh-rsa 11key4plc11 user270-key1 +2271 1 ssh-rsa 11key4plc11 user271-key1 +2272 1 ssh-rsa 11key4plc11 user272-key1 +2273 1 ssh-rsa 11key4plc11 user273-key1 +2274 1 ssh-rsa 11key4plc11 user274-key1 +2275 1 ssh-rsa 11key4plc11 user275-key1 +2276 1 ssh-rsa 11key4plc11 user276-key1 +2277 1 ssh-rsa 11key4plc11 user277-key1 +2278 1 ssh-rsa 11key4plc11 user278-key1 +2279 1 ssh-rsa 11key4plc11 user279-key1 +2280 1 ssh-rsa 11key4plc11 user280-key1 +2281 1 ssh-rsa 11key4plc11 user281-key1 +2282 1 ssh-rsa 11key4plc11 user282-key1 +2283 1 ssh-rsa 11key4plc11 user283-key1 +2284 1 ssh-rsa 11key4plc11 user284-key1 +2285 1 ssh-rsa 11key4plc11 user285-key1 +2286 1 ssh-rsa 11key4plc11 user286-key1 +2287 1 ssh-rsa 11key4plc11 user287-key1 +2288 1 ssh-rsa 11key4plc11 user288-key1 +2289 1 ssh-rsa 11key4plc11 user289-key1 +2290 1 ssh-rsa 11key4plc11 user290-key1 +2291 1 ssh-rsa 11key4plc11 user291-key1 +2292 1 ssh-rsa 11key4plc11 user292-key1 +2293 1 ssh-rsa 11key4plc11 user293-key1 +2294 1 ssh-rsa 11key4plc11 user294-key1 +2295 1 ssh-rsa 11key4plc11 user295-key1 +2296 1 ssh-rsa 11key4plc11 user296-key1 +2297 1 ssh-rsa 11key4plc11 user297-key1 +2298 1 ssh-rsa 11key4plc11 user298-key1 +2299 1 ssh-rsa 11key4plc11 user299-key1 +2300 1 ssh-rsa 11key4plc11 user300-key1 +2301 1 ssh-rsa 11key4plc11 user301-key1 +2302 1 ssh-rsa 11key4plc11 user302-key1 +2303 1 ssh-rsa 11key4plc11 user303-key1 +2304 1 ssh-rsa 11key4plc11 user304-key1 +2305 1 ssh-rsa 11key4plc11 user305-key1 +2306 1 ssh-rsa 11key4plc11 user306-key1 +2307 1 ssh-rsa 11key4plc11 user307-key1 +2308 1 ssh-rsa 11key4plc11 user308-key1 +2309 1 ssh-rsa 11key4plc11 user309-key1 +2310 1 ssh-rsa 11key4plc11 user310-key1 +2311 1 ssh-rsa 11key4plc11 user311-key1 +2312 1 ssh-rsa 11key4plc11 user312-key1 +2313 1 ssh-rsa 11key4plc11 user313-key1 +2314 1 ssh-rsa 11key4plc11 user314-key1 +2315 1 ssh-rsa 11key4plc11 user315-key1 +2316 1 ssh-rsa 11key4plc11 user316-key1 +2317 1 ssh-rsa 11key4plc11 user317-key1 +2318 1 ssh-rsa 11key4plc11 user318-key1 +2319 1 ssh-rsa 11key4plc11 user319-key1 +2320 1 ssh-rsa 11key4plc11 user320-key1 +2321 1 ssh-rsa 11key4plc11 user321-key1 +2322 1 ssh-rsa 11key4plc11 user322-key1 +2323 1 ssh-rsa 11key4plc11 user323-key1 +2324 1 ssh-rsa 11key4plc11 user324-key1 +2325 1 ssh-rsa 11key4plc11 user325-key1 +2326 1 ssh-rsa 11key4plc11 user326-key1 +2327 1 ssh-rsa 11key4plc11 user327-key1 +2328 1 ssh-rsa 11key4plc11 user328-key1 +2329 1 ssh-rsa 11key4plc11 user329-key1 +2330 1 ssh-rsa 11key4plc11 user330-key1 +2331 1 ssh-rsa 11key4plc11 user331-key1 +2332 1 ssh-rsa 11key4plc11 user332-key1 +2333 1 ssh-rsa 11key4plc11 user333-key1 +2334 1 ssh-rsa 11key4plc11 user334-key1 +2335 1 ssh-rsa 11key4plc11 user335-key1 +2336 1 ssh-rsa 11key4plc11 user336-key1 +2337 1 ssh-rsa 11key4plc11 user337-key1 +2338 1 ssh-rsa 11key4plc11 user338-key1 +2339 1 ssh-rsa 11key4plc11 user339-key1 +2340 1 ssh-rsa 11key4plc11 user340-key1 +2341 1 ssh-rsa 11key4plc11 user341-key1 +2342 1 ssh-rsa 11key4plc11 user342-key1 +2343 1 ssh-rsa 11key4plc11 user343-key1 +2344 1 ssh-rsa 11key4plc11 user344-key1 +2345 1 ssh-rsa 11key4plc11 user345-key1 +2346 1 ssh-rsa 11key4plc11 user346-key1 +2347 1 ssh-rsa 11key4plc11 user347-key1 +2348 1 ssh-rsa 11key4plc11 user348-key1 +2349 1 ssh-rsa 11key4plc11 user349-key1 +2350 1 ssh-rsa 11key4plc11 user350-key1 +2351 1 ssh-rsa 11key4plc11 user351-key1 +2352 1 ssh-rsa 11key4plc11 user352-key1 +2353 1 ssh-rsa 11key4plc11 user353-key1 +2354 1 ssh-rsa 11key4plc11 user354-key1 +2355 1 ssh-rsa 11key4plc11 user355-key1 +2356 1 ssh-rsa 11key4plc11 user356-key1 +2357 1 ssh-rsa 11key4plc11 user357-key1 +2358 1 ssh-rsa 11key4plc11 user358-key1 +2359 1 ssh-rsa 11key4plc11 user359-key1 +2360 1 ssh-rsa 11key4plc11 user360-key1 +2361 1 ssh-rsa 11key4plc11 user361-key1 +2362 1 ssh-rsa 11key4plc11 user362-key1 +2363 1 ssh-rsa 11key4plc11 user363-key1 +2364 1 ssh-rsa 11key4plc11 user364-key1 +2365 1 ssh-rsa 11key4plc11 user365-key1 +2366 1 ssh-rsa 11key4plc11 user366-key1 +2367 1 ssh-rsa 11key4plc11 user367-key1 +2368 1 ssh-rsa 11key4plc11 user368-key1 +2369 1 ssh-rsa 11key4plc11 user369-key1 +2370 1 ssh-rsa 11key4plc11 user370-key1 +2371 1 ssh-rsa 11key4plc11 user371-key1 +2372 1 ssh-rsa 11key4plc11 user372-key1 +2373 1 ssh-rsa 11key4plc11 user373-key1 +2374 1 ssh-rsa 11key4plc11 user374-key1 +2375 1 ssh-rsa 11key4plc11 user375-key1 +2376 1 ssh-rsa 11key4plc11 user376-key1 +2377 1 ssh-rsa 11key4plc11 user377-key1 +2378 1 ssh-rsa 11key4plc11 user378-key1 +2379 1 ssh-rsa 11key4plc11 user379-key1 +2380 1 ssh-rsa 11key4plc11 user380-key1 +2381 1 ssh-rsa 11key4plc11 user381-key1 +2382 1 ssh-rsa 11key4plc11 user382-key1 +2383 1 ssh-rsa 11key4plc11 user383-key1 +2384 1 ssh-rsa 11key4plc11 user384-key1 +2385 1 ssh-rsa 11key4plc11 user385-key1 +2386 1 ssh-rsa 11key4plc11 user386-key1 +2387 1 ssh-rsa 11key4plc11 user387-key1 +2388 1 ssh-rsa 11key4plc11 user388-key1 +2389 1 ssh-rsa 11key4plc11 user389-key1 +2390 1 ssh-rsa 11key4plc11 user390-key1 +2391 1 ssh-rsa 11key4plc11 user391-key1 +2392 1 ssh-rsa 11key4plc11 user392-key1 +2393 1 ssh-rsa 11key4plc11 user393-key1 +2394 1 ssh-rsa 11key4plc11 user394-key1 +2395 1 ssh-rsa 11key4plc11 user395-key1 +2396 1 ssh-rsa 11key4plc11 user396-key1 +2397 1 ssh-rsa 11key4plc11 user397-key1 +2398 1 ssh-rsa 11key4plc11 user398-key1 +2399 1 ssh-rsa 11key4plc11 user399-key1 +2400 1 ssh-rsa 11key4plc11 user400-key1 +2401 1 ssh-rsa 11key4plc11 user401-key1 +2402 1 ssh-rsa 11key4plc11 user402-key1 +2403 1 ssh-rsa 11key4plc11 user403-key1 +2404 1 ssh-rsa 11key4plc11 user404-key1 +2405 1 ssh-rsa 11key4plc11 user405-key1 +2406 1 ssh-rsa 11key4plc11 user406-key1 +2407 1 ssh-rsa 11key4plc11 user407-key1 +2408 1 ssh-rsa 11key4plc11 user408-key1 +2409 1 ssh-rsa 11key4plc11 user409-key1 +2410 1 ssh-rsa 11key4plc11 user410-key1 +2411 1 ssh-rsa 11key4plc11 user411-key1 +2412 1 ssh-rsa 11key4plc11 user412-key1 +2413 1 ssh-rsa 11key4plc11 user413-key1 +2414 1 ssh-rsa 11key4plc11 user414-key1 +2415 1 ssh-rsa 11key4plc11 user415-key1 +2416 1 ssh-rsa 11key4plc11 user416-key1 +2417 1 ssh-rsa 11key4plc11 user417-key1 +2418 1 ssh-rsa 11key4plc11 user418-key1 +2419 1 ssh-rsa 11key4plc11 user419-key1 +2420 1 ssh-rsa 11key4plc11 user420-key1 +2421 1 ssh-rsa 11key4plc11 user421-key1 +2422 1 ssh-rsa 11key4plc11 user422-key1 +2423 1 ssh-rsa 11key4plc11 user423-key1 +2424 1 ssh-rsa 11key4plc11 user424-key1 +2425 1 ssh-rsa 11key4plc11 user425-key1 +2426 1 ssh-rsa 11key4plc11 user426-key1 +2427 1 ssh-rsa 11key4plc11 user427-key1 +2428 1 ssh-rsa 11key4plc11 user428-key1 +2429 1 ssh-rsa 11key4plc11 user429-key1 +2430 1 ssh-rsa 11key4plc11 user430-key1 +2431 1 ssh-rsa 11key4plc11 user431-key1 +2432 1 ssh-rsa 11key4plc11 user432-key1 +2433 1 ssh-rsa 11key4plc11 user433-key1 +2434 1 ssh-rsa 11key4plc11 user434-key1 +2435 1 ssh-rsa 11key4plc11 user435-key1 +2436 1 ssh-rsa 11key4plc11 user436-key1 +2437 1 ssh-rsa 11key4plc11 user437-key1 +2438 1 ssh-rsa 11key4plc11 user438-key1 +2439 1 ssh-rsa 11key4plc11 user439-key1 +2440 1 ssh-rsa 11key4plc11 user440-key1 +2441 1 ssh-rsa 11key4plc11 user441-key1 +2442 1 ssh-rsa 11key4plc11 user442-key1 +2443 1 ssh-rsa 11key4plc11 user443-key1 +2444 1 ssh-rsa 11key4plc11 user444-key1 +2445 1 ssh-rsa 11key4plc11 user445-key1 +2446 1 ssh-rsa 11key4plc11 user446-key1 +2447 1 ssh-rsa 11key4plc11 user447-key1 +2448 1 ssh-rsa 11key4plc11 user448-key1 +2449 1 ssh-rsa 11key4plc11 user449-key1 +2450 1 ssh-rsa 11key4plc11 user450-key1 +2451 1 ssh-rsa 11key4plc11 user451-key1 +2452 1 ssh-rsa 11key4plc11 user452-key1 +2453 1 ssh-rsa 11key4plc11 user453-key1 +2454 1 ssh-rsa 11key4plc11 user454-key1 +2455 1 ssh-rsa 11key4plc11 user455-key1 +2456 1 ssh-rsa 11key4plc11 user456-key1 +2457 1 ssh-rsa 11key4plc11 user457-key1 +2458 1 ssh-rsa 11key4plc11 user458-key1 +2459 1 ssh-rsa 11key4plc11 user459-key1 +2460 1 ssh-rsa 11key4plc11 user460-key1 +2461 1 ssh-rsa 11key4plc11 user461-key1 +2462 1 ssh-rsa 11key4plc11 user462-key1 +2463 1 ssh-rsa 11key4plc11 user463-key1 +2464 1 ssh-rsa 11key4plc11 user464-key1 +2465 1 ssh-rsa 11key4plc11 user465-key1 +2466 1 ssh-rsa 11key4plc11 user466-key1 +2467 1 ssh-rsa 11key4plc11 user467-key1 +2468 1 ssh-rsa 11key4plc11 user468-key1 +2469 1 ssh-rsa 11key4plc11 user469-key1 +2470 1 ssh-rsa 11key4plc11 user470-key1 +2471 1 ssh-rsa 11key4plc11 user471-key1 +2472 1 ssh-rsa 11key4plc11 user472-key1 +2473 1 ssh-rsa 11key4plc11 user473-key1 +2474 1 ssh-rsa 11key4plc11 user474-key1 +2475 1 ssh-rsa 11key4plc11 user475-key1 +2476 1 ssh-rsa 11key4plc11 user476-key1 +2477 1 ssh-rsa 11key4plc11 user477-key1 +2478 1 ssh-rsa 11key4plc11 user478-key1 +2479 1 ssh-rsa 11key4plc11 user479-key1 +2480 1 ssh-rsa 11key4plc11 user480-key1 +2481 1 ssh-rsa 11key4plc11 user481-key1 +2482 1 ssh-rsa 11key4plc11 user482-key1 +2483 1 ssh-rsa 11key4plc11 user483-key1 +2484 1 ssh-rsa 11key4plc11 user484-key1 +2485 1 ssh-rsa 11key4plc11 user485-key1 +2486 1 ssh-rsa 11key4plc11 user486-key1 +2487 1 ssh-rsa 11key4plc11 user487-key1 +2488 1 ssh-rsa 11key4plc11 user488-key1 +2489 1 ssh-rsa 11key4plc11 user489-key1 +2490 1 ssh-rsa 11key4plc11 user490-key1 +2491 1 ssh-rsa 11key4plc11 user491-key1 +2492 1 ssh-rsa 11key4plc11 user492-key1 +2493 1 ssh-rsa 11key4plc11 user493-key1 +2494 1 ssh-rsa 11key4plc11 user494-key1 +2495 1 ssh-rsa 11key4plc11 user495-key1 +2496 1 ssh-rsa 11key4plc11 user496-key1 +2497 1 ssh-rsa 11key4plc11 user497-key1 +2498 1 ssh-rsa 11key4plc11 user498-key1 +2499 1 ssh-rsa 11key4plc11 user499-key1 +2500 1 ssh-rsa 11key4plc11 user500-key1 +2501 1 ssh-rsa 11key4plc11 user501-key1 +2502 1 ssh-rsa 11key4plc11 user502-key1 +2503 1 ssh-rsa 11key4plc11 user503-key1 +2504 1 ssh-rsa 11key4plc11 user504-key1 +2505 1 ssh-rsa 11key4plc11 user505-key1 +2506 1 ssh-rsa 11key4plc11 user506-key1 +2507 1 ssh-rsa 11key4plc11 user507-key1 +2508 1 ssh-rsa 11key4plc11 user508-key1 +2509 1 ssh-rsa 11key4plc11 user509-key1 +2510 1 ssh-rsa 11key4plc11 user510-key1 +2511 1 ssh-rsa 11key4plc11 user511-key1 +2512 1 ssh-rsa 11key4plc11 user512-key1 +2513 1 ssh-rsa 11key4plc11 user513-key1 +2514 1 ssh-rsa 11key4plc11 user514-key1 +2515 1 ssh-rsa 11key4plc11 user515-key1 +2516 1 ssh-rsa 11key4plc11 user516-key1 +2517 1 ssh-rsa 11key4plc11 user517-key1 +2518 1 ssh-rsa 11key4plc11 user518-key1 +2519 1 ssh-rsa 11key4plc11 user519-key1 +2520 1 ssh-rsa 11key4plc11 user520-key1 +2521 1 ssh-rsa 11key4plc11 user521-key1 +2522 1 ssh-rsa 11key4plc11 user522-key1 +2523 1 ssh-rsa 11key4plc11 user523-key1 +2524 1 ssh-rsa 11key4plc11 user524-key1 +2525 1 ssh-rsa 11key4plc11 user525-key1 +2526 1 ssh-rsa 11key4plc11 user526-key1 +2527 1 ssh-rsa 11key4plc11 user527-key1 +2528 1 ssh-rsa 11key4plc11 user528-key1 +2529 1 ssh-rsa 11key4plc11 user529-key1 +2530 1 ssh-rsa 11key4plc11 user530-key1 +2531 1 ssh-rsa 11key4plc11 user531-key1 +2532 1 ssh-rsa 11key4plc11 user532-key1 +2533 1 ssh-rsa 11key4plc11 user533-key1 +2534 1 ssh-rsa 11key4plc11 user534-key1 +2535 1 ssh-rsa 11key4plc11 user535-key1 +2536 1 ssh-rsa 11key4plc11 user536-key1 +2537 1 ssh-rsa 11key4plc11 user537-key1 +2538 1 ssh-rsa 11key4plc11 user538-key1 +2539 1 ssh-rsa 11key4plc11 user539-key1 +2540 1 ssh-rsa 11key4plc11 user540-key1 +2541 1 ssh-rsa 11key4plc11 user541-key1 +2542 1 ssh-rsa 11key4plc11 user542-key1 +2543 1 ssh-rsa 11key4plc11 user543-key1 +2544 1 ssh-rsa 11key4plc11 user544-key1 +2545 1 ssh-rsa 11key4plc11 user545-key1 +2546 1 ssh-rsa 11key4plc11 user546-key1 +2547 1 ssh-rsa 11key4plc11 user547-key1 +2548 1 ssh-rsa 11key4plc11 user548-key1 +2549 1 ssh-rsa 11key4plc11 user549-key1 +2550 1 ssh-rsa 11key4plc11 user550-key1 +2551 1 ssh-rsa 11key4plc11 user551-key1 +2552 1 ssh-rsa 11key4plc11 user552-key1 +2553 1 ssh-rsa 11key4plc11 user553-key1 +2554 1 ssh-rsa 11key4plc11 user554-key1 +2555 1 ssh-rsa 11key4plc11 user555-key1 +2556 1 ssh-rsa 11key4plc11 user556-key1 +2557 1 ssh-rsa 11key4plc11 user557-key1 +2558 1 ssh-rsa 11key4plc11 user558-key1 +2559 1 ssh-rsa 11key4plc11 user559-key1 +2560 1 ssh-rsa 11key4plc11 user560-key1 +2561 1 ssh-rsa 11key4plc11 user561-key1 +2562 1 ssh-rsa 11key4plc11 user562-key1 +2563 1 ssh-rsa 11key4plc11 user563-key1 +2564 1 ssh-rsa 11key4plc11 user564-key1 +2565 1 ssh-rsa 11key4plc11 user565-key1 +2566 1 ssh-rsa 11key4plc11 user566-key1 +2567 1 ssh-rsa 11key4plc11 user567-key1 +2568 1 ssh-rsa 11key4plc11 user568-key1 +2569 1 ssh-rsa 11key4plc11 user569-key1 +2570 1 ssh-rsa 11key4plc11 user570-key1 +2571 1 ssh-rsa 11key4plc11 user571-key1 +2572 1 ssh-rsa 11key4plc11 user572-key1 +2573 1 ssh-rsa 11key4plc11 user573-key1 +2574 1 ssh-rsa 11key4plc11 user574-key1 +2575 1 ssh-rsa 11key4plc11 user575-key1 +2576 1 ssh-rsa 11key4plc11 user576-key1 +2577 1 ssh-rsa 11key4plc11 user577-key1 +2578 1 ssh-rsa 11key4plc11 user578-key1 +2579 1 ssh-rsa 11key4plc11 user579-key1 +2580 1 ssh-rsa 11key4plc11 user580-key1 +2581 1 ssh-rsa 11key4plc11 user581-key1 +2582 1 ssh-rsa 11key4plc11 user582-key1 +2583 1 ssh-rsa 11key4plc11 user583-key1 +2584 1 ssh-rsa 11key4plc11 user584-key1 +2585 1 ssh-rsa 11key4plc11 user585-key1 +2586 1 ssh-rsa 11key4plc11 user586-key1 +2587 1 ssh-rsa 11key4plc11 user587-key1 +2588 1 ssh-rsa 11key4plc11 user588-key1 +2589 1 ssh-rsa 11key4plc11 user589-key1 +2590 1 ssh-rsa 11key4plc11 user590-key1 +2591 1 ssh-rsa 11key4plc11 user591-key1 +2592 1 ssh-rsa 11key4plc11 user592-key1 +2593 1 ssh-rsa 11key4plc11 user593-key1 +2594 1 ssh-rsa 11key4plc11 user594-key1 +2595 1 ssh-rsa 11key4plc11 user595-key1 +2596 1 ssh-rsa 11key4plc11 user596-key1 +2597 1 ssh-rsa 11key4plc11 user597-key1 +2598 1 ssh-rsa 11key4plc11 user598-key1 +2599 1 ssh-rsa 11key4plc11 user599-key1 +2600 1 ssh-rsa 11key4plc11 user600-key1 +2601 1 ssh-rsa 11key4plc11 user601-key1 +2602 1 ssh-rsa 11key4plc11 user602-key1 +2603 1 ssh-rsa 11key4plc11 user603-key1 +2604 1 ssh-rsa 11key4plc11 user604-key1 +2605 1 ssh-rsa 11key4plc11 user605-key1 +2606 1 ssh-rsa 11key4plc11 user606-key1 +2607 1 ssh-rsa 11key4plc11 user607-key1 +2608 1 ssh-rsa 11key4plc11 user608-key1 +2609 1 ssh-rsa 11key4plc11 user609-key1 +2610 1 ssh-rsa 11key4plc11 user610-key1 +2611 1 ssh-rsa 11key4plc11 user611-key1 +2612 1 ssh-rsa 11key4plc11 user612-key1 +2613 1 ssh-rsa 11key4plc11 user613-key1 +2614 1 ssh-rsa 11key4plc11 user614-key1 +2615 1 ssh-rsa 11key4plc11 user615-key1 +2616 1 ssh-rsa 11key4plc11 user616-key1 +2617 1 ssh-rsa 11key4plc11 user617-key1 +2618 1 ssh-rsa 11key4plc11 user618-key1 +2619 1 ssh-rsa 11key4plc11 user619-key1 +2620 1 ssh-rsa 11key4plc11 user620-key1 +2621 1 ssh-rsa 11key4plc11 user621-key1 +2622 1 ssh-rsa 11key4plc11 user622-key1 +2623 1 ssh-rsa 11key4plc11 user623-key1 +2624 1 ssh-rsa 11key4plc11 user624-key1 +2625 1 ssh-rsa 11key4plc11 user625-key1 +2626 1 ssh-rsa 11key4plc11 user626-key1 +2627 1 ssh-rsa 11key4plc11 user627-key1 +2628 1 ssh-rsa 11key4plc11 user628-key1 +2629 1 ssh-rsa 11key4plc11 user629-key1 +2630 1 ssh-rsa 11key4plc11 user630-key1 +2631 1 ssh-rsa 11key4plc11 user631-key1 +2632 1 ssh-rsa 11key4plc11 user632-key1 +2633 1 ssh-rsa 11key4plc11 user633-key1 +2634 1 ssh-rsa 11key4plc11 user634-key1 +2635 1 ssh-rsa 11key4plc11 user635-key1 +2636 1 ssh-rsa 11key4plc11 user636-key1 +2637 1 ssh-rsa 11key4plc11 user637-key1 +2638 1 ssh-rsa 11key4plc11 user638-key1 +2639 1 ssh-rsa 11key4plc11 user639-key1 +2640 1 ssh-rsa 11key4plc11 user640-key1 +2641 1 ssh-rsa 11key4plc11 user641-key1 +2642 1 ssh-rsa 11key4plc11 user642-key1 +2643 1 ssh-rsa 11key4plc11 user643-key1 +2644 1 ssh-rsa 11key4plc11 user644-key1 +2645 1 ssh-rsa 11key4plc11 user645-key1 +2646 1 ssh-rsa 11key4plc11 user646-key1 +2647 1 ssh-rsa 11key4plc11 user647-key1 +2648 1 ssh-rsa 11key4plc11 user648-key1 +2649 1 ssh-rsa 11key4plc11 user649-key1 +2650 1 ssh-rsa 11key4plc11 user650-key1 +2651 1 ssh-rsa 11key4plc11 user651-key1 +2652 1 ssh-rsa 11key4plc11 user652-key1 +2653 1 ssh-rsa 11key4plc11 user653-key1 +2654 1 ssh-rsa 11key4plc11 user654-key1 +2655 1 ssh-rsa 11key4plc11 user655-key1 +2656 1 ssh-rsa 11key4plc11 user656-key1 +2657 1 ssh-rsa 11key4plc11 user657-key1 +2658 1 ssh-rsa 11key4plc11 user658-key1 +2659 1 ssh-rsa 11key4plc11 user659-key1 +2660 1 ssh-rsa 11key4plc11 user660-key1 +2661 1 ssh-rsa 11key4plc11 user661-key1 +2662 1 ssh-rsa 11key4plc11 user662-key1 +2663 1 ssh-rsa 11key4plc11 user663-key1 +2664 1 ssh-rsa 11key4plc11 user664-key1 +2665 1 ssh-rsa 11key4plc11 user665-key1 +2666 1 ssh-rsa 11key4plc11 user666-key1 +2667 1 ssh-rsa 11key4plc11 user667-key1 +2668 1 ssh-rsa 11key4plc11 user668-key1 +2669 1 ssh-rsa 11key4plc11 user669-key1 +2670 1 ssh-rsa 11key4plc11 user670-key1 +2671 1 ssh-rsa 11key4plc11 user671-key1 +2672 1 ssh-rsa 11key4plc11 user672-key1 +2673 1 ssh-rsa 11key4plc11 user673-key1 +2674 1 ssh-rsa 11key4plc11 user674-key1 +2675 1 ssh-rsa 11key4plc11 user675-key1 +2676 1 ssh-rsa 11key4plc11 user676-key1 +2677 1 ssh-rsa 11key4plc11 user677-key1 +2678 1 ssh-rsa 11key4plc11 user678-key1 +2679 1 ssh-rsa 11key4plc11 user679-key1 +2680 1 ssh-rsa 11key4plc11 user680-key1 +2681 1 ssh-rsa 11key4plc11 user681-key1 +2682 1 ssh-rsa 11key4plc11 user682-key1 +2683 1 ssh-rsa 11key4plc11 user683-key1 +2684 1 ssh-rsa 11key4plc11 user684-key1 +2685 1 ssh-rsa 11key4plc11 user685-key1 +2686 1 ssh-rsa 11key4plc11 user686-key1 +2687 1 ssh-rsa 11key4plc11 user687-key1 +2688 1 ssh-rsa 11key4plc11 user688-key1 +2689 1 ssh-rsa 11key4plc11 user689-key1 +2690 1 ssh-rsa 11key4plc11 user690-key1 +2691 1 ssh-rsa 11key4plc11 user691-key1 +2692 1 ssh-rsa 11key4plc11 user692-key1 +2693 1 ssh-rsa 11key4plc11 user693-key1 +2694 1 ssh-rsa 11key4plc11 user694-key1 +2695 1 ssh-rsa 11key4plc11 user695-key1 +2696 1 ssh-rsa 11key4plc11 user696-key1 +2697 1 ssh-rsa 11key4plc11 user697-key1 +2698 1 ssh-rsa 11key4plc11 user698-key1 +2699 1 ssh-rsa 11key4plc11 user699-key1 +2700 1 ssh-rsa 11key4plc11 user700-key1 +2701 1 ssh-rsa 11key4plc11 user701-key1 +2702 1 ssh-rsa 11key4plc11 user702-key1 +2703 1 ssh-rsa 11key4plc11 user703-key1 +2704 1 ssh-rsa 11key4plc11 user704-key1 +2705 1 ssh-rsa 11key4plc11 user705-key1 +2706 1 ssh-rsa 11key4plc11 user706-key1 +2707 1 ssh-rsa 11key4plc11 user707-key1 +2708 1 ssh-rsa 11key4plc11 user708-key1 +2709 1 ssh-rsa 11key4plc11 user709-key1 +2710 1 ssh-rsa 11key4plc11 user710-key1 +2711 1 ssh-rsa 11key4plc11 user711-key1 +2712 1 ssh-rsa 11key4plc11 user712-key1 +2713 1 ssh-rsa 11key4plc11 user713-key1 +2714 1 ssh-rsa 11key4plc11 user714-key1 +2715 1 ssh-rsa 11key4plc11 user715-key1 +2716 1 ssh-rsa 11key4plc11 user716-key1 +2717 1 ssh-rsa 11key4plc11 user717-key1 +2718 1 ssh-rsa 11key4plc11 user718-key1 +2719 1 ssh-rsa 11key4plc11 user719-key1 +2720 1 ssh-rsa 11key4plc11 user720-key1 +2721 1 ssh-rsa 11key4plc11 user721-key1 +2722 1 ssh-rsa 11key4plc11 user722-key1 +2723 1 ssh-rsa 11key4plc11 user723-key1 +2724 1 ssh-rsa 11key4plc11 user724-key1 +2725 1 ssh-rsa 11key4plc11 user725-key1 +2726 1 ssh-rsa 11key4plc11 user726-key1 +2727 1 ssh-rsa 11key4plc11 user727-key1 +2728 1 ssh-rsa 11key4plc11 user728-key1 +2729 1 ssh-rsa 11key4plc11 user729-key1 +2730 1 ssh-rsa 11key4plc11 user730-key1 +2731 1 ssh-rsa 11key4plc11 user731-key1 +2732 1 ssh-rsa 11key4plc11 user732-key1 +2733 1 ssh-rsa 11key4plc11 user733-key1 +2734 1 ssh-rsa 11key4plc11 user734-key1 +2735 1 ssh-rsa 11key4plc11 user735-key1 +2736 1 ssh-rsa 11key4plc11 user736-key1 +2737 1 ssh-rsa 11key4plc11 user737-key1 +2738 1 ssh-rsa 11key4plc11 user738-key1 +2739 1 ssh-rsa 11key4plc11 user739-key1 +2740 1 ssh-rsa 11key4plc11 user740-key1 +2741 1 ssh-rsa 11key4plc11 user741-key1 +2742 1 ssh-rsa 11key4plc11 user742-key1 +2743 1 ssh-rsa 11key4plc11 user743-key1 +2744 1 ssh-rsa 11key4plc11 user744-key1 +2745 1 ssh-rsa 11key4plc11 user745-key1 +2746 1 ssh-rsa 11key4plc11 user746-key1 +2747 1 ssh-rsa 11key4plc11 user747-key1 +2748 1 ssh-rsa 11key4plc11 user748-key1 +2749 1 ssh-rsa 11key4plc11 user749-key1 +2750 1 ssh-rsa 11key4plc11 user750-key1 +2751 1 ssh-rsa 11key4plc11 user751-key1 +2752 1 ssh-rsa 11key4plc11 user752-key1 +2753 1 ssh-rsa 11key4plc11 user753-key1 +2754 1 ssh-rsa 11key4plc11 user754-key1 +2755 1 ssh-rsa 11key4plc11 user755-key1 +2756 1 ssh-rsa 11key4plc11 user756-key1 +2757 1 ssh-rsa 11key4plc11 user757-key1 +2758 1 ssh-rsa 11key4plc11 user758-key1 +2759 1 ssh-rsa 11key4plc11 user759-key1 +2760 1 ssh-rsa 11key4plc11 user760-key1 +2761 1 ssh-rsa 11key4plc11 user761-key1 +2762 1 ssh-rsa 11key4plc11 user762-key1 +2763 1 ssh-rsa 11key4plc11 user763-key1 +2764 1 ssh-rsa 11key4plc11 user764-key1 +2765 1 ssh-rsa 11key4plc11 user765-key1 +2766 1 ssh-rsa 11key4plc11 user766-key1 +2767 1 ssh-rsa 11key4plc11 user767-key1 +2768 1 ssh-rsa 11key4plc11 user768-key1 +2769 1 ssh-rsa 11key4plc11 user769-key1 +2770 1 ssh-rsa 11key4plc11 user770-key1 +2771 1 ssh-rsa 11key4plc11 user771-key1 +2772 1 ssh-rsa 11key4plc11 user772-key1 +2773 1 ssh-rsa 11key4plc11 user773-key1 +2774 1 ssh-rsa 11key4plc11 user774-key1 +2775 1 ssh-rsa 11key4plc11 user775-key1 +2776 1 ssh-rsa 11key4plc11 user776-key1 +2777 1 ssh-rsa 11key4plc11 user777-key1 +2778 1 ssh-rsa 11key4plc11 user778-key1 +2779 1 ssh-rsa 11key4plc11 user779-key1 +2780 1 ssh-rsa 11key4plc11 user780-key1 +2781 1 ssh-rsa 11key4plc11 user781-key1 +2782 1 ssh-rsa 11key4plc11 user782-key1 +2783 1 ssh-rsa 11key4plc11 user783-key1 +2784 1 ssh-rsa 11key4plc11 user784-key1 +2785 1 ssh-rsa 11key4plc11 user785-key1 +2786 1 ssh-rsa 11key4plc11 user786-key1 +2787 1 ssh-rsa 11key4plc11 user787-key1 +2788 1 ssh-rsa 11key4plc11 user788-key1 +2789 1 ssh-rsa 11key4plc11 user789-key1 +2790 1 ssh-rsa 11key4plc11 user790-key1 +2791 1 ssh-rsa 11key4plc11 user791-key1 +2792 1 ssh-rsa 11key4plc11 user792-key1 +2793 1 ssh-rsa 11key4plc11 user793-key1 +2794 1 ssh-rsa 11key4plc11 user794-key1 +2795 1 ssh-rsa 11key4plc11 user795-key1 +2796 1 ssh-rsa 11key4plc11 user796-key1 +2797 1 ssh-rsa 11key4plc11 user797-key1 +2798 1 ssh-rsa 11key4plc11 user798-key1 +2799 1 ssh-rsa 11key4plc11 user799-key1 +2800 1 ssh-rsa 11key4plc11 user800-key1 +2801 1 ssh-rsa 11key4plc11 user801-key1 +2802 1 ssh-rsa 11key4plc11 user802-key1 +2803 1 ssh-rsa 11key4plc11 user803-key1 +2804 1 ssh-rsa 11key4plc11 user804-key1 +2805 1 ssh-rsa 11key4plc11 user805-key1 +2806 1 ssh-rsa 11key4plc11 user806-key1 +2807 1 ssh-rsa 11key4plc11 user807-key1 +2808 1 ssh-rsa 11key4plc11 user808-key1 +2809 1 ssh-rsa 11key4plc11 user809-key1 +2810 1 ssh-rsa 11key4plc11 user810-key1 +2811 1 ssh-rsa 11key4plc11 user811-key1 +2812 1 ssh-rsa 11key4plc11 user812-key1 +2813 1 ssh-rsa 11key4plc11 user813-key1 +2814 1 ssh-rsa 11key4plc11 user814-key1 +2815 1 ssh-rsa 11key4plc11 user815-key1 +2816 1 ssh-rsa 11key4plc11 user816-key1 +2817 1 ssh-rsa 11key4plc11 user817-key1 +2818 1 ssh-rsa 11key4plc11 user818-key1 +2819 1 ssh-rsa 11key4plc11 user819-key1 +2820 1 ssh-rsa 11key4plc11 user820-key1 +2821 1 ssh-rsa 11key4plc11 user821-key1 +2822 1 ssh-rsa 11key4plc11 user822-key1 +2823 1 ssh-rsa 11key4plc11 user823-key1 +2824 1 ssh-rsa 11key4plc11 user824-key1 +2825 1 ssh-rsa 11key4plc11 user825-key1 +2826 1 ssh-rsa 11key4plc11 user826-key1 +2827 1 ssh-rsa 11key4plc11 user827-key1 +2828 1 ssh-rsa 11key4plc11 user828-key1 +2829 1 ssh-rsa 11key4plc11 user829-key1 +2830 1 ssh-rsa 11key4plc11 user830-key1 +2831 1 ssh-rsa 11key4plc11 user831-key1 +2832 1 ssh-rsa 11key4plc11 user832-key1 +2833 1 ssh-rsa 11key4plc11 user833-key1 +2834 1 ssh-rsa 11key4plc11 user834-key1 +2835 1 ssh-rsa 11key4plc11 user835-key1 +2836 1 ssh-rsa 11key4plc11 user836-key1 +2837 1 ssh-rsa 11key4plc11 user837-key1 +2838 1 ssh-rsa 11key4plc11 user838-key1 +2839 1 ssh-rsa 11key4plc11 user839-key1 +2840 1 ssh-rsa 11key4plc11 user840-key1 +2841 1 ssh-rsa 11key4plc11 user841-key1 +2842 1 ssh-rsa 11key4plc11 user842-key1 +2843 1 ssh-rsa 11key4plc11 user843-key1 +2844 1 ssh-rsa 11key4plc11 user844-key1 +2845 1 ssh-rsa 11key4plc11 user845-key1 +2846 1 ssh-rsa 11key4plc11 user846-key1 +2847 1 ssh-rsa 11key4plc11 user847-key1 +2848 1 ssh-rsa 11key4plc11 user848-key1 +2849 1 ssh-rsa 11key4plc11 user849-key1 +2850 1 ssh-rsa 11key4plc11 user850-key1 +2851 1 ssh-rsa 11key4plc11 user851-key1 +2852 1 ssh-rsa 11key4plc11 user852-key1 +2853 1 ssh-rsa 11key4plc11 user853-key1 +2854 1 ssh-rsa 11key4plc11 user854-key1 +2855 1 ssh-rsa 11key4plc11 user855-key1 +2856 1 ssh-rsa 11key4plc11 user856-key1 +2857 1 ssh-rsa 11key4plc11 user857-key1 +2858 1 ssh-rsa 11key4plc11 user858-key1 +2859 1 ssh-rsa 11key4plc11 user859-key1 +2860 1 ssh-rsa 11key4plc11 user860-key1 +2861 1 ssh-rsa 11key4plc11 user861-key1 +2862 1 ssh-rsa 11key4plc11 user862-key1 +2863 1 ssh-rsa 11key4plc11 user863-key1 +2864 1 ssh-rsa 11key4plc11 user864-key1 +2865 1 ssh-rsa 11key4plc11 user865-key1 +2866 1 ssh-rsa 11key4plc11 user866-key1 +2867 1 ssh-rsa 11key4plc11 user867-key1 +2868 1 ssh-rsa 11key4plc11 user868-key1 +2869 1 ssh-rsa 11key4plc11 user869-key1 +2870 1 ssh-rsa 11key4plc11 user870-key1 +2871 1 ssh-rsa 11key4plc11 user871-key1 +2872 1 ssh-rsa 11key4plc11 user872-key1 +2873 1 ssh-rsa 11key4plc11 user873-key1 +2874 1 ssh-rsa 11key4plc11 user874-key1 +2875 1 ssh-rsa 11key4plc11 user875-key1 +2876 1 ssh-rsa 11key4plc11 user876-key1 +2877 1 ssh-rsa 11key4plc11 user877-key1 +2878 1 ssh-rsa 11key4plc11 user878-key1 +2879 1 ssh-rsa 11key4plc11 user879-key1 +2880 1 ssh-rsa 11key4plc11 user880-key1 +2881 1 ssh-rsa 11key4plc11 user881-key1 +2882 1 ssh-rsa 11key4plc11 user882-key1 +2883 1 ssh-rsa 11key4plc11 user883-key1 +2884 1 ssh-rsa 11key4plc11 user884-key1 +2885 1 ssh-rsa 11key4plc11 user885-key1 +2886 1 ssh-rsa 11key4plc11 user886-key1 +2887 1 ssh-rsa 11key4plc11 user887-key1 +2888 1 ssh-rsa 11key4plc11 user888-key1 +2889 1 ssh-rsa 11key4plc11 user889-key1 +2890 1 ssh-rsa 11key4plc11 user890-key1 +2891 1 ssh-rsa 11key4plc11 user891-key1 +2892 1 ssh-rsa 11key4plc11 user892-key1 +2893 1 ssh-rsa 11key4plc11 user893-key1 +2894 1 ssh-rsa 11key4plc11 user894-key1 +2895 1 ssh-rsa 11key4plc11 user895-key1 +2896 1 ssh-rsa 11key4plc11 user896-key1 +2897 1 ssh-rsa 11key4plc11 user897-key1 +2898 1 ssh-rsa 11key4plc11 user898-key1 +2899 1 ssh-rsa 11key4plc11 user899-key1 +2900 1 ssh-rsa 11key4plc11 user900-key1 +2901 1 ssh-rsa 11key4plc11 user901-key1 +2902 1 ssh-rsa 11key4plc11 user902-key1 +2903 1 ssh-rsa 11key4plc11 user903-key1 +2904 1 ssh-rsa 11key4plc11 user904-key1 +2905 1 ssh-rsa 11key4plc11 user905-key1 +2906 1 ssh-rsa 11key4plc11 user906-key1 +2907 1 ssh-rsa 11key4plc11 user907-key1 +2908 1 ssh-rsa 11key4plc11 user908-key1 +2909 1 ssh-rsa 11key4plc11 user909-key1 +2910 1 ssh-rsa 11key4plc11 user910-key1 +2911 1 ssh-rsa 11key4plc11 user911-key1 +2912 1 ssh-rsa 11key4plc11 user912-key1 +2913 1 ssh-rsa 11key4plc11 user913-key1 +2914 1 ssh-rsa 11key4plc11 user914-key1 +2915 1 ssh-rsa 11key4plc11 user915-key1 +2916 1 ssh-rsa 11key4plc11 user916-key1 +2917 1 ssh-rsa 11key4plc11 user917-key1 +2918 1 ssh-rsa 11key4plc11 user918-key1 +2919 1 ssh-rsa 11key4plc11 user919-key1 +2920 1 ssh-rsa 11key4plc11 user920-key1 +2921 1 ssh-rsa 11key4plc11 user921-key1 +2922 1 ssh-rsa 11key4plc11 user922-key1 +2923 1 ssh-rsa 11key4plc11 user923-key1 +2924 1 ssh-rsa 11key4plc11 user924-key1 +2925 1 ssh-rsa 11key4plc11 user925-key1 +2926 1 ssh-rsa 11key4plc11 user926-key1 +2927 1 ssh-rsa 11key4plc11 user927-key1 +2928 1 ssh-rsa 11key4plc11 user928-key1 +2929 1 ssh-rsa 11key4plc11 user929-key1 +2930 1 ssh-rsa 11key4plc11 user930-key1 +2931 1 ssh-rsa 11key4plc11 user931-key1 +2932 1 ssh-rsa 11key4plc11 user932-key1 +2933 1 ssh-rsa 11key4plc11 user933-key1 +2934 1 ssh-rsa 11key4plc11 user934-key1 +2935 1 ssh-rsa 11key4plc11 user935-key1 +2936 1 ssh-rsa 11key4plc11 user936-key1 +2937 1 ssh-rsa 11key4plc11 user937-key1 +2938 1 ssh-rsa 11key4plc11 user938-key1 +2939 1 ssh-rsa 11key4plc11 user939-key1 +2940 1 ssh-rsa 11key4plc11 user940-key1 +2941 1 ssh-rsa 11key4plc11 user941-key1 +2942 1 ssh-rsa 11key4plc11 user942-key1 +2943 1 ssh-rsa 11key4plc11 user943-key1 +2944 1 ssh-rsa 11key4plc11 user944-key1 +2945 1 ssh-rsa 11key4plc11 user945-key1 +2946 1 ssh-rsa 11key4plc11 user946-key1 +2947 1 ssh-rsa 11key4plc11 user947-key1 +2948 1 ssh-rsa 11key4plc11 user948-key1 +2949 1 ssh-rsa 11key4plc11 user949-key1 +2950 1 ssh-rsa 11key4plc11 user950-key1 +2951 1 ssh-rsa 11key4plc11 user951-key1 +2952 1 ssh-rsa 11key4plc11 user952-key1 +2953 1 ssh-rsa 11key4plc11 user953-key1 +2954 1 ssh-rsa 11key4plc11 user954-key1 +2955 1 ssh-rsa 11key4plc11 user955-key1 +2956 1 ssh-rsa 11key4plc11 user956-key1 +2957 1 ssh-rsa 11key4plc11 user957-key1 +2958 1 ssh-rsa 11key4plc11 user958-key1 +2959 1 ssh-rsa 11key4plc11 user959-key1 +2960 1 ssh-rsa 11key4plc11 user960-key1 +2961 1 ssh-rsa 11key4plc11 user961-key1 +2962 1 ssh-rsa 11key4plc11 user962-key1 +2963 1 ssh-rsa 11key4plc11 user963-key1 +2964 1 ssh-rsa 11key4plc11 user964-key1 +2965 1 ssh-rsa 11key4plc11 user965-key1 +2966 1 ssh-rsa 11key4plc11 user966-key1 +2967 1 ssh-rsa 11key4plc11 user967-key1 +2968 1 ssh-rsa 11key4plc11 user968-key1 +2969 1 ssh-rsa 11key4plc11 user969-key1 +2970 1 ssh-rsa 11key4plc11 user970-key1 +2971 1 ssh-rsa 11key4plc11 user971-key1 +2972 1 ssh-rsa 11key4plc11 user972-key1 +2973 1 ssh-rsa 11key4plc11 user973-key1 +2974 1 ssh-rsa 11key4plc11 user974-key1 +2975 1 ssh-rsa 11key4plc11 user975-key1 +2976 1 ssh-rsa 11key4plc11 user976-key1 +2977 1 ssh-rsa 11key4plc11 user977-key1 +2978 1 ssh-rsa 11key4plc11 user978-key1 +2979 1 ssh-rsa 11key4plc11 user979-key1 +2980 1 ssh-rsa 11key4plc11 user980-key1 +2981 1 ssh-rsa 11key4plc11 user981-key1 +2982 1 ssh-rsa 11key4plc11 user982-key1 +2983 1 ssh-rsa 11key4plc11 user983-key1 +2984 1 ssh-rsa 11key4plc11 user984-key1 +2985 1 ssh-rsa 11key4plc11 user985-key1 +2986 1 ssh-rsa 11key4plc11 user986-key1 +2987 1 ssh-rsa 11key4plc11 user987-key1 +2988 1 ssh-rsa 11key4plc11 user988-key1 +2989 1 ssh-rsa 11key4plc11 user989-key1 +2990 1 ssh-rsa 11key4plc11 user990-key1 +2991 1 ssh-rsa 11key4plc11 user991-key1 +2992 1 ssh-rsa 11key4plc11 user992-key1 +2993 1 ssh-rsa 11key4plc11 user993-key1 +2994 1 ssh-rsa 11key4plc11 user994-key1 +2995 1 ssh-rsa 11key4plc11 user995-key1 +2996 1 ssh-rsa 11key4plc11 user996-key1 +2997 1 ssh-rsa 11key4plc11 user997-key1 +2998 1 ssh-rsa 11key4plc11 user998-key1 +2999 1 ssh-rsa 11key4plc11 user999-key1 +3000 1 ssh-rsa 11key4plc11 user1000-key1 +3001 1 ssh-rsa 11key4plc11 user1001-key1 +3002 1 ssh-rsa 11key4plc11 user1002-key1 +3003 1 ssh-rsa 11key4plc11 user1003-key1 +3004 1 ssh-rsa 11key4plc11 user1004-key1 +3005 1 ssh-rsa 11key4plc11 user1005-key1 +3006 1 ssh-rsa 11key4plc11 user1006-key1 +3007 1 ssh-rsa 11key4plc11 user1007-key1 +3008 1 ssh-rsa 11key4plc11 user1008-key1 +3009 1 ssh-rsa 11key4plc11 user1009-key1 +3010 1 ssh-rsa 11key4plc11 user1010-key1 +3011 1 ssh-rsa 11key4plc11 user1011-key1 +3012 1 ssh-rsa 11key4plc11 user1012-key1 +3013 1 ssh-rsa 11key4plc11 user1013-key1 +3014 1 ssh-rsa 11key4plc11 user1014-key1 +3015 1 ssh-rsa 11key4plc11 user1015-key1 +3016 1 ssh-rsa 11key4plc11 user1016-key1 +3017 1 ssh-rsa 11key4plc11 user1017-key1 +3018 1 ssh-rsa 11key4plc11 user1018-key1 +3019 1 ssh-rsa 11key4plc11 user1019-key1 +3020 1 ssh-rsa 11key4plc11 user1020-key1 +3021 1 ssh-rsa 11key4plc11 user1021-key1 +3022 1 ssh-rsa 11key4plc11 user1022-key1 +3023 1 ssh-rsa 11key4plc11 user1023-key1 +3024 1 ssh-rsa 11key4plc11 user1024-key1 +3025 1 ssh-rsa 11key4plc11 user1025-key1 +3026 1 ssh-rsa 11key4plc11 user1026-key1 +3027 1 ssh-rsa 11key4plc11 user1027-key1 +3028 1 ssh-rsa 11key4plc11 user1028-key1 +3029 1 ssh-rsa 11key4plc11 user1029-key1 +3030 1 ssh-rsa 11key4plc11 user1030-key1 +3031 1 ssh-rsa 11key4plc11 user1031-key1 +3032 1 ssh-rsa 11key4plc11 user1032-key1 +3033 1 ssh-rsa 11key4plc11 user1033-key1 +3034 1 ssh-rsa 11key4plc11 user1034-key1 +3035 1 ssh-rsa 11key4plc11 user1035-key1 +3036 1 ssh-rsa 11key4plc11 user1036-key1 +3037 1 ssh-rsa 11key4plc11 user1037-key1 +3038 1 ssh-rsa 11key4plc11 user1038-key1 +3039 1 ssh-rsa 11key4plc11 user1039-key1 +3040 1 ssh-rsa 11key4plc11 user1040-key1 +3041 1 ssh-rsa 11key4plc11 user1041-key1 +3042 1 ssh-rsa 11key4plc11 user1042-key1 +3043 1 ssh-rsa 11key4plc11 user1043-key1 +3044 1 ssh-rsa 11key4plc11 user1044-key1 +3045 1 ssh-rsa 11key4plc11 user1045-key1 +3046 1 ssh-rsa 11key4plc11 user1046-key1 +3047 1 ssh-rsa 11key4plc11 user1047-key1 +3048 1 ssh-rsa 11key4plc11 user1048-key1 +3049 1 ssh-rsa 11key4plc11 user1049-key1 +3050 1 ssh-rsa 11key4plc11 user1050-key1 +3051 1 ssh-rsa 11key4plc11 user1051-key1 +3052 1 ssh-rsa 11key4plc11 user1052-key1 +3053 1 ssh-rsa 11key4plc11 user1053-key1 +3054 1 ssh-rsa 11key4plc11 user1054-key1 +3055 1 ssh-rsa 11key4plc11 user1055-key1 +3056 1 ssh-rsa 11key4plc11 user1056-key1 +3057 1 ssh-rsa 11key4plc11 user1057-key1 +3058 1 ssh-rsa 11key4plc11 user1058-key1 +3059 1 ssh-rsa 11key4plc11 user1059-key1 +3060 1 ssh-rsa 11key4plc11 user1060-key1 +3061 1 ssh-rsa 11key4plc11 user1061-key1 +3062 1 ssh-rsa 11key4plc11 user1062-key1 +3063 1 ssh-rsa 11key4plc11 user1063-key1 +3064 1 ssh-rsa 11key4plc11 user1064-key1 +3065 1 ssh-rsa 11key4plc11 user1065-key1 +3066 1 ssh-rsa 11key4plc11 user1066-key1 +3067 1 ssh-rsa 11key4plc11 user1067-key1 +3068 1 ssh-rsa 11key4plc11 user1068-key1 +3069 1 ssh-rsa 11key4plc11 user1069-key1 +3070 1 ssh-rsa 11key4plc11 user1070-key1 +3071 1 ssh-rsa 11key4plc11 user1071-key1 +3072 1 ssh-rsa 11key4plc11 user1072-key1 +3073 1 ssh-rsa 11key4plc11 user1073-key1 +3074 1 ssh-rsa 11key4plc11 user1074-key1 +3075 1 ssh-rsa 11key4plc11 user1075-key1 +3076 1 ssh-rsa 11key4plc11 user1076-key1 +3077 1 ssh-rsa 11key4plc11 user1077-key1 +3078 1 ssh-rsa 11key4plc11 user1078-key1 +3079 1 ssh-rsa 11key4plc11 user1079-key1 +3080 1 ssh-rsa 11key4plc11 user1080-key1 +3081 1 ssh-rsa 11key4plc11 user1081-key1 +3082 1 ssh-rsa 11key4plc11 user1082-key1 +3083 1 ssh-rsa 11key4plc11 user1083-key1 +3084 1 ssh-rsa 11key4plc11 user1084-key1 +3085 1 ssh-rsa 11key4plc11 user1085-key1 +3086 1 ssh-rsa 11key4plc11 user1086-key1 +3087 1 ssh-rsa 11key4plc11 user1087-key1 +3088 1 ssh-rsa 11key4plc11 user1088-key1 +3089 1 ssh-rsa 11key4plc11 user1089-key1 +3090 1 ssh-rsa 11key4plc11 user1090-key1 +3091 1 ssh-rsa 11key4plc11 user1091-key1 +3092 1 ssh-rsa 11key4plc11 user1092-key1 +3093 1 ssh-rsa 11key4plc11 user1093-key1 +3094 1 ssh-rsa 11key4plc11 user1094-key1 +3095 1 ssh-rsa 11key4plc11 user1095-key1 +3096 1 ssh-rsa 11key4plc11 user1096-key1 +3097 1 ssh-rsa 11key4plc11 user1097-key1 +3098 1 ssh-rsa 11key4plc11 user1098-key1 +3099 1 ssh-rsa 11key4plc11 user1099-key1 +3100 1 ssh-rsa 11key4plc11 user1100-key1 +3101 1 ssh-rsa 11key4plc11 user1101-key1 +3102 1 ssh-rsa 11key4plc11 user1102-key1 +3103 1 ssh-rsa 11key4plc11 user1103-key1 +3104 1 ssh-rsa 11key4plc11 user1104-key1 +3105 1 ssh-rsa 11key4plc11 user1105-key1 +3106 1 ssh-rsa 11key4plc11 user1106-key1 +3107 1 ssh-rsa 11key4plc11 user1107-key1 +3108 1 ssh-rsa 11key4plc11 user1108-key1 +3109 1 ssh-rsa 11key4plc11 user1109-key1 +3110 1 ssh-rsa 11key4plc11 user1110-key1 +3111 1 ssh-rsa 11key4plc11 user1111-key1 +3112 1 ssh-rsa 11key4plc11 user1112-key1 +3113 1 ssh-rsa 11key4plc11 user1113-key1 +3114 1 ssh-rsa 11key4plc11 user1114-key1 +3115 1 ssh-rsa 11key4plc11 user1115-key1 +3116 1 ssh-rsa 11key4plc11 user1116-key1 +3117 1 ssh-rsa 11key4plc11 user1117-key1 +3118 1 ssh-rsa 11key4plc11 user1118-key1 +3119 1 ssh-rsa 11key4plc11 user1119-key1 +3120 1 ssh-rsa 11key4plc11 user1120-key1 +3121 1 ssh-rsa 11key4plc11 user1121-key1 +3122 1 ssh-rsa 11key4plc11 user1122-key1 +3123 1 ssh-rsa 11key4plc11 user1123-key1 +3124 1 ssh-rsa 11key4plc11 user1124-key1 +3125 1 ssh-rsa 11key4plc11 user1125-key1 +3126 1 ssh-rsa 11key4plc11 user1126-key1 +3127 1 ssh-rsa 11key4plc11 user1127-key1 +3128 1 ssh-rsa 11key4plc11 user1128-key1 +3129 1 ssh-rsa 11key4plc11 user1129-key1 +3130 1 ssh-rsa 11key4plc11 user1130-key1 +3131 1 ssh-rsa 11key4plc11 user1131-key1 +3132 1 ssh-rsa 11key4plc11 user1132-key1 +3133 1 ssh-rsa 11key4plc11 user1133-key1 +3134 1 ssh-rsa 11key4plc11 user1134-key1 +3135 1 ssh-rsa 11key4plc11 user1135-key1 +3136 1 ssh-rsa 11key4plc11 user1136-key1 +3137 1 ssh-rsa 11key4plc11 user1137-key1 +3138 1 ssh-rsa 11key4plc11 user1138-key1 +3139 1 ssh-rsa 11key4plc11 user1139-key1 +3140 1 ssh-rsa 11key4plc11 user1140-key1 +3141 1 ssh-rsa 11key4plc11 user1141-key1 +3142 1 ssh-rsa 11key4plc11 user1142-key1 +3143 1 ssh-rsa 11key4plc11 user1143-key1 +3144 1 ssh-rsa 11key4plc11 user1144-key1 +3145 1 ssh-rsa 11key4plc11 user1145-key1 +3146 1 ssh-rsa 11key4plc11 user1146-key1 +3147 1 ssh-rsa 11key4plc11 user1147-key1 +3148 1 ssh-rsa 11key4plc11 user1148-key1 +3149 1 ssh-rsa 11key4plc11 user1149-key1 +3150 1 ssh-rsa 11key4plc11 user1150-key1 +3151 1 ssh-rsa 11key4plc11 user1151-key1 +3152 1 ssh-rsa 11key4plc11 user1152-key1 +3153 1 ssh-rsa 11key4plc11 user1153-key1 +3154 1 ssh-rsa 11key4plc11 user1154-key1 +3155 1 ssh-rsa 11key4plc11 user1155-key1 +3156 1 ssh-rsa 11key4plc11 user1156-key1 +3157 1 ssh-rsa 11key4plc11 user1157-key1 +3158 1 ssh-rsa 11key4plc11 user1158-key1 +3159 1 ssh-rsa 11key4plc11 user1159-key1 +3160 1 ssh-rsa 11key4plc11 user1160-key1 +3161 1 ssh-rsa 11key4plc11 user1161-key1 +3162 1 ssh-rsa 11key4plc11 user1162-key1 +3163 1 ssh-rsa 11key4plc11 user1163-key1 +3164 1 ssh-rsa 11key4plc11 user1164-key1 +3165 1 ssh-rsa 11key4plc11 user1165-key1 +3166 1 ssh-rsa 11key4plc11 user1166-key1 +3167 1 ssh-rsa 11key4plc11 user1167-key1 +3168 1 ssh-rsa 11key4plc11 user1168-key1 +3169 1 ssh-rsa 11key4plc11 user1169-key1 +3170 1 ssh-rsa 11key4plc11 user1170-key1 +3171 1 ssh-rsa 11key4plc11 user1171-key1 +3172 1 ssh-rsa 11key4plc11 user1172-key1 +3173 1 ssh-rsa 11key4plc11 user1173-key1 +3174 1 ssh-rsa 11key4plc11 user1174-key1 +3175 1 ssh-rsa 11key4plc11 user1175-key1 +3176 1 ssh-rsa 11key4plc11 user1176-key1 +3177 1 ssh-rsa 11key4plc11 user1177-key1 +3178 1 ssh-rsa 11key4plc11 user1178-key1 +3179 1 ssh-rsa 11key4plc11 user1179-key1 +3180 1 ssh-rsa 11key4plc11 user1180-key1 +3181 1 ssh-rsa 11key4plc11 user1181-key1 +3182 1 ssh-rsa 11key4plc11 user1182-key1 +3183 1 ssh-rsa 11key4plc11 user1183-key1 +3184 1 ssh-rsa 11key4plc11 user1184-key1 +3185 1 ssh-rsa 11key4plc11 user1185-key1 +3186 1 ssh-rsa 11key4plc11 user1186-key1 +3187 1 ssh-rsa 11key4plc11 user1187-key1 +3188 1 ssh-rsa 11key4plc11 user1188-key1 +3189 1 ssh-rsa 11key4plc11 user1189-key1 +3190 1 ssh-rsa 11key4plc11 user1190-key1 +3191 1 ssh-rsa 11key4plc11 user1191-key1 +3192 1 ssh-rsa 11key4plc11 user1192-key1 +3193 1 ssh-rsa 11key4plc11 user1193-key1 +3194 1 ssh-rsa 11key4plc11 user1194-key1 +3195 1 ssh-rsa 11key4plc11 user1195-key1 +3196 1 ssh-rsa 11key4plc11 user1196-key1 +3197 1 ssh-rsa 11key4plc11 user1197-key1 +3198 1 ssh-rsa 11key4plc11 user1198-key1 +3199 1 ssh-rsa 11key4plc11 user1199-key1 +3200 1 ssh-rsa 11key4plc11 user1200-key1 +3201 1 ssh-rsa 11key4plc11 user1201-key1 +3202 1 ssh-rsa 11key4plc11 user1202-key1 +3203 1 ssh-rsa 11key4plc11 user1203-key1 +3204 1 ssh-rsa 11key4plc11 user1204-key1 +3205 1 ssh-rsa 11key4plc11 user1205-key1 +3206 1 ssh-rsa 11key4plc11 user1206-key1 +3207 1 ssh-rsa 11key4plc11 user1207-key1 +3208 1 ssh-rsa 11key4plc11 user1208-key1 +3209 1 ssh-rsa 11key4plc11 user1209-key1 +3210 1 ssh-rsa 11key4plc11 user1210-key1 +3211 1 ssh-rsa 11key4plc11 user1211-key1 +3212 1 ssh-rsa 11key4plc11 user1212-key1 +3213 1 ssh-rsa 11key4plc11 user1213-key1 +3214 1 ssh-rsa 11key4plc11 user1214-key1 +3215 1 ssh-rsa 11key4plc11 user1215-key1 +3216 1 ssh-rsa 11key4plc11 user1216-key1 +3217 1 ssh-rsa 11key4plc11 user1217-key1 +3218 1 ssh-rsa 11key4plc11 user1218-key1 +3219 1 ssh-rsa 11key4plc11 user1219-key1 +3220 1 ssh-rsa 11key4plc11 user1220-key1 +3221 1 ssh-rsa 11key4plc11 user1221-key1 +3222 1 ssh-rsa 11key4plc11 user1222-key1 +3223 1 ssh-rsa 11key4plc11 user1223-key1 +3224 1 ssh-rsa 11key4plc11 user1224-key1 +3225 1 ssh-rsa 11key4plc11 user1225-key1 +3226 1 ssh-rsa 11key4plc11 user1226-key1 +3227 1 ssh-rsa 11key4plc11 user1227-key1 +3228 1 ssh-rsa 11key4plc11 user1228-key1 +3229 1 ssh-rsa 11key4plc11 user1229-key1 +3230 1 ssh-rsa 11key4plc11 user1230-key1 +3231 1 ssh-rsa 11key4plc11 user1231-key1 +3232 1 ssh-rsa 11key4plc11 user1232-key1 +3233 1 ssh-rsa 11key4plc11 user1233-key1 +3234 1 ssh-rsa 11key4plc11 user1234-key1 +3235 1 ssh-rsa 11key4plc11 user1235-key1 +3236 1 ssh-rsa 11key4plc11 user1236-key1 +3237 1 ssh-rsa 11key4plc11 user1237-key1 +3238 1 ssh-rsa 11key4plc11 user1238-key1 +3239 1 ssh-rsa 11key4plc11 user1239-key1 +3240 1 ssh-rsa 11key4plc11 user1240-key1 +3241 1 ssh-rsa 11key4plc11 user1241-key1 +3242 1 ssh-rsa 11key4plc11 user1242-key1 +3243 1 ssh-rsa 11key4plc11 user1243-key1 +3244 1 ssh-rsa 11key4plc11 user1244-key1 +3245 1 ssh-rsa 11key4plc11 user1245-key1 +3246 1 ssh-rsa 11key4plc11 user1246-key1 +3247 1 ssh-rsa 11key4plc11 user1247-key1 +3248 1 ssh-rsa 11key4plc11 user1248-key1 +3249 1 ssh-rsa 11key4plc11 user1249-key1 +3250 1 ssh-rsa 11key4plc11 user1250-key1 +3251 1 ssh-rsa 11key4plc11 user1251-key1 +3252 1 ssh-rsa 11key4plc11 user1252-key1 +3253 1 ssh-rsa 11key4plc11 user1253-key1 +3254 1 ssh-rsa 11key4plc11 user1254-key1 +3255 1 ssh-rsa 11key4plc11 user1255-key1 +3256 1 ssh-rsa 11key4plc11 user1256-key1 +3257 1 ssh-rsa 11key4plc11 user1257-key1 +3258 1 ssh-rsa 11key4plc11 user1258-key1 +3259 1 ssh-rsa 11key4plc11 user1259-key1 +3260 1 ssh-rsa 11key4plc11 user1260-key1 +3261 1 ssh-rsa 11key4plc11 user1261-key1 +3262 1 ssh-rsa 11key4plc11 user1262-key1 +3263 1 ssh-rsa 11key4plc11 user1263-key1 +3264 1 ssh-rsa 11key4plc11 user1264-key1 +3265 1 ssh-rsa 11key4plc11 user1265-key1 +3266 1 ssh-rsa 11key4plc11 user1266-key1 +3267 1 ssh-rsa 11key4plc11 user1267-key1 +3268 1 ssh-rsa 11key4plc11 user1268-key1 +3269 1 ssh-rsa 11key4plc11 user1269-key1 +3270 1 ssh-rsa 11key4plc11 user1270-key1 +3271 1 ssh-rsa 11key4plc11 user1271-key1 +3272 1 ssh-rsa 11key4plc11 user1272-key1 +3273 1 ssh-rsa 11key4plc11 user1273-key1 +3274 1 ssh-rsa 11key4plc11 user1274-key1 +3275 1 ssh-rsa 11key4plc11 user1275-key1 +3276 1 ssh-rsa 11key4plc11 user1276-key1 +3277 1 ssh-rsa 11key4plc11 user1277-key1 +3278 1 ssh-rsa 11key4plc11 user1278-key1 +3279 1 ssh-rsa 11key4plc11 user1279-key1 +3280 1 ssh-rsa 11key4plc11 user1280-key1 +3281 1 ssh-rsa 11key4plc11 user1281-key1 +3282 1 ssh-rsa 11key4plc11 user1282-key1 +3283 1 ssh-rsa 11key4plc11 user1283-key1 +3284 1 ssh-rsa 11key4plc11 user1284-key1 +3285 1 ssh-rsa 11key4plc11 user1285-key1 +3286 1 ssh-rsa 11key4plc11 user1286-key1 +3287 1 ssh-rsa 11key4plc11 user1287-key1 +3288 1 ssh-rsa 11key4plc11 user1288-key1 +3289 1 ssh-rsa 11key4plc11 user1289-key1 +3290 1 ssh-rsa 11key4plc11 user1290-key1 +3291 1 ssh-rsa 11key4plc11 user1291-key1 +3292 1 ssh-rsa 11key4plc11 user1292-key1 +3293 1 ssh-rsa 11key4plc11 user1293-key1 +3294 1 ssh-rsa 11key4plc11 user1294-key1 +3295 1 ssh-rsa 11key4plc11 user1295-key1 +3296 1 ssh-rsa 11key4plc11 user1296-key1 +3297 1 ssh-rsa 11key4plc11 user1297-key1 +3298 1 ssh-rsa 11key4plc11 user1298-key1 +3299 1 ssh-rsa 11key4plc11 user1299-key1 +3300 1 ssh-rsa 11key4plc11 user1300-key1 +3301 1 ssh-rsa 11key4plc11 user1301-key1 +3302 1 ssh-rsa 11key4plc11 user1302-key1 +3303 1 ssh-rsa 11key4plc11 user1303-key1 +3304 1 ssh-rsa 11key4plc11 user1304-key1 +3305 1 ssh-rsa 11key4plc11 user1305-key1 +3306 1 ssh-rsa 11key4plc11 user1306-key1 +3307 1 ssh-rsa 11key4plc11 user1307-key1 +3308 1 ssh-rsa 11key4plc11 user1308-key1 +3309 1 ssh-rsa 11key4plc11 user1309-key1 +3310 1 ssh-rsa 11key4plc11 user1310-key1 +3311 1 ssh-rsa 11key4plc11 user1311-key1 +3312 1 ssh-rsa 11key4plc11 user1312-key1 +3313 1 ssh-rsa 11key4plc11 user1313-key1 +3314 1 ssh-rsa 11key4plc11 user1314-key1 +3315 1 ssh-rsa 11key4plc11 user1315-key1 +3316 1 ssh-rsa 11key4plc11 user1316-key1 +3317 1 ssh-rsa 11key4plc11 user1317-key1 +3318 1 ssh-rsa 11key4plc11 user1318-key1 +3319 1 ssh-rsa 11key4plc11 user1319-key1 +3320 1 ssh-rsa 11key4plc11 user1320-key1 +3321 1 ssh-rsa 11key4plc11 user1321-key1 +3322 1 ssh-rsa 11key4plc11 user1322-key1 +3323 1 ssh-rsa 11key4plc11 user1323-key1 +3324 1 ssh-rsa 11key4plc11 user1324-key1 +3325 1 ssh-rsa 11key4plc11 user1325-key1 +3326 1 ssh-rsa 11key4plc11 user1326-key1 +3327 1 ssh-rsa 11key4plc11 user1327-key1 +3328 1 ssh-rsa 11key4plc11 user1328-key1 +3329 1 ssh-rsa 11key4plc11 user1329-key1 +3330 1 ssh-rsa 11key4plc11 user1330-key1 +3331 1 ssh-rsa 11key4plc11 user1331-key1 +3332 1 ssh-rsa 11key4plc11 user1332-key1 +3333 1 ssh-rsa 11key4plc11 user1333-key1 +3334 1 ssh-rsa 11key4plc11 user1334-key1 +3335 1 ssh-rsa 11key4plc11 user1335-key1 +3336 1 ssh-rsa 11key4plc11 user1336-key1 +3337 1 ssh-rsa 11key4plc11 user1337-key1 +3338 1 ssh-rsa 11key4plc11 user1338-key1 +3339 1 ssh-rsa 11key4plc11 user1339-key1 +3340 1 ssh-rsa 11key4plc11 user1340-key1 +3341 1 ssh-rsa 11key4plc11 user1341-key1 +3342 1 ssh-rsa 11key4plc11 user1342-key1 +3343 1 ssh-rsa 11key4plc11 user1343-key1 +3344 1 ssh-rsa 11key4plc11 user1344-key1 +3345 1 ssh-rsa 11key4plc11 user1345-key1 +3346 1 ssh-rsa 11key4plc11 user1346-key1 +3347 1 ssh-rsa 11key4plc11 user1347-key1 +3348 1 ssh-rsa 11key4plc11 user1348-key1 +3349 1 ssh-rsa 11key4plc11 user1349-key1 +3350 1 ssh-rsa 11key4plc11 user1350-key1 +3351 1 ssh-rsa 11key4plc11 user1351-key1 +3352 1 ssh-rsa 11key4plc11 user1352-key1 +3353 1 ssh-rsa 11key4plc11 user1353-key1 +3354 1 ssh-rsa 11key4plc11 user1354-key1 +3355 1 ssh-rsa 11key4plc11 user1355-key1 +3356 1 ssh-rsa 11key4plc11 user1356-key1 +3357 1 ssh-rsa 11key4plc11 user1357-key1 +3358 1 ssh-rsa 11key4plc11 user1358-key1 +3359 1 ssh-rsa 11key4plc11 user1359-key1 +3360 1 ssh-rsa 11key4plc11 user1360-key1 +3361 1 ssh-rsa 11key4plc11 user1361-key1 +3362 1 ssh-rsa 11key4plc11 user1362-key1 +3363 1 ssh-rsa 11key4plc11 user1363-key1 +3364 1 ssh-rsa 11key4plc11 user1364-key1 +3365 1 ssh-rsa 11key4plc11 user1365-key1 +3366 1 ssh-rsa 11key4plc11 user1366-key1 +3367 1 ssh-rsa 11key4plc11 user1367-key1 +3368 1 ssh-rsa 11key4plc11 user1368-key1 +3369 1 ssh-rsa 11key4plc11 user1369-key1 +3370 1 ssh-rsa 11key4plc11 user1370-key1 +3371 1 ssh-rsa 11key4plc11 user1371-key1 +3372 1 ssh-rsa 11key4plc11 user1372-key1 +3373 1 ssh-rsa 11key4plc11 user1373-key1 +3374 1 ssh-rsa 11key4plc11 user1374-key1 +3375 1 ssh-rsa 11key4plc11 user1375-key1 +3376 1 ssh-rsa 11key4plc11 user1376-key1 +3377 1 ssh-rsa 11key4plc11 user1377-key1 +3378 1 ssh-rsa 11key4plc11 user1378-key1 +3379 1 ssh-rsa 11key4plc11 user1379-key1 +3380 1 ssh-rsa 11key4plc11 user1380-key1 +3381 1 ssh-rsa 11key4plc11 user1381-key1 +3382 1 ssh-rsa 11key4plc11 user1382-key1 +3383 1 ssh-rsa 11key4plc11 user1383-key1 +3384 1 ssh-rsa 11key4plc11 user1384-key1 +3385 1 ssh-rsa 11key4plc11 user1385-key1 +3386 1 ssh-rsa 11key4plc11 user1386-key1 +3387 1 ssh-rsa 11key4plc11 user1387-key1 +3388 1 ssh-rsa 11key4plc11 user1388-key1 +3389 1 ssh-rsa 11key4plc11 user1389-key1 +3390 1 ssh-rsa 11key4plc11 user1390-key1 +3391 1 ssh-rsa 11key4plc11 user1391-key1 +3392 1 ssh-rsa 11key4plc11 user1392-key1 +3393 1 ssh-rsa 11key4plc11 user1393-key1 +3394 1 ssh-rsa 11key4plc11 user1394-key1 +3395 1 ssh-rsa 11key4plc11 user1395-key1 +3396 1 ssh-rsa 11key4plc11 user1396-key1 +3397 1 ssh-rsa 11key4plc11 user1397-key1 +3398 1 ssh-rsa 11key4plc11 user1398-key1 +3399 1 ssh-rsa 11key4plc11 user1399-key1 +3400 1 ssh-rsa 11key4plc11 user1400-key1 +3401 1 ssh-rsa 11key4plc11 user1401-key1 +3402 1 ssh-rsa 11key4plc11 user1402-key1 +3403 1 ssh-rsa 11key4plc11 user1403-key1 +3404 1 ssh-rsa 11key4plc11 user1404-key1 +3405 1 ssh-rsa 11key4plc11 user1405-key1 +3406 1 ssh-rsa 11key4plc11 user1406-key1 +3407 1 ssh-rsa 11key4plc11 user1407-key1 +3408 1 ssh-rsa 11key4plc11 user1408-key1 +3409 1 ssh-rsa 11key4plc11 user1409-key1 +3410 1 ssh-rsa 11key4plc11 user1410-key1 +3411 1 ssh-rsa 11key4plc11 user1411-key1 +3412 1 ssh-rsa 11key4plc11 user1412-key1 +3413 1 ssh-rsa 11key4plc11 user1413-key1 +3414 1 ssh-rsa 11key4plc11 user1414-key1 +3415 1 ssh-rsa 11key4plc11 user1415-key1 +3416 1 ssh-rsa 11key4plc11 user1416-key1 +3417 1 ssh-rsa 11key4plc11 user1417-key1 +3418 1 ssh-rsa 11key4plc11 user1418-key1 +3419 1 ssh-rsa 11key4plc11 user1419-key1 +3420 1 ssh-rsa 11key4plc11 user1420-key1 +3421 1 ssh-rsa 11key4plc11 user1421-key1 +3422 1 ssh-rsa 11key4plc11 user1422-key1 +3423 1 ssh-rsa 11key4plc11 user1423-key1 +3424 1 ssh-rsa 11key4plc11 user1424-key1 +3425 1 ssh-rsa 11key4plc11 user1425-key1 +3426 1 ssh-rsa 11key4plc11 user1426-key1 +3427 1 ssh-rsa 11key4plc11 user1427-key1 +3428 1 ssh-rsa 11key4plc11 user1428-key1 +3429 1 ssh-rsa 11key4plc11 user1429-key1 +3430 1 ssh-rsa 11key4plc11 user1430-key1 +3431 1 ssh-rsa 11key4plc11 user1431-key1 +3432 1 ssh-rsa 11key4plc11 user1432-key1 +3433 1 ssh-rsa 11key4plc11 user1433-key1 +3434 1 ssh-rsa 11key4plc11 user1434-key1 +3435 1 ssh-rsa 11key4plc11 user1435-key1 +3436 1 ssh-rsa 11key4plc11 user1436-key1 +3437 1 ssh-rsa 11key4plc11 user1437-key1 +3438 1 ssh-rsa 11key4plc11 user1438-key1 +3439 1 ssh-rsa 11key4plc11 user1439-key1 +3440 1 ssh-rsa 11key4plc11 user1440-key1 +3441 1 ssh-rsa 11key4plc11 user1441-key1 +3442 1 ssh-rsa 11key4plc11 user1442-key1 +3443 1 ssh-rsa 11key4plc11 user1443-key1 +3444 1 ssh-rsa 11key4plc11 user1444-key1 +3445 1 ssh-rsa 11key4plc11 user1445-key1 +3446 1 ssh-rsa 11key4plc11 user1446-key1 +3447 1 ssh-rsa 11key4plc11 user1447-key1 +3448 1 ssh-rsa 11key4plc11 user1448-key1 +3449 1 ssh-rsa 11key4plc11 user1449-key1 +3450 1 ssh-rsa 11key4plc11 user1450-key1 +3451 1 ssh-rsa 11key4plc11 user1451-key1 +3452 1 ssh-rsa 11key4plc11 user1452-key1 +3453 1 ssh-rsa 11key4plc11 user1453-key1 +3454 1 ssh-rsa 11key4plc11 user1454-key1 +3455 1 ssh-rsa 11key4plc11 user1455-key1 +3456 1 ssh-rsa 11key4plc11 user1456-key1 +3457 1 ssh-rsa 11key4plc11 user1457-key1 +3458 1 ssh-rsa 11key4plc11 user1458-key1 +3459 1 ssh-rsa 11key4plc11 user1459-key1 +3460 1 ssh-rsa 11key4plc11 user1460-key1 +3461 1 ssh-rsa 11key4plc11 user1461-key1 +3462 1 ssh-rsa 11key4plc11 user1462-key1 +3463 1 ssh-rsa 11key4plc11 user1463-key1 +3464 1 ssh-rsa 11key4plc11 user1464-key1 +3465 1 ssh-rsa 11key4plc11 user1465-key1 +3466 1 ssh-rsa 11key4plc11 user1466-key1 +3467 1 ssh-rsa 11key4plc11 user1467-key1 +3468 1 ssh-rsa 11key4plc11 user1468-key1 +3469 1 ssh-rsa 11key4plc11 user1469-key1 +3470 1 ssh-rsa 11key4plc11 user1470-key1 +3471 1 ssh-rsa 11key4plc11 user1471-key1 +3472 1 ssh-rsa 11key4plc11 user1472-key1 +3473 1 ssh-rsa 11key4plc11 user1473-key1 +3474 1 ssh-rsa 11key4plc11 user1474-key1 +3475 1 ssh-rsa 11key4plc11 user1475-key1 +3476 1 ssh-rsa 11key4plc11 user1476-key1 +3477 1 ssh-rsa 11key4plc11 user1477-key1 +3478 1 ssh-rsa 11key4plc11 user1478-key1 +3479 1 ssh-rsa 11key4plc11 user1479-key1 +3480 1 ssh-rsa 11key4plc11 user1480-key1 +3481 1 ssh-rsa 11key4plc11 user1481-key1 +3482 1 ssh-rsa 11key4plc11 user1482-key1 +3483 1 ssh-rsa 11key4plc11 user1483-key1 +3484 1 ssh-rsa 11key4plc11 user1484-key1 +3485 1 ssh-rsa 11key4plc11 user1485-key1 +3486 1 ssh-rsa 11key4plc11 user1486-key1 +3487 1 ssh-rsa 11key4plc11 user1487-key1 +3488 1 ssh-rsa 11key4plc11 user1488-key1 +3489 1 ssh-rsa 11key4plc11 user1489-key1 +3490 1 ssh-rsa 11key4plc11 user1490-key1 +3491 1 ssh-rsa 11key4plc11 user1491-key1 +3492 1 ssh-rsa 11key4plc11 user1492-key1 +3493 1 ssh-rsa 11key4plc11 user1493-key1 +3494 1 ssh-rsa 11key4plc11 user1494-key1 +3495 1 ssh-rsa 11key4plc11 user1495-key1 +3496 1 ssh-rsa 11key4plc11 user1496-key1 +3497 1 ssh-rsa 11key4plc11 user1497-key1 +3498 1 ssh-rsa 11key4plc11 user1498-key1 +3499 1 ssh-rsa 11key4plc11 user1499-key1 +3500 1 ssh-rsa 11key4plc11 user1500-key1 +3501 1 ssh-rsa 11key4plc11 user1501-key1 +3502 1 ssh-rsa 11key4plc11 user1502-key1 +3503 1 ssh-rsa 11key4plc11 user1503-key1 +3504 1 ssh-rsa 11key4plc11 user1504-key1 +3505 1 ssh-rsa 11key4plc11 user1505-key1 +3506 1 ssh-rsa 11key4plc11 user1506-key1 +3507 1 ssh-rsa 11key4plc11 user1507-key1 +3508 1 ssh-rsa 11key4plc11 user1508-key1 +3509 1 ssh-rsa 11key4plc11 user1509-key1 +3510 1 ssh-rsa 11key4plc11 user1510-key1 +3511 1 ssh-rsa 11key4plc11 user1511-key1 +3512 1 ssh-rsa 11key4plc11 user1512-key1 +3513 1 ssh-rsa 11key4plc11 user1513-key1 +3514 1 ssh-rsa 11key4plc11 user1514-key1 +3515 1 ssh-rsa 11key4plc11 user1515-key1 +3516 1 ssh-rsa 11key4plc11 user1516-key1 +3517 1 ssh-rsa 11key4plc11 user1517-key1 +3518 1 ssh-rsa 11key4plc11 user1518-key1 +3519 1 ssh-rsa 11key4plc11 user1519-key1 +3520 1 ssh-rsa 11key4plc11 user1520-key1 +3521 1 ssh-rsa 11key4plc11 user1521-key1 +3522 1 ssh-rsa 11key4plc11 user1522-key1 +3523 1 ssh-rsa 11key4plc11 user1523-key1 +3524 1 ssh-rsa 11key4plc11 user1524-key1 +3525 1 ssh-rsa 11key4plc11 user1525-key1 +3526 1 ssh-rsa 11key4plc11 user1526-key1 +3527 1 ssh-rsa 11key4plc11 user1527-key1 +3528 1 ssh-rsa 11key4plc11 user1528-key1 +3529 1 ssh-rsa 11key4plc11 user1529-key1 +3530 1 ssh-rsa 11key4plc11 user1530-key1 +3531 1 ssh-rsa 11key4plc11 user1531-key1 +3532 1 ssh-rsa 11key4plc11 user1532-key1 +3533 1 ssh-rsa 11key4plc11 user1533-key1 +3534 1 ssh-rsa 11key4plc11 user1534-key1 +3535 1 ssh-rsa 11key4plc11 user1535-key1 +3536 1 ssh-rsa 11key4plc11 user1536-key1 +3537 1 ssh-rsa 11key4plc11 user1537-key1 +3538 1 ssh-rsa 11key4plc11 user1538-key1 +3539 1 ssh-rsa 11key4plc11 user1539-key1 +3540 1 ssh-rsa 11key4plc11 user1540-key1 +3541 1 ssh-rsa 11key4plc11 user1541-key1 +3542 1 ssh-rsa 11key4plc11 user1542-key1 +3543 1 ssh-rsa 11key4plc11 user1543-key1 +3544 1 ssh-rsa 11key4plc11 user1544-key1 +3545 1 ssh-rsa 11key4plc11 user1545-key1 +3546 1 ssh-rsa 11key4plc11 user1546-key1 +3547 1 ssh-rsa 11key4plc11 user1547-key1 +3548 1 ssh-rsa 11key4plc11 user1548-key1 +3549 1 ssh-rsa 11key4plc11 user1549-key1 +3550 1 ssh-rsa 11key4plc11 user1550-key1 +3551 1 ssh-rsa 11key4plc11 user1551-key1 +3552 1 ssh-rsa 11key4plc11 user1552-key1 +3553 1 ssh-rsa 11key4plc11 user1553-key1 +3554 1 ssh-rsa 11key4plc11 user1554-key1 +3555 1 ssh-rsa 11key4plc11 user1555-key1 +3556 1 ssh-rsa 11key4plc11 user1556-key1 +3557 1 ssh-rsa 11key4plc11 user1557-key1 +3558 1 ssh-rsa 11key4plc11 user1558-key1 +3559 1 ssh-rsa 11key4plc11 user1559-key1 +3560 1 ssh-rsa 11key4plc11 user1560-key1 +3561 1 ssh-rsa 11key4plc11 user1561-key1 +3562 1 ssh-rsa 11key4plc11 user1562-key1 +3563 1 ssh-rsa 11key4plc11 user1563-key1 +3564 1 ssh-rsa 11key4plc11 user1564-key1 +3565 1 ssh-rsa 11key4plc11 user1565-key1 +3566 1 ssh-rsa 11key4plc11 user1566-key1 +3567 1 ssh-rsa 11key4plc11 user1567-key1 +3568 1 ssh-rsa 11key4plc11 user1568-key1 +3569 1 ssh-rsa 11key4plc11 user1569-key1 +3570 1 ssh-rsa 11key4plc11 user1570-key1 +3571 1 ssh-rsa 11key4plc11 user1571-key1 +3572 1 ssh-rsa 11key4plc11 user1572-key1 +3573 1 ssh-rsa 11key4plc11 user1573-key1 +3574 1 ssh-rsa 11key4plc11 user1574-key1 +3575 1 ssh-rsa 11key4plc11 user1575-key1 +3576 1 ssh-rsa 11key4plc11 user1576-key1 +3577 1 ssh-rsa 11key4plc11 user1577-key1 +3578 1 ssh-rsa 11key4plc11 user1578-key1 +3579 1 ssh-rsa 11key4plc11 user1579-key1 +3580 1 ssh-rsa 11key4plc11 user1580-key1 +3581 1 ssh-rsa 11key4plc11 user1581-key1 +3582 1 ssh-rsa 11key4plc11 user1582-key1 +3583 1 ssh-rsa 11key4plc11 user1583-key1 +3584 1 ssh-rsa 11key4plc11 user1584-key1 +3585 1 ssh-rsa 11key4plc11 user1585-key1 +3586 1 ssh-rsa 11key4plc11 user1586-key1 +3587 1 ssh-rsa 11key4plc11 user1587-key1 +3588 1 ssh-rsa 11key4plc11 user1588-key1 +3589 1 ssh-rsa 11key4plc11 user1589-key1 +3590 1 ssh-rsa 11key4plc11 user1590-key1 +3591 1 ssh-rsa 11key4plc11 user1591-key1 +3592 1 ssh-rsa 11key4plc11 user1592-key1 +3593 1 ssh-rsa 11key4plc11 user1593-key1 +3594 1 ssh-rsa 11key4plc11 user1594-key1 +3595 1 ssh-rsa 11key4plc11 user1595-key1 +3596 1 ssh-rsa 11key4plc11 user1596-key1 +3597 1 ssh-rsa 11key4plc11 user1597-key1 +3598 1 ssh-rsa 11key4plc11 user1598-key1 +3599 1 ssh-rsa 11key4plc11 user1599-key1 +3600 1 ssh-rsa 11key4plc11 user1600-key1 +3601 1 ssh-rsa 11key4plc11 user1601-key1 +3602 1 ssh-rsa 11key4plc11 user1602-key1 +3603 1 ssh-rsa 11key4plc11 user1603-key1 +3604 1 ssh-rsa 11key4plc11 user1604-key1 +3605 1 ssh-rsa 11key4plc11 user1605-key1 +3606 1 ssh-rsa 11key4plc11 user1606-key1 +3607 1 ssh-rsa 11key4plc11 user1607-key1 +3608 1 ssh-rsa 11key4plc11 user1608-key1 +3609 1 ssh-rsa 11key4plc11 user1609-key1 +3610 1 ssh-rsa 11key4plc11 user1610-key1 +3611 1 ssh-rsa 11key4plc11 user1611-key1 +3612 1 ssh-rsa 11key4plc11 user1612-key1 +3613 1 ssh-rsa 11key4plc11 user1613-key1 +3614 1 ssh-rsa 11key4plc11 user1614-key1 +3615 1 ssh-rsa 11key4plc11 user1615-key1 +3616 1 ssh-rsa 11key4plc11 user1616-key1 +3617 1 ssh-rsa 11key4plc11 user1617-key1 +3618 1 ssh-rsa 11key4plc11 user1618-key1 +3619 1 ssh-rsa 11key4plc11 user1619-key1 +3620 1 ssh-rsa 11key4plc11 user1620-key1 +3621 1 ssh-rsa 11key4plc11 user1621-key1 +3622 1 ssh-rsa 11key4plc11 user1622-key1 +3623 1 ssh-rsa 11key4plc11 user1623-key1 +3624 1 ssh-rsa 11key4plc11 user1624-key1 +3625 1 ssh-rsa 11key4plc11 user1625-key1 +3626 1 ssh-rsa 11key4plc11 user1626-key1 +3627 1 ssh-rsa 11key4plc11 user1627-key1 +3628 1 ssh-rsa 11key4plc11 user1628-key1 +3629 1 ssh-rsa 11key4plc11 user1629-key1 +3630 1 ssh-rsa 11key4plc11 user1630-key1 +3631 1 ssh-rsa 11key4plc11 user1631-key1 +3632 1 ssh-rsa 11key4plc11 user1632-key1 +3633 1 ssh-rsa 11key4plc11 user1633-key1 +3634 1 ssh-rsa 11key4plc11 user1634-key1 +3635 1 ssh-rsa 11key4plc11 user1635-key1 +3636 1 ssh-rsa 11key4plc11 user1636-key1 +3637 1 ssh-rsa 11key4plc11 user1637-key1 +3638 1 ssh-rsa 11key4plc11 user1638-key1 +3639 1 ssh-rsa 11key4plc11 user1639-key1 +3640 1 ssh-rsa 11key4plc11 user1640-key1 +3641 1 ssh-rsa 11key4plc11 user1641-key1 +3642 1 ssh-rsa 11key4plc11 user1642-key1 +3643 1 ssh-rsa 11key4plc11 user1643-key1 +3644 1 ssh-rsa 11key4plc11 user1644-key1 +3645 1 ssh-rsa 11key4plc11 user1645-key1 +3646 1 ssh-rsa 11key4plc11 user1646-key1 +3647 1 ssh-rsa 11key4plc11 user1647-key1 +3648 1 ssh-rsa 11key4plc11 user1648-key1 +3649 1 ssh-rsa 11key4plc11 user1649-key1 +3650 1 ssh-rsa 11key4plc11 user1650-key1 +3651 1 ssh-rsa 11key4plc11 user1651-key1 +3652 1 ssh-rsa 11key4plc11 user1652-key1 +3653 1 ssh-rsa 11key4plc11 user1653-key1 +3654 1 ssh-rsa 11key4plc11 user1654-key1 +3655 1 ssh-rsa 11key4plc11 user1655-key1 +3656 1 ssh-rsa 11key4plc11 user1656-key1 +3657 1 ssh-rsa 11key4plc11 user1657-key1 +3658 1 ssh-rsa 11key4plc11 user1658-key1 +3659 1 ssh-rsa 11key4plc11 user1659-key1 +3660 1 ssh-rsa 11key4plc11 user1660-key1 +3661 1 ssh-rsa 11key4plc11 user1661-key1 +3662 1 ssh-rsa 11key4plc11 user1662-key1 +3663 1 ssh-rsa 11key4plc11 user1663-key1 +3664 1 ssh-rsa 11key4plc11 user1664-key1 +3665 1 ssh-rsa 11key4plc11 user1665-key1 +3666 1 ssh-rsa 11key4plc11 user1666-key1 +3667 1 ssh-rsa 11key4plc11 user1667-key1 +3668 1 ssh-rsa 11key4plc11 user1668-key1 +3669 1 ssh-rsa 11key4plc11 user1669-key1 +3670 1 ssh-rsa 11key4plc11 user1670-key1 +3671 1 ssh-rsa 11key4plc11 user1671-key1 +3672 1 ssh-rsa 11key4plc11 user1672-key1 +3673 1 ssh-rsa 11key4plc11 user1673-key1 +3674 1 ssh-rsa 11key4plc11 user1674-key1 +3675 1 ssh-rsa 11key4plc11 user1675-key1 +3676 1 ssh-rsa 11key4plc11 user1676-key1 +3677 1 ssh-rsa 11key4plc11 user1677-key1 +3678 1 ssh-rsa 11key4plc11 user1678-key1 +3679 1 ssh-rsa 11key4plc11 user1679-key1 +3680 1 ssh-rsa 11key4plc11 user1680-key1 +3681 1 ssh-rsa 11key4plc11 user1681-key1 +3682 1 ssh-rsa 11key4plc11 user1682-key1 +3683 1 ssh-rsa 11key4plc11 user1683-key1 +3684 1 ssh-rsa 11key4plc11 user1684-key1 +3685 1 ssh-rsa 11key4plc11 user1685-key1 +3686 1 ssh-rsa 11key4plc11 user1686-key1 +3687 1 ssh-rsa 11key4plc11 user1687-key1 +3688 1 ssh-rsa 11key4plc11 user1688-key1 +3689 1 ssh-rsa 11key4plc11 user1689-key1 +3690 1 ssh-rsa 11key4plc11 user1690-key1 +3691 1 ssh-rsa 11key4plc11 user1691-key1 +3692 1 ssh-rsa 11key4plc11 user1692-key1 +3693 1 ssh-rsa 11key4plc11 user1693-key1 +3694 1 ssh-rsa 11key4plc11 user1694-key1 +3695 1 ssh-rsa 11key4plc11 user1695-key1 +3696 1 ssh-rsa 11key4plc11 user1696-key1 +3697 1 ssh-rsa 11key4plc11 user1697-key1 +3698 1 ssh-rsa 11key4plc11 user1698-key1 +3699 1 ssh-rsa 11key4plc11 user1699-key1 +3700 1 ssh-rsa 11key4plc11 user1700-key1 +3701 1 ssh-rsa 11key4plc11 user1701-key1 +3702 1 ssh-rsa 11key4plc11 user1702-key1 +3703 1 ssh-rsa 11key4plc11 user1703-key1 +3704 1 ssh-rsa 11key4plc11 user1704-key1 +3705 1 ssh-rsa 11key4plc11 user1705-key1 +3706 1 ssh-rsa 11key4plc11 user1706-key1 +3707 1 ssh-rsa 11key4plc11 user1707-key1 +3708 1 ssh-rsa 11key4plc11 user1708-key1 +3709 1 ssh-rsa 11key4plc11 user1709-key1 +3710 1 ssh-rsa 11key4plc11 user1710-key1 +3711 1 ssh-rsa 11key4plc11 user1711-key1 +3712 1 ssh-rsa 11key4plc11 user1712-key1 +3713 1 ssh-rsa 11key4plc11 user1713-key1 +3714 1 ssh-rsa 11key4plc11 user1714-key1 +3715 1 ssh-rsa 11key4plc11 user1715-key1 +3716 1 ssh-rsa 11key4plc11 user1716-key1 +3717 1 ssh-rsa 11key4plc11 user1717-key1 +3718 1 ssh-rsa 11key4plc11 user1718-key1 +3719 1 ssh-rsa 11key4plc11 user1719-key1 +3720 1 ssh-rsa 11key4plc11 user1720-key1 +3721 1 ssh-rsa 11key4plc11 user1721-key1 +3722 1 ssh-rsa 11key4plc11 user1722-key1 +3723 1 ssh-rsa 11key4plc11 user1723-key1 +3724 1 ssh-rsa 11key4plc11 user1724-key1 +3725 1 ssh-rsa 11key4plc11 user1725-key1 +3726 1 ssh-rsa 11key4plc11 user1726-key1 +3727 1 ssh-rsa 11key4plc11 user1727-key1 +3728 1 ssh-rsa 11key4plc11 user1728-key1 +3729 1 ssh-rsa 11key4plc11 user1729-key1 +3730 1 ssh-rsa 11key4plc11 user1730-key1 +3731 1 ssh-rsa 11key4plc11 user1731-key1 +3732 1 ssh-rsa 11key4plc11 user1732-key1 +3733 1 ssh-rsa 11key4plc11 user1733-key1 +3734 1 ssh-rsa 11key4plc11 user1734-key1 +3735 1 ssh-rsa 11key4plc11 user1735-key1 +3736 1 ssh-rsa 11key4plc11 user1736-key1 +3737 1 ssh-rsa 11key4plc11 user1737-key1 +3738 1 ssh-rsa 11key4plc11 user1738-key1 +3739 1 ssh-rsa 11key4plc11 user1739-key1 +3740 1 ssh-rsa 11key4plc11 user1740-key1 +3741 1 ssh-rsa 11key4plc11 user1741-key1 +3742 1 ssh-rsa 11key4plc11 user1742-key1 +3743 1 ssh-rsa 11key4plc11 user1743-key1 +3744 1 ssh-rsa 11key4plc11 user1744-key1 +3745 1 ssh-rsa 11key4plc11 user1745-key1 +3746 1 ssh-rsa 11key4plc11 user1746-key1 +3747 1 ssh-rsa 11key4plc11 user1747-key1 +3748 1 ssh-rsa 11key4plc11 user1748-key1 +3749 1 ssh-rsa 11key4plc11 user1749-key1 +3750 1 ssh-rsa 11key4plc11 user1750-key1 +3751 1 ssh-rsa 11key4plc11 user1751-key1 +3752 1 ssh-rsa 11key4plc11 user1752-key1 +3753 1 ssh-rsa 11key4plc11 user1753-key1 +3754 1 ssh-rsa 11key4plc11 user1754-key1 +3755 1 ssh-rsa 11key4plc11 user1755-key1 +3756 1 ssh-rsa 11key4plc11 user1756-key1 +3757 1 ssh-rsa 11key4plc11 user1757-key1 +3758 1 ssh-rsa 11key4plc11 user1758-key1 +3759 1 ssh-rsa 11key4plc11 user1759-key1 +3760 1 ssh-rsa 11key4plc11 user1760-key1 +3761 1 ssh-rsa 11key4plc11 user1761-key1 +3762 1 ssh-rsa 11key4plc11 user1762-key1 +3763 1 ssh-rsa 11key4plc11 user1763-key1 +3764 1 ssh-rsa 11key4plc11 user1764-key1 +3765 1 ssh-rsa 11key4plc11 user1765-key1 +3766 1 ssh-rsa 11key4plc11 user1766-key1 +3767 1 ssh-rsa 11key4plc11 user1767-key1 +3768 1 ssh-rsa 11key4plc11 user1768-key1 +3769 1 ssh-rsa 11key4plc11 user1769-key1 +3770 1 ssh-rsa 11key4plc11 user1770-key1 +3771 1 ssh-rsa 11key4plc11 user1771-key1 +3772 1 ssh-rsa 11key4plc11 user1772-key1 +3773 1 ssh-rsa 11key4plc11 user1773-key1 +3774 1 ssh-rsa 11key4plc11 user1774-key1 +3775 1 ssh-rsa 11key4plc11 user1775-key1 +3776 1 ssh-rsa 11key4plc11 user1776-key1 +3777 1 ssh-rsa 11key4plc11 user1777-key1 +3778 1 ssh-rsa 11key4plc11 user1778-key1 +3779 1 ssh-rsa 11key4plc11 user1779-key1 +3780 1 ssh-rsa 11key4plc11 user1780-key1 +3781 1 ssh-rsa 11key4plc11 user1781-key1 +3782 1 ssh-rsa 11key4plc11 user1782-key1 +3783 1 ssh-rsa 11key4plc11 user1783-key1 +3784 1 ssh-rsa 11key4plc11 user1784-key1 +3785 1 ssh-rsa 11key4plc11 user1785-key1 +3786 1 ssh-rsa 11key4plc11 user1786-key1 +3787 1 ssh-rsa 11key4plc11 user1787-key1 +3788 1 ssh-rsa 11key4plc11 user1788-key1 +3789 1 ssh-rsa 11key4plc11 user1789-key1 +3790 1 ssh-rsa 11key4plc11 user1790-key1 +3791 1 ssh-rsa 11key4plc11 user1791-key1 +3792 1 ssh-rsa 11key4plc11 user1792-key1 +3793 1 ssh-rsa 11key4plc11 user1793-key1 +3794 1 ssh-rsa 11key4plc11 user1794-key1 +3795 1 ssh-rsa 11key4plc11 user1795-key1 +3796 1 ssh-rsa 11key4plc11 user1796-key1 +3797 1 ssh-rsa 11key4plc11 user1797-key1 +3798 1 ssh-rsa 11key4plc11 user1798-key1 +3799 1 ssh-rsa 11key4plc11 user1799-key1 +3800 1 ssh-rsa 11key4plc11 user1800-key1 +3801 1 ssh-rsa 11key4plc11 user1801-key1 +3802 1 ssh-rsa 11key4plc11 user1802-key1 +3803 1 ssh-rsa 11key4plc11 user1803-key1 +3804 1 ssh-rsa 11key4plc11 user1804-key1 +3805 1 ssh-rsa 11key4plc11 user1805-key1 +3806 1 ssh-rsa 11key4plc11 user1806-key1 +3807 1 ssh-rsa 11key4plc11 user1807-key1 +3808 1 ssh-rsa 11key4plc11 user1808-key1 +3809 1 ssh-rsa 11key4plc11 user1809-key1 +3810 1 ssh-rsa 11key4plc11 user1810-key1 +3811 1 ssh-rsa 11key4plc11 user1811-key1 +3812 1 ssh-rsa 11key4plc11 user1812-key1 +3813 1 ssh-rsa 11key4plc11 user1813-key1 +3814 1 ssh-rsa 11key4plc11 user1814-key1 +3815 1 ssh-rsa 11key4plc11 user1815-key1 +3816 1 ssh-rsa 11key4plc11 user1816-key1 +3817 1 ssh-rsa 11key4plc11 user1817-key1 +3818 1 ssh-rsa 11key4plc11 user1818-key1 +3819 1 ssh-rsa 11key4plc11 user1819-key1 +3820 1 ssh-rsa 11key4plc11 user1820-key1 +3821 1 ssh-rsa 11key4plc11 user1821-key1 +3822 1 ssh-rsa 11key4plc11 user1822-key1 +3823 1 ssh-rsa 11key4plc11 user1823-key1 +3824 1 ssh-rsa 11key4plc11 user1824-key1 +3825 1 ssh-rsa 11key4plc11 user1825-key1 +3826 1 ssh-rsa 11key4plc11 user1826-key1 +3827 1 ssh-rsa 11key4plc11 user1827-key1 +3828 1 ssh-rsa 11key4plc11 user1828-key1 +3829 1 ssh-rsa 11key4plc11 user1829-key1 +3830 1 ssh-rsa 11key4plc11 user1830-key1 +3831 1 ssh-rsa 11key4plc11 user1831-key1 +3832 1 ssh-rsa 11key4plc11 user1832-key1 +3833 1 ssh-rsa 11key4plc11 user1833-key1 +3834 1 ssh-rsa 11key4plc11 user1834-key1 +3835 1 ssh-rsa 11key4plc11 user1835-key1 +3836 1 ssh-rsa 11key4plc11 user1836-key1 +3837 1 ssh-rsa 11key4plc11 user1837-key1 +3838 1 ssh-rsa 11key4plc11 user1838-key1 +3839 1 ssh-rsa 11key4plc11 user1839-key1 +3840 1 ssh-rsa 11key4plc11 user1840-key1 +3841 1 ssh-rsa 11key4plc11 user1841-key1 +3842 1 ssh-rsa 11key4plc11 user1842-key1 +3843 1 ssh-rsa 11key4plc11 user1843-key1 +3844 1 ssh-rsa 11key4plc11 user1844-key1 +3845 1 ssh-rsa 11key4plc11 user1845-key1 +3846 1 ssh-rsa 11key4plc11 user1846-key1 +3847 1 ssh-rsa 11key4plc11 user1847-key1 +3848 1 ssh-rsa 11key4plc11 user1848-key1 +3849 1 ssh-rsa 11key4plc11 user1849-key1 +3850 1 ssh-rsa 11key4plc11 user1850-key1 +3851 1 ssh-rsa 11key4plc11 user1851-key1 +3852 1 ssh-rsa 11key4plc11 user1852-key1 +3853 1 ssh-rsa 11key4plc11 user1853-key1 +3854 1 ssh-rsa 11key4plc11 user1854-key1 +3855 1 ssh-rsa 11key4plc11 user1855-key1 +3856 1 ssh-rsa 11key4plc11 user1856-key1 +3857 1 ssh-rsa 11key4plc11 user1857-key1 +3858 1 ssh-rsa 11key4plc11 user1858-key1 +3859 1 ssh-rsa 11key4plc11 user1859-key1 +3860 1 ssh-rsa 11key4plc11 user1860-key1 +3861 1 ssh-rsa 11key4plc11 user1861-key1 +3862 1 ssh-rsa 11key4plc11 user1862-key1 +3863 1 ssh-rsa 11key4plc11 user1863-key1 +3864 1 ssh-rsa 11key4plc11 user1864-key1 +3865 1 ssh-rsa 11key4plc11 user1865-key1 +3866 1 ssh-rsa 11key4plc11 user1866-key1 +3867 1 ssh-rsa 11key4plc11 user1867-key1 +3868 1 ssh-rsa 11key4plc11 user1868-key1 +3869 1 ssh-rsa 11key4plc11 user1869-key1 +3870 1 ssh-rsa 11key4plc11 user1870-key1 +3871 1 ssh-rsa 11key4plc11 user1871-key1 +3872 1 ssh-rsa 11key4plc11 user1872-key1 +3873 1 ssh-rsa 11key4plc11 user1873-key1 +3874 1 ssh-rsa 11key4plc11 user1874-key1 +3875 1 ssh-rsa 11key4plc11 user1875-key1 +3876 1 ssh-rsa 11key4plc11 user1876-key1 +3877 1 ssh-rsa 11key4plc11 user1877-key1 +3878 1 ssh-rsa 11key4plc11 user1878-key1 +3879 1 ssh-rsa 11key4plc11 user1879-key1 +3880 1 ssh-rsa 11key4plc11 user1880-key1 +3881 1 ssh-rsa 11key4plc11 user1881-key1 +3882 1 ssh-rsa 11key4plc11 user1882-key1 +3883 1 ssh-rsa 11key4plc11 user1883-key1 +3884 1 ssh-rsa 11key4plc11 user1884-key1 +3885 1 ssh-rsa 11key4plc11 user1885-key1 +3886 1 ssh-rsa 11key4plc11 user1886-key1 +3887 1 ssh-rsa 11key4plc11 user1887-key1 +3888 1 ssh-rsa 11key4plc11 user1888-key1 +3889 1 ssh-rsa 11key4plc11 user1889-key1 +3890 1 ssh-rsa 11key4plc11 user1890-key1 +3891 1 ssh-rsa 11key4plc11 user1891-key1 +3892 1 ssh-rsa 11key4plc11 user1892-key1 +3893 1 ssh-rsa 11key4plc11 user1893-key1 +3894 1 ssh-rsa 11key4plc11 user1894-key1 +3895 1 ssh-rsa 11key4plc11 user1895-key1 +3896 1 ssh-rsa 11key4plc11 user1896-key1 +3897 1 ssh-rsa 11key4plc11 user1897-key1 +3898 1 ssh-rsa 11key4plc11 user1898-key1 +3899 1 ssh-rsa 11key4plc11 user1899-key1 +3900 1 ssh-rsa 11key4plc11 user1900-key1 +3901 1 ssh-rsa 11key4plc11 user1901-key1 +3902 1 ssh-rsa 11key4plc11 user1902-key1 +3903 1 ssh-rsa 11key4plc11 user1903-key1 +3904 1 ssh-rsa 11key4plc11 user1904-key1 +3905 1 ssh-rsa 11key4plc11 user1905-key1 +3906 1 ssh-rsa 11key4plc11 user1906-key1 +3907 1 ssh-rsa 11key4plc11 user1907-key1 +3908 1 ssh-rsa 11key4plc11 user1908-key1 +3909 1 ssh-rsa 11key4plc11 user1909-key1 +3910 1 ssh-rsa 11key4plc11 user1910-key1 +3911 1 ssh-rsa 11key4plc11 user1911-key1 +3912 1 ssh-rsa 11key4plc11 user1912-key1 +3913 1 ssh-rsa 11key4plc11 user1913-key1 +3914 1 ssh-rsa 11key4plc11 user1914-key1 +3915 1 ssh-rsa 11key4plc11 user1915-key1 +3916 1 ssh-rsa 11key4plc11 user1916-key1 +3917 1 ssh-rsa 11key4plc11 user1917-key1 +3918 1 ssh-rsa 11key4plc11 user1918-key1 +3919 1 ssh-rsa 11key4plc11 user1919-key1 +3920 1 ssh-rsa 11key4plc11 user1920-key1 +3921 1 ssh-rsa 11key4plc11 user1921-key1 +3922 1 ssh-rsa 11key4plc11 user1922-key1 +3923 1 ssh-rsa 11key4plc11 user1923-key1 +3924 1 ssh-rsa 11key4plc11 user1924-key1 +3925 1 ssh-rsa 11key4plc11 user1925-key1 +3926 1 ssh-rsa 11key4plc11 user1926-key1 +3927 1 ssh-rsa 11key4plc11 user1927-key1 +3928 1 ssh-rsa 11key4plc11 user1928-key1 +3929 1 ssh-rsa 11key4plc11 user1929-key1 +3930 1 ssh-rsa 11key4plc11 user1930-key1 +3931 1 ssh-rsa 11key4plc11 user1931-key1 +3932 1 ssh-rsa 11key4plc11 user1932-key1 +3933 1 ssh-rsa 11key4plc11 user1933-key1 +3934 1 ssh-rsa 11key4plc11 user1934-key1 +3935 1 ssh-rsa 11key4plc11 user1935-key1 +3936 1 ssh-rsa 11key4plc11 user1936-key1 +3937 1 ssh-rsa 11key4plc11 user1937-key1 +3938 1 ssh-rsa 11key4plc11 user1938-key1 +3939 1 ssh-rsa 11key4plc11 user1939-key1 +3940 1 ssh-rsa 11key4plc11 user1940-key1 +3941 1 ssh-rsa 11key4plc11 user1941-key1 +3942 1 ssh-rsa 11key4plc11 user1942-key1 +3943 1 ssh-rsa 11key4plc11 user1943-key1 +3944 1 ssh-rsa 11key4plc11 user1944-key1 +3945 1 ssh-rsa 11key4plc11 user1945-key1 +3946 1 ssh-rsa 11key4plc11 user1946-key1 +3947 1 ssh-rsa 11key4plc11 user1947-key1 +3948 1 ssh-rsa 11key4plc11 user1948-key1 +3949 1 ssh-rsa 11key4plc11 user1949-key1 +3950 1 ssh-rsa 11key4plc11 user1950-key1 +3951 1 ssh-rsa 11key4plc11 user1951-key1 +3952 1 ssh-rsa 11key4plc11 user1952-key1 +3953 1 ssh-rsa 11key4plc11 user1953-key1 +3954 1 ssh-rsa 11key4plc11 user1954-key1 +3955 1 ssh-rsa 11key4plc11 user1955-key1 +3956 1 ssh-rsa 11key4plc11 user1956-key1 +3957 1 ssh-rsa 11key4plc11 user1957-key1 +3958 1 ssh-rsa 11key4plc11 user1958-key1 +3959 1 ssh-rsa 11key4plc11 user1959-key1 +3960 1 ssh-rsa 11key4plc11 user1960-key1 +3961 1 ssh-rsa 11key4plc11 user1961-key1 +3962 1 ssh-rsa 11key4plc11 user1962-key1 +3963 1 ssh-rsa 11key4plc11 user1963-key1 +3964 1 ssh-rsa 11key4plc11 user1964-key1 +3965 1 ssh-rsa 11key4plc11 user1965-key1 +3966 1 ssh-rsa 11key4plc11 user1966-key1 +3967 1 ssh-rsa 11key4plc11 user1967-key1 +3968 1 ssh-rsa 11key4plc11 user1968-key1 +3969 1 ssh-rsa 11key4plc11 user1969-key1 +3970 1 ssh-rsa 11key4plc11 user1970-key1 +3971 1 ssh-rsa 11key4plc11 user1971-key1 +3972 1 ssh-rsa 11key4plc11 user1972-key1 +3973 1 ssh-rsa 11key4plc11 user1973-key1 +3974 1 ssh-rsa 11key4plc11 user1974-key1 +3975 1 ssh-rsa 11key4plc11 user1975-key1 +3976 1 ssh-rsa 11key4plc11 user1976-key1 +3977 1 ssh-rsa 11key4plc11 user1977-key1 +3978 1 ssh-rsa 11key4plc11 user1978-key1 +3979 1 ssh-rsa 11key4plc11 user1979-key1 +3980 1 ssh-rsa 11key4plc11 user1980-key1 +3981 1 ssh-rsa 11key4plc11 user1981-key1 +3982 1 ssh-rsa 11key4plc11 user1982-key1 +3983 1 ssh-rsa 11key4plc11 user1983-key1 +3984 1 ssh-rsa 11key4plc11 user1984-key1 +3985 1 ssh-rsa 11key4plc11 user1985-key1 +3986 1 ssh-rsa 11key4plc11 user1986-key1 +3987 1 ssh-rsa 11key4plc11 user1987-key1 +3988 1 ssh-rsa 11key4plc11 user1988-key1 +3989 1 ssh-rsa 11key4plc11 user1989-key1 +3990 1 ssh-rsa 11key4plc11 user1990-key1 +3991 1 ssh-rsa 11key4plc11 user1991-key1 +3992 1 ssh-rsa 11key4plc11 user1992-key1 +3993 1 ssh-rsa 11key4plc11 user1993-key1 +3994 1 ssh-rsa 11key4plc11 user1994-key1 +3995 1 ssh-rsa 11key4plc11 user1995-key1 +3996 1 ssh-rsa 11key4plc11 user1996-key1 +3997 1 ssh-rsa 11key4plc11 user1997-key1 +3998 1 ssh-rsa 11key4plc11 user1998-key1 +3999 1 ssh-rsa 11key4plc11 user1999-key1 +4000 1 ssh-rsa 11key4plc11 user2000-key1 +02: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc2.org keys: [] sites: [1] +3 None peer2@planet-lab.org keys: [] sites: [] +4 None peer1@planet-lab.org keys: [] sites: [] +5 None user2-1@plc2.org keys: [1] sites: [] +6 None user2-2@plc2.org keys: [2] sites: [] +7 None user2-3@plc2.org keys: [3] sites: [] +8 None user2-4@plc2.org keys: [4] sites: [] +9 None user2-5@plc2.org keys: [5] sites: [] +10 None user2-6@plc2.org keys: [6] sites: [] +11 None user2-7@plc2.org keys: [7] sites: [] +12 None user2-8@plc2.org keys: [8] sites: [] +13 None user2-9@plc2.org keys: [9] sites: [] +14 None user2-10@plc2.org keys: [10] sites: [] +15 None user2-11@plc2.org keys: [11] sites: [] +16 None user2-12@plc2.org keys: [12] sites: [] +17 None user2-13@plc2.org keys: [13] sites: [] +18 None user2-14@plc2.org keys: [14] sites: [] +19 None user2-15@plc2.org keys: [15] sites: [] +20 None user2-16@plc2.org keys: [16] sites: [] +21 None user2-17@plc2.org keys: [17] sites: [] +22 None user2-18@plc2.org keys: [18] sites: [] +23 None user2-19@plc2.org keys: [19] sites: [] +24 None user2-20@plc2.org keys: [20] sites: [] +25 None user2-21@plc2.org keys: [21] sites: [] +26 None user2-22@plc2.org keys: [22] sites: [] +27 None user2-23@plc2.org keys: [23] sites: [] +28 None user2-24@plc2.org keys: [24] sites: [] +29 None user2-25@plc2.org keys: [25] sites: [] +30 None user2-26@plc2.org keys: [26] sites: [] +31 None user2-27@plc2.org keys: [27] sites: [] +32 None user2-28@plc2.org keys: [28] sites: [] +33 None user2-29@plc2.org keys: [29] sites: [] +34 None user2-30@plc2.org keys: [30] sites: [] +35 None user2-31@plc2.org keys: [31] sites: [] +36 None user2-32@plc2.org keys: [32] sites: [] +37 None user2-33@plc2.org keys: [33] sites: [] +38 None user2-34@plc2.org keys: [34] sites: [] +39 None user2-35@plc2.org keys: [35] sites: [] +40 None user2-36@plc2.org keys: [36] sites: [] +41 None user2-37@plc2.org keys: [37] sites: [] +42 None user2-38@plc2.org keys: [38] sites: [] +43 None user2-39@plc2.org keys: [39] sites: [] +44 None user2-40@plc2.org keys: [40] sites: [] +45 None user2-41@plc2.org keys: [41] sites: [] +46 None user2-42@plc2.org keys: [42] sites: [] +47 None user2-43@plc2.org keys: [43] sites: [] +48 None user2-44@plc2.org keys: [44] sites: [] +49 None user2-45@plc2.org keys: [45] sites: [] +50 None user2-46@plc2.org keys: [46] sites: [] +51 None user2-47@plc2.org keys: [47] sites: [] +52 None user2-48@plc2.org keys: [48] sites: [] +53 None user2-49@plc2.org keys: [49] sites: [] +54 None user2-50@plc2.org keys: [50] sites: [] +55 None user2-51@plc2.org keys: [51] sites: [] +56 None user2-52@plc2.org keys: [52] sites: [] +57 None user2-53@plc2.org keys: [53] sites: [] +58 None user2-54@plc2.org keys: [54] sites: [] +59 None user2-55@plc2.org keys: [55] sites: [] +60 None user2-56@plc2.org keys: [56] sites: [] +61 None user2-57@plc2.org keys: [57] sites: [] +62 None user2-58@plc2.org keys: [58] sites: [] +63 None user2-59@plc2.org keys: [59] sites: [] +64 None user2-60@plc2.org keys: [60] sites: [] +65 None user2-61@plc2.org keys: [61] sites: [] +66 None user2-62@plc2.org keys: [62] sites: [] +67 None user2-63@plc2.org keys: [63] sites: [] +68 None user2-64@plc2.org keys: [64] sites: [] +69 None user2-65@plc2.org keys: [65] sites: [] +70 None user2-66@plc2.org keys: [66] sites: [] +71 None user2-67@plc2.org keys: [67] sites: [] +72 None user2-68@plc2.org keys: [68] sites: [] +73 None user2-69@plc2.org keys: [69] sites: [] +74 None user2-70@plc2.org keys: [70] sites: [] +75 None user2-71@plc2.org keys: [71] sites: [] +76 None user2-72@plc2.org keys: [72] sites: [] +77 None user2-73@plc2.org keys: [73] sites: [] +78 None user2-74@plc2.org keys: [74] sites: [] +79 None user2-75@plc2.org keys: [75] sites: [] +80 None user2-76@plc2.org keys: [76] sites: [] +81 None user2-77@plc2.org keys: [77] sites: [] +82 None user2-78@plc2.org keys: [78] sites: [] +83 None user2-79@plc2.org keys: [79] sites: [] +84 None user2-80@plc2.org keys: [80] sites: [] +85 None user2-81@plc2.org keys: [81] sites: [] +86 None user2-82@plc2.org keys: [82] sites: [] +87 None user2-83@plc2.org keys: [83] sites: [] +88 None user2-84@plc2.org keys: [84] sites: [] +89 None user2-85@plc2.org keys: [85] sites: [] +90 None user2-86@plc2.org keys: [86] sites: [] +91 None user2-87@plc2.org keys: [87] sites: [] +92 None user2-88@plc2.org keys: [88] sites: [] +93 None user2-89@plc2.org keys: [89] sites: [] +94 None user2-90@plc2.org keys: [90] sites: [] +95 None user2-91@plc2.org keys: [91] sites: [] +96 None user2-92@plc2.org keys: [92] sites: [] +97 None user2-93@plc2.org keys: [93] sites: [] +98 None user2-94@plc2.org keys: [94] sites: [] +99 None user2-95@plc2.org keys: [95] sites: [] +100 None user2-96@plc2.org keys: [96] sites: [] +101 None user2-97@plc2.org keys: [97] sites: [] +102 None user2-98@plc2.org keys: [98] sites: [] +103 None user2-99@plc2.org keys: [99] sites: [] +104 None user2-100@plc2.org keys: [100] sites: [] +105 None user2-101@plc2.org keys: [101] sites: [] +106 None user2-102@plc2.org keys: [102] sites: [] +107 None user2-103@plc2.org keys: [103] sites: [] +108 None user2-104@plc2.org keys: [104] sites: [] +109 None user2-105@plc2.org keys: [105] sites: [] +110 None user2-106@plc2.org keys: [106] sites: [] +111 None user2-107@plc2.org keys: [107] sites: [] +112 None user2-108@plc2.org keys: [108] sites: [] +113 None user2-109@plc2.org keys: [109] sites: [] +114 None user2-110@plc2.org keys: [110] sites: [] +115 None user2-111@plc2.org keys: [111] sites: [] +116 None user2-112@plc2.org keys: [112] sites: [] +117 None user2-113@plc2.org keys: [113] sites: [] +118 None user2-114@plc2.org keys: [114] sites: [] +119 None user2-115@plc2.org keys: [115] sites: [] +120 None user2-116@plc2.org keys: [116] sites: [] +121 None user2-117@plc2.org keys: [117] sites: [] +122 None user2-118@plc2.org keys: [118] sites: [] +123 None user2-119@plc2.org keys: [119] sites: [] +124 None user2-120@plc2.org keys: [120] sites: [] +125 None user2-121@plc2.org keys: [121] sites: [] +126 None user2-122@plc2.org keys: [122] sites: [] +127 None user2-123@plc2.org keys: [123] sites: [] +128 None user2-124@plc2.org keys: [124] sites: [] +129 None user2-125@plc2.org keys: [125] sites: [] +130 None user2-126@plc2.org keys: [126] sites: [] +131 None user2-127@plc2.org keys: [127] sites: [] +132 None user2-128@plc2.org keys: [128] sites: [] +133 None user2-129@plc2.org keys: [129] sites: [] +134 None user2-130@plc2.org keys: [130] sites: [] +135 None user2-131@plc2.org keys: [131] sites: [] +136 None user2-132@plc2.org keys: [132] sites: [] +137 None user2-133@plc2.org keys: [133] sites: [] +138 None user2-134@plc2.org keys: [134] sites: [] +139 None user2-135@plc2.org keys: [135] sites: [] +140 None user2-136@plc2.org keys: [136] sites: [] +141 None user2-137@plc2.org keys: [137] sites: [] +142 None user2-138@plc2.org keys: [138] sites: [] +143 None user2-139@plc2.org keys: [139] sites: [] +144 None user2-140@plc2.org keys: [140] sites: [] +145 None user2-141@plc2.org keys: [141] sites: [] +146 None user2-142@plc2.org keys: [142] sites: [] +147 None user2-143@plc2.org keys: [143] sites: [] +148 None user2-144@plc2.org keys: [144] sites: [] +149 None user2-145@plc2.org keys: [145] sites: [] +150 None user2-146@plc2.org keys: [146] sites: [] +151 None user2-147@plc2.org keys: [147] sites: [] +152 None user2-148@plc2.org keys: [148] sites: [] +153 None user2-149@plc2.org keys: [149] sites: [] +154 None user2-150@plc2.org keys: [150] sites: [] +155 None user2-151@plc2.org keys: [151] sites: [] +156 None user2-152@plc2.org keys: [152] sites: [] +157 None user2-153@plc2.org keys: [153] sites: [] +158 None user2-154@plc2.org keys: [154] sites: [] +159 None user2-155@plc2.org keys: [155] sites: [] +160 None user2-156@plc2.org keys: [156] sites: [] +161 None user2-157@plc2.org keys: [157] sites: [] +162 None user2-158@plc2.org keys: [158] sites: [] +163 None user2-159@plc2.org keys: [159] sites: [] +164 None user2-160@plc2.org keys: [160] sites: [] +165 None user2-161@plc2.org keys: [161] sites: [] +166 None user2-162@plc2.org keys: [162] sites: [] +167 None user2-163@plc2.org keys: [163] sites: [] +168 None user2-164@plc2.org keys: [164] sites: [] +169 None user2-165@plc2.org keys: [165] sites: [] +170 None user2-166@plc2.org keys: [166] sites: [] +171 None user2-167@plc2.org keys: [167] sites: [] +172 None user2-168@plc2.org keys: [168] sites: [] +173 None user2-169@plc2.org keys: [169] sites: [] +174 None user2-170@plc2.org keys: [170] sites: [] +175 None user2-171@plc2.org keys: [171] sites: [] +176 None user2-172@plc2.org keys: [172] sites: [] +177 None user2-173@plc2.org keys: [173] sites: [] +178 None user2-174@plc2.org keys: [174] sites: [] +179 None user2-175@plc2.org keys: [175] sites: [] +180 None user2-176@plc2.org keys: [176] sites: [] +181 None user2-177@plc2.org keys: [177] sites: [] +182 None user2-178@plc2.org keys: [178] sites: [] +183 None user2-179@plc2.org keys: [179] sites: [] +184 None user2-180@plc2.org keys: [180] sites: [] +185 None user2-181@plc2.org keys: [181] sites: [] +186 None user2-182@plc2.org keys: [182] sites: [] +187 None user2-183@plc2.org keys: [183] sites: [] +188 None user2-184@plc2.org keys: [184] sites: [] +189 None user2-185@plc2.org keys: [185] sites: [] +190 None user2-186@plc2.org keys: [186] sites: [] +191 None user2-187@plc2.org keys: [187] sites: [] +192 None user2-188@plc2.org keys: [188] sites: [] +193 None user2-189@plc2.org keys: [189] sites: [] +194 None user2-190@plc2.org keys: [190] sites: [] +195 None user2-191@plc2.org keys: [191] sites: [] +196 None user2-192@plc2.org keys: [192] sites: [] +197 None user2-193@plc2.org keys: [193] sites: [] +198 None user2-194@plc2.org keys: [194] sites: [] +199 None user2-195@plc2.org keys: [195] sites: [] +200 None user2-196@plc2.org keys: [196] sites: [] +201 None user2-197@plc2.org keys: [197] sites: [] +202 None user2-198@plc2.org keys: [198] sites: [] +203 None user2-199@plc2.org keys: [199] sites: [] +204 None user2-200@plc2.org keys: [200] sites: [] +205 None user2-201@plc2.org keys: [201] sites: [] +206 None user2-202@plc2.org keys: [202] sites: [] +207 None user2-203@plc2.org keys: [203] sites: [] +208 None user2-204@plc2.org keys: [204] sites: [] +209 None user2-205@plc2.org keys: [205] sites: [] +210 None user2-206@plc2.org keys: [206] sites: [] +211 None user2-207@plc2.org keys: [207] sites: [] +212 None user2-208@plc2.org keys: [208] sites: [] +213 None user2-209@plc2.org keys: [209] sites: [] +214 None user2-210@plc2.org keys: [210] sites: [] +215 None user2-211@plc2.org keys: [211] sites: [] +216 None user2-212@plc2.org keys: [212] sites: [] +217 None user2-213@plc2.org keys: [213] sites: [] +218 None user2-214@plc2.org keys: [214] sites: [] +219 None user2-215@plc2.org keys: [215] sites: [] +220 None user2-216@plc2.org keys: [216] sites: [] +221 None user2-217@plc2.org keys: [217] sites: [] +222 None user2-218@plc2.org keys: [218] sites: [] +223 None user2-219@plc2.org keys: [219] sites: [] +224 None user2-220@plc2.org keys: [220] sites: [] +225 None user2-221@plc2.org keys: [221] sites: [] +226 None user2-222@plc2.org keys: [222] sites: [] +227 None user2-223@plc2.org keys: [223] sites: [] +228 None user2-224@plc2.org keys: [224] sites: [] +229 None user2-225@plc2.org keys: [225] sites: [] +230 None user2-226@plc2.org keys: [226] sites: [] +231 None user2-227@plc2.org keys: [227] sites: [] +232 None user2-228@plc2.org keys: [228] sites: [] +233 None user2-229@plc2.org keys: [229] sites: [] +234 None user2-230@plc2.org keys: [230] sites: [] +235 None user2-231@plc2.org keys: [231] sites: [] +236 None user2-232@plc2.org keys: [232] sites: [] +237 None user2-233@plc2.org keys: [233] sites: [] +238 None user2-234@plc2.org keys: [234] sites: [] +239 None user2-235@plc2.org keys: [235] sites: [] +240 None user2-236@plc2.org keys: [236] sites: [] +241 None user2-237@plc2.org keys: [237] sites: [] +242 None user2-238@plc2.org keys: [238] sites: [] +243 None user2-239@plc2.org keys: [239] sites: [] +244 None user2-240@plc2.org keys: [240] sites: [] +245 None user2-241@plc2.org keys: [241] sites: [] +246 None user2-242@plc2.org keys: [242] sites: [] +247 None user2-243@plc2.org keys: [243] sites: [] +248 None user2-244@plc2.org keys: [244] sites: [] +249 None user2-245@plc2.org keys: [245] sites: [] +250 None user2-246@plc2.org keys: [246] sites: [] +251 None user2-247@plc2.org keys: [247] sites: [] +252 None user2-248@plc2.org keys: [248] sites: [] +253 None user2-249@plc2.org keys: [249] sites: [] +254 None user2-250@plc2.org keys: [250] sites: [] +255 None user2-251@plc2.org keys: [251] sites: [] +256 None user2-252@plc2.org keys: [252] sites: [] +257 None user2-253@plc2.org keys: [253] sites: [] +258 None user2-254@plc2.org keys: [254] sites: [] +259 None user2-255@plc2.org keys: [255] sites: [] +260 None user2-256@plc2.org keys: [256] sites: [] +261 None user2-257@plc2.org keys: [257] sites: [] +262 None user2-258@plc2.org keys: [258] sites: [] +263 None user2-259@plc2.org keys: [259] sites: [] +264 None user2-260@plc2.org keys: [260] sites: [] +265 None user2-261@plc2.org keys: [261] sites: [] +266 None user2-262@plc2.org keys: [262] sites: [] +267 None user2-263@plc2.org keys: [263] sites: [] +268 None user2-264@plc2.org keys: [264] sites: [] +269 None user2-265@plc2.org keys: [265] sites: [] +270 None user2-266@plc2.org keys: [266] sites: [] +271 None user2-267@plc2.org keys: [267] sites: [] +272 None user2-268@plc2.org keys: [268] sites: [] +273 None user2-269@plc2.org keys: [269] sites: [] +274 None user2-270@plc2.org keys: [270] sites: [] +275 None user2-271@plc2.org keys: [271] sites: [] +276 None user2-272@plc2.org keys: [272] sites: [] +277 None user2-273@plc2.org keys: [273] sites: [] +278 None user2-274@plc2.org keys: [274] sites: [] +279 None user2-275@plc2.org keys: [275] sites: [] +280 None user2-276@plc2.org keys: [276] sites: [] +281 None user2-277@plc2.org keys: [277] sites: [] +282 None user2-278@plc2.org keys: [278] sites: [] +283 None user2-279@plc2.org keys: [279] sites: [] +284 None user2-280@plc2.org keys: [280] sites: [] +285 None user2-281@plc2.org keys: [281] sites: [] +286 None user2-282@plc2.org keys: [282] sites: [] +287 None user2-283@plc2.org keys: [283] sites: [] +288 None user2-284@plc2.org keys: [284] sites: [] +289 None user2-285@plc2.org keys: [285] sites: [] +290 None user2-286@plc2.org keys: [286] sites: [] +291 None user2-287@plc2.org keys: [287] sites: [] +292 None user2-288@plc2.org keys: [288] sites: [] +293 None user2-289@plc2.org keys: [289] sites: [] +294 None user2-290@plc2.org keys: [290] sites: [] +295 None user2-291@plc2.org keys: [291] sites: [] +296 None user2-292@plc2.org keys: [292] sites: [] +297 None user2-293@plc2.org keys: [293] sites: [] +298 None user2-294@plc2.org keys: [294] sites: [] +299 None user2-295@plc2.org keys: [295] sites: [] +300 None user2-296@plc2.org keys: [296] sites: [] +301 None user2-297@plc2.org keys: [297] sites: [] +302 None user2-298@plc2.org keys: [298] sites: [] +303 None user2-299@plc2.org keys: [299] sites: [] +304 None user2-300@plc2.org keys: [300] sites: [] +305 None user2-301@plc2.org keys: [301] sites: [] +306 None user2-302@plc2.org keys: [302] sites: [] +307 None user2-303@plc2.org keys: [303] sites: [] +308 None user2-304@plc2.org keys: [304] sites: [] +309 None user2-305@plc2.org keys: [305] sites: [] +310 None user2-306@plc2.org keys: [306] sites: [] +311 None user2-307@plc2.org keys: [307] sites: [] +312 None user2-308@plc2.org keys: [308] sites: [] +313 None user2-309@plc2.org keys: [309] sites: [] +314 None user2-310@plc2.org keys: [310] sites: [] +315 None user2-311@plc2.org keys: [311] sites: [] +316 None user2-312@plc2.org keys: [312] sites: [] +317 None user2-313@plc2.org keys: [313] sites: [] +318 None user2-314@plc2.org keys: [314] sites: [] +319 None user2-315@plc2.org keys: [315] sites: [] +320 None user2-316@plc2.org keys: [316] sites: [] +321 None user2-317@plc2.org keys: [317] sites: [] +322 None user2-318@plc2.org keys: [318] sites: [] +323 None user2-319@plc2.org keys: [319] sites: [] +324 None user2-320@plc2.org keys: [320] sites: [] +325 None user2-321@plc2.org keys: [321] sites: [] +326 None user2-322@plc2.org keys: [322] sites: [] +327 None user2-323@plc2.org keys: [323] sites: [] +328 None user2-324@plc2.org keys: [324] sites: [] +329 None user2-325@plc2.org keys: [325] sites: [] +330 None user2-326@plc2.org keys: [326] sites: [] +331 None user2-327@plc2.org keys: [327] sites: [] +332 None user2-328@plc2.org keys: [328] sites: [] +333 None user2-329@plc2.org keys: [329] sites: [] +334 None user2-330@plc2.org keys: [330] sites: [] +335 None user2-331@plc2.org keys: [331] sites: [] +336 None user2-332@plc2.org keys: [332] sites: [] +337 None user2-333@plc2.org keys: [333] sites: [] +338 None user2-334@plc2.org keys: [334] sites: [] +339 None user2-335@plc2.org keys: [335] sites: [] +340 None user2-336@plc2.org keys: [336] sites: [] +341 None user2-337@plc2.org keys: [337] sites: [] +342 None user2-338@plc2.org keys: [338] sites: [] +343 None user2-339@plc2.org keys: [339] sites: [] +344 None user2-340@plc2.org keys: [340] sites: [] +345 None user2-341@plc2.org keys: [341] sites: [] +346 None user2-342@plc2.org keys: [342] sites: [] +347 None user2-343@plc2.org keys: [343] sites: [] +348 None user2-344@plc2.org keys: [344] sites: [] +349 None user2-345@plc2.org keys: [345] sites: [] +350 None user2-346@plc2.org keys: [346] sites: [] +351 None user2-347@plc2.org keys: [347] sites: [] +352 None user2-348@plc2.org keys: [348] sites: [] +353 None user2-349@plc2.org keys: [349] sites: [] +354 None user2-350@plc2.org keys: [350] sites: [] +355 None user2-351@plc2.org keys: [351] sites: [] +356 None user2-352@plc2.org keys: [352] sites: [] +357 None user2-353@plc2.org keys: [353] sites: [] +358 None user2-354@plc2.org keys: [354] sites: [] +359 None user2-355@plc2.org keys: [355] sites: [] +360 None user2-356@plc2.org keys: [356] sites: [] +361 None user2-357@plc2.org keys: [357] sites: [] +362 None user2-358@plc2.org keys: [358] sites: [] +363 None user2-359@plc2.org keys: [359] sites: [] +364 None user2-360@plc2.org keys: [360] sites: [] +365 None user2-361@plc2.org keys: [361] sites: [] +366 None user2-362@plc2.org keys: [362] sites: [] +367 None user2-363@plc2.org keys: [363] sites: [] +368 None user2-364@plc2.org keys: [364] sites: [] +369 None user2-365@plc2.org keys: [365] sites: [] +370 None user2-366@plc2.org keys: [366] sites: [] +371 None user2-367@plc2.org keys: [367] sites: [] +372 None user2-368@plc2.org keys: [368] sites: [] +373 None user2-369@plc2.org keys: [369] sites: [] +374 None user2-370@plc2.org keys: [370] sites: [] +375 None user2-371@plc2.org keys: [371] sites: [] +376 None user2-372@plc2.org keys: [372] sites: [] +377 None user2-373@plc2.org keys: [373] sites: [] +378 None user2-374@plc2.org keys: [374] sites: [] +379 None user2-375@plc2.org keys: [375] sites: [] +380 None user2-376@plc2.org keys: [376] sites: [] +381 None user2-377@plc2.org keys: [377] sites: [] +382 None user2-378@plc2.org keys: [378] sites: [] +383 None user2-379@plc2.org keys: [379] sites: [] +384 None user2-380@plc2.org keys: [380] sites: [] +385 None user2-381@plc2.org keys: [381] sites: [] +386 None user2-382@plc2.org keys: [382] sites: [] +387 None user2-383@plc2.org keys: [383] sites: [] +388 None user2-384@plc2.org keys: [384] sites: [] +389 None user2-385@plc2.org keys: [385] sites: [] +390 None user2-386@plc2.org keys: [386] sites: [] +391 None user2-387@plc2.org keys: [387] sites: [] +392 None user2-388@plc2.org keys: [388] sites: [] +393 None user2-389@plc2.org keys: [389] sites: [] +394 None user2-390@plc2.org keys: [390] sites: [] +395 None user2-391@plc2.org keys: [391] sites: [] +396 None user2-392@plc2.org keys: [392] sites: [] +397 None user2-393@plc2.org keys: [393] sites: [] +398 None user2-394@plc2.org keys: [394] sites: [] +399 None user2-395@plc2.org keys: [395] sites: [] +400 None user2-396@plc2.org keys: [396] sites: [] +401 None user2-397@plc2.org keys: [397] sites: [] +402 None user2-398@plc2.org keys: [398] sites: [] +403 None user2-399@plc2.org keys: [399] sites: [] +404 None user2-400@plc2.org keys: [400] sites: [] +405 None user2-401@plc2.org keys: [401] sites: [] +406 None user2-402@plc2.org keys: [402] sites: [] +407 None user2-403@plc2.org keys: [403] sites: [] +408 None user2-404@plc2.org keys: [404] sites: [] +409 None user2-405@plc2.org keys: [405] sites: [] +410 None user2-406@plc2.org keys: [406] sites: [] +411 None user2-407@plc2.org keys: [407] sites: [] +412 None user2-408@plc2.org keys: [408] sites: [] +413 None user2-409@plc2.org keys: [409] sites: [] +414 None user2-410@plc2.org keys: [410] sites: [] +415 None user2-411@plc2.org keys: [411] sites: [] +416 None user2-412@plc2.org keys: [412] sites: [] +417 None user2-413@plc2.org keys: [413] sites: [] +418 None user2-414@plc2.org keys: [414] sites: [] +419 None user2-415@plc2.org keys: [415] sites: [] +420 None user2-416@plc2.org keys: [416] sites: [] +421 None user2-417@plc2.org keys: [417] sites: [] +422 None user2-418@plc2.org keys: [418] sites: [] +423 None user2-419@plc2.org keys: [419] sites: [] +424 None user2-420@plc2.org keys: [420] sites: [] +425 None user2-421@plc2.org keys: [421] sites: [] +426 None user2-422@plc2.org keys: [422] sites: [] +427 None user2-423@plc2.org keys: [423] sites: [] +428 None user2-424@plc2.org keys: [424] sites: [] +429 None user2-425@plc2.org keys: [425] sites: [] +430 None user2-426@plc2.org keys: [426] sites: [] +431 None user2-427@plc2.org keys: [427] sites: [] +432 None user2-428@plc2.org keys: [428] sites: [] +433 None user2-429@plc2.org keys: [429] sites: [] +434 None user2-430@plc2.org keys: [430] sites: [] +435 None user2-431@plc2.org keys: [431] sites: [] +436 None user2-432@plc2.org keys: [432] sites: [] +437 None user2-433@plc2.org keys: [433] sites: [] +438 None user2-434@plc2.org keys: [434] sites: [] +439 None user2-435@plc2.org keys: [435] sites: [] +440 None user2-436@plc2.org keys: [436] sites: [] +441 None user2-437@plc2.org keys: [437] sites: [] +442 None user2-438@plc2.org keys: [438] sites: [] +443 None user2-439@plc2.org keys: [439] sites: [] +444 None user2-440@plc2.org keys: [440] sites: [] +445 None user2-441@plc2.org keys: [441] sites: [] +446 None user2-442@plc2.org keys: [442] sites: [] +447 None user2-443@plc2.org keys: [443] sites: [] +448 None user2-444@plc2.org keys: [444] sites: [] +449 None user2-445@plc2.org keys: [445] sites: [] +450 None user2-446@plc2.org keys: [446] sites: [] +451 None user2-447@plc2.org keys: [447] sites: [] +452 None user2-448@plc2.org keys: [448] sites: [] +453 None user2-449@plc2.org keys: [449] sites: [] +454 None user2-450@plc2.org keys: [450] sites: [] +455 None user2-451@plc2.org keys: [451] sites: [] +456 None user2-452@plc2.org keys: [452] sites: [] +457 None user2-453@plc2.org keys: [453] sites: [] +458 None user2-454@plc2.org keys: [454] sites: [] +459 None user2-455@plc2.org keys: [455] sites: [] +460 None user2-456@plc2.org keys: [456] sites: [] +461 None user2-457@plc2.org keys: [457] sites: [] +462 None user2-458@plc2.org keys: [458] sites: [] +463 None user2-459@plc2.org keys: [459] sites: [] +464 None user2-460@plc2.org keys: [460] sites: [] +465 None user2-461@plc2.org keys: [461] sites: [] +466 None user2-462@plc2.org keys: [462] sites: [] +467 None user2-463@plc2.org keys: [463] sites: [] +468 None user2-464@plc2.org keys: [464] sites: [] +469 None user2-465@plc2.org keys: [465] sites: [] +470 None user2-466@plc2.org keys: [466] sites: [] +471 None user2-467@plc2.org keys: [467] sites: [] +472 None user2-468@plc2.org keys: [468] sites: [] +473 None user2-469@plc2.org keys: [469] sites: [] +474 None user2-470@plc2.org keys: [470] sites: [] +475 None user2-471@plc2.org keys: [471] sites: [] +476 None user2-472@plc2.org keys: [472] sites: [] +477 None user2-473@plc2.org keys: [473] sites: [] +478 None user2-474@plc2.org keys: [474] sites: [] +479 None user2-475@plc2.org keys: [475] sites: [] +480 None user2-476@plc2.org keys: [476] sites: [] +481 None user2-477@plc2.org keys: [477] sites: [] +482 None user2-478@plc2.org keys: [478] sites: [] +483 None user2-479@plc2.org keys: [479] sites: [] +484 None user2-480@plc2.org keys: [480] sites: [] +485 None user2-481@plc2.org keys: [481] sites: [] +486 None user2-482@plc2.org keys: [482] sites: [] +487 None user2-483@plc2.org keys: [483] sites: [] +488 None user2-484@plc2.org keys: [484] sites: [] +489 None user2-485@plc2.org keys: [485] sites: [] +490 None user2-486@plc2.org keys: [486] sites: [] +491 None user2-487@plc2.org keys: [487] sites: [] +492 None user2-488@plc2.org keys: [488] sites: [] +493 None user2-489@plc2.org keys: [489] sites: [] +494 None user2-490@plc2.org keys: [490] sites: [] +495 None user2-491@plc2.org keys: [491] sites: [] +496 None user2-492@plc2.org keys: [492] sites: [] +497 None user2-493@plc2.org keys: [493] sites: [] +498 None user2-494@plc2.org keys: [494] sites: [] +499 None user2-495@plc2.org keys: [495] sites: [] +500 None user2-496@plc2.org keys: [496] sites: [] +501 None user2-497@plc2.org keys: [497] sites: [] +502 None user2-498@plc2.org keys: [498] sites: [] +503 None user2-499@plc2.org keys: [499] sites: [] +504 None user2-500@plc2.org keys: [500] sites: [] +505 None user2-501@plc2.org keys: [501] sites: [] +506 None user2-502@plc2.org keys: [502] sites: [] +507 None user2-503@plc2.org keys: [503] sites: [] +508 None user2-504@plc2.org keys: [504] sites: [] +509 None user2-505@plc2.org keys: [505] sites: [] +510 None user2-506@plc2.org keys: [506] sites: [] +511 None user2-507@plc2.org keys: [507] sites: [] +512 None user2-508@plc2.org keys: [508] sites: [] +513 None user2-509@plc2.org keys: [509] sites: [] +514 None user2-510@plc2.org keys: [510] sites: [] +515 None user2-511@plc2.org keys: [511] sites: [] +516 None user2-512@plc2.org keys: [512] sites: [] +517 None user2-513@plc2.org keys: [513] sites: [] +518 None user2-514@plc2.org keys: [514] sites: [] +519 None user2-515@plc2.org keys: [515] sites: [] +520 None user2-516@plc2.org keys: [516] sites: [] +521 None user2-517@plc2.org keys: [517] sites: [] +522 None user2-518@plc2.org keys: [518] sites: [] +523 None user2-519@plc2.org keys: [519] sites: [] +524 None user2-520@plc2.org keys: [520] sites: [] +525 None user2-521@plc2.org keys: [521] sites: [] +526 None user2-522@plc2.org keys: [522] sites: [] +527 None user2-523@plc2.org keys: [523] sites: [] +528 None user2-524@plc2.org keys: [524] sites: [] +529 None user2-525@plc2.org keys: [525] sites: [] +530 None user2-526@plc2.org keys: [526] sites: [] +531 None user2-527@plc2.org keys: [527] sites: [] +532 None user2-528@plc2.org keys: [528] sites: [] +533 None user2-529@plc2.org keys: [529] sites: [] +534 None user2-530@plc2.org keys: [530] sites: [] +535 None user2-531@plc2.org keys: [531] sites: [] +536 None user2-532@plc2.org keys: [532] sites: [] +537 None user2-533@plc2.org keys: [533] sites: [] +538 None user2-534@plc2.org keys: [534] sites: [] +539 None user2-535@plc2.org keys: [535] sites: [] +540 None user2-536@plc2.org keys: [536] sites: [] +541 None user2-537@plc2.org keys: [537] sites: [] +542 None user2-538@plc2.org keys: [538] sites: [] +543 None user2-539@plc2.org keys: [539] sites: [] +544 None user2-540@plc2.org keys: [540] sites: [] +545 None user2-541@plc2.org keys: [541] sites: [] +546 None user2-542@plc2.org keys: [542] sites: [] +547 None user2-543@plc2.org keys: [543] sites: [] +548 None user2-544@plc2.org keys: [544] sites: [] +549 None user2-545@plc2.org keys: [545] sites: [] +550 None user2-546@plc2.org keys: [546] sites: [] +551 None user2-547@plc2.org keys: [547] sites: [] +552 None user2-548@plc2.org keys: [548] sites: [] +553 None user2-549@plc2.org keys: [549] sites: [] +554 None user2-550@plc2.org keys: [550] sites: [] +555 None user2-551@plc2.org keys: [551] sites: [] +556 None user2-552@plc2.org keys: [552] sites: [] +557 None user2-553@plc2.org keys: [553] sites: [] +558 None user2-554@plc2.org keys: [554] sites: [] +559 None user2-555@plc2.org keys: [555] sites: [] +560 None user2-556@plc2.org keys: [556] sites: [] +561 None user2-557@plc2.org keys: [557] sites: [] +562 None user2-558@plc2.org keys: [558] sites: [] +563 None user2-559@plc2.org keys: [559] sites: [] +564 None user2-560@plc2.org keys: [560] sites: [] +565 None user2-561@plc2.org keys: [561] sites: [] +566 None user2-562@plc2.org keys: [562] sites: [] +567 None user2-563@plc2.org keys: [563] sites: [] +568 None user2-564@plc2.org keys: [564] sites: [] +569 None user2-565@plc2.org keys: [565] sites: [] +570 None user2-566@plc2.org keys: [566] sites: [] +571 None user2-567@plc2.org keys: [567] sites: [] +572 None user2-568@plc2.org keys: [568] sites: [] +573 None user2-569@plc2.org keys: [569] sites: [] +574 None user2-570@plc2.org keys: [570] sites: [] +575 None user2-571@plc2.org keys: [571] sites: [] +576 None user2-572@plc2.org keys: [572] sites: [] +577 None user2-573@plc2.org keys: [573] sites: [] +578 None user2-574@plc2.org keys: [574] sites: [] +579 None user2-575@plc2.org keys: [575] sites: [] +580 None user2-576@plc2.org keys: [576] sites: [] +581 None user2-577@plc2.org keys: [577] sites: [] +582 None user2-578@plc2.org keys: [578] sites: [] +583 None user2-579@plc2.org keys: [579] sites: [] +584 None user2-580@plc2.org keys: [580] sites: [] +585 None user2-581@plc2.org keys: [581] sites: [] +586 None user2-582@plc2.org keys: [582] sites: [] +587 None user2-583@plc2.org keys: [583] sites: [] +588 None user2-584@plc2.org keys: [584] sites: [] +589 None user2-585@plc2.org keys: [585] sites: [] +590 None user2-586@plc2.org keys: [586] sites: [] +591 None user2-587@plc2.org keys: [587] sites: [] +592 None user2-588@plc2.org keys: [588] sites: [] +593 None user2-589@plc2.org keys: [589] sites: [] +594 None user2-590@plc2.org keys: [590] sites: [] +595 None user2-591@plc2.org keys: [591] sites: [] +596 None user2-592@plc2.org keys: [592] sites: [] +597 None user2-593@plc2.org keys: [593] sites: [] +598 None user2-594@plc2.org keys: [594] sites: [] +599 None user2-595@plc2.org keys: [595] sites: [] +600 None user2-596@plc2.org keys: [596] sites: [] +601 None user2-597@plc2.org keys: [597] sites: [] +602 None user2-598@plc2.org keys: [598] sites: [] +603 None user2-599@plc2.org keys: [599] sites: [] +604 None user2-600@plc2.org keys: [600] sites: [] +605 None user2-601@plc2.org keys: [601] sites: [] +606 None user2-602@plc2.org keys: [602] sites: [] +607 None user2-603@plc2.org keys: [603] sites: [] +608 None user2-604@plc2.org keys: [604] sites: [] +609 None user2-605@plc2.org keys: [605] sites: [] +610 None user2-606@plc2.org keys: [606] sites: [] +611 None user2-607@plc2.org keys: [607] sites: [] +612 None user2-608@plc2.org keys: [608] sites: [] +613 None user2-609@plc2.org keys: [609] sites: [] +614 None user2-610@plc2.org keys: [610] sites: [] +615 None user2-611@plc2.org keys: [611] sites: [] +616 None user2-612@plc2.org keys: [612] sites: [] +617 None user2-613@plc2.org keys: [613] sites: [] +618 None user2-614@plc2.org keys: [614] sites: [] +619 None user2-615@plc2.org keys: [615] sites: [] +620 None user2-616@plc2.org keys: [616] sites: [] +621 None user2-617@plc2.org keys: [617] sites: [] +622 None user2-618@plc2.org keys: [618] sites: [] +623 None user2-619@plc2.org keys: [619] sites: [] +624 None user2-620@plc2.org keys: [620] sites: [] +625 None user2-621@plc2.org keys: [621] sites: [] +626 None user2-622@plc2.org keys: [622] sites: [] +627 None user2-623@plc2.org keys: [623] sites: [] +628 None user2-624@plc2.org keys: [624] sites: [] +629 None user2-625@plc2.org keys: [625] sites: [] +630 None user2-626@plc2.org keys: [626] sites: [] +631 None user2-627@plc2.org keys: [627] sites: [] +632 None user2-628@plc2.org keys: [628] sites: [] +633 None user2-629@plc2.org keys: [629] sites: [] +634 None user2-630@plc2.org keys: [630] sites: [] +635 None user2-631@plc2.org keys: [631] sites: [] +636 None user2-632@plc2.org keys: [632] sites: [] +637 None user2-633@plc2.org keys: [633] sites: [] +638 None user2-634@plc2.org keys: [634] sites: [] +639 None user2-635@plc2.org keys: [635] sites: [] +640 None user2-636@plc2.org keys: [636] sites: [] +641 None user2-637@plc2.org keys: [637] sites: [] +642 None user2-638@plc2.org keys: [638] sites: [] +643 None user2-639@plc2.org keys: [639] sites: [] +644 None user2-640@plc2.org keys: [640] sites: [] +645 None user2-641@plc2.org keys: [641] sites: [] +646 None user2-642@plc2.org keys: [642] sites: [] +647 None user2-643@plc2.org keys: [643] sites: [] +648 None user2-644@plc2.org keys: [644] sites: [] +649 None user2-645@plc2.org keys: [645] sites: [] +650 None user2-646@plc2.org keys: [646] sites: [] +651 None user2-647@plc2.org keys: [647] sites: [] +652 None user2-648@plc2.org keys: [648] sites: [] +653 None user2-649@plc2.org keys: [649] sites: [] +654 None user2-650@plc2.org keys: [650] sites: [] +655 None user2-651@plc2.org keys: [651] sites: [] +656 None user2-652@plc2.org keys: [652] sites: [] +657 None user2-653@plc2.org keys: [653] sites: [] +658 None user2-654@plc2.org keys: [654] sites: [] +659 None user2-655@plc2.org keys: [655] sites: [] +660 None user2-656@plc2.org keys: [656] sites: [] +661 None user2-657@plc2.org keys: [657] sites: [] +662 None user2-658@plc2.org keys: [658] sites: [] +663 None user2-659@plc2.org keys: [659] sites: [] +664 None user2-660@plc2.org keys: [660] sites: [] +665 None user2-661@plc2.org keys: [661] sites: [] +666 None user2-662@plc2.org keys: [662] sites: [] +667 None user2-663@plc2.org keys: [663] sites: [] +668 None user2-664@plc2.org keys: [664] sites: [] +669 None user2-665@plc2.org keys: [665] sites: [] +670 None user2-666@plc2.org keys: [666] sites: [] +671 None user2-667@plc2.org keys: [667] sites: [] +672 None user2-668@plc2.org keys: [668] sites: [] +673 None user2-669@plc2.org keys: [669] sites: [] +674 None user2-670@plc2.org keys: [670] sites: [] +675 None user2-671@plc2.org keys: [671] sites: [] +676 None user2-672@plc2.org keys: [672] sites: [] +677 None user2-673@plc2.org keys: [673] sites: [] +678 None user2-674@plc2.org keys: [674] sites: [] +679 None user2-675@plc2.org keys: [675] sites: [] +680 None user2-676@plc2.org keys: [676] sites: [] +681 None user2-677@plc2.org keys: [677] sites: [] +682 None user2-678@plc2.org keys: [678] sites: [] +683 None user2-679@plc2.org keys: [679] sites: [] +684 None user2-680@plc2.org keys: [680] sites: [] +685 None user2-681@plc2.org keys: [681] sites: [] +686 None user2-682@plc2.org keys: [682] sites: [] +687 None user2-683@plc2.org keys: [683] sites: [] +688 None user2-684@plc2.org keys: [684] sites: [] +689 None user2-685@plc2.org keys: [685] sites: [] +690 None user2-686@plc2.org keys: [686] sites: [] +691 None user2-687@plc2.org keys: [687] sites: [] +692 None user2-688@plc2.org keys: [688] sites: [] +693 None user2-689@plc2.org keys: [689] sites: [] +694 None user2-690@plc2.org keys: [690] sites: [] +695 None user2-691@plc2.org keys: [691] sites: [] +696 None user2-692@plc2.org keys: [692] sites: [] +697 None user2-693@plc2.org keys: [693] sites: [] +698 None user2-694@plc2.org keys: [694] sites: [] +699 None user2-695@plc2.org keys: [695] sites: [] +700 None user2-696@plc2.org keys: [696] sites: [] +701 None user2-697@plc2.org keys: [697] sites: [] +702 None user2-698@plc2.org keys: [698] sites: [] +703 None user2-699@plc2.org keys: [699] sites: [] +704 None user2-700@plc2.org keys: [700] sites: [] +705 None user2-701@plc2.org keys: [701] sites: [] +706 None user2-702@plc2.org keys: [702] sites: [] +707 None user2-703@plc2.org keys: [703] sites: [] +708 None user2-704@plc2.org keys: [704] sites: [] +709 None user2-705@plc2.org keys: [705] sites: [] +710 None user2-706@plc2.org keys: [706] sites: [] +711 None user2-707@plc2.org keys: [707] sites: [] +712 None user2-708@plc2.org keys: [708] sites: [] +713 None user2-709@plc2.org keys: [709] sites: [] +714 None user2-710@plc2.org keys: [710] sites: [] +715 None user2-711@plc2.org keys: [711] sites: [] +716 None user2-712@plc2.org keys: [712] sites: [] +717 None user2-713@plc2.org keys: [713] sites: [] +718 None user2-714@plc2.org keys: [714] sites: [] +719 None user2-715@plc2.org keys: [715] sites: [] +720 None user2-716@plc2.org keys: [716] sites: [] +721 None user2-717@plc2.org keys: [717] sites: [] +722 None user2-718@plc2.org keys: [718] sites: [] +723 None user2-719@plc2.org keys: [719] sites: [] +724 None user2-720@plc2.org keys: [720] sites: [] +725 None user2-721@plc2.org keys: [721] sites: [] +726 None user2-722@plc2.org keys: [722] sites: [] +727 None user2-723@plc2.org keys: [723] sites: [] +728 None user2-724@plc2.org keys: [724] sites: [] +729 None user2-725@plc2.org keys: [725] sites: [] +730 None user2-726@plc2.org keys: [726] sites: [] +731 None user2-727@plc2.org keys: [727] sites: [] +732 None user2-728@plc2.org keys: [728] sites: [] +733 None user2-729@plc2.org keys: [729] sites: [] +734 None user2-730@plc2.org keys: [730] sites: [] +735 None user2-731@plc2.org keys: [731] sites: [] +736 None user2-732@plc2.org keys: [732] sites: [] +737 None user2-733@plc2.org keys: [733] sites: [] +738 None user2-734@plc2.org keys: [734] sites: [] +739 None user2-735@plc2.org keys: [735] sites: [] +740 None user2-736@plc2.org keys: [736] sites: [] +741 None user2-737@plc2.org keys: [737] sites: [] +742 None user2-738@plc2.org keys: [738] sites: [] +743 None user2-739@plc2.org keys: [739] sites: [] +744 None user2-740@plc2.org keys: [740] sites: [] +745 None user2-741@plc2.org keys: [741] sites: [] +746 None user2-742@plc2.org keys: [742] sites: [] +747 None user2-743@plc2.org keys: [743] sites: [] +748 None user2-744@plc2.org keys: [744] sites: [] +749 None user2-745@plc2.org keys: [745] sites: [] +750 None user2-746@plc2.org keys: [746] sites: [] +751 None user2-747@plc2.org keys: [747] sites: [] +752 None user2-748@plc2.org keys: [748] sites: [] +753 None user2-749@plc2.org keys: [749] sites: [] +754 None user2-750@plc2.org keys: [750] sites: [] +755 None user2-751@plc2.org keys: [751] sites: [] +756 None user2-752@plc2.org keys: [752] sites: [] +757 None user2-753@plc2.org keys: [753] sites: [] +758 None user2-754@plc2.org keys: [754] sites: [] +759 None user2-755@plc2.org keys: [755] sites: [] +760 None user2-756@plc2.org keys: [756] sites: [] +761 None user2-757@plc2.org keys: [757] sites: [] +762 None user2-758@plc2.org keys: [758] sites: [] +763 None user2-759@plc2.org keys: [759] sites: [] +764 None user2-760@plc2.org keys: [760] sites: [] +765 None user2-761@plc2.org keys: [761] sites: [] +766 None user2-762@plc2.org keys: [762] sites: [] +767 None user2-763@plc2.org keys: [763] sites: [] +768 None user2-764@plc2.org keys: [764] sites: [] +769 None user2-765@plc2.org keys: [765] sites: [] +770 None user2-766@plc2.org keys: [766] sites: [] +771 None user2-767@plc2.org keys: [767] sites: [] +772 None user2-768@plc2.org keys: [768] sites: [] +773 None user2-769@plc2.org keys: [769] sites: [] +774 None user2-770@plc2.org keys: [770] sites: [] +775 None user2-771@plc2.org keys: [771] sites: [] +776 None user2-772@plc2.org keys: [772] sites: [] +777 None user2-773@plc2.org keys: [773] sites: [] +778 None user2-774@plc2.org keys: [774] sites: [] +779 None user2-775@plc2.org keys: [775] sites: [] +780 None user2-776@plc2.org keys: [776] sites: [] +781 None user2-777@plc2.org keys: [777] sites: [] +782 None user2-778@plc2.org keys: [778] sites: [] +783 None user2-779@plc2.org keys: [779] sites: [] +784 None user2-780@plc2.org keys: [780] sites: [] +785 None user2-781@plc2.org keys: [781] sites: [] +786 None user2-782@plc2.org keys: [782] sites: [] +787 None user2-783@plc2.org keys: [783] sites: [] +788 None user2-784@plc2.org keys: [784] sites: [] +789 None user2-785@plc2.org keys: [785] sites: [] +790 None user2-786@plc2.org keys: [786] sites: [] +791 None user2-787@plc2.org keys: [787] sites: [] +792 None user2-788@plc2.org keys: [788] sites: [] +793 None user2-789@plc2.org keys: [789] sites: [] +794 None user2-790@plc2.org keys: [790] sites: [] +795 None user2-791@plc2.org keys: [791] sites: [] +796 None user2-792@plc2.org keys: [792] sites: [] +797 None user2-793@plc2.org keys: [793] sites: [] +798 None user2-794@plc2.org keys: [794] sites: [] +799 None user2-795@plc2.org keys: [795] sites: [] +800 None user2-796@plc2.org keys: [796] sites: [] +801 None user2-797@plc2.org keys: [797] sites: [] +802 None user2-798@plc2.org keys: [798] sites: [] +803 None user2-799@plc2.org keys: [799] sites: [] +804 None user2-800@plc2.org keys: [800] sites: [] +805 None user2-801@plc2.org keys: [801] sites: [] +806 None user2-802@plc2.org keys: [802] sites: [] +807 None user2-803@plc2.org keys: [803] sites: [] +808 None user2-804@plc2.org keys: [804] sites: [] +809 None user2-805@plc2.org keys: [805] sites: [] +810 None user2-806@plc2.org keys: [806] sites: [] +811 None user2-807@plc2.org keys: [807] sites: [] +812 None user2-808@plc2.org keys: [808] sites: [] +813 None user2-809@plc2.org keys: [809] sites: [] +814 None user2-810@plc2.org keys: [810] sites: [] +815 None user2-811@plc2.org keys: [811] sites: [] +816 None user2-812@plc2.org keys: [812] sites: [] +817 None user2-813@plc2.org keys: [813] sites: [] +818 None user2-814@plc2.org keys: [814] sites: [] +819 None user2-815@plc2.org keys: [815] sites: [] +820 None user2-816@plc2.org keys: [816] sites: [] +821 None user2-817@plc2.org keys: [817] sites: [] +822 None user2-818@plc2.org keys: [818] sites: [] +823 None user2-819@plc2.org keys: [819] sites: [] +824 None user2-820@plc2.org keys: [820] sites: [] +825 None user2-821@plc2.org keys: [821] sites: [] +826 None user2-822@plc2.org keys: [822] sites: [] +827 None user2-823@plc2.org keys: [823] sites: [] +828 None user2-824@plc2.org keys: [824] sites: [] +829 None user2-825@plc2.org keys: [825] sites: [] +830 None user2-826@plc2.org keys: [826] sites: [] +831 None user2-827@plc2.org keys: [827] sites: [] +832 None user2-828@plc2.org keys: [828] sites: [] +833 None user2-829@plc2.org keys: [829] sites: [] +834 None user2-830@plc2.org keys: [830] sites: [] +835 None user2-831@plc2.org keys: [831] sites: [] +836 None user2-832@plc2.org keys: [832] sites: [] +837 None user2-833@plc2.org keys: [833] sites: [] +838 None user2-834@plc2.org keys: [834] sites: [] +839 None user2-835@plc2.org keys: [835] sites: [] +840 None user2-836@plc2.org keys: [836] sites: [] +841 None user2-837@plc2.org keys: [837] sites: [] +842 None user2-838@plc2.org keys: [838] sites: [] +843 None user2-839@plc2.org keys: [839] sites: [] +844 None user2-840@plc2.org keys: [840] sites: [] +845 None user2-841@plc2.org keys: [841] sites: [] +846 None user2-842@plc2.org keys: [842] sites: [] +847 None user2-843@plc2.org keys: [843] sites: [] +848 None user2-844@plc2.org keys: [844] sites: [] +849 None user2-845@plc2.org keys: [845] sites: [] +850 None user2-846@plc2.org keys: [846] sites: [] +851 None user2-847@plc2.org keys: [847] sites: [] +852 None user2-848@plc2.org keys: [848] sites: [] +853 None user2-849@plc2.org keys: [849] sites: [] +854 None user2-850@plc2.org keys: [850] sites: [] +855 None user2-851@plc2.org keys: [851] sites: [] +856 None user2-852@plc2.org keys: [852] sites: [] +857 None user2-853@plc2.org keys: [853] sites: [] +858 None user2-854@plc2.org keys: [854] sites: [] +859 None user2-855@plc2.org keys: [855] sites: [] +860 None user2-856@plc2.org keys: [856] sites: [] +861 None user2-857@plc2.org keys: [857] sites: [] +862 None user2-858@plc2.org keys: [858] sites: [] +863 None user2-859@plc2.org keys: [859] sites: [] +864 None user2-860@plc2.org keys: [860] sites: [] +865 None user2-861@plc2.org keys: [861] sites: [] +866 None user2-862@plc2.org keys: [862] sites: [] +867 None user2-863@plc2.org keys: [863] sites: [] +868 None user2-864@plc2.org keys: [864] sites: [] +869 None user2-865@plc2.org keys: [865] sites: [] +870 None user2-866@plc2.org keys: [866] sites: [] +871 None user2-867@plc2.org keys: [867] sites: [] +872 None user2-868@plc2.org keys: [868] sites: [] +873 None user2-869@plc2.org keys: [869] sites: [] +874 None user2-870@plc2.org keys: [870] sites: [] +875 None user2-871@plc2.org keys: [871] sites: [] +876 None user2-872@plc2.org keys: [872] sites: [] +877 None user2-873@plc2.org keys: [873] sites: [] +878 None user2-874@plc2.org keys: [874] sites: [] +879 None user2-875@plc2.org keys: [875] sites: [] +880 None user2-876@plc2.org keys: [876] sites: [] +881 None user2-877@plc2.org keys: [877] sites: [] +882 None user2-878@plc2.org keys: [878] sites: [] +883 None user2-879@plc2.org keys: [879] sites: [] +884 None user2-880@plc2.org keys: [880] sites: [] +885 None user2-881@plc2.org keys: [881] sites: [] +886 None user2-882@plc2.org keys: [882] sites: [] +887 None user2-883@plc2.org keys: [883] sites: [] +888 None user2-884@plc2.org keys: [884] sites: [] +889 None user2-885@plc2.org keys: [885] sites: [] +890 None user2-886@plc2.org keys: [886] sites: [] +891 None user2-887@plc2.org keys: [887] sites: [] +892 None user2-888@plc2.org keys: [888] sites: [] +893 None user2-889@plc2.org keys: [889] sites: [] +894 None user2-890@plc2.org keys: [890] sites: [] +895 None user2-891@plc2.org keys: [891] sites: [] +896 None user2-892@plc2.org keys: [892] sites: [] +897 None user2-893@plc2.org keys: [893] sites: [] +898 None user2-894@plc2.org keys: [894] sites: [] +899 None user2-895@plc2.org keys: [895] sites: [] +900 None user2-896@plc2.org keys: [896] sites: [] +901 None user2-897@plc2.org keys: [897] sites: [] +902 None user2-898@plc2.org keys: [898] sites: [] +903 None user2-899@plc2.org keys: [899] sites: [] +904 None user2-900@plc2.org keys: [900] sites: [] +905 None user2-901@plc2.org keys: [901] sites: [] +906 None user2-902@plc2.org keys: [902] sites: [] +907 None user2-903@plc2.org keys: [903] sites: [] +908 None user2-904@plc2.org keys: [904] sites: [] +909 None user2-905@plc2.org keys: [905] sites: [] +910 None user2-906@plc2.org keys: [906] sites: [] +911 None user2-907@plc2.org keys: [907] sites: [] +912 None user2-908@plc2.org keys: [908] sites: [] +913 None user2-909@plc2.org keys: [909] sites: [] +914 None user2-910@plc2.org keys: [910] sites: [] +915 None user2-911@plc2.org keys: [911] sites: [] +916 None user2-912@plc2.org keys: [912] sites: [] +917 None user2-913@plc2.org keys: [913] sites: [] +918 None user2-914@plc2.org keys: [914] sites: [] +919 None user2-915@plc2.org keys: [915] sites: [] +920 None user2-916@plc2.org keys: [916] sites: [] +921 None user2-917@plc2.org keys: [917] sites: [] +922 None user2-918@plc2.org keys: [918] sites: [] +923 None user2-919@plc2.org keys: [919] sites: [] +924 None user2-920@plc2.org keys: [920] sites: [] +925 None user2-921@plc2.org keys: [921] sites: [] +926 None user2-922@plc2.org keys: [922] sites: [] +927 None user2-923@plc2.org keys: [923] sites: [] +928 None user2-924@plc2.org keys: [924] sites: [] +929 None user2-925@plc2.org keys: [925] sites: [] +930 None user2-926@plc2.org keys: [926] sites: [] +931 None user2-927@plc2.org keys: [927] sites: [] +932 None user2-928@plc2.org keys: [928] sites: [] +933 None user2-929@plc2.org keys: [929] sites: [] +934 None user2-930@plc2.org keys: [930] sites: [] +935 None user2-931@plc2.org keys: [931] sites: [] +936 None user2-932@plc2.org keys: [932] sites: [] +937 None user2-933@plc2.org keys: [933] sites: [] +938 None user2-934@plc2.org keys: [934] sites: [] +939 None user2-935@plc2.org keys: [935] sites: [] +940 None user2-936@plc2.org keys: [936] sites: [] +941 None user2-937@plc2.org keys: [937] sites: [] +942 None user2-938@plc2.org keys: [938] sites: [] +943 None user2-939@plc2.org keys: [939] sites: [] +944 None user2-940@plc2.org keys: [940] sites: [] +945 None user2-941@plc2.org keys: [941] sites: [] +946 None user2-942@plc2.org keys: [942] sites: [] +947 None user2-943@plc2.org keys: [943] sites: [] +948 None user2-944@plc2.org keys: [944] sites: [] +949 None user2-945@plc2.org keys: [945] sites: [] +950 None user2-946@plc2.org keys: [946] sites: [] +951 None user2-947@plc2.org keys: [947] sites: [] +952 None user2-948@plc2.org keys: [948] sites: [] +953 None user2-949@plc2.org keys: [949] sites: [] +954 None user2-950@plc2.org keys: [950] sites: [] +955 None user2-951@plc2.org keys: [951] sites: [] +956 None user2-952@plc2.org keys: [952] sites: [] +957 None user2-953@plc2.org keys: [953] sites: [] +958 None user2-954@plc2.org keys: [954] sites: [] +959 None user2-955@plc2.org keys: [955] sites: [] +960 None user2-956@plc2.org keys: [956] sites: [] +961 None user2-957@plc2.org keys: [957] sites: [] +962 None user2-958@plc2.org keys: [958] sites: [] +963 None user2-959@plc2.org keys: [959] sites: [] +964 None user2-960@plc2.org keys: [960] sites: [] +965 None user2-961@plc2.org keys: [961] sites: [] +966 None user2-962@plc2.org keys: [962] sites: [] +967 None user2-963@plc2.org keys: [963] sites: [] +968 None user2-964@plc2.org keys: [964] sites: [] +969 None user2-965@plc2.org keys: [965] sites: [] +970 None user2-966@plc2.org keys: [966] sites: [] +971 None user2-967@plc2.org keys: [967] sites: [] +972 None user2-968@plc2.org keys: [968] sites: [] +973 None user2-969@plc2.org keys: [969] sites: [] +974 None user2-970@plc2.org keys: [970] sites: [] +975 None user2-971@plc2.org keys: [971] sites: [] +976 None user2-972@plc2.org keys: [972] sites: [] +977 None user2-973@plc2.org keys: [973] sites: [] +978 None user2-974@plc2.org keys: [974] sites: [] +979 None user2-975@plc2.org keys: [975] sites: [] +980 None user2-976@plc2.org keys: [976] sites: [] +981 None user2-977@plc2.org keys: [977] sites: [] +982 None user2-978@plc2.org keys: [978] sites: [] +983 None user2-979@plc2.org keys: [979] sites: [] +984 None user2-980@plc2.org keys: [980] sites: [] +985 None user2-981@plc2.org keys: [981] sites: [] +986 None user2-982@plc2.org keys: [982] sites: [] +987 None user2-983@plc2.org keys: [983] sites: [] +988 None user2-984@plc2.org keys: [984] sites: [] +989 None user2-985@plc2.org keys: [985] sites: [] +990 None user2-986@plc2.org keys: [986] sites: [] +991 None user2-987@plc2.org keys: [987] sites: [] +992 None user2-988@plc2.org keys: [988] sites: [] +993 None user2-989@plc2.org keys: [989] sites: [] +994 None user2-990@plc2.org keys: [990] sites: [] +995 None user2-991@plc2.org keys: [991] sites: [] +996 None user2-992@plc2.org keys: [992] sites: [] +997 None user2-993@plc2.org keys: [993] sites: [] +998 None user2-994@plc2.org keys: [994] sites: [] +999 None user2-995@plc2.org keys: [995] sites: [] +1000 None user2-996@plc2.org keys: [996] sites: [] +1001 None user2-997@plc2.org keys: [997] sites: [] +1002 None user2-998@plc2.org keys: [998] sites: [] +1003 None user2-999@plc2.org keys: [999] sites: [] +1004 None user2-1000@plc2.org keys: [1000] sites: [] +1005 None user2-1001@plc2.org keys: [1001] sites: [] +1006 None user2-1002@plc2.org keys: [1002] sites: [] +1007 None user2-1003@plc2.org keys: [1003] sites: [] +1008 None user2-1004@plc2.org keys: [1004] sites: [] +1009 None user2-1005@plc2.org keys: [1005] sites: [] +1010 None user2-1006@plc2.org keys: [1006] sites: [] +1011 None user2-1007@plc2.org keys: [1007] sites: [] +1012 None user2-1008@plc2.org keys: [1008] sites: [] +1013 None user2-1009@plc2.org keys: [1009] sites: [] +1014 None user2-1010@plc2.org keys: [1010] sites: [] +1015 None user2-1011@plc2.org keys: [1011] sites: [] +1016 None user2-1012@plc2.org keys: [1012] sites: [] +1017 None user2-1013@plc2.org keys: [1013] sites: [] +1018 None user2-1014@plc2.org keys: [1014] sites: [] +1019 None user2-1015@plc2.org keys: [1015] sites: [] +1020 None user2-1016@plc2.org keys: [1016] sites: [] +1021 None user2-1017@plc2.org keys: [1017] sites: [] +1022 None user2-1018@plc2.org keys: [1018] sites: [] +1023 None user2-1019@plc2.org keys: [1019] sites: [] +1024 None user2-1020@plc2.org keys: [1020] sites: [] +1025 None user2-1021@plc2.org keys: [1021] sites: [] +1026 None user2-1022@plc2.org keys: [1022] sites: [] +1027 None user2-1023@plc2.org keys: [1023] sites: [] +1028 None user2-1024@plc2.org keys: [1024] sites: [] +1029 None user2-1025@plc2.org keys: [1025] sites: [] +1030 None user2-1026@plc2.org keys: [1026] sites: [] +1031 None user2-1027@plc2.org keys: [1027] sites: [] +1032 None user2-1028@plc2.org keys: [1028] sites: [] +1033 None user2-1029@plc2.org keys: [1029] sites: [] +1034 None user2-1030@plc2.org keys: [1030] sites: [] +1035 None user2-1031@plc2.org keys: [1031] sites: [] +1036 None user2-1032@plc2.org keys: [1032] sites: [] +1037 None user2-1033@plc2.org keys: [1033] sites: [] +1038 None user2-1034@plc2.org keys: [1034] sites: [] +1039 None user2-1035@plc2.org keys: [1035] sites: [] +1040 None user2-1036@plc2.org keys: [1036] sites: [] +1041 None user2-1037@plc2.org keys: [1037] sites: [] +1042 None user2-1038@plc2.org keys: [1038] sites: [] +1043 None user2-1039@plc2.org keys: [1039] sites: [] +1044 None user2-1040@plc2.org keys: [1040] sites: [] +1045 None user2-1041@plc2.org keys: [1041] sites: [] +1046 None user2-1042@plc2.org keys: [1042] sites: [] +1047 None user2-1043@plc2.org keys: [1043] sites: [] +1048 None user2-1044@plc2.org keys: [1044] sites: [] +1049 None user2-1045@plc2.org keys: [1045] sites: [] +1050 None user2-1046@plc2.org keys: [1046] sites: [] +1051 None user2-1047@plc2.org keys: [1047] sites: [] +1052 None user2-1048@plc2.org keys: [1048] sites: [] +1053 None user2-1049@plc2.org keys: [1049] sites: [] +1054 None user2-1050@plc2.org keys: [1050] sites: [] +1055 None user2-1051@plc2.org keys: [1051] sites: [] +1056 None user2-1052@plc2.org keys: [1052] sites: [] +1057 None user2-1053@plc2.org keys: [1053] sites: [] +1058 None user2-1054@plc2.org keys: [1054] sites: [] +1059 None user2-1055@plc2.org keys: [1055] sites: [] +1060 None user2-1056@plc2.org keys: [1056] sites: [] +1061 None user2-1057@plc2.org keys: [1057] sites: [] +1062 None user2-1058@plc2.org keys: [1058] sites: [] +1063 None user2-1059@plc2.org keys: [1059] sites: [] +1064 None user2-1060@plc2.org keys: [1060] sites: [] +1065 None user2-1061@plc2.org keys: [1061] sites: [] +1066 None user2-1062@plc2.org keys: [1062] sites: [] +1067 None user2-1063@plc2.org keys: [1063] sites: [] +1068 None user2-1064@plc2.org keys: [1064] sites: [] +1069 None user2-1065@plc2.org keys: [1065] sites: [] +1070 None user2-1066@plc2.org keys: [1066] sites: [] +1071 None user2-1067@plc2.org keys: [1067] sites: [] +1072 None user2-1068@plc2.org keys: [1068] sites: [] +1073 None user2-1069@plc2.org keys: [1069] sites: [] +1074 None user2-1070@plc2.org keys: [1070] sites: [] +1075 None user2-1071@plc2.org keys: [1071] sites: [] +1076 None user2-1072@plc2.org keys: [1072] sites: [] +1077 None user2-1073@plc2.org keys: [1073] sites: [] +1078 None user2-1074@plc2.org keys: [1074] sites: [] +1079 None user2-1075@plc2.org keys: [1075] sites: [] +1080 None user2-1076@plc2.org keys: [1076] sites: [] +1081 None user2-1077@plc2.org keys: [1077] sites: [] +1082 None user2-1078@plc2.org keys: [1078] sites: [] +1083 None user2-1079@plc2.org keys: [1079] sites: [] +1084 None user2-1080@plc2.org keys: [1080] sites: [] +1085 None user2-1081@plc2.org keys: [1081] sites: [] +1086 None user2-1082@plc2.org keys: [1082] sites: [] +1087 None user2-1083@plc2.org keys: [1083] sites: [] +1088 None user2-1084@plc2.org keys: [1084] sites: [] +1089 None user2-1085@plc2.org keys: [1085] sites: [] +1090 None user2-1086@plc2.org keys: [1086] sites: [] +1091 None user2-1087@plc2.org keys: [1087] sites: [] +1092 None user2-1088@plc2.org keys: [1088] sites: [] +1093 None user2-1089@plc2.org keys: [1089] sites: [] +1094 None user2-1090@plc2.org keys: [1090] sites: [] +1095 None user2-1091@plc2.org keys: [1091] sites: [] +1096 None user2-1092@plc2.org keys: [1092] sites: [] +1097 None user2-1093@plc2.org keys: [1093] sites: [] +1098 None user2-1094@plc2.org keys: [1094] sites: [] +1099 None user2-1095@plc2.org keys: [1095] sites: [] +1100 None user2-1096@plc2.org keys: [1096] sites: [] +1101 None user2-1097@plc2.org keys: [1097] sites: [] +1102 None user2-1098@plc2.org keys: [1098] sites: [] +1103 None user2-1099@plc2.org keys: [1099] sites: [] +1104 None user2-1100@plc2.org keys: [1100] sites: [] +1105 None user2-1101@plc2.org keys: [1101] sites: [] +1106 None user2-1102@plc2.org keys: [1102] sites: [] +1107 None user2-1103@plc2.org keys: [1103] sites: [] +1108 None user2-1104@plc2.org keys: [1104] sites: [] +1109 None user2-1105@plc2.org keys: [1105] sites: [] +1110 None user2-1106@plc2.org keys: [1106] sites: [] +1111 None user2-1107@plc2.org keys: [1107] sites: [] +1112 None user2-1108@plc2.org keys: [1108] sites: [] +1113 None user2-1109@plc2.org keys: [1109] sites: [] +1114 None user2-1110@plc2.org keys: [1110] sites: [] +1115 None user2-1111@plc2.org keys: [1111] sites: [] +1116 None user2-1112@plc2.org keys: [1112] sites: [] +1117 None user2-1113@plc2.org keys: [1113] sites: [] +1118 None user2-1114@plc2.org keys: [1114] sites: [] +1119 None user2-1115@plc2.org keys: [1115] sites: [] +1120 None user2-1116@plc2.org keys: [1116] sites: [] +1121 None user2-1117@plc2.org keys: [1117] sites: [] +1122 None user2-1118@plc2.org keys: [1118] sites: [] +1123 None user2-1119@plc2.org keys: [1119] sites: [] +1124 None user2-1120@plc2.org keys: [1120] sites: [] +1125 None user2-1121@plc2.org keys: [1121] sites: [] +1126 None user2-1122@plc2.org keys: [1122] sites: [] +1127 None user2-1123@plc2.org keys: [1123] sites: [] +1128 None user2-1124@plc2.org keys: [1124] sites: [] +1129 None user2-1125@plc2.org keys: [1125] sites: [] +1130 None user2-1126@plc2.org keys: [1126] sites: [] +1131 None user2-1127@plc2.org keys: [1127] sites: [] +1132 None user2-1128@plc2.org keys: [1128] sites: [] +1133 None user2-1129@plc2.org keys: [1129] sites: [] +1134 None user2-1130@plc2.org keys: [1130] sites: [] +1135 None user2-1131@plc2.org keys: [1131] sites: [] +1136 None user2-1132@plc2.org keys: [1132] sites: [] +1137 None user2-1133@plc2.org keys: [1133] sites: [] +1138 None user2-1134@plc2.org keys: [1134] sites: [] +1139 None user2-1135@plc2.org keys: [1135] sites: [] +1140 None user2-1136@plc2.org keys: [1136] sites: [] +1141 None user2-1137@plc2.org keys: [1137] sites: [] +1142 None user2-1138@plc2.org keys: [1138] sites: [] +1143 None user2-1139@plc2.org keys: [1139] sites: [] +1144 None user2-1140@plc2.org keys: [1140] sites: [] +1145 None user2-1141@plc2.org keys: [1141] sites: [] +1146 None user2-1142@plc2.org keys: [1142] sites: [] +1147 None user2-1143@plc2.org keys: [1143] sites: [] +1148 None user2-1144@plc2.org keys: [1144] sites: [] +1149 None user2-1145@plc2.org keys: [1145] sites: [] +1150 None user2-1146@plc2.org keys: [1146] sites: [] +1151 None user2-1147@plc2.org keys: [1147] sites: [] +1152 None user2-1148@plc2.org keys: [1148] sites: [] +1153 None user2-1149@plc2.org keys: [1149] sites: [] +1154 None user2-1150@plc2.org keys: [1150] sites: [] +1155 None user2-1151@plc2.org keys: [1151] sites: [] +1156 None user2-1152@plc2.org keys: [1152] sites: [] +1157 None user2-1153@plc2.org keys: [1153] sites: [] +1158 None user2-1154@plc2.org keys: [1154] sites: [] +1159 None user2-1155@plc2.org keys: [1155] sites: [] +1160 None user2-1156@plc2.org keys: [1156] sites: [] +1161 None user2-1157@plc2.org keys: [1157] sites: [] +1162 None user2-1158@plc2.org keys: [1158] sites: [] +1163 None user2-1159@plc2.org keys: [1159] sites: [] +1164 None user2-1160@plc2.org keys: [1160] sites: [] +1165 None user2-1161@plc2.org keys: [1161] sites: [] +1166 None user2-1162@plc2.org keys: [1162] sites: [] +1167 None user2-1163@plc2.org keys: [1163] sites: [] +1168 None user2-1164@plc2.org keys: [1164] sites: [] +1169 None user2-1165@plc2.org keys: [1165] sites: [] +1170 None user2-1166@plc2.org keys: [1166] sites: [] +1171 None user2-1167@plc2.org keys: [1167] sites: [] +1172 None user2-1168@plc2.org keys: [1168] sites: [] +1173 None user2-1169@plc2.org keys: [1169] sites: [] +1174 None user2-1170@plc2.org keys: [1170] sites: [] +1175 None user2-1171@plc2.org keys: [1171] sites: [] +1176 None user2-1172@plc2.org keys: [1172] sites: [] +1177 None user2-1173@plc2.org keys: [1173] sites: [] +1178 None user2-1174@plc2.org keys: [1174] sites: [] +1179 None user2-1175@plc2.org keys: [1175] sites: [] +1180 None user2-1176@plc2.org keys: [1176] sites: [] +1181 None user2-1177@plc2.org keys: [1177] sites: [] +1182 None user2-1178@plc2.org keys: [1178] sites: [] +1183 None user2-1179@plc2.org keys: [1179] sites: [] +1184 None user2-1180@plc2.org keys: [1180] sites: [] +1185 None user2-1181@plc2.org keys: [1181] sites: [] +1186 None user2-1182@plc2.org keys: [1182] sites: [] +1187 None user2-1183@plc2.org keys: [1183] sites: [] +1188 None user2-1184@plc2.org keys: [1184] sites: [] +1189 None user2-1185@plc2.org keys: [1185] sites: [] +1190 None user2-1186@plc2.org keys: [1186] sites: [] +1191 None user2-1187@plc2.org keys: [1187] sites: [] +1192 None user2-1188@plc2.org keys: [1188] sites: [] +1193 None user2-1189@plc2.org keys: [1189] sites: [] +1194 None user2-1190@plc2.org keys: [1190] sites: [] +1195 None user2-1191@plc2.org keys: [1191] sites: [] +1196 None user2-1192@plc2.org keys: [1192] sites: [] +1197 None user2-1193@plc2.org keys: [1193] sites: [] +1198 None user2-1194@plc2.org keys: [1194] sites: [] +1199 None user2-1195@plc2.org keys: [1195] sites: [] +1200 None user2-1196@plc2.org keys: [1196] sites: [] +1201 None user2-1197@plc2.org keys: [1197] sites: [] +1202 None user2-1198@plc2.org keys: [1198] sites: [] +1203 None user2-1199@plc2.org keys: [1199] sites: [] +1204 None user2-1200@plc2.org keys: [1200] sites: [] +1205 None user2-1201@plc2.org keys: [1201] sites: [] +1206 None user2-1202@plc2.org keys: [1202] sites: [] +1207 None user2-1203@plc2.org keys: [1203] sites: [] +1208 None user2-1204@plc2.org keys: [1204] sites: [] +1209 None user2-1205@plc2.org keys: [1205] sites: [] +1210 None user2-1206@plc2.org keys: [1206] sites: [] +1211 None user2-1207@plc2.org keys: [1207] sites: [] +1212 None user2-1208@plc2.org keys: [1208] sites: [] +1213 None user2-1209@plc2.org keys: [1209] sites: [] +1214 None user2-1210@plc2.org keys: [1210] sites: [] +1215 None user2-1211@plc2.org keys: [1211] sites: [] +1216 None user2-1212@plc2.org keys: [1212] sites: [] +1217 None user2-1213@plc2.org keys: [1213] sites: [] +1218 None user2-1214@plc2.org keys: [1214] sites: [] +1219 None user2-1215@plc2.org keys: [1215] sites: [] +1220 None user2-1216@plc2.org keys: [1216] sites: [] +1221 None user2-1217@plc2.org keys: [1217] sites: [] +1222 None user2-1218@plc2.org keys: [1218] sites: [] +1223 None user2-1219@plc2.org keys: [1219] sites: [] +1224 None user2-1220@plc2.org keys: [1220] sites: [] +1225 None user2-1221@plc2.org keys: [1221] sites: [] +1226 None user2-1222@plc2.org keys: [1222] sites: [] +1227 None user2-1223@plc2.org keys: [1223] sites: [] +1228 None user2-1224@plc2.org keys: [1224] sites: [] +1229 None user2-1225@plc2.org keys: [1225] sites: [] +1230 None user2-1226@plc2.org keys: [1226] sites: [] +1231 None user2-1227@plc2.org keys: [1227] sites: [] +1232 None user2-1228@plc2.org keys: [1228] sites: [] +1233 None user2-1229@plc2.org keys: [1229] sites: [] +1234 None user2-1230@plc2.org keys: [1230] sites: [] +1235 None user2-1231@plc2.org keys: [1231] sites: [] +1236 None user2-1232@plc2.org keys: [1232] sites: [] +1237 None user2-1233@plc2.org keys: [1233] sites: [] +1238 None user2-1234@plc2.org keys: [1234] sites: [] +1239 None user2-1235@plc2.org keys: [1235] sites: [] +1240 None user2-1236@plc2.org keys: [1236] sites: [] +1241 None user2-1237@plc2.org keys: [1237] sites: [] +1242 None user2-1238@plc2.org keys: [1238] sites: [] +1243 None user2-1239@plc2.org keys: [1239] sites: [] +1244 None user2-1240@plc2.org keys: [1240] sites: [] +1245 None user2-1241@plc2.org keys: [1241] sites: [] +1246 None user2-1242@plc2.org keys: [1242] sites: [] +1247 None user2-1243@plc2.org keys: [1243] sites: [] +1248 None user2-1244@plc2.org keys: [1244] sites: [] +1249 None user2-1245@plc2.org keys: [1245] sites: [] +1250 None user2-1246@plc2.org keys: [1246] sites: [] +1251 None user2-1247@plc2.org keys: [1247] sites: [] +1252 None user2-1248@plc2.org keys: [1248] sites: [] +1253 None user2-1249@plc2.org keys: [1249] sites: [] +1254 None user2-1250@plc2.org keys: [1250] sites: [] +1255 None user2-1251@plc2.org keys: [1251] sites: [] +1256 None user2-1252@plc2.org keys: [1252] sites: [] +1257 None user2-1253@plc2.org keys: [1253] sites: [] +1258 None user2-1254@plc2.org keys: [1254] sites: [] +1259 None user2-1255@plc2.org keys: [1255] sites: [] +1260 None user2-1256@plc2.org keys: [1256] sites: [] +1261 None user2-1257@plc2.org keys: [1257] sites: [] +1262 None user2-1258@plc2.org keys: [1258] sites: [] +1263 None user2-1259@plc2.org keys: [1259] sites: [] +1264 None user2-1260@plc2.org keys: [1260] sites: [] +1265 None user2-1261@plc2.org keys: [1261] sites: [] +1266 None user2-1262@plc2.org keys: [1262] sites: [] +1267 None user2-1263@plc2.org keys: [1263] sites: [] +1268 None user2-1264@plc2.org keys: [1264] sites: [] +1269 None user2-1265@plc2.org keys: [1265] sites: [] +1270 None user2-1266@plc2.org keys: [1266] sites: [] +1271 None user2-1267@plc2.org keys: [1267] sites: [] +1272 None user2-1268@plc2.org keys: [1268] sites: [] +1273 None user2-1269@plc2.org keys: [1269] sites: [] +1274 None user2-1270@plc2.org keys: [1270] sites: [] +1275 None user2-1271@plc2.org keys: [1271] sites: [] +1276 None user2-1272@plc2.org keys: [1272] sites: [] +1277 None user2-1273@plc2.org keys: [1273] sites: [] +1278 None user2-1274@plc2.org keys: [1274] sites: [] +1279 None user2-1275@plc2.org keys: [1275] sites: [] +1280 None user2-1276@plc2.org keys: [1276] sites: [] +1281 None user2-1277@plc2.org keys: [1277] sites: [] +1282 None user2-1278@plc2.org keys: [1278] sites: [] +1283 None user2-1279@plc2.org keys: [1279] sites: [] +1284 None user2-1280@plc2.org keys: [1280] sites: [] +1285 None user2-1281@plc2.org keys: [1281] sites: [] +1286 None user2-1282@plc2.org keys: [1282] sites: [] +1287 None user2-1283@plc2.org keys: [1283] sites: [] +1288 None user2-1284@plc2.org keys: [1284] sites: [] +1289 None user2-1285@plc2.org keys: [1285] sites: [] +1290 None user2-1286@plc2.org keys: [1286] sites: [] +1291 None user2-1287@plc2.org keys: [1287] sites: [] +1292 None user2-1288@plc2.org keys: [1288] sites: [] +1293 None user2-1289@plc2.org keys: [1289] sites: [] +1294 None user2-1290@plc2.org keys: [1290] sites: [] +1295 None user2-1291@plc2.org keys: [1291] sites: [] +1296 None user2-1292@plc2.org keys: [1292] sites: [] +1297 None user2-1293@plc2.org keys: [1293] sites: [] +1298 None user2-1294@plc2.org keys: [1294] sites: [] +1299 None user2-1295@plc2.org keys: [1295] sites: [] +1300 None user2-1296@plc2.org keys: [1296] sites: [] +1301 None user2-1297@plc2.org keys: [1297] sites: [] +1302 None user2-1298@plc2.org keys: [1298] sites: [] +1303 None user2-1299@plc2.org keys: [1299] sites: [] +1304 None user2-1300@plc2.org keys: [1300] sites: [] +1305 None user2-1301@plc2.org keys: [1301] sites: [] +1306 None user2-1302@plc2.org keys: [1302] sites: [] +1307 None user2-1303@plc2.org keys: [1303] sites: [] +1308 None user2-1304@plc2.org keys: [1304] sites: [] +1309 None user2-1305@plc2.org keys: [1305] sites: [] +1310 None user2-1306@plc2.org keys: [1306] sites: [] +1311 None user2-1307@plc2.org keys: [1307] sites: [] +1312 None user2-1308@plc2.org keys: [1308] sites: [] +1313 None user2-1309@plc2.org keys: [1309] sites: [] +1314 None user2-1310@plc2.org keys: [1310] sites: [] +1315 None user2-1311@plc2.org keys: [1311] sites: [] +1316 None user2-1312@plc2.org keys: [1312] sites: [] +1317 None user2-1313@plc2.org keys: [1313] sites: [] +1318 None user2-1314@plc2.org keys: [1314] sites: [] +1319 None user2-1315@plc2.org keys: [1315] sites: [] +1320 None user2-1316@plc2.org keys: [1316] sites: [] +1321 None user2-1317@plc2.org keys: [1317] sites: [] +1322 None user2-1318@plc2.org keys: [1318] sites: [] +1323 None user2-1319@plc2.org keys: [1319] sites: [] +1324 None user2-1320@plc2.org keys: [1320] sites: [] +1325 None user2-1321@plc2.org keys: [1321] sites: [] +1326 None user2-1322@plc2.org keys: [1322] sites: [] +1327 None user2-1323@plc2.org keys: [1323] sites: [] +1328 None user2-1324@plc2.org keys: [1324] sites: [] +1329 None user2-1325@plc2.org keys: [1325] sites: [] +1330 None user2-1326@plc2.org keys: [1326] sites: [] +1331 None user2-1327@plc2.org keys: [1327] sites: [] +1332 None user2-1328@plc2.org keys: [1328] sites: [] +1333 None user2-1329@plc2.org keys: [1329] sites: [] +1334 None user2-1330@plc2.org keys: [1330] sites: [] +1335 None user2-1331@plc2.org keys: [1331] sites: [] +1336 None user2-1332@plc2.org keys: [1332] sites: [] +1337 None user2-1333@plc2.org keys: [1333] sites: [] +1338 None user2-1334@plc2.org keys: [1334] sites: [] +1339 None user2-1335@plc2.org keys: [1335] sites: [] +1340 None user2-1336@plc2.org keys: [1336] sites: [] +1341 None user2-1337@plc2.org keys: [1337] sites: [] +1342 None user2-1338@plc2.org keys: [1338] sites: [] +1343 None user2-1339@plc2.org keys: [1339] sites: [] +1344 None user2-1340@plc2.org keys: [1340] sites: [] +1345 None user2-1341@plc2.org keys: [1341] sites: [] +1346 None user2-1342@plc2.org keys: [1342] sites: [] +1347 None user2-1343@plc2.org keys: [1343] sites: [] +1348 None user2-1344@plc2.org keys: [1344] sites: [] +1349 None user2-1345@plc2.org keys: [1345] sites: [] +1350 None user2-1346@plc2.org keys: [1346] sites: [] +1351 None user2-1347@plc2.org keys: [1347] sites: [] +1352 None user2-1348@plc2.org keys: [1348] sites: [] +1353 None user2-1349@plc2.org keys: [1349] sites: [] +1354 None user2-1350@plc2.org keys: [1350] sites: [] +1355 None user2-1351@plc2.org keys: [1351] sites: [] +1356 None user2-1352@plc2.org keys: [1352] sites: [] +1357 None user2-1353@plc2.org keys: [1353] sites: [] +1358 None user2-1354@plc2.org keys: [1354] sites: [] +1359 None user2-1355@plc2.org keys: [1355] sites: [] +1360 None user2-1356@plc2.org keys: [1356] sites: [] +1361 None user2-1357@plc2.org keys: [1357] sites: [] +1362 None user2-1358@plc2.org keys: [1358] sites: [] +1363 None user2-1359@plc2.org keys: [1359] sites: [] +1364 None user2-1360@plc2.org keys: [1360] sites: [] +1365 None user2-1361@plc2.org keys: [1361] sites: [] +1366 None user2-1362@plc2.org keys: [1362] sites: [] +1367 None user2-1363@plc2.org keys: [1363] sites: [] +1368 None user2-1364@plc2.org keys: [1364] sites: [] +1369 None user2-1365@plc2.org keys: [1365] sites: [] +1370 None user2-1366@plc2.org keys: [1366] sites: [] +1371 None user2-1367@plc2.org keys: [1367] sites: [] +1372 None user2-1368@plc2.org keys: [1368] sites: [] +1373 None user2-1369@plc2.org keys: [1369] sites: [] +1374 None user2-1370@plc2.org keys: [1370] sites: [] +1375 None user2-1371@plc2.org keys: [1371] sites: [] +1376 None user2-1372@plc2.org keys: [1372] sites: [] +1377 None user2-1373@plc2.org keys: [1373] sites: [] +1378 None user2-1374@plc2.org keys: [1374] sites: [] +1379 None user2-1375@plc2.org keys: [1375] sites: [] +1380 None user2-1376@plc2.org keys: [1376] sites: [] +1381 None user2-1377@plc2.org keys: [1377] sites: [] +1382 None user2-1378@plc2.org keys: [1378] sites: [] +1383 None user2-1379@plc2.org keys: [1379] sites: [] +1384 None user2-1380@plc2.org keys: [1380] sites: [] +1385 None user2-1381@plc2.org keys: [1381] sites: [] +1386 None user2-1382@plc2.org keys: [1382] sites: [] +1387 None user2-1383@plc2.org keys: [1383] sites: [] +1388 None user2-1384@plc2.org keys: [1384] sites: [] +1389 None user2-1385@plc2.org keys: [1385] sites: [] +1390 None user2-1386@plc2.org keys: [1386] sites: [] +1391 None user2-1387@plc2.org keys: [1387] sites: [] +1392 None user2-1388@plc2.org keys: [1388] sites: [] +1393 None user2-1389@plc2.org keys: [1389] sites: [] +1394 None user2-1390@plc2.org keys: [1390] sites: [] +1395 None user2-1391@plc2.org keys: [1391] sites: [] +1396 None user2-1392@plc2.org keys: [1392] sites: [] +1397 None user2-1393@plc2.org keys: [1393] sites: [] +1398 None user2-1394@plc2.org keys: [1394] sites: [] +1399 None user2-1395@plc2.org keys: [1395] sites: [] +1400 None user2-1396@plc2.org keys: [1396] sites: [] +1401 None user2-1397@plc2.org keys: [1397] sites: [] +1402 None user2-1398@plc2.org keys: [1398] sites: [] +1403 None user2-1399@plc2.org keys: [1399] sites: [] +1404 None user2-1400@plc2.org keys: [1400] sites: [] +1405 None user2-1401@plc2.org keys: [1401] sites: [] +1406 None user2-1402@plc2.org keys: [1402] sites: [] +1407 None user2-1403@plc2.org keys: [1403] sites: [] +1408 None user2-1404@plc2.org keys: [1404] sites: [] +1409 None user2-1405@plc2.org keys: [1405] sites: [] +1410 None user2-1406@plc2.org keys: [1406] sites: [] +1411 None user2-1407@plc2.org keys: [1407] sites: [] +1412 None user2-1408@plc2.org keys: [1408] sites: [] +1413 None user2-1409@plc2.org keys: [1409] sites: [] +1414 None user2-1410@plc2.org keys: [1410] sites: [] +1415 None user2-1411@plc2.org keys: [1411] sites: [] +1416 None user2-1412@plc2.org keys: [1412] sites: [] +1417 None user2-1413@plc2.org keys: [1413] sites: [] +1418 None user2-1414@plc2.org keys: [1414] sites: [] +1419 None user2-1415@plc2.org keys: [1415] sites: [] +1420 None user2-1416@plc2.org keys: [1416] sites: [] +1421 None user2-1417@plc2.org keys: [1417] sites: [] +1422 None user2-1418@plc2.org keys: [1418] sites: [] +1423 None user2-1419@plc2.org keys: [1419] sites: [] +1424 None user2-1420@plc2.org keys: [1420] sites: [] +1425 None user2-1421@plc2.org keys: [1421] sites: [] +1426 None user2-1422@plc2.org keys: [1422] sites: [] +1427 None user2-1423@plc2.org keys: [1423] sites: [] +1428 None user2-1424@plc2.org keys: [1424] sites: [] +1429 None user2-1425@plc2.org keys: [1425] sites: [] +1430 None user2-1426@plc2.org keys: [1426] sites: [] +1431 None user2-1427@plc2.org keys: [1427] sites: [] +1432 None user2-1428@plc2.org keys: [1428] sites: [] +1433 None user2-1429@plc2.org keys: [1429] sites: [] +1434 None user2-1430@plc2.org keys: [1430] sites: [] +1435 None user2-1431@plc2.org keys: [1431] sites: [] +1436 None user2-1432@plc2.org keys: [1432] sites: [] +1437 None user2-1433@plc2.org keys: [1433] sites: [] +1438 None user2-1434@plc2.org keys: [1434] sites: [] +1439 None user2-1435@plc2.org keys: [1435] sites: [] +1440 None user2-1436@plc2.org keys: [1436] sites: [] +1441 None user2-1437@plc2.org keys: [1437] sites: [] +1442 None user2-1438@plc2.org keys: [1438] sites: [] +1443 None user2-1439@plc2.org keys: [1439] sites: [] +1444 None user2-1440@plc2.org keys: [1440] sites: [] +1445 None user2-1441@plc2.org keys: [1441] sites: [] +1446 None user2-1442@plc2.org keys: [1442] sites: [] +1447 None user2-1443@plc2.org keys: [1443] sites: [] +1448 None user2-1444@plc2.org keys: [1444] sites: [] +1449 None user2-1445@plc2.org keys: [1445] sites: [] +1450 None user2-1446@plc2.org keys: [1446] sites: [] +1451 None user2-1447@plc2.org keys: [1447] sites: [] +1452 None user2-1448@plc2.org keys: [1448] sites: [] +1453 None user2-1449@plc2.org keys: [1449] sites: [] +1454 None user2-1450@plc2.org keys: [1450] sites: [] +1455 None user2-1451@plc2.org keys: [1451] sites: [] +1456 None user2-1452@plc2.org keys: [1452] sites: [] +1457 None user2-1453@plc2.org keys: [1453] sites: [] +1458 None user2-1454@plc2.org keys: [1454] sites: [] +1459 None user2-1455@plc2.org keys: [1455] sites: [] +1460 None user2-1456@plc2.org keys: [1456] sites: [] +1461 None user2-1457@plc2.org keys: [1457] sites: [] +1462 None user2-1458@plc2.org keys: [1458] sites: [] +1463 None user2-1459@plc2.org keys: [1459] sites: [] +1464 None user2-1460@plc2.org keys: [1460] sites: [] +1465 None user2-1461@plc2.org keys: [1461] sites: [] +1466 None user2-1462@plc2.org keys: [1462] sites: [] +1467 None user2-1463@plc2.org keys: [1463] sites: [] +1468 None user2-1464@plc2.org keys: [1464] sites: [] +1469 None user2-1465@plc2.org keys: [1465] sites: [] +1470 None user2-1466@plc2.org keys: [1466] sites: [] +1471 None user2-1467@plc2.org keys: [1467] sites: [] +1472 None user2-1468@plc2.org keys: [1468] sites: [] +1473 None user2-1469@plc2.org keys: [1469] sites: [] +1474 None user2-1470@plc2.org keys: [1470] sites: [] +1475 None user2-1471@plc2.org keys: [1471] sites: [] +1476 None user2-1472@plc2.org keys: [1472] sites: [] +1477 None user2-1473@plc2.org keys: [1473] sites: [] +1478 None user2-1474@plc2.org keys: [1474] sites: [] +1479 None user2-1475@plc2.org keys: [1475] sites: [] +1480 None user2-1476@plc2.org keys: [1476] sites: [] +1481 None user2-1477@plc2.org keys: [1477] sites: [] +1482 None user2-1478@plc2.org keys: [1478] sites: [] +1483 None user2-1479@plc2.org keys: [1479] sites: [] +1484 None user2-1480@plc2.org keys: [1480] sites: [] +1485 None user2-1481@plc2.org keys: [1481] sites: [] +1486 None user2-1482@plc2.org keys: [1482] sites: [] +1487 None user2-1483@plc2.org keys: [1483] sites: [] +1488 None user2-1484@plc2.org keys: [1484] sites: [] +1489 None user2-1485@plc2.org keys: [1485] sites: [] +1490 None user2-1486@plc2.org keys: [1486] sites: [] +1491 None user2-1487@plc2.org keys: [1487] sites: [] +1492 None user2-1488@plc2.org keys: [1488] sites: [] +1493 None user2-1489@plc2.org keys: [1489] sites: [] +1494 None user2-1490@plc2.org keys: [1490] sites: [] +1495 None user2-1491@plc2.org keys: [1491] sites: [] +1496 None user2-1492@plc2.org keys: [1492] sites: [] +1497 None user2-1493@plc2.org keys: [1493] sites: [] +1498 None user2-1494@plc2.org keys: [1494] sites: [] +1499 None user2-1495@plc2.org keys: [1495] sites: [] +1500 None user2-1496@plc2.org keys: [1496] sites: [] +1501 None user2-1497@plc2.org keys: [1497] sites: [] +1502 None user2-1498@plc2.org keys: [1498] sites: [] +1503 None user2-1499@plc2.org keys: [1499] sites: [] +1504 None user2-1500@plc2.org keys: [1500] sites: [] +1505 None user2-1501@plc2.org keys: [1501] sites: [] +1506 None user2-1502@plc2.org keys: [1502] sites: [] +1507 None user2-1503@plc2.org keys: [1503] sites: [] +1508 None user2-1504@plc2.org keys: [1504] sites: [] +1509 None user2-1505@plc2.org keys: [1505] sites: [] +1510 None user2-1506@plc2.org keys: [1506] sites: [] +1511 None user2-1507@plc2.org keys: [1507] sites: [] +1512 None user2-1508@plc2.org keys: [1508] sites: [] +1513 None user2-1509@plc2.org keys: [1509] sites: [] +1514 None user2-1510@plc2.org keys: [1510] sites: [] +1515 None user2-1511@plc2.org keys: [1511] sites: [] +1516 None user2-1512@plc2.org keys: [1512] sites: [] +1517 None user2-1513@plc2.org keys: [1513] sites: [] +1518 None user2-1514@plc2.org keys: [1514] sites: [] +1519 None user2-1515@plc2.org keys: [1515] sites: [] +1520 None user2-1516@plc2.org keys: [1516] sites: [] +1521 None user2-1517@plc2.org keys: [1517] sites: [] +1522 None user2-1518@plc2.org keys: [1518] sites: [] +1523 None user2-1519@plc2.org keys: [1519] sites: [] +1524 None user2-1520@plc2.org keys: [1520] sites: [] +1525 None user2-1521@plc2.org keys: [1521] sites: [] +1526 None user2-1522@plc2.org keys: [1522] sites: [] +1527 None user2-1523@plc2.org keys: [1523] sites: [] +1528 None user2-1524@plc2.org keys: [1524] sites: [] +1529 None user2-1525@plc2.org keys: [1525] sites: [] +1530 None user2-1526@plc2.org keys: [1526] sites: [] +1531 None user2-1527@plc2.org keys: [1527] sites: [] +1532 None user2-1528@plc2.org keys: [1528] sites: [] +1533 None user2-1529@plc2.org keys: [1529] sites: [] +1534 None user2-1530@plc2.org keys: [1530] sites: [] +1535 None user2-1531@plc2.org keys: [1531] sites: [] +1536 None user2-1532@plc2.org keys: [1532] sites: [] +1537 None user2-1533@plc2.org keys: [1533] sites: [] +1538 None user2-1534@plc2.org keys: [1534] sites: [] +1539 None user2-1535@plc2.org keys: [1535] sites: [] +1540 None user2-1536@plc2.org keys: [1536] sites: [] +1541 None user2-1537@plc2.org keys: [1537] sites: [] +1542 None user2-1538@plc2.org keys: [1538] sites: [] +1543 None user2-1539@plc2.org keys: [1539] sites: [] +1544 None user2-1540@plc2.org keys: [1540] sites: [] +1545 None user2-1541@plc2.org keys: [1541] sites: [] +1546 None user2-1542@plc2.org keys: [1542] sites: [] +1547 None user2-1543@plc2.org keys: [1543] sites: [] +1548 None user2-1544@plc2.org keys: [1544] sites: [] +1549 None user2-1545@plc2.org keys: [1545] sites: [] +1550 None user2-1546@plc2.org keys: [1546] sites: [] +1551 None user2-1547@plc2.org keys: [1547] sites: [] +1552 None user2-1548@plc2.org keys: [1548] sites: [] +1553 None user2-1549@plc2.org keys: [1549] sites: [] +1554 None user2-1550@plc2.org keys: [1550] sites: [] +1555 None user2-1551@plc2.org keys: [1551] sites: [] +1556 None user2-1552@plc2.org keys: [1552] sites: [] +1557 None user2-1553@plc2.org keys: [1553] sites: [] +1558 None user2-1554@plc2.org keys: [1554] sites: [] +1559 None user2-1555@plc2.org keys: [1555] sites: [] +1560 None user2-1556@plc2.org keys: [1556] sites: [] +1561 None user2-1557@plc2.org keys: [1557] sites: [] +1562 None user2-1558@plc2.org keys: [1558] sites: [] +1563 None user2-1559@plc2.org keys: [1559] sites: [] +1564 None user2-1560@plc2.org keys: [1560] sites: [] +1565 None user2-1561@plc2.org keys: [1561] sites: [] +1566 None user2-1562@plc2.org keys: [1562] sites: [] +1567 None user2-1563@plc2.org keys: [1563] sites: [] +1568 None user2-1564@plc2.org keys: [1564] sites: [] +1569 None user2-1565@plc2.org keys: [1565] sites: [] +1570 None user2-1566@plc2.org keys: [1566] sites: [] +1571 None user2-1567@plc2.org keys: [1567] sites: [] +1572 None user2-1568@plc2.org keys: [1568] sites: [] +1573 None user2-1569@plc2.org keys: [1569] sites: [] +1574 None user2-1570@plc2.org keys: [1570] sites: [] +1575 None user2-1571@plc2.org keys: [1571] sites: [] +1576 None user2-1572@plc2.org keys: [1572] sites: [] +1577 None user2-1573@plc2.org keys: [1573] sites: [] +1578 None user2-1574@plc2.org keys: [1574] sites: [] +1579 None user2-1575@plc2.org keys: [1575] sites: [] +1580 None user2-1576@plc2.org keys: [1576] sites: [] +1581 None user2-1577@plc2.org keys: [1577] sites: [] +1582 None user2-1578@plc2.org keys: [1578] sites: [] +1583 None user2-1579@plc2.org keys: [1579] sites: [] +1584 None user2-1580@plc2.org keys: [1580] sites: [] +1585 None user2-1581@plc2.org keys: [1581] sites: [] +1586 None user2-1582@plc2.org keys: [1582] sites: [] +1587 None user2-1583@plc2.org keys: [1583] sites: [] +1588 None user2-1584@plc2.org keys: [1584] sites: [] +1589 None user2-1585@plc2.org keys: [1585] sites: [] +1590 None user2-1586@plc2.org keys: [1586] sites: [] +1591 None user2-1587@plc2.org keys: [1587] sites: [] +1592 None user2-1588@plc2.org keys: [1588] sites: [] +1593 None user2-1589@plc2.org keys: [1589] sites: [] +1594 None user2-1590@plc2.org keys: [1590] sites: [] +1595 None user2-1591@plc2.org keys: [1591] sites: [] +1596 None user2-1592@plc2.org keys: [1592] sites: [] +1597 None user2-1593@plc2.org keys: [1593] sites: [] +1598 None user2-1594@plc2.org keys: [1594] sites: [] +1599 None user2-1595@plc2.org keys: [1595] sites: [] +1600 None user2-1596@plc2.org keys: [1596] sites: [] +1601 None user2-1597@plc2.org keys: [1597] sites: [] +1602 None user2-1598@plc2.org keys: [1598] sites: [] +1603 None user2-1599@plc2.org keys: [1599] sites: [] +1604 None user2-1600@plc2.org keys: [1600] sites: [] +1605 None user2-1601@plc2.org keys: [1601] sites: [] +1606 None user2-1602@plc2.org keys: [1602] sites: [] +1607 None user2-1603@plc2.org keys: [1603] sites: [] +1608 None user2-1604@plc2.org keys: [1604] sites: [] +1609 None user2-1605@plc2.org keys: [1605] sites: [] +1610 None user2-1606@plc2.org keys: [1606] sites: [] +1611 None user2-1607@plc2.org keys: [1607] sites: [] +1612 None user2-1608@plc2.org keys: [1608] sites: [] +1613 None user2-1609@plc2.org keys: [1609] sites: [] +1614 None user2-1610@plc2.org keys: [1610] sites: [] +1615 None user2-1611@plc2.org keys: [1611] sites: [] +1616 None user2-1612@plc2.org keys: [1612] sites: [] +1617 None user2-1613@plc2.org keys: [1613] sites: [] +1618 None user2-1614@plc2.org keys: [1614] sites: [] +1619 None user2-1615@plc2.org keys: [1615] sites: [] +1620 None user2-1616@plc2.org keys: [1616] sites: [] +1621 None user2-1617@plc2.org keys: [1617] sites: [] +1622 None user2-1618@plc2.org keys: [1618] sites: [] +1623 None user2-1619@plc2.org keys: [1619] sites: [] +1624 None user2-1620@plc2.org keys: [1620] sites: [] +1625 None user2-1621@plc2.org keys: [1621] sites: [] +1626 None user2-1622@plc2.org keys: [1622] sites: [] +1627 None user2-1623@plc2.org keys: [1623] sites: [] +1628 None user2-1624@plc2.org keys: [1624] sites: [] +1629 None user2-1625@plc2.org keys: [1625] sites: [] +1630 None user2-1626@plc2.org keys: [1626] sites: [] +1631 None user2-1627@plc2.org keys: [1627] sites: [] +1632 None user2-1628@plc2.org keys: [1628] sites: [] +1633 None user2-1629@plc2.org keys: [1629] sites: [] +1634 None user2-1630@plc2.org keys: [1630] sites: [] +1635 None user2-1631@plc2.org keys: [1631] sites: [] +1636 None user2-1632@plc2.org keys: [1632] sites: [] +1637 None user2-1633@plc2.org keys: [1633] sites: [] +1638 None user2-1634@plc2.org keys: [1634] sites: [] +1639 None user2-1635@plc2.org keys: [1635] sites: [] +1640 None user2-1636@plc2.org keys: [1636] sites: [] +1641 None user2-1637@plc2.org keys: [1637] sites: [] +1642 None user2-1638@plc2.org keys: [1638] sites: [] +1643 None user2-1639@plc2.org keys: [1639] sites: [] +1644 None user2-1640@plc2.org keys: [1640] sites: [] +1645 None user2-1641@plc2.org keys: [1641] sites: [] +1646 None user2-1642@plc2.org keys: [1642] sites: [] +1647 None user2-1643@plc2.org keys: [1643] sites: [] +1648 None user2-1644@plc2.org keys: [1644] sites: [] +1649 None user2-1645@plc2.org keys: [1645] sites: [] +1650 None user2-1646@plc2.org keys: [1646] sites: [] +1651 None user2-1647@plc2.org keys: [1647] sites: [] +1652 None user2-1648@plc2.org keys: [1648] sites: [] +1653 None user2-1649@plc2.org keys: [1649] sites: [] +1654 None user2-1650@plc2.org keys: [1650] sites: [] +1655 None user2-1651@plc2.org keys: [1651] sites: [] +1656 None user2-1652@plc2.org keys: [1652] sites: [] +1657 None user2-1653@plc2.org keys: [1653] sites: [] +1658 None user2-1654@plc2.org keys: [1654] sites: [] +1659 None user2-1655@plc2.org keys: [1655] sites: [] +1660 None user2-1656@plc2.org keys: [1656] sites: [] +1661 None user2-1657@plc2.org keys: [1657] sites: [] +1662 None user2-1658@plc2.org keys: [1658] sites: [] +1663 None user2-1659@plc2.org keys: [1659] sites: [] +1664 None user2-1660@plc2.org keys: [1660] sites: [] +1665 None user2-1661@plc2.org keys: [1661] sites: [] +1666 None user2-1662@plc2.org keys: [1662] sites: [] +1667 None user2-1663@plc2.org keys: [1663] sites: [] +1668 None user2-1664@plc2.org keys: [1664] sites: [] +1669 None user2-1665@plc2.org keys: [1665] sites: [] +1670 None user2-1666@plc2.org keys: [1666] sites: [] +1671 None user2-1667@plc2.org keys: [1667] sites: [] +1672 None user2-1668@plc2.org keys: [1668] sites: [] +1673 None user2-1669@plc2.org keys: [1669] sites: [] +1674 None user2-1670@plc2.org keys: [1670] sites: [] +1675 None user2-1671@plc2.org keys: [1671] sites: [] +1676 None user2-1672@plc2.org keys: [1672] sites: [] +1677 None user2-1673@plc2.org keys: [1673] sites: [] +1678 None user2-1674@plc2.org keys: [1674] sites: [] +1679 None user2-1675@plc2.org keys: [1675] sites: [] +1680 None user2-1676@plc2.org keys: [1676] sites: [] +1681 None user2-1677@plc2.org keys: [1677] sites: [] +1682 None user2-1678@plc2.org keys: [1678] sites: [] +1683 None user2-1679@plc2.org keys: [1679] sites: [] +1684 None user2-1680@plc2.org keys: [1680] sites: [] +1685 None user2-1681@plc2.org keys: [1681] sites: [] +1686 None user2-1682@plc2.org keys: [1682] sites: [] +1687 None user2-1683@plc2.org keys: [1683] sites: [] +1688 None user2-1684@plc2.org keys: [1684] sites: [] +1689 None user2-1685@plc2.org keys: [1685] sites: [] +1690 None user2-1686@plc2.org keys: [1686] sites: [] +1691 None user2-1687@plc2.org keys: [1687] sites: [] +1692 None user2-1688@plc2.org keys: [1688] sites: [] +1693 None user2-1689@plc2.org keys: [1689] sites: [] +1694 None user2-1690@plc2.org keys: [1690] sites: [] +1695 None user2-1691@plc2.org keys: [1691] sites: [] +1696 None user2-1692@plc2.org keys: [1692] sites: [] +1697 None user2-1693@plc2.org keys: [1693] sites: [] +1698 None user2-1694@plc2.org keys: [1694] sites: [] +1699 None user2-1695@plc2.org keys: [1695] sites: [] +1700 None user2-1696@plc2.org keys: [1696] sites: [] +1701 None user2-1697@plc2.org keys: [1697] sites: [] +1702 None user2-1698@plc2.org keys: [1698] sites: [] +1703 None user2-1699@plc2.org keys: [1699] sites: [] +1704 None user2-1700@plc2.org keys: [1700] sites: [] +1705 None user2-1701@plc2.org keys: [1701] sites: [] +1706 None user2-1702@plc2.org keys: [1702] sites: [] +1707 None user2-1703@plc2.org keys: [1703] sites: [] +1708 None user2-1704@plc2.org keys: [1704] sites: [] +1709 None user2-1705@plc2.org keys: [1705] sites: [] +1710 None user2-1706@plc2.org keys: [1706] sites: [] +1711 None user2-1707@plc2.org keys: [1707] sites: [] +1712 None user2-1708@plc2.org keys: [1708] sites: [] +1713 None user2-1709@plc2.org keys: [1709] sites: [] +1714 None user2-1710@plc2.org keys: [1710] sites: [] +1715 None user2-1711@plc2.org keys: [1711] sites: [] +1716 None user2-1712@plc2.org keys: [1712] sites: [] +1717 None user2-1713@plc2.org keys: [1713] sites: [] +1718 None user2-1714@plc2.org keys: [1714] sites: [] +1719 None user2-1715@plc2.org keys: [1715] sites: [] +1720 None user2-1716@plc2.org keys: [1716] sites: [] +1721 None user2-1717@plc2.org keys: [1717] sites: [] +1722 None user2-1718@plc2.org keys: [1718] sites: [] +1723 None user2-1719@plc2.org keys: [1719] sites: [] +1724 None user2-1720@plc2.org keys: [1720] sites: [] +1725 None user2-1721@plc2.org keys: [1721] sites: [] +1726 None user2-1722@plc2.org keys: [1722] sites: [] +1727 None user2-1723@plc2.org keys: [1723] sites: [] +1728 None user2-1724@plc2.org keys: [1724] sites: [] +1729 None user2-1725@plc2.org keys: [1725] sites: [] +1730 None user2-1726@plc2.org keys: [1726] sites: [] +1731 None user2-1727@plc2.org keys: [1727] sites: [] +1732 None user2-1728@plc2.org keys: [1728] sites: [] +1733 None user2-1729@plc2.org keys: [1729] sites: [] +1734 None user2-1730@plc2.org keys: [1730] sites: [] +1735 None user2-1731@plc2.org keys: [1731] sites: [] +1736 None user2-1732@plc2.org keys: [1732] sites: [] +1737 None user2-1733@plc2.org keys: [1733] sites: [] +1738 None user2-1734@plc2.org keys: [1734] sites: [] +1739 None user2-1735@plc2.org keys: [1735] sites: [] +1740 None user2-1736@plc2.org keys: [1736] sites: [] +1741 None user2-1737@plc2.org keys: [1737] sites: [] +1742 None user2-1738@plc2.org keys: [1738] sites: [] +1743 None user2-1739@plc2.org keys: [1739] sites: [] +1744 None user2-1740@plc2.org keys: [1740] sites: [] +1745 None user2-1741@plc2.org keys: [1741] sites: [] +1746 None user2-1742@plc2.org keys: [1742] sites: [] +1747 None user2-1743@plc2.org keys: [1743] sites: [] +1748 None user2-1744@plc2.org keys: [1744] sites: [] +1749 None user2-1745@plc2.org keys: [1745] sites: [] +1750 None user2-1746@plc2.org keys: [1746] sites: [] +1751 None user2-1747@plc2.org keys: [1747] sites: [] +1752 None user2-1748@plc2.org keys: [1748] sites: [] +1753 None user2-1749@plc2.org keys: [1749] sites: [] +1754 None user2-1750@plc2.org keys: [1750] sites: [] +1755 None user2-1751@plc2.org keys: [1751] sites: [] +1756 None user2-1752@plc2.org keys: [1752] sites: [] +1757 None user2-1753@plc2.org keys: [1753] sites: [] +1758 None user2-1754@plc2.org keys: [1754] sites: [] +1759 None user2-1755@plc2.org keys: [1755] sites: [] +1760 None user2-1756@plc2.org keys: [1756] sites: [] +1761 None user2-1757@plc2.org keys: [1757] sites: [] +1762 None user2-1758@plc2.org keys: [1758] sites: [] +1763 None user2-1759@plc2.org keys: [1759] sites: [] +1764 None user2-1760@plc2.org keys: [1760] sites: [] +1765 None user2-1761@plc2.org keys: [1761] sites: [] +1766 None user2-1762@plc2.org keys: [1762] sites: [] +1767 None user2-1763@plc2.org keys: [1763] sites: [] +1768 None user2-1764@plc2.org keys: [1764] sites: [] +1769 None user2-1765@plc2.org keys: [1765] sites: [] +1770 None user2-1766@plc2.org keys: [1766] sites: [] +1771 None user2-1767@plc2.org keys: [1767] sites: [] +1772 None user2-1768@plc2.org keys: [1768] sites: [] +1773 None user2-1769@plc2.org keys: [1769] sites: [] +1774 None user2-1770@plc2.org keys: [1770] sites: [] +1775 None user2-1771@plc2.org keys: [1771] sites: [] +1776 None user2-1772@plc2.org keys: [1772] sites: [] +1777 None user2-1773@plc2.org keys: [1773] sites: [] +1778 None user2-1774@plc2.org keys: [1774] sites: [] +1779 None user2-1775@plc2.org keys: [1775] sites: [] +1780 None user2-1776@plc2.org keys: [1776] sites: [] +1781 None user2-1777@plc2.org keys: [1777] sites: [] +1782 None user2-1778@plc2.org keys: [1778] sites: [] +1783 None user2-1779@plc2.org keys: [1779] sites: [] +1784 None user2-1780@plc2.org keys: [1780] sites: [] +1785 None user2-1781@plc2.org keys: [1781] sites: [] +1786 None user2-1782@plc2.org keys: [1782] sites: [] +1787 None user2-1783@plc2.org keys: [1783] sites: [] +1788 None user2-1784@plc2.org keys: [1784] sites: [] +1789 None user2-1785@plc2.org keys: [1785] sites: [] +1790 None user2-1786@plc2.org keys: [1786] sites: [] +1791 None user2-1787@plc2.org keys: [1787] sites: [] +1792 None user2-1788@plc2.org keys: [1788] sites: [] +1793 None user2-1789@plc2.org keys: [1789] sites: [] +1794 None user2-1790@plc2.org keys: [1790] sites: [] +1795 None user2-1791@plc2.org keys: [1791] sites: [] +1796 None user2-1792@plc2.org keys: [1792] sites: [] +1797 None user2-1793@plc2.org keys: [1793] sites: [] +1798 None user2-1794@plc2.org keys: [1794] sites: [] +1799 None user2-1795@plc2.org keys: [1795] sites: [] +1800 None user2-1796@plc2.org keys: [1796] sites: [] +1801 None user2-1797@plc2.org keys: [1797] sites: [] +1802 None user2-1798@plc2.org keys: [1798] sites: [] +1803 None user2-1799@plc2.org keys: [1799] sites: [] +1804 None user2-1800@plc2.org keys: [1800] sites: [] +1805 None user2-1801@plc2.org keys: [1801] sites: [] +1806 None user2-1802@plc2.org keys: [1802] sites: [] +1807 None user2-1803@plc2.org keys: [1803] sites: [] +1808 None user2-1804@plc2.org keys: [1804] sites: [] +1809 None user2-1805@plc2.org keys: [1805] sites: [] +1810 None user2-1806@plc2.org keys: [1806] sites: [] +1811 None user2-1807@plc2.org keys: [1807] sites: [] +1812 None user2-1808@plc2.org keys: [1808] sites: [] +1813 None user2-1809@plc2.org keys: [1809] sites: [] +1814 None user2-1810@plc2.org keys: [1810] sites: [] +1815 None user2-1811@plc2.org keys: [1811] sites: [] +1816 None user2-1812@plc2.org keys: [1812] sites: [] +1817 None user2-1813@plc2.org keys: [1813] sites: [] +1818 None user2-1814@plc2.org keys: [1814] sites: [] +1819 None user2-1815@plc2.org keys: [1815] sites: [] +1820 None user2-1816@plc2.org keys: [1816] sites: [] +1821 None user2-1817@plc2.org keys: [1817] sites: [] +1822 None user2-1818@plc2.org keys: [1818] sites: [] +1823 None user2-1819@plc2.org keys: [1819] sites: [] +1824 None user2-1820@plc2.org keys: [1820] sites: [] +1825 None user2-1821@plc2.org keys: [1821] sites: [] +1826 None user2-1822@plc2.org keys: [1822] sites: [] +1827 None user2-1823@plc2.org keys: [1823] sites: [] +1828 None user2-1824@plc2.org keys: [1824] sites: [] +1829 None user2-1825@plc2.org keys: [1825] sites: [] +1830 None user2-1826@plc2.org keys: [1826] sites: [] +1831 None user2-1827@plc2.org keys: [1827] sites: [] +1832 None user2-1828@plc2.org keys: [1828] sites: [] +1833 None user2-1829@plc2.org keys: [1829] sites: [] +1834 None user2-1830@plc2.org keys: [1830] sites: [] +1835 None user2-1831@plc2.org keys: [1831] sites: [] +1836 None user2-1832@plc2.org keys: [1832] sites: [] +1837 None user2-1833@plc2.org keys: [1833] sites: [] +1838 None user2-1834@plc2.org keys: [1834] sites: [] +1839 None user2-1835@plc2.org keys: [1835] sites: [] +1840 None user2-1836@plc2.org keys: [1836] sites: [] +1841 None user2-1837@plc2.org keys: [1837] sites: [] +1842 None user2-1838@plc2.org keys: [1838] sites: [] +1843 None user2-1839@plc2.org keys: [1839] sites: [] +1844 None user2-1840@plc2.org keys: [1840] sites: [] +1845 None user2-1841@plc2.org keys: [1841] sites: [] +1846 None user2-1842@plc2.org keys: [1842] sites: [] +1847 None user2-1843@plc2.org keys: [1843] sites: [] +1848 None user2-1844@plc2.org keys: [1844] sites: [] +1849 None user2-1845@plc2.org keys: [1845] sites: [] +1850 None user2-1846@plc2.org keys: [1846] sites: [] +1851 None user2-1847@plc2.org keys: [1847] sites: [] +1852 None user2-1848@plc2.org keys: [1848] sites: [] +1853 None user2-1849@plc2.org keys: [1849] sites: [] +1854 None user2-1850@plc2.org keys: [1850] sites: [] +1855 None user2-1851@plc2.org keys: [1851] sites: [] +1856 None user2-1852@plc2.org keys: [1852] sites: [] +1857 None user2-1853@plc2.org keys: [1853] sites: [] +1858 None user2-1854@plc2.org keys: [1854] sites: [] +1859 None user2-1855@plc2.org keys: [1855] sites: [] +1860 None user2-1856@plc2.org keys: [1856] sites: [] +1861 None user2-1857@plc2.org keys: [1857] sites: [] +1862 None user2-1858@plc2.org keys: [1858] sites: [] +1863 None user2-1859@plc2.org keys: [1859] sites: [] +1864 None user2-1860@plc2.org keys: [1860] sites: [] +1865 None user2-1861@plc2.org keys: [1861] sites: [] +1866 None user2-1862@plc2.org keys: [1862] sites: [] +1867 None user2-1863@plc2.org keys: [1863] sites: [] +1868 None user2-1864@plc2.org keys: [1864] sites: [] +1869 None user2-1865@plc2.org keys: [1865] sites: [] +1870 None user2-1866@plc2.org keys: [1866] sites: [] +1871 None user2-1867@plc2.org keys: [1867] sites: [] +1872 None user2-1868@plc2.org keys: [1868] sites: [] +1873 None user2-1869@plc2.org keys: [1869] sites: [] +1874 None user2-1870@plc2.org keys: [1870] sites: [] +1875 None user2-1871@plc2.org keys: [1871] sites: [] +1876 None user2-1872@plc2.org keys: [1872] sites: [] +1877 None user2-1873@plc2.org keys: [1873] sites: [] +1878 None user2-1874@plc2.org keys: [1874] sites: [] +1879 None user2-1875@plc2.org keys: [1875] sites: [] +1880 None user2-1876@plc2.org keys: [1876] sites: [] +1881 None user2-1877@plc2.org keys: [1877] sites: [] +1882 None user2-1878@plc2.org keys: [1878] sites: [] +1883 None user2-1879@plc2.org keys: [1879] sites: [] +1884 None user2-1880@plc2.org keys: [1880] sites: [] +1885 None user2-1881@plc2.org keys: [1881] sites: [] +1886 None user2-1882@plc2.org keys: [1882] sites: [] +1887 None user2-1883@plc2.org keys: [1883] sites: [] +1888 None user2-1884@plc2.org keys: [1884] sites: [] +1889 None user2-1885@plc2.org keys: [1885] sites: [] +1890 None user2-1886@plc2.org keys: [1886] sites: [] +1891 None user2-1887@plc2.org keys: [1887] sites: [] +1892 None user2-1888@plc2.org keys: [1888] sites: [] +1893 None user2-1889@plc2.org keys: [1889] sites: [] +1894 None user2-1890@plc2.org keys: [1890] sites: [] +1895 None user2-1891@plc2.org keys: [1891] sites: [] +1896 None user2-1892@plc2.org keys: [1892] sites: [] +1897 None user2-1893@plc2.org keys: [1893] sites: [] +1898 None user2-1894@plc2.org keys: [1894] sites: [] +1899 None user2-1895@plc2.org keys: [1895] sites: [] +1900 None user2-1896@plc2.org keys: [1896] sites: [] +1901 None user2-1897@plc2.org keys: [1897] sites: [] +1902 None user2-1898@plc2.org keys: [1898] sites: [] +1903 None user2-1899@plc2.org keys: [1899] sites: [] +1904 None user2-1900@plc2.org keys: [1900] sites: [] +1905 None user2-1901@plc2.org keys: [1901] sites: [] +1906 None user2-1902@plc2.org keys: [1902] sites: [] +1907 None user2-1903@plc2.org keys: [1903] sites: [] +1908 None user2-1904@plc2.org keys: [1904] sites: [] +1909 None user2-1905@plc2.org keys: [1905] sites: [] +1910 None user2-1906@plc2.org keys: [1906] sites: [] +1911 None user2-1907@plc2.org keys: [1907] sites: [] +1912 None user2-1908@plc2.org keys: [1908] sites: [] +1913 None user2-1909@plc2.org keys: [1909] sites: [] +1914 None user2-1910@plc2.org keys: [1910] sites: [] +1915 None user2-1911@plc2.org keys: [1911] sites: [] +1916 None user2-1912@plc2.org keys: [1912] sites: [] +1917 None user2-1913@plc2.org keys: [1913] sites: [] +1918 None user2-1914@plc2.org keys: [1914] sites: [] +1919 None user2-1915@plc2.org keys: [1915] sites: [] +1920 None user2-1916@plc2.org keys: [1916] sites: [] +1921 None user2-1917@plc2.org keys: [1917] sites: [] +1922 None user2-1918@plc2.org keys: [1918] sites: [] +1923 None user2-1919@plc2.org keys: [1919] sites: [] +1924 None user2-1920@plc2.org keys: [1920] sites: [] +1925 None user2-1921@plc2.org keys: [1921] sites: [] +1926 None user2-1922@plc2.org keys: [1922] sites: [] +1927 None user2-1923@plc2.org keys: [1923] sites: [] +1928 None user2-1924@plc2.org keys: [1924] sites: [] +1929 None user2-1925@plc2.org keys: [1925] sites: [] +1930 None user2-1926@plc2.org keys: [1926] sites: [] +1931 None user2-1927@plc2.org keys: [1927] sites: [] +1932 None user2-1928@plc2.org keys: [1928] sites: [] +1933 None user2-1929@plc2.org keys: [1929] sites: [] +1934 None user2-1930@plc2.org keys: [1930] sites: [] +1935 None user2-1931@plc2.org keys: [1931] sites: [] +1936 None user2-1932@plc2.org keys: [1932] sites: [] +1937 None user2-1933@plc2.org keys: [1933] sites: [] +1938 None user2-1934@plc2.org keys: [1934] sites: [] +1939 None user2-1935@plc2.org keys: [1935] sites: [] +1940 None user2-1936@plc2.org keys: [1936] sites: [] +1941 None user2-1937@plc2.org keys: [1937] sites: [] +1942 None user2-1938@plc2.org keys: [1938] sites: [] +1943 None user2-1939@plc2.org keys: [1939] sites: [] +1944 None user2-1940@plc2.org keys: [1940] sites: [] +1945 None user2-1941@plc2.org keys: [1941] sites: [] +1946 None user2-1942@plc2.org keys: [1942] sites: [] +1947 None user2-1943@plc2.org keys: [1943] sites: [] +1948 None user2-1944@plc2.org keys: [1944] sites: [] +1949 None user2-1945@plc2.org keys: [1945] sites: [] +1950 None user2-1946@plc2.org keys: [1946] sites: [] +1951 None user2-1947@plc2.org keys: [1947] sites: [] +1952 None user2-1948@plc2.org keys: [1948] sites: [] +1953 None user2-1949@plc2.org keys: [1949] sites: [] +1954 None user2-1950@plc2.org keys: [1950] sites: [] +1955 None user2-1951@plc2.org keys: [1951] sites: [] +1956 None user2-1952@plc2.org keys: [1952] sites: [] +1957 None user2-1953@plc2.org keys: [1953] sites: [] +1958 None user2-1954@plc2.org keys: [1954] sites: [] +1959 None user2-1955@plc2.org keys: [1955] sites: [] +1960 None user2-1956@plc2.org keys: [1956] sites: [] +1961 None user2-1957@plc2.org keys: [1957] sites: [] +1962 None user2-1958@plc2.org keys: [1958] sites: [] +1963 None user2-1959@plc2.org keys: [1959] sites: [] +1964 None user2-1960@plc2.org keys: [1960] sites: [] +1965 None user2-1961@plc2.org keys: [1961] sites: [] +1966 None user2-1962@plc2.org keys: [1962] sites: [] +1967 None user2-1963@plc2.org keys: [1963] sites: [] +1968 None user2-1964@plc2.org keys: [1964] sites: [] +1969 None user2-1965@plc2.org keys: [1965] sites: [] +1970 None user2-1966@plc2.org keys: [1966] sites: [] +1971 None user2-1967@plc2.org keys: [1967] sites: [] +1972 None user2-1968@plc2.org keys: [1968] sites: [] +1973 None user2-1969@plc2.org keys: [1969] sites: [] +1974 None user2-1970@plc2.org keys: [1970] sites: [] +1975 None user2-1971@plc2.org keys: [1971] sites: [] +1976 None user2-1972@plc2.org keys: [1972] sites: [] +1977 None user2-1973@plc2.org keys: [1973] sites: [] +1978 None user2-1974@plc2.org keys: [1974] sites: [] +1979 None user2-1975@plc2.org keys: [1975] sites: [] +1980 None user2-1976@plc2.org keys: [1976] sites: [] +1981 None user2-1977@plc2.org keys: [1977] sites: [] +1982 None user2-1978@plc2.org keys: [1978] sites: [] +1983 None user2-1979@plc2.org keys: [1979] sites: [] +1984 None user2-1980@plc2.org keys: [1980] sites: [] +1985 None user2-1981@plc2.org keys: [1981] sites: [] +1986 None user2-1982@plc2.org keys: [1982] sites: [] +1987 None user2-1983@plc2.org keys: [1983] sites: [] +1988 None user2-1984@plc2.org keys: [1984] sites: [] +1989 None user2-1985@plc2.org keys: [1985] sites: [] +1990 None user2-1986@plc2.org keys: [1986] sites: [] +1991 None user2-1987@plc2.org keys: [1987] sites: [] +1992 None user2-1988@plc2.org keys: [1988] sites: [] +1993 None user2-1989@plc2.org keys: [1989] sites: [] +1994 None user2-1990@plc2.org keys: [1990] sites: [] +1995 None user2-1991@plc2.org keys: [1991] sites: [] +1996 None user2-1992@plc2.org keys: [1992] sites: [] +1997 None user2-1993@plc2.org keys: [1993] sites: [] +1998 None user2-1994@plc2.org keys: [1994] sites: [] +1999 None user2-1995@plc2.org keys: [1995] sites: [] +2000 None user2-1996@plc2.org keys: [1996] sites: [] +2001 None user2-1997@plc2.org keys: [1997] sites: [] +2002 None user2-1998@plc2.org keys: [1998] sites: [] +2003 None user2-1999@plc2.org keys: [1999] sites: [] +2004 None user2-2000@plc2.org keys: [2000] sites: [] +2005 1 root@plc1.org keys: [] sites: [1002] +2006 1 user1-1@plc1.org keys: [2001] sites: [] +2007 1 user1-2@plc1.org keys: [2002] sites: [] +2008 1 user1-3@plc1.org keys: [2003] sites: [] +2009 1 user1-4@plc1.org keys: [2004] sites: [] +2010 1 user1-5@plc1.org keys: [2005] sites: [] +2011 1 user1-6@plc1.org keys: [2006] sites: [] +2012 1 user1-7@plc1.org keys: [2007] sites: [] +2013 1 user1-8@plc1.org keys: [2008] sites: [] +2014 1 user1-9@plc1.org keys: [2009] sites: [] +2015 1 user1-10@plc1.org keys: [2010] sites: [] +2016 1 user1-11@plc1.org keys: [2011] sites: [] +2017 1 user1-12@plc1.org keys: [2012] sites: [] +2018 1 user1-13@plc1.org keys: [2013] sites: [] +2019 1 user1-14@plc1.org keys: [2014] sites: [] +2020 1 user1-15@plc1.org keys: [2015] sites: [] +2021 1 user1-16@plc1.org keys: [2016] sites: [] +2022 1 user1-17@plc1.org keys: [2017] sites: [] +2023 1 user1-18@plc1.org keys: [2018] sites: [] +2024 1 user1-19@plc1.org keys: [2019] sites: [] +2025 1 user1-20@plc1.org keys: [2020] sites: [] +2026 1 user1-21@plc1.org keys: [2021] sites: [] +2027 1 user1-22@plc1.org keys: [2022] sites: [] +2028 1 user1-23@plc1.org keys: [2023] sites: [] +2029 1 user1-24@plc1.org keys: [2024] sites: [] +2030 1 user1-25@plc1.org keys: [2025] sites: [] +2031 1 user1-26@plc1.org keys: [2026] sites: [] +2032 1 user1-27@plc1.org keys: [2027] sites: [] +2033 1 user1-28@plc1.org keys: [2028] sites: [] +2034 1 user1-29@plc1.org keys: [2029] sites: [] +2035 1 user1-30@plc1.org keys: [2030] sites: [] +2036 1 user1-31@plc1.org keys: [2031] sites: [] +2037 1 user1-32@plc1.org keys: [2032] sites: [] +2038 1 user1-33@plc1.org keys: [2033] sites: [] +2039 1 user1-34@plc1.org keys: [2034] sites: [] +2040 1 user1-35@plc1.org keys: [2035] sites: [] +2041 1 user1-36@plc1.org keys: [2036] sites: [] +2042 1 user1-37@plc1.org keys: [2037] sites: [] +2043 1 user1-38@plc1.org keys: [2038] sites: [] +2044 1 user1-39@plc1.org keys: [2039] sites: [] +2045 1 user1-40@plc1.org keys: [2040] sites: [] +2046 1 user1-41@plc1.org keys: [2041] sites: [] +2047 1 user1-42@plc1.org keys: [2042] sites: [] +2048 1 user1-43@plc1.org keys: [2043] sites: [] +2049 1 user1-44@plc1.org keys: [2044] sites: [] +2050 1 user1-45@plc1.org keys: [2045] sites: [] +2051 1 user1-46@plc1.org keys: [2046] sites: [] +2052 1 user1-47@plc1.org keys: [2047] sites: [] +2053 1 user1-48@plc1.org keys: [2048] sites: [] +2054 1 user1-49@plc1.org keys: [2049] sites: [] +2055 1 user1-50@plc1.org keys: [2050] sites: [] +2056 1 user1-51@plc1.org keys: [2051] sites: [] +2057 1 user1-52@plc1.org keys: [2052] sites: [] +2058 1 user1-53@plc1.org keys: [2053] sites: [] +2059 1 user1-54@plc1.org keys: [2054] sites: [] +2060 1 user1-55@plc1.org keys: [2055] sites: [] +2061 1 user1-56@plc1.org keys: [2056] sites: [] +2062 1 user1-57@plc1.org keys: [2057] sites: [] +2063 1 user1-58@plc1.org keys: [2058] sites: [] +2064 1 user1-59@plc1.org keys: [2059] sites: [] +2065 1 user1-60@plc1.org keys: [2060] sites: [] +2066 1 user1-61@plc1.org keys: [2061] sites: [] +2067 1 user1-62@plc1.org keys: [2062] sites: [] +2068 1 user1-63@plc1.org keys: [2063] sites: [] +2069 1 user1-64@plc1.org keys: [2064] sites: [] +2070 1 user1-65@plc1.org keys: [2065] sites: [] +2071 1 user1-66@plc1.org keys: [2066] sites: [] +2072 1 user1-67@plc1.org keys: [2067] sites: [] +2073 1 user1-68@plc1.org keys: [2068] sites: [] +2074 1 user1-69@plc1.org keys: [2069] sites: [] +2075 1 user1-70@plc1.org keys: [2070] sites: [] +2076 1 user1-71@plc1.org keys: [2071] sites: [] +2077 1 user1-72@plc1.org keys: [2072] sites: [] +2078 1 user1-73@plc1.org keys: [2073] sites: [] +2079 1 user1-74@plc1.org keys: [2074] sites: [] +2080 1 user1-75@plc1.org keys: [2075] sites: [] +2081 1 user1-76@plc1.org keys: [2076] sites: [] +2082 1 user1-77@plc1.org keys: [2077] sites: [] +2083 1 user1-78@plc1.org keys: [2078] sites: [] +2084 1 user1-79@plc1.org keys: [2079] sites: [] +2085 1 user1-80@plc1.org keys: [2080] sites: [] +2086 1 user1-81@plc1.org keys: [2081] sites: [] +2087 1 user1-82@plc1.org keys: [2082] sites: [] +2088 1 user1-83@plc1.org keys: [2083] sites: [] +2089 1 user1-84@plc1.org keys: [2084] sites: [] +2090 1 user1-85@plc1.org keys: [2085] sites: [] +2091 1 user1-86@plc1.org keys: [2086] sites: [] +2092 1 user1-87@plc1.org keys: [2087] sites: [] +2093 1 user1-88@plc1.org keys: [2088] sites: [] +2094 1 user1-89@plc1.org keys: [2089] sites: [] +2095 1 user1-90@plc1.org keys: [2090] sites: [] +2096 1 user1-91@plc1.org keys: [2091] sites: [] +2097 1 user1-92@plc1.org keys: [2092] sites: [] +2098 1 user1-93@plc1.org keys: [2093] sites: [] +2099 1 user1-94@plc1.org keys: [2094] sites: [] +2100 1 user1-95@plc1.org keys: [2095] sites: [] +2101 1 user1-96@plc1.org keys: [2096] sites: [] +2102 1 user1-97@plc1.org keys: [2097] sites: [] +2103 1 user1-98@plc1.org keys: [2098] sites: [] +2104 1 user1-99@plc1.org keys: [2099] sites: [] +2105 1 user1-100@plc1.org keys: [2100] sites: [] +2106 1 user1-101@plc1.org keys: [2101] sites: [] +2107 1 user1-102@plc1.org keys: [2102] sites: [] +2108 1 user1-103@plc1.org keys: [2103] sites: [] +2109 1 user1-104@plc1.org keys: [2104] sites: [] +2110 1 user1-105@plc1.org keys: [2105] sites: [] +2111 1 user1-106@plc1.org keys: [2106] sites: [] +2112 1 user1-107@plc1.org keys: [2107] sites: [] +2113 1 user1-108@plc1.org keys: [2108] sites: [] +2114 1 user1-109@plc1.org keys: [2109] sites: [] +2115 1 user1-110@plc1.org keys: [2110] sites: [] +2116 1 user1-111@plc1.org keys: [2111] sites: [] +2117 1 user1-112@plc1.org keys: [2112] sites: [] +2118 1 user1-113@plc1.org keys: [2113] sites: [] +2119 1 user1-114@plc1.org keys: [2114] sites: [] +2120 1 user1-115@plc1.org keys: [2115] sites: [] +2121 1 user1-116@plc1.org keys: [2116] sites: [] +2122 1 user1-117@plc1.org keys: [2117] sites: [] +2123 1 user1-118@plc1.org keys: [2118] sites: [] +2124 1 user1-119@plc1.org keys: [2119] sites: [] +2125 1 user1-120@plc1.org keys: [2120] sites: [] +2126 1 user1-121@plc1.org keys: [2121] sites: [] +2127 1 user1-122@plc1.org keys: [2122] sites: [] +2128 1 user1-123@plc1.org keys: [2123] sites: [] +2129 1 user1-124@plc1.org keys: [2124] sites: [] +2130 1 user1-125@plc1.org keys: [2125] sites: [] +2131 1 user1-126@plc1.org keys: [2126] sites: [] +2132 1 user1-127@plc1.org keys: [2127] sites: [] +2133 1 user1-128@plc1.org keys: [2128] sites: [] +2134 1 user1-129@plc1.org keys: [2129] sites: [] +2135 1 user1-130@plc1.org keys: [2130] sites: [] +2136 1 user1-131@plc1.org keys: [2131] sites: [] +2137 1 user1-132@plc1.org keys: [2132] sites: [] +2138 1 user1-133@plc1.org keys: [2133] sites: [] +2139 1 user1-134@plc1.org keys: [2134] sites: [] +2140 1 user1-135@plc1.org keys: [2135] sites: [] +2141 1 user1-136@plc1.org keys: [2136] sites: [] +2142 1 user1-137@plc1.org keys: [2137] sites: [] +2143 1 user1-138@plc1.org keys: [2138] sites: [] +2144 1 user1-139@plc1.org keys: [2139] sites: [] +2145 1 user1-140@plc1.org keys: [2140] sites: [] +2146 1 user1-141@plc1.org keys: [2141] sites: [] +2147 1 user1-142@plc1.org keys: [2142] sites: [] +2148 1 user1-143@plc1.org keys: [2143] sites: [] +2149 1 user1-144@plc1.org keys: [2144] sites: [] +2150 1 user1-145@plc1.org keys: [2145] sites: [] +2151 1 user1-146@plc1.org keys: [2146] sites: [] +2152 1 user1-147@plc1.org keys: [2147] sites: [] +2153 1 user1-148@plc1.org keys: [2148] sites: [] +2154 1 user1-149@plc1.org keys: [2149] sites: [] +2155 1 user1-150@plc1.org keys: [2150] sites: [] +2156 1 user1-151@plc1.org keys: [2151] sites: [] +2157 1 user1-152@plc1.org keys: [2152] sites: [] +2158 1 user1-153@plc1.org keys: [2153] sites: [] +2159 1 user1-154@plc1.org keys: [2154] sites: [] +2160 1 user1-155@plc1.org keys: [2155] sites: [] +2161 1 user1-156@plc1.org keys: [2156] sites: [] +2162 1 user1-157@plc1.org keys: [2157] sites: [] +2163 1 user1-158@plc1.org keys: [2158] sites: [] +2164 1 user1-159@plc1.org keys: [2159] sites: [] +2165 1 user1-160@plc1.org keys: [2160] sites: [] +2166 1 user1-161@plc1.org keys: [2161] sites: [] +2167 1 user1-162@plc1.org keys: [2162] sites: [] +2168 1 user1-163@plc1.org keys: [2163] sites: [] +2169 1 user1-164@plc1.org keys: [2164] sites: [] +2170 1 user1-165@plc1.org keys: [2165] sites: [] +2171 1 user1-166@plc1.org keys: [2166] sites: [] +2172 1 user1-167@plc1.org keys: [2167] sites: [] +2173 1 user1-168@plc1.org keys: [2168] sites: [] +2174 1 user1-169@plc1.org keys: [2169] sites: [] +2175 1 user1-170@plc1.org keys: [2170] sites: [] +2176 1 user1-171@plc1.org keys: [2171] sites: [] +2177 1 user1-172@plc1.org keys: [2172] sites: [] +2178 1 user1-173@plc1.org keys: [2173] sites: [] +2179 1 user1-174@plc1.org keys: [2174] sites: [] +2180 1 user1-175@plc1.org keys: [2175] sites: [] +2181 1 user1-176@plc1.org keys: [2176] sites: [] +2182 1 user1-177@plc1.org keys: [2177] sites: [] +2183 1 user1-178@plc1.org keys: [2178] sites: [] +2184 1 user1-179@plc1.org keys: [2179] sites: [] +2185 1 user1-180@plc1.org keys: [2180] sites: [] +2186 1 user1-181@plc1.org keys: [2181] sites: [] +2187 1 user1-182@plc1.org keys: [2182] sites: [] +2188 1 user1-183@plc1.org keys: [2183] sites: [] +2189 1 user1-184@plc1.org keys: [2184] sites: [] +2190 1 user1-185@plc1.org keys: [2185] sites: [] +2191 1 user1-186@plc1.org keys: [2186] sites: [] +2192 1 user1-187@plc1.org keys: [2187] sites: [] +2193 1 user1-188@plc1.org keys: [2188] sites: [] +2194 1 user1-189@plc1.org keys: [2189] sites: [] +2195 1 user1-190@plc1.org keys: [2190] sites: [] +2196 1 user1-191@plc1.org keys: [2191] sites: [] +2197 1 user1-192@plc1.org keys: [2192] sites: [] +2198 1 user1-193@plc1.org keys: [2193] sites: [] +2199 1 user1-194@plc1.org keys: [2194] sites: [] +2200 1 user1-195@plc1.org keys: [2195] sites: [] +2201 1 user1-196@plc1.org keys: [2196] sites: [] +2202 1 user1-197@plc1.org keys: [2197] sites: [] +2203 1 user1-198@plc1.org keys: [2198] sites: [] +2204 1 user1-199@plc1.org keys: [2199] sites: [] +2205 1 user1-200@plc1.org keys: [2200] sites: [] +2206 1 user1-201@plc1.org keys: [2201] sites: [] +2207 1 user1-202@plc1.org keys: [2202] sites: [] +2208 1 user1-203@plc1.org keys: [2203] sites: [] +2209 1 user1-204@plc1.org keys: [2204] sites: [] +2210 1 user1-205@plc1.org keys: [2205] sites: [] +2211 1 user1-206@plc1.org keys: [2206] sites: [] +2212 1 user1-207@plc1.org keys: [2207] sites: [] +2213 1 user1-208@plc1.org keys: [2208] sites: [] +2214 1 user1-209@plc1.org keys: [2209] sites: [] +2215 1 user1-210@plc1.org keys: [2210] sites: [] +2216 1 user1-211@plc1.org keys: [2211] sites: [] +2217 1 user1-212@plc1.org keys: [2212] sites: [] +2218 1 user1-213@plc1.org keys: [2213] sites: [] +2219 1 user1-214@plc1.org keys: [2214] sites: [] +2220 1 user1-215@plc1.org keys: [2215] sites: [] +2221 1 user1-216@plc1.org keys: [2216] sites: [] +2222 1 user1-217@plc1.org keys: [2217] sites: [] +2223 1 user1-218@plc1.org keys: [2218] sites: [] +2224 1 user1-219@plc1.org keys: [2219] sites: [] +2225 1 user1-220@plc1.org keys: [2220] sites: [] +2226 1 user1-221@plc1.org keys: [2221] sites: [] +2227 1 user1-222@plc1.org keys: [2222] sites: [] +2228 1 user1-223@plc1.org keys: [2223] sites: [] +2229 1 user1-224@plc1.org keys: [2224] sites: [] +2230 1 user1-225@plc1.org keys: [2225] sites: [] +2231 1 user1-226@plc1.org keys: [2226] sites: [] +2232 1 user1-227@plc1.org keys: [2227] sites: [] +2233 1 user1-228@plc1.org keys: [2228] sites: [] +2234 1 user1-229@plc1.org keys: [2229] sites: [] +2235 1 user1-230@plc1.org keys: [2230] sites: [] +2236 1 user1-231@plc1.org keys: [2231] sites: [] +2237 1 user1-232@plc1.org keys: [2232] sites: [] +2238 1 user1-233@plc1.org keys: [2233] sites: [] +2239 1 user1-234@plc1.org keys: [2234] sites: [] +2240 1 user1-235@plc1.org keys: [2235] sites: [] +2241 1 user1-236@plc1.org keys: [2236] sites: [] +2242 1 user1-237@plc1.org keys: [2237] sites: [] +2243 1 user1-238@plc1.org keys: [2238] sites: [] +2244 1 user1-239@plc1.org keys: [2239] sites: [] +2245 1 user1-240@plc1.org keys: [2240] sites: [] +2246 1 user1-241@plc1.org keys: [2241] sites: [] +2247 1 user1-242@plc1.org keys: [2242] sites: [] +2248 1 user1-243@plc1.org keys: [2243] sites: [] +2249 1 user1-244@plc1.org keys: [2244] sites: [] +2250 1 user1-245@plc1.org keys: [2245] sites: [] +2251 1 user1-246@plc1.org keys: [2246] sites: [] +2252 1 user1-247@plc1.org keys: [2247] sites: [] +2253 1 user1-248@plc1.org keys: [2248] sites: [] +2254 1 user1-249@plc1.org keys: [2249] sites: [] +2255 1 user1-250@plc1.org keys: [2250] sites: [] +2256 1 user1-251@plc1.org keys: [2251] sites: [] +2257 1 user1-252@plc1.org keys: [2252] sites: [] +2258 1 user1-253@plc1.org keys: [2253] sites: [] +2259 1 user1-254@plc1.org keys: [2254] sites: [] +2260 1 user1-255@plc1.org keys: [2255] sites: [] +2261 1 user1-256@plc1.org keys: [2256] sites: [] +2262 1 user1-257@plc1.org keys: [2257] sites: [] +2263 1 user1-258@plc1.org keys: [2258] sites: [] +2264 1 user1-259@plc1.org keys: [2259] sites: [] +2265 1 user1-260@plc1.org keys: [2260] sites: [] +2266 1 user1-261@plc1.org keys: [2261] sites: [] +2267 1 user1-262@plc1.org keys: [2262] sites: [] +2268 1 user1-263@plc1.org keys: [2263] sites: [] +2269 1 user1-264@plc1.org keys: [2264] sites: [] +2270 1 user1-265@plc1.org keys: [2265] sites: [] +2271 1 user1-266@plc1.org keys: [2266] sites: [] +2272 1 user1-267@plc1.org keys: [2267] sites: [] +2273 1 user1-268@plc1.org keys: [2268] sites: [] +2274 1 user1-269@plc1.org keys: [2269] sites: [] +2275 1 user1-270@plc1.org keys: [2270] sites: [] +2276 1 user1-271@plc1.org keys: [2271] sites: [] +2277 1 user1-272@plc1.org keys: [2272] sites: [] +2278 1 user1-273@plc1.org keys: [2273] sites: [] +2279 1 user1-274@plc1.org keys: [2274] sites: [] +2280 1 user1-275@plc1.org keys: [2275] sites: [] +2281 1 user1-276@plc1.org keys: [2276] sites: [] +2282 1 user1-277@plc1.org keys: [2277] sites: [] +2283 1 user1-278@plc1.org keys: [2278] sites: [] +2284 1 user1-279@plc1.org keys: [2279] sites: [] +2285 1 user1-280@plc1.org keys: [2280] sites: [] +2286 1 user1-281@plc1.org keys: [2281] sites: [] +2287 1 user1-282@plc1.org keys: [2282] sites: [] +2288 1 user1-283@plc1.org keys: [2283] sites: [] +2289 1 user1-284@plc1.org keys: [2284] sites: [] +2290 1 user1-285@plc1.org keys: [2285] sites: [] +2291 1 user1-286@plc1.org keys: [2286] sites: [] +2292 1 user1-287@plc1.org keys: [2287] sites: [] +2293 1 user1-288@plc1.org keys: [2288] sites: [] +2294 1 user1-289@plc1.org keys: [2289] sites: [] +2295 1 user1-290@plc1.org keys: [2290] sites: [] +2296 1 user1-291@plc1.org keys: [2291] sites: [] +2297 1 user1-292@plc1.org keys: [2292] sites: [] +2298 1 user1-293@plc1.org keys: [2293] sites: [] +2299 1 user1-294@plc1.org keys: [2294] sites: [] +2300 1 user1-295@plc1.org keys: [2295] sites: [] +2301 1 user1-296@plc1.org keys: [2296] sites: [] +2302 1 user1-297@plc1.org keys: [2297] sites: [] +2303 1 user1-298@plc1.org keys: [2298] sites: [] +2304 1 user1-299@plc1.org keys: [2299] sites: [] +2305 1 user1-300@plc1.org keys: [2300] sites: [] +2306 1 user1-301@plc1.org keys: [2301] sites: [] +2307 1 user1-302@plc1.org keys: [2302] sites: [] +2308 1 user1-303@plc1.org keys: [2303] sites: [] +2309 1 user1-304@plc1.org keys: [2304] sites: [] +2310 1 user1-305@plc1.org keys: [2305] sites: [] +2311 1 user1-306@plc1.org keys: [2306] sites: [] +2312 1 user1-307@plc1.org keys: [2307] sites: [] +2313 1 user1-308@plc1.org keys: [2308] sites: [] +2314 1 user1-309@plc1.org keys: [2309] sites: [] +2315 1 user1-310@plc1.org keys: [2310] sites: [] +2316 1 user1-311@plc1.org keys: [2311] sites: [] +2317 1 user1-312@plc1.org keys: [2312] sites: [] +2318 1 user1-313@plc1.org keys: [2313] sites: [] +2319 1 user1-314@plc1.org keys: [2314] sites: [] +2320 1 user1-315@plc1.org keys: [2315] sites: [] +2321 1 user1-316@plc1.org keys: [2316] sites: [] +2322 1 user1-317@plc1.org keys: [2317] sites: [] +2323 1 user1-318@plc1.org keys: [2318] sites: [] +2324 1 user1-319@plc1.org keys: [2319] sites: [] +2325 1 user1-320@plc1.org keys: [2320] sites: [] +2326 1 user1-321@plc1.org keys: [2321] sites: [] +2327 1 user1-322@plc1.org keys: [2322] sites: [] +2328 1 user1-323@plc1.org keys: [2323] sites: [] +2329 1 user1-324@plc1.org keys: [2324] sites: [] +2330 1 user1-325@plc1.org keys: [2325] sites: [] +2331 1 user1-326@plc1.org keys: [2326] sites: [] +2332 1 user1-327@plc1.org keys: [2327] sites: [] +2333 1 user1-328@plc1.org keys: [2328] sites: [] +2334 1 user1-329@plc1.org keys: [2329] sites: [] +2335 1 user1-330@plc1.org keys: [2330] sites: [] +2336 1 user1-331@plc1.org keys: [2331] sites: [] +2337 1 user1-332@plc1.org keys: [2332] sites: [] +2338 1 user1-333@plc1.org keys: [2333] sites: [] +2339 1 user1-334@plc1.org keys: [2334] sites: [] +2340 1 user1-335@plc1.org keys: [2335] sites: [] +2341 1 user1-336@plc1.org keys: [2336] sites: [] +2342 1 user1-337@plc1.org keys: [2337] sites: [] +2343 1 user1-338@plc1.org keys: [2338] sites: [] +2344 1 user1-339@plc1.org keys: [2339] sites: [] +2345 1 user1-340@plc1.org keys: [2340] sites: [] +2346 1 user1-341@plc1.org keys: [2341] sites: [] +2347 1 user1-342@plc1.org keys: [2342] sites: [] +2348 1 user1-343@plc1.org keys: [2343] sites: [] +2349 1 user1-344@plc1.org keys: [2344] sites: [] +2350 1 user1-345@plc1.org keys: [2345] sites: [] +2351 1 user1-346@plc1.org keys: [2346] sites: [] +2352 1 user1-347@plc1.org keys: [2347] sites: [] +2353 1 user1-348@plc1.org keys: [2348] sites: [] +2354 1 user1-349@plc1.org keys: [2349] sites: [] +2355 1 user1-350@plc1.org keys: [2350] sites: [] +2356 1 user1-351@plc1.org keys: [2351] sites: [] +2357 1 user1-352@plc1.org keys: [2352] sites: [] +2358 1 user1-353@plc1.org keys: [2353] sites: [] +2359 1 user1-354@plc1.org keys: [2354] sites: [] +2360 1 user1-355@plc1.org keys: [2355] sites: [] +2361 1 user1-356@plc1.org keys: [2356] sites: [] +2362 1 user1-357@plc1.org keys: [2357] sites: [] +2363 1 user1-358@plc1.org keys: [2358] sites: [] +2364 1 user1-359@plc1.org keys: [2359] sites: [] +2365 1 user1-360@plc1.org keys: [2360] sites: [] +2366 1 user1-361@plc1.org keys: [2361] sites: [] +2367 1 user1-362@plc1.org keys: [2362] sites: [] +2368 1 user1-363@plc1.org keys: [2363] sites: [] +2369 1 user1-364@plc1.org keys: [2364] sites: [] +2370 1 user1-365@plc1.org keys: [2365] sites: [] +2371 1 user1-366@plc1.org keys: [2366] sites: [] +2372 1 user1-367@plc1.org keys: [2367] sites: [] +2373 1 user1-368@plc1.org keys: [2368] sites: [] +2374 1 user1-369@plc1.org keys: [2369] sites: [] +2375 1 user1-370@plc1.org keys: [2370] sites: [] +2376 1 user1-371@plc1.org keys: [2371] sites: [] +2377 1 user1-372@plc1.org keys: [2372] sites: [] +2378 1 user1-373@plc1.org keys: [2373] sites: [] +2379 1 user1-374@plc1.org keys: [2374] sites: [] +2380 1 user1-375@plc1.org keys: [2375] sites: [] +2381 1 user1-376@plc1.org keys: [2376] sites: [] +2382 1 user1-377@plc1.org keys: [2377] sites: [] +2383 1 user1-378@plc1.org keys: [2378] sites: [] +2384 1 user1-379@plc1.org keys: [2379] sites: [] +2385 1 user1-380@plc1.org keys: [2380] sites: [] +2386 1 user1-381@plc1.org keys: [2381] sites: [] +2387 1 user1-382@plc1.org keys: [2382] sites: [] +2388 1 user1-383@plc1.org keys: [2383] sites: [] +2389 1 user1-384@plc1.org keys: [2384] sites: [] +2390 1 user1-385@plc1.org keys: [2385] sites: [] +2391 1 user1-386@plc1.org keys: [2386] sites: [] +2392 1 user1-387@plc1.org keys: [2387] sites: [] +2393 1 user1-388@plc1.org keys: [2388] sites: [] +2394 1 user1-389@plc1.org keys: [2389] sites: [] +2395 1 user1-390@plc1.org keys: [2390] sites: [] +2396 1 user1-391@plc1.org keys: [2391] sites: [] +2397 1 user1-392@plc1.org keys: [2392] sites: [] +2398 1 user1-393@plc1.org keys: [2393] sites: [] +2399 1 user1-394@plc1.org keys: [2394] sites: [] +2400 1 user1-395@plc1.org keys: [2395] sites: [] +2401 1 user1-396@plc1.org keys: [2396] sites: [] +2402 1 user1-397@plc1.org keys: [2397] sites: [] +2403 1 user1-398@plc1.org keys: [2398] sites: [] +2404 1 user1-399@plc1.org keys: [2399] sites: [] +2405 1 user1-400@plc1.org keys: [2400] sites: [] +2406 1 user1-401@plc1.org keys: [2401] sites: [] +2407 1 user1-402@plc1.org keys: [2402] sites: [] +2408 1 user1-403@plc1.org keys: [2403] sites: [] +2409 1 user1-404@plc1.org keys: [2404] sites: [] +2410 1 user1-405@plc1.org keys: [2405] sites: [] +2411 1 user1-406@plc1.org keys: [2406] sites: [] +2412 1 user1-407@plc1.org keys: [2407] sites: [] +2413 1 user1-408@plc1.org keys: [2408] sites: [] +2414 1 user1-409@plc1.org keys: [2409] sites: [] +2415 1 user1-410@plc1.org keys: [2410] sites: [] +2416 1 user1-411@plc1.org keys: [2411] sites: [] +2417 1 user1-412@plc1.org keys: [2412] sites: [] +2418 1 user1-413@plc1.org keys: [2413] sites: [] +2419 1 user1-414@plc1.org keys: [2414] sites: [] +2420 1 user1-415@plc1.org keys: [2415] sites: [] +2421 1 user1-416@plc1.org keys: [2416] sites: [] +2422 1 user1-417@plc1.org keys: [2417] sites: [] +2423 1 user1-418@plc1.org keys: [2418] sites: [] +2424 1 user1-419@plc1.org keys: [2419] sites: [] +2425 1 user1-420@plc1.org keys: [2420] sites: [] +2426 1 user1-421@plc1.org keys: [2421] sites: [] +2427 1 user1-422@plc1.org keys: [2422] sites: [] +2428 1 user1-423@plc1.org keys: [2423] sites: [] +2429 1 user1-424@plc1.org keys: [2424] sites: [] +2430 1 user1-425@plc1.org keys: [2425] sites: [] +2431 1 user1-426@plc1.org keys: [2426] sites: [] +2432 1 user1-427@plc1.org keys: [2427] sites: [] +2433 1 user1-428@plc1.org keys: [2428] sites: [] +2434 1 user1-429@plc1.org keys: [2429] sites: [] +2435 1 user1-430@plc1.org keys: [2430] sites: [] +2436 1 user1-431@plc1.org keys: [2431] sites: [] +2437 1 user1-432@plc1.org keys: [2432] sites: [] +2438 1 user1-433@plc1.org keys: [2433] sites: [] +2439 1 user1-434@plc1.org keys: [2434] sites: [] +2440 1 user1-435@plc1.org keys: [2435] sites: [] +2441 1 user1-436@plc1.org keys: [2436] sites: [] +2442 1 user1-437@plc1.org keys: [2437] sites: [] +2443 1 user1-438@plc1.org keys: [2438] sites: [] +2444 1 user1-439@plc1.org keys: [2439] sites: [] +2445 1 user1-440@plc1.org keys: [2440] sites: [] +2446 1 user1-441@plc1.org keys: [2441] sites: [] +2447 1 user1-442@plc1.org keys: [2442] sites: [] +2448 1 user1-443@plc1.org keys: [2443] sites: [] +2449 1 user1-444@plc1.org keys: [2444] sites: [] +2450 1 user1-445@plc1.org keys: [2445] sites: [] +2451 1 user1-446@plc1.org keys: [2446] sites: [] +2452 1 user1-447@plc1.org keys: [2447] sites: [] +2453 1 user1-448@plc1.org keys: [2448] sites: [] +2454 1 user1-449@plc1.org keys: [2449] sites: [] +2455 1 user1-450@plc1.org keys: [2450] sites: [] +2456 1 user1-451@plc1.org keys: [2451] sites: [] +2457 1 user1-452@plc1.org keys: [2452] sites: [] +2458 1 user1-453@plc1.org keys: [2453] sites: [] +2459 1 user1-454@plc1.org keys: [2454] sites: [] +2460 1 user1-455@plc1.org keys: [2455] sites: [] +2461 1 user1-456@plc1.org keys: [2456] sites: [] +2462 1 user1-457@plc1.org keys: [2457] sites: [] +2463 1 user1-458@plc1.org keys: [2458] sites: [] +2464 1 user1-459@plc1.org keys: [2459] sites: [] +2465 1 user1-460@plc1.org keys: [2460] sites: [] +2466 1 user1-461@plc1.org keys: [2461] sites: [] +2467 1 user1-462@plc1.org keys: [2462] sites: [] +2468 1 user1-463@plc1.org keys: [2463] sites: [] +2469 1 user1-464@plc1.org keys: [2464] sites: [] +2470 1 user1-465@plc1.org keys: [2465] sites: [] +2471 1 user1-466@plc1.org keys: [2466] sites: [] +2472 1 user1-467@plc1.org keys: [2467] sites: [] +2473 1 user1-468@plc1.org keys: [2468] sites: [] +2474 1 user1-469@plc1.org keys: [2469] sites: [] +2475 1 user1-470@plc1.org keys: [2470] sites: [] +2476 1 user1-471@plc1.org keys: [2471] sites: [] +2477 1 user1-472@plc1.org keys: [2472] sites: [] +2478 1 user1-473@plc1.org keys: [2473] sites: [] +2479 1 user1-474@plc1.org keys: [2474] sites: [] +2480 1 user1-475@plc1.org keys: [2475] sites: [] +2481 1 user1-476@plc1.org keys: [2476] sites: [] +2482 1 user1-477@plc1.org keys: [2477] sites: [] +2483 1 user1-478@plc1.org keys: [2478] sites: [] +2484 1 user1-479@plc1.org keys: [2479] sites: [] +2485 1 user1-480@plc1.org keys: [2480] sites: [] +2486 1 user1-481@plc1.org keys: [2481] sites: [] +2487 1 user1-482@plc1.org keys: [2482] sites: [] +2488 1 user1-483@plc1.org keys: [2483] sites: [] +2489 1 user1-484@plc1.org keys: [2484] sites: [] +2490 1 user1-485@plc1.org keys: [2485] sites: [] +2491 1 user1-486@plc1.org keys: [2486] sites: [] +2492 1 user1-487@plc1.org keys: [2487] sites: [] +2493 1 user1-488@plc1.org keys: [2488] sites: [] +2494 1 user1-489@plc1.org keys: [2489] sites: [] +2495 1 user1-490@plc1.org keys: [2490] sites: [] +2496 1 user1-491@plc1.org keys: [2491] sites: [] +2497 1 user1-492@plc1.org keys: [2492] sites: [] +2498 1 user1-493@plc1.org keys: [2493] sites: [] +2499 1 user1-494@plc1.org keys: [2494] sites: [] +2500 1 user1-495@plc1.org keys: [2495] sites: [] +2501 1 user1-496@plc1.org keys: [2496] sites: [] +2502 1 user1-497@plc1.org keys: [2497] sites: [] +2503 1 user1-498@plc1.org keys: [2498] sites: [] +2504 1 user1-499@plc1.org keys: [2499] sites: [] +2505 1 user1-500@plc1.org keys: [2500] sites: [] +2506 1 user1-501@plc1.org keys: [2501] sites: [] +2507 1 user1-502@plc1.org keys: [2502] sites: [] +2508 1 user1-503@plc1.org keys: [2503] sites: [] +2509 1 user1-504@plc1.org keys: [2504] sites: [] +2510 1 user1-505@plc1.org keys: [2505] sites: [] +2511 1 user1-506@plc1.org keys: [2506] sites: [] +2512 1 user1-507@plc1.org keys: [2507] sites: [] +2513 1 user1-508@plc1.org keys: [2508] sites: [] +2514 1 user1-509@plc1.org keys: [2509] sites: [] +2515 1 user1-510@plc1.org keys: [2510] sites: [] +2516 1 user1-511@plc1.org keys: [2511] sites: [] +2517 1 user1-512@plc1.org keys: [2512] sites: [] +2518 1 user1-513@plc1.org keys: [2513] sites: [] +2519 1 user1-514@plc1.org keys: [2514] sites: [] +2520 1 user1-515@plc1.org keys: [2515] sites: [] +2521 1 user1-516@plc1.org keys: [2516] sites: [] +2522 1 user1-517@plc1.org keys: [2517] sites: [] +2523 1 user1-518@plc1.org keys: [2518] sites: [] +2524 1 user1-519@plc1.org keys: [2519] sites: [] +2525 1 user1-520@plc1.org keys: [2520] sites: [] +2526 1 user1-521@plc1.org keys: [2521] sites: [] +2527 1 user1-522@plc1.org keys: [2522] sites: [] +2528 1 user1-523@plc1.org keys: [2523] sites: [] +2529 1 user1-524@plc1.org keys: [2524] sites: [] +2530 1 user1-525@plc1.org keys: [2525] sites: [] +2531 1 user1-526@plc1.org keys: [2526] sites: [] +2532 1 user1-527@plc1.org keys: [2527] sites: [] +2533 1 user1-528@plc1.org keys: [2528] sites: [] +2534 1 user1-529@plc1.org keys: [2529] sites: [] +2535 1 user1-530@plc1.org keys: [2530] sites: [] +2536 1 user1-531@plc1.org keys: [2531] sites: [] +2537 1 user1-532@plc1.org keys: [2532] sites: [] +2538 1 user1-533@plc1.org keys: [2533] sites: [] +2539 1 user1-534@plc1.org keys: [2534] sites: [] +2540 1 user1-535@plc1.org keys: [2535] sites: [] +2541 1 user1-536@plc1.org keys: [2536] sites: [] +2542 1 user1-537@plc1.org keys: [2537] sites: [] +2543 1 user1-538@plc1.org keys: [2538] sites: [] +2544 1 user1-539@plc1.org keys: [2539] sites: [] +2545 1 user1-540@plc1.org keys: [2540] sites: [] +2546 1 user1-541@plc1.org keys: [2541] sites: [] +2547 1 user1-542@plc1.org keys: [2542] sites: [] +2548 1 user1-543@plc1.org keys: [2543] sites: [] +2549 1 user1-544@plc1.org keys: [2544] sites: [] +2550 1 user1-545@plc1.org keys: [2545] sites: [] +2551 1 user1-546@plc1.org keys: [2546] sites: [] +2552 1 user1-547@plc1.org keys: [2547] sites: [] +2553 1 user1-548@plc1.org keys: [2548] sites: [] +2554 1 user1-549@plc1.org keys: [2549] sites: [] +2555 1 user1-550@plc1.org keys: [2550] sites: [] +2556 1 user1-551@plc1.org keys: [2551] sites: [] +2557 1 user1-552@plc1.org keys: [2552] sites: [] +2558 1 user1-553@plc1.org keys: [2553] sites: [] +2559 1 user1-554@plc1.org keys: [2554] sites: [] +2560 1 user1-555@plc1.org keys: [2555] sites: [] +2561 1 user1-556@plc1.org keys: [2556] sites: [] +2562 1 user1-557@plc1.org keys: [2557] sites: [] +2563 1 user1-558@plc1.org keys: [2558] sites: [] +2564 1 user1-559@plc1.org keys: [2559] sites: [] +2565 1 user1-560@plc1.org keys: [2560] sites: [] +2566 1 user1-561@plc1.org keys: [2561] sites: [] +2567 1 user1-562@plc1.org keys: [2562] sites: [] +2568 1 user1-563@plc1.org keys: [2563] sites: [] +2569 1 user1-564@plc1.org keys: [2564] sites: [] +2570 1 user1-565@plc1.org keys: [2565] sites: [] +2571 1 user1-566@plc1.org keys: [2566] sites: [] +2572 1 user1-567@plc1.org keys: [2567] sites: [] +2573 1 user1-568@plc1.org keys: [2568] sites: [] +2574 1 user1-569@plc1.org keys: [2569] sites: [] +2575 1 user1-570@plc1.org keys: [2570] sites: [] +2576 1 user1-571@plc1.org keys: [2571] sites: [] +2577 1 user1-572@plc1.org keys: [2572] sites: [] +2578 1 user1-573@plc1.org keys: [2573] sites: [] +2579 1 user1-574@plc1.org keys: [2574] sites: [] +2580 1 user1-575@plc1.org keys: [2575] sites: [] +2581 1 user1-576@plc1.org keys: [2576] sites: [] +2582 1 user1-577@plc1.org keys: [2577] sites: [] +2583 1 user1-578@plc1.org keys: [2578] sites: [] +2584 1 user1-579@plc1.org keys: [2579] sites: [] +2585 1 user1-580@plc1.org keys: [2580] sites: [] +2586 1 user1-581@plc1.org keys: [2581] sites: [] +2587 1 user1-582@plc1.org keys: [2582] sites: [] +2588 1 user1-583@plc1.org keys: [2583] sites: [] +2589 1 user1-584@plc1.org keys: [2584] sites: [] +2590 1 user1-585@plc1.org keys: [2585] sites: [] +2591 1 user1-586@plc1.org keys: [2586] sites: [] +2592 1 user1-587@plc1.org keys: [2587] sites: [] +2593 1 user1-588@plc1.org keys: [2588] sites: [] +2594 1 user1-589@plc1.org keys: [2589] sites: [] +2595 1 user1-590@plc1.org keys: [2590] sites: [] +2596 1 user1-591@plc1.org keys: [2591] sites: [] +2597 1 user1-592@plc1.org keys: [2592] sites: [] +2598 1 user1-593@plc1.org keys: [2593] sites: [] +2599 1 user1-594@plc1.org keys: [2594] sites: [] +2600 1 user1-595@plc1.org keys: [2595] sites: [] +2601 1 user1-596@plc1.org keys: [2596] sites: [] +2602 1 user1-597@plc1.org keys: [2597] sites: [] +2603 1 user1-598@plc1.org keys: [2598] sites: [] +2604 1 user1-599@plc1.org keys: [2599] sites: [] +2605 1 user1-600@plc1.org keys: [2600] sites: [] +2606 1 user1-601@plc1.org keys: [2601] sites: [] +2607 1 user1-602@plc1.org keys: [2602] sites: [] +2608 1 user1-603@plc1.org keys: [2603] sites: [] +2609 1 user1-604@plc1.org keys: [2604] sites: [] +2610 1 user1-605@plc1.org keys: [2605] sites: [] +2611 1 user1-606@plc1.org keys: [2606] sites: [] +2612 1 user1-607@plc1.org keys: [2607] sites: [] +2613 1 user1-608@plc1.org keys: [2608] sites: [] +2614 1 user1-609@plc1.org keys: [2609] sites: [] +2615 1 user1-610@plc1.org keys: [2610] sites: [] +2616 1 user1-611@plc1.org keys: [2611] sites: [] +2617 1 user1-612@plc1.org keys: [2612] sites: [] +2618 1 user1-613@plc1.org keys: [2613] sites: [] +2619 1 user1-614@plc1.org keys: [2614] sites: [] +2620 1 user1-615@plc1.org keys: [2615] sites: [] +2621 1 user1-616@plc1.org keys: [2616] sites: [] +2622 1 user1-617@plc1.org keys: [2617] sites: [] +2623 1 user1-618@plc1.org keys: [2618] sites: [] +2624 1 user1-619@plc1.org keys: [2619] sites: [] +2625 1 user1-620@plc1.org keys: [2620] sites: [] +2626 1 user1-621@plc1.org keys: [2621] sites: [] +2627 1 user1-622@plc1.org keys: [2622] sites: [] +2628 1 user1-623@plc1.org keys: [2623] sites: [] +2629 1 user1-624@plc1.org keys: [2624] sites: [] +2630 1 user1-625@plc1.org keys: [2625] sites: [] +2631 1 user1-626@plc1.org keys: [2626] sites: [] +2632 1 user1-627@plc1.org keys: [2627] sites: [] +2633 1 user1-628@plc1.org keys: [2628] sites: [] +2634 1 user1-629@plc1.org keys: [2629] sites: [] +2635 1 user1-630@plc1.org keys: [2630] sites: [] +2636 1 user1-631@plc1.org keys: [2631] sites: [] +2637 1 user1-632@plc1.org keys: [2632] sites: [] +2638 1 user1-633@plc1.org keys: [2633] sites: [] +2639 1 user1-634@plc1.org keys: [2634] sites: [] +2640 1 user1-635@plc1.org keys: [2635] sites: [] +2641 1 user1-636@plc1.org keys: [2636] sites: [] +2642 1 user1-637@plc1.org keys: [2637] sites: [] +2643 1 user1-638@plc1.org keys: [2638] sites: [] +2644 1 user1-639@plc1.org keys: [2639] sites: [] +2645 1 user1-640@plc1.org keys: [2640] sites: [] +2646 1 user1-641@plc1.org keys: [2641] sites: [] +2647 1 user1-642@plc1.org keys: [2642] sites: [] +2648 1 user1-643@plc1.org keys: [2643] sites: [] +2649 1 user1-644@plc1.org keys: [2644] sites: [] +2650 1 user1-645@plc1.org keys: [2645] sites: [] +2651 1 user1-646@plc1.org keys: [2646] sites: [] +2652 1 user1-647@plc1.org keys: [2647] sites: [] +2653 1 user1-648@plc1.org keys: [2648] sites: [] +2654 1 user1-649@plc1.org keys: [2649] sites: [] +2655 1 user1-650@plc1.org keys: [2650] sites: [] +2656 1 user1-651@plc1.org keys: [2651] sites: [] +2657 1 user1-652@plc1.org keys: [2652] sites: [] +2658 1 user1-653@plc1.org keys: [2653] sites: [] +2659 1 user1-654@plc1.org keys: [2654] sites: [] +2660 1 user1-655@plc1.org keys: [2655] sites: [] +2661 1 user1-656@plc1.org keys: [2656] sites: [] +2662 1 user1-657@plc1.org keys: [2657] sites: [] +2663 1 user1-658@plc1.org keys: [2658] sites: [] +2664 1 user1-659@plc1.org keys: [2659] sites: [] +2665 1 user1-660@plc1.org keys: [2660] sites: [] +2666 1 user1-661@plc1.org keys: [2661] sites: [] +2667 1 user1-662@plc1.org keys: [2662] sites: [] +2668 1 user1-663@plc1.org keys: [2663] sites: [] +2669 1 user1-664@plc1.org keys: [2664] sites: [] +2670 1 user1-665@plc1.org keys: [2665] sites: [] +2671 1 user1-666@plc1.org keys: [2666] sites: [] +2672 1 user1-667@plc1.org keys: [2667] sites: [] +2673 1 user1-668@plc1.org keys: [2668] sites: [] +2674 1 user1-669@plc1.org keys: [2669] sites: [] +2675 1 user1-670@plc1.org keys: [2670] sites: [] +2676 1 user1-671@plc1.org keys: [2671] sites: [] +2677 1 user1-672@plc1.org keys: [2672] sites: [] +2678 1 user1-673@plc1.org keys: [2673] sites: [] +2679 1 user1-674@plc1.org keys: [2674] sites: [] +2680 1 user1-675@plc1.org keys: [2675] sites: [] +2681 1 user1-676@plc1.org keys: [2676] sites: [] +2682 1 user1-677@plc1.org keys: [2677] sites: [] +2683 1 user1-678@plc1.org keys: [2678] sites: [] +2684 1 user1-679@plc1.org keys: [2679] sites: [] +2685 1 user1-680@plc1.org keys: [2680] sites: [] +2686 1 user1-681@plc1.org keys: [2681] sites: [] +2687 1 user1-682@plc1.org keys: [2682] sites: [] +2688 1 user1-683@plc1.org keys: [2683] sites: [] +2689 1 user1-684@plc1.org keys: [2684] sites: [] +2690 1 user1-685@plc1.org keys: [2685] sites: [] +2691 1 user1-686@plc1.org keys: [2686] sites: [] +2692 1 user1-687@plc1.org keys: [2687] sites: [] +2693 1 user1-688@plc1.org keys: [2688] sites: [] +2694 1 user1-689@plc1.org keys: [2689] sites: [] +2695 1 user1-690@plc1.org keys: [2690] sites: [] +2696 1 user1-691@plc1.org keys: [2691] sites: [] +2697 1 user1-692@plc1.org keys: [2692] sites: [] +2698 1 user1-693@plc1.org keys: [2693] sites: [] +2699 1 user1-694@plc1.org keys: [2694] sites: [] +2700 1 user1-695@plc1.org keys: [2695] sites: [] +2701 1 user1-696@plc1.org keys: [2696] sites: [] +2702 1 user1-697@plc1.org keys: [2697] sites: [] +2703 1 user1-698@plc1.org keys: [2698] sites: [] +2704 1 user1-699@plc1.org keys: [2699] sites: [] +2705 1 user1-700@plc1.org keys: [2700] sites: [] +2706 1 user1-701@plc1.org keys: [2701] sites: [] +2707 1 user1-702@plc1.org keys: [2702] sites: [] +2708 1 user1-703@plc1.org keys: [2703] sites: [] +2709 1 user1-704@plc1.org keys: [2704] sites: [] +2710 1 user1-705@plc1.org keys: [2705] sites: [] +2711 1 user1-706@plc1.org keys: [2706] sites: [] +2712 1 user1-707@plc1.org keys: [2707] sites: [] +2713 1 user1-708@plc1.org keys: [2708] sites: [] +2714 1 user1-709@plc1.org keys: [2709] sites: [] +2715 1 user1-710@plc1.org keys: [2710] sites: [] +2716 1 user1-711@plc1.org keys: [2711] sites: [] +2717 1 user1-712@plc1.org keys: [2712] sites: [] +2718 1 user1-713@plc1.org keys: [2713] sites: [] +2719 1 user1-714@plc1.org keys: [2714] sites: [] +2720 1 user1-715@plc1.org keys: [2715] sites: [] +2721 1 user1-716@plc1.org keys: [2716] sites: [] +2722 1 user1-717@plc1.org keys: [2717] sites: [] +2723 1 user1-718@plc1.org keys: [2718] sites: [] +2724 1 user1-719@plc1.org keys: [2719] sites: [] +2725 1 user1-720@plc1.org keys: [2720] sites: [] +2726 1 user1-721@plc1.org keys: [2721] sites: [] +2727 1 user1-722@plc1.org keys: [2722] sites: [] +2728 1 user1-723@plc1.org keys: [2723] sites: [] +2729 1 user1-724@plc1.org keys: [2724] sites: [] +2730 1 user1-725@plc1.org keys: [2725] sites: [] +2731 1 user1-726@plc1.org keys: [2726] sites: [] +2732 1 user1-727@plc1.org keys: [2727] sites: [] +2733 1 user1-728@plc1.org keys: [2728] sites: [] +2734 1 user1-729@plc1.org keys: [2729] sites: [] +2735 1 user1-730@plc1.org keys: [2730] sites: [] +2736 1 user1-731@plc1.org keys: [2731] sites: [] +2737 1 user1-732@plc1.org keys: [2732] sites: [] +2738 1 user1-733@plc1.org keys: [2733] sites: [] +2739 1 user1-734@plc1.org keys: [2734] sites: [] +2740 1 user1-735@plc1.org keys: [2735] sites: [] +2741 1 user1-736@plc1.org keys: [2736] sites: [] +2742 1 user1-737@plc1.org keys: [2737] sites: [] +2743 1 user1-738@plc1.org keys: [2738] sites: [] +2744 1 user1-739@plc1.org keys: [2739] sites: [] +2745 1 user1-740@plc1.org keys: [2740] sites: [] +2746 1 user1-741@plc1.org keys: [2741] sites: [] +2747 1 user1-742@plc1.org keys: [2742] sites: [] +2748 1 user1-743@plc1.org keys: [2743] sites: [] +2749 1 user1-744@plc1.org keys: [2744] sites: [] +2750 1 user1-745@plc1.org keys: [2745] sites: [] +2751 1 user1-746@plc1.org keys: [2746] sites: [] +2752 1 user1-747@plc1.org keys: [2747] sites: [] +2753 1 user1-748@plc1.org keys: [2748] sites: [] +2754 1 user1-749@plc1.org keys: [2749] sites: [] +2755 1 user1-750@plc1.org keys: [2750] sites: [] +2756 1 user1-751@plc1.org keys: [2751] sites: [] +2757 1 user1-752@plc1.org keys: [2752] sites: [] +2758 1 user1-753@plc1.org keys: [2753] sites: [] +2759 1 user1-754@plc1.org keys: [2754] sites: [] +2760 1 user1-755@plc1.org keys: [2755] sites: [] +2761 1 user1-756@plc1.org keys: [2756] sites: [] +2762 1 user1-757@plc1.org keys: [2757] sites: [] +2763 1 user1-758@plc1.org keys: [2758] sites: [] +2764 1 user1-759@plc1.org keys: [2759] sites: [] +2765 1 user1-760@plc1.org keys: [2760] sites: [] +2766 1 user1-761@plc1.org keys: [2761] sites: [] +2767 1 user1-762@plc1.org keys: [2762] sites: [] +2768 1 user1-763@plc1.org keys: [2763] sites: [] +2769 1 user1-764@plc1.org keys: [2764] sites: [] +2770 1 user1-765@plc1.org keys: [2765] sites: [] +2771 1 user1-766@plc1.org keys: [2766] sites: [] +2772 1 user1-767@plc1.org keys: [2767] sites: [] +2773 1 user1-768@plc1.org keys: [2768] sites: [] +2774 1 user1-769@plc1.org keys: [2769] sites: [] +2775 1 user1-770@plc1.org keys: [2770] sites: [] +2776 1 user1-771@plc1.org keys: [2771] sites: [] +2777 1 user1-772@plc1.org keys: [2772] sites: [] +2778 1 user1-773@plc1.org keys: [2773] sites: [] +2779 1 user1-774@plc1.org keys: [2774] sites: [] +2780 1 user1-775@plc1.org keys: [2775] sites: [] +2781 1 user1-776@plc1.org keys: [2776] sites: [] +2782 1 user1-777@plc1.org keys: [2777] sites: [] +2783 1 user1-778@plc1.org keys: [2778] sites: [] +2784 1 user1-779@plc1.org keys: [2779] sites: [] +2785 1 user1-780@plc1.org keys: [2780] sites: [] +2786 1 user1-781@plc1.org keys: [2781] sites: [] +2787 1 user1-782@plc1.org keys: [2782] sites: [] +2788 1 user1-783@plc1.org keys: [2783] sites: [] +2789 1 user1-784@plc1.org keys: [2784] sites: [] +2790 1 user1-785@plc1.org keys: [2785] sites: [] +2791 1 user1-786@plc1.org keys: [2786] sites: [] +2792 1 user1-787@plc1.org keys: [2787] sites: [] +2793 1 user1-788@plc1.org keys: [2788] sites: [] +2794 1 user1-789@plc1.org keys: [2789] sites: [] +2795 1 user1-790@plc1.org keys: [2790] sites: [] +2796 1 user1-791@plc1.org keys: [2791] sites: [] +2797 1 user1-792@plc1.org keys: [2792] sites: [] +2798 1 user1-793@plc1.org keys: [2793] sites: [] +2799 1 user1-794@plc1.org keys: [2794] sites: [] +2800 1 user1-795@plc1.org keys: [2795] sites: [] +2801 1 user1-796@plc1.org keys: [2796] sites: [] +2802 1 user1-797@plc1.org keys: [2797] sites: [] +2803 1 user1-798@plc1.org keys: [2798] sites: [] +2804 1 user1-799@plc1.org keys: [2799] sites: [] +2805 1 user1-800@plc1.org keys: [2800] sites: [] +2806 1 user1-801@plc1.org keys: [2801] sites: [] +2807 1 user1-802@plc1.org keys: [2802] sites: [] +2808 1 user1-803@plc1.org keys: [2803] sites: [] +2809 1 user1-804@plc1.org keys: [2804] sites: [] +2810 1 user1-805@plc1.org keys: [2805] sites: [] +2811 1 user1-806@plc1.org keys: [2806] sites: [] +2812 1 user1-807@plc1.org keys: [2807] sites: [] +2813 1 user1-808@plc1.org keys: [2808] sites: [] +2814 1 user1-809@plc1.org keys: [2809] sites: [] +2815 1 user1-810@plc1.org keys: [2810] sites: [] +2816 1 user1-811@plc1.org keys: [2811] sites: [] +2817 1 user1-812@plc1.org keys: [2812] sites: [] +2818 1 user1-813@plc1.org keys: [2813] sites: [] +2819 1 user1-814@plc1.org keys: [2814] sites: [] +2820 1 user1-815@plc1.org keys: [2815] sites: [] +2821 1 user1-816@plc1.org keys: [2816] sites: [] +2822 1 user1-817@plc1.org keys: [2817] sites: [] +2823 1 user1-818@plc1.org keys: [2818] sites: [] +2824 1 user1-819@plc1.org keys: [2819] sites: [] +2825 1 user1-820@plc1.org keys: [2820] sites: [] +2826 1 user1-821@plc1.org keys: [2821] sites: [] +2827 1 user1-822@plc1.org keys: [2822] sites: [] +2828 1 user1-823@plc1.org keys: [2823] sites: [] +2829 1 user1-824@plc1.org keys: [2824] sites: [] +2830 1 user1-825@plc1.org keys: [2825] sites: [] +2831 1 user1-826@plc1.org keys: [2826] sites: [] +2832 1 user1-827@plc1.org keys: [2827] sites: [] +2833 1 user1-828@plc1.org keys: [2828] sites: [] +2834 1 user1-829@plc1.org keys: [2829] sites: [] +2835 1 user1-830@plc1.org keys: [2830] sites: [] +2836 1 user1-831@plc1.org keys: [2831] sites: [] +2837 1 user1-832@plc1.org keys: [2832] sites: [] +2838 1 user1-833@plc1.org keys: [2833] sites: [] +2839 1 user1-834@plc1.org keys: [2834] sites: [] +2840 1 user1-835@plc1.org keys: [2835] sites: [] +2841 1 user1-836@plc1.org keys: [2836] sites: [] +2842 1 user1-837@plc1.org keys: [2837] sites: [] +2843 1 user1-838@plc1.org keys: [2838] sites: [] +2844 1 user1-839@plc1.org keys: [2839] sites: [] +2845 1 user1-840@plc1.org keys: [2840] sites: [] +2846 1 user1-841@plc1.org keys: [2841] sites: [] +2847 1 user1-842@plc1.org keys: [2842] sites: [] +2848 1 user1-843@plc1.org keys: [2843] sites: [] +2849 1 user1-844@plc1.org keys: [2844] sites: [] +2850 1 user1-845@plc1.org keys: [2845] sites: [] +2851 1 user1-846@plc1.org keys: [2846] sites: [] +2852 1 user1-847@plc1.org keys: [2847] sites: [] +2853 1 user1-848@plc1.org keys: [2848] sites: [] +2854 1 user1-849@plc1.org keys: [2849] sites: [] +2855 1 user1-850@plc1.org keys: [2850] sites: [] +2856 1 user1-851@plc1.org keys: [2851] sites: [] +2857 1 user1-852@plc1.org keys: [2852] sites: [] +2858 1 user1-853@plc1.org keys: [2853] sites: [] +2859 1 user1-854@plc1.org keys: [2854] sites: [] +2860 1 user1-855@plc1.org keys: [2855] sites: [] +2861 1 user1-856@plc1.org keys: [2856] sites: [] +2862 1 user1-857@plc1.org keys: [2857] sites: [] +2863 1 user1-858@plc1.org keys: [2858] sites: [] +2864 1 user1-859@plc1.org keys: [2859] sites: [] +2865 1 user1-860@plc1.org keys: [2860] sites: [] +2866 1 user1-861@plc1.org keys: [2861] sites: [] +2867 1 user1-862@plc1.org keys: [2862] sites: [] +2868 1 user1-863@plc1.org keys: [2863] sites: [] +2869 1 user1-864@plc1.org keys: [2864] sites: [] +2870 1 user1-865@plc1.org keys: [2865] sites: [] +2871 1 user1-866@plc1.org keys: [2866] sites: [] +2872 1 user1-867@plc1.org keys: [2867] sites: [] +2873 1 user1-868@plc1.org keys: [2868] sites: [] +2874 1 user1-869@plc1.org keys: [2869] sites: [] +2875 1 user1-870@plc1.org keys: [2870] sites: [] +2876 1 user1-871@plc1.org keys: [2871] sites: [] +2877 1 user1-872@plc1.org keys: [2872] sites: [] +2878 1 user1-873@plc1.org keys: [2873] sites: [] +2879 1 user1-874@plc1.org keys: [2874] sites: [] +2880 1 user1-875@plc1.org keys: [2875] sites: [] +2881 1 user1-876@plc1.org keys: [2876] sites: [] +2882 1 user1-877@plc1.org keys: [2877] sites: [] +2883 1 user1-878@plc1.org keys: [2878] sites: [] +2884 1 user1-879@plc1.org keys: [2879] sites: [] +2885 1 user1-880@plc1.org keys: [2880] sites: [] +2886 1 user1-881@plc1.org keys: [2881] sites: [] +2887 1 user1-882@plc1.org keys: [2882] sites: [] +2888 1 user1-883@plc1.org keys: [2883] sites: [] +2889 1 user1-884@plc1.org keys: [2884] sites: [] +2890 1 user1-885@plc1.org keys: [2885] sites: [] +2891 1 user1-886@plc1.org keys: [2886] sites: [] +2892 1 user1-887@plc1.org keys: [2887] sites: [] +2893 1 user1-888@plc1.org keys: [2888] sites: [] +2894 1 user1-889@plc1.org keys: [2889] sites: [] +2895 1 user1-890@plc1.org keys: [2890] sites: [] +2896 1 user1-891@plc1.org keys: [2891] sites: [] +2897 1 user1-892@plc1.org keys: [2892] sites: [] +2898 1 user1-893@plc1.org keys: [2893] sites: [] +2899 1 user1-894@plc1.org keys: [2894] sites: [] +2900 1 user1-895@plc1.org keys: [2895] sites: [] +2901 1 user1-896@plc1.org keys: [2896] sites: [] +2902 1 user1-897@plc1.org keys: [2897] sites: [] +2903 1 user1-898@plc1.org keys: [2898] sites: [] +2904 1 user1-899@plc1.org keys: [2899] sites: [] +2905 1 user1-900@plc1.org keys: [2900] sites: [] +2906 1 user1-901@plc1.org keys: [2901] sites: [] +2907 1 user1-902@plc1.org keys: [2902] sites: [] +2908 1 user1-903@plc1.org keys: [2903] sites: [] +2909 1 user1-904@plc1.org keys: [2904] sites: [] +2910 1 user1-905@plc1.org keys: [2905] sites: [] +2911 1 user1-906@plc1.org keys: [2906] sites: [] +2912 1 user1-907@plc1.org keys: [2907] sites: [] +2913 1 user1-908@plc1.org keys: [2908] sites: [] +2914 1 user1-909@plc1.org keys: [2909] sites: [] +2915 1 user1-910@plc1.org keys: [2910] sites: [] +2916 1 user1-911@plc1.org keys: [2911] sites: [] +2917 1 user1-912@plc1.org keys: [2912] sites: [] +2918 1 user1-913@plc1.org keys: [2913] sites: [] +2919 1 user1-914@plc1.org keys: [2914] sites: [] +2920 1 user1-915@plc1.org keys: [2915] sites: [] +2921 1 user1-916@plc1.org keys: [2916] sites: [] +2922 1 user1-917@plc1.org keys: [2917] sites: [] +2923 1 user1-918@plc1.org keys: [2918] sites: [] +2924 1 user1-919@plc1.org keys: [2919] sites: [] +2925 1 user1-920@plc1.org keys: [2920] sites: [] +2926 1 user1-921@plc1.org keys: [2921] sites: [] +2927 1 user1-922@plc1.org keys: [2922] sites: [] +2928 1 user1-923@plc1.org keys: [2923] sites: [] +2929 1 user1-924@plc1.org keys: [2924] sites: [] +2930 1 user1-925@plc1.org keys: [2925] sites: [] +2931 1 user1-926@plc1.org keys: [2926] sites: [] +2932 1 user1-927@plc1.org keys: [2927] sites: [] +2933 1 user1-928@plc1.org keys: [2928] sites: [] +2934 1 user1-929@plc1.org keys: [2929] sites: [] +2935 1 user1-930@plc1.org keys: [2930] sites: [] +2936 1 user1-931@plc1.org keys: [2931] sites: [] +2937 1 user1-932@plc1.org keys: [2932] sites: [] +2938 1 user1-933@plc1.org keys: [2933] sites: [] +2939 1 user1-934@plc1.org keys: [2934] sites: [] +2940 1 user1-935@plc1.org keys: [2935] sites: [] +2941 1 user1-936@plc1.org keys: [2936] sites: [] +2942 1 user1-937@plc1.org keys: [2937] sites: [] +2943 1 user1-938@plc1.org keys: [2938] sites: [] +2944 1 user1-939@plc1.org keys: [2939] sites: [] +2945 1 user1-940@plc1.org keys: [2940] sites: [] +2946 1 user1-941@plc1.org keys: [2941] sites: [] +2947 1 user1-942@plc1.org keys: [2942] sites: [] +2948 1 user1-943@plc1.org keys: [2943] sites: [] +2949 1 user1-944@plc1.org keys: [2944] sites: [] +2950 1 user1-945@plc1.org keys: [2945] sites: [] +2951 1 user1-946@plc1.org keys: [2946] sites: [] +2952 1 user1-947@plc1.org keys: [2947] sites: [] +2953 1 user1-948@plc1.org keys: [2948] sites: [] +2954 1 user1-949@plc1.org keys: [2949] sites: [] +2955 1 user1-950@plc1.org keys: [2950] sites: [] +2956 1 user1-951@plc1.org keys: [2951] sites: [] +2957 1 user1-952@plc1.org keys: [2952] sites: [] +2958 1 user1-953@plc1.org keys: [2953] sites: [] +2959 1 user1-954@plc1.org keys: [2954] sites: [] +2960 1 user1-955@plc1.org keys: [2955] sites: [] +2961 1 user1-956@plc1.org keys: [2956] sites: [] +2962 1 user1-957@plc1.org keys: [2957] sites: [] +2963 1 user1-958@plc1.org keys: [2958] sites: [] +2964 1 user1-959@plc1.org keys: [2959] sites: [] +2965 1 user1-960@plc1.org keys: [2960] sites: [] +2966 1 user1-961@plc1.org keys: [2961] sites: [] +2967 1 user1-962@plc1.org keys: [2962] sites: [] +2968 1 user1-963@plc1.org keys: [2963] sites: [] +2969 1 user1-964@plc1.org keys: [2964] sites: [] +2970 1 user1-965@plc1.org keys: [2965] sites: [] +2971 1 user1-966@plc1.org keys: [2966] sites: [] +2972 1 user1-967@plc1.org keys: [2967] sites: [] +2973 1 user1-968@plc1.org keys: [2968] sites: [] +2974 1 user1-969@plc1.org keys: [2969] sites: [] +2975 1 user1-970@plc1.org keys: [2970] sites: [] +2976 1 user1-971@plc1.org keys: [2971] sites: [] +2977 1 user1-972@plc1.org keys: [2972] sites: [] +2978 1 user1-973@plc1.org keys: [2973] sites: [] +2979 1 user1-974@plc1.org keys: [2974] sites: [] +2980 1 user1-975@plc1.org keys: [2975] sites: [] +2981 1 user1-976@plc1.org keys: [2976] sites: [] +2982 1 user1-977@plc1.org keys: [2977] sites: [] +2983 1 user1-978@plc1.org keys: [2978] sites: [] +2984 1 user1-979@plc1.org keys: [2979] sites: [] +2985 1 user1-980@plc1.org keys: [2980] sites: [] +2986 1 user1-981@plc1.org keys: [2981] sites: [] +2987 1 user1-982@plc1.org keys: [2982] sites: [] +2988 1 user1-983@plc1.org keys: [2983] sites: [] +2989 1 user1-984@plc1.org keys: [2984] sites: [] +2990 1 user1-985@plc1.org keys: [2985] sites: [] +2991 1 user1-986@plc1.org keys: [2986] sites: [] +2992 1 user1-987@plc1.org keys: [2987] sites: [] +2993 1 user1-988@plc1.org keys: [2988] sites: [] +2994 1 user1-989@plc1.org keys: [2989] sites: [] +2995 1 user1-990@plc1.org keys: [2990] sites: [] +2996 1 user1-991@plc1.org keys: [2991] sites: [] +2997 1 user1-992@plc1.org keys: [2992] sites: [] +2998 1 user1-993@plc1.org keys: [2993] sites: [] +2999 1 user1-994@plc1.org keys: [2994] sites: [] +3000 1 user1-995@plc1.org keys: [2995] sites: [] +3001 1 user1-996@plc1.org keys: [2996] sites: [] +3002 1 user1-997@plc1.org keys: [2997] sites: [] +3003 1 user1-998@plc1.org keys: [2998] sites: [] +3004 1 user1-999@plc1.org keys: [2999] sites: [] +3005 1 user1-1000@plc1.org keys: [3000] sites: [] +3006 1 user1-1001@plc1.org keys: [3001] sites: [] +3007 1 user1-1002@plc1.org keys: [3002] sites: [] +3008 1 user1-1003@plc1.org keys: [3003] sites: [] +3009 1 user1-1004@plc1.org keys: [3004] sites: [] +3010 1 user1-1005@plc1.org keys: [3005] sites: [] +3011 1 user1-1006@plc1.org keys: [3006] sites: [] +3012 1 user1-1007@plc1.org keys: [3007] sites: [] +3013 1 user1-1008@plc1.org keys: [3008] sites: [] +3014 1 user1-1009@plc1.org keys: [3009] sites: [] +3015 1 user1-1010@plc1.org keys: [3010] sites: [] +3016 1 user1-1011@plc1.org keys: [3011] sites: [] +3017 1 user1-1012@plc1.org keys: [3012] sites: [] +3018 1 user1-1013@plc1.org keys: [3013] sites: [] +3019 1 user1-1014@plc1.org keys: [3014] sites: [] +3020 1 user1-1015@plc1.org keys: [3015] sites: [] +3021 1 user1-1016@plc1.org keys: [3016] sites: [] +3022 1 user1-1017@plc1.org keys: [3017] sites: [] +3023 1 user1-1018@plc1.org keys: [3018] sites: [] +3024 1 user1-1019@plc1.org keys: [3019] sites: [] +3025 1 user1-1020@plc1.org keys: [3020] sites: [] +3026 1 user1-1021@plc1.org keys: [3021] sites: [] +3027 1 user1-1022@plc1.org keys: [3022] sites: [] +3028 1 user1-1023@plc1.org keys: [3023] sites: [] +3029 1 user1-1024@plc1.org keys: [3024] sites: [] +3030 1 user1-1025@plc1.org keys: [3025] sites: [] +3031 1 user1-1026@plc1.org keys: [3026] sites: [] +3032 1 user1-1027@plc1.org keys: [3027] sites: [] +3033 1 user1-1028@plc1.org keys: [3028] sites: [] +3034 1 user1-1029@plc1.org keys: [3029] sites: [] +3035 1 user1-1030@plc1.org keys: [3030] sites: [] +3036 1 user1-1031@plc1.org keys: [3031] sites: [] +3037 1 user1-1032@plc1.org keys: [3032] sites: [] +3038 1 user1-1033@plc1.org keys: [3033] sites: [] +3039 1 user1-1034@plc1.org keys: [3034] sites: [] +3040 1 user1-1035@plc1.org keys: [3035] sites: [] +3041 1 user1-1036@plc1.org keys: [3036] sites: [] +3042 1 user1-1037@plc1.org keys: [3037] sites: [] +3043 1 user1-1038@plc1.org keys: [3038] sites: [] +3044 1 user1-1039@plc1.org keys: [3039] sites: [] +3045 1 user1-1040@plc1.org keys: [3040] sites: [] +3046 1 user1-1041@plc1.org keys: [3041] sites: [] +3047 1 user1-1042@plc1.org keys: [3042] sites: [] +3048 1 user1-1043@plc1.org keys: [3043] sites: [] +3049 1 user1-1044@plc1.org keys: [3044] sites: [] +3050 1 user1-1045@plc1.org keys: [3045] sites: [] +3051 1 user1-1046@plc1.org keys: [3046] sites: [] +3052 1 user1-1047@plc1.org keys: [3047] sites: [] +3053 1 user1-1048@plc1.org keys: [3048] sites: [] +3054 1 user1-1049@plc1.org keys: [3049] sites: [] +3055 1 user1-1050@plc1.org keys: [3050] sites: [] +3056 1 user1-1051@plc1.org keys: [3051] sites: [] +3057 1 user1-1052@plc1.org keys: [3052] sites: [] +3058 1 user1-1053@plc1.org keys: [3053] sites: [] +3059 1 user1-1054@plc1.org keys: [3054] sites: [] +3060 1 user1-1055@plc1.org keys: [3055] sites: [] +3061 1 user1-1056@plc1.org keys: [3056] sites: [] +3062 1 user1-1057@plc1.org keys: [3057] sites: [] +3063 1 user1-1058@plc1.org keys: [3058] sites: [] +3064 1 user1-1059@plc1.org keys: [3059] sites: [] +3065 1 user1-1060@plc1.org keys: [3060] sites: [] +3066 1 user1-1061@plc1.org keys: [3061] sites: [] +3067 1 user1-1062@plc1.org keys: [3062] sites: [] +3068 1 user1-1063@plc1.org keys: [3063] sites: [] +3069 1 user1-1064@plc1.org keys: [3064] sites: [] +3070 1 user1-1065@plc1.org keys: [3065] sites: [] +3071 1 user1-1066@plc1.org keys: [3066] sites: [] +3072 1 user1-1067@plc1.org keys: [3067] sites: [] +3073 1 user1-1068@plc1.org keys: [3068] sites: [] +3074 1 user1-1069@plc1.org keys: [3069] sites: [] +3075 1 user1-1070@plc1.org keys: [3070] sites: [] +3076 1 user1-1071@plc1.org keys: [3071] sites: [] +3077 1 user1-1072@plc1.org keys: [3072] sites: [] +3078 1 user1-1073@plc1.org keys: [3073] sites: [] +3079 1 user1-1074@plc1.org keys: [3074] sites: [] +3080 1 user1-1075@plc1.org keys: [3075] sites: [] +3081 1 user1-1076@plc1.org keys: [3076] sites: [] +3082 1 user1-1077@plc1.org keys: [3077] sites: [] +3083 1 user1-1078@plc1.org keys: [3078] sites: [] +3084 1 user1-1079@plc1.org keys: [3079] sites: [] +3085 1 user1-1080@plc1.org keys: [3080] sites: [] +3086 1 user1-1081@plc1.org keys: [3081] sites: [] +3087 1 user1-1082@plc1.org keys: [3082] sites: [] +3088 1 user1-1083@plc1.org keys: [3083] sites: [] +3089 1 user1-1084@plc1.org keys: [3084] sites: [] +3090 1 user1-1085@plc1.org keys: [3085] sites: [] +3091 1 user1-1086@plc1.org keys: [3086] sites: [] +3092 1 user1-1087@plc1.org keys: [3087] sites: [] +3093 1 user1-1088@plc1.org keys: [3088] sites: [] +3094 1 user1-1089@plc1.org keys: [3089] sites: [] +3095 1 user1-1090@plc1.org keys: [3090] sites: [] +3096 1 user1-1091@plc1.org keys: [3091] sites: [] +3097 1 user1-1092@plc1.org keys: [3092] sites: [] +3098 1 user1-1093@plc1.org keys: [3093] sites: [] +3099 1 user1-1094@plc1.org keys: [3094] sites: [] +3100 1 user1-1095@plc1.org keys: [3095] sites: [] +3101 1 user1-1096@plc1.org keys: [3096] sites: [] +3102 1 user1-1097@plc1.org keys: [3097] sites: [] +3103 1 user1-1098@plc1.org keys: [3098] sites: [] +3104 1 user1-1099@plc1.org keys: [3099] sites: [] +3105 1 user1-1100@plc1.org keys: [3100] sites: [] +3106 1 user1-1101@plc1.org keys: [3101] sites: [] +3107 1 user1-1102@plc1.org keys: [3102] sites: [] +3108 1 user1-1103@plc1.org keys: [3103] sites: [] +3109 1 user1-1104@plc1.org keys: [3104] sites: [] +3110 1 user1-1105@plc1.org keys: [3105] sites: [] +3111 1 user1-1106@plc1.org keys: [3106] sites: [] +3112 1 user1-1107@plc1.org keys: [3107] sites: [] +3113 1 user1-1108@plc1.org keys: [3108] sites: [] +3114 1 user1-1109@plc1.org keys: [3109] sites: [] +3115 1 user1-1110@plc1.org keys: [3110] sites: [] +3116 1 user1-1111@plc1.org keys: [3111] sites: [] +3117 1 user1-1112@plc1.org keys: [3112] sites: [] +3118 1 user1-1113@plc1.org keys: [3113] sites: [] +3119 1 user1-1114@plc1.org keys: [3114] sites: [] +3120 1 user1-1115@plc1.org keys: [3115] sites: [] +3121 1 user1-1116@plc1.org keys: [3116] sites: [] +3122 1 user1-1117@plc1.org keys: [3117] sites: [] +3123 1 user1-1118@plc1.org keys: [3118] sites: [] +3124 1 user1-1119@plc1.org keys: [3119] sites: [] +3125 1 user1-1120@plc1.org keys: [3120] sites: [] +3126 1 user1-1121@plc1.org keys: [3121] sites: [] +3127 1 user1-1122@plc1.org keys: [3122] sites: [] +3128 1 user1-1123@plc1.org keys: [3123] sites: [] +3129 1 user1-1124@plc1.org keys: [3124] sites: [] +3130 1 user1-1125@plc1.org keys: [3125] sites: [] +3131 1 user1-1126@plc1.org keys: [3126] sites: [] +3132 1 user1-1127@plc1.org keys: [3127] sites: [] +3133 1 user1-1128@plc1.org keys: [3128] sites: [] +3134 1 user1-1129@plc1.org keys: [3129] sites: [] +3135 1 user1-1130@plc1.org keys: [3130] sites: [] +3136 1 user1-1131@plc1.org keys: [3131] sites: [] +3137 1 user1-1132@plc1.org keys: [3132] sites: [] +3138 1 user1-1133@plc1.org keys: [3133] sites: [] +3139 1 user1-1134@plc1.org keys: [3134] sites: [] +3140 1 user1-1135@plc1.org keys: [3135] sites: [] +3141 1 user1-1136@plc1.org keys: [3136] sites: [] +3142 1 user1-1137@plc1.org keys: [3137] sites: [] +3143 1 user1-1138@plc1.org keys: [3138] sites: [] +3144 1 user1-1139@plc1.org keys: [3139] sites: [] +3145 1 user1-1140@plc1.org keys: [3140] sites: [] +3146 1 user1-1141@plc1.org keys: [3141] sites: [] +3147 1 user1-1142@plc1.org keys: [3142] sites: [] +3148 1 user1-1143@plc1.org keys: [3143] sites: [] +3149 1 user1-1144@plc1.org keys: [3144] sites: [] +3150 1 user1-1145@plc1.org keys: [3145] sites: [] +3151 1 user1-1146@plc1.org keys: [3146] sites: [] +3152 1 user1-1147@plc1.org keys: [3147] sites: [] +3153 1 user1-1148@plc1.org keys: [3148] sites: [] +3154 1 user1-1149@plc1.org keys: [3149] sites: [] +3155 1 user1-1150@plc1.org keys: [3150] sites: [] +3156 1 user1-1151@plc1.org keys: [3151] sites: [] +3157 1 user1-1152@plc1.org keys: [3152] sites: [] +3158 1 user1-1153@plc1.org keys: [3153] sites: [] +3159 1 user1-1154@plc1.org keys: [3154] sites: [] +3160 1 user1-1155@plc1.org keys: [3155] sites: [] +3161 1 user1-1156@plc1.org keys: [3156] sites: [] +3162 1 user1-1157@plc1.org keys: [3157] sites: [] +3163 1 user1-1158@plc1.org keys: [3158] sites: [] +3164 1 user1-1159@plc1.org keys: [3159] sites: [] +3165 1 user1-1160@plc1.org keys: [3160] sites: [] +3166 1 user1-1161@plc1.org keys: [3161] sites: [] +3167 1 user1-1162@plc1.org keys: [3162] sites: [] +3168 1 user1-1163@plc1.org keys: [3163] sites: [] +3169 1 user1-1164@plc1.org keys: [3164] sites: [] +3170 1 user1-1165@plc1.org keys: [3165] sites: [] +3171 1 user1-1166@plc1.org keys: [3166] sites: [] +3172 1 user1-1167@plc1.org keys: [3167] sites: [] +3173 1 user1-1168@plc1.org keys: [3168] sites: [] +3174 1 user1-1169@plc1.org keys: [3169] sites: [] +3175 1 user1-1170@plc1.org keys: [3170] sites: [] +3176 1 user1-1171@plc1.org keys: [3171] sites: [] +3177 1 user1-1172@plc1.org keys: [3172] sites: [] +3178 1 user1-1173@plc1.org keys: [3173] sites: [] +3179 1 user1-1174@plc1.org keys: [3174] sites: [] +3180 1 user1-1175@plc1.org keys: [3175] sites: [] +3181 1 user1-1176@plc1.org keys: [3176] sites: [] +3182 1 user1-1177@plc1.org keys: [3177] sites: [] +3183 1 user1-1178@plc1.org keys: [3178] sites: [] +3184 1 user1-1179@plc1.org keys: [3179] sites: [] +3185 1 user1-1180@plc1.org keys: [3180] sites: [] +3186 1 user1-1181@plc1.org keys: [3181] sites: [] +3187 1 user1-1182@plc1.org keys: [3182] sites: [] +3188 1 user1-1183@plc1.org keys: [3183] sites: [] +3189 1 user1-1184@plc1.org keys: [3184] sites: [] +3190 1 user1-1185@plc1.org keys: [3185] sites: [] +3191 1 user1-1186@plc1.org keys: [3186] sites: [] +3192 1 user1-1187@plc1.org keys: [3187] sites: [] +3193 1 user1-1188@plc1.org keys: [3188] sites: [] +3194 1 user1-1189@plc1.org keys: [3189] sites: [] +3195 1 user1-1190@plc1.org keys: [3190] sites: [] +3196 1 user1-1191@plc1.org keys: [3191] sites: [] +3197 1 user1-1192@plc1.org keys: [3192] sites: [] +3198 1 user1-1193@plc1.org keys: [3193] sites: [] +3199 1 user1-1194@plc1.org keys: [3194] sites: [] +3200 1 user1-1195@plc1.org keys: [3195] sites: [] +3201 1 user1-1196@plc1.org keys: [3196] sites: [] +3202 1 user1-1197@plc1.org keys: [3197] sites: [] +3203 1 user1-1198@plc1.org keys: [3198] sites: [] +3204 1 user1-1199@plc1.org keys: [3199] sites: [] +3205 1 user1-1200@plc1.org keys: [3200] sites: [] +3206 1 user1-1201@plc1.org keys: [3201] sites: [] +3207 1 user1-1202@plc1.org keys: [3202] sites: [] +3208 1 user1-1203@plc1.org keys: [3203] sites: [] +3209 1 user1-1204@plc1.org keys: [3204] sites: [] +3210 1 user1-1205@plc1.org keys: [3205] sites: [] +3211 1 user1-1206@plc1.org keys: [3206] sites: [] +3212 1 user1-1207@plc1.org keys: [3207] sites: [] +3213 1 user1-1208@plc1.org keys: [3208] sites: [] +3214 1 user1-1209@plc1.org keys: [3209] sites: [] +3215 1 user1-1210@plc1.org keys: [3210] sites: [] +3216 1 user1-1211@plc1.org keys: [3211] sites: [] +3217 1 user1-1212@plc1.org keys: [3212] sites: [] +3218 1 user1-1213@plc1.org keys: [3213] sites: [] +3219 1 user1-1214@plc1.org keys: [3214] sites: [] +3220 1 user1-1215@plc1.org keys: [3215] sites: [] +3221 1 user1-1216@plc1.org keys: [3216] sites: [] +3222 1 user1-1217@plc1.org keys: [3217] sites: [] +3223 1 user1-1218@plc1.org keys: [3218] sites: [] +3224 1 user1-1219@plc1.org keys: [3219] sites: [] +3225 1 user1-1220@plc1.org keys: [3220] sites: [] +3226 1 user1-1221@plc1.org keys: [3221] sites: [] +3227 1 user1-1222@plc1.org keys: [3222] sites: [] +3228 1 user1-1223@plc1.org keys: [3223] sites: [] +3229 1 user1-1224@plc1.org keys: [3224] sites: [] +3230 1 user1-1225@plc1.org keys: [3225] sites: [] +3231 1 user1-1226@plc1.org keys: [3226] sites: [] +3232 1 user1-1227@plc1.org keys: [3227] sites: [] +3233 1 user1-1228@plc1.org keys: [3228] sites: [] +3234 1 user1-1229@plc1.org keys: [3229] sites: [] +3235 1 user1-1230@plc1.org keys: [3230] sites: [] +3236 1 user1-1231@plc1.org keys: [3231] sites: [] +3237 1 user1-1232@plc1.org keys: [3232] sites: [] +3238 1 user1-1233@plc1.org keys: [3233] sites: [] +3239 1 user1-1234@plc1.org keys: [3234] sites: [] +3240 1 user1-1235@plc1.org keys: [3235] sites: [] +3241 1 user1-1236@plc1.org keys: [3236] sites: [] +3242 1 user1-1237@plc1.org keys: [3237] sites: [] +3243 1 user1-1238@plc1.org keys: [3238] sites: [] +3244 1 user1-1239@plc1.org keys: [3239] sites: [] +3245 1 user1-1240@plc1.org keys: [3240] sites: [] +3246 1 user1-1241@plc1.org keys: [3241] sites: [] +3247 1 user1-1242@plc1.org keys: [3242] sites: [] +3248 1 user1-1243@plc1.org keys: [3243] sites: [] +3249 1 user1-1244@plc1.org keys: [3244] sites: [] +3250 1 user1-1245@plc1.org keys: [3245] sites: [] +3251 1 user1-1246@plc1.org keys: [3246] sites: [] +3252 1 user1-1247@plc1.org keys: [3247] sites: [] +3253 1 user1-1248@plc1.org keys: [3248] sites: [] +3254 1 user1-1249@plc1.org keys: [3249] sites: [] +3255 1 user1-1250@plc1.org keys: [3250] sites: [] +3256 1 user1-1251@plc1.org keys: [3251] sites: [] +3257 1 user1-1252@plc1.org keys: [3252] sites: [] +3258 1 user1-1253@plc1.org keys: [3253] sites: [] +3259 1 user1-1254@plc1.org keys: [3254] sites: [] +3260 1 user1-1255@plc1.org keys: [3255] sites: [] +3261 1 user1-1256@plc1.org keys: [3256] sites: [] +3262 1 user1-1257@plc1.org keys: [3257] sites: [] +3263 1 user1-1258@plc1.org keys: [3258] sites: [] +3264 1 user1-1259@plc1.org keys: [3259] sites: [] +3265 1 user1-1260@plc1.org keys: [3260] sites: [] +3266 1 user1-1261@plc1.org keys: [3261] sites: [] +3267 1 user1-1262@plc1.org keys: [3262] sites: [] +3268 1 user1-1263@plc1.org keys: [3263] sites: [] +3269 1 user1-1264@plc1.org keys: [3264] sites: [] +3270 1 user1-1265@plc1.org keys: [3265] sites: [] +3271 1 user1-1266@plc1.org keys: [3266] sites: [] +3272 1 user1-1267@plc1.org keys: [3267] sites: [] +3273 1 user1-1268@plc1.org keys: [3268] sites: [] +3274 1 user1-1269@plc1.org keys: [3269] sites: [] +3275 1 user1-1270@plc1.org keys: [3270] sites: [] +3276 1 user1-1271@plc1.org keys: [3271] sites: [] +3277 1 user1-1272@plc1.org keys: [3272] sites: [] +3278 1 user1-1273@plc1.org keys: [3273] sites: [] +3279 1 user1-1274@plc1.org keys: [3274] sites: [] +3280 1 user1-1275@plc1.org keys: [3275] sites: [] +3281 1 user1-1276@plc1.org keys: [3276] sites: [] +3282 1 user1-1277@plc1.org keys: [3277] sites: [] +3283 1 user1-1278@plc1.org keys: [3278] sites: [] +3284 1 user1-1279@plc1.org keys: [3279] sites: [] +3285 1 user1-1280@plc1.org keys: [3280] sites: [] +3286 1 user1-1281@plc1.org keys: [3281] sites: [] +3287 1 user1-1282@plc1.org keys: [3282] sites: [] +3288 1 user1-1283@plc1.org keys: [3283] sites: [] +3289 1 user1-1284@plc1.org keys: [3284] sites: [] +3290 1 user1-1285@plc1.org keys: [3285] sites: [] +3291 1 user1-1286@plc1.org keys: [3286] sites: [] +3292 1 user1-1287@plc1.org keys: [3287] sites: [] +3293 1 user1-1288@plc1.org keys: [3288] sites: [] +3294 1 user1-1289@plc1.org keys: [3289] sites: [] +3295 1 user1-1290@plc1.org keys: [3290] sites: [] +3296 1 user1-1291@plc1.org keys: [3291] sites: [] +3297 1 user1-1292@plc1.org keys: [3292] sites: [] +3298 1 user1-1293@plc1.org keys: [3293] sites: [] +3299 1 user1-1294@plc1.org keys: [3294] sites: [] +3300 1 user1-1295@plc1.org keys: [3295] sites: [] +3301 1 user1-1296@plc1.org keys: [3296] sites: [] +3302 1 user1-1297@plc1.org keys: [3297] sites: [] +3303 1 user1-1298@plc1.org keys: [3298] sites: [] +3304 1 user1-1299@plc1.org keys: [3299] sites: [] +3305 1 user1-1300@plc1.org keys: [3300] sites: [] +3306 1 user1-1301@plc1.org keys: [3301] sites: [] +3307 1 user1-1302@plc1.org keys: [3302] sites: [] +3308 1 user1-1303@plc1.org keys: [3303] sites: [] +3309 1 user1-1304@plc1.org keys: [3304] sites: [] +3310 1 user1-1305@plc1.org keys: [3305] sites: [] +3311 1 user1-1306@plc1.org keys: [3306] sites: [] +3312 1 user1-1307@plc1.org keys: [3307] sites: [] +3313 1 user1-1308@plc1.org keys: [3308] sites: [] +3314 1 user1-1309@plc1.org keys: [3309] sites: [] +3315 1 user1-1310@plc1.org keys: [3310] sites: [] +3316 1 user1-1311@plc1.org keys: [3311] sites: [] +3317 1 user1-1312@plc1.org keys: [3312] sites: [] +3318 1 user1-1313@plc1.org keys: [3313] sites: [] +3319 1 user1-1314@plc1.org keys: [3314] sites: [] +3320 1 user1-1315@plc1.org keys: [3315] sites: [] +3321 1 user1-1316@plc1.org keys: [3316] sites: [] +3322 1 user1-1317@plc1.org keys: [3317] sites: [] +3323 1 user1-1318@plc1.org keys: [3318] sites: [] +3324 1 user1-1319@plc1.org keys: [3319] sites: [] +3325 1 user1-1320@plc1.org keys: [3320] sites: [] +3326 1 user1-1321@plc1.org keys: [3321] sites: [] +3327 1 user1-1322@plc1.org keys: [3322] sites: [] +3328 1 user1-1323@plc1.org keys: [3323] sites: [] +3329 1 user1-1324@plc1.org keys: [3324] sites: [] +3330 1 user1-1325@plc1.org keys: [3325] sites: [] +3331 1 user1-1326@plc1.org keys: [3326] sites: [] +3332 1 user1-1327@plc1.org keys: [3327] sites: [] +3333 1 user1-1328@plc1.org keys: [3328] sites: [] +3334 1 user1-1329@plc1.org keys: [3329] sites: [] +3335 1 user1-1330@plc1.org keys: [3330] sites: [] +3336 1 user1-1331@plc1.org keys: [3331] sites: [] +3337 1 user1-1332@plc1.org keys: [3332] sites: [] +3338 1 user1-1333@plc1.org keys: [3333] sites: [] +3339 1 user1-1334@plc1.org keys: [3334] sites: [] +3340 1 user1-1335@plc1.org keys: [3335] sites: [] +3341 1 user1-1336@plc1.org keys: [3336] sites: [] +3342 1 user1-1337@plc1.org keys: [3337] sites: [] +3343 1 user1-1338@plc1.org keys: [3338] sites: [] +3344 1 user1-1339@plc1.org keys: [3339] sites: [] +3345 1 user1-1340@plc1.org keys: [3340] sites: [] +3346 1 user1-1341@plc1.org keys: [3341] sites: [] +3347 1 user1-1342@plc1.org keys: [3342] sites: [] +3348 1 user1-1343@plc1.org keys: [3343] sites: [] +3349 1 user1-1344@plc1.org keys: [3344] sites: [] +3350 1 user1-1345@plc1.org keys: [3345] sites: [] +3351 1 user1-1346@plc1.org keys: [3346] sites: [] +3352 1 user1-1347@plc1.org keys: [3347] sites: [] +3353 1 user1-1348@plc1.org keys: [3348] sites: [] +3354 1 user1-1349@plc1.org keys: [3349] sites: [] +3355 1 user1-1350@plc1.org keys: [3350] sites: [] +3356 1 user1-1351@plc1.org keys: [3351] sites: [] +3357 1 user1-1352@plc1.org keys: [3352] sites: [] +3358 1 user1-1353@plc1.org keys: [3353] sites: [] +3359 1 user1-1354@plc1.org keys: [3354] sites: [] +3360 1 user1-1355@plc1.org keys: [3355] sites: [] +3361 1 user1-1356@plc1.org keys: [3356] sites: [] +3362 1 user1-1357@plc1.org keys: [3357] sites: [] +3363 1 user1-1358@plc1.org keys: [3358] sites: [] +3364 1 user1-1359@plc1.org keys: [3359] sites: [] +3365 1 user1-1360@plc1.org keys: [3360] sites: [] +3366 1 user1-1361@plc1.org keys: [3361] sites: [] +3367 1 user1-1362@plc1.org keys: [3362] sites: [] +3368 1 user1-1363@plc1.org keys: [3363] sites: [] +3369 1 user1-1364@plc1.org keys: [3364] sites: [] +3370 1 user1-1365@plc1.org keys: [3365] sites: [] +3371 1 user1-1366@plc1.org keys: [3366] sites: [] +3372 1 user1-1367@plc1.org keys: [3367] sites: [] +3373 1 user1-1368@plc1.org keys: [3368] sites: [] +3374 1 user1-1369@plc1.org keys: [3369] sites: [] +3375 1 user1-1370@plc1.org keys: [3370] sites: [] +3376 1 user1-1371@plc1.org keys: [3371] sites: [] +3377 1 user1-1372@plc1.org keys: [3372] sites: [] +3378 1 user1-1373@plc1.org keys: [3373] sites: [] +3379 1 user1-1374@plc1.org keys: [3374] sites: [] +3380 1 user1-1375@plc1.org keys: [3375] sites: [] +3381 1 user1-1376@plc1.org keys: [3376] sites: [] +3382 1 user1-1377@plc1.org keys: [3377] sites: [] +3383 1 user1-1378@plc1.org keys: [3378] sites: [] +3384 1 user1-1379@plc1.org keys: [3379] sites: [] +3385 1 user1-1380@plc1.org keys: [3380] sites: [] +3386 1 user1-1381@plc1.org keys: [3381] sites: [] +3387 1 user1-1382@plc1.org keys: [3382] sites: [] +3388 1 user1-1383@plc1.org keys: [3383] sites: [] +3389 1 user1-1384@plc1.org keys: [3384] sites: [] +3390 1 user1-1385@plc1.org keys: [3385] sites: [] +3391 1 user1-1386@plc1.org keys: [3386] sites: [] +3392 1 user1-1387@plc1.org keys: [3387] sites: [] +3393 1 user1-1388@plc1.org keys: [3388] sites: [] +3394 1 user1-1389@plc1.org keys: [3389] sites: [] +3395 1 user1-1390@plc1.org keys: [3390] sites: [] +3396 1 user1-1391@plc1.org keys: [3391] sites: [] +3397 1 user1-1392@plc1.org keys: [3392] sites: [] +3398 1 user1-1393@plc1.org keys: [3393] sites: [] +3399 1 user1-1394@plc1.org keys: [3394] sites: [] +3400 1 user1-1395@plc1.org keys: [3395] sites: [] +3401 1 user1-1396@plc1.org keys: [3396] sites: [] +3402 1 user1-1397@plc1.org keys: [3397] sites: [] +3403 1 user1-1398@plc1.org keys: [3398] sites: [] +3404 1 user1-1399@plc1.org keys: [3399] sites: [] +3405 1 user1-1400@plc1.org keys: [3400] sites: [] +3406 1 user1-1401@plc1.org keys: [3401] sites: [] +3407 1 user1-1402@plc1.org keys: [3402] sites: [] +3408 1 user1-1403@plc1.org keys: [3403] sites: [] +3409 1 user1-1404@plc1.org keys: [3404] sites: [] +3410 1 user1-1405@plc1.org keys: [3405] sites: [] +3411 1 user1-1406@plc1.org keys: [3406] sites: [] +3412 1 user1-1407@plc1.org keys: [3407] sites: [] +3413 1 user1-1408@plc1.org keys: [3408] sites: [] +3414 1 user1-1409@plc1.org keys: [3409] sites: [] +3415 1 user1-1410@plc1.org keys: [3410] sites: [] +3416 1 user1-1411@plc1.org keys: [3411] sites: [] +3417 1 user1-1412@plc1.org keys: [3412] sites: [] +3418 1 user1-1413@plc1.org keys: [3413] sites: [] +3419 1 user1-1414@plc1.org keys: [3414] sites: [] +3420 1 user1-1415@plc1.org keys: [3415] sites: [] +3421 1 user1-1416@plc1.org keys: [3416] sites: [] +3422 1 user1-1417@plc1.org keys: [3417] sites: [] +3423 1 user1-1418@plc1.org keys: [3418] sites: [] +3424 1 user1-1419@plc1.org keys: [3419] sites: [] +3425 1 user1-1420@plc1.org keys: [3420] sites: [] +3426 1 user1-1421@plc1.org keys: [3421] sites: [] +3427 1 user1-1422@plc1.org keys: [3422] sites: [] +3428 1 user1-1423@plc1.org keys: [3423] sites: [] +3429 1 user1-1424@plc1.org keys: [3424] sites: [] +3430 1 user1-1425@plc1.org keys: [3425] sites: [] +3431 1 user1-1426@plc1.org keys: [3426] sites: [] +3432 1 user1-1427@plc1.org keys: [3427] sites: [] +3433 1 user1-1428@plc1.org keys: [3428] sites: [] +3434 1 user1-1429@plc1.org keys: [3429] sites: [] +3435 1 user1-1430@plc1.org keys: [3430] sites: [] +3436 1 user1-1431@plc1.org keys: [3431] sites: [] +3437 1 user1-1432@plc1.org keys: [3432] sites: [] +3438 1 user1-1433@plc1.org keys: [3433] sites: [] +3439 1 user1-1434@plc1.org keys: [3434] sites: [] +3440 1 user1-1435@plc1.org keys: [3435] sites: [] +3441 1 user1-1436@plc1.org keys: [3436] sites: [] +3442 1 user1-1437@plc1.org keys: [3437] sites: [] +3443 1 user1-1438@plc1.org keys: [3438] sites: [] +3444 1 user1-1439@plc1.org keys: [3439] sites: [] +3445 1 user1-1440@plc1.org keys: [3440] sites: [] +3446 1 user1-1441@plc1.org keys: [3441] sites: [] +3447 1 user1-1442@plc1.org keys: [3442] sites: [] +3448 1 user1-1443@plc1.org keys: [3443] sites: [] +3449 1 user1-1444@plc1.org keys: [3444] sites: [] +3450 1 user1-1445@plc1.org keys: [3445] sites: [] +3451 1 user1-1446@plc1.org keys: [3446] sites: [] +3452 1 user1-1447@plc1.org keys: [3447] sites: [] +3453 1 user1-1448@plc1.org keys: [3448] sites: [] +3454 1 user1-1449@plc1.org keys: [3449] sites: [] +3455 1 user1-1450@plc1.org keys: [3450] sites: [] +3456 1 user1-1451@plc1.org keys: [3451] sites: [] +3457 1 user1-1452@plc1.org keys: [3452] sites: [] +3458 1 user1-1453@plc1.org keys: [3453] sites: [] +3459 1 user1-1454@plc1.org keys: [3454] sites: [] +3460 1 user1-1455@plc1.org keys: [3455] sites: [] +3461 1 user1-1456@plc1.org keys: [3456] sites: [] +3462 1 user1-1457@plc1.org keys: [3457] sites: [] +3463 1 user1-1458@plc1.org keys: [3458] sites: [] +3464 1 user1-1459@plc1.org keys: [3459] sites: [] +3465 1 user1-1460@plc1.org keys: [3460] sites: [] +3466 1 user1-1461@plc1.org keys: [3461] sites: [] +3467 1 user1-1462@plc1.org keys: [3462] sites: [] +3468 1 user1-1463@plc1.org keys: [3463] sites: [] +3469 1 user1-1464@plc1.org keys: [3464] sites: [] +3470 1 user1-1465@plc1.org keys: [3465] sites: [] +3471 1 user1-1466@plc1.org keys: [3466] sites: [] +3472 1 user1-1467@plc1.org keys: [3467] sites: [] +3473 1 user1-1468@plc1.org keys: [3468] sites: [] +3474 1 user1-1469@plc1.org keys: [3469] sites: [] +3475 1 user1-1470@plc1.org keys: [3470] sites: [] +3476 1 user1-1471@plc1.org keys: [3471] sites: [] +3477 1 user1-1472@plc1.org keys: [3472] sites: [] +3478 1 user1-1473@plc1.org keys: [3473] sites: [] +3479 1 user1-1474@plc1.org keys: [3474] sites: [] +3480 1 user1-1475@plc1.org keys: [3475] sites: [] +3481 1 user1-1476@plc1.org keys: [3476] sites: [] +3482 1 user1-1477@plc1.org keys: [3477] sites: [] +3483 1 user1-1478@plc1.org keys: [3478] sites: [] +3484 1 user1-1479@plc1.org keys: [3479] sites: [] +3485 1 user1-1480@plc1.org keys: [3480] sites: [] +3486 1 user1-1481@plc1.org keys: [3481] sites: [] +3487 1 user1-1482@plc1.org keys: [3482] sites: [] +3488 1 user1-1483@plc1.org keys: [3483] sites: [] +3489 1 user1-1484@plc1.org keys: [3484] sites: [] +3490 1 user1-1485@plc1.org keys: [3485] sites: [] +3491 1 user1-1486@plc1.org keys: [3486] sites: [] +3492 1 user1-1487@plc1.org keys: [3487] sites: [] +3493 1 user1-1488@plc1.org keys: [3488] sites: [] +3494 1 user1-1489@plc1.org keys: [3489] sites: [] +3495 1 user1-1490@plc1.org keys: [3490] sites: [] +3496 1 user1-1491@plc1.org keys: [3491] sites: [] +3497 1 user1-1492@plc1.org keys: [3492] sites: [] +3498 1 user1-1493@plc1.org keys: [3493] sites: [] +3499 1 user1-1494@plc1.org keys: [3494] sites: [] +3500 1 user1-1495@plc1.org keys: [3495] sites: [] +3501 1 user1-1496@plc1.org keys: [3496] sites: [] +3502 1 user1-1497@plc1.org keys: [3497] sites: [] +3503 1 user1-1498@plc1.org keys: [3498] sites: [] +3504 1 user1-1499@plc1.org keys: [3499] sites: [] +3505 1 user1-1500@plc1.org keys: [3500] sites: [] +3506 1 user1-1501@plc1.org keys: [3501] sites: [] +3507 1 user1-1502@plc1.org keys: [3502] sites: [] +3508 1 user1-1503@plc1.org keys: [3503] sites: [] +3509 1 user1-1504@plc1.org keys: [3504] sites: [] +3510 1 user1-1505@plc1.org keys: [3505] sites: [] +3511 1 user1-1506@plc1.org keys: [3506] sites: [] +3512 1 user1-1507@plc1.org keys: [3507] sites: [] +3513 1 user1-1508@plc1.org keys: [3508] sites: [] +3514 1 user1-1509@plc1.org keys: [3509] sites: [] +3515 1 user1-1510@plc1.org keys: [3510] sites: [] +3516 1 user1-1511@plc1.org keys: [3511] sites: [] +3517 1 user1-1512@plc1.org keys: [3512] sites: [] +3518 1 user1-1513@plc1.org keys: [3513] sites: [] +3519 1 user1-1514@plc1.org keys: [3514] sites: [] +3520 1 user1-1515@plc1.org keys: [3515] sites: [] +3521 1 user1-1516@plc1.org keys: [3516] sites: [] +3522 1 user1-1517@plc1.org keys: [3517] sites: [] +3523 1 user1-1518@plc1.org keys: [3518] sites: [] +3524 1 user1-1519@plc1.org keys: [3519] sites: [] +3525 1 user1-1520@plc1.org keys: [3520] sites: [] +3526 1 user1-1521@plc1.org keys: [3521] sites: [] +3527 1 user1-1522@plc1.org keys: [3522] sites: [] +3528 1 user1-1523@plc1.org keys: [3523] sites: [] +3529 1 user1-1524@plc1.org keys: [3524] sites: [] +3530 1 user1-1525@plc1.org keys: [3525] sites: [] +3531 1 user1-1526@plc1.org keys: [3526] sites: [] +3532 1 user1-1527@plc1.org keys: [3527] sites: [] +3533 1 user1-1528@plc1.org keys: [3528] sites: [] +3534 1 user1-1529@plc1.org keys: [3529] sites: [] +3535 1 user1-1530@plc1.org keys: [3530] sites: [] +3536 1 user1-1531@plc1.org keys: [3531] sites: [] +3537 1 user1-1532@plc1.org keys: [3532] sites: [] +3538 1 user1-1533@plc1.org keys: [3533] sites: [] +3539 1 user1-1534@plc1.org keys: [3534] sites: [] +3540 1 user1-1535@plc1.org keys: [3535] sites: [] +3541 1 user1-1536@plc1.org keys: [3536] sites: [] +3542 1 user1-1537@plc1.org keys: [3537] sites: [] +3543 1 user1-1538@plc1.org keys: [3538] sites: [] +3544 1 user1-1539@plc1.org keys: [3539] sites: [] +3545 1 user1-1540@plc1.org keys: [3540] sites: [] +3546 1 user1-1541@plc1.org keys: [3541] sites: [] +3547 1 user1-1542@plc1.org keys: [3542] sites: [] +3548 1 user1-1543@plc1.org keys: [3543] sites: [] +3549 1 user1-1544@plc1.org keys: [3544] sites: [] +3550 1 user1-1545@plc1.org keys: [3545] sites: [] +3551 1 user1-1546@plc1.org keys: [3546] sites: [] +3552 1 user1-1547@plc1.org keys: [3547] sites: [] +3553 1 user1-1548@plc1.org keys: [3548] sites: [] +3554 1 user1-1549@plc1.org keys: [3549] sites: [] +3555 1 user1-1550@plc1.org keys: [3550] sites: [] +3556 1 user1-1551@plc1.org keys: [3551] sites: [] +3557 1 user1-1552@plc1.org keys: [3552] sites: [] +3558 1 user1-1553@plc1.org keys: [3553] sites: [] +3559 1 user1-1554@plc1.org keys: [3554] sites: [] +3560 1 user1-1555@plc1.org keys: [3555] sites: [] +3561 1 user1-1556@plc1.org keys: [3556] sites: [] +3562 1 user1-1557@plc1.org keys: [3557] sites: [] +3563 1 user1-1558@plc1.org keys: [3558] sites: [] +3564 1 user1-1559@plc1.org keys: [3559] sites: [] +3565 1 user1-1560@plc1.org keys: [3560] sites: [] +3566 1 user1-1561@plc1.org keys: [3561] sites: [] +3567 1 user1-1562@plc1.org keys: [3562] sites: [] +3568 1 user1-1563@plc1.org keys: [3563] sites: [] +3569 1 user1-1564@plc1.org keys: [3564] sites: [] +3570 1 user1-1565@plc1.org keys: [3565] sites: [] +3571 1 user1-1566@plc1.org keys: [3566] sites: [] +3572 1 user1-1567@plc1.org keys: [3567] sites: [] +3573 1 user1-1568@plc1.org keys: [3568] sites: [] +3574 1 user1-1569@plc1.org keys: [3569] sites: [] +3575 1 user1-1570@plc1.org keys: [3570] sites: [] +3576 1 user1-1571@plc1.org keys: [3571] sites: [] +3577 1 user1-1572@plc1.org keys: [3572] sites: [] +3578 1 user1-1573@plc1.org keys: [3573] sites: [] +3579 1 user1-1574@plc1.org keys: [3574] sites: [] +3580 1 user1-1575@plc1.org keys: [3575] sites: [] +3581 1 user1-1576@plc1.org keys: [3576] sites: [] +3582 1 user1-1577@plc1.org keys: [3577] sites: [] +3583 1 user1-1578@plc1.org keys: [3578] sites: [] +3584 1 user1-1579@plc1.org keys: [3579] sites: [] +3585 1 user1-1580@plc1.org keys: [3580] sites: [] +3586 1 user1-1581@plc1.org keys: [3581] sites: [] +3587 1 user1-1582@plc1.org keys: [3582] sites: [] +3588 1 user1-1583@plc1.org keys: [3583] sites: [] +3589 1 user1-1584@plc1.org keys: [3584] sites: [] +3590 1 user1-1585@plc1.org keys: [3585] sites: [] +3591 1 user1-1586@plc1.org keys: [3586] sites: [] +3592 1 user1-1587@plc1.org keys: [3587] sites: [] +3593 1 user1-1588@plc1.org keys: [3588] sites: [] +3594 1 user1-1589@plc1.org keys: [3589] sites: [] +3595 1 user1-1590@plc1.org keys: [3590] sites: [] +3596 1 user1-1591@plc1.org keys: [3591] sites: [] +3597 1 user1-1592@plc1.org keys: [3592] sites: [] +3598 1 user1-1593@plc1.org keys: [3593] sites: [] +3599 1 user1-1594@plc1.org keys: [3594] sites: [] +3600 1 user1-1595@plc1.org keys: [3595] sites: [] +3601 1 user1-1596@plc1.org keys: [3596] sites: [] +3602 1 user1-1597@plc1.org keys: [3597] sites: [] +3603 1 user1-1598@plc1.org keys: [3598] sites: [] +3604 1 user1-1599@plc1.org keys: [3599] sites: [] +3605 1 user1-1600@plc1.org keys: [3600] sites: [] +3606 1 user1-1601@plc1.org keys: [3601] sites: [] +3607 1 user1-1602@plc1.org keys: [3602] sites: [] +3608 1 user1-1603@plc1.org keys: [3603] sites: [] +3609 1 user1-1604@plc1.org keys: [3604] sites: [] +3610 1 user1-1605@plc1.org keys: [3605] sites: [] +3611 1 user1-1606@plc1.org keys: [3606] sites: [] +3612 1 user1-1607@plc1.org keys: [3607] sites: [] +3613 1 user1-1608@plc1.org keys: [3608] sites: [] +3614 1 user1-1609@plc1.org keys: [3609] sites: [] +3615 1 user1-1610@plc1.org keys: [3610] sites: [] +3616 1 user1-1611@plc1.org keys: [3611] sites: [] +3617 1 user1-1612@plc1.org keys: [3612] sites: [] +3618 1 user1-1613@plc1.org keys: [3613] sites: [] +3619 1 user1-1614@plc1.org keys: [3614] sites: [] +3620 1 user1-1615@plc1.org keys: [3615] sites: [] +3621 1 user1-1616@plc1.org keys: [3616] sites: [] +3622 1 user1-1617@plc1.org keys: [3617] sites: [] +3623 1 user1-1618@plc1.org keys: [3618] sites: [] +3624 1 user1-1619@plc1.org keys: [3619] sites: [] +3625 1 user1-1620@plc1.org keys: [3620] sites: [] +3626 1 user1-1621@plc1.org keys: [3621] sites: [] +3627 1 user1-1622@plc1.org keys: [3622] sites: [] +3628 1 user1-1623@plc1.org keys: [3623] sites: [] +3629 1 user1-1624@plc1.org keys: [3624] sites: [] +3630 1 user1-1625@plc1.org keys: [3625] sites: [] +3631 1 user1-1626@plc1.org keys: [3626] sites: [] +3632 1 user1-1627@plc1.org keys: [3627] sites: [] +3633 1 user1-1628@plc1.org keys: [3628] sites: [] +3634 1 user1-1629@plc1.org keys: [3629] sites: [] +3635 1 user1-1630@plc1.org keys: [3630] sites: [] +3636 1 user1-1631@plc1.org keys: [3631] sites: [] +3637 1 user1-1632@plc1.org keys: [3632] sites: [] +3638 1 user1-1633@plc1.org keys: [3633] sites: [] +3639 1 user1-1634@plc1.org keys: [3634] sites: [] +3640 1 user1-1635@plc1.org keys: [3635] sites: [] +3641 1 user1-1636@plc1.org keys: [3636] sites: [] +3642 1 user1-1637@plc1.org keys: [3637] sites: [] +3643 1 user1-1638@plc1.org keys: [3638] sites: [] +3644 1 user1-1639@plc1.org keys: [3639] sites: [] +3645 1 user1-1640@plc1.org keys: [3640] sites: [] +3646 1 user1-1641@plc1.org keys: [3641] sites: [] +3647 1 user1-1642@plc1.org keys: [3642] sites: [] +3648 1 user1-1643@plc1.org keys: [3643] sites: [] +3649 1 user1-1644@plc1.org keys: [3644] sites: [] +3650 1 user1-1645@plc1.org keys: [3645] sites: [] +3651 1 user1-1646@plc1.org keys: [3646] sites: [] +3652 1 user1-1647@plc1.org keys: [3647] sites: [] +3653 1 user1-1648@plc1.org keys: [3648] sites: [] +3654 1 user1-1649@plc1.org keys: [3649] sites: [] +3655 1 user1-1650@plc1.org keys: [3650] sites: [] +3656 1 user1-1651@plc1.org keys: [3651] sites: [] +3657 1 user1-1652@plc1.org keys: [3652] sites: [] +3658 1 user1-1653@plc1.org keys: [3653] sites: [] +3659 1 user1-1654@plc1.org keys: [3654] sites: [] +3660 1 user1-1655@plc1.org keys: [3655] sites: [] +3661 1 user1-1656@plc1.org keys: [3656] sites: [] +3662 1 user1-1657@plc1.org keys: [3657] sites: [] +3663 1 user1-1658@plc1.org keys: [3658] sites: [] +3664 1 user1-1659@plc1.org keys: [3659] sites: [] +3665 1 user1-1660@plc1.org keys: [3660] sites: [] +3666 1 user1-1661@plc1.org keys: [3661] sites: [] +3667 1 user1-1662@plc1.org keys: [3662] sites: [] +3668 1 user1-1663@plc1.org keys: [3663] sites: [] +3669 1 user1-1664@plc1.org keys: [3664] sites: [] +3670 1 user1-1665@plc1.org keys: [3665] sites: [] +3671 1 user1-1666@plc1.org keys: [3666] sites: [] +3672 1 user1-1667@plc1.org keys: [3667] sites: [] +3673 1 user1-1668@plc1.org keys: [3668] sites: [] +3674 1 user1-1669@plc1.org keys: [3669] sites: [] +3675 1 user1-1670@plc1.org keys: [3670] sites: [] +3676 1 user1-1671@plc1.org keys: [3671] sites: [] +3677 1 user1-1672@plc1.org keys: [3672] sites: [] +3678 1 user1-1673@plc1.org keys: [3673] sites: [] +3679 1 user1-1674@plc1.org keys: [3674] sites: [] +3680 1 user1-1675@plc1.org keys: [3675] sites: [] +3681 1 user1-1676@plc1.org keys: [3676] sites: [] +3682 1 user1-1677@plc1.org keys: [3677] sites: [] +3683 1 user1-1678@plc1.org keys: [3678] sites: [] +3684 1 user1-1679@plc1.org keys: [3679] sites: [] +3685 1 user1-1680@plc1.org keys: [3680] sites: [] +3686 1 user1-1681@plc1.org keys: [3681] sites: [] +3687 1 user1-1682@plc1.org keys: [3682] sites: [] +3688 1 user1-1683@plc1.org keys: [3683] sites: [] +3689 1 user1-1684@plc1.org keys: [3684] sites: [] +3690 1 user1-1685@plc1.org keys: [3685] sites: [] +3691 1 user1-1686@plc1.org keys: [3686] sites: [] +3692 1 user1-1687@plc1.org keys: [3687] sites: [] +3693 1 user1-1688@plc1.org keys: [3688] sites: [] +3694 1 user1-1689@plc1.org keys: [3689] sites: [] +3695 1 user1-1690@plc1.org keys: [3690] sites: [] +3696 1 user1-1691@plc1.org keys: [3691] sites: [] +3697 1 user1-1692@plc1.org keys: [3692] sites: [] +3698 1 user1-1693@plc1.org keys: [3693] sites: [] +3699 1 user1-1694@plc1.org keys: [3694] sites: [] +3700 1 user1-1695@plc1.org keys: [3695] sites: [] +3701 1 user1-1696@plc1.org keys: [3696] sites: [] +3702 1 user1-1697@plc1.org keys: [3697] sites: [] +3703 1 user1-1698@plc1.org keys: [3698] sites: [] +3704 1 user1-1699@plc1.org keys: [3699] sites: [] +3705 1 user1-1700@plc1.org keys: [3700] sites: [] +3706 1 user1-1701@plc1.org keys: [3701] sites: [] +3707 1 user1-1702@plc1.org keys: [3702] sites: [] +3708 1 user1-1703@plc1.org keys: [3703] sites: [] +3709 1 user1-1704@plc1.org keys: [3704] sites: [] +3710 1 user1-1705@plc1.org keys: [3705] sites: [] +3711 1 user1-1706@plc1.org keys: [3706] sites: [] +3712 1 user1-1707@plc1.org keys: [3707] sites: [] +3713 1 user1-1708@plc1.org keys: [3708] sites: [] +3714 1 user1-1709@plc1.org keys: [3709] sites: [] +3715 1 user1-1710@plc1.org keys: [3710] sites: [] +3716 1 user1-1711@plc1.org keys: [3711] sites: [] +3717 1 user1-1712@plc1.org keys: [3712] sites: [] +3718 1 user1-1713@plc1.org keys: [3713] sites: [] +3719 1 user1-1714@plc1.org keys: [3714] sites: [] +3720 1 user1-1715@plc1.org keys: [3715] sites: [] +3721 1 user1-1716@plc1.org keys: [3716] sites: [] +3722 1 user1-1717@plc1.org keys: [3717] sites: [] +3723 1 user1-1718@plc1.org keys: [3718] sites: [] +3724 1 user1-1719@plc1.org keys: [3719] sites: [] +3725 1 user1-1720@plc1.org keys: [3720] sites: [] +3726 1 user1-1721@plc1.org keys: [3721] sites: [] +3727 1 user1-1722@plc1.org keys: [3722] sites: [] +3728 1 user1-1723@plc1.org keys: [3723] sites: [] +3729 1 user1-1724@plc1.org keys: [3724] sites: [] +3730 1 user1-1725@plc1.org keys: [3725] sites: [] +3731 1 user1-1726@plc1.org keys: [3726] sites: [] +3732 1 user1-1727@plc1.org keys: [3727] sites: [] +3733 1 user1-1728@plc1.org keys: [3728] sites: [] +3734 1 user1-1729@plc1.org keys: [3729] sites: [] +3735 1 user1-1730@plc1.org keys: [3730] sites: [] +3736 1 user1-1731@plc1.org keys: [3731] sites: [] +3737 1 user1-1732@plc1.org keys: [3732] sites: [] +3738 1 user1-1733@plc1.org keys: [3733] sites: [] +3739 1 user1-1734@plc1.org keys: [3734] sites: [] +3740 1 user1-1735@plc1.org keys: [3735] sites: [] +3741 1 user1-1736@plc1.org keys: [3736] sites: [] +3742 1 user1-1737@plc1.org keys: [3737] sites: [] +3743 1 user1-1738@plc1.org keys: [3738] sites: [] +3744 1 user1-1739@plc1.org keys: [3739] sites: [] +3745 1 user1-1740@plc1.org keys: [3740] sites: [] +3746 1 user1-1741@plc1.org keys: [3741] sites: [] +3747 1 user1-1742@plc1.org keys: [3742] sites: [] +3748 1 user1-1743@plc1.org keys: [3743] sites: [] +3749 1 user1-1744@plc1.org keys: [3744] sites: [] +3750 1 user1-1745@plc1.org keys: [3745] sites: [] +3751 1 user1-1746@plc1.org keys: [3746] sites: [] +3752 1 user1-1747@plc1.org keys: [3747] sites: [] +3753 1 user1-1748@plc1.org keys: [3748] sites: [] +3754 1 user1-1749@plc1.org keys: [3749] sites: [] +3755 1 user1-1750@plc1.org keys: [3750] sites: [] +3756 1 user1-1751@plc1.org keys: [3751] sites: [] +3757 1 user1-1752@plc1.org keys: [3752] sites: [] +3758 1 user1-1753@plc1.org keys: [3753] sites: [] +3759 1 user1-1754@plc1.org keys: [3754] sites: [] +3760 1 user1-1755@plc1.org keys: [3755] sites: [] +3761 1 user1-1756@plc1.org keys: [3756] sites: [] +3762 1 user1-1757@plc1.org keys: [3757] sites: [] +3763 1 user1-1758@plc1.org keys: [3758] sites: [] +3764 1 user1-1759@plc1.org keys: [3759] sites: [] +3765 1 user1-1760@plc1.org keys: [3760] sites: [] +3766 1 user1-1761@plc1.org keys: [3761] sites: [] +3767 1 user1-1762@plc1.org keys: [3762] sites: [] +3768 1 user1-1763@plc1.org keys: [3763] sites: [] +3769 1 user1-1764@plc1.org keys: [3764] sites: [] +3770 1 user1-1765@plc1.org keys: [3765] sites: [] +3771 1 user1-1766@plc1.org keys: [3766] sites: [] +3772 1 user1-1767@plc1.org keys: [3767] sites: [] +3773 1 user1-1768@plc1.org keys: [3768] sites: [] +3774 1 user1-1769@plc1.org keys: [3769] sites: [] +3775 1 user1-1770@plc1.org keys: [3770] sites: [] +3776 1 user1-1771@plc1.org keys: [3771] sites: [] +3777 1 user1-1772@plc1.org keys: [3772] sites: [] +3778 1 user1-1773@plc1.org keys: [3773] sites: [] +3779 1 user1-1774@plc1.org keys: [3774] sites: [] +3780 1 user1-1775@plc1.org keys: [3775] sites: [] +3781 1 user1-1776@plc1.org keys: [3776] sites: [] +3782 1 user1-1777@plc1.org keys: [3777] sites: [] +3783 1 user1-1778@plc1.org keys: [3778] sites: [] +3784 1 user1-1779@plc1.org keys: [3779] sites: [] +3785 1 user1-1780@plc1.org keys: [3780] sites: [] +3786 1 user1-1781@plc1.org keys: [3781] sites: [] +3787 1 user1-1782@plc1.org keys: [3782] sites: [] +3788 1 user1-1783@plc1.org keys: [3783] sites: [] +3789 1 user1-1784@plc1.org keys: [3784] sites: [] +3790 1 user1-1785@plc1.org keys: [3785] sites: [] +3791 1 user1-1786@plc1.org keys: [3786] sites: [] +3792 1 user1-1787@plc1.org keys: [3787] sites: [] +3793 1 user1-1788@plc1.org keys: [3788] sites: [] +3794 1 user1-1789@plc1.org keys: [3789] sites: [] +3795 1 user1-1790@plc1.org keys: [3790] sites: [] +3796 1 user1-1791@plc1.org keys: [3791] sites: [] +3797 1 user1-1792@plc1.org keys: [3792] sites: [] +3798 1 user1-1793@plc1.org keys: [3793] sites: [] +3799 1 user1-1794@plc1.org keys: [3794] sites: [] +3800 1 user1-1795@plc1.org keys: [3795] sites: [] +3801 1 user1-1796@plc1.org keys: [3796] sites: [] +3802 1 user1-1797@plc1.org keys: [3797] sites: [] +3803 1 user1-1798@plc1.org keys: [3798] sites: [] +3804 1 user1-1799@plc1.org keys: [3799] sites: [] +3805 1 user1-1800@plc1.org keys: [3800] sites: [] +3806 1 user1-1801@plc1.org keys: [3801] sites: [] +3807 1 user1-1802@plc1.org keys: [3802] sites: [] +3808 1 user1-1803@plc1.org keys: [3803] sites: [] +3809 1 user1-1804@plc1.org keys: [3804] sites: [] +3810 1 user1-1805@plc1.org keys: [3805] sites: [] +3811 1 user1-1806@plc1.org keys: [3806] sites: [] +3812 1 user1-1807@plc1.org keys: [3807] sites: [] +3813 1 user1-1808@plc1.org keys: [3808] sites: [] +3814 1 user1-1809@plc1.org keys: [3809] sites: [] +3815 1 user1-1810@plc1.org keys: [3810] sites: [] +3816 1 user1-1811@plc1.org keys: [3811] sites: [] +3817 1 user1-1812@plc1.org keys: [3812] sites: [] +3818 1 user1-1813@plc1.org keys: [3813] sites: [] +3819 1 user1-1814@plc1.org keys: [3814] sites: [] +3820 1 user1-1815@plc1.org keys: [3815] sites: [] +3821 1 user1-1816@plc1.org keys: [3816] sites: [] +3822 1 user1-1817@plc1.org keys: [3817] sites: [] +3823 1 user1-1818@plc1.org keys: [3818] sites: [] +3824 1 user1-1819@plc1.org keys: [3819] sites: [] +3825 1 user1-1820@plc1.org keys: [3820] sites: [] +3826 1 user1-1821@plc1.org keys: [3821] sites: [] +3827 1 user1-1822@plc1.org keys: [3822] sites: [] +3828 1 user1-1823@plc1.org keys: [3823] sites: [] +3829 1 user1-1824@plc1.org keys: [3824] sites: [] +3830 1 user1-1825@plc1.org keys: [3825] sites: [] +3831 1 user1-1826@plc1.org keys: [3826] sites: [] +3832 1 user1-1827@plc1.org keys: [3827] sites: [] +3833 1 user1-1828@plc1.org keys: [3828] sites: [] +3834 1 user1-1829@plc1.org keys: [3829] sites: [] +3835 1 user1-1830@plc1.org keys: [3830] sites: [] +3836 1 user1-1831@plc1.org keys: [3831] sites: [] +3837 1 user1-1832@plc1.org keys: [3832] sites: [] +3838 1 user1-1833@plc1.org keys: [3833] sites: [] +3839 1 user1-1834@plc1.org keys: [3834] sites: [] +3840 1 user1-1835@plc1.org keys: [3835] sites: [] +3841 1 user1-1836@plc1.org keys: [3836] sites: [] +3842 1 user1-1837@plc1.org keys: [3837] sites: [] +3843 1 user1-1838@plc1.org keys: [3838] sites: [] +3844 1 user1-1839@plc1.org keys: [3839] sites: [] +3845 1 user1-1840@plc1.org keys: [3840] sites: [] +3846 1 user1-1841@plc1.org keys: [3841] sites: [] +3847 1 user1-1842@plc1.org keys: [3842] sites: [] +3848 1 user1-1843@plc1.org keys: [3843] sites: [] +3849 1 user1-1844@plc1.org keys: [3844] sites: [] +3850 1 user1-1845@plc1.org keys: [3845] sites: [] +3851 1 user1-1846@plc1.org keys: [3846] sites: [] +3852 1 user1-1847@plc1.org keys: [3847] sites: [] +3853 1 user1-1848@plc1.org keys: [3848] sites: [] +3854 1 user1-1849@plc1.org keys: [3849] sites: [] +3855 1 user1-1850@plc1.org keys: [3850] sites: [] +3856 1 user1-1851@plc1.org keys: [3851] sites: [] +3857 1 user1-1852@plc1.org keys: [3852] sites: [] +3858 1 user1-1853@plc1.org keys: [3853] sites: [] +3859 1 user1-1854@plc1.org keys: [3854] sites: [] +3860 1 user1-1855@plc1.org keys: [3855] sites: [] +3861 1 user1-1856@plc1.org keys: [3856] sites: [] +3862 1 user1-1857@plc1.org keys: [3857] sites: [] +3863 1 user1-1858@plc1.org keys: [3858] sites: [] +3864 1 user1-1859@plc1.org keys: [3859] sites: [] +3865 1 user1-1860@plc1.org keys: [3860] sites: [] +3866 1 user1-1861@plc1.org keys: [3861] sites: [] +3867 1 user1-1862@plc1.org keys: [3862] sites: [] +3868 1 user1-1863@plc1.org keys: [3863] sites: [] +3869 1 user1-1864@plc1.org keys: [3864] sites: [] +3870 1 user1-1865@plc1.org keys: [3865] sites: [] +3871 1 user1-1866@plc1.org keys: [3866] sites: [] +3872 1 user1-1867@plc1.org keys: [3867] sites: [] +3873 1 user1-1868@plc1.org keys: [3868] sites: [] +3874 1 user1-1869@plc1.org keys: [3869] sites: [] +3875 1 user1-1870@plc1.org keys: [3870] sites: [] +3876 1 user1-1871@plc1.org keys: [3871] sites: [] +3877 1 user1-1872@plc1.org keys: [3872] sites: [] +3878 1 user1-1873@plc1.org keys: [3873] sites: [] +3879 1 user1-1874@plc1.org keys: [3874] sites: [] +3880 1 user1-1875@plc1.org keys: [3875] sites: [] +3881 1 user1-1876@plc1.org keys: [3876] sites: [] +3882 1 user1-1877@plc1.org keys: [3877] sites: [] +3883 1 user1-1878@plc1.org keys: [3878] sites: [] +3884 1 user1-1879@plc1.org keys: [3879] sites: [] +3885 1 user1-1880@plc1.org keys: [3880] sites: [] +3886 1 user1-1881@plc1.org keys: [3881] sites: [] +3887 1 user1-1882@plc1.org keys: [3882] sites: [] +3888 1 user1-1883@plc1.org keys: [3883] sites: [] +3889 1 user1-1884@plc1.org keys: [3884] sites: [] +3890 1 user1-1885@plc1.org keys: [3885] sites: [] +3891 1 user1-1886@plc1.org keys: [3886] sites: [] +3892 1 user1-1887@plc1.org keys: [3887] sites: [] +3893 1 user1-1888@plc1.org keys: [3888] sites: [] +3894 1 user1-1889@plc1.org keys: [3889] sites: [] +3895 1 user1-1890@plc1.org keys: [3890] sites: [] +3896 1 user1-1891@plc1.org keys: [3891] sites: [] +3897 1 user1-1892@plc1.org keys: [3892] sites: [] +3898 1 user1-1893@plc1.org keys: [3893] sites: [] +3899 1 user1-1894@plc1.org keys: [3894] sites: [] +3900 1 user1-1895@plc1.org keys: [3895] sites: [] +3901 1 user1-1896@plc1.org keys: [3896] sites: [] +3902 1 user1-1897@plc1.org keys: [3897] sites: [] +3903 1 user1-1898@plc1.org keys: [3898] sites: [] +3904 1 user1-1899@plc1.org keys: [3899] sites: [] +3905 1 user1-1900@plc1.org keys: [3900] sites: [] +3906 1 user1-1901@plc1.org keys: [3901] sites: [] +3907 1 user1-1902@plc1.org keys: [3902] sites: [] +3908 1 user1-1903@plc1.org keys: [3903] sites: [] +3909 1 user1-1904@plc1.org keys: [3904] sites: [] +3910 1 user1-1905@plc1.org keys: [3905] sites: [] +3911 1 user1-1906@plc1.org keys: [3906] sites: [] +3912 1 user1-1907@plc1.org keys: [3907] sites: [] +3913 1 user1-1908@plc1.org keys: [3908] sites: [] +3914 1 user1-1909@plc1.org keys: [3909] sites: [] +3915 1 user1-1910@plc1.org keys: [3910] sites: [] +3916 1 user1-1911@plc1.org keys: [3911] sites: [] +3917 1 user1-1912@plc1.org keys: [3912] sites: [] +3918 1 user1-1913@plc1.org keys: [3913] sites: [] +3919 1 user1-1914@plc1.org keys: [3914] sites: [] +3920 1 user1-1915@plc1.org keys: [3915] sites: [] +3921 1 user1-1916@plc1.org keys: [3916] sites: [] +3922 1 user1-1917@plc1.org keys: [3917] sites: [] +3923 1 user1-1918@plc1.org keys: [3918] sites: [] +3924 1 user1-1919@plc1.org keys: [3919] sites: [] +3925 1 user1-1920@plc1.org keys: [3920] sites: [] +3926 1 user1-1921@plc1.org keys: [3921] sites: [] +3927 1 user1-1922@plc1.org keys: [3922] sites: [] +3928 1 user1-1923@plc1.org keys: [3923] sites: [] +3929 1 user1-1924@plc1.org keys: [3924] sites: [] +3930 1 user1-1925@plc1.org keys: [3925] sites: [] +3931 1 user1-1926@plc1.org keys: [3926] sites: [] +3932 1 user1-1927@plc1.org keys: [3927] sites: [] +3933 1 user1-1928@plc1.org keys: [3928] sites: [] +3934 1 user1-1929@plc1.org keys: [3929] sites: [] +3935 1 user1-1930@plc1.org keys: [3930] sites: [] +3936 1 user1-1931@plc1.org keys: [3931] sites: [] +3937 1 user1-1932@plc1.org keys: [3932] sites: [] +3938 1 user1-1933@plc1.org keys: [3933] sites: [] +3939 1 user1-1934@plc1.org keys: [3934] sites: [] +3940 1 user1-1935@plc1.org keys: [3935] sites: [] +3941 1 user1-1936@plc1.org keys: [3936] sites: [] +3942 1 user1-1937@plc1.org keys: [3937] sites: [] +3943 1 user1-1938@plc1.org keys: [3938] sites: [] +3944 1 user1-1939@plc1.org keys: [3939] sites: [] +3945 1 user1-1940@plc1.org keys: [3940] sites: [] +3946 1 user1-1941@plc1.org keys: [3941] sites: [] +3947 1 user1-1942@plc1.org keys: [3942] sites: [] +3948 1 user1-1943@plc1.org keys: [3943] sites: [] +3949 1 user1-1944@plc1.org keys: [3944] sites: [] +3950 1 user1-1945@plc1.org keys: [3945] sites: [] +3951 1 user1-1946@plc1.org keys: [3946] sites: [] +3952 1 user1-1947@plc1.org keys: [3947] sites: [] +3953 1 user1-1948@plc1.org keys: [3948] sites: [] +3954 1 user1-1949@plc1.org keys: [3949] sites: [] +3955 1 user1-1950@plc1.org keys: [3950] sites: [] +3956 1 user1-1951@plc1.org keys: [3951] sites: [] +3957 1 user1-1952@plc1.org keys: [3952] sites: [] +3958 1 user1-1953@plc1.org keys: [3953] sites: [] +3959 1 user1-1954@plc1.org keys: [3954] sites: [] +3960 1 user1-1955@plc1.org keys: [3955] sites: [] +3961 1 user1-1956@plc1.org keys: [3956] sites: [] +3962 1 user1-1957@plc1.org keys: [3957] sites: [] +3963 1 user1-1958@plc1.org keys: [3958] sites: [] +3964 1 user1-1959@plc1.org keys: [3959] sites: [] +3965 1 user1-1960@plc1.org keys: [3960] sites: [] +3966 1 user1-1961@plc1.org keys: [3961] sites: [] +3967 1 user1-1962@plc1.org keys: [3962] sites: [] +3968 1 user1-1963@plc1.org keys: [3963] sites: [] +3969 1 user1-1964@plc1.org keys: [3964] sites: [] +3970 1 user1-1965@plc1.org keys: [3965] sites: [] +3971 1 user1-1966@plc1.org keys: [3966] sites: [] +3972 1 user1-1967@plc1.org keys: [3967] sites: [] +3973 1 user1-1968@plc1.org keys: [3968] sites: [] +3974 1 user1-1969@plc1.org keys: [3969] sites: [] +3975 1 user1-1970@plc1.org keys: [3970] sites: [] +3976 1 user1-1971@plc1.org keys: [3971] sites: [] +3977 1 user1-1972@plc1.org keys: [3972] sites: [] +3978 1 user1-1973@plc1.org keys: [3973] sites: [] +3979 1 user1-1974@plc1.org keys: [3974] sites: [] +3980 1 user1-1975@plc1.org keys: [3975] sites: [] +3981 1 user1-1976@plc1.org keys: [3976] sites: [] +3982 1 user1-1977@plc1.org keys: [3977] sites: [] +3983 1 user1-1978@plc1.org keys: [3978] sites: [] +3984 1 user1-1979@plc1.org keys: [3979] sites: [] +3985 1 user1-1980@plc1.org keys: [3980] sites: [] +3986 1 user1-1981@plc1.org keys: [3981] sites: [] +3987 1 user1-1982@plc1.org keys: [3982] sites: [] +3988 1 user1-1983@plc1.org keys: [3983] sites: [] +3989 1 user1-1984@plc1.org keys: [3984] sites: [] +3990 1 user1-1985@plc1.org keys: [3985] sites: [] +3991 1 user1-1986@plc1.org keys: [3986] sites: [] +3992 1 user1-1987@plc1.org keys: [3987] sites: [] +3993 1 user1-1988@plc1.org keys: [3988] sites: [] +3994 1 user1-1989@plc1.org keys: [3989] sites: [] +3995 1 user1-1990@plc1.org keys: [3990] sites: [] +3996 1 user1-1991@plc1.org keys: [3991] sites: [] +3997 1 user1-1992@plc1.org keys: [3992] sites: [] +3998 1 user1-1993@plc1.org keys: [3993] sites: [] +3999 1 user1-1994@plc1.org keys: [3994] sites: [] +4000 1 user1-1995@plc1.org keys: [3995] sites: [] +4001 1 user1-1996@plc1.org keys: [3996] sites: [] +4002 1 user1-1997@plc1.org keys: [3997] sites: [] +4003 1 user1-1998@plc1.org keys: [3998] sites: [] +4004 1 user1-1999@plc1.org keys: [3999] sites: [] +4005 1 user1-2000@plc1.org keys: [4000] sites: [] +02: NODES +1 None n2-001.plc2.org sls= [3] site= 2 +2 None n2-002.plc2.org sls= [3, 4] site= 3 +3 None n2-003.plc2.org sls= [3, 4, 5] site= 4 +4 None n2-004.plc2.org sls= [4, 5, 6] site= 5 +5 None n2-005.plc2.org sls= [5, 6, 7] site= 6 +6 None n2-006.plc2.org sls= [6, 7, 8] site= 7 +7 None n2-007.plc2.org sls= [7, 8, 9] site= 8 +8 None n2-008.plc2.org sls= [8, 9, 10] site= 9 +9 None n2-009.plc2.org sls= [9, 10, 11] site= 10 +10 None n2-010.plc2.org sls= [10, 11, 12] site= 11 +11 None n2-011.plc2.org sls= [11, 12, 13] site= 12 +12 None n2-012.plc2.org sls= [12, 13, 14] site= 13 +13 None n2-013.plc2.org sls= [13, 14, 15] site= 14 +14 None n2-014.plc2.org sls= [14, 15, 16] site= 15 +15 None n2-015.plc2.org sls= [15, 16, 17] site= 16 +16 None n2-016.plc2.org sls= [16, 17, 18] site= 17 +17 None n2-017.plc2.org sls= [17, 18, 19] site= 18 +18 None n2-018.plc2.org sls= [18, 19, 20] site= 19 +19 None n2-019.plc2.org sls= [19, 20, 21] site= 20 +20 None n2-020.plc2.org sls= [20, 21, 22] site= 21 +21 None n2-021.plc2.org sls= [21, 22, 23] site= 22 +22 None n2-022.plc2.org sls= [22, 23, 24] site= 23 +23 None n2-023.plc2.org sls= [23, 24, 25] site= 24 +24 None n2-024.plc2.org sls= [24, 25, 26] site= 25 +25 None n2-025.plc2.org sls= [25, 26, 27] site= 26 +26 None n2-026.plc2.org sls= [26, 27, 28] site= 27 +27 None n2-027.plc2.org sls= [27, 28, 29] site= 28 +28 None n2-028.plc2.org sls= [28, 29, 30] site= 29 +29 None n2-029.plc2.org sls= [29, 30, 31] site= 30 +30 None n2-030.plc2.org sls= [30, 31, 32] site= 31 +31 None n2-031.plc2.org sls= [31, 32, 33] site= 32 +32 None n2-032.plc2.org sls= [32, 33, 34] site= 33 +33 None n2-033.plc2.org sls= [33, 34, 35] site= 34 +34 None n2-034.plc2.org sls= [34, 35, 36] site= 35 +35 None n2-035.plc2.org sls= [35, 36, 37] site= 36 +36 None n2-036.plc2.org sls= [36, 37, 38] site= 37 +37 None n2-037.plc2.org sls= [37, 38, 39] site= 38 +38 None n2-038.plc2.org sls= [38, 39, 40] site= 39 +39 None n2-039.plc2.org sls= [39, 40, 41] site= 40 +40 None n2-040.plc2.org sls= [40, 41, 42] site= 41 +41 None n2-041.plc2.org sls= [41, 42, 43] site= 42 +42 None n2-042.plc2.org sls= [42, 43, 44] site= 43 +43 None n2-043.plc2.org sls= [43, 44, 45] site= 44 +44 None n2-044.plc2.org sls= [44, 45, 46] site= 45 +45 None n2-045.plc2.org sls= [45, 46, 47] site= 46 +46 None n2-046.plc2.org sls= [46, 47, 48] site= 47 +47 None n2-047.plc2.org sls= [47, 48, 49] site= 48 +48 None n2-048.plc2.org sls= [48, 49, 50] site= 49 +49 None n2-049.plc2.org sls= [49, 50, 51] site= 50 +50 None n2-050.plc2.org sls= [50, 51, 52] site= 51 +51 None n2-051.plc2.org sls= [51, 52, 53] site= 52 +52 None n2-052.plc2.org sls= [52, 53, 54] site= 53 +53 None n2-053.plc2.org sls= [53, 54, 55] site= 54 +54 None n2-054.plc2.org sls= [54, 55, 56] site= 55 +55 None n2-055.plc2.org sls= [55, 56, 57] site= 56 +56 None n2-056.plc2.org sls= [56, 57, 58] site= 57 +57 None n2-057.plc2.org sls= [57, 58, 59] site= 58 +58 None n2-058.plc2.org sls= [58, 59, 60] site= 59 +59 None n2-059.plc2.org sls= [59, 60, 61] site= 60 +60 None n2-060.plc2.org sls= [60, 61, 62] site= 61 +61 None n2-061.plc2.org sls= [61, 62, 63] site= 62 +62 None n2-062.plc2.org sls= [62, 63, 64] site= 63 +63 None n2-063.plc2.org sls= [63, 64, 65] site= 64 +64 None n2-064.plc2.org sls= [64, 65, 66] site= 65 +65 None n2-065.plc2.org sls= [65, 66, 67] site= 66 +66 None n2-066.plc2.org sls= [66, 67, 68] site= 67 +67 None n2-067.plc2.org sls= [67, 68, 69] site= 68 +68 None n2-068.plc2.org sls= [68, 69, 70] site= 69 +69 None n2-069.plc2.org sls= [69, 70, 71] site= 70 +70 None n2-070.plc2.org sls= [70, 71, 72] site= 71 +71 None n2-071.plc2.org sls= [71, 72, 73] site= 72 +72 None n2-072.plc2.org sls= [72, 73, 74] site= 73 +73 None n2-073.plc2.org sls= [73, 74, 75] site= 74 +74 None n2-074.plc2.org sls= [74, 75, 76] site= 75 +75 None n2-075.plc2.org sls= [75, 76, 77] site= 76 +76 None n2-076.plc2.org sls= [76, 77, 78] site= 77 +77 None n2-077.plc2.org sls= [77, 78, 79] site= 78 +78 None n2-078.plc2.org sls= [78, 79, 80] site= 79 +79 None n2-079.plc2.org sls= [79, 80, 81] site= 80 +80 None n2-080.plc2.org sls= [80, 81, 82] site= 81 +81 None n2-081.plc2.org sls= [81, 82, 83] site= 82 +82 None n2-082.plc2.org sls= [82, 83, 84] site= 83 +83 None n2-083.plc2.org sls= [83, 84, 85] site= 84 +84 None n2-084.plc2.org sls= [84, 85, 86] site= 85 +85 None n2-085.plc2.org sls= [85, 86, 87] site= 86 +86 None n2-086.plc2.org sls= [86, 87, 88] site= 87 +87 None n2-087.plc2.org sls= [87, 88, 89] site= 88 +88 None n2-088.plc2.org sls= [88, 89, 90] site= 89 +89 None n2-089.plc2.org sls= [89, 90, 91] site= 90 +90 None n2-090.plc2.org sls= [90, 91, 92] site= 91 +91 None n2-091.plc2.org sls= [91, 92, 93] site= 92 +92 None n2-092.plc2.org sls= [92, 93, 94] site= 93 +93 None n2-093.plc2.org sls= [93, 94, 95] site= 94 +94 None n2-094.plc2.org sls= [94, 95, 96] site= 95 +95 None n2-095.plc2.org sls= [95, 96, 97] site= 96 +96 None n2-096.plc2.org sls= [96, 97, 98] site= 97 +97 None n2-097.plc2.org sls= [97, 98, 99] site= 98 +98 None n2-098.plc2.org sls= [98, 99, 100] site= 99 +99 None n2-099.plc2.org sls= [99, 100, 101] site= 100 +100 None n2-100.plc2.org sls= [100, 101, 102] site= 101 +101 None n2-101.plc2.org sls= [101, 102, 103] site= 102 +102 None n2-102.plc2.org sls= [102, 103, 104] site= 103 +103 None n2-103.plc2.org sls= [103, 104, 105] site= 104 +104 None n2-104.plc2.org sls= [104, 105, 106] site= 105 +105 None n2-105.plc2.org sls= [105, 106, 107] site= 106 +106 None n2-106.plc2.org sls= [106, 107, 108] site= 107 +107 None n2-107.plc2.org sls= [107, 108, 109] site= 108 +108 None n2-108.plc2.org sls= [108, 109, 110] site= 109 +109 None n2-109.plc2.org sls= [109, 110, 111] site= 110 +110 None n2-110.plc2.org sls= [110, 111, 112] site= 111 +111 None n2-111.plc2.org sls= [111, 112, 113] site= 112 +112 None n2-112.plc2.org sls= [112, 113, 114] site= 113 +113 None n2-113.plc2.org sls= [113, 114, 115] site= 114 +114 None n2-114.plc2.org sls= [114, 115, 116] site= 115 +115 None n2-115.plc2.org sls= [115, 116, 117] site= 116 +116 None n2-116.plc2.org sls= [116, 117, 118] site= 117 +117 None n2-117.plc2.org sls= [117, 118, 119] site= 118 +118 None n2-118.plc2.org sls= [118, 119, 120] site= 119 +119 None n2-119.plc2.org sls= [119, 120, 121] site= 120 +120 None n2-120.plc2.org sls= [120, 121, 122] site= 121 +121 None n2-121.plc2.org sls= [121, 122, 123] site= 122 +122 None n2-122.plc2.org sls= [122, 123, 124] site= 123 +123 None n2-123.plc2.org sls= [123, 124, 125] site= 124 +124 None n2-124.plc2.org sls= [124, 125, 126] site= 125 +125 None n2-125.plc2.org sls= [125, 126, 127] site= 126 +126 None n2-126.plc2.org sls= [126, 127, 128] site= 127 +127 None n2-127.plc2.org sls= [127, 128, 129] site= 128 +128 None n2-128.plc2.org sls= [128, 129, 130] site= 129 +129 None n2-129.plc2.org sls= [129, 130, 131] site= 130 +130 None n2-130.plc2.org sls= [130, 131, 132] site= 131 +131 None n2-131.plc2.org sls= [131, 132, 133] site= 132 +132 None n2-132.plc2.org sls= [132, 133, 134] site= 133 +133 None n2-133.plc2.org sls= [133, 134, 135] site= 134 +134 None n2-134.plc2.org sls= [134, 135, 136] site= 135 +135 None n2-135.plc2.org sls= [135, 136, 137] site= 136 +136 None n2-136.plc2.org sls= [136, 137, 138] site= 137 +137 None n2-137.plc2.org sls= [137, 138, 139] site= 138 +138 None n2-138.plc2.org sls= [138, 139, 140] site= 139 +139 None n2-139.plc2.org sls= [139, 140, 141] site= 140 +140 None n2-140.plc2.org sls= [140, 141, 142] site= 141 +141 None n2-141.plc2.org sls= [141, 142, 143] site= 142 +142 None n2-142.plc2.org sls= [142, 143, 144] site= 143 +143 None n2-143.plc2.org sls= [143, 144, 145] site= 144 +144 None n2-144.plc2.org sls= [144, 145, 146] site= 145 +145 None n2-145.plc2.org sls= [145, 146, 147] site= 146 +146 None n2-146.plc2.org sls= [146, 147, 148] site= 147 +147 None n2-147.plc2.org sls= [147, 148, 149] site= 148 +148 None n2-148.plc2.org sls= [148, 149, 150] site= 149 +149 None n2-149.plc2.org sls= [149, 150, 151] site= 150 +150 None n2-150.plc2.org sls= [150, 151, 152] site= 151 +151 None n2-151.plc2.org sls= [151, 152, 153] site= 152 +152 None n2-152.plc2.org sls= [152, 153, 154] site= 153 +153 None n2-153.plc2.org sls= [153, 154, 155] site= 154 +154 None n2-154.plc2.org sls= [154, 155, 156] site= 155 +155 None n2-155.plc2.org sls= [155, 156, 157] site= 156 +156 None n2-156.plc2.org sls= [156, 157, 158] site= 157 +157 None n2-157.plc2.org sls= [157, 158, 159] site= 158 +158 None n2-158.plc2.org sls= [158, 159, 160] site= 159 +159 None n2-159.plc2.org sls= [159, 160, 161] site= 160 +160 None n2-160.plc2.org sls= [160, 161, 162] site= 161 +161 None n2-161.plc2.org sls= [161, 162, 163] site= 162 +162 None n2-162.plc2.org sls= [162, 163, 164] site= 163 +163 None n2-163.plc2.org sls= [163, 164, 165] site= 164 +164 None n2-164.plc2.org sls= [164, 165, 166] site= 165 +165 None n2-165.plc2.org sls= [165, 166, 167] site= 166 +166 None n2-166.plc2.org sls= [166, 167, 168] site= 167 +167 None n2-167.plc2.org sls= [167, 168, 169] site= 168 +168 None n2-168.plc2.org sls= [168, 169, 170] site= 169 +169 None n2-169.plc2.org sls= [169, 170, 171] site= 170 +170 None n2-170.plc2.org sls= [170, 171, 172] site= 171 +171 None n2-171.plc2.org sls= [171, 172, 173] site= 172 +172 None n2-172.plc2.org sls= [172, 173, 174] site= 173 +173 None n2-173.plc2.org sls= [173, 174, 175] site= 174 +174 None n2-174.plc2.org sls= [174, 175, 176] site= 175 +175 None n2-175.plc2.org sls= [175, 176, 177] site= 176 +176 None n2-176.plc2.org sls= [176, 177, 178] site= 177 +177 None n2-177.plc2.org sls= [177, 178, 179] site= 178 +178 None n2-178.plc2.org sls= [178, 179, 180] site= 179 +179 None n2-179.plc2.org sls= [179, 180, 181] site= 180 +180 None n2-180.plc2.org sls= [180, 181, 182] site= 181 +181 None n2-181.plc2.org sls= [181, 182, 183] site= 182 +182 None n2-182.plc2.org sls= [182, 183, 184] site= 183 +183 None n2-183.plc2.org sls= [183, 184, 185] site= 184 +184 None n2-184.plc2.org sls= [184, 185, 186] site= 185 +185 None n2-185.plc2.org sls= [185, 186, 187] site= 186 +186 None n2-186.plc2.org sls= [186, 187, 188] site= 187 +187 None n2-187.plc2.org sls= [187, 188, 189] site= 188 +188 None n2-188.plc2.org sls= [188, 189, 190] site= 189 +189 None n2-189.plc2.org sls= [189, 190, 191] site= 190 +190 None n2-190.plc2.org sls= [190, 191, 192] site= 191 +191 None n2-191.plc2.org sls= [191, 192, 193] site= 192 +192 None n2-192.plc2.org sls= [192, 193, 194] site= 193 +193 None n2-193.plc2.org sls= [193, 194, 195] site= 194 +194 None n2-194.plc2.org sls= [194, 195, 196] site= 195 +195 None n2-195.plc2.org sls= [195, 196, 197] site= 196 +196 None n2-196.plc2.org sls= [196, 197, 198] site= 197 +197 None n2-197.plc2.org sls= [197, 198, 199] site= 198 +198 None n2-198.plc2.org sls= [198, 199, 200] site= 199 +199 None n2-199.plc2.org sls= [199, 200, 201] site= 200 +200 None n2-200.plc2.org sls= [200, 201, 202] site= 201 +201 None n2-201.plc2.org sls= [201, 202, 203] site= 202 +202 None n2-202.plc2.org sls= [202, 203, 204] site= 203 +203 None n2-203.plc2.org sls= [203, 204, 205] site= 204 +204 None n2-204.plc2.org sls= [204, 205, 206] site= 205 +205 None n2-205.plc2.org sls= [205, 206, 207] site= 206 +206 None n2-206.plc2.org sls= [206, 207, 208] site= 207 +207 None n2-207.plc2.org sls= [207, 208, 209] site= 208 +208 None n2-208.plc2.org sls= [208, 209, 210] site= 209 +209 None n2-209.plc2.org sls= [209, 210, 211] site= 210 +210 None n2-210.plc2.org sls= [210, 211, 212] site= 211 +211 None n2-211.plc2.org sls= [211, 212, 213] site= 212 +212 None n2-212.plc2.org sls= [212, 213, 214] site= 213 +213 None n2-213.plc2.org sls= [213, 214, 215] site= 214 +214 None n2-214.plc2.org sls= [214, 215, 216] site= 215 +215 None n2-215.plc2.org sls= [215, 216, 217] site= 216 +216 None n2-216.plc2.org sls= [216, 217, 218] site= 217 +217 None n2-217.plc2.org sls= [217, 218, 219] site= 218 +218 None n2-218.plc2.org sls= [218, 219, 220] site= 219 +219 None n2-219.plc2.org sls= [219, 220, 221] site= 220 +220 None n2-220.plc2.org sls= [220, 221, 222] site= 221 +221 None n2-221.plc2.org sls= [221, 222, 223] site= 222 +222 None n2-222.plc2.org sls= [222, 223, 224] site= 223 +223 None n2-223.plc2.org sls= [223, 224, 225] site= 224 +224 None n2-224.plc2.org sls= [224, 225, 226] site= 225 +225 None n2-225.plc2.org sls= [225, 226, 227] site= 226 +226 None n2-226.plc2.org sls= [226, 227, 228] site= 227 +227 None n2-227.plc2.org sls= [227, 228, 229] site= 228 +228 None n2-228.plc2.org sls= [228, 229, 230] site= 229 +229 None n2-229.plc2.org sls= [229, 230, 231] site= 230 +230 None n2-230.plc2.org sls= [230, 231, 232] site= 231 +231 None n2-231.plc2.org sls= [231, 232, 233] site= 232 +232 None n2-232.plc2.org sls= [232, 233, 234] site= 233 +233 None n2-233.plc2.org sls= [233, 234, 235] site= 234 +234 None n2-234.plc2.org sls= [234, 235, 236] site= 235 +235 None n2-235.plc2.org sls= [235, 236, 237] site= 236 +236 None n2-236.plc2.org sls= [236, 237, 238] site= 237 +237 None n2-237.plc2.org sls= [237, 238, 239] site= 238 +238 None n2-238.plc2.org sls= [238, 239, 240] site= 239 +239 None n2-239.plc2.org sls= [239, 240, 241] site= 240 +240 None n2-240.plc2.org sls= [240, 241, 242] site= 241 +241 None n2-241.plc2.org sls= [241, 242, 243] site= 242 +242 None n2-242.plc2.org sls= [242, 243, 244] site= 243 +243 None n2-243.plc2.org sls= [243, 244, 245] site= 244 +244 None n2-244.plc2.org sls= [244, 245, 246] site= 245 +245 None n2-245.plc2.org sls= [245, 246, 247] site= 246 +246 None n2-246.plc2.org sls= [246, 247, 248] site= 247 +247 None n2-247.plc2.org sls= [247, 248, 249] site= 248 +248 None n2-248.plc2.org sls= [248, 249, 250] site= 249 +249 None n2-249.plc2.org sls= [249, 250, 251] site= 250 +250 None n2-250.plc2.org sls= [250, 251, 252] site= 251 +251 None n2-251.plc2.org sls= [251, 252, 253] site= 252 +252 None n2-252.plc2.org sls= [252, 253, 254] site= 253 +253 None n2-253.plc2.org sls= [253, 254, 255] site= 254 +254 None n2-254.plc2.org sls= [254, 255, 256] site= 255 +255 None n2-255.plc2.org sls= [255, 256, 257] site= 256 +256 None n2-256.plc2.org sls= [256, 257, 258] site= 257 +257 None n2-257.plc2.org sls= [257, 258, 259] site= 258 +258 None n2-258.plc2.org sls= [258, 259, 260] site= 259 +259 None n2-259.plc2.org sls= [259, 260, 261] site= 260 +260 None n2-260.plc2.org sls= [260, 261, 262] site= 261 +261 None n2-261.plc2.org sls= [261, 262, 263] site= 262 +262 None n2-262.plc2.org sls= [262, 263, 264] site= 263 +263 None n2-263.plc2.org sls= [263, 264, 265] site= 264 +264 None n2-264.plc2.org sls= [264, 265, 266] site= 265 +265 None n2-265.plc2.org sls= [265, 266, 267] site= 266 +266 None n2-266.plc2.org sls= [266, 267, 268] site= 267 +267 None n2-267.plc2.org sls= [267, 268, 269] site= 268 +268 None n2-268.plc2.org sls= [268, 269, 270] site= 269 +269 None n2-269.plc2.org sls= [269, 270, 271] site= 270 +270 None n2-270.plc2.org sls= [270, 271, 272] site= 271 +271 None n2-271.plc2.org sls= [271, 272, 273] site= 272 +272 None n2-272.plc2.org sls= [272, 273, 274] site= 273 +273 None n2-273.plc2.org sls= [273, 274, 275] site= 274 +274 None n2-274.plc2.org sls= [274, 275, 276] site= 275 +275 None n2-275.plc2.org sls= [275, 276, 277] site= 276 +276 None n2-276.plc2.org sls= [276, 277, 278] site= 277 +277 None n2-277.plc2.org sls= [277, 278, 279] site= 278 +278 None n2-278.plc2.org sls= [278, 279, 280] site= 279 +279 None n2-279.plc2.org sls= [279, 280, 281] site= 280 +280 None n2-280.plc2.org sls= [280, 281, 282] site= 281 +281 None n2-281.plc2.org sls= [281, 282, 283] site= 282 +282 None n2-282.plc2.org sls= [282, 283, 284] site= 283 +283 None n2-283.plc2.org sls= [283, 284, 285] site= 284 +284 None n2-284.plc2.org sls= [284, 285, 286] site= 285 +285 None n2-285.plc2.org sls= [285, 286, 287] site= 286 +286 None n2-286.plc2.org sls= [286, 287, 288] site= 287 +287 None n2-287.plc2.org sls= [287, 288, 289] site= 288 +288 None n2-288.plc2.org sls= [288, 289, 290] site= 289 +289 None n2-289.plc2.org sls= [289, 290, 291] site= 290 +290 None n2-290.plc2.org sls= [290, 291, 292] site= 291 +291 None n2-291.plc2.org sls= [291, 292, 293] site= 292 +292 None n2-292.plc2.org sls= [292, 293, 294] site= 293 +293 None n2-293.plc2.org sls= [293, 294, 295] site= 294 +294 None n2-294.plc2.org sls= [294, 295, 296] site= 295 +295 None n2-295.plc2.org sls= [295, 296, 297] site= 296 +296 None n2-296.plc2.org sls= [296, 297, 298] site= 297 +297 None n2-297.plc2.org sls= [297, 298, 299] site= 298 +298 None n2-298.plc2.org sls= [298, 299, 300] site= 299 +299 None n2-299.plc2.org sls= [299, 300, 301] site= 300 +300 None n2-300.plc2.org sls= [300, 301, 302] site= 301 +301 None n2-301.plc2.org sls= [301, 302, 303] site= 302 +302 None n2-302.plc2.org sls= [302, 303, 304] site= 303 +303 None n2-303.plc2.org sls= [303, 304, 305] site= 304 +304 None n2-304.plc2.org sls= [304, 305, 306] site= 305 +305 None n2-305.plc2.org sls= [305, 306, 307] site= 306 +306 None n2-306.plc2.org sls= [306, 307, 308] site= 307 +307 None n2-307.plc2.org sls= [307, 308, 309] site= 308 +308 None n2-308.plc2.org sls= [308, 309, 310] site= 309 +309 None n2-309.plc2.org sls= [309, 310, 311] site= 310 +310 None n2-310.plc2.org sls= [310, 311, 312] site= 311 +311 None n2-311.plc2.org sls= [311, 312, 313] site= 312 +312 None n2-312.plc2.org sls= [312, 313, 314] site= 313 +313 None n2-313.plc2.org sls= [313, 314, 315] site= 314 +314 None n2-314.plc2.org sls= [314, 315, 316] site= 315 +315 None n2-315.plc2.org sls= [315, 316, 317] site= 316 +316 None n2-316.plc2.org sls= [316, 317, 318] site= 317 +317 None n2-317.plc2.org sls= [317, 318, 319] site= 318 +318 None n2-318.plc2.org sls= [318, 319, 320] site= 319 +319 None n2-319.plc2.org sls= [319, 320, 321] site= 320 +320 None n2-320.plc2.org sls= [320, 321, 322] site= 321 +321 None n2-321.plc2.org sls= [321, 322, 323] site= 322 +322 None n2-322.plc2.org sls= [322, 323, 324] site= 323 +323 None n2-323.plc2.org sls= [323, 324, 325] site= 324 +324 None n2-324.plc2.org sls= [324, 325, 326] site= 325 +325 None n2-325.plc2.org sls= [325, 326, 327] site= 326 +326 None n2-326.plc2.org sls= [326, 327, 328] site= 327 +327 None n2-327.plc2.org sls= [327, 328, 329] site= 328 +328 None n2-328.plc2.org sls= [328, 329, 330] site= 329 +329 None n2-329.plc2.org sls= [329, 330, 331] site= 330 +330 None n2-330.plc2.org sls= [330, 331, 332] site= 331 +331 None n2-331.plc2.org sls= [331, 332, 333] site= 332 +332 None n2-332.plc2.org sls= [332, 333, 334] site= 333 +333 None n2-333.plc2.org sls= [333, 334, 335] site= 334 +334 None n2-334.plc2.org sls= [334, 335, 336] site= 335 +335 None n2-335.plc2.org sls= [335, 336, 337] site= 336 +336 None n2-336.plc2.org sls= [336, 337, 338] site= 337 +337 None n2-337.plc2.org sls= [337, 338, 339] site= 338 +338 None n2-338.plc2.org sls= [338, 339, 340] site= 339 +339 None n2-339.plc2.org sls= [339, 340, 341] site= 340 +340 None n2-340.plc2.org sls= [340, 341, 342] site= 341 +341 None n2-341.plc2.org sls= [341, 342, 343] site= 342 +342 None n2-342.plc2.org sls= [342, 343, 344] site= 343 +343 None n2-343.plc2.org sls= [343, 344, 345] site= 344 +344 None n2-344.plc2.org sls= [344, 345, 346] site= 345 +345 None n2-345.plc2.org sls= [345, 346, 347] site= 346 +346 None n2-346.plc2.org sls= [346, 347, 348] site= 347 +347 None n2-347.plc2.org sls= [347, 348, 349] site= 348 +348 None n2-348.plc2.org sls= [348, 349, 350] site= 349 +349 None n2-349.plc2.org sls= [349, 350, 351] site= 350 +350 None n2-350.plc2.org sls= [350, 351, 352] site= 351 +351 None n2-351.plc2.org sls= [351, 352, 353] site= 352 +352 None n2-352.plc2.org sls= [352, 353, 354] site= 353 +353 None n2-353.plc2.org sls= [353, 354, 355] site= 354 +354 None n2-354.plc2.org sls= [354, 355, 356] site= 355 +355 None n2-355.plc2.org sls= [355, 356, 357] site= 356 +356 None n2-356.plc2.org sls= [356, 357, 358] site= 357 +357 None n2-357.plc2.org sls= [357, 358, 359] site= 358 +358 None n2-358.plc2.org sls= [358, 359, 360] site= 359 +359 None n2-359.plc2.org sls= [359, 360, 361] site= 360 +360 None n2-360.plc2.org sls= [360, 361, 362] site= 361 +361 None n2-361.plc2.org sls= [361, 362, 363] site= 362 +362 None n2-362.plc2.org sls= [362, 363, 364] site= 363 +363 None n2-363.plc2.org sls= [363, 364, 365] site= 364 +364 None n2-364.plc2.org sls= [364, 365, 366] site= 365 +365 None n2-365.plc2.org sls= [365, 366, 367] site= 366 +366 None n2-366.plc2.org sls= [366, 367, 368] site= 367 +367 None n2-367.plc2.org sls= [367, 368, 369] site= 368 +368 None n2-368.plc2.org sls= [368, 369, 370] site= 369 +369 None n2-369.plc2.org sls= [369, 370, 371] site= 370 +370 None n2-370.plc2.org sls= [370, 371, 372] site= 371 +371 None n2-371.plc2.org sls= [371, 372, 373] site= 372 +372 None n2-372.plc2.org sls= [372, 373, 374] site= 373 +373 None n2-373.plc2.org sls= [373, 374, 375] site= 374 +374 None n2-374.plc2.org sls= [374, 375, 376] site= 375 +375 None n2-375.plc2.org sls= [375, 376, 377] site= 376 +376 None n2-376.plc2.org sls= [376, 377, 378] site= 377 +377 None n2-377.plc2.org sls= [377, 378, 379] site= 378 +378 None n2-378.plc2.org sls= [378, 379, 380] site= 379 +379 None n2-379.plc2.org sls= [379, 380, 381] site= 380 +380 None n2-380.plc2.org sls= [380, 381, 382] site= 381 +381 None n2-381.plc2.org sls= [381, 382, 383] site= 382 +382 None n2-382.plc2.org sls= [382, 383, 384] site= 383 +383 None n2-383.plc2.org sls= [383, 384, 385] site= 384 +384 None n2-384.plc2.org sls= [384, 385, 386] site= 385 +385 None n2-385.plc2.org sls= [385, 386, 387] site= 386 +386 None n2-386.plc2.org sls= [386, 387, 388] site= 387 +387 None n2-387.plc2.org sls= [387, 388, 389] site= 388 +388 None n2-388.plc2.org sls= [388, 389, 390] site= 389 +389 None n2-389.plc2.org sls= [389, 390, 391] site= 390 +390 None n2-390.plc2.org sls= [390, 391, 392] site= 391 +391 None n2-391.plc2.org sls= [391, 392, 393] site= 392 +392 None n2-392.plc2.org sls= [392, 393, 394] site= 393 +393 None n2-393.plc2.org sls= [393, 394, 395] site= 394 +394 None n2-394.plc2.org sls= [394, 395, 396] site= 395 +395 None n2-395.plc2.org sls= [395, 396, 397] site= 396 +396 None n2-396.plc2.org sls= [396, 397, 398] site= 397 +397 None n2-397.plc2.org sls= [397, 398, 399] site= 398 +398 None n2-398.plc2.org sls= [398, 399, 400] site= 399 +399 None n2-399.plc2.org sls= [399, 400, 401] site= 400 +400 None n2-400.plc2.org sls= [400, 401, 402] site= 401 +401 None n2-401.plc2.org sls= [401, 402, 403] site= 402 +402 None n2-402.plc2.org sls= [402, 403, 404] site= 403 +403 None n2-403.plc2.org sls= [403, 404, 405] site= 404 +404 None n2-404.plc2.org sls= [404, 405, 406] site= 405 +405 None n2-405.plc2.org sls= [405, 406, 407] site= 406 +406 None n2-406.plc2.org sls= [406, 407, 408] site= 407 +407 None n2-407.plc2.org sls= [407, 408, 409] site= 408 +408 None n2-408.plc2.org sls= [408, 409, 410] site= 409 +409 None n2-409.plc2.org sls= [409, 410, 411] site= 410 +410 None n2-410.plc2.org sls= [410, 411, 412] site= 411 +411 None n2-411.plc2.org sls= [411, 412, 413] site= 412 +412 None n2-412.plc2.org sls= [412, 413, 414] site= 413 +413 None n2-413.plc2.org sls= [413, 414, 415] site= 414 +414 None n2-414.plc2.org sls= [414, 415, 416] site= 415 +415 None n2-415.plc2.org sls= [415, 416, 417] site= 416 +416 None n2-416.plc2.org sls= [416, 417, 418] site= 417 +417 None n2-417.plc2.org sls= [417, 418, 419] site= 418 +418 None n2-418.plc2.org sls= [418, 419, 420] site= 419 +419 None n2-419.plc2.org sls= [419, 420, 421] site= 420 +420 None n2-420.plc2.org sls= [420, 421, 422] site= 421 +421 None n2-421.plc2.org sls= [421, 422, 423] site= 422 +422 None n2-422.plc2.org sls= [422, 423, 424] site= 423 +423 None n2-423.plc2.org sls= [423, 424, 425] site= 424 +424 None n2-424.plc2.org sls= [424, 425, 426] site= 425 +425 None n2-425.plc2.org sls= [425, 426, 427] site= 426 +426 None n2-426.plc2.org sls= [426, 427, 428] site= 427 +427 None n2-427.plc2.org sls= [427, 428, 429] site= 428 +428 None n2-428.plc2.org sls= [428, 429, 430] site= 429 +429 None n2-429.plc2.org sls= [429, 430, 431] site= 430 +430 None n2-430.plc2.org sls= [430, 431, 432] site= 431 +431 None n2-431.plc2.org sls= [431, 432, 433] site= 432 +432 None n2-432.plc2.org sls= [432, 433, 434] site= 433 +433 None n2-433.plc2.org sls= [433, 434, 435] site= 434 +434 None n2-434.plc2.org sls= [434, 435, 436] site= 435 +435 None n2-435.plc2.org sls= [435, 436, 437] site= 436 +436 None n2-436.plc2.org sls= [436, 437, 438] site= 437 +437 None n2-437.plc2.org sls= [437, 438, 439] site= 438 +438 None n2-438.plc2.org sls= [438, 439, 440] site= 439 +439 None n2-439.plc2.org sls= [439, 440, 441] site= 440 +440 None n2-440.plc2.org sls= [440, 441, 442] site= 441 +441 None n2-441.plc2.org sls= [441, 442, 443] site= 442 +442 None n2-442.plc2.org sls= [442, 443, 444] site= 443 +443 None n2-443.plc2.org sls= [443, 444, 445] site= 444 +444 None n2-444.plc2.org sls= [444, 445, 446] site= 445 +445 None n2-445.plc2.org sls= [445, 446, 447] site= 446 +446 None n2-446.plc2.org sls= [446, 447, 448] site= 447 +447 None n2-447.plc2.org sls= [447, 448, 449] site= 448 +448 None n2-448.plc2.org sls= [448, 449, 450] site= 449 +449 None n2-449.plc2.org sls= [449, 450, 451] site= 450 +450 None n2-450.plc2.org sls= [450, 451, 452] site= 451 +451 None n2-451.plc2.org sls= [451, 452, 453] site= 452 +452 None n2-452.plc2.org sls= [452, 453, 454] site= 453 +453 None n2-453.plc2.org sls= [453, 454, 455] site= 454 +454 None n2-454.plc2.org sls= [454, 455, 456] site= 455 +455 None n2-455.plc2.org sls= [455, 456, 457] site= 456 +456 None n2-456.plc2.org sls= [456, 457, 458] site= 457 +457 None n2-457.plc2.org sls= [457, 458, 459] site= 458 +458 None n2-458.plc2.org sls= [458, 459, 460] site= 459 +459 None n2-459.plc2.org sls= [459, 460, 461] site= 460 +460 None n2-460.plc2.org sls= [460, 461, 462] site= 461 +461 None n2-461.plc2.org sls= [461, 462, 463] site= 462 +462 None n2-462.plc2.org sls= [462, 463, 464] site= 463 +463 None n2-463.plc2.org sls= [463, 464, 465] site= 464 +464 None n2-464.plc2.org sls= [464, 465, 466] site= 465 +465 None n2-465.plc2.org sls= [465, 466, 467] site= 466 +466 None n2-466.plc2.org sls= [466, 467, 468] site= 467 +467 None n2-467.plc2.org sls= [467, 468, 469] site= 468 +468 None n2-468.plc2.org sls= [468, 469, 470] site= 469 +469 None n2-469.plc2.org sls= [469, 470, 471] site= 470 +470 None n2-470.plc2.org sls= [470, 471, 472] site= 471 +471 None n2-471.plc2.org sls= [471, 472, 473] site= 472 +472 None n2-472.plc2.org sls= [472, 473, 474] site= 473 +473 None n2-473.plc2.org sls= [473, 474, 475] site= 474 +474 None n2-474.plc2.org sls= [474, 475, 476] site= 475 +475 None n2-475.plc2.org sls= [475, 476, 477] site= 476 +476 None n2-476.plc2.org sls= [476, 477, 478] site= 477 +477 None n2-477.plc2.org sls= [477, 478, 479] site= 478 +478 None n2-478.plc2.org sls= [478, 479, 480] site= 479 +479 None n2-479.plc2.org sls= [479, 480, 481] site= 480 +480 None n2-480.plc2.org sls= [480, 481, 482] site= 481 +481 None n2-481.plc2.org sls= [481, 482, 483] site= 482 +482 None n2-482.plc2.org sls= [482, 483, 484] site= 483 +483 None n2-483.plc2.org sls= [483, 484, 485] site= 484 +484 None n2-484.plc2.org sls= [484, 485, 486] site= 485 +485 None n2-485.plc2.org sls= [485, 486, 487] site= 486 +486 None n2-486.plc2.org sls= [486, 487, 488] site= 487 +487 None n2-487.plc2.org sls= [487, 488, 489] site= 488 +488 None n2-488.plc2.org sls= [488, 489, 490] site= 489 +489 None n2-489.plc2.org sls= [489, 490, 491] site= 490 +490 None n2-490.plc2.org sls= [490, 491, 492] site= 491 +491 None n2-491.plc2.org sls= [491, 492, 493] site= 492 +492 None n2-492.plc2.org sls= [492, 493, 494] site= 493 +493 None n2-493.plc2.org sls= [493, 494, 495] site= 494 +494 None n2-494.plc2.org sls= [494, 495, 496] site= 495 +495 None n2-495.plc2.org sls= [495, 496, 497] site= 496 +496 None n2-496.plc2.org sls= [496, 497, 498] site= 497 +497 None n2-497.plc2.org sls= [497, 498, 499] site= 498 +498 None n2-498.plc2.org sls= [498, 499, 500] site= 499 +499 None n2-499.plc2.org sls= [499, 500, 501] site= 500 +500 None n2-500.plc2.org sls= [500, 501, 502] site= 501 +501 None n2-501.plc2.org sls= [501, 502, 503] site= 502 +502 None n2-502.plc2.org sls= [502, 503, 504] site= 503 +503 None n2-503.plc2.org sls= [503, 504, 505] site= 504 +504 None n2-504.plc2.org sls= [504, 505, 506] site= 505 +505 None n2-505.plc2.org sls= [505, 506, 507] site= 506 +506 None n2-506.plc2.org sls= [506, 507, 508] site= 507 +507 None n2-507.plc2.org sls= [507, 508, 509] site= 508 +508 None n2-508.plc2.org sls= [508, 509, 510] site= 509 +509 None n2-509.plc2.org sls= [509, 510, 511] site= 510 +510 None n2-510.plc2.org sls= [510, 511, 512] site= 511 +511 None n2-511.plc2.org sls= [511, 512, 513] site= 512 +512 None n2-512.plc2.org sls= [512, 513, 514] site= 513 +513 None n2-513.plc2.org sls= [513, 514, 515] site= 514 +514 None n2-514.plc2.org sls= [514, 515, 516] site= 515 +515 None n2-515.plc2.org sls= [515, 516, 517] site= 516 +516 None n2-516.plc2.org sls= [516, 517, 518] site= 517 +517 None n2-517.plc2.org sls= [517, 518, 519] site= 518 +518 None n2-518.plc2.org sls= [518, 519, 520] site= 519 +519 None n2-519.plc2.org sls= [519, 520, 521] site= 520 +520 None n2-520.plc2.org sls= [520, 521, 522] site= 521 +521 None n2-521.plc2.org sls= [521, 522, 523] site= 522 +522 None n2-522.plc2.org sls= [522, 523, 524] site= 523 +523 None n2-523.plc2.org sls= [523, 524, 525] site= 524 +524 None n2-524.plc2.org sls= [524, 525, 526] site= 525 +525 None n2-525.plc2.org sls= [525, 526, 527] site= 526 +526 None n2-526.plc2.org sls= [526, 527, 528] site= 527 +527 None n2-527.plc2.org sls= [527, 528, 529] site= 528 +528 None n2-528.plc2.org sls= [528, 529, 530] site= 529 +529 None n2-529.plc2.org sls= [529, 530, 531] site= 530 +530 None n2-530.plc2.org sls= [530, 531, 532] site= 531 +531 None n2-531.plc2.org sls= [531, 532, 533] site= 532 +532 None n2-532.plc2.org sls= [532, 533, 534] site= 533 +533 None n2-533.plc2.org sls= [533, 534, 535] site= 534 +534 None n2-534.plc2.org sls= [534, 535, 536] site= 535 +535 None n2-535.plc2.org sls= [535, 536, 537] site= 536 +536 None n2-536.plc2.org sls= [536, 537, 538] site= 537 +537 None n2-537.plc2.org sls= [537, 538, 539] site= 538 +538 None n2-538.plc2.org sls= [538, 539, 540] site= 539 +539 None n2-539.plc2.org sls= [539, 540, 541] site= 540 +540 None n2-540.plc2.org sls= [540, 541, 542] site= 541 +541 None n2-541.plc2.org sls= [541, 542, 543] site= 542 +542 None n2-542.plc2.org sls= [542, 543, 544] site= 543 +543 None n2-543.plc2.org sls= [543, 544, 545] site= 544 +544 None n2-544.plc2.org sls= [544, 545, 546] site= 545 +545 None n2-545.plc2.org sls= [545, 546, 547] site= 546 +546 None n2-546.plc2.org sls= [546, 547, 548] site= 547 +547 None n2-547.plc2.org sls= [547, 548, 549] site= 548 +548 None n2-548.plc2.org sls= [548, 549, 550] site= 549 +549 None n2-549.plc2.org sls= [549, 550, 551] site= 550 +550 None n2-550.plc2.org sls= [550, 551, 552] site= 551 +551 None n2-551.plc2.org sls= [551, 552, 553] site= 552 +552 None n2-552.plc2.org sls= [552, 553, 554] site= 553 +553 None n2-553.plc2.org sls= [553, 554, 555] site= 554 +554 None n2-554.plc2.org sls= [554, 555, 556] site= 555 +555 None n2-555.plc2.org sls= [555, 556, 557] site= 556 +556 None n2-556.plc2.org sls= [556, 557, 558] site= 557 +557 None n2-557.plc2.org sls= [557, 558, 559] site= 558 +558 None n2-558.plc2.org sls= [558, 559, 560] site= 559 +559 None n2-559.plc2.org sls= [559, 560, 561] site= 560 +560 None n2-560.plc2.org sls= [560, 561, 562] site= 561 +561 None n2-561.plc2.org sls= [561, 562, 563] site= 562 +562 None n2-562.plc2.org sls= [562, 563, 564] site= 563 +563 None n2-563.plc2.org sls= [563, 564, 565] site= 564 +564 None n2-564.plc2.org sls= [564, 565, 566] site= 565 +565 None n2-565.plc2.org sls= [565, 566, 567] site= 566 +566 None n2-566.plc2.org sls= [566, 567, 568] site= 567 +567 None n2-567.plc2.org sls= [567, 568, 569] site= 568 +568 None n2-568.plc2.org sls= [568, 569, 570] site= 569 +569 None n2-569.plc2.org sls= [569, 570, 571] site= 570 +570 None n2-570.plc2.org sls= [570, 571, 572] site= 571 +571 None n2-571.plc2.org sls= [571, 572, 573] site= 572 +572 None n2-572.plc2.org sls= [572, 573, 574] site= 573 +573 None n2-573.plc2.org sls= [573, 574, 575] site= 574 +574 None n2-574.plc2.org sls= [574, 575, 576] site= 575 +575 None n2-575.plc2.org sls= [575, 576, 577] site= 576 +576 None n2-576.plc2.org sls= [576, 577, 578] site= 577 +577 None n2-577.plc2.org sls= [577, 578, 579] site= 578 +578 None n2-578.plc2.org sls= [578, 579, 580] site= 579 +579 None n2-579.plc2.org sls= [579, 580, 581] site= 580 +580 None n2-580.plc2.org sls= [580, 581, 582] site= 581 +581 None n2-581.plc2.org sls= [581, 582, 583] site= 582 +582 None n2-582.plc2.org sls= [582, 583, 584] site= 583 +583 None n2-583.plc2.org sls= [583, 584, 585] site= 584 +584 None n2-584.plc2.org sls= [584, 585, 586] site= 585 +585 None n2-585.plc2.org sls= [585, 586, 587] site= 586 +586 None n2-586.plc2.org sls= [586, 587, 588] site= 587 +587 None n2-587.plc2.org sls= [587, 588, 589] site= 588 +588 None n2-588.plc2.org sls= [588, 589, 590] site= 589 +589 None n2-589.plc2.org sls= [589, 590, 591] site= 590 +590 None n2-590.plc2.org sls= [590, 591, 592] site= 591 +591 None n2-591.plc2.org sls= [591, 592, 593] site= 592 +592 None n2-592.plc2.org sls= [592, 593, 594] site= 593 +593 None n2-593.plc2.org sls= [593, 594, 595] site= 594 +594 None n2-594.plc2.org sls= [594, 595, 596] site= 595 +595 None n2-595.plc2.org sls= [595, 596, 597] site= 596 +596 None n2-596.plc2.org sls= [596, 597, 598] site= 597 +597 None n2-597.plc2.org sls= [597, 598, 599] site= 598 +598 None n2-598.plc2.org sls= [598, 599, 600] site= 599 +599 None n2-599.plc2.org sls= [599, 600, 601] site= 600 +600 None n2-600.plc2.org sls= [600, 601, 602] site= 601 +601 None n2-601.plc2.org sls= [601, 602, 603] site= 602 +602 None n2-602.plc2.org sls= [602, 603, 604] site= 603 +603 None n2-603.plc2.org sls= [603, 604, 605] site= 604 +604 None n2-604.plc2.org sls= [604, 605, 606] site= 605 +605 None n2-605.plc2.org sls= [605, 606, 607] site= 606 +606 None n2-606.plc2.org sls= [606, 607, 608] site= 607 +607 None n2-607.plc2.org sls= [607, 608, 609] site= 608 +608 None n2-608.plc2.org sls= [608, 609, 610] site= 609 +609 None n2-609.plc2.org sls= [609, 610, 611] site= 610 +610 None n2-610.plc2.org sls= [610, 611, 612] site= 611 +611 None n2-611.plc2.org sls= [611, 612, 613] site= 612 +612 None n2-612.plc2.org sls= [612, 613, 614] site= 613 +613 None n2-613.plc2.org sls= [613, 614, 615] site= 614 +614 None n2-614.plc2.org sls= [614, 615, 616] site= 615 +615 None n2-615.plc2.org sls= [615, 616, 617] site= 616 +616 None n2-616.plc2.org sls= [616, 617, 618] site= 617 +617 None n2-617.plc2.org sls= [617, 618, 619] site= 618 +618 None n2-618.plc2.org sls= [618, 619, 620] site= 619 +619 None n2-619.plc2.org sls= [619, 620, 621] site= 620 +620 None n2-620.plc2.org sls= [620, 621, 622] site= 621 +621 None n2-621.plc2.org sls= [621, 622, 623] site= 622 +622 None n2-622.plc2.org sls= [622, 623, 624] site= 623 +623 None n2-623.plc2.org sls= [623, 624, 625] site= 624 +624 None n2-624.plc2.org sls= [624, 625, 626] site= 625 +625 None n2-625.plc2.org sls= [625, 626, 627] site= 626 +626 None n2-626.plc2.org sls= [626, 627, 628] site= 627 +627 None n2-627.plc2.org sls= [627, 628, 629] site= 628 +628 None n2-628.plc2.org sls= [628, 629, 630] site= 629 +629 None n2-629.plc2.org sls= [629, 630, 631] site= 630 +630 None n2-630.plc2.org sls= [630, 631, 632] site= 631 +631 None n2-631.plc2.org sls= [631, 632, 633] site= 632 +632 None n2-632.plc2.org sls= [632, 633, 634] site= 633 +633 None n2-633.plc2.org sls= [633, 634, 635] site= 634 +634 None n2-634.plc2.org sls= [634, 635, 636] site= 635 +635 None n2-635.plc2.org sls= [635, 636, 637] site= 636 +636 None n2-636.plc2.org sls= [636, 637, 638] site= 637 +637 None n2-637.plc2.org sls= [637, 638, 639] site= 638 +638 None n2-638.plc2.org sls= [638, 639, 640] site= 639 +639 None n2-639.plc2.org sls= [639, 640, 641] site= 640 +640 None n2-640.plc2.org sls= [640, 641, 642] site= 641 +641 None n2-641.plc2.org sls= [641, 642, 643] site= 642 +642 None n2-642.plc2.org sls= [642, 643, 644] site= 643 +643 None n2-643.plc2.org sls= [643, 644, 645] site= 644 +644 None n2-644.plc2.org sls= [644, 645, 646] site= 645 +645 None n2-645.plc2.org sls= [645, 646, 647] site= 646 +646 None n2-646.plc2.org sls= [646, 647, 648] site= 647 +647 None n2-647.plc2.org sls= [647, 648, 649] site= 648 +648 None n2-648.plc2.org sls= [648, 649, 650] site= 649 +649 None n2-649.plc2.org sls= [649, 650, 651] site= 650 +650 None n2-650.plc2.org sls= [650, 651, 652] site= 651 +651 None n2-651.plc2.org sls= [651, 652, 653] site= 652 +652 None n2-652.plc2.org sls= [652, 653, 654] site= 653 +653 None n2-653.plc2.org sls= [653, 654, 655] site= 654 +654 None n2-654.plc2.org sls= [654, 655, 656] site= 655 +655 None n2-655.plc2.org sls= [655, 656, 657] site= 656 +656 None n2-656.plc2.org sls= [656, 657, 658] site= 657 +657 None n2-657.plc2.org sls= [657, 658, 659] site= 658 +658 None n2-658.plc2.org sls= [658, 659, 660] site= 659 +659 None n2-659.plc2.org sls= [659, 660, 661] site= 660 +660 None n2-660.plc2.org sls= [660, 661, 662] site= 661 +661 None n2-661.plc2.org sls= [661, 662, 663] site= 662 +662 None n2-662.plc2.org sls= [662, 663, 664] site= 663 +663 None n2-663.plc2.org sls= [663, 664, 665] site= 664 +664 None n2-664.plc2.org sls= [664, 665, 666] site= 665 +665 None n2-665.plc2.org sls= [665, 666, 667] site= 666 +666 None n2-666.plc2.org sls= [666, 667, 668] site= 667 +667 None n2-667.plc2.org sls= [667, 668, 669] site= 668 +668 None n2-668.plc2.org sls= [668, 669, 670] site= 669 +669 None n2-669.plc2.org sls= [669, 670, 671] site= 670 +670 None n2-670.plc2.org sls= [670, 671, 672] site= 671 +671 None n2-671.plc2.org sls= [671, 672, 673] site= 672 +672 None n2-672.plc2.org sls= [672, 673, 674] site= 673 +673 None n2-673.plc2.org sls= [673, 674, 675] site= 674 +674 None n2-674.plc2.org sls= [674, 675, 676] site= 675 +675 None n2-675.plc2.org sls= [675, 676, 677] site= 676 +676 None n2-676.plc2.org sls= [676, 677, 678] site= 677 +677 None n2-677.plc2.org sls= [677, 678, 679] site= 678 +678 None n2-678.plc2.org sls= [678, 679, 680] site= 679 +679 None n2-679.plc2.org sls= [679, 680, 681] site= 680 +680 None n2-680.plc2.org sls= [680, 681, 682] site= 681 +681 None n2-681.plc2.org sls= [681, 682, 683] site= 682 +682 None n2-682.plc2.org sls= [682, 683, 684] site= 683 +683 None n2-683.plc2.org sls= [683, 684, 685] site= 684 +684 None n2-684.plc2.org sls= [684, 685, 686] site= 685 +685 None n2-685.plc2.org sls= [685, 686, 687] site= 686 +686 None n2-686.plc2.org sls= [686, 687, 688] site= 687 +687 None n2-687.plc2.org sls= [687, 688, 689] site= 688 +688 None n2-688.plc2.org sls= [688, 689, 690] site= 689 +689 None n2-689.plc2.org sls= [689, 690, 691] site= 690 +690 None n2-690.plc2.org sls= [690, 691, 692] site= 691 +691 None n2-691.plc2.org sls= [691, 692, 693] site= 692 +692 None n2-692.plc2.org sls= [692, 693, 694] site= 693 +693 None n2-693.plc2.org sls= [693, 694, 695] site= 694 +694 None n2-694.plc2.org sls= [694, 695, 696] site= 695 +695 None n2-695.plc2.org sls= [695, 696, 697] site= 696 +696 None n2-696.plc2.org sls= [696, 697, 698] site= 697 +697 None n2-697.plc2.org sls= [697, 698, 699] site= 698 +698 None n2-698.plc2.org sls= [698, 699, 700] site= 699 +699 None n2-699.plc2.org sls= [699, 700, 701] site= 700 +700 None n2-700.plc2.org sls= [700, 701, 702] site= 701 +701 None n2-701.plc2.org sls= [701, 702, 703] site= 702 +702 None n2-702.plc2.org sls= [702, 703, 704] site= 703 +703 None n2-703.plc2.org sls= [703, 704, 705] site= 704 +704 None n2-704.plc2.org sls= [704, 705, 706] site= 705 +705 None n2-705.plc2.org sls= [705, 706, 707] site= 706 +706 None n2-706.plc2.org sls= [706, 707, 708] site= 707 +707 None n2-707.plc2.org sls= [707, 708, 709] site= 708 +708 None n2-708.plc2.org sls= [708, 709, 710] site= 709 +709 None n2-709.plc2.org sls= [709, 710, 711] site= 710 +710 None n2-710.plc2.org sls= [710, 711, 712] site= 711 +711 None n2-711.plc2.org sls= [711, 712, 713] site= 712 +712 None n2-712.plc2.org sls= [712, 713, 714] site= 713 +713 None n2-713.plc2.org sls= [713, 714, 715] site= 714 +714 None n2-714.plc2.org sls= [714, 715, 716] site= 715 +715 None n2-715.plc2.org sls= [715, 716, 717] site= 716 +716 None n2-716.plc2.org sls= [716, 717, 718] site= 717 +717 None n2-717.plc2.org sls= [717, 718, 719] site= 718 +718 None n2-718.plc2.org sls= [718, 719, 720] site= 719 +719 None n2-719.plc2.org sls= [719, 720, 721] site= 720 +720 None n2-720.plc2.org sls= [720, 721, 722] site= 721 +721 None n2-721.plc2.org sls= [721, 722, 723] site= 722 +722 None n2-722.plc2.org sls= [722, 723, 724] site= 723 +723 None n2-723.plc2.org sls= [723, 724, 725] site= 724 +724 None n2-724.plc2.org sls= [724, 725, 726] site= 725 +725 None n2-725.plc2.org sls= [725, 726, 727] site= 726 +726 None n2-726.plc2.org sls= [726, 727, 728] site= 727 +727 None n2-727.plc2.org sls= [727, 728, 729] site= 728 +728 None n2-728.plc2.org sls= [728, 729, 730] site= 729 +729 None n2-729.plc2.org sls= [729, 730, 731] site= 730 +730 None n2-730.plc2.org sls= [730, 731, 732] site= 731 +731 None n2-731.plc2.org sls= [731, 732, 733] site= 732 +732 None n2-732.plc2.org sls= [732, 733, 734] site= 733 +733 None n2-733.plc2.org sls= [733, 734, 735] site= 734 +734 None n2-734.plc2.org sls= [734, 735, 736] site= 735 +735 None n2-735.plc2.org sls= [735, 736, 737] site= 736 +736 None n2-736.plc2.org sls= [736, 737, 738] site= 737 +737 None n2-737.plc2.org sls= [737, 738, 739] site= 738 +738 None n2-738.plc2.org sls= [738, 739, 740] site= 739 +739 None n2-739.plc2.org sls= [739, 740, 741] site= 740 +740 None n2-740.plc2.org sls= [740, 741, 742] site= 741 +741 None n2-741.plc2.org sls= [741, 742, 743] site= 742 +742 None n2-742.plc2.org sls= [742, 743, 744] site= 743 +743 None n2-743.plc2.org sls= [743, 744, 745] site= 744 +744 None n2-744.plc2.org sls= [744, 745, 746] site= 745 +745 None n2-745.plc2.org sls= [745, 746, 747] site= 746 +746 None n2-746.plc2.org sls= [746, 747, 748] site= 747 +747 None n2-747.plc2.org sls= [747, 748, 749] site= 748 +748 None n2-748.plc2.org sls= [748, 749, 750] site= 749 +749 None n2-749.plc2.org sls= [749, 750, 751] site= 750 +750 None n2-750.plc2.org sls= [750, 751, 752] site= 751 +751 None n2-751.plc2.org sls= [751, 752, 753] site= 752 +752 None n2-752.plc2.org sls= [752, 753, 754] site= 753 +753 None n2-753.plc2.org sls= [753, 754, 755] site= 754 +754 None n2-754.plc2.org sls= [754, 755, 756] site= 755 +755 None n2-755.plc2.org sls= [755, 756, 757] site= 756 +756 None n2-756.plc2.org sls= [756, 757, 758] site= 757 +757 None n2-757.plc2.org sls= [757, 758, 759] site= 758 +758 None n2-758.plc2.org sls= [758, 759, 760] site= 759 +759 None n2-759.plc2.org sls= [759, 760, 761] site= 760 +760 None n2-760.plc2.org sls= [760, 761, 762] site= 761 +761 None n2-761.plc2.org sls= [761, 762, 763] site= 762 +762 None n2-762.plc2.org sls= [762, 763, 764] site= 763 +763 None n2-763.plc2.org sls= [763, 764, 765] site= 764 +764 None n2-764.plc2.org sls= [764, 765, 766] site= 765 +765 None n2-765.plc2.org sls= [765, 766, 767] site= 766 +766 None n2-766.plc2.org sls= [766, 767, 768] site= 767 +767 None n2-767.plc2.org sls= [767, 768, 769] site= 768 +768 None n2-768.plc2.org sls= [768, 769, 770] site= 769 +769 None n2-769.plc2.org sls= [769, 770, 771] site= 770 +770 None n2-770.plc2.org sls= [770, 771, 772] site= 771 +771 None n2-771.plc2.org sls= [771, 772, 773] site= 772 +772 None n2-772.plc2.org sls= [772, 773, 774] site= 773 +773 None n2-773.plc2.org sls= [773, 774, 775] site= 774 +774 None n2-774.plc2.org sls= [774, 775, 776] site= 775 +775 None n2-775.plc2.org sls= [775, 776, 777] site= 776 +776 None n2-776.plc2.org sls= [776, 777, 778] site= 777 +777 None n2-777.plc2.org sls= [777, 778, 779] site= 778 +778 None n2-778.plc2.org sls= [778, 779, 780] site= 779 +779 None n2-779.plc2.org sls= [779, 780, 781] site= 780 +780 None n2-780.plc2.org sls= [780, 781, 782] site= 781 +781 None n2-781.plc2.org sls= [781, 782, 783] site= 782 +782 None n2-782.plc2.org sls= [782, 783, 784] site= 783 +783 None n2-783.plc2.org sls= [783, 784, 785] site= 784 +784 None n2-784.plc2.org sls= [784, 785, 786] site= 785 +785 None n2-785.plc2.org sls= [785, 786, 787] site= 786 +786 None n2-786.plc2.org sls= [786, 787, 788] site= 787 +787 None n2-787.plc2.org sls= [787, 788, 789] site= 788 +788 None n2-788.plc2.org sls= [788, 789, 790] site= 789 +789 None n2-789.plc2.org sls= [789, 790, 791] site= 790 +790 None n2-790.plc2.org sls= [790, 791, 792] site= 791 +791 None n2-791.plc2.org sls= [791, 792, 793] site= 792 +792 None n2-792.plc2.org sls= [792, 793, 794] site= 793 +793 None n2-793.plc2.org sls= [793, 794, 795] site= 794 +794 None n2-794.plc2.org sls= [794, 795, 796] site= 795 +795 None n2-795.plc2.org sls= [795, 796, 797] site= 796 +796 None n2-796.plc2.org sls= [796, 797, 798] site= 797 +797 None n2-797.plc2.org sls= [797, 798, 799] site= 798 +798 None n2-798.plc2.org sls= [798, 799, 800] site= 799 +799 None n2-799.plc2.org sls= [799, 800, 801] site= 800 +800 None n2-800.plc2.org sls= [800, 801, 802] site= 801 +801 None n2-801.plc2.org sls= [801, 802, 803] site= 802 +802 None n2-802.plc2.org sls= [802, 803, 804] site= 803 +803 None n2-803.plc2.org sls= [803, 804, 805] site= 804 +804 None n2-804.plc2.org sls= [804, 805, 806] site= 805 +805 None n2-805.plc2.org sls= [805, 806, 807] site= 806 +806 None n2-806.plc2.org sls= [806, 807, 808] site= 807 +807 None n2-807.plc2.org sls= [807, 808, 809] site= 808 +808 None n2-808.plc2.org sls= [808, 809, 810] site= 809 +809 None n2-809.plc2.org sls= [809, 810, 811] site= 810 +810 None n2-810.plc2.org sls= [810, 811, 812] site= 811 +811 None n2-811.plc2.org sls= [811, 812, 813] site= 812 +812 None n2-812.plc2.org sls= [812, 813, 814] site= 813 +813 None n2-813.plc2.org sls= [813, 814, 815] site= 814 +814 None n2-814.plc2.org sls= [814, 815, 816] site= 815 +815 None n2-815.plc2.org sls= [815, 816, 817] site= 816 +816 None n2-816.plc2.org sls= [816, 817, 818] site= 817 +817 None n2-817.plc2.org sls= [817, 818, 819] site= 818 +818 None n2-818.plc2.org sls= [818, 819, 820] site= 819 +819 None n2-819.plc2.org sls= [819, 820, 821] site= 820 +820 None n2-820.plc2.org sls= [820, 821, 822] site= 821 +821 None n2-821.plc2.org sls= [821, 822, 823] site= 822 +822 None n2-822.plc2.org sls= [822, 823, 824] site= 823 +823 None n2-823.plc2.org sls= [823, 824, 825] site= 824 +824 None n2-824.plc2.org sls= [824, 825, 826] site= 825 +825 None n2-825.plc2.org sls= [825, 826, 827] site= 826 +826 None n2-826.plc2.org sls= [826, 827, 828] site= 827 +827 None n2-827.plc2.org sls= [827, 828, 829] site= 828 +828 None n2-828.plc2.org sls= [828, 829, 830] site= 829 +829 None n2-829.plc2.org sls= [829, 830, 831] site= 830 +830 None n2-830.plc2.org sls= [830, 831, 832] site= 831 +831 None n2-831.plc2.org sls= [831, 832, 833] site= 832 +832 None n2-832.plc2.org sls= [832, 833, 834] site= 833 +833 None n2-833.plc2.org sls= [833, 834, 835] site= 834 +834 None n2-834.plc2.org sls= [834, 835, 836] site= 835 +835 None n2-835.plc2.org sls= [835, 836, 837] site= 836 +836 None n2-836.plc2.org sls= [836, 837, 838] site= 837 +837 None n2-837.plc2.org sls= [837, 838, 839] site= 838 +838 None n2-838.plc2.org sls= [838, 839, 840] site= 839 +839 None n2-839.plc2.org sls= [839, 840, 841] site= 840 +840 None n2-840.plc2.org sls= [840, 841, 842] site= 841 +841 None n2-841.plc2.org sls= [841, 842, 843] site= 842 +842 None n2-842.plc2.org sls= [842, 843, 844] site= 843 +843 None n2-843.plc2.org sls= [843, 844, 845] site= 844 +844 None n2-844.plc2.org sls= [844, 845, 846] site= 845 +845 None n2-845.plc2.org sls= [845, 846, 847] site= 846 +846 None n2-846.plc2.org sls= [846, 847, 848] site= 847 +847 None n2-847.plc2.org sls= [847, 848, 849] site= 848 +848 None n2-848.plc2.org sls= [848, 849, 850] site= 849 +849 None n2-849.plc2.org sls= [849, 850, 851] site= 850 +850 None n2-850.plc2.org sls= [850, 851, 852] site= 851 +851 None n2-851.plc2.org sls= [851, 852, 853] site= 852 +852 None n2-852.plc2.org sls= [852, 853, 854] site= 853 +853 None n2-853.plc2.org sls= [853, 854, 855] site= 854 +854 None n2-854.plc2.org sls= [854, 855, 856] site= 855 +855 None n2-855.plc2.org sls= [855, 856, 857] site= 856 +856 None n2-856.plc2.org sls= [856, 857, 858] site= 857 +857 None n2-857.plc2.org sls= [857, 858, 859] site= 858 +858 None n2-858.plc2.org sls= [858, 859, 860] site= 859 +859 None n2-859.plc2.org sls= [859, 860, 861] site= 860 +860 None n2-860.plc2.org sls= [860, 861, 862] site= 861 +861 None n2-861.plc2.org sls= [861, 862, 863] site= 862 +862 None n2-862.plc2.org sls= [862, 863, 864] site= 863 +863 None n2-863.plc2.org sls= [863, 864, 865] site= 864 +864 None n2-864.plc2.org sls= [864, 865, 866] site= 865 +865 None n2-865.plc2.org sls= [865, 866, 867] site= 866 +866 None n2-866.plc2.org sls= [866, 867, 868] site= 867 +867 None n2-867.plc2.org sls= [867, 868, 869] site= 868 +868 None n2-868.plc2.org sls= [868, 869, 870] site= 869 +869 None n2-869.plc2.org sls= [869, 870, 871] site= 870 +870 None n2-870.plc2.org sls= [870, 871, 872] site= 871 +871 None n2-871.plc2.org sls= [871, 872, 873] site= 872 +872 None n2-872.plc2.org sls= [872, 873, 874] site= 873 +873 None n2-873.plc2.org sls= [873, 874, 875] site= 874 +874 None n2-874.plc2.org sls= [874, 875, 876] site= 875 +875 None n2-875.plc2.org sls= [875, 876, 877] site= 876 +876 None n2-876.plc2.org sls= [876, 877, 878] site= 877 +877 None n2-877.plc2.org sls= [877, 878, 879] site= 878 +878 None n2-878.plc2.org sls= [878, 879, 880] site= 879 +879 None n2-879.plc2.org sls= [879, 880, 881] site= 880 +880 None n2-880.plc2.org sls= [880, 881, 882] site= 881 +881 None n2-881.plc2.org sls= [881, 882, 883] site= 882 +882 None n2-882.plc2.org sls= [882, 883, 884] site= 883 +883 None n2-883.plc2.org sls= [883, 884, 885] site= 884 +884 None n2-884.plc2.org sls= [884, 885, 886] site= 885 +885 None n2-885.plc2.org sls= [885, 886, 887] site= 886 +886 None n2-886.plc2.org sls= [886, 887, 888] site= 887 +887 None n2-887.plc2.org sls= [887, 888, 889] site= 888 +888 None n2-888.plc2.org sls= [888, 889, 890] site= 889 +889 None n2-889.plc2.org sls= [889, 890, 891] site= 890 +890 None n2-890.plc2.org sls= [890, 891, 892] site= 891 +891 None n2-891.plc2.org sls= [891, 892, 893] site= 892 +892 None n2-892.plc2.org sls= [892, 893, 894] site= 893 +893 None n2-893.plc2.org sls= [893, 894, 895] site= 894 +894 None n2-894.plc2.org sls= [894, 895, 896] site= 895 +895 None n2-895.plc2.org sls= [895, 896, 897] site= 896 +896 None n2-896.plc2.org sls= [896, 897, 898] site= 897 +897 None n2-897.plc2.org sls= [897, 898, 899] site= 898 +898 None n2-898.plc2.org sls= [898, 899, 900] site= 899 +899 None n2-899.plc2.org sls= [899, 900, 901] site= 900 +900 None n2-900.plc2.org sls= [900, 901, 902] site= 901 +901 None n2-901.plc2.org sls= [901, 902, 903] site= 902 +902 None n2-902.plc2.org sls= [902, 903, 904] site= 903 +903 None n2-903.plc2.org sls= [903, 904, 905] site= 904 +904 None n2-904.plc2.org sls= [904, 905, 906] site= 905 +905 None n2-905.plc2.org sls= [905, 906, 907] site= 906 +906 None n2-906.plc2.org sls= [906, 907, 908] site= 907 +907 None n2-907.plc2.org sls= [907, 908, 909] site= 908 +908 None n2-908.plc2.org sls= [908, 909, 910] site= 909 +909 None n2-909.plc2.org sls= [909, 910, 911] site= 910 +910 None n2-910.plc2.org sls= [910, 911, 912] site= 911 +911 None n2-911.plc2.org sls= [911, 912, 913] site= 912 +912 None n2-912.plc2.org sls= [912, 913, 914] site= 913 +913 None n2-913.plc2.org sls= [913, 914, 915] site= 914 +914 None n2-914.plc2.org sls= [914, 915, 916] site= 915 +915 None n2-915.plc2.org sls= [915, 916, 917] site= 916 +916 None n2-916.plc2.org sls= [916, 917, 918] site= 917 +917 None n2-917.plc2.org sls= [917, 918, 919] site= 918 +918 None n2-918.plc2.org sls= [918, 919, 920] site= 919 +919 None n2-919.plc2.org sls= [919, 920, 921] site= 920 +920 None n2-920.plc2.org sls= [920, 921, 922] site= 921 +921 None n2-921.plc2.org sls= [921, 922, 923] site= 922 +922 None n2-922.plc2.org sls= [922, 923, 924] site= 923 +923 None n2-923.plc2.org sls= [923, 924, 925] site= 924 +924 None n2-924.plc2.org sls= [924, 925, 926] site= 925 +925 None n2-925.plc2.org sls= [925, 926, 927] site= 926 +926 None n2-926.plc2.org sls= [926, 927, 928] site= 927 +927 None n2-927.plc2.org sls= [927, 928, 929] site= 928 +928 None n2-928.plc2.org sls= [928, 929, 930] site= 929 +929 None n2-929.plc2.org sls= [929, 930, 931] site= 930 +930 None n2-930.plc2.org sls= [930, 931, 932] site= 931 +931 None n2-931.plc2.org sls= [931, 932, 933] site= 932 +932 None n2-932.plc2.org sls= [932, 933, 934] site= 933 +933 None n2-933.plc2.org sls= [933, 934, 935] site= 934 +934 None n2-934.plc2.org sls= [934, 935, 936] site= 935 +935 None n2-935.plc2.org sls= [935, 936, 937] site= 936 +936 None n2-936.plc2.org sls= [936, 937, 938] site= 937 +937 None n2-937.plc2.org sls= [937, 938, 939] site= 938 +938 None n2-938.plc2.org sls= [938, 939, 940] site= 939 +939 None n2-939.plc2.org sls= [939, 940, 941] site= 940 +940 None n2-940.plc2.org sls= [940, 941, 942] site= 941 +941 None n2-941.plc2.org sls= [941, 942, 943] site= 942 +942 None n2-942.plc2.org sls= [942, 943, 944] site= 943 +943 None n2-943.plc2.org sls= [943, 944, 945] site= 944 +944 None n2-944.plc2.org sls= [944, 945, 946] site= 945 +945 None n2-945.plc2.org sls= [945, 946, 947] site= 946 +946 None n2-946.plc2.org sls= [946, 947, 948] site= 947 +947 None n2-947.plc2.org sls= [947, 948, 949] site= 948 +948 None n2-948.plc2.org sls= [948, 949, 950] site= 949 +949 None n2-949.plc2.org sls= [949, 950, 951] site= 950 +950 None n2-950.plc2.org sls= [950, 951, 952] site= 951 +951 None n2-951.plc2.org sls= [951, 952, 953] site= 952 +952 None n2-952.plc2.org sls= [952, 953, 954] site= 953 +953 None n2-953.plc2.org sls= [953, 954, 955] site= 954 +954 None n2-954.plc2.org sls= [954, 955, 956] site= 955 +955 None n2-955.plc2.org sls= [955, 956, 957] site= 956 +956 None n2-956.plc2.org sls= [956, 957, 958] site= 957 +957 None n2-957.plc2.org sls= [957, 958, 959] site= 958 +958 None n2-958.plc2.org sls= [958, 959, 960] site= 959 +959 None n2-959.plc2.org sls= [959, 960, 961] site= 960 +960 None n2-960.plc2.org sls= [960, 961, 962] site= 961 +961 None n2-961.plc2.org sls= [961, 962, 963] site= 962 +962 None n2-962.plc2.org sls= [962, 963, 964] site= 963 +963 None n2-963.plc2.org sls= [963, 964, 965] site= 964 +964 None n2-964.plc2.org sls= [964, 965, 966] site= 965 +965 None n2-965.plc2.org sls= [965, 966, 967] site= 966 +966 None n2-966.plc2.org sls= [966, 967, 968] site= 967 +967 None n2-967.plc2.org sls= [967, 968, 969] site= 968 +968 None n2-968.plc2.org sls= [968, 969, 970] site= 969 +969 None n2-969.plc2.org sls= [969, 970, 971] site= 970 +970 None n2-970.plc2.org sls= [970, 971, 972] site= 971 +971 None n2-971.plc2.org sls= [971, 972, 973] site= 972 +972 None n2-972.plc2.org sls= [972, 973, 974] site= 973 +973 None n2-973.plc2.org sls= [973, 974, 975] site= 974 +974 None n2-974.plc2.org sls= [974, 975, 976] site= 975 +975 None n2-975.plc2.org sls= [975, 976, 977] site= 976 +976 None n2-976.plc2.org sls= [976, 977, 978] site= 977 +977 None n2-977.plc2.org sls= [977, 978, 979] site= 978 +978 None n2-978.plc2.org sls= [978, 979, 980] site= 979 +979 None n2-979.plc2.org sls= [979, 980, 981] site= 980 +980 None n2-980.plc2.org sls= [980, 981, 982] site= 981 +981 None n2-981.plc2.org sls= [981, 982, 983] site= 982 +982 None n2-982.plc2.org sls= [982, 983, 984] site= 983 +983 None n2-983.plc2.org sls= [983, 984, 985] site= 984 +984 None n2-984.plc2.org sls= [984, 985, 986] site= 985 +985 None n2-985.plc2.org sls= [985, 986, 987] site= 986 +986 None n2-986.plc2.org sls= [986, 987, 988] site= 987 +987 None n2-987.plc2.org sls= [987, 988, 989] site= 988 +988 None n2-988.plc2.org sls= [988, 989, 990] site= 989 +989 None n2-989.plc2.org sls= [989, 990, 991] site= 990 +990 None n2-990.plc2.org sls= [990, 991, 992] site= 991 +991 None n2-991.plc2.org sls= [991, 992, 993] site= 992 +992 None n2-992.plc2.org sls= [992, 993, 994] site= 993 +993 None n2-993.plc2.org sls= [993, 994, 995] site= 994 +994 None n2-994.plc2.org sls= [994, 995, 996] site= 995 +995 None n2-995.plc2.org sls= [995, 996, 997] site= 996 +996 None n2-996.plc2.org sls= [996, 997, 998] site= 997 +997 None n2-997.plc2.org sls= [997, 998, 999] site= 998 +998 None n2-998.plc2.org sls= [998, 999, 1000] site= 999 +999 None n2-999.plc2.org sls= [999, 1000, 1001] site= 1000 +1000 None n2-1000.plc2.org sls= [1000, 1001, 1002] site= 1001 +1001 None n2-1001.plc2.org sls= [1001, 1002, 1003] site= 2 +1002 None n2-1002.plc2.org sls= [1002, 1003, 1004] site= 3 +1003 None n2-1003.plc2.org sls= [1003, 1004, 1005] site= 4 +1004 None n2-1004.plc2.org sls= [1004, 1005, 1006] site= 5 +1005 None n2-1005.plc2.org sls= [1005, 1006, 1007] site= 6 +1006 None n2-1006.plc2.org sls= [1006, 1007, 1008] site= 7 +1007 None n2-1007.plc2.org sls= [1007, 1008, 1009] site= 8 +1008 None n2-1008.plc2.org sls= [1008, 1009, 1010] site= 9 +1009 None n2-1009.plc2.org sls= [1009, 1010, 1011] site= 10 +1010 None n2-1010.plc2.org sls= [1010, 1011, 1012] site= 11 +1011 None n2-1011.plc2.org sls= [1011, 1012, 1013] site= 12 +1012 None n2-1012.plc2.org sls= [1012, 1013, 1014] site= 13 +1013 None n2-1013.plc2.org sls= [1013, 1014, 1015] site= 14 +1014 None n2-1014.plc2.org sls= [1014, 1015, 1016] site= 15 +1015 None n2-1015.plc2.org sls= [1015, 1016, 1017] site= 16 +1016 None n2-1016.plc2.org sls= [1016, 1017, 1018] site= 17 +1017 None n2-1017.plc2.org sls= [1017, 1018, 1019] site= 18 +1018 None n2-1018.plc2.org sls= [1018, 1019, 1020] site= 19 +1019 None n2-1019.plc2.org sls= [1019, 1020, 1021] site= 20 +1020 None n2-1020.plc2.org sls= [1020, 1021, 1022] site= 21 +1021 None n2-1021.plc2.org sls= [1021, 1022, 1023] site= 22 +1022 None n2-1022.plc2.org sls= [1022, 1023, 1024] site= 23 +1023 None n2-1023.plc2.org sls= [1023, 1024, 1025] site= 24 +1024 None n2-1024.plc2.org sls= [1024, 1025, 1026] site= 25 +1025 None n2-1025.plc2.org sls= [1025, 1026, 1027] site= 26 +1026 None n2-1026.plc2.org sls= [1026, 1027, 1028] site= 27 +1027 None n2-1027.plc2.org sls= [1027, 1028, 1029] site= 28 +1028 None n2-1028.plc2.org sls= [1028, 1029, 1030] site= 29 +1029 None n2-1029.plc2.org sls= [1029, 1030, 1031] site= 30 +1030 None n2-1030.plc2.org sls= [1030, 1031, 1032] site= 31 +1031 None n2-1031.plc2.org sls= [1031, 1032, 1033] site= 32 +1032 None n2-1032.plc2.org sls= [1032, 1033, 1034] site= 33 +1033 None n2-1033.plc2.org sls= [1033, 1034, 1035] site= 34 +1034 None n2-1034.plc2.org sls= [1034, 1035, 1036] site= 35 +1035 None n2-1035.plc2.org sls= [1035, 1036, 1037] site= 36 +1036 None n2-1036.plc2.org sls= [1036, 1037, 1038] site= 37 +1037 None n2-1037.plc2.org sls= [1037, 1038, 1039] site= 38 +1038 None n2-1038.plc2.org sls= [1038, 1039, 1040] site= 39 +1039 None n2-1039.plc2.org sls= [1039, 1040, 1041] site= 40 +1040 None n2-1040.plc2.org sls= [1040, 1041, 1042] site= 41 +1041 None n2-1041.plc2.org sls= [1041, 1042, 1043] site= 42 +1042 None n2-1042.plc2.org sls= [1042, 1043, 1044] site= 43 +1043 None n2-1043.plc2.org sls= [1043, 1044, 1045] site= 44 +1044 None n2-1044.plc2.org sls= [1044, 1045, 1046] site= 45 +1045 None n2-1045.plc2.org sls= [1045, 1046, 1047] site= 46 +1046 None n2-1046.plc2.org sls= [1046, 1047, 1048] site= 47 +1047 None n2-1047.plc2.org sls= [1047, 1048, 1049] site= 48 +1048 None n2-1048.plc2.org sls= [1048, 1049, 1050] site= 49 +1049 None n2-1049.plc2.org sls= [1049, 1050, 1051] site= 50 +1050 None n2-1050.plc2.org sls= [1050, 1051, 1052] site= 51 +1051 None n2-1051.plc2.org sls= [1051, 1052, 1053] site= 52 +1052 None n2-1052.plc2.org sls= [1052, 1053, 1054] site= 53 +1053 None n2-1053.plc2.org sls= [1053, 1054, 1055] site= 54 +1054 None n2-1054.plc2.org sls= [1054, 1055, 1056] site= 55 +1055 None n2-1055.plc2.org sls= [1055, 1056, 1057] site= 56 +1056 None n2-1056.plc2.org sls= [1056, 1057, 1058] site= 57 +1057 None n2-1057.plc2.org sls= [1057, 1058, 1059] site= 58 +1058 None n2-1058.plc2.org sls= [1058, 1059, 1060] site= 59 +1059 None n2-1059.plc2.org sls= [1059, 1060, 1061] site= 60 +1060 None n2-1060.plc2.org sls= [1060, 1061, 1062] site= 61 +1061 None n2-1061.plc2.org sls= [1061, 1062, 1063] site= 62 +1062 None n2-1062.plc2.org sls= [1062, 1063, 1064] site= 63 +1063 None n2-1063.plc2.org sls= [1063, 1064, 1065] site= 64 +1064 None n2-1064.plc2.org sls= [1064, 1065, 1066] site= 65 +1065 None n2-1065.plc2.org sls= [1065, 1066, 1067] site= 66 +1066 None n2-1066.plc2.org sls= [1066, 1067, 1068] site= 67 +1067 None n2-1067.plc2.org sls= [1067, 1068, 1069] site= 68 +1068 None n2-1068.plc2.org sls= [1068, 1069, 1070] site= 69 +1069 None n2-1069.plc2.org sls= [1069, 1070, 1071] site= 70 +1070 None n2-1070.plc2.org sls= [1070, 1071, 1072] site= 71 +1071 None n2-1071.plc2.org sls= [1071, 1072, 1073] site= 72 +1072 None n2-1072.plc2.org sls= [1072, 1073, 1074] site= 73 +1073 None n2-1073.plc2.org sls= [1073, 1074, 1075] site= 74 +1074 None n2-1074.plc2.org sls= [1074, 1075, 1076] site= 75 +1075 None n2-1075.plc2.org sls= [1075, 1076, 1077] site= 76 +1076 None n2-1076.plc2.org sls= [1076, 1077, 1078] site= 77 +1077 None n2-1077.plc2.org sls= [1077, 1078, 1079] site= 78 +1078 None n2-1078.plc2.org sls= [1078, 1079, 1080] site= 79 +1079 None n2-1079.plc2.org sls= [1079, 1080, 1081] site= 80 +1080 None n2-1080.plc2.org sls= [1080, 1081, 1082] site= 81 +1081 None n2-1081.plc2.org sls= [1081, 1082, 1083] site= 82 +1082 None n2-1082.plc2.org sls= [1082, 1083, 1084] site= 83 +1083 None n2-1083.plc2.org sls= [1083, 1084, 1085] site= 84 +1084 None n2-1084.plc2.org sls= [1084, 1085, 1086] site= 85 +1085 None n2-1085.plc2.org sls= [1085, 1086, 1087] site= 86 +1086 None n2-1086.plc2.org sls= [1086, 1087, 1088] site= 87 +1087 None n2-1087.plc2.org sls= [1087, 1088, 1089] site= 88 +1088 None n2-1088.plc2.org sls= [1088, 1089, 1090] site= 89 +1089 None n2-1089.plc2.org sls= [1089, 1090, 1091] site= 90 +1090 None n2-1090.plc2.org sls= [1090, 1091, 1092] site= 91 +1091 None n2-1091.plc2.org sls= [1091, 1092, 1093] site= 92 +1092 None n2-1092.plc2.org sls= [1092, 1093, 1094] site= 93 +1093 None n2-1093.plc2.org sls= [1093, 1094, 1095] site= 94 +1094 None n2-1094.plc2.org sls= [1094, 1095, 1096] site= 95 +1095 None n2-1095.plc2.org sls= [1095, 1096, 1097] site= 96 +1096 None n2-1096.plc2.org sls= [1096, 1097, 1098] site= 97 +1097 None n2-1097.plc2.org sls= [1097, 1098, 1099] site= 98 +1098 None n2-1098.plc2.org sls= [1098, 1099, 1100] site= 99 +1099 None n2-1099.plc2.org sls= [1099, 1100, 1101] site= 100 +1100 None n2-1100.plc2.org sls= [1100, 1101, 1102] site= 101 +1101 None n2-1101.plc2.org sls= [1101, 1102, 1103] site= 102 +1102 None n2-1102.plc2.org sls= [1102, 1103, 1104] site= 103 +1103 None n2-1103.plc2.org sls= [1103, 1104, 1105] site= 104 +1104 None n2-1104.plc2.org sls= [1104, 1105, 1106] site= 105 +1105 None n2-1105.plc2.org sls= [1105, 1106, 1107] site= 106 +1106 None n2-1106.plc2.org sls= [1106, 1107, 1108] site= 107 +1107 None n2-1107.plc2.org sls= [1107, 1108, 1109] site= 108 +1108 None n2-1108.plc2.org sls= [1108, 1109, 1110] site= 109 +1109 None n2-1109.plc2.org sls= [1109, 1110, 1111] site= 110 +1110 None n2-1110.plc2.org sls= [1110, 1111, 1112] site= 111 +1111 None n2-1111.plc2.org sls= [1111, 1112, 1113] site= 112 +1112 None n2-1112.plc2.org sls= [1112, 1113, 1114] site= 113 +1113 None n2-1113.plc2.org sls= [1113, 1114, 1115] site= 114 +1114 None n2-1114.plc2.org sls= [1114, 1115, 1116] site= 115 +1115 None n2-1115.plc2.org sls= [1115, 1116, 1117] site= 116 +1116 None n2-1116.plc2.org sls= [1116, 1117, 1118] site= 117 +1117 None n2-1117.plc2.org sls= [1117, 1118, 1119] site= 118 +1118 None n2-1118.plc2.org sls= [1118, 1119, 1120] site= 119 +1119 None n2-1119.plc2.org sls= [1119, 1120, 1121] site= 120 +1120 None n2-1120.plc2.org sls= [1120, 1121, 1122] site= 121 +1121 None n2-1121.plc2.org sls= [1121, 1122, 1123] site= 122 +1122 None n2-1122.plc2.org sls= [1122, 1123, 1124] site= 123 +1123 None n2-1123.plc2.org sls= [1123, 1124, 1125] site= 124 +1124 None n2-1124.plc2.org sls= [1124, 1125, 1126] site= 125 +1125 None n2-1125.plc2.org sls= [1125, 1126, 1127] site= 126 +1126 None n2-1126.plc2.org sls= [1126, 1127, 1128] site= 127 +1127 None n2-1127.plc2.org sls= [1127, 1128, 1129] site= 128 +1128 None n2-1128.plc2.org sls= [1128, 1129, 1130] site= 129 +1129 None n2-1129.plc2.org sls= [1129, 1130, 1131] site= 130 +1130 None n2-1130.plc2.org sls= [1130, 1131, 1132] site= 131 +1131 None n2-1131.plc2.org sls= [1131, 1132, 1133] site= 132 +1132 None n2-1132.plc2.org sls= [1132, 1133, 1134] site= 133 +1133 None n2-1133.plc2.org sls= [1133, 1134, 1135] site= 134 +1134 None n2-1134.plc2.org sls= [1134, 1135, 1136] site= 135 +1135 None n2-1135.plc2.org sls= [1135, 1136, 1137] site= 136 +1136 None n2-1136.plc2.org sls= [1136, 1137, 1138] site= 137 +1137 None n2-1137.plc2.org sls= [1137, 1138, 1139] site= 138 +1138 None n2-1138.plc2.org sls= [1138, 1139, 1140] site= 139 +1139 None n2-1139.plc2.org sls= [1139, 1140, 1141] site= 140 +1140 None n2-1140.plc2.org sls= [1140, 1141, 1142] site= 141 +1141 None n2-1141.plc2.org sls= [1141, 1142, 1143] site= 142 +1142 None n2-1142.plc2.org sls= [1142, 1143, 1144] site= 143 +1143 None n2-1143.plc2.org sls= [1143, 1144, 1145] site= 144 +1144 None n2-1144.plc2.org sls= [1144, 1145, 1146] site= 145 +1145 None n2-1145.plc2.org sls= [1145, 1146, 1147] site= 146 +1146 None n2-1146.plc2.org sls= [1146, 1147, 1148] site= 147 +1147 None n2-1147.plc2.org sls= [1147, 1148, 1149] site= 148 +1148 None n2-1148.plc2.org sls= [1148, 1149, 1150] site= 149 +1149 None n2-1149.plc2.org sls= [1149, 1150, 1151] site= 150 +1150 None n2-1150.plc2.org sls= [1150, 1151, 1152] site= 151 +1151 None n2-1151.plc2.org sls= [1151, 1152, 1153] site= 152 +1152 None n2-1152.plc2.org sls= [1152, 1153, 1154] site= 153 +1153 None n2-1153.plc2.org sls= [1153, 1154, 1155] site= 154 +1154 None n2-1154.plc2.org sls= [1154, 1155, 1156] site= 155 +1155 None n2-1155.plc2.org sls= [1155, 1156, 1157] site= 156 +1156 None n2-1156.plc2.org sls= [1156, 1157, 1158] site= 157 +1157 None n2-1157.plc2.org sls= [1157, 1158, 1159] site= 158 +1158 None n2-1158.plc2.org sls= [1158, 1159, 1160] site= 159 +1159 None n2-1159.plc2.org sls= [1159, 1160, 1161] site= 160 +1160 None n2-1160.plc2.org sls= [1160, 1161, 1162] site= 161 +1161 None n2-1161.plc2.org sls= [1161, 1162, 1163] site= 162 +1162 None n2-1162.plc2.org sls= [1162, 1163, 1164] site= 163 +1163 None n2-1163.plc2.org sls= [1163, 1164, 1165] site= 164 +1164 None n2-1164.plc2.org sls= [1164, 1165, 1166] site= 165 +1165 None n2-1165.plc2.org sls= [1165, 1166, 1167] site= 166 +1166 None n2-1166.plc2.org sls= [1166, 1167, 1168] site= 167 +1167 None n2-1167.plc2.org sls= [1167, 1168, 1169] site= 168 +1168 None n2-1168.plc2.org sls= [1168, 1169, 1170] site= 169 +1169 None n2-1169.plc2.org sls= [1169, 1170, 1171] site= 170 +1170 None n2-1170.plc2.org sls= [1170, 1171, 1172] site= 171 +1171 None n2-1171.plc2.org sls= [1171, 1172, 1173] site= 172 +1172 None n2-1172.plc2.org sls= [1172, 1173, 1174] site= 173 +1173 None n2-1173.plc2.org sls= [1173, 1174, 1175] site= 174 +1174 None n2-1174.plc2.org sls= [1174, 1175, 1176] site= 175 +1175 None n2-1175.plc2.org sls= [1175, 1176, 1177] site= 176 +1176 None n2-1176.plc2.org sls= [1176, 1177, 1178] site= 177 +1177 None n2-1177.plc2.org sls= [1177, 1178, 1179] site= 178 +1178 None n2-1178.plc2.org sls= [1178, 1179, 1180] site= 179 +1179 None n2-1179.plc2.org sls= [1179, 1180, 1181] site= 180 +1180 None n2-1180.plc2.org sls= [1180, 1181, 1182] site= 181 +1181 None n2-1181.plc2.org sls= [1181, 1182, 1183] site= 182 +1182 None n2-1182.plc2.org sls= [1182, 1183, 1184] site= 183 +1183 None n2-1183.plc2.org sls= [1183, 1184, 1185] site= 184 +1184 None n2-1184.plc2.org sls= [1184, 1185, 1186] site= 185 +1185 None n2-1185.plc2.org sls= [1185, 1186, 1187] site= 186 +1186 None n2-1186.plc2.org sls= [1186, 1187, 1188] site= 187 +1187 None n2-1187.plc2.org sls= [1187, 1188, 1189] site= 188 +1188 None n2-1188.plc2.org sls= [1188, 1189, 1190] site= 189 +1189 None n2-1189.plc2.org sls= [1189, 1190, 1191] site= 190 +1190 None n2-1190.plc2.org sls= [1190, 1191, 1192] site= 191 +1191 None n2-1191.plc2.org sls= [1191, 1192, 1193] site= 192 +1192 None n2-1192.plc2.org sls= [1192, 1193, 1194] site= 193 +1193 None n2-1193.plc2.org sls= [1193, 1194, 1195] site= 194 +1194 None n2-1194.plc2.org sls= [1194, 1195, 1196] site= 195 +1195 None n2-1195.plc2.org sls= [1195, 1196, 1197] site= 196 +1196 None n2-1196.plc2.org sls= [1196, 1197, 1198] site= 197 +1197 None n2-1197.plc2.org sls= [1197, 1198, 1199] site= 198 +1198 None n2-1198.plc2.org sls= [1198, 1199, 1200] site= 199 +1199 None n2-1199.plc2.org sls= [1199, 1200, 1201] site= 200 +1200 None n2-1200.plc2.org sls= [1200, 1201, 1202] site= 201 +1201 None n2-1201.plc2.org sls= [1201, 1202, 1203] site= 202 +1202 None n2-1202.plc2.org sls= [1202, 1203, 1204] site= 203 +1203 None n2-1203.plc2.org sls= [1203, 1204, 1205] site= 204 +1204 None n2-1204.plc2.org sls= [1204, 1205, 1206] site= 205 +1205 None n2-1205.plc2.org sls= [1205, 1206, 1207] site= 206 +1206 None n2-1206.plc2.org sls= [1206, 1207, 1208] site= 207 +1207 None n2-1207.plc2.org sls= [1207, 1208, 1209] site= 208 +1208 None n2-1208.plc2.org sls= [1208, 1209, 1210] site= 209 +1209 None n2-1209.plc2.org sls= [1209, 1210, 1211] site= 210 +1210 None n2-1210.plc2.org sls= [1210, 1211, 1212] site= 211 +1211 None n2-1211.plc2.org sls= [1211, 1212, 1213] site= 212 +1212 None n2-1212.plc2.org sls= [1212, 1213, 1214] site= 213 +1213 None n2-1213.plc2.org sls= [1213, 1214, 1215] site= 214 +1214 None n2-1214.plc2.org sls= [1214, 1215, 1216] site= 215 +1215 None n2-1215.plc2.org sls= [1215, 1216, 1217] site= 216 +1216 None n2-1216.plc2.org sls= [1216, 1217, 1218] site= 217 +1217 None n2-1217.plc2.org sls= [1217, 1218, 1219] site= 218 +1218 None n2-1218.plc2.org sls= [1218, 1219, 1220] site= 219 +1219 None n2-1219.plc2.org sls= [1219, 1220, 1221] site= 220 +1220 None n2-1220.plc2.org sls= [1220, 1221, 1222] site= 221 +1221 None n2-1221.plc2.org sls= [1221, 1222, 1223] site= 222 +1222 None n2-1222.plc2.org sls= [1222, 1223, 1224] site= 223 +1223 None n2-1223.plc2.org sls= [1223, 1224, 1225] site= 224 +1224 None n2-1224.plc2.org sls= [1224, 1225, 1226] site= 225 +1225 None n2-1225.plc2.org sls= [1225, 1226, 1227] site= 226 +1226 None n2-1226.plc2.org sls= [1226, 1227, 1228] site= 227 +1227 None n2-1227.plc2.org sls= [1227, 1228, 1229] site= 228 +1228 None n2-1228.plc2.org sls= [1228, 1229, 1230] site= 229 +1229 None n2-1229.plc2.org sls= [1229, 1230, 1231] site= 230 +1230 None n2-1230.plc2.org sls= [1230, 1231, 1232] site= 231 +1231 None n2-1231.plc2.org sls= [1231, 1232, 1233] site= 232 +1232 None n2-1232.plc2.org sls= [1232, 1233, 1234] site= 233 +1233 None n2-1233.plc2.org sls= [1233, 1234, 1235] site= 234 +1234 None n2-1234.plc2.org sls= [1234, 1235, 1236] site= 235 +1235 None n2-1235.plc2.org sls= [1235, 1236, 1237] site= 236 +1236 None n2-1236.plc2.org sls= [1236, 1237, 1238] site= 237 +1237 None n2-1237.plc2.org sls= [1237, 1238, 1239] site= 238 +1238 None n2-1238.plc2.org sls= [1238, 1239, 1240] site= 239 +1239 None n2-1239.plc2.org sls= [1239, 1240, 1241] site= 240 +1240 None n2-1240.plc2.org sls= [1240, 1241, 1242] site= 241 +1241 None n2-1241.plc2.org sls= [1241, 1242, 1243] site= 242 +1242 None n2-1242.plc2.org sls= [1242, 1243, 1244] site= 243 +1243 None n2-1243.plc2.org sls= [1243, 1244, 1245] site= 244 +1244 None n2-1244.plc2.org sls= [1244, 1245, 1246] site= 245 +1245 None n2-1245.plc2.org sls= [1245, 1246, 1247] site= 246 +1246 None n2-1246.plc2.org sls= [1246, 1247, 1248] site= 247 +1247 None n2-1247.plc2.org sls= [1247, 1248, 1249] site= 248 +1248 None n2-1248.plc2.org sls= [1248, 1249, 1250] site= 249 +1249 None n2-1249.plc2.org sls= [1249, 1250, 1251] site= 250 +1250 None n2-1250.plc2.org sls= [1250, 1251, 1252] site= 251 +1251 None n2-1251.plc2.org sls= [1251, 1252, 1253] site= 252 +1252 None n2-1252.plc2.org sls= [1252, 1253, 1254] site= 253 +1253 None n2-1253.plc2.org sls= [1253, 1254, 1255] site= 254 +1254 None n2-1254.plc2.org sls= [1254, 1255, 1256] site= 255 +1255 None n2-1255.plc2.org sls= [1255, 1256, 1257] site= 256 +1256 None n2-1256.plc2.org sls= [1256, 1257, 1258] site= 257 +1257 None n2-1257.plc2.org sls= [1257, 1258, 1259] site= 258 +1258 None n2-1258.plc2.org sls= [1258, 1259, 1260] site= 259 +1259 None n2-1259.plc2.org sls= [1259, 1260, 1261] site= 260 +1260 None n2-1260.plc2.org sls= [1260, 1261, 1262] site= 261 +1261 None n2-1261.plc2.org sls= [1261, 1262, 1263] site= 262 +1262 None n2-1262.plc2.org sls= [1262, 1263, 1264] site= 263 +1263 None n2-1263.plc2.org sls= [1263, 1264, 1265] site= 264 +1264 None n2-1264.plc2.org sls= [1264, 1265, 1266] site= 265 +1265 None n2-1265.plc2.org sls= [1265, 1266, 1267] site= 266 +1266 None n2-1266.plc2.org sls= [1266, 1267, 1268] site= 267 +1267 None n2-1267.plc2.org sls= [1267, 1268, 1269] site= 268 +1268 None n2-1268.plc2.org sls= [1268, 1269, 1270] site= 269 +1269 None n2-1269.plc2.org sls= [1269, 1270, 1271] site= 270 +1270 None n2-1270.plc2.org sls= [1270, 1271, 1272] site= 271 +1271 None n2-1271.plc2.org sls= [1271, 1272, 1273] site= 272 +1272 None n2-1272.plc2.org sls= [1272, 1273, 1274] site= 273 +1273 None n2-1273.plc2.org sls= [1273, 1274, 1275] site= 274 +1274 None n2-1274.plc2.org sls= [1274, 1275, 1276] site= 275 +1275 None n2-1275.plc2.org sls= [1275, 1276, 1277] site= 276 +1276 None n2-1276.plc2.org sls= [1276, 1277, 1278] site= 277 +1277 None n2-1277.plc2.org sls= [1277, 1278, 1279] site= 278 +1278 None n2-1278.plc2.org sls= [1278, 1279, 1280] site= 279 +1279 None n2-1279.plc2.org sls= [1279, 1280, 1281] site= 280 +1280 None n2-1280.plc2.org sls= [1280, 1281, 1282] site= 281 +1281 None n2-1281.plc2.org sls= [1281, 1282, 1283] site= 282 +1282 None n2-1282.plc2.org sls= [1282, 1283, 1284] site= 283 +1283 None n2-1283.plc2.org sls= [1283, 1284, 1285] site= 284 +1284 None n2-1284.plc2.org sls= [1284, 1285, 1286] site= 285 +1285 None n2-1285.plc2.org sls= [1285, 1286, 1287] site= 286 +1286 None n2-1286.plc2.org sls= [1286, 1287, 1288] site= 287 +1287 None n2-1287.plc2.org sls= [1287, 1288, 1289] site= 288 +1288 None n2-1288.plc2.org sls= [1288, 1289, 1290] site= 289 +1289 None n2-1289.plc2.org sls= [1289, 1290, 1291] site= 290 +1290 None n2-1290.plc2.org sls= [1290, 1291, 1292] site= 291 +1291 None n2-1291.plc2.org sls= [1291, 1292, 1293] site= 292 +1292 None n2-1292.plc2.org sls= [1292, 1293, 1294] site= 293 +1293 None n2-1293.plc2.org sls= [1293, 1294, 1295] site= 294 +1294 None n2-1294.plc2.org sls= [1294, 1295, 1296] site= 295 +1295 None n2-1295.plc2.org sls= [1295, 1296, 1297] site= 296 +1296 None n2-1296.plc2.org sls= [1296, 1297, 1298] site= 297 +1297 None n2-1297.plc2.org sls= [1297, 1298, 1299] site= 298 +1298 None n2-1298.plc2.org sls= [1298, 1299, 1300] site= 299 +1299 None n2-1299.plc2.org sls= [1299, 1300, 1301] site= 300 +1300 None n2-1300.plc2.org sls= [1300, 1301, 1302] site= 301 +1301 None n2-1301.plc2.org sls= [1301, 1302, 1303] site= 302 +1302 None n2-1302.plc2.org sls= [1302, 1303, 1304] site= 303 +1303 None n2-1303.plc2.org sls= [1303, 1304, 1305] site= 304 +1304 None n2-1304.plc2.org sls= [1304, 1305, 1306] site= 305 +1305 None n2-1305.plc2.org sls= [1305, 1306, 1307] site= 306 +1306 None n2-1306.plc2.org sls= [1306, 1307, 1308] site= 307 +1307 None n2-1307.plc2.org sls= [1307, 1308, 1309] site= 308 +1308 None n2-1308.plc2.org sls= [1308, 1309, 1310] site= 309 +1309 None n2-1309.plc2.org sls= [1309, 1310, 1311] site= 310 +1310 None n2-1310.plc2.org sls= [1310, 1311, 1312] site= 311 +1311 None n2-1311.plc2.org sls= [1311, 1312, 1313] site= 312 +1312 None n2-1312.plc2.org sls= [1312, 1313, 1314] site= 313 +1313 None n2-1313.plc2.org sls= [1313, 1314, 1315] site= 314 +1314 None n2-1314.plc2.org sls= [1314, 1315, 1316] site= 315 +1315 None n2-1315.plc2.org sls= [1315, 1316, 1317] site= 316 +1316 None n2-1316.plc2.org sls= [1316, 1317, 1318] site= 317 +1317 None n2-1317.plc2.org sls= [1317, 1318, 1319] site= 318 +1318 None n2-1318.plc2.org sls= [1318, 1319, 1320] site= 319 +1319 None n2-1319.plc2.org sls= [1319, 1320, 1321] site= 320 +1320 None n2-1320.plc2.org sls= [1320, 1321, 1322] site= 321 +1321 None n2-1321.plc2.org sls= [1321, 1322, 1323] site= 322 +1322 None n2-1322.plc2.org sls= [1322, 1323, 1324] site= 323 +1323 None n2-1323.plc2.org sls= [1323, 1324, 1325] site= 324 +1324 None n2-1324.plc2.org sls= [1324, 1325, 1326] site= 325 +1325 None n2-1325.plc2.org sls= [1325, 1326, 1327] site= 326 +1326 None n2-1326.plc2.org sls= [1326, 1327, 1328] site= 327 +1327 None n2-1327.plc2.org sls= [1327, 1328, 1329] site= 328 +1328 None n2-1328.plc2.org sls= [1328, 1329, 1330] site= 329 +1329 None n2-1329.plc2.org sls= [1329, 1330, 1331] site= 330 +1330 None n2-1330.plc2.org sls= [1330, 1331, 1332] site= 331 +1331 None n2-1331.plc2.org sls= [1331, 1332, 1333] site= 332 +1332 None n2-1332.plc2.org sls= [1332, 1333, 1334] site= 333 +1333 None n2-1333.plc2.org sls= [1333, 1334, 1335] site= 334 +1334 None n2-1334.plc2.org sls= [1334, 1335, 1336] site= 335 +1335 None n2-1335.plc2.org sls= [1335, 1336, 1337] site= 336 +1336 None n2-1336.plc2.org sls= [1336, 1337, 1338] site= 337 +1337 None n2-1337.plc2.org sls= [1337, 1338, 1339] site= 338 +1338 None n2-1338.plc2.org sls= [1338, 1339, 1340] site= 339 +1339 None n2-1339.plc2.org sls= [1339, 1340, 1341] site= 340 +1340 None n2-1340.plc2.org sls= [1340, 1341, 1342] site= 341 +1341 None n2-1341.plc2.org sls= [1341, 1342, 1343] site= 342 +1342 None n2-1342.plc2.org sls= [1342, 1343, 1344] site= 343 +1343 None n2-1343.plc2.org sls= [1343, 1344, 1345] site= 344 +1344 None n2-1344.plc2.org sls= [1344, 1345, 1346] site= 345 +1345 None n2-1345.plc2.org sls= [1345, 1346, 1347] site= 346 +1346 None n2-1346.plc2.org sls= [1346, 1347, 1348] site= 347 +1347 None n2-1347.plc2.org sls= [1347, 1348, 1349] site= 348 +1348 None n2-1348.plc2.org sls= [1348, 1349, 1350] site= 349 +1349 None n2-1349.plc2.org sls= [1349, 1350, 1351] site= 350 +1350 None n2-1350.plc2.org sls= [1350, 1351, 1352] site= 351 +1351 None n2-1351.plc2.org sls= [1351, 1352, 1353] site= 352 +1352 None n2-1352.plc2.org sls= [1352, 1353, 1354] site= 353 +1353 None n2-1353.plc2.org sls= [1353, 1354, 1355] site= 354 +1354 None n2-1354.plc2.org sls= [1354, 1355, 1356] site= 355 +1355 None n2-1355.plc2.org sls= [1355, 1356, 1357] site= 356 +1356 None n2-1356.plc2.org sls= [1356, 1357, 1358] site= 357 +1357 None n2-1357.plc2.org sls= [1357, 1358, 1359] site= 358 +1358 None n2-1358.plc2.org sls= [1358, 1359, 1360] site= 359 +1359 None n2-1359.plc2.org sls= [1359, 1360, 1361] site= 360 +1360 None n2-1360.plc2.org sls= [1360, 1361, 1362] site= 361 +1361 None n2-1361.plc2.org sls= [1361, 1362, 1363] site= 362 +1362 None n2-1362.plc2.org sls= [1362, 1363, 1364] site= 363 +1363 None n2-1363.plc2.org sls= [1363, 1364, 1365] site= 364 +1364 None n2-1364.plc2.org sls= [1364, 1365, 1366] site= 365 +1365 None n2-1365.plc2.org sls= [1365, 1366, 1367] site= 366 +1366 None n2-1366.plc2.org sls= [1366, 1367, 1368] site= 367 +1367 None n2-1367.plc2.org sls= [1367, 1368, 1369] site= 368 +1368 None n2-1368.plc2.org sls= [1368, 1369, 1370] site= 369 +1369 None n2-1369.plc2.org sls= [1369, 1370, 1371] site= 370 +1370 None n2-1370.plc2.org sls= [1370, 1371, 1372] site= 371 +1371 None n2-1371.plc2.org sls= [1371, 1372, 1373] site= 372 +1372 None n2-1372.plc2.org sls= [1372, 1373, 1374] site= 373 +1373 None n2-1373.plc2.org sls= [1373, 1374, 1375] site= 374 +1374 None n2-1374.plc2.org sls= [1374, 1375, 1376] site= 375 +1375 None n2-1375.plc2.org sls= [1375, 1376, 1377] site= 376 +1376 None n2-1376.plc2.org sls= [1376, 1377, 1378] site= 377 +1377 None n2-1377.plc2.org sls= [1377, 1378, 1379] site= 378 +1378 None n2-1378.plc2.org sls= [1378, 1379, 1380] site= 379 +1379 None n2-1379.plc2.org sls= [1379, 1380, 1381] site= 380 +1380 None n2-1380.plc2.org sls= [1380, 1381, 1382] site= 381 +1381 None n2-1381.plc2.org sls= [1381, 1382, 1383] site= 382 +1382 None n2-1382.plc2.org sls= [1382, 1383, 1384] site= 383 +1383 None n2-1383.plc2.org sls= [1383, 1384, 1385] site= 384 +1384 None n2-1384.plc2.org sls= [1384, 1385, 1386] site= 385 +1385 None n2-1385.plc2.org sls= [1385, 1386, 1387] site= 386 +1386 None n2-1386.plc2.org sls= [1386, 1387, 1388] site= 387 +1387 None n2-1387.plc2.org sls= [1387, 1388, 1389] site= 388 +1388 None n2-1388.plc2.org sls= [1388, 1389, 1390] site= 389 +1389 None n2-1389.plc2.org sls= [1389, 1390, 1391] site= 390 +1390 None n2-1390.plc2.org sls= [1390, 1391, 1392] site= 391 +1391 None n2-1391.plc2.org sls= [1391, 1392, 1393] site= 392 +1392 None n2-1392.plc2.org sls= [1392, 1393, 1394] site= 393 +1393 None n2-1393.plc2.org sls= [1393, 1394, 1395] site= 394 +1394 None n2-1394.plc2.org sls= [1394, 1395, 1396] site= 395 +1395 None n2-1395.plc2.org sls= [1395, 1396, 1397] site= 396 +1396 None n2-1396.plc2.org sls= [1396, 1397, 1398] site= 397 +1397 None n2-1397.plc2.org sls= [1397, 1398, 1399] site= 398 +1398 None n2-1398.plc2.org sls= [1398, 1399, 1400] site= 399 +1399 None n2-1399.plc2.org sls= [1399, 1400, 1401] site= 400 +1400 None n2-1400.plc2.org sls= [1400, 1401, 1402] site= 401 +1401 None n2-1401.plc2.org sls= [1401, 1402, 1403] site= 402 +1402 None n2-1402.plc2.org sls= [1402, 1403, 1404] site= 403 +1403 None n2-1403.plc2.org sls= [1403, 1404, 1405] site= 404 +1404 None n2-1404.plc2.org sls= [1404, 1405, 1406] site= 405 +1405 None n2-1405.plc2.org sls= [1405, 1406, 1407] site= 406 +1406 None n2-1406.plc2.org sls= [1406, 1407, 1408] site= 407 +1407 None n2-1407.plc2.org sls= [1407, 1408, 1409] site= 408 +1408 None n2-1408.plc2.org sls= [1408, 1409, 1410] site= 409 +1409 None n2-1409.plc2.org sls= [1409, 1410, 1411] site= 410 +1410 None n2-1410.plc2.org sls= [1410, 1411, 1412] site= 411 +1411 None n2-1411.plc2.org sls= [1411, 1412, 1413] site= 412 +1412 None n2-1412.plc2.org sls= [1412, 1413, 1414] site= 413 +1413 None n2-1413.plc2.org sls= [1413, 1414, 1415] site= 414 +1414 None n2-1414.plc2.org sls= [1414, 1415, 1416] site= 415 +1415 None n2-1415.plc2.org sls= [1415, 1416, 1417] site= 416 +1416 None n2-1416.plc2.org sls= [1416, 1417, 1418] site= 417 +1417 None n2-1417.plc2.org sls= [1417, 1418, 1419] site= 418 +1418 None n2-1418.plc2.org sls= [1418, 1419, 1420] site= 419 +1419 None n2-1419.plc2.org sls= [1419, 1420, 1421] site= 420 +1420 None n2-1420.plc2.org sls= [1420, 1421, 1422] site= 421 +1421 None n2-1421.plc2.org sls= [1421, 1422, 1423] site= 422 +1422 None n2-1422.plc2.org sls= [1422, 1423, 1424] site= 423 +1423 None n2-1423.plc2.org sls= [1423, 1424, 1425] site= 424 +1424 None n2-1424.plc2.org sls= [1424, 1425, 1426] site= 425 +1425 None n2-1425.plc2.org sls= [1425, 1426, 1427] site= 426 +1426 None n2-1426.plc2.org sls= [1426, 1427, 1428] site= 427 +1427 None n2-1427.plc2.org sls= [1427, 1428, 1429] site= 428 +1428 None n2-1428.plc2.org sls= [1428, 1429, 1430] site= 429 +1429 None n2-1429.plc2.org sls= [1429, 1430, 1431] site= 430 +1430 None n2-1430.plc2.org sls= [1430, 1431, 1432] site= 431 +1431 None n2-1431.plc2.org sls= [1431, 1432, 1433] site= 432 +1432 None n2-1432.plc2.org sls= [1432, 1433, 1434] site= 433 +1433 None n2-1433.plc2.org sls= [1433, 1434, 1435] site= 434 +1434 None n2-1434.plc2.org sls= [1434, 1435, 1436] site= 435 +1435 None n2-1435.plc2.org sls= [1435, 1436, 1437] site= 436 +1436 None n2-1436.plc2.org sls= [1436, 1437, 1438] site= 437 +1437 None n2-1437.plc2.org sls= [1437, 1438, 1439] site= 438 +1438 None n2-1438.plc2.org sls= [1438, 1439, 1440] site= 439 +1439 None n2-1439.plc2.org sls= [1439, 1440, 1441] site= 440 +1440 None n2-1440.plc2.org sls= [1440, 1441, 1442] site= 441 +1441 None n2-1441.plc2.org sls= [1441, 1442, 1443] site= 442 +1442 None n2-1442.plc2.org sls= [1442, 1443, 1444] site= 443 +1443 None n2-1443.plc2.org sls= [1443, 1444, 1445] site= 444 +1444 None n2-1444.plc2.org sls= [1444, 1445, 1446] site= 445 +1445 None n2-1445.plc2.org sls= [1445, 1446, 1447] site= 446 +1446 None n2-1446.plc2.org sls= [1446, 1447, 1448] site= 447 +1447 None n2-1447.plc2.org sls= [1447, 1448, 1449] site= 448 +1448 None n2-1448.plc2.org sls= [1448, 1449, 1450] site= 449 +1449 None n2-1449.plc2.org sls= [1449, 1450, 1451] site= 450 +1450 None n2-1450.plc2.org sls= [1450, 1451, 1452] site= 451 +1451 None n2-1451.plc2.org sls= [1451, 1452, 1453] site= 452 +1452 None n2-1452.plc2.org sls= [1452, 1453, 1454] site= 453 +1453 None n2-1453.plc2.org sls= [1453, 1454, 1455] site= 454 +1454 None n2-1454.plc2.org sls= [1454, 1455, 1456] site= 455 +1455 None n2-1455.plc2.org sls= [1455, 1456, 1457] site= 456 +1456 None n2-1456.plc2.org sls= [1456, 1457, 1458] site= 457 +1457 None n2-1457.plc2.org sls= [1457, 1458, 1459] site= 458 +1458 None n2-1458.plc2.org sls= [1458, 1459, 1460] site= 459 +1459 None n2-1459.plc2.org sls= [1459, 1460, 1461] site= 460 +1460 None n2-1460.plc2.org sls= [1460, 1461, 1462] site= 461 +1461 None n2-1461.plc2.org sls= [1461, 1462, 1463] site= 462 +1462 None n2-1462.plc2.org sls= [1462, 1463, 1464] site= 463 +1463 None n2-1463.plc2.org sls= [1463, 1464, 1465] site= 464 +1464 None n2-1464.plc2.org sls= [1464, 1465, 1466] site= 465 +1465 None n2-1465.plc2.org sls= [1465, 1466, 1467] site= 466 +1466 None n2-1466.plc2.org sls= [1466, 1467, 1468] site= 467 +1467 None n2-1467.plc2.org sls= [1467, 1468, 1469] site= 468 +1468 None n2-1468.plc2.org sls= [1468, 1469, 1470] site= 469 +1469 None n2-1469.plc2.org sls= [1469, 1470, 1471] site= 470 +1470 None n2-1470.plc2.org sls= [1470, 1471, 1472] site= 471 +1471 None n2-1471.plc2.org sls= [1471, 1472, 1473] site= 472 +1472 None n2-1472.plc2.org sls= [1472, 1473, 1474] site= 473 +1473 None n2-1473.plc2.org sls= [1473, 1474, 1475] site= 474 +1474 None n2-1474.plc2.org sls= [1474, 1475, 1476] site= 475 +1475 None n2-1475.plc2.org sls= [1475, 1476, 1477] site= 476 +1476 None n2-1476.plc2.org sls= [1476, 1477, 1478] site= 477 +1477 None n2-1477.plc2.org sls= [1477, 1478, 1479] site= 478 +1478 None n2-1478.plc2.org sls= [1478, 1479, 1480] site= 479 +1479 None n2-1479.plc2.org sls= [1479, 1480, 1481] site= 480 +1480 None n2-1480.plc2.org sls= [1480, 1481, 1482] site= 481 +1481 None n2-1481.plc2.org sls= [1481, 1482, 1483] site= 482 +1482 None n2-1482.plc2.org sls= [1482, 1483, 1484] site= 483 +1483 None n2-1483.plc2.org sls= [1483, 1484, 1485] site= 484 +1484 None n2-1484.plc2.org sls= [1484, 1485, 1486] site= 485 +1485 None n2-1485.plc2.org sls= [1485, 1486, 1487] site= 486 +1486 None n2-1486.plc2.org sls= [1486, 1487, 1488] site= 487 +1487 None n2-1487.plc2.org sls= [1487, 1488, 1489] site= 488 +1488 None n2-1488.plc2.org sls= [1488, 1489, 1490] site= 489 +1489 None n2-1489.plc2.org sls= [1489, 1490, 1491] site= 490 +1490 None n2-1490.plc2.org sls= [1490, 1491, 1492] site= 491 +1491 None n2-1491.plc2.org sls= [1491, 1492, 1493] site= 492 +1492 None n2-1492.plc2.org sls= [1492, 1493, 1494] site= 493 +1493 None n2-1493.plc2.org sls= [1493, 1494, 1495] site= 494 +1494 None n2-1494.plc2.org sls= [1494, 1495, 1496] site= 495 +1495 None n2-1495.plc2.org sls= [1495, 1496, 1497] site= 496 +1496 None n2-1496.plc2.org sls= [1496, 1497, 1498] site= 497 +1497 None n2-1497.plc2.org sls= [1497, 1498, 1499] site= 498 +1498 None n2-1498.plc2.org sls= [1498, 1499, 1500] site= 499 +1499 None n2-1499.plc2.org sls= [1499, 1500, 1501] site= 500 +1500 None n2-1500.plc2.org sls= [1500, 1501, 1502] site= 501 +1501 None n2-1501.plc2.org sls= [1501, 1502, 1503] site= 502 +1502 None n2-1502.plc2.org sls= [1502, 1503, 1504] site= 503 +1503 None n2-1503.plc2.org sls= [1503, 1504, 1505] site= 504 +1504 None n2-1504.plc2.org sls= [1504, 1505, 1506] site= 505 +1505 None n2-1505.plc2.org sls= [1505, 1506, 1507] site= 506 +1506 None n2-1506.plc2.org sls= [1506, 1507, 1508] site= 507 +1507 None n2-1507.plc2.org sls= [1507, 1508, 1509] site= 508 +1508 None n2-1508.plc2.org sls= [1508, 1509, 1510] site= 509 +1509 None n2-1509.plc2.org sls= [1509, 1510, 1511] site= 510 +1510 None n2-1510.plc2.org sls= [1510, 1511, 1512] site= 511 +1511 None n2-1511.plc2.org sls= [1511, 1512, 1513] site= 512 +1512 None n2-1512.plc2.org sls= [1512, 1513, 1514] site= 513 +1513 None n2-1513.plc2.org sls= [1513, 1514, 1515] site= 514 +1514 None n2-1514.plc2.org sls= [1514, 1515, 1516] site= 515 +1515 None n2-1515.plc2.org sls= [1515, 1516, 1517] site= 516 +1516 None n2-1516.plc2.org sls= [1516, 1517, 1518] site= 517 +1517 None n2-1517.plc2.org sls= [1517, 1518, 1519] site= 518 +1518 None n2-1518.plc2.org sls= [1518, 1519, 1520] site= 519 +1519 None n2-1519.plc2.org sls= [1519, 1520, 1521] site= 520 +1520 None n2-1520.plc2.org sls= [1520, 1521, 1522] site= 521 +1521 None n2-1521.plc2.org sls= [1521, 1522, 1523] site= 522 +1522 None n2-1522.plc2.org sls= [1522, 1523, 1524] site= 523 +1523 None n2-1523.plc2.org sls= [1523, 1524, 1525] site= 524 +1524 None n2-1524.plc2.org sls= [1524, 1525, 1526] site= 525 +1525 None n2-1525.plc2.org sls= [1525, 1526, 1527] site= 526 +1526 None n2-1526.plc2.org sls= [1526, 1527, 1528] site= 527 +1527 None n2-1527.plc2.org sls= [1527, 1528, 1529] site= 528 +1528 None n2-1528.plc2.org sls= [1528, 1529, 1530] site= 529 +1529 None n2-1529.plc2.org sls= [1529, 1530, 1531] site= 530 +1530 None n2-1530.plc2.org sls= [1530, 1531, 1532] site= 531 +1531 None n2-1531.plc2.org sls= [1531, 1532, 1533] site= 532 +1532 None n2-1532.plc2.org sls= [1532, 1533, 1534] site= 533 +1533 None n2-1533.plc2.org sls= [1533, 1534, 1535] site= 534 +1534 None n2-1534.plc2.org sls= [1534, 1535, 1536] site= 535 +1535 None n2-1535.plc2.org sls= [1535, 1536, 1537] site= 536 +1536 None n2-1536.plc2.org sls= [1536, 1537, 1538] site= 537 +1537 None n2-1537.plc2.org sls= [1537, 1538, 1539] site= 538 +1538 None n2-1538.plc2.org sls= [1538, 1539, 1540] site= 539 +1539 None n2-1539.plc2.org sls= [1539, 1540, 1541] site= 540 +1540 None n2-1540.plc2.org sls= [1540, 1541, 1542] site= 541 +1541 None n2-1541.plc2.org sls= [1541, 1542, 1543] site= 542 +1542 None n2-1542.plc2.org sls= [1542, 1543, 1544] site= 543 +1543 None n2-1543.plc2.org sls= [1543, 1544, 1545] site= 544 +1544 None n2-1544.plc2.org sls= [1544, 1545, 1546] site= 545 +1545 None n2-1545.plc2.org sls= [1545, 1546, 1547] site= 546 +1546 None n2-1546.plc2.org sls= [1546, 1547, 1548] site= 547 +1547 None n2-1547.plc2.org sls= [1547, 1548, 1549] site= 548 +1548 None n2-1548.plc2.org sls= [1548, 1549, 1550] site= 549 +1549 None n2-1549.plc2.org sls= [1549, 1550, 1551] site= 550 +1550 None n2-1550.plc2.org sls= [1550, 1551, 1552] site= 551 +1551 None n2-1551.plc2.org sls= [1551, 1552, 1553] site= 552 +1552 None n2-1552.plc2.org sls= [1552, 1553, 1554] site= 553 +1553 None n2-1553.plc2.org sls= [1553, 1554, 1555] site= 554 +1554 None n2-1554.plc2.org sls= [1554, 1555, 1556] site= 555 +1555 None n2-1555.plc2.org sls= [1555, 1556, 1557] site= 556 +1556 None n2-1556.plc2.org sls= [1556, 1557, 1558] site= 557 +1557 None n2-1557.plc2.org sls= [1557, 1558, 1559] site= 558 +1558 None n2-1558.plc2.org sls= [1558, 1559, 1560] site= 559 +1559 None n2-1559.plc2.org sls= [1559, 1560, 1561] site= 560 +1560 None n2-1560.plc2.org sls= [1560, 1561, 1562] site= 561 +1561 None n2-1561.plc2.org sls= [1561, 1562, 1563] site= 562 +1562 None n2-1562.plc2.org sls= [1562, 1563, 1564] site= 563 +1563 None n2-1563.plc2.org sls= [1563, 1564, 1565] site= 564 +1564 None n2-1564.plc2.org sls= [1564, 1565, 1566] site= 565 +1565 None n2-1565.plc2.org sls= [1565, 1566, 1567] site= 566 +1566 None n2-1566.plc2.org sls= [1566, 1567, 1568] site= 567 +1567 None n2-1567.plc2.org sls= [1567, 1568, 1569] site= 568 +1568 None n2-1568.plc2.org sls= [1568, 1569, 1570] site= 569 +1569 None n2-1569.plc2.org sls= [1569, 1570, 1571] site= 570 +1570 None n2-1570.plc2.org sls= [1570, 1571, 1572] site= 571 +1571 None n2-1571.plc2.org sls= [1571, 1572, 1573] site= 572 +1572 None n2-1572.plc2.org sls= [1572, 1573, 1574] site= 573 +1573 None n2-1573.plc2.org sls= [1573, 1574, 1575] site= 574 +1574 None n2-1574.plc2.org sls= [1574, 1575, 1576] site= 575 +1575 None n2-1575.plc2.org sls= [1575, 1576, 1577] site= 576 +1576 None n2-1576.plc2.org sls= [1576, 1577, 1578] site= 577 +1577 None n2-1577.plc2.org sls= [1577, 1578, 1579] site= 578 +1578 None n2-1578.plc2.org sls= [1578, 1579, 1580] site= 579 +1579 None n2-1579.plc2.org sls= [1579, 1580, 1581] site= 580 +1580 None n2-1580.plc2.org sls= [1580, 1581, 1582] site= 581 +1581 None n2-1581.plc2.org sls= [1581, 1582, 1583] site= 582 +1582 None n2-1582.plc2.org sls= [1582, 1583, 1584] site= 583 +1583 None n2-1583.plc2.org sls= [1583, 1584, 1585] site= 584 +1584 None n2-1584.plc2.org sls= [1584, 1585, 1586] site= 585 +1585 None n2-1585.plc2.org sls= [1585, 1586, 1587] site= 586 +1586 None n2-1586.plc2.org sls= [1586, 1587, 1588] site= 587 +1587 None n2-1587.plc2.org sls= [1587, 1588, 1589] site= 588 +1588 None n2-1588.plc2.org sls= [1588, 1589, 1590] site= 589 +1589 None n2-1589.plc2.org sls= [1589, 1590, 1591] site= 590 +1590 None n2-1590.plc2.org sls= [1590, 1591, 1592] site= 591 +1591 None n2-1591.plc2.org sls= [1591, 1592, 1593] site= 592 +1592 None n2-1592.plc2.org sls= [1592, 1593, 1594] site= 593 +1593 None n2-1593.plc2.org sls= [1593, 1594, 1595] site= 594 +1594 None n2-1594.plc2.org sls= [1594, 1595, 1596] site= 595 +1595 None n2-1595.plc2.org sls= [1595, 1596, 1597] site= 596 +1596 None n2-1596.plc2.org sls= [1596, 1597, 1598] site= 597 +1597 None n2-1597.plc2.org sls= [1597, 1598, 1599] site= 598 +1598 None n2-1598.plc2.org sls= [1598, 1599, 1600] site= 599 +1599 None n2-1599.plc2.org sls= [1599, 1600, 1601] site= 600 +1600 None n2-1600.plc2.org sls= [1600, 1601, 1602] site= 601 +1601 None n2-1601.plc2.org sls= [1601, 1602, 1603] site= 602 +1602 None n2-1602.plc2.org sls= [1602, 1603, 1604] site= 603 +1603 None n2-1603.plc2.org sls= [1603, 1604, 1605] site= 604 +1604 None n2-1604.plc2.org sls= [1604, 1605, 1606] site= 605 +1605 None n2-1605.plc2.org sls= [1605, 1606, 1607] site= 606 +1606 None n2-1606.plc2.org sls= [1606, 1607, 1608] site= 607 +1607 None n2-1607.plc2.org sls= [1607, 1608, 1609] site= 608 +1608 None n2-1608.plc2.org sls= [1608, 1609, 1610] site= 609 +1609 None n2-1609.plc2.org sls= [1609, 1610, 1611] site= 610 +1610 None n2-1610.plc2.org sls= [1610, 1611, 1612] site= 611 +1611 None n2-1611.plc2.org sls= [1611, 1612, 1613] site= 612 +1612 None n2-1612.plc2.org sls= [1612, 1613, 1614] site= 613 +1613 None n2-1613.plc2.org sls= [1613, 1614, 1615] site= 614 +1614 None n2-1614.plc2.org sls= [1614, 1615, 1616] site= 615 +1615 None n2-1615.plc2.org sls= [1615, 1616, 1617] site= 616 +1616 None n2-1616.plc2.org sls= [1616, 1617, 1618] site= 617 +1617 None n2-1617.plc2.org sls= [1617, 1618, 1619] site= 618 +1618 None n2-1618.plc2.org sls= [1618, 1619, 1620] site= 619 +1619 None n2-1619.plc2.org sls= [1619, 1620, 1621] site= 620 +1620 None n2-1620.plc2.org sls= [1620, 1621, 1622] site= 621 +1621 None n2-1621.plc2.org sls= [1621, 1622, 1623] site= 622 +1622 None n2-1622.plc2.org sls= [1622, 1623, 1624] site= 623 +1623 None n2-1623.plc2.org sls= [1623, 1624, 1625] site= 624 +1624 None n2-1624.plc2.org sls= [1624, 1625, 1626] site= 625 +1625 None n2-1625.plc2.org sls= [1625, 1626, 1627] site= 626 +1626 None n2-1626.plc2.org sls= [1626, 1627, 1628] site= 627 +1627 None n2-1627.plc2.org sls= [1627, 1628, 1629] site= 628 +1628 None n2-1628.plc2.org sls= [1628, 1629, 1630] site= 629 +1629 None n2-1629.plc2.org sls= [1629, 1630, 1631] site= 630 +1630 None n2-1630.plc2.org sls= [1630, 1631, 1632] site= 631 +1631 None n2-1631.plc2.org sls= [1631, 1632, 1633] site= 632 +1632 None n2-1632.plc2.org sls= [1632, 1633, 1634] site= 633 +1633 None n2-1633.plc2.org sls= [1633, 1634, 1635] site= 634 +1634 None n2-1634.plc2.org sls= [1634, 1635, 1636] site= 635 +1635 None n2-1635.plc2.org sls= [1635, 1636, 1637] site= 636 +1636 None n2-1636.plc2.org sls= [1636, 1637, 1638] site= 637 +1637 None n2-1637.plc2.org sls= [1637, 1638, 1639] site= 638 +1638 None n2-1638.plc2.org sls= [1638, 1639, 1640] site= 639 +1639 None n2-1639.plc2.org sls= [1639, 1640, 1641] site= 640 +1640 None n2-1640.plc2.org sls= [1640, 1641, 1642] site= 641 +1641 None n2-1641.plc2.org sls= [1641, 1642, 1643] site= 642 +1642 None n2-1642.plc2.org sls= [1642, 1643, 1644] site= 643 +1643 None n2-1643.plc2.org sls= [1643, 1644, 1645] site= 644 +1644 None n2-1644.plc2.org sls= [1644, 1645, 1646] site= 645 +1645 None n2-1645.plc2.org sls= [1645, 1646, 1647] site= 646 +1646 None n2-1646.plc2.org sls= [1646, 1647, 1648] site= 647 +1647 None n2-1647.plc2.org sls= [1647, 1648, 1649] site= 648 +1648 None n2-1648.plc2.org sls= [1648, 1649, 1650] site= 649 +1649 None n2-1649.plc2.org sls= [1649, 1650, 1651] site= 650 +1650 None n2-1650.plc2.org sls= [1650, 1651, 1652] site= 651 +1651 None n2-1651.plc2.org sls= [1651, 1652, 1653] site= 652 +1652 None n2-1652.plc2.org sls= [1652, 1653, 1654] site= 653 +1653 None n2-1653.plc2.org sls= [1653, 1654, 1655] site= 654 +1654 None n2-1654.plc2.org sls= [1654, 1655, 1656] site= 655 +1655 None n2-1655.plc2.org sls= [1655, 1656, 1657] site= 656 +1656 None n2-1656.plc2.org sls= [1656, 1657, 1658] site= 657 +1657 None n2-1657.plc2.org sls= [1657, 1658, 1659] site= 658 +1658 None n2-1658.plc2.org sls= [1658, 1659, 1660] site= 659 +1659 None n2-1659.plc2.org sls= [1659, 1660, 1661] site= 660 +1660 None n2-1660.plc2.org sls= [1660, 1661, 1662] site= 661 +1661 None n2-1661.plc2.org sls= [1661, 1662, 1663] site= 662 +1662 None n2-1662.plc2.org sls= [1662, 1663, 1664] site= 663 +1663 None n2-1663.plc2.org sls= [1663, 1664, 1665] site= 664 +1664 None n2-1664.plc2.org sls= [1664, 1665, 1666] site= 665 +1665 None n2-1665.plc2.org sls= [1665, 1666, 1667] site= 666 +1666 None n2-1666.plc2.org sls= [1666, 1667, 1668] site= 667 +1667 None n2-1667.plc2.org sls= [1667, 1668, 1669] site= 668 +1668 None n2-1668.plc2.org sls= [1668, 1669, 1670] site= 669 +1669 None n2-1669.plc2.org sls= [1669, 1670, 1671] site= 670 +1670 None n2-1670.plc2.org sls= [1670, 1671, 1672] site= 671 +1671 None n2-1671.plc2.org sls= [1671, 1672, 1673] site= 672 +1672 None n2-1672.plc2.org sls= [1672, 1673, 1674] site= 673 +1673 None n2-1673.plc2.org sls= [1673, 1674, 1675] site= 674 +1674 None n2-1674.plc2.org sls= [1674, 1675, 1676] site= 675 +1675 None n2-1675.plc2.org sls= [1675, 1676, 1677] site= 676 +1676 None n2-1676.plc2.org sls= [1676, 1677, 1678] site= 677 +1677 None n2-1677.plc2.org sls= [1677, 1678, 1679] site= 678 +1678 None n2-1678.plc2.org sls= [1678, 1679, 1680] site= 679 +1679 None n2-1679.plc2.org sls= [1679, 1680, 1681] site= 680 +1680 None n2-1680.plc2.org sls= [1680, 1681, 1682] site= 681 +1681 None n2-1681.plc2.org sls= [1681, 1682, 1683] site= 682 +1682 None n2-1682.plc2.org sls= [1682, 1683, 1684] site= 683 +1683 None n2-1683.plc2.org sls= [1683, 1684, 1685] site= 684 +1684 None n2-1684.plc2.org sls= [1684, 1685, 1686] site= 685 +1685 None n2-1685.plc2.org sls= [1685, 1686, 1687] site= 686 +1686 None n2-1686.plc2.org sls= [1686, 1687, 1688] site= 687 +1687 None n2-1687.plc2.org sls= [1687, 1688, 1689] site= 688 +1688 None n2-1688.plc2.org sls= [1688, 1689, 1690] site= 689 +1689 None n2-1689.plc2.org sls= [1689, 1690, 1691] site= 690 +1690 None n2-1690.plc2.org sls= [1690, 1691, 1692] site= 691 +1691 None n2-1691.plc2.org sls= [1691, 1692, 1693] site= 692 +1692 None n2-1692.plc2.org sls= [1692, 1693, 1694] site= 693 +1693 None n2-1693.plc2.org sls= [1693, 1694, 1695] site= 694 +1694 None n2-1694.plc2.org sls= [1694, 1695, 1696] site= 695 +1695 None n2-1695.plc2.org sls= [1695, 1696, 1697] site= 696 +1696 None n2-1696.plc2.org sls= [1696, 1697, 1698] site= 697 +1697 None n2-1697.plc2.org sls= [1697, 1698, 1699] site= 698 +1698 None n2-1698.plc2.org sls= [1698, 1699, 1700] site= 699 +1699 None n2-1699.plc2.org sls= [1699, 1700, 1701] site= 700 +1700 None n2-1700.plc2.org sls= [1700, 1701, 1702] site= 701 +1701 None n2-1701.plc2.org sls= [1701, 1702, 1703] site= 702 +1702 None n2-1702.plc2.org sls= [1702, 1703, 1704] site= 703 +1703 None n2-1703.plc2.org sls= [1703, 1704, 1705] site= 704 +1704 None n2-1704.plc2.org sls= [1704, 1705, 1706] site= 705 +1705 None n2-1705.plc2.org sls= [1705, 1706, 1707] site= 706 +1706 None n2-1706.plc2.org sls= [1706, 1707, 1708] site= 707 +1707 None n2-1707.plc2.org sls= [1707, 1708, 1709] site= 708 +1708 None n2-1708.plc2.org sls= [1708, 1709, 1710] site= 709 +1709 None n2-1709.plc2.org sls= [1709, 1710, 1711] site= 710 +1710 None n2-1710.plc2.org sls= [1710, 1711, 1712] site= 711 +1711 None n2-1711.plc2.org sls= [1711, 1712, 1713] site= 712 +1712 None n2-1712.plc2.org sls= [1712, 1713, 1714] site= 713 +1713 None n2-1713.plc2.org sls= [1713, 1714, 1715] site= 714 +1714 None n2-1714.plc2.org sls= [1714, 1715, 1716] site= 715 +1715 None n2-1715.plc2.org sls= [1715, 1716, 1717] site= 716 +1716 None n2-1716.plc2.org sls= [1716, 1717, 1718] site= 717 +1717 None n2-1717.plc2.org sls= [1717, 1718, 1719] site= 718 +1718 None n2-1718.plc2.org sls= [1718, 1719, 1720] site= 719 +1719 None n2-1719.plc2.org sls= [1719, 1720, 1721] site= 720 +1720 None n2-1720.plc2.org sls= [1720, 1721, 1722] site= 721 +1721 None n2-1721.plc2.org sls= [1721, 1722, 1723] site= 722 +1722 None n2-1722.plc2.org sls= [1722, 1723, 1724] site= 723 +1723 None n2-1723.plc2.org sls= [1723, 1724, 1725] site= 724 +1724 None n2-1724.plc2.org sls= [1724, 1725, 1726] site= 725 +1725 None n2-1725.plc2.org sls= [1725, 1726, 1727] site= 726 +1726 None n2-1726.plc2.org sls= [1726, 1727, 1728] site= 727 +1727 None n2-1727.plc2.org sls= [1727, 1728, 1729] site= 728 +1728 None n2-1728.plc2.org sls= [1728, 1729, 1730] site= 729 +1729 None n2-1729.plc2.org sls= [1729, 1730, 1731] site= 730 +1730 None n2-1730.plc2.org sls= [1730, 1731, 1732] site= 731 +1731 None n2-1731.plc2.org sls= [1731, 1732, 1733] site= 732 +1732 None n2-1732.plc2.org sls= [1732, 1733, 1734] site= 733 +1733 None n2-1733.plc2.org sls= [1733, 1734, 1735] site= 734 +1734 None n2-1734.plc2.org sls= [1734, 1735, 1736] site= 735 +1735 None n2-1735.plc2.org sls= [1735, 1736, 1737] site= 736 +1736 None n2-1736.plc2.org sls= [1736, 1737, 1738] site= 737 +1737 None n2-1737.plc2.org sls= [1737, 1738, 1739] site= 738 +1738 None n2-1738.plc2.org sls= [1738, 1739, 1740] site= 739 +1739 None n2-1739.plc2.org sls= [1739, 1740, 1741] site= 740 +1740 None n2-1740.plc2.org sls= [1740, 1741, 1742] site= 741 +1741 None n2-1741.plc2.org sls= [1741, 1742, 1743] site= 742 +1742 None n2-1742.plc2.org sls= [1742, 1743, 1744] site= 743 +1743 None n2-1743.plc2.org sls= [1743, 1744, 1745] site= 744 +1744 None n2-1744.plc2.org sls= [1744, 1745, 1746] site= 745 +1745 None n2-1745.plc2.org sls= [1745, 1746, 1747] site= 746 +1746 None n2-1746.plc2.org sls= [1746, 1747, 1748] site= 747 +1747 None n2-1747.plc2.org sls= [1747, 1748, 1749] site= 748 +1748 None n2-1748.plc2.org sls= [1748, 1749, 1750] site= 749 +1749 None n2-1749.plc2.org sls= [1749, 1750, 1751] site= 750 +1750 None n2-1750.plc2.org sls= [1750, 1751, 1752] site= 751 +1751 None n2-1751.plc2.org sls= [1751, 1752, 1753] site= 752 +1752 None n2-1752.plc2.org sls= [1752, 1753, 1754] site= 753 +1753 None n2-1753.plc2.org sls= [1753, 1754, 1755] site= 754 +1754 None n2-1754.plc2.org sls= [1754, 1755, 1756] site= 755 +1755 None n2-1755.plc2.org sls= [1755, 1756, 1757] site= 756 +1756 None n2-1756.plc2.org sls= [1756, 1757, 1758] site= 757 +1757 None n2-1757.plc2.org sls= [1757, 1758, 1759] site= 758 +1758 None n2-1758.plc2.org sls= [1758, 1759, 1760] site= 759 +1759 None n2-1759.plc2.org sls= [1759, 1760, 1761] site= 760 +1760 None n2-1760.plc2.org sls= [1760, 1761, 1762] site= 761 +1761 None n2-1761.plc2.org sls= [1761, 1762, 1763] site= 762 +1762 None n2-1762.plc2.org sls= [1762, 1763, 1764] site= 763 +1763 None n2-1763.plc2.org sls= [1763, 1764, 1765] site= 764 +1764 None n2-1764.plc2.org sls= [1764, 1765, 1766] site= 765 +1765 None n2-1765.plc2.org sls= [1765, 1766, 1767] site= 766 +1766 None n2-1766.plc2.org sls= [1766, 1767, 1768] site= 767 +1767 None n2-1767.plc2.org sls= [1767, 1768, 1769] site= 768 +1768 None n2-1768.plc2.org sls= [1768, 1769, 1770] site= 769 +1769 None n2-1769.plc2.org sls= [1769, 1770, 1771] site= 770 +1770 None n2-1770.plc2.org sls= [1770, 1771, 1772] site= 771 +1771 None n2-1771.plc2.org sls= [1771, 1772, 1773] site= 772 +1772 None n2-1772.plc2.org sls= [1772, 1773, 1774] site= 773 +1773 None n2-1773.plc2.org sls= [1773, 1774, 1775] site= 774 +1774 None n2-1774.plc2.org sls= [1774, 1775, 1776] site= 775 +1775 None n2-1775.plc2.org sls= [1775, 1776, 1777] site= 776 +1776 None n2-1776.plc2.org sls= [1776, 1777, 1778] site= 777 +1777 None n2-1777.plc2.org sls= [1777, 1778, 1779] site= 778 +1778 None n2-1778.plc2.org sls= [1778, 1779, 1780] site= 779 +1779 None n2-1779.plc2.org sls= [1779, 1780, 1781] site= 780 +1780 None n2-1780.plc2.org sls= [1780, 1781, 1782] site= 781 +1781 None n2-1781.plc2.org sls= [1781, 1782, 1783] site= 782 +1782 None n2-1782.plc2.org sls= [1782, 1783, 1784] site= 783 +1783 None n2-1783.plc2.org sls= [1783, 1784, 1785] site= 784 +1784 None n2-1784.plc2.org sls= [1784, 1785, 1786] site= 785 +1785 None n2-1785.plc2.org sls= [1785, 1786, 1787] site= 786 +1786 None n2-1786.plc2.org sls= [1786, 1787, 1788] site= 787 +1787 None n2-1787.plc2.org sls= [1787, 1788, 1789] site= 788 +1788 None n2-1788.plc2.org sls= [1788, 1789, 1790] site= 789 +1789 None n2-1789.plc2.org sls= [1789, 1790, 1791] site= 790 +1790 None n2-1790.plc2.org sls= [1790, 1791, 1792] site= 791 +1791 None n2-1791.plc2.org sls= [1791, 1792, 1793] site= 792 +1792 None n2-1792.plc2.org sls= [1792, 1793, 1794] site= 793 +1793 None n2-1793.plc2.org sls= [1793, 1794, 1795] site= 794 +1794 None n2-1794.plc2.org sls= [1794, 1795, 1796] site= 795 +1795 None n2-1795.plc2.org sls= [1795, 1796, 1797] site= 796 +1796 None n2-1796.plc2.org sls= [1796, 1797, 1798] site= 797 +1797 None n2-1797.plc2.org sls= [1797, 1798, 1799] site= 798 +1798 None n2-1798.plc2.org sls= [1798, 1799, 1800] site= 799 +1799 None n2-1799.plc2.org sls= [1799, 1800, 1801] site= 800 +1800 None n2-1800.plc2.org sls= [1800, 1801, 1802] site= 801 +1801 None n2-1801.plc2.org sls= [1801, 1802, 1803] site= 802 +1802 None n2-1802.plc2.org sls= [1802, 1803, 1804] site= 803 +1803 None n2-1803.plc2.org sls= [1803, 1804, 1805] site= 804 +1804 None n2-1804.plc2.org sls= [1804, 1805, 1806] site= 805 +1805 None n2-1805.plc2.org sls= [1805, 1806, 1807] site= 806 +1806 None n2-1806.plc2.org sls= [1806, 1807, 1808] site= 807 +1807 None n2-1807.plc2.org sls= [1807, 1808, 1809] site= 808 +1808 None n2-1808.plc2.org sls= [1808, 1809, 1810] site= 809 +1809 None n2-1809.plc2.org sls= [1809, 1810, 1811] site= 810 +1810 None n2-1810.plc2.org sls= [1810, 1811, 1812] site= 811 +1811 None n2-1811.plc2.org sls= [1811, 1812, 1813] site= 812 +1812 None n2-1812.plc2.org sls= [1812, 1813, 1814] site= 813 +1813 None n2-1813.plc2.org sls= [1813, 1814, 1815] site= 814 +1814 None n2-1814.plc2.org sls= [1814, 1815, 1816] site= 815 +1815 None n2-1815.plc2.org sls= [1815, 1816, 1817] site= 816 +1816 None n2-1816.plc2.org sls= [1816, 1817, 1818] site= 817 +1817 None n2-1817.plc2.org sls= [1817, 1818, 1819] site= 818 +1818 None n2-1818.plc2.org sls= [1818, 1819, 1820] site= 819 +1819 None n2-1819.plc2.org sls= [1819, 1820, 1821] site= 820 +1820 None n2-1820.plc2.org sls= [1820, 1821, 1822] site= 821 +1821 None n2-1821.plc2.org sls= [1821, 1822, 1823] site= 822 +1822 None n2-1822.plc2.org sls= [1822, 1823, 1824] site= 823 +1823 None n2-1823.plc2.org sls= [1823, 1824, 1825] site= 824 +1824 None n2-1824.plc2.org sls= [1824, 1825, 1826] site= 825 +1825 None n2-1825.plc2.org sls= [1825, 1826, 1827] site= 826 +1826 None n2-1826.plc2.org sls= [1826, 1827, 1828] site= 827 +1827 None n2-1827.plc2.org sls= [1827, 1828, 1829] site= 828 +1828 None n2-1828.plc2.org sls= [1828, 1829, 1830] site= 829 +1829 None n2-1829.plc2.org sls= [1829, 1830, 1831] site= 830 +1830 None n2-1830.plc2.org sls= [1830, 1831, 1832] site= 831 +1831 None n2-1831.plc2.org sls= [1831, 1832, 1833] site= 832 +1832 None n2-1832.plc2.org sls= [1832, 1833, 1834] site= 833 +1833 None n2-1833.plc2.org sls= [1833, 1834, 1835] site= 834 +1834 None n2-1834.plc2.org sls= [1834, 1835, 1836] site= 835 +1835 None n2-1835.plc2.org sls= [1835, 1836, 1837] site= 836 +1836 None n2-1836.plc2.org sls= [1836, 1837, 1838] site= 837 +1837 None n2-1837.plc2.org sls= [1837, 1838, 1839] site= 838 +1838 None n2-1838.plc2.org sls= [1838, 1839, 1840] site= 839 +1839 None n2-1839.plc2.org sls= [1839, 1840, 1841] site= 840 +1840 None n2-1840.plc2.org sls= [1840, 1841, 1842] site= 841 +1841 None n2-1841.plc2.org sls= [1841, 1842, 1843] site= 842 +1842 None n2-1842.plc2.org sls= [1842, 1843, 1844] site= 843 +1843 None n2-1843.plc2.org sls= [1843, 1844, 1845] site= 844 +1844 None n2-1844.plc2.org sls= [1844, 1845, 1846] site= 845 +1845 None n2-1845.plc2.org sls= [1845, 1846, 1847] site= 846 +1846 None n2-1846.plc2.org sls= [1846, 1847, 1848] site= 847 +1847 None n2-1847.plc2.org sls= [1847, 1848, 1849] site= 848 +1848 None n2-1848.plc2.org sls= [1848, 1849, 1850] site= 849 +1849 None n2-1849.plc2.org sls= [1849, 1850, 1851] site= 850 +1850 None n2-1850.plc2.org sls= [1850, 1851, 1852] site= 851 +1851 None n2-1851.plc2.org sls= [1851, 1852, 1853] site= 852 +1852 None n2-1852.plc2.org sls= [1852, 1853, 1854] site= 853 +1853 None n2-1853.plc2.org sls= [1853, 1854, 1855] site= 854 +1854 None n2-1854.plc2.org sls= [1854, 1855, 1856] site= 855 +1855 None n2-1855.plc2.org sls= [1855, 1856, 1857] site= 856 +1856 None n2-1856.plc2.org sls= [1856, 1857, 1858] site= 857 +1857 None n2-1857.plc2.org sls= [1857, 1858, 1859] site= 858 +1858 None n2-1858.plc2.org sls= [1858, 1859, 1860] site= 859 +1859 None n2-1859.plc2.org sls= [1859, 1860, 1861] site= 860 +1860 None n2-1860.plc2.org sls= [1860, 1861, 1862] site= 861 +1861 None n2-1861.plc2.org sls= [1861, 1862, 1863] site= 862 +1862 None n2-1862.plc2.org sls= [1862, 1863, 1864] site= 863 +1863 None n2-1863.plc2.org sls= [1863, 1864, 1865] site= 864 +1864 None n2-1864.plc2.org sls= [1864, 1865, 1866] site= 865 +1865 None n2-1865.plc2.org sls= [1865, 1866, 1867] site= 866 +1866 None n2-1866.plc2.org sls= [1866, 1867, 1868] site= 867 +1867 None n2-1867.plc2.org sls= [1867, 1868, 1869] site= 868 +1868 None n2-1868.plc2.org sls= [1868, 1869, 1870] site= 869 +1869 None n2-1869.plc2.org sls= [1869, 1870, 1871] site= 870 +1870 None n2-1870.plc2.org sls= [1870, 1871, 1872] site= 871 +1871 None n2-1871.plc2.org sls= [1871, 1872, 1873] site= 872 +1872 None n2-1872.plc2.org sls= [1872, 1873, 1874] site= 873 +1873 None n2-1873.plc2.org sls= [1873, 1874, 1875] site= 874 +1874 None n2-1874.plc2.org sls= [1874, 1875, 1876] site= 875 +1875 None n2-1875.plc2.org sls= [1875, 1876, 1877] site= 876 +1876 None n2-1876.plc2.org sls= [1876, 1877, 1878] site= 877 +1877 None n2-1877.plc2.org sls= [1877, 1878, 1879] site= 878 +1878 None n2-1878.plc2.org sls= [1878, 1879, 1880] site= 879 +1879 None n2-1879.plc2.org sls= [1879, 1880, 1881] site= 880 +1880 None n2-1880.plc2.org sls= [1880, 1881, 1882] site= 881 +1881 None n2-1881.plc2.org sls= [1881, 1882, 1883] site= 882 +1882 None n2-1882.plc2.org sls= [1882, 1883, 1884] site= 883 +1883 None n2-1883.plc2.org sls= [1883, 1884, 1885] site= 884 +1884 None n2-1884.plc2.org sls= [1884, 1885, 1886] site= 885 +1885 None n2-1885.plc2.org sls= [1885, 1886, 1887] site= 886 +1886 None n2-1886.plc2.org sls= [1886, 1887, 1888] site= 887 +1887 None n2-1887.plc2.org sls= [1887, 1888, 1889] site= 888 +1888 None n2-1888.plc2.org sls= [1888, 1889, 1890] site= 889 +1889 None n2-1889.plc2.org sls= [1889, 1890, 1891] site= 890 +1890 None n2-1890.plc2.org sls= [1890, 1891, 1892] site= 891 +1891 None n2-1891.plc2.org sls= [1891, 1892, 1893] site= 892 +1892 None n2-1892.plc2.org sls= [1892, 1893, 1894] site= 893 +1893 None n2-1893.plc2.org sls= [1893, 1894, 1895] site= 894 +1894 None n2-1894.plc2.org sls= [1894, 1895, 1896] site= 895 +1895 None n2-1895.plc2.org sls= [1895, 1896, 1897] site= 896 +1896 None n2-1896.plc2.org sls= [1896, 1897, 1898] site= 897 +1897 None n2-1897.plc2.org sls= [1897, 1898, 1899] site= 898 +1898 None n2-1898.plc2.org sls= [1898, 1899, 1900] site= 899 +1899 None n2-1899.plc2.org sls= [1899, 1900, 1901] site= 900 +1900 None n2-1900.plc2.org sls= [1900, 1901, 1902] site= 901 +1901 None n2-1901.plc2.org sls= [1901, 1902, 1903] site= 902 +1902 None n2-1902.plc2.org sls= [1902, 1903, 1904] site= 903 +1903 None n2-1903.plc2.org sls= [1903, 1904, 1905] site= 904 +1904 None n2-1904.plc2.org sls= [1904, 1905, 1906] site= 905 +1905 None n2-1905.plc2.org sls= [1905, 1906, 1907] site= 906 +1906 None n2-1906.plc2.org sls= [1906, 1907, 1908] site= 907 +1907 None n2-1907.plc2.org sls= [1907, 1908, 1909] site= 908 +1908 None n2-1908.plc2.org sls= [1908, 1909, 1910] site= 909 +1909 None n2-1909.plc2.org sls= [1909, 1910, 1911] site= 910 +1910 None n2-1910.plc2.org sls= [1910, 1911, 1912] site= 911 +1911 None n2-1911.plc2.org sls= [1911, 1912, 1913] site= 912 +1912 None n2-1912.plc2.org sls= [1912, 1913, 1914] site= 913 +1913 None n2-1913.plc2.org sls= [1913, 1914, 1915] site= 914 +1914 None n2-1914.plc2.org sls= [1914, 1915, 1916] site= 915 +1915 None n2-1915.plc2.org sls= [1915, 1916, 1917] site= 916 +1916 None n2-1916.plc2.org sls= [1916, 1917, 1918] site= 917 +1917 None n2-1917.plc2.org sls= [1917, 1918, 1919] site= 918 +1918 None n2-1918.plc2.org sls= [1918, 1919, 1920] site= 919 +1919 None n2-1919.plc2.org sls= [1919, 1920, 1921] site= 920 +1920 None n2-1920.plc2.org sls= [1920, 1921, 1922] site= 921 +1921 None n2-1921.plc2.org sls= [1921, 1922, 1923] site= 922 +1922 None n2-1922.plc2.org sls= [1922, 1923, 1924] site= 923 +1923 None n2-1923.plc2.org sls= [1923, 1924, 1925] site= 924 +1924 None n2-1924.plc2.org sls= [1924, 1925, 1926] site= 925 +1925 None n2-1925.plc2.org sls= [1925, 1926, 1927] site= 926 +1926 None n2-1926.plc2.org sls= [1926, 1927, 1928] site= 927 +1927 None n2-1927.plc2.org sls= [1927, 1928, 1929] site= 928 +1928 None n2-1928.plc2.org sls= [1928, 1929, 1930] site= 929 +1929 None n2-1929.plc2.org sls= [1929, 1930, 1931] site= 930 +1930 None n2-1930.plc2.org sls= [1930, 1931, 1932] site= 931 +1931 None n2-1931.plc2.org sls= [1931, 1932, 1933] site= 932 +1932 None n2-1932.plc2.org sls= [1932, 1933, 1934] site= 933 +1933 None n2-1933.plc2.org sls= [1933, 1934, 1935] site= 934 +1934 None n2-1934.plc2.org sls= [1934, 1935, 1936] site= 935 +1935 None n2-1935.plc2.org sls= [1935, 1936, 1937] site= 936 +1936 None n2-1936.plc2.org sls= [1936, 1937, 1938] site= 937 +1937 None n2-1937.plc2.org sls= [1937, 1938, 1939] site= 938 +1938 None n2-1938.plc2.org sls= [1938, 1939, 1940] site= 939 +1939 None n2-1939.plc2.org sls= [1939, 1940, 1941] site= 940 +1940 None n2-1940.plc2.org sls= [1940, 1941, 1942] site= 941 +1941 None n2-1941.plc2.org sls= [1941, 1942, 1943] site= 942 +1942 None n2-1942.plc2.org sls= [1942, 1943, 1944] site= 943 +1943 None n2-1943.plc2.org sls= [1943, 1944, 1945] site= 944 +1944 None n2-1944.plc2.org sls= [1944, 1945, 1946] site= 945 +1945 None n2-1945.plc2.org sls= [1945, 1946, 1947] site= 946 +1946 None n2-1946.plc2.org sls= [1946, 1947, 1948] site= 947 +1947 None n2-1947.plc2.org sls= [1947, 1948, 1949] site= 948 +1948 None n2-1948.plc2.org sls= [1948, 1949, 1950] site= 949 +1949 None n2-1949.plc2.org sls= [1949, 1950, 1951] site= 950 +1950 None n2-1950.plc2.org sls= [1950, 1951, 1952] site= 951 +1951 None n2-1951.plc2.org sls= [1951, 1952, 1953] site= 952 +1952 None n2-1952.plc2.org sls= [1952, 1953, 1954] site= 953 +1953 None n2-1953.plc2.org sls= [1953, 1954, 1955] site= 954 +1954 None n2-1954.plc2.org sls= [1954, 1955, 1956] site= 955 +1955 None n2-1955.plc2.org sls= [1955, 1956, 1957] site= 956 +1956 None n2-1956.plc2.org sls= [1956, 1957, 1958] site= 957 +1957 None n2-1957.plc2.org sls= [1957, 1958, 1959] site= 958 +1958 None n2-1958.plc2.org sls= [1958, 1959, 1960] site= 959 +1959 None n2-1959.plc2.org sls= [1959, 1960, 1961] site= 960 +1960 None n2-1960.plc2.org sls= [1960, 1961, 1962] site= 961 +1961 None n2-1961.plc2.org sls= [1961, 1962, 1963] site= 962 +1962 None n2-1962.plc2.org sls= [1962, 1963, 1964] site= 963 +1963 None n2-1963.plc2.org sls= [1963, 1964, 1965] site= 964 +1964 None n2-1964.plc2.org sls= [1964, 1965, 1966] site= 965 +1965 None n2-1965.plc2.org sls= [1965, 1966, 1967] site= 966 +1966 None n2-1966.plc2.org sls= [1966, 1967, 1968] site= 967 +1967 None n2-1967.plc2.org sls= [1967, 1968, 1969] site= 968 +1968 None n2-1968.plc2.org sls= [1968, 1969, 1970] site= 969 +1969 None n2-1969.plc2.org sls= [1969, 1970, 1971] site= 970 +1970 None n2-1970.plc2.org sls= [1970, 1971, 1972] site= 971 +1971 None n2-1971.plc2.org sls= [1971, 1972, 1973] site= 972 +1972 None n2-1972.plc2.org sls= [1972, 1973, 1974] site= 973 +1973 None n2-1973.plc2.org sls= [1973, 1974, 1975] site= 974 +1974 None n2-1974.plc2.org sls= [1974, 1975, 1976] site= 975 +1975 None n2-1975.plc2.org sls= [1975, 1976, 1977] site= 976 +1976 None n2-1976.plc2.org sls= [1976, 1977, 1978] site= 977 +1977 None n2-1977.plc2.org sls= [1977, 1978, 1979] site= 978 +1978 None n2-1978.plc2.org sls= [1978, 1979, 1980] site= 979 +1979 None n2-1979.plc2.org sls= [1979, 1980, 1981] site= 980 +1980 None n2-1980.plc2.org sls= [1980, 1981, 1982] site= 981 +1981 None n2-1981.plc2.org sls= [1981, 1982, 1983] site= 982 +1982 None n2-1982.plc2.org sls= [1982, 1983, 1984] site= 983 +1983 None n2-1983.plc2.org sls= [1983, 1984, 1985] site= 984 +1984 None n2-1984.plc2.org sls= [1984, 1985, 1986] site= 985 +1985 None n2-1985.plc2.org sls= [1985, 1986, 1987] site= 986 +1986 None n2-1986.plc2.org sls= [1986, 1987, 1988] site= 987 +1987 None n2-1987.plc2.org sls= [1987, 1988, 1989] site= 988 +1988 None n2-1988.plc2.org sls= [1988, 1989, 1990] site= 989 +1989 None n2-1989.plc2.org sls= [1989, 1990, 1991] site= 990 +1990 None n2-1990.plc2.org sls= [1990, 1991, 1992] site= 991 +1991 None n2-1991.plc2.org sls= [1991, 1992, 1993] site= 992 +1992 None n2-1992.plc2.org sls= [1992, 1993, 1994] site= 993 +1993 None n2-1993.plc2.org sls= [1993, 1994, 1995] site= 994 +1994 None n2-1994.plc2.org sls= [1994, 1995, 1996] site= 995 +1995 None n2-1995.plc2.org sls= [1995, 1996, 1997] site= 996 +1996 None n2-1996.plc2.org sls= [1996, 1997, 1998] site= 997 +1997 None n2-1997.plc2.org sls= [1997, 1998, 1999] site= 998 +1998 None n2-1998.plc2.org sls= [1998, 1999, 2000] site= 999 +1999 None n2-1999.plc2.org sls= [1999, 2000, 2001] site= 1000 +2000 None n2-2000.plc2.org sls= [2000, 2001, 2002] site= 1001 +2001 None n2-2001.plc2.org sls= [2001, 2002] site= 2 +2002 None n2-2002.plc2.org sls= [2002] site= 3 +2003 None n2-2003.plc2.org sls= [] site= 4 +2004 None n2-2004.plc2.org sls= [] site= 5 +2005 None n2-2005.plc2.org sls= [] site= 6 +2006 None n2-2006.plc2.org sls= [] site= 7 +2007 None n2-2007.plc2.org sls= [] site= 8 +2008 None n2-2008.plc2.org sls= [] site= 9 +2009 None n2-2009.plc2.org sls= [] site= 10 +2010 None n2-2010.plc2.org sls= [] site= 11 +2011 None n2-2011.plc2.org sls= [] site= 12 +2012 None n2-2012.plc2.org sls= [] site= 13 +2013 None n2-2013.plc2.org sls= [] site= 14 +2014 None n2-2014.plc2.org sls= [] site= 15 +2015 None n2-2015.plc2.org sls= [] site= 16 +2016 None n2-2016.plc2.org sls= [] site= 17 +2017 None n2-2017.plc2.org sls= [] site= 18 +2018 None n2-2018.plc2.org sls= [] site= 19 +2019 None n2-2019.plc2.org sls= [] site= 20 +2020 None n2-2020.plc2.org sls= [] site= 21 +2021 None n2-2021.plc2.org sls= [] site= 22 +2022 None n2-2022.plc2.org sls= [] site= 23 +2023 None n2-2023.plc2.org sls= [] site= 24 +2024 None n2-2024.plc2.org sls= [] site= 25 +2025 None n2-2025.plc2.org sls= [] site= 26 +2026 None n2-2026.plc2.org sls= [] site= 27 +2027 None n2-2027.plc2.org sls= [] site= 28 +2028 None n2-2028.plc2.org sls= [] site= 29 +2029 None n2-2029.plc2.org sls= [] site= 30 +2030 None n2-2030.plc2.org sls= [] site= 31 +2031 None n2-2031.plc2.org sls= [] site= 32 +2032 None n2-2032.plc2.org sls= [] site= 33 +2033 None n2-2033.plc2.org sls= [] site= 34 +2034 None n2-2034.plc2.org sls= [] site= 35 +2035 None n2-2035.plc2.org sls= [] site= 36 +2036 None n2-2036.plc2.org sls= [] site= 37 +2037 None n2-2037.plc2.org sls= [] site= 38 +2038 None n2-2038.plc2.org sls= [] site= 39 +2039 None n2-2039.plc2.org sls= [] site= 40 +2040 None n2-2040.plc2.org sls= [] site= 41 +2041 None n2-2041.plc2.org sls= [] site= 42 +2042 None n2-2042.plc2.org sls= [] site= 43 +2043 None n2-2043.plc2.org sls= [] site= 44 +2044 None n2-2044.plc2.org sls= [] site= 45 +2045 None n2-2045.plc2.org sls= [] site= 46 +2046 None n2-2046.plc2.org sls= [] site= 47 +2047 None n2-2047.plc2.org sls= [] site= 48 +2048 None n2-2048.plc2.org sls= [] site= 49 +2049 None n2-2049.plc2.org sls= [] site= 50 +2050 None n2-2050.plc2.org sls= [] site= 51 +2051 None n2-2051.plc2.org sls= [] site= 52 +2052 None n2-2052.plc2.org sls= [] site= 53 +2053 None n2-2053.plc2.org sls= [] site= 54 +2054 None n2-2054.plc2.org sls= [] site= 55 +2055 None n2-2055.plc2.org sls= [] site= 56 +2056 None n2-2056.plc2.org sls= [] site= 57 +2057 None n2-2057.plc2.org sls= [] site= 58 +2058 None n2-2058.plc2.org sls= [] site= 59 +2059 None n2-2059.plc2.org sls= [] site= 60 +2060 None n2-2060.plc2.org sls= [] site= 61 +2061 None n2-2061.plc2.org sls= [] site= 62 +2062 None n2-2062.plc2.org sls= [] site= 63 +2063 None n2-2063.plc2.org sls= [] site= 64 +2064 None n2-2064.plc2.org sls= [] site= 65 +2065 None n2-2065.plc2.org sls= [] site= 66 +2066 None n2-2066.plc2.org sls= [] site= 67 +2067 None n2-2067.plc2.org sls= [] site= 68 +2068 None n2-2068.plc2.org sls= [] site= 69 +2069 None n2-2069.plc2.org sls= [] site= 70 +2070 None n2-2070.plc2.org sls= [] site= 71 +2071 None n2-2071.plc2.org sls= [] site= 72 +2072 None n2-2072.plc2.org sls= [] site= 73 +2073 None n2-2073.plc2.org sls= [] site= 74 +2074 None n2-2074.plc2.org sls= [] site= 75 +2075 None n2-2075.plc2.org sls= [] site= 76 +2076 None n2-2076.plc2.org sls= [] site= 77 +2077 None n2-2077.plc2.org sls= [] site= 78 +2078 None n2-2078.plc2.org sls= [] site= 79 +2079 None n2-2079.plc2.org sls= [] site= 80 +2080 None n2-2080.plc2.org sls= [] site= 81 +2081 None n2-2081.plc2.org sls= [] site= 82 +2082 None n2-2082.plc2.org sls= [] site= 83 +2083 None n2-2083.plc2.org sls= [] site= 84 +2084 None n2-2084.plc2.org sls= [] site= 85 +2085 None n2-2085.plc2.org sls= [] site= 86 +2086 None n2-2086.plc2.org sls= [] site= 87 +2087 None n2-2087.plc2.org sls= [] site= 88 +2088 None n2-2088.plc2.org sls= [] site= 89 +2089 None n2-2089.plc2.org sls= [] site= 90 +2090 None n2-2090.plc2.org sls= [] site= 91 +2091 None n2-2091.plc2.org sls= [] site= 92 +2092 None n2-2092.plc2.org sls= [] site= 93 +2093 None n2-2093.plc2.org sls= [] site= 94 +2094 None n2-2094.plc2.org sls= [] site= 95 +2095 None n2-2095.plc2.org sls= [] site= 96 +2096 None n2-2096.plc2.org sls= [] site= 97 +2097 None n2-2097.plc2.org sls= [] site= 98 +2098 None n2-2098.plc2.org sls= [] site= 99 +2099 None n2-2099.plc2.org sls= [] site= 100 +2100 None n2-2100.plc2.org sls= [] site= 101 +2101 None n2-2101.plc2.org sls= [] site= 102 +2102 None n2-2102.plc2.org sls= [] site= 103 +2103 None n2-2103.plc2.org sls= [] site= 104 +2104 None n2-2104.plc2.org sls= [] site= 105 +2105 None n2-2105.plc2.org sls= [] site= 106 +2106 None n2-2106.plc2.org sls= [] site= 107 +2107 None n2-2107.plc2.org sls= [] site= 108 +2108 None n2-2108.plc2.org sls= [] site= 109 +2109 None n2-2109.plc2.org sls= [] site= 110 +2110 None n2-2110.plc2.org sls= [] site= 111 +2111 None n2-2111.plc2.org sls= [] site= 112 +2112 None n2-2112.plc2.org sls= [] site= 113 +2113 None n2-2113.plc2.org sls= [] site= 114 +2114 None n2-2114.plc2.org sls= [] site= 115 +2115 None n2-2115.plc2.org sls= [] site= 116 +2116 None n2-2116.plc2.org sls= [] site= 117 +2117 None n2-2117.plc2.org sls= [] site= 118 +2118 None n2-2118.plc2.org sls= [] site= 119 +2119 None n2-2119.plc2.org sls= [] site= 120 +2120 None n2-2120.plc2.org sls= [] site= 121 +2121 None n2-2121.plc2.org sls= [] site= 122 +2122 None n2-2122.plc2.org sls= [] site= 123 +2123 None n2-2123.plc2.org sls= [] site= 124 +2124 None n2-2124.plc2.org sls= [] site= 125 +2125 None n2-2125.plc2.org sls= [] site= 126 +2126 None n2-2126.plc2.org sls= [] site= 127 +2127 None n2-2127.plc2.org sls= [] site= 128 +2128 None n2-2128.plc2.org sls= [] site= 129 +2129 None n2-2129.plc2.org sls= [] site= 130 +2130 None n2-2130.plc2.org sls= [] site= 131 +2131 None n2-2131.plc2.org sls= [] site= 132 +2132 None n2-2132.plc2.org sls= [] site= 133 +2133 None n2-2133.plc2.org sls= [] site= 134 +2134 None n2-2134.plc2.org sls= [] site= 135 +2135 None n2-2135.plc2.org sls= [] site= 136 +2136 None n2-2136.plc2.org sls= [] site= 137 +2137 None n2-2137.plc2.org sls= [] site= 138 +2138 None n2-2138.plc2.org sls= [] site= 139 +2139 None n2-2139.plc2.org sls= [] site= 140 +2140 None n2-2140.plc2.org sls= [] site= 141 +2141 None n2-2141.plc2.org sls= [] site= 142 +2142 None n2-2142.plc2.org sls= [] site= 143 +2143 None n2-2143.plc2.org sls= [] site= 144 +2144 None n2-2144.plc2.org sls= [] site= 145 +2145 None n2-2145.plc2.org sls= [] site= 146 +2146 None n2-2146.plc2.org sls= [] site= 147 +2147 None n2-2147.plc2.org sls= [] site= 148 +2148 None n2-2148.plc2.org sls= [] site= 149 +2149 None n2-2149.plc2.org sls= [] site= 150 +2150 None n2-2150.plc2.org sls= [] site= 151 +2151 None n2-2151.plc2.org sls= [] site= 152 +2152 None n2-2152.plc2.org sls= [] site= 153 +2153 None n2-2153.plc2.org sls= [] site= 154 +2154 None n2-2154.plc2.org sls= [] site= 155 +2155 None n2-2155.plc2.org sls= [] site= 156 +2156 None n2-2156.plc2.org sls= [] site= 157 +2157 None n2-2157.plc2.org sls= [] site= 158 +2158 None n2-2158.plc2.org sls= [] site= 159 +2159 None n2-2159.plc2.org sls= [] site= 160 +2160 None n2-2160.plc2.org sls= [] site= 161 +2161 None n2-2161.plc2.org sls= [] site= 162 +2162 None n2-2162.plc2.org sls= [] site= 163 +2163 None n2-2163.plc2.org sls= [] site= 164 +2164 None n2-2164.plc2.org sls= [] site= 165 +2165 None n2-2165.plc2.org sls= [] site= 166 +2166 None n2-2166.plc2.org sls= [] site= 167 +2167 None n2-2167.plc2.org sls= [] site= 168 +2168 None n2-2168.plc2.org sls= [] site= 169 +2169 None n2-2169.plc2.org sls= [] site= 170 +2170 None n2-2170.plc2.org sls= [] site= 171 +2171 None n2-2171.plc2.org sls= [] site= 172 +2172 None n2-2172.plc2.org sls= [] site= 173 +2173 None n2-2173.plc2.org sls= [] site= 174 +2174 None n2-2174.plc2.org sls= [] site= 175 +2175 None n2-2175.plc2.org sls= [] site= 176 +2176 None n2-2176.plc2.org sls= [] site= 177 +2177 None n2-2177.plc2.org sls= [] site= 178 +2178 None n2-2178.plc2.org sls= [] site= 179 +2179 None n2-2179.plc2.org sls= [] site= 180 +2180 None n2-2180.plc2.org sls= [] site= 181 +2181 None n2-2181.plc2.org sls= [] site= 182 +2182 None n2-2182.plc2.org sls= [] site= 183 +2183 None n2-2183.plc2.org sls= [] site= 184 +2184 None n2-2184.plc2.org sls= [] site= 185 +2185 None n2-2185.plc2.org sls= [] site= 186 +2186 None n2-2186.plc2.org sls= [] site= 187 +2187 None n2-2187.plc2.org sls= [] site= 188 +2188 None n2-2188.plc2.org sls= [] site= 189 +2189 None n2-2189.plc2.org sls= [] site= 190 +2190 None n2-2190.plc2.org sls= [] site= 191 +2191 None n2-2191.plc2.org sls= [] site= 192 +2192 None n2-2192.plc2.org sls= [] site= 193 +2193 None n2-2193.plc2.org sls= [] site= 194 +2194 None n2-2194.plc2.org sls= [] site= 195 +2195 None n2-2195.plc2.org sls= [] site= 196 +2196 None n2-2196.plc2.org sls= [] site= 197 +2197 None n2-2197.plc2.org sls= [] site= 198 +2198 None n2-2198.plc2.org sls= [] site= 199 +2199 None n2-2199.plc2.org sls= [] site= 200 +2200 None n2-2200.plc2.org sls= [] site= 201 +2201 None n2-2201.plc2.org sls= [] site= 202 +2202 None n2-2202.plc2.org sls= [] site= 203 +2203 None n2-2203.plc2.org sls= [] site= 204 +2204 None n2-2204.plc2.org sls= [] site= 205 +2205 None n2-2205.plc2.org sls= [] site= 206 +2206 None n2-2206.plc2.org sls= [] site= 207 +2207 None n2-2207.plc2.org sls= [] site= 208 +2208 None n2-2208.plc2.org sls= [] site= 209 +2209 None n2-2209.plc2.org sls= [] site= 210 +2210 None n2-2210.plc2.org sls= [] site= 211 +2211 None n2-2211.plc2.org sls= [] site= 212 +2212 None n2-2212.plc2.org sls= [] site= 213 +2213 None n2-2213.plc2.org sls= [] site= 214 +2214 None n2-2214.plc2.org sls= [] site= 215 +2215 None n2-2215.plc2.org sls= [] site= 216 +2216 None n2-2216.plc2.org sls= [] site= 217 +2217 None n2-2217.plc2.org sls= [] site= 218 +2218 None n2-2218.plc2.org sls= [] site= 219 +2219 None n2-2219.plc2.org sls= [] site= 220 +2220 None n2-2220.plc2.org sls= [] site= 221 +2221 None n2-2221.plc2.org sls= [] site= 222 +2222 None n2-2222.plc2.org sls= [] site= 223 +2223 None n2-2223.plc2.org sls= [] site= 224 +2224 None n2-2224.plc2.org sls= [] site= 225 +2225 None n2-2225.plc2.org sls= [] site= 226 +2226 None n2-2226.plc2.org sls= [] site= 227 +2227 None n2-2227.plc2.org sls= [] site= 228 +2228 None n2-2228.plc2.org sls= [] site= 229 +2229 None n2-2229.plc2.org sls= [] site= 230 +2230 None n2-2230.plc2.org sls= [] site= 231 +2231 None n2-2231.plc2.org sls= [] site= 232 +2232 None n2-2232.plc2.org sls= [] site= 233 +2233 None n2-2233.plc2.org sls= [] site= 234 +2234 None n2-2234.plc2.org sls= [] site= 235 +2235 None n2-2235.plc2.org sls= [] site= 236 +2236 None n2-2236.plc2.org sls= [] site= 237 +2237 None n2-2237.plc2.org sls= [] site= 238 +2238 None n2-2238.plc2.org sls= [] site= 239 +2239 None n2-2239.plc2.org sls= [] site= 240 +2240 None n2-2240.plc2.org sls= [] site= 241 +2241 None n2-2241.plc2.org sls= [] site= 242 +2242 None n2-2242.plc2.org sls= [] site= 243 +2243 None n2-2243.plc2.org sls= [] site= 244 +2244 None n2-2244.plc2.org sls= [] site= 245 +2245 None n2-2245.plc2.org sls= [] site= 246 +2246 None n2-2246.plc2.org sls= [] site= 247 +2247 None n2-2247.plc2.org sls= [] site= 248 +2248 None n2-2248.plc2.org sls= [] site= 249 +2249 None n2-2249.plc2.org sls= [] site= 250 +2250 None n2-2250.plc2.org sls= [] site= 251 +2251 None n2-2251.plc2.org sls= [] site= 252 +2252 None n2-2252.plc2.org sls= [] site= 253 +2253 None n2-2253.plc2.org sls= [] site= 254 +2254 None n2-2254.plc2.org sls= [] site= 255 +2255 None n2-2255.plc2.org sls= [] site= 256 +2256 None n2-2256.plc2.org sls= [] site= 257 +2257 None n2-2257.plc2.org sls= [] site= 258 +2258 None n2-2258.plc2.org sls= [] site= 259 +2259 None n2-2259.plc2.org sls= [] site= 260 +2260 None n2-2260.plc2.org sls= [] site= 261 +2261 None n2-2261.plc2.org sls= [] site= 262 +2262 None n2-2262.plc2.org sls= [] site= 263 +2263 None n2-2263.plc2.org sls= [] site= 264 +2264 None n2-2264.plc2.org sls= [] site= 265 +2265 None n2-2265.plc2.org sls= [] site= 266 +2266 None n2-2266.plc2.org sls= [] site= 267 +2267 None n2-2267.plc2.org sls= [] site= 268 +2268 None n2-2268.plc2.org sls= [] site= 269 +2269 None n2-2269.plc2.org sls= [] site= 270 +2270 None n2-2270.plc2.org sls= [] site= 271 +2271 None n2-2271.plc2.org sls= [] site= 272 +2272 None n2-2272.plc2.org sls= [] site= 273 +2273 None n2-2273.plc2.org sls= [] site= 274 +2274 None n2-2274.plc2.org sls= [] site= 275 +2275 None n2-2275.plc2.org sls= [] site= 276 +2276 None n2-2276.plc2.org sls= [] site= 277 +2277 None n2-2277.plc2.org sls= [] site= 278 +2278 None n2-2278.plc2.org sls= [] site= 279 +2279 None n2-2279.plc2.org sls= [] site= 280 +2280 None n2-2280.plc2.org sls= [] site= 281 +2281 None n2-2281.plc2.org sls= [] site= 282 +2282 None n2-2282.plc2.org sls= [] site= 283 +2283 None n2-2283.plc2.org sls= [] site= 284 +2284 None n2-2284.plc2.org sls= [] site= 285 +2285 None n2-2285.plc2.org sls= [] site= 286 +2286 None n2-2286.plc2.org sls= [] site= 287 +2287 None n2-2287.plc2.org sls= [] site= 288 +2288 None n2-2288.plc2.org sls= [] site= 289 +2289 None n2-2289.plc2.org sls= [] site= 290 +2290 None n2-2290.plc2.org sls= [] site= 291 +2291 None n2-2291.plc2.org sls= [] site= 292 +2292 None n2-2292.plc2.org sls= [] site= 293 +2293 None n2-2293.plc2.org sls= [] site= 294 +2294 None n2-2294.plc2.org sls= [] site= 295 +2295 None n2-2295.plc2.org sls= [] site= 296 +2296 None n2-2296.plc2.org sls= [] site= 297 +2297 None n2-2297.plc2.org sls= [] site= 298 +2298 None n2-2298.plc2.org sls= [] site= 299 +2299 None n2-2299.plc2.org sls= [] site= 300 +2300 None n2-2300.plc2.org sls= [] site= 301 +2301 None n2-2301.plc2.org sls= [] site= 302 +2302 None n2-2302.plc2.org sls= [] site= 303 +2303 None n2-2303.plc2.org sls= [] site= 304 +2304 None n2-2304.plc2.org sls= [] site= 305 +2305 None n2-2305.plc2.org sls= [] site= 306 +2306 None n2-2306.plc2.org sls= [] site= 307 +2307 None n2-2307.plc2.org sls= [] site= 308 +2308 None n2-2308.plc2.org sls= [] site= 309 +2309 None n2-2309.plc2.org sls= [] site= 310 +2310 None n2-2310.plc2.org sls= [] site= 311 +2311 None n2-2311.plc2.org sls= [] site= 312 +2312 None n2-2312.plc2.org sls= [] site= 313 +2313 None n2-2313.plc2.org sls= [] site= 314 +2314 None n2-2314.plc2.org sls= [] site= 315 +2315 None n2-2315.plc2.org sls= [] site= 316 +2316 None n2-2316.plc2.org sls= [] site= 317 +2317 None n2-2317.plc2.org sls= [] site= 318 +2318 None n2-2318.plc2.org sls= [] site= 319 +2319 None n2-2319.plc2.org sls= [] site= 320 +2320 None n2-2320.plc2.org sls= [] site= 321 +2321 None n2-2321.plc2.org sls= [] site= 322 +2322 None n2-2322.plc2.org sls= [] site= 323 +2323 None n2-2323.plc2.org sls= [] site= 324 +2324 None n2-2324.plc2.org sls= [] site= 325 +2325 None n2-2325.plc2.org sls= [] site= 326 +2326 None n2-2326.plc2.org sls= [] site= 327 +2327 None n2-2327.plc2.org sls= [] site= 328 +2328 None n2-2328.plc2.org sls= [] site= 329 +2329 None n2-2329.plc2.org sls= [] site= 330 +2330 None n2-2330.plc2.org sls= [] site= 331 +2331 None n2-2331.plc2.org sls= [] site= 332 +2332 None n2-2332.plc2.org sls= [] site= 333 +2333 None n2-2333.plc2.org sls= [] site= 334 +2334 None n2-2334.plc2.org sls= [] site= 335 +2335 None n2-2335.plc2.org sls= [] site= 336 +2336 None n2-2336.plc2.org sls= [] site= 337 +2337 None n2-2337.plc2.org sls= [] site= 338 +2338 None n2-2338.plc2.org sls= [] site= 339 +2339 None n2-2339.plc2.org sls= [] site= 340 +2340 None n2-2340.plc2.org sls= [] site= 341 +2341 None n2-2341.plc2.org sls= [] site= 342 +2342 None n2-2342.plc2.org sls= [] site= 343 +2343 None n2-2343.plc2.org sls= [] site= 344 +2344 None n2-2344.plc2.org sls= [] site= 345 +2345 None n2-2345.plc2.org sls= [] site= 346 +2346 None n2-2346.plc2.org sls= [] site= 347 +2347 None n2-2347.plc2.org sls= [] site= 348 +2348 None n2-2348.plc2.org sls= [] site= 349 +2349 None n2-2349.plc2.org sls= [] site= 350 +2350 None n2-2350.plc2.org sls= [] site= 351 +2351 None n2-2351.plc2.org sls= [] site= 352 +2352 None n2-2352.plc2.org sls= [] site= 353 +2353 None n2-2353.plc2.org sls= [] site= 354 +2354 None n2-2354.plc2.org sls= [] site= 355 +2355 None n2-2355.plc2.org sls= [] site= 356 +2356 None n2-2356.plc2.org sls= [] site= 357 +2357 None n2-2357.plc2.org sls= [] site= 358 +2358 None n2-2358.plc2.org sls= [] site= 359 +2359 None n2-2359.plc2.org sls= [] site= 360 +2360 None n2-2360.plc2.org sls= [] site= 361 +2361 None n2-2361.plc2.org sls= [] site= 362 +2362 None n2-2362.plc2.org sls= [] site= 363 +2363 None n2-2363.plc2.org sls= [] site= 364 +2364 None n2-2364.plc2.org sls= [] site= 365 +2365 None n2-2365.plc2.org sls= [] site= 366 +2366 None n2-2366.plc2.org sls= [] site= 367 +2367 None n2-2367.plc2.org sls= [] site= 368 +2368 None n2-2368.plc2.org sls= [] site= 369 +2369 None n2-2369.plc2.org sls= [] site= 370 +2370 None n2-2370.plc2.org sls= [] site= 371 +2371 None n2-2371.plc2.org sls= [] site= 372 +2372 None n2-2372.plc2.org sls= [] site= 373 +2373 None n2-2373.plc2.org sls= [] site= 374 +2374 None n2-2374.plc2.org sls= [] site= 375 +2375 None n2-2375.plc2.org sls= [] site= 376 +2376 None n2-2376.plc2.org sls= [] site= 377 +2377 None n2-2377.plc2.org sls= [] site= 378 +2378 None n2-2378.plc2.org sls= [] site= 379 +2379 None n2-2379.plc2.org sls= [] site= 380 +2380 None n2-2380.plc2.org sls= [] site= 381 +2381 None n2-2381.plc2.org sls= [] site= 382 +2382 None n2-2382.plc2.org sls= [] site= 383 +2383 None n2-2383.plc2.org sls= [] site= 384 +2384 None n2-2384.plc2.org sls= [] site= 385 +2385 None n2-2385.plc2.org sls= [] site= 386 +2386 None n2-2386.plc2.org sls= [] site= 387 +2387 None n2-2387.plc2.org sls= [] site= 388 +2388 None n2-2388.plc2.org sls= [] site= 389 +2389 None n2-2389.plc2.org sls= [] site= 390 +2390 None n2-2390.plc2.org sls= [] site= 391 +2391 None n2-2391.plc2.org sls= [] site= 392 +2392 None n2-2392.plc2.org sls= [] site= 393 +2393 None n2-2393.plc2.org sls= [] site= 394 +2394 None n2-2394.plc2.org sls= [] site= 395 +2395 None n2-2395.plc2.org sls= [] site= 396 +2396 None n2-2396.plc2.org sls= [] site= 397 +2397 None n2-2397.plc2.org sls= [] site= 398 +2398 None n2-2398.plc2.org sls= [] site= 399 +2399 None n2-2399.plc2.org sls= [] site= 400 +2400 None n2-2400.plc2.org sls= [] site= 401 +2401 None n2-2401.plc2.org sls= [] site= 402 +2402 None n2-2402.plc2.org sls= [] site= 403 +2403 None n2-2403.plc2.org sls= [] site= 404 +2404 None n2-2404.plc2.org sls= [] site= 405 +2405 None n2-2405.plc2.org sls= [] site= 406 +2406 None n2-2406.plc2.org sls= [] site= 407 +2407 None n2-2407.plc2.org sls= [] site= 408 +2408 None n2-2408.plc2.org sls= [] site= 409 +2409 None n2-2409.plc2.org sls= [] site= 410 +2410 None n2-2410.plc2.org sls= [] site= 411 +2411 None n2-2411.plc2.org sls= [] site= 412 +2412 None n2-2412.plc2.org sls= [] site= 413 +2413 None n2-2413.plc2.org sls= [] site= 414 +2414 None n2-2414.plc2.org sls= [] site= 415 +2415 None n2-2415.plc2.org sls= [] site= 416 +2416 None n2-2416.plc2.org sls= [] site= 417 +2417 None n2-2417.plc2.org sls= [] site= 418 +2418 None n2-2418.plc2.org sls= [] site= 419 +2419 None n2-2419.plc2.org sls= [] site= 420 +2420 None n2-2420.plc2.org sls= [] site= 421 +2421 None n2-2421.plc2.org sls= [] site= 422 +2422 None n2-2422.plc2.org sls= [] site= 423 +2423 None n2-2423.plc2.org sls= [] site= 424 +2424 None n2-2424.plc2.org sls= [] site= 425 +2425 None n2-2425.plc2.org sls= [] site= 426 +2426 None n2-2426.plc2.org sls= [] site= 427 +2427 None n2-2427.plc2.org sls= [] site= 428 +2428 None n2-2428.plc2.org sls= [] site= 429 +2429 None n2-2429.plc2.org sls= [] site= 430 +2430 None n2-2430.plc2.org sls= [] site= 431 +2431 None n2-2431.plc2.org sls= [] site= 432 +2432 None n2-2432.plc2.org sls= [] site= 433 +2433 None n2-2433.plc2.org sls= [] site= 434 +2434 None n2-2434.plc2.org sls= [] site= 435 +2435 None n2-2435.plc2.org sls= [] site= 436 +2436 None n2-2436.plc2.org sls= [] site= 437 +2437 None n2-2437.plc2.org sls= [] site= 438 +2438 None n2-2438.plc2.org sls= [] site= 439 +2439 None n2-2439.plc2.org sls= [] site= 440 +2440 None n2-2440.plc2.org sls= [] site= 441 +2441 None n2-2441.plc2.org sls= [] site= 442 +2442 None n2-2442.plc2.org sls= [] site= 443 +2443 None n2-2443.plc2.org sls= [] site= 444 +2444 None n2-2444.plc2.org sls= [] site= 445 +2445 None n2-2445.plc2.org sls= [] site= 446 +2446 None n2-2446.plc2.org sls= [] site= 447 +2447 None n2-2447.plc2.org sls= [] site= 448 +2448 None n2-2448.plc2.org sls= [] site= 449 +2449 None n2-2449.plc2.org sls= [] site= 450 +2450 None n2-2450.plc2.org sls= [] site= 451 +2451 None n2-2451.plc2.org sls= [] site= 452 +2452 None n2-2452.plc2.org sls= [] site= 453 +2453 None n2-2453.plc2.org sls= [] site= 454 +2454 None n2-2454.plc2.org sls= [] site= 455 +2455 None n2-2455.plc2.org sls= [] site= 456 +2456 None n2-2456.plc2.org sls= [] site= 457 +2457 None n2-2457.plc2.org sls= [] site= 458 +2458 None n2-2458.plc2.org sls= [] site= 459 +2459 None n2-2459.plc2.org sls= [] site= 460 +2460 None n2-2460.plc2.org sls= [] site= 461 +2461 None n2-2461.plc2.org sls= [] site= 462 +2462 None n2-2462.plc2.org sls= [] site= 463 +2463 None n2-2463.plc2.org sls= [] site= 464 +2464 None n2-2464.plc2.org sls= [] site= 465 +2465 None n2-2465.plc2.org sls= [] site= 466 +2466 None n2-2466.plc2.org sls= [] site= 467 +2467 None n2-2467.plc2.org sls= [] site= 468 +2468 None n2-2468.plc2.org sls= [] site= 469 +2469 None n2-2469.plc2.org sls= [] site= 470 +2470 None n2-2470.plc2.org sls= [] site= 471 +2471 None n2-2471.plc2.org sls= [] site= 472 +2472 None n2-2472.plc2.org sls= [] site= 473 +2473 None n2-2473.plc2.org sls= [] site= 474 +2474 None n2-2474.plc2.org sls= [] site= 475 +2475 None n2-2475.plc2.org sls= [] site= 476 +2476 None n2-2476.plc2.org sls= [] site= 477 +2477 None n2-2477.plc2.org sls= [] site= 478 +2478 None n2-2478.plc2.org sls= [] site= 479 +2479 None n2-2479.plc2.org sls= [] site= 480 +2480 None n2-2480.plc2.org sls= [] site= 481 +2481 None n2-2481.plc2.org sls= [] site= 482 +2482 None n2-2482.plc2.org sls= [] site= 483 +2483 None n2-2483.plc2.org sls= [] site= 484 +2484 None n2-2484.plc2.org sls= [] site= 485 +2485 None n2-2485.plc2.org sls= [] site= 486 +2486 None n2-2486.plc2.org sls= [] site= 487 +2487 None n2-2487.plc2.org sls= [] site= 488 +2488 None n2-2488.plc2.org sls= [] site= 489 +2489 None n2-2489.plc2.org sls= [] site= 490 +2490 None n2-2490.plc2.org sls= [] site= 491 +2491 None n2-2491.plc2.org sls= [] site= 492 +2492 None n2-2492.plc2.org sls= [] site= 493 +2493 None n2-2493.plc2.org sls= [] site= 494 +2494 None n2-2494.plc2.org sls= [] site= 495 +2495 None n2-2495.plc2.org sls= [] site= 496 +2496 None n2-2496.plc2.org sls= [] site= 497 +2497 None n2-2497.plc2.org sls= [] site= 498 +2498 None n2-2498.plc2.org sls= [] site= 499 +2499 None n2-2499.plc2.org sls= [] site= 500 +2500 None n2-2500.plc2.org sls= [] site= 501 +2501 None n2-2501.plc2.org sls= [] site= 502 +2502 None n2-2502.plc2.org sls= [] site= 503 +2503 None n2-2503.plc2.org sls= [] site= 504 +2504 None n2-2504.plc2.org sls= [] site= 505 +2505 None n2-2505.plc2.org sls= [] site= 506 +2506 None n2-2506.plc2.org sls= [] site= 507 +2507 None n2-2507.plc2.org sls= [] site= 508 +2508 None n2-2508.plc2.org sls= [] site= 509 +2509 None n2-2509.plc2.org sls= [] site= 510 +2510 None n2-2510.plc2.org sls= [] site= 511 +2511 None n2-2511.plc2.org sls= [] site= 512 +2512 None n2-2512.plc2.org sls= [] site= 513 +2513 None n2-2513.plc2.org sls= [] site= 514 +2514 None n2-2514.plc2.org sls= [] site= 515 +2515 None n2-2515.plc2.org sls= [] site= 516 +2516 None n2-2516.plc2.org sls= [] site= 517 +2517 None n2-2517.plc2.org sls= [] site= 518 +2518 None n2-2518.plc2.org sls= [] site= 519 +2519 None n2-2519.plc2.org sls= [] site= 520 +2520 None n2-2520.plc2.org sls= [] site= 521 +2521 None n2-2521.plc2.org sls= [] site= 522 +2522 None n2-2522.plc2.org sls= [] site= 523 +2523 None n2-2523.plc2.org sls= [] site= 524 +2524 None n2-2524.plc2.org sls= [] site= 525 +2525 None n2-2525.plc2.org sls= [] site= 526 +2526 None n2-2526.plc2.org sls= [] site= 527 +2527 None n2-2527.plc2.org sls= [] site= 528 +2528 None n2-2528.plc2.org sls= [] site= 529 +2529 None n2-2529.plc2.org sls= [] site= 530 +2530 None n2-2530.plc2.org sls= [] site= 531 +2531 None n2-2531.plc2.org sls= [] site= 532 +2532 None n2-2532.plc2.org sls= [] site= 533 +2533 None n2-2533.plc2.org sls= [] site= 534 +2534 None n2-2534.plc2.org sls= [] site= 535 +2535 None n2-2535.plc2.org sls= [] site= 536 +2536 None n2-2536.plc2.org sls= [] site= 537 +2537 None n2-2537.plc2.org sls= [] site= 538 +2538 None n2-2538.plc2.org sls= [] site= 539 +2539 None n2-2539.plc2.org sls= [] site= 540 +2540 None n2-2540.plc2.org sls= [] site= 541 +2541 None n2-2541.plc2.org sls= [] site= 542 +2542 None n2-2542.plc2.org sls= [] site= 543 +2543 None n2-2543.plc2.org sls= [] site= 544 +2544 None n2-2544.plc2.org sls= [] site= 545 +2545 None n2-2545.plc2.org sls= [] site= 546 +2546 None n2-2546.plc2.org sls= [] site= 547 +2547 None n2-2547.plc2.org sls= [] site= 548 +2548 None n2-2548.plc2.org sls= [] site= 549 +2549 None n2-2549.plc2.org sls= [] site= 550 +2550 None n2-2550.plc2.org sls= [] site= 551 +2551 None n2-2551.plc2.org sls= [] site= 552 +2552 None n2-2552.plc2.org sls= [] site= 553 +2553 None n2-2553.plc2.org sls= [] site= 554 +2554 None n2-2554.plc2.org sls= [] site= 555 +2555 None n2-2555.plc2.org sls= [] site= 556 +2556 None n2-2556.plc2.org sls= [] site= 557 +2557 None n2-2557.plc2.org sls= [] site= 558 +2558 None n2-2558.plc2.org sls= [] site= 559 +2559 None n2-2559.plc2.org sls= [] site= 560 +2560 None n2-2560.plc2.org sls= [] site= 561 +2561 None n2-2561.plc2.org sls= [] site= 562 +2562 None n2-2562.plc2.org sls= [] site= 563 +2563 None n2-2563.plc2.org sls= [] site= 564 +2564 None n2-2564.plc2.org sls= [] site= 565 +2565 None n2-2565.plc2.org sls= [] site= 566 +2566 None n2-2566.plc2.org sls= [] site= 567 +2567 None n2-2567.plc2.org sls= [] site= 568 +2568 None n2-2568.plc2.org sls= [] site= 569 +2569 None n2-2569.plc2.org sls= [] site= 570 +2570 None n2-2570.plc2.org sls= [] site= 571 +2571 None n2-2571.plc2.org sls= [] site= 572 +2572 None n2-2572.plc2.org sls= [] site= 573 +2573 None n2-2573.plc2.org sls= [] site= 574 +2574 None n2-2574.plc2.org sls= [] site= 575 +2575 None n2-2575.plc2.org sls= [] site= 576 +2576 None n2-2576.plc2.org sls= [] site= 577 +2577 None n2-2577.plc2.org sls= [] site= 578 +2578 None n2-2578.plc2.org sls= [] site= 579 +2579 None n2-2579.plc2.org sls= [] site= 580 +2580 None n2-2580.plc2.org sls= [] site= 581 +2581 None n2-2581.plc2.org sls= [] site= 582 +2582 None n2-2582.plc2.org sls= [] site= 583 +2583 None n2-2583.plc2.org sls= [] site= 584 +2584 None n2-2584.plc2.org sls= [] site= 585 +2585 None n2-2585.plc2.org sls= [] site= 586 +2586 None n2-2586.plc2.org sls= [] site= 587 +2587 None n2-2587.plc2.org sls= [] site= 588 +2588 None n2-2588.plc2.org sls= [] site= 589 +2589 None n2-2589.plc2.org sls= [] site= 590 +2590 None n2-2590.plc2.org sls= [] site= 591 +2591 None n2-2591.plc2.org sls= [] site= 592 +2592 None n2-2592.plc2.org sls= [] site= 593 +2593 None n2-2593.plc2.org sls= [] site= 594 +2594 None n2-2594.plc2.org sls= [] site= 595 +2595 None n2-2595.plc2.org sls= [] site= 596 +2596 None n2-2596.plc2.org sls= [] site= 597 +2597 None n2-2597.plc2.org sls= [] site= 598 +2598 None n2-2598.plc2.org sls= [] site= 599 +2599 None n2-2599.plc2.org sls= [] site= 600 +2600 None n2-2600.plc2.org sls= [] site= 601 +2601 None n2-2601.plc2.org sls= [] site= 602 +2602 None n2-2602.plc2.org sls= [] site= 603 +2603 None n2-2603.plc2.org sls= [] site= 604 +2604 None n2-2604.plc2.org sls= [] site= 605 +2605 None n2-2605.plc2.org sls= [] site= 606 +2606 None n2-2606.plc2.org sls= [] site= 607 +2607 None n2-2607.plc2.org sls= [] site= 608 +2608 None n2-2608.plc2.org sls= [] site= 609 +2609 None n2-2609.plc2.org sls= [] site= 610 +2610 None n2-2610.plc2.org sls= [] site= 611 +2611 None n2-2611.plc2.org sls= [] site= 612 +2612 None n2-2612.plc2.org sls= [] site= 613 +2613 None n2-2613.plc2.org sls= [] site= 614 +2614 None n2-2614.plc2.org sls= [] site= 615 +2615 None n2-2615.plc2.org sls= [] site= 616 +2616 None n2-2616.plc2.org sls= [] site= 617 +2617 None n2-2617.plc2.org sls= [] site= 618 +2618 None n2-2618.plc2.org sls= [] site= 619 +2619 None n2-2619.plc2.org sls= [] site= 620 +2620 None n2-2620.plc2.org sls= [] site= 621 +2621 None n2-2621.plc2.org sls= [] site= 622 +2622 None n2-2622.plc2.org sls= [] site= 623 +2623 None n2-2623.plc2.org sls= [] site= 624 +2624 None n2-2624.plc2.org sls= [] site= 625 +2625 None n2-2625.plc2.org sls= [] site= 626 +2626 None n2-2626.plc2.org sls= [] site= 627 +2627 None n2-2627.plc2.org sls= [] site= 628 +2628 None n2-2628.plc2.org sls= [] site= 629 +2629 None n2-2629.plc2.org sls= [] site= 630 +2630 None n2-2630.plc2.org sls= [] site= 631 +2631 None n2-2631.plc2.org sls= [] site= 632 +2632 None n2-2632.plc2.org sls= [] site= 633 +2633 None n2-2633.plc2.org sls= [] site= 634 +2634 None n2-2634.plc2.org sls= [] site= 635 +2635 None n2-2635.plc2.org sls= [] site= 636 +2636 None n2-2636.plc2.org sls= [] site= 637 +2637 None n2-2637.plc2.org sls= [] site= 638 +2638 None n2-2638.plc2.org sls= [] site= 639 +2639 None n2-2639.plc2.org sls= [] site= 640 +2640 None n2-2640.plc2.org sls= [] site= 641 +2641 None n2-2641.plc2.org sls= [] site= 642 +2642 None n2-2642.plc2.org sls= [] site= 643 +2643 None n2-2643.plc2.org sls= [] site= 644 +2644 None n2-2644.plc2.org sls= [] site= 645 +2645 None n2-2645.plc2.org sls= [] site= 646 +2646 None n2-2646.plc2.org sls= [] site= 647 +2647 None n2-2647.plc2.org sls= [] site= 648 +2648 None n2-2648.plc2.org sls= [] site= 649 +2649 None n2-2649.plc2.org sls= [] site= 650 +2650 None n2-2650.plc2.org sls= [] site= 651 +2651 None n2-2651.plc2.org sls= [] site= 652 +2652 None n2-2652.plc2.org sls= [] site= 653 +2653 None n2-2653.plc2.org sls= [] site= 654 +2654 None n2-2654.plc2.org sls= [] site= 655 +2655 None n2-2655.plc2.org sls= [] site= 656 +2656 None n2-2656.plc2.org sls= [] site= 657 +2657 None n2-2657.plc2.org sls= [] site= 658 +2658 None n2-2658.plc2.org sls= [] site= 659 +2659 None n2-2659.plc2.org sls= [] site= 660 +2660 None n2-2660.plc2.org sls= [] site= 661 +2661 None n2-2661.plc2.org sls= [] site= 662 +2662 None n2-2662.plc2.org sls= [] site= 663 +2663 None n2-2663.plc2.org sls= [] site= 664 +2664 None n2-2664.plc2.org sls= [] site= 665 +2665 None n2-2665.plc2.org sls= [] site= 666 +2666 None n2-2666.plc2.org sls= [] site= 667 +2667 None n2-2667.plc2.org sls= [] site= 668 +2668 None n2-2668.plc2.org sls= [] site= 669 +2669 None n2-2669.plc2.org sls= [] site= 670 +2670 None n2-2670.plc2.org sls= [] site= 671 +2671 None n2-2671.plc2.org sls= [] site= 672 +2672 None n2-2672.plc2.org sls= [] site= 673 +2673 None n2-2673.plc2.org sls= [] site= 674 +2674 None n2-2674.plc2.org sls= [] site= 675 +2675 None n2-2675.plc2.org sls= [] site= 676 +2676 None n2-2676.plc2.org sls= [] site= 677 +2677 None n2-2677.plc2.org sls= [] site= 678 +2678 None n2-2678.plc2.org sls= [] site= 679 +2679 None n2-2679.plc2.org sls= [] site= 680 +2680 None n2-2680.plc2.org sls= [] site= 681 +2681 None n2-2681.plc2.org sls= [] site= 682 +2682 None n2-2682.plc2.org sls= [] site= 683 +2683 None n2-2683.plc2.org sls= [] site= 684 +2684 None n2-2684.plc2.org sls= [] site= 685 +2685 None n2-2685.plc2.org sls= [] site= 686 +2686 None n2-2686.plc2.org sls= [] site= 687 +2687 None n2-2687.plc2.org sls= [] site= 688 +2688 None n2-2688.plc2.org sls= [] site= 689 +2689 None n2-2689.plc2.org sls= [] site= 690 +2690 None n2-2690.plc2.org sls= [] site= 691 +2691 None n2-2691.plc2.org sls= [] site= 692 +2692 None n2-2692.plc2.org sls= [] site= 693 +2693 None n2-2693.plc2.org sls= [] site= 694 +2694 None n2-2694.plc2.org sls= [] site= 695 +2695 None n2-2695.plc2.org sls= [] site= 696 +2696 None n2-2696.plc2.org sls= [] site= 697 +2697 None n2-2697.plc2.org sls= [] site= 698 +2698 None n2-2698.plc2.org sls= [] site= 699 +2699 None n2-2699.plc2.org sls= [] site= 700 +2700 None n2-2700.plc2.org sls= [] site= 701 +2701 None n2-2701.plc2.org sls= [] site= 702 +2702 None n2-2702.plc2.org sls= [] site= 703 +2703 None n2-2703.plc2.org sls= [] site= 704 +2704 None n2-2704.plc2.org sls= [] site= 705 +2705 None n2-2705.plc2.org sls= [] site= 706 +2706 None n2-2706.plc2.org sls= [] site= 707 +2707 None n2-2707.plc2.org sls= [] site= 708 +2708 None n2-2708.plc2.org sls= [] site= 709 +2709 None n2-2709.plc2.org sls= [] site= 710 +2710 None n2-2710.plc2.org sls= [] site= 711 +2711 None n2-2711.plc2.org sls= [] site= 712 +2712 None n2-2712.plc2.org sls= [] site= 713 +2713 None n2-2713.plc2.org sls= [] site= 714 +2714 None n2-2714.plc2.org sls= [] site= 715 +2715 None n2-2715.plc2.org sls= [] site= 716 +2716 None n2-2716.plc2.org sls= [] site= 717 +2717 None n2-2717.plc2.org sls= [] site= 718 +2718 None n2-2718.plc2.org sls= [] site= 719 +2719 None n2-2719.plc2.org sls= [] site= 720 +2720 None n2-2720.plc2.org sls= [] site= 721 +2721 None n2-2721.plc2.org sls= [] site= 722 +2722 None n2-2722.plc2.org sls= [] site= 723 +2723 None n2-2723.plc2.org sls= [] site= 724 +2724 None n2-2724.plc2.org sls= [] site= 725 +2725 None n2-2725.plc2.org sls= [] site= 726 +2726 None n2-2726.plc2.org sls= [] site= 727 +2727 None n2-2727.plc2.org sls= [] site= 728 +2728 None n2-2728.plc2.org sls= [] site= 729 +2729 None n2-2729.plc2.org sls= [] site= 730 +2730 None n2-2730.plc2.org sls= [] site= 731 +2731 None n2-2731.plc2.org sls= [] site= 732 +2732 None n2-2732.plc2.org sls= [] site= 733 +2733 None n2-2733.plc2.org sls= [] site= 734 +2734 None n2-2734.plc2.org sls= [] site= 735 +2735 None n2-2735.plc2.org sls= [] site= 736 +2736 None n2-2736.plc2.org sls= [] site= 737 +2737 None n2-2737.plc2.org sls= [] site= 738 +2738 None n2-2738.plc2.org sls= [] site= 739 +2739 None n2-2739.plc2.org sls= [] site= 740 +2740 None n2-2740.plc2.org sls= [] site= 741 +2741 None n2-2741.plc2.org sls= [] site= 742 +2742 None n2-2742.plc2.org sls= [] site= 743 +2743 None n2-2743.plc2.org sls= [] site= 744 +2744 None n2-2744.plc2.org sls= [] site= 745 +2745 None n2-2745.plc2.org sls= [] site= 746 +2746 None n2-2746.plc2.org sls= [] site= 747 +2747 None n2-2747.plc2.org sls= [] site= 748 +2748 None n2-2748.plc2.org sls= [] site= 749 +2749 None n2-2749.plc2.org sls= [] site= 750 +2750 None n2-2750.plc2.org sls= [] site= 751 +2751 None n2-2751.plc2.org sls= [] site= 752 +2752 None n2-2752.plc2.org sls= [] site= 753 +2753 None n2-2753.plc2.org sls= [] site= 754 +2754 None n2-2754.plc2.org sls= [] site= 755 +2755 None n2-2755.plc2.org sls= [] site= 756 +2756 None n2-2756.plc2.org sls= [] site= 757 +2757 None n2-2757.plc2.org sls= [] site= 758 +2758 None n2-2758.plc2.org sls= [] site= 759 +2759 None n2-2759.plc2.org sls= [] site= 760 +2760 None n2-2760.plc2.org sls= [] site= 761 +2761 None n2-2761.plc2.org sls= [] site= 762 +2762 None n2-2762.plc2.org sls= [] site= 763 +2763 None n2-2763.plc2.org sls= [] site= 764 +2764 None n2-2764.plc2.org sls= [] site= 765 +2765 None n2-2765.plc2.org sls= [] site= 766 +2766 None n2-2766.plc2.org sls= [] site= 767 +2767 None n2-2767.plc2.org sls= [] site= 768 +2768 None n2-2768.plc2.org sls= [] site= 769 +2769 None n2-2769.plc2.org sls= [] site= 770 +2770 None n2-2770.plc2.org sls= [] site= 771 +2771 None n2-2771.plc2.org sls= [] site= 772 +2772 None n2-2772.plc2.org sls= [] site= 773 +2773 None n2-2773.plc2.org sls= [] site= 774 +2774 None n2-2774.plc2.org sls= [] site= 775 +2775 None n2-2775.plc2.org sls= [] site= 776 +2776 None n2-2776.plc2.org sls= [] site= 777 +2777 None n2-2777.plc2.org sls= [] site= 778 +2778 None n2-2778.plc2.org sls= [] site= 779 +2779 None n2-2779.plc2.org sls= [] site= 780 +2780 None n2-2780.plc2.org sls= [] site= 781 +2781 None n2-2781.plc2.org sls= [] site= 782 +2782 None n2-2782.plc2.org sls= [] site= 783 +2783 None n2-2783.plc2.org sls= [] site= 784 +2784 None n2-2784.plc2.org sls= [] site= 785 +2785 None n2-2785.plc2.org sls= [] site= 786 +2786 None n2-2786.plc2.org sls= [] site= 787 +2787 None n2-2787.plc2.org sls= [] site= 788 +2788 None n2-2788.plc2.org sls= [] site= 789 +2789 None n2-2789.plc2.org sls= [] site= 790 +2790 None n2-2790.plc2.org sls= [] site= 791 +2791 None n2-2791.plc2.org sls= [] site= 792 +2792 None n2-2792.plc2.org sls= [] site= 793 +2793 None n2-2793.plc2.org sls= [] site= 794 +2794 None n2-2794.plc2.org sls= [] site= 795 +2795 None n2-2795.plc2.org sls= [] site= 796 +2796 None n2-2796.plc2.org sls= [] site= 797 +2797 None n2-2797.plc2.org sls= [] site= 798 +2798 None n2-2798.plc2.org sls= [] site= 799 +2799 None n2-2799.plc2.org sls= [] site= 800 +2800 None n2-2800.plc2.org sls= [] site= 801 +2801 None n2-2801.plc2.org sls= [] site= 802 +2802 None n2-2802.plc2.org sls= [] site= 803 +2803 None n2-2803.plc2.org sls= [] site= 804 +2804 None n2-2804.plc2.org sls= [] site= 805 +2805 None n2-2805.plc2.org sls= [] site= 806 +2806 None n2-2806.plc2.org sls= [] site= 807 +2807 None n2-2807.plc2.org sls= [] site= 808 +2808 None n2-2808.plc2.org sls= [] site= 809 +2809 None n2-2809.plc2.org sls= [] site= 810 +2810 None n2-2810.plc2.org sls= [] site= 811 +2811 None n2-2811.plc2.org sls= [] site= 812 +2812 None n2-2812.plc2.org sls= [] site= 813 +2813 None n2-2813.plc2.org sls= [] site= 814 +2814 None n2-2814.plc2.org sls= [] site= 815 +2815 None n2-2815.plc2.org sls= [] site= 816 +2816 None n2-2816.plc2.org sls= [] site= 817 +2817 None n2-2817.plc2.org sls= [] site= 818 +2818 None n2-2818.plc2.org sls= [] site= 819 +2819 None n2-2819.plc2.org sls= [] site= 820 +2820 None n2-2820.plc2.org sls= [] site= 821 +2821 None n2-2821.plc2.org sls= [] site= 822 +2822 None n2-2822.plc2.org sls= [] site= 823 +2823 None n2-2823.plc2.org sls= [] site= 824 +2824 None n2-2824.plc2.org sls= [] site= 825 +2825 None n2-2825.plc2.org sls= [] site= 826 +2826 None n2-2826.plc2.org sls= [] site= 827 +2827 None n2-2827.plc2.org sls= [] site= 828 +2828 None n2-2828.plc2.org sls= [] site= 829 +2829 None n2-2829.plc2.org sls= [] site= 830 +2830 None n2-2830.plc2.org sls= [] site= 831 +2831 None n2-2831.plc2.org sls= [] site= 832 +2832 None n2-2832.plc2.org sls= [] site= 833 +2833 None n2-2833.plc2.org sls= [] site= 834 +2834 None n2-2834.plc2.org sls= [] site= 835 +2835 None n2-2835.plc2.org sls= [] site= 836 +2836 None n2-2836.plc2.org sls= [] site= 837 +2837 None n2-2837.plc2.org sls= [] site= 838 +2838 None n2-2838.plc2.org sls= [] site= 839 +2839 None n2-2839.plc2.org sls= [] site= 840 +2840 None n2-2840.plc2.org sls= [] site= 841 +2841 None n2-2841.plc2.org sls= [] site= 842 +2842 None n2-2842.plc2.org sls= [] site= 843 +2843 None n2-2843.plc2.org sls= [] site= 844 +2844 None n2-2844.plc2.org sls= [] site= 845 +2845 None n2-2845.plc2.org sls= [] site= 846 +2846 None n2-2846.plc2.org sls= [] site= 847 +2847 None n2-2847.plc2.org sls= [] site= 848 +2848 None n2-2848.plc2.org sls= [] site= 849 +2849 None n2-2849.plc2.org sls= [] site= 850 +2850 None n2-2850.plc2.org sls= [] site= 851 +2851 None n2-2851.plc2.org sls= [] site= 852 +2852 None n2-2852.plc2.org sls= [] site= 853 +2853 None n2-2853.plc2.org sls= [] site= 854 +2854 None n2-2854.plc2.org sls= [] site= 855 +2855 None n2-2855.plc2.org sls= [] site= 856 +2856 None n2-2856.plc2.org sls= [] site= 857 +2857 None n2-2857.plc2.org sls= [] site= 858 +2858 None n2-2858.plc2.org sls= [] site= 859 +2859 None n2-2859.plc2.org sls= [] site= 860 +2860 None n2-2860.plc2.org sls= [] site= 861 +2861 None n2-2861.plc2.org sls= [] site= 862 +2862 None n2-2862.plc2.org sls= [] site= 863 +2863 None n2-2863.plc2.org sls= [] site= 864 +2864 None n2-2864.plc2.org sls= [] site= 865 +2865 None n2-2865.plc2.org sls= [] site= 866 +2866 None n2-2866.plc2.org sls= [] site= 867 +2867 None n2-2867.plc2.org sls= [] site= 868 +2868 None n2-2868.plc2.org sls= [] site= 869 +2869 None n2-2869.plc2.org sls= [] site= 870 +2870 None n2-2870.plc2.org sls= [] site= 871 +2871 None n2-2871.plc2.org sls= [] site= 872 +2872 None n2-2872.plc2.org sls= [] site= 873 +2873 None n2-2873.plc2.org sls= [] site= 874 +2874 None n2-2874.plc2.org sls= [] site= 875 +2875 None n2-2875.plc2.org sls= [] site= 876 +2876 None n2-2876.plc2.org sls= [] site= 877 +2877 None n2-2877.plc2.org sls= [] site= 878 +2878 None n2-2878.plc2.org sls= [] site= 879 +2879 None n2-2879.plc2.org sls= [] site= 880 +2880 None n2-2880.plc2.org sls= [] site= 881 +2881 None n2-2881.plc2.org sls= [] site= 882 +2882 None n2-2882.plc2.org sls= [] site= 883 +2883 None n2-2883.plc2.org sls= [] site= 884 +2884 None n2-2884.plc2.org sls= [] site= 885 +2885 None n2-2885.plc2.org sls= [] site= 886 +2886 None n2-2886.plc2.org sls= [] site= 887 +2887 None n2-2887.plc2.org sls= [] site= 888 +2888 None n2-2888.plc2.org sls= [] site= 889 +2889 None n2-2889.plc2.org sls= [] site= 890 +2890 None n2-2890.plc2.org sls= [] site= 891 +2891 None n2-2891.plc2.org sls= [] site= 892 +2892 None n2-2892.plc2.org sls= [] site= 893 +2893 None n2-2893.plc2.org sls= [] site= 894 +2894 None n2-2894.plc2.org sls= [] site= 895 +2895 None n2-2895.plc2.org sls= [] site= 896 +2896 None n2-2896.plc2.org sls= [] site= 897 +2897 None n2-2897.plc2.org sls= [] site= 898 +2898 None n2-2898.plc2.org sls= [] site= 899 +2899 None n2-2899.plc2.org sls= [] site= 900 +2900 None n2-2900.plc2.org sls= [] site= 901 +2901 None n2-2901.plc2.org sls= [] site= 902 +2902 None n2-2902.plc2.org sls= [] site= 903 +2903 None n2-2903.plc2.org sls= [] site= 904 +2904 None n2-2904.plc2.org sls= [] site= 905 +2905 None n2-2905.plc2.org sls= [] site= 906 +2906 None n2-2906.plc2.org sls= [] site= 907 +2907 None n2-2907.plc2.org sls= [] site= 908 +2908 None n2-2908.plc2.org sls= [] site= 909 +2909 None n2-2909.plc2.org sls= [] site= 910 +2910 None n2-2910.plc2.org sls= [] site= 911 +2911 None n2-2911.plc2.org sls= [] site= 912 +2912 None n2-2912.plc2.org sls= [] site= 913 +2913 None n2-2913.plc2.org sls= [] site= 914 +2914 None n2-2914.plc2.org sls= [] site= 915 +2915 None n2-2915.plc2.org sls= [] site= 916 +2916 None n2-2916.plc2.org sls= [] site= 917 +2917 None n2-2917.plc2.org sls= [] site= 918 +2918 None n2-2918.plc2.org sls= [] site= 919 +2919 None n2-2919.plc2.org sls= [] site= 920 +2920 None n2-2920.plc2.org sls= [] site= 921 +2921 None n2-2921.plc2.org sls= [] site= 922 +2922 None n2-2922.plc2.org sls= [] site= 923 +2923 None n2-2923.plc2.org sls= [] site= 924 +2924 None n2-2924.plc2.org sls= [] site= 925 +2925 None n2-2925.plc2.org sls= [] site= 926 +2926 None n2-2926.plc2.org sls= [] site= 927 +2927 None n2-2927.plc2.org sls= [] site= 928 +2928 None n2-2928.plc2.org sls= [] site= 929 +2929 None n2-2929.plc2.org sls= [] site= 930 +2930 None n2-2930.plc2.org sls= [] site= 931 +2931 None n2-2931.plc2.org sls= [] site= 932 +2932 None n2-2932.plc2.org sls= [] site= 933 +2933 None n2-2933.plc2.org sls= [] site= 934 +2934 None n2-2934.plc2.org sls= [] site= 935 +2935 None n2-2935.plc2.org sls= [] site= 936 +2936 None n2-2936.plc2.org sls= [] site= 937 +2937 None n2-2937.plc2.org sls= [] site= 938 +2938 None n2-2938.plc2.org sls= [] site= 939 +2939 None n2-2939.plc2.org sls= [] site= 940 +2940 None n2-2940.plc2.org sls= [] site= 941 +2941 None n2-2941.plc2.org sls= [] site= 942 +2942 None n2-2942.plc2.org sls= [] site= 943 +2943 None n2-2943.plc2.org sls= [] site= 944 +2944 None n2-2944.plc2.org sls= [] site= 945 +2945 None n2-2945.plc2.org sls= [] site= 946 +2946 None n2-2946.plc2.org sls= [] site= 947 +2947 None n2-2947.plc2.org sls= [] site= 948 +2948 None n2-2948.plc2.org sls= [] site= 949 +2949 None n2-2949.plc2.org sls= [] site= 950 +2950 None n2-2950.plc2.org sls= [] site= 951 +2951 None n2-2951.plc2.org sls= [] site= 952 +2952 None n2-2952.plc2.org sls= [] site= 953 +2953 None n2-2953.plc2.org sls= [] site= 954 +2954 None n2-2954.plc2.org sls= [] site= 955 +2955 None n2-2955.plc2.org sls= [] site= 956 +2956 None n2-2956.plc2.org sls= [] site= 957 +2957 None n2-2957.plc2.org sls= [] site= 958 +2958 None n2-2958.plc2.org sls= [] site= 959 +2959 None n2-2959.plc2.org sls= [] site= 960 +2960 None n2-2960.plc2.org sls= [] site= 961 +2961 None n2-2961.plc2.org sls= [] site= 962 +2962 None n2-2962.plc2.org sls= [] site= 963 +2963 None n2-2963.plc2.org sls= [] site= 964 +2964 None n2-2964.plc2.org sls= [] site= 965 +2965 None n2-2965.plc2.org sls= [] site= 966 +2966 None n2-2966.plc2.org sls= [] site= 967 +2967 None n2-2967.plc2.org sls= [] site= 968 +2968 None n2-2968.plc2.org sls= [] site= 969 +2969 None n2-2969.plc2.org sls= [] site= 970 +2970 None n2-2970.plc2.org sls= [] site= 971 +2971 None n2-2971.plc2.org sls= [] site= 972 +2972 None n2-2972.plc2.org sls= [] site= 973 +2973 None n2-2973.plc2.org sls= [] site= 974 +2974 None n2-2974.plc2.org sls= [] site= 975 +2975 None n2-2975.plc2.org sls= [] site= 976 +2976 None n2-2976.plc2.org sls= [] site= 977 +2977 None n2-2977.plc2.org sls= [] site= 978 +2978 None n2-2978.plc2.org sls= [] site= 979 +2979 None n2-2979.plc2.org sls= [] site= 980 +2980 None n2-2980.plc2.org sls= [] site= 981 +2981 None n2-2981.plc2.org sls= [] site= 982 +2982 None n2-2982.plc2.org sls= [] site= 983 +2983 None n2-2983.plc2.org sls= [] site= 984 +2984 None n2-2984.plc2.org sls= [] site= 985 +2985 None n2-2985.plc2.org sls= [] site= 986 +2986 None n2-2986.plc2.org sls= [] site= 987 +2987 None n2-2987.plc2.org sls= [] site= 988 +2988 None n2-2988.plc2.org sls= [] site= 989 +2989 None n2-2989.plc2.org sls= [] site= 990 +2990 None n2-2990.plc2.org sls= [] site= 991 +2991 None n2-2991.plc2.org sls= [] site= 992 +2992 None n2-2992.plc2.org sls= [] site= 993 +2993 None n2-2993.plc2.org sls= [] site= 994 +2994 None n2-2994.plc2.org sls= [] site= 995 +2995 None n2-2995.plc2.org sls= [] site= 996 +2996 None n2-2996.plc2.org sls= [] site= 997 +2997 None n2-2997.plc2.org sls= [] site= 998 +2998 None n2-2998.plc2.org sls= [] site= 999 +2999 None n2-2999.plc2.org sls= [] site= 1000 +3000 None n2-3000.plc2.org sls= [] site= 1001 +3001 1 n1-001.plc1.org sls= [3] site= 1003 +3002 1 n1-002.plc1.org sls= [3, 4] site= 1004 +3003 1 n1-003.plc1.org sls= [3, 4, 5] site= 1005 +3004 1 n1-004.plc1.org sls= [4, 5, 6] site= 1006 +3005 1 n1-005.plc1.org sls= [5, 6, 7] site= 1007 +3006 1 n1-006.plc1.org sls= [6, 7, 8] site= 1008 +3007 1 n1-007.plc1.org sls= [7, 8, 9] site= 1009 +3008 1 n1-008.plc1.org sls= [8, 9, 10] site= 1010 +3009 1 n1-009.plc1.org sls= [9, 10, 11] site= 1011 +3010 1 n1-010.plc1.org sls= [10, 11, 12] site= 1012 +3011 1 n1-011.plc1.org sls= [11, 12, 13] site= 1013 +3012 1 n1-012.plc1.org sls= [12, 13, 14] site= 1014 +3013 1 n1-013.plc1.org sls= [13, 14, 15] site= 1015 +3014 1 n1-014.plc1.org sls= [14, 15, 16] site= 1016 +3015 1 n1-015.plc1.org sls= [15, 16, 17] site= 1017 +3016 1 n1-016.plc1.org sls= [16, 17, 18] site= 1018 +3017 1 n1-017.plc1.org sls= [17, 18, 19] site= 1019 +3018 1 n1-018.plc1.org sls= [18, 19, 20] site= 1020 +3019 1 n1-019.plc1.org sls= [19, 20, 21] site= 1021 +3020 1 n1-020.plc1.org sls= [20, 21, 22] site= 1022 +3021 1 n1-021.plc1.org sls= [21, 22, 23] site= 1023 +3022 1 n1-022.plc1.org sls= [22, 23, 24] site= 1024 +3023 1 n1-023.plc1.org sls= [23, 24, 25] site= 1025 +3024 1 n1-024.plc1.org sls= [24, 25, 26] site= 1026 +3025 1 n1-025.plc1.org sls= [25, 26, 27] site= 1027 +3026 1 n1-026.plc1.org sls= [26, 27, 28] site= 1028 +3027 1 n1-027.plc1.org sls= [27, 28, 29] site= 1029 +3028 1 n1-028.plc1.org sls= [28, 29, 30] site= 1030 +3029 1 n1-029.plc1.org sls= [29, 30, 31] site= 1031 +3030 1 n1-030.plc1.org sls= [30, 31, 32] site= 1032 +3031 1 n1-031.plc1.org sls= [31, 32, 33] site= 1033 +3032 1 n1-032.plc1.org sls= [32, 33, 34] site= 1034 +3033 1 n1-033.plc1.org sls= [33, 34, 35] site= 1035 +3034 1 n1-034.plc1.org sls= [34, 35, 36] site= 1036 +3035 1 n1-035.plc1.org sls= [35, 36, 37] site= 1037 +3036 1 n1-036.plc1.org sls= [36, 37, 38] site= 1038 +3037 1 n1-037.plc1.org sls= [37, 38, 39] site= 1039 +3038 1 n1-038.plc1.org sls= [38, 39, 40] site= 1040 +3039 1 n1-039.plc1.org sls= [39, 40, 41] site= 1041 +3040 1 n1-040.plc1.org sls= [40, 41, 42] site= 1042 +3041 1 n1-041.plc1.org sls= [41, 42, 43] site= 1043 +3042 1 n1-042.plc1.org sls= [42, 43, 44] site= 1044 +3043 1 n1-043.plc1.org sls= [43, 44, 45] site= 1045 +3044 1 n1-044.plc1.org sls= [44, 45, 46] site= 1046 +3045 1 n1-045.plc1.org sls= [45, 46, 47] site= 1047 +3046 1 n1-046.plc1.org sls= [46, 47, 48] site= 1048 +3047 1 n1-047.plc1.org sls= [47, 48, 49] site= 1049 +3048 1 n1-048.plc1.org sls= [48, 49, 50] site= 1050 +3049 1 n1-049.plc1.org sls= [49, 50, 51] site= 1051 +3050 1 n1-050.plc1.org sls= [50, 51, 52] site= 1052 +3051 1 n1-051.plc1.org sls= [51, 52, 53] site= 1053 +3052 1 n1-052.plc1.org sls= [52, 53, 54] site= 1054 +3053 1 n1-053.plc1.org sls= [53, 54, 55] site= 1055 +3054 1 n1-054.plc1.org sls= [54, 55, 56] site= 1056 +3055 1 n1-055.plc1.org sls= [55, 56, 57] site= 1057 +3056 1 n1-056.plc1.org sls= [56, 57, 58] site= 1058 +3057 1 n1-057.plc1.org sls= [57, 58, 59] site= 1059 +3058 1 n1-058.plc1.org sls= [58, 59, 60] site= 1060 +3059 1 n1-059.plc1.org sls= [59, 60, 61] site= 1061 +3060 1 n1-060.plc1.org sls= [60, 61, 62] site= 1062 +3061 1 n1-061.plc1.org sls= [61, 62, 63] site= 1063 +3062 1 n1-062.plc1.org sls= [62, 63, 64] site= 1064 +3063 1 n1-063.plc1.org sls= [63, 64, 65] site= 1065 +3064 1 n1-064.plc1.org sls= [64, 65, 66] site= 1066 +3065 1 n1-065.plc1.org sls= [65, 66, 67] site= 1067 +3066 1 n1-066.plc1.org sls= [66, 67, 68] site= 1068 +3067 1 n1-067.plc1.org sls= [67, 68, 69] site= 1069 +3068 1 n1-068.plc1.org sls= [68, 69, 70] site= 1070 +3069 1 n1-069.plc1.org sls= [69, 70, 71] site= 1071 +3070 1 n1-070.plc1.org sls= [70, 71, 72] site= 1072 +3071 1 n1-071.plc1.org sls= [71, 72, 73] site= 1073 +3072 1 n1-072.plc1.org sls= [72, 73, 74] site= 1074 +3073 1 n1-073.plc1.org sls= [73, 74, 75] site= 1075 +3074 1 n1-074.plc1.org sls= [74, 75, 76] site= 1076 +3075 1 n1-075.plc1.org sls= [75, 76, 77] site= 1077 +3076 1 n1-076.plc1.org sls= [76, 77, 78] site= 1078 +3077 1 n1-077.plc1.org sls= [77, 78, 79] site= 1079 +3078 1 n1-078.plc1.org sls= [78, 79, 80] site= 1080 +3079 1 n1-079.plc1.org sls= [79, 80, 81] site= 1081 +3080 1 n1-080.plc1.org sls= [80, 81, 82] site= 1082 +3081 1 n1-081.plc1.org sls= [81, 82, 83] site= 1083 +3082 1 n1-082.plc1.org sls= [82, 83, 84] site= 1084 +3083 1 n1-083.plc1.org sls= [83, 84, 85] site= 1085 +3084 1 n1-084.plc1.org sls= [84, 85, 86] site= 1086 +3085 1 n1-085.plc1.org sls= [85, 86, 87] site= 1087 +3086 1 n1-086.plc1.org sls= [86, 87, 88] site= 1088 +3087 1 n1-087.plc1.org sls= [87, 88, 89] site= 1089 +3088 1 n1-088.plc1.org sls= [88, 89, 90] site= 1090 +3089 1 n1-089.plc1.org sls= [89, 90, 91] site= 1091 +3090 1 n1-090.plc1.org sls= [90, 91, 92] site= 1092 +3091 1 n1-091.plc1.org sls= [91, 92, 93] site= 1093 +3092 1 n1-092.plc1.org sls= [92, 93, 94] site= 1094 +3093 1 n1-093.plc1.org sls= [93, 94, 95] site= 1095 +3094 1 n1-094.plc1.org sls= [94, 95, 96] site= 1096 +3095 1 n1-095.plc1.org sls= [95, 96, 97] site= 1097 +3096 1 n1-096.plc1.org sls= [96, 97, 98] site= 1098 +3097 1 n1-097.plc1.org sls= [97, 98, 99] site= 1099 +3098 1 n1-098.plc1.org sls= [98, 99, 100] site= 1100 +3099 1 n1-099.plc1.org sls= [99, 100, 101] site= 1101 +3100 1 n1-100.plc1.org sls= [100, 101, 102] site= 1102 +3101 1 n1-101.plc1.org sls= [101, 102, 103] site= 1103 +3102 1 n1-102.plc1.org sls= [102, 103, 104] site= 1104 +3103 1 n1-103.plc1.org sls= [103, 104, 105] site= 1105 +3104 1 n1-104.plc1.org sls= [104, 105, 106] site= 1106 +3105 1 n1-105.plc1.org sls= [105, 106, 107] site= 1107 +3106 1 n1-106.plc1.org sls= [106, 107, 108] site= 1108 +3107 1 n1-107.plc1.org sls= [107, 108, 109] site= 1109 +3108 1 n1-108.plc1.org sls= [108, 109, 110] site= 1110 +3109 1 n1-109.plc1.org sls= [109, 110, 111] site= 1111 +3110 1 n1-110.plc1.org sls= [110, 111, 112] site= 1112 +3111 1 n1-111.plc1.org sls= [111, 112, 113] site= 1113 +3112 1 n1-112.plc1.org sls= [112, 113, 114] site= 1114 +3113 1 n1-113.plc1.org sls= [113, 114, 115] site= 1115 +3114 1 n1-114.plc1.org sls= [114, 115, 116] site= 1116 +3115 1 n1-115.plc1.org sls= [115, 116, 117] site= 1117 +3116 1 n1-116.plc1.org sls= [116, 117, 118] site= 1118 +3117 1 n1-117.plc1.org sls= [117, 118, 119] site= 1119 +3118 1 n1-118.plc1.org sls= [118, 119, 120] site= 1120 +3119 1 n1-119.plc1.org sls= [119, 120, 121] site= 1121 +3120 1 n1-120.plc1.org sls= [120, 121, 122] site= 1122 +3121 1 n1-121.plc1.org sls= [121, 122, 123] site= 1123 +3122 1 n1-122.plc1.org sls= [122, 123, 124] site= 1124 +3123 1 n1-123.plc1.org sls= [123, 124, 125] site= 1125 +3124 1 n1-124.plc1.org sls= [124, 125, 126] site= 1126 +3125 1 n1-125.plc1.org sls= [125, 126, 127] site= 1127 +3126 1 n1-126.plc1.org sls= [126, 127, 128] site= 1128 +3127 1 n1-127.plc1.org sls= [127, 128, 129] site= 1129 +3128 1 n1-128.plc1.org sls= [128, 129, 130] site= 1130 +3129 1 n1-129.plc1.org sls= [129, 130, 131] site= 1131 +3130 1 n1-130.plc1.org sls= [130, 131, 132] site= 1132 +3131 1 n1-131.plc1.org sls= [131, 132, 133] site= 1133 +3132 1 n1-132.plc1.org sls= [132, 133, 134] site= 1134 +3133 1 n1-133.plc1.org sls= [133, 134, 135] site= 1135 +3134 1 n1-134.plc1.org sls= [134, 135, 136] site= 1136 +3135 1 n1-135.plc1.org sls= [135, 136, 137] site= 1137 +3136 1 n1-136.plc1.org sls= [136, 137, 138] site= 1138 +3137 1 n1-137.plc1.org sls= [137, 138, 139] site= 1139 +3138 1 n1-138.plc1.org sls= [138, 139, 140] site= 1140 +3139 1 n1-139.plc1.org sls= [139, 140, 141] site= 1141 +3140 1 n1-140.plc1.org sls= [140, 141, 142] site= 1142 +3141 1 n1-141.plc1.org sls= [141, 142, 143] site= 1143 +3142 1 n1-142.plc1.org sls= [142, 143, 144] site= 1144 +3143 1 n1-143.plc1.org sls= [143, 144, 145] site= 1145 +3144 1 n1-144.plc1.org sls= [144, 145, 146] site= 1146 +3145 1 n1-145.plc1.org sls= [145, 146, 147] site= 1147 +3146 1 n1-146.plc1.org sls= [146, 147, 148] site= 1148 +3147 1 n1-147.plc1.org sls= [147, 148, 149] site= 1149 +3148 1 n1-148.plc1.org sls= [148, 149, 150] site= 1150 +3149 1 n1-149.plc1.org sls= [149, 150, 151] site= 1151 +3150 1 n1-150.plc1.org sls= [150, 151, 152] site= 1152 +3151 1 n1-151.plc1.org sls= [151, 152, 153] site= 1153 +3152 1 n1-152.plc1.org sls= [152, 153, 154] site= 1154 +3153 1 n1-153.plc1.org sls= [153, 154, 155] site= 1155 +3154 1 n1-154.plc1.org sls= [154, 155, 156] site= 1156 +3155 1 n1-155.plc1.org sls= [155, 156, 157] site= 1157 +3156 1 n1-156.plc1.org sls= [156, 157, 158] site= 1158 +3157 1 n1-157.plc1.org sls= [157, 158, 159] site= 1159 +3158 1 n1-158.plc1.org sls= [158, 159, 160] site= 1160 +3159 1 n1-159.plc1.org sls= [159, 160, 161] site= 1161 +3160 1 n1-160.plc1.org sls= [160, 161, 162] site= 1162 +3161 1 n1-161.plc1.org sls= [161, 162, 163] site= 1163 +3162 1 n1-162.plc1.org sls= [162, 163, 164] site= 1164 +3163 1 n1-163.plc1.org sls= [163, 164, 165] site= 1165 +3164 1 n1-164.plc1.org sls= [164, 165, 166] site= 1166 +3165 1 n1-165.plc1.org sls= [165, 166, 167] site= 1167 +3166 1 n1-166.plc1.org sls= [166, 167, 168] site= 1168 +3167 1 n1-167.plc1.org sls= [167, 168, 169] site= 1169 +3168 1 n1-168.plc1.org sls= [168, 169, 170] site= 1170 +3169 1 n1-169.plc1.org sls= [169, 170, 171] site= 1171 +3170 1 n1-170.plc1.org sls= [170, 171, 172] site= 1172 +3171 1 n1-171.plc1.org sls= [171, 172, 173] site= 1173 +3172 1 n1-172.plc1.org sls= [172, 173, 174] site= 1174 +3173 1 n1-173.plc1.org sls= [173, 174, 175] site= 1175 +3174 1 n1-174.plc1.org sls= [174, 175, 176] site= 1176 +3175 1 n1-175.plc1.org sls= [175, 176, 177] site= 1177 +3176 1 n1-176.plc1.org sls= [176, 177, 178] site= 1178 +3177 1 n1-177.plc1.org sls= [177, 178, 179] site= 1179 +3178 1 n1-178.plc1.org sls= [178, 179, 180] site= 1180 +3179 1 n1-179.plc1.org sls= [179, 180, 181] site= 1181 +3180 1 n1-180.plc1.org sls= [180, 181, 182] site= 1182 +3181 1 n1-181.plc1.org sls= [181, 182, 183] site= 1183 +3182 1 n1-182.plc1.org sls= [182, 183, 184] site= 1184 +3183 1 n1-183.plc1.org sls= [183, 184, 185] site= 1185 +3184 1 n1-184.plc1.org sls= [184, 185, 186] site= 1186 +3185 1 n1-185.plc1.org sls= [185, 186, 187] site= 1187 +3186 1 n1-186.plc1.org sls= [186, 187, 188] site= 1188 +3187 1 n1-187.plc1.org sls= [187, 188, 189] site= 1189 +3188 1 n1-188.plc1.org sls= [188, 189, 190] site= 1190 +3189 1 n1-189.plc1.org sls= [189, 190, 191] site= 1191 +3190 1 n1-190.plc1.org sls= [190, 191, 192] site= 1192 +3191 1 n1-191.plc1.org sls= [191, 192, 193] site= 1193 +3192 1 n1-192.plc1.org sls= [192, 193, 194] site= 1194 +3193 1 n1-193.plc1.org sls= [193, 194, 195] site= 1195 +3194 1 n1-194.plc1.org sls= [194, 195, 196] site= 1196 +3195 1 n1-195.plc1.org sls= [195, 196, 197] site= 1197 +3196 1 n1-196.plc1.org sls= [196, 197, 198] site= 1198 +3197 1 n1-197.plc1.org sls= [197, 198, 199] site= 1199 +3198 1 n1-198.plc1.org sls= [198, 199, 200] site= 1200 +3199 1 n1-199.plc1.org sls= [199, 200, 201] site= 1201 +3200 1 n1-200.plc1.org sls= [200, 201, 202] site= 1202 +3201 1 n1-201.plc1.org sls= [201, 202, 203] site= 1203 +3202 1 n1-202.plc1.org sls= [202, 203, 204] site= 1204 +3203 1 n1-203.plc1.org sls= [203, 204, 205] site= 1205 +3204 1 n1-204.plc1.org sls= [204, 205, 206] site= 1206 +3205 1 n1-205.plc1.org sls= [205, 206, 207] site= 1207 +3206 1 n1-206.plc1.org sls= [206, 207, 208] site= 1208 +3207 1 n1-207.plc1.org sls= [207, 208, 209] site= 1209 +3208 1 n1-208.plc1.org sls= [208, 209, 210] site= 1210 +3209 1 n1-209.plc1.org sls= [209, 210, 211] site= 1211 +3210 1 n1-210.plc1.org sls= [210, 211, 212] site= 1212 +3211 1 n1-211.plc1.org sls= [211, 212, 213] site= 1213 +3212 1 n1-212.plc1.org sls= [212, 213, 214] site= 1214 +3213 1 n1-213.plc1.org sls= [213, 214, 215] site= 1215 +3214 1 n1-214.plc1.org sls= [214, 215, 216] site= 1216 +3215 1 n1-215.plc1.org sls= [215, 216, 217] site= 1217 +3216 1 n1-216.plc1.org sls= [216, 217, 218] site= 1218 +3217 1 n1-217.plc1.org sls= [217, 218, 219] site= 1219 +3218 1 n1-218.plc1.org sls= [218, 219, 220] site= 1220 +3219 1 n1-219.plc1.org sls= [219, 220, 221] site= 1221 +3220 1 n1-220.plc1.org sls= [220, 221, 222] site= 1222 +3221 1 n1-221.plc1.org sls= [221, 222, 223] site= 1223 +3222 1 n1-222.plc1.org sls= [222, 223, 224] site= 1224 +3223 1 n1-223.plc1.org sls= [223, 224, 225] site= 1225 +3224 1 n1-224.plc1.org sls= [224, 225, 226] site= 1226 +3225 1 n1-225.plc1.org sls= [225, 226, 227] site= 1227 +3226 1 n1-226.plc1.org sls= [226, 227, 228] site= 1228 +3227 1 n1-227.plc1.org sls= [227, 228, 229] site= 1229 +3228 1 n1-228.plc1.org sls= [228, 229, 230] site= 1230 +3229 1 n1-229.plc1.org sls= [229, 230, 231] site= 1231 +3230 1 n1-230.plc1.org sls= [230, 231, 232] site= 1232 +3231 1 n1-231.plc1.org sls= [231, 232, 233] site= 1233 +3232 1 n1-232.plc1.org sls= [232, 233, 234] site= 1234 +3233 1 n1-233.plc1.org sls= [233, 234, 235] site= 1235 +3234 1 n1-234.plc1.org sls= [234, 235, 236] site= 1236 +3235 1 n1-235.plc1.org sls= [235, 236, 237] site= 1237 +3236 1 n1-236.plc1.org sls= [236, 237, 238] site= 1238 +3237 1 n1-237.plc1.org sls= [237, 238, 239] site= 1239 +3238 1 n1-238.plc1.org sls= [238, 239, 240] site= 1240 +3239 1 n1-239.plc1.org sls= [239, 240, 241] site= 1241 +3240 1 n1-240.plc1.org sls= [240, 241, 242] site= 1242 +3241 1 n1-241.plc1.org sls= [241, 242, 243] site= 1243 +3242 1 n1-242.plc1.org sls= [242, 243, 244] site= 1244 +3243 1 n1-243.plc1.org sls= [243, 244, 245] site= 1245 +3244 1 n1-244.plc1.org sls= [244, 245, 246] site= 1246 +3245 1 n1-245.plc1.org sls= [245, 246, 247] site= 1247 +3246 1 n1-246.plc1.org sls= [246, 247, 248] site= 1248 +3247 1 n1-247.plc1.org sls= [247, 248, 249] site= 1249 +3248 1 n1-248.plc1.org sls= [248, 249, 250] site= 1250 +3249 1 n1-249.plc1.org sls= [249, 250, 251] site= 1251 +3250 1 n1-250.plc1.org sls= [250, 251, 252] site= 1252 +3251 1 n1-251.plc1.org sls= [251, 252, 253] site= 1253 +3252 1 n1-252.plc1.org sls= [252, 253, 254] site= 1254 +3253 1 n1-253.plc1.org sls= [253, 254, 255] site= 1255 +3254 1 n1-254.plc1.org sls= [254, 255, 256] site= 1256 +3255 1 n1-255.plc1.org sls= [255, 256, 257] site= 1257 +3256 1 n1-256.plc1.org sls= [256, 257, 258] site= 1258 +3257 1 n1-257.plc1.org sls= [257, 258, 259] site= 1259 +3258 1 n1-258.plc1.org sls= [258, 259, 260] site= 1260 +3259 1 n1-259.plc1.org sls= [259, 260, 261] site= 1261 +3260 1 n1-260.plc1.org sls= [260, 261, 262] site= 1262 +3261 1 n1-261.plc1.org sls= [261, 262, 263] site= 1263 +3262 1 n1-262.plc1.org sls= [262, 263, 264] site= 1264 +3263 1 n1-263.plc1.org sls= [263, 264, 265] site= 1265 +3264 1 n1-264.plc1.org sls= [264, 265, 266] site= 1266 +3265 1 n1-265.plc1.org sls= [265, 266, 267] site= 1267 +3266 1 n1-266.plc1.org sls= [266, 267, 268] site= 1268 +3267 1 n1-267.plc1.org sls= [267, 268, 269] site= 1269 +3268 1 n1-268.plc1.org sls= [268, 269, 270] site= 1270 +3269 1 n1-269.plc1.org sls= [269, 270, 271] site= 1271 +3270 1 n1-270.plc1.org sls= [270, 271, 272] site= 1272 +3271 1 n1-271.plc1.org sls= [271, 272, 273] site= 1273 +3272 1 n1-272.plc1.org sls= [272, 273, 274] site= 1274 +3273 1 n1-273.plc1.org sls= [273, 274, 275] site= 1275 +3274 1 n1-274.plc1.org sls= [274, 275, 276] site= 1276 +3275 1 n1-275.plc1.org sls= [275, 276, 277] site= 1277 +3276 1 n1-276.plc1.org sls= [276, 277, 278] site= 1278 +3277 1 n1-277.plc1.org sls= [277, 278, 279] site= 1279 +3278 1 n1-278.plc1.org sls= [278, 279, 280] site= 1280 +3279 1 n1-279.plc1.org sls= [279, 280, 281] site= 1281 +3280 1 n1-280.plc1.org sls= [280, 281, 282] site= 1282 +3281 1 n1-281.plc1.org sls= [281, 282, 283] site= 1283 +3282 1 n1-282.plc1.org sls= [282, 283, 284] site= 1284 +3283 1 n1-283.plc1.org sls= [283, 284, 285] site= 1285 +3284 1 n1-284.plc1.org sls= [284, 285, 286] site= 1286 +3285 1 n1-285.plc1.org sls= [285, 286, 287] site= 1287 +3286 1 n1-286.plc1.org sls= [286, 287, 288] site= 1288 +3287 1 n1-287.plc1.org sls= [287, 288, 289] site= 1289 +3288 1 n1-288.plc1.org sls= [288, 289, 290] site= 1290 +3289 1 n1-289.plc1.org sls= [289, 290, 291] site= 1291 +3290 1 n1-290.plc1.org sls= [290, 291, 292] site= 1292 +3291 1 n1-291.plc1.org sls= [291, 292, 293] site= 1293 +3292 1 n1-292.plc1.org sls= [292, 293, 294] site= 1294 +3293 1 n1-293.plc1.org sls= [293, 294, 295] site= 1295 +3294 1 n1-294.plc1.org sls= [294, 295, 296] site= 1296 +3295 1 n1-295.plc1.org sls= [295, 296, 297] site= 1297 +3296 1 n1-296.plc1.org sls= [296, 297, 298] site= 1298 +3297 1 n1-297.plc1.org sls= [297, 298, 299] site= 1299 +3298 1 n1-298.plc1.org sls= [298, 299, 300] site= 1300 +3299 1 n1-299.plc1.org sls= [299, 300, 301] site= 1301 +3300 1 n1-300.plc1.org sls= [300, 301, 302] site= 1302 +3301 1 n1-301.plc1.org sls= [301, 302, 303] site= 1303 +3302 1 n1-302.plc1.org sls= [302, 303, 304] site= 1304 +3303 1 n1-303.plc1.org sls= [303, 304, 305] site= 1305 +3304 1 n1-304.plc1.org sls= [304, 305, 306] site= 1306 +3305 1 n1-305.plc1.org sls= [305, 306, 307] site= 1307 +3306 1 n1-306.plc1.org sls= [306, 307, 308] site= 1308 +3307 1 n1-307.plc1.org sls= [307, 308, 309] site= 1309 +3308 1 n1-308.plc1.org sls= [308, 309, 310] site= 1310 +3309 1 n1-309.plc1.org sls= [309, 310, 311] site= 1311 +3310 1 n1-310.plc1.org sls= [310, 311, 312] site= 1312 +3311 1 n1-311.plc1.org sls= [311, 312, 313] site= 1313 +3312 1 n1-312.plc1.org sls= [312, 313, 314] site= 1314 +3313 1 n1-313.plc1.org sls= [313, 314, 315] site= 1315 +3314 1 n1-314.plc1.org sls= [314, 315, 316] site= 1316 +3315 1 n1-315.plc1.org sls= [315, 316, 317] site= 1317 +3316 1 n1-316.plc1.org sls= [316, 317, 318] site= 1318 +3317 1 n1-317.plc1.org sls= [317, 318, 319] site= 1319 +3318 1 n1-318.plc1.org sls= [318, 319, 320] site= 1320 +3319 1 n1-319.plc1.org sls= [319, 320, 321] site= 1321 +3320 1 n1-320.plc1.org sls= [320, 321, 322] site= 1322 +3321 1 n1-321.plc1.org sls= [321, 322, 323] site= 1323 +3322 1 n1-322.plc1.org sls= [322, 323, 324] site= 1324 +3323 1 n1-323.plc1.org sls= [323, 324, 325] site= 1325 +3324 1 n1-324.plc1.org sls= [324, 325, 326] site= 1326 +3325 1 n1-325.plc1.org sls= [325, 326, 327] site= 1327 +3326 1 n1-326.plc1.org sls= [326, 327, 328] site= 1328 +3327 1 n1-327.plc1.org sls= [327, 328, 329] site= 1329 +3328 1 n1-328.plc1.org sls= [328, 329, 330] site= 1330 +3329 1 n1-329.plc1.org sls= [329, 330, 331] site= 1331 +3330 1 n1-330.plc1.org sls= [330, 331, 332] site= 1332 +3331 1 n1-331.plc1.org sls= [331, 332, 333] site= 1333 +3332 1 n1-332.plc1.org sls= [332, 333, 334] site= 1334 +3333 1 n1-333.plc1.org sls= [333, 334, 335] site= 1335 +3334 1 n1-334.plc1.org sls= [334, 335, 336] site= 1336 +3335 1 n1-335.plc1.org sls= [335, 336, 337] site= 1337 +3336 1 n1-336.plc1.org sls= [336, 337, 338] site= 1338 +3337 1 n1-337.plc1.org sls= [337, 338, 339] site= 1339 +3338 1 n1-338.plc1.org sls= [338, 339, 340] site= 1340 +3339 1 n1-339.plc1.org sls= [339, 340, 341] site= 1341 +3340 1 n1-340.plc1.org sls= [340, 341, 342] site= 1342 +3341 1 n1-341.plc1.org sls= [341, 342, 343] site= 1343 +3342 1 n1-342.plc1.org sls= [342, 343, 344] site= 1344 +3343 1 n1-343.plc1.org sls= [343, 344, 345] site= 1345 +3344 1 n1-344.plc1.org sls= [344, 345, 346] site= 1346 +3345 1 n1-345.plc1.org sls= [345, 346, 347] site= 1347 +3346 1 n1-346.plc1.org sls= [346, 347, 348] site= 1348 +3347 1 n1-347.plc1.org sls= [347, 348, 349] site= 1349 +3348 1 n1-348.plc1.org sls= [348, 349, 350] site= 1350 +3349 1 n1-349.plc1.org sls= [349, 350, 351] site= 1351 +3350 1 n1-350.plc1.org sls= [350, 351, 352] site= 1352 +3351 1 n1-351.plc1.org sls= [351, 352, 353] site= 1353 +3352 1 n1-352.plc1.org sls= [352, 353, 354] site= 1354 +3353 1 n1-353.plc1.org sls= [353, 354, 355] site= 1355 +3354 1 n1-354.plc1.org sls= [354, 355, 356] site= 1356 +3355 1 n1-355.plc1.org sls= [355, 356, 357] site= 1357 +3356 1 n1-356.plc1.org sls= [356, 357, 358] site= 1358 +3357 1 n1-357.plc1.org sls= [357, 358, 359] site= 1359 +3358 1 n1-358.plc1.org sls= [358, 359, 360] site= 1360 +3359 1 n1-359.plc1.org sls= [359, 360, 361] site= 1361 +3360 1 n1-360.plc1.org sls= [360, 361, 362] site= 1362 +3361 1 n1-361.plc1.org sls= [361, 362, 363] site= 1363 +3362 1 n1-362.plc1.org sls= [362, 363, 364] site= 1364 +3363 1 n1-363.plc1.org sls= [363, 364, 365] site= 1365 +3364 1 n1-364.plc1.org sls= [364, 365, 366] site= 1366 +3365 1 n1-365.plc1.org sls= [365, 366, 367] site= 1367 +3366 1 n1-366.plc1.org sls= [366, 367, 368] site= 1368 +3367 1 n1-367.plc1.org sls= [367, 368, 369] site= 1369 +3368 1 n1-368.plc1.org sls= [368, 369, 370] site= 1370 +3369 1 n1-369.plc1.org sls= [369, 370, 371] site= 1371 +3370 1 n1-370.plc1.org sls= [370, 371, 372] site= 1372 +3371 1 n1-371.plc1.org sls= [371, 372, 373] site= 1373 +3372 1 n1-372.plc1.org sls= [372, 373, 374] site= 1374 +3373 1 n1-373.plc1.org sls= [373, 374, 375] site= 1375 +3374 1 n1-374.plc1.org sls= [374, 375, 376] site= 1376 +3375 1 n1-375.plc1.org sls= [375, 376, 377] site= 1377 +3376 1 n1-376.plc1.org sls= [376, 377, 378] site= 1378 +3377 1 n1-377.plc1.org sls= [377, 378, 379] site= 1379 +3378 1 n1-378.plc1.org sls= [378, 379, 380] site= 1380 +3379 1 n1-379.plc1.org sls= [379, 380, 381] site= 1381 +3380 1 n1-380.plc1.org sls= [380, 381, 382] site= 1382 +3381 1 n1-381.plc1.org sls= [381, 382, 383] site= 1383 +3382 1 n1-382.plc1.org sls= [382, 383, 384] site= 1384 +3383 1 n1-383.plc1.org sls= [383, 384, 385] site= 1385 +3384 1 n1-384.plc1.org sls= [384, 385, 386] site= 1386 +3385 1 n1-385.plc1.org sls= [385, 386, 387] site= 1387 +3386 1 n1-386.plc1.org sls= [386, 387, 388] site= 1388 +3387 1 n1-387.plc1.org sls= [387, 388, 389] site= 1389 +3388 1 n1-388.plc1.org sls= [388, 389, 390] site= 1390 +3389 1 n1-389.plc1.org sls= [389, 390, 391] site= 1391 +3390 1 n1-390.plc1.org sls= [390, 391, 392] site= 1392 +3391 1 n1-391.plc1.org sls= [391, 392, 393] site= 1393 +3392 1 n1-392.plc1.org sls= [392, 393, 394] site= 1394 +3393 1 n1-393.plc1.org sls= [393, 394, 395] site= 1395 +3394 1 n1-394.plc1.org sls= [394, 395, 396] site= 1396 +3395 1 n1-395.plc1.org sls= [395, 396, 397] site= 1397 +3396 1 n1-396.plc1.org sls= [396, 397, 398] site= 1398 +3397 1 n1-397.plc1.org sls= [397, 398, 399] site= 1399 +3398 1 n1-398.plc1.org sls= [398, 399, 400] site= 1400 +3399 1 n1-399.plc1.org sls= [399, 400, 401] site= 1401 +3400 1 n1-400.plc1.org sls= [400, 401, 402] site= 1402 +3401 1 n1-401.plc1.org sls= [401, 402, 403] site= 1403 +3402 1 n1-402.plc1.org sls= [402, 403, 404] site= 1404 +3403 1 n1-403.plc1.org sls= [403, 404, 405] site= 1405 +3404 1 n1-404.plc1.org sls= [404, 405, 406] site= 1406 +3405 1 n1-405.plc1.org sls= [405, 406, 407] site= 1407 +3406 1 n1-406.plc1.org sls= [406, 407, 408] site= 1408 +3407 1 n1-407.plc1.org sls= [407, 408, 409] site= 1409 +3408 1 n1-408.plc1.org sls= [408, 409, 410] site= 1410 +3409 1 n1-409.plc1.org sls= [409, 410, 411] site= 1411 +3410 1 n1-410.plc1.org sls= [410, 411, 412] site= 1412 +3411 1 n1-411.plc1.org sls= [411, 412, 413] site= 1413 +3412 1 n1-412.plc1.org sls= [412, 413, 414] site= 1414 +3413 1 n1-413.plc1.org sls= [413, 414, 415] site= 1415 +3414 1 n1-414.plc1.org sls= [414, 415, 416] site= 1416 +3415 1 n1-415.plc1.org sls= [415, 416, 417] site= 1417 +3416 1 n1-416.plc1.org sls= [416, 417, 418] site= 1418 +3417 1 n1-417.plc1.org sls= [417, 418, 419] site= 1419 +3418 1 n1-418.plc1.org sls= [418, 419, 420] site= 1420 +3419 1 n1-419.plc1.org sls= [419, 420, 421] site= 1421 +3420 1 n1-420.plc1.org sls= [420, 421, 422] site= 1422 +3421 1 n1-421.plc1.org sls= [421, 422, 423] site= 1423 +3422 1 n1-422.plc1.org sls= [422, 423, 424] site= 1424 +3423 1 n1-423.plc1.org sls= [423, 424, 425] site= 1425 +3424 1 n1-424.plc1.org sls= [424, 425, 426] site= 1426 +3425 1 n1-425.plc1.org sls= [425, 426, 427] site= 1427 +3426 1 n1-426.plc1.org sls= [426, 427, 428] site= 1428 +3427 1 n1-427.plc1.org sls= [427, 428, 429] site= 1429 +3428 1 n1-428.plc1.org sls= [428, 429, 430] site= 1430 +3429 1 n1-429.plc1.org sls= [429, 430, 431] site= 1431 +3430 1 n1-430.plc1.org sls= [430, 431, 432] site= 1432 +3431 1 n1-431.plc1.org sls= [431, 432, 433] site= 1433 +3432 1 n1-432.plc1.org sls= [432, 433, 434] site= 1434 +3433 1 n1-433.plc1.org sls= [433, 434, 435] site= 1435 +3434 1 n1-434.plc1.org sls= [434, 435, 436] site= 1436 +3435 1 n1-435.plc1.org sls= [435, 436, 437] site= 1437 +3436 1 n1-436.plc1.org sls= [436, 437, 438] site= 1438 +3437 1 n1-437.plc1.org sls= [437, 438, 439] site= 1439 +3438 1 n1-438.plc1.org sls= [438, 439, 440] site= 1440 +3439 1 n1-439.plc1.org sls= [439, 440, 441] site= 1441 +3440 1 n1-440.plc1.org sls= [440, 441, 442] site= 1442 +3441 1 n1-441.plc1.org sls= [441, 442, 443] site= 1443 +3442 1 n1-442.plc1.org sls= [442, 443, 444] site= 1444 +3443 1 n1-443.plc1.org sls= [443, 444, 445] site= 1445 +3444 1 n1-444.plc1.org sls= [444, 445, 446] site= 1446 +3445 1 n1-445.plc1.org sls= [445, 446, 447] site= 1447 +3446 1 n1-446.plc1.org sls= [446, 447, 448] site= 1448 +3447 1 n1-447.plc1.org sls= [447, 448, 449] site= 1449 +3448 1 n1-448.plc1.org sls= [448, 449, 450] site= 1450 +3449 1 n1-449.plc1.org sls= [449, 450, 451] site= 1451 +3450 1 n1-450.plc1.org sls= [450, 451, 452] site= 1452 +3451 1 n1-451.plc1.org sls= [451, 452, 453] site= 1453 +3452 1 n1-452.plc1.org sls= [452, 453, 454] site= 1454 +3453 1 n1-453.plc1.org sls= [453, 454, 455] site= 1455 +3454 1 n1-454.plc1.org sls= [454, 455, 456] site= 1456 +3455 1 n1-455.plc1.org sls= [455, 456, 457] site= 1457 +3456 1 n1-456.plc1.org sls= [456, 457, 458] site= 1458 +3457 1 n1-457.plc1.org sls= [457, 458, 459] site= 1459 +3458 1 n1-458.plc1.org sls= [458, 459, 460] site= 1460 +3459 1 n1-459.plc1.org sls= [459, 460, 461] site= 1461 +3460 1 n1-460.plc1.org sls= [460, 461, 462] site= 1462 +3461 1 n1-461.plc1.org sls= [461, 462, 463] site= 1463 +3462 1 n1-462.plc1.org sls= [462, 463, 464] site= 1464 +3463 1 n1-463.plc1.org sls= [463, 464, 465] site= 1465 +3464 1 n1-464.plc1.org sls= [464, 465, 466] site= 1466 +3465 1 n1-465.plc1.org sls= [465, 466, 467] site= 1467 +3466 1 n1-466.plc1.org sls= [466, 467, 468] site= 1468 +3467 1 n1-467.plc1.org sls= [467, 468, 469] site= 1469 +3468 1 n1-468.plc1.org sls= [468, 469, 470] site= 1470 +3469 1 n1-469.plc1.org sls= [469, 470, 471] site= 1471 +3470 1 n1-470.plc1.org sls= [470, 471, 472] site= 1472 +3471 1 n1-471.plc1.org sls= [471, 472, 473] site= 1473 +3472 1 n1-472.plc1.org sls= [472, 473, 474] site= 1474 +3473 1 n1-473.plc1.org sls= [473, 474, 475] site= 1475 +3474 1 n1-474.plc1.org sls= [474, 475, 476] site= 1476 +3475 1 n1-475.plc1.org sls= [475, 476, 477] site= 1477 +3476 1 n1-476.plc1.org sls= [476, 477, 478] site= 1478 +3477 1 n1-477.plc1.org sls= [477, 478, 479] site= 1479 +3478 1 n1-478.plc1.org sls= [478, 479, 480] site= 1480 +3479 1 n1-479.plc1.org sls= [479, 480, 481] site= 1481 +3480 1 n1-480.plc1.org sls= [480, 481, 482] site= 1482 +3481 1 n1-481.plc1.org sls= [481, 482, 483] site= 1483 +3482 1 n1-482.plc1.org sls= [482, 483, 484] site= 1484 +3483 1 n1-483.plc1.org sls= [483, 484, 485] site= 1485 +3484 1 n1-484.plc1.org sls= [484, 485, 486] site= 1486 +3485 1 n1-485.plc1.org sls= [485, 486, 487] site= 1487 +3486 1 n1-486.plc1.org sls= [486, 487, 488] site= 1488 +3487 1 n1-487.plc1.org sls= [487, 488, 489] site= 1489 +3488 1 n1-488.plc1.org sls= [488, 489, 490] site= 1490 +3489 1 n1-489.plc1.org sls= [489, 490, 491] site= 1491 +3490 1 n1-490.plc1.org sls= [490, 491, 492] site= 1492 +3491 1 n1-491.plc1.org sls= [491, 492, 493] site= 1493 +3492 1 n1-492.plc1.org sls= [492, 493, 494] site= 1494 +3493 1 n1-493.plc1.org sls= [493, 494, 495] site= 1495 +3494 1 n1-494.plc1.org sls= [494, 495, 496] site= 1496 +3495 1 n1-495.plc1.org sls= [495, 496, 497] site= 1497 +3496 1 n1-496.plc1.org sls= [496, 497, 498] site= 1498 +3497 1 n1-497.plc1.org sls= [497, 498, 499] site= 1499 +3498 1 n1-498.plc1.org sls= [498, 499, 500] site= 1500 +3499 1 n1-499.plc1.org sls= [499, 500, 501] site= 1501 +3500 1 n1-500.plc1.org sls= [500, 501, 502] site= 1502 +3501 1 n1-501.plc1.org sls= [501, 502, 503] site= 1503 +3502 1 n1-502.plc1.org sls= [502, 503, 504] site= 1504 +3503 1 n1-503.plc1.org sls= [503, 504, 505] site= 1505 +3504 1 n1-504.plc1.org sls= [504, 505, 506] site= 1506 +3505 1 n1-505.plc1.org sls= [505, 506, 507] site= 1507 +3506 1 n1-506.plc1.org sls= [506, 507, 508] site= 1508 +3507 1 n1-507.plc1.org sls= [507, 508, 509] site= 1509 +3508 1 n1-508.plc1.org sls= [508, 509, 510] site= 1510 +3509 1 n1-509.plc1.org sls= [509, 510, 511] site= 1511 +3510 1 n1-510.plc1.org sls= [510, 511, 512] site= 1512 +3511 1 n1-511.plc1.org sls= [511, 512, 513] site= 1513 +3512 1 n1-512.plc1.org sls= [512, 513, 514] site= 1514 +3513 1 n1-513.plc1.org sls= [513, 514, 515] site= 1515 +3514 1 n1-514.plc1.org sls= [514, 515, 516] site= 1516 +3515 1 n1-515.plc1.org sls= [515, 516, 517] site= 1517 +3516 1 n1-516.plc1.org sls= [516, 517, 518] site= 1518 +3517 1 n1-517.plc1.org sls= [517, 518, 519] site= 1519 +3518 1 n1-518.plc1.org sls= [518, 519, 520] site= 1520 +3519 1 n1-519.plc1.org sls= [519, 520, 521] site= 1521 +3520 1 n1-520.plc1.org sls= [520, 521, 522] site= 1522 +3521 1 n1-521.plc1.org sls= [521, 522, 523] site= 1523 +3522 1 n1-522.plc1.org sls= [522, 523, 524] site= 1524 +3523 1 n1-523.plc1.org sls= [523, 524, 525] site= 1525 +3524 1 n1-524.plc1.org sls= [524, 525, 526] site= 1526 +3525 1 n1-525.plc1.org sls= [525, 526, 527] site= 1527 +3526 1 n1-526.plc1.org sls= [526, 527, 528] site= 1528 +3527 1 n1-527.plc1.org sls= [527, 528, 529] site= 1529 +3528 1 n1-528.plc1.org sls= [528, 529, 530] site= 1530 +3529 1 n1-529.plc1.org sls= [529, 530, 531] site= 1531 +3530 1 n1-530.plc1.org sls= [530, 531, 532] site= 1532 +3531 1 n1-531.plc1.org sls= [531, 532, 533] site= 1533 +3532 1 n1-532.plc1.org sls= [532, 533, 534] site= 1534 +3533 1 n1-533.plc1.org sls= [533, 534, 535] site= 1535 +3534 1 n1-534.plc1.org sls= [534, 535, 536] site= 1536 +3535 1 n1-535.plc1.org sls= [535, 536, 537] site= 1537 +3536 1 n1-536.plc1.org sls= [536, 537, 538] site= 1538 +3537 1 n1-537.plc1.org sls= [537, 538, 539] site= 1539 +3538 1 n1-538.plc1.org sls= [538, 539, 540] site= 1540 +3539 1 n1-539.plc1.org sls= [539, 540, 541] site= 1541 +3540 1 n1-540.plc1.org sls= [540, 541, 542] site= 1542 +3541 1 n1-541.plc1.org sls= [541, 542, 543] site= 1543 +3542 1 n1-542.plc1.org sls= [542, 543, 544] site= 1544 +3543 1 n1-543.plc1.org sls= [543, 544, 545] site= 1545 +3544 1 n1-544.plc1.org sls= [544, 545, 546] site= 1546 +3545 1 n1-545.plc1.org sls= [545, 546, 547] site= 1547 +3546 1 n1-546.plc1.org sls= [546, 547, 548] site= 1548 +3547 1 n1-547.plc1.org sls= [547, 548, 549] site= 1549 +3548 1 n1-548.plc1.org sls= [548, 549, 550] site= 1550 +3549 1 n1-549.plc1.org sls= [549, 550, 551] site= 1551 +3550 1 n1-550.plc1.org sls= [550, 551, 552] site= 1552 +3551 1 n1-551.plc1.org sls= [551, 552, 553] site= 1553 +3552 1 n1-552.plc1.org sls= [552, 553, 554] site= 1554 +3553 1 n1-553.plc1.org sls= [553, 554, 555] site= 1555 +3554 1 n1-554.plc1.org sls= [554, 555, 556] site= 1556 +3555 1 n1-555.plc1.org sls= [555, 556, 557] site= 1557 +3556 1 n1-556.plc1.org sls= [556, 557, 558] site= 1558 +3557 1 n1-557.plc1.org sls= [557, 558, 559] site= 1559 +3558 1 n1-558.plc1.org sls= [558, 559, 560] site= 1560 +3559 1 n1-559.plc1.org sls= [559, 560, 561] site= 1561 +3560 1 n1-560.plc1.org sls= [560, 561, 562] site= 1562 +3561 1 n1-561.plc1.org sls= [561, 562, 563] site= 1563 +3562 1 n1-562.plc1.org sls= [562, 563, 564] site= 1564 +3563 1 n1-563.plc1.org sls= [563, 564, 565] site= 1565 +3564 1 n1-564.plc1.org sls= [564, 565, 566] site= 1566 +3565 1 n1-565.plc1.org sls= [565, 566, 567] site= 1567 +3566 1 n1-566.plc1.org sls= [566, 567, 568] site= 1568 +3567 1 n1-567.plc1.org sls= [567, 568, 569] site= 1569 +3568 1 n1-568.plc1.org sls= [568, 569, 570] site= 1570 +3569 1 n1-569.plc1.org sls= [569, 570, 571] site= 1571 +3570 1 n1-570.plc1.org sls= [570, 571, 572] site= 1572 +3571 1 n1-571.plc1.org sls= [571, 572, 573] site= 1573 +3572 1 n1-572.plc1.org sls= [572, 573, 574] site= 1574 +3573 1 n1-573.plc1.org sls= [573, 574, 575] site= 1575 +3574 1 n1-574.plc1.org sls= [574, 575, 576] site= 1576 +3575 1 n1-575.plc1.org sls= [575, 576, 577] site= 1577 +3576 1 n1-576.plc1.org sls= [576, 577, 578] site= 1578 +3577 1 n1-577.plc1.org sls= [577, 578, 579] site= 1579 +3578 1 n1-578.plc1.org sls= [578, 579, 580] site= 1580 +3579 1 n1-579.plc1.org sls= [579, 580, 581] site= 1581 +3580 1 n1-580.plc1.org sls= [580, 581, 582] site= 1582 +3581 1 n1-581.plc1.org sls= [581, 582, 583] site= 1583 +3582 1 n1-582.plc1.org sls= [582, 583, 584] site= 1584 +3583 1 n1-583.plc1.org sls= [583, 584, 585] site= 1585 +3584 1 n1-584.plc1.org sls= [584, 585, 586] site= 1586 +3585 1 n1-585.plc1.org sls= [585, 586, 587] site= 1587 +3586 1 n1-586.plc1.org sls= [586, 587, 588] site= 1588 +3587 1 n1-587.plc1.org sls= [587, 588, 589] site= 1589 +3588 1 n1-588.plc1.org sls= [588, 589, 590] site= 1590 +3589 1 n1-589.plc1.org sls= [589, 590, 591] site= 1591 +3590 1 n1-590.plc1.org sls= [590, 591, 592] site= 1592 +3591 1 n1-591.plc1.org sls= [591, 592, 593] site= 1593 +3592 1 n1-592.plc1.org sls= [592, 593, 594] site= 1594 +3593 1 n1-593.plc1.org sls= [593, 594, 595] site= 1595 +3594 1 n1-594.plc1.org sls= [594, 595, 596] site= 1596 +3595 1 n1-595.plc1.org sls= [595, 596, 597] site= 1597 +3596 1 n1-596.plc1.org sls= [596, 597, 598] site= 1598 +3597 1 n1-597.plc1.org sls= [597, 598, 599] site= 1599 +3598 1 n1-598.plc1.org sls= [598, 599, 600] site= 1600 +3599 1 n1-599.plc1.org sls= [599, 600, 601] site= 1601 +3600 1 n1-600.plc1.org sls= [600, 601, 602] site= 1602 +3601 1 n1-601.plc1.org sls= [601, 602, 603] site= 1603 +3602 1 n1-602.plc1.org sls= [602, 603, 604] site= 1604 +3603 1 n1-603.plc1.org sls= [603, 604, 605] site= 1605 +3604 1 n1-604.plc1.org sls= [604, 605, 606] site= 1606 +3605 1 n1-605.plc1.org sls= [605, 606, 607] site= 1607 +3606 1 n1-606.plc1.org sls= [606, 607, 608] site= 1608 +3607 1 n1-607.plc1.org sls= [607, 608, 609] site= 1609 +3608 1 n1-608.plc1.org sls= [608, 609, 610] site= 1610 +3609 1 n1-609.plc1.org sls= [609, 610, 611] site= 1611 +3610 1 n1-610.plc1.org sls= [610, 611, 612] site= 1612 +3611 1 n1-611.plc1.org sls= [611, 612, 613] site= 1613 +3612 1 n1-612.plc1.org sls= [612, 613, 614] site= 1614 +3613 1 n1-613.plc1.org sls= [613, 614, 615] site= 1615 +3614 1 n1-614.plc1.org sls= [614, 615, 616] site= 1616 +3615 1 n1-615.plc1.org sls= [615, 616, 617] site= 1617 +3616 1 n1-616.plc1.org sls= [616, 617, 618] site= 1618 +3617 1 n1-617.plc1.org sls= [617, 618, 619] site= 1619 +3618 1 n1-618.plc1.org sls= [618, 619, 620] site= 1620 +3619 1 n1-619.plc1.org sls= [619, 620, 621] site= 1621 +3620 1 n1-620.plc1.org sls= [620, 621, 622] site= 1622 +3621 1 n1-621.plc1.org sls= [621, 622, 623] site= 1623 +3622 1 n1-622.plc1.org sls= [622, 623, 624] site= 1624 +3623 1 n1-623.plc1.org sls= [623, 624, 625] site= 1625 +3624 1 n1-624.plc1.org sls= [624, 625, 626] site= 1626 +3625 1 n1-625.plc1.org sls= [625, 626, 627] site= 1627 +3626 1 n1-626.plc1.org sls= [626, 627, 628] site= 1628 +3627 1 n1-627.plc1.org sls= [627, 628, 629] site= 1629 +3628 1 n1-628.plc1.org sls= [628, 629, 630] site= 1630 +3629 1 n1-629.plc1.org sls= [629, 630, 631] site= 1631 +3630 1 n1-630.plc1.org sls= [630, 631, 632] site= 1632 +3631 1 n1-631.plc1.org sls= [631, 632, 633] site= 1633 +3632 1 n1-632.plc1.org sls= [632, 633, 634] site= 1634 +3633 1 n1-633.plc1.org sls= [633, 634, 635] site= 1635 +3634 1 n1-634.plc1.org sls= [634, 635, 636] site= 1636 +3635 1 n1-635.plc1.org sls= [635, 636, 637] site= 1637 +3636 1 n1-636.plc1.org sls= [636, 637, 638] site= 1638 +3637 1 n1-637.plc1.org sls= [637, 638, 639] site= 1639 +3638 1 n1-638.plc1.org sls= [638, 639, 640] site= 1640 +3639 1 n1-639.plc1.org sls= [639, 640, 641] site= 1641 +3640 1 n1-640.plc1.org sls= [640, 641, 642] site= 1642 +3641 1 n1-641.plc1.org sls= [641, 642, 643] site= 1643 +3642 1 n1-642.plc1.org sls= [642, 643, 644] site= 1644 +3643 1 n1-643.plc1.org sls= [643, 644, 645] site= 1645 +3644 1 n1-644.plc1.org sls= [644, 645, 646] site= 1646 +3645 1 n1-645.plc1.org sls= [645, 646, 647] site= 1647 +3646 1 n1-646.plc1.org sls= [646, 647, 648] site= 1648 +3647 1 n1-647.plc1.org sls= [647, 648, 649] site= 1649 +3648 1 n1-648.plc1.org sls= [648, 649, 650] site= 1650 +3649 1 n1-649.plc1.org sls= [649, 650, 651] site= 1651 +3650 1 n1-650.plc1.org sls= [650, 651, 652] site= 1652 +3651 1 n1-651.plc1.org sls= [651, 652, 653] site= 1653 +3652 1 n1-652.plc1.org sls= [652, 653, 654] site= 1654 +3653 1 n1-653.plc1.org sls= [653, 654, 655] site= 1655 +3654 1 n1-654.plc1.org sls= [654, 655, 656] site= 1656 +3655 1 n1-655.plc1.org sls= [655, 656, 657] site= 1657 +3656 1 n1-656.plc1.org sls= [656, 657, 658] site= 1658 +3657 1 n1-657.plc1.org sls= [657, 658, 659] site= 1659 +3658 1 n1-658.plc1.org sls= [658, 659, 660] site= 1660 +3659 1 n1-659.plc1.org sls= [659, 660, 661] site= 1661 +3660 1 n1-660.plc1.org sls= [660, 661, 662] site= 1662 +3661 1 n1-661.plc1.org sls= [661, 662, 663] site= 1663 +3662 1 n1-662.plc1.org sls= [662, 663, 664] site= 1664 +3663 1 n1-663.plc1.org sls= [663, 664, 665] site= 1665 +3664 1 n1-664.plc1.org sls= [664, 665, 666] site= 1666 +3665 1 n1-665.plc1.org sls= [665, 666, 667] site= 1667 +3666 1 n1-666.plc1.org sls= [666, 667, 668] site= 1668 +3667 1 n1-667.plc1.org sls= [667, 668, 669] site= 1669 +3668 1 n1-668.plc1.org sls= [668, 669, 670] site= 1670 +3669 1 n1-669.plc1.org sls= [669, 670, 671] site= 1671 +3670 1 n1-670.plc1.org sls= [670, 671, 672] site= 1672 +3671 1 n1-671.plc1.org sls= [671, 672, 673] site= 1673 +3672 1 n1-672.plc1.org sls= [672, 673, 674] site= 1674 +3673 1 n1-673.plc1.org sls= [673, 674, 675] site= 1675 +3674 1 n1-674.plc1.org sls= [674, 675, 676] site= 1676 +3675 1 n1-675.plc1.org sls= [675, 676, 677] site= 1677 +3676 1 n1-676.plc1.org sls= [676, 677, 678] site= 1678 +3677 1 n1-677.plc1.org sls= [677, 678, 679] site= 1679 +3678 1 n1-678.plc1.org sls= [678, 679, 680] site= 1680 +3679 1 n1-679.plc1.org sls= [679, 680, 681] site= 1681 +3680 1 n1-680.plc1.org sls= [680, 681, 682] site= 1682 +3681 1 n1-681.plc1.org sls= [681, 682, 683] site= 1683 +3682 1 n1-682.plc1.org sls= [682, 683, 684] site= 1684 +3683 1 n1-683.plc1.org sls= [683, 684, 685] site= 1685 +3684 1 n1-684.plc1.org sls= [684, 685, 686] site= 1686 +3685 1 n1-685.plc1.org sls= [685, 686, 687] site= 1687 +3686 1 n1-686.plc1.org sls= [686, 687, 688] site= 1688 +3687 1 n1-687.plc1.org sls= [687, 688, 689] site= 1689 +3688 1 n1-688.plc1.org sls= [688, 689, 690] site= 1690 +3689 1 n1-689.plc1.org sls= [689, 690, 691] site= 1691 +3690 1 n1-690.plc1.org sls= [690, 691, 692] site= 1692 +3691 1 n1-691.plc1.org sls= [691, 692, 693] site= 1693 +3692 1 n1-692.plc1.org sls= [692, 693, 694] site= 1694 +3693 1 n1-693.plc1.org sls= [693, 694, 695] site= 1695 +3694 1 n1-694.plc1.org sls= [694, 695, 696] site= 1696 +3695 1 n1-695.plc1.org sls= [695, 696, 697] site= 1697 +3696 1 n1-696.plc1.org sls= [696, 697, 698] site= 1698 +3697 1 n1-697.plc1.org sls= [697, 698, 699] site= 1699 +3698 1 n1-698.plc1.org sls= [698, 699, 700] site= 1700 +3699 1 n1-699.plc1.org sls= [699, 700, 701] site= 1701 +3700 1 n1-700.plc1.org sls= [700, 701, 702] site= 1702 +3701 1 n1-701.plc1.org sls= [701, 702, 703] site= 1703 +3702 1 n1-702.plc1.org sls= [702, 703, 704] site= 1704 +3703 1 n1-703.plc1.org sls= [703, 704, 705] site= 1705 +3704 1 n1-704.plc1.org sls= [704, 705, 706] site= 1706 +3705 1 n1-705.plc1.org sls= [705, 706, 707] site= 1707 +3706 1 n1-706.plc1.org sls= [706, 707, 708] site= 1708 +3707 1 n1-707.plc1.org sls= [707, 708, 709] site= 1709 +3708 1 n1-708.plc1.org sls= [708, 709, 710] site= 1710 +3709 1 n1-709.plc1.org sls= [709, 710, 711] site= 1711 +3710 1 n1-710.plc1.org sls= [710, 711, 712] site= 1712 +3711 1 n1-711.plc1.org sls= [711, 712, 713] site= 1713 +3712 1 n1-712.plc1.org sls= [712, 713, 714] site= 1714 +3713 1 n1-713.plc1.org sls= [713, 714, 715] site= 1715 +3714 1 n1-714.plc1.org sls= [714, 715, 716] site= 1716 +3715 1 n1-715.plc1.org sls= [715, 716, 717] site= 1717 +3716 1 n1-716.plc1.org sls= [716, 717, 718] site= 1718 +3717 1 n1-717.plc1.org sls= [717, 718, 719] site= 1719 +3718 1 n1-718.plc1.org sls= [718, 719, 720] site= 1720 +3719 1 n1-719.plc1.org sls= [719, 720, 721] site= 1721 +3720 1 n1-720.plc1.org sls= [720, 721, 722] site= 1722 +3721 1 n1-721.plc1.org sls= [721, 722, 723] site= 1723 +3722 1 n1-722.plc1.org sls= [722, 723, 724] site= 1724 +3723 1 n1-723.plc1.org sls= [723, 724, 725] site= 1725 +3724 1 n1-724.plc1.org sls= [724, 725, 726] site= 1726 +3725 1 n1-725.plc1.org sls= [725, 726, 727] site= 1727 +3726 1 n1-726.plc1.org sls= [726, 727, 728] site= 1728 +3727 1 n1-727.plc1.org sls= [727, 728, 729] site= 1729 +3728 1 n1-728.plc1.org sls= [728, 729, 730] site= 1730 +3729 1 n1-729.plc1.org sls= [729, 730, 731] site= 1731 +3730 1 n1-730.plc1.org sls= [730, 731, 732] site= 1732 +3731 1 n1-731.plc1.org sls= [731, 732, 733] site= 1733 +3732 1 n1-732.plc1.org sls= [732, 733, 734] site= 1734 +3733 1 n1-733.plc1.org sls= [733, 734, 735] site= 1735 +3734 1 n1-734.plc1.org sls= [734, 735, 736] site= 1736 +3735 1 n1-735.plc1.org sls= [735, 736, 737] site= 1737 +3736 1 n1-736.plc1.org sls= [736, 737, 738] site= 1738 +3737 1 n1-737.plc1.org sls= [737, 738, 739] site= 1739 +3738 1 n1-738.plc1.org sls= [738, 739, 740] site= 1740 +3739 1 n1-739.plc1.org sls= [739, 740, 741] site= 1741 +3740 1 n1-740.plc1.org sls= [740, 741, 742] site= 1742 +3741 1 n1-741.plc1.org sls= [741, 742, 743] site= 1743 +3742 1 n1-742.plc1.org sls= [742, 743, 744] site= 1744 +3743 1 n1-743.plc1.org sls= [743, 744, 745] site= 1745 +3744 1 n1-744.plc1.org sls= [744, 745, 746] site= 1746 +3745 1 n1-745.plc1.org sls= [745, 746, 747] site= 1747 +3746 1 n1-746.plc1.org sls= [746, 747, 748] site= 1748 +3747 1 n1-747.plc1.org sls= [747, 748, 749] site= 1749 +3748 1 n1-748.plc1.org sls= [748, 749, 750] site= 1750 +3749 1 n1-749.plc1.org sls= [749, 750, 751] site= 1751 +3750 1 n1-750.plc1.org sls= [750, 751, 752] site= 1752 +3751 1 n1-751.plc1.org sls= [751, 752, 753] site= 1753 +3752 1 n1-752.plc1.org sls= [752, 753, 754] site= 1754 +3753 1 n1-753.plc1.org sls= [753, 754, 755] site= 1755 +3754 1 n1-754.plc1.org sls= [754, 755, 756] site= 1756 +3755 1 n1-755.plc1.org sls= [755, 756, 757] site= 1757 +3756 1 n1-756.plc1.org sls= [756, 757, 758] site= 1758 +3757 1 n1-757.plc1.org sls= [757, 758, 759] site= 1759 +3758 1 n1-758.plc1.org sls= [758, 759, 760] site= 1760 +3759 1 n1-759.plc1.org sls= [759, 760, 761] site= 1761 +3760 1 n1-760.plc1.org sls= [760, 761, 762] site= 1762 +3761 1 n1-761.plc1.org sls= [761, 762, 763] site= 1763 +3762 1 n1-762.plc1.org sls= [762, 763, 764] site= 1764 +3763 1 n1-763.plc1.org sls= [763, 764, 765] site= 1765 +3764 1 n1-764.plc1.org sls= [764, 765, 766] site= 1766 +3765 1 n1-765.plc1.org sls= [765, 766, 767] site= 1767 +3766 1 n1-766.plc1.org sls= [766, 767, 768] site= 1768 +3767 1 n1-767.plc1.org sls= [767, 768, 769] site= 1769 +3768 1 n1-768.plc1.org sls= [768, 769, 770] site= 1770 +3769 1 n1-769.plc1.org sls= [769, 770, 771] site= 1771 +3770 1 n1-770.plc1.org sls= [770, 771, 772] site= 1772 +3771 1 n1-771.plc1.org sls= [771, 772, 773] site= 1773 +3772 1 n1-772.plc1.org sls= [772, 773, 774] site= 1774 +3773 1 n1-773.plc1.org sls= [773, 774, 775] site= 1775 +3774 1 n1-774.plc1.org sls= [774, 775, 776] site= 1776 +3775 1 n1-775.plc1.org sls= [775, 776, 777] site= 1777 +3776 1 n1-776.plc1.org sls= [776, 777, 778] site= 1778 +3777 1 n1-777.plc1.org sls= [777, 778, 779] site= 1779 +3778 1 n1-778.plc1.org sls= [778, 779, 780] site= 1780 +3779 1 n1-779.plc1.org sls= [779, 780, 781] site= 1781 +3780 1 n1-780.plc1.org sls= [780, 781, 782] site= 1782 +3781 1 n1-781.plc1.org sls= [781, 782, 783] site= 1783 +3782 1 n1-782.plc1.org sls= [782, 783, 784] site= 1784 +3783 1 n1-783.plc1.org sls= [783, 784, 785] site= 1785 +3784 1 n1-784.plc1.org sls= [784, 785, 786] site= 1786 +3785 1 n1-785.plc1.org sls= [785, 786, 787] site= 1787 +3786 1 n1-786.plc1.org sls= [786, 787, 788] site= 1788 +3787 1 n1-787.plc1.org sls= [787, 788, 789] site= 1789 +3788 1 n1-788.plc1.org sls= [788, 789, 790] site= 1790 +3789 1 n1-789.plc1.org sls= [789, 790, 791] site= 1791 +3790 1 n1-790.plc1.org sls= [790, 791, 792] site= 1792 +3791 1 n1-791.plc1.org sls= [791, 792, 793] site= 1793 +3792 1 n1-792.plc1.org sls= [792, 793, 794] site= 1794 +3793 1 n1-793.plc1.org sls= [793, 794, 795] site= 1795 +3794 1 n1-794.plc1.org sls= [794, 795, 796] site= 1796 +3795 1 n1-795.plc1.org sls= [795, 796, 797] site= 1797 +3796 1 n1-796.plc1.org sls= [796, 797, 798] site= 1798 +3797 1 n1-797.plc1.org sls= [797, 798, 799] site= 1799 +3798 1 n1-798.plc1.org sls= [798, 799, 800] site= 1800 +3799 1 n1-799.plc1.org sls= [799, 800, 801] site= 1801 +3800 1 n1-800.plc1.org sls= [800, 801, 802] site= 1802 +3801 1 n1-801.plc1.org sls= [801, 802, 803] site= 1803 +3802 1 n1-802.plc1.org sls= [802, 803, 804] site= 1804 +3803 1 n1-803.plc1.org sls= [803, 804, 805] site= 1805 +3804 1 n1-804.plc1.org sls= [804, 805, 806] site= 1806 +3805 1 n1-805.plc1.org sls= [805, 806, 807] site= 1807 +3806 1 n1-806.plc1.org sls= [806, 807, 808] site= 1808 +3807 1 n1-807.plc1.org sls= [807, 808, 809] site= 1809 +3808 1 n1-808.plc1.org sls= [808, 809, 810] site= 1810 +3809 1 n1-809.plc1.org sls= [809, 810, 811] site= 1811 +3810 1 n1-810.plc1.org sls= [810, 811, 812] site= 1812 +3811 1 n1-811.plc1.org sls= [811, 812, 813] site= 1813 +3812 1 n1-812.plc1.org sls= [812, 813, 814] site= 1814 +3813 1 n1-813.plc1.org sls= [813, 814, 815] site= 1815 +3814 1 n1-814.plc1.org sls= [814, 815, 816] site= 1816 +3815 1 n1-815.plc1.org sls= [815, 816, 817] site= 1817 +3816 1 n1-816.plc1.org sls= [816, 817, 818] site= 1818 +3817 1 n1-817.plc1.org sls= [817, 818, 819] site= 1819 +3818 1 n1-818.plc1.org sls= [818, 819, 820] site= 1820 +3819 1 n1-819.plc1.org sls= [819, 820, 821] site= 1821 +3820 1 n1-820.plc1.org sls= [820, 821, 822] site= 1822 +3821 1 n1-821.plc1.org sls= [821, 822, 823] site= 1823 +3822 1 n1-822.plc1.org sls= [822, 823, 824] site= 1824 +3823 1 n1-823.plc1.org sls= [823, 824, 825] site= 1825 +3824 1 n1-824.plc1.org sls= [824, 825, 826] site= 1826 +3825 1 n1-825.plc1.org sls= [825, 826, 827] site= 1827 +3826 1 n1-826.plc1.org sls= [826, 827, 828] site= 1828 +3827 1 n1-827.plc1.org sls= [827, 828, 829] site= 1829 +3828 1 n1-828.plc1.org sls= [828, 829, 830] site= 1830 +3829 1 n1-829.plc1.org sls= [829, 830, 831] site= 1831 +3830 1 n1-830.plc1.org sls= [830, 831, 832] site= 1832 +3831 1 n1-831.plc1.org sls= [831, 832, 833] site= 1833 +3832 1 n1-832.plc1.org sls= [832, 833, 834] site= 1834 +3833 1 n1-833.plc1.org sls= [833, 834, 835] site= 1835 +3834 1 n1-834.plc1.org sls= [834, 835, 836] site= 1836 +3835 1 n1-835.plc1.org sls= [835, 836, 837] site= 1837 +3836 1 n1-836.plc1.org sls= [836, 837, 838] site= 1838 +3837 1 n1-837.plc1.org sls= [837, 838, 839] site= 1839 +3838 1 n1-838.plc1.org sls= [838, 839, 840] site= 1840 +3839 1 n1-839.plc1.org sls= [839, 840, 841] site= 1841 +3840 1 n1-840.plc1.org sls= [840, 841, 842] site= 1842 +3841 1 n1-841.plc1.org sls= [841, 842, 843] site= 1843 +3842 1 n1-842.plc1.org sls= [842, 843, 844] site= 1844 +3843 1 n1-843.plc1.org sls= [843, 844, 845] site= 1845 +3844 1 n1-844.plc1.org sls= [844, 845, 846] site= 1846 +3845 1 n1-845.plc1.org sls= [845, 846, 847] site= 1847 +3846 1 n1-846.plc1.org sls= [846, 847, 848] site= 1848 +3847 1 n1-847.plc1.org sls= [847, 848, 849] site= 1849 +3848 1 n1-848.plc1.org sls= [848, 849, 850] site= 1850 +3849 1 n1-849.plc1.org sls= [849, 850, 851] site= 1851 +3850 1 n1-850.plc1.org sls= [850, 851, 852] site= 1852 +3851 1 n1-851.plc1.org sls= [851, 852, 853] site= 1853 +3852 1 n1-852.plc1.org sls= [852, 853, 854] site= 1854 +3853 1 n1-853.plc1.org sls= [853, 854, 855] site= 1855 +3854 1 n1-854.plc1.org sls= [854, 855, 856] site= 1856 +3855 1 n1-855.plc1.org sls= [855, 856, 857] site= 1857 +3856 1 n1-856.plc1.org sls= [856, 857, 858] site= 1858 +3857 1 n1-857.plc1.org sls= [857, 858, 859] site= 1859 +3858 1 n1-858.plc1.org sls= [858, 859, 860] site= 1860 +3859 1 n1-859.plc1.org sls= [859, 860, 861] site= 1861 +3860 1 n1-860.plc1.org sls= [860, 861, 862] site= 1862 +3861 1 n1-861.plc1.org sls= [861, 862, 863] site= 1863 +3862 1 n1-862.plc1.org sls= [862, 863, 864] site= 1864 +3863 1 n1-863.plc1.org sls= [863, 864, 865] site= 1865 +3864 1 n1-864.plc1.org sls= [864, 865, 866] site= 1866 +3865 1 n1-865.plc1.org sls= [865, 866, 867] site= 1867 +3866 1 n1-866.plc1.org sls= [866, 867, 868] site= 1868 +3867 1 n1-867.plc1.org sls= [867, 868, 869] site= 1869 +3868 1 n1-868.plc1.org sls= [868, 869, 870] site= 1870 +3869 1 n1-869.plc1.org sls= [869, 870, 871] site= 1871 +3870 1 n1-870.plc1.org sls= [870, 871, 872] site= 1872 +3871 1 n1-871.plc1.org sls= [871, 872, 873] site= 1873 +3872 1 n1-872.plc1.org sls= [872, 873, 874] site= 1874 +3873 1 n1-873.plc1.org sls= [873, 874, 875] site= 1875 +3874 1 n1-874.plc1.org sls= [874, 875, 876] site= 1876 +3875 1 n1-875.plc1.org sls= [875, 876, 877] site= 1877 +3876 1 n1-876.plc1.org sls= [876, 877, 878] site= 1878 +3877 1 n1-877.plc1.org sls= [877, 878, 879] site= 1879 +3878 1 n1-878.plc1.org sls= [878, 879, 880] site= 1880 +3879 1 n1-879.plc1.org sls= [879, 880, 881] site= 1881 +3880 1 n1-880.plc1.org sls= [880, 881, 882] site= 1882 +3881 1 n1-881.plc1.org sls= [881, 882, 883] site= 1883 +3882 1 n1-882.plc1.org sls= [882, 883, 884] site= 1884 +3883 1 n1-883.plc1.org sls= [883, 884, 885] site= 1885 +3884 1 n1-884.plc1.org sls= [884, 885, 886] site= 1886 +3885 1 n1-885.plc1.org sls= [885, 886, 887] site= 1887 +3886 1 n1-886.plc1.org sls= [886, 887, 888] site= 1888 +3887 1 n1-887.plc1.org sls= [887, 888, 889] site= 1889 +3888 1 n1-888.plc1.org sls= [888, 889, 890] site= 1890 +3889 1 n1-889.plc1.org sls= [889, 890, 891] site= 1891 +3890 1 n1-890.plc1.org sls= [890, 891, 892] site= 1892 +3891 1 n1-891.plc1.org sls= [891, 892, 893] site= 1893 +3892 1 n1-892.plc1.org sls= [892, 893, 894] site= 1894 +3893 1 n1-893.plc1.org sls= [893, 894, 895] site= 1895 +3894 1 n1-894.plc1.org sls= [894, 895, 896] site= 1896 +3895 1 n1-895.plc1.org sls= [895, 896, 897] site= 1897 +3896 1 n1-896.plc1.org sls= [896, 897, 898] site= 1898 +3897 1 n1-897.plc1.org sls= [897, 898, 899] site= 1899 +3898 1 n1-898.plc1.org sls= [898, 899, 900] site= 1900 +3899 1 n1-899.plc1.org sls= [899, 900, 901] site= 1901 +3900 1 n1-900.plc1.org sls= [900, 901, 902] site= 1902 +3901 1 n1-901.plc1.org sls= [901, 902, 903] site= 1903 +3902 1 n1-902.plc1.org sls= [902, 903, 904] site= 1904 +3903 1 n1-903.plc1.org sls= [903, 904, 905] site= 1905 +3904 1 n1-904.plc1.org sls= [904, 905, 906] site= 1906 +3905 1 n1-905.plc1.org sls= [905, 906, 907] site= 1907 +3906 1 n1-906.plc1.org sls= [906, 907, 908] site= 1908 +3907 1 n1-907.plc1.org sls= [907, 908, 909] site= 1909 +3908 1 n1-908.plc1.org sls= [908, 909, 910] site= 1910 +3909 1 n1-909.plc1.org sls= [909, 910, 911] site= 1911 +3910 1 n1-910.plc1.org sls= [910, 911, 912] site= 1912 +3911 1 n1-911.plc1.org sls= [911, 912, 913] site= 1913 +3912 1 n1-912.plc1.org sls= [912, 913, 914] site= 1914 +3913 1 n1-913.plc1.org sls= [913, 914, 915] site= 1915 +3914 1 n1-914.plc1.org sls= [914, 915, 916] site= 1916 +3915 1 n1-915.plc1.org sls= [915, 916, 917] site= 1917 +3916 1 n1-916.plc1.org sls= [916, 917, 918] site= 1918 +3917 1 n1-917.plc1.org sls= [917, 918, 919] site= 1919 +3918 1 n1-918.plc1.org sls= [918, 919, 920] site= 1920 +3919 1 n1-919.plc1.org sls= [919, 920, 921] site= 1921 +3920 1 n1-920.plc1.org sls= [920, 921, 922] site= 1922 +3921 1 n1-921.plc1.org sls= [921, 922, 923] site= 1923 +3922 1 n1-922.plc1.org sls= [922, 923, 924] site= 1924 +3923 1 n1-923.plc1.org sls= [923, 924, 925] site= 1925 +3924 1 n1-924.plc1.org sls= [924, 925, 926] site= 1926 +3925 1 n1-925.plc1.org sls= [925, 926, 927] site= 1927 +3926 1 n1-926.plc1.org sls= [926, 927, 928] site= 1928 +3927 1 n1-927.plc1.org sls= [927, 928, 929] site= 1929 +3928 1 n1-928.plc1.org sls= [928, 929, 930] site= 1930 +3929 1 n1-929.plc1.org sls= [929, 930, 931] site= 1931 +3930 1 n1-930.plc1.org sls= [930, 931, 932] site= 1932 +3931 1 n1-931.plc1.org sls= [931, 932, 933] site= 1933 +3932 1 n1-932.plc1.org sls= [932, 933, 934] site= 1934 +3933 1 n1-933.plc1.org sls= [933, 934, 935] site= 1935 +3934 1 n1-934.plc1.org sls= [934, 935, 936] site= 1936 +3935 1 n1-935.plc1.org sls= [935, 936, 937] site= 1937 +3936 1 n1-936.plc1.org sls= [936, 937, 938] site= 1938 +3937 1 n1-937.plc1.org sls= [937, 938, 939] site= 1939 +3938 1 n1-938.plc1.org sls= [938, 939, 940] site= 1940 +3939 1 n1-939.plc1.org sls= [939, 940, 941] site= 1941 +3940 1 n1-940.plc1.org sls= [940, 941, 942] site= 1942 +3941 1 n1-941.plc1.org sls= [941, 942, 943] site= 1943 +3942 1 n1-942.plc1.org sls= [942, 943, 944] site= 1944 +3943 1 n1-943.plc1.org sls= [943, 944, 945] site= 1945 +3944 1 n1-944.plc1.org sls= [944, 945, 946] site= 1946 +3945 1 n1-945.plc1.org sls= [945, 946, 947] site= 1947 +3946 1 n1-946.plc1.org sls= [946, 947, 948] site= 1948 +3947 1 n1-947.plc1.org sls= [947, 948, 949] site= 1949 +3948 1 n1-948.plc1.org sls= [948, 949, 950] site= 1950 +3949 1 n1-949.plc1.org sls= [949, 950, 951] site= 1951 +3950 1 n1-950.plc1.org sls= [950, 951, 952] site= 1952 +3951 1 n1-951.plc1.org sls= [951, 952, 953] site= 1953 +3952 1 n1-952.plc1.org sls= [952, 953, 954] site= 1954 +3953 1 n1-953.plc1.org sls= [953, 954, 955] site= 1955 +3954 1 n1-954.plc1.org sls= [954, 955, 956] site= 1956 +3955 1 n1-955.plc1.org sls= [955, 956, 957] site= 1957 +3956 1 n1-956.plc1.org sls= [956, 957, 958] site= 1958 +3957 1 n1-957.plc1.org sls= [957, 958, 959] site= 1959 +3958 1 n1-958.plc1.org sls= [958, 959, 960] site= 1960 +3959 1 n1-959.plc1.org sls= [959, 960, 961] site= 1961 +3960 1 n1-960.plc1.org sls= [960, 961, 962] site= 1962 +3961 1 n1-961.plc1.org sls= [961, 962, 963] site= 1963 +3962 1 n1-962.plc1.org sls= [962, 963, 964] site= 1964 +3963 1 n1-963.plc1.org sls= [963, 964, 965] site= 1965 +3964 1 n1-964.plc1.org sls= [964, 965, 966] site= 1966 +3965 1 n1-965.plc1.org sls= [965, 966, 967] site= 1967 +3966 1 n1-966.plc1.org sls= [966, 967, 968] site= 1968 +3967 1 n1-967.plc1.org sls= [967, 968, 969] site= 1969 +3968 1 n1-968.plc1.org sls= [968, 969, 970] site= 1970 +3969 1 n1-969.plc1.org sls= [969, 970, 971] site= 1971 +3970 1 n1-970.plc1.org sls= [970, 971, 972] site= 1972 +3971 1 n1-971.plc1.org sls= [971, 972, 973] site= 1973 +3972 1 n1-972.plc1.org sls= [972, 973, 974] site= 1974 +3973 1 n1-973.plc1.org sls= [973, 974, 975] site= 1975 +3974 1 n1-974.plc1.org sls= [974, 975, 976] site= 1976 +3975 1 n1-975.plc1.org sls= [975, 976, 977] site= 1977 +3976 1 n1-976.plc1.org sls= [976, 977, 978] site= 1978 +3977 1 n1-977.plc1.org sls= [977, 978, 979] site= 1979 +3978 1 n1-978.plc1.org sls= [978, 979, 980] site= 1980 +3979 1 n1-979.plc1.org sls= [979, 980, 981] site= 1981 +3980 1 n1-980.plc1.org sls= [980, 981, 982] site= 1982 +3981 1 n1-981.plc1.org sls= [981, 982, 983] site= 1983 +3982 1 n1-982.plc1.org sls= [982, 983, 984] site= 1984 +3983 1 n1-983.plc1.org sls= [983, 984, 985] site= 1985 +3984 1 n1-984.plc1.org sls= [984, 985, 986] site= 1986 +3985 1 n1-985.plc1.org sls= [985, 986, 987] site= 1987 +3986 1 n1-986.plc1.org sls= [986, 987, 988] site= 1988 +3987 1 n1-987.plc1.org sls= [987, 988, 989] site= 1989 +3988 1 n1-988.plc1.org sls= [988, 989, 990] site= 1990 +3989 1 n1-989.plc1.org sls= [989, 990, 991] site= 1991 +3990 1 n1-990.plc1.org sls= [990, 991, 992] site= 1992 +3991 1 n1-991.plc1.org sls= [991, 992, 993] site= 1993 +3992 1 n1-992.plc1.org sls= [992, 993, 994] site= 1994 +3993 1 n1-993.plc1.org sls= [993, 994, 995] site= 1995 +3994 1 n1-994.plc1.org sls= [994, 995, 996] site= 1996 +3995 1 n1-995.plc1.org sls= [995, 996, 997] site= 1997 +3996 1 n1-996.plc1.org sls= [996, 997, 998] site= 1998 +3997 1 n1-997.plc1.org sls= [997, 998, 999] site= 1999 +3998 1 n1-998.plc1.org sls= [998, 999, 1000] site= 2000 +3999 1 n1-999.plc1.org sls= [999, 1000, 1001] site= 2001 +4000 1 n1-1000.plc1.org sls= [1000, 1001, 1002] site= 2002 +4001 1 n1-1001.plc1.org sls= [1001, 1002, 1003] site= 1003 +4002 1 n1-1002.plc1.org sls= [1002, 1003, 1004] site= 1004 +4003 1 n1-1003.plc1.org sls= [1003, 1004, 1005] site= 1005 +4004 1 n1-1004.plc1.org sls= [1004, 1005, 1006] site= 1006 +4005 1 n1-1005.plc1.org sls= [1005, 1006, 1007] site= 1007 +4006 1 n1-1006.plc1.org sls= [1006, 1007, 1008] site= 1008 +4007 1 n1-1007.plc1.org sls= [1007, 1008, 1009] site= 1009 +4008 1 n1-1008.plc1.org sls= [1008, 1009, 1010] site= 1010 +4009 1 n1-1009.plc1.org sls= [1009, 1010, 1011] site= 1011 +4010 1 n1-1010.plc1.org sls= [1010, 1011, 1012] site= 1012 +4011 1 n1-1011.plc1.org sls= [1011, 1012, 1013] site= 1013 +4012 1 n1-1012.plc1.org sls= [1012, 1013, 1014] site= 1014 +4013 1 n1-1013.plc1.org sls= [1013, 1014, 1015] site= 1015 +4014 1 n1-1014.plc1.org sls= [1014, 1015, 1016] site= 1016 +4015 1 n1-1015.plc1.org sls= [1015, 1016, 1017] site= 1017 +4016 1 n1-1016.plc1.org sls= [1016, 1017, 1018] site= 1018 +4017 1 n1-1017.plc1.org sls= [1017, 1018, 1019] site= 1019 +4018 1 n1-1018.plc1.org sls= [1018, 1019, 1020] site= 1020 +4019 1 n1-1019.plc1.org sls= [1019, 1020, 1021] site= 1021 +4020 1 n1-1020.plc1.org sls= [1020, 1021, 1022] site= 1022 +4021 1 n1-1021.plc1.org sls= [1021, 1022, 1023] site= 1023 +4022 1 n1-1022.plc1.org sls= [1022, 1023, 1024] site= 1024 +4023 1 n1-1023.plc1.org sls= [1023, 1024, 1025] site= 1025 +4024 1 n1-1024.plc1.org sls= [1024, 1025, 1026] site= 1026 +4025 1 n1-1025.plc1.org sls= [1025, 1026, 1027] site= 1027 +4026 1 n1-1026.plc1.org sls= [1026, 1027, 1028] site= 1028 +4027 1 n1-1027.plc1.org sls= [1027, 1028, 1029] site= 1029 +4028 1 n1-1028.plc1.org sls= [1028, 1029, 1030] site= 1030 +4029 1 n1-1029.plc1.org sls= [1029, 1030, 1031] site= 1031 +4030 1 n1-1030.plc1.org sls= [1030, 1031, 1032] site= 1032 +4031 1 n1-1031.plc1.org sls= [1031, 1032, 1033] site= 1033 +4032 1 n1-1032.plc1.org sls= [1032, 1033, 1034] site= 1034 +4033 1 n1-1033.plc1.org sls= [1033, 1034, 1035] site= 1035 +4034 1 n1-1034.plc1.org sls= [1034, 1035, 1036] site= 1036 +4035 1 n1-1035.plc1.org sls= [1035, 1036, 1037] site= 1037 +4036 1 n1-1036.plc1.org sls= [1036, 1037, 1038] site= 1038 +4037 1 n1-1037.plc1.org sls= [1037, 1038, 1039] site= 1039 +4038 1 n1-1038.plc1.org sls= [1038, 1039, 1040] site= 1040 +4039 1 n1-1039.plc1.org sls= [1039, 1040, 1041] site= 1041 +4040 1 n1-1040.plc1.org sls= [1040, 1041, 1042] site= 1042 +4041 1 n1-1041.plc1.org sls= [1041, 1042, 1043] site= 1043 +4042 1 n1-1042.plc1.org sls= [1042, 1043, 1044] site= 1044 +4043 1 n1-1043.plc1.org sls= [1043, 1044, 1045] site= 1045 +4044 1 n1-1044.plc1.org sls= [1044, 1045, 1046] site= 1046 +4045 1 n1-1045.plc1.org sls= [1045, 1046, 1047] site= 1047 +4046 1 n1-1046.plc1.org sls= [1046, 1047, 1048] site= 1048 +4047 1 n1-1047.plc1.org sls= [1047, 1048, 1049] site= 1049 +4048 1 n1-1048.plc1.org sls= [1048, 1049, 1050] site= 1050 +4049 1 n1-1049.plc1.org sls= [1049, 1050, 1051] site= 1051 +4050 1 n1-1050.plc1.org sls= [1050, 1051, 1052] site= 1052 +4051 1 n1-1051.plc1.org sls= [1051, 1052, 1053] site= 1053 +4052 1 n1-1052.plc1.org sls= [1052, 1053, 1054] site= 1054 +4053 1 n1-1053.plc1.org sls= [1053, 1054, 1055] site= 1055 +4054 1 n1-1054.plc1.org sls= [1054, 1055, 1056] site= 1056 +4055 1 n1-1055.plc1.org sls= [1055, 1056, 1057] site= 1057 +4056 1 n1-1056.plc1.org sls= [1056, 1057, 1058] site= 1058 +4057 1 n1-1057.plc1.org sls= [1057, 1058, 1059] site= 1059 +4058 1 n1-1058.plc1.org sls= [1058, 1059, 1060] site= 1060 +4059 1 n1-1059.plc1.org sls= [1059, 1060, 1061] site= 1061 +4060 1 n1-1060.plc1.org sls= [1060, 1061, 1062] site= 1062 +4061 1 n1-1061.plc1.org sls= [1061, 1062, 1063] site= 1063 +4062 1 n1-1062.plc1.org sls= [1062, 1063, 1064] site= 1064 +4063 1 n1-1063.plc1.org sls= [1063, 1064, 1065] site= 1065 +4064 1 n1-1064.plc1.org sls= [1064, 1065, 1066] site= 1066 +4065 1 n1-1065.plc1.org sls= [1065, 1066, 1067] site= 1067 +4066 1 n1-1066.plc1.org sls= [1066, 1067, 1068] site= 1068 +4067 1 n1-1067.plc1.org sls= [1067, 1068, 1069] site= 1069 +4068 1 n1-1068.plc1.org sls= [1068, 1069, 1070] site= 1070 +4069 1 n1-1069.plc1.org sls= [1069, 1070, 1071] site= 1071 +4070 1 n1-1070.plc1.org sls= [1070, 1071, 1072] site= 1072 +4071 1 n1-1071.plc1.org sls= [1071, 1072, 1073] site= 1073 +4072 1 n1-1072.plc1.org sls= [1072, 1073, 1074] site= 1074 +4073 1 n1-1073.plc1.org sls= [1073, 1074, 1075] site= 1075 +4074 1 n1-1074.plc1.org sls= [1074, 1075, 1076] site= 1076 +4075 1 n1-1075.plc1.org sls= [1075, 1076, 1077] site= 1077 +4076 1 n1-1076.plc1.org sls= [1076, 1077, 1078] site= 1078 +4077 1 n1-1077.plc1.org sls= [1077, 1078, 1079] site= 1079 +4078 1 n1-1078.plc1.org sls= [1078, 1079, 1080] site= 1080 +4079 1 n1-1079.plc1.org sls= [1079, 1080, 1081] site= 1081 +4080 1 n1-1080.plc1.org sls= [1080, 1081, 1082] site= 1082 +4081 1 n1-1081.plc1.org sls= [1081, 1082, 1083] site= 1083 +4082 1 n1-1082.plc1.org sls= [1082, 1083, 1084] site= 1084 +4083 1 n1-1083.plc1.org sls= [1083, 1084, 1085] site= 1085 +4084 1 n1-1084.plc1.org sls= [1084, 1085, 1086] site= 1086 +4085 1 n1-1085.plc1.org sls= [1085, 1086, 1087] site= 1087 +4086 1 n1-1086.plc1.org sls= [1086, 1087, 1088] site= 1088 +4087 1 n1-1087.plc1.org sls= [1087, 1088, 1089] site= 1089 +4088 1 n1-1088.plc1.org sls= [1088, 1089, 1090] site= 1090 +4089 1 n1-1089.plc1.org sls= [1089, 1090, 1091] site= 1091 +4090 1 n1-1090.plc1.org sls= [1090, 1091, 1092] site= 1092 +4091 1 n1-1091.plc1.org sls= [1091, 1092, 1093] site= 1093 +4092 1 n1-1092.plc1.org sls= [1092, 1093, 1094] site= 1094 +4093 1 n1-1093.plc1.org sls= [1093, 1094, 1095] site= 1095 +4094 1 n1-1094.plc1.org sls= [1094, 1095, 1096] site= 1096 +4095 1 n1-1095.plc1.org sls= [1095, 1096, 1097] site= 1097 +4096 1 n1-1096.plc1.org sls= [1096, 1097, 1098] site= 1098 +4097 1 n1-1097.plc1.org sls= [1097, 1098, 1099] site= 1099 +4098 1 n1-1098.plc1.org sls= [1098, 1099, 1100] site= 1100 +4099 1 n1-1099.plc1.org sls= [1099, 1100, 1101] site= 1101 +4100 1 n1-1100.plc1.org sls= [1100, 1101, 1102] site= 1102 +4101 1 n1-1101.plc1.org sls= [1101, 1102, 1103] site= 1103 +4102 1 n1-1102.plc1.org sls= [1102, 1103, 1104] site= 1104 +4103 1 n1-1103.plc1.org sls= [1103, 1104, 1105] site= 1105 +4104 1 n1-1104.plc1.org sls= [1104, 1105, 1106] site= 1106 +4105 1 n1-1105.plc1.org sls= [1105, 1106, 1107] site= 1107 +4106 1 n1-1106.plc1.org sls= [1106, 1107, 1108] site= 1108 +4107 1 n1-1107.plc1.org sls= [1107, 1108, 1109] site= 1109 +4108 1 n1-1108.plc1.org sls= [1108, 1109, 1110] site= 1110 +4109 1 n1-1109.plc1.org sls= [1109, 1110, 1111] site= 1111 +4110 1 n1-1110.plc1.org sls= [1110, 1111, 1112] site= 1112 +4111 1 n1-1111.plc1.org sls= [1111, 1112, 1113] site= 1113 +4112 1 n1-1112.plc1.org sls= [1112, 1113, 1114] site= 1114 +4113 1 n1-1113.plc1.org sls= [1113, 1114, 1115] site= 1115 +4114 1 n1-1114.plc1.org sls= [1114, 1115, 1116] site= 1116 +4115 1 n1-1115.plc1.org sls= [1115, 1116, 1117] site= 1117 +4116 1 n1-1116.plc1.org sls= [1116, 1117, 1118] site= 1118 +4117 1 n1-1117.plc1.org sls= [1117, 1118, 1119] site= 1119 +4118 1 n1-1118.plc1.org sls= [1118, 1119, 1120] site= 1120 +4119 1 n1-1119.plc1.org sls= [1119, 1120, 1121] site= 1121 +4120 1 n1-1120.plc1.org sls= [1120, 1121, 1122] site= 1122 +4121 1 n1-1121.plc1.org sls= [1121, 1122, 1123] site= 1123 +4122 1 n1-1122.plc1.org sls= [1122, 1123, 1124] site= 1124 +4123 1 n1-1123.plc1.org sls= [1123, 1124, 1125] site= 1125 +4124 1 n1-1124.plc1.org sls= [1124, 1125, 1126] site= 1126 +4125 1 n1-1125.plc1.org sls= [1125, 1126, 1127] site= 1127 +4126 1 n1-1126.plc1.org sls= [1126, 1127, 1128] site= 1128 +4127 1 n1-1127.plc1.org sls= [1127, 1128, 1129] site= 1129 +4128 1 n1-1128.plc1.org sls= [1128, 1129, 1130] site= 1130 +4129 1 n1-1129.plc1.org sls= [1129, 1130, 1131] site= 1131 +4130 1 n1-1130.plc1.org sls= [1130, 1131, 1132] site= 1132 +4131 1 n1-1131.plc1.org sls= [1131, 1132, 1133] site= 1133 +4132 1 n1-1132.plc1.org sls= [1132, 1133, 1134] site= 1134 +4133 1 n1-1133.plc1.org sls= [1133, 1134, 1135] site= 1135 +4134 1 n1-1134.plc1.org sls= [1134, 1135, 1136] site= 1136 +4135 1 n1-1135.plc1.org sls= [1135, 1136, 1137] site= 1137 +4136 1 n1-1136.plc1.org sls= [1136, 1137, 1138] site= 1138 +4137 1 n1-1137.plc1.org sls= [1137, 1138, 1139] site= 1139 +4138 1 n1-1138.plc1.org sls= [1138, 1139, 1140] site= 1140 +4139 1 n1-1139.plc1.org sls= [1139, 1140, 1141] site= 1141 +4140 1 n1-1140.plc1.org sls= [1140, 1141, 1142] site= 1142 +4141 1 n1-1141.plc1.org sls= [1141, 1142, 1143] site= 1143 +4142 1 n1-1142.plc1.org sls= [1142, 1143, 1144] site= 1144 +4143 1 n1-1143.plc1.org sls= [1143, 1144, 1145] site= 1145 +4144 1 n1-1144.plc1.org sls= [1144, 1145, 1146] site= 1146 +4145 1 n1-1145.plc1.org sls= [1145, 1146, 1147] site= 1147 +4146 1 n1-1146.plc1.org sls= [1146, 1147, 1148] site= 1148 +4147 1 n1-1147.plc1.org sls= [1147, 1148, 1149] site= 1149 +4148 1 n1-1148.plc1.org sls= [1148, 1149, 1150] site= 1150 +4149 1 n1-1149.plc1.org sls= [1149, 1150, 1151] site= 1151 +4150 1 n1-1150.plc1.org sls= [1150, 1151, 1152] site= 1152 +4151 1 n1-1151.plc1.org sls= [1151, 1152, 1153] site= 1153 +4152 1 n1-1152.plc1.org sls= [1152, 1153, 1154] site= 1154 +4153 1 n1-1153.plc1.org sls= [1153, 1154, 1155] site= 1155 +4154 1 n1-1154.plc1.org sls= [1154, 1155, 1156] site= 1156 +4155 1 n1-1155.plc1.org sls= [1155, 1156, 1157] site= 1157 +4156 1 n1-1156.plc1.org sls= [1156, 1157, 1158] site= 1158 +4157 1 n1-1157.plc1.org sls= [1157, 1158, 1159] site= 1159 +4158 1 n1-1158.plc1.org sls= [1158, 1159, 1160] site= 1160 +4159 1 n1-1159.plc1.org sls= [1159, 1160, 1161] site= 1161 +4160 1 n1-1160.plc1.org sls= [1160, 1161, 1162] site= 1162 +4161 1 n1-1161.plc1.org sls= [1161, 1162, 1163] site= 1163 +4162 1 n1-1162.plc1.org sls= [1162, 1163, 1164] site= 1164 +4163 1 n1-1163.plc1.org sls= [1163, 1164, 1165] site= 1165 +4164 1 n1-1164.plc1.org sls= [1164, 1165, 1166] site= 1166 +4165 1 n1-1165.plc1.org sls= [1165, 1166, 1167] site= 1167 +4166 1 n1-1166.plc1.org sls= [1166, 1167, 1168] site= 1168 +4167 1 n1-1167.plc1.org sls= [1167, 1168, 1169] site= 1169 +4168 1 n1-1168.plc1.org sls= [1168, 1169, 1170] site= 1170 +4169 1 n1-1169.plc1.org sls= [1169, 1170, 1171] site= 1171 +4170 1 n1-1170.plc1.org sls= [1170, 1171, 1172] site= 1172 +4171 1 n1-1171.plc1.org sls= [1171, 1172, 1173] site= 1173 +4172 1 n1-1172.plc1.org sls= [1172, 1173, 1174] site= 1174 +4173 1 n1-1173.plc1.org sls= [1173, 1174, 1175] site= 1175 +4174 1 n1-1174.plc1.org sls= [1174, 1175, 1176] site= 1176 +4175 1 n1-1175.plc1.org sls= [1175, 1176, 1177] site= 1177 +4176 1 n1-1176.plc1.org sls= [1176, 1177, 1178] site= 1178 +4177 1 n1-1177.plc1.org sls= [1177, 1178, 1179] site= 1179 +4178 1 n1-1178.plc1.org sls= [1178, 1179, 1180] site= 1180 +4179 1 n1-1179.plc1.org sls= [1179, 1180, 1181] site= 1181 +4180 1 n1-1180.plc1.org sls= [1180, 1181, 1182] site= 1182 +4181 1 n1-1181.plc1.org sls= [1181, 1182, 1183] site= 1183 +4182 1 n1-1182.plc1.org sls= [1182, 1183, 1184] site= 1184 +4183 1 n1-1183.plc1.org sls= [1183, 1184, 1185] site= 1185 +4184 1 n1-1184.plc1.org sls= [1184, 1185, 1186] site= 1186 +4185 1 n1-1185.plc1.org sls= [1185, 1186, 1187] site= 1187 +4186 1 n1-1186.plc1.org sls= [1186, 1187, 1188] site= 1188 +4187 1 n1-1187.plc1.org sls= [1187, 1188, 1189] site= 1189 +4188 1 n1-1188.plc1.org sls= [1188, 1189, 1190] site= 1190 +4189 1 n1-1189.plc1.org sls= [1189, 1190, 1191] site= 1191 +4190 1 n1-1190.plc1.org sls= [1190, 1191, 1192] site= 1192 +4191 1 n1-1191.plc1.org sls= [1191, 1192, 1193] site= 1193 +4192 1 n1-1192.plc1.org sls= [1192, 1193, 1194] site= 1194 +4193 1 n1-1193.plc1.org sls= [1193, 1194, 1195] site= 1195 +4194 1 n1-1194.plc1.org sls= [1194, 1195, 1196] site= 1196 +4195 1 n1-1195.plc1.org sls= [1195, 1196, 1197] site= 1197 +4196 1 n1-1196.plc1.org sls= [1196, 1197, 1198] site= 1198 +4197 1 n1-1197.plc1.org sls= [1197, 1198, 1199] site= 1199 +4198 1 n1-1198.plc1.org sls= [1198, 1199, 1200] site= 1200 +4199 1 n1-1199.plc1.org sls= [1199, 1200, 1201] site= 1201 +4200 1 n1-1200.plc1.org sls= [1200, 1201, 1202] site= 1202 +4201 1 n1-1201.plc1.org sls= [1201, 1202, 1203] site= 1203 +4202 1 n1-1202.plc1.org sls= [1202, 1203, 1204] site= 1204 +4203 1 n1-1203.plc1.org sls= [1203, 1204, 1205] site= 1205 +4204 1 n1-1204.plc1.org sls= [1204, 1205, 1206] site= 1206 +4205 1 n1-1205.plc1.org sls= [1205, 1206, 1207] site= 1207 +4206 1 n1-1206.plc1.org sls= [1206, 1207, 1208] site= 1208 +4207 1 n1-1207.plc1.org sls= [1207, 1208, 1209] site= 1209 +4208 1 n1-1208.plc1.org sls= [1208, 1209, 1210] site= 1210 +4209 1 n1-1209.plc1.org sls= [1209, 1210, 1211] site= 1211 +4210 1 n1-1210.plc1.org sls= [1210, 1211, 1212] site= 1212 +4211 1 n1-1211.plc1.org sls= [1211, 1212, 1213] site= 1213 +4212 1 n1-1212.plc1.org sls= [1212, 1213, 1214] site= 1214 +4213 1 n1-1213.plc1.org sls= [1213, 1214, 1215] site= 1215 +4214 1 n1-1214.plc1.org sls= [1214, 1215, 1216] site= 1216 +4215 1 n1-1215.plc1.org sls= [1215, 1216, 1217] site= 1217 +4216 1 n1-1216.plc1.org sls= [1216, 1217, 1218] site= 1218 +4217 1 n1-1217.plc1.org sls= [1217, 1218, 1219] site= 1219 +4218 1 n1-1218.plc1.org sls= [1218, 1219, 1220] site= 1220 +4219 1 n1-1219.plc1.org sls= [1219, 1220, 1221] site= 1221 +4220 1 n1-1220.plc1.org sls= [1220, 1221, 1222] site= 1222 +4221 1 n1-1221.plc1.org sls= [1221, 1222, 1223] site= 1223 +4222 1 n1-1222.plc1.org sls= [1222, 1223, 1224] site= 1224 +4223 1 n1-1223.plc1.org sls= [1223, 1224, 1225] site= 1225 +4224 1 n1-1224.plc1.org sls= [1224, 1225, 1226] site= 1226 +4225 1 n1-1225.plc1.org sls= [1225, 1226, 1227] site= 1227 +4226 1 n1-1226.plc1.org sls= [1226, 1227, 1228] site= 1228 +4227 1 n1-1227.plc1.org sls= [1227, 1228, 1229] site= 1229 +4228 1 n1-1228.plc1.org sls= [1228, 1229, 1230] site= 1230 +4229 1 n1-1229.plc1.org sls= [1229, 1230, 1231] site= 1231 +4230 1 n1-1230.plc1.org sls= [1230, 1231, 1232] site= 1232 +4231 1 n1-1231.plc1.org sls= [1231, 1232, 1233] site= 1233 +4232 1 n1-1232.plc1.org sls= [1232, 1233, 1234] site= 1234 +4233 1 n1-1233.plc1.org sls= [1233, 1234, 1235] site= 1235 +4234 1 n1-1234.plc1.org sls= [1234, 1235, 1236] site= 1236 +4235 1 n1-1235.plc1.org sls= [1235, 1236, 1237] site= 1237 +4236 1 n1-1236.plc1.org sls= [1236, 1237, 1238] site= 1238 +4237 1 n1-1237.plc1.org sls= [1237, 1238, 1239] site= 1239 +4238 1 n1-1238.plc1.org sls= [1238, 1239, 1240] site= 1240 +4239 1 n1-1239.plc1.org sls= [1239, 1240, 1241] site= 1241 +4240 1 n1-1240.plc1.org sls= [1240, 1241, 1242] site= 1242 +4241 1 n1-1241.plc1.org sls= [1241, 1242, 1243] site= 1243 +4242 1 n1-1242.plc1.org sls= [1242, 1243, 1244] site= 1244 +4243 1 n1-1243.plc1.org sls= [1243, 1244, 1245] site= 1245 +4244 1 n1-1244.plc1.org sls= [1244, 1245, 1246] site= 1246 +4245 1 n1-1245.plc1.org sls= [1245, 1246, 1247] site= 1247 +4246 1 n1-1246.plc1.org sls= [1246, 1247, 1248] site= 1248 +4247 1 n1-1247.plc1.org sls= [1247, 1248, 1249] site= 1249 +4248 1 n1-1248.plc1.org sls= [1248, 1249, 1250] site= 1250 +4249 1 n1-1249.plc1.org sls= [1249, 1250, 1251] site= 1251 +4250 1 n1-1250.plc1.org sls= [1250, 1251, 1252] site= 1252 +4251 1 n1-1251.plc1.org sls= [1251, 1252, 1253] site= 1253 +4252 1 n1-1252.plc1.org sls= [1252, 1253, 1254] site= 1254 +4253 1 n1-1253.plc1.org sls= [1253, 1254, 1255] site= 1255 +4254 1 n1-1254.plc1.org sls= [1254, 1255, 1256] site= 1256 +4255 1 n1-1255.plc1.org sls= [1255, 1256, 1257] site= 1257 +4256 1 n1-1256.plc1.org sls= [1256, 1257, 1258] site= 1258 +4257 1 n1-1257.plc1.org sls= [1257, 1258, 1259] site= 1259 +4258 1 n1-1258.plc1.org sls= [1258, 1259, 1260] site= 1260 +4259 1 n1-1259.plc1.org sls= [1259, 1260, 1261] site= 1261 +4260 1 n1-1260.plc1.org sls= [1260, 1261, 1262] site= 1262 +4261 1 n1-1261.plc1.org sls= [1261, 1262, 1263] site= 1263 +4262 1 n1-1262.plc1.org sls= [1262, 1263, 1264] site= 1264 +4263 1 n1-1263.plc1.org sls= [1263, 1264, 1265] site= 1265 +4264 1 n1-1264.plc1.org sls= [1264, 1265, 1266] site= 1266 +4265 1 n1-1265.plc1.org sls= [1265, 1266, 1267] site= 1267 +4266 1 n1-1266.plc1.org sls= [1266, 1267, 1268] site= 1268 +4267 1 n1-1267.plc1.org sls= [1267, 1268, 1269] site= 1269 +4268 1 n1-1268.plc1.org sls= [1268, 1269, 1270] site= 1270 +4269 1 n1-1269.plc1.org sls= [1269, 1270, 1271] site= 1271 +4270 1 n1-1270.plc1.org sls= [1270, 1271, 1272] site= 1272 +4271 1 n1-1271.plc1.org sls= [1271, 1272, 1273] site= 1273 +4272 1 n1-1272.plc1.org sls= [1272, 1273, 1274] site= 1274 +4273 1 n1-1273.plc1.org sls= [1273, 1274, 1275] site= 1275 +4274 1 n1-1274.plc1.org sls= [1274, 1275, 1276] site= 1276 +4275 1 n1-1275.plc1.org sls= [1275, 1276, 1277] site= 1277 +4276 1 n1-1276.plc1.org sls= [1276, 1277, 1278] site= 1278 +4277 1 n1-1277.plc1.org sls= [1277, 1278, 1279] site= 1279 +4278 1 n1-1278.plc1.org sls= [1278, 1279, 1280] site= 1280 +4279 1 n1-1279.plc1.org sls= [1279, 1280, 1281] site= 1281 +4280 1 n1-1280.plc1.org sls= [1280, 1281, 1282] site= 1282 +4281 1 n1-1281.plc1.org sls= [1281, 1282, 1283] site= 1283 +4282 1 n1-1282.plc1.org sls= [1282, 1283, 1284] site= 1284 +4283 1 n1-1283.plc1.org sls= [1283, 1284, 1285] site= 1285 +4284 1 n1-1284.plc1.org sls= [1284, 1285, 1286] site= 1286 +4285 1 n1-1285.plc1.org sls= [1285, 1286, 1287] site= 1287 +4286 1 n1-1286.plc1.org sls= [1286, 1287, 1288] site= 1288 +4287 1 n1-1287.plc1.org sls= [1287, 1288, 1289] site= 1289 +4288 1 n1-1288.plc1.org sls= [1288, 1289, 1290] site= 1290 +4289 1 n1-1289.plc1.org sls= [1289, 1290, 1291] site= 1291 +4290 1 n1-1290.plc1.org sls= [1290, 1291, 1292] site= 1292 +4291 1 n1-1291.plc1.org sls= [1291, 1292, 1293] site= 1293 +4292 1 n1-1292.plc1.org sls= [1292, 1293, 1294] site= 1294 +4293 1 n1-1293.plc1.org sls= [1293, 1294, 1295] site= 1295 +4294 1 n1-1294.plc1.org sls= [1294, 1295, 1296] site= 1296 +4295 1 n1-1295.plc1.org sls= [1295, 1296, 1297] site= 1297 +4296 1 n1-1296.plc1.org sls= [1296, 1297, 1298] site= 1298 +4297 1 n1-1297.plc1.org sls= [1297, 1298, 1299] site= 1299 +4298 1 n1-1298.plc1.org sls= [1298, 1299, 1300] site= 1300 +4299 1 n1-1299.plc1.org sls= [1299, 1300, 1301] site= 1301 +4300 1 n1-1300.plc1.org sls= [1300, 1301, 1302] site= 1302 +4301 1 n1-1301.plc1.org sls= [1301, 1302, 1303] site= 1303 +4302 1 n1-1302.plc1.org sls= [1302, 1303, 1304] site= 1304 +4303 1 n1-1303.plc1.org sls= [1303, 1304, 1305] site= 1305 +4304 1 n1-1304.plc1.org sls= [1304, 1305, 1306] site= 1306 +4305 1 n1-1305.plc1.org sls= [1305, 1306, 1307] site= 1307 +4306 1 n1-1306.plc1.org sls= [1306, 1307, 1308] site= 1308 +4307 1 n1-1307.plc1.org sls= [1307, 1308, 1309] site= 1309 +4308 1 n1-1308.plc1.org sls= [1308, 1309, 1310] site= 1310 +4309 1 n1-1309.plc1.org sls= [1309, 1310, 1311] site= 1311 +4310 1 n1-1310.plc1.org sls= [1310, 1311, 1312] site= 1312 +4311 1 n1-1311.plc1.org sls= [1311, 1312, 1313] site= 1313 +4312 1 n1-1312.plc1.org sls= [1312, 1313, 1314] site= 1314 +4313 1 n1-1313.plc1.org sls= [1313, 1314, 1315] site= 1315 +4314 1 n1-1314.plc1.org sls= [1314, 1315, 1316] site= 1316 +4315 1 n1-1315.plc1.org sls= [1315, 1316, 1317] site= 1317 +4316 1 n1-1316.plc1.org sls= [1316, 1317, 1318] site= 1318 +4317 1 n1-1317.plc1.org sls= [1317, 1318, 1319] site= 1319 +4318 1 n1-1318.plc1.org sls= [1318, 1319, 1320] site= 1320 +4319 1 n1-1319.plc1.org sls= [1319, 1320, 1321] site= 1321 +4320 1 n1-1320.plc1.org sls= [1320, 1321, 1322] site= 1322 +4321 1 n1-1321.plc1.org sls= [1321, 1322, 1323] site= 1323 +4322 1 n1-1322.plc1.org sls= [1322, 1323, 1324] site= 1324 +4323 1 n1-1323.plc1.org sls= [1323, 1324, 1325] site= 1325 +4324 1 n1-1324.plc1.org sls= [1324, 1325, 1326] site= 1326 +4325 1 n1-1325.plc1.org sls= [1325, 1326, 1327] site= 1327 +4326 1 n1-1326.plc1.org sls= [1326, 1327, 1328] site= 1328 +4327 1 n1-1327.plc1.org sls= [1327, 1328, 1329] site= 1329 +4328 1 n1-1328.plc1.org sls= [1328, 1329, 1330] site= 1330 +4329 1 n1-1329.plc1.org sls= [1329, 1330, 1331] site= 1331 +4330 1 n1-1330.plc1.org sls= [1330, 1331, 1332] site= 1332 +4331 1 n1-1331.plc1.org sls= [1331, 1332, 1333] site= 1333 +4332 1 n1-1332.plc1.org sls= [1332, 1333, 1334] site= 1334 +4333 1 n1-1333.plc1.org sls= [1333, 1334, 1335] site= 1335 +4334 1 n1-1334.plc1.org sls= [1334, 1335, 1336] site= 1336 +4335 1 n1-1335.plc1.org sls= [1335, 1336, 1337] site= 1337 +4336 1 n1-1336.plc1.org sls= [1336, 1337, 1338] site= 1338 +4337 1 n1-1337.plc1.org sls= [1337, 1338, 1339] site= 1339 +4338 1 n1-1338.plc1.org sls= [1338, 1339, 1340] site= 1340 +4339 1 n1-1339.plc1.org sls= [1339, 1340, 1341] site= 1341 +4340 1 n1-1340.plc1.org sls= [1340, 1341, 1342] site= 1342 +4341 1 n1-1341.plc1.org sls= [1341, 1342, 1343] site= 1343 +4342 1 n1-1342.plc1.org sls= [1342, 1343, 1344] site= 1344 +4343 1 n1-1343.plc1.org sls= [1343, 1344, 1345] site= 1345 +4344 1 n1-1344.plc1.org sls= [1344, 1345, 1346] site= 1346 +4345 1 n1-1345.plc1.org sls= [1345, 1346, 1347] site= 1347 +4346 1 n1-1346.plc1.org sls= [1346, 1347, 1348] site= 1348 +4347 1 n1-1347.plc1.org sls= [1347, 1348, 1349] site= 1349 +4348 1 n1-1348.plc1.org sls= [1348, 1349, 1350] site= 1350 +4349 1 n1-1349.plc1.org sls= [1349, 1350, 1351] site= 1351 +4350 1 n1-1350.plc1.org sls= [1350, 1351, 1352] site= 1352 +4351 1 n1-1351.plc1.org sls= [1351, 1352, 1353] site= 1353 +4352 1 n1-1352.plc1.org sls= [1352, 1353, 1354] site= 1354 +4353 1 n1-1353.plc1.org sls= [1353, 1354, 1355] site= 1355 +4354 1 n1-1354.plc1.org sls= [1354, 1355, 1356] site= 1356 +4355 1 n1-1355.plc1.org sls= [1355, 1356, 1357] site= 1357 +4356 1 n1-1356.plc1.org sls= [1356, 1357, 1358] site= 1358 +4357 1 n1-1357.plc1.org sls= [1357, 1358, 1359] site= 1359 +4358 1 n1-1358.plc1.org sls= [1358, 1359, 1360] site= 1360 +4359 1 n1-1359.plc1.org sls= [1359, 1360, 1361] site= 1361 +4360 1 n1-1360.plc1.org sls= [1360, 1361, 1362] site= 1362 +4361 1 n1-1361.plc1.org sls= [1361, 1362, 1363] site= 1363 +4362 1 n1-1362.plc1.org sls= [1362, 1363, 1364] site= 1364 +4363 1 n1-1363.plc1.org sls= [1363, 1364, 1365] site= 1365 +4364 1 n1-1364.plc1.org sls= [1364, 1365, 1366] site= 1366 +4365 1 n1-1365.plc1.org sls= [1365, 1366, 1367] site= 1367 +4366 1 n1-1366.plc1.org sls= [1366, 1367, 1368] site= 1368 +4367 1 n1-1367.plc1.org sls= [1367, 1368, 1369] site= 1369 +4368 1 n1-1368.plc1.org sls= [1368, 1369, 1370] site= 1370 +4369 1 n1-1369.plc1.org sls= [1369, 1370, 1371] site= 1371 +4370 1 n1-1370.plc1.org sls= [1370, 1371, 1372] site= 1372 +4371 1 n1-1371.plc1.org sls= [1371, 1372, 1373] site= 1373 +4372 1 n1-1372.plc1.org sls= [1372, 1373, 1374] site= 1374 +4373 1 n1-1373.plc1.org sls= [1373, 1374, 1375] site= 1375 +4374 1 n1-1374.plc1.org sls= [1374, 1375, 1376] site= 1376 +4375 1 n1-1375.plc1.org sls= [1375, 1376, 1377] site= 1377 +4376 1 n1-1376.plc1.org sls= [1376, 1377, 1378] site= 1378 +4377 1 n1-1377.plc1.org sls= [1377, 1378, 1379] site= 1379 +4378 1 n1-1378.plc1.org sls= [1378, 1379, 1380] site= 1380 +4379 1 n1-1379.plc1.org sls= [1379, 1380, 1381] site= 1381 +4380 1 n1-1380.plc1.org sls= [1380, 1381, 1382] site= 1382 +4381 1 n1-1381.plc1.org sls= [1381, 1382, 1383] site= 1383 +4382 1 n1-1382.plc1.org sls= [1382, 1383, 1384] site= 1384 +4383 1 n1-1383.plc1.org sls= [1383, 1384, 1385] site= 1385 +4384 1 n1-1384.plc1.org sls= [1384, 1385, 1386] site= 1386 +4385 1 n1-1385.plc1.org sls= [1385, 1386, 1387] site= 1387 +4386 1 n1-1386.plc1.org sls= [1386, 1387, 1388] site= 1388 +4387 1 n1-1387.plc1.org sls= [1387, 1388, 1389] site= 1389 +4388 1 n1-1388.plc1.org sls= [1388, 1389, 1390] site= 1390 +4389 1 n1-1389.plc1.org sls= [1389, 1390, 1391] site= 1391 +4390 1 n1-1390.plc1.org sls= [1390, 1391, 1392] site= 1392 +4391 1 n1-1391.plc1.org sls= [1391, 1392, 1393] site= 1393 +4392 1 n1-1392.plc1.org sls= [1392, 1393, 1394] site= 1394 +4393 1 n1-1393.plc1.org sls= [1393, 1394, 1395] site= 1395 +4394 1 n1-1394.plc1.org sls= [1394, 1395, 1396] site= 1396 +4395 1 n1-1395.plc1.org sls= [1395, 1396, 1397] site= 1397 +4396 1 n1-1396.plc1.org sls= [1396, 1397, 1398] site= 1398 +4397 1 n1-1397.plc1.org sls= [1397, 1398, 1399] site= 1399 +4398 1 n1-1398.plc1.org sls= [1398, 1399, 1400] site= 1400 +4399 1 n1-1399.plc1.org sls= [1399, 1400, 1401] site= 1401 +4400 1 n1-1400.plc1.org sls= [1400, 1401, 1402] site= 1402 +4401 1 n1-1401.plc1.org sls= [1401, 1402, 1403] site= 1403 +4402 1 n1-1402.plc1.org sls= [1402, 1403, 1404] site= 1404 +4403 1 n1-1403.plc1.org sls= [1403, 1404, 1405] site= 1405 +4404 1 n1-1404.plc1.org sls= [1404, 1405, 1406] site= 1406 +4405 1 n1-1405.plc1.org sls= [1405, 1406, 1407] site= 1407 +4406 1 n1-1406.plc1.org sls= [1406, 1407, 1408] site= 1408 +4407 1 n1-1407.plc1.org sls= [1407, 1408, 1409] site= 1409 +4408 1 n1-1408.plc1.org sls= [1408, 1409, 1410] site= 1410 +4409 1 n1-1409.plc1.org sls= [1409, 1410, 1411] site= 1411 +4410 1 n1-1410.plc1.org sls= [1410, 1411, 1412] site= 1412 +4411 1 n1-1411.plc1.org sls= [1411, 1412, 1413] site= 1413 +4412 1 n1-1412.plc1.org sls= [1412, 1413, 1414] site= 1414 +4413 1 n1-1413.plc1.org sls= [1413, 1414, 1415] site= 1415 +4414 1 n1-1414.plc1.org sls= [1414, 1415, 1416] site= 1416 +4415 1 n1-1415.plc1.org sls= [1415, 1416, 1417] site= 1417 +4416 1 n1-1416.plc1.org sls= [1416, 1417, 1418] site= 1418 +4417 1 n1-1417.plc1.org sls= [1417, 1418, 1419] site= 1419 +4418 1 n1-1418.plc1.org sls= [1418, 1419, 1420] site= 1420 +4419 1 n1-1419.plc1.org sls= [1419, 1420, 1421] site= 1421 +4420 1 n1-1420.plc1.org sls= [1420, 1421, 1422] site= 1422 +4421 1 n1-1421.plc1.org sls= [1421, 1422, 1423] site= 1423 +4422 1 n1-1422.plc1.org sls= [1422, 1423, 1424] site= 1424 +4423 1 n1-1423.plc1.org sls= [1423, 1424, 1425] site= 1425 +4424 1 n1-1424.plc1.org sls= [1424, 1425, 1426] site= 1426 +4425 1 n1-1425.plc1.org sls= [1425, 1426, 1427] site= 1427 +4426 1 n1-1426.plc1.org sls= [1426, 1427, 1428] site= 1428 +4427 1 n1-1427.plc1.org sls= [1427, 1428, 1429] site= 1429 +4428 1 n1-1428.plc1.org sls= [1428, 1429, 1430] site= 1430 +4429 1 n1-1429.plc1.org sls= [1429, 1430, 1431] site= 1431 +4430 1 n1-1430.plc1.org sls= [1430, 1431, 1432] site= 1432 +4431 1 n1-1431.plc1.org sls= [1431, 1432, 1433] site= 1433 +4432 1 n1-1432.plc1.org sls= [1432, 1433, 1434] site= 1434 +4433 1 n1-1433.plc1.org sls= [1433, 1434, 1435] site= 1435 +4434 1 n1-1434.plc1.org sls= [1434, 1435, 1436] site= 1436 +4435 1 n1-1435.plc1.org sls= [1435, 1436, 1437] site= 1437 +4436 1 n1-1436.plc1.org sls= [1436, 1437, 1438] site= 1438 +4437 1 n1-1437.plc1.org sls= [1437, 1438, 1439] site= 1439 +4438 1 n1-1438.plc1.org sls= [1438, 1439, 1440] site= 1440 +4439 1 n1-1439.plc1.org sls= [1439, 1440, 1441] site= 1441 +4440 1 n1-1440.plc1.org sls= [1440, 1441, 1442] site= 1442 +4441 1 n1-1441.plc1.org sls= [1441, 1442, 1443] site= 1443 +4442 1 n1-1442.plc1.org sls= [1442, 1443, 1444] site= 1444 +4443 1 n1-1443.plc1.org sls= [1443, 1444, 1445] site= 1445 +4444 1 n1-1444.plc1.org sls= [1444, 1445, 1446] site= 1446 +4445 1 n1-1445.plc1.org sls= [1445, 1446, 1447] site= 1447 +4446 1 n1-1446.plc1.org sls= [1446, 1447, 1448] site= 1448 +4447 1 n1-1447.plc1.org sls= [1447, 1448, 1449] site= 1449 +4448 1 n1-1448.plc1.org sls= [1448, 1449, 1450] site= 1450 +4449 1 n1-1449.plc1.org sls= [1449, 1450, 1451] site= 1451 +4450 1 n1-1450.plc1.org sls= [1450, 1451, 1452] site= 1452 +4451 1 n1-1451.plc1.org sls= [1451, 1452, 1453] site= 1453 +4452 1 n1-1452.plc1.org sls= [1452, 1453, 1454] site= 1454 +4453 1 n1-1453.plc1.org sls= [1453, 1454, 1455] site= 1455 +4454 1 n1-1454.plc1.org sls= [1454, 1455, 1456] site= 1456 +4455 1 n1-1455.plc1.org sls= [1455, 1456, 1457] site= 1457 +4456 1 n1-1456.plc1.org sls= [1456, 1457, 1458] site= 1458 +4457 1 n1-1457.plc1.org sls= [1457, 1458, 1459] site= 1459 +4458 1 n1-1458.plc1.org sls= [1458, 1459, 1460] site= 1460 +4459 1 n1-1459.plc1.org sls= [1459, 1460, 1461] site= 1461 +4460 1 n1-1460.plc1.org sls= [1460, 1461, 1462] site= 1462 +4461 1 n1-1461.plc1.org sls= [1461, 1462, 1463] site= 1463 +4462 1 n1-1462.plc1.org sls= [1462, 1463, 1464] site= 1464 +4463 1 n1-1463.plc1.org sls= [1463, 1464, 1465] site= 1465 +4464 1 n1-1464.plc1.org sls= [1464, 1465, 1466] site= 1466 +4465 1 n1-1465.plc1.org sls= [1465, 1466, 1467] site= 1467 +4466 1 n1-1466.plc1.org sls= [1466, 1467, 1468] site= 1468 +4467 1 n1-1467.plc1.org sls= [1467, 1468, 1469] site= 1469 +4468 1 n1-1468.plc1.org sls= [1468, 1469, 1470] site= 1470 +4469 1 n1-1469.plc1.org sls= [1469, 1470, 1471] site= 1471 +4470 1 n1-1470.plc1.org sls= [1470, 1471, 1472] site= 1472 +4471 1 n1-1471.plc1.org sls= [1471, 1472, 1473] site= 1473 +4472 1 n1-1472.plc1.org sls= [1472, 1473, 1474] site= 1474 +4473 1 n1-1473.plc1.org sls= [1473, 1474, 1475] site= 1475 +4474 1 n1-1474.plc1.org sls= [1474, 1475, 1476] site= 1476 +4475 1 n1-1475.plc1.org sls= [1475, 1476, 1477] site= 1477 +4476 1 n1-1476.plc1.org sls= [1476, 1477, 1478] site= 1478 +4477 1 n1-1477.plc1.org sls= [1477, 1478, 1479] site= 1479 +4478 1 n1-1478.plc1.org sls= [1478, 1479, 1480] site= 1480 +4479 1 n1-1479.plc1.org sls= [1479, 1480, 1481] site= 1481 +4480 1 n1-1480.plc1.org sls= [1480, 1481, 1482] site= 1482 +4481 1 n1-1481.plc1.org sls= [1481, 1482, 1483] site= 1483 +4482 1 n1-1482.plc1.org sls= [1482, 1483, 1484] site= 1484 +4483 1 n1-1483.plc1.org sls= [1483, 1484, 1485] site= 1485 +4484 1 n1-1484.plc1.org sls= [1484, 1485, 1486] site= 1486 +4485 1 n1-1485.plc1.org sls= [1485, 1486, 1487] site= 1487 +4486 1 n1-1486.plc1.org sls= [1486, 1487, 1488] site= 1488 +4487 1 n1-1487.plc1.org sls= [1487, 1488, 1489] site= 1489 +4488 1 n1-1488.plc1.org sls= [1488, 1489, 1490] site= 1490 +4489 1 n1-1489.plc1.org sls= [1489, 1490, 1491] site= 1491 +4490 1 n1-1490.plc1.org sls= [1490, 1491, 1492] site= 1492 +4491 1 n1-1491.plc1.org sls= [1491, 1492, 1493] site= 1493 +4492 1 n1-1492.plc1.org sls= [1492, 1493, 1494] site= 1494 +4493 1 n1-1493.plc1.org sls= [1493, 1494, 1495] site= 1495 +4494 1 n1-1494.plc1.org sls= [1494, 1495, 1496] site= 1496 +4495 1 n1-1495.plc1.org sls= [1495, 1496, 1497] site= 1497 +4496 1 n1-1496.plc1.org sls= [1496, 1497, 1498] site= 1498 +4497 1 n1-1497.plc1.org sls= [1497, 1498, 1499] site= 1499 +4498 1 n1-1498.plc1.org sls= [1498, 1499, 1500] site= 1500 +4499 1 n1-1499.plc1.org sls= [1499, 1500, 1501] site= 1501 +4500 1 n1-1500.plc1.org sls= [1500, 1501, 1502] site= 1502 +4501 1 n1-1501.plc1.org sls= [1501, 1502, 1503] site= 1503 +4502 1 n1-1502.plc1.org sls= [1502, 1503, 1504] site= 1504 +4503 1 n1-1503.plc1.org sls= [1503, 1504, 1505] site= 1505 +4504 1 n1-1504.plc1.org sls= [1504, 1505, 1506] site= 1506 +4505 1 n1-1505.plc1.org sls= [1505, 1506, 1507] site= 1507 +4506 1 n1-1506.plc1.org sls= [1506, 1507, 1508] site= 1508 +4507 1 n1-1507.plc1.org sls= [1507, 1508, 1509] site= 1509 +4508 1 n1-1508.plc1.org sls= [1508, 1509, 1510] site= 1510 +4509 1 n1-1509.plc1.org sls= [1509, 1510, 1511] site= 1511 +4510 1 n1-1510.plc1.org sls= [1510, 1511, 1512] site= 1512 +4511 1 n1-1511.plc1.org sls= [1511, 1512, 1513] site= 1513 +4512 1 n1-1512.plc1.org sls= [1512, 1513, 1514] site= 1514 +4513 1 n1-1513.plc1.org sls= [1513, 1514, 1515] site= 1515 +4514 1 n1-1514.plc1.org sls= [1514, 1515, 1516] site= 1516 +4515 1 n1-1515.plc1.org sls= [1515, 1516, 1517] site= 1517 +4516 1 n1-1516.plc1.org sls= [1516, 1517, 1518] site= 1518 +4517 1 n1-1517.plc1.org sls= [1517, 1518, 1519] site= 1519 +4518 1 n1-1518.plc1.org sls= [1518, 1519, 1520] site= 1520 +4519 1 n1-1519.plc1.org sls= [1519, 1520, 1521] site= 1521 +4520 1 n1-1520.plc1.org sls= [1520, 1521, 1522] site= 1522 +4521 1 n1-1521.plc1.org sls= [1521, 1522, 1523] site= 1523 +4522 1 n1-1522.plc1.org sls= [1522, 1523, 1524] site= 1524 +4523 1 n1-1523.plc1.org sls= [1523, 1524, 1525] site= 1525 +4524 1 n1-1524.plc1.org sls= [1524, 1525, 1526] site= 1526 +4525 1 n1-1525.plc1.org sls= [1525, 1526, 1527] site= 1527 +4526 1 n1-1526.plc1.org sls= [1526, 1527, 1528] site= 1528 +4527 1 n1-1527.plc1.org sls= [1527, 1528, 1529] site= 1529 +4528 1 n1-1528.plc1.org sls= [1528, 1529, 1530] site= 1530 +4529 1 n1-1529.plc1.org sls= [1529, 1530, 1531] site= 1531 +4530 1 n1-1530.plc1.org sls= [1530, 1531, 1532] site= 1532 +4531 1 n1-1531.plc1.org sls= [1531, 1532, 1533] site= 1533 +4532 1 n1-1532.plc1.org sls= [1532, 1533, 1534] site= 1534 +4533 1 n1-1533.plc1.org sls= [1533, 1534, 1535] site= 1535 +4534 1 n1-1534.plc1.org sls= [1534, 1535, 1536] site= 1536 +4535 1 n1-1535.plc1.org sls= [1535, 1536, 1537] site= 1537 +4536 1 n1-1536.plc1.org sls= [1536, 1537, 1538] site= 1538 +4537 1 n1-1537.plc1.org sls= [1537, 1538, 1539] site= 1539 +4538 1 n1-1538.plc1.org sls= [1538, 1539, 1540] site= 1540 +4539 1 n1-1539.plc1.org sls= [1539, 1540, 1541] site= 1541 +4540 1 n1-1540.plc1.org sls= [1540, 1541, 1542] site= 1542 +4541 1 n1-1541.plc1.org sls= [1541, 1542, 1543] site= 1543 +4542 1 n1-1542.plc1.org sls= [1542, 1543, 1544] site= 1544 +4543 1 n1-1543.plc1.org sls= [1543, 1544, 1545] site= 1545 +4544 1 n1-1544.plc1.org sls= [1544, 1545, 1546] site= 1546 +4545 1 n1-1545.plc1.org sls= [1545, 1546, 1547] site= 1547 +4546 1 n1-1546.plc1.org sls= [1546, 1547, 1548] site= 1548 +4547 1 n1-1547.plc1.org sls= [1547, 1548, 1549] site= 1549 +4548 1 n1-1548.plc1.org sls= [1548, 1549, 1550] site= 1550 +4549 1 n1-1549.plc1.org sls= [1549, 1550, 1551] site= 1551 +4550 1 n1-1550.plc1.org sls= [1550, 1551, 1552] site= 1552 +4551 1 n1-1551.plc1.org sls= [1551, 1552, 1553] site= 1553 +4552 1 n1-1552.plc1.org sls= [1552, 1553, 1554] site= 1554 +4553 1 n1-1553.plc1.org sls= [1553, 1554, 1555] site= 1555 +4554 1 n1-1554.plc1.org sls= [1554, 1555, 1556] site= 1556 +4555 1 n1-1555.plc1.org sls= [1555, 1556, 1557] site= 1557 +4556 1 n1-1556.plc1.org sls= [1556, 1557, 1558] site= 1558 +4557 1 n1-1557.plc1.org sls= [1557, 1558, 1559] site= 1559 +4558 1 n1-1558.plc1.org sls= [1558, 1559, 1560] site= 1560 +4559 1 n1-1559.plc1.org sls= [1559, 1560, 1561] site= 1561 +4560 1 n1-1560.plc1.org sls= [1560, 1561, 1562] site= 1562 +4561 1 n1-1561.plc1.org sls= [1561, 1562, 1563] site= 1563 +4562 1 n1-1562.plc1.org sls= [1562, 1563, 1564] site= 1564 +4563 1 n1-1563.plc1.org sls= [1563, 1564, 1565] site= 1565 +4564 1 n1-1564.plc1.org sls= [1564, 1565, 1566] site= 1566 +4565 1 n1-1565.plc1.org sls= [1565, 1566, 1567] site= 1567 +4566 1 n1-1566.plc1.org sls= [1566, 1567, 1568] site= 1568 +4567 1 n1-1567.plc1.org sls= [1567, 1568, 1569] site= 1569 +4568 1 n1-1568.plc1.org sls= [1568, 1569, 1570] site= 1570 +4569 1 n1-1569.plc1.org sls= [1569, 1570, 1571] site= 1571 +4570 1 n1-1570.plc1.org sls= [1570, 1571, 1572] site= 1572 +4571 1 n1-1571.plc1.org sls= [1571, 1572, 1573] site= 1573 +4572 1 n1-1572.plc1.org sls= [1572, 1573, 1574] site= 1574 +4573 1 n1-1573.plc1.org sls= [1573, 1574, 1575] site= 1575 +4574 1 n1-1574.plc1.org sls= [1574, 1575, 1576] site= 1576 +4575 1 n1-1575.plc1.org sls= [1575, 1576, 1577] site= 1577 +4576 1 n1-1576.plc1.org sls= [1576, 1577, 1578] site= 1578 +4577 1 n1-1577.plc1.org sls= [1577, 1578, 1579] site= 1579 +4578 1 n1-1578.plc1.org sls= [1578, 1579, 1580] site= 1580 +4579 1 n1-1579.plc1.org sls= [1579, 1580, 1581] site= 1581 +4580 1 n1-1580.plc1.org sls= [1580, 1581, 1582] site= 1582 +4581 1 n1-1581.plc1.org sls= [1581, 1582, 1583] site= 1583 +4582 1 n1-1582.plc1.org sls= [1582, 1583, 1584] site= 1584 +4583 1 n1-1583.plc1.org sls= [1583, 1584, 1585] site= 1585 +4584 1 n1-1584.plc1.org sls= [1584, 1585, 1586] site= 1586 +4585 1 n1-1585.plc1.org sls= [1585, 1586, 1587] site= 1587 +4586 1 n1-1586.plc1.org sls= [1586, 1587, 1588] site= 1588 +4587 1 n1-1587.plc1.org sls= [1587, 1588, 1589] site= 1589 +4588 1 n1-1588.plc1.org sls= [1588, 1589, 1590] site= 1590 +4589 1 n1-1589.plc1.org sls= [1589, 1590, 1591] site= 1591 +4590 1 n1-1590.plc1.org sls= [1590, 1591, 1592] site= 1592 +4591 1 n1-1591.plc1.org sls= [1591, 1592, 1593] site= 1593 +4592 1 n1-1592.plc1.org sls= [1592, 1593, 1594] site= 1594 +4593 1 n1-1593.plc1.org sls= [1593, 1594, 1595] site= 1595 +4594 1 n1-1594.plc1.org sls= [1594, 1595, 1596] site= 1596 +4595 1 n1-1595.plc1.org sls= [1595, 1596, 1597] site= 1597 +4596 1 n1-1596.plc1.org sls= [1596, 1597, 1598] site= 1598 +4597 1 n1-1597.plc1.org sls= [1597, 1598, 1599] site= 1599 +4598 1 n1-1598.plc1.org sls= [1598, 1599, 1600] site= 1600 +4599 1 n1-1599.plc1.org sls= [1599, 1600, 1601] site= 1601 +4600 1 n1-1600.plc1.org sls= [1600, 1601, 1602] site= 1602 +4601 1 n1-1601.plc1.org sls= [1601, 1602, 1603] site= 1603 +4602 1 n1-1602.plc1.org sls= [1602, 1603, 1604] site= 1604 +4603 1 n1-1603.plc1.org sls= [1603, 1604, 1605] site= 1605 +4604 1 n1-1604.plc1.org sls= [1604, 1605, 1606] site= 1606 +4605 1 n1-1605.plc1.org sls= [1605, 1606, 1607] site= 1607 +4606 1 n1-1606.plc1.org sls= [1606, 1607, 1608] site= 1608 +4607 1 n1-1607.plc1.org sls= [1607, 1608, 1609] site= 1609 +4608 1 n1-1608.plc1.org sls= [1608, 1609, 1610] site= 1610 +4609 1 n1-1609.plc1.org sls= [1609, 1610, 1611] site= 1611 +4610 1 n1-1610.plc1.org sls= [1610, 1611, 1612] site= 1612 +4611 1 n1-1611.plc1.org sls= [1611, 1612, 1613] site= 1613 +4612 1 n1-1612.plc1.org sls= [1612, 1613, 1614] site= 1614 +4613 1 n1-1613.plc1.org sls= [1613, 1614, 1615] site= 1615 +4614 1 n1-1614.plc1.org sls= [1614, 1615, 1616] site= 1616 +4615 1 n1-1615.plc1.org sls= [1615, 1616, 1617] site= 1617 +4616 1 n1-1616.plc1.org sls= [1616, 1617, 1618] site= 1618 +4617 1 n1-1617.plc1.org sls= [1617, 1618, 1619] site= 1619 +4618 1 n1-1618.plc1.org sls= [1618, 1619, 1620] site= 1620 +4619 1 n1-1619.plc1.org sls= [1619, 1620, 1621] site= 1621 +4620 1 n1-1620.plc1.org sls= [1620, 1621, 1622] site= 1622 +4621 1 n1-1621.plc1.org sls= [1621, 1622, 1623] site= 1623 +4622 1 n1-1622.plc1.org sls= [1622, 1623, 1624] site= 1624 +4623 1 n1-1623.plc1.org sls= [1623, 1624, 1625] site= 1625 +4624 1 n1-1624.plc1.org sls= [1624, 1625, 1626] site= 1626 +4625 1 n1-1625.plc1.org sls= [1625, 1626, 1627] site= 1627 +4626 1 n1-1626.plc1.org sls= [1626, 1627, 1628] site= 1628 +4627 1 n1-1627.plc1.org sls= [1627, 1628, 1629] site= 1629 +4628 1 n1-1628.plc1.org sls= [1628, 1629, 1630] site= 1630 +4629 1 n1-1629.plc1.org sls= [1629, 1630, 1631] site= 1631 +4630 1 n1-1630.plc1.org sls= [1630, 1631, 1632] site= 1632 +4631 1 n1-1631.plc1.org sls= [1631, 1632, 1633] site= 1633 +4632 1 n1-1632.plc1.org sls= [1632, 1633, 1634] site= 1634 +4633 1 n1-1633.plc1.org sls= [1633, 1634, 1635] site= 1635 +4634 1 n1-1634.plc1.org sls= [1634, 1635, 1636] site= 1636 +4635 1 n1-1635.plc1.org sls= [1635, 1636, 1637] site= 1637 +4636 1 n1-1636.plc1.org sls= [1636, 1637, 1638] site= 1638 +4637 1 n1-1637.plc1.org sls= [1637, 1638, 1639] site= 1639 +4638 1 n1-1638.plc1.org sls= [1638, 1639, 1640] site= 1640 +4639 1 n1-1639.plc1.org sls= [1639, 1640, 1641] site= 1641 +4640 1 n1-1640.plc1.org sls= [1640, 1641, 1642] site= 1642 +4641 1 n1-1641.plc1.org sls= [1641, 1642, 1643] site= 1643 +4642 1 n1-1642.plc1.org sls= [1642, 1643, 1644] site= 1644 +4643 1 n1-1643.plc1.org sls= [1643, 1644, 1645] site= 1645 +4644 1 n1-1644.plc1.org sls= [1644, 1645, 1646] site= 1646 +4645 1 n1-1645.plc1.org sls= [1645, 1646, 1647] site= 1647 +4646 1 n1-1646.plc1.org sls= [1646, 1647, 1648] site= 1648 +4647 1 n1-1647.plc1.org sls= [1647, 1648, 1649] site= 1649 +4648 1 n1-1648.plc1.org sls= [1648, 1649, 1650] site= 1650 +4649 1 n1-1649.plc1.org sls= [1649, 1650, 1651] site= 1651 +4650 1 n1-1650.plc1.org sls= [1650, 1651, 1652] site= 1652 +4651 1 n1-1651.plc1.org sls= [1651, 1652, 1653] site= 1653 +4652 1 n1-1652.plc1.org sls= [1652, 1653, 1654] site= 1654 +4653 1 n1-1653.plc1.org sls= [1653, 1654, 1655] site= 1655 +4654 1 n1-1654.plc1.org sls= [1654, 1655, 1656] site= 1656 +4655 1 n1-1655.plc1.org sls= [1655, 1656, 1657] site= 1657 +4656 1 n1-1656.plc1.org sls= [1656, 1657, 1658] site= 1658 +4657 1 n1-1657.plc1.org sls= [1657, 1658, 1659] site= 1659 +4658 1 n1-1658.plc1.org sls= [1658, 1659, 1660] site= 1660 +4659 1 n1-1659.plc1.org sls= [1659, 1660, 1661] site= 1661 +4660 1 n1-1660.plc1.org sls= [1660, 1661, 1662] site= 1662 +4661 1 n1-1661.plc1.org sls= [1661, 1662, 1663] site= 1663 +4662 1 n1-1662.plc1.org sls= [1662, 1663, 1664] site= 1664 +4663 1 n1-1663.plc1.org sls= [1663, 1664, 1665] site= 1665 +4664 1 n1-1664.plc1.org sls= [1664, 1665, 1666] site= 1666 +4665 1 n1-1665.plc1.org sls= [1665, 1666, 1667] site= 1667 +4666 1 n1-1666.plc1.org sls= [1666, 1667, 1668] site= 1668 +4667 1 n1-1667.plc1.org sls= [1667, 1668, 1669] site= 1669 +4668 1 n1-1668.plc1.org sls= [1668, 1669, 1670] site= 1670 +4669 1 n1-1669.plc1.org sls= [1669, 1670, 1671] site= 1671 +4670 1 n1-1670.plc1.org sls= [1670, 1671, 1672] site= 1672 +4671 1 n1-1671.plc1.org sls= [1671, 1672, 1673] site= 1673 +4672 1 n1-1672.plc1.org sls= [1672, 1673, 1674] site= 1674 +4673 1 n1-1673.plc1.org sls= [1673, 1674, 1675] site= 1675 +4674 1 n1-1674.plc1.org sls= [1674, 1675, 1676] site= 1676 +4675 1 n1-1675.plc1.org sls= [1675, 1676, 1677] site= 1677 +4676 1 n1-1676.plc1.org sls= [1676, 1677, 1678] site= 1678 +4677 1 n1-1677.plc1.org sls= [1677, 1678, 1679] site= 1679 +4678 1 n1-1678.plc1.org sls= [1678, 1679, 1680] site= 1680 +4679 1 n1-1679.plc1.org sls= [1679, 1680, 1681] site= 1681 +4680 1 n1-1680.plc1.org sls= [1680, 1681, 1682] site= 1682 +4681 1 n1-1681.plc1.org sls= [1681, 1682, 1683] site= 1683 +4682 1 n1-1682.plc1.org sls= [1682, 1683, 1684] site= 1684 +4683 1 n1-1683.plc1.org sls= [1683, 1684, 1685] site= 1685 +4684 1 n1-1684.plc1.org sls= [1684, 1685, 1686] site= 1686 +4685 1 n1-1685.plc1.org sls= [1685, 1686, 1687] site= 1687 +4686 1 n1-1686.plc1.org sls= [1686, 1687, 1688] site= 1688 +4687 1 n1-1687.plc1.org sls= [1687, 1688, 1689] site= 1689 +4688 1 n1-1688.plc1.org sls= [1688, 1689, 1690] site= 1690 +4689 1 n1-1689.plc1.org sls= [1689, 1690, 1691] site= 1691 +4690 1 n1-1690.plc1.org sls= [1690, 1691, 1692] site= 1692 +4691 1 n1-1691.plc1.org sls= [1691, 1692, 1693] site= 1693 +4692 1 n1-1692.plc1.org sls= [1692, 1693, 1694] site= 1694 +4693 1 n1-1693.plc1.org sls= [1693, 1694, 1695] site= 1695 +4694 1 n1-1694.plc1.org sls= [1694, 1695, 1696] site= 1696 +4695 1 n1-1695.plc1.org sls= [1695, 1696, 1697] site= 1697 +4696 1 n1-1696.plc1.org sls= [1696, 1697, 1698] site= 1698 +4697 1 n1-1697.plc1.org sls= [1697, 1698, 1699] site= 1699 +4698 1 n1-1698.plc1.org sls= [1698, 1699, 1700] site= 1700 +4699 1 n1-1699.plc1.org sls= [1699, 1700, 1701] site= 1701 +4700 1 n1-1700.plc1.org sls= [1700, 1701, 1702] site= 1702 +4701 1 n1-1701.plc1.org sls= [1701, 1702, 1703] site= 1703 +4702 1 n1-1702.plc1.org sls= [1702, 1703, 1704] site= 1704 +4703 1 n1-1703.plc1.org sls= [1703, 1704, 1705] site= 1705 +4704 1 n1-1704.plc1.org sls= [1704, 1705, 1706] site= 1706 +4705 1 n1-1705.plc1.org sls= [1705, 1706, 1707] site= 1707 +4706 1 n1-1706.plc1.org sls= [1706, 1707, 1708] site= 1708 +4707 1 n1-1707.plc1.org sls= [1707, 1708, 1709] site= 1709 +4708 1 n1-1708.plc1.org sls= [1708, 1709, 1710] site= 1710 +4709 1 n1-1709.plc1.org sls= [1709, 1710, 1711] site= 1711 +4710 1 n1-1710.plc1.org sls= [1710, 1711, 1712] site= 1712 +4711 1 n1-1711.plc1.org sls= [1711, 1712, 1713] site= 1713 +4712 1 n1-1712.plc1.org sls= [1712, 1713, 1714] site= 1714 +4713 1 n1-1713.plc1.org sls= [1713, 1714, 1715] site= 1715 +4714 1 n1-1714.plc1.org sls= [1714, 1715, 1716] site= 1716 +4715 1 n1-1715.plc1.org sls= [1715, 1716, 1717] site= 1717 +4716 1 n1-1716.plc1.org sls= [1716, 1717, 1718] site= 1718 +4717 1 n1-1717.plc1.org sls= [1717, 1718, 1719] site= 1719 +4718 1 n1-1718.plc1.org sls= [1718, 1719, 1720] site= 1720 +4719 1 n1-1719.plc1.org sls= [1719, 1720, 1721] site= 1721 +4720 1 n1-1720.plc1.org sls= [1720, 1721, 1722] site= 1722 +4721 1 n1-1721.plc1.org sls= [1721, 1722, 1723] site= 1723 +4722 1 n1-1722.plc1.org sls= [1722, 1723, 1724] site= 1724 +4723 1 n1-1723.plc1.org sls= [1723, 1724, 1725] site= 1725 +4724 1 n1-1724.plc1.org sls= [1724, 1725, 1726] site= 1726 +4725 1 n1-1725.plc1.org sls= [1725, 1726, 1727] site= 1727 +4726 1 n1-1726.plc1.org sls= [1726, 1727, 1728] site= 1728 +4727 1 n1-1727.plc1.org sls= [1727, 1728, 1729] site= 1729 +4728 1 n1-1728.plc1.org sls= [1728, 1729, 1730] site= 1730 +4729 1 n1-1729.plc1.org sls= [1729, 1730, 1731] site= 1731 +4730 1 n1-1730.plc1.org sls= [1730, 1731, 1732] site= 1732 +4731 1 n1-1731.plc1.org sls= [1731, 1732, 1733] site= 1733 +4732 1 n1-1732.plc1.org sls= [1732, 1733, 1734] site= 1734 +4733 1 n1-1733.plc1.org sls= [1733, 1734, 1735] site= 1735 +4734 1 n1-1734.plc1.org sls= [1734, 1735, 1736] site= 1736 +4735 1 n1-1735.plc1.org sls= [1735, 1736, 1737] site= 1737 +4736 1 n1-1736.plc1.org sls= [1736, 1737, 1738] site= 1738 +4737 1 n1-1737.plc1.org sls= [1737, 1738, 1739] site= 1739 +4738 1 n1-1738.plc1.org sls= [1738, 1739, 1740] site= 1740 +4739 1 n1-1739.plc1.org sls= [1739, 1740, 1741] site= 1741 +4740 1 n1-1740.plc1.org sls= [1740, 1741, 1742] site= 1742 +4741 1 n1-1741.plc1.org sls= [1741, 1742, 1743] site= 1743 +4742 1 n1-1742.plc1.org sls= [1742, 1743, 1744] site= 1744 +4743 1 n1-1743.plc1.org sls= [1743, 1744, 1745] site= 1745 +4744 1 n1-1744.plc1.org sls= [1744, 1745, 1746] site= 1746 +4745 1 n1-1745.plc1.org sls= [1745, 1746, 1747] site= 1747 +4746 1 n1-1746.plc1.org sls= [1746, 1747, 1748] site= 1748 +4747 1 n1-1747.plc1.org sls= [1747, 1748, 1749] site= 1749 +4748 1 n1-1748.plc1.org sls= [1748, 1749, 1750] site= 1750 +4749 1 n1-1749.plc1.org sls= [1749, 1750, 1751] site= 1751 +4750 1 n1-1750.plc1.org sls= [1750, 1751, 1752] site= 1752 +4751 1 n1-1751.plc1.org sls= [1751, 1752, 1753] site= 1753 +4752 1 n1-1752.plc1.org sls= [1752, 1753, 1754] site= 1754 +4753 1 n1-1753.plc1.org sls= [1753, 1754, 1755] site= 1755 +4754 1 n1-1754.plc1.org sls= [1754, 1755, 1756] site= 1756 +4755 1 n1-1755.plc1.org sls= [1755, 1756, 1757] site= 1757 +4756 1 n1-1756.plc1.org sls= [1756, 1757, 1758] site= 1758 +4757 1 n1-1757.plc1.org sls= [1757, 1758, 1759] site= 1759 +4758 1 n1-1758.plc1.org sls= [1758, 1759, 1760] site= 1760 +4759 1 n1-1759.plc1.org sls= [1759, 1760, 1761] site= 1761 +4760 1 n1-1760.plc1.org sls= [1760, 1761, 1762] site= 1762 +4761 1 n1-1761.plc1.org sls= [1761, 1762, 1763] site= 1763 +4762 1 n1-1762.plc1.org sls= [1762, 1763, 1764] site= 1764 +4763 1 n1-1763.plc1.org sls= [1763, 1764, 1765] site= 1765 +4764 1 n1-1764.plc1.org sls= [1764, 1765, 1766] site= 1766 +4765 1 n1-1765.plc1.org sls= [1765, 1766, 1767] site= 1767 +4766 1 n1-1766.plc1.org sls= [1766, 1767, 1768] site= 1768 +4767 1 n1-1767.plc1.org sls= [1767, 1768, 1769] site= 1769 +4768 1 n1-1768.plc1.org sls= [1768, 1769, 1770] site= 1770 +4769 1 n1-1769.plc1.org sls= [1769, 1770, 1771] site= 1771 +4770 1 n1-1770.plc1.org sls= [1770, 1771, 1772] site= 1772 +4771 1 n1-1771.plc1.org sls= [1771, 1772, 1773] site= 1773 +4772 1 n1-1772.plc1.org sls= [1772, 1773, 1774] site= 1774 +4773 1 n1-1773.plc1.org sls= [1773, 1774, 1775] site= 1775 +4774 1 n1-1774.plc1.org sls= [1774, 1775, 1776] site= 1776 +4775 1 n1-1775.plc1.org sls= [1775, 1776, 1777] site= 1777 +4776 1 n1-1776.plc1.org sls= [1776, 1777, 1778] site= 1778 +4777 1 n1-1777.plc1.org sls= [1777, 1778, 1779] site= 1779 +4778 1 n1-1778.plc1.org sls= [1778, 1779, 1780] site= 1780 +4779 1 n1-1779.plc1.org sls= [1779, 1780, 1781] site= 1781 +4780 1 n1-1780.plc1.org sls= [1780, 1781, 1782] site= 1782 +4781 1 n1-1781.plc1.org sls= [1781, 1782, 1783] site= 1783 +4782 1 n1-1782.plc1.org sls= [1782, 1783, 1784] site= 1784 +4783 1 n1-1783.plc1.org sls= [1783, 1784, 1785] site= 1785 +4784 1 n1-1784.plc1.org sls= [1784, 1785, 1786] site= 1786 +4785 1 n1-1785.plc1.org sls= [1785, 1786, 1787] site= 1787 +4786 1 n1-1786.plc1.org sls= [1786, 1787, 1788] site= 1788 +4787 1 n1-1787.plc1.org sls= [1787, 1788, 1789] site= 1789 +4788 1 n1-1788.plc1.org sls= [1788, 1789, 1790] site= 1790 +4789 1 n1-1789.plc1.org sls= [1789, 1790, 1791] site= 1791 +4790 1 n1-1790.plc1.org sls= [1790, 1791, 1792] site= 1792 +4791 1 n1-1791.plc1.org sls= [1791, 1792, 1793] site= 1793 +4792 1 n1-1792.plc1.org sls= [1792, 1793, 1794] site= 1794 +4793 1 n1-1793.plc1.org sls= [1793, 1794, 1795] site= 1795 +4794 1 n1-1794.plc1.org sls= [1794, 1795, 1796] site= 1796 +4795 1 n1-1795.plc1.org sls= [1795, 1796, 1797] site= 1797 +4796 1 n1-1796.plc1.org sls= [1796, 1797, 1798] site= 1798 +4797 1 n1-1797.plc1.org sls= [1797, 1798, 1799] site= 1799 +4798 1 n1-1798.plc1.org sls= [1798, 1799, 1800] site= 1800 +4799 1 n1-1799.plc1.org sls= [1799, 1800, 1801] site= 1801 +4800 1 n1-1800.plc1.org sls= [1800, 1801, 1802] site= 1802 +4801 1 n1-1801.plc1.org sls= [1801, 1802, 1803] site= 1803 +4802 1 n1-1802.plc1.org sls= [1802, 1803, 1804] site= 1804 +4803 1 n1-1803.plc1.org sls= [1803, 1804, 1805] site= 1805 +4804 1 n1-1804.plc1.org sls= [1804, 1805, 1806] site= 1806 +4805 1 n1-1805.plc1.org sls= [1805, 1806, 1807] site= 1807 +4806 1 n1-1806.plc1.org sls= [1806, 1807, 1808] site= 1808 +4807 1 n1-1807.plc1.org sls= [1807, 1808, 1809] site= 1809 +4808 1 n1-1808.plc1.org sls= [1808, 1809, 1810] site= 1810 +4809 1 n1-1809.plc1.org sls= [1809, 1810, 1811] site= 1811 +4810 1 n1-1810.plc1.org sls= [1810, 1811, 1812] site= 1812 +4811 1 n1-1811.plc1.org sls= [1811, 1812, 1813] site= 1813 +4812 1 n1-1812.plc1.org sls= [1812, 1813, 1814] site= 1814 +4813 1 n1-1813.plc1.org sls= [1813, 1814, 1815] site= 1815 +4814 1 n1-1814.plc1.org sls= [1814, 1815, 1816] site= 1816 +4815 1 n1-1815.plc1.org sls= [1815, 1816, 1817] site= 1817 +4816 1 n1-1816.plc1.org sls= [1816, 1817, 1818] site= 1818 +4817 1 n1-1817.plc1.org sls= [1817, 1818, 1819] site= 1819 +4818 1 n1-1818.plc1.org sls= [1818, 1819, 1820] site= 1820 +4819 1 n1-1819.plc1.org sls= [1819, 1820, 1821] site= 1821 +4820 1 n1-1820.plc1.org sls= [1820, 1821, 1822] site= 1822 +4821 1 n1-1821.plc1.org sls= [1821, 1822, 1823] site= 1823 +4822 1 n1-1822.plc1.org sls= [1822, 1823, 1824] site= 1824 +4823 1 n1-1823.plc1.org sls= [1823, 1824, 1825] site= 1825 +4824 1 n1-1824.plc1.org sls= [1824, 1825, 1826] site= 1826 +4825 1 n1-1825.plc1.org sls= [1825, 1826, 1827] site= 1827 +4826 1 n1-1826.plc1.org sls= [1826, 1827, 1828] site= 1828 +4827 1 n1-1827.plc1.org sls= [1827, 1828, 1829] site= 1829 +4828 1 n1-1828.plc1.org sls= [1828, 1829, 1830] site= 1830 +4829 1 n1-1829.plc1.org sls= [1829, 1830, 1831] site= 1831 +4830 1 n1-1830.plc1.org sls= [1830, 1831, 1832] site= 1832 +4831 1 n1-1831.plc1.org sls= [1831, 1832, 1833] site= 1833 +4832 1 n1-1832.plc1.org sls= [1832, 1833, 1834] site= 1834 +4833 1 n1-1833.plc1.org sls= [1833, 1834, 1835] site= 1835 +4834 1 n1-1834.plc1.org sls= [1834, 1835, 1836] site= 1836 +4835 1 n1-1835.plc1.org sls= [1835, 1836, 1837] site= 1837 +4836 1 n1-1836.plc1.org sls= [1836, 1837, 1838] site= 1838 +4837 1 n1-1837.plc1.org sls= [1837, 1838, 1839] site= 1839 +4838 1 n1-1838.plc1.org sls= [1838, 1839, 1840] site= 1840 +4839 1 n1-1839.plc1.org sls= [1839, 1840, 1841] site= 1841 +4840 1 n1-1840.plc1.org sls= [1840, 1841, 1842] site= 1842 +4841 1 n1-1841.plc1.org sls= [1841, 1842, 1843] site= 1843 +4842 1 n1-1842.plc1.org sls= [1842, 1843, 1844] site= 1844 +4843 1 n1-1843.plc1.org sls= [1843, 1844, 1845] site= 1845 +4844 1 n1-1844.plc1.org sls= [1844, 1845, 1846] site= 1846 +4845 1 n1-1845.plc1.org sls= [1845, 1846, 1847] site= 1847 +4846 1 n1-1846.plc1.org sls= [1846, 1847, 1848] site= 1848 +4847 1 n1-1847.plc1.org sls= [1847, 1848, 1849] site= 1849 +4848 1 n1-1848.plc1.org sls= [1848, 1849, 1850] site= 1850 +4849 1 n1-1849.plc1.org sls= [1849, 1850, 1851] site= 1851 +4850 1 n1-1850.plc1.org sls= [1850, 1851, 1852] site= 1852 +4851 1 n1-1851.plc1.org sls= [1851, 1852, 1853] site= 1853 +4852 1 n1-1852.plc1.org sls= [1852, 1853, 1854] site= 1854 +4853 1 n1-1853.plc1.org sls= [1853, 1854, 1855] site= 1855 +4854 1 n1-1854.plc1.org sls= [1854, 1855, 1856] site= 1856 +4855 1 n1-1855.plc1.org sls= [1855, 1856, 1857] site= 1857 +4856 1 n1-1856.plc1.org sls= [1856, 1857, 1858] site= 1858 +4857 1 n1-1857.plc1.org sls= [1857, 1858, 1859] site= 1859 +4858 1 n1-1858.plc1.org sls= [1858, 1859, 1860] site= 1860 +4859 1 n1-1859.plc1.org sls= [1859, 1860, 1861] site= 1861 +4860 1 n1-1860.plc1.org sls= [1860, 1861, 1862] site= 1862 +4861 1 n1-1861.plc1.org sls= [1861, 1862, 1863] site= 1863 +4862 1 n1-1862.plc1.org sls= [1862, 1863, 1864] site= 1864 +4863 1 n1-1863.plc1.org sls= [1863, 1864, 1865] site= 1865 +4864 1 n1-1864.plc1.org sls= [1864, 1865, 1866] site= 1866 +4865 1 n1-1865.plc1.org sls= [1865, 1866, 1867] site= 1867 +4866 1 n1-1866.plc1.org sls= [1866, 1867, 1868] site= 1868 +4867 1 n1-1867.plc1.org sls= [1867, 1868, 1869] site= 1869 +4868 1 n1-1868.plc1.org sls= [1868, 1869, 1870] site= 1870 +4869 1 n1-1869.plc1.org sls= [1869, 1870, 1871] site= 1871 +4870 1 n1-1870.plc1.org sls= [1870, 1871, 1872] site= 1872 +4871 1 n1-1871.plc1.org sls= [1871, 1872, 1873] site= 1873 +4872 1 n1-1872.plc1.org sls= [1872, 1873, 1874] site= 1874 +4873 1 n1-1873.plc1.org sls= [1873, 1874, 1875] site= 1875 +4874 1 n1-1874.plc1.org sls= [1874, 1875, 1876] site= 1876 +4875 1 n1-1875.plc1.org sls= [1875, 1876, 1877] site= 1877 +4876 1 n1-1876.plc1.org sls= [1876, 1877, 1878] site= 1878 +4877 1 n1-1877.plc1.org sls= [1877, 1878, 1879] site= 1879 +4878 1 n1-1878.plc1.org sls= [1878, 1879, 1880] site= 1880 +4879 1 n1-1879.plc1.org sls= [1879, 1880, 1881] site= 1881 +4880 1 n1-1880.plc1.org sls= [1880, 1881, 1882] site= 1882 +4881 1 n1-1881.plc1.org sls= [1881, 1882, 1883] site= 1883 +4882 1 n1-1882.plc1.org sls= [1882, 1883, 1884] site= 1884 +4883 1 n1-1883.plc1.org sls= [1883, 1884, 1885] site= 1885 +4884 1 n1-1884.plc1.org sls= [1884, 1885, 1886] site= 1886 +4885 1 n1-1885.plc1.org sls= [1885, 1886, 1887] site= 1887 +4886 1 n1-1886.plc1.org sls= [1886, 1887, 1888] site= 1888 +4887 1 n1-1887.plc1.org sls= [1887, 1888, 1889] site= 1889 +4888 1 n1-1888.plc1.org sls= [1888, 1889, 1890] site= 1890 +4889 1 n1-1889.plc1.org sls= [1889, 1890, 1891] site= 1891 +4890 1 n1-1890.plc1.org sls= [1890, 1891, 1892] site= 1892 +4891 1 n1-1891.plc1.org sls= [1891, 1892, 1893] site= 1893 +4892 1 n1-1892.plc1.org sls= [1892, 1893, 1894] site= 1894 +4893 1 n1-1893.plc1.org sls= [1893, 1894, 1895] site= 1895 +4894 1 n1-1894.plc1.org sls= [1894, 1895, 1896] site= 1896 +4895 1 n1-1895.plc1.org sls= [1895, 1896, 1897] site= 1897 +4896 1 n1-1896.plc1.org sls= [1896, 1897, 1898] site= 1898 +4897 1 n1-1897.plc1.org sls= [1897, 1898, 1899] site= 1899 +4898 1 n1-1898.plc1.org sls= [1898, 1899, 1900] site= 1900 +4899 1 n1-1899.plc1.org sls= [1899, 1900, 1901] site= 1901 +4900 1 n1-1900.plc1.org sls= [1900, 1901, 1902] site= 1902 +4901 1 n1-1901.plc1.org sls= [1901, 1902, 1903] site= 1903 +4902 1 n1-1902.plc1.org sls= [1902, 1903, 1904] site= 1904 +4903 1 n1-1903.plc1.org sls= [1903, 1904, 1905] site= 1905 +4904 1 n1-1904.plc1.org sls= [1904, 1905, 1906] site= 1906 +4905 1 n1-1905.plc1.org sls= [1905, 1906, 1907] site= 1907 +4906 1 n1-1906.plc1.org sls= [1906, 1907, 1908] site= 1908 +4907 1 n1-1907.plc1.org sls= [1907, 1908, 1909] site= 1909 +4908 1 n1-1908.plc1.org sls= [1908, 1909, 1910] site= 1910 +4909 1 n1-1909.plc1.org sls= [1909, 1910, 1911] site= 1911 +4910 1 n1-1910.plc1.org sls= [1910, 1911, 1912] site= 1912 +4911 1 n1-1911.plc1.org sls= [1911, 1912, 1913] site= 1913 +4912 1 n1-1912.plc1.org sls= [1912, 1913, 1914] site= 1914 +4913 1 n1-1913.plc1.org sls= [1913, 1914, 1915] site= 1915 +4914 1 n1-1914.plc1.org sls= [1914, 1915, 1916] site= 1916 +4915 1 n1-1915.plc1.org sls= [1915, 1916, 1917] site= 1917 +4916 1 n1-1916.plc1.org sls= [1916, 1917, 1918] site= 1918 +4917 1 n1-1917.plc1.org sls= [1917, 1918, 1919] site= 1919 +4918 1 n1-1918.plc1.org sls= [1918, 1919, 1920] site= 1920 +4919 1 n1-1919.plc1.org sls= [1919, 1920, 1921] site= 1921 +4920 1 n1-1920.plc1.org sls= [1920, 1921, 1922] site= 1922 +4921 1 n1-1921.plc1.org sls= [1921, 1922, 1923] site= 1923 +4922 1 n1-1922.plc1.org sls= [1922, 1923, 1924] site= 1924 +4923 1 n1-1923.plc1.org sls= [1923, 1924, 1925] site= 1925 +4924 1 n1-1924.plc1.org sls= [1924, 1925, 1926] site= 1926 +4925 1 n1-1925.plc1.org sls= [1925, 1926, 1927] site= 1927 +4926 1 n1-1926.plc1.org sls= [1926, 1927, 1928] site= 1928 +4927 1 n1-1927.plc1.org sls= [1927, 1928, 1929] site= 1929 +4928 1 n1-1928.plc1.org sls= [1928, 1929, 1930] site= 1930 +4929 1 n1-1929.plc1.org sls= [1929, 1930, 1931] site= 1931 +4930 1 n1-1930.plc1.org sls= [1930, 1931, 1932] site= 1932 +4931 1 n1-1931.plc1.org sls= [1931, 1932, 1933] site= 1933 +4932 1 n1-1932.plc1.org sls= [1932, 1933, 1934] site= 1934 +4933 1 n1-1933.plc1.org sls= [1933, 1934, 1935] site= 1935 +4934 1 n1-1934.plc1.org sls= [1934, 1935, 1936] site= 1936 +4935 1 n1-1935.plc1.org sls= [1935, 1936, 1937] site= 1937 +4936 1 n1-1936.plc1.org sls= [1936, 1937, 1938] site= 1938 +4937 1 n1-1937.plc1.org sls= [1937, 1938, 1939] site= 1939 +4938 1 n1-1938.plc1.org sls= [1938, 1939, 1940] site= 1940 +4939 1 n1-1939.plc1.org sls= [1939, 1940, 1941] site= 1941 +4940 1 n1-1940.plc1.org sls= [1940, 1941, 1942] site= 1942 +4941 1 n1-1941.plc1.org sls= [1941, 1942, 1943] site= 1943 +4942 1 n1-1942.plc1.org sls= [1942, 1943, 1944] site= 1944 +4943 1 n1-1943.plc1.org sls= [1943, 1944, 1945] site= 1945 +4944 1 n1-1944.plc1.org sls= [1944, 1945, 1946] site= 1946 +4945 1 n1-1945.plc1.org sls= [1945, 1946, 1947] site= 1947 +4946 1 n1-1946.plc1.org sls= [1946, 1947, 1948] site= 1948 +4947 1 n1-1947.plc1.org sls= [1947, 1948, 1949] site= 1949 +4948 1 n1-1948.plc1.org sls= [1948, 1949, 1950] site= 1950 +4949 1 n1-1949.plc1.org sls= [1949, 1950, 1951] site= 1951 +4950 1 n1-1950.plc1.org sls= [1950, 1951, 1952] site= 1952 +4951 1 n1-1951.plc1.org sls= [1951, 1952, 1953] site= 1953 +4952 1 n1-1952.plc1.org sls= [1952, 1953, 1954] site= 1954 +4953 1 n1-1953.plc1.org sls= [1953, 1954, 1955] site= 1955 +4954 1 n1-1954.plc1.org sls= [1954, 1955, 1956] site= 1956 +4955 1 n1-1955.plc1.org sls= [1955, 1956, 1957] site= 1957 +4956 1 n1-1956.plc1.org sls= [1956, 1957, 1958] site= 1958 +4957 1 n1-1957.plc1.org sls= [1957, 1958, 1959] site= 1959 +4958 1 n1-1958.plc1.org sls= [1958, 1959, 1960] site= 1960 +4959 1 n1-1959.plc1.org sls= [1959, 1960, 1961] site= 1961 +4960 1 n1-1960.plc1.org sls= [1960, 1961, 1962] site= 1962 +4961 1 n1-1961.plc1.org sls= [1961, 1962, 1963] site= 1963 +4962 1 n1-1962.plc1.org sls= [1962, 1963, 1964] site= 1964 +4963 1 n1-1963.plc1.org sls= [1963, 1964, 1965] site= 1965 +4964 1 n1-1964.plc1.org sls= [1964, 1965, 1966] site= 1966 +4965 1 n1-1965.plc1.org sls= [1965, 1966, 1967] site= 1967 +4966 1 n1-1966.plc1.org sls= [1966, 1967, 1968] site= 1968 +4967 1 n1-1967.plc1.org sls= [1967, 1968, 1969] site= 1969 +4968 1 n1-1968.plc1.org sls= [1968, 1969, 1970] site= 1970 +4969 1 n1-1969.plc1.org sls= [1969, 1970, 1971] site= 1971 +4970 1 n1-1970.plc1.org sls= [1970, 1971, 1972] site= 1972 +4971 1 n1-1971.plc1.org sls= [1971, 1972, 1973] site= 1973 +4972 1 n1-1972.plc1.org sls= [1972, 1973, 1974] site= 1974 +4973 1 n1-1973.plc1.org sls= [1973, 1974, 1975] site= 1975 +4974 1 n1-1974.plc1.org sls= [1974, 1975, 1976] site= 1976 +4975 1 n1-1975.plc1.org sls= [1975, 1976, 1977] site= 1977 +4976 1 n1-1976.plc1.org sls= [1976, 1977, 1978] site= 1978 +4977 1 n1-1977.plc1.org sls= [1977, 1978, 1979] site= 1979 +4978 1 n1-1978.plc1.org sls= [1978, 1979, 1980] site= 1980 +4979 1 n1-1979.plc1.org sls= [1979, 1980, 1981] site= 1981 +4980 1 n1-1980.plc1.org sls= [1980, 1981, 1982] site= 1982 +4981 1 n1-1981.plc1.org sls= [1981, 1982, 1983] site= 1983 +4982 1 n1-1982.plc1.org sls= [1982, 1983, 1984] site= 1984 +4983 1 n1-1983.plc1.org sls= [1983, 1984, 1985] site= 1985 +4984 1 n1-1984.plc1.org sls= [1984, 1985, 1986] site= 1986 +4985 1 n1-1985.plc1.org sls= [1985, 1986, 1987] site= 1987 +4986 1 n1-1986.plc1.org sls= [1986, 1987, 1988] site= 1988 +4987 1 n1-1987.plc1.org sls= [1987, 1988, 1989] site= 1989 +4988 1 n1-1988.plc1.org sls= [1988, 1989, 1990] site= 1990 +4989 1 n1-1989.plc1.org sls= [1989, 1990, 1991] site= 1991 +4990 1 n1-1990.plc1.org sls= [1990, 1991, 1992] site= 1992 +4991 1 n1-1991.plc1.org sls= [1991, 1992, 1993] site= 1993 +4992 1 n1-1992.plc1.org sls= [1992, 1993, 1994] site= 1994 +4993 1 n1-1993.plc1.org sls= [1993, 1994, 1995] site= 1995 +4994 1 n1-1994.plc1.org sls= [1994, 1995, 1996] site= 1996 +4995 1 n1-1995.plc1.org sls= [1995, 1996, 1997] site= 1997 +4996 1 n1-1996.plc1.org sls= [1996, 1997, 1998] site= 1998 +4997 1 n1-1997.plc1.org sls= [1997, 1998, 1999] site= 1999 +4998 1 n1-1998.plc1.org sls= [1998, 1999, 2000] site= 2000 +4999 1 n1-1999.plc1.org sls= [1999, 2000, 2001] site= 2001 +5000 1 n1-2000.plc1.org sls= [2000, 2001, 2002] site= 2002 +5001 1 n1-2001.plc1.org sls= [2001, 2002] site= 1003 +5002 1 n1-2002.plc1.org sls= [2002] site= 1004 +5003 1 n1-2003.plc1.org sls= [] site= 1005 +5004 1 n1-2004.plc1.org sls= [] site= 1006 +5005 1 n1-2005.plc1.org sls= [] site= 1007 +5006 1 n1-2006.plc1.org sls= [] site= 1008 +5007 1 n1-2007.plc1.org sls= [] site= 1009 +5008 1 n1-2008.plc1.org sls= [] site= 1010 +5009 1 n1-2009.plc1.org sls= [] site= 1011 +5010 1 n1-2010.plc1.org sls= [] site= 1012 +5011 1 n1-2011.plc1.org sls= [] site= 1013 +5012 1 n1-2012.plc1.org sls= [] site= 1014 +5013 1 n1-2013.plc1.org sls= [] site= 1015 +5014 1 n1-2014.plc1.org sls= [] site= 1016 +5015 1 n1-2015.plc1.org sls= [] site= 1017 +5016 1 n1-2016.plc1.org sls= [] site= 1018 +5017 1 n1-2017.plc1.org sls= [] site= 1019 +5018 1 n1-2018.plc1.org sls= [] site= 1020 +5019 1 n1-2019.plc1.org sls= [] site= 1021 +5020 1 n1-2020.plc1.org sls= [] site= 1022 +5021 1 n1-2021.plc1.org sls= [] site= 1023 +5022 1 n1-2022.plc1.org sls= [] site= 1024 +5023 1 n1-2023.plc1.org sls= [] site= 1025 +5024 1 n1-2024.plc1.org sls= [] site= 1026 +5025 1 n1-2025.plc1.org sls= [] site= 1027 +5026 1 n1-2026.plc1.org sls= [] site= 1028 +5027 1 n1-2027.plc1.org sls= [] site= 1029 +5028 1 n1-2028.plc1.org sls= [] site= 1030 +5029 1 n1-2029.plc1.org sls= [] site= 1031 +5030 1 n1-2030.plc1.org sls= [] site= 1032 +5031 1 n1-2031.plc1.org sls= [] site= 1033 +5032 1 n1-2032.plc1.org sls= [] site= 1034 +5033 1 n1-2033.plc1.org sls= [] site= 1035 +5034 1 n1-2034.plc1.org sls= [] site= 1036 +5035 1 n1-2035.plc1.org sls= [] site= 1037 +5036 1 n1-2036.plc1.org sls= [] site= 1038 +5037 1 n1-2037.plc1.org sls= [] site= 1039 +5038 1 n1-2038.plc1.org sls= [] site= 1040 +5039 1 n1-2039.plc1.org sls= [] site= 1041 +5040 1 n1-2040.plc1.org sls= [] site= 1042 +5041 1 n1-2041.plc1.org sls= [] site= 1043 +5042 1 n1-2042.plc1.org sls= [] site= 1044 +5043 1 n1-2043.plc1.org sls= [] site= 1045 +5044 1 n1-2044.plc1.org sls= [] site= 1046 +5045 1 n1-2045.plc1.org sls= [] site= 1047 +5046 1 n1-2046.plc1.org sls= [] site= 1048 +5047 1 n1-2047.plc1.org sls= [] site= 1049 +5048 1 n1-2048.plc1.org sls= [] site= 1050 +5049 1 n1-2049.plc1.org sls= [] site= 1051 +5050 1 n1-2050.plc1.org sls= [] site= 1052 +5051 1 n1-2051.plc1.org sls= [] site= 1053 +5052 1 n1-2052.plc1.org sls= [] site= 1054 +5053 1 n1-2053.plc1.org sls= [] site= 1055 +5054 1 n1-2054.plc1.org sls= [] site= 1056 +5055 1 n1-2055.plc1.org sls= [] site= 1057 +5056 1 n1-2056.plc1.org sls= [] site= 1058 +5057 1 n1-2057.plc1.org sls= [] site= 1059 +5058 1 n1-2058.plc1.org sls= [] site= 1060 +5059 1 n1-2059.plc1.org sls= [] site= 1061 +5060 1 n1-2060.plc1.org sls= [] site= 1062 +5061 1 n1-2061.plc1.org sls= [] site= 1063 +5062 1 n1-2062.plc1.org sls= [] site= 1064 +5063 1 n1-2063.plc1.org sls= [] site= 1065 +5064 1 n1-2064.plc1.org sls= [] site= 1066 +5065 1 n1-2065.plc1.org sls= [] site= 1067 +5066 1 n1-2066.plc1.org sls= [] site= 1068 +5067 1 n1-2067.plc1.org sls= [] site= 1069 +5068 1 n1-2068.plc1.org sls= [] site= 1070 +5069 1 n1-2069.plc1.org sls= [] site= 1071 +5070 1 n1-2070.plc1.org sls= [] site= 1072 +5071 1 n1-2071.plc1.org sls= [] site= 1073 +5072 1 n1-2072.plc1.org sls= [] site= 1074 +5073 1 n1-2073.plc1.org sls= [] site= 1075 +5074 1 n1-2074.plc1.org sls= [] site= 1076 +5075 1 n1-2075.plc1.org sls= [] site= 1077 +5076 1 n1-2076.plc1.org sls= [] site= 1078 +5077 1 n1-2077.plc1.org sls= [] site= 1079 +5078 1 n1-2078.plc1.org sls= [] site= 1080 +5079 1 n1-2079.plc1.org sls= [] site= 1081 +5080 1 n1-2080.plc1.org sls= [] site= 1082 +5081 1 n1-2081.plc1.org sls= [] site= 1083 +5082 1 n1-2082.plc1.org sls= [] site= 1084 +5083 1 n1-2083.plc1.org sls= [] site= 1085 +5084 1 n1-2084.plc1.org sls= [] site= 1086 +5085 1 n1-2085.plc1.org sls= [] site= 1087 +5086 1 n1-2086.plc1.org sls= [] site= 1088 +5087 1 n1-2087.plc1.org sls= [] site= 1089 +5088 1 n1-2088.plc1.org sls= [] site= 1090 +5089 1 n1-2089.plc1.org sls= [] site= 1091 +5090 1 n1-2090.plc1.org sls= [] site= 1092 +5091 1 n1-2091.plc1.org sls= [] site= 1093 +5092 1 n1-2092.plc1.org sls= [] site= 1094 +5093 1 n1-2093.plc1.org sls= [] site= 1095 +5094 1 n1-2094.plc1.org sls= [] site= 1096 +5095 1 n1-2095.plc1.org sls= [] site= 1097 +5096 1 n1-2096.plc1.org sls= [] site= 1098 +5097 1 n1-2097.plc1.org sls= [] site= 1099 +5098 1 n1-2098.plc1.org sls= [] site= 1100 +5099 1 n1-2099.plc1.org sls= [] site= 1101 +5100 1 n1-2100.plc1.org sls= [] site= 1102 +5101 1 n1-2101.plc1.org sls= [] site= 1103 +5102 1 n1-2102.plc1.org sls= [] site= 1104 +5103 1 n1-2103.plc1.org sls= [] site= 1105 +5104 1 n1-2104.plc1.org sls= [] site= 1106 +5105 1 n1-2105.plc1.org sls= [] site= 1107 +5106 1 n1-2106.plc1.org sls= [] site= 1108 +5107 1 n1-2107.plc1.org sls= [] site= 1109 +5108 1 n1-2108.plc1.org sls= [] site= 1110 +5109 1 n1-2109.plc1.org sls= [] site= 1111 +5110 1 n1-2110.plc1.org sls= [] site= 1112 +5111 1 n1-2111.plc1.org sls= [] site= 1113 +5112 1 n1-2112.plc1.org sls= [] site= 1114 +5113 1 n1-2113.plc1.org sls= [] site= 1115 +5114 1 n1-2114.plc1.org sls= [] site= 1116 +5115 1 n1-2115.plc1.org sls= [] site= 1117 +5116 1 n1-2116.plc1.org sls= [] site= 1118 +5117 1 n1-2117.plc1.org sls= [] site= 1119 +5118 1 n1-2118.plc1.org sls= [] site= 1120 +5119 1 n1-2119.plc1.org sls= [] site= 1121 +5120 1 n1-2120.plc1.org sls= [] site= 1122 +5121 1 n1-2121.plc1.org sls= [] site= 1123 +5122 1 n1-2122.plc1.org sls= [] site= 1124 +5123 1 n1-2123.plc1.org sls= [] site= 1125 +5124 1 n1-2124.plc1.org sls= [] site= 1126 +5125 1 n1-2125.plc1.org sls= [] site= 1127 +5126 1 n1-2126.plc1.org sls= [] site= 1128 +5127 1 n1-2127.plc1.org sls= [] site= 1129 +5128 1 n1-2128.plc1.org sls= [] site= 1130 +5129 1 n1-2129.plc1.org sls= [] site= 1131 +5130 1 n1-2130.plc1.org sls= [] site= 1132 +5131 1 n1-2131.plc1.org sls= [] site= 1133 +5132 1 n1-2132.plc1.org sls= [] site= 1134 +5133 1 n1-2133.plc1.org sls= [] site= 1135 +5134 1 n1-2134.plc1.org sls= [] site= 1136 +5135 1 n1-2135.plc1.org sls= [] site= 1137 +5136 1 n1-2136.plc1.org sls= [] site= 1138 +5137 1 n1-2137.plc1.org sls= [] site= 1139 +5138 1 n1-2138.plc1.org sls= [] site= 1140 +5139 1 n1-2139.plc1.org sls= [] site= 1141 +5140 1 n1-2140.plc1.org sls= [] site= 1142 +5141 1 n1-2141.plc1.org sls= [] site= 1143 +5142 1 n1-2142.plc1.org sls= [] site= 1144 +5143 1 n1-2143.plc1.org sls= [] site= 1145 +5144 1 n1-2144.plc1.org sls= [] site= 1146 +5145 1 n1-2145.plc1.org sls= [] site= 1147 +5146 1 n1-2146.plc1.org sls= [] site= 1148 +5147 1 n1-2147.plc1.org sls= [] site= 1149 +5148 1 n1-2148.plc1.org sls= [] site= 1150 +5149 1 n1-2149.plc1.org sls= [] site= 1151 +5150 1 n1-2150.plc1.org sls= [] site= 1152 +5151 1 n1-2151.plc1.org sls= [] site= 1153 +5152 1 n1-2152.plc1.org sls= [] site= 1154 +5153 1 n1-2153.plc1.org sls= [] site= 1155 +5154 1 n1-2154.plc1.org sls= [] site= 1156 +5155 1 n1-2155.plc1.org sls= [] site= 1157 +5156 1 n1-2156.plc1.org sls= [] site= 1158 +5157 1 n1-2157.plc1.org sls= [] site= 1159 +5158 1 n1-2158.plc1.org sls= [] site= 1160 +5159 1 n1-2159.plc1.org sls= [] site= 1161 +5160 1 n1-2160.plc1.org sls= [] site= 1162 +5161 1 n1-2161.plc1.org sls= [] site= 1163 +5162 1 n1-2162.plc1.org sls= [] site= 1164 +5163 1 n1-2163.plc1.org sls= [] site= 1165 +5164 1 n1-2164.plc1.org sls= [] site= 1166 +5165 1 n1-2165.plc1.org sls= [] site= 1167 +5166 1 n1-2166.plc1.org sls= [] site= 1168 +5167 1 n1-2167.plc1.org sls= [] site= 1169 +5168 1 n1-2168.plc1.org sls= [] site= 1170 +5169 1 n1-2169.plc1.org sls= [] site= 1171 +5170 1 n1-2170.plc1.org sls= [] site= 1172 +5171 1 n1-2171.plc1.org sls= [] site= 1173 +5172 1 n1-2172.plc1.org sls= [] site= 1174 +5173 1 n1-2173.plc1.org sls= [] site= 1175 +5174 1 n1-2174.plc1.org sls= [] site= 1176 +5175 1 n1-2175.plc1.org sls= [] site= 1177 +5176 1 n1-2176.plc1.org sls= [] site= 1178 +5177 1 n1-2177.plc1.org sls= [] site= 1179 +5178 1 n1-2178.plc1.org sls= [] site= 1180 +5179 1 n1-2179.plc1.org sls= [] site= 1181 +5180 1 n1-2180.plc1.org sls= [] site= 1182 +5181 1 n1-2181.plc1.org sls= [] site= 1183 +5182 1 n1-2182.plc1.org sls= [] site= 1184 +5183 1 n1-2183.plc1.org sls= [] site= 1185 +5184 1 n1-2184.plc1.org sls= [] site= 1186 +5185 1 n1-2185.plc1.org sls= [] site= 1187 +5186 1 n1-2186.plc1.org sls= [] site= 1188 +5187 1 n1-2187.plc1.org sls= [] site= 1189 +5188 1 n1-2188.plc1.org sls= [] site= 1190 +5189 1 n1-2189.plc1.org sls= [] site= 1191 +5190 1 n1-2190.plc1.org sls= [] site= 1192 +5191 1 n1-2191.plc1.org sls= [] site= 1193 +5192 1 n1-2192.plc1.org sls= [] site= 1194 +5193 1 n1-2193.plc1.org sls= [] site= 1195 +5194 1 n1-2194.plc1.org sls= [] site= 1196 +5195 1 n1-2195.plc1.org sls= [] site= 1197 +5196 1 n1-2196.plc1.org sls= [] site= 1198 +5197 1 n1-2197.plc1.org sls= [] site= 1199 +5198 1 n1-2198.plc1.org sls= [] site= 1200 +5199 1 n1-2199.plc1.org sls= [] site= 1201 +5200 1 n1-2200.plc1.org sls= [] site= 1202 +5201 1 n1-2201.plc1.org sls= [] site= 1203 +5202 1 n1-2202.plc1.org sls= [] site= 1204 +5203 1 n1-2203.plc1.org sls= [] site= 1205 +5204 1 n1-2204.plc1.org sls= [] site= 1206 +5205 1 n1-2205.plc1.org sls= [] site= 1207 +5206 1 n1-2206.plc1.org sls= [] site= 1208 +5207 1 n1-2207.plc1.org sls= [] site= 1209 +5208 1 n1-2208.plc1.org sls= [] site= 1210 +5209 1 n1-2209.plc1.org sls= [] site= 1211 +5210 1 n1-2210.plc1.org sls= [] site= 1212 +5211 1 n1-2211.plc1.org sls= [] site= 1213 +5212 1 n1-2212.plc1.org sls= [] site= 1214 +5213 1 n1-2213.plc1.org sls= [] site= 1215 +5214 1 n1-2214.plc1.org sls= [] site= 1216 +5215 1 n1-2215.plc1.org sls= [] site= 1217 +5216 1 n1-2216.plc1.org sls= [] site= 1218 +5217 1 n1-2217.plc1.org sls= [] site= 1219 +5218 1 n1-2218.plc1.org sls= [] site= 1220 +5219 1 n1-2219.plc1.org sls= [] site= 1221 +5220 1 n1-2220.plc1.org sls= [] site= 1222 +5221 1 n1-2221.plc1.org sls= [] site= 1223 +5222 1 n1-2222.plc1.org sls= [] site= 1224 +5223 1 n1-2223.plc1.org sls= [] site= 1225 +5224 1 n1-2224.plc1.org sls= [] site= 1226 +5225 1 n1-2225.plc1.org sls= [] site= 1227 +5226 1 n1-2226.plc1.org sls= [] site= 1228 +5227 1 n1-2227.plc1.org sls= [] site= 1229 +5228 1 n1-2228.plc1.org sls= [] site= 1230 +5229 1 n1-2229.plc1.org sls= [] site= 1231 +5230 1 n1-2230.plc1.org sls= [] site= 1232 +5231 1 n1-2231.plc1.org sls= [] site= 1233 +5232 1 n1-2232.plc1.org sls= [] site= 1234 +5233 1 n1-2233.plc1.org sls= [] site= 1235 +5234 1 n1-2234.plc1.org sls= [] site= 1236 +5235 1 n1-2235.plc1.org sls= [] site= 1237 +5236 1 n1-2236.plc1.org sls= [] site= 1238 +5237 1 n1-2237.plc1.org sls= [] site= 1239 +5238 1 n1-2238.plc1.org sls= [] site= 1240 +5239 1 n1-2239.plc1.org sls= [] site= 1241 +5240 1 n1-2240.plc1.org sls= [] site= 1242 +5241 1 n1-2241.plc1.org sls= [] site= 1243 +5242 1 n1-2242.plc1.org sls= [] site= 1244 +5243 1 n1-2243.plc1.org sls= [] site= 1245 +5244 1 n1-2244.plc1.org sls= [] site= 1246 +5245 1 n1-2245.plc1.org sls= [] site= 1247 +5246 1 n1-2246.plc1.org sls= [] site= 1248 +5247 1 n1-2247.plc1.org sls= [] site= 1249 +5248 1 n1-2248.plc1.org sls= [] site= 1250 +5249 1 n1-2249.plc1.org sls= [] site= 1251 +5250 1 n1-2250.plc1.org sls= [] site= 1252 +5251 1 n1-2251.plc1.org sls= [] site= 1253 +5252 1 n1-2252.plc1.org sls= [] site= 1254 +5253 1 n1-2253.plc1.org sls= [] site= 1255 +5254 1 n1-2254.plc1.org sls= [] site= 1256 +5255 1 n1-2255.plc1.org sls= [] site= 1257 +5256 1 n1-2256.plc1.org sls= [] site= 1258 +5257 1 n1-2257.plc1.org sls= [] site= 1259 +5258 1 n1-2258.plc1.org sls= [] site= 1260 +5259 1 n1-2259.plc1.org sls= [] site= 1261 +5260 1 n1-2260.plc1.org sls= [] site= 1262 +5261 1 n1-2261.plc1.org sls= [] site= 1263 +5262 1 n1-2262.plc1.org sls= [] site= 1264 +5263 1 n1-2263.plc1.org sls= [] site= 1265 +5264 1 n1-2264.plc1.org sls= [] site= 1266 +5265 1 n1-2265.plc1.org sls= [] site= 1267 +5266 1 n1-2266.plc1.org sls= [] site= 1268 +5267 1 n1-2267.plc1.org sls= [] site= 1269 +5268 1 n1-2268.plc1.org sls= [] site= 1270 +5269 1 n1-2269.plc1.org sls= [] site= 1271 +5270 1 n1-2270.plc1.org sls= [] site= 1272 +5271 1 n1-2271.plc1.org sls= [] site= 1273 +5272 1 n1-2272.plc1.org sls= [] site= 1274 +5273 1 n1-2273.plc1.org sls= [] site= 1275 +5274 1 n1-2274.plc1.org sls= [] site= 1276 +5275 1 n1-2275.plc1.org sls= [] site= 1277 +5276 1 n1-2276.plc1.org sls= [] site= 1278 +5277 1 n1-2277.plc1.org sls= [] site= 1279 +5278 1 n1-2278.plc1.org sls= [] site= 1280 +5279 1 n1-2279.plc1.org sls= [] site= 1281 +5280 1 n1-2280.plc1.org sls= [] site= 1282 +5281 1 n1-2281.plc1.org sls= [] site= 1283 +5282 1 n1-2282.plc1.org sls= [] site= 1284 +5283 1 n1-2283.plc1.org sls= [] site= 1285 +5284 1 n1-2284.plc1.org sls= [] site= 1286 +5285 1 n1-2285.plc1.org sls= [] site= 1287 +5286 1 n1-2286.plc1.org sls= [] site= 1288 +5287 1 n1-2287.plc1.org sls= [] site= 1289 +5288 1 n1-2288.plc1.org sls= [] site= 1290 +5289 1 n1-2289.plc1.org sls= [] site= 1291 +5290 1 n1-2290.plc1.org sls= [] site= 1292 +5291 1 n1-2291.plc1.org sls= [] site= 1293 +5292 1 n1-2292.plc1.org sls= [] site= 1294 +5293 1 n1-2293.plc1.org sls= [] site= 1295 +5294 1 n1-2294.plc1.org sls= [] site= 1296 +5295 1 n1-2295.plc1.org sls= [] site= 1297 +5296 1 n1-2296.plc1.org sls= [] site= 1298 +5297 1 n1-2297.plc1.org sls= [] site= 1299 +5298 1 n1-2298.plc1.org sls= [] site= 1300 +5299 1 n1-2299.plc1.org sls= [] site= 1301 +5300 1 n1-2300.plc1.org sls= [] site= 1302 +5301 1 n1-2301.plc1.org sls= [] site= 1303 +5302 1 n1-2302.plc1.org sls= [] site= 1304 +5303 1 n1-2303.plc1.org sls= [] site= 1305 +5304 1 n1-2304.plc1.org sls= [] site= 1306 +5305 1 n1-2305.plc1.org sls= [] site= 1307 +5306 1 n1-2306.plc1.org sls= [] site= 1308 +5307 1 n1-2307.plc1.org sls= [] site= 1309 +5308 1 n1-2308.plc1.org sls= [] site= 1310 +5309 1 n1-2309.plc1.org sls= [] site= 1311 +5310 1 n1-2310.plc1.org sls= [] site= 1312 +5311 1 n1-2311.plc1.org sls= [] site= 1313 +5312 1 n1-2312.plc1.org sls= [] site= 1314 +5313 1 n1-2313.plc1.org sls= [] site= 1315 +5314 1 n1-2314.plc1.org sls= [] site= 1316 +5315 1 n1-2315.plc1.org sls= [] site= 1317 +5316 1 n1-2316.plc1.org sls= [] site= 1318 +5317 1 n1-2317.plc1.org sls= [] site= 1319 +5318 1 n1-2318.plc1.org sls= [] site= 1320 +5319 1 n1-2319.plc1.org sls= [] site= 1321 +5320 1 n1-2320.plc1.org sls= [] site= 1322 +5321 1 n1-2321.plc1.org sls= [] site= 1323 +5322 1 n1-2322.plc1.org sls= [] site= 1324 +5323 1 n1-2323.plc1.org sls= [] site= 1325 +5324 1 n1-2324.plc1.org sls= [] site= 1326 +5325 1 n1-2325.plc1.org sls= [] site= 1327 +5326 1 n1-2326.plc1.org sls= [] site= 1328 +5327 1 n1-2327.plc1.org sls= [] site= 1329 +5328 1 n1-2328.plc1.org sls= [] site= 1330 +5329 1 n1-2329.plc1.org sls= [] site= 1331 +5330 1 n1-2330.plc1.org sls= [] site= 1332 +5331 1 n1-2331.plc1.org sls= [] site= 1333 +5332 1 n1-2332.plc1.org sls= [] site= 1334 +5333 1 n1-2333.plc1.org sls= [] site= 1335 +5334 1 n1-2334.plc1.org sls= [] site= 1336 +5335 1 n1-2335.plc1.org sls= [] site= 1337 +5336 1 n1-2336.plc1.org sls= [] site= 1338 +5337 1 n1-2337.plc1.org sls= [] site= 1339 +5338 1 n1-2338.plc1.org sls= [] site= 1340 +5339 1 n1-2339.plc1.org sls= [] site= 1341 +5340 1 n1-2340.plc1.org sls= [] site= 1342 +5341 1 n1-2341.plc1.org sls= [] site= 1343 +5342 1 n1-2342.plc1.org sls= [] site= 1344 +5343 1 n1-2343.plc1.org sls= [] site= 1345 +5344 1 n1-2344.plc1.org sls= [] site= 1346 +5345 1 n1-2345.plc1.org sls= [] site= 1347 +5346 1 n1-2346.plc1.org sls= [] site= 1348 +5347 1 n1-2347.plc1.org sls= [] site= 1349 +5348 1 n1-2348.plc1.org sls= [] site= 1350 +5349 1 n1-2349.plc1.org sls= [] site= 1351 +5350 1 n1-2350.plc1.org sls= [] site= 1352 +5351 1 n1-2351.plc1.org sls= [] site= 1353 +5352 1 n1-2352.plc1.org sls= [] site= 1354 +5353 1 n1-2353.plc1.org sls= [] site= 1355 +5354 1 n1-2354.plc1.org sls= [] site= 1356 +5355 1 n1-2355.plc1.org sls= [] site= 1357 +5356 1 n1-2356.plc1.org sls= [] site= 1358 +5357 1 n1-2357.plc1.org sls= [] site= 1359 +5358 1 n1-2358.plc1.org sls= [] site= 1360 +5359 1 n1-2359.plc1.org sls= [] site= 1361 +5360 1 n1-2360.plc1.org sls= [] site= 1362 +5361 1 n1-2361.plc1.org sls= [] site= 1363 +5362 1 n1-2362.plc1.org sls= [] site= 1364 +5363 1 n1-2363.plc1.org sls= [] site= 1365 +5364 1 n1-2364.plc1.org sls= [] site= 1366 +5365 1 n1-2365.plc1.org sls= [] site= 1367 +5366 1 n1-2366.plc1.org sls= [] site= 1368 +5367 1 n1-2367.plc1.org sls= [] site= 1369 +5368 1 n1-2368.plc1.org sls= [] site= 1370 +5369 1 n1-2369.plc1.org sls= [] site= 1371 +5370 1 n1-2370.plc1.org sls= [] site= 1372 +5371 1 n1-2371.plc1.org sls= [] site= 1373 +5372 1 n1-2372.plc1.org sls= [] site= 1374 +5373 1 n1-2373.plc1.org sls= [] site= 1375 +5374 1 n1-2374.plc1.org sls= [] site= 1376 +5375 1 n1-2375.plc1.org sls= [] site= 1377 +5376 1 n1-2376.plc1.org sls= [] site= 1378 +5377 1 n1-2377.plc1.org sls= [] site= 1379 +5378 1 n1-2378.plc1.org sls= [] site= 1380 +5379 1 n1-2379.plc1.org sls= [] site= 1381 +5380 1 n1-2380.plc1.org sls= [] site= 1382 +5381 1 n1-2381.plc1.org sls= [] site= 1383 +5382 1 n1-2382.plc1.org sls= [] site= 1384 +5383 1 n1-2383.plc1.org sls= [] site= 1385 +5384 1 n1-2384.plc1.org sls= [] site= 1386 +5385 1 n1-2385.plc1.org sls= [] site= 1387 +5386 1 n1-2386.plc1.org sls= [] site= 1388 +5387 1 n1-2387.plc1.org sls= [] site= 1389 +5388 1 n1-2388.plc1.org sls= [] site= 1390 +5389 1 n1-2389.plc1.org sls= [] site= 1391 +5390 1 n1-2390.plc1.org sls= [] site= 1392 +5391 1 n1-2391.plc1.org sls= [] site= 1393 +5392 1 n1-2392.plc1.org sls= [] site= 1394 +5393 1 n1-2393.plc1.org sls= [] site= 1395 +5394 1 n1-2394.plc1.org sls= [] site= 1396 +5395 1 n1-2395.plc1.org sls= [] site= 1397 +5396 1 n1-2396.plc1.org sls= [] site= 1398 +5397 1 n1-2397.plc1.org sls= [] site= 1399 +5398 1 n1-2398.plc1.org sls= [] site= 1400 +5399 1 n1-2399.plc1.org sls= [] site= 1401 +5400 1 n1-2400.plc1.org sls= [] site= 1402 +5401 1 n1-2401.plc1.org sls= [] site= 1403 +5402 1 n1-2402.plc1.org sls= [] site= 1404 +5403 1 n1-2403.plc1.org sls= [] site= 1405 +5404 1 n1-2404.plc1.org sls= [] site= 1406 +5405 1 n1-2405.plc1.org sls= [] site= 1407 +5406 1 n1-2406.plc1.org sls= [] site= 1408 +5407 1 n1-2407.plc1.org sls= [] site= 1409 +5408 1 n1-2408.plc1.org sls= [] site= 1410 +5409 1 n1-2409.plc1.org sls= [] site= 1411 +5410 1 n1-2410.plc1.org sls= [] site= 1412 +5411 1 n1-2411.plc1.org sls= [] site= 1413 +5412 1 n1-2412.plc1.org sls= [] site= 1414 +5413 1 n1-2413.plc1.org sls= [] site= 1415 +5414 1 n1-2414.plc1.org sls= [] site= 1416 +5415 1 n1-2415.plc1.org sls= [] site= 1417 +5416 1 n1-2416.plc1.org sls= [] site= 1418 +5417 1 n1-2417.plc1.org sls= [] site= 1419 +5418 1 n1-2418.plc1.org sls= [] site= 1420 +5419 1 n1-2419.plc1.org sls= [] site= 1421 +5420 1 n1-2420.plc1.org sls= [] site= 1422 +5421 1 n1-2421.plc1.org sls= [] site= 1423 +5422 1 n1-2422.plc1.org sls= [] site= 1424 +5423 1 n1-2423.plc1.org sls= [] site= 1425 +5424 1 n1-2424.plc1.org sls= [] site= 1426 +5425 1 n1-2425.plc1.org sls= [] site= 1427 +5426 1 n1-2426.plc1.org sls= [] site= 1428 +5427 1 n1-2427.plc1.org sls= [] site= 1429 +5428 1 n1-2428.plc1.org sls= [] site= 1430 +5429 1 n1-2429.plc1.org sls= [] site= 1431 +5430 1 n1-2430.plc1.org sls= [] site= 1432 +5431 1 n1-2431.plc1.org sls= [] site= 1433 +5432 1 n1-2432.plc1.org sls= [] site= 1434 +5433 1 n1-2433.plc1.org sls= [] site= 1435 +5434 1 n1-2434.plc1.org sls= [] site= 1436 +5435 1 n1-2435.plc1.org sls= [] site= 1437 +5436 1 n1-2436.plc1.org sls= [] site= 1438 +5437 1 n1-2437.plc1.org sls= [] site= 1439 +5438 1 n1-2438.plc1.org sls= [] site= 1440 +5439 1 n1-2439.plc1.org sls= [] site= 1441 +5440 1 n1-2440.plc1.org sls= [] site= 1442 +5441 1 n1-2441.plc1.org sls= [] site= 1443 +5442 1 n1-2442.plc1.org sls= [] site= 1444 +5443 1 n1-2443.plc1.org sls= [] site= 1445 +5444 1 n1-2444.plc1.org sls= [] site= 1446 +5445 1 n1-2445.plc1.org sls= [] site= 1447 +5446 1 n1-2446.plc1.org sls= [] site= 1448 +5447 1 n1-2447.plc1.org sls= [] site= 1449 +5448 1 n1-2448.plc1.org sls= [] site= 1450 +5449 1 n1-2449.plc1.org sls= [] site= 1451 +5450 1 n1-2450.plc1.org sls= [] site= 1452 +5451 1 n1-2451.plc1.org sls= [] site= 1453 +5452 1 n1-2452.plc1.org sls= [] site= 1454 +5453 1 n1-2453.plc1.org sls= [] site= 1455 +5454 1 n1-2454.plc1.org sls= [] site= 1456 +5455 1 n1-2455.plc1.org sls= [] site= 1457 +5456 1 n1-2456.plc1.org sls= [] site= 1458 +5457 1 n1-2457.plc1.org sls= [] site= 1459 +5458 1 n1-2458.plc1.org sls= [] site= 1460 +5459 1 n1-2459.plc1.org sls= [] site= 1461 +5460 1 n1-2460.plc1.org sls= [] site= 1462 +5461 1 n1-2461.plc1.org sls= [] site= 1463 +5462 1 n1-2462.plc1.org sls= [] site= 1464 +5463 1 n1-2463.plc1.org sls= [] site= 1465 +5464 1 n1-2464.plc1.org sls= [] site= 1466 +5465 1 n1-2465.plc1.org sls= [] site= 1467 +5466 1 n1-2466.plc1.org sls= [] site= 1468 +5467 1 n1-2467.plc1.org sls= [] site= 1469 +5468 1 n1-2468.plc1.org sls= [] site= 1470 +5469 1 n1-2469.plc1.org sls= [] site= 1471 +5470 1 n1-2470.plc1.org sls= [] site= 1472 +5471 1 n1-2471.plc1.org sls= [] site= 1473 +5472 1 n1-2472.plc1.org sls= [] site= 1474 +5473 1 n1-2473.plc1.org sls= [] site= 1475 +5474 1 n1-2474.plc1.org sls= [] site= 1476 +5475 1 n1-2475.plc1.org sls= [] site= 1477 +5476 1 n1-2476.plc1.org sls= [] site= 1478 +5477 1 n1-2477.plc1.org sls= [] site= 1479 +5478 1 n1-2478.plc1.org sls= [] site= 1480 +5479 1 n1-2479.plc1.org sls= [] site= 1481 +5480 1 n1-2480.plc1.org sls= [] site= 1482 +5481 1 n1-2481.plc1.org sls= [] site= 1483 +5482 1 n1-2482.plc1.org sls= [] site= 1484 +5483 1 n1-2483.plc1.org sls= [] site= 1485 +5484 1 n1-2484.plc1.org sls= [] site= 1486 +5485 1 n1-2485.plc1.org sls= [] site= 1487 +5486 1 n1-2486.plc1.org sls= [] site= 1488 +5487 1 n1-2487.plc1.org sls= [] site= 1489 +5488 1 n1-2488.plc1.org sls= [] site= 1490 +5489 1 n1-2489.plc1.org sls= [] site= 1491 +5490 1 n1-2490.plc1.org sls= [] site= 1492 +5491 1 n1-2491.plc1.org sls= [] site= 1493 +5492 1 n1-2492.plc1.org sls= [] site= 1494 +5493 1 n1-2493.plc1.org sls= [] site= 1495 +5494 1 n1-2494.plc1.org sls= [] site= 1496 +5495 1 n1-2495.plc1.org sls= [] site= 1497 +5496 1 n1-2496.plc1.org sls= [] site= 1498 +5497 1 n1-2497.plc1.org sls= [] site= 1499 +5498 1 n1-2498.plc1.org sls= [] site= 1500 +5499 1 n1-2499.plc1.org sls= [] site= 1501 +5500 1 n1-2500.plc1.org sls= [] site= 1502 +5501 1 n1-2501.plc1.org sls= [] site= 1503 +5502 1 n1-2502.plc1.org sls= [] site= 1504 +5503 1 n1-2503.plc1.org sls= [] site= 1505 +5504 1 n1-2504.plc1.org sls= [] site= 1506 +5505 1 n1-2505.plc1.org sls= [] site= 1507 +5506 1 n1-2506.plc1.org sls= [] site= 1508 +5507 1 n1-2507.plc1.org sls= [] site= 1509 +5508 1 n1-2508.plc1.org sls= [] site= 1510 +5509 1 n1-2509.plc1.org sls= [] site= 1511 +5510 1 n1-2510.plc1.org sls= [] site= 1512 +5511 1 n1-2511.plc1.org sls= [] site= 1513 +5512 1 n1-2512.plc1.org sls= [] site= 1514 +5513 1 n1-2513.plc1.org sls= [] site= 1515 +5514 1 n1-2514.plc1.org sls= [] site= 1516 +5515 1 n1-2515.plc1.org sls= [] site= 1517 +5516 1 n1-2516.plc1.org sls= [] site= 1518 +5517 1 n1-2517.plc1.org sls= [] site= 1519 +5518 1 n1-2518.plc1.org sls= [] site= 1520 +5519 1 n1-2519.plc1.org sls= [] site= 1521 +5520 1 n1-2520.plc1.org sls= [] site= 1522 +5521 1 n1-2521.plc1.org sls= [] site= 1523 +5522 1 n1-2522.plc1.org sls= [] site= 1524 +5523 1 n1-2523.plc1.org sls= [] site= 1525 +5524 1 n1-2524.plc1.org sls= [] site= 1526 +5525 1 n1-2525.plc1.org sls= [] site= 1527 +5526 1 n1-2526.plc1.org sls= [] site= 1528 +5527 1 n1-2527.plc1.org sls= [] site= 1529 +5528 1 n1-2528.plc1.org sls= [] site= 1530 +5529 1 n1-2529.plc1.org sls= [] site= 1531 +5530 1 n1-2530.plc1.org sls= [] site= 1532 +5531 1 n1-2531.plc1.org sls= [] site= 1533 +5532 1 n1-2532.plc1.org sls= [] site= 1534 +5533 1 n1-2533.plc1.org sls= [] site= 1535 +5534 1 n1-2534.plc1.org sls= [] site= 1536 +5535 1 n1-2535.plc1.org sls= [] site= 1537 +5536 1 n1-2536.plc1.org sls= [] site= 1538 +5537 1 n1-2537.plc1.org sls= [] site= 1539 +5538 1 n1-2538.plc1.org sls= [] site= 1540 +5539 1 n1-2539.plc1.org sls= [] site= 1541 +5540 1 n1-2540.plc1.org sls= [] site= 1542 +5541 1 n1-2541.plc1.org sls= [] site= 1543 +5542 1 n1-2542.plc1.org sls= [] site= 1544 +5543 1 n1-2543.plc1.org sls= [] site= 1545 +5544 1 n1-2544.plc1.org sls= [] site= 1546 +5545 1 n1-2545.plc1.org sls= [] site= 1547 +5546 1 n1-2546.plc1.org sls= [] site= 1548 +5547 1 n1-2547.plc1.org sls= [] site= 1549 +5548 1 n1-2548.plc1.org sls= [] site= 1550 +5549 1 n1-2549.plc1.org sls= [] site= 1551 +5550 1 n1-2550.plc1.org sls= [] site= 1552 +5551 1 n1-2551.plc1.org sls= [] site= 1553 +5552 1 n1-2552.plc1.org sls= [] site= 1554 +5553 1 n1-2553.plc1.org sls= [] site= 1555 +5554 1 n1-2554.plc1.org sls= [] site= 1556 +5555 1 n1-2555.plc1.org sls= [] site= 1557 +5556 1 n1-2556.plc1.org sls= [] site= 1558 +5557 1 n1-2557.plc1.org sls= [] site= 1559 +5558 1 n1-2558.plc1.org sls= [] site= 1560 +5559 1 n1-2559.plc1.org sls= [] site= 1561 +5560 1 n1-2560.plc1.org sls= [] site= 1562 +5561 1 n1-2561.plc1.org sls= [] site= 1563 +5562 1 n1-2562.plc1.org sls= [] site= 1564 +5563 1 n1-2563.plc1.org sls= [] site= 1565 +5564 1 n1-2564.plc1.org sls= [] site= 1566 +5565 1 n1-2565.plc1.org sls= [] site= 1567 +5566 1 n1-2566.plc1.org sls= [] site= 1568 +5567 1 n1-2567.plc1.org sls= [] site= 1569 +5568 1 n1-2568.plc1.org sls= [] site= 1570 +5569 1 n1-2569.plc1.org sls= [] site= 1571 +5570 1 n1-2570.plc1.org sls= [] site= 1572 +5571 1 n1-2571.plc1.org sls= [] site= 1573 +5572 1 n1-2572.plc1.org sls= [] site= 1574 +5573 1 n1-2573.plc1.org sls= [] site= 1575 +5574 1 n1-2574.plc1.org sls= [] site= 1576 +5575 1 n1-2575.plc1.org sls= [] site= 1577 +5576 1 n1-2576.plc1.org sls= [] site= 1578 +5577 1 n1-2577.plc1.org sls= [] site= 1579 +5578 1 n1-2578.plc1.org sls= [] site= 1580 +5579 1 n1-2579.plc1.org sls= [] site= 1581 +5580 1 n1-2580.plc1.org sls= [] site= 1582 +5581 1 n1-2581.plc1.org sls= [] site= 1583 +5582 1 n1-2582.plc1.org sls= [] site= 1584 +5583 1 n1-2583.plc1.org sls= [] site= 1585 +5584 1 n1-2584.plc1.org sls= [] site= 1586 +5585 1 n1-2585.plc1.org sls= [] site= 1587 +5586 1 n1-2586.plc1.org sls= [] site= 1588 +5587 1 n1-2587.plc1.org sls= [] site= 1589 +5588 1 n1-2588.plc1.org sls= [] site= 1590 +5589 1 n1-2589.plc1.org sls= [] site= 1591 +5590 1 n1-2590.plc1.org sls= [] site= 1592 +5591 1 n1-2591.plc1.org sls= [] site= 1593 +5592 1 n1-2592.plc1.org sls= [] site= 1594 +5593 1 n1-2593.plc1.org sls= [] site= 1595 +5594 1 n1-2594.plc1.org sls= [] site= 1596 +5595 1 n1-2595.plc1.org sls= [] site= 1597 +5596 1 n1-2596.plc1.org sls= [] site= 1598 +5597 1 n1-2597.plc1.org sls= [] site= 1599 +5598 1 n1-2598.plc1.org sls= [] site= 1600 +5599 1 n1-2599.plc1.org sls= [] site= 1601 +5600 1 n1-2600.plc1.org sls= [] site= 1602 +5601 1 n1-2601.plc1.org sls= [] site= 1603 +5602 1 n1-2602.plc1.org sls= [] site= 1604 +5603 1 n1-2603.plc1.org sls= [] site= 1605 +5604 1 n1-2604.plc1.org sls= [] site= 1606 +5605 1 n1-2605.plc1.org sls= [] site= 1607 +5606 1 n1-2606.plc1.org sls= [] site= 1608 +5607 1 n1-2607.plc1.org sls= [] site= 1609 +5608 1 n1-2608.plc1.org sls= [] site= 1610 +5609 1 n1-2609.plc1.org sls= [] site= 1611 +5610 1 n1-2610.plc1.org sls= [] site= 1612 +5611 1 n1-2611.plc1.org sls= [] site= 1613 +5612 1 n1-2612.plc1.org sls= [] site= 1614 +5613 1 n1-2613.plc1.org sls= [] site= 1615 +5614 1 n1-2614.plc1.org sls= [] site= 1616 +5615 1 n1-2615.plc1.org sls= [] site= 1617 +5616 1 n1-2616.plc1.org sls= [] site= 1618 +5617 1 n1-2617.plc1.org sls= [] site= 1619 +5618 1 n1-2618.plc1.org sls= [] site= 1620 +5619 1 n1-2619.plc1.org sls= [] site= 1621 +5620 1 n1-2620.plc1.org sls= [] site= 1622 +5621 1 n1-2621.plc1.org sls= [] site= 1623 +5622 1 n1-2622.plc1.org sls= [] site= 1624 +5623 1 n1-2623.plc1.org sls= [] site= 1625 +5624 1 n1-2624.plc1.org sls= [] site= 1626 +5625 1 n1-2625.plc1.org sls= [] site= 1627 +5626 1 n1-2626.plc1.org sls= [] site= 1628 +5627 1 n1-2627.plc1.org sls= [] site= 1629 +5628 1 n1-2628.plc1.org sls= [] site= 1630 +5629 1 n1-2629.plc1.org sls= [] site= 1631 +5630 1 n1-2630.plc1.org sls= [] site= 1632 +5631 1 n1-2631.plc1.org sls= [] site= 1633 +5632 1 n1-2632.plc1.org sls= [] site= 1634 +5633 1 n1-2633.plc1.org sls= [] site= 1635 +5634 1 n1-2634.plc1.org sls= [] site= 1636 +5635 1 n1-2635.plc1.org sls= [] site= 1637 +5636 1 n1-2636.plc1.org sls= [] site= 1638 +5637 1 n1-2637.plc1.org sls= [] site= 1639 +5638 1 n1-2638.plc1.org sls= [] site= 1640 +5639 1 n1-2639.plc1.org sls= [] site= 1641 +5640 1 n1-2640.plc1.org sls= [] site= 1642 +5641 1 n1-2641.plc1.org sls= [] site= 1643 +5642 1 n1-2642.plc1.org sls= [] site= 1644 +5643 1 n1-2643.plc1.org sls= [] site= 1645 +5644 1 n1-2644.plc1.org sls= [] site= 1646 +5645 1 n1-2645.plc1.org sls= [] site= 1647 +5646 1 n1-2646.plc1.org sls= [] site= 1648 +5647 1 n1-2647.plc1.org sls= [] site= 1649 +5648 1 n1-2648.plc1.org sls= [] site= 1650 +5649 1 n1-2649.plc1.org sls= [] site= 1651 +5650 1 n1-2650.plc1.org sls= [] site= 1652 +5651 1 n1-2651.plc1.org sls= [] site= 1653 +5652 1 n1-2652.plc1.org sls= [] site= 1654 +5653 1 n1-2653.plc1.org sls= [] site= 1655 +5654 1 n1-2654.plc1.org sls= [] site= 1656 +5655 1 n1-2655.plc1.org sls= [] site= 1657 +5656 1 n1-2656.plc1.org sls= [] site= 1658 +5657 1 n1-2657.plc1.org sls= [] site= 1659 +5658 1 n1-2658.plc1.org sls= [] site= 1660 +5659 1 n1-2659.plc1.org sls= [] site= 1661 +5660 1 n1-2660.plc1.org sls= [] site= 1662 +5661 1 n1-2661.plc1.org sls= [] site= 1663 +5662 1 n1-2662.plc1.org sls= [] site= 1664 +5663 1 n1-2663.plc1.org sls= [] site= 1665 +5664 1 n1-2664.plc1.org sls= [] site= 1666 +5665 1 n1-2665.plc1.org sls= [] site= 1667 +5666 1 n1-2666.plc1.org sls= [] site= 1668 +5667 1 n1-2667.plc1.org sls= [] site= 1669 +5668 1 n1-2668.plc1.org sls= [] site= 1670 +5669 1 n1-2669.plc1.org sls= [] site= 1671 +5670 1 n1-2670.plc1.org sls= [] site= 1672 +5671 1 n1-2671.plc1.org sls= [] site= 1673 +5672 1 n1-2672.plc1.org sls= [] site= 1674 +5673 1 n1-2673.plc1.org sls= [] site= 1675 +5674 1 n1-2674.plc1.org sls= [] site= 1676 +5675 1 n1-2675.plc1.org sls= [] site= 1677 +5676 1 n1-2676.plc1.org sls= [] site= 1678 +5677 1 n1-2677.plc1.org sls= [] site= 1679 +5678 1 n1-2678.plc1.org sls= [] site= 1680 +5679 1 n1-2679.plc1.org sls= [] site= 1681 +5680 1 n1-2680.plc1.org sls= [] site= 1682 +5681 1 n1-2681.plc1.org sls= [] site= 1683 +5682 1 n1-2682.plc1.org sls= [] site= 1684 +5683 1 n1-2683.plc1.org sls= [] site= 1685 +5684 1 n1-2684.plc1.org sls= [] site= 1686 +5685 1 n1-2685.plc1.org sls= [] site= 1687 +5686 1 n1-2686.plc1.org sls= [] site= 1688 +5687 1 n1-2687.plc1.org sls= [] site= 1689 +5688 1 n1-2688.plc1.org sls= [] site= 1690 +5689 1 n1-2689.plc1.org sls= [] site= 1691 +5690 1 n1-2690.plc1.org sls= [] site= 1692 +5691 1 n1-2691.plc1.org sls= [] site= 1693 +5692 1 n1-2692.plc1.org sls= [] site= 1694 +5693 1 n1-2693.plc1.org sls= [] site= 1695 +5694 1 n1-2694.plc1.org sls= [] site= 1696 +5695 1 n1-2695.plc1.org sls= [] site= 1697 +5696 1 n1-2696.plc1.org sls= [] site= 1698 +5697 1 n1-2697.plc1.org sls= [] site= 1699 +5698 1 n1-2698.plc1.org sls= [] site= 1700 +5699 1 n1-2699.plc1.org sls= [] site= 1701 +5700 1 n1-2700.plc1.org sls= [] site= 1702 +5701 1 n1-2701.plc1.org sls= [] site= 1703 +5702 1 n1-2702.plc1.org sls= [] site= 1704 +5703 1 n1-2703.plc1.org sls= [] site= 1705 +5704 1 n1-2704.plc1.org sls= [] site= 1706 +5705 1 n1-2705.plc1.org sls= [] site= 1707 +5706 1 n1-2706.plc1.org sls= [] site= 1708 +5707 1 n1-2707.plc1.org sls= [] site= 1709 +5708 1 n1-2708.plc1.org sls= [] site= 1710 +5709 1 n1-2709.plc1.org sls= [] site= 1711 +5710 1 n1-2710.plc1.org sls= [] site= 1712 +5711 1 n1-2711.plc1.org sls= [] site= 1713 +5712 1 n1-2712.plc1.org sls= [] site= 1714 +5713 1 n1-2713.plc1.org sls= [] site= 1715 +5714 1 n1-2714.plc1.org sls= [] site= 1716 +5715 1 n1-2715.plc1.org sls= [] site= 1717 +5716 1 n1-2716.plc1.org sls= [] site= 1718 +5717 1 n1-2717.plc1.org sls= [] site= 1719 +5718 1 n1-2718.plc1.org sls= [] site= 1720 +5719 1 n1-2719.plc1.org sls= [] site= 1721 +5720 1 n1-2720.plc1.org sls= [] site= 1722 +5721 1 n1-2721.plc1.org sls= [] site= 1723 +5722 1 n1-2722.plc1.org sls= [] site= 1724 +5723 1 n1-2723.plc1.org sls= [] site= 1725 +5724 1 n1-2724.plc1.org sls= [] site= 1726 +5725 1 n1-2725.plc1.org sls= [] site= 1727 +5726 1 n1-2726.plc1.org sls= [] site= 1728 +5727 1 n1-2727.plc1.org sls= [] site= 1729 +5728 1 n1-2728.plc1.org sls= [] site= 1730 +5729 1 n1-2729.plc1.org sls= [] site= 1731 +5730 1 n1-2730.plc1.org sls= [] site= 1732 +5731 1 n1-2731.plc1.org sls= [] site= 1733 +5732 1 n1-2732.plc1.org sls= [] site= 1734 +5733 1 n1-2733.plc1.org sls= [] site= 1735 +5734 1 n1-2734.plc1.org sls= [] site= 1736 +5735 1 n1-2735.plc1.org sls= [] site= 1737 +5736 1 n1-2736.plc1.org sls= [] site= 1738 +5737 1 n1-2737.plc1.org sls= [] site= 1739 +5738 1 n1-2738.plc1.org sls= [] site= 1740 +5739 1 n1-2739.plc1.org sls= [] site= 1741 +5740 1 n1-2740.plc1.org sls= [] site= 1742 +5741 1 n1-2741.plc1.org sls= [] site= 1743 +5742 1 n1-2742.plc1.org sls= [] site= 1744 +5743 1 n1-2743.plc1.org sls= [] site= 1745 +5744 1 n1-2744.plc1.org sls= [] site= 1746 +5745 1 n1-2745.plc1.org sls= [] site= 1747 +5746 1 n1-2746.plc1.org sls= [] site= 1748 +5747 1 n1-2747.plc1.org sls= [] site= 1749 +5748 1 n1-2748.plc1.org sls= [] site= 1750 +5749 1 n1-2749.plc1.org sls= [] site= 1751 +5750 1 n1-2750.plc1.org sls= [] site= 1752 +5751 1 n1-2751.plc1.org sls= [] site= 1753 +5752 1 n1-2752.plc1.org sls= [] site= 1754 +5753 1 n1-2753.plc1.org sls= [] site= 1755 +5754 1 n1-2754.plc1.org sls= [] site= 1756 +5755 1 n1-2755.plc1.org sls= [] site= 1757 +5756 1 n1-2756.plc1.org sls= [] site= 1758 +5757 1 n1-2757.plc1.org sls= [] site= 1759 +5758 1 n1-2758.plc1.org sls= [] site= 1760 +5759 1 n1-2759.plc1.org sls= [] site= 1761 +5760 1 n1-2760.plc1.org sls= [] site= 1762 +5761 1 n1-2761.plc1.org sls= [] site= 1763 +5762 1 n1-2762.plc1.org sls= [] site= 1764 +5763 1 n1-2763.plc1.org sls= [] site= 1765 +5764 1 n1-2764.plc1.org sls= [] site= 1766 +5765 1 n1-2765.plc1.org sls= [] site= 1767 +5766 1 n1-2766.plc1.org sls= [] site= 1768 +5767 1 n1-2767.plc1.org sls= [] site= 1769 +5768 1 n1-2768.plc1.org sls= [] site= 1770 +5769 1 n1-2769.plc1.org sls= [] site= 1771 +5770 1 n1-2770.plc1.org sls= [] site= 1772 +5771 1 n1-2771.plc1.org sls= [] site= 1773 +5772 1 n1-2772.plc1.org sls= [] site= 1774 +5773 1 n1-2773.plc1.org sls= [] site= 1775 +5774 1 n1-2774.plc1.org sls= [] site= 1776 +5775 1 n1-2775.plc1.org sls= [] site= 1777 +5776 1 n1-2776.plc1.org sls= [] site= 1778 +5777 1 n1-2777.plc1.org sls= [] site= 1779 +5778 1 n1-2778.plc1.org sls= [] site= 1780 +5779 1 n1-2779.plc1.org sls= [] site= 1781 +5780 1 n1-2780.plc1.org sls= [] site= 1782 +5781 1 n1-2781.plc1.org sls= [] site= 1783 +5782 1 n1-2782.plc1.org sls= [] site= 1784 +5783 1 n1-2783.plc1.org sls= [] site= 1785 +5784 1 n1-2784.plc1.org sls= [] site= 1786 +5785 1 n1-2785.plc1.org sls= [] site= 1787 +5786 1 n1-2786.plc1.org sls= [] site= 1788 +5787 1 n1-2787.plc1.org sls= [] site= 1789 +5788 1 n1-2788.plc1.org sls= [] site= 1790 +5789 1 n1-2789.plc1.org sls= [] site= 1791 +5790 1 n1-2790.plc1.org sls= [] site= 1792 +5791 1 n1-2791.plc1.org sls= [] site= 1793 +5792 1 n1-2792.plc1.org sls= [] site= 1794 +5793 1 n1-2793.plc1.org sls= [] site= 1795 +5794 1 n1-2794.plc1.org sls= [] site= 1796 +5795 1 n1-2795.plc1.org sls= [] site= 1797 +5796 1 n1-2796.plc1.org sls= [] site= 1798 +5797 1 n1-2797.plc1.org sls= [] site= 1799 +5798 1 n1-2798.plc1.org sls= [] site= 1800 +5799 1 n1-2799.plc1.org sls= [] site= 1801 +5800 1 n1-2800.plc1.org sls= [] site= 1802 +5801 1 n1-2801.plc1.org sls= [] site= 1803 +5802 1 n1-2802.plc1.org sls= [] site= 1804 +5803 1 n1-2803.plc1.org sls= [] site= 1805 +5804 1 n1-2804.plc1.org sls= [] site= 1806 +5805 1 n1-2805.plc1.org sls= [] site= 1807 +5806 1 n1-2806.plc1.org sls= [] site= 1808 +5807 1 n1-2807.plc1.org sls= [] site= 1809 +5808 1 n1-2808.plc1.org sls= [] site= 1810 +5809 1 n1-2809.plc1.org sls= [] site= 1811 +5810 1 n1-2810.plc1.org sls= [] site= 1812 +5811 1 n1-2811.plc1.org sls= [] site= 1813 +5812 1 n1-2812.plc1.org sls= [] site= 1814 +5813 1 n1-2813.plc1.org sls= [] site= 1815 +5814 1 n1-2814.plc1.org sls= [] site= 1816 +5815 1 n1-2815.plc1.org sls= [] site= 1817 +5816 1 n1-2816.plc1.org sls= [] site= 1818 +5817 1 n1-2817.plc1.org sls= [] site= 1819 +5818 1 n1-2818.plc1.org sls= [] site= 1820 +5819 1 n1-2819.plc1.org sls= [] site= 1821 +5820 1 n1-2820.plc1.org sls= [] site= 1822 +5821 1 n1-2821.plc1.org sls= [] site= 1823 +5822 1 n1-2822.plc1.org sls= [] site= 1824 +5823 1 n1-2823.plc1.org sls= [] site= 1825 +5824 1 n1-2824.plc1.org sls= [] site= 1826 +5825 1 n1-2825.plc1.org sls= [] site= 1827 +5826 1 n1-2826.plc1.org sls= [] site= 1828 +5827 1 n1-2827.plc1.org sls= [] site= 1829 +5828 1 n1-2828.plc1.org sls= [] site= 1830 +5829 1 n1-2829.plc1.org sls= [] site= 1831 +5830 1 n1-2830.plc1.org sls= [] site= 1832 +5831 1 n1-2831.plc1.org sls= [] site= 1833 +5832 1 n1-2832.plc1.org sls= [] site= 1834 +5833 1 n1-2833.plc1.org sls= [] site= 1835 +5834 1 n1-2834.plc1.org sls= [] site= 1836 +5835 1 n1-2835.plc1.org sls= [] site= 1837 +5836 1 n1-2836.plc1.org sls= [] site= 1838 +5837 1 n1-2837.plc1.org sls= [] site= 1839 +5838 1 n1-2838.plc1.org sls= [] site= 1840 +5839 1 n1-2839.plc1.org sls= [] site= 1841 +5840 1 n1-2840.plc1.org sls= [] site= 1842 +5841 1 n1-2841.plc1.org sls= [] site= 1843 +5842 1 n1-2842.plc1.org sls= [] site= 1844 +5843 1 n1-2843.plc1.org sls= [] site= 1845 +5844 1 n1-2844.plc1.org sls= [] site= 1846 +5845 1 n1-2845.plc1.org sls= [] site= 1847 +5846 1 n1-2846.plc1.org sls= [] site= 1848 +5847 1 n1-2847.plc1.org sls= [] site= 1849 +5848 1 n1-2848.plc1.org sls= [] site= 1850 +5849 1 n1-2849.plc1.org sls= [] site= 1851 +5850 1 n1-2850.plc1.org sls= [] site= 1852 +5851 1 n1-2851.plc1.org sls= [] site= 1853 +5852 1 n1-2852.plc1.org sls= [] site= 1854 +5853 1 n1-2853.plc1.org sls= [] site= 1855 +5854 1 n1-2854.plc1.org sls= [] site= 1856 +5855 1 n1-2855.plc1.org sls= [] site= 1857 +5856 1 n1-2856.plc1.org sls= [] site= 1858 +5857 1 n1-2857.plc1.org sls= [] site= 1859 +5858 1 n1-2858.plc1.org sls= [] site= 1860 +5859 1 n1-2859.plc1.org sls= [] site= 1861 +5860 1 n1-2860.plc1.org sls= [] site= 1862 +5861 1 n1-2861.plc1.org sls= [] site= 1863 +5862 1 n1-2862.plc1.org sls= [] site= 1864 +5863 1 n1-2863.plc1.org sls= [] site= 1865 +5864 1 n1-2864.plc1.org sls= [] site= 1866 +5865 1 n1-2865.plc1.org sls= [] site= 1867 +5866 1 n1-2866.plc1.org sls= [] site= 1868 +5867 1 n1-2867.plc1.org sls= [] site= 1869 +5868 1 n1-2868.plc1.org sls= [] site= 1870 +5869 1 n1-2869.plc1.org sls= [] site= 1871 +5870 1 n1-2870.plc1.org sls= [] site= 1872 +5871 1 n1-2871.plc1.org sls= [] site= 1873 +5872 1 n1-2872.plc1.org sls= [] site= 1874 +5873 1 n1-2873.plc1.org sls= [] site= 1875 +5874 1 n1-2874.plc1.org sls= [] site= 1876 +5875 1 n1-2875.plc1.org sls= [] site= 1877 +5876 1 n1-2876.plc1.org sls= [] site= 1878 +5877 1 n1-2877.plc1.org sls= [] site= 1879 +5878 1 n1-2878.plc1.org sls= [] site= 1880 +5879 1 n1-2879.plc1.org sls= [] site= 1881 +5880 1 n1-2880.plc1.org sls= [] site= 1882 +5881 1 n1-2881.plc1.org sls= [] site= 1883 +5882 1 n1-2882.plc1.org sls= [] site= 1884 +5883 1 n1-2883.plc1.org sls= [] site= 1885 +5884 1 n1-2884.plc1.org sls= [] site= 1886 +5885 1 n1-2885.plc1.org sls= [] site= 1887 +5886 1 n1-2886.plc1.org sls= [] site= 1888 +5887 1 n1-2887.plc1.org sls= [] site= 1889 +5888 1 n1-2888.plc1.org sls= [] site= 1890 +5889 1 n1-2889.plc1.org sls= [] site= 1891 +5890 1 n1-2890.plc1.org sls= [] site= 1892 +5891 1 n1-2891.plc1.org sls= [] site= 1893 +5892 1 n1-2892.plc1.org sls= [] site= 1894 +5893 1 n1-2893.plc1.org sls= [] site= 1895 +5894 1 n1-2894.plc1.org sls= [] site= 1896 +5895 1 n1-2895.plc1.org sls= [] site= 1897 +5896 1 n1-2896.plc1.org sls= [] site= 1898 +5897 1 n1-2897.plc1.org sls= [] site= 1899 +5898 1 n1-2898.plc1.org sls= [] site= 1900 +5899 1 n1-2899.plc1.org sls= [] site= 1901 +5900 1 n1-2900.plc1.org sls= [] site= 1902 +5901 1 n1-2901.plc1.org sls= [] site= 1903 +5902 1 n1-2902.plc1.org sls= [] site= 1904 +5903 1 n1-2903.plc1.org sls= [] site= 1905 +5904 1 n1-2904.plc1.org sls= [] site= 1906 +5905 1 n1-2905.plc1.org sls= [] site= 1907 +5906 1 n1-2906.plc1.org sls= [] site= 1908 +5907 1 n1-2907.plc1.org sls= [] site= 1909 +5908 1 n1-2908.plc1.org sls= [] site= 1910 +5909 1 n1-2909.plc1.org sls= [] site= 1911 +5910 1 n1-2910.plc1.org sls= [] site= 1912 +5911 1 n1-2911.plc1.org sls= [] site= 1913 +5912 1 n1-2912.plc1.org sls= [] site= 1914 +5913 1 n1-2913.plc1.org sls= [] site= 1915 +5914 1 n1-2914.plc1.org sls= [] site= 1916 +5915 1 n1-2915.plc1.org sls= [] site= 1917 +5916 1 n1-2916.plc1.org sls= [] site= 1918 +5917 1 n1-2917.plc1.org sls= [] site= 1919 +5918 1 n1-2918.plc1.org sls= [] site= 1920 +5919 1 n1-2919.plc1.org sls= [] site= 1921 +5920 1 n1-2920.plc1.org sls= [] site= 1922 +5921 1 n1-2921.plc1.org sls= [] site= 1923 +5922 1 n1-2922.plc1.org sls= [] site= 1924 +5923 1 n1-2923.plc1.org sls= [] site= 1925 +5924 1 n1-2924.plc1.org sls= [] site= 1926 +5925 1 n1-2925.plc1.org sls= [] site= 1927 +5926 1 n1-2926.plc1.org sls= [] site= 1928 +5927 1 n1-2927.plc1.org sls= [] site= 1929 +5928 1 n1-2928.plc1.org sls= [] site= 1930 +5929 1 n1-2929.plc1.org sls= [] site= 1931 +5930 1 n1-2930.plc1.org sls= [] site= 1932 +5931 1 n1-2931.plc1.org sls= [] site= 1933 +5932 1 n1-2932.plc1.org sls= [] site= 1934 +5933 1 n1-2933.plc1.org sls= [] site= 1935 +5934 1 n1-2934.plc1.org sls= [] site= 1936 +5935 1 n1-2935.plc1.org sls= [] site= 1937 +5936 1 n1-2936.plc1.org sls= [] site= 1938 +5937 1 n1-2937.plc1.org sls= [] site= 1939 +5938 1 n1-2938.plc1.org sls= [] site= 1940 +5939 1 n1-2939.plc1.org sls= [] site= 1941 +5940 1 n1-2940.plc1.org sls= [] site= 1942 +5941 1 n1-2941.plc1.org sls= [] site= 1943 +5942 1 n1-2942.plc1.org sls= [] site= 1944 +5943 1 n1-2943.plc1.org sls= [] site= 1945 +5944 1 n1-2944.plc1.org sls= [] site= 1946 +5945 1 n1-2945.plc1.org sls= [] site= 1947 +5946 1 n1-2946.plc1.org sls= [] site= 1948 +5947 1 n1-2947.plc1.org sls= [] site= 1949 +5948 1 n1-2948.plc1.org sls= [] site= 1950 +5949 1 n1-2949.plc1.org sls= [] site= 1951 +5950 1 n1-2950.plc1.org sls= [] site= 1952 +5951 1 n1-2951.plc1.org sls= [] site= 1953 +5952 1 n1-2952.plc1.org sls= [] site= 1954 +5953 1 n1-2953.plc1.org sls= [] site= 1955 +5954 1 n1-2954.plc1.org sls= [] site= 1956 +5955 1 n1-2955.plc1.org sls= [] site= 1957 +5956 1 n1-2956.plc1.org sls= [] site= 1958 +5957 1 n1-2957.plc1.org sls= [] site= 1959 +5958 1 n1-2958.plc1.org sls= [] site= 1960 +5959 1 n1-2959.plc1.org sls= [] site= 1961 +5960 1 n1-2960.plc1.org sls= [] site= 1962 +5961 1 n1-2961.plc1.org sls= [] site= 1963 +5962 1 n1-2962.plc1.org sls= [] site= 1964 +5963 1 n1-2963.plc1.org sls= [] site= 1965 +5964 1 n1-2964.plc1.org sls= [] site= 1966 +5965 1 n1-2965.plc1.org sls= [] site= 1967 +5966 1 n1-2966.plc1.org sls= [] site= 1968 +5967 1 n1-2967.plc1.org sls= [] site= 1969 +5968 1 n1-2968.plc1.org sls= [] site= 1970 +5969 1 n1-2969.plc1.org sls= [] site= 1971 +5970 1 n1-2970.plc1.org sls= [] site= 1972 +5971 1 n1-2971.plc1.org sls= [] site= 1973 +5972 1 n1-2972.plc1.org sls= [] site= 1974 +5973 1 n1-2973.plc1.org sls= [] site= 1975 +5974 1 n1-2974.plc1.org sls= [] site= 1976 +5975 1 n1-2975.plc1.org sls= [] site= 1977 +5976 1 n1-2976.plc1.org sls= [] site= 1978 +5977 1 n1-2977.plc1.org sls= [] site= 1979 +5978 1 n1-2978.plc1.org sls= [] site= 1980 +5979 1 n1-2979.plc1.org sls= [] site= 1981 +5980 1 n1-2980.plc1.org sls= [] site= 1982 +5981 1 n1-2981.plc1.org sls= [] site= 1983 +5982 1 n1-2982.plc1.org sls= [] site= 1984 +5983 1 n1-2983.plc1.org sls= [] site= 1985 +5984 1 n1-2984.plc1.org sls= [] site= 1986 +5985 1 n1-2985.plc1.org sls= [] site= 1987 +5986 1 n1-2986.plc1.org sls= [] site= 1988 +5987 1 n1-2987.plc1.org sls= [] site= 1989 +5988 1 n1-2988.plc1.org sls= [] site= 1990 +5989 1 n1-2989.plc1.org sls= [] site= 1991 +5990 1 n1-2990.plc1.org sls= [] site= 1992 +5991 1 n1-2991.plc1.org sls= [] site= 1993 +5992 1 n1-2992.plc1.org sls= [] site= 1994 +5993 1 n1-2993.plc1.org sls= [] site= 1995 +5994 1 n1-2994.plc1.org sls= [] site= 1996 +5995 1 n1-2995.plc1.org sls= [] site= 1997 +5996 1 n1-2996.plc1.org sls= [] site= 1998 +5997 1 n1-2997.plc1.org sls= [] site= 1999 +5998 1 n1-2998.plc1.org sls= [] site= 2000 +5999 1 n1-2999.plc1.org sls= [] site= 2001 +6000 1 n1-3000.plc1.org sls= [] site= 2002 +02: SLICES +1 None thtwo_netflow nodes= [] persons= [] +--- sas= [1, 2, 3, 4, 5] thtwo_netflow crp= 1 +--- 'expires': 1167126460 +2 1 thone_netflow nodes= [] persons= [] +--- sas= [] thone_netflow crp= 1 +--- 'expires': 1167126457 +3 1 oneb_slice1 nodes= [1, 2, 3, 3001, 3002, 3003] persons= [2008, 2006, 2007] +--- sas= [] oneb_slice1 crp= 1 +--- 'expires': 1167126821 +4 1 onec_slice2 nodes= [2, 3, 4, 3002, 3003, 3004] persons= [2008, 2009, 2007] +--- sas= [] onec_slice2 crp= 1 +--- 'expires': 1167126821 +5 1 oned_slice3 nodes= [3, 4, 5, 3003, 3004, 3005] persons= [2008, 2009, 2010] +--- sas= [] oned_slice3 crp= 1 +--- 'expires': 1167126821 +6 1 onee_slice4 nodes= [4, 5, 6, 3004, 3005, 3006] persons= [2009, 2010, 2011] +--- sas= [] onee_slice4 crp= 1 +--- 'expires': 1167126822 +7 1 onef_slice5 nodes= [5, 6, 7, 3005, 3006, 3007] persons= [2010, 2011, 2012] +--- sas= [] onef_slice5 crp= 1 +--- 'expires': 1167126822 +8 1 oneg_slice6 nodes= [3008, 6, 7, 8, 3006, 3007] persons= [2011, 2012, 2013] +--- sas= [] oneg_slice6 crp= 1 +--- 'expires': 1167126822 +9 1 oneh_slice7 nodes= [3008, 3009, 7, 8, 9, 3007] persons= [2012, 2013, 2014] +--- sas= [] oneh_slice7 crp= 1 +--- 'expires': 1167126822 +10 1 onei_slice8 nodes= [3008, 3009, 3010, 8, 9, 10] persons= [2013, 2014, 2015] +--- sas= [] onei_slice8 crp= 1 +--- 'expires': 1167126822 +11 1 onej_slice9 nodes= [3009, 3010, 3011, 9, 10, 11] persons= [2016, 2014, 2015] +--- sas= [] onej_slice9 crp= 1 +--- 'expires': 1167126823 +12 1 oneba_slice10 nodes= [3010, 3011, 3012, 10, 11, 12] persons= [2016, 2017, 2015] +--- sas= [] oneba_slice10 crp= 1 +--- 'expires': 1167126823 +13 1 onebb_slice11 nodes= [3011, 3012, 3013, 11, 12, 13] persons= [2016, 2017, 2018] +--- sas= [] onebb_slice11 crp= 1 +--- 'expires': 1167126823 +14 1 onebc_slice12 nodes= [3012, 3013, 3014, 12, 13, 14] persons= [2017, 2018, 2019] +--- sas= [] onebc_slice12 crp= 1 +--- 'expires': 1167126823 +15 1 onebd_slice13 nodes= [3013, 3014, 3015, 13, 14, 15] persons= [2018, 2019, 2020] +--- sas= [] onebd_slice13 crp= 1 +--- 'expires': 1167126823 +16 1 onebe_slice14 nodes= [3014, 3015, 3016, 14, 15, 16] persons= [2019, 2020, 2021] +--- sas= [] onebe_slice14 crp= 1 +--- 'expires': 1167126824 +17 1 onebf_slice15 nodes= [3015, 3016, 3017, 15, 16, 17] persons= [2020, 2021, 2022] +--- sas= [] onebf_slice15 crp= 1 +--- 'expires': 1167126824 +18 1 onebg_slice16 nodes= [3016, 3017, 3018, 16, 17, 18] persons= [2021, 2022, 2023] +--- sas= [] onebg_slice16 crp= 1 +--- 'expires': 1167126824 +19 1 onebh_slice17 nodes= [3017, 3018, 3019, 17, 18, 19] persons= [2024, 2022, 2023] +--- sas= [] onebh_slice17 crp= 1 +--- 'expires': 1167126824 +20 1 onebi_slice18 nodes= [3018, 3019, 3020, 18, 19, 20] persons= [2024, 2025, 2023] +--- sas= [] onebi_slice18 crp= 1 +--- 'expires': 1167126824 +21 1 onebj_slice19 nodes= [3019, 3020, 3021, 19, 20, 21] persons= [2024, 2025, 2026] +--- sas= [] onebj_slice19 crp= 1 +--- 'expires': 1167126824 +22 1 oneca_slice20 nodes= [3020, 3021, 3022, 20, 21, 22] persons= [2025, 2026, 2027] +--- sas= [] oneca_slice20 crp= 1 +--- 'expires': 1167126825 +23 1 onecb_slice21 nodes= [3021, 3022, 3023, 21, 22, 23] persons= [2026, 2027, 2028] +--- sas= [] onecb_slice21 crp= 1 +--- 'expires': 1167126825 +24 1 onecc_slice22 nodes= [3022, 3023, 3024, 22, 23, 24] persons= [2027, 2028, 2029] +--- sas= [] onecc_slice22 crp= 1 +--- 'expires': 1167126825 +25 1 onecd_slice23 nodes= [3023, 3024, 3025, 23, 24, 25] persons= [2028, 2029, 2030] +--- sas= [] onecd_slice23 crp= 1 +--- 'expires': 1167126825 +26 1 onece_slice24 nodes= [3024, 3025, 3026, 24, 25, 26] persons= [2029, 2030, 2031] +--- sas= [] onece_slice24 crp= 1 +--- 'expires': 1167126825 +27 1 onecf_slice25 nodes= [3025, 3026, 3027, 25, 26, 27] persons= [2032, 2030, 2031] +--- sas= [] onecf_slice25 crp= 1 +--- 'expires': 1167126826 +28 1 onecg_slice26 nodes= [3026, 3027, 3028, 26, 27, 28] persons= [2032, 2033, 2031] +--- sas= [] onecg_slice26 crp= 1 +--- 'expires': 1167126826 +29 1 onech_slice27 nodes= [3027, 3028, 3029, 27, 28, 29] persons= [2032, 2033, 2034] +--- sas= [] onech_slice27 crp= 1 +--- 'expires': 1167126826 +30 1 oneci_slice28 nodes= [3028, 3029, 3030, 28, 29, 30] persons= [2033, 2034, 2035] +--- sas= [] oneci_slice28 crp= 1 +--- 'expires': 1167126826 +31 1 onecj_slice29 nodes= [3029, 3030, 3031, 29, 30, 31] persons= [2034, 2035, 2036] +--- sas= [] onecj_slice29 crp= 1 +--- 'expires': 1167126826 +32 1 oneda_slice30 nodes= [32, 3030, 3031, 3032, 30, 31] persons= [2035, 2036, 2037] +--- sas= [] oneda_slice30 crp= 1 +--- 'expires': 1167126827 +33 1 onedb_slice31 nodes= [32, 33, 3031, 3032, 3033, 31] persons= [2036, 2037, 2038] +--- sas= [] onedb_slice31 crp= 1 +--- 'expires': 1167126827 +34 1 onedc_slice32 nodes= [32, 33, 34, 3032, 3033, 3034] persons= [2037, 2038, 2039] +--- sas= [] onedc_slice32 crp= 1 +--- 'expires': 1167126827 +35 1 onedd_slice33 nodes= [33, 34, 35, 3033, 3034, 3035] persons= [2040, 2038, 2039] +--- sas= [] onedd_slice33 crp= 1 +--- 'expires': 1167126827 +36 1 onede_slice34 nodes= [34, 35, 36, 3034, 3035, 3036] persons= [2040, 2041, 2039] +--- sas= [] onede_slice34 crp= 1 +--- 'expires': 1167126827 +37 1 onedf_slice35 nodes= [35, 36, 37, 3035, 3036, 3037] persons= [2040, 2041, 2042] +--- sas= [] onedf_slice35 crp= 1 +--- 'expires': 1167126828 +38 1 onedg_slice36 nodes= [36, 37, 38, 3036, 3037, 3038] persons= [2041, 2042, 2043] +--- sas= [] onedg_slice36 crp= 1 +--- 'expires': 1167126828 +39 1 onedh_slice37 nodes= [37, 38, 39, 3037, 3038, 3039] persons= [2042, 2043, 2044] +--- sas= [] onedh_slice37 crp= 1 +--- 'expires': 1167126828 +40 1 onedi_slice38 nodes= [3040, 38, 39, 40, 3038, 3039] persons= [2043, 2044, 2045] +--- sas= [] onedi_slice38 crp= 1 +--- 'expires': 1167126828 +41 1 onedj_slice39 nodes= [3040, 3041, 39, 40, 41, 3039] persons= [2044, 2045, 2046] +--- sas= [] onedj_slice39 crp= 1 +--- 'expires': 1167126828 +42 1 oneea_slice40 nodes= [3040, 3041, 3042, 40, 41, 42] persons= [2045, 2046, 2047] +--- sas= [] oneea_slice40 crp= 1 +--- 'expires': 1167126828 +43 1 oneeb_slice41 nodes= [3041, 3042, 3043, 41, 42, 43] persons= [2048, 2046, 2047] +--- sas= [] oneeb_slice41 crp= 1 +--- 'expires': 1167126829 +44 1 oneec_slice42 nodes= [3042, 3043, 3044, 42, 43, 44] persons= [2048, 2049, 2047] +--- sas= [] oneec_slice42 crp= 1 +--- 'expires': 1167126829 +45 1 oneed_slice43 nodes= [3043, 3044, 3045, 43, 44, 45] persons= [2048, 2049, 2050] +--- sas= [] oneed_slice43 crp= 1 +--- 'expires': 1167126829 +46 1 oneee_slice44 nodes= [3044, 3045, 3046, 44, 45, 46] persons= [2049, 2050, 2051] +--- sas= [] oneee_slice44 crp= 1 +--- 'expires': 1167126829 +47 1 oneef_slice45 nodes= [3045, 3046, 3047, 45, 46, 47] persons= [2050, 2051, 2052] +--- sas= [] oneef_slice45 crp= 1 +--- 'expires': 1167126829 +48 1 oneeg_slice46 nodes= [3046, 3047, 3048, 46, 47, 48] persons= [2051, 2052, 2053] +--- sas= [] oneeg_slice46 crp= 1 +--- 'expires': 1167126830 +49 1 oneeh_slice47 nodes= [3047, 3048, 3049, 47, 48, 49] persons= [2052, 2053, 2054] +--- sas= [] oneeh_slice47 crp= 1 +--- 'expires': 1167126830 +50 1 oneei_slice48 nodes= [3048, 3049, 3050, 48, 49, 50] persons= [2053, 2054, 2055] +--- sas= [] oneei_slice48 crp= 1 +--- 'expires': 1167126830 +51 1 oneej_slice49 nodes= [3049, 3050, 3051, 49, 50, 51] persons= [2056, 2054, 2055] +--- sas= [] oneej_slice49 crp= 1 +--- 'expires': 1167126830 +52 1 onefa_slice50 nodes= [3050, 3051, 3052, 50, 51, 52] persons= [2056, 2057, 2055] +--- sas= [] onefa_slice50 crp= 1 +--- 'expires': 1167126830 +53 1 onefb_slice51 nodes= [3051, 3052, 3053, 51, 52, 53] persons= [2056, 2057, 2058] +--- sas= [] onefb_slice51 crp= 1 +--- 'expires': 1167126831 +54 1 onefc_slice52 nodes= [3052, 3053, 3054, 52, 53, 54] persons= [2057, 2058, 2059] +--- sas= [] onefc_slice52 crp= 1 +--- 'expires': 1167126831 +55 1 onefd_slice53 nodes= [3053, 3054, 3055, 53, 54, 55] persons= [2058, 2059, 2060] +--- sas= [] onefd_slice53 crp= 1 +--- 'expires': 1167126831 +56 1 onefe_slice54 nodes= [3054, 3055, 3056, 54, 55, 56] persons= [2059, 2060, 2061] +--- sas= [] onefe_slice54 crp= 1 +--- 'expires': 1167126831 +57 1 oneff_slice55 nodes= [3055, 3056, 3057, 55, 56, 57] persons= [2060, 2061, 2062] +--- sas= [] oneff_slice55 crp= 1 +--- 'expires': 1167126831 +58 1 onefg_slice56 nodes= [3056, 3057, 3058, 56, 57, 58] persons= [2061, 2062, 2063] +--- sas= [] onefg_slice56 crp= 1 +--- 'expires': 1167126832 +59 1 onefh_slice57 nodes= [3057, 3058, 3059, 57, 58, 59] persons= [2064, 2062, 2063] +--- sas= [] onefh_slice57 crp= 1 +--- 'expires': 1167126832 +60 1 onefi_slice58 nodes= [3058, 3059, 3060, 58, 59, 60] persons= [2064, 2065, 2063] +--- sas= [] onefi_slice58 crp= 1 +--- 'expires': 1167126832 +61 1 onefj_slice59 nodes= [3059, 3060, 3061, 59, 60, 61] persons= [2064, 2065, 2066] +--- sas= [] onefj_slice59 crp= 1 +--- 'expires': 1167126832 +62 1 onega_slice60 nodes= [3060, 3061, 3062, 60, 61, 62] persons= [2065, 2066, 2067] +--- sas= [] onega_slice60 crp= 1 +--- 'expires': 1167126832 +63 1 onegb_slice61 nodes= [3061, 3062, 3063, 61, 62, 63] persons= [2066, 2067, 2068] +--- sas= [] onegb_slice61 crp= 1 +--- 'expires': 1167126833 +64 1 onegc_slice62 nodes= [64, 3062, 3063, 3064, 62, 63] persons= [2067, 2068, 2069] +--- sas= [] onegc_slice62 crp= 1 +--- 'expires': 1167126833 +65 1 onegd_slice63 nodes= [64, 65, 3063, 3064, 3065, 63] persons= [2068, 2069, 2070] +--- sas= [] onegd_slice63 crp= 1 +--- 'expires': 1167126833 +66 1 onege_slice64 nodes= [64, 65, 66, 3064, 3065, 3066] persons= [2069, 2070, 2071] +--- sas= [] onege_slice64 crp= 1 +--- 'expires': 1167126833 +67 1 onegf_slice65 nodes= [65, 66, 67, 3065, 3066, 3067] persons= [2072, 2070, 2071] +--- sas= [] onegf_slice65 crp= 1 +--- 'expires': 1167126833 +68 1 onegg_slice66 nodes= [66, 67, 68, 3066, 3067, 3068] persons= [2072, 2073, 2071] +--- sas= [] onegg_slice66 crp= 1 +--- 'expires': 1167126834 +69 1 onegh_slice67 nodes= [67, 68, 69, 3067, 3068, 3069] persons= [2072, 2073, 2074] +--- sas= [] onegh_slice67 crp= 1 +--- 'expires': 1167126834 +70 1 onegi_slice68 nodes= [68, 69, 70, 3068, 3069, 3070] persons= [2073, 2074, 2075] +--- sas= [] onegi_slice68 crp= 1 +--- 'expires': 1167126834 +71 1 onegj_slice69 nodes= [69, 70, 71, 3069, 3070, 3071] persons= [2074, 2075, 2076] +--- sas= [] onegj_slice69 crp= 1 +--- 'expires': 1167126834 +72 1 oneha_slice70 nodes= [3072, 70, 71, 72, 3070, 3071] persons= [2075, 2076, 2077] +--- sas= [] oneha_slice70 crp= 1 +--- 'expires': 1167126834 +73 1 onehb_slice71 nodes= [3072, 3073, 71, 72, 73, 3071] persons= [2076, 2077, 2078] +--- sas= [] onehb_slice71 crp= 1 +--- 'expires': 1167126835 +74 1 onehc_slice72 nodes= [3072, 3073, 3074, 72, 73, 74] persons= [2077, 2078, 2079] +--- sas= [] onehc_slice72 crp= 1 +--- 'expires': 1167126835 +75 1 onehd_slice73 nodes= [3073, 3074, 3075, 73, 74, 75] persons= [2080, 2078, 2079] +--- sas= [] onehd_slice73 crp= 1 +--- 'expires': 1167126835 +76 1 onehe_slice74 nodes= [3074, 3075, 3076, 74, 75, 76] persons= [2080, 2081, 2079] +--- sas= [] onehe_slice74 crp= 1 +--- 'expires': 1167126835 +77 1 onehf_slice75 nodes= [3075, 3076, 3077, 75, 76, 77] persons= [2080, 2081, 2082] +--- sas= [] onehf_slice75 crp= 1 +--- 'expires': 1167126835 +78 1 onehg_slice76 nodes= [3076, 3077, 3078, 76, 77, 78] persons= [2081, 2082, 2083] +--- sas= [] onehg_slice76 crp= 1 +--- 'expires': 1167126836 +79 1 onehh_slice77 nodes= [3077, 3078, 3079, 77, 78, 79] persons= [2082, 2083, 2084] +--- sas= [] onehh_slice77 crp= 1 +--- 'expires': 1167126836 +80 1 onehi_slice78 nodes= [3078, 3079, 3080, 78, 79, 80] persons= [2083, 2084, 2085] +--- sas= [] onehi_slice78 crp= 1 +--- 'expires': 1167126836 +81 1 onehj_slice79 nodes= [3079, 3080, 3081, 79, 80, 81] persons= [2084, 2085, 2086] +--- sas= [] onehj_slice79 crp= 1 +--- 'expires': 1167126836 +82 1 oneia_slice80 nodes= [3080, 3081, 3082, 80, 81, 82] persons= [2085, 2086, 2087] +--- sas= [] oneia_slice80 crp= 1 +--- 'expires': 1167126836 +83 1 oneib_slice81 nodes= [3081, 3082, 3083, 81, 82, 83] persons= [2088, 2086, 2087] +--- sas= [] oneib_slice81 crp= 1 +--- 'expires': 1167126836 +84 1 oneic_slice82 nodes= [3082, 3083, 3084, 82, 83, 84] persons= [2088, 2089, 2087] +--- sas= [] oneic_slice82 crp= 1 +--- 'expires': 1167126837 +85 1 oneid_slice83 nodes= [3083, 3084, 3085, 83, 84, 85] persons= [2088, 2089, 2090] +--- sas= [] oneid_slice83 crp= 1 +--- 'expires': 1167126837 +86 1 oneie_slice84 nodes= [3084, 3085, 3086, 84, 85, 86] persons= [2089, 2090, 2091] +--- sas= [] oneie_slice84 crp= 1 +--- 'expires': 1167126837 +87 1 oneif_slice85 nodes= [3085, 3086, 3087, 85, 86, 87] persons= [2090, 2091, 2092] +--- sas= [] oneif_slice85 crp= 1 +--- 'expires': 1167126837 +88 1 oneig_slice86 nodes= [3086, 3087, 3088, 86, 87, 88] persons= [2091, 2092, 2093] +--- sas= [] oneig_slice86 crp= 1 +--- 'expires': 1167126837 +89 1 oneih_slice87 nodes= [3087, 3088, 3089, 87, 88, 89] persons= [2092, 2093, 2094] +--- sas= [] oneih_slice87 crp= 1 +--- 'expires': 1167126838 +90 1 oneii_slice88 nodes= [3088, 3089, 3090, 88, 89, 90] persons= [2093, 2094, 2095] +--- sas= [] oneii_slice88 crp= 1 +--- 'expires': 1167126838 +91 1 oneij_slice89 nodes= [3089, 3090, 3091, 89, 90, 91] persons= [2096, 2094, 2095] +--- sas= [] oneij_slice89 crp= 1 +--- 'expires': 1167126838 +92 1 oneja_slice90 nodes= [3090, 3091, 3092, 90, 91, 92] persons= [2096, 2097, 2095] +--- sas= [] oneja_slice90 crp= 1 +--- 'expires': 1167126838 +93 1 onejb_slice91 nodes= [3091, 3092, 3093, 91, 92, 93] persons= [2096, 2097, 2098] +--- sas= [] onejb_slice91 crp= 1 +--- 'expires': 1167126838 +94 1 onejc_slice92 nodes= [3092, 3093, 3094, 92, 93, 94] persons= [2097, 2098, 2099] +--- sas= [] onejc_slice92 crp= 1 +--- 'expires': 1167126839 +95 1 onejd_slice93 nodes= [3093, 3094, 3095, 93, 94, 95] persons= [2098, 2099, 2100] +--- sas= [] onejd_slice93 crp= 1 +--- 'expires': 1167126839 +96 1 oneje_slice94 nodes= [96, 3094, 3095, 3096, 94, 95] persons= [2099, 2100, 2101] +--- sas= [] oneje_slice94 crp= 1 +--- 'expires': 1167126839 +97 1 onejf_slice95 nodes= [96, 97, 3095, 3096, 3097, 95] persons= [2100, 2101, 2102] +--- sas= [] onejf_slice95 crp= 1 +--- 'expires': 1167126839 +98 1 onejg_slice96 nodes= [96, 97, 98, 3096, 3097, 3098] persons= [2101, 2102, 2103] +--- sas= [] onejg_slice96 crp= 1 +--- 'expires': 1167126839 +99 1 onejh_slice97 nodes= [97, 98, 99, 3097, 3098, 3099] persons= [2104, 2102, 2103] +--- sas= [] onejh_slice97 crp= 1 +--- 'expires': 1167126840 +100 1 oneji_slice98 nodes= [98, 99, 100, 3098, 3099, 3100] persons= [2104, 2105, 2103] +--- sas= [] oneji_slice98 crp= 1 +--- 'expires': 1167126840 +101 1 onejj_slice99 nodes= [99, 100, 101, 3099, 3100, 3101] persons= [2104, 2105, 2106] +--- sas= [] onejj_slice99 crp= 1 +--- 'expires': 1167126840 +102 1 onebaa_slice100 nodes= [100, 101, 102, 3100, 3101, 3102] persons= [2105, 2106, 2107] +--- sas= [] onebaa_slice100 crp= 1 +--- 'expires': 1167126840 +103 1 onebab_slice101 nodes= [101, 102, 103, 3101, 3102, 3103] persons= [2106, 2107, 2108] +--- sas= [] onebab_slice101 crp= 1 +--- 'expires': 1167126840 +104 1 onebac_slice102 nodes= [3104, 102, 103, 104, 3102, 3103] persons= [2107, 2108, 2109] +--- sas= [] onebac_slice102 crp= 1 +--- 'expires': 1167126841 +105 1 onebad_slice103 nodes= [3104, 3105, 103, 104, 105, 3103] persons= [2108, 2109, 2110] +--- sas= [] onebad_slice103 crp= 1 +--- 'expires': 1167126841 +106 1 onebae_slice104 nodes= [3104, 3105, 3106, 104, 105, 106] persons= [2109, 2110, 2111] +--- sas= [] onebae_slice104 crp= 1 +--- 'expires': 1167126841 +107 1 onebaf_slice105 nodes= [3105, 3106, 3107, 105, 106, 107] persons= [2112, 2110, 2111] +--- sas= [] onebaf_slice105 crp= 1 +--- 'expires': 1167126841 +108 1 onebag_slice106 nodes= [3106, 3107, 3108, 106, 107, 108] persons= [2112, 2113, 2111] +--- sas= [] onebag_slice106 crp= 1 +--- 'expires': 1167126841 +109 1 onebah_slice107 nodes= [3107, 3108, 3109, 107, 108, 109] persons= [2112, 2113, 2114] +--- sas= [] onebah_slice107 crp= 1 +--- 'expires': 1167126842 +110 1 onebai_slice108 nodes= [3108, 3109, 3110, 108, 109, 110] persons= [2113, 2114, 2115] +--- sas= [] onebai_slice108 crp= 1 +--- 'expires': 1167126842 +111 1 onebaj_slice109 nodes= [3109, 3110, 3111, 109, 110, 111] persons= [2114, 2115, 2116] +--- sas= [] onebaj_slice109 crp= 1 +--- 'expires': 1167126842 +112 1 onebba_slice110 nodes= [3110, 3111, 3112, 110, 111, 112] persons= [2115, 2116, 2117] +--- sas= [] onebba_slice110 crp= 1 +--- 'expires': 1167126842 +113 1 onebbb_slice111 nodes= [3111, 3112, 3113, 111, 112, 113] persons= [2116, 2117, 2118] +--- sas= [] onebbb_slice111 crp= 1 +--- 'expires': 1167126842 +114 1 onebbc_slice112 nodes= [3112, 3113, 3114, 112, 113, 114] persons= [2117, 2118, 2119] +--- sas= [] onebbc_slice112 crp= 1 +--- 'expires': 1167126843 +115 1 onebbd_slice113 nodes= [3113, 3114, 3115, 113, 114, 115] persons= [2120, 2118, 2119] +--- sas= [] onebbd_slice113 crp= 1 +--- 'expires': 1167126843 +116 1 onebbe_slice114 nodes= [3114, 3115, 3116, 114, 115, 116] persons= [2120, 2121, 2119] +--- sas= [] onebbe_slice114 crp= 1 +--- 'expires': 1167126843 +117 1 onebbf_slice115 nodes= [3115, 3116, 3117, 115, 116, 117] persons= [2120, 2121, 2122] +--- sas= [] onebbf_slice115 crp= 1 +--- 'expires': 1167126843 +118 1 onebbg_slice116 nodes= [3116, 3117, 3118, 116, 117, 118] persons= [2121, 2122, 2123] +--- sas= [] onebbg_slice116 crp= 1 +--- 'expires': 1167126843 +119 1 onebbh_slice117 nodes= [3117, 3118, 3119, 117, 118, 119] persons= [2122, 2123, 2124] +--- sas= [] onebbh_slice117 crp= 1 +--- 'expires': 1167126844 +120 1 onebbi_slice118 nodes= [3118, 3119, 3120, 118, 119, 120] persons= [2123, 2124, 2125] +--- sas= [] onebbi_slice118 crp= 1 +--- 'expires': 1167126844 +121 1 onebbj_slice119 nodes= [3119, 3120, 3121, 119, 120, 121] persons= [2124, 2125, 2126] +--- sas= [] onebbj_slice119 crp= 1 +--- 'expires': 1167126844 +122 1 onebca_slice120 nodes= [3120, 3121, 3122, 120, 121, 122] persons= [2125, 2126, 2127] +--- sas= [] onebca_slice120 crp= 1 +--- 'expires': 1167126844 +123 1 onebcb_slice121 nodes= [3121, 3122, 3123, 121, 122, 123] persons= [2128, 2126, 2127] +--- sas= [] onebcb_slice121 crp= 1 +--- 'expires': 1167126844 +124 1 onebcc_slice122 nodes= [3122, 3123, 3124, 122, 123, 124] persons= [2128, 2129, 2127] +--- sas= [] onebcc_slice122 crp= 1 +--- 'expires': 1167126845 +125 1 onebcd_slice123 nodes= [3123, 3124, 3125, 123, 124, 125] persons= [2128, 2129, 2130] +--- sas= [] onebcd_slice123 crp= 1 +--- 'expires': 1167126845 +126 1 onebce_slice124 nodes= [3124, 3125, 3126, 124, 125, 126] persons= [2129, 2130, 2131] +--- sas= [] onebce_slice124 crp= 1 +--- 'expires': 1167126845 +127 1 onebcf_slice125 nodes= [3125, 3126, 3127, 125, 126, 127] persons= [2130, 2131, 2132] +--- sas= [] onebcf_slice125 crp= 1 +--- 'expires': 1167126845 +128 1 onebcg_slice126 nodes= [128, 3126, 3127, 3128, 126, 127] persons= [2131, 2132, 2133] +--- sas= [] onebcg_slice126 crp= 1 +--- 'expires': 1167126846 +129 1 onebch_slice127 nodes= [128, 129, 3127, 3128, 3129, 127] persons= [2132, 2133, 2134] +--- sas= [] onebch_slice127 crp= 1 +--- 'expires': 1167126846 +130 1 onebci_slice128 nodes= [128, 129, 130, 3128, 3129, 3130] persons= [2133, 2134, 2135] +--- sas= [] onebci_slice128 crp= 1 +--- 'expires': 1167126846 +131 1 onebcj_slice129 nodes= [129, 130, 131, 3129, 3130, 3131] persons= [2136, 2134, 2135] +--- sas= [] onebcj_slice129 crp= 1 +--- 'expires': 1167126846 +132 1 onebda_slice130 nodes= [130, 131, 132, 3130, 3131, 3132] persons= [2136, 2137, 2135] +--- sas= [] onebda_slice130 crp= 1 +--- 'expires': 1167126846 +133 1 onebdb_slice131 nodes= [131, 132, 133, 3131, 3132, 3133] persons= [2136, 2137, 2138] +--- sas= [] onebdb_slice131 crp= 1 +--- 'expires': 1167126847 +134 1 onebdc_slice132 nodes= [132, 133, 134, 3132, 3133, 3134] persons= [2137, 2138, 2139] +--- sas= [] onebdc_slice132 crp= 1 +--- 'expires': 1167126847 +135 1 onebdd_slice133 nodes= [133, 134, 135, 3133, 3134, 3135] persons= [2138, 2139, 2140] +--- sas= [] onebdd_slice133 crp= 1 +--- 'expires': 1167126847 +136 1 onebde_slice134 nodes= [3136, 134, 135, 136, 3134, 3135] persons= [2139, 2140, 2141] +--- sas= [] onebde_slice134 crp= 1 +--- 'expires': 1167126847 +137 1 onebdf_slice135 nodes= [3136, 3137, 135, 136, 137, 3135] persons= [2140, 2141, 2142] +--- sas= [] onebdf_slice135 crp= 1 +--- 'expires': 1167126847 +138 1 onebdg_slice136 nodes= [3136, 3137, 3138, 136, 137, 138] persons= [2141, 2142, 2143] +--- sas= [] onebdg_slice136 crp= 1 +--- 'expires': 1167126848 +139 1 onebdh_slice137 nodes= [3137, 3138, 3139, 137, 138, 139] persons= [2144, 2142, 2143] +--- sas= [] onebdh_slice137 crp= 1 +--- 'expires': 1167126848 +140 1 onebdi_slice138 nodes= [3138, 3139, 3140, 138, 139, 140] persons= [2144, 2145, 2143] +--- sas= [] onebdi_slice138 crp= 1 +--- 'expires': 1167126848 +141 1 onebdj_slice139 nodes= [3139, 3140, 3141, 139, 140, 141] persons= [2144, 2145, 2146] +--- sas= [] onebdj_slice139 crp= 1 +--- 'expires': 1167126848 +142 1 onebea_slice140 nodes= [3140, 3141, 3142, 140, 141, 142] persons= [2145, 2146, 2147] +--- sas= [] onebea_slice140 crp= 1 +--- 'expires': 1167126848 +143 1 onebeb_slice141 nodes= [3141, 3142, 3143, 141, 142, 143] persons= [2146, 2147, 2148] +--- sas= [] onebeb_slice141 crp= 1 +--- 'expires': 1167126849 +144 1 onebec_slice142 nodes= [3142, 3143, 3144, 142, 143, 144] persons= [2147, 2148, 2149] +--- sas= [] onebec_slice142 crp= 1 +--- 'expires': 1167126849 +145 1 onebed_slice143 nodes= [3143, 3144, 3145, 143, 144, 145] persons= [2148, 2149, 2150] +--- sas= [] onebed_slice143 crp= 1 +--- 'expires': 1167126849 +146 1 onebee_slice144 nodes= [3144, 3145, 3146, 144, 145, 146] persons= [2149, 2150, 2151] +--- sas= [] onebee_slice144 crp= 1 +--- 'expires': 1167126849 +147 1 onebef_slice145 nodes= [3145, 3146, 3147, 145, 146, 147] persons= [2152, 2150, 2151] +--- sas= [] onebef_slice145 crp= 1 +--- 'expires': 1167126849 +148 1 onebeg_slice146 nodes= [3146, 3147, 3148, 146, 147, 148] persons= [2152, 2153, 2151] +--- sas= [] onebeg_slice146 crp= 1 +--- 'expires': 1167126850 +149 1 onebeh_slice147 nodes= [3147, 3148, 3149, 147, 148, 149] persons= [2152, 2153, 2154] +--- sas= [] onebeh_slice147 crp= 1 +--- 'expires': 1167126850 +150 1 onebei_slice148 nodes= [3148, 3149, 3150, 148, 149, 150] persons= [2153, 2154, 2155] +--- sas= [] onebei_slice148 crp= 1 +--- 'expires': 1167126850 +151 1 onebej_slice149 nodes= [3149, 3150, 3151, 149, 150, 151] persons= [2154, 2155, 2156] +--- sas= [] onebej_slice149 crp= 1 +--- 'expires': 1167126850 +152 1 onebfa_slice150 nodes= [3150, 3151, 3152, 150, 151, 152] persons= [2155, 2156, 2157] +--- sas= [] onebfa_slice150 crp= 1 +--- 'expires': 1167126850 +153 1 onebfb_slice151 nodes= [3151, 3152, 3153, 151, 152, 153] persons= [2156, 2157, 2158] +--- sas= [] onebfb_slice151 crp= 1 +--- 'expires': 1167126851 +154 1 onebfc_slice152 nodes= [3152, 3153, 3154, 152, 153, 154] persons= [2157, 2158, 2159] +--- sas= [] onebfc_slice152 crp= 1 +--- 'expires': 1167126851 +155 1 onebfd_slice153 nodes= [3153, 3154, 3155, 153, 154, 155] persons= [2160, 2158, 2159] +--- sas= [] onebfd_slice153 crp= 1 +--- 'expires': 1167126851 +156 1 onebfe_slice154 nodes= [3154, 3155, 3156, 154, 155, 156] persons= [2160, 2161, 2159] +--- sas= [] onebfe_slice154 crp= 1 +--- 'expires': 1167126851 +157 1 onebff_slice155 nodes= [3155, 3156, 3157, 155, 156, 157] persons= [2160, 2161, 2162] +--- sas= [] onebff_slice155 crp= 1 +--- 'expires': 1167126852 +158 1 onebfg_slice156 nodes= [3156, 3157, 3158, 156, 157, 158] persons= [2161, 2162, 2163] +--- sas= [] onebfg_slice156 crp= 1 +--- 'expires': 1167126852 +159 1 onebfh_slice157 nodes= [3157, 3158, 3159, 157, 158, 159] persons= [2162, 2163, 2164] +--- sas= [] onebfh_slice157 crp= 1 +--- 'expires': 1167126852 +160 1 onebfi_slice158 nodes= [160, 3158, 3159, 3160, 158, 159] persons= [2163, 2164, 2165] +--- sas= [] onebfi_slice158 crp= 1 +--- 'expires': 1167126852 +161 1 onebfj_slice159 nodes= [160, 161, 3159, 3160, 3161, 159] persons= [2164, 2165, 2166] +--- sas= [] onebfj_slice159 crp= 1 +--- 'expires': 1167126852 +162 1 onebga_slice160 nodes= [160, 161, 162, 3160, 3161, 3162] persons= [2165, 2166, 2167] +--- sas= [] onebga_slice160 crp= 1 +--- 'expires': 1167126853 +163 1 onebgb_slice161 nodes= [161, 162, 163, 3161, 3162, 3163] persons= [2168, 2166, 2167] +--- sas= [] onebgb_slice161 crp= 1 +--- 'expires': 1167126853 +164 1 onebgc_slice162 nodes= [162, 163, 164, 3162, 3163, 3164] persons= [2168, 2169, 2167] +--- sas= [] onebgc_slice162 crp= 1 +--- 'expires': 1167126853 +165 1 onebgd_slice163 nodes= [163, 164, 165, 3163, 3164, 3165] persons= [2168, 2169, 2170] +--- sas= [] onebgd_slice163 crp= 1 +--- 'expires': 1167126853 +166 1 onebge_slice164 nodes= [164, 165, 166, 3164, 3165, 3166] persons= [2169, 2170, 2171] +--- sas= [] onebge_slice164 crp= 1 +--- 'expires': 1167126853 +167 1 onebgf_slice165 nodes= [165, 166, 167, 3165, 3166, 3167] persons= [2170, 2171, 2172] +--- sas= [] onebgf_slice165 crp= 1 +--- 'expires': 1167126854 +168 1 onebgg_slice166 nodes= [3168, 166, 167, 168, 3166, 3167] persons= [2171, 2172, 2173] +--- sas= [] onebgg_slice166 crp= 1 +--- 'expires': 1167126854 +169 1 onebgh_slice167 nodes= [3168, 3169, 167, 168, 169, 3167] persons= [2172, 2173, 2174] +--- sas= [] onebgh_slice167 crp= 1 +--- 'expires': 1167126854 +170 1 onebgi_slice168 nodes= [3168, 3169, 3170, 168, 169, 170] persons= [2173, 2174, 2175] +--- sas= [] onebgi_slice168 crp= 1 +--- 'expires': 1167126854 +171 1 onebgj_slice169 nodes= [3169, 3170, 3171, 169, 170, 171] persons= [2176, 2174, 2175] +--- sas= [] onebgj_slice169 crp= 1 +--- 'expires': 1167126854 +172 1 onebha_slice170 nodes= [3170, 3171, 3172, 170, 171, 172] persons= [2176, 2177, 2175] +--- sas= [] onebha_slice170 crp= 1 +--- 'expires': 1167126855 +173 1 onebhb_slice171 nodes= [3171, 3172, 3173, 171, 172, 173] persons= [2176, 2177, 2178] +--- sas= [] onebhb_slice171 crp= 1 +--- 'expires': 1167126855 +174 1 onebhc_slice172 nodes= [3172, 3173, 3174, 172, 173, 174] persons= [2177, 2178, 2179] +--- sas= [] onebhc_slice172 crp= 1 +--- 'expires': 1167126855 +175 1 onebhd_slice173 nodes= [3173, 3174, 3175, 173, 174, 175] persons= [2178, 2179, 2180] +--- sas= [] onebhd_slice173 crp= 1 +--- 'expires': 1167126855 +176 1 onebhe_slice174 nodes= [3174, 3175, 3176, 174, 175, 176] persons= [2179, 2180, 2181] +--- sas= [] onebhe_slice174 crp= 1 +--- 'expires': 1167126856 +177 1 onebhf_slice175 nodes= [3175, 3176, 3177, 175, 176, 177] persons= [2180, 2181, 2182] +--- sas= [] onebhf_slice175 crp= 1 +--- 'expires': 1167126856 +178 1 onebhg_slice176 nodes= [3176, 3177, 3178, 176, 177, 178] persons= [2181, 2182, 2183] +--- sas= [] onebhg_slice176 crp= 1 +--- 'expires': 1167126856 +179 1 onebhh_slice177 nodes= [3177, 3178, 3179, 177, 178, 179] persons= [2184, 2182, 2183] +--- sas= [] onebhh_slice177 crp= 1 +--- 'expires': 1167126856 +180 1 onebhi_slice178 nodes= [3178, 3179, 3180, 178, 179, 180] persons= [2184, 2185, 2183] +--- sas= [] onebhi_slice178 crp= 1 +--- 'expires': 1167126856 +181 1 onebhj_slice179 nodes= [3179, 3180, 3181, 179, 180, 181] persons= [2184, 2185, 2186] +--- sas= [] onebhj_slice179 crp= 1 +--- 'expires': 1167126857 +182 1 onebia_slice180 nodes= [3180, 3181, 3182, 180, 181, 182] persons= [2185, 2186, 2187] +--- sas= [] onebia_slice180 crp= 1 +--- 'expires': 1167126857 +183 1 onebib_slice181 nodes= [3181, 3182, 3183, 181, 182, 183] persons= [2186, 2187, 2188] +--- sas= [] onebib_slice181 crp= 1 +--- 'expires': 1167126857 +184 1 onebic_slice182 nodes= [3182, 3183, 3184, 182, 183, 184] persons= [2187, 2188, 2189] +--- sas= [] onebic_slice182 crp= 1 +--- 'expires': 1167126857 +185 1 onebid_slice183 nodes= [3183, 3184, 3185, 183, 184, 185] persons= [2188, 2189, 2190] +--- sas= [] onebid_slice183 crp= 1 +--- 'expires': 1167126857 +186 1 onebie_slice184 nodes= [3184, 3185, 3186, 184, 185, 186] persons= [2189, 2190, 2191] +--- sas= [] onebie_slice184 crp= 1 +--- 'expires': 1167126858 +187 1 onebif_slice185 nodes= [3185, 3186, 3187, 185, 186, 187] persons= [2192, 2190, 2191] +--- sas= [] onebif_slice185 crp= 1 +--- 'expires': 1167126858 +188 1 onebig_slice186 nodes= [3186, 3187, 3188, 186, 187, 188] persons= [2192, 2193, 2191] +--- sas= [] onebig_slice186 crp= 1 +--- 'expires': 1167126858 +189 1 onebih_slice187 nodes= [3187, 3188, 3189, 187, 188, 189] persons= [2192, 2193, 2194] +--- sas= [] onebih_slice187 crp= 1 +--- 'expires': 1167126858 +190 1 onebii_slice188 nodes= [3188, 3189, 3190, 188, 189, 190] persons= [2193, 2194, 2195] +--- sas= [] onebii_slice188 crp= 1 +--- 'expires': 1167126859 +191 1 onebij_slice189 nodes= [3189, 3190, 3191, 189, 190, 191] persons= [2194, 2195, 2196] +--- sas= [] onebij_slice189 crp= 1 +--- 'expires': 1167126859 +192 1 onebja_slice190 nodes= [192, 3190, 3191, 3192, 190, 191] persons= [2195, 2196, 2197] +--- sas= [] onebja_slice190 crp= 1 +--- 'expires': 1167126859 +193 1 onebjb_slice191 nodes= [192, 193, 3191, 3192, 3193, 191] persons= [2196, 2197, 2198] +--- sas= [] onebjb_slice191 crp= 1 +--- 'expires': 1167126859 +194 1 onebjc_slice192 nodes= [192, 193, 194, 3192, 3193, 3194] persons= [2197, 2198, 2199] +--- sas= [] onebjc_slice192 crp= 1 +--- 'expires': 1167126859 +195 1 onebjd_slice193 nodes= [193, 194, 195, 3193, 3194, 3195] persons= [2200, 2198, 2199] +--- sas= [] onebjd_slice193 crp= 1 +--- 'expires': 1167126860 +196 1 onebje_slice194 nodes= [194, 195, 196, 3194, 3195, 3196] persons= [2200, 2201, 2199] +--- sas= [] onebje_slice194 crp= 1 +--- 'expires': 1167126860 +197 1 onebjf_slice195 nodes= [195, 196, 197, 3195, 3196, 3197] persons= [2200, 2201, 2202] +--- sas= [] onebjf_slice195 crp= 1 +--- 'expires': 1167126860 +198 1 onebjg_slice196 nodes= [196, 197, 198, 3196, 3197, 3198] persons= [2201, 2202, 2203] +--- sas= [] onebjg_slice196 crp= 1 +--- 'expires': 1167126860 +199 1 onebjh_slice197 nodes= [197, 198, 199, 3197, 3198, 3199] persons= [2202, 2203, 2204] +--- sas= [] onebjh_slice197 crp= 1 +--- 'expires': 1167126860 +200 1 onebji_slice198 nodes= [3200, 198, 199, 200, 3198, 3199] persons= [2203, 2204, 2205] +--- sas= [] onebji_slice198 crp= 1 +--- 'expires': 1167126861 +201 1 onebjj_slice199 nodes= [3200, 3201, 199, 200, 201, 3199] persons= [2204, 2205, 2206] +--- sas= [] onebjj_slice199 crp= 1 +--- 'expires': 1167126861 +202 1 onecaa_slice200 nodes= [3200, 3201, 3202, 200, 201, 202] persons= [2205, 2206, 2207] +--- sas= [] onecaa_slice200 crp= 1 +--- 'expires': 1167126861 +203 1 onecab_slice201 nodes= [3201, 3202, 3203, 201, 202, 203] persons= [2208, 2206, 2207] +--- sas= [] onecab_slice201 crp= 1 +--- 'expires': 1167126861 +204 1 onecac_slice202 nodes= [3202, 3203, 3204, 202, 203, 204] persons= [2208, 2209, 2207] +--- sas= [] onecac_slice202 crp= 1 +--- 'expires': 1167126862 +205 1 onecad_slice203 nodes= [3203, 3204, 3205, 203, 204, 205] persons= [2208, 2209, 2210] +--- sas= [] onecad_slice203 crp= 1 +--- 'expires': 1167126862 +206 1 onecae_slice204 nodes= [3204, 3205, 3206, 204, 205, 206] persons= [2209, 2210, 2211] +--- sas= [] onecae_slice204 crp= 1 +--- 'expires': 1167126862 +207 1 onecaf_slice205 nodes= [3205, 3206, 3207, 205, 206, 207] persons= [2210, 2211, 2212] +--- sas= [] onecaf_slice205 crp= 1 +--- 'expires': 1167126862 +208 1 onecag_slice206 nodes= [3206, 3207, 3208, 206, 207, 208] persons= [2211, 2212, 2213] +--- sas= [] onecag_slice206 crp= 1 +--- 'expires': 1167126862 +209 1 onecah_slice207 nodes= [3207, 3208, 3209, 207, 208, 209] persons= [2212, 2213, 2214] +--- sas= [] onecah_slice207 crp= 1 +--- 'expires': 1167126863 +210 1 onecai_slice208 nodes= [3208, 3209, 3210, 208, 209, 210] persons= [2213, 2214, 2215] +--- sas= [] onecai_slice208 crp= 1 +--- 'expires': 1167126863 +211 1 onecaj_slice209 nodes= [3209, 3210, 3211, 209, 210, 211] persons= [2216, 2214, 2215] +--- sas= [] onecaj_slice209 crp= 1 +--- 'expires': 1167126863 +212 1 onecba_slice210 nodes= [3210, 3211, 3212, 210, 211, 212] persons= [2216, 2217, 2215] +--- sas= [] onecba_slice210 crp= 1 +--- 'expires': 1167126863 +213 1 onecbb_slice211 nodes= [3211, 3212, 3213, 211, 212, 213] persons= [2216, 2217, 2218] +--- sas= [] onecbb_slice211 crp= 1 +--- 'expires': 1167126863 +214 1 onecbc_slice212 nodes= [3212, 3213, 3214, 212, 213, 214] persons= [2217, 2218, 2219] +--- sas= [] onecbc_slice212 crp= 1 +--- 'expires': 1167126864 +215 1 onecbd_slice213 nodes= [3213, 3214, 3215, 213, 214, 215] persons= [2218, 2219, 2220] +--- sas= [] onecbd_slice213 crp= 1 +--- 'expires': 1167126864 +216 1 onecbe_slice214 nodes= [3214, 3215, 3216, 214, 215, 216] persons= [2219, 2220, 2221] +--- sas= [] onecbe_slice214 crp= 1 +--- 'expires': 1167126864 +217 1 onecbf_slice215 nodes= [3215, 3216, 3217, 215, 216, 217] persons= [2220, 2221, 2222] +--- sas= [] onecbf_slice215 crp= 1 +--- 'expires': 1167126864 +218 1 onecbg_slice216 nodes= [3216, 3217, 3218, 216, 217, 218] persons= [2221, 2222, 2223] +--- sas= [] onecbg_slice216 crp= 1 +--- 'expires': 1167126865 +219 1 onecbh_slice217 nodes= [3217, 3218, 3219, 217, 218, 219] persons= [2224, 2222, 2223] +--- sas= [] onecbh_slice217 crp= 1 +--- 'expires': 1167126865 +220 1 onecbi_slice218 nodes= [3218, 3219, 3220, 218, 219, 220] persons= [2224, 2225, 2223] +--- sas= [] onecbi_slice218 crp= 1 +--- 'expires': 1167126865 +221 1 onecbj_slice219 nodes= [3219, 3220, 3221, 219, 220, 221] persons= [2224, 2225, 2226] +--- sas= [] onecbj_slice219 crp= 1 +--- 'expires': 1167126865 +222 1 onecca_slice220 nodes= [3220, 3221, 3222, 220, 221, 222] persons= [2225, 2226, 2227] +--- sas= [] onecca_slice220 crp= 1 +--- 'expires': 1167126865 +223 1 oneccb_slice221 nodes= [3221, 3222, 3223, 221, 222, 223] persons= [2226, 2227, 2228] +--- sas= [] oneccb_slice221 crp= 1 +--- 'expires': 1167126866 +224 1 oneccc_slice222 nodes= [224, 3222, 3223, 3224, 222, 223] persons= [2227, 2228, 2229] +--- sas= [] oneccc_slice222 crp= 1 +--- 'expires': 1167126866 +225 1 oneccd_slice223 nodes= [224, 225, 3223, 3224, 3225, 223] persons= [2228, 2229, 2230] +--- sas= [] oneccd_slice223 crp= 1 +--- 'expires': 1167126866 +226 1 onecce_slice224 nodes= [224, 225, 226, 3224, 3225, 3226] persons= [2229, 2230, 2231] +--- sas= [] onecce_slice224 crp= 1 +--- 'expires': 1167126866 +227 1 oneccf_slice225 nodes= [225, 226, 227, 3225, 3226, 3227] persons= [2232, 2230, 2231] +--- sas= [] oneccf_slice225 crp= 1 +--- 'expires': 1167126867 +228 1 oneccg_slice226 nodes= [226, 227, 228, 3226, 3227, 3228] persons= [2232, 2233, 2231] +--- sas= [] oneccg_slice226 crp= 1 +--- 'expires': 1167126867 +229 1 onecch_slice227 nodes= [227, 228, 229, 3227, 3228, 3229] persons= [2232, 2233, 2234] +--- sas= [] onecch_slice227 crp= 1 +--- 'expires': 1167126867 +230 1 onecci_slice228 nodes= [228, 229, 230, 3228, 3229, 3230] persons= [2233, 2234, 2235] +--- sas= [] onecci_slice228 crp= 1 +--- 'expires': 1167126867 +231 1 oneccj_slice229 nodes= [229, 230, 231, 3229, 3230, 3231] persons= [2234, 2235, 2236] +--- sas= [] oneccj_slice229 crp= 1 +--- 'expires': 1167126867 +232 1 onecda_slice230 nodes= [3232, 230, 231, 232, 3230, 3231] persons= [2235, 2236, 2237] +--- sas= [] onecda_slice230 crp= 1 +--- 'expires': 1167126868 +233 1 onecdb_slice231 nodes= [3232, 3233, 231, 232, 233, 3231] persons= [2236, 2237, 2238] +--- sas= [] onecdb_slice231 crp= 1 +--- 'expires': 1167126868 +234 1 onecdc_slice232 nodes= [3232, 3233, 3234, 232, 233, 234] persons= [2237, 2238, 2239] +--- sas= [] onecdc_slice232 crp= 1 +--- 'expires': 1167126868 +235 1 onecdd_slice233 nodes= [3233, 3234, 3235, 233, 234, 235] persons= [2240, 2238, 2239] +--- sas= [] onecdd_slice233 crp= 1 +--- 'expires': 1167126868 +236 1 onecde_slice234 nodes= [3234, 3235, 3236, 234, 235, 236] persons= [2240, 2241, 2239] +--- sas= [] onecde_slice234 crp= 1 +--- 'expires': 1167126869 +237 1 onecdf_slice235 nodes= [3235, 3236, 3237, 235, 236, 237] persons= [2240, 2241, 2242] +--- sas= [] onecdf_slice235 crp= 1 +--- 'expires': 1167126869 +238 1 onecdg_slice236 nodes= [3236, 3237, 3238, 236, 237, 238] persons= [2241, 2242, 2243] +--- sas= [] onecdg_slice236 crp= 1 +--- 'expires': 1167126869 +239 1 onecdh_slice237 nodes= [3237, 3238, 3239, 237, 238, 239] persons= [2242, 2243, 2244] +--- sas= [] onecdh_slice237 crp= 1 +--- 'expires': 1167126869 +240 1 onecdi_slice238 nodes= [3238, 3239, 3240, 238, 239, 240] persons= [2243, 2244, 2245] +--- sas= [] onecdi_slice238 crp= 1 +--- 'expires': 1167126869 +241 1 onecdj_slice239 nodes= [3239, 3240, 3241, 239, 240, 241] persons= [2244, 2245, 2246] +--- sas= [] onecdj_slice239 crp= 1 +--- 'expires': 1167126870 +242 1 onecea_slice240 nodes= [3240, 3241, 3242, 240, 241, 242] persons= [2245, 2246, 2247] +--- sas= [] onecea_slice240 crp= 1 +--- 'expires': 1167126870 +243 1 oneceb_slice241 nodes= [3241, 3242, 3243, 241, 242, 243] persons= [2248, 2246, 2247] +--- sas= [] oneceb_slice241 crp= 1 +--- 'expires': 1167126870 +244 1 onecec_slice242 nodes= [3242, 3243, 3244, 242, 243, 244] persons= [2248, 2249, 2247] +--- sas= [] onecec_slice242 crp= 1 +--- 'expires': 1167126870 +245 1 oneced_slice243 nodes= [3243, 3244, 3245, 243, 244, 245] persons= [2248, 2249, 2250] +--- sas= [] oneced_slice243 crp= 1 +--- 'expires': 1167126871 +246 1 onecee_slice244 nodes= [3244, 3245, 3246, 244, 245, 246] persons= [2249, 2250, 2251] +--- sas= [] onecee_slice244 crp= 1 +--- 'expires': 1167126871 +247 1 onecef_slice245 nodes= [3245, 3246, 3247, 245, 246, 247] persons= [2250, 2251, 2252] +--- sas= [] onecef_slice245 crp= 1 +--- 'expires': 1167126871 +248 1 oneceg_slice246 nodes= [3246, 3247, 3248, 246, 247, 248] persons= [2251, 2252, 2253] +--- sas= [] oneceg_slice246 crp= 1 +--- 'expires': 1167126871 +249 1 oneceh_slice247 nodes= [3247, 3248, 3249, 247, 248, 249] persons= [2252, 2253, 2254] +--- sas= [] oneceh_slice247 crp= 1 +--- 'expires': 1167126871 +250 1 onecei_slice248 nodes= [3248, 3249, 3250, 248, 249, 250] persons= [2253, 2254, 2255] +--- sas= [] onecei_slice248 crp= 1 +--- 'expires': 1167126872 +251 1 onecej_slice249 nodes= [3249, 3250, 3251, 249, 250, 251] persons= [2256, 2254, 2255] +--- sas= [] onecej_slice249 crp= 1 +--- 'expires': 1167126872 +252 1 onecfa_slice250 nodes= [3250, 3251, 3252, 250, 251, 252] persons= [2256, 2257, 2255] +--- sas= [] onecfa_slice250 crp= 1 +--- 'expires': 1167126872 +253 1 onecfb_slice251 nodes= [3251, 3252, 3253, 251, 252, 253] persons= [2256, 2257, 2258] +--- sas= [] onecfb_slice251 crp= 1 +--- 'expires': 1167126872 +254 1 onecfc_slice252 nodes= [3252, 3253, 3254, 252, 253, 254] persons= [2257, 2258, 2259] +--- sas= [] onecfc_slice252 crp= 1 +--- 'expires': 1167126873 +255 1 onecfd_slice253 nodes= [3253, 3254, 3255, 253, 254, 255] persons= [2258, 2259, 2260] +--- sas= [] onecfd_slice253 crp= 1 +--- 'expires': 1167126873 +256 1 onecfe_slice254 nodes= [256, 3254, 3255, 3256, 254, 255] persons= [2259, 2260, 2261] +--- sas= [] onecfe_slice254 crp= 1 +--- 'expires': 1167126873 +257 1 onecff_slice255 nodes= [256, 257, 3255, 3256, 3257, 255] persons= [2260, 2261, 2262] +--- sas= [] onecff_slice255 crp= 1 +--- 'expires': 1167126873 +258 1 onecfg_slice256 nodes= [256, 257, 258, 3256, 3257, 3258] persons= [2261, 2262, 2263] +--- sas= [] onecfg_slice256 crp= 1 +--- 'expires': 1167126873 +259 1 onecfh_slice257 nodes= [257, 258, 259, 3257, 3258, 3259] persons= [2264, 2262, 2263] +--- sas= [] onecfh_slice257 crp= 1 +--- 'expires': 1167126874 +260 1 onecfi_slice258 nodes= [258, 259, 260, 3258, 3259, 3260] persons= [2264, 2265, 2263] +--- sas= [] onecfi_slice258 crp= 1 +--- 'expires': 1167126874 +261 1 onecfj_slice259 nodes= [259, 260, 261, 3259, 3260, 3261] persons= [2264, 2265, 2266] +--- sas= [] onecfj_slice259 crp= 1 +--- 'expires': 1167126874 +262 1 onecga_slice260 nodes= [260, 261, 262, 3260, 3261, 3262] persons= [2265, 2266, 2267] +--- sas= [] onecga_slice260 crp= 1 +--- 'expires': 1167126874 +263 1 onecgb_slice261 nodes= [261, 262, 263, 3261, 3262, 3263] persons= [2266, 2267, 2268] +--- sas= [] onecgb_slice261 crp= 1 +--- 'expires': 1167126875 +264 1 onecgc_slice262 nodes= [3264, 262, 263, 264, 3262, 3263] persons= [2267, 2268, 2269] +--- sas= [] onecgc_slice262 crp= 1 +--- 'expires': 1167126875 +265 1 onecgd_slice263 nodes= [3264, 3265, 263, 264, 265, 3263] persons= [2268, 2269, 2270] +--- sas= [] onecgd_slice263 crp= 1 +--- 'expires': 1167126875 +266 1 onecge_slice264 nodes= [3264, 3265, 3266, 264, 265, 266] persons= [2269, 2270, 2271] +--- sas= [] onecge_slice264 crp= 1 +--- 'expires': 1167126875 +267 1 onecgf_slice265 nodes= [3265, 3266, 3267, 265, 266, 267] persons= [2272, 2270, 2271] +--- sas= [] onecgf_slice265 crp= 1 +--- 'expires': 1167126875 +268 1 onecgg_slice266 nodes= [3266, 3267, 3268, 266, 267, 268] persons= [2272, 2273, 2271] +--- sas= [] onecgg_slice266 crp= 1 +--- 'expires': 1167126876 +269 1 onecgh_slice267 nodes= [3267, 3268, 3269, 267, 268, 269] persons= [2272, 2273, 2274] +--- sas= [] onecgh_slice267 crp= 1 +--- 'expires': 1167126876 +270 1 onecgi_slice268 nodes= [3268, 3269, 3270, 268, 269, 270] persons= [2273, 2274, 2275] +--- sas= [] onecgi_slice268 crp= 1 +--- 'expires': 1167126876 +271 1 onecgj_slice269 nodes= [3269, 3270, 3271, 269, 270, 271] persons= [2274, 2275, 2276] +--- sas= [] onecgj_slice269 crp= 1 +--- 'expires': 1167126876 +272 1 onecha_slice270 nodes= [3270, 3271, 3272, 270, 271, 272] persons= [2275, 2276, 2277] +--- sas= [] onecha_slice270 crp= 1 +--- 'expires': 1167126877 +273 1 onechb_slice271 nodes= [3271, 3272, 3273, 271, 272, 273] persons= [2276, 2277, 2278] +--- sas= [] onechb_slice271 crp= 1 +--- 'expires': 1167126877 +274 1 onechc_slice272 nodes= [3272, 3273, 3274, 272, 273, 274] persons= [2277, 2278, 2279] +--- sas= [] onechc_slice272 crp= 1 +--- 'expires': 1167126877 +275 1 onechd_slice273 nodes= [3273, 3274, 3275, 273, 274, 275] persons= [2280, 2278, 2279] +--- sas= [] onechd_slice273 crp= 1 +--- 'expires': 1167126877 +276 1 oneche_slice274 nodes= [3274, 3275, 3276, 274, 275, 276] persons= [2280, 2281, 2279] +--- sas= [] oneche_slice274 crp= 1 +--- 'expires': 1167126878 +277 1 onechf_slice275 nodes= [3275, 3276, 3277, 275, 276, 277] persons= [2280, 2281, 2282] +--- sas= [] onechf_slice275 crp= 1 +--- 'expires': 1167126878 +278 1 onechg_slice276 nodes= [3276, 3277, 3278, 276, 277, 278] persons= [2281, 2282, 2283] +--- sas= [] onechg_slice276 crp= 1 +--- 'expires': 1167126878 +279 1 onechh_slice277 nodes= [3277, 3278, 3279, 277, 278, 279] persons= [2282, 2283, 2284] +--- sas= [] onechh_slice277 crp= 1 +--- 'expires': 1167126878 +280 1 onechi_slice278 nodes= [3278, 3279, 3280, 278, 279, 280] persons= [2283, 2284, 2285] +--- sas= [] onechi_slice278 crp= 1 +--- 'expires': 1167126878 +281 1 onechj_slice279 nodes= [3279, 3280, 3281, 279, 280, 281] persons= [2284, 2285, 2286] +--- sas= [] onechj_slice279 crp= 1 +--- 'expires': 1167126879 +282 1 onecia_slice280 nodes= [3280, 3281, 3282, 280, 281, 282] persons= [2285, 2286, 2287] +--- sas= [] onecia_slice280 crp= 1 +--- 'expires': 1167126879 +283 1 onecib_slice281 nodes= [3281, 3282, 3283, 281, 282, 283] persons= [2288, 2286, 2287] +--- sas= [] onecib_slice281 crp= 1 +--- 'expires': 1167126879 +284 1 onecic_slice282 nodes= [3282, 3283, 3284, 282, 283, 284] persons= [2288, 2289, 2287] +--- sas= [] onecic_slice282 crp= 1 +--- 'expires': 1167126879 +285 1 onecid_slice283 nodes= [3283, 3284, 3285, 283, 284, 285] persons= [2288, 2289, 2290] +--- sas= [] onecid_slice283 crp= 1 +--- 'expires': 1167126880 +286 1 onecie_slice284 nodes= [3284, 3285, 3286, 284, 285, 286] persons= [2289, 2290, 2291] +--- sas= [] onecie_slice284 crp= 1 +--- 'expires': 1167126880 +287 1 onecif_slice285 nodes= [3285, 3286, 3287, 285, 286, 287] persons= [2290, 2291, 2292] +--- sas= [] onecif_slice285 crp= 1 +--- 'expires': 1167126880 +288 1 onecig_slice286 nodes= [288, 3286, 3287, 3288, 286, 287] persons= [2291, 2292, 2293] +--- sas= [] onecig_slice286 crp= 1 +--- 'expires': 1167126880 +289 1 onecih_slice287 nodes= [288, 289, 3287, 3288, 3289, 287] persons= [2292, 2293, 2294] +--- sas= [] onecih_slice287 crp= 1 +--- 'expires': 1167126880 +290 1 onecii_slice288 nodes= [288, 289, 290, 3288, 3289, 3290] persons= [2293, 2294, 2295] +--- sas= [] onecii_slice288 crp= 1 +--- 'expires': 1167126881 +291 1 onecij_slice289 nodes= [289, 290, 291, 3289, 3290, 3291] persons= [2296, 2294, 2295] +--- sas= [] onecij_slice289 crp= 1 +--- 'expires': 1167126881 +292 1 onecja_slice290 nodes= [290, 291, 292, 3290, 3291, 3292] persons= [2296, 2297, 2295] +--- sas= [] onecja_slice290 crp= 1 +--- 'expires': 1167126881 +293 1 onecjb_slice291 nodes= [291, 292, 293, 3291, 3292, 3293] persons= [2296, 2297, 2298] +--- sas= [] onecjb_slice291 crp= 1 +--- 'expires': 1167126881 +294 1 onecjc_slice292 nodes= [292, 293, 294, 3292, 3293, 3294] persons= [2297, 2298, 2299] +--- sas= [] onecjc_slice292 crp= 1 +--- 'expires': 1167126882 +295 1 onecjd_slice293 nodes= [293, 294, 295, 3293, 3294, 3295] persons= [2298, 2299, 2300] +--- sas= [] onecjd_slice293 crp= 1 +--- 'expires': 1167126882 +296 1 onecje_slice294 nodes= [3296, 294, 295, 296, 3294, 3295] persons= [2299, 2300, 2301] +--- sas= [] onecje_slice294 crp= 1 +--- 'expires': 1167126882 +297 1 onecjf_slice295 nodes= [3296, 3297, 295, 296, 297, 3295] persons= [2300, 2301, 2302] +--- sas= [] onecjf_slice295 crp= 1 +--- 'expires': 1167126882 +298 1 onecjg_slice296 nodes= [3296, 3297, 3298, 296, 297, 298] persons= [2301, 2302, 2303] +--- sas= [] onecjg_slice296 crp= 1 +--- 'expires': 1167126883 +299 1 onecjh_slice297 nodes= [3297, 3298, 3299, 297, 298, 299] persons= [2304, 2302, 2303] +--- sas= [] onecjh_slice297 crp= 1 +--- 'expires': 1167126883 +300 1 onecji_slice298 nodes= [3298, 3299, 3300, 298, 299, 300] persons= [2304, 2305, 2303] +--- sas= [] onecji_slice298 crp= 1 +--- 'expires': 1167126883 +301 1 onecjj_slice299 nodes= [3299, 3300, 3301, 299, 300, 301] persons= [2304, 2305, 2306] +--- sas= [] onecjj_slice299 crp= 1 +--- 'expires': 1167126883 +302 1 onedaa_slice300 nodes= [3300, 3301, 3302, 300, 301, 302] persons= [2305, 2306, 2307] +--- sas= [] onedaa_slice300 crp= 1 +--- 'expires': 1167126883 +303 1 onedab_slice301 nodes= [3301, 3302, 3303, 301, 302, 303] persons= [2306, 2307, 2308] +--- sas= [] onedab_slice301 crp= 1 +--- 'expires': 1167126884 +304 1 onedac_slice302 nodes= [3302, 3303, 3304, 302, 303, 304] persons= [2307, 2308, 2309] +--- sas= [] onedac_slice302 crp= 1 +--- 'expires': 1167126884 +305 1 onedad_slice303 nodes= [3303, 3304, 3305, 303, 304, 305] persons= [2308, 2309, 2310] +--- sas= [] onedad_slice303 crp= 1 +--- 'expires': 1167126884 +306 1 onedae_slice304 nodes= [3304, 3305, 3306, 304, 305, 306] persons= [2309, 2310, 2311] +--- sas= [] onedae_slice304 crp= 1 +--- 'expires': 1167126884 +307 1 onedaf_slice305 nodes= [3305, 3306, 3307, 305, 306, 307] persons= [2312, 2310, 2311] +--- sas= [] onedaf_slice305 crp= 1 +--- 'expires': 1167126885 +308 1 onedag_slice306 nodes= [3306, 3307, 3308, 306, 307, 308] persons= [2312, 2313, 2311] +--- sas= [] onedag_slice306 crp= 1 +--- 'expires': 1167126885 +309 1 onedah_slice307 nodes= [3307, 3308, 3309, 307, 308, 309] persons= [2312, 2313, 2314] +--- sas= [] onedah_slice307 crp= 1 +--- 'expires': 1167126885 +310 1 onedai_slice308 nodes= [3308, 3309, 3310, 308, 309, 310] persons= [2313, 2314, 2315] +--- sas= [] onedai_slice308 crp= 1 +--- 'expires': 1167126885 +311 1 onedaj_slice309 nodes= [3309, 3310, 3311, 309, 310, 311] persons= [2314, 2315, 2316] +--- sas= [] onedaj_slice309 crp= 1 +--- 'expires': 1167126886 +312 1 onedba_slice310 nodes= [3310, 3311, 3312, 310, 311, 312] persons= [2315, 2316, 2317] +--- sas= [] onedba_slice310 crp= 1 +--- 'expires': 1167126886 +313 1 onedbb_slice311 nodes= [3311, 3312, 3313, 311, 312, 313] persons= [2316, 2317, 2318] +--- sas= [] onedbb_slice311 crp= 1 +--- 'expires': 1167126886 +314 1 onedbc_slice312 nodes= [3312, 3313, 3314, 312, 313, 314] persons= [2317, 2318, 2319] +--- sas= [] onedbc_slice312 crp= 1 +--- 'expires': 1167126886 +315 1 onedbd_slice313 nodes= [3313, 3314, 3315, 313, 314, 315] persons= [2320, 2318, 2319] +--- sas= [] onedbd_slice313 crp= 1 +--- 'expires': 1167126887 +316 1 onedbe_slice314 nodes= [3314, 3315, 3316, 314, 315, 316] persons= [2320, 2321, 2319] +--- sas= [] onedbe_slice314 crp= 1 +--- 'expires': 1167126887 +317 1 onedbf_slice315 nodes= [3315, 3316, 3317, 315, 316, 317] persons= [2320, 2321, 2322] +--- sas= [] onedbf_slice315 crp= 1 +--- 'expires': 1167126887 +318 1 onedbg_slice316 nodes= [3316, 3317, 3318, 316, 317, 318] persons= [2321, 2322, 2323] +--- sas= [] onedbg_slice316 crp= 1 +--- 'expires': 1167126887 +319 1 onedbh_slice317 nodes= [3317, 3318, 3319, 317, 318, 319] persons= [2322, 2323, 2324] +--- sas= [] onedbh_slice317 crp= 1 +--- 'expires': 1167126887 +320 1 onedbi_slice318 nodes= [320, 3318, 3319, 3320, 318, 319] persons= [2323, 2324, 2325] +--- sas= [] onedbi_slice318 crp= 1 +--- 'expires': 1167126888 +321 1 onedbj_slice319 nodes= [320, 321, 3319, 3320, 3321, 319] persons= [2324, 2325, 2326] +--- sas= [] onedbj_slice319 crp= 1 +--- 'expires': 1167126888 +322 1 onedca_slice320 nodes= [320, 321, 322, 3320, 3321, 3322] persons= [2325, 2326, 2327] +--- sas= [] onedca_slice320 crp= 1 +--- 'expires': 1167126888 +323 1 onedcb_slice321 nodes= [321, 322, 323, 3321, 3322, 3323] persons= [2328, 2326, 2327] +--- sas= [] onedcb_slice321 crp= 1 +--- 'expires': 1167126888 +324 1 onedcc_slice322 nodes= [322, 323, 324, 3322, 3323, 3324] persons= [2328, 2329, 2327] +--- sas= [] onedcc_slice322 crp= 1 +--- 'expires': 1167126889 +325 1 onedcd_slice323 nodes= [323, 324, 325, 3323, 3324, 3325] persons= [2328, 2329, 2330] +--- sas= [] onedcd_slice323 crp= 1 +--- 'expires': 1167126889 +326 1 onedce_slice324 nodes= [324, 325, 326, 3324, 3325, 3326] persons= [2329, 2330, 2331] +--- sas= [] onedce_slice324 crp= 1 +--- 'expires': 1167126889 +327 1 onedcf_slice325 nodes= [325, 326, 327, 3325, 3326, 3327] persons= [2330, 2331, 2332] +--- sas= [] onedcf_slice325 crp= 1 +--- 'expires': 1167126889 +328 1 onedcg_slice326 nodes= [3328, 326, 327, 328, 3326, 3327] persons= [2331, 2332, 2333] +--- sas= [] onedcg_slice326 crp= 1 +--- 'expires': 1167126890 +329 1 onedch_slice327 nodes= [3328, 3329, 327, 328, 329, 3327] persons= [2332, 2333, 2334] +--- sas= [] onedch_slice327 crp= 1 +--- 'expires': 1167126890 +330 1 onedci_slice328 nodes= [3328, 3329, 3330, 328, 329, 330] persons= [2333, 2334, 2335] +--- sas= [] onedci_slice328 crp= 1 +--- 'expires': 1167126890 +331 1 onedcj_slice329 nodes= [3329, 3330, 3331, 329, 330, 331] persons= [2336, 2334, 2335] +--- sas= [] onedcj_slice329 crp= 1 +--- 'expires': 1167126890 +332 1 onedda_slice330 nodes= [3330, 3331, 3332, 330, 331, 332] persons= [2336, 2337, 2335] +--- sas= [] onedda_slice330 crp= 1 +--- 'expires': 1167126891 +333 1 oneddb_slice331 nodes= [3331, 3332, 3333, 331, 332, 333] persons= [2336, 2337, 2338] +--- sas= [] oneddb_slice331 crp= 1 +--- 'expires': 1167126891 +334 1 oneddc_slice332 nodes= [3332, 3333, 3334, 332, 333, 334] persons= [2337, 2338, 2339] +--- sas= [] oneddc_slice332 crp= 1 +--- 'expires': 1167126891 +335 1 oneddd_slice333 nodes= [3333, 3334, 3335, 333, 334, 335] persons= [2338, 2339, 2340] +--- sas= [] oneddd_slice333 crp= 1 +--- 'expires': 1167126891 +336 1 onedde_slice334 nodes= [3334, 3335, 3336, 334, 335, 336] persons= [2339, 2340, 2341] +--- sas= [] onedde_slice334 crp= 1 +--- 'expires': 1167126891 +337 1 oneddf_slice335 nodes= [3335, 3336, 3337, 335, 336, 337] persons= [2340, 2341, 2342] +--- sas= [] oneddf_slice335 crp= 1 +--- 'expires': 1167126892 +338 1 oneddg_slice336 nodes= [3336, 3337, 3338, 336, 337, 338] persons= [2341, 2342, 2343] +--- sas= [] oneddg_slice336 crp= 1 +--- 'expires': 1167126892 +339 1 oneddh_slice337 nodes= [3337, 3338, 3339, 337, 338, 339] persons= [2344, 2342, 2343] +--- sas= [] oneddh_slice337 crp= 1 +--- 'expires': 1167126892 +340 1 oneddi_slice338 nodes= [3338, 3339, 3340, 338, 339, 340] persons= [2344, 2345, 2343] +--- sas= [] oneddi_slice338 crp= 1 +--- 'expires': 1167126892 +341 1 oneddj_slice339 nodes= [3339, 3340, 3341, 339, 340, 341] persons= [2344, 2345, 2346] +--- sas= [] oneddj_slice339 crp= 1 +--- 'expires': 1167126893 +342 1 onedea_slice340 nodes= [3340, 3341, 3342, 340, 341, 342] persons= [2345, 2346, 2347] +--- sas= [] onedea_slice340 crp= 1 +--- 'expires': 1167126893 +343 1 onedeb_slice341 nodes= [3341, 3342, 3343, 341, 342, 343] persons= [2346, 2347, 2348] +--- sas= [] onedeb_slice341 crp= 1 +--- 'expires': 1167126893 +344 1 onedec_slice342 nodes= [3342, 3343, 3344, 342, 343, 344] persons= [2347, 2348, 2349] +--- sas= [] onedec_slice342 crp= 1 +--- 'expires': 1167126893 +345 1 oneded_slice343 nodes= [3343, 3344, 3345, 343, 344, 345] persons= [2348, 2349, 2350] +--- sas= [] oneded_slice343 crp= 1 +--- 'expires': 1167126894 +346 1 onedee_slice344 nodes= [3344, 3345, 3346, 344, 345, 346] persons= [2349, 2350, 2351] +--- sas= [] onedee_slice344 crp= 1 +--- 'expires': 1167126894 +347 1 onedef_slice345 nodes= [3345, 3346, 3347, 345, 346, 347] persons= [2352, 2350, 2351] +--- sas= [] onedef_slice345 crp= 1 +--- 'expires': 1167126894 +348 1 onedeg_slice346 nodes= [3346, 3347, 3348, 346, 347, 348] persons= [2352, 2353, 2351] +--- sas= [] onedeg_slice346 crp= 1 +--- 'expires': 1167126894 +349 1 onedeh_slice347 nodes= [3347, 3348, 3349, 347, 348, 349] persons= [2352, 2353, 2354] +--- sas= [] onedeh_slice347 crp= 1 +--- 'expires': 1167126895 +350 1 onedei_slice348 nodes= [3348, 3349, 3350, 348, 349, 350] persons= [2353, 2354, 2355] +--- sas= [] onedei_slice348 crp= 1 +--- 'expires': 1167126895 +351 1 onedej_slice349 nodes= [3349, 3350, 3351, 349, 350, 351] persons= [2354, 2355, 2356] +--- sas= [] onedej_slice349 crp= 1 +--- 'expires': 1167126895 +352 1 onedfa_slice350 nodes= [352, 3350, 3351, 3352, 350, 351] persons= [2355, 2356, 2357] +--- sas= [] onedfa_slice350 crp= 1 +--- 'expires': 1167126895 +353 1 onedfb_slice351 nodes= [352, 353, 3351, 3352, 3353, 351] persons= [2356, 2357, 2358] +--- sas= [] onedfb_slice351 crp= 1 +--- 'expires': 1167126896 +354 1 onedfc_slice352 nodes= [352, 353, 354, 3352, 3353, 3354] persons= [2357, 2358, 2359] +--- sas= [] onedfc_slice352 crp= 1 +--- 'expires': 1167126896 +355 1 onedfd_slice353 nodes= [353, 354, 355, 3353, 3354, 3355] persons= [2360, 2358, 2359] +--- sas= [] onedfd_slice353 crp= 1 +--- 'expires': 1167126896 +356 1 onedfe_slice354 nodes= [354, 355, 356, 3354, 3355, 3356] persons= [2360, 2361, 2359] +--- sas= [] onedfe_slice354 crp= 1 +--- 'expires': 1167126896 +357 1 onedff_slice355 nodes= [355, 356, 357, 3355, 3356, 3357] persons= [2360, 2361, 2362] +--- sas= [] onedff_slice355 crp= 1 +--- 'expires': 1167126896 +358 1 onedfg_slice356 nodes= [356, 357, 358, 3356, 3357, 3358] persons= [2361, 2362, 2363] +--- sas= [] onedfg_slice356 crp= 1 +--- 'expires': 1167126897 +359 1 onedfh_slice357 nodes= [357, 358, 359, 3357, 3358, 3359] persons= [2362, 2363, 2364] +--- sas= [] onedfh_slice357 crp= 1 +--- 'expires': 1167126897 +360 1 onedfi_slice358 nodes= [3360, 358, 359, 360, 3358, 3359] persons= [2363, 2364, 2365] +--- sas= [] onedfi_slice358 crp= 1 +--- 'expires': 1167126897 +361 1 onedfj_slice359 nodes= [3360, 3361, 359, 360, 361, 3359] persons= [2364, 2365, 2366] +--- sas= [] onedfj_slice359 crp= 1 +--- 'expires': 1167126897 +362 1 onedga_slice360 nodes= [3360, 3361, 3362, 360, 361, 362] persons= [2365, 2366, 2367] +--- sas= [] onedga_slice360 crp= 1 +--- 'expires': 1167126898 +363 1 onedgb_slice361 nodes= [3361, 3362, 3363, 361, 362, 363] persons= [2368, 2366, 2367] +--- sas= [] onedgb_slice361 crp= 1 +--- 'expires': 1167126898 +364 1 onedgc_slice362 nodes= [3362, 3363, 3364, 362, 363, 364] persons= [2368, 2369, 2367] +--- sas= [] onedgc_slice362 crp= 1 +--- 'expires': 1167126898 +365 1 onedgd_slice363 nodes= [3363, 3364, 3365, 363, 364, 365] persons= [2368, 2369, 2370] +--- sas= [] onedgd_slice363 crp= 1 +--- 'expires': 1167126898 +366 1 onedge_slice364 nodes= [3364, 3365, 3366, 364, 365, 366] persons= [2369, 2370, 2371] +--- sas= [] onedge_slice364 crp= 1 +--- 'expires': 1167126899 +367 1 onedgf_slice365 nodes= [3365, 3366, 3367, 365, 366, 367] persons= [2370, 2371, 2372] +--- sas= [] onedgf_slice365 crp= 1 +--- 'expires': 1167126899 +368 1 onedgg_slice366 nodes= [3366, 3367, 3368, 366, 367, 368] persons= [2371, 2372, 2373] +--- sas= [] onedgg_slice366 crp= 1 +--- 'expires': 1167126899 +369 1 onedgh_slice367 nodes= [3367, 3368, 3369, 367, 368, 369] persons= [2372, 2373, 2374] +--- sas= [] onedgh_slice367 crp= 1 +--- 'expires': 1167126899 +370 1 onedgi_slice368 nodes= [3368, 3369, 3370, 368, 369, 370] persons= [2373, 2374, 2375] +--- sas= [] onedgi_slice368 crp= 1 +--- 'expires': 1167126900 +371 1 onedgj_slice369 nodes= [3369, 3370, 3371, 369, 370, 371] persons= [2376, 2374, 2375] +--- sas= [] onedgj_slice369 crp= 1 +--- 'expires': 1167126900 +372 1 onedha_slice370 nodes= [3370, 3371, 3372, 370, 371, 372] persons= [2376, 2377, 2375] +--- sas= [] onedha_slice370 crp= 1 +--- 'expires': 1167126900 +373 1 onedhb_slice371 nodes= [3371, 3372, 3373, 371, 372, 373] persons= [2376, 2377, 2378] +--- sas= [] onedhb_slice371 crp= 1 +--- 'expires': 1167126900 +374 1 onedhc_slice372 nodes= [3372, 3373, 3374, 372, 373, 374] persons= [2377, 2378, 2379] +--- sas= [] onedhc_slice372 crp= 1 +--- 'expires': 1167126901 +375 1 onedhd_slice373 nodes= [3373, 3374, 3375, 373, 374, 375] persons= [2378, 2379, 2380] +--- sas= [] onedhd_slice373 crp= 1 +--- 'expires': 1167126901 +376 1 onedhe_slice374 nodes= [3374, 3375, 3376, 374, 375, 376] persons= [2379, 2380, 2381] +--- sas= [] onedhe_slice374 crp= 1 +--- 'expires': 1167126901 +377 1 onedhf_slice375 nodes= [3375, 3376, 3377, 375, 376, 377] persons= [2380, 2381, 2382] +--- sas= [] onedhf_slice375 crp= 1 +--- 'expires': 1167126901 +378 1 onedhg_slice376 nodes= [3376, 3377, 3378, 376, 377, 378] persons= [2381, 2382, 2383] +--- sas= [] onedhg_slice376 crp= 1 +--- 'expires': 1167126902 +379 1 onedhh_slice377 nodes= [3377, 3378, 3379, 377, 378, 379] persons= [2384, 2382, 2383] +--- sas= [] onedhh_slice377 crp= 1 +--- 'expires': 1167126903 +380 1 onedhi_slice378 nodes= [3378, 3379, 3380, 378, 379, 380] persons= [2384, 2385, 2383] +--- sas= [] onedhi_slice378 crp= 1 +--- 'expires': 1167126904 +381 1 onedhj_slice379 nodes= [3379, 3380, 3381, 379, 380, 381] persons= [2384, 2385, 2386] +--- sas= [] onedhj_slice379 crp= 1 +--- 'expires': 1167126905 +382 1 onedia_slice380 nodes= [3380, 3381, 3382, 380, 381, 382] persons= [2385, 2386, 2387] +--- sas= [] onedia_slice380 crp= 1 +--- 'expires': 1167126906 +383 1 onedib_slice381 nodes= [3381, 3382, 3383, 381, 382, 383] persons= [2386, 2387, 2388] +--- sas= [] onedib_slice381 crp= 1 +--- 'expires': 1167126907 +384 1 onedic_slice382 nodes= [384, 3382, 3383, 3384, 382, 383] persons= [2387, 2388, 2389] +--- sas= [] onedic_slice382 crp= 1 +--- 'expires': 1167126908 +385 1 onedid_slice383 nodes= [384, 385, 3383, 3384, 3385, 383] persons= [2388, 2389, 2390] +--- sas= [] onedid_slice383 crp= 1 +--- 'expires': 1167126909 +386 1 onedie_slice384 nodes= [384, 385, 386, 3384, 3385, 3386] persons= [2389, 2390, 2391] +--- sas= [] onedie_slice384 crp= 1 +--- 'expires': 1167126910 +387 1 onedif_slice385 nodes= [385, 386, 387, 3385, 3386, 3387] persons= [2392, 2390, 2391] +--- sas= [] onedif_slice385 crp= 1 +--- 'expires': 1167126911 +388 1 onedig_slice386 nodes= [386, 387, 388, 3386, 3387, 3388] persons= [2392, 2393, 2391] +--- sas= [] onedig_slice386 crp= 1 +--- 'expires': 1167126912 +389 1 onedih_slice387 nodes= [387, 388, 389, 3387, 3388, 3389] persons= [2392, 2393, 2394] +--- sas= [] onedih_slice387 crp= 1 +--- 'expires': 1167126913 +390 1 onedii_slice388 nodes= [388, 389, 390, 3388, 3389, 3390] persons= [2393, 2394, 2395] +--- sas= [] onedii_slice388 crp= 1 +--- 'expires': 1167126914 +391 1 onedij_slice389 nodes= [389, 390, 391, 3389, 3390, 3391] persons= [2394, 2395, 2396] +--- sas= [] onedij_slice389 crp= 1 +--- 'expires': 1167126915 +392 1 onedja_slice390 nodes= [3392, 390, 391, 392, 3390, 3391] persons= [2395, 2396, 2397] +--- sas= [] onedja_slice390 crp= 1 +--- 'expires': 1167126916 +393 1 onedjb_slice391 nodes= [3392, 3393, 391, 392, 393, 3391] persons= [2396, 2397, 2398] +--- sas= [] onedjb_slice391 crp= 1 +--- 'expires': 1167126917 +394 1 onedjc_slice392 nodes= [3392, 3393, 3394, 392, 393, 394] persons= [2397, 2398, 2399] +--- sas= [] onedjc_slice392 crp= 1 +--- 'expires': 1167126918 +395 1 onedjd_slice393 nodes= [3393, 3394, 3395, 393, 394, 395] persons= [2400, 2398, 2399] +--- sas= [] onedjd_slice393 crp= 1 +--- 'expires': 1167126919 +396 1 onedje_slice394 nodes= [3394, 3395, 3396, 394, 395, 396] persons= [2400, 2401, 2399] +--- sas= [] onedje_slice394 crp= 1 +--- 'expires': 1167126920 +397 1 onedjf_slice395 nodes= [3395, 3396, 3397, 395, 396, 397] persons= [2400, 2401, 2402] +--- sas= [] onedjf_slice395 crp= 1 +--- 'expires': 1167126921 +398 1 onedjg_slice396 nodes= [3396, 3397, 3398, 396, 397, 398] persons= [2401, 2402, 2403] +--- sas= [] onedjg_slice396 crp= 1 +--- 'expires': 1167126921 +399 1 onedjh_slice397 nodes= [3397, 3398, 3399, 397, 398, 399] persons= [2402, 2403, 2404] +--- sas= [] onedjh_slice397 crp= 1 +--- 'expires': 1167126921 +400 1 onedji_slice398 nodes= [3398, 3399, 3400, 398, 399, 400] persons= [2403, 2404, 2405] +--- sas= [] onedji_slice398 crp= 1 +--- 'expires': 1167126922 +401 1 onedjj_slice399 nodes= [3399, 3400, 3401, 399, 400, 401] persons= [2404, 2405, 2406] +--- sas= [] onedjj_slice399 crp= 1 +--- 'expires': 1167126922 +402 1 oneeaa_slice400 nodes= [3400, 3401, 3402, 400, 401, 402] persons= [2405, 2406, 2407] +--- sas= [] oneeaa_slice400 crp= 1 +--- 'expires': 1167126922 +403 1 oneeab_slice401 nodes= [3401, 3402, 3403, 401, 402, 403] persons= [2408, 2406, 2407] +--- sas= [] oneeab_slice401 crp= 1 +--- 'expires': 1167126922 +404 1 oneeac_slice402 nodes= [3402, 3403, 3404, 402, 403, 404] persons= [2408, 2409, 2407] +--- sas= [] oneeac_slice402 crp= 1 +--- 'expires': 1167126923 +405 1 oneead_slice403 nodes= [3403, 3404, 3405, 403, 404, 405] persons= [2408, 2409, 2410] +--- sas= [] oneead_slice403 crp= 1 +--- 'expires': 1167126923 +406 1 oneeae_slice404 nodes= [3404, 3405, 3406, 404, 405, 406] persons= [2409, 2410, 2411] +--- sas= [] oneeae_slice404 crp= 1 +--- 'expires': 1167126923 +407 1 oneeaf_slice405 nodes= [3405, 3406, 3407, 405, 406, 407] persons= [2410, 2411, 2412] +--- sas= [] oneeaf_slice405 crp= 1 +--- 'expires': 1167126923 +408 1 oneeag_slice406 nodes= [3406, 3407, 3408, 406, 407, 408] persons= [2411, 2412, 2413] +--- sas= [] oneeag_slice406 crp= 1 +--- 'expires': 1167126924 +409 1 oneeah_slice407 nodes= [3407, 3408, 3409, 407, 408, 409] persons= [2412, 2413, 2414] +--- sas= [] oneeah_slice407 crp= 1 +--- 'expires': 1167126924 +410 1 oneeai_slice408 nodes= [3408, 3409, 3410, 408, 409, 410] persons= [2413, 2414, 2415] +--- sas= [] oneeai_slice408 crp= 1 +--- 'expires': 1167126924 +411 1 oneeaj_slice409 nodes= [3409, 3410, 3411, 409, 410, 411] persons= [2416, 2414, 2415] +--- sas= [] oneeaj_slice409 crp= 1 +--- 'expires': 1167126924 +412 1 oneeba_slice410 nodes= [3410, 3411, 3412, 410, 411, 412] persons= [2416, 2417, 2415] +--- sas= [] oneeba_slice410 crp= 1 +--- 'expires': 1167126925 +413 1 oneebb_slice411 nodes= [3411, 3412, 3413, 411, 412, 413] persons= [2416, 2417, 2418] +--- sas= [] oneebb_slice411 crp= 1 +--- 'expires': 1167126925 +414 1 oneebc_slice412 nodes= [3412, 3413, 3414, 412, 413, 414] persons= [2417, 2418, 2419] +--- sas= [] oneebc_slice412 crp= 1 +--- 'expires': 1167126925 +415 1 oneebd_slice413 nodes= [3413, 3414, 3415, 413, 414, 415] persons= [2418, 2419, 2420] +--- sas= [] oneebd_slice413 crp= 1 +--- 'expires': 1167126925 +416 1 oneebe_slice414 nodes= [416, 3414, 3415, 3416, 414, 415] persons= [2419, 2420, 2421] +--- sas= [] oneebe_slice414 crp= 1 +--- 'expires': 1167126926 +417 1 oneebf_slice415 nodes= [416, 417, 3415, 3416, 3417, 415] persons= [2420, 2421, 2422] +--- sas= [] oneebf_slice415 crp= 1 +--- 'expires': 1167126926 +418 1 oneebg_slice416 nodes= [416, 417, 418, 3416, 3417, 3418] persons= [2421, 2422, 2423] +--- sas= [] oneebg_slice416 crp= 1 +--- 'expires': 1167126926 +419 1 oneebh_slice417 nodes= [417, 418, 419, 3417, 3418, 3419] persons= [2424, 2422, 2423] +--- sas= [] oneebh_slice417 crp= 1 +--- 'expires': 1167126926 +420 1 oneebi_slice418 nodes= [418, 419, 420, 3418, 3419, 3420] persons= [2424, 2425, 2423] +--- sas= [] oneebi_slice418 crp= 1 +--- 'expires': 1167126927 +421 1 oneebj_slice419 nodes= [419, 420, 421, 3419, 3420, 3421] persons= [2424, 2425, 2426] +--- sas= [] oneebj_slice419 crp= 1 +--- 'expires': 1167126927 +422 1 oneeca_slice420 nodes= [420, 421, 422, 3420, 3421, 3422] persons= [2425, 2426, 2427] +--- sas= [] oneeca_slice420 crp= 1 +--- 'expires': 1167126927 +423 1 oneecb_slice421 nodes= [421, 422, 423, 3421, 3422, 3423] persons= [2426, 2427, 2428] +--- sas= [] oneecb_slice421 crp= 1 +--- 'expires': 1167126927 +424 1 oneecc_slice422 nodes= [3424, 422, 423, 424, 3422, 3423] persons= [2427, 2428, 2429] +--- sas= [] oneecc_slice422 crp= 1 +--- 'expires': 1167126928 +425 1 oneecd_slice423 nodes= [3424, 3425, 423, 424, 425, 3423] persons= [2428, 2429, 2430] +--- sas= [] oneecd_slice423 crp= 1 +--- 'expires': 1167126928 +426 1 oneece_slice424 nodes= [3424, 3425, 3426, 424, 425, 426] persons= [2429, 2430, 2431] +--- sas= [] oneece_slice424 crp= 1 +--- 'expires': 1167126928 +427 1 oneecf_slice425 nodes= [3425, 3426, 3427, 425, 426, 427] persons= [2432, 2430, 2431] +--- sas= [] oneecf_slice425 crp= 1 +--- 'expires': 1167126928 +428 1 oneecg_slice426 nodes= [3426, 3427, 3428, 426, 427, 428] persons= [2432, 2433, 2431] +--- sas= [] oneecg_slice426 crp= 1 +--- 'expires': 1167126929 +429 1 oneech_slice427 nodes= [3427, 3428, 3429, 427, 428, 429] persons= [2432, 2433, 2434] +--- sas= [] oneech_slice427 crp= 1 +--- 'expires': 1167126929 +430 1 oneeci_slice428 nodes= [3428, 3429, 3430, 428, 429, 430] persons= [2433, 2434, 2435] +--- sas= [] oneeci_slice428 crp= 1 +--- 'expires': 1167126929 +431 1 oneecj_slice429 nodes= [3429, 3430, 3431, 429, 430, 431] persons= [2434, 2435, 2436] +--- sas= [] oneecj_slice429 crp= 1 +--- 'expires': 1167126929 +432 1 oneeda_slice430 nodes= [3430, 3431, 3432, 430, 431, 432] persons= [2435, 2436, 2437] +--- sas= [] oneeda_slice430 crp= 1 +--- 'expires': 1167126930 +433 1 oneedb_slice431 nodes= [3431, 3432, 3433, 431, 432, 433] persons= [2436, 2437, 2438] +--- sas= [] oneedb_slice431 crp= 1 +--- 'expires': 1167126930 +434 1 oneedc_slice432 nodes= [3432, 3433, 3434, 432, 433, 434] persons= [2437, 2438, 2439] +--- sas= [] oneedc_slice432 crp= 1 +--- 'expires': 1167126930 +435 1 oneedd_slice433 nodes= [3433, 3434, 3435, 433, 434, 435] persons= [2440, 2438, 2439] +--- sas= [] oneedd_slice433 crp= 1 +--- 'expires': 1167126930 +436 1 oneede_slice434 nodes= [3434, 3435, 3436, 434, 435, 436] persons= [2440, 2441, 2439] +--- sas= [] oneede_slice434 crp= 1 +--- 'expires': 1167126931 +437 1 oneedf_slice435 nodes= [3435, 3436, 3437, 435, 436, 437] persons= [2440, 2441, 2442] +--- sas= [] oneedf_slice435 crp= 1 +--- 'expires': 1167126931 +438 1 oneedg_slice436 nodes= [3436, 3437, 3438, 436, 437, 438] persons= [2441, 2442, 2443] +--- sas= [] oneedg_slice436 crp= 1 +--- 'expires': 1167126931 +439 1 oneedh_slice437 nodes= [3437, 3438, 3439, 437, 438, 439] persons= [2442, 2443, 2444] +--- sas= [] oneedh_slice437 crp= 1 +--- 'expires': 1167126931 +440 1 oneedi_slice438 nodes= [3438, 3439, 3440, 438, 439, 440] persons= [2443, 2444, 2445] +--- sas= [] oneedi_slice438 crp= 1 +--- 'expires': 1167126932 +441 1 oneedj_slice439 nodes= [3439, 3440, 3441, 439, 440, 441] persons= [2444, 2445, 2446] +--- sas= [] oneedj_slice439 crp= 1 +--- 'expires': 1167126932 +442 1 oneeea_slice440 nodes= [3440, 3441, 3442, 440, 441, 442] persons= [2445, 2446, 2447] +--- sas= [] oneeea_slice440 crp= 1 +--- 'expires': 1167126932 +443 1 oneeeb_slice441 nodes= [3441, 3442, 3443, 441, 442, 443] persons= [2448, 2446, 2447] +--- sas= [] oneeeb_slice441 crp= 1 +--- 'expires': 1167126932 +444 1 oneeec_slice442 nodes= [3442, 3443, 3444, 442, 443, 444] persons= [2448, 2449, 2447] +--- sas= [] oneeec_slice442 crp= 1 +--- 'expires': 1167126933 +445 1 oneeed_slice443 nodes= [3443, 3444, 3445, 443, 444, 445] persons= [2448, 2449, 2450] +--- sas= [] oneeed_slice443 crp= 1 +--- 'expires': 1167126933 +446 1 oneeee_slice444 nodes= [3444, 3445, 3446, 444, 445, 446] persons= [2449, 2450, 2451] +--- sas= [] oneeee_slice444 crp= 1 +--- 'expires': 1167126933 +447 1 oneeef_slice445 nodes= [3445, 3446, 3447, 445, 446, 447] persons= [2450, 2451, 2452] +--- sas= [] oneeef_slice445 crp= 1 +--- 'expires': 1167126933 +448 1 oneeeg_slice446 nodes= [448, 3446, 3447, 3448, 446, 447] persons= [2451, 2452, 2453] +--- sas= [] oneeeg_slice446 crp= 1 +--- 'expires': 1167126934 +449 1 oneeeh_slice447 nodes= [448, 449, 3447, 3448, 3449, 447] persons= [2452, 2453, 2454] +--- sas= [] oneeeh_slice447 crp= 1 +--- 'expires': 1167126934 +450 1 oneeei_slice448 nodes= [448, 449, 450, 3448, 3449, 3450] persons= [2453, 2454, 2455] +--- sas= [] oneeei_slice448 crp= 1 +--- 'expires': 1167126934 +451 1 oneeej_slice449 nodes= [449, 450, 451, 3449, 3450, 3451] persons= [2456, 2454, 2455] +--- sas= [] oneeej_slice449 crp= 1 +--- 'expires': 1167126934 +452 1 oneefa_slice450 nodes= [450, 451, 452, 3450, 3451, 3452] persons= [2456, 2457, 2455] +--- sas= [] oneefa_slice450 crp= 1 +--- 'expires': 1167126935 +453 1 oneefb_slice451 nodes= [451, 452, 453, 3451, 3452, 3453] persons= [2456, 2457, 2458] +--- sas= [] oneefb_slice451 crp= 1 +--- 'expires': 1167126935 +454 1 oneefc_slice452 nodes= [452, 453, 454, 3452, 3453, 3454] persons= [2457, 2458, 2459] +--- sas= [] oneefc_slice452 crp= 1 +--- 'expires': 1167126935 +455 1 oneefd_slice453 nodes= [453, 454, 455, 3453, 3454, 3455] persons= [2458, 2459, 2460] +--- sas= [] oneefd_slice453 crp= 1 +--- 'expires': 1167126935 +456 1 oneefe_slice454 nodes= [3456, 454, 455, 456, 3454, 3455] persons= [2459, 2460, 2461] +--- sas= [] oneefe_slice454 crp= 1 +--- 'expires': 1167126936 +457 1 oneeff_slice455 nodes= [3456, 3457, 455, 456, 457, 3455] persons= [2460, 2461, 2462] +--- sas= [] oneeff_slice455 crp= 1 +--- 'expires': 1167126936 +458 1 oneefg_slice456 nodes= [3456, 3457, 3458, 456, 457, 458] persons= [2461, 2462, 2463] +--- sas= [] oneefg_slice456 crp= 1 +--- 'expires': 1167126936 +459 1 oneefh_slice457 nodes= [3457, 3458, 3459, 457, 458, 459] persons= [2464, 2462, 2463] +--- sas= [] oneefh_slice457 crp= 1 +--- 'expires': 1167126936 +460 1 oneefi_slice458 nodes= [3458, 3459, 3460, 458, 459, 460] persons= [2464, 2465, 2463] +--- sas= [] oneefi_slice458 crp= 1 +--- 'expires': 1167126937 +461 1 oneefj_slice459 nodes= [3459, 3460, 3461, 459, 460, 461] persons= [2464, 2465, 2466] +--- sas= [] oneefj_slice459 crp= 1 +--- 'expires': 1167126937 +462 1 oneega_slice460 nodes= [3460, 3461, 3462, 460, 461, 462] persons= [2465, 2466, 2467] +--- sas= [] oneega_slice460 crp= 1 +--- 'expires': 1167126937 +463 1 oneegb_slice461 nodes= [3461, 3462, 3463, 461, 462, 463] persons= [2466, 2467, 2468] +--- sas= [] oneegb_slice461 crp= 1 +--- 'expires': 1167126938 +464 1 oneegc_slice462 nodes= [3462, 3463, 3464, 462, 463, 464] persons= [2467, 2468, 2469] +--- sas= [] oneegc_slice462 crp= 1 +--- 'expires': 1167126938 +465 1 oneegd_slice463 nodes= [3463, 3464, 3465, 463, 464, 465] persons= [2468, 2469, 2470] +--- sas= [] oneegd_slice463 crp= 1 +--- 'expires': 1167126938 +466 1 oneege_slice464 nodes= [3464, 3465, 3466, 464, 465, 466] persons= [2469, 2470, 2471] +--- sas= [] oneege_slice464 crp= 1 +--- 'expires': 1167126938 +467 1 oneegf_slice465 nodes= [3465, 3466, 3467, 465, 466, 467] persons= [2472, 2470, 2471] +--- sas= [] oneegf_slice465 crp= 1 +--- 'expires': 1167126939 +468 1 oneegg_slice466 nodes= [3466, 3467, 3468, 466, 467, 468] persons= [2472, 2473, 2471] +--- sas= [] oneegg_slice466 crp= 1 +--- 'expires': 1167126939 +469 1 oneegh_slice467 nodes= [3467, 3468, 3469, 467, 468, 469] persons= [2472, 2473, 2474] +--- sas= [] oneegh_slice467 crp= 1 +--- 'expires': 1167126939 +470 1 oneegi_slice468 nodes= [3468, 3469, 3470, 468, 469, 470] persons= [2473, 2474, 2475] +--- sas= [] oneegi_slice468 crp= 1 +--- 'expires': 1167126939 +471 1 oneegj_slice469 nodes= [3469, 3470, 3471, 469, 470, 471] persons= [2474, 2475, 2476] +--- sas= [] oneegj_slice469 crp= 1 +--- 'expires': 1167126940 +472 1 oneeha_slice470 nodes= [3470, 3471, 3472, 470, 471, 472] persons= [2475, 2476, 2477] +--- sas= [] oneeha_slice470 crp= 1 +--- 'expires': 1167126940 +473 1 oneehb_slice471 nodes= [3471, 3472, 3473, 471, 472, 473] persons= [2476, 2477, 2478] +--- sas= [] oneehb_slice471 crp= 1 +--- 'expires': 1167126940 +474 1 oneehc_slice472 nodes= [3472, 3473, 3474, 472, 473, 474] persons= [2477, 2478, 2479] +--- sas= [] oneehc_slice472 crp= 1 +--- 'expires': 1167126940 +475 1 oneehd_slice473 nodes= [3473, 3474, 3475, 473, 474, 475] persons= [2480, 2478, 2479] +--- sas= [] oneehd_slice473 crp= 1 +--- 'expires': 1167126941 +476 1 oneehe_slice474 nodes= [3474, 3475, 3476, 474, 475, 476] persons= [2480, 2481, 2479] +--- sas= [] oneehe_slice474 crp= 1 +--- 'expires': 1167126941 +477 1 oneehf_slice475 nodes= [3475, 3476, 3477, 475, 476, 477] persons= [2480, 2481, 2482] +--- sas= [] oneehf_slice475 crp= 1 +--- 'expires': 1167126941 +478 1 oneehg_slice476 nodes= [3476, 3477, 3478, 476, 477, 478] persons= [2481, 2482, 2483] +--- sas= [] oneehg_slice476 crp= 1 +--- 'expires': 1167126941 +479 1 oneehh_slice477 nodes= [3477, 3478, 3479, 477, 478, 479] persons= [2482, 2483, 2484] +--- sas= [] oneehh_slice477 crp= 1 +--- 'expires': 1167126942 +480 1 oneehi_slice478 nodes= [480, 3478, 3479, 3480, 478, 479] persons= [2483, 2484, 2485] +--- sas= [] oneehi_slice478 crp= 1 +--- 'expires': 1167126942 +481 1 oneehj_slice479 nodes= [480, 481, 3479, 3480, 3481, 479] persons= [2484, 2485, 2486] +--- sas= [] oneehj_slice479 crp= 1 +--- 'expires': 1167126942 +482 1 oneeia_slice480 nodes= [480, 481, 482, 3480, 3481, 3482] persons= [2485, 2486, 2487] +--- sas= [] oneeia_slice480 crp= 1 +--- 'expires': 1167126942 +483 1 oneeib_slice481 nodes= [481, 482, 483, 3481, 3482, 3483] persons= [2488, 2486, 2487] +--- sas= [] oneeib_slice481 crp= 1 +--- 'expires': 1167126943 +484 1 oneeic_slice482 nodes= [482, 483, 484, 3482, 3483, 3484] persons= [2488, 2489, 2487] +--- sas= [] oneeic_slice482 crp= 1 +--- 'expires': 1167126943 +485 1 oneeid_slice483 nodes= [483, 484, 485, 3483, 3484, 3485] persons= [2488, 2489, 2490] +--- sas= [] oneeid_slice483 crp= 1 +--- 'expires': 1167126943 +486 1 oneeie_slice484 nodes= [484, 485, 486, 3484, 3485, 3486] persons= [2489, 2490, 2491] +--- sas= [] oneeie_slice484 crp= 1 +--- 'expires': 1167126943 +487 1 oneeif_slice485 nodes= [485, 486, 487, 3485, 3486, 3487] persons= [2490, 2491, 2492] +--- sas= [] oneeif_slice485 crp= 1 +--- 'expires': 1167126944 +488 1 oneeig_slice486 nodes= [3488, 486, 487, 488, 3486, 3487] persons= [2491, 2492, 2493] +--- sas= [] oneeig_slice486 crp= 1 +--- 'expires': 1167126944 +489 1 oneeih_slice487 nodes= [3488, 3489, 487, 488, 489, 3487] persons= [2492, 2493, 2494] +--- sas= [] oneeih_slice487 crp= 1 +--- 'expires': 1167126944 +490 1 oneeii_slice488 nodes= [3488, 3489, 3490, 488, 489, 490] persons= [2493, 2494, 2495] +--- sas= [] oneeii_slice488 crp= 1 +--- 'expires': 1167126945 +491 1 oneeij_slice489 nodes= [3489, 3490, 3491, 489, 490, 491] persons= [2496, 2494, 2495] +--- sas= [] oneeij_slice489 crp= 1 +--- 'expires': 1167126945 +492 1 oneeja_slice490 nodes= [3490, 3491, 3492, 490, 491, 492] persons= [2496, 2497, 2495] +--- sas= [] oneeja_slice490 crp= 1 +--- 'expires': 1167126945 +493 1 oneejb_slice491 nodes= [3491, 3492, 3493, 491, 492, 493] persons= [2496, 2497, 2498] +--- sas= [] oneejb_slice491 crp= 1 +--- 'expires': 1167126945 +494 1 oneejc_slice492 nodes= [3492, 3493, 3494, 492, 493, 494] persons= [2497, 2498, 2499] +--- sas= [] oneejc_slice492 crp= 1 +--- 'expires': 1167126946 +495 1 oneejd_slice493 nodes= [3493, 3494, 3495, 493, 494, 495] persons= [2498, 2499, 2500] +--- sas= [] oneejd_slice493 crp= 1 +--- 'expires': 1167126946 +496 1 oneeje_slice494 nodes= [3494, 3495, 3496, 494, 495, 496] persons= [2499, 2500, 2501] +--- sas= [] oneeje_slice494 crp= 1 +--- 'expires': 1167126946 +497 1 oneejf_slice495 nodes= [3495, 3496, 3497, 495, 496, 497] persons= [2500, 2501, 2502] +--- sas= [] oneejf_slice495 crp= 1 +--- 'expires': 1167126946 +498 1 oneejg_slice496 nodes= [3496, 3497, 3498, 496, 497, 498] persons= [2501, 2502, 2503] +--- sas= [] oneejg_slice496 crp= 1 +--- 'expires': 1167126947 +499 1 oneejh_slice497 nodes= [3497, 3498, 3499, 497, 498, 499] persons= [2504, 2502, 2503] +--- sas= [] oneejh_slice497 crp= 1 +--- 'expires': 1167126947 +500 1 oneeji_slice498 nodes= [3498, 3499, 3500, 498, 499, 500] persons= [2504, 2505, 2503] +--- sas= [] oneeji_slice498 crp= 1 +--- 'expires': 1167126947 +501 1 oneejj_slice499 nodes= [3499, 3500, 3501, 499, 500, 501] persons= [2504, 2505, 2506] +--- sas= [] oneejj_slice499 crp= 1 +--- 'expires': 1167126947 +502 1 onefaa_slice500 nodes= [3500, 3501, 3502, 500, 501, 502] persons= [2505, 2506, 2507] +--- sas= [] onefaa_slice500 crp= 1 +--- 'expires': 1167126948 +503 1 onefab_slice501 nodes= [3501, 3502, 3503, 501, 502, 503] persons= [2506, 2507, 2508] +--- sas= [] onefab_slice501 crp= 1 +--- 'expires': 1167126948 +504 1 onefac_slice502 nodes= [3502, 3503, 3504, 502, 503, 504] persons= [2507, 2508, 2509] +--- sas= [] onefac_slice502 crp= 1 +--- 'expires': 1167126948 +505 1 onefad_slice503 nodes= [3503, 3504, 3505, 503, 504, 505] persons= [2508, 2509, 2510] +--- sas= [] onefad_slice503 crp= 1 +--- 'expires': 1167126948 +506 1 onefae_slice504 nodes= [3504, 3505, 3506, 504, 505, 506] persons= [2509, 2510, 2511] +--- sas= [] onefae_slice504 crp= 1 +--- 'expires': 1167126949 +507 1 onefaf_slice505 nodes= [3505, 3506, 3507, 505, 506, 507] persons= [2512, 2510, 2511] +--- sas= [] onefaf_slice505 crp= 1 +--- 'expires': 1167126949 +508 1 onefag_slice506 nodes= [3506, 3507, 3508, 506, 507, 508] persons= [2512, 2513, 2511] +--- sas= [] onefag_slice506 crp= 1 +--- 'expires': 1167126949 +509 1 onefah_slice507 nodes= [3507, 3508, 3509, 507, 508, 509] persons= [2512, 2513, 2514] +--- sas= [] onefah_slice507 crp= 1 +--- 'expires': 1167126950 +510 1 onefai_slice508 nodes= [3508, 3509, 3510, 508, 509, 510] persons= [2513, 2514, 2515] +--- sas= [] onefai_slice508 crp= 1 +--- 'expires': 1167126950 +511 1 onefaj_slice509 nodes= [3509, 3510, 3511, 509, 510, 511] persons= [2514, 2515, 2516] +--- sas= [] onefaj_slice509 crp= 1 +--- 'expires': 1167126950 +512 1 onefba_slice510 nodes= [512, 3510, 3511, 3512, 510, 511] persons= [2515, 2516, 2517] +--- sas= [] onefba_slice510 crp= 1 +--- 'expires': 1167126950 +513 1 onefbb_slice511 nodes= [512, 513, 3511, 3512, 3513, 511] persons= [2516, 2517, 2518] +--- sas= [] onefbb_slice511 crp= 1 +--- 'expires': 1167126951 +514 1 onefbc_slice512 nodes= [512, 513, 514, 3512, 3513, 3514] persons= [2517, 2518, 2519] +--- sas= [] onefbc_slice512 crp= 1 +--- 'expires': 1167126951 +515 1 onefbd_slice513 nodes= [513, 514, 515, 3513, 3514, 3515] persons= [2520, 2518, 2519] +--- sas= [] onefbd_slice513 crp= 1 +--- 'expires': 1167126951 +516 1 onefbe_slice514 nodes= [514, 515, 516, 3514, 3515, 3516] persons= [2520, 2521, 2519] +--- sas= [] onefbe_slice514 crp= 1 +--- 'expires': 1167126951 +517 1 onefbf_slice515 nodes= [515, 516, 517, 3515, 3516, 3517] persons= [2520, 2521, 2522] +--- sas= [] onefbf_slice515 crp= 1 +--- 'expires': 1167126952 +518 1 onefbg_slice516 nodes= [516, 517, 518, 3516, 3517, 3518] persons= [2521, 2522, 2523] +--- sas= [] onefbg_slice516 crp= 1 +--- 'expires': 1167126952 +519 1 onefbh_slice517 nodes= [517, 518, 519, 3517, 3518, 3519] persons= [2522, 2523, 2524] +--- sas= [] onefbh_slice517 crp= 1 +--- 'expires': 1167126952 +520 1 onefbi_slice518 nodes= [3520, 518, 519, 520, 3518, 3519] persons= [2523, 2524, 2525] +--- sas= [] onefbi_slice518 crp= 1 +--- 'expires': 1167126952 +521 1 onefbj_slice519 nodes= [3520, 3521, 519, 520, 521, 3519] persons= [2524, 2525, 2526] +--- sas= [] onefbj_slice519 crp= 1 +--- 'expires': 1167126953 +522 1 onefca_slice520 nodes= [3520, 3521, 3522, 520, 521, 522] persons= [2525, 2526, 2527] +--- sas= [] onefca_slice520 crp= 1 +--- 'expires': 1167126953 +523 1 onefcb_slice521 nodes= [3521, 3522, 3523, 521, 522, 523] persons= [2528, 2526, 2527] +--- sas= [] onefcb_slice521 crp= 1 +--- 'expires': 1167126953 +524 1 onefcc_slice522 nodes= [3522, 3523, 3524, 522, 523, 524] persons= [2528, 2529, 2527] +--- sas= [] onefcc_slice522 crp= 1 +--- 'expires': 1167126954 +525 1 onefcd_slice523 nodes= [3523, 3524, 3525, 523, 524, 525] persons= [2528, 2529, 2530] +--- sas= [] onefcd_slice523 crp= 1 +--- 'expires': 1167126954 +526 1 onefce_slice524 nodes= [3524, 3525, 3526, 524, 525, 526] persons= [2529, 2530, 2531] +--- sas= [] onefce_slice524 crp= 1 +--- 'expires': 1167126954 +527 1 onefcf_slice525 nodes= [3525, 3526, 3527, 525, 526, 527] persons= [2530, 2531, 2532] +--- sas= [] onefcf_slice525 crp= 1 +--- 'expires': 1167126954 +528 1 onefcg_slice526 nodes= [3526, 3527, 3528, 526, 527, 528] persons= [2531, 2532, 2533] +--- sas= [] onefcg_slice526 crp= 1 +--- 'expires': 1167126955 +529 1 onefch_slice527 nodes= [3527, 3528, 3529, 527, 528, 529] persons= [2532, 2533, 2534] +--- sas= [] onefch_slice527 crp= 1 +--- 'expires': 1167126955 +530 1 onefci_slice528 nodes= [3528, 3529, 3530, 528, 529, 530] persons= [2533, 2534, 2535] +--- sas= [] onefci_slice528 crp= 1 +--- 'expires': 1167126955 +531 1 onefcj_slice529 nodes= [3529, 3530, 3531, 529, 530, 531] persons= [2536, 2534, 2535] +--- sas= [] onefcj_slice529 crp= 1 +--- 'expires': 1167126955 +532 1 onefda_slice530 nodes= [3530, 3531, 3532, 530, 531, 532] persons= [2536, 2537, 2535] +--- sas= [] onefda_slice530 crp= 1 +--- 'expires': 1167126956 +533 1 onefdb_slice531 nodes= [3531, 3532, 3533, 531, 532, 533] persons= [2536, 2537, 2538] +--- sas= [] onefdb_slice531 crp= 1 +--- 'expires': 1167126956 +534 1 onefdc_slice532 nodes= [3532, 3533, 3534, 532, 533, 534] persons= [2537, 2538, 2539] +--- sas= [] onefdc_slice532 crp= 1 +--- 'expires': 1167126956 +535 1 onefdd_slice533 nodes= [3533, 3534, 3535, 533, 534, 535] persons= [2538, 2539, 2540] +--- sas= [] onefdd_slice533 crp= 1 +--- 'expires': 1167126956 +536 1 onefde_slice534 nodes= [3534, 3535, 3536, 534, 535, 536] persons= [2539, 2540, 2541] +--- sas= [] onefde_slice534 crp= 1 +--- 'expires': 1167126957 +537 1 onefdf_slice535 nodes= [3535, 3536, 3537, 535, 536, 537] persons= [2540, 2541, 2542] +--- sas= [] onefdf_slice535 crp= 1 +--- 'expires': 1167126957 +538 1 onefdg_slice536 nodes= [3536, 3537, 3538, 536, 537, 538] persons= [2541, 2542, 2543] +--- sas= [] onefdg_slice536 crp= 1 +--- 'expires': 1167126957 +539 1 onefdh_slice537 nodes= [3537, 3538, 3539, 537, 538, 539] persons= [2544, 2542, 2543] +--- sas= [] onefdh_slice537 crp= 1 +--- 'expires': 1167126958 +540 1 onefdi_slice538 nodes= [3538, 3539, 3540, 538, 539, 540] persons= [2544, 2545, 2543] +--- sas= [] onefdi_slice538 crp= 1 +--- 'expires': 1167126958 +541 1 onefdj_slice539 nodes= [3539, 3540, 3541, 539, 540, 541] persons= [2544, 2545, 2546] +--- sas= [] onefdj_slice539 crp= 1 +--- 'expires': 1167126958 +542 1 onefea_slice540 nodes= [3540, 3541, 3542, 540, 541, 542] persons= [2545, 2546, 2547] +--- sas= [] onefea_slice540 crp= 1 +--- 'expires': 1167126958 +543 1 onefeb_slice541 nodes= [3541, 3542, 3543, 541, 542, 543] persons= [2546, 2547, 2548] +--- sas= [] onefeb_slice541 crp= 1 +--- 'expires': 1167126959 +544 1 onefec_slice542 nodes= [544, 3542, 3543, 3544, 542, 543] persons= [2547, 2548, 2549] +--- sas= [] onefec_slice542 crp= 1 +--- 'expires': 1167126959 +545 1 onefed_slice543 nodes= [544, 545, 3543, 3544, 3545, 543] persons= [2548, 2549, 2550] +--- sas= [] onefed_slice543 crp= 1 +--- 'expires': 1167126959 +546 1 onefee_slice544 nodes= [544, 545, 546, 3544, 3545, 3546] persons= [2549, 2550, 2551] +--- sas= [] onefee_slice544 crp= 1 +--- 'expires': 1167126959 +547 1 onefef_slice545 nodes= [545, 546, 547, 3545, 3546, 3547] persons= [2552, 2550, 2551] +--- sas= [] onefef_slice545 crp= 1 +--- 'expires': 1167126960 +548 1 onefeg_slice546 nodes= [546, 547, 548, 3546, 3547, 3548] persons= [2552, 2553, 2551] +--- sas= [] onefeg_slice546 crp= 1 +--- 'expires': 1167126960 +549 1 onefeh_slice547 nodes= [547, 548, 549, 3547, 3548, 3549] persons= [2552, 2553, 2554] +--- sas= [] onefeh_slice547 crp= 1 +--- 'expires': 1167126960 +550 1 onefei_slice548 nodes= [548, 549, 550, 3548, 3549, 3550] persons= [2553, 2554, 2555] +--- sas= [] onefei_slice548 crp= 1 +--- 'expires': 1167126961 +551 1 onefej_slice549 nodes= [549, 550, 551, 3549, 3550, 3551] persons= [2554, 2555, 2556] +--- sas= [] onefej_slice549 crp= 1 +--- 'expires': 1167126961 +552 1 oneffa_slice550 nodes= [3552, 550, 551, 552, 3550, 3551] persons= [2555, 2556, 2557] +--- sas= [] oneffa_slice550 crp= 1 +--- 'expires': 1167126961 +553 1 oneffb_slice551 nodes= [3552, 3553, 551, 552, 553, 3551] persons= [2556, 2557, 2558] +--- sas= [] oneffb_slice551 crp= 1 +--- 'expires': 1167126961 +554 1 oneffc_slice552 nodes= [3552, 3553, 3554, 552, 553, 554] persons= [2557, 2558, 2559] +--- sas= [] oneffc_slice552 crp= 1 +--- 'expires': 1167126962 +555 1 oneffd_slice553 nodes= [3553, 3554, 3555, 553, 554, 555] persons= [2560, 2558, 2559] +--- sas= [] oneffd_slice553 crp= 1 +--- 'expires': 1167126962 +556 1 oneffe_slice554 nodes= [3554, 3555, 3556, 554, 555, 556] persons= [2560, 2561, 2559] +--- sas= [] oneffe_slice554 crp= 1 +--- 'expires': 1167126962 +557 1 onefff_slice555 nodes= [3555, 3556, 3557, 555, 556, 557] persons= [2560, 2561, 2562] +--- sas= [] onefff_slice555 crp= 1 +--- 'expires': 1167126962 +558 1 oneffg_slice556 nodes= [3556, 3557, 3558, 556, 557, 558] persons= [2561, 2562, 2563] +--- sas= [] oneffg_slice556 crp= 1 +--- 'expires': 1167126963 +559 1 oneffh_slice557 nodes= [3557, 3558, 3559, 557, 558, 559] persons= [2562, 2563, 2564] +--- sas= [] oneffh_slice557 crp= 1 +--- 'expires': 1167126963 +560 1 oneffi_slice558 nodes= [3558, 3559, 3560, 558, 559, 560] persons= [2563, 2564, 2565] +--- sas= [] oneffi_slice558 crp= 1 +--- 'expires': 1167126963 +561 1 oneffj_slice559 nodes= [3559, 3560, 3561, 559, 560, 561] persons= [2564, 2565, 2566] +--- sas= [] oneffj_slice559 crp= 1 +--- 'expires': 1167126963 +562 1 onefga_slice560 nodes= [3560, 3561, 3562, 560, 561, 562] persons= [2565, 2566, 2567] +--- sas= [] onefga_slice560 crp= 1 +--- 'expires': 1167126964 +563 1 onefgb_slice561 nodes= [3561, 3562, 3563, 561, 562, 563] persons= [2568, 2566, 2567] +--- sas= [] onefgb_slice561 crp= 1 +--- 'expires': 1167126964 +564 1 onefgc_slice562 nodes= [3562, 3563, 3564, 562, 563, 564] persons= [2568, 2569, 2567] +--- sas= [] onefgc_slice562 crp= 1 +--- 'expires': 1167126964 +565 1 onefgd_slice563 nodes= [3563, 3564, 3565, 563, 564, 565] persons= [2568, 2569, 2570] +--- sas= [] onefgd_slice563 crp= 1 +--- 'expires': 1167126965 +566 1 onefge_slice564 nodes= [3564, 3565, 3566, 564, 565, 566] persons= [2569, 2570, 2571] +--- sas= [] onefge_slice564 crp= 1 +--- 'expires': 1167126965 +567 1 onefgf_slice565 nodes= [3565, 3566, 3567, 565, 566, 567] persons= [2570, 2571, 2572] +--- sas= [] onefgf_slice565 crp= 1 +--- 'expires': 1167126965 +568 1 onefgg_slice566 nodes= [3566, 3567, 3568, 566, 567, 568] persons= [2571, 2572, 2573] +--- sas= [] onefgg_slice566 crp= 1 +--- 'expires': 1167126965 +569 1 onefgh_slice567 nodes= [3567, 3568, 3569, 567, 568, 569] persons= [2572, 2573, 2574] +--- sas= [] onefgh_slice567 crp= 1 +--- 'expires': 1167126966 +570 1 onefgi_slice568 nodes= [3568, 3569, 3570, 568, 569, 570] persons= [2573, 2574, 2575] +--- sas= [] onefgi_slice568 crp= 1 +--- 'expires': 1167126966 +571 1 onefgj_slice569 nodes= [3569, 3570, 3571, 569, 570, 571] persons= [2576, 2574, 2575] +--- sas= [] onefgj_slice569 crp= 1 +--- 'expires': 1167126966 +572 1 onefha_slice570 nodes= [3570, 3571, 3572, 570, 571, 572] persons= [2576, 2577, 2575] +--- sas= [] onefha_slice570 crp= 1 +--- 'expires': 1167126967 +573 1 onefhb_slice571 nodes= [3571, 3572, 3573, 571, 572, 573] persons= [2576, 2577, 2578] +--- sas= [] onefhb_slice571 crp= 1 +--- 'expires': 1167126967 +574 1 onefhc_slice572 nodes= [3572, 3573, 3574, 572, 573, 574] persons= [2577, 2578, 2579] +--- sas= [] onefhc_slice572 crp= 1 +--- 'expires': 1167126967 +575 1 onefhd_slice573 nodes= [3573, 3574, 3575, 573, 574, 575] persons= [2578, 2579, 2580] +--- sas= [] onefhd_slice573 crp= 1 +--- 'expires': 1167126967 +576 1 onefhe_slice574 nodes= [576, 3574, 3575, 3576, 574, 575] persons= [2579, 2580, 2581] +--- sas= [] onefhe_slice574 crp= 1 +--- 'expires': 1167126968 +577 1 onefhf_slice575 nodes= [576, 577, 3575, 3576, 3577, 575] persons= [2580, 2581, 2582] +--- sas= [] onefhf_slice575 crp= 1 +--- 'expires': 1167126968 +578 1 onefhg_slice576 nodes= [576, 577, 578, 3576, 3577, 3578] persons= [2581, 2582, 2583] +--- sas= [] onefhg_slice576 crp= 1 +--- 'expires': 1167126968 +579 1 onefhh_slice577 nodes= [577, 578, 579, 3577, 3578, 3579] persons= [2584, 2582, 2583] +--- sas= [] onefhh_slice577 crp= 1 +--- 'expires': 1167126968 +580 1 onefhi_slice578 nodes= [578, 579, 580, 3578, 3579, 3580] persons= [2584, 2585, 2583] +--- sas= [] onefhi_slice578 crp= 1 +--- 'expires': 1167126969 +581 1 onefhj_slice579 nodes= [579, 580, 581, 3579, 3580, 3581] persons= [2584, 2585, 2586] +--- sas= [] onefhj_slice579 crp= 1 +--- 'expires': 1167126969 +582 1 onefia_slice580 nodes= [580, 581, 582, 3580, 3581, 3582] persons= [2585, 2586, 2587] +--- sas= [] onefia_slice580 crp= 1 +--- 'expires': 1167126969 +583 1 onefib_slice581 nodes= [581, 582, 583, 3581, 3582, 3583] persons= [2586, 2587, 2588] +--- sas= [] onefib_slice581 crp= 1 +--- 'expires': 1167126970 +584 1 onefic_slice582 nodes= [3584, 582, 583, 584, 3582, 3583] persons= [2587, 2588, 2589] +--- sas= [] onefic_slice582 crp= 1 +--- 'expires': 1167126970 +585 1 onefid_slice583 nodes= [3584, 3585, 583, 584, 585, 3583] persons= [2588, 2589, 2590] +--- sas= [] onefid_slice583 crp= 1 +--- 'expires': 1167126970 +586 1 onefie_slice584 nodes= [3584, 3585, 3586, 584, 585, 586] persons= [2589, 2590, 2591] +--- sas= [] onefie_slice584 crp= 1 +--- 'expires': 1167126970 +587 1 onefif_slice585 nodes= [3585, 3586, 3587, 585, 586, 587] persons= [2592, 2590, 2591] +--- sas= [] onefif_slice585 crp= 1 +--- 'expires': 1167126971 +588 1 onefig_slice586 nodes= [3586, 3587, 3588, 586, 587, 588] persons= [2592, 2593, 2591] +--- sas= [] onefig_slice586 crp= 1 +--- 'expires': 1167126971 +589 1 onefih_slice587 nodes= [3587, 3588, 3589, 587, 588, 589] persons= [2592, 2593, 2594] +--- sas= [] onefih_slice587 crp= 1 +--- 'expires': 1167126971 +590 1 onefii_slice588 nodes= [3588, 3589, 3590, 588, 589, 590] persons= [2593, 2594, 2595] +--- sas= [] onefii_slice588 crp= 1 +--- 'expires': 1167126971 +591 1 onefij_slice589 nodes= [3589, 3590, 3591, 589, 590, 591] persons= [2594, 2595, 2596] +--- sas= [] onefij_slice589 crp= 1 +--- 'expires': 1167126972 +592 1 onefja_slice590 nodes= [3590, 3591, 3592, 590, 591, 592] persons= [2595, 2596, 2597] +--- sas= [] onefja_slice590 crp= 1 +--- 'expires': 1167126972 +593 1 onefjb_slice591 nodes= [3591, 3592, 3593, 591, 592, 593] persons= [2596, 2597, 2598] +--- sas= [] onefjb_slice591 crp= 1 +--- 'expires': 1167126972 +594 1 onefjc_slice592 nodes= [3592, 3593, 3594, 592, 593, 594] persons= [2597, 2598, 2599] +--- sas= [] onefjc_slice592 crp= 1 +--- 'expires': 1167126973 +595 1 onefjd_slice593 nodes= [3593, 3594, 3595, 593, 594, 595] persons= [2600, 2598, 2599] +--- sas= [] onefjd_slice593 crp= 1 +--- 'expires': 1167126973 +596 1 onefje_slice594 nodes= [3594, 3595, 3596, 594, 595, 596] persons= [2600, 2601, 2599] +--- sas= [] onefje_slice594 crp= 1 +--- 'expires': 1167126973 +597 1 onefjf_slice595 nodes= [3595, 3596, 3597, 595, 596, 597] persons= [2600, 2601, 2602] +--- sas= [] onefjf_slice595 crp= 1 +--- 'expires': 1167126973 +598 1 onefjg_slice596 nodes= [3596, 3597, 3598, 596, 597, 598] persons= [2601, 2602, 2603] +--- sas= [] onefjg_slice596 crp= 1 +--- 'expires': 1167126974 +599 1 onefjh_slice597 nodes= [3597, 3598, 3599, 597, 598, 599] persons= [2602, 2603, 2604] +--- sas= [] onefjh_slice597 crp= 1 +--- 'expires': 1167126974 +600 1 onefji_slice598 nodes= [3598, 3599, 3600, 598, 599, 600] persons= [2603, 2604, 2605] +--- sas= [] onefji_slice598 crp= 1 +--- 'expires': 1167126974 +601 1 onefjj_slice599 nodes= [3599, 3600, 3601, 599, 600, 601] persons= [2604, 2605, 2606] +--- sas= [] onefjj_slice599 crp= 1 +--- 'expires': 1167126975 +602 1 onegaa_slice600 nodes= [3600, 3601, 3602, 600, 601, 602] persons= [2605, 2606, 2607] +--- sas= [] onegaa_slice600 crp= 1 +--- 'expires': 1167126975 +603 1 onegab_slice601 nodes= [3601, 3602, 3603, 601, 602, 603] persons= [2608, 2606, 2607] +--- sas= [] onegab_slice601 crp= 1 +--- 'expires': 1167126975 +604 1 onegac_slice602 nodes= [3602, 3603, 3604, 602, 603, 604] persons= [2608, 2609, 2607] +--- sas= [] onegac_slice602 crp= 1 +--- 'expires': 1167126975 +605 1 onegad_slice603 nodes= [3603, 3604, 3605, 603, 604, 605] persons= [2608, 2609, 2610] +--- sas= [] onegad_slice603 crp= 1 +--- 'expires': 1167126976 +606 1 onegae_slice604 nodes= [3604, 3605, 3606, 604, 605, 606] persons= [2609, 2610, 2611] +--- sas= [] onegae_slice604 crp= 1 +--- 'expires': 1167126976 +607 1 onegaf_slice605 nodes= [3605, 3606, 3607, 605, 606, 607] persons= [2610, 2611, 2612] +--- sas= [] onegaf_slice605 crp= 1 +--- 'expires': 1167126976 +608 1 onegag_slice606 nodes= [608, 3606, 3607, 3608, 606, 607] persons= [2611, 2612, 2613] +--- sas= [] onegag_slice606 crp= 1 +--- 'expires': 1167126977 +609 1 onegah_slice607 nodes= [608, 609, 3607, 3608, 3609, 607] persons= [2612, 2613, 2614] +--- sas= [] onegah_slice607 crp= 1 +--- 'expires': 1167126977 +610 1 onegai_slice608 nodes= [608, 609, 610, 3608, 3609, 3610] persons= [2613, 2614, 2615] +--- sas= [] onegai_slice608 crp= 1 +--- 'expires': 1167126977 +611 1 onegaj_slice609 nodes= [609, 610, 611, 3609, 3610, 3611] persons= [2616, 2614, 2615] +--- sas= [] onegaj_slice609 crp= 1 +--- 'expires': 1167126977 +612 1 onegba_slice610 nodes= [610, 611, 612, 3610, 3611, 3612] persons= [2616, 2617, 2615] +--- sas= [] onegba_slice610 crp= 1 +--- 'expires': 1167126978 +613 1 onegbb_slice611 nodes= [611, 612, 613, 3611, 3612, 3613] persons= [2616, 2617, 2618] +--- sas= [] onegbb_slice611 crp= 1 +--- 'expires': 1167126978 +614 1 onegbc_slice612 nodes= [612, 613, 614, 3612, 3613, 3614] persons= [2617, 2618, 2619] +--- sas= [] onegbc_slice612 crp= 1 +--- 'expires': 1167126978 +615 1 onegbd_slice613 nodes= [613, 614, 615, 3613, 3614, 3615] persons= [2618, 2619, 2620] +--- sas= [] onegbd_slice613 crp= 1 +--- 'expires': 1167126978 +616 1 onegbe_slice614 nodes= [3616, 614, 615, 616, 3614, 3615] persons= [2619, 2620, 2621] +--- sas= [] onegbe_slice614 crp= 1 +--- 'expires': 1167126979 +617 1 onegbf_slice615 nodes= [3616, 3617, 615, 616, 617, 3615] persons= [2620, 2621, 2622] +--- sas= [] onegbf_slice615 crp= 1 +--- 'expires': 1167126979 +618 1 onegbg_slice616 nodes= [3616, 3617, 3618, 616, 617, 618] persons= [2621, 2622, 2623] +--- sas= [] onegbg_slice616 crp= 1 +--- 'expires': 1167126979 +619 1 onegbh_slice617 nodes= [3617, 3618, 3619, 617, 618, 619] persons= [2624, 2622, 2623] +--- sas= [] onegbh_slice617 crp= 1 +--- 'expires': 1167126980 +620 1 onegbi_slice618 nodes= [3618, 3619, 3620, 618, 619, 620] persons= [2624, 2625, 2623] +--- sas= [] onegbi_slice618 crp= 1 +--- 'expires': 1167126980 +621 1 onegbj_slice619 nodes= [3619, 3620, 3621, 619, 620, 621] persons= [2624, 2625, 2626] +--- sas= [] onegbj_slice619 crp= 1 +--- 'expires': 1167126980 +622 1 onegca_slice620 nodes= [3620, 3621, 3622, 620, 621, 622] persons= [2625, 2626, 2627] +--- sas= [] onegca_slice620 crp= 1 +--- 'expires': 1167126980 +623 1 onegcb_slice621 nodes= [3621, 3622, 3623, 621, 622, 623] persons= [2626, 2627, 2628] +--- sas= [] onegcb_slice621 crp= 1 +--- 'expires': 1167126981 +624 1 onegcc_slice622 nodes= [3622, 3623, 3624, 622, 623, 624] persons= [2627, 2628, 2629] +--- sas= [] onegcc_slice622 crp= 1 +--- 'expires': 1167126981 +625 1 onegcd_slice623 nodes= [3623, 3624, 3625, 623, 624, 625] persons= [2628, 2629, 2630] +--- sas= [] onegcd_slice623 crp= 1 +--- 'expires': 1167126981 +626 1 onegce_slice624 nodes= [3624, 3625, 3626, 624, 625, 626] persons= [2629, 2630, 2631] +--- sas= [] onegce_slice624 crp= 1 +--- 'expires': 1167126982 +627 1 onegcf_slice625 nodes= [3625, 3626, 3627, 625, 626, 627] persons= [2632, 2630, 2631] +--- sas= [] onegcf_slice625 crp= 1 +--- 'expires': 1167126982 +628 1 onegcg_slice626 nodes= [3626, 3627, 3628, 626, 627, 628] persons= [2632, 2633, 2631] +--- sas= [] onegcg_slice626 crp= 1 +--- 'expires': 1167126982 +629 1 onegch_slice627 nodes= [3627, 3628, 3629, 627, 628, 629] persons= [2632, 2633, 2634] +--- sas= [] onegch_slice627 crp= 1 +--- 'expires': 1167126982 +630 1 onegci_slice628 nodes= [3628, 3629, 3630, 628, 629, 630] persons= [2633, 2634, 2635] +--- sas= [] onegci_slice628 crp= 1 +--- 'expires': 1167126983 +631 1 onegcj_slice629 nodes= [3629, 3630, 3631, 629, 630, 631] persons= [2634, 2635, 2636] +--- sas= [] onegcj_slice629 crp= 1 +--- 'expires': 1167126983 +632 1 onegda_slice630 nodes= [3630, 3631, 3632, 630, 631, 632] persons= [2635, 2636, 2637] +--- sas= [] onegda_slice630 crp= 1 +--- 'expires': 1167126983 +633 1 onegdb_slice631 nodes= [3631, 3632, 3633, 631, 632, 633] persons= [2636, 2637, 2638] +--- sas= [] onegdb_slice631 crp= 1 +--- 'expires': 1167126984 +634 1 onegdc_slice632 nodes= [3632, 3633, 3634, 632, 633, 634] persons= [2637, 2638, 2639] +--- sas= [] onegdc_slice632 crp= 1 +--- 'expires': 1167126984 +635 1 onegdd_slice633 nodes= [3633, 3634, 3635, 633, 634, 635] persons= [2640, 2638, 2639] +--- sas= [] onegdd_slice633 crp= 1 +--- 'expires': 1167126984 +636 1 onegde_slice634 nodes= [3634, 3635, 3636, 634, 635, 636] persons= [2640, 2641, 2639] +--- sas= [] onegde_slice634 crp= 1 +--- 'expires': 1167126984 +637 1 onegdf_slice635 nodes= [3635, 3636, 3637, 635, 636, 637] persons= [2640, 2641, 2642] +--- sas= [] onegdf_slice635 crp= 1 +--- 'expires': 1167126985 +638 1 onegdg_slice636 nodes= [3636, 3637, 3638, 636, 637, 638] persons= [2641, 2642, 2643] +--- sas= [] onegdg_slice636 crp= 1 +--- 'expires': 1167126985 +639 1 onegdh_slice637 nodes= [3637, 3638, 3639, 637, 638, 639] persons= [2642, 2643, 2644] +--- sas= [] onegdh_slice637 crp= 1 +--- 'expires': 1167126985 +640 1 onegdi_slice638 nodes= [640, 3638, 3639, 3640, 638, 639] persons= [2643, 2644, 2645] +--- sas= [] onegdi_slice638 crp= 1 +--- 'expires': 1167126986 +641 1 onegdj_slice639 nodes= [640, 641, 3639, 3640, 3641, 639] persons= [2644, 2645, 2646] +--- sas= [] onegdj_slice639 crp= 1 +--- 'expires': 1167126986 +642 1 onegea_slice640 nodes= [640, 641, 642, 3640, 3641, 3642] persons= [2645, 2646, 2647] +--- sas= [] onegea_slice640 crp= 1 +--- 'expires': 1167126986 +643 1 onegeb_slice641 nodes= [641, 642, 643, 3641, 3642, 3643] persons= [2648, 2646, 2647] +--- sas= [] onegeb_slice641 crp= 1 +--- 'expires': 1167126986 +644 1 onegec_slice642 nodes= [642, 643, 644, 3642, 3643, 3644] persons= [2648, 2649, 2647] +--- sas= [] onegec_slice642 crp= 1 +--- 'expires': 1167126987 +645 1 oneged_slice643 nodes= [643, 644, 645, 3643, 3644, 3645] persons= [2648, 2649, 2650] +--- sas= [] oneged_slice643 crp= 1 +--- 'expires': 1167126987 +646 1 onegee_slice644 nodes= [644, 645, 646, 3644, 3645, 3646] persons= [2649, 2650, 2651] +--- sas= [] onegee_slice644 crp= 1 +--- 'expires': 1167126987 +647 1 onegef_slice645 nodes= [645, 646, 647, 3645, 3646, 3647] persons= [2650, 2651, 2652] +--- sas= [] onegef_slice645 crp= 1 +--- 'expires': 1167126988 +648 1 onegeg_slice646 nodes= [3648, 646, 647, 648, 3646, 3647] persons= [2651, 2652, 2653] +--- sas= [] onegeg_slice646 crp= 1 +--- 'expires': 1167126988 +649 1 onegeh_slice647 nodes= [3648, 3649, 647, 648, 649, 3647] persons= [2652, 2653, 2654] +--- sas= [] onegeh_slice647 crp= 1 +--- 'expires': 1167126988 +650 1 onegei_slice648 nodes= [3648, 3649, 3650, 648, 649, 650] persons= [2653, 2654, 2655] +--- sas= [] onegei_slice648 crp= 1 +--- 'expires': 1167126988 +651 1 onegej_slice649 nodes= [3649, 3650, 3651, 649, 650, 651] persons= [2656, 2654, 2655] +--- sas= [] onegej_slice649 crp= 1 +--- 'expires': 1167126989 +652 1 onegfa_slice650 nodes= [3650, 3651, 3652, 650, 651, 652] persons= [2656, 2657, 2655] +--- sas= [] onegfa_slice650 crp= 1 +--- 'expires': 1167126989 +653 1 onegfb_slice651 nodes= [3651, 3652, 3653, 651, 652, 653] persons= [2656, 2657, 2658] +--- sas= [] onegfb_slice651 crp= 1 +--- 'expires': 1167126989 +654 1 onegfc_slice652 nodes= [3652, 3653, 3654, 652, 653, 654] persons= [2657, 2658, 2659] +--- sas= [] onegfc_slice652 crp= 1 +--- 'expires': 1167126990 +655 1 onegfd_slice653 nodes= [3653, 3654, 3655, 653, 654, 655] persons= [2658, 2659, 2660] +--- sas= [] onegfd_slice653 crp= 1 +--- 'expires': 1167126990 +656 1 onegfe_slice654 nodes= [3654, 3655, 3656, 654, 655, 656] persons= [2659, 2660, 2661] +--- sas= [] onegfe_slice654 crp= 1 +--- 'expires': 1167126990 +657 1 onegff_slice655 nodes= [3655, 3656, 3657, 655, 656, 657] persons= [2660, 2661, 2662] +--- sas= [] onegff_slice655 crp= 1 +--- 'expires': 1167126990 +658 1 onegfg_slice656 nodes= [3656, 3657, 3658, 656, 657, 658] persons= [2661, 2662, 2663] +--- sas= [] onegfg_slice656 crp= 1 +--- 'expires': 1167126991 +659 1 onegfh_slice657 nodes= [3657, 3658, 3659, 657, 658, 659] persons= [2664, 2662, 2663] +--- sas= [] onegfh_slice657 crp= 1 +--- 'expires': 1167126991 +660 1 onegfi_slice658 nodes= [3658, 3659, 3660, 658, 659, 660] persons= [2664, 2665, 2663] +--- sas= [] onegfi_slice658 crp= 1 +--- 'expires': 1167126991 +661 1 onegfj_slice659 nodes= [3659, 3660, 3661, 659, 660, 661] persons= [2664, 2665, 2666] +--- sas= [] onegfj_slice659 crp= 1 +--- 'expires': 1167126992 +662 1 onegga_slice660 nodes= [3660, 3661, 3662, 660, 661, 662] persons= [2665, 2666, 2667] +--- sas= [] onegga_slice660 crp= 1 +--- 'expires': 1167126992 +663 1 oneggb_slice661 nodes= [3661, 3662, 3663, 661, 662, 663] persons= [2666, 2667, 2668] +--- sas= [] oneggb_slice661 crp= 1 +--- 'expires': 1167126992 +664 1 oneggc_slice662 nodes= [3662, 3663, 3664, 662, 663, 664] persons= [2667, 2668, 2669] +--- sas= [] oneggc_slice662 crp= 1 +--- 'expires': 1167126992 +665 1 oneggd_slice663 nodes= [3663, 3664, 3665, 663, 664, 665] persons= [2668, 2669, 2670] +--- sas= [] oneggd_slice663 crp= 1 +--- 'expires': 1167126993 +666 1 onegge_slice664 nodes= [3664, 3665, 3666, 664, 665, 666] persons= [2669, 2670, 2671] +--- sas= [] onegge_slice664 crp= 1 +--- 'expires': 1167126993 +667 1 oneggf_slice665 nodes= [3665, 3666, 3667, 665, 666, 667] persons= [2672, 2670, 2671] +--- sas= [] oneggf_slice665 crp= 1 +--- 'expires': 1167126993 +668 1 oneggg_slice666 nodes= [3666, 3667, 3668, 666, 667, 668] persons= [2672, 2673, 2671] +--- sas= [] oneggg_slice666 crp= 1 +--- 'expires': 1167126994 +669 1 oneggh_slice667 nodes= [3667, 3668, 3669, 667, 668, 669] persons= [2672, 2673, 2674] +--- sas= [] oneggh_slice667 crp= 1 +--- 'expires': 1167126994 +670 1 oneggi_slice668 nodes= [3668, 3669, 3670, 668, 669, 670] persons= [2673, 2674, 2675] +--- sas= [] oneggi_slice668 crp= 1 +--- 'expires': 1167126994 +671 1 oneggj_slice669 nodes= [3669, 3670, 3671, 669, 670, 671] persons= [2674, 2675, 2676] +--- sas= [] oneggj_slice669 crp= 1 +--- 'expires': 1167126995 +672 1 onegha_slice670 nodes= [672, 3670, 3671, 3672, 670, 671] persons= [2675, 2676, 2677] +--- sas= [] onegha_slice670 crp= 1 +--- 'expires': 1167126995 +673 1 oneghb_slice671 nodes= [672, 673, 3671, 3672, 3673, 671] persons= [2676, 2677, 2678] +--- sas= [] oneghb_slice671 crp= 1 +--- 'expires': 1167126995 +674 1 oneghc_slice672 nodes= [672, 673, 674, 3672, 3673, 3674] persons= [2677, 2678, 2679] +--- sas= [] oneghc_slice672 crp= 1 +--- 'expires': 1167126995 +675 1 oneghd_slice673 nodes= [673, 674, 675, 3673, 3674, 3675] persons= [2680, 2678, 2679] +--- sas= [] oneghd_slice673 crp= 1 +--- 'expires': 1167126996 +676 1 oneghe_slice674 nodes= [674, 675, 676, 3674, 3675, 3676] persons= [2680, 2681, 2679] +--- sas= [] oneghe_slice674 crp= 1 +--- 'expires': 1167126996 +677 1 oneghf_slice675 nodes= [675, 676, 677, 3675, 3676, 3677] persons= [2680, 2681, 2682] +--- sas= [] oneghf_slice675 crp= 1 +--- 'expires': 1167126996 +678 1 oneghg_slice676 nodes= [676, 677, 678, 3676, 3677, 3678] persons= [2681, 2682, 2683] +--- sas= [] oneghg_slice676 crp= 1 +--- 'expires': 1167126997 +679 1 oneghh_slice677 nodes= [677, 678, 679, 3677, 3678, 3679] persons= [2682, 2683, 2684] +--- sas= [] oneghh_slice677 crp= 1 +--- 'expires': 1167126997 +680 1 oneghi_slice678 nodes= [3680, 678, 679, 680, 3678, 3679] persons= [2683, 2684, 2685] +--- sas= [] oneghi_slice678 crp= 1 +--- 'expires': 1167126997 +681 1 oneghj_slice679 nodes= [3680, 3681, 679, 680, 681, 3679] persons= [2684, 2685, 2686] +--- sas= [] oneghj_slice679 crp= 1 +--- 'expires': 1167126997 +682 1 onegia_slice680 nodes= [3680, 3681, 3682, 680, 681, 682] persons= [2685, 2686, 2687] +--- sas= [] onegia_slice680 crp= 1 +--- 'expires': 1167126998 +683 1 onegib_slice681 nodes= [3681, 3682, 3683, 681, 682, 683] persons= [2688, 2686, 2687] +--- sas= [] onegib_slice681 crp= 1 +--- 'expires': 1167126998 +684 1 onegic_slice682 nodes= [3682, 3683, 3684, 682, 683, 684] persons= [2688, 2689, 2687] +--- sas= [] onegic_slice682 crp= 1 +--- 'expires': 1167126998 +685 1 onegid_slice683 nodes= [3683, 3684, 3685, 683, 684, 685] persons= [2688, 2689, 2690] +--- sas= [] onegid_slice683 crp= 1 +--- 'expires': 1167126999 +686 1 onegie_slice684 nodes= [3684, 3685, 3686, 684, 685, 686] persons= [2689, 2690, 2691] +--- sas= [] onegie_slice684 crp= 1 +--- 'expires': 1167126999 +687 1 onegif_slice685 nodes= [3685, 3686, 3687, 685, 686, 687] persons= [2690, 2691, 2692] +--- sas= [] onegif_slice685 crp= 1 +--- 'expires': 1167126999 +688 1 onegig_slice686 nodes= [3686, 3687, 3688, 686, 687, 688] persons= [2691, 2692, 2693] +--- sas= [] onegig_slice686 crp= 1 +--- 'expires': 1167126999 +689 1 onegih_slice687 nodes= [3687, 3688, 3689, 687, 688, 689] persons= [2692, 2693, 2694] +--- sas= [] onegih_slice687 crp= 1 +--- 'expires': 1167127000 +690 1 onegii_slice688 nodes= [3688, 3689, 3690, 688, 689, 690] persons= [2693, 2694, 2695] +--- sas= [] onegii_slice688 crp= 1 +--- 'expires': 1167127000 +691 1 onegij_slice689 nodes= [3689, 3690, 3691, 689, 690, 691] persons= [2696, 2694, 2695] +--- sas= [] onegij_slice689 crp= 1 +--- 'expires': 1167127000 +692 1 onegja_slice690 nodes= [3690, 3691, 3692, 690, 691, 692] persons= [2696, 2697, 2695] +--- sas= [] onegja_slice690 crp= 1 +--- 'expires': 1167127001 +693 1 onegjb_slice691 nodes= [3691, 3692, 3693, 691, 692, 693] persons= [2696, 2697, 2698] +--- sas= [] onegjb_slice691 crp= 1 +--- 'expires': 1167127001 +694 1 onegjc_slice692 nodes= [3692, 3693, 3694, 692, 693, 694] persons= [2697, 2698, 2699] +--- sas= [] onegjc_slice692 crp= 1 +--- 'expires': 1167127001 +695 1 onegjd_slice693 nodes= [3693, 3694, 3695, 693, 694, 695] persons= [2698, 2699, 2700] +--- sas= [] onegjd_slice693 crp= 1 +--- 'expires': 1167127002 +696 1 onegje_slice694 nodes= [3694, 3695, 3696, 694, 695, 696] persons= [2699, 2700, 2701] +--- sas= [] onegje_slice694 crp= 1 +--- 'expires': 1167127002 +697 1 onegjf_slice695 nodes= [3695, 3696, 3697, 695, 696, 697] persons= [2700, 2701, 2702] +--- sas= [] onegjf_slice695 crp= 1 +--- 'expires': 1167127002 +698 1 onegjg_slice696 nodes= [3696, 3697, 3698, 696, 697, 698] persons= [2701, 2702, 2703] +--- sas= [] onegjg_slice696 crp= 1 +--- 'expires': 1167127002 +699 1 onegjh_slice697 nodes= [3697, 3698, 3699, 697, 698, 699] persons= [2704, 2702, 2703] +--- sas= [] onegjh_slice697 crp= 1 +--- 'expires': 1167127003 +700 1 onegji_slice698 nodes= [3698, 3699, 3700, 698, 699, 700] persons= [2704, 2705, 2703] +--- sas= [] onegji_slice698 crp= 1 +--- 'expires': 1167127003 +701 1 onegjj_slice699 nodes= [3699, 3700, 3701, 699, 700, 701] persons= [2704, 2705, 2706] +--- sas= [] onegjj_slice699 crp= 1 +--- 'expires': 1167127003 +702 1 onehaa_slice700 nodes= [3700, 3701, 3702, 700, 701, 702] persons= [2705, 2706, 2707] +--- sas= [] onehaa_slice700 crp= 1 +--- 'expires': 1167127004 +703 1 onehab_slice701 nodes= [3701, 3702, 3703, 701, 702, 703] persons= [2706, 2707, 2708] +--- sas= [] onehab_slice701 crp= 1 +--- 'expires': 1167127004 +704 1 onehac_slice702 nodes= [704, 3702, 3703, 3704, 702, 703] persons= [2707, 2708, 2709] +--- sas= [] onehac_slice702 crp= 1 +--- 'expires': 1167127004 +705 1 onehad_slice703 nodes= [704, 705, 3703, 3704, 3705, 703] persons= [2708, 2709, 2710] +--- sas= [] onehad_slice703 crp= 1 +--- 'expires': 1167127004 +706 1 onehae_slice704 nodes= [704, 705, 706, 3704, 3705, 3706] persons= [2709, 2710, 2711] +--- sas= [] onehae_slice704 crp= 1 +--- 'expires': 1167127005 +707 1 onehaf_slice705 nodes= [705, 706, 707, 3705, 3706, 3707] persons= [2712, 2710, 2711] +--- sas= [] onehaf_slice705 crp= 1 +--- 'expires': 1167127005 +708 1 onehag_slice706 nodes= [706, 707, 708, 3706, 3707, 3708] persons= [2712, 2713, 2711] +--- sas= [] onehag_slice706 crp= 1 +--- 'expires': 1167127005 +709 1 onehah_slice707 nodes= [707, 708, 709, 3707, 3708, 3709] persons= [2712, 2713, 2714] +--- sas= [] onehah_slice707 crp= 1 +--- 'expires': 1167127006 +710 1 onehai_slice708 nodes= [708, 709, 710, 3708, 3709, 3710] persons= [2713, 2714, 2715] +--- sas= [] onehai_slice708 crp= 1 +--- 'expires': 1167127006 +711 1 onehaj_slice709 nodes= [709, 710, 711, 3709, 3710, 3711] persons= [2714, 2715, 2716] +--- sas= [] onehaj_slice709 crp= 1 +--- 'expires': 1167127006 +712 1 onehba_slice710 nodes= [3712, 710, 711, 712, 3710, 3711] persons= [2715, 2716, 2717] +--- sas= [] onehba_slice710 crp= 1 +--- 'expires': 1167127007 +713 1 onehbb_slice711 nodes= [3712, 3713, 711, 712, 713, 3711] persons= [2716, 2717, 2718] +--- sas= [] onehbb_slice711 crp= 1 +--- 'expires': 1167127007 +714 1 onehbc_slice712 nodes= [3712, 3713, 3714, 712, 713, 714] persons= [2717, 2718, 2719] +--- sas= [] onehbc_slice712 crp= 1 +--- 'expires': 1167127007 +715 1 onehbd_slice713 nodes= [3713, 3714, 3715, 713, 714, 715] persons= [2720, 2718, 2719] +--- sas= [] onehbd_slice713 crp= 1 +--- 'expires': 1167127007 +716 1 onehbe_slice714 nodes= [3714, 3715, 3716, 714, 715, 716] persons= [2720, 2721, 2719] +--- sas= [] onehbe_slice714 crp= 1 +--- 'expires': 1167127008 +717 1 onehbf_slice715 nodes= [3715, 3716, 3717, 715, 716, 717] persons= [2720, 2721, 2722] +--- sas= [] onehbf_slice715 crp= 1 +--- 'expires': 1167127008 +718 1 onehbg_slice716 nodes= [3716, 3717, 3718, 716, 717, 718] persons= [2721, 2722, 2723] +--- sas= [] onehbg_slice716 crp= 1 +--- 'expires': 1167127008 +719 1 onehbh_slice717 nodes= [3717, 3718, 3719, 717, 718, 719] persons= [2722, 2723, 2724] +--- sas= [] onehbh_slice717 crp= 1 +--- 'expires': 1167127009 +720 1 onehbi_slice718 nodes= [3718, 3719, 3720, 718, 719, 720] persons= [2723, 2724, 2725] +--- sas= [] onehbi_slice718 crp= 1 +--- 'expires': 1167127009 +721 1 onehbj_slice719 nodes= [3719, 3720, 3721, 719, 720, 721] persons= [2724, 2725, 2726] +--- sas= [] onehbj_slice719 crp= 1 +--- 'expires': 1167127009 +722 1 onehca_slice720 nodes= [3720, 3721, 3722, 720, 721, 722] persons= [2725, 2726, 2727] +--- sas= [] onehca_slice720 crp= 1 +--- 'expires': 1167127010 +723 1 onehcb_slice721 nodes= [3721, 3722, 3723, 721, 722, 723] persons= [2728, 2726, 2727] +--- sas= [] onehcb_slice721 crp= 1 +--- 'expires': 1167127010 +724 1 onehcc_slice722 nodes= [3722, 3723, 3724, 722, 723, 724] persons= [2728, 2729, 2727] +--- sas= [] onehcc_slice722 crp= 1 +--- 'expires': 1167127010 +725 1 onehcd_slice723 nodes= [3723, 3724, 3725, 723, 724, 725] persons= [2728, 2729, 2730] +--- sas= [] onehcd_slice723 crp= 1 +--- 'expires': 1167127010 +726 1 onehce_slice724 nodes= [3724, 3725, 3726, 724, 725, 726] persons= [2729, 2730, 2731] +--- sas= [] onehce_slice724 crp= 1 +--- 'expires': 1167127011 +727 1 onehcf_slice725 nodes= [3725, 3726, 3727, 725, 726, 727] persons= [2730, 2731, 2732] +--- sas= [] onehcf_slice725 crp= 1 +--- 'expires': 1167127011 +728 1 onehcg_slice726 nodes= [3726, 3727, 3728, 726, 727, 728] persons= [2731, 2732, 2733] +--- sas= [] onehcg_slice726 crp= 1 +--- 'expires': 1167127011 +729 1 onehch_slice727 nodes= [3727, 3728, 3729, 727, 728, 729] persons= [2732, 2733, 2734] +--- sas= [] onehch_slice727 crp= 1 +--- 'expires': 1167127012 +730 1 onehci_slice728 nodes= [3728, 3729, 3730, 728, 729, 730] persons= [2733, 2734, 2735] +--- sas= [] onehci_slice728 crp= 1 +--- 'expires': 1167127012 +731 1 onehcj_slice729 nodes= [3729, 3730, 3731, 729, 730, 731] persons= [2736, 2734, 2735] +--- sas= [] onehcj_slice729 crp= 1 +--- 'expires': 1167127012 +732 1 onehda_slice730 nodes= [3730, 3731, 3732, 730, 731, 732] persons= [2736, 2737, 2735] +--- sas= [] onehda_slice730 crp= 1 +--- 'expires': 1167127013 +733 1 onehdb_slice731 nodes= [3731, 3732, 3733, 731, 732, 733] persons= [2736, 2737, 2738] +--- sas= [] onehdb_slice731 crp= 1 +--- 'expires': 1167127013 +734 1 onehdc_slice732 nodes= [3732, 3733, 3734, 732, 733, 734] persons= [2737, 2738, 2739] +--- sas= [] onehdc_slice732 crp= 1 +--- 'expires': 1167127013 +735 1 onehdd_slice733 nodes= [3733, 3734, 3735, 733, 734, 735] persons= [2738, 2739, 2740] +--- sas= [] onehdd_slice733 crp= 1 +--- 'expires': 1167127013 +736 1 onehde_slice734 nodes= [736, 3734, 3735, 3736, 734, 735] persons= [2739, 2740, 2741] +--- sas= [] onehde_slice734 crp= 1 +--- 'expires': 1167127014 +737 1 onehdf_slice735 nodes= [736, 737, 3735, 3736, 3737, 735] persons= [2740, 2741, 2742] +--- sas= [] onehdf_slice735 crp= 1 +--- 'expires': 1167127014 +738 1 onehdg_slice736 nodes= [736, 737, 738, 3736, 3737, 3738] persons= [2741, 2742, 2743] +--- sas= [] onehdg_slice736 crp= 1 +--- 'expires': 1167127014 +739 1 onehdh_slice737 nodes= [737, 738, 739, 3737, 3738, 3739] persons= [2744, 2742, 2743] +--- sas= [] onehdh_slice737 crp= 1 +--- 'expires': 1167127015 +740 1 onehdi_slice738 nodes= [738, 739, 740, 3738, 3739, 3740] persons= [2744, 2745, 2743] +--- sas= [] onehdi_slice738 crp= 1 +--- 'expires': 1167127015 +741 1 onehdj_slice739 nodes= [739, 740, 741, 3739, 3740, 3741] persons= [2744, 2745, 2746] +--- sas= [] onehdj_slice739 crp= 1 +--- 'expires': 1167127015 +742 1 onehea_slice740 nodes= [740, 741, 742, 3740, 3741, 3742] persons= [2745, 2746, 2747] +--- sas= [] onehea_slice740 crp= 1 +--- 'expires': 1167127016 +743 1 oneheb_slice741 nodes= [741, 742, 743, 3741, 3742, 3743] persons= [2746, 2747, 2748] +--- sas= [] oneheb_slice741 crp= 1 +--- 'expires': 1167127016 +744 1 onehec_slice742 nodes= [3744, 742, 743, 744, 3742, 3743] persons= [2747, 2748, 2749] +--- sas= [] onehec_slice742 crp= 1 +--- 'expires': 1167127016 +745 1 onehed_slice743 nodes= [3744, 3745, 743, 744, 745, 3743] persons= [2748, 2749, 2750] +--- sas= [] onehed_slice743 crp= 1 +--- 'expires': 1167127016 +746 1 onehee_slice744 nodes= [3744, 3745, 3746, 744, 745, 746] persons= [2749, 2750, 2751] +--- sas= [] onehee_slice744 crp= 1 +--- 'expires': 1167127017 +747 1 onehef_slice745 nodes= [3745, 3746, 3747, 745, 746, 747] persons= [2752, 2750, 2751] +--- sas= [] onehef_slice745 crp= 1 +--- 'expires': 1167127017 +748 1 oneheg_slice746 nodes= [3746, 3747, 3748, 746, 747, 748] persons= [2752, 2753, 2751] +--- sas= [] oneheg_slice746 crp= 1 +--- 'expires': 1167127017 +749 1 oneheh_slice747 nodes= [3747, 3748, 3749, 747, 748, 749] persons= [2752, 2753, 2754] +--- sas= [] oneheh_slice747 crp= 1 +--- 'expires': 1167127018 +750 1 onehei_slice748 nodes= [3748, 3749, 3750, 748, 749, 750] persons= [2753, 2754, 2755] +--- sas= [] onehei_slice748 crp= 1 +--- 'expires': 1167127018 +751 1 onehej_slice749 nodes= [3749, 3750, 3751, 749, 750, 751] persons= [2754, 2755, 2756] +--- sas= [] onehej_slice749 crp= 1 +--- 'expires': 1167127018 +752 1 onehfa_slice750 nodes= [3750, 3751, 3752, 750, 751, 752] persons= [2755, 2756, 2757] +--- sas= [] onehfa_slice750 crp= 1 +--- 'expires': 1167127019 +753 1 onehfb_slice751 nodes= [3751, 3752, 3753, 751, 752, 753] persons= [2756, 2757, 2758] +--- sas= [] onehfb_slice751 crp= 1 +--- 'expires': 1167127019 +754 1 onehfc_slice752 nodes= [3752, 3753, 3754, 752, 753, 754] persons= [2757, 2758, 2759] +--- sas= [] onehfc_slice752 crp= 1 +--- 'expires': 1167127019 +755 1 onehfd_slice753 nodes= [3753, 3754, 3755, 753, 754, 755] persons= [2760, 2758, 2759] +--- sas= [] onehfd_slice753 crp= 1 +--- 'expires': 1167127019 +756 1 onehfe_slice754 nodes= [3754, 3755, 3756, 754, 755, 756] persons= [2760, 2761, 2759] +--- sas= [] onehfe_slice754 crp= 1 +--- 'expires': 1167127020 +757 1 onehff_slice755 nodes= [3755, 3756, 3757, 755, 756, 757] persons= [2760, 2761, 2762] +--- sas= [] onehff_slice755 crp= 1 +--- 'expires': 1167127020 +758 1 onehfg_slice756 nodes= [3756, 3757, 3758, 756, 757, 758] persons= [2761, 2762, 2763] +--- sas= [] onehfg_slice756 crp= 1 +--- 'expires': 1167127020 +759 1 onehfh_slice757 nodes= [3757, 3758, 3759, 757, 758, 759] persons= [2762, 2763, 2764] +--- sas= [] onehfh_slice757 crp= 1 +--- 'expires': 1167127021 +760 1 onehfi_slice758 nodes= [3758, 3759, 3760, 758, 759, 760] persons= [2763, 2764, 2765] +--- sas= [] onehfi_slice758 crp= 1 +--- 'expires': 1167127021 +761 1 onehfj_slice759 nodes= [3759, 3760, 3761, 759, 760, 761] persons= [2764, 2765, 2766] +--- sas= [] onehfj_slice759 crp= 1 +--- 'expires': 1167127021 +762 1 onehga_slice760 nodes= [3760, 3761, 3762, 760, 761, 762] persons= [2765, 2766, 2767] +--- sas= [] onehga_slice760 crp= 1 +--- 'expires': 1167127022 +763 1 onehgb_slice761 nodes= [3761, 3762, 3763, 761, 762, 763] persons= [2768, 2766, 2767] +--- sas= [] onehgb_slice761 crp= 1 +--- 'expires': 1167127022 +764 1 onehgc_slice762 nodes= [3762, 3763, 3764, 762, 763, 764] persons= [2768, 2769, 2767] +--- sas= [] onehgc_slice762 crp= 1 +--- 'expires': 1167127022 +765 1 onehgd_slice763 nodes= [3763, 3764, 3765, 763, 764, 765] persons= [2768, 2769, 2770] +--- sas= [] onehgd_slice763 crp= 1 +--- 'expires': 1167127023 +766 1 onehge_slice764 nodes= [3764, 3765, 3766, 764, 765, 766] persons= [2769, 2770, 2771] +--- sas= [] onehge_slice764 crp= 1 +--- 'expires': 1167127023 +767 1 onehgf_slice765 nodes= [3765, 3766, 3767, 765, 766, 767] persons= [2770, 2771, 2772] +--- sas= [] onehgf_slice765 crp= 1 +--- 'expires': 1167127023 +768 1 onehgg_slice766 nodes= [768, 3766, 3767, 3768, 766, 767] persons= [2771, 2772, 2773] +--- sas= [] onehgg_slice766 crp= 1 +--- 'expires': 1167127023 +769 1 onehgh_slice767 nodes= [768, 769, 3767, 3768, 3769, 767] persons= [2772, 2773, 2774] +--- sas= [] onehgh_slice767 crp= 1 +--- 'expires': 1167127024 +770 1 onehgi_slice768 nodes= [768, 769, 770, 3768, 3769, 3770] persons= [2773, 2774, 2775] +--- sas= [] onehgi_slice768 crp= 1 +--- 'expires': 1167127024 +771 1 onehgj_slice769 nodes= [769, 770, 771, 3769, 3770, 3771] persons= [2776, 2774, 2775] +--- sas= [] onehgj_slice769 crp= 1 +--- 'expires': 1167127024 +772 1 onehha_slice770 nodes= [770, 771, 772, 3770, 3771, 3772] persons= [2776, 2777, 2775] +--- sas= [] onehha_slice770 crp= 1 +--- 'expires': 1167127025 +773 1 onehhb_slice771 nodes= [771, 772, 773, 3771, 3772, 3773] persons= [2776, 2777, 2778] +--- sas= [] onehhb_slice771 crp= 1 +--- 'expires': 1167127025 +774 1 onehhc_slice772 nodes= [772, 773, 774, 3772, 3773, 3774] persons= [2777, 2778, 2779] +--- sas= [] onehhc_slice772 crp= 1 +--- 'expires': 1167127025 +775 1 onehhd_slice773 nodes= [773, 774, 775, 3773, 3774, 3775] persons= [2778, 2779, 2780] +--- sas= [] onehhd_slice773 crp= 1 +--- 'expires': 1167127026 +776 1 onehhe_slice774 nodes= [3776, 774, 775, 776, 3774, 3775] persons= [2779, 2780, 2781] +--- sas= [] onehhe_slice774 crp= 1 +--- 'expires': 1167127026 +777 1 onehhf_slice775 nodes= [3776, 3777, 775, 776, 777, 3775] persons= [2780, 2781, 2782] +--- sas= [] onehhf_slice775 crp= 1 +--- 'expires': 1167127026 +778 1 onehhg_slice776 nodes= [3776, 3777, 3778, 776, 777, 778] persons= [2781, 2782, 2783] +--- sas= [] onehhg_slice776 crp= 1 +--- 'expires': 1167127027 +779 1 onehhh_slice777 nodes= [3777, 3778, 3779, 777, 778, 779] persons= [2784, 2782, 2783] +--- sas= [] onehhh_slice777 crp= 1 +--- 'expires': 1167127027 +780 1 onehhi_slice778 nodes= [3778, 3779, 3780, 778, 779, 780] persons= [2784, 2785, 2783] +--- sas= [] onehhi_slice778 crp= 1 +--- 'expires': 1167127027 +781 1 onehhj_slice779 nodes= [3779, 3780, 3781, 779, 780, 781] persons= [2784, 2785, 2786] +--- sas= [] onehhj_slice779 crp= 1 +--- 'expires': 1167127027 +782 1 onehia_slice780 nodes= [3780, 3781, 3782, 780, 781, 782] persons= [2785, 2786, 2787] +--- sas= [] onehia_slice780 crp= 1 +--- 'expires': 1167127028 +783 1 onehib_slice781 nodes= [3781, 3782, 3783, 781, 782, 783] persons= [2786, 2787, 2788] +--- sas= [] onehib_slice781 crp= 1 +--- 'expires': 1167127028 +784 1 onehic_slice782 nodes= [3782, 3783, 3784, 782, 783, 784] persons= [2787, 2788, 2789] +--- sas= [] onehic_slice782 crp= 1 +--- 'expires': 1167127028 +785 1 onehid_slice783 nodes= [3783, 3784, 3785, 783, 784, 785] persons= [2788, 2789, 2790] +--- sas= [] onehid_slice783 crp= 1 +--- 'expires': 1167127029 +786 1 onehie_slice784 nodes= [3784, 3785, 3786, 784, 785, 786] persons= [2789, 2790, 2791] +--- sas= [] onehie_slice784 crp= 1 +--- 'expires': 1167127029 +787 1 onehif_slice785 nodes= [3785, 3786, 3787, 785, 786, 787] persons= [2792, 2790, 2791] +--- sas= [] onehif_slice785 crp= 1 +--- 'expires': 1167127029 +788 1 onehig_slice786 nodes= [3786, 3787, 3788, 786, 787, 788] persons= [2792, 2793, 2791] +--- sas= [] onehig_slice786 crp= 1 +--- 'expires': 1167127030 +789 1 onehih_slice787 nodes= [3787, 3788, 3789, 787, 788, 789] persons= [2792, 2793, 2794] +--- sas= [] onehih_slice787 crp= 1 +--- 'expires': 1167127030 +790 1 onehii_slice788 nodes= [3788, 3789, 3790, 788, 789, 790] persons= [2793, 2794, 2795] +--- sas= [] onehii_slice788 crp= 1 +--- 'expires': 1167127030 +791 1 onehij_slice789 nodes= [3789, 3790, 3791, 789, 790, 791] persons= [2794, 2795, 2796] +--- sas= [] onehij_slice789 crp= 1 +--- 'expires': 1167127031 +792 1 onehja_slice790 nodes= [3790, 3791, 3792, 790, 791, 792] persons= [2795, 2796, 2797] +--- sas= [] onehja_slice790 crp= 1 +--- 'expires': 1167127031 +793 1 onehjb_slice791 nodes= [3791, 3792, 3793, 791, 792, 793] persons= [2796, 2797, 2798] +--- sas= [] onehjb_slice791 crp= 1 +--- 'expires': 1167127031 +794 1 onehjc_slice792 nodes= [3792, 3793, 3794, 792, 793, 794] persons= [2797, 2798, 2799] +--- sas= [] onehjc_slice792 crp= 1 +--- 'expires': 1167127031 +795 1 onehjd_slice793 nodes= [3793, 3794, 3795, 793, 794, 795] persons= [2800, 2798, 2799] +--- sas= [] onehjd_slice793 crp= 1 +--- 'expires': 1167127032 +796 1 onehje_slice794 nodes= [3794, 3795, 3796, 794, 795, 796] persons= [2800, 2801, 2799] +--- sas= [] onehje_slice794 crp= 1 +--- 'expires': 1167127032 +797 1 onehjf_slice795 nodes= [3795, 3796, 3797, 795, 796, 797] persons= [2800, 2801, 2802] +--- sas= [] onehjf_slice795 crp= 1 +--- 'expires': 1167127032 +798 1 onehjg_slice796 nodes= [3796, 3797, 3798, 796, 797, 798] persons= [2801, 2802, 2803] +--- sas= [] onehjg_slice796 crp= 1 +--- 'expires': 1167127033 +799 1 onehjh_slice797 nodes= [3797, 3798, 3799, 797, 798, 799] persons= [2802, 2803, 2804] +--- sas= [] onehjh_slice797 crp= 1 +--- 'expires': 1167127033 +800 1 onehji_slice798 nodes= [800, 3798, 3799, 3800, 798, 799] persons= [2803, 2804, 2805] +--- sas= [] onehji_slice798 crp= 1 +--- 'expires': 1167127033 +801 1 onehjj_slice799 nodes= [800, 801, 3799, 3800, 3801, 799] persons= [2804, 2805, 2806] +--- sas= [] onehjj_slice799 crp= 1 +--- 'expires': 1167127034 +802 1 oneiaa_slice800 nodes= [800, 801, 802, 3800, 3801, 3802] persons= [2805, 2806, 2807] +--- sas= [] oneiaa_slice800 crp= 1 +--- 'expires': 1167127034 +803 1 oneiab_slice801 nodes= [801, 802, 803, 3801, 3802, 3803] persons= [2808, 2806, 2807] +--- sas= [] oneiab_slice801 crp= 1 +--- 'expires': 1167127034 +804 1 oneiac_slice802 nodes= [802, 803, 804, 3802, 3803, 3804] persons= [2808, 2809, 2807] +--- sas= [] oneiac_slice802 crp= 1 +--- 'expires': 1167127035 +805 1 oneiad_slice803 nodes= [803, 804, 805, 3803, 3804, 3805] persons= [2808, 2809, 2810] +--- sas= [] oneiad_slice803 crp= 1 +--- 'expires': 1167127035 +806 1 oneiae_slice804 nodes= [804, 805, 806, 3804, 3805, 3806] persons= [2809, 2810, 2811] +--- sas= [] oneiae_slice804 crp= 1 +--- 'expires': 1167127035 +807 1 oneiaf_slice805 nodes= [805, 806, 807, 3805, 3806, 3807] persons= [2810, 2811, 2812] +--- sas= [] oneiaf_slice805 crp= 1 +--- 'expires': 1167127036 +808 1 oneiag_slice806 nodes= [3808, 806, 807, 808, 3806, 3807] persons= [2811, 2812, 2813] +--- sas= [] oneiag_slice806 crp= 1 +--- 'expires': 1167127036 +809 1 oneiah_slice807 nodes= [3808, 3809, 807, 808, 809, 3807] persons= [2812, 2813, 2814] +--- sas= [] oneiah_slice807 crp= 1 +--- 'expires': 1167127036 +810 1 oneiai_slice808 nodes= [3808, 3809, 3810, 808, 809, 810] persons= [2813, 2814, 2815] +--- sas= [] oneiai_slice808 crp= 1 +--- 'expires': 1167127036 +811 1 oneiaj_slice809 nodes= [3809, 3810, 3811, 809, 810, 811] persons= [2816, 2814, 2815] +--- sas= [] oneiaj_slice809 crp= 1 +--- 'expires': 1167127037 +812 1 oneiba_slice810 nodes= [3810, 3811, 3812, 810, 811, 812] persons= [2816, 2817, 2815] +--- sas= [] oneiba_slice810 crp= 1 +--- 'expires': 1167127037 +813 1 oneibb_slice811 nodes= [3811, 3812, 3813, 811, 812, 813] persons= [2816, 2817, 2818] +--- sas= [] oneibb_slice811 crp= 1 +--- 'expires': 1167127037 +814 1 oneibc_slice812 nodes= [3812, 3813, 3814, 812, 813, 814] persons= [2817, 2818, 2819] +--- sas= [] oneibc_slice812 crp= 1 +--- 'expires': 1167127038 +815 1 oneibd_slice813 nodes= [3813, 3814, 3815, 813, 814, 815] persons= [2818, 2819, 2820] +--- sas= [] oneibd_slice813 crp= 1 +--- 'expires': 1167127038 +816 1 oneibe_slice814 nodes= [3814, 3815, 3816, 814, 815, 816] persons= [2819, 2820, 2821] +--- sas= [] oneibe_slice814 crp= 1 +--- 'expires': 1167127038 +817 1 oneibf_slice815 nodes= [3815, 3816, 3817, 815, 816, 817] persons= [2820, 2821, 2822] +--- sas= [] oneibf_slice815 crp= 1 +--- 'expires': 1167127039 +818 1 oneibg_slice816 nodes= [3816, 3817, 3818, 816, 817, 818] persons= [2821, 2822, 2823] +--- sas= [] oneibg_slice816 crp= 1 +--- 'expires': 1167127039 +819 1 oneibh_slice817 nodes= [3817, 3818, 3819, 817, 818, 819] persons= [2824, 2822, 2823] +--- sas= [] oneibh_slice817 crp= 1 +--- 'expires': 1167127039 +820 1 oneibi_slice818 nodes= [3818, 3819, 3820, 818, 819, 820] persons= [2824, 2825, 2823] +--- sas= [] oneibi_slice818 crp= 1 +--- 'expires': 1167127040 +821 1 oneibj_slice819 nodes= [3819, 3820, 3821, 819, 820, 821] persons= [2824, 2825, 2826] +--- sas= [] oneibj_slice819 crp= 1 +--- 'expires': 1167127040 +822 1 oneica_slice820 nodes= [3820, 3821, 3822, 820, 821, 822] persons= [2825, 2826, 2827] +--- sas= [] oneica_slice820 crp= 1 +--- 'expires': 1167127040 +823 1 oneicb_slice821 nodes= [3821, 3822, 3823, 821, 822, 823] persons= [2826, 2827, 2828] +--- sas= [] oneicb_slice821 crp= 1 +--- 'expires': 1167127041 +824 1 oneicc_slice822 nodes= [3822, 3823, 3824, 822, 823, 824] persons= [2827, 2828, 2829] +--- sas= [] oneicc_slice822 crp= 1 +--- 'expires': 1167127041 +825 1 oneicd_slice823 nodes= [3823, 3824, 3825, 823, 824, 825] persons= [2828, 2829, 2830] +--- sas= [] oneicd_slice823 crp= 1 +--- 'expires': 1167127041 +826 1 oneice_slice824 nodes= [3824, 3825, 3826, 824, 825, 826] persons= [2829, 2830, 2831] +--- sas= [] oneice_slice824 crp= 1 +--- 'expires': 1167127042 +827 1 oneicf_slice825 nodes= [3825, 3826, 3827, 825, 826, 827] persons= [2832, 2830, 2831] +--- sas= [] oneicf_slice825 crp= 1 +--- 'expires': 1167127042 +828 1 oneicg_slice826 nodes= [3826, 3827, 3828, 826, 827, 828] persons= [2832, 2833, 2831] +--- sas= [] oneicg_slice826 crp= 1 +--- 'expires': 1167127042 +829 1 oneich_slice827 nodes= [3827, 3828, 3829, 827, 828, 829] persons= [2832, 2833, 2834] +--- sas= [] oneich_slice827 crp= 1 +--- 'expires': 1167127042 +830 1 oneici_slice828 nodes= [3828, 3829, 3830, 828, 829, 830] persons= [2833, 2834, 2835] +--- sas= [] oneici_slice828 crp= 1 +--- 'expires': 1167127043 +831 1 oneicj_slice829 nodes= [3829, 3830, 3831, 829, 830, 831] persons= [2834, 2835, 2836] +--- sas= [] oneicj_slice829 crp= 1 +--- 'expires': 1167127043 +832 1 oneida_slice830 nodes= [832, 3830, 3831, 3832, 830, 831] persons= [2835, 2836, 2837] +--- sas= [] oneida_slice830 crp= 1 +--- 'expires': 1167127043 +833 1 oneidb_slice831 nodes= [832, 833, 3831, 3832, 3833, 831] persons= [2836, 2837, 2838] +--- sas= [] oneidb_slice831 crp= 1 +--- 'expires': 1167127044 +834 1 oneidc_slice832 nodes= [832, 833, 834, 3832, 3833, 3834] persons= [2837, 2838, 2839] +--- sas= [] oneidc_slice832 crp= 1 +--- 'expires': 1167127044 +835 1 oneidd_slice833 nodes= [833, 834, 835, 3833, 3834, 3835] persons= [2840, 2838, 2839] +--- sas= [] oneidd_slice833 crp= 1 +--- 'expires': 1167127044 +836 1 oneide_slice834 nodes= [834, 835, 836, 3834, 3835, 3836] persons= [2840, 2841, 2839] +--- sas= [] oneide_slice834 crp= 1 +--- 'expires': 1167127045 +837 1 oneidf_slice835 nodes= [835, 836, 837, 3835, 3836, 3837] persons= [2840, 2841, 2842] +--- sas= [] oneidf_slice835 crp= 1 +--- 'expires': 1167127045 +838 1 oneidg_slice836 nodes= [836, 837, 838, 3836, 3837, 3838] persons= [2841, 2842, 2843] +--- sas= [] oneidg_slice836 crp= 1 +--- 'expires': 1167127045 +839 1 oneidh_slice837 nodes= [837, 838, 839, 3837, 3838, 3839] persons= [2842, 2843, 2844] +--- sas= [] oneidh_slice837 crp= 1 +--- 'expires': 1167127046 +840 1 oneidi_slice838 nodes= [3840, 838, 839, 840, 3838, 3839] persons= [2843, 2844, 2845] +--- sas= [] oneidi_slice838 crp= 1 +--- 'expires': 1167127046 +841 1 oneidj_slice839 nodes= [3840, 3841, 839, 840, 841, 3839] persons= [2844, 2845, 2846] +--- sas= [] oneidj_slice839 crp= 1 +--- 'expires': 1167127046 +842 1 oneiea_slice840 nodes= [3840, 3841, 3842, 840, 841, 842] persons= [2845, 2846, 2847] +--- sas= [] oneiea_slice840 crp= 1 +--- 'expires': 1167127047 +843 1 oneieb_slice841 nodes= [3841, 3842, 3843, 841, 842, 843] persons= [2848, 2846, 2847] +--- sas= [] oneieb_slice841 crp= 1 +--- 'expires': 1167127047 +844 1 oneiec_slice842 nodes= [3842, 3843, 3844, 842, 843, 844] persons= [2848, 2849, 2847] +--- sas= [] oneiec_slice842 crp= 1 +--- 'expires': 1167127047 +845 1 oneied_slice843 nodes= [3843, 3844, 3845, 843, 844, 845] persons= [2848, 2849, 2850] +--- sas= [] oneied_slice843 crp= 1 +--- 'expires': 1167127048 +846 1 oneiee_slice844 nodes= [3844, 3845, 3846, 844, 845, 846] persons= [2849, 2850, 2851] +--- sas= [] oneiee_slice844 crp= 1 +--- 'expires': 1167127048 +847 1 oneief_slice845 nodes= [3845, 3846, 3847, 845, 846, 847] persons= [2850, 2851, 2852] +--- sas= [] oneief_slice845 crp= 1 +--- 'expires': 1167127048 +848 1 oneieg_slice846 nodes= [3846, 3847, 3848, 846, 847, 848] persons= [2851, 2852, 2853] +--- sas= [] oneieg_slice846 crp= 1 +--- 'expires': 1167127048 +849 1 oneieh_slice847 nodes= [3847, 3848, 3849, 847, 848, 849] persons= [2852, 2853, 2854] +--- sas= [] oneieh_slice847 crp= 1 +--- 'expires': 1167127049 +850 1 oneiei_slice848 nodes= [3848, 3849, 3850, 848, 849, 850] persons= [2853, 2854, 2855] +--- sas= [] oneiei_slice848 crp= 1 +--- 'expires': 1167127049 +851 1 oneiej_slice849 nodes= [3849, 3850, 3851, 849, 850, 851] persons= [2856, 2854, 2855] +--- sas= [] oneiej_slice849 crp= 1 +--- 'expires': 1167127049 +852 1 oneifa_slice850 nodes= [3850, 3851, 3852, 850, 851, 852] persons= [2856, 2857, 2855] +--- sas= [] oneifa_slice850 crp= 1 +--- 'expires': 1167127050 +853 1 oneifb_slice851 nodes= [3851, 3852, 3853, 851, 852, 853] persons= [2856, 2857, 2858] +--- sas= [] oneifb_slice851 crp= 1 +--- 'expires': 1167127050 +854 1 oneifc_slice852 nodes= [3852, 3853, 3854, 852, 853, 854] persons= [2857, 2858, 2859] +--- sas= [] oneifc_slice852 crp= 1 +--- 'expires': 1167127050 +855 1 oneifd_slice853 nodes= [3853, 3854, 3855, 853, 854, 855] persons= [2858, 2859, 2860] +--- sas= [] oneifd_slice853 crp= 1 +--- 'expires': 1167127051 +856 1 oneife_slice854 nodes= [3854, 3855, 3856, 854, 855, 856] persons= [2859, 2860, 2861] +--- sas= [] oneife_slice854 crp= 1 +--- 'expires': 1167127051 +857 1 oneiff_slice855 nodes= [3855, 3856, 3857, 855, 856, 857] persons= [2860, 2861, 2862] +--- sas= [] oneiff_slice855 crp= 1 +--- 'expires': 1167127051 +858 1 oneifg_slice856 nodes= [3856, 3857, 3858, 856, 857, 858] persons= [2861, 2862, 2863] +--- sas= [] oneifg_slice856 crp= 1 +--- 'expires': 1167127052 +859 1 oneifh_slice857 nodes= [3857, 3858, 3859, 857, 858, 859] persons= [2864, 2862, 2863] +--- sas= [] oneifh_slice857 crp= 1 +--- 'expires': 1167127052 +860 1 oneifi_slice858 nodes= [3858, 3859, 3860, 858, 859, 860] persons= [2864, 2865, 2863] +--- sas= [] oneifi_slice858 crp= 1 +--- 'expires': 1167127052 +861 1 oneifj_slice859 nodes= [3859, 3860, 3861, 859, 860, 861] persons= [2864, 2865, 2866] +--- sas= [] oneifj_slice859 crp= 1 +--- 'expires': 1167127053 +862 1 oneiga_slice860 nodes= [3860, 3861, 3862, 860, 861, 862] persons= [2865, 2866, 2867] +--- sas= [] oneiga_slice860 crp= 1 +--- 'expires': 1167127053 +863 1 oneigb_slice861 nodes= [3861, 3862, 3863, 861, 862, 863] persons= [2866, 2867, 2868] +--- sas= [] oneigb_slice861 crp= 1 +--- 'expires': 1167127053 +864 1 oneigc_slice862 nodes= [864, 3862, 3863, 3864, 862, 863] persons= [2867, 2868, 2869] +--- sas= [] oneigc_slice862 crp= 1 +--- 'expires': 1167127054 +865 1 oneigd_slice863 nodes= [864, 865, 3863, 3864, 3865, 863] persons= [2868, 2869, 2870] +--- sas= [] oneigd_slice863 crp= 1 +--- 'expires': 1167127054 +866 1 oneige_slice864 nodes= [864, 865, 866, 3864, 3865, 3866] persons= [2869, 2870, 2871] +--- sas= [] oneige_slice864 crp= 1 +--- 'expires': 1167127054 +867 1 oneigf_slice865 nodes= [865, 866, 867, 3865, 3866, 3867] persons= [2872, 2870, 2871] +--- sas= [] oneigf_slice865 crp= 1 +--- 'expires': 1167127055 +868 1 oneigg_slice866 nodes= [866, 867, 868, 3866, 3867, 3868] persons= [2872, 2873, 2871] +--- sas= [] oneigg_slice866 crp= 1 +--- 'expires': 1167127055 +869 1 oneigh_slice867 nodes= [867, 868, 869, 3867, 3868, 3869] persons= [2872, 2873, 2874] +--- sas= [] oneigh_slice867 crp= 1 +--- 'expires': 1167127055 +870 1 oneigi_slice868 nodes= [868, 869, 870, 3868, 3869, 3870] persons= [2873, 2874, 2875] +--- sas= [] oneigi_slice868 crp= 1 +--- 'expires': 1167127056 +871 1 oneigj_slice869 nodes= [869, 870, 871, 3869, 3870, 3871] persons= [2874, 2875, 2876] +--- sas= [] oneigj_slice869 crp= 1 +--- 'expires': 1167127056 +872 1 oneiha_slice870 nodes= [3872, 870, 871, 872, 3870, 3871] persons= [2875, 2876, 2877] +--- sas= [] oneiha_slice870 crp= 1 +--- 'expires': 1167127056 +873 1 oneihb_slice871 nodes= [3872, 3873, 871, 872, 873, 3871] persons= [2876, 2877, 2878] +--- sas= [] oneihb_slice871 crp= 1 +--- 'expires': 1167127057 +874 1 oneihc_slice872 nodes= [3872, 3873, 3874, 872, 873, 874] persons= [2877, 2878, 2879] +--- sas= [] oneihc_slice872 crp= 1 +--- 'expires': 1167127057 +875 1 oneihd_slice873 nodes= [3873, 3874, 3875, 873, 874, 875] persons= [2880, 2878, 2879] +--- sas= [] oneihd_slice873 crp= 1 +--- 'expires': 1167127057 +876 1 oneihe_slice874 nodes= [3874, 3875, 3876, 874, 875, 876] persons= [2880, 2881, 2879] +--- sas= [] oneihe_slice874 crp= 1 +--- 'expires': 1167127058 +877 1 oneihf_slice875 nodes= [3875, 3876, 3877, 875, 876, 877] persons= [2880, 2881, 2882] +--- sas= [] oneihf_slice875 crp= 1 +--- 'expires': 1167127058 +878 1 oneihg_slice876 nodes= [3876, 3877, 3878, 876, 877, 878] persons= [2881, 2882, 2883] +--- sas= [] oneihg_slice876 crp= 1 +--- 'expires': 1167127059 +879 1 oneihh_slice877 nodes= [3877, 3878, 3879, 877, 878, 879] persons= [2882, 2883, 2884] +--- sas= [] oneihh_slice877 crp= 1 +--- 'expires': 1167127059 +880 1 oneihi_slice878 nodes= [3878, 3879, 3880, 878, 879, 880] persons= [2883, 2884, 2885] +--- sas= [] oneihi_slice878 crp= 1 +--- 'expires': 1167127059 +881 1 oneihj_slice879 nodes= [3879, 3880, 3881, 879, 880, 881] persons= [2884, 2885, 2886] +--- sas= [] oneihj_slice879 crp= 1 +--- 'expires': 1167127060 +882 1 oneiia_slice880 nodes= [3880, 3881, 3882, 880, 881, 882] persons= [2885, 2886, 2887] +--- sas= [] oneiia_slice880 crp= 1 +--- 'expires': 1167127060 +883 1 oneiib_slice881 nodes= [3881, 3882, 3883, 881, 882, 883] persons= [2888, 2886, 2887] +--- sas= [] oneiib_slice881 crp= 1 +--- 'expires': 1167127060 +884 1 oneiic_slice882 nodes= [3882, 3883, 3884, 882, 883, 884] persons= [2888, 2889, 2887] +--- sas= [] oneiic_slice882 crp= 1 +--- 'expires': 1167127061 +885 1 oneiid_slice883 nodes= [3883, 3884, 3885, 883, 884, 885] persons= [2888, 2889, 2890] +--- sas= [] oneiid_slice883 crp= 1 +--- 'expires': 1167127061 +886 1 oneiie_slice884 nodes= [3884, 3885, 3886, 884, 885, 886] persons= [2889, 2890, 2891] +--- sas= [] oneiie_slice884 crp= 1 +--- 'expires': 1167127061 +887 1 oneiif_slice885 nodes= [3885, 3886, 3887, 885, 886, 887] persons= [2890, 2891, 2892] +--- sas= [] oneiif_slice885 crp= 1 +--- 'expires': 1167127062 +888 1 oneiig_slice886 nodes= [3886, 3887, 3888, 886, 887, 888] persons= [2891, 2892, 2893] +--- sas= [] oneiig_slice886 crp= 1 +--- 'expires': 1167127062 +889 1 oneiih_slice887 nodes= [3887, 3888, 3889, 887, 888, 889] persons= [2892, 2893, 2894] +--- sas= [] oneiih_slice887 crp= 1 +--- 'expires': 1167127062 +890 1 oneiii_slice888 nodes= [3888, 3889, 3890, 888, 889, 890] persons= [2893, 2894, 2895] +--- sas= [] oneiii_slice888 crp= 1 +--- 'expires': 1167127063 +891 1 oneiij_slice889 nodes= [3889, 3890, 3891, 889, 890, 891] persons= [2896, 2894, 2895] +--- sas= [] oneiij_slice889 crp= 1 +--- 'expires': 1167127063 +892 1 oneija_slice890 nodes= [3890, 3891, 3892, 890, 891, 892] persons= [2896, 2897, 2895] +--- sas= [] oneija_slice890 crp= 1 +--- 'expires': 1167127063 +893 1 oneijb_slice891 nodes= [3891, 3892, 3893, 891, 892, 893] persons= [2896, 2897, 2898] +--- sas= [] oneijb_slice891 crp= 1 +--- 'expires': 1167127064 +894 1 oneijc_slice892 nodes= [3892, 3893, 3894, 892, 893, 894] persons= [2897, 2898, 2899] +--- sas= [] oneijc_slice892 crp= 1 +--- 'expires': 1167127064 +895 1 oneijd_slice893 nodes= [3893, 3894, 3895, 893, 894, 895] persons= [2898, 2899, 2900] +--- sas= [] oneijd_slice893 crp= 1 +--- 'expires': 1167127064 +896 1 oneije_slice894 nodes= [896, 3894, 3895, 3896, 894, 895] persons= [2899, 2900, 2901] +--- sas= [] oneije_slice894 crp= 1 +--- 'expires': 1167127065 +897 1 oneijf_slice895 nodes= [896, 897, 3895, 3896, 3897, 895] persons= [2900, 2901, 2902] +--- sas= [] oneijf_slice895 crp= 1 +--- 'expires': 1167127065 +898 1 oneijg_slice896 nodes= [896, 897, 898, 3896, 3897, 3898] persons= [2901, 2902, 2903] +--- sas= [] oneijg_slice896 crp= 1 +--- 'expires': 1167127065 +899 1 oneijh_slice897 nodes= [897, 898, 899, 3897, 3898, 3899] persons= [2904, 2902, 2903] +--- sas= [] oneijh_slice897 crp= 1 +--- 'expires': 1167127066 +900 1 oneiji_slice898 nodes= [898, 899, 900, 3898, 3899, 3900] persons= [2904, 2905, 2903] +--- sas= [] oneiji_slice898 crp= 1 +--- 'expires': 1167127066 +901 1 oneijj_slice899 nodes= [899, 900, 901, 3899, 3900, 3901] persons= [2904, 2905, 2906] +--- sas= [] oneijj_slice899 crp= 1 +--- 'expires': 1167127066 +902 1 onejaa_slice900 nodes= [900, 901, 902, 3900, 3901, 3902] persons= [2905, 2906, 2907] +--- sas= [] onejaa_slice900 crp= 1 +--- 'expires': 1167127067 +903 1 onejab_slice901 nodes= [901, 902, 903, 3901, 3902, 3903] persons= [2906, 2907, 2908] +--- sas= [] onejab_slice901 crp= 1 +--- 'expires': 1167127067 +904 1 onejac_slice902 nodes= [3904, 902, 903, 904, 3902, 3903] persons= [2907, 2908, 2909] +--- sas= [] onejac_slice902 crp= 1 +--- 'expires': 1167127067 +905 1 onejad_slice903 nodes= [3904, 3905, 903, 904, 905, 3903] persons= [2908, 2909, 2910] +--- sas= [] onejad_slice903 crp= 1 +--- 'expires': 1167127068 +906 1 onejae_slice904 nodes= [3904, 3905, 3906, 904, 905, 906] persons= [2909, 2910, 2911] +--- sas= [] onejae_slice904 crp= 1 +--- 'expires': 1167127068 +907 1 onejaf_slice905 nodes= [3905, 3906, 3907, 905, 906, 907] persons= [2912, 2910, 2911] +--- sas= [] onejaf_slice905 crp= 1 +--- 'expires': 1167127068 +908 1 onejag_slice906 nodes= [3906, 3907, 3908, 906, 907, 908] persons= [2912, 2913, 2911] +--- sas= [] onejag_slice906 crp= 1 +--- 'expires': 1167127069 +909 1 onejah_slice907 nodes= [3907, 3908, 3909, 907, 908, 909] persons= [2912, 2913, 2914] +--- sas= [] onejah_slice907 crp= 1 +--- 'expires': 1167127069 +910 1 onejai_slice908 nodes= [3908, 3909, 3910, 908, 909, 910] persons= [2913, 2914, 2915] +--- sas= [] onejai_slice908 crp= 1 +--- 'expires': 1167127069 +911 1 onejaj_slice909 nodes= [3909, 3910, 3911, 909, 910, 911] persons= [2914, 2915, 2916] +--- sas= [] onejaj_slice909 crp= 1 +--- 'expires': 1167127070 +912 1 onejba_slice910 nodes= [3910, 3911, 3912, 910, 911, 912] persons= [2915, 2916, 2917] +--- sas= [] onejba_slice910 crp= 1 +--- 'expires': 1167127070 +913 1 onejbb_slice911 nodes= [3911, 3912, 3913, 911, 912, 913] persons= [2916, 2917, 2918] +--- sas= [] onejbb_slice911 crp= 1 +--- 'expires': 1167127070 +914 1 onejbc_slice912 nodes= [3912, 3913, 3914, 912, 913, 914] persons= [2917, 2918, 2919] +--- sas= [] onejbc_slice912 crp= 1 +--- 'expires': 1167127071 +915 1 onejbd_slice913 nodes= [3913, 3914, 3915, 913, 914, 915] persons= [2920, 2918, 2919] +--- sas= [] onejbd_slice913 crp= 1 +--- 'expires': 1167127071 +916 1 onejbe_slice914 nodes= [3914, 3915, 3916, 914, 915, 916] persons= [2920, 2921, 2919] +--- sas= [] onejbe_slice914 crp= 1 +--- 'expires': 1167127071 +917 1 onejbf_slice915 nodes= [3915, 3916, 3917, 915, 916, 917] persons= [2920, 2921, 2922] +--- sas= [] onejbf_slice915 crp= 1 +--- 'expires': 1167127072 +918 1 onejbg_slice916 nodes= [3916, 3917, 3918, 916, 917, 918] persons= [2921, 2922, 2923] +--- sas= [] onejbg_slice916 crp= 1 +--- 'expires': 1167127072 +919 1 onejbh_slice917 nodes= [3917, 3918, 3919, 917, 918, 919] persons= [2922, 2923, 2924] +--- sas= [] onejbh_slice917 crp= 1 +--- 'expires': 1167127072 +920 1 onejbi_slice918 nodes= [3918, 3919, 3920, 918, 919, 920] persons= [2923, 2924, 2925] +--- sas= [] onejbi_slice918 crp= 1 +--- 'expires': 1167127073 +921 1 onejbj_slice919 nodes= [3919, 3920, 3921, 919, 920, 921] persons= [2924, 2925, 2926] +--- sas= [] onejbj_slice919 crp= 1 +--- 'expires': 1167127073 +922 1 onejca_slice920 nodes= [3920, 3921, 3922, 920, 921, 922] persons= [2925, 2926, 2927] +--- sas= [] onejca_slice920 crp= 1 +--- 'expires': 1167127073 +923 1 onejcb_slice921 nodes= [3921, 3922, 3923, 921, 922, 923] persons= [2928, 2926, 2927] +--- sas= [] onejcb_slice921 crp= 1 +--- 'expires': 1167127074 +924 1 onejcc_slice922 nodes= [3922, 3923, 3924, 922, 923, 924] persons= [2928, 2929, 2927] +--- sas= [] onejcc_slice922 crp= 1 +--- 'expires': 1167127074 +925 1 onejcd_slice923 nodes= [3923, 3924, 3925, 923, 924, 925] persons= [2928, 2929, 2930] +--- sas= [] onejcd_slice923 crp= 1 +--- 'expires': 1167127074 +926 1 onejce_slice924 nodes= [3924, 3925, 3926, 924, 925, 926] persons= [2929, 2930, 2931] +--- sas= [] onejce_slice924 crp= 1 +--- 'expires': 1167127075 +927 1 onejcf_slice925 nodes= [3925, 3926, 3927, 925, 926, 927] persons= [2930, 2931, 2932] +--- sas= [] onejcf_slice925 crp= 1 +--- 'expires': 1167127075 +928 1 onejcg_slice926 nodes= [928, 3926, 3927, 3928, 926, 927] persons= [2931, 2932, 2933] +--- sas= [] onejcg_slice926 crp= 1 +--- 'expires': 1167127075 +929 1 onejch_slice927 nodes= [928, 929, 3927, 3928, 3929, 927] persons= [2932, 2933, 2934] +--- sas= [] onejch_slice927 crp= 1 +--- 'expires': 1167127076 +930 1 onejci_slice928 nodes= [928, 929, 930, 3928, 3929, 3930] persons= [2933, 2934, 2935] +--- sas= [] onejci_slice928 crp= 1 +--- 'expires': 1167127076 +931 1 onejcj_slice929 nodes= [929, 930, 931, 3929, 3930, 3931] persons= [2936, 2934, 2935] +--- sas= [] onejcj_slice929 crp= 1 +--- 'expires': 1167127076 +932 1 onejda_slice930 nodes= [930, 931, 932, 3930, 3931, 3932] persons= [2936, 2937, 2935] +--- sas= [] onejda_slice930 crp= 1 +--- 'expires': 1167127077 +933 1 onejdb_slice931 nodes= [931, 932, 933, 3931, 3932, 3933] persons= [2936, 2937, 2938] +--- sas= [] onejdb_slice931 crp= 1 +--- 'expires': 1167127077 +934 1 onejdc_slice932 nodes= [932, 933, 934, 3932, 3933, 3934] persons= [2937, 2938, 2939] +--- sas= [] onejdc_slice932 crp= 1 +--- 'expires': 1167127077 +935 1 onejdd_slice933 nodes= [933, 934, 935, 3933, 3934, 3935] persons= [2938, 2939, 2940] +--- sas= [] onejdd_slice933 crp= 1 +--- 'expires': 1167127078 +936 1 onejde_slice934 nodes= [3936, 934, 935, 936, 3934, 3935] persons= [2939, 2940, 2941] +--- sas= [] onejde_slice934 crp= 1 +--- 'expires': 1167127078 +937 1 onejdf_slice935 nodes= [3936, 3937, 935, 936, 937, 3935] persons= [2940, 2941, 2942] +--- sas= [] onejdf_slice935 crp= 1 +--- 'expires': 1167127078 +938 1 onejdg_slice936 nodes= [3936, 3937, 3938, 936, 937, 938] persons= [2941, 2942, 2943] +--- sas= [] onejdg_slice936 crp= 1 +--- 'expires': 1167127079 +939 1 onejdh_slice937 nodes= [3937, 3938, 3939, 937, 938, 939] persons= [2944, 2942, 2943] +--- sas= [] onejdh_slice937 crp= 1 +--- 'expires': 1167127079 +940 1 onejdi_slice938 nodes= [3938, 3939, 3940, 938, 939, 940] persons= [2944, 2945, 2943] +--- sas= [] onejdi_slice938 crp= 1 +--- 'expires': 1167127079 +941 1 onejdj_slice939 nodes= [3939, 3940, 3941, 939, 940, 941] persons= [2944, 2945, 2946] +--- sas= [] onejdj_slice939 crp= 1 +--- 'expires': 1167127080 +942 1 onejea_slice940 nodes= [3940, 3941, 3942, 940, 941, 942] persons= [2945, 2946, 2947] +--- sas= [] onejea_slice940 crp= 1 +--- 'expires': 1167127080 +943 1 onejeb_slice941 nodes= [3941, 3942, 3943, 941, 942, 943] persons= [2946, 2947, 2948] +--- sas= [] onejeb_slice941 crp= 1 +--- 'expires': 1167127080 +944 1 onejec_slice942 nodes= [3942, 3943, 3944, 942, 943, 944] persons= [2947, 2948, 2949] +--- sas= [] onejec_slice942 crp= 1 +--- 'expires': 1167127081 +945 1 onejed_slice943 nodes= [3943, 3944, 3945, 943, 944, 945] persons= [2948, 2949, 2950] +--- sas= [] onejed_slice943 crp= 1 +--- 'expires': 1167127081 +946 1 onejee_slice944 nodes= [3944, 3945, 3946, 944, 945, 946] persons= [2949, 2950, 2951] +--- sas= [] onejee_slice944 crp= 1 +--- 'expires': 1167127081 +947 1 onejef_slice945 nodes= [3945, 3946, 3947, 945, 946, 947] persons= [2952, 2950, 2951] +--- sas= [] onejef_slice945 crp= 1 +--- 'expires': 1167127082 +948 1 onejeg_slice946 nodes= [3946, 3947, 3948, 946, 947, 948] persons= [2952, 2953, 2951] +--- sas= [] onejeg_slice946 crp= 1 +--- 'expires': 1167127082 +949 1 onejeh_slice947 nodes= [3947, 3948, 3949, 947, 948, 949] persons= [2952, 2953, 2954] +--- sas= [] onejeh_slice947 crp= 1 +--- 'expires': 1167127082 +950 1 onejei_slice948 nodes= [3948, 3949, 3950, 948, 949, 950] persons= [2953, 2954, 2955] +--- sas= [] onejei_slice948 crp= 1 +--- 'expires': 1167127083 +951 1 onejej_slice949 nodes= [3949, 3950, 3951, 949, 950, 951] persons= [2954, 2955, 2956] +--- sas= [] onejej_slice949 crp= 1 +--- 'expires': 1167127083 +952 1 onejfa_slice950 nodes= [3950, 3951, 3952, 950, 951, 952] persons= [2955, 2956, 2957] +--- sas= [] onejfa_slice950 crp= 1 +--- 'expires': 1167127083 +953 1 onejfb_slice951 nodes= [3951, 3952, 3953, 951, 952, 953] persons= [2956, 2957, 2958] +--- sas= [] onejfb_slice951 crp= 1 +--- 'expires': 1167127084 +954 1 onejfc_slice952 nodes= [3952, 3953, 3954, 952, 953, 954] persons= [2957, 2958, 2959] +--- sas= [] onejfc_slice952 crp= 1 +--- 'expires': 1167127084 +955 1 onejfd_slice953 nodes= [3953, 3954, 3955, 953, 954, 955] persons= [2960, 2958, 2959] +--- sas= [] onejfd_slice953 crp= 1 +--- 'expires': 1167127084 +956 1 onejfe_slice954 nodes= [3954, 3955, 3956, 954, 955, 956] persons= [2960, 2961, 2959] +--- sas= [] onejfe_slice954 crp= 1 +--- 'expires': 1167127085 +957 1 onejff_slice955 nodes= [3955, 3956, 3957, 955, 956, 957] persons= [2960, 2961, 2962] +--- sas= [] onejff_slice955 crp= 1 +--- 'expires': 1167127085 +958 1 onejfg_slice956 nodes= [3956, 3957, 3958, 956, 957, 958] persons= [2961, 2962, 2963] +--- sas= [] onejfg_slice956 crp= 1 +--- 'expires': 1167127085 +959 1 onejfh_slice957 nodes= [3957, 3958, 3959, 957, 958, 959] persons= [2962, 2963, 2964] +--- sas= [] onejfh_slice957 crp= 1 +--- 'expires': 1167127086 +960 1 onejfi_slice958 nodes= [960, 3958, 3959, 3960, 958, 959] persons= [2963, 2964, 2965] +--- sas= [] onejfi_slice958 crp= 1 +--- 'expires': 1167127086 +961 1 onejfj_slice959 nodes= [960, 961, 3959, 3960, 3961, 959] persons= [2964, 2965, 2966] +--- sas= [] onejfj_slice959 crp= 1 +--- 'expires': 1167127086 +962 1 onejga_slice960 nodes= [960, 961, 962, 3960, 3961, 3962] persons= [2965, 2966, 2967] +--- sas= [] onejga_slice960 crp= 1 +--- 'expires': 1167127087 +963 1 onejgb_slice961 nodes= [961, 962, 963, 3961, 3962, 3963] persons= [2968, 2966, 2967] +--- sas= [] onejgb_slice961 crp= 1 +--- 'expires': 1167127087 +964 1 onejgc_slice962 nodes= [962, 963, 964, 3962, 3963, 3964] persons= [2968, 2969, 2967] +--- sas= [] onejgc_slice962 crp= 1 +--- 'expires': 1167127087 +965 1 onejgd_slice963 nodes= [963, 964, 965, 3963, 3964, 3965] persons= [2968, 2969, 2970] +--- sas= [] onejgd_slice963 crp= 1 +--- 'expires': 1167127088 +966 1 onejge_slice964 nodes= [964, 965, 966, 3964, 3965, 3966] persons= [2969, 2970, 2971] +--- sas= [] onejge_slice964 crp= 1 +--- 'expires': 1167127088 +967 1 onejgf_slice965 nodes= [965, 966, 967, 3965, 3966, 3967] persons= [2970, 2971, 2972] +--- sas= [] onejgf_slice965 crp= 1 +--- 'expires': 1167127088 +968 1 onejgg_slice966 nodes= [3968, 966, 967, 968, 3966, 3967] persons= [2971, 2972, 2973] +--- sas= [] onejgg_slice966 crp= 1 +--- 'expires': 1167127089 +969 1 onejgh_slice967 nodes= [3968, 3969, 967, 968, 969, 3967] persons= [2972, 2973, 2974] +--- sas= [] onejgh_slice967 crp= 1 +--- 'expires': 1167127089 +970 1 onejgi_slice968 nodes= [3968, 3969, 3970, 968, 969, 970] persons= [2973, 2974, 2975] +--- sas= [] onejgi_slice968 crp= 1 +--- 'expires': 1167127089 +971 1 onejgj_slice969 nodes= [3969, 3970, 3971, 969, 970, 971] persons= [2976, 2974, 2975] +--- sas= [] onejgj_slice969 crp= 1 +--- 'expires': 1167127090 +972 1 onejha_slice970 nodes= [3970, 3971, 3972, 970, 971, 972] persons= [2976, 2977, 2975] +--- sas= [] onejha_slice970 crp= 1 +--- 'expires': 1167127090 +973 1 onejhb_slice971 nodes= [3971, 3972, 3973, 971, 972, 973] persons= [2976, 2977, 2978] +--- sas= [] onejhb_slice971 crp= 1 +--- 'expires': 1167127090 +974 1 onejhc_slice972 nodes= [3972, 3973, 3974, 972, 973, 974] persons= [2977, 2978, 2979] +--- sas= [] onejhc_slice972 crp= 1 +--- 'expires': 1167127091 +975 1 onejhd_slice973 nodes= [3973, 3974, 3975, 973, 974, 975] persons= [2978, 2979, 2980] +--- sas= [] onejhd_slice973 crp= 1 +--- 'expires': 1167127091 +976 1 onejhe_slice974 nodes= [3974, 3975, 3976, 974, 975, 976] persons= [2979, 2980, 2981] +--- sas= [] onejhe_slice974 crp= 1 +--- 'expires': 1167127091 +977 1 onejhf_slice975 nodes= [3975, 3976, 3977, 975, 976, 977] persons= [2980, 2981, 2982] +--- sas= [] onejhf_slice975 crp= 1 +--- 'expires': 1167127092 +978 1 onejhg_slice976 nodes= [3976, 3977, 3978, 976, 977, 978] persons= [2981, 2982, 2983] +--- sas= [] onejhg_slice976 crp= 1 +--- 'expires': 1167127092 +979 1 onejhh_slice977 nodes= [3977, 3978, 3979, 977, 978, 979] persons= [2984, 2982, 2983] +--- sas= [] onejhh_slice977 crp= 1 +--- 'expires': 1167127092 +980 1 onejhi_slice978 nodes= [3978, 3979, 3980, 978, 979, 980] persons= [2984, 2985, 2983] +--- sas= [] onejhi_slice978 crp= 1 +--- 'expires': 1167127093 +981 1 onejhj_slice979 nodes= [3979, 3980, 3981, 979, 980, 981] persons= [2984, 2985, 2986] +--- sas= [] onejhj_slice979 crp= 1 +--- 'expires': 1167127093 +982 1 onejia_slice980 nodes= [3980, 3981, 3982, 980, 981, 982] persons= [2985, 2986, 2987] +--- sas= [] onejia_slice980 crp= 1 +--- 'expires': 1167127093 +983 1 onejib_slice981 nodes= [3981, 3982, 3983, 981, 982, 983] persons= [2986, 2987, 2988] +--- sas= [] onejib_slice981 crp= 1 +--- 'expires': 1167127094 +984 1 onejic_slice982 nodes= [3982, 3983, 3984, 982, 983, 984] persons= [2987, 2988, 2989] +--- sas= [] onejic_slice982 crp= 1 +--- 'expires': 1167127094 +985 1 onejid_slice983 nodes= [3983, 3984, 3985, 983, 984, 985] persons= [2988, 2989, 2990] +--- sas= [] onejid_slice983 crp= 1 +--- 'expires': 1167127094 +986 1 onejie_slice984 nodes= [3984, 3985, 3986, 984, 985, 986] persons= [2989, 2990, 2991] +--- sas= [] onejie_slice984 crp= 1 +--- 'expires': 1167127095 +987 1 onejif_slice985 nodes= [3985, 3986, 3987, 985, 986, 987] persons= [2992, 2990, 2991] +--- sas= [] onejif_slice985 crp= 1 +--- 'expires': 1167127095 +988 1 onejig_slice986 nodes= [3986, 3987, 3988, 986, 987, 988] persons= [2992, 2993, 2991] +--- sas= [] onejig_slice986 crp= 1 +--- 'expires': 1167127095 +989 1 onejih_slice987 nodes= [3987, 3988, 3989, 987, 988, 989] persons= [2992, 2993, 2994] +--- sas= [] onejih_slice987 crp= 1 +--- 'expires': 1167127096 +990 1 onejii_slice988 nodes= [3988, 3989, 3990, 988, 989, 990] persons= [2993, 2994, 2995] +--- sas= [] onejii_slice988 crp= 1 +--- 'expires': 1167127096 +991 1 onejij_slice989 nodes= [3989, 3990, 3991, 989, 990, 991] persons= [2994, 2995, 2996] +--- sas= [] onejij_slice989 crp= 1 +--- 'expires': 1167127096 +992 1 onejja_slice990 nodes= [992, 3990, 3991, 3992, 990, 991] persons= [2995, 2996, 2997] +--- sas= [] onejja_slice990 crp= 1 +--- 'expires': 1167127097 +993 1 onejjb_slice991 nodes= [992, 993, 3991, 3992, 3993, 991] persons= [2996, 2997, 2998] +--- sas= [] onejjb_slice991 crp= 1 +--- 'expires': 1167127097 +994 1 onejjc_slice992 nodes= [992, 993, 994, 3992, 3993, 3994] persons= [2997, 2998, 2999] +--- sas= [] onejjc_slice992 crp= 1 +--- 'expires': 1167127097 +995 1 onejjd_slice993 nodes= [993, 994, 995, 3993, 3994, 3995] persons= [3000, 2998, 2999] +--- sas= [] onejjd_slice993 crp= 1 +--- 'expires': 1167127098 +996 1 onejje_slice994 nodes= [994, 995, 996, 3994, 3995, 3996] persons= [3000, 3001, 2999] +--- sas= [] onejje_slice994 crp= 1 +--- 'expires': 1167127098 +997 1 onejjf_slice995 nodes= [995, 996, 997, 3995, 3996, 3997] persons= [3000, 3001, 3002] +--- sas= [] onejjf_slice995 crp= 1 +--- 'expires': 1167127098 +998 1 onejjg_slice996 nodes= [996, 997, 998, 3996, 3997, 3998] persons= [3001, 3002, 3003] +--- sas= [] onejjg_slice996 crp= 1 +--- 'expires': 1167127099 +999 1 onejjh_slice997 nodes= [997, 998, 999, 3997, 3998, 3999] persons= [3002, 3003, 3004] +--- sas= [] onejjh_slice997 crp= 1 +--- 'expires': 1167127099 +1000 1 onejji_slice998 nodes= [4000, 998, 999, 1000, 3998, 3999] persons= [3003, 3004, 3005] +--- sas= [] onejji_slice998 crp= 1 +--- 'expires': 1167127100 +1001 1 onejjj_slice999 nodes= [4000, 4001, 999, 1000, 1001, 3999] persons= [3004, 3005, 3006] +--- sas= [] onejjj_slice999 crp= 1 +--- 'expires': 1167127100 +1002 1 onebaaa_slice1000 nodes= [4000, 4001, 4002, 1000, 1001, 1002] persons= [3005, 3006, 3007] +--- sas= [] onebaaa_slice1000 crp= 1 +--- 'expires': 1167127100 +1003 1 oneb_slice1001 nodes= [4001, 4002, 4003, 1001, 1002, 1003] persons= [3008, 3006, 3007] +--- sas= [] oneb_slice1001 crp= 1 +--- 'expires': 1167127101 +1004 1 onec_slice1002 nodes= [4002, 4003, 4004, 1002, 1003, 1004] persons= [3008, 3009, 3007] +--- sas= [] onec_slice1002 crp= 1 +--- 'expires': 1167127101 +1005 1 oned_slice1003 nodes= [4003, 4004, 4005, 1003, 1004, 1005] persons= [3008, 3009, 3010] +--- sas= [] oned_slice1003 crp= 1 +--- 'expires': 1167127101 +1006 1 onee_slice1004 nodes= [4004, 4005, 4006, 1004, 1005, 1006] persons= [3009, 3010, 3011] +--- sas= [] onee_slice1004 crp= 1 +--- 'expires': 1167127102 +1007 1 onef_slice1005 nodes= [4005, 4006, 4007, 1005, 1006, 1007] persons= [3010, 3011, 3012] +--- sas= [] onef_slice1005 crp= 1 +--- 'expires': 1167127102 +1008 1 oneg_slice1006 nodes= [4006, 4007, 4008, 1006, 1007, 1008] persons= [3011, 3012, 3013] +--- sas= [] oneg_slice1006 crp= 1 +--- 'expires': 1167127102 +1009 1 oneh_slice1007 nodes= [4007, 4008, 4009, 1007, 1008, 1009] persons= [3012, 3013, 3014] +--- sas= [] oneh_slice1007 crp= 1 +--- 'expires': 1167127103 +1010 1 onei_slice1008 nodes= [4008, 4009, 4010, 1008, 1009, 1010] persons= [3013, 3014, 3015] +--- sas= [] onei_slice1008 crp= 1 +--- 'expires': 1167127103 +1011 1 onej_slice1009 nodes= [4009, 4010, 4011, 1009, 1010, 1011] persons= [3016, 3014, 3015] +--- sas= [] onej_slice1009 crp= 1 +--- 'expires': 1167127103 +1012 1 oneba_slice1010 nodes= [4010, 4011, 4012, 1010, 1011, 1012] persons= [3016, 3017, 3015] +--- sas= [] oneba_slice1010 crp= 1 +--- 'expires': 1167127104 +1013 1 onebb_slice1011 nodes= [4011, 4012, 4013, 1011, 1012, 1013] persons= [3016, 3017, 3018] +--- sas= [] onebb_slice1011 crp= 1 +--- 'expires': 1167127104 +1014 1 onebc_slice1012 nodes= [4012, 4013, 4014, 1012, 1013, 1014] persons= [3017, 3018, 3019] +--- sas= [] onebc_slice1012 crp= 1 +--- 'expires': 1167127104 +1015 1 onebd_slice1013 nodes= [4013, 4014, 4015, 1013, 1014, 1015] persons= [3018, 3019, 3020] +--- sas= [] onebd_slice1013 crp= 1 +--- 'expires': 1167127105 +1016 1 onebe_slice1014 nodes= [4014, 4015, 4016, 1014, 1015, 1016] persons= [3019, 3020, 3021] +--- sas= [] onebe_slice1014 crp= 1 +--- 'expires': 1167127105 +1017 1 onebf_slice1015 nodes= [4015, 4016, 4017, 1015, 1016, 1017] persons= [3020, 3021, 3022] +--- sas= [] onebf_slice1015 crp= 1 +--- 'expires': 1167127105 +1018 1 onebg_slice1016 nodes= [4016, 4017, 4018, 1016, 1017, 1018] persons= [3021, 3022, 3023] +--- sas= [] onebg_slice1016 crp= 1 +--- 'expires': 1167127106 +1019 1 onebh_slice1017 nodes= [4017, 4018, 4019, 1017, 1018, 1019] persons= [3024, 3022, 3023] +--- sas= [] onebh_slice1017 crp= 1 +--- 'expires': 1167127106 +1020 1 onebi_slice1018 nodes= [4018, 4019, 4020, 1018, 1019, 1020] persons= [3024, 3025, 3023] +--- sas= [] onebi_slice1018 crp= 1 +--- 'expires': 1167127106 +1021 1 onebj_slice1019 nodes= [4019, 4020, 4021, 1019, 1020, 1021] persons= [3024, 3025, 3026] +--- sas= [] onebj_slice1019 crp= 1 +--- 'expires': 1167127107 +1022 1 oneca_slice1020 nodes= [4020, 4021, 4022, 1020, 1021, 1022] persons= [3025, 3026, 3027] +--- sas= [] oneca_slice1020 crp= 1 +--- 'expires': 1167127107 +1023 1 onecb_slice1021 nodes= [4021, 4022, 4023, 1021, 1022, 1023] persons= [3026, 3027, 3028] +--- sas= [] onecb_slice1021 crp= 1 +--- 'expires': 1167127107 +1024 1 onecc_slice1022 nodes= [1024, 4022, 4023, 4024, 1022, 1023] persons= [3027, 3028, 3029] +--- sas= [] onecc_slice1022 crp= 1 +--- 'expires': 1167127108 +1025 1 onecd_slice1023 nodes= [1024, 1025, 4023, 4024, 4025, 1023] persons= [3028, 3029, 3030] +--- sas= [] onecd_slice1023 crp= 1 +--- 'expires': 1167127108 +1026 1 onece_slice1024 nodes= [1024, 1025, 1026, 4024, 4025, 4026] persons= [3029, 3030, 3031] +--- sas= [] onece_slice1024 crp= 1 +--- 'expires': 1167127108 +1027 1 onecf_slice1025 nodes= [1025, 1026, 1027, 4025, 4026, 4027] persons= [3032, 3030, 3031] +--- sas= [] onecf_slice1025 crp= 1 +--- 'expires': 1167127109 +1028 1 onecg_slice1026 nodes= [1026, 1027, 1028, 4026, 4027, 4028] persons= [3032, 3033, 3031] +--- sas= [] onecg_slice1026 crp= 1 +--- 'expires': 1167127109 +1029 1 onech_slice1027 nodes= [1027, 1028, 1029, 4027, 4028, 4029] persons= [3032, 3033, 3034] +--- sas= [] onech_slice1027 crp= 1 +--- 'expires': 1167127110 +1030 1 oneci_slice1028 nodes= [1028, 1029, 1030, 4028, 4029, 4030] persons= [3033, 3034, 3035] +--- sas= [] oneci_slice1028 crp= 1 +--- 'expires': 1167127110 +1031 1 onecj_slice1029 nodes= [1029, 1030, 1031, 4029, 4030, 4031] persons= [3034, 3035, 3036] +--- sas= [] onecj_slice1029 crp= 1 +--- 'expires': 1167127110 +1032 1 oneda_slice1030 nodes= [4032, 1030, 1031, 1032, 4030, 4031] persons= [3035, 3036, 3037] +--- sas= [] oneda_slice1030 crp= 1 +--- 'expires': 1167127111 +1033 1 onedb_slice1031 nodes= [4032, 4033, 1031, 1032, 1033, 4031] persons= [3036, 3037, 3038] +--- sas= [] onedb_slice1031 crp= 1 +--- 'expires': 1167127111 +1034 1 onedc_slice1032 nodes= [4032, 4033, 4034, 1032, 1033, 1034] persons= [3037, 3038, 3039] +--- sas= [] onedc_slice1032 crp= 1 +--- 'expires': 1167127111 +1035 1 onedd_slice1033 nodes= [4033, 4034, 4035, 1033, 1034, 1035] persons= [3040, 3038, 3039] +--- sas= [] onedd_slice1033 crp= 1 +--- 'expires': 1167127112 +1036 1 onede_slice1034 nodes= [4034, 4035, 4036, 1034, 1035, 1036] persons= [3040, 3041, 3039] +--- sas= [] onede_slice1034 crp= 1 +--- 'expires': 1167127112 +1037 1 onedf_slice1035 nodes= [4035, 4036, 4037, 1035, 1036, 1037] persons= [3040, 3041, 3042] +--- sas= [] onedf_slice1035 crp= 1 +--- 'expires': 1167127112 +1038 1 onedg_slice1036 nodes= [4036, 4037, 4038, 1036, 1037, 1038] persons= [3041, 3042, 3043] +--- sas= [] onedg_slice1036 crp= 1 +--- 'expires': 1167127113 +1039 1 onedh_slice1037 nodes= [4037, 4038, 4039, 1037, 1038, 1039] persons= [3042, 3043, 3044] +--- sas= [] onedh_slice1037 crp= 1 +--- 'expires': 1167127113 +1040 1 onedi_slice1038 nodes= [4038, 4039, 4040, 1038, 1039, 1040] persons= [3043, 3044, 3045] +--- sas= [] onedi_slice1038 crp= 1 +--- 'expires': 1167127113 +1041 1 onedj_slice1039 nodes= [4039, 4040, 4041, 1039, 1040, 1041] persons= [3044, 3045, 3046] +--- sas= [] onedj_slice1039 crp= 1 +--- 'expires': 1167127114 +1042 1 oneea_slice1040 nodes= [4040, 4041, 4042, 1040, 1041, 1042] persons= [3045, 3046, 3047] +--- sas= [] oneea_slice1040 crp= 1 +--- 'expires': 1167127114 +1043 1 oneeb_slice1041 nodes= [4041, 4042, 4043, 1041, 1042, 1043] persons= [3048, 3046, 3047] +--- sas= [] oneeb_slice1041 crp= 1 +--- 'expires': 1167127114 +1044 1 oneec_slice1042 nodes= [4042, 4043, 4044, 1042, 1043, 1044] persons= [3048, 3049, 3047] +--- sas= [] oneec_slice1042 crp= 1 +--- 'expires': 1167127115 +1045 1 oneed_slice1043 nodes= [4043, 4044, 4045, 1043, 1044, 1045] persons= [3048, 3049, 3050] +--- sas= [] oneed_slice1043 crp= 1 +--- 'expires': 1167127115 +1046 1 oneee_slice1044 nodes= [4044, 4045, 4046, 1044, 1045, 1046] persons= [3049, 3050, 3051] +--- sas= [] oneee_slice1044 crp= 1 +--- 'expires': 1167127115 +1047 1 oneef_slice1045 nodes= [4045, 4046, 4047, 1045, 1046, 1047] persons= [3050, 3051, 3052] +--- sas= [] oneef_slice1045 crp= 1 +--- 'expires': 1167127116 +1048 1 oneeg_slice1046 nodes= [4046, 4047, 4048, 1046, 1047, 1048] persons= [3051, 3052, 3053] +--- sas= [] oneeg_slice1046 crp= 1 +--- 'expires': 1167127116 +1049 1 oneeh_slice1047 nodes= [4047, 4048, 4049, 1047, 1048, 1049] persons= [3052, 3053, 3054] +--- sas= [] oneeh_slice1047 crp= 1 +--- 'expires': 1167127117 +1050 1 oneei_slice1048 nodes= [4048, 4049, 4050, 1048, 1049, 1050] persons= [3053, 3054, 3055] +--- sas= [] oneei_slice1048 crp= 1 +--- 'expires': 1167127117 +1051 1 oneej_slice1049 nodes= [4049, 4050, 4051, 1049, 1050, 1051] persons= [3056, 3054, 3055] +--- sas= [] oneej_slice1049 crp= 1 +--- 'expires': 1167127117 +1052 1 onefa_slice1050 nodes= [4050, 4051, 4052, 1050, 1051, 1052] persons= [3056, 3057, 3055] +--- sas= [] onefa_slice1050 crp= 1 +--- 'expires': 1167127118 +1053 1 onefb_slice1051 nodes= [4051, 4052, 4053, 1051, 1052, 1053] persons= [3056, 3057, 3058] +--- sas= [] onefb_slice1051 crp= 1 +--- 'expires': 1167127118 +1054 1 onefc_slice1052 nodes= [4052, 4053, 4054, 1052, 1053, 1054] persons= [3057, 3058, 3059] +--- sas= [] onefc_slice1052 crp= 1 +--- 'expires': 1167127118 +1055 1 onefd_slice1053 nodes= [4053, 4054, 4055, 1053, 1054, 1055] persons= [3058, 3059, 3060] +--- sas= [] onefd_slice1053 crp= 1 +--- 'expires': 1167127119 +1056 1 onefe_slice1054 nodes= [1056, 4054, 4055, 4056, 1054, 1055] persons= [3059, 3060, 3061] +--- sas= [] onefe_slice1054 crp= 1 +--- 'expires': 1167127119 +1057 1 oneff_slice1055 nodes= [1056, 1057, 4055, 4056, 4057, 1055] persons= [3060, 3061, 3062] +--- sas= [] oneff_slice1055 crp= 1 +--- 'expires': 1167127119 +1058 1 onefg_slice1056 nodes= [1056, 1057, 1058, 4056, 4057, 4058] persons= [3061, 3062, 3063] +--- sas= [] onefg_slice1056 crp= 1 +--- 'expires': 1167127120 +1059 1 onefh_slice1057 nodes= [1057, 1058, 1059, 4057, 4058, 4059] persons= [3064, 3062, 3063] +--- sas= [] onefh_slice1057 crp= 1 +--- 'expires': 1167127120 +1060 1 onefi_slice1058 nodes= [1058, 1059, 1060, 4058, 4059, 4060] persons= [3064, 3065, 3063] +--- sas= [] onefi_slice1058 crp= 1 +--- 'expires': 1167127120 +1061 1 onefj_slice1059 nodes= [1059, 1060, 1061, 4059, 4060, 4061] persons= [3064, 3065, 3066] +--- sas= [] onefj_slice1059 crp= 1 +--- 'expires': 1167127121 +1062 1 onega_slice1060 nodes= [1060, 1061, 1062, 4060, 4061, 4062] persons= [3065, 3066, 3067] +--- sas= [] onega_slice1060 crp= 1 +--- 'expires': 1167127121 +1063 1 onegb_slice1061 nodes= [1061, 1062, 1063, 4061, 4062, 4063] persons= [3066, 3067, 3068] +--- sas= [] onegb_slice1061 crp= 1 +--- 'expires': 1167127121 +1064 1 onegc_slice1062 nodes= [4064, 1062, 1063, 1064, 4062, 4063] persons= [3067, 3068, 3069] +--- sas= [] onegc_slice1062 crp= 1 +--- 'expires': 1167127122 +1065 1 onegd_slice1063 nodes= [4064, 4065, 1063, 1064, 1065, 4063] persons= [3068, 3069, 3070] +--- sas= [] onegd_slice1063 crp= 1 +--- 'expires': 1167127122 +1066 1 onege_slice1064 nodes= [4064, 4065, 4066, 1064, 1065, 1066] persons= [3069, 3070, 3071] +--- sas= [] onege_slice1064 crp= 1 +--- 'expires': 1167127123 +1067 1 onegf_slice1065 nodes= [4065, 4066, 4067, 1065, 1066, 1067] persons= [3072, 3070, 3071] +--- sas= [] onegf_slice1065 crp= 1 +--- 'expires': 1167127123 +1068 1 onegg_slice1066 nodes= [4066, 4067, 4068, 1066, 1067, 1068] persons= [3072, 3073, 3071] +--- sas= [] onegg_slice1066 crp= 1 +--- 'expires': 1167127123 +1069 1 onegh_slice1067 nodes= [4067, 4068, 4069, 1067, 1068, 1069] persons= [3072, 3073, 3074] +--- sas= [] onegh_slice1067 crp= 1 +--- 'expires': 1167127124 +1070 1 onegi_slice1068 nodes= [4068, 4069, 4070, 1068, 1069, 1070] persons= [3073, 3074, 3075] +--- sas= [] onegi_slice1068 crp= 1 +--- 'expires': 1167127124 +1071 1 onegj_slice1069 nodes= [4069, 4070, 4071, 1069, 1070, 1071] persons= [3074, 3075, 3076] +--- sas= [] onegj_slice1069 crp= 1 +--- 'expires': 1167127124 +1072 1 oneha_slice1070 nodes= [4070, 4071, 4072, 1070, 1071, 1072] persons= [3075, 3076, 3077] +--- sas= [] oneha_slice1070 crp= 1 +--- 'expires': 1167127125 +1073 1 onehb_slice1071 nodes= [4071, 4072, 4073, 1071, 1072, 1073] persons= [3076, 3077, 3078] +--- sas= [] onehb_slice1071 crp= 1 +--- 'expires': 1167127125 +1074 1 onehc_slice1072 nodes= [4072, 4073, 4074, 1072, 1073, 1074] persons= [3077, 3078, 3079] +--- sas= [] onehc_slice1072 crp= 1 +--- 'expires': 1167127125 +1075 1 onehd_slice1073 nodes= [4073, 4074, 4075, 1073, 1074, 1075] persons= [3080, 3078, 3079] +--- sas= [] onehd_slice1073 crp= 1 +--- 'expires': 1167127126 +1076 1 onehe_slice1074 nodes= [4074, 4075, 4076, 1074, 1075, 1076] persons= [3080, 3081, 3079] +--- sas= [] onehe_slice1074 crp= 1 +--- 'expires': 1167127126 +1077 1 onehf_slice1075 nodes= [4075, 4076, 4077, 1075, 1076, 1077] persons= [3080, 3081, 3082] +--- sas= [] onehf_slice1075 crp= 1 +--- 'expires': 1167127126 +1078 1 onehg_slice1076 nodes= [4076, 4077, 4078, 1076, 1077, 1078] persons= [3081, 3082, 3083] +--- sas= [] onehg_slice1076 crp= 1 +--- 'expires': 1167127127 +1079 1 onehh_slice1077 nodes= [4077, 4078, 4079, 1077, 1078, 1079] persons= [3082, 3083, 3084] +--- sas= [] onehh_slice1077 crp= 1 +--- 'expires': 1167127127 +1080 1 onehi_slice1078 nodes= [4078, 4079, 4080, 1078, 1079, 1080] persons= [3083, 3084, 3085] +--- sas= [] onehi_slice1078 crp= 1 +--- 'expires': 1167127127 +1081 1 onehj_slice1079 nodes= [4079, 4080, 4081, 1079, 1080, 1081] persons= [3084, 3085, 3086] +--- sas= [] onehj_slice1079 crp= 1 +--- 'expires': 1167127128 +1082 1 oneia_slice1080 nodes= [4080, 4081, 4082, 1080, 1081, 1082] persons= [3085, 3086, 3087] +--- sas= [] oneia_slice1080 crp= 1 +--- 'expires': 1167127128 +1083 1 oneib_slice1081 nodes= [4081, 4082, 4083, 1081, 1082, 1083] persons= [3088, 3086, 3087] +--- sas= [] oneib_slice1081 crp= 1 +--- 'expires': 1167127129 +1084 1 oneic_slice1082 nodes= [4082, 4083, 4084, 1082, 1083, 1084] persons= [3088, 3089, 3087] +--- sas= [] oneic_slice1082 crp= 1 +--- 'expires': 1167127129 +1085 1 oneid_slice1083 nodes= [4083, 4084, 4085, 1083, 1084, 1085] persons= [3088, 3089, 3090] +--- sas= [] oneid_slice1083 crp= 1 +--- 'expires': 1167127129 +1086 1 oneie_slice1084 nodes= [4084, 4085, 4086, 1084, 1085, 1086] persons= [3089, 3090, 3091] +--- sas= [] oneie_slice1084 crp= 1 +--- 'expires': 1167127130 +1087 1 oneif_slice1085 nodes= [4085, 4086, 4087, 1085, 1086, 1087] persons= [3090, 3091, 3092] +--- sas= [] oneif_slice1085 crp= 1 +--- 'expires': 1167127130 +1088 1 oneig_slice1086 nodes= [1088, 4086, 4087, 4088, 1086, 1087] persons= [3091, 3092, 3093] +--- sas= [] oneig_slice1086 crp= 1 +--- 'expires': 1167127130 +1089 1 oneih_slice1087 nodes= [1088, 1089, 4087, 4088, 4089, 1087] persons= [3092, 3093, 3094] +--- sas= [] oneih_slice1087 crp= 1 +--- 'expires': 1167127131 +1090 1 oneii_slice1088 nodes= [1088, 1089, 1090, 4088, 4089, 4090] persons= [3093, 3094, 3095] +--- sas= [] oneii_slice1088 crp= 1 +--- 'expires': 1167127131 +1091 1 oneij_slice1089 nodes= [1089, 1090, 1091, 4089, 4090, 4091] persons= [3096, 3094, 3095] +--- sas= [] oneij_slice1089 crp= 1 +--- 'expires': 1167127131 +1092 1 oneja_slice1090 nodes= [1090, 1091, 1092, 4090, 4091, 4092] persons= [3096, 3097, 3095] +--- sas= [] oneja_slice1090 crp= 1 +--- 'expires': 1167127132 +1093 1 onejb_slice1091 nodes= [1091, 1092, 1093, 4091, 4092, 4093] persons= [3096, 3097, 3098] +--- sas= [] onejb_slice1091 crp= 1 +--- 'expires': 1167127132 +1094 1 onejc_slice1092 nodes= [1092, 1093, 1094, 4092, 4093, 4094] persons= [3097, 3098, 3099] +--- sas= [] onejc_slice1092 crp= 1 +--- 'expires': 1167127132 +1095 1 onejd_slice1093 nodes= [1093, 1094, 1095, 4093, 4094, 4095] persons= [3098, 3099, 3100] +--- sas= [] onejd_slice1093 crp= 1 +--- 'expires': 1167127133 +1096 1 oneje_slice1094 nodes= [4096, 1094, 1095, 1096, 4094, 4095] persons= [3099, 3100, 3101] +--- sas= [] oneje_slice1094 crp= 1 +--- 'expires': 1167127133 +1097 1 onejf_slice1095 nodes= [4096, 4097, 1095, 1096, 1097, 4095] persons= [3100, 3101, 3102] +--- sas= [] onejf_slice1095 crp= 1 +--- 'expires': 1167127134 +1098 1 onejg_slice1096 nodes= [4096, 4097, 4098, 1096, 1097, 1098] persons= [3101, 3102, 3103] +--- sas= [] onejg_slice1096 crp= 1 +--- 'expires': 1167127134 +1099 1 onejh_slice1097 nodes= [4097, 4098, 4099, 1097, 1098, 1099] persons= [3104, 3102, 3103] +--- sas= [] onejh_slice1097 crp= 1 +--- 'expires': 1167127134 +1100 1 oneji_slice1098 nodes= [4098, 4099, 4100, 1098, 1099, 1100] persons= [3104, 3105, 3103] +--- sas= [] oneji_slice1098 crp= 1 +--- 'expires': 1167127135 +1101 1 onejj_slice1099 nodes= [4099, 4100, 4101, 1099, 1100, 1101] persons= [3104, 3105, 3106] +--- sas= [] onejj_slice1099 crp= 1 +--- 'expires': 1167127135 +1102 1 onebaa_slice1100 nodes= [4100, 4101, 4102, 1100, 1101, 1102] persons= [3105, 3106, 3107] +--- sas= [] onebaa_slice1100 crp= 1 +--- 'expires': 1167127135 +1103 1 onebab_slice1101 nodes= [4101, 4102, 4103, 1101, 1102, 1103] persons= [3106, 3107, 3108] +--- sas= [] onebab_slice1101 crp= 1 +--- 'expires': 1167127136 +1104 1 onebac_slice1102 nodes= [4102, 4103, 4104, 1102, 1103, 1104] persons= [3107, 3108, 3109] +--- sas= [] onebac_slice1102 crp= 1 +--- 'expires': 1167127136 +1105 1 onebad_slice1103 nodes= [4103, 4104, 4105, 1103, 1104, 1105] persons= [3108, 3109, 3110] +--- sas= [] onebad_slice1103 crp= 1 +--- 'expires': 1167127136 +1106 1 onebae_slice1104 nodes= [4104, 4105, 4106, 1104, 1105, 1106] persons= [3109, 3110, 3111] +--- sas= [] onebae_slice1104 crp= 1 +--- 'expires': 1167127137 +1107 1 onebaf_slice1105 nodes= [4105, 4106, 4107, 1105, 1106, 1107] persons= [3112, 3110, 3111] +--- sas= [] onebaf_slice1105 crp= 1 +--- 'expires': 1167127137 +1108 1 onebag_slice1106 nodes= [4106, 4107, 4108, 1106, 1107, 1108] persons= [3112, 3113, 3111] +--- sas= [] onebag_slice1106 crp= 1 +--- 'expires': 1167127137 +1109 1 onebah_slice1107 nodes= [4107, 4108, 4109, 1107, 1108, 1109] persons= [3112, 3113, 3114] +--- sas= [] onebah_slice1107 crp= 1 +--- 'expires': 1167127138 +1110 1 onebai_slice1108 nodes= [4108, 4109, 4110, 1108, 1109, 1110] persons= [3113, 3114, 3115] +--- sas= [] onebai_slice1108 crp= 1 +--- 'expires': 1167127138 +1111 1 onebaj_slice1109 nodes= [4109, 4110, 4111, 1109, 1110, 1111] persons= [3114, 3115, 3116] +--- sas= [] onebaj_slice1109 crp= 1 +--- 'expires': 1167127139 +1112 1 onebba_slice1110 nodes= [4110, 4111, 4112, 1110, 1111, 1112] persons= [3115, 3116, 3117] +--- sas= [] onebba_slice1110 crp= 1 +--- 'expires': 1167127139 +1113 1 onebbb_slice1111 nodes= [4111, 4112, 4113, 1111, 1112, 1113] persons= [3116, 3117, 3118] +--- sas= [] onebbb_slice1111 crp= 1 +--- 'expires': 1167127139 +1114 1 onebbc_slice1112 nodes= [4112, 4113, 4114, 1112, 1113, 1114] persons= [3117, 3118, 3119] +--- sas= [] onebbc_slice1112 crp= 1 +--- 'expires': 1167127140 +1115 1 onebbd_slice1113 nodes= [4113, 4114, 4115, 1113, 1114, 1115] persons= [3120, 3118, 3119] +--- sas= [] onebbd_slice1113 crp= 1 +--- 'expires': 1167127140 +1116 1 onebbe_slice1114 nodes= [4114, 4115, 4116, 1114, 1115, 1116] persons= [3120, 3121, 3119] +--- sas= [] onebbe_slice1114 crp= 1 +--- 'expires': 1167127140 +1117 1 onebbf_slice1115 nodes= [4115, 4116, 4117, 1115, 1116, 1117] persons= [3120, 3121, 3122] +--- sas= [] onebbf_slice1115 crp= 1 +--- 'expires': 1167127141 +1118 1 onebbg_slice1116 nodes= [4116, 4117, 4118, 1116, 1117, 1118] persons= [3121, 3122, 3123] +--- sas= [] onebbg_slice1116 crp= 1 +--- 'expires': 1167127141 +1119 1 onebbh_slice1117 nodes= [4117, 4118, 4119, 1117, 1118, 1119] persons= [3122, 3123, 3124] +--- sas= [] onebbh_slice1117 crp= 1 +--- 'expires': 1167127141 +1120 1 onebbi_slice1118 nodes= [1120, 4118, 4119, 4120, 1118, 1119] persons= [3123, 3124, 3125] +--- sas= [] onebbi_slice1118 crp= 1 +--- 'expires': 1167127142 +1121 1 onebbj_slice1119 nodes= [1120, 1121, 4119, 4120, 4121, 1119] persons= [3124, 3125, 3126] +--- sas= [] onebbj_slice1119 crp= 1 +--- 'expires': 1167127142 +1122 1 onebca_slice1120 nodes= [1120, 1121, 1122, 4120, 4121, 4122] persons= [3125, 3126, 3127] +--- sas= [] onebca_slice1120 crp= 1 +--- 'expires': 1167127143 +1123 1 onebcb_slice1121 nodes= [1121, 1122, 1123, 4121, 4122, 4123] persons= [3128, 3126, 3127] +--- sas= [] onebcb_slice1121 crp= 1 +--- 'expires': 1167127143 +1124 1 onebcc_slice1122 nodes= [1122, 1123, 1124, 4122, 4123, 4124] persons= [3128, 3129, 3127] +--- sas= [] onebcc_slice1122 crp= 1 +--- 'expires': 1167127143 +1125 1 onebcd_slice1123 nodes= [1123, 1124, 1125, 4123, 4124, 4125] persons= [3128, 3129, 3130] +--- sas= [] onebcd_slice1123 crp= 1 +--- 'expires': 1167127144 +1126 1 onebce_slice1124 nodes= [1124, 1125, 1126, 4124, 4125, 4126] persons= [3129, 3130, 3131] +--- sas= [] onebce_slice1124 crp= 1 +--- 'expires': 1167127144 +1127 1 onebcf_slice1125 nodes= [1125, 1126, 1127, 4125, 4126, 4127] persons= [3130, 3131, 3132] +--- sas= [] onebcf_slice1125 crp= 1 +--- 'expires': 1167127144 +1128 1 onebcg_slice1126 nodes= [4128, 1126, 1127, 1128, 4126, 4127] persons= [3131, 3132, 3133] +--- sas= [] onebcg_slice1126 crp= 1 +--- 'expires': 1167127145 +1129 1 onebch_slice1127 nodes= [4128, 4129, 1127, 1128, 1129, 4127] persons= [3132, 3133, 3134] +--- sas= [] onebch_slice1127 crp= 1 +--- 'expires': 1167127145 +1130 1 onebci_slice1128 nodes= [4128, 4129, 4130, 1128, 1129, 1130] persons= [3133, 3134, 3135] +--- sas= [] onebci_slice1128 crp= 1 +--- 'expires': 1167127145 +1131 1 onebcj_slice1129 nodes= [4129, 4130, 4131, 1129, 1130, 1131] persons= [3136, 3134, 3135] +--- sas= [] onebcj_slice1129 crp= 1 +--- 'expires': 1167127146 +1132 1 onebda_slice1130 nodes= [4130, 4131, 4132, 1130, 1131, 1132] persons= [3136, 3137, 3135] +--- sas= [] onebda_slice1130 crp= 1 +--- 'expires': 1167127146 +1133 1 onebdb_slice1131 nodes= [4131, 4132, 4133, 1131, 1132, 1133] persons= [3136, 3137, 3138] +--- sas= [] onebdb_slice1131 crp= 1 +--- 'expires': 1167127147 +1134 1 onebdc_slice1132 nodes= [4132, 4133, 4134, 1132, 1133, 1134] persons= [3137, 3138, 3139] +--- sas= [] onebdc_slice1132 crp= 1 +--- 'expires': 1167127147 +1135 1 onebdd_slice1133 nodes= [4133, 4134, 4135, 1133, 1134, 1135] persons= [3138, 3139, 3140] +--- sas= [] onebdd_slice1133 crp= 1 +--- 'expires': 1167127147 +1136 1 onebde_slice1134 nodes= [4134, 4135, 4136, 1134, 1135, 1136] persons= [3139, 3140, 3141] +--- sas= [] onebde_slice1134 crp= 1 +--- 'expires': 1167127148 +1137 1 onebdf_slice1135 nodes= [4135, 4136, 4137, 1135, 1136, 1137] persons= [3140, 3141, 3142] +--- sas= [] onebdf_slice1135 crp= 1 +--- 'expires': 1167127148 +1138 1 onebdg_slice1136 nodes= [4136, 4137, 4138, 1136, 1137, 1138] persons= [3141, 3142, 3143] +--- sas= [] onebdg_slice1136 crp= 1 +--- 'expires': 1167127148 +1139 1 onebdh_slice1137 nodes= [4137, 4138, 4139, 1137, 1138, 1139] persons= [3144, 3142, 3143] +--- sas= [] onebdh_slice1137 crp= 1 +--- 'expires': 1167127149 +1140 1 onebdi_slice1138 nodes= [4138, 4139, 4140, 1138, 1139, 1140] persons= [3144, 3145, 3143] +--- sas= [] onebdi_slice1138 crp= 1 +--- 'expires': 1167127149 +1141 1 onebdj_slice1139 nodes= [4139, 4140, 4141, 1139, 1140, 1141] persons= [3144, 3145, 3146] +--- sas= [] onebdj_slice1139 crp= 1 +--- 'expires': 1167127149 +1142 1 onebea_slice1140 nodes= [4140, 4141, 4142, 1140, 1141, 1142] persons= [3145, 3146, 3147] +--- sas= [] onebea_slice1140 crp= 1 +--- 'expires': 1167127150 +1143 1 onebeb_slice1141 nodes= [4141, 4142, 4143, 1141, 1142, 1143] persons= [3146, 3147, 3148] +--- sas= [] onebeb_slice1141 crp= 1 +--- 'expires': 1167127150 +1144 1 onebec_slice1142 nodes= [4142, 4143, 4144, 1142, 1143, 1144] persons= [3147, 3148, 3149] +--- sas= [] onebec_slice1142 crp= 1 +--- 'expires': 1167127151 +1145 1 onebed_slice1143 nodes= [4143, 4144, 4145, 1143, 1144, 1145] persons= [3148, 3149, 3150] +--- sas= [] onebed_slice1143 crp= 1 +--- 'expires': 1167127151 +1146 1 onebee_slice1144 nodes= [4144, 4145, 4146, 1144, 1145, 1146] persons= [3149, 3150, 3151] +--- sas= [] onebee_slice1144 crp= 1 +--- 'expires': 1167127151 +1147 1 onebef_slice1145 nodes= [4145, 4146, 4147, 1145, 1146, 1147] persons= [3152, 3150, 3151] +--- sas= [] onebef_slice1145 crp= 1 +--- 'expires': 1167127152 +1148 1 onebeg_slice1146 nodes= [4146, 4147, 4148, 1146, 1147, 1148] persons= [3152, 3153, 3151] +--- sas= [] onebeg_slice1146 crp= 1 +--- 'expires': 1167127152 +1149 1 onebeh_slice1147 nodes= [4147, 4148, 4149, 1147, 1148, 1149] persons= [3152, 3153, 3154] +--- sas= [] onebeh_slice1147 crp= 1 +--- 'expires': 1167127152 +1150 1 onebei_slice1148 nodes= [4148, 4149, 4150, 1148, 1149, 1150] persons= [3153, 3154, 3155] +--- sas= [] onebei_slice1148 crp= 1 +--- 'expires': 1167127153 +1151 1 onebej_slice1149 nodes= [4149, 4150, 4151, 1149, 1150, 1151] persons= [3154, 3155, 3156] +--- sas= [] onebej_slice1149 crp= 1 +--- 'expires': 1167127153 +1152 1 onebfa_slice1150 nodes= [1152, 4150, 4151, 4152, 1150, 1151] persons= [3155, 3156, 3157] +--- sas= [] onebfa_slice1150 crp= 1 +--- 'expires': 1167127153 +1153 1 onebfb_slice1151 nodes= [1152, 1153, 4151, 4152, 4153, 1151] persons= [3156, 3157, 3158] +--- sas= [] onebfb_slice1151 crp= 1 +--- 'expires': 1167127154 +1154 1 onebfc_slice1152 nodes= [1152, 1153, 1154, 4152, 4153, 4154] persons= [3157, 3158, 3159] +--- sas= [] onebfc_slice1152 crp= 1 +--- 'expires': 1167127154 +1155 1 onebfd_slice1153 nodes= [1153, 1154, 1155, 4153, 4154, 4155] persons= [3160, 3158, 3159] +--- sas= [] onebfd_slice1153 crp= 1 +--- 'expires': 1167127155 +1156 1 onebfe_slice1154 nodes= [1154, 1155, 1156, 4154, 4155, 4156] persons= [3160, 3161, 3159] +--- sas= [] onebfe_slice1154 crp= 1 +--- 'expires': 1167127155 +1157 1 onebff_slice1155 nodes= [1155, 1156, 1157, 4155, 4156, 4157] persons= [3160, 3161, 3162] +--- sas= [] onebff_slice1155 crp= 1 +--- 'expires': 1167127155 +1158 1 onebfg_slice1156 nodes= [1156, 1157, 1158, 4156, 4157, 4158] persons= [3161, 3162, 3163] +--- sas= [] onebfg_slice1156 crp= 1 +--- 'expires': 1167127156 +1159 1 onebfh_slice1157 nodes= [1157, 1158, 1159, 4157, 4158, 4159] persons= [3162, 3163, 3164] +--- sas= [] onebfh_slice1157 crp= 1 +--- 'expires': 1167127156 +1160 1 onebfi_slice1158 nodes= [4160, 1158, 1159, 1160, 4158, 4159] persons= [3163, 3164, 3165] +--- sas= [] onebfi_slice1158 crp= 1 +--- 'expires': 1167127156 +1161 1 onebfj_slice1159 nodes= [4160, 4161, 1159, 1160, 1161, 4159] persons= [3164, 3165, 3166] +--- sas= [] onebfj_slice1159 crp= 1 +--- 'expires': 1167127157 +1162 1 onebga_slice1160 nodes= [4160, 4161, 4162, 1160, 1161, 1162] persons= [3165, 3166, 3167] +--- sas= [] onebga_slice1160 crp= 1 +--- 'expires': 1167127157 +1163 1 onebgb_slice1161 nodes= [4161, 4162, 4163, 1161, 1162, 1163] persons= [3168, 3166, 3167] +--- sas= [] onebgb_slice1161 crp= 1 +--- 'expires': 1167127157 +1164 1 onebgc_slice1162 nodes= [4162, 4163, 4164, 1162, 1163, 1164] persons= [3168, 3169, 3167] +--- sas= [] onebgc_slice1162 crp= 1 +--- 'expires': 1167127158 +1165 1 onebgd_slice1163 nodes= [4163, 4164, 4165, 1163, 1164, 1165] persons= [3168, 3169, 3170] +--- sas= [] onebgd_slice1163 crp= 1 +--- 'expires': 1167127158 +1166 1 onebge_slice1164 nodes= [4164, 4165, 4166, 1164, 1165, 1166] persons= [3169, 3170, 3171] +--- sas= [] onebge_slice1164 crp= 1 +--- 'expires': 1167127159 +1167 1 onebgf_slice1165 nodes= [4165, 4166, 4167, 1165, 1166, 1167] persons= [3170, 3171, 3172] +--- sas= [] onebgf_slice1165 crp= 1 +--- 'expires': 1167127159 +1168 1 onebgg_slice1166 nodes= [4166, 4167, 4168, 1166, 1167, 1168] persons= [3171, 3172, 3173] +--- sas= [] onebgg_slice1166 crp= 1 +--- 'expires': 1167127159 +1169 1 onebgh_slice1167 nodes= [4167, 4168, 4169, 1167, 1168, 1169] persons= [3172, 3173, 3174] +--- sas= [] onebgh_slice1167 crp= 1 +--- 'expires': 1167127160 +1170 1 onebgi_slice1168 nodes= [4168, 4169, 4170, 1168, 1169, 1170] persons= [3173, 3174, 3175] +--- sas= [] onebgi_slice1168 crp= 1 +--- 'expires': 1167127160 +1171 1 onebgj_slice1169 nodes= [4169, 4170, 4171, 1169, 1170, 1171] persons= [3176, 3174, 3175] +--- sas= [] onebgj_slice1169 crp= 1 +--- 'expires': 1167127161 +1172 1 onebha_slice1170 nodes= [4170, 4171, 4172, 1170, 1171, 1172] persons= [3176, 3177, 3175] +--- sas= [] onebha_slice1170 crp= 1 +--- 'expires': 1167127161 +1173 1 onebhb_slice1171 nodes= [4171, 4172, 4173, 1171, 1172, 1173] persons= [3176, 3177, 3178] +--- sas= [] onebhb_slice1171 crp= 1 +--- 'expires': 1167127161 +1174 1 onebhc_slice1172 nodes= [4172, 4173, 4174, 1172, 1173, 1174] persons= [3177, 3178, 3179] +--- sas= [] onebhc_slice1172 crp= 1 +--- 'expires': 1167127162 +1175 1 onebhd_slice1173 nodes= [4173, 4174, 4175, 1173, 1174, 1175] persons= [3178, 3179, 3180] +--- sas= [] onebhd_slice1173 crp= 1 +--- 'expires': 1167127162 +1176 1 onebhe_slice1174 nodes= [4174, 4175, 4176, 1174, 1175, 1176] persons= [3179, 3180, 3181] +--- sas= [] onebhe_slice1174 crp= 1 +--- 'expires': 1167127163 +1177 1 onebhf_slice1175 nodes= [4175, 4176, 4177, 1175, 1176, 1177] persons= [3180, 3181, 3182] +--- sas= [] onebhf_slice1175 crp= 1 +--- 'expires': 1167127163 +1178 1 onebhg_slice1176 nodes= [4176, 4177, 4178, 1176, 1177, 1178] persons= [3181, 3182, 3183] +--- sas= [] onebhg_slice1176 crp= 1 +--- 'expires': 1167127163 +1179 1 onebhh_slice1177 nodes= [4177, 4178, 4179, 1177, 1178, 1179] persons= [3184, 3182, 3183] +--- sas= [] onebhh_slice1177 crp= 1 +--- 'expires': 1167127164 +1180 1 onebhi_slice1178 nodes= [4178, 4179, 4180, 1178, 1179, 1180] persons= [3184, 3185, 3183] +--- sas= [] onebhi_slice1178 crp= 1 +--- 'expires': 1167127164 +1181 1 onebhj_slice1179 nodes= [4179, 4180, 4181, 1179, 1180, 1181] persons= [3184, 3185, 3186] +--- sas= [] onebhj_slice1179 crp= 1 +--- 'expires': 1167127165 +1182 1 onebia_slice1180 nodes= [4180, 4181, 4182, 1180, 1181, 1182] persons= [3185, 3186, 3187] +--- sas= [] onebia_slice1180 crp= 1 +--- 'expires': 1167127165 +1183 1 onebib_slice1181 nodes= [4181, 4182, 4183, 1181, 1182, 1183] persons= [3186, 3187, 3188] +--- sas= [] onebib_slice1181 crp= 1 +--- 'expires': 1167127165 +1184 1 onebic_slice1182 nodes= [1184, 4182, 4183, 4184, 1182, 1183] persons= [3187, 3188, 3189] +--- sas= [] onebic_slice1182 crp= 1 +--- 'expires': 1167127166 +1185 1 onebid_slice1183 nodes= [1184, 1185, 4183, 4184, 4185, 1183] persons= [3188, 3189, 3190] +--- sas= [] onebid_slice1183 crp= 1 +--- 'expires': 1167127166 +1186 1 onebie_slice1184 nodes= [1184, 1185, 1186, 4184, 4185, 4186] persons= [3189, 3190, 3191] +--- sas= [] onebie_slice1184 crp= 1 +--- 'expires': 1167127167 +1187 1 onebif_slice1185 nodes= [1185, 1186, 1187, 4185, 4186, 4187] persons= [3192, 3190, 3191] +--- sas= [] onebif_slice1185 crp= 1 +--- 'expires': 1167127167 +1188 1 onebig_slice1186 nodes= [1186, 1187, 1188, 4186, 4187, 4188] persons= [3192, 3193, 3191] +--- sas= [] onebig_slice1186 crp= 1 +--- 'expires': 1167127167 +1189 1 onebih_slice1187 nodes= [1187, 1188, 1189, 4187, 4188, 4189] persons= [3192, 3193, 3194] +--- sas= [] onebih_slice1187 crp= 1 +--- 'expires': 1167127168 +1190 1 onebii_slice1188 nodes= [1188, 1189, 1190, 4188, 4189, 4190] persons= [3193, 3194, 3195] +--- sas= [] onebii_slice1188 crp= 1 +--- 'expires': 1167127168 +1191 1 onebij_slice1189 nodes= [1189, 1190, 1191, 4189, 4190, 4191] persons= [3194, 3195, 3196] +--- sas= [] onebij_slice1189 crp= 1 +--- 'expires': 1167127169 +1192 1 onebja_slice1190 nodes= [4192, 1190, 1191, 1192, 4190, 4191] persons= [3195, 3196, 3197] +--- sas= [] onebja_slice1190 crp= 1 +--- 'expires': 1167127169 +1193 1 onebjb_slice1191 nodes= [4192, 4193, 1191, 1192, 1193, 4191] persons= [3196, 3197, 3198] +--- sas= [] onebjb_slice1191 crp= 1 +--- 'expires': 1167127169 +1194 1 onebjc_slice1192 nodes= [4192, 4193, 4194, 1192, 1193, 1194] persons= [3197, 3198, 3199] +--- sas= [] onebjc_slice1192 crp= 1 +--- 'expires': 1167127170 +1195 1 onebjd_slice1193 nodes= [4193, 4194, 4195, 1193, 1194, 1195] persons= [3200, 3198, 3199] +--- sas= [] onebjd_slice1193 crp= 1 +--- 'expires': 1167127170 +1196 1 onebje_slice1194 nodes= [4194, 4195, 4196, 1194, 1195, 1196] persons= [3200, 3201, 3199] +--- sas= [] onebje_slice1194 crp= 1 +--- 'expires': 1167127171 +1197 1 onebjf_slice1195 nodes= [4195, 4196, 4197, 1195, 1196, 1197] persons= [3200, 3201, 3202] +--- sas= [] onebjf_slice1195 crp= 1 +--- 'expires': 1167127171 +1198 1 onebjg_slice1196 nodes= [4196, 4197, 4198, 1196, 1197, 1198] persons= [3201, 3202, 3203] +--- sas= [] onebjg_slice1196 crp= 1 +--- 'expires': 1167127171 +1199 1 onebjh_slice1197 nodes= [4197, 4198, 4199, 1197, 1198, 1199] persons= [3202, 3203, 3204] +--- sas= [] onebjh_slice1197 crp= 1 +--- 'expires': 1167127172 +1200 1 onebji_slice1198 nodes= [4198, 4199, 4200, 1198, 1199, 1200] persons= [3203, 3204, 3205] +--- sas= [] onebji_slice1198 crp= 1 +--- 'expires': 1167127172 +1201 1 onebjj_slice1199 nodes= [4199, 4200, 4201, 1199, 1200, 1201] persons= [3204, 3205, 3206] +--- sas= [] onebjj_slice1199 crp= 1 +--- 'expires': 1167127173 +1202 1 onecaa_slice1200 nodes= [4200, 4201, 4202, 1200, 1201, 1202] persons= [3205, 3206, 3207] +--- sas= [] onecaa_slice1200 crp= 1 +--- 'expires': 1167127173 +1203 1 onecab_slice1201 nodes= [4201, 4202, 4203, 1201, 1202, 1203] persons= [3208, 3206, 3207] +--- sas= [] onecab_slice1201 crp= 1 +--- 'expires': 1167127173 +1204 1 onecac_slice1202 nodes= [4202, 4203, 4204, 1202, 1203, 1204] persons= [3208, 3209, 3207] +--- sas= [] onecac_slice1202 crp= 1 +--- 'expires': 1167127174 +1205 1 onecad_slice1203 nodes= [4203, 4204, 4205, 1203, 1204, 1205] persons= [3208, 3209, 3210] +--- sas= [] onecad_slice1203 crp= 1 +--- 'expires': 1167127174 +1206 1 onecae_slice1204 nodes= [4204, 4205, 4206, 1204, 1205, 1206] persons= [3209, 3210, 3211] +--- sas= [] onecae_slice1204 crp= 1 +--- 'expires': 1167127175 +1207 1 onecaf_slice1205 nodes= [4205, 4206, 4207, 1205, 1206, 1207] persons= [3210, 3211, 3212] +--- sas= [] onecaf_slice1205 crp= 1 +--- 'expires': 1167127175 +1208 1 onecag_slice1206 nodes= [4206, 4207, 4208, 1206, 1207, 1208] persons= [3211, 3212, 3213] +--- sas= [] onecag_slice1206 crp= 1 +--- 'expires': 1167127175 +1209 1 onecah_slice1207 nodes= [4207, 4208, 4209, 1207, 1208, 1209] persons= [3212, 3213, 3214] +--- sas= [] onecah_slice1207 crp= 1 +--- 'expires': 1167127176 +1210 1 onecai_slice1208 nodes= [4208, 4209, 4210, 1208, 1209, 1210] persons= [3213, 3214, 3215] +--- sas= [] onecai_slice1208 crp= 1 +--- 'expires': 1167127176 +1211 1 onecaj_slice1209 nodes= [4209, 4210, 4211, 1209, 1210, 1211] persons= [3216, 3214, 3215] +--- sas= [] onecaj_slice1209 crp= 1 +--- 'expires': 1167127177 +1212 1 onecba_slice1210 nodes= [4210, 4211, 4212, 1210, 1211, 1212] persons= [3216, 3217, 3215] +--- sas= [] onecba_slice1210 crp= 1 +--- 'expires': 1167127177 +1213 1 onecbb_slice1211 nodes= [4211, 4212, 4213, 1211, 1212, 1213] persons= [3216, 3217, 3218] +--- sas= [] onecbb_slice1211 crp= 1 +--- 'expires': 1167127177 +1214 1 onecbc_slice1212 nodes= [4212, 4213, 4214, 1212, 1213, 1214] persons= [3217, 3218, 3219] +--- sas= [] onecbc_slice1212 crp= 1 +--- 'expires': 1167127178 +1215 1 onecbd_slice1213 nodes= [4213, 4214, 4215, 1213, 1214, 1215] persons= [3218, 3219, 3220] +--- sas= [] onecbd_slice1213 crp= 1 +--- 'expires': 1167127178 +1216 1 onecbe_slice1214 nodes= [1216, 4214, 4215, 4216, 1214, 1215] persons= [3219, 3220, 3221] +--- sas= [] onecbe_slice1214 crp= 1 +--- 'expires': 1167127179 +1217 1 onecbf_slice1215 nodes= [1216, 1217, 4215, 4216, 4217, 1215] persons= [3220, 3221, 3222] +--- sas= [] onecbf_slice1215 crp= 1 +--- 'expires': 1167127179 +1218 1 onecbg_slice1216 nodes= [1216, 1217, 1218, 4216, 4217, 4218] persons= [3221, 3222, 3223] +--- sas= [] onecbg_slice1216 crp= 1 +--- 'expires': 1167127179 +1219 1 onecbh_slice1217 nodes= [1217, 1218, 1219, 4217, 4218, 4219] persons= [3224, 3222, 3223] +--- sas= [] onecbh_slice1217 crp= 1 +--- 'expires': 1167127180 +1220 1 onecbi_slice1218 nodes= [1218, 1219, 1220, 4218, 4219, 4220] persons= [3224, 3225, 3223] +--- sas= [] onecbi_slice1218 crp= 1 +--- 'expires': 1167127180 +1221 1 onecbj_slice1219 nodes= [1219, 1220, 1221, 4219, 4220, 4221] persons= [3224, 3225, 3226] +--- sas= [] onecbj_slice1219 crp= 1 +--- 'expires': 1167127181 +1222 1 onecca_slice1220 nodes= [1220, 1221, 1222, 4220, 4221, 4222] persons= [3225, 3226, 3227] +--- sas= [] onecca_slice1220 crp= 1 +--- 'expires': 1167127181 +1223 1 oneccb_slice1221 nodes= [1221, 1222, 1223, 4221, 4222, 4223] persons= [3226, 3227, 3228] +--- sas= [] oneccb_slice1221 crp= 1 +--- 'expires': 1167127182 +1224 1 oneccc_slice1222 nodes= [4224, 1222, 1223, 1224, 4222, 4223] persons= [3227, 3228, 3229] +--- sas= [] oneccc_slice1222 crp= 1 +--- 'expires': 1167127182 +1225 1 oneccd_slice1223 nodes= [4224, 4225, 1223, 1224, 1225, 4223] persons= [3228, 3229, 3230] +--- sas= [] oneccd_slice1223 crp= 1 +--- 'expires': 1167127182 +1226 1 onecce_slice1224 nodes= [4224, 4225, 4226, 1224, 1225, 1226] persons= [3229, 3230, 3231] +--- sas= [] onecce_slice1224 crp= 1 +--- 'expires': 1167127183 +1227 1 oneccf_slice1225 nodes= [4225, 4226, 4227, 1225, 1226, 1227] persons= [3232, 3230, 3231] +--- sas= [] oneccf_slice1225 crp= 1 +--- 'expires': 1167127183 +1228 1 oneccg_slice1226 nodes= [4226, 4227, 4228, 1226, 1227, 1228] persons= [3232, 3233, 3231] +--- sas= [] oneccg_slice1226 crp= 1 +--- 'expires': 1167127184 +1229 1 onecch_slice1227 nodes= [4227, 4228, 4229, 1227, 1228, 1229] persons= [3232, 3233, 3234] +--- sas= [] onecch_slice1227 crp= 1 +--- 'expires': 1167127184 +1230 1 onecci_slice1228 nodes= [4228, 4229, 4230, 1228, 1229, 1230] persons= [3233, 3234, 3235] +--- sas= [] onecci_slice1228 crp= 1 +--- 'expires': 1167127184 +1231 1 oneccj_slice1229 nodes= [4229, 4230, 4231, 1229, 1230, 1231] persons= [3234, 3235, 3236] +--- sas= [] oneccj_slice1229 crp= 1 +--- 'expires': 1167127185 +1232 1 onecda_slice1230 nodes= [4230, 4231, 4232, 1230, 1231, 1232] persons= [3235, 3236, 3237] +--- sas= [] onecda_slice1230 crp= 1 +--- 'expires': 1167127185 +1233 1 onecdb_slice1231 nodes= [4231, 4232, 4233, 1231, 1232, 1233] persons= [3236, 3237, 3238] +--- sas= [] onecdb_slice1231 crp= 1 +--- 'expires': 1167127186 +1234 1 onecdc_slice1232 nodes= [4232, 4233, 4234, 1232, 1233, 1234] persons= [3237, 3238, 3239] +--- sas= [] onecdc_slice1232 crp= 1 +--- 'expires': 1167127186 +1235 1 onecdd_slice1233 nodes= [4233, 4234, 4235, 1233, 1234, 1235] persons= [3240, 3238, 3239] +--- sas= [] onecdd_slice1233 crp= 1 +--- 'expires': 1167127186 +1236 1 onecde_slice1234 nodes= [4234, 4235, 4236, 1234, 1235, 1236] persons= [3240, 3241, 3239] +--- sas= [] onecde_slice1234 crp= 1 +--- 'expires': 1167127187 +1237 1 onecdf_slice1235 nodes= [4235, 4236, 4237, 1235, 1236, 1237] persons= [3240, 3241, 3242] +--- sas= [] onecdf_slice1235 crp= 1 +--- 'expires': 1167127187 +1238 1 onecdg_slice1236 nodes= [4236, 4237, 4238, 1236, 1237, 1238] persons= [3241, 3242, 3243] +--- sas= [] onecdg_slice1236 crp= 1 +--- 'expires': 1167127188 +1239 1 onecdh_slice1237 nodes= [4237, 4238, 4239, 1237, 1238, 1239] persons= [3242, 3243, 3244] +--- sas= [] onecdh_slice1237 crp= 1 +--- 'expires': 1167127188 +1240 1 onecdi_slice1238 nodes= [4238, 4239, 4240, 1238, 1239, 1240] persons= [3243, 3244, 3245] +--- sas= [] onecdi_slice1238 crp= 1 +--- 'expires': 1167127188 +1241 1 onecdj_slice1239 nodes= [4239, 4240, 4241, 1239, 1240, 1241] persons= [3244, 3245, 3246] +--- sas= [] onecdj_slice1239 crp= 1 +--- 'expires': 1167127189 +1242 1 onecea_slice1240 nodes= [4240, 4241, 4242, 1240, 1241, 1242] persons= [3245, 3246, 3247] +--- sas= [] onecea_slice1240 crp= 1 +--- 'expires': 1167127189 +1243 1 oneceb_slice1241 nodes= [4241, 4242, 4243, 1241, 1242, 1243] persons= [3248, 3246, 3247] +--- sas= [] oneceb_slice1241 crp= 1 +--- 'expires': 1167127190 +1244 1 onecec_slice1242 nodes= [4242, 4243, 4244, 1242, 1243, 1244] persons= [3248, 3249, 3247] +--- sas= [] onecec_slice1242 crp= 1 +--- 'expires': 1167127190 +1245 1 oneced_slice1243 nodes= [4243, 4244, 4245, 1243, 1244, 1245] persons= [3248, 3249, 3250] +--- sas= [] oneced_slice1243 crp= 1 +--- 'expires': 1167127190 +1246 1 onecee_slice1244 nodes= [4244, 4245, 4246, 1244, 1245, 1246] persons= [3249, 3250, 3251] +--- sas= [] onecee_slice1244 crp= 1 +--- 'expires': 1167127191 +1247 1 onecef_slice1245 nodes= [4245, 4246, 4247, 1245, 1246, 1247] persons= [3250, 3251, 3252] +--- sas= [] onecef_slice1245 crp= 1 +--- 'expires': 1167127191 +1248 1 oneceg_slice1246 nodes= [1248, 4246, 4247, 4248, 1246, 1247] persons= [3251, 3252, 3253] +--- sas= [] oneceg_slice1246 crp= 1 +--- 'expires': 1167127192 +1249 1 oneceh_slice1247 nodes= [1248, 1249, 4247, 4248, 4249, 1247] persons= [3252, 3253, 3254] +--- sas= [] oneceh_slice1247 crp= 1 +--- 'expires': 1167127192 +1250 1 onecei_slice1248 nodes= [1248, 1249, 1250, 4248, 4249, 4250] persons= [3253, 3254, 3255] +--- sas= [] onecei_slice1248 crp= 1 +--- 'expires': 1167127193 +1251 1 onecej_slice1249 nodes= [1249, 1250, 1251, 4249, 4250, 4251] persons= [3256, 3254, 3255] +--- sas= [] onecej_slice1249 crp= 1 +--- 'expires': 1167127193 +1252 1 onecfa_slice1250 nodes= [1250, 1251, 1252, 4250, 4251, 4252] persons= [3256, 3257, 3255] +--- sas= [] onecfa_slice1250 crp= 1 +--- 'expires': 1167127193 +1253 1 onecfb_slice1251 nodes= [1251, 1252, 1253, 4251, 4252, 4253] persons= [3256, 3257, 3258] +--- sas= [] onecfb_slice1251 crp= 1 +--- 'expires': 1167127194 +1254 1 onecfc_slice1252 nodes= [1252, 1253, 1254, 4252, 4253, 4254] persons= [3257, 3258, 3259] +--- sas= [] onecfc_slice1252 crp= 1 +--- 'expires': 1167127194 +1255 1 onecfd_slice1253 nodes= [1253, 1254, 1255, 4253, 4254, 4255] persons= [3258, 3259, 3260] +--- sas= [] onecfd_slice1253 crp= 1 +--- 'expires': 1167127195 +1256 1 onecfe_slice1254 nodes= [4256, 1254, 1255, 1256, 4254, 4255] persons= [3259, 3260, 3261] +--- sas= [] onecfe_slice1254 crp= 1 +--- 'expires': 1167127195 +1257 1 onecff_slice1255 nodes= [4256, 4257, 1255, 1256, 1257, 4255] persons= [3260, 3261, 3262] +--- sas= [] onecff_slice1255 crp= 1 +--- 'expires': 1167127195 +1258 1 onecfg_slice1256 nodes= [4256, 4257, 4258, 1256, 1257, 1258] persons= [3261, 3262, 3263] +--- sas= [] onecfg_slice1256 crp= 1 +--- 'expires': 1167127196 +1259 1 onecfh_slice1257 nodes= [4257, 4258, 4259, 1257, 1258, 1259] persons= [3264, 3262, 3263] +--- sas= [] onecfh_slice1257 crp= 1 +--- 'expires': 1167127196 +1260 1 onecfi_slice1258 nodes= [4258, 4259, 4260, 1258, 1259, 1260] persons= [3264, 3265, 3263] +--- sas= [] onecfi_slice1258 crp= 1 +--- 'expires': 1167127197 +1261 1 onecfj_slice1259 nodes= [4259, 4260, 4261, 1259, 1260, 1261] persons= [3264, 3265, 3266] +--- sas= [] onecfj_slice1259 crp= 1 +--- 'expires': 1167127197 +1262 1 onecga_slice1260 nodes= [4260, 4261, 4262, 1260, 1261, 1262] persons= [3265, 3266, 3267] +--- sas= [] onecga_slice1260 crp= 1 +--- 'expires': 1167127197 +1263 1 onecgb_slice1261 nodes= [4261, 4262, 4263, 1261, 1262, 1263] persons= [3266, 3267, 3268] +--- sas= [] onecgb_slice1261 crp= 1 +--- 'expires': 1167127198 +1264 1 onecgc_slice1262 nodes= [4262, 4263, 4264, 1262, 1263, 1264] persons= [3267, 3268, 3269] +--- sas= [] onecgc_slice1262 crp= 1 +--- 'expires': 1167127198 +1265 1 onecgd_slice1263 nodes= [4263, 4264, 4265, 1263, 1264, 1265] persons= [3268, 3269, 3270] +--- sas= [] onecgd_slice1263 crp= 1 +--- 'expires': 1167127199 +1266 1 onecge_slice1264 nodes= [4264, 4265, 4266, 1264, 1265, 1266] persons= [3269, 3270, 3271] +--- sas= [] onecge_slice1264 crp= 1 +--- 'expires': 1167127199 +1267 1 onecgf_slice1265 nodes= [4265, 4266, 4267, 1265, 1266, 1267] persons= [3272, 3270, 3271] +--- sas= [] onecgf_slice1265 crp= 1 +--- 'expires': 1167127200 +1268 1 onecgg_slice1266 nodes= [4266, 4267, 4268, 1266, 1267, 1268] persons= [3272, 3273, 3271] +--- sas= [] onecgg_slice1266 crp= 1 +--- 'expires': 1167127200 +1269 1 onecgh_slice1267 nodes= [4267, 4268, 4269, 1267, 1268, 1269] persons= [3272, 3273, 3274] +--- sas= [] onecgh_slice1267 crp= 1 +--- 'expires': 1167127200 +1270 1 onecgi_slice1268 nodes= [4268, 4269, 4270, 1268, 1269, 1270] persons= [3273, 3274, 3275] +--- sas= [] onecgi_slice1268 crp= 1 +--- 'expires': 1167127201 +1271 1 onecgj_slice1269 nodes= [4269, 4270, 4271, 1269, 1270, 1271] persons= [3274, 3275, 3276] +--- sas= [] onecgj_slice1269 crp= 1 +--- 'expires': 1167127201 +1272 1 onecha_slice1270 nodes= [4270, 4271, 4272, 1270, 1271, 1272] persons= [3275, 3276, 3277] +--- sas= [] onecha_slice1270 crp= 1 +--- 'expires': 1167127202 +1273 1 onechb_slice1271 nodes= [4271, 4272, 4273, 1271, 1272, 1273] persons= [3276, 3277, 3278] +--- sas= [] onechb_slice1271 crp= 1 +--- 'expires': 1167127210 +1274 1 onechc_slice1272 nodes= [4272, 4273, 4274, 1272, 1273, 1274] persons= [3277, 3278, 3279] +--- sas= [] onechc_slice1272 crp= 1 +--- 'expires': 1167127211 +1275 1 onechd_slice1273 nodes= [4273, 4274, 4275, 1273, 1274, 1275] persons= [3280, 3278, 3279] +--- sas= [] onechd_slice1273 crp= 1 +--- 'expires': 1167127214 +1276 1 oneche_slice1274 nodes= [4274, 4275, 4276, 1274, 1275, 1276] persons= [3280, 3281, 3279] +--- sas= [] oneche_slice1274 crp= 1 +--- 'expires': 1167127216 +1277 1 onechf_slice1275 nodes= [4275, 4276, 4277, 1275, 1276, 1277] persons= [3280, 3281, 3282] +--- sas= [] onechf_slice1275 crp= 1 +--- 'expires': 1167127217 +1278 1 onechg_slice1276 nodes= [4276, 4277, 4278, 1276, 1277, 1278] persons= [3281, 3282, 3283] +--- sas= [] onechg_slice1276 crp= 1 +--- 'expires': 1167127219 +1279 1 onechh_slice1277 nodes= [4277, 4278, 4279, 1277, 1278, 1279] persons= [3282, 3283, 3284] +--- sas= [] onechh_slice1277 crp= 1 +--- 'expires': 1167127220 +1280 1 onechi_slice1278 nodes= [1280, 4278, 4279, 4280, 1278, 1279] persons= [3283, 3284, 3285] +--- sas= [] onechi_slice1278 crp= 1 +--- 'expires': 1167127222 +1281 1 onechj_slice1279 nodes= [1280, 1281, 4279, 4280, 4281, 1279] persons= [3284, 3285, 3286] +--- sas= [] onechj_slice1279 crp= 1 +--- 'expires': 1167127223 +1282 1 onecia_slice1280 nodes= [1280, 1281, 1282, 4280, 4281, 4282] persons= [3285, 3286, 3287] +--- sas= [] onecia_slice1280 crp= 1 +--- 'expires': 1167127224 +1283 1 onecib_slice1281 nodes= [1281, 1282, 1283, 4281, 4282, 4283] persons= [3288, 3286, 3287] +--- sas= [] onecib_slice1281 crp= 1 +--- 'expires': 1167127226 +1284 1 onecic_slice1282 nodes= [1282, 1283, 1284, 4282, 4283, 4284] persons= [3288, 3289, 3287] +--- sas= [] onecic_slice1282 crp= 1 +--- 'expires': 1167127227 +1285 1 onecid_slice1283 nodes= [1283, 1284, 1285, 4283, 4284, 4285] persons= [3288, 3289, 3290] +--- sas= [] onecid_slice1283 crp= 1 +--- 'expires': 1167127229 +1286 1 onecie_slice1284 nodes= [1284, 1285, 1286, 4284, 4285, 4286] persons= [3289, 3290, 3291] +--- sas= [] onecie_slice1284 crp= 1 +--- 'expires': 1167127230 +1287 1 onecif_slice1285 nodes= [1285, 1286, 1287, 4285, 4286, 4287] persons= [3290, 3291, 3292] +--- sas= [] onecif_slice1285 crp= 1 +--- 'expires': 1167127231 +1288 1 onecig_slice1286 nodes= [4288, 1286, 1287, 1288, 4286, 4287] persons= [3291, 3292, 3293] +--- sas= [] onecig_slice1286 crp= 1 +--- 'expires': 1167127233 +1289 1 onecih_slice1287 nodes= [4288, 4289, 1287, 1288, 1289, 4287] persons= [3292, 3293, 3294] +--- sas= [] onecih_slice1287 crp= 1 +--- 'expires': 1167127234 +1290 1 onecii_slice1288 nodes= [4288, 4289, 4290, 1288, 1289, 1290] persons= [3293, 3294, 3295] +--- sas= [] onecii_slice1288 crp= 1 +--- 'expires': 1167127235 +1291 1 onecij_slice1289 nodes= [4289, 4290, 4291, 1289, 1290, 1291] persons= [3296, 3294, 3295] +--- sas= [] onecij_slice1289 crp= 1 +--- 'expires': 1167127237 +1292 1 onecja_slice1290 nodes= [4290, 4291, 4292, 1290, 1291, 1292] persons= [3296, 3297, 3295] +--- sas= [] onecja_slice1290 crp= 1 +--- 'expires': 1167127239 +1293 1 onecjb_slice1291 nodes= [4291, 4292, 4293, 1291, 1292, 1293] persons= [3296, 3297, 3298] +--- sas= [] onecjb_slice1291 crp= 1 +--- 'expires': 1167127240 +1294 1 onecjc_slice1292 nodes= [4292, 4293, 4294, 1292, 1293, 1294] persons= [3297, 3298, 3299] +--- sas= [] onecjc_slice1292 crp= 1 +--- 'expires': 1167127241 +1295 1 onecjd_slice1293 nodes= [4293, 4294, 4295, 1293, 1294, 1295] persons= [3298, 3299, 3300] +--- sas= [] onecjd_slice1293 crp= 1 +--- 'expires': 1167127243 +1296 1 onecje_slice1294 nodes= [4294, 4295, 4296, 1294, 1295, 1296] persons= [3299, 3300, 3301] +--- sas= [] onecje_slice1294 crp= 1 +--- 'expires': 1167127244 +1297 1 onecjf_slice1295 nodes= [4295, 4296, 4297, 1295, 1296, 1297] persons= [3300, 3301, 3302] +--- sas= [] onecjf_slice1295 crp= 1 +--- 'expires': 1167127245 +1298 1 onecjg_slice1296 nodes= [4296, 4297, 4298, 1296, 1297, 1298] persons= [3301, 3302, 3303] +--- sas= [] onecjg_slice1296 crp= 1 +--- 'expires': 1167127247 +1299 1 onecjh_slice1297 nodes= [4297, 4298, 4299, 1297, 1298, 1299] persons= [3304, 3302, 3303] +--- sas= [] onecjh_slice1297 crp= 1 +--- 'expires': 1167127248 +1300 1 onecji_slice1298 nodes= [4298, 4299, 4300, 1298, 1299, 1300] persons= [3304, 3305, 3303] +--- sas= [] onecji_slice1298 crp= 1 +--- 'expires': 1167127250 +1301 1 onecjj_slice1299 nodes= [4299, 4300, 4301, 1299, 1300, 1301] persons= [3304, 3305, 3306] +--- sas= [] onecjj_slice1299 crp= 1 +--- 'expires': 1167127251 +1302 1 onedaa_slice1300 nodes= [4300, 4301, 4302, 1300, 1301, 1302] persons= [3305, 3306, 3307] +--- sas= [] onedaa_slice1300 crp= 1 +--- 'expires': 1167127253 +1303 1 onedab_slice1301 nodes= [4301, 4302, 4303, 1301, 1302, 1303] persons= [3306, 3307, 3308] +--- sas= [] onedab_slice1301 crp= 1 +--- 'expires': 1167127254 +1304 1 onedac_slice1302 nodes= [4302, 4303, 4304, 1302, 1303, 1304] persons= [3307, 3308, 3309] +--- sas= [] onedac_slice1302 crp= 1 +--- 'expires': 1167127256 +1305 1 onedad_slice1303 nodes= [4303, 4304, 4305, 1303, 1304, 1305] persons= [3308, 3309, 3310] +--- sas= [] onedad_slice1303 crp= 1 +--- 'expires': 1167127257 +1306 1 onedae_slice1304 nodes= [4304, 4305, 4306, 1304, 1305, 1306] persons= [3309, 3310, 3311] +--- sas= [] onedae_slice1304 crp= 1 +--- 'expires': 1167127259 +1307 1 onedaf_slice1305 nodes= [4305, 4306, 4307, 1305, 1306, 1307] persons= [3312, 3310, 3311] +--- sas= [] onedaf_slice1305 crp= 1 +--- 'expires': 1167127260 +1308 1 onedag_slice1306 nodes= [4306, 4307, 4308, 1306, 1307, 1308] persons= [3312, 3313, 3311] +--- sas= [] onedag_slice1306 crp= 1 +--- 'expires': 1167127262 +1309 1 onedah_slice1307 nodes= [4307, 4308, 4309, 1307, 1308, 1309] persons= [3312, 3313, 3314] +--- sas= [] onedah_slice1307 crp= 1 +--- 'expires': 1167127263 +1310 1 onedai_slice1308 nodes= [4308, 4309, 4310, 1308, 1309, 1310] persons= [3313, 3314, 3315] +--- sas= [] onedai_slice1308 crp= 1 +--- 'expires': 1167127264 +1311 1 onedaj_slice1309 nodes= [4309, 4310, 4311, 1309, 1310, 1311] persons= [3314, 3315, 3316] +--- sas= [] onedaj_slice1309 crp= 1 +--- 'expires': 1167127266 +1312 1 onedba_slice1310 nodes= [1312, 4310, 4311, 4312, 1310, 1311] persons= [3315, 3316, 3317] +--- sas= [] onedba_slice1310 crp= 1 +--- 'expires': 1167127267 +1313 1 onedbb_slice1311 nodes= [1312, 1313, 4311, 4312, 4313, 1311] persons= [3316, 3317, 3318] +--- sas= [] onedbb_slice1311 crp= 1 +--- 'expires': 1167127269 +1314 1 onedbc_slice1312 nodes= [1312, 1313, 1314, 4312, 4313, 4314] persons= [3317, 3318, 3319] +--- sas= [] onedbc_slice1312 crp= 1 +--- 'expires': 1167127270 +1315 1 onedbd_slice1313 nodes= [1313, 1314, 1315, 4313, 4314, 4315] persons= [3320, 3318, 3319] +--- sas= [] onedbd_slice1313 crp= 1 +--- 'expires': 1167127271 +1316 1 onedbe_slice1314 nodes= [1314, 1315, 1316, 4314, 4315, 4316] persons= [3320, 3321, 3319] +--- sas= [] onedbe_slice1314 crp= 1 +--- 'expires': 1167127273 +1317 1 onedbf_slice1315 nodes= [1315, 1316, 1317, 4315, 4316, 4317] persons= [3320, 3321, 3322] +--- sas= [] onedbf_slice1315 crp= 1 +--- 'expires': 1167127274 +1318 1 onedbg_slice1316 nodes= [1316, 1317, 1318, 4316, 4317, 4318] persons= [3321, 3322, 3323] +--- sas= [] onedbg_slice1316 crp= 1 +--- 'expires': 1167127276 +1319 1 onedbh_slice1317 nodes= [1317, 1318, 1319, 4317, 4318, 4319] persons= [3322, 3323, 3324] +--- sas= [] onedbh_slice1317 crp= 1 +--- 'expires': 1167127277 +1320 1 onedbi_slice1318 nodes= [4320, 1318, 1319, 1320, 4318, 4319] persons= [3323, 3324, 3325] +--- sas= [] onedbi_slice1318 crp= 1 +--- 'expires': 1167127278 +1321 1 onedbj_slice1319 nodes= [4320, 4321, 1319, 1320, 1321, 4319] persons= [3324, 3325, 3326] +--- sas= [] onedbj_slice1319 crp= 1 +--- 'expires': 1167127280 +1322 1 onedca_slice1320 nodes= [4320, 4321, 4322, 1320, 1321, 1322] persons= [3325, 3326, 3327] +--- sas= [] onedca_slice1320 crp= 1 +--- 'expires': 1167127281 +1323 1 onedcb_slice1321 nodes= [4321, 4322, 4323, 1321, 1322, 1323] persons= [3328, 3326, 3327] +--- sas= [] onedcb_slice1321 crp= 1 +--- 'expires': 1167127283 +1324 1 onedcc_slice1322 nodes= [4322, 4323, 4324, 1322, 1323, 1324] persons= [3328, 3329, 3327] +--- sas= [] onedcc_slice1322 crp= 1 +--- 'expires': 1167127284 +1325 1 onedcd_slice1323 nodes= [4323, 4324, 4325, 1323, 1324, 1325] persons= [3328, 3329, 3330] +--- sas= [] onedcd_slice1323 crp= 1 +--- 'expires': 1167127285 +1326 1 onedce_slice1324 nodes= [4324, 4325, 4326, 1324, 1325, 1326] persons= [3329, 3330, 3331] +--- sas= [] onedce_slice1324 crp= 1 +--- 'expires': 1167127287 +1327 1 onedcf_slice1325 nodes= [4325, 4326, 4327, 1325, 1326, 1327] persons= [3330, 3331, 3332] +--- sas= [] onedcf_slice1325 crp= 1 +--- 'expires': 1167127288 +1328 1 onedcg_slice1326 nodes= [4326, 4327, 4328, 1326, 1327, 1328] persons= [3331, 3332, 3333] +--- sas= [] onedcg_slice1326 crp= 1 +--- 'expires': 1167127290 +1329 1 onedch_slice1327 nodes= [4327, 4328, 4329, 1327, 1328, 1329] persons= [3332, 3333, 3334] +--- sas= [] onedch_slice1327 crp= 1 +--- 'expires': 1167127291 +1330 1 onedci_slice1328 nodes= [4328, 4329, 4330, 1328, 1329, 1330] persons= [3333, 3334, 3335] +--- sas= [] onedci_slice1328 crp= 1 +--- 'expires': 1167127293 +1331 1 onedcj_slice1329 nodes= [4329, 4330, 4331, 1329, 1330, 1331] persons= [3336, 3334, 3335] +--- sas= [] onedcj_slice1329 crp= 1 +--- 'expires': 1167127294 +1332 1 onedda_slice1330 nodes= [4330, 4331, 4332, 1330, 1331, 1332] persons= [3336, 3337, 3335] +--- sas= [] onedda_slice1330 crp= 1 +--- 'expires': 1167127296 +1333 1 oneddb_slice1331 nodes= [4331, 4332, 4333, 1331, 1332, 1333] persons= [3336, 3337, 3338] +--- sas= [] oneddb_slice1331 crp= 1 +--- 'expires': 1167127297 +1334 1 oneddc_slice1332 nodes= [4332, 4333, 4334, 1332, 1333, 1334] persons= [3337, 3338, 3339] +--- sas= [] oneddc_slice1332 crp= 1 +--- 'expires': 1167127298 +1335 1 oneddd_slice1333 nodes= [4333, 4334, 4335, 1333, 1334, 1335] persons= [3338, 3339, 3340] +--- sas= [] oneddd_slice1333 crp= 1 +--- 'expires': 1167127300 +1336 1 onedde_slice1334 nodes= [4334, 4335, 4336, 1334, 1335, 1336] persons= [3339, 3340, 3341] +--- sas= [] onedde_slice1334 crp= 1 +--- 'expires': 1167127301 +1337 1 oneddf_slice1335 nodes= [4335, 4336, 4337, 1335, 1336, 1337] persons= [3340, 3341, 3342] +--- sas= [] oneddf_slice1335 crp= 1 +--- 'expires': 1167127303 +1338 1 oneddg_slice1336 nodes= [4336, 4337, 4338, 1336, 1337, 1338] persons= [3341, 3342, 3343] +--- sas= [] oneddg_slice1336 crp= 1 +--- 'expires': 1167127304 +1339 1 oneddh_slice1337 nodes= [4337, 4338, 4339, 1337, 1338, 1339] persons= [3344, 3342, 3343] +--- sas= [] oneddh_slice1337 crp= 1 +--- 'expires': 1167127305 +1340 1 oneddi_slice1338 nodes= [4338, 4339, 4340, 1338, 1339, 1340] persons= [3344, 3345, 3343] +--- sas= [] oneddi_slice1338 crp= 1 +--- 'expires': 1167127307 +1341 1 oneddj_slice1339 nodes= [4339, 4340, 4341, 1339, 1340, 1341] persons= [3344, 3345, 3346] +--- sas= [] oneddj_slice1339 crp= 1 +--- 'expires': 1167127308 +1342 1 onedea_slice1340 nodes= [4340, 4341, 4342, 1340, 1341, 1342] persons= [3345, 3346, 3347] +--- sas= [] onedea_slice1340 crp= 1 +--- 'expires': 1167127310 +1343 1 onedeb_slice1341 nodes= [4341, 4342, 4343, 1341, 1342, 1343] persons= [3346, 3347, 3348] +--- sas= [] onedeb_slice1341 crp= 1 +--- 'expires': 1167127311 +1344 1 onedec_slice1342 nodes= [1344, 4342, 4343, 4344, 1342, 1343] persons= [3347, 3348, 3349] +--- sas= [] onedec_slice1342 crp= 1 +--- 'expires': 1167127313 +1345 1 oneded_slice1343 nodes= [1344, 1345, 4343, 4344, 4345, 1343] persons= [3348, 3349, 3350] +--- sas= [] oneded_slice1343 crp= 1 +--- 'expires': 1167127314 +1346 1 onedee_slice1344 nodes= [1344, 1345, 1346, 4344, 4345, 4346] persons= [3349, 3350, 3351] +--- sas= [] onedee_slice1344 crp= 1 +--- 'expires': 1167127315 +1347 1 onedef_slice1345 nodes= [1345, 1346, 1347, 4345, 4346, 4347] persons= [3352, 3350, 3351] +--- sas= [] onedef_slice1345 crp= 1 +--- 'expires': 1167127317 +1348 1 onedeg_slice1346 nodes= [1346, 1347, 1348, 4346, 4347, 4348] persons= [3352, 3353, 3351] +--- sas= [] onedeg_slice1346 crp= 1 +--- 'expires': 1167127318 +1349 1 onedeh_slice1347 nodes= [1347, 1348, 1349, 4347, 4348, 4349] persons= [3352, 3353, 3354] +--- sas= [] onedeh_slice1347 crp= 1 +--- 'expires': 1167127320 +1350 1 onedei_slice1348 nodes= [1348, 1349, 1350, 4348, 4349, 4350] persons= [3353, 3354, 3355] +--- sas= [] onedei_slice1348 crp= 1 +--- 'expires': 1167127321 +1351 1 onedej_slice1349 nodes= [1349, 1350, 1351, 4349, 4350, 4351] persons= [3354, 3355, 3356] +--- sas= [] onedej_slice1349 crp= 1 +--- 'expires': 1167127323 +1352 1 onedfa_slice1350 nodes= [4352, 1350, 1351, 1352, 4350, 4351] persons= [3355, 3356, 3357] +--- sas= [] onedfa_slice1350 crp= 1 +--- 'expires': 1167127324 +1353 1 onedfb_slice1351 nodes= [4352, 4353, 1351, 1352, 1353, 4351] persons= [3356, 3357, 3358] +--- sas= [] onedfb_slice1351 crp= 1 +--- 'expires': 1167127325 +1354 1 onedfc_slice1352 nodes= [4352, 4353, 4354, 1352, 1353, 1354] persons= [3357, 3358, 3359] +--- sas= [] onedfc_slice1352 crp= 1 +--- 'expires': 1167127327 +1355 1 onedfd_slice1353 nodes= [4353, 4354, 4355, 1353, 1354, 1355] persons= [3360, 3358, 3359] +--- sas= [] onedfd_slice1353 crp= 1 +--- 'expires': 1167127328 +1356 1 onedfe_slice1354 nodes= [4354, 4355, 4356, 1354, 1355, 1356] persons= [3360, 3361, 3359] +--- sas= [] onedfe_slice1354 crp= 1 +--- 'expires': 1167127330 +1357 1 onedff_slice1355 nodes= [4355, 4356, 4357, 1355, 1356, 1357] persons= [3360, 3361, 3362] +--- sas= [] onedff_slice1355 crp= 1 +--- 'expires': 1167127331 +1358 1 onedfg_slice1356 nodes= [4356, 4357, 4358, 1356, 1357, 1358] persons= [3361, 3362, 3363] +--- sas= [] onedfg_slice1356 crp= 1 +--- 'expires': 1167127332 +1359 1 onedfh_slice1357 nodes= [4357, 4358, 4359, 1357, 1358, 1359] persons= [3362, 3363, 3364] +--- sas= [] onedfh_slice1357 crp= 1 +--- 'expires': 1167127334 +1360 1 onedfi_slice1358 nodes= [4358, 4359, 4360, 1358, 1359, 1360] persons= [3363, 3364, 3365] +--- sas= [] onedfi_slice1358 crp= 1 +--- 'expires': 1167127335 +1361 1 onedfj_slice1359 nodes= [4359, 4360, 4361, 1359, 1360, 1361] persons= [3364, 3365, 3366] +--- sas= [] onedfj_slice1359 crp= 1 +--- 'expires': 1167127337 +1362 1 onedga_slice1360 nodes= [4360, 4361, 4362, 1360, 1361, 1362] persons= [3365, 3366, 3367] +--- sas= [] onedga_slice1360 crp= 1 +--- 'expires': 1167127338 +1363 1 onedgb_slice1361 nodes= [4361, 4362, 4363, 1361, 1362, 1363] persons= [3368, 3366, 3367] +--- sas= [] onedgb_slice1361 crp= 1 +--- 'expires': 1167127340 +1364 1 onedgc_slice1362 nodes= [4362, 4363, 4364, 1362, 1363, 1364] persons= [3368, 3369, 3367] +--- sas= [] onedgc_slice1362 crp= 1 +--- 'expires': 1167127341 +1365 1 onedgd_slice1363 nodes= [4363, 4364, 4365, 1363, 1364, 1365] persons= [3368, 3369, 3370] +--- sas= [] onedgd_slice1363 crp= 1 +--- 'expires': 1167127343 +1366 1 onedge_slice1364 nodes= [4364, 4365, 4366, 1364, 1365, 1366] persons= [3369, 3370, 3371] +--- sas= [] onedge_slice1364 crp= 1 +--- 'expires': 1167127344 +1367 1 onedgf_slice1365 nodes= [4365, 4366, 4367, 1365, 1366, 1367] persons= [3370, 3371, 3372] +--- sas= [] onedgf_slice1365 crp= 1 +--- 'expires': 1167127346 +1368 1 onedgg_slice1366 nodes= [4366, 4367, 4368, 1366, 1367, 1368] persons= [3371, 3372, 3373] +--- sas= [] onedgg_slice1366 crp= 1 +--- 'expires': 1167127347 +1369 1 onedgh_slice1367 nodes= [4367, 4368, 4369, 1367, 1368, 1369] persons= [3372, 3373, 3374] +--- sas= [] onedgh_slice1367 crp= 1 +--- 'expires': 1167127349 +1370 1 onedgi_slice1368 nodes= [4368, 4369, 4370, 1368, 1369, 1370] persons= [3373, 3374, 3375] +--- sas= [] onedgi_slice1368 crp= 1 +--- 'expires': 1167127350 +1371 1 onedgj_slice1369 nodes= [4369, 4370, 4371, 1369, 1370, 1371] persons= [3376, 3374, 3375] +--- sas= [] onedgj_slice1369 crp= 1 +--- 'expires': 1167127352 +1372 1 onedha_slice1370 nodes= [4370, 4371, 4372, 1370, 1371, 1372] persons= [3376, 3377, 3375] +--- sas= [] onedha_slice1370 crp= 1 +--- 'expires': 1167127353 +1373 1 onedhb_slice1371 nodes= [4371, 4372, 4373, 1371, 1372, 1373] persons= [3376, 3377, 3378] +--- sas= [] onedhb_slice1371 crp= 1 +--- 'expires': 1167127355 +1374 1 onedhc_slice1372 nodes= [4372, 4373, 4374, 1372, 1373, 1374] persons= [3377, 3378, 3379] +--- sas= [] onedhc_slice1372 crp= 1 +--- 'expires': 1167127356 +1375 1 onedhd_slice1373 nodes= [4373, 4374, 4375, 1373, 1374, 1375] persons= [3378, 3379, 3380] +--- sas= [] onedhd_slice1373 crp= 1 +--- 'expires': 1167127357 +1376 1 onedhe_slice1374 nodes= [1376, 4374, 4375, 4376, 1374, 1375] persons= [3379, 3380, 3381] +--- sas= [] onedhe_slice1374 crp= 1 +--- 'expires': 1167127359 +1377 1 onedhf_slice1375 nodes= [1376, 1377, 4375, 4376, 4377, 1375] persons= [3380, 3381, 3382] +--- sas= [] onedhf_slice1375 crp= 1 +--- 'expires': 1167127360 +1378 1 onedhg_slice1376 nodes= [1376, 1377, 1378, 4376, 4377, 4378] persons= [3381, 3382, 3383] +--- sas= [] onedhg_slice1376 crp= 1 +--- 'expires': 1167127362 +1379 1 onedhh_slice1377 nodes= [1377, 1378, 1379, 4377, 4378, 4379] persons= [3384, 3382, 3383] +--- sas= [] onedhh_slice1377 crp= 1 +--- 'expires': 1167127363 +1380 1 onedhi_slice1378 nodes= [1378, 1379, 1380, 4378, 4379, 4380] persons= [3384, 3385, 3383] +--- sas= [] onedhi_slice1378 crp= 1 +--- 'expires': 1167127365 +1381 1 onedhj_slice1379 nodes= [1379, 1380, 1381, 4379, 4380, 4381] persons= [3384, 3385, 3386] +--- sas= [] onedhj_slice1379 crp= 1 +--- 'expires': 1167127366 +1382 1 onedia_slice1380 nodes= [1380, 1381, 1382, 4380, 4381, 4382] persons= [3385, 3386, 3387] +--- sas= [] onedia_slice1380 crp= 1 +--- 'expires': 1167127368 +1383 1 onedib_slice1381 nodes= [1381, 1382, 1383, 4381, 4382, 4383] persons= [3386, 3387, 3388] +--- sas= [] onedib_slice1381 crp= 1 +--- 'expires': 1167127369 +1384 1 onedic_slice1382 nodes= [4384, 1382, 1383, 1384, 4382, 4383] persons= [3387, 3388, 3389] +--- sas= [] onedic_slice1382 crp= 1 +--- 'expires': 1167127371 +1385 1 onedid_slice1383 nodes= [4384, 4385, 1383, 1384, 1385, 4383] persons= [3388, 3389, 3390] +--- sas= [] onedid_slice1383 crp= 1 +--- 'expires': 1167127372 +1386 1 onedie_slice1384 nodes= [4384, 4385, 4386, 1384, 1385, 1386] persons= [3389, 3390, 3391] +--- sas= [] onedie_slice1384 crp= 1 +--- 'expires': 1167127374 +1387 1 onedif_slice1385 nodes= [4385, 4386, 4387, 1385, 1386, 1387] persons= [3392, 3390, 3391] +--- sas= [] onedif_slice1385 crp= 1 +--- 'expires': 1167127375 +1388 1 onedig_slice1386 nodes= [4386, 4387, 4388, 1386, 1387, 1388] persons= [3392, 3393, 3391] +--- sas= [] onedig_slice1386 crp= 1 +--- 'expires': 1167127376 +1389 1 onedih_slice1387 nodes= [4387, 4388, 4389, 1387, 1388, 1389] persons= [3392, 3393, 3394] +--- sas= [] onedih_slice1387 crp= 1 +--- 'expires': 1167127378 +1390 1 onedii_slice1388 nodes= [4388, 4389, 4390, 1388, 1389, 1390] persons= [3393, 3394, 3395] +--- sas= [] onedii_slice1388 crp= 1 +--- 'expires': 1167127379 +1391 1 onedij_slice1389 nodes= [4389, 4390, 4391, 1389, 1390, 1391] persons= [3394, 3395, 3396] +--- sas= [] onedij_slice1389 crp= 1 +--- 'expires': 1167127381 +1392 1 onedja_slice1390 nodes= [4390, 4391, 4392, 1390, 1391, 1392] persons= [3395, 3396, 3397] +--- sas= [] onedja_slice1390 crp= 1 +--- 'expires': 1167127382 +1393 1 onedjb_slice1391 nodes= [4391, 4392, 4393, 1391, 1392, 1393] persons= [3396, 3397, 3398] +--- sas= [] onedjb_slice1391 crp= 1 +--- 'expires': 1167127384 +1394 1 onedjc_slice1392 nodes= [4392, 4393, 4394, 1392, 1393, 1394] persons= [3397, 3398, 3399] +--- sas= [] onedjc_slice1392 crp= 1 +--- 'expires': 1167127385 +1395 1 onedjd_slice1393 nodes= [4393, 4394, 4395, 1393, 1394, 1395] persons= [3400, 3398, 3399] +--- sas= [] onedjd_slice1393 crp= 1 +--- 'expires': 1167127387 +1396 1 onedje_slice1394 nodes= [4394, 4395, 4396, 1394, 1395, 1396] persons= [3400, 3401, 3399] +--- sas= [] onedje_slice1394 crp= 1 +--- 'expires': 1167127388 +1397 1 onedjf_slice1395 nodes= [4395, 4396, 4397, 1395, 1396, 1397] persons= [3400, 3401, 3402] +--- sas= [] onedjf_slice1395 crp= 1 +--- 'expires': 1167127389 +1398 1 onedjg_slice1396 nodes= [4396, 4397, 4398, 1396, 1397, 1398] persons= [3401, 3402, 3403] +--- sas= [] onedjg_slice1396 crp= 1 +--- 'expires': 1167127391 +1399 1 onedjh_slice1397 nodes= [4397, 4398, 4399, 1397, 1398, 1399] persons= [3402, 3403, 3404] +--- sas= [] onedjh_slice1397 crp= 1 +--- 'expires': 1167127392 +1400 1 onedji_slice1398 nodes= [4398, 4399, 4400, 1398, 1399, 1400] persons= [3403, 3404, 3405] +--- sas= [] onedji_slice1398 crp= 1 +--- 'expires': 1167127394 +1401 1 onedjj_slice1399 nodes= [4399, 4400, 4401, 1399, 1400, 1401] persons= [3404, 3405, 3406] +--- sas= [] onedjj_slice1399 crp= 1 +--- 'expires': 1167127395 +1402 1 oneeaa_slice1400 nodes= [4400, 4401, 4402, 1400, 1401, 1402] persons= [3405, 3406, 3407] +--- sas= [] oneeaa_slice1400 crp= 1 +--- 'expires': 1167127397 +1403 1 oneeab_slice1401 nodes= [4401, 4402, 4403, 1401, 1402, 1403] persons= [3408, 3406, 3407] +--- sas= [] oneeab_slice1401 crp= 1 +--- 'expires': 1167127398 +1404 1 oneeac_slice1402 nodes= [4402, 4403, 4404, 1402, 1403, 1404] persons= [3408, 3409, 3407] +--- sas= [] oneeac_slice1402 crp= 1 +--- 'expires': 1167127400 +1405 1 oneead_slice1403 nodes= [4403, 4404, 4405, 1403, 1404, 1405] persons= [3408, 3409, 3410] +--- sas= [] oneead_slice1403 crp= 1 +--- 'expires': 1167127401 +1406 1 oneeae_slice1404 nodes= [4404, 4405, 4406, 1404, 1405, 1406] persons= [3409, 3410, 3411] +--- sas= [] oneeae_slice1404 crp= 1 +--- 'expires': 1167127403 +1407 1 oneeaf_slice1405 nodes= [4405, 4406, 4407, 1405, 1406, 1407] persons= [3410, 3411, 3412] +--- sas= [] oneeaf_slice1405 crp= 1 +--- 'expires': 1167127404 +1408 1 oneeag_slice1406 nodes= [1408, 4406, 4407, 4408, 1406, 1407] persons= [3411, 3412, 3413] +--- sas= [] oneeag_slice1406 crp= 1 +--- 'expires': 1167127406 +1409 1 oneeah_slice1407 nodes= [1408, 1409, 4407, 4408, 4409, 1407] persons= [3412, 3413, 3414] +--- sas= [] oneeah_slice1407 crp= 1 +--- 'expires': 1167127407 +1410 1 oneeai_slice1408 nodes= [1408, 1409, 1410, 4408, 4409, 4410] persons= [3413, 3414, 3415] +--- sas= [] oneeai_slice1408 crp= 1 +--- 'expires': 1167127409 +1411 1 oneeaj_slice1409 nodes= [1409, 1410, 1411, 4409, 4410, 4411] persons= [3416, 3414, 3415] +--- sas= [] oneeaj_slice1409 crp= 1 +--- 'expires': 1167127410 +1412 1 oneeba_slice1410 nodes= [1410, 1411, 1412, 4410, 4411, 4412] persons= [3416, 3417, 3415] +--- sas= [] oneeba_slice1410 crp= 1 +--- 'expires': 1167127411 +1413 1 oneebb_slice1411 nodes= [1411, 1412, 1413, 4411, 4412, 4413] persons= [3416, 3417, 3418] +--- sas= [] oneebb_slice1411 crp= 1 +--- 'expires': 1167127413 +1414 1 oneebc_slice1412 nodes= [1412, 1413, 1414, 4412, 4413, 4414] persons= [3417, 3418, 3419] +--- sas= [] oneebc_slice1412 crp= 1 +--- 'expires': 1167127414 +1415 1 oneebd_slice1413 nodes= [1413, 1414, 1415, 4413, 4414, 4415] persons= [3418, 3419, 3420] +--- sas= [] oneebd_slice1413 crp= 1 +--- 'expires': 1167127416 +1416 1 oneebe_slice1414 nodes= [4416, 1414, 1415, 1416, 4414, 4415] persons= [3419, 3420, 3421] +--- sas= [] oneebe_slice1414 crp= 1 +--- 'expires': 1167127417 +1417 1 oneebf_slice1415 nodes= [4416, 4417, 1415, 1416, 1417, 4415] persons= [3420, 3421, 3422] +--- sas= [] oneebf_slice1415 crp= 1 +--- 'expires': 1167127418 +1418 1 oneebg_slice1416 nodes= [4416, 4417, 4418, 1416, 1417, 1418] persons= [3421, 3422, 3423] +--- sas= [] oneebg_slice1416 crp= 1 +--- 'expires': 1167127418 +1419 1 oneebh_slice1417 nodes= [4417, 4418, 4419, 1417, 1418, 1419] persons= [3424, 3422, 3423] +--- sas= [] oneebh_slice1417 crp= 1 +--- 'expires': 1167127419 +1420 1 oneebi_slice1418 nodes= [4418, 4419, 4420, 1418, 1419, 1420] persons= [3424, 3425, 3423] +--- sas= [] oneebi_slice1418 crp= 1 +--- 'expires': 1167127419 +1421 1 oneebj_slice1419 nodes= [4419, 4420, 4421, 1419, 1420, 1421] persons= [3424, 3425, 3426] +--- sas= [] oneebj_slice1419 crp= 1 +--- 'expires': 1167127420 +1422 1 oneeca_slice1420 nodes= [4420, 4421, 4422, 1420, 1421, 1422] persons= [3425, 3426, 3427] +--- sas= [] oneeca_slice1420 crp= 1 +--- 'expires': 1167127420 +1423 1 oneecb_slice1421 nodes= [4421, 4422, 4423, 1421, 1422, 1423] persons= [3426, 3427, 3428] +--- sas= [] oneecb_slice1421 crp= 1 +--- 'expires': 1167127421 +1424 1 oneecc_slice1422 nodes= [4422, 4423, 4424, 1422, 1423, 1424] persons= [3427, 3428, 3429] +--- sas= [] oneecc_slice1422 crp= 1 +--- 'expires': 1167127421 +1425 1 oneecd_slice1423 nodes= [4423, 4424, 4425, 1423, 1424, 1425] persons= [3428, 3429, 3430] +--- sas= [] oneecd_slice1423 crp= 1 +--- 'expires': 1167127422 +1426 1 oneece_slice1424 nodes= [4424, 4425, 4426, 1424, 1425, 1426] persons= [3429, 3430, 3431] +--- sas= [] oneece_slice1424 crp= 1 +--- 'expires': 1167127422 +1427 1 oneecf_slice1425 nodes= [4425, 4426, 4427, 1425, 1426, 1427] persons= [3432, 3430, 3431] +--- sas= [] oneecf_slice1425 crp= 1 +--- 'expires': 1167127422 +1428 1 oneecg_slice1426 nodes= [4426, 4427, 4428, 1426, 1427, 1428] persons= [3432, 3433, 3431] +--- sas= [] oneecg_slice1426 crp= 1 +--- 'expires': 1167127423 +1429 1 oneech_slice1427 nodes= [4427, 4428, 4429, 1427, 1428, 1429] persons= [3432, 3433, 3434] +--- sas= [] oneech_slice1427 crp= 1 +--- 'expires': 1167127423 +1430 1 oneeci_slice1428 nodes= [4428, 4429, 4430, 1428, 1429, 1430] persons= [3433, 3434, 3435] +--- sas= [] oneeci_slice1428 crp= 1 +--- 'expires': 1167127424 +1431 1 oneecj_slice1429 nodes= [4429, 4430, 4431, 1429, 1430, 1431] persons= [3434, 3435, 3436] +--- sas= [] oneecj_slice1429 crp= 1 +--- 'expires': 1167127424 +1432 1 oneeda_slice1430 nodes= [4430, 4431, 4432, 1430, 1431, 1432] persons= [3435, 3436, 3437] +--- sas= [] oneeda_slice1430 crp= 1 +--- 'expires': 1167127425 +1433 1 oneedb_slice1431 nodes= [4431, 4432, 4433, 1431, 1432, 1433] persons= [3436, 3437, 3438] +--- sas= [] oneedb_slice1431 crp= 1 +--- 'expires': 1167127425 +1434 1 oneedc_slice1432 nodes= [4432, 4433, 4434, 1432, 1433, 1434] persons= [3437, 3438, 3439] +--- sas= [] oneedc_slice1432 crp= 1 +--- 'expires': 1167127426 +1435 1 oneedd_slice1433 nodes= [4433, 4434, 4435, 1433, 1434, 1435] persons= [3440, 3438, 3439] +--- sas= [] oneedd_slice1433 crp= 1 +--- 'expires': 1167127426 +1436 1 oneede_slice1434 nodes= [4434, 4435, 4436, 1434, 1435, 1436] persons= [3440, 3441, 3439] +--- sas= [] oneede_slice1434 crp= 1 +--- 'expires': 1167127426 +1437 1 oneedf_slice1435 nodes= [4435, 4436, 4437, 1435, 1436, 1437] persons= [3440, 3441, 3442] +--- sas= [] oneedf_slice1435 crp= 1 +--- 'expires': 1167127427 +1438 1 oneedg_slice1436 nodes= [4436, 4437, 4438, 1436, 1437, 1438] persons= [3441, 3442, 3443] +--- sas= [] oneedg_slice1436 crp= 1 +--- 'expires': 1167127427 +1439 1 oneedh_slice1437 nodes= [4437, 4438, 4439, 1437, 1438, 1439] persons= [3442, 3443, 3444] +--- sas= [] oneedh_slice1437 crp= 1 +--- 'expires': 1167127428 +1440 1 oneedi_slice1438 nodes= [1440, 4438, 4439, 4440, 1438, 1439] persons= [3443, 3444, 3445] +--- sas= [] oneedi_slice1438 crp= 1 +--- 'expires': 1167127428 +1441 1 oneedj_slice1439 nodes= [1440, 1441, 4439, 4440, 4441, 1439] persons= [3444, 3445, 3446] +--- sas= [] oneedj_slice1439 crp= 1 +--- 'expires': 1167127429 +1442 1 oneeea_slice1440 nodes= [1440, 1441, 1442, 4440, 4441, 4442] persons= [3445, 3446, 3447] +--- sas= [] oneeea_slice1440 crp= 1 +--- 'expires': 1167127429 +1443 1 oneeeb_slice1441 nodes= [1441, 1442, 1443, 4441, 4442, 4443] persons= [3448, 3446, 3447] +--- sas= [] oneeeb_slice1441 crp= 1 +--- 'expires': 1167127430 +1444 1 oneeec_slice1442 nodes= [1442, 1443, 1444, 4442, 4443, 4444] persons= [3448, 3449, 3447] +--- sas= [] oneeec_slice1442 crp= 1 +--- 'expires': 1167127430 +1445 1 oneeed_slice1443 nodes= [1443, 1444, 1445, 4443, 4444, 4445] persons= [3448, 3449, 3450] +--- sas= [] oneeed_slice1443 crp= 1 +--- 'expires': 1167127430 +1446 1 oneeee_slice1444 nodes= [1444, 1445, 1446, 4444, 4445, 4446] persons= [3449, 3450, 3451] +--- sas= [] oneeee_slice1444 crp= 1 +--- 'expires': 1167127431 +1447 1 oneeef_slice1445 nodes= [1445, 1446, 1447, 4445, 4446, 4447] persons= [3450, 3451, 3452] +--- sas= [] oneeef_slice1445 crp= 1 +--- 'expires': 1167127431 +1448 1 oneeeg_slice1446 nodes= [4448, 1446, 1447, 1448, 4446, 4447] persons= [3451, 3452, 3453] +--- sas= [] oneeeg_slice1446 crp= 1 +--- 'expires': 1167127432 +1449 1 oneeeh_slice1447 nodes= [4448, 4449, 1447, 1448, 1449, 4447] persons= [3452, 3453, 3454] +--- sas= [] oneeeh_slice1447 crp= 1 +--- 'expires': 1167127432 +1450 1 oneeei_slice1448 nodes= [4448, 4449, 4450, 1448, 1449, 1450] persons= [3453, 3454, 3455] +--- sas= [] oneeei_slice1448 crp= 1 +--- 'expires': 1167127433 +1451 1 oneeej_slice1449 nodes= [4449, 4450, 4451, 1449, 1450, 1451] persons= [3456, 3454, 3455] +--- sas= [] oneeej_slice1449 crp= 1 +--- 'expires': 1167127433 +1452 1 oneefa_slice1450 nodes= [4450, 4451, 4452, 1450, 1451, 1452] persons= [3456, 3457, 3455] +--- sas= [] oneefa_slice1450 crp= 1 +--- 'expires': 1167127433 +1453 1 oneefb_slice1451 nodes= [4451, 4452, 4453, 1451, 1452, 1453] persons= [3456, 3457, 3458] +--- sas= [] oneefb_slice1451 crp= 1 +--- 'expires': 1167127434 +1454 1 oneefc_slice1452 nodes= [4452, 4453, 4454, 1452, 1453, 1454] persons= [3457, 3458, 3459] +--- sas= [] oneefc_slice1452 crp= 1 +--- 'expires': 1167127434 +1455 1 oneefd_slice1453 nodes= [4453, 4454, 4455, 1453, 1454, 1455] persons= [3458, 3459, 3460] +--- sas= [] oneefd_slice1453 crp= 1 +--- 'expires': 1167127435 +1456 1 oneefe_slice1454 nodes= [4454, 4455, 4456, 1454, 1455, 1456] persons= [3459, 3460, 3461] +--- sas= [] oneefe_slice1454 crp= 1 +--- 'expires': 1167127435 +1457 1 oneeff_slice1455 nodes= [4455, 4456, 4457, 1455, 1456, 1457] persons= [3460, 3461, 3462] +--- sas= [] oneeff_slice1455 crp= 1 +--- 'expires': 1167127436 +1458 1 oneefg_slice1456 nodes= [4456, 4457, 4458, 1456, 1457, 1458] persons= [3461, 3462, 3463] +--- sas= [] oneefg_slice1456 crp= 1 +--- 'expires': 1167127436 +1459 1 oneefh_slice1457 nodes= [4457, 4458, 4459, 1457, 1458, 1459] persons= [3464, 3462, 3463] +--- sas= [] oneefh_slice1457 crp= 1 +--- 'expires': 1167127436 +1460 1 oneefi_slice1458 nodes= [4458, 4459, 4460, 1458, 1459, 1460] persons= [3464, 3465, 3463] +--- sas= [] oneefi_slice1458 crp= 1 +--- 'expires': 1167127437 +1461 1 oneefj_slice1459 nodes= [4459, 4460, 4461, 1459, 1460, 1461] persons= [3464, 3465, 3466] +--- sas= [] oneefj_slice1459 crp= 1 +--- 'expires': 1167127437 +1462 1 oneega_slice1460 nodes= [4460, 4461, 4462, 1460, 1461, 1462] persons= [3465, 3466, 3467] +--- sas= [] oneega_slice1460 crp= 1 +--- 'expires': 1167127438 +1463 1 oneegb_slice1461 nodes= [4461, 4462, 4463, 1461, 1462, 1463] persons= [3466, 3467, 3468] +--- sas= [] oneegb_slice1461 crp= 1 +--- 'expires': 1167127438 +1464 1 oneegc_slice1462 nodes= [4462, 4463, 4464, 1462, 1463, 1464] persons= [3467, 3468, 3469] +--- sas= [] oneegc_slice1462 crp= 1 +--- 'expires': 1167127439 +1465 1 oneegd_slice1463 nodes= [4463, 4464, 4465, 1463, 1464, 1465] persons= [3468, 3469, 3470] +--- sas= [] oneegd_slice1463 crp= 1 +--- 'expires': 1167127439 +1466 1 oneege_slice1464 nodes= [4464, 4465, 4466, 1464, 1465, 1466] persons= [3469, 3470, 3471] +--- sas= [] oneege_slice1464 crp= 1 +--- 'expires': 1167127439 +1467 1 oneegf_slice1465 nodes= [4465, 4466, 4467, 1465, 1466, 1467] persons= [3472, 3470, 3471] +--- sas= [] oneegf_slice1465 crp= 1 +--- 'expires': 1167127440 +1468 1 oneegg_slice1466 nodes= [4466, 4467, 4468, 1466, 1467, 1468] persons= [3472, 3473, 3471] +--- sas= [] oneegg_slice1466 crp= 1 +--- 'expires': 1167127440 +1469 1 oneegh_slice1467 nodes= [4467, 4468, 4469, 1467, 1468, 1469] persons= [3472, 3473, 3474] +--- sas= [] oneegh_slice1467 crp= 1 +--- 'expires': 1167127441 +1470 1 oneegi_slice1468 nodes= [4468, 4469, 4470, 1468, 1469, 1470] persons= [3473, 3474, 3475] +--- sas= [] oneegi_slice1468 crp= 1 +--- 'expires': 1167127441 +1471 1 oneegj_slice1469 nodes= [4469, 4470, 4471, 1469, 1470, 1471] persons= [3474, 3475, 3476] +--- sas= [] oneegj_slice1469 crp= 1 +--- 'expires': 1167127442 +1472 1 oneeha_slice1470 nodes= [1472, 4470, 4471, 4472, 1470, 1471] persons= [3475, 3476, 3477] +--- sas= [] oneeha_slice1470 crp= 1 +--- 'expires': 1167127442 +1473 1 oneehb_slice1471 nodes= [1472, 1473, 4471, 4472, 4473, 1471] persons= [3476, 3477, 3478] +--- sas= [] oneehb_slice1471 crp= 1 +--- 'expires': 1167127442 +1474 1 oneehc_slice1472 nodes= [1472, 1473, 1474, 4472, 4473, 4474] persons= [3477, 3478, 3479] +--- sas= [] oneehc_slice1472 crp= 1 +--- 'expires': 1167127443 +1475 1 oneehd_slice1473 nodes= [1473, 1474, 1475, 4473, 4474, 4475] persons= [3480, 3478, 3479] +--- sas= [] oneehd_slice1473 crp= 1 +--- 'expires': 1167127443 +1476 1 oneehe_slice1474 nodes= [1474, 1475, 1476, 4474, 4475, 4476] persons= [3480, 3481, 3479] +--- sas= [] oneehe_slice1474 crp= 1 +--- 'expires': 1167127444 +1477 1 oneehf_slice1475 nodes= [1475, 1476, 1477, 4475, 4476, 4477] persons= [3480, 3481, 3482] +--- sas= [] oneehf_slice1475 crp= 1 +--- 'expires': 1167127444 +1478 1 oneehg_slice1476 nodes= [1476, 1477, 1478, 4476, 4477, 4478] persons= [3481, 3482, 3483] +--- sas= [] oneehg_slice1476 crp= 1 +--- 'expires': 1167127445 +1479 1 oneehh_slice1477 nodes= [1477, 1478, 1479, 4477, 4478, 4479] persons= [3482, 3483, 3484] +--- sas= [] oneehh_slice1477 crp= 1 +--- 'expires': 1167127445 +1480 1 oneehi_slice1478 nodes= [4480, 1478, 1479, 1480, 4478, 4479] persons= [3483, 3484, 3485] +--- sas= [] oneehi_slice1478 crp= 1 +--- 'expires': 1167127446 +1481 1 oneehj_slice1479 nodes= [4480, 4481, 1479, 1480, 1481, 4479] persons= [3484, 3485, 3486] +--- sas= [] oneehj_slice1479 crp= 1 +--- 'expires': 1167127446 +1482 1 oneeia_slice1480 nodes= [4480, 4481, 4482, 1480, 1481, 1482] persons= [3485, 3486, 3487] +--- sas= [] oneeia_slice1480 crp= 1 +--- 'expires': 1167127446 +1483 1 oneeib_slice1481 nodes= [4481, 4482, 4483, 1481, 1482, 1483] persons= [3488, 3486, 3487] +--- sas= [] oneeib_slice1481 crp= 1 +--- 'expires': 1167127447 +1484 1 oneeic_slice1482 nodes= [4482, 4483, 4484, 1482, 1483, 1484] persons= [3488, 3489, 3487] +--- sas= [] oneeic_slice1482 crp= 1 +--- 'expires': 1167127447 +1485 1 oneeid_slice1483 nodes= [4483, 4484, 4485, 1483, 1484, 1485] persons= [3488, 3489, 3490] +--- sas= [] oneeid_slice1483 crp= 1 +--- 'expires': 1167127448 +1486 1 oneeie_slice1484 nodes= [4484, 4485, 4486, 1484, 1485, 1486] persons= [3489, 3490, 3491] +--- sas= [] oneeie_slice1484 crp= 1 +--- 'expires': 1167127448 +1487 1 oneeif_slice1485 nodes= [4485, 4486, 4487, 1485, 1486, 1487] persons= [3490, 3491, 3492] +--- sas= [] oneeif_slice1485 crp= 1 +--- 'expires': 1167127449 +1488 1 oneeig_slice1486 nodes= [4486, 4487, 4488, 1486, 1487, 1488] persons= [3491, 3492, 3493] +--- sas= [] oneeig_slice1486 crp= 1 +--- 'expires': 1167127449 +1489 1 oneeih_slice1487 nodes= [4487, 4488, 4489, 1487, 1488, 1489] persons= [3492, 3493, 3494] +--- sas= [] oneeih_slice1487 crp= 1 +--- 'expires': 1167127449 +1490 1 oneeii_slice1488 nodes= [4488, 4489, 4490, 1488, 1489, 1490] persons= [3493, 3494, 3495] +--- sas= [] oneeii_slice1488 crp= 1 +--- 'expires': 1167127450 +1491 1 oneeij_slice1489 nodes= [4489, 4490, 4491, 1489, 1490, 1491] persons= [3496, 3494, 3495] +--- sas= [] oneeij_slice1489 crp= 1 +--- 'expires': 1167127450 +1492 1 oneeja_slice1490 nodes= [4490, 4491, 4492, 1490, 1491, 1492] persons= [3496, 3497, 3495] +--- sas= [] oneeja_slice1490 crp= 1 +--- 'expires': 1167127451 +1493 1 oneejb_slice1491 nodes= [4491, 4492, 4493, 1491, 1492, 1493] persons= [3496, 3497, 3498] +--- sas= [] oneejb_slice1491 crp= 1 +--- 'expires': 1167127451 +1494 1 oneejc_slice1492 nodes= [4492, 4493, 4494, 1492, 1493, 1494] persons= [3497, 3498, 3499] +--- sas= [] oneejc_slice1492 crp= 1 +--- 'expires': 1167127452 +1495 1 oneejd_slice1493 nodes= [4493, 4494, 4495, 1493, 1494, 1495] persons= [3498, 3499, 3500] +--- sas= [] oneejd_slice1493 crp= 1 +--- 'expires': 1167127452 +1496 1 oneeje_slice1494 nodes= [4494, 4495, 4496, 1494, 1495, 1496] persons= [3499, 3500, 3501] +--- sas= [] oneeje_slice1494 crp= 1 +--- 'expires': 1167127453 +1497 1 oneejf_slice1495 nodes= [4495, 4496, 4497, 1495, 1496, 1497] persons= [3500, 3501, 3502] +--- sas= [] oneejf_slice1495 crp= 1 +--- 'expires': 1167127453 +1498 1 oneejg_slice1496 nodes= [4496, 4497, 4498, 1496, 1497, 1498] persons= [3501, 3502, 3503] +--- sas= [] oneejg_slice1496 crp= 1 +--- 'expires': 1167127453 +1499 1 oneejh_slice1497 nodes= [4497, 4498, 4499, 1497, 1498, 1499] persons= [3504, 3502, 3503] +--- sas= [] oneejh_slice1497 crp= 1 +--- 'expires': 1167127454 +1500 1 oneeji_slice1498 nodes= [4498, 4499, 4500, 1498, 1499, 1500] persons= [3504, 3505, 3503] +--- sas= [] oneeji_slice1498 crp= 1 +--- 'expires': 1167127454 +1501 1 oneejj_slice1499 nodes= [4499, 4500, 4501, 1499, 1500, 1501] persons= [3504, 3505, 3506] +--- sas= [] oneejj_slice1499 crp= 1 +--- 'expires': 1167127455 +1502 1 onefaa_slice1500 nodes= [4500, 4501, 4502, 1500, 1501, 1502] persons= [3505, 3506, 3507] +--- sas= [] onefaa_slice1500 crp= 1 +--- 'expires': 1167127455 +1503 1 onefab_slice1501 nodes= [4501, 4502, 4503, 1501, 1502, 1503] persons= [3506, 3507, 3508] +--- sas= [] onefab_slice1501 crp= 1 +--- 'expires': 1167127456 +1504 1 onefac_slice1502 nodes= [1504, 4502, 4503, 4504, 1502, 1503] persons= [3507, 3508, 3509] +--- sas= [] onefac_slice1502 crp= 1 +--- 'expires': 1167127456 +1505 1 onefad_slice1503 nodes= [1504, 1505, 4503, 4504, 4505, 1503] persons= [3508, 3509, 3510] +--- sas= [] onefad_slice1503 crp= 1 +--- 'expires': 1167127457 +1506 1 onefae_slice1504 nodes= [1504, 1505, 1506, 4504, 4505, 4506] persons= [3509, 3510, 3511] +--- sas= [] onefae_slice1504 crp= 1 +--- 'expires': 1167127457 +1507 1 onefaf_slice1505 nodes= [1505, 1506, 1507, 4505, 4506, 4507] persons= [3512, 3510, 3511] +--- sas= [] onefaf_slice1505 crp= 1 +--- 'expires': 1167127457 +1508 1 onefag_slice1506 nodes= [1506, 1507, 1508, 4506, 4507, 4508] persons= [3512, 3513, 3511] +--- sas= [] onefag_slice1506 crp= 1 +--- 'expires': 1167127458 +1509 1 onefah_slice1507 nodes= [1507, 1508, 1509, 4507, 4508, 4509] persons= [3512, 3513, 3514] +--- sas= [] onefah_slice1507 crp= 1 +--- 'expires': 1167127458 +1510 1 onefai_slice1508 nodes= [1508, 1509, 1510, 4508, 4509, 4510] persons= [3513, 3514, 3515] +--- sas= [] onefai_slice1508 crp= 1 +--- 'expires': 1167127459 +1511 1 onefaj_slice1509 nodes= [1509, 1510, 1511, 4509, 4510, 4511] persons= [3514, 3515, 3516] +--- sas= [] onefaj_slice1509 crp= 1 +--- 'expires': 1167127459 +1512 1 onefba_slice1510 nodes= [4512, 1510, 1511, 1512, 4510, 4511] persons= [3515, 3516, 3517] +--- sas= [] onefba_slice1510 crp= 1 +--- 'expires': 1167127460 +1513 1 onefbb_slice1511 nodes= [4512, 4513, 1511, 1512, 1513, 4511] persons= [3516, 3517, 3518] +--- sas= [] onefbb_slice1511 crp= 1 +--- 'expires': 1167127460 +1514 1 onefbc_slice1512 nodes= [4512, 4513, 4514, 1512, 1513, 1514] persons= [3517, 3518, 3519] +--- sas= [] onefbc_slice1512 crp= 1 +--- 'expires': 1167127460 +1515 1 onefbd_slice1513 nodes= [4513, 4514, 4515, 1513, 1514, 1515] persons= [3520, 3518, 3519] +--- sas= [] onefbd_slice1513 crp= 1 +--- 'expires': 1167127461 +1516 1 onefbe_slice1514 nodes= [4514, 4515, 4516, 1514, 1515, 1516] persons= [3520, 3521, 3519] +--- sas= [] onefbe_slice1514 crp= 1 +--- 'expires': 1167127461 +1517 1 onefbf_slice1515 nodes= [4515, 4516, 4517, 1515, 1516, 1517] persons= [3520, 3521, 3522] +--- sas= [] onefbf_slice1515 crp= 1 +--- 'expires': 1167127462 +1518 1 onefbg_slice1516 nodes= [4516, 4517, 4518, 1516, 1517, 1518] persons= [3521, 3522, 3523] +--- sas= [] onefbg_slice1516 crp= 1 +--- 'expires': 1167127462 +1519 1 onefbh_slice1517 nodes= [4517, 4518, 4519, 1517, 1518, 1519] persons= [3522, 3523, 3524] +--- sas= [] onefbh_slice1517 crp= 1 +--- 'expires': 1167127463 +1520 1 onefbi_slice1518 nodes= [4518, 4519, 4520, 1518, 1519, 1520] persons= [3523, 3524, 3525] +--- sas= [] onefbi_slice1518 crp= 1 +--- 'expires': 1167127463 +1521 1 onefbj_slice1519 nodes= [4519, 4520, 4521, 1519, 1520, 1521] persons= [3524, 3525, 3526] +--- sas= [] onefbj_slice1519 crp= 1 +--- 'expires': 1167127464 +1522 1 onefca_slice1520 nodes= [4520, 4521, 4522, 1520, 1521, 1522] persons= [3525, 3526, 3527] +--- sas= [] onefca_slice1520 crp= 1 +--- 'expires': 1167127464 +1523 1 onefcb_slice1521 nodes= [4521, 4522, 4523, 1521, 1522, 1523] persons= [3528, 3526, 3527] +--- sas= [] onefcb_slice1521 crp= 1 +--- 'expires': 1167127464 +1524 1 onefcc_slice1522 nodes= [4522, 4523, 4524, 1522, 1523, 1524] persons= [3528, 3529, 3527] +--- sas= [] onefcc_slice1522 crp= 1 +--- 'expires': 1167127465 +1525 1 onefcd_slice1523 nodes= [4523, 4524, 4525, 1523, 1524, 1525] persons= [3528, 3529, 3530] +--- sas= [] onefcd_slice1523 crp= 1 +--- 'expires': 1167127465 +1526 1 onefce_slice1524 nodes= [4524, 4525, 4526, 1524, 1525, 1526] persons= [3529, 3530, 3531] +--- sas= [] onefce_slice1524 crp= 1 +--- 'expires': 1167127466 +1527 1 onefcf_slice1525 nodes= [4525, 4526, 4527, 1525, 1526, 1527] persons= [3530, 3531, 3532] +--- sas= [] onefcf_slice1525 crp= 1 +--- 'expires': 1167127466 +1528 1 onefcg_slice1526 nodes= [4526, 4527, 4528, 1526, 1527, 1528] persons= [3531, 3532, 3533] +--- sas= [] onefcg_slice1526 crp= 1 +--- 'expires': 1167127467 +1529 1 onefch_slice1527 nodes= [4527, 4528, 4529, 1527, 1528, 1529] persons= [3532, 3533, 3534] +--- sas= [] onefch_slice1527 crp= 1 +--- 'expires': 1167127467 +1530 1 onefci_slice1528 nodes= [4528, 4529, 4530, 1528, 1529, 1530] persons= [3533, 3534, 3535] +--- sas= [] onefci_slice1528 crp= 1 +--- 'expires': 1167127468 +1531 1 onefcj_slice1529 nodes= [4529, 4530, 4531, 1529, 1530, 1531] persons= [3536, 3534, 3535] +--- sas= [] onefcj_slice1529 crp= 1 +--- 'expires': 1167127468 +1532 1 onefda_slice1530 nodes= [4530, 4531, 4532, 1530, 1531, 1532] persons= [3536, 3537, 3535] +--- sas= [] onefda_slice1530 crp= 1 +--- 'expires': 1167127468 +1533 1 onefdb_slice1531 nodes= [4531, 4532, 4533, 1531, 1532, 1533] persons= [3536, 3537, 3538] +--- sas= [] onefdb_slice1531 crp= 1 +--- 'expires': 1167127469 +1534 1 onefdc_slice1532 nodes= [4532, 4533, 4534, 1532, 1533, 1534] persons= [3537, 3538, 3539] +--- sas= [] onefdc_slice1532 crp= 1 +--- 'expires': 1167127469 +1535 1 onefdd_slice1533 nodes= [4533, 4534, 4535, 1533, 1534, 1535] persons= [3538, 3539, 3540] +--- sas= [] onefdd_slice1533 crp= 1 +--- 'expires': 1167127470 +1536 1 onefde_slice1534 nodes= [1536, 4534, 4535, 4536, 1534, 1535] persons= [3539, 3540, 3541] +--- sas= [] onefde_slice1534 crp= 1 +--- 'expires': 1167127470 +1537 1 onefdf_slice1535 nodes= [1536, 1537, 4535, 4536, 4537, 1535] persons= [3540, 3541, 3542] +--- sas= [] onefdf_slice1535 crp= 1 +--- 'expires': 1167127471 +1538 1 onefdg_slice1536 nodes= [1536, 1537, 1538, 4536, 4537, 4538] persons= [3541, 3542, 3543] +--- sas= [] onefdg_slice1536 crp= 1 +--- 'expires': 1167127471 +1539 1 onefdh_slice1537 nodes= [1537, 1538, 1539, 4537, 4538, 4539] persons= [3544, 3542, 3543] +--- sas= [] onefdh_slice1537 crp= 1 +--- 'expires': 1167127472 +1540 1 onefdi_slice1538 nodes= [1538, 1539, 1540, 4538, 4539, 4540] persons= [3544, 3545, 3543] +--- sas= [] onefdi_slice1538 crp= 1 +--- 'expires': 1167127472 +1541 1 onefdj_slice1539 nodes= [1539, 1540, 1541, 4539, 4540, 4541] persons= [3544, 3545, 3546] +--- sas= [] onefdj_slice1539 crp= 1 +--- 'expires': 1167127472 +1542 1 onefea_slice1540 nodes= [1540, 1541, 1542, 4540, 4541, 4542] persons= [3545, 3546, 3547] +--- sas= [] onefea_slice1540 crp= 1 +--- 'expires': 1167127473 +1543 1 onefeb_slice1541 nodes= [1541, 1542, 1543, 4541, 4542, 4543] persons= [3546, 3547, 3548] +--- sas= [] onefeb_slice1541 crp= 1 +--- 'expires': 1167127473 +1544 1 onefec_slice1542 nodes= [4544, 1542, 1543, 1544, 4542, 4543] persons= [3547, 3548, 3549] +--- sas= [] onefec_slice1542 crp= 1 +--- 'expires': 1167127474 +1545 1 onefed_slice1543 nodes= [4544, 4545, 1543, 1544, 1545, 4543] persons= [3548, 3549, 3550] +--- sas= [] onefed_slice1543 crp= 1 +--- 'expires': 1167127474 +1546 1 onefee_slice1544 nodes= [4544, 4545, 4546, 1544, 1545, 1546] persons= [3549, 3550, 3551] +--- sas= [] onefee_slice1544 crp= 1 +--- 'expires': 1167127475 +1547 1 onefef_slice1545 nodes= [4545, 4546, 4547, 1545, 1546, 1547] persons= [3552, 3550, 3551] +--- sas= [] onefef_slice1545 crp= 1 +--- 'expires': 1167127475 +1548 1 onefeg_slice1546 nodes= [4546, 4547, 4548, 1546, 1547, 1548] persons= [3552, 3553, 3551] +--- sas= [] onefeg_slice1546 crp= 1 +--- 'expires': 1167127476 +1549 1 onefeh_slice1547 nodes= [4547, 4548, 4549, 1547, 1548, 1549] persons= [3552, 3553, 3554] +--- sas= [] onefeh_slice1547 crp= 1 +--- 'expires': 1167127476 +1550 1 onefei_slice1548 nodes= [4548, 4549, 4550, 1548, 1549, 1550] persons= [3553, 3554, 3555] +--- sas= [] onefei_slice1548 crp= 1 +--- 'expires': 1167127476 +1551 1 onefej_slice1549 nodes= [4549, 4550, 4551, 1549, 1550, 1551] persons= [3554, 3555, 3556] +--- sas= [] onefej_slice1549 crp= 1 +--- 'expires': 1167127477 +1552 1 oneffa_slice1550 nodes= [4550, 4551, 4552, 1550, 1551, 1552] persons= [3555, 3556, 3557] +--- sas= [] oneffa_slice1550 crp= 1 +--- 'expires': 1167127477 +1553 1 oneffb_slice1551 nodes= [4551, 4552, 4553, 1551, 1552, 1553] persons= [3556, 3557, 3558] +--- sas= [] oneffb_slice1551 crp= 1 +--- 'expires': 1167127478 +1554 1 oneffc_slice1552 nodes= [4552, 4553, 4554, 1552, 1553, 1554] persons= [3557, 3558, 3559] +--- sas= [] oneffc_slice1552 crp= 1 +--- 'expires': 1167127478 +1555 1 oneffd_slice1553 nodes= [4553, 4554, 4555, 1553, 1554, 1555] persons= [3560, 3558, 3559] +--- sas= [] oneffd_slice1553 crp= 1 +--- 'expires': 1167127479 +1556 1 oneffe_slice1554 nodes= [4554, 4555, 4556, 1554, 1555, 1556] persons= [3560, 3561, 3559] +--- sas= [] oneffe_slice1554 crp= 1 +--- 'expires': 1167127479 +1557 1 onefff_slice1555 nodes= [4555, 4556, 4557, 1555, 1556, 1557] persons= [3560, 3561, 3562] +--- sas= [] onefff_slice1555 crp= 1 +--- 'expires': 1167127480 +1558 1 oneffg_slice1556 nodes= [4556, 4557, 4558, 1556, 1557, 1558] persons= [3561, 3562, 3563] +--- sas= [] oneffg_slice1556 crp= 1 +--- 'expires': 1167127480 +1559 1 oneffh_slice1557 nodes= [4557, 4558, 4559, 1557, 1558, 1559] persons= [3562, 3563, 3564] +--- sas= [] oneffh_slice1557 crp= 1 +--- 'expires': 1167127480 +1560 1 oneffi_slice1558 nodes= [4558, 4559, 4560, 1558, 1559, 1560] persons= [3563, 3564, 3565] +--- sas= [] oneffi_slice1558 crp= 1 +--- 'expires': 1167127481 +1561 1 oneffj_slice1559 nodes= [4559, 4560, 4561, 1559, 1560, 1561] persons= [3564, 3565, 3566] +--- sas= [] oneffj_slice1559 crp= 1 +--- 'expires': 1167127481 +1562 1 onefga_slice1560 nodes= [4560, 4561, 4562, 1560, 1561, 1562] persons= [3565, 3566, 3567] +--- sas= [] onefga_slice1560 crp= 1 +--- 'expires': 1167127482 +1563 1 onefgb_slice1561 nodes= [4561, 4562, 4563, 1561, 1562, 1563] persons= [3568, 3566, 3567] +--- sas= [] onefgb_slice1561 crp= 1 +--- 'expires': 1167127482 +1564 1 onefgc_slice1562 nodes= [4562, 4563, 4564, 1562, 1563, 1564] persons= [3568, 3569, 3567] +--- sas= [] onefgc_slice1562 crp= 1 +--- 'expires': 1167127483 +1565 1 onefgd_slice1563 nodes= [4563, 4564, 4565, 1563, 1564, 1565] persons= [3568, 3569, 3570] +--- sas= [] onefgd_slice1563 crp= 1 +--- 'expires': 1167127483 +1566 1 onefge_slice1564 nodes= [4564, 4565, 4566, 1564, 1565, 1566] persons= [3569, 3570, 3571] +--- sas= [] onefge_slice1564 crp= 1 +--- 'expires': 1167127484 +1567 1 onefgf_slice1565 nodes= [4565, 4566, 4567, 1565, 1566, 1567] persons= [3570, 3571, 3572] +--- sas= [] onefgf_slice1565 crp= 1 +--- 'expires': 1167127484 +1568 1 onefgg_slice1566 nodes= [1568, 4566, 4567, 4568, 1566, 1567] persons= [3571, 3572, 3573] +--- sas= [] onefgg_slice1566 crp= 1 +--- 'expires': 1167127485 +1569 1 onefgh_slice1567 nodes= [1568, 1569, 4567, 4568, 4569, 1567] persons= [3572, 3573, 3574] +--- sas= [] onefgh_slice1567 crp= 1 +--- 'expires': 1167127485 +1570 1 onefgi_slice1568 nodes= [1568, 1569, 1570, 4568, 4569, 4570] persons= [3573, 3574, 3575] +--- sas= [] onefgi_slice1568 crp= 1 +--- 'expires': 1167127485 +1571 1 onefgj_slice1569 nodes= [1569, 1570, 1571, 4569, 4570, 4571] persons= [3576, 3574, 3575] +--- sas= [] onefgj_slice1569 crp= 1 +--- 'expires': 1167127486 +1572 1 onefha_slice1570 nodes= [1570, 1571, 1572, 4570, 4571, 4572] persons= [3576, 3577, 3575] +--- sas= [] onefha_slice1570 crp= 1 +--- 'expires': 1167127486 +1573 1 onefhb_slice1571 nodes= [1571, 1572, 1573, 4571, 4572, 4573] persons= [3576, 3577, 3578] +--- sas= [] onefhb_slice1571 crp= 1 +--- 'expires': 1167127487 +1574 1 onefhc_slice1572 nodes= [1572, 1573, 1574, 4572, 4573, 4574] persons= [3577, 3578, 3579] +--- sas= [] onefhc_slice1572 crp= 1 +--- 'expires': 1167127487 +1575 1 onefhd_slice1573 nodes= [1573, 1574, 1575, 4573, 4574, 4575] persons= [3578, 3579, 3580] +--- sas= [] onefhd_slice1573 crp= 1 +--- 'expires': 1167127488 +1576 1 onefhe_slice1574 nodes= [4576, 1574, 1575, 1576, 4574, 4575] persons= [3579, 3580, 3581] +--- sas= [] onefhe_slice1574 crp= 1 +--- 'expires': 1167127488 +1577 1 onefhf_slice1575 nodes= [4576, 4577, 1575, 1576, 1577, 4575] persons= [3580, 3581, 3582] +--- sas= [] onefhf_slice1575 crp= 1 +--- 'expires': 1167127489 +1578 1 onefhg_slice1576 nodes= [4576, 4577, 4578, 1576, 1577, 1578] persons= [3581, 3582, 3583] +--- sas= [] onefhg_slice1576 crp= 1 +--- 'expires': 1167127489 +1579 1 onefhh_slice1577 nodes= [4577, 4578, 4579, 1577, 1578, 1579] persons= [3584, 3582, 3583] +--- sas= [] onefhh_slice1577 crp= 1 +--- 'expires': 1167127490 +1580 1 onefhi_slice1578 nodes= [4578, 4579, 4580, 1578, 1579, 1580] persons= [3584, 3585, 3583] +--- sas= [] onefhi_slice1578 crp= 1 +--- 'expires': 1167127490 +1581 1 onefhj_slice1579 nodes= [4579, 4580, 4581, 1579, 1580, 1581] persons= [3584, 3585, 3586] +--- sas= [] onefhj_slice1579 crp= 1 +--- 'expires': 1167127490 +1582 1 onefia_slice1580 nodes= [4580, 4581, 4582, 1580, 1581, 1582] persons= [3585, 3586, 3587] +--- sas= [] onefia_slice1580 crp= 1 +--- 'expires': 1167127491 +1583 1 onefib_slice1581 nodes= [4581, 4582, 4583, 1581, 1582, 1583] persons= [3586, 3587, 3588] +--- sas= [] onefib_slice1581 crp= 1 +--- 'expires': 1167127491 +1584 1 onefic_slice1582 nodes= [4582, 4583, 4584, 1582, 1583, 1584] persons= [3587, 3588, 3589] +--- sas= [] onefic_slice1582 crp= 1 +--- 'expires': 1167127492 +1585 1 onefid_slice1583 nodes= [4583, 4584, 4585, 1583, 1584, 1585] persons= [3588, 3589, 3590] +--- sas= [] onefid_slice1583 crp= 1 +--- 'expires': 1167127492 +1586 1 onefie_slice1584 nodes= [4584, 4585, 4586, 1584, 1585, 1586] persons= [3589, 3590, 3591] +--- sas= [] onefie_slice1584 crp= 1 +--- 'expires': 1167127493 +1587 1 onefif_slice1585 nodes= [4585, 4586, 4587, 1585, 1586, 1587] persons= [3592, 3590, 3591] +--- sas= [] onefif_slice1585 crp= 1 +--- 'expires': 1167127493 +1588 1 onefig_slice1586 nodes= [4586, 4587, 4588, 1586, 1587, 1588] persons= [3592, 3593, 3591] +--- sas= [] onefig_slice1586 crp= 1 +--- 'expires': 1167127494 +1589 1 onefih_slice1587 nodes= [4587, 4588, 4589, 1587, 1588, 1589] persons= [3592, 3593, 3594] +--- sas= [] onefih_slice1587 crp= 1 +--- 'expires': 1167127494 +1590 1 onefii_slice1588 nodes= [4588, 4589, 4590, 1588, 1589, 1590] persons= [3593, 3594, 3595] +--- sas= [] onefii_slice1588 crp= 1 +--- 'expires': 1167127494 +1591 1 onefij_slice1589 nodes= [4589, 4590, 4591, 1589, 1590, 1591] persons= [3594, 3595, 3596] +--- sas= [] onefij_slice1589 crp= 1 +--- 'expires': 1167127495 +1592 1 onefja_slice1590 nodes= [4590, 4591, 4592, 1590, 1591, 1592] persons= [3595, 3596, 3597] +--- sas= [] onefja_slice1590 crp= 1 +--- 'expires': 1167127495 +1593 1 onefjb_slice1591 nodes= [4591, 4592, 4593, 1591, 1592, 1593] persons= [3596, 3597, 3598] +--- sas= [] onefjb_slice1591 crp= 1 +--- 'expires': 1167127496 +1594 1 onefjc_slice1592 nodes= [4592, 4593, 4594, 1592, 1593, 1594] persons= [3597, 3598, 3599] +--- sas= [] onefjc_slice1592 crp= 1 +--- 'expires': 1167127496 +1595 1 onefjd_slice1593 nodes= [4593, 4594, 4595, 1593, 1594, 1595] persons= [3600, 3598, 3599] +--- sas= [] onefjd_slice1593 crp= 1 +--- 'expires': 1167127497 +1596 1 onefje_slice1594 nodes= [4594, 4595, 4596, 1594, 1595, 1596] persons= [3600, 3601, 3599] +--- sas= [] onefje_slice1594 crp= 1 +--- 'expires': 1167127497 +1597 1 onefjf_slice1595 nodes= [4595, 4596, 4597, 1595, 1596, 1597] persons= [3600, 3601, 3602] +--- sas= [] onefjf_slice1595 crp= 1 +--- 'expires': 1167127498 +1598 1 onefjg_slice1596 nodes= [4596, 4597, 4598, 1596, 1597, 1598] persons= [3601, 3602, 3603] +--- sas= [] onefjg_slice1596 crp= 1 +--- 'expires': 1167127498 +1599 1 onefjh_slice1597 nodes= [4597, 4598, 4599, 1597, 1598, 1599] persons= [3602, 3603, 3604] +--- sas= [] onefjh_slice1597 crp= 1 +--- 'expires': 1167127499 +1600 1 onefji_slice1598 nodes= [1600, 4598, 4599, 4600, 1598, 1599] persons= [3603, 3604, 3605] +--- sas= [] onefji_slice1598 crp= 1 +--- 'expires': 1167127499 +1601 1 onefjj_slice1599 nodes= [1600, 1601, 4599, 4600, 4601, 1599] persons= [3604, 3605, 3606] +--- sas= [] onefjj_slice1599 crp= 1 +--- 'expires': 1167127500 +1602 1 onegaa_slice1600 nodes= [1600, 1601, 1602, 4600, 4601, 4602] persons= [3605, 3606, 3607] +--- sas= [] onegaa_slice1600 crp= 1 +--- 'expires': 1167127500 +1603 1 onegab_slice1601 nodes= [1601, 1602, 1603, 4601, 4602, 4603] persons= [3608, 3606, 3607] +--- sas= [] onegab_slice1601 crp= 1 +--- 'expires': 1167127500 +1604 1 onegac_slice1602 nodes= [1602, 1603, 1604, 4602, 4603, 4604] persons= [3608, 3609, 3607] +--- sas= [] onegac_slice1602 crp= 1 +--- 'expires': 1167127501 +1605 1 onegad_slice1603 nodes= [1603, 1604, 1605, 4603, 4604, 4605] persons= [3608, 3609, 3610] +--- sas= [] onegad_slice1603 crp= 1 +--- 'expires': 1167127501 +1606 1 onegae_slice1604 nodes= [1604, 1605, 1606, 4604, 4605, 4606] persons= [3609, 3610, 3611] +--- sas= [] onegae_slice1604 crp= 1 +--- 'expires': 1167127502 +1607 1 onegaf_slice1605 nodes= [1605, 1606, 1607, 4605, 4606, 4607] persons= [3610, 3611, 3612] +--- sas= [] onegaf_slice1605 crp= 1 +--- 'expires': 1167127505 +1608 1 onegag_slice1606 nodes= [4608, 1606, 1607, 1608, 4606, 4607] persons= [3611, 3612, 3613] +--- sas= [] onegag_slice1606 crp= 1 +--- 'expires': 1167127508 +1609 1 onegah_slice1607 nodes= [4608, 4609, 1607, 1608, 1609, 4607] persons= [3612, 3613, 3614] +--- sas= [] onegah_slice1607 crp= 1 +--- 'expires': 1167127509 +1610 1 onegai_slice1608 nodes= [4608, 4609, 4610, 1608, 1609, 1610] persons= [3613, 3614, 3615] +--- sas= [] onegai_slice1608 crp= 1 +--- 'expires': 1167127511 +1611 1 onegaj_slice1609 nodes= [4609, 4610, 4611, 1609, 1610, 1611] persons= [3616, 3614, 3615] +--- sas= [] onegaj_slice1609 crp= 1 +--- 'expires': 1167127512 +1612 1 onegba_slice1610 nodes= [4610, 4611, 4612, 1610, 1611, 1612] persons= [3616, 3617, 3615] +--- sas= [] onegba_slice1610 crp= 1 +--- 'expires': 1167127514 +1613 1 onegbb_slice1611 nodes= [4611, 4612, 4613, 1611, 1612, 1613] persons= [3616, 3617, 3618] +--- sas= [] onegbb_slice1611 crp= 1 +--- 'expires': 1167127515 +1614 1 onegbc_slice1612 nodes= [4612, 4613, 4614, 1612, 1613, 1614] persons= [3617, 3618, 3619] +--- sas= [] onegbc_slice1612 crp= 1 +--- 'expires': 1167127517 +1615 1 onegbd_slice1613 nodes= [4613, 4614, 4615, 1613, 1614, 1615] persons= [3618, 3619, 3620] +--- sas= [] onegbd_slice1613 crp= 1 +--- 'expires': 1167127518 +1616 1 onegbe_slice1614 nodes= [4614, 4615, 4616, 1614, 1615, 1616] persons= [3619, 3620, 3621] +--- sas= [] onegbe_slice1614 crp= 1 +--- 'expires': 1167127519 +1617 1 onegbf_slice1615 nodes= [4615, 4616, 4617, 1615, 1616, 1617] persons= [3620, 3621, 3622] +--- sas= [] onegbf_slice1615 crp= 1 +--- 'expires': 1167127521 +1618 1 onegbg_slice1616 nodes= [4616, 4617, 4618, 1616, 1617, 1618] persons= [3621, 3622, 3623] +--- sas= [] onegbg_slice1616 crp= 1 +--- 'expires': 1167127522 +1619 1 onegbh_slice1617 nodes= [4617, 4618, 4619, 1617, 1618, 1619] persons= [3624, 3622, 3623] +--- sas= [] onegbh_slice1617 crp= 1 +--- 'expires': 1167127524 +1620 1 onegbi_slice1618 nodes= [4618, 4619, 4620, 1618, 1619, 1620] persons= [3624, 3625, 3623] +--- sas= [] onegbi_slice1618 crp= 1 +--- 'expires': 1167127525 +1621 1 onegbj_slice1619 nodes= [4619, 4620, 4621, 1619, 1620, 1621] persons= [3624, 3625, 3626] +--- sas= [] onegbj_slice1619 crp= 1 +--- 'expires': 1167127527 +1622 1 onegca_slice1620 nodes= [4620, 4621, 4622, 1620, 1621, 1622] persons= [3625, 3626, 3627] +--- sas= [] onegca_slice1620 crp= 1 +--- 'expires': 1167127529 +1623 1 onegcb_slice1621 nodes= [4621, 4622, 4623, 1621, 1622, 1623] persons= [3626, 3627, 3628] +--- sas= [] onegcb_slice1621 crp= 1 +--- 'expires': 1167127530 +1624 1 onegcc_slice1622 nodes= [4622, 4623, 4624, 1622, 1623, 1624] persons= [3627, 3628, 3629] +--- sas= [] onegcc_slice1622 crp= 1 +--- 'expires': 1167127532 +1625 1 onegcd_slice1623 nodes= [4623, 4624, 4625, 1623, 1624, 1625] persons= [3628, 3629, 3630] +--- sas= [] onegcd_slice1623 crp= 1 +--- 'expires': 1167127533 +1626 1 onegce_slice1624 nodes= [4624, 4625, 4626, 1624, 1625, 1626] persons= [3629, 3630, 3631] +--- sas= [] onegce_slice1624 crp= 1 +--- 'expires': 1167127535 +1627 1 onegcf_slice1625 nodes= [4625, 4626, 4627, 1625, 1626, 1627] persons= [3632, 3630, 3631] +--- sas= [] onegcf_slice1625 crp= 1 +--- 'expires': 1167127536 +1628 1 onegcg_slice1626 nodes= [4626, 4627, 4628, 1626, 1627, 1628] persons= [3632, 3633, 3631] +--- sas= [] onegcg_slice1626 crp= 1 +--- 'expires': 1167127538 +1629 1 onegch_slice1627 nodes= [4627, 4628, 4629, 1627, 1628, 1629] persons= [3632, 3633, 3634] +--- sas= [] onegch_slice1627 crp= 1 +--- 'expires': 1167127539 +1630 1 onegci_slice1628 nodes= [4628, 4629, 4630, 1628, 1629, 1630] persons= [3633, 3634, 3635] +--- sas= [] onegci_slice1628 crp= 1 +--- 'expires': 1167127541 +1631 1 onegcj_slice1629 nodes= [4629, 4630, 4631, 1629, 1630, 1631] persons= [3634, 3635, 3636] +--- sas= [] onegcj_slice1629 crp= 1 +--- 'expires': 1167127542 +1632 1 onegda_slice1630 nodes= [1632, 4630, 4631, 4632, 1630, 1631] persons= [3635, 3636, 3637] +--- sas= [] onegda_slice1630 crp= 1 +--- 'expires': 1167127544 +1633 1 onegdb_slice1631 nodes= [1632, 1633, 4631, 4632, 4633, 1631] persons= [3636, 3637, 3638] +--- sas= [] onegdb_slice1631 crp= 1 +--- 'expires': 1167127545 +1634 1 onegdc_slice1632 nodes= [1632, 1633, 1634, 4632, 4633, 4634] persons= [3637, 3638, 3639] +--- sas= [] onegdc_slice1632 crp= 1 +--- 'expires': 1167127547 +1635 1 onegdd_slice1633 nodes= [1633, 1634, 1635, 4633, 4634, 4635] persons= [3640, 3638, 3639] +--- sas= [] onegdd_slice1633 crp= 1 +--- 'expires': 1167127548 +1636 1 onegde_slice1634 nodes= [1634, 1635, 1636, 4634, 4635, 4636] persons= [3640, 3641, 3639] +--- sas= [] onegde_slice1634 crp= 1 +--- 'expires': 1167127550 +1637 1 onegdf_slice1635 nodes= [1635, 1636, 1637, 4635, 4636, 4637] persons= [3640, 3641, 3642] +--- sas= [] onegdf_slice1635 crp= 1 +--- 'expires': 1167127551 +1638 1 onegdg_slice1636 nodes= [1636, 1637, 1638, 4636, 4637, 4638] persons= [3641, 3642, 3643] +--- sas= [] onegdg_slice1636 crp= 1 +--- 'expires': 1167127553 +1639 1 onegdh_slice1637 nodes= [1637, 1638, 1639, 4637, 4638, 4639] persons= [3642, 3643, 3644] +--- sas= [] onegdh_slice1637 crp= 1 +--- 'expires': 1167127554 +1640 1 onegdi_slice1638 nodes= [4640, 1638, 1639, 1640, 4638, 4639] persons= [3643, 3644, 3645] +--- sas= [] onegdi_slice1638 crp= 1 +--- 'expires': 1167127556 +1641 1 onegdj_slice1639 nodes= [4640, 4641, 1639, 1640, 1641, 4639] persons= [3644, 3645, 3646] +--- sas= [] onegdj_slice1639 crp= 1 +--- 'expires': 1167127557 +1642 1 onegea_slice1640 nodes= [4640, 4641, 4642, 1640, 1641, 1642] persons= [3645, 3646, 3647] +--- sas= [] onegea_slice1640 crp= 1 +--- 'expires': 1167127559 +1643 1 onegeb_slice1641 nodes= [4641, 4642, 4643, 1641, 1642, 1643] persons= [3648, 3646, 3647] +--- sas= [] onegeb_slice1641 crp= 1 +--- 'expires': 1167127560 +1644 1 onegec_slice1642 nodes= [4642, 4643, 4644, 1642, 1643, 1644] persons= [3648, 3649, 3647] +--- sas= [] onegec_slice1642 crp= 1 +--- 'expires': 1167127562 +1645 1 oneged_slice1643 nodes= [4643, 4644, 4645, 1643, 1644, 1645] persons= [3648, 3649, 3650] +--- sas= [] oneged_slice1643 crp= 1 +--- 'expires': 1167127563 +1646 1 onegee_slice1644 nodes= [4644, 4645, 4646, 1644, 1645, 1646] persons= [3649, 3650, 3651] +--- sas= [] onegee_slice1644 crp= 1 +--- 'expires': 1167127565 +1647 1 onegef_slice1645 nodes= [4645, 4646, 4647, 1645, 1646, 1647] persons= [3650, 3651, 3652] +--- sas= [] onegef_slice1645 crp= 1 +--- 'expires': 1167127566 +1648 1 onegeg_slice1646 nodes= [4646, 4647, 4648, 1646, 1647, 1648] persons= [3651, 3652, 3653] +--- sas= [] onegeg_slice1646 crp= 1 +--- 'expires': 1167127568 +1649 1 onegeh_slice1647 nodes= [4647, 4648, 4649, 1647, 1648, 1649] persons= [3652, 3653, 3654] +--- sas= [] onegeh_slice1647 crp= 1 +--- 'expires': 1167127570 +1650 1 onegei_slice1648 nodes= [4648, 4649, 4650, 1648, 1649, 1650] persons= [3653, 3654, 3655] +--- sas= [] onegei_slice1648 crp= 1 +--- 'expires': 1167127571 +1651 1 onegej_slice1649 nodes= [4649, 4650, 4651, 1649, 1650, 1651] persons= [3656, 3654, 3655] +--- sas= [] onegej_slice1649 crp= 1 +--- 'expires': 1167127573 +1652 1 onegfa_slice1650 nodes= [4650, 4651, 4652, 1650, 1651, 1652] persons= [3656, 3657, 3655] +--- sas= [] onegfa_slice1650 crp= 1 +--- 'expires': 1167127575 +1653 1 onegfb_slice1651 nodes= [4651, 4652, 4653, 1651, 1652, 1653] persons= [3656, 3657, 3658] +--- sas= [] onegfb_slice1651 crp= 1 +--- 'expires': 1167127576 +1654 1 onegfc_slice1652 nodes= [4652, 4653, 4654, 1652, 1653, 1654] persons= [3657, 3658, 3659] +--- sas= [] onegfc_slice1652 crp= 1 +--- 'expires': 1167127578 +1655 1 onegfd_slice1653 nodes= [4653, 4654, 4655, 1653, 1654, 1655] persons= [3658, 3659, 3660] +--- sas= [] onegfd_slice1653 crp= 1 +--- 'expires': 1167127580 +1656 1 onegfe_slice1654 nodes= [4654, 4655, 4656, 1654, 1655, 1656] persons= [3659, 3660, 3661] +--- sas= [] onegfe_slice1654 crp= 1 +--- 'expires': 1167127581 +1657 1 onegff_slice1655 nodes= [4655, 4656, 4657, 1655, 1656, 1657] persons= [3660, 3661, 3662] +--- sas= [] onegff_slice1655 crp= 1 +--- 'expires': 1167127583 +1658 1 onegfg_slice1656 nodes= [4656, 4657, 4658, 1656, 1657, 1658] persons= [3661, 3662, 3663] +--- sas= [] onegfg_slice1656 crp= 1 +--- 'expires': 1167127584 +1659 1 onegfh_slice1657 nodes= [4657, 4658, 4659, 1657, 1658, 1659] persons= [3664, 3662, 3663] +--- sas= [] onegfh_slice1657 crp= 1 +--- 'expires': 1167127586 +1660 1 onegfi_slice1658 nodes= [4658, 4659, 4660, 1658, 1659, 1660] persons= [3664, 3665, 3663] +--- sas= [] onegfi_slice1658 crp= 1 +--- 'expires': 1167127587 +1661 1 onegfj_slice1659 nodes= [4659, 4660, 4661, 1659, 1660, 1661] persons= [3664, 3665, 3666] +--- sas= [] onegfj_slice1659 crp= 1 +--- 'expires': 1167127589 +1662 1 onegga_slice1660 nodes= [4660, 4661, 4662, 1660, 1661, 1662] persons= [3665, 3666, 3667] +--- sas= [] onegga_slice1660 crp= 1 +--- 'expires': 1167127590 +1663 1 oneggb_slice1661 nodes= [4661, 4662, 4663, 1661, 1662, 1663] persons= [3666, 3667, 3668] +--- sas= [] oneggb_slice1661 crp= 1 +--- 'expires': 1167127592 +1664 1 oneggc_slice1662 nodes= [1664, 4662, 4663, 4664, 1662, 1663] persons= [3667, 3668, 3669] +--- sas= [] oneggc_slice1662 crp= 1 +--- 'expires': 1167127593 +1665 1 oneggd_slice1663 nodes= [1664, 1665, 4663, 4664, 4665, 1663] persons= [3668, 3669, 3670] +--- sas= [] oneggd_slice1663 crp= 1 +--- 'expires': 1167127595 +1666 1 onegge_slice1664 nodes= [1664, 1665, 1666, 4664, 4665, 4666] persons= [3669, 3670, 3671] +--- sas= [] onegge_slice1664 crp= 1 +--- 'expires': 1167127597 +1667 1 oneggf_slice1665 nodes= [1665, 1666, 1667, 4665, 4666, 4667] persons= [3672, 3670, 3671] +--- sas= [] oneggf_slice1665 crp= 1 +--- 'expires': 1167127598 +1668 1 oneggg_slice1666 nodes= [1666, 1667, 1668, 4666, 4667, 4668] persons= [3672, 3673, 3671] +--- sas= [] oneggg_slice1666 crp= 1 +--- 'expires': 1167127600 +1669 1 oneggh_slice1667 nodes= [1667, 1668, 1669, 4667, 4668, 4669] persons= [3672, 3673, 3674] +--- sas= [] oneggh_slice1667 crp= 1 +--- 'expires': 1167127602 +1670 1 oneggi_slice1668 nodes= [1668, 1669, 1670, 4668, 4669, 4670] persons= [3673, 3674, 3675] +--- sas= [] oneggi_slice1668 crp= 1 +--- 'expires': 1167127603 +1671 1 oneggj_slice1669 nodes= [1669, 1670, 1671, 4669, 4670, 4671] persons= [3674, 3675, 3676] +--- sas= [] oneggj_slice1669 crp= 1 +--- 'expires': 1167127605 +1672 1 onegha_slice1670 nodes= [4672, 1670, 1671, 1672, 4670, 4671] persons= [3675, 3676, 3677] +--- sas= [] onegha_slice1670 crp= 1 +--- 'expires': 1167127606 +1673 1 oneghb_slice1671 nodes= [4672, 4673, 1671, 1672, 1673, 4671] persons= [3676, 3677, 3678] +--- sas= [] oneghb_slice1671 crp= 1 +--- 'expires': 1167127608 +1674 1 oneghc_slice1672 nodes= [4672, 4673, 4674, 1672, 1673, 1674] persons= [3677, 3678, 3679] +--- sas= [] oneghc_slice1672 crp= 1 +--- 'expires': 1167127609 +1675 1 oneghd_slice1673 nodes= [4673, 4674, 4675, 1673, 1674, 1675] persons= [3680, 3678, 3679] +--- sas= [] oneghd_slice1673 crp= 1 +--- 'expires': 1167127611 +1676 1 oneghe_slice1674 nodes= [4674, 4675, 4676, 1674, 1675, 1676] persons= [3680, 3681, 3679] +--- sas= [] oneghe_slice1674 crp= 1 +--- 'expires': 1167127612 +1677 1 oneghf_slice1675 nodes= [4675, 4676, 4677, 1675, 1676, 1677] persons= [3680, 3681, 3682] +--- sas= [] oneghf_slice1675 crp= 1 +--- 'expires': 1167127614 +1678 1 oneghg_slice1676 nodes= [4676, 4677, 4678, 1676, 1677, 1678] persons= [3681, 3682, 3683] +--- sas= [] oneghg_slice1676 crp= 1 +--- 'expires': 1167127616 +1679 1 oneghh_slice1677 nodes= [4677, 4678, 4679, 1677, 1678, 1679] persons= [3682, 3683, 3684] +--- sas= [] oneghh_slice1677 crp= 1 +--- 'expires': 1167127617 +1680 1 oneghi_slice1678 nodes= [4678, 4679, 4680, 1678, 1679, 1680] persons= [3683, 3684, 3685] +--- sas= [] oneghi_slice1678 crp= 1 +--- 'expires': 1167127619 +1681 1 oneghj_slice1679 nodes= [4679, 4680, 4681, 1679, 1680, 1681] persons= [3684, 3685, 3686] +--- sas= [] oneghj_slice1679 crp= 1 +--- 'expires': 1167127620 +1682 1 onegia_slice1680 nodes= [4680, 4681, 4682, 1680, 1681, 1682] persons= [3685, 3686, 3687] +--- sas= [] onegia_slice1680 crp= 1 +--- 'expires': 1167127622 +1683 1 onegib_slice1681 nodes= [4681, 4682, 4683, 1681, 1682, 1683] persons= [3688, 3686, 3687] +--- sas= [] onegib_slice1681 crp= 1 +--- 'expires': 1167127623 +1684 1 onegic_slice1682 nodes= [4682, 4683, 4684, 1682, 1683, 1684] persons= [3688, 3689, 3687] +--- sas= [] onegic_slice1682 crp= 1 +--- 'expires': 1167127625 +1685 1 onegid_slice1683 nodes= [4683, 4684, 4685, 1683, 1684, 1685] persons= [3688, 3689, 3690] +--- sas= [] onegid_slice1683 crp= 1 +--- 'expires': 1167127627 +1686 1 onegie_slice1684 nodes= [4684, 4685, 4686, 1684, 1685, 1686] persons= [3689, 3690, 3691] +--- sas= [] onegie_slice1684 crp= 1 +--- 'expires': 1167127628 +1687 1 onegif_slice1685 nodes= [4685, 4686, 4687, 1685, 1686, 1687] persons= [3690, 3691, 3692] +--- sas= [] onegif_slice1685 crp= 1 +--- 'expires': 1167127630 +1688 1 onegig_slice1686 nodes= [4686, 4687, 4688, 1686, 1687, 1688] persons= [3691, 3692, 3693] +--- sas= [] onegig_slice1686 crp= 1 +--- 'expires': 1167127631 +1689 1 onegih_slice1687 nodes= [4687, 4688, 4689, 1687, 1688, 1689] persons= [3692, 3693, 3694] +--- sas= [] onegih_slice1687 crp= 1 +--- 'expires': 1167127633 +1690 1 onegii_slice1688 nodes= [4688, 4689, 4690, 1688, 1689, 1690] persons= [3693, 3694, 3695] +--- sas= [] onegii_slice1688 crp= 1 +--- 'expires': 1167127634 +1691 1 onegij_slice1689 nodes= [4689, 4690, 4691, 1689, 1690, 1691] persons= [3696, 3694, 3695] +--- sas= [] onegij_slice1689 crp= 1 +--- 'expires': 1167127636 +1692 1 onegja_slice1690 nodes= [4690, 4691, 4692, 1690, 1691, 1692] persons= [3696, 3697, 3695] +--- sas= [] onegja_slice1690 crp= 1 +--- 'expires': 1167127637 +1693 1 onegjb_slice1691 nodes= [4691, 4692, 4693, 1691, 1692, 1693] persons= [3696, 3697, 3698] +--- sas= [] onegjb_slice1691 crp= 1 +--- 'expires': 1167127639 +1694 1 onegjc_slice1692 nodes= [4692, 4693, 4694, 1692, 1693, 1694] persons= [3697, 3698, 3699] +--- sas= [] onegjc_slice1692 crp= 1 +--- 'expires': 1167127640 +1695 1 onegjd_slice1693 nodes= [4693, 4694, 4695, 1693, 1694, 1695] persons= [3698, 3699, 3700] +--- sas= [] onegjd_slice1693 crp= 1 +--- 'expires': 1167127642 +1696 1 onegje_slice1694 nodes= [1696, 4694, 4695, 4696, 1694, 1695] persons= [3699, 3700, 3701] +--- sas= [] onegje_slice1694 crp= 1 +--- 'expires': 1167127644 +1697 1 onegjf_slice1695 nodes= [1696, 1697, 4695, 4696, 4697, 1695] persons= [3700, 3701, 3702] +--- sas= [] onegjf_slice1695 crp= 1 +--- 'expires': 1167127645 +1698 1 onegjg_slice1696 nodes= [1696, 1697, 1698, 4696, 4697, 4698] persons= [3701, 3702, 3703] +--- sas= [] onegjg_slice1696 crp= 1 +--- 'expires': 1167127647 +1699 1 onegjh_slice1697 nodes= [1697, 1698, 1699, 4697, 4698, 4699] persons= [3704, 3702, 3703] +--- sas= [] onegjh_slice1697 crp= 1 +--- 'expires': 1167127648 +1700 1 onegji_slice1698 nodes= [1698, 1699, 1700, 4698, 4699, 4700] persons= [3704, 3705, 3703] +--- sas= [] onegji_slice1698 crp= 1 +--- 'expires': 1167127650 +1701 1 onegjj_slice1699 nodes= [1699, 1700, 1701, 4699, 4700, 4701] persons= [3704, 3705, 3706] +--- sas= [] onegjj_slice1699 crp= 1 +--- 'expires': 1167127651 +1702 1 onehaa_slice1700 nodes= [1700, 1701, 1702, 4700, 4701, 4702] persons= [3705, 3706, 3707] +--- sas= [] onehaa_slice1700 crp= 1 +--- 'expires': 1167127653 +1703 1 onehab_slice1701 nodes= [1701, 1702, 1703, 4701, 4702, 4703] persons= [3706, 3707, 3708] +--- sas= [] onehab_slice1701 crp= 1 +--- 'expires': 1167127655 +1704 1 onehac_slice1702 nodes= [4704, 1702, 1703, 1704, 4702, 4703] persons= [3707, 3708, 3709] +--- sas= [] onehac_slice1702 crp= 1 +--- 'expires': 1167127656 +1705 1 onehad_slice1703 nodes= [4704, 4705, 1703, 1704, 1705, 4703] persons= [3708, 3709, 3710] +--- sas= [] onehad_slice1703 crp= 1 +--- 'expires': 1167127658 +1706 1 onehae_slice1704 nodes= [4704, 4705, 4706, 1704, 1705, 1706] persons= [3709, 3710, 3711] +--- sas= [] onehae_slice1704 crp= 1 +--- 'expires': 1167127659 +1707 1 onehaf_slice1705 nodes= [4705, 4706, 4707, 1705, 1706, 1707] persons= [3712, 3710, 3711] +--- sas= [] onehaf_slice1705 crp= 1 +--- 'expires': 1167127661 +1708 1 onehag_slice1706 nodes= [4706, 4707, 4708, 1706, 1707, 1708] persons= [3712, 3713, 3711] +--- sas= [] onehag_slice1706 crp= 1 +--- 'expires': 1167127662 +1709 1 onehah_slice1707 nodes= [4707, 4708, 4709, 1707, 1708, 1709] persons= [3712, 3713, 3714] +--- sas= [] onehah_slice1707 crp= 1 +--- 'expires': 1167127664 +1710 1 onehai_slice1708 nodes= [4708, 4709, 4710, 1708, 1709, 1710] persons= [3713, 3714, 3715] +--- sas= [] onehai_slice1708 crp= 1 +--- 'expires': 1167127666 +1711 1 onehaj_slice1709 nodes= [4709, 4710, 4711, 1709, 1710, 1711] persons= [3714, 3715, 3716] +--- sas= [] onehaj_slice1709 crp= 1 +--- 'expires': 1167127667 +1712 1 onehba_slice1710 nodes= [4710, 4711, 4712, 1710, 1711, 1712] persons= [3715, 3716, 3717] +--- sas= [] onehba_slice1710 crp= 1 +--- 'expires': 1167127669 +1713 1 onehbb_slice1711 nodes= [4711, 4712, 4713, 1711, 1712, 1713] persons= [3716, 3717, 3718] +--- sas= [] onehbb_slice1711 crp= 1 +--- 'expires': 1167127670 +1714 1 onehbc_slice1712 nodes= [4712, 4713, 4714, 1712, 1713, 1714] persons= [3717, 3718, 3719] +--- sas= [] onehbc_slice1712 crp= 1 +--- 'expires': 1167127672 +1715 1 onehbd_slice1713 nodes= [4713, 4714, 4715, 1713, 1714, 1715] persons= [3720, 3718, 3719] +--- sas= [] onehbd_slice1713 crp= 1 +--- 'expires': 1167127673 +1716 1 onehbe_slice1714 nodes= [4714, 4715, 4716, 1714, 1715, 1716] persons= [3720, 3721, 3719] +--- sas= [] onehbe_slice1714 crp= 1 +--- 'expires': 1167127675 +1717 1 onehbf_slice1715 nodes= [4715, 4716, 4717, 1715, 1716, 1717] persons= [3720, 3721, 3722] +--- sas= [] onehbf_slice1715 crp= 1 +--- 'expires': 1167127677 +1718 1 onehbg_slice1716 nodes= [4716, 4717, 4718, 1716, 1717, 1718] persons= [3721, 3722, 3723] +--- sas= [] onehbg_slice1716 crp= 1 +--- 'expires': 1167127678 +1719 1 onehbh_slice1717 nodes= [4717, 4718, 4719, 1717, 1718, 1719] persons= [3722, 3723, 3724] +--- sas= [] onehbh_slice1717 crp= 1 +--- 'expires': 1167127680 +1720 1 onehbi_slice1718 nodes= [4718, 4719, 4720, 1718, 1719, 1720] persons= [3723, 3724, 3725] +--- sas= [] onehbi_slice1718 crp= 1 +--- 'expires': 1167127681 +1721 1 onehbj_slice1719 nodes= [4719, 4720, 4721, 1719, 1720, 1721] persons= [3724, 3725, 3726] +--- sas= [] onehbj_slice1719 crp= 1 +--- 'expires': 1167127683 +1722 1 onehca_slice1720 nodes= [4720, 4721, 4722, 1720, 1721, 1722] persons= [3725, 3726, 3727] +--- sas= [] onehca_slice1720 crp= 1 +--- 'expires': 1167127685 +1723 1 onehcb_slice1721 nodes= [4721, 4722, 4723, 1721, 1722, 1723] persons= [3728, 3726, 3727] +--- sas= [] onehcb_slice1721 crp= 1 +--- 'expires': 1167127686 +1724 1 onehcc_slice1722 nodes= [4722, 4723, 4724, 1722, 1723, 1724] persons= [3728, 3729, 3727] +--- sas= [] onehcc_slice1722 crp= 1 +--- 'expires': 1167127688 +1725 1 onehcd_slice1723 nodes= [4723, 4724, 4725, 1723, 1724, 1725] persons= [3728, 3729, 3730] +--- sas= [] onehcd_slice1723 crp= 1 +--- 'expires': 1167127689 +1726 1 onehce_slice1724 nodes= [4724, 4725, 4726, 1724, 1725, 1726] persons= [3729, 3730, 3731] +--- sas= [] onehce_slice1724 crp= 1 +--- 'expires': 1167127691 +1727 1 onehcf_slice1725 nodes= [4725, 4726, 4727, 1725, 1726, 1727] persons= [3730, 3731, 3732] +--- sas= [] onehcf_slice1725 crp= 1 +--- 'expires': 1167127693 +1728 1 onehcg_slice1726 nodes= [1728, 4726, 4727, 4728, 1726, 1727] persons= [3731, 3732, 3733] +--- sas= [] onehcg_slice1726 crp= 1 +--- 'expires': 1167127694 +1729 1 onehch_slice1727 nodes= [1728, 1729, 4727, 4728, 4729, 1727] persons= [3732, 3733, 3734] +--- sas= [] onehch_slice1727 crp= 1 +--- 'expires': 1167127696 +1730 1 onehci_slice1728 nodes= [1728, 1729, 1730, 4728, 4729, 4730] persons= [3733, 3734, 3735] +--- sas= [] onehci_slice1728 crp= 1 +--- 'expires': 1167127697 +1731 1 onehcj_slice1729 nodes= [1729, 1730, 1731, 4729, 4730, 4731] persons= [3736, 3734, 3735] +--- sas= [] onehcj_slice1729 crp= 1 +--- 'expires': 1167127699 +1732 1 onehda_slice1730 nodes= [1730, 1731, 1732, 4730, 4731, 4732] persons= [3736, 3737, 3735] +--- sas= [] onehda_slice1730 crp= 1 +--- 'expires': 1167127700 +1733 1 onehdb_slice1731 nodes= [1731, 1732, 1733, 4731, 4732, 4733] persons= [3736, 3737, 3738] +--- sas= [] onehdb_slice1731 crp= 1 +--- 'expires': 1167127702 +1734 1 onehdc_slice1732 nodes= [1732, 1733, 1734, 4732, 4733, 4734] persons= [3737, 3738, 3739] +--- sas= [] onehdc_slice1732 crp= 1 +--- 'expires': 1167127704 +1735 1 onehdd_slice1733 nodes= [1733, 1734, 1735, 4733, 4734, 4735] persons= [3738, 3739, 3740] +--- sas= [] onehdd_slice1733 crp= 1 +--- 'expires': 1167127705 +1736 1 onehde_slice1734 nodes= [4736, 1734, 1735, 1736, 4734, 4735] persons= [3739, 3740, 3741] +--- sas= [] onehde_slice1734 crp= 1 +--- 'expires': 1167127706 +1737 1 onehdf_slice1735 nodes= [4736, 4737, 1735, 1736, 1737, 4735] persons= [3740, 3741, 3742] +--- sas= [] onehdf_slice1735 crp= 1 +--- 'expires': 1167127708 +1738 1 onehdg_slice1736 nodes= [4736, 4737, 4738, 1736, 1737, 1738] persons= [3741, 3742, 3743] +--- sas= [] onehdg_slice1736 crp= 1 +--- 'expires': 1167127709 +1739 1 onehdh_slice1737 nodes= [4737, 4738, 4739, 1737, 1738, 1739] persons= [3744, 3742, 3743] +--- sas= [] onehdh_slice1737 crp= 1 +--- 'expires': 1167127711 +1740 1 onehdi_slice1738 nodes= [4738, 4739, 4740, 1738, 1739, 1740] persons= [3744, 3745, 3743] +--- sas= [] onehdi_slice1738 crp= 1 +--- 'expires': 1167127713 +1741 1 onehdj_slice1739 nodes= [4739, 4740, 4741, 1739, 1740, 1741] persons= [3744, 3745, 3746] +--- sas= [] onehdj_slice1739 crp= 1 +--- 'expires': 1167127714 +1742 1 onehea_slice1740 nodes= [4740, 4741, 4742, 1740, 1741, 1742] persons= [3745, 3746, 3747] +--- sas= [] onehea_slice1740 crp= 1 +--- 'expires': 1167127716 +1743 1 oneheb_slice1741 nodes= [4741, 4742, 4743, 1741, 1742, 1743] persons= [3746, 3747, 3748] +--- sas= [] oneheb_slice1741 crp= 1 +--- 'expires': 1167127717 +1744 1 onehec_slice1742 nodes= [4742, 4743, 4744, 1742, 1743, 1744] persons= [3747, 3748, 3749] +--- sas= [] onehec_slice1742 crp= 1 +--- 'expires': 1167127719 +1745 1 onehed_slice1743 nodes= [4743, 4744, 4745, 1743, 1744, 1745] persons= [3748, 3749, 3750] +--- sas= [] onehed_slice1743 crp= 1 +--- 'expires': 1167127720 +1746 1 onehee_slice1744 nodes= [4744, 4745, 4746, 1744, 1745, 1746] persons= [3749, 3750, 3751] +--- sas= [] onehee_slice1744 crp= 1 +--- 'expires': 1167127722 +1747 1 onehef_slice1745 nodes= [4745, 4746, 4747, 1745, 1746, 1747] persons= [3752, 3750, 3751] +--- sas= [] onehef_slice1745 crp= 1 +--- 'expires': 1167127724 +1748 1 oneheg_slice1746 nodes= [4746, 4747, 4748, 1746, 1747, 1748] persons= [3752, 3753, 3751] +--- sas= [] oneheg_slice1746 crp= 1 +--- 'expires': 1167127725 +1749 1 oneheh_slice1747 nodes= [4747, 4748, 4749, 1747, 1748, 1749] persons= [3752, 3753, 3754] +--- sas= [] oneheh_slice1747 crp= 1 +--- 'expires': 1167127727 +1750 1 onehei_slice1748 nodes= [4748, 4749, 4750, 1748, 1749, 1750] persons= [3753, 3754, 3755] +--- sas= [] onehei_slice1748 crp= 1 +--- 'expires': 1167127728 +1751 1 onehej_slice1749 nodes= [4749, 4750, 4751, 1749, 1750, 1751] persons= [3754, 3755, 3756] +--- sas= [] onehej_slice1749 crp= 1 +--- 'expires': 1167127730 +1752 1 onehfa_slice1750 nodes= [4750, 4751, 4752, 1750, 1751, 1752] persons= [3755, 3756, 3757] +--- sas= [] onehfa_slice1750 crp= 1 +--- 'expires': 1167127732 +1753 1 onehfb_slice1751 nodes= [4751, 4752, 4753, 1751, 1752, 1753] persons= [3756, 3757, 3758] +--- sas= [] onehfb_slice1751 crp= 1 +--- 'expires': 1167127733 +1754 1 onehfc_slice1752 nodes= [4752, 4753, 4754, 1752, 1753, 1754] persons= [3757, 3758, 3759] +--- sas= [] onehfc_slice1752 crp= 1 +--- 'expires': 1167127735 +1755 1 onehfd_slice1753 nodes= [4753, 4754, 4755, 1753, 1754, 1755] persons= [3760, 3758, 3759] +--- sas= [] onehfd_slice1753 crp= 1 +--- 'expires': 1167127737 +1756 1 onehfe_slice1754 nodes= [4754, 4755, 4756, 1754, 1755, 1756] persons= [3760, 3761, 3759] +--- sas= [] onehfe_slice1754 crp= 1 +--- 'expires': 1167127739 +1757 1 onehff_slice1755 nodes= [4755, 4756, 4757, 1755, 1756, 1757] persons= [3760, 3761, 3762] +--- sas= [] onehff_slice1755 crp= 1 +--- 'expires': 1167127740 +1758 1 onehfg_slice1756 nodes= [4756, 4757, 4758, 1756, 1757, 1758] persons= [3761, 3762, 3763] +--- sas= [] onehfg_slice1756 crp= 1 +--- 'expires': 1167127742 +1759 1 onehfh_slice1757 nodes= [4757, 4758, 4759, 1757, 1758, 1759] persons= [3762, 3763, 3764] +--- sas= [] onehfh_slice1757 crp= 1 +--- 'expires': 1167127743 +1760 1 onehfi_slice1758 nodes= [1760, 4758, 4759, 4760, 1758, 1759] persons= [3763, 3764, 3765] +--- sas= [] onehfi_slice1758 crp= 1 +--- 'expires': 1167127745 +1761 1 onehfj_slice1759 nodes= [1760, 1761, 4759, 4760, 4761, 1759] persons= [3764, 3765, 3766] +--- sas= [] onehfj_slice1759 crp= 1 +--- 'expires': 1167127746 +1762 1 onehga_slice1760 nodes= [1760, 1761, 1762, 4760, 4761, 4762] persons= [3765, 3766, 3767] +--- sas= [] onehga_slice1760 crp= 1 +--- 'expires': 1167127748 +1763 1 onehgb_slice1761 nodes= [1761, 1762, 1763, 4761, 4762, 4763] persons= [3768, 3766, 3767] +--- sas= [] onehgb_slice1761 crp= 1 +--- 'expires': 1167127750 +1764 1 onehgc_slice1762 nodes= [1762, 1763, 1764, 4762, 4763, 4764] persons= [3768, 3769, 3767] +--- sas= [] onehgc_slice1762 crp= 1 +--- 'expires': 1167127751 +1765 1 onehgd_slice1763 nodes= [1763, 1764, 1765, 4763, 4764, 4765] persons= [3768, 3769, 3770] +--- sas= [] onehgd_slice1763 crp= 1 +--- 'expires': 1167127753 +1766 1 onehge_slice1764 nodes= [1764, 1765, 1766, 4764, 4765, 4766] persons= [3769, 3770, 3771] +--- sas= [] onehge_slice1764 crp= 1 +--- 'expires': 1167127755 +1767 1 onehgf_slice1765 nodes= [1765, 1766, 1767, 4765, 4766, 4767] persons= [3770, 3771, 3772] +--- sas= [] onehgf_slice1765 crp= 1 +--- 'expires': 1167127756 +1768 1 onehgg_slice1766 nodes= [4768, 1766, 1767, 1768, 4766, 4767] persons= [3771, 3772, 3773] +--- sas= [] onehgg_slice1766 crp= 1 +--- 'expires': 1167127758 +1769 1 onehgh_slice1767 nodes= [4768, 4769, 1767, 1768, 1769, 4767] persons= [3772, 3773, 3774] +--- sas= [] onehgh_slice1767 crp= 1 +--- 'expires': 1167127759 +1770 1 onehgi_slice1768 nodes= [4768, 4769, 4770, 1768, 1769, 1770] persons= [3773, 3774, 3775] +--- sas= [] onehgi_slice1768 crp= 1 +--- 'expires': 1167127761 +1771 1 onehgj_slice1769 nodes= [4769, 4770, 4771, 1769, 1770, 1771] persons= [3776, 3774, 3775] +--- sas= [] onehgj_slice1769 crp= 1 +--- 'expires': 1167127762 +1772 1 onehha_slice1770 nodes= [4770, 4771, 4772, 1770, 1771, 1772] persons= [3776, 3777, 3775] +--- sas= [] onehha_slice1770 crp= 1 +--- 'expires': 1167127764 +1773 1 onehhb_slice1771 nodes= [4771, 4772, 4773, 1771, 1772, 1773] persons= [3776, 3777, 3778] +--- sas= [] onehhb_slice1771 crp= 1 +--- 'expires': 1167127766 +1774 1 onehhc_slice1772 nodes= [4772, 4773, 4774, 1772, 1773, 1774] persons= [3777, 3778, 3779] +--- sas= [] onehhc_slice1772 crp= 1 +--- 'expires': 1167127767 +1775 1 onehhd_slice1773 nodes= [4773, 4774, 4775, 1773, 1774, 1775] persons= [3778, 3779, 3780] +--- sas= [] onehhd_slice1773 crp= 1 +--- 'expires': 1167127769 +1776 1 onehhe_slice1774 nodes= [4774, 4775, 4776, 1774, 1775, 1776] persons= [3779, 3780, 3781] +--- sas= [] onehhe_slice1774 crp= 1 +--- 'expires': 1167127771 +1777 1 onehhf_slice1775 nodes= [4775, 4776, 4777, 1775, 1776, 1777] persons= [3780, 3781, 3782] +--- sas= [] onehhf_slice1775 crp= 1 +--- 'expires': 1167127772 +1778 1 onehhg_slice1776 nodes= [4776, 4777, 4778, 1776, 1777, 1778] persons= [3781, 3782, 3783] +--- sas= [] onehhg_slice1776 crp= 1 +--- 'expires': 1167127774 +1779 1 onehhh_slice1777 nodes= [4777, 4778, 4779, 1777, 1778, 1779] persons= [3784, 3782, 3783] +--- sas= [] onehhh_slice1777 crp= 1 +--- 'expires': 1167127775 +1780 1 onehhi_slice1778 nodes= [4778, 4779, 4780, 1778, 1779, 1780] persons= [3784, 3785, 3783] +--- sas= [] onehhi_slice1778 crp= 1 +--- 'expires': 1167127777 +1781 1 onehhj_slice1779 nodes= [4779, 4780, 4781, 1779, 1780, 1781] persons= [3784, 3785, 3786] +--- sas= [] onehhj_slice1779 crp= 1 +--- 'expires': 1167127779 +1782 1 onehia_slice1780 nodes= [4780, 4781, 4782, 1780, 1781, 1782] persons= [3785, 3786, 3787] +--- sas= [] onehia_slice1780 crp= 1 +--- 'expires': 1167127781 +1783 1 onehib_slice1781 nodes= [4781, 4782, 4783, 1781, 1782, 1783] persons= [3786, 3787, 3788] +--- sas= [] onehib_slice1781 crp= 1 +--- 'expires': 1167127782 +1784 1 onehic_slice1782 nodes= [4782, 4783, 4784, 1782, 1783, 1784] persons= [3787, 3788, 3789] +--- sas= [] onehic_slice1782 crp= 1 +--- 'expires': 1167127784 +1785 1 onehid_slice1783 nodes= [4783, 4784, 4785, 1783, 1784, 1785] persons= [3788, 3789, 3790] +--- sas= [] onehid_slice1783 crp= 1 +--- 'expires': 1167127785 +1786 1 onehie_slice1784 nodes= [4784, 4785, 4786, 1784, 1785, 1786] persons= [3789, 3790, 3791] +--- sas= [] onehie_slice1784 crp= 1 +--- 'expires': 1167127787 +1787 1 onehif_slice1785 nodes= [4785, 4786, 4787, 1785, 1786, 1787] persons= [3792, 3790, 3791] +--- sas= [] onehif_slice1785 crp= 1 +--- 'expires': 1167127789 +1788 1 onehig_slice1786 nodes= [4786, 4787, 4788, 1786, 1787, 1788] persons= [3792, 3793, 3791] +--- sas= [] onehig_slice1786 crp= 1 +--- 'expires': 1167127791 +1789 1 onehih_slice1787 nodes= [4787, 4788, 4789, 1787, 1788, 1789] persons= [3792, 3793, 3794] +--- sas= [] onehih_slice1787 crp= 1 +--- 'expires': 1167127792 +1790 1 onehii_slice1788 nodes= [4788, 4789, 4790, 1788, 1789, 1790] persons= [3793, 3794, 3795] +--- sas= [] onehii_slice1788 crp= 1 +--- 'expires': 1167127794 +1791 1 onehij_slice1789 nodes= [4789, 4790, 4791, 1789, 1790, 1791] persons= [3794, 3795, 3796] +--- sas= [] onehij_slice1789 crp= 1 +--- 'expires': 1167127795 +1792 1 onehja_slice1790 nodes= [1792, 4790, 4791, 4792, 1790, 1791] persons= [3795, 3796, 3797] +--- sas= [] onehja_slice1790 crp= 1 +--- 'expires': 1167127797 +1793 1 onehjb_slice1791 nodes= [1792, 1793, 4791, 4792, 4793, 1791] persons= [3796, 3797, 3798] +--- sas= [] onehjb_slice1791 crp= 1 +--- 'expires': 1167127799 +1794 1 onehjc_slice1792 nodes= [1792, 1793, 1794, 4792, 4793, 4794] persons= [3797, 3798, 3799] +--- sas= [] onehjc_slice1792 crp= 1 +--- 'expires': 1167127800 +1795 1 onehjd_slice1793 nodes= [1793, 1794, 1795, 4793, 4794, 4795] persons= [3800, 3798, 3799] +--- sas= [] onehjd_slice1793 crp= 1 +--- 'expires': 1167127803 +1796 1 onehje_slice1794 nodes= [1794, 1795, 1796, 4794, 4795, 4796] persons= [3800, 3801, 3799] +--- sas= [] onehje_slice1794 crp= 1 +--- 'expires': 1167127804 +1797 1 onehjf_slice1795 nodes= [1795, 1796, 1797, 4795, 4796, 4797] persons= [3800, 3801, 3802] +--- sas= [] onehjf_slice1795 crp= 1 +--- 'expires': 1167127806 +1798 1 onehjg_slice1796 nodes= [1796, 1797, 1798, 4796, 4797, 4798] persons= [3801, 3802, 3803] +--- sas= [] onehjg_slice1796 crp= 1 +--- 'expires': 1167127808 +1799 1 onehjh_slice1797 nodes= [1797, 1798, 1799, 4797, 4798, 4799] persons= [3802, 3803, 3804] +--- sas= [] onehjh_slice1797 crp= 1 +--- 'expires': 1167127809 +1800 1 onehji_slice1798 nodes= [4800, 1798, 1799, 1800, 4798, 4799] persons= [3803, 3804, 3805] +--- sas= [] onehji_slice1798 crp= 1 +--- 'expires': 1167127811 +1801 1 onehjj_slice1799 nodes= [4800, 4801, 1799, 1800, 1801, 4799] persons= [3804, 3805, 3806] +--- sas= [] onehjj_slice1799 crp= 1 +--- 'expires': 1167127813 +1802 1 oneiaa_slice1800 nodes= [4800, 4801, 4802, 1800, 1801, 1802] persons= [3805, 3806, 3807] +--- sas= [] oneiaa_slice1800 crp= 1 +--- 'expires': 1167127814 +1803 1 oneiab_slice1801 nodes= [4801, 4802, 4803, 1801, 1802, 1803] persons= [3808, 3806, 3807] +--- sas= [] oneiab_slice1801 crp= 1 +--- 'expires': 1167127816 +1804 1 oneiac_slice1802 nodes= [4802, 4803, 4804, 1802, 1803, 1804] persons= [3808, 3809, 3807] +--- sas= [] oneiac_slice1802 crp= 1 +--- 'expires': 1167127817 +1805 1 oneiad_slice1803 nodes= [4803, 4804, 4805, 1803, 1804, 1805] persons= [3808, 3809, 3810] +--- sas= [] oneiad_slice1803 crp= 1 +--- 'expires': 1167127819 +1806 1 oneiae_slice1804 nodes= [4804, 4805, 4806, 1804, 1805, 1806] persons= [3809, 3810, 3811] +--- sas= [] oneiae_slice1804 crp= 1 +--- 'expires': 1167127820 +1807 1 oneiaf_slice1805 nodes= [4805, 4806, 4807, 1805, 1806, 1807] persons= [3810, 3811, 3812] +--- sas= [] oneiaf_slice1805 crp= 1 +--- 'expires': 1167127822 +1808 1 oneiag_slice1806 nodes= [4806, 4807, 4808, 1806, 1807, 1808] persons= [3811, 3812, 3813] +--- sas= [] oneiag_slice1806 crp= 1 +--- 'expires': 1167127824 +1809 1 oneiah_slice1807 nodes= [4807, 4808, 4809, 1807, 1808, 1809] persons= [3812, 3813, 3814] +--- sas= [] oneiah_slice1807 crp= 1 +--- 'expires': 1167127825 +1810 1 oneiai_slice1808 nodes= [4808, 4809, 4810, 1808, 1809, 1810] persons= [3813, 3814, 3815] +--- sas= [] oneiai_slice1808 crp= 1 +--- 'expires': 1167127827 +1811 1 oneiaj_slice1809 nodes= [4809, 4810, 4811, 1809, 1810, 1811] persons= [3816, 3814, 3815] +--- sas= [] oneiaj_slice1809 crp= 1 +--- 'expires': 1167127829 +1812 1 oneiba_slice1810 nodes= [4810, 4811, 4812, 1810, 1811, 1812] persons= [3816, 3817, 3815] +--- sas= [] oneiba_slice1810 crp= 1 +--- 'expires': 1167127830 +1813 1 oneibb_slice1811 nodes= [4811, 4812, 4813, 1811, 1812, 1813] persons= [3816, 3817, 3818] +--- sas= [] oneibb_slice1811 crp= 1 +--- 'expires': 1167127832 +1814 1 oneibc_slice1812 nodes= [4812, 4813, 4814, 1812, 1813, 1814] persons= [3817, 3818, 3819] +--- sas= [] oneibc_slice1812 crp= 1 +--- 'expires': 1167127833 +1815 1 oneibd_slice1813 nodes= [4813, 4814, 4815, 1813, 1814, 1815] persons= [3818, 3819, 3820] +--- sas= [] oneibd_slice1813 crp= 1 +--- 'expires': 1167127835 +1816 1 oneibe_slice1814 nodes= [4814, 4815, 4816, 1814, 1815, 1816] persons= [3819, 3820, 3821] +--- sas= [] oneibe_slice1814 crp= 1 +--- 'expires': 1167127836 +1817 1 oneibf_slice1815 nodes= [4815, 4816, 4817, 1815, 1816, 1817] persons= [3820, 3821, 3822] +--- sas= [] oneibf_slice1815 crp= 1 +--- 'expires': 1167127837 +1818 1 oneibg_slice1816 nodes= [4816, 4817, 4818, 1816, 1817, 1818] persons= [3821, 3822, 3823] +--- sas= [] oneibg_slice1816 crp= 1 +--- 'expires': 1167127837 +1819 1 oneibh_slice1817 nodes= [4817, 4818, 4819, 1817, 1818, 1819] persons= [3824, 3822, 3823] +--- sas= [] oneibh_slice1817 crp= 1 +--- 'expires': 1167127838 +1820 1 oneibi_slice1818 nodes= [4818, 4819, 4820, 1818, 1819, 1820] persons= [3824, 3825, 3823] +--- sas= [] oneibi_slice1818 crp= 1 +--- 'expires': 1167127838 +1821 1 oneibj_slice1819 nodes= [4819, 4820, 4821, 1819, 1820, 1821] persons= [3824, 3825, 3826] +--- sas= [] oneibj_slice1819 crp= 1 +--- 'expires': 1167127839 +1822 1 oneica_slice1820 nodes= [4820, 4821, 4822, 1820, 1821, 1822] persons= [3825, 3826, 3827] +--- sas= [] oneica_slice1820 crp= 1 +--- 'expires': 1167127839 +1823 1 oneicb_slice1821 nodes= [4821, 4822, 4823, 1821, 1822, 1823] persons= [3826, 3827, 3828] +--- sas= [] oneicb_slice1821 crp= 1 +--- 'expires': 1167127840 +1824 1 oneicc_slice1822 nodes= [1824, 4822, 4823, 4824, 1822, 1823] persons= [3827, 3828, 3829] +--- sas= [] oneicc_slice1822 crp= 1 +--- 'expires': 1167127840 +1825 1 oneicd_slice1823 nodes= [1824, 1825, 4823, 4824, 4825, 1823] persons= [3828, 3829, 3830] +--- sas= [] oneicd_slice1823 crp= 1 +--- 'expires': 1167127841 +1826 1 oneice_slice1824 nodes= [1824, 1825, 1826, 4824, 4825, 4826] persons= [3829, 3830, 3831] +--- sas= [] oneice_slice1824 crp= 1 +--- 'expires': 1167127841 +1827 1 oneicf_slice1825 nodes= [1825, 1826, 1827, 4825, 4826, 4827] persons= [3832, 3830, 3831] +--- sas= [] oneicf_slice1825 crp= 1 +--- 'expires': 1167127842 +1828 1 oneicg_slice1826 nodes= [1826, 1827, 1828, 4826, 4827, 4828] persons= [3832, 3833, 3831] +--- sas= [] oneicg_slice1826 crp= 1 +--- 'expires': 1167127842 +1829 1 oneich_slice1827 nodes= [1827, 1828, 1829, 4827, 4828, 4829] persons= [3832, 3833, 3834] +--- sas= [] oneich_slice1827 crp= 1 +--- 'expires': 1167127843 +1830 1 oneici_slice1828 nodes= [1828, 1829, 1830, 4828, 4829, 4830] persons= [3833, 3834, 3835] +--- sas= [] oneici_slice1828 crp= 1 +--- 'expires': 1167127843 +1831 1 oneicj_slice1829 nodes= [1829, 1830, 1831, 4829, 4830, 4831] persons= [3834, 3835, 3836] +--- sas= [] oneicj_slice1829 crp= 1 +--- 'expires': 1167127844 +1832 1 oneida_slice1830 nodes= [4832, 1830, 1831, 1832, 4830, 4831] persons= [3835, 3836, 3837] +--- sas= [] oneida_slice1830 crp= 1 +--- 'expires': 1167127844 +1833 1 oneidb_slice1831 nodes= [4832, 4833, 1831, 1832, 1833, 4831] persons= [3836, 3837, 3838] +--- sas= [] oneidb_slice1831 crp= 1 +--- 'expires': 1167127845 +1834 1 oneidc_slice1832 nodes= [4832, 4833, 4834, 1832, 1833, 1834] persons= [3837, 3838, 3839] +--- sas= [] oneidc_slice1832 crp= 1 +--- 'expires': 1167127845 +1835 1 oneidd_slice1833 nodes= [4833, 4834, 4835, 1833, 1834, 1835] persons= [3840, 3838, 3839] +--- sas= [] oneidd_slice1833 crp= 1 +--- 'expires': 1167127846 +1836 1 oneide_slice1834 nodes= [4834, 4835, 4836, 1834, 1835, 1836] persons= [3840, 3841, 3839] +--- sas= [] oneide_slice1834 crp= 1 +--- 'expires': 1167127846 +1837 1 oneidf_slice1835 nodes= [4835, 4836, 4837, 1835, 1836, 1837] persons= [3840, 3841, 3842] +--- sas= [] oneidf_slice1835 crp= 1 +--- 'expires': 1167127847 +1838 1 oneidg_slice1836 nodes= [4836, 4837, 4838, 1836, 1837, 1838] persons= [3841, 3842, 3843] +--- sas= [] oneidg_slice1836 crp= 1 +--- 'expires': 1167127847 +1839 1 oneidh_slice1837 nodes= [4837, 4838, 4839, 1837, 1838, 1839] persons= [3842, 3843, 3844] +--- sas= [] oneidh_slice1837 crp= 1 +--- 'expires': 1167127848 +1840 1 oneidi_slice1838 nodes= [4838, 4839, 4840, 1838, 1839, 1840] persons= [3843, 3844, 3845] +--- sas= [] oneidi_slice1838 crp= 1 +--- 'expires': 1167127848 +1841 1 oneidj_slice1839 nodes= [4839, 4840, 4841, 1839, 1840, 1841] persons= [3844, 3845, 3846] +--- sas= [] oneidj_slice1839 crp= 1 +--- 'expires': 1167127849 +1842 1 oneiea_slice1840 nodes= [4840, 4841, 4842, 1840, 1841, 1842] persons= [3845, 3846, 3847] +--- sas= [] oneiea_slice1840 crp= 1 +--- 'expires': 1167127849 +1843 1 oneieb_slice1841 nodes= [4841, 4842, 4843, 1841, 1842, 1843] persons= [3848, 3846, 3847] +--- sas= [] oneieb_slice1841 crp= 1 +--- 'expires': 1167127850 +1844 1 oneiec_slice1842 nodes= [4842, 4843, 4844, 1842, 1843, 1844] persons= [3848, 3849, 3847] +--- sas= [] oneiec_slice1842 crp= 1 +--- 'expires': 1167127850 +1845 1 oneied_slice1843 nodes= [4843, 4844, 4845, 1843, 1844, 1845] persons= [3848, 3849, 3850] +--- sas= [] oneied_slice1843 crp= 1 +--- 'expires': 1167127851 +1846 1 oneiee_slice1844 nodes= [4844, 4845, 4846, 1844, 1845, 1846] persons= [3849, 3850, 3851] +--- sas= [] oneiee_slice1844 crp= 1 +--- 'expires': 1167127851 +1847 1 oneief_slice1845 nodes= [4845, 4846, 4847, 1845, 1846, 1847] persons= [3850, 3851, 3852] +--- sas= [] oneief_slice1845 crp= 1 +--- 'expires': 1167127852 +1848 1 oneieg_slice1846 nodes= [4846, 4847, 4848, 1846, 1847, 1848] persons= [3851, 3852, 3853] +--- sas= [] oneieg_slice1846 crp= 1 +--- 'expires': 1167127852 +1849 1 oneieh_slice1847 nodes= [4847, 4848, 4849, 1847, 1848, 1849] persons= [3852, 3853, 3854] +--- sas= [] oneieh_slice1847 crp= 1 +--- 'expires': 1167127853 +1850 1 oneiei_slice1848 nodes= [4848, 4849, 4850, 1848, 1849, 1850] persons= [3853, 3854, 3855] +--- sas= [] oneiei_slice1848 crp= 1 +--- 'expires': 1167127853 +1851 1 oneiej_slice1849 nodes= [4849, 4850, 4851, 1849, 1850, 1851] persons= [3856, 3854, 3855] +--- sas= [] oneiej_slice1849 crp= 1 +--- 'expires': 1167127854 +1852 1 oneifa_slice1850 nodes= [4850, 4851, 4852, 1850, 1851, 1852] persons= [3856, 3857, 3855] +--- sas= [] oneifa_slice1850 crp= 1 +--- 'expires': 1167127854 +1853 1 oneifb_slice1851 nodes= [4851, 4852, 4853, 1851, 1852, 1853] persons= [3856, 3857, 3858] +--- sas= [] oneifb_slice1851 crp= 1 +--- 'expires': 1167127855 +1854 1 oneifc_slice1852 nodes= [4852, 4853, 4854, 1852, 1853, 1854] persons= [3857, 3858, 3859] +--- sas= [] oneifc_slice1852 crp= 1 +--- 'expires': 1167127855 +1855 1 oneifd_slice1853 nodes= [4853, 4854, 4855, 1853, 1854, 1855] persons= [3858, 3859, 3860] +--- sas= [] oneifd_slice1853 crp= 1 +--- 'expires': 1167127856 +1856 1 oneife_slice1854 nodes= [1856, 4854, 4855, 4856, 1854, 1855] persons= [3859, 3860, 3861] +--- sas= [] oneife_slice1854 crp= 1 +--- 'expires': 1167127856 +1857 1 oneiff_slice1855 nodes= [1856, 1857, 4855, 4856, 4857, 1855] persons= [3860, 3861, 3862] +--- sas= [] oneiff_slice1855 crp= 1 +--- 'expires': 1167127857 +1858 1 oneifg_slice1856 nodes= [1856, 1857, 1858, 4856, 4857, 4858] persons= [3861, 3862, 3863] +--- sas= [] oneifg_slice1856 crp= 1 +--- 'expires': 1167127857 +1859 1 oneifh_slice1857 nodes= [1857, 1858, 1859, 4857, 4858, 4859] persons= [3864, 3862, 3863] +--- sas= [] oneifh_slice1857 crp= 1 +--- 'expires': 1167127858 +1860 1 oneifi_slice1858 nodes= [1858, 1859, 1860, 4858, 4859, 4860] persons= [3864, 3865, 3863] +--- sas= [] oneifi_slice1858 crp= 1 +--- 'expires': 1167127858 +1861 1 oneifj_slice1859 nodes= [1859, 1860, 1861, 4859, 4860, 4861] persons= [3864, 3865, 3866] +--- sas= [] oneifj_slice1859 crp= 1 +--- 'expires': 1167127859 +1862 1 oneiga_slice1860 nodes= [1860, 1861, 1862, 4860, 4861, 4862] persons= [3865, 3866, 3867] +--- sas= [] oneiga_slice1860 crp= 1 +--- 'expires': 1167127859 +1863 1 oneigb_slice1861 nodes= [1861, 1862, 1863, 4861, 4862, 4863] persons= [3866, 3867, 3868] +--- sas= [] oneigb_slice1861 crp= 1 +--- 'expires': 1167127860 +1864 1 oneigc_slice1862 nodes= [4864, 1862, 1863, 1864, 4862, 4863] persons= [3867, 3868, 3869] +--- sas= [] oneigc_slice1862 crp= 1 +--- 'expires': 1167127860 +1865 1 oneigd_slice1863 nodes= [4864, 4865, 1863, 1864, 1865, 4863] persons= [3868, 3869, 3870] +--- sas= [] oneigd_slice1863 crp= 1 +--- 'expires': 1167127861 +1866 1 oneige_slice1864 nodes= [4864, 4865, 4866, 1864, 1865, 1866] persons= [3869, 3870, 3871] +--- sas= [] oneige_slice1864 crp= 1 +--- 'expires': 1167127861 +1867 1 oneigf_slice1865 nodes= [4865, 4866, 4867, 1865, 1866, 1867] persons= [3872, 3870, 3871] +--- sas= [] oneigf_slice1865 crp= 1 +--- 'expires': 1167127862 +1868 1 oneigg_slice1866 nodes= [4866, 4867, 4868, 1866, 1867, 1868] persons= [3872, 3873, 3871] +--- sas= [] oneigg_slice1866 crp= 1 +--- 'expires': 1167127862 +1869 1 oneigh_slice1867 nodes= [4867, 4868, 4869, 1867, 1868, 1869] persons= [3872, 3873, 3874] +--- sas= [] oneigh_slice1867 crp= 1 +--- 'expires': 1167127863 +1870 1 oneigi_slice1868 nodes= [4868, 4869, 4870, 1868, 1869, 1870] persons= [3873, 3874, 3875] +--- sas= [] oneigi_slice1868 crp= 1 +--- 'expires': 1167127863 +1871 1 oneigj_slice1869 nodes= [4869, 4870, 4871, 1869, 1870, 1871] persons= [3874, 3875, 3876] +--- sas= [] oneigj_slice1869 crp= 1 +--- 'expires': 1167127864 +1872 1 oneiha_slice1870 nodes= [4870, 4871, 4872, 1870, 1871, 1872] persons= [3875, 3876, 3877] +--- sas= [] oneiha_slice1870 crp= 1 +--- 'expires': 1167127864 +1873 1 oneihb_slice1871 nodes= [4871, 4872, 4873, 1871, 1872, 1873] persons= [3876, 3877, 3878] +--- sas= [] oneihb_slice1871 crp= 1 +--- 'expires': 1167127865 +1874 1 oneihc_slice1872 nodes= [4872, 4873, 4874, 1872, 1873, 1874] persons= [3877, 3878, 3879] +--- sas= [] oneihc_slice1872 crp= 1 +--- 'expires': 1167127865 +1875 1 oneihd_slice1873 nodes= [4873, 4874, 4875, 1873, 1874, 1875] persons= [3880, 3878, 3879] +--- sas= [] oneihd_slice1873 crp= 1 +--- 'expires': 1167127866 +1876 1 oneihe_slice1874 nodes= [4874, 4875, 4876, 1874, 1875, 1876] persons= [3880, 3881, 3879] +--- sas= [] oneihe_slice1874 crp= 1 +--- 'expires': 1167127866 +1877 1 oneihf_slice1875 nodes= [4875, 4876, 4877, 1875, 1876, 1877] persons= [3880, 3881, 3882] +--- sas= [] oneihf_slice1875 crp= 1 +--- 'expires': 1167127867 +1878 1 oneihg_slice1876 nodes= [4876, 4877, 4878, 1876, 1877, 1878] persons= [3881, 3882, 3883] +--- sas= [] oneihg_slice1876 crp= 1 +--- 'expires': 1167127867 +1879 1 oneihh_slice1877 nodes= [4877, 4878, 4879, 1877, 1878, 1879] persons= [3882, 3883, 3884] +--- sas= [] oneihh_slice1877 crp= 1 +--- 'expires': 1167127868 +1880 1 oneihi_slice1878 nodes= [4878, 4879, 4880, 1878, 1879, 1880] persons= [3883, 3884, 3885] +--- sas= [] oneihi_slice1878 crp= 1 +--- 'expires': 1167127868 +1881 1 oneihj_slice1879 nodes= [4879, 4880, 4881, 1879, 1880, 1881] persons= [3884, 3885, 3886] +--- sas= [] oneihj_slice1879 crp= 1 +--- 'expires': 1167127869 +1882 1 oneiia_slice1880 nodes= [4880, 4881, 4882, 1880, 1881, 1882] persons= [3885, 3886, 3887] +--- sas= [] oneiia_slice1880 crp= 1 +--- 'expires': 1167127869 +1883 1 oneiib_slice1881 nodes= [4881, 4882, 4883, 1881, 1882, 1883] persons= [3888, 3886, 3887] +--- sas= [] oneiib_slice1881 crp= 1 +--- 'expires': 1167127870 +1884 1 oneiic_slice1882 nodes= [4882, 4883, 4884, 1882, 1883, 1884] persons= [3888, 3889, 3887] +--- sas= [] oneiic_slice1882 crp= 1 +--- 'expires': 1167127870 +1885 1 oneiid_slice1883 nodes= [4883, 4884, 4885, 1883, 1884, 1885] persons= [3888, 3889, 3890] +--- sas= [] oneiid_slice1883 crp= 1 +--- 'expires': 1167127871 +1886 1 oneiie_slice1884 nodes= [4884, 4885, 4886, 1884, 1885, 1886] persons= [3889, 3890, 3891] +--- sas= [] oneiie_slice1884 crp= 1 +--- 'expires': 1167127871 +1887 1 oneiif_slice1885 nodes= [4885, 4886, 4887, 1885, 1886, 1887] persons= [3890, 3891, 3892] +--- sas= [] oneiif_slice1885 crp= 1 +--- 'expires': 1167127872 +1888 1 oneiig_slice1886 nodes= [1888, 4886, 4887, 4888, 1886, 1887] persons= [3891, 3892, 3893] +--- sas= [] oneiig_slice1886 crp= 1 +--- 'expires': 1167127872 +1889 1 oneiih_slice1887 nodes= [1888, 1889, 4887, 4888, 4889, 1887] persons= [3892, 3893, 3894] +--- sas= [] oneiih_slice1887 crp= 1 +--- 'expires': 1167127873 +1890 1 oneiii_slice1888 nodes= [1888, 1889, 1890, 4888, 4889, 4890] persons= [3893, 3894, 3895] +--- sas= [] oneiii_slice1888 crp= 1 +--- 'expires': 1167127873 +1891 1 oneiij_slice1889 nodes= [1889, 1890, 1891, 4889, 4890, 4891] persons= [3896, 3894, 3895] +--- sas= [] oneiij_slice1889 crp= 1 +--- 'expires': 1167127874 +1892 1 oneija_slice1890 nodes= [1890, 1891, 1892, 4890, 4891, 4892] persons= [3896, 3897, 3895] +--- sas= [] oneija_slice1890 crp= 1 +--- 'expires': 1167127874 +1893 1 oneijb_slice1891 nodes= [1891, 1892, 1893, 4891, 4892, 4893] persons= [3896, 3897, 3898] +--- sas= [] oneijb_slice1891 crp= 1 +--- 'expires': 1167127875 +1894 1 oneijc_slice1892 nodes= [1892, 1893, 1894, 4892, 4893, 4894] persons= [3897, 3898, 3899] +--- sas= [] oneijc_slice1892 crp= 1 +--- 'expires': 1167127875 +1895 1 oneijd_slice1893 nodes= [1893, 1894, 1895, 4893, 4894, 4895] persons= [3898, 3899, 3900] +--- sas= [] oneijd_slice1893 crp= 1 +--- 'expires': 1167127876 +1896 1 oneije_slice1894 nodes= [4896, 1894, 1895, 1896, 4894, 4895] persons= [3899, 3900, 3901] +--- sas= [] oneije_slice1894 crp= 1 +--- 'expires': 1167127876 +1897 1 oneijf_slice1895 nodes= [4896, 4897, 1895, 1896, 1897, 4895] persons= [3900, 3901, 3902] +--- sas= [] oneijf_slice1895 crp= 1 +--- 'expires': 1167127877 +1898 1 oneijg_slice1896 nodes= [4896, 4897, 4898, 1896, 1897, 1898] persons= [3901, 3902, 3903] +--- sas= [] oneijg_slice1896 crp= 1 +--- 'expires': 1167127877 +1899 1 oneijh_slice1897 nodes= [4897, 4898, 4899, 1897, 1898, 1899] persons= [3904, 3902, 3903] +--- sas= [] oneijh_slice1897 crp= 1 +--- 'expires': 1167127878 +1900 1 oneiji_slice1898 nodes= [4898, 4899, 4900, 1898, 1899, 1900] persons= [3904, 3905, 3903] +--- sas= [] oneiji_slice1898 crp= 1 +--- 'expires': 1167127878 +1901 1 oneijj_slice1899 nodes= [4899, 4900, 4901, 1899, 1900, 1901] persons= [3904, 3905, 3906] +--- sas= [] oneijj_slice1899 crp= 1 +--- 'expires': 1167127879 +1902 1 onejaa_slice1900 nodes= [4900, 4901, 4902, 1900, 1901, 1902] persons= [3905, 3906, 3907] +--- sas= [] onejaa_slice1900 crp= 1 +--- 'expires': 1167127879 +1903 1 onejab_slice1901 nodes= [4901, 4902, 4903, 1901, 1902, 1903] persons= [3906, 3907, 3908] +--- sas= [] onejab_slice1901 crp= 1 +--- 'expires': 1167127880 +1904 1 onejac_slice1902 nodes= [4902, 4903, 4904, 1902, 1903, 1904] persons= [3907, 3908, 3909] +--- sas= [] onejac_slice1902 crp= 1 +--- 'expires': 1167127880 +1905 1 onejad_slice1903 nodes= [4903, 4904, 4905, 1903, 1904, 1905] persons= [3908, 3909, 3910] +--- sas= [] onejad_slice1903 crp= 1 +--- 'expires': 1167127881 +1906 1 onejae_slice1904 nodes= [4904, 4905, 4906, 1904, 1905, 1906] persons= [3909, 3910, 3911] +--- sas= [] onejae_slice1904 crp= 1 +--- 'expires': 1167127881 +1907 1 onejaf_slice1905 nodes= [4905, 4906, 4907, 1905, 1906, 1907] persons= [3912, 3910, 3911] +--- sas= [] onejaf_slice1905 crp= 1 +--- 'expires': 1167127882 +1908 1 onejag_slice1906 nodes= [4906, 4907, 4908, 1906, 1907, 1908] persons= [3912, 3913, 3911] +--- sas= [] onejag_slice1906 crp= 1 +--- 'expires': 1167127882 +1909 1 onejah_slice1907 nodes= [4907, 4908, 4909, 1907, 1908, 1909] persons= [3912, 3913, 3914] +--- sas= [] onejah_slice1907 crp= 1 +--- 'expires': 1167127883 +1910 1 onejai_slice1908 nodes= [4908, 4909, 4910, 1908, 1909, 1910] persons= [3913, 3914, 3915] +--- sas= [] onejai_slice1908 crp= 1 +--- 'expires': 1167127883 +1911 1 onejaj_slice1909 nodes= [4909, 4910, 4911, 1909, 1910, 1911] persons= [3914, 3915, 3916] +--- sas= [] onejaj_slice1909 crp= 1 +--- 'expires': 1167127884 +1912 1 onejba_slice1910 nodes= [4910, 4911, 4912, 1910, 1911, 1912] persons= [3915, 3916, 3917] +--- sas= [] onejba_slice1910 crp= 1 +--- 'expires': 1167127884 +1913 1 onejbb_slice1911 nodes= [4911, 4912, 4913, 1911, 1912, 1913] persons= [3916, 3917, 3918] +--- sas= [] onejbb_slice1911 crp= 1 +--- 'expires': 1167127885 +1914 1 onejbc_slice1912 nodes= [4912, 4913, 4914, 1912, 1913, 1914] persons= [3917, 3918, 3919] +--- sas= [] onejbc_slice1912 crp= 1 +--- 'expires': 1167127885 +1915 1 onejbd_slice1913 nodes= [4913, 4914, 4915, 1913, 1914, 1915] persons= [3920, 3918, 3919] +--- sas= [] onejbd_slice1913 crp= 1 +--- 'expires': 1167127886 +1916 1 onejbe_slice1914 nodes= [4914, 4915, 4916, 1914, 1915, 1916] persons= [3920, 3921, 3919] +--- sas= [] onejbe_slice1914 crp= 1 +--- 'expires': 1167127886 +1917 1 onejbf_slice1915 nodes= [4915, 4916, 4917, 1915, 1916, 1917] persons= [3920, 3921, 3922] +--- sas= [] onejbf_slice1915 crp= 1 +--- 'expires': 1167127887 +1918 1 onejbg_slice1916 nodes= [4916, 4917, 4918, 1916, 1917, 1918] persons= [3921, 3922, 3923] +--- sas= [] onejbg_slice1916 crp= 1 +--- 'expires': 1167127887 +1919 1 onejbh_slice1917 nodes= [4917, 4918, 4919, 1917, 1918, 1919] persons= [3922, 3923, 3924] +--- sas= [] onejbh_slice1917 crp= 1 +--- 'expires': 1167127888 +1920 1 onejbi_slice1918 nodes= [1920, 4918, 4919, 4920, 1918, 1919] persons= [3923, 3924, 3925] +--- sas= [] onejbi_slice1918 crp= 1 +--- 'expires': 1167127888 +1921 1 onejbj_slice1919 nodes= [1920, 1921, 4919, 4920, 4921, 1919] persons= [3924, 3925, 3926] +--- sas= [] onejbj_slice1919 crp= 1 +--- 'expires': 1167127889 +1922 1 onejca_slice1920 nodes= [1920, 1921, 1922, 4920, 4921, 4922] persons= [3925, 3926, 3927] +--- sas= [] onejca_slice1920 crp= 1 +--- 'expires': 1167127889 +1923 1 onejcb_slice1921 nodes= [1921, 1922, 1923, 4921, 4922, 4923] persons= [3928, 3926, 3927] +--- sas= [] onejcb_slice1921 crp= 1 +--- 'expires': 1167127890 +1924 1 onejcc_slice1922 nodes= [1922, 1923, 1924, 4922, 4923, 4924] persons= [3928, 3929, 3927] +--- sas= [] onejcc_slice1922 crp= 1 +--- 'expires': 1167127890 +1925 1 onejcd_slice1923 nodes= [1923, 1924, 1925, 4923, 4924, 4925] persons= [3928, 3929, 3930] +--- sas= [] onejcd_slice1923 crp= 1 +--- 'expires': 1167127891 +1926 1 onejce_slice1924 nodes= [1924, 1925, 1926, 4924, 4925, 4926] persons= [3929, 3930, 3931] +--- sas= [] onejce_slice1924 crp= 1 +--- 'expires': 1167127891 +1927 1 onejcf_slice1925 nodes= [1925, 1926, 1927, 4925, 4926, 4927] persons= [3930, 3931, 3932] +--- sas= [] onejcf_slice1925 crp= 1 +--- 'expires': 1167127892 +1928 1 onejcg_slice1926 nodes= [4928, 1926, 1927, 1928, 4926, 4927] persons= [3931, 3932, 3933] +--- sas= [] onejcg_slice1926 crp= 1 +--- 'expires': 1167127892 +1929 1 onejch_slice1927 nodes= [4928, 4929, 1927, 1928, 1929, 4927] persons= [3932, 3933, 3934] +--- sas= [] onejch_slice1927 crp= 1 +--- 'expires': 1167127893 +1930 1 onejci_slice1928 nodes= [4928, 4929, 4930, 1928, 1929, 1930] persons= [3933, 3934, 3935] +--- sas= [] onejci_slice1928 crp= 1 +--- 'expires': 1167127893 +1931 1 onejcj_slice1929 nodes= [4929, 4930, 4931, 1929, 1930, 1931] persons= [3936, 3934, 3935] +--- sas= [] onejcj_slice1929 crp= 1 +--- 'expires': 1167127894 +1932 1 onejda_slice1930 nodes= [4930, 4931, 4932, 1930, 1931, 1932] persons= [3936, 3937, 3935] +--- sas= [] onejda_slice1930 crp= 1 +--- 'expires': 1167127894 +1933 1 onejdb_slice1931 nodes= [4931, 4932, 4933, 1931, 1932, 1933] persons= [3936, 3937, 3938] +--- sas= [] onejdb_slice1931 crp= 1 +--- 'expires': 1167127895 +1934 1 onejdc_slice1932 nodes= [4932, 4933, 4934, 1932, 1933, 1934] persons= [3937, 3938, 3939] +--- sas= [] onejdc_slice1932 crp= 1 +--- 'expires': 1167127895 +1935 1 onejdd_slice1933 nodes= [4933, 4934, 4935, 1933, 1934, 1935] persons= [3938, 3939, 3940] +--- sas= [] onejdd_slice1933 crp= 1 +--- 'expires': 1167127896 +1936 1 onejde_slice1934 nodes= [4934, 4935, 4936, 1934, 1935, 1936] persons= [3939, 3940, 3941] +--- sas= [] onejde_slice1934 crp= 1 +--- 'expires': 1167127896 +1937 1 onejdf_slice1935 nodes= [4935, 4936, 4937, 1935, 1936, 1937] persons= [3940, 3941, 3942] +--- sas= [] onejdf_slice1935 crp= 1 +--- 'expires': 1167127897 +1938 1 onejdg_slice1936 nodes= [4936, 4937, 4938, 1936, 1937, 1938] persons= [3941, 3942, 3943] +--- sas= [] onejdg_slice1936 crp= 1 +--- 'expires': 1167127897 +1939 1 onejdh_slice1937 nodes= [4937, 4938, 4939, 1937, 1938, 1939] persons= [3944, 3942, 3943] +--- sas= [] onejdh_slice1937 crp= 1 +--- 'expires': 1167127898 +1940 1 onejdi_slice1938 nodes= [4938, 4939, 4940, 1938, 1939, 1940] persons= [3944, 3945, 3943] +--- sas= [] onejdi_slice1938 crp= 1 +--- 'expires': 1167127898 +1941 1 onejdj_slice1939 nodes= [4939, 4940, 4941, 1939, 1940, 1941] persons= [3944, 3945, 3946] +--- sas= [] onejdj_slice1939 crp= 1 +--- 'expires': 1167127899 +1942 1 onejea_slice1940 nodes= [4940, 4941, 4942, 1940, 1941, 1942] persons= [3945, 3946, 3947] +--- sas= [] onejea_slice1940 crp= 1 +--- 'expires': 1167127899 +1943 1 onejeb_slice1941 nodes= [4941, 4942, 4943, 1941, 1942, 1943] persons= [3946, 3947, 3948] +--- sas= [] onejeb_slice1941 crp= 1 +--- 'expires': 1167127900 +1944 1 onejec_slice1942 nodes= [4942, 4943, 4944, 1942, 1943, 1944] persons= [3947, 3948, 3949] +--- sas= [] onejec_slice1942 crp= 1 +--- 'expires': 1167127901 +1945 1 onejed_slice1943 nodes= [4943, 4944, 4945, 1943, 1944, 1945] persons= [3948, 3949, 3950] +--- sas= [] onejed_slice1943 crp= 1 +--- 'expires': 1167127901 +1946 1 onejee_slice1944 nodes= [4944, 4945, 4946, 1944, 1945, 1946] persons= [3949, 3950, 3951] +--- sas= [] onejee_slice1944 crp= 1 +--- 'expires': 1167127902 +1947 1 onejef_slice1945 nodes= [4945, 4946, 4947, 1945, 1946, 1947] persons= [3952, 3950, 3951] +--- sas= [] onejef_slice1945 crp= 1 +--- 'expires': 1167127902 +1948 1 onejeg_slice1946 nodes= [4946, 4947, 4948, 1946, 1947, 1948] persons= [3952, 3953, 3951] +--- sas= [] onejeg_slice1946 crp= 1 +--- 'expires': 1167127903 +1949 1 onejeh_slice1947 nodes= [4947, 4948, 4949, 1947, 1948, 1949] persons= [3952, 3953, 3954] +--- sas= [] onejeh_slice1947 crp= 1 +--- 'expires': 1167127903 +1950 1 onejei_slice1948 nodes= [4948, 4949, 4950, 1948, 1949, 1950] persons= [3953, 3954, 3955] +--- sas= [] onejei_slice1948 crp= 1 +--- 'expires': 1167127904 +1951 1 onejej_slice1949 nodes= [4949, 4950, 4951, 1949, 1950, 1951] persons= [3954, 3955, 3956] +--- sas= [] onejej_slice1949 crp= 1 +--- 'expires': 1167127904 +1952 1 onejfa_slice1950 nodes= [1952, 4950, 4951, 4952, 1950, 1951] persons= [3955, 3956, 3957] +--- sas= [] onejfa_slice1950 crp= 1 +--- 'expires': 1167127905 +1953 1 onejfb_slice1951 nodes= [1952, 1953, 4951, 4952, 4953, 1951] persons= [3956, 3957, 3958] +--- sas= [] onejfb_slice1951 crp= 1 +--- 'expires': 1167127905 +1954 1 onejfc_slice1952 nodes= [1952, 1953, 1954, 4952, 4953, 4954] persons= [3957, 3958, 3959] +--- sas= [] onejfc_slice1952 crp= 1 +--- 'expires': 1167127906 +1955 1 onejfd_slice1953 nodes= [1953, 1954, 1955, 4953, 4954, 4955] persons= [3960, 3958, 3959] +--- sas= [] onejfd_slice1953 crp= 1 +--- 'expires': 1167127906 +1956 1 onejfe_slice1954 nodes= [1954, 1955, 1956, 4954, 4955, 4956] persons= [3960, 3961, 3959] +--- sas= [] onejfe_slice1954 crp= 1 +--- 'expires': 1167127907 +1957 1 onejff_slice1955 nodes= [1955, 1956, 1957, 4955, 4956, 4957] persons= [3960, 3961, 3962] +--- sas= [] onejff_slice1955 crp= 1 +--- 'expires': 1167127907 +1958 1 onejfg_slice1956 nodes= [1956, 1957, 1958, 4956, 4957, 4958] persons= [3961, 3962, 3963] +--- sas= [] onejfg_slice1956 crp= 1 +--- 'expires': 1167127908 +1959 1 onejfh_slice1957 nodes= [1957, 1958, 1959, 4957, 4958, 4959] persons= [3962, 3963, 3964] +--- sas= [] onejfh_slice1957 crp= 1 +--- 'expires': 1167127908 +1960 1 onejfi_slice1958 nodes= [4960, 1958, 1959, 1960, 4958, 4959] persons= [3963, 3964, 3965] +--- sas= [] onejfi_slice1958 crp= 1 +--- 'expires': 1167127909 +1961 1 onejfj_slice1959 nodes= [4960, 4961, 1959, 1960, 1961, 4959] persons= [3964, 3965, 3966] +--- sas= [] onejfj_slice1959 crp= 1 +--- 'expires': 1167127909 +1962 1 onejga_slice1960 nodes= [4960, 4961, 4962, 1960, 1961, 1962] persons= [3965, 3966, 3967] +--- sas= [] onejga_slice1960 crp= 1 +--- 'expires': 1167127910 +1963 1 onejgb_slice1961 nodes= [4961, 4962, 4963, 1961, 1962, 1963] persons= [3968, 3966, 3967] +--- sas= [] onejgb_slice1961 crp= 1 +--- 'expires': 1167127910 +1964 1 onejgc_slice1962 nodes= [4962, 4963, 4964, 1962, 1963, 1964] persons= [3968, 3969, 3967] +--- sas= [] onejgc_slice1962 crp= 1 +--- 'expires': 1167127911 +1965 1 onejgd_slice1963 nodes= [4963, 4964, 4965, 1963, 1964, 1965] persons= [3968, 3969, 3970] +--- sas= [] onejgd_slice1963 crp= 1 +--- 'expires': 1167127911 +1966 1 onejge_slice1964 nodes= [4964, 4965, 4966, 1964, 1965, 1966] persons= [3969, 3970, 3971] +--- sas= [] onejge_slice1964 crp= 1 +--- 'expires': 1167127912 +1967 1 onejgf_slice1965 nodes= [4965, 4966, 4967, 1965, 1966, 1967] persons= [3970, 3971, 3972] +--- sas= [] onejgf_slice1965 crp= 1 +--- 'expires': 1167127912 +1968 1 onejgg_slice1966 nodes= [4966, 4967, 4968, 1966, 1967, 1968] persons= [3971, 3972, 3973] +--- sas= [] onejgg_slice1966 crp= 1 +--- 'expires': 1167127913 +1969 1 onejgh_slice1967 nodes= [4967, 4968, 4969, 1967, 1968, 1969] persons= [3972, 3973, 3974] +--- sas= [] onejgh_slice1967 crp= 1 +--- 'expires': 1167127913 +1970 1 onejgi_slice1968 nodes= [4968, 4969, 4970, 1968, 1969, 1970] persons= [3973, 3974, 3975] +--- sas= [] onejgi_slice1968 crp= 1 +--- 'expires': 1167127914 +1971 1 onejgj_slice1969 nodes= [4969, 4970, 4971, 1969, 1970, 1971] persons= [3976, 3974, 3975] +--- sas= [] onejgj_slice1969 crp= 1 +--- 'expires': 1167127914 +1972 1 onejha_slice1970 nodes= [4970, 4971, 4972, 1970, 1971, 1972] persons= [3976, 3977, 3975] +--- sas= [] onejha_slice1970 crp= 1 +--- 'expires': 1167127915 +1973 1 onejhb_slice1971 nodes= [4971, 4972, 4973, 1971, 1972, 1973] persons= [3976, 3977, 3978] +--- sas= [] onejhb_slice1971 crp= 1 +--- 'expires': 1167127915 +1974 1 onejhc_slice1972 nodes= [4972, 4973, 4974, 1972, 1973, 1974] persons= [3977, 3978, 3979] +--- sas= [] onejhc_slice1972 crp= 1 +--- 'expires': 1167127916 +1975 1 onejhd_slice1973 nodes= [4973, 4974, 4975, 1973, 1974, 1975] persons= [3978, 3979, 3980] +--- sas= [] onejhd_slice1973 crp= 1 +--- 'expires': 1167127916 +1976 1 onejhe_slice1974 nodes= [4974, 4975, 4976, 1974, 1975, 1976] persons= [3979, 3980, 3981] +--- sas= [] onejhe_slice1974 crp= 1 +--- 'expires': 1167127917 +1977 1 onejhf_slice1975 nodes= [4975, 4976, 4977, 1975, 1976, 1977] persons= [3980, 3981, 3982] +--- sas= [] onejhf_slice1975 crp= 1 +--- 'expires': 1167127918 +1978 1 onejhg_slice1976 nodes= [4976, 4977, 4978, 1976, 1977, 1978] persons= [3981, 3982, 3983] +--- sas= [] onejhg_slice1976 crp= 1 +--- 'expires': 1167127918 +1979 1 onejhh_slice1977 nodes= [4977, 4978, 4979, 1977, 1978, 1979] persons= [3984, 3982, 3983] +--- sas= [] onejhh_slice1977 crp= 1 +--- 'expires': 1167127919 +1980 1 onejhi_slice1978 nodes= [4978, 4979, 4980, 1978, 1979, 1980] persons= [3984, 3985, 3983] +--- sas= [] onejhi_slice1978 crp= 1 +--- 'expires': 1167127919 +1981 1 onejhj_slice1979 nodes= [4979, 4980, 4981, 1979, 1980, 1981] persons= [3984, 3985, 3986] +--- sas= [] onejhj_slice1979 crp= 1 +--- 'expires': 1167127920 +1982 1 onejia_slice1980 nodes= [4980, 4981, 4982, 1980, 1981, 1982] persons= [3985, 3986, 3987] +--- sas= [] onejia_slice1980 crp= 1 +--- 'expires': 1167127920 +1983 1 onejib_slice1981 nodes= [4981, 4982, 4983, 1981, 1982, 1983] persons= [3986, 3987, 3988] +--- sas= [] onejib_slice1981 crp= 1 +--- 'expires': 1167127921 +1984 1 onejic_slice1982 nodes= [1984, 4982, 4983, 4984, 1982, 1983] persons= [3987, 3988, 3989] +--- sas= [] onejic_slice1982 crp= 1 +--- 'expires': 1167127921 +1985 1 onejid_slice1983 nodes= [1984, 1985, 4983, 4984, 4985, 1983] persons= [3988, 3989, 3990] +--- sas= [] onejid_slice1983 crp= 1 +--- 'expires': 1167127922 +1986 1 onejie_slice1984 nodes= [1984, 1985, 1986, 4984, 4985, 4986] persons= [3989, 3990, 3991] +--- sas= [] onejie_slice1984 crp= 1 +--- 'expires': 1167127922 +1987 1 onejif_slice1985 nodes= [1985, 1986, 1987, 4985, 4986, 4987] persons= [3992, 3990, 3991] +--- sas= [] onejif_slice1985 crp= 1 +--- 'expires': 1167127923 +1988 1 onejig_slice1986 nodes= [1986, 1987, 1988, 4986, 4987, 4988] persons= [3992, 3993, 3991] +--- sas= [] onejig_slice1986 crp= 1 +--- 'expires': 1167127923 +1989 1 onejih_slice1987 nodes= [1987, 1988, 1989, 4987, 4988, 4989] persons= [3992, 3993, 3994] +--- sas= [] onejih_slice1987 crp= 1 +--- 'expires': 1167127924 +1990 1 onejii_slice1988 nodes= [1988, 1989, 1990, 4988, 4989, 4990] persons= [3993, 3994, 3995] +--- sas= [] onejii_slice1988 crp= 1 +--- 'expires': 1167127924 +1991 1 onejij_slice1989 nodes= [1989, 1990, 1991, 4989, 4990, 4991] persons= [3994, 3995, 3996] +--- sas= [] onejij_slice1989 crp= 1 +--- 'expires': 1167127925 +1992 1 onejja_slice1990 nodes= [4992, 1990, 1991, 1992, 4990, 4991] persons= [3995, 3996, 3997] +--- sas= [] onejja_slice1990 crp= 1 +--- 'expires': 1167127925 +1993 1 onejjb_slice1991 nodes= [4992, 4993, 1991, 1992, 1993, 4991] persons= [3996, 3997, 3998] +--- sas= [] onejjb_slice1991 crp= 1 +--- 'expires': 1167127926 +1994 1 onejjc_slice1992 nodes= [4992, 4993, 4994, 1992, 1993, 1994] persons= [3997, 3998, 3999] +--- sas= [] onejjc_slice1992 crp= 1 +--- 'expires': 1167127926 +1995 1 onejjd_slice1993 nodes= [4993, 4994, 4995, 1993, 1994, 1995] persons= [4000, 3998, 3999] +--- sas= [] onejjd_slice1993 crp= 1 +--- 'expires': 1167127927 +1996 1 onejje_slice1994 nodes= [4994, 4995, 4996, 1994, 1995, 1996] persons= [4000, 4001, 3999] +--- sas= [] onejje_slice1994 crp= 1 +--- 'expires': 1167127927 +1997 1 onejjf_slice1995 nodes= [4995, 4996, 4997, 1995, 1996, 1997] persons= [4000, 4001, 4002] +--- sas= [] onejjf_slice1995 crp= 1 +--- 'expires': 1167127928 +1998 1 onejjg_slice1996 nodes= [4996, 4997, 4998, 1996, 1997, 1998] persons= [4001, 4002, 4003] +--- sas= [] onejjg_slice1996 crp= 1 +--- 'expires': 1167127928 +1999 1 onejjh_slice1997 nodes= [4997, 4998, 4999, 1997, 1998, 1999] persons= [4002, 4003, 4004] +--- sas= [] onejjh_slice1997 crp= 1 +--- 'expires': 1167127929 +2000 1 onejji_slice1998 nodes= [4998, 4999, 5000, 1998, 1999, 2000] persons= [4003, 4004, 4005] +--- sas= [] onejji_slice1998 crp= 1 +--- 'expires': 1167127929 +2001 1 onejjj_slice1999 nodes= [4999, 5000, 5001, 1999, 2000, 2001] persons= [4004, 4005, 2006] +--- sas= [] onejjj_slice1999 crp= 1 +--- 'expires': 1167127930 +2002 1 onebaaa_slice2000 nodes= [5000, 5001, 5002, 2000, 2001, 2002] persons= [4005, 2006, 2007] +--- sas= [] onebaaa_slice2000 crp= 1 +--- 'expires': 1167127931 +02: Slice Attribute Types +1 None type 20 Type of slice (e.g. vserver) +2 None system 10 Is a default system slice (1) or not (0 or unset) +3 None enabled 10 Slice enabled (1 or unset) or suspended (0) +4 None vref 30 Reference image +5 None initscript 10 Slice initialization script +6 None cpu_min 10 Minimum CPU share (ms/s) +7 None cpu_share 10 Number of CPU shares +8 None net_min 10 Minimum bandwidth (bps) +9 None net_max 10 Maximum bandwidth (bps) +10 None net_avg 10 Average bandwidth (bps) +11 None net_share 10 Number of bandwidth shares +12 None net2_min 10 Minimum bandwidth over routes exempt from node bandwidth limits (bps) +13 None net2_max 10 Maximum bandwidth over routes exempt from node bandwidth limits (bps) +14 None net2_avg 10 Average bandwidth over routes exempt from node bandwidth limits (bps) +15 None net2_share 10 Number of bandwidth shares over routes exempt from node bandwidth limits +16 None disk_max 10 Disk quota (1k disk blocks) +17 None proper_op 10 Proper operation (e.g. bind_socket) +18 None plc_slice_type 20 Type of slice rspec to be created +19 None plc_agent_version 10 Version of PLC agent (slice creation service) software to be deployed +20 None plc_ticket_pubkey 10 Public key used to verify PLC-signed tickets +21 None sat_2 10 custom sat on plc2 +22 1 sat_1 10 custom sat on plc1 +02: Slice Attributes +1 None system AT_id: 2 +--- v= 1 sl= 1 n= None +2 None vref AT_id: 4 +--- v= planetflow sl= 1 n= None +3 None proper_op AT_id: 17 +--- v= open file=/etc/passwd, flags=r sl= 1 n= None +4 None proper_op AT_id: 17 +--- v= create_socket sl= 1 n= None +5 None proper_op AT_id: 17 +--- v= bind_socket sl= 1 n= None ++++ 2407.69 seconds ellapsed (70.25) +02: Gathering all slivers ++++ 3118.88 seconds ellapsed (711.19) +02: SLIVERS for first 3 nodes +02: SLIVERS for : hostname n2-001.plc2.org +02: 31 config files +02: SLIVER on hostname n2-001.plc2.org, s= thtwo_netflow +02: KEYS[] +02: ATTRIBUTES[ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + {'name': 'proper_op', 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}] +02: SLIVER on hostname n2-001.plc2.org, s= oneb_slice1 +02: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user1-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}] +02: ATTRIBUTES[] +02: SLIVERS for : hostname n2-002.plc2.org +02: 31 config files +02: SLIVER on hostname n2-002.plc2.org, s= thtwo_netflow +02: KEYS[] +02: ATTRIBUTES[ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + {'name': 'proper_op', 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}] +02: SLIVER on hostname n2-002.plc2.org, s= oneb_slice1 +02: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user1-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}] +02: ATTRIBUTES[] +02: SLIVER on hostname n2-002.plc2.org, s= onec_slice2 +02: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user4-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}] +02: ATTRIBUTES[] +02: SLIVERS for : hostname n2-003.plc2.org +02: 31 config files +02: SLIVER on hostname n2-003.plc2.org, s= thtwo_netflow +02: KEYS[] +02: ATTRIBUTES[ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + {'name': 'proper_op', 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}] +02: SLIVER on hostname n2-003.plc2.org, s= oneb_slice1 +02: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user1-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}] +02: ATTRIBUTES[] +02: SLIVER on hostname n2-003.plc2.org, s= onec_slice2 +02: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user4-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user2-key1'}] +02: ATTRIBUTES[] +02: SLIVER on hostname n2-003.plc2.org, s= oned_slice3 +02: KEYS[ {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user3-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user4-key1'}, + {'key_type': 'ssh', 'key': 'ssh-rsa 11key4plc11 user5-key1'}] +02: ATTRIBUTES[] +02:============================== END DUMP ++++ 3122.84 seconds ellapsed (3.96) +==================== ('END',) ++++ 3122.84 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-m.-1.populate.ref b/trunk/tests/testpeers.-m.-1.populate.ref new file mode 100644 index 0000000..2be08fd --- /dev/null +++ b/trunk/tests/testpeers.-m.-1.populate.ref @@ -0,0 +1,59 @@ +options {'local_peer': 1, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'mini'} args ['populate'] +1 sites, 1 persons, 1 nodes & 1 slices +1 keys/person, 1 nodes/slice & 1 persons/slice +fast_flag True +Running locally on index 1 +funcname populate +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +==================== ('INIT',) ++++ timer start +==================== s[1] +show_config obsoleted +==================== s[2] +show_config obsoleted +==================== +01:== created peer admin account 3, peer1@planet-lab.org - peer +Dummy method GetPersons on remote peer 2 skipped +Dummy method AddPerson on remote peer 2 skipped +01:== enabled+admin on account 3:peer1@planet-lab.org +Dummy method AdmSetPersonEnabled on remote peer 2 skipped ++++ timer start +Trying to locate keys for peer on plc[1] in gpg_plc2.pub and api_plc2.crt +01:Created peer 1 +Dummy method GetPeers on remote peer 2 skipped +Trying to locate keys for peer on plc[2] in gpg_plc1.pub and api_plc1.crt +Dummy method AddPeer on remote peer 2 skipped +02:Created peer 0 ++++ 0.35 seconds ellapsed (0.35) +01:== Created site 2 with max_slices=1 +Dummy method GetSites on remote peer 2 skipped +Dummy method AddSite on remote peer 2 skipped ++++ 0.45 seconds ellapsed (0.10) +01:== created user account 4, user-1@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org +Dummy method GetPersons on remote peer 2 skipped +Dummy method AddPerson on remote peer 2 skipped ++++ 0.55 seconds ellapsed (0.09) +01:== Added node 1 n1-001.plc1.org +Dummy method GetNodes on remote peer 2 skipped +Dummy method AddNode on remote peer 2 skipped ++++ 0.62 seconds ellapsed (0.07) +01:== created slice 2 - max nodes=1 +01:== Attached person user-1@plc.org to slice oneone_slice1 ++++ 0.72 seconds ellapsed (0.10) +01:== added in slice oneone_slice1 local ['n1-001.plc1.org'] ++++ 0.76 seconds ellapsed (0.04) +01:== created SliceAttributeType = 23 +Dummy method GetSliceAttributeTypes on remote peer 2 skipped +Dummy method AddSliceAttributeType on remote peer 2 skipped ++++ 0.79 seconds ellapsed (0.03) +slice_name oneone_slice1 sat_name sat_1 +01:== created SliceAttribute = 6 On slice oneone_slice1 and node None +01:== created SliceAttribute = 7 On slice oneone_slice1 and node n1-001.plc1.org +slice_name oneone_slice1 sat_name vref +01:== created SliceAttribute = 8 On slice oneone_slice1 and node None +01:== created SliceAttribute = 9 On slice oneone_slice1 and node n1-001.plc1.org ++++ 0.94 seconds ellapsed (0.15) +==================== ('END',) ++++ 0.94 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-m.-2.populate.ref b/trunk/tests/testpeers.-m.-2.populate.ref new file mode 100644 index 0000000..97d2e22 --- /dev/null +++ b/trunk/tests/testpeers.-m.-2.populate.ref @@ -0,0 +1,57 @@ +options {'local_peer': 2, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'mini'} args ['populate'] +1 sites, 1 persons, 1 nodes & 1 slices +1 keys/person, 1 nodes/slice & 1 persons/slice +fast_flag True +Running locally on index 2 +funcname populate +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +==================== ('INIT',) ++++ timer start +==================== s[1] +show_config obsoleted +==================== s[2] +show_config obsoleted +==================== +Dummy method GetPersons on remote peer 1 skipped +Dummy method AddPerson on remote peer 1 skipped +02:== created peer admin account 3, peer2@planet-lab.org - peer +Dummy method AdmSetPersonEnabled on remote peer 1 skipped +02:== enabled+admin on account 3:peer2@planet-lab.org ++++ timer start +Dummy method GetPeers on remote peer 1 skipped +Trying to locate keys for peer on plc[1] in gpg_plc2.pub and api_plc2.crt +Dummy method AddPeer on remote peer 1 skipped +01:Created peer 0 +Trying to locate keys for peer on plc[2] in gpg_plc1.pub and api_plc1.crt +02:Created peer 1 ++++ 0.36 seconds ellapsed (0.36) +Dummy method GetSites on remote peer 1 skipped +Dummy method AddSite on remote peer 1 skipped +02:== Created site 2 with max_slices=1 ++++ 0.46 seconds ellapsed (0.10) +Dummy method GetPersons on remote peer 1 skipped +Dummy method AddPerson on remote peer 1 skipped +02:== created user account 4, user-1@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org ++++ 0.55 seconds ellapsed (0.09) +Dummy method GetNodes on remote peer 1 skipped +Dummy method AddNode on remote peer 1 skipped +02:== Added node 1 n2-001.plc2.org ++++ 0.62 seconds ellapsed (0.07) +Dummy method GetSlices on remote peer 1 skipped +Dummy method AddSlice on remote peer 1 skipped ++++ 0.62 seconds ellapsed (0.00) +Dummy method AddSliceToNodes on remote peer 1 skipped ++++ 0.62 seconds ellapsed (0.00) +Dummy method GetSliceAttributeTypes on remote peer 1 skipped +Dummy method AddSliceAttributeType on remote peer 1 skipped +02:== created SliceAttributeType = 23 ++++ 0.66 seconds ellapsed (0.03) +Dummy method GetSliceAttributes on remote peer 1 skipped +slice_name oneone_slice1 sat_name sat_1 +Dummy method AddSliceAttribute on remote peer 1 skipped +slice_name oneone_slice1 sat_name vref ++++ 0.66 seconds ellapsed (0.00) +==================== ('END',) ++++ 0.66 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-m.populate_end.ref b/trunk/tests/testpeers.-m.populate_end.ref new file mode 100644 index 0000000..1b61239 --- /dev/null +++ b/trunk/tests/testpeers.-m.populate_end.ref @@ -0,0 +1,161 @@ +options {'local_peer': None, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'mini'} args ['populate_end'] +1 sites, 1 persons, 1 nodes & 1 slices +1 keys/person, 1 nodes/slice & 1 persons/slice +fast_flag True +funcname populate_end +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +initializing s[1]=>https://caicol.inria.fr:443/PLCAPI/ user= peer1@planet-lab.org +initializing s[2]=>https://jamaica.inria.fr:443/PLCAPI/ user= peer2@planet-lab.org +=== refresh Peer 1 for publishing foreign nodes from 2 ++++ 0.23 seconds ellapsed (0.23) +01:== Refreshing peer ++++ ellapsed: { keys 0.0208368301392 local_nodes 0.00778102874756 nodes 0.0430390834808 peer_db 0.0725510120392 persons 0.0409860610962 site 0.0512850284576 slices 0.0167291164398 transport 0.879606962204 } ++++ 3.67 seconds ellapsed (3.44) ++++ 3.67 seconds ellapsed (0.00) +01:== added in slice oneone_slice1 foreign ['n2-001.plc2.org'] ++++ 4.36 seconds ellapsed (0.70) +=== refresh populate: refresh all ++++ 4.37 seconds ellapsed (0.00) +01:== Refreshing peer ++++ ellapsed: { keys 0.00697612762451 local_nodes 0.00733304023743 nodes 0.0202178955078 peer_db 0.0714790821075 persons 0.0111219882965 site 0.0236639976501 slices 0.00864315032959 transport 0.87544798851 } ++++ 7.07 seconds ellapsed (2.71) +02:== Refreshing peer ++++ ellapsed: { keys 0.0203778743744 local_nodes 0.00704407691956 nodes 0.0458459854126 peer_db 0.0725910663605 persons 0.0411431789398 site 0.0511009693146 slices 0.0439729690552 transport 0.888474941254 } ++++ 10.54 seconds ellapsed (3.46) ++++ 10.54 seconds ellapsed (0.00) +=== refresh empty refresh ++++ 10.54 seconds ellapsed (0.00) +01:== Refreshing peer ++++ ellapsed: { keys 0.00701522827148 local_nodes 0.00736999511719 nodes 0.0202560424805 peer_db 0.0723881721497 persons 0.0111818313599 site 0.0234751701355 slices 0.00855803489685 transport 0.900480747223 } ++++ 12.76 seconds ellapsed (2.22) +02:== Refreshing peer ++++ ellapsed: { keys 0.00629615783691 local_nodes 0.00665903091431 nodes 0.0196490287781 peer_db 0.0748579502106 persons 0.0105831623077 site 0.0236220359802 slices 0.0118470191956 transport 0.381079912186 } ++++ 15.66 seconds ellapsed (2.90) +01:============================== DUMPING +01: SITES +1 None plc1 FederationTestPlc1 Central [] +2 None oneone FederationTestPlc1 [1] +3 1 plc2 FederationTestPlc2 Central [] +4 1 twoone FederationTestPlc2 [2] +01: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 1 ssh-rsa somekey4plctestbed user1-key1 +01: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc1.inria.fr keys: [] sites: [1] +3 None peer1@planet-lab.org keys: [] sites: [] +4 None user-1@plc.org keys: [1] sites: [] +5 1 peer2@planet-lab.org keys: [] sites: [] +6 1 user-1@plc.org keys: [2] sites: [] +01: NODES +1 None n1-001.plc1.org sls= [2] site= 2 +2 1 n2-001.plc2.org sls= [2] site= 4 +01: SLICES +name: plc1_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183552191 +name: oneone_slice1 id: 02 peer: None nodes= [1, 2] persons= [4] +--- sa_ids= [6, 7, 8, 9] creator: 1 +--- 'expires': 1183552272 +01: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_1 < custom sat on plc1 > +01: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 09 sat_id: 04 sl=02 v= predefined sat/node1 n= 1 +name: vref sa_id: 08 sat_id: 04 sl=02 v= predefined sat/all nodes n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None +name: sat_1 sa_id: 07 sat_id: 23 sl=02 v= custom sat/node1 n= 1 +name: sat_1 sa_id: 06 sat_id: 23 sl=02 v= custom sat/all nodes n= None ++++ 16.80 seconds ellapsed (1.14) +01: SLIVERS for first 1 nodes +WARNING - GetSlivers needs fix +01:============================== END DUMP +02:============================== DUMPING +02: SITES +1 None plc2 FederationTestPlc2 Central [] +2 None twoone FederationTestPlc2 [1] +3 1 plc1 FederationTestPlc1 Central [] +4 1 oneone FederationTestPlc1 [2] +02: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 1 ssh-rsa somekey4plctestbed user1-key1 +02: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc2.inria.fr keys: [] sites: [1] +3 None peer2@planet-lab.org keys: [] sites: [] +4 None user-1@plc.org keys: [1] sites: [] +5 1 peer1@planet-lab.org keys: [] sites: [] +6 1 user-1@plc.org keys: [2] sites: [] +02: NODES +1 None n2-001.plc2.org sls= [2] site= 2 +2 1 n1-001.plc1.org sls= [2] site= 4 +02: SLICES +name: plc2_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183552212 +name: oneone_slice1 id: 02 peer: 1 nodes= [1, 2] persons= [6] +--- sa_ids= [] creator: None +--- 'expires': 1183552272 +02: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_2 < custom sat on plc2 > +02: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None ++++ 18.43 seconds ellapsed (1.63) +02: SLIVERS for first 1 nodes +WARNING - GetSlivers needs fix +02:============================== END DUMP ++++ 18.43 seconds ellapsed (0.00) +==================== ('END',) ++++ 18.43 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-m.test_all.ref b/trunk/tests/testpeers.-m.test_all.ref new file mode 100644 index 0000000..08db5bb --- /dev/null +++ b/trunk/tests/testpeers.-m.test_all.ref @@ -0,0 +1,437 @@ +options {'local_peer': None, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'mini'} args ['test_all'] +1 sites, 1 persons, 1 nodes & 1 slices +1 keys/person, 1 nodes/slice & 1 persons/slice +fast_flag True +funcname test_all +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] +==================== ('INIT',) ++++ timer start +initializing s[1]=>https://caicol.inria.fr:443/PLCAPI/ user= root@plc1.inria.fr +initializing s[2]=>https://jamaica.inria.fr:443/PLCAPI/ user= root@plc2.inria.fr +==================== s[1] +show_config obsoleted +==================== s[2] +show_config obsoleted +==================== +01:== created peer admin account 3, peer1@planet-lab.org - peer +02:== created peer admin account 3, peer2@planet-lab.org - peer +01:== enabled+admin on account 3:peer1@planet-lab.org +02:== enabled+admin on account 3:peer2@planet-lab.org ++++ timer start +initializing s[1]=>https://caicol.inria.fr:443/PLCAPI/ user= peer1@planet-lab.org +initializing s[2]=>https://jamaica.inria.fr:443/PLCAPI/ user= peer2@planet-lab.org +Trying to locate keys for peer on plc[1] in gpg_plc2.pub and api_plc2.crt +01:Created peer 1 +Trying to locate keys for peer on plc[2] in gpg_plc1.pub and api_plc1.crt +02:Created peer 1 ++++ 1.11 seconds ellapsed (1.11) +01:== Created site 2 with max_slices=1 +02:== Created site 2 with max_slices=1 +=== refresh after site creation ++++ 2.24 seconds ellapsed (1.14) +01:== Refreshing peer ++++ ellapsed: { keys 0.0038001537323 local_nodes 0.00645995140076 nodes 0.0165648460388 peer_db 0.0730428695679 persons 0.0198659896851 site 0.0508999824524 slices 0.0088050365448 transport 0.332457065582 } ++++ 4.06 seconds ellapsed (1.82) +02:== Refreshing peer ++++ ellapsed: { keys 0.00386905670166 local_nodes 0.00602221488953 nodes 0.0169570446014 peer_db 0.0704660415649 persons 0.025032043457 site 0.0491960048676 slices 0.00849199295044 transport 0.322968959808 } ++++ 5.86 seconds ellapsed (1.80) ++++ 5.86 seconds ellapsed (0.00) +=== refresh before persons&keys creation ++++ 6.16 seconds ellapsed (0.30) +01:== Refreshing peer ++++ ellapsed: { keys 0.00431799888611 local_nodes 0.00593590736389 nodes 0.0162229537964 peer_db 0.0734379291534 persons 0.00807285308838 site 0.0193409919739 slices 0.00921893119812 transport 0.321912050247 } ++++ 7.76 seconds ellapsed (1.60) +02:== Refreshing peer ++++ ellapsed: { keys 0.0039849281311 local_nodes 0.00554800033569 nodes 0.0161969661713 peer_db 0.0727128982544 persons 0.00770306587219 site 0.0193841457367 slices 0.00873184204102 transport 0.306769132614 } ++++ 9.35 seconds ellapsed (1.59) +01: Checking keys: got 0 local (e=0) & 0 foreign (e=0) +02: Checking keys: got 0 local (e=0) & 0 foreign (e=0) +01: Checking persons: got 3 local (e=3) & 1 foreign (e=1) +02: Checking persons: got 3 local (e=3) & 1 foreign (e=1) +==================== ('Creating persons&keys',) +01:== created user account 5, user-1@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org +02:== created user account 5, user-1@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org +01: Checking keys: got 1 local (e=1) & 0 foreign (e=0) +02: Checking keys: got 1 local (e=1) & 0 foreign (e=0) +01: Checking persons: got 4 local (e=4) & 1 foreign (e=1) +02: Checking persons: got 4 local (e=4) & 1 foreign (e=1) +=== refresh after persons&keys creation ++++ 11.64 seconds ellapsed (2.29) +01:== Refreshing peer ++++ ellapsed: { keys 0.0234961509705 local_nodes 0.0105268955231 nodes 0.0203311443329 peer_db 0.0715289115906 persons 0.0292110443115 site 0.0190658569336 slices 0.00835180282593 transport 0.316730976105 } ++++ 13.29 seconds ellapsed (1.65) +02:== Refreshing peer ++++ ellapsed: { keys 0.0290341377258 local_nodes 0.00588989257812 nodes 0.0160729885101 peer_db 0.0720119476318 persons 0.0320210456848 site 0.0194230079651 slices 0.00832509994507 transport 0.315702199936 } ++++ 14.91 seconds ellapsed (1.62) +01: Checking keys: got 1 local (e=1) & 1 foreign (e=1) +02: Checking keys: got 1 local (e=1) & 1 foreign (e=1) +01: Checking persons: got 4 local (e=4) & 2 foreign (e=2) +02: Checking persons: got 4 local (e=4) & 2 foreign (e=2) ++++ 15.54 seconds ellapsed (0.63) +==================== ('RESETTING NODES',) +01:== Cleaning all nodes +02:== Cleaning all nodes +=== refresh cleaned nodes ++++ 15.87 seconds ellapsed (0.33) +01:== Refreshing peer ++++ ellapsed: { keys 0.00443601608276 local_nodes 0.00593090057373 nodes 0.0157189369202 peer_db 0.0721609592438 persons 0.0130760669708 site 0.0235221385956 slices 0.00863313674927 transport 0.32453918457 } ++++ 17.52 seconds ellapsed (1.65) +02:== Refreshing peer ++++ ellapsed: { keys 0.006511926651 local_nodes 0.00657796859741 nodes 0.0164999961853 peer_db 0.0736320018768 persons 0.0117130279541 site 0.0236840248108 slices 0.00867795944214 transport 0.316795110703 } ++++ 19.16 seconds ellapsed (1.64) +01: Checking nodes: got 0 local (e=0) & 0 foreign (e=0) +02: Checking nodes: got 0 local (e=0) & 0 foreign (e=0) +==================== ('CREATING NODES',) +01:== Added node 1 n1-001.plc1.org +02:== Added node 1 n2-001.plc2.org +01: Checking nodes: got 1 local (e=1) & 0 foreign (e=0) +02: Checking nodes: got 1 local (e=1) & 0 foreign (e=0) +=== refresh after node creation ++++ 20.59 seconds ellapsed (1.44) +01:== Refreshing peer ++++ ellapsed: { keys 0.00726294517517 local_nodes 0.00728988647461 nodes 0.0482001304626 peer_db 0.07448387146 persons 0.0103290081024 site 0.0238211154938 slices 0.00867295265198 transport 0.339636087418 } ++++ 22.26 seconds ellapsed (1.67) +02:== Refreshing peer ++++ ellapsed: { keys 0.00730514526367 local_nodes 0.00690698623657 nodes 0.0464520454407 peer_db 0.0739932060242 persons 0.00910305976868 site 0.0260801315308 slices 0.00841307640076 transport 0.324549674988 } ++++ 23.90 seconds ellapsed (1.64) +01: Checking nodes: got 1 local (e=1) & 1 foreign (e=1) +02: Checking nodes: got 1 local (e=1) & 1 foreign (e=1) +02:== Deleted node 1, returns 1 +02: Checking nodes: got 0 local (e=0) & 1 foreign (e=1) +=== refresh after deletion on plc2 ++++ 24.80 seconds ellapsed (0.90) +01:== Refreshing peer ++++ ellapsed: { keys 0.00459384918213 local_nodes 0.00618600845337 nodes 0.0548779964447 peer_db 0.0725939273834 persons 0.0087308883667 site 0.0193519592285 slices 0.00713205337524 transport 0.321602106094 } ++++ 26.44 seconds ellapsed (1.64) +02:== Refreshing peer ++++ ellapsed: { keys 0.00454807281494 local_nodes 0.00633716583252 nodes 0.0176470279694 peer_db 0.0725169181824 persons 0.00868988037109 site 0.0192210674286 slices 0.00999689102173 transport 0.317940235138 } ++++ 28.09 seconds ellapsed (1.65) +01: Checking nodes: got 1 local (e=1) & 0 foreign (e=0) +02: Checking nodes: got 0 local (e=0) & 1 foreign (e=1) +==================== ('ADD on plc2 for different indexes',) +02:== Added node 3 n2-001.plc2.org +01: Checking nodes: got 1 local (e=1) & 0 foreign (e=0) +02: Checking nodes: got 1 local (e=1) & 1 foreign (e=1) +=== refresh after re-creation on plc2 ++++ 29.14 seconds ellapsed (1.05) +01:== Refreshing peer ++++ ellapsed: { keys 0.0046820640564 local_nodes 0.00679898262024 nodes 0.0361959934235 peer_db 0.0734241008759 persons 0.0088038444519 site 0.0188229084015 slices 0.0088210105896 transport 0.322027921677 } ++++ 30.81 seconds ellapsed (1.67) +02:== Refreshing peer ++++ ellapsed: { keys 0.00457215309143 local_nodes 0.00660705566406 nodes 0.0175521373749 peer_db 0.0737800598145 persons 0.00872206687927 site 0.0191171169281 slices 0.00901699066162 transport 0.323905944824 } ++++ 32.46 seconds ellapsed (1.65) +01: Checking nodes: got 1 local (e=1) & 1 foreign (e=1) +02: Checking nodes: got 1 local (e=1) & 1 foreign (e=1) ++++ 32.80 seconds ellapsed (0.34) +==================== ('RESETTING SLICES TEST',) +01:== Cleaning all nodes +01:==== Cleaning node 1 +02:== Cleaning all nodes +02:==== Cleaning node 3 +01:== Added node 4 n1-001.plc1.org +02:== Added node 4 n2-001.plc2.org +01:== Cleaning all slices +02:== Cleaning all slices +=== refresh After slices init ++++ 34.65 seconds ellapsed (1.86) +01:== Refreshing peer ++++ ellapsed: { keys 0.00450301170349 local_nodes 0.00647306442261 nodes 0.0622019767761 peer_db 0.0748679637909 persons 0.00879502296448 site 0.0192511081696 slices 0.00795698165894 transport 0.323952913284 } ++++ 36.29 seconds ellapsed (1.64) +02:== Refreshing peer ++++ ellapsed: { keys 0.0045371055603 local_nodes 0.00651907920837 nodes 0.0640370845795 peer_db 0.0733089447021 persons 0.00870203971863 site 0.0192790031433 slices 0.00765705108643 transport 0.322642087936 } ++++ 37.91 seconds ellapsed (1.62) +==================== ('CREATING SLICES on plc1',) +01:== created slice 2 - max nodes=1 +01:== Attached person user-1@plc.org to slice oneone_slice1 +01: Checking slices: got 2 local (e=2) & 0 foreign (e=0) +02: Checking slices: got 1 local (e=1) & 0 foreign (e=0) +=== refresh after slice created on plc1 ++++ 39.07 seconds ellapsed (1.15) +01:== Refreshing peer ++++ ellapsed: { keys 0.00460600852966 local_nodes 0.00738000869751 nodes 0.0173969268799 peer_db 0.0756890773773 persons 0.00878095626831 site 0.019326210022 slices 0.00891304016113 transport 0.326341867447 } ++++ 40.73 seconds ellapsed (1.66) +02:== Refreshing peer ++++ ellapsed: { keys 0.00508999824524 local_nodes 0.00707006454468 nodes 0.0185298919678 peer_db 0.07577085495 persons 0.00907492637634 site 0.0194971561432 slices 0.0462868213654 transport 0.327960014343 } ++++ 42.41 seconds ellapsed (1.68) +01: Checking slices: got 2 local (e=2) & 0 foreign (e=0) +02: Checking slices: got 1 local (e=1) & 1 foreign (e=1) +01: local slice oneone_slice1 (e=0) on nodes [] +02: foreign slice oneone_slice1 (e=0) on nodes [] +==================== ('ADDING LOCAL NODES IN SLICES',) +01:== added in slice oneone_slice1 local ['n1-001.plc1.org'] +01: local slice oneone_slice1 (e=1) on nodes [4] +[LOC:1] : n1-001.plc1.org +02: foreign slice oneone_slice1 (e=0) on nodes [] +=== refresh After local nodes were added on plc1 ++++ 44.55 seconds ellapsed (2.14) +01:== Refreshing peer ++++ ellapsed: { keys 0.00452089309692 local_nodes 0.00669598579407 nodes 0.0172870159149 peer_db 0.0735449790955 persons 0.0086498260498 site 0.0192210674286 slices 0.0090548992157 transport 0.327414035797 } ++++ 46.19 seconds ellapsed (1.64) +02:== Refreshing peer ++++ ellapsed: { keys 0.00501203536987 local_nodes 0.00737619400024 nodes 0.0181210041046 peer_db 0.0753741264343 persons 0.00912189483643 site 0.0198740959167 slices 0.0148589611053 transport 0.326575994492 } ++++ 47.78 seconds ellapsed (1.59) +01: local slice oneone_slice1 (e=1) on nodes [4] +[LOC:1] : n1-001.plc1.org +02: foreign slice oneone_slice1 (e=1) on nodes [5] +[FOR:1] : n1-001.plc1.org +==================== ('ADDING FOREIGN NODES IN SLICES',) +01:== added in slice oneone_slice1 foreign ['n2-001.plc2.org'] +01: local slice oneone_slice1 (e=2) on nodes [5, 4] +[LOC:1] : n1-001.plc1.org +[FOR:1] : n2-001.plc2.org +02: foreign slice oneone_slice1 (e=1) on nodes [5] +[FOR:1] : n1-001.plc1.org +=== refresh After foreign nodes were added in plc1 ++++ 49.29 seconds ellapsed (1.51) +01:== Refreshing peer ++++ ellapsed: { keys 0.00503015518188 local_nodes 0.00770211219788 nodes 0.0177919864655 peer_db 0.0740900039673 persons 0.00913286209106 site 0.0193819999695 slices 0.00882196426392 transport 0.328030109406 } ++++ 50.87 seconds ellapsed (1.59) +02:== Refreshing peer ++++ ellapsed: { keys 0.00501203536987 local_nodes 0.00771689414978 nodes 0.0179951190948 peer_db 0.0737829208374 persons 0.00910806655884 site 0.0195059776306 slices 0.0138790607452 transport 0.329298019409 } ++++ 52.48 seconds ellapsed (1.61) +01: local slice oneone_slice1 (e=2) on nodes [5, 4] +[LOC:1] : n1-001.plc1.org +[FOR:1] : n2-001.plc2.org +02: foreign slice oneone_slice1 (e=2) on nodes [4, 5] +[LOC:1] : n2-001.plc2.org +[FOR:1] : n1-001.plc1.org +01: 2 slivers (exp. 2) in GetSlivers for node n1-001.plc1.org +>>slivername = plc1_netflow +{ 'attributes': [ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + { 'name': 'proper_op', + 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}], + 'expires': 1183553992, + 'instantiation': 'plc-instantiated', + 'keys': [], + 'name': 'plc1_netflow', + 'slice_id': 1} +>>slivername = oneone_slice1 +{ 'attributes': [], + 'expires': 1183559059, + 'instantiation': 'plc-instantiated', + 'keys': [], + 'name': 'oneone_slice1', + 'slice_id': 2} +02: 2 slivers (exp. 2) in GetSlivers for node n2-001.plc2.org +>>slivername = plc2_netflow +{ 'attributes': [ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + { 'name': 'proper_op', + 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}], + 'expires': 1183554012, + 'instantiation': 'plc-instantiated', + 'keys': [], + 'name': 'plc2_netflow', + 'slice_id': 1} +>>slivername = oneone_slice1 +{ 'attributes': [], + 'expires': 1183559059, + 'instantiation': 'plc-instantiated', + 'keys': [], + 'name': 'oneone_slice1', + 'slice_id': 2} +==================== ('DELETING FOREIGN NODES FROM SLICES',) +01:== deleted in slice oneone_slice1 foreign ['n2-001.plc2.org'] +01: local slice oneone_slice1 (e=1) on nodes [4] +[LOC:1] : n1-001.plc1.org +02: foreign slice oneone_slice1 (e=2) on nodes [4, 5] +[LOC:1] : n2-001.plc2.org +[FOR:1] : n1-001.plc1.org +01: 2 slivers (exp. 2) in GetSlivers for node n1-001.plc1.org +>>slivername = plc1_netflow +{ 'attributes': [ {'name': 'system', 'value': '1'}, + {'name': 'vref', 'value': 'planetflow'}, + { 'name': 'proper_op', + 'value': 'open file=/etc/passwd, flags=r'}, + {'name': 'proper_op', 'value': 'create_socket'}, + {'name': 'proper_op', 'value': 'bind_socket'}], + 'expires': 1183553992, + 'instantiation': 'plc-instantiated', + 'keys': [], + 'name': 'plc1_netflow', + 'slice_id': 1} +>>slivername = oneone_slice1 +{ 'attributes': [], + 'expires': 1183559059, + 'instantiation': 'plc-instantiated', + 'keys': [], + 'name': 'oneone_slice1', + 'slice_id': 2} +=== refresh After foreign nodes were removed on plc1 ++++ 54.96 seconds ellapsed (2.47) +01:== Refreshing peer ++++ ellapsed: { keys 0.00453805923462 local_nodes 0.00685501098633 nodes 0.0173001289368 peer_db 0.0743207931519 persons 0.00870394706726 site 0.0192351341248 slices 0.00876808166504 transport 0.327321052551 } ++++ 56.53 seconds ellapsed (1.57) +02:== Refreshing peer ++++ ellapsed: { keys 0.00459313392639 local_nodes 0.00714993476868 nodes 0.0179018974304 peer_db 0.0734980106354 persons 0.00876402854919 site 0.0196471214294 slices 0.0168151855469 transport 0.326390981674 } ++++ 58.19 seconds ellapsed (1.66) +01: local slice oneone_slice1 (e=1) on nodes [4] +[LOC:1] : n1-001.plc1.org +02: foreign slice oneone_slice1 (e=1) on nodes [5] +[FOR:1] : n1-001.plc1.org +==================== ('DELETING LOCAL NODES FROM SLICES',) +01:== deleted in slice oneone_slice1 local ['n1-001.plc1.org'] +01: local slice oneone_slice1 (e=0) on nodes [] +02: foreign slice oneone_slice1 (e=1) on nodes [5] +[FOR:1] : n1-001.plc1.org +=== refresh After local nodes were removed on plc1 ++++ 59.69 seconds ellapsed (1.50) +01:== Refreshing peer ++++ ellapsed: { keys 0.0046010017395 local_nodes 0.0074291229248 nodes 0.0173571109772 peer_db 0.0745379924774 persons 0.0088050365448 site 0.0192980766296 slices 0.00872993469238 transport 0.327045202255 } ++++ 61.34 seconds ellapsed (1.64) +02:== Refreshing peer ++++ ellapsed: { keys 0.00650191307068 local_nodes 0.00670886039734 nodes 0.0182948112488 peer_db 0.0741491317749 persons 0.0112988948822 site 0.023903131485 slices 0.0140850543976 transport 0.329675912857 } ++++ 62.96 seconds ellapsed (1.62) +01: local slice oneone_slice1 (e=0) on nodes [] +02: foreign slice oneone_slice1 (e=0) on nodes [] +==================== ('CHECKING SLICES CLEAN UP',) +01:== Cleaning all slices +01:==== Cleaned slice 2 +01: Checking slices: got 1 local (e=1) & 0 foreign (e=0) +02: Checking slices: got 1 local (e=1) & 1 foreign (e=1) +=== refresh After slices clenaup ++++ 64.58 seconds ellapsed (1.63) +01:== Refreshing peer ++++ ellapsed: { keys 0.00501298904419 local_nodes 0.00675821304321 nodes 0.0177989006042 peer_db 0.0747208595276 persons 0.00913691520691 site 0.0215060710907 slices 0.00876688957214 transport 0.327316045761 } ++++ 66.18 seconds ellapsed (1.59) +02:== Refreshing peer ++++ ellapsed: { keys 0.0045599937439 local_nodes 0.00678086280823 nodes 0.0176630020142 peer_db 0.0735070705414 persons 0.00879001617432 site 0.0198049545288 slices 0.0313010215759 transport 0.325602054596 } ++++ 67.85 seconds ellapsed (1.67) +01: Checking slices: got 1 local (e=1) & 0 foreign (e=0) +02: Checking slices: got 1 local (e=1) & 0 foreign (e=0) ++++ 68.48 seconds ellapsed (0.63) +01:== created SliceAttributeType = 23 +02:== created SliceAttributeType = 23 +=== refresh after SliceAttributeType creation ++++ 69.11 seconds ellapsed (0.63) +01:== Refreshing peer ++++ ellapsed: { keys 0.00452494621277 local_nodes 0.00672507286072 nodes 0.0180468559265 peer_db 0.0739049911499 persons 0.00868201255798 site 0.0191102027893 slices 0.00880193710327 transport 0.325891971588 } ++++ 70.77 seconds ellapsed (1.66) +02:== Refreshing peer ++++ ellapsed: { keys 0.00455808639526 local_nodes 0.0073459148407 nodes 0.0177400112152 peer_db 0.0747611522675 persons 0.00878596305847 site 0.019455909729 slices 0.010351896286 transport 0.32853770256 } ++++ 72.38 seconds ellapsed (1.60) ++++ 72.38 seconds ellapsed (0.00) +01:============================== DUMPING +01: SITES +1 None plc1 FederationTestPlc1 Central [] +2 None oneone FederationTestPlc1 [4] +3 1 plc2 FederationTestPlc2 Central [] +4 1 twoone FederationTestPlc2 [5] +01: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 1 ssh-rsa somekey4plctestbed user1-key1 +01: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc1.inria.fr keys: [] sites: [1] +3 None peer1@planet-lab.org keys: [] sites: [] +4 1 peer2@planet-lab.org keys: [] sites: [] +5 None user-1@plc.org keys: [1] sites: [] +6 1 user-1@plc.org keys: [2] sites: [] +01: NODES +5 1 n2-001.plc2.org sls= [] site= 4 +4 None n1-001.plc1.org sls= [] site= 2 +01: SLICES +name: plc1_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183553992 +01: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_1 < custom sat on plc1 > +01: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None ++++ 73.50 seconds ellapsed (1.13) +01: SLIVERS for first 1 nodes +WARNING - GetSlivers needs fix +01:============================== END DUMP +02:============================== DUMPING +02: SITES +1 None plc2 FederationTestPlc2 Central [] +2 None twoone FederationTestPlc2 [4] +3 1 plc1 FederationTestPlc1 Central [] +4 1 oneone FederationTestPlc1 [5] +02: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 1 ssh-rsa somekey4plctestbed user1-key1 +02: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc2.inria.fr keys: [] sites: [1] +3 None peer2@planet-lab.org keys: [] sites: [] +4 1 peer1@planet-lab.org keys: [] sites: [] +5 None user-1@plc.org keys: [1] sites: [] +6 1 user-1@plc.org keys: [2] sites: [] +02: NODES +5 1 n1-001.plc1.org sls= [] site= 4 +4 None n2-001.plc2.org sls= [] site= 2 +02: SLICES +name: plc2_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183554012 +02: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_2 < custom sat on plc2 > +02: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None ++++ 74.63 seconds ellapsed (1.13) +02: SLIVERS for first 1 nodes +WARNING - GetSlivers needs fix +02:============================== END DUMP ++++ 74.63 seconds ellapsed (0.00) +==================== ('END',) ++++ 74.63 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-n.-1.populate.ref b/trunk/tests/testpeers.-n.-1.populate.ref new file mode 100644 index 0000000..ce31442 --- /dev/null +++ b/trunk/tests/testpeers.-n.-1.populate.ref @@ -0,0 +1,97 @@ +options {'local_peer': 1, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'normal'} args ['populate'] +4 sites, 4 persons, 5 nodes & 4 slices +2 keys/person, 3 nodes/slice & 6 persons/slice +fast_flag False +Running locally on index 1 +funcname populate +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +==================== ('INIT',) ++++ timer start +==================== s[1] +show_config obsoleted +==================== s[2] +show_config obsoleted +==================== +01:== created peer admin account 3, peer1@planet-lab.org - peer +Dummy method GetPersons on remote peer 2 skipped +Dummy method AddPerson on remote peer 2 skipped +01:== enabled+admin on account 3:peer1@planet-lab.org +Dummy method AdmSetPersonEnabled on remote peer 2 skipped ++++ timer start +Trying to locate keys for peer on plc[1] in gpg_plc2.pub and api_plc2.crt +01:Created peer 1 +Dummy method GetPeers on remote peer 2 skipped +Trying to locate keys for peer on plc[2] in gpg_plc1.pub and api_plc1.crt +Dummy method AddPeer on remote peer 2 skipped +02:Created peer 0 ++++ 0.36 seconds ellapsed (0.36) +01:== Created site 2 with max_slices=4 +Dummy method GetSites on remote peer 2 skipped +Dummy method AddSite on remote peer 2 skipped +01:== Created site 3 with max_slices=4 +01:== Created site 4 with max_slices=4 +01:== Created site 5 with max_slices=4 ++++ 0.70 seconds ellapsed (0.33) +01:== created user account 4, user-1@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org +01:== added key ssh-rsa somekey4plctestbed user1-key2 to person user-1@plc.org +Dummy method GetPersons on remote peer 2 skipped +Dummy method AddPerson on remote peer 2 skipped +01:== created user account 5, user-2@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user2-key1 to person user-2@plc.org +01:== added key ssh-rsa somekey4plctestbed user2-key2 to person user-2@plc.org +01:== created user account 6, user-3@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user3-key1 to person user-3@plc.org +01:== added key ssh-rsa somekey4plctestbed user3-key2 to person user-3@plc.org +01:== created user account 7, user-4@plc.org - password1 +01:== added key ssh-rsa somekey4plctestbed user4-key1 to person user-4@plc.org +01:== added key ssh-rsa somekey4plctestbed user4-key2 to person user-4@plc.org ++++ 1.14 seconds ellapsed (0.44) +01:== Added node 1 n1-001.plc1.org +Dummy method GetNodes on remote peer 2 skipped +Dummy method AddNode on remote peer 2 skipped +01:== Added node 2 n1-002.plc1.org +01:== Added node 3 n1-003.plc1.org +01:== Added node 4 n1-004.plc1.org +01:== Added node 5 n1-005.plc1.org ++++ 1.44 seconds ellapsed (0.30) +01:== created slice 2 - max nodes=5 +01:== Attached person user-1@plc.org to slice oneone_slice1 +01:== Attached person user-2@plc.org to slice oneone_slice1 +01:== Attached person user-3@plc.org to slice oneone_slice1 +01:== Attached person user-4@plc.org to slice oneone_slice1 +01:== created slice 3 - max nodes=5 +01:== Attached person user-2@plc.org to slice onetwo_slice2 +01:== Attached person user-3@plc.org to slice onetwo_slice2 +01:== Attached person user-4@plc.org to slice onetwo_slice2 +01:== Attached person user-1@plc.org to slice onetwo_slice2 +01:== created slice 4 - max nodes=5 +01:== Attached person user-3@plc.org to slice onethree_slice3 +01:== Attached person user-4@plc.org to slice onethree_slice3 +01:== Attached person user-1@plc.org to slice onethree_slice3 +01:== Attached person user-2@plc.org to slice onethree_slice3 +01:== created slice 5 - max nodes=5 +01:== Attached person user-4@plc.org to slice onefour_slice4 +01:== Attached person user-1@plc.org to slice onefour_slice4 +01:== Attached person user-2@plc.org to slice onefour_slice4 +01:== Attached person user-3@plc.org to slice onefour_slice4 ++++ 2.00 seconds ellapsed (0.56) +01:== added in slice oneone_slice1 local ['n1-001.plc1.org', 'n1-002.plc1.org', 'n1-003.plc1.org'] +01:== added in slice onetwo_slice2 local ['n1-002.plc1.org', 'n1-003.plc1.org', 'n1-004.plc1.org'] +01:== added in slice onethree_slice3 local ['n1-003.plc1.org', 'n1-004.plc1.org', 'n1-005.plc1.org'] +01:== added in slice onefour_slice4 local ['n1-004.plc1.org', 'n1-005.plc1.org', 'n1-001.plc1.org'] ++++ 2.15 seconds ellapsed (0.15) +01:== created SliceAttributeType = 23 +Dummy method GetSliceAttributeTypes on remote peer 2 skipped +Dummy method AddSliceAttributeType on remote peer 2 skipped ++++ 2.19 seconds ellapsed (0.04) +slice_name oneone_slice1 sat_name sat_1 +01:== created SliceAttribute = 6 On slice oneone_slice1 and node None +01:== created SliceAttribute = 7 On slice oneone_slice1 and node n1-001.plc1.org +slice_name oneone_slice1 sat_name vref +01:== created SliceAttribute = 8 On slice oneone_slice1 and node None +01:== created SliceAttribute = 9 On slice oneone_slice1 and node n1-001.plc1.org ++++ 2.34 seconds ellapsed (0.15) +==================== ('END',) ++++ 2.34 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-n.-2.populate.ref b/trunk/tests/testpeers.-n.-2.populate.ref new file mode 100644 index 0000000..17810a3 --- /dev/null +++ b/trunk/tests/testpeers.-n.-2.populate.ref @@ -0,0 +1,74 @@ +options {'local_peer': 2, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'normal'} args ['populate'] +4 sites, 4 persons, 5 nodes & 4 slices +2 keys/person, 3 nodes/slice & 6 persons/slice +fast_flag False +Running locally on index 2 +funcname populate +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +==================== ('INIT',) ++++ timer start +==================== s[1] +show_config obsoleted +==================== s[2] +show_config obsoleted +==================== +Dummy method GetPersons on remote peer 1 skipped +Dummy method AddPerson on remote peer 1 skipped +02:== created peer admin account 3, peer2@planet-lab.org - peer +Dummy method AdmSetPersonEnabled on remote peer 1 skipped +02:== enabled+admin on account 3:peer2@planet-lab.org ++++ timer start +Dummy method GetPeers on remote peer 1 skipped +Trying to locate keys for peer on plc[1] in gpg_plc2.pub and api_plc2.crt +Dummy method AddPeer on remote peer 1 skipped +01:Created peer 0 +Trying to locate keys for peer on plc[2] in gpg_plc1.pub and api_plc1.crt +02:Created peer 1 ++++ 0.35 seconds ellapsed (0.35) +Dummy method GetSites on remote peer 1 skipped +Dummy method AddSite on remote peer 1 skipped +02:== Created site 2 with max_slices=4 +02:== Created site 3 with max_slices=4 +02:== Created site 4 with max_slices=4 +02:== Created site 5 with max_slices=4 ++++ 0.69 seconds ellapsed (0.34) +Dummy method GetPersons on remote peer 1 skipped +Dummy method AddPerson on remote peer 1 skipped +02:== created user account 4, user-1@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user1-key1 to person user-1@plc.org +02:== added key ssh-rsa somekey4plctestbed user1-key2 to person user-1@plc.org +02:== created user account 5, user-2@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user2-key1 to person user-2@plc.org +02:== added key ssh-rsa somekey4plctestbed user2-key2 to person user-2@plc.org +02:== created user account 6, user-3@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user3-key1 to person user-3@plc.org +02:== added key ssh-rsa somekey4plctestbed user3-key2 to person user-3@plc.org +02:== created user account 7, user-4@plc.org - password2 +02:== added key ssh-rsa somekey4plctestbed user4-key1 to person user-4@plc.org +02:== added key ssh-rsa somekey4plctestbed user4-key2 to person user-4@plc.org ++++ 1.16 seconds ellapsed (0.46) +Dummy method GetNodes on remote peer 1 skipped +Dummy method AddNode on remote peer 1 skipped +02:== Added node 1 n2-001.plc2.org +02:== Added node 2 n2-002.plc2.org +02:== Added node 3 n2-003.plc2.org +02:== Added node 4 n2-004.plc2.org +02:== Added node 5 n2-005.plc2.org ++++ 1.44 seconds ellapsed (0.29) +Dummy method GetSlices on remote peer 1 skipped +Dummy method AddSlice on remote peer 1 skipped ++++ 1.45 seconds ellapsed (0.00) +Dummy method AddSliceToNodes on remote peer 1 skipped ++++ 1.45 seconds ellapsed (0.00) +Dummy method GetSliceAttributeTypes on remote peer 1 skipped +Dummy method AddSliceAttributeType on remote peer 1 skipped +02:== created SliceAttributeType = 23 ++++ 1.48 seconds ellapsed (0.03) +Dummy method GetSliceAttributes on remote peer 1 skipped +slice_name oneone_slice1 sat_name sat_1 +Dummy method AddSliceAttribute on remote peer 1 skipped +slice_name oneone_slice1 sat_name vref ++++ 1.48 seconds ellapsed (0.00) +==================== ('END',) ++++ 1.48 seconds ellapsed (0.00) diff --git a/trunk/tests/testpeers.-n.populate_end.ref b/trunk/tests/testpeers.-n.populate_end.ref new file mode 100644 index 0000000..e8038d0 --- /dev/null +++ b/trunk/tests/testpeers.-n.populate_end.ref @@ -0,0 +1,250 @@ +options {'local_peer': None, 'plc1': '', 'plc2': '', 'factor': 1, 'debug': False, 'size': 'normal'} args ['populate_end'] +4 sites, 4 persons, 5 nodes & 4 slices +2 keys/person, 3 nodes/slice & 6 persons/slice +fast_flag False +funcname populate_end +dir() ['args', 'funcname', 'options', 'parser', 'size_func', 'steps', 'usage'] ++++ timer start +initializing s[1]=>https://caicol.inria.fr:443/PLCAPI/ user= peer1@planet-lab.org +initializing s[2]=>https://jamaica.inria.fr:443/PLCAPI/ user= peer2@planet-lab.org +=== refresh Peer 1 for publishing foreign nodes from 2 ++++ 0.23 seconds ellapsed (0.23) +01:== Refreshing peer ++++ ellapsed: { keys 0.0584080219269 local_nodes 0.0104968547821 nodes 0.0956499576569 peer_db 0.0798010826111 persons 0.0858988761902 site 0.0857949256897 slices 0.0084400177002 transport 0.413682699203 } ++++ 2.39 seconds ellapsed (2.16) ++++ 2.39 seconds ellapsed (0.00) +01:== added in slice oneone_slice1 foreign ['n2-001.plc2.org', 'n2-002.plc2.org', 'n2-003.plc2.org'] +01:== added in slice onetwo_slice2 foreign ['n2-002.plc2.org', 'n2-003.plc2.org', 'n2-004.plc2.org'] +01:== added in slice onethree_slice3 foreign ['n2-003.plc2.org', 'n2-004.plc2.org', 'n2-005.plc2.org'] +01:== added in slice onefour_slice4 foreign ['n2-004.plc2.org', 'n2-005.plc2.org', 'n2-001.plc2.org'] ++++ 3.17 seconds ellapsed (0.78) +=== refresh populate: refresh all ++++ 3.17 seconds ellapsed (0.00) +01:== Refreshing peer ++++ ellapsed: { keys 0.00897598266602 local_nodes 0.00887680053711 nodes 0.02374792099 peer_db 0.0800650119781 persons 0.0151720046997 site 0.0278759002686 slices 0.00831913948059 transport 0.408355951309 } ++++ 4.96 seconds ellapsed (1.79) +02:== Refreshing peer ++++ ellapsed: { keys 0.0736620426178 local_nodes 0.00899505615234 nodes 0.0971839427948 peer_db 0.0860619544983 persons 0.0938341617584 site 0.0988049507141 slices 0.146500825882 transport 0.467275857925 } ++++ 7.37 seconds ellapsed (2.42) ++++ 7.37 seconds ellapsed (0.00) +=== refresh empty refresh ++++ 7.37 seconds ellapsed (0.00) +01:== Refreshing peer ++++ ellapsed: { keys 0.00746011734009 local_nodes 0.00917816162109 nodes 0.0223898887634 peer_db 0.0814049243927 persons 0.0131568908691 site 0.0241479873657 slices 0.00885701179504 transport 0.430548191071 } ++++ 9.13 seconds ellapsed (1.75) +02:== Refreshing peer ++++ ellapsed: { keys 0.00907683372498 local_nodes 0.00895595550537 nodes 0.0241439342499 peer_db 0.0860838890076 persons 0.0207340717316 site 0.0281040668488 slices 0.0154550075531 transport 0.463763237 } ++++ 10.96 seconds ellapsed (1.83) +01:============================== DUMPING +01: SITES +1 None plc1 FederationTestPlc1 Central [] +2 None oneone FederationTestPlc1 [5, 1] +3 None onetwo FederationTestPlc1 [2] +4 None onethree FederationTestPlc1 [3] +5 None onefour FederationTestPlc1 [4] +6 1 plc2 FederationTestPlc2 Central [] +7 1 twoone FederationTestPlc2 [10, 6] +8 1 twotwo FederationTestPlc2 [7] +9 1 twothree FederationTestPlc2 [8] +10 1 twofour FederationTestPlc2 [9] +01: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 None ssh-rsa somekey4plctestbed user1-key2 +3 None ssh-rsa somekey4plctestbed user2-key1 +4 None ssh-rsa somekey4plctestbed user2-key2 +5 None ssh-rsa somekey4plctestbed user3-key1 +6 None ssh-rsa somekey4plctestbed user3-key2 +7 None ssh-rsa somekey4plctestbed user4-key1 +8 None ssh-rsa somekey4plctestbed user4-key2 +9 1 ssh-rsa somekey4plctestbed user1-key1 +10 1 ssh-rsa somekey4plctestbed user1-key2 +11 1 ssh-rsa somekey4plctestbed user2-key1 +12 1 ssh-rsa somekey4plctestbed user2-key2 +13 1 ssh-rsa somekey4plctestbed user3-key1 +14 1 ssh-rsa somekey4plctestbed user3-key2 +15 1 ssh-rsa somekey4plctestbed user4-key1 +16 1 ssh-rsa somekey4plctestbed user4-key2 +01: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc1.inria.fr keys: [] sites: [1] +3 None peer1@planet-lab.org keys: [] sites: [] +4 None user-1@plc.org keys: [2, 1] sites: [] +5 None user-2@plc.org keys: [4, 3] sites: [] +6 None user-3@plc.org keys: [6, 5] sites: [] +7 None user-4@plc.org keys: [8, 7] sites: [] +8 1 peer2@planet-lab.org keys: [] sites: [] +9 1 user-1@plc.org keys: [10, 9] sites: [] +10 1 user-2@plc.org keys: [12, 11] sites: [] +11 1 user-3@plc.org keys: [14, 13] sites: [] +12 1 user-4@plc.org keys: [15, 16] sites: [] +01: NODES +1 None n1-001.plc1.org sls= [5, 2] site= 2 +2 None n1-002.plc1.org sls= [3, 2] site= 3 +3 None n1-003.plc1.org sls= [4, 3, 2] site= 4 +4 None n1-004.plc1.org sls= [5, 4, 3] site= 5 +5 None n1-005.plc1.org sls= [5, 4] site= 2 +6 1 n2-001.plc2.org sls= [5, 2] site= 7 +7 1 n2-002.plc2.org sls= [3, 2] site= 8 +8 1 n2-003.plc2.org sls= [4, 3, 2] site= 9 +9 1 n2-004.plc2.org sls= [5, 4, 3] site= 10 +10 1 n2-005.plc2.org sls= [5, 4] site= 7 +01: SLICES +name: plc1_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183553992 +name: oneone_slice1 id: 02 peer: None nodes= [8, 7, 6, 3, 2, 1] persons= [7, 6, 5, 4] +--- sa_ids= [6, 7, 8, 9] creator: 1 +--- 'expires': 1183556357 +name: onetwo_slice2 id: 03 peer: None nodes= [9, 8, 7, 4, 3, 2] persons= [4, 7, 6, 5] +--- sa_ids= [] creator: 1 +--- 'expires': 1183556357 +name: onethree_slice3 id: 04 peer: None nodes= [10, 9, 8, 5, 4, 3] persons= [5, 4, 7, 6] +--- sa_ids= [] creator: 1 +--- 'expires': 1183556357 +name: onefour_slice4 id: 05 peer: None nodes= [10, 9, 6, 5, 4, 1] persons= [6, 5, 4, 7] +--- sa_ids= [] creator: 1 +--- 'expires': 1183556357 +01: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_1 < custom sat on plc1 > +01: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 09 sat_id: 04 sl=02 v= predefined sat/node1 n= 1 +name: vref sa_id: 08 sat_id: 04 sl=02 v= predefined sat/all nodes n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None +name: sat_1 sa_id: 07 sat_id: 23 sl=02 v= custom sat/node1 n= 1 +name: sat_1 sa_id: 06 sat_id: 23 sl=02 v= custom sat/all nodes n= None ++++ 12.19 seconds ellapsed (1.23) +01: SLIVERS for first 3 nodes +WARNING - GetSlivers needs fix +01:============================== END DUMP +02:============================== DUMPING +02: SITES +1 None plc2 FederationTestPlc2 Central [] +2 None twoone FederationTestPlc2 [5, 1] +3 None twotwo FederationTestPlc2 [2] +4 None twothree FederationTestPlc2 [3] +5 None twofour FederationTestPlc2 [4] +6 1 plc1 FederationTestPlc1 Central [] +7 1 oneone FederationTestPlc1 [10, 6] +8 1 onetwo FederationTestPlc1 [7] +9 1 onethree FederationTestPlc1 [8] +10 1 onefour FederationTestPlc1 [9] +02: KEYS +1 None ssh-rsa somekey4plctestbed user1-key1 +2 None ssh-rsa somekey4plctestbed user1-key2 +3 None ssh-rsa somekey4plctestbed user2-key1 +4 None ssh-rsa somekey4plctestbed user2-key2 +5 None ssh-rsa somekey4plctestbed user3-key1 +6 None ssh-rsa somekey4plctestbed user3-key2 +7 None ssh-rsa somekey4plctestbed user4-key1 +8 None ssh-rsa somekey4plctestbed user4-key2 +9 1 ssh-rsa somekey4plctestbed user1-key1 +10 1 ssh-rsa somekey4plctestbed user1-key2 +11 1 ssh-rsa somekey4plctestbed user2-key1 +12 1 ssh-rsa somekey4plctestbed user2-key2 +13 1 ssh-rsa somekey4plctestbed user3-key1 +14 1 ssh-rsa somekey4plctestbed user3-key2 +15 1 ssh-rsa somekey4plctestbed user4-key1 +16 1 ssh-rsa somekey4plctestbed user4-key2 +02: PERSONS +1 None maint@localhost.localdomain keys: [] sites: [] +2 None root@plc2.inria.fr keys: [] sites: [1] +3 None peer2@planet-lab.org keys: [] sites: [] +4 None user-1@plc.org keys: [2, 1] sites: [] +5 None user-2@plc.org keys: [4, 3] sites: [] +6 None user-3@plc.org keys: [6, 5] sites: [] +7 None user-4@plc.org keys: [8, 7] sites: [] +8 1 peer1@planet-lab.org keys: [] sites: [] +9 1 user-1@plc.org keys: [10, 9] sites: [] +10 1 user-2@plc.org keys: [12, 11] sites: [] +11 1 user-3@plc.org keys: [14, 13] sites: [] +12 1 user-4@plc.org keys: [15, 16] sites: [] +02: NODES +1 None n2-001.plc2.org sls= [5, 2] site= 2 +2 None n2-002.plc2.org sls= [3, 2] site= 3 +3 None n2-003.plc2.org sls= [4, 3, 2] site= 4 +4 None n2-004.plc2.org sls= [5, 4, 3] site= 5 +5 None n2-005.plc2.org sls= [5, 4] site= 2 +6 1 n1-001.plc1.org sls= [5, 2] site= 7 +7 1 n1-002.plc1.org sls= [3, 2] site= 8 +8 1 n1-003.plc1.org sls= [4, 3, 2] site= 9 +9 1 n1-004.plc1.org sls= [5, 4, 3] site= 10 +10 1 n1-005.plc1.org sls= [5, 4] site= 7 +02: SLICES +name: plc2_netflow id: 01 peer: None nodes= [] persons= [] +--- sa_ids= [1, 2, 3, 4, 5] creator: 1 +--- 'expires': 1183554012 +name: oneone_slice1 id: 02 peer: 1 nodes= [3, 2, 1, 8, 7, 6] persons= [12, 11, 10, 9] +--- sa_ids= [] creator: None +--- 'expires': 1183556357 +name: onetwo_slice2 id: 03 peer: 1 nodes= [4, 3, 2, 9, 8, 7] persons= [12, 11, 10, 9] +--- sa_ids= [] creator: None +--- 'expires': 1183556357 +name: onethree_slice3 id: 04 peer: 1 nodes= [5, 4, 3, 10, 9, 8] persons= [12, 11, 10, 9] +--- sa_ids= [] creator: None +--- 'expires': 1183556357 +name: onefour_slice4 id: 05 peer: 1 nodes= [5, 4, 1, 10, 9, 6] persons= [12, 11, 10, 9] +--- sa_ids= [] creator: None +--- 'expires': 1183556357 +02: Slice Attribute Types +sat_id: 01 min_role_id: 20 name: type < Type of slice (e.g. vserver) > +sat_id: 02 min_role_id: 10 name: system < Is a default system slice (1) or not (0 or unset) > +sat_id: 03 min_role_id: 10 name: enabled < Slice enabled (1 or unset) or suspended (0) > +sat_id: 04 min_role_id: 30 name: vref < Reference image > +sat_id: 05 min_role_id: 10 name: initscript < Slice initialization script > +sat_id: 06 min_role_id: 10 name: cpu_min < Minimum CPU share (ms/s) > +sat_id: 07 min_role_id: 10 name: cpu_share < Number of CPU shares > +sat_id: 08 min_role_id: 10 name: net_min_rate < Minimum bandwidth (kbps) > +sat_id: 09 min_role_id: 10 name: net_max_rate < Maximum bandwidth (kbps) > +sat_id: 10 min_role_id: 10 name: net_i2_min_rate < Minimum bandwidth over I2 routes (kbps) > +sat_id: 11 min_role_id: 10 name: net_i2_max_rate < Maximum bandwidth over I2 routes (kbps) > +sat_id: 12 min_role_id: 10 name: net_max_kbyte < Maximum daily network Tx KByte limit. > +sat_id: 13 min_role_id: 10 name: net_thresh_kbyte < KByte limit before warning and throttling. > +sat_id: 14 min_role_id: 10 name: net_i2_max_kbyte < Maximum daily network Tx KByte limit to I2 hosts. > +sat_id: 15 min_role_id: 10 name: net_i2_thresh_kbyte < KByte limit to I2 hosts before warning and throttling. > +sat_id: 16 min_role_id: 10 name: net_share < Number of bandwidth shares > +sat_id: 17 min_role_id: 10 name: net_i2_share < Number of bandwidth shares over I2 routes > +sat_id: 18 min_role_id: 10 name: disk_max < Disk quota (1k disk blocks) > +sat_id: 19 min_role_id: 10 name: proper_op < Proper operation (e.g. bind_socket) > +sat_id: 20 min_role_id: 20 name: plc_slice_type < Type of slice rspec to be created > +sat_id: 21 min_role_id: 10 name: plc_agent_version < Version of PLC agent (slice creation service) software to be deployed > +sat_id: 22 min_role_id: 10 name: plc_ticket_pubkey < Public key used to verify PLC-signed tickets > +sat_id: 23 min_role_id: 10 name: sat_2 < custom sat on plc2 > +02: Slice Attributes +name: system sa_id: 01 sat_id: 02 sl=01 v= 1 n= None +name: vref sa_id: 02 sat_id: 04 sl=01 v= planetflow n= None +name: proper_op sa_id: 05 sat_id: 19 sl=01 v= bind_socket n= None +name: proper_op sa_id: 04 sat_id: 19 sl=01 v= create_socket n= None +name: proper_op sa_id: 03 sat_id: 19 sl=01 v= open file=/etc/passwd, flags=r n= None ++++ 13.43 seconds ellapsed (1.23) +02: SLIVERS for first 3 nodes +WARNING - GetSlivers needs fix +02:============================== END DUMP ++++ 13.43 seconds ellapsed (0.00) +==================== ('END',) ++++ 13.43 seconds ellapsed (0.00) diff --git a/trunk/tools/dzombie.py b/trunk/tools/dzombie.py new file mode 100755 index 0000000..e3c170a --- /dev/null +++ b/trunk/tools/dzombie.py @@ -0,0 +1,122 @@ +#!/usr/bin/python +# +# Tool that removes zombie records from database tables# +import sys +import os +import getopt +import pgdb +from pprint import pprint + +schema_file = None +config_file = "/etc/planetlab/plc_config" +config = {} +execfile(config_file, config) + +def usage(): + print "Usage: %s SCHEMA_FILE " % sys.argv[0] + sys.exit(1) + +try: + schema_file = sys.argv[1] +except IndexError: + print "Error: too few arguments" + usage() + +# all foreing keys exist as primary kyes in another table +# will represent all foreign keys as +# { 'table.foreign_key': 'table.primary_key'} +foreign_keys = {} +foreign_keys_ordered = [] +zombie_keys = {} +# parse the schema for foreign keys +try: + file = open(schema_file, 'r') + index = 0 + lines = file.readlines() + while index < len(lines): + line = lines[index].strip() + # find all created objects + if line.startswith("CREATE"): + line_parts = line.split(" ") + if line_parts[1:3] == ['OR', 'REPLACE']: + line_parts = line_parts[2:] + item_type = line_parts[1].strip() + item_name = line_parts[2].strip() + if item_type.upper() in ['TABLE']: + while index < len(lines): + index = index + 1 + nextline =lines[index].strip() + if nextline.find("--") > -1: + nextline = nextline[0:nextline.index("--")].replace(',', '') + if nextline.upper().find("REFERENCES") > -1: + nextline_parts = nextline.split(" ") + foreign_key_name = nextline_parts[0].strip() + foreign_key_table = nextline_parts[nextline_parts.index("REFERENCES")+1].strip() + foreign_key = item_name + "."+ foreign_key_name + primary_key = foreign_key_table +"."+ foreign_key_name + foreign_keys[foreign_key] = primary_key + foreign_keys_ordered.append(foreign_key) + elif nextline.find(";") >= 0: + break + index = index + 1 +except: + raise + +db = pgdb.connect(user = config['PLC_DB_USER'], + database = config['PLC_DB_NAME']) +cursor = db.cursor() +try: + for foreign_key in foreign_keys_ordered: + primary_key = foreign_keys[foreign_key] + sql = "SELECT distinct %s from %s" + + # get all foreign keys in this table + foreign_key_parts = foreign_key.split(".") + + # do not delete from primary tables + if foreign_key_parts[0] in ['addresses', 'boot_states', 'conf_files', \ + 'keys', 'messages', 'nodegroups', 'nodenetworks', 'nodes', 'pcus', 'peers' \ + 'persons', 'roles', 'sessions', 'sites', 'slices']: + #print "skipping table %s" % foreign_key_parts[0] + continue + + cursor.execute(sql % (foreign_key_parts[1], foreign_key_parts[0])) + foreign_rows = cursor.fetchall() + + # get all the primary keys from this foreign key's primary table + primary_key_parts = primary_key.split(".") + # foreign key name may not match primary key name. must rename these + if primary_key_parts[1] == 'creator_person_id': + primary_key_parts[1] = 'person_id' + elif primary_key_parts[1] == 'min_role_id': + primary_key_parts[1] = 'role_id' + sql = sql % (primary_key_parts[1], primary_key_parts[0]) + + # determin which primary records are deleted + desc = os.popen('psql planetlab4 postgres -c "\d %s;"' % primary_key_parts[0]) + result = desc.readlines() + if primary_key_parts[0] in ['slices']: + sql = sql + " where name not like '%_deleted'" + elif filter(lambda line: line.find("deleted") > -1, result): + sql = sql + " where deleted = false" + + cursor.execute(sql) + primary_key_rows = cursor.fetchall() + + # if foreign key isnt present in primay_key query, it either doesnt exist or marked as deleted + # also, ignore null foreign keys, not considered zombied + zombie_keys_func = lambda key: key not in primary_key_rows and not key == [None] + zombie_keys_list = [zombie_key[0] for zombie_key in filter(zombie_keys_func, foreign_rows)] + print zombie_keys_list + # delete these zombie records + if zombie_keys_list: + print " -> Deleting %d zombie record(s) from %s after checking %s" % \ + (len(zombie_keys_list), foreign_key_parts[0], primary_key_parts[0]) + sql_delete = 'DELETE FROM %s WHERE %s IN %s' % \ + (foreign_key_parts[0], foreign_key_parts[1], tuple(zombie_keys_list)) + cursor.execute(sql_delete) + db.commit() + #zombie_keys[foreign_key] = zombie_keys_list + print "done" +except pgdb.DatabaseError: + raise diff --git a/trunk/tools/planetlab3_dump.sh b/trunk/tools/planetlab3_dump.sh new file mode 100755 index 0000000..e6a86e3 --- /dev/null +++ b/trunk/tools/planetlab3_dump.sh @@ -0,0 +1,119 @@ +#!/bin/bash +# +# Dumps the planetlab3 database on zulu, fixing a few things on the way +# +# Mark Huang +# Copyright (C) 2007 The Trustees of Princeton University +# +# $Id$ +# + +tables=( +node_bootstates +nodes +nodenetworks +node_nodenetworks +nodegroups +nodegroup_nodes +override_bootscripts +pod_hash +conf_file +conf_assoc +address_types +addresses +organizations +sites +roles +capabilities +persons +person_roles +person_capabilities +person_address +key_types +keys +person_keys +person_site +node_root_access +authorized_subnets +site_authorized_subnets +event_classes +dslice03_states +dslice03_attributetypes +dslice03_slices +dslice03_attributes +dslice03_sliceattribute +dslice03_slicenode +dslice03_sliceuser +dslice03_siteinfo +pcu +pcu_ports +join_request +whatsnew +node_hostnames +blacklist +dslice03_initscripts +dslice03_defaultattribute +peered_mas +sessions +) + +# Dump tables +for table in "${tables[@]}" ; do + pg_dump -U postgres -t $table planetlab3 +done | + +# Do some manual cleanup +sed -f <(cat < +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id$ +# + +import re +import base64 + +# Convert nm_net_{exempt_,}{min,max}_rate (bps) to +# net_{i2_,}{min,max}_rate and net_{i2_,}{min,max}_rate (kbps) +rename = {'nm_net_min_rate': 'net_min_rate', + 'nm_net_max_rate': 'net_max_rate', + 'nm_net_exempt_min_rate': 'net_i2_min_rate', + 'nm_net_exempt_max_rate': 'net_i2_max_rate'} +for slice_attribute in GetSliceAttributes({'name': rename.keys()}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Convert bps to kbps + bps = int(slice_attribute['value']) + kbps = bps / 1000 + + # Add the new attribute + if GetSlices([slice_id]): + AddSliceAttribute(slice_id, rename[name], str(kbps)) + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Convert nm_net_{exempt_,}avg_rate to +# net_{i2_,}max_kbyte and net_{i2_,}thresh_kbyte +rename = {'nm_net_avg_rate': {'max': 'net_max_kbyte', + 'thresh': 'net_thresh_kbyte'}, + 'nm_net_exempt_avg_rate': {'max': 'net_i2_max_kbyte', + 'thresh': 'net_i2_thresh_kbyte'}} +for slice_attribute in GetSliceAttributes({'name': rename.keys()}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Convert bps to 80% and 100% of max bytes per day + bps = int(slice_attribute['value']) + max_kbyte = bps * 24 * 60 * 60 / 8 / 1000 + thresh_kbyte = int(0.8 * max_kbyte) + + # Add the new attribute + if GetSlices([slice_id]): + AddSliceAttribute(slice_id, rename[name]['max'], str(max_kbyte)) + AddSliceAttribute(slice_id, rename[name]['thresh'], str(thresh_kbyte)) + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Convert plc_slice_state +for slice_attribute in GetSliceAttributes({'name': 'plc_slice_state'}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Add the new attribute + if GetSlices([slice_id]): + if slice_attribute['value'] == "suspended": + AddSliceAttribute(slice_id, 'enabled', "0") + else: + AddSliceAttribute(slice_id, 'enabled', "1") + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Straight renames +rename = {'nm_cpu_share': 'cpu_share', + 'nm_disk_quota': 'disk_max', + 'nm_net_share': 'net_share', + 'nm_net_exempt_share': 'net_i2_share', + 'nm_net_max_byte': 'net_max_kbyte', + 'nm_net_max_thresh_byte': 'net_thresh_kbyte', + 'nm_net_max_exempt_byte': 'net_i2_max_kbyte', + 'nm_net_max_thresh_exempt_byte': 'net_i2_thresh_kbyte'} +for slice_attribute in GetSliceAttributes({'name': rename.keys()}): + id = slice_attribute['slice_attribute_id'] + name = slice_attribute['name'] + slice_id = slice_attribute['slice_id'] + + # Pass straight through + value = slice_attribute['value'] + + # Add the new attribute + if GetSlices([slice_id]): + AddSliceAttribute(slice_id, rename[name], value) + + # Delete the old attribute + DeleteSliceAttribute(id) + +# Update plc_ticket_pubkey attribute +for slice_attribute in GetSliceAttributes({'name': "plc_ticket_pubkey"}): + id = slice_attribute['slice_attribute_id'] + + UpdateSliceAttribute(id, """ +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKXa72MEKDAnVyzEpKOB1ot2eW +xG/TG2aa7q/2oy1xf5XMmU9H9uKwO+GoUeinp1BSxgkVRF0VhEGGaqKR9kYQzX0k +ht4+P2hAr+UyU4cp0NxV4xfmyAbrNKuHVjawMUCu5BH0IkBUC/89ckxk71oROnak +FbI7ojUezSGr4aVabQIDAQAB +""".lstrip()) + +# Delete _deleted and deprecated slice attributes and types +for attribute_type in GetSliceAttributeTypes(): + id = attribute_type['attribute_type_id'] + name = attribute_type['name'] + + if name == 'general_prop_share' or \ + re.match('nm_', name) or \ + re.search('_deleted$', name): + DeleteSliceAttributeType(id) + # N.B. Automatically deletes all slice attributes of this type + +# Add Proper ops +proper_ops = [ + # give Stork permission to mount and unmount client dirs + ('arizona_stork', 'mount_dir'), + ('arizona_stork', 'set_file_flags pass, "1"'), + ('arizona_stork', 'set_file_flags_list "1"'), + ('arizona_stork', 'bind_socket sockname=64?:*'), + ('arizona_stork2', 'mount_dir'), + ('arizona_stork2', 'set_file_flags pass, "1"'), + ('arizona_stork2', 'set_file_flags_list "1"'), + ('arizona_stork2', 'bind_socket sockname=64?:*'), + + # give CoMon the necessary permissions to run slicestat + ('princeton_slicestat', 'exec "root", pass, "/usr/local/planetlab/bin/pl-ps", none'), + ('princeton_slicestat', 'exec "root", pass, "/usr/sbin/vtop", "bn1", none'), + ('princeton_slicestat', 'open_file file=/proc/virtual/*/cacct'), + ('princeton_slicestat', 'open_file file=/proc/virtual/*/limit'), + ('princeton_comon', 'open_file file=/var/log/secure'), + ('princeton_comon', 'exec "root", pass, "/bin/df", "/vservers", none'), + + # give pl_slicedir access to /etc/passwd + ('pl_slicedir', 'open_file pass, "/etc/passwd"'), + + # nyu_d are building a DNS demux so give them access to port 53 + ('nyu_d', 'bind_socket'), + ('nyu_oasis', 'bind_socket'), + + # QA slices need to be able to create and delete bind-mounts + ('pl_qa_0', 'mount_dir'), + ('pl_qa_1', 'mount_dir'), + + # irb_snort needs packet sockets for tcpdump + ('irb_snort', 'create_socket'), + + # uw_ankur is using netlink sockets to do the same thing as netflow + ('uw_ankur', 'create_socket'), + + # cornell_codons gets access to port 53 for now + ('cornell_codons', 'create_socket'), + + # give Mic Bowman's conf-monitor service read-only access to root fs + # and the ability to run df + ('idsl_monitor', 'mount_dir "root:/", pass, "ro"'), + ('idsl_monitor', 'unmount'), + ('idsl_monitor', 'exec "root", pass, "/bin/df", "-P", "/", "/vservers", none'), + + # give Shark access to port 111 to run portmap + # and port 955 to run mount + ('nyu_shkr', 'bind_socket'), + ('nyu_shkr', 'mount_dir "nfs:**:**"'), + ('nyu_shkr', 'exec "root", pass, "/bin/umount", "-l", "/vservers/nyu_shkr/**", none'), + + # give tsinghua_lgh access to restricted ports + ('tsinghua_lgh', 'bind_socket'), + + # CoDeeN needs port 53 too + ('princeton_codeen', 'bind_socket sockname=53:*'), + + # give ucin_load access to /var/log/wtmp + ('ucin_load', 'open_file file=/var/log/wtmp*'), + + # give google_highground permission to bind port 81 (and raw sockets) + ('google_highground', 'bind_socket'), + + # pl_conf needs access to port 814 + ('pl_conf', 'bind_socket sockname=814:*'), + ('pl_conf', 'open file=/home/*/.ssh/authorized_keys'), + + # give princeton_visp permission to read all packets sent through the + # tap0 device + ('princeton_visp', 'open file=/dev/net/tun, flags=rw'), + + # The PLB group needs the BGP port + ('princeton_iias', 'bind_socket sockname=179:*'), + ('princeton_visp', 'bind_socket sockname=179:*'), + ('mit_rcp', 'bind_socket sockname=179:*'), + ('princeton_bgpmux', 'bind_socket sockname=179:*'), + ('princeton_bgpmux2', 'bind_socket sockname=179:*'), + + # PL-VINI group + ('mit_rcp', 'exec "root", pass, "/usr/bin/chrt"'), + ('princeton_iias', 'exec "root", pass, "/usr/bin/chrt"'), + + # Tycoon needs access to /etc/passwd to determine Slicename->XID mappings + ('hplabs_tycoon_aucd', 'open_file file=/etc/passwd'), +] + +for slice, op in proper_ops: + try: + AddSliceAttribute(slice, 'proper_op', op) + except Exception, err: + print "Warning: %s:" % slice, err + +initscripts = dict([(initscript['initscript_id'], initscript) for initscript in [{'initscript_id': 8, 'script': 'IyEgL2Jpbi9zaA0KDQojIDxQcm9ncmFtIE5hbWU+DQojICAgIGJpbmRzY3JpcHQNCiMNCiMgPEF1dGhvcj4NCiMgICAgSmVmZnJ5IEpvaG5zdG9uIGFuZCBKZXJlbXkgUGxpY2h0YQ0KIw0KIyA8UHVycG9zZT4NCiMgICAgRG93bmxvYWRzIGFuZCBpbnN0YWxscyBzdG9yayBvbiBhIG5vZGUuDQoNCiMgc2F2ZSBvcmlnaW5hbCBQV0QNCk9MRFBXRD0kUFdEDQoNCiMgZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9uDQplcnJvcigpDQp7DQogICBlY2hvDQogICBlY2hvICJQbGVhc2UgRS1tYWlsIHN0b3JrLXN1cHBvcnRAY3MuYXJpem9uYS5lZHUgaWYgeW91IGJlbGlldmUgeW91IGhhdmUiIA0KICAgZWNobyAicmVjZWl2ZWQgdGhpcyBtZXNzYWdlIGluIGVycm9yLiINCg0KICAgIyBnZXQgcmlkIG9mIENFUlQgZmlsZQ0KICAgaWYgWyAtZiAkQ0VSVCBdDQogICB0aGVuDQogICAgICBybSAtZiAkQ0VSVCA+IC9kZXYvbnVsbA0KICAgZmkNCg0KICAgIyByZXN0b3JlIG9yaWdpbmFsIFBXRA0KICAgY2QgJE9MRFBXRA0KICAgZXhpdCAxDQp9DQoNCkNFUlQ9YHB3ZGAvdGVtcGNydGZpbGUNCg0KI2Z1bmN0aW9ucw0KDQojIyMNCiMjIyBjcmVhdGVDZXJ0aWZpY2F0ZSgpDQojIyMgICAgcHJpbnRzIG91dCB0aGUgZXF1aWZheCBjZXJ0aWZpY2F0ZSB0byB1c2UgYW5kIHN0b3Jlcw0KIyMjICAgIHRoZSBmaWxlIG5hbWUgaW4gJENFUlQNCiMjIw0KZnVuY3Rpb24gY3JlYXRlQ2VydGlmaWNhdGUoKXsNCmNhdCA+ICRDRVJUIDw8RVFVSUZBWA0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDa0RDQ0FmbWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURCYU1Rc3dDUVlEVlFRR0V3SlYNClV6RWNNQm9HQTFVRUNoTVRSWEYxYVdaaGVDQlRaV04xY21VZ1NXNWpMakV0TUNzR0ExVUVBeE1rUlhGMQ0KYVdaaGVDQlRaV04xY21VZ1IyeHZZbUZzSUdWQ2RYTnBibVZ6Y3lCRFFTMHhNQjRYRFRrNU1EWXlNVEEwDQpNREF3TUZvWERUSXdNRFl5TVRBME1EQXdNRm93V2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIREFhQmdOVkJBb1QNCkUwVnhkV2xtWVhnZ1UyVmpkWEpsSUVsdVl5NHhMVEFyQmdOVkJBTVRKRVZ4ZFdsbVlYZ2dVMlZqZFhKbA0KSUVkc2IySmhiQ0JsUW5WemFXNWxjM01nUTBFdE1UQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3DQpnWWtDZ1lFQXV1Y1hrQUpsc1RSVlBFbkNVZFhmcDlFM2o5SG5nWE5CVW1DYm5hRVhKbml0eDdIb0pwUXkNCnRkNHpqVG92Mi9LYWVscHptS05jNmZ1S2N4dGM1OE8vZ0d6TnFmVFdLOEQzK1ptcVk2S3hSd0lQMU9SUg0KT2hJOGJJcGFWSVJ3MjhIRmtNOXlSY3VvV2NETk01MC9vNWJyaFRNaEhENGVQbUJ1ZHB4bmhjWEl3MkVDDQpBd0VBQWFObU1HUXdFUVlKWUlaSUFZYjRRZ0VCQkFRREFnQUhNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcNCkh3WURWUjBqQkJnd0ZvQVV2cWlnZEhKUWEwUzN5U1BZKzZqL3MxZHJhR3d3SFFZRFZSME9CQllFRkw2bw0Kb0hSeVVHdEV0OGtqMlB1by83TlhhMmhzTUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUREaUFWR3F4K3BmDQoycm5RWlE4dzFqN2FEUlJKYnBHVEp4UXg3OFQzTFVYNDdNZS9va0VOSTdTUytSa0FaNzBCcjgzZ2NmeGENCnoyVEU0SmFZMEtOQTRnR0s3eWNIOFdVQmlrUXRCbVYxVXNDR0VDQWhYMnhyRDJ5dUNSeXY4cUlZTk1SMQ0KcEhNYzhZM2M3NjM1czNhMGtyL2NsUkFldnN2SU8xcUVZQmxXbEtsVg0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSANCkVRVUlGQVgNCn0NCg0KIyMjDQojIyMgb3ZlcldyaXRlQ29uZigpDQojIyMJb3ZlcndyaXRlIHRoZSBkZWZhdWx0IHN0b3JrLmNvbmYgZmlsZQ0KIyMjICAgICB0aGF0IHdhcyBpbnN0YWxsZWQgYnkgdGhlIHJwbSBwYWNrYWdlLg0KIyMjICAgICB0aGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgYmVjYXVzZSBJIG5lZWQNCiMjIyAgICAgdG8gY2hhbmdlIHRoZSBuZXN0cG9ydCBhbmQgSSBkb250IGtub3cNCiMjIyAgICAgZW5vdWdoIHRvIHJlcGFja2FnZSB0aGUgcnBtIHdpdGggdGhlDQojIyMgICAgIGNvcnJlY3Qgc2V0dGluZ3MNCmZ1bmN0aW9uIG92ZXJXcml0ZUNvbmYoKXsNCmNhdCA+IC91c3IvbG9jYWwvc3RvcmsvZXRjL3N0b3JrLmNvbmYgPDxFTkRPRkZJTEUNCnBhY21hbj0vdXNyL2xvY2FsL3N0b3JrL2Jpbi9wYWNtYW4NCmR0ZC1wYWNrYWdlcz0vdXNyL2xvY2FsL3N0b3JrL2Jpbi9wYWNrYWdlcy5kdGQNCmR0ZC1ncm91cHM9L3Vzci9sb2NhbC9zdG9yay9iaW4vZ3JvdXBzLmR0ZA0Kc3RvcmtuZXN0dXBkYXRlbGlzdGVuZXJwb3J0PTY0OQ0KDQojYml0dG9ycmVudHRyYWNrZXJob3N0PXF1YWRydXMuY3MuYXJpem9uYS5lZHUNCmJpdHRvcnJlbnR0cmFja2VyaG9zdD1ucjA2LmNzLmFyaXpvbmEuZWR1DQoNCmJpdHRvcnJlbnR0cmFja2VycG9ydD02ODgwDQpiaXR0b3JyZW50dXBsb2FkcmF0ZT0wDQpiaXR0b3JyZW50c2VlZGxvb2t1cHRpbWVvdXQ9MzANCg0KI3BhY2thZ2VyZXBvc2l0b3J5ID0gcXVhZHJ1cy5jcy5hcml6b25hLmVkdS9QbGFuZXRMYWIvVjN8ZGlzdCwgc3RhYmxlDQpwYWNrYWdlcmVwb3NpdG9yeSA9IG5yMDYuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzfGRpc3QsIHN0YWJsZQ0KI3BhY2thZ2VpbmZvcmVwb3NpdG9yeSA9IHF1YWRydXMuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzL3N0b3JrLmluZm8NCnBhY2thZ2VpbmZvcmVwb3NpdG9yeSA9IG5yMDYuY3MuYXJpem9uYS5lZHUvUGxhbmV0TGFiL1YzL3N0b3JrLmluZm8NCg0KdXNlcm5hbWUgPSBQbGFuZXRMYWINCnB1YmxpY2tleWZpbGUgPSAvdXNyL2xvY2FsL3N0b3JrL3Zhci9rZXlzL1BsYW5ldExhYi5wdWJsaWNrZXkNCnBhY2thZ2VtYW5hZ2VycyA9IG5lc3RycG0sIHJwbSwgdGFyZ3oNCnRyYW5zZmVybWV0aG9kPSBuZXN0LGJpdHRvcnJlbnQsY29ibGl0eixjb3JhbCxodHRwLGZ0cA0KbmVzdHBvcnQ9NjAwMA0KdGFycGFja2luZm9wYXRoPS91c3IvbG9jYWwvc3RvcmsvdmFyL3RhcmluZm8NCkVORE9GRklMRQ0KfSANCg0KDQojIyMNCiMjIyBkb3dubG9hZE5SMDYoKQ0KIyMjICAgIGRvd25sb2FkIGEgZmlsZSBmcm9tIG5yMDYgdXNpbmcgY3VybA0KIyMjDQojIyMgYXJnczogDQojIyMgICAgICAgLSB0aGUgcGF0aCBvZiB0aGUgZmlsZSB5b3Ugd2lzaCB0byBkb3dubG9hZA0KIyMjICAgICAgICAgcmVsYXRpdmUgZnJvbSBodHRwczovL25yMDYuY3MuYXJpem9uYS5lZHUNCiMjIyAgICAgICAtIHRoZSBmaWxlIHRvIHNhdmUgaXQgdG8NCiMjIyAgICAgICAtIHJldHVybmVkIHZhbHVlIGFzIHNwZWNpZmllZCBpbiB2ZXJpZnlEb3dubG9hZA0KZnVuY3Rpb24gZG93bmxvYWROUjA2KCl7DQogICAgY3VybCAtLWNhY2VydCAkQ0VSVCBodHRwczovL25yMDYuY3MuYXJpem9uYS5lZHUvJDEgLW8gJDIgMj4vZGV2L251bGwNCiAgICB2ZXJpZnlEb3dubG9hZCAkMiAkMw0KfQ0KDQojIyMNCiMjIyB2ZXJpZnlEb3dubG9hZCgpDQojIyMgICAgIHZlcmlmeSB0aGF0IGEgZmlsZSB0aGF0IHdhcyBqdXN0IGRvd25sb2FkIHdpdGggZG93bmxvYWROUjA2DQojIyMgICAgIHdhcyBkb3dubG9hZCBjb3JyZWN0bHkuIFNpbmNlIHdlIGFyZSBnZXR0aW5nIHN0dWZmIGZyb20gYQ0KIyMjICAgICBodHRwIHNlcnZlciB3ZSBhcmUgYXNzdW1pbmcgdGhhdCBpZiB3ZSBnZXQgYSA0MDQgcmVzcG9uc2UNCiMjIyAgICAgdGhhdCB0aGUgcGFnZSB3ZSB3YW50IGRvZXMgbm90IGV4aXN0LiBBbHNvLCBpZiB0aGUgb3V0cHV0IGZpbGUNCiMjIyAgICAgZG9lcyBub3QgZXhpc3QgdGhhdCBtZWFucyB0aGF0IG9ubHkgaGVhZGVycyB3ZXJlIHJldHVybmVkDQojIyMgICAgIHdpdGhvdXQgYW55IGNvbnRlbnQuIHRoaXMgdG9vIGlzIGEgaW52YWxpZCBmaWxlIGRvd25sb2FkDQojIyMNCiMjIyBhcmdzOg0KIyMjICAgICAgIC0gdGhlIGZpbGUgdG8gdmVyaWZ5DQojIyMgICAgICAgLSByZXR1cm4gdmFyaWFibGUsIHdpbGwgaGF2ZSAxIGlmIGZhaWwgMCBpZiBnb29kDQojIyMNCmZ1bmN0aW9uIHZlcmlmeURvd25sb2FkKCl7DQogICAgZXZhbCAiJDI9MCINCiAgICBpZiBbICEgLWYgJDEgXTsNCiAgICB0aGVuDQogICAgICAgIGV2YWwgIiQyPTEiDQogICAgZWxpZiBncmVwICc0MDQgTm90IEZvdW5kJyAkMSA+IC9kZXYvbnVsbA0KICAgIHRoZW4NCglybSAtZiAkMQ0KICAgICAgICBldmFsICIkMj0xIg0KICAgIGVsc2UNCiAgICAgICAgZXZhbCAiJDI9MCINCiAgICBmaQ0KfQ0KDQoNCiMgY2hlY2sgZm9yIHJvb3QgdXNlcg0KaWYgWyAkVUlEIC1uZSAiMCIgXQ0KdGhlbg0KICAgZWNobyAiWW91IG11c3QgcnVuIHRoaXMgcHJvZ3JhbSB3aXRoIHJvb3QgcGVybWlzc2lvbnMuLi4iDQogICBlcnJvcg0KZmkgICANCiANCiMgY2xlYW4gdXAgaW4gY2FzZSB0aGlzIHNjcmlwdCB3YXMgcnVuIGJlZm9yZSBhbmQgZmFpbGVkDQpybSAtcmYgL3RtcC9zdG9yayAmPiAvZGV2L251bGwNCg0KIyBjcmVhdGUgL3RtcC9zdG9yayBkaXJlY3RvcnkNCm1rZGlyIC90bXAvc3RvcmsgDQppZiBbICQ/IC1uZSAiMCIgXQ0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiQ291bGQgbm90IGNyZWF0ZSB0aGUgL3RtcC9zdG9yayBkaXJlY3RvcnkuLi4iDQogICBlcnJvcg0KZmkNCg0KIyBleHBvcnQgb3VyIHJvb3QgZGlyZWN0b3J5IHRvIFN0b3JrDQplY2hvICJhcml6b25hX3N0b3JrMiIgPiAvLmV4cG9ydGRpcg0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgdGhlIC8uZXhwb3J0ZGlyIGZpbGUuLi4iDQogICBlcnJvcg0KZmkNCiANCiMgdGVsbCBzdG9yayB0aGF0IHdlIHdhbnQgdG8gYmUgc2VydmVkDQppZiBbIC1mIC9ldGMvc2xpY2VuYW1lIF0NCnRoZW4NCiAgIFNMSUNFTkFNRT1gY2F0IC9ldGMvc2xpY2VuYW1lYA0KZWxzZSANCiAgIFNMSUNFTkFNRT0kVVNFUg0KZmkNCndnZXQgLU8gL3RtcC9zdG9yay8kU0xJQ0VOQU1FICJodHRwOi8vbG9jYWxob3N0OjY0OC8kU0xJQ0VOQU1FXCRiaW5kc2NyaXB0Ig0KDQojIHZlcmlmeSB0aGF0IHRoZSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bA0KaWYgWyAhIC1mIC90bXAvc3RvcmsvJFNMSUNFTkFNRSAtbyAkPyAtbmUgMCBdDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJTdG9yayBkb2Vzbid0IHNlZW0gdG8gYmUgcnVubmluZyBvbiB0aGlzIG5vZGUuLi4iDQogICBlcnJvcg0KZmkNCg0KIyB3YWl0IGZvciBzdG9yayBzbGljZSANCmVjaG8gIldhaXRpbmcgZm9yIFN0b3JrIHRvIGFjY2VwdCBvdXIgYmluZGluZy4uLiINCndoaWxlIFsgISAtZiAvdG1wL3N0b3JrL3N0b3JrX3NheXNfZ28gXQ0KZG8NCiAgIHNsZWVwIDENCmRvbmUNCg0KIyBjaGFuZ2UgUFdEIHRvIHRoZSAvdG1wL3N0b3JrIGRpcmVjdG9yeSANCmNkIC90bXAvc3RvcmsNCmlmIFsgJD8gLW5lICIwIiBdDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJDb3VsZCBub3QgYWNjZXNzIHRoZSAvdG1wL3N0b3JrIGRpcmVjdG9yeS4uLiINCiAgIGVycm9yDQpmaQ0KDQojIGNvbmZpcm0gdGhhdCBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQgYWN0dWFsbHkgZXhpc3QNCmlmIGVjaG8gKi5ycG0gfCBncmVwICcqJyA+IC9kZXYvbnVsbA0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiRXJyb3I6IFN0b3JrIHBhY2thZ2UgZG93bmxvYWQgZmFpbGVkLi4uIg0KICAgZXJyb3INCmZpDQoNCiMgcmVtb3ZlIFN0b3JrIHBhY2thZ2VzIGFuZCBmaWxlcw0KZWNobw0KZWNobyAiUmVtb3ZpbmcgU3RvcmsgZmlsZXMuLi4iDQoNCiMgYnVpbGQgYSBsaXN0IG9mIHBhY2thZ2VzIHRvIHJlbW92ZQ0KcGFja2FnZXM9IiINCmZvciBmaWxlbmFtZSBpbiAqLnJwbQ0KZG8NCiAgIyBjb252ZXJ0IGZpbGVuYW1lIHRvIGEgcGFja2FnZSBuYW1lDQogIHBhY2s9YHJwbSAtcXAgLS1xZiAiJXtOQU1FfVxuIiAkZmlsZW5hbWVgDQogIGlmIFsgJD8gLWVxICIwIiBdDQogIHRoZW4NCiAgICBwYWNrYWdlcz0iJHBhY2thZ2VzICRwYWNrIg0KICBmaQ0KZG9uZSAgIA0KDQojIHJlbW92ZSBvbGQgU3RvcmsgcGFja2FnZXMNCnJwbSAtZSAkcGFja2FnZXMgJj4gL2Rldi9udWxsDQoNCiMgcmVtb3ZlIGFueXRoaW5nIGxlZnQgaW4gL3Vzci9sb2NhbC9zdG9yay9iaW4NCnJtIC1yZiAvdXNyL2xvY2FsL3N0b3JrL2Jpbi8qICY+IC9kZXYvbnVsbCANCg0KIyBpbnN0YWxsIFN0b3JrIHBhY2thZ2VzDQplY2hvDQplY2hvICJJbnN0YWxsaW5nIHBhY2thZ2VzLi4uIiANCg0KIyBidWlsZCBhIGxpc3Qgb2YgcGFja2FnZXMgdG8gaW5zdGFsbA0KcGFja2FnZXM9IiINCmZvciBmaWxlbmFtZSBpbiAqLnJwbQ0KZG8NCiAgcGFja2FnZXM9IiRwYWNrYWdlcyAkZmlsZW5hbWUiDQpkb25lICAgDQoNCiMgaW5zdGFsbCB0aGUgbmV3IHN0b3JrIHBhY2thZ2VzDQpycG0gLWkgJHBhY2thZ2VzDQoNCiMgcmVwb3J0IHBhY2thZ2UgaW5zdGFsbGF0aW9uIGVycm9ycw0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgZWNobyAiV2FybmluZzogUG9zc2libGUgZXJyb3IgaW5zdGFsbGluZyBTdG9yayBwYWNrYWdlcy4uLiINCmZpDQoNCiMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCmNkICRPTERQV0QNCg0KIyBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMNCnJtIC1yZiAvdG1wL3N0b3JrICY+IC9kZXYvbnVsbA0KDQojIFNFRSBUTy1ETyAxDQojY3JlYXRlIHRoZSBlcXVpZmF4IGNlcnRpZmljYXRlIHRvIHVzZSBmb3IgY3VybA0KI2NyZWF0ZUNlcnRpZmljYXRlDQoNCiMgVE8tRE8gMQ0KIyBpbXBsZW1lbnQgdGhlIGJlbG93IGluIHRoZSBiZWdnaW5pbmcgb2Ygc3RvcmsucHkNCiNhdHRlbXB0IHRvIGRvd25sb2FkIHRoZSB1c2VycyBwdWJsaWMga2V5IGZyb20gdGhlIHJlcG9zaXRvcnkNCiNkb3dubG9hZE5SMDYgInVzZXItdXBsb2FkL3B1YmtleXMvJFNMSUNFTkFNRS5wdWJsaWNrZXkiICIvdXNyL2xvY2FsL3N0b3JrL3Zhci8kU0xJQ0VOQU1FLnB1YmxpY2tleSIgUkVUDQoNCiNpZiBbICRSRVQgLW5lIDAgXTsNCiN0aGVuDQojICAgZWNobw0KIyAgIGVjaG8gIkNvdWxkIG5vdCBmZXRjaCB5b3VyIHB1YmxpYyBrZXkgZnJvbSB0aGUgcmVwb3NpdG9yeS4iDQojICAgZWNobyAiSWYgeW91IHdhbnQgdG8gdXBsb2FkIG9uZSBmb3IgdGhlIG5leHQgdGltZSB5b3UgcnVuIg0KIyAgIGVjaG8gInRoZSBpbml0c2NyaXB0IHBsZWFzZSB2aXNpdCINCiMgICBlY2hvICJodHRwOi8vbnIwNi5jcy5hcml6b25hLmVkdS90ZXN0cGhwL3VwbG9hZC5waHAiDQojICAgZWNobw0KI2ZpDQoNCiNhdHRlbXB0IHRvIGRvd25sb2FkIHRoZSB1c2VycyBzdG9yay5jb25mIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQ0KI2Rvd25sb2FkTlIwNiAidXNlci11cGxvYWQvY29uZi8kU0xJQ0VOQU1FLnN0b3JrLmNvbmYiICIvdXNyL2xvY2FsL3N0b3JrL2V0Yy9zdG9yay5jb25mLnVzZXJzIiBSRVQNCg0KI2lmIFsgJFJFVCAtbmUgMCBdOw0KI3RoZW4NCiMgICBlY2hvDQojICAgZWNobyAiQ291bGQgbm90IGZldGNoIHlvdXIgc3RvcmsuY29uZiBmaWxlIGZyb20gdGhlIHJlcG9zaXRvcnkuIg0KIyAgIGVjaG8gIklmIHlvdSB3YW50IHRvIHVwbG9hZCBvbmUgZm9yIHRoZSBuZXh0IHRpbWUgeW91IHJ1biINCiMgICBlY2hvICJ0aGUgaW5pdHNjcmlwdCBwbGVhc2UgdmlzaXQiDQojICAgZWNobyAiaHR0cDovL25yMDYuY3MuYXJpem9uYS5lZHUvdGVzdHBocC91cGxvYWQucGhwIg0KIyAgIGVjaG8gIlN0b3JrIHdpbGwgd29yayB3aXRob3V0IGEgY29uZmlndXJhdGlvbiBmaWxlIGJ1dCB0byBtYWtlIG9uZSINCiMgICBlY2hvICJwbGVhc2UgcGxhY2UgYSBmaWxlIG5hbWVkIHN0b3JrLmNvbmYgaW4gL3Vzci9sb2NhbC9zdG9yay9ldGMiDQojICAgZWNobyAicmVmZXIgdG8gdGhlIG1hbnVhbCBmb3IgbW9yZSBkaXJlY3Rpb25zIG9yIGVtYWlsOiINCiMgICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIg0KIyAgIGVjaG8NCiNmaQ0KDQojZG9udCBuZWVkIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBjb25mIGZpbGUNCiNiZWNhdXNlIGl0IHNob3VsZCBiZSBmaXhlZCBpbiB0aGUgbmV3IHJwbXMNCiNvdmVyV3JpdGVDb25mDQoNCiMgcnVuIHN0b3JrIHRvIHVwZGF0ZSBrZXlmaWxlcyBhbmQgZG93bmxvYWQgcGFja2FnZSBsaXN0cw0KZWNobw0KZWNobyAiQXR0ZW1wdGluZyB0byBjb21tdW5pY2F0ZSB3aXRoIHN0b3JrLi4uIg0KaWYgc3RvcmsgDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJDb25ncmF0dWxhdGlvbnMsIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBib3VuZCB0byBzdG9yayEiDQogICBlY2hvDQogICBlY2hvICJGb3IgaGVscCwgeW91IG1heSB0eXBlIHN0b3JrIC0taGVscCINCiAgIGVjaG8NCiAgICNlY2hvICJUaGVyZSBpcyBhbHNvIGEgc3RvcmtxdWVyeSBjb21tYW5kIHRoYXQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIg0KICAgI2VjaG8gImFib3V0IHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LiINCiAgIGVjaG8NCiAgIGVjaG8gIkZvciBtb3JlIGhlbHAsIHZpc2l0IHRoZSBzdG9yayBwcm9qZWN0IG9ubGluZSBhdCINCiAgIGVjaG8gImh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvc3RvcmsvLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIiANCiAgICNybSAtZiAkQ0VSVCA+IC9kZXYvbnVsbA0KZWxzZQ0KICAgZWNobw0KICAgZWNobyAiQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluc3RhbGwgZmluYWxpemF0aW9uLi4uICBQbGVhc2UgY29udGFjdCINCiAgIGVjaG8gInN0b3JrLXN1cHBvcnRAY3MuYXJpem9uYS5lZHUgZm9yIGFzc2lzdGFuY2UuIg0KICAgI3JtIC1mICRDRVJUID4gL2Rldi9udWxsDQogICBleGl0IDENCmZpDQoNCiMgZG9uZQ0KZXhpdCAwDQo=', 'name': 'arizona_stork_2', 'encoding': 'base64'}, {'initscript_id': 9, 'script': 'IyEvYmluL2Jhc2gNCmNkIC8NCnJtIC1mIHN0YXJ0X3B1cnBsZQ0Kd2dldCBodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmRlaXNlbnN0L3B1cnBsZS9zdGFydF9wdXJwbGUNCmNobW9kIDc1NSBzdGFydF9wdXJwbGUNCnN1IHByaW5jZXRvbl9wdXJwbGUgLWMgJy4vc3RhcnRfcHVycGxlJw0K', 'name': 'princeton_purple', 'encoding': 'base64'}, {'initscript_id': 6, 'script': 'IyEgL2Jpbi9zaA0KDQojIHNhdmUgb3JpZ2luYWwgUFdEDQpPTERQV0Q9JFBXRA0KDQojIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbg0KZXJyb3IoKQ0Kew0KICAgZWNobw0KICAgZWNobyAiUGxlYXNlIEUtbWFpbCBzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGlmIHlvdSBiZWxpZXZlIHlvdSBoYXZlIiANCiAgIGVjaG8gInJlY2VpdmVkIHRoaXMgbWVzc2FnZSBpbiBlcnJvci4iDQoNCiAgICMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCiAgIGNkICRPTERQV0QNCiAgIGV4aXQgMQ0KfQ0KDQojIGNoZWNrIGZvciByb290IHVzZXINCmlmIFsgJFVJRCAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8gJ1lvdSBtdXN0IGJlIHJvb3QgdG8gcnVuIHRoaXMgcHJvZ3JhbS4uLicNCiAgIGVycm9yDQpmaSAgIA0KIA0KIyBDbGVhbiB1cCBpbiBjYXNlIEkgcmFuIHRoaXMgYmVmb3JlDQpybSAtZiAvdG1wL3N0b3JrKiA+IC9kZXYvbnVsbCAyPiYxDQoNCiMgRmlyc3Qgb2YgYWxsIGV4cG9ydCBvdXIgcm9vdCBkaXJlY3RvcnkgdG8gU3RvcmsNCmVjaG8gImFyaXpvbmFfc3RvcmsiID4gLy5leHBvcnRkaXINCiANCiMgTm93IHRlbGwgc3RvcmsgdGhhdCB3ZSB3YW50IHRvIGJlIHNlcnZlZA0KaWYgWyAtZiAvZXRjL3NsaWNlbmFtZSBdDQp0aGVuDQogICBTTElDRU5BTUU9YGNhdCAvZXRjL3NsaWNlbmFtZWANCmVsc2UgDQogICBTTElDRU5BTUU9JFVTRVINCmZpDQoNCndnZXQgaHR0cDovL2xvY2FsaG9zdDo2NDAvJFNMSUNFTkFNRQ0KDQojIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwNCmlmIFsgISAtZiAkU0xJQ0VOQU1FIC1vICQ/IC1uZSAwIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIlN0b3JrIGRvZXNuJ3Qgc2VlbSB0byBiZSBydW5uaW5nIG9uIHRoaXMgbm9kZS4uLiINCiAgIGVycm9yDQpmaQ0KDQojIHdhaXQgZm9yIHN0b3JrIHNsaWNlIA0KZWNobyAiV2FpdGluZyBmb3IgU3RvcmsgdG8gYWNjZXB0IG91ciBiaW5kaW5nLi4uIg0Kd2hpbGUgWyAhIC1mIC90bXAvc3Rvcmtfc2F5c19nbyBdDQpkbw0KICAgc2xlZXAgMQ0KZG9uZQ0KDQojIGNoYW5nZSBQV0QgdG8gdGhlIC90bXAgZGlyZWN0b3J5IA0KY2QgL3RtcA0KaWYgWyAkPyAtbmUgIjAiIF0NCnRoZW4NCiAgIGVjaG8NCiAgIGVjaG8gIkNvdWxkIG5vdCBhY2Nlc3MgdGhlIC90bXAgZGlyZWN0b3J5Li4uIg0KICAgZXJyb3INCmZpDQoNCiMgY29uZmlybSB0aGF0IHBhY2thZ2VzIHRvIGJlIGluc3RhbGxlZCBhY3R1YWxseSBleGlzdA0KaWYgZWNobyAqLnJwbSB8IGdyZXAgJyonID4gL2Rldi9udWxsDQp0aGVuDQogICBlY2hvDQogICBlY2hvICJFcnJvcjogU3RvcmsgcGFja2FnZSBkb3dubG9hZCBmYWlsZWQuLi4iDQogICBlcnJvcg0KZmkNCg0KIyBpbnN0YWxsIFN0b3JrIHBhY2thZ2VzDQplY2hvICJJbnN0YWxsaW5nIHBhY2thZ2VzLi4uIiANCmZvciBwYWNrIGluICoucnBtDQpkbw0KICAgIyByZW1vdmUgdGhlIG9sZCBzdG9yayBwYWNrYWdlLCBpZiBhbnkNCiAgIHJwbSAtZSBgcnBtIC1xcCAtLXFmICIle05BTUV9XG4iICRwYWNrYCA+IC9kZXYvbnVsbCAyPiYxDQoNCiAgICMgcmVtb3ZlIGFueXRoaW5nIGxlZnQgaW4gL3Vzci9sb2NhbC9zdG9yay9iaW4NCiAgIHJtIC1yZiAvdXNyL2xvY2FsL3N0b3JrL2Jpbi8qID4gL2Rldi9udWxsIDI+JjENCg0KICAgIyBpbnN0YWxsIHRoZSBuZXcgc3RvcmsgcGFja2FnZQ0KICAgcnBtIC1pICRwYWNrDQoNCiAgICMgcmVwb3J0IHBhY2thZ2UgaW5zdGFsbGF0aW9uIGVycm9ycw0KICAgaWYgWyAkPyAtbmUgIjAiIF0NCiAgIHRoZW4NCiAgICAgZWNobyAiV2FybmluZzogUG9zc2libGUgZXJyb3IgaW5zdGFsbGluZyBTdG9yayBwYWNrYWdlOiAkcGFjay4uLiINCiAgIGZpDQpkb25lDQoNCiMgcmVzdG9yZSBvcmlnaW5hbCBQV0QNCmNkICRPTERQV0QNCg0KIyBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMNCnJtIC1mIC90bXAvc3RvcmsqID4gL2Rldi9udWxsIDI+JjENCnJtICRTTElDRU5BTUUqIA0KDQojIHJ1biBzdG9yayB0byB1cGRhdGUga2V5ZmlsZXMgYW5kIGRvd25sb2FkIHBhY2thZ2UgbGlzdHMNCmVjaG8gIkF0dGVtcHRpbmcgdG8gY29tbXVuaWNhdGUgd2l0aCBzdG9yay4uLiINCmlmIHN0b3JrIA0KdGhlbg0KICAgZWNobw0KICAgZWNobyAiQ29uZ3JhdHVsYXRpb25zLCB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgYm91bmQgdG8gc3RvcmshIg0KICAgZWNobw0KICAgZWNobyAiRm9yIGhlbHAsIHlvdSBtYXkgdHlwZSBzdG9yayAtLWhlbHAgIg0KICAgZWNobw0KICAgZWNobyAiVGhlcmUgaXMgYWxzbyBhIHN0b3JrcXVlcnkgY29tbWFuZCB0aGF0IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiINCiAgIGVjaG8gImFib3V0IHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LiINCiAgIGVjaG8NCiAgIGVjaG8gIkZvciBtb3JlIGhlbHAsIHZpc2l0IHRoZSBzdG9yayBwcm9qZWN0IG9ubGluZSBhdCINCiAgIGVjaG8gImh0dHA6Ly93d3cuY3MuYXJpem9uYS5lZHUvc3RvcmsvLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhZGRpdGlvbmFsIGFzc2lzdGFuY2UuIiANCmVsc2UNCiAgIGVjaG8NCiAgIGVjaG8gIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBpbnN0YWxsIGZpbmFsaXphdGlvbi4uLiAgUGxlYXNlIGNvbnRhY3QiDQogICBlY2hvICJzdG9yay1zdXBwb3J0QGNzLmFyaXpvbmEuZWR1IGZvciBhc3Npc3RhbmNlLiINCiAgIGV4aXQgMQ0KZmkNCg0KIw0KIyBIZWxsbyBXb3JsZCBkZW1vIGNvZGUNCiMNCg0KIyBQdWJsaWMga2V5IGZvciB0aGlzIGRlbW8NCmNhdCA+L3Vzci9sb2NhbC9zdG9yay92YXIva2V5cy9oZWxsby5wdWJsaWNrZXkgPDwiRU9GIg0KLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0NCk1Gd3dEUVlKS29aSWh2Y05BUUVCQlFBRFN3QXdTQUpCQU1XcVE3K2VxQVljNlRPSUJPbkJyRnZqYjlnRVViaWgNCkkxd0Nyeld4a09aa01BcXFmY1RuMW9tcCtLMGd0cUtBK3VaNEIzRGlQRXI0Q0V0Myt5MmJlMGtDQXdFQUFRPT0NCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ0KRU9GDQpzZWQgLWkgLWUgJ3MvXnVzZXJuYW1lLiovdXNlcm5hbWUgPSBoZWxsby8nIC91c3IvbG9jYWwvc3RvcmsvZXRjL3N0b3JrLmNvbmYNCg0KIyBJbnN0YWxsIFJQTQ0Kc3RvcmsgdXBncmFkZSBoZWxsbw0KDQojIGVuZA0KZXhpdCAwDQo=', 'name': 'princeton_hello_stork', 'encoding': 'base64'}, {'initscript_id': 10, 'script': 'IyEvYmluL2Jhc2gNCg0KIyBJbml0IHNjcmlwdCBmb3IgdGhlIFBsYW5ldExhYiAiSGVsbG8gV29ybGQiIGRlbW8gdXNpbmcgR29vZ2xlIEVhcnRoLg0KIyBJbnN0YWxscyBhIGNyb250YWIgZW50cnkgb24gdGhlIG5vZGUgdGhhdCBwaG9uZXMgaG9tZSB0byB0aGUgc2VydmVyDQojIGV2ZXJ5IHRocmVlIG1pbnV0ZXMuDQoNClNFUlZFUj0xMjguMTEyLjEzOS43Mzo4MDQyCQkjIHBsYW5ldGxhYi0zLmNzLnByaW5jZXRvbi5lZHUNCg0KL3Vzci9iaW4vY3VybCAtcyBodHRwOi8vJFNFUlZFUi8NCmVjaG8gIiovNSAqICogKiAqIC91c3IvYmluL2N1cmwgLXMgaHR0cDovLyRTRVJWRVIvIiB8IGNyb250YWIgLQ0KL3NiaW4vY2hrY29uZmlnIGNyb25kIG9uDQo=', 'name': 'princeton_hello', 'encoding': 'base64'}]]) + +# Convert plc_initscript.initscript_id to raw initscript attribute +for slice_attribute in GetSliceAttributes({'name': 'plc_initscript'}): + id = slice_attribute['slice_attribute_id'] + slice_id = slice_attribute['slice_id'] + initscript_id = int(slice_attribute['value']) + + # Delete old attribute + DeleteSliceAttribute(id) + + if initscript_id not in initscripts: + print "Warning: Missing initscript %d" % initscript_id + continue + + initscript = base64.b64decode(initscripts[initscript_id]['script']) + + # Add as initscript attribute + AddSliceAttribute(slice_id, 'initscript', initscript) + +# Add our custom yum.conf entries +conf_file_id = AddConfFile({ + 'enabled': True, + 'source': 'PlanetLabConf/yum.conf.php?gpgcheck=1&alpha', + 'dest': '/etc/yum.conf', + 'file_permissions': '644', + 'file_owner': 'root', + 'file_group': 'root', + 'preinstall_cmd': '', + 'postinstall_cmd': '', + 'error_cmd': '', + 'ignore_cmd_errors': False, + 'always_update': False}) +AddConfFileToNodeGroup(conf_file_id, 'Alpha') + +conf_file_id = AddConfFile({ + 'enabled': True, + 'source': 'PlanetLabConf/yum.conf.php?gpgcheck=1&beta', + 'dest': '/etc/yum.conf', + 'file_permissions': '644', + 'file_owner': 'root', + 'file_group': 'root', + 'preinstall_cmd': '', + 'postinstall_cmd': '', + 'error_cmd': '', + 'ignore_cmd_errors': False, + 'always_update': False}) +AddConfFileToNodeGroup(conf_file_id, 'Beta') + +conf_file_id = AddConfFile({ + 'enabled': True, + 'source': 'PlanetLabConf/yum.conf.php?gpgcheck=1&rollout', + 'dest': '/etc/yum.conf', + 'file_permissions': '644', + 'file_owner': 'root', + 'file_group': 'root', + 'preinstall_cmd': '', + 'postinstall_cmd': '', + 'error_cmd': '', + 'ignore_cmd_errors': False, + 'always_update': False}) +AddConfFileToNodeGroup(conf_file_id, 'Rollout') + +# Add OneLab as a peer +onelab = {'peername': u'OneLab', 'peer_url': u'https://onelab-plc.inria.fr/PLCAPI/', 'key': u'-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1.4.5 (GNU/Linux)\n\nmQGiBEW0kJMRBACaTlrW0eYlQwkzRuMFfEYMwyqBT9Bm6R4g68SJ5GdjCRu3XCnd\nGTGCFF4ewOu6IcUmZDv39eqxShBWyx+JqBogYPGNvPrj07jXXKaSBCM7TPk+9kMW\nPziIxSClvO15XaPKv89c6kFaEBe0z1xsoMB/TNoLmhFUxmc24O7JnEqmYwCgjzIS\nHP7u9KIOYk1ZlTdOtwyRxVkD/1uYbPzD0Qigf8uF9ADzx7I4F1ATd2ezYq0EfzhD\nTDa15FPWwA7jm+Mye//ovT01Ju6JQtCU4N9wRsV2Yy2tWcWFZiYt+BISPVS0lJDx\nQ2Cd2+kEWyl9ByL9/ACHmCUz0OOaz9j1x+GpJLArjUdZSJOs68kPw90F62mrLHfg\nYCHpA/0ZcdJQG9QYNZ67KMFqNPho+uRww5/7kxQ4wkSyP7EK3QUVgXG5OWZ/1mPZ\njon9N04nnjrL9qoQv7m04ih3rmqyGy1MsicNCoys0RNh1eavPdAsXD1ZEXnWPA7z\naC37hxUaRPP3hH+1ifjPpAWQX1E89MK2y2zQpZipvEOAO2Lw8LRCT25lTGFiIENl\nbnRyYWwgKGh0dHA6Ly9vbmVsYWItcGxjLmlucmlhLmZyLykgPHN1cHBvcnRAb25l\nLWxhYi5vcmc+iGAEExECACAFAkW0kJMCGyMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX\ngAAKCRBuu7E0vzFd9fvbAJ9QB2neTSbAN5HuoigIbuKzTUCTjQCeM/3h7/OmjD+z\n6yXtWD4Fzyfr7fSIYAQTEQIAIAUCRbibbAIbIwYLCQgHAwIEFQIIAwQWAgMBAh4B\nAheAAAoJEG67sTS/MV31w3AAn2t6qb94HIPmqCoD/ptK34Dv+VW0AJ4782ffPPnk\nbVXHU/Sx31QCoFmj34hgBBMRAgAgBQJFtJJBAhsjBgsJCAcDAgQVAggDBBYCAwEC\nHgECF4AACgkQbruxNL8xXfU5UQCeKqXWeNzTqdMqj/qHPkp1JCb+isEAn2AzDnde\nITF0aYd02RAKsU4sKePEtEJPbmVMYWIgQ2VudHJhbCAoaHR0cDovL29uZWxhYi1w\nbGMuaW5yaWEuZnIvKSA8c3VwcG9ydEBvbmUtbGFiLm9yZz6IYAQTEQIAIAUCRbi2\npgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEG67sTS/MV31W4AAn0rW5yjR\n2a8jPP/V44gw1JhqnE8jAKCMAEh0nPjvle5oLEGectC3Es9Pm7kBDQRFtJCUEAQA\nhp38fNVy/aJiPg2lUKKnA6KjrRm3LxD66N8MSWfxGCIYzQRJHhmZWnS+m1DDOjdu\nFG9FM6QrsCRRcEQuvhKI2ORFfK75D24lj4QaXzw7vfBbAibTaDsYa0b5LxfR5pGj\nYPCQ5LrRex+Ws3DrB3acJE5/XnYJZ+rUO1ZJlm00FTMAAwUD/Ai4ZUunVB8F0VqS\nhJgDYQF08/OlAnDAcbL//P5dtXdztUNSgXZM4wW/XFnDvAsBuRnbfkT/3BeptM9L\neEbdrMi4eThLstSl13ITOsZbSL3i/2OO9sPAxupWzRWOXcQILpqR2YMRK1EapO+M\nNhjrgxU9JpMXz24FESocczSyywDXiEkEGBECAAkFAkW0kJQCGwwACgkQbruxNL8x\nXfXGxQCfZqzSqinohParWaHv+4XNoIz2B7IAn2Ge0O5wjYZeV/joulkTXfPKm7Iu\n=SsZg\n-----END PGP PUBLIC KEY BLOCK-----\n', 'cacert': u'Certificate:\r\n Data:\r\n Version: 3 (0x2)\r\n Serial Number: 67109883 (0x40003fb)\r\n Signature Algorithm: sha1WithRSAEncryption\r\n Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=G\r\n Validity\r\n Not Before: Mar 14 20:30:00 2006 GMT\r\n Not After : Mar 14 23:59:00 2013 GMT\r\n Subject: C=BE, O=Cybertrust, OU=Educational CA, CN=Cybertrust Educationa\r\n Subject Public Key Info:\r\n Public Key Algorithm: rsaEncryption\r\n RSA Public Key: (2048 bit)\r\n Modulus (2048 bit):\r\n 00:95:22:a1:10:1d:4a:46:60:6e:05:91:9b:df:83:\r\n c2:ed:12:b2:5a:7c:f8:ab:e1:f8:50:5c:28:2c:7e:\r\n 7e:00:38:93:b0:8b:4a:f1:c2:4c:3c:10:2c:3c:ef:\r\n b0:ec:a1:69:2f:b9:fc:cc:08:14:6b:8d:4f:18:f3:\r\n 83:d2:fa:a9:37:08:20:aa:5c:aa:80:60:a2:d5:a5:\r\n 22:00:cf:5a:e5:b4:97:df:ba:1e:be:5c:8e:17:19:\r\n 66:fd:af:9f:7c:7b:89:b2:0e:24:d8:c7:ab:63:c4:\r\n 95:32:8d:48:e6:63:59:7d:04:b8:33:a8:bd:d7:5d:\r\n 64:bc:63:b5:f7:4d:28:fd:f9:06:72:31:5c:ba:45:\r\n 94:65:a3:d2:b4:58:ec:3b:61:58:44:a3:2f:62:b3:\r\n 9b:80:b4:82:fd:d5:c7:cc:51:25:e5:95:3f:47:2f:\r\n 30:7b:ac:c8:78:6e:e2:e1:6d:27:eb:3d:cc:01:82:\r\n e8:35:77:8d:ab:58:bb:55:d1:d5:a4:81:56:8d:1c:\r\n d0:14:b1:b0:06:de:a0:91:22:f3:f0:a8:34:17:47:\r\n c6:e0:3e:f6:0c:5a:ac:7e:50:4b:cd:e1:69:6e:06:\r\n fc:06:7e:6a:4d:b4:95:99:a0:59:5c:35:66:ec:d9:\r\n 49:d4:17:e0:60:b0:5d:a5:d7:1a:e2:2a:6e:66:f2:\r\n af:1d\r\n Exponent: 65537 (0x10001)\r\n X509v3 extensions:\r\n X509v3 CRL Distribution Points: \r\n URI:http://www.public-trust.com/cgi-bin/CRL/2018/cdp.crl\r\n\r\n X509v3 Subject Key Identifier: \r\n 65:65:A3:3D:D7:3B:11:A3:0A:07:25:37:C9:42:4A:5B:76:77:50:E1\r\n X509v3 Certificate Policies: \r\n Policy: 1.3.6.1.4.1.6334.1.0\r\n CPS: http://www.public-trust.com/CPS/OmniRoot.html\r\n\r\n X509v3 Authority Key Identifier: \r\n DirName:/C=US/O=GTE Corporation/OU=GTE CyberTrust Solutions, Inc\r\n serial:01:A5\r\n\r\n X509v3 Key Usage: critical\r\n Certificate Sign, CRL Sign\r\n X509v3 Basic Constraints: critical\r\n CA:TRUE, pathlen:0\r\n Signature Algorithm: sha1WithRSAEncryption\r\n 43:b3:45:83:54:71:c4:1f:dc:b2:3c:6b:4e:bf:26:f2:4e:f2:\r\n ad:9a:5b:fa:86:37:88:e8:14:6c:41:18:42:5f:ef:65:3e:eb:\r\n 03:77:a0:b7:9e:75:7a:51:7c:bb:15:5b:b8:af:91:a0:34:92:\r\n 53:ed:7f:2a:49:84:ac:b9:80:4b:b5:c7:b2:23:22:fb:eb:d8:\r\n fb:6e:c9:3c:f3:d2:d1:bb:be:c9:1c:ff:6d:01:db:69:80:0e:\r\n 99:a5:ea:9e:7b:97:98:8f:b7:cf:22:9c:b3:b8:5d:e5:a9:33:\r\n 17:74:c6:97:37:0f:b4:e9:26:82:5f:61:0b:3f:1e:3d:64:e9:\r\n 2b:9b\r\n-----BEGIN CERTIFICATE-----\r\nMIIEQjCCA6ugAwIBAgIEBAAD+zANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV\r\nUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\r\ncnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\r\nb2JhbCBSb290MB4XDTA2MDMxNDIwMzAwMFoXDTEzMDMxNDIzNTkwMFowXzELMAkG\r\nA1UEBhMCQkUxEzARBgNVBAoTCkN5YmVydHJ1c3QxFzAVBgNVBAsTDkVkdWNhdGlv\r\nbmFsIENBMSIwIAYDVQQDExlDeWJlcnRydXN0IEVkdWNhdGlvbmFsIENBMIIBIjAN\r\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlSKhEB1KRmBuBZGb34PC7RKyWnz4\r\nq+H4UFwoLH5+ADiTsItK8cJMPBAsPO+w7KFpL7n8zAgUa41PGPOD0vqpNwggqlyq\r\ngGCi1aUiAM9a5bSX37oevlyOFxlm/a+ffHuJsg4k2MerY8SVMo1I5mNZfQS4M6i9\r\n111kvGO1900o/fkGcjFcukWUZaPStFjsO2FYRKMvYrObgLSC/dXHzFEl5ZU/Ry8w\r\ne6zIeG7i4W0n6z3MAYLoNXeNq1i7VdHVpIFWjRzQFLGwBt6gkSLz8Kg0F0fG4D72\r\nDFqsflBLzeFpbgb8Bn5qTbSVmaBZXDVm7NlJ1BfgYLBdpdca4ipuZvKvHQIDAQAB\r\no4IBbzCCAWswRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL3d3dy5wdWJsaWMtdHJ1\r\nc3QuY29tL2NnaS1iaW4vQ1JMLzIwMTgvY2RwLmNybDAdBgNVHQ4EFgQUZWWjPdc7\r\nEaMKByU3yUJKW3Z3UOEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEF\r\nBQcCARYtaHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL0NQUy9PbW5pUm9vdC5o\r\ndG1sMIGJBgNVHSMEgYEwf6F5pHcwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dU\r\nRSBDb3Jwb3JhdGlvbjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25z\r\nLCBJbmMuMSMwIQYDVQQDExpHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdIICAaUw\r\nDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQEF\r\nBQADgYEAQ7NFg1RxxB/csjxrTr8m8k7yrZpb+oY3iOgUbEEYQl/vZT7rA3egt551\r\nelF8uxVbuK+RoDSSU+1/KkmErLmAS7XHsiMi++vY+27JPPPS0bu+yRz/bQHbaYAO\r\nmaXqnnuXmI+3zyKcs7hd5akzF3TGlzcPtOkmgl9hCz8ePWTpK5s=\r\n-----END CERTIFICATE-----\r\nCertificate:\r\n Data:\r\n Version: 1 (0x0)\r\n Serial Number: 421 (0x1a5)\r\n Signature Algorithm: md5WithRSAEncryption\r\n Issuer: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root\r\n Validity\r\n Not Before: Aug 13 00:29:00 1998 GMT\r\n Not After : Aug 13 23:59:00 2018 GMT\r\n Subject: C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root\r\n Subject Public Key Info:\r\n Public Key Algorithm: rsaEncryption\r\n RSA Public Key: (1024 bit)\r\n Modulus (1024 bit):\r\n 00:95:0f:a0:b6:f0:50:9c:e8:7a:c7:88:cd:dd:17:\r\n 0e:2e:b0:94:d0:1b:3d:0e:f6:94:c0:8a:94:c7:06:\r\n c8:90:97:c8:b8:64:1a:7a:7e:6c:3c:53:e1:37:28:\r\n 73:60:7f:b2:97:53:07:9f:53:f9:6d:58:94:d2:af:\r\n 8d:6d:88:67:80:e6:ed:b2:95:cf:72:31:ca:a5:1c:\r\n 72:ba:5c:02:e7:64:42:e7:f9:a9:2c:d6:3a:0d:ac:\r\n 8d:42:aa:24:01:39:e6:9c:3f:01:85:57:0d:58:87:\r\n 45:f8:d3:85:aa:93:69:26:85:70:48:80:3f:12:15:\r\n c7:79:b4:1f:05:2f:3b:62:99\r\n Exponent: 65537 (0x10001)\r\n Signature Algorithm: md5WithRSAEncryption\r\n 6d:eb:1b:09:e9:5e:d9:51:db:67:22:61:a4:2a:3c:48:77:e3:\r\n a0:7c:a6:de:73:a2:14:03:85:3d:fb:ab:0e:30:c5:83:16:33:\r\n 81:13:08:9e:7b:34:4e:df:40:c8:74:d7:b9:7d:dc:f4:76:55:\r\n 7d:9b:63:54:18:e9:f0:ea:f3:5c:b1:d9:8b:42:1e:b9:c0:95:\r\n 4e:ba:fa:d5:e2:7c:f5:68:61:bf:8e:ec:05:97:5f:5b:b0:d7:\r\n a3:85:34:c4:24:a7:0d:0f:95:93:ef:cb:94:d8:9e:1f:9d:5c:\r\n 85:6d:c7:aa:ae:4f:1f:22:b5:cd:95:ad:ba:a7:cc:f9:ab:0b:\r\n 7a:7f\r\n-----BEGIN CERTIFICATE-----\r\nMIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD\r\nVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\r\nbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\r\nb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV\r\nUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\r\ncnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\r\nb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH\r\niM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS\r\nr41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4\r\n04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r\r\nGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9\r\n3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P\r\nlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\r\n-----END CERTIFICATE-----\r\n'} + +AddPeer(onelab) diff --git a/trunk/tools/upgrade-db.py b/trunk/tools/upgrade-db.py new file mode 100755 index 0000000..b7614f0 --- /dev/null +++ b/trunk/tools/upgrade-db.py @@ -0,0 +1,457 @@ +#!/usr/bin/python +# +# Tool for upgrading/converting a db +# Requirements: +# 1) Databse Schema - schema for the new database you what to upgrade to +# 2) Config File - the config file that describes how to convert the db +# +# Notes: +# 1) Will attempt to convert the db defined in /etc/planetlab/plc_config +# 2) Does not automatically drop archived database. They must be removed +# manually + +import sys +import os +import getopt +import pgdb + +config = {} +config_file = "/etc/planetlab/plc_config" +execfile(config_file, config) +upgrade_config_file = "plcdb.3-4.conf" +schema_file = "planetlab4.sql" +temp_dir = "/tmp" + + +def usage(): + print "Usage: %s [OPTION] UPGRADE_CONFIG_FILE " % sys.argv[0] + print "Options:" + print " -s, --schema=FILE Upgraded Database Schema" + print " -t, --temp-dir=DIR Temp Directory" + print " --help This message" + sys.exit(1) + +try: + (opts, argv) = getopt.getopt(sys.argv[1:], + "s:d:", + ["schema=", + "temp-dir=", + "help"]) +except getopt.GetoptError, err: + print "Error: ", err.msg + usage() + +for (opt, optval) in opts: + if opt == "-s" or opt == "--schema": + schema_file = optval + elif opt == "-d" or opt == "--temp-dir": + temp_dir = optval + elif opt == "--help": + usage() +try: + upgrade_config_file = argv[0] +except IndexError: + print "Error: too few arguments" + usage() + +schema = {} +inserts = [] +schema_items_ordered = [] +sequences = {} +temp_tables = {} + + +# load conf file for this upgrade +try: + upgrade_config = {} + execfile(upgrade_config_file, upgrade_config) + upgrade_config.pop('__builtins__') + db_version_previous = upgrade_config['DB_VERSION_PREVIOUS'] + db_version_new = upgrade_config['DB_VERSION_NEW'] + +except IOError, fault: + print "Error: upgrade config file (%s) not found. Exiting" % \ + (fault) + sys.exit(1) +except KeyError, fault: + print "Error: %s not set in upgrade confing (%s). Exiting" % \ + (fault, upgrade_config_file) + sys.exit(1) + + + + +def connect(): + db = pgdb.connect(user = config['PLC_DB_USER'], + database = config['PLC_DB_NAME']) + return db + +def archive_db(database, archived_database): + + archive_db = " dropdb -U postgres %s > /dev/null 2>&1;" \ + " psql template1 postgres -qc " \ + " 'ALTER DATABASE %s RENAME TO %s;';" % \ + (archived_database, database, archived_database) + exit_status = os.system(archive_db) + if exit_status: + print "Error: unable to archive database. Upgrade failed" + sys.exit(1) + #print "Status: %s has been archived. now named %s" % (database, archived_database) + + +def encode_utf8(inputfile_name, outputfile_name): + # rewrite a iso-8859-1 encoded file in utf8 + try: + inputfile = open(inputfile_name, 'r') + outputfile = open(outputfile_name, 'w') + for line in inputfile: + if line.upper().find('SET CLIENT_ENCODING') > -1: + continue + outputfile.write(unicode(line, 'iso-8859-1').encode('utf8')) + inputfile.close() + outputfile.close() + except: + print 'error encoding file' + raise + +def create_item_from_schema(item_name): + + try: + (type, body_list) = schema[item_name] + exit_status = os.system('psql %s %s -qc "%s" > /dev/null 2>&1' % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'],"".join(body_list) ) ) + if exit_status: + raise Exception + except Exception, fault: + print 'Error: create %s failed. Check schema.' % item_name + sys.exit(1) + raise fault + + except KeyError: + print "Error: cannot create %s. definition not found in %s" % \ + (key, schema_file) + return False + +def fix_row(row, table_name, table_fields): + + if table_name in ['nodenetworks']: + # convert str bwlimit to bps int + bwlimit_index = table_fields.index('bwlimit') + if isinstance(row[bwlimit_index], int): + pass + elif row[bwlimit_index].find('mbit') > -1: + row[bwlimit_index] = int(row[bwlimit_index].split('mbit')[0]) \ + * 1000000 + elif row[bwlimit_index].find('kbit') > -1: + row[bwlimit_index] = int(row[bwlimit_index].split('kbit')[0]) \ + * 1000 + elif table_name in ['slice_attribute']: + # modify some invalid foreign keys + attribute_type_index = table_fields.index('attribute_type_id') + if row[attribute_type_index] == 10004: + row[attribute_type_index] = 10016 + elif row[attribute_type_index] == 10006: + row[attribute_type_index] = 10017 + elif row[attribute_type_index] in [10031, 10033]: + row[attribute_type_index] = 10037 + elif row[attribute_type_index] in [10034, 10035]: + row[attribute_type_index] = 10036 + elif table_name in ['slice_attribute_types']: + type_id_index = table_fields.index('attribute_type_id') + if row[type_id_index] in [10004, 10006, 10031, 10033, 10034, 10035]: + return None + return row + +def fix_table(table, table_name, table_fields): + if table_name in ['slice_attribute_types']: + # remove duplicate/redundant primary keys + type_id_index = table_fields.index('attribute_type_id') + for row in table: + if row[type_id_index] in [10004, 10006, 10031, 10033, 10034, 10035]: + table.remove(row) + return table + +def remove_temp_tables(): + # remove temp_tables + try: + for temp_table in temp_tables: + os.remove(temp_tables[temp_table]) + except: + raise + +def generate_temp_table(table_name, db): + cursor = db.cursor() + try: + # get upgrade directions + table_def = upgrade_config[table_name].replace('(', '').replace(')', '').split(',') + table_fields, old_fields, joins, wheres = [], [], set(), set() + for field in table_def: + field_parts = field.strip().split(':') + table_fields.append(field_parts[0]) + old_fields.append(field_parts[1]) + if field_parts[2:]: + joins.update(set(filter(lambda x: not x.find('=') > -1, field_parts[2:]))) + wheres.update(set(filter(lambda x: x.find('=') > -1, field_parts[2:]))) + + # get indices of fields that cannot be null + (type, body_list) = schema[table_name] + not_null_indices = [] + for field in table_fields: + for body_line in body_list: + if body_line.find(field) > -1 and \ + body_line.upper().find("NOT NULL") > -1: + not_null_indices.append(table_fields.index(field)) + # get index of primary key + primary_key_indices = [] + for body_line in body_list: + if body_line.find("PRIMARY KEY") > -1: + primary_key = body_line + for field in table_fields: + if primary_key.find(" "+field+" ") > -1: + primary_key_indices.append(table_fields.index(field)) + #break + + # get old data + get_old_data = "SELECT DISTINCT %s FROM %s" % \ + (", ".join(old_fields), old_fields[0].split(".")[0]) + for join in joins: + get_old_data = get_old_data + " INNER JOIN %s USING (%s) " % \ + (join.split('.')[0], join.split('.')[1]) + if wheres: + get_old_data = get_old_data + " WHERE " + for where in wheres: + get_old_data = get_old_data + " %s" % where + cursor.execute(get_old_data) + rows = cursor.fetchall() + + # write data to a temp file + temp_file_name = '%s/%s.tmp' % (temp_dir, table_name) + temp_file = open(temp_file_name, 'w') + for row in rows: + # attempt to make any necessary fixes to data + row = fix_row(row, table_name, table_fields) + # do not attempt to write null rows + if row == None: + continue + # do not attempt to write rows with null primary keys + if filter(lambda x: row[x] == None, primary_key_indices): + continue + for i in range(len(row)): + # convert nulls into something pg can understand + if row[i] == None: + if i in not_null_indices: + # XX doesnt work if column is int type + row[i] = "" + else: + row[i] = "\N" + if isinstance(row[i], int) or isinstance(row[i], float): + row[i] = str(row[i]) + # escape whatever can mess up the data format + if isinstance(row[i], str): + row[i] = row[i].replace('\t', '\\t') + row[i] = row[i].replace('\n', '\\n') + row[i] = row[i].replace('\r', '\\r') + data_row = "\t".join(row) + temp_file.write(data_row + "\n") + temp_file.write("\.\n") + temp_file.close() + temp_tables[table_name] = temp_file_name + + except KeyError: + #print "WARNING: cannot upgrade %s. upgrade def not found. skipping" % \ + # (table_name) + return False + except IndexError, fault: + print "Error: error found in upgrade config file. " \ + "check %s configuration. Aborting " % \ + (table_name) + sys.exit(1) + except: + print "Error: configuration for %s doesnt match db schema. " \ + " Aborting" % (table_name) + try: + db.rollback() + except: + pass + raise + + +# Connect to current db +db = connect() +cursor = db.cursor() + +# determin current db version +try: + cursor.execute("SELECT relname from pg_class where relname = 'plc_db_version'") + rows = cursor.fetchall() + if not rows: + print "Warning: current db has no version. Unable to validate config file." + else: + cursor.execute("SELECT version FROM plc_db_version") + rows = cursor.fetchall() + if not rows or not rows[0]: + print "Warning: current db has no version. Unable to validate config file." + elif rows[0][0] == db_version_new: + print "Status: Versions are the same. No upgrade necessary." + sys.exit() + elif not rows[0][0] == db_version_previous: + print "Stauts: DB_VERSION_PREVIOUS in config file (%s) does not" \ + " match current db version %d" % (upgrade_config_file, rows[0][0]) + sys.exit() + else: + print "STATUS: attempting upgrade from %d to %d" % \ + (db_version_previous, db_version_new) + + # check db encoding + sql = " SELECT pg_catalog.pg_encoding_to_char(d.encoding)" \ + " FROM pg_catalog.pg_database d " \ + " WHERE d.datname = '%s' " % config['PLC_DB_NAME'] + cursor.execute(sql) + rows = cursor.fetchall() + if rows[0][0] not in ['UTF8', 'UNICODE']: + print "WARNING: db encoding is not utf8. Attempting to encode" + db.close() + # generate db dump + dump_file = '%s/dump.sql' % (temp_dir) + dump_file_encoded = dump_file + ".utf8" + dump_cmd = 'pg_dump -i %s -U postgres -f %s > /dev/null 2>&1' % \ + (config['PLC_DB_NAME'], dump_file) + if os.system(dump_cmd): + print "ERROR: during db dump. Exiting." + sys.exit(1) + # encode dump to utf8 + print "Status: encoding database dump" + encode_utf8(dump_file, dump_file_encoded) + # archive original db + archive_db(config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_sqlascii_archived') + # create a utf8 database and upload encoded data + recreate_cmd = 'createdb -U postgres -E UTF8 %s > /dev/null; ' \ + 'psql -a -U %s %s < %s > /dev/null 2>&1;' % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'], \ + config['PLC_DB_NAME'], dump_file_encoded) + print "Status: recreating database as utf8" + if os.system(recreate_cmd): + print "Error: database encoding failed. Aborting" + sys.exit(1) + + os.remove(dump_file_encoded) + os.remove(dump_file) +except: + raise + + +db = connect() +cursor = db.cursor() + +# parse the schema user wishes to upgrade to +try: + file = open(schema_file, 'r') + index = 0 + lines = file.readlines() + while index < len(lines): + line = lines[index] + if line.find("--") > -1: + line_parts = line.split("--") + line = line_parts[0] + # find all created objects + if line.startswith("CREATE"): + line_parts = line.split(" ") + if line_parts[1:3] == ['OR', 'REPLACE']: + line_parts = line_parts[2:] + item_type = line_parts[1] + item_name = line_parts[2] + schema_items_ordered.append(item_name) + if item_type in ['INDEX']: + schema[item_name] = (item_type, line) + + # functions, tables, views span over multiple lines + # handle differently than indexes + elif item_type in ['AGGREGATE', 'TABLE', 'VIEW']: + fields = [line] + while index < len(lines): + index = index + 1 + nextline =lines[index] + if nextline.find("--") > -1: + new_line_parts = nextline.split("--") + nextline = new_line_parts[0] + # look for any sequences + if item_type in ['TABLE'] and nextline.find('serial') > -1: + sequences[item_name] = nextline.strip().split()[0] + fields.append(nextline) + if nextline.find(";") >= 0: + break + schema[item_name] = (item_type, fields) + else: + print "Error: unknown type %s" % item_type + elif line.startswith("INSERT"): + inserts.append(line) + index = index + 1 + +except: + raise + +print "Status: generating temp tables" +# generate all temp tables +for key in schema_items_ordered: + (type, body_list) = schema[key] + if type == 'TABLE': + generate_temp_table(key, db) + +# disconenct from current database and archive it +cursor.close() +db.close() + +print "Status: archiving database" +archive_db(config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_archived') +os.system('createdb -U postgres -E UTF8 %s > /dev/null; ' % config['PLC_DB_NAME']) + +print "Status: upgrading database" +# attempt to create and load all items from schema into temp db +try: + for key in schema_items_ordered: + (type, body_list) = schema[key] + create_item_from_schema(key) + if type == 'TABLE': + if upgrade_config.has_key(key): + # attempt to populate with temp table data + table_def = upgrade_config[key].replace('(', '').replace(')', '').split(',') + table_fields = [field.strip().split(':')[0] for field in table_def] + insert_cmd = "psql %s %s -c " \ + " 'COPY %s (%s) FROM stdin;' < %s " % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'], key, + ", ".join(table_fields), temp_tables[key] ) + exit_status = os.system(insert_cmd) + if exit_status: + print "Error: upgrade %s failed" % key + sys.exit(1) + # update the primary key sequence + if sequences.has_key(key): + sequence = key +"_"+ sequences[key] +"_seq" + update_seq = "psql %s %s -c " \ + " \"select setval('%s', max(%s)) FROM %s;\" > /dev/null" % \ + (config['PLC_DB_NAME'], config['PLC_DB_USER'], sequence, + sequences[key], key) + exit_status = os.system(update_seq) + if exit_status: + print "Error: sequence %s update failed" % sequence + sys.exit(1) + else: + # check if there are any insert stmts in schema for this table + print "Warning: %s has no temp data file. Unable to populate with old data" % key + for insert_stmt in inserts: + if insert_stmt.find(key) > -1: + insert_cmd = 'psql %s postgres -qc "%s;" > /dev/null 2>&1' % \ + (config['PLC_DB_NAME'], insert_stmt) + os.system(insert_cmd) +except: + print "Error: failed to populate db. Unarchiving original database and aborting" + undo_command = "dropdb -U postgres %s > /dev/null; psql template1 postgres -qc" \ + " 'ALTER DATABASE %s RENAME TO %s;'; > /dev/null" % \ + (config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_archived', config['PLC_DB_NAME']) + os.system(undo_command) + #remove_temp_tables() + raise + +#remove_temp_tables() + +print "upgrade complete"

bû}6¼UŸ*ÜV­ßÖ3í·OUû8â›#æûµDH+S4Õ( ,’ˆ–L7#$ÑFñ#æÆ÷ +©4áF%úD­÷•ì;XԌ¾³ ÷ °ïœe‘Kך¦í{ŠDÒºòÌ4wbÅSMÂb^°´×‘¸9^Gx`^‡<.·ÿ—É™{pµÉ`1Ñ,-7G4„&ä±ê¤Kèè PE”’‰b†¨õbQÉbÆ¢fó‚^Ì÷õq{h^ºfßb›FÊÒèïQÕ¢Ô¤ä,UÕ1èK‹›aPŒbÐ orã,!¸vîEiLª¸!,¦]€¥µCâæh‡ðÀ´ƒ<.UÜ19̗k혺 +ŠOŒ!,21aɉ17cb¼àOŒ'<u÷zhïšz7 ØgIègxÜlP\ªk¯ù»&l±BJNO`ýÕ÷~«u +¶:šâ%¦>ñÑ„EFS#,9šÂâfŒ¦0ËÑԄƹõ¹ 9,Wn=ŠC­:þ>)t|³jIf і' PCTҏHÐ ;"$€> endobj +6195 0 obj << +/D [6193 0 R /XYZ 71.731 729.2652 null] +>> endobj +6196 0 obj << +/D [6193 0 R /XYZ 129.5143 708.3437 null] +>> endobj +6197 0 obj << +/D [6193 0 R /XYZ 129.5143 708.3437 null] +>> endobj +6198 0 obj << +/D [6193 0 R /XYZ 71.731 706.1869 null] +>> endobj +6199 0 obj << +/D [6193 0 R /XYZ 71.731 706.1869 null] +>> endobj +6200 0 obj << +/D [6193 0 R /XYZ 139.477 690.4109 null] +>> endobj +6201 0 obj << +/D [6193 0 R /XYZ 71.731 688.2541 null] +>> endobj +6202 0 obj << +/D [6193 0 R /XYZ 71.731 688.2541 null] +>> endobj +6203 0 obj << +/D [6193 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6204 0 obj << +/D [6193 0 R /XYZ 71.731 670.3214 null] +>> endobj +6205 0 obj << +/D [6193 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6206 0 obj << +/D [6193 0 R /XYZ 76.7123 636.6127 null] +>> endobj +6207 0 obj << +/D [6193 0 R /XYZ 139.477 618.6799 null] +>> endobj +6208 0 obj << +/D [6193 0 R /XYZ 71.731 617.2404 null] +>> endobj +6209 0 obj << +/D [6193 0 R /XYZ 71.731 617.2404 null] +>> endobj +6210 0 obj << +/D [6193 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6211 0 obj << +/D [6193 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6212 0 obj << +/D [6193 0 R /XYZ 71.731 598.5904 null] +>> endobj +6213 0 obj << +/D [6193 0 R /XYZ 71.731 598.5904 null] +>> endobj +6214 0 obj << +/D [6193 0 R /XYZ 159.4023 582.8144 null] +>> endobj +6215 0 obj << +/D [6193 0 R /XYZ 71.731 580.6576 null] +>> endobj +6216 0 obj << +/D [6193 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6217 0 obj << +/D [6193 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6218 0 obj << +/D [6193 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6219 0 obj << +/D [6193 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6220 0 obj << +/D [6193 0 R /XYZ 71.731 526.8593 null] +>> endobj +6221 0 obj << +/D [6193 0 R /XYZ 71.731 526.8593 null] +>> endobj +6222 0 obj << +/D [6193 0 R /XYZ 159.4023 511.0834 null] +>> endobj +6223 0 obj << +/D [6193 0 R /XYZ 71.731 508.9266 null] +>> endobj +6224 0 obj << +/D [6193 0 R /XYZ 159.4023 493.1507 null] +>> endobj +6225 0 obj << +/D [6193 0 R /XYZ 76.7123 475.2179 null] +>> endobj +6226 0 obj << +/D [6193 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6227 0 obj << +/D [6193 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6228 0 obj << +/D [6193 0 R /XYZ 71.731 455.1283 null] +>> endobj +6229 0 obj << +/D [6193 0 R /XYZ 71.731 455.1283 null] +>> endobj +6230 0 obj << +/D [6193 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6231 0 obj << +/D [6193 0 R /XYZ 71.731 437.1956 null] +>> endobj +6232 0 obj << +/D [6193 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6233 0 obj << +/D [6193 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6234 0 obj << +/D [6193 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6235 0 obj << +/D [6193 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6236 0 obj << +/D [6193 0 R /XYZ 71.731 383.3973 null] +>> endobj +6237 0 obj << +/D [6193 0 R /XYZ 71.731 383.3973 null] +>> endobj +6238 0 obj << +/D [6193 0 R /XYZ 159.4023 367.6214 null] +>> endobj +6239 0 obj << +/D [6193 0 R /XYZ 71.731 365.4646 null] +>> endobj +6240 0 obj << +/D [6193 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6241 0 obj << +/D [6193 0 R /XYZ 76.7123 295.8904 null] +>> endobj +6242 0 obj << +/D [6193 0 R /XYZ 129.5143 277.9576 null] +>> endobj +6243 0 obj << +/D [6193 0 R /XYZ 129.5143 277.9576 null] +>> endobj +6244 0 obj << +/D [6193 0 R /XYZ 71.731 275.8008 null] +>> endobj +6245 0 obj << +/D [6193 0 R /XYZ 71.731 275.8008 null] +>> endobj +6246 0 obj << +/D [6193 0 R /XYZ 139.477 260.0249 null] +>> endobj +6247 0 obj << +/D [6193 0 R /XYZ 71.731 222.1669 null] +>> endobj +6248 0 obj << +/D [6193 0 R /XYZ 71.731 209.1159 null] +>> endobj +6249 0 obj << +/D [6193 0 R /XYZ 71.731 207.8706 null] +>> endobj +6250 0 obj << +/D [6193 0 R /XYZ 129.5143 188.792 null] +>> endobj +6251 0 obj << +/D [6193 0 R /XYZ 71.731 186.6352 null] +>> endobj +6252 0 obj << +/D [6193 0 R /XYZ 71.731 186.6352 null] +>> endobj +6253 0 obj << +/D [6193 0 R /XYZ 139.477 170.8593 null] +>> endobj +6254 0 obj << +/D [6193 0 R /XYZ 139.477 170.8593 null] +>> endobj +6255 0 obj << +/D [6193 0 R /XYZ 71.731 168.7024 null] +>> endobj +6256 0 obj << +/D [6193 0 R /XYZ 139.477 152.9265 null] +>> endobj +6257 0 obj << +/D [6193 0 R /XYZ 139.477 152.9265 null] +>> endobj +6258 0 obj << +/D [6193 0 R /XYZ 71.731 150.7697 null] +>> endobj +6259 0 obj << +/D [6193 0 R /XYZ 139.477 134.9938 null] +>> endobj +6260 0 obj << +/D [6193 0 R /XYZ 139.477 134.9938 null] +>> endobj +6261 0 obj << +/D [6193 0 R /XYZ 71.731 132.8369 null] +>> endobj +6262 0 obj << +/D [6193 0 R /XYZ 139.477 117.061 null] +>> endobj +6263 0 obj << +/D [6193 0 R /XYZ 139.477 117.061 null] +>> endobj +6192 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6266 0 obj << +/Length 985 +/Filter /FlateDecode +>> +stream +xÚµWKoã6¾çWèˇ(Š{K÷…-ìzOMQȳ& K®D7È¿/)’õpìDZÙo>~3¤PõE Fôs€SŠ£âp£ŸúÕ×äLbg‡F¿no~ùB`ÄOqmŸ#ÂS@Y1‚AFQmË?o?îó£í&ÆÞb`ŸU^ õ{¾³ÓûÇ;øC¨}Sv›¿¶¿Ý|Þñ)a€g:ț «%LŒ"ÄF418}Ɛ–0ÖÃĀCŽe·_…ú^ÉB<ԝÊk%s%›ºÇ¤ñ ߄ CÅ&_–ZGm£õz†™^‘ö‘ÝÚ#¢Œ÷ ΄ëùx‚æ'µ×O´ öþBŸDW´òh¼\ á›P§ÖÇÌk÷lÛüÕ›g÷WUÙÁ¿LõL–vÚüv(Ã,Ü[•+сkñßWUcÜ¿çý[S‰îb*6“¼<Èúή;J78uZ ¼uS%Š½ÖM)®Åõ¸A:ç6?-g‹'Ô(BPŠX”d¡–ÅšF«84³å‘Ö/ƒÈ Xz3ž0¦‹¸’ ¼wþqøUK$ (Fº’(Jȇ‘ä +m8ÐD0&üÞ·§BÝÍÊܬZ$ÅD%ÆòԊe‚‚®[ˆ_'Ö[Å¡ÙH,2?Iț%Vo>Ä _{žX¿j‰cJ,áÀôž Œ{͋m+ìÒ¤‰î®s~eýÓó»BëÁº³Âo†z0þuŸ4ýk1R2ÈiØ Î œp˜6~[߁ÕòöVÕ½ô +q¯€ ¤‚XézŽ¿_nunï&GNL`!=՘ÐÔ:hvè¼ÿ93;Zî‚þ÷„¸R“nÙörè߈ªìÞá$"Z…)þ'‘íήhj•ËZo’—BO+ïdלTcç® Ï«‰Ûuk»£(dŸyé•S‹sîESgÐÔHiJúeiŠ´wÛ:7M»8Hk}ÐtwÓ×y˜üŒqe®´`w¬ ].êê5dÁu‡\û7Ý=¼6B6^dìë”v"Ԅ(G*WҜ ç,³ €Œý“u°ôh ËÃÑ-“0[k?ºíðUCÌN¢]ádzû²—Å~D§/¯~߅ﳇàï·óPA­™Ñ0&„ÏÕðRz…H5HøÞ\vº5 εPúȳêÈêR{ªÈëºQÓ-0¾¥(/”‘¬/4sÜ_É7À7Êbn¢w¼Šf×ßEý4<óÜçI’ ¥üÍï±Àfù9F1déàɀBžýºZ‰ø㓈ˆendstream +endobj +6265 0 obj << +/Type /Page +/Contents 6266 0 R +/Resources 6264 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6267 0 obj << +/D [6265 0 R /XYZ 71.731 729.2652 null] +>> endobj +884 0 obj << +/D [6265 0 R /XYZ 71.731 718.3063 null] +>> endobj +390 0 obj << +/D [6265 0 R /XYZ 295.6147 705.7477 null] +>> endobj +6268 0 obj << +/D [6265 0 R /XYZ 71.731 685.6073 null] +>> endobj +6269 0 obj << +/D [6265 0 R /XYZ 161.0655 672.871 null] +>> endobj +6270 0 obj << +/D [6265 0 R /XYZ 71.731 660.7515 null] +>> endobj +6271 0 obj << +/D [6265 0 R /XYZ 71.731 629.7219 null] +>> endobj +6272 0 obj << +/D [6265 0 R /XYZ 168.8063 618.3754 null] +>> endobj +6273 0 obj << +/D [6265 0 R /XYZ 71.731 606.2559 null] +>> endobj +6274 0 obj << +/D [6265 0 R /XYZ 71.731 574.89 null] +>> endobj +6275 0 obj << +/D [6265 0 R /XYZ 181.5683 563.8797 null] +>> endobj +6276 0 obj << +/D [6265 0 R /XYZ 71.731 553.8175 null] +>> endobj +6277 0 obj << +/D [6265 0 R /XYZ 71.731 520.3944 null] +>> endobj +6278 0 obj << +/D [6265 0 R /XYZ 71.731 509.2845 null] +>> endobj +6279 0 obj << +/D [6265 0 R /XYZ 71.731 508.0392 null] +>> endobj +6280 0 obj << +/D [6265 0 R /XYZ 129.5143 488.9607 null] +>> endobj +6281 0 obj << +/D [6265 0 R /XYZ 129.5143 488.9607 null] +>> endobj +6282 0 obj << +/D [6265 0 R /XYZ 71.731 487.5211 null] +>> endobj +6283 0 obj << +/D [6265 0 R /XYZ 71.731 487.5211 null] +>> endobj +6284 0 obj << +/D [6265 0 R /XYZ 139.477 471.0279 null] +>> endobj +6285 0 obj << +/D [6265 0 R /XYZ 139.477 471.0279 null] +>> endobj +6286 0 obj << +/D [6265 0 R /XYZ 71.731 433.1699 null] +>> endobj +6287 0 obj << +/D [6265 0 R /XYZ 71.731 420.1189 null] +>> endobj +6288 0 obj << +/D [6265 0 R /XYZ 71.731 418.8736 null] +>> endobj +6289 0 obj << +/D [6265 0 R /XYZ 129.5143 399.795 null] +>> endobj +885 0 obj << +/D [6265 0 R /XYZ 71.731 392.6569 null] +>> endobj +394 0 obj << +/D [6265 0 R /XYZ 193.27 349.5594 null] +>> endobj +6290 0 obj << +/D [6265 0 R /XYZ 71.731 329.419 null] +>> endobj +6291 0 obj << +/D [6265 0 R /XYZ 161.0655 316.6827 null] +>> endobj +6292 0 obj << +/D [6265 0 R /XYZ 71.731 304.5632 null] +>> endobj +6293 0 obj << +/D [6265 0 R /XYZ 71.731 273.5336 null] +>> endobj +6294 0 obj << +/D [6265 0 R /XYZ 168.8063 262.1871 null] +>> endobj +6295 0 obj << +/D [6265 0 R /XYZ 71.731 235.1236 null] +>> endobj +6296 0 obj << +/D [6265 0 R /XYZ 71.731 195.3891 null] +>> endobj +6297 0 obj << +/D [6265 0 R /XYZ 71.731 142.3466 null] +>> endobj +6298 0 obj << +/D [6265 0 R /XYZ 181.5683 129.4847 null] +>> endobj +6299 0 obj << +/D [6265 0 R /XYZ 71.731 119.4225 null] +>> endobj +6264 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6302 0 obj << +/Length 1400 +/Filter /FlateDecode +>> +stream +xÚ͚[oã6…ßó+ü˜k–wRû¶½"ŶÚ,P [Š£¬$r Ë(úïKY¤LšC‘AÓ¢Ø)Þ#Ïѧ3#J0Yaó¬AŠ™ ­•‚®6ÏxõÅü×ÄJÖV³öE_ß^|õ=ë +U’ÊÕíãŠU ÅWŠQ¤ѫۇß/¿ÙÖ/CÓ_­©À—Mۛ§ºk†õýô燛ëiç§fØîöWÜþxñÝí\_0…*mŠ,šœU±MZy6 ©D­ֈq¦Ž>o®ˆ¸¬ûú¹1n÷ïÏ-ÌImªPÌ@ ³jí˜ó‰Â$°0ËF Ÿ)Q]JGBÁºçۓwTìƒé•6($?ú0 á,ôQ†íèãŒåFÉûézí‡þ°ޝ]Åñø¦ÚM=´»ÎWú&>AgAšRZ ¬S­}Ù ,㜐“%ÁšbÊ+°n¬;*ö‚eâJ…6>.SºB"ÉMóœóm»/Ž/€õyúºãþ°›¶‡}“N/ãȄ#ޓj)»V•n\´$¹g&ÁõLìŸÚMs÷Ø>ó&&,bŠ°pÝ÷õ_ÓîîqÚ¶Ý`?èý«}fòœ3‘ˆèŠåÂìɖÂìdù0uK ø𦠳oãà"³Ó׉J#*d¢á­hí«Dçߕ$ÄÉ؈¬š&äŽmx„¸±an¡Ãöî¯c2-¤‡±‡?cL§‚d4FŒšÀ/“ñT dœ*O¨ZB°‘ñ}s̓әÛo²§çˆ ë)_¶ÐS³,ÛSP݂ž‚|Ä=Øo§ƒtEÍ@,ž15n¸¹¡fFE®£<ÕBnœ*Ÿ jInÎm„~΍ïcÓ7õ°ëï^Ìm×ݵЍ´âˆaIÃ1¦ÄøŠÎѹ0KEQÑDG:Õڗh£oK²†’À¬›fëŽ}xÙƦ,ôqšV×þˆ +™ˆÅ·ÙìŽé°­íÞñú4n=²m÷ö>pìð[^a$e†ìI´ÀՊ²TãŠLcQÏœ°ÿ±íe.8RÏÌ_•ž ³*; ªs!²υÀGÛí‡ÚVÆñLPqª´¸ÎŽ…Ä"föÁ$Ғä&ƒ/[J°“å3 Ô-I1àʱï#u·©[X&œiVÄ\HS0ƒê¤Z"eUyPqÑN± “g"ÎöÓ aÉ2ýë«Òý;«²ý U-èßÈÜ¿·î+zãðMˤ@„a•I¢/[ˆâ,Ëfª[FȐÆÀÇ«–Øó™pszUn–yª%*V•‡-a›€x&^Ñ  $×@„ Æh®=ÕB3:U¾ª%Íxn#ь¾é5 +¸¶æi­ôÛ®­iÅ«ª\3ú²…ØͲlî ºÁƒ|É |¼þMÀ|:J .³lNª%4V•'-›€¸x&—ȯ|gBÍVb’iK_•nËY•mK¨jA[F6ච|¸…?Е™'¹7nJJ̃ŒÎϓ-%ÏÉòÑê–dð…Ï÷qŠÚ·µ{ÃRwîɪ}¶ý¹m:ÿkúðŠñ>x${ç¨Zu³Ùuîñ¬íÜ¡Ÿ~¾þmÚk^v›mú +`†Ë={ª%þV•Ç-¡›€à{&;ÿu9ìH R!­pf¼øªôx™UÙñU-/‘ x¼>ý0ZÌódÿÎ|Ü©˜ÊM_¶ðY–8T· 㐠䁏`yù闏ÓÎ㡶îµÏC³ßôíý̳ô¥Ùñ=s*Ž'x'Õ;«Ê£‹‹–‹M@à<¹•ú› ´¿iài"«ÅŸ=xšøW‚šY¦åüMãL’?b*þ –Ë`eendstream +endobj +6301 0 obj << +/Type /Page +/Contents 6302 0 R +/Resources 6300 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6303 0 obj << +/D [6301 0 R /XYZ 71.731 729.2652 null] +>> endobj +6304 0 obj << +/D [6301 0 R /XYZ 71.731 718.3063 null] +>> endobj +6305 0 obj << +/D [6301 0 R /XYZ 71.731 708.2442 null] +>> endobj +6306 0 obj << +/D [6301 0 R /XYZ 71.731 706.9988 null] +>> endobj +6307 0 obj << +/D [6301 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6308 0 obj << +/D [6301 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6309 0 obj << +/D [6301 0 R /XYZ 71.731 686.4807 null] +>> endobj +6310 0 obj << +/D [6301 0 R /XYZ 71.731 686.4807 null] +>> endobj +6311 0 obj << +/D [6301 0 R /XYZ 139.477 669.9875 null] +>> endobj +6312 0 obj << +/D [6301 0 R /XYZ 139.477 669.9875 null] +>> endobj +6313 0 obj << +/D [6301 0 R /XYZ 76.7123 652.0548 null] +>> endobj +6314 0 obj << +/D [6301 0 R /XYZ 129.5143 634.122 null] +>> endobj +6315 0 obj << +/D [6301 0 R /XYZ 129.5143 634.122 null] +>> endobj +6316 0 obj << +/D [6301 0 R /XYZ 71.731 631.9652 null] +>> endobj +6317 0 obj << +/D [6301 0 R /XYZ 71.731 631.9652 null] +>> endobj +6318 0 obj << +/D [6301 0 R /XYZ 139.477 616.1893 null] +>> endobj +6319 0 obj << +/D [6301 0 R /XYZ 71.731 614.0324 null] +>> endobj +6320 0 obj << +/D [6301 0 R /XYZ 71.731 614.0324 null] +>> endobj +6321 0 obj << +/D [6301 0 R /XYZ 149.4396 598.2565 null] +>> endobj +6322 0 obj << +/D [6301 0 R /XYZ 71.731 596.817 null] +>> endobj +6323 0 obj << +/D [6301 0 R /XYZ 149.4396 580.3238 null] +>> endobj +6324 0 obj << +/D [6301 0 R /XYZ 76.7123 562.391 null] +>> endobj +6325 0 obj << +/D [6301 0 R /XYZ 139.477 544.4583 null] +>> endobj +6326 0 obj << +/D [6301 0 R /XYZ 71.731 543.0187 null] +>> endobj +6327 0 obj << +/D [6301 0 R /XYZ 71.731 543.0187 null] +>> endobj +6328 0 obj << +/D [6301 0 R /XYZ 149.4396 526.5255 null] +>> endobj +6329 0 obj << +/D [6301 0 R /XYZ 149.4396 526.5255 null] +>> endobj +6330 0 obj << +/D [6301 0 R /XYZ 71.731 524.3687 null] +>> endobj +6331 0 obj << +/D [6301 0 R /XYZ 71.731 524.3687 null] +>> endobj +6332 0 obj << +/D [6301 0 R /XYZ 159.4023 508.5928 null] +>> endobj +6333 0 obj << +/D [6301 0 R /XYZ 71.731 507.1532 null] +>> endobj +6334 0 obj << +/D [6301 0 R /XYZ 159.4023 490.66 null] +>> endobj +6335 0 obj << +/D [6301 0 R /XYZ 76.7123 472.7273 null] +>> endobj +6336 0 obj << +/D [6301 0 R /XYZ 149.4396 454.7945 null] +>> endobj +6337 0 obj << +/D [6301 0 R /XYZ 149.4396 454.7945 null] +>> endobj +6338 0 obj << +/D [6301 0 R /XYZ 71.731 452.6377 null] +>> endobj +6339 0 obj << +/D [6301 0 R /XYZ 71.731 452.6377 null] +>> endobj +6340 0 obj << +/D [6301 0 R /XYZ 159.4023 436.8618 null] +>> endobj +6341 0 obj << +/D [6301 0 R /XYZ 71.731 434.7049 null] +>> endobj +6342 0 obj << +/D [6301 0 R /XYZ 159.4023 418.929 null] +>> endobj +6343 0 obj << +/D [6301 0 R /XYZ 76.7123 400.9962 null] +>> endobj +6344 0 obj << +/D [6301 0 R /XYZ 149.4396 383.0635 null] +>> endobj +6345 0 obj << +/D [6301 0 R /XYZ 149.4396 383.0635 null] +>> endobj +6346 0 obj << +/D [6301 0 R /XYZ 71.731 380.9067 null] +>> endobj +6347 0 obj << +/D [6301 0 R /XYZ 71.731 380.9067 null] +>> endobj +6348 0 obj << +/D [6301 0 R /XYZ 159.4023 365.1307 null] +>> endobj +6349 0 obj << +/D [6301 0 R /XYZ 71.731 362.9739 null] +>> endobj +6350 0 obj << +/D [6301 0 R /XYZ 159.4023 347.198 null] +>> endobj +6351 0 obj << +/D [6301 0 R /XYZ 76.7123 329.2652 null] +>> endobj +6352 0 obj << +/D [6301 0 R /XYZ 149.4396 311.3325 null] +>> endobj +6353 0 obj << +/D [6301 0 R /XYZ 149.4396 311.3325 null] +>> endobj +6354 0 obj << +/D [6301 0 R /XYZ 71.731 309.1757 null] +>> endobj +6355 0 obj << +/D [6301 0 R /XYZ 71.731 309.1757 null] +>> endobj +6356 0 obj << +/D [6301 0 R /XYZ 159.4023 293.3997 null] +>> endobj +6357 0 obj << +/D [6301 0 R /XYZ 71.731 291.9602 null] +>> endobj +6358 0 obj << +/D [6301 0 R /XYZ 159.4023 275.467 null] +>> endobj +6359 0 obj << +/D [6301 0 R /XYZ 76.7123 257.5342 null] +>> endobj +6360 0 obj << +/D [6301 0 R /XYZ 149.4396 239.6015 null] +>> endobj +6361 0 obj << +/D [6301 0 R /XYZ 149.4396 239.6015 null] +>> endobj +6362 0 obj << +/D [6301 0 R /XYZ 71.731 237.4447 null] +>> endobj +6363 0 obj << +/D [6301 0 R /XYZ 71.731 237.4447 null] +>> endobj +6364 0 obj << +/D [6301 0 R /XYZ 159.4023 221.6687 null] +>> endobj +6365 0 obj << +/D [6301 0 R /XYZ 71.731 219.5119 null] +>> endobj +6366 0 obj << +/D [6301 0 R /XYZ 159.4023 203.736 null] +>> endobj +6367 0 obj << +/D [6301 0 R /XYZ 76.7123 185.8032 null] +>> endobj +6368 0 obj << +/D [6301 0 R /XYZ 149.4396 167.8705 null] +>> endobj +6369 0 obj << +/D [6301 0 R /XYZ 149.4396 167.8705 null] +>> endobj +6370 0 obj << +/D [6301 0 R /XYZ 71.731 165.7136 null] +>> endobj +6371 0 obj << +/D [6301 0 R /XYZ 71.731 165.7136 null] +>> endobj +6372 0 obj << +/D [6301 0 R /XYZ 159.4023 149.9377 null] +>> endobj +6373 0 obj << +/D [6301 0 R /XYZ 71.731 147.7809 null] +>> endobj +6374 0 obj << +/D [6301 0 R /XYZ 159.4023 132.005 null] +>> endobj +6375 0 obj << +/D [6301 0 R /XYZ 76.7123 114.0722 null] +>> endobj +6300 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6378 0 obj << +/Length 1446 +/Filter /FlateDecode +>> +stream +xÚÍZÛnã6|ÏWè1Ö,ï÷­·-Rl‹ MÝ"Pl%K†¤`Ó¿/e‘e’ZÀX,ò`Ùê ‡sF”l’`ýG’” ”骕‚&ÛÃNžõ¿~¹"²1˜ úáþê» ' +)Ierÿ”0%‘Hy’2Š2A²ä~÷ÏõûüØÍ͆ +|MÑðz÷’WE÷1Þ~w;üVtûz×Þü{ÿëÕÏ÷c}ÁR¤2]$H’© ,d²¡)Jˆ"L!ž¦z.8CŒ³tœ UIŠH?O= Qý\>Q*ιN4·T&îùlÕó׉…µ¤Á²$ӒJ~¢Á5 ­ëœÇ!{¨ê]qêD|Z¡çŽU_¨G¾t-«n8¨ÍBäM“ÿg>zš0‹¹™êRaÄ V°¢µqa€¤‹³y5Z)Xׯ©ò˜"BóÀ”Íyèé¿3&ÌßÊÃëaxS½­{­Rƒô§ÃnŸe·y5<Fâ¶-Ÿ«bg€µPš¡íK¹-üŠ§Tû/£1ÅXHq ‹+Ô]£8ÀRÜå{ð[XÓû’I$ MÃ9â¢ü92¢¢9U]‘# pŽÌxoDzS„c¤‡ð §ɐLU4EXÈÓ÷4Pw§§]“Ê;ëÁÊÚ¯<˜>ï‹Ê5àé°¸!âzX‘wVL*¶uµ³–-+;â¯ßoÿ6cõvïc”ò4&,$¼…Å…ê®à ïò†É·°&„ä(ËH$S\”?SFT4S ª+2eAď¶ìŠ‡rgŠÀÙe#Ep‰Ïb‘âÂÎaQgCuW8â8{Æc²ñí®¨ºòÆôübØí kHët{­û¼/µÁ˞¹R¾ÔÕsëWXo¹1‘±ìpa!…-,®0PwÂHa—G0;¾ªè¦±¹bˆ å‰ ¨êŠXЀCbÆãXÍÃI8*ô61ͤºlVðT JÒXV¸°€“GXÔÉPÝN†xNžñ˜lû¡¿€ÕM¡w¿ ÷• KÛýs¿.~ýDŠh&bIàÂBúYX\? îý~.`\PRۛ”èPësès‹Š÷9PuMŸŸÓðô¹ËãÔç_m3À1C¼ˆAXÈ 7(PwAA]“ï +ë´K]éY&<Öß., ß‹ÊÕ]!ĐoÆ#ØߗSÔ´$ÓZÈ,‹´·‹ò·÷ˆŠ¶7TuE{/hÀí=ã±+ÚmS»²®€—I©‘³o»¦¬ž£mn`^«2‚R!bîÂBVµ°¸Uºk¬ +ð€¬êò0Öüsòܙæ°<„¡ŒêYFäq`!y,,.Pw<H—‡×3_¦Q:ô+åaE=ŠYÔƅMŠ©Š-ÎæUŒRÄ8¡`]¿bvԒǼYõ͍ œÍy4E÷ÚTOeñ²ká=7§›·ë ³×F֏eÛÍU?íy^웜C±å´-1Êõ̀â°Üµqa€AgóÊÍ´”+°®_n; +äáÔDôŒÆ`úDK…žÀ(ÃJœœjß{-IÕäˆX҅,9¢–„ê®°$ÄÃÑȮՌÜįÛÎkÂ8RJ»=l0΋ª»Â8 ó>5ƙÑØ6EÞÕÍñhÚº‚7ϊ#†åò;¾õ,òí¶~µÛmçû“¾øømIä[’QE’¢žMdI&ThE *¾ Ë¢kÖ㌼‡²j»\‹™{ö8`hú.Dó“hÿhÚ§¬Rˆôg+ë ÊZTTY è +eÏI€Êº†§?y§µz|==2†.Js”â”~éUÉÙ¤%n(¾Öe{uóËž¡ŒxîíÌò·‚2„Y&Ç3õt ¦ÞŸ2ÿhEo°endstream +endobj +6377 0 obj << +/Type /Page +/Contents 6378 0 R +/Resources 6376 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6379 0 obj << +/D [6377 0 R /XYZ 71.731 729.2652 null] +>> endobj +6380 0 obj << +/D [6377 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6381 0 obj << +/D [6377 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6382 0 obj << +/D [6377 0 R /XYZ 71.731 706.1869 null] +>> endobj +6383 0 obj << +/D [6377 0 R /XYZ 71.731 706.1869 null] +>> endobj +6384 0 obj << +/D [6377 0 R /XYZ 159.4023 690.4109 null] +>> endobj +6385 0 obj << +/D [6377 0 R /XYZ 71.731 688.2541 null] +>> endobj +6386 0 obj << +/D [6377 0 R /XYZ 159.4023 672.4782 null] +>> endobj +6387 0 obj << +/D [6377 0 R /XYZ 76.7123 654.5454 null] +>> endobj +6388 0 obj << +/D [6377 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6389 0 obj << +/D [6377 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6390 0 obj << +/D [6377 0 R /XYZ 71.731 634.4559 null] +>> endobj +6391 0 obj << +/D [6377 0 R /XYZ 71.731 634.4559 null] +>> endobj +6392 0 obj << +/D [6377 0 R /XYZ 159.4023 618.6799 null] +>> endobj +6393 0 obj << +/D [6377 0 R /XYZ 71.731 616.5231 null] +>> endobj +6394 0 obj << +/D [6377 0 R /XYZ 159.4023 600.7472 null] +>> endobj +6395 0 obj << +/D [6377 0 R /XYZ 76.7123 582.8144 null] +>> endobj +6396 0 obj << +/D [6377 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6397 0 obj << +/D [6377 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6398 0 obj << +/D [6377 0 R /XYZ 71.731 562.7248 null] +>> endobj +6399 0 obj << +/D [6377 0 R /XYZ 71.731 562.7248 null] +>> endobj +6400 0 obj << +/D [6377 0 R /XYZ 159.4023 546.9489 null] +>> endobj +6401 0 obj << +/D [6377 0 R /XYZ 71.731 544.7921 null] +>> endobj +6402 0 obj << +/D [6377 0 R /XYZ 159.4023 529.0162 null] +>> endobj +6403 0 obj << +/D [6377 0 R /XYZ 76.7123 511.0834 null] +>> endobj +6404 0 obj << +/D [6377 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6405 0 obj << +/D [6377 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6406 0 obj << +/D [6377 0 R /XYZ 71.731 490.9938 null] +>> endobj +6407 0 obj << +/D [6377 0 R /XYZ 71.731 490.9938 null] +>> endobj +6408 0 obj << +/D [6377 0 R /XYZ 159.4023 475.2179 null] +>> endobj +6409 0 obj << +/D [6377 0 R /XYZ 71.731 473.0611 null] +>> endobj +6410 0 obj << +/D [6377 0 R /XYZ 159.4023 457.2852 null] +>> endobj +6411 0 obj << +/D [6377 0 R /XYZ 76.7123 439.3524 null] +>> endobj +6412 0 obj << +/D [6377 0 R /XYZ 149.4396 421.4197 null] +>> endobj +6413 0 obj << +/D [6377 0 R /XYZ 149.4396 421.4197 null] +>> endobj +6414 0 obj << +/D [6377 0 R /XYZ 71.731 419.2628 null] +>> endobj +6415 0 obj << +/D [6377 0 R /XYZ 71.731 419.2628 null] +>> endobj +6416 0 obj << +/D [6377 0 R /XYZ 159.4023 403.4869 null] +>> endobj +6417 0 obj << +/D [6377 0 R /XYZ 71.731 401.3301 null] +>> endobj +6418 0 obj << +/D [6377 0 R /XYZ 159.4023 385.5542 null] +>> endobj +6419 0 obj << +/D [6377 0 R /XYZ 76.7123 367.6214 null] +>> endobj +6420 0 obj << +/D [6377 0 R /XYZ 149.4396 349.6887 null] +>> endobj +6421 0 obj << +/D [6377 0 R /XYZ 149.4396 349.6887 null] +>> endobj +6422 0 obj << +/D [6377 0 R /XYZ 71.731 347.5318 null] +>> endobj +6423 0 obj << +/D [6377 0 R /XYZ 71.731 347.5318 null] +>> endobj +6424 0 obj << +/D [6377 0 R /XYZ 159.4023 331.7559 null] +>> endobj +6425 0 obj << +/D [6377 0 R /XYZ 71.731 329.5991 null] +>> endobj +6426 0 obj << +/D [6377 0 R /XYZ 159.4023 313.8231 null] +>> endobj +6427 0 obj << +/D [6377 0 R /XYZ 76.7123 260.0249 null] +>> endobj +6428 0 obj << +/D [6377 0 R /XYZ 129.5143 242.0921 null] +>> endobj +6429 0 obj << +/D [6377 0 R /XYZ 129.5143 242.0921 null] +>> endobj +6430 0 obj << +/D [6377 0 R /XYZ 71.731 239.9353 null] +>> endobj +6431 0 obj << +/D [6377 0 R /XYZ 71.731 239.9353 null] +>> endobj +6432 0 obj << +/D [6377 0 R /XYZ 139.477 224.1594 null] +>> endobj +6433 0 obj << +/D [6377 0 R /XYZ 71.731 186.3014 null] +>> endobj +6434 0 obj << +/D [6377 0 R /XYZ 71.731 173.2504 null] +>> endobj +6435 0 obj << +/D [6377 0 R /XYZ 71.731 172.0051 null] +>> endobj +6436 0 obj << +/D [6377 0 R /XYZ 129.5143 152.9265 null] +>> endobj +6437 0 obj << +/D [6377 0 R /XYZ 71.731 150.7697 null] +>> endobj +6438 0 obj << +/D [6377 0 R /XYZ 71.731 150.7697 null] +>> endobj +6439 0 obj << +/D [6377 0 R /XYZ 139.477 134.9938 null] +>> endobj +6440 0 obj << +/D [6377 0 R /XYZ 139.477 134.9938 null] +>> endobj +6441 0 obj << +/D [6377 0 R /XYZ 71.731 133.5542 null] +>> endobj +6442 0 obj << +/D [6377 0 R /XYZ 139.477 117.061 null] +>> endobj +6443 0 obj << +/D [6377 0 R /XYZ 139.477 117.061 null] +>> endobj +6444 0 obj << +/D [6377 0 R /XYZ 71.731 114.9042 null] +>> endobj +6445 0 obj << +/D [6377 0 R /XYZ 139.477 99.1283 null] +>> endobj +6446 0 obj << +/D [6377 0 R /XYZ 139.477 99.1283 null] +>> endobj +6447 0 obj << +/D [6377 0 R /XYZ 71.731 96.9714 null] +>> endobj +6448 0 obj << +/D [6377 0 R /XYZ 71.731 96.9714 null] +>> endobj +6376 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6451 0 obj << +/Length 1602 +/Filter /FlateDecode +>> +stream +xÚ­Yßoœ8~Ï_Á㮔õa° ô­w½V9µUÔK¥“®§ˆ€“µº +ð*ÍßÛ¬ó£§(aÙÏ7ߌgÆ,ö|øÃ^„Q¿ A£—¯|ï ¾úp…5d§1;ôûÝÕoïCßKPÂæÝ=zaˆ…Š)Ž½»üßÍûô$yµÝÔßHý¿=¤—Óõñí퍺øÄå¾Ìëíw]ýy×Ù§a„’ŒÌ’ “QŸ2oø( 0u¢p˜ Eà‹£„QçKxŸà‹u¨Æ—oA@‡Ü0ÁÀ-bž½ž±:üaažrÒ¸HŠ Ð]ûü}W—f ·„” J(Y’ЂÍIh`Ë:쮑pÈÃ-¡M£n”¸¹CFBQGq_FH¸±†"ç…ß|?€í=©eÈÃA´¤¥›ÓÒÀ–µtØ]£å‡[K›FVñTr§”>Ô£(™’ò<¦®Ò"WRõ­ç=/t +_Þb×ꃶ{m–Õhž•E®!µ(Ì£_?ßü£®ø©ÌöÓñÂ1bl£…xY°¹xØr¼v×ÄkÈÃ/›Æ¹:8bÕ BÏT¯_>ª‹Çs%÷¦£å¼Î*ñ0Á½¨í¸Mêìû("Ñb™¶`s:زλktòpëlÓ8¦?î‹ôq¨M¡Aû“ãSúCÏG]©ÏÇ#vù¨ïµËj½S©÷Cª·ÀƒÙUu-ž +n¶Vùk¢1 1˜,56 ¶ —Ýñp¨GãÄ«º,  8#ÄPǃ6VUú²et£õQÔ²™4ËÊs!§ƒs®ùº8ƌ@?ÂÑü,g£¦g¹µ8˹¬®˜å\4³\ÇÜ,GáÂÇl©HØ°¹4°åtØ]“ƒCî´ið'Q9K4OŒ¼^óä[L7ÊÜ+÷LŠ1òãp±TX°¹0Ør˜vׄiÈÃ&›F-äÔ¸8?ãÜØ3b¯R@ 5‚›Hšý¼ ¶³Jè(‹§z2$ V ñ°a3ñè`‹ñpÙ]gN§‹-ÞHd| 1¢1f­¯7M»#¡¶I‚Î!¸·oßfÁEQJõåogw¸•æy+ióh©o)L¡˜Âg!÷êêmžë|ŽA§Æ—vÌ´: \„}U!4 å1ڊ ßêSlK2ç×êRèGŸÅáà +ðCW\v™aT/ÔaD.`"pN‘iv9^óî÷“ò´%ñµ†#þ _Ëâ`®dÚÍÃü~ìöT#jÝ\zM¥uåÅÌ<šÑ‘7omj“œ7#«l§…µöø࠘9ÄO»}ÀEu9eԃrÑ[þ5ü|›Eñ +®ê"4èúG8#ØYÉìïtfü3 Bä‡1ëVj$Ã~8ù«›ÃâOT †­endstream +endobj +6450 0 obj << +/Type /Page +/Contents 6451 0 R +/Resources 6449 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6452 0 obj << +/D [6450 0 R /XYZ 71.731 729.2652 null] +>> endobj +6453 0 obj << +/D [6450 0 R /XYZ 71.731 741.2204 null] +>> endobj +6454 0 obj << +/D [6450 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6455 0 obj << +/D [6450 0 R /XYZ 76.7123 690.4109 null] +>> endobj +6456 0 obj << +/D [6450 0 R /XYZ 139.477 672.4782 null] +>> endobj +6457 0 obj << +/D [6450 0 R /XYZ 139.477 672.4782 null] +>> endobj +6458 0 obj << +/D [6450 0 R /XYZ 71.731 670.3214 null] +>> endobj +6459 0 obj << +/D [6450 0 R /XYZ 139.477 654.5454 null] +>> endobj +6460 0 obj << +/D [6450 0 R /XYZ 139.477 654.5454 null] +>> endobj +6461 0 obj << +/D [6450 0 R /XYZ 71.731 653.1059 null] +>> endobj +6462 0 obj << +/D [6450 0 R /XYZ 139.477 636.6127 null] +>> endobj +6463 0 obj << +/D [6450 0 R /XYZ 139.477 636.6127 null] +>> endobj +6464 0 obj << +/D [6450 0 R /XYZ 71.731 634.4559 null] +>> endobj +6465 0 obj << +/D [6450 0 R /XYZ 139.477 618.6799 null] +>> endobj +6466 0 obj << +/D [6450 0 R /XYZ 139.477 618.6799 null] +>> endobj +6467 0 obj << +/D [6450 0 R /XYZ 71.731 616.5231 null] +>> endobj +6468 0 obj << +/D [6450 0 R /XYZ 139.477 600.7472 null] +>> endobj +6469 0 obj << +/D [6450 0 R /XYZ 139.477 600.7472 null] +>> endobj +6470 0 obj << +/D [6450 0 R /XYZ 71.731 598.5904 null] +>> endobj +6471 0 obj << +/D [6450 0 R /XYZ 139.477 582.8144 null] +>> endobj +6472 0 obj << +/D [6450 0 R /XYZ 139.477 582.8144 null] +>> endobj +6473 0 obj << +/D [6450 0 R /XYZ 71.731 580.6576 null] +>> endobj +6474 0 obj << +/D [6450 0 R /XYZ 71.731 580.6576 null] +>> endobj +6475 0 obj << +/D [6450 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6476 0 obj << +/D [6450 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6477 0 obj << +/D [6450 0 R /XYZ 139.477 529.0162 null] +>> endobj +6478 0 obj << +/D [6450 0 R /XYZ 139.477 529.0162 null] +>> endobj +6479 0 obj << +/D [6450 0 R /XYZ 71.731 526.8593 null] +>> endobj +6480 0 obj << +/D [6450 0 R /XYZ 139.477 511.0834 null] +>> endobj +6481 0 obj << +/D [6450 0 R /XYZ 139.477 511.0834 null] +>> endobj +6482 0 obj << +/D [6450 0 R /XYZ 71.731 508.9266 null] +>> endobj +6483 0 obj << +/D [6450 0 R /XYZ 139.477 493.1507 null] +>> endobj +6484 0 obj << +/D [6450 0 R /XYZ 139.477 493.1507 null] +>> endobj +6485 0 obj << +/D [6450 0 R /XYZ 71.731 490.9938 null] +>> endobj +6486 0 obj << +/D [6450 0 R /XYZ 139.477 475.2179 null] +>> endobj +6487 0 obj << +/D [6450 0 R /XYZ 139.477 475.2179 null] +>> endobj +6488 0 obj << +/D [6450 0 R /XYZ 71.731 473.0611 null] +>> endobj +6489 0 obj << +/D [6450 0 R /XYZ 71.731 473.0611 null] +>> endobj +6490 0 obj << +/D [6450 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6491 0 obj << +/D [6450 0 R /XYZ 76.7123 439.3524 null] +>> endobj +6492 0 obj << +/D [6450 0 R /XYZ 139.477 421.4197 null] +>> endobj +6493 0 obj << +/D [6450 0 R /XYZ 139.477 421.4197 null] +>> endobj +6494 0 obj << +/D [6450 0 R /XYZ 71.731 419.2628 null] +>> endobj +6495 0 obj << +/D [6450 0 R /XYZ 139.477 403.4869 null] +>> endobj +6496 0 obj << +/D [6450 0 R /XYZ 139.477 403.4869 null] +>> endobj +886 0 obj << +/D [6450 0 R /XYZ 71.731 380.5728 null] +>> endobj +398 0 obj << +/D [6450 0 R /XYZ 233.1062 335.3185 null] +>> endobj +6497 0 obj << +/D [6450 0 R /XYZ 71.731 315.1782 null] +>> endobj +6498 0 obj << +/D [6450 0 R /XYZ 161.0655 302.4418 null] +>> endobj +6499 0 obj << +/D [6450 0 R /XYZ 71.731 290.3223 null] +>> endobj +6500 0 obj << +/D [6450 0 R /XYZ 71.731 259.2927 null] +>> endobj +6501 0 obj << +/D [6450 0 R /XYZ 168.8063 247.9462 null] +>> endobj +6502 0 obj << +/D [6450 0 R /XYZ 71.731 220.8827 null] +>> endobj +6503 0 obj << +/D [6450 0 R /XYZ 71.731 177.8606 null] +>> endobj +6504 0 obj << +/D [6450 0 R /XYZ 71.731 134.6227 null] +>> endobj +6449 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6507 0 obj << +/Length 1171 +/Filter /FlateDecode +>> +stream +xÚÅXM£8½÷¯à˜H¯ml sëýíjgԚÉm{Õ¢‰“ !Ð3½ó﷌m>‚rX©•”«žŸ_¹ +H€áGAáBD#Nƒìt‡ƒ<úxG¬ÉÆÚlÆF?oï~ú=ÄA‚’ˆFÁv„I„¸`)Š9‰ƒíîïÕ/ÇôUÉz½¡¯(2×Ç"-¥ú+}1ÿ0ƒOR«]³þgûçÝoÛ>>Jbrdo5‡I“ ˜Ó0 <儅À1 +Y(:œ_¤jë²18ˆ¹ä{smÚ,“M³o‹{sc¿&x•¶…²ö•:Êú-o$Òлx-;ÜhZDdÂ=Eµ¦|õ&wÆŗªÍ‡~ú×ͦE$NºÙéËknm43¼r÷%ü½ÍãšðUZ§' [ePŒù'ãDƈ3‘xùï­6c3Ç?ìÀ¤ãæMCx¢”ÏâR +D¨7îùuÀáfÍq„±Oi«ŽÚ(CXGÐ&¬*TÝfêþLÂz¾,Už¥*¯Ê±e[Ëù-SØÝ Âî­6c³X¢ss¼ Þì"±°ù˜²Ä÷2±nÖǔØ0ALˆ)ŒàŤ·‡]¡ˆÁÉqÎo^¿ZOÆ]7VUŸÕËY„KĂzÇfWÔۛ-ª×÷õÎpøÕ;ÁÑy&ŸóÝsU?—Î®ãñHÄS®óRٓ¬“Y¯4F1‰’%½ŽÌ®éՙ-ëÕ÷½zp ŒôzÃF¬ô¾jN-M;­Á'Œ©9[ýÜŒâ˜-æòÈì7Îl™OÜ[¸ñàðp3†1ÉÌ=Nqà¥ez€•r¾z‡÷‘NÇÿó{óO„Œ/†±Ù•ÂЛ-_Ü +à ‡¿s›àxŸ÷Ž$òLÄB«2²ºÒ©8«ÅFÅô†>å„÷•cŒáýÞ8ìçv¥Gv_TØYc:ù ÂiˆpG½'•`vñûˆ'âpp7ßendstream +endobj +6506 0 obj << +/Type /Page +/Contents 6507 0 R +/Resources 6505 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6508 0 obj << +/D [6506 0 R /XYZ 71.731 729.2652 null] +>> endobj +6509 0 obj << +/D [6506 0 R /XYZ 71.731 718.3063 null] +>> endobj +6510 0 obj << +/D [6506 0 R /XYZ 71.731 631.9816 null] +>> endobj +6511 0 obj << +/D [6506 0 R /XYZ 71.731 620.8718 null] +>> endobj +6512 0 obj << +/D [6506 0 R /XYZ 71.731 619.6265 null] +>> endobj +6513 0 obj << +/D [6506 0 R /XYZ 129.5143 600.5479 null] +>> endobj +6514 0 obj << +/D [6506 0 R /XYZ 129.5143 600.5479 null] +>> endobj +6515 0 obj << +/D [6506 0 R /XYZ 71.731 599.1084 null] +>> endobj +6516 0 obj << +/D [6506 0 R /XYZ 71.731 599.1084 null] +>> endobj +6517 0 obj << +/D [6506 0 R /XYZ 139.477 582.6152 null] +>> endobj +6518 0 obj << +/D [6506 0 R /XYZ 139.477 582.6152 null] +>> endobj +6519 0 obj << +/D [6506 0 R /XYZ 76.7123 564.6824 null] +>> endobj +6520 0 obj << +/D [6506 0 R /XYZ 129.5143 546.7497 null] +>> endobj +6521 0 obj << +/D [6506 0 R /XYZ 129.5143 546.7497 null] +>> endobj +6522 0 obj << +/D [6506 0 R /XYZ 71.731 544.5928 null] +>> endobj +6523 0 obj << +/D [6506 0 R /XYZ 71.731 544.5928 null] +>> endobj +6524 0 obj << +/D [6506 0 R /XYZ 139.477 528.8169 null] +>> endobj +6525 0 obj << +/D [6506 0 R /XYZ 71.731 527.3774 null] +>> endobj +6526 0 obj << +/D [6506 0 R /XYZ 139.477 510.8842 null] +>> endobj +6527 0 obj << +/D [6506 0 R /XYZ 71.731 473.0261 null] +>> endobj +6528 0 obj << +/D [6506 0 R /XYZ 71.731 459.9752 null] +>> endobj +6529 0 obj << +/D [6506 0 R /XYZ 71.731 458.7298 null] +>> endobj +6530 0 obj << +/D [6506 0 R /XYZ 129.5143 439.6513 null] +>> endobj +887 0 obj << +/D [6506 0 R /XYZ 71.731 432.5131 null] +>> endobj +402 0 obj << +/D [6506 0 R /XYZ 199.7086 389.4157 null] +>> endobj +6531 0 obj << +/D [6506 0 R /XYZ 71.731 369.2753 null] +>> endobj +6532 0 obj << +/D [6506 0 R /XYZ 161.0655 356.539 null] +>> endobj +6533 0 obj << +/D [6506 0 R /XYZ 71.731 344.4195 null] +>> endobj +6534 0 obj << +/D [6506 0 R /XYZ 71.731 313.3899 null] +>> endobj +6535 0 obj << +/D [6506 0 R /XYZ 168.8063 302.0433 null] +>> endobj +6536 0 obj << +/D [6506 0 R /XYZ 71.731 274.9799 null] +>> endobj +6537 0 obj << +/D [6506 0 R /XYZ 71.731 246.9017 null] +>> endobj +6538 0 obj << +/D [6506 0 R /XYZ 71.731 203.6638 null] +>> endobj +6539 0 obj << +/D [6506 0 R /XYZ 181.5683 192.6535 null] +>> endobj +6540 0 obj << +/D [6506 0 R /XYZ 71.731 182.5914 null] +>> endobj +6541 0 obj << +/D [6506 0 R /XYZ 71.731 149.8137 null] +>> endobj +6542 0 obj << +/D [6506 0 R /XYZ 71.731 138.0584 null] +>> endobj +6543 0 obj << +/D [6506 0 R /XYZ 71.731 136.813 null] +>> endobj +6544 0 obj << +/D [6506 0 R /XYZ 129.5143 117.7345 null] +>> endobj +6545 0 obj << +/D [6506 0 R /XYZ 129.5143 117.7345 null] +>> endobj +6546 0 obj << +/D [6506 0 R /XYZ 71.731 116.2949 null] +>> endobj +6547 0 obj << +/D [6506 0 R /XYZ 71.731 116.2949 null] +>> endobj +6548 0 obj << +/D [6506 0 R /XYZ 139.477 99.8017 null] +>> endobj +6549 0 obj << +/D [6506 0 R /XYZ 139.477 99.8017 null] +>> endobj +6505 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6553 0 obj << +/Length 1991 +/Filter /FlateDecode +>> +stream +xÚ­š]oœF†ïý+öҖâ)óÅ@îÒ´i]¥n”¸R¥¦ZaÀ^¶ÀÖõ¿ï°Ì°Ã0_N£H^b¿p^ž3sæ0,ÜDüÜ0æ((¦h“ï/¢Í#ÿÓOPH®…æZ}wñÝ;mRÆ(ÞÜ=lpÊȆa +“Í]ñçåÛ]vÊîêÑèéóC5åð>»ŸþûæÃÍtðk9ìÚ¢¿úëïæø3&<ˆÓ$ 8J7×8áñ 6ª L¥m®ã4r½¼”nxÁñffÝ,ïæ3BTw˜@´Q/(ãêŸgò¬µœl5&'ü–)ä7³ðÑ´E¹­ŠmÛmwm?4Ù¾mîáœÀ"†yÄñ¤×䪦ƒVd¥ºªy\ߖ Ì ,1CŸUת쌎ãfqRfÅÉGO„HjŒkÇ)Ï2úPà”ÿ•-mp"¯&·œ« T”ÍP}Ž"į %€J|h™ ”ùÑ↠1ø0 QmLcCÐyw¬ëçéðïcVOtŠéê0ä1ùeå·N#Dét­åpìšþõê¶äT£ r7Êw–y'®)nÀÄ5ùPpÊ´.|pžÇ|°(S€Yšx”*s ¨YæP¦¸jåcYºÄ€Zت}ÙÙþ`¨W|°¤”_B/WbøÝ]az9Ÿ>•°‡ésØUýt”guýJž)ê[™·M!þÞWM.¦øï·7LGå¡Íwö¤aЗEæJŠ”ù“bˆ’݇9)ª ÇB( (E˜|UU0³•¶ŠÌÅVøÙ↰Õ}˜Ùª6øØ{Ø>TuٛF| P’h#>ëºìy9¾-eCƃÐZê¦]«*CýZV„òfŒÅƨv„ò¬µ%BÂmðFrécÄ·mŸši)^3Œ!¯÷öšïÚ+D/ŸšÏ ÿÝ鷆^À )1I7XUe;«¼`MQÀ®l˜Á.|øü¬^Pëz›ï ]¾xQSÝO»²®èv¿Ï1÷‡V×+H/ÿ”ùqµ7{˜ +D|S *Ñ1 +˜ox+"G„ÈŸƒuȐh,PL”]Ç{x3z +ùÿì7F_‰š’5ãD¡9ù³"Ϗ]oÍe€%{’¡¨ِ*: QCò¡Û°$DõqèJ÷Œ` €q̾uZ]%3 u3ƒ&4¢žl(*G6¤ÊŸ CԐlè6,ÙP}ˆÝ>´39w‹ï«~X.¢ãµDș~¹‚<ZfÎ}äØÅÔ¥•;â7™oaPTîRåçnˆÂ]·aá®úà¤sD@#ÿÍ}ßÖç! »éèiWvåìtî®=Ö"÷åbЗ…•}„ùù†üYä /D~ðë!Ü5슉ê±i»r¬;ÛSA6 {¾|§D_îÛ¶.³FdáfB¸æ-JþÓ8ôe‹YŽMÐ?§bÔ¬ˆ—­ 8‰AD‘gmPUöÜÌ*orLQ²³²aNÏÂGÙd÷bdêÅ(4J\IyÛ6c*]6Tm³NŽ¬TçœXYÇ|‚©g¨*k©ò³6D a­Û°°V}ÌÏM¼ü€Çüñ5bÐVýý´]û{’ LbO•WUÆRåglˆÂX·aa¬ú8á=”ݾê{NÉTn’И%Χ«}[hOVÚ5pùC5²mÎlÏ"Z!ò“]‡ «y°pULôí±ËM›)˜§®ŽþcYg‹é¯-¤r(»r.2ƒÜæê¦s:皛˲.ÜB<×mVØW] Àúj»¢r$Lªü3D I™nÒ3ÕÇØ>víñ`i7Ç(Á/k7§£Óe¿Qç‰ÒàÄ×þ¨*{f•7¦¨yXÙ0çaá#«Ÿ²ç~{<ÙP†æa¹Ô¾©G¢ˑ«ê0”ûÃ`|ÀZO{Stlò]Ö<Ú' +âχ„RÏ¢¡ª ’*‚ QC¤Û°$HõqZ4NCÚ¼‡1ŽËÅcwވ“;©ˆ @ÓÈ·O¬Êûij̻OlŠ°O¼òaÜ'^ØOº¶Þ’¥¶ÊóÂw–ˆ?ÃŔQIEæ")e~’†¸!$uf’ª Qn—_ónûy¼Þ.˸¨í®w(ŠCÄ÷O•¹K™Ÿ°!na݇™°j£)‡§¶û¼+óâ7·,Eì%TŠ¼Ô2 €êÌõS5qßñ>+όÛ+ã Ð(um°ÜròãºÆ鋕o¾ÜDº(º²·6ݐE ¡©§‹SU²RåGkˆÂV·a«ú¨úí¡«öY÷lÂË@„ÃM¯µ×òb²æ–Ý魐ïæ=Û¹;õ}6þŞîMU9øK•Ÿ¿!j݆…¿êCTó*FÅ®móã=?=lóRž¦ØÓd©*G©òs4D á¨Û°pT}T¦æ +b€Rê*7ÂðA>bè¡w9à ‘ŸÝ:d:̓…œb¢hzø×:¸ÅZµ(?Ü~Z=o[0§)€ã£Š³"²c–"/fCÈ̺3fÕÄÿúÆÈØýÿv÷å²úüð³å»"â˧$ ŒSç÷SÍúë©a^þ“x¾ÒhFÔúmSCÄÿù#¢endstream +endobj +6552 0 obj << +/Type /Page +/Contents 6553 0 R +/Resources 6551 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6554 0 obj << +/D [6552 0 R /XYZ 71.731 729.2652 null] +>> endobj +6555 0 obj << +/D [6552 0 R /XYZ 76.7123 708.3437 null] +>> endobj +6556 0 obj << +/D [6552 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6557 0 obj << +/D [6552 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6558 0 obj << +/D [6552 0 R /XYZ 71.731 688.2541 null] +>> endobj +6559 0 obj << +/D [6552 0 R /XYZ 71.731 688.2541 null] +>> endobj +6560 0 obj << +/D [6552 0 R /XYZ 139.477 672.4782 null] +>> endobj +6561 0 obj << +/D [6552 0 R /XYZ 71.731 671.0386 null] +>> endobj +6562 0 obj << +/D [6552 0 R /XYZ 139.477 654.5454 null] +>> endobj +6563 0 obj << +/D [6552 0 R /XYZ 71.731 616.6874 null] +>> endobj +6564 0 obj << +/D [6552 0 R /XYZ 71.731 603.6364 null] +>> endobj +6565 0 obj << +/D [6552 0 R /XYZ 71.731 602.3911 null] +>> endobj +6566 0 obj << +/D [6552 0 R /XYZ 129.5143 583.3126 null] +>> endobj +6567 0 obj << +/D [6552 0 R /XYZ 71.731 583.213 null] +>> endobj +6568 0 obj << +/D [6552 0 R /XYZ 71.731 583.213 null] +>> endobj +6569 0 obj << +/D [6552 0 R /XYZ 139.477 565.3798 null] +>> endobj +6570 0 obj << +/D [6552 0 R /XYZ 139.477 565.3798 null] +>> endobj +6571 0 obj << +/D [6552 0 R /XYZ 71.731 563.223 null] +>> endobj +6572 0 obj << +/D [6552 0 R /XYZ 139.477 547.4471 null] +>> endobj +6573 0 obj << +/D [6552 0 R /XYZ 139.477 547.4471 null] +>> endobj +6574 0 obj << +/D [6552 0 R /XYZ 71.731 545.2902 null] +>> endobj +6575 0 obj << +/D [6552 0 R /XYZ 139.477 529.5143 null] +>> endobj +6576 0 obj << +/D [6552 0 R /XYZ 139.477 529.5143 null] +>> endobj +6577 0 obj << +/D [6552 0 R /XYZ 71.731 527.3575 null] +>> endobj +6578 0 obj << +/D [6552 0 R /XYZ 71.731 527.3575 null] +>> endobj +6579 0 obj << +/D [6552 0 R /XYZ 149.4396 511.5816 null] +>> endobj +6580 0 obj << +/D [6552 0 R /XYZ 149.4396 511.5816 null] +>> endobj +6581 0 obj << +/D [6552 0 R /XYZ 71.731 509.4247 null] +>> endobj +6582 0 obj << +/D [6552 0 R /XYZ 149.4396 493.6488 null] +>> endobj +6583 0 obj << +/D [6552 0 R /XYZ 149.4396 493.6488 null] +>> endobj +6584 0 obj << +/D [6552 0 R /XYZ 71.731 491.492 null] +>> endobj +6585 0 obj << +/D [6552 0 R /XYZ 149.4396 475.716 null] +>> endobj +6586 0 obj << +/D [6552 0 R /XYZ 149.4396 475.716 null] +>> endobj +6587 0 obj << +/D [6552 0 R /XYZ 71.731 473.5592 null] +>> endobj +6588 0 obj << +/D [6552 0 R /XYZ 149.4396 457.7833 null] +>> endobj +6589 0 obj << +/D [6552 0 R /XYZ 149.4396 457.7833 null] +>> endobj +6590 0 obj << +/D [6552 0 R /XYZ 71.731 455.6265 null] +>> endobj +6591 0 obj << +/D [6552 0 R /XYZ 149.4396 439.8505 null] +>> endobj +6592 0 obj << +/D [6552 0 R /XYZ 149.4396 439.8505 null] +>> endobj +6593 0 obj << +/D [6552 0 R /XYZ 71.731 438.411 null] +>> endobj +6594 0 obj << +/D [6552 0 R /XYZ 149.4396 421.9178 null] +>> endobj +6595 0 obj << +/D [6552 0 R /XYZ 149.4396 421.9178 null] +>> endobj +6596 0 obj << +/D [6552 0 R /XYZ 71.731 419.761 null] +>> endobj +6597 0 obj << +/D [6552 0 R /XYZ 149.4396 403.985 null] +>> endobj +6598 0 obj << +/D [6552 0 R /XYZ 149.4396 403.985 null] +>> endobj +6599 0 obj << +/D [6552 0 R /XYZ 71.731 401.8282 null] +>> endobj +6600 0 obj << +/D [6552 0 R /XYZ 149.4396 386.0523 null] +>> endobj +6601 0 obj << +/D [6552 0 R /XYZ 149.4396 386.0523 null] +>> endobj +6602 0 obj << +/D [6552 0 R /XYZ 71.731 383.8955 null] +>> endobj +6603 0 obj << +/D [6552 0 R /XYZ 149.4396 368.1195 null] +>> endobj +6604 0 obj << +/D [6552 0 R /XYZ 149.4396 368.1195 null] +>> endobj +6605 0 obj << +/D [6552 0 R /XYZ 71.731 365.9627 null] +>> endobj +6606 0 obj << +/D [6552 0 R /XYZ 149.4396 350.1868 null] +>> endobj +6607 0 obj << +/D [6552 0 R /XYZ 149.4396 350.1868 null] +>> endobj +6608 0 obj << +/D [6552 0 R /XYZ 71.731 348.03 null] +>> endobj +6609 0 obj << +/D [6552 0 R /XYZ 149.4396 332.254 null] +>> endobj +6610 0 obj << +/D [6552 0 R /XYZ 149.4396 332.254 null] +>> endobj +6611 0 obj << +/D [6552 0 R /XYZ 71.731 330.0972 null] +>> endobj +6612 0 obj << +/D [6552 0 R /XYZ 149.4396 314.3213 null] +>> endobj +6613 0 obj << +/D [6552 0 R /XYZ 149.4396 314.3213 null] +>> endobj +6614 0 obj << +/D [6552 0 R /XYZ 71.731 312.1645 null] +>> endobj +6615 0 obj << +/D [6552 0 R /XYZ 149.4396 296.3885 null] +>> endobj +6616 0 obj << +/D [6552 0 R /XYZ 149.4396 296.3885 null] +>> endobj +6617 0 obj << +/D [6552 0 R /XYZ 71.731 294.2317 null] +>> endobj +6618 0 obj << +/D [6552 0 R /XYZ 149.4396 278.4558 null] +>> endobj +6619 0 obj << +/D [6552 0 R /XYZ 149.4396 278.4558 null] +>> endobj +6620 0 obj << +/D [6552 0 R /XYZ 76.7123 260.523 null] +>> endobj +6621 0 obj << +/D [6552 0 R /XYZ 139.477 242.5903 null] +>> endobj +6622 0 obj << +/D [6552 0 R /XYZ 139.477 242.5903 null] +>> endobj +6623 0 obj << +/D [6552 0 R /XYZ 71.731 241.1507 null] +>> endobj +6624 0 obj << +/D [6552 0 R /XYZ 139.477 224.6575 null] +>> endobj +6625 0 obj << +/D [6552 0 R /XYZ 139.477 224.6575 null] +>> endobj +6626 0 obj << +/D [6552 0 R /XYZ 71.731 222.5007 null] +>> endobj +6627 0 obj << +/D [6552 0 R /XYZ 139.477 206.7248 null] +>> endobj +6628 0 obj << +/D [6552 0 R /XYZ 139.477 206.7248 null] +>> endobj +6629 0 obj << +/D [6552 0 R /XYZ 71.731 204.5679 null] +>> endobj +6630 0 obj << +/D [6552 0 R /XYZ 71.731 204.5679 null] +>> endobj +6631 0 obj << +/D [6552 0 R /XYZ 149.4396 188.792 null] +>> endobj +6632 0 obj << +/D [6552 0 R /XYZ 149.4396 188.792 null] +>> endobj +6633 0 obj << +/D [6552 0 R /XYZ 71.731 186.6352 null] +>> endobj +6634 0 obj << +/D [6552 0 R /XYZ 149.4396 170.8593 null] +>> endobj +6635 0 obj << +/D [6552 0 R /XYZ 149.4396 170.8593 null] +>> endobj +6636 0 obj << +/D [6552 0 R /XYZ 71.731 168.7024 null] +>> endobj +6637 0 obj << +/D [6552 0 R /XYZ 149.4396 152.9265 null] +>> endobj +6638 0 obj << +/D [6552 0 R /XYZ 149.4396 152.9265 null] +>> endobj +6639 0 obj << +/D [6552 0 R /XYZ 71.731 150.7697 null] +>> endobj +6640 0 obj << +/D [6552 0 R /XYZ 149.4396 134.9938 null] +>> endobj +6641 0 obj << +/D [6552 0 R /XYZ 149.4396 134.9938 null] +>> endobj +6642 0 obj << +/D [6552 0 R /XYZ 71.731 132.8369 null] +>> endobj +6643 0 obj << +/D [6552 0 R /XYZ 149.4396 117.061 null] +>> endobj +6644 0 obj << +/D [6552 0 R /XYZ 149.4396 117.061 null] +>> endobj +6645 0 obj << +/D [6552 0 R /XYZ 71.731 114.9042 null] +>> endobj +6646 0 obj << +/D [6552 0 R /XYZ 149.4396 99.1283 null] +>> endobj +6647 0 obj << +/D [6552 0 R /XYZ 149.4396 99.1283 null] +>> endobj +6648 0 obj << +/D [6552 0 R /XYZ 71.731 96.9714 null] +>> endobj +6551 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6651 0 obj << +/Length 1495 +/Filter /FlateDecode +>> +stream +xÚ¥™]o£F†ïó+¸‹-­§óÉ ¹ËnÚ*m7Š´©T©©"bHL p¼þ÷=† x†aSå‚¿Ìyyæp8H€á’ É`C#DCAƒåú ÏðÓ¯g¤•,ZÍÂ}¾;û醃E! ƒ»§€E!’’Q¤QÁ]ò÷ìË*ÞVi1_Pg5ÛÛ×x“VďÍáåíu³ó5­VyRÎÿ¹ûíìç».¾`E +‚Œšd‘B‹0XPŒ"J„UEX„¸”p/X!ƙìî…FD¤¾O¸-ëTõ½ÜS*†Þ'àM†9žŽ:ܾ»ÐWÚ`*P€4äGl×¾`·ŽË—ÚÊÑöûpŒ8 ‚Ôº‹†jYÙæùSsðm÷—7ûzÞý´7F0ÁÑ8DSå†Ø©¼mQ'@<±a‡ØóñWé>>Ø!ªˆ…#¯o›mœ$EZ–ÍAþÔl·E¶Ž‹Csð<34§b¶Ÿ¸âà.)lõ7T#ÀµÊÜu +ð¡ pÓÇ&ORH½}^¼ê4µç'ԁ•?=ã²Ì—<õIs¼ÏªU³W­²Ò–Â.Ö0u¡Œ|5ØP°Ö*?kKÔ)¬‡6¬Mɦ¤Д#L>Z~Ët™o’®_Ý|Ó狷9³‘ú€1’\ú*°¡Á­U~ܖ¨Spm8p›>÷¯Ù:«ì© —pWnŽ7É>Ktw£Ø( +Ýáž*kªÜ;•—¢-êŠ'6ì{>ªÃ6ý@Ò^šÉzã¸wNÑ3jUçÙöŸÃIâär¤ñ`S5ÂW«ü|-Q§ðÚpð5}¬‹ a&¡ÐLxɶÁm†²‚ž ÇU¶^ÒC9-§—È.Ü8ÔQ#µjaÊ,ôNFsâB`jëƧ¯:õÑÇ'À¦¬ïð=8z*HDx#½ñ¯ÿ³’Ö}ýÁ謜4)AœDÒGӐÑÔ2?MKÜ)4‡>4M@Óö?à-9ûoõ‰øu笐LÁìîy®M•û¹îTÞçÚuÂs}bÃþ\÷|¤ß·´“?¾\ºª_ËÍ¿i»Ï*[·§ö«T¿¾ßëè|î“Í\ζËèlõÞ\ÿÕ^»Í—+ç$……”xz,S52IZåŸ$KÔ)“4´á˜$ÓG\A?î*ë<‰ª´Šþof°ÂÑS6LÙHÙèdÞ²a‹;¡lœø°—ž‘f +GÑ´vª™Š9ųÎÿ÷u®µ×ê0‚¤‘°!¬e~À–¸S}8›>Þt)†Ê¬"ùa½2 cÃÝAkBÄÑʂÀkóf’±Æ E¯¿ÄI5»É«ìép;g¸þÇ¡2ßX+žDŠâºTPÏj“4·E^åõ_tW¼ch¯]ÀË)$ª ÜFƒEe¥[–Ç»jÕÞìöøÛCÝQ¾ÖŸ 9žµ¿”»ÇÓ¥.±yrÐËóÕ…ŽlZ½JËe‘mëµÓÅ0Ú¯›\!EÂhô¨¡9ýþ)(¤ðZЪ:0Á¡ós¦%âÓ1‹»endstream +endobj +6650 0 obj << +/Type /Page +/Contents 6651 0 R +/Resources 6649 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6652 0 obj << +/D [6650 0 R /XYZ 71.731 729.2652 null] +>> endobj +6653 0 obj << +/D [6650 0 R /XYZ 71.731 741.2204 null] +>> endobj +6654 0 obj << +/D [6650 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6655 0 obj << +/D [6650 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6656 0 obj << +/D [6650 0 R /XYZ 71.731 706.1869 null] +>> endobj +6657 0 obj << +/D [6650 0 R /XYZ 149.4396 690.4109 null] +>> endobj +6658 0 obj << +/D [6650 0 R /XYZ 149.4396 690.4109 null] +>> endobj +6659 0 obj << +/D [6650 0 R /XYZ 71.731 688.2541 null] +>> endobj +6660 0 obj << +/D [6650 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6661 0 obj << +/D [6650 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6662 0 obj << +/D [6650 0 R /XYZ 71.731 671.0386 null] +>> endobj +6663 0 obj << +/D [6650 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6664 0 obj << +/D [6650 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6665 0 obj << +/D [6650 0 R /XYZ 71.731 652.3886 null] +>> endobj +6666 0 obj << +/D [6650 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6667 0 obj << +/D [6650 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6668 0 obj << +/D [6650 0 R /XYZ 71.731 635.1731 null] +>> endobj +6669 0 obj << +/D [6650 0 R /XYZ 149.4396 618.6799 null] +>> endobj +6670 0 obj << +/D [6650 0 R /XYZ 149.4396 618.6799 null] +>> endobj +6671 0 obj << +/D [6650 0 R /XYZ 71.731 616.5231 null] +>> endobj +6672 0 obj << +/D [6650 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6673 0 obj << +/D [6650 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6674 0 obj << +/D [6650 0 R /XYZ 71.731 599.3076 null] +>> endobj +6675 0 obj << +/D [6650 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6676 0 obj << +/D [6650 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6677 0 obj << +/D [6650 0 R /XYZ 71.731 580.6576 null] +>> endobj +6678 0 obj << +/D [6650 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6679 0 obj << +/D [6650 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6680 0 obj << +/D [6650 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6681 0 obj << +/D [6650 0 R /XYZ 139.477 529.0162 null] +>> endobj +6682 0 obj << +/D [6650 0 R /XYZ 139.477 529.0162 null] +>> endobj +6683 0 obj << +/D [6650 0 R /XYZ 71.731 526.8593 null] +>> endobj +6684 0 obj << +/D [6650 0 R /XYZ 71.731 526.8593 null] +>> endobj +6685 0 obj << +/D [6650 0 R /XYZ 149.4396 511.0834 null] +>> endobj +6686 0 obj << +/D [6650 0 R /XYZ 149.4396 511.0834 null] +>> endobj +6687 0 obj << +/D [6650 0 R /XYZ 71.731 508.9266 null] +>> endobj +6688 0 obj << +/D [6650 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6689 0 obj << +/D [6650 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6690 0 obj << +/D [6650 0 R /XYZ 71.731 490.9938 null] +>> endobj +6691 0 obj << +/D [6650 0 R /XYZ 149.4396 475.2179 null] +>> endobj +6692 0 obj << +/D [6650 0 R /XYZ 149.4396 475.2179 null] +>> endobj +6693 0 obj << +/D [6650 0 R /XYZ 71.731 473.7784 null] +>> endobj +6694 0 obj << +/D [6650 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6695 0 obj << +/D [6650 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6696 0 obj << +/D [6650 0 R /XYZ 71.731 455.1283 null] +>> endobj +6697 0 obj << +/D [6650 0 R /XYZ 71.731 455.1283 null] +>> endobj +6698 0 obj << +/D [6650 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6699 0 obj << +/D [6650 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6700 0 obj << +/D [6650 0 R /XYZ 71.731 437.1956 null] +>> endobj +6701 0 obj << +/D [6650 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6702 0 obj << +/D [6650 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6703 0 obj << +/D [6650 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6704 0 obj << +/D [6650 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6705 0 obj << +/D [6650 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6706 0 obj << +/D [6650 0 R /XYZ 71.731 383.3973 null] +>> endobj +6707 0 obj << +/D [6650 0 R /XYZ 149.4396 367.6214 null] +>> endobj +6708 0 obj << +/D [6650 0 R /XYZ 149.4396 367.6214 null] +>> endobj +6709 0 obj << +/D [6650 0 R /XYZ 71.731 365.4646 null] +>> endobj +6710 0 obj << +/D [6650 0 R /XYZ 71.731 365.4646 null] +>> endobj +6711 0 obj << +/D [6650 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6712 0 obj << +/D [6650 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6713 0 obj << +/D [6650 0 R /XYZ 71.731 347.5318 null] +>> endobj +6714 0 obj << +/D [6650 0 R /XYZ 159.4023 331.7559 null] +>> endobj +6715 0 obj << +/D [6650 0 R /XYZ 159.4023 331.7559 null] +>> endobj +888 0 obj << +/D [6650 0 R /XYZ 71.731 272.9763 null] +>> endobj +406 0 obj << +/D [6650 0 R /XYZ 230.7311 227.722 null] +>> endobj +6716 0 obj << +/D [6650 0 R /XYZ 71.731 204.2332 null] +>> endobj +6717 0 obj << +/D [6650 0 R /XYZ 161.0655 194.8453 null] +>> endobj +6718 0 obj << +/D [6650 0 R /XYZ 71.731 182.7258 null] +>> endobj +6719 0 obj << +/D [6650 0 R /XYZ 71.731 151.36 null] +>> endobj +6720 0 obj << +/D [6650 0 R /XYZ 168.8063 140.3497 null] +>> endobj +6649 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6723 0 obj << +/Length 1422 +/Filter /FlateDecode +>> +stream +xÚµY]›8}Ÿ_Ác"5^`Œû6ݏª«]iÔ¦OÛUÅ$d‚”ˆ­æßï%ØÄÀ5f¥Í„9ö=Î¹Ø ‹(ü±H1¢¸&<‘<ÚhôÿúøÀ de0+ôaýðÓo‚Fšè„'Ñz ©âH NRÉÒh½ýkñó>;×yµ\qIœ´Ç§CVæõÙsûññéS{òg^ïOÛËòïõï¿®»úR(¢S(2I²Cir¥@3‰š þ+Y,"ES"b¡n<¿ä%¾±ÈÊö˜¯ŽYqhϏù咽äí‡údŽ{sárÎ7Å7Jy¾m/\/yu17ûi×ÏpéT~o`‡N‘ââ™!+·}„e•UUöڞžv÷j¼Í˺§jÆÅzqª9A¢c$‘‰¸Ýn3¤Ìà®Þ™©Ì™¡SW×Mí«’ÕuUežéî'!‰PÉí~>çõµ*MUfÄ0Ä/×͆ÛЛî®]™ÓUãZ•´nx<N öq|>òËûnøÝMv4qYªo£³í±(,åi›Ï­úÔÜuVÁcmÚjn ãJ¦"©8á2FSЁVʆ¢(»…`8WSÿçrT”s ãXÑáñN‘)–D—Dv­÷ˆ`<&´™¿¼wMúnÐCšñM6Y]œJy­òñÝY2&‚3kjQ+v•5ͱw?æU;…t¢uý²ÚQc}]…&±R} KÛ_u%D)†Ö=Ô¢kõEd=¶Óõz"„ßï[–’XÊ4d\6å\ [©;Ç»CóºTžð`>ؔ>Ö©;G„¦Ë#”Ϲ’™xñD¡U ª.ÊÕŒ*VuFTG4ð¨öx²‰¤R¢©~“×'oN’8”T6áÄt"Vw†1ˆ{> endobj +6724 0 obj << +/D [6722 0 R /XYZ 71.731 729.2652 null] +>> endobj +6725 0 obj << +/D [6722 0 R /XYZ 71.731 718.3063 null] +>> endobj +6726 0 obj << +/D [6722 0 R /XYZ 71.731 660.0349 null] +>> endobj +6727 0 obj << +/D [6722 0 R /XYZ 181.5683 647.1731 null] +>> endobj +6728 0 obj << +/D [6722 0 R /XYZ 71.731 637.1109 null] +>> endobj +6729 0 obj << +/D [6722 0 R /XYZ 71.731 604.3333 null] +>> endobj +6730 0 obj << +/D [6722 0 R /XYZ 71.731 592.5779 null] +>> endobj +6731 0 obj << +/D [6722 0 R /XYZ 71.731 591.3326 null] +>> endobj +6732 0 obj << +/D [6722 0 R /XYZ 129.5143 572.254 null] +>> endobj +6733 0 obj << +/D [6722 0 R /XYZ 129.5143 572.254 null] +>> endobj +6734 0 obj << +/D [6722 0 R /XYZ 71.731 570.8145 null] +>> endobj +6735 0 obj << +/D [6722 0 R /XYZ 71.731 570.8145 null] +>> endobj +6736 0 obj << +/D [6722 0 R /XYZ 139.477 554.3213 null] +>> endobj +6737 0 obj << +/D [6722 0 R /XYZ 139.477 554.3213 null] +>> endobj +6738 0 obj << +/D [6722 0 R /XYZ 76.7123 536.3885 null] +>> endobj +6739 0 obj << +/D [6722 0 R /XYZ 129.5143 518.4558 null] +>> endobj +6740 0 obj << +/D [6722 0 R /XYZ 129.5143 518.4558 null] +>> endobj +6741 0 obj << +/D [6722 0 R /XYZ 71.731 516.299 null] +>> endobj +6742 0 obj << +/D [6722 0 R /XYZ 71.731 516.299 null] +>> endobj +6743 0 obj << +/D [6722 0 R /XYZ 139.477 500.523 null] +>> endobj +6744 0 obj << +/D [6722 0 R /XYZ 71.731 498.3662 null] +>> endobj +6745 0 obj << +/D [6722 0 R /XYZ 71.731 498.3662 null] +>> endobj +6746 0 obj << +/D [6722 0 R /XYZ 149.4396 482.5903 null] +>> endobj +6747 0 obj << +/D [6722 0 R /XYZ 71.731 481.1507 null] +>> endobj +6748 0 obj << +/D [6722 0 R /XYZ 149.4396 464.6575 null] +>> endobj +6749 0 obj << +/D [6722 0 R /XYZ 76.7123 446.7248 null] +>> endobj +6750 0 obj << +/D [6722 0 R /XYZ 139.477 428.792 null] +>> endobj +6751 0 obj << +/D [6722 0 R /XYZ 71.731 427.3525 null] +>> endobj +6752 0 obj << +/D [6722 0 R /XYZ 71.731 427.3525 null] +>> endobj +6753 0 obj << +/D [6722 0 R /XYZ 149.4396 410.8593 null] +>> endobj +6754 0 obj << +/D [6722 0 R /XYZ 149.4396 410.8593 null] +>> endobj +6755 0 obj << +/D [6722 0 R /XYZ 71.731 408.7024 null] +>> endobj +6756 0 obj << +/D [6722 0 R /XYZ 71.731 408.7024 null] +>> endobj +6757 0 obj << +/D [6722 0 R /XYZ 159.4023 392.9265 null] +>> endobj +6758 0 obj << +/D [6722 0 R /XYZ 71.731 390.7697 null] +>> endobj +6759 0 obj << +/D [6722 0 R /XYZ 159.4023 374.9938 null] +>> endobj +6760 0 obj << +/D [6722 0 R /XYZ 76.7123 357.061 null] +>> endobj +6761 0 obj << +/D [6722 0 R /XYZ 149.4396 339.1283 null] +>> endobj +6762 0 obj << +/D [6722 0 R /XYZ 149.4396 339.1283 null] +>> endobj +6763 0 obj << +/D [6722 0 R /XYZ 71.731 336.9714 null] +>> endobj +6764 0 obj << +/D [6722 0 R /XYZ 71.731 336.9714 null] +>> endobj +6765 0 obj << +/D [6722 0 R /XYZ 159.4023 321.1955 null] +>> endobj +6766 0 obj << +/D [6722 0 R /XYZ 71.731 319.0387 null] +>> endobj +6767 0 obj << +/D [6722 0 R /XYZ 159.4023 303.2628 null] +>> endobj +6768 0 obj << +/D [6722 0 R /XYZ 76.7123 285.33 null] +>> endobj +6769 0 obj << +/D [6722 0 R /XYZ 149.4396 267.3973 null] +>> endobj +6770 0 obj << +/D [6722 0 R /XYZ 149.4396 267.3973 null] +>> endobj +6771 0 obj << +/D [6722 0 R /XYZ 71.731 265.2404 null] +>> endobj +6772 0 obj << +/D [6722 0 R /XYZ 71.731 265.2404 null] +>> endobj +6773 0 obj << +/D [6722 0 R /XYZ 159.4023 249.4645 null] +>> endobj +6774 0 obj << +/D [6722 0 R /XYZ 71.731 247.3077 null] +>> endobj +6775 0 obj << +/D [6722 0 R /XYZ 159.4023 231.5317 null] +>> endobj +6776 0 obj << +/D [6722 0 R /XYZ 76.7123 213.599 null] +>> endobj +6777 0 obj << +/D [6722 0 R /XYZ 149.4396 195.6662 null] +>> endobj +6778 0 obj << +/D [6722 0 R /XYZ 149.4396 195.6662 null] +>> endobj +6779 0 obj << +/D [6722 0 R /XYZ 71.731 193.5094 null] +>> endobj +6780 0 obj << +/D [6722 0 R /XYZ 71.731 193.5094 null] +>> endobj +6781 0 obj << +/D [6722 0 R /XYZ 159.4023 177.7335 null] +>> endobj +6782 0 obj << +/D [6722 0 R /XYZ 71.731 175.5767 null] +>> endobj +6783 0 obj << +/D [6722 0 R /XYZ 159.4023 159.8007 null] +>> endobj +6784 0 obj << +/D [6722 0 R /XYZ 76.7123 141.868 null] +>> endobj +6785 0 obj << +/D [6722 0 R /XYZ 149.4396 123.9352 null] +>> endobj +6786 0 obj << +/D [6722 0 R /XYZ 149.4396 123.9352 null] +>> endobj +6787 0 obj << +/D [6722 0 R /XYZ 71.731 121.7784 null] +>> endobj +6788 0 obj << +/D [6722 0 R /XYZ 71.731 121.7784 null] +>> endobj +6789 0 obj << +/D [6722 0 R /XYZ 159.4023 106.0025 null] +>> endobj +6790 0 obj << +/D [6722 0 R /XYZ 71.731 103.8457 null] +>> endobj +6721 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6793 0 obj << +/Length 1344 +/Filter /FlateDecode +>> +stream +xÚµš[OëF…ßù~©Lç>㾝^N/j¥£*}*2ÉÖ rLø÷ÙN¶gO@œ„…÷òÊú2vˆ¨xü•Ì©¸‘5“ÖÈjùpÆ«»ø«ŸÏÄ ¹4—PôýâìۏŠW5«­´Õâ¶RµeÆéÊ)ɼ¾Z¬þ>ÿá¾yìCwq) ?—ì°ý´n6¡ÿ½¹9Üýðé×Í?B¿]í.þYüvöÓbœo”cµC²&•÷ÌhU]JÎj) *ºf:ÇÂ=SZ¹ñXd]9&öǏeԍ²ýÁ\IiŽÍ #Xm¸¬àÓÜãí«ôW¨×L…‰>¸TSM×5χȶ·‡í®ïÚÍÝ7‡;‹ eÎÛ~N̪¸;ç*ëdÜz<È$º„*$¢ã}Í&¤ã±zgÑ©ó ¥¿:µ¡|åcBVOž©‰§n½·qœ¦gVñýˆ½æ;˜ÜæPÔـO-M7:¶Ïh¢uP–iÝ(#[‡Í-hæiÝÄǤb¿lÂáÖcsæcQ–Y! åbI2:dnI,ˆ,胂‘H*QÄ9sÚQDU†È¤¢‰D¦–ylc†Hèãßе·í²éÛíæúsxFðô5SB¾ÆÇ%IhŠN(ËÔp”‘5ÄæÔóÔpâcÒ¹?Ã.ô©t»Ý— ±Oouxäóþ^¸æüy>0«™÷‚âÊr%2·$0ÄôAqûÕšx²Â…%ˆ†ªy¢GI46µ€è8ÑaÓܬà +Ysf¸Ÿ‚|³Ý®C³!INºÙf +Á¸W$Ê@–kf’ÑÍDæ–4ñ5ú"HëG³’ aˆ$f¤kńá½P–Éh”‘as 2Â| M|Ì7çÿÇ6@¦cÒX¨švT‘ÀbS €=±;ññx¿Ý×µòµ…7þ`ÊHŠV(Ë51Éè&"sKšˆøÀš}]y¹Ø³u8DýòÐæéá&^Ï&$Ó¢&Y²\BIF'„Ì-Iñ%}З«¥¡ t)o˜1š ªæIU$©ØÔROlà¤N|<†Ð]?†nϕ[l…už kÝÙvӓ¼î5sUTÖ1++”eª8ÊÈ*bs ªˆù@ª8ñ(ÝÇýÉÛ¶ íÝ°:<íÒÛTí*lúöŠs™i҉`Ȑ¬â ë=E2”åâK2:>dnI|ˆ,>è/ԛ'šÐŠysÉcT̓ŠÆ™Z‚ù±Ì¡—ëŠý5r +m╊{—5YÖqß5§0‡²LOGÙSlnAO1HO'>&ˡårû´™½”k‡¶.»çÇþŠ¿Åá¡Ûm÷0£sÑa|ꉁ,c’Ñ1"sKbD|`1BÔÂýÆɨJ-¯%=TÍc?ªH챩؟ØÀ±ŸøÈ-ìñù’6îøMv)u¼rªIâ,WÕ$£«ŠÌ-©*â«*ôñº ý…¯:³Ùpˤ´$Æ@–Ë&Éèl¹%Ù >°l ìª]×À“pœ)+6¡jžÍQE²‰M-`óÄÎæÄǪéÃõ² qƒáÏ%5wâmñF2-=…'”e*8ÊÈ +bs *ˆù@*8ññÚ·c²CJ›aèÛô’/÷齚.-/ËJz?<9xšJ3] +h(Ë¥™dtšÈܒ4XšÐGèw xÀ¶þ‰š}¢ù€$"ùGFà짚x¹ìnKßÑþJì‡Shϼ°uöó@súq #ãÊÛqO{k‚ûÙOO ÿÏYgaendstream +endobj +6792 0 obj << +/Type /Page +/Contents 6793 0 R +/Resources 6791 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6794 0 obj << +/D [6792 0 R /XYZ 71.731 729.2652 null] +>> endobj +6795 0 obj << +/D [6792 0 R /XYZ 159.4023 708.3437 null] +>> endobj +6796 0 obj << +/D [6792 0 R /XYZ 76.7123 690.4109 null] +>> endobj +6797 0 obj << +/D [6792 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6798 0 obj << +/D [6792 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6799 0 obj << +/D [6792 0 R /XYZ 71.731 670.3214 null] +>> endobj +6800 0 obj << +/D [6792 0 R /XYZ 71.731 670.3214 null] +>> endobj +6801 0 obj << +/D [6792 0 R /XYZ 159.4023 654.5454 null] +>> endobj +6802 0 obj << +/D [6792 0 R /XYZ 71.731 652.3886 null] +>> endobj +6803 0 obj << +/D [6792 0 R /XYZ 159.4023 636.6127 null] +>> endobj +6804 0 obj << +/D [6792 0 R /XYZ 76.7123 618.6799 null] +>> endobj +6805 0 obj << +/D [6792 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6806 0 obj << +/D [6792 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6807 0 obj << +/D [6792 0 R /XYZ 71.731 598.5904 null] +>> endobj +6808 0 obj << +/D [6792 0 R /XYZ 71.731 598.5904 null] +>> endobj +6809 0 obj << +/D [6792 0 R /XYZ 159.4023 582.8144 null] +>> endobj +6810 0 obj << +/D [6792 0 R /XYZ 71.731 580.6576 null] +>> endobj +6811 0 obj << +/D [6792 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6812 0 obj << +/D [6792 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6813 0 obj << +/D [6792 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6814 0 obj << +/D [6792 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6815 0 obj << +/D [6792 0 R /XYZ 71.731 526.8593 null] +>> endobj +6816 0 obj << +/D [6792 0 R /XYZ 71.731 526.8593 null] +>> endobj +6817 0 obj << +/D [6792 0 R /XYZ 159.4023 511.0834 null] +>> endobj +6818 0 obj << +/D [6792 0 R /XYZ 71.731 509.6439 null] +>> endobj +6819 0 obj << +/D [6792 0 R /XYZ 159.4023 493.1507 null] +>> endobj +6820 0 obj << +/D [6792 0 R /XYZ 76.7123 475.2179 null] +>> endobj +6821 0 obj << +/D [6792 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6822 0 obj << +/D [6792 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6823 0 obj << +/D [6792 0 R /XYZ 71.731 455.1283 null] +>> endobj +6824 0 obj << +/D [6792 0 R /XYZ 71.731 455.1283 null] +>> endobj +6825 0 obj << +/D [6792 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6826 0 obj << +/D [6792 0 R /XYZ 71.731 437.1956 null] +>> endobj +6827 0 obj << +/D [6792 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6828 0 obj << +/D [6792 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6829 0 obj << +/D [6792 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6830 0 obj << +/D [6792 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6831 0 obj << +/D [6792 0 R /XYZ 71.731 383.3973 null] +>> endobj +6832 0 obj << +/D [6792 0 R /XYZ 71.731 383.3973 null] +>> endobj +6833 0 obj << +/D [6792 0 R /XYZ 159.4023 367.6214 null] +>> endobj +6834 0 obj << +/D [6792 0 R /XYZ 71.731 365.4646 null] +>> endobj +6835 0 obj << +/D [6792 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6836 0 obj << +/D [6792 0 R /XYZ 76.7123 331.7559 null] +>> endobj +6837 0 obj << +/D [6792 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6838 0 obj << +/D [6792 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6839 0 obj << +/D [6792 0 R /XYZ 71.731 311.6663 null] +>> endobj +6840 0 obj << +/D [6792 0 R /XYZ 71.731 311.6663 null] +>> endobj +6841 0 obj << +/D [6792 0 R /XYZ 159.4023 295.8904 null] +>> endobj +6842 0 obj << +/D [6792 0 R /XYZ 71.731 293.7336 null] +>> endobj +6843 0 obj << +/D [6792 0 R /XYZ 159.4023 277.9576 null] +>> endobj +6844 0 obj << +/D [6792 0 R /XYZ 76.7123 260.0249 null] +>> endobj +6845 0 obj << +/D [6792 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6846 0 obj << +/D [6792 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6847 0 obj << +/D [6792 0 R /XYZ 71.731 239.9353 null] +>> endobj +6848 0 obj << +/D [6792 0 R /XYZ 71.731 239.9353 null] +>> endobj +6849 0 obj << +/D [6792 0 R /XYZ 159.4023 224.1594 null] +>> endobj +6850 0 obj << +/D [6792 0 R /XYZ 71.731 222.7198 null] +>> endobj +6851 0 obj << +/D [6792 0 R /XYZ 159.4023 206.2266 null] +>> endobj +6852 0 obj << +/D [6792 0 R /XYZ 76.7123 188.2939 null] +>> endobj +6853 0 obj << +/D [6792 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6854 0 obj << +/D [6792 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6855 0 obj << +/D [6792 0 R /XYZ 71.731 168.2043 null] +>> endobj +6856 0 obj << +/D [6792 0 R /XYZ 71.731 168.2043 null] +>> endobj +6857 0 obj << +/D [6792 0 R /XYZ 159.4023 152.4284 null] +>> endobj +6858 0 obj << +/D [6792 0 R /XYZ 71.731 150.9888 null] +>> endobj +6859 0 obj << +/D [6792 0 R /XYZ 159.4023 134.4956 null] +>> endobj +6860 0 obj << +/D [6792 0 R /XYZ 76.7123 116.5629 null] +>> endobj +6861 0 obj << +/D [6792 0 R /XYZ 149.4396 98.6301 null] +>> endobj +6862 0 obj << +/D [6792 0 R /XYZ 149.4396 98.6301 null] +>> endobj +6863 0 obj << +/D [6792 0 R /XYZ 71.731 96.4733 null] +>> endobj +6864 0 obj << +/D [6792 0 R /XYZ 71.731 96.4733 null] +>> endobj +6791 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6867 0 obj << +/Length 1197 +/Filter /FlateDecode +>> +stream +xÚ½˜Moã6†ïù:Ú@͒”ø¡ÜÒf[lÑÆÖ=5E HL¬Ö– ‰Þmþ}G)ÑõÑ-rb¿â¼|f8"M $‰.4F”3¤Ç;¼ÁWßß#ÙÍÆ}³»ûú»1Š9åÁî5cŽ˜ˆR$‘Á.ûmõí>9iU­7”áEíu{H +¥L^Ú¶ۛŸ”Þ—Y½þ}÷Ã݇]Ÿ…Å‚Lš ¥D, +ƒ Å(¦„yE$ŠQFa.X¢0 +E7‘fž0—N×ɚÉåõÑ3% |`^ûÈ ý•!©,[]¶×/û<ݛöyÝޝk+{Q‡²x îæËcŒ"‚ãz®l‚^'›¥ç‹»€žÏ‡‡Þ•¤ª’÷–FùÚ^ÿ !„"à,‚ªd‘Ÿ§m\•çíX£4#à"÷F§iŸÚe &®³êúø¬ªü5O—ųúë”Wêã6#,E´yê¾ãnahús3^­!GœP1W­ŽlªZ­l¾Z=q—T«Ç‡¯Z]}i>&ZJEf +2?*[¥ªhï>¯ [ARž0¦&-® ^©æsÃörßçÊϖHÄE<Û Ù[+›g뉻„­Ç‡­ëc²üO¸ÍÚf^š$šé®j¼OtªÙ>ዺ O løûĕuLòƒ§1À+=”±¼î µ®òâm¶5ÙX3!)É\wpeÜÉf+ØwAû|x*øÊGKÀ¾»ªü˜T¶æ6à-º,ƒÒ_ê,â(ŽäÜRweS ¬l”'îP>P®Ñêù·ìHŒƒ,D‚!JÄ;«Ú¸²ž],pËn0Ú(;JaH¨7î8;ûÔÐÇõ҅ÕÈl¢¯|Ôç—?Tª=‹7ÂÒù¯áúÁAéŒãGÉ¢rd{ï tdS(­l¥'î”·>FPº>^ÊìÝ×#$XDr´ƒÀ™ž#˜4G.Á۞ðIésUÔ÷ãœqœÍaîUS”jò0èÆCÎJï;&ú81ot»ÜÏi + ùõlßB`2CØ%]Ȓ!F4dü2…ŽÓœY…ª/e©.3å[IŠoò°­J]ê÷“ºïžèËÃ<»¡¶z¦G9!.ŽŸ0ÃÉYïÍ| +øâ9ϞËêy_ÖºHŽ +ÄcgcGwí<ª:­òS³C™2{OÆikèUdµ=úSõI¥—ÍŽÊz[¦U:Šäp0Íôµ¬Ž‰ÖVþë㶽9%i»Q҃sV½/Ï£O8k™Lêë“Yuáe¾;U–Ö Âr¶B—õa:1IÚl>dǼ¨í°Åpø¬ß´5ó2¿WìÖ|¦ûúf?¸ýx;ZYØi»ã6CÙguÇ37›:תóK`ë +î.do5wù`lþIêۚ·¶je\Mu9Ì{ç°·…Ñ«Gu«®(õÔ0‹-T?ãáe¶#ƛGKküáp(ה­¾ØjûTT½tý%M}˜iœrs£!ï·MÍüIØÞòxò'3G3üŌÑáPòn¤ÆÁñè`žˆ²‰5endstream +endobj +6866 0 obj << +/Type /Page +/Contents 6867 0 R +/Resources 6865 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6868 0 obj << +/D [6866 0 R /XYZ 71.731 729.2652 null] +>> endobj +6869 0 obj << +/D [6866 0 R /XYZ 159.4023 708.3437 null] +>> endobj +6870 0 obj << +/D [6866 0 R /XYZ 71.731 706.1869 null] +>> endobj +6871 0 obj << +/D [6866 0 R /XYZ 159.4023 690.4109 null] +>> endobj +6872 0 obj << +/D [6866 0 R /XYZ 76.7123 672.4782 null] +>> endobj +6873 0 obj << +/D [6866 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6874 0 obj << +/D [6866 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6875 0 obj << +/D [6866 0 R /XYZ 71.731 652.3886 null] +>> endobj +6876 0 obj << +/D [6866 0 R /XYZ 71.731 652.3886 null] +>> endobj +6877 0 obj << +/D [6866 0 R /XYZ 159.4023 636.6127 null] +>> endobj +6878 0 obj << +/D [6866 0 R /XYZ 71.731 634.4559 null] +>> endobj +6879 0 obj << +/D [6866 0 R /XYZ 159.4023 618.6799 null] +>> endobj +6880 0 obj << +/D [6866 0 R /XYZ 76.7123 600.7472 null] +>> endobj +6881 0 obj << +/D [6866 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6882 0 obj << +/D [6866 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6883 0 obj << +/D [6866 0 R /XYZ 71.731 580.6576 null] +>> endobj +6884 0 obj << +/D [6866 0 R /XYZ 71.731 580.6576 null] +>> endobj +6885 0 obj << +/D [6866 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6886 0 obj << +/D [6866 0 R /XYZ 71.731 562.7248 null] +>> endobj +6887 0 obj << +/D [6866 0 R /XYZ 159.4023 546.9489 null] +>> endobj +6888 0 obj << +/D [6866 0 R /XYZ 76.7123 493.1507 null] +>> endobj +6889 0 obj << +/D [6866 0 R /XYZ 129.5143 475.2179 null] +>> endobj +6890 0 obj << +/D [6866 0 R /XYZ 129.5143 475.2179 null] +>> endobj +6891 0 obj << +/D [6866 0 R /XYZ 71.731 473.0611 null] +>> endobj +6892 0 obj << +/D [6866 0 R /XYZ 129.5143 457.2852 null] +>> endobj +6893 0 obj << +/D [6866 0 R /XYZ 129.5143 457.2852 null] +>> endobj +6894 0 obj << +/D [6866 0 R /XYZ 71.731 435.2031 null] +>> endobj +6895 0 obj << +/D [6866 0 R /XYZ 71.731 424.3089 null] +>> endobj +6896 0 obj << +/D [6866 0 R /XYZ 71.731 423.0636 null] +>> endobj +6897 0 obj << +/D [6866 0 R /XYZ 129.5143 403.985 null] +>> endobj +889 0 obj << +/D [6866 0 R /XYZ 71.731 397.5642 null] +>> endobj +410 0 obj << +/D [6866 0 R /XYZ 217.1313 353.7494 null] +>> endobj +6898 0 obj << +/D [6866 0 R /XYZ 71.731 333.609 null] +>> endobj +6899 0 obj << +/D [6866 0 R /XYZ 161.0655 320.8727 null] +>> endobj +6900 0 obj << +/D [6866 0 R /XYZ 71.731 308.7532 null] +>> endobj +6901 0 obj << +/D [6866 0 R /XYZ 71.731 277.7236 null] +>> endobj +6902 0 obj << +/D [6866 0 R /XYZ 168.8063 266.3771 null] +>> endobj +6903 0 obj << +/D [6866 0 R /XYZ 71.731 239.3136 null] +>> endobj +6904 0 obj << +/D [6866 0 R /XYZ 71.731 207.9478 null] +>> endobj +6905 0 obj << +/D [6866 0 R /XYZ 71.731 191.3101 null] +>> endobj +6906 0 obj << +/D [6866 0 R /XYZ 71.731 148.4085 null] +>> endobj +6907 0 obj << +/D [6866 0 R /XYZ 181.5683 137.062 null] +>> endobj +6908 0 obj << +/D [6866 0 R /XYZ 71.731 126.9998 null] +>> endobj +6865 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6911 0 obj << +/Length 1046 +/Filter /FlateDecode +>> +stream +xÚÍX]›8}Ÿ_Ác"5^`¦OӏYuµ»UyëT#Jœ‰@Uý÷{ ˜àªTµš˜pÌ9ν¾‚þH ’ 4FTp¤Ç;|…KÞ ÙXÌƽÙÞýñÈp£XPl÷‹â2 $£(â$ +¶»O«·‡äT«j½¡¯(jŽOyR¨úïäKóïÃӇæäUʝ^Þþu÷~Ûñs&QɤÈ5–IcG&!1âœÈ@ⱐɋΧ5᫤JŽ +Ôêûk Ý" ÅÌ+¡Cm\X+~‘˜ $t0#á™R>â¥4êå½>ö:ÚUc, +"°B„`'!êHÎõÁè¸ò†¹oޗ®«sZ¿ºz‹f½*ê,Mê¬,\ä¹Rãl% Š$÷Û¢6.¬7–˜x¨…Ý4BŠi{yoÛ®ëËbJ9”ñ¾4 ÷¸Ë!ϵ¿Yñµõ×cë±¹Ýå¼.›ãY«Ûée!‚p̅·GMe×¢æ£;&]’Ü+7‚ëˆ(ʝzÉv/eõr(u]@-{Œ&8DK6t:+ê椬\ëo§•D¢˜Í¥ÕM¥µ…ͧÕû$­Ž%mZ]àˆ Þ¿à«uigøŒ1…Ž~ËGˆr1WÈ.lš6kw5>ck2eùxÎóïÍéç$oܱ%éÆ8ᶔ›GÇ(Âqx¹×G]±˜Øp8• ”‰™šuaEÛÁf«ÖÇ» l}:;»×êêè£FlÎö¶Ïiª´ÞŸs[È O"Jø¥ l¸D2b¡”ñæfÈ̘!#ðv_)}xZ3¼RMb¯ô„Eƒ}fd‘ÂŽUY—õ÷“ºïVôÇ®ÝP‚Ԋ}‡ jçœg̱ÙíSà‚mLæÔ$Ä£gÓÞÞÕóNé´ÊN¦ë/Uô¨êô tC_tõ›6˜:ÏRûÛ.©“æl_•G»•ìE}Ré ѧî»{¥IO•Ù.š—ieñÚBsm÷¦Êa¾Òm‹MrËm¥ÊԚ¬´mY\§ÂÔ6±G‚‹¦Oõ±nï×ÄÌ ymW—ð4Õ·L+´Ôð‡Þ]`¤Ã¿{tüš±“2ŒB0ff·ra»U›Ý­|¼ v«‘ïØ9ñŒ$Aãtz]ØDz;Ølz}¼ Ò;ÒáOï@‡§Çÿ´á“Hxk„ə̺°‰Ìv°ÙÌúxdÖ§c €ájÎ6eM ›·Æûď5®ŒAqöîüà˜i¿ì@Žˆˆ'?þ8˜ñ·NÂ,ݝ )!øæ§ãÿÝ4Rendstream +endobj +6910 0 obj << +/Type /Page +/Contents 6911 0 R +/Resources 6909 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +6912 0 obj << +/D [6910 0 R /XYZ 71.731 729.2652 null] +>> endobj +891 0 obj << +/D [6910 0 R /XYZ 71.731 741.2204 null] +>> endobj +6913 0 obj << +/D [6910 0 R /XYZ 71.731 718.3063 null] +>> endobj +6914 0 obj << +/D [6910 0 R /XYZ 71.731 708.2442 null] +>> endobj +6915 0 obj << +/D [6910 0 R /XYZ 71.731 706.9988 null] +>> endobj +6916 0 obj << +/D [6910 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6917 0 obj << +/D [6910 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6918 0 obj << +/D [6910 0 R /XYZ 71.731 686.4807 null] +>> endobj +6919 0 obj << +/D [6910 0 R /XYZ 71.731 686.4807 null] +>> endobj +6920 0 obj << +/D [6910 0 R /XYZ 139.477 669.9875 null] +>> endobj +6921 0 obj << +/D [6910 0 R /XYZ 139.477 669.9875 null] +>> endobj +6922 0 obj << +/D [6910 0 R /XYZ 76.7123 652.0548 null] +>> endobj +6923 0 obj << +/D [6910 0 R /XYZ 129.5143 634.122 null] +>> endobj +6924 0 obj << +/D [6910 0 R /XYZ 129.5143 634.122 null] +>> endobj +6925 0 obj << +/D [6910 0 R /XYZ 71.731 631.9652 null] +>> endobj +6926 0 obj << +/D [6910 0 R /XYZ 71.731 631.9652 null] +>> endobj +6927 0 obj << +/D [6910 0 R /XYZ 139.477 616.1893 null] +>> endobj +6928 0 obj << +/D [6910 0 R /XYZ 71.731 614.7497 null] +>> endobj +6929 0 obj << +/D [6910 0 R /XYZ 139.477 598.2565 null] +>> endobj +6930 0 obj << +/D [6910 0 R /XYZ 71.731 560.3985 null] +>> endobj +6931 0 obj << +/D [6910 0 R /XYZ 71.731 547.3475 null] +>> endobj +6932 0 obj << +/D [6910 0 R /XYZ 71.731 546.1022 null] +>> endobj +6933 0 obj << +/D [6910 0 R /XYZ 129.5143 527.0236 null] +>> endobj +890 0 obj << +/D [6910 0 R /XYZ 71.731 520.6028 null] +>> endobj +414 0 obj << +/D [6910 0 R /XYZ 215.7019 476.788 null] +>> endobj +6934 0 obj << +/D [6910 0 R /XYZ 71.731 456.6476 null] +>> endobj +6935 0 obj << +/D [6910 0 R /XYZ 161.0655 443.9113 null] +>> endobj +6936 0 obj << +/D [6910 0 R /XYZ 71.731 431.7918 null] +>> endobj +6937 0 obj << +/D [6910 0 R /XYZ 71.731 400.426 null] +>> endobj +6938 0 obj << +/D [6910 0 R /XYZ 168.8063 389.4157 null] +>> endobj +6939 0 obj << +/D [6910 0 R /XYZ 71.731 377.2962 null] +>> endobj +6940 0 obj << +/D [6910 0 R /XYZ 71.731 334.9196 null] +>> endobj +6941 0 obj << +/D [6910 0 R /XYZ 181.5683 323.2637 null] +>> endobj +6942 0 obj << +/D [6910 0 R /XYZ 71.731 313.2016 null] +>> endobj +6943 0 obj << +/D [6910 0 R /XYZ 71.731 281.63 null] +>> endobj +6944 0 obj << +/D [6910 0 R /XYZ 71.731 268.6686 null] +>> endobj +6945 0 obj << +/D [6910 0 R /XYZ 71.731 267.4232 null] +>> endobj +6946 0 obj << +/D [6910 0 R /XYZ 129.5143 248.3447 null] +>> endobj +6947 0 obj << +/D [6910 0 R /XYZ 129.5143 248.3447 null] +>> endobj +6948 0 obj << +/D [6910 0 R /XYZ 71.731 246.9051 null] +>> endobj +6949 0 obj << +/D [6910 0 R /XYZ 71.731 246.9051 null] +>> endobj +6950 0 obj << +/D [6910 0 R /XYZ 139.477 230.4119 null] +>> endobj +6951 0 obj << +/D [6910 0 R /XYZ 139.477 230.4119 null] +>> endobj +6952 0 obj << +/D [6910 0 R /XYZ 76.7123 212.4792 null] +>> endobj +6953 0 obj << +/D [6910 0 R /XYZ 129.5143 194.5464 null] +>> endobj +6954 0 obj << +/D [6910 0 R /XYZ 129.5143 194.5464 null] +>> endobj +6955 0 obj << +/D [6910 0 R /XYZ 71.731 192.3896 null] +>> endobj +6956 0 obj << +/D [6910 0 R /XYZ 71.731 192.3896 null] +>> endobj +6957 0 obj << +/D [6910 0 R /XYZ 139.477 176.6137 null] +>> endobj +6958 0 obj << +/D [6910 0 R /XYZ 71.731 175.1741 null] +>> endobj +6959 0 obj << +/D [6910 0 R /XYZ 139.477 158.6809 null] +>> endobj +6960 0 obj << +/D [6910 0 R /XYZ 71.731 120.8229 null] +>> endobj +6961 0 obj << +/D [6910 0 R /XYZ 71.731 107.7719 null] +>> endobj +6962 0 obj << +/D [6910 0 R /XYZ 71.731 106.5266 null] +>> endobj +6909 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6966 0 obj << +/Length 1264 +/Filter /FlateDecode +>> +stream +xڝXێÛ6}߯Ð[m fxuÉÛ¶i‹-°œ§n±ÐÊôZˆ,’¼®ÿ¾C‘”)™º¤q­CΙ33äPÄÃðx!A!ƒ 8õÒãöÞàÕïDC6³±A?o>þÆ°£8 ·Ý{,}/dEœDÞv÷÷ê—CrjDµÞPŽW©çSž¢ù3yU>>}Qƒ¿Ds(wõúŸí¿n;ûœ…(ŽÀÈ$IŸDÈg8ö6£˜îD#ÎIÎà1Ÿ…34öÀNˆ‰t¦Ãu0éÍ3¥|ȎP +B={Acwø¼ñ0³œ¦~ì´;.¬™uÏ£/,‹‘†} ‹j#êr¨s:Ô¡¾°u}²Õr½½¶ñìÅa?$sÙkÁ¦²×Àæ³×awIöyŒd¯Íã¾s¨LjѡÚйö÷?%ÿhÆ҈!"ÓkÃ&2¶ƒÍf¬Ëuñ°šy±=·^þÛ­›ÙÉ$l‚j\š€#"[“i,ؔ46/Ãîi<ÒØ4z¥ùTeǤºÚ'¼Þ +w;hÝëÑz¤à"#Á\=Ú°‰zì`³õè²» ïx¸ë±Çã]6›™iIÄÕQ‘„Ó‰­¯½…õXƒÎЭ3ôŠLÞ.gt¶`S:ؼλKtòÑÙæÑÓY¨;£CkB0ÂQHî¶>-õg¸` ú»&;š»Ew«[ÒnZ—׶›Á¶î享o¹€2£3Á³aÁë`³ÁsÙ]<ÇG“Ñ&?rïúï¡Gú™!ؽâÉÏhæþ+§ aÝJ’:!dô£˜Ãâ Ã¦~endstream +endobj +6965 0 obj << +/Type /Page +/Contents 6966 0 R +/Resources 6964 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +6967 0 obj << +/D [6965 0 R /XYZ 71.731 729.2652 null] +>> endobj +6968 0 obj << +/D [6965 0 R /XYZ 71.731 741.2204 null] +>> endobj +6969 0 obj << +/D [6965 0 R /XYZ 129.5143 708.3437 null] +>> endobj +418 0 obj << +/D [6965 0 R /XYZ 241.5425 658.1081 null] +>> endobj +6970 0 obj << +/D [6965 0 R /XYZ 71.731 637.9677 null] +>> endobj +6971 0 obj << +/D [6965 0 R /XYZ 161.0655 625.2314 null] +>> endobj +6972 0 obj << +/D [6965 0 R /XYZ 71.731 613.1119 null] +>> endobj +6973 0 obj << +/D [6965 0 R /XYZ 71.731 581.746 null] +>> endobj +6974 0 obj << +/D [6965 0 R /XYZ 168.8063 570.7357 null] +>> endobj +6975 0 obj << +/D [6965 0 R /XYZ 71.731 543.6723 null] +>> endobj +6976 0 obj << +/D [6965 0 R /XYZ 71.731 500.6501 null] +>> endobj +6977 0 obj << +/D [6965 0 R /XYZ 71.731 472.3562 null] +>> endobj +6978 0 obj << +/D [6965 0 R /XYZ 71.731 440.7747 null] +>> endobj +6979 0 obj << +/D [6965 0 R /XYZ 181.5683 429.7644 null] +>> endobj +6980 0 obj << +/D [6965 0 R /XYZ 71.731 419.7022 null] +>> endobj +6981 0 obj << +/D [6965 0 R /XYZ 71.731 388.1306 null] +>> endobj +6982 0 obj << +/D [6965 0 R /XYZ 71.731 375.1692 null] +>> endobj +6983 0 obj << +/D [6965 0 R /XYZ 71.731 373.9239 null] +>> endobj +6984 0 obj << +/D [6965 0 R /XYZ 129.5143 354.8453 null] +>> endobj +6985 0 obj << +/D [6965 0 R /XYZ 129.5143 354.8453 null] +>> endobj +6986 0 obj << +/D [6965 0 R /XYZ 71.731 353.4058 null] +>> endobj +6987 0 obj << +/D [6965 0 R /XYZ 71.731 353.4058 null] +>> endobj +6988 0 obj << +/D [6965 0 R /XYZ 139.477 336.9126 null] +>> endobj +6989 0 obj << +/D [6965 0 R /XYZ 139.477 336.9126 null] +>> endobj +6990 0 obj << +/D [6965 0 R /XYZ 76.7123 318.9798 null] +>> endobj +6991 0 obj << +/D [6965 0 R /XYZ 129.5143 301.0471 null] +>> endobj +6992 0 obj << +/D [6965 0 R /XYZ 129.5143 301.0471 null] +>> endobj +6993 0 obj << +/D [6965 0 R /XYZ 71.731 298.8902 null] +>> endobj +6994 0 obj << +/D [6965 0 R /XYZ 71.731 298.8902 null] +>> endobj +6995 0 obj << +/D [6965 0 R /XYZ 139.477 283.1143 null] +>> endobj +6996 0 obj << +/D [6965 0 R /XYZ 71.731 281.6748 null] +>> endobj +6997 0 obj << +/D [6965 0 R /XYZ 139.477 265.1816 null] +>> endobj +6998 0 obj << +/D [6965 0 R /XYZ 76.7123 247.2488 null] +>> endobj +6999 0 obj << +/D [6965 0 R /XYZ 129.5143 229.3161 null] +>> endobj +7000 0 obj << +/D [6965 0 R /XYZ 129.5143 229.3161 null] +>> endobj +7001 0 obj << +/D [6965 0 R /XYZ 71.731 227.1592 null] +>> endobj +7002 0 obj << +/D [6965 0 R /XYZ 129.5143 211.3833 null] +>> endobj +7003 0 obj << +/D [6965 0 R /XYZ 129.5143 211.3833 null] +>> endobj +7004 0 obj << +/D [6965 0 R /XYZ 71.731 189.3012 null] +>> endobj +7005 0 obj << +/D [6965 0 R /XYZ 71.731 178.4071 null] +>> endobj +7006 0 obj << +/D [6965 0 R /XYZ 71.731 177.1617 null] +>> endobj +7007 0 obj << +/D [6965 0 R /XYZ 129.5143 158.0832 null] +>> endobj +892 0 obj << +/D [6965 0 R /XYZ 71.731 150.945 null] +>> endobj +6964 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7010 0 obj << +/Length 1092 +/Filter /FlateDecode +>> +stream +xÚµX[£6}Ÿ_Á[iq}Áï[v·­Zu¥h7ûÔ©FLðLÐr‰€´_ÛĐª*!ÉùüÎ1vPå  FäæÇÇò¯ò§_„º ‡‡&0à€Ç8/á1 , +Á ¡( Ù›§ô܉fb +7è÷}‘V¢û=}Öwû_õÅgѝê¬Ýþyøíá§ÃПx"›Ì’PSšˆŒh¤xÚC +XÄXOËREŽ%›¯¢Ûo ÜH҈nÚºÚ7y™Ê ¸yûšwBѓcrgê †,ÕÔY¬ÇÜ7uWwogñ~¨HdEܓ0µ!F F ï TgÑ u³^˜GHazéNïôÇszʳ§ºyešæ‡VV˜¯‹ú5¯žžÓVÈbäáZ +.çO¢=6ù¹ËëjŽ5‘w:ƚõçôûVJ#ZM¡;ÎíYóG±È®än0z"?l©Ú|£§~­0–9ŒKôuyi;}•H3Söl ©A‰òÙ:°~¹eÙ·3•& +Q bÂâ~Z»¬Ì+CªLÍȗs–ÚI¤•òÇ[]YŠ»¢0MäèÍmi]žA$²lEñ—J´`ím’­ê-¦›¿­¶_êB´k}–ª©Y+åæâÒJ"¸1;q<­e³WìÓ&-…LºfáÆ!(E,ˆ(„qäï€ +]˜Ž/d´DŠÁt4Eác:é‹1 ÂÞ¾·ïW¶jʃ$Ž°H.2EdÌC…Ô#ŽTä½1^×\ŽÝ»›PՋªË©Š ‹¼4b:AKpE1ñ kQ¡ » +‹Ôb8š…ÝVÞ|ˆ#îí{_X[5å1Vý*—卝ÔE?<êRÛH>xnõÍ«W«¯GÖR§Ý^!¸ï^HM`²ä^6ç^ [v¯§ï÷Þò¸ã^—Çô¹âQ›s@ð­Úyeâºqå¿ëX’PyÏ´àX6ãضèX_ߎõñ¸*b;¢!1æûÖÚ§Ož)öÏÄæ¾41 Ñ¥0»°9i,lYOß5Òxxx¤qiŒ¢¹wø"ìM§—Â,kDÛÞÍ#!$_Ê£ ›Éã[Ì£¯ïŠ> endobj +7011 0 obj << +/D [7009 0 R /XYZ 71.731 729.2652 null] +>> endobj +422 0 obj << +/D [7009 0 R /XYZ 295.0295 705.7477 null] +>> endobj +7012 0 obj << +/D [7009 0 R /XYZ 71.731 682.2589 null] +>> endobj +7013 0 obj << +/D [7009 0 R /XYZ 161.0655 672.871 null] +>> endobj +7014 0 obj << +/D [7009 0 R /XYZ 71.731 660.7515 null] +>> endobj +7015 0 obj << +/D [7009 0 R /XYZ 71.731 574.89 null] +>> endobj +7016 0 obj << +/D [7009 0 R /XYZ 71.731 543.3084 null] +>> endobj +7017 0 obj << +/D [7009 0 R /XYZ 181.5683 532.2981 null] +>> endobj +7018 0 obj << +/D [7009 0 R /XYZ 71.731 522.236 null] +>> endobj +7019 0 obj << +/D [7009 0 R /XYZ 71.731 488.8128 null] +>> endobj +7020 0 obj << +/D [7009 0 R /XYZ 71.731 477.703 null] +>> endobj +7021 0 obj << +/D [7009 0 R /XYZ 71.731 476.4576 null] +>> endobj +7022 0 obj << +/D [7009 0 R /XYZ 129.5143 457.3791 null] +>> endobj +7023 0 obj << +/D [7009 0 R /XYZ 129.5143 457.3791 null] +>> endobj +7024 0 obj << +/D [7009 0 R /XYZ 71.731 455.9395 null] +>> endobj +7025 0 obj << +/D [7009 0 R /XYZ 71.731 455.9395 null] +>> endobj +7026 0 obj << +/D [7009 0 R /XYZ 139.477 439.4463 null] +>> endobj +7027 0 obj << +/D [7009 0 R /XYZ 139.477 439.4463 null] +>> endobj +7028 0 obj << +/D [7009 0 R /XYZ 76.7123 421.5136 null] +>> endobj +7029 0 obj << +/D [7009 0 R /XYZ 129.5143 403.5808 null] +>> endobj +7030 0 obj << +/D [7009 0 R /XYZ 129.5143 403.5808 null] +>> endobj +7031 0 obj << +/D [7009 0 R /XYZ 71.731 401.424 null] +>> endobj +7032 0 obj << +/D [7009 0 R /XYZ 71.731 401.424 null] +>> endobj +7033 0 obj << +/D [7009 0 R /XYZ 139.477 385.6481 null] +>> endobj +7034 0 obj << +/D [7009 0 R /XYZ 71.731 384.2085 null] +>> endobj +7035 0 obj << +/D [7009 0 R /XYZ 139.477 367.7153 null] +>> endobj +7036 0 obj << +/D [7009 0 R /XYZ 76.7123 349.7826 null] +>> endobj +7037 0 obj << +/D [7009 0 R /XYZ 129.5143 331.8498 null] +>> endobj +7038 0 obj << +/D [7009 0 R /XYZ 129.5143 331.8498 null] +>> endobj +7039 0 obj << +/D [7009 0 R /XYZ 71.731 329.693 null] +>> endobj +7040 0 obj << +/D [7009 0 R /XYZ 71.731 329.693 null] +>> endobj +7041 0 obj << +/D [7009 0 R /XYZ 139.477 313.9171 null] +>> endobj +7042 0 obj << +/D [7009 0 R /XYZ 71.731 312.4775 null] +>> endobj +7043 0 obj << +/D [7009 0 R /XYZ 139.477 295.9843 null] +>> endobj +7044 0 obj << +/D [7009 0 R /XYZ 71.731 258.1263 null] +>> endobj +7045 0 obj << +/D [7009 0 R /XYZ 71.731 245.0753 null] +>> endobj +7046 0 obj << +/D [7009 0 R /XYZ 71.731 243.83 null] +>> endobj +7047 0 obj << +/D [7009 0 R /XYZ 129.5143 224.7515 null] +>> endobj +893 0 obj << +/D [7009 0 R /XYZ 71.731 218.3306 null] +>> endobj +426 0 obj << +/D [7009 0 R /XYZ 241.8522 174.5158 null] +>> endobj +7048 0 obj << +/D [7009 0 R /XYZ 71.731 151.027 null] +>> endobj +7049 0 obj << +/D [7009 0 R /XYZ 161.0655 141.6391 null] +>> endobj +7050 0 obj << +/D [7009 0 R /XYZ 71.731 129.5196 null] +>> endobj +7008 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7053 0 obj << +/Length 1178 +/Filter /FlateDecode +>> +stream +xÚ­X]œ6}ß_Á㌴¸þÀØìÛ6ýPªVZ%Ó§l´¢àÉ"10&Ûý÷½ÃÆ|¨ŠòÎõ9>÷úŽmâaøG7ªÚû”ãEÝó) ÕüÿÓýùøô±{ùK5¯eZï¿þ¸ûõ0ðs&P$dQ䀺•I#K&!âœO`‰XÀD«óU'Uvn²²xÐüm„ 0ÐA&Üg0ž萿Ïiܨº“Þ¼ªîåWñIÁ”͇òØ=ã¢{ª=ỳºÉŠoæKšVª6ð·¬yŒø}Où.Î/=UVŒâ^ž1¦*Ok¤uƒ>#ˆK¶"Ÿ>š¨Sün¹y»´ ¦&ªADf’Wjo†»Î`æ! QÈDGøI5—ª0ã،V_’HŽ—ü¾ûãžõ%ozZà«Þ²Z¡!×ÄùC ¾DØåí1Ï;a*í†øTæª^J!%($²Kaœž²Âh9g[9Ÿt +‡4?LËu(0N8!œå: |֗+”²ÀdT®LKx¦”ßðR +õL¨“wú¼êè£nu0iÙG`Qq°±Žøåzk Ö ò`rßT—¤¹Ÿ¬x¯Š&Kb½òlä¥R·4‚H É #9íQ¾ »Kt+³'4Àf…äcDNÞycû¨[ccY„!Æ2Á—®:Üå°Üh´S¡£ôþ:l=uÃu˺4 V³Õ„aU/W¯ [¨Þ¶Z½.Þ Õ{£Ã]½#}Íæ]æc—³b(a»kg©v»mÄÕ¼¡¬ +¬µ¶dh[7ÔÁ»ÅЩŽCm½¡ÇLÿ 9LPãXRWk˜_í4DÓÕÕnÁ–V{[_íÞ-«}ªÃ½ÚmIÖ¼»»¨àYXçL Û7Øߐ0 +Ö|³`K¾õ°uß¼[|›êpûfËHÊKÑT.ëŒdÄÂ%ë®±N÷X„ea¸âž [po€­ºçâÝàލ§{#yV(æ*»1‰¥Ÿ»÷éaº76o¦€®‚Y´f¦[2³‡­›éàÝbæT‡ÛL[†vþH3鼙<@Lµ~hÖÌìaëf:x·˜9Õá6Ӗ¡] ?ÒL2o&œè&ך¤ [2³‡­›éàÝbæT‡ÛL[FÝèCÞÿ1ós3Ksü|ϊd~{ΈDóÕÖiÁ–<íaëž:x·x:ÕáöԖq.ÁÕ<)SåÞ8R)傱Omx÷ÞâùâH o2àÇ GÜ>NÏ2i T¬ì*mØ®r€­î*]¼v•.ÖÝLŸô‘Žë¦{ö>Á¤ôAámæ|.€Uk(e&u¶]XßC inpS} ÑöÃ>Ä»÷³+« HR,&7Uٔ l½pè ›ìØÚÉ> endobj +7054 0 obj << +/D [7052 0 R /XYZ 71.731 729.2652 null] +>> endobj +7055 0 obj << +/D [7052 0 R /XYZ 71.731 741.2204 null] +>> endobj +7056 0 obj << +/D [7052 0 R /XYZ 71.731 718.3063 null] +>> endobj +7057 0 obj << +/D [7052 0 R /XYZ 168.8063 708.3437 null] +>> endobj +7058 0 obj << +/D [7052 0 R /XYZ 71.731 681.2803 null] +>> endobj +7059 0 obj << +/D [7052 0 R /XYZ 71.731 649.9144 null] +>> endobj +7060 0 obj << +/D [7052 0 R /XYZ 71.731 633.2768 null] +>> endobj +7061 0 obj << +/D [7052 0 R /XYZ 71.731 602.3408 null] +>> endobj +7062 0 obj << +/D [7052 0 R /XYZ 181.5683 590.6849 null] +>> endobj +7063 0 obj << +/D [7052 0 R /XYZ 71.731 580.6227 null] +>> endobj +7064 0 obj << +/D [7052 0 R /XYZ 71.731 547.1996 null] +>> endobj +7065 0 obj << +/D [7052 0 R /XYZ 71.731 536.0897 null] +>> endobj +7066 0 obj << +/D [7052 0 R /XYZ 71.731 534.8444 null] +>> endobj +7067 0 obj << +/D [7052 0 R /XYZ 129.5143 515.7659 null] +>> endobj +7068 0 obj << +/D [7052 0 R /XYZ 129.5143 515.7659 null] +>> endobj +7069 0 obj << +/D [7052 0 R /XYZ 71.731 514.3263 null] +>> endobj +7070 0 obj << +/D [7052 0 R /XYZ 71.731 514.3263 null] +>> endobj +7071 0 obj << +/D [7052 0 R /XYZ 139.477 497.8331 null] +>> endobj +7072 0 obj << +/D [7052 0 R /XYZ 139.477 497.8331 null] +>> endobj +7073 0 obj << +/D [7052 0 R /XYZ 76.7123 479.9004 null] +>> endobj +7074 0 obj << +/D [7052 0 R /XYZ 129.5143 461.9676 null] +>> endobj +7075 0 obj << +/D [7052 0 R /XYZ 129.5143 461.9676 null] +>> endobj +7076 0 obj << +/D [7052 0 R /XYZ 71.731 460.5281 null] +>> endobj +7077 0 obj << +/D [7052 0 R /XYZ 129.5143 444.0349 null] +>> endobj +7078 0 obj << +/D [7052 0 R /XYZ 129.5143 444.0349 null] +>> endobj +7079 0 obj << +/D [7052 0 R /XYZ 71.731 442.8558 null] +>> endobj +7080 0 obj << +/D [7052 0 R /XYZ 71.731 442.8558 null] +>> endobj +7081 0 obj << +/D [7052 0 R /XYZ 139.477 426.1021 null] +>> endobj +7082 0 obj << +/D [7052 0 R /XYZ 139.477 426.1021 null] +>> endobj +7083 0 obj << +/D [7052 0 R /XYZ 71.731 423.9453 null] +>> endobj +7084 0 obj << +/D [7052 0 R /XYZ 139.477 408.1694 null] +>> endobj +7085 0 obj << +/D [7052 0 R /XYZ 139.477 408.1694 null] +>> endobj +7086 0 obj << +/D [7052 0 R /XYZ 71.731 406.0125 null] +>> endobj +7087 0 obj << +/D [7052 0 R /XYZ 139.477 390.2366 null] +>> endobj +7088 0 obj << +/D [7052 0 R /XYZ 139.477 390.2366 null] +>> endobj +7089 0 obj << +/D [7052 0 R /XYZ 71.731 388.0798 null] +>> endobj +7090 0 obj << +/D [7052 0 R /XYZ 139.477 372.3039 null] +>> endobj +7091 0 obj << +/D [7052 0 R /XYZ 139.477 372.3039 null] +>> endobj +7092 0 obj << +/D [7052 0 R /XYZ 71.731 370.147 null] +>> endobj +7093 0 obj << +/D [7052 0 R /XYZ 139.477 354.3711 null] +>> endobj +7094 0 obj << +/D [7052 0 R /XYZ 139.477 354.3711 null] +>> endobj +7095 0 obj << +/D [7052 0 R /XYZ 71.731 352.2143 null] +>> endobj +7096 0 obj << +/D [7052 0 R /XYZ 139.477 336.4384 null] +>> endobj +7097 0 obj << +/D [7052 0 R /XYZ 139.477 336.4384 null] +>> endobj +7098 0 obj << +/D [7052 0 R /XYZ 71.731 334.2815 null] +>> endobj +7099 0 obj << +/D [7052 0 R /XYZ 139.477 318.5056 null] +>> endobj +7100 0 obj << +/D [7052 0 R /XYZ 139.477 318.5056 null] +>> endobj +7101 0 obj << +/D [7052 0 R /XYZ 71.731 280.6476 null] +>> endobj +7102 0 obj << +/D [7052 0 R /XYZ 71.731 267.5966 null] +>> endobj +7103 0 obj << +/D [7052 0 R /XYZ 71.731 266.3513 null] +>> endobj +7104 0 obj << +/D [7052 0 R /XYZ 129.5143 247.2727 null] +>> endobj +894 0 obj << +/D [7052 0 R /XYZ 71.731 240.8519 null] +>> endobj +430 0 obj << +/D [7052 0 R /XYZ 290.5716 197.0371 null] +>> endobj +7105 0 obj << +/D [7052 0 R /XYZ 71.731 173.5483 null] +>> endobj +7106 0 obj << +/D [7052 0 R /XYZ 161.0655 164.1604 null] +>> endobj +7107 0 obj << +/D [7052 0 R /XYZ 71.731 152.0409 null] +>> endobj +7108 0 obj << +/D [7052 0 R /XYZ 71.731 120.675 null] +>> endobj +7109 0 obj << +/D [7052 0 R /XYZ 168.8063 109.6647 null] +>> endobj +7051 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7112 0 obj << +/Length 1077 +/Filter /FlateDecode +>> +stream +xÚÍXM¤6½Ï¯à8--Ž?±™Ûd“%ÊhÕ{ʬFÜÓH ´øÈdÿ}l°izoÑÌ4åªççWe(€êNԀc€#†ƒôí¯êÕ/wȘ„Æ&t~<Þýð‰À q„£àx +HÆiÀ ‚!³¿î?ž“K+ëCˆ¼Ç`ŸŠ¤”íïÉßÿO¿Èö\eÍáëñ·»Ÿc|F8ˆ… +² r´ZÂÄq ̈j˜H½eˆ’€C%¼Çùå’%­líY—¤NÞ¤Âo^T§aLÊa”Äîÿ͛6/_͛,«ecý|»Gïy{žùþç€Ù}Rt6h^N<¼èÉ/ÏbYd М¨u†(áQù³l»º4ӑñb6]š*/§®ø0üp: å»+Z»¤~ÏÙ»î9ºnehC½•<(z,ŠJc~—ÙàâsUÈæaœ~¥ØÎÆDHÄýì${S+¼1ԓæuäþa.„Ô2Ä&ˆ$^AŒV¡kf¡ÄÂ!ê±ð¦!^qØYKDø„9Á‘tJ9KÚ0PGÐ&fËÛºKÛ³œÒóeÙæiÒæUéZvµ\.ÐBˆ˜âGéÌK¬µ +]³+±H‹É‚¬Ù*±jó!¦±7î:±vÖǔXÊùÆ£âe¨7v™Ê2ªJٜ_•æ–_­oƒ»!Í«aì¹®^Bí©×1ÛR¯5ÛW¯'î-êãXQ¯‹cRÌò쥪_J•ÕÊŽVU{Êy^¶¦\Õî&¬ëa%¿˜ìéÖ1ÛÒ­5Û×­'î-ºõàp(±ºua(F¬ýGMži]öG½Ê)À4ÚËo×lƒ§Ñl—'_ÜxòáXò41ÍÖUk9I™º´—“®ÙFNŽf»9é‹{CN.pøsr‚c’“§\_/|ù)àß³.+ +¥b/ý\³-YY³}YyâÞ"«9ï±1±R½ôq ãxëÀؕà¸lµ» ±ÝÜt̶H´fû$zâÞB⇟DF&›´Î/ýɹä2R·ÆHðïⲚ¹ B‹©*³3÷Ò¼~§$ ,0ß©®ÙFÍv+€/î À‡Ã=U &8®gÈj×`öEáã#ÖïeÈ8à‚žPLÌfª³ "ÝØqaº¨Uyú”¾<¡ ùì¶_Wm¥·q·—ˆ^mŒÒ#† ê«®YWª^öÍS¡¯žmc¥æ¡[»’Ÿ®úÚBJTáxÙV&ÃPV™i¯]íÜ"€¦Sþ³,¾ÍúF‹ÜìØE¦ÃaŸMÛHßb ŒÚxêzp–¤(œÎÐ+†¾ U»Á¢¡$òd.i]ÙV]z–Ùÿ¼]uóÏ|Û śŸ?›å׆ €DD£'!ºú1Ãñ?¨kendstream +endobj +7111 0 obj << +/Type /Page +/Contents 7112 0 R +/Resources 7110 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +7113 0 obj << +/D [7111 0 R /XYZ 71.731 729.2652 null] +>> endobj +7114 0 obj << +/D [7111 0 R /XYZ 71.731 741.2204 null] +>> endobj +7115 0 obj << +/D [7111 0 R /XYZ 71.731 718.3063 null] +>> endobj +7116 0 obj << +/D [7111 0 R /XYZ 71.731 670.4852 null] +>> endobj +7117 0 obj << +/D [7111 0 R /XYZ 181.5683 658.8294 null] +>> endobj +7118 0 obj << +/D [7111 0 R /XYZ 71.731 648.7672 null] +>> endobj +7119 0 obj << +/D [7111 0 R /XYZ 71.731 617.1956 null] +>> endobj +7120 0 obj << +/D [7111 0 R /XYZ 71.731 604.2342 null] +>> endobj +7121 0 obj << +/D [7111 0 R /XYZ 71.731 602.9889 null] +>> endobj +7122 0 obj << +/D [7111 0 R /XYZ 129.5143 583.9103 null] +>> endobj +7123 0 obj << +/D [7111 0 R /XYZ 129.5143 583.9103 null] +>> endobj +7124 0 obj << +/D [7111 0 R /XYZ 71.731 582.4708 null] +>> endobj +7125 0 obj << +/D [7111 0 R /XYZ 71.731 582.4708 null] +>> endobj +7126 0 obj << +/D [7111 0 R /XYZ 139.477 565.9776 null] +>> endobj +7127 0 obj << +/D [7111 0 R /XYZ 139.477 565.9776 null] +>> endobj +7128 0 obj << +/D [7111 0 R /XYZ 76.7123 548.0448 null] +>> endobj +7129 0 obj << +/D [7111 0 R /XYZ 129.5143 530.1121 null] +>> endobj +7130 0 obj << +/D [7111 0 R /XYZ 129.5143 530.1121 null] +>> endobj +7131 0 obj << +/D [7111 0 R /XYZ 71.731 527.9552 null] +>> endobj +7132 0 obj << +/D [7111 0 R /XYZ 71.731 527.9552 null] +>> endobj +7133 0 obj << +/D [7111 0 R /XYZ 139.477 512.1793 null] +>> endobj +7134 0 obj << +/D [7111 0 R /XYZ 71.731 510.0225 null] +>> endobj +7135 0 obj << +/D [7111 0 R /XYZ 139.477 494.2466 null] +>> endobj +7136 0 obj << +/D [7111 0 R /XYZ 76.7123 476.3138 null] +>> endobj +7137 0 obj << +/D [7111 0 R /XYZ 129.5143 458.3811 null] +>> endobj +7138 0 obj << +/D [7111 0 R /XYZ 129.5143 458.3811 null] +>> endobj +7139 0 obj << +/D [7111 0 R /XYZ 71.731 457.0003 null] +>> endobj +7140 0 obj << +/D [7111 0 R /XYZ 71.731 457.0003 null] +>> endobj +7141 0 obj << +/D [7111 0 R /XYZ 139.477 440.4483 null] +>> endobj +7142 0 obj << +/D [7111 0 R /XYZ 139.477 440.4483 null] +>> endobj +7143 0 obj << +/D [7111 0 R /XYZ 71.731 438.2915 null] +>> endobj +7144 0 obj << +/D [7111 0 R /XYZ 139.477 422.5156 null] +>> endobj +7145 0 obj << +/D [7111 0 R /XYZ 139.477 422.5156 null] +>> endobj +7146 0 obj << +/D [7111 0 R /XYZ 71.731 384.6575 null] +>> endobj +7147 0 obj << +/D [7111 0 R /XYZ 71.731 371.6066 null] +>> endobj +7148 0 obj << +/D [7111 0 R /XYZ 71.731 370.3612 null] +>> endobj +7149 0 obj << +/D [7111 0 R /XYZ 129.5143 351.2827 null] +>> endobj +895 0 obj << +/D [7111 0 R /XYZ 71.731 344.8618 null] +>> endobj +434 0 obj << +/D [7111 0 R /XYZ 251.5788 301.0471 null] +>> endobj +7150 0 obj << +/D [7111 0 R /XYZ 71.731 277.5583 null] +>> endobj +7151 0 obj << +/D [7111 0 R /XYZ 161.0655 268.1703 null] +>> endobj +7152 0 obj << +/D [7111 0 R /XYZ 71.731 256.0509 null] +>> endobj +7153 0 obj << +/D [7111 0 R /XYZ 71.731 224.685 null] +>> endobj +7154 0 obj << +/D [7111 0 R /XYZ 168.8063 213.6747 null] +>> endobj +7155 0 obj << +/D [7111 0 R /XYZ 71.731 186.6113 null] +>> endobj +7156 0 obj << +/D [7111 0 R /XYZ 71.731 160.3846 null] +>> endobj +7157 0 obj << +/D [7111 0 R /XYZ 71.731 127.5971 null] +>> endobj +7158 0 obj << +/D [7111 0 R /XYZ 181.5683 115.9412 null] +>> endobj +7110 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7161 0 obj << +/Length 1489 +/Filter /FlateDecode +>> +stream +xÚ­Y[›8}Ÿ_Á㌴ñú‚±é[·{Q÷¦ª;û´]â$h D\:;ÿ¾6ØÄcS©)aȁïøœÏŸ? Š üCC€ù…S€Š£ü|££üé—;¤!;ÙÙ ï¾ÿ™À(i‚“èñ‘4”Å#pŠxô¸ÿçþÝ)»t¢yØa +ï1¿?”Y%ºß³çñß·ޏˆîTïۇ½ûéqŠO )—A¼$'Ԓ&N#.i&±¢‰ä¯Å$b6ðÌöç¢RôuP;}¸SƒbÉþð€è}Ödg!‡Ö¾™óEHF ˆE ¥Æ$qòP;føʱ0ˆ¾‹») +Ÿ0¦‹¸Ë!ìŒ;ÿ¾ò0W-yîÒí†GÖw'‡l8PEP7£¹m×ôy÷ÝÌru½¨º"Ϻ¢®ld߈å é5B»…5¨ » +‹T.ß ÈÀV…•æC§Î¸ëš«–¢ üLjÎMw•ŒÕ*@ +KCUÀ†yªÀ VWÜ U`ÁÃYnh šÕ/՘>Ž*€Pâ©ù©~ÀôþE¦)…H~ ñ¼>ëHÊIŒX¦~,S? ­óIk`aiq·H;çá–Ö¦q©Û®¨Ú.+˧üìšý2ƒiœP¾DYj©ëó9«fÕU¨>áõ!ò¾ÓE!;LýŽ/o¸n„9aÁ|F˜ƒ°Ž¸[Œ˜ópaÓMS7+PY«–|k Šƒ¶¢R?¼j¤â¡çGž÷M»î B€r”„<±`>O ,ì‰#îOæ<ܞØ4.ðÏ ÆJd7ü¹4…ñÀà6̑8%²â¡uÀ†yü˜`A?\q7ø±àáôã†Æ^´ÝJ— ÓÔ×>·uy•7“ÍúpôrX6,í©îKmÔ³¸1@ì×õg°àt°P>õ5*,þ2èíg$ÜÒ[ŠcU7B͂§¡@¸zéTÏ«Ôs]—"«´ïG—Šëôò€ä±©Djyþw ,l#îæ<ÜÙ4D•=ëìœùC@!K}¾„[øV+ŸwÅՖu¹%CN! ÉmÁ|rXXnGÜ-rÏy¸å¶i -éE4ç¢m¥b_ÓËۍé¹ÞϚÒÙ=ÝòbRĂ•Þ‚ùä5°°¼Ž¸[äópËkÓhë¾É…CT–¤¾Vè£(³›$Õ|“ÞÝILS¡Ó÷ÍxMã]rSÌÚ°×Oeí} ”’'Åå3M£Âž-ƒn±lFÂí˜Å!+_²×ö©¿ì³Îåà ƜøŠÐÛRU½˜zÓuâ|霽ÐҘõ£¯òSV=æžHqh…°a{&XÐWÜ -x8º¡1”¬cS÷÷S4!Äÿ}l.¾'èhÇ€)W½6¦cf|]ßTžía‚bÀQv~l˜gçg‚w~\q7ìü¸x\u¼f€ÍãºY†nó²íó\´í¡/µ'’ÑÁƝYà• ˜Ð±ÃÁáã÷óí·±Ð qŽõŸŽ!›íÝ7uWw¯ñfºâš>f³_VäI?Õ&ž"ééG¡Ú¼ÖÃûOÍÞñ÷§bï89ì–ûvÈ¡ï~mÞՙøؒD®·ØfÛÎ*ýezY¡ÓwÞOc…Ú9.¨ë%¡0ëÈt×ÏJ“¬ìM¸¢Z6& +TYt}Ìü³®vË}ƒ³é€ëªÔGº®šÀEs3ÿñÆ8vÖëwW1—I™¤Þ×[fùvKeY™î¤€]}YåˆøGŽ<÷endstream +endobj +7160 0 obj << +/Type /Page +/Contents 7161 0 R +/Resources 7159 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +7162 0 obj << +/D [7160 0 R /XYZ 71.731 729.2652 null] +>> endobj +7163 0 obj << +/D [7160 0 R /XYZ 71.731 741.2204 null] +>> endobj +7164 0 obj << +/D [7160 0 R /XYZ 71.731 718.3063 null] +>> endobj +7165 0 obj << +/D [7160 0 R /XYZ 71.731 675.3674 null] +>> endobj +7166 0 obj << +/D [7160 0 R /XYZ 71.731 674.1221 null] +>> endobj +7167 0 obj << +/D [7160 0 R /XYZ 129.5143 655.0436 null] +>> endobj +7168 0 obj << +/D [7160 0 R /XYZ 129.5143 655.0436 null] +>> endobj +7169 0 obj << +/D [7160 0 R /XYZ 71.731 653.604 null] +>> endobj +7170 0 obj << +/D [7160 0 R /XYZ 71.731 653.604 null] +>> endobj +7171 0 obj << +/D [7160 0 R /XYZ 139.477 637.1108 null] +>> endobj +7172 0 obj << +/D [7160 0 R /XYZ 139.477 637.1108 null] +>> endobj +7173 0 obj << +/D [7160 0 R /XYZ 76.7123 619.1781 null] +>> endobj +7174 0 obj << +/D [7160 0 R /XYZ 129.5143 601.2453 null] +>> endobj +7175 0 obj << +/D [7160 0 R /XYZ 129.5143 601.2453 null] +>> endobj +7176 0 obj << +/D [7160 0 R /XYZ 71.731 599.0885 null] +>> endobj +7177 0 obj << +/D [7160 0 R /XYZ 129.5143 583.3126 null] +>> endobj +7178 0 obj << +/D [7160 0 R /XYZ 129.5143 583.3126 null] +>> endobj +7179 0 obj << +/D [7160 0 R /XYZ 71.731 582.1335 null] +>> endobj +7180 0 obj << +/D [7160 0 R /XYZ 71.731 582.1335 null] +>> endobj +7181 0 obj << +/D [7160 0 R /XYZ 139.477 565.3798 null] +>> endobj +7182 0 obj << +/D [7160 0 R /XYZ 139.477 565.3798 null] +>> endobj +7183 0 obj << +/D [7160 0 R /XYZ 71.731 563.223 null] +>> endobj +7184 0 obj << +/D [7160 0 R /XYZ 139.477 547.4471 null] +>> endobj +7185 0 obj << +/D [7160 0 R /XYZ 139.477 547.4471 null] +>> endobj +7186 0 obj << +/D [7160 0 R /XYZ 71.731 545.2902 null] +>> endobj +7187 0 obj << +/D [7160 0 R /XYZ 139.477 529.5143 null] +>> endobj +7188 0 obj << +/D [7160 0 R /XYZ 139.477 529.5143 null] +>> endobj +7189 0 obj << +/D [7160 0 R /XYZ 71.731 527.3575 null] +>> endobj +7190 0 obj << +/D [7160 0 R /XYZ 139.477 511.5816 null] +>> endobj +7191 0 obj << +/D [7160 0 R /XYZ 139.477 511.5816 null] +>> endobj +7192 0 obj << +/D [7160 0 R /XYZ 71.731 509.4247 null] +>> endobj +7193 0 obj << +/D [7160 0 R /XYZ 139.477 493.6488 null] +>> endobj +7194 0 obj << +/D [7160 0 R /XYZ 139.477 493.6488 null] +>> endobj +7195 0 obj << +/D [7160 0 R /XYZ 71.731 491.492 null] +>> endobj +7196 0 obj << +/D [7160 0 R /XYZ 139.477 475.716 null] +>> endobj +7197 0 obj << +/D [7160 0 R /XYZ 139.477 475.716 null] +>> endobj +7198 0 obj << +/D [7160 0 R /XYZ 71.731 473.5592 null] +>> endobj +7199 0 obj << +/D [7160 0 R /XYZ 139.477 457.7833 null] +>> endobj +7200 0 obj << +/D [7160 0 R /XYZ 139.477 457.7833 null] +>> endobj +7201 0 obj << +/D [7160 0 R /XYZ 71.731 455.6265 null] +>> endobj +7202 0 obj << +/D [7160 0 R /XYZ 139.477 439.8505 null] +>> endobj +7203 0 obj << +/D [7160 0 R /XYZ 139.477 439.8505 null] +>> endobj +7204 0 obj << +/D [7160 0 R /XYZ 71.731 437.6937 null] +>> endobj +7205 0 obj << +/D [7160 0 R /XYZ 139.477 421.9178 null] +>> endobj +7206 0 obj << +/D [7160 0 R /XYZ 139.477 421.9178 null] +>> endobj +7207 0 obj << +/D [7160 0 R /XYZ 71.731 419.761 null] +>> endobj +7208 0 obj << +/D [7160 0 R /XYZ 139.477 403.985 null] +>> endobj +7209 0 obj << +/D [7160 0 R /XYZ 139.477 403.985 null] +>> endobj +7210 0 obj << +/D [7160 0 R /XYZ 71.731 401.8282 null] +>> endobj +7211 0 obj << +/D [7160 0 R /XYZ 139.477 386.0523 null] +>> endobj +7212 0 obj << +/D [7160 0 R /XYZ 139.477 386.0523 null] +>> endobj +7213 0 obj << +/D [7160 0 R /XYZ 71.731 348.1943 null] +>> endobj +7214 0 obj << +/D [7160 0 R /XYZ 71.731 335.1433 null] +>> endobj +7215 0 obj << +/D [7160 0 R /XYZ 71.731 333.898 null] +>> endobj +7216 0 obj << +/D [7160 0 R /XYZ 129.5143 314.8194 null] +>> endobj +896 0 obj << +/D [7160 0 R /XYZ 71.731 308.3985 null] +>> endobj +438 0 obj << +/D [7160 0 R /XYZ 213.7744 264.5838 null] +>> endobj +7217 0 obj << +/D [7160 0 R /XYZ 71.731 241.095 null] +>> endobj +7218 0 obj << +/D [7160 0 R /XYZ 161.0655 231.7071 null] +>> endobj +7219 0 obj << +/D [7160 0 R /XYZ 71.731 219.5876 null] +>> endobj +7220 0 obj << +/D [7160 0 R /XYZ 71.731 188.2217 null] +>> endobj +7221 0 obj << +/D [7160 0 R /XYZ 168.8063 177.2114 null] +>> endobj +7222 0 obj << +/D [7160 0 R /XYZ 71.731 150.148 null] +>> endobj +7223 0 obj << +/D [7160 0 R /XYZ 71.731 118.7821 null] +>> endobj +7159 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7226 0 obj << +/Length 999 +/Filter /FlateDecode +>> +stream +xÚÕXY«6}Ÿ_Ác" ®WlîÛtU—+®rŸ:UEg‚Jètþ}?cCL0K¥JWÕHIþÇßr€DþH$ ’ 4E44Úpô +?ýð@$v˜Ø}½yøê{†£¥ M¢Í>bi‚„ä‘d)AT´Ùýºúæ]*}]ÇTàEöø\d']ý’ýa?>=ÿhO>êêpޕëß6?=|·éâ &Qª È$É5¤IÓḦ́š~„³Hb…g²áùIWõõTZÄò½=–õv«Ër_ö‹ýšàUV•ÃŸ«ƒ¾¾å¥F†zï&KìNc#‹Ll¸§¢8¯©X½é]âÓ¹Ðå‡îòÝöjJPBTÚ\íŽùÉq¹äî¤Òۃ;­KP|!“ç5«ìš5l“eàkO¨%ˆŒŒ‘à2 jß¡bÖjû"1i´¬f(¼P*q)…Í!4÷þxãÑ^5äÁT(z<²º:d£aÁ@>¸Œ¨®õ¶z¼K_s½>Uù6«òóÉGÖW=¼AGA( +;;’Ô*öa7a‰©Kÿ†:ب°°ù˜ò4w\Øöª!¾°,E\Ê>'ÐŖv@]‘ „C׸×7?½¶úd=Úål⟻¬Í^Á$y*g²×‡Mdo›ÍÞPÜÙ;àÎޏ?õûïyHa&¡ŠöÎOmúþlú6]àÝý´3j¿`Lm JR$™k>lJÐ6/h îAïyŒêó0‚îs]؁4L[ª ÚÂx¥Œ”ⳕîÁ¦*½…ÍWz î’J¿ç®tŸ†‘¬z¿è€`\ AS:QçƒDlW +ŠÉSŠR8›ӇMˆÙÁfÅ Å] æ€GPÌ 3 #” “Àø_èø—ù"+êFL˜þàŽÒl€€Ã)÷ýÏøüç`@$Qb¦à}ØDÁw°Ù‚Å]Pð!žˆÝ¾û> endobj +7227 0 obj << +/D [7225 0 R /XYZ 71.731 729.2652 null] +>> endobj +7228 0 obj << +/D [7225 0 R /XYZ 71.731 718.3063 null] +>> endobj +7229 0 obj << +/D [7225 0 R /XYZ 71.731 631.9816 null] +>> endobj +7230 0 obj << +/D [7225 0 R /XYZ 71.731 620.8718 null] +>> endobj +7231 0 obj << +/D [7225 0 R /XYZ 71.731 619.6265 null] +>> endobj +7232 0 obj << +/D [7225 0 R /XYZ 129.5143 600.5479 null] +>> endobj +7233 0 obj << +/D [7225 0 R /XYZ 129.5143 600.5479 null] +>> endobj +7234 0 obj << +/D [7225 0 R /XYZ 71.731 599.1084 null] +>> endobj +7235 0 obj << +/D [7225 0 R /XYZ 71.731 599.1084 null] +>> endobj +7236 0 obj << +/D [7225 0 R /XYZ 139.477 582.6152 null] +>> endobj +7237 0 obj << +/D [7225 0 R /XYZ 139.477 582.6152 null] +>> endobj +7238 0 obj << +/D [7225 0 R /XYZ 76.7123 564.6824 null] +>> endobj +7239 0 obj << +/D [7225 0 R /XYZ 129.5143 546.7497 null] +>> endobj +7240 0 obj << +/D [7225 0 R /XYZ 129.5143 546.7497 null] +>> endobj +7241 0 obj << +/D [7225 0 R /XYZ 71.731 544.5928 null] +>> endobj +7242 0 obj << +/D [7225 0 R /XYZ 129.5143 528.8169 null] +>> endobj +7243 0 obj << +/D [7225 0 R /XYZ 129.5143 528.8169 null] +>> endobj +7244 0 obj << +/D [7225 0 R /XYZ 71.731 527.4362 null] +>> endobj +7245 0 obj << +/D [7225 0 R /XYZ 71.731 527.4362 null] +>> endobj +7246 0 obj << +/D [7225 0 R /XYZ 139.477 510.8842 null] +>> endobj +7247 0 obj << +/D [7225 0 R /XYZ 139.477 510.8842 null] +>> endobj +7248 0 obj << +/D [7225 0 R /XYZ 71.731 508.7273 null] +>> endobj +7249 0 obj << +/D [7225 0 R /XYZ 139.477 492.9514 null] +>> endobj +7250 0 obj << +/D [7225 0 R /XYZ 139.477 492.9514 null] +>> endobj +7251 0 obj << +/D [7225 0 R /XYZ 71.731 455.0934 null] +>> endobj +7252 0 obj << +/D [7225 0 R /XYZ 71.731 442.0424 null] +>> endobj +7253 0 obj << +/D [7225 0 R /XYZ 71.731 440.7971 null] +>> endobj +7254 0 obj << +/D [7225 0 R /XYZ 129.5143 421.7185 null] +>> endobj +897 0 obj << +/D [7225 0 R /XYZ 71.731 415.2977 null] +>> endobj +442 0 obj << +/D [7225 0 R /XYZ 255.435 371.4829 null] +>> endobj +7255 0 obj << +/D [7225 0 R /XYZ 71.731 347.7274 null] +>> endobj +7256 0 obj << +/D [7225 0 R /XYZ 161.0655 338.6062 null] +>> endobj +7257 0 obj << +/D [7225 0 R /XYZ 71.731 326.4867 null] +>> endobj +7258 0 obj << +/D [7225 0 R /XYZ 71.731 295.1209 null] +>> endobj +7259 0 obj << +/D [7225 0 R /XYZ 168.8063 284.1106 null] +>> endobj +7260 0 obj << +/D [7225 0 R /XYZ 71.731 257.0471 null] +>> endobj +7261 0 obj << +/D [7225 0 R /XYZ 71.731 240.6252 null] +>> endobj +7262 0 obj << +/D [7225 0 R /XYZ 71.731 209.6892 null] +>> endobj +7263 0 obj << +/D [7225 0 R /XYZ 181.5683 198.0334 null] +>> endobj +7264 0 obj << +/D [7225 0 R /XYZ 71.731 187.9712 null] +>> endobj +7265 0 obj << +/D [7225 0 R /XYZ 71.731 156.3996 null] +>> endobj +7266 0 obj << +/D [7225 0 R /XYZ 71.731 143.4382 null] +>> endobj +7267 0 obj << +/D [7225 0 R /XYZ 71.731 142.1929 null] +>> endobj +7268 0 obj << +/D [7225 0 R /XYZ 129.5143 123.1143 null] +>> endobj +7269 0 obj << +/D [7225 0 R /XYZ 129.5143 123.1143 null] +>> endobj +7270 0 obj << +/D [7225 0 R /XYZ 71.731 121.6748 null] +>> endobj +7271 0 obj << +/D [7225 0 R /XYZ 71.731 121.6748 null] +>> endobj +7272 0 obj << +/D [7225 0 R /XYZ 139.477 105.1816 null] +>> endobj +7273 0 obj << +/D [7225 0 R /XYZ 139.477 105.1816 null] +>> endobj +7224 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7277 0 obj << +/Length 1138 +/Filter /FlateDecode +>> +stream +xڕXێ£F}Ÿ¯àі–N_i˜·Ém•(YVÞ§L4bìö ‹‹VùûW7¸ Yù[>t>uª«€y>Ìӌh(î/Ô{‡¿>?°â÷ßý|xøéwA½ˆD¼ÃÙQ@”–žœ„Š…ÞáôÏøZ™bïsEwœt×ç4ÎLõWüÖý|zþ£ûò·©>òS¹ÿ÷ðçÃo‡1¾šD!Y%)YH¤ ‘ç‹âK¢‹ˆRL{~Q"à‡Íðȃ8š²f3#n„5»yá\ÍÙ1ΉŒ{ö‚CÜùõÆc¸ëž‡½D d˶¬lfÂãbÊ2~7¯É©aÓR¿åA$ZAœúØI[VE’½tnoï~$'“UÉ ¥Ò4ßÛ¨‚æDꐻ4µ`kš0·¦HÜ-šÎy,hjó4='&í<8ÓUkRÏu­Õ=ÿ!‚’DI%qÝ”oÃnº±¦è&|Ø¢nPz”ˍ»¬Ûp×=©n"¹ô”†Éâ·Ô`>””(ª£©^oyžš8CXvWkE\Sg\»4µ`kš0·¦HÜ-šÎyàšÚ4*s¹¦qe0QQ<â[‹Û^©I/´)ÏW¬©v¯¦ª‹¬|\¬}· …ŽÚ·a+µ?œµÅÝPû›~cÞ'<’¬êÕc½Ͻ²õñzžë´Ïðӄ3Õ&ÏWšèPˆVP.TÐ.Æ £²ét:Ü}»ž@ý/ùÉ|.öœîòúŠ%NNAæsê 3Ás‘WyõßÕ<ŽwÜlÓßës® »¦`Çjâ´x¡ŠÆuõÑo/ƒ÷LíÞ´×¼xÍâ‹Aÿn{œ…°CXû ›õ¯¦<ɵJòl7¸]ÜæÝÜ]ŽuYå‹Tû­¥EZ/SH9TŒÐmbGû]ž÷ ÕiÕãóêÃߓҐ­»|JÓ|ÏÕî;Sí_áT+·&*>]’lk¨ç&q9‚1j¥Jy­Á‚ëUjÃVªt„9«‹»¡Jïxàz£ñ1"—„2¬+š—ÍýͬsŒ{ÚȺ0‹í†K'%íƆ­´›æl7XÜ íæŽÚn&4ž@—nô^œ&åJÃyBd½tËu=(ï®ui–ÝË8˜P»fv¶æÞæv/w‹{ç<ÜkóhŽ±ù±‹èÍ%4Ô3CCƒêϪÂÎÀ¢iY¤•2p˜Ö†­˜v„9M‹ÅÝ`ZŒ‡%IoÚ [Ëþ2ížjÆ}ÁHÏs•¶ [Si€¹UBânQ ၨdӘ**Ô`C´,™d„ËÀU–6l¥,G˜³,±¸ÊòŽ^–·²\|ð CVtøC~Œ "˜p [³Ös[ ‰»ÅZshטÐX8¿šnL£h¥_l·á¸} +³:<{»Ä´`kb0·˜HÜ-bÎyàbÚ4N·±Ñ4€á1õj:[ÔÞbÿF¯™X­¾ô³0÷ïüÔ ª¦¡Ç˜^|‡ÄûŽˆœendstream +endobj +7276 0 obj << +/Type /Page +/Contents 7277 0 R +/Resources 7275 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7278 0 obj << +/D [7276 0 R /XYZ 71.731 729.2652 null] +>> endobj +7279 0 obj << +/D [7276 0 R /XYZ 71.731 741.2204 null] +>> endobj +7280 0 obj << +/D [7276 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7281 0 obj << +/D [7276 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7282 0 obj << +/D [7276 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7283 0 obj << +/D [7276 0 R /XYZ 71.731 688.2541 null] +>> endobj +7284 0 obj << +/D [7276 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7285 0 obj << +/D [7276 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7286 0 obj << +/D [7276 0 R /XYZ 71.731 671.0974 null] +>> endobj +7287 0 obj << +/D [7276 0 R /XYZ 71.731 671.0974 null] +>> endobj +7288 0 obj << +/D [7276 0 R /XYZ 139.477 654.5454 null] +>> endobj +7289 0 obj << +/D [7276 0 R /XYZ 139.477 654.5454 null] +>> endobj +7290 0 obj << +/D [7276 0 R /XYZ 71.731 652.3886 null] +>> endobj +7291 0 obj << +/D [7276 0 R /XYZ 139.477 636.6127 null] +>> endobj +7292 0 obj << +/D [7276 0 R /XYZ 139.477 636.6127 null] +>> endobj +7293 0 obj << +/D [7276 0 R /XYZ 71.731 598.7547 null] +>> endobj +7294 0 obj << +/D [7276 0 R /XYZ 71.731 585.7037 null] +>> endobj +7295 0 obj << +/D [7276 0 R /XYZ 71.731 584.4584 null] +>> endobj +7296 0 obj << +/D [7276 0 R /XYZ 129.5143 565.3798 null] +>> endobj +898 0 obj << +/D [7276 0 R /XYZ 71.731 558.9589 null] +>> endobj +446 0 obj << +/D [7276 0 R /XYZ 277.0577 515.1442 null] +>> endobj +7297 0 obj << +/D [7276 0 R /XYZ 71.731 491.6554 null] +>> endobj +7298 0 obj << +/D [7276 0 R /XYZ 161.0655 482.2675 null] +>> endobj +7299 0 obj << +/D [7276 0 R /XYZ 71.731 470.148 null] +>> endobj +7300 0 obj << +/D [7276 0 R /XYZ 71.731 438.7821 null] +>> endobj +7301 0 obj << +/D [7276 0 R /XYZ 168.8063 427.7718 null] +>> endobj +7302 0 obj << +/D [7276 0 R /XYZ 71.731 400.7084 null] +>> endobj +7303 0 obj << +/D [7276 0 R /XYZ 71.731 384.2865 null] +>> endobj +7304 0 obj << +/D [7276 0 R /XYZ 71.731 353.3505 null] +>> endobj +7305 0 obj << +/D [7276 0 R /XYZ 181.5683 341.6946 null] +>> endobj +7306 0 obj << +/D [7276 0 R /XYZ 71.731 331.6324 null] +>> endobj +7307 0 obj << +/D [7276 0 R /XYZ 71.731 300.0608 null] +>> endobj +7308 0 obj << +/D [7276 0 R /XYZ 71.731 287.0994 null] +>> endobj +7309 0 obj << +/D [7276 0 R /XYZ 71.731 285.8541 null] +>> endobj +7310 0 obj << +/D [7276 0 R /XYZ 129.5143 266.7756 null] +>> endobj +7311 0 obj << +/D [7276 0 R /XYZ 129.5143 266.7756 null] +>> endobj +7312 0 obj << +/D [7276 0 R /XYZ 71.731 265.336 null] +>> endobj +7313 0 obj << +/D [7276 0 R /XYZ 71.731 265.336 null] +>> endobj +7314 0 obj << +/D [7276 0 R /XYZ 139.477 248.8428 null] +>> endobj +7315 0 obj << +/D [7276 0 R /XYZ 139.477 248.8428 null] +>> endobj +7316 0 obj << +/D [7276 0 R /XYZ 76.7123 230.9101 null] +>> endobj +7317 0 obj << +/D [7276 0 R /XYZ 129.5143 212.9773 null] +>> endobj +7318 0 obj << +/D [7276 0 R /XYZ 129.5143 212.9773 null] +>> endobj +7319 0 obj << +/D [7276 0 R /XYZ 71.731 210.8205 null] +>> endobj +7320 0 obj << +/D [7276 0 R /XYZ 71.731 210.8205 null] +>> endobj +7321 0 obj << +/D [7276 0 R /XYZ 139.477 195.0446 null] +>> endobj +7322 0 obj << +/D [7276 0 R /XYZ 71.731 192.8877 null] +>> endobj +7323 0 obj << +/D [7276 0 R /XYZ 139.477 177.1118 null] +>> endobj +7324 0 obj << +/D [7276 0 R /XYZ 76.7123 159.1791 null] +>> endobj +7325 0 obj << +/D [7276 0 R /XYZ 129.5143 141.2463 null] +>> endobj +7326 0 obj << +/D [7276 0 R /XYZ 129.5143 141.2463 null] +>> endobj +7327 0 obj << +/D [7276 0 R /XYZ 71.731 139.8656 null] +>> endobj +7328 0 obj << +/D [7276 0 R /XYZ 71.731 139.8656 null] +>> endobj +7329 0 obj << +/D [7276 0 R /XYZ 139.477 123.3136 null] +>> endobj +7330 0 obj << +/D [7276 0 R /XYZ 139.477 123.3136 null] +>> endobj +7331 0 obj << +/D [7276 0 R /XYZ 71.731 121.1567 null] +>> endobj +7332 0 obj << +/D [7276 0 R /XYZ 139.477 105.3808 null] +>> endobj +7333 0 obj << +/D [7276 0 R /XYZ 139.477 105.3808 null] +>> endobj +7275 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7336 0 obj << +/Length 1396 +/Filter /FlateDecode +>> +stream +xڝXÛr£8}ÏWøÑ®Šµ’@\òæ™ÙK¶v²®™ìÓfk +ƒS‹Á…Ädò÷ۀ„—ÚÊ©OŸnu7†?²ò ò¸ÐQÑU|¾Ã«WxôëQ­ÂlMЇ统~qð*D¡G½Õóqå„b¾»òŠF‚Õsò÷úã)ºH^n¶”á5EíuŸE9—D‡ößÝþ±ýñ™ËS‘ˆÍ?Ï¿ßýüÜÙgŽÂŒL’ìP·4ihÐ$$DŒåù ¹žßÐüÂeUæâahú +f a×ñ¬¦;ÔքiÓ@ËǤoZÃjÛ/”²»”"Ç%Ôjwx½òЫ¬< @ F\§Ï#Íå}Ò^Òc{Us!ŽUVӄ½€Ÿ(an½Ù–ùÈ~`DÖnFÁ¬·¬ÿº$‘äOEŸ¸|ÛP¼.ÊÕV&-×GÅ b@¾ŠÌ¾,d!ß/ü¡[À +¯±­Ön)A üÀi5~¼`†£Jž”—9`ò+æ[šŒ£ZEå’Þ_´Ôú¾¬K©ñ† +ºk¨&l¢¡v°Ù†j³» ¡ÞðpCÈ®¡öxÔ½Æ"u®-Ԑ]”Ê*ÖÝ·‡êõ<‡jÕmÄDVmyí;¨)xІÃ0´ «Q[v–Ôs^Ï! ‚©ZíŽ «WÝòè ë„Èõý>èҎŠu<¦Ð¡¾Ð?µ¾YÍ&#‹®ßg/Ñu\w.{ ØTöjØ|öZì.ÉÞ!‘ì5yè6ӎF¥!Չ§¾§ôuˆ|êæ¸Ç˶®ÅúVRG iå¸È¦#LfK„›YÃæE¶Ø]"òÇˆÈ&SäcÚ ]·B‡!r¨%¥¡ŒV0YsUÀ„MT6[lvTÖ*У¡d³½G`äºðú7^¾VX®ªl’”ЁǕô1´rÌ)iÀ¦”Ô°y%-v—(9äaWÒ¤‘Šo—2=Gå»­žúÃË]OËCE¤Ç=ÏAUUsƒÚlìðw£½<éÑTVö0Š|ì¸s0`SаùXì.‰À‡=&æ…À>)`hzã‰ü¸ï'q;2-qøôôU­çe;ܗã‚;.ò}ìÍ nÀ¦×°yÁ-v—>äaܤq*„ÌaFµU† §ªGýáÏæÕ>ʚoÍÝߌ-íªÂ;Aàø³%ـM©ªaóªZì.QuÈîªIãÅAI‰N‚ A?ï6.^\VC ¢Ï¨h &DÔ¨Y -FH8$aUÐäpxËÒs*í=¸¡;6l}€—é·4Ñï¾Ý.¦3ê+® x'?ô˜Û,:Я۩fDH0úÙÖbñ?z@9endstream +endobj +7335 0 obj << +/Type /Page +/Contents 7336 0 R +/Resources 7334 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7337 0 obj << +/D [7335 0 R /XYZ 71.731 729.2652 null] +>> endobj +7338 0 obj << +/D [7335 0 R /XYZ 71.731 675.3674 null] +>> endobj +7339 0 obj << +/D [7335 0 R /XYZ 71.731 674.1221 null] +>> endobj +7340 0 obj << +/D [7335 0 R /XYZ 129.5143 655.0436 null] +>> endobj +899 0 obj << +/D [7335 0 R /XYZ 71.731 648.6227 null] +>> endobj +450 0 obj << +/D [7335 0 R /XYZ 293.326 604.8079 null] +>> endobj +7341 0 obj << +/D [7335 0 R /XYZ 71.731 581.3192 null] +>> endobj +7342 0 obj << +/D [7335 0 R /XYZ 161.0655 571.9312 null] +>> endobj +7343 0 obj << +/D [7335 0 R /XYZ 71.731 559.8118 null] +>> endobj +7344 0 obj << +/D [7335 0 R /XYZ 71.731 528.4459 null] +>> endobj +7345 0 obj << +/D [7335 0 R /XYZ 168.8063 517.4356 null] +>> endobj +7346 0 obj << +/D [7335 0 R /XYZ 71.731 490.3722 null] +>> endobj +7347 0 obj << +/D [7335 0 R /XYZ 71.731 424.0374 null] +>> endobj +7348 0 obj << +/D [7335 0 R /XYZ 71.731 397.5951 null] +>> endobj +7349 0 obj << +/D [7335 0 R /XYZ 71.731 364.8075 null] +>> endobj +7350 0 obj << +/D [7335 0 R /XYZ 181.5683 353.1517 null] +>> endobj +7351 0 obj << +/D [7335 0 R /XYZ 71.731 343.0895 null] +>> endobj +7352 0 obj << +/D [7335 0 R /XYZ 71.731 309.6663 null] +>> endobj +7353 0 obj << +/D [7335 0 R /XYZ 71.731 298.5565 null] +>> endobj +7354 0 obj << +/D [7335 0 R /XYZ 71.731 297.3112 null] +>> endobj +7355 0 obj << +/D [7335 0 R /XYZ 129.5143 278.2326 null] +>> endobj +7356 0 obj << +/D [7335 0 R /XYZ 129.5143 278.2326 null] +>> endobj +7357 0 obj << +/D [7335 0 R /XYZ 71.731 276.7931 null] +>> endobj +7358 0 obj << +/D [7335 0 R /XYZ 71.731 276.7931 null] +>> endobj +7359 0 obj << +/D [7335 0 R /XYZ 139.477 260.2999 null] +>> endobj +7360 0 obj << +/D [7335 0 R /XYZ 139.477 260.2999 null] +>> endobj +7361 0 obj << +/D [7335 0 R /XYZ 76.7123 242.3671 null] +>> endobj +7362 0 obj << +/D [7335 0 R /XYZ 129.5143 224.4344 null] +>> endobj +7363 0 obj << +/D [7335 0 R /XYZ 129.5143 224.4344 null] +>> endobj +7364 0 obj << +/D [7335 0 R /XYZ 71.731 222.9948 null] +>> endobj +7365 0 obj << +/D [7335 0 R /XYZ 129.5143 206.5016 null] +>> endobj +7366 0 obj << +/D [7335 0 R /XYZ 129.5143 206.5016 null] +>> endobj +7367 0 obj << +/D [7335 0 R /XYZ 71.731 205.3226 null] +>> endobj +7368 0 obj << +/D [7335 0 R /XYZ 71.731 205.3226 null] +>> endobj +7369 0 obj << +/D [7335 0 R /XYZ 139.477 188.5689 null] +>> endobj +7370 0 obj << +/D [7335 0 R /XYZ 139.477 188.5689 null] +>> endobj +7371 0 obj << +/D [7335 0 R /XYZ 71.731 186.412 null] +>> endobj +7372 0 obj << +/D [7335 0 R /XYZ 139.477 170.6361 null] +>> endobj +7373 0 obj << +/D [7335 0 R /XYZ 139.477 170.6361 null] +>> endobj +7374 0 obj << +/D [7335 0 R /XYZ 71.731 168.4793 null] +>> endobj +7375 0 obj << +/D [7335 0 R /XYZ 139.477 152.7034 null] +>> endobj +7376 0 obj << +/D [7335 0 R /XYZ 139.477 152.7034 null] +>> endobj +7377 0 obj << +/D [7335 0 R /XYZ 71.731 150.5465 null] +>> endobj +7378 0 obj << +/D [7335 0 R /XYZ 139.477 134.7706 null] +>> endobj +7379 0 obj << +/D [7335 0 R /XYZ 139.477 134.7706 null] +>> endobj +7380 0 obj << +/D [7335 0 R /XYZ 71.731 132.6138 null] +>> endobj +7381 0 obj << +/D [7335 0 R /XYZ 139.477 116.8379 null] +>> endobj +7382 0 obj << +/D [7335 0 R /XYZ 139.477 116.8379 null] +>> endobj +7383 0 obj << +/D [7335 0 R /XYZ 71.731 114.681 null] +>> endobj +7384 0 obj << +/D [7335 0 R /XYZ 139.477 98.9051 null] +>> endobj +7385 0 obj << +/D [7335 0 R /XYZ 139.477 98.9051 null] +>> endobj +7386 0 obj << +/D [7335 0 R /XYZ 71.731 97.4656 null] +>> endobj +7334 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7389 0 obj << +/Length 1377 +/Filter /FlateDecode +>> +stream +xڝXËr¤6Ýû+ؙ®r+’ðÎÉdRNeœ®g§\°›2†qùïsA‚Ý⑩^4ˆ#Ý£s\A ?â‚„4@ÔçԉÞ.°ó~» ²Õ˜­ úùþâ§ÏvøÔwîŸ/ðÌE’éÜÇ»¿ìÃC”›-åØ¥Hýï²0Oê?Â'u{³»U_’z_ÄÕæŸûß/~½ìsO @‚‘Y’ KÄ|é9[ŠQ@ ·¢,Á ”¼Ç<1l†Ž@¤Ý(lfÀ °v7”òSv¶‹) sÁÞîéÿ‘G?뜇' ¢ú¬ãሠ1¦ñTa…UÝr鈽Àaó8#-ðZéZÕeš¿\©›»¤~ßìå«8®Ö݆q\&ՙAü#FÀļ¼&lFÞ¶(¯Íî +yÏxXåÑxëÂТ­Ç¡’̈{£Äƒu¯—ê®0Ç zAz¹á&‡u]ª‘¢ž`7ÞG‡K˜B¦!(p—tÉlÎ=lÙ»kqÊÃ·°zµx‚»‚iO|kž`ºö‚^Ä.#gˆ3Ζd4`s2ö°e-v×ÈxÊÃ.£I#Î+jѐ2„q0W*nw㒠¢ôY#“¨Èã°üP·Ÿî¾õãå÷ á.ýIÉ=ù„Š%É Øœä=lYr‹Ý5’Ÿò°KnÒHÁ‰‡hÀÉÿ|R@"‘/‚ÅlÀæìaËZì®ð”‡]@“FýqH~(foÌXíV±ßôð-”WŒ‘`b±¼°9{زÆ»k4>åa×ؤñÖÉ{øa/¯2ðü- ‡2} +È»`hC¹ÛõÊ`KI"9t,¼3õ5©›2¯®ÏÔ! #'Âá½ V¯ô¨­ ;z%XyålµI¯P +m¡V»Ó^égYy¡:â‘æµ™¨¿´¯¸MÖÏM¦]ü‚N·sñ– $¤çu‚RûÝbì·m·î_‡qWĶÌbIŠAº¶{¾*c»²¨‹6‰®‡ǘÒs·”@ݓ*m CڅM½×ÊáÁc?å㾨ê<|KÌ'Ó$‹«>/O(n{‹&ÅOI•é¡N‹|Ž$gîS“¤ŽÙðh_ŸNþÌ3ºõ~؆"¦ýpH¢´ҝ]š[6¡—/õMg4ÖÛ ³L§ Ø(mF†‰Yò¬Û˜&¯‹&Ú'1ê2îâ’(OïnۙÌwü¥Å„['Ñ^Ea®. u]¨¶È½jwÐ/SÏÒR U)ȆԵV©Æoi^)°ÕŽ^]¸¯mþ'msð±ñ¹{¥Wmæ"¿±÷ݧ¢¨ó"’~·û:YµXƒÞ¾žðÍ*²DÚÏ]Qj²º2<òžV Z‚7YVt孏‡¯E–TkS¦“Os9¤ú¢uÝZó»Vа„\‚ƒöLé$RÀû•Ò…ÒiÂfJç[,6»+Jçñ ­¯˜#m©™èÎÛ®&êëì𢝟äp" Ûzb"›2™ìˆ áKLØL§0À;›ÝÂk§0¢qº|™:sÈ<&Ø\Of‘Õ<ׅ.pU2½ž!ϖ‚÷ˆš‹]ZÝs£k"÷„ÄDà$,ïEÛù3$°ðÆJC»0þ| ¤ŸŽVÂQÐò\ˆV6­=l9Z-v×D«…‡y¤ÒÑjÒ86PÇF$ÛìÞÓçÒ@ÂéB.屁š¦G-êb1ºB ‰sUL£„üÜd}óof£fÆ @“°þÌ$´í~0ûØÀœ&æÔCؓþ°RËRsò«¯ÅâšP-pendstream +endobj +7388 0 obj << +/Type /Page +/Contents 7389 0 R +/Resources 7387 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7390 0 obj << +/D [7388 0 R /XYZ 71.731 729.2652 null] +>> endobj +7391 0 obj << +/D [7388 0 R /XYZ 139.477 708.3437 null] +>> endobj +7392 0 obj << +/D [7388 0 R /XYZ 139.477 708.3437 null] +>> endobj +7393 0 obj << +/D [7388 0 R /XYZ 71.731 706.1869 null] +>> endobj +7394 0 obj << +/D [7388 0 R /XYZ 139.477 690.4109 null] +>> endobj +7395 0 obj << +/D [7388 0 R /XYZ 139.477 690.4109 null] +>> endobj +7396 0 obj << +/D [7388 0 R /XYZ 71.731 688.2541 null] +>> endobj +7397 0 obj << +/D [7388 0 R /XYZ 139.477 672.4782 null] +>> endobj +7398 0 obj << +/D [7388 0 R /XYZ 139.477 672.4782 null] +>> endobj +7399 0 obj << +/D [7388 0 R /XYZ 71.731 670.3214 null] +>> endobj +7400 0 obj << +/D [7388 0 R /XYZ 139.477 654.5454 null] +>> endobj +7401 0 obj << +/D [7388 0 R /XYZ 139.477 654.5454 null] +>> endobj +7402 0 obj << +/D [7388 0 R /XYZ 71.731 652.3886 null] +>> endobj +7403 0 obj << +/D [7388 0 R /XYZ 139.477 636.6127 null] +>> endobj +7404 0 obj << +/D [7388 0 R /XYZ 139.477 636.6127 null] +>> endobj +7405 0 obj << +/D [7388 0 R /XYZ 71.731 634.4559 null] +>> endobj +7406 0 obj << +/D [7388 0 R /XYZ 139.477 618.6799 null] +>> endobj +7407 0 obj << +/D [7388 0 R /XYZ 139.477 618.6799 null] +>> endobj +7408 0 obj << +/D [7388 0 R /XYZ 71.731 616.5231 null] +>> endobj +7409 0 obj << +/D [7388 0 R /XYZ 139.477 600.7472 null] +>> endobj +7410 0 obj << +/D [7388 0 R /XYZ 139.477 600.7472 null] +>> endobj +7411 0 obj << +/D [7388 0 R /XYZ 71.731 562.8892 null] +>> endobj +7412 0 obj << +/D [7388 0 R /XYZ 71.731 549.8382 null] +>> endobj +7413 0 obj << +/D [7388 0 R /XYZ 71.731 548.5928 null] +>> endobj +7414 0 obj << +/D [7388 0 R /XYZ 129.5143 529.5143 null] +>> endobj +900 0 obj << +/D [7388 0 R /XYZ 71.731 523.0934 null] +>> endobj +454 0 obj << +/D [7388 0 R /XYZ 225.7561 479.2787 null] +>> endobj +7415 0 obj << +/D [7388 0 R /XYZ 71.731 455.7899 null] +>> endobj +7416 0 obj << +/D [7388 0 R /XYZ 161.0655 446.402 null] +>> endobj +7417 0 obj << +/D [7388 0 R /XYZ 71.731 434.2825 null] +>> endobj +7418 0 obj << +/D [7388 0 R /XYZ 71.731 402.9166 null] +>> endobj +7419 0 obj << +/D [7388 0 R /XYZ 168.8063 391.9063 null] +>> endobj +7420 0 obj << +/D [7388 0 R /XYZ 71.731 364.8429 null] +>> endobj +7421 0 obj << +/D [7388 0 R /XYZ 71.731 333.477 null] +>> endobj +7422 0 obj << +/D [7388 0 R /XYZ 71.731 307.0347 null] +>> endobj +7423 0 obj << +/D [7388 0 R /XYZ 71.731 274.2471 null] +>> endobj +7424 0 obj << +/D [7388 0 R /XYZ 181.5683 262.5913 null] +>> endobj +7425 0 obj << +/D [7388 0 R /XYZ 71.731 252.5291 null] +>> endobj +7426 0 obj << +/D [7388 0 R /XYZ 71.731 219.1059 null] +>> endobj +7427 0 obj << +/D [7388 0 R /XYZ 71.731 207.9961 null] +>> endobj +7428 0 obj << +/D [7388 0 R /XYZ 71.731 206.7508 null] +>> endobj +7429 0 obj << +/D [7388 0 R /XYZ 129.5143 187.6722 null] +>> endobj +7430 0 obj << +/D [7388 0 R /XYZ 129.5143 187.6722 null] +>> endobj +7431 0 obj << +/D [7388 0 R /XYZ 71.731 186.2327 null] +>> endobj +7432 0 obj << +/D [7388 0 R /XYZ 71.731 186.2327 null] +>> endobj +7433 0 obj << +/D [7388 0 R /XYZ 139.477 169.7395 null] +>> endobj +7434 0 obj << +/D [7388 0 R /XYZ 139.477 169.7395 null] +>> endobj +7435 0 obj << +/D [7388 0 R /XYZ 76.7123 151.8067 null] +>> endobj +7436 0 obj << +/D [7388 0 R /XYZ 129.5143 133.874 null] +>> endobj +7437 0 obj << +/D [7388 0 R /XYZ 129.5143 133.874 null] +>> endobj +7438 0 obj << +/D [7388 0 R /XYZ 71.731 131.7171 null] +>> endobj +7439 0 obj << +/D [7388 0 R /XYZ 71.731 131.7171 null] +>> endobj +7440 0 obj << +/D [7388 0 R /XYZ 139.477 115.9412 null] +>> endobj +7441 0 obj << +/D [7388 0 R /XYZ 71.731 114.5017 null] +>> endobj +7442 0 obj << +/D [7388 0 R /XYZ 139.477 98.0085 null] +>> endobj +7387 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7445 0 obj << +/Length 1263 +/Filter /FlateDecode +>> +stream +xÚ¥˜ßs£6ÇßóWðè̜Uý–È[.×ë´Ó»ÉdrOM'Cl3‡Á5p©ÿû.HÂ2–¹N€xÑ~õÙÕj‰0ü‘H¤\hŒ¨4Zm¯pô?ývE¬ÉÒÚ,}£W¿|f8ŠQ,©Œ_#K$£H ¢£Çõ_‹»M²«Óýõ’ +¼ È\ïó¤Hë?“óx{ÿ»¹ù’Ö›r]]ÿýøÇÕ¯½ÁŠ58ɉFœá8Z2 þ9 Z#!ˆŠ–2ƈ°w“¡q~&ídz»Þ¬Í¥b¨ŽPŠ'4òt~‡×£÷Ö¹¦# P%ïtÀ”Éœè(Êuúüš¥¹Õi?B$¥Vਵ½1l«z߬êsñnxEW:Œ¶·ZúfGh¤ÍŽ±Îì"4ÈLyô{š{ë\Ç)4ïêTƏt_eeàÅ1"<æg¼²âíƒÍÐÝ.Ù§Emž>–¥½»ûd®?®‰XÇ .øaÏlŒ°3›&ð;‡ðPG˜°/ã¸^r5z¢`ݚáLž—vÑWéå¼Å1‰j*q=³±ÌufÓ©ð;'w‡:.$¯¯ÃìÂL BõàzÜ2û­[Ê]éÝ'd?+r }§ŒG¿> endobj +7446 0 obj << +/D [7444 0 R /XYZ 71.731 729.2652 null] +>> endobj +7447 0 obj << +/D [7444 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7448 0 obj << +/D [7444 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7449 0 obj << +/D [7444 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7450 0 obj << +/D [7444 0 R /XYZ 71.731 689.2319 null] +>> endobj +7451 0 obj << +/D [7444 0 R /XYZ 71.731 689.2319 null] +>> endobj +7452 0 obj << +/D [7444 0 R /XYZ 139.477 672.4782 null] +>> endobj +7453 0 obj << +/D [7444 0 R /XYZ 139.477 672.4782 null] +>> endobj +7454 0 obj << +/D [7444 0 R /XYZ 71.731 670.3214 null] +>> endobj +7455 0 obj << +/D [7444 0 R /XYZ 139.477 654.5454 null] +>> endobj +7456 0 obj << +/D [7444 0 R /XYZ 139.477 654.5454 null] +>> endobj +7457 0 obj << +/D [7444 0 R /XYZ 71.731 652.3886 null] +>> endobj +7458 0 obj << +/D [7444 0 R /XYZ 139.477 636.6127 null] +>> endobj +7459 0 obj << +/D [7444 0 R /XYZ 139.477 636.6127 null] +>> endobj +7460 0 obj << +/D [7444 0 R /XYZ 71.731 634.4559 null] +>> endobj +7461 0 obj << +/D [7444 0 R /XYZ 139.477 618.6799 null] +>> endobj +7462 0 obj << +/D [7444 0 R /XYZ 139.477 618.6799 null] +>> endobj +7463 0 obj << +/D [7444 0 R /XYZ 71.731 616.5231 null] +>> endobj +7464 0 obj << +/D [7444 0 R /XYZ 139.477 600.7472 null] +>> endobj +7465 0 obj << +/D [7444 0 R /XYZ 139.477 600.7472 null] +>> endobj +7466 0 obj << +/D [7444 0 R /XYZ 71.731 598.5904 null] +>> endobj +7467 0 obj << +/D [7444 0 R /XYZ 139.477 582.8144 null] +>> endobj +7468 0 obj << +/D [7444 0 R /XYZ 139.477 582.8144 null] +>> endobj +7469 0 obj << +/D [7444 0 R /XYZ 71.731 580.6576 null] +>> endobj +7470 0 obj << +/D [7444 0 R /XYZ 139.477 564.8817 null] +>> endobj +7471 0 obj << +/D [7444 0 R /XYZ 139.477 564.8817 null] +>> endobj +7472 0 obj << +/D [7444 0 R /XYZ 71.731 527.0236 null] +>> endobj +7473 0 obj << +/D [7444 0 R /XYZ 71.731 513.9727 null] +>> endobj +7474 0 obj << +/D [7444 0 R /XYZ 71.731 512.7273 null] +>> endobj +7475 0 obj << +/D [7444 0 R /XYZ 129.5143 493.6488 null] +>> endobj +901 0 obj << +/D [7444 0 R /XYZ 71.731 487.2279 null] +>> endobj +458 0 obj << +/D [7444 0 R /XYZ 219.0592 443.4132 null] +>> endobj +7476 0 obj << +/D [7444 0 R /XYZ 71.731 419.9244 null] +>> endobj +7477 0 obj << +/D [7444 0 R /XYZ 161.0655 410.5365 null] +>> endobj +7478 0 obj << +/D [7444 0 R /XYZ 71.731 398.417 null] +>> endobj +7479 0 obj << +/D [7444 0 R /XYZ 71.731 367.0511 null] +>> endobj +7480 0 obj << +/D [7444 0 R /XYZ 168.8063 356.0408 null] +>> endobj +7481 0 obj << +/D [7444 0 R /XYZ 71.731 328.9774 null] +>> endobj +7482 0 obj << +/D [7444 0 R /XYZ 71.731 297.6115 null] +>> endobj +7483 0 obj << +/D [7444 0 R /XYZ 71.731 280.9739 null] +>> endobj +7484 0 obj << +/D [7444 0 R /XYZ 71.731 250.0379 null] +>> endobj +7485 0 obj << +/D [7444 0 R /XYZ 181.5683 238.3821 null] +>> endobj +7486 0 obj << +/D [7444 0 R /XYZ 71.731 228.3199 null] +>> endobj +7487 0 obj << +/D [7444 0 R /XYZ 71.731 194.8967 null] +>> endobj +7488 0 obj << +/D [7444 0 R /XYZ 71.731 183.7869 null] +>> endobj +7489 0 obj << +/D [7444 0 R /XYZ 71.731 182.5415 null] +>> endobj +7490 0 obj << +/D [7444 0 R /XYZ 129.5143 163.463 null] +>> endobj +7491 0 obj << +/D [7444 0 R /XYZ 129.5143 163.463 null] +>> endobj +7492 0 obj << +/D [7444 0 R /XYZ 71.731 162.0235 null] +>> endobj +7493 0 obj << +/D [7444 0 R /XYZ 71.731 162.0235 null] +>> endobj +7494 0 obj << +/D [7444 0 R /XYZ 139.477 145.5303 null] +>> endobj +7495 0 obj << +/D [7444 0 R /XYZ 139.477 145.5303 null] +>> endobj +7496 0 obj << +/D [7444 0 R /XYZ 76.7123 127.5975 null] +>> endobj +7497 0 obj << +/D [7444 0 R /XYZ 129.5143 109.6647 null] +>> endobj +7498 0 obj << +/D [7444 0 R /XYZ 129.5143 109.6647 null] +>> endobj +7499 0 obj << +/D [7444 0 R /XYZ 71.731 108.2252 null] +>> endobj +7443 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7502 0 obj << +/Length 1266 +/Filter /FlateDecode +>> +stream +xÚ­˜]›8†ïçWp9‘×666s×í~¨«VUÓ«Õˆg‚Ä£Qÿý‚Mâ`´]ÍE˜äµÏËÃ9æØ$ÂðG"Aˆáƒ¦ˆ&œFùëŽ^à§?lfëŠ~y¼{ÿ{Œ£¥ M¢ÇC§ â‚E"¦Hr"£Çýß÷Y£U»ÙRŽï)?weV)ý9û>þûa÷i¼ø¢ô±Þw›ÿ¼ûíqŠÏcR AM2"‹qm)F)%Ü«"$Eœ7ƒ%ŠY,¦›¡iq&ÃÍLºI6ÜÍ¥|îŽP +B#wBwþyöaG]ûˆe$jÂN>à–9añ¥&*GV'ëççÀD¥L!Î }Ñvºís}íÝ̞¤1ð¼Ì¬jëÊÎÌȐ®×Iv“¤¦,õƽÍ̎ºöqÉ,NâÒFß©¶Ê^•ãˆÓ”^+ª—w&a?~/ÜYü …Ø’†@:²%V鉻ä܇¤k£ik]çuùs í,æ{…^ÌÚÐuGóÝQë¦3×Z•°bܦÎ⌳uG¶DÝÊÂÔ=q×PŸûðSwmTõ^=Þz÷RÏÚ6û±Iø½ø¹èôxUÆÏaÆÎÐ=fÚ^ÝìIåu¥Ûºì®!›q‚B…Ÿ½m]•ý|®›äWH¼Qo“·£¼6Î$ ð»ôQT ‰‡1LËݑ-%ž•…ÏwMâÍ}øϵQ4ž”#1¢)'k +ýÓÎ$ä~ߪ®»I’Kè •°+[ 9ɂ$}qW¼òá%ya£ªµòÕ/xŽe*`~)º\•CÓT÷­^3™f”D„`:²%˜V†é‰»æ܇¦kãXwúç_çî,~,A)“¡¾È•-´²0HOÜ5 ç>ü ]¯ð(ÿSVNÇ)ÁmœpIZ.]ÙN+ ãôÄ]ƒsîÏӵÑd]÷V·{^J)äÿÒfrB–qpµtdK ­, Òw ȹ?H×FS·zõjîvôQ™Ææ5Khÿú]µW-Êòã¹C¯lS½P¥r­öfP}«)biŒǁ¦ÈUÝnŠ&U°)òE]Ñùlxš¢ ¦)‚Ív:dõÐ[HhèX_•îÛª{¸rjwÕ Ç<´EwT ;t« +nÐ=AWìÏ=&8¶„\ÀÆä!1éc’°ëóz Co\0'%üT[.ñP¶ј'§É("°ó‡ñBÞkö™V»M YªZß#¤ð„¶ÃŒHÆGµ¶ZúG£¦çÚ3c·”@Ãk^ &Œ²Ç6O˜ã¬×v_ÖÀ°y®Ûçar¿}˜§0‚xìmm4×Þ¯ªËÛ¢ÑE]-„Žœ'Ô5hj2;Çßp~o¶‘UåYå[sæY4*/N_™b.*ύØåÅLџïÍ-g¥yëÕ£õ™–ê`–—¾ÒuŸÕêCªÁ^#‰[8ì1ñ!úRwŽ·¢Sh-ûeYo(¿³¾Ö¥êÖæI¶h+Cí6„H ‹î핁` <–¥Á•-¬ “,¸8øâ®X®|øOï.| µä{³1h#|§vïfǤÃxUé"φ¢q•}{Õ2˜³[&a#’¤‹Ç»Žæút—ÓáX&ÓLƒMBÉÍÃZOÄFbÓendstream +endobj +7501 0 obj << +/Type /Page +/Contents 7502 0 R +/Resources 7500 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7503 0 obj << +/D [7501 0 R /XYZ 71.731 729.2652 null] +>> endobj +7504 0 obj << +/D [7501 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7505 0 obj << +/D [7501 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7506 0 obj << +/D [7501 0 R /XYZ 71.731 706.9629 null] +>> endobj +7507 0 obj << +/D [7501 0 R /XYZ 71.731 706.9629 null] +>> endobj +7508 0 obj << +/D [7501 0 R /XYZ 139.477 690.4109 null] +>> endobj +7509 0 obj << +/D [7501 0 R /XYZ 139.477 690.4109 null] +>> endobj +7510 0 obj << +/D [7501 0 R /XYZ 71.731 688.2541 null] +>> endobj +7511 0 obj << +/D [7501 0 R /XYZ 139.477 672.4782 null] +>> endobj +7512 0 obj << +/D [7501 0 R /XYZ 139.477 672.4782 null] +>> endobj +7513 0 obj << +/D [7501 0 R /XYZ 71.731 670.3214 null] +>> endobj +7514 0 obj << +/D [7501 0 R /XYZ 139.477 654.5454 null] +>> endobj +7515 0 obj << +/D [7501 0 R /XYZ 139.477 654.5454 null] +>> endobj +7516 0 obj << +/D [7501 0 R /XYZ 71.731 652.3886 null] +>> endobj +7517 0 obj << +/D [7501 0 R /XYZ 71.731 652.3886 null] +>> endobj +7518 0 obj << +/D [7501 0 R /XYZ 149.4396 636.6127 null] +>> endobj +7519 0 obj << +/D [7501 0 R /XYZ 76.7123 618.6799 null] +>> endobj +7520 0 obj << +/D [7501 0 R /XYZ 139.477 600.7472 null] +>> endobj +7521 0 obj << +/D [7501 0 R /XYZ 139.477 600.7472 null] +>> endobj +7522 0 obj << +/D [7501 0 R /XYZ 71.731 598.5904 null] +>> endobj +7523 0 obj << +/D [7501 0 R /XYZ 139.477 582.8144 null] +>> endobj +7524 0 obj << +/D [7501 0 R /XYZ 139.477 582.8144 null] +>> endobj +7525 0 obj << +/D [7501 0 R /XYZ 71.731 580.6576 null] +>> endobj +7526 0 obj << +/D [7501 0 R /XYZ 139.477 564.8817 null] +>> endobj +7527 0 obj << +/D [7501 0 R /XYZ 139.477 564.8817 null] +>> endobj +7528 0 obj << +/D [7501 0 R /XYZ 71.731 562.7248 null] +>> endobj +7529 0 obj << +/D [7501 0 R /XYZ 139.477 546.9489 null] +>> endobj +7530 0 obj << +/D [7501 0 R /XYZ 139.477 546.9489 null] +>> endobj +7531 0 obj << +/D [7501 0 R /XYZ 71.731 544.7921 null] +>> endobj +7532 0 obj << +/D [7501 0 R /XYZ 139.477 529.0162 null] +>> endobj +7533 0 obj << +/D [7501 0 R /XYZ 139.477 529.0162 null] +>> endobj +7534 0 obj << +/D [7501 0 R /XYZ 71.731 526.8593 null] +>> endobj +7535 0 obj << +/D [7501 0 R /XYZ 139.477 511.0834 null] +>> endobj +7536 0 obj << +/D [7501 0 R /XYZ 139.477 511.0834 null] +>> endobj +7537 0 obj << +/D [7501 0 R /XYZ 71.731 508.9266 null] +>> endobj +7538 0 obj << +/D [7501 0 R /XYZ 71.731 508.9266 null] +>> endobj +7539 0 obj << +/D [7501 0 R /XYZ 149.4396 493.1507 null] +>> endobj +7540 0 obj << +/D [7501 0 R /XYZ 71.731 437.3599 null] +>> endobj +7541 0 obj << +/D [7501 0 R /XYZ 71.731 424.3089 null] +>> endobj +7542 0 obj << +/D [7501 0 R /XYZ 71.731 423.0636 null] +>> endobj +7543 0 obj << +/D [7501 0 R /XYZ 129.5143 403.985 null] +>> endobj +902 0 obj << +/D [7501 0 R /XYZ 71.731 397.5642 null] +>> endobj +462 0 obj << +/D [7501 0 R /XYZ 219.5239 353.7494 null] +>> endobj +7544 0 obj << +/D [7501 0 R /XYZ 71.731 330.2606 null] +>> endobj +7545 0 obj << +/D [7501 0 R /XYZ 161.0655 320.8727 null] +>> endobj +7546 0 obj << +/D [7501 0 R /XYZ 71.731 308.7532 null] +>> endobj +7547 0 obj << +/D [7501 0 R /XYZ 71.731 277.3873 null] +>> endobj +7548 0 obj << +/D [7501 0 R /XYZ 168.8063 266.3771 null] +>> endobj +7549 0 obj << +/D [7501 0 R /XYZ 71.731 239.3136 null] +>> endobj +7550 0 obj << +/D [7501 0 R /XYZ 71.731 222.8917 null] +>> endobj +7551 0 obj << +/D [7501 0 R /XYZ 71.731 191.9557 null] +>> endobj +7552 0 obj << +/D [7501 0 R /XYZ 181.5683 180.2999 null] +>> endobj +7553 0 obj << +/D [7501 0 R /XYZ 71.731 170.2377 null] +>> endobj +7554 0 obj << +/D [7501 0 R /XYZ 71.731 138.6661 null] +>> endobj +7555 0 obj << +/D [7501 0 R /XYZ 71.731 125.7047 null] +>> endobj +7556 0 obj << +/D [7501 0 R /XYZ 71.731 124.4593 null] +>> endobj +7557 0 obj << +/D [7501 0 R /XYZ 129.5143 105.3808 null] +>> endobj +7558 0 obj << +/D [7501 0 R /XYZ 129.5143 105.3808 null] +>> endobj +7559 0 obj << +/D [7501 0 R /XYZ 71.731 103.9413 null] +>> endobj +7560 0 obj << +/D [7501 0 R /XYZ 71.731 103.9413 null] +>> endobj +7500 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7563 0 obj << +/Length 1229 +/Filter /FlateDecode +>> +stream +xÚÅXËnã6Ýç+´´˜%)¾”]ú +¦HQ#“¬š"ÐÈôXE2ôè ß+‰”i›z ]YX±yÏ=¼/ŠþH ’!|ÐQÁi¼ßàà+üôpC dc0ôãóÍ¿†8ˆP$¨ž÷A Ä% dH‘âDÏ»?W?âc­Ëõ†r¼¢¨ÿÜfq®ëÇøKÿïýöSÿð»®Å®ZÿõüÛÍ/σ}J)02I’a…˜Pa°¡E”p/ŠÀœ0@IÀ‡,”ƒ34 +$"­£à̀`­7¯”òKvÜŔE»¡µ{ùyâaW]óU @TÁ:a„˜”ç4î›úÐkՒ队Ž $î w½²U]¦ù×[£7,×y&qyÿÝ{¿]÷\ýgSé+g ȉ „¤ÀKùb@m\ØIäHâ^ä«ÝFE¦Ü'Ôkw\d»êšÇ¹Èö°Ïxµ.ßÒÝ[Q¾åñ»öH­BD”:W:Íëþ¡(]鯲&9Cœq6­.l"ZØl´úì.ˆV“ 6ZÏh€"&ð¶ÚV‚t×à+ƾ•&„P&TÎIãÀ¦¤±°yiôÇæK–&ýó·5Á+½&|õ1.®`H)2—§.lJ\ ›×cw‰¸—<üâº4’8ÑeíÑ7dHŠH,Ò÷óçÇk}Û}»:ÍX+ÌŠ˜Šæv`S +[ؼ»K¾äáWإѦüH—eqÑE{+çà7<`"蜊lJE ›WÑcw‰Š—<ü*º4ºÂٔÙTqÈ_žÛ­Ú¶ s …‘Âï6yÒuSæÕÝh«b\"©Âp¦U¹°‰V5Àf[•Ïî‚Våãá”R{ðgðŠ9Žáž`œ;v?™iX¿ÇivþC7ÉA»†eÄÃrcº,ÖUR¦Çö2Åæ%.¨Ë³êMÇ.s³ü#Ï>Ì%æ ­'=5s,GôsçÎÎë^GŒ‰ÒlÒt†wÆé8Ë̌VJŸ™aa¦÷æ>ÐäuÑ$½C]JaðŒ ®Hô/Ø7ks{ÓÉÁ|—Ćf18ØSœ}¯töw'º²·ìOÿfñÇüÈ7Þq=,NíE'­[ÛÆ9cn(…[(fòĈ»o'Ž¸ÉêÊað=­4ZX÷YV¬)_}·güTdºZš ñî=Ímt§·ÃU¸\3¼º=ÌR6ÛV׸„ÆTÏK¸ I>S,]ØD±`³ÅÒgwA±¼âáŸëÏx´Å#eÐÁ|ãüíE;Š=/.zdSŽ·ý¶¦­¹ñԅM´ý6Ûö}v´ý+Þ¶Fãÿ{dÞ 2M¾> endobj +7564 0 obj << +/D [7562 0 R /XYZ 71.731 729.2652 null] +>> endobj +7565 0 obj << +/D [7562 0 R /XYZ 139.477 708.3437 null] +>> endobj +7566 0 obj << +/D [7562 0 R /XYZ 139.477 708.3437 null] +>> endobj +7567 0 obj << +/D [7562 0 R /XYZ 76.7123 690.4109 null] +>> endobj +7568 0 obj << +/D [7562 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7569 0 obj << +/D [7562 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7570 0 obj << +/D [7562 0 R /XYZ 71.731 670.3214 null] +>> endobj +7571 0 obj << +/D [7562 0 R /XYZ 71.731 670.3214 null] +>> endobj +7572 0 obj << +/D [7562 0 R /XYZ 139.477 654.5454 null] +>> endobj +7573 0 obj << +/D [7562 0 R /XYZ 71.731 653.1059 null] +>> endobj +7574 0 obj << +/D [7562 0 R /XYZ 139.477 636.6127 null] +>> endobj +7575 0 obj << +/D [7562 0 R /XYZ 76.7123 618.6799 null] +>> endobj +7576 0 obj << +/D [7562 0 R /XYZ 129.5143 600.7472 null] +>> endobj +7577 0 obj << +/D [7562 0 R /XYZ 129.5143 600.7472 null] +>> endobj +7578 0 obj << +/D [7562 0 R /XYZ 71.731 599.3664 null] +>> endobj +7579 0 obj << +/D [7562 0 R /XYZ 71.731 599.3664 null] +>> endobj +7580 0 obj << +/D [7562 0 R /XYZ 139.477 582.8144 null] +>> endobj +7581 0 obj << +/D [7562 0 R /XYZ 139.477 582.8144 null] +>> endobj +7582 0 obj << +/D [7562 0 R /XYZ 71.731 580.6576 null] +>> endobj +7583 0 obj << +/D [7562 0 R /XYZ 139.477 564.8817 null] +>> endobj +7584 0 obj << +/D [7562 0 R /XYZ 139.477 564.8817 null] +>> endobj +7585 0 obj << +/D [7562 0 R /XYZ 71.731 562.7248 null] +>> endobj +7586 0 obj << +/D [7562 0 R /XYZ 139.477 546.9489 null] +>> endobj +7587 0 obj << +/D [7562 0 R /XYZ 139.477 546.9489 null] +>> endobj +7588 0 obj << +/D [7562 0 R /XYZ 71.731 544.7921 null] +>> endobj +7589 0 obj << +/D [7562 0 R /XYZ 139.477 529.0162 null] +>> endobj +7590 0 obj << +/D [7562 0 R /XYZ 139.477 529.0162 null] +>> endobj +7591 0 obj << +/D [7562 0 R /XYZ 71.731 491.1581 null] +>> endobj +7592 0 obj << +/D [7562 0 R /XYZ 71.731 478.1072 null] +>> endobj +7593 0 obj << +/D [7562 0 R /XYZ 71.731 476.8618 null] +>> endobj +7594 0 obj << +/D [7562 0 R /XYZ 129.5143 457.7833 null] +>> endobj +903 0 obj << +/D [7562 0 R /XYZ 71.731 451.3624 null] +>> endobj +466 0 obj << +/D [7562 0 R /XYZ 240.303 407.5477 null] +>> endobj +7595 0 obj << +/D [7562 0 R /XYZ 71.731 384.0589 null] +>> endobj +7596 0 obj << +/D [7562 0 R /XYZ 161.0655 374.671 null] +>> endobj +7597 0 obj << +/D [7562 0 R /XYZ 71.731 362.5515 null] +>> endobj +7598 0 obj << +/D [7562 0 R /XYZ 71.731 331.1856 null] +>> endobj +7599 0 obj << +/D [7562 0 R /XYZ 168.8063 320.1753 null] +>> endobj +7600 0 obj << +/D [7562 0 R /XYZ 71.731 293.1119 null] +>> endobj +7601 0 obj << +/D [7562 0 R /XYZ 71.731 261.746 null] +>> endobj +7602 0 obj << +/D [7562 0 R /XYZ 71.731 245.1084 null] +>> endobj +7603 0 obj << +/D [7562 0 R /XYZ 71.731 214.1724 null] +>> endobj +7604 0 obj << +/D [7562 0 R /XYZ 181.5683 202.5165 null] +>> endobj +7605 0 obj << +/D [7562 0 R /XYZ 71.731 192.4544 null] +>> endobj +7606 0 obj << +/D [7562 0 R /XYZ 71.731 159.0312 null] +>> endobj +7607 0 obj << +/D [7562 0 R /XYZ 71.731 147.9214 null] +>> endobj +7608 0 obj << +/D [7562 0 R /XYZ 71.731 146.676 null] +>> endobj +7609 0 obj << +/D [7562 0 R /XYZ 129.5143 127.5975 null] +>> endobj +7610 0 obj << +/D [7562 0 R /XYZ 129.5143 127.5975 null] +>> endobj +7611 0 obj << +/D [7562 0 R /XYZ 71.731 126.158 null] +>> endobj +7612 0 obj << +/D [7562 0 R /XYZ 71.731 126.158 null] +>> endobj +7613 0 obj << +/D [7562 0 R /XYZ 139.477 109.6647 null] +>> endobj +7614 0 obj << +/D [7562 0 R /XYZ 139.477 109.6647 null] +>> endobj +7561 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7618 0 obj << +/Length 1329 +/Filter /FlateDecode +>> +stream +xڝ˜]£6†ïçWp™H×›¹›íÇv«Víf¯:Uäg‚Détþý°Á!F«Ñ/>¯Ÿc°QÕ +Œ¨ŽŽ(缪[Ÿ–l´fc‹>n~úÀ q„£`{ HÊ€ 8E<Ø&ÿ¬~>‰²‘Õzƒ)\aП3‘ËæO±ï>=îOþ’Í©Hêõ¿Û?~Ýñ)a æ*ȬÉqÂUü8UŀRĂMC"¥7Áq â0ˆÚÎ ºAÖöæc:u‡0$D8°4q§ÇчyêÖáWP£°ó¡ºL‘ê̕RVu‘ïÒdWT;yiÖºêº0ŽG‚ÕxÀî‘Çqš7ýI¡Ç¤nª4½í” Ë0w#T[6ÂDmÖ\uÂÈîÂT¹q;ãއižrú‰ «»ìچ"ò¡Gñ­6‰š&2oÒ±ºr  ièCcÉæЙ#î44¶>74ç*=‹ê½ÿ!7]Òuç"I*YßTíXAª0#Ǿz´dsõhdþztÄ]RSwêÑö¡ëñ˜Ê¬Ÿ¾&tÛ|Ü\—¢¢{94÷Ó BÀBæ­êÇ»+"Â#)öíPز™Ñ ó®ˆ\q¬ˆ\>¬W”þ+ãªZçazԌ/‡ƒ¢w¼˜QQþÔx!ڍáFã„t@1¡Q×ÁvïˆñÕ·2üš6®™)d€cØ¢SßÉ,꧱çªhŠæ½”ÃcÒèg7µ¢ë+Õ +ÑYn J\š“îP­n譗¬xMóÝ^ÔÒ¾×í¨…`W„·&7&¦mòYª´lÒ"Ÿ³I"@#lÛÔï-1Æכlç™NÞæ4t¤7¦µ¥<ô{“YäÒ5¼»V‹JÚwÝa‘éª(T”Êfx0“G=©™¬¸N2]AÕ/(Gýh?ÖO„6T ]郏}­Ç¢v5xQC9ËîÕÓ7u¼Á#’sšOCځÎâÿ]¥*m?\]×O•¹#òÄtI}›D4ê«a̓¡Ç(R_v,²' O½èÇvæ—¬©-ðo©nzI®=eYÑz3ÿE} +ÕK«£Ã¥½”ét®Ñ[Å!WëÔ(žÝM¶4·›ÉjPÍ(CKmh„ÉݽaGÄï ¶( endstream +endobj +7617 0 obj << +/Type /Page +/Contents 7618 0 R +/Resources 7616 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7615 0 R +>> endobj +7619 0 obj << +/D [7617 0 R /XYZ 71.731 729.2652 null] +>> endobj +7620 0 obj << +/D [7617 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7621 0 obj << +/D [7617 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7622 0 obj << +/D [7617 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7623 0 obj << +/D [7617 0 R /XYZ 71.731 688.2541 null] +>> endobj +7624 0 obj << +/D [7617 0 R /XYZ 71.731 688.2541 null] +>> endobj +7625 0 obj << +/D [7617 0 R /XYZ 139.477 672.4782 null] +>> endobj +7626 0 obj << +/D [7617 0 R /XYZ 71.731 671.0386 null] +>> endobj +7627 0 obj << +/D [7617 0 R /XYZ 139.477 654.5454 null] +>> endobj +7628 0 obj << +/D [7617 0 R /XYZ 76.7123 636.6127 null] +>> endobj +7629 0 obj << +/D [7617 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7630 0 obj << +/D [7617 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7631 0 obj << +/D [7617 0 R /XYZ 71.731 617.2992 null] +>> endobj +7632 0 obj << +/D [7617 0 R /XYZ 71.731 617.2992 null] +>> endobj +7633 0 obj << +/D [7617 0 R /XYZ 139.477 600.7472 null] +>> endobj +7634 0 obj << +/D [7617 0 R /XYZ 139.477 600.7472 null] +>> endobj +7635 0 obj << +/D [7617 0 R /XYZ 71.731 598.5904 null] +>> endobj +7636 0 obj << +/D [7617 0 R /XYZ 139.477 582.8144 null] +>> endobj +7637 0 obj << +/D [7617 0 R /XYZ 139.477 582.8144 null] +>> endobj +7638 0 obj << +/D [7617 0 R /XYZ 71.731 580.6576 null] +>> endobj +7639 0 obj << +/D [7617 0 R /XYZ 139.477 564.8817 null] +>> endobj +7640 0 obj << +/D [7617 0 R /XYZ 139.477 564.8817 null] +>> endobj +7641 0 obj << +/D [7617 0 R /XYZ 71.731 562.7248 null] +>> endobj +7642 0 obj << +/D [7617 0 R /XYZ 139.477 546.9489 null] +>> endobj +7643 0 obj << +/D [7617 0 R /XYZ 139.477 546.9489 null] +>> endobj +7644 0 obj << +/D [7617 0 R /XYZ 71.731 544.7921 null] +>> endobj +7645 0 obj << +/D [7617 0 R /XYZ 139.477 529.0162 null] +>> endobj +7646 0 obj << +/D [7617 0 R /XYZ 139.477 529.0162 null] +>> endobj +7647 0 obj << +/D [7617 0 R /XYZ 71.731 526.8593 null] +>> endobj +7648 0 obj << +/D [7617 0 R /XYZ 139.477 511.0834 null] +>> endobj +7649 0 obj << +/D [7617 0 R /XYZ 139.477 511.0834 null] +>> endobj +7650 0 obj << +/D [7617 0 R /XYZ 71.731 509.6439 null] +>> endobj +7651 0 obj << +/D [7617 0 R /XYZ 139.477 493.1507 null] +>> endobj +7652 0 obj << +/D [7617 0 R /XYZ 139.477 493.1507 null] +>> endobj +7653 0 obj << +/D [7617 0 R /XYZ 71.731 490.9938 null] +>> endobj +7654 0 obj << +/D [7617 0 R /XYZ 139.477 475.2179 null] +>> endobj +7655 0 obj << +/D [7617 0 R /XYZ 139.477 475.2179 null] +>> endobj +7656 0 obj << +/D [7617 0 R /XYZ 71.731 473.0611 null] +>> endobj +7657 0 obj << +/D [7617 0 R /XYZ 139.477 457.2852 null] +>> endobj +7658 0 obj << +/D [7617 0 R /XYZ 139.477 457.2852 null] +>> endobj +7659 0 obj << +/D [7617 0 R /XYZ 71.731 419.4271 null] +>> endobj +7660 0 obj << +/D [7617 0 R /XYZ 71.731 406.3762 null] +>> endobj +7661 0 obj << +/D [7617 0 R /XYZ 71.731 405.1308 null] +>> endobj +7662 0 obj << +/D [7617 0 R /XYZ 129.5143 386.0523 null] +>> endobj +904 0 obj << +/D [7617 0 R /XYZ 71.731 379.6314 null] +>> endobj +470 0 obj << +/D [7617 0 R /XYZ 214.2903 335.8167 null] +>> endobj +7663 0 obj << +/D [7617 0 R /XYZ 71.731 312.3279 null] +>> endobj +7664 0 obj << +/D [7617 0 R /XYZ 161.0655 302.9399 null] +>> endobj +7665 0 obj << +/D [7617 0 R /XYZ 71.731 290.8205 null] +>> endobj +7666 0 obj << +/D [7617 0 R /XYZ 71.731 259.4546 null] +>> endobj +7667 0 obj << +/D [7617 0 R /XYZ 168.8063 248.4443 null] +>> endobj +7668 0 obj << +/D [7617 0 R /XYZ 71.731 221.3809 null] +>> endobj +7669 0 obj << +/D [7617 0 R /XYZ 71.731 190.015 null] +>> endobj +7670 0 obj << +/D [7617 0 R /XYZ 71.731 161.7211 null] +>> endobj +7671 0 obj << +/D [7617 0 R /XYZ 71.731 130.7851 null] +>> endobj +7672 0 obj << +/D [7617 0 R /XYZ 181.5683 119.1293 null] +>> endobj +7673 0 obj << +/D [7617 0 R /XYZ 71.731 109.0671 null] +>> endobj +7616 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7676 0 obj << +/Length 1398 +/Filter /FlateDecode +>> +stream +xÚµ™Moã6†ïù>ÆÀš%)Q¤ö–v»ýÀ.ìfOMaÈ6“-C–Òì¿ïH"eŠ¢HµE‘ƒíøçÕ3Ã!)“†?²âñ^hŠhÂèj¼Á«gøê—¢$¥Ù˜¢n~øáUŠÒ„&«‡§U”&ˆñxÅ#Š#bõpøãö§—ì\Ëj½¡ ßRÔ¿ÞÙI֟²]ÿñîþ·þÍgY¿”‡Ëúχßo~~Ⳉ£T@¯ÉA5µISÃ&!)bŒðÇEqÄ;Ÿ÷kÂn³*;Jp{yo[.JD¡8rZTS¦-À8&# ƒ¬µðH)›Ä¥<êŒk¿^}諦>"±€"‰;Š‘8ûȚú¥õaq£1Âm„Vò¾Ï×¥®š}ýÎÊb{½<Õù>«óòd*›JNoP[H ”àÌ V«6¦ì +–´å9º!-› EŠiœ:ã΃ÕWM}ŒÁF)Š9Û¸.}…;è²%1L›o~zÖ|XýpÝûºì_›‹œ¯Þ(FP¡â½ª|µ«Táҝ]R¹–‰™Â5L\òZnóö¬¶EùœŸ¶»¬G1i ՙ1ëüT÷oÊʄ?_¯$AD¤Q¨^ ™¯^µ,\¯Ž¸KêÕáÃ@¢ëÕ´DTé}²ŠÒ¡-ÁGŒ)ôô94,ˆ²$4•M™Í ¢qÅ]€ÆåcŠfdc41¯t.E¾Woϕl)½ÍNE–@¥§$0 •g*jUp*:‚.˜Š¶ ÷T4MtSñ)—E¿˜[H‚Xq\kÉ|MÅ1Š™M7Sæ«)- ה#²}8—‡‘ì=f–]œ¦ž…ácSêßC%êÁÜ,)lÔ( ÎOCæc©ea–Ž¸KXÚ>Ü,MMU¸¿@IäØÃ\Q~ûòI-Oj/£fsö¬ÀÖ/™Z'ò²¯ò¼è/¤‘„Yô°çd)!ô†Ì‡^ËÂèq— ·}¸Ñ›6ä)Ûҵʼn1b˜[•¼+ËBf'Åÿ×LÑÜI©¶8ÆxN¢qŠ¡›x^EšJd9¸€¤åÀÉÑ0P”§ç¼n®ŽÀ0J±…ñP6@IQü ÷ù1S=á:Ò¨°—•kÌ)┇º®)óÖ²0bGÜ%mn̦vÓ3œc %¥‹Aë‘þ g#žÆ¡ŽlÊ|œµ,ÌÙw gۇ›³i㘽m»íÑÅ}ø¡BˆÉ†\aþœ½åÇæ¨V¶æ¸ÓÏ4d5°Õ Çèû1•¨m)ãSÓ¾’™/AQ‚DBB}۔ù¤eá9â.IíÝ ӆ÷ÈäLÐØ `IN!R€êU僪Ta¦Ó KZ&ÜD ªâ_eµxüÏJ~MÙíkûتðÖ>†|‡²dÈ|iÒ²pžq—$ÊöáΔi#¿lÏÐÖóýÌj+0÷íZî»k‹ïý§×\¶™ùkMLÖÞö‰á$ +µSæ!<Ȃ„]qžøpÙÈv»J¾æPf‡íÌAGÀ&2á¾s×ÒU}7Ðܙ¬Â†4NÛ'֐=ÓÞÃY7ÕÉól7"‰'3¹)óÊYðTàXîòav†r0}\; Q]A÷“fKèå©Ñ'ðÇ%¬Ëé†qÄEԝLX?EƆ빸ýv>@N¾¶½ÿ®†¤íÖß6µs_ő ¸I‘à‰zþ^•uY?Ë÷ÃגR×n(4M"úö:°»GÌpûú±&m3S·ÍêË׶¤²¢µŠ‡ßoúýНþÎí£XŸcXaYBMÇöqqˆn<õñ§mðoù¥nŸEÚëëð¨r´¨̛Eví©_tbIRï>†fú›£0É#‘ #µ7Jh<ûŽ#âßGtó¬endstream +endobj +7675 0 obj << +/Type /Page +/Contents 7676 0 R +/Resources 7674 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7615 0 R +>> endobj +7677 0 obj << +/D [7675 0 R /XYZ 71.731 729.2652 null] +>> endobj +7678 0 obj << +/D [7675 0 R /XYZ 71.731 718.3063 null] +>> endobj +7679 0 obj << +/D [7675 0 R /XYZ 71.731 708.2442 null] +>> endobj +7680 0 obj << +/D [7675 0 R /XYZ 71.731 706.9988 null] +>> endobj +7681 0 obj << +/D [7675 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7682 0 obj << +/D [7675 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7683 0 obj << +/D [7675 0 R /XYZ 71.731 686.4807 null] +>> endobj +7684 0 obj << +/D [7675 0 R /XYZ 71.731 686.4807 null] +>> endobj +7685 0 obj << +/D [7675 0 R /XYZ 139.477 669.9875 null] +>> endobj +7686 0 obj << +/D [7675 0 R /XYZ 139.477 669.9875 null] +>> endobj +7687 0 obj << +/D [7675 0 R /XYZ 76.7123 652.0548 null] +>> endobj +7688 0 obj << +/D [7675 0 R /XYZ 129.5143 634.122 null] +>> endobj +7689 0 obj << +/D [7675 0 R /XYZ 129.5143 634.122 null] +>> endobj +7690 0 obj << +/D [7675 0 R /XYZ 71.731 631.9652 null] +>> endobj +7691 0 obj << +/D [7675 0 R /XYZ 71.731 631.9652 null] +>> endobj +7692 0 obj << +/D [7675 0 R /XYZ 139.477 616.1893 null] +>> endobj +7693 0 obj << +/D [7675 0 R /XYZ 71.731 614.7497 null] +>> endobj +7694 0 obj << +/D [7675 0 R /XYZ 139.477 598.2565 null] +>> endobj +7695 0 obj << +/D [7675 0 R /XYZ 76.7123 580.3238 null] +>> endobj +7696 0 obj << +/D [7675 0 R /XYZ 129.5143 562.391 null] +>> endobj +7697 0 obj << +/D [7675 0 R /XYZ 129.5143 562.391 null] +>> endobj +7698 0 obj << +/D [7675 0 R /XYZ 71.731 561.212 null] +>> endobj +7699 0 obj << +/D [7675 0 R /XYZ 71.731 561.212 null] +>> endobj +7700 0 obj << +/D [7675 0 R /XYZ 139.477 544.4583 null] +>> endobj +7701 0 obj << +/D [7675 0 R /XYZ 139.477 544.4583 null] +>> endobj +7702 0 obj << +/D [7675 0 R /XYZ 71.731 542.3014 null] +>> endobj +7703 0 obj << +/D [7675 0 R /XYZ 139.477 526.5255 null] +>> endobj +7704 0 obj << +/D [7675 0 R /XYZ 139.477 526.5255 null] +>> endobj +7705 0 obj << +/D [7675 0 R /XYZ 71.731 524.3687 null] +>> endobj +7706 0 obj << +/D [7675 0 R /XYZ 139.477 508.5928 null] +>> endobj +7707 0 obj << +/D [7675 0 R /XYZ 139.477 508.5928 null] +>> endobj +7708 0 obj << +/D [7675 0 R /XYZ 71.731 507.1532 null] +>> endobj +7709 0 obj << +/D [7675 0 R /XYZ 139.477 490.66 null] +>> endobj +7710 0 obj << +/D [7675 0 R /XYZ 139.477 490.66 null] +>> endobj +7711 0 obj << +/D [7675 0 R /XYZ 71.731 488.5032 null] +>> endobj +7712 0 obj << +/D [7675 0 R /XYZ 139.477 472.7273 null] +>> endobj +7713 0 obj << +/D [7675 0 R /XYZ 139.477 472.7273 null] +>> endobj +7714 0 obj << +/D [7675 0 R /XYZ 71.731 471.2877 null] +>> endobj +7715 0 obj << +/D [7675 0 R /XYZ 139.477 454.7945 null] +>> endobj +7716 0 obj << +/D [7675 0 R /XYZ 139.477 454.7945 null] +>> endobj +7717 0 obj << +/D [7675 0 R /XYZ 71.731 453.355 null] +>> endobj +7718 0 obj << +/D [7675 0 R /XYZ 139.477 436.8618 null] +>> endobj +7719 0 obj << +/D [7675 0 R /XYZ 139.477 436.8618 null] +>> endobj +7720 0 obj << +/D [7675 0 R /XYZ 71.731 434.7049 null] +>> endobj +7721 0 obj << +/D [7675 0 R /XYZ 139.477 418.929 null] +>> endobj +7722 0 obj << +/D [7675 0 R /XYZ 139.477 418.929 null] +>> endobj +7723 0 obj << +/D [7675 0 R /XYZ 71.731 417.4895 null] +>> endobj +7724 0 obj << +/D [7675 0 R /XYZ 139.477 400.9962 null] +>> endobj +7725 0 obj << +/D [7675 0 R /XYZ 139.477 400.9962 null] +>> endobj +7726 0 obj << +/D [7675 0 R /XYZ 71.731 398.8394 null] +>> endobj +7727 0 obj << +/D [7675 0 R /XYZ 139.477 383.0635 null] +>> endobj +7728 0 obj << +/D [7675 0 R /XYZ 139.477 383.0635 null] +>> endobj +7729 0 obj << +/D [7675 0 R /XYZ 71.731 345.2055 null] +>> endobj +7730 0 obj << +/D [7675 0 R /XYZ 71.731 332.1545 null] +>> endobj +7731 0 obj << +/D [7675 0 R /XYZ 71.731 330.9092 null] +>> endobj +7732 0 obj << +/D [7675 0 R /XYZ 129.5143 311.8306 null] +>> endobj +905 0 obj << +/D [7675 0 R /XYZ 71.731 305.4098 null] +>> endobj +474 0 obj << +/D [7675 0 R /XYZ 294.2895 261.595 null] +>> endobj +7733 0 obj << +/D [7675 0 R /XYZ 71.731 238.1062 null] +>> endobj +7734 0 obj << +/D [7675 0 R /XYZ 161.0655 228.7183 null] +>> endobj +7735 0 obj << +/D [7675 0 R /XYZ 71.731 216.5988 null] +>> endobj +7736 0 obj << +/D [7675 0 R /XYZ 71.731 185.2329 null] +>> endobj +7737 0 obj << +/D [7675 0 R /XYZ 168.8063 174.2226 null] +>> endobj +7738 0 obj << +/D [7675 0 R /XYZ 71.731 147.1592 null] +>> endobj +7674 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7741 0 obj << +/Length 1024 +/Filter /FlateDecode +>> +stream +xÚÝXMÛ6½ï¯ÐÑV,?DRÊÍi“"E ,RçÔ- ­­Ȓ!Q»Í¿ïPõaђìA´ý†óæqf8+âaø#ž$H2xÐQÁ©·?Ýaï3üôûi!~‹ñ‡ ·Û»_Þ3ìE(TxÛgEqx’QrzÛÃ?«_ñY%åÚ§¯(2χ,Îõgüd>n>˜Å_‰:‡jýïö»wÛÎ?gE!8™%Ù¡¦4iä…@Sš&_9 ˜'qˆXÀdÃóS•”•aqŠ¿˜E‘gíª>b•˜u¬T™>­)|«’Ö¤x6Ï*K÷Ýwe÷ݚòÕ˚ðUçüÓýÑ,Õ1ѐÖc\¶îNÉé ̬r¾‰$ +"ù„ Ákþjʱêx¦—Âæ÷cÛols8¥ùep·êçMD)Gèãð֜¯PH0)ØÇDÕ¥¥DÌ#µªÕ{P­z®³6üç5u¦,3º|M«¤ÙºIÁ¾RüvéëJ‘Âdà&Ë +Më59˜->YR½éÌû ¶Öb"aÔXÇZ¾–Ë9m5$õ­î´qŸ(WãvXƒ„@Õp"=.0①5Ø¡ü!ÌÖ Ô§Ä¤©ÁÉnšÂ#¥|â—R(RB~/Ÿ=k5åÁBW/ñˆkutÈF„µ yÓ¦*뽺¿hcÚ>ÉUºUZäCd ¹? ÐR(‚»uµ €êe%º;ÂiQWU…“Ç4ˆ\N¯‹j&$ƚ²RŽ8l@Óܺr¨¹îKeÓü³UÖ!èÉlgLÑåûõ¼ÅÉ(âKy;€Í孅-ç­Ãï-y{ÉãJÞy4ogú$ôÈ]êR;ŠÅXì4·9üwß;Gý¶Åô)> endobj +7742 0 obj << +/D [7740 0 R /XYZ 71.731 729.2652 null] +>> endobj +7743 0 obj << +/D [7740 0 R /XYZ 71.731 718.3063 null] +>> endobj +7744 0 obj << +/D [7740 0 R /XYZ 71.731 679.9602 null] +>> endobj +7745 0 obj << +/D [7740 0 R /XYZ 71.731 647.1727 null] +>> endobj +7746 0 obj << +/D [7740 0 R /XYZ 181.5683 635.5168 null] +>> endobj +7747 0 obj << +/D [7740 0 R /XYZ 71.731 625.4546 null] +>> endobj +7748 0 obj << +/D [7740 0 R /XYZ 71.731 592.0315 null] +>> endobj +7749 0 obj << +/D [7740 0 R /XYZ 71.731 580.9216 null] +>> endobj +7750 0 obj << +/D [7740 0 R /XYZ 71.731 579.6763 null] +>> endobj +7751 0 obj << +/D [7740 0 R /XYZ 129.5143 560.5978 null] +>> endobj +7752 0 obj << +/D [7740 0 R /XYZ 129.5143 560.5978 null] +>> endobj +7753 0 obj << +/D [7740 0 R /XYZ 71.731 559.1582 null] +>> endobj +7754 0 obj << +/D [7740 0 R /XYZ 71.731 559.1582 null] +>> endobj +7755 0 obj << +/D [7740 0 R /XYZ 139.477 542.665 null] +>> endobj +7756 0 obj << +/D [7740 0 R /XYZ 139.477 542.665 null] +>> endobj +7757 0 obj << +/D [7740 0 R /XYZ 76.7123 524.7323 null] +>> endobj +7758 0 obj << +/D [7740 0 R /XYZ 129.5143 506.7995 null] +>> endobj +7759 0 obj << +/D [7740 0 R /XYZ 129.5143 506.7995 null] +>> endobj +7760 0 obj << +/D [7740 0 R /XYZ 71.731 505.36 null] +>> endobj +7761 0 obj << +/D [7740 0 R /XYZ 129.5143 488.8667 null] +>> endobj +7762 0 obj << +/D [7740 0 R /XYZ 129.5143 488.8667 null] +>> endobj +7763 0 obj << +/D [7740 0 R /XYZ 71.731 466.7846 null] +>> endobj +7764 0 obj << +/D [7740 0 R /XYZ 71.731 455.8905 null] +>> endobj +7765 0 obj << +/D [7740 0 R /XYZ 71.731 454.6452 null] +>> endobj +7766 0 obj << +/D [7740 0 R /XYZ 129.5143 435.5666 null] +>> endobj +906 0 obj << +/D [7740 0 R /XYZ 71.731 429.1458 null] +>> endobj +478 0 obj << +/D [7740 0 R /XYZ 333.4372 385.331 null] +>> endobj +7767 0 obj << +/D [7740 0 R /XYZ 71.731 361.8422 null] +>> endobj +7768 0 obj << +/D [7740 0 R /XYZ 161.0655 352.4543 null] +>> endobj +7769 0 obj << +/D [7740 0 R /XYZ 71.731 340.3348 null] +>> endobj +7770 0 obj << +/D [7740 0 R /XYZ 71.731 308.9689 null] +>> endobj +7771 0 obj << +/D [7740 0 R /XYZ 168.8063 297.9586 null] +>> endobj +7772 0 obj << +/D [7740 0 R /XYZ 71.731 270.8952 null] +>> endobj +7773 0 obj << +/D [7740 0 R /XYZ 71.731 254.4733 null] +>> endobj +7774 0 obj << +/D [7740 0 R /XYZ 71.731 223.5373 null] +>> endobj +7775 0 obj << +/D [7740 0 R /XYZ 181.5683 211.8814 null] +>> endobj +7776 0 obj << +/D [7740 0 R /XYZ 71.731 201.8193 null] +>> endobj +7777 0 obj << +/D [7740 0 R /XYZ 71.731 170.2476 null] +>> endobj +7778 0 obj << +/D [7740 0 R /XYZ 71.731 157.2863 null] +>> endobj +7779 0 obj << +/D [7740 0 R /XYZ 71.731 156.0409 null] +>> endobj +7780 0 obj << +/D [7740 0 R /XYZ 129.5143 136.9624 null] +>> endobj +7781 0 obj << +/D [7740 0 R /XYZ 129.5143 136.9624 null] +>> endobj +7782 0 obj << +/D [7740 0 R /XYZ 71.731 135.5228 null] +>> endobj +7783 0 obj << +/D [7740 0 R /XYZ 71.731 135.5228 null] +>> endobj +7784 0 obj << +/D [7740 0 R /XYZ 139.477 119.0296 null] +>> endobj +7785 0 obj << +/D [7740 0 R /XYZ 139.477 119.0296 null] +>> endobj +7786 0 obj << +/D [7740 0 R /XYZ 76.7123 101.0969 null] +>> endobj +7739 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7789 0 obj << +/Length 1272 +/Filter /FlateDecode +>> +stream +xÚ­X[£6~Ÿ_Ác"M\Û`æmzÕV]u´}êT“ *—ˆKg÷ßï_0Ä*ò>û|ç; †ñA‡/!Êõùö¾À­ßìfgƒ~|¾ûáW{Š8åÞóÉó#Ž˜<áS2zÏÇ¿7?ãK“TÛexC‘ü~Êâ"iþˆ_åÏǧòâcҜËc½ýçù÷»_ž}æ …`d–d@Bø8òv£ˆæD!ƈgpˆüÀÆy`G`Ò9cpÖyóB)›²#”€PÏÞP۝~<ôªk~è… *zà2#?æ7M•¾¶M²o¾]’}zܗվˆó¤#×{2„…øÔãìvK¤ÔiÑȋRŦ†‹/×Î)ó<Â(  ®STÚÙ°ATÒeíŒÝrÓ rÚ½-ª^åäaK¡@ˆ1 Pä^JñW–y)…ÞR¼±å_âJÃcR4é Æü¦p‚‚­. gÁæ„Ó°eáv×çàáΦ!3çj§“uÄ]ׇ”å„Š… +¶a3l`‹ì²»¢‚¯x¸+xÄcRÁ§4Édã›*N +8ÆÕ ’·‡ævÎA+ä"Z,V 6—s¶œs»krnÊc¬ŸÎ9›FžûªÌºÖçw;‹ëŽ§rôcZ¤y›Ë/˜á,‰kÕ/喲Í[RÚ nùogJeð9VÈC\¨`$“Vz8ÇŃOkW9Ü ÆHb±]X°¹ÐiØrèvׄnÊÃ:›ÆcŠãè:Ïß©µhEXà ‚}m،¾¶¨¯Ëî +}¯x8õÑ8&õ¡J/MZ®Ò ˆóP¼ƒÌ;Þ.$ˆEpÆ(đ$ó)iÚª¨n¶zF`UHøB«·a3­ÞÀ[½ËîŠVïâa5k“6¡ñ¨n’ž”ìíáÔ5t(à'L®}pwL ú~/(õ™<7("ÄïÆhn>_Žq“Èx]G:(¤´ëÆqÁåò§ªlÊ.†fŐNjíŽBŽP6Zۆé—qۜ•KuwÇ@G÷£œk}#½f¸Óm†?i5ÇÎRÆ©Í±Ö W½Äðgu£Tªë¶l Û|Më¦{Òòò-mΓýþë†8kµ¡´p¹ŠúZÀ@Ðʀϵa‘Çߝ"SWmOßÚlBøíœ,2ÀZ-Œ+µ*OòW° Ÿ®>LmÙÀýamÂ8iÛ×ÜLõCB +:ߏO;½¡ò2Ÿ3îËÉð¼y<ÂY¿Ú¡Þâ$¬çò§ÑÛèGu±d#¿î‹:²zdm怢TR½*|•‰œ#ŽCÕ¼Ú›¤3ÒË|¼¤•ÞØ$°.Ÿ©¼yY S‰ÊÆP©œ$ÿš> endobj +7790 0 obj << +/D [7788 0 R /XYZ 71.731 729.2652 null] +>> endobj +7791 0 obj << +/D [7788 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7792 0 obj << +/D [7788 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7793 0 obj << +/D [7788 0 R /XYZ 71.731 706.1869 null] +>> endobj +7794 0 obj << +/D [7788 0 R /XYZ 71.731 706.1869 null] +>> endobj +7795 0 obj << +/D [7788 0 R /XYZ 139.477 690.4109 null] +>> endobj +7796 0 obj << +/D [7788 0 R /XYZ 71.731 688.2541 null] +>> endobj +7797 0 obj << +/D [7788 0 R /XYZ 139.477 672.4782 null] +>> endobj +7798 0 obj << +/D [7788 0 R /XYZ 76.7123 654.5454 null] +>> endobj +7799 0 obj << +/D [7788 0 R /XYZ 129.5143 636.6127 null] +>> endobj +7800 0 obj << +/D [7788 0 R /XYZ 129.5143 636.6127 null] +>> endobj +7801 0 obj << +/D [7788 0 R /XYZ 71.731 635.2319 null] +>> endobj +7802 0 obj << +/D [7788 0 R /XYZ 71.731 635.2319 null] +>> endobj +7803 0 obj << +/D [7788 0 R /XYZ 139.477 618.6799 null] +>> endobj +7804 0 obj << +/D [7788 0 R /XYZ 139.477 618.6799 null] +>> endobj +7805 0 obj << +/D [7788 0 R /XYZ 71.731 616.5231 null] +>> endobj +7806 0 obj << +/D [7788 0 R /XYZ 139.477 600.7472 null] +>> endobj +7807 0 obj << +/D [7788 0 R /XYZ 139.477 600.7472 null] +>> endobj +7808 0 obj << +/D [7788 0 R /XYZ 71.731 598.5904 null] +>> endobj +7809 0 obj << +/D [7788 0 R /XYZ 139.477 582.8144 null] +>> endobj +7810 0 obj << +/D [7788 0 R /XYZ 139.477 582.8144 null] +>> endobj +7811 0 obj << +/D [7788 0 R /XYZ 71.731 544.9564 null] +>> endobj +7812 0 obj << +/D [7788 0 R /XYZ 71.731 531.9054 null] +>> endobj +7813 0 obj << +/D [7788 0 R /XYZ 71.731 530.6601 null] +>> endobj +7814 0 obj << +/D [7788 0 R /XYZ 129.5143 511.5816 null] +>> endobj +907 0 obj << +/D [7788 0 R /XYZ 71.731 505.1607 null] +>> endobj +482 0 obj << +/D [7788 0 R /XYZ 222.915 461.3459 null] +>> endobj +7815 0 obj << +/D [7788 0 R /XYZ 71.731 437.8572 null] +>> endobj +7816 0 obj << +/D [7788 0 R /XYZ 161.0655 428.4692 null] +>> endobj +7817 0 obj << +/D [7788 0 R /XYZ 71.731 416.3497 null] +>> endobj +7818 0 obj << +/D [7788 0 R /XYZ 71.731 384.9839 null] +>> endobj +7819 0 obj << +/D [7788 0 R /XYZ 168.8063 373.9736 null] +>> endobj +7820 0 obj << +/D [7788 0 R /XYZ 71.731 346.9101 null] +>> endobj +7821 0 obj << +/D [7788 0 R /XYZ 71.731 315.5443 null] +>> endobj +7822 0 obj << +/D [7788 0 R /XYZ 71.731 272.3064 null] +>> endobj +7823 0 obj << +/D [7788 0 R /XYZ 71.731 245.8641 null] +>> endobj +7824 0 obj << +/D [7788 0 R /XYZ 71.731 213.0765 null] +>> endobj +7825 0 obj << +/D [7788 0 R /XYZ 181.5683 201.4207 null] +>> endobj +7826 0 obj << +/D [7788 0 R /XYZ 71.731 191.3585 null] +>> endobj +7827 0 obj << +/D [7788 0 R /XYZ 71.731 157.9353 null] +>> endobj +7828 0 obj << +/D [7788 0 R /XYZ 71.731 146.8255 null] +>> endobj +7829 0 obj << +/D [7788 0 R /XYZ 71.731 145.5802 null] +>> endobj +7830 0 obj << +/D [7788 0 R /XYZ 129.5143 126.5016 null] +>> endobj +7831 0 obj << +/D [7788 0 R /XYZ 129.5143 126.5016 null] +>> endobj +7832 0 obj << +/D [7788 0 R /XYZ 71.731 125.0621 null] +>> endobj +7833 0 obj << +/D [7788 0 R /XYZ 71.731 125.0621 null] +>> endobj +7834 0 obj << +/D [7788 0 R /XYZ 139.477 108.5689 null] +>> endobj +7835 0 obj << +/D [7788 0 R /XYZ 139.477 108.5689 null] +>> endobj +7787 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7838 0 obj << +/Length 1432 +/Filter /FlateDecode +>> +stream +xڕXßo¤6~Ï_Á[w¥¬‹ &o×^[]uWEiîT©©"Þ]+,l1Ü&ÿ} جó£ÊÃ{¾ùæ›ñt\ù‚À“?(È'ȉO7®s~»Êd§lv¦ÑO7?þê¹NBùÎãÞñB;‡%:ÉߛŸÑ¹dÅv‡ˆ»A ý½O£Œ•Ÿ£—öß÷ŸÚ‹/¬<æ‰ØþóøûÍ/â ¤ÒÉ,H )Àž:;JÿسZAB`àìüÐJ{ +é'paLgיÕÑnpȐ ”Áôpˆ”Çì™'ÏyñœE'Vcj¸fƒR@ü€Joõ‚»–`ž•íE®2"ʂg‡qHÚi€¨ðÎjgš]©„µfz!h³I*¥r\„C«ßi*õ*+Ž+#Ð åÓ C2rÛRñgÍ©¢)aYɟ\IåNrC0 ˜à%n ³9n´Ù27¿k¸±à°pcÂhÅ1¦G+®¯«Y†~†KÕg˜ÍUŸ6[®>‹ß5Õ7Ä1Q}&Ž¶úöœ¥m¯péÀŔô+OrYÅ崘\8X,4ÃlNLÚlYL¿kÄ4ÄÑgM‹É„Q©…«šVυ#®®ºûúð¹½ØWEyÔ'IÂD\ð—ºw5ÿ—G.ÔâF§S<*Ï&ˆ—ŠÖ4›á¹3[äÙæwÏ#Vž{0NÑÛs–K~,l„ò Šé/Ñ?U'UãÕéE“ïÕ½f[Åw¤N’8ÊڋÕ"!ø!c‰2Ìÿg‚| (••¿ Ãl.AÚl9A¿k4ÄaO ƒg¢Œäñ•<Ï,IªO'D½™’0OªÞfÊ4*gøÅ>1 —ø5ÌæøÕfËüZü®áwˆÃί ƒ½ya•?vÄ!žÒÿǚ·V™V/?©[—#ËLý6—l ɦuw«wSF,γD+žgzÅ×?>ý¥Öžóø8&yáBé<0ÍæҤ͖Ódñ»&MCö4™0Ú~ž(ߧÁº"låì(Dæy'ûuCÒìñÀʪÈÄÝäà‚Iê-½6˜f3ƒKg¶8¸Øü®\l8ŒsU§¾‡ãªu¨äª:»¨â˜ ±¯ô-ñAÒäo§÷¨ Eñ›Í€×/tÝ|Û֊.øþý~ëÕWuakfq(r%‘õ[bà·=ñ¾È˼|?³»nÅU>jíIM@Uä߶Bå‘B÷¾'—¸QUU”çæ‘zOb§ˆ§êÁ÷Ÿ\]øqÓ;Ÿ_·PôûÖ'›iC£è¥;h q§›!~¼Št.HO¾Cûh¤êKêf[D6—kȧJ”ýC8á"zIYÒ lîT‚?l‰L‹ê?»šµo’ÈhÄ ùM¤.Ë®‰4ÅåJŒ²¼(lUði¿ŠÑVmBÏ +­8³¸}ÍJnõ˜ Û¬-Ö5N.h<êE+à´Äç#Ãmÿ,éíóâԟÈI)Ï^ûÛ©¦>±œ£³æ¯CÞ3Uó*MúÔk)–“¿¼ëÁ0M-óù¾Êâë°¶déH¯©©…±ï–/׫J„–£^/HMËe|ÔCí¥j‘ÐIëŽ}C-£Ì ‹K©c,êl\|c…¦?ÓXÕa:Ò_ΚÆ×±WÏyQv-Þ"_›Ü„.û+&ʎû¨ï©ÈSVw•[=í¿IfcTݗ¦Ôµ!éØXVwªÁ]yiì¾|O |ó$·dÝcÅLȕw Lö™(å XÛÑ?¤iÞ4'-‹IX{‚Eɉgá@}hÅT¾Ïùáì·XÃfü)–È1A¢Ô6µ?ˆ‚Éïªÿv3yendstream +endobj +7837 0 obj << +/Type /Page +/Contents 7838 0 R +/Resources 7836 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7615 0 R +>> endobj +7839 0 obj << +/D [7837 0 R /XYZ 71.731 729.2652 null] +>> endobj +7840 0 obj << +/D [7837 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7841 0 obj << +/D [7837 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7842 0 obj << +/D [7837 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7843 0 obj << +/D [7837 0 R /XYZ 71.731 688.2541 null] +>> endobj +7844 0 obj << +/D [7837 0 R /XYZ 71.731 688.2541 null] +>> endobj +7845 0 obj << +/D [7837 0 R /XYZ 139.477 672.4782 null] +>> endobj +7846 0 obj << +/D [7837 0 R /XYZ 71.731 671.0386 null] +>> endobj +7847 0 obj << +/D [7837 0 R /XYZ 139.477 654.5454 null] +>> endobj +7848 0 obj << +/D [7837 0 R /XYZ 76.7123 636.6127 null] +>> endobj +7849 0 obj << +/D [7837 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7850 0 obj << +/D [7837 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7851 0 obj << +/D [7837 0 R /XYZ 71.731 617.5009 null] +>> endobj +7852 0 obj << +/D [7837 0 R /XYZ 71.731 617.5009 null] +>> endobj +7853 0 obj << +/D [7837 0 R /XYZ 139.477 600.7472 null] +>> endobj +7854 0 obj << +/D [7837 0 R /XYZ 139.477 600.7472 null] +>> endobj +7855 0 obj << +/D [7837 0 R /XYZ 71.731 598.5904 null] +>> endobj +7856 0 obj << +/D [7837 0 R /XYZ 139.477 582.8144 null] +>> endobj +7857 0 obj << +/D [7837 0 R /XYZ 139.477 582.8144 null] +>> endobj +7858 0 obj << +/D [7837 0 R /XYZ 71.731 580.6576 null] +>> endobj +7859 0 obj << +/D [7837 0 R /XYZ 139.477 564.8817 null] +>> endobj +7860 0 obj << +/D [7837 0 R /XYZ 139.477 564.8817 null] +>> endobj +7861 0 obj << +/D [7837 0 R /XYZ 71.731 562.7248 null] +>> endobj +7862 0 obj << +/D [7837 0 R /XYZ 139.477 546.9489 null] +>> endobj +7863 0 obj << +/D [7837 0 R /XYZ 139.477 546.9489 null] +>> endobj +7864 0 obj << +/D [7837 0 R /XYZ 71.731 544.7921 null] +>> endobj +7865 0 obj << +/D [7837 0 R /XYZ 139.477 529.0162 null] +>> endobj +7866 0 obj << +/D [7837 0 R /XYZ 139.477 529.0162 null] +>> endobj +7867 0 obj << +/D [7837 0 R /XYZ 71.731 491.1581 null] +>> endobj +7868 0 obj << +/D [7837 0 R /XYZ 71.731 478.1072 null] +>> endobj +7869 0 obj << +/D [7837 0 R /XYZ 71.731 476.8618 null] +>> endobj +7870 0 obj << +/D [7837 0 R /XYZ 129.5143 457.7833 null] +>> endobj +908 0 obj << +/D [7837 0 R /XYZ 71.731 451.3624 null] +>> endobj +486 0 obj << +/D [7837 0 R /XYZ 228.9404 407.5477 null] +>> endobj +7871 0 obj << +/D [7837 0 R /XYZ 71.731 384.0589 null] +>> endobj +7872 0 obj << +/D [7837 0 R /XYZ 161.0655 374.671 null] +>> endobj +7873 0 obj << +/D [7837 0 R /XYZ 71.731 362.5515 null] +>> endobj +7874 0 obj << +/D [7837 0 R /XYZ 71.731 331.1856 null] +>> endobj +7875 0 obj << +/D [7837 0 R /XYZ 168.8063 320.1753 null] +>> endobj +7876 0 obj << +/D [7837 0 R /XYZ 71.731 293.1119 null] +>> endobj +7877 0 obj << +/D [7837 0 R /XYZ 71.731 261.746 null] +>> endobj +7878 0 obj << +/D [7837 0 R /XYZ 71.731 218.5082 null] +>> endobj +7879 0 obj << +/D [7837 0 R /XYZ 71.731 178.558 null] +>> endobj +7880 0 obj << +/D [7837 0 R /XYZ 71.731 146.9764 null] +>> endobj +7881 0 obj << +/D [7837 0 R /XYZ 181.5683 135.9661 null] +>> endobj +7882 0 obj << +/D [7837 0 R /XYZ 71.731 125.9039 null] +>> endobj +7836 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7885 0 obj << +/Length 1044 +/Filter /FlateDecode +>> +stream +xڕX]£6}Ÿ_Ác"ÛÛó6Ým«V³U4J¥JÕˆ&ž Ú"`vš¿×Á&ÌÇ*ŠøÈ1÷p|ÎÅ|pÀ1â6D"’0ìNwQð~úýHh0¡ úe{÷óo4 +$’ I‚ík@e‚N  ‹`»ÿwõᐞkU®C¢AÍvsLsU?¦ÿ5‡›?šOª>ûjýyûçݯ۶>£IE&I¶¨!M"šKÄ揢1åWž›5f«´LO +ØV÷} +í D@Q/…º0KÎðw(´0Má™6¨KpÄÄ[·¿½ñ°£†<¨H‘ÄW Ã1íòHßêƒæÑӍÄ(Ò4侙¯ª.ßvõO½YÔãU^g»´ÎŠÜE¾•jxƒ–B¥g~a-*ta7a±¶gç†,lTX0iDbé­;.¬5äÑ–JsÞ¥ñº4÷¨Ë”Äž¾¾YþÅêë‘õÔ\îº_Íö­Rãî¥1s̙÷†šò®AÍ[wXt‰s{$FŒë8Cp‹ü%Û¿å‹:¥ÙÑ£³”ˆ’¾ÎY^7;Eé +?îUœ ,$óª›òª…Í{ÕSw‰W=<œ~h½êÒEŒíþ®l÷ÎöÚ~ÏQDà̘4L +DX2c6!M ›•ÆWw4>Ci:4:¡Ü”Ù)-/́ +¯¦kšà~_ªªM"KÀèÏ$ÑAM$Ñ¢f“è)º ‰}þ$º$¾©2{5ê嫺xr( ‡pññv÷¤*eRyN«ê}u> endobj +7886 0 obj << +/D [7884 0 R /XYZ 71.731 729.2652 null] +>> endobj +7887 0 obj << +/D [7884 0 R /XYZ 71.731 741.2204 null] +>> endobj +7888 0 obj << +/D [7884 0 R /XYZ 71.731 718.3063 null] +>> endobj +7889 0 obj << +/D [7884 0 R /XYZ 71.731 708.2442 null] +>> endobj +7890 0 obj << +/D [7884 0 R /XYZ 71.731 706.9988 null] +>> endobj +7891 0 obj << +/D [7884 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7892 0 obj << +/D [7884 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7893 0 obj << +/D [7884 0 R /XYZ 71.731 686.4807 null] +>> endobj +7894 0 obj << +/D [7884 0 R /XYZ 71.731 686.4807 null] +>> endobj +7895 0 obj << +/D [7884 0 R /XYZ 139.477 669.9875 null] +>> endobj +7896 0 obj << +/D [7884 0 R /XYZ 139.477 669.9875 null] +>> endobj +7897 0 obj << +/D [7884 0 R /XYZ 76.7123 652.0548 null] +>> endobj +7898 0 obj << +/D [7884 0 R /XYZ 129.5143 634.122 null] +>> endobj +7899 0 obj << +/D [7884 0 R /XYZ 129.5143 634.122 null] +>> endobj +7900 0 obj << +/D [7884 0 R /XYZ 71.731 631.9652 null] +>> endobj +7901 0 obj << +/D [7884 0 R /XYZ 71.731 631.9652 null] +>> endobj +7902 0 obj << +/D [7884 0 R /XYZ 139.477 616.1893 null] +>> endobj +7903 0 obj << +/D [7884 0 R /XYZ 71.731 614.7497 null] +>> endobj +7904 0 obj << +/D [7884 0 R /XYZ 139.477 598.2565 null] +>> endobj +7905 0 obj << +/D [7884 0 R /XYZ 76.7123 580.3238 null] +>> endobj +7906 0 obj << +/D [7884 0 R /XYZ 129.5143 562.391 null] +>> endobj +7907 0 obj << +/D [7884 0 R /XYZ 129.5143 562.391 null] +>> endobj +7908 0 obj << +/D [7884 0 R /XYZ 71.731 560.2342 null] +>> endobj +7909 0 obj << +/D [7884 0 R /XYZ 129.5143 544.4583 null] +>> endobj +7910 0 obj << +/D [7884 0 R /XYZ 129.5143 544.4583 null] +>> endobj +7911 0 obj << +/D [7884 0 R /XYZ 71.731 522.3762 null] +>> endobj +7912 0 obj << +/D [7884 0 R /XYZ 71.731 511.482 null] +>> endobj +7913 0 obj << +/D [7884 0 R /XYZ 71.731 510.2367 null] +>> endobj +7914 0 obj << +/D [7884 0 R /XYZ 129.5143 491.1581 null] +>> endobj +909 0 obj << +/D [7884 0 R /XYZ 71.731 484.02 null] +>> endobj +490 0 obj << +/D [7884 0 R /XYZ 284.1324 440.9225 null] +>> endobj +7915 0 obj << +/D [7884 0 R /XYZ 71.731 417.4337 null] +>> endobj +7916 0 obj << +/D [7884 0 R /XYZ 161.0655 408.0458 null] +>> endobj +7917 0 obj << +/D [7884 0 R /XYZ 71.731 395.9263 null] +>> endobj +7918 0 obj << +/D [7884 0 R /XYZ 71.731 364.5604 null] +>> endobj +7919 0 obj << +/D [7884 0 R /XYZ 168.8063 353.5502 null] +>> endobj +7920 0 obj << +/D [7884 0 R /XYZ 71.731 341.4307 null] +>> endobj +7921 0 obj << +/D [7884 0 R /XYZ 71.731 310.0648 null] +>> endobj +7922 0 obj << +/D [7884 0 R /XYZ 181.5683 299.0545 null] +>> endobj +7923 0 obj << +/D [7884 0 R /XYZ 71.731 288.9923 null] +>> endobj +7924 0 obj << +/D [7884 0 R /XYZ 71.731 269.0671 null] +>> endobj +7925 0 obj << +/D [7884 0 R /XYZ 71.731 256.1156 null] +>> endobj +7926 0 obj << +/D [7884 0 R /XYZ 71.731 254.8703 null] +>> endobj +7927 0 obj << +/D [7884 0 R /XYZ 129.5143 235.7918 null] +>> endobj +7928 0 obj << +/D [7884 0 R /XYZ 71.731 215.7669 null] +>> endobj +7929 0 obj << +/D [7884 0 R /XYZ 71.731 202.8155 null] +>> endobj +7930 0 obj << +/D [7884 0 R /XYZ 71.731 201.5702 null] +>> endobj +7931 0 obj << +/D [7884 0 R /XYZ 129.5143 182.4916 null] +>> endobj +910 0 obj << +/D [7884 0 R /XYZ 71.731 175.3535 null] +>> endobj +7883 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7935 0 obj << +/Length 805 +/Filter /FlateDecode +>> +stream +xÚÅWMs›0¼ûWЛ=T= }™ÒïtڙLê[Ӎ•˜© ¤Nš_ #Û\ÚN{¥Ý·ï±Áaû‘$¨½ÎHt¿áèÑ~õa-$n1±z½œ½|Oq”¢”-"šrÄD Jd £åêÛüÍ:ÛU-bÂðœ w½Ùd…2Ÿ³îöêæÚ-¾(³.Wzñ}ùiönÙó3*P*-ÉI‘=j,“@`I­³«s ÒF&±K^«r®ŸµQ[´mÄ|T›]­Ç’zµ&I‚E×µ +.šCnªÒ”æy§.ûÒîà k»7&€8HÇ:fjl¸Ã »Ïì +ìqw˜ÏþVéû*ߙ¼,¦òß*ó«*´c]÷üF-€Íw—?¸ëJÝaL +µr·eÛT³Vná$»õ.ÓZ­.ÜMi!ÕS®[\å³f…»ªíÎ<»¥6U^<¢©u_m6傰ùS§ì¶Ü(ÝX`#N,”¦‰kP]WVeV©ªğ3€1"bÛQœ³û07gidgP`¨ÅŽO«%ÜÂF¼„ š ò^÷:º]cTzû40HèPGÛ¬±Ç”! ’XŽvé·äÂJݺ°^6NÇ C8År؛vÀŽ;Ø‰KqÆhuÂçuÖæé—"ö®õ&û"Žº¶Þ‡Ê ™b&”Ö-E„2Þg“eÓ×ü±È¬ÁêßԞî?¦T—YUem^”m@ý,\´ÝÉÕ{½'v7馔 ùÖ̽—tí?¶ëö0«$¨!s½ªs l…ŒÓ¦Â^ùE(!»# {ºërŒÒæP­í®[½x5ªÕ”]”ußîÜæZÛ)=Ð[ûð?$Fv$’3ÁàÃN$C; !Þ Ù0ÒNàŽ¿ÀrZˆò„œsڃrºƒw:À;Å逎@ t{ڜ͎j?V‡Ú»ÓqŠ +,ìY‡Š}ØÞ3¨_>Z;ØQÏlC1IÒ ïqϺ]AžgÔ~+ÄP†·C!í›s"‘žžü©àaÆ¿¡SÉû“jJëÇÑÿã92endstream +endobj +7934 0 obj << +/Type /Page +/Contents 7935 0 R +/Resources 7933 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7932 0 R +>> endobj +7936 0 obj << +/D [7934 0 R /XYZ 71.731 729.2652 null] +>> endobj +912 0 obj << +/D [7934 0 R /XYZ 71.731 741.2204 null] +>> endobj +494 0 obj << +/D [7934 0 R /XYZ 287.9544 706.1179 null] +>> endobj +7937 0 obj << +/D [7934 0 R /XYZ 71.731 682.6291 null] +>> endobj +7938 0 obj << +/D [7934 0 R /XYZ 161.0655 673.2412 null] +>> endobj +7939 0 obj << +/D [7934 0 R /XYZ 71.731 661.1217 null] +>> endobj +7940 0 obj << +/D [7934 0 R /XYZ 71.731 575.2602 null] +>> endobj +7941 0 obj << +/D [7934 0 R /XYZ 181.5683 564.2499 null] +>> endobj +7942 0 obj << +/D [7934 0 R /XYZ 71.731 554.1877 null] +>> endobj +7943 0 obj << +/D [7934 0 R /XYZ 71.731 534.2624 null] +>> endobj +7944 0 obj << +/D [7934 0 R /XYZ 71.731 521.311 null] +>> endobj +7945 0 obj << +/D [7934 0 R /XYZ 71.731 520.0657 null] +>> endobj +7946 0 obj << +/D [7934 0 R /XYZ 129.5143 500.9871 null] +>> endobj +7947 0 obj << +/D [7934 0 R /XYZ 129.5143 500.9871 null] +>> endobj +7948 0 obj << +/D [7934 0 R /XYZ 71.731 478.905 null] +>> endobj +7949 0 obj << +/D [7934 0 R /XYZ 71.731 468.0109 null] +>> endobj +7950 0 obj << +/D [7934 0 R /XYZ 71.731 466.7656 null] +>> endobj +7951 0 obj << +/D [7934 0 R /XYZ 129.5143 447.687 null] +>> endobj +911 0 obj << +/D [7934 0 R /XYZ 71.731 440.5489 null] +>> endobj +498 0 obj << +/D [7934 0 R /XYZ 330.0457 397.4514 null] +>> endobj +7952 0 obj << +/D [7934 0 R /XYZ 71.731 373.6958 null] +>> endobj +7953 0 obj << +/D [7934 0 R /XYZ 161.0655 364.5747 null] +>> endobj +7954 0 obj << +/D [7934 0 R /XYZ 71.731 352.4552 null] +>> endobj +7955 0 obj << +/D [7934 0 R /XYZ 71.731 321.0893 null] +>> endobj +7956 0 obj << +/D [7934 0 R /XYZ 168.8063 310.079 null] +>> endobj +7957 0 obj << +/D [7934 0 R /XYZ 71.731 297.9596 null] +>> endobj +7958 0 obj << +/D [7934 0 R /XYZ 71.731 254.9374 null] +>> endobj +7959 0 obj << +/D [7934 0 R /XYZ 181.5683 243.9271 null] +>> endobj +7960 0 obj << +/D [7934 0 R /XYZ 71.731 233.8649 null] +>> endobj +7961 0 obj << +/D [7934 0 R /XYZ 71.731 213.9397 null] +>> endobj +7962 0 obj << +/D [7934 0 R /XYZ 71.731 200.9882 null] +>> endobj +7963 0 obj << +/D [7934 0 R /XYZ 71.731 199.7429 null] +>> endobj +7964 0 obj << +/D [7934 0 R /XYZ 129.5143 180.6644 null] +>> endobj +7965 0 obj << +/D [7934 0 R /XYZ 129.5143 180.6644 null] +>> endobj +7966 0 obj << +/D [7934 0 R /XYZ 71.731 158.5822 null] +>> endobj +7967 0 obj << +/D [7934 0 R /XYZ 71.731 147.6881 null] +>> endobj +7968 0 obj << +/D [7934 0 R /XYZ 71.731 146.4428 null] +>> endobj +7969 0 obj << +/D [7934 0 R /XYZ 129.5143 127.3642 null] +>> endobj +7970 0 obj << +/D [7934 0 R /XYZ 71.731 125.2074 null] +>> endobj +7971 0 obj << +/D [7934 0 R /XYZ 71.731 125.2074 null] +>> endobj +7972 0 obj << +/D [7934 0 R /XYZ 139.477 109.4315 null] +>> endobj +7933 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7975 0 obj << +/Length 1059 +/Filter /FlateDecode +>> +stream +xڝWËnã6Ýç+´‹ Œ8|ˆ¯ì¦é´h1S©fºÐØt,TC¦AÑ/%‘2eQ’[dA::¼çÜë+Pÿ¡€#À‰°˜Qì³;¼èG?Þ! &tAßíîÞÿ@` d˜»c@$”G'ŠD°;|Ù<žâs­Êmˆ)Ü`ЏOiœ«úSü­ÿùáé§~òYÕ§âPmßý|÷q7ðSšdQ䀚ÊÄ(@`D£V§É†Q¨“‰B¢UÇŦz«j•l‹á¦Iëd§i+IǑNºC„mºœñ.ÎSYÔEývVà +¡W°ŽØ¬ 1 Éo¹žÎ‡¯ÂöW¥'ÈCÚH.õ÷ªÚ—ɹNŠ|‰œèMbXZµ{UU=iœ›±,ã·~Zû±ÓòÎÂý¤TuSæ«kKUéä*³óm¤~ZŠ&5±¾)ó¿ºlöu5ŽPŸÌÓcQfmfz¿C‚ˆuiü}Ÿu…óKœ©û‡!R’¿Í÷縌³Ê>ëTþ3ŽD»HãýɕÝÏ_»1*ÑbʱæØjºT…‰ÞΉû"¯cýü*—ãÏ-¦›8m”‘\”ãè1ÿٗãéšä±8 Ö$ym}žÿÚÙ56op1ÀïcîN‰Ù;6•:6Ɵד2•ðV4ý$WÊlr]ôcÿÑÒñiq½ßU6¼ûK¹¼j닦ž[T-L-þ¬ëíÆ×æCš­÷¯Væs‘ªêÁæi(‘Qÿºl‘Þ#]IJw´â¶)„$ ñ€`mEÈÛ¦TèÂú6%ÝÂ8D­Øi´VÂWŒé„c@"„½¼×ãE‡]5ÕA„Ó7n¦Ed¬£ß˜©ÅL„š¢E=ÌvSϓL,€#AüZTèÂ.¢¶»”[جƒº Ž¤—wÞA»jªcì ‘ â|,£ïHI8“Ìç £›wî‡Ò>Û"±yi2•×Õ¬£XBÀ¥+Žº°Gت£>ޝèð::’qùx\¥ `!®êrôp-ÍM}”ÐëPԞ. ÐôçîË·Ðp7Á|¥¸°…0ÀV€÷†àÓq±î²é®Ï;%µ ÒöQû[yÕ1ìNCr­0ØRaZØzazxo)LÇ+[˜®ŒE«ælÑ}0ÁñŠ-.lÁ–¶j‹÷[|:¦¶ŒdÌԅ…2 +8"þº(Oú×±f³¾:莏u>{»j*cÜ­"-C_ŽÆ:ŽöXæëVH(Ѹ[]Žm¿}þ>?=šÃŸ=ÂÙ£fÑëiweA|ÅSµà©E­{êa½ÅÓk3žº:Ž—£¬ÇU¦/y\òÿãêAéó{z¢¹HFè·\¼9;˜éřb lˆÔêCÎރ=ŒÿS¢®endstream +endobj +7974 0 obj << +/Type /Page +/Contents 7975 0 R +/Resources 7973 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7932 0 R +>> endobj +7976 0 obj << +/D [7974 0 R /XYZ 71.731 729.2652 null] +>> endobj +502 0 obj << +/D [7974 0 R /XYZ 257.982 658.1081 null] +>> endobj +7977 0 obj << +/D [7974 0 R /XYZ 71.731 634.6193 null] +>> endobj +7978 0 obj << +/D [7974 0 R /XYZ 161.0655 625.2314 null] +>> endobj +7979 0 obj << +/D [7974 0 R /XYZ 71.731 613.1119 null] +>> endobj +7980 0 obj << +/D [7974 0 R /XYZ 71.731 581.746 null] +>> endobj +7981 0 obj << +/D [7974 0 R /XYZ 168.8063 570.7357 null] +>> endobj +7982 0 obj << +/D [7974 0 R /XYZ 71.731 543.6723 null] +>> endobj +7983 0 obj << +/D [7974 0 R /XYZ 71.731 512.3064 null] +>> endobj +7984 0 obj << +/D [7974 0 R /XYZ 71.731 480.7248 null] +>> endobj +7985 0 obj << +/D [7974 0 R /XYZ 71.731 449.1433 null] +>> endobj +7986 0 obj << +/D [7974 0 R /XYZ 71.731 432.5057 null] +>> endobj +7987 0 obj << +/D [7974 0 R /XYZ 71.731 400.9241 null] +>> endobj +7988 0 obj << +/D [7974 0 R /XYZ 181.5683 389.9138 null] +>> endobj +7989 0 obj << +/D [7974 0 R /XYZ 71.731 379.8516 null] +>> endobj +7990 0 obj << +/D [7974 0 R /XYZ 71.731 359.9264 null] +>> endobj +7991 0 obj << +/D [7974 0 R /XYZ 71.731 346.9749 null] +>> endobj +7992 0 obj << +/D [7974 0 R /XYZ 71.731 345.7296 null] +>> endobj +7993 0 obj << +/D [7974 0 R /XYZ 129.5143 326.6511 null] +>> endobj +7994 0 obj << +/D [7974 0 R /XYZ 129.5143 326.6511 null] +>> endobj +7995 0 obj << +/D [7974 0 R /XYZ 71.731 324.4942 null] +>> endobj +7996 0 obj << +/D [7974 0 R /XYZ 71.731 324.4942 null] +>> endobj +7997 0 obj << +/D [7974 0 R /XYZ 139.477 308.7183 null] +>> endobj +7998 0 obj << +/D [7974 0 R /XYZ 139.477 308.7183 null] +>> endobj +7999 0 obj << +/D [7974 0 R /XYZ 71.731 306.5615 null] +>> endobj +8000 0 obj << +/D [7974 0 R /XYZ 139.477 290.7855 null] +>> endobj +8001 0 obj << +/D [7974 0 R /XYZ 139.477 290.7855 null] +>> endobj +8002 0 obj << +/D [7974 0 R /XYZ 71.731 252.9275 null] +>> endobj +8003 0 obj << +/D [7974 0 R /XYZ 71.731 239.8765 null] +>> endobj +8004 0 obj << +/D [7974 0 R /XYZ 71.731 238.6312 null] +>> endobj +8005 0 obj << +/D [7974 0 R /XYZ 129.5143 219.5527 null] +>> endobj +8006 0 obj << +/D [7974 0 R /XYZ 71.731 217.3958 null] +>> endobj +8007 0 obj << +/D [7974 0 R /XYZ 71.731 217.3958 null] +>> endobj +8008 0 obj << +/D [7974 0 R /XYZ 139.477 201.6199 null] +>> endobj +8009 0 obj << +/D [7974 0 R /XYZ 71.731 199.4631 null] +>> endobj +8010 0 obj << +/D [7974 0 R /XYZ 139.477 183.6872 null] +>> endobj +8011 0 obj << +/D [7974 0 R /XYZ 71.731 183.5876 null] +>> endobj +8012 0 obj << +/D [7974 0 R /XYZ 71.731 183.5876 null] +>> endobj +8013 0 obj << +/D [7974 0 R /XYZ 149.4396 165.7544 null] +>> endobj +8014 0 obj << +/D [7974 0 R /XYZ 149.4396 165.7544 null] +>> endobj +8015 0 obj << +/D [7974 0 R /XYZ 71.731 164.3149 null] +>> endobj +8016 0 obj << +/D [7974 0 R /XYZ 149.4396 147.8217 null] +>> endobj +8017 0 obj << +/D [7974 0 R /XYZ 149.4396 147.8217 null] +>> endobj +7973 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +978 0 obj << +/Length1 756 +/Length2 667 +/Length3 532 +/Length 1211 +/Filter /FlateDecode +>> +stream +xÚíRkPWµU ,´¶‚‘ŒQ0É.2Ä (ˆÊ+ñ1ËîMXIvòÁ±Ú‚Ñø`Êc*ÒZbÓÖ)‚Å‚6"Tm‡Ô ¦` bQ”ZŠ"m» ŽSüÙþêtïŸýî9÷ÜsÏ÷ùy'¨D +’IƒQ ͉01&‘±ª ˜Eüü"YˆsC¯Ä9(Xh( À¤•ÉƒP¹T†øHFob)M:E.ž ɀBYŠÀi‹séPÇk¸¨‚‚œI Z-PNœÈJ˜ÙlHŠ $Ep j(‘L8Š¡Õ =Þ& ú§P6d³xS`or1à-’ ­5ªIÃßy'ÿ†©©âQ­6×MÈO¦ôŽë(­é ƒÑé dA,CB–žJÝ›‹…$eÐMEc8\K +Z£…@„-£ÁÒǕE!™@qD:PãÚ,8¹irª>¾I#’ˆ˜øÄ(Uà“¾N‚ 8EsëMzÐgìÉ{Vó)±”¤¢bÅx"¿žþm™rÙ*š`HŠÖ€ iÀY7!üñ•äb€¢IhÐÈ;–ˆi†ã>š< fXd¢­Ah&& ²0ÓÀ÷„G‘çŸÁsEA¡@ÂËcXÉ¤y#–…4791|(Ok5Å ¡HgC,Û»½ìô›'óWUµà qkûøV§Ó¹ ùG)2O%­LôÖpÕ·÷Ö´ +2lkˆe%nìçs-q¶Ž¼çöQùݚ‡ ¤ÍâïUÓséËãþ·c¬™ÉåoôΓ7³}oïóYÒ9Ⳬ͵’ˆØTÕ4ÚÓá2+@Y°ÀSÖYëÔý©ûç«ó‡v•µ.'†¾éZ“ Ȋ2ûÛÔa.i#øƒÈu¶Í˜xSqÞ>лÃüóÕøÍ©Æ;¢…~¿^PÕï›óçå^»¤w|W4h9~g¼3Ò,Œhén·îmí•*ˆn®ójë Nÿó-0®Ô]ƒö¿xêfÃÜËÛo$}ö VøhÀÉóDþÃ<£¢þ-áÊ;9™ï7.MXòÄkO—§üRÝhuéhœ¹…Û;#½ãwÅÑk¨{Pڐ~pP"è¿»ôJG{tu_nšëÜc;·Ô#–x¾oz{_±ý‡ò¿ÀB€ÐBœåÎf E|£Èendstream +endobj +979 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8018 0 R +/FirstChar 21 +/LastChar 21 +/Widths 8019 0 R +/BaseFont /BIOQFS+CMSY10 +/FontDescriptor 977 0 R +>> endobj +977 0 obj << +/Ascent 750 +/CapHeight 683 +/Descent -194 +/FontName /BIOQFS+CMSY10 +/ItalicAngle -14.035 +/StemV 85 +/XHeight 431 +/FontBBox [-29 -960 1116 775] +/Flags 4 +/CharSet (/greaterequal) +/FontFile 978 0 R +>> endobj +8019 0 obj +[778 ] +endobj +8018 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 21/greaterequal 22/.notdef] +>> endobj +8020 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/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/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +>> endobj +934 0 obj << +/Length1 1612 +/Length2 15481 +/Length3 532 +/Length 16342 +/Filter /FlateDecode +>> +stream +xÚíºUp&͒%(æ3~bf–JÌÌÌ%}bff†—˜™KÌÌÌR‰™¶þ{§§Çzg_vúimÓ,Í2Ü=Ž÷ãOIN¬¨B/db÷(ngëLÏÌÀĐ·°ùáâ$gg+K¯ 4sü5²Ã‘“‹8œ-ìlEœ<   @h `a0sssÑDìì=-Ì̝TjÊÔ´´tÿiù'ðÃã?<w:Y˜Ù(þ~¸­íìm€¶Î!þ_oTÎæ@€©…5 ¢ ¨%%/ ’WHmŽFÖE—ÖÆY c ­`jç°þ÷`lgkbñOiN ±„œF'{ ±Åßm@wc ý?.:€=ÐÑÆÂÉéï7À `æhdëü·Îv [ck“üµ›Úý‹½£Ýß›¿¾¿`ŠvNÎNƎö΀¿YEÅÿÍÓÙÜÈùŸÜNÝ;Ó¿‘&vÆ.ÿ”ô/ß_˜¿^g# ['€3ÐÝùŸ\?€ '{k#¿¹ÿ‚Ù;Zü‹†‹“…­Ù2 8͌M¬NNaþbÿӝÿ¬ð¿Todooíñ¯ÝvÿŠúŸ,œ€Ö¦ pÌ,s;ÿÍmfa ÇøÏ HٚÚ˜™þm7q±ÿŸ+Ðñ_ ¢úgf¨ÿ’02±³µö˜Máåíœÿ¦Pý¿S™á¿Oäÿ‰ÿ[þo‘÷ÿLÜÿªÑÿrˆÿOÏó…w±¶–7²ù;ÿ¾`o;€,àŸ;ÆÚÈñÿndcaíñ¿Ùð_5€ÿ&ùÿ€#ålô·B¶fab`ú·ÑÂIÜÂh¢háll05²þÛ©ÙÕlM€ŽÖ¶À¿Šþ«™zf&¦ÿâS5·0¶²ý§õìÿvmMþ+ù¿"ý‹:£‚œ’Œ˜í½Sÿ¥øW{gUû¿ÄþG)rv&ÿsñ†°°;À‹þï ¤gaåpüMÈÅÌìó¿Éö/æÿ\Ë9;Z¸tþ–ÌÄü¯ÂÿÇûŸ+½ÿ#fklgòϬ¨8ٚü¯ÿiøÇmìâèøW՝ø¿ÿÇú_ƒºáV—ìŒyƒ-S3Ҝk±r†&Duúz˜Á‡BìKT óý«íºýRÃw¸+ ßkB§x>Û<Oí?ö¥iFz0­)»/óð}H©{óQ6)~sÒ2ê—|K;ӈöºZÝ†Ðæ`R?؝PRÖ/~‡"˜úÍêsõDíOêšïNöhèkœR‹ÑÜ‚Z[pzF‘xüôH90:<4Ø}Ù»G› KÎë +ñ"Êß!O@[­Â+‚*­ ï¦ýê“H£ËK?—œ —,ÒFöUÑ,oͶ]ö= 2­]à{¢œ£dë~¥&æõÜTÔw¡Ä)îٜ¯ur1'¬ïMø“A}·3VdAÓÐõ„C`×T}Ná^µ6Õ4¯½ˆ9óÃÓJ%õn-PûäLôÃ.•ˆ"­öN䞺ËÂ2æÀ÷Ò¬pÛØäÇ|¿{f­jÎdMrôk3°N›ÃN0Nš8 +ŒoDû'e‡‚š®µåÇ%I‹Î”<~û^F¹öá‘Å—¹Ã<2GiêÀW¥Þ36–¨u´ÈΫ>%tµ!µ™ã-g‰‘ùr'"„“Å‘"bþ˜Ï Óù:í?Jwß²EM­8 ð< uÀ$›™/ú_2Ò`•ç‘Y Ùh2þ¦(¿k~Òd­ùÉSö‹8¦¦Èámxlq*3ü{_,f´~èïW$8Ý[vúý±Üçy?ÇAH«71«—!DpODQ3¸˜ïé8wc1 ðDJ‘Ñ.ĸÃâ—s5? +üH£f:Q—ÀY†Ž‚Î +nÓÛ|#¹ž%}“cñWÞmM‘%UØÕ[‘_‰QÚL’að!TéŸ>¯C¶†p6¢ƒ'4Ìùˆ©Ð²Ð# (Iwg hž¯ÙH¦kÖ«¼ø‰á­’vQ“únژÙ¬-‹Û~0ÈNYßÖôzg€C«SC¾[“-Ád²ßÔ{çŸl6ò‡ ?±“ç‘lÀ|1Ï$­WøZõ ¦ øµ¥÷V²ø µñŸ+'% [dè7rÜ +~´zªf?,ŠÄ±M¸³)D‹ŒðW%ïTç5b˜ÞˆÏXi…™Ø / òןÓmªÈ‰íåq’”ÔbÞRœþШÖÿ4Ù·Uƒ|:yní‹ÒºúB2-‡ˆuǸùž=¿¾z`©&YgU‡}Ƙ"àŽš8€¤Þ½Qrޖ>ò8t#7£ +ŽÄEf蘖՘°SÃ׃º¯)@’ǵ’)«¦ÐdK¼·Aufyÿ1zµTæžüêYÎs@"5-Ms3eÔ"Ä5u„ˆË#+±ôú ˜OÔÚ.C ÷!‡æ} ñøÔýì À¢ã7_ ]È'ñrðá§QÙI—ÿT3µ=©†zE~èá~>ÕA+(S“WpÏü Ø@ ÏJ~:&öo1c‰zW¡›¦€Šôa«,ËiOK¢]±Þo´{ʨódÚÎ3g³5“<aÚÇÐpQÃG4¶§´æ©Ì„BÁÇË'—Ù“ùZ‹ôõ&î ÇÇM–IS‹¬ôE‘ñ +^)ð>•ÉÁèÏ7Â??¹ÉeɬwdŠ*ˆAœ`ó¨Ó{F§œtÒ'ꄙÁˆqRØR[Ñ´òb·LM‘ÈW“2H4Dtòýځ<ç±.z•u"õ‘ ‡\ébhÏnÓ.¹)ÂeVdJ üùê\J{ÝËø>•™j¥ô»¶­Zàã잺—í…3ŠJÌe_±åÁ»zëR"êšX³±~^©Žá:(­NŒïíÊϦ`…0©%¸Ä©rªƒ,… øžÍIc0Ò +k^…â^º)`˦5 -@zfçުʁ¤½”Iú ô!¤Z•Fʪ§zՀ¦º¨h¬•uB +º4'¹2ÿ-;ËñXäLdLW9äðßSŽ¾Ž}±dñUmÉ£Pò^\ñ™ìщԢ%L|OÞâJÁ‰šé߸xC«ã‰¶Ù”™ x‰7Ö¶ÞU?.žy †Têƒi 7î.á¾3{+÷~á‚ÈÍ|բ͕W#FxWWt^’,ØežG§$”×ê<Ô¡§k¾®“ÀK(Ï`¾qì®±9­Õ‘rŒtˆ­BR_—öœqÚ7¤(-3-”)Ù+lÒùýµÕT¯L.;P·K«‘äXÛ®~Eñ‡´~ªufúÉÃ{|Ò£Ð/lMWÉTÓc3°2Ï]†àªT¯…›Š`ÔcåêC<ÇTËGK§Xú–º?w Àü"·òõ>±šÍýB‡ë êzÊ$S׆X€8É¿!ª¤tAʛÆM“OkVÀ Ç߆‘Ñjr7×2%Þ‹ÀÖ‡?Ÿ†ÌC(šø»±ÛšP‘%É » +é’F¤ÎԊ¬WÏH?¯Mù+O!A FóšêüjÝF‰õ¦¼LH`v†½½%;"Ã#øq,JSXîD‘D9{iQñ™Öځ$¹ú¦cwñøeWu¼Æ05ÁÎEuÁqK"ú{gan1h6ê ˜#S}qž‰] ¬,2Ñ¿5Ôq¥¨\ºN*Âh«({9ÁoÄÆه(pFª˜¦NKsöÓÓicòÌX´ã[]Ï]É-Œµr¥=©¶äQSd+œÉ/›hšËBÏT¨C˜•..§bÓ[¿¶âú>|*žº#¼i ++öÊd½½¯Ž<¢æGå]n9eXשár®†¯u<[ª†`: ÕÙæ³b‹—Ÿ‹Ã +µ šC ¦«5{œW° }Ô‚ í<Ä¥Ñ>cCÝÞlr³„+FëõÆÜá˜Ã¥’Ü‚¿ÄýcO$Œ£ÑGš£ñ?oåÅõFsߊºu–=Ýý®ÊSˆYìªà:9ðyj%ϪÛÔ!úð868t\Môōؠs{K³ +"ɀf߶4÷ª–ìÖâ4g·)@»‚§þÐVٝÃk„aO­ôì{CÅT̐óç>?—×pFyAÌáÊÚV·Ö€£@;cïì‘Wûm­:0·å U«KFëÀ¶áž´G{^ó]ìI78ß)›?˜â-˜5¦™£´‚±ÓiïB•§¬ä»¨î=³¾Æ@ hé@ér¤·ªiW°ñ•¥¶ ‹äü~TõÏ7,”1>z£Åo3•k?orGùf°²SlÉÂÏV˜&j ‡’ÿTôB¥§ò‹?Ò/M!¾Ÿ)õ5Ž(1dãÁ“aì*l» ÚUiòõÈYá]ÏXDNÙCyÓߌZ(d·.钔ÐönîOލ)Ù{G¼~ùÍ:ÕeA§?ðC„c£0„ìO¨$`ì¨6ýÁR^6 "9qK” ÈãqS7–µéŸ¬‰J5¥´h²²:¦E5ƑeÃ6¸_ükýΚ)#£N’T—·yNIÔ'v¬Za ›˜ÁÏrqJ´û²JGðû³s<úx +gâiGÝɁæ$å(|[°°Á,qnüëÀe +_Ä&C‰WEݚ6ó)Å3I¦[©÷hþ /Œ#'A´Ö–wª²{>çcÇ£Ñðë‡L™„Æk°Ÿ©Ó6ñ©å«—Ýj¡ëfrKJP*ªÄš›(E«Ü¨EíËBÝ!‚\Ä~“¢ÄúU [ÙÖ´&Œ×aG°ê€Òc‚Yo'‚j<ê>ÅÜ®„—S¯¾ó#ôR”ƃF1‚;(¾¶ãtÙ̑€úùH&´¨Áøû¡åbÁ_ÆèaMÌÏI²`=íú½çObWìþŸ–úoñÈíºX±GÐ|ŒÁS²–áîu…b +û´_3=ÃÛ¥L¡Æ®!¹ü›’ü®=xóFN¾ñD¾Îr=8ÇÜ"mrŠûWí9(Hg ¶ÅNfҗnBçÙµõ¼%wœû²™ e(®‹ýÔòL& ¶!ªmõ±Ð}ê0D:±;ù‰/)ÒðœàÜX¨1{=ʹ G‡ëý@Sl#Ý{TƒJÅÑL² ªþïPÝfó?,¡¸}‰R¬”oý™‹„Ò£¸:ecû÷ó3jr3u\ÒK”lWòãú„Ęxñ•Îa-(êg=¨H÷\>§ +<Ö±éw"³eEåºP#W5Nâ‹Âò/ð+Ol×6nJüßÓÉrlÔH]sÚ{í¯4Ü/ëwÊè5»7Ô¼^”.™Ÿ?DÕÍûl+ØÂï¼]ælx…æ9:6`J +¨%…Þ×¥£^ł”è1c-RfíD£§] Pl¸Eækú¦¥'ûý4gw¨"f» ?TWëûqʯzqœ‹!Wr/y`!Þ¾°ÖIbÜØí`NÁ+±T~£´Ð@¤šé²ãÂ4Âñ4 ^÷½üÚ­úG=4WeÅTˍ ʜv'4ƒ˜þÊ)Ñû1Üu~ü È gO?6¬Þô|z¯R¼B ºwυ6ƒÄ^Kƒ¼ÊP×'Bp95U8óˆô¦®z»Y0V©ÍRæÕÖ<]gêø*(!¼åCû¨9¢‘ÓL47U¥aª,Ž½Ô#^Ÿ—j½# VåÛ«±rq‹†ˆPXtfì$O6`*±¶"c «Ö6É +·¥` Z^ƒ?â¡ù0ˆeÑ­ä žÂxß׳$šý¥êArÎөȪèÚÀ’ú¹)œ‡2ÝìÙ×ÐLÏÓÕUÂh?#€çˆÿÈվͧ70+¹G(²œèÒ‰ÅXLá4'¨=eÀ&®cI*N«Î̉}{Œ –*¹9KÆîUÞOuلŠÁO|j÷¼êßڀ·#QOÏXÎÛ¼ÀÌ,.!ý\æ;A[,è4Ô¡º&OÕiž7¿ìÿfֵܑhnÒ!o–ÅÙ­J=¤b‘ï2ï7KÇü.Ô± +Cؤ¶•ŸFaµ¥kõU—€=ÒÍ'Ԋ޺yüM|¸š'>@^)ݽ!gL¬ˆÇª;áòÒP»ÎIp½®CD›4äYòDô±ÑQ-¾[1@&£o«£¾K¢lVÅÍWR²(…£_ŸSü(Ÿû†€Ù¦2r¯Äù±zî¨fþÀoš†!a¬¬VOù5Ü£~ú©`‡„ÜTNFϳM^C€BPòÎ-æYü:ØOä C¼Ýïl2~UÛs„e1¸{gL§•æliú®\‡ñB 2GLÏ·#r¹Ñ%b_0Joà+¾/¿ÜÕê ë +ö¢½UÞ.§ù}LK*:°ÌcúŠ.Ï$|z–yû×ÚTuŽ›}` Æ2DÅÅ +{dô·йJ,—Æxg *1‰S©ÍûG{ý¡Cæ—€K^E4ý E6|ûZ¢ãO8ݪ¹ëCù®Nå:’§ø*³íÐ]ûéiʔN€ Z¸Ý.Gx:¶ö$ÙÊø-ߎz»ÕŽëô ‡š®SZ 5@.lü'M‚†1°¹Ã5a@¶ûØVH Qñ~獃 Nƃ\9òÁE€yåZ(eG»ÇÓ/=Ê 86íAKŸ³Ì&ùóø C/¹i£æ#K”ÕO¾(?ه0Dºr9©_…6ó®kèUçøªU1E¯zóL>B*['jz”ž‚‘ÅAS½9Õõm+aוÔçþ6̼‰ÀžÝWe†è lзe@Ύ§[…*ŝðÒºl×hÏûõ'Wbâ|8bþüš¼B?ÆKÁ<؊Á1» ÉH¬, +*%éϟùmÓ¨0¸š g +ïó7HI]˜´/ô¥¾!tµºˆ<øä £ÔÝót’m”ô#câ»m¼Êô%s·Z}0À[ìæaª©ÅkëC–ÏØq“-€»#L҅,)IiE11#tÕ菣¤31ãä•›A ©³)¨ +¢Þ—fY™Nò&O—R•Ú®]q”·øÙ”ˆ‡µÈoä9BOòEçL¨²C¨p:PhZ‰œ„ëœY\Íßl“»jgPd«j3m›¥¼bývK>#ƒ¥;ÛÑÙata³Yó)qþl蘒pQYë4¤QÆ Q¶†Ksþz¥ÅðøiJ+………Ò[H¥Üþ²˜nZ´¦¥ø"bÆÞ`Iâ7ÔÝÐÙäÒ_ے3á,SÒ7´ƒ#-m™ÁÄm¸ö¼ÁpegÆø+”Ò¸H*»Š“¾-1zž·V[üoÅ *s(ÉYyDhFŸ†>œªbð睹Æ¥58꬈ åB|Y œøCÈO,*‚7™]Est–‘b6Pa'j)ùXzO…9uZÕU½7@Ì$>õ~…¨¡šŸDþd\ ?–ÎTöî—3žý|S•9ÜcÖ÷Ó?b½ë[š»+†ùöBÚ¥³N]3™³y™Öö[ŽFP|ffäÄa#l”TÔnkêšT°t2öæ…Ï”‹O{ Ǩ\Ì`«˜w!Oö¬’Q8R—ŠkêóI}5Ï2°ôéÊöø¥rW¢TKˤ=D<\Z ¡xêTd5©1»+~ôCaDOڀþ3<´U!{J€jÐŒ ȇº`›ŽÔ +Äؗ6‰÷ÊÒ-‰ê!ŒÄöíŠóMË'̎m‚[˼T-BË"ç©]sžšd6«é˜W”ɯ‰§´ +\†ŒŒø@1ò=™ˆôë¨Tw}›E¨Â֙ð\ÉD‡!$Œ~ +O4ˆ%qöð¤c°¡/V`U²ƒ-%Ɗ’¾ Û9Ÿ¬eߖþðaòIv¿ïóWÿ†ã¯8² (n²JÖß±4èiüÙ%v®DSŒe2­†˜x÷è1®E G~-? WbºA˜ÂeÜ0ÍùMƺ¦µò‰ÄÅ–uE¢”Á5àH9uÎèØQ‡ÈãŽKòQz˜ÒÙ 0s ]³Ñh“ÄÂ$#®¯e 3+:x#ƒû¡ê¿;/®IÇà€Ë 7íõÄsÅwBøäî‘ëùíW½± Sûkfžxu.ê…{§Ò· ÑîQùt—¤)Gî¡éîQÓŽ>¿àiPV•tA…rtªý&r;õPÇ ݬ­IéBfK_g Î?p„0…KRH뵞٣Û'ë4›+ˆ¶ÇÌKO½å%(Åi”ƒŸ](4¥”Ï‚äùÓH1Õ¥?ý¾»ÏYGÜÐƄfË·>Qêó,·ü'‚ãâsšeqÈÚJ-sõ,Ï$¥ßޖ(›ã<±Ÿe÷Ñ—ΔÒ5S òœ E†å&ÿÔu”Ý?ñ( Ú= Ú«ÒÅ*ÆqctjëÅôk!”‘¤–úæJ·÷ԙdövB0.À‚O¥ncpÞ§ÜIZþ…µ +%䇸¿ã•9-%MûaéӃhÍù .R¼Ô0 ’ç’Õm=‰ÎÂí-r%p"Õùk¹0¤&þ2D”5N×} ÿɇÁ€ñå\ù»uùƒh°µóŸ¸ö©Åjªžg´j…Jaٌ ËS´uu/‚N2ԐÅEäIïŒÛÆfafÚ­Yѐ‹ét€cjÛ9–#;† ì0R¤H`Z¥û}±£5CQ”¿Ú¬,¾ÊÏQBiu å|\PY®Ên[ÿbÃÄðÿݪ^“8ôՒoì;,*ê¦[•…ãÚ+ä*Ûî~ÝH²÷3ûâÙ?ˆEÄ$ÉI—Vƒ4……0­Éºà™ªzý›C~%z,Ÿ¡¼ÁlVœ½é[…4;œ½yȜ!æM ÏÒ¤jëo¿`Ž­ó/’Jñ¼cJ'ñ;Ž¿÷ÛþÖrÏþ¤RIÈ˟Yæ“em᠟и“NѵMøeµhŸ‚l²7jv8—æ¹ J†rnÄ."‘{ÝçDš[ە…ÉáiPAP 5ÇZ¿”jtœPޛLGMy^ønäË©ð´kžÉïî8Πõ4싒@Õ«B¾ºú;Œ]Ýà¤sçM²}é¶|Ž·šœhH¸}.)¿ëË­o +ÝꨏM@¯vÞyª S˜¹ON÷w:â^DDÄÙ¥þŽðGt 憒{$&Kph „~ï@‹þ¶ ø8iÔYN‚–ÀÈÓ丟p…¤pzÅ/Z¶QhÍ%%CMÎç×µéE›Vع‚[Ñì"ÛGY=Mñ‚á~8`ø“«Ò¨Î2ºz;Œl d)ÒS˜ø@ƨte\?ï\g3.âô­VÓÇÄs©(["|oÓ0®3 ú ÖXg RwÓqûËÞøµìc‚àBƒ×-R_ûjàk:Iødq="óXÃÀ¾œZyëk({•¤÷”2pJ\C–Ø8'çe¶>3w… jvôàž©KIÐޕ#Ð6Uï8Sÿ›“K›~¯Bš ðqI¤¤•öû +ZÔU{¥(Ji2»Øe¯åœ¬8øl;‚©Ãláa-’T˜}c†”1àì\‡è±4;ô·ŸQf{ÞD”sx†(ÚܚnuûŒ‘ÕghJB#Y¡â0Iãs^ÆÁ(v©ú ïOy} 4C2¾’Gˆ-ESó£g«Ûə¥¼£ ÷Øß@ DQ~f°ˆÍ”ƒH¿Õgâë ôÚÁ<><ÐEThœ;Ő¢ŸZÿc<ò + 3¹E¶„XϏ+ ].̼uÛuõ㎒`¿9lE}b‚š<ؒ‡wñ*ìÕ!Ýˍ¥Î·—³Xz¥ g<Œ¬p+Ä.FÌÁÓßì 6cÙð€¾˜AôÖy<ŽW…ىOµ–\{NãW@¥[ ÷mQ¯l;j @4¦kÖW8c­õ€Ò¹¬?×Óû]¬¨Ò]'Ý«ÁS ¤¤Rvï6Ì(´‡F±çrai•ÎXâß]’ŒCü×ð%ëQE0_–­¥óhëûÀÐ>¿ýÁínÚ\1)l2ý…¢Ëì¾p|¡‚˱pŒ9?“ø,0b܎þŁ>¤YäŠmýë$P8v?6UXOšÖ3|]í^zªÅ¬½v¤òÒöRT±Q0‚¤¦Wa.ntN² ‘ê.%¯.h8îã/TəÎ^>3u ”ô¾dö׆ƒ¸2GЗŸ-š´h àŽ3X„ÒP~Ÿ/GŒA¦V·AOö†£Ò“l™g +õ_3˜ÈgÚ÷øúb [gMZïÅoo^2aö¤.‘Ó7 ö½Gbõt>;tëìÛ¥ +Inºcî=ò÷ð˜qíqëêÉæˆ7÷u–ì=缐îî-ěÜ˽ÃA~ݸ氘b,”UôÂ,"XË´o 3ŊݧD%–,rÜS·Ø´kÅÊٙç½ ³³Ï| +¶KåFÑ~¦?[R·™,kMŒ…Þ#ð©FEhQn‡ò&û›¾<#Š&o&&ÆnøŒ¼³–‘†˜¹ƒL̔5uReÁL±*Ö«„BjÜFæPMg' +–7!®…‘>DåöñtCubG;fu³®–é$ܪÎëJuv‘xctS5V„íõDýŽ†A+áôr¦Â:#Ö¯$ÀéóPí½f²2¬{რE¤¿˜Õ¨Ý jä´6 Å®cük>ÀZVèV`T9ÎzÎDœhVê_)K±@q`æ‡êB?ëAèÌOT¢8b³‚( +wØ[âÀŠû=rˆÎùHäÅø ÚÝ#'„Ͼ¥! ƒšZŽ:¿“y¿'>e&inC&wÞ'`¬¶°àƒ$æH%㠋%V3£OÕÕ+ɲVtpüT?=Œê¿ø·òü ŸÈIJl É¥TÞ´ycÊÖ Qàu‚•½äƒ é>s¹ßýÅj× Ü­ÂØ êØ +C½!˜ÓfÌ\bDW€‚™äC^ 4u¥ê#÷Ì I¢p¹l¦ÔìÑǝs^kúròÏÝñ– N7÷¯ù¼¹BTÅü¡{x€Ð Ô-Ÿ¬T8™/Žݺ&íða÷‹\¿zb$w1ùàÍ®_{›RÔi_±ç]»œ•ìÐxëF¥TÔÀ ò§7²šuAã,O,;øèùw">Žæ“RS&ûo“B6”…Iw!qŽi9® ]Ò2óK;ÏÒò§ùwoÏEÀŒ(¿ž?³š;N•½ Ž¯µ¥ü–âó*U¦®ê¨MÝuI`ÒÒ+÷Q3«egT§Ü±˜;¿­…ÇSÌ2ɨÒÑmf´a a‡£T´e0ì%Z¾Ç ÿT=¼ÄrcÈÂߑƒÊeÛ6¯8½Iµ¯ ÞUR¬ôœfÄ7%;©çxóªƒf¾/ô·v„µ[†;’Ý/É#„km`®¢ì‚–úEºÐ3d¿ÊÍú6¾2NbNj˜+2,‹†3íWt„ ¡æÅЗÌ+ù½!§$Ìã6ºxAv'Ò«wŸ¨{>ÅñUµ7iŸSï¹<~ºÑ=i‰Ëà5ɍÀŸm Í ¨v*™TkÕh¸÷ý,¥Sj¡ª#¶·N¤¥¡´Ì?Ùa&×c$ÚÖé 6›å—×Vø‹÷zÖdëëç‡JÔ<_ÄÇlh[ÿ^7óUÉÕkÏrزš‚%(e)“?÷Ð-LO»;ÖÚ Ð¾j_§$/#UlR󀝤L B­b7 î.¤³ÖÝíµÅPEÕ +”J½¸Êè2\sƒÜK&z_´¹žˆ"~óˆwZ<—™0n"4ü6çfW† 2t#žÕÌòupGQ&n…nyZ¹–ä7ˆ`kQШ‚(6£@ƒ› õ¨ÆÇv>ÊZ¼?l”2!m-rçÂSL¸ žÅ'iE˜…SŸ7šŒ#|HŸ†ØäƒÏaÊìà錣ºjBÌà*QŒCÊù:ÞJ9]ÂU¡£G-¾¨4Oñœ1ŒÈÃyv·èëi’Á´Ý¹<î‚y}¼â73,¡~YÕÑ·v.f=K`•e³óM/SA߄k1>T)ý‘n¤ä°ÈÔ©øܺ5æcä1Ý´¯¤3@­Mfqå´ÿþ*ۆZ{ +ÆÆ:÷¤Oƒ= b°8™ "X[󇚉©F÷,œÁBêñwÍxg¡´ YË  ŒShƙ¹ö?rgéÍU‹¾à'ÆגuÕ–¿õÜÀñÜ.°/[w÷Ó†'Êa£D{ +Iæ²#çªm˜:Ñîd ¸¥–Õ©½Õ·6¯b†bz(ÊôÌÆ¥=½,Koé2"ºã_õ.DÔ×ï† µg&‡² ʧݢÃ!‘0zýOºW-9fåCO½ûU[t&‚u9vUC(­ftŒÓ¬Õ¬¤¶OêaM½ †vïÐ֗åö+‚c²h¨62þ@¼:Û±ÛÁ(á5(\—å´Ò+…3[h—Þ`ۖœœâ?nÇ«óΒ§Ö‹hoÏgÁ‚Kg)ŠQ‹@~hºÆ‘2ãÒ±ða©2ÖYL@£ ¯å† +9 Ç[8­UuPș­‡iY_u ”‚4lý*:1÷ý~zYyŸ¸HÜ UaRô÷ì`ú¤á~ úÏM‡£ÑÈ[öŒ~ۇºŠÙlé)…`­9'à +¤%‘^¥îœœ4*¡vÎÄHäñ˜4ª¦Jö[ë,8Èá¿ðÅ`;”‚Mž‚^,IÍïx°‚5ù“Ö j×rY¾ã^öݏw‚Ÿß “â·#F«ÊùŽž—4Åä746n4šdðm’Œ$¨GVÜ×;™õÆõ<ŸÓÚ[Yš.Áau›/ +‚ªh(Äyðþ†uŠaòMBâªá_.聢MÐH˜;£,ZO[ñZ\ Ýé—}È +y´6vAc›¦4øÀøwۅ¦åâãû`*W‹?<ƒþÙ ‰Q¹®ó“ßK±PPX¨Ëâ§W2ÀNÈâôШ¯tŽ™éKéL­Õ™ùTtVrX¬N#WÂ=Ÿ‡ó6m ù„ˆÈ"6^#L¡ƒ¨°K¡T˂Aœy*O›„¯óZb˜ÁH¸±3t÷>ó¢x?ñˆ8 „od˦!˜wüì·P¾,ÇzT±êéõ%ó6bPl¡í”HÑg5$Œ$Ø;àpx?EØúζâ ~åcÉ÷¢õTÉ\\¢éãÙpn7ÕEÎ+±_÷¾ëÆ v\|²Ò¦2˜ +áëW7ý:’Jt)½Þ[քq€…l=û ØùaµÒ=œ)¢#ïS‡Ù‚‚AMD¶àÖVž$çq…€ú´Æ:>JUgü´¨US˜EŒ7]Lz_͸¸Í֖€sÈ¡ù=×( V3‘~ E¤â ’ É¹l‰\ "ãâH—ù?ÚÈf‡…ƒé¢ $ »ÒfÆVxƒ© +ޓ›£šÿ¨StÙ-þ&³ßLx³Î¿­ÎõMH¬Ú6I%Å +ÿ«ŽÎþëªòô¢R(+¯’0±s.B³÷dBʵ!ˆÝP_ƒG?«‰Agœ!ˆ€Dž'³5óšFŠ¥äûIÖ«£DÐ«º2$ÜdpZSÛ­ˆÝ\ â¢cP×Åäð*cÔ'ÝO¶Ï4žoê@·›”e˜z¾8»¬rC°†îÓ¸u6àNÀ(ݞEÅþÉۂ«]œ[ ^fòž`˕Š¶¤å\xDa PÖ(ñÚ¼yêf¦ +N©JhޓʺÏÍ­¶‡W_åœN9©'% ƒø—yAmYw|Sé*æ%îPJÙ¥yÉ!>_„Sž¦m `„ŽØÙL+Àã73ù®¯êFþN/Þ¶vÓü=]Aïó׏óœë“=~ŠÕ·…°²t“±%§ ¾ª"8*6ZûDLžMSÁY1^nȝðš¶Î9gÖ×ÚQsúƒ†Æΰ§ÖP¼ð\ûܪn1Wë1Å´º©ò̸,Ëi50Âé¾,oåX‚»iŽ' j ~Û¦ ®Óµ²Ð©ëO b;ãGE™Æpa¨4†“ŸUeŠëò:‰ý…È+:q¾¥ô¹Ï)T•…ó³€È$ɑõ‹YtqäqMIZ«Ò–ep×HØM·ë”}­$bˆ ÌH·ëb“ÀR¤­:—Úì¯E}YüȚ7óiœlðXõõ×Õ)bzy"S°?ÊóäâZ?³QÉÕðFb!“—º"ö×5‚#¦â~­:Þ÷O‹ª<~<Ž×=]t’)ï—B°Y„"RÚyá$P’ø›üÖVSîÜAà¤k¢CÀ·B6ù͏D"΄Eݾá¬£È ×=‰Œ5^ñÌR .•ESñ*tïÈÜÐY’î½wô2µbªB|‰0ˆ•pˆæ/ҏmàìK»g9×¾=-1wz‚"i'ë7`‚ËVîбÿ d1PXù ›üQ‡ûCn\ ¼ø(I±¯üíI¢ByÃrhúi± ›Ãö]™†ÿ·Y’ªXê~þ塺|cß ûštÕÍØçRö梬™šÆ©°©ÔQ[mf> ¨¬9ï¬"w ׳w¨ÂKuƒû'krПfh¼UçGŸGÌΫb{Ûþ¬ñÜ«½™N-J¨c>:àa`H³gäæL'JÇW֍”:jæyž¾€ºvjD#•ï)ÌÇT—­˜–º*Èy\ ø÷ aõ€2=&£ªÐi=9L<dZbО$Hˆ9bâ¤'ì듫‡Ä9¹3Î/×0.Æ{áŒ62»¦cjë·ÖÖ­¾–E˜ªþ)[˜Ö9‚3cš¯ƒÞË$áðô9¥´ ¨®m‘õº*1È62"„°}•¢#.ƞø“­ ˆpW˜ àŸª÷,˜9H#èfZ’G :óôí+6pæ|äÜF¿†®/7lá<܋oP³ÉQ%äݶ&Ò_îòIñ‚v´faȇ• ‡Û#‹¯ËOÀM_ÃØð°EŸ?C!Ãiõ{fWH@µ¿ë—è¹J^5=äŸ ãÇpĘ~­äöË4uT¢Ëq¢tpïªêi:Ьîɨi&.ͱ®ž‹NEÌ©V‡ÿ}dš©ð <³v?aÿ,7ÉêÐØÇ7!‘Ïðµ]ÉþÃ><é7®Tÿ¤!˜DÒ¿<\vì[ „C&‰ÏyÐ }äL{¦Î 66Oäó*…%!>¢åÆoÚ!q8¡}pi¹pÖeåÒ^F¦à§—€µCùɟd¬4‡ M¨Ú᭝Kzì/üÙY‚Ógon Áåãá5–õƒ‡¥ã#Ür‰v~Ä`GÚ¨†6ñŸ°Ðr®8„Þ 6žÄ9ŒU³BR•Ê¸Ÿk&’U rÙ¤‹e ÊC`B»£îÜ-ë$…ÍtÄˏ;¿è~Kh¨æš¼Tã‚ ƒíT¡çÚ¬á`°Ü‘× ‰¤ŒÐ±™«Îµ¾9ÛU÷`´ñR“7FïOÕö$~i¸ú‚Õì[É%‘à\à¾Qfª{pû 㗁7JÓFò ¹µ£bœþcFÙ¶zÐûòÁ¯ ++H÷Ï ‹òê¶ô Œ5 ðÑûÁP^ٗñ |Uç:=¿zÐH¶4 €ŸAx¾K¨I± +Ù`=¥‚å;¤b>zو¥q5A¬†¨eøQvNôÈz;$,{Q$Uë'lIZTZ’ãVÅÿ»á[¹±P‹ þ-‚Ôc»2/+¹Æv É*SèZhJ{H‘%>H™é¾±v5mip›å÷H¸9â;žL)ÞëUk¨®g=ád]·bG*ýyø냹kŽL€Þ‘d4Û á½±™b0"B`û@ãMÙO5eäsñ*Xü=¡ÆÌÀa"®œ_AّÈїÙ¡{'âT(¾õ^Ã÷8´Ô‚'¨šI~6NøɃïî®^töú9K¨ôDÝ@î’èZôµÅ{ÁáYKà˶ÙôwÊÏ,‡SëY«Û md¹ E3~n¸¡Š½*ع–(/%J——øá{¿MÊ£òFûœMö¾†¸‡×Ÿhi +‚Ç"ì$اYˆ QùÛÇÓ½ÙÍ×üÑnø÷&7e˜¨ȸ—é‚Ñèy¾';ì5¨æH`PŽW‘…ðáÊ>ÊJ1ÉÑnÃSeš°­Ge,`õdÚ¦°þèÕ­ÔOÛiói܂°݇ý˜oøqU9¨Qc´Üûi–å³?á$Ü¢‘)«»¦²tRqŽ ^´«ßaÒ¿‹Cüºø½Ó=ñç5–P)Ł²4££Š– î÷|éö¸Ò|šZñÐu@¶…éådxkÙM!14\+XP´™GeNiMšÙ6Ã;grãZpq6…ÀΈp™am’$T”Å ,¹Âi8ëw7[u†ø]ñ€Õí1AªQ6ôˆkŠž’ŒÎ±1«•´ŽD9z…÷>ÁŠ›+ßÐþ­wŒ|ƐèšÇ£ðïA’Àæ~㉺×gi:eÎJÂ7,aÀ TùÛ0_\ƒä ЏÅ'y]7;¸ÓôQ +^ó±ªÄÕÒ ŠžƒÂ“V¦pû6WµÇb†6F8qEW{%Ÿ]ðCwRkð©æš£®õ Áµ;#oԝLÜÁfÄY1纴 jÒø՟l#½,‚î¢þ¬-²™ ™}ˆa5R.ÚÍJuìs¼#?«p&8KB*{ü¦,u0NVÔWÒ"Œcþðϐ½Q±˜†Õh^µ±_Åôª¡¨`*Æ9h©"aáZ·d–Aö‡ސ»,P®Œ“Ãöû†27ZÓ@úª¶q=ØÁWúÌ^ТèaFjl8 +Ÿ{w0‚Õ‘Ò$bœÂPø6çKL; ÝY3pw@ô6Ë1ó + ¸‹ížtbM*+Éͅ!]¨‡à䀢pE;˜œXÞ‘V¤]pwßPªŠ_Uð4”ˆô…‡U¬Kmov°ƒ¦ÀP;­ò¦Ùù¨g ƒ ]º˜{DÌRÞÅ/PíÔº“‰êúº|é)1½ªáË*‹[rƒz¬x…QÁéìQòž”Æpaq^KR¨ ã¸2ý>pÿ?Àÿ'Œ­FŽÎv6FŽVpÿ3f„endstream +endobj +935 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 33 +/LastChar 125 +/Widths 8021 0 R +/BaseFont /OMQKEW+NimbusMonL-Regu +/FontDescriptor 933 0 R +>> endobj +933 0 obj << +/Ascent 625 +/CapHeight 557 +/Descent -147 +/FontName /OMQKEW+NimbusMonL-Regu +/ItalicAngle 0 +/StemV 41 +/XHeight 426 +/FontBBox [-12 -237 650 811] +/Flags 4 +/CharSet (/exclam/quotedbl/numbersign/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/one/two/three/colon/equal/greater/at/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/X/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/braceright) +/FontFile 934 0 R +>> endobj +8021 0 obj +[600 600 600 0 0 0 600 600 600 0 600 600 600 600 600 0 600 600 600 0 0 0 0 0 0 600 0 0 600 600 0 600 600 600 600 600 600 600 600 600 600 0 0 600 600 600 600 600 0 600 600 600 600 0 600 600 0 0 600 0 600 0 600 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 ] +endobj +924 0 obj << +/Length1 1630 +/Length2 9776 +/Length3 532 +/Length 10644 +/Filter /FlateDecode +>> +stream +xÚízeTœí’-àîNww ®Á=¸5ÐXºq÷àî܂{€àܝàî—|ߜ9³Î_3ç×]·×ê^ïS»jWÕ³ë­_MK©¦É*a 6ʂ¡¬œlBƒ¹ Dì¨Äª´vQ5·^^ZZ)g v”6ƒ…º@K€4ÐÀÅàD¡H<œAÖ6Pƒ¶†.#33Ë?-\æÿ@^"! kGÝ˃+Ðìät„¾Pü5@Ô°ÙRªjïTä r*Ú9 #ÐÙÌ æòҊ@ dt„V`g€ý߀ØÑô§5Û —`€8-@/a@w  ÓˆàtvA /Ï`ílæ}¹(r´°w±üSÀ‹Ý +üWANÎà‡ì…L B,œANPÀKV5iÙ¿ë„Ú˜Aÿ䆀^`ØêÅÓláò§¥¿°šjr„ @wèŸ\æ@€%âdoæñ’û…ÌÉôW.£õ?+`8­Íœ-íÈ Í ÷ŸÛùgŸ€ÿÒ½™““½Ç_Ñ࿼þ³´·bCáäzÉi}Ém rDaÿ3, +ŽV`'ÇßvK§`®@ç¿.ˆáÏÌ0¾af v´÷X­PØUÀЗ”†ÿ™Êlÿ>‘ÿ ÿ[þ·Èû¿÷_5ú//ñÿö}þWjY{{3‡—ø{É^¶  ø³gì͜vÍàÿfæ²÷øoÿÕQøw±ÿÁ÷¯°ÔìåR$­_„aåäbãøÛ ‚Ȃ܁–j ¨… ÀÊÌþåÎþ²k;ZíAŽÀmÿºÖ— ŽÁ´l@vŽDàý:Zþkù/rýU<»šº†¤† ó·aÿòT{™¨–‡ðit•Á–ÿyøÃ#) vx±òqX¹¸ùüü<NNŸÿ&ã_4œÿ<+›AAî6NÀËï?¾ÿ<ý Œ£ØòÏähBÍ-_†í? ` gçÿzÿ_šþÇù¯±݁(s3` á`Û´Ìth ᧁiƒž.ÎW!N%õZ…ùþUàN¿´«‚ŸMªCØF…ž¾xLï;=n*2m vØÓw¦òÈ|¨»ó±—èÚø™·ٍKÐÓt£¼Ž§”V^ëóqèl­¨k? ¶q;#_3úS»æûãÑ\9aøZ¤ÖÅâ·c5ÀàÔìÐ%î^_Ñ÷ }èï<…ïÞ$eΉE¦v}Néÿ!‡TL_û³W8ó\í֛˜î„O|f8VG²·ÉÁ?Ò¦ÊsÕ´µÎø|Ûs¼³Þñ¿*Nþª±ƒTl|™m‹ß–I$qQíÙ·N›ëEf‹wÒdÏ¿Ë,¾5Z¦,Söˆ$ÆûÊ'õYu}žð2»îò1óѺÚ߶iO´!]–èOHúNÝe”x‡û…‡?ÓètÖfš¾qhW?ñ›Í@pm¤Í2ýEÏ~Eä6x{Y×£F)5ܾä ÎXp‡S¢àŽ_› +õSžTêCqR;åU´cø¼L÷X“ÒyU­?µ¡YŒðY‚f¢mú©¹P.aƞ̗eOiñ¶²l%ÖU%Ë,a$/,çõøÉêäO› · Z`ƋúÏC8¸XA¨!ñŠ5Ú4¿\O4ۖƒHÃk;=¸ÅÉÒ¶$ÓýÒêu)¯7­ºãZc±%_+;, hrIœÏ#ÏಈfHÅ M\oïùj«Â°ü|[M_Ûí±³Ð‡ +šBØ8ÏoÐ=ù5 ދŒ;ÆwˆNÿæjÅû6âÆA6ˆsñKöõçf2Û·æNHô؂C¯?Tëóž¹ÛðÏS›´+‡V+ Š÷03@¸6ë?Žç zts:ƒ´®íE}¦ñ|Æ6Fáï?£÷kŸ|ÀWRÅ〈ú:š3‹ëµOi·—û€LO×ØKN݈ÆÌ–¶Ã#HA+W¥vïæù}FwåƒÄlžñC¶}Õ=àZv‘!¿:œ³r¾6z”ÎÆ}«–X–b£^Õ&$¤4`Òþ•ÛZÄ (†9𘈛Üõhª¢ùÕ/Ÿa雜®g½¯ ‘iµç ˜qùwº|kó†+{Lï¼)¢²‚Ñ®Çæ¾VXÌvKŸ- îÐ/2™uûò° äߓâ+Â7ëþ’Ó=`e$cÆr^3}ßêd2?|¸†N‰[ +þè}~*Ó ^µ5:UÒxcÜûL\†`T° ·±‰¦Ñˆ‘ +(¬%çt¾Rš£Êâ•Ò'²Q•³È<Ó°&2§r +ž3ìì1P%îaRÎÞۄH¢2 ,V4Òt—¸¡ÚÌnMٌ²ÏÃw£b îKª,"„(¥¹ímâÛÜk©Ó|^‚ ^sÆ' cw2 ~vüèŠëOZœnØnÕÜÅÒÞ]àÙ óÐF+p¼ {‡ÈAzB‘”Íu÷†Ü@‚ÛtçuX×÷g’Ü-ú`‘aþ(ïRo·ˆŒº”p°bWU{‚ÅB}?û(ÐjR†!À=AŽ«ç=9—Á@ÁS-pš—\?¯ìz†63²YQŠhp/ÎIìÁÀ§Æ»rRn¨hDœ ~`çþqÆA¨W-[u 6†àÐ'lã2><Ù=ç `_æó^Ïaä¬iϟøÅÎZ˜\Ûï·éÞù9(› ÚS’"–ç›-Í³Ç—Áµƪøяè\xėHÁHf¡~´ÆYÕn÷Êñ^jV½ËÓ-ÖþËe÷ÀK'Cð}düƱÍôæ"OEIi,ìˆËÐY)¦…è›3i.”Yv7©Ô¨òmÅÄɉºèNáGËúhü “.Ðk³u!Lc‡·g(`‰Dæ£VԄ./7ÉòI¦Ïú‘o¿N[ ä$)'ýšð®˜w~Óÿ•oÿ]È­;›h 墹'ÏõÖI:=ý§!Ì,ú7jÖæ Ž&ú¹ÍÂëdñ‹á$m˜.ëä¡+hÑõæ„ÛI&^ÂÂsœØ¿°»×'©ìkx~ž™å¢¹Þð@â–0vä6b‡iŽ7¨j=rŒ°ó7°!¿æ‰$Èd¾uR·ÓPDJÉq*‡RÿÔ§&6чÁ4Ã\9htMGX3"¿w|«š÷KÍ&ͯ½D¢A¿kFõ~CN¿®~¹7¤?Q06ϋ4À Ŗ=pÂ3{g}(”P•EîÄ7ÀUqó±3ºQô^ÜMgØUƕnoâøÆ3&Íä7Ý[û¸Ö­ŸY•û<-‰¡òC$‚Þ닙n9ìÔ¬Oû0Ë,^3æè¦Ü%íAâNÜÂ8É§j¥ÇM:’GÊËæ*”˜¤¼{ù ‰°ôâ SJ'¿ê*ypÙ½¹Ä.4QO¨;ßÆä3D Raš•G‚/R(/cq·¤Ñ¦ªVcXžœ^¿FȆ“aªÛ:ǎ»²”𾑧"crž»åÌ^t:Åa´W4ñÜ_$ÔgZ8áµn¿Ç>™$œ]H´FÇ°ÌÙtirO˜~¯r+–Í w•Px-lÝÇËGš³Î‰J $ŒÚ|FÝí:\ŸIÙFÚ:52ÎMXì›ÊÄMˆ'?zLÞSã›àÔ)ÁÒq LŽ(—H‚õîLo~óÒË\pÝú,| '´’–«Chóê¹RÆ…çgÁ Z&|·E•A87DǀÆç(uä%¥5Œ4¯›¬“ Ããë 3ù‘9e©LfÑlsy)MQöœ¹ý¡d Íy-gWP÷IÊþ•3 +£ƒˆ»nîN]œΎ›šeˆg€è.f³éQ…±ö÷¹-R +‘“øՖ¾éÒì¾ Õâ~‚ôË£‡UŒ°óï¶ïÄ¡ 8†á҅áÇåÚ ÚÊ[Û2¦C_º¶ú¶28L=RÜàW)–Sàó¢äô4b£®Ÿäe `T[rœeü~xç8`5s½- +ýNªöe ¼"@H@àþä+V4·E@8N™”.iÿîF֓õ=!† bÚÛ ã}Zdd›|<äÍõä5t:ºÜBÖz=§tYz e…Ë$JÞ wTNÑ^½B }@ª·¯„éÑüzbâ”‹o( 7þ·ÐœXÙ؇ïõ£V÷De:ýLӒE`+wQK]¥][jâô>ÀÊå — Ü!|} +`Çl<ò¢}ŒÑs4%€ßró™HäH°ežy¢Tål}1 *žØÁ0T|d_z1RLD JeQêtdgšŠ…—'æŽïP.N«(ô tUÙ>sˆ‘§tÖZì;ú™ø¥2QêƒjCZOåú»¦†úÆõ¶žl~ª=x_„µÚZ +7A_‡Û –‡º¶cû€5··ý0Ìè9lY·“m ÝwÎCð¬ Á™šÞc¾`vuÑ¡r‡Ö}¶ä£ڂ›ÿöÓø7ü©u½~¶¹m7®îÈ÷SÑ)3ïŒæ/ýé EmNS{ø\ë\:ıkâQã0׬‹ªßú(S¬n¼07ˆŒÎ”ɶl¯ø®€ê¦³Z‚wçmŽÈ®Ñ%[Dâ¨øý(™útöx£Ë¤Ã9θ$ZŸ/œ–eÒ{¯¸4긢¤ +¦Ë×F&ÚVÍãGI³n$—,So¤¥%0`ÆÛ:aÍWŠžž}ß1+e¤ I…Ä73žÀ¸ü¬1éåx«ù —GUa ¤›Àg°Êû‡©Ñã2¥:Sú¾Á=Ú(0Ô]ÜUŠxèç-¾Ç¯ÁÓ&2[WŒ×TŒ°‹‚nýû­÷4‡°n"föpuõz,2ûÊÚ: žüo $rOZw?L7 +³ÂõYx‚J­¸z’Ü*¾&ül¥Y喉æ§?|—Bzòî¹n “†º'N™Sð­b†\Œ–JÇ}ƒ’—ûJK´Ed,^ê<¯8!—¸¢¡î’Á»4¥Ï«Ìøe +J›:ö!´QŸ]PL]yڇХ|x Á18>B:bú¬TI=„#½,l_à’C¨(gôõŒÖ{¼ÃVÔ®©†I¤Z: Úh r𽄍Ìý‚'Jè+ü ӟîТ‘%·Åœêì f|·z+ –^®Ë:|Žµ¶î–_àŒ l{Ìç7Ì£;õ«\wÓh‚ÚPvx4Û¤#q’àÓX»ET:“%]bá˜(|*ú{㠃 ÷¾Xn-[ú{å­§¹É(̨̗žç©ÏÜ•å9á3Ê!'} +•í•þQåÈ;H7ïõ1¿,€x`ÝÅÊiB.LUKnSƒá}ïazë%‰ð„…v^CkÈê\é@ z™1‰QU_hl¸ð¶›Y„Ç-L®dJ 2ãq ðk­@ø uLã.À‚/Ž4¥@–V5Mù1&ç¿KÑ¶‰©×l\šôI¥¦UYß+¹9Ä£ûab.ÄÓÂVúÜWxÙwVðÑæ_ö`#õâÌùúbG©1f nvÙø£#´öy€§Š: };¦"5Nþ°¼Ùhø=@.šWæD» H»Ã·ÌA§—U°P Á +.YÅy<ÿNƒ¯¨ä‘c`bç>NopF†6µCÆ«ë•=~ ÎCNŽW‡v$V+vÐO҄›‰§6BDh—áŽùŠ¡Bš$ž›E@—ÕÝ2í iŽñÈjg¨ ërÅ:3¹ çþTïÙ¶ÞA?o¬J¡¸?§é·z¬ŽA,'gÄîüïÁKæ8½O×#6£× yXiS×)T× iÖ3ìïvµÙ¯l0¿V‡h'Ç>›H¨‚¤á¢ÂÙ©ÿùð÷(u]ÑúÀ«†ùWdã½ï¢B2Vgr¶y¹&¤1ú†ýõú­¢*¶ñSƒr€RB¨2‚`ïcãúÇéXÙ°ÜãÛ£u#azѦõKøùÀSÓ¡‘–c¥uI°³qœDös³õ]ŽÃ¡ð氍2¼ t¼ÆUxo]RÊmx‘q½û-Aj¯/.¶!ªò¹Gýk¥8[Q¿H™V,ù3¥¼cɸ’F ) UìêaYrÕeØJ $'»Yw–QÀ)òW‰WÀ¸ï!B$"‹ö~Ü$Ìĝ§mª<)Œ&e¦·É£<+Eqç +« bQÔΡòf$0„“:=D/!(†Ìž&‚Š®[íT[$<©OWÂߋC.ƒFÞ½±¸¢$|GzöUBð 6º‘QØ[yú<“âí²¾šJÆç„õ¶ëÅ[;ûŠ¦†îF(ÜØðt½âY¤â …Øuèï´É2Û×:œ‡E¹Á2öukE¼%SŽi”ŒyCÎY¿†ëȲß7žwh9)Ôwm…ٍõU€É>^ù•Nf.as§Ólcå­ ´èÖbª‰ý|MCqÎÄnjmbß{o÷¨ 4ô›£~KÌ69¼ÿˆr1U|¢ë/¯Aâë´oxG'uli©d²ÿ½„åšz”6@…#ÌÒéÔÞ86ìZé>¼+Ϩ`ÛŸÕ ÇŸº„ÿCzNMA$ 5OÏø¶L\îQPñÙmßsTµKÔS*³p|‹7¬ãäâá“ð­hp¡lÖ;Ô_¥÷Ìd@阠O:àWþ·cóâb+ˆ+¦Yøô>“ +›,÷vò±Ç'Ï!Œmâ¥+Y¤;x7õ²V ~;}X®¬ìt΀•È`Q)v{œÊíÖ6ïÏÌì½ÝÇ:ÇÙÄÆQ¸š¥Ì&ͤO œ¾Õ* tŽ¿ªé ¬çSZ¯’é¯ÅJ"÷å²Å#~5±mqµÀ™sæêP¥g VÕٜj¹ŠÙÅ?‰[)=ְ݄©8öR¯S6O‡FӖYæÙ:¨ž—4|Õx+>—MQÙ#ýfÌ:µ˜ùЈûF‡hÞô2ü€–ønt3¸ÿ„W‰zT…6Íß퍪՗% Òä8xÑ۟Ìçýþö}pG7q!õ{é²;‚G⪀:žƒNtêapžŽºE«ù?Üß}È]j£h—øµÆýë+ÞÎïÆûùFÔ^¸îâ_´¨6ÈÖm>°~knéÇ°Y‡Á4飋µšäÜ~jjŠÓâVúQÛzë•år6” ?u²ÓÒ3‚?™øyx´#G“½PÓ,AÜ«£.hü +[Ì[=%¹ºëm&áþÝ] Û;Kºb'r䎐†zYwéï…Pßèw¢Ã'dO æÄ~[® Fáž+Ä<àÿDçõU¸1ÝJkHb–¼©·Àú>nÔÝ ez›ŽK5ºŽÚ0·V{lטc&>avyÌŸC}.CÎߒÞíë$‚#·Lâ6Êãí‚w_r&ëê¨ZVáWÀu“’‹½­Êb”'ý¦nâ0«Î¢édÕ«¡È ˜Vñ¶7YQ &N6$’9Ù š9q€ + +£ ±Ï'Áþ3ƒ@¹òö£°öÛ}%Þ<³töÁaF…•…ÑBôb~ÂgÚÇÅOÝrAïP›¦,ò ‹EØ4h9ㆪ’V°ˆuIF{›‚÷·Jõ‘¬iFFvò`> ¹˜‘“†³#N}¶q}u$õ¸&¤rr Qҏþ½níÙÁˆÞwèGùÈGéÞÈ z¾ˆYš†Ê0™¯C§ÒwÂq6†Cø&xkÒµ¸º<åè  +X?Òsjp%+ò~et9³ªÃ7·bõ +ãg|œÇBM"ÿ]µ÷$LÀþ¸)‰°6a^XÓä1ek‹¯^o¶ +šÈ´'BR#”ŠÍ†z§ú\´†hŸQ=¬üZU°ïœð ŒÞ¯ýxžå +[ˆ¹¦C}ö +Zø–JR( =†ÿ¾€E¶ÎÐ?£]7Öz±¸=Ž=çݞÚ&Eób—ÈZ"»\íéÒ·r…ŠA¥¶nûßü…Õ5”.dkg¹YòÍînŠi“Ôþ½%NÄõΕüƒf1C]$ž0Ô$fýx¿Žá=Éés§oE0ïäß¹½^y•t¸¾ˆZ™/ÉB^‹¤)Ÿfd4Ǧ‹¡¤3ôì ù³Øü¼mˆ…ËW#ó›$FIØNc|8\#T^ÐÖK }8¥£O±žèî²ÚÒ_õzÓ$æÊz»lààμþ–Çf3ìTñþÎH¢‡H‘³‚¿ù;×Ò­^ƒŸñ.P„ºҘTwû²²Än¿ÀëÒDÈø»Ùú‹(U»³g—È# ƒI$ٍٹeœU×»(×Xº×fP€¡L$ß;îúI)~ Óêƒá–Swên®Ue}5ï“Ë|–›šÏÛv¦Ç“öƒú턐`||,í4Ÿ„#†HŽhüió[)ǘo?çµu牉_‡2Œ5 zs:Ïe7Ý[Yö)yfWO¼ŽúMJ¾Ð²p W\-ßÃs÷eëý¡$2Yˆ~@sû;-ôN¡J íVc=KÂuºâ¾/:BQJ·¶®·”šåM=.helèãÇ:UVK¼å̸Ý!ÍU$4vGQ‰&«¤e—žÓ"íç'ëOMOweEî>Õg­Å93³|"àUμ@œ¥TIèïøÃnÖ"Þ½ç&»”é½hh×zÇ»fÎbtìÞ§ƒXÛûb…›{.œlÙ^N·MÏngúzëUÛ͘$é¶X…)}({oJ-¨rLˆÃ¿þrˆÐ}µì«3 Ö  㹟àox2¾Ù쎵à½ÏãíèeäÓ2¹c¼˜‡p‡ÀWÃxÊfƒü#)O½>#ù'ì;AiübaÁ´¼BLºCÅÝδ ՟^LìRY,6>䣶U4vƒ#>é}4ðïNô4ú€rŒ[{§ŸW„o’Ÿ°··~ ÃËÅrî-"í/èÛîHሜÜS6×í õºÇƒÀõ=Eß#O”î)£,X|¼Â,ɒ(æIty¤ˆ(;2þ6…©YÁU›z˜€º¬¸»’OA½ð4»Ð¼kIBý=|+فƒ£º2Õ5Á£€H:,VJïÚÕÔíè~+20>•šAq4€á†%R+‡HWù&æµ6šp¥c<÷†,~ŒÖ‡þ]T³Øbõ‡ýY8éve0äqC^–Ƥ6So«M71 £ò™°yá O=‚±Ï…ü±wð0 ÚiøTq‘'[mCù]ÃüYV~Cෛ´j½xqæ-&%T\S6A֔9*¥CL¤f'JžgýPö ùÜÕ.Dê ¡‰_帏?¹x~"Å[Y† Öa*y"{ºçÔnŸçz¹yQu—4͞ZN Ó¨ˆR{$BšåœM¨Î6ü¸=½ + 㩚̗áý†÷އ øN„"¤dßs›T­ +U—pì®Ã`\Ë7·‰>§‡2ö]šÙS±bÔWvá1\7 2z÷5À•M–X]áʌËB(H82'â¬k Œ¿å‚ +yÈÒ>8øçuõ·ó›6{M0'#øYƒšŽ—j˜¶â›†Ž}Õp>üÞh‚’!Õçªó¸6„ŸÙ\I=u+-À;ú¾ãH¢‡zêÊ?¨1Ew~®»ü‹6ý)[>%ƌe'oxEƒ»/j' ³ïµY€ù¾8Ù+aÉìâÞÊ7^„ñˌÕahý¸÷×KÄ>±p+ÌÑí?[£»ƒ @T +N5iU)‰ž|~#³O2Aºrk삏*½G7|ÄA¶ø±CÉB£xvù–¶ç?tøËV{¯ðä ÒB*öÉO¡Ç¶H¥g†÷VÚ¾¹7¯CԚ³Ï—ßC8X²PaZÞÈ))pwõ>LÖUv–³¶ãÿ†ø—D›\#%gÔZRD\™GNÂ{d´L¢8:lêÔyŒ¼¥§:ªî~œk.[¾íò‡Ÿ–Íèlß{ÕmC6>O°J?ÌÑç'¸G J(òنEïY‰éÓðB˜ªl”]kŸÈå–°à‚»?)dU…­b¹*-ÅéóþTzÞ_‡eèð`¶§я¤ªÜçiG1¯CNÓæ'u®‘°ßäGÞ³vÉ!uÙv(^D{Œ£DѺ~:”ÉŽFÛò_7¤˜áRm‰E±- ©àsÏÛá‚m8<¡@Ñý݀Z[eÖ1"ôšÐ¼g4V˜ûùÞdöъôã×ÞQy²‘‹9ƒ°$O§ÊòŽ4Ôe~Ù µ +ÿª!hzŸ>¬c,Md÷´&täë‘c2Ý·íª›ö€oÙ5êÿ9$–ôÄoT¨Î㡤ߺنÆ敵Ãþðo˜“Ѷ$º5{— +?Æìh1„‹6º¸é섉[”Cû¬Í­•› ?°£Á)šuˆ\ClrÈ튄sëI¶Ã2O•c›±ì +¾¤¸&ZóÐüdg©sÅðI,^ +E /Aüí¾#F,®ªbŠï«”ys?LƒƒŽºp$´:ªíÏ;£«Hºƒ:cö|_e3èçx/£È†­ü֞îی4L{«;—Àú´dàSS~¬k|ß{{ŸLQUÇåÚT>¾¿¿ë†ÐïȲøj }pn•e“¿þîS>áÌë*³ºÃE|Ã#\/¾éc^!¯“¾e¬€î՗û6øˆÍ€ö$ÀÚúŠ÷È¥|Î¥IeâškÔäcð¤ÆÃT@šN +¢‘™ Ӓ G…—O»ÿvY Ä}›ž>/kÁT ?w9öú ƒO°‰dG››HwEÄ¥»öo=#s¿)·溷ŠètgB_“°GÆô›õ²dóšëïvq£Vt“|²úvöBόie·œÉ9\Tž’È}Âf¦/ÈÿÌ¡£ŸÅµW`4 œŠ!TÓt“)Mtm.cŸsÈþ|âW™ÊšÒhÝ[ô‘·ûçžú GQl¼ác˜iÝú%¸¯Š;Ø£Õ<´„ æ&®öý}t'eœå±ôw»Ë¡Î·çtÕ_òsýDJ;rîӊ¼8ôQ?Òë>sff ì2÷y¬È¾µtš‘æ +²þ8;%ý„\[ˆeÀЮ,,r7ÍEnËú([À(þ +…½~À3ÏÚ7y¦†vì[ÔÉñ®B;g”,PI$gAGai¡ÍV-¹Ø¬H|ù§ÞSÉg»-ú6 ôàÃöµYRêå~Œ‚ȲúÏåsŸÏ©2Ɵ”••È|»³Çú(ÚdÎm;¨…\+EøeÝ<ˆZ¼á\Ÿ\J°FÕ²Ï +ŽHô¤×Ä7´œxx3fޟÕ&&(ù1ŸÔ¬î´tp"4z[äË"Á¶`ï7Žß”ŽÝwfÌ÷ }f–œ•fàƒg×8jE`yØ¥Äæ`±Àœ[A· 7ö9±Áĵ‹à +§ŸÆ9SŸÃ¿ ['+…·lÁmCRÌð惩û¶&ûT´`vj†hD ƒ´0mMA’BÔ¯õˆ«€UqZµ­äzÖIïœò|º¡âhˆ!~Æ-ð­×@Mg†ùüiyç-j¾ì+4œ×Ò£ ±.5ÔÍCóàõ@¢ú2"¾,¦ò =«Ùþï®pÛDØB—8'×ÅÆ®if´ +¼¿pMb×Z˜2(Ÿ'9D/ÈK´ vM‡òœ ŽWâ»F§/·æñ£?3¡wTr€jÄùOÆ jc®l’ Bb¼ ÜúÙ0Ï]d­yh0\"¿ÞÁñÆ^f1¡¼Úíµ›{‚‰À„Zb{";_kN¹9ë畱.Zò§¸®ܪecՙNÊîéÚ®kÂVž¤ñe“Ö´ìOÙâjЬ¯Þ.ÔK;p¾zj¥m;H5­’LÄ>b1ˆSl1ª¸íÈÇHÅð`ÖÑùØþ æàKxcšÿ:pDãtº9Šò#¦gÊÒo™ä€æ»3ÙÓ`C“?æ"ÞÞݗ\.ŒDΎïúrû)ð)™ÕArËÆ0K±î9)Ô—Þ © KæRsy’à•ÈëӕöúbY©ÉÜJŸÆL˜ª¸'M‰Q‹#Jað{xÁõž”»QÞâÖ }Í!]¢2$-¾†ÄÂ6ÑiCmœ*[ð˜(t@šä0ú< Wª·nþ,Wëþ.d³ÛJꍻŽEJ99JºZ«QH½oòvk×¢×G£Mòb(™w¤¸¥Df¢¸¹¥ûØXó… »³h&Ëó.ÁbŒ‹âÝáüZbJâÿñ÷—1žÏl¶k*í+~ACky¯S[ º?{­Èe× ¥‘q¨T£°Öã-2Ô{TbèñG×?9Æ +lq(&'è/!³]lǍNßÂröÜ(5k¡š™;¥«µÖ(§ 8ž$%;˜3¨‘âø_~Pþ?Áÿö@3g(ØÁÌÙåÿt‚wäendstream +endobj +925 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 49 +/LastChar 121 +/Widths 8022 0 R +/BaseFont /PQRBRE+NimbusMonL-ReguObli +/FontDescriptor 923 0 R +>> endobj +923 0 obj << +/Ascent 625 +/CapHeight 557 +/Descent -147 +/FontName /PQRBRE+NimbusMonL-ReguObli +/ItalicAngle -12 +/StemV 43 +/XHeight 426 +/FontBBox [-61 -237 774 811] +/Flags 4 +/CharSet (/one/two/three/A/C/K/M/N/P/S/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y) +/FontFile 924 0 R +>> endobj +8022 0 obj +[600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 0 0 0 0 0 0 0 600 0 600 600 0 600 0 0 600 0 0 0 0 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 ] +endobj +621 0 obj << +/Length1 1647 +/Length2 9838 +/Length3 532 +/Length 10715 +/Filter /FlateDecode +>> +stream +xÚíyePœÝ².®ÁÝwwwœàMîNpw .Á œàn î—|ßÙgŸÚ÷ž?÷ì_·îTÍÔ»úé~º{=kuÍÔÐRªk±JZ9[圝 ¬œlBU£…;XÓÙQÕYP™Uhã®1w¼b¼(´´Òn@sÈÙIÆè­2@K€SPP… íìâí²±…t4õ™™Yþiùã°ðþò Ù8è^<€Î.Ž@'È+Åÿu €ØÖ  @ZMÝ@AUÀ ¯ª:Ý^›Pw·pY”A–@'0`íìpø{°tv²ýi ÌöÊ% ˜À.@KÐkÐËèòb¸ÝA`ðë3ظ™;A^÷â 9Y:¸[ý)àÕníüWA.nίŽ¯Ø+™º3¶t¹@¯YÕeäþ®bkù“ z…ÎÖ¯žVΖîZú {¥yE!æ '0ô‚üÉeXÀ.æÞ¯¹_É\Ü@•á9Ùü³€ÐÆÜÍÊ¿Ò¼rÿٝö ø/ݛ»¸8xÿíü—×ւ€Öl(œ\¯9-!¯¹m@N(ì΋‚“µ3€“ão»•»Ë?0 Û_ÄðçÌ0¾anåìäà °Z£°«:C^SþïTfû÷‰üoøß"ð¿EÞÿ™¸ÿªÑ¹ÄÿÓûü¯ÔrîªæŽ¯àï9x4æN€×YPü6æn€?dù¿…š;‚¼ÿ»àõÖþ]õpþ+üw +I'›W…X9yÙxÿ6ƒÀr / •:bi °6wxݼ¿ì:NV@7ðUä¿ö÷5ˆƒã_0m[¥½Ó5xÿ†€NVÿÚënuÀ®­j`¨¬ÎüßLÛ¿œÕ_ODÛÛøLz*ÎVÿ¹øC%%åìðeåä°rñs¼^Æ×ë(ÈÅóþÿö/"ήUÌ!n /€'àõóﮌÿ…FÖÉÒÙêÏ9҂˜;Y½½ÿ4ü-ÝÝÜ^ÿk¼vþõ_—ôZ¢,þp¶µKÍHƒÔä ŽÉõvs†¹×kæV9w¤F¬ –›=V‡±5L=·zϺN!¹ )†»KÕYxtwÎ ¼èNÂ;Ä¢óŽ ÂëÖÕ®T§™È)†÷ªñ&ÜubߍÃgÃ>ì¦> ÌYœdE!‹•‘PpÀÐTzÅéòW º´®K¡õq*dµôƒ/òßàìÛù™ pÖËÏ{½åô\§ÝºÔ÷¡ûYã½ö’°1ä6·õ+Ž՛©J"6Pþ‹P R¼üì(.Ã؛äaÄ·ØøFï°Ç‰¡Åè)Py¼mÂl«”%Ï¢¦~¹ÄY`Â*[ *f¥Ø>')T7¿!”’Â5ËY“LÇeˆß€qW›æ™¨Hg‚ë¶/÷ÙF]€7háñ$uGdÕÖì÷#G5¥b=È=­>%šO~á7$'?¯:!é¿ {¬Úˆ:Ö7&Î +¼$t]-4=#¯ +ˆä$Lõ=RÉæyGÿM2g×ä­V<ÿՖگõ¢iòkÄTlƒýL‰üy¤y9ý2­ ÷ôþ¬ËÕµ:ä|¯g³Z¤ŠÜK;štø&Íío]$6 éñ~Ëz4)dœ0GÝUfie}W‹/ô×öÖf@ƒI§ßlìoKU m)N öu;0•ö»g®°êý4òìÞP™T©goßBõ÷/•— +Ä·sN­Š?¬qx<Ô,Ž°és±y"v̓Ö<\™ÞV=>DŒ‘ÄçÉjÁÊtT(ØÕ-ôØ'ðõؖŠI¥~ÑGfà (PDÞÐS3œ‚ti¶ãNïò^I ¡G +ÕBi|°ACh·7‚ÈCG›n¡®Lí/¿\×ñ,†1¼XÞqùî‹ú#ÁÜa#ÙtL[|#ÔÑjúåìYLê/vÁŽ5ôqM{ŒÉRAãd²é!GE/±Ð¯1›;µ‹¹폵sµ)¾qN1öíJ0ÅbêkšjbA±Ç£ãqe£ÒÒôÓçJ×íP®öòl€÷ y Ԟ6 kóðŽ.·}K,Ï‹¯¤ýžÄI4›êö~Ð,jO³»BìÑ~^Œ¬ Æ@GLª\|-ZŽür|x»gºÚjUˆÜ¸Ó—ÉŠ7ªÃšÃŠ3Dßð~´å·çx¼)sÖÆ´/|È[l®D(b‘Š·¯Q!n«ÎçÂ8›'Ú=4­QÅFa"¬=3+ü.ÕaVFrWɁê~*]Ô RË=éò,Fj”ß­Öv[ôüPÜ՝ŒDös?ÙX®W‹–é&Ðÿç¦0ßb-, a+1¼µËi.˔+¡p6Okì‹Í[ÚPË÷îãk^V{Ï?<•Ì›×¹l•‡y$6Jj*|2YŸ×ÅP®VLeðÛ4{i´0¹²*ƒ)z&}+ósù¶«ž>sÉ®WjCµ¥´,ð·)â5ç0÷­\MN¨²ðõ€î¯`ŽÃ>À°ÖÚ¤¬ÊŸÍGV»¹«í±JyBЩ¿?k£æ{Å$°:dš2VùEŠ/RÎ^éD€@Sþz‡^•&h“Î+óJe¿ÉÅÄKùRW÷pqRo¼ñ±9*<òwØ՗Õà©O¦?žx$¸Õù‚ÂpX¼z¯µ¦³¡¿%%£!%CQ㪧šnˆ; 0Ÿ°Àr?Žð9.½¨¹9DÃf–frT:JïâÆÌ-Ý…‹Ê4ԅðìv¾hЧDôv±_âtÀ¿+Ðë“ÔùòÉ<òSÀ‡sbð yYÔ©éÓ( 7ߓ/Ûе=,Y|>¿;W§¶qWϯaÁM«ä&`m¸iÜ~)¸É¿IЅ:ፆDxv*ŠÞñvÞ÷³Þ.+ç ðÒ j6aè§lÆá²lVGÄ©—½|ã 9¤‚‰ŒPž`~þ±ÎçÀY~)^Q¿˜‰Ùk©k°à ’=}c°FâáŒXq_Ü.Í{B‹˜sÔGùÌXÙ`"'ۙx4”åÞÍòKWñpO(ØnŠsªnéyÖv¥V—ã wu†YìÒ _™‰Þ1£(ÏGÔÑô„r'«{|îòu’m¸µQtÎwù¥¤ óÛՀÂíG. Žúi4‡¥ÞÌ£j³•èïClº]2È-’5<£ÔÁQDU 8H¡êÂ0aßî— +\I腽ï\‘rïW^4Åᖅv­S®ÞõuX·ˆŒv;RŽù*ûº'~\w¯§lJ" ¦ÂÛ|J:Pç›æ¤×ñâW·ÖfFå灅˞ž)€ë|SmÝ®øÌ[ªÈcn=§§qc΀¤?…ïò3F¸JÒº–Ö­Ò˜XpkÅ à¢iî>zXä5Ù?ÚÚ¹nC÷͟\vبŠwM t琒ð2…0r‹¡Êí%@(…Çq¨å‡ÛÆÞ´d AøV[àÆ^%±z‡æ¹[»:›mM¼j1’)n2ýÕ1XóY-^Z>öՑª` O¢_bAq9UÏ;§D‡LEýøž©ž*."B”ȝ·¾~–ß•®nO^7Aå8äʬ—‚¢Ü̺²äÜç×eý9ݚÿÆJ6„¾0–Ûhôg£éݔÔ°'ÁŽŸÈEM ¥©¶>ÂMWß%‰”Ç–Ç&Þþ³‹ý‹ÌÛÌÜ'³ÞÒ FY¾¾Gk²º®Ñq|m”l‚G^o©)ºC#´@…(¿†ÜX×8˜ñ~U5³_ë\}Â?ʝœ¶''÷ûĖ¾pO"týˆOJÍď3ÁQ”/Ì#øbd]yµ—DÁ1à',Ÿ´á/ä^+ã æŽÅ#C– 8Ë[û¡‡Õè½Þ„!·“0␸ÈòÝL[³OŽ•!BÖÑ«íj{ÿ‘r±kSó큛àl˜`Þñý@úNáùÙd9=CzB=Vr‡Q ñ2Üå7¥õoõe¡™™Iàb˜Ÿexãî_hXI¦°hK¨KbüÁV3,U‘ÃkŸ”hL:{ Ï‚N-UQÁ„º#ŽØÉ#ÄÏX¿ùòab´Äqˆtd ²?°‘Íïp fÖ g$³ B?+Ë͜ ‘cíó¿Û6SÓõ^¼ò ¿–…»ÞE·ÿÈÞøcÛp~·õZÆT/yÕ¾¼·*JëÖTSÿºwÿ˜z +t€ö9çKAh±d£$‚˜â¸œÍ„þâÖvà進íóa¾§xOWS2LÌZÏ}üWÉƚL: 㚝ءÑÜɼoÉv¦íÈS´ˆ-Ôm©áï ¨¹æâ¥Îà„îu˳ “Öùڀkx] dT×}iôvâ§ùqsƺ§œ t«Q¿ŸoÛ·ÑѯÏ Ns-ôQsòȇ¹äÔ3¿¾·N¶„k¼Y‘æ‡x¸ÀoMÿõ¥2~Ÿ ™*$õq gé©le“h–œ½ZÕÞ2Gˆxk,ˆìÀá)wòçéó9¹Œ›¨Øˆþæ"¿ÑjMŸã­Ï}XIs܊šbÃß̂¢kÄáSû¢IÙÞ¤§_Ç-ÄC­6ñ»Í‹ð­3`D/¯½›½Öö·ø\Nª„‰o¼ßw€™¦Pòh6J‘¬îõ›Kžî%™gyä2=ÑÇé8Äì[â/Os{K¹±§;³Æ‚ﺰ4¤±"Îi®lX…±‘#$·QªvÂÝY?ހw©0\{‰‡/ =í'zºÁ1®9 +íµå†s¤„÷;(ÀՉ˜ÞEsÕ·tR]ßÀWÝ¢Âüèö»¨NµÓ…܁š¢òŠ9&:qŽC—ap7ÿ<ú¶Ò +]qL¸³6±ˆM*6§üŠŸ¼çÅJñ/Y*,¥‘·l®ô¨FÜ3¶XqU' …SÑ»¥´ÑWa>N§ñR¿URÉ+ #ƒ*>×iÞÊZZ#ÐƎê1ˆägÔ.TÇrCåöÐßø儘m-ÈuH‘a…ó8øNÂ>ê})[»ã1§ƒ~ª5‹"YyÞáù­ Nõ·¼‰CÁÑÃÄ­Ö§¦Oé42ꢒÁùsC҉l.Ó[Ì<î3VOèõžÄ‚YX\ïJÂÂwç*­Ph» LHq ­!VîÉ·I(Þ$}¿õ#¦á́Xï¸'&ÕÔîâ®'VD ÉîJL wwZìÖ\ø{½S­[Þ뚸i V: Õ¬÷®kŠ +uª…Iði5’×¼î'†¨ÎÖH +²â b±ýýybtT”vœÖýñ÷‰-’Þ®—_óµ;Wº*ǑqxÒpüÙ7È<¤I¨KK‚É®ºÅÄ ø'Šr²ÙR}ø—J›Ï×FÎi6-+˜/ݗhT¡¦©þV­x ëà´ðŒÞë¥&‘iYúÜ"}²þ`úÀE;þc¸È‘a¤¿6å­—Ú™WUzµ›âeö¹ôÛ4±ªA…-#CžÀÍ/á#ƒ§ø4Å$Vó0d«–i[ÁßÍ«¿ÙìÁÀ|ME͹T‘*Må*K—÷n',îÅô—\ºå)/…ZÇTƒ¨N[Œ&§sRŽ¸§#=gãM*4BSŽ?««ä*qÕæyBïN›X–í(|°e \eú•Ö‚ð¡GÅ⩾6™So1þ÷ñÃq²øÜe½~o$|ZɐxmŽ€qf…ž®¹åãD/žÏcìt|ô´þÔ`"BFGÖœõórZB£uâBŠ7öÃt…òd²¦žÑƛÍh°ÙI>7âŠâ^•ØϪQÀl“ˆ(ŒQT¯Ü„çܤÔ}wó“è‘õK'BڜF¤"ttr!3<_Vnïwñ¦]K#ÝJƋ<]Téa,Ÿò!Œ;‰nµ‚þ\›?Dxá¤6±Œ>~:òƒzüù,þÖI’¾<];´’–«lJ4ÙN‰¢±á\½ˆÓ¶Pp–—Vù¥ ãý²ä£Bïáõ@ǁØ!Ô¯Jmí[ÆO!ó/m¥Ñ¿Œo_¢³³A^çS’1ã7Øì~8Æ«ŸlÊ>8…HœÙ°XAÖ¼9ˆ5’»]‘Ir×$!KÁŒÙã.>vjœnQ’ÐT¤1mEÂVCmB£"ªÁ)P¿‘â)½›O®tjï|WüYŸ—c1;O¶š “8í¡ùÀ1#ûdf¡8ükä;ӋY¶¿ù&Ì?@ǃmù<+xi¹w‘t½IŽÁ®'ý?=ç¼ßÕ'“Ž›ä×;錥(ÖÃBîàPA»ÌzÁºrO]wLy…Ù)¬)êwì8gè[vS³Înöáù¦))hfˆ&¢.ÐëlBˆ2¤'ˆã|OÎކ§y8iŸW¤h‚¡å(êó_kË Ò°¡#÷5*F#¿6Ä0,,Hêcï­ð·¨·(ÿúOÃqõ¿ROw4 ª§$Šcºš–Ob3£K”AkƸӱ]ÀÈÌ]PA‹zî[ÑÐrWÎæË|/žÐSÃ搐³ÉÅGŽ¯V­X§·y6£Q{¨ÞPä+¬ +ê¨~â2Æ^«¼….êíxÓ ^øQ0¼Þ1Ž.‹Y-|CmxÂy ÅWJ<‹¼äxNfts~ðñŒçÊæÂ` :¢ƒã,éÄ°.zàÜÆöo}> ·ºjÇe­ÔÅ«µ}Ð, KˌE¬¦ðÉɝÛ&5šL ºÄØõ»1t¢”¾Ëè«0å¢òN‡ L9OÔ±UPœòÅPûeÏ"uëYñ©s8HGRޒe"ö#•þ6ó¹qÝTìX$r+->ÁÍðáîtƒ"®Ø»§&¨ÑƧ¬Çû…nÊüv„9…ò:³Ú2% ÕÊí˜ýžæF møèÆuLÑ«bk-føþ|1ùÞø¢N}eüb5þˆüøÝ*þ+D`»^SøŒN“-HÚCÕʦ‘·¸äqtž‰ŒV† ƸëgË3;Z‹gîºnBùDâðGc\ؤÀ¯Åa~A20pVæmS.ð‚ünçw’c,u¸óöËe_¶x´ +¡>›¾P”fë5~aON²H®¬ý¼¾?{®•ÙÖ¸˜{™lm‹«ƒkøü3 –‡.Ò1Î6Wþô”À±ÍÄÔ- f±ë0+á¨Ä´F%Ð_f_dª® gXá·VׅqLcá.>ã§:ñLj“BÁ)šïoåYäXÑpïªVeV·Ö€<ýÙvÎP_%¸ˆ 5{¿õ5¯(25«œú:Î19VV÷’®ÅÝ!ò…-':vŠû¥á‘÷-¸µ3RLæN•¯PcÓ'®>Æž¸°1Ì¡@º‹‚v–‰7ˆm3ÝÅßËϼGtŽ(Î.V©µÓ·GÅÌE4Ê,àçôö¬ÏŠX ō@­üùQóN¢b­¬»G6`åýf‚À³—¡·Z,)äýé1ÈbÞÿvÿ°xá'÷´zKèéÖ%üÜya‚Øæ&0"@U–x +m[×Ïa@6̓$žrPÆ㬿6YԙñÛÌ~ž|Ïn¤CêȽSO—²eN`„¥®;›R¤¸qXVÂKò%˜ÆÚÌÓXŽŽûùëæ¹Ì®³BUÑGdòY¢y­{¿EòùóWŽøú O{cvœ+2œÞ*å ½Œ4V²Z„‹ýl—ö—|üߧ *“ôF}äþ§ ¦8ôOˆú&UvšÚ "çË׃¬!¸°­ø¤F&;ºË˜hČp¢Ž©*”ë! +-,ˆ–ÌI P0ÂK@ˆ€ñJQ4ùü¡êÑøaƒµJâ|ÃOàS€ +Ⲩ~-ô×ٚ"S+ê¤Ý!ÄæïèØc™ÅXé›ú·ßØ¡4‹€lM+´”5E±¼Æ +åÐ Ö¥×½O¹ cŠ²æ|M•¬vû´ÁÛ(¿‹;75oXDë¡Døޒ$_¤¡ˆ³¦Lš— ±e䝀²¸/ß¿\o¸“3øgh$y!Sh퇫“nçñÇ¡å“z—oÄ1[ßôµ°~yÒ‰Ä +Tà‚ïØ$T¸êãDT<&}90Ûhë&ÉAcúò¹ ïh ÐwÍ;C¤9y7*&"öŸÇpDið•b`X²¤|{…¤ÔWBÌ;gvï'»þÞ UR̕‚;dˆÕ…‚>¬M©#.ƒWèÔ²ÌDðFš·w+y–å>¦QÊ:-’?ó³vm‚D×±#¨©—ùó;ßè°sY¦Ö§¹œ{K- ›Vè˜0$!?’A¦`ªþ¾ª;‰>iö¨AY¸gl–·¹$…¹z?èà]=Z­:}TŸm¤ö‰Hyc·ٙXj~_ÑY ^jòây›ÞúØ`&¥.ېe'bEœMyh›õ¸/ù°õóJ'u¸„[4Úçƒù2÷n¼¤“×÷òK?rßPŞS±uÆÆó¯xkaR*Àsp +Ñ&Èî8*èFÅÍÙ_¥ZÒuå¡pÀm +_Æ »9Ûà}!µB3ÈØÇx ö˜Æ¤ÅùQŸi)¢7Þt‡dæB®øÓEˆôÂmß.¶³vý¦oÌuµs®N¾ z X~•+â7 ^#ž.õˆƒ—;íà1Öë¿^›fCð‰ý{HÚ´¾Ë$…¿·EH£~Ȍíý,Ô0Œ;»ÒÌ8LB1Úhz~ߏðd¤bv_߁H“eVŸœWsð+µQÈ㺊R;`NªŠdeà{>·þ—_mø*ÌÜùŸOû3­·K®„ÝO‚&Ë%–Ë-_¿Ãk£ÚHÿžçâB$|éÌ*÷‰)‰ÎöM€Dû–½¼a؜©hcäúž' •¬y—ê:è`TxeõÛWñHLuO‘{TÃj›!’˜£èöÙL}TÀ€¢ ­ÄþV“¡„…:œK5ž.¨ÐM*@vê5æÕGÏç亗§âurò½áô]ŒºHm)™:K±€Û[c8 4Q-S¹ë\™U÷žLF÷ê×e^¨r”YXƒPˆ‡­«ì³%ÕJ7{X©£öùOWÒæwþµɓRd`h 3çô+¹V—©¦:V¶«Qn‘FQí8ö}”Þ*ê¼|Áh¥Ò„¦’³büðÖûª=Z’gŒðŒ²¢;Æö¡Òœ{5´<)Ã? +Ês²x 7Uö¤(ûK+¾†ì§ÂÌ-ÐfÔ§U'®;¦g³ž—I<­€²VŠ1Á†mƒ"VoS[ ˜—Œ` +¥Ž6_S¤¢ùVƒtÙ¢]¿Ÿý”LØ¿ßuÕ.5?Øyµ¬l™óÎðóð lMì ‹m“Ô.ºó!Ž÷Ù*ûüòR´š6~çüÜ?òíÒB¤<¢®^¾° GЧ¢ð®´êá"õè$^¨‰°›Í—#ÉÅÁ„Ó2ÈߓïÔ]kþäÂ.¤žÒ®þ¬9ÞgÏ(Džû槤9bkQ´¤¿Ÿ'áãázÕ|Ù`ý£F$º¨–i9Jk|Ê ¼üø>Ùõo°ÃÄjl³m†RS Í×jålô:TV0Y pÁvŒQõƒt¸Z)·®9ËÜ ÖI¬U IÚ᳘‚ߤӎ¾—6`ùî|&é»Y2å[ä²}>9¯D+X±1,}ùüå®_se’×Gº3Ñý¡íÔx¹’:ôRÈ{0aIHÑچ@:¦Æ‹”e™ˆ½ÂD‰á-röÍ;N€¯OéÆÊíã›ï“S(œ¡z‘»®£ý‰úxKÒ€‘€ê_‡^ßå\×=lvÌZA#1Wyá'§±©m2­g]\˜5\¹Ô=~MM{—´¬|¢0 ®1»'† gÃ3êö3{¶J-E_i#́› @ŽjÞ¡)Û¡ƒÐtLÆØÄîgn.xáë…ã(nhÎ㩏pùø¨È¤uûâ)K?ñhfHP*s Ê×1»õÖa§)?Q~­9'îSÌ.¼¾Y»£ìá7°§!ʱŸvØ°ÊMjâ’w¶à& aßo]åшµÝ,€Š +ééi m}sZé‚þ²õ¶OLúNÀµ}Ù}¿G—ˍ Ã̃²ÿcÐKÑ£i-Åʒý:neA½¬É*n„ˆ`ì%õ‰‡Ô,̓žüÀ´d™c×ޏ•Úê¦ÝG’Uýëþ¼ÄÔ²LHxU±©,ÝݬMó÷Ýòéd§ý›}÷?4–÷#ÛeVfWÌeEΉѱe±TŒÅÄ-_>0|Éž]ã#•ûbTk|œØ֟o£®ìl6êX@¼‡ìpwÁ[Û°~­k¦q#ÁÕ¹µðEòÓ¶ïç7°€î`u{bÕy†Â<»Â÷X®ã~¶yÜÅk~¦æ¦F-%@$tXŸ(ð <2 )u‘ï”Ñp¾Ó•Df_\ЎÙ;8 ¥ì!¦Ê–Ö9LÛ#â›îH;'ô:P +sàR»pþ>Ú_hV¨IÆmþ§ÙLÄãWlÔ¬FsÉá›s„x™Áóµš3c4ª5žæx¡:÷J‹ì)™u=Wt^ø fҘån8S]å(9ô%±Æ®VH@èàU.†ò6ύ<:"‚ø=ô‘„µ§;!ç¯l)í[¾žèqW xïÛÅÉLìï÷Çî›ô¾·Åi!çíܧNܾï”ß\ã;äÚùæ,Ê8£þòÈÆ°Gšs¾:c£"z9Hò#ª!’¢cñù\Š£éÊ$u@ëŒ1›…‘P5¡{ÙPHFåsé64Ÿ8º‚5Î^Šx˼äÁ]Qö³(]†™ó·î¥‰÷ˆnÇü’Ð5ŽŠþò=Ë <ÀL?¯€E"q.ß±ÚY®;„-/$ºüâ8Âü‰$˜ß/?-Í-ÎæÃì[ÝøI»WÈäFÅW,ŽÕ-¶†}*HîiؚåM®@½Iïý’=-6³SaJ%ë–R°¬ÍíŸò?ÿâ®M\‘,ÆgåµJºoˆ)+ÐË-õ‚Çîn «ädÝv· ò-QZ®qdNød?¶s’£áùno7Ù_Ûý$ga»·ù|TÛøƒ„(ø¯ _ü]»×úõ7 *ó‡âàuêw’§ãÊØÃ6dɕÊ:©u7a€ßfôö˜V;fݳÒ'útƒÍ*[ΣÑZúpûy!´±Ԗv ,¯'åæ'}s +{Lº2?U«³«n>Vú¸…ú3&ó$¦Õ_á†ÏlH–Q%9„Wm‘Ÿ- ¯ Rº°Œwš½‹¦#¡”ðõ%ßgœ˜VÚ¹ß@ã"ûc¬ WÑȎ”§Õû?|–”;Ëv{–aEEX|6Å'øzë여)XæVk0¨¡'ž4D ƚ2¢ë.8 tFî÷©yS„då.ÆÍÖ] +‚AêK…H!Z‹¤ßß÷å/ÀÑÜæàüÄÌ°ÅÔ*>pk:Rö[֕fÖ©UºmH½=þP¨Î,ÀŒ´‰½3B™ÌÑä‡Od|0—^ô"l?šZ’„m€Dçç°¨£x¤—µGs£%*Ü!ó|[Ÿî¦á숭Š‡á²W ]Jköá{Ú·ÿâÂP²£Ÿ¡Cjðè]ROH»ô¢2Ò²|GÒ}÷r!¶UO,}¥¼Çù¡è"ÅAp'ÿG0Fߔ¡">òÊúœº”~åD_cck|%S¦®29¢\#“4¦ÒA¡ Ø!â@_‡:äˌöž6Ì=¯sîüve±¸Â+º˜afé" g#¡lÞO TK[ ZúÕaEܪŠØVƒÈb—.``ŽÛæ]‚ìuE§)#Êx‚Ä~Ä>ÀèòË)ü˜X€:Üíï¤/;UäûÜvB‰´Ä¢<…_‘V­SËçô‡¬¿5§âjU|@ÞNÜ1_e܉¾£²HPÈåßEúž¯Óۛլ¾µþºì¾dTWVSÈÝ£^ +jIà`¸VXð(zýYÙzÌ}ç}߀wX W“/|++.ÛÆ".IGy<ð>]ȳÊrÌ£¶Ü áJݏfº[¯Ü®¿ƒ-œö| +Y†ŠŒäkžŒy{níx§Äñ?|¡ü‚ÿ',€ængGs7{”ÿš‘rendstream +endobj +622 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 46 +/LastChar 118 +/Widths 8023 0 R +/BaseFont /TNYZLP+NimbusRomNo9L-ReguItal +/FontDescriptor 620 0 R +>> endobj +620 0 obj << +/Ascent 669 +/CapHeight 669 +/Descent -193 +/FontName /TNYZLP+NimbusRomNo9L-ReguItal +/ItalicAngle -15.5 +/StemV 78 +/XHeight 441 +/FontBBox [-169 -270 1010 924] +/Flags 4 +/CharSet (/period/zero/one/two/three/four/five/six/seven/eight/nine/A/C/I/L/M/P/a/b/c/d/e/h/i/l/n/o/p/r/s/t/u/v) +/FontFile 621 0 R +>> endobj +8023 0 obj +[250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 611 0 667 0 0 0 0 0 333 0 0 556 833 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 444 500 444 0 0 500 278 0 0 278 0 500 500 500 0 389 389 278 500 444 ] +endobj +531 0 obj << +/Length1 1630 +/Length2 17287 +/Length3 532 +/Length 18211 +/Filter /FlateDecode +>> +stream +xÚ¬¸eTœm³% ÁÝ-XãîîîNàÚ@ãîîwwwwww nÁÝùò¼ïœ9³Î7ógæüèµî«êª]»j×]«»)H”¿1ˆ˜Ú%ílX™yŠ c'U;E;yU ¹ ௝ž‚BÌhä ²³7rò4¦q  €•ÀÂÃÃO³³÷p™[8¨ÕU5ièèèÿÓòÏ€±ÇxþF:Ìm”\Övö6@[ç¿ÿׁ߀@€³`²Ĕ”µd¥ÔRŠê) -ÐÑÈ ìbl 2ȃL€¶N@€™#Àú߀‰­)èŸÒœÿb‰8ŒNö@Ðß0 » Ðþ=Àèhrrúû 9̍lÿöÀÙ²5±v1ý‡À_»™Ý¿Ù;Úý½aó×÷LÙÎÉÙÉÄdï ø›UY\òß<-ŒœÿÉíúëؙý½ijgâòOIÿòý…ùëu6Ù:œîÎÿä2LANöÖFsÿ³wý‹†‹ÈÖü?ЁæFŽ¦Ö@'§¿0±ÿéÎÖ ø_ª7²··öøW´Ý¿nýO g' µ#< ëߜ&Îs›ƒlá™þ™[3; ó¿í¦.öÿás:þ«AÔÿÌ Í_F¦v¶ÖS <“¢óߔêÿ;•ÿûDþoø¿EàÿyÿßÄý¯ý//ñÿëûü_¡%]¬­lþÀ¿w àï’1²üÝ3yÀ?‹ÆÚÈñÿcd²öø?Eý×ۚÀÓý?€É8ým‹ˆ­ù_i˜™ÿm9I‚܁¦Ê g €™‘õߞýË®nk +t´Ùÿjû¯¶X˜™ÿ‹OÍdbeûÿvmMÿkåú& M- iºÿ͂ý×E心à¬æaÿ—Ûÿ¨FÁÎôþµsx1°prX¹Yþ¾ ñ°²ûüoRþ ˆå?Ï +FΎ w€Îߺ™YþUýÿøüçIï¿ÀHؙؚþ3:ߜlMÿNÛÿ4üã6qqtü+ò¿Àߪÿãü¯¹݁&ðk+v&|Á–i™éÎu8¹#Sâ:},#!ö¥jEþ5v½~iáÛ<•†oµ!ŒM3¼í˧öïû²´c}ØÖT½)À‹|2šþ´MÊN.ºƒ@&ýR¤ô?šQ^—Kò¿!µ9™5v¦TTõKÞ  g:Ùa/iüÉ\ ü1Éì‘}MRb±ºP›ÀÐë +OÿP&?>P Ž ÷^CõïãÓåÄÂQð¹B"QFú;äà i«WzÅ`Ñ +ĉ$ÈÜìi=È}#·Ø C%Ý¿Öµ>«¼£Neüî?dZ83Rþe‹§Ê¬ü€$]lTÍHErùTl?É& ﬓ`žٗúmàglÝDò/›ƒ¶arú C"ß\§ßfÐÎWÚ«¼Ø6å=7L§Ýr”À»æ.քtæôƒ•¬ 6´|§hΞ»&¨ ìÕŠ¹‘Ú:>Êv½u•H‘¢¤ïh„´˜l}bƾϒH¬J¤‰J6e‘‘ñ5ɍŠ°Â?ØÏbª„€-5‚‚䡾' qODbŽwRM+= +Ï=Sˆ­~Áqh^¤ ¯.ãÜçðú€èð.î†ÊȬ×ëeæà–;[Ni¢ ø‚e¯1¡¾¥ ð¹V{ßKߤÒçT†sªÕã:¸ÇK›vüø£È—£n‹ÔÆ_£Þ[ÇR +cgîäDZ”gž† #•‚šo?9OrÀ»'·@š¹ g¤ræš¿LKÕÔ;Íôîh‘åÚ3oVìbߢ0žæzfšbò(ñX†ÞÉpDïA¤ÿì#6»*pALýÐûM\§/ÆSz%¨j#~Û@2 1ï'¯LþT½Ó²«ü$ܗ"xA´x£´nÐum8Š2ˆI ç$Ǽ‘JD¼â$¦(xÿ{êa(µå¸ó ú{2I·z\õf;Ë@P ²ò¶nî™t`V/v RlÄ£ËÃϒž|á½’BÚcI'ŠsY m¾@ÎdS>Â1- œS—Ù`¼w¼N¬ï§“ähüîl/¹õ]?qú<Žè¸ÙìÔ7wæ?PxöB@;gçß8J`_-emk;2/e]ž½Õ ›ÚîCR]3\E\($ÂÿlEv¹ ¹û-aÚNlyLôÉË&VL(éK}ÏÖ±î!jöp]1úœîóÏes Á—‘&Ægv³§á¹:YŸ< ¨šæÓþúÃ*¤ß§Í7·I< ÎÑ~¨½]v£g› ¦ë|ÿm“Ï<北ôMQ8”ÏÉ ŒÖºü{ۏgJS‚,¢çÓuþï_5Çõ­Út½\wd]á‡Ýsv´àï†ñï7#ÆF,œf¦Â4ÉqÝ[P¤1ýµÍ?wép_´½*ÚXSÇg~ž Ê?*V=VÖSp‚nT÷³ÔÝí$¶Â_oVڕÐ÷Oy37¨u΃è¬g|J(®²”%-\xó=Íiö’¢æÑPü¤ý¢–yÁé¸5œMã= Ð–3 +bžs(ñ8Ÿñd~OcÀe mœ4·ƒMvÆO›bQæď?²òßk˟­ƒøéÈVSÓÐį*iZߖ}ªYÀ%7> çSV~:La§ö8ëÅ3é{ óOBV¶¼Py»À3 +B-}œçÊòP€•Ëá§MÙàdTÃÔܼª.ËÌÂw®2d¨þqÌÒVš!MQ_W¹fü"+Kb+’$#êp€Dñ0ÇϾ™‚ˆóÐùlGþ0Âö§qììÈ +j,¸–²>¸,Çñ¤š{þÌ>#¦$ø¾/¿ø%]–þ 'í\üÃgE}Èæ£Ö/JêT·tM°>tIÑçÖⁱ½½iÁB+_«ÄU/ˆÒ³ã¾úµ[»¸F'ê\”#N¢#’¿dÃF¦!â¸?Ïy{°ëV€î6X.ª‚Ùv1Úö÷»üïÏ¥Ž²GÄ Þ–ñÐsûŒ¸b8¿Å©‹ö– +rs*ýÂÇíâdú¥z~¸ÍŽpïC”œ|†™“1ãÄc…1N“0'je ëN»sei#¾Û¬²ÉxŒµ·¹iþåÀ¼ßþ¼:+pà«Ï‹hï¾`‚RZôçó܀sÅȲLÁjqÂWB„"cÿ"™¹oB͙_X»3©oØ~æ•qžk4Á²ªÐIlß­föy<Å^™–‹÷ŒWçqÈ«ôPþcmx.f„wöùè‹e†D(ؚŒÓñÉÀyzæÓz›jp°±×ˆô¬‹ñòJV'9¾ÁhÍOçp·DãùÐ+ÐpÇÃõRxE®å{‡S&¢Ç¾Éúø7"lÙSžÅ¬È#NE}O"yµ1OñÊñ›’×¹½ yš•¯¯WµÀGJ¤ Ÿ¸æ«?P+Žñ­Üa52­Ž ¸Gœ·çÞ»x±E¹—®¤hÆ؂Ȇ̓•Lzg!Jo'÷!î¹Â„iM$2_Á¬T«-9¨!͂ƻ°¿ÿÚÝûzŒgkÆÙFÈüA»µ:v9~¶ÃãÒ*$âSÝLŠIH‐MÜÂ!:V%¢iŠ¤z\Dû6ºƒÈqk‰ÑžQ’>'x҂.#k+ÐͤO.É%ZNî™ÇRo§¼žº‰—`ôã&?ã$lnçgÂj±Z×5Ä£aã¯zôËbϑ£ù•Æ0Ñ[Š:ÿê«ñ3.«Hëßm–f‰Sô-Hë/u51Ȑ»åðÌûᏽãÌQ‰­Ò…Ê삫Sg²Ê€¸”;›¬¥ ¯Wdb†®ÊÛ÷½¼Ç°Q1¥nxØp©/x¬9kBàuŒU~Agñ@uj_²({øìj0µ°Uâißs›¼Ú +¦?›iÜ[¿T;öÁ +Ž3&«EHKT¢Í‚†~Þý€OZháN"‡·B‰Êó þ³ÐÔò¡˜Øv7ÓÁh†A_ ·˜pƒ‹yêó9Šb˜É}hYgÅÕYçëþª Ý;fž jt¡->KVhQ!èBÎzÓô¨”7¡UÊ5Ì ®W˜G’•þ™xöO ÅAýÉÖ¬÷ýó#۔ÜôŽeZ^»È¤ÃaUNõ»óób³rBøن› øwI2$ëîiBŸ2®"ļ¢„ÔÀ+ƒÇåcGEÕìɼÁü__ØyØv;2f>uíº»£ +ÌðoXÁò6 ™[Be·¹Þ\ód§:Æ-U²Æh:'ºF «!9LAÊ2=ùüý§ 홺Æû­“8÷ÙKÞ[J€È²¡ñ¶.ÀgÝ*ø6*1õgèã+-BÙC„–&·kè‹¢dvtê@fnÇ|1…ôn¶Âunû/„YÓ„)G¿8¬<þä/;§uGss_»ˆXP|h-n¯¿ûIY®… !Ofv¾gè㧼L%ÉýŽ +«ƒ ÀTĤ>Pf¾ß ˆÍᏎÔw4vJ¿gv–ÑS¹\JµœÚe™üa.^ VGÝþq•exæ[B¡rdc×0Oky`GéjÙþCœ_o¶,29ýø³þ“ÿÄ% +Q`˜NÀ/MT4x:ƒyˆIu•Ç¬åؗJÉÉSvÞ£fž_ý¾G/ ˜(ÂßxÅDÈ5;Œ.<ÿZc>tCvf(ƒir7”#¬¶åÎHô³ÄºÌ;|F¯Ä_`5„{u“{—2b1­»ZS‡àåúðñÏ#<’e-|fšó5«'Ûܙv†*×°ßóïXÂË;ÖÊ[ùŠK¹êgÒÍy¯/PŽeèŜ§Uœ5ïmQoê2ÆËßz´_ ­ViïTúN ã&1u’$ð·[b'ĂÐ9Ç/KqÄäi“— è›$fmr¯XHRL«O™ ^Hq(Ãõ*`œâŅ×ùaÂ^uƒÄÌ7­Y4šš‰”tŒ†ò,nur|ë}#´ÓŒ'°s,&œ÷;É'LƵ'&;RçÁX µ Žïá¾ëÂO¬8¥>·öÀfXg_,«ªyÄ~öîŽ}û4Ôgy0ћóJ+µûsª²YŽ€«1aƒž2ñÕëXi¯³³E¿ägh +ÛýIkKm‘º^3¢‹E<±Uåí~Ú]º1-îO“ucÎ͟¢zÞ½!èZuOŽË<äöùŽ#M‘±SâçØN«õ¦{Ü¥ý냓ú†|x`ϯ¡?ÀŠ¹u‡9Ìj=…È\š±$‡¨WLŸÒëîDƒd3¹%I(™üè»­ ˘õ|·{üEja9Шú>>,‚­P%úí²WZýBýý~°zÙg쒭‹1Îv9̟,½ã“Ž}"¬dÙ"š"Êýø)'©†Ñ°Í—”ý£,>–ÑrÔaKþd:¯Å¤Ä/Çõx˜„^"³ó9á}*A%Ü›Ü•á‹¹ú¶„ñËBɆc¼l©|ö;EÓxáÜ/ƒ‘N:lƾ«w¼²ž-Û´¯‘ŸÆYsi½PÒ ÖŸw}ˆDx>K6/Öuñâkª¸ ã¡$åx3w@k£ç—e +ž¢ Tœ<<¸+ôʈú2¢%äj ûn¯è<¿[KivڕGþ¥†ÁÄÖJÐá[Ï8Öu,¸ýðæª ô*Þ²ßpG +O98´aYïI†¹]{¥tÎp‹6ò2&yû´_LyŽZ +Îz1ª¤"Õù¾FXül)Ùº"úÃOy:PÎT J6ŸdîA–îazK„¹½ Hƒ 5 + )“7;°Ç½#ŽÿC$¹ã\è'—êHb'h“9ME ܣهvìds„9óÂsySØ7‹¼yÚqو/ˆ(·Ô6;%ļk U•$çåÀg²•\ö¤I˜‹`ïæágéF½úþ€š]d ® +Ù'k§NN8).c=…á@4B]Tâ¶11ÜÎ=zä‘ ÝXF–뺳Ø(¿‹iŸûûñjí½î^•FB—|V­eò}jõ›· +ÂEK¶°¥öfO}Q$Vê¥ ;„åü.Òt£ y ýõØñPƒkLA0/…Õ‘ÞDbÂÚá’ÔXÄh/žxš¿‡I÷—‘ƒÐÏ çó¤lÎØ ë9ôTÑòGàŽ`ú‡6L…U™ý'JoÿM“·rá +Æ0§‘Õ׏©ÄàpÃ%Ï¶½”¢QŸÀ>šNäyJmGâÄ¡ +£ô¨Yø'@¿bm |˯‡Ûi¦ÃcÚÏR¥{Öt5 +Wƒo•Hiç̝I–NeEKjaâW„›ûé9Ì„¾ +‘;¼æ¯J:ƒ ¦BÀtî.ä,Szݎ? ìš Ö¤õ5ú@Y6ƒx€mœ3† mÉέ8ï°Míö¦lû6=‰»ƒn°5ñ½{\‚6-ý:þû*±'ÓÐ6vR~îtŒ:4+OÙ:ü¯øŎðÄÀ'ýb¬àCÏ»”ßàœŒgì5`×}vZ>_Ó­·'@K½¦}Ð:ÉuÜNõºC«‹÷²´"¯yƒ+ àÿóìu†´rßâBüᕗQ-R ¾ùO@wCÖÕ¼e̱•©F’h>ß³¨GÑq„KÛÊÙ$TƒÌ¸Þ¡æì1»÷Th¼A.ÃÞ±¾öÞTX~µŠƒý8Ô;3ÎwN8ÃÛOLFԊíH†’ûç|>:bŽçÄ-Ìàî>MúS9w}Èd‡‰—rùÄÆ7N>OùŽWîí=•—QÈŠ~K¼Ã0øû‹Ó8ü0 +Sê/s`ÞÎøË# ¹.Tt'õ¯›…716mfÊsûMãÌöR®Ýc÷a_QX¥ 0†ã³»Ï!O¬ï¥îÅYpÃvDB¸+ޛÉø<ËT=3Óí/E¯pƒ„ pK¾BßX§Ÿß,vES «ÒÙ;?Ø`‚MF:Ìژ;9ÓI8Eô¢9FæòY•™¤7˜4Rvå8d×>pòÜÏ +VYáT¸®;æ6ü w†àë´à„^I¾&ïßÅ}²QL˜Š£ Ú"ûsÇúé^> ¦¥ Ê¥¸?Ӳ͂T¨áC=Ýљì÷¥¨R„¥¿˜´ #$ ø ázÃ!MÛËÍÖ ŠJÁ §¡Ç¯g=+¦R@<‹õ庿?ƒš_x4¡`ˆØŒêgô8›h¶A¤ %î(*f•óèIÿ3…ö§´8Ë]ó`»èU;¶ÝmL⬴éõ}Sì§gjY/%48J’l‡W“ÝeÓP¼¬éè7øÄ~ö‰ø€Á‰$+ïùÁåK¥9Iˆ ¼Îüßo‹&{ÀTCÿñq¾)tdÆ@§ öÁ¢KØÈ}˵$Aò›÷YM<þ‰ +΢VgŠ„l4<_&Ñ{NA›º‚œP?6mQb<ïuØ(ZæÁuCª›C¶ ‚®6à·'3²O‡‰}S€h«T—Ùyß]òï€Üb\7ßÒøbˆé]³îôBWHˆ¸‘<î Ù¶'3x¬ú|°í$üÐrÔ³¬T™KjÓõځ¦pkۜlÅGÀ’G$ÞZǃ¿W[çÞ-µ³ +ÁZÁtcRr>»Ks’0qäiÆý͇vÕÀÐ3·ì•}HށÿDkûý(t»\×ýó ˜H`å[˜J^uˆƒ½÷CP›ˆpכö$Š£>¥ßy=VuÜÇ£\¬"œ-€fï’‚¡ô‘+WÓ]ªŠ³ÝÕrž2`è‰ò5@!ž…¢I+“ÂdynÏbed +÷MÑ椂X! 8X\·FC& ¬_¨ŽV1=yÐXlÀÜy¼Â7ë܀¯†âñðIØAm‹·>·Â¹#ý¾b@\™Û¹«|_2¸–ôgôÊã®#¦ ”p Ôg=CáËʉéË'à„ûIj§YVxè«$féónÒ*DÎ͌ËáTÁŸ¦ð +RòÒ*—+oø֞_[ÖF²¹{5l]è»5¼Nl]§Ã„qÏävAy{’!(ÊЋºÚ½$Ë 7|5)‘?jÁ}ÏùžX!``¸%õIZ"éOô$Íã×ì=øm{{ Ki¡3U”¬',ØE‡¡Cî'ð±èÙ¬{£OÙ§´Núá*/0Ñå{Ìo¹KÆ*®“['÷8"4T?ìjûz¯ŒÆPC4˜bp¡g¡÷²²ÁAIf:“½äû‰¶&6¿bÃ9Úu‘tBä.¤9çèú™“¿Üì’Fýw¯OFRxédÒÈu&yâÁ tÜJé=?t8¼C*U-vtb»ÌKéaGÁ‡ã\xm¼ÇK2¹Ð¤¦{"#½ÜìÔÕJ©1­ÐAUñ–ëp…Fâï€uØܓ!½·¾œuÏ“ùÅø(N¹äV ;ž„l_Í6øµ+¸þæA™ÙêØpmùBDg#Á/Pµd¤è?ëGõÔ ¸ƒ/ÿ[OB}GæÂ|;xñÂ'£¼%¨Åx +òºï¶ÆòË£GMXñP­û¡½9>Ò&$´‚Z­àI04ßFºßÁ §ÈÛCÉùîjÀH2Y%¼þ¦Ö 3JÜkš«h•½6Ø9ôQ60p²x°o*Ĺ©gFä÷E_Âà&¾¼ “œ)"ÞèÝ,düEM^‡¼n*ÎPhl,¥_¶2™„îæ‚Íɍ`iª¼µÑQ}Nßãª,$´§ð<[PÀâ#KH×h«i|KÈÎݳ=u ªwöµx‚Ž—”öP^Õ7¶ÍãÛÜ)-e£øVÜ¢'Gƒ­®¯Ê+@ÖÍÔÝ"·Çj49]pDX3o¿ý¹+êl¤YGG`›;í†qÙñ~€'=³òØüÄL~R8d‰>=ÎdÎí°$~ȍõJ>k~qϔa3΀w„D_UæÝa´ÁTkñÝ5½¤3"â9¿¼ ôÈOö#ôôÏ…Ø­Îܛ&%:·P6½Æ}1Ǧ™·}éo¹ßFMµú½v°Ë~/{rï¨bkòc…Š×cŠÒV*³ÁW¦ÅéÂ#^ëFØÞ>€&6„yìí6\(±¾"Ó\@À Ï;mFBšÐ ;;¿º«Cÿ˜-gf¶bh[õ®Û%FºÁ:£Dæwvòò‚¼œUòšÜVÖ(Ëùóe¼uBüè|±Å£…¬×Ô g§èY&Üþo®Ç¶÷H÷ŒËCñgšm(0_Î$µó½òÞï9ä4¹‹róœPç؎ãÅ'{ò#-¾‘² ï¿y#L£âLyª5隆Õ2To­6_b¯ÌÕrù­Ë÷ìð‚C1‡ëƒ›‹1Uï…'\v"Ùq[…ò)¡{Ývlð!‚g3}”ØÂ#7ð¤*å¾H5͉Ä1]æä€[D>–äÃÈlÒ ÏÚÕk|¥Ø]óþ\ òŽï΅Iîü°Ç`%5è“äx7ZѦTõéSïýjMƎdÑÀµ8hKÏúqV£Ó¤§ 4w­å:{[ϋ×/û ÎhfmÕ¯›ZËÄðݘŽ$»Œhô’`bl¬^'oówCæafJŽ†Tµ°‘’»NùÖô³êqŒ|š_.ç®òL==ä~ŠlÂTÛð˜,˜‹STìK:b§Ÿ¿¬M3º(ª“]K 9´HšÈÊëÜ5 s|hÓ¤ +J„ÙPh×þÑà Š¥ÎêÅÖóÔ(…\¯Í’‘Ë”ÚYÕN›Žvèçm#˜jÄÝ?1«eXœëŒµøÅõ{·u,z,öº̄M¿Ç{Ô4E±`'Å\=lcèL·C:å£kl`ŽÇ(á¤q ;/ôñ­O¼ !MtxÍuÐj!~`Eòu&šŠƒkõsñçÝm|Æf+,¾5Ž«ÄiÞÂmÙT™ë’óïS,ŸYžîµßí®Ò7£µ¦Eõ(Âî8.Häbئô:®f˜n‡‰‘á™8˜§¿h¶c—#Íó~ïd2¹è£Üºÿњv:«FRóZ&Ÿ9'o¿8cñÌ÷£‚bÝ삢9îñ’ïþ>îöÒw¾€f!2Y¢q;4ÿK›“_û{˜KÿëTwUb¥)ŒmûÉ:«”×£Ó™˜A l2?oýUãlrÁ€¿\ó…×Õƌ= Y“ZÙZÊ× +ÐAnã‹ûH’û>p’ÈÚsB?Ä«£1B¤l+'A"‰—ì8€ˆ¬’š—£Q/lGÇQθ÷ÚÎÀÒ¶EÂ|,r—|A¹ú}¦ä<¯ï0·ÊÕn³moa<Éæ þøPý¥F}/4Ïò´òÀ…ÙûJ’WЅJ—"Nw¿ï^>øô:ŠŒþK¨Dqõð~ˈåfméüAhJ)8ÇTÁ“t¯ü÷w-d8目ÙMê7eá±£t@o}xÉ8 Ÿ+eö+²ýàŸ8mRI”.'†~m7û&²‹g¢¨nDÆ1¥–?‘H'0 +bt¡ïû%°ËuÁmÃKB_6Ñ LV`ÜÍ:‹]9Ð$Xlä½5Ÿqm}]&ðëg´¹­CËðWÓ2¿UÚÑwwº*U£w¡²¼E½J«Í¼{0HU¯ô-\e-È܁• í¸%“˜˜zLh”j=ZiÁ÷G&Þ'^R6ŽÄ"™MðQ÷á9Hg%H¡J’9Îp/à y[Þ©±Dç»FįnàÉÒúV„‚Ò̕“þ«/ÖCU!— Q¯Ôù|ääâ_Þ1z¡…ŽßËít3‹ë÷C‘³·ÖU© ‡Ë©Þ”àðµÀÚ»`ëhW„õÜ¢pdq4z3¯t=q÷ ©%¡ºçîçö¾( KXז¥‹*¿\-Ê#ЍT%´‚Hxg·ìO)w*a§ÕšI¨Z±à‚ù"D·Ž&pói­sšbónhm;Üûô9™ ì6e‡§÷›œý ñfÓÃ%ß/6C™ÔwPa£+Ùðöw·Ååm*x×ë Áç ¶G³¶Bç»U± +ÉØå = ɓö(WˆN·ö>lUr‹&ÂÊÁ–×?÷¾%ä챋0‡åXe\B6ÁK*‘L j/éèR‘ ƒ'm ô w=WáàÀraH¾ÿ®ðvŸ§®å®æŒYzä´ô?ê‚È{y1-þXÅë©/Ç› È¢_½biï¨îoJ×sEt«7Ç$9Ü¥h¦@ˆq©±!k£Õ#Øþukù ås¿0‘jýµûû€ã + 8á¨Hº½ŠªÐ+ ´¯Ô(ˆjB6+¥™Þt¾ƒO%÷Áç±¼ ð€b_i¦•·=D*(Ÿ±wÚ&+ò¿ 7ù,KŠ}ñÅÖòRÿ RÒMݎ NI††g‰°‡ŸÇ‡.obcë]ˆ‡ƒÅ„X³^ÀõÇ%ögçÑÆ/ÎdÕWÆHH s$yú‘<بR«äg‰4Cã|†îèÏ®1|;cuÃß­ìJµnjš™ÜíûpX/Ô'‚(\‹5>ÝäJ£ù\ÑhP<*[ÃË+â€7›lî—oX×,ÇÏF0ö[Ò/ +²·‡´µ¯Á9mÁô ?ýŒqš¦Ï†ÀZ:â èpº`È˹0Ó¨øÏÜ2^u±?DºzØ]:\ OÖס¹Äš”[,ÍRD Q*«›ìÑñMjø#F6:E›ÂB]WQWÒ`p¨†Œæf"hËø¶Ÿì>eGŴЙH6œªÐKü¡w/2Žl- (Ӕ”n{¬þ8¨ÞyH0ªý'ùY2qÂWÇÏ?שâRã3HÕX”fIVpó b–7¹°[1ÇP]Ýϝã.)Þð9Õ,ix´uÀÏàƒd,¯Â÷ò`ï~OÌ¨Ö +ÆñUr{ ‡Ñ8`ý¹——¤ÓqL€Ó؝Мù4©HåræäÑæïS·;F@÷Œï­ag±ïdô.;Ó¦8bÍ¢=¸¥D7Kb°kAHp?ytËØé¸m«+°É¥%—üH Ag­œB"Ÿòžõ?ð +Ãð7cÜÛä@%$œÃ ÜQªpqHy–ÔC!8ûæ¾Á?5 ®ŽÌ;é«ÄòôCN~#t¨Îz¯~ÄY û·3vœ[$×õléW6aŒõ.¸æÅó5aÆ3ì·y$–À{G#Mt¡?‡? ’EÏ +BV=\Ír”d3òA£ ¢eûÄú¸¨ VX¿;.$ +L÷wÙ±m¾ý‚ÀlF¶gë%²Ðörq¯Àn•L“ì°¢¶9e«äœú¹%¼Ø<("Nˆd"øÞ×Ŗ‘œÑ ñ»Ú7¹ÑRõ–ÑQ¶Ë¶°¨5ZIí5^vȸ›÷ÁU†ä´²Š#Éj0éüdn \Ëî¨nèdl°¾ie#ÂA#ÄÈ÷°4îN]o¾ùäÎԁO* +(—×÷œöß´}.õÀx¤~9ëw'wçû_ש-»’=±•>Àù+'B´·Q#9$ xÀ%½nu0ƒQqJ$²SôÝçHfϩ׹DalŸ÷¨ƒëJux2sˆl•¶%Ï*ˆ0Ü𶔋 Á9FÆG'ÙR hX˜8¢sÑ¡˜?;Mc,`Õ5ó]eÖ§7çûÕOÂÑ FBÝ9óå‚çKAèÑ9Ÿ:§Â1G’µ-óS»ip§UíÕª]ssx‹‰!Å~‰Adš8µÁµ½zþѬÑææ?t¬$ÍÇáoÎfkœÁ'U››z®ÜÍ!!DÜ~w•Ý% “tp.ք5ÿ©j»†§ÚmwÂ,ï=D“èÅh8MÔ'±NÌJl$cWøš…#¤Œ+ýKgY|æ›ÁŽëWP&>Մ)ë®u.˜t=*üOšG¨`$ð|f­"Ÿçõ"jCÍó-‘×'öŒòÅæ×g¯bÕÞ*ˆ~HéNJŒp´øŸºhh bK°äí  •å`oéÄ,=üà +Ìþýé?™]1'5G̐­sD¸@ø;ü%•c\¼oÜe¹p—û¹ iè’Ûv{*=ô>znÝÌëáÀnæ V +r—½’”™÷#ÿ:GBõ “ôë ª J°ö4A8‚àýÂñ‡Üï[ôÈ£¦|=ß慒Ë3^(CzJ.'ry.Ûo»ßoð°'[—~C—šñ|Lj€²˜FƒÁÌqPSð)¼Üᬏ³/>±„¡¸û‹û¿ZÜÛñNmWÔ:Wyå<ʽÀÀe£eÖܒU á,ão$ÝV›ª9ØðvbT‰÷bά^äVi´;,ÑÏ^¿f¢ö‰"ÜïÞT¥],Úk±Ä÷8:PÒ|î7~ÇpCì ³c\¢Ý{u¯j¢Fß ra#›ß?ËUY¢ž»8Ö6Ä)«­¡(ˆ¸̓›^Âòý-ž6G·6¸,®Ù×SÑov›8Gf ´ŸT¿úF›yÊ4Ú"EJN‡ˆ¸ø¿áÅ +·ý36D·WÞo ‘xyúÁ=A; öTÏGCŠ¢—áëÄâsa÷dA[óFÑo¾ +».wØ ý¢G2¢"°äe”7:ä–=£;ó£>Ž 1Áü¯>Nó«Í¿;•œûÞ¯´¯°˜~›ô(0JIè9P‰Â1*DõDFÍ¡2ÉNDø¥ÇÊÚX¢²k'$çEÍǓÃqŽ…•¶¼œ +‰¡‰bY· +E“ò=Ó¸’À²6€±Êø7ãP–Ú;R¨óÍ¼­]\s+ƒPÕß\ÑÝ}Ž™Æäèaµ‹ª 6²lÒ KR3p¤s}øPrÚÑ~•;*r~õjìHÍY¶ÛÎÁmîÃõÏ`}Aª¸¦øŠîüiÌ ¾h'TºtÔ¶¿iϐ†ÙV®O>ö³={…Ñqʨœô$P!¾Eí +Æ7§¶”"ãy¾”m*C:©ö}ó+rˆj8Õ|dröç÷esQvDƒSgîéåÏ^F é2Há:cEÕ\¸̇ýì9´šzª—aªÄ/„áS!íéÑN8C–)´xùºCÎü‹ü5®v„\ÌcxŽ‹Ø¶Ø-=¢‘Ò¸7 ‰ŒZ](ÛOüwÜèËf ~4•äÊG2-P~«ˆP!ÒË%ÐoÂa:› #üÓOñ­‰k«5„×(•ßq § M»ttž©žŒÝ@já¢4¿ê?ÉQll?‚Hߧú¿X0m'¹¶)Ò`vQ±-8þ€»»oðÒgB]D8jÊ/;Û;‹‘Ý^®m› NT^ƒ¬U9 ãRÊTTªUF™µ½S¶&Å÷ú0ùNàT}¥qGr}¤ìåc”&ٜïön.ŽÍ¾8`Ði:\.Q%¸ÎaµSOœ%\·Z2@®EÖ©`àÄ®aK*€év³ña@D3îš}…z¦:pé=øQeàQ¸l åîñœtƒº %H©ï£áÛ³Új¯èP <’òSü“u–Ø娺o4o¢ 9Sú±1ÈGc&¸¿jÿŠÄª ÷Ó`/ýVô=~3¡²NºC òÈ_Å +ÒVâv9éäÛ¿Ú.£ü6LLƒMIpkpÆD£ÚjUãú2h6àž¹þòTÆ|O#äA{ÍÛN~öà.⠉%á¾Ð¿“£èóìºgjrLK¾6Pðâü¾*'Ø }ò֓o&AA„ëÌù®ÃÊ44v[.ù[!sí @” «P¤ êòŨM²8¶’ =su0^¿üeU*¡ô×â:4ƒš+:62·ÇUí*:q;ANHùºö,Äe@µ~õ‹ŽÈµâ®xYß<"Bj3„‹çOoý’ƒþÏ^‘ÜŸºŒ/¾†VC5(_^Àí­–éLŽK:hw¼Î/™ç3…ù¡Ð½i»8¸æM7ºG-ЀÙS|¸…,™ý=诟l⚡鲁ƒ/n–Œq2ì)êKÔ(öt=‚*礲¾¿Z B¶Ø(kÌ®oá‘g;{§ÁÉ)OÚîêäºw;-ú;J3ØT”·—æΌ©¸rÔÆçõÿì0£ÈÏ2”ÑôžÎ¡[+Òw†\3µÛ ¹‘\V»:涾 +Ëà(ÿµñ(MØ3wɽ¢MòÑ@«Rÿ˜%NƒLS·D<ëïEß©/ßò±"֚ü`æÛ 3JT–>ÇB— .ߌU”w&” ïƕƒTµ1MŒú̪ñQÿcÆ34ÂQ=Å!Â?¯Úý•â:5“ý,˜š†àÊߜIyÈÖK^![ä |+1?fÌÒùêëo…?ZÛ.«np_2ÝysDWjºaou»@Df•ü‚a˜üÃ+0;ûÌT‰DüÙâêu–U܋dß%૧¼™ÎWö7ŒM.® (ùšd€ñ\¾[$•†HÉ3£`è{³©€8¥óÖA¼™f YˆãâuåŒ[í䇸?…äwY£·S™IŸ_~´ö¾BÝ3Hfi⠘8–Ò|„ˆ$49efEëÈö½›ƒëd!GÝÝDŠ’ Ð҉H!€Ãϗ2ý«ÈVq£±Hq/Y.É>£íßú%6À.¶ÚáPõ¸¶vùGýÐݼĄ8 Uhmn>€œlF¦ãR×ÿðTEv¨n‰ä @pö'æaÑËÖ ðfçµ)žÁ:d7Üɵ#|7Ûq;”«­ˆü€Cè`Œšª·4¼˜öš;ý'¸¬½Ì²å=d" +ËçW÷‹ì„;ÖKD"±Ôù0‚âw]ŏ°ï`úæÏââхy5uft¡Lrc8x +Å á±p~éþn=d4«ó©õlÁ_`¶ûoWµ#bÄwc=@KٕŸŒ05Ç&Ö§^ÕÛ5¯Í:>=K—3 ô­·½ˆä{Qâ6A×j ÊyƒÏŸê‡%; +xO“aÌ»cdÁ!>Z,‘èJûñ#z»‹@Î+ñjIô­¤“„§ÝqÂÛö%OmÆñ¢„©÷e¤ü î§]í€ÿ=x_%udõŋµ »Éü|¼TÑ(PàšÆ.¬*i„\q[áY¤¨µ†g^§©"? †»éÍ5)ö7$­­@Ú¡5š®ÃÏ;0äìTΌ;&†)³OàÕ­^ƒ“3mŒG‚cï뚀|–/^±W êVÙ rõ)2±e„õTÆÛ^÷W’x|¡¸uMãO1̀w¹×‘k+=YÁ (ÉnкÅ4â•LâÚ¹upèíY9×ø¨U¯3$Hœ:ì:¨`£f-cÙXWÿXæ¾JáÍõ":duõá4J5c%liTõÓ™ëj½nkÔg¦ç='p󕟸°¹Ï¸ê4‡ET 9_nœØŠ8Wuœ~i{Ž5ã㱍ïŽDœéŒÆ{úpX’ëì²} Ìë5ƒ‡@ dGÊKKÚ¥jº¡|Úcöívú”ÈOíd«Ñä*+ÍßWO9§2Zr¢Fé4àC&² ÜÒ°ãǽ¿žK‰-aÂ4[Ýÿþ6³‰)ÀØ`{|­ÐÆ:ͦDogö[gÖ?k—h÷ZA{k*Š£»'Ñ2ÜW0Û",¿%¿Šnÿ»ow¶÷øÒŽd÷Dĺ¡³}÷¸Qú݃ñgäOš*s#4‹ïøÕ×t••~¸ƒ§ +iöîOQåú?Û<^¿qÌW+SvlPOy¹4/Ý·Þíàñ¨}‡Þ¼­yÁßMrM:Jd\ë#Ý4ôjÚÎ/-§ý“øâ`L‘ü~ÆöÔ=üe„ˆ œ–¥+ÛzÖs mŠà8´ØLˆkJ_G™¢å©k}¯]–—Ê $5X\üQ,P¢ÛgVÄr%§(V&þí­XbššD!¸@t0÷ŽJK¼^žˆ~Gmۀ¦;{¤·°à/aX’RɈpmÜ{‚wO]RÜÁV«Þø–tƒÌ1b„“؇×üœ՟Z€“TKÊ-aöÉõN“ÇgˆO²»òõ˝ +þò= /”õpk³4™Y\€:`ƒƒb²D^ e)ÒçºÐáð[ë;á|Õ¸½eúçíÞÁ«–«Í^h&Å;iPðæ®ÕÙC[lèåèXD +‰†‹ßC‹ºQ~]À¤¯“ɾêqéXh¦t¨-þßjú5~7\““1 <)Ò총a0õG*ÈÒîڅ>OªüØê'¦ß|ŒF¾xP2\'Ê­A’zÒÂÀµf‡®òïsG`îÛ:-h]Õc¯`QÌRvX…¬íß~¨"Õ~<6֎úH_dþE–²ÍÊe½e*¨—ãéK®Ð_¯¹}8w•y›†WU'×á ƒmNGÌn×­Õ+StÅ<õäg]ŠM¢Çp'Q\m#ªæ±9.ìÍÇçu䃈aJ(I*ÝAXˆŽimAÌ´B«]Çy ¨ºhoEcw¯W`>ˆË9EUÿº!8n€ÚêÂß«—{HÛD¾5Àî‹1þô±¸j¢ŸŠònÙØhï·^ßrì‹}Q ÂçîBÏïìÑX͔ÐÅ£7Pž¯¹@ømïòå{+u-[FríŨýˆ´‹Pð]q× o“8Ñå¦FlSQº†ø¯HD†µï7ã'ùšjRS·–ý¤ó&ü{ÂÚúsµ½ÖLÎ÷ºóåùóÉÃÁZùëxZ”1JB öv%ã7©0ü‡\7o®ï(´b‹Ø0½B¸˜¢ºÙ\ H­+•œ¨µcõü2ԍ{d·a7땱`êç9íJ§ ënþEür™òRP×ø¶xIš®Ò%èÑ*M`EÓù2LàGcþz™Ìï|ÌÍ2ðÔ»=µÒ d‰“ë½®AW`‡áËÂI#йh¹¼v t†Ä@Œ¨aVi…hSïÕb£È ‹ëqwˆ²<› Y¿Ñ§’&ó"ðkéo´Êä]¾8ô¢Koµ?}1µ Ôã vÔùñ$̽ïÏ܎,"—`í¹–³TÕ8åÙÉ·ýëž]Ø}‘ÂDÎ5‚`Ô__“¡¬é&Dž WŠÕ-Æ3™.yT¬˜w»=hðGм§%Ü3Íåç5˜ŠKnnM`¦¼Ë”ÃpkÜ êLnî܃|ħµ,º¬Ÿ…W§ÀBÆ]H¾!>¾O4à„jøŠ/í Š§'^ÉMÜÿ8me‚,ãªõe R‡28}te¯ ¬™÷'.Ú/™IÚ¨nTÏè³N$#ëL„IfroEH[˜Äç¡Óæaënãɞ"&¼)^U‚ÂG/ݙŸ Œ‹:˜• šû:¬îz„Ûã¦kJLô’A1¬¼=¢° +`£1WS¢hVÁó—ÿçHš¯•À 9ÝZþHW®%h´|õ4 C—³š‚sÂø©ª½›Ò µ +»àVŒ`x^°†À³ÆÖR]µq·qۄs´mY£ÇPæž5¿.ü%¬wØQ{aֆlÔË<Ý]K°ˆ7“Qh¯$ÀYlÈ&<£iؐ uå˜n |¤# :íî*9oºˆ_‹ÖKÐ+ª¿X^Æ©¢ |–)±«¥Foìþ|Êܨ·tìqW‘¦NÂm'9?éàSÙQRªÐî‡ȔcЩG;ÆrLrûí·^Ì֌¹b1ٞŒsŠ“SÿPÊT…£i>(%¥ùQüC°¿Ÿ¦[ ï¹×fxŒS{2jϪ›Ó/VœË®q5™7” [ÞøÌ +’ûÆ¥d“h_똬fÿÛhAX ^ÛÝńrWw©ª˜»ÍõïLΏDíQ ÔZBŽ¤’ßÑýovDnM?ý_z€‹½H¿„à¬7“/ªbØØ)»áYÁ u ¤ˆüo|í&ï“; ¾öy?Äٝü`¶°…/=§ÓR]Σ¤GÞfŒ"Ã"ÀËJs’'Þþ¿væüŸ xE–ÙX&3Ç SŽ+&ç\cŽÌCbdŽ"¹r”•!=WJ‹}‚…T:ÁHñOOÃìÒ进+ó]bbkÃcˆúk¢Ùk9cj¼ôØLxœñOý0xË7Y/öã+1ã2/-R–»àIŠâSœž&dþC,f‹ì••„8BP,+¹—Uàžµ¿ýGÉFŸŒH\Ũ²ˆ›—cÿ¢çYtuοbOß»’È?.B:XÓxétÀþ3Oڕ¶P¨]¿¶­¢Saß-F( }ùúaÇÆ°•Ô Ö­³O~ŸT®"Š$íUàDÕ½ràlXŽòF/µ<¹ßø˂Æ%F¼yüÛ_ɸ/Ô5Åê]«`„ƒY ¿Üˆ:?½R½úkâ¬jX>tË짜ycÐܚ1Úr„ô½}ŠS—7š¶ÄõͲlÔý¥RN‚'„UÇJ#½â> XZ¬.¹—²Ñæ ñA*‹#†û qŠ? pŸ†žÖ'JÊA +óZ‹_¸^A¨œpñ®µ4M-ò%"MZ'ªŸNcw‹~Íÿ€æ2ƒfh[QíÄÿÞV-P䵟6ÔlLxP*ÞÒæYJ‘³¿ƒXPÅ„÷èU:!?Máq«Zoü"åÓ»þ%yçj *=÷9]YÿÎ wi¾Ò¸'ÙßÈw­ŽÆ1tÑó0 åYe)55I¸]9=KUö¥aX×ÍÓz}Äíx’ñyOyû`:þ ¦xà“Ö7Ãùƒä°›*©þj¨cÿðÿà?¢Bƒbã¢ÏÅFÿµ +&ôendstream +endobj +532 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 2 +/LastChar 149 +/Widths 8024 0 R +/BaseFont /EAWYEH+NimbusRomNo9L-Regu +/FontDescriptor 530 0 R +>> endobj +530 0 obj << +/Ascent 678 +/CapHeight 651 +/Descent -216 +/FontName /EAWYEH+NimbusRomNo9L-Regu +/ItalicAngle 0 +/StemV 85 +/XHeight 450 +/FontBBox [-168 -281 1000 924] +/Flags 4 +/CharSet (/fi/exclam/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/greater/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/underscore/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/braceleft/braceright/bullet) +/FontFile 531 0 R +>> endobj +8024 0 obj +[556 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 333 0 0 0 0 0 333 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 564 564 0 0 722 667 667 722 611 556 722 722 333 0 722 611 889 722 722 556 0 667 556 611 722 722 944 722 722 0 0 0 0 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 0 480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 ] +endobj +526 0 obj << +/Length1 1626 +/Length2 8267 +/Length3 532 +/Length 9125 +/Filter /FlateDecode +>> +stream +xÚítePœÝ².,¸ îî ¸{ð Ã0ÀÀàƒw‡ààîîî  ¸†Cò½÷©ïžûçœýë֝ª©zWw¯§Ÿî§WÓQ©k±I˜Û›eíí`l\ìœÂUˆ­™‹³¦½­ª½2› +Øx²ó¡ÓÑI90ˆ½4è‚ÍÒ`€›À%$$„N²wðp‚XZÁŒÚšºL,,¬ÿ²ü˜yüÃótÓbi úpCílÁv°'ˆÿñE-0³, P0@JM]_AUÀ(§ª ہ€P€º‹(C@`;g0ÀÂÞ ýëÙۙC~—æÌþ„%á œÀ ÈÓ5°;ìðÛÅ +p;ÙBœŸ¾g€¥ÐöÔ˜=b‚º˜ÿ&ðd·°ÿCÈÁÉþ)ÂöÉ÷¦nï s9A`€§¬êÒ²ñ„Ya¿s;CžÜ{‹§Hs{Ëï’þøž`ž¼0 ÄλÃ~ç2Ì!ÎP ÇSî'0'È.Î;Ë1`8-NæP°³óÌöïîü«NÀ©èàõøsÛþOÔ?9@`Î`¨;:÷SNì)·%ĝã÷¬(ØYظ8ÿ²›»8üÃç +vúÓ Æß3ÃôDhnoõ˜ƒ-Ð9TíaO)Œÿ3•Ùÿ}"ÿ$þ·üo‘÷'îß5ú/øûžÿ-ë…ªmŸà¯xZ2@;ÀӞ(~/Ûÿã +Ðõø¿]ú{´.ø/¶’öPó¿û`À§–HØY>ÉÂÉÎù—â, q›«C` +€úÔ¯?vm;s°b~ÒõOKl\œœ󽱂€lì~ À÷— lgþwúORý!Ï¡« §©eÀòß,×?êOC{ãáðÄí?KQ±7ÿçá7Œ¤¤½;À‹‹_ÀÆÃËõôöž ñszÿ7)ÿqý묄9A܆Ousrý©þ?ÿÿ:ý FÆdoþ{l´`@;ó§Iû§á·äâäô$ðŸÇÿTõ?Îf vƒÐçíA"AÖ©i°Jâ¬þQiÃîN.Äþ`‡Âš7ù¹~Ÿí;|SÃօJMï+‚ÙkDž5yÌí;ÒÏ1“LÜ@»Ô+†8”» ßčšpߧaßUb†a£%¸S¹ëòy ?–¹B1$d@¬DúÛp­¥º(ޞŸWYJµb̃¥éùÅ˼WR­öÑé +ÖñNþâµÀ‡P§Œ%²V±;ö9ZïD¡2ÞásD^ɤø(Õ/ wfè‰i¯•p5;8Ø:\ãঈæŽè•áí¶6hqH.’¤G¿‰â)_ö¥«x{k¼MP°@-_¡qÖ[˜ˆT!7œ"ŒZc3‡,¶ÙÙ¦˜ž©¿b0ÄaaâUdPýÔÒӕÜK }~$úB HŽiy½Ø “B+–Zòâr¯J$¢Ð? r´ØÞ×<¡œ·Þ`²1#«Ø+Åñ¹7ˆ2WïJ}ÂYD)CŠ ˆè4¡òÞ̓º +» +‡ R2©S(KØhG :s†Ñ˜ÁÚ?+SA5®3Rv8«U¥‰ZKKðGÌ/'õK…“ª#¥Ô‘†ŠÚıX>®oqNòS /‚kÅlýrñáƒÇJ;µúèÆÅÕµ}5UÞ g¬>&¥”_Lõrwb<njéâ·2T:ÛÄ1 ¿…„6¸ +І&wŸ :Õt Âãêw³uT(çæGË¥Eþ óAŠóã./TÿéäqŃÞC=b¼Xo§Î$Ó^uhU5ÐÚIC}<éfªŽÚ˜é„3¹±œÌcҊ¸ÅŸ¥WqΔ÷VðÞÿr ò4 +XðŽ§JŸ°°ÓÑ|/(Çø-æ…|ܛ(1ÞZüOê½iT1¾Råörx éx°†‰ñÒ֘¼HöƒÔNN¸CÄɈ}s5óà)?Òãáºà  k>újª\)… ÊÍ ã´Ñò'­Ûo²¼yž…îüo X#ÌQ \ÊðY'†‰”å¨.½@s삑Äx„ßքˆ`£õC?¶P2…à¬R°×K©´ƒ¥w‡õۂÏז^@¦"’ŽíÈ#ì~5ßÌLŽ<Øòù¤ #ýüû™œco|?JGU ² ìÜ]:$¸Ç?Ô¾ù¦bÖ}b2œ½}«1 +š™‹Sm™ ¯ +ˆ^ѤÓ$žÖñÄVšò†mºY;§TI"³ŒY›UÜðW—ÇgêRÝj[rP[j=»ØU€ëaØD¿Z9”z¹vûžýW›Þ%ú7_x…ðý»?”ߎ¡s ˜¶cŠ\Ê`¹F¯)ÎdÄ0 DÓØ홿¤ó –R„Ô<ìì2xhÇ—¾ÓcÞž]WÁª¨Eµp,›ßg–¶ -ë'0Xc rf¶ %½ + ¼Ow|Niö6¯«P)“gC®˜Õ;Y—F„K^ýTá9Ã6G?owò¼æ<ƒˆ°™-üx3_Yá°1/å® ¾–±‘T\1 AݶD( Z¦’0ÿ=@ŒÔç¸6ï5¹z³‚æĎ%Š?áCµGSkgš ãžc„ËÚã€TRwAx`ÃV)wŽ°hïíú–ªü[®;&Í¥éO¸4ƒGÆä« (@#öÌÐØFÞÅÛ®0nêœ!Œü½×ø`À`…w¯Aß6£3]6νôò° ‡®Ÿ­Ã~ €Gî^Ú£÷LF ¥âñ]‹©èŽÓêÌT1^[ŽddsÚ¶ùU)³.§ Eƒú\K¶åÞOáîµãkW}z®“‡GTx×*77ÒDZ`|¢±U+qSO-À;ŽŒ˜Üà™5c?ÝC+]*ü‚·VŽA5†qãÙÇ4·Ú¼‰?Êkx;µÇ%Ý¢mæj‘¹­yñ;²4KKûÝ[󒡠0Ý =$>í:e’¯ØÆByhmڐøÚï ß'¹b&ºBš î­gñ`Lëï)>×2"/¾c¿tFçÄîXêЭװ*F,W¨ª' +³I9ZåÇUòÑb +¶}«MÛÇLþ™Ã ‰ÌŒš#óFïdL.őû¼f^æg\UQÕq*E¾àd#Gj;D0Gß@[‚éxK~THX¹a J7Õkí.ÂÛbBBÁ¯–Oæâ&ã UøÚ¼·Ä áF{Q’ZkiR©k“çeŸDً¬i!Gô¬€·ƒlžä»·Ý«0k{ŽêЬåü~„‘ HXLØõÒޅ÷·;Iô{T¾^$º"ж¤¿[jÊôáý‡TˆÕUù«Ó;ÁBŸ¬wʐçyU«ød?à _‡6Vvˆz Rµž +ƒ|eñ8¨F?Lih¿›Ü$åAPV#ѯ §>A¹£2"‰Ä\£òCP+î§Õ4xf6î[ƒ7†ï„ùŠé7î")BU­/Õ-ÙÁ CA@r°üTŸyT»Mñ«}Ìm´‡Mv€Ù +~—†ä>Só@u¨îËåx¶‡^ó†~a&ø`<é@ºWܼòùVØñ®Ù&Ü5꛲ÍXÑð€&ÐRW¥³4ËNNQŸ¹Ù@™ëÏ3õŽ©ýûüMý`»‡·ME˜äåڋËõªêajfZ~U©Ÿ¸JIªÔ¡l©`•“ +kO¹Y|÷;•q ¤¥Wâ–@Õ¾Ð% Íõ‚L›9ÛU‡4*ޝƒÒ톃®´ÐpÏÝDdÕ5,šù7?݆Êtû»Wò—ù#çæ›Í܇©r½´Ù`$Îa7ƒÆ­·{í×{ôÝ$ûõˆ®5w…Æ4›å%8Vù—;ρ‡ÕKK{ñ™"«e±n=/h9Ó¡Æ=fpÍ¢´­=C÷ø$Âs® U'j‘Þ>™ù}<ìýAü¦” QÿÂ-£2ÊÚF¥¨9À}vÄ:™!™ÒYÁa"_ò!…֍ª­QM }n™£¨íçJH»Øg'òöM ð2‰@Þci ç'GÇ蒙Ô1µª|þ)¤¤Àñ…tU’Z!¿ ‡¯'I‡d`;²œÄ÷³Yœï¸’ôbØtg#={ATñ¶FTG¢jŝä6 ûÆðÌÜE# .§kR<ûظHP¶.ãH×é->GÅgœg}–çÐó‹(Ž0Ìf¨ßT¸óp,¡’Î֕¬•!sŒÕAôHÀ!x'Wר’ïñø¤ ZvY»A%Q3z…Ë´cXvÊ¢+-Ót'D?¦¿#©íí]Ǥ–&ζ­VŽˆ gU¯¢D¬ŽâÕ²¼¡"©cdÃôêþfýÖ4P˜ÓóŠ þܗØ  ++zU߈ŽrHºîºùV.mƒu€§2ôÒêsÛA×fÙPò`x Mِ:Ÿ‰M‚‘B³€–íz\¬Œ‘“à;rI7“KXYLÈ6T,™¨²0çÍ¢®Oý»,BÜïÏïEûA8¬·¼67Ò#-X^¥â–Hþ/Îâ8¿”b™òr¾³TIT¯àwèý^­èŸoœ±@êυÐ¤ÛgäVõåë’M5þM€Ðª¶cØ2#¶^RSöL‚g¸rÆUZ~Æ|¦%N›ƒSq(“¡¸¤T‚Ç©wL¢ë$Qdi²U?€wHÂÖ[ß}M^jZ)5p©º W1#ÝB]AÒ"±X|eâç"¢òñQöôLîŒ½Z›ôÅ1ßyÓ@\ðã¨Ex1qRîR«`ߺÎR +µÿZ…L”˜UuîÊÇ uËËêÙ£ƒãiäR¾Î¶ +ºYOÚÜ\Kmþ¼fƚD]iá°4ÿíûÌ7ì´øÉî,+âi¯Þ$֗¦]ºËÆъˁ;ìšWê§]‰åÕ–NÔŒ.+•Y5ü¶<*}5˜¿Zz¼u••£Ë ù1¦C\Ž’恇2­¶AbÉ@ü¨à5Vé)h(#tküSvÙ;+ûÃk>#OwWtmgo¹àÒTÒ!Üø©üt5¡™Ù}¾$™JM {j^Ãev±(Ûm–œÖ÷½´pÁÄrKo¤èpoÖKŒJÎ4›®Î¾‰£p™ê¦ËýÊÅcãZ9›ÆüTr¿NÉփ%-ξ¡5:ƒä€îZ`<ʯ¦?Ôï¯:>îTOdùpmc>Ã2zëyRB¿›~æ>ÅgüXiv¼÷Í@ôqê"^Ã$!Á¯¶ÒqÖGÿðW…Û爫l8?›ÏM[‰ºiÊ 8ð«7»räÙ[ÓPƒ¥¥ÊåF€w• lE£ÈIò°é+ \âeˆš>Ú#¶\æï¿è/ö°ŽuØJ¢ApO}åGØ®CFÛÑÞ°f +"h¿Rõ¿äZ?R±}Eñ^iB‰ÚÛF*,^éÆ åÊ ïmþsxa”_s]í퓭Ûݑ?s v ™á#™/¯Dµ;|2ky|†ïµï„ˆöO šî»¿S[Mì)£–{Í؀5ÝȾ)¡mÎÀbd.ÿRúYøZ5_[}Ÿ©[+EAžFt óL@,îÒyVÜR>€zߢr--OM¬î(U¿òýÎå$ø›G¾0P˜>*²: ì5o.&¿ ìºY£R7÷Ò3¥àWàà>G®oôöFÎ8ò¯ºÄÊ°ÃÏIQž\§ß¯¹ò qÅׄòÏõù-ü-ž#·?j0¤„u·U~tȤq› â1p³k`A ì‹âX`Ô¬ñ Nb'½Æ¤LJÇõ%†*UfðÏ1êæŠÇ~mê,Ý®—_Ìóø¢8՗Õ{;e7¤øñÓæj9 —Ç‘Í×Ӝü®Žv¾8øó•tyð+®*¸×«f+~”¹ˆÙmæê-°Ù`ÁSo±…§[P:"œ¦eÀpÅ»¼×¯õáK§~¸*!ýˎ‘3F*—|Yïäîã\UüdžìŠ"¢C ¯¯¯·41 +®ö®U„Kpӛäê.š¾}/= {Ϗ²I‹&iŽJ»éPÕKô¸ÚC›Ë†ÓðŠ) { s:z&ގ•txa¼«ùl¥N%$Í­ú™Úºœ“´–^ݚà+m Oƒn°TɺÙÝ·_Óq=–·¾Ûð<“ђ§Ö’j{&©i5 KoËò/(¹s [hQfxkE&-JçRзׯUYb°Ð´ÙœxN.Âèïכùà*vC*\ƒ?²iœq’DŒ}‡;æ›Fß é…÷\é™iõ}àJ<î0 fâG:Ø:͓š=ñƒë?ÁäؘËGj¬5d«A»àɳß)ã6Ù5¨jIpc“õn3ã<4kEócÚHn:»‚òústċ®/³sq^¿Íx»J“?Dý]/Z”£!>Âmç{d(tI¸”’iÆWÝ÷F‚ç½›|OÈùËÜKŠ‰nXÙi,þ¥ mн÷eKWDÞǖÔó|kîʽoÃïYÓµ©c­hæÚ ÐŽãÓÏ`SȸTɀž;e ā¨Ÿ˜`µ.Õ|Ë:2<Žê²e¥IŽi¼^oX¼‡ŸÝê§ØiÚvÂ?(DŠ³¨Ñ#p»{ÊÁÍ· +“«ÒC‰Ü„Q÷fKƒm>´ºG»-?(Ï_x"Úv§uñJ®û³º-Ï>Č^›(jG …”Å­Ñ)½ iÄC9מë•ÀýP’sàǸ‚d}fˆ;´uÐ]9ÿ%‚=bÛ¨]^^ÆS’#c❢±OùMù*ZÑÂAfŒØ8Òíæþv‰ð$ŽFU†ËϤGÑ.N%Öm¯#;wÁÂ!ó[²¡_¯_ŒO\v+`@eùhïï2¥Nï¥q9ŠÕ©c:ªÑ6š~L`ŠÎÑ®ToJdŒÀøhçZÓçê¿àbô³«•’.Ió4f^žþÅB©[­!Æ£‚YA£”{ètÒ͊Àß³<:9—önXm–®ÀG_=ªYéq§ÛŠÔÐÇ,ª[õø ݚÇZ]X¨NӖñ09$E¹½¦~W«vÝítOð³øãWvÊ_ž@åFÅkëݤ žúLXÛۜF ÇMz´Â4߄VÏ©^‰ ˜èdÉòîETò½Ü…PJø·0¸¾2å½~H0õz#óŒ†?“‘žúêz"­±ÁÈL˽{nУ Õ}Íjãö±g·o&q^À4EÜ+R\\,‘eÒ¶È@‚léPà~~ë md[½²*¡Õ_?+²šŽh*ÞA %öថ¹`°ªG…J,×>ŠèX_Sš þŒç¸¼ˆzɋ~Qhrý#’þóFz´¬ÝšD$FcÕCˆÃsëúz]^žºz¤ƒ<'¥¬«+}¿Jf°ï3_r#Gt¹3¼¤qsÁ^à!~JåÒ±¹Ù|,!NS­ë#CÖäÞéÔ4˜ ÏþxûügÕåœa]ƒøÓ´7üBYWÝýÙBlsbŠÒTÁ{¢ô]½™”Ù®ã½ëržâT‘áŠdá-hËwPøÅ!s<ø†Ò¹añ”f½ú<‚Ýà¸Ê«¾Öþº­&U4¤(lë¤ϊ9~í\³7©Lpj…CØËr¯OJ€kãI*¬¬Å’ÆßSÌýÖµùtÉR´î2Ì<δOÑ´æã\zpªÇßYwiHòL{VÊeXïdѦxû?ñ»"Pc1¹ÚâIVrƟŸwâÈA/ñô°|æÂÎP©¬Œ¦N±VW_ý°ÉÄлñ}EÕhæ ‡öVíV9S+¼~®’¹¯ÞBõ¶iMù=_iŠMBôêÃcá6Îå÷B‡q¨bxš…å~ŒÐa~ E¹FG@ʧCVpð.Ûùü-ñ¯zjR³õûí·¿¶cÙ.W’Xxü³Ì¢¦˜d²¥Ûpv8ü‚–#ËÑêŽO»‹Ùºùßý(P~‡èŸÜÉ+ó»}éh+Ƭƒ–NaCï‰ÅûJ¥¯-qo½Š*8§®XS‹>T·<>:)htç›;¤Hd ´v¿åïþäy¯a\âÏöˆ£ykÌ£lÂâ͘Ýå"ËÖQ£È§Q2ïý®ú.þv,Ô:}ԛãsüt¦‹n®(i `JžÉu±$ò™’RŸ§co7µ‡òOf¾ójp›‹»å8¹;fé×p'î‰0TÑÕKíèkƒô+|y߃rŸÈ•¢ŠêOnŒ!a—¤JíXȁ¸4JœwË[¾sû†©^Ÿxú¬1‡¥ÏÞç°P2c$+:Äൿ ÁÕ®íÜYBŠ2 3Ïpç‡øÕ å÷N—•¼«Iz– ²JØ©¥é9¹«—×/qeT¿ñ=YÍ~»7ÏÁ†TÈæŽÿlŸqŠ÷ÑµäuTM–¿5>0ÕÂ&!Ù6%t†FK‹´¤nR>0<óoQpS)·ÞÞ#FÕ0ÑÛ×ÌŒl´XP¨¤:{é´t*r ƒÐv7÷¸æE?BGi^S‚¡çùX:–š²äS…ðæÇo„§QjÚ!_ˬG'VNWæ jº…Õ©fãjÝPqI9ûò­· ‡UüU‘>ëjä(†MA¤÷?¤êö‹_þÀOš—W”ã8R2iN$ ©è­ ûv'=£FŠJë]as^¸îÔÓ.Ÿ–*ç¦÷‹4oEo’žs2¨û‹/þÞéGÁÇé[³lm×ÀjÜ~D…£b^ꗅg:Ÿ+O~M׺Yʺœg÷u¥yþǔdœvNÒߓ¥³s0æ¸zµÏ弸ËB©ŽÑot1›U"dÓKXFË~‰O6Oú‘íjòۂRÐ?¨*¦t*Ei½S¦ŽE¦f<:²Ôr“é˜ZoŸå¨ù–iF܍®Ë¬kwÐ<ÊÀy7ÿ2L“—ÌÅc?Y¾f˜…"í 0@à¡ÿðþ¦Ö¯¶V±fuñ³›G”ÍöæǺV]6ú)^‡v{cJÓüN Š¬7 F­O ¦’u .T¹ÖR¾±º¬›JmÔ¬÷°±ÖTˆàÌ —­Ê‹½?µì65J†Ðp Fw8ïÝ¿™6ÝÖæ“ÜzfõǤ'?Z—l%"òÁøÜ8_1"õŒ €“Ë:jˆö¥K9i[ûy\\YO¯?ðŠáeÆëŽ>…%1蕔ŽÑIO^ÐÐÓo:©R§ê[2QGv5•ô™H£„äºõaXݾ›ˆjÝ2{5×qJ¢| *ëÆÐx)^./šÊyMøÿ¹Œ*ŽÿtŸïg^‹W¸) <Ö톲!u5¾ÔuªZÛnJãï\ŸÝÄEý؋"ÄAFÚbÚlM4÷h%1áG=oêoäV…é%Ý¸ µqL ØI¿ á5šrŒ6 ‡ ÜÈöM‡Û½&íÏ]ØxF‰V÷Yó*°Z­C˜¾¨ÖfjÞöðôDÿÔiëEÐbÓŽÐáŖîn«8pŸxF›æ.e¼Rÿ=ò KØyE†Kžüàä4vä^ºDØ¡+%óí<G\>E¤ý쫙ô§ÓE¯U€“¼ÚóGÀÍ×P©ÞUy.Å MŠ:Õ0+|á.Ÿ]|N¬¶H³!©jæê|@‰ŠÒÚCåÏÅôIStæægQÞä¡Lw‹¬” z±Ï£ƒX?êÀ‹ Ùpc0š‹S¾·+õ†óŒh±Â¼íáü_þÐÿ?Àÿ (è³·:Ù ÿ}@¹Ýendstream +endobj +527 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 46 +/LastChar 117 +/Widths 8025 0 R +/BaseFont /WIXRSZ+NimbusRomNo9L-Medi +/FontDescriptor 525 0 R +>> endobj +525 0 obj << +/Ascent 690 +/CapHeight 690 +/Descent -209 +/FontName /WIXRSZ+NimbusRomNo9L-Medi +/ItalicAngle 0 +/StemV 140 +/XHeight 461 +/FontBBox [-168 -341 1000 960] +/Flags 4 +/CharSet (/period/one/two/five/A/I/L/M/P/a/b/c/d/e/h/i/l/n/o/p/r/s/t/u) +/FontFile 526 0 R +>> endobj +8025 0 obj +[250 0 0 500 500 0 0 500 0 0 0 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 389 0 0 667 944 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 556 444 0 0 556 278 0 0 278 0 556 500 556 0 444 389 333 556 ] +endobj +513 0 obj << +/Length1 1608 +/Length2 10350 +/Length3 532 +/Length 11200 +/Filter /FlateDecode +>> +stream +xÚítePœÝ–.4Hp‡Æ-¸»»»…hm´q‡à®ÁÝ=x°à‚»»;A/ßwfæL;¿fæ×­ÛU]õ.ÙÏzÖzÖÞÔäªLb¦v& i;['&6fV~€²¥‰3DÃØV‘IÜl +xsr!SSK8‚Œ,íl%@ü)@°³Øøøø©vöæN:-uzFƏÿôü•0qÿ÷ÈÛIˆ¥¹-€æíö³·Ù:½Aü·j€@' ÀÌ H¨¨êÉ)Ëèd”µ2 [£1 êl¶- [ˆ`fçÿÃílM-ÿj Âü†% ö  åÛ1dÿWè#Àähc ¼},!sGc[§·8Ù,m`gÓ¿¼ùÍìþ&dïh÷–aó{Sµƒ8A€Ž–öN€·ªª’ÒÿàédaìôWmˆå[`gö–ijtþ«¥¿co0oQ'cK[À äæôW-ÀÔb6v«ýfïhù7 gˆ¥­ù?|8‚̍MÁ ä æ û¯éü³OÀêÞØÞìþ÷i»¿³þƒƒ¥6cFfc« tz«mni‹Ìò×¢ÈٚÙØXÿá7u¶ÿ÷˜ ÈñïÑýµ3ôo$ŒMílÁîS2‹²Ó[IÝOeæÿ=‘ÿ$þ_øEÞÿ™¸ÿªÑºÄÿÓûü¯ÐÒÎ`°²±ÍÛüぼ½0€"à¯7æÿÊ5¶±»ÿÙÿš¨úÃÿ +DÎÉøm b¶æoR°2³þÃi ‘¶t™ªZ:-fÆà·ýíײ59‚-mAoZþ=F׿Ä4-,Ö¶ ›ïïÈÖô_™¿Éó7o) EÆ}MÿÎR}SÝIÓÝþØ¿õ¡dgúÆ_ââvnO&6+ÏÛecåðqòyÿõþbû§­dìähé0xkš•íïÖÿíÿOËð_`¤lv¦퉆“±­éÛjý‡ã¯0ÐÙÑñMÑ¿oû[Ëÿnÿ½ä ˆ¼0k´JIOuúŽ—Ý?"iÐÝÉÛd_\§YçWe×᛺ÎWþå©:ˆ¹~Œÿ¥Ù}æÐþy[žaçW'.˜¶ãè4—Ø›’¾+c…¦•‡q'€ås1jê‘N¤çÙ´âÚ;}nV흍5õÏEOð$c­Žˆgwô~”.y~ØT·öh>ÀäÚœ¶õP˜ßóhöïni{úû:.ຶ‰³b¨\Þ¡ÒDø9d‰èk•{F™±%ôV%vwiÑq¬Ì_à6¬qô÷êʀ‹žG5 FGÿOÙÇÏK'0¹…n*}ޜ!‹…I€–E¢­Çä$³T*vâík³ÑhŸèn9ùS¿ÍÙ¢`›æó‘2y–Íïœ)‡C£Ö|ý%—[Yð­ßÇ™{üò™&šb“F„ª‘âe°µ¿AL\W9ýEhË`î­ë'äûšùø +½lL¹:FV5P°Ü –ú8ՎÝQ?Ùã䆆‡óXgΉ÷ÖÖ´^]¹Ín‘^üâRZóã<”sN;¥ FFY:ŽÕÀÿ(,Ûª-%#cÄв Ìä¸w¦Lc„±¨çÈò˜«'!@ÚÓؖåâ5I¼÷r´†@+¿Ù|ñàºQÉè‰F¨[ZÄ?Á2 +àÀ¡Š-b¿nÔÍžÐ!éC°¥LßËÕòUfº_«²À8T?¢Ðû²pz>f`¹˜Ú™Æ¸B¹ü0ҏÏ=¤…å±ÄÿqAmâ¡úÉ"šõRwu²jücðÉhhw¼\ "Ä!é¡©²UÓI`„A tJ›”ž‡½¹§ +H׌»”!,¢B”*ÉÞ³K²ÿšËiR“ »ƒŠÈ÷ìFd;žÏɋŸ| +{Ow›”E_! ´äV*ï8ƙƒY°ÚÙØ(¶•ˆ,Ž9ÞÑ'Ù¬Rñœé±ž6àܓ°¸>Ùø0w‘˜Ï—ó€±~mI*®­*1N‹¡+Y)'ûÉȵDZ&þfCœ +Ô¾ø@½ù[ŽCÁz\' §E0·­;½+§ù1œ§Š¥}Z‰Ü¨»â;Á‘Ž€ª¹k +ƒ)Š@lf¸‡ú€Ï¤Ì«ô(–7¯Zƒ•æ®¿Bªßlɋ¼¸Áì­Éâ8—Kn:ÒÌ>ü6ÞêôÆ*¸³ßԌÁŽoå¢$[g VbÌåÐáÞoàš Eoˆ‘\%âÑèµ,ÐomíPÅÈÂǎõÏßÁã"ŽÓ8Þê·Z« Îü’‘Dù£.$p)b=Í­°]Ҙ›CÇp +n%AУ ÕÍvämg÷IP½Ù­¢ú9^-ÊbkÐoIõõ`>qnfyÆEt0•¸-+Ó²$lNÈYmÊí'O*Zý*Ztr:¶ëÞÂÃÃFÊ!L[]Ÿ˜Ïӗ3øýÞ?uÒ?Ž{ýWWX4pÅ£Àaói¨„~üÇöë”_s‡ódF0LïÛJÌÑRÓp“eªyç6ò¿lè§»‰Î•®Í8±¼›B¼ëÓ8º±¬¼ìbÈ ÎØ@ÀÊÙ¥RÕ먻)£Dã°Ɩÿü“—:_ö£&…”¢UFë%ÜW\7´_aÜízis³4Š;¨t|D +ç?5rªÄú!àsQL |é"XŒÂn5œ‡Ò±²V"J%&ºZBÏÈ«0¤ˆCH#Èf±µéÀš.IhR±ze=!R»oà‡6zV¸4‘A( pˆŸ.HèñƉD¾lÖO‹³zñ)ãRßí¢Õ0\e×x"²àšNd4å_…¦æŠ€bÃči®}+ lL?Oó, +R´I앬"P ×9È mlo3’åõ.i*Ýgi 7£cV kEM»¤V%Od­H½/×âɉvžkóMþ= ÏÅLÝ L<:ÙÈ·ïÅّk?E¹ÄQqQÉæjzðñ†+¥içòùð7¦lÝ{óN1¬L_ð²»> Vœú¶³݆•¸L¼4ï¡#µLŒaË؍·Ñpâ˜Ö·¤ ÛÜñ·å*w|ö{#| ©å"¥ðàà},a¼Ò%Ê¿øaàg–mBïøúöZf])SØù…=(X6µ¡†ãÆèds ¹x›ª©aóÍ `7PÏLIZíu<öéV«R²®y|c£çE£§°·)¦€´P†¡¤¸â¨Uu +Úeõâ>]lmbώm½F¦(T€ë«˜ÌðRz¢–e ÍCñhFÔs¹î{¬&JK±sŠû¨~Ä+@SðíyÍêo&¦wøHæѤû>߶ùHþþÞÁÓÑcµ¸P˜ú€%âš`Du¦J0¡Éix! !ùÍÁˆîû9°×ê:8‘ø‚^8øÔ!#½Ü(ƒbÔ“ ‚¯ó½¸¦‹âÙ­ÚÍ­ß= FÎÞ2ÿÙK{ȃµ?y®.<~ ïŠG¥˜GŒçn¡Ë‹sN)Žl†îQ0ú«ƒºB@X¿R‡¾ò 2WHTGM×ÁŽ´ˆz‡u&£öøS>]¨•„:{ëÐ9p¯«n2­³þލTp¤í¶¦Ã—¦š¼›$(ÎNå‹Ð’ÅL÷V\¬ær,|ФdÉØS8TîÿٟÞ5š´kÇö•ªdãÖÊÇnViŽ$¥ ߎ¢6ý*›:Äêéߔ¯ip3öçÎ"ô£ç4'GbÇ¿d¤ÝtÃÂgè€"2ž¬²sŸo +ÊßwJD¥}·±+ +íôª»¢2@ÂËlT +˜áäèÛûͅ&ßù$«zHΡ×ëù˜ÎA~ çLaõ ¥ÙÛ7ñN–ÒÖ +ðtóîÔ|·ÓõCIÂû|á.<4Mb£VÑÌèœ|÷kîèQI’ú ]£Q¢l5(W˜œ»GÎcòQø书"ú› ;¡YÕ+¦­E;@C’¯SÝc¨jrt›UlˆoLz†°Ášð£€ÿû?_¸ ×oHa¢ؼØ/@0é°÷n$ ý=H–õû¥-„šT)Vž*£‰(ö#v˜¯\ž£nÁ ]*€ikëuRÝü»E;± Ék‰­°%èޔ»C™ïkþ&ŽGûîýŽb_[f .Èáì¸ÕÍhDÜÜóºØ:ø +¦ìS’öÅ ýúäy2‹ šW èKQ¾“ÞjâÒ+VSpC®Õžœ‘«Þ÷UŸN—ÊÞw¡-þ^eŽ8¬˜ɯm¨‹êPý¤ïî²Q˜|gÃ^FHÐÒ6:z+òÊïúÎs}ïq%L +– ªâq­7--v`˜5H”Dr“iêZ¸©ç’^æzÔ·þþT½›‘&S¦¾Ç[왇ê,ÐîIêŒC÷4~;­uñ ƒcÛ´…ãüÛ¯ BÒ +ᚎX•PÑp†Ôlù•Èš Ú!kú¶ÛÆJ=ú6R€٫̶†Px!ÎÏ„ë´V)ÃZ'ûºÂiXä“ñxb´gOÀžýPËã„ò0 ÙOpÉ$`Dæñlë]sPÁZ»ˆ–˜é”=ÅS㬠7O%—Œ*Ø8i +²’5šÿhðVåT¨GÆ¡V%'â[à4sè—FËÏ«M¾7,¤#”(ò."±³ÿðEꕠö—¼;“œ˜ÛRÉãvC¶%7®q =âRð:`žü‚z%]âÛ¥…Âõ7‘®h9lõ!êz†Ó=Ë܆Lœ©÷ŽñÏ_ÏÈ4gU‘" ¼O€N"´ÌP÷Áh_ª›Ç󰟙y>"e¿´SëŠT‡³˜T%MHáJ+Úµ‹Éhÿö„yææ‚¥yb5Û¸Àri-íLðjф*OWL þRZþ/†mE~ÝEìøLz۵ ÖÉÏÉðvužlG.œ™ƒ[R•²–Ä 2kp.¯ƒ_ÇäÖêÒ;ŠêÛú̃|ðœ‰Ï¢¯}:Ê +ŸDlÉóê=V¹ä”e§š²j—$£GºÈubÇ(1y„ÀÃá ¾L=œ<–=ÖC±UíÑÈZ¬&÷8?Â5¿z±o&Ü[@Ú‚2̐‚F1äó½`>?$%,Z'3ß¡W:•ÁE6þQ þè!”y‘kˆÝô ×*®”'åqVE’=¡uŠE|3DVXñÞg»~-c^úÒS4A ðþêìÖ«ÆY ˜Ÿ×}˜ÏåÓbdݯ~ŸSGŠw{ø|Ô +Ɂ|‰?G)X쪅 “‘ôÏŒ•V„hßÛó­¼]H7i9×¥Avs_µ¯ûÖψ¥ºú <]64\ãâ7¯»UEZ½OB<¢¾=ô«cä¶Ynç:~ª„;µ=ŽÏßäÆØ`‚Ы*ˆ¼¼Ä äu‰Åq”rÑÆq;$Ž¿À*ç)Ú4¢’¼oÏ>Ð;sĸÛï[¾uñ€bÁÌÒß2º^mhæzŒ˜9Óå` +Q鶢ëÿŚcàbºÌv¯}PóíXÅÛÛ«†,zük,4€`ú•ö»ÌX ¾-zØàI÷“ä‹ëX¸á/œ-í:n0¬C·"d‰†’ɼ?¿„D<Ö¼Ñi/ð7îxªŽE®â÷Ã}ôì³(œÊY8©¹|EŒäV<שVöìüpú kÖÀŠåõW;ŸQ¿‘Z²ºóœ¼éÜ÷Ih{-Û[̉›òxǪ̴̃ÝåìDi~U7Ó^Pcˆ*‘©‘I~7ÅPáÍ8æÙÈ«Ì_L!¤¨ð®£–AmS–…>iVÊ&DØE-^[M¶Sf4ƒBq²ÜltŸ¿8YZ[㍬κ|„ó +xÇk¿ÐÕSñÑOIßf†½#Eç³<\\XÜ ´Êm–FP¾©"­¹ˆè:K†ïåbUåÉáþsà©ÞËô¸cRjT›«u&ŠÑå†lüØtþŸM›”Áî v­CðÏ«ím¬?¥U4B¦Ìx7ƒ}Ø}2±Rl¢`í㟵‰]'†„ž”¿º™w»ñŽ6µl’d¢}ä‰r¹Õ`â·»Z aôº¿BssZ©$ÎP1¢Mù^)©Á|¾o‘eXìy™W *œš†ù²ä<ö*hÉ8êïԚÄsòýÞ%m²2ÓU¨}ÞÑëü¦WCø“`_ïûKBTÃQûIÑú”‰`A©e3ñ•wÃË|õéÄêUnn8Ãç#³ñ§Õ]üÓug¶ ™<‘Ë“P/ª¿%EQ¦ Nº’*°öïÐ?3ÇLöd„ÎÕh=‹ œ›t:gs%å¥JU­,%þ­œv_(Û:˜:ü™´Ô>•ÉJ7†Xq4üSД0#‚ÝŒ!ւ[«È"¦fó‚ÃÂøÃÁex×Ô¡Ñ`$2Sy¶?”ˆ˜í ‹oäšÀŒ«î3ög—LåЉÉXÕEÝÛìX…ç™S›³]8ۂœ­4¾¦'B›sÌþ”1ø’óìõ©ƒr‚àlsOŸ¸‚Ç«`ñaWu{ÚLÙ«òož5, ®B™ðïæéBÂ<ãN«ë¨kŒDy·3;¾$ԅ9#&y“"®äJaø̑¼Îÿêj˜²]›æ®9’¼jB/˜eãÔÝAE ¾ö*"§'³÷VËìè$`ƒùfnrì±³¸3>å 5»o#£H?Ýy½[‚¯æFe ³Pyʍ‰!…^&ӞS¬±peQ[¼ÇÚ¶rîú.ý»i>™Im¿“_ý³´÷½“|„MƒÏ»Áô»«Mé?¸tŒùsXßï.»úÂ]¾áF<à£ÞZAj¦t}`°ÌÔ$~‰kƒa Y®»"þhV¬PûßК„caim)DifÎÍ+ ßuŒÐÉ Q¥?ä‡&r›­·´Âˆ”.‰¶F„ê'¦NB7Ww镜!û(½¢UjÎ28ça´¼®”WûìlZ¾B·é¹SAœF£w褼°¹ªå*¿]³år"q˜.ü13Oš‹´N9³‘´—lL,úÇ#JŸtSø@eJ,ýU´µx}ŽbÝ ¤Y$Ω‚=ȵú©RA¤GtTô¿â.ŸPÖj¢Â•(¾,'ÌU` Ô!e¥é¥¤AÔ>rùTJ›rj—}ÑÀÌ•ÄºÝ\Ü7ŒÎñî@÷Ú¯–j«ŠF Ž’ ÒP´+ «Ö„QÍé q;U5>`3÷»9™äכæ°Âa-ÉráÛ¯ô,ñ­ó:I²ˆì ñ×Y™à3X…¥j+xÒëVÜÊ^)ïßãǤZŽ)aoÔÜÐj±ú?dœÀì¦+ÂEªúnd, ʅG€Á¡ñÍUÈû5a<aq=ØA@íkN¶À‡þÙØ€?DÅ»5ÿ¹U ‹jø“¶$ÿтug 6󸛣\H’õpµR| :ØáÙ1cÜ0@)}`éý§¯Îú¤gu4LÓðÌH5ñCEëÅ"õ”y•ðÙÆ{Ù8ZvlnÙ"r±_S¯BëŠd¯ÿȾ2ºjÍbÕçæG‚-_É Œü²},ܧ˘Jî(…K¨R(é<ïšZë‘\GÍ꫐ü úÒ9ÀÐ=£Â>V‡#¾G¾¦_fgž±J ׇ(ËàwLIåÉ6ʦÖ0¿²]:" å¯(Q4Ê°r·?Ç;c¼v “Û`ÁfÇ&b$‹ *¡]—Ð7×¡è¥ jÍ^0dòâgçú¢µSÞݧNßN ([!.¿~Í1½k+%Ȳ üK+LÂ0qsè汌԰Ÿ,Àhk3œ%¶" ÖCw[˜u:@ƒ#úÇP5úx/hf’ð§ÙvZf‡œŽ™Ãj¦óQösðÓ†U–ïrO‡EË:½„$#ó2îɏarB!úÎz ŠgADí÷ïV¡¹ËŸ›Ç#c‚|ëÙ^7s:U'®ê²Å¢ °Éä”xó2m;:éPµä¶sMºsè@ùGÝñ¨ý4/¨ðd^RiÈWä†}:}îƏ]©¾˜ò ÔDñ˜Öçù›Î“Œ_L–¼¨É[¸°‘’…*GÀÝ ¯dáöf$À ¹ê³-×_ è©h#ïgUá—GÛ±#Ñ< +|Ú¿´‘s`ódÑN²ƒS„äT«ÆÝ2Ž[_´ªÕ+êÝ…˜õ#uØkåcÇ\†%þ|úS~£ºá’eª!0ږG‡µÓP™Œ<“x¨ê|ôã¤0‘å‚#¥§U¿W¢wšÀl‹&w€c\òȵ +] `þsÇï".¸e~·o{=úq!mǯ!£- cÿásuîÉ -¡NýÑôÓøØ~qÕ ‚î³}¥“üà—wx¹A-Ž~c)TEòÞVï¸V½õÅëE9¶~   gÞt®@™Ñ!ïM AªzìJŠÄ ¤TˆÐlžt妓.–´i}Ô÷Àª^´Íe¸Á‚Ts% Båȯž< ʉȁ‰;pÕimÂâKÆ"ûƒ°ýþÌ>Bq|¡´\6”´mÕõÖþ†Á®×–ý\Lwæðù"R²´"ß:=§7ºY‘©ÖhÏðë©éséÅž±Ã^>a$}EÝ3±\ŠŒWK$2U²ÔˆL‚ÆÆ\ó —;lpVwë’=uÞýÃ^5Ç[\«ÃÌ6W)ý_—¼$9IÐ È´1õkMõ©ïyò%¸ÌJ¼œ/-ßÙ]ðkQF¹z¢ñªÚEK¢4³ÆV@âށñÚ‚ O‡ñoå?ÑiØe<ª´áËÏ«™ÑÂôí (>áX.¯dZSÐ,P曊¥ïÃÃÉâÙrŸ:1P µBœØ»®Ó„‚û3Nî”U +c#Ùì¾Ö|9FoüÞ®ç1:2/Ë<€R”C^Á± ݧ"5˜’bòu‚œ°ÊS^O ퟒ +vÒ\=mù75M[ûR< D°u¼VoKûvUžÁ)^ûeÿ9‡Þª#¤„1\¥áut e‰Õ·½½Á:Cd¨Ë:­ïÝ'mi¬k¢+­ˆâQ]_CA"“W…vb¿Iþ›¼zs‹‘„õéÃ=S©„¬€ÊSœõ)YûÉDÝ!êÜ×ù«`ÆöÁ¤A…0g¯egd­VbQùù®=<ò”#—•/;íGëOZP^br+Q߸‰*”ǹ ‘‡Í$Ey%;IѤ!–M³Ý+Ûð>»œ +Xë7>5-Òâ^HýúÀ%x5á>r:Ðx}"ćþG̈ÿŽC.í·™Oß5ý©Ëìô3PCŽN†õÚiW$î(›¿wÌ¡ºuw‰J‚W°ÇøO`O䟏Òœý¼)ï Ċ=œîåèC9ê¨çÐí +’örqFÒ ;ûhàwlDn1U—©e~¾†#\ªÜÒþÕÊŽÿ™ä½ãÝ}Q(¥õúbž`¨Ÿ¢r¬*”|BύdäÛs¾°iڌíJ•‰xwüéÜà͊4ƒy¤G¼Ñ½Ù‚ó„ϵ„öi¶gµ ßÇgYs:ÑÝÊ#æp¥mâa9:ÐËÓ3ò@ ËxN»ØØ'1Åâ™ To‹üB‡µEZø­5uÝÜ#BoÙîîü1‡]Øë{Ò¸Óì;ÿ}ž¼k²$ÚTpSì6t*I·ÉæÁÕnäîrH7Œ¤¥<–w{s°}GD@4H®ùbYtùcì2IŠ/š·0‹’·IôøàÅ-/ÕW ”ï„ت0pj¹¯¼oM(´õ£ÄiÁ˜ÁeIx›®k@ÆyÞ[ÕLÈ ËíÆY«qxÄ! <ƒ'Ñàì¦F{s"¥ƒ¹¡ØÏNôÊp(ÉÔÊÚ}Öô6Ús’ÒÆÆT½âKSôz¿þÄÖR²ðòõÛÑnÕöº?;ÁxñÅßn {QÎi|"“üč•£L×\ü¹ŽÊ7æû>‰ózÖµ}LJ=þ3ý³P¾¦Dvi¶­«o¡ÊZžF¾5Åíw~¨Gw¼©Ï*܈¤f  B{º¸‰uøK»¥ûf-ëš7mzâ±ïyɓè˜ý1GÔy¦d3R’—ìüê3ò%ßrÓæ†6Kt¹]­Ö“u +^QW3 sÁ¾Q¤]fõÞ>eŽœð‹-½8$Mzn:ÖI!~%¶a’„½¶’Y#€²ì4â©pS¦×S¡þcÉ7‹&¯RÛw%˜íD›‘ó!”uBRñ~™/Š6 ¤: ÜrÂfL›ù|²„ÝûB4;Ù`”QƗt9]’=ÝüŸQeCÓvç‚0ÏCÝ7-›ÒQÙVÛQ€/mò¾]÷‘ÆBXÚ K¥ª»¯aˆ/Ö·H½ls~Ùª„!¤€9ÁœOÈ5¦š BKڒ"˜e<‹,òäÔ1ø F ê$ŸÔÂn%¦:é؂¹Œ9t­K5 ”:Š ðÙóó¨?Zç9Ð/åW7 ßµZØ&}l?Øl©c„>\lTUÝ÷¨Üè”Ëïá|nÿ¹1-¢¥i§°,ª|~¥ƒP«s»7^H;Ü//ÍÑÙqÁ¿¿_õy…Oª±ü®!MëÞä£.ævùðd˜ß ýô”±€‰J#;OCÈ\Kþړ¬{éÓÈn:_â²Ã°'h»k)§qxÓ éFš'´Ðb+ °’\Æy¢…WF2ˆ¬á½Ïë؇½h Éûþ5éꉒ­Ë©ÐMgÉë²1¢û$ø¨äU½…«% +Æ.I#ì՟’aH™oêöú~u—‘§Noe¥bó‡BÛ”Åv灀_ÀÑo½}!h1Ä+›UïHüëot?`in;Ï\h¬qF¾Âþ C /͇q*RÃ.!}Q¯qÕ肑öª7÷­SÉî +¨Ül3pt’S³ Ë%E4˜ +¤ç£,ËÀá×÷!ÒÎàäØú#o9>~5òŽBÜÚ6µ3}) ÌHÞ¸Á–4Ž1tùÆQ\þ¼ ³GPÌ ek;¨ +¬'@î¢ÑRDµL8ƒâÇeæcS;Kšê;P·6‡‚ö#íQÊ®hœbÞÇ Ï ¶9Õ@›§ö×â¥QëMRîüݹû îÈy;ªQIm¯ª(/"¹žBÝ'÷v¹Uƒ¾xn'a<£ã¼ U”‡2ì-]¥¼ÛõÖ8ž:ê—9™‡¥Rì¹#E°+Âl²g¡×~’&'>Û Iâ´b_ò.G~ýüvÐÛèÂU텅•FÒT»sEª¢4Q,´õ¾ÆIÛñO!lu˜-¥¶{TëÖ6C<üreíÕ +Â"ßS&|á°M=©–æöÁ]ØþxÎú¼d&ÓýÎ̬´ÞøÅ_=r»öõúö¼å÷1q˜Þ>CÎàZ s¤¼nb¿Jªdªœ°i1E’´ÐM'×øhãLñ]—¥v[þû#Y 6º3“O\´Íìý–⤛Œ»®éœä/z\yÉHÇÚg2Eܲ +_Kh96¯>º…jK5”„ +‹ªÆ’ n/@0ÿðacv¿›üÞM{ÚêصùKÇš¶…†=½³4â@í3!0+™'Së˜ï©; .®S"T—ÑÈuWTn›«g~‘5:pûƇ5§ŠúBmc†g}7'WI'¢BF†°Սí?ë@¹æ.|E1*¹9KÑÓó‰ouoñ¤‰ÿ »ª“‹ù¼f‹‚U–¨§¡:,û)Ž§ö•ÙÂ"…à4Ùâ­èÖ®Bð^©êçCÆÊ«]—ÏË5qÙ|‘3BâóÚ¿$éÓK‚`]´•$çø?&¨A4©¦7»LÌmƄ ƒŒðøT¨™±™Ÿ *ÃNumýy§àLР›¯Yÿ‡?äÿðÿ 2vt²³1v´Fþ?q¬‡‹endstream +endobj +514 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 46 +/LastChar 121 +/Widths 8026 0 R +/BaseFont /ESSCCL+NimbusSanL-Bold +/FontDescriptor 512 0 R +>> endobj +512 0 obj << +/Ascent 722 +/CapHeight 722 +/Descent -217 +/FontName /ESSCCL+NimbusSanL-Bold +/ItalicAngle 0 +/StemV 141 +/XHeight 532 +/FontBBox [-173 -307 1003 949] +/Flags 4 +/CharSet (/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/y) +/FontFile 513 0 R +>> endobj +8026 0 obj +[278 0 556 556 556 556 556 556 556 556 556 556 0 0 0 0 0 0 0 722 722 722 722 667 611 778 722 278 0 722 611 833 722 778 667 0 722 667 611 722 667 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 0 389 556 333 611 556 778 0 556 ] +endobj +515 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [506 0 R 517 0 R 521 0 R 669 0 R 817 0 R 914 0 R] +>> endobj +971 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [950 0 R 973 0 R 991 0 R 994 0 R 1034 0 R 1080 0 R] +>> endobj +1194 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [1136 0 R 1196 0 R 1238 0 R 1275 0 R 1333 0 R 1371 0 R] +>> endobj +1486 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [1413 0 R 1488 0 R 1541 0 R 1586 0 R 1637 0 R 1697 0 R] +>> endobj +1809 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [1750 0 R 1811 0 R 1861 0 R 1907 0 R 1945 0 R 1992 0 R] +>> endobj +2113 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [2052 0 R 2115 0 R 2169 0 R 2221 0 R 2272 0 R 2318 0 R] +>> endobj +2417 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [2352 0 R 2419 0 R 2487 0 R 2549 0 R 2605 0 R 2650 0 R] +>> endobj +2735 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [2689 0 R 2737 0 R 2786 0 R 2826 0 R 2873 0 R 2911 0 R] +>> endobj +3004 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [2960 0 R 3006 0 R 3048 0 R 3089 0 R 3140 0 R 3178 0 R] +>> endobj +3275 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [3224 0 R 3277 0 R 3322 0 R 3371 0 R 3410 0 R 3458 0 R] +>> endobj +3535 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [3497 0 R 3537 0 R 3582 0 R 3630 0 R 3689 0 R 3763 0 R] +>> endobj +3872 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [3821 0 R 3874 0 R 3933 0 R 4007 0 R 4086 0 R 4145 0 R] +>> endobj +4275 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [4212 0 R 4277 0 R 4347 0 R 4399 0 R 4464 0 R 4509 0 R] +>> endobj +4620 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [4548 0 R 4622 0 R 4679 0 R 4753 0 R 4832 0 R 4890 0 R] +>> endobj +5034 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [4962 0 R 5036 0 R 5098 0 R 5172 0 R 5249 0 R 5301 0 R] +>> endobj +5410 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [5341 0 R 5412 0 R 5474 0 R 5531 0 R 5605 0 R 5677 0 R] +>> endobj +5785 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [5740 0 R 5787 0 R 5857 0 R 5929 0 R 6006 0 R 6062 0 R] +>> endobj +6191 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [6134 0 R 6193 0 R 6265 0 R 6301 0 R 6377 0 R 6450 0 R] +>> endobj +6550 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [6506 0 R 6552 0 R 6650 0 R 6722 0 R 6792 0 R 6866 0 R] +>> endobj +6963 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [6910 0 R 6965 0 R 7009 0 R 7052 0 R 7111 0 R 7160 0 R] +>> endobj +7274 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [7225 0 R 7276 0 R 7335 0 R 7388 0 R 7444 0 R 7501 0 R] +>> endobj +7615 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [7562 0 R 7617 0 R 7675 0 R 7740 0 R 7788 0 R 7837 0 R] +>> endobj +7932 0 obj << +/Type /Pages +/Count 3 +/Parent 8030 0 R +/Kids [7884 0 R 7934 0 R 7974 0 R] +>> endobj +8027 0 obj << +/Type /Pages +/Count 36 +/Parent 8031 0 R +/Kids [515 0 R 971 0 R 1194 0 R 1486 0 R 1809 0 R 2113 0 R] +>> endobj +8028 0 obj << +/Type /Pages +/Count 36 +/Parent 8031 0 R +/Kids [2417 0 R 2735 0 R 3004 0 R 3275 0 R 3535 0 R 3872 0 R] +>> endobj +8029 0 obj << +/Type /Pages +/Count 36 +/Parent 8031 0 R +/Kids [4275 0 R 4620 0 R 5034 0 R 5410 0 R 5785 0 R 6191 0 R] +>> endobj +8030 0 obj << +/Type /Pages +/Count 27 +/Parent 8031 0 R +/Kids [6550 0 R 6963 0 R 7274 0 R 7615 0 R 7932 0 R] +>> endobj +8031 0 obj << +/Type /Pages +/Count 135 +/Kids [8027 0 R 8028 0 R 8029 0 R 8030 0 R] +>> endobj +8032 0 obj << +/Type /Outlines +/First 3 0 R +/Last 31 0 R +/Count 4 +>> endobj +503 0 obj << +/Title 504 0 R +/A 501 0 R +/Parent 31 0 R +/Prev 499 0 R +>> endobj +499 0 obj << +/Title 500 0 R +/A 497 0 R +/Parent 31 0 R +/Prev 495 0 R +/Next 503 0 R +>> endobj +495 0 obj << +/Title 496 0 R +/A 493 0 R +/Parent 31 0 R +/Prev 491 0 R +/Next 499 0 R +>> endobj +491 0 obj << +/Title 492 0 R +/A 489 0 R +/Parent 31 0 R +/Prev 487 0 R +/Next 495 0 R +>> endobj +487 0 obj << +/Title 488 0 R +/A 485 0 R +/Parent 31 0 R +/Prev 483 0 R +/Next 491 0 R +>> endobj +483 0 obj << +/Title 484 0 R +/A 481 0 R +/Parent 31 0 R +/Prev 479 0 R +/Next 487 0 R +>> endobj +479 0 obj << +/Title 480 0 R +/A 477 0 R +/Parent 31 0 R +/Prev 475 0 R +/Next 483 0 R +>> endobj +475 0 obj << +/Title 476 0 R +/A 473 0 R +/Parent 31 0 R +/Prev 471 0 R +/Next 479 0 R +>> endobj +471 0 obj << +/Title 472 0 R +/A 469 0 R +/Parent 31 0 R +/Prev 467 0 R +/Next 475 0 R +>> endobj +467 0 obj << +/Title 468 0 R +/A 465 0 R +/Parent 31 0 R +/Prev 463 0 R +/Next 471 0 R +>> endobj +463 0 obj << +/Title 464 0 R +/A 461 0 R +/Parent 31 0 R +/Prev 459 0 R +/Next 467 0 R +>> endobj +459 0 obj << +/Title 460 0 R +/A 457 0 R +/Parent 31 0 R +/Prev 455 0 R +/Next 463 0 R +>> endobj +455 0 obj << +/Title 456 0 R +/A 453 0 R +/Parent 31 0 R +/Prev 451 0 R +/Next 459 0 R +>> endobj +451 0 obj << +/Title 452 0 R +/A 449 0 R +/Parent 31 0 R +/Prev 447 0 R +/Next 455 0 R +>> endobj +447 0 obj << +/Title 448 0 R +/A 445 0 R +/Parent 31 0 R +/Prev 443 0 R +/Next 451 0 R +>> endobj +443 0 obj << +/Title 444 0 R +/A 441 0 R +/Parent 31 0 R +/Prev 439 0 R +/Next 447 0 R +>> endobj +439 0 obj << +/Title 440 0 R +/A 437 0 R +/Parent 31 0 R +/Prev 435 0 R +/Next 443 0 R +>> endobj +435 0 obj << +/Title 436 0 R +/A 433 0 R +/Parent 31 0 R +/Prev 431 0 R +/Next 439 0 R +>> endobj +431 0 obj << +/Title 432 0 R +/A 429 0 R +/Parent 31 0 R +/Prev 427 0 R +/Next 435 0 R +>> endobj +427 0 obj << +/Title 428 0 R +/A 425 0 R +/Parent 31 0 R +/Prev 423 0 R +/Next 431 0 R +>> endobj +423 0 obj << +/Title 424 0 R +/A 421 0 R +/Parent 31 0 R +/Prev 419 0 R +/Next 427 0 R +>> endobj +419 0 obj << +/Title 420 0 R +/A 417 0 R +/Parent 31 0 R +/Prev 415 0 R +/Next 423 0 R +>> endobj +415 0 obj << +/Title 416 0 R +/A 413 0 R +/Parent 31 0 R +/Prev 411 0 R +/Next 419 0 R +>> endobj +411 0 obj << +/Title 412 0 R +/A 409 0 R +/Parent 31 0 R +/Prev 407 0 R +/Next 415 0 R +>> endobj +407 0 obj << +/Title 408 0 R +/A 405 0 R +/Parent 31 0 R +/Prev 403 0 R +/Next 411 0 R +>> endobj +403 0 obj << +/Title 404 0 R +/A 401 0 R +/Parent 31 0 R +/Prev 399 0 R +/Next 407 0 R +>> endobj +399 0 obj << +/Title 400 0 R +/A 397 0 R +/Parent 31 0 R +/Prev 395 0 R +/Next 403 0 R +>> endobj +395 0 obj << +/Title 396 0 R +/A 393 0 R +/Parent 31 0 R +/Prev 391 0 R +/Next 399 0 R +>> endobj +391 0 obj << +/Title 392 0 R +/A 389 0 R +/Parent 31 0 R +/Prev 387 0 R +/Next 395 0 R +>> endobj +387 0 obj << +/Title 388 0 R +/A 385 0 R +/Parent 31 0 R +/Prev 383 0 R +/Next 391 0 R +>> endobj +383 0 obj << +/Title 384 0 R +/A 381 0 R +/Parent 31 0 R +/Prev 379 0 R +/Next 387 0 R +>> endobj +379 0 obj << +/Title 380 0 R +/A 377 0 R +/Parent 31 0 R +/Prev 375 0 R +/Next 383 0 R +>> endobj +375 0 obj << +/Title 376 0 R +/A 373 0 R +/Parent 31 0 R +/Prev 371 0 R +/Next 379 0 R +>> endobj +371 0 obj << +/Title 372 0 R +/A 369 0 R +/Parent 31 0 R +/Prev 367 0 R +/Next 375 0 R +>> endobj +367 0 obj << +/Title 368 0 R +/A 365 0 R +/Parent 31 0 R +/Prev 363 0 R +/Next 371 0 R +>> endobj +363 0 obj << +/Title 364 0 R +/A 361 0 R +/Parent 31 0 R +/Prev 359 0 R +/Next 367 0 R +>> endobj +359 0 obj << +/Title 360 0 R +/A 357 0 R +/Parent 31 0 R +/Prev 355 0 R +/Next 363 0 R +>> endobj +355 0 obj << +/Title 356 0 R +/A 353 0 R +/Parent 31 0 R +/Prev 351 0 R +/Next 359 0 R +>> endobj +351 0 obj << +/Title 352 0 R +/A 349 0 R +/Parent 31 0 R +/Prev 347 0 R +/Next 355 0 R +>> endobj +347 0 obj << +/Title 348 0 R +/A 345 0 R +/Parent 31 0 R +/Prev 343 0 R +/Next 351 0 R +>> endobj +343 0 obj << +/Title 344 0 R +/A 341 0 R +/Parent 31 0 R +/Prev 339 0 R +/Next 347 0 R +>> endobj +339 0 obj << +/Title 340 0 R +/A 337 0 R +/Parent 31 0 R +/Prev 335 0 R +/Next 343 0 R +>> endobj +335 0 obj << +/Title 336 0 R +/A 333 0 R +/Parent 31 0 R +/Prev 331 0 R +/Next 339 0 R +>> endobj +331 0 obj << +/Title 332 0 R +/A 329 0 R +/Parent 31 0 R +/Prev 327 0 R +/Next 335 0 R +>> endobj +327 0 obj << +/Title 328 0 R +/A 325 0 R +/Parent 31 0 R +/Prev 323 0 R +/Next 331 0 R +>> endobj +323 0 obj << +/Title 324 0 R +/A 321 0 R +/Parent 31 0 R +/Prev 319 0 R +/Next 327 0 R +>> endobj +319 0 obj << +/Title 320 0 R +/A 317 0 R +/Parent 31 0 R +/Prev 315 0 R +/Next 323 0 R +>> endobj +315 0 obj << +/Title 316 0 R +/A 313 0 R +/Parent 31 0 R +/Prev 311 0 R +/Next 319 0 R +>> endobj +311 0 obj << +/Title 312 0 R +/A 309 0 R +/Parent 31 0 R +/Prev 307 0 R +/Next 315 0 R +>> endobj +307 0 obj << +/Title 308 0 R +/A 305 0 R +/Parent 31 0 R +/Prev 303 0 R +/Next 311 0 R +>> endobj +303 0 obj << +/Title 304 0 R +/A 301 0 R +/Parent 31 0 R +/Prev 299 0 R +/Next 307 0 R +>> endobj +299 0 obj << +/Title 300 0 R +/A 297 0 R +/Parent 31 0 R +/Prev 295 0 R +/Next 303 0 R +>> endobj +295 0 obj << +/Title 296 0 R +/A 293 0 R +/Parent 31 0 R +/Prev 291 0 R +/Next 299 0 R +>> endobj +291 0 obj << +/Title 292 0 R +/A 289 0 R +/Parent 31 0 R +/Prev 287 0 R +/Next 295 0 R +>> endobj +287 0 obj << +/Title 288 0 R +/A 285 0 R +/Parent 31 0 R +/Prev 283 0 R +/Next 291 0 R +>> endobj +283 0 obj << +/Title 284 0 R +/A 281 0 R +/Parent 31 0 R +/Prev 279 0 R +/Next 287 0 R +>> endobj +279 0 obj << +/Title 280 0 R +/A 277 0 R +/Parent 31 0 R +/Prev 275 0 R +/Next 283 0 R +>> endobj +275 0 obj << +/Title 276 0 R +/A 273 0 R +/Parent 31 0 R +/Prev 271 0 R +/Next 279 0 R +>> endobj +271 0 obj << +/Title 272 0 R +/A 269 0 R +/Parent 31 0 R +/Prev 267 0 R +/Next 275 0 R +>> endobj +267 0 obj << +/Title 268 0 R +/A 265 0 R +/Parent 31 0 R +/Prev 263 0 R +/Next 271 0 R +>> endobj +263 0 obj << +/Title 264 0 R +/A 261 0 R +/Parent 31 0 R +/Prev 259 0 R +/Next 267 0 R +>> endobj +259 0 obj << +/Title 260 0 R +/A 257 0 R +/Parent 31 0 R +/Prev 255 0 R +/Next 263 0 R +>> endobj +255 0 obj << +/Title 256 0 R +/A 253 0 R +/Parent 31 0 R +/Prev 251 0 R +/Next 259 0 R +>> endobj +251 0 obj << +/Title 252 0 R +/A 249 0 R +/Parent 31 0 R +/Prev 247 0 R +/Next 255 0 R +>> endobj +247 0 obj << +/Title 248 0 R +/A 245 0 R +/Parent 31 0 R +/Prev 243 0 R +/Next 251 0 R +>> endobj +243 0 obj << +/Title 244 0 R +/A 241 0 R +/Parent 31 0 R +/Prev 239 0 R +/Next 247 0 R +>> endobj +239 0 obj << +/Title 240 0 R +/A 237 0 R +/Parent 31 0 R +/Prev 235 0 R +/Next 243 0 R +>> endobj +235 0 obj << +/Title 236 0 R +/A 233 0 R +/Parent 31 0 R +/Prev 231 0 R +/Next 239 0 R +>> endobj +231 0 obj << +/Title 232 0 R +/A 229 0 R +/Parent 31 0 R +/Prev 227 0 R +/Next 235 0 R +>> endobj +227 0 obj << +/Title 228 0 R +/A 225 0 R +/Parent 31 0 R +/Prev 223 0 R +/Next 231 0 R +>> endobj +223 0 obj << +/Title 224 0 R +/A 221 0 R +/Parent 31 0 R +/Prev 219 0 R +/Next 227 0 R +>> endobj +219 0 obj << +/Title 220 0 R +/A 217 0 R +/Parent 31 0 R +/Prev 215 0 R +/Next 223 0 R +>> endobj +215 0 obj << +/Title 216 0 R +/A 213 0 R +/Parent 31 0 R +/Prev 211 0 R +/Next 219 0 R +>> endobj +211 0 obj << +/Title 212 0 R +/A 209 0 R +/Parent 31 0 R +/Prev 207 0 R +/Next 215 0 R +>> endobj +207 0 obj << +/Title 208 0 R +/A 205 0 R +/Parent 31 0 R +/Prev 203 0 R +/Next 211 0 R +>> endobj +203 0 obj << +/Title 204 0 R +/A 201 0 R +/Parent 31 0 R +/Prev 199 0 R +/Next 207 0 R +>> endobj +199 0 obj << +/Title 200 0 R +/A 197 0 R +/Parent 31 0 R +/Prev 195 0 R +/Next 203 0 R +>> endobj +195 0 obj << +/Title 196 0 R +/A 193 0 R +/Parent 31 0 R +/Prev 191 0 R +/Next 199 0 R +>> endobj +191 0 obj << +/Title 192 0 R +/A 189 0 R +/Parent 31 0 R +/Prev 187 0 R +/Next 195 0 R +>> endobj +187 0 obj << +/Title 188 0 R +/A 185 0 R +/Parent 31 0 R +/Prev 183 0 R +/Next 191 0 R +>> endobj +183 0 obj << +/Title 184 0 R +/A 181 0 R +/Parent 31 0 R +/Prev 179 0 R +/Next 187 0 R +>> endobj +179 0 obj << +/Title 180 0 R +/A 177 0 R +/Parent 31 0 R +/Prev 175 0 R +/Next 183 0 R +>> endobj +175 0 obj << +/Title 176 0 R +/A 173 0 R +/Parent 31 0 R +/Prev 171 0 R +/Next 179 0 R +>> endobj +171 0 obj << +/Title 172 0 R +/A 169 0 R +/Parent 31 0 R +/Prev 167 0 R +/Next 175 0 R +>> endobj +167 0 obj << +/Title 168 0 R +/A 165 0 R +/Parent 31 0 R +/Prev 163 0 R +/Next 171 0 R +>> endobj +163 0 obj << +/Title 164 0 R +/A 161 0 R +/Parent 31 0 R +/Prev 159 0 R +/Next 167 0 R +>> endobj +159 0 obj << +/Title 160 0 R +/A 157 0 R +/Parent 31 0 R +/Prev 155 0 R +/Next 163 0 R +>> endobj +155 0 obj << +/Title 156 0 R +/A 153 0 R +/Parent 31 0 R +/Prev 151 0 R +/Next 159 0 R +>> endobj +151 0 obj << +/Title 152 0 R +/A 149 0 R +/Parent 31 0 R +/Prev 147 0 R +/Next 155 0 R +>> endobj +147 0 obj << +/Title 148 0 R +/A 145 0 R +/Parent 31 0 R +/Prev 143 0 R +/Next 151 0 R +>> endobj +143 0 obj << +/Title 144 0 R +/A 141 0 R +/Parent 31 0 R +/Prev 139 0 R +/Next 147 0 R +>> endobj +139 0 obj << +/Title 140 0 R +/A 137 0 R +/Parent 31 0 R +/Prev 135 0 R +/Next 143 0 R +>> endobj +135 0 obj << +/Title 136 0 R +/A 133 0 R +/Parent 31 0 R +/Prev 131 0 R +/Next 139 0 R +>> endobj +131 0 obj << +/Title 132 0 R +/A 129 0 R +/Parent 31 0 R +/Prev 127 0 R +/Next 135 0 R +>> endobj +127 0 obj << +/Title 128 0 R +/A 125 0 R +/Parent 31 0 R +/Prev 123 0 R +/Next 131 0 R +>> endobj +123 0 obj << +/Title 124 0 R +/A 121 0 R +/Parent 31 0 R +/Prev 119 0 R +/Next 127 0 R +>> endobj +119 0 obj << +/Title 120 0 R +/A 117 0 R +/Parent 31 0 R +/Prev 115 0 R +/Next 123 0 R +>> endobj +115 0 obj << +/Title 116 0 R +/A 113 0 R +/Parent 31 0 R +/Prev 111 0 R +/Next 119 0 R +>> endobj +111 0 obj << +/Title 112 0 R +/A 109 0 R +/Parent 31 0 R +/Prev 107 0 R +/Next 115 0 R +>> endobj +107 0 obj << +/Title 108 0 R +/A 105 0 R +/Parent 31 0 R +/Prev 103 0 R +/Next 111 0 R +>> endobj +103 0 obj << +/Title 104 0 R +/A 101 0 R +/Parent 31 0 R +/Prev 99 0 R +/Next 107 0 R +>> endobj +99 0 obj << +/Title 100 0 R +/A 97 0 R +/Parent 31 0 R +/Prev 95 0 R +/Next 103 0 R +>> endobj +95 0 obj << +/Title 96 0 R +/A 93 0 R +/Parent 31 0 R +/Prev 91 0 R +/Next 99 0 R +>> endobj +91 0 obj << +/Title 92 0 R +/A 89 0 R +/Parent 31 0 R +/Prev 87 0 R +/Next 95 0 R +>> endobj +87 0 obj << +/Title 88 0 R +/A 85 0 R +/Parent 31 0 R +/Prev 83 0 R +/Next 91 0 R +>> endobj +83 0 obj << +/Title 84 0 R +/A 81 0 R +/Parent 31 0 R +/Prev 79 0 R +/Next 87 0 R +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 31 0 R +/Prev 75 0 R +/Next 83 0 R +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 31 0 R +/Prev 71 0 R +/Next 79 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 31 0 R +/Prev 67 0 R +/Next 75 0 R +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 31 0 R +/Prev 63 0 R +/Next 71 0 R +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 31 0 R +/Prev 59 0 R +/Next 67 0 R +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 31 0 R +/Prev 55 0 R +/Next 63 0 R +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 31 0 R +/Prev 51 0 R +/Next 59 0 R +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 31 0 R +/Prev 47 0 R +/Next 55 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 31 0 R +/Prev 43 0 R +/Next 51 0 R +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 31 0 R +/Prev 39 0 R +/Next 47 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 31 0 R +/Prev 35 0 R +/Next 43 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 31 0 R +/Next 39 0 R +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 8032 0 R +/Prev 11 0 R +/First 35 0 R +/Last 503 0 R +/Count -118 +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 11 0 R +/Prev 23 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 11 0 R +/Prev 19 0 R +/Next 27 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 11 0 R +/Prev 15 0 R +/Next 23 0 R +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 8032 0 R +/Prev 7 0 R +/Next 31 0 R +/First 15 0 R +/Last 27 0 R +/Count -4 +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 8032 0 R +/Prev 3 0 R +/Next 11 0 R +>> endobj +3 0 obj << +/Title 4 0 R +/A 1 0 R +/Parent 8032 0 R +/Next 7 0 R +>> endobj +8033 0 obj << +/Names [(0:0) 511 0 R (0:100) 986 0 R (0:1000) 1915 0 R (0:1001) 1916 0 R (0:1002) 1917 0 R (0:1003) 1918 0 R (0:1004) 1919 0 R (0:1005) 1920 0 R (0:1006) 1921 0 R (0:1007) 1922 0 R (0:1008) 1923 0 R (0:1009) 1924 0 R (0:101) 987 0 R (0:1010) 1925 0 R (0:1011) 1926 0 R (0:1012) 1927 0 R (0:1013) 1928 0 R (0:1014) 1929 0 R (0:1015) 1930 0 R (0:1016) 1931 0 R (0:1017) 1932 0 R (0:1018) 1933 0 R (0:1019) 1934 0 R (0:102) 988 0 R (0:1020) 1935 0 R (0:1023) 1936 0 R (0:1024) 1937 0 R (0:1025) 1938 0 R (0:1026) 1939 0 R (0:1027) 1940 0 R (0:1028) 1941 0 R (0:1029) 1942 0 R (0:103) 989 0 R (0:1030) 1943 0 R (0:1031) 1948 0 R (0:1032) 1949 0 R (0:1033) 1950 0 R (0:1034) 1951 0 R (0:1035) 1952 0 R (0:1036) 1953 0 R (0:1037) 1954 0 R (0:1038) 1955 0 R (0:1039) 1956 0 R (0:1040) 1957 0 R (0:1041) 1958 0 R (0:1042) 1959 0 R (0:1043) 1960 0 R (0:1044) 1961 0 R (0:1045) 1962 0 R (0:1046) 1963 0 R (0:1047) 1964 0 R (0:1048) 1965 0 R (0:1049) 1966 0 R (0:1050) 1967 0 R (0:1051) 1968 0 R (0:1052) 1969 0 R (0:1053) 1970 0 R (0:1054) 1971 0 R (0:1055) 1972 0 R (0:1056) 1973 0 R (0:1057) 1974 0 R (0:1058) 1975 0 R (0:1059) 1976 0 R (0:106) 996 0 R (0:1060) 1977 0 R (0:1061) 1978 0 R (0:1062) 1979 0 R (0:1065) 1980 0 R (0:1066) 1981 0 R (0:1067) 1982 0 R (0:1068) 1983 0 R (0:1069) 1984 0 R (0:1070) 1985 0 R (0:1071) 1986 0 R (0:1072) 1987 0 R (0:1073) 1988 0 R (0:1074) 1989 0 R (0:1075) 1990 0 R (0:1076) 1995 0 R (0:1077) 1996 0 R (0:1078) 1997 0 R (0:1079) 1998 0 R (0:1080) 1999 0 R (0:1081) 2000 0 R (0:1082) 2001 0 R (0:1083) 2002 0 R (0:1084) 2003 0 R (0:1085) 2004 0 R (0:1086) 2005 0 R (0:1087) 2006 0 R (0:1088) 2007 0 R (0:1089) 2008 0 R (0:109) 997 0 R (0:1090) 2009 0 R (0:1091) 2010 0 R (0:1092) 2011 0 R (0:1093) 2012 0 R (0:1094) 2013 0 R (0:1095) 2014 0 R (0:1096) 2015 0 R (0:1097) 2016 0 R (0:1098) 2017 0 R (0:1099) 2018 0 R (0:110) 998 0 R (0:1100) 2019 0 R (0:1101) 2020 0 R (0:1102) 2021 0 R (0:1103) 2022 0 R (0:1104) 2023 0 R (0:1105) 2024 0 R (0:1106) 2025 0 R (0:1107) 2026 0 R (0:1108) 2027 0 R (0:1109) 2028 0 R (0:111) 999 0 R (0:1110) 2029 0 R (0:1111) 2030 0 R (0:1112) 2031 0 R (0:1113) 2032 0 R (0:1114) 2033 0 R (0:1115) 2034 0 R (0:1116) 2035 0 R (0:1117) 2036 0 R (0:1118) 2037 0 R (0:1119) 2038 0 R (0:112) 1000 0 R (0:1120) 2039 0 R (0:1121) 2040 0 R (0:1124) 2041 0 R (0:1125) 2042 0 R (0:1126) 2043 0 R (0:1127) 2044 0 R (0:1128) 2045 0 R (0:1129) 2046 0 R (0:113) 1001 0 R (0:1130) 2047 0 R (0:1131) 2048 0 R (0:1132) 2049 0 R (0:1133) 2050 0 R (0:1134) 2056 0 R (0:1135) 2057 0 R (0:1136) 2058 0 R (0:1137) 2059 0 R (0:1138) 2060 0 R (0:1139) 2061 0 R (0:114) 1002 0 R (0:1140) 2062 0 R (0:1141) 2063 0 R (0:1142) 2064 0 R (0:1143) 2065 0 R (0:1144) 2066 0 R (0:1145) 2067 0 R (0:1146) 2068 0 R (0:1147) 2069 0 R (0:1148) 2070 0 R (0:1149) 2071 0 R (0:115) 1003 0 R (0:1150) 2072 0 R (0:1151) 2073 0 R (0:1152) 2074 0 R (0:1153) 2075 0 R (0:1154) 2076 0 R (0:1155) 2077 0 R (0:1156) 2078 0 R (0:1157) 2079 0 R (0:1158) 2080 0 R (0:1159) 2081 0 R (0:116) 1004 0 R (0:1160) 2082 0 R (0:1161) 2083 0 R (0:1162) 2084 0 R (0:1163) 2085 0 R (0:1164) 2086 0 R (0:1165) 2087 0 R (0:1166) 2088 0 R (0:1167) 2089 0 R (0:1168) 2090 0 R (0:1169) 2091 0 R (0:117) 1005 0 R (0:1170) 2092 0 R (0:1171) 2093 0 R (0:1172) 2094 0 R (0:1173) 2095 0 R (0:1174) 2096 0 R (0:1175) 2097 0 R (0:1176) 2098 0 R (0:1177) 2099 0 R (0:1178) 2100 0 R (0:1179) 2101 0 R (0:118) 1006 0 R (0:1180) 2102 0 R (0:1183) 2103 0 R (0:1184) 2104 0 R (0:1185) 2105 0 R (0:1186) 2106 0 R (0:1187) 2107 0 R (0:1188) 2108 0 R (0:1189) 2109 0 R (0:119) 1007 0 R (0:1190) 2110 0 R (0:1191) 2111 0 R (0:1192) 2112 0 R (0:1193) 2119 0 R (0:1194) 2055 0 R (0:1195) 2120 0 R (0:1196) 2121 0 R (0:1197) 2122 0 R (0:1198) 2123 0 R (0:1199) 2124 0 R (0:120) 1008 0 R (0:1200) 2125 0 R (0:1201) 2126 0 R (0:1202) 2127 0 R (0:1203) 2128 0 R (0:1204) 2129 0 R (0:1205) 2130 0 R (0:1206) 2131 0 R (0:1207) 2132 0 R (0:1208) 2133 0 R (0:1209) 2134 0 R (0:121) 1009 0 R (0:1210) 2135 0 R (0:1211) 2136 0 R (0:1212) 2137 0 R (0:1213) 2138 0 R (0:1214) 2139 0 R (0:1215) 2140 0 R (0:1216) 2141 0 R (0:1217) 2142 0 R (0:1218) 2143 0 R (0:1219) 2144 0 R (0:122) 1010 0 R (0:1220) 2145 0 R (0:1221) 2146 0 R (0:1222) 2147 0 R (0:1223) 2148 0 R (0:1224) 2149 0 R (0:1225) 2150 0 R (0:1226) 2151 0 R (0:1227) 2152 0 R (0:1228) 2153 0 R (0:1229) 2154 0 R (0:123) 1011 0 R (0:1230) 2155 0 R (0:1231) 2156 0 R (0:1232) 2157 0 R (0:1233) 2158 0 R (0:1236) 2159 0 R (0:1237) 2160 0 R (0:1238) 2161 0 R (0:1239) 2162 0 R (0:124) 1012 0 R (0:1240) 2163 0 R (0:1241) 2164 0 R (0:1242) 2165 0 R (0:1243) 2166 0 R (0:1244) 2167 0 R (0:1245) 2118 0 R (0:1246) 2172 0 R (0:1247) 2173 0 R (0:1248) 2174 0 R (0:1249) 2175 0 R (0:125) 1013 0 R (0:1250) 2176 0 R (0:1251) 2177 0 R (0:1252) 2178 0 R (0:1253) 2179 0 R (0:1254) 2180 0 R (0:1255) 2181 0 R (0:1256) 2182 0 R (0:1257) 2183 0 R (0:1258) 2184 0 R (0:1259) 2185 0 R (0:126) 1014 0 R (0:1260) 2186 0 R (0:1261) 2187 0 R (0:1262) 2188 0 R (0:1263) 2189 0 R (0:1264) 2190 0 R (0:1265) 2191 0 R (0:1266) 2192 0 R (0:1267) 2193 0 R (0:1268) 2194 0 R (0:1269) 2195 0 R (0:127) 1015 0 R (0:1270) 2196 0 R (0:1271) 2197 0 R (0:1274) 2198 0 R (0:1275) 2199 0 R (0:1276) 2200 0 R (0:1277) 2201 0 R (0:1278) 2202 0 R (0:1279) 2203 0 R (0:128) 1016 0 R (0:1280) 2204 0 R (0:1281) 2205 0 R (0:1282) 2206 0 R (0:1283) 2207 0 R (0:1284) 2208 0 R (0:1285) 2209 0 R (0:1286) 2210 0 R (0:1287) 2211 0 R (0:1288) 2212 0 R (0:1289) 2213 0 R (0:129) 1017 0 R (0:1290) 2214 0 R (0:1291) 2215 0 R (0:1292) 2216 0 R (0:1293) 2217 0 R (0:1294) 2218 0 R (0:1295) 2219 0 R (0:1296) 2224 0 R (0:1297) 2225 0 R (0:1298) 2226 0 R (0:1299) 2227 0 R (0:13) 922 0 R (0:130) 1018 0 R (0:1302) 2228 0 R (0:1303) 2229 0 R (0:1304) 2230 0 R (0:1305) 2231 0 R (0:1306) 2232 0 R (0:1307) 2233 0 R (0:1308) 2234 0 R (0:1309) 2235 0 R (0:131) 1019 0 R (0:1310) 2236 0 R (0:1311) 2237 0 R (0:1312) 2238 0 R (0:1313) 2239 0 R (0:1314) 2240 0 R (0:1315) 2241 0 R (0:1316) 2242 0 R (0:1317) 2243 0 R (0:1318) 2244 0 R (0:1319) 2245 0 R (0:132) 1020 0 R (0:1320) 2246 0 R (0:1321) 2247 0 R (0:1322) 2248 0 R (0:1323) 2249 0 R (0:1324) 2250 0 R (0:1325) 2251 0 R (0:1326) 2252 0 R (0:1327) 2253 0 R (0:1328) 2254 0 R (0:1329) 2255 0 R (0:133) 1021 0 R (0:1330) 2256 0 R (0:1331) 2257 0 R (0:1332) 2258 0 R (0:1333) 2259 0 R (0:1334) 2260 0 R (0:1335) 2261 0 R (0:1336) 2262 0 R (0:1337) 2263 0 R (0:1338) 2264 0 R (0:1339) 2265 0 R (0:134) 1022 0 R (0:1340) 2266 0 R (0:1341) 2267 0 R (0:1342) 2268 0 R (0:1343) 2269 0 R (0:1344) 2270 0 R (0:1345) 2276 0 R (0:1348) 2277 0 R (0:1349) 2278 0 R (0:135) 1023 0 R (0:1350) 2279 0 R (0:1351) 2280 0 R (0:1352) 2281 0 R (0:1353) 2282 0 R (0:1354) 2283 0 R (0:1355) 2284 0 R (0:1356) 2285 0 R (0:1357) 2286 0 R (0:1358) 2287 0 R (0:1359) 2288 0 R (0:136) 1024 0 R (0:1360) 2289 0 R (0:1361) 2290 0 R (0:1362) 2291 0 R (0:1363) 2292 0 R (0:1364) 2293 0 R (0:1365) 2294 0 R (0:1366) 2295 0 R (0:1367) 2296 0 R (0:1368) 2297 0 R (0:1369) 2298 0 R (0:137) 1025 0 R (0:1370) 2299 0 R (0:1371) 2300 0 R (0:1372) 2301 0 R (0:1373) 2302 0 R (0:1374) 2303 0 R (0:1375) 2304 0 R (0:1376) 2305 0 R (0:1377) 2306 0 R (0:1378) 2307 0 R (0:1379) 2308 0 R (0:138) 1026 0 R (0:1380) 2309 0 R (0:1381) 2310 0 R (0:1382) 2311 0 R (0:1383) 2312 0 R (0:1384) 2313 0 R (0:1385) 2314 0 R (0:1386) 2315 0 R (0:1387) 2316 0 R (0:139) 1027 0 R (0:1390) 2321 0 R (0:1391) 2322 0 R (0:1392) 2323 0 R (0:1393) 2275 0 R (0:1396) 2324 0 R (0:1397) 2325 0 R (0:1398) 2326 0 R (0:1399) 2327 0 R (0:14) 926 0 R (0:140) 1028 0 R (0:1400) 2328 0 R (0:1401) 2329 0 R (0:1402) 2330 0 R (0:1403) 2331 0 R (0:1404) 2332 0 R (0:1405) 2333 0 R (0:1406) 2334 0 R (0:1407) 2335 0 R (0:1408) 2336 0 R (0:1409) 2337 0 R (0:141) 1029 0 R (0:1410) 2338 0 R (0:1411) 2339 0 R (0:1414) 2340 0 R (0:1415) 2341 0 R (0:1416) 2342 0 R (0:1417) 2343 0 R (0:1418) 2344 0 R (0:1419) 2345 0 R (0:1420) 2346 0 R (0:1421) 2347 0 R (0:1422) 2348 0 R (0:1423) 2349 0 R (0:1424) 2350 0 R (0:1425) 2355 0 R (0:1426) 2356 0 R (0:1427) 2357 0 R (0:1428) 2358 0 R (0:1429) 2359 0 R (0:1430) 2360 0 R (0:1431) 2361 0 R (0:1432) 2362 0 R (0:1433) 2363 0 R (0:1434) 2364 0 R (0:1435) 2365 0 R (0:1436) 2366 0 R (0:1437) 2367 0 R (0:1438) 2368 0 R (0:1439) 2369 0 R (0:144) 1030 0 R (0:1440) 2370 0 R (0:1443) 2371 0 R (0:1444) 2372 0 R (0:1445) 2373 0 R (0:1446) 2374 0 R (0:1447) 2375 0 R (0:1448) 2376 0 R (0:1449) 2377 0 R (0:145) 1031 0 R (0:1450) 2378 0 R (0:1451) 2379 0 R (0:1452) 2380 0 R (0:1453) 2381 0 R (0:1454) 2382 0 R (0:1455) 2383 0 R (0:1456) 2384 0 R (0:1457) 2385 0 R (0:1458) 2386 0 R (0:1459) 2387 0 R (0:146) 1032 0 R (0:1460) 2388 0 R (0:1461) 2389 0 R (0:1462) 2390 0 R (0:1463) 2391 0 R (0:1464) 2392 0 R (0:1465) 2393 0 R (0:1466) 2394 0 R (0:1467) 2395 0 R (0:1468) 2396 0 R (0:1469) 2397 0 R (0:147) 1038 0 R (0:1470) 2398 0 R (0:1471) 2399 0 R (0:1472) 2400 0 R (0:1473) 2401 0 R (0:1474) 2402 0 R (0:1475) 2403 0 R (0:1476) 2404 0 R (0:1477) 2405 0 R (0:1478) 2406 0 R (0:1479) 2407 0 R (0:148) 1039 0 R (0:1480) 2408 0 R (0:1481) 2409 0 R (0:1482) 2410 0 R (0:1483) 2411 0 R (0:1484) 2412 0 R (0:1485) 2413 0 R (0:1486) 2414 0 R (0:1487) 2415 0 R (0:1488) 2416 0 R (0:1489) 2422 0 R (0:149) 1040 0 R (0:1490) 2423 0 R (0:1491) 2424 0 R (0:1492) 2425 0 R (0:1493) 2426 0 R (0:1494) 2427 0 R (0:1495) 2428 0 R (0:1496) 2429 0 R (0:1497) 2430 0 R (0:1498) 2431 0 R (0:1499) 2432 0 R (0:15) 927 0 R (0:150) 1041 0 R (0:1500) 2433 0 R (0:1501) 2434 0 R (0:1502) 2435 0 R (0:1503) 2436 0 R (0:1504) 2437 0 R (0:1505) 2438 0 R (0:1506) 2439 0 R (0:1507) 2440 0 R (0:1508) 2441 0 R (0:1509) 2442 0 R (0:151) 1042 0 R (0:1510) 2443 0 R (0:1511) 2444 0 R (0:1512) 2445 0 R (0:1513) 2446 0 R (0:1514) 2447 0 R (0:1515) 2448 0 R (0:1516) 2449 0 R (0:1517) 2450 0 R (0:1518) 2451 0 R (0:1519) 2452 0 R (0:152) 1043 0 R (0:1520) 2453 0 R (0:1521) 2454 0 R (0:1522) 2455 0 R (0:1523) 2456 0 R (0:1524) 2457 0 R (0:1525) 2458 0 R (0:1526) 2459 0 R (0:1527) 2460 0 R (0:1528) 2461 0 R (0:1529) 2462 0 R (0:153) 1044 0 R (0:1530) 2463 0 R (0:1531) 2464 0 R (0:1532) 2465 0 R (0:1535) 2466 0 R (0:1536) 2467 0 R (0:1537) 2468 0 R (0:1538) 2469 0 R (0:1539) 2470 0 R (0:154) 1045 0 R (0:1540) 2471 0 R (0:1541) 2472 0 R (0:1542) 2473 0 R (0:1543) 2474 0 R (0:1544) 2475 0 R (0:1545) 2476 0 R (0:1546) 2477 0 R (0:1547) 2478 0 R (0:1548) 2479 0 R (0:1549) 2480 0 R (0:155) 1046 0 R (0:1550) 2481 0 R (0:1551) 2482 0 R (0:1552) 2483 0 R (0:1553) 2484 0 R (0:1554) 2485 0 R (0:1555) 2490 0 R (0:1556) 2491 0 R (0:1557) 2492 0 R (0:1558) 2493 0 R (0:1559) 2494 0 R (0:156) 1047 0 R (0:1560) 2495 0 R (0:1561) 2496 0 R (0:1562) 2497 0 R (0:1563) 2498 0 R (0:1564) 2499 0 R (0:1565) 2500 0 R (0:1566) 2501 0 R (0:1567) 2502 0 R (0:1568) 2503 0 R (0:1569) 2504 0 R (0:157) 1048 0 R (0:1570) 2505 0 R (0:1571) 2506 0 R (0:1572) 2507 0 R (0:1573) 2508 0 R (0:1574) 2509 0 R (0:1575) 2510 0 R (0:1578) 2511 0 R (0:1579) 2512 0 R (0:158) 1049 0 R (0:1580) 2513 0 R (0:1581) 2514 0 R (0:1582) 2515 0 R (0:1583) 2516 0 R (0:1584) 2517 0 R (0:1585) 2518 0 R (0:1586) 2519 0 R (0:1587) 2520 0 R (0:1588) 2521 0 R (0:1589) 2522 0 R (0:159) 1050 0 R (0:1590) 2523 0 R (0:1591) 2524 0 R (0:1592) 2525 0 R (0:1593) 2526 0 R (0:1594) 2527 0 R (0:1595) 2528 0 R (0:1596) 2529 0 R (0:1597) 2530 0 R (0:1598) 2531 0 R (0:1599) 2532 0 R (0:16) 928 0 R (0:160) 1051 0 R (0:1600) 2533 0 R (0:1601) 2534 0 R (0:1602) 2535 0 R (0:1603) 2536 0 R (0:1604) 2537 0 R (0:1605) 2538 0 R (0:1606) 2539 0 R (0:1607) 2540 0 R (0:1608) 2541 0 R (0:1609) 2542 0 R (0:161) 1052 0 R (0:1610) 2543 0 R (0:1611) 2544 0 R (0:1612) 2545 0 R (0:1613) 2546 0 R (0:1614) 2547 0 R (0:1615) 2553 0 R (0:1616) 2554 0 R (0:1617) 2555 0 R (0:1618) 2556 0 R (0:1619) 2557 0 R (0:162) 1053 0 R (0:1620) 2558 0 R (0:1621) 2559 0 R (0:1622) 2560 0 R (0:1623) 2561 0 R (0:1624) 2562 0 R (0:1625) 2563 0 R (0:1626) 2564 0 R (0:1627) 2565 0 R (0:1628) 2566 0 R (0:1629) 2567 0 R (0:163) 1054 0 R (0:1630) 2568 0 R (0:1631) 2569 0 R (0:1632) 2570 0 R (0:1633) 2571 0 R (0:1634) 2572 0 R (0:1635) 2573 0 R (0:1636) 2574 0 R (0:1637) 2575 0 R (0:1638) 2576 0 R (0:1639) 2577 0 R (0:164) 1055 0 R (0:1640) 2578 0 R (0:1641) 2579 0 R (0:1642) 2580 0 R (0:1643) 2581 0 R (0:1644) 2582 0 R (0:1647) 2583 0 R (0:1648) 2584 0 R (0:1649) 2585 0 R (0:165) 1056 0 R (0:1650) 2586 0 R (0:1651) 2587 0 R (0:1652) 2588 0 R (0:1653) 2589 0 R (0:1654) 2590 0 R (0:1655) 2591 0 R (0:1656) 2592 0 R (0:1657) 2593 0 R (0:1658) 2594 0 R (0:1659) 2595 0 R (0:166) 1057 0 R (0:1660) 2596 0 R (0:1661) 2597 0 R (0:1662) 2598 0 R (0:1663) 2599 0 R (0:1664) 2600 0 R (0:1665) 2601 0 R (0:1666) 2602 0 R (0:1667) 2603 0 R (0:1668) 2609 0 R (0:1669) 2610 0 R (0:167) 1058 0 R (0:1670) 2552 0 R (0:1671) 2611 0 R (0:1672) 2612 0 R (0:1673) 2613 0 R (0:1676) 2614 0 R (0:1677) 2615 0 R (0:1678) 2616 0 R (0:1679) 2617 0 R (0:168) 1059 0 R (0:1680) 2618 0 R (0:1681) 2619 0 R (0:1682) 2620 0 R (0:1683) 2621 0 R (0:1684) 2622 0 R (0:1685) 2623 0 R (0:1686) 2624 0 R (0:1687) 2625 0 R (0:1688) 2626 0 R (0:1689) 2627 0 R (0:169) 1060 0 R (0:1690) 2628 0 R (0:1691) 2629 0 R (0:1692) 2630 0 R (0:1693) 2631 0 R (0:1694) 2632 0 R (0:1695) 2633 0 R (0:1696) 2634 0 R (0:1697) 2635 0 R (0:1698) 2636 0 R (0:1699) 2637 0 R (0:170) 1061 0 R (0:1700) 2638 0 R (0:1701) 2639 0 R (0:1702) 2640 0 R (0:1703) 2641 0 R (0:1704) 2642 0 R (0:1705) 2643 0 R (0:1706) 2644 0 R (0:1707) 2645 0 R (0:1708) 2646 0 R (0:1709) 2647 0 R (0:171) 1062 0 R (0:1710) 2648 0 R (0:1713) 2654 0 R (0:1714) 2655 0 R (0:1715) 2656 0 R (0:1716) 2608 0 R (0:1719) 2657 0 R (0:172) 1063 0 R (0:1720) 2658 0 R (0:1721) 2659 0 R (0:1722) 2660 0 R (0:1723) 2661 0 R (0:1724) 2662 0 R (0:1725) 2663 0 R (0:1726) 2664 0 R (0:1727) 2665 0 R (0:1728) 2666 0 R (0:1729) 2667 0 R (0:173) 1064 0 R (0:1730) 2668 0 R (0:1731) 2669 0 R (0:1732) 2670 0 R (0:1733) 2671 0 R (0:1734) 2672 0 R (0:1735) 2673 0 R (0:1736) 2674 0 R (0:1737) 2675 0 R (0:1738) 2676 0 R (0:1739) 2677 0 R (0:174) 1065 0 R (0:1740) 2678 0 R (0:1741) 2679 0 R (0:1742) 2680 0 R (0:1743) 2681 0 R (0:1746) 2682 0 R (0:1747) 2683 0 R (0:1748) 2684 0 R (0:1749) 2685 0 R (0:175) 1066 0 R (0:1750) 2686 0 R (0:1751) 2687 0 R (0:1752) 2692 0 R (0:1753) 2653 0 R (0:1754) 2693 0 R (0:1755) 2694 0 R (0:1756) 2695 0 R (0:1757) 2696 0 R (0:1758) 2697 0 R (0:1759) 2698 0 R (0:176) 1067 0 R (0:1760) 2699 0 R (0:1761) 2700 0 R (0:1762) 2701 0 R (0:1763) 2702 0 R (0:1764) 2703 0 R (0:1765) 2704 0 R (0:1766) 2705 0 R (0:1767) 2706 0 R (0:1768) 2707 0 R (0:1769) 2708 0 R (0:177) 1068 0 R (0:1770) 2709 0 R (0:1771) 2710 0 R (0:1772) 2711 0 R (0:1775) 2712 0 R (0:1776) 2713 0 R (0:1777) 2714 0 R (0:1778) 2715 0 R (0:1779) 2716 0 R (0:178) 1069 0 R (0:1780) 2717 0 R (0:1781) 2718 0 R (0:1782) 2719 0 R (0:1783) 2720 0 R (0:1784) 2721 0 R (0:1785) 2722 0 R (0:1786) 2723 0 R (0:1787) 2724 0 R (0:1788) 2725 0 R (0:1789) 2726 0 R (0:1790) 2727 0 R (0:1791) 2728 0 R (0:1792) 2729 0 R (0:1793) 2730 0 R (0:1794) 2731 0 R (0:1795) 2732 0 R (0:1796) 2733 0 R (0:1797) 2734 0 R (0:1798) 2740 0 R (0:1799) 2741 0 R (0:18) 930 0 R (0:1800) 2742 0 R (0:1801) 2743 0 R (0:1802) 2744 0 R (0:1803) 2745 0 R (0:1804) 2746 0 R (0:1805) 2747 0 R (0:1806) 2748 0 R (0:1807) 2749 0 R (0:1808) 2750 0 R (0:181) 1070 0 R (0:1811) 2751 0 R (0:1812) 2752 0 R (0:1813) 2753 0 R (0:1814) 2754 0 R (0:1815) 2755 0 R (0:1816) 2756 0 R (0:1817) 2757 0 R (0:1818) 2758 0 R (0:1819) 2759 0 R (0:182) 1071 0 R (0:1820) 2760 0 R (0:1821) 2761 0 R (0:1822) 2762 0 R (0:1823) 2763 0 R (0:1824) 2764 0 R (0:1825) 2765 0 R (0:1826) 2766 0 R (0:1827) 2767 0 R (0:1828) 2768 0 R (0:1829) 2769 0 R (0:183) 1072 0 R (0:1830) 2770 0 R (0:1831) 2771 0 R (0:1832) 2772 0 R (0:1833) 2773 0 R (0:1834) 2774 0 R (0:1835) 2775 0 R (0:1836) 2776 0 R (0:1837) 2777 0 R (0:1838) 2778 0 R (0:1839) 2779 0 R (0:184) 1073 0 R (0:1840) 2780 0 R (0:1841) 2781 0 R (0:1842) 2782 0 R (0:1843) 2783 0 R (0:1844) 2784 0 R (0:1847) 2790 0 R (0:1848) 2791 0 R (0:1849) 2792 0 R (0:185) 1074 0 R (0:1850) 2793 0 R (0:1851) 2794 0 R (0:1852) 2795 0 R (0:1853) 2796 0 R (0:1854) 2797 0 R (0:1855) 2798 0 R (0:1856) 2799 0 R (0:1857) 2800 0 R (0:1858) 2801 0 R (0:1859) 2802 0 R (0:186) 1075 0 R (0:1860) 2803 0 R (0:1861) 2804 0 R (0:1862) 2805 0 R (0:1863) 2806 0 R (0:1864) 2807 0 R (0:1865) 2808 0 R (0:1866) 2809 0 R (0:1867) 2810 0 R (0:1868) 2811 0 R (0:1869) 2812 0 R (0:187) 1076 0 R (0:1870) 2813 0 R (0:1871) 2814 0 R (0:1874) 2815 0 R (0:1875) 2816 0 R (0:1876) 2817 0 R (0:1877) 2818 0 R (0:1878) 2819 0 R (0:1879) 2820 0 R (0:188) 1077 0 R (0:1880) 2821 0 R (0:1881) 2822 0 R (0:1882) 2823 0 R (0:1883) 2824 0 R (0:1884) 2829 0 R (0:1885) 2789 0 R (0:1886) 2830 0 R (0:1887) 2831 0 R (0:1888) 2832 0 R (0:1889) 2833 0 R (0:189) 1078 0 R (0:1890) 2834 0 R (0:1891) 2835 0 R (0:1892) 2836 0 R (0:1893) 2837 0 R (0:1894) 2838 0 R (0:1895) 2839 0 R (0:1896) 2840 0 R (0:1897) 2841 0 R (0:1898) 2842 0 R (0:1899) 2843 0 R (0:19) 931 0 R (0:190) 1083 0 R (0:1900) 2844 0 R (0:1903) 2845 0 R (0:1904) 2846 0 R (0:1905) 2847 0 R (0:1906) 2848 0 R (0:1907) 2849 0 R (0:1908) 2850 0 R (0:1909) 2851 0 R (0:191) 1037 0 R (0:1910) 2852 0 R (0:1911) 2853 0 R (0:1912) 2854 0 R (0:1913) 2855 0 R (0:1914) 2856 0 R (0:1915) 2857 0 R (0:1916) 2858 0 R (0:1917) 2859 0 R (0:1918) 2860 0 R (0:1919) 2861 0 R (0:192) 1084 0 R (0:1920) 2862 0 R (0:1921) 2863 0 R (0:1922) 2864 0 R (0:1923) 2865 0 R (0:1924) 2866 0 R (0:1925) 2867 0 R (0:1926) 2868 0 R (0:1927) 2869 0 R (0:1928) 2870 0 R (0:1929) 2871 0 R (0:193) 1085 0 R (0:1932) 2876 0 R (0:1933) 2877 0 R (0:1934) 2878 0 R (0:1935) 2879 0 R (0:1936) 2880 0 R (0:1937) 2881 0 R (0:1938) 2882 0 R (0:1939) 2883 0 R (0:194) 1086 0 R (0:1940) 2884 0 R (0:1941) 2885 0 R (0:1942) 2886 0 R (0:1943) 2887 0 R (0:1944) 2888 0 R (0:1945) 2889 0 R (0:1946) 2890 0 R (0:1947) 2891 0 R (0:1948) 2892 0 R (0:1949) 2893 0 R (0:195) 1087 0 R (0:1950) 2894 0 R (0:1951) 2895 0 R (0:1952) 2896 0 R (0:1953) 2897 0 R (0:1954) 2898 0 R (0:1955) 2899 0 R (0:1956) 2900 0 R (0:1957) 2901 0 R (0:196) 1088 0 R (0:1960) 2902 0 R (0:1961) 2903 0 R (0:1962) 2904 0 R (0:1963) 2905 0 R (0:1964) 2906 0 R (0:1965) 2907 0 R (0:1966) 2908 0 R (0:1967) 2909 0 R (0:1968) 2914 0 R (0:1969) 2915 0 R (0:197) 1089 0 R (0:1970) 2916 0 R (0:1971) 2917 0 R (0:1972) 2918 0 R (0:1973) 2919 0 R (0:1974) 2920 0 R (0:1975) 2921 0 R (0:1976) 2922 0 R (0:1977) 2923 0 R (0:1978) 2924 0 R (0:1979) 2925 0 R (0:198) 1090 0 R (0:1980) 2926 0 R (0:1981) 2927 0 R (0:1982) 2928 0 R (0:1983) 2929 0 R (0:1984) 2930 0 R (0:1985) 2931 0 R (0:1986) 2932 0 R (0:1989) 2933 0 R (0:199) 1091 0 R (0:1990) 2934 0 R (0:1991) 2935 0 R (0:1992) 2936 0 R (0:1993) 2937 0 R (0:1994) 2938 0 R (0:1995) 2939 0 R (0:1996) 2940 0 R (0:1997) 2941 0 R (0:1998) 2942 0 R (0:1999) 2943 0 R (0:200) 1092 0 R (0:2000) 2944 0 R (0:2001) 2945 0 R (0:2002) 2946 0 R (0:2003) 2947 0 R (0:2004) 2948 0 R (0:2005) 2949 0 R (0:2006) 2950 0 R (0:2007) 2951 0 R (0:2008) 2952 0 R (0:2009) 2953 0 R (0:201) 1093 0 R (0:2010) 2954 0 R (0:2011) 2955 0 R (0:2012) 2956 0 R (0:2013) 2957 0 R (0:2014) 2958 0 R (0:2015) 2964 0 R (0:2018) 2965 0 R (0:2019) 2966 0 R (0:202) 1094 0 R (0:2020) 2967 0 R (0:2021) 2968 0 R (0:2022) 2969 0 R (0:2023) 2970 0 R (0:2024) 2971 0 R (0:2025) 2972 0 R (0:2026) 2973 0 R (0:2027) 2974 0 R (0:2028) 2975 0 R (0:2029) 2976 0 R (0:203) 1095 0 R (0:2030) 2977 0 R (0:2031) 2978 0 R (0:2032) 2979 0 R (0:2033) 2980 0 R (0:2034) 2981 0 R (0:2035) 2982 0 R (0:2036) 2983 0 R (0:2037) 2984 0 R (0:2038) 2985 0 R (0:2039) 2986 0 R (0:204) 1096 0 R (0:2040) 2987 0 R (0:2041) 2988 0 R (0:2042) 2989 0 R (0:2043) 2990 0 R (0:2044) 2991 0 R (0:2045) 2992 0 R (0:2046) 2993 0 R (0:2047) 2994 0 R (0:2048) 2995 0 R (0:2049) 2996 0 R (0:205) 1097 0 R (0:2050) 2997 0 R (0:2051) 2998 0 R (0:2052) 2999 0 R (0:2053) 3000 0 R (0:2054) 3001 0 R (0:2055) 3002 0 R (0:2056) 3003 0 R (0:2059) 3010 0 R (0:206) 1098 0 R (0:2060) 3011 0 R (0:2061) 3012 0 R (0:2062) 2963 0 R (0:2065) 3013 0 R (0:2066) 3014 0 R (0:2067) 3015 0 R (0:2068) 3016 0 R (0:2069) 3017 0 R (0:2070) 3018 0 R (0:2071) 3019 0 R (0:2072) 3020 0 R (0:2073) 3021 0 R (0:2074) 3022 0 R (0:2075) 3023 0 R (0:2076) 3024 0 R (0:2077) 3025 0 R (0:2078) 3026 0 R (0:2079) 3027 0 R (0:2080) 3028 0 R (0:2081) 3029 0 R (0:2082) 3030 0 R (0:2083) 3031 0 R (0:2084) 3032 0 R (0:2085) 3033 0 R (0:2086) 3034 0 R (0:2087) 3035 0 R (0:2088) 3036 0 R (0:2089) 3037 0 R (0:209) 1099 0 R (0:2090) 3038 0 R (0:2091) 3039 0 R (0:2092) 3040 0 R (0:2093) 3041 0 R (0:2096) 3042 0 R (0:2097) 3043 0 R (0:2098) 3044 0 R (0:2099) 3045 0 R (0:210) 1100 0 R (0:2100) 3046 0 R (0:2101) 3051 0 R (0:2102) 3009 0 R (0:2103) 3052 0 R (0:2104) 3053 0 R (0:2105) 3054 0 R (0:2106) 3055 0 R (0:2107) 3056 0 R (0:2108) 3057 0 R (0:2109) 3058 0 R (0:211) 1101 0 R (0:2110) 3059 0 R (0:2111) 3060 0 R (0:2112) 3061 0 R (0:2113) 3062 0 R (0:2114) 3063 0 R (0:2115) 3064 0 R (0:2116) 3065 0 R (0:2117) 3066 0 R (0:2118) 3067 0 R (0:2119) 3068 0 R (0:212) 1102 0 R (0:2120) 3069 0 R (0:2121) 3070 0 R (0:2122) 3071 0 R (0:2123) 3072 0 R (0:2124) 3073 0 R (0:2125) 3074 0 R (0:2126) 3075 0 R (0:2127) 3076 0 R (0:213) 1103 0 R (0:2130) 3077 0 R (0:2131) 3078 0 R (0:2132) 3079 0 R (0:2133) 3080 0 R (0:2134) 3081 0 R (0:2135) 3082 0 R (0:2136) 3083 0 R (0:2137) 3084 0 R (0:2138) 3085 0 R (0:2139) 3086 0 R (0:214) 1104 0 R (0:2140) 3087 0 R (0:2141) 3092 0 R (0:2142) 3093 0 R (0:2143) 3094 0 R (0:2144) 3095 0 R (0:2145) 3096 0 R (0:2146) 3097 0 R (0:2147) 3098 0 R (0:2148) 3099 0 R (0:2149) 3100 0 R (0:215) 1105 0 R (0:2150) 3101 0 R (0:2151) 3102 0 R (0:2152) 3103 0 R (0:2153) 3104 0 R (0:2154) 3105 0 R (0:2155) 3106 0 R (0:2156) 3107 0 R (0:2159) 3108 0 R (0:216) 1106 0 R (0:2160) 3109 0 R (0:2161) 3110 0 R (0:2162) 3111 0 R (0:2163) 3112 0 R (0:2164) 3113 0 R (0:2165) 3114 0 R (0:2166) 3115 0 R (0:2167) 3116 0 R (0:2168) 3117 0 R (0:2169) 3118 0 R (0:217) 1107 0 R (0:2170) 3119 0 R (0:2171) 3120 0 R (0:2172) 3121 0 R (0:2173) 3122 0 R (0:2174) 3123 0 R (0:2175) 3124 0 R (0:2176) 3125 0 R (0:2177) 3126 0 R (0:2178) 3127 0 R (0:2179) 3128 0 R (0:218) 1108 0 R (0:2180) 3129 0 R (0:2181) 3130 0 R (0:2182) 3131 0 R (0:2183) 3132 0 R (0:2184) 3133 0 R (0:2185) 3134 0 R (0:2186) 3135 0 R (0:2187) 3136 0 R (0:2188) 3137 0 R (0:2189) 3138 0 R (0:219) 1109 0 R (0:2190) 3144 0 R (0:2193) 3145 0 R (0:2194) 3146 0 R (0:2195) 3147 0 R (0:2196) 3148 0 R (0:2197) 3149 0 R (0:2198) 3150 0 R (0:2199) 3151 0 R (0:220) 1110 0 R (0:2200) 3152 0 R (0:2201) 3153 0 R (0:2202) 3154 0 R (0:2203) 3155 0 R (0:2204) 3156 0 R (0:2205) 3157 0 R (0:2206) 3158 0 R (0:2207) 3159 0 R (0:2208) 3160 0 R (0:2209) 3161 0 R (0:221) 1111 0 R (0:2210) 3162 0 R (0:2211) 3163 0 R (0:2212) 3164 0 R (0:2213) 3165 0 R (0:2214) 3166 0 R (0:2215) 3167 0 R (0:2216) 3168 0 R (0:2217) 3169 0 R (0:2218) 3170 0 R (0:2219) 3171 0 R (0:222) 1112 0 R (0:2222) 3172 0 R (0:2223) 3173 0 R (0:2224) 3174 0 R (0:2225) 3175 0 R (0:2226) 3176 0 R (0:2227) 3181 0 R (0:2228) 3143 0 R (0:2229) 3182 0 R (0:223) 1113 0 R (0:2230) 3183 0 R (0:2231) 3184 0 R (0:2232) 3185 0 R (0:2233) 3186 0 R (0:2234) 3187 0 R (0:2235) 3188 0 R (0:2236) 3189 0 R (0:2237) 3190 0 R (0:2238) 3191 0 R (0:2239) 3192 0 R (0:224) 1114 0 R (0:2240) 3193 0 R (0:2241) 3194 0 R (0:2242) 3195 0 R (0:2243) 3196 0 R (0:2244) 3197 0 R (0:2245) 3198 0 R (0:2246) 3199 0 R (0:2247) 3200 0 R (0:2248) 3201 0 R (0:2249) 3202 0 R (0:225) 1115 0 R (0:2250) 3203 0 R (0:2251) 3204 0 R (0:2252) 3205 0 R (0:2255) 3206 0 R (0:2256) 3207 0 R (0:2257) 3208 0 R (0:2258) 3209 0 R (0:2259) 3210 0 R (0:226) 1116 0 R (0:2260) 3211 0 R (0:2261) 3212 0 R (0:2262) 3213 0 R (0:2263) 3214 0 R (0:2264) 3215 0 R (0:2265) 3216 0 R (0:2266) 3217 0 R (0:2267) 3218 0 R (0:2268) 3219 0 R (0:2269) 3220 0 R (0:227) 1117 0 R (0:2270) 3221 0 R (0:2271) 3222 0 R (0:2272) 3227 0 R (0:2273) 3228 0 R (0:2274) 3229 0 R (0:2275) 3230 0 R (0:2276) 3231 0 R (0:2277) 3232 0 R (0:2278) 3233 0 R (0:2279) 3234 0 R (0:228) 1118 0 R (0:2280) 3235 0 R (0:2281) 3236 0 R (0:2282) 3237 0 R (0:2283) 3238 0 R (0:2284) 3239 0 R (0:2285) 3240 0 R (0:2286) 3241 0 R (0:2287) 3242 0 R (0:2288) 3243 0 R (0:2289) 3244 0 R (0:229) 1119 0 R (0:2290) 3245 0 R (0:2291) 3246 0 R (0:2292) 3247 0 R (0:2293) 3248 0 R (0:2296) 3249 0 R (0:2297) 3250 0 R (0:2298) 3251 0 R (0:2299) 3252 0 R (0:230) 1120 0 R (0:2300) 3253 0 R (0:2301) 3254 0 R (0:2302) 3255 0 R (0:2303) 3256 0 R (0:2304) 3257 0 R (0:2305) 3258 0 R (0:2306) 3259 0 R (0:2307) 3260 0 R (0:2308) 3261 0 R (0:2309) 3262 0 R (0:231) 1121 0 R (0:2310) 3263 0 R (0:2311) 3264 0 R (0:2312) 3265 0 R (0:2313) 3266 0 R (0:2314) 3267 0 R (0:2315) 3268 0 R (0:2316) 3269 0 R (0:2317) 3270 0 R (0:2318) 3271 0 R (0:2319) 3272 0 R (0:232) 1122 0 R (0:2320) 3273 0 R (0:2321) 3274 0 R (0:2322) 3280 0 R (0:2323) 3281 0 R (0:2324) 3282 0 R (0:2325) 3283 0 R (0:2326) 3284 0 R (0:2327) 3285 0 R (0:2328) 3286 0 R (0:2329) 3287 0 R (0:233) 1123 0 R (0:2330) 3288 0 R (0:2331) 3289 0 R (0:2332) 3290 0 R (0:2333) 3291 0 R (0:2334) 3292 0 R (0:2337) 3293 0 R (0:2338) 3294 0 R (0:2339) 3295 0 R (0:234) 1124 0 R (0:2340) 3296 0 R (0:2341) 3297 0 R (0:2342) 3298 0 R (0:2343) 3299 0 R (0:2344) 3300 0 R (0:2345) 3301 0 R (0:2346) 3302 0 R (0:2347) 3303 0 R (0:2348) 3304 0 R (0:2349) 3305 0 R (0:235) 1125 0 R (0:2350) 3306 0 R (0:2351) 3307 0 R (0:2352) 3308 0 R (0:2353) 3309 0 R (0:2354) 3310 0 R (0:2355) 3311 0 R (0:2356) 3312 0 R (0:2357) 3313 0 R (0:2358) 3314 0 R (0:2359) 3315 0 R (0:236) 1126 0 R (0:2360) 3316 0 R (0:2361) 3317 0 R (0:2362) 3318 0 R (0:2363) 3319 0 R (0:2364) 3320 0 R (0:2365) 3326 0 R (0:2366) 3327 0 R (0:2367) 3328 0 R (0:2368) 3329 0 R (0:237) 1127 0 R (0:2371) 3330 0 R (0:2372) 3331 0 R (0:2373) 3332 0 R (0:2374) 3333 0 R (0:2375) 3334 0 R (0:2376) 3335 0 R (0:2377) 3336 0 R (0:2378) 3337 0 R (0:2379) 3338 0 R (0:238) 1128 0 R (0:2380) 3339 0 R (0:2381) 3340 0 R (0:2382) 3341 0 R (0:2383) 3342 0 R (0:2384) 3343 0 R (0:2385) 3344 0 R (0:2386) 3345 0 R (0:2387) 3346 0 R (0:2388) 3347 0 R (0:2389) 3348 0 R (0:239) 1129 0 R (0:2390) 3349 0 R (0:2391) 3350 0 R (0:2392) 3351 0 R (0:2393) 3352 0 R (0:2394) 3353 0 R (0:2395) 3354 0 R (0:2396) 3355 0 R (0:2397) 3356 0 R (0:2398) 3357 0 R (0:2399) 3358 0 R (0:240) 1130 0 R (0:2400) 3359 0 R (0:2401) 3360 0 R (0:2402) 3361 0 R (0:2403) 3362 0 R (0:2404) 3363 0 R (0:2405) 3364 0 R (0:2406) 3365 0 R (0:2407) 3366 0 R (0:2408) 3367 0 R (0:2409) 3368 0 R (0:241) 1131 0 R (0:2410) 3369 0 R (0:2413) 3375 0 R (0:2414) 3376 0 R (0:2415) 3377 0 R (0:2416) 3325 0 R (0:2419) 3378 0 R (0:242) 1132 0 R (0:2420) 3379 0 R (0:2421) 3380 0 R (0:2422) 3381 0 R (0:2423) 3382 0 R (0:2424) 3383 0 R (0:2425) 3384 0 R (0:2426) 3385 0 R (0:2427) 3386 0 R (0:2428) 3387 0 R (0:2429) 3388 0 R (0:243) 1133 0 R (0:2430) 3389 0 R (0:2431) 3390 0 R (0:2432) 3391 0 R (0:2433) 3392 0 R (0:2434) 3393 0 R (0:2435) 3394 0 R (0:2436) 3395 0 R (0:2437) 3396 0 R (0:2438) 3397 0 R (0:2439) 3398 0 R (0:244) 1134 0 R (0:2440) 3399 0 R (0:2441) 3400 0 R (0:2442) 3401 0 R (0:2443) 3402 0 R (0:2444) 3403 0 R (0:2447) 3404 0 R (0:2448) 3405 0 R (0:2449) 3406 0 R (0:245) 1140 0 R (0:2450) 3407 0 R (0:2451) 3408 0 R (0:2452) 3413 0 R (0:2453) 3374 0 R (0:2454) 3414 0 R (0:2455) 3415 0 R (0:2456) 3416 0 R (0:2457) 3417 0 R (0:2458) 3418 0 R (0:2459) 3419 0 R (0:246) 1141 0 R (0:2460) 3420 0 R (0:2461) 3421 0 R (0:2462) 3422 0 R (0:2463) 3423 0 R (0:2464) 3424 0 R (0:2465) 3425 0 R (0:2466) 3426 0 R (0:2467) 3427 0 R (0:2468) 3428 0 R (0:2469) 3429 0 R (0:247) 1142 0 R (0:2470) 3430 0 R (0:2471) 3431 0 R (0:2472) 3432 0 R (0:2475) 3433 0 R (0:2476) 3434 0 R (0:2477) 3435 0 R (0:2478) 3436 0 R (0:2479) 3437 0 R (0:248) 1143 0 R (0:2480) 3438 0 R (0:2481) 3439 0 R (0:2482) 3440 0 R (0:2483) 3441 0 R (0:2484) 3442 0 R (0:2485) 3443 0 R (0:2486) 3444 0 R (0:2487) 3445 0 R (0:2488) 3446 0 R (0:2489) 3447 0 R (0:249) 1144 0 R (0:2490) 3448 0 R (0:2491) 3449 0 R (0:2492) 3450 0 R (0:2493) 3451 0 R (0:2494) 3452 0 R (0:2495) 3453 0 R (0:2496) 3454 0 R (0:2497) 3455 0 R (0:2498) 3456 0 R (0:2499) 3462 0 R (0:250) 1145 0 R (0:2500) 3463 0 R (0:2501) 3464 0 R (0:2502) 3465 0 R (0:2503) 3466 0 R (0:2504) 3467 0 R (0:2505) 3468 0 R (0:2508) 3469 0 R (0:2509) 3470 0 R (0:251) 1146 0 R (0:2510) 3471 0 R (0:2511) 3472 0 R (0:2512) 3473 0 R (0:2513) 3474 0 R (0:2514) 3475 0 R (0:2515) 3476 0 R (0:2516) 3477 0 R (0:2517) 3478 0 R (0:2518) 3479 0 R (0:2519) 3480 0 R (0:252) 1147 0 R (0:2520) 3481 0 R (0:2521) 3482 0 R (0:2522) 3483 0 R (0:2523) 3484 0 R (0:2524) 3485 0 R (0:2525) 3486 0 R (0:2526) 3487 0 R (0:2527) 3488 0 R (0:2528) 3489 0 R (0:2529) 3490 0 R (0:253) 1148 0 R (0:2530) 3491 0 R (0:2531) 3492 0 R (0:2532) 3493 0 R (0:2533) 3494 0 R (0:2534) 3495 0 R (0:2537) 3501 0 R (0:2538) 3502 0 R (0:2539) 3503 0 R (0:254) 1149 0 R (0:2540) 3461 0 R (0:2543) 3504 0 R (0:2544) 3505 0 R (0:2545) 3506 0 R (0:2546) 3507 0 R (0:2547) 3508 0 R (0:2548) 3509 0 R (0:2549) 3510 0 R (0:255) 1150 0 R (0:2550) 3511 0 R (0:2551) 3512 0 R (0:2552) 3513 0 R (0:2553) 3514 0 R (0:2554) 3515 0 R (0:2555) 3516 0 R (0:2556) 3517 0 R (0:2557) 3518 0 R (0:2558) 3519 0 R (0:2559) 3520 0 R (0:256) 1151 0 R (0:2560) 3521 0 R (0:2561) 3522 0 R (0:2562) 3523 0 R (0:2563) 3524 0 R (0:2564) 3525 0 R (0:2565) 3526 0 R (0:2566) 3527 0 R (0:2567) 3528 0 R (0:257) 1152 0 R (0:2570) 3529 0 R (0:2571) 3530 0 R (0:2572) 3531 0 R (0:2573) 3532 0 R (0:2574) 3533 0 R (0:2575) 3534 0 R (0:2576) 3541 0 R (0:2577) 3500 0 R (0:258) 1153 0 R (0:2580) 3542 0 R (0:2581) 3543 0 R (0:2582) 3544 0 R (0:2583) 3545 0 R (0:2584) 3546 0 R (0:2585) 3547 0 R (0:2586) 3548 0 R (0:2587) 3549 0 R (0:2588) 3550 0 R (0:2589) 3551 0 R (0:259) 1154 0 R (0:2590) 3552 0 R (0:2591) 3553 0 R (0:2592) 3554 0 R (0:2593) 3555 0 R (0:2594) 3556 0 R (0:2595) 3557 0 R (0:2596) 3558 0 R (0:2597) 3559 0 R (0:2598) 3560 0 R (0:2599) 3561 0 R (0:260) 1155 0 R (0:2600) 3562 0 R (0:2601) 3563 0 R (0:2602) 3564 0 R (0:2603) 3565 0 R (0:2604) 3566 0 R (0:2605) 3567 0 R (0:2606) 3568 0 R (0:2607) 3569 0 R (0:2608) 3570 0 R (0:261) 1156 0 R (0:2611) 3571 0 R (0:2612) 3572 0 R (0:2613) 3573 0 R (0:2614) 3574 0 R (0:2615) 3575 0 R (0:2616) 3576 0 R (0:2617) 3577 0 R (0:2618) 3578 0 R (0:2619) 3579 0 R (0:262) 1157 0 R (0:2620) 3580 0 R (0:2621) 3585 0 R (0:2622) 3540 0 R (0:2623) 3586 0 R (0:2624) 3587 0 R (0:2625) 3588 0 R (0:2626) 3589 0 R (0:2627) 3590 0 R (0:2628) 3591 0 R (0:2629) 3592 0 R (0:263) 1158 0 R (0:2630) 3593 0 R (0:2631) 3594 0 R (0:2632) 3595 0 R (0:2633) 3596 0 R (0:2634) 3597 0 R (0:2635) 3598 0 R (0:2636) 3599 0 R (0:2637) 3600 0 R (0:264) 1159 0 R (0:2640) 3601 0 R (0:2641) 3602 0 R (0:2642) 3603 0 R (0:2643) 3604 0 R (0:2644) 3605 0 R (0:2645) 3606 0 R (0:2646) 3607 0 R (0:2647) 3608 0 R (0:2648) 3609 0 R (0:2649) 3610 0 R (0:265) 1160 0 R (0:2650) 3611 0 R (0:2651) 3612 0 R (0:2652) 3613 0 R (0:2653) 3614 0 R (0:2654) 3615 0 R (0:2655) 3616 0 R (0:2656) 3617 0 R (0:2657) 3618 0 R (0:2658) 3619 0 R (0:2659) 3620 0 R (0:266) 1161 0 R (0:2660) 3621 0 R (0:2661) 3622 0 R (0:2662) 3623 0 R (0:2663) 3624 0 R (0:2664) 3625 0 R (0:2665) 3626 0 R (0:2666) 3627 0 R (0:2667) 3628 0 R (0:2668) 3633 0 R (0:2669) 3634 0 R (0:267) 1162 0 R (0:2670) 3635 0 R (0:2671) 3636 0 R (0:2674) 3637 0 R (0:2675) 3638 0 R (0:2676) 3639 0 R (0:2677) 3640 0 R (0:2678) 3641 0 R (0:2679) 3642 0 R (0:268) 1163 0 R (0:2680) 3643 0 R (0:2681) 3644 0 R (0:2682) 3645 0 R (0:2683) 3646 0 R (0:2684) 3647 0 R (0:2685) 3648 0 R (0:2686) 3649 0 R (0:2687) 3650 0 R (0:2688) 3651 0 R (0:2689) 3652 0 R (0:2690) 3653 0 R (0:2691) 3654 0 R (0:2692) 3655 0 R (0:2693) 3656 0 R (0:2694) 3657 0 R (0:2695) 3658 0 R (0:2696) 3659 0 R (0:2697) 3660 0 R (0:2698) 3661 0 R (0:2699) 3662 0 R (0:2700) 3663 0 R (0:2701) 3664 0 R (0:2702) 3665 0 R (0:2703) 3666 0 R (0:2704) 3667 0 R (0:2705) 3668 0 R (0:2706) 3669 0 R (0:2707) 3670 0 R (0:2708) 3671 0 R (0:2709) 3672 0 R (0:271) 1164 0 R (0:2710) 3673 0 R (0:2711) 3674 0 R (0:2712) 3675 0 R (0:2713) 3676 0 R (0:2714) 3677 0 R (0:2715) 3678 0 R (0:2716) 3679 0 R (0:2717) 3680 0 R (0:2718) 3681 0 R (0:2719) 3682 0 R (0:272) 1165 0 R (0:2720) 3683 0 R (0:2721) 3684 0 R (0:2722) 3685 0 R (0:2723) 3686 0 R (0:2724) 3687 0 R (0:2725) 3692 0 R (0:2726) 3693 0 R (0:2727) 3694 0 R (0:2728) 3695 0 R (0:2729) 3696 0 R (0:273) 1166 0 R (0:2730) 3697 0 R (0:2731) 3698 0 R (0:2732) 3699 0 R (0:2733) 3700 0 R (0:2734) 3701 0 R (0:2735) 3702 0 R (0:2736) 3703 0 R (0:2737) 3704 0 R (0:2738) 3705 0 R (0:2739) 3706 0 R (0:274) 1167 0 R (0:2740) 3707 0 R (0:2741) 3708 0 R (0:2742) 3709 0 R (0:2743) 3710 0 R (0:2744) 3711 0 R (0:2745) 3712 0 R (0:2746) 3713 0 R (0:2747) 3714 0 R (0:2748) 3715 0 R (0:2749) 3716 0 R (0:275) 1168 0 R (0:2750) 3717 0 R (0:2751) 3718 0 R (0:2752) 3719 0 R (0:2753) 3720 0 R (0:2754) 3721 0 R (0:2755) 3722 0 R (0:2756) 3723 0 R (0:2757) 3724 0 R (0:2758) 3725 0 R (0:2759) 3726 0 R (0:276) 1169 0 R (0:2760) 3727 0 R (0:2761) 3728 0 R (0:2762) 3729 0 R (0:2763) 3730 0 R (0:2764) 3731 0 R (0:2765) 3732 0 R (0:2766) 3733 0 R (0:2767) 3734 0 R (0:2768) 3735 0 R (0:2769) 3736 0 R (0:277) 1170 0 R (0:2770) 3737 0 R (0:2771) 3738 0 R (0:2772) 3739 0 R (0:2773) 3740 0 R (0:2774) 3741 0 R (0:2775) 3742 0 R (0:2776) 3743 0 R (0:2777) 3744 0 R (0:2778) 3745 0 R (0:2779) 3746 0 R (0:278) 1171 0 R (0:2780) 3747 0 R (0:2781) 3748 0 R (0:2782) 3749 0 R (0:2783) 3750 0 R (0:2784) 3751 0 R (0:2785) 3752 0 R (0:2786) 3753 0 R (0:2787) 3754 0 R (0:2788) 3755 0 R (0:2789) 3756 0 R (0:279) 1172 0 R (0:2790) 3757 0 R (0:2791) 3758 0 R (0:2792) 3759 0 R (0:2793) 3760 0 R (0:2794) 3761 0 R (0:2795) 3766 0 R (0:2796) 3767 0 R (0:2797) 3768 0 R (0:2798) 3769 0 R (0:2799) 3770 0 R (0:28) 936 0 R (0:280) 1173 0 R (0:2800) 3771 0 R (0:2801) 3772 0 R (0:2802) 3773 0 R (0:2803) 3774 0 R (0:2804) 3775 0 R (0:2805) 3776 0 R (0:2806) 3777 0 R (0:2807) 3778 0 R (0:2808) 3779 0 R (0:2809) 3780 0 R (0:281) 1174 0 R (0:2810) 3781 0 R (0:2811) 3782 0 R (0:2814) 3783 0 R (0:2815) 3784 0 R (0:2816) 3785 0 R (0:2817) 3786 0 R (0:2818) 3787 0 R (0:2819) 3788 0 R (0:282) 1175 0 R (0:2820) 3789 0 R (0:2821) 3790 0 R (0:2822) 3791 0 R (0:2823) 3792 0 R (0:2824) 3793 0 R (0:2825) 3794 0 R (0:2826) 3795 0 R (0:2827) 3796 0 R (0:2828) 3797 0 R (0:2829) 3798 0 R (0:283) 1176 0 R (0:2830) 3799 0 R (0:2831) 3800 0 R (0:2832) 3801 0 R (0:2833) 3802 0 R (0:2834) 3803 0 R (0:2835) 3804 0 R (0:2836) 3805 0 R (0:2837) 3806 0 R (0:2838) 3807 0 R (0:2839) 3808 0 R (0:284) 1177 0 R (0:2840) 3809 0 R (0:2841) 3810 0 R (0:2842) 3811 0 R (0:2843) 3812 0 R (0:2844) 3813 0 R (0:2845) 3814 0 R (0:2846) 3815 0 R (0:2847) 3816 0 R (0:2848) 3817 0 R (0:2849) 3818 0 R (0:285) 1178 0 R (0:2850) 3819 0 R (0:2851) 3824 0 R (0:2852) 3825 0 R (0:2853) 3826 0 R (0:2854) 3827 0 R (0:2855) 3828 0 R (0:2856) 3829 0 R (0:2857) 3830 0 R (0:2858) 3831 0 R (0:2859) 3832 0 R (0:286) 1179 0 R (0:2860) 3833 0 R (0:2861) 3834 0 R (0:2862) 3835 0 R (0:2863) 3836 0 R (0:2864) 3837 0 R (0:2865) 3838 0 R (0:2866) 3839 0 R (0:2867) 3840 0 R (0:2868) 3841 0 R (0:2869) 3842 0 R (0:287) 1180 0 R (0:2870) 3843 0 R (0:2871) 3844 0 R (0:2872) 3845 0 R (0:2873) 3846 0 R (0:2874) 3847 0 R (0:2875) 3848 0 R (0:2876) 3849 0 R (0:2877) 3850 0 R (0:2878) 3851 0 R (0:2879) 3852 0 R (0:288) 1181 0 R (0:2880) 3853 0 R (0:2881) 3854 0 R (0:2882) 3855 0 R (0:2883) 3856 0 R (0:2884) 3857 0 R (0:2885) 3858 0 R (0:2886) 3859 0 R (0:2887) 3860 0 R (0:2888) 3861 0 R (0:2889) 3862 0 R (0:289) 1182 0 R (0:2892) 3863 0 R (0:2893) 3864 0 R (0:2894) 3865 0 R (0:2895) 3866 0 R (0:2896) 3867 0 R (0:2897) 3868 0 R (0:2898) 3869 0 R (0:2899) 3870 0 R (0:29) 937 0 R (0:290) 1183 0 R (0:2900) 3871 0 R (0:2901) 3877 0 R (0:2902) 3878 0 R (0:2903) 3879 0 R (0:2904) 3880 0 R (0:2905) 3881 0 R (0:2906) 3882 0 R (0:2907) 3883 0 R (0:2908) 3884 0 R (0:2909) 3885 0 R (0:291) 1184 0 R (0:2910) 3886 0 R (0:2911) 3887 0 R (0:2912) 3888 0 R (0:2913) 3889 0 R (0:2916) 3890 0 R (0:2917) 3891 0 R (0:2918) 3892 0 R (0:2919) 3893 0 R (0:292) 1185 0 R (0:2920) 3894 0 R (0:2921) 3895 0 R (0:2922) 3896 0 R (0:2923) 3897 0 R (0:2924) 3898 0 R (0:2925) 3899 0 R (0:2926) 3900 0 R (0:2927) 3901 0 R (0:2928) 3902 0 R (0:2929) 3903 0 R (0:293) 1186 0 R (0:2930) 3904 0 R (0:2931) 3905 0 R (0:2932) 3906 0 R (0:2933) 3907 0 R (0:2934) 3908 0 R (0:2935) 3909 0 R (0:2936) 3910 0 R (0:2937) 3911 0 R (0:2938) 3912 0 R (0:2939) 3913 0 R (0:294) 1187 0 R (0:2940) 3914 0 R (0:2941) 3915 0 R (0:2942) 3916 0 R (0:2943) 3917 0 R (0:2944) 3918 0 R (0:2945) 3919 0 R (0:2946) 3920 0 R (0:2947) 3921 0 R (0:2948) 3922 0 R (0:2949) 3923 0 R (0:295) 1188 0 R (0:2950) 3924 0 R (0:2951) 3925 0 R (0:2952) 3926 0 R (0:2953) 3927 0 R (0:2954) 3928 0 R (0:2955) 3929 0 R (0:2956) 3930 0 R (0:2957) 3931 0 R (0:2958) 3936 0 R (0:2959) 3937 0 R (0:296) 1189 0 R (0:2960) 3938 0 R (0:2961) 3939 0 R (0:2962) 3940 0 R (0:2963) 3941 0 R (0:2964) 3942 0 R (0:2965) 3943 0 R (0:2966) 3944 0 R (0:2967) 3945 0 R (0:2968) 3946 0 R (0:2969) 3947 0 R (0:297) 1190 0 R (0:2970) 3948 0 R (0:2971) 3949 0 R (0:2972) 3950 0 R (0:2973) 3951 0 R (0:2974) 3952 0 R (0:2975) 3953 0 R (0:2976) 3954 0 R (0:2977) 3955 0 R (0:2978) 3956 0 R (0:2979) 3957 0 R (0:298) 1191 0 R (0:2980) 3958 0 R (0:2981) 3959 0 R (0:2982) 3960 0 R (0:2983) 3961 0 R (0:2984) 3962 0 R (0:2985) 3963 0 R (0:2986) 3964 0 R (0:2987) 3965 0 R (0:2988) 3966 0 R (0:2989) 3967 0 R (0:299) 1192 0 R (0:2990) 3968 0 R (0:2991) 3969 0 R (0:2992) 3970 0 R (0:2993) 3971 0 R (0:2994) 3972 0 R (0:2995) 3973 0 R (0:2996) 3974 0 R (0:2997) 3975 0 R (0:2998) 3976 0 R (0:2999) 3977 0 R (0:30) 938 0 R (0:300) 1193 0 R (0:3000) 3978 0 R (0:3001) 3979 0 R (0:3002) 3980 0 R (0:3003) 3981 0 R (0:3004) 3982 0 R (0:3005) 3983 0 R (0:3006) 3984 0 R (0:3007) 3985 0 R (0:3008) 3986 0 R (0:3009) 3987 0 R (0:301) 1139 0 R (0:3010) 3988 0 R (0:3011) 3989 0 R (0:3012) 3990 0 R (0:3013) 3991 0 R (0:3014) 3992 0 R (0:3015) 3993 0 R (0:3016) 3994 0 R (0:3017) 3995 0 R (0:3018) 3996 0 R (0:3019) 3997 0 R (0:302) 1200 0 R (0:3020) 3998 0 R (0:3021) 3999 0 R (0:3022) 4000 0 R (0:3023) 4001 0 R (0:3024) 4002 0 R (0:3025) 4003 0 R (0:3026) 4004 0 R (0:3027) 4005 0 R (0:3028) 4010 0 R (0:3029) 4011 0 R (0:303) 1201 0 R (0:3030) 4012 0 R (0:3031) 4013 0 R (0:3032) 4014 0 R (0:3033) 4015 0 R (0:3034) 4016 0 R (0:3035) 4017 0 R (0:3036) 4018 0 R (0:3037) 4019 0 R (0:3038) 4020 0 R (0:3039) 4021 0 R (0:304) 1202 0 R (0:3040) 4022 0 R (0:3041) 4023 0 R (0:3042) 4024 0 R (0:3043) 4025 0 R (0:3044) 4026 0 R (0:3045) 4027 0 R (0:3046) 4028 0 R (0:3047) 4029 0 R (0:3048) 4030 0 R (0:3049) 4031 0 R (0:3050) 4032 0 R (0:3051) 4033 0 R (0:3052) 4034 0 R (0:3053) 4035 0 R (0:3054) 4036 0 R (0:3055) 4037 0 R (0:3056) 4038 0 R (0:3057) 4039 0 R (0:3058) 4040 0 R (0:3059) 4041 0 R (0:3060) 4042 0 R (0:3061) 4043 0 R (0:3062) 4044 0 R (0:3063) 4045 0 R (0:3064) 4046 0 R (0:3065) 4047 0 R (0:3066) 4048 0 R (0:3067) 4049 0 R (0:3068) 4050 0 R (0:3069) 4051 0 R (0:307) 1203 0 R (0:3070) 4052 0 R (0:3071) 4053 0 R (0:3072) 4054 0 R (0:3073) 4055 0 R (0:3074) 4056 0 R (0:3075) 4057 0 R (0:3076) 4058 0 R (0:3077) 4059 0 R (0:3078) 4060 0 R (0:3079) 4061 0 R (0:308) 1204 0 R (0:3080) 4062 0 R (0:3081) 4063 0 R (0:3082) 4064 0 R (0:3083) 4065 0 R (0:3084) 4066 0 R (0:3085) 4067 0 R (0:3086) 4068 0 R (0:3087) 4069 0 R (0:3088) 4070 0 R (0:3089) 4071 0 R (0:309) 1205 0 R (0:3090) 4072 0 R (0:3091) 4073 0 R (0:3092) 4074 0 R (0:3093) 4075 0 R (0:3094) 4076 0 R (0:3095) 4077 0 R (0:3096) 4078 0 R (0:3097) 4079 0 R (0:3098) 4080 0 R (0:3099) 4081 0 R (0:31) 939 0 R (0:310) 1206 0 R (0:3100) 4082 0 R (0:3101) 4083 0 R (0:3102) 4084 0 R (0:3103) 4089 0 R (0:3104) 4090 0 R (0:3105) 4091 0 R (0:3106) 4092 0 R (0:3107) 4093 0 R (0:311) 1207 0 R (0:3110) 4094 0 R (0:3111) 4095 0 R (0:3112) 4096 0 R (0:3113) 4097 0 R (0:3114) 4098 0 R (0:3115) 4099 0 R (0:3116) 4100 0 R (0:3117) 4101 0 R (0:3118) 4102 0 R (0:3119) 4103 0 R (0:312) 1208 0 R (0:3120) 4104 0 R (0:3121) 4105 0 R (0:3122) 4106 0 R (0:3123) 4107 0 R (0:3124) 4108 0 R (0:3125) 4109 0 R (0:3126) 4110 0 R (0:3127) 4111 0 R (0:3128) 4112 0 R (0:3129) 4113 0 R (0:313) 1209 0 R (0:3130) 4114 0 R (0:3131) 4115 0 R (0:3132) 4116 0 R (0:3133) 4117 0 R (0:3134) 4118 0 R (0:3135) 4119 0 R (0:3136) 4120 0 R (0:3137) 4121 0 R (0:3138) 4122 0 R (0:3139) 4123 0 R (0:314) 1210 0 R (0:3140) 4124 0 R (0:3141) 4125 0 R (0:3142) 4126 0 R (0:3143) 4127 0 R (0:3144) 4128 0 R (0:3145) 4129 0 R (0:3146) 4130 0 R (0:3147) 4131 0 R (0:3148) 4132 0 R (0:3149) 4133 0 R (0:315) 1211 0 R (0:3150) 4134 0 R (0:3151) 4135 0 R (0:3152) 4136 0 R (0:3153) 4137 0 R (0:3154) 4138 0 R (0:3155) 4139 0 R (0:3156) 4140 0 R (0:3157) 4141 0 R (0:3158) 4142 0 R (0:3159) 4143 0 R (0:316) 1212 0 R (0:3160) 4148 0 R (0:3161) 4149 0 R (0:3162) 4150 0 R (0:3163) 4151 0 R (0:3164) 4152 0 R (0:3165) 4153 0 R (0:3166) 4154 0 R (0:3167) 4155 0 R (0:3168) 4156 0 R (0:3169) 4157 0 R (0:317) 1213 0 R (0:3170) 4158 0 R (0:3171) 4159 0 R (0:3172) 4160 0 R (0:3173) 4161 0 R (0:3174) 4162 0 R (0:3175) 4163 0 R (0:3176) 4164 0 R (0:3177) 4165 0 R (0:3178) 4166 0 R (0:3179) 4167 0 R (0:318) 1214 0 R (0:3180) 4168 0 R (0:3181) 4169 0 R (0:3182) 4170 0 R (0:3183) 4171 0 R (0:3184) 4172 0 R (0:3185) 4173 0 R (0:3186) 4174 0 R (0:3187) 4175 0 R (0:3188) 4176 0 R (0:3189) 4177 0 R (0:319) 1215 0 R (0:3190) 4178 0 R (0:3191) 4179 0 R (0:3192) 4180 0 R (0:3193) 4181 0 R (0:3194) 4182 0 R (0:3195) 4183 0 R (0:3196) 4184 0 R (0:3197) 4185 0 R (0:3198) 4186 0 R (0:3199) 4187 0 R (0:320) 1216 0 R (0:3200) 4188 0 R (0:3201) 4189 0 R (0:3202) 4190 0 R (0:3203) 4191 0 R (0:3204) 4192 0 R (0:3205) 4193 0 R (0:3206) 4194 0 R (0:3207) 4195 0 R (0:3208) 4196 0 R (0:3209) 4197 0 R (0:321) 1217 0 R (0:3210) 4198 0 R (0:3211) 4199 0 R (0:3212) 4200 0 R (0:3213) 4201 0 R (0:3214) 4202 0 R (0:3215) 4203 0 R (0:3216) 4204 0 R (0:3217) 4205 0 R (0:3218) 4206 0 R (0:3219) 4207 0 R (0:322) 1218 0 R (0:3220) 4208 0 R (0:3221) 4209 0 R (0:3222) 4210 0 R (0:3223) 4215 0 R (0:3224) 4216 0 R (0:3225) 4217 0 R (0:3226) 4218 0 R (0:3227) 4219 0 R (0:3228) 4220 0 R (0:3229) 4221 0 R (0:323) 1219 0 R (0:3230) 4222 0 R (0:3231) 4223 0 R (0:3232) 4224 0 R (0:3233) 4225 0 R (0:3234) 4226 0 R (0:3235) 4227 0 R (0:3236) 4228 0 R (0:3237) 4229 0 R (0:3238) 4230 0 R (0:3239) 4231 0 R (0:324) 1220 0 R (0:3240) 4232 0 R (0:3241) 4233 0 R (0:3242) 4234 0 R (0:3243) 4235 0 R (0:3244) 4236 0 R (0:3245) 4237 0 R (0:3246) 4238 0 R (0:3247) 4239 0 R (0:3248) 4240 0 R (0:3249) 4241 0 R (0:325) 1221 0 R (0:3250) 4242 0 R (0:3251) 4243 0 R (0:3252) 4244 0 R (0:3253) 4245 0 R (0:3254) 4246 0 R (0:3255) 4247 0 R (0:3256) 4248 0 R (0:3257) 4249 0 R (0:3258) 4250 0 R (0:3259) 4251 0 R (0:326) 1222 0 R (0:3260) 4252 0 R (0:3261) 4253 0 R (0:3262) 4254 0 R (0:3263) 4255 0 R (0:3266) 4256 0 R (0:3267) 4257 0 R (0:3268) 4258 0 R (0:3269) 4259 0 R (0:327) 1223 0 R (0:3270) 4260 0 R (0:3271) 4261 0 R (0:3272) 4262 0 R (0:3273) 4263 0 R (0:3274) 4264 0 R (0:3275) 4265 0 R (0:3276) 4266 0 R (0:3277) 4267 0 R (0:3278) 4268 0 R (0:3279) 4269 0 R (0:328) 1224 0 R (0:3280) 4270 0 R (0:3281) 4271 0 R (0:3282) 4272 0 R (0:3283) 4273 0 R (0:3284) 4274 0 R (0:3285) 4280 0 R (0:3286) 4281 0 R (0:3287) 4282 0 R (0:3288) 4283 0 R (0:3289) 4284 0 R (0:329) 1225 0 R (0:3290) 4285 0 R (0:3291) 4286 0 R (0:3292) 4287 0 R (0:3293) 4288 0 R (0:3294) 4289 0 R (0:3295) 4290 0 R (0:3296) 4291 0 R (0:3297) 4292 0 R (0:3298) 4293 0 R (0:3299) 4294 0 R (0:330) 1226 0 R (0:3300) 4295 0 R (0:3301) 4296 0 R (0:3302) 4297 0 R (0:3303) 4298 0 R (0:3304) 4299 0 R (0:3305) 4300 0 R (0:3306) 4301 0 R (0:3307) 4302 0 R (0:3308) 4303 0 R (0:3309) 4304 0 R (0:331) 1227 0 R (0:3310) 4305 0 R (0:3311) 4306 0 R (0:3312) 4307 0 R (0:3313) 4308 0 R (0:3314) 4309 0 R (0:3315) 4310 0 R (0:3316) 4311 0 R (0:3317) 4312 0 R (0:3318) 4313 0 R (0:3319) 4314 0 R (0:332) 1228 0 R (0:3320) 4315 0 R (0:3321) 4316 0 R (0:3322) 4317 0 R (0:3323) 4318 0 R (0:3324) 4319 0 R (0:3325) 4320 0 R (0:3326) 4321 0 R (0:3327) 4322 0 R (0:3328) 4323 0 R (0:3329) 4324 0 R (0:333) 1229 0 R (0:3330) 4325 0 R (0:3331) 4326 0 R (0:3332) 4327 0 R (0:3333) 4328 0 R (0:3334) 4329 0 R (0:3335) 4330 0 R (0:3336) 4331 0 R (0:3337) 4332 0 R (0:3338) 4333 0 R (0:3339) 4334 0 R (0:334) 1230 0 R (0:3340) 4335 0 R (0:3341) 4336 0 R (0:3342) 4337 0 R (0:3343) 4338 0 R (0:3344) 4339 0 R (0:3345) 4340 0 R (0:3346) 4341 0 R (0:3347) 4342 0 R (0:3348) 4343 0 R (0:3349) 4344 0 R (0:335) 1231 0 R (0:3350) 4345 0 R (0:3351) 4350 0 R (0:3352) 4351 0 R (0:3353) 4352 0 R (0:3354) 4353 0 R (0:3355) 4354 0 R (0:3356) 4355 0 R (0:3357) 4356 0 R (0:3358) 4357 0 R (0:3359) 4358 0 R (0:336) 1232 0 R (0:3360) 4359 0 R (0:3361) 4360 0 R (0:3362) 4361 0 R (0:3363) 4362 0 R (0:3364) 4363 0 R (0:3365) 4364 0 R (0:3366) 4365 0 R (0:3367) 4366 0 R (0:3368) 4367 0 R (0:3369) 4368 0 R (0:337) 1233 0 R (0:3370) 4369 0 R (0:3371) 4370 0 R (0:3372) 4371 0 R (0:3373) 4372 0 R (0:3376) 4373 0 R (0:3377) 4374 0 R (0:3378) 4375 0 R (0:3379) 4376 0 R (0:338) 1234 0 R (0:3380) 4377 0 R (0:3381) 4378 0 R (0:3382) 4379 0 R (0:3383) 4380 0 R (0:3384) 4381 0 R (0:3385) 4382 0 R (0:3386) 4383 0 R (0:3387) 4384 0 R (0:3388) 4385 0 R (0:3389) 4386 0 R (0:339) 1235 0 R (0:3390) 4387 0 R (0:3391) 4388 0 R (0:3392) 4389 0 R (0:3393) 4390 0 R (0:3394) 4391 0 R (0:3395) 4392 0 R (0:3396) 4393 0 R (0:3397) 4394 0 R (0:340) 1236 0 R (0:3400) 4395 0 R (0:3401) 4396 0 R (0:3402) 4397 0 R (0:3403) 4402 0 R (0:3404) 4403 0 R (0:3405) 4404 0 R (0:3406) 4405 0 R (0:3407) 4406 0 R (0:3408) 4407 0 R (0:3409) 4408 0 R (0:3410) 4409 0 R (0:3411) 4410 0 R (0:3412) 4411 0 R (0:3413) 4412 0 R (0:3414) 4413 0 R (0:3415) 4414 0 R (0:3416) 4415 0 R (0:3417) 4416 0 R (0:3418) 4417 0 R (0:3419) 4418 0 R (0:3420) 4419 0 R (0:3421) 4420 0 R (0:3422) 4421 0 R (0:3423) 4422 0 R (0:3424) 4423 0 R (0:3425) 4424 0 R (0:3426) 4425 0 R (0:3427) 4426 0 R (0:3428) 4427 0 R (0:3429) 4428 0 R (0:343) 1241 0 R (0:3430) 4429 0 R (0:3431) 4430 0 R (0:3432) 4431 0 R (0:3433) 4432 0 R (0:3434) 4433 0 R (0:3435) 4434 0 R (0:3436) 4435 0 R (0:3437) 4436 0 R (0:3438) 4437 0 R (0:3439) 4438 0 R (0:344) 1242 0 R (0:3440) 4439 0 R (0:3441) 4440 0 R (0:3442) 4441 0 R (0:3443) 4442 0 R (0:3444) 4443 0 R (0:3445) 4444 0 R (0:3446) 4445 0 R (0:3447) 4446 0 R (0:3448) 4447 0 R (0:3449) 4448 0 R (0:345) 1243 0 R (0:3450) 4449 0 R (0:3451) 4450 0 R (0:3452) 4451 0 R (0:3453) 4452 0 R (0:3454) 4453 0 R (0:3455) 4454 0 R (0:3456) 4455 0 R (0:3457) 4456 0 R (0:3458) 4457 0 R (0:3459) 4458 0 R (0:346) 1199 0 R (0:3460) 4459 0 R (0:3461) 4460 0 R (0:3462) 4461 0 R (0:3463) 4462 0 R (0:3464) 4468 0 R (0:3465) 4469 0 R (0:3466) 4470 0 R (0:3467) 4471 0 R (0:3468) 4472 0 R (0:3469) 4473 0 R (0:3470) 4474 0 R (0:3471) 4475 0 R (0:3472) 4476 0 R (0:3473) 4477 0 R (0:3474) 4478 0 R (0:3475) 4479 0 R (0:3476) 4480 0 R (0:3477) 4481 0 R (0:3478) 4482 0 R (0:3479) 4483 0 R (0:3480) 4484 0 R (0:3481) 4485 0 R (0:3484) 4486 0 R (0:3485) 4487 0 R (0:3486) 4488 0 R (0:3487) 4489 0 R (0:3488) 4490 0 R (0:3489) 4491 0 R (0:349) 1244 0 R (0:3490) 4492 0 R (0:3491) 4493 0 R (0:3492) 4494 0 R (0:3493) 4495 0 R (0:3494) 4496 0 R (0:3495) 4497 0 R (0:3496) 4498 0 R (0:3497) 4499 0 R (0:3498) 4500 0 R (0:3499) 4501 0 R (0:350) 1245 0 R (0:3500) 4502 0 R (0:3501) 4503 0 R (0:3502) 4504 0 R (0:3503) 4505 0 R (0:3504) 4506 0 R (0:3505) 4507 0 R (0:3508) 4512 0 R (0:3509) 4513 0 R (0:351) 1246 0 R (0:3510) 4514 0 R (0:3511) 4467 0 R (0:3514) 4515 0 R (0:3515) 4516 0 R (0:3516) 4517 0 R (0:3517) 4518 0 R (0:3518) 4519 0 R (0:3519) 4520 0 R (0:352) 1247 0 R (0:3520) 4521 0 R (0:3521) 4522 0 R (0:3522) 4523 0 R (0:3523) 4524 0 R (0:3524) 4525 0 R (0:3525) 4526 0 R (0:3526) 4527 0 R (0:3527) 4528 0 R (0:3528) 4529 0 R (0:3529) 4530 0 R (0:353) 1248 0 R (0:3532) 4531 0 R (0:3533) 4532 0 R (0:3534) 4533 0 R (0:3535) 4534 0 R (0:3536) 4535 0 R (0:3537) 4536 0 R (0:3538) 4537 0 R (0:3539) 4538 0 R (0:354) 1249 0 R (0:3540) 4539 0 R (0:3541) 4540 0 R (0:3542) 4541 0 R (0:3543) 4542 0 R (0:3544) 4543 0 R (0:3545) 4544 0 R (0:3546) 4545 0 R (0:3547) 4546 0 R (0:3548) 4551 0 R (0:3549) 4552 0 R (0:355) 1250 0 R (0:3550) 4553 0 R (0:3551) 4554 0 R (0:3552) 4555 0 R (0:3553) 4556 0 R (0:3554) 4557 0 R (0:3555) 4558 0 R (0:3556) 4559 0 R (0:3557) 4560 0 R (0:3558) 4561 0 R (0:3559) 4562 0 R (0:356) 1251 0 R (0:3560) 4563 0 R (0:3561) 4564 0 R (0:3562) 4565 0 R (0:3563) 4566 0 R (0:3564) 4567 0 R (0:3565) 4568 0 R (0:3566) 4569 0 R (0:3567) 4570 0 R (0:3568) 4571 0 R (0:3569) 4572 0 R (0:357) 1252 0 R (0:3570) 4573 0 R (0:3571) 4574 0 R (0:3572) 4575 0 R (0:3573) 4576 0 R (0:3574) 4577 0 R (0:3575) 4578 0 R (0:3576) 4579 0 R (0:3577) 4580 0 R (0:3578) 4581 0 R (0:3579) 4582 0 R (0:358) 1253 0 R (0:3580) 4583 0 R (0:3581) 4584 0 R (0:3582) 4585 0 R (0:3583) 4586 0 R (0:3584) 4587 0 R (0:3585) 4588 0 R (0:3586) 4589 0 R (0:3587) 4590 0 R (0:3588) 4591 0 R (0:3589) 4592 0 R (0:359) 1254 0 R (0:3590) 4593 0 R (0:3591) 4594 0 R (0:3592) 4595 0 R (0:3593) 4596 0 R (0:3594) 4597 0 R (0:3595) 4598 0 R (0:3596) 4599 0 R (0:3597) 4600 0 R (0:3598) 4601 0 R (0:3599) 4602 0 R (0:360) 1255 0 R (0:3600) 4603 0 R (0:3601) 4604 0 R (0:3602) 4605 0 R (0:3603) 4606 0 R (0:3604) 4607 0 R (0:3605) 4608 0 R (0:3606) 4609 0 R (0:3607) 4610 0 R (0:3608) 4611 0 R (0:3609) 4612 0 R (0:361) 1256 0 R (0:3610) 4613 0 R (0:3611) 4614 0 R (0:3612) 4615 0 R (0:3613) 4616 0 R (0:3614) 4617 0 R (0:3615) 4618 0 R (0:3616) 4619 0 R (0:3617) 4625 0 R (0:3618) 4626 0 R (0:3619) 4627 0 R (0:362) 1257 0 R (0:3622) 4628 0 R (0:3623) 4629 0 R (0:3624) 4630 0 R (0:3625) 4631 0 R (0:3626) 4632 0 R (0:3627) 4633 0 R (0:3628) 4634 0 R (0:3629) 4635 0 R (0:363) 1258 0 R (0:3630) 4636 0 R (0:3631) 4637 0 R (0:3632) 4638 0 R (0:3633) 4639 0 R (0:3634) 4640 0 R (0:3635) 4641 0 R (0:3636) 4642 0 R (0:3637) 4643 0 R (0:3638) 4644 0 R (0:3639) 4645 0 R (0:364) 1259 0 R (0:3640) 4646 0 R (0:3641) 4647 0 R (0:3642) 4648 0 R (0:3643) 4649 0 R (0:3644) 4650 0 R (0:3645) 4651 0 R (0:3646) 4652 0 R (0:3647) 4653 0 R (0:3648) 4654 0 R (0:3649) 4655 0 R (0:365) 1260 0 R (0:3650) 4656 0 R (0:3651) 4657 0 R (0:3652) 4658 0 R (0:3653) 4659 0 R (0:3654) 4660 0 R (0:3655) 4661 0 R (0:3656) 4662 0 R (0:3657) 4663 0 R (0:3658) 4664 0 R (0:3659) 4665 0 R (0:366) 1261 0 R (0:3660) 4666 0 R (0:3661) 4667 0 R (0:3662) 4668 0 R (0:3663) 4669 0 R (0:3664) 4670 0 R (0:3665) 4671 0 R (0:3666) 4672 0 R (0:3667) 4673 0 R (0:3668) 4674 0 R (0:3669) 4675 0 R (0:367) 1262 0 R (0:3670) 4676 0 R (0:3671) 4677 0 R (0:3672) 4682 0 R (0:3673) 4683 0 R (0:3674) 4684 0 R (0:3675) 4685 0 R (0:3676) 4686 0 R (0:3677) 4687 0 R (0:3678) 4688 0 R (0:3679) 4689 0 R (0:368) 1263 0 R (0:3680) 4690 0 R (0:3681) 4691 0 R (0:3682) 4692 0 R (0:3683) 4693 0 R (0:3684) 4694 0 R (0:3685) 4695 0 R (0:3686) 4696 0 R (0:3687) 4697 0 R (0:3688) 4698 0 R (0:3689) 4699 0 R (0:3690) 4700 0 R (0:3691) 4701 0 R (0:3692) 4702 0 R (0:3693) 4703 0 R (0:3694) 4704 0 R (0:3695) 4705 0 R (0:3696) 4706 0 R (0:3697) 4707 0 R (0:3698) 4708 0 R (0:3699) 4709 0 R (0:3700) 4710 0 R (0:3701) 4711 0 R (0:3702) 4712 0 R (0:3703) 4713 0 R (0:3704) 4714 0 R (0:3705) 4715 0 R (0:3706) 4716 0 R (0:3707) 4717 0 R (0:3708) 4718 0 R (0:3709) 4719 0 R (0:371) 1264 0 R (0:3710) 4720 0 R (0:3711) 4721 0 R (0:3712) 4722 0 R (0:3713) 4723 0 R (0:3714) 4724 0 R (0:3715) 4725 0 R (0:3716) 4726 0 R (0:3717) 4727 0 R (0:3718) 4728 0 R (0:3719) 4729 0 R (0:372) 1265 0 R (0:3720) 4730 0 R (0:3721) 4731 0 R (0:3722) 4732 0 R (0:3723) 4733 0 R (0:3724) 4734 0 R (0:3725) 4735 0 R (0:3726) 4736 0 R (0:3727) 4737 0 R (0:3728) 4738 0 R (0:3729) 4739 0 R (0:373) 1266 0 R (0:3730) 4740 0 R (0:3731) 4741 0 R (0:3732) 4742 0 R (0:3733) 4743 0 R (0:3734) 4744 0 R (0:3735) 4745 0 R (0:3736) 4746 0 R (0:3737) 4747 0 R (0:3738) 4748 0 R (0:3739) 4749 0 R (0:374) 1267 0 R (0:3740) 4750 0 R (0:3741) 4751 0 R (0:3742) 4756 0 R (0:3743) 4757 0 R (0:3744) 4758 0 R (0:3745) 4759 0 R (0:3746) 4760 0 R (0:3747) 4761 0 R (0:3748) 4762 0 R (0:3749) 4763 0 R (0:375) 1268 0 R (0:3750) 4764 0 R (0:3751) 4765 0 R (0:3752) 4766 0 R (0:3753) 4767 0 R (0:3754) 4768 0 R (0:3755) 4769 0 R (0:3756) 4770 0 R (0:3757) 4771 0 R (0:3758) 4772 0 R (0:3759) 4773 0 R (0:376) 1269 0 R (0:3760) 4774 0 R (0:3761) 4775 0 R (0:3762) 4776 0 R (0:3763) 4777 0 R (0:3764) 4778 0 R (0:3765) 4779 0 R (0:3766) 4780 0 R (0:3767) 4781 0 R (0:3768) 4782 0 R (0:3769) 4783 0 R (0:377) 1270 0 R (0:3770) 4784 0 R (0:3771) 4785 0 R (0:3772) 4786 0 R (0:3773) 4787 0 R (0:3774) 4788 0 R (0:3775) 4789 0 R (0:3776) 4790 0 R (0:3777) 4791 0 R (0:3778) 4792 0 R (0:3779) 4793 0 R (0:378) 1271 0 R (0:3780) 4794 0 R (0:3781) 4795 0 R (0:3782) 4796 0 R (0:3783) 4797 0 R (0:3784) 4798 0 R (0:3785) 4799 0 R (0:3786) 4800 0 R (0:3787) 4801 0 R (0:3788) 4802 0 R (0:3789) 4803 0 R (0:379) 1272 0 R (0:3790) 4804 0 R (0:3791) 4805 0 R (0:3792) 4806 0 R (0:3793) 4807 0 R (0:3794) 4808 0 R (0:3795) 4809 0 R (0:3796) 4810 0 R (0:3797) 4811 0 R (0:3798) 4812 0 R (0:3799) 4813 0 R (0:380) 1273 0 R (0:3800) 4814 0 R (0:3801) 4815 0 R (0:3802) 4816 0 R (0:3803) 4817 0 R (0:3804) 4818 0 R (0:3805) 4819 0 R (0:3806) 4820 0 R (0:3807) 4821 0 R (0:3808) 4822 0 R (0:3809) 4823 0 R (0:381) 1278 0 R (0:3810) 4824 0 R (0:3811) 4825 0 R (0:3812) 4826 0 R (0:3813) 4827 0 R (0:3814) 4828 0 R (0:3815) 4829 0 R (0:3816) 4830 0 R (0:3817) 4835 0 R (0:3818) 4836 0 R (0:3819) 4837 0 R (0:382) 1279 0 R (0:3820) 4838 0 R (0:3821) 4839 0 R (0:3822) 4840 0 R (0:3823) 4841 0 R (0:3824) 4842 0 R (0:3827) 4843 0 R (0:3828) 4844 0 R (0:3829) 4845 0 R (0:383) 1280 0 R (0:3830) 4846 0 R (0:3831) 4847 0 R (0:3832) 4848 0 R (0:3833) 4849 0 R (0:3834) 4850 0 R (0:3835) 4851 0 R (0:3836) 4852 0 R (0:3837) 4853 0 R (0:3838) 4854 0 R (0:3839) 4855 0 R (0:384) 1281 0 R (0:3840) 4856 0 R (0:3841) 4857 0 R (0:3842) 4858 0 R (0:3843) 4859 0 R (0:3844) 4860 0 R (0:3845) 4861 0 R (0:3846) 4862 0 R (0:3847) 4863 0 R (0:3848) 4864 0 R (0:3849) 4865 0 R (0:385) 1282 0 R (0:3850) 4866 0 R (0:3851) 4867 0 R (0:3852) 4868 0 R (0:3853) 4869 0 R (0:3854) 4870 0 R (0:3855) 4871 0 R (0:3856) 4872 0 R (0:3857) 4873 0 R (0:3858) 4874 0 R (0:3859) 4875 0 R (0:386) 1283 0 R (0:3860) 4876 0 R (0:3861) 4877 0 R (0:3862) 4878 0 R (0:3863) 4879 0 R (0:3864) 4880 0 R (0:3865) 4881 0 R (0:3866) 4882 0 R (0:3867) 4883 0 R (0:3868) 4884 0 R (0:3869) 4885 0 R (0:387) 1284 0 R (0:3870) 4886 0 R (0:3871) 4887 0 R (0:3872) 4888 0 R (0:3873) 4893 0 R (0:3874) 4894 0 R (0:3875) 4895 0 R (0:3876) 4896 0 R (0:3877) 4897 0 R (0:3878) 4898 0 R (0:3879) 4899 0 R (0:388) 1285 0 R (0:3880) 4900 0 R (0:3881) 4901 0 R (0:3882) 4902 0 R (0:3883) 4903 0 R (0:3884) 4904 0 R (0:3885) 4905 0 R (0:3886) 4906 0 R (0:3887) 4907 0 R (0:3888) 4908 0 R (0:3889) 4909 0 R (0:389) 1286 0 R (0:3890) 4910 0 R (0:3891) 4911 0 R (0:3892) 4912 0 R (0:3893) 4913 0 R (0:3894) 4914 0 R (0:3895) 4915 0 R (0:3896) 4916 0 R (0:3897) 4917 0 R (0:3898) 4918 0 R (0:3899) 4919 0 R (0:390) 1287 0 R (0:3900) 4920 0 R (0:3901) 4921 0 R (0:3902) 4922 0 R (0:3903) 4923 0 R (0:3904) 4924 0 R (0:3905) 4925 0 R (0:3906) 4926 0 R (0:3907) 4927 0 R (0:3908) 4928 0 R (0:3909) 4929 0 R (0:391) 1288 0 R (0:3910) 4930 0 R (0:3911) 4931 0 R (0:3912) 4932 0 R (0:3913) 4933 0 R (0:3914) 4934 0 R (0:3915) 4935 0 R (0:3916) 4936 0 R (0:3917) 4937 0 R (0:3918) 4938 0 R (0:3919) 4939 0 R (0:392) 1289 0 R (0:3920) 4940 0 R (0:3921) 4941 0 R (0:3922) 4942 0 R (0:3923) 4943 0 R (0:3924) 4944 0 R (0:3925) 4945 0 R (0:3926) 4946 0 R (0:3927) 4947 0 R (0:3928) 4948 0 R (0:3929) 4949 0 R (0:393) 1290 0 R (0:3930) 4950 0 R (0:3931) 4951 0 R (0:3932) 4952 0 R (0:3933) 4953 0 R (0:3934) 4954 0 R (0:3935) 4955 0 R (0:3936) 4956 0 R (0:3937) 4957 0 R (0:3938) 4958 0 R (0:3939) 4959 0 R (0:394) 1291 0 R (0:3940) 4960 0 R (0:3941) 4965 0 R (0:3942) 4966 0 R (0:3943) 4967 0 R (0:3944) 4968 0 R (0:3945) 4969 0 R (0:3946) 4970 0 R (0:3947) 4971 0 R (0:3948) 4972 0 R (0:3949) 4973 0 R (0:395) 1292 0 R (0:3950) 4974 0 R (0:3951) 4975 0 R (0:3952) 4976 0 R (0:3953) 4977 0 R (0:3954) 4978 0 R (0:3955) 4979 0 R (0:3956) 4980 0 R (0:3957) 4981 0 R (0:3958) 4982 0 R (0:3959) 4983 0 R (0:396) 1293 0 R (0:3960) 4984 0 R (0:3961) 4985 0 R (0:3962) 4986 0 R (0:3963) 4987 0 R (0:3964) 4988 0 R (0:3965) 4989 0 R (0:3966) 4990 0 R (0:3967) 4991 0 R (0:3968) 4992 0 R (0:3969) 4993 0 R (0:397) 1294 0 R (0:3970) 4994 0 R (0:3971) 4995 0 R (0:3972) 4996 0 R (0:3973) 4997 0 R (0:3974) 4998 0 R (0:3975) 4999 0 R (0:3976) 5000 0 R (0:3977) 5001 0 R (0:3978) 5002 0 R (0:3979) 5003 0 R (0:398) 1295 0 R (0:3980) 5004 0 R (0:3981) 5005 0 R (0:3982) 5006 0 R (0:3983) 5007 0 R (0:3984) 5008 0 R (0:3985) 5009 0 R (0:3986) 5010 0 R (0:3987) 5011 0 R (0:3988) 5012 0 R (0:3989) 5013 0 R (0:399) 1296 0 R (0:3990) 5014 0 R (0:3991) 5015 0 R (0:3992) 5016 0 R (0:3993) 5017 0 R (0:3994) 5018 0 R (0:3995) 5019 0 R (0:3996) 5020 0 R (0:3997) 5021 0 R (0:3998) 5022 0 R (0:3999) 5023 0 R (0:400) 1297 0 R (0:4000) 5024 0 R (0:4001) 5025 0 R (0:4002) 5026 0 R (0:4003) 5027 0 R (0:4004) 5028 0 R (0:4005) 5029 0 R (0:4006) 5030 0 R (0:4007) 5031 0 R (0:4008) 5032 0 R (0:4009) 5033 0 R (0:401) 1298 0 R (0:4010) 5039 0 R (0:4011) 5040 0 R (0:4012) 5041 0 R (0:4013) 5042 0 R (0:4014) 5043 0 R (0:4015) 5044 0 R (0:4016) 5045 0 R (0:4017) 5046 0 R (0:4018) 5047 0 R (0:4019) 5048 0 R (0:402) 1299 0 R (0:4020) 5049 0 R (0:4021) 5050 0 R (0:4022) 5051 0 R (0:4023) 5052 0 R (0:4024) 5053 0 R (0:4025) 5054 0 R (0:4026) 5055 0 R (0:4027) 5056 0 R (0:4028) 5057 0 R (0:4029) 5058 0 R (0:403) 1300 0 R (0:4030) 5059 0 R (0:4031) 5060 0 R (0:4032) 5061 0 R (0:4033) 5062 0 R (0:4034) 5063 0 R (0:4035) 5064 0 R (0:4036) 5065 0 R (0:4037) 5066 0 R (0:4038) 5067 0 R (0:4039) 5068 0 R (0:404) 1301 0 R (0:4040) 5069 0 R (0:4041) 5070 0 R (0:4042) 5071 0 R (0:4043) 5072 0 R (0:4044) 5073 0 R (0:4045) 5074 0 R (0:4046) 5075 0 R (0:4047) 5076 0 R (0:4048) 5077 0 R (0:4049) 5078 0 R (0:405) 1302 0 R (0:4050) 5079 0 R (0:4051) 5080 0 R (0:4052) 5081 0 R (0:4053) 5082 0 R (0:4054) 5083 0 R (0:4055) 5084 0 R (0:4056) 5085 0 R (0:4057) 5086 0 R (0:4058) 5087 0 R (0:4059) 5088 0 R (0:406) 1303 0 R (0:4060) 5089 0 R (0:4063) 5090 0 R (0:4064) 5091 0 R (0:4065) 5092 0 R (0:4066) 5093 0 R (0:4067) 5094 0 R (0:4068) 5095 0 R (0:4069) 5096 0 R (0:407) 1304 0 R (0:4070) 5101 0 R (0:4071) 5102 0 R (0:4072) 5103 0 R (0:4073) 5104 0 R (0:4074) 5105 0 R (0:4075) 5106 0 R (0:4076) 5107 0 R (0:4077) 5108 0 R (0:4078) 5109 0 R (0:4079) 5110 0 R (0:408) 1305 0 R (0:4080) 5111 0 R (0:4081) 5112 0 R (0:4082) 5113 0 R (0:4083) 5114 0 R (0:4084) 5115 0 R (0:4085) 5116 0 R (0:4086) 5117 0 R (0:4087) 5118 0 R (0:4088) 5119 0 R (0:4089) 5120 0 R (0:409) 1306 0 R (0:4090) 5121 0 R (0:4091) 5122 0 R (0:4092) 5123 0 R (0:4093) 5124 0 R (0:4094) 5125 0 R (0:4095) 5126 0 R (0:4096) 5127 0 R (0:4097) 5128 0 R (0:4098) 5129 0 R (0:4099) 5130 0 R (0:4100) 5131 0 R (0:4101) 5132 0 R (0:4102) 5133 0 R (0:4103) 5134 0 R (0:4104) 5135 0 R (0:4105) 5136 0 R (0:4106) 5137 0 R (0:4107) 5138 0 R (0:4108) 5139 0 R (0:4109) 5140 0 R (0:4110) 5141 0 R (0:4111) 5142 0 R (0:4112) 5143 0 R (0:4113) 5144 0 R (0:4114) 5145 0 R (0:4115) 5146 0 R (0:4116) 5147 0 R (0:4117) 5148 0 R (0:4118) 5149 0 R (0:4119) 5150 0 R (0:412) 1307 0 R (0:4120) 5151 0 R (0:4121) 5152 0 R (0:4122) 5153 0 R (0:4123) 5154 0 R (0:4124) 5155 0 R (0:4125) 5156 0 R (0:4126) 5157 0 R (0:4127) 5158 0 R (0:4128) 5159 0 R (0:4129) 5160 0 R (0:413) 1308 0 R (0:4130) 5161 0 R (0:4131) 5162 0 R (0:4132) 5163 0 R (0:4133) 5164 0 R (0:4134) 5165 0 R (0:4135) 5166 0 R (0:4136) 5167 0 R (0:4137) 5168 0 R (0:4138) 5169 0 R (0:4139) 5170 0 R (0:414) 1309 0 R (0:4140) 5175 0 R (0:4141) 5176 0 R (0:4142) 5177 0 R (0:4143) 5178 0 R (0:4144) 5179 0 R (0:4145) 5180 0 R (0:4146) 5181 0 R (0:4147) 5182 0 R (0:4148) 5183 0 R (0:4149) 5184 0 R (0:415) 1310 0 R (0:4150) 5185 0 R (0:4151) 5186 0 R (0:4152) 5187 0 R (0:4153) 5188 0 R (0:4154) 5189 0 R (0:4155) 5190 0 R (0:4156) 5191 0 R (0:4157) 5192 0 R (0:4158) 5193 0 R (0:4159) 5194 0 R (0:416) 1311 0 R (0:4160) 5195 0 R (0:4161) 5196 0 R (0:4162) 5197 0 R (0:4163) 5198 0 R (0:4164) 5199 0 R (0:4165) 5200 0 R (0:4166) 5201 0 R (0:4167) 5202 0 R (0:4168) 5203 0 R (0:4169) 5204 0 R (0:417) 1312 0 R (0:4170) 5205 0 R (0:4171) 5206 0 R (0:4172) 5207 0 R (0:4173) 5208 0 R (0:4174) 5209 0 R (0:4175) 5210 0 R (0:4176) 5211 0 R (0:4177) 5212 0 R (0:4178) 5213 0 R (0:4179) 5214 0 R (0:418) 1313 0 R (0:4180) 5215 0 R (0:4181) 5216 0 R (0:4182) 5217 0 R (0:4183) 5218 0 R (0:4184) 5219 0 R (0:4185) 5220 0 R (0:4186) 5221 0 R (0:4187) 5222 0 R (0:4188) 5223 0 R (0:4189) 5224 0 R (0:419) 1314 0 R (0:4190) 5225 0 R (0:4191) 5226 0 R (0:4192) 5227 0 R (0:4193) 5228 0 R (0:4194) 5229 0 R (0:4195) 5230 0 R (0:4196) 5231 0 R (0:4197) 5232 0 R (0:4198) 5233 0 R (0:4199) 5234 0 R (0:420) 1315 0 R (0:4200) 5235 0 R (0:4201) 5236 0 R (0:4202) 5237 0 R (0:4203) 5238 0 R (0:4204) 5239 0 R (0:4205) 5240 0 R (0:4206) 5241 0 R (0:4207) 5242 0 R (0:4208) 5243 0 R (0:4209) 5244 0 R (0:421) 1316 0 R (0:4210) 5245 0 R (0:4211) 5246 0 R (0:4212) 5247 0 R (0:4215) 5252 0 R (0:4216) 5253 0 R (0:4217) 5254 0 R (0:4218) 5255 0 R (0:4219) 5256 0 R (0:422) 1317 0 R (0:4220) 5257 0 R (0:4221) 5258 0 R (0:4222) 5259 0 R (0:4223) 5260 0 R (0:4224) 5261 0 R (0:4225) 5262 0 R (0:4226) 5263 0 R (0:4227) 5264 0 R (0:4228) 5265 0 R (0:4229) 5266 0 R (0:423) 1318 0 R (0:4230) 5267 0 R (0:4231) 5268 0 R (0:4232) 5269 0 R (0:4233) 5270 0 R (0:4234) 5271 0 R (0:4235) 5272 0 R (0:4236) 5273 0 R (0:4237) 5274 0 R (0:4238) 5275 0 R (0:4239) 5276 0 R (0:424) 1319 0 R (0:4240) 5277 0 R (0:4241) 5278 0 R (0:4242) 5279 0 R (0:4243) 5280 0 R (0:4244) 5281 0 R (0:4245) 5282 0 R (0:4246) 5283 0 R (0:4247) 5284 0 R (0:4248) 5285 0 R (0:4249) 5286 0 R (0:425) 1320 0 R (0:4250) 5287 0 R (0:4251) 5288 0 R (0:4252) 5289 0 R (0:4253) 5290 0 R (0:4254) 5291 0 R (0:4255) 5292 0 R (0:4256) 5293 0 R (0:4257) 5294 0 R (0:4258) 5295 0 R (0:4259) 5296 0 R (0:426) 1321 0 R (0:4260) 5297 0 R (0:4261) 5298 0 R (0:4262) 5299 0 R (0:4263) 5304 0 R (0:4264) 5305 0 R (0:4265) 5306 0 R (0:4266) 5307 0 R (0:4267) 5308 0 R (0:4268) 5309 0 R (0:4269) 5310 0 R (0:427) 1322 0 R (0:4270) 5311 0 R (0:4271) 5312 0 R (0:4274) 5313 0 R (0:4275) 5314 0 R (0:4276) 5315 0 R (0:4277) 5316 0 R (0:4278) 5317 0 R (0:4279) 5318 0 R (0:428) 1323 0 R (0:4280) 5319 0 R (0:4281) 5320 0 R (0:4282) 5321 0 R (0:4283) 5322 0 R (0:4284) 5323 0 R (0:4285) 5324 0 R (0:4286) 5325 0 R (0:4287) 5326 0 R (0:4288) 5327 0 R (0:4289) 5328 0 R (0:429) 1324 0 R (0:4290) 5329 0 R (0:4291) 5330 0 R (0:4292) 5331 0 R (0:4293) 5332 0 R (0:4294) 5333 0 R (0:4295) 5334 0 R (0:4298) 5335 0 R (0:4299) 5336 0 R (0:43) 941 0 R (0:430) 1325 0 R (0:4300) 5337 0 R (0:4301) 5338 0 R (0:4302) 5339 0 R (0:4303) 5344 0 R (0:4304) 5345 0 R (0:4305) 5346 0 R (0:4306) 5347 0 R (0:4307) 5348 0 R (0:4308) 5349 0 R (0:4309) 5350 0 R (0:431) 1326 0 R (0:4310) 5351 0 R (0:4311) 5352 0 R (0:4312) 5353 0 R (0:4313) 5354 0 R (0:4314) 5355 0 R (0:4315) 5356 0 R (0:4316) 5357 0 R (0:4317) 5358 0 R (0:4318) 5359 0 R (0:4319) 5360 0 R (0:432) 1327 0 R (0:4320) 5361 0 R (0:4321) 5362 0 R (0:4322) 5363 0 R (0:4323) 5364 0 R (0:4324) 5365 0 R (0:4325) 5366 0 R (0:4326) 5367 0 R (0:4327) 5368 0 R (0:4328) 5369 0 R (0:4329) 5370 0 R (0:433) 1328 0 R (0:4330) 5371 0 R (0:4331) 5372 0 R (0:4332) 5373 0 R (0:4333) 5374 0 R (0:4334) 5375 0 R (0:4335) 5376 0 R (0:4336) 5377 0 R (0:4337) 5378 0 R (0:4338) 5379 0 R (0:4339) 5380 0 R (0:434) 1329 0 R (0:4340) 5381 0 R (0:4341) 5382 0 R (0:4342) 5383 0 R (0:4343) 5384 0 R (0:4344) 5385 0 R (0:4345) 5386 0 R (0:4346) 5387 0 R (0:4347) 5388 0 R (0:4348) 5389 0 R (0:4349) 5390 0 R (0:435) 1330 0 R (0:4350) 5391 0 R (0:4351) 5392 0 R (0:4352) 5393 0 R (0:4353) 5394 0 R (0:4354) 5395 0 R (0:4355) 5396 0 R (0:4356) 5397 0 R (0:4357) 5398 0 R (0:4358) 5399 0 R (0:4359) 5400 0 R (0:436) 1331 0 R (0:4360) 5401 0 R (0:4361) 5402 0 R (0:4362) 5403 0 R (0:4363) 5404 0 R (0:4364) 5405 0 R (0:4365) 5406 0 R (0:4366) 5407 0 R (0:4367) 5408 0 R (0:4368) 5409 0 R (0:4369) 5416 0 R (0:437) 1336 0 R (0:4370) 5417 0 R (0:4371) 5418 0 R (0:4372) 5419 0 R (0:4373) 5420 0 R (0:4374) 5421 0 R (0:4375) 5422 0 R (0:4376) 5423 0 R (0:4377) 5424 0 R (0:4378) 5425 0 R (0:4379) 5426 0 R (0:4380) 5427 0 R (0:4381) 5428 0 R (0:4382) 5429 0 R (0:4383) 5430 0 R (0:4384) 5431 0 R (0:4385) 5432 0 R (0:4386) 5433 0 R (0:4387) 5434 0 R (0:4388) 5435 0 R (0:4389) 5436 0 R (0:4390) 5437 0 R (0:4391) 5438 0 R (0:4392) 5439 0 R (0:4393) 5440 0 R (0:4394) 5441 0 R (0:4395) 5442 0 R (0:4396) 5443 0 R (0:4397) 5444 0 R (0:4398) 5445 0 R (0:4399) 5446 0 R (0:44) 942 0 R (0:440) 1337 0 R (0:4400) 5447 0 R (0:4401) 5448 0 R (0:4402) 5449 0 R (0:4403) 5450 0 R (0:4404) 5451 0 R (0:4405) 5452 0 R (0:4406) 5453 0 R (0:4407) 5454 0 R (0:4408) 5455 0 R (0:4409) 5456 0 R (0:441) 1338 0 R (0:4410) 5457 0 R (0:4411) 5458 0 R (0:4412) 5459 0 R (0:4413) 5460 0 R (0:4414) 5461 0 R (0:4415) 5462 0 R (0:4416) 5463 0 R (0:4417) 5464 0 R (0:4418) 5465 0 R (0:4419) 5466 0 R (0:442) 1339 0 R (0:4420) 5467 0 R (0:4421) 5468 0 R (0:4422) 5469 0 R (0:4423) 5470 0 R (0:4424) 5471 0 R (0:4425) 5472 0 R (0:4428) 5477 0 R (0:4429) 5478 0 R (0:443) 1340 0 R (0:4430) 5479 0 R (0:4431) 5415 0 R (0:4434) 5480 0 R (0:4435) 5481 0 R (0:4436) 5482 0 R (0:4437) 5483 0 R (0:4438) 5484 0 R (0:4439) 5485 0 R (0:444) 1341 0 R (0:4440) 5486 0 R (0:4441) 5487 0 R (0:4442) 5488 0 R (0:4443) 5489 0 R (0:4444) 5490 0 R (0:4445) 5491 0 R (0:4446) 5492 0 R (0:4447) 5493 0 R (0:4448) 5494 0 R (0:4449) 5495 0 R (0:445) 1342 0 R (0:4450) 5496 0 R (0:4451) 5497 0 R (0:4452) 5498 0 R (0:4453) 5499 0 R (0:4454) 5500 0 R (0:4455) 5501 0 R (0:4456) 5502 0 R (0:4457) 5503 0 R (0:4458) 5504 0 R (0:4459) 5505 0 R (0:446) 1343 0 R (0:4460) 5506 0 R (0:4461) 5507 0 R (0:4462) 5508 0 R (0:4463) 5509 0 R (0:4464) 5510 0 R (0:4465) 5511 0 R (0:4466) 5512 0 R (0:4467) 5513 0 R (0:4468) 5514 0 R (0:4469) 5515 0 R (0:447) 1344 0 R (0:4470) 5516 0 R (0:4471) 5517 0 R (0:4472) 5518 0 R (0:4473) 5519 0 R (0:4474) 5520 0 R (0:4475) 5521 0 R (0:4476) 5522 0 R (0:4477) 5523 0 R (0:4478) 5524 0 R (0:4479) 5525 0 R (0:448) 1345 0 R (0:4480) 5526 0 R (0:4481) 5527 0 R (0:4482) 5528 0 R (0:4483) 5529 0 R (0:4484) 5534 0 R (0:4485) 5535 0 R (0:4486) 5536 0 R (0:4487) 5537 0 R (0:4488) 5538 0 R (0:4489) 5539 0 R (0:449) 1346 0 R (0:4490) 5540 0 R (0:4491) 5541 0 R (0:4492) 5542 0 R (0:4493) 5543 0 R (0:4494) 5544 0 R (0:4495) 5545 0 R (0:4496) 5546 0 R (0:4497) 5547 0 R (0:4498) 5548 0 R (0:4499) 5549 0 R (0:450) 1347 0 R (0:4500) 5550 0 R (0:4501) 5551 0 R (0:4502) 5552 0 R (0:4503) 5553 0 R (0:4504) 5554 0 R (0:4505) 5555 0 R (0:4506) 5556 0 R (0:4507) 5557 0 R (0:4508) 5558 0 R (0:4509) 5559 0 R (0:451) 1348 0 R (0:4510) 5560 0 R (0:4511) 5561 0 R (0:4512) 5562 0 R (0:4513) 5563 0 R (0:4514) 5564 0 R (0:4515) 5565 0 R (0:4516) 5566 0 R (0:4517) 5567 0 R (0:4518) 5568 0 R (0:4519) 5569 0 R (0:452) 1349 0 R (0:4520) 5570 0 R (0:4521) 5571 0 R (0:4522) 5572 0 R (0:4523) 5573 0 R (0:4524) 5574 0 R (0:4525) 5575 0 R (0:4526) 5576 0 R (0:4527) 5577 0 R (0:4528) 5578 0 R (0:4529) 5579 0 R (0:453) 1350 0 R (0:4530) 5580 0 R (0:4531) 5581 0 R (0:4532) 5582 0 R (0:4533) 5583 0 R (0:4534) 5584 0 R (0:4535) 5585 0 R (0:4536) 5586 0 R (0:4537) 5587 0 R (0:4538) 5588 0 R (0:4539) 5589 0 R (0:454) 1351 0 R (0:4540) 5590 0 R (0:4541) 5591 0 R (0:4542) 5592 0 R (0:4543) 5593 0 R (0:4544) 5594 0 R (0:4545) 5595 0 R (0:4546) 5596 0 R (0:4547) 5597 0 R (0:4548) 5598 0 R (0:4549) 5599 0 R (0:455) 1352 0 R (0:4550) 5600 0 R (0:4551) 5601 0 R (0:4552) 5602 0 R (0:4553) 5603 0 R (0:4554) 5608 0 R (0:4555) 5609 0 R (0:4556) 5610 0 R (0:4557) 5611 0 R (0:4558) 5612 0 R (0:4559) 5613 0 R (0:456) 1353 0 R (0:4560) 5614 0 R (0:4561) 5615 0 R (0:4562) 5616 0 R (0:4563) 5617 0 R (0:4564) 5618 0 R (0:4565) 5619 0 R (0:4566) 5620 0 R (0:4567) 5621 0 R (0:4568) 5622 0 R (0:4569) 5623 0 R (0:457) 1354 0 R (0:4570) 5624 0 R (0:4571) 5625 0 R (0:4572) 5626 0 R (0:4573) 5627 0 R (0:4574) 5628 0 R (0:4575) 5629 0 R (0:4576) 5630 0 R (0:4577) 5631 0 R (0:4578) 5632 0 R (0:4579) 5633 0 R (0:458) 1355 0 R (0:4580) 5634 0 R (0:4581) 5635 0 R (0:4582) 5636 0 R (0:4583) 5637 0 R (0:4584) 5638 0 R (0:4585) 5639 0 R (0:4586) 5640 0 R (0:4587) 5641 0 R (0:4588) 5642 0 R (0:4589) 5643 0 R (0:459) 1356 0 R (0:4590) 5644 0 R (0:4591) 5645 0 R (0:4592) 5646 0 R (0:4593) 5647 0 R (0:4594) 5648 0 R (0:4595) 5649 0 R (0:4596) 5650 0 R (0:4597) 5651 0 R (0:4598) 5652 0 R (0:4599) 5653 0 R (0:460) 1357 0 R (0:4600) 5654 0 R (0:4601) 5655 0 R (0:4602) 5656 0 R (0:4603) 5657 0 R (0:4604) 5658 0 R (0:4605) 5659 0 R (0:4606) 5660 0 R (0:4607) 5661 0 R (0:4608) 5662 0 R (0:4609) 5663 0 R (0:461) 1358 0 R (0:4610) 5664 0 R (0:4611) 5665 0 R (0:4612) 5666 0 R (0:4613) 5667 0 R (0:4614) 5668 0 R (0:4615) 5669 0 R (0:4616) 5670 0 R (0:4617) 5671 0 R (0:4618) 5672 0 R (0:4619) 5673 0 R (0:462) 1359 0 R (0:4620) 5674 0 R (0:4621) 5675 0 R (0:4622) 5680 0 R (0:4623) 5681 0 R (0:4624) 5682 0 R (0:4625) 5683 0 R (0:4626) 5684 0 R (0:4627) 5685 0 R (0:4628) 5686 0 R (0:4629) 5687 0 R (0:463) 1360 0 R (0:4630) 5688 0 R (0:4631) 5689 0 R (0:4632) 5690 0 R (0:4633) 5691 0 R (0:4634) 5692 0 R (0:4635) 5693 0 R (0:4636) 5694 0 R (0:4637) 5695 0 R (0:4638) 5696 0 R (0:4639) 5697 0 R (0:464) 1361 0 R (0:4640) 5698 0 R (0:4641) 5699 0 R (0:4642) 5700 0 R (0:4643) 5701 0 R (0:4644) 5702 0 R (0:4645) 5703 0 R (0:4646) 5704 0 R (0:4647) 5705 0 R (0:4648) 5706 0 R (0:4649) 5707 0 R (0:465) 1362 0 R (0:4650) 5708 0 R (0:4651) 5709 0 R (0:4652) 5710 0 R (0:4653) 5711 0 R (0:4654) 5712 0 R (0:4655) 5713 0 R (0:4656) 5714 0 R (0:4657) 5715 0 R (0:4658) 5716 0 R (0:4659) 5717 0 R (0:4660) 5718 0 R (0:4661) 5719 0 R (0:4662) 5720 0 R (0:4663) 5721 0 R (0:4664) 5722 0 R (0:4665) 5723 0 R (0:4666) 5724 0 R (0:4667) 5725 0 R (0:4668) 5726 0 R (0:4671) 5727 0 R (0:4672) 5728 0 R (0:4673) 5729 0 R (0:4674) 5730 0 R (0:4675) 5731 0 R (0:4676) 5732 0 R (0:4677) 5733 0 R (0:4678) 5734 0 R (0:4679) 5735 0 R (0:468) 1363 0 R (0:4680) 5736 0 R (0:4681) 5737 0 R (0:4682) 5738 0 R (0:4683) 5743 0 R (0:4684) 5744 0 R (0:4685) 5745 0 R (0:4686) 5746 0 R (0:4687) 5747 0 R (0:4688) 5748 0 R (0:4689) 5749 0 R (0:469) 1364 0 R (0:4690) 5750 0 R (0:4691) 5751 0 R (0:4692) 5752 0 R (0:4693) 5753 0 R (0:4694) 5754 0 R (0:4695) 5755 0 R (0:4696) 5756 0 R (0:4697) 5757 0 R (0:4698) 5758 0 R (0:4699) 5759 0 R (0:470) 1365 0 R (0:4702) 5760 0 R (0:4703) 5761 0 R (0:4704) 5762 0 R (0:4705) 5763 0 R (0:4706) 5764 0 R (0:4707) 5765 0 R (0:4708) 5766 0 R (0:4709) 5767 0 R (0:471) 1366 0 R (0:4710) 5768 0 R (0:4711) 5769 0 R (0:4712) 5770 0 R (0:4713) 5771 0 R (0:4714) 5772 0 R (0:4715) 5773 0 R (0:4716) 5774 0 R (0:4717) 5775 0 R (0:4718) 5776 0 R (0:4719) 5777 0 R (0:472) 1367 0 R (0:4720) 5778 0 R (0:4721) 5779 0 R (0:4722) 5780 0 R (0:4723) 5781 0 R (0:4726) 5782 0 R (0:4727) 5783 0 R (0:4728) 5784 0 R (0:4729) 5790 0 R (0:473) 1368 0 R (0:4730) 5791 0 R (0:4731) 5792 0 R (0:4732) 5793 0 R (0:4733) 5794 0 R (0:4734) 5795 0 R (0:4735) 5796 0 R (0:4736) 5797 0 R (0:4737) 5798 0 R (0:4738) 5799 0 R (0:4739) 5800 0 R (0:474) 1369 0 R (0:4740) 5801 0 R (0:4741) 5802 0 R (0:4742) 5803 0 R (0:4743) 5804 0 R (0:4744) 5805 0 R (0:4745) 5806 0 R (0:4746) 5807 0 R (0:4747) 5808 0 R (0:4748) 5809 0 R (0:4749) 5810 0 R (0:475) 1374 0 R (0:4750) 5811 0 R (0:4751) 5812 0 R (0:4752) 5813 0 R (0:4753) 5814 0 R (0:4754) 5815 0 R (0:4755) 5816 0 R (0:4756) 5817 0 R (0:4757) 5818 0 R (0:4758) 5819 0 R (0:4759) 5820 0 R (0:476) 1375 0 R (0:4760) 5821 0 R (0:4761) 5822 0 R (0:4762) 5823 0 R (0:4763) 5824 0 R (0:4764) 5825 0 R (0:4765) 5826 0 R (0:4766) 5827 0 R (0:4767) 5828 0 R (0:4768) 5829 0 R (0:4769) 5830 0 R (0:477) 1376 0 R (0:4770) 5831 0 R (0:4771) 5832 0 R (0:4772) 5833 0 R (0:4773) 5834 0 R (0:4774) 5835 0 R (0:4775) 5836 0 R (0:4776) 5837 0 R (0:4777) 5838 0 R (0:4778) 5839 0 R (0:4779) 5840 0 R (0:478) 1377 0 R (0:4780) 5841 0 R (0:4781) 5842 0 R (0:4782) 5843 0 R (0:4783) 5844 0 R (0:4784) 5845 0 R (0:4785) 5846 0 R (0:4786) 5847 0 R (0:4787) 5848 0 R (0:4788) 5849 0 R (0:4789) 5850 0 R (0:479) 1378 0 R (0:4790) 5851 0 R (0:4791) 5852 0 R (0:4792) 5853 0 R (0:4793) 5854 0 R (0:4794) 5855 0 R (0:4795) 5860 0 R (0:4796) 5861 0 R (0:4797) 5862 0 R (0:4798) 5863 0 R (0:4799) 5864 0 R (0:48) 946 0 R (0:480) 1379 0 R (0:4800) 5865 0 R (0:4801) 5866 0 R (0:4802) 5867 0 R (0:4803) 5868 0 R (0:4804) 5869 0 R (0:4805) 5870 0 R (0:4806) 5871 0 R (0:4807) 5872 0 R (0:4808) 5873 0 R (0:4809) 5874 0 R (0:481) 1380 0 R (0:4810) 5875 0 R (0:4811) 5876 0 R (0:4812) 5877 0 R (0:4813) 5878 0 R (0:4814) 5879 0 R (0:4815) 5880 0 R (0:4816) 5881 0 R (0:4817) 5882 0 R (0:4818) 5883 0 R (0:4819) 5884 0 R (0:482) 1381 0 R (0:4820) 5885 0 R (0:4821) 5886 0 R (0:4822) 5887 0 R (0:4823) 5888 0 R (0:4824) 5889 0 R (0:4825) 5890 0 R (0:4826) 5891 0 R (0:4827) 5892 0 R (0:4828) 5893 0 R (0:4829) 5894 0 R (0:483) 1382 0 R (0:4830) 5895 0 R (0:4831) 5896 0 R (0:4832) 5897 0 R (0:4833) 5898 0 R (0:4834) 5899 0 R (0:4835) 5900 0 R (0:4836) 5901 0 R (0:4837) 5902 0 R (0:4838) 5903 0 R (0:4839) 5904 0 R (0:484) 1383 0 R (0:4840) 5905 0 R (0:4841) 5906 0 R (0:4842) 5907 0 R (0:4843) 5908 0 R (0:4844) 5909 0 R (0:4845) 5910 0 R (0:4846) 5911 0 R (0:4847) 5912 0 R (0:4848) 5913 0 R (0:4849) 5914 0 R (0:485) 1384 0 R (0:4850) 5915 0 R (0:4851) 5916 0 R (0:4852) 5917 0 R (0:4853) 5918 0 R (0:4854) 5919 0 R (0:4855) 5920 0 R (0:4856) 5921 0 R (0:4857) 5922 0 R (0:4858) 5923 0 R (0:4859) 5924 0 R (0:486) 1385 0 R (0:4860) 5925 0 R (0:4861) 5926 0 R (0:4862) 5927 0 R (0:4863) 5932 0 R (0:4864) 5933 0 R (0:4865) 5934 0 R (0:4866) 5935 0 R (0:4867) 5936 0 R (0:4868) 5937 0 R (0:4869) 5938 0 R (0:487) 1386 0 R (0:4870) 5939 0 R (0:4871) 5940 0 R (0:4872) 5941 0 R (0:4873) 5942 0 R (0:4874) 5943 0 R (0:4875) 5944 0 R (0:4876) 5945 0 R (0:4877) 5946 0 R (0:4878) 5947 0 R (0:4879) 5948 0 R (0:488) 1387 0 R (0:4880) 5949 0 R (0:4881) 5950 0 R (0:4882) 5951 0 R (0:4883) 5952 0 R (0:4884) 5953 0 R (0:4885) 5954 0 R (0:4886) 5955 0 R (0:4887) 5956 0 R (0:4888) 5957 0 R (0:4889) 5958 0 R (0:489) 1388 0 R (0:4890) 5959 0 R (0:4891) 5960 0 R (0:4892) 5961 0 R (0:4893) 5962 0 R (0:4894) 5963 0 R (0:4895) 5964 0 R (0:4896) 5965 0 R (0:4897) 5966 0 R (0:4898) 5967 0 R (0:4899) 5968 0 R (0:49) 947 0 R (0:490) 1389 0 R (0:4900) 5969 0 R (0:4901) 5970 0 R (0:4902) 5971 0 R (0:4903) 5972 0 R (0:4904) 5973 0 R (0:4905) 5974 0 R (0:4906) 5975 0 R (0:4907) 5976 0 R (0:4908) 5977 0 R (0:4909) 5978 0 R (0:491) 1390 0 R (0:4910) 5979 0 R (0:4911) 5980 0 R (0:4912) 5981 0 R (0:4913) 5982 0 R (0:4914) 5983 0 R (0:4915) 5984 0 R (0:4916) 5985 0 R (0:4917) 5986 0 R (0:4918) 5987 0 R (0:4919) 5988 0 R (0:492) 1391 0 R (0:4920) 5989 0 R (0:4921) 5990 0 R (0:4922) 5991 0 R (0:4923) 5992 0 R (0:4924) 5993 0 R (0:4925) 5994 0 R (0:4926) 5995 0 R (0:4927) 5996 0 R (0:4928) 5997 0 R (0:4929) 5998 0 R (0:493) 1392 0 R (0:4930) 5999 0 R (0:4931) 6000 0 R (0:4932) 6001 0 R (0:4933) 6002 0 R (0:4934) 6003 0 R (0:4935) 6004 0 R (0:4936) 6009 0 R (0:4937) 6010 0 R (0:4938) 6011 0 R (0:4939) 6012 0 R (0:494) 1393 0 R (0:4940) 6013 0 R (0:4941) 6014 0 R (0:4942) 6015 0 R (0:4943) 6016 0 R (0:4944) 6017 0 R (0:4945) 6018 0 R (0:4946) 6019 0 R (0:4947) 6020 0 R (0:4948) 6021 0 R (0:4949) 6022 0 R (0:495) 1394 0 R (0:4950) 6023 0 R (0:4951) 6024 0 R (0:4952) 6025 0 R (0:4953) 6026 0 R (0:4954) 6027 0 R (0:4955) 6028 0 R (0:4956) 6029 0 R (0:4957) 6030 0 R (0:4958) 6031 0 R (0:4959) 6032 0 R (0:496) 1395 0 R (0:4960) 6033 0 R (0:4961) 6034 0 R (0:4962) 6035 0 R (0:4963) 6036 0 R (0:4966) 6037 0 R (0:4967) 6038 0 R (0:4968) 6039 0 R (0:4969) 6040 0 R (0:497) 1396 0 R (0:4970) 6041 0 R (0:4971) 6042 0 R (0:4972) 6043 0 R (0:4973) 6044 0 R (0:4974) 6045 0 R (0:4975) 6046 0 R (0:4976) 6047 0 R (0:4977) 6048 0 R (0:4978) 6049 0 R (0:4979) 6050 0 R (0:498) 1397 0 R (0:4980) 6051 0 R (0:4981) 6052 0 R (0:4982) 6053 0 R (0:4983) 6054 0 R (0:4984) 6055 0 R (0:4985) 6056 0 R (0:4986) 6057 0 R (0:4987) 6058 0 R (0:4988) 6059 0 R (0:4989) 6060 0 R (0:499) 1398 0 R (0:4990) 6065 0 R (0:4991) 6066 0 R (0:4992) 6067 0 R (0:4993) 6068 0 R (0:4994) 6069 0 R (0:4995) 6070 0 R (0:4996) 6071 0 R (0:4997) 6072 0 R (0:4998) 6073 0 R (0:4999) 6074 0 R (0:5) 916 0 R (0:500) 1399 0 R (0:5000) 6075 0 R (0:5001) 6076 0 R (0:5002) 6077 0 R (0:5003) 6078 0 R (0:5004) 6079 0 R (0:5005) 6080 0 R (0:5006) 6081 0 R (0:5007) 6082 0 R (0:5008) 6083 0 R (0:5009) 6084 0 R (0:5010) 6085 0 R (0:5011) 6086 0 R (0:5012) 6087 0 R (0:5013) 6088 0 R (0:5014) 6089 0 R (0:5015) 6090 0 R (0:5016) 6091 0 R (0:5017) 6092 0 R (0:5018) 6093 0 R (0:5019) 6094 0 R (0:5020) 6095 0 R (0:5021) 6096 0 R (0:5022) 6097 0 R (0:5023) 6098 0 R (0:5024) 6099 0 R (0:5025) 6100 0 R (0:5026) 6101 0 R (0:5027) 6102 0 R (0:5028) 6103 0 R (0:5029) 6104 0 R (0:503) 1400 0 R (0:5030) 6105 0 R (0:5031) 6106 0 R (0:5032) 6107 0 R (0:5033) 6108 0 R (0:5034) 6109 0 R (0:5035) 6110 0 R (0:5036) 6111 0 R (0:5037) 6112 0 R (0:5038) 6113 0 R (0:5039) 6114 0 R (0:504) 1401 0 R (0:5040) 6115 0 R (0:5041) 6116 0 R (0:5042) 6117 0 R (0:5043) 6118 0 R (0:5044) 6119 0 R (0:5045) 6120 0 R (0:5046) 6121 0 R (0:5047) 6122 0 R (0:5048) 6123 0 R (0:5049) 6124 0 R (0:505) 1402 0 R (0:5050) 6125 0 R (0:5051) 6126 0 R (0:5052) 6127 0 R (0:5053) 6128 0 R (0:5054) 6129 0 R (0:5055) 6130 0 R (0:5056) 6131 0 R (0:5057) 6132 0 R (0:5058) 6137 0 R (0:5059) 6138 0 R (0:506) 1403 0 R (0:5060) 6139 0 R (0:5061) 6140 0 R (0:5062) 6141 0 R (0:5063) 6142 0 R (0:5064) 6143 0 R (0:5065) 6144 0 R (0:5066) 6145 0 R (0:5067) 6146 0 R (0:5068) 6147 0 R (0:5069) 6148 0 R (0:507) 1404 0 R (0:5070) 6149 0 R (0:5071) 6150 0 R (0:5072) 6151 0 R (0:5073) 6152 0 R (0:5074) 6153 0 R (0:5075) 6154 0 R (0:5076) 6155 0 R (0:5077) 6156 0 R (0:5078) 6157 0 R (0:5079) 6158 0 R (0:508) 1405 0 R (0:5080) 6159 0 R (0:5081) 6160 0 R (0:5082) 6161 0 R (0:5083) 6162 0 R (0:5084) 6163 0 R (0:5085) 6164 0 R (0:5086) 6165 0 R (0:5087) 6166 0 R (0:5088) 6167 0 R (0:5089) 6168 0 R (0:509) 1406 0 R (0:5090) 6169 0 R (0:5091) 6170 0 R (0:5092) 6171 0 R (0:5095) 6172 0 R (0:5096) 6173 0 R (0:5097) 6174 0 R (0:5098) 6175 0 R (0:5099) 6176 0 R (0:510) 1407 0 R (0:5100) 6177 0 R (0:5101) 6178 0 R (0:5102) 6179 0 R (0:5103) 6180 0 R (0:5104) 6181 0 R (0:5105) 6182 0 R (0:5106) 6183 0 R (0:5107) 6184 0 R (0:5108) 6185 0 R (0:5109) 6186 0 R (0:511) 1408 0 R (0:5110) 6187 0 R (0:5111) 6188 0 R (0:5112) 6189 0 R (0:5113) 6190 0 R (0:5114) 6196 0 R (0:5115) 6197 0 R (0:5116) 6198 0 R (0:5117) 6199 0 R (0:5118) 6200 0 R (0:5119) 6201 0 R (0:512) 1409 0 R (0:5120) 6202 0 R (0:5121) 6203 0 R (0:5122) 6204 0 R (0:5123) 6205 0 R (0:5124) 6206 0 R (0:5125) 6207 0 R (0:5126) 6208 0 R (0:5127) 6209 0 R (0:5128) 6210 0 R (0:5129) 6211 0 R (0:513) 1410 0 R (0:5130) 6212 0 R (0:5131) 6213 0 R (0:5132) 6214 0 R (0:5133) 6215 0 R (0:5134) 6216 0 R (0:5135) 6217 0 R (0:5136) 6218 0 R (0:5137) 6219 0 R (0:5138) 6220 0 R (0:5139) 6221 0 R (0:514) 1411 0 R (0:5140) 6222 0 R (0:5141) 6223 0 R (0:5142) 6224 0 R (0:5143) 6225 0 R (0:5144) 6226 0 R (0:5145) 6227 0 R (0:5146) 6228 0 R (0:5147) 6229 0 R (0:5148) 6230 0 R (0:5149) 6231 0 R (0:515) 1417 0 R (0:5150) 6232 0 R (0:5151) 6233 0 R (0:5152) 6234 0 R (0:5153) 6235 0 R (0:5154) 6236 0 R (0:5155) 6237 0 R (0:5156) 6238 0 R (0:5157) 6239 0 R (0:5158) 6240 0 R (0:5159) 6241 0 R (0:516) 1418 0 R (0:5160) 6242 0 R (0:5161) 6243 0 R (0:5162) 6244 0 R (0:5163) 6245 0 R (0:5164) 6246 0 R (0:5165) 6247 0 R (0:5166) 6248 0 R (0:5167) 6249 0 R (0:5168) 6250 0 R (0:5169) 6251 0 R (0:517) 1419 0 R (0:5170) 6252 0 R (0:5171) 6253 0 R (0:5172) 6254 0 R (0:5173) 6255 0 R (0:5174) 6256 0 R (0:5175) 6257 0 R (0:5176) 6258 0 R (0:5177) 6259 0 R (0:5178) 6260 0 R (0:5179) 6261 0 R (0:518) 1420 0 R (0:5180) 6262 0 R (0:5181) 6263 0 R (0:5184) 6268 0 R (0:5185) 6269 0 R (0:5186) 6270 0 R (0:5187) 6271 0 R (0:5188) 6272 0 R (0:5189) 6273 0 R (0:519) 1421 0 R (0:5190) 6274 0 R (0:5191) 6275 0 R (0:5192) 6276 0 R (0:5193) 6277 0 R (0:5194) 6278 0 R (0:5195) 6279 0 R (0:5196) 6280 0 R (0:5197) 6281 0 R (0:5198) 6282 0 R (0:5199) 6283 0 R (0:520) 1422 0 R (0:5200) 6284 0 R (0:5201) 6285 0 R (0:5202) 6286 0 R (0:5203) 6287 0 R (0:5204) 6288 0 R (0:5205) 6289 0 R (0:5208) 6290 0 R (0:5209) 6291 0 R (0:521) 1423 0 R (0:5210) 6292 0 R (0:5211) 6293 0 R (0:5212) 6294 0 R (0:5213) 6295 0 R (0:5214) 6296 0 R (0:5215) 6297 0 R (0:5216) 6298 0 R (0:5217) 6299 0 R (0:5218) 6304 0 R (0:5219) 6305 0 R (0:522) 1424 0 R (0:5220) 6306 0 R (0:5221) 6307 0 R (0:5222) 6308 0 R (0:5223) 6309 0 R (0:5224) 6310 0 R (0:5225) 6311 0 R (0:5226) 6312 0 R (0:5227) 6313 0 R (0:5228) 6314 0 R (0:5229) 6315 0 R (0:523) 1425 0 R (0:5230) 6316 0 R (0:5231) 6317 0 R (0:5232) 6318 0 R (0:5233) 6319 0 R (0:5234) 6320 0 R (0:5235) 6321 0 R (0:5236) 6322 0 R (0:5237) 6323 0 R (0:5238) 6324 0 R (0:5239) 6325 0 R (0:524) 1426 0 R (0:5240) 6326 0 R (0:5241) 6327 0 R (0:5242) 6328 0 R (0:5243) 6329 0 R (0:5244) 6330 0 R (0:5245) 6331 0 R (0:5246) 6332 0 R (0:5247) 6333 0 R (0:5248) 6334 0 R (0:5249) 6335 0 R (0:525) 1427 0 R (0:5250) 6336 0 R (0:5251) 6337 0 R (0:5252) 6338 0 R (0:5253) 6339 0 R (0:5254) 6340 0 R (0:5255) 6341 0 R (0:5256) 6342 0 R (0:5257) 6343 0 R (0:5258) 6344 0 R (0:5259) 6345 0 R (0:526) 1428 0 R (0:5260) 6346 0 R (0:5261) 6347 0 R (0:5262) 6348 0 R (0:5263) 6349 0 R (0:5264) 6350 0 R (0:5265) 6351 0 R (0:5266) 6352 0 R (0:5267) 6353 0 R (0:5268) 6354 0 R (0:5269) 6355 0 R (0:527) 1429 0 R (0:5270) 6356 0 R (0:5271) 6357 0 R (0:5272) 6358 0 R (0:5273) 6359 0 R (0:5274) 6360 0 R (0:5275) 6361 0 R (0:5276) 6362 0 R (0:5277) 6363 0 R (0:5278) 6364 0 R (0:5279) 6365 0 R (0:528) 1430 0 R (0:5280) 6366 0 R (0:5281) 6367 0 R (0:5282) 6368 0 R (0:5283) 6369 0 R (0:5284) 6370 0 R (0:5285) 6371 0 R (0:5286) 6372 0 R (0:5287) 6373 0 R (0:5288) 6374 0 R (0:5289) 6375 0 R (0:529) 1431 0 R (0:5290) 6380 0 R (0:5291) 6381 0 R (0:5292) 6382 0 R (0:5293) 6383 0 R (0:5294) 6384 0 R (0:5295) 6385 0 R (0:5296) 6386 0 R (0:5297) 6387 0 R (0:5298) 6388 0 R (0:5299) 6389 0 R (0:530) 1432 0 R (0:5300) 6390 0 R (0:5301) 6391 0 R (0:5302) 6392 0 R (0:5303) 6393 0 R (0:5304) 6394 0 R (0:5305) 6395 0 R (0:5306) 6396 0 R (0:5307) 6397 0 R (0:5308) 6398 0 R (0:5309) 6399 0 R (0:531) 1433 0 R (0:5310) 6400 0 R (0:5311) 6401 0 R (0:5312) 6402 0 R (0:5313) 6403 0 R (0:5314) 6404 0 R (0:5315) 6405 0 R (0:5316) 6406 0 R (0:5317) 6407 0 R (0:5318) 6408 0 R (0:5319) 6409 0 R (0:532) 1434 0 R (0:5320) 6410 0 R (0:5321) 6411 0 R (0:5322) 6412 0 R (0:5323) 6413 0 R (0:5324) 6414 0 R (0:5325) 6415 0 R (0:5326) 6416 0 R (0:5327) 6417 0 R (0:5328) 6418 0 R (0:5329) 6419 0 R (0:533) 1435 0 R (0:5330) 6420 0 R (0:5331) 6421 0 R (0:5332) 6422 0 R (0:5333) 6423 0 R (0:5334) 6424 0 R (0:5335) 6425 0 R (0:5336) 6426 0 R (0:5337) 6427 0 R (0:5338) 6428 0 R (0:5339) 6429 0 R (0:534) 1436 0 R (0:5340) 6430 0 R (0:5341) 6431 0 R (0:5342) 6432 0 R (0:5343) 6433 0 R (0:5344) 6434 0 R (0:5345) 6435 0 R (0:5346) 6436 0 R (0:5347) 6437 0 R (0:5348) 6438 0 R (0:5349) 6439 0 R (0:535) 1437 0 R (0:5350) 6440 0 R (0:5351) 6441 0 R (0:5352) 6442 0 R (0:5353) 6443 0 R (0:5354) 6444 0 R (0:5355) 6445 0 R (0:5356) 6446 0 R (0:5357) 6447 0 R (0:5358) 6448 0 R (0:5359) 6454 0 R (0:536) 1438 0 R (0:5360) 6455 0 R (0:5361) 6456 0 R (0:5362) 6457 0 R (0:5363) 6458 0 R (0:5364) 6459 0 R (0:5365) 6460 0 R (0:5366) 6461 0 R (0:5367) 6462 0 R (0:5368) 6463 0 R (0:5369) 6464 0 R (0:537) 1439 0 R (0:5370) 6465 0 R (0:5371) 6466 0 R (0:5372) 6467 0 R (0:5373) 6468 0 R (0:5374) 6469 0 R (0:5375) 6470 0 R (0:5376) 6471 0 R (0:5377) 6472 0 R (0:5378) 6473 0 R (0:5379) 6474 0 R (0:538) 1440 0 R (0:5380) 6475 0 R (0:5381) 6476 0 R (0:5382) 6477 0 R (0:5383) 6478 0 R (0:5384) 6479 0 R (0:5385) 6480 0 R (0:5386) 6481 0 R (0:5387) 6482 0 R (0:5388) 6483 0 R (0:5389) 6484 0 R (0:539) 1441 0 R (0:5390) 6485 0 R (0:5391) 6486 0 R (0:5392) 6487 0 R (0:5393) 6488 0 R (0:5394) 6489 0 R (0:5395) 6490 0 R (0:5396) 6491 0 R (0:5397) 6492 0 R (0:5398) 6493 0 R (0:5399) 6494 0 R (0:540) 1442 0 R (0:5400) 6495 0 R (0:5401) 6496 0 R (0:5404) 6497 0 R (0:5405) 6498 0 R (0:5406) 6499 0 R (0:5407) 6500 0 R (0:5408) 6501 0 R (0:5409) 6502 0 R (0:541) 1443 0 R (0:5410) 6503 0 R (0:5411) 6504 0 R (0:5412) 6509 0 R (0:5413) 6453 0 R (0:5416) 6510 0 R (0:5417) 6511 0 R (0:5418) 6512 0 R (0:5419) 6513 0 R (0:542) 1444 0 R (0:5420) 6514 0 R (0:5421) 6515 0 R (0:5422) 6516 0 R (0:5423) 6517 0 R (0:5424) 6518 0 R (0:5425) 6519 0 R (0:5426) 6520 0 R (0:5427) 6521 0 R (0:5428) 6522 0 R (0:5429) 6523 0 R (0:543) 1445 0 R (0:5430) 6524 0 R (0:5431) 6525 0 R (0:5432) 6526 0 R (0:5433) 6527 0 R (0:5434) 6528 0 R (0:5435) 6529 0 R (0:5436) 6530 0 R (0:5439) 6531 0 R (0:544) 1446 0 R (0:5440) 6532 0 R (0:5441) 6533 0 R (0:5442) 6534 0 R (0:5443) 6535 0 R (0:5444) 6536 0 R (0:5445) 6537 0 R (0:5446) 6538 0 R (0:5447) 6539 0 R (0:5448) 6540 0 R (0:5449) 6541 0 R (0:545) 1447 0 R (0:5450) 6542 0 R (0:5451) 6543 0 R (0:5452) 6544 0 R (0:5453) 6545 0 R (0:5454) 6546 0 R (0:5455) 6547 0 R (0:5456) 6548 0 R (0:5457) 6549 0 R (0:5458) 6555 0 R (0:5459) 6556 0 R (0:546) 1448 0 R (0:5460) 6557 0 R (0:5461) 6558 0 R (0:5462) 6559 0 R (0:5463) 6560 0 R (0:5464) 6561 0 R (0:5465) 6562 0 R (0:5466) 6563 0 R (0:5467) 6564 0 R (0:5468) 6565 0 R (0:5469) 6566 0 R (0:547) 1449 0 R (0:5470) 6567 0 R (0:5471) 6568 0 R (0:5472) 6569 0 R (0:5473) 6570 0 R (0:5474) 6571 0 R (0:5475) 6572 0 R (0:5476) 6573 0 R (0:5477) 6574 0 R (0:5478) 6575 0 R (0:5479) 6576 0 R (0:548) 1450 0 R (0:5480) 6577 0 R (0:5481) 6578 0 R (0:5482) 6579 0 R (0:5483) 6580 0 R (0:5484) 6581 0 R (0:5485) 6582 0 R (0:5486) 6583 0 R (0:5487) 6584 0 R (0:5488) 6585 0 R (0:5489) 6586 0 R (0:549) 1451 0 R (0:5490) 6587 0 R (0:5491) 6588 0 R (0:5492) 6589 0 R (0:5493) 6590 0 R (0:5494) 6591 0 R (0:5495) 6592 0 R (0:5496) 6593 0 R (0:5497) 6594 0 R (0:5498) 6595 0 R (0:5499) 6596 0 R (0:550) 1452 0 R (0:5500) 6597 0 R (0:5501) 6598 0 R (0:5502) 6599 0 R (0:5503) 6600 0 R (0:5504) 6601 0 R (0:5505) 6602 0 R (0:5506) 6603 0 R (0:5507) 6604 0 R (0:5508) 6605 0 R (0:5509) 6606 0 R (0:551) 1453 0 R (0:5510) 6607 0 R (0:5511) 6608 0 R (0:5512) 6609 0 R (0:5513) 6610 0 R (0:5514) 6611 0 R (0:5515) 6612 0 R (0:5516) 6613 0 R (0:5517) 6614 0 R (0:5518) 6615 0 R (0:5519) 6616 0 R (0:552) 1454 0 R (0:5520) 6617 0 R (0:5521) 6618 0 R (0:5522) 6619 0 R (0:5523) 6620 0 R (0:5524) 6621 0 R (0:5525) 6622 0 R (0:5526) 6623 0 R (0:5527) 6624 0 R (0:5528) 6625 0 R (0:5529) 6626 0 R (0:553) 1455 0 R (0:5530) 6627 0 R (0:5531) 6628 0 R (0:5532) 6629 0 R (0:5533) 6630 0 R (0:5534) 6631 0 R (0:5535) 6632 0 R (0:5536) 6633 0 R (0:5537) 6634 0 R (0:5538) 6635 0 R (0:5539) 6636 0 R (0:554) 1456 0 R (0:5540) 6637 0 R (0:5541) 6638 0 R (0:5542) 6639 0 R (0:5543) 6640 0 R (0:5544) 6641 0 R (0:5545) 6642 0 R (0:5546) 6643 0 R (0:5547) 6644 0 R (0:5548) 6645 0 R (0:5549) 6646 0 R (0:555) 1457 0 R (0:5550) 6647 0 R (0:5551) 6648 0 R (0:5552) 6654 0 R (0:5553) 6655 0 R (0:5554) 6656 0 R (0:5555) 6657 0 R (0:5556) 6658 0 R (0:5557) 6659 0 R (0:5558) 6660 0 R (0:5559) 6661 0 R (0:556) 1458 0 R (0:5560) 6662 0 R (0:5561) 6663 0 R (0:5562) 6664 0 R (0:5563) 6665 0 R (0:5564) 6666 0 R (0:5565) 6667 0 R (0:5566) 6668 0 R (0:5567) 6669 0 R (0:5568) 6670 0 R (0:5569) 6671 0 R (0:557) 1459 0 R (0:5570) 6672 0 R (0:5571) 6673 0 R (0:5572) 6674 0 R (0:5573) 6675 0 R (0:5574) 6676 0 R (0:5575) 6677 0 R (0:5576) 6678 0 R (0:5577) 6679 0 R (0:5578) 6680 0 R (0:5579) 6681 0 R (0:558) 1460 0 R (0:5580) 6682 0 R (0:5581) 6683 0 R (0:5582) 6684 0 R (0:5583) 6685 0 R (0:5584) 6686 0 R (0:5585) 6687 0 R (0:5586) 6688 0 R (0:5587) 6689 0 R (0:5588) 6690 0 R (0:5589) 6691 0 R (0:559) 1461 0 R (0:5590) 6692 0 R (0:5591) 6693 0 R (0:5592) 6694 0 R (0:5593) 6695 0 R (0:5594) 6696 0 R (0:5595) 6697 0 R (0:5596) 6698 0 R (0:5597) 6699 0 R (0:5598) 6700 0 R (0:5599) 6701 0 R (0:560) 1462 0 R (0:5600) 6702 0 R (0:5601) 6703 0 R (0:5602) 6704 0 R (0:5603) 6705 0 R (0:5604) 6706 0 R (0:5605) 6707 0 R (0:5606) 6708 0 R (0:5607) 6709 0 R (0:5608) 6710 0 R (0:5609) 6711 0 R (0:561) 1463 0 R (0:5610) 6712 0 R (0:5611) 6713 0 R (0:5612) 6714 0 R (0:5613) 6715 0 R (0:5616) 6716 0 R (0:5617) 6717 0 R (0:5618) 6718 0 R (0:5619) 6719 0 R (0:562) 1464 0 R (0:5620) 6720 0 R (0:5621) 6725 0 R (0:5622) 6653 0 R (0:5623) 6726 0 R (0:5624) 6727 0 R (0:5625) 6728 0 R (0:5626) 6729 0 R (0:5627) 6730 0 R (0:5628) 6731 0 R (0:5629) 6732 0 R (0:563) 1465 0 R (0:5630) 6733 0 R (0:5631) 6734 0 R (0:5632) 6735 0 R (0:5633) 6736 0 R (0:5634) 6737 0 R (0:5635) 6738 0 R (0:5636) 6739 0 R (0:5637) 6740 0 R (0:5638) 6741 0 R (0:5639) 6742 0 R (0:564) 1466 0 R (0:5640) 6743 0 R (0:5641) 6744 0 R (0:5642) 6745 0 R (0:5643) 6746 0 R (0:5644) 6747 0 R (0:5645) 6748 0 R (0:5646) 6749 0 R (0:5647) 6750 0 R (0:5648) 6751 0 R (0:5649) 6752 0 R (0:565) 1467 0 R (0:5650) 6753 0 R (0:5651) 6754 0 R (0:5652) 6755 0 R (0:5653) 6756 0 R (0:5654) 6757 0 R (0:5655) 6758 0 R (0:5656) 6759 0 R (0:5657) 6760 0 R (0:5658) 6761 0 R (0:5659) 6762 0 R (0:566) 1468 0 R (0:5660) 6763 0 R (0:5661) 6764 0 R (0:5662) 6765 0 R (0:5663) 6766 0 R (0:5664) 6767 0 R (0:5665) 6768 0 R (0:5666) 6769 0 R (0:5667) 6770 0 R (0:5668) 6771 0 R (0:5669) 6772 0 R (0:567) 1469 0 R (0:5670) 6773 0 R (0:5671) 6774 0 R (0:5672) 6775 0 R (0:5673) 6776 0 R (0:5674) 6777 0 R (0:5675) 6778 0 R (0:5676) 6779 0 R (0:5677) 6780 0 R (0:5678) 6781 0 R (0:5679) 6782 0 R (0:568) 1470 0 R (0:5680) 6783 0 R (0:5681) 6784 0 R (0:5682) 6785 0 R (0:5683) 6786 0 R (0:5684) 6787 0 R (0:5685) 6788 0 R (0:5686) 6789 0 R (0:5687) 6790 0 R (0:5688) 6795 0 R (0:5689) 6796 0 R (0:569) 1471 0 R (0:5690) 6797 0 R (0:5691) 6798 0 R (0:5692) 6799 0 R (0:5693) 6800 0 R (0:5694) 6801 0 R (0:5695) 6802 0 R (0:5696) 6803 0 R (0:5697) 6804 0 R (0:5698) 6805 0 R (0:5699) 6806 0 R (0:570) 1472 0 R (0:5700) 6807 0 R (0:5701) 6808 0 R (0:5702) 6809 0 R (0:5703) 6810 0 R (0:5704) 6811 0 R (0:5705) 6812 0 R (0:5706) 6813 0 R (0:5707) 6814 0 R (0:5708) 6815 0 R (0:5709) 6816 0 R (0:571) 1473 0 R (0:5710) 6817 0 R (0:5711) 6818 0 R (0:5712) 6819 0 R (0:5713) 6820 0 R (0:5714) 6821 0 R (0:5715) 6822 0 R (0:5716) 6823 0 R (0:5717) 6824 0 R (0:5718) 6825 0 R (0:5719) 6826 0 R (0:572) 1474 0 R (0:5720) 6827 0 R (0:5721) 6828 0 R (0:5722) 6829 0 R (0:5723) 6830 0 R (0:5724) 6831 0 R (0:5725) 6832 0 R (0:5726) 6833 0 R (0:5727) 6834 0 R (0:5728) 6835 0 R (0:5729) 6836 0 R (0:573) 1475 0 R (0:5730) 6837 0 R (0:5731) 6838 0 R (0:5732) 6839 0 R (0:5733) 6840 0 R (0:5734) 6841 0 R (0:5735) 6842 0 R (0:5736) 6843 0 R (0:5737) 6844 0 R (0:5738) 6845 0 R (0:5739) 6846 0 R (0:574) 1476 0 R (0:5740) 6847 0 R (0:5741) 6848 0 R (0:5742) 6849 0 R (0:5743) 6850 0 R (0:5744) 6851 0 R (0:5745) 6852 0 R (0:5746) 6853 0 R (0:5747) 6854 0 R (0:5748) 6855 0 R (0:5749) 6856 0 R (0:575) 1477 0 R (0:5750) 6857 0 R (0:5751) 6858 0 R (0:5752) 6859 0 R (0:5753) 6860 0 R (0:5754) 6861 0 R (0:5755) 6862 0 R (0:5756) 6863 0 R (0:5757) 6864 0 R (0:5758) 6869 0 R (0:5759) 6870 0 R (0:576) 1478 0 R (0:5760) 6871 0 R (0:5761) 6872 0 R (0:5762) 6873 0 R (0:5763) 6874 0 R (0:5764) 6875 0 R (0:5765) 6876 0 R (0:5766) 6877 0 R (0:5767) 6878 0 R (0:5768) 6879 0 R (0:5769) 6880 0 R (0:577) 1479 0 R (0:5770) 6881 0 R (0:5771) 6882 0 R (0:5772) 6883 0 R (0:5773) 6884 0 R (0:5774) 6885 0 R (0:5775) 6886 0 R (0:5776) 6887 0 R (0:5777) 6888 0 R (0:5778) 6889 0 R (0:5779) 6890 0 R (0:578) 1480 0 R (0:5780) 6891 0 R (0:5781) 6892 0 R (0:5782) 6893 0 R (0:5783) 6894 0 R (0:5784) 6895 0 R (0:5785) 6896 0 R (0:5786) 6897 0 R (0:5789) 6898 0 R (0:5790) 6899 0 R (0:5791) 6900 0 R (0:5792) 6901 0 R (0:5793) 6902 0 R (0:5794) 6903 0 R (0:5795) 6904 0 R (0:5796) 6905 0 R (0:5797) 6906 0 R (0:5798) 6907 0 R (0:5799) 6908 0 R (0:5800) 6913 0 R (0:5801) 6914 0 R (0:5802) 6915 0 R (0:5803) 6916 0 R (0:5804) 6917 0 R (0:5805) 6918 0 R (0:5806) 6919 0 R (0:5807) 6920 0 R (0:5808) 6921 0 R (0:5809) 6922 0 R (0:581) 1481 0 R (0:5810) 6923 0 R (0:5811) 6924 0 R (0:5812) 6925 0 R (0:5813) 6926 0 R (0:5814) 6927 0 R (0:5815) 6928 0 R (0:5816) 6929 0 R (0:5817) 6930 0 R (0:5818) 6931 0 R (0:5819) 6932 0 R (0:582) 1482 0 R (0:5820) 6933 0 R (0:5823) 6934 0 R (0:5824) 6935 0 R (0:5825) 6936 0 R (0:5826) 6937 0 R (0:5827) 6938 0 R (0:5828) 6939 0 R (0:5829) 6940 0 R (0:583) 1483 0 R (0:5830) 6941 0 R (0:5831) 6942 0 R (0:5832) 6943 0 R (0:5833) 6944 0 R (0:5834) 6945 0 R (0:5835) 6946 0 R (0:5836) 6947 0 R (0:5837) 6948 0 R (0:5838) 6949 0 R (0:5839) 6950 0 R (0:584) 1484 0 R (0:5840) 6951 0 R (0:5841) 6952 0 R (0:5842) 6953 0 R (0:5843) 6954 0 R (0:5844) 6955 0 R (0:5845) 6956 0 R (0:5846) 6957 0 R (0:5847) 6958 0 R (0:5848) 6959 0 R (0:5849) 6960 0 R (0:585) 1485 0 R (0:5850) 6961 0 R (0:5851) 6962 0 R (0:5852) 6969 0 R (0:5855) 6970 0 R (0:5856) 6971 0 R (0:5857) 6972 0 R (0:5858) 6973 0 R (0:5859) 6974 0 R (0:586) 1492 0 R (0:5860) 6975 0 R (0:5861) 6976 0 R (0:5862) 6977 0 R (0:5863) 6978 0 R (0:5864) 6979 0 R (0:5865) 6980 0 R (0:5866) 6981 0 R (0:5867) 6982 0 R (0:5868) 6983 0 R (0:5869) 6984 0 R (0:587) 1416 0 R (0:5870) 6985 0 R (0:5871) 6986 0 R (0:5872) 6987 0 R (0:5873) 6988 0 R (0:5874) 6989 0 R (0:5875) 6990 0 R (0:5876) 6991 0 R (0:5877) 6992 0 R (0:5878) 6993 0 R (0:5879) 6994 0 R (0:588) 1493 0 R (0:5880) 6995 0 R (0:5881) 6996 0 R (0:5882) 6997 0 R (0:5883) 6998 0 R (0:5884) 6999 0 R (0:5885) 7000 0 R (0:5886) 7001 0 R (0:5887) 7002 0 R (0:5888) 7003 0 R (0:5889) 7004 0 R (0:589) 1494 0 R (0:5890) 7005 0 R (0:5891) 7006 0 R (0:5892) 7007 0 R (0:5895) 7012 0 R (0:5896) 7013 0 R (0:5897) 7014 0 R (0:5898) 6968 0 R (0:590) 1495 0 R (0:5901) 7015 0 R (0:5902) 7016 0 R (0:5903) 7017 0 R (0:5904) 7018 0 R (0:5905) 7019 0 R (0:5906) 7020 0 R (0:5907) 7021 0 R (0:5908) 7022 0 R (0:5909) 7023 0 R (0:591) 1496 0 R (0:5910) 7024 0 R (0:5911) 7025 0 R (0:5912) 7026 0 R (0:5913) 7027 0 R (0:5914) 7028 0 R (0:5915) 7029 0 R (0:5916) 7030 0 R (0:5917) 7031 0 R (0:5918) 7032 0 R (0:5919) 7033 0 R (0:592) 1497 0 R (0:5920) 7034 0 R (0:5921) 7035 0 R (0:5922) 7036 0 R (0:5923) 7037 0 R (0:5924) 7038 0 R (0:5925) 7039 0 R (0:5926) 7040 0 R (0:5927) 7041 0 R (0:5928) 7042 0 R (0:5929) 7043 0 R (0:593) 1498 0 R (0:5930) 7044 0 R (0:5931) 7045 0 R (0:5932) 7046 0 R (0:5933) 7047 0 R (0:5936) 7048 0 R (0:5937) 7049 0 R (0:5938) 7050 0 R (0:5939) 7056 0 R (0:594) 1499 0 R (0:5940) 7057 0 R (0:5941) 7058 0 R (0:5942) 7059 0 R (0:5943) 7060 0 R (0:5944) 7061 0 R (0:5945) 7062 0 R (0:5946) 7063 0 R (0:5947) 7064 0 R (0:5948) 7065 0 R (0:5949) 7066 0 R (0:595) 1500 0 R (0:5950) 7067 0 R (0:5951) 7068 0 R (0:5952) 7069 0 R (0:5953) 7070 0 R (0:5954) 7071 0 R (0:5955) 7072 0 R (0:5956) 7073 0 R (0:5957) 7074 0 R (0:5958) 7075 0 R (0:5959) 7076 0 R (0:596) 1501 0 R (0:5960) 7077 0 R (0:5961) 7078 0 R (0:5962) 7079 0 R (0:5963) 7080 0 R (0:5964) 7081 0 R (0:5965) 7082 0 R (0:5966) 7083 0 R (0:5967) 7084 0 R (0:5968) 7085 0 R (0:5969) 7086 0 R (0:597) 1502 0 R (0:5970) 7087 0 R (0:5971) 7088 0 R (0:5972) 7089 0 R (0:5973) 7090 0 R (0:5974) 7091 0 R (0:5975) 7092 0 R (0:5976) 7093 0 R (0:5977) 7094 0 R (0:5978) 7095 0 R (0:5979) 7096 0 R (0:598) 1503 0 R (0:5980) 7097 0 R (0:5981) 7098 0 R (0:5982) 7099 0 R (0:5983) 7100 0 R (0:5984) 7101 0 R (0:5985) 7102 0 R (0:5986) 7103 0 R (0:5987) 7104 0 R (0:599) 1504 0 R (0:5990) 7105 0 R (0:5991) 7106 0 R (0:5992) 7107 0 R (0:5993) 7108 0 R (0:5994) 7109 0 R (0:5995) 7115 0 R (0:5996) 7055 0 R (0:5997) 7116 0 R (0:5998) 7117 0 R (0:5999) 7118 0 R (0:600) 1505 0 R (0:6000) 7119 0 R (0:6001) 7120 0 R (0:6002) 7121 0 R (0:6003) 7122 0 R (0:6004) 7123 0 R (0:6005) 7124 0 R (0:6006) 7125 0 R (0:6007) 7126 0 R (0:6008) 7127 0 R (0:6009) 7128 0 R (0:601) 1506 0 R (0:6010) 7129 0 R (0:6011) 7130 0 R (0:6012) 7131 0 R (0:6013) 7132 0 R (0:6014) 7133 0 R (0:6015) 7134 0 R (0:6016) 7135 0 R (0:6017) 7136 0 R (0:6018) 7137 0 R (0:6019) 7138 0 R (0:602) 1507 0 R (0:6020) 7139 0 R (0:6021) 7140 0 R (0:6022) 7141 0 R (0:6023) 7142 0 R (0:6024) 7143 0 R (0:6025) 7144 0 R (0:6026) 7145 0 R (0:6027) 7146 0 R (0:6028) 7147 0 R (0:6029) 7148 0 R (0:603) 1508 0 R (0:6030) 7149 0 R (0:6033) 7150 0 R (0:6034) 7151 0 R (0:6035) 7152 0 R (0:6036) 7153 0 R (0:6037) 7154 0 R (0:6038) 7155 0 R (0:6039) 7156 0 R (0:604) 1509 0 R (0:6040) 7157 0 R (0:6041) 7158 0 R (0:6042) 7164 0 R (0:6043) 7114 0 R (0:6044) 7165 0 R (0:6045) 7166 0 R (0:6046) 7167 0 R (0:6047) 7168 0 R (0:6048) 7169 0 R (0:6049) 7170 0 R (0:605) 1510 0 R (0:6050) 7171 0 R (0:6051) 7172 0 R (0:6052) 7173 0 R (0:6053) 7174 0 R (0:6054) 7175 0 R (0:6055) 7176 0 R (0:6056) 7177 0 R (0:6057) 7178 0 R (0:6058) 7179 0 R (0:6059) 7180 0 R (0:606) 1511 0 R (0:6060) 7181 0 R (0:6061) 7182 0 R (0:6062) 7183 0 R (0:6063) 7184 0 R (0:6064) 7185 0 R (0:6065) 7186 0 R (0:6066) 7187 0 R (0:6067) 7188 0 R (0:6068) 7189 0 R (0:6069) 7190 0 R (0:607) 1512 0 R (0:6070) 7191 0 R (0:6071) 7192 0 R (0:6072) 7193 0 R (0:6073) 7194 0 R (0:6074) 7195 0 R (0:6075) 7196 0 R (0:6076) 7197 0 R (0:6077) 7198 0 R (0:6078) 7199 0 R (0:6079) 7200 0 R (0:608) 1513 0 R (0:6080) 7201 0 R (0:6081) 7202 0 R (0:6082) 7203 0 R (0:6083) 7204 0 R (0:6084) 7205 0 R (0:6085) 7206 0 R (0:6086) 7207 0 R (0:6087) 7208 0 R (0:6088) 7209 0 R (0:6089) 7210 0 R (0:609) 1514 0 R (0:6090) 7211 0 R (0:6091) 7212 0 R (0:6092) 7213 0 R (0:6093) 7214 0 R (0:6094) 7215 0 R (0:6095) 7216 0 R (0:6098) 7217 0 R (0:6099) 7218 0 R (0:610) 1515 0 R (0:6100) 7219 0 R (0:6101) 7220 0 R (0:6102) 7221 0 R (0:6103) 7222 0 R (0:6104) 7223 0 R (0:6105) 7228 0 R (0:6106) 7163 0 R (0:6109) 7229 0 R (0:611) 1516 0 R (0:6110) 7230 0 R (0:6111) 7231 0 R (0:6112) 7232 0 R (0:6113) 7233 0 R (0:6114) 7234 0 R (0:6115) 7235 0 R (0:6116) 7236 0 R (0:6117) 7237 0 R (0:6118) 7238 0 R (0:6119) 7239 0 R (0:612) 1517 0 R (0:6120) 7240 0 R (0:6121) 7241 0 R (0:6122) 7242 0 R (0:6123) 7243 0 R (0:6124) 7244 0 R (0:6125) 7245 0 R (0:6126) 7246 0 R (0:6127) 7247 0 R (0:6128) 7248 0 R (0:6129) 7249 0 R (0:613) 1518 0 R (0:6130) 7250 0 R (0:6131) 7251 0 R (0:6132) 7252 0 R (0:6133) 7253 0 R (0:6134) 7254 0 R (0:6137) 7255 0 R (0:6138) 7256 0 R (0:6139) 7257 0 R (0:614) 1519 0 R (0:6140) 7258 0 R (0:6141) 7259 0 R (0:6142) 7260 0 R (0:6143) 7261 0 R (0:6144) 7262 0 R (0:6145) 7263 0 R (0:6146) 7264 0 R (0:6147) 7265 0 R (0:6148) 7266 0 R (0:6149) 7267 0 R (0:615) 1520 0 R (0:6150) 7268 0 R (0:6151) 7269 0 R (0:6152) 7270 0 R (0:6153) 7271 0 R (0:6154) 7272 0 R (0:6155) 7273 0 R (0:6156) 7280 0 R (0:6157) 7281 0 R (0:6158) 7282 0 R (0:6159) 7283 0 R (0:616) 1521 0 R (0:6160) 7284 0 R (0:6161) 7285 0 R (0:6162) 7286 0 R (0:6163) 7287 0 R (0:6164) 7288 0 R (0:6165) 7289 0 R (0:6166) 7290 0 R (0:6167) 7291 0 R (0:6168) 7292 0 R (0:6169) 7293 0 R (0:617) 1522 0 R (0:6170) 7294 0 R (0:6171) 7295 0 R (0:6172) 7296 0 R (0:6175) 7297 0 R (0:6176) 7298 0 R (0:6177) 7299 0 R (0:6178) 7300 0 R (0:6179) 7301 0 R (0:618) 1523 0 R (0:6180) 7302 0 R (0:6181) 7303 0 R (0:6182) 7304 0 R (0:6183) 7305 0 R (0:6184) 7306 0 R (0:6185) 7307 0 R (0:6186) 7308 0 R (0:6187) 7309 0 R (0:6188) 7310 0 R (0:6189) 7311 0 R (0:619) 1524 0 R (0:6190) 7312 0 R (0:6191) 7313 0 R (0:6192) 7314 0 R (0:6193) 7315 0 R (0:6194) 7316 0 R (0:6195) 7317 0 R (0:6196) 7318 0 R (0:6197) 7319 0 R (0:6198) 7320 0 R (0:6199) 7321 0 R (0:620) 1525 0 R (0:6200) 7322 0 R (0:6201) 7323 0 R (0:6202) 7324 0 R (0:6203) 7325 0 R (0:6204) 7326 0 R (0:6205) 7327 0 R (0:6206) 7328 0 R (0:6207) 7329 0 R (0:6208) 7330 0 R (0:6209) 7331 0 R (0:621) 1526 0 R (0:6210) 7332 0 R (0:6211) 7333 0 R (0:6212) 7279 0 R (0:6213) 7338 0 R (0:6214) 7339 0 R (0:6215) 7340 0 R (0:6218) 7341 0 R (0:6219) 7342 0 R (0:622) 1527 0 R (0:6220) 7343 0 R (0:6221) 7344 0 R (0:6222) 7345 0 R (0:6223) 7346 0 R (0:6224) 7347 0 R (0:6225) 7348 0 R (0:6226) 7349 0 R (0:6227) 7350 0 R (0:6228) 7351 0 R (0:6229) 7352 0 R (0:623) 1528 0 R (0:6230) 7353 0 R (0:6231) 7354 0 R (0:6232) 7355 0 R (0:6233) 7356 0 R (0:6234) 7357 0 R (0:6235) 7358 0 R (0:6236) 7359 0 R (0:6237) 7360 0 R (0:6238) 7361 0 R (0:6239) 7362 0 R (0:624) 1529 0 R (0:6240) 7363 0 R (0:6241) 7364 0 R (0:6242) 7365 0 R (0:6243) 7366 0 R (0:6244) 7367 0 R (0:6245) 7368 0 R (0:6246) 7369 0 R (0:6247) 7370 0 R (0:6248) 7371 0 R (0:6249) 7372 0 R (0:625) 1530 0 R (0:6250) 7373 0 R (0:6251) 7374 0 R (0:6252) 7375 0 R (0:6253) 7376 0 R (0:6254) 7377 0 R (0:6255) 7378 0 R (0:6256) 7379 0 R (0:6257) 7380 0 R (0:6258) 7381 0 R (0:6259) 7382 0 R (0:626) 1531 0 R (0:6260) 7383 0 R (0:6261) 7384 0 R (0:6262) 7385 0 R (0:6263) 7386 0 R (0:6264) 7391 0 R (0:6265) 7392 0 R (0:6266) 7393 0 R (0:6267) 7394 0 R (0:6268) 7395 0 R (0:6269) 7396 0 R (0:627) 1532 0 R (0:6270) 7397 0 R (0:6271) 7398 0 R (0:6272) 7399 0 R (0:6273) 7400 0 R (0:6274) 7401 0 R (0:6275) 7402 0 R (0:6276) 7403 0 R (0:6277) 7404 0 R (0:6278) 7405 0 R (0:6279) 7406 0 R (0:628) 1533 0 R (0:6280) 7407 0 R (0:6281) 7408 0 R (0:6282) 7409 0 R (0:6283) 7410 0 R (0:6284) 7411 0 R (0:6285) 7412 0 R (0:6286) 7413 0 R (0:6287) 7414 0 R (0:6290) 7415 0 R (0:6291) 7416 0 R (0:6292) 7417 0 R (0:6293) 7418 0 R (0:6294) 7419 0 R (0:6295) 7420 0 R (0:6296) 7421 0 R (0:6297) 7422 0 R (0:6298) 7423 0 R (0:6299) 7424 0 R (0:63) 952 0 R (0:6300) 7425 0 R (0:6301) 7426 0 R (0:6302) 7427 0 R (0:6303) 7428 0 R (0:6304) 7429 0 R (0:6305) 7430 0 R (0:6306) 7431 0 R (0:6307) 7432 0 R (0:6308) 7433 0 R (0:6309) 7434 0 R (0:631) 1534 0 R (0:6310) 7435 0 R (0:6311) 7436 0 R (0:6312) 7437 0 R (0:6313) 7438 0 R (0:6314) 7439 0 R (0:6315) 7440 0 R (0:6316) 7441 0 R (0:6317) 7442 0 R (0:6318) 7447 0 R (0:6319) 7448 0 R (0:632) 1535 0 R (0:6320) 7449 0 R (0:6321) 7450 0 R (0:6322) 7451 0 R (0:6323) 7452 0 R (0:6324) 7453 0 R (0:6325) 7454 0 R (0:6326) 7455 0 R (0:6327) 7456 0 R (0:6328) 7457 0 R (0:6329) 7458 0 R (0:633) 1536 0 R (0:6330) 7459 0 R (0:6331) 7460 0 R (0:6332) 7461 0 R (0:6333) 7462 0 R (0:6334) 7463 0 R (0:6335) 7464 0 R (0:6336) 7465 0 R (0:6337) 7466 0 R (0:6338) 7467 0 R (0:6339) 7468 0 R (0:634) 1537 0 R (0:6340) 7469 0 R (0:6341) 7470 0 R (0:6342) 7471 0 R (0:6343) 7472 0 R (0:6344) 7473 0 R (0:6345) 7474 0 R (0:6346) 7475 0 R (0:6349) 7476 0 R (0:635) 1538 0 R (0:6350) 7477 0 R (0:6351) 7478 0 R (0:6352) 7479 0 R (0:6353) 7480 0 R (0:6354) 7481 0 R (0:6355) 7482 0 R (0:6356) 7483 0 R (0:6357) 7484 0 R (0:6358) 7485 0 R (0:6359) 7486 0 R (0:636) 1539 0 R (0:6360) 7487 0 R (0:6361) 7488 0 R (0:6362) 7489 0 R (0:6363) 7490 0 R (0:6364) 7491 0 R (0:6365) 7492 0 R (0:6366) 7493 0 R (0:6367) 7494 0 R (0:6368) 7495 0 R (0:6369) 7496 0 R (0:637) 1545 0 R (0:6370) 7497 0 R (0:6371) 7498 0 R (0:6372) 7499 0 R (0:6373) 7504 0 R (0:6374) 7505 0 R (0:6375) 7506 0 R (0:6376) 7507 0 R (0:6377) 7508 0 R (0:6378) 7509 0 R (0:6379) 7510 0 R (0:638) 1491 0 R (0:6380) 7511 0 R (0:6381) 7512 0 R (0:6382) 7513 0 R (0:6383) 7514 0 R (0:6384) 7515 0 R (0:6385) 7516 0 R (0:6386) 7517 0 R (0:6387) 7518 0 R (0:6388) 7519 0 R (0:6389) 7520 0 R (0:6390) 7521 0 R (0:6391) 7522 0 R (0:6392) 7523 0 R (0:6393) 7524 0 R (0:6394) 7525 0 R (0:6395) 7526 0 R (0:6396) 7527 0 R (0:6397) 7528 0 R (0:6398) 7529 0 R (0:6399) 7530 0 R (0:64) 953 0 R (0:6400) 7531 0 R (0:6401) 7532 0 R (0:6402) 7533 0 R (0:6403) 7534 0 R (0:6404) 7535 0 R (0:6405) 7536 0 R (0:6406) 7537 0 R (0:6407) 7538 0 R (0:6408) 7539 0 R (0:6409) 7540 0 R (0:641) 1546 0 R (0:6410) 7541 0 R (0:6411) 7542 0 R (0:6412) 7543 0 R (0:6415) 7544 0 R (0:6416) 7545 0 R (0:6417) 7546 0 R (0:6418) 7547 0 R (0:6419) 7548 0 R (0:642) 1547 0 R (0:6420) 7549 0 R (0:6421) 7550 0 R (0:6422) 7551 0 R (0:6423) 7552 0 R (0:6424) 7553 0 R (0:6425) 7554 0 R (0:6426) 7555 0 R (0:6427) 7556 0 R (0:6428) 7557 0 R (0:6429) 7558 0 R (0:643) 1548 0 R (0:6430) 7559 0 R (0:6431) 7560 0 R (0:6432) 7565 0 R (0:6433) 7566 0 R (0:6434) 7567 0 R (0:6435) 7568 0 R (0:6436) 7569 0 R (0:6437) 7570 0 R (0:6438) 7571 0 R (0:6439) 7572 0 R (0:644) 1549 0 R (0:6440) 7573 0 R (0:6441) 7574 0 R (0:6442) 7575 0 R (0:6443) 7576 0 R (0:6444) 7577 0 R (0:6445) 7578 0 R (0:6446) 7579 0 R (0:6447) 7580 0 R (0:6448) 7581 0 R (0:6449) 7582 0 R (0:645) 1550 0 R (0:6450) 7583 0 R (0:6451) 7584 0 R (0:6452) 7585 0 R (0:6453) 7586 0 R (0:6454) 7587 0 R (0:6455) 7588 0 R (0:6456) 7589 0 R (0:6457) 7590 0 R (0:6458) 7591 0 R (0:6459) 7592 0 R (0:646) 1551 0 R (0:6460) 7593 0 R (0:6461) 7594 0 R (0:6464) 7595 0 R (0:6465) 7596 0 R (0:6466) 7597 0 R (0:6467) 7598 0 R (0:6468) 7599 0 R (0:6469) 7600 0 R (0:647) 1552 0 R (0:6470) 7601 0 R (0:6471) 7602 0 R (0:6472) 7603 0 R (0:6473) 7604 0 R (0:6474) 7605 0 R (0:6475) 7606 0 R (0:6476) 7607 0 R (0:6477) 7608 0 R (0:6478) 7609 0 R (0:6479) 7610 0 R (0:648) 1553 0 R (0:6480) 7611 0 R (0:6481) 7612 0 R (0:6482) 7613 0 R (0:6483) 7614 0 R (0:6484) 7620 0 R (0:6485) 7621 0 R (0:6486) 7622 0 R (0:6487) 7623 0 R (0:6488) 7624 0 R (0:6489) 7625 0 R (0:649) 1554 0 R (0:6490) 7626 0 R (0:6491) 7627 0 R (0:6492) 7628 0 R (0:6493) 7629 0 R (0:6494) 7630 0 R (0:6495) 7631 0 R (0:6496) 7632 0 R (0:6497) 7633 0 R (0:6498) 7634 0 R (0:6499) 7635 0 R (0:65) 954 0 R (0:650) 1555 0 R (0:6500) 7636 0 R (0:6501) 7637 0 R (0:6502) 7638 0 R (0:6503) 7639 0 R (0:6504) 7640 0 R (0:6505) 7641 0 R (0:6506) 7642 0 R (0:6507) 7643 0 R (0:6508) 7644 0 R (0:6509) 7645 0 R (0:651) 1556 0 R (0:6510) 7646 0 R (0:6511) 7647 0 R (0:6512) 7648 0 R (0:6513) 7649 0 R (0:6514) 7650 0 R (0:6515) 7651 0 R (0:6516) 7652 0 R (0:6517) 7653 0 R (0:6518) 7654 0 R (0:6519) 7655 0 R (0:652) 1557 0 R (0:6520) 7656 0 R (0:6521) 7657 0 R (0:6522) 7658 0 R (0:6523) 7659 0 R (0:6524) 7660 0 R (0:6525) 7661 0 R (0:6526) 7662 0 R (0:6529) 7663 0 R (0:653) 1558 0 R (0:6530) 7664 0 R (0:6531) 7665 0 R (0:6532) 7666 0 R (0:6533) 7667 0 R (0:6534) 7668 0 R (0:6535) 7669 0 R (0:6536) 7670 0 R (0:6537) 7671 0 R (0:6538) 7672 0 R (0:6539) 7673 0 R (0:654) 1559 0 R (0:6540) 7678 0 R (0:6541) 7679 0 R (0:6542) 7680 0 R (0:6543) 7681 0 R (0:6544) 7682 0 R (0:6545) 7683 0 R (0:6546) 7684 0 R (0:6547) 7685 0 R (0:6548) 7686 0 R (0:6549) 7687 0 R (0:655) 1560 0 R (0:6550) 7688 0 R (0:6551) 7689 0 R (0:6552) 7690 0 R (0:6553) 7691 0 R (0:6554) 7692 0 R (0:6555) 7693 0 R (0:6556) 7694 0 R (0:6557) 7695 0 R (0:6558) 7696 0 R (0:6559) 7697 0 R (0:656) 1561 0 R (0:6560) 7698 0 R (0:6561) 7699 0 R (0:6562) 7700 0 R (0:6563) 7701 0 R (0:6564) 7702 0 R (0:6565) 7703 0 R (0:6566) 7704 0 R (0:6567) 7705 0 R (0:6568) 7706 0 R (0:6569) 7707 0 R (0:657) 1562 0 R (0:6570) 7708 0 R (0:6571) 7709 0 R (0:6572) 7710 0 R (0:6573) 7711 0 R (0:6574) 7712 0 R (0:6575) 7713 0 R (0:6576) 7714 0 R (0:6577) 7715 0 R (0:6578) 7716 0 R (0:6579) 7717 0 R (0:658) 1563 0 R (0:6580) 7718 0 R (0:6581) 7719 0 R (0:6582) 7720 0 R (0:6583) 7721 0 R (0:6584) 7722 0 R (0:6585) 7723 0 R (0:6586) 7724 0 R (0:6587) 7725 0 R (0:6588) 7726 0 R (0:6589) 7727 0 R (0:659) 1564 0 R (0:6590) 7728 0 R (0:6591) 7729 0 R (0:6592) 7730 0 R (0:6593) 7731 0 R (0:6594) 7732 0 R (0:6597) 7733 0 R (0:6598) 7734 0 R (0:6599) 7735 0 R (0:66) 955 0 R (0:660) 1565 0 R (0:6600) 7736 0 R (0:6601) 7737 0 R (0:6602) 7738 0 R (0:6603) 7743 0 R (0:6604) 7744 0 R (0:6605) 7745 0 R (0:6606) 7746 0 R (0:6607) 7747 0 R (0:6608) 7748 0 R (0:6609) 7749 0 R (0:661) 1566 0 R (0:6610) 7750 0 R (0:6611) 7751 0 R (0:6612) 7752 0 R (0:6613) 7753 0 R (0:6614) 7754 0 R (0:6615) 7755 0 R (0:6616) 7756 0 R (0:6617) 7757 0 R (0:6618) 7758 0 R (0:6619) 7759 0 R (0:662) 1567 0 R (0:6620) 7760 0 R (0:6621) 7761 0 R (0:6622) 7762 0 R (0:6623) 7763 0 R (0:6624) 7764 0 R (0:6625) 7765 0 R (0:6626) 7766 0 R (0:6629) 7767 0 R (0:663) 1568 0 R (0:6630) 7768 0 R (0:6631) 7769 0 R (0:6632) 7770 0 R (0:6633) 7771 0 R (0:6634) 7772 0 R (0:6635) 7773 0 R (0:6636) 7774 0 R (0:6637) 7775 0 R (0:6638) 7776 0 R (0:6639) 7777 0 R (0:664) 1569 0 R (0:6640) 7778 0 R (0:6641) 7779 0 R (0:6642) 7780 0 R (0:6643) 7781 0 R (0:6644) 7782 0 R (0:6645) 7783 0 R (0:6646) 7784 0 R (0:6647) 7785 0 R (0:6648) 7786 0 R (0:6649) 7791 0 R (0:665) 1570 0 R (0:6650) 7792 0 R (0:6651) 7793 0 R (0:6652) 7794 0 R (0:6653) 7795 0 R (0:6654) 7796 0 R (0:6655) 7797 0 R (0:6656) 7798 0 R (0:6657) 7799 0 R (0:6658) 7800 0 R (0:6659) 7801 0 R (0:666) 1571 0 R (0:6660) 7802 0 R (0:6661) 7803 0 R (0:6662) 7804 0 R (0:6663) 7805 0 R (0:6664) 7806 0 R (0:6665) 7807 0 R (0:6666) 7808 0 R (0:6667) 7809 0 R (0:6668) 7810 0 R (0:6669) 7811 0 R (0:667) 1572 0 R (0:6670) 7812 0 R (0:6671) 7813 0 R (0:6672) 7814 0 R (0:6675) 7815 0 R (0:6676) 7816 0 R (0:6677) 7817 0 R (0:6678) 7818 0 R (0:6679) 7819 0 R (0:668) 1573 0 R (0:6680) 7820 0 R (0:6681) 7821 0 R (0:6682) 7822 0 R (0:6683) 7823 0 R (0:6684) 7824 0 R (0:6685) 7825 0 R (0:6686) 7826 0 R (0:6687) 7827 0 R (0:6688) 7828 0 R (0:6689) 7829 0 R (0:669) 1574 0 R (0:6690) 7830 0 R (0:6691) 7831 0 R (0:6692) 7832 0 R (0:6693) 7833 0 R (0:6694) 7834 0 R (0:6695) 7835 0 R (0:6696) 7840 0 R (0:6697) 7841 0 R (0:6698) 7842 0 R (0:6699) 7843 0 R (0:6700) 7844 0 R (0:6701) 7845 0 R (0:6702) 7846 0 R (0:6703) 7847 0 R (0:6704) 7848 0 R (0:6705) 7849 0 R (0:6706) 7850 0 R (0:6707) 7851 0 R (0:6708) 7852 0 R (0:6709) 7853 0 R (0:6710) 7854 0 R (0:6711) 7855 0 R (0:6712) 7856 0 R (0:6713) 7857 0 R (0:6714) 7858 0 R (0:6715) 7859 0 R (0:6716) 7860 0 R (0:6717) 7861 0 R (0:6718) 7862 0 R (0:6719) 7863 0 R (0:672) 1575 0 R (0:6720) 7864 0 R (0:6721) 7865 0 R (0:6722) 7866 0 R (0:6723) 7867 0 R (0:6724) 7868 0 R (0:6725) 7869 0 R (0:6726) 7870 0 R (0:6729) 7871 0 R (0:673) 1576 0 R (0:6730) 7872 0 R (0:6731) 7873 0 R (0:6732) 7874 0 R (0:6733) 7875 0 R (0:6734) 7876 0 R (0:6735) 7877 0 R (0:6736) 7878 0 R (0:6737) 7879 0 R (0:6738) 7880 0 R (0:6739) 7881 0 R (0:674) 1577 0 R (0:6740) 7882 0 R (0:6741) 7888 0 R (0:6742) 7889 0 R (0:6743) 7890 0 R (0:6744) 7891 0 R (0:6745) 7892 0 R (0:6746) 7893 0 R (0:6747) 7894 0 R (0:6748) 7895 0 R (0:6749) 7896 0 R (0:675) 1578 0 R (0:6750) 7897 0 R (0:6751) 7898 0 R (0:6752) 7899 0 R (0:6753) 7900 0 R (0:6754) 7901 0 R (0:6755) 7902 0 R (0:6756) 7903 0 R (0:6757) 7904 0 R (0:6758) 7905 0 R (0:6759) 7906 0 R (0:676) 1579 0 R (0:6760) 7907 0 R (0:6761) 7908 0 R (0:6762) 7909 0 R (0:6763) 7910 0 R (0:6764) 7911 0 R (0:6765) 7912 0 R (0:6766) 7913 0 R (0:6767) 7914 0 R (0:677) 1580 0 R (0:6770) 7915 0 R (0:6771) 7916 0 R (0:6772) 7917 0 R (0:6773) 7918 0 R (0:6774) 7919 0 R (0:6775) 7920 0 R (0:6776) 7921 0 R (0:6777) 7922 0 R (0:6778) 7923 0 R (0:6779) 7924 0 R (0:678) 1581 0 R (0:6780) 7925 0 R (0:6781) 7926 0 R (0:6782) 7927 0 R (0:6783) 7928 0 R (0:6784) 7929 0 R (0:6785) 7930 0 R (0:6786) 7931 0 R (0:6789) 7937 0 R (0:679) 1582 0 R (0:6790) 7938 0 R (0:6791) 7939 0 R (0:6792) 7887 0 R (0:6795) 7940 0 R (0:6796) 7941 0 R (0:6797) 7942 0 R (0:6798) 7943 0 R (0:6799) 7944 0 R (0:680) 1583 0 R (0:6800) 7945 0 R (0:6801) 7946 0 R (0:6802) 7947 0 R (0:6803) 7948 0 R (0:6804) 7949 0 R (0:6805) 7950 0 R (0:6806) 7951 0 R (0:6809) 7952 0 R (0:681) 1584 0 R (0:6810) 7953 0 R (0:6811) 7954 0 R (0:6812) 7955 0 R (0:6813) 7956 0 R (0:6814) 7957 0 R (0:6815) 7958 0 R (0:6816) 7959 0 R (0:6817) 7960 0 R (0:6818) 7961 0 R (0:6819) 7962 0 R (0:682) 1544 0 R (0:6820) 7963 0 R (0:6821) 7964 0 R (0:6822) 7965 0 R (0:6823) 7966 0 R (0:6824) 7967 0 R (0:6825) 7968 0 R (0:6826) 7969 0 R (0:6827) 7970 0 R (0:6828) 7971 0 R (0:6829) 7972 0 R (0:683) 1589 0 R (0:6832) 7977 0 R (0:6833) 7978 0 R (0:6834) 7979 0 R (0:6835) 7980 0 R (0:6836) 7981 0 R (0:6837) 7982 0 R (0:6838) 7983 0 R (0:6839) 7984 0 R (0:684) 1590 0 R (0:6840) 7985 0 R (0:6841) 7986 0 R (0:6842) 7987 0 R (0:6843) 7988 0 R (0:6844) 7989 0 R (0:6845) 7990 0 R (0:6846) 7991 0 R (0:6847) 7992 0 R (0:6848) 7993 0 R (0:6849) 7994 0 R (0:685) 1591 0 R (0:6850) 7995 0 R (0:6851) 7996 0 R (0:6852) 7997 0 R (0:6853) 7998 0 R (0:6854) 7999 0 R (0:6855) 8000 0 R (0:6856) 8001 0 R (0:6857) 8002 0 R (0:6858) 8003 0 R (0:6859) 8004 0 R (0:686) 1592 0 R (0:6860) 8005 0 R (0:6861) 8006 0 R (0:6862) 8007 0 R (0:6863) 8008 0 R (0:6864) 8009 0 R (0:6865) 8010 0 R (0:6866) 8011 0 R (0:6867) 8012 0 R (0:6868) 8013 0 R (0:6869) 8014 0 R (0:687) 1593 0 R (0:6870) 8015 0 R (0:6871) 8016 0 R (0:6872) 8017 0 R (0:688) 1594 0 R (0:689) 1595 0 R (0:690) 1596 0 R (0:691) 1597 0 R (0:692) 1598 0 R (0:693) 1599 0 R (0:694) 1600 0 R (0:695) 1601 0 R (0:696) 1602 0 R (0:697) 1603 0 R (0:698) 1604 0 R (0:699) 1605 0 R (0:700) 1606 0 R (0:701) 1607 0 R (0:702) 1608 0 R (0:703) 1609 0 R (0:704) 1610 0 R (0:705) 1611 0 R (0:706) 1612 0 R (0:707) 1613 0 R (0:708) 1614 0 R (0:709) 1615 0 R (0:712) 1616 0 R (0:713) 1617 0 R (0:714) 1618 0 R (0:715) 1619 0 R (0:716) 1620 0 R (0:717) 1621 0 R (0:718) 1622 0 R (0:719) 1623 0 R (0:720) 1624 0 R (0:721) 1625 0 R (0:722) 1626 0 R (0:723) 1627 0 R (0:724) 1628 0 R (0:725) 1629 0 R (0:726) 1630 0 R (0:727) 1631 0 R (0:728) 1632 0 R (0:729) 1633 0 R (0:730) 1634 0 R (0:731) 1635 0 R (0:732) 1640 0 R (0:733) 1641 0 R (0:734) 1642 0 R (0:735) 1643 0 R (0:736) 1644 0 R (0:737) 1645 0 R (0:738) 1646 0 R (0:739) 1647 0 R (0:74) 957 0 R (0:740) 1648 0 R (0:741) 1649 0 R (0:742) 1650 0 R (0:743) 1651 0 R (0:744) 1652 0 R (0:745) 1653 0 R (0:746) 1654 0 R (0:747) 1655 0 R (0:748) 1656 0 R (0:749) 1657 0 R (0:750) 1658 0 R (0:751) 1659 0 R (0:752) 1660 0 R (0:753) 1661 0 R (0:754) 1662 0 R (0:755) 1663 0 R (0:756) 1664 0 R (0:757) 1665 0 R (0:758) 1666 0 R (0:759) 1667 0 R (0:76) 959 0 R (0:760) 1668 0 R (0:761) 1669 0 R (0:762) 1670 0 R (0:763) 1671 0 R (0:764) 1672 0 R (0:765) 1673 0 R (0:766) 1674 0 R (0:767) 1675 0 R (0:768) 1676 0 R (0:77) 960 0 R (0:771) 1677 0 R (0:772) 1678 0 R (0:773) 1679 0 R (0:774) 1680 0 R (0:775) 1681 0 R (0:776) 1682 0 R (0:777) 1683 0 R (0:778) 1684 0 R (0:779) 1685 0 R (0:78) 961 0 R (0:780) 1686 0 R (0:781) 1687 0 R (0:782) 1688 0 R (0:783) 1689 0 R (0:784) 1690 0 R (0:785) 1691 0 R (0:786) 1692 0 R (0:787) 1693 0 R (0:788) 1694 0 R (0:789) 1695 0 R (0:79) 962 0 R (0:790) 1700 0 R (0:791) 1701 0 R (0:792) 1702 0 R (0:793) 1703 0 R (0:794) 1704 0 R (0:795) 1705 0 R (0:796) 1706 0 R (0:797) 1707 0 R (0:798) 1708 0 R (0:799) 1709 0 R (0:8) 917 0 R (0:80) 963 0 R (0:800) 1710 0 R (0:801) 1711 0 R (0:802) 1712 0 R (0:803) 1713 0 R (0:804) 1714 0 R (0:805) 1715 0 R (0:806) 1716 0 R (0:807) 1717 0 R (0:808) 1718 0 R (0:809) 1719 0 R (0:812) 1720 0 R (0:813) 1721 0 R (0:814) 1722 0 R (0:815) 1723 0 R (0:816) 1724 0 R (0:817) 1725 0 R (0:818) 1726 0 R (0:819) 1727 0 R (0:820) 1728 0 R (0:821) 1729 0 R (0:822) 1730 0 R (0:823) 1731 0 R (0:824) 1732 0 R (0:825) 1733 0 R (0:826) 1734 0 R (0:827) 1735 0 R (0:828) 1736 0 R (0:829) 1737 0 R (0:830) 1738 0 R (0:831) 1739 0 R (0:832) 1740 0 R (0:833) 1741 0 R (0:834) 1742 0 R (0:835) 1743 0 R (0:836) 1744 0 R (0:837) 1745 0 R (0:838) 1746 0 R (0:839) 1747 0 R (0:84) 965 0 R (0:840) 1748 0 R (0:841) 1753 0 R (0:842) 1754 0 R (0:843) 1755 0 R (0:844) 1756 0 R (0:845) 1757 0 R (0:846) 1758 0 R (0:847) 1759 0 R (0:848) 1760 0 R (0:849) 1761 0 R (0:85) 966 0 R (0:850) 1762 0 R (0:851) 1763 0 R (0:852) 1764 0 R (0:853) 1765 0 R (0:856) 1766 0 R (0:857) 1767 0 R (0:858) 1768 0 R (0:859) 1769 0 R (0:86) 967 0 R (0:860) 1770 0 R (0:861) 1771 0 R (0:862) 1772 0 R (0:863) 1773 0 R (0:864) 1774 0 R (0:865) 1775 0 R (0:866) 1776 0 R (0:867) 1777 0 R (0:868) 1778 0 R (0:869) 1779 0 R (0:87) 968 0 R (0:870) 1780 0 R (0:871) 1781 0 R (0:872) 1782 0 R (0:873) 1783 0 R (0:874) 1784 0 R (0:875) 1785 0 R (0:876) 1786 0 R (0:877) 1787 0 R (0:878) 1788 0 R (0:879) 1789 0 R (0:88) 969 0 R (0:880) 1790 0 R (0:881) 1791 0 R (0:882) 1792 0 R (0:883) 1793 0 R (0:884) 1794 0 R (0:885) 1795 0 R (0:886) 1796 0 R (0:887) 1797 0 R (0:888) 1798 0 R (0:889) 1799 0 R (0:89) 970 0 R (0:890) 1800 0 R (0:891) 1801 0 R (0:892) 1802 0 R (0:893) 1803 0 R (0:894) 1804 0 R (0:895) 1805 0 R (0:896) 1806 0 R (0:897) 1807 0 R (0:898) 1808 0 R (0:899) 1814 0 R (0:90) 627 0 R (0:900) 1815 0 R (0:901) 1816 0 R (0:902) 1817 0 R (0:903) 1818 0 R (0:904) 1819 0 R (0:905) 1820 0 R (0:906) 1821 0 R (0:907) 1822 0 R (0:910) 1823 0 R (0:911) 1824 0 R (0:912) 1825 0 R (0:913) 1826 0 R (0:914) 1827 0 R (0:915) 1828 0 R (0:916) 1829 0 R (0:917) 1830 0 R (0:918) 1831 0 R (0:919) 1832 0 R (0:92) 975 0 R (0:920) 1833 0 R (0:921) 1834 0 R (0:922) 1835 0 R (0:923) 1836 0 R (0:924) 1837 0 R (0:925) 1838 0 R (0:926) 1839 0 R (0:927) 1840 0 R (0:928) 1841 0 R (0:929) 1842 0 R (0:93) 976 0 R (0:930) 1843 0 R (0:931) 1844 0 R (0:932) 1845 0 R (0:933) 1846 0 R (0:934) 1847 0 R (0:935) 1848 0 R (0:936) 1849 0 R (0:937) 1850 0 R (0:938) 1851 0 R (0:939) 1852 0 R (0:94) 980 0 R (0:940) 1853 0 R (0:941) 1854 0 R (0:942) 1855 0 R (0:943) 1856 0 R (0:944) 1857 0 R (0:945) 1858 0 R (0:946) 1859 0 R (0:947) 1865 0 R (0:948) 1866 0 R (0:95) 981 0 R (0:951) 1867 0 R (0:952) 1868 0 R (0:953) 1869 0 R (0:954) 1870 0 R (0:955) 1871 0 R (0:956) 1872 0 R (0:957) 1873 0 R (0:958) 1874 0 R (0:959) 1875 0 R (0:96) 982 0 R (0:960) 1876 0 R (0:961) 1877 0 R (0:962) 1878 0 R (0:963) 1879 0 R (0:964) 1880 0 R (0:965) 1881 0 R (0:966) 1882 0 R (0:967) 1883 0 R (0:968) 1884 0 R (0:969) 1885 0 R (0:97) 983 0 R (0:970) 1886 0 R (0:971) 1887 0 R (0:972) 1888 0 R (0:973) 1889 0 R (0:974) 1890 0 R (0:975) 1891 0 R (0:976) 1892 0 R (0:977) 1893 0 R (0:978) 1894 0 R (0:979) 1895 0 R (0:98) 984 0 R (0:980) 1896 0 R (0:981) 1897 0 R (0:982) 1898 0 R (0:983) 1899 0 R (0:984) 1900 0 R (0:985) 1901 0 R (0:986) 1902 0 R (0:987) 1903 0 R (0:988) 1904 0 R (0:989) 1905 0 R (0:99) 985 0 R (0:992) 1910 0 R (0:993) 1911 0 R (0:994) 1912 0 R (0:995) 1864 0 R (0:998) 1913 0 R (0:999) 1914 0 R (0:AddAddressType) 629 0 R (0:AddAddressTypeToAddress) 630 0 R (0:AddBootState) 631 0 R (0:AddConfFile) 632 0 R (0:AddConfFileToNode) 634 0 R (0:AddConfFileToNodeGroup) 633 0 R (0:AddKeyType) 635 0 R (0:AddMessage) 636 0 R (0:AddNetworkMethod) 637 0 R (0:AddNetworkType) 638 0 R (0:AddNode) 641 0 R (0:AddNodeGroup) 639 0 R (0:AddNodeNetwork) 640 0 R (0:AddNodeToNodeGroup) 642 0 R (0:AddNodeToPCU) 643 0 R (0:AddPCU) 644 0 R (0:AddPeer) 645 0 R (0:AddPerson) 647 0 R (0:AddPersonKey) 646 0 R (0:AddPersonToSite) 648 0 R (0:AddPersonToSlice) 649 0 R (0:AddRole) 650 0 R (0:AddRoleToPerson) 651 0 R (0:AddSite) 653 0 R (0:AddSiteAddress) 652 0 R (0:AddSlice) 657 0 R (0:AddSliceAttribute) 654 0 R (0:AddSliceAttributeType) 655 0 R (0:AddSliceInstantiation) 656 0 R (0:AddSliceToNodes) 658 0 R (0:AuthCheck) 659 0 R (0:Authentication) 624 0 R (0:BlacklistKey) 660 0 R (0:BootGetNodeDetails) 661 0 R (0:BootNotifyOwners) 662 0 R (0:BootUpdateNode) 663 0 R (0:DeleteAddress) 664 0 R (0:DeleteAddressType) 666 0 R (0:DeleteAddressTypeFromAddress) 665 0 R (0:DeleteBootState) 667 0 R (0:DeleteConfFile) 770 0 R (0:DeleteConfFileFromNode) 769 0 R (0:DeleteConfFileFromNodeGroup) 768 0 R (0:DeleteKey) 771 0 R (0:DeleteKeyType) 772 0 R (0:DeleteMessage) 773 0 R (0:DeleteNetworkMethod) 774 0 R (0:DeleteNetworkType) 775 0 R (0:DeleteNode) 780 0 R (0:DeleteNodeFromNodeGroup) 776 0 R (0:DeleteNodeFromPCU) 777 0 R (0:DeleteNodeGroup) 778 0 R (0:DeleteNodeNetwork) 779 0 R (0:DeletePCU) 781 0 R (0:DeletePeer) 782 0 R (0:DeletePerson) 785 0 R (0:DeletePersonFromSite) 783 0 R (0:DeletePersonFromSlice) 784 0 R (0:DeleteRole) 787 0 R (0:DeleteRoleFromPerson) 786 0 R (0:DeleteSession) 788 0 R (0:DeleteSite) 789 0 R (0:DeleteSlice) 794 0 R (0:DeleteSliceAttribute) 790 0 R (0:DeleteSliceAttributeType) 791 0 R (0:DeleteSliceFromNodes) 792 0 R (0:DeleteSliceInstantiation) 793 0 R (0:Filters) 626 0 R (0:GetAddressTypes) 796 0 R (0:GetAddresses) 795 0 R (0:GetBootStates) 797 0 R (0:GetConfFiles) 798 0 R (0:GetEvents) 799 0 R (0:GetKeyTypes) 801 0 R (0:GetKeys) 800 0 R (0:GetMessages) 802 0 R (0:GetNetworkMethods) 803 0 R (0:GetNetworkTypes) 804 0 R (0:GetNodeGroups) 805 0 R (0:GetNodeNetworks) 806 0 R (0:GetNodes) 807 0 R (0:GetPCUs) 808 0 R (0:GetPeerData) 809 0 R (0:GetPeerName) 810 0 R (0:GetPeers) 811 0 R (0:GetPersons) 812 0 R (0:GetRoles) 813 0 R (0:GetSession) 814 0 R (0:GetSites) 815 0 R (0:GetSliceAttributeTypes) 883 0 R (0:GetSliceAttributes) 882 0 R (0:GetSliceInstantiations) 884 0 R (0:GetSliceTicket) 886 0 R (0:GetSlices) 885 0 R (0:GetSlivers) 887 0 R (0:Introduction) 623 0 R (0:Methods) 628 0 R (0:NotifyPersons) 888 0 R (0:RebootNode) 889 0 R (0:RefreshPeer) 890 0 R (0:ResetPassword) 891 0 R (0:Roles) 625 0 R (0:SetPersonPrimarySite) 892 0 R (0:UpdateAddress) 893 0 R (0:UpdateAddressType) 894 0 R (0:UpdateConfFile) 895 0 R (0:UpdateKey) 896 0 R (0:UpdateMessage) 897 0 R (0:UpdateNode) 900 0 R (0:UpdateNodeGroup) 898 0 R (0:UpdateNodeNetwork) 899 0 R (0:UpdatePCU) 901 0 R (0:UpdatePeer) 902 0 R (0:UpdatePerson) 903 0 R (0:UpdateSite) 904 0 R (0:UpdateSlice) 907 0 R (0:UpdateSliceAttribute) 905 0 R (0:UpdateSliceAttributeType) 906 0 R (0:VerifyPerson) 908 0 R (0:system.listMethods) 909 0 R (0:system.methodHelp) 910 0 R (0:system.methodSignature) 911 0 R (0:system.multicall) 912 0 R (1.0) 2 0 R (2.0) 6 0 R (3.0) 10 0 R (3.1.1) 14 0 R (3.2.1) 18 0 R (3.3.1) 22 0 R (3.4.1) 26 0 R (4.0) 30 0 R (4.10.1) 54 0 R (4.100.1) 414 0 R (4.101.1) 418 0 R (4.102.1) 422 0 R (4.103.1) 426 0 R (4.104.1) 430 0 R (4.105.1) 434 0 R (4.106.1) 438 0 R (4.107.1) 442 0 R (4.108.1) 446 0 R (4.109.1) 450 0 R (4.11.1) 58 0 R (4.110.1) 454 0 R (4.111.1) 458 0 R (4.112.1) 462 0 R (4.113.1) 466 0 R (4.114.1) 470 0 R (4.115.1) 474 0 R (4.116.1) 478 0 R (4.117.1) 482 0 R (4.118.1) 486 0 R (4.119.1) 490 0 R (4.12.1) 62 0 R (4.120.1) 494 0 R (4.121.1) 498 0 R (4.122.1) 502 0 R (4.13.1) 66 0 R (4.14.1) 70 0 R (4.15.1) 74 0 R (4.16.1) 78 0 R (4.17.1) 82 0 R (4.18.1) 86 0 R (4.19.1) 90 0 R (4.20.1) 94 0 R (4.21.1) 98 0 R (4.22.1) 102 0 R (4.23.1) 106 0 R (4.24.1) 110 0 R (4.25.1) 114 0 R (4.26.1) 118 0 R (4.27.1) 122 0 R (4.28.1) 126 0 R (4.29.1) 130 0 R (4.30.1) 134 0 R (4.31.1) 138 0 R (4.32.1) 142 0 R (4.33.1) 146 0 R (4.34.1) 150 0 R (4.35.1) 154 0 R (4.36.1) 158 0 R (4.37.1) 162 0 R (4.38.1) 166 0 R (4.39.1) 170 0 R (4.40.1) 174 0 R (4.41.1) 178 0 R (4.42.1) 182 0 R (4.43.1) 186 0 R (4.44.1) 190 0 R (4.45.1) 194 0 R (4.46.1) 198 0 R (4.47.1) 202 0 R (4.48.1) 206 0 R (4.49.1) 210 0 R (4.5.1) 34 0 R (4.50.1) 214 0 R (4.51.1) 218 0 R (4.52.1) 222 0 R (4.53.1) 226 0 R (4.54.1) 230 0 R (4.55.1) 234 0 R (4.56.1) 238 0 R (4.57.1) 242 0 R (4.58.1) 246 0 R (4.59.1) 250 0 R (4.6.1) 38 0 R (4.60.1) 254 0 R (4.61.1) 258 0 R (4.62.1) 262 0 R (4.63.1) 266 0 R (4.64.1) 270 0 R (4.65.1) 274 0 R (4.66.1) 278 0 R (4.67.1) 282 0 R (4.68.1) 286 0 R (4.69.1) 290 0 R (4.7.1) 42 0 R (4.70.1) 294 0 R (4.71.1) 298 0 R (4.72.1) 302 0 R (4.73.1) 306 0 R (4.74.1) 310 0 R (4.75.1) 314 0 R (4.76.1) 318 0 R (4.77.1) 322 0 R (4.78.1) 326 0 R (4.79.1) 330 0 R (4.8.1) 46 0 R (4.80.1) 334 0 R (4.81.1) 338 0 R (4.82.1) 342 0 R (4.83.1) 346 0 R (4.84.1) 350 0 R (4.85.1) 354 0 R (4.86.1) 358 0 R (4.87.1) 362 0 R (4.88.1) 366 0 R (4.89.1) 370 0 R (4.9.1) 50 0 R (4.90.1) 374 0 R (4.91.1) 378 0 R (4.92.1) 382 0 R (4.93.1) 386 0 R (4.94.1) 390 0 R (4.95.1) 394 0 R (4.96.1) 398 0 R (4.97.1) 402 0 R (4.98.1) 406 0 R (4.99.1) 410 0 R (Doc-Start) 510 0 R (page.1) 509 0 R (page.10) 1240 0 R (page.100) 6267 0 R (page.101) 6303 0 R (page.102) 6379 0 R (page.103) 6452 0 R (page.104) 6508 0 R (page.105) 6554 0 R (page.106) 6652 0 R (page.107) 6724 0 R (page.108) 6794 0 R (page.109) 6868 0 R (page.11) 1277 0 R (page.110) 6912 0 R (page.111) 6967 0 R (page.112) 7011 0 R (page.113) 7054 0 R (page.114) 7113 0 R (page.115) 7162 0 R (page.116) 7227 0 R (page.117) 7278 0 R (page.118) 7337 0 R (page.119) 7390 0 R (page.12) 1335 0 R (page.120) 7446 0 R (page.121) 7503 0 R (page.122) 7564 0 R (page.123) 7619 0 R (page.124) 7677 0 R (page.125) 7742 0 R (page.126) 7790 0 R (page.127) 7839 0 R (page.128) 7886 0 R (page.129) 7936 0 R (page.13) 1373 0 R (page.130) 7976 0 R (page.14) 1415 0 R (page.15) 1490 0 R (page.16) 1543 0 R (page.17) 1588 0 R (page.18) 1639 0 R (page.19) 1699 0 R (page.2) 519 0 R (page.20) 1752 0 R (page.21) 1813 0 R (page.22) 1863 0 R (page.23) 1909 0 R (page.24) 1947 0 R (page.25) 1994 0 R (page.26) 2054 0 R (page.27) 2117 0 R (page.28) 2171 0 R (page.29) 2223 0 R (page.3) 523 0 R (page.30) 2274 0 R (page.31) 2320 0 R (page.32) 2354 0 R (page.33) 2421 0 R (page.34) 2489 0 R (page.35) 2551 0 R (page.36) 2607 0 R (page.37) 2652 0 R (page.38) 2691 0 R (page.39) 2739 0 R (page.4) 671 0 R (page.40) 2788 0 R (page.41) 2828 0 R (page.42) 2875 0 R (page.43) 2913 0 R (page.44) 2962 0 R (page.45) 3008 0 R (page.46) 3050 0 R (page.47) 3091 0 R (page.48) 3142 0 R (page.49) 3180 0 R (page.5) 819 0 R (page.50) 3226 0 R (page.51) 3279 0 R (page.52) 3324 0 R (page.53) 3373 0 R (page.54) 3412 0 R (page.55) 3460 0 R (page.56) 3499 0 R (page.57) 3539 0 R (page.58) 3584 0 R (page.59) 3632 0 R (page.6) 1036 0 R (page.60) 3691 0 R (page.61) 3765 0 R (page.62) 3823 0 R (page.63) 3876 0 R (page.64) 3935 0 R (page.65) 4009 0 R (page.66) 4088 0 R (page.67) 4147 0 R (page.68) 4214 0 R (page.69) 4279 0 R (page.7) 1082 0 R (page.70) 4349 0 R (page.71) 4401 0 R (page.72) 4466 0 R (page.73) 4511 0 R (page.74) 4550 0 R (page.75) 4624 0 R (page.76) 4681 0 R (page.77) 4755 0 R (page.78) 4834 0 R (page.79) 4892 0 R (page.8) 1138 0 R (page.80) 4964 0 R (page.81) 5038 0 R (page.82) 5100 0 R (page.83) 5174 0 R (page.84) 5251 0 R (page.85) 5303 0 R (page.86) 5343 0 R (page.87) 5414 0 R (page.88) 5476 0 R (page.89) 5533 0 R (page.9) 1198 0 R (page.90) 5607 0 R (page.91) 5679 0 R (page.92) 5742 0 R (page.93) 5789 0 R (page.94) 5859 0 R (page.95) 5931 0 R (page.96) 6008 0 R (page.97) 6064 0 R (page.98) 6136 0 R (page.99) 6195 0 R (table.1) 932 0 R (table.2) 940 0 R (table.3) 948 0 R (table.4) 956 0 R] +/Limits [(0:0) (table.4)] +>> endobj +8034 0 obj << +/Kids [8033 0 R] +>> endobj +8035 0 obj << +/Dests 8034 0 R +>> endobj +8036 0 obj << +/Type /Catalog +/Pages 8031 0 R +/Outlines 8032 0 R +/Names 8035 0 R +/PageMode /UseOutlines +/OpenAction 505 0 R +>> endobj +8037 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() +/CreationDate (D:20070219130429-05'00') +/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) +>> endobj +xref +0 8038 +0000000000 65535 f +0000000009 00000 n +0000011173 00000 n +0000948077 00000 n +0000000048 00000 n +0000000101 00000 n +0000081281 00000 n +0000947992 00000 n +0000000140 00000 n +0000000175 00000 n +0000203694 00000 n +0000947868 00000 n +0000000214 00000 n +0000000256 00000 n +0000203880 00000 n +0000947794 00000 n +0000000298 00000 n +0000000336 00000 n +0000207492 00000 n +0000947707 00000 n +0000000378 00000 n +0000000407 00000 n +0000207996 00000 n +0000947620 00000 n +0000000449 00000 n +0000000480 00000 n +0000210273 00000 n +0000947546 00000 n +0000000522 00000 n +0000000561 00000 n +0000213260 00000 n +0000947430 00000 n +0000000601 00000 n +0000000652 00000 n +0000213446 00000 n +0000947356 00000 n +0000000694 00000 n +0000000732 00000 n +0000215663 00000 n +0000947269 00000 n +0000000774 00000 n +0000000821 00000 n +0000219417 00000 n +0000947182 00000 n +0000000863 00000 n +0000000899 00000 n +0000222682 00000 n +0000947095 00000 n +0000000941 00000 n +0000000976 00000 n +0000228587 00000 n +0000947008 00000 n +0000001018 00000 n +0000001064 00000 n +0000232267 00000 n +0000946921 00000 n +0000001107 00000 n +0000001148 00000 n +0000235782 00000 n +0000946834 00000 n +0000001191 00000 n +0000001225 00000 n +0000237394 00000 n +0000946747 00000 n +0000001268 00000 n +0000001302 00000 n +0000241511 00000 n +0000946660 00000 n +0000001345 00000 n +0000001385 00000 n +0000244502 00000 n +0000946573 00000 n +0000001428 00000 n +0000001467 00000 n +0000246308 00000 n +0000946486 00000 n +0000001510 00000 n +0000001547 00000 n +0000250137 00000 n +0000946399 00000 n +0000001590 00000 n +0000001629 00000 n +0000257129 00000 n +0000946312 00000 n +0000001672 00000 n +0000001704 00000 n +0000262063 00000 n +0000946225 00000 n +0000001747 00000 n +0000001790 00000 n +0000266018 00000 n +0000946138 00000 n +0000001833 00000 n +0000001870 00000 n +0000270044 00000 n +0000946051 00000 n +0000001913 00000 n +0000001944 00000 n +0000275462 00000 n +0000945962 00000 n +0000001987 00000 n +0000002020 00000 n +0000279667 00000 n +0000945871 00000 n +0000002064 00000 n +0000002102 00000 n +0000284156 00000 n +0000945779 00000 n +0000002146 00000 n +0000002181 00000 n +0000289217 00000 n +0000945687 00000 n +0000002225 00000 n +0000002266 00000 n +0000293347 00000 n +0000945595 00000 n +0000002310 00000 n +0000002352 00000 n +0000297294 00000 n +0000945503 00000 n +0000002396 00000 n +0000002429 00000 n +0000299104 00000 n +0000945411 00000 n +0000002473 00000 n +0000002514 00000 n +0000303255 00000 n +0000945319 00000 n +0000002558 00000 n +0000002598 00000 n +0000308697 00000 n +0000945227 00000 n +0000002642 00000 n +0000002675 00000 n +0000314496 00000 n +0000945135 00000 n +0000002719 00000 n +0000002762 00000 n +0000319489 00000 n +0000945043 00000 n +0000002806 00000 n +0000002853 00000 n +0000323303 00000 n +0000944951 00000 n +0000002897 00000 n +0000002944 00000 n +0000326884 00000 n +0000944859 00000 n +0000002988 00000 n +0000003022 00000 n +0000331335 00000 n +0000944767 00000 n +0000003066 00000 n +0000003107 00000 n +0000335334 00000 n +0000944675 00000 n +0000003151 00000 n +0000003186 00000 n +0000336686 00000 n +0000944583 00000 n +0000003230 00000 n +0000003268 00000 n +0000340191 00000 n +0000944491 00000 n +0000003312 00000 n +0000003356 00000 n +0000348055 00000 n +0000944399 00000 n +0000003400 00000 n +0000003442 00000 n +0000352503 00000 n +0000944307 00000 n +0000003486 00000 n +0000003526 00000 n +0000358634 00000 n +0000944215 00000 n +0000003570 00000 n +0000003609 00000 n +0000361873 00000 n +0000944123 00000 n +0000003653 00000 n +0000003707 00000 n +0000365554 00000 n +0000944031 00000 n +0000003751 00000 n +0000003794 00000 n +0000367491 00000 n +0000943939 00000 n +0000003838 00000 n +0000003879 00000 n +0000370681 00000 n +0000943847 00000 n +0000003923 00000 n +0000003976 00000 n +0000374504 00000 n +0000943755 00000 n +0000004020 00000 n +0000004068 00000 n +0000378165 00000 n +0000943663 00000 n +0000004112 00000 n +0000004152 00000 n +0000379909 00000 n +0000943571 00000 n +0000004196 00000 n +0000004231 00000 n +0000383041 00000 n +0000943479 00000 n +0000004275 00000 n +0000004314 00000 n +0000386127 00000 n +0000943387 00000 n +0000004358 00000 n +0000004397 00000 n +0000387934 00000 n +0000943295 00000 n +0000004441 00000 n +0000004486 00000 n +0000391133 00000 n +0000943203 00000 n +0000004530 00000 n +0000004573 00000 n +0000394384 00000 n +0000943111 00000 n +0000004617 00000 n +0000004666 00000 n +0000398436 00000 n +0000943019 00000 n +0000004710 00000 n +0000004753 00000 n +0000400629 00000 n +0000942927 00000 n +0000004797 00000 n +0000004838 00000 n +0000404087 00000 n +0000942835 00000 n +0000004882 00000 n +0000004925 00000 n +0000407420 00000 n +0000942743 00000 n +0000004969 00000 n +0000005005 00000 n +0000410808 00000 n +0000942651 00000 n +0000005049 00000 n +0000005084 00000 n +0000412681 00000 n +0000942559 00000 n +0000005128 00000 n +0000005164 00000 n +0000416186 00000 n +0000942467 00000 n +0000005208 00000 n +0000005254 00000 n +0000420352 00000 n +0000942375 00000 n +0000005298 00000 n +0000005345 00000 n +0000424472 00000 n +0000942283 00000 n +0000005389 00000 n +0000005427 00000 n +0000428197 00000 n +0000942191 00000 n +0000005471 00000 n +0000005517 00000 n +0000432284 00000 n +0000942099 00000 n +0000005561 00000 n +0000005597 00000 n +0000434285 00000 n +0000942007 00000 n +0000005641 00000 n +0000005680 00000 n +0000437468 00000 n +0000941915 00000 n +0000005724 00000 n +0000005760 00000 n +0000441085 00000 n +0000941823 00000 n +0000005804 00000 n +0000005850 00000 n +0000444349 00000 n +0000941731 00000 n +0000005894 00000 n +0000005944 00000 n +0000446279 00000 n +0000941639 00000 n +0000005988 00000 n +0000006034 00000 n +0000450203 00000 n +0000941547 00000 n +0000006078 00000 n +0000006128 00000 n +0000453420 00000 n +0000941455 00000 n +0000006172 00000 n +0000006209 00000 n +0000457250 00000 n +0000941363 00000 n +0000006253 00000 n +0000006291 00000 n +0000469578 00000 n +0000941271 00000 n +0000006335 00000 n +0000006376 00000 n +0000476089 00000 n +0000941179 00000 n +0000006420 00000 n +0000006459 00000 n +0000479279 00000 n +0000941087 00000 n +0000006503 00000 n +0000006541 00000 n +0000497497 00000 n +0000940995 00000 n +0000006585 00000 n +0000006620 00000 n +0000511301 00000 n +0000940903 00000 n +0000006664 00000 n +0000006697 00000 n +0000521547 00000 n +0000940811 00000 n +0000006741 00000 n +0000006778 00000 n +0000523095 00000 n +0000940719 00000 n +0000006822 00000 n +0000006859 00000 n +0000531617 00000 n +0000940627 00000 n +0000006903 00000 n +0000006946 00000 n +0000534470 00000 n +0000940535 00000 n +0000006990 00000 n +0000007031 00000 n +0000535822 00000 n +0000940443 00000 n +0000007075 00000 n +0000007114 00000 n +0000545113 00000 n +0000940351 00000 n +0000007158 00000 n +0000007199 00000 n +0000563804 00000 n +0000940259 00000 n +0000007243 00000 n +0000007277 00000 n +0000584619 00000 n +0000940167 00000 n +0000007321 00000 n +0000007354 00000 n +0000599420 00000 n +0000940075 00000 n +0000007398 00000 n +0000007435 00000 n +0000604504 00000 n +0000939983 00000 n +0000007479 00000 n +0000007516 00000 n +0000606052 00000 n +0000939891 00000 n +0000007560 00000 n +0000007594 00000 n +0000619578 00000 n +0000939799 00000 n +0000007638 00000 n +0000007674 00000 n +0000640255 00000 n +0000939707 00000 n +0000007718 00000 n +0000007752 00000 n +0000643567 00000 n +0000939615 00000 n +0000007796 00000 n +0000007832 00000 n +0000645114 00000 n +0000939523 00000 n +0000007876 00000 n +0000007910 00000 n +0000668222 00000 n +0000939431 00000 n +0000007954 00000 n +0000007998 00000 n +0000680047 00000 n +0000939339 00000 n +0000008042 00000 n +0000008090 00000 n +0000688897 00000 n +0000939247 00000 n +0000008134 00000 n +0000008182 00000 n +0000690443 00000 n +0000939155 00000 n +0000008226 00000 n +0000008261 00000 n +0000708780 00000 n +0000939063 00000 n +0000008305 00000 n +0000008345 00000 n +0000712401 00000 n +0000938971 00000 n +0000008389 00000 n +0000008425 00000 n +0000728200 00000 n +0000938879 00000 n +0000008469 00000 n +0000008508 00000 n +0000744453 00000 n +0000938787 00000 n +0000008552 00000 n +0000008588 00000 n +0000748138 00000 n +0000938695 00000 n +0000008633 00000 n +0000008670 00000 n +0000751851 00000 n +0000938603 00000 n +0000008715 00000 n +0000008754 00000 n +0000755914 00000 n +0000938511 00000 n +0000008799 00000 n +0000008845 00000 n +0000758361 00000 n +0000938419 00000 n +0000008890 00000 n +0000008929 00000 n +0000763477 00000 n +0000938327 00000 n +0000008974 00000 n +0000009018 00000 n +0000767718 00000 n +0000938235 00000 n +0000009063 00000 n +0000009104 00000 n +0000773784 00000 n +0000938143 00000 n +0000009149 00000 n +0000009185 00000 n +0000777493 00000 n +0000938051 00000 n +0000009230 00000 n +0000009270 00000 n +0000781536 00000 n +0000937959 00000 n +0000009315 00000 n +0000009357 00000 n +0000786030 00000 n +0000937867 00000 n +0000009402 00000 n +0000009446 00000 n +0000792441 00000 n +0000937775 00000 n +0000009491 00000 n +0000009528 00000 n +0000797898 00000 n +0000937683 00000 n +0000009573 00000 n +0000009609 00000 n +0000803813 00000 n +0000937591 00000 n +0000009654 00000 n +0000009691 00000 n +0000808595 00000 n +0000937499 00000 n +0000009736 00000 n +0000009775 00000 n +0000814505 00000 n +0000937407 00000 n +0000009820 00000 n +0000009857 00000 n +0000820670 00000 n +0000937315 00000 n +0000009902 00000 n +0000009949 00000 n +0000824143 00000 n +0000937223 00000 n +0000009994 00000 n +0000010045 00000 n +0000828773 00000 n +0000937131 00000 n +0000010090 00000 n +0000010128 00000 n +0000834079 00000 n +0000937039 00000 n +0000010173 00000 n +0000010212 00000 n +0000838214 00000 n +0000936947 00000 n +0000010257 00000 n +0000010302 00000 n +0000840691 00000 n +0000936855 00000 n +0000010347 00000 n +0000010391 00000 n +0000841786 00000 n +0000936763 00000 n +0000010436 00000 n +0000010485 00000 n +0000844649 00000 n +0000936685 00000 n +0000010530 00000 n +0000010573 00000 n +0000010865 00000 n +0000011234 00000 n +0000010625 00000 n +0000010987 00000 n +0000011049 00000 n +0000011111 00000 n +0000932562 00000 n +0000921067 00000 n +0000932389 00000 n +0000933189 00000 n +0000011728 00000 n +0000011544 00000 n +0000011306 00000 n +0000011666 00000 n +0000081342 00000 n +0000065810 00000 n +0000011800 00000 n +0000081219 00000 n +0000066664 00000 n +0000920584 00000 n +0000911162 00000 n +0000920408 00000 n +0000066825 00000 n +0000066985 00000 n +0000910199 00000 n +0000891691 00000 n +0000910024 00000 n +0000067148 00000 n +0000067310 00000 n +0000067462 00000 n +0000067613 00000 n +0000067769 00000 n +0000067924 00000 n +0000068075 00000 n +0000068225 00000 n +0000068381 00000 n +0000068536 00000 n +0000068698 00000 n +0000068860 00000 n +0000069032 00000 n +0000069203 00000 n +0000069364 00000 n +0000069524 00000 n +0000069684 00000 n +0000069843 00000 n +0000070014 00000 n +0000070184 00000 n +0000070349 00000 n +0000070513 00000 n +0000070671 00000 n +0000070829 00000 n +0000070988 00000 n +0000071147 00000 n +0000071312 00000 n +0000071477 00000 n +0000071640 00000 n +0000071803 00000 n +0000071964 00000 n +0000072125 00000 n +0000072288 00000 n +0000072451 00000 n +0000072606 00000 n +0000072761 00000 n +0000072928 00000 n +0000073095 00000 n +0000073256 00000 n +0000073417 00000 n +0000073571 00000 n +0000073726 00000 n +0000073882 00000 n +0000074038 00000 n +0000074199 00000 n +0000074360 00000 n +0000074518 00000 n +0000074676 00000 n +0000074838 00000 n +0000075001 00000 n +0000075166 00000 n +0000075331 00000 n +0000075487 00000 n +0000075643 00000 n +0000075806 00000 n +0000075969 00000 n +0000076132 00000 n +0000076295 00000 n +0000076451 00000 n +0000076607 00000 n +0000076773 00000 n +0000076939 00000 n +0000077107 00000 n +0000077275 00000 n +0000077445 00000 n +0000077615 00000 n +0000077772 00000 n +0000077929 00000 n +0000078092 00000 n +0000078255 00000 n +0000078413 00000 n +0000078571 00000 n +0000078732 00000 n +0000078893 00000 n +0000079060 00000 n +0000079227 00000 n +0000079391 00000 n +0000079555 00000 n +0000079718 00000 n +0000079881 00000 n +0000080043 00000 n +0000080205 00000 n +0000080382 00000 n +0000080559 00000 n +0000080725 00000 n +0000080891 00000 n +0000081055 00000 n +0000891140 00000 n +0000880124 00000 n +0000890960 00000 n +0000203632 00000 n +0000203818 00000 n +0000207430 00000 n +0000207934 00000 n +0000208437 00000 n +0000213198 00000 n +0000213384 00000 n +0000215601 00000 n +0000219354 00000 n +0000222619 00000 n +0000228524 00000 n +0000232204 00000 n +0000234529 00000 n +0000237333 00000 n +0000241448 00000 n +0000239514 00000 n +0000246245 00000 n +0000250074 00000 n +0000257066 00000 n +0000262000 00000 n +0000265955 00000 n +0000269981 00000 n +0000275399 00000 n +0000279604 00000 n +0000284093 00000 n +0000289154 00000 n +0000293284 00000 n +0000295932 00000 n +0000299041 00000 n +0000303192 00000 n +0000308634 00000 n +0000314433 00000 n +0000319426 00000 n +0000323240 00000 n +0000326821 00000 n +0000326500 00000 n +0000333988 00000 n +0000336623 00000 n +0000340129 00000 n +0000347992 00000 n +0000352440 00000 n +0000358571 00000 n +0000361810 00000 n +0000364201 00000 n +0000367428 00000 n +0000154083 00000 n +0000137494 00000 n +0000081453 00000 n +0000154021 00000 n +0000138396 00000 n +0000138572 00000 n +0000138748 00000 n +0000138919 00000 n +0000139090 00000 n +0000139252 00000 n +0000139415 00000 n +0000139573 00000 n +0000139731 00000 n +0000139893 00000 n +0000140055 00000 n +0000140217 00000 n +0000140379 00000 n +0000140547 00000 n +0000140715 00000 n +0000140881 00000 n +0000141047 00000 n +0000141219 00000 n +0000141391 00000 n +0000141557 00000 n +0000141723 00000 n +0000141887 00000 n +0000142051 00000 n +0000142217 00000 n +0000142383 00000 n +0000142542 00000 n +0000142701 00000 n +0000142859 00000 n +0000143017 00000 n +0000143176 00000 n +0000143335 00000 n +0000143504 00000 n +0000143673 00000 n +0000143842 00000 n +0000144011 00000 n +0000144172 00000 n +0000144333 00000 n +0000144502 00000 n +0000144671 00000 n +0000144830 00000 n +0000144989 00000 n +0000145151 00000 n +0000145313 00000 n +0000145472 00000 n +0000145631 00000 n +0000145799 00000 n +0000145967 00000 n +0000146140 00000 n +0000146313 00000 n +0000146482 00000 n +0000146651 00000 n +0000146824 00000 n +0000146997 00000 n +0000147157 00000 n +0000147317 00000 n +0000147477 00000 n +0000147638 00000 n +0000147802 00000 n +0000147966 00000 n +0000148127 00000 n +0000148288 00000 n +0000148449 00000 n +0000148610 00000 n +0000148768 00000 n +0000148926 00000 n +0000149082 00000 n +0000149238 00000 n +0000149398 00000 n +0000149558 00000 n +0000149718 00000 n +0000149878 00000 n +0000150044 00000 n +0000150210 00000 n +0000150371 00000 n +0000150533 00000 n +0000150695 00000 n +0000150857 00000 n +0000151021 00000 n +0000151185 00000 n +0000151342 00000 n +0000151499 00000 n +0000151655 00000 n +0000151811 00000 n +0000151971 00000 n +0000152131 00000 n +0000152290 00000 n +0000152450 00000 n +0000152606 00000 n +0000152762 00000 n +0000152921 00000 n +0000153080 00000 n +0000153237 00000 n +0000153394 00000 n +0000153553 00000 n +0000153712 00000 n +0000153866 00000 n +0000370618 00000 n +0000374441 00000 n +0000376764 00000 n +0000379846 00000 n +0000382978 00000 n +0000384851 00000 n +0000387873 00000 n +0000391070 00000 n +0000389776 00000 n +0000396970 00000 n +0000400566 00000 n +0000404024 00000 n +0000407358 00000 n +0000406260 00000 n +0000412618 00000 n +0000416123 00000 n +0000420289 00000 n +0000424409 00000 n +0000428134 00000 n +0000430848 00000 n +0000434222 00000 n +0000437405 00000 n +0000441022 00000 n +0000442896 00000 n +0000446216 00000 n +0000450140 00000 n +0000453357 00000 n +0000457187 00000 n +0000469515 00000 n +0000476028 00000 n +0000479216 00000 n +0000497434 00000 n +0000511238 00000 n +0000521484 00000 n +0000523032 00000 n +0000531554 00000 n +0000533104 00000 n +0000535759 00000 n +0000545050 00000 n +0000563741 00000 n +0000584556 00000 n +0000593139 00000 n +0000604441 00000 n +0000605989 00000 n +0000617769 00000 n +0000640192 00000 n +0000643504 00000 n +0000645051 00000 n +0000200308 00000 n +0000189491 00000 n +0000154168 00000 n +0000200246 00000 n +0000190121 00000 n +0000190288 00000 n +0000190455 00000 n +0000190626 00000 n +0000190797 00000 n +0000190968 00000 n +0000191139 00000 n +0000191296 00000 n +0000191453 00000 n +0000191616 00000 n +0000191779 00000 n +0000191938 00000 n +0000192097 00000 n +0000192258 00000 n +0000192419 00000 n +0000192578 00000 n +0000192737 00000 n +0000192896 00000 n +0000193056 00000 n +0000193218 00000 n +0000193380 00000 n +0000193548 00000 n +0000193717 00000 n +0000193879 00000 n +0000194041 00000 n +0000194207 00000 n +0000194373 00000 n +0000194535 00000 n +0000194697 00000 n +0000194855 00000 n +0000195013 00000 n +0000195175 00000 n +0000195337 00000 n +0000195501 00000 n +0000195665 00000 n +0000195831 00000 n +0000195997 00000 n +0000196156 00000 n +0000196315 00000 n +0000196473 00000 n +0000196631 00000 n +0000196789 00000 n +0000196947 00000 n +0000197108 00000 n +0000197269 00000 n +0000197427 00000 n +0000197585 00000 n +0000197754 00000 n +0000197923 00000 n +0000198096 00000 n +0000198269 00000 n +0000198429 00000 n +0000198589 00000 n +0000198750 00000 n +0000198911 00000 n +0000199078 00000 n +0000199245 00000 n +0000199411 00000 n +0000199577 00000 n +0000199746 00000 n +0000199916 00000 n +0000200081 00000 n +0000668159 00000 n +0000679984 00000 n +0000688834 00000 n +0000690380 00000 n +0000708717 00000 n +0000712338 00000 n +0000728137 00000 n +0000744390 00000 n +0000748075 00000 n +0000746655 00000 n +0000754377 00000 n +0000758298 00000 n +0000763414 00000 n +0000767655 00000 n +0000773721 00000 n +0000777430 00000 n +0000781473 00000 n +0000785967 00000 n +0000792378 00000 n +0000797835 00000 n +0000803750 00000 n +0000808532 00000 n +0000814442 00000 n +0000820607 00000 n +0000824080 00000 n +0000828710 00000 n +0000834016 00000 n +0000838153 00000 n +0000839377 00000 n +0000841723 00000 n +0000840628 00000 n +0000205066 00000 n +0000202132 00000 n +0000200393 00000 n +0000203756 00000 n +0000203943 00000 n +0000202330 00000 n +0000202497 00000 n +0000202668 00000 n +0000202833 00000 n +0000204005 00000 n +0000879590 00000 n +0000868648 00000 n +0000879413 00000 n +0000204069 00000 n +0000204131 00000 n +0000204193 00000 n +0000202998 00000 n +0000204257 00000 n +0000204319 00000 n +0000204381 00000 n +0000867827 00000 n +0000851190 00000 n +0000867654 00000 n +0000204443 00000 n +0000204506 00000 n +0000204570 00000 n +0000204631 00000 n +0000204693 00000 n +0000204755 00000 n +0000204818 00000 n +0000203156 00000 n +0000203317 00000 n +0000203473 00000 n +0000204882 00000 n +0000204944 00000 n +0000205005 00000 n +0000208499 00000 n +0000206648 00000 n +0000205190 00000 n +0000207117 00000 n +0000207180 00000 n +0000207244 00000 n +0000207306 00000 n +0000207368 00000 n +0000207555 00000 n +0000206798 00000 n +0000207617 00000 n +0000207678 00000 n +0000207742 00000 n +0000207806 00000 n +0000207870 00000 n +0000206954 00000 n +0000208059 00000 n +0000208121 00000 n +0000208185 00000 n +0000208247 00000 n +0000208309 00000 n +0000208373 00000 n +0000933307 00000 n +0000211086 00000 n +0000210151 00000 n +0000208610 00000 n +0000210336 00000 n +0000210398 00000 n +0000848967 00000 n +0000847474 00000 n +0000848804 00000 n +0000210462 00000 n +0000210524 00000 n +0000210586 00000 n +0000210648 00000 n +0000210710 00000 n +0000210772 00000 n +0000210834 00000 n +0000210896 00000 n +0000210960 00000 n +0000211024 00000 n +0000212021 00000 n +0000211899 00000 n +0000211223 00000 n +0000215915 00000 n +0000213076 00000 n +0000212106 00000 n +0000213322 00000 n +0000213509 00000 n +0000213571 00000 n +0000213635 00000 n +0000213697 00000 n +0000213760 00000 n +0000213825 00000 n +0000213888 00000 n +0000213951 00000 n +0000214014 00000 n +0000214078 00000 n +0000214141 00000 n +0000214204 00000 n +0000214267 00000 n +0000214330 00000 n +0000214394 00000 n +0000214458 00000 n +0000214521 00000 n +0000214584 00000 n +0000214648 00000 n +0000214712 00000 n +0000214776 00000 n +0000214841 00000 n +0000214906 00000 n +0000214968 00000 n +0000215030 00000 n +0000215093 00000 n +0000215156 00000 n +0000215219 00000 n +0000215283 00000 n +0000215347 00000 n +0000215410 00000 n +0000215473 00000 n +0000215536 00000 n +0000215726 00000 n +0000215788 00000 n +0000215852 00000 n +0000220062 00000 n +0000217031 00000 n +0000216026 00000 n +0000217156 00000 n +0000217220 00000 n +0000217284 00000 n +0000217348 00000 n +0000217414 00000 n +0000217478 00000 n +0000217542 00000 n +0000217606 00000 n +0000217670 00000 n +0000217736 00000 n +0000217800 00000 n +0000217864 00000 n +0000217928 00000 n +0000217992 00000 n +0000218058 00000 n +0000218124 00000 n +0000218188 00000 n +0000218252 00000 n +0000218317 00000 n +0000218382 00000 n +0000218447 00000 n +0000218513 00000 n +0000218579 00000 n +0000218643 00000 n +0000218707 00000 n +0000218772 00000 n +0000218835 00000 n +0000218900 00000 n +0000218965 00000 n +0000219031 00000 n +0000219097 00000 n +0000219161 00000 n +0000219225 00000 n +0000219288 00000 n +0000219481 00000 n +0000219545 00000 n +0000219611 00000 n +0000219675 00000 n +0000219738 00000 n +0000219804 00000 n +0000219868 00000 n +0000219932 00000 n +0000219996 00000 n +0000225075 00000 n +0000221395 00000 n +0000220174 00000 n +0000221520 00000 n +0000221584 00000 n +0000221648 00000 n +0000221712 00000 n +0000221776 00000 n +0000221842 00000 n +0000221908 00000 n +0000221971 00000 n +0000222034 00000 n +0000222099 00000 n +0000222164 00000 n +0000222229 00000 n +0000222295 00000 n +0000222361 00000 n +0000222425 00000 n +0000222489 00000 n +0000222553 00000 n +0000222746 00000 n +0000222810 00000 n +0000222876 00000 n +0000222940 00000 n +0000223004 00000 n +0000223070 00000 n +0000223134 00000 n +0000223198 00000 n +0000223262 00000 n +0000223328 00000 n +0000223392 00000 n +0000223456 00000 n +0000223520 00000 n +0000223584 00000 n +0000223650 00000 n +0000223716 00000 n +0000223780 00000 n +0000223844 00000 n +0000223909 00000 n +0000223974 00000 n +0000224039 00000 n +0000224105 00000 n +0000224171 00000 n +0000224235 00000 n +0000224299 00000 n +0000224364 00000 n +0000224429 00000 n +0000224493 00000 n +0000224558 00000 n +0000224623 00000 n +0000224687 00000 n +0000224752 00000 n +0000224817 00000 n +0000224881 00000 n +0000224946 00000 n +0000225011 00000 n +0000230588 00000 n +0000226718 00000 n +0000225187 00000 n +0000226844 00000 n +0000226908 00000 n +0000226972 00000 n +0000227037 00000 n +0000227102 00000 n +0000227166 00000 n +0000227231 00000 n +0000227296 00000 n +0000227360 00000 n +0000227425 00000 n +0000227490 00000 n +0000227554 00000 n +0000227619 00000 n +0000227684 00000 n +0000227748 00000 n +0000227813 00000 n +0000227878 00000 n +0000227942 00000 n +0000228007 00000 n +0000228072 00000 n +0000228136 00000 n +0000228201 00000 n +0000228266 00000 n +0000228330 00000 n +0000228394 00000 n +0000228458 00000 n +0000228651 00000 n +0000228715 00000 n +0000228780 00000 n +0000228844 00000 n +0000228908 00000 n +0000228974 00000 n +0000229038 00000 n +0000229102 00000 n +0000229166 00000 n +0000229232 00000 n +0000229296 00000 n +0000229359 00000 n +0000229423 00000 n +0000229487 00000 n +0000229553 00000 n +0000229619 00000 n +0000229683 00000 n +0000229747 00000 n +0000229811 00000 n +0000229875 00000 n +0000229940 00000 n +0000230006 00000 n +0000230072 00000 n +0000230136 00000 n +0000230202 00000 n +0000230268 00000 n +0000230332 00000 n +0000230396 00000 n +0000230459 00000 n +0000230523 00000 n +0000933427 00000 n +0000234592 00000 n +0000231756 00000 n +0000230700 00000 n +0000231882 00000 n +0000231946 00000 n +0000232010 00000 n +0000232074 00000 n +0000232138 00000 n +0000232331 00000 n +0000232395 00000 n +0000232461 00000 n +0000232525 00000 n +0000232589 00000 n +0000232655 00000 n +0000232719 00000 n +0000232783 00000 n +0000232847 00000 n +0000232913 00000 n +0000232977 00000 n +0000233041 00000 n +0000233105 00000 n +0000233169 00000 n +0000233235 00000 n +0000233301 00000 n +0000233365 00000 n +0000233429 00000 n +0000233494 00000 n +0000233559 00000 n +0000233624 00000 n +0000233690 00000 n +0000233756 00000 n +0000233819 00000 n +0000233884 00000 n +0000233949 00000 n +0000234013 00000 n +0000234077 00000 n +0000234142 00000 n +0000234206 00000 n +0000234271 00000 n +0000234335 00000 n +0000234399 00000 n +0000234463 00000 n +0000238104 00000 n +0000235592 00000 n +0000234704 00000 n +0000235718 00000 n +0000235846 00000 n +0000235910 00000 n +0000235976 00000 n +0000236040 00000 n +0000236104 00000 n +0000236168 00000 n +0000236234 00000 n +0000236298 00000 n +0000236362 00000 n +0000236426 00000 n +0000236490 00000 n +0000236556 00000 n +0000236622 00000 n +0000236686 00000 n +0000236750 00000 n +0000236815 00000 n +0000236880 00000 n +0000236945 00000 n +0000237010 00000 n +0000237075 00000 n +0000237139 00000 n +0000237203 00000 n +0000237267 00000 n +0000237458 00000 n +0000237522 00000 n +0000237588 00000 n +0000237652 00000 n +0000237716 00000 n +0000237782 00000 n +0000237846 00000 n +0000237910 00000 n +0000237974 00000 n +0000238040 00000 n +0000243191 00000 n +0000239324 00000 n +0000238216 00000 n +0000239450 00000 n +0000239577 00000 n +0000239641 00000 n +0000239705 00000 n +0000239769 00000 n +0000239835 00000 n +0000239901 00000 n +0000239965 00000 n +0000240029 00000 n +0000240094 00000 n +0000240159 00000 n +0000240224 00000 n +0000240289 00000 n +0000240354 00000 n +0000240418 00000 n +0000240482 00000 n +0000240547 00000 n +0000240612 00000 n +0000240676 00000 n +0000240741 00000 n +0000240806 00000 n +0000240870 00000 n +0000240935 00000 n +0000241000 00000 n +0000241064 00000 n +0000241128 00000 n +0000241192 00000 n +0000241255 00000 n +0000241318 00000 n +0000241382 00000 n +0000241575 00000 n +0000241639 00000 n +0000241705 00000 n +0000241769 00000 n +0000241833 00000 n +0000241899 00000 n +0000241963 00000 n +0000242027 00000 n +0000242091 00000 n +0000242156 00000 n +0000242220 00000 n +0000242284 00000 n +0000242348 00000 n +0000242412 00000 n +0000242478 00000 n +0000242544 00000 n +0000242608 00000 n +0000242672 00000 n +0000242737 00000 n +0000242802 00000 n +0000242867 00000 n +0000242933 00000 n +0000242999 00000 n +0000243063 00000 n +0000243127 00000 n +0000246824 00000 n +0000244246 00000 n +0000243303 00000 n +0000244372 00000 n +0000244436 00000 n +0000244566 00000 n +0000244630 00000 n +0000244696 00000 n +0000244760 00000 n +0000244823 00000 n +0000244889 00000 n +0000244953 00000 n +0000245017 00000 n +0000245081 00000 n +0000245147 00000 n +0000245211 00000 n +0000245275 00000 n +0000245339 00000 n +0000245402 00000 n +0000245468 00000 n +0000245534 00000 n +0000245598 00000 n +0000245662 00000 n +0000245727 00000 n +0000245792 00000 n +0000245856 00000 n +0000245922 00000 n +0000245988 00000 n +0000246052 00000 n +0000246115 00000 n +0000246179 00000 n +0000246372 00000 n +0000246436 00000 n +0000246502 00000 n +0000246566 00000 n +0000246630 00000 n +0000246696 00000 n +0000246760 00000 n +0000250972 00000 n +0000248202 00000 n +0000246936 00000 n +0000248328 00000 n +0000248392 00000 n +0000248456 00000 n +0000248522 00000 n +0000248586 00000 n +0000248650 00000 n +0000248714 00000 n +0000248778 00000 n +0000248844 00000 n +0000248910 00000 n +0000248974 00000 n +0000249038 00000 n +0000249103 00000 n +0000249168 00000 n +0000249233 00000 n +0000249299 00000 n +0000249365 00000 n +0000249429 00000 n +0000249493 00000 n +0000249558 00000 n +0000249623 00000 n +0000249687 00000 n +0000249752 00000 n +0000249817 00000 n +0000249881 00000 n +0000249945 00000 n +0000250009 00000 n +0000250201 00000 n +0000250264 00000 n +0000250330 00000 n +0000250394 00000 n +0000250458 00000 n +0000250522 00000 n +0000250586 00000 n +0000250650 00000 n +0000250714 00000 n +0000250778 00000 n +0000250842 00000 n +0000250908 00000 n +0000257515 00000 n +0000252685 00000 n +0000251084 00000 n +0000252811 00000 n +0000252875 00000 n +0000252939 00000 n +0000253003 00000 n +0000253067 00000 n +0000253131 00000 n +0000253197 00000 n +0000253263 00000 n +0000253327 00000 n +0000253391 00000 n +0000253456 00000 n +0000253521 00000 n +0000253586 00000 n +0000253651 00000 n +0000253716 00000 n +0000253780 00000 n +0000253844 00000 n +0000253909 00000 n +0000253973 00000 n +0000254038 00000 n +0000254103 00000 n +0000254168 00000 n +0000254233 00000 n +0000254296 00000 n +0000254359 00000 n +0000254424 00000 n +0000254489 00000 n +0000254553 00000 n +0000254618 00000 n +0000254683 00000 n +0000254747 00000 n +0000254812 00000 n +0000254877 00000 n +0000254941 00000 n +0000255004 00000 n +0000255067 00000 n +0000255131 00000 n +0000255196 00000 n +0000255261 00000 n +0000255325 00000 n +0000255390 00000 n +0000255455 00000 n +0000255518 00000 n +0000255583 00000 n +0000255648 00000 n +0000255712 00000 n +0000255776 00000 n +0000255840 00000 n +0000255904 00000 n +0000255969 00000 n +0000256034 00000 n +0000256098 00000 n +0000256163 00000 n +0000256228 00000 n +0000256292 00000 n +0000256357 00000 n +0000256422 00000 n +0000256486 00000 n +0000256550 00000 n +0000256614 00000 n +0000256678 00000 n +0000256743 00000 n +0000256808 00000 n +0000256872 00000 n +0000256936 00000 n +0000257000 00000 n +0000257193 00000 n +0000257257 00000 n +0000257321 00000 n +0000257385 00000 n +0000257449 00000 n +0000933552 00000 n +0000262512 00000 n +0000259033 00000 n +0000257627 00000 n +0000259159 00000 n +0000259223 00000 n +0000259287 00000 n +0000259351 00000 n +0000259415 00000 n +0000259479 00000 n +0000259545 00000 n +0000259609 00000 n +0000259673 00000 n +0000259737 00000 n +0000259801 00000 n +0000259867 00000 n +0000259933 00000 n +0000259997 00000 n +0000260061 00000 n +0000260125 00000 n +0000260189 00000 n +0000260254 00000 n +0000260320 00000 n +0000260386 00000 n +0000260450 00000 n +0000260514 00000 n +0000260579 00000 n +0000260643 00000 n +0000260707 00000 n +0000260772 00000 n +0000260838 00000 n +0000260904 00000 n +0000260968 00000 n +0000261032 00000 n +0000261097 00000 n +0000261162 00000 n +0000261226 00000 n +0000261290 00000 n +0000261354 00000 n +0000261418 00000 n +0000261483 00000 n +0000261548 00000 n +0000261612 00000 n +0000261677 00000 n +0000261742 00000 n +0000261806 00000 n +0000261870 00000 n +0000261934 00000 n +0000262124 00000 n +0000262188 00000 n +0000262254 00000 n +0000262318 00000 n +0000262382 00000 n +0000262448 00000 n +0000266728 00000 n +0000263759 00000 n +0000262624 00000 n +0000263885 00000 n +0000263949 00000 n +0000264013 00000 n +0000264077 00000 n +0000264141 00000 n +0000264205 00000 n +0000264269 00000 n +0000264335 00000 n +0000264401 00000 n +0000264465 00000 n +0000264529 00000 n +0000264594 00000 n +0000264659 00000 n +0000264724 00000 n +0000264790 00000 n +0000264856 00000 n +0000264920 00000 n +0000264984 00000 n +0000265049 00000 n +0000265113 00000 n +0000265178 00000 n +0000265243 00000 n +0000265309 00000 n +0000265375 00000 n +0000265439 00000 n +0000265503 00000 n +0000265568 00000 n +0000265632 00000 n +0000265697 00000 n +0000265761 00000 n +0000265825 00000 n +0000265889 00000 n +0000266082 00000 n +0000266146 00000 n +0000266212 00000 n +0000266276 00000 n +0000266340 00000 n +0000266406 00000 n +0000266470 00000 n +0000266534 00000 n +0000266598 00000 n +0000266662 00000 n +0000271395 00000 n +0000268044 00000 n +0000266840 00000 n +0000268170 00000 n +0000268234 00000 n +0000268298 00000 n +0000268362 00000 n +0000268426 00000 n +0000268492 00000 n +0000268558 00000 n +0000268621 00000 n +0000268684 00000 n +0000268749 00000 n +0000268814 00000 n +0000268879 00000 n +0000268945 00000 n +0000269011 00000 n +0000269075 00000 n +0000269139 00000 n +0000269204 00000 n +0000269267 00000 n +0000269332 00000 n +0000269397 00000 n +0000269463 00000 n +0000269529 00000 n +0000269593 00000 n +0000269659 00000 n +0000269725 00000 n +0000269789 00000 n +0000269853 00000 n +0000269915 00000 n +0000270108 00000 n +0000270172 00000 n +0000270238 00000 n +0000270302 00000 n +0000270366 00000 n +0000270432 00000 n +0000270494 00000 n +0000270558 00000 n +0000270622 00000 n +0000270686 00000 n +0000270752 00000 n +0000270816 00000 n +0000270879 00000 n +0000270943 00000 n +0000271007 00000 n +0000271073 00000 n +0000271139 00000 n +0000271203 00000 n +0000271267 00000 n +0000271331 00000 n +0000276750 00000 n +0000272813 00000 n +0000271507 00000 n +0000272939 00000 n +0000273003 00000 n +0000273068 00000 n +0000273134 00000 n +0000273200 00000 n +0000273264 00000 n +0000273328 00000 n +0000273393 00000 n +0000273457 00000 n +0000273522 00000 n +0000273587 00000 n +0000273653 00000 n +0000273719 00000 n +0000273783 00000 n +0000273847 00000 n +0000273912 00000 n +0000273977 00000 n +0000274041 00000 n +0000274106 00000 n +0000274171 00000 n +0000274235 00000 n +0000274300 00000 n +0000274365 00000 n +0000274429 00000 n +0000274494 00000 n +0000274559 00000 n +0000274623 00000 n +0000274688 00000 n +0000274753 00000 n +0000274817 00000 n +0000274882 00000 n +0000274947 00000 n +0000275011 00000 n +0000275076 00000 n +0000275141 00000 n +0000275205 00000 n +0000275269 00000 n +0000275333 00000 n +0000275525 00000 n +0000275589 00000 n +0000275655 00000 n +0000275718 00000 n +0000275782 00000 n +0000275848 00000 n +0000275912 00000 n +0000275976 00000 n +0000276040 00000 n +0000276106 00000 n +0000276170 00000 n +0000276234 00000 n +0000276298 00000 n +0000276362 00000 n +0000276428 00000 n +0000276494 00000 n +0000276557 00000 n +0000276620 00000 n +0000276685 00000 n +0000281605 00000 n +0000278119 00000 n +0000276862 00000 n +0000278245 00000 n +0000278309 00000 n +0000278374 00000 n +0000278440 00000 n +0000278506 00000 n +0000278570 00000 n +0000278634 00000 n +0000278699 00000 n +0000278764 00000 n +0000278828 00000 n +0000278893 00000 n +0000278958 00000 n +0000279022 00000 n +0000279087 00000 n +0000279152 00000 n +0000279216 00000 n +0000279281 00000 n +0000279346 00000 n +0000279410 00000 n +0000279474 00000 n +0000279538 00000 n +0000279732 00000 n +0000279796 00000 n +0000279862 00000 n +0000279926 00000 n +0000279990 00000 n +0000280056 00000 n +0000280120 00000 n +0000280184 00000 n +0000280248 00000 n +0000280312 00000 n +0000280378 00000 n +0000280442 00000 n +0000280505 00000 n +0000280569 00000 n +0000280633 00000 n +0000280699 00000 n +0000280765 00000 n +0000280829 00000 n +0000280893 00000 n +0000280958 00000 n +0000281023 00000 n +0000281088 00000 n +0000281153 00000 n +0000281218 00000 n +0000281282 00000 n +0000281346 00000 n +0000281411 00000 n +0000281475 00000 n +0000281540 00000 n +0000286993 00000 n +0000283061 00000 n +0000281717 00000 n +0000283187 00000 n +0000283251 00000 n +0000283317 00000 n +0000283383 00000 n +0000283447 00000 n +0000283511 00000 n +0000283576 00000 n +0000283641 00000 n +0000283705 00000 n +0000283770 00000 n +0000283835 00000 n +0000283899 00000 n +0000283963 00000 n +0000284027 00000 n +0000284221 00000 n +0000284285 00000 n +0000284350 00000 n +0000284414 00000 n +0000284478 00000 n +0000284544 00000 n +0000284608 00000 n +0000284671 00000 n +0000284735 00000 n +0000284799 00000 n +0000284865 00000 n +0000284929 00000 n +0000284993 00000 n +0000285057 00000 n +0000285121 00000 n +0000285187 00000 n +0000285253 00000 n +0000285315 00000 n +0000285377 00000 n +0000285442 00000 n +0000285507 00000 n +0000285571 00000 n +0000285637 00000 n +0000285703 00000 n +0000285767 00000 n +0000285831 00000 n +0000285896 00000 n +0000285961 00000 n +0000286025 00000 n +0000286090 00000 n +0000286155 00000 n +0000286219 00000 n +0000286283 00000 n +0000286347 00000 n +0000286411 00000 n +0000286476 00000 n +0000286541 00000 n +0000286605 00000 n +0000286670 00000 n +0000286735 00000 n +0000286799 00000 n +0000286864 00000 n +0000286929 00000 n +0000933677 00000 n +0000291669 00000 n +0000288382 00000 n +0000287105 00000 n +0000288508 00000 n +0000288572 00000 n +0000288637 00000 n +0000288702 00000 n +0000288766 00000 n +0000288831 00000 n +0000288896 00000 n +0000288960 00000 n +0000289024 00000 n +0000289088 00000 n +0000289282 00000 n +0000289346 00000 n +0000289412 00000 n +0000289476 00000 n +0000289540 00000 n +0000289606 00000 n +0000289670 00000 n +0000289734 00000 n +0000289798 00000 n +0000289864 00000 n +0000289928 00000 n +0000289992 00000 n +0000290056 00000 n +0000290120 00000 n +0000290186 00000 n +0000290252 00000 n +0000290315 00000 n +0000290378 00000 n +0000290443 00000 n +0000290508 00000 n +0000290572 00000 n +0000290638 00000 n +0000290704 00000 n +0000290768 00000 n +0000290832 00000 n +0000290897 00000 n +0000290960 00000 n +0000291025 00000 n +0000291089 00000 n +0000291155 00000 n +0000291221 00000 n +0000291285 00000 n +0000291349 00000 n +0000291414 00000 n +0000291477 00000 n +0000291542 00000 n +0000291606 00000 n +0000295995 00000 n +0000292900 00000 n +0000291781 00000 n +0000293026 00000 n +0000293090 00000 n +0000293154 00000 n +0000293218 00000 n +0000293412 00000 n +0000293476 00000 n +0000293542 00000 n +0000293606 00000 n +0000293669 00000 n +0000293735 00000 n +0000293799 00000 n +0000293863 00000 n +0000293927 00000 n +0000293993 00000 n +0000294055 00000 n +0000294119 00000 n +0000294182 00000 n +0000294246 00000 n +0000294312 00000 n +0000294378 00000 n +0000294442 00000 n +0000294506 00000 n +0000294571 00000 n +0000294636 00000 n +0000294701 00000 n +0000294767 00000 n +0000294833 00000 n +0000294897 00000 n +0000294961 00000 n +0000295026 00000 n +0000295090 00000 n +0000295155 00000 n +0000295220 00000 n +0000295286 00000 n +0000295352 00000 n +0000295416 00000 n +0000295480 00000 n +0000295545 00000 n +0000295609 00000 n +0000295674 00000 n +0000295738 00000 n +0000295802 00000 n +0000295866 00000 n +0000299685 00000 n +0000297104 00000 n +0000296107 00000 n +0000297230 00000 n +0000297359 00000 n +0000297423 00000 n +0000297489 00000 n +0000297553 00000 n +0000297617 00000 n +0000297681 00000 n +0000297747 00000 n +0000297811 00000 n +0000297875 00000 n +0000297939 00000 n +0000298003 00000 n +0000298069 00000 n +0000298135 00000 n +0000298199 00000 n +0000298263 00000 n +0000298328 00000 n +0000298393 00000 n +0000298458 00000 n +0000298523 00000 n +0000298588 00000 n +0000298652 00000 n +0000298718 00000 n +0000298784 00000 n +0000298848 00000 n +0000298911 00000 n +0000298975 00000 n +0000299169 00000 n +0000299233 00000 n +0000299299 00000 n +0000299363 00000 n +0000299427 00000 n +0000299493 00000 n +0000299557 00000 n +0000299621 00000 n +0000304028 00000 n +0000300931 00000 n +0000299797 00000 n +0000301057 00000 n +0000301121 00000 n +0000301185 00000 n +0000301251 00000 n +0000301315 00000 n +0000301379 00000 n +0000301443 00000 n +0000301507 00000 n +0000301573 00000 n +0000301639 00000 n +0000301703 00000 n +0000301767 00000 n +0000301832 00000 n +0000301897 00000 n +0000301962 00000 n +0000302028 00000 n +0000302094 00000 n +0000302158 00000 n +0000302222 00000 n +0000302287 00000 n +0000302351 00000 n +0000302416 00000 n +0000302481 00000 n +0000302547 00000 n +0000302613 00000 n +0000302677 00000 n +0000302741 00000 n +0000302806 00000 n +0000302870 00000 n +0000302935 00000 n +0000302999 00000 n +0000303063 00000 n +0000303127 00000 n +0000303320 00000 n +0000303383 00000 n +0000303449 00000 n +0000303513 00000 n +0000303577 00000 n +0000303642 00000 n +0000303706 00000 n +0000303770 00000 n +0000303834 00000 n +0000303898 00000 n +0000303964 00000 n +0000309408 00000 n +0000305476 00000 n +0000304140 00000 n +0000305602 00000 n +0000305666 00000 n +0000305730 00000 n +0000305794 00000 n +0000305858 00000 n +0000305924 00000 n +0000305990 00000 n +0000306054 00000 n +0000306118 00000 n +0000306183 00000 n +0000306248 00000 n +0000306313 00000 n +0000306378 00000 n +0000306443 00000 n +0000306507 00000 n +0000306571 00000 n +0000306636 00000 n +0000306700 00000 n +0000306765 00000 n +0000306830 00000 n +0000306895 00000 n +0000306960 00000 n +0000307023 00000 n +0000307086 00000 n +0000307151 00000 n +0000307216 00000 n +0000307280 00000 n +0000307345 00000 n +0000307410 00000 n +0000307474 00000 n +0000307539 00000 n +0000307604 00000 n +0000307668 00000 n +0000307731 00000 n +0000307794 00000 n +0000307858 00000 n +0000307923 00000 n +0000307988 00000 n +0000308052 00000 n +0000308117 00000 n +0000308182 00000 n +0000308246 00000 n +0000308311 00000 n +0000308376 00000 n +0000308440 00000 n +0000308504 00000 n +0000308568 00000 n +0000308762 00000 n +0000308826 00000 n +0000308892 00000 n +0000308956 00000 n +0000309020 00000 n +0000309086 00000 n +0000309150 00000 n +0000309214 00000 n +0000309278 00000 n +0000309344 00000 n +0000315206 00000 n +0000311149 00000 n +0000309520 00000 n +0000311275 00000 n +0000311339 00000 n +0000311403 00000 n +0000311467 00000 n +0000311531 00000 n +0000311595 00000 n +0000311661 00000 n +0000311727 00000 n +0000311791 00000 n +0000311855 00000 n +0000311920 00000 n +0000311985 00000 n +0000312050 00000 n +0000312115 00000 n +0000312180 00000 n +0000312243 00000 n +0000312306 00000 n +0000312371 00000 n +0000312436 00000 n +0000312500 00000 n +0000312565 00000 n +0000312630 00000 n +0000312694 00000 n +0000312759 00000 n +0000312824 00000 n +0000312888 00000 n +0000312952 00000 n +0000313016 00000 n +0000313080 00000 n +0000313145 00000 n +0000313210 00000 n +0000313274 00000 n +0000313339 00000 n +0000313404 00000 n +0000313467 00000 n +0000313532 00000 n +0000313597 00000 n +0000313661 00000 n +0000313724 00000 n +0000313787 00000 n +0000313851 00000 n +0000313916 00000 n +0000313981 00000 n +0000314045 00000 n +0000314110 00000 n +0000314175 00000 n +0000314239 00000 n +0000314303 00000 n +0000314367 00000 n +0000314560 00000 n +0000314624 00000 n +0000314690 00000 n +0000314754 00000 n +0000314818 00000 n +0000314884 00000 n +0000314948 00000 n +0000315012 00000 n +0000315076 00000 n +0000315140 00000 n +0000933802 00000 n +0000320134 00000 n +0000316586 00000 n +0000315318 00000 n +0000316712 00000 n +0000316776 00000 n +0000316840 00000 n +0000316904 00000 n +0000316968 00000 n +0000317032 00000 n +0000317098 00000 n +0000317164 00000 n +0000317227 00000 n +0000317290 00000 n +0000317355 00000 n +0000317420 00000 n +0000317485 00000 n +0000317551 00000 n +0000317617 00000 n +0000317681 00000 n +0000317745 00000 n +0000317810 00000 n +0000317873 00000 n +0000317938 00000 n +0000318003 00000 n +0000318069 00000 n +0000318135 00000 n +0000318199 00000 n +0000318263 00000 n +0000318328 00000 n +0000318392 00000 n +0000318457 00000 n +0000318521 00000 n +0000318587 00000 n +0000318653 00000 n +0000318717 00000 n +0000318783 00000 n +0000318849 00000 n +0000318913 00000 n +0000318977 00000 n +0000319042 00000 n +0000319106 00000 n +0000319170 00000 n +0000319233 00000 n +0000319296 00000 n +0000319360 00000 n +0000319554 00000 n +0000319618 00000 n +0000319684 00000 n +0000319748 00000 n +0000319812 00000 n +0000319878 00000 n +0000319942 00000 n +0000320006 00000 n +0000320069 00000 n +0000324792 00000 n +0000321371 00000 n +0000320246 00000 n +0000321497 00000 n +0000321561 00000 n +0000321625 00000 n +0000321689 00000 n +0000321753 00000 n +0000321819 00000 n +0000321885 00000 n +0000321948 00000 n +0000322011 00000 n +0000322076 00000 n +0000322141 00000 n +0000322206 00000 n +0000322272 00000 n +0000322338 00000 n +0000322402 00000 n +0000322466 00000 n +0000322531 00000 n +0000322596 00000 n +0000322660 00000 n +0000322725 00000 n +0000322790 00000 n +0000322853 00000 n +0000322918 00000 n +0000322983 00000 n +0000323046 00000 n +0000323110 00000 n +0000323174 00000 n +0000323368 00000 n +0000323432 00000 n +0000323498 00000 n +0000323562 00000 n +0000323626 00000 n +0000323692 00000 n +0000323756 00000 n +0000323820 00000 n +0000323884 00000 n +0000323949 00000 n +0000324013 00000 n +0000324077 00000 n +0000324141 00000 n +0000324205 00000 n +0000324271 00000 n +0000324337 00000 n +0000324401 00000 n +0000324465 00000 n +0000324530 00000 n +0000324595 00000 n +0000324660 00000 n +0000324726 00000 n +0000329724 00000 n +0000326310 00000 n +0000324904 00000 n +0000326436 00000 n +0000326563 00000 n +0000326627 00000 n +0000326691 00000 n +0000326755 00000 n +0000326949 00000 n +0000327013 00000 n +0000327079 00000 n +0000327143 00000 n +0000327207 00000 n +0000327273 00000 n +0000327337 00000 n +0000327400 00000 n +0000327464 00000 n +0000327528 00000 n +0000327592 00000 n +0000327658 00000 n +0000327722 00000 n +0000327785 00000 n +0000327849 00000 n +0000327913 00000 n +0000327979 00000 n +0000328045 00000 n +0000328109 00000 n +0000328173 00000 n +0000328238 00000 n +0000328303 00000 n +0000328368 00000 n +0000328434 00000 n +0000328500 00000 n +0000328564 00000 n +0000328628 00000 n +0000328693 00000 n +0000328758 00000 n +0000328822 00000 n +0000328887 00000 n +0000328952 00000 n +0000329016 00000 n +0000329081 00000 n +0000329146 00000 n +0000329209 00000 n +0000329274 00000 n +0000329339 00000 n +0000329403 00000 n +0000329468 00000 n +0000329533 00000 n +0000329597 00000 n +0000329661 00000 n +0000334051 00000 n +0000331015 00000 n +0000329836 00000 n +0000331141 00000 n +0000331205 00000 n +0000331269 00000 n +0000331400 00000 n +0000331464 00000 n +0000331530 00000 n +0000331594 00000 n +0000331658 00000 n +0000331724 00000 n +0000331788 00000 n +0000331852 00000 n +0000331916 00000 n +0000331980 00000 n +0000332046 00000 n +0000332110 00000 n +0000332174 00000 n +0000332238 00000 n +0000332302 00000 n +0000332368 00000 n +0000332434 00000 n +0000332498 00000 n +0000332562 00000 n +0000332627 00000 n +0000332692 00000 n +0000332757 00000 n +0000332823 00000 n +0000332889 00000 n +0000332953 00000 n +0000333017 00000 n +0000333082 00000 n +0000333146 00000 n +0000333211 00000 n +0000333276 00000 n +0000333342 00000 n +0000333408 00000 n +0000333472 00000 n +0000333536 00000 n +0000333601 00000 n +0000333665 00000 n +0000333730 00000 n +0000333794 00000 n +0000333858 00000 n +0000333922 00000 n +0000337460 00000 n +0000335144 00000 n +0000334163 00000 n +0000335270 00000 n +0000335399 00000 n +0000335463 00000 n +0000335528 00000 n +0000335592 00000 n +0000335654 00000 n +0000335720 00000 n +0000335784 00000 n +0000335848 00000 n +0000335912 00000 n +0000335976 00000 n +0000336042 00000 n +0000336108 00000 n +0000336172 00000 n +0000336236 00000 n +0000336301 00000 n +0000336366 00000 n +0000336430 00000 n +0000336494 00000 n +0000336558 00000 n +0000336751 00000 n +0000336815 00000 n +0000336881 00000 n +0000336945 00000 n +0000337009 00000 n +0000337075 00000 n +0000337139 00000 n +0000337203 00000 n +0000337267 00000 n +0000337331 00000 n +0000337396 00000 n +0000343223 00000 n +0000338904 00000 n +0000337572 00000 n +0000339030 00000 n +0000339094 00000 n +0000339158 00000 n +0000339222 00000 n +0000339286 00000 n +0000339352 00000 n +0000339418 00000 n +0000339482 00000 n +0000339546 00000 n +0000339611 00000 n +0000339676 00000 n +0000339741 00000 n +0000339806 00000 n +0000339871 00000 n +0000339935 00000 n +0000339999 00000 n +0000340063 00000 n +0000340256 00000 n +0000340320 00000 n +0000340386 00000 n +0000340450 00000 n +0000340514 00000 n +0000340580 00000 n +0000340644 00000 n +0000340708 00000 n +0000340774 00000 n +0000340838 00000 n +0000340902 00000 n +0000340966 00000 n +0000341030 00000 n +0000341096 00000 n +0000341162 00000 n +0000341226 00000 n +0000341290 00000 n +0000341355 00000 n +0000341420 00000 n +0000341484 00000 n +0000341549 00000 n +0000341614 00000 n +0000341678 00000 n +0000341742 00000 n +0000341806 00000 n +0000341870 00000 n +0000341933 00000 n +0000341997 00000 n +0000342063 00000 n +0000342127 00000 n +0000342191 00000 n +0000342256 00000 n +0000342321 00000 n +0000342385 00000 n +0000342450 00000 n +0000342515 00000 n +0000342579 00000 n +0000342644 00000 n +0000342709 00000 n +0000342772 00000 n +0000342837 00000 n +0000342902 00000 n +0000342966 00000 n +0000343030 00000 n +0000343095 00000 n +0000343160 00000 n +0000933927 00000 n +0000349409 00000 n +0000344927 00000 n +0000343335 00000 n +0000345053 00000 n +0000345117 00000 n +0000345183 00000 n +0000345249 00000 n +0000345313 00000 n +0000345379 00000 n +0000345445 00000 n +0000345509 00000 n +0000345575 00000 n +0000345641 00000 n +0000345705 00000 n +0000345771 00000 n +0000345837 00000 n +0000345901 00000 n +0000345967 00000 n +0000346033 00000 n +0000346097 00000 n +0000346163 00000 n +0000346229 00000 n +0000346293 00000 n +0000346359 00000 n +0000346425 00000 n +0000346489 00000 n +0000346555 00000 n +0000346621 00000 n +0000346685 00000 n +0000346751 00000 n +0000346817 00000 n +0000346881 00000 n +0000346947 00000 n +0000347013 00000 n +0000347077 00000 n +0000347143 00000 n +0000347209 00000 n +0000347273 00000 n +0000347339 00000 n +0000347405 00000 n +0000347469 00000 n +0000347535 00000 n +0000347601 00000 n +0000347665 00000 n +0000347731 00000 n +0000347797 00000 n +0000347862 00000 n +0000347927 00000 n +0000348119 00000 n +0000348183 00000 n +0000348249 00000 n +0000348313 00000 n +0000348376 00000 n +0000348442 00000 n +0000348506 00000 n +0000348570 00000 n +0000348634 00000 n +0000348700 00000 n +0000348764 00000 n +0000348828 00000 n +0000348892 00000 n +0000348955 00000 n +0000349021 00000 n +0000349087 00000 n +0000349151 00000 n +0000349215 00000 n +0000349280 00000 n +0000349345 00000 n +0000354952 00000 n +0000350883 00000 n +0000349521 00000 n +0000351009 00000 n +0000351073 00000 n +0000351138 00000 n +0000351203 00000 n +0000351267 00000 n +0000351332 00000 n +0000351397 00000 n +0000351462 00000 n +0000351528 00000 n +0000351594 00000 n +0000351658 00000 n +0000351724 00000 n +0000351790 00000 n +0000351854 00000 n +0000351920 00000 n +0000351986 00000 n +0000352050 00000 n +0000352116 00000 n +0000352182 00000 n +0000352246 00000 n +0000352310 00000 n +0000352374 00000 n +0000352568 00000 n +0000352632 00000 n +0000352698 00000 n +0000352762 00000 n +0000352826 00000 n +0000352892 00000 n +0000352956 00000 n +0000353020 00000 n +0000353084 00000 n +0000353150 00000 n +0000353214 00000 n +0000353278 00000 n +0000353342 00000 n +0000353406 00000 n +0000353472 00000 n +0000353538 00000 n +0000353601 00000 n +0000353664 00000 n +0000353729 00000 n +0000353794 00000 n +0000353857 00000 n +0000353921 00000 n +0000353985 00000 n +0000354049 00000 n +0000354114 00000 n +0000354179 00000 n +0000354244 00000 n +0000354310 00000 n +0000354376 00000 n +0000354440 00000 n +0000354504 00000 n +0000354567 00000 n +0000354630 00000 n +0000354694 00000 n +0000354759 00000 n +0000354824 00000 n +0000354888 00000 n +0000360056 00000 n +0000356361 00000 n +0000355064 00000 n +0000356487 00000 n +0000356551 00000 n +0000356615 00000 n +0000356681 00000 n +0000356747 00000 n +0000356811 00000 n +0000356877 00000 n +0000356943 00000 n +0000357007 00000 n +0000357073 00000 n +0000357139 00000 n +0000357203 00000 n +0000357269 00000 n +0000357335 00000 n +0000357399 00000 n +0000357465 00000 n +0000357531 00000 n +0000357595 00000 n +0000357661 00000 n +0000357727 00000 n +0000357791 00000 n +0000357857 00000 n +0000357923 00000 n +0000357987 00000 n +0000358053 00000 n +0000358119 00000 n +0000358184 00000 n +0000358249 00000 n +0000358314 00000 n +0000358378 00000 n +0000358442 00000 n +0000358506 00000 n +0000358699 00000 n +0000358763 00000 n +0000358829 00000 n +0000358893 00000 n +0000358957 00000 n +0000359023 00000 n +0000359087 00000 n +0000359151 00000 n +0000359215 00000 n +0000359279 00000 n +0000359345 00000 n +0000359409 00000 n +0000359473 00000 n +0000359537 00000 n +0000359601 00000 n +0000359667 00000 n +0000359733 00000 n +0000359797 00000 n +0000359861 00000 n +0000359926 00000 n +0000359991 00000 n +0000364264 00000 n +0000361230 00000 n +0000360168 00000 n +0000361356 00000 n +0000361420 00000 n +0000361484 00000 n +0000361550 00000 n +0000361616 00000 n +0000361680 00000 n +0000361744 00000 n +0000361938 00000 n +0000362002 00000 n +0000362068 00000 n +0000362132 00000 n +0000362196 00000 n +0000362262 00000 n +0000362326 00000 n +0000362390 00000 n +0000362454 00000 n +0000362518 00000 n +0000362584 00000 n +0000362648 00000 n +0000362712 00000 n +0000362776 00000 n +0000362840 00000 n +0000362906 00000 n +0000362972 00000 n +0000363036 00000 n +0000363100 00000 n +0000363164 00000 n +0000363228 00000 n +0000363293 00000 n +0000363359 00000 n +0000363425 00000 n +0000363489 00000 n +0000363553 00000 n +0000363618 00000 n +0000363682 00000 n +0000363746 00000 n +0000363811 00000 n +0000363877 00000 n +0000363943 00000 n +0000364007 00000 n +0000364071 00000 n +0000364135 00000 n +0000367943 00000 n +0000365300 00000 n +0000364376 00000 n +0000365426 00000 n +0000365490 00000 n +0000365619 00000 n +0000365683 00000 n +0000365749 00000 n +0000365813 00000 n +0000365877 00000 n +0000365941 00000 n +0000366007 00000 n +0000366071 00000 n +0000366135 00000 n +0000366199 00000 n +0000366263 00000 n +0000366329 00000 n +0000366395 00000 n +0000366459 00000 n +0000366523 00000 n +0000366588 00000 n +0000366653 00000 n +0000366718 00000 n +0000366783 00000 n +0000366848 00000 n +0000366912 00000 n +0000366976 00000 n +0000367041 00000 n +0000367105 00000 n +0000367170 00000 n +0000367234 00000 n +0000367298 00000 n +0000367362 00000 n +0000367555 00000 n +0000367619 00000 n +0000367685 00000 n +0000367749 00000 n +0000367813 00000 n +0000367879 00000 n +0000372232 00000 n +0000369135 00000 n +0000368055 00000 n +0000369261 00000 n +0000369325 00000 n +0000369389 00000 n +0000369453 00000 n +0000369519 00000 n +0000369583 00000 n +0000369647 00000 n +0000369711 00000 n +0000369775 00000 n +0000369841 00000 n +0000369907 00000 n +0000369971 00000 n +0000370035 00000 n +0000370100 00000 n +0000370165 00000 n +0000370230 00000 n +0000370296 00000 n +0000370362 00000 n +0000370424 00000 n +0000370488 00000 n +0000370552 00000 n +0000370746 00000 n +0000370810 00000 n +0000370876 00000 n +0000370940 00000 n +0000371004 00000 n +0000371069 00000 n +0000371133 00000 n +0000371197 00000 n +0000371261 00000 n +0000371327 00000 n +0000371391 00000 n +0000371455 00000 n +0000371519 00000 n +0000371581 00000 n +0000371647 00000 n +0000371713 00000 n +0000371777 00000 n +0000371841 00000 n +0000371906 00000 n +0000371971 00000 n +0000372036 00000 n +0000372102 00000 n +0000372168 00000 n +0000934052 00000 n +0000376827 00000 n +0000373539 00000 n +0000372344 00000 n +0000373665 00000 n +0000373729 00000 n +0000373795 00000 n +0000373861 00000 n +0000373925 00000 n +0000373989 00000 n +0000374054 00000 n +0000374118 00000 n +0000374183 00000 n +0000374247 00000 n +0000374311 00000 n +0000374375 00000 n +0000374569 00000 n +0000374633 00000 n +0000374698 00000 n +0000374762 00000 n +0000374826 00000 n +0000374892 00000 n +0000374956 00000 n +0000375020 00000 n +0000375084 00000 n +0000375150 00000 n +0000375214 00000 n +0000375278 00000 n +0000375342 00000 n +0000375406 00000 n +0000375472 00000 n +0000375538 00000 n +0000375602 00000 n +0000375666 00000 n +0000375730 00000 n +0000375794 00000 n +0000375859 00000 n +0000375925 00000 n +0000375991 00000 n +0000376055 00000 n +0000376121 00000 n +0000376187 00000 n +0000376250 00000 n +0000376313 00000 n +0000376377 00000 n +0000376441 00000 n +0000376506 00000 n +0000376570 00000 n +0000376634 00000 n +0000376698 00000 n +0000380619 00000 n +0000377911 00000 n +0000376939 00000 n +0000378037 00000 n +0000378101 00000 n +0000378230 00000 n +0000378294 00000 n +0000378359 00000 n +0000378423 00000 n +0000378487 00000 n +0000378553 00000 n +0000378617 00000 n +0000378681 00000 n +0000378747 00000 n +0000378811 00000 n +0000378875 00000 n +0000378939 00000 n +0000379003 00000 n +0000379069 00000 n +0000379135 00000 n +0000379199 00000 n +0000379263 00000 n +0000379328 00000 n +0000379393 00000 n +0000379458 00000 n +0000379524 00000 n +0000379590 00000 n +0000379653 00000 n +0000379717 00000 n +0000379781 00000 n +0000379974 00000 n +0000380038 00000 n +0000380104 00000 n +0000380168 00000 n +0000380232 00000 n +0000380297 00000 n +0000380361 00000 n +0000380425 00000 n +0000380489 00000 n +0000380553 00000 n +0000384914 00000 n +0000381753 00000 n +0000380731 00000 n +0000381879 00000 n +0000381943 00000 n +0000382007 00000 n +0000382071 00000 n +0000382135 00000 n +0000382201 00000 n +0000382267 00000 n +0000382330 00000 n +0000382393 00000 n +0000382458 00000 n +0000382523 00000 n +0000382588 00000 n +0000382654 00000 n +0000382720 00000 n +0000382784 00000 n +0000382848 00000 n +0000382912 00000 n +0000383106 00000 n +0000383170 00000 n +0000383236 00000 n +0000383300 00000 n +0000383364 00000 n +0000383430 00000 n +0000383494 00000 n +0000383558 00000 n +0000383622 00000 n +0000383686 00000 n +0000383752 00000 n +0000383816 00000 n +0000383880 00000 n +0000383944 00000 n +0000384008 00000 n +0000384074 00000 n +0000384140 00000 n +0000384204 00000 n +0000384268 00000 n +0000384333 00000 n +0000384398 00000 n +0000384463 00000 n +0000384529 00000 n +0000384595 00000 n +0000384658 00000 n +0000384722 00000 n +0000384786 00000 n +0000388515 00000 n +0000385937 00000 n +0000385026 00000 n +0000386063 00000 n +0000386192 00000 n +0000386256 00000 n +0000386322 00000 n +0000386386 00000 n +0000386450 00000 n +0000386516 00000 n +0000386580 00000 n +0000386644 00000 n +0000386708 00000 n +0000386774 00000 n +0000386838 00000 n +0000386902 00000 n +0000386966 00000 n +0000387030 00000 n +0000387096 00000 n +0000387162 00000 n +0000387226 00000 n +0000387290 00000 n +0000387355 00000 n +0000387420 00000 n +0000387485 00000 n +0000387550 00000 n +0000387615 00000 n +0000387679 00000 n +0000387743 00000 n +0000387807 00000 n +0000387999 00000 n +0000388063 00000 n +0000388129 00000 n +0000388193 00000 n +0000388257 00000 n +0000388323 00000 n +0000388387 00000 n +0000388451 00000 n +0000392875 00000 n +0000389586 00000 n +0000388627 00000 n +0000389712 00000 n +0000389839 00000 n +0000389903 00000 n +0000389969 00000 n +0000390033 00000 n +0000390097 00000 n +0000390161 00000 n +0000390225 00000 n +0000390291 00000 n +0000390357 00000 n +0000390421 00000 n +0000390485 00000 n +0000390550 00000 n +0000390615 00000 n +0000390680 00000 n +0000390746 00000 n +0000390812 00000 n +0000390876 00000 n +0000390940 00000 n +0000391004 00000 n +0000391198 00000 n +0000391262 00000 n +0000391328 00000 n +0000391392 00000 n +0000391456 00000 n +0000391522 00000 n +0000391586 00000 n +0000391649 00000 n +0000391713 00000 n +0000391777 00000 n +0000391843 00000 n +0000391907 00000 n +0000391971 00000 n +0000392035 00000 n +0000392098 00000 n +0000392164 00000 n +0000392230 00000 n +0000392294 00000 n +0000392358 00000 n +0000392423 00000 n +0000392488 00000 n +0000392552 00000 n +0000392618 00000 n +0000392684 00000 n +0000392748 00000 n +0000392811 00000 n +0000397033 00000 n +0000394064 00000 n +0000392987 00000 n +0000394190 00000 n +0000394254 00000 n +0000394318 00000 n +0000394449 00000 n +0000394513 00000 n +0000394579 00000 n +0000394643 00000 n +0000394706 00000 n +0000394772 00000 n +0000394836 00000 n +0000394900 00000 n +0000394964 00000 n +0000395030 00000 n +0000395094 00000 n +0000395158 00000 n +0000395222 00000 n +0000395285 00000 n +0000395351 00000 n +0000395417 00000 n +0000395481 00000 n +0000395545 00000 n +0000395610 00000 n +0000395675 00000 n +0000395739 00000 n +0000395805 00000 n +0000395871 00000 n +0000395935 00000 n +0000395999 00000 n +0000396064 00000 n +0000396128 00000 n +0000396193 00000 n +0000396258 00000 n +0000396324 00000 n +0000396390 00000 n +0000396454 00000 n +0000396518 00000 n +0000396583 00000 n +0000396647 00000 n +0000396712 00000 n +0000396776 00000 n +0000396840 00000 n +0000396904 00000 n +0000934177 00000 n +0000401018 00000 n +0000398182 00000 n +0000397145 00000 n +0000398308 00000 n +0000398372 00000 n +0000398501 00000 n +0000398565 00000 n +0000398630 00000 n +0000398694 00000 n +0000398758 00000 n +0000398822 00000 n +0000398886 00000 n +0000398952 00000 n +0000399016 00000 n +0000399080 00000 n +0000399144 00000 n +0000399208 00000 n +0000399274 00000 n +0000399340 00000 n +0000399403 00000 n +0000399466 00000 n +0000399531 00000 n +0000399596 00000 n +0000399660 00000 n +0000399726 00000 n +0000399792 00000 n +0000399856 00000 n +0000399920 00000 n +0000399985 00000 n +0000400048 00000 n +0000400113 00000 n +0000400177 00000 n +0000400243 00000 n +0000400309 00000 n +0000400373 00000 n +0000400436 00000 n +0000400500 00000 n +0000400694 00000 n +0000400758 00000 n +0000400824 00000 n +0000400888 00000 n +0000400952 00000 n +0000404862 00000 n +0000402159 00000 n +0000401130 00000 n +0000402285 00000 n +0000402349 00000 n +0000402413 00000 n +0000402477 00000 n +0000402541 00000 n +0000402607 00000 n +0000402671 00000 n +0000402734 00000 n +0000402798 00000 n +0000402862 00000 n +0000402928 00000 n +0000402994 00000 n +0000403058 00000 n +0000403122 00000 n +0000403186 00000 n +0000403250 00000 n +0000403315 00000 n +0000403381 00000 n +0000403447 00000 n +0000403511 00000 n +0000403575 00000 n +0000403640 00000 n +0000403704 00000 n +0000403768 00000 n +0000403831 00000 n +0000403894 00000 n +0000403958 00000 n +0000404152 00000 n +0000404216 00000 n +0000404282 00000 n +0000404346 00000 n +0000404410 00000 n +0000404476 00000 n +0000404540 00000 n +0000404604 00000 n +0000404668 00000 n +0000404732 00000 n +0000404798 00000 n +0000409480 00000 n +0000406070 00000 n +0000404974 00000 n +0000406196 00000 n +0000406323 00000 n +0000406387 00000 n +0000406451 00000 n +0000406515 00000 n +0000406581 00000 n +0000406647 00000 n +0000406711 00000 n +0000406775 00000 n +0000406840 00000 n +0000406905 00000 n +0000406970 00000 n +0000407035 00000 n +0000407100 00000 n +0000407164 00000 n +0000407228 00000 n +0000407292 00000 n +0000407485 00000 n +0000407549 00000 n +0000407615 00000 n +0000407679 00000 n +0000407743 00000 n +0000407809 00000 n +0000407873 00000 n +0000407937 00000 n +0000408000 00000 n +0000408063 00000 n +0000408129 00000 n +0000408192 00000 n +0000408256 00000 n +0000408318 00000 n +0000408382 00000 n +0000408448 00000 n +0000408514 00000 n +0000408578 00000 n +0000408642 00000 n +0000408707 00000 n +0000408772 00000 n +0000408837 00000 n +0000408903 00000 n +0000408969 00000 n +0000409032 00000 n +0000409095 00000 n +0000409160 00000 n +0000409224 00000 n +0000409289 00000 n +0000409353 00000 n +0000409417 00000 n +0000413070 00000 n +0000410488 00000 n +0000409592 00000 n +0000410614 00000 n +0000410678 00000 n +0000410742 00000 n +0000410873 00000 n +0000410937 00000 n +0000411003 00000 n +0000411067 00000 n +0000411130 00000 n +0000411196 00000 n +0000411260 00000 n +0000411323 00000 n +0000411387 00000 n +0000411451 00000 n +0000411517 00000 n +0000411581 00000 n +0000411645 00000 n +0000411709 00000 n +0000411773 00000 n +0000411839 00000 n +0000411905 00000 n +0000411969 00000 n +0000412033 00000 n +0000412098 00000 n +0000412163 00000 n +0000412228 00000 n +0000412294 00000 n +0000412360 00000 n +0000412424 00000 n +0000412488 00000 n +0000412552 00000 n +0000412746 00000 n +0000412810 00000 n +0000412876 00000 n +0000412940 00000 n +0000413004 00000 n +0000417346 00000 n +0000414321 00000 n +0000413182 00000 n +0000414447 00000 n +0000414511 00000 n +0000414575 00000 n +0000414639 00000 n +0000414705 00000 n +0000414769 00000 n +0000414833 00000 n +0000414897 00000 n +0000414961 00000 n +0000415026 00000 n +0000415091 00000 n +0000415155 00000 n +0000415219 00000 n +0000415284 00000 n +0000415349 00000 n +0000415414 00000 n +0000415480 00000 n +0000415546 00000 n +0000415609 00000 n +0000415672 00000 n +0000415736 00000 n +0000415800 00000 n +0000415865 00000 n +0000415929 00000 n +0000415993 00000 n +0000416057 00000 n +0000416251 00000 n +0000416315 00000 n +0000416381 00000 n +0000416445 00000 n +0000416509 00000 n +0000416575 00000 n +0000416638 00000 n +0000416702 00000 n +0000416766 00000 n +0000416832 00000 n +0000416896 00000 n +0000416960 00000 n +0000417024 00000 n +0000417088 00000 n +0000417154 00000 n +0000417220 00000 n +0000417283 00000 n +0000422093 00000 n +0000418673 00000 n +0000417458 00000 n +0000418799 00000 n +0000418863 00000 n +0000418928 00000 n +0000418993 00000 n +0000419058 00000 n +0000419124 00000 n +0000419190 00000 n +0000419254 00000 n +0000419318 00000 n +0000419383 00000 n +0000419447 00000 n +0000419512 00000 n +0000419577 00000 n +0000419643 00000 n +0000419709 00000 n +0000419773 00000 n +0000419837 00000 n +0000419902 00000 n +0000419966 00000 n +0000420031 00000 n +0000420095 00000 n +0000420159 00000 n +0000420223 00000 n +0000420417 00000 n +0000420481 00000 n +0000420547 00000 n +0000420610 00000 n +0000420674 00000 n +0000420740 00000 n +0000420804 00000 n +0000420868 00000 n +0000420932 00000 n +0000420998 00000 n +0000421062 00000 n +0000421125 00000 n +0000421189 00000 n +0000421253 00000 n +0000421319 00000 n +0000421385 00000 n +0000421449 00000 n +0000421513 00000 n +0000421578 00000 n +0000421643 00000 n +0000421708 00000 n +0000421772 00000 n +0000421836 00000 n +0000421900 00000 n +0000421964 00000 n +0000422029 00000 n +0000934302 00000 n +0000426344 00000 n +0000423377 00000 n +0000422205 00000 n +0000423503 00000 n +0000423567 00000 n +0000423632 00000 n +0000423697 00000 n +0000423763 00000 n +0000423829 00000 n +0000423893 00000 n +0000423957 00000 n +0000424022 00000 n +0000424086 00000 n +0000424151 00000 n +0000424215 00000 n +0000424279 00000 n +0000424343 00000 n +0000424537 00000 n +0000424601 00000 n +0000424667 00000 n +0000424730 00000 n +0000424794 00000 n +0000424860 00000 n +0000424924 00000 n +0000424988 00000 n +0000425052 00000 n +0000425116 00000 n +0000425182 00000 n +0000425246 00000 n +0000425310 00000 n +0000425374 00000 n +0000425438 00000 n +0000425504 00000 n +0000425570 00000 n +0000425634 00000 n +0000425698 00000 n +0000425762 00000 n +0000425826 00000 n +0000425891 00000 n +0000425957 00000 n +0000426023 00000 n +0000426087 00000 n +0000426151 00000 n +0000426216 00000 n +0000426280 00000 n +0000430911 00000 n +0000427622 00000 n +0000426456 00000 n +0000427748 00000 n +0000427812 00000 n +0000427876 00000 n +0000427940 00000 n +0000428004 00000 n +0000428068 00000 n +0000428261 00000 n +0000428325 00000 n +0000428391 00000 n +0000428455 00000 n +0000428519 00000 n +0000428585 00000 n +0000428649 00000 n +0000428712 00000 n +0000428776 00000 n +0000428840 00000 n +0000428906 00000 n +0000428970 00000 n +0000429034 00000 n +0000429098 00000 n +0000429162 00000 n +0000429228 00000 n +0000429294 00000 n +0000429358 00000 n +0000429422 00000 n +0000429487 00000 n +0000429552 00000 n +0000429617 00000 n +0000429683 00000 n +0000429749 00000 n +0000429813 00000 n +0000429877 00000 n +0000429942 00000 n +0000430006 00000 n +0000430071 00000 n +0000430136 00000 n +0000430202 00000 n +0000430268 00000 n +0000430332 00000 n +0000430396 00000 n +0000430461 00000 n +0000430525 00000 n +0000430590 00000 n +0000430654 00000 n +0000430718 00000 n +0000430782 00000 n +0000434673 00000 n +0000432030 00000 n +0000431023 00000 n +0000432156 00000 n +0000432220 00000 n +0000432349 00000 n +0000432413 00000 n +0000432479 00000 n +0000432543 00000 n +0000432607 00000 n +0000432671 00000 n +0000432735 00000 n +0000432801 00000 n +0000432865 00000 n +0000432929 00000 n +0000432993 00000 n +0000433055 00000 n +0000433121 00000 n +0000433187 00000 n +0000433251 00000 n +0000433315 00000 n +0000433380 00000 n +0000433445 00000 n +0000433510 00000 n +0000433576 00000 n +0000433642 00000 n +0000433706 00000 n +0000433770 00000 n +0000433835 00000 n +0000433899 00000 n +0000433964 00000 n +0000434028 00000 n +0000434092 00000 n +0000434156 00000 n +0000434350 00000 n +0000434414 00000 n +0000434480 00000 n +0000434543 00000 n +0000434607 00000 n +0000439083 00000 n +0000435924 00000 n +0000434785 00000 n +0000436050 00000 n +0000436114 00000 n +0000436178 00000 n +0000436242 00000 n +0000436308 00000 n +0000436372 00000 n +0000436435 00000 n +0000436499 00000 n +0000436563 00000 n +0000436629 00000 n +0000436695 00000 n +0000436759 00000 n +0000436823 00000 n +0000436888 00000 n +0000436953 00000 n +0000437017 00000 n +0000437082 00000 n +0000437147 00000 n +0000437211 00000 n +0000437275 00000 n +0000437339 00000 n +0000437533 00000 n +0000437597 00000 n +0000437663 00000 n +0000437727 00000 n +0000437791 00000 n +0000437856 00000 n +0000437920 00000 n +0000437984 00000 n +0000438048 00000 n +0000438114 00000 n +0000438178 00000 n +0000438242 00000 n +0000438306 00000 n +0000438368 00000 n +0000438434 00000 n +0000438500 00000 n +0000438564 00000 n +0000438628 00000 n +0000438693 00000 n +0000438758 00000 n +0000438823 00000 n +0000438889 00000 n +0000438955 00000 n +0000439019 00000 n +0000442959 00000 n +0000440316 00000 n +0000439195 00000 n +0000440442 00000 n +0000440506 00000 n +0000440570 00000 n +0000440635 00000 n +0000440699 00000 n +0000440764 00000 n +0000440828 00000 n +0000440892 00000 n +0000440956 00000 n +0000441149 00000 n +0000441213 00000 n +0000441279 00000 n +0000441343 00000 n +0000441407 00000 n +0000441473 00000 n +0000441537 00000 n +0000441601 00000 n +0000441665 00000 n +0000441729 00000 n +0000441795 00000 n +0000441859 00000 n +0000441923 00000 n +0000441987 00000 n +0000442051 00000 n +0000442117 00000 n +0000442183 00000 n +0000442247 00000 n +0000442311 00000 n +0000442376 00000 n +0000442441 00000 n +0000442506 00000 n +0000442572 00000 n +0000442638 00000 n +0000442702 00000 n +0000442766 00000 n +0000442830 00000 n +0000446731 00000 n +0000444095 00000 n +0000443071 00000 n +0000444221 00000 n +0000444285 00000 n +0000444414 00000 n +0000444478 00000 n +0000444543 00000 n +0000444607 00000 n +0000444669 00000 n +0000444732 00000 n +0000444798 00000 n +0000444861 00000 n +0000444925 00000 n +0000444988 00000 n +0000445052 00000 n +0000445118 00000 n +0000445184 00000 n +0000445248 00000 n +0000445312 00000 n +0000445377 00000 n +0000445442 00000 n +0000445507 00000 n +0000445573 00000 n +0000445639 00000 n +0000445702 00000 n +0000445765 00000 n +0000445830 00000 n +0000445894 00000 n +0000445959 00000 n +0000446023 00000 n +0000446087 00000 n +0000446150 00000 n +0000446344 00000 n +0000446408 00000 n +0000446474 00000 n +0000446538 00000 n +0000446601 00000 n +0000446667 00000 n +0000934427 00000 n +0000450913 00000 n +0000447944 00000 n +0000446843 00000 n +0000448070 00000 n +0000448134 00000 n +0000448198 00000 n +0000448262 00000 n +0000448326 00000 n +0000448390 00000 n +0000448454 00000 n +0000448520 00000 n +0000448586 00000 n +0000448650 00000 n +0000448714 00000 n +0000448779 00000 n +0000448844 00000 n +0000448909 00000 n +0000448975 00000 n +0000449041 00000 n +0000449105 00000 n +0000449169 00000 n +0000449234 00000 n +0000449298 00000 n +0000449363 00000 n +0000449428 00000 n +0000449494 00000 n +0000449560 00000 n +0000449624 00000 n +0000449688 00000 n +0000449753 00000 n +0000449817 00000 n +0000449882 00000 n +0000449946 00000 n +0000450010 00000 n +0000450074 00000 n +0000450268 00000 n +0000450332 00000 n +0000450398 00000 n +0000450462 00000 n +0000450526 00000 n +0000450592 00000 n +0000450656 00000 n +0000450720 00000 n +0000450783 00000 n +0000450847 00000 n +0000455289 00000 n +0000452132 00000 n +0000451025 00000 n +0000452258 00000 n +0000452322 00000 n +0000452386 00000 n +0000452450 00000 n +0000452514 00000 n +0000452580 00000 n +0000452646 00000 n +0000452709 00000 n +0000452772 00000 n +0000452837 00000 n +0000452902 00000 n +0000452967 00000 n +0000453033 00000 n +0000453099 00000 n +0000453163 00000 n +0000453227 00000 n +0000453291 00000 n +0000453485 00000 n +0000453549 00000 n +0000453615 00000 n +0000453679 00000 n +0000453743 00000 n +0000453809 00000 n +0000453873 00000 n +0000453937 00000 n +0000454000 00000 n +0000454063 00000 n +0000454129 00000 n +0000454191 00000 n +0000454255 00000 n +0000454318 00000 n +0000454382 00000 n +0000454448 00000 n +0000454514 00000 n +0000454578 00000 n +0000454642 00000 n +0000454707 00000 n +0000454772 00000 n +0000454837 00000 n +0000454903 00000 n +0000454969 00000 n +0000455032 00000 n +0000455095 00000 n +0000455160 00000 n +0000455224 00000 n +0000460613 00000 n +0000456739 00000 n +0000455401 00000 n +0000456865 00000 n +0000456929 00000 n +0000456993 00000 n +0000457057 00000 n +0000457121 00000 n +0000457315 00000 n +0000457379 00000 n +0000457445 00000 n +0000457509 00000 n +0000457573 00000 n +0000457639 00000 n +0000457703 00000 n +0000457767 00000 n +0000457833 00000 n +0000457897 00000 n +0000457961 00000 n +0000458025 00000 n +0000458089 00000 n +0000458154 00000 n +0000458219 00000 n +0000458283 00000 n +0000458347 00000 n +0000458412 00000 n +0000458477 00000 n +0000458542 00000 n +0000458608 00000 n +0000458674 00000 n +0000458736 00000 n +0000458798 00000 n +0000458862 00000 n +0000458926 00000 n +0000458991 00000 n +0000459055 00000 n +0000459119 00000 n +0000459185 00000 n +0000459251 00000 n +0000459315 00000 n +0000459379 00000 n +0000459445 00000 n +0000459508 00000 n +0000459573 00000 n +0000459638 00000 n +0000459704 00000 n +0000459770 00000 n +0000459834 00000 n +0000459898 00000 n +0000459964 00000 n +0000460028 00000 n +0000460093 00000 n +0000460158 00000 n +0000460224 00000 n +0000460290 00000 n +0000460354 00000 n +0000460418 00000 n +0000460484 00000 n +0000460548 00000 n +0000466764 00000 n +0000462036 00000 n +0000460725 00000 n +0000462162 00000 n +0000462226 00000 n +0000462291 00000 n +0000462357 00000 n +0000462423 00000 n +0000462487 00000 n +0000462551 00000 n +0000462617 00000 n +0000462681 00000 n +0000462747 00000 n +0000462812 00000 n +0000462878 00000 n +0000462944 00000 n +0000463008 00000 n +0000463072 00000 n +0000463138 00000 n +0000463202 00000 n +0000463268 00000 n +0000463333 00000 n +0000463399 00000 n +0000463465 00000 n +0000463529 00000 n +0000463593 00000 n +0000463659 00000 n +0000463723 00000 n +0000463789 00000 n +0000463854 00000 n +0000463920 00000 n +0000463986 00000 n +0000464050 00000 n +0000464114 00000 n +0000464180 00000 n +0000464244 00000 n +0000464310 00000 n +0000464375 00000 n +0000464441 00000 n +0000464507 00000 n +0000464571 00000 n +0000464635 00000 n +0000464701 00000 n +0000464765 00000 n +0000464831 00000 n +0000464896 00000 n +0000464962 00000 n +0000465028 00000 n +0000465092 00000 n +0000465156 00000 n +0000465221 00000 n +0000465285 00000 n +0000465349 00000 n +0000465413 00000 n +0000465479 00000 n +0000465543 00000 n +0000465607 00000 n +0000465671 00000 n +0000465735 00000 n +0000465799 00000 n +0000465864 00000 n +0000465929 00000 n +0000465993 00000 n +0000466058 00000 n +0000466123 00000 n +0000466187 00000 n +0000466252 00000 n +0000466317 00000 n +0000466381 00000 n +0000466445 00000 n +0000466509 00000 n +0000466573 00000 n +0000466637 00000 n +0000466701 00000 n +0000472037 00000 n +0000468224 00000 n +0000466863 00000 n +0000468350 00000 n +0000468414 00000 n +0000468479 00000 n +0000468544 00000 n +0000468608 00000 n +0000468672 00000 n +0000468738 00000 n +0000468803 00000 n +0000468868 00000 n +0000468933 00000 n +0000468997 00000 n +0000469062 00000 n +0000469127 00000 n +0000469191 00000 n +0000469256 00000 n +0000469321 00000 n +0000469385 00000 n +0000469449 00000 n +0000469643 00000 n +0000469707 00000 n +0000469773 00000 n +0000469837 00000 n +0000469900 00000 n +0000469966 00000 n +0000470030 00000 n +0000470094 00000 n +0000470160 00000 n +0000470224 00000 n +0000470288 00000 n +0000470352 00000 n +0000470415 00000 n +0000470481 00000 n +0000470547 00000 n +0000470611 00000 n +0000470675 00000 n +0000470740 00000 n +0000470805 00000 n +0000470870 00000 n +0000470936 00000 n +0000471002 00000 n +0000471066 00000 n +0000471130 00000 n +0000471195 00000 n +0000471259 00000 n +0000471323 00000 n +0000471389 00000 n +0000471453 00000 n +0000471519 00000 n +0000471584 00000 n +0000471649 00000 n +0000471713 00000 n +0000471777 00000 n +0000471843 00000 n +0000471909 00000 n +0000471973 00000 n +0000476736 00000 n +0000473310 00000 n +0000472149 00000 n +0000473436 00000 n +0000473500 00000 n +0000473566 00000 n +0000473630 00000 n +0000473696 00000 n +0000473761 00000 n +0000473827 00000 n +0000473893 00000 n +0000473957 00000 n +0000474021 00000 n +0000474087 00000 n +0000474151 00000 n +0000474217 00000 n +0000474282 00000 n +0000474348 00000 n +0000474414 00000 n +0000474478 00000 n +0000474542 00000 n +0000474608 00000 n +0000474672 00000 n +0000474738 00000 n +0000474803 00000 n +0000474869 00000 n +0000474935 00000 n +0000474999 00000 n +0000475063 00000 n +0000475128 00000 n +0000475192 00000 n +0000475256 00000 n +0000475320 00000 n +0000475386 00000 n +0000475450 00000 n +0000475514 00000 n +0000475579 00000 n +0000475644 00000 n +0000475708 00000 n +0000475773 00000 n +0000475838 00000 n +0000475900 00000 n +0000475964 00000 n +0000476154 00000 n +0000476218 00000 n +0000476284 00000 n +0000476348 00000 n +0000476412 00000 n +0000476478 00000 n +0000476542 00000 n +0000476606 00000 n +0000476672 00000 n +0000934552 00000 n +0000482064 00000 n +0000478186 00000 n +0000476848 00000 n +0000478312 00000 n +0000478376 00000 n +0000478440 00000 n +0000478504 00000 n +0000478568 00000 n +0000478634 00000 n +0000478700 00000 n +0000478764 00000 n +0000478828 00000 n +0000478893 00000 n +0000478958 00000 n +0000479022 00000 n +0000479086 00000 n +0000479150 00000 n +0000479343 00000 n +0000479407 00000 n +0000479473 00000 n +0000479537 00000 n +0000479601 00000 n +0000479667 00000 n +0000479731 00000 n +0000479795 00000 n +0000479861 00000 n +0000479925 00000 n +0000479989 00000 n +0000480053 00000 n +0000480116 00000 n +0000480182 00000 n +0000480248 00000 n +0000480312 00000 n +0000480376 00000 n +0000480441 00000 n +0000480506 00000 n +0000480571 00000 n +0000480637 00000 n +0000480703 00000 n +0000480767 00000 n +0000480831 00000 n +0000480896 00000 n +0000480960 00000 n +0000481025 00000 n +0000481089 00000 n +0000481153 00000 n +0000481219 00000 n +0000481285 00000 n +0000481349 00000 n +0000481413 00000 n +0000481479 00000 n +0000481543 00000 n +0000481609 00000 n +0000481674 00000 n +0000481740 00000 n +0000481806 00000 n +0000481870 00000 n +0000481934 00000 n +0000482000 00000 n +0000488431 00000 n +0000483686 00000 n +0000482176 00000 n +0000483812 00000 n +0000483876 00000 n +0000483942 00000 n +0000484007 00000 n +0000484073 00000 n +0000484139 00000 n +0000484203 00000 n +0000484267 00000 n +0000484333 00000 n +0000484397 00000 n +0000484463 00000 n +0000484528 00000 n +0000484594 00000 n +0000484660 00000 n +0000484724 00000 n +0000484788 00000 n +0000484854 00000 n +0000484918 00000 n +0000484984 00000 n +0000485049 00000 n +0000485115 00000 n +0000485181 00000 n +0000485245 00000 n +0000485309 00000 n +0000485375 00000 n +0000485439 00000 n +0000485505 00000 n +0000485570 00000 n +0000485636 00000 n +0000485702 00000 n +0000485766 00000 n +0000485830 00000 n +0000485896 00000 n +0000485960 00000 n +0000486026 00000 n +0000486091 00000 n +0000486157 00000 n +0000486223 00000 n +0000486287 00000 n +0000486351 00000 n +0000486417 00000 n +0000486481 00000 n +0000486547 00000 n +0000486612 00000 n +0000486678 00000 n +0000486744 00000 n +0000486808 00000 n +0000486872 00000 n +0000486938 00000 n +0000487002 00000 n +0000487068 00000 n +0000487133 00000 n +0000487199 00000 n +0000487265 00000 n +0000487329 00000 n +0000487393 00000 n +0000487459 00000 n +0000487523 00000 n +0000487589 00000 n +0000487654 00000 n +0000487720 00000 n +0000487786 00000 n +0000487850 00000 n +0000487914 00000 n +0000487980 00000 n +0000488044 00000 n +0000488110 00000 n +0000488175 00000 n +0000488240 00000 n +0000488305 00000 n +0000488368 00000 n +0000495340 00000 n +0000490297 00000 n +0000488530 00000 n +0000490423 00000 n +0000490487 00000 n +0000490553 00000 n +0000490617 00000 n +0000490683 00000 n +0000490748 00000 n +0000490814 00000 n +0000490880 00000 n +0000490944 00000 n +0000491008 00000 n +0000491074 00000 n +0000491138 00000 n +0000491204 00000 n +0000491269 00000 n +0000491335 00000 n +0000491401 00000 n +0000491465 00000 n +0000491529 00000 n +0000491595 00000 n +0000491659 00000 n +0000491725 00000 n +0000491790 00000 n +0000491856 00000 n +0000491922 00000 n +0000491986 00000 n +0000492050 00000 n +0000492116 00000 n +0000492180 00000 n +0000492246 00000 n +0000492311 00000 n +0000492377 00000 n +0000492443 00000 n +0000492507 00000 n +0000492571 00000 n +0000492636 00000 n +0000492700 00000 n +0000492764 00000 n +0000492828 00000 n +0000492894 00000 n +0000492958 00000 n +0000493022 00000 n +0000493087 00000 n +0000493152 00000 n +0000493216 00000 n +0000493281 00000 n +0000493346 00000 n +0000493410 00000 n +0000493474 00000 n +0000493538 00000 n +0000493602 00000 n +0000493667 00000 n +0000493732 00000 n +0000493796 00000 n +0000493861 00000 n +0000493926 00000 n +0000493989 00000 n +0000494054 00000 n +0000494119 00000 n +0000494183 00000 n +0000494247 00000 n +0000494311 00000 n +0000494375 00000 n +0000494440 00000 n +0000494505 00000 n +0000494569 00000 n +0000494634 00000 n +0000494699 00000 n +0000494763 00000 n +0000494828 00000 n +0000494893 00000 n +0000494957 00000 n +0000495021 00000 n +0000495085 00000 n +0000495149 00000 n +0000495213 00000 n +0000495277 00000 n +0000500802 00000 n +0000496920 00000 n +0000495439 00000 n +0000497046 00000 n +0000497110 00000 n +0000497175 00000 n +0000497240 00000 n +0000497304 00000 n +0000497369 00000 n +0000497562 00000 n +0000497626 00000 n +0000497692 00000 n +0000497756 00000 n +0000497820 00000 n +0000497886 00000 n +0000497950 00000 n +0000498014 00000 n +0000498079 00000 n +0000498143 00000 n +0000498207 00000 n +0000498271 00000 n +0000498335 00000 n +0000498400 00000 n +0000498465 00000 n +0000498529 00000 n +0000498593 00000 n +0000498658 00000 n +0000498723 00000 n +0000498788 00000 n +0000498854 00000 n +0000498920 00000 n +0000498984 00000 n +0000499048 00000 n +0000499113 00000 n +0000499177 00000 n +0000499242 00000 n +0000499306 00000 n +0000499370 00000 n +0000499436 00000 n +0000499502 00000 n +0000499566 00000 n +0000499630 00000 n +0000499696 00000 n +0000499760 00000 n +0000499826 00000 n +0000499891 00000 n +0000499957 00000 n +0000500023 00000 n +0000500087 00000 n +0000500151 00000 n +0000500217 00000 n +0000500281 00000 n +0000500347 00000 n +0000500412 00000 n +0000500478 00000 n +0000500544 00000 n +0000500608 00000 n +0000500672 00000 n +0000500738 00000 n +0000506680 00000 n +0000502387 00000 n +0000500914 00000 n +0000502513 00000 n +0000502577 00000 n +0000502643 00000 n +0000502708 00000 n +0000502774 00000 n +0000502840 00000 n +0000502904 00000 n +0000502968 00000 n +0000503034 00000 n +0000503098 00000 n +0000503164 00000 n +0000503229 00000 n +0000503295 00000 n +0000503361 00000 n +0000503425 00000 n +0000503489 00000 n +0000503555 00000 n +0000503619 00000 n +0000503685 00000 n +0000503750 00000 n +0000503816 00000 n +0000503882 00000 n +0000503946 00000 n +0000504010 00000 n +0000504076 00000 n +0000504140 00000 n +0000504206 00000 n +0000504271 00000 n +0000504337 00000 n +0000504403 00000 n +0000504467 00000 n +0000504531 00000 n +0000504597 00000 n +0000504661 00000 n +0000504727 00000 n +0000504792 00000 n +0000504858 00000 n +0000504924 00000 n +0000504988 00000 n +0000505052 00000 n +0000505118 00000 n +0000505182 00000 n +0000505248 00000 n +0000505313 00000 n +0000505379 00000 n +0000505445 00000 n +0000505509 00000 n +0000505573 00000 n +0000505639 00000 n +0000505703 00000 n +0000505769 00000 n +0000505834 00000 n +0000505900 00000 n +0000505966 00000 n +0000506030 00000 n +0000506094 00000 n +0000506160 00000 n +0000506224 00000 n +0000506290 00000 n +0000506355 00000 n +0000506421 00000 n +0000506487 00000 n +0000506551 00000 n +0000506615 00000 n +0000512591 00000 n +0000508406 00000 n +0000506779 00000 n +0000508532 00000 n +0000508596 00000 n +0000508660 00000 n +0000508724 00000 n +0000508788 00000 n +0000508854 00000 n +0000508918 00000 n +0000508982 00000 n +0000509047 00000 n +0000509112 00000 n +0000509175 00000 n +0000509240 00000 n +0000509305 00000 n +0000509369 00000 n +0000509433 00000 n +0000509497 00000 n +0000509561 00000 n +0000509626 00000 n +0000509691 00000 n +0000509755 00000 n +0000509819 00000 n +0000509885 00000 n +0000509950 00000 n +0000510014 00000 n +0000510078 00000 n +0000510142 00000 n +0000510207 00000 n +0000510272 00000 n +0000510336 00000 n +0000510401 00000 n +0000510466 00000 n +0000510530 00000 n +0000510595 00000 n +0000510660 00000 n +0000510724 00000 n +0000510787 00000 n +0000510850 00000 n +0000510914 00000 n +0000510979 00000 n +0000511044 00000 n +0000511108 00000 n +0000511173 00000 n +0000511366 00000 n +0000511430 00000 n +0000511496 00000 n +0000511560 00000 n +0000511624 00000 n +0000511690 00000 n +0000511754 00000 n +0000511818 00000 n +0000511882 00000 n +0000511947 00000 n +0000512011 00000 n +0000512075 00000 n +0000512139 00000 n +0000512203 00000 n +0000512269 00000 n +0000512335 00000 n +0000512399 00000 n +0000512463 00000 n +0000512527 00000 n +0000934677 00000 n +0000518554 00000 n +0000514071 00000 n +0000512703 00000 n +0000514197 00000 n +0000514261 00000 n +0000514326 00000 n +0000514392 00000 n +0000514458 00000 n +0000514522 00000 n +0000514586 00000 n +0000514651 00000 n +0000514715 00000 n +0000514779 00000 n +0000514845 00000 n +0000514910 00000 n +0000514975 00000 n +0000515039 00000 n +0000515103 00000 n +0000515169 00000 n +0000515235 00000 n +0000515299 00000 n +0000515363 00000 n +0000515429 00000 n +0000515493 00000 n +0000515559 00000 n +0000515624 00000 n +0000515690 00000 n +0000515756 00000 n +0000515820 00000 n +0000515884 00000 n +0000515950 00000 n +0000516014 00000 n +0000516080 00000 n +0000516145 00000 n +0000516211 00000 n +0000516277 00000 n +0000516341 00000 n +0000516405 00000 n +0000516471 00000 n +0000516535 00000 n +0000516601 00000 n +0000516666 00000 n +0000516732 00000 n +0000516798 00000 n +0000516862 00000 n +0000516926 00000 n +0000516992 00000 n +0000517056 00000 n +0000517122 00000 n +0000517187 00000 n +0000517253 00000 n +0000517319 00000 n +0000517383 00000 n +0000517447 00000 n +0000517513 00000 n +0000517577 00000 n +0000517643 00000 n +0000517708 00000 n +0000517774 00000 n +0000517840 00000 n +0000517904 00000 n +0000517968 00000 n +0000518034 00000 n +0000518098 00000 n +0000518164 00000 n +0000518229 00000 n +0000518295 00000 n +0000518361 00000 n +0000518425 00000 n +0000518489 00000 n +0000523354 00000 n +0000519811 00000 n +0000518653 00000 n +0000519937 00000 n +0000520001 00000 n +0000520065 00000 n +0000520129 00000 n +0000520193 00000 n +0000520259 00000 n +0000520323 00000 n +0000520387 00000 n +0000520452 00000 n +0000520517 00000 n +0000520581 00000 n +0000520646 00000 n +0000520711 00000 n +0000520774 00000 n +0000520838 00000 n +0000520902 00000 n +0000520966 00000 n +0000521031 00000 n +0000521096 00000 n +0000521160 00000 n +0000521225 00000 n +0000521290 00000 n +0000521354 00000 n +0000521419 00000 n +0000521612 00000 n +0000521676 00000 n +0000521742 00000 n +0000521806 00000 n +0000521870 00000 n +0000521935 00000 n +0000521999 00000 n +0000522063 00000 n +0000522129 00000 n +0000522193 00000 n +0000522256 00000 n +0000522320 00000 n +0000522384 00000 n +0000522450 00000 n +0000522516 00000 n +0000522580 00000 n +0000522644 00000 n +0000522709 00000 n +0000522774 00000 n +0000522838 00000 n +0000522902 00000 n +0000522966 00000 n +0000523160 00000 n +0000523224 00000 n +0000523290 00000 n +0000529023 00000 n +0000524878 00000 n +0000523466 00000 n +0000525004 00000 n +0000525068 00000 n +0000525132 00000 n +0000525198 00000 n +0000525262 00000 n +0000525325 00000 n +0000525391 00000 n +0000525454 00000 n +0000525518 00000 n +0000525581 00000 n +0000525645 00000 n +0000525711 00000 n +0000525777 00000 n +0000525841 00000 n +0000525905 00000 n +0000525970 00000 n +0000526035 00000 n +0000526100 00000 n +0000526166 00000 n +0000526232 00000 n +0000526296 00000 n +0000526360 00000 n +0000526425 00000 n +0000526489 00000 n +0000526554 00000 n +0000526618 00000 n +0000526682 00000 n +0000526748 00000 n +0000526814 00000 n +0000526878 00000 n +0000526942 00000 n +0000527008 00000 n +0000527072 00000 n +0000527138 00000 n +0000527203 00000 n +0000527269 00000 n +0000527335 00000 n +0000527399 00000 n +0000527463 00000 n +0000527529 00000 n +0000527592 00000 n +0000527658 00000 n +0000527723 00000 n +0000527789 00000 n +0000527855 00000 n +0000527919 00000 n +0000527983 00000 n +0000528049 00000 n +0000528112 00000 n +0000528178 00000 n +0000528243 00000 n +0000528309 00000 n +0000528375 00000 n +0000528439 00000 n +0000528503 00000 n +0000528569 00000 n +0000528632 00000 n +0000528698 00000 n +0000528763 00000 n +0000528829 00000 n +0000528895 00000 n +0000528959 00000 n +0000533167 00000 n +0000530139 00000 n +0000529122 00000 n +0000530265 00000 n +0000530329 00000 n +0000530393 00000 n +0000530458 00000 n +0000530522 00000 n +0000530586 00000 n +0000530650 00000 n +0000530716 00000 n +0000530779 00000 n +0000530842 00000 n +0000530907 00000 n +0000530972 00000 n +0000531036 00000 n +0000531101 00000 n +0000531166 00000 n +0000531230 00000 n +0000531295 00000 n +0000531360 00000 n +0000531424 00000 n +0000531489 00000 n +0000531682 00000 n +0000531746 00000 n +0000531812 00000 n +0000531876 00000 n +0000531940 00000 n +0000532006 00000 n +0000532070 00000 n +0000532134 00000 n +0000532200 00000 n +0000532264 00000 n +0000532328 00000 n +0000532392 00000 n +0000532456 00000 n +0000532522 00000 n +0000532588 00000 n +0000532652 00000 n +0000532716 00000 n +0000532781 00000 n +0000532846 00000 n +0000532910 00000 n +0000532974 00000 n +0000533038 00000 n +0000536921 00000 n +0000534280 00000 n +0000533279 00000 n +0000534406 00000 n +0000534535 00000 n +0000534599 00000 n +0000534664 00000 n +0000534728 00000 n +0000534790 00000 n +0000534856 00000 n +0000534920 00000 n +0000534984 00000 n +0000535048 00000 n +0000535112 00000 n +0000535178 00000 n +0000535244 00000 n +0000535308 00000 n +0000535372 00000 n +0000535437 00000 n +0000535502 00000 n +0000535566 00000 n +0000535630 00000 n +0000535694 00000 n +0000535887 00000 n +0000535951 00000 n +0000536017 00000 n +0000536081 00000 n +0000536145 00000 n +0000536211 00000 n +0000536275 00000 n +0000536339 00000 n +0000536405 00000 n +0000536469 00000 n +0000536533 00000 n +0000536597 00000 n +0000536661 00000 n +0000536727 00000 n +0000536793 00000 n +0000536857 00000 n +0000543122 00000 n +0000538459 00000 n +0000537033 00000 n +0000538585 00000 n +0000538649 00000 n +0000538714 00000 n +0000538779 00000 n +0000538844 00000 n +0000538910 00000 n +0000538976 00000 n +0000539040 00000 n +0000539104 00000 n +0000539169 00000 n +0000539233 00000 n +0000539297 00000 n +0000539363 00000 n +0000539427 00000 n +0000539493 00000 n +0000539558 00000 n +0000539623 00000 n +0000539687 00000 n +0000539751 00000 n +0000539817 00000 n +0000539883 00000 n +0000539947 00000 n +0000540011 00000 n +0000540077 00000 n +0000540141 00000 n +0000540207 00000 n +0000540272 00000 n +0000540338 00000 n +0000540404 00000 n +0000540468 00000 n +0000540532 00000 n +0000540598 00000 n +0000540662 00000 n +0000540728 00000 n +0000540793 00000 n +0000540859 00000 n +0000540925 00000 n +0000540989 00000 n +0000541053 00000 n +0000541119 00000 n +0000541183 00000 n +0000541249 00000 n +0000541314 00000 n +0000541380 00000 n +0000541446 00000 n +0000541510 00000 n +0000541574 00000 n +0000541639 00000 n +0000541703 00000 n +0000541767 00000 n +0000541831 00000 n +0000541897 00000 n +0000541961 00000 n +0000542025 00000 n +0000542090 00000 n +0000542155 00000 n +0000542219 00000 n +0000542283 00000 n +0000542348 00000 n +0000542413 00000 n +0000542478 00000 n +0000542543 00000 n +0000542607 00000 n +0000542672 00000 n +0000542737 00000 n +0000542801 00000 n +0000542865 00000 n +0000542929 00000 n +0000542993 00000 n +0000543057 00000 n +0000934802 00000 n +0000548418 00000 n +0000544665 00000 n +0000543221 00000 n +0000544791 00000 n +0000544855 00000 n +0000544920 00000 n +0000544985 00000 n +0000545178 00000 n +0000545242 00000 n +0000545308 00000 n +0000545372 00000 n +0000545436 00000 n +0000545502 00000 n +0000545566 00000 n +0000545630 00000 n +0000545695 00000 n +0000545759 00000 n +0000545823 00000 n +0000545887 00000 n +0000545951 00000 n +0000546016 00000 n +0000546081 00000 n +0000546145 00000 n +0000546209 00000 n +0000546274 00000 n +0000546339 00000 n +0000546404 00000 n +0000546470 00000 n +0000546536 00000 n +0000546600 00000 n +0000546664 00000 n +0000546729 00000 n +0000546793 00000 n +0000546858 00000 n +0000546922 00000 n +0000546986 00000 n +0000547052 00000 n +0000547118 00000 n +0000547182 00000 n +0000547246 00000 n +0000547312 00000 n +0000547376 00000 n +0000547442 00000 n +0000547507 00000 n +0000547573 00000 n +0000547639 00000 n +0000547703 00000 n +0000547767 00000 n +0000547833 00000 n +0000547897 00000 n +0000547963 00000 n +0000548028 00000 n +0000548094 00000 n +0000548160 00000 n +0000548224 00000 n +0000548288 00000 n +0000548354 00000 n +0000554717 00000 n +0000549972 00000 n +0000548530 00000 n +0000550098 00000 n +0000550162 00000 n +0000550228 00000 n +0000550293 00000 n +0000550359 00000 n +0000550425 00000 n +0000550489 00000 n +0000550553 00000 n +0000550619 00000 n +0000550683 00000 n +0000550749 00000 n +0000550814 00000 n +0000550880 00000 n +0000550946 00000 n +0000551010 00000 n +0000551074 00000 n +0000551140 00000 n +0000551204 00000 n +0000551270 00000 n +0000551335 00000 n +0000551401 00000 n +0000551467 00000 n +0000551531 00000 n +0000551595 00000 n +0000551661 00000 n +0000551725 00000 n +0000551791 00000 n +0000551856 00000 n +0000551922 00000 n +0000551988 00000 n +0000552052 00000 n +0000552116 00000 n +0000552182 00000 n +0000552246 00000 n +0000552312 00000 n +0000552377 00000 n +0000552443 00000 n +0000552509 00000 n +0000552573 00000 n +0000552637 00000 n +0000552703 00000 n +0000552767 00000 n +0000552833 00000 n +0000552898 00000 n +0000552964 00000 n +0000553030 00000 n +0000553094 00000 n +0000553158 00000 n +0000553224 00000 n +0000553288 00000 n +0000553354 00000 n +0000553419 00000 n +0000553485 00000 n +0000553551 00000 n +0000553615 00000 n +0000553679 00000 n +0000553745 00000 n +0000553809 00000 n +0000553875 00000 n +0000553940 00000 n +0000554006 00000 n +0000554072 00000 n +0000554136 00000 n +0000554200 00000 n +0000554266 00000 n +0000554330 00000 n +0000554396 00000 n +0000554461 00000 n +0000554526 00000 n +0000554591 00000 n +0000554654 00000 n +0000561445 00000 n +0000556402 00000 n +0000554816 00000 n +0000556528 00000 n +0000556592 00000 n +0000556658 00000 n +0000556722 00000 n +0000556788 00000 n +0000556853 00000 n +0000556919 00000 n +0000556985 00000 n +0000557049 00000 n +0000557113 00000 n +0000557179 00000 n +0000557243 00000 n +0000557309 00000 n +0000557374 00000 n +0000557440 00000 n +0000557506 00000 n +0000557570 00000 n +0000557634 00000 n +0000557700 00000 n +0000557764 00000 n +0000557830 00000 n +0000557895 00000 n +0000557961 00000 n +0000558027 00000 n +0000558091 00000 n +0000558155 00000 n +0000558221 00000 n +0000558285 00000 n +0000558351 00000 n +0000558416 00000 n +0000558482 00000 n +0000558548 00000 n +0000558612 00000 n +0000558676 00000 n +0000558741 00000 n +0000558805 00000 n +0000558869 00000 n +0000558933 00000 n +0000558999 00000 n +0000559063 00000 n +0000559127 00000 n +0000559192 00000 n +0000559257 00000 n +0000559321 00000 n +0000559386 00000 n +0000559451 00000 n +0000559515 00000 n +0000559579 00000 n +0000559643 00000 n +0000559707 00000 n +0000559772 00000 n +0000559837 00000 n +0000559901 00000 n +0000559966 00000 n +0000560031 00000 n +0000560095 00000 n +0000560160 00000 n +0000560225 00000 n +0000560289 00000 n +0000560353 00000 n +0000560417 00000 n +0000560481 00000 n +0000560546 00000 n +0000560611 00000 n +0000560675 00000 n +0000560740 00000 n +0000560805 00000 n +0000560868 00000 n +0000560933 00000 n +0000560998 00000 n +0000561062 00000 n +0000561126 00000 n +0000561190 00000 n +0000561254 00000 n +0000561318 00000 n +0000561382 00000 n +0000566839 00000 n +0000563033 00000 n +0000561544 00000 n +0000563159 00000 n +0000563223 00000 n +0000563288 00000 n +0000563353 00000 n +0000563417 00000 n +0000563482 00000 n +0000563547 00000 n +0000563611 00000 n +0000563676 00000 n +0000563869 00000 n +0000563933 00000 n +0000563999 00000 n +0000564063 00000 n +0000564126 00000 n +0000564192 00000 n +0000564255 00000 n +0000564319 00000 n +0000564382 00000 n +0000564448 00000 n +0000564512 00000 n +0000564576 00000 n +0000564640 00000 n +0000564704 00000 n +0000564770 00000 n +0000564836 00000 n +0000564900 00000 n +0000564964 00000 n +0000565029 00000 n +0000565094 00000 n +0000565159 00000 n +0000565225 00000 n +0000565291 00000 n +0000565355 00000 n +0000565419 00000 n +0000565484 00000 n +0000565548 00000 n +0000565612 00000 n +0000565678 00000 n +0000565742 00000 n +0000565808 00000 n +0000565873 00000 n +0000565938 00000 n +0000566002 00000 n +0000566066 00000 n +0000566132 00000 n +0000566198 00000 n +0000566261 00000 n +0000566324 00000 n +0000566390 00000 n +0000566454 00000 n +0000566520 00000 n +0000566585 00000 n +0000566650 00000 n +0000566715 00000 n +0000566777 00000 n +0000573019 00000 n +0000568401 00000 n +0000566951 00000 n +0000568527 00000 n +0000568591 00000 n +0000568657 00000 n +0000568721 00000 n +0000568787 00000 n +0000568852 00000 n +0000568918 00000 n +0000568984 00000 n +0000569048 00000 n +0000569112 00000 n +0000569178 00000 n +0000569242 00000 n +0000569308 00000 n +0000569373 00000 n +0000569439 00000 n +0000569505 00000 n +0000569569 00000 n +0000569633 00000 n +0000569699 00000 n +0000569763 00000 n +0000569829 00000 n +0000569894 00000 n +0000569960 00000 n +0000570026 00000 n +0000570090 00000 n +0000570154 00000 n +0000570220 00000 n +0000570284 00000 n +0000570350 00000 n +0000570415 00000 n +0000570481 00000 n +0000570547 00000 n +0000570611 00000 n +0000570675 00000 n +0000570741 00000 n +0000570805 00000 n +0000570871 00000 n +0000570936 00000 n +0000571002 00000 n +0000571068 00000 n +0000571132 00000 n +0000571196 00000 n +0000571262 00000 n +0000571326 00000 n +0000571392 00000 n +0000571457 00000 n +0000571523 00000 n +0000571589 00000 n +0000571653 00000 n +0000571717 00000 n +0000571783 00000 n +0000571847 00000 n +0000571913 00000 n +0000571978 00000 n +0000572044 00000 n +0000572110 00000 n +0000572174 00000 n +0000572238 00000 n +0000572304 00000 n +0000572368 00000 n +0000572434 00000 n +0000572499 00000 n +0000572565 00000 n +0000572631 00000 n +0000572695 00000 n +0000572759 00000 n +0000572825 00000 n +0000572889 00000 n +0000572955 00000 n +0000579297 00000 n +0000574634 00000 n +0000573118 00000 n +0000574760 00000 n +0000574824 00000 n +0000574890 00000 n +0000574956 00000 n +0000575020 00000 n +0000575084 00000 n +0000575150 00000 n +0000575214 00000 n +0000575280 00000 n +0000575345 00000 n +0000575411 00000 n +0000575477 00000 n +0000575541 00000 n +0000575605 00000 n +0000575671 00000 n +0000575735 00000 n +0000575801 00000 n +0000575866 00000 n +0000575932 00000 n +0000575998 00000 n +0000576062 00000 n +0000576126 00000 n +0000576192 00000 n +0000576256 00000 n +0000576322 00000 n +0000576387 00000 n +0000576453 00000 n +0000576519 00000 n +0000576583 00000 n +0000576647 00000 n +0000576713 00000 n +0000576777 00000 n +0000576843 00000 n +0000576908 00000 n +0000576974 00000 n +0000577040 00000 n +0000577104 00000 n +0000577168 00000 n +0000577233 00000 n +0000577297 00000 n +0000577361 00000 n +0000577425 00000 n +0000577491 00000 n +0000577555 00000 n +0000577619 00000 n +0000577684 00000 n +0000577749 00000 n +0000577813 00000 n +0000577877 00000 n +0000577941 00000 n +0000578005 00000 n +0000578069 00000 n +0000578135 00000 n +0000578200 00000 n +0000578265 00000 n +0000578330 00000 n +0000578394 00000 n +0000578458 00000 n +0000578523 00000 n +0000578588 00000 n +0000578653 00000 n +0000578718 00000 n +0000578782 00000 n +0000578847 00000 n +0000578912 00000 n +0000578976 00000 n +0000579040 00000 n +0000579104 00000 n +0000579168 00000 n +0000579232 00000 n +0000934927 00000 n +0000585134 00000 n +0000581064 00000 n +0000579396 00000 n +0000581190 00000 n +0000581254 00000 n +0000581319 00000 n +0000581384 00000 n +0000581449 00000 n +0000581513 00000 n +0000581578 00000 n +0000581643 00000 n +0000581707 00000 n +0000581772 00000 n +0000581837 00000 n +0000581901 00000 n +0000581966 00000 n +0000582031 00000 n +0000582095 00000 n +0000582160 00000 n +0000582225 00000 n +0000582289 00000 n +0000582353 00000 n +0000582419 00000 n +0000582484 00000 n +0000582549 00000 n +0000582614 00000 n +0000582678 00000 n +0000582742 00000 n +0000582808 00000 n +0000582873 00000 n +0000582938 00000 n +0000583003 00000 n +0000583067 00000 n +0000583132 00000 n +0000583197 00000 n +0000583261 00000 n +0000583326 00000 n +0000583391 00000 n +0000583455 00000 n +0000583520 00000 n +0000583585 00000 n +0000583649 00000 n +0000583714 00000 n +0000583779 00000 n +0000583843 00000 n +0000583908 00000 n +0000583973 00000 n +0000584037 00000 n +0000584102 00000 n +0000584167 00000 n +0000584231 00000 n +0000584295 00000 n +0000584361 00000 n +0000584426 00000 n +0000584491 00000 n +0000584684 00000 n +0000584748 00000 n +0000584814 00000 n +0000584878 00000 n +0000584942 00000 n +0000585008 00000 n +0000585072 00000 n +0000591375 00000 n +0000586636 00000 n +0000585246 00000 n +0000586762 00000 n +0000586826 00000 n +0000586890 00000 n +0000586956 00000 n +0000587020 00000 n +0000587084 00000 n +0000587148 00000 n +0000587212 00000 n +0000587278 00000 n +0000587344 00000 n +0000587408 00000 n +0000587472 00000 n +0000587537 00000 n +0000587602 00000 n +0000587667 00000 n +0000587733 00000 n +0000587799 00000 n +0000587863 00000 n +0000587927 00000 n +0000587992 00000 n +0000588056 00000 n +0000588121 00000 n +0000588185 00000 n +0000588249 00000 n +0000588315 00000 n +0000588381 00000 n +0000588445 00000 n +0000588509 00000 n +0000588575 00000 n +0000588639 00000 n +0000588705 00000 n +0000588770 00000 n +0000588836 00000 n +0000588902 00000 n +0000588966 00000 n +0000589030 00000 n +0000589096 00000 n +0000589160 00000 n +0000589226 00000 n +0000589291 00000 n +0000589357 00000 n +0000589423 00000 n +0000589487 00000 n +0000589551 00000 n +0000589617 00000 n +0000589681 00000 n +0000589747 00000 n +0000589812 00000 n +0000589878 00000 n +0000589944 00000 n +0000590008 00000 n +0000590072 00000 n +0000590138 00000 n +0000590202 00000 n +0000590268 00000 n +0000590333 00000 n +0000590399 00000 n +0000590465 00000 n +0000590529 00000 n +0000590593 00000 n +0000590659 00000 n +0000590723 00000 n +0000590789 00000 n +0000590854 00000 n +0000590920 00000 n +0000590986 00000 n +0000591050 00000 n +0000591114 00000 n +0000591180 00000 n +0000591244 00000 n +0000591310 00000 n +0000597924 00000 n +0000592949 00000 n +0000591474 00000 n +0000593075 00000 n +0000593202 00000 n +0000593268 00000 n +0000593334 00000 n +0000593398 00000 n +0000593462 00000 n +0000593528 00000 n +0000593592 00000 n +0000593658 00000 n +0000593723 00000 n +0000593789 00000 n +0000593855 00000 n +0000593919 00000 n +0000593983 00000 n +0000594049 00000 n +0000594113 00000 n +0000594179 00000 n +0000594244 00000 n +0000594310 00000 n +0000594376 00000 n +0000594440 00000 n +0000594504 00000 n +0000594570 00000 n +0000594634 00000 n +0000594700 00000 n +0000594765 00000 n +0000594831 00000 n +0000594897 00000 n +0000594961 00000 n +0000595025 00000 n +0000595090 00000 n +0000595154 00000 n +0000595218 00000 n +0000595282 00000 n +0000595348 00000 n +0000595412 00000 n +0000595476 00000 n +0000595541 00000 n +0000595606 00000 n +0000595668 00000 n +0000595732 00000 n +0000595796 00000 n +0000595860 00000 n +0000595925 00000 n +0000595990 00000 n +0000596054 00000 n +0000596118 00000 n +0000596184 00000 n +0000596249 00000 n +0000596313 00000 n +0000596377 00000 n +0000596441 00000 n +0000596506 00000 n +0000596571 00000 n +0000596635 00000 n +0000596700 00000 n +0000596765 00000 n +0000596829 00000 n +0000596894 00000 n +0000596959 00000 n +0000597023 00000 n +0000597087 00000 n +0000597151 00000 n +0000597215 00000 n +0000597279 00000 n +0000597345 00000 n +0000597410 00000 n +0000597475 00000 n +0000597540 00000 n +0000597604 00000 n +0000597668 00000 n +0000597732 00000 n +0000597796 00000 n +0000597860 00000 n +0000602577 00000 n +0000599230 00000 n +0000598023 00000 n +0000599356 00000 n +0000599485 00000 n +0000599549 00000 n +0000599615 00000 n +0000599679 00000 n +0000599743 00000 n +0000599809 00000 n +0000599873 00000 n +0000599937 00000 n +0000600001 00000 n +0000600067 00000 n +0000600129 00000 n +0000600193 00000 n +0000600256 00000 n +0000600320 00000 n +0000600386 00000 n +0000600452 00000 n +0000600516 00000 n +0000600580 00000 n +0000600645 00000 n +0000600710 00000 n +0000600774 00000 n +0000600838 00000 n +0000600902 00000 n +0000600968 00000 n +0000601031 00000 n +0000601094 00000 n +0000601159 00000 n +0000601224 00000 n +0000601287 00000 n +0000601350 00000 n +0000601415 00000 n +0000601480 00000 n +0000601545 00000 n +0000601610 00000 n +0000601674 00000 n +0000601738 00000 n +0000601804 00000 n +0000601868 00000 n +0000601933 00000 n +0000601998 00000 n +0000602062 00000 n +0000602126 00000 n +0000602192 00000 n +0000602257 00000 n +0000602320 00000 n +0000602383 00000 n +0000602447 00000 n +0000602511 00000 n +0000606440 00000 n +0000603667 00000 n +0000602689 00000 n +0000603793 00000 n +0000603857 00000 n +0000603922 00000 n +0000603987 00000 n +0000604052 00000 n +0000604116 00000 n +0000604180 00000 n +0000604246 00000 n +0000604311 00000 n +0000604376 00000 n +0000604569 00000 n +0000604633 00000 n +0000604699 00000 n +0000604763 00000 n +0000604827 00000 n +0000604892 00000 n +0000604956 00000 n +0000605020 00000 n +0000605086 00000 n +0000605150 00000 n +0000605213 00000 n +0000605277 00000 n +0000605341 00000 n +0000605407 00000 n +0000605473 00000 n +0000605537 00000 n +0000605601 00000 n +0000605666 00000 n +0000605731 00000 n +0000605795 00000 n +0000605859 00000 n +0000605923 00000 n +0000606116 00000 n +0000606180 00000 n +0000606246 00000 n +0000606310 00000 n +0000606374 00000 n +0000612505 00000 n +0000608034 00000 n +0000606552 00000 n +0000608160 00000 n +0000608224 00000 n +0000608288 00000 n +0000608352 00000 n +0000608418 00000 n +0000608482 00000 n +0000608546 00000 n +0000608610 00000 n +0000608674 00000 n +0000608740 00000 n +0000608806 00000 n +0000608870 00000 n +0000608934 00000 n +0000608999 00000 n +0000609064 00000 n +0000609129 00000 n +0000609195 00000 n +0000609261 00000 n +0000609325 00000 n +0000609389 00000 n +0000609454 00000 n +0000609518 00000 n +0000609582 00000 n +0000609648 00000 n +0000609712 00000 n +0000609778 00000 n +0000609843 00000 n +0000609908 00000 n +0000609972 00000 n +0000610036 00000 n +0000610102 00000 n +0000610168 00000 n +0000610232 00000 n +0000610296 00000 n +0000610362 00000 n +0000610425 00000 n +0000610491 00000 n +0000610556 00000 n +0000610622 00000 n +0000610688 00000 n +0000610752 00000 n +0000610816 00000 n +0000610882 00000 n +0000610944 00000 n +0000611010 00000 n +0000611075 00000 n +0000611141 00000 n +0000611207 00000 n +0000611271 00000 n +0000611335 00000 n +0000611401 00000 n +0000611465 00000 n +0000611531 00000 n +0000611596 00000 n +0000611662 00000 n +0000611728 00000 n +0000611792 00000 n +0000611856 00000 n +0000611922 00000 n +0000611985 00000 n +0000612051 00000 n +0000612116 00000 n +0000612182 00000 n +0000612248 00000 n +0000612312 00000 n +0000612376 00000 n +0000612442 00000 n +0000935052 00000 n +0000617832 00000 n +0000613835 00000 n +0000612604 00000 n +0000613961 00000 n +0000614025 00000 n +0000614089 00000 n +0000614155 00000 n +0000614220 00000 n +0000614286 00000 n +0000614352 00000 n +0000614416 00000 n +0000614480 00000 n +0000614545 00000 n +0000614609 00000 n +0000614673 00000 n +0000614737 00000 n +0000614803 00000 n +0000614867 00000 n +0000614931 00000 n +0000614996 00000 n +0000615061 00000 n +0000615125 00000 n +0000615189 00000 n +0000615255 00000 n +0000615320 00000 n +0000615384 00000 n +0000615448 00000 n +0000615512 00000 n +0000615576 00000 n +0000615642 00000 n +0000615707 00000 n +0000615772 00000 n +0000615837 00000 n +0000615900 00000 n +0000615963 00000 n +0000616028 00000 n +0000616093 00000 n +0000616158 00000 n +0000616223 00000 n +0000616287 00000 n +0000616352 00000 n +0000616417 00000 n +0000616479 00000 n +0000616543 00000 n +0000616607 00000 n +0000616671 00000 n +0000616735 00000 n +0000616801 00000 n +0000616866 00000 n +0000616931 00000 n +0000616996 00000 n +0000617060 00000 n +0000617124 00000 n +0000617188 00000 n +0000617252 00000 n +0000617317 00000 n +0000617382 00000 n +0000617446 00000 n +0000617510 00000 n +0000617576 00000 n +0000617641 00000 n +0000617705 00000 n +0000623072 00000 n +0000619388 00000 n +0000617931 00000 n +0000619514 00000 n +0000619643 00000 n +0000619707 00000 n +0000619772 00000 n +0000619836 00000 n +0000619900 00000 n +0000619964 00000 n +0000620030 00000 n +0000620094 00000 n +0000620158 00000 n +0000620222 00000 n +0000620286 00000 n +0000620352 00000 n +0000620418 00000 n +0000620482 00000 n +0000620546 00000 n +0000620611 00000 n +0000620676 00000 n +0000620741 00000 n +0000620806 00000 n +0000620871 00000 n +0000620935 00000 n +0000620999 00000 n +0000621064 00000 n +0000621128 00000 n +0000621192 00000 n +0000621258 00000 n +0000621322 00000 n +0000621388 00000 n +0000621452 00000 n +0000621517 00000 n +0000621581 00000 n +0000621645 00000 n +0000621711 00000 n +0000621777 00000 n +0000621841 00000 n +0000621905 00000 n +0000621971 00000 n +0000622035 00000 n +0000622099 00000 n +0000622164 00000 n +0000622230 00000 n +0000622296 00000 n +0000622360 00000 n +0000622424 00000 n +0000622490 00000 n +0000622554 00000 n +0000622619 00000 n +0000622684 00000 n +0000622750 00000 n +0000622816 00000 n +0000622880 00000 n +0000622944 00000 n +0000623009 00000 n +0000629348 00000 n +0000624603 00000 n +0000623184 00000 n +0000624729 00000 n +0000624793 00000 n +0000624859 00000 n +0000624924 00000 n +0000624990 00000 n +0000625056 00000 n +0000625120 00000 n +0000625184 00000 n +0000625250 00000 n +0000625314 00000 n +0000625380 00000 n +0000625445 00000 n +0000625511 00000 n +0000625577 00000 n +0000625641 00000 n +0000625705 00000 n +0000625771 00000 n +0000625835 00000 n +0000625901 00000 n +0000625966 00000 n +0000626032 00000 n +0000626098 00000 n +0000626162 00000 n +0000626226 00000 n +0000626292 00000 n +0000626356 00000 n +0000626422 00000 n +0000626487 00000 n +0000626553 00000 n +0000626619 00000 n +0000626683 00000 n +0000626747 00000 n +0000626813 00000 n +0000626877 00000 n +0000626943 00000 n +0000627008 00000 n +0000627074 00000 n +0000627140 00000 n +0000627204 00000 n +0000627268 00000 n +0000627334 00000 n +0000627398 00000 n +0000627464 00000 n +0000627529 00000 n +0000627595 00000 n +0000627661 00000 n +0000627725 00000 n +0000627789 00000 n +0000627855 00000 n +0000627919 00000 n +0000627985 00000 n +0000628050 00000 n +0000628116 00000 n +0000628182 00000 n +0000628246 00000 n +0000628310 00000 n +0000628376 00000 n +0000628440 00000 n +0000628506 00000 n +0000628571 00000 n +0000628637 00000 n +0000628703 00000 n +0000628767 00000 n +0000628831 00000 n +0000628897 00000 n +0000628961 00000 n +0000629027 00000 n +0000629092 00000 n +0000629157 00000 n +0000629222 00000 n +0000629285 00000 n +0000635524 00000 n +0000630925 00000 n +0000629447 00000 n +0000631051 00000 n +0000631115 00000 n +0000631181 00000 n +0000631245 00000 n +0000631311 00000 n +0000631376 00000 n +0000631442 00000 n +0000631508 00000 n +0000631572 00000 n +0000631636 00000 n +0000631702 00000 n +0000631766 00000 n +0000631832 00000 n +0000631897 00000 n +0000631963 00000 n +0000632029 00000 n +0000632093 00000 n +0000632157 00000 n +0000632223 00000 n +0000632287 00000 n +0000632353 00000 n +0000632418 00000 n +0000632484 00000 n +0000632550 00000 n +0000632614 00000 n +0000632678 00000 n +0000632744 00000 n +0000632808 00000 n +0000632874 00000 n +0000632939 00000 n +0000633005 00000 n +0000633071 00000 n +0000633135 00000 n +0000633199 00000 n +0000633265 00000 n +0000633329 00000 n +0000633395 00000 n +0000633460 00000 n +0000633526 00000 n +0000633592 00000 n +0000633656 00000 n +0000633720 00000 n +0000633785 00000 n +0000633849 00000 n +0000633913 00000 n +0000633977 00000 n +0000634043 00000 n +0000634107 00000 n +0000634171 00000 n +0000634236 00000 n +0000634301 00000 n +0000634365 00000 n +0000634430 00000 n +0000634495 00000 n +0000634559 00000 n +0000634623 00000 n +0000634687 00000 n +0000634751 00000 n +0000634816 00000 n +0000634881 00000 n +0000634945 00000 n +0000635010 00000 n +0000635075 00000 n +0000635139 00000 n +0000635203 00000 n +0000635269 00000 n +0000635333 00000 n +0000635397 00000 n +0000635461 00000 n +0000641092 00000 n +0000636958 00000 n +0000635623 00000 n +0000637084 00000 n +0000637148 00000 n +0000637213 00000 n +0000637278 00000 n +0000637342 00000 n +0000637407 00000 n +0000637472 00000 n +0000637536 00000 n +0000637600 00000 n +0000637666 00000 n +0000637731 00000 n +0000637796 00000 n +0000637861 00000 n +0000637925 00000 n +0000637990 00000 n +0000638055 00000 n +0000638119 00000 n +0000638183 00000 n +0000638249 00000 n +0000638314 00000 n +0000638379 00000 n +0000638444 00000 n +0000638508 00000 n +0000638573 00000 n +0000638638 00000 n +0000638702 00000 n +0000638767 00000 n +0000638832 00000 n +0000638896 00000 n +0000638960 00000 n +0000639026 00000 n +0000639091 00000 n +0000639156 00000 n +0000639221 00000 n +0000639285 00000 n +0000639350 00000 n +0000639415 00000 n +0000639479 00000 n +0000639544 00000 n +0000639609 00000 n +0000639673 00000 n +0000639737 00000 n +0000639803 00000 n +0000639868 00000 n +0000639933 00000 n +0000639998 00000 n +0000640062 00000 n +0000640127 00000 n +0000640319 00000 n +0000640383 00000 n +0000640449 00000 n +0000640513 00000 n +0000640577 00000 n +0000640643 00000 n +0000640707 00000 n +0000640771 00000 n +0000640836 00000 n +0000640900 00000 n +0000640964 00000 n +0000641028 00000 n +0000645373 00000 n +0000642214 00000 n +0000641204 00000 n +0000642340 00000 n +0000642404 00000 n +0000642470 00000 n +0000642536 00000 n +0000642600 00000 n +0000642664 00000 n +0000642729 00000 n +0000642794 00000 n +0000642858 00000 n +0000642922 00000 n +0000642986 00000 n +0000643052 00000 n +0000643116 00000 n +0000643180 00000 n +0000643245 00000 n +0000643310 00000 n +0000643374 00000 n +0000643439 00000 n +0000643632 00000 n +0000643696 00000 n +0000643762 00000 n +0000643825 00000 n +0000643889 00000 n +0000643955 00000 n +0000644019 00000 n +0000644083 00000 n +0000644149 00000 n +0000644212 00000 n +0000644276 00000 n +0000644339 00000 n +0000644403 00000 n +0000644469 00000 n +0000644535 00000 n +0000644599 00000 n +0000644663 00000 n +0000644728 00000 n +0000644793 00000 n +0000644857 00000 n +0000644921 00000 n +0000644985 00000 n +0000645179 00000 n +0000645243 00000 n +0000645309 00000 n +0000935177 00000 n +0000651540 00000 n +0000647065 00000 n +0000645485 00000 n +0000647191 00000 n +0000647255 00000 n +0000647319 00000 n +0000647385 00000 n +0000647449 00000 n +0000647513 00000 n +0000647579 00000 n +0000647643 00000 n +0000647707 00000 n +0000647771 00000 n +0000647834 00000 n +0000647900 00000 n +0000647966 00000 n +0000648030 00000 n +0000648094 00000 n +0000648159 00000 n +0000648224 00000 n +0000648289 00000 n +0000648355 00000 n +0000648421 00000 n +0000648485 00000 n +0000648549 00000 n +0000648614 00000 n +0000648678 00000 n +0000648742 00000 n +0000648808 00000 n +0000648872 00000 n +0000648938 00000 n +0000649003 00000 n +0000649068 00000 n +0000649132 00000 n +0000649196 00000 n +0000649262 00000 n +0000649328 00000 n +0000649392 00000 n +0000649456 00000 n +0000649522 00000 n +0000649586 00000 n +0000649652 00000 n +0000649717 00000 n +0000649783 00000 n +0000649849 00000 n +0000649913 00000 n +0000649977 00000 n +0000650043 00000 n +0000650107 00000 n +0000650173 00000 n +0000650238 00000 n +0000650304 00000 n +0000650370 00000 n +0000650434 00000 n +0000650498 00000 n +0000650564 00000 n +0000650628 00000 n +0000650694 00000 n +0000650759 00000 n +0000650825 00000 n +0000650891 00000 n +0000650955 00000 n +0000651019 00000 n +0000651085 00000 n +0000651149 00000 n +0000651215 00000 n +0000651280 00000 n +0000651346 00000 n +0000651412 00000 n +0000651476 00000 n +0000657750 00000 n +0000653132 00000 n +0000651639 00000 n +0000653258 00000 n +0000653322 00000 n +0000653388 00000 n +0000653452 00000 n +0000653518 00000 n +0000653583 00000 n +0000653649 00000 n +0000653715 00000 n +0000653779 00000 n +0000653843 00000 n +0000653909 00000 n +0000653973 00000 n +0000654039 00000 n +0000654104 00000 n +0000654170 00000 n +0000654236 00000 n +0000654300 00000 n +0000654364 00000 n +0000654430 00000 n +0000654494 00000 n +0000654560 00000 n +0000654625 00000 n +0000654691 00000 n +0000654757 00000 n +0000654821 00000 n +0000654885 00000 n +0000654951 00000 n +0000655015 00000 n +0000655081 00000 n +0000655146 00000 n +0000655212 00000 n +0000655278 00000 n +0000655342 00000 n +0000655406 00000 n +0000655472 00000 n +0000655536 00000 n +0000655602 00000 n +0000655667 00000 n +0000655733 00000 n +0000655799 00000 n +0000655863 00000 n +0000655927 00000 n +0000655993 00000 n +0000656057 00000 n +0000656123 00000 n +0000656188 00000 n +0000656254 00000 n +0000656320 00000 n +0000656384 00000 n +0000656448 00000 n +0000656514 00000 n +0000656578 00000 n +0000656644 00000 n +0000656709 00000 n +0000656775 00000 n +0000656841 00000 n +0000656905 00000 n +0000656969 00000 n +0000657035 00000 n +0000657099 00000 n +0000657165 00000 n +0000657230 00000 n +0000657296 00000 n +0000657362 00000 n +0000657426 00000 n +0000657490 00000 n +0000657556 00000 n +0000657620 00000 n +0000657686 00000 n +0000664348 00000 n +0000659440 00000 n +0000657849 00000 n +0000659566 00000 n +0000659630 00000 n +0000659696 00000 n +0000659762 00000 n +0000659826 00000 n +0000659890 00000 n +0000659956 00000 n +0000660020 00000 n +0000660086 00000 n +0000660151 00000 n +0000660217 00000 n +0000660283 00000 n +0000660347 00000 n +0000660411 00000 n +0000660477 00000 n +0000660541 00000 n +0000660607 00000 n +0000660672 00000 n +0000660738 00000 n +0000660804 00000 n +0000660868 00000 n +0000660932 00000 n +0000660997 00000 n +0000661061 00000 n +0000661125 00000 n +0000661189 00000 n +0000661255 00000 n +0000661319 00000 n +0000661383 00000 n +0000661448 00000 n +0000661513 00000 n +0000661576 00000 n +0000661639 00000 n +0000661704 00000 n +0000661769 00000 n +0000661834 00000 n +0000661899 00000 n +0000661963 00000 n +0000662027 00000 n +0000662093 00000 n +0000662157 00000 n +0000662222 00000 n +0000662287 00000 n +0000662351 00000 n +0000662416 00000 n +0000662481 00000 n +0000662545 00000 n +0000662610 00000 n +0000662675 00000 n +0000662739 00000 n +0000662803 00000 n +0000662868 00000 n +0000662933 00000 n +0000662998 00000 n +0000663063 00000 n +0000663127 00000 n +0000663192 00000 n +0000663257 00000 n +0000663321 00000 n +0000663385 00000 n +0000663449 00000 n +0000663513 00000 n +0000663577 00000 n +0000663643 00000 n +0000663708 00000 n +0000663773 00000 n +0000663838 00000 n +0000663902 00000 n +0000663966 00000 n +0000664030 00000 n +0000664094 00000 n +0000664158 00000 n +0000664222 00000 n +0000664285 00000 n +0000669834 00000 n +0000666156 00000 n +0000664447 00000 n +0000666282 00000 n +0000666346 00000 n +0000666412 00000 n +0000666477 00000 n +0000666542 00000 n +0000666607 00000 n +0000666671 00000 n +0000666736 00000 n +0000666801 00000 n +0000666865 00000 n +0000666930 00000 n +0000666995 00000 n +0000667059 00000 n +0000667124 00000 n +0000667189 00000 n +0000667253 00000 n +0000667318 00000 n +0000667383 00000 n +0000667447 00000 n +0000667512 00000 n +0000667577 00000 n +0000667641 00000 n +0000667706 00000 n +0000667771 00000 n +0000667835 00000 n +0000667900 00000 n +0000667965 00000 n +0000668029 00000 n +0000668094 00000 n +0000668287 00000 n +0000668351 00000 n +0000668417 00000 n +0000668481 00000 n +0000668544 00000 n +0000668610 00000 n +0000668673 00000 n +0000668737 00000 n +0000668801 00000 n +0000668867 00000 n +0000668931 00000 n +0000668995 00000 n +0000669059 00000 n +0000669123 00000 n +0000669188 00000 n +0000669253 00000 n +0000669317 00000 n +0000669381 00000 n +0000669446 00000 n +0000669511 00000 n +0000669576 00000 n +0000669642 00000 n +0000669708 00000 n +0000669771 00000 n +0000675983 00000 n +0000671368 00000 n +0000669946 00000 n +0000671494 00000 n +0000671558 00000 n +0000671623 00000 n +0000671687 00000 n +0000671752 00000 n +0000671816 00000 n +0000671880 00000 n +0000671946 00000 n +0000672012 00000 n +0000672076 00000 n +0000672140 00000 n +0000672206 00000 n +0000672270 00000 n +0000672336 00000 n +0000672401 00000 n +0000672467 00000 n +0000672533 00000 n +0000672597 00000 n +0000672661 00000 n +0000672727 00000 n +0000672791 00000 n +0000672857 00000 n +0000672922 00000 n +0000672988 00000 n +0000673054 00000 n +0000673118 00000 n +0000673182 00000 n +0000673248 00000 n +0000673312 00000 n +0000673378 00000 n +0000673443 00000 n +0000673509 00000 n +0000673575 00000 n +0000673639 00000 n +0000673703 00000 n +0000673769 00000 n +0000673833 00000 n +0000673899 00000 n +0000673964 00000 n +0000674030 00000 n +0000674096 00000 n +0000674160 00000 n +0000674224 00000 n +0000674290 00000 n +0000674354 00000 n +0000674420 00000 n +0000674485 00000 n +0000674551 00000 n +0000674617 00000 n +0000674681 00000 n +0000674745 00000 n +0000674811 00000 n +0000674875 00000 n +0000674941 00000 n +0000675006 00000 n +0000675072 00000 n +0000675138 00000 n +0000675202 00000 n +0000675266 00000 n +0000675332 00000 n +0000675396 00000 n +0000675462 00000 n +0000675527 00000 n +0000675593 00000 n +0000675659 00000 n +0000675723 00000 n +0000675787 00000 n +0000675853 00000 n +0000675917 00000 n +0000681340 00000 n +0000677532 00000 n +0000676082 00000 n +0000677658 00000 n +0000677722 00000 n +0000677787 00000 n +0000677853 00000 n +0000677919 00000 n +0000677983 00000 n +0000678047 00000 n +0000678112 00000 n +0000678176 00000 n +0000678240 00000 n +0000678304 00000 n +0000678370 00000 n +0000678434 00000 n +0000678498 00000 n +0000678563 00000 n +0000678628 00000 n +0000678692 00000 n +0000678757 00000 n +0000678822 00000 n +0000678886 00000 n +0000678951 00000 n +0000679016 00000 n +0000679080 00000 n +0000679145 00000 n +0000679210 00000 n +0000679274 00000 n +0000679339 00000 n +0000679404 00000 n +0000679468 00000 n +0000679533 00000 n +0000679598 00000 n +0000679662 00000 n +0000679726 00000 n +0000679790 00000 n +0000679854 00000 n +0000679919 00000 n +0000680112 00000 n +0000680176 00000 n +0000680242 00000 n +0000680306 00000 n +0000680370 00000 n +0000680436 00000 n +0000680500 00000 n +0000680564 00000 n +0000680630 00000 n +0000680694 00000 n +0000680757 00000 n +0000680821 00000 n +0000680885 00000 n +0000680951 00000 n +0000681017 00000 n +0000681081 00000 n +0000681145 00000 n +0000681210 00000 n +0000681275 00000 n +0000935302 00000 n +0000687479 00000 n +0000682878 00000 n +0000681452 00000 n +0000683004 00000 n +0000683068 00000 n +0000683134 00000 n +0000683200 00000 n +0000683264 00000 n +0000683328 00000 n +0000683393 00000 n +0000683457 00000 n +0000683521 00000 n +0000683587 00000 n +0000683651 00000 n +0000683717 00000 n +0000683782 00000 n +0000683847 00000 n +0000683911 00000 n +0000683975 00000 n +0000684041 00000 n +0000684107 00000 n +0000684171 00000 n +0000684235 00000 n +0000684301 00000 n +0000684365 00000 n +0000684431 00000 n +0000684496 00000 n +0000684562 00000 n +0000684628 00000 n +0000684692 00000 n +0000684756 00000 n +0000684822 00000 n +0000684886 00000 n +0000684952 00000 n +0000685017 00000 n +0000685083 00000 n +0000685149 00000 n +0000685213 00000 n +0000685277 00000 n +0000685343 00000 n +0000685407 00000 n +0000685473 00000 n +0000685538 00000 n +0000685604 00000 n +0000685670 00000 n +0000685734 00000 n +0000685798 00000 n +0000685864 00000 n +0000685928 00000 n +0000685994 00000 n +0000686059 00000 n +0000686125 00000 n +0000686191 00000 n +0000686255 00000 n +0000686319 00000 n +0000686384 00000 n +0000686448 00000 n +0000686512 00000 n +0000686576 00000 n +0000686641 00000 n +0000686705 00000 n +0000686769 00000 n +0000686834 00000 n +0000686899 00000 n +0000686963 00000 n +0000687028 00000 n +0000687093 00000 n +0000687157 00000 n +0000687222 00000 n +0000687287 00000 n +0000687351 00000 n +0000687415 00000 n +0000691151 00000 n +0000688644 00000 n +0000687578 00000 n +0000688770 00000 n +0000688962 00000 n +0000689026 00000 n +0000689091 00000 n +0000689155 00000 n +0000689219 00000 n +0000689285 00000 n +0000689349 00000 n +0000689411 00000 n +0000689477 00000 n +0000689541 00000 n +0000689605 00000 n +0000689669 00000 n +0000689733 00000 n +0000689799 00000 n +0000689865 00000 n +0000689929 00000 n +0000689993 00000 n +0000690058 00000 n +0000690123 00000 n +0000690187 00000 n +0000690251 00000 n +0000690315 00000 n +0000690506 00000 n +0000690569 00000 n +0000690635 00000 n +0000690699 00000 n +0000690763 00000 n +0000690829 00000 n +0000690893 00000 n +0000690957 00000 n +0000691021 00000 n +0000691087 00000 n +0000697603 00000 n +0000692744 00000 n +0000691263 00000 n +0000692870 00000 n +0000692934 00000 n +0000692998 00000 n +0000693062 00000 n +0000693126 00000 n +0000693192 00000 n +0000693258 00000 n +0000693322 00000 n +0000693386 00000 n +0000693451 00000 n +0000693516 00000 n +0000693581 00000 n +0000693646 00000 n +0000693711 00000 n +0000693775 00000 n +0000693839 00000 n +0000693904 00000 n +0000693968 00000 n +0000694032 00000 n +0000694098 00000 n +0000694161 00000 n +0000694227 00000 n +0000694291 00000 n +0000694356 00000 n +0000694420 00000 n +0000694484 00000 n +0000694550 00000 n +0000694616 00000 n +0000694680 00000 n +0000694744 00000 n +0000694810 00000 n +0000694874 00000 n +0000694938 00000 n +0000695003 00000 n +0000695069 00000 n +0000695135 00000 n +0000695199 00000 n +0000695263 00000 n +0000695329 00000 n +0000695393 00000 n +0000695458 00000 n +0000695523 00000 n +0000695589 00000 n +0000695655 00000 n +0000695719 00000 n +0000695783 00000 n +0000695849 00000 n +0000695913 00000 n +0000695978 00000 n +0000696043 00000 n +0000696109 00000 n +0000696175 00000 n +0000696239 00000 n +0000696303 00000 n +0000696369 00000 n +0000696433 00000 n +0000696498 00000 n +0000696563 00000 n +0000696629 00000 n +0000696695 00000 n +0000696759 00000 n +0000696823 00000 n +0000696889 00000 n +0000696953 00000 n +0000697018 00000 n +0000697083 00000 n +0000697149 00000 n +0000697215 00000 n +0000697279 00000 n +0000697343 00000 n +0000697409 00000 n +0000697473 00000 n +0000697538 00000 n +0000703896 00000 n +0000699229 00000 n +0000697702 00000 n +0000699355 00000 n +0000699419 00000 n +0000699485 00000 n +0000699551 00000 n +0000699615 00000 n +0000699679 00000 n +0000699745 00000 n +0000699809 00000 n +0000699875 00000 n +0000699940 00000 n +0000700006 00000 n +0000700072 00000 n +0000700136 00000 n +0000700200 00000 n +0000700266 00000 n +0000700330 00000 n +0000700396 00000 n +0000700461 00000 n +0000700527 00000 n +0000700593 00000 n +0000700657 00000 n +0000700721 00000 n +0000700787 00000 n +0000700851 00000 n +0000700917 00000 n +0000700982 00000 n +0000701048 00000 n +0000701114 00000 n +0000701178 00000 n +0000701242 00000 n +0000701308 00000 n +0000701372 00000 n +0000701438 00000 n +0000701503 00000 n +0000701569 00000 n +0000701635 00000 n +0000701699 00000 n +0000701763 00000 n +0000701829 00000 n +0000701893 00000 n +0000701959 00000 n +0000702024 00000 n +0000702090 00000 n +0000702156 00000 n +0000702220 00000 n +0000702284 00000 n +0000702350 00000 n +0000702414 00000 n +0000702480 00000 n +0000702545 00000 n +0000702611 00000 n +0000702677 00000 n +0000702741 00000 n +0000702805 00000 n +0000702870 00000 n +0000702934 00000 n +0000702998 00000 n +0000703062 00000 n +0000703128 00000 n +0000703192 00000 n +0000703256 00000 n +0000703321 00000 n +0000703386 00000 n +0000703450 00000 n +0000703514 00000 n +0000703578 00000 n +0000703642 00000 n +0000703706 00000 n +0000703770 00000 n +0000703833 00000 n +0000709361 00000 n +0000705678 00000 n +0000703995 00000 n +0000705804 00000 n +0000705868 00000 n +0000705932 00000 n +0000705998 00000 n +0000706063 00000 n +0000706128 00000 n +0000706193 00000 n +0000706257 00000 n +0000706322 00000 n +0000706387 00000 n +0000706451 00000 n +0000706516 00000 n +0000706581 00000 n +0000706645 00000 n +0000706710 00000 n +0000706775 00000 n +0000706839 00000 n +0000706904 00000 n +0000706969 00000 n +0000707033 00000 n +0000707098 00000 n +0000707163 00000 n +0000707227 00000 n +0000707291 00000 n +0000707357 00000 n +0000707422 00000 n +0000707487 00000 n +0000707552 00000 n +0000707616 00000 n +0000707681 00000 n +0000707746 00000 n +0000707810 00000 n +0000707875 00000 n +0000707940 00000 n +0000708004 00000 n +0000708069 00000 n +0000708134 00000 n +0000708198 00000 n +0000708262 00000 n +0000708328 00000 n +0000708393 00000 n +0000708458 00000 n +0000708523 00000 n +0000708587 00000 n +0000708652 00000 n +0000708845 00000 n +0000708909 00000 n +0000708975 00000 n +0000709039 00000 n +0000709103 00000 n +0000709169 00000 n +0000709233 00000 n +0000709297 00000 n +0000713690 00000 n +0000710725 00000 n +0000709473 00000 n +0000710851 00000 n +0000710915 00000 n +0000710979 00000 n +0000711043 00000 n +0000711107 00000 n +0000711171 00000 n +0000711237 00000 n +0000711303 00000 n +0000711367 00000 n +0000711431 00000 n +0000711496 00000 n +0000711561 00000 n +0000711626 00000 n +0000711692 00000 n +0000711758 00000 n +0000711822 00000 n +0000711886 00000 n +0000711951 00000 n +0000712015 00000 n +0000712080 00000 n +0000712144 00000 n +0000712208 00000 n +0000712272 00000 n +0000712466 00000 n +0000712530 00000 n +0000712595 00000 n +0000712659 00000 n +0000712723 00000 n +0000712789 00000 n +0000712853 00000 n +0000712917 00000 n +0000712981 00000 n +0000713047 00000 n +0000713111 00000 n +0000713175 00000 n +0000713239 00000 n +0000713302 00000 n +0000713368 00000 n +0000713434 00000 n +0000713498 00000 n +0000713562 00000 n +0000713626 00000 n +0000935427 00000 n +0000722160 00000 n +0000715874 00000 n +0000713802 00000 n +0000716000 00000 n +0000716064 00000 n +0000716129 00000 n +0000716195 00000 n +0000716261 00000 n +0000716325 00000 n +0000716389 00000 n +0000716454 00000 n +0000716518 00000 n +0000716583 00000 n +0000716647 00000 n +0000716711 00000 n +0000716775 00000 n +0000716841 00000 n +0000716904 00000 n +0000716967 00000 n +0000717032 00000 n +0000717097 00000 n +0000717160 00000 n +0000717225 00000 n +0000717290 00000 n +0000717354 00000 n +0000717419 00000 n +0000717484 00000 n +0000717548 00000 n +0000717612 00000 n +0000717678 00000 n +0000717744 00000 n +0000717808 00000 n +0000717874 00000 n +0000717940 00000 n +0000718003 00000 n +0000718068 00000 n +0000718133 00000 n +0000718197 00000 n +0000718263 00000 n +0000718329 00000 n +0000718393 00000 n +0000718459 00000 n +0000718525 00000 n +0000718588 00000 n +0000718654 00000 n +0000718720 00000 n +0000718783 00000 n +0000718848 00000 n +0000718913 00000 n +0000718977 00000 n +0000719043 00000 n +0000719109 00000 n +0000719173 00000 n +0000719239 00000 n +0000719305 00000 n +0000719369 00000 n +0000719435 00000 n +0000719501 00000 n +0000719563 00000 n +0000719628 00000 n +0000719693 00000 n +0000719757 00000 n +0000719823 00000 n +0000719889 00000 n +0000719953 00000 n +0000720019 00000 n +0000720085 00000 n +0000720149 00000 n +0000720215 00000 n +0000720281 00000 n +0000720345 00000 n +0000720410 00000 n +0000720475 00000 n +0000720539 00000 n +0000720604 00000 n +0000720669 00000 n +0000720733 00000 n +0000720798 00000 n +0000720863 00000 n +0000720927 00000 n +0000720991 00000 n +0000721056 00000 n +0000721121 00000 n +0000721185 00000 n +0000721251 00000 n +0000721317 00000 n +0000721381 00000 n +0000721447 00000 n +0000721513 00000 n +0000721577 00000 n +0000721643 00000 n +0000721709 00000 n +0000721773 00000 n +0000721838 00000 n +0000721903 00000 n +0000721967 00000 n +0000722032 00000 n +0000722097 00000 n +0000728586 00000 n +0000723835 00000 n +0000722259 00000 n +0000723961 00000 n +0000724025 00000 n +0000724089 00000 n +0000724155 00000 n +0000724221 00000 n +0000724285 00000 n +0000724351 00000 n +0000724417 00000 n +0000724481 00000 n +0000724547 00000 n +0000724613 00000 n +0000724677 00000 n +0000724743 00000 n +0000724809 00000 n +0000724873 00000 n +0000724939 00000 n +0000725005 00000 n +0000725069 00000 n +0000725135 00000 n +0000725201 00000 n +0000725265 00000 n +0000725331 00000 n +0000725397 00000 n +0000725461 00000 n +0000725527 00000 n +0000725593 00000 n +0000725657 00000 n +0000725723 00000 n +0000725789 00000 n +0000725854 00000 n +0000725919 00000 n +0000725984 00000 n +0000726048 00000 n +0000726112 00000 n +0000726178 00000 n +0000726244 00000 n +0000726308 00000 n +0000726374 00000 n +0000726440 00000 n +0000726504 00000 n +0000726570 00000 n +0000726636 00000 n +0000726700 00000 n +0000726766 00000 n +0000726832 00000 n +0000726896 00000 n +0000726960 00000 n +0000727026 00000 n +0000727092 00000 n +0000727156 00000 n +0000727222 00000 n +0000727288 00000 n +0000727353 00000 n +0000727419 00000 n +0000727485 00000 n +0000727549 00000 n +0000727615 00000 n +0000727681 00000 n +0000727745 00000 n +0000727809 00000 n +0000727875 00000 n +0000727941 00000 n +0000728005 00000 n +0000728071 00000 n +0000728264 00000 n +0000728328 00000 n +0000728394 00000 n +0000728458 00000 n +0000728520 00000 n +0000734666 00000 n +0000730201 00000 n +0000728698 00000 n +0000730327 00000 n +0000730391 00000 n +0000730455 00000 n +0000730519 00000 n +0000730585 00000 n +0000730649 00000 n +0000730713 00000 n +0000730777 00000 n +0000730841 00000 n +0000730906 00000 n +0000730971 00000 n +0000731035 00000 n +0000731099 00000 n +0000731164 00000 n +0000731229 00000 n +0000731294 00000 n +0000731360 00000 n +0000731426 00000 n +0000731489 00000 n +0000731552 00000 n +0000731616 00000 n +0000731680 00000 n +0000731744 00000 n +0000731810 00000 n +0000731874 00000 n +0000731940 00000 n +0000732005 00000 n +0000732069 00000 n +0000732133 00000 n +0000732197 00000 n +0000732263 00000 n +0000732329 00000 n +0000732393 00000 n +0000732457 00000 n +0000732523 00000 n +0000732587 00000 n +0000732653 00000 n +0000732717 00000 n +0000732783 00000 n +0000732849 00000 n +0000732913 00000 n +0000732977 00000 n +0000733043 00000 n +0000733107 00000 n +0000733173 00000 n +0000733236 00000 n +0000733302 00000 n +0000733368 00000 n +0000733432 00000 n +0000733496 00000 n +0000733562 00000 n +0000733626 00000 n +0000733692 00000 n +0000733756 00000 n +0000733822 00000 n +0000733888 00000 n +0000733952 00000 n +0000734016 00000 n +0000734082 00000 n +0000734146 00000 n +0000734212 00000 n +0000734276 00000 n +0000734342 00000 n +0000734408 00000 n +0000734472 00000 n +0000734536 00000 n +0000734602 00000 n +0000740935 00000 n +0000736190 00000 n +0000734765 00000 n +0000736316 00000 n +0000736380 00000 n +0000736446 00000 n +0000736511 00000 n +0000736577 00000 n +0000736643 00000 n +0000736707 00000 n +0000736771 00000 n +0000736837 00000 n +0000736901 00000 n +0000736967 00000 n +0000737032 00000 n +0000737098 00000 n +0000737164 00000 n +0000737228 00000 n +0000737292 00000 n +0000737358 00000 n +0000737422 00000 n +0000737488 00000 n +0000737553 00000 n +0000737619 00000 n +0000737685 00000 n +0000737749 00000 n +0000737813 00000 n +0000737879 00000 n +0000737943 00000 n +0000738009 00000 n +0000738074 00000 n +0000738140 00000 n +0000738206 00000 n +0000738270 00000 n +0000738334 00000 n +0000738400 00000 n +0000738464 00000 n +0000738530 00000 n +0000738595 00000 n +0000738661 00000 n +0000738727 00000 n +0000738791 00000 n +0000738855 00000 n +0000738921 00000 n +0000738985 00000 n +0000739051 00000 n +0000739116 00000 n +0000739182 00000 n +0000739248 00000 n +0000739312 00000 n +0000739376 00000 n +0000739442 00000 n +0000739506 00000 n +0000739572 00000 n +0000739637 00000 n +0000739703 00000 n +0000739769 00000 n +0000739833 00000 n +0000739897 00000 n +0000739963 00000 n +0000740027 00000 n +0000740093 00000 n +0000740158 00000 n +0000740224 00000 n +0000740290 00000 n +0000740354 00000 n +0000740418 00000 n +0000740484 00000 n +0000740548 00000 n +0000740614 00000 n +0000740679 00000 n +0000740744 00000 n +0000740809 00000 n +0000740872 00000 n +0000745226 00000 n +0000742312 00000 n +0000741034 00000 n +0000742438 00000 n +0000742502 00000 n +0000742568 00000 n +0000742632 00000 n +0000742698 00000 n +0000742763 00000 n +0000742829 00000 n +0000742895 00000 n +0000742959 00000 n +0000743023 00000 n +0000743089 00000 n +0000743153 00000 n +0000743219 00000 n +0000743284 00000 n +0000743350 00000 n +0000743416 00000 n +0000743480 00000 n +0000743544 00000 n +0000743610 00000 n +0000743674 00000 n +0000743740 00000 n +0000743805 00000 n +0000743871 00000 n +0000743937 00000 n +0000744001 00000 n +0000744067 00000 n +0000744133 00000 n +0000744197 00000 n +0000744261 00000 n +0000744325 00000 n +0000744518 00000 n +0000744581 00000 n +0000744647 00000 n +0000744711 00000 n +0000744775 00000 n +0000744841 00000 n +0000744905 00000 n +0000744969 00000 n +0000745033 00000 n +0000745097 00000 n +0000745162 00000 n +0000750074 00000 n +0000746465 00000 n +0000745338 00000 n +0000746591 00000 n +0000746718 00000 n +0000746782 00000 n +0000746846 00000 n +0000746910 00000 n +0000746976 00000 n +0000747042 00000 n +0000747106 00000 n +0000747170 00000 n +0000747235 00000 n +0000747300 00000 n +0000747365 00000 n +0000747430 00000 n +0000747495 00000 n +0000747559 00000 n +0000747623 00000 n +0000747688 00000 n +0000747752 00000 n +0000747817 00000 n +0000747881 00000 n +0000747945 00000 n +0000748009 00000 n +0000748202 00000 n +0000748266 00000 n +0000748332 00000 n +0000748396 00000 n +0000748459 00000 n +0000748525 00000 n +0000748589 00000 n +0000748653 00000 n +0000748719 00000 n +0000748783 00000 n +0000748845 00000 n +0000748909 00000 n +0000748973 00000 n +0000749039 00000 n +0000749105 00000 n +0000749169 00000 n +0000749233 00000 n +0000749298 00000 n +0000749363 00000 n +0000749428 00000 n +0000749494 00000 n +0000749560 00000 n +0000749624 00000 n +0000749688 00000 n +0000749753 00000 n +0000749817 00000 n +0000749882 00000 n +0000749946 00000 n +0000750010 00000 n +0000935552 00000 n +0000754439 00000 n +0000751531 00000 n +0000750186 00000 n +0000751657 00000 n +0000751721 00000 n +0000751785 00000 n +0000751916 00000 n +0000751980 00000 n +0000752046 00000 n +0000752110 00000 n +0000752173 00000 n +0000752239 00000 n +0000752303 00000 n +0000752367 00000 n +0000752431 00000 n +0000752495 00000 n +0000752561 00000 n +0000752625 00000 n +0000752689 00000 n +0000752753 00000 n +0000752817 00000 n +0000752883 00000 n +0000752949 00000 n +0000753013 00000 n +0000753077 00000 n +0000753142 00000 n +0000753207 00000 n +0000753272 00000 n +0000753338 00000 n +0000753404 00000 n +0000753468 00000 n +0000753532 00000 n +0000753597 00000 n +0000753661 00000 n +0000753726 00000 n +0000753791 00000 n +0000753857 00000 n +0000753923 00000 n +0000753987 00000 n +0000754053 00000 n +0000754119 00000 n +0000754183 00000 n +0000754247 00000 n +0000754311 00000 n +0000758619 00000 n +0000755724 00000 n +0000754551 00000 n +0000755850 00000 n +0000755979 00000 n +0000756043 00000 n +0000756108 00000 n +0000756172 00000 n +0000756234 00000 n +0000756298 00000 n +0000756364 00000 n +0000756427 00000 n +0000756491 00000 n +0000756554 00000 n +0000756618 00000 n +0000756684 00000 n +0000756750 00000 n +0000756814 00000 n +0000756878 00000 n +0000756943 00000 n +0000757008 00000 n +0000757073 00000 n +0000757139 00000 n +0000757205 00000 n +0000757268 00000 n +0000757331 00000 n +0000757396 00000 n +0000757460 00000 n +0000757525 00000 n +0000757590 00000 n +0000757656 00000 n +0000757722 00000 n +0000757785 00000 n +0000757848 00000 n +0000757913 00000 n +0000757977 00000 n +0000758042 00000 n +0000758106 00000 n +0000758170 00000 n +0000758232 00000 n +0000758426 00000 n +0000758489 00000 n +0000758555 00000 n +0000763865 00000 n +0000759990 00000 n +0000758731 00000 n +0000760116 00000 n +0000760180 00000 n +0000760244 00000 n +0000760308 00000 n +0000760374 00000 n +0000760438 00000 n +0000760502 00000 n +0000760566 00000 n +0000760630 00000 n +0000760696 00000 n +0000760760 00000 n +0000760824 00000 n +0000760888 00000 n +0000760952 00000 n +0000761018 00000 n +0000761084 00000 n +0000761148 00000 n +0000761212 00000 n +0000761277 00000 n +0000761342 00000 n +0000761407 00000 n +0000761473 00000 n +0000761539 00000 n +0000761603 00000 n +0000761669 00000 n +0000761735 00000 n +0000761799 00000 n +0000761863 00000 n +0000761928 00000 n +0000761993 00000 n +0000762057 00000 n +0000762122 00000 n +0000762187 00000 n +0000762251 00000 n +0000762316 00000 n +0000762381 00000 n +0000762445 00000 n +0000762510 00000 n +0000762575 00000 n +0000762638 00000 n +0000762703 00000 n +0000762768 00000 n +0000762832 00000 n +0000762897 00000 n +0000762962 00000 n +0000763026 00000 n +0000763091 00000 n +0000763156 00000 n +0000763220 00000 n +0000763284 00000 n +0000763348 00000 n +0000763542 00000 n +0000763606 00000 n +0000763672 00000 n +0000763736 00000 n +0000763799 00000 n +0000768364 00000 n +0000765135 00000 n +0000763977 00000 n +0000765261 00000 n +0000765325 00000 n +0000765389 00000 n +0000765453 00000 n +0000765517 00000 n +0000765583 00000 n +0000765647 00000 n +0000765711 00000 n +0000765775 00000 n +0000765839 00000 n +0000765905 00000 n +0000765971 00000 n +0000766035 00000 n +0000766099 00000 n +0000766164 00000 n +0000766229 00000 n +0000766294 00000 n +0000766360 00000 n +0000766426 00000 n +0000766490 00000 n +0000766554 00000 n +0000766619 00000 n +0000766683 00000 n +0000766748 00000 n +0000766813 00000 n +0000766879 00000 n +0000766945 00000 n +0000767009 00000 n +0000767073 00000 n +0000767138 00000 n +0000767203 00000 n +0000767267 00000 n +0000767332 00000 n +0000767397 00000 n +0000767461 00000 n +0000767525 00000 n +0000767589 00000 n +0000767783 00000 n +0000767847 00000 n +0000767913 00000 n +0000767977 00000 n +0000768040 00000 n +0000768106 00000 n +0000768170 00000 n +0000768234 00000 n +0000768298 00000 n +0000774299 00000 n +0000770046 00000 n +0000768476 00000 n +0000770172 00000 n +0000770236 00000 n +0000770300 00000 n +0000770364 00000 n +0000770428 00000 n +0000770492 00000 n +0000770558 00000 n +0000770624 00000 n +0000770687 00000 n +0000770750 00000 n +0000770815 00000 n +0000770880 00000 n +0000770945 00000 n +0000771011 00000 n +0000771077 00000 n +0000771141 00000 n +0000771207 00000 n +0000771273 00000 n +0000771337 00000 n +0000771401 00000 n +0000771466 00000 n +0000771531 00000 n +0000771594 00000 n +0000771659 00000 n +0000771724 00000 n +0000771788 00000 n +0000771853 00000 n +0000771918 00000 n +0000771982 00000 n +0000772047 00000 n +0000772112 00000 n +0000772176 00000 n +0000772241 00000 n +0000772306 00000 n +0000772369 00000 n +0000772433 00000 n +0000772497 00000 n +0000772561 00000 n +0000772626 00000 n +0000772691 00000 n +0000772755 00000 n +0000772820 00000 n +0000772885 00000 n +0000772949 00000 n +0000773014 00000 n +0000773079 00000 n +0000773142 00000 n +0000773206 00000 n +0000773270 00000 n +0000773334 00000 n +0000773399 00000 n +0000773464 00000 n +0000773528 00000 n +0000773592 00000 n +0000773655 00000 n +0000773849 00000 n +0000773912 00000 n +0000773978 00000 n +0000774042 00000 n +0000774106 00000 n +0000774172 00000 n +0000774235 00000 n +0000778785 00000 n +0000775491 00000 n +0000774411 00000 n +0000775617 00000 n +0000775681 00000 n +0000775745 00000 n +0000775809 00000 n +0000775873 00000 n +0000775937 00000 n +0000776003 00000 n +0000776069 00000 n +0000776133 00000 n +0000776197 00000 n +0000776262 00000 n +0000776327 00000 n +0000776392 00000 n +0000776458 00000 n +0000776524 00000 n +0000776588 00000 n +0000776654 00000 n +0000776720 00000 n +0000776784 00000 n +0000776848 00000 n +0000776913 00000 n +0000776978 00000 n +0000777042 00000 n +0000777107 00000 n +0000777172 00000 n +0000777236 00000 n +0000777300 00000 n +0000777364 00000 n +0000777557 00000 n +0000777621 00000 n +0000777687 00000 n +0000777751 00000 n +0000777815 00000 n +0000777881 00000 n +0000777945 00000 n +0000778009 00000 n +0000778073 00000 n +0000778139 00000 n +0000778203 00000 n +0000778267 00000 n +0000778331 00000 n +0000778395 00000 n +0000778461 00000 n +0000778527 00000 n +0000778591 00000 n +0000778655 00000 n +0000778720 00000 n +0000935677 00000 n +0000783994 00000 n +0000780116 00000 n +0000778897 00000 n +0000780242 00000 n +0000780306 00000 n +0000780370 00000 n +0000780435 00000 n +0000780501 00000 n +0000780567 00000 n +0000780631 00000 n +0000780697 00000 n +0000780763 00000 n +0000780827 00000 n +0000780891 00000 n +0000780956 00000 n +0000781021 00000 n +0000781085 00000 n +0000781150 00000 n +0000781215 00000 n +0000781279 00000 n +0000781343 00000 n +0000781407 00000 n +0000781601 00000 n +0000781665 00000 n +0000781731 00000 n +0000781794 00000 n +0000781858 00000 n +0000781924 00000 n +0000781988 00000 n +0000782052 00000 n +0000782116 00000 n +0000782182 00000 n +0000782246 00000 n +0000782310 00000 n +0000782374 00000 n +0000782438 00000 n +0000782504 00000 n +0000782570 00000 n +0000782633 00000 n +0000782696 00000 n +0000782761 00000 n +0000782826 00000 n +0000782891 00000 n +0000782957 00000 n +0000783023 00000 n +0000783087 00000 n +0000783151 00000 n +0000783216 00000 n +0000783280 00000 n +0000783345 00000 n +0000783410 00000 n +0000783476 00000 n +0000783542 00000 n +0000783606 00000 n +0000783670 00000 n +0000783735 00000 n +0000783800 00000 n +0000783864 00000 n +0000783929 00000 n +0000789066 00000 n +0000785583 00000 n +0000784106 00000 n +0000785709 00000 n +0000785773 00000 n +0000785837 00000 n +0000785901 00000 n +0000786094 00000 n +0000786158 00000 n +0000786224 00000 n +0000786288 00000 n +0000786352 00000 n +0000786418 00000 n +0000786482 00000 n +0000786546 00000 n +0000786610 00000 n +0000786674 00000 n +0000786740 00000 n +0000786804 00000 n +0000786868 00000 n +0000786932 00000 n +0000786996 00000 n +0000787062 00000 n +0000787128 00000 n +0000787192 00000 n +0000787256 00000 n +0000787321 00000 n +0000787386 00000 n +0000787451 00000 n +0000787517 00000 n +0000787583 00000 n +0000787647 00000 n +0000787713 00000 n +0000787779 00000 n +0000787843 00000 n +0000787907 00000 n +0000787972 00000 n +0000788037 00000 n +0000788100 00000 n +0000788165 00000 n +0000788230 00000 n +0000788294 00000 n +0000788359 00000 n +0000788424 00000 n +0000788488 00000 n +0000788553 00000 n +0000788618 00000 n +0000788682 00000 n +0000788747 00000 n +0000788812 00000 n +0000788875 00000 n +0000788939 00000 n +0000789003 00000 n +0000794312 00000 n +0000790636 00000 n +0000789178 00000 n +0000790762 00000 n +0000790826 00000 n +0000790891 00000 n +0000790956 00000 n +0000791020 00000 n +0000791085 00000 n +0000791150 00000 n +0000791214 00000 n +0000791279 00000 n +0000791344 00000 n +0000791408 00000 n +0000791473 00000 n +0000791538 00000 n +0000791602 00000 n +0000791667 00000 n +0000791732 00000 n +0000791796 00000 n +0000791861 00000 n +0000791926 00000 n +0000791990 00000 n +0000792055 00000 n +0000792120 00000 n +0000792184 00000 n +0000792248 00000 n +0000792312 00000 n +0000792506 00000 n +0000792570 00000 n +0000792635 00000 n +0000792699 00000 n +0000792763 00000 n +0000792829 00000 n +0000792893 00000 n +0000792956 00000 n +0000793020 00000 n +0000793084 00000 n +0000793150 00000 n +0000793214 00000 n +0000793278 00000 n +0000793342 00000 n +0000793406 00000 n +0000793472 00000 n +0000793538 00000 n +0000793602 00000 n +0000793666 00000 n +0000793731 00000 n +0000793796 00000 n +0000793861 00000 n +0000793926 00000 n +0000793991 00000 n +0000794055 00000 n +0000794119 00000 n +0000794184 00000 n +0000794248 00000 n +0000799513 00000 n +0000795768 00000 n +0000794424 00000 n +0000795894 00000 n +0000795958 00000 n +0000796023 00000 n +0000796089 00000 n +0000796155 00000 n +0000796219 00000 n +0000796283 00000 n +0000796348 00000 n +0000796413 00000 n +0000796477 00000 n +0000796542 00000 n +0000796607 00000 n +0000796671 00000 n +0000796736 00000 n +0000796801 00000 n +0000796865 00000 n +0000796930 00000 n +0000796995 00000 n +0000797059 00000 n +0000797124 00000 n +0000797189 00000 n +0000797253 00000 n +0000797318 00000 n +0000797383 00000 n +0000797447 00000 n +0000797512 00000 n +0000797577 00000 n +0000797641 00000 n +0000797705 00000 n +0000797769 00000 n +0000797963 00000 n +0000798027 00000 n +0000798093 00000 n +0000798156 00000 n +0000798220 00000 n +0000798286 00000 n +0000798350 00000 n +0000798414 00000 n +0000798478 00000 n +0000798542 00000 n +0000798608 00000 n +0000798672 00000 n +0000798736 00000 n +0000798800 00000 n +0000798864 00000 n +0000798929 00000 n +0000798994 00000 n +0000799058 00000 n +0000799122 00000 n +0000799187 00000 n +0000799252 00000 n +0000799317 00000 n +0000799383 00000 n +0000799449 00000 n +0000804976 00000 n +0000800972 00000 n +0000799625 00000 n +0000801098 00000 n +0000801162 00000 n +0000801228 00000 n +0000801294 00000 n +0000801358 00000 n +0000801422 00000 n +0000801487 00000 n +0000801552 00000 n +0000801616 00000 n +0000801681 00000 n +0000801746 00000 n +0000801810 00000 n +0000801875 00000 n +0000801940 00000 n +0000802004 00000 n +0000802068 00000 n +0000802134 00000 n +0000802199 00000 n +0000802264 00000 n +0000802329 00000 n +0000802393 00000 n +0000802458 00000 n +0000802523 00000 n +0000802587 00000 n +0000802652 00000 n +0000802717 00000 n +0000802781 00000 n +0000802846 00000 n +0000802911 00000 n +0000802975 00000 n +0000803040 00000 n +0000803105 00000 n +0000803169 00000 n +0000803234 00000 n +0000803299 00000 n +0000803363 00000 n +0000803427 00000 n +0000803493 00000 n +0000803557 00000 n +0000803621 00000 n +0000803685 00000 n +0000803878 00000 n +0000803942 00000 n +0000804008 00000 n +0000804072 00000 n +0000804136 00000 n +0000804202 00000 n +0000804266 00000 n +0000804330 00000 n +0000804394 00000 n +0000804460 00000 n +0000804524 00000 n +0000804588 00000 n +0000804652 00000 n +0000804716 00000 n +0000804782 00000 n +0000804848 00000 n +0000804912 00000 n +0000809946 00000 n +0000806398 00000 n +0000805088 00000 n +0000806524 00000 n +0000806588 00000 n +0000806653 00000 n +0000806718 00000 n +0000806783 00000 n +0000806849 00000 n +0000806915 00000 n +0000806979 00000 n +0000807043 00000 n +0000807108 00000 n +0000807172 00000 n +0000807237 00000 n +0000807302 00000 n +0000807368 00000 n +0000807434 00000 n +0000807498 00000 n +0000807562 00000 n +0000807627 00000 n +0000807692 00000 n +0000807756 00000 n +0000807821 00000 n +0000807886 00000 n +0000807950 00000 n +0000808015 00000 n +0000808080 00000 n +0000808144 00000 n +0000808209 00000 n +0000808274 00000 n +0000808338 00000 n +0000808402 00000 n +0000808466 00000 n +0000808659 00000 n +0000808723 00000 n +0000808788 00000 n +0000808852 00000 n +0000808916 00000 n +0000808982 00000 n +0000809046 00000 n +0000809109 00000 n +0000809173 00000 n +0000809237 00000 n +0000809303 00000 n +0000809367 00000 n +0000809431 00000 n +0000809495 00000 n +0000809558 00000 n +0000809624 00000 n +0000809690 00000 n +0000809753 00000 n +0000809816 00000 n +0000809881 00000 n +0000935802 00000 n +0000815279 00000 n +0000811468 00000 n +0000810058 00000 n +0000811594 00000 n +0000811658 00000 n +0000811723 00000 n +0000811789 00000 n +0000811855 00000 n +0000811919 00000 n +0000811983 00000 n +0000812048 00000 n +0000812112 00000 n +0000812177 00000 n +0000812242 00000 n +0000812308 00000 n +0000812374 00000 n +0000812438 00000 n +0000812502 00000 n +0000812567 00000 n +0000812632 00000 n +0000812696 00000 n +0000812761 00000 n +0000812826 00000 n +0000812890 00000 n +0000812955 00000 n +0000813020 00000 n +0000813084 00000 n +0000813149 00000 n +0000813214 00000 n +0000813278 00000 n +0000813343 00000 n +0000813408 00000 n +0000813472 00000 n +0000813537 00000 n +0000813602 00000 n +0000813666 00000 n +0000813731 00000 n +0000813796 00000 n +0000813860 00000 n +0000813925 00000 n +0000813990 00000 n +0000814054 00000 n +0000814119 00000 n +0000814184 00000 n +0000814248 00000 n +0000814312 00000 n +0000814376 00000 n +0000814570 00000 n +0000814634 00000 n +0000814700 00000 n +0000814764 00000 n +0000814828 00000 n +0000814894 00000 n +0000814958 00000 n +0000815021 00000 n +0000815085 00000 n +0000815149 00000 n +0000815215 00000 n +0000821122 00000 n +0000816870 00000 n +0000815391 00000 n +0000816996 00000 n +0000817060 00000 n +0000817124 00000 n +0000817188 00000 n +0000817252 00000 n +0000817318 00000 n +0000817384 00000 n +0000817448 00000 n +0000817512 00000 n +0000817577 00000 n +0000817642 00000 n +0000817707 00000 n +0000817772 00000 n +0000817837 00000 n +0000817901 00000 n +0000817965 00000 n +0000818030 00000 n +0000818094 00000 n +0000818159 00000 n +0000818224 00000 n +0000818289 00000 n +0000818354 00000 n +0000818417 00000 n +0000818480 00000 n +0000818545 00000 n +0000818610 00000 n +0000818674 00000 n +0000818739 00000 n +0000818804 00000 n +0000818868 00000 n +0000818933 00000 n +0000818998 00000 n +0000819062 00000 n +0000819125 00000 n +0000819188 00000 n +0000819252 00000 n +0000819317 00000 n +0000819382 00000 n +0000819446 00000 n +0000819511 00000 n +0000819576 00000 n +0000819639 00000 n +0000819704 00000 n +0000819769 00000 n +0000819833 00000 n +0000819897 00000 n +0000819961 00000 n +0000820025 00000 n +0000820090 00000 n +0000820155 00000 n +0000820219 00000 n +0000820284 00000 n +0000820349 00000 n +0000820413 00000 n +0000820477 00000 n +0000820541 00000 n +0000820734 00000 n +0000820798 00000 n +0000820864 00000 n +0000820928 00000 n +0000820992 00000 n +0000821058 00000 n +0000825500 00000 n +0000822339 00000 n +0000821234 00000 n +0000822465 00000 n +0000822529 00000 n +0000822593 00000 n +0000822657 00000 n +0000822721 00000 n +0000822787 00000 n +0000822851 00000 n +0000822915 00000 n +0000822979 00000 n +0000823043 00000 n +0000823109 00000 n +0000823175 00000 n +0000823239 00000 n +0000823303 00000 n +0000823367 00000 n +0000823431 00000 n +0000823496 00000 n +0000823562 00000 n +0000823628 00000 n +0000823690 00000 n +0000823756 00000 n +0000823822 00000 n +0000823886 00000 n +0000823950 00000 n +0000824014 00000 n +0000824207 00000 n +0000824271 00000 n +0000824337 00000 n +0000824401 00000 n +0000824465 00000 n +0000824531 00000 n +0000824595 00000 n +0000824659 00000 n +0000824723 00000 n +0000824789 00000 n +0000824853 00000 n +0000824917 00000 n +0000824981 00000 n +0000825045 00000 n +0000825111 00000 n +0000825177 00000 n +0000825241 00000 n +0000825305 00000 n +0000825370 00000 n +0000825435 00000 n +0000830193 00000 n +0000826965 00000 n +0000825612 00000 n +0000827091 00000 n +0000827155 00000 n +0000827221 00000 n +0000827287 00000 n +0000827351 00000 n +0000827415 00000 n +0000827480 00000 n +0000827544 00000 n +0000827609 00000 n +0000827674 00000 n +0000827740 00000 n +0000827806 00000 n +0000827870 00000 n +0000827934 00000 n +0000827999 00000 n +0000828064 00000 n +0000828128 00000 n +0000828193 00000 n +0000828258 00000 n +0000828322 00000 n +0000828387 00000 n +0000828452 00000 n +0000828516 00000 n +0000828580 00000 n +0000828644 00000 n +0000828837 00000 n +0000828901 00000 n +0000828967 00000 n +0000829031 00000 n +0000829095 00000 n +0000829161 00000 n +0000829225 00000 n +0000829289 00000 n +0000829353 00000 n +0000829417 00000 n +0000829481 00000 n +0000829547 00000 n +0000829611 00000 n +0000829675 00000 n +0000829739 00000 n +0000829803 00000 n +0000829869 00000 n +0000829935 00000 n +0000829999 00000 n +0000830063 00000 n +0000830128 00000 n +0000834915 00000 n +0000831818 00000 n +0000830305 00000 n +0000831944 00000 n +0000832008 00000 n +0000832073 00000 n +0000832139 00000 n +0000832205 00000 n +0000832269 00000 n +0000832333 00000 n +0000832398 00000 n +0000832462 00000 n +0000832527 00000 n +0000832592 00000 n +0000832658 00000 n +0000832724 00000 n +0000832788 00000 n +0000832852 00000 n +0000832917 00000 n +0000832982 00000 n +0000833046 00000 n +0000833111 00000 n +0000833176 00000 n +0000833240 00000 n +0000833305 00000 n +0000833370 00000 n +0000833434 00000 n +0000833499 00000 n +0000833564 00000 n +0000833628 00000 n +0000833693 00000 n +0000833758 00000 n +0000833822 00000 n +0000833886 00000 n +0000833950 00000 n +0000834144 00000 n +0000834208 00000 n +0000834273 00000 n +0000834337 00000 n +0000834401 00000 n +0000834467 00000 n +0000834531 00000 n +0000834594 00000 n +0000834658 00000 n +0000834721 00000 n +0000834785 00000 n +0000834851 00000 n +0000839440 00000 n +0000836152 00000 n +0000835027 00000 n +0000836278 00000 n +0000836342 00000 n +0000836406 00000 n +0000836470 00000 n +0000836534 00000 n +0000836598 00000 n +0000836664 00000 n +0000836730 00000 n +0000836794 00000 n +0000836858 00000 n +0000836923 00000 n +0000836988 00000 n +0000837053 00000 n +0000837118 00000 n +0000837183 00000 n +0000837247 00000 n +0000837311 00000 n +0000837376 00000 n +0000837440 00000 n +0000837505 00000 n +0000837570 00000 n +0000837635 00000 n +0000837700 00000 n +0000837764 00000 n +0000837830 00000 n +0000837896 00000 n +0000837960 00000 n +0000838023 00000 n +0000838087 00000 n +0000838279 00000 n +0000838343 00000 n +0000838409 00000 n +0000838473 00000 n +0000838537 00000 n +0000838603 00000 n +0000838667 00000 n +0000838731 00000 n +0000838797 00000 n +0000838861 00000 n +0000838925 00000 n +0000838989 00000 n +0000839053 00000 n +0000839119 00000 n +0000839183 00000 n +0000839247 00000 n +0000839311 00000 n +0000935927 00000 n +0000843207 00000 n +0000840438 00000 n +0000839552 00000 n +0000840564 00000 n +0000840756 00000 n +0000840820 00000 n +0000840886 00000 n +0000840950 00000 n +0000841014 00000 n +0000841080 00000 n +0000841144 00000 n +0000841208 00000 n +0000841271 00000 n +0000841335 00000 n +0000841401 00000 n +0000841467 00000 n +0000841530 00000 n +0000841594 00000 n +0000841658 00000 n +0000841851 00000 n +0000841915 00000 n +0000841981 00000 n +0000842045 00000 n +0000842109 00000 n +0000842174 00000 n +0000842238 00000 n +0000842302 00000 n +0000842368 00000 n +0000842432 00000 n +0000842496 00000 n +0000842560 00000 n +0000842624 00000 n +0000842690 00000 n +0000842756 00000 n +0000842820 00000 n +0000842884 00000 n +0000842948 00000 n +0000843014 00000 n +0000843078 00000 n +0000843142 00000 n +0000847362 00000 n +0000844459 00000 n +0000843319 00000 n +0000844585 00000 n +0000844713 00000 n +0000844777 00000 n +0000844843 00000 n +0000844907 00000 n +0000844970 00000 n +0000845036 00000 n +0000845100 00000 n +0000845164 00000 n +0000845228 00000 n +0000845292 00000 n +0000845356 00000 n +0000845420 00000 n +0000845486 00000 n +0000845550 00000 n +0000845614 00000 n +0000845678 00000 n +0000845742 00000 n +0000845808 00000 n +0000845874 00000 n +0000845938 00000 n +0000846002 00000 n +0000846067 00000 n +0000846132 00000 n +0000846196 00000 n +0000846261 00000 n +0000846326 00000 n +0000846390 00000 n +0000846454 00000 n +0000846518 00000 n +0000846584 00000 n +0000846648 00000 n +0000846712 00000 n +0000846777 00000 n +0000846841 00000 n +0000846906 00000 n +0000846970 00000 n +0000847034 00000 n +0000847100 00000 n +0000847166 00000 n +0000847230 00000 n +0000847296 00000 n +0000849207 00000 n +0000849182 00000 n +0000849301 00000 n +0000868305 00000 n +0000879887 00000 n +0000891458 00000 n +0000910693 00000 n +0000920854 00000 n +0000932910 00000 n +0000936025 00000 n +0000936149 00000 n +0000936275 00000 n +0000936401 00000 n +0000936518 00000 n +0000936610 00000 n +0000948149 00000 n +0001073075 00000 n +0001073116 00000 n +0001073156 00000 n +0001073290 00000 n +trailer +<< +/Size 8038 +/Root 8036 0 R +/Info 8037 0 R +/ID [<9BCC16D6BBB391552556A07D72BF57B5> <9BCC16D6BBB391552556A07D72BF57B5>] +>> +startxref +1073554 +%%EOF diff --git a/trunk/doc/PLCAPI.xml b/trunk/doc/PLCAPI.xml new file mode 100644 index 0000000..f778525 --- /dev/null +++ b/trunk/doc/PLCAPI.xml @@ -0,0 +1,239 @@ + + +]> + + + + PlanetLab Central API Documentation + + + + Introduction + + The PlanetLab Central API (PLCAPI) is the interface through + which the PlanetLab Central database should be accessed and + maintained. The API is used by the website, by nodes, by automated + scripts, and by users to access and update information about + users, nodes, sites, slices, and other entities maintained by the + database. + +

bû}6¼UŸ*ÜV­ßÖ3í·OUû8â›#æûµDH+S4Õ( ,’ˆ–L7#$ÑFñ#æÆ÷ +©4áF%úD­÷•ì;XԌ¾³ ÷ °ïœe‘Kך¦í{ŠDÒºòÌ4wbÅSMÂb^°´×‘¸9^Gx`^‡<.·ÿ—É™{pµÉ`1Ñ,-7G4„&ä±ê¤Kèè PE”’‰b†¨õbQÉbÆ¢fó‚^Ì÷õq{h^ºfßb›FÊÒèïQÕ¢Ô¤ä,UÕ1èK‹›aPŒbÐ orã,!¸vîEiLª¸!,¦]€¥µCâæh‡ðÀ´ƒ<.UÜ19̗k혺 +ŠOŒ!,21aɉ17cb¼àOŒ'<u÷zhïšz7 ØgIègxÜlP\ªk¯ù»&l±BJNO`ýÕ÷~«u +¶:šâ%¦>ñÑ„EFS#,9šÂâfŒ¦0ËÑԄƹõ¹ 9,Wn=ŠC­:þ>)t|³jIf і' PCTҏHÐ ;"$€> endobj +6195 0 obj << +/D [6193 0 R /XYZ 71.731 729.2652 null] +>> endobj +6196 0 obj << +/D [6193 0 R /XYZ 129.5143 708.3437 null] +>> endobj +6197 0 obj << +/D [6193 0 R /XYZ 129.5143 708.3437 null] +>> endobj +6198 0 obj << +/D [6193 0 R /XYZ 71.731 706.1869 null] +>> endobj +6199 0 obj << +/D [6193 0 R /XYZ 71.731 706.1869 null] +>> endobj +6200 0 obj << +/D [6193 0 R /XYZ 139.477 690.4109 null] +>> endobj +6201 0 obj << +/D [6193 0 R /XYZ 71.731 688.2541 null] +>> endobj +6202 0 obj << +/D [6193 0 R /XYZ 71.731 688.2541 null] +>> endobj +6203 0 obj << +/D [6193 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6204 0 obj << +/D [6193 0 R /XYZ 71.731 670.3214 null] +>> endobj +6205 0 obj << +/D [6193 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6206 0 obj << +/D [6193 0 R /XYZ 76.7123 636.6127 null] +>> endobj +6207 0 obj << +/D [6193 0 R /XYZ 139.477 618.6799 null] +>> endobj +6208 0 obj << +/D [6193 0 R /XYZ 71.731 617.2404 null] +>> endobj +6209 0 obj << +/D [6193 0 R /XYZ 71.731 617.2404 null] +>> endobj +6210 0 obj << +/D [6193 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6211 0 obj << +/D [6193 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6212 0 obj << +/D [6193 0 R /XYZ 71.731 598.5904 null] +>> endobj +6213 0 obj << +/D [6193 0 R /XYZ 71.731 598.5904 null] +>> endobj +6214 0 obj << +/D [6193 0 R /XYZ 159.4023 582.8144 null] +>> endobj +6215 0 obj << +/D [6193 0 R /XYZ 71.731 580.6576 null] +>> endobj +6216 0 obj << +/D [6193 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6217 0 obj << +/D [6193 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6218 0 obj << +/D [6193 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6219 0 obj << +/D [6193 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6220 0 obj << +/D [6193 0 R /XYZ 71.731 526.8593 null] +>> endobj +6221 0 obj << +/D [6193 0 R /XYZ 71.731 526.8593 null] +>> endobj +6222 0 obj << +/D [6193 0 R /XYZ 159.4023 511.0834 null] +>> endobj +6223 0 obj << +/D [6193 0 R /XYZ 71.731 508.9266 null] +>> endobj +6224 0 obj << +/D [6193 0 R /XYZ 159.4023 493.1507 null] +>> endobj +6225 0 obj << +/D [6193 0 R /XYZ 76.7123 475.2179 null] +>> endobj +6226 0 obj << +/D [6193 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6227 0 obj << +/D [6193 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6228 0 obj << +/D [6193 0 R /XYZ 71.731 455.1283 null] +>> endobj +6229 0 obj << +/D [6193 0 R /XYZ 71.731 455.1283 null] +>> endobj +6230 0 obj << +/D [6193 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6231 0 obj << +/D [6193 0 R /XYZ 71.731 437.1956 null] +>> endobj +6232 0 obj << +/D [6193 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6233 0 obj << +/D [6193 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6234 0 obj << +/D [6193 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6235 0 obj << +/D [6193 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6236 0 obj << +/D [6193 0 R /XYZ 71.731 383.3973 null] +>> endobj +6237 0 obj << +/D [6193 0 R /XYZ 71.731 383.3973 null] +>> endobj +6238 0 obj << +/D [6193 0 R /XYZ 159.4023 367.6214 null] +>> endobj +6239 0 obj << +/D [6193 0 R /XYZ 71.731 365.4646 null] +>> endobj +6240 0 obj << +/D [6193 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6241 0 obj << +/D [6193 0 R /XYZ 76.7123 295.8904 null] +>> endobj +6242 0 obj << +/D [6193 0 R /XYZ 129.5143 277.9576 null] +>> endobj +6243 0 obj << +/D [6193 0 R /XYZ 129.5143 277.9576 null] +>> endobj +6244 0 obj << +/D [6193 0 R /XYZ 71.731 275.8008 null] +>> endobj +6245 0 obj << +/D [6193 0 R /XYZ 71.731 275.8008 null] +>> endobj +6246 0 obj << +/D [6193 0 R /XYZ 139.477 260.0249 null] +>> endobj +6247 0 obj << +/D [6193 0 R /XYZ 71.731 222.1669 null] +>> endobj +6248 0 obj << +/D [6193 0 R /XYZ 71.731 209.1159 null] +>> endobj +6249 0 obj << +/D [6193 0 R /XYZ 71.731 207.8706 null] +>> endobj +6250 0 obj << +/D [6193 0 R /XYZ 129.5143 188.792 null] +>> endobj +6251 0 obj << +/D [6193 0 R /XYZ 71.731 186.6352 null] +>> endobj +6252 0 obj << +/D [6193 0 R /XYZ 71.731 186.6352 null] +>> endobj +6253 0 obj << +/D [6193 0 R /XYZ 139.477 170.8593 null] +>> endobj +6254 0 obj << +/D [6193 0 R /XYZ 139.477 170.8593 null] +>> endobj +6255 0 obj << +/D [6193 0 R /XYZ 71.731 168.7024 null] +>> endobj +6256 0 obj << +/D [6193 0 R /XYZ 139.477 152.9265 null] +>> endobj +6257 0 obj << +/D [6193 0 R /XYZ 139.477 152.9265 null] +>> endobj +6258 0 obj << +/D [6193 0 R /XYZ 71.731 150.7697 null] +>> endobj +6259 0 obj << +/D [6193 0 R /XYZ 139.477 134.9938 null] +>> endobj +6260 0 obj << +/D [6193 0 R /XYZ 139.477 134.9938 null] +>> endobj +6261 0 obj << +/D [6193 0 R /XYZ 71.731 132.8369 null] +>> endobj +6262 0 obj << +/D [6193 0 R /XYZ 139.477 117.061 null] +>> endobj +6263 0 obj << +/D [6193 0 R /XYZ 139.477 117.061 null] +>> endobj +6192 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6266 0 obj << +/Length 985 +/Filter /FlateDecode +>> +stream +xÚµWKoã6¾çWèˇ(Š{K÷…-ìzOMQȳ& K®D7È¿/)’õpìDZÙo>~3¤PõE Fôs€SŠ£âp£ŸúÕ×äLbg‡F¿no~ùB`ÄOqmŸ#ÂS@Y1‚AFQmË?o?îó£í&ÆÞb`ŸU^ õ{¾³ÓûÇ;øC¨}Sv›¿¶¿Ý|Þñ)a€g:ț «%LŒ"ÄF418}Ɛ–0ÖÃĀCŽe·_…ú^ÉB<ԝÊk%s%›ºÇ¤ñ ߄ CÅ&_–ZGm£õz†™^‘ö‘ÝÚ#¢Œ÷ ΄ëùx‚æ'µ×O´ öþBŸDW´òh¼\ á›P§ÖÇÌk÷lÛüÕ›g÷WUÙÁ¿LõL–vÚüv(Ã,Ü[•+сkñßWUcÜ¿çý[S‰îb*6“¼<Èúή;J78uZ ¼uS%Š½ÖM)®Åõ¸A:ç6?-g‹'Ô(BPŠX”d¡–ÅšF«84³å‘Ö/ƒÈ Xz3ž0¦‹¸’ ¼wþqøUK$ (Fº’(Jȇ‘ä +m8ÐD0&üÞ·§BÝÍÊܬZ$ÅD%ÆòԊe‚‚®[ˆ_'Ö[Å¡ÙH,2?Iț%Vo>Ä _{žX¿j‰cJ,áÀôž Œ{͋m+ìÒ¤‰î®s~eýÓó»BëÁº³Âo†z0þuŸ4ýk1R2ÈiØ Î œp˜6~[߁ÕòöVÕ½ô +q¯€ ¤‚XézŽ¿_nunï&GNL`!=՘ÐÔ:hvè¼ÿ93;Zî‚þ÷„¸R“nÙörè߈ªìÞá$"Z…)þ'‘íήhj•ËZo’—BO+ïdלTcç® Ï«‰Ûuk»£(dŸyé•S‹sîESgÐÔHiJúeiŠ´wÛ:7M»8Hk}ÐtwÓ×y˜üŒqe®´`w¬ ].êê5dÁu‡\û7Ý=¼6B6^dìë”v"Ԅ(G*WҜ ç,³ €Œý“u°ôh ËÃÑ-“0[k?ºíðUCÌN¢]ádzû²—Å~D§/¯~߅ﳇàï·óPA­™Ñ0&„ÏÕðRz…H5HøÞ\vº5 εPúȳêÈêR{ªÈëºQÓ-0¾¥(/”‘¬/4sÜ_É7À7Êbn¢w¼Šf×ßEý4<óÜçI’ ¥üÍï±Àfù9F1déàɀBžýºZ‰ø㓈ˆendstream +endobj +6265 0 obj << +/Type /Page +/Contents 6266 0 R +/Resources 6264 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6267 0 obj << +/D [6265 0 R /XYZ 71.731 729.2652 null] +>> endobj +884 0 obj << +/D [6265 0 R /XYZ 71.731 718.3063 null] +>> endobj +390 0 obj << +/D [6265 0 R /XYZ 295.6147 705.7477 null] +>> endobj +6268 0 obj << +/D [6265 0 R /XYZ 71.731 685.6073 null] +>> endobj +6269 0 obj << +/D [6265 0 R /XYZ 161.0655 672.871 null] +>> endobj +6270 0 obj << +/D [6265 0 R /XYZ 71.731 660.7515 null] +>> endobj +6271 0 obj << +/D [6265 0 R /XYZ 71.731 629.7219 null] +>> endobj +6272 0 obj << +/D [6265 0 R /XYZ 168.8063 618.3754 null] +>> endobj +6273 0 obj << +/D [6265 0 R /XYZ 71.731 606.2559 null] +>> endobj +6274 0 obj << +/D [6265 0 R /XYZ 71.731 574.89 null] +>> endobj +6275 0 obj << +/D [6265 0 R /XYZ 181.5683 563.8797 null] +>> endobj +6276 0 obj << +/D [6265 0 R /XYZ 71.731 553.8175 null] +>> endobj +6277 0 obj << +/D [6265 0 R /XYZ 71.731 520.3944 null] +>> endobj +6278 0 obj << +/D [6265 0 R /XYZ 71.731 509.2845 null] +>> endobj +6279 0 obj << +/D [6265 0 R /XYZ 71.731 508.0392 null] +>> endobj +6280 0 obj << +/D [6265 0 R /XYZ 129.5143 488.9607 null] +>> endobj +6281 0 obj << +/D [6265 0 R /XYZ 129.5143 488.9607 null] +>> endobj +6282 0 obj << +/D [6265 0 R /XYZ 71.731 487.5211 null] +>> endobj +6283 0 obj << +/D [6265 0 R /XYZ 71.731 487.5211 null] +>> endobj +6284 0 obj << +/D [6265 0 R /XYZ 139.477 471.0279 null] +>> endobj +6285 0 obj << +/D [6265 0 R /XYZ 139.477 471.0279 null] +>> endobj +6286 0 obj << +/D [6265 0 R /XYZ 71.731 433.1699 null] +>> endobj +6287 0 obj << +/D [6265 0 R /XYZ 71.731 420.1189 null] +>> endobj +6288 0 obj << +/D [6265 0 R /XYZ 71.731 418.8736 null] +>> endobj +6289 0 obj << +/D [6265 0 R /XYZ 129.5143 399.795 null] +>> endobj +885 0 obj << +/D [6265 0 R /XYZ 71.731 392.6569 null] +>> endobj +394 0 obj << +/D [6265 0 R /XYZ 193.27 349.5594 null] +>> endobj +6290 0 obj << +/D [6265 0 R /XYZ 71.731 329.419 null] +>> endobj +6291 0 obj << +/D [6265 0 R /XYZ 161.0655 316.6827 null] +>> endobj +6292 0 obj << +/D [6265 0 R /XYZ 71.731 304.5632 null] +>> endobj +6293 0 obj << +/D [6265 0 R /XYZ 71.731 273.5336 null] +>> endobj +6294 0 obj << +/D [6265 0 R /XYZ 168.8063 262.1871 null] +>> endobj +6295 0 obj << +/D [6265 0 R /XYZ 71.731 235.1236 null] +>> endobj +6296 0 obj << +/D [6265 0 R /XYZ 71.731 195.3891 null] +>> endobj +6297 0 obj << +/D [6265 0 R /XYZ 71.731 142.3466 null] +>> endobj +6298 0 obj << +/D [6265 0 R /XYZ 181.5683 129.4847 null] +>> endobj +6299 0 obj << +/D [6265 0 R /XYZ 71.731 119.4225 null] +>> endobj +6264 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6302 0 obj << +/Length 1400 +/Filter /FlateDecode +>> +stream +xÚ͚[oã6…ßó+ü˜k–wRû¶½"ŶÚ,P [Š£¬$r Ë(úïKY¤LšC‘AÓ¢Ø)Þ#Ïѧ3#J0Yaó¬AŠ™ ­•‚®6ÏxõÅü×ÄJÖV³öE_ß^|õ=ë +U’ÊÕíãŠU ÅWŠQ¤ѫۇß/¿ÙÖ/CÓ_­©À—Mۛ§ºk†õýô燛ëiç§fØîöWÜþxñÝí\_0…*mŠ,šœU±MZy6 ©D­ֈq¦Ž>o®ˆ¸¬ûú¹1n÷ïÏ-ÌImªPÌ@ ³jí˜ó‰Â$°0ËF Ÿ)Q]JGBÁºçۓwTìƒé•6($?ú0 á,ôQ†íèãŒåFÉûézí‡þ°ޝ]Åñø¦ÚM=´»ÎWú&>AgAšRZ ¬S­}Ù ,㜐“%ÁšbÊ+°n¬;*ö‚eâJ…6>.SºB"ÉMóœóm»/Ž/€õyúºãþ°›¶‡}“N/ãȄ#ޓj)»V•n\´$¹g&ÁõLìŸÚMs÷Ø>ó&&,bŠ°pÝ÷õ_ÓîîqÚ¶Ý`?èý«}fòœ3‘ˆèŠåÂìɖÂìdù0uK ø𦠳oãà"³Ó׉J#*d¢á­hí«Dçߕ$ÄÉ؈¬š&äŽmx„¸±an¡Ãöî¯c2-¤‡±‡?cL§‚d4FŒšÀ/“ñT dœ*O¨ZB°‘ñ}s̓әÛo²§çˆ ë)_¶ÐS³,ÛSP݂ž‚|Ä=Øo§ƒtEÍ@,ž15n¸¹¡fFE®£<ÕBnœ*Ÿ jInÎm„~΍ïcÓ7õ°ëï^Ìm×ݵЍ´âˆaIÃ1¦ÄøŠÎѹ0KEQÑDG:Õڗh£oK²†’À¬›fëŽ}xÙƦ,ôqšV×þˆ +™ˆÅ·ÙìŽé°­íÞñú4n=²m÷ö>pìð[^a$e†ìI´ÀՊ²TãŠLcQÏœ°ÿ±íe.8RÏÌ_•ž ³*; ªs!²υÀGÛí‡ÚVÆñLPqª´¸ÎŽ…Ä"föÁ$Ғä&ƒ/[J°“å3 Ô-I1àʱï#u·©[X&œiVÄ\HS0ƒê¤Z"eUyPqÑN± “g"ÎöÓ aÉ2ýë«Òý;«²ý U-èßÈÜ¿·î+zãðMˤ@„a•I¢/[ˆâ,Ëfª[FȐÆÀÇ«–Øó™pszUn–yª%*V•‡-a›€x&^Ñ  $×@„ Æh®=ÕB3:U¾ª%Íxn#ь¾é5 +¸¶æi­ôÛ®­iÅ«ª\3ú²…ØͲlî ºÁƒ|É |¼þMÀ|:J .³lNª%4V•'-›€¸x&—ȯ|gBÍVb’iK_•nËY•mK¨jA[F6ච|¸…?Е™'¹7nJJ̃ŒÎϓ-%ÏÉòÑê–dð…Ï÷qŠÚ·µ{ÃRwîɪ}¶ý¹m:ÿkúðŠñ>x${ç¨Zu³Ùuîñ¬íÜ¡Ÿ~¾þmÚk^v›mú +`†Ë={ª%þV•Ç-¡›€à{&;ÿu9ìH R!­pf¼øªôx™UÙñU-/‘ x¼>ý0ZÌódÿÎ|Ü©˜ÊM_¶ðY–8T· 㐠䁏`yù闏ÓÎ㡶îµÏC³ßôíý̳ô¥Ùñ=s*Ž'x'Õ;«Ê£‹‹–‹M@à<¹•ú› ´¿iài"«ÅŸ=xšøW‚šY¦åüMãL’?b*þ –Ë`eendstream +endobj +6301 0 obj << +/Type /Page +/Contents 6302 0 R +/Resources 6300 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6303 0 obj << +/D [6301 0 R /XYZ 71.731 729.2652 null] +>> endobj +6304 0 obj << +/D [6301 0 R /XYZ 71.731 718.3063 null] +>> endobj +6305 0 obj << +/D [6301 0 R /XYZ 71.731 708.2442 null] +>> endobj +6306 0 obj << +/D [6301 0 R /XYZ 71.731 706.9988 null] +>> endobj +6307 0 obj << +/D [6301 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6308 0 obj << +/D [6301 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6309 0 obj << +/D [6301 0 R /XYZ 71.731 686.4807 null] +>> endobj +6310 0 obj << +/D [6301 0 R /XYZ 71.731 686.4807 null] +>> endobj +6311 0 obj << +/D [6301 0 R /XYZ 139.477 669.9875 null] +>> endobj +6312 0 obj << +/D [6301 0 R /XYZ 139.477 669.9875 null] +>> endobj +6313 0 obj << +/D [6301 0 R /XYZ 76.7123 652.0548 null] +>> endobj +6314 0 obj << +/D [6301 0 R /XYZ 129.5143 634.122 null] +>> endobj +6315 0 obj << +/D [6301 0 R /XYZ 129.5143 634.122 null] +>> endobj +6316 0 obj << +/D [6301 0 R /XYZ 71.731 631.9652 null] +>> endobj +6317 0 obj << +/D [6301 0 R /XYZ 71.731 631.9652 null] +>> endobj +6318 0 obj << +/D [6301 0 R /XYZ 139.477 616.1893 null] +>> endobj +6319 0 obj << +/D [6301 0 R /XYZ 71.731 614.0324 null] +>> endobj +6320 0 obj << +/D [6301 0 R /XYZ 71.731 614.0324 null] +>> endobj +6321 0 obj << +/D [6301 0 R /XYZ 149.4396 598.2565 null] +>> endobj +6322 0 obj << +/D [6301 0 R /XYZ 71.731 596.817 null] +>> endobj +6323 0 obj << +/D [6301 0 R /XYZ 149.4396 580.3238 null] +>> endobj +6324 0 obj << +/D [6301 0 R /XYZ 76.7123 562.391 null] +>> endobj +6325 0 obj << +/D [6301 0 R /XYZ 139.477 544.4583 null] +>> endobj +6326 0 obj << +/D [6301 0 R /XYZ 71.731 543.0187 null] +>> endobj +6327 0 obj << +/D [6301 0 R /XYZ 71.731 543.0187 null] +>> endobj +6328 0 obj << +/D [6301 0 R /XYZ 149.4396 526.5255 null] +>> endobj +6329 0 obj << +/D [6301 0 R /XYZ 149.4396 526.5255 null] +>> endobj +6330 0 obj << +/D [6301 0 R /XYZ 71.731 524.3687 null] +>> endobj +6331 0 obj << +/D [6301 0 R /XYZ 71.731 524.3687 null] +>> endobj +6332 0 obj << +/D [6301 0 R /XYZ 159.4023 508.5928 null] +>> endobj +6333 0 obj << +/D [6301 0 R /XYZ 71.731 507.1532 null] +>> endobj +6334 0 obj << +/D [6301 0 R /XYZ 159.4023 490.66 null] +>> endobj +6335 0 obj << +/D [6301 0 R /XYZ 76.7123 472.7273 null] +>> endobj +6336 0 obj << +/D [6301 0 R /XYZ 149.4396 454.7945 null] +>> endobj +6337 0 obj << +/D [6301 0 R /XYZ 149.4396 454.7945 null] +>> endobj +6338 0 obj << +/D [6301 0 R /XYZ 71.731 452.6377 null] +>> endobj +6339 0 obj << +/D [6301 0 R /XYZ 71.731 452.6377 null] +>> endobj +6340 0 obj << +/D [6301 0 R /XYZ 159.4023 436.8618 null] +>> endobj +6341 0 obj << +/D [6301 0 R /XYZ 71.731 434.7049 null] +>> endobj +6342 0 obj << +/D [6301 0 R /XYZ 159.4023 418.929 null] +>> endobj +6343 0 obj << +/D [6301 0 R /XYZ 76.7123 400.9962 null] +>> endobj +6344 0 obj << +/D [6301 0 R /XYZ 149.4396 383.0635 null] +>> endobj +6345 0 obj << +/D [6301 0 R /XYZ 149.4396 383.0635 null] +>> endobj +6346 0 obj << +/D [6301 0 R /XYZ 71.731 380.9067 null] +>> endobj +6347 0 obj << +/D [6301 0 R /XYZ 71.731 380.9067 null] +>> endobj +6348 0 obj << +/D [6301 0 R /XYZ 159.4023 365.1307 null] +>> endobj +6349 0 obj << +/D [6301 0 R /XYZ 71.731 362.9739 null] +>> endobj +6350 0 obj << +/D [6301 0 R /XYZ 159.4023 347.198 null] +>> endobj +6351 0 obj << +/D [6301 0 R /XYZ 76.7123 329.2652 null] +>> endobj +6352 0 obj << +/D [6301 0 R /XYZ 149.4396 311.3325 null] +>> endobj +6353 0 obj << +/D [6301 0 R /XYZ 149.4396 311.3325 null] +>> endobj +6354 0 obj << +/D [6301 0 R /XYZ 71.731 309.1757 null] +>> endobj +6355 0 obj << +/D [6301 0 R /XYZ 71.731 309.1757 null] +>> endobj +6356 0 obj << +/D [6301 0 R /XYZ 159.4023 293.3997 null] +>> endobj +6357 0 obj << +/D [6301 0 R /XYZ 71.731 291.9602 null] +>> endobj +6358 0 obj << +/D [6301 0 R /XYZ 159.4023 275.467 null] +>> endobj +6359 0 obj << +/D [6301 0 R /XYZ 76.7123 257.5342 null] +>> endobj +6360 0 obj << +/D [6301 0 R /XYZ 149.4396 239.6015 null] +>> endobj +6361 0 obj << +/D [6301 0 R /XYZ 149.4396 239.6015 null] +>> endobj +6362 0 obj << +/D [6301 0 R /XYZ 71.731 237.4447 null] +>> endobj +6363 0 obj << +/D [6301 0 R /XYZ 71.731 237.4447 null] +>> endobj +6364 0 obj << +/D [6301 0 R /XYZ 159.4023 221.6687 null] +>> endobj +6365 0 obj << +/D [6301 0 R /XYZ 71.731 219.5119 null] +>> endobj +6366 0 obj << +/D [6301 0 R /XYZ 159.4023 203.736 null] +>> endobj +6367 0 obj << +/D [6301 0 R /XYZ 76.7123 185.8032 null] +>> endobj +6368 0 obj << +/D [6301 0 R /XYZ 149.4396 167.8705 null] +>> endobj +6369 0 obj << +/D [6301 0 R /XYZ 149.4396 167.8705 null] +>> endobj +6370 0 obj << +/D [6301 0 R /XYZ 71.731 165.7136 null] +>> endobj +6371 0 obj << +/D [6301 0 R /XYZ 71.731 165.7136 null] +>> endobj +6372 0 obj << +/D [6301 0 R /XYZ 159.4023 149.9377 null] +>> endobj +6373 0 obj << +/D [6301 0 R /XYZ 71.731 147.7809 null] +>> endobj +6374 0 obj << +/D [6301 0 R /XYZ 159.4023 132.005 null] +>> endobj +6375 0 obj << +/D [6301 0 R /XYZ 76.7123 114.0722 null] +>> endobj +6300 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6378 0 obj << +/Length 1446 +/Filter /FlateDecode +>> +stream +xÚÍZÛnã6|ÏWè1Ö,ï÷­·-Rl‹ MÝ"Pl%K†¤`Ó¿/e‘e’ZÀX,ò`Ùê ‡sF”l’`ýG’” ”骕‚&ÛÃNžõ¿~¹"²1˜ úáþê» ' +)Ierÿ”0%‘Hy’2Š2A²ä~÷ÏõûüØÍ͆ +|MÑðz÷’WE÷1Þ~w;üVtûz×Þü{ÿëÕÏ÷c}ÁR¤2]$H’© ,d²¡)Jˆ"L!ž¦z.8CŒ³tœ UIŠH?O= Qý\>Q*ιN4·T&îùlÕó׉…µ¤Á²$ӒJ~¢Á5 ­ëœÇ!{¨ê]qêD|Z¡çŽU_¨G¾t-«n8¨ÍBäM“ÿg>zš0‹¹™êRaÄ V°¢µqa€¤‹³y5Z)Xׯ©ò˜"BóÀ”Íyèé¿3&ÌßÊÃëaxS½­{­Rƒô§ÃnŸe·y5<Fâ¶-Ÿ«bg€µPš¡íK¹-üŠ§Tû/£1ÅXHq ‹+Ô]£8ÀRÜå{ð[XÓû’I$ MÃ9â¢ü92¢¢9U]‘# pŽÌxoDzS„c¤‡ð §ɐLU4EXÈÓ÷4Pw§§]“Ê;ëÁÊÚ¯<˜>ï‹Ê5àé°¸!âzX‘wVL*¶uµ³–-+;â¯ßoÿ6cõvïc”ò4&,$¼…Å…ê®à ïò†É·°&„ä(ËH$S\”?SFT4S ª+2eAď¶ìŠ‡rgŠÀÙe#Ep‰Ïb‘âÂÎaQgCuW8â8{Æc²ñí®¨ºòÆôübØí kHët{­û¼/µÁ˞¹R¾ÔÕsëWXo¹1‘±ìpa!…-,®0PwÂHa—G0;¾ªè¦±¹bˆ å‰ ¨êŠXЀCbÆãXÍÃI8*ô61ͤºlVðT JÒXV¸°€“GXÔÉPÝN†xNžñ˜lû¡¿€ÕM¡w¿ ÷• KÛýs¿.~ýDŠh&bIàÂBúYX\? îý~.`\PRۛ”èPësès‹Š÷9PuMŸŸÓðô¹ËãÔç_m3À1C¼ˆAXÈ 7(PwAA]“ï +ë´K]éY&<Öß., ß‹ÊÕ]!ĐoÆ#ØߗSÔ´$ÓZÈ,‹´·‹ò·÷ˆŠ¶7TuE{/hÀí=ã±+ÚmS»²®€—I©‘³o»¦¬ž£mn`^«2‚R!bîÂBVµ°¸Uºk¬ +ð€¬êò0Öüsòܙæ°<„¡ŒêYFäq`!y,,.Pw<H—‡×3_¦Q:ô+åaE=ŠYÔƅMŠ©Š-ÎæUŒRÄ8¡`]¿bvԒǼYõ͍ œÍy4E÷ÚTOeñ²ká=7§›·ë ³×F֏eÛÍU?íy^웜C±å´-1Êõ̀â°Üµqa€AgóÊÍ´”+°®_n; +äáÔDôŒÆ`úDK…žÀ(ÃJœœjß{-IÕäˆX҅,9¢–„ê®°$ÄÃÑȮՌÜįÛÎkÂ8RJ»=l0΋ª»Â8 ó>5ƙÑØ6EÞÕÍñhÚº‚7ϊ#†åò;¾õ,òí¶~µÛmçû“¾øømIä[’QE’¢žMdI&ThE *¾ Ë¢kÖ㌼‡²j»\‹™{ö8`hú.Dó“hÿhÚ§¬Rˆôg+ë ÊZTTY è +eÏI€Êº†§?y§µz|==2†.Js”â”~éUÉÙ¤%n(¾Öe{uóËž¡ŒxîíÌò·‚2„Y&Ç3õt ¦ÞŸ2ÿhEo°endstream +endobj +6377 0 obj << +/Type /Page +/Contents 6378 0 R +/Resources 6376 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6379 0 obj << +/D [6377 0 R /XYZ 71.731 729.2652 null] +>> endobj +6380 0 obj << +/D [6377 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6381 0 obj << +/D [6377 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6382 0 obj << +/D [6377 0 R /XYZ 71.731 706.1869 null] +>> endobj +6383 0 obj << +/D [6377 0 R /XYZ 71.731 706.1869 null] +>> endobj +6384 0 obj << +/D [6377 0 R /XYZ 159.4023 690.4109 null] +>> endobj +6385 0 obj << +/D [6377 0 R /XYZ 71.731 688.2541 null] +>> endobj +6386 0 obj << +/D [6377 0 R /XYZ 159.4023 672.4782 null] +>> endobj +6387 0 obj << +/D [6377 0 R /XYZ 76.7123 654.5454 null] +>> endobj +6388 0 obj << +/D [6377 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6389 0 obj << +/D [6377 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6390 0 obj << +/D [6377 0 R /XYZ 71.731 634.4559 null] +>> endobj +6391 0 obj << +/D [6377 0 R /XYZ 71.731 634.4559 null] +>> endobj +6392 0 obj << +/D [6377 0 R /XYZ 159.4023 618.6799 null] +>> endobj +6393 0 obj << +/D [6377 0 R /XYZ 71.731 616.5231 null] +>> endobj +6394 0 obj << +/D [6377 0 R /XYZ 159.4023 600.7472 null] +>> endobj +6395 0 obj << +/D [6377 0 R /XYZ 76.7123 582.8144 null] +>> endobj +6396 0 obj << +/D [6377 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6397 0 obj << +/D [6377 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6398 0 obj << +/D [6377 0 R /XYZ 71.731 562.7248 null] +>> endobj +6399 0 obj << +/D [6377 0 R /XYZ 71.731 562.7248 null] +>> endobj +6400 0 obj << +/D [6377 0 R /XYZ 159.4023 546.9489 null] +>> endobj +6401 0 obj << +/D [6377 0 R /XYZ 71.731 544.7921 null] +>> endobj +6402 0 obj << +/D [6377 0 R /XYZ 159.4023 529.0162 null] +>> endobj +6403 0 obj << +/D [6377 0 R /XYZ 76.7123 511.0834 null] +>> endobj +6404 0 obj << +/D [6377 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6405 0 obj << +/D [6377 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6406 0 obj << +/D [6377 0 R /XYZ 71.731 490.9938 null] +>> endobj +6407 0 obj << +/D [6377 0 R /XYZ 71.731 490.9938 null] +>> endobj +6408 0 obj << +/D [6377 0 R /XYZ 159.4023 475.2179 null] +>> endobj +6409 0 obj << +/D [6377 0 R /XYZ 71.731 473.0611 null] +>> endobj +6410 0 obj << +/D [6377 0 R /XYZ 159.4023 457.2852 null] +>> endobj +6411 0 obj << +/D [6377 0 R /XYZ 76.7123 439.3524 null] +>> endobj +6412 0 obj << +/D [6377 0 R /XYZ 149.4396 421.4197 null] +>> endobj +6413 0 obj << +/D [6377 0 R /XYZ 149.4396 421.4197 null] +>> endobj +6414 0 obj << +/D [6377 0 R /XYZ 71.731 419.2628 null] +>> endobj +6415 0 obj << +/D [6377 0 R /XYZ 71.731 419.2628 null] +>> endobj +6416 0 obj << +/D [6377 0 R /XYZ 159.4023 403.4869 null] +>> endobj +6417 0 obj << +/D [6377 0 R /XYZ 71.731 401.3301 null] +>> endobj +6418 0 obj << +/D [6377 0 R /XYZ 159.4023 385.5542 null] +>> endobj +6419 0 obj << +/D [6377 0 R /XYZ 76.7123 367.6214 null] +>> endobj +6420 0 obj << +/D [6377 0 R /XYZ 149.4396 349.6887 null] +>> endobj +6421 0 obj << +/D [6377 0 R /XYZ 149.4396 349.6887 null] +>> endobj +6422 0 obj << +/D [6377 0 R /XYZ 71.731 347.5318 null] +>> endobj +6423 0 obj << +/D [6377 0 R /XYZ 71.731 347.5318 null] +>> endobj +6424 0 obj << +/D [6377 0 R /XYZ 159.4023 331.7559 null] +>> endobj +6425 0 obj << +/D [6377 0 R /XYZ 71.731 329.5991 null] +>> endobj +6426 0 obj << +/D [6377 0 R /XYZ 159.4023 313.8231 null] +>> endobj +6427 0 obj << +/D [6377 0 R /XYZ 76.7123 260.0249 null] +>> endobj +6428 0 obj << +/D [6377 0 R /XYZ 129.5143 242.0921 null] +>> endobj +6429 0 obj << +/D [6377 0 R /XYZ 129.5143 242.0921 null] +>> endobj +6430 0 obj << +/D [6377 0 R /XYZ 71.731 239.9353 null] +>> endobj +6431 0 obj << +/D [6377 0 R /XYZ 71.731 239.9353 null] +>> endobj +6432 0 obj << +/D [6377 0 R /XYZ 139.477 224.1594 null] +>> endobj +6433 0 obj << +/D [6377 0 R /XYZ 71.731 186.3014 null] +>> endobj +6434 0 obj << +/D [6377 0 R /XYZ 71.731 173.2504 null] +>> endobj +6435 0 obj << +/D [6377 0 R /XYZ 71.731 172.0051 null] +>> endobj +6436 0 obj << +/D [6377 0 R /XYZ 129.5143 152.9265 null] +>> endobj +6437 0 obj << +/D [6377 0 R /XYZ 71.731 150.7697 null] +>> endobj +6438 0 obj << +/D [6377 0 R /XYZ 71.731 150.7697 null] +>> endobj +6439 0 obj << +/D [6377 0 R /XYZ 139.477 134.9938 null] +>> endobj +6440 0 obj << +/D [6377 0 R /XYZ 139.477 134.9938 null] +>> endobj +6441 0 obj << +/D [6377 0 R /XYZ 71.731 133.5542 null] +>> endobj +6442 0 obj << +/D [6377 0 R /XYZ 139.477 117.061 null] +>> endobj +6443 0 obj << +/D [6377 0 R /XYZ 139.477 117.061 null] +>> endobj +6444 0 obj << +/D [6377 0 R /XYZ 71.731 114.9042 null] +>> endobj +6445 0 obj << +/D [6377 0 R /XYZ 139.477 99.1283 null] +>> endobj +6446 0 obj << +/D [6377 0 R /XYZ 139.477 99.1283 null] +>> endobj +6447 0 obj << +/D [6377 0 R /XYZ 71.731 96.9714 null] +>> endobj +6448 0 obj << +/D [6377 0 R /XYZ 71.731 96.9714 null] +>> endobj +6376 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6451 0 obj << +/Length 1602 +/Filter /FlateDecode +>> +stream +xÚ­Yßoœ8~Ï_Á㮔õa° ô­w½V9µUÔK¥“®§ˆ€“µº +ð*ÍßÛ¬ó£§(aÙÏ7ߌgÆ,ö|øÃ^„Q¿ A£—¯|ï ¾úp…5d§1;ôûÝÕoïCßKPÂæÝ=zaˆ…Š)Ž½»üßÍûô$yµÝÔßHý¿=¤—Óõñí퍺øÄå¾Ìëíw]ýy×Ù§a„’ŒÌ’ “QŸ2oø( 0u¢p˜ Eà‹£„QçKxŸà‹u¨Æ—oA@‡Ü0ÁÀ-bž½ž±:üaažrÒ¸HŠ Ð]ûü}W—f ·„” J(Y’ЂÍIh`Ë:쮑pÈÃ-¡M£n”¸¹CFBQGq_FH¸±†"ç…ß|?€í=©eÈÃA´¤¥›ÓÒÀ–µtØ]£å‡[K›FVñTr§”>Ô£(™’ò<¦®Ò"WRõ­ç=/t +_Þb×ꃶ{m–Õhž•E®!µ(Ì£_?ßü£®ø©ÌöÓñÂ1bl£…xY°¹xØr¼v×ÄkÈÃ/›Æ¹:8bÕ BÏT¯_>ª‹Çs%÷¦£å¼Î*ñ0Á½¨í¸Mêìû("Ñb™¶`s:زλktòpëlÓ8¦?î‹ôq¨M¡Aû“ãSúCÏG]©ÏÇ#vù¨ïµËj½S©÷Cª·ÀƒÙUu-ž +n¶Vùk¢1 1˜,56 ¶ —Ýñp¨GãÄ«º,  8#ÄPǃ6VUú²et£õQÔ²™4ËÊs!§ƒs®ùº8ƌ@?ÂÑü,g£¦g¹µ8˹¬®˜å\4³\ÇÜ,GáÂÇl©HØ°¹4°åtØ]“ƒCî´ið'Q9K4OŒ¼^óä[L7ÊÜ+÷LŠ1òãp±TX°¹0Ør˜vׄiÈÃ&›F-äÔ¸8?ãÜØ3b¯R@ 5‚›Hšý¼ ¶³Jè(‹§z2$ V ñ°a3ñè`‹ñpÙ]gN§‹-ÞHd| 1¢1f­¯7M»#¡¶I‚Î!¸·oßfÁEQJõåogw¸•æy+ióh©o)L¡˜Âg!÷êêmžë|ŽA§Æ—vÌ´: \„}U!4 å1ڊ ßêSlK2ç×êRèGŸÅáà +ðCW\v™aT/ÔaD.`"pN‘iv9^óî÷“ò´%ñµ†#þ _Ëâ`®dÚÍÃü~ìöT#jÝ\zM¥uåÅÌ<šÑ‘7omj“œ7#«l§…µöø࠘9ÄO»}ÀEu9eԃrÑ[þ5ü|›Eñ +®ê"4èúG8#ØYÉìïtfü3 Bä‡1ëVj$Ã~8ù«›ÃâOT †­endstream +endobj +6450 0 obj << +/Type /Page +/Contents 6451 0 R +/Resources 6449 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6191 0 R +>> endobj +6452 0 obj << +/D [6450 0 R /XYZ 71.731 729.2652 null] +>> endobj +6453 0 obj << +/D [6450 0 R /XYZ 71.731 741.2204 null] +>> endobj +6454 0 obj << +/D [6450 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6455 0 obj << +/D [6450 0 R /XYZ 76.7123 690.4109 null] +>> endobj +6456 0 obj << +/D [6450 0 R /XYZ 139.477 672.4782 null] +>> endobj +6457 0 obj << +/D [6450 0 R /XYZ 139.477 672.4782 null] +>> endobj +6458 0 obj << +/D [6450 0 R /XYZ 71.731 670.3214 null] +>> endobj +6459 0 obj << +/D [6450 0 R /XYZ 139.477 654.5454 null] +>> endobj +6460 0 obj << +/D [6450 0 R /XYZ 139.477 654.5454 null] +>> endobj +6461 0 obj << +/D [6450 0 R /XYZ 71.731 653.1059 null] +>> endobj +6462 0 obj << +/D [6450 0 R /XYZ 139.477 636.6127 null] +>> endobj +6463 0 obj << +/D [6450 0 R /XYZ 139.477 636.6127 null] +>> endobj +6464 0 obj << +/D [6450 0 R /XYZ 71.731 634.4559 null] +>> endobj +6465 0 obj << +/D [6450 0 R /XYZ 139.477 618.6799 null] +>> endobj +6466 0 obj << +/D [6450 0 R /XYZ 139.477 618.6799 null] +>> endobj +6467 0 obj << +/D [6450 0 R /XYZ 71.731 616.5231 null] +>> endobj +6468 0 obj << +/D [6450 0 R /XYZ 139.477 600.7472 null] +>> endobj +6469 0 obj << +/D [6450 0 R /XYZ 139.477 600.7472 null] +>> endobj +6470 0 obj << +/D [6450 0 R /XYZ 71.731 598.5904 null] +>> endobj +6471 0 obj << +/D [6450 0 R /XYZ 139.477 582.8144 null] +>> endobj +6472 0 obj << +/D [6450 0 R /XYZ 139.477 582.8144 null] +>> endobj +6473 0 obj << +/D [6450 0 R /XYZ 71.731 580.6576 null] +>> endobj +6474 0 obj << +/D [6450 0 R /XYZ 71.731 580.6576 null] +>> endobj +6475 0 obj << +/D [6450 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6476 0 obj << +/D [6450 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6477 0 obj << +/D [6450 0 R /XYZ 139.477 529.0162 null] +>> endobj +6478 0 obj << +/D [6450 0 R /XYZ 139.477 529.0162 null] +>> endobj +6479 0 obj << +/D [6450 0 R /XYZ 71.731 526.8593 null] +>> endobj +6480 0 obj << +/D [6450 0 R /XYZ 139.477 511.0834 null] +>> endobj +6481 0 obj << +/D [6450 0 R /XYZ 139.477 511.0834 null] +>> endobj +6482 0 obj << +/D [6450 0 R /XYZ 71.731 508.9266 null] +>> endobj +6483 0 obj << +/D [6450 0 R /XYZ 139.477 493.1507 null] +>> endobj +6484 0 obj << +/D [6450 0 R /XYZ 139.477 493.1507 null] +>> endobj +6485 0 obj << +/D [6450 0 R /XYZ 71.731 490.9938 null] +>> endobj +6486 0 obj << +/D [6450 0 R /XYZ 139.477 475.2179 null] +>> endobj +6487 0 obj << +/D [6450 0 R /XYZ 139.477 475.2179 null] +>> endobj +6488 0 obj << +/D [6450 0 R /XYZ 71.731 473.0611 null] +>> endobj +6489 0 obj << +/D [6450 0 R /XYZ 71.731 473.0611 null] +>> endobj +6490 0 obj << +/D [6450 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6491 0 obj << +/D [6450 0 R /XYZ 76.7123 439.3524 null] +>> endobj +6492 0 obj << +/D [6450 0 R /XYZ 139.477 421.4197 null] +>> endobj +6493 0 obj << +/D [6450 0 R /XYZ 139.477 421.4197 null] +>> endobj +6494 0 obj << +/D [6450 0 R /XYZ 71.731 419.2628 null] +>> endobj +6495 0 obj << +/D [6450 0 R /XYZ 139.477 403.4869 null] +>> endobj +6496 0 obj << +/D [6450 0 R /XYZ 139.477 403.4869 null] +>> endobj +886 0 obj << +/D [6450 0 R /XYZ 71.731 380.5728 null] +>> endobj +398 0 obj << +/D [6450 0 R /XYZ 233.1062 335.3185 null] +>> endobj +6497 0 obj << +/D [6450 0 R /XYZ 71.731 315.1782 null] +>> endobj +6498 0 obj << +/D [6450 0 R /XYZ 161.0655 302.4418 null] +>> endobj +6499 0 obj << +/D [6450 0 R /XYZ 71.731 290.3223 null] +>> endobj +6500 0 obj << +/D [6450 0 R /XYZ 71.731 259.2927 null] +>> endobj +6501 0 obj << +/D [6450 0 R /XYZ 168.8063 247.9462 null] +>> endobj +6502 0 obj << +/D [6450 0 R /XYZ 71.731 220.8827 null] +>> endobj +6503 0 obj << +/D [6450 0 R /XYZ 71.731 177.8606 null] +>> endobj +6504 0 obj << +/D [6450 0 R /XYZ 71.731 134.6227 null] +>> endobj +6449 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6507 0 obj << +/Length 1171 +/Filter /FlateDecode +>> +stream +xÚÅXM£8½÷¯à˜H¯ml sëýíjgԚÉm{Õ¢‰“ !Ð3½ó﷌m>‚rX©•”«žŸ_¹ +H€áGAáBD#Nƒìt‡ƒ<úxG¬ÉÆÚlÆF?oï~ú=ÄA‚’ˆFÁv„I„¸`)Š9‰ƒíîïÕ/ÇôUÉz½¡¯(2×Ç"-¥ú+}1ÿ0ƒOR«]³þgûçÝoÛ>>Jbrdo5‡I“ ˜Ó0 <儅À1 +Y(:œ_¤jë²18ˆ¹ä{smÚ,“M³o‹{sc¿&x•¶…²ö•:Êú-o$Òлx-;ÜhZDdÂ=Eµ¦|õ&wÆŗªÍ‡~ú×ͦE$NºÙéËknm43¼r÷%ü½ÍãšðUZ§' [ePŒù'ãDƈ3‘xùï­6c3Ç?ìÀ¤ãæMCx¢”ÏâR +D¨7îùuÀáfÍq„±Oi«ŽÚ(CXGÐ&¬*TÝfêþLÂz¾,Už¥*¯Ê±e[Ëù-SØÝ Âî­6c³X¢ss¼ Þì"±°ù˜²Ä÷2±nÖǔØ0ALˆ)ŒàŤ·‡]¡ˆÁÉqÎo^¿ZOÆ]7VUŸÕËY„KĂzÇfWÔۛ-ª×÷õÎpøÕ;ÁÑy&ŸóÝsU?—Î®ãñHÄS®óRٓ¬“Y¯4F1‰’%½ŽÌ®éՙ-ëÕ÷½zp ŒôzÃF¬ô¾jN-M;­Á'Œ©9[ýÜŒâ˜-æòÈì7Îl™OÜ[¸ñàðp3†1ÉÌ=Nqà¥ez€•r¾z‡÷‘NÇÿó{óO„Œ/†±Ù•ÂЛ-_Ü +à ‡¿s›àxŸ÷Ž$òLÄB«2²ºÒ©8«ÅFÅô†>å„÷•cŒáýÞ8ìçv¥Gv_TØYc:ù ÂiˆpG½'•`vñûˆ'âpp7ßendstream +endobj +6506 0 obj << +/Type /Page +/Contents 6507 0 R +/Resources 6505 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6508 0 obj << +/D [6506 0 R /XYZ 71.731 729.2652 null] +>> endobj +6509 0 obj << +/D [6506 0 R /XYZ 71.731 718.3063 null] +>> endobj +6510 0 obj << +/D [6506 0 R /XYZ 71.731 631.9816 null] +>> endobj +6511 0 obj << +/D [6506 0 R /XYZ 71.731 620.8718 null] +>> endobj +6512 0 obj << +/D [6506 0 R /XYZ 71.731 619.6265 null] +>> endobj +6513 0 obj << +/D [6506 0 R /XYZ 129.5143 600.5479 null] +>> endobj +6514 0 obj << +/D [6506 0 R /XYZ 129.5143 600.5479 null] +>> endobj +6515 0 obj << +/D [6506 0 R /XYZ 71.731 599.1084 null] +>> endobj +6516 0 obj << +/D [6506 0 R /XYZ 71.731 599.1084 null] +>> endobj +6517 0 obj << +/D [6506 0 R /XYZ 139.477 582.6152 null] +>> endobj +6518 0 obj << +/D [6506 0 R /XYZ 139.477 582.6152 null] +>> endobj +6519 0 obj << +/D [6506 0 R /XYZ 76.7123 564.6824 null] +>> endobj +6520 0 obj << +/D [6506 0 R /XYZ 129.5143 546.7497 null] +>> endobj +6521 0 obj << +/D [6506 0 R /XYZ 129.5143 546.7497 null] +>> endobj +6522 0 obj << +/D [6506 0 R /XYZ 71.731 544.5928 null] +>> endobj +6523 0 obj << +/D [6506 0 R /XYZ 71.731 544.5928 null] +>> endobj +6524 0 obj << +/D [6506 0 R /XYZ 139.477 528.8169 null] +>> endobj +6525 0 obj << +/D [6506 0 R /XYZ 71.731 527.3774 null] +>> endobj +6526 0 obj << +/D [6506 0 R /XYZ 139.477 510.8842 null] +>> endobj +6527 0 obj << +/D [6506 0 R /XYZ 71.731 473.0261 null] +>> endobj +6528 0 obj << +/D [6506 0 R /XYZ 71.731 459.9752 null] +>> endobj +6529 0 obj << +/D [6506 0 R /XYZ 71.731 458.7298 null] +>> endobj +6530 0 obj << +/D [6506 0 R /XYZ 129.5143 439.6513 null] +>> endobj +887 0 obj << +/D [6506 0 R /XYZ 71.731 432.5131 null] +>> endobj +402 0 obj << +/D [6506 0 R /XYZ 199.7086 389.4157 null] +>> endobj +6531 0 obj << +/D [6506 0 R /XYZ 71.731 369.2753 null] +>> endobj +6532 0 obj << +/D [6506 0 R /XYZ 161.0655 356.539 null] +>> endobj +6533 0 obj << +/D [6506 0 R /XYZ 71.731 344.4195 null] +>> endobj +6534 0 obj << +/D [6506 0 R /XYZ 71.731 313.3899 null] +>> endobj +6535 0 obj << +/D [6506 0 R /XYZ 168.8063 302.0433 null] +>> endobj +6536 0 obj << +/D [6506 0 R /XYZ 71.731 274.9799 null] +>> endobj +6537 0 obj << +/D [6506 0 R /XYZ 71.731 246.9017 null] +>> endobj +6538 0 obj << +/D [6506 0 R /XYZ 71.731 203.6638 null] +>> endobj +6539 0 obj << +/D [6506 0 R /XYZ 181.5683 192.6535 null] +>> endobj +6540 0 obj << +/D [6506 0 R /XYZ 71.731 182.5914 null] +>> endobj +6541 0 obj << +/D [6506 0 R /XYZ 71.731 149.8137 null] +>> endobj +6542 0 obj << +/D [6506 0 R /XYZ 71.731 138.0584 null] +>> endobj +6543 0 obj << +/D [6506 0 R /XYZ 71.731 136.813 null] +>> endobj +6544 0 obj << +/D [6506 0 R /XYZ 129.5143 117.7345 null] +>> endobj +6545 0 obj << +/D [6506 0 R /XYZ 129.5143 117.7345 null] +>> endobj +6546 0 obj << +/D [6506 0 R /XYZ 71.731 116.2949 null] +>> endobj +6547 0 obj << +/D [6506 0 R /XYZ 71.731 116.2949 null] +>> endobj +6548 0 obj << +/D [6506 0 R /XYZ 139.477 99.8017 null] +>> endobj +6549 0 obj << +/D [6506 0 R /XYZ 139.477 99.8017 null] +>> endobj +6505 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6553 0 obj << +/Length 1991 +/Filter /FlateDecode +>> +stream +xÚ­š]oœF†ïý+öҖâ)óÅ@îÒ´i]¥n”¸R¥¦ZaÀ^¶ÀÖõ¿ï°Ì°Ã0_N£H^b¿p^ž3sæ0,ÜDüÜ0æ((¦h“ï/¢Í#ÿÓOPH®…æZ}wñÝ;mRÆ(ÞÜ=lpÊȆa +“Í]ñçåÛ]vÊîêÑèéóC5åð>»ŸþûæÃÍtðk9ìÚ¢¿úëïæø3&<ˆÓ$ 8J7×8áñ 6ª L¥m®ã4r½¼”nxÁñffÝ,ïæ3BTw˜@´Q/(ãêŸgò¬µœl5&'ü–)ä7³ðÑ´E¹­ŠmÛmwm?4Ù¾mîáœÀ"†yÄñ¤×䪦ƒVd¥ºªy\ߖ Ì ,1CŸUת쌎ãfqRfÅÉGO„HjŒkÇ)Ï2úPà”ÿ•-mp"¯&·œ« T”ÍP}Ž"į %€J|h™ ”ùÑ↠1ø0 QmLcCÐyw¬ëçéðïcVOtŠéê0ä1ùeå·N#Dét­åpìšþõê¶äT£ r7Êw–y'®)nÀÄ5ùPpÊ´.|pžÇ|°(S€Yšx”*s ¨YæP¦¸jåcYºÄ€Zت}ÙÙþ`¨W|°¤”_B/WbøÝ]az9Ÿ>•°‡ésØUýt”guýJž)ê[™·M!þÞWM.¦øï·7LGå¡Íwö¤aЗEæJŠ”ù“bˆ’݇9)ª ÇB( (E˜|UU0³•¶ŠÌÅVøÙ↰Õ}˜Ùª6øØ{Ø>TuٛF| P’h#>ëºìy9¾-eCƃÐZê¦]«*CýZV„òfŒÅƨv„ò¬µ%BÂmðFrécÄ·mŸši)^3Œ!¯÷öšïÚ+D/ŸšÏ ÿÝ鷆^À )1I7XUe;«¼`MQÀ®l˜Á.|øü¬^Pëz›ï ]¾xQSÝO»²®èv¿Ï1÷‡V×+H/ÿ”ùqµ7{˜ +D|S *Ñ1 +˜ox+"G„ÈŸƒuȐh,PL”]Ç{x3z +ùÿì7F_‰š’5ãD¡9ù³"Ϗ]oÍe€%{’¡¨ِ*: QCò¡Û°$DõqèJ÷Œ` €q̾uZ]%3 u3ƒ&4¢žl(*G6¤ÊŸ CԐlè6,ÙP}ˆÝ>´39w‹ï«~X.¢ãµDș~¹‚<ZfÎ}äØÅÔ¥•;â7™oaPTîRåçnˆÂ]·aá®úà¤sD@#ÿÍ}ßÖç! »éèiWvåìtî®=Ö"÷åbЗ…•}„ùù†üYä /D~ðë!Ü5슉ê±i»r¬;ÛSA6 {¾|§D_îÛ¶.³FdáfB¸æ-JþÓ8ôe‹YŽMÐ?§bÔ¬ˆ—­ 8‰AD‘gmPUöÜÌ*orLQ²³²aNÏÂGÙd÷bdêÅ(4J\IyÛ6c*]6Tm³NŽ¬TçœXYÇ|‚©g¨*k©ò³6D a­Û°°V}ÌÏM¼ü€Çüñ5bÐVýý´]û{’ LbO•WUÆRåglˆÂX·aa¬ú8á=”ݾê{NÉTn’И%Χ«}[hOVÚ5pùC5²mÎlÏ"Z!ò“]‡ «y°pULôí±ËM›)˜§®ŽþcYg‹é¯-¤r(»r.2ƒÜæê¦s:皛˲.ÜB<×mVØW] Àúj»¢r$Lªü3D I™nÒ3ÕÇØ>víñ`i7Ç(Á/k7§£Óe¿Qç‰ÒàÄ×þ¨*{f•7¦¨yXÙ0çaá#«Ÿ²ç~{<ÙP†æa¹Ô¾©G¢ˑ«ê0”ûÃ`|ÀZO{Stlò]Ö<Ú' +âχ„RÏ¢¡ª ’*‚ QC¤Û°$HõqZ4NCÚ¼‡1ŽËÅcwވ“;©ˆ @ÓÈ·O¬Êûij̻OlŠ°O¼òaÜ'^ØOº¶Þ’¥¶ÊóÂw–ˆ?ÃŔQIEæ")e~’†¸!$uf’ª Qn—_ónûy¼Þ.˸¨í®w(ŠCÄ÷O•¹K™Ÿ°!na݇™°j£)‡§¶û¼+óâ7·,Eì%TŠ¼Ô2 €êÌõS5qßñ>+όÛ+ã Ð(um°ÜròãºÆ鋕o¾ÜDº(º²·6ݐE ¡©§‹SU²RåGkˆÂV·a«ú¨úí¡«öY÷lÂË@„ÃM¯µ×òb²æ–Ý魐ïæ=Û¹;õ}6þŞîMU9øK•Ÿ¿!j݆…¿êCTó*FÅ®móã=?=lóRž¦ØÓd©*G©òs4D á¨Û°pT}T¦æ +b€Rê*7ÂðA>bè¡w9à ‘ŸÝ:d:̓…œb¢hzø×:¸ÅZµ(?Ü~Z=o[0§)€ã£Š³"²c–"/fCÈ̺3fÕÄÿúÆÈØýÿv÷å²úüð³å»"â˧$ ŒSç÷SÍúë©a^þ“x¾ÒhFÔúmSCÄÿù#¢endstream +endobj +6552 0 obj << +/Type /Page +/Contents 6553 0 R +/Resources 6551 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6554 0 obj << +/D [6552 0 R /XYZ 71.731 729.2652 null] +>> endobj +6555 0 obj << +/D [6552 0 R /XYZ 76.7123 708.3437 null] +>> endobj +6556 0 obj << +/D [6552 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6557 0 obj << +/D [6552 0 R /XYZ 129.5143 690.4109 null] +>> endobj +6558 0 obj << +/D [6552 0 R /XYZ 71.731 688.2541 null] +>> endobj +6559 0 obj << +/D [6552 0 R /XYZ 71.731 688.2541 null] +>> endobj +6560 0 obj << +/D [6552 0 R /XYZ 139.477 672.4782 null] +>> endobj +6561 0 obj << +/D [6552 0 R /XYZ 71.731 671.0386 null] +>> endobj +6562 0 obj << +/D [6552 0 R /XYZ 139.477 654.5454 null] +>> endobj +6563 0 obj << +/D [6552 0 R /XYZ 71.731 616.6874 null] +>> endobj +6564 0 obj << +/D [6552 0 R /XYZ 71.731 603.6364 null] +>> endobj +6565 0 obj << +/D [6552 0 R /XYZ 71.731 602.3911 null] +>> endobj +6566 0 obj << +/D [6552 0 R /XYZ 129.5143 583.3126 null] +>> endobj +6567 0 obj << +/D [6552 0 R /XYZ 71.731 583.213 null] +>> endobj +6568 0 obj << +/D [6552 0 R /XYZ 71.731 583.213 null] +>> endobj +6569 0 obj << +/D [6552 0 R /XYZ 139.477 565.3798 null] +>> endobj +6570 0 obj << +/D [6552 0 R /XYZ 139.477 565.3798 null] +>> endobj +6571 0 obj << +/D [6552 0 R /XYZ 71.731 563.223 null] +>> endobj +6572 0 obj << +/D [6552 0 R /XYZ 139.477 547.4471 null] +>> endobj +6573 0 obj << +/D [6552 0 R /XYZ 139.477 547.4471 null] +>> endobj +6574 0 obj << +/D [6552 0 R /XYZ 71.731 545.2902 null] +>> endobj +6575 0 obj << +/D [6552 0 R /XYZ 139.477 529.5143 null] +>> endobj +6576 0 obj << +/D [6552 0 R /XYZ 139.477 529.5143 null] +>> endobj +6577 0 obj << +/D [6552 0 R /XYZ 71.731 527.3575 null] +>> endobj +6578 0 obj << +/D [6552 0 R /XYZ 71.731 527.3575 null] +>> endobj +6579 0 obj << +/D [6552 0 R /XYZ 149.4396 511.5816 null] +>> endobj +6580 0 obj << +/D [6552 0 R /XYZ 149.4396 511.5816 null] +>> endobj +6581 0 obj << +/D [6552 0 R /XYZ 71.731 509.4247 null] +>> endobj +6582 0 obj << +/D [6552 0 R /XYZ 149.4396 493.6488 null] +>> endobj +6583 0 obj << +/D [6552 0 R /XYZ 149.4396 493.6488 null] +>> endobj +6584 0 obj << +/D [6552 0 R /XYZ 71.731 491.492 null] +>> endobj +6585 0 obj << +/D [6552 0 R /XYZ 149.4396 475.716 null] +>> endobj +6586 0 obj << +/D [6552 0 R /XYZ 149.4396 475.716 null] +>> endobj +6587 0 obj << +/D [6552 0 R /XYZ 71.731 473.5592 null] +>> endobj +6588 0 obj << +/D [6552 0 R /XYZ 149.4396 457.7833 null] +>> endobj +6589 0 obj << +/D [6552 0 R /XYZ 149.4396 457.7833 null] +>> endobj +6590 0 obj << +/D [6552 0 R /XYZ 71.731 455.6265 null] +>> endobj +6591 0 obj << +/D [6552 0 R /XYZ 149.4396 439.8505 null] +>> endobj +6592 0 obj << +/D [6552 0 R /XYZ 149.4396 439.8505 null] +>> endobj +6593 0 obj << +/D [6552 0 R /XYZ 71.731 438.411 null] +>> endobj +6594 0 obj << +/D [6552 0 R /XYZ 149.4396 421.9178 null] +>> endobj +6595 0 obj << +/D [6552 0 R /XYZ 149.4396 421.9178 null] +>> endobj +6596 0 obj << +/D [6552 0 R /XYZ 71.731 419.761 null] +>> endobj +6597 0 obj << +/D [6552 0 R /XYZ 149.4396 403.985 null] +>> endobj +6598 0 obj << +/D [6552 0 R /XYZ 149.4396 403.985 null] +>> endobj +6599 0 obj << +/D [6552 0 R /XYZ 71.731 401.8282 null] +>> endobj +6600 0 obj << +/D [6552 0 R /XYZ 149.4396 386.0523 null] +>> endobj +6601 0 obj << +/D [6552 0 R /XYZ 149.4396 386.0523 null] +>> endobj +6602 0 obj << +/D [6552 0 R /XYZ 71.731 383.8955 null] +>> endobj +6603 0 obj << +/D [6552 0 R /XYZ 149.4396 368.1195 null] +>> endobj +6604 0 obj << +/D [6552 0 R /XYZ 149.4396 368.1195 null] +>> endobj +6605 0 obj << +/D [6552 0 R /XYZ 71.731 365.9627 null] +>> endobj +6606 0 obj << +/D [6552 0 R /XYZ 149.4396 350.1868 null] +>> endobj +6607 0 obj << +/D [6552 0 R /XYZ 149.4396 350.1868 null] +>> endobj +6608 0 obj << +/D [6552 0 R /XYZ 71.731 348.03 null] +>> endobj +6609 0 obj << +/D [6552 0 R /XYZ 149.4396 332.254 null] +>> endobj +6610 0 obj << +/D [6552 0 R /XYZ 149.4396 332.254 null] +>> endobj +6611 0 obj << +/D [6552 0 R /XYZ 71.731 330.0972 null] +>> endobj +6612 0 obj << +/D [6552 0 R /XYZ 149.4396 314.3213 null] +>> endobj +6613 0 obj << +/D [6552 0 R /XYZ 149.4396 314.3213 null] +>> endobj +6614 0 obj << +/D [6552 0 R /XYZ 71.731 312.1645 null] +>> endobj +6615 0 obj << +/D [6552 0 R /XYZ 149.4396 296.3885 null] +>> endobj +6616 0 obj << +/D [6552 0 R /XYZ 149.4396 296.3885 null] +>> endobj +6617 0 obj << +/D [6552 0 R /XYZ 71.731 294.2317 null] +>> endobj +6618 0 obj << +/D [6552 0 R /XYZ 149.4396 278.4558 null] +>> endobj +6619 0 obj << +/D [6552 0 R /XYZ 149.4396 278.4558 null] +>> endobj +6620 0 obj << +/D [6552 0 R /XYZ 76.7123 260.523 null] +>> endobj +6621 0 obj << +/D [6552 0 R /XYZ 139.477 242.5903 null] +>> endobj +6622 0 obj << +/D [6552 0 R /XYZ 139.477 242.5903 null] +>> endobj +6623 0 obj << +/D [6552 0 R /XYZ 71.731 241.1507 null] +>> endobj +6624 0 obj << +/D [6552 0 R /XYZ 139.477 224.6575 null] +>> endobj +6625 0 obj << +/D [6552 0 R /XYZ 139.477 224.6575 null] +>> endobj +6626 0 obj << +/D [6552 0 R /XYZ 71.731 222.5007 null] +>> endobj +6627 0 obj << +/D [6552 0 R /XYZ 139.477 206.7248 null] +>> endobj +6628 0 obj << +/D [6552 0 R /XYZ 139.477 206.7248 null] +>> endobj +6629 0 obj << +/D [6552 0 R /XYZ 71.731 204.5679 null] +>> endobj +6630 0 obj << +/D [6552 0 R /XYZ 71.731 204.5679 null] +>> endobj +6631 0 obj << +/D [6552 0 R /XYZ 149.4396 188.792 null] +>> endobj +6632 0 obj << +/D [6552 0 R /XYZ 149.4396 188.792 null] +>> endobj +6633 0 obj << +/D [6552 0 R /XYZ 71.731 186.6352 null] +>> endobj +6634 0 obj << +/D [6552 0 R /XYZ 149.4396 170.8593 null] +>> endobj +6635 0 obj << +/D [6552 0 R /XYZ 149.4396 170.8593 null] +>> endobj +6636 0 obj << +/D [6552 0 R /XYZ 71.731 168.7024 null] +>> endobj +6637 0 obj << +/D [6552 0 R /XYZ 149.4396 152.9265 null] +>> endobj +6638 0 obj << +/D [6552 0 R /XYZ 149.4396 152.9265 null] +>> endobj +6639 0 obj << +/D [6552 0 R /XYZ 71.731 150.7697 null] +>> endobj +6640 0 obj << +/D [6552 0 R /XYZ 149.4396 134.9938 null] +>> endobj +6641 0 obj << +/D [6552 0 R /XYZ 149.4396 134.9938 null] +>> endobj +6642 0 obj << +/D [6552 0 R /XYZ 71.731 132.8369 null] +>> endobj +6643 0 obj << +/D [6552 0 R /XYZ 149.4396 117.061 null] +>> endobj +6644 0 obj << +/D [6552 0 R /XYZ 149.4396 117.061 null] +>> endobj +6645 0 obj << +/D [6552 0 R /XYZ 71.731 114.9042 null] +>> endobj +6646 0 obj << +/D [6552 0 R /XYZ 149.4396 99.1283 null] +>> endobj +6647 0 obj << +/D [6552 0 R /XYZ 149.4396 99.1283 null] +>> endobj +6648 0 obj << +/D [6552 0 R /XYZ 71.731 96.9714 null] +>> endobj +6551 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6651 0 obj << +/Length 1495 +/Filter /FlateDecode +>> +stream +xÚ¥™]o£F†ïó+¸‹-­§óÉ ¹ËnÚ*m7Š´©T©©"bHL p¼þ÷=† x†aSå‚¿Ìyyæp8H€á’ É`C#DCAƒåú ÏðÓ¯g¤•,ZÍÂ}¾;û醃E! ƒ»§€E!’’Q¤QÁ]ò÷ìË*ÞVi1_Pg5ÛÛ×x“VďÍáåíu³ó5­VyRÎÿ¹ûíìç».¾`E +‚Œšd‘B‹0XPŒ"J„UEX„¸”p/X!ƙìî…FD¤¾O¸-ëTõ½ÜS*†Þ'àM†9žŽ:ܾ»ÐWÚ`*P€4äGl×¾`·ŽË—ÚÊÑöûpŒ8 ‚Ôº‹†jYÙæùSsðm÷—7ûzÞý´7F0ÁÑ8DSå†Ø©¼mQ'@<±a‡ØóñWé>>Ø!ªˆ…#¯o›mœ$EZ–ÍAþÔl·E¶Ž‹Csð<34§b¶Ÿ¸âà.)lõ7T#ÀµÊÜu +ð¡ pÓÇ&ORH½}^¼ê4µç'ԁ•?=ã²Ì—<õIs¼ÏªU³W­²Ò–Â.Ö0u¡Œ|5ØP°Ö*?kKÔ)¬‡6¬Mɦ¤Д#L>Z~Ët™o’®_Ý|Ó狷9³‘ú€1’\ú*°¡Á­U~ܖ¨Spm8p›>÷¯Ù:«ì© —pWnŽ7É>Ktw£Ø( +Ýáž*kªÜ;•—¢-êŠ'6ì{>ªÃ6ý@Ò^šÉzã¸wNÑ3jUçÙöŸÃIâär¤ñ`S5ÂW«ü|-Q§ðÚpð5}¬‹ a&¡ÐLxɶÁm†²‚ž ÇU¶^ÒC9-§—È.Ü8ÔQ#µjaÊ,ôNFsâB`jëƧ¯:õÑÇ'À¦¬ïð=8z*HDx#½ñ¯ÿ³’Ö}ýÁ謜4)AœDÒGӐÑÔ2?MKÜ)4‡>4M@Óö?à-9ûoõ‰øu笐LÁìîy®M•û¹îTÞçÚuÂs}bÃþ\÷|¤ß·´“?¾\ºª_ËÍ¿i»Ï*[·§ö«T¿¾ßëè|î“Í\ζËèlõÞ\ÿÕ^»Í—+ç$……”xz,S52IZåŸ$KÔ)“4´á˜$ÓG\A?î*ë<‰ª´Šþof°ÂÑS6LÙHÙèdÞ²a‹;¡lœø°—ž‘f +GÑ´vª™Š9ųÎÿ÷u®µ×ê0‚¤‘°!¬e~À–¸S}8›>Þt)†Ê¬"ùa½2 cÃÝAkBÄÑʂÀkóf’±Æ E¯¿ÄI5»É«ìép;g¸þÇ¡2ßX+žDŠâºTPÏj“4·E^åõ_tW¼ch¯]ÀË)$ª ÜFƒEe¥[–Ç»jÕÞìöøÛCÝQ¾ÖŸ 9žµ¿”»ÇÓ¥.±yrÐËóÕ…ŽlZ½JËe‘mëµÓÅ0Ú¯›\!EÂhô¨¡9ýþ)(¤ðZЪ:0Á¡ós¦%âÓ1‹»endstream +endobj +6650 0 obj << +/Type /Page +/Contents 6651 0 R +/Resources 6649 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6652 0 obj << +/D [6650 0 R /XYZ 71.731 729.2652 null] +>> endobj +6653 0 obj << +/D [6650 0 R /XYZ 71.731 741.2204 null] +>> endobj +6654 0 obj << +/D [6650 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6655 0 obj << +/D [6650 0 R /XYZ 149.4396 708.3437 null] +>> endobj +6656 0 obj << +/D [6650 0 R /XYZ 71.731 706.1869 null] +>> endobj +6657 0 obj << +/D [6650 0 R /XYZ 149.4396 690.4109 null] +>> endobj +6658 0 obj << +/D [6650 0 R /XYZ 149.4396 690.4109 null] +>> endobj +6659 0 obj << +/D [6650 0 R /XYZ 71.731 688.2541 null] +>> endobj +6660 0 obj << +/D [6650 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6661 0 obj << +/D [6650 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6662 0 obj << +/D [6650 0 R /XYZ 71.731 671.0386 null] +>> endobj +6663 0 obj << +/D [6650 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6664 0 obj << +/D [6650 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6665 0 obj << +/D [6650 0 R /XYZ 71.731 652.3886 null] +>> endobj +6666 0 obj << +/D [6650 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6667 0 obj << +/D [6650 0 R /XYZ 149.4396 636.6127 null] +>> endobj +6668 0 obj << +/D [6650 0 R /XYZ 71.731 635.1731 null] +>> endobj +6669 0 obj << +/D [6650 0 R /XYZ 149.4396 618.6799 null] +>> endobj +6670 0 obj << +/D [6650 0 R /XYZ 149.4396 618.6799 null] +>> endobj +6671 0 obj << +/D [6650 0 R /XYZ 71.731 616.5231 null] +>> endobj +6672 0 obj << +/D [6650 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6673 0 obj << +/D [6650 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6674 0 obj << +/D [6650 0 R /XYZ 71.731 599.3076 null] +>> endobj +6675 0 obj << +/D [6650 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6676 0 obj << +/D [6650 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6677 0 obj << +/D [6650 0 R /XYZ 71.731 580.6576 null] +>> endobj +6678 0 obj << +/D [6650 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6679 0 obj << +/D [6650 0 R /XYZ 149.4396 564.8817 null] +>> endobj +6680 0 obj << +/D [6650 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6681 0 obj << +/D [6650 0 R /XYZ 139.477 529.0162 null] +>> endobj +6682 0 obj << +/D [6650 0 R /XYZ 139.477 529.0162 null] +>> endobj +6683 0 obj << +/D [6650 0 R /XYZ 71.731 526.8593 null] +>> endobj +6684 0 obj << +/D [6650 0 R /XYZ 71.731 526.8593 null] +>> endobj +6685 0 obj << +/D [6650 0 R /XYZ 149.4396 511.0834 null] +>> endobj +6686 0 obj << +/D [6650 0 R /XYZ 149.4396 511.0834 null] +>> endobj +6687 0 obj << +/D [6650 0 R /XYZ 71.731 508.9266 null] +>> endobj +6688 0 obj << +/D [6650 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6689 0 obj << +/D [6650 0 R /XYZ 149.4396 493.1507 null] +>> endobj +6690 0 obj << +/D [6650 0 R /XYZ 71.731 490.9938 null] +>> endobj +6691 0 obj << +/D [6650 0 R /XYZ 149.4396 475.2179 null] +>> endobj +6692 0 obj << +/D [6650 0 R /XYZ 149.4396 475.2179 null] +>> endobj +6693 0 obj << +/D [6650 0 R /XYZ 71.731 473.7784 null] +>> endobj +6694 0 obj << +/D [6650 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6695 0 obj << +/D [6650 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6696 0 obj << +/D [6650 0 R /XYZ 71.731 455.1283 null] +>> endobj +6697 0 obj << +/D [6650 0 R /XYZ 71.731 455.1283 null] +>> endobj +6698 0 obj << +/D [6650 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6699 0 obj << +/D [6650 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6700 0 obj << +/D [6650 0 R /XYZ 71.731 437.1956 null] +>> endobj +6701 0 obj << +/D [6650 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6702 0 obj << +/D [6650 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6703 0 obj << +/D [6650 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6704 0 obj << +/D [6650 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6705 0 obj << +/D [6650 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6706 0 obj << +/D [6650 0 R /XYZ 71.731 383.3973 null] +>> endobj +6707 0 obj << +/D [6650 0 R /XYZ 149.4396 367.6214 null] +>> endobj +6708 0 obj << +/D [6650 0 R /XYZ 149.4396 367.6214 null] +>> endobj +6709 0 obj << +/D [6650 0 R /XYZ 71.731 365.4646 null] +>> endobj +6710 0 obj << +/D [6650 0 R /XYZ 71.731 365.4646 null] +>> endobj +6711 0 obj << +/D [6650 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6712 0 obj << +/D [6650 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6713 0 obj << +/D [6650 0 R /XYZ 71.731 347.5318 null] +>> endobj +6714 0 obj << +/D [6650 0 R /XYZ 159.4023 331.7559 null] +>> endobj +6715 0 obj << +/D [6650 0 R /XYZ 159.4023 331.7559 null] +>> endobj +888 0 obj << +/D [6650 0 R /XYZ 71.731 272.9763 null] +>> endobj +406 0 obj << +/D [6650 0 R /XYZ 230.7311 227.722 null] +>> endobj +6716 0 obj << +/D [6650 0 R /XYZ 71.731 204.2332 null] +>> endobj +6717 0 obj << +/D [6650 0 R /XYZ 161.0655 194.8453 null] +>> endobj +6718 0 obj << +/D [6650 0 R /XYZ 71.731 182.7258 null] +>> endobj +6719 0 obj << +/D [6650 0 R /XYZ 71.731 151.36 null] +>> endobj +6720 0 obj << +/D [6650 0 R /XYZ 168.8063 140.3497 null] +>> endobj +6649 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6723 0 obj << +/Length 1422 +/Filter /FlateDecode +>> +stream +xÚµY]›8}Ÿ_Ác"5^`Œû6ݏª«]iÔ¦OÛUÅ$d‚”ˆ­æßï%ØÄÀ5f¥Í„9ö=Î¹Ø ‹(ü±H1¢¸&<‘<ÚhôÿúøÀ de0+ôaýðÓo‚Fšè„'Ñz ©âH NRÉÒh½ýkñó>;×yµ\qIœ´Ç§CVæõÙsûññéS{òg^ïOÛËòïõï¿®»úR(¢S(2I²Cir¥@3‰š þ+Y,"ES"b¡n<¿ä%¾±ÈÊö˜¯ŽYqhϏù咽äí‡údŽ{sárÎ7Å7Jy¾m/\/yu17ûi×ÏpéT~o`‡N‘ââ™!+·}„e•UUöڞžv÷j¼Í˺§jÆÅzqª9A¢c$‘‰¸Ýn3¤Ìà®Þ™©Ì™¡SW×Mí«’ÕuUežéî'!‰PÉí~>çõµ*MUfÄ0Ä/×͆ÛЛî®]™ÓUãZ•´nx<N öq|>òËûnøÝMv4qYªo£³í±(,åi›Ï­úÔÜuVÁcmÚjn ãJ¦"©8á2FSЁVʆ¢(»…`8WSÿçrT”s ãXÑáñN‘)–D—Dv­÷ˆ`<&´™¿¼wMúnÐCšñM6Y]œJy­òñÝY2&‚3kjQ+v•5ͱw?æU;…t¢uý²ÚQc}]…&±R} KÛ_u%D)†Ö=Ô¢kõEd=¶Óõz"„ßï[–’XÊ4d\6å\ [©;Ç»CóºTžð`>ؔ>Ö©;G„¦Ë#”Ϲ’™xñD¡U ª.ÊÕŒ*VuFTG4ð¨öx²‰¤R¢©~“×'oN’8”T6áÄt"Vw†1ˆ{> endobj +6724 0 obj << +/D [6722 0 R /XYZ 71.731 729.2652 null] +>> endobj +6725 0 obj << +/D [6722 0 R /XYZ 71.731 718.3063 null] +>> endobj +6726 0 obj << +/D [6722 0 R /XYZ 71.731 660.0349 null] +>> endobj +6727 0 obj << +/D [6722 0 R /XYZ 181.5683 647.1731 null] +>> endobj +6728 0 obj << +/D [6722 0 R /XYZ 71.731 637.1109 null] +>> endobj +6729 0 obj << +/D [6722 0 R /XYZ 71.731 604.3333 null] +>> endobj +6730 0 obj << +/D [6722 0 R /XYZ 71.731 592.5779 null] +>> endobj +6731 0 obj << +/D [6722 0 R /XYZ 71.731 591.3326 null] +>> endobj +6732 0 obj << +/D [6722 0 R /XYZ 129.5143 572.254 null] +>> endobj +6733 0 obj << +/D [6722 0 R /XYZ 129.5143 572.254 null] +>> endobj +6734 0 obj << +/D [6722 0 R /XYZ 71.731 570.8145 null] +>> endobj +6735 0 obj << +/D [6722 0 R /XYZ 71.731 570.8145 null] +>> endobj +6736 0 obj << +/D [6722 0 R /XYZ 139.477 554.3213 null] +>> endobj +6737 0 obj << +/D [6722 0 R /XYZ 139.477 554.3213 null] +>> endobj +6738 0 obj << +/D [6722 0 R /XYZ 76.7123 536.3885 null] +>> endobj +6739 0 obj << +/D [6722 0 R /XYZ 129.5143 518.4558 null] +>> endobj +6740 0 obj << +/D [6722 0 R /XYZ 129.5143 518.4558 null] +>> endobj +6741 0 obj << +/D [6722 0 R /XYZ 71.731 516.299 null] +>> endobj +6742 0 obj << +/D [6722 0 R /XYZ 71.731 516.299 null] +>> endobj +6743 0 obj << +/D [6722 0 R /XYZ 139.477 500.523 null] +>> endobj +6744 0 obj << +/D [6722 0 R /XYZ 71.731 498.3662 null] +>> endobj +6745 0 obj << +/D [6722 0 R /XYZ 71.731 498.3662 null] +>> endobj +6746 0 obj << +/D [6722 0 R /XYZ 149.4396 482.5903 null] +>> endobj +6747 0 obj << +/D [6722 0 R /XYZ 71.731 481.1507 null] +>> endobj +6748 0 obj << +/D [6722 0 R /XYZ 149.4396 464.6575 null] +>> endobj +6749 0 obj << +/D [6722 0 R /XYZ 76.7123 446.7248 null] +>> endobj +6750 0 obj << +/D [6722 0 R /XYZ 139.477 428.792 null] +>> endobj +6751 0 obj << +/D [6722 0 R /XYZ 71.731 427.3525 null] +>> endobj +6752 0 obj << +/D [6722 0 R /XYZ 71.731 427.3525 null] +>> endobj +6753 0 obj << +/D [6722 0 R /XYZ 149.4396 410.8593 null] +>> endobj +6754 0 obj << +/D [6722 0 R /XYZ 149.4396 410.8593 null] +>> endobj +6755 0 obj << +/D [6722 0 R /XYZ 71.731 408.7024 null] +>> endobj +6756 0 obj << +/D [6722 0 R /XYZ 71.731 408.7024 null] +>> endobj +6757 0 obj << +/D [6722 0 R /XYZ 159.4023 392.9265 null] +>> endobj +6758 0 obj << +/D [6722 0 R /XYZ 71.731 390.7697 null] +>> endobj +6759 0 obj << +/D [6722 0 R /XYZ 159.4023 374.9938 null] +>> endobj +6760 0 obj << +/D [6722 0 R /XYZ 76.7123 357.061 null] +>> endobj +6761 0 obj << +/D [6722 0 R /XYZ 149.4396 339.1283 null] +>> endobj +6762 0 obj << +/D [6722 0 R /XYZ 149.4396 339.1283 null] +>> endobj +6763 0 obj << +/D [6722 0 R /XYZ 71.731 336.9714 null] +>> endobj +6764 0 obj << +/D [6722 0 R /XYZ 71.731 336.9714 null] +>> endobj +6765 0 obj << +/D [6722 0 R /XYZ 159.4023 321.1955 null] +>> endobj +6766 0 obj << +/D [6722 0 R /XYZ 71.731 319.0387 null] +>> endobj +6767 0 obj << +/D [6722 0 R /XYZ 159.4023 303.2628 null] +>> endobj +6768 0 obj << +/D [6722 0 R /XYZ 76.7123 285.33 null] +>> endobj +6769 0 obj << +/D [6722 0 R /XYZ 149.4396 267.3973 null] +>> endobj +6770 0 obj << +/D [6722 0 R /XYZ 149.4396 267.3973 null] +>> endobj +6771 0 obj << +/D [6722 0 R /XYZ 71.731 265.2404 null] +>> endobj +6772 0 obj << +/D [6722 0 R /XYZ 71.731 265.2404 null] +>> endobj +6773 0 obj << +/D [6722 0 R /XYZ 159.4023 249.4645 null] +>> endobj +6774 0 obj << +/D [6722 0 R /XYZ 71.731 247.3077 null] +>> endobj +6775 0 obj << +/D [6722 0 R /XYZ 159.4023 231.5317 null] +>> endobj +6776 0 obj << +/D [6722 0 R /XYZ 76.7123 213.599 null] +>> endobj +6777 0 obj << +/D [6722 0 R /XYZ 149.4396 195.6662 null] +>> endobj +6778 0 obj << +/D [6722 0 R /XYZ 149.4396 195.6662 null] +>> endobj +6779 0 obj << +/D [6722 0 R /XYZ 71.731 193.5094 null] +>> endobj +6780 0 obj << +/D [6722 0 R /XYZ 71.731 193.5094 null] +>> endobj +6781 0 obj << +/D [6722 0 R /XYZ 159.4023 177.7335 null] +>> endobj +6782 0 obj << +/D [6722 0 R /XYZ 71.731 175.5767 null] +>> endobj +6783 0 obj << +/D [6722 0 R /XYZ 159.4023 159.8007 null] +>> endobj +6784 0 obj << +/D [6722 0 R /XYZ 76.7123 141.868 null] +>> endobj +6785 0 obj << +/D [6722 0 R /XYZ 149.4396 123.9352 null] +>> endobj +6786 0 obj << +/D [6722 0 R /XYZ 149.4396 123.9352 null] +>> endobj +6787 0 obj << +/D [6722 0 R /XYZ 71.731 121.7784 null] +>> endobj +6788 0 obj << +/D [6722 0 R /XYZ 71.731 121.7784 null] +>> endobj +6789 0 obj << +/D [6722 0 R /XYZ 159.4023 106.0025 null] +>> endobj +6790 0 obj << +/D [6722 0 R /XYZ 71.731 103.8457 null] +>> endobj +6721 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6793 0 obj << +/Length 1344 +/Filter /FlateDecode +>> +stream +xÚµš[OëF…ßù~©Lç>㾝^N/j¥£*}*2ÉÖ rLø÷ÙN¶gO@œ„…÷òÊú2vˆ¨xü•Ì©¸‘5“ÖÈjùpÆ«»ø«ŸÏÄ ¹4—PôýâìۏŠW5«­´Õâ¶RµeÆéÊ)ɼ¾Z¬þ>ÿá¾yìCwq) ?—ì°ý´n6¡ÿ½¹9Üýðé×Í?B¿]í.þYüvöÓbœo”cµC²&•÷ÌhU]JÎj) *ºf:ÇÂ=SZ¹ñXd]9&öǏeԍ²ýÁ\IiŽÍ #Xm¸¬àÓÜãí«ôW¨×L…‰>¸TSM×5χȶ·‡í®ïÚÍÝ7‡;‹ eÎÛ~N̪¸;ç*ëdÜz<È$º„*$¢ã}Í&¤ã±zgÑ©ó ¥¿:µ¡|åcBVOž©‰§n½·qœ¦gVñýˆ½æ;˜ÜæPÔـO-M7:¶Ïh¢uP–iÝ(#[‡Í-hæiÝÄǤb¿lÂáÖcsæcQ–Y! åbI2:dnI,ˆ,胂‘H*QÄ9sÚQDU†È¤¢‰D¦–ylc†Hèãßе·í²éÛíæúsxFðô5SB¾ÆÇ%IhŠN(ËÔp”‘5ÄæÔóÔpâcÒ¹?Ã.ô©t»Ý— ±Oouxäóþ^¸æüy>0«™÷‚âÊr%2·$0ÄôAqûÕšx²Â…%ˆ†ªy¢GI46µ€è8ÑaÓܬà +Ysf¸Ÿ‚|³Ý®C³!INºÙf +Á¸W$Ê@–kf’ÑÍDæ–4ñ5ú"HëG³’ aˆ$f¤kńá½P–Éh”‘as 2Â| M|Ì7çÿÇ6@¦cÒX¨švT‘ÀbS €=±;ññx¿Ý×µòµ…7þ`ÊHŠV(Ë51Éè&"sKšˆøÀš}]y¹Ø³u8DýòÐæéá&^Ï&$Ó¢&Y²\BIF'„Ì-Iñ%}З«¥¡ t)o˜1š ªæIU$©ØÔROlà¤N|<†Ð]?†nϕ[l…už kÝÙvӓ¼î5sUTÖ1++”eª8ÊÈ*bs ªˆù@ª8ñ(ÝÇýÉÛ¶ íÝ°:<íÒÛTí*lúöŠs™i҉`Ȑ¬â ë=E2”åâK2:>dnI|ˆ,>è/ԛ'šÐŠysÉcT̓ŠÆ™Z‚ù±Ì¡—ëŠý5r +m╊{—5YÖqß5§0‡²LOGÙSlnAO1HO'>&ˡårû´™½”k‡¶.»çÇþŠ¿Åá¡Ûm÷0£sÑa|ꉁ,c’Ñ1"sKbD|`1BÔÂýÆɨJ-¯%=TÍc?ªH챩؟ØÀ±ŸøÈ-ìñù’6îøMv)u¼rªIâ,WÕ$£«ŠÌ-©*â«*ôñº ý…¯:³Ùpˤ´$Æ@–Ë&Éèl¹%Ù >°l ìª]×À“pœ)+6¡jžÍQE²‰M-`óÄÎæÄǪéÃõ² qƒáÏ%5wâmñF2-=…'”e*8ÊÈ +bs *ˆù@*8ññÚ·c²CJ›aèÛô’/÷齚.-/ËJz?<9xšJ3] +h(Ë¥™dtšÈܒ4XšÐGèw xÀ¶þ‰š}¢ù€$"ùGFà짚x¹ìnKßÑþJì‡Shϼ°uöó@súq #ãÊÛqO{k‚ûÙOO ÿÏYgaendstream +endobj +6792 0 obj << +/Type /Page +/Contents 6793 0 R +/Resources 6791 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6794 0 obj << +/D [6792 0 R /XYZ 71.731 729.2652 null] +>> endobj +6795 0 obj << +/D [6792 0 R /XYZ 159.4023 708.3437 null] +>> endobj +6796 0 obj << +/D [6792 0 R /XYZ 76.7123 690.4109 null] +>> endobj +6797 0 obj << +/D [6792 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6798 0 obj << +/D [6792 0 R /XYZ 149.4396 672.4782 null] +>> endobj +6799 0 obj << +/D [6792 0 R /XYZ 71.731 670.3214 null] +>> endobj +6800 0 obj << +/D [6792 0 R /XYZ 71.731 670.3214 null] +>> endobj +6801 0 obj << +/D [6792 0 R /XYZ 159.4023 654.5454 null] +>> endobj +6802 0 obj << +/D [6792 0 R /XYZ 71.731 652.3886 null] +>> endobj +6803 0 obj << +/D [6792 0 R /XYZ 159.4023 636.6127 null] +>> endobj +6804 0 obj << +/D [6792 0 R /XYZ 76.7123 618.6799 null] +>> endobj +6805 0 obj << +/D [6792 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6806 0 obj << +/D [6792 0 R /XYZ 149.4396 600.7472 null] +>> endobj +6807 0 obj << +/D [6792 0 R /XYZ 71.731 598.5904 null] +>> endobj +6808 0 obj << +/D [6792 0 R /XYZ 71.731 598.5904 null] +>> endobj +6809 0 obj << +/D [6792 0 R /XYZ 159.4023 582.8144 null] +>> endobj +6810 0 obj << +/D [6792 0 R /XYZ 71.731 580.6576 null] +>> endobj +6811 0 obj << +/D [6792 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6812 0 obj << +/D [6792 0 R /XYZ 76.7123 546.9489 null] +>> endobj +6813 0 obj << +/D [6792 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6814 0 obj << +/D [6792 0 R /XYZ 149.4396 529.0162 null] +>> endobj +6815 0 obj << +/D [6792 0 R /XYZ 71.731 526.8593 null] +>> endobj +6816 0 obj << +/D [6792 0 R /XYZ 71.731 526.8593 null] +>> endobj +6817 0 obj << +/D [6792 0 R /XYZ 159.4023 511.0834 null] +>> endobj +6818 0 obj << +/D [6792 0 R /XYZ 71.731 509.6439 null] +>> endobj +6819 0 obj << +/D [6792 0 R /XYZ 159.4023 493.1507 null] +>> endobj +6820 0 obj << +/D [6792 0 R /XYZ 76.7123 475.2179 null] +>> endobj +6821 0 obj << +/D [6792 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6822 0 obj << +/D [6792 0 R /XYZ 149.4396 457.2852 null] +>> endobj +6823 0 obj << +/D [6792 0 R /XYZ 71.731 455.1283 null] +>> endobj +6824 0 obj << +/D [6792 0 R /XYZ 71.731 455.1283 null] +>> endobj +6825 0 obj << +/D [6792 0 R /XYZ 159.4023 439.3524 null] +>> endobj +6826 0 obj << +/D [6792 0 R /XYZ 71.731 437.1956 null] +>> endobj +6827 0 obj << +/D [6792 0 R /XYZ 159.4023 421.4197 null] +>> endobj +6828 0 obj << +/D [6792 0 R /XYZ 76.7123 403.4869 null] +>> endobj +6829 0 obj << +/D [6792 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6830 0 obj << +/D [6792 0 R /XYZ 149.4396 385.5542 null] +>> endobj +6831 0 obj << +/D [6792 0 R /XYZ 71.731 383.3973 null] +>> endobj +6832 0 obj << +/D [6792 0 R /XYZ 71.731 383.3973 null] +>> endobj +6833 0 obj << +/D [6792 0 R /XYZ 159.4023 367.6214 null] +>> endobj +6834 0 obj << +/D [6792 0 R /XYZ 71.731 365.4646 null] +>> endobj +6835 0 obj << +/D [6792 0 R /XYZ 159.4023 349.6887 null] +>> endobj +6836 0 obj << +/D [6792 0 R /XYZ 76.7123 331.7559 null] +>> endobj +6837 0 obj << +/D [6792 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6838 0 obj << +/D [6792 0 R /XYZ 149.4396 313.8231 null] +>> endobj +6839 0 obj << +/D [6792 0 R /XYZ 71.731 311.6663 null] +>> endobj +6840 0 obj << +/D [6792 0 R /XYZ 71.731 311.6663 null] +>> endobj +6841 0 obj << +/D [6792 0 R /XYZ 159.4023 295.8904 null] +>> endobj +6842 0 obj << +/D [6792 0 R /XYZ 71.731 293.7336 null] +>> endobj +6843 0 obj << +/D [6792 0 R /XYZ 159.4023 277.9576 null] +>> endobj +6844 0 obj << +/D [6792 0 R /XYZ 76.7123 260.0249 null] +>> endobj +6845 0 obj << +/D [6792 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6846 0 obj << +/D [6792 0 R /XYZ 149.4396 242.0921 null] +>> endobj +6847 0 obj << +/D [6792 0 R /XYZ 71.731 239.9353 null] +>> endobj +6848 0 obj << +/D [6792 0 R /XYZ 71.731 239.9353 null] +>> endobj +6849 0 obj << +/D [6792 0 R /XYZ 159.4023 224.1594 null] +>> endobj +6850 0 obj << +/D [6792 0 R /XYZ 71.731 222.7198 null] +>> endobj +6851 0 obj << +/D [6792 0 R /XYZ 159.4023 206.2266 null] +>> endobj +6852 0 obj << +/D [6792 0 R /XYZ 76.7123 188.2939 null] +>> endobj +6853 0 obj << +/D [6792 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6854 0 obj << +/D [6792 0 R /XYZ 149.4396 170.3611 null] +>> endobj +6855 0 obj << +/D [6792 0 R /XYZ 71.731 168.2043 null] +>> endobj +6856 0 obj << +/D [6792 0 R /XYZ 71.731 168.2043 null] +>> endobj +6857 0 obj << +/D [6792 0 R /XYZ 159.4023 152.4284 null] +>> endobj +6858 0 obj << +/D [6792 0 R /XYZ 71.731 150.9888 null] +>> endobj +6859 0 obj << +/D [6792 0 R /XYZ 159.4023 134.4956 null] +>> endobj +6860 0 obj << +/D [6792 0 R /XYZ 76.7123 116.5629 null] +>> endobj +6861 0 obj << +/D [6792 0 R /XYZ 149.4396 98.6301 null] +>> endobj +6862 0 obj << +/D [6792 0 R /XYZ 149.4396 98.6301 null] +>> endobj +6863 0 obj << +/D [6792 0 R /XYZ 71.731 96.4733 null] +>> endobj +6864 0 obj << +/D [6792 0 R /XYZ 71.731 96.4733 null] +>> endobj +6791 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6867 0 obj << +/Length 1197 +/Filter /FlateDecode +>> +stream +xÚ½˜Moã6†ïù:Ú@͒”ø¡ÜÒf[lÑÆÖ=5E HL¬Ö– ‰Þmþ}G)ÑõÑ-rb¿â¼|f8"M $‰.4F”3¤Ç;¼ÁWßß#ÙÍÆ}³»ûú»1Š9åÁî5cŽ˜ˆR$‘Á.ûmõí>9iU­7”áEíu{H +¥L^Ú¶ۛŸ”Þ—Y½þ}÷Ã݇]Ÿ…Å‚Lš ¥D, +ƒ Å(¦„yE$ŠQFa.X¢0 +E7‘fž0—N×ɚÉåõÑ3% |`^ûÈ ý•!©,[]¶×/û<ݛöyÝޝk+{Q‡²x îæËcŒ"‚ãz®l‚^'›¥ç‹»€žÏ‡‡Þ•¤ª’÷–FùÚ^ÿ !„"à,‚ªd‘Ÿ§m\•çíX£4#à"÷F§iŸÚe &®³êúø¬ªü5O—ųúë”Wêã6#,E´yê¾ãnahús3^­!GœP1W­ŽlªZ­l¾Z=q—T«Ç‡¯Z]}i>&ZJEf +2?*[¥ªhï>¯ [ARž0¦&-® ^©æsÃörßçÊϖHÄE<Û Ù[+›g뉻„­Ç‡­ëc²üO¸ÍÚf^š$šé®j¼OtªÙ>ዺ O løûĕuLòƒ§1À+=”±¼î µ®òâm¶5ÙX3!)É\wpeÜÉf+ØwAû|x*øÊGKÀ¾»ªü˜T¶æ6à-º,ƒÒ_ê,â(ŽäÜRweS ¬l”'îP>P®Ñêù·ìHŒƒ,D‚!JÄ;«Ú¸²ž],pËn0Ú(;JaH¨7î8;ûÔÐÇõ҅ÕÈl¢¯|Ôç—?Tª=‹7ÂÒù¯áúÁAéŒãGÉ¢rd{ï tdS(­l¥'î”·>FPº>^ÊìÝ×#$XDr´ƒÀ™ž#˜4G.Á۞ðIésUÔ÷ãœqœÍaîUS”jò0èÆCÎJï;&ú81ot»ÜÏi + ùõlßB`2CØ%]Ȓ!F4dü2…ŽÓœY…ª/e©.3å[IŠoò°­J]ê÷“ºïžèËÃ<»¡¶z¦G9!.ŽŸ0ÃÉYïÍ| +øâ9ϞËêy_ÖºHŽ +ÄcgcGwí<ª:­òS³C™2{OÆikèUdµ=úSõI¥—ÍŽÊz[¦U:Šäp0Íôµ¬Ž‰ÖVþë㶽9%i»Q҃sV½/Ï£O8k™Lêë“Yuáe¾;U–Ö Âr¶B—õa:1IÚl>dǼ¨í°Åpø¬ß´5ó2¿WìÖ|¦ûúf?¸ýx;ZYØi»ã6CÙguÇ37›:תóK`ë +î.do5wù`lþIêۚ·¶je\Mu9Ì{ç°·…Ñ«Gu«®(õÔ0‹-T?ãáe¶#ƛGKküáp(ה­¾ØjûTT½tý%M}˜iœrs£!ï·MÍüIØÞòxò'3G3üŌÑáPòn¤ÆÁñè`žˆ²‰5endstream +endobj +6866 0 obj << +/Type /Page +/Contents 6867 0 R +/Resources 6865 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6550 0 R +>> endobj +6868 0 obj << +/D [6866 0 R /XYZ 71.731 729.2652 null] +>> endobj +6869 0 obj << +/D [6866 0 R /XYZ 159.4023 708.3437 null] +>> endobj +6870 0 obj << +/D [6866 0 R /XYZ 71.731 706.1869 null] +>> endobj +6871 0 obj << +/D [6866 0 R /XYZ 159.4023 690.4109 null] +>> endobj +6872 0 obj << +/D [6866 0 R /XYZ 76.7123 672.4782 null] +>> endobj +6873 0 obj << +/D [6866 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6874 0 obj << +/D [6866 0 R /XYZ 149.4396 654.5454 null] +>> endobj +6875 0 obj << +/D [6866 0 R /XYZ 71.731 652.3886 null] +>> endobj +6876 0 obj << +/D [6866 0 R /XYZ 71.731 652.3886 null] +>> endobj +6877 0 obj << +/D [6866 0 R /XYZ 159.4023 636.6127 null] +>> endobj +6878 0 obj << +/D [6866 0 R /XYZ 71.731 634.4559 null] +>> endobj +6879 0 obj << +/D [6866 0 R /XYZ 159.4023 618.6799 null] +>> endobj +6880 0 obj << +/D [6866 0 R /XYZ 76.7123 600.7472 null] +>> endobj +6881 0 obj << +/D [6866 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6882 0 obj << +/D [6866 0 R /XYZ 149.4396 582.8144 null] +>> endobj +6883 0 obj << +/D [6866 0 R /XYZ 71.731 580.6576 null] +>> endobj +6884 0 obj << +/D [6866 0 R /XYZ 71.731 580.6576 null] +>> endobj +6885 0 obj << +/D [6866 0 R /XYZ 159.4023 564.8817 null] +>> endobj +6886 0 obj << +/D [6866 0 R /XYZ 71.731 562.7248 null] +>> endobj +6887 0 obj << +/D [6866 0 R /XYZ 159.4023 546.9489 null] +>> endobj +6888 0 obj << +/D [6866 0 R /XYZ 76.7123 493.1507 null] +>> endobj +6889 0 obj << +/D [6866 0 R /XYZ 129.5143 475.2179 null] +>> endobj +6890 0 obj << +/D [6866 0 R /XYZ 129.5143 475.2179 null] +>> endobj +6891 0 obj << +/D [6866 0 R /XYZ 71.731 473.0611 null] +>> endobj +6892 0 obj << +/D [6866 0 R /XYZ 129.5143 457.2852 null] +>> endobj +6893 0 obj << +/D [6866 0 R /XYZ 129.5143 457.2852 null] +>> endobj +6894 0 obj << +/D [6866 0 R /XYZ 71.731 435.2031 null] +>> endobj +6895 0 obj << +/D [6866 0 R /XYZ 71.731 424.3089 null] +>> endobj +6896 0 obj << +/D [6866 0 R /XYZ 71.731 423.0636 null] +>> endobj +6897 0 obj << +/D [6866 0 R /XYZ 129.5143 403.985 null] +>> endobj +889 0 obj << +/D [6866 0 R /XYZ 71.731 397.5642 null] +>> endobj +410 0 obj << +/D [6866 0 R /XYZ 217.1313 353.7494 null] +>> endobj +6898 0 obj << +/D [6866 0 R /XYZ 71.731 333.609 null] +>> endobj +6899 0 obj << +/D [6866 0 R /XYZ 161.0655 320.8727 null] +>> endobj +6900 0 obj << +/D [6866 0 R /XYZ 71.731 308.7532 null] +>> endobj +6901 0 obj << +/D [6866 0 R /XYZ 71.731 277.7236 null] +>> endobj +6902 0 obj << +/D [6866 0 R /XYZ 168.8063 266.3771 null] +>> endobj +6903 0 obj << +/D [6866 0 R /XYZ 71.731 239.3136 null] +>> endobj +6904 0 obj << +/D [6866 0 R /XYZ 71.731 207.9478 null] +>> endobj +6905 0 obj << +/D [6866 0 R /XYZ 71.731 191.3101 null] +>> endobj +6906 0 obj << +/D [6866 0 R /XYZ 71.731 148.4085 null] +>> endobj +6907 0 obj << +/D [6866 0 R /XYZ 181.5683 137.062 null] +>> endobj +6908 0 obj << +/D [6866 0 R /XYZ 71.731 126.9998 null] +>> endobj +6865 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6911 0 obj << +/Length 1046 +/Filter /FlateDecode +>> +stream +xÚÍX]›8}Ÿ_Ác"5^`¦OӏYuµ»UyëT#Jœ‰@Uý÷{ ˜àªTµš˜pÌ9ν¾‚þH ’ 4FTp¤Ç;|…KÞ ÙXÌƽÙÞýñÈp£XPl÷‹â2 $£(â$ +¶»O«·‡äT«j½¡¯(jŽOyR¨úïäKóïÃӇæäUʝ^Þþu÷~Ûñs&QɤÈ5–IcG&!1âœÈ@ⱐɋΧ5᫤JŽ +Ôêûk Ý" ÅÌ+¡Cm\X+~‘˜ $t0#á™R>â¥4êå½>ö:ÚUc, +"°B„`'!êHÎõÁè¸ò†¹oޗ®«sZ¿ºz‹f½*ê,Mê¬,\ä¹Rãl% Š$÷Û¢6.¬7–˜x¨…Ý4BŠi{yoÛ®ëËbJ9”ñ¾4 ÷¸Ë!ϵ¿Yñµõ×cë±¹Ýå¼.›ãY«Ûée!‚p̅·GMe×¢æ£;&]’Ü+7‚ëˆ(ʝzÉv/eõr(u]@-{Œ&8DK6t:+ê椬\ëo§•D¢˜Í¥ÕM¥µ…ͧÕû$­Ž%mZ]àˆ Þ¿à«uigøŒ1…Ž~ËGˆr1WÈ.lš6kw5>ck2eùxÎóïÍéç$oܱ%éÆ8ᶔ›GÇ(Âqx¹×G]±˜Øp8• ”‰™šuaEÛÁf«ÖÇ» l}:;»×êêè£FlÎö¶Ïiª´ÞŸs[È O"Jø¥ l¸D2b¡”ñæfÈ̘!#ðv_)}xZ3¼RMb¯ô„Eƒ}fd‘ÂŽUY—õ÷“ºïVôÇ®ÝP‚Ԋ}‡ jçœg̱ÙíSà‚mLæÔ$Ä£gÓÞÞÕóNé´ÊN¦ë/Uô¨êô tC_tõ›6˜:ÏRûÛ.©“æl_•G»•ìE}Ré ѧî»{¥IO•Ù.š—ieñÚBsm÷¦Êa¾Òm‹MrËm¥ÊԚ¬´mY\§ÂÔ6±G‚‹¦Oõ±nï×ÄÌ ymW—ð4Õ·L+´Ôð‡Þ]`¤Ã¿{tüš±“2ŒB0ff·ra»U›Ý­|¼ v«‘ïØ9ñŒ$Aãtz]ØDz;Ølz}¼ Ò;ÒáOï@‡§Çÿ´á“Hxk„ə̺°‰Ìv°ÙÌúxdÖ§c €ájÎ6eM ›·Æûď5®ŒAqöîüà˜i¿ì@Žˆˆ'?þ8˜ñ·NÂ,ݝ )!øæ§ãÿÝ4Rendstream +endobj +6910 0 obj << +/Type /Page +/Contents 6911 0 R +/Resources 6909 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +6912 0 obj << +/D [6910 0 R /XYZ 71.731 729.2652 null] +>> endobj +891 0 obj << +/D [6910 0 R /XYZ 71.731 741.2204 null] +>> endobj +6913 0 obj << +/D [6910 0 R /XYZ 71.731 718.3063 null] +>> endobj +6914 0 obj << +/D [6910 0 R /XYZ 71.731 708.2442 null] +>> endobj +6915 0 obj << +/D [6910 0 R /XYZ 71.731 706.9988 null] +>> endobj +6916 0 obj << +/D [6910 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6917 0 obj << +/D [6910 0 R /XYZ 129.5143 687.9203 null] +>> endobj +6918 0 obj << +/D [6910 0 R /XYZ 71.731 686.4807 null] +>> endobj +6919 0 obj << +/D [6910 0 R /XYZ 71.731 686.4807 null] +>> endobj +6920 0 obj << +/D [6910 0 R /XYZ 139.477 669.9875 null] +>> endobj +6921 0 obj << +/D [6910 0 R /XYZ 139.477 669.9875 null] +>> endobj +6922 0 obj << +/D [6910 0 R /XYZ 76.7123 652.0548 null] +>> endobj +6923 0 obj << +/D [6910 0 R /XYZ 129.5143 634.122 null] +>> endobj +6924 0 obj << +/D [6910 0 R /XYZ 129.5143 634.122 null] +>> endobj +6925 0 obj << +/D [6910 0 R /XYZ 71.731 631.9652 null] +>> endobj +6926 0 obj << +/D [6910 0 R /XYZ 71.731 631.9652 null] +>> endobj +6927 0 obj << +/D [6910 0 R /XYZ 139.477 616.1893 null] +>> endobj +6928 0 obj << +/D [6910 0 R /XYZ 71.731 614.7497 null] +>> endobj +6929 0 obj << +/D [6910 0 R /XYZ 139.477 598.2565 null] +>> endobj +6930 0 obj << +/D [6910 0 R /XYZ 71.731 560.3985 null] +>> endobj +6931 0 obj << +/D [6910 0 R /XYZ 71.731 547.3475 null] +>> endobj +6932 0 obj << +/D [6910 0 R /XYZ 71.731 546.1022 null] +>> endobj +6933 0 obj << +/D [6910 0 R /XYZ 129.5143 527.0236 null] +>> endobj +890 0 obj << +/D [6910 0 R /XYZ 71.731 520.6028 null] +>> endobj +414 0 obj << +/D [6910 0 R /XYZ 215.7019 476.788 null] +>> endobj +6934 0 obj << +/D [6910 0 R /XYZ 71.731 456.6476 null] +>> endobj +6935 0 obj << +/D [6910 0 R /XYZ 161.0655 443.9113 null] +>> endobj +6936 0 obj << +/D [6910 0 R /XYZ 71.731 431.7918 null] +>> endobj +6937 0 obj << +/D [6910 0 R /XYZ 71.731 400.426 null] +>> endobj +6938 0 obj << +/D [6910 0 R /XYZ 168.8063 389.4157 null] +>> endobj +6939 0 obj << +/D [6910 0 R /XYZ 71.731 377.2962 null] +>> endobj +6940 0 obj << +/D [6910 0 R /XYZ 71.731 334.9196 null] +>> endobj +6941 0 obj << +/D [6910 0 R /XYZ 181.5683 323.2637 null] +>> endobj +6942 0 obj << +/D [6910 0 R /XYZ 71.731 313.2016 null] +>> endobj +6943 0 obj << +/D [6910 0 R /XYZ 71.731 281.63 null] +>> endobj +6944 0 obj << +/D [6910 0 R /XYZ 71.731 268.6686 null] +>> endobj +6945 0 obj << +/D [6910 0 R /XYZ 71.731 267.4232 null] +>> endobj +6946 0 obj << +/D [6910 0 R /XYZ 129.5143 248.3447 null] +>> endobj +6947 0 obj << +/D [6910 0 R /XYZ 129.5143 248.3447 null] +>> endobj +6948 0 obj << +/D [6910 0 R /XYZ 71.731 246.9051 null] +>> endobj +6949 0 obj << +/D [6910 0 R /XYZ 71.731 246.9051 null] +>> endobj +6950 0 obj << +/D [6910 0 R /XYZ 139.477 230.4119 null] +>> endobj +6951 0 obj << +/D [6910 0 R /XYZ 139.477 230.4119 null] +>> endobj +6952 0 obj << +/D [6910 0 R /XYZ 76.7123 212.4792 null] +>> endobj +6953 0 obj << +/D [6910 0 R /XYZ 129.5143 194.5464 null] +>> endobj +6954 0 obj << +/D [6910 0 R /XYZ 129.5143 194.5464 null] +>> endobj +6955 0 obj << +/D [6910 0 R /XYZ 71.731 192.3896 null] +>> endobj +6956 0 obj << +/D [6910 0 R /XYZ 71.731 192.3896 null] +>> endobj +6957 0 obj << +/D [6910 0 R /XYZ 139.477 176.6137 null] +>> endobj +6958 0 obj << +/D [6910 0 R /XYZ 71.731 175.1741 null] +>> endobj +6959 0 obj << +/D [6910 0 R /XYZ 139.477 158.6809 null] +>> endobj +6960 0 obj << +/D [6910 0 R /XYZ 71.731 120.8229 null] +>> endobj +6961 0 obj << +/D [6910 0 R /XYZ 71.731 107.7719 null] +>> endobj +6962 0 obj << +/D [6910 0 R /XYZ 71.731 106.5266 null] +>> endobj +6909 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +6966 0 obj << +/Length 1264 +/Filter /FlateDecode +>> +stream +xڝXێÛ6}߯Ð[m fxuÉÛ¶i‹-°œ§n±ÐÊôZˆ,’¼®ÿ¾C‘”)™º¤q­CΙ33äPÄÃðx!A!ƒ 8õÒãöÞàÕïDC6³±A?o>þÆ°£8 ·Ý{,}/dEœDÞv÷÷ê—CrjDµÞPŽW©çSž¢ù3yU>>}Qƒ¿Ds(wõúŸí¿n;ûœ…(ŽÀÈ$IŸDÈg8ö6£˜îD#ÎIÎà1Ÿ…34öÀNˆ‰t¦Ãu0éÍ3¥|ȎP +B={Acwø¼ñ0³œ¦~ì´;.¬™uÏ£/,‹‘†} ‹j#êr¨s:Ô¡¾°u}²Õr½½¶ñìÅa?$sÙkÁ¦²×Àæ³×awIöyŒd¯Íã¾s¨LjѡÚйö÷?%ÿhÆ҈!"ÓkÃ&2¶ƒÍf¬Ëuñ°šy±=·^þÛ­›ÙÉ$l‚j\š€#"[“i,ؔ46/Ãîi<ÒØ4z¥ùTeǤºÚ'¼Þ +w;hÝëÑz¤à"#Á\=Ú°‰zì`³õè²» ïx¸ë±Çã]6›™iIÄÕQ‘„Ó‰­¯½…õXƒÎЭ3ôŠLÞ.gt¶`S:ؼλKtòÑÙæÑÓY¨;£CkB0ÂQHî¶>-õg¸` ú»&;š»Ew«[ÒnZ—׶›Á¶î享o¹€2£3Á³aÁë`³ÁsÙ]<ÇG“Ñ&?rïúï¡Gú™!ؽâÉÏhæþ+§ aÝJ’:!dô£˜Ãâ Ã¦~endstream +endobj +6965 0 obj << +/Type /Page +/Contents 6966 0 R +/Resources 6964 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +6967 0 obj << +/D [6965 0 R /XYZ 71.731 729.2652 null] +>> endobj +6968 0 obj << +/D [6965 0 R /XYZ 71.731 741.2204 null] +>> endobj +6969 0 obj << +/D [6965 0 R /XYZ 129.5143 708.3437 null] +>> endobj +418 0 obj << +/D [6965 0 R /XYZ 241.5425 658.1081 null] +>> endobj +6970 0 obj << +/D [6965 0 R /XYZ 71.731 637.9677 null] +>> endobj +6971 0 obj << +/D [6965 0 R /XYZ 161.0655 625.2314 null] +>> endobj +6972 0 obj << +/D [6965 0 R /XYZ 71.731 613.1119 null] +>> endobj +6973 0 obj << +/D [6965 0 R /XYZ 71.731 581.746 null] +>> endobj +6974 0 obj << +/D [6965 0 R /XYZ 168.8063 570.7357 null] +>> endobj +6975 0 obj << +/D [6965 0 R /XYZ 71.731 543.6723 null] +>> endobj +6976 0 obj << +/D [6965 0 R /XYZ 71.731 500.6501 null] +>> endobj +6977 0 obj << +/D [6965 0 R /XYZ 71.731 472.3562 null] +>> endobj +6978 0 obj << +/D [6965 0 R /XYZ 71.731 440.7747 null] +>> endobj +6979 0 obj << +/D [6965 0 R /XYZ 181.5683 429.7644 null] +>> endobj +6980 0 obj << +/D [6965 0 R /XYZ 71.731 419.7022 null] +>> endobj +6981 0 obj << +/D [6965 0 R /XYZ 71.731 388.1306 null] +>> endobj +6982 0 obj << +/D [6965 0 R /XYZ 71.731 375.1692 null] +>> endobj +6983 0 obj << +/D [6965 0 R /XYZ 71.731 373.9239 null] +>> endobj +6984 0 obj << +/D [6965 0 R /XYZ 129.5143 354.8453 null] +>> endobj +6985 0 obj << +/D [6965 0 R /XYZ 129.5143 354.8453 null] +>> endobj +6986 0 obj << +/D [6965 0 R /XYZ 71.731 353.4058 null] +>> endobj +6987 0 obj << +/D [6965 0 R /XYZ 71.731 353.4058 null] +>> endobj +6988 0 obj << +/D [6965 0 R /XYZ 139.477 336.9126 null] +>> endobj +6989 0 obj << +/D [6965 0 R /XYZ 139.477 336.9126 null] +>> endobj +6990 0 obj << +/D [6965 0 R /XYZ 76.7123 318.9798 null] +>> endobj +6991 0 obj << +/D [6965 0 R /XYZ 129.5143 301.0471 null] +>> endobj +6992 0 obj << +/D [6965 0 R /XYZ 129.5143 301.0471 null] +>> endobj +6993 0 obj << +/D [6965 0 R /XYZ 71.731 298.8902 null] +>> endobj +6994 0 obj << +/D [6965 0 R /XYZ 71.731 298.8902 null] +>> endobj +6995 0 obj << +/D [6965 0 R /XYZ 139.477 283.1143 null] +>> endobj +6996 0 obj << +/D [6965 0 R /XYZ 71.731 281.6748 null] +>> endobj +6997 0 obj << +/D [6965 0 R /XYZ 139.477 265.1816 null] +>> endobj +6998 0 obj << +/D [6965 0 R /XYZ 76.7123 247.2488 null] +>> endobj +6999 0 obj << +/D [6965 0 R /XYZ 129.5143 229.3161 null] +>> endobj +7000 0 obj << +/D [6965 0 R /XYZ 129.5143 229.3161 null] +>> endobj +7001 0 obj << +/D [6965 0 R /XYZ 71.731 227.1592 null] +>> endobj +7002 0 obj << +/D [6965 0 R /XYZ 129.5143 211.3833 null] +>> endobj +7003 0 obj << +/D [6965 0 R /XYZ 129.5143 211.3833 null] +>> endobj +7004 0 obj << +/D [6965 0 R /XYZ 71.731 189.3012 null] +>> endobj +7005 0 obj << +/D [6965 0 R /XYZ 71.731 178.4071 null] +>> endobj +7006 0 obj << +/D [6965 0 R /XYZ 71.731 177.1617 null] +>> endobj +7007 0 obj << +/D [6965 0 R /XYZ 129.5143 158.0832 null] +>> endobj +892 0 obj << +/D [6965 0 R /XYZ 71.731 150.945 null] +>> endobj +6964 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7010 0 obj << +/Length 1092 +/Filter /FlateDecode +>> +stream +xÚµX[£6}Ÿ_Á[iq}Áï[v·­Zu¥h7ûÔ©FLðLÐr‰€´_ÛĐª*!ÉùüÎ1vPå  FäæÇÇò¯ò§_„º ‡‡&0à€Ç8/á1 , +Á ¡( Ù›§ô܉fb +7è÷}‘V¢û=}Öwû_õÅgѝê¬Ýþyøíá§ÃПx"›Ì’PSšˆŒh¤xÚC +XÄXOËREŽ%›¯¢Ûo ÜH҈nÚºÚ7y™Ê ¸yûšwBѓcrgê †,ÕÔY¬ÇÜ7uWwogñ~¨HdEܓ0µ!F F ï TgÑ u³^˜GHazéNïôÇszʳ§ºyešæ‡VV˜¯‹ú5¯žžÓVÈbäáZ +.çO¢=6ù¹ËëjŽ5‘w:ƚõçôûVJ#ZM¡;ÎíYóG±È®än0z"?l©Ú|£§~­0–9ŒKôuyi;}•H3Söl ©A‰òÙ:°~¹eÙ·3•& +Q bÂâ~Z»¬Ì+CªLÍȗs–ÚI¤•òÇ[]YŠ»¢0MäèÍmi]žA$²lEñ—J´`ím’­ê-¦›¿­¶_êB´k}–ª©Y+åæâÒJ"¸1;q<­e³WìÓ&-…LºfáÆ!(E,ˆ(„qäï€ +]˜Ž/d´DŠÁt4Eác:é‹1 ÂÞ¾·ïW¶jʃ$Ž°H.2EdÌC…Ô#ŽTä½1^×\ŽÝ»›PՋªË©Š ‹¼4b:AKpE1ñ kQ¡ » +‹Ôb8š…ÝVÞ|ˆ#îí{_X[5å1Vý*—卝ÔE?<êRÛH>xnõÍ«W«¯GÖR§Ý^!¸ï^HM`²ä^6ç^ [v¯§ï÷Þò¸ã^—Çô¹âQ›s@ð­Úyeâºqå¿ëX’PyÏ´àX6ãضèX_ߎõñ¸*b;¢!1æûÖÚ§Ož)öÏÄæ¾41 Ñ¥0»°9i,lYOß5Òxxx¤qiŒ¢¹wø"ìM§—Â,kDÛÞÍ#!$_Ê£ ›Éã[Ì£¯ïŠ> endobj +7011 0 obj << +/D [7009 0 R /XYZ 71.731 729.2652 null] +>> endobj +422 0 obj << +/D [7009 0 R /XYZ 295.0295 705.7477 null] +>> endobj +7012 0 obj << +/D [7009 0 R /XYZ 71.731 682.2589 null] +>> endobj +7013 0 obj << +/D [7009 0 R /XYZ 161.0655 672.871 null] +>> endobj +7014 0 obj << +/D [7009 0 R /XYZ 71.731 660.7515 null] +>> endobj +7015 0 obj << +/D [7009 0 R /XYZ 71.731 574.89 null] +>> endobj +7016 0 obj << +/D [7009 0 R /XYZ 71.731 543.3084 null] +>> endobj +7017 0 obj << +/D [7009 0 R /XYZ 181.5683 532.2981 null] +>> endobj +7018 0 obj << +/D [7009 0 R /XYZ 71.731 522.236 null] +>> endobj +7019 0 obj << +/D [7009 0 R /XYZ 71.731 488.8128 null] +>> endobj +7020 0 obj << +/D [7009 0 R /XYZ 71.731 477.703 null] +>> endobj +7021 0 obj << +/D [7009 0 R /XYZ 71.731 476.4576 null] +>> endobj +7022 0 obj << +/D [7009 0 R /XYZ 129.5143 457.3791 null] +>> endobj +7023 0 obj << +/D [7009 0 R /XYZ 129.5143 457.3791 null] +>> endobj +7024 0 obj << +/D [7009 0 R /XYZ 71.731 455.9395 null] +>> endobj +7025 0 obj << +/D [7009 0 R /XYZ 71.731 455.9395 null] +>> endobj +7026 0 obj << +/D [7009 0 R /XYZ 139.477 439.4463 null] +>> endobj +7027 0 obj << +/D [7009 0 R /XYZ 139.477 439.4463 null] +>> endobj +7028 0 obj << +/D [7009 0 R /XYZ 76.7123 421.5136 null] +>> endobj +7029 0 obj << +/D [7009 0 R /XYZ 129.5143 403.5808 null] +>> endobj +7030 0 obj << +/D [7009 0 R /XYZ 129.5143 403.5808 null] +>> endobj +7031 0 obj << +/D [7009 0 R /XYZ 71.731 401.424 null] +>> endobj +7032 0 obj << +/D [7009 0 R /XYZ 71.731 401.424 null] +>> endobj +7033 0 obj << +/D [7009 0 R /XYZ 139.477 385.6481 null] +>> endobj +7034 0 obj << +/D [7009 0 R /XYZ 71.731 384.2085 null] +>> endobj +7035 0 obj << +/D [7009 0 R /XYZ 139.477 367.7153 null] +>> endobj +7036 0 obj << +/D [7009 0 R /XYZ 76.7123 349.7826 null] +>> endobj +7037 0 obj << +/D [7009 0 R /XYZ 129.5143 331.8498 null] +>> endobj +7038 0 obj << +/D [7009 0 R /XYZ 129.5143 331.8498 null] +>> endobj +7039 0 obj << +/D [7009 0 R /XYZ 71.731 329.693 null] +>> endobj +7040 0 obj << +/D [7009 0 R /XYZ 71.731 329.693 null] +>> endobj +7041 0 obj << +/D [7009 0 R /XYZ 139.477 313.9171 null] +>> endobj +7042 0 obj << +/D [7009 0 R /XYZ 71.731 312.4775 null] +>> endobj +7043 0 obj << +/D [7009 0 R /XYZ 139.477 295.9843 null] +>> endobj +7044 0 obj << +/D [7009 0 R /XYZ 71.731 258.1263 null] +>> endobj +7045 0 obj << +/D [7009 0 R /XYZ 71.731 245.0753 null] +>> endobj +7046 0 obj << +/D [7009 0 R /XYZ 71.731 243.83 null] +>> endobj +7047 0 obj << +/D [7009 0 R /XYZ 129.5143 224.7515 null] +>> endobj +893 0 obj << +/D [7009 0 R /XYZ 71.731 218.3306 null] +>> endobj +426 0 obj << +/D [7009 0 R /XYZ 241.8522 174.5158 null] +>> endobj +7048 0 obj << +/D [7009 0 R /XYZ 71.731 151.027 null] +>> endobj +7049 0 obj << +/D [7009 0 R /XYZ 161.0655 141.6391 null] +>> endobj +7050 0 obj << +/D [7009 0 R /XYZ 71.731 129.5196 null] +>> endobj +7008 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7053 0 obj << +/Length 1178 +/Filter /FlateDecode +>> +stream +xÚ­X]œ6}ß_Á㌴¸þÀØìÛ6ýPªVZ%Ó§l´¢àÉ"10&Ûý÷½ÃÆ|¨ŠòÎõ9>÷úŽmâaøG7ªÚû”ãEÝó) ÕüÿÓýùøô±{ùK5¯eZï¿þ¸ûõ0ðs&P$dQ䀺•I#K&!âœO`‰XÀD«óU'Uvn²²xÐüm„ 0ÐA&Üg0ž萿Ïiܨº“Þ¼ªîåWñIÁ”͇òØ=ã¢{ª=ỳºÉŠoæKšVª6ð·¬yŒø}Où.Î/=UVŒâ^ž1¦*Ok¤uƒ>#ˆK¶"Ÿ>š¨Sün¹y»´ ¦&ªADf’Wjo†»Î`æ! QÈDGøI5—ª0ã،V_’HŽ—ü¾ûãžõ%ozZà«Þ²Z¡!×ÄùC ¾DØåí1Ï;a*í†øTæª^J!%($²Kaœž²Âh9g[9Ÿt +‡4?LËu(0N8!œå: |֗+”²ÀdT®LKx¦”ßðR +õL¨“wú¼êè£nu0iÙG`Qq°±Žøåzk Ö ò`rßT—¤¹Ÿ¬x¯Š&Kb½òlä¥R·4‚H É #9íQ¾ »Kt+³'4Àf…äcDNÞycû¨[ccY„!Æ2Á—®:Üå°Üh´S¡£ôþ:l=uÃu˺4 V³Õ„aU/W¯ [¨Þ¶Z½.Þ Õ{£Ã]½#}Íæ]æc—³b(a»kg©v»mÄÕ¼¡¬ +¬µ¶dh[7ÔÁ»ÅЩŽCm½¡ÇLÿ 9LPãXRWk˜_í4DÓÕÕnÁ–V{[_íÞ-«}ªÃ½ÚmIÖ¼»»¨àYXçL Û7Øߐ0 +Ö|³`K¾õ°uß¼[|›êpûfËHÊKÑT.ëŒdÄÂ%ë®±N÷X„ea¸âž [po€­ºçâÝàލ§{#yV(æ*»1‰¥Ÿ»÷éaº76o¦€®‚Y´f¦[2³‡­›éàÝbæT‡ÛL[†vþH3鼙<@Lµ~hÖÌìaëf:x·˜9Õá6Ӗ¡] ?ÒL2o&œè&ך¤ [2³‡­›éàÝbæT‡ÛL[FÝèCÞÿ1ós3Ksü|ϊd~{ΈDóÕÖiÁ–<íaëž:x·x:ÕáöԖq.ÁÕ<)SåÞ8R)傱Omx÷ÞâùâH o2àÇ GÜ>NÏ2i T¬ì*mØ®r€­î*]¼v•.ÖÝLŸô‘Žë¦{ö>Á¤ôAámæ|.€Uk(e&u¶]XßC inpS} ÑöÃ>Ä»÷³+« HR,&7Uٔ l½pè ›ìØÚÉ> endobj +7054 0 obj << +/D [7052 0 R /XYZ 71.731 729.2652 null] +>> endobj +7055 0 obj << +/D [7052 0 R /XYZ 71.731 741.2204 null] +>> endobj +7056 0 obj << +/D [7052 0 R /XYZ 71.731 718.3063 null] +>> endobj +7057 0 obj << +/D [7052 0 R /XYZ 168.8063 708.3437 null] +>> endobj +7058 0 obj << +/D [7052 0 R /XYZ 71.731 681.2803 null] +>> endobj +7059 0 obj << +/D [7052 0 R /XYZ 71.731 649.9144 null] +>> endobj +7060 0 obj << +/D [7052 0 R /XYZ 71.731 633.2768 null] +>> endobj +7061 0 obj << +/D [7052 0 R /XYZ 71.731 602.3408 null] +>> endobj +7062 0 obj << +/D [7052 0 R /XYZ 181.5683 590.6849 null] +>> endobj +7063 0 obj << +/D [7052 0 R /XYZ 71.731 580.6227 null] +>> endobj +7064 0 obj << +/D [7052 0 R /XYZ 71.731 547.1996 null] +>> endobj +7065 0 obj << +/D [7052 0 R /XYZ 71.731 536.0897 null] +>> endobj +7066 0 obj << +/D [7052 0 R /XYZ 71.731 534.8444 null] +>> endobj +7067 0 obj << +/D [7052 0 R /XYZ 129.5143 515.7659 null] +>> endobj +7068 0 obj << +/D [7052 0 R /XYZ 129.5143 515.7659 null] +>> endobj +7069 0 obj << +/D [7052 0 R /XYZ 71.731 514.3263 null] +>> endobj +7070 0 obj << +/D [7052 0 R /XYZ 71.731 514.3263 null] +>> endobj +7071 0 obj << +/D [7052 0 R /XYZ 139.477 497.8331 null] +>> endobj +7072 0 obj << +/D [7052 0 R /XYZ 139.477 497.8331 null] +>> endobj +7073 0 obj << +/D [7052 0 R /XYZ 76.7123 479.9004 null] +>> endobj +7074 0 obj << +/D [7052 0 R /XYZ 129.5143 461.9676 null] +>> endobj +7075 0 obj << +/D [7052 0 R /XYZ 129.5143 461.9676 null] +>> endobj +7076 0 obj << +/D [7052 0 R /XYZ 71.731 460.5281 null] +>> endobj +7077 0 obj << +/D [7052 0 R /XYZ 129.5143 444.0349 null] +>> endobj +7078 0 obj << +/D [7052 0 R /XYZ 129.5143 444.0349 null] +>> endobj +7079 0 obj << +/D [7052 0 R /XYZ 71.731 442.8558 null] +>> endobj +7080 0 obj << +/D [7052 0 R /XYZ 71.731 442.8558 null] +>> endobj +7081 0 obj << +/D [7052 0 R /XYZ 139.477 426.1021 null] +>> endobj +7082 0 obj << +/D [7052 0 R /XYZ 139.477 426.1021 null] +>> endobj +7083 0 obj << +/D [7052 0 R /XYZ 71.731 423.9453 null] +>> endobj +7084 0 obj << +/D [7052 0 R /XYZ 139.477 408.1694 null] +>> endobj +7085 0 obj << +/D [7052 0 R /XYZ 139.477 408.1694 null] +>> endobj +7086 0 obj << +/D [7052 0 R /XYZ 71.731 406.0125 null] +>> endobj +7087 0 obj << +/D [7052 0 R /XYZ 139.477 390.2366 null] +>> endobj +7088 0 obj << +/D [7052 0 R /XYZ 139.477 390.2366 null] +>> endobj +7089 0 obj << +/D [7052 0 R /XYZ 71.731 388.0798 null] +>> endobj +7090 0 obj << +/D [7052 0 R /XYZ 139.477 372.3039 null] +>> endobj +7091 0 obj << +/D [7052 0 R /XYZ 139.477 372.3039 null] +>> endobj +7092 0 obj << +/D [7052 0 R /XYZ 71.731 370.147 null] +>> endobj +7093 0 obj << +/D [7052 0 R /XYZ 139.477 354.3711 null] +>> endobj +7094 0 obj << +/D [7052 0 R /XYZ 139.477 354.3711 null] +>> endobj +7095 0 obj << +/D [7052 0 R /XYZ 71.731 352.2143 null] +>> endobj +7096 0 obj << +/D [7052 0 R /XYZ 139.477 336.4384 null] +>> endobj +7097 0 obj << +/D [7052 0 R /XYZ 139.477 336.4384 null] +>> endobj +7098 0 obj << +/D [7052 0 R /XYZ 71.731 334.2815 null] +>> endobj +7099 0 obj << +/D [7052 0 R /XYZ 139.477 318.5056 null] +>> endobj +7100 0 obj << +/D [7052 0 R /XYZ 139.477 318.5056 null] +>> endobj +7101 0 obj << +/D [7052 0 R /XYZ 71.731 280.6476 null] +>> endobj +7102 0 obj << +/D [7052 0 R /XYZ 71.731 267.5966 null] +>> endobj +7103 0 obj << +/D [7052 0 R /XYZ 71.731 266.3513 null] +>> endobj +7104 0 obj << +/D [7052 0 R /XYZ 129.5143 247.2727 null] +>> endobj +894 0 obj << +/D [7052 0 R /XYZ 71.731 240.8519 null] +>> endobj +430 0 obj << +/D [7052 0 R /XYZ 290.5716 197.0371 null] +>> endobj +7105 0 obj << +/D [7052 0 R /XYZ 71.731 173.5483 null] +>> endobj +7106 0 obj << +/D [7052 0 R /XYZ 161.0655 164.1604 null] +>> endobj +7107 0 obj << +/D [7052 0 R /XYZ 71.731 152.0409 null] +>> endobj +7108 0 obj << +/D [7052 0 R /XYZ 71.731 120.675 null] +>> endobj +7109 0 obj << +/D [7052 0 R /XYZ 168.8063 109.6647 null] +>> endobj +7051 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7112 0 obj << +/Length 1077 +/Filter /FlateDecode +>> +stream +xÚÍXM¤6½Ï¯à8--Ž?±™Ûd“%ÊhÕ{ʬFÜÓH ´øÈdÿ}l°izoÑÌ4åªççWe(€êNԀc€#†ƒôí¯êÕ/wȘ„Æ&t~<Þýð‰À q„£àx +HÆiÀ ‚!³¿î?ž“K+ëCˆ¼Ç`ŸŠ¤”íïÉßÿO¿Èö\eÍáëñ·»Ÿc|F8ˆ… +² r´ZÂÄq ̈j˜H½eˆ’€C%¼Çùå’%­líY—¤NÞ¤Âo^T§aLÊa”Äîÿ͛6/_͛,«ecý|»Gïy{žùþç€Ù}Rt6h^N<¼èÉ/ÏbYd М¨u†(áQù³l»º4ӑñb6]š*/§®ø0üp: å»+Z»¤~ÏÙ»î9ºnehC½•<(z,ŠJc~—ÙàâsUÈæaœ~¥ØÎÆDHÄýì${S+¼1ԓæuäþa.„Ô2Ä&ˆ$^AŒV¡kf¡ÄÂ!ê±ð¦!^qØYKDø„9Á‘tJ9KÚ0PGÐ&fËÛºKÛ³œÒóeÙæiÒæUéZvµ\.ÐBˆ˜âGéÌK¬µ +]³+±H‹É‚¬Ù*±jó!¦±7î:±vÖǔXÊùÆ£âe¨7v™Ê2ªJٜ_•æ–_­oƒ»!Í«aì¹®^Bí©×1ÛR¯5ÛW¯'î-êãXQ¯‹cRÌò쥪_J•ÕÊŽVU{Êy^¶¦\Õî&¬ëa%¿˜ìéÖ1ÛÒ­5Û×­'î-ºõàp(±ºua(F¬ýGMži]öG½Ê)À4ÚËo×lƒ§Ñl—'_ÜxòáXò41ÍÖUk9I™º´—“®ÙFNŽf»9é‹{CN.pøsr‚c’“§\_/|ù)àß³.+ +¥b/ý\³-YY³}YyâÞ"«9ï±1±R½ôq ãxëÀؕà¸lµ» ±ÝÜt̶H´fû$zâÞB⇟DF&›´Î/ýɹä2R·ÆHðïⲚ¹ B‹©*³3÷Ò¼~§$ ,0ß©®ÙFÍv+€/î À‡Ã=U &8®gÈj×`öEáã#ÖïeÈ8à‚žPLÌfª³ "ÝØqaº¨Uyú”¾<¡ ùì¶_Wm¥·q·—ˆ^mŒÒ#† ê«®YWª^öÍS¡¯žmc¥æ¡[»’Ÿ®úÚBJTáxÙV&ÃPV™i¯]íÜ"€¦Sþ³,¾ÍúF‹ÜìØE¦ÃaŸMÛHßb ŒÚxêzp–¤(œÎÐ+†¾ U»Á¢¡$òd.i]ÙV]z–Ùÿ¼]uóÏ|Û śŸ?›å׆ €DD£'!ºú1Ãñ?¨kendstream +endobj +7111 0 obj << +/Type /Page +/Contents 7112 0 R +/Resources 7110 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +7113 0 obj << +/D [7111 0 R /XYZ 71.731 729.2652 null] +>> endobj +7114 0 obj << +/D [7111 0 R /XYZ 71.731 741.2204 null] +>> endobj +7115 0 obj << +/D [7111 0 R /XYZ 71.731 718.3063 null] +>> endobj +7116 0 obj << +/D [7111 0 R /XYZ 71.731 670.4852 null] +>> endobj +7117 0 obj << +/D [7111 0 R /XYZ 181.5683 658.8294 null] +>> endobj +7118 0 obj << +/D [7111 0 R /XYZ 71.731 648.7672 null] +>> endobj +7119 0 obj << +/D [7111 0 R /XYZ 71.731 617.1956 null] +>> endobj +7120 0 obj << +/D [7111 0 R /XYZ 71.731 604.2342 null] +>> endobj +7121 0 obj << +/D [7111 0 R /XYZ 71.731 602.9889 null] +>> endobj +7122 0 obj << +/D [7111 0 R /XYZ 129.5143 583.9103 null] +>> endobj +7123 0 obj << +/D [7111 0 R /XYZ 129.5143 583.9103 null] +>> endobj +7124 0 obj << +/D [7111 0 R /XYZ 71.731 582.4708 null] +>> endobj +7125 0 obj << +/D [7111 0 R /XYZ 71.731 582.4708 null] +>> endobj +7126 0 obj << +/D [7111 0 R /XYZ 139.477 565.9776 null] +>> endobj +7127 0 obj << +/D [7111 0 R /XYZ 139.477 565.9776 null] +>> endobj +7128 0 obj << +/D [7111 0 R /XYZ 76.7123 548.0448 null] +>> endobj +7129 0 obj << +/D [7111 0 R /XYZ 129.5143 530.1121 null] +>> endobj +7130 0 obj << +/D [7111 0 R /XYZ 129.5143 530.1121 null] +>> endobj +7131 0 obj << +/D [7111 0 R /XYZ 71.731 527.9552 null] +>> endobj +7132 0 obj << +/D [7111 0 R /XYZ 71.731 527.9552 null] +>> endobj +7133 0 obj << +/D [7111 0 R /XYZ 139.477 512.1793 null] +>> endobj +7134 0 obj << +/D [7111 0 R /XYZ 71.731 510.0225 null] +>> endobj +7135 0 obj << +/D [7111 0 R /XYZ 139.477 494.2466 null] +>> endobj +7136 0 obj << +/D [7111 0 R /XYZ 76.7123 476.3138 null] +>> endobj +7137 0 obj << +/D [7111 0 R /XYZ 129.5143 458.3811 null] +>> endobj +7138 0 obj << +/D [7111 0 R /XYZ 129.5143 458.3811 null] +>> endobj +7139 0 obj << +/D [7111 0 R /XYZ 71.731 457.0003 null] +>> endobj +7140 0 obj << +/D [7111 0 R /XYZ 71.731 457.0003 null] +>> endobj +7141 0 obj << +/D [7111 0 R /XYZ 139.477 440.4483 null] +>> endobj +7142 0 obj << +/D [7111 0 R /XYZ 139.477 440.4483 null] +>> endobj +7143 0 obj << +/D [7111 0 R /XYZ 71.731 438.2915 null] +>> endobj +7144 0 obj << +/D [7111 0 R /XYZ 139.477 422.5156 null] +>> endobj +7145 0 obj << +/D [7111 0 R /XYZ 139.477 422.5156 null] +>> endobj +7146 0 obj << +/D [7111 0 R /XYZ 71.731 384.6575 null] +>> endobj +7147 0 obj << +/D [7111 0 R /XYZ 71.731 371.6066 null] +>> endobj +7148 0 obj << +/D [7111 0 R /XYZ 71.731 370.3612 null] +>> endobj +7149 0 obj << +/D [7111 0 R /XYZ 129.5143 351.2827 null] +>> endobj +895 0 obj << +/D [7111 0 R /XYZ 71.731 344.8618 null] +>> endobj +434 0 obj << +/D [7111 0 R /XYZ 251.5788 301.0471 null] +>> endobj +7150 0 obj << +/D [7111 0 R /XYZ 71.731 277.5583 null] +>> endobj +7151 0 obj << +/D [7111 0 R /XYZ 161.0655 268.1703 null] +>> endobj +7152 0 obj << +/D [7111 0 R /XYZ 71.731 256.0509 null] +>> endobj +7153 0 obj << +/D [7111 0 R /XYZ 71.731 224.685 null] +>> endobj +7154 0 obj << +/D [7111 0 R /XYZ 168.8063 213.6747 null] +>> endobj +7155 0 obj << +/D [7111 0 R /XYZ 71.731 186.6113 null] +>> endobj +7156 0 obj << +/D [7111 0 R /XYZ 71.731 160.3846 null] +>> endobj +7157 0 obj << +/D [7111 0 R /XYZ 71.731 127.5971 null] +>> endobj +7158 0 obj << +/D [7111 0 R /XYZ 181.5683 115.9412 null] +>> endobj +7110 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7161 0 obj << +/Length 1489 +/Filter /FlateDecode +>> +stream +xÚ­Y[›8}Ÿ_Á㌴ñú‚±é[·{Q÷¦ª;û´]â$h D\:;ÿ¾6ØÄcS©)aȁïøœÏŸ? Š üCC€ù…S€Š£ü|££üé—;¤!;ÙÙ ï¾ÿ™À(i‚“èñ‘4”Å#pŠxô¸ÿçþÝ)»t¢yØa +ï1¿?”Y%ºß³çñß·ޏˆîTïۇ½ûéqŠO )—A¼$'Ԓ&N#.i&±¢‰ä¯Å$b6ðÌöç¢RôuP;}¸SƒbÉþð€è}Ödg!‡Ö¾™óEHF ˆE ¥Æ$qòP;føʱ0ˆ¾‹») +Ÿ0¦‹¸Ë!ìŒ;ÿ¾ò0W-yîÒí†GÖw'‡l8PEP7£¹m×ôy÷ÝÌru½¨º"Ϻ¢®ld߈å é5B»…5¨ » +‹T.ß ÈÀV…•æC§Î¸ëš«–¢ üLjÎMw•ŒÕ*@ +KCUÀ†yªÀ VWÜ U`ÁÃYnh šÕ/՘>Ž*€Pâ©ù©~ÀôþE¦)…H~ ñ¼>ëHÊIŒX¦~,S? ­óIk`aiq·H;çá–Ö¦q©Û®¨Ú.+˧üìšý2ƒiœP¾DYj©ëó9«fÕU¨>áõ!ò¾ÓE!;LýŽ/o¸n„9aÁ|F˜ƒ°Ž¸[Œ˜ópaÓMS7+PY«–|k Šƒ¶¢R?¼j¤â¡çGž÷M»î B€r”„<±`>O ,ì‰#îOæ<ܞØ4.ðÏ ÆJd7ü¹4…ñÀà6̑8%²â¡uÀ†yü˜`A?\q7ø±àáôã†Æ^´ÝJ— ÓÔ×>·uy•7“ÍúpôrX6,í©îKmÔ³¸1@ì×õg°àt°P>õ5*,þ2èíg$ÜÒ[ŠcU7B͂§¡@¸zéTÏ«Ôs]—"«´ïG—Šëôò€ä±©Djyþw ,l#îæ<ÜÙ4D•=ëìœùC@!K}¾„[øV+ŸwÅՖu¹%CN! ÉmÁ|rXXnGÜ-rÏy¸å¶i -éE4ç¢m¥b_ÓËۍé¹ÞϚÒÙ=ÝòbRĂ•Þ‚ùä5°°¼Ž¸[äópËkÓhë¾É…CT–¤¾Vè£(³›$Õ|“ÞÝILS¡Ó÷ÍxMã]rSÌÚ°×Oeí} ”’'Åå3M£Âž-ƒn±lFÂí˜Å!+_²×ö©¿ì³Îåà ƜøŠÐÛRU½˜zÓuâ|霽ÐҘõ£¯òSV=æžHqh…°a{&XÐWÜ -x8º¡1”¬cS÷÷S4!Äÿ}l.¾'èhÇ€)W½6¦cf|]ßTžía‚bÀQv~l˜gçg‚w~\q7ìü¸x\u¼f€ÍãºY†nó²íó\´í¡/µ'’ÑÁƝYà• ˜Ð±ÃÁáã÷óí·±Ð qŽõŸŽ!›íÝ7uWw¯ñfºâš>f³_VäI?Õ&ž"ééG¡Ú¼ÖÃûOÍÞñ÷§bï89ì–ûvÈ¡ï~mÞՙøؒD®·ØfÛÎ*ýezY¡ÓwÞOc…Ú9.¨ë%¡0ëÈt×ÏJ“¬ìM¸¢Z6& +TYt}Ìü³®vË}ƒ³é€ëªÔGº®šÀEs3ÿñÆ8vÖëwW1—I™¤Þ×[fùvKeY™î¤€]}YåˆøGŽ<÷endstream +endobj +7160 0 obj << +/Type /Page +/Contents 7161 0 R +/Resources 7159 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 6963 0 R +>> endobj +7162 0 obj << +/D [7160 0 R /XYZ 71.731 729.2652 null] +>> endobj +7163 0 obj << +/D [7160 0 R /XYZ 71.731 741.2204 null] +>> endobj +7164 0 obj << +/D [7160 0 R /XYZ 71.731 718.3063 null] +>> endobj +7165 0 obj << +/D [7160 0 R /XYZ 71.731 675.3674 null] +>> endobj +7166 0 obj << +/D [7160 0 R /XYZ 71.731 674.1221 null] +>> endobj +7167 0 obj << +/D [7160 0 R /XYZ 129.5143 655.0436 null] +>> endobj +7168 0 obj << +/D [7160 0 R /XYZ 129.5143 655.0436 null] +>> endobj +7169 0 obj << +/D [7160 0 R /XYZ 71.731 653.604 null] +>> endobj +7170 0 obj << +/D [7160 0 R /XYZ 71.731 653.604 null] +>> endobj +7171 0 obj << +/D [7160 0 R /XYZ 139.477 637.1108 null] +>> endobj +7172 0 obj << +/D [7160 0 R /XYZ 139.477 637.1108 null] +>> endobj +7173 0 obj << +/D [7160 0 R /XYZ 76.7123 619.1781 null] +>> endobj +7174 0 obj << +/D [7160 0 R /XYZ 129.5143 601.2453 null] +>> endobj +7175 0 obj << +/D [7160 0 R /XYZ 129.5143 601.2453 null] +>> endobj +7176 0 obj << +/D [7160 0 R /XYZ 71.731 599.0885 null] +>> endobj +7177 0 obj << +/D [7160 0 R /XYZ 129.5143 583.3126 null] +>> endobj +7178 0 obj << +/D [7160 0 R /XYZ 129.5143 583.3126 null] +>> endobj +7179 0 obj << +/D [7160 0 R /XYZ 71.731 582.1335 null] +>> endobj +7180 0 obj << +/D [7160 0 R /XYZ 71.731 582.1335 null] +>> endobj +7181 0 obj << +/D [7160 0 R /XYZ 139.477 565.3798 null] +>> endobj +7182 0 obj << +/D [7160 0 R /XYZ 139.477 565.3798 null] +>> endobj +7183 0 obj << +/D [7160 0 R /XYZ 71.731 563.223 null] +>> endobj +7184 0 obj << +/D [7160 0 R /XYZ 139.477 547.4471 null] +>> endobj +7185 0 obj << +/D [7160 0 R /XYZ 139.477 547.4471 null] +>> endobj +7186 0 obj << +/D [7160 0 R /XYZ 71.731 545.2902 null] +>> endobj +7187 0 obj << +/D [7160 0 R /XYZ 139.477 529.5143 null] +>> endobj +7188 0 obj << +/D [7160 0 R /XYZ 139.477 529.5143 null] +>> endobj +7189 0 obj << +/D [7160 0 R /XYZ 71.731 527.3575 null] +>> endobj +7190 0 obj << +/D [7160 0 R /XYZ 139.477 511.5816 null] +>> endobj +7191 0 obj << +/D [7160 0 R /XYZ 139.477 511.5816 null] +>> endobj +7192 0 obj << +/D [7160 0 R /XYZ 71.731 509.4247 null] +>> endobj +7193 0 obj << +/D [7160 0 R /XYZ 139.477 493.6488 null] +>> endobj +7194 0 obj << +/D [7160 0 R /XYZ 139.477 493.6488 null] +>> endobj +7195 0 obj << +/D [7160 0 R /XYZ 71.731 491.492 null] +>> endobj +7196 0 obj << +/D [7160 0 R /XYZ 139.477 475.716 null] +>> endobj +7197 0 obj << +/D [7160 0 R /XYZ 139.477 475.716 null] +>> endobj +7198 0 obj << +/D [7160 0 R /XYZ 71.731 473.5592 null] +>> endobj +7199 0 obj << +/D [7160 0 R /XYZ 139.477 457.7833 null] +>> endobj +7200 0 obj << +/D [7160 0 R /XYZ 139.477 457.7833 null] +>> endobj +7201 0 obj << +/D [7160 0 R /XYZ 71.731 455.6265 null] +>> endobj +7202 0 obj << +/D [7160 0 R /XYZ 139.477 439.8505 null] +>> endobj +7203 0 obj << +/D [7160 0 R /XYZ 139.477 439.8505 null] +>> endobj +7204 0 obj << +/D [7160 0 R /XYZ 71.731 437.6937 null] +>> endobj +7205 0 obj << +/D [7160 0 R /XYZ 139.477 421.9178 null] +>> endobj +7206 0 obj << +/D [7160 0 R /XYZ 139.477 421.9178 null] +>> endobj +7207 0 obj << +/D [7160 0 R /XYZ 71.731 419.761 null] +>> endobj +7208 0 obj << +/D [7160 0 R /XYZ 139.477 403.985 null] +>> endobj +7209 0 obj << +/D [7160 0 R /XYZ 139.477 403.985 null] +>> endobj +7210 0 obj << +/D [7160 0 R /XYZ 71.731 401.8282 null] +>> endobj +7211 0 obj << +/D [7160 0 R /XYZ 139.477 386.0523 null] +>> endobj +7212 0 obj << +/D [7160 0 R /XYZ 139.477 386.0523 null] +>> endobj +7213 0 obj << +/D [7160 0 R /XYZ 71.731 348.1943 null] +>> endobj +7214 0 obj << +/D [7160 0 R /XYZ 71.731 335.1433 null] +>> endobj +7215 0 obj << +/D [7160 0 R /XYZ 71.731 333.898 null] +>> endobj +7216 0 obj << +/D [7160 0 R /XYZ 129.5143 314.8194 null] +>> endobj +896 0 obj << +/D [7160 0 R /XYZ 71.731 308.3985 null] +>> endobj +438 0 obj << +/D [7160 0 R /XYZ 213.7744 264.5838 null] +>> endobj +7217 0 obj << +/D [7160 0 R /XYZ 71.731 241.095 null] +>> endobj +7218 0 obj << +/D [7160 0 R /XYZ 161.0655 231.7071 null] +>> endobj +7219 0 obj << +/D [7160 0 R /XYZ 71.731 219.5876 null] +>> endobj +7220 0 obj << +/D [7160 0 R /XYZ 71.731 188.2217 null] +>> endobj +7221 0 obj << +/D [7160 0 R /XYZ 168.8063 177.2114 null] +>> endobj +7222 0 obj << +/D [7160 0 R /XYZ 71.731 150.148 null] +>> endobj +7223 0 obj << +/D [7160 0 R /XYZ 71.731 118.7821 null] +>> endobj +7159 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7226 0 obj << +/Length 999 +/Filter /FlateDecode +>> +stream +xÚÕXY«6}Ÿ_Ác" ®WlîÛtU—+®rŸ:UEg‚Jètþ}?cCL0K¥JWÕHIþÇßr€DþH$ ’ 4E44Úpô +?ýð@$v˜Ø}½yøê{†£¥ M¢Í>bi‚„ä‘d)AT´Ùýºúæ]*}]ÇTàEöø\d']ý’ýa?>=ÿhO>êêpޕëß6?=|·éâ &Qª È$É5¤IÓḦ́š~„³Hb…g²áùIWõõTZÄò½=–õv«Ër_ö‹ýšàUV•ÃŸ«ƒ¾¾å¥F†zï&KìNc#‹Ll¸§¢8¯©X½é]âÓ¹Ðå‡îòÝöjJPBTÚ\íŽùÉq¹äî¤Òۃ;­KP|!“ç5«ìš5l“eàkO¨%ˆŒŒ‘à2 jß¡bÖjû"1i´¬f(¼P*q)…Í!4÷þxãÑ^5äÁT(z<²º:d£aÁ@>¸Œ¨®õ¶z¼K_s½>Uù6«òóÉGÖW=¼AGA( +;;’Ô*öa7a‰©Kÿ†:ب°°ù˜ò4w\Øöª!¾°,E\Ê>'ÐŖv@]‘ „C׸×7?½¶úd=Úål⟻¬Í^Á$y*g²×‡Mdo›ÍÞPÜÙ;àÎޏ?õûïyHa&¡ŠöÎOmúþlú6]àÝý´3j¿`Lm JR$™k>lJÐ6/h îAïyŒêó0‚îs]؁4L[ª ÚÂx¥Œ”ⳕîÁ¦*½…ÍWz î’J¿ç®tŸ†‘¬z¿è€`\ AS:QçƒDlW +ŠÉSŠR8›ӇMˆÙÁfÅ Å] æ€GPÌ 3 #” “Àø_èø—ù"+êFL˜þàŽÒl€€Ã)÷ýÏøüç`@$Qb¦à}ØDÁw°Ù‚Å]Pð!žˆÝ¾û> endobj +7227 0 obj << +/D [7225 0 R /XYZ 71.731 729.2652 null] +>> endobj +7228 0 obj << +/D [7225 0 R /XYZ 71.731 718.3063 null] +>> endobj +7229 0 obj << +/D [7225 0 R /XYZ 71.731 631.9816 null] +>> endobj +7230 0 obj << +/D [7225 0 R /XYZ 71.731 620.8718 null] +>> endobj +7231 0 obj << +/D [7225 0 R /XYZ 71.731 619.6265 null] +>> endobj +7232 0 obj << +/D [7225 0 R /XYZ 129.5143 600.5479 null] +>> endobj +7233 0 obj << +/D [7225 0 R /XYZ 129.5143 600.5479 null] +>> endobj +7234 0 obj << +/D [7225 0 R /XYZ 71.731 599.1084 null] +>> endobj +7235 0 obj << +/D [7225 0 R /XYZ 71.731 599.1084 null] +>> endobj +7236 0 obj << +/D [7225 0 R /XYZ 139.477 582.6152 null] +>> endobj +7237 0 obj << +/D [7225 0 R /XYZ 139.477 582.6152 null] +>> endobj +7238 0 obj << +/D [7225 0 R /XYZ 76.7123 564.6824 null] +>> endobj +7239 0 obj << +/D [7225 0 R /XYZ 129.5143 546.7497 null] +>> endobj +7240 0 obj << +/D [7225 0 R /XYZ 129.5143 546.7497 null] +>> endobj +7241 0 obj << +/D [7225 0 R /XYZ 71.731 544.5928 null] +>> endobj +7242 0 obj << +/D [7225 0 R /XYZ 129.5143 528.8169 null] +>> endobj +7243 0 obj << +/D [7225 0 R /XYZ 129.5143 528.8169 null] +>> endobj +7244 0 obj << +/D [7225 0 R /XYZ 71.731 527.4362 null] +>> endobj +7245 0 obj << +/D [7225 0 R /XYZ 71.731 527.4362 null] +>> endobj +7246 0 obj << +/D [7225 0 R /XYZ 139.477 510.8842 null] +>> endobj +7247 0 obj << +/D [7225 0 R /XYZ 139.477 510.8842 null] +>> endobj +7248 0 obj << +/D [7225 0 R /XYZ 71.731 508.7273 null] +>> endobj +7249 0 obj << +/D [7225 0 R /XYZ 139.477 492.9514 null] +>> endobj +7250 0 obj << +/D [7225 0 R /XYZ 139.477 492.9514 null] +>> endobj +7251 0 obj << +/D [7225 0 R /XYZ 71.731 455.0934 null] +>> endobj +7252 0 obj << +/D [7225 0 R /XYZ 71.731 442.0424 null] +>> endobj +7253 0 obj << +/D [7225 0 R /XYZ 71.731 440.7971 null] +>> endobj +7254 0 obj << +/D [7225 0 R /XYZ 129.5143 421.7185 null] +>> endobj +897 0 obj << +/D [7225 0 R /XYZ 71.731 415.2977 null] +>> endobj +442 0 obj << +/D [7225 0 R /XYZ 255.435 371.4829 null] +>> endobj +7255 0 obj << +/D [7225 0 R /XYZ 71.731 347.7274 null] +>> endobj +7256 0 obj << +/D [7225 0 R /XYZ 161.0655 338.6062 null] +>> endobj +7257 0 obj << +/D [7225 0 R /XYZ 71.731 326.4867 null] +>> endobj +7258 0 obj << +/D [7225 0 R /XYZ 71.731 295.1209 null] +>> endobj +7259 0 obj << +/D [7225 0 R /XYZ 168.8063 284.1106 null] +>> endobj +7260 0 obj << +/D [7225 0 R /XYZ 71.731 257.0471 null] +>> endobj +7261 0 obj << +/D [7225 0 R /XYZ 71.731 240.6252 null] +>> endobj +7262 0 obj << +/D [7225 0 R /XYZ 71.731 209.6892 null] +>> endobj +7263 0 obj << +/D [7225 0 R /XYZ 181.5683 198.0334 null] +>> endobj +7264 0 obj << +/D [7225 0 R /XYZ 71.731 187.9712 null] +>> endobj +7265 0 obj << +/D [7225 0 R /XYZ 71.731 156.3996 null] +>> endobj +7266 0 obj << +/D [7225 0 R /XYZ 71.731 143.4382 null] +>> endobj +7267 0 obj << +/D [7225 0 R /XYZ 71.731 142.1929 null] +>> endobj +7268 0 obj << +/D [7225 0 R /XYZ 129.5143 123.1143 null] +>> endobj +7269 0 obj << +/D [7225 0 R /XYZ 129.5143 123.1143 null] +>> endobj +7270 0 obj << +/D [7225 0 R /XYZ 71.731 121.6748 null] +>> endobj +7271 0 obj << +/D [7225 0 R /XYZ 71.731 121.6748 null] +>> endobj +7272 0 obj << +/D [7225 0 R /XYZ 139.477 105.1816 null] +>> endobj +7273 0 obj << +/D [7225 0 R /XYZ 139.477 105.1816 null] +>> endobj +7224 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7277 0 obj << +/Length 1138 +/Filter /FlateDecode +>> +stream +xڕXێ£F}Ÿ¯àі–N_i˜·Ém•(YVÞ§L4bìö ‹‹VùûW7¸ Yù[>t>uª«€y>Ìӌh(î/Ô{‡¿>?°â÷ßý|xøéwA½ˆD¼ÃÙQ@”–žœ„Š…ÞáôÏøZ™bïsEwœt×ç4ÎLõWüÖý|zþ£ûò·©>òS¹ÿ÷ðçÃo‡1¾šD!Y%)YH¤ ‘ç‹âK¢‹ˆRL{~Q"à‡Íðȃ8š²f3#n„5»yá\ÍÙ1ΉŒ{ö‚CÜùõÆc¸ëž‡½D d˶¬lfÂãbÊ2~7¯É©aÓR¿åA$ZAœúØI[VE’½tnoï~$'“UÉ ¥Ò4ßÛ¨‚æDꐻ4µ`kš0·¦HÜ-šÎy,hjó4='&í<8ÓUkRÏu­Õ=ÿ!‚’DI%qÝ”oÃnº±¦è&|Ø¢nPz”ˍ»¬Ûp×=©n"¹ô”†Éâ·Ô`>””(ª£©^oyžš8CXvWkE\Sg\»4µ`kš0·¦HÜ-šÎyàšÚ4*s¹¦qe0QQ<â[‹Û^©I/´)ÏW¬©v¯¦ª‹¬|\¬}· …ŽÚ·a+µ?œµÅÝPû›~cÞ'<’¬êÕc½Ͻ²õñzžë´Ïðӄ3Õ&ÏWšèPˆVP.TÐ.Æ £²ét:Ü}»ž@ý/ùÉ|.öœîòúŠ%NNAæsê 3Ás‘WyõßÕ<ŽwÜlÓßës® »¦`Çjâ´x¡ŠÆuõÑo/ƒ÷LíÞ´×¼xÍâ‹Aÿn{œ…°CXû ›õ¯¦<ɵJòl7¸]ÜæÝÜ]ŽuYå‹Tû­¥EZ/SH9TŒÐmbGû]ž÷ ÕiÕãóêÃߓҐ­»|JÓ|ÏÕî;Sí_áT+·&*>]’lk¨ç&q9‚1j¥Jy­Á‚ëUjÃVªt„9«‹»¡Jïxàz£ñ1"—„2¬+š—ÍýͬsŒ{ÚȺ0‹í†K'%íƆ­´›æl7XÜ íæŽÚn&4ž@—nô^œ&åJÃyBd½tËu=(ï®ui–ÝË8˜P»fv¶æÞæv/w‹{ç<ÜkóhŽ±ù±‹èÍ%4Ô3CCƒêϪÂÎÀ¢iY¤•2p˜Ö†­˜v„9M‹ÅÝ`ZŒ‡%IoÚ [Ëþ2ížjÆ}ÁHÏs•¶ [Si€¹UBânQ ၨdӘ**Ô`C´,™d„ËÀU–6l¥,G˜³,±¸ÊòŽ^–·²\|ð CVtøC~Œ "˜p [³Ös[ ‰»ÅZshטÐX8¿šnL£h¥_l·á¸} +³:<{»Ä´`kb0·˜HÜ-bÎyàbÚ4N·±Ñ4€á1õj:[ÔÞbÿF¯™X­¾ô³0÷ïüÔ ª¦¡Ç˜^|‡ÄûŽˆœendstream +endobj +7276 0 obj << +/Type /Page +/Contents 7277 0 R +/Resources 7275 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7278 0 obj << +/D [7276 0 R /XYZ 71.731 729.2652 null] +>> endobj +7279 0 obj << +/D [7276 0 R /XYZ 71.731 741.2204 null] +>> endobj +7280 0 obj << +/D [7276 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7281 0 obj << +/D [7276 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7282 0 obj << +/D [7276 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7283 0 obj << +/D [7276 0 R /XYZ 71.731 688.2541 null] +>> endobj +7284 0 obj << +/D [7276 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7285 0 obj << +/D [7276 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7286 0 obj << +/D [7276 0 R /XYZ 71.731 671.0974 null] +>> endobj +7287 0 obj << +/D [7276 0 R /XYZ 71.731 671.0974 null] +>> endobj +7288 0 obj << +/D [7276 0 R /XYZ 139.477 654.5454 null] +>> endobj +7289 0 obj << +/D [7276 0 R /XYZ 139.477 654.5454 null] +>> endobj +7290 0 obj << +/D [7276 0 R /XYZ 71.731 652.3886 null] +>> endobj +7291 0 obj << +/D [7276 0 R /XYZ 139.477 636.6127 null] +>> endobj +7292 0 obj << +/D [7276 0 R /XYZ 139.477 636.6127 null] +>> endobj +7293 0 obj << +/D [7276 0 R /XYZ 71.731 598.7547 null] +>> endobj +7294 0 obj << +/D [7276 0 R /XYZ 71.731 585.7037 null] +>> endobj +7295 0 obj << +/D [7276 0 R /XYZ 71.731 584.4584 null] +>> endobj +7296 0 obj << +/D [7276 0 R /XYZ 129.5143 565.3798 null] +>> endobj +898 0 obj << +/D [7276 0 R /XYZ 71.731 558.9589 null] +>> endobj +446 0 obj << +/D [7276 0 R /XYZ 277.0577 515.1442 null] +>> endobj +7297 0 obj << +/D [7276 0 R /XYZ 71.731 491.6554 null] +>> endobj +7298 0 obj << +/D [7276 0 R /XYZ 161.0655 482.2675 null] +>> endobj +7299 0 obj << +/D [7276 0 R /XYZ 71.731 470.148 null] +>> endobj +7300 0 obj << +/D [7276 0 R /XYZ 71.731 438.7821 null] +>> endobj +7301 0 obj << +/D [7276 0 R /XYZ 168.8063 427.7718 null] +>> endobj +7302 0 obj << +/D [7276 0 R /XYZ 71.731 400.7084 null] +>> endobj +7303 0 obj << +/D [7276 0 R /XYZ 71.731 384.2865 null] +>> endobj +7304 0 obj << +/D [7276 0 R /XYZ 71.731 353.3505 null] +>> endobj +7305 0 obj << +/D [7276 0 R /XYZ 181.5683 341.6946 null] +>> endobj +7306 0 obj << +/D [7276 0 R /XYZ 71.731 331.6324 null] +>> endobj +7307 0 obj << +/D [7276 0 R /XYZ 71.731 300.0608 null] +>> endobj +7308 0 obj << +/D [7276 0 R /XYZ 71.731 287.0994 null] +>> endobj +7309 0 obj << +/D [7276 0 R /XYZ 71.731 285.8541 null] +>> endobj +7310 0 obj << +/D [7276 0 R /XYZ 129.5143 266.7756 null] +>> endobj +7311 0 obj << +/D [7276 0 R /XYZ 129.5143 266.7756 null] +>> endobj +7312 0 obj << +/D [7276 0 R /XYZ 71.731 265.336 null] +>> endobj +7313 0 obj << +/D [7276 0 R /XYZ 71.731 265.336 null] +>> endobj +7314 0 obj << +/D [7276 0 R /XYZ 139.477 248.8428 null] +>> endobj +7315 0 obj << +/D [7276 0 R /XYZ 139.477 248.8428 null] +>> endobj +7316 0 obj << +/D [7276 0 R /XYZ 76.7123 230.9101 null] +>> endobj +7317 0 obj << +/D [7276 0 R /XYZ 129.5143 212.9773 null] +>> endobj +7318 0 obj << +/D [7276 0 R /XYZ 129.5143 212.9773 null] +>> endobj +7319 0 obj << +/D [7276 0 R /XYZ 71.731 210.8205 null] +>> endobj +7320 0 obj << +/D [7276 0 R /XYZ 71.731 210.8205 null] +>> endobj +7321 0 obj << +/D [7276 0 R /XYZ 139.477 195.0446 null] +>> endobj +7322 0 obj << +/D [7276 0 R /XYZ 71.731 192.8877 null] +>> endobj +7323 0 obj << +/D [7276 0 R /XYZ 139.477 177.1118 null] +>> endobj +7324 0 obj << +/D [7276 0 R /XYZ 76.7123 159.1791 null] +>> endobj +7325 0 obj << +/D [7276 0 R /XYZ 129.5143 141.2463 null] +>> endobj +7326 0 obj << +/D [7276 0 R /XYZ 129.5143 141.2463 null] +>> endobj +7327 0 obj << +/D [7276 0 R /XYZ 71.731 139.8656 null] +>> endobj +7328 0 obj << +/D [7276 0 R /XYZ 71.731 139.8656 null] +>> endobj +7329 0 obj << +/D [7276 0 R /XYZ 139.477 123.3136 null] +>> endobj +7330 0 obj << +/D [7276 0 R /XYZ 139.477 123.3136 null] +>> endobj +7331 0 obj << +/D [7276 0 R /XYZ 71.731 121.1567 null] +>> endobj +7332 0 obj << +/D [7276 0 R /XYZ 139.477 105.3808 null] +>> endobj +7333 0 obj << +/D [7276 0 R /XYZ 139.477 105.3808 null] +>> endobj +7275 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7336 0 obj << +/Length 1396 +/Filter /FlateDecode +>> +stream +xڝXÛr£8}ÏWøÑ®Šµ’@\òæ™ÙK¶v²®™ìÓfk +ƒS‹Á…Ädò÷ۀ„—ÚÊ©OŸnu7†?²ò ò¸ÐQÑU|¾Ã«WxôëQ­ÂlMЇ统~qð*D¡G½Õóqå„b¾»òŠF‚Õsò÷úã)ºH^n¶”á5EíuŸE9—D‡ößÝþ±ýñ™ËS‘ˆÍ?Ï¿ßýüÜÙgŽÂŒL’ìP·4ihÐ$$DŒåù ¹žßÐüÂeUæâahú +f a×ñ¬¦;ÔքiÓ@ËǤoZÃjÛ/”²»”"Ç%Ôjwx½òЫ¬< @ F\§Ï#Íå}Ò^Òc{Us!ŽUVӄ½€Ÿ(an½Ù–ùÈ~`DÖnFÁ¬·¬ÿº$‘äOEŸ¸|ÛP¼.ÊÕV&-×GÅ b@¾ŠÌ¾,d!ß/ü¡[À +¯±­Ön)A üÀi5~¼`†£Jž”—9`ò+æ[šŒ£ZEå’Þ_´Ôú¾¬K©ñ† +ºk¨&l¢¡v°Ù†j³» ¡ÞðpCÈ®¡öxÔ½Æ"u®-Ԑ]”Ê*ÖÝ·‡êõ<‡jÕmÄDVmyí;¨)xІÃ0´ «Q[v–Ôs^Ï! ‚©ZíŽ «WÝòè ë„Èõý>èҎŠu<¦Ð¡¾Ð?µ¾YÍ&#‹®ßg/Ñu\w.{ ØTöjØ|öZì.ÉÞ!‘ì5yè6ӎF¥!Չ§¾§ôuˆ|êæ¸Ç˶®ÅúVRG iå¸È¦#LfK„›YÃæE¶Ø]"òÇˆÈ&SäcÚ ]·B‡!r¨%¥¡ŒV0YsUÀ„MT6[lvTÖ*У¡d³½G`äºðú7^¾VX®ªl’”ЁǕô1´rÌ)iÀ¦”Ô°y%-v—(9äaWÒ¤‘Šo—2=Gå»­žúÃË]OËCE¤Ç=ÏAUUsƒÚlìðw£½<éÑTVö0Š|ì¸s0`SаùXì.‰À‡=&æ…À>)`hzã‰ü¸ï'q;2-qøôôU­çe;ܗã‚;.ò}ìÍ nÀ¦×°yÁ-v—>äaܤq*„ÌaFµU† §ªGýáÏæÕ>ʚoÍÝߌ-íªÂ;Aàø³%ـM©ªaóªZì.QuÈîªIãÅAI‰N‚ A?ï6.^\VC ¢Ï¨h &DÔ¨Y -FH8$aUÐäpxËÒs*í=¸¡;6l}€—é·4Ñï¾Ý.¦3ê+® x'?ô˜Û,:Я۩fDH0úÙÖbñ?z@9endstream +endobj +7335 0 obj << +/Type /Page +/Contents 7336 0 R +/Resources 7334 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7337 0 obj << +/D [7335 0 R /XYZ 71.731 729.2652 null] +>> endobj +7338 0 obj << +/D [7335 0 R /XYZ 71.731 675.3674 null] +>> endobj +7339 0 obj << +/D [7335 0 R /XYZ 71.731 674.1221 null] +>> endobj +7340 0 obj << +/D [7335 0 R /XYZ 129.5143 655.0436 null] +>> endobj +899 0 obj << +/D [7335 0 R /XYZ 71.731 648.6227 null] +>> endobj +450 0 obj << +/D [7335 0 R /XYZ 293.326 604.8079 null] +>> endobj +7341 0 obj << +/D [7335 0 R /XYZ 71.731 581.3192 null] +>> endobj +7342 0 obj << +/D [7335 0 R /XYZ 161.0655 571.9312 null] +>> endobj +7343 0 obj << +/D [7335 0 R /XYZ 71.731 559.8118 null] +>> endobj +7344 0 obj << +/D [7335 0 R /XYZ 71.731 528.4459 null] +>> endobj +7345 0 obj << +/D [7335 0 R /XYZ 168.8063 517.4356 null] +>> endobj +7346 0 obj << +/D [7335 0 R /XYZ 71.731 490.3722 null] +>> endobj +7347 0 obj << +/D [7335 0 R /XYZ 71.731 424.0374 null] +>> endobj +7348 0 obj << +/D [7335 0 R /XYZ 71.731 397.5951 null] +>> endobj +7349 0 obj << +/D [7335 0 R /XYZ 71.731 364.8075 null] +>> endobj +7350 0 obj << +/D [7335 0 R /XYZ 181.5683 353.1517 null] +>> endobj +7351 0 obj << +/D [7335 0 R /XYZ 71.731 343.0895 null] +>> endobj +7352 0 obj << +/D [7335 0 R /XYZ 71.731 309.6663 null] +>> endobj +7353 0 obj << +/D [7335 0 R /XYZ 71.731 298.5565 null] +>> endobj +7354 0 obj << +/D [7335 0 R /XYZ 71.731 297.3112 null] +>> endobj +7355 0 obj << +/D [7335 0 R /XYZ 129.5143 278.2326 null] +>> endobj +7356 0 obj << +/D [7335 0 R /XYZ 129.5143 278.2326 null] +>> endobj +7357 0 obj << +/D [7335 0 R /XYZ 71.731 276.7931 null] +>> endobj +7358 0 obj << +/D [7335 0 R /XYZ 71.731 276.7931 null] +>> endobj +7359 0 obj << +/D [7335 0 R /XYZ 139.477 260.2999 null] +>> endobj +7360 0 obj << +/D [7335 0 R /XYZ 139.477 260.2999 null] +>> endobj +7361 0 obj << +/D [7335 0 R /XYZ 76.7123 242.3671 null] +>> endobj +7362 0 obj << +/D [7335 0 R /XYZ 129.5143 224.4344 null] +>> endobj +7363 0 obj << +/D [7335 0 R /XYZ 129.5143 224.4344 null] +>> endobj +7364 0 obj << +/D [7335 0 R /XYZ 71.731 222.9948 null] +>> endobj +7365 0 obj << +/D [7335 0 R /XYZ 129.5143 206.5016 null] +>> endobj +7366 0 obj << +/D [7335 0 R /XYZ 129.5143 206.5016 null] +>> endobj +7367 0 obj << +/D [7335 0 R /XYZ 71.731 205.3226 null] +>> endobj +7368 0 obj << +/D [7335 0 R /XYZ 71.731 205.3226 null] +>> endobj +7369 0 obj << +/D [7335 0 R /XYZ 139.477 188.5689 null] +>> endobj +7370 0 obj << +/D [7335 0 R /XYZ 139.477 188.5689 null] +>> endobj +7371 0 obj << +/D [7335 0 R /XYZ 71.731 186.412 null] +>> endobj +7372 0 obj << +/D [7335 0 R /XYZ 139.477 170.6361 null] +>> endobj +7373 0 obj << +/D [7335 0 R /XYZ 139.477 170.6361 null] +>> endobj +7374 0 obj << +/D [7335 0 R /XYZ 71.731 168.4793 null] +>> endobj +7375 0 obj << +/D [7335 0 R /XYZ 139.477 152.7034 null] +>> endobj +7376 0 obj << +/D [7335 0 R /XYZ 139.477 152.7034 null] +>> endobj +7377 0 obj << +/D [7335 0 R /XYZ 71.731 150.5465 null] +>> endobj +7378 0 obj << +/D [7335 0 R /XYZ 139.477 134.7706 null] +>> endobj +7379 0 obj << +/D [7335 0 R /XYZ 139.477 134.7706 null] +>> endobj +7380 0 obj << +/D [7335 0 R /XYZ 71.731 132.6138 null] +>> endobj +7381 0 obj << +/D [7335 0 R /XYZ 139.477 116.8379 null] +>> endobj +7382 0 obj << +/D [7335 0 R /XYZ 139.477 116.8379 null] +>> endobj +7383 0 obj << +/D [7335 0 R /XYZ 71.731 114.681 null] +>> endobj +7384 0 obj << +/D [7335 0 R /XYZ 139.477 98.9051 null] +>> endobj +7385 0 obj << +/D [7335 0 R /XYZ 139.477 98.9051 null] +>> endobj +7386 0 obj << +/D [7335 0 R /XYZ 71.731 97.4656 null] +>> endobj +7334 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F21 514 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7389 0 obj << +/Length 1377 +/Filter /FlateDecode +>> +stream +xڝXËr¤6Ýû+ؙ®r+’ðÎÉdRNeœ®g§\°›2†qùïsA‚Ý⑩^4ˆ#Ý£s\A ?â‚„4@ÔçԉÞ.°ó~» ²Õ˜­ úùþâ§ÏvøÔwîŸ/ðÌE’éÜÇ»¿ìÃC”›-åØ¥Hýï²0Oê?Â'u{³»U_’z_ÄÕæŸûß/~½ìsO @‚‘Y’ KÄ|é9[ŠQ@ ·¢,Á ”¼Ç<1l†Ž@¤Ý(lfÀ °v7”òSv¶‹) sÁÞîéÿ‘G?뜇' ¢ú¬ãሠ1¦ñTa…UÝr鈽Àaó8#-ðZéZÕeš¿\©›»¤~ßìå«8®Ö݆q\&ՙAü#FÀļ¼&lFÞ¶(¯Íî +yÏxXåÑxëÂТ­Ç¡’̈{£Äƒu¯—ê®0Ç zAz¹á&‡u]ª‘¢ž`7ÞG‡K˜B¦!(p—tÉlÎ=lÙ»kqÊÃ·°zµx‚»‚iO|kž`ºö‚^Ä.#gˆ3Ζd4`s2ö°e-v×ÈxÊÃ.£I#Î+jѐ2„q0W*nw㒠¢ôY#“¨Èã°üP·Ÿî¾õãå÷ á.ýIÉ=ù„Š%É Øœä=lYr‹Ý5’Ÿò°KnÒHÁ‰‡hÀÉÿ|R@"‘/‚ÅlÀæìaËZì®ð”‡]@“FýqH~(foÌXíV±ßôð-”WŒ‘`b±¼°9{زÆ»k4>åa×ؤñÖÉ{øa/¯2ðü- ‡2} +È»`hC¹ÛõÊ`KI"9t,¼3õ5©›2¯®ÏÔ! #'Âá½ V¯ô¨­ ;z%XyålµI¯P +m¡V»Ó^égYy¡:â‘æµ™¨¿´¯¸MÖÏM¦]ü‚N·sñ– $¤çu‚RûÝbì·m·î_‡qWĶÌbIŠAº¶{¾*c»²¨‹6‰®‡ǘÒs·”@ݓ*m CڅM½×ÊáÁc?å㾨ê<|KÌ'Ó$‹«>/O(n{‹&ÅOI•é¡N‹|Ž$gîS“¤ŽÙðh_ŸNþÌ3ºõ~؆"¦ýpH¢´ҝ]š[6¡—/õMg4ÖÛ ³L§ Ø(mF†‰Yò¬Û˜&¯‹&Ú'1ê2îâ’(OïnۙÌwü¥Å„['Ñ^Ea®. u]¨¶È½jwÐ/SÏÒR U)ȆԵV©Æoi^)°ÕŽ^]¸¯mþ'msð±ñ¹{¥Wmæ"¿±÷ݧ¢¨ó"’~·û:YµXƒÞ¾žðÍ*²DÚÏ]Qj²º2<òžV Z‚7YVt孏‡¯E–TkS¦“Os9¤ú¢uÝZó»Vа„\‚ƒöLé$RÀû•Ò…ÒiÂfJç[,6»+Jçñ ­¯˜#m©™èÎÛ®&êëì𢝟äp" Ûzb"›2™ìˆ áKLØL§0À;›ÝÂk§0¢qº|™:sÈ<&Ø\Of‘Õ<ׅ.pU2½ž!ϖ‚÷ˆš‹]ZÝs£k"÷„ÄDà$,ïEÛù3$°ðÆJC»0þ| ¤ŸŽVÂQÐò\ˆV6­=l9Z-v×D«…‡y¤ÒÑjÒ86PÇF$ÛìÞÓçÒ@ÂéB.屁š¦G-êb1ºB ‰sUL£„üÜd}óof£fÆ @“°þÌ$´í~0ûØÀœ&æÔCؓþ°RËRsò«¯ÅâšP-pendstream +endobj +7388 0 obj << +/Type /Page +/Contents 7389 0 R +/Resources 7387 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7390 0 obj << +/D [7388 0 R /XYZ 71.731 729.2652 null] +>> endobj +7391 0 obj << +/D [7388 0 R /XYZ 139.477 708.3437 null] +>> endobj +7392 0 obj << +/D [7388 0 R /XYZ 139.477 708.3437 null] +>> endobj +7393 0 obj << +/D [7388 0 R /XYZ 71.731 706.1869 null] +>> endobj +7394 0 obj << +/D [7388 0 R /XYZ 139.477 690.4109 null] +>> endobj +7395 0 obj << +/D [7388 0 R /XYZ 139.477 690.4109 null] +>> endobj +7396 0 obj << +/D [7388 0 R /XYZ 71.731 688.2541 null] +>> endobj +7397 0 obj << +/D [7388 0 R /XYZ 139.477 672.4782 null] +>> endobj +7398 0 obj << +/D [7388 0 R /XYZ 139.477 672.4782 null] +>> endobj +7399 0 obj << +/D [7388 0 R /XYZ 71.731 670.3214 null] +>> endobj +7400 0 obj << +/D [7388 0 R /XYZ 139.477 654.5454 null] +>> endobj +7401 0 obj << +/D [7388 0 R /XYZ 139.477 654.5454 null] +>> endobj +7402 0 obj << +/D [7388 0 R /XYZ 71.731 652.3886 null] +>> endobj +7403 0 obj << +/D [7388 0 R /XYZ 139.477 636.6127 null] +>> endobj +7404 0 obj << +/D [7388 0 R /XYZ 139.477 636.6127 null] +>> endobj +7405 0 obj << +/D [7388 0 R /XYZ 71.731 634.4559 null] +>> endobj +7406 0 obj << +/D [7388 0 R /XYZ 139.477 618.6799 null] +>> endobj +7407 0 obj << +/D [7388 0 R /XYZ 139.477 618.6799 null] +>> endobj +7408 0 obj << +/D [7388 0 R /XYZ 71.731 616.5231 null] +>> endobj +7409 0 obj << +/D [7388 0 R /XYZ 139.477 600.7472 null] +>> endobj +7410 0 obj << +/D [7388 0 R /XYZ 139.477 600.7472 null] +>> endobj +7411 0 obj << +/D [7388 0 R /XYZ 71.731 562.8892 null] +>> endobj +7412 0 obj << +/D [7388 0 R /XYZ 71.731 549.8382 null] +>> endobj +7413 0 obj << +/D [7388 0 R /XYZ 71.731 548.5928 null] +>> endobj +7414 0 obj << +/D [7388 0 R /XYZ 129.5143 529.5143 null] +>> endobj +900 0 obj << +/D [7388 0 R /XYZ 71.731 523.0934 null] +>> endobj +454 0 obj << +/D [7388 0 R /XYZ 225.7561 479.2787 null] +>> endobj +7415 0 obj << +/D [7388 0 R /XYZ 71.731 455.7899 null] +>> endobj +7416 0 obj << +/D [7388 0 R /XYZ 161.0655 446.402 null] +>> endobj +7417 0 obj << +/D [7388 0 R /XYZ 71.731 434.2825 null] +>> endobj +7418 0 obj << +/D [7388 0 R /XYZ 71.731 402.9166 null] +>> endobj +7419 0 obj << +/D [7388 0 R /XYZ 168.8063 391.9063 null] +>> endobj +7420 0 obj << +/D [7388 0 R /XYZ 71.731 364.8429 null] +>> endobj +7421 0 obj << +/D [7388 0 R /XYZ 71.731 333.477 null] +>> endobj +7422 0 obj << +/D [7388 0 R /XYZ 71.731 307.0347 null] +>> endobj +7423 0 obj << +/D [7388 0 R /XYZ 71.731 274.2471 null] +>> endobj +7424 0 obj << +/D [7388 0 R /XYZ 181.5683 262.5913 null] +>> endobj +7425 0 obj << +/D [7388 0 R /XYZ 71.731 252.5291 null] +>> endobj +7426 0 obj << +/D [7388 0 R /XYZ 71.731 219.1059 null] +>> endobj +7427 0 obj << +/D [7388 0 R /XYZ 71.731 207.9961 null] +>> endobj +7428 0 obj << +/D [7388 0 R /XYZ 71.731 206.7508 null] +>> endobj +7429 0 obj << +/D [7388 0 R /XYZ 129.5143 187.6722 null] +>> endobj +7430 0 obj << +/D [7388 0 R /XYZ 129.5143 187.6722 null] +>> endobj +7431 0 obj << +/D [7388 0 R /XYZ 71.731 186.2327 null] +>> endobj +7432 0 obj << +/D [7388 0 R /XYZ 71.731 186.2327 null] +>> endobj +7433 0 obj << +/D [7388 0 R /XYZ 139.477 169.7395 null] +>> endobj +7434 0 obj << +/D [7388 0 R /XYZ 139.477 169.7395 null] +>> endobj +7435 0 obj << +/D [7388 0 R /XYZ 76.7123 151.8067 null] +>> endobj +7436 0 obj << +/D [7388 0 R /XYZ 129.5143 133.874 null] +>> endobj +7437 0 obj << +/D [7388 0 R /XYZ 129.5143 133.874 null] +>> endobj +7438 0 obj << +/D [7388 0 R /XYZ 71.731 131.7171 null] +>> endobj +7439 0 obj << +/D [7388 0 R /XYZ 71.731 131.7171 null] +>> endobj +7440 0 obj << +/D [7388 0 R /XYZ 139.477 115.9412 null] +>> endobj +7441 0 obj << +/D [7388 0 R /XYZ 71.731 114.5017 null] +>> endobj +7442 0 obj << +/D [7388 0 R /XYZ 139.477 98.0085 null] +>> endobj +7387 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7445 0 obj << +/Length 1263 +/Filter /FlateDecode +>> +stream +xÚ¥˜ßs£6ÇßóWðè̜Uý–È[.×ë´Ó»ÉdrOM'Cl3‡Á5p©ÿû.HÂ2–¹N€xÑ~õÙÕj‰0ü‘H¤\hŒ¨4Zm¯pô?ývE¬ÉÒÚ,}£W¿|f8ŠQ,©Œ_#K$£H ¢£Çõ_‹»M²«Óýõ’ +¼ È\ïó¤Hë?“óx{ÿ»¹ù’Ö›r]]ÿýøÇÕ¯½ÁŠ58ɉFœá8Z2 þ9 Z#!ˆŠ–2ƈ°w“¡q~&ídz»Þ¬Í¥b¨ŽPŠ'4òt~‡×£÷Ö¹¦# P%ïtÀ”Éœè(Êuúüš¥¹Õi?B$¥Vਵ½1l«z߬êsñnxEW:Œ¶·ZúfGh¤ÍŽ±Îì"4ÈLyô{š{ë\Ç)4ïêTƏt_eeàÅ1"<æg¼²âíƒÍÐÝ.Ù§Emž>–¥½»ûd®?®‰XÇ .øaÏlŒ°3›&ð;‡ðPG˜°/ã¸^r5z¢`ݚáLž—vÑWéå¼Å1‰j*q=³±ÌufÓ©ð;'w‡:.$¯¯ÃìÂL BõàzÜ2û­[Ê]éÝ'd?+r }§ŒG¿> endobj +7446 0 obj << +/D [7444 0 R /XYZ 71.731 729.2652 null] +>> endobj +7447 0 obj << +/D [7444 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7448 0 obj << +/D [7444 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7449 0 obj << +/D [7444 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7450 0 obj << +/D [7444 0 R /XYZ 71.731 689.2319 null] +>> endobj +7451 0 obj << +/D [7444 0 R /XYZ 71.731 689.2319 null] +>> endobj +7452 0 obj << +/D [7444 0 R /XYZ 139.477 672.4782 null] +>> endobj +7453 0 obj << +/D [7444 0 R /XYZ 139.477 672.4782 null] +>> endobj +7454 0 obj << +/D [7444 0 R /XYZ 71.731 670.3214 null] +>> endobj +7455 0 obj << +/D [7444 0 R /XYZ 139.477 654.5454 null] +>> endobj +7456 0 obj << +/D [7444 0 R /XYZ 139.477 654.5454 null] +>> endobj +7457 0 obj << +/D [7444 0 R /XYZ 71.731 652.3886 null] +>> endobj +7458 0 obj << +/D [7444 0 R /XYZ 139.477 636.6127 null] +>> endobj +7459 0 obj << +/D [7444 0 R /XYZ 139.477 636.6127 null] +>> endobj +7460 0 obj << +/D [7444 0 R /XYZ 71.731 634.4559 null] +>> endobj +7461 0 obj << +/D [7444 0 R /XYZ 139.477 618.6799 null] +>> endobj +7462 0 obj << +/D [7444 0 R /XYZ 139.477 618.6799 null] +>> endobj +7463 0 obj << +/D [7444 0 R /XYZ 71.731 616.5231 null] +>> endobj +7464 0 obj << +/D [7444 0 R /XYZ 139.477 600.7472 null] +>> endobj +7465 0 obj << +/D [7444 0 R /XYZ 139.477 600.7472 null] +>> endobj +7466 0 obj << +/D [7444 0 R /XYZ 71.731 598.5904 null] +>> endobj +7467 0 obj << +/D [7444 0 R /XYZ 139.477 582.8144 null] +>> endobj +7468 0 obj << +/D [7444 0 R /XYZ 139.477 582.8144 null] +>> endobj +7469 0 obj << +/D [7444 0 R /XYZ 71.731 580.6576 null] +>> endobj +7470 0 obj << +/D [7444 0 R /XYZ 139.477 564.8817 null] +>> endobj +7471 0 obj << +/D [7444 0 R /XYZ 139.477 564.8817 null] +>> endobj +7472 0 obj << +/D [7444 0 R /XYZ 71.731 527.0236 null] +>> endobj +7473 0 obj << +/D [7444 0 R /XYZ 71.731 513.9727 null] +>> endobj +7474 0 obj << +/D [7444 0 R /XYZ 71.731 512.7273 null] +>> endobj +7475 0 obj << +/D [7444 0 R /XYZ 129.5143 493.6488 null] +>> endobj +901 0 obj << +/D [7444 0 R /XYZ 71.731 487.2279 null] +>> endobj +458 0 obj << +/D [7444 0 R /XYZ 219.0592 443.4132 null] +>> endobj +7476 0 obj << +/D [7444 0 R /XYZ 71.731 419.9244 null] +>> endobj +7477 0 obj << +/D [7444 0 R /XYZ 161.0655 410.5365 null] +>> endobj +7478 0 obj << +/D [7444 0 R /XYZ 71.731 398.417 null] +>> endobj +7479 0 obj << +/D [7444 0 R /XYZ 71.731 367.0511 null] +>> endobj +7480 0 obj << +/D [7444 0 R /XYZ 168.8063 356.0408 null] +>> endobj +7481 0 obj << +/D [7444 0 R /XYZ 71.731 328.9774 null] +>> endobj +7482 0 obj << +/D [7444 0 R /XYZ 71.731 297.6115 null] +>> endobj +7483 0 obj << +/D [7444 0 R /XYZ 71.731 280.9739 null] +>> endobj +7484 0 obj << +/D [7444 0 R /XYZ 71.731 250.0379 null] +>> endobj +7485 0 obj << +/D [7444 0 R /XYZ 181.5683 238.3821 null] +>> endobj +7486 0 obj << +/D [7444 0 R /XYZ 71.731 228.3199 null] +>> endobj +7487 0 obj << +/D [7444 0 R /XYZ 71.731 194.8967 null] +>> endobj +7488 0 obj << +/D [7444 0 R /XYZ 71.731 183.7869 null] +>> endobj +7489 0 obj << +/D [7444 0 R /XYZ 71.731 182.5415 null] +>> endobj +7490 0 obj << +/D [7444 0 R /XYZ 129.5143 163.463 null] +>> endobj +7491 0 obj << +/D [7444 0 R /XYZ 129.5143 163.463 null] +>> endobj +7492 0 obj << +/D [7444 0 R /XYZ 71.731 162.0235 null] +>> endobj +7493 0 obj << +/D [7444 0 R /XYZ 71.731 162.0235 null] +>> endobj +7494 0 obj << +/D [7444 0 R /XYZ 139.477 145.5303 null] +>> endobj +7495 0 obj << +/D [7444 0 R /XYZ 139.477 145.5303 null] +>> endobj +7496 0 obj << +/D [7444 0 R /XYZ 76.7123 127.5975 null] +>> endobj +7497 0 obj << +/D [7444 0 R /XYZ 129.5143 109.6647 null] +>> endobj +7498 0 obj << +/D [7444 0 R /XYZ 129.5143 109.6647 null] +>> endobj +7499 0 obj << +/D [7444 0 R /XYZ 71.731 108.2252 null] +>> endobj +7443 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7502 0 obj << +/Length 1266 +/Filter /FlateDecode +>> +stream +xÚ­˜]›8†ïçWp9‘×666s×í~¨«VUÓ«Õˆg‚Ä£Qÿý‚Mâ`´]ÍE˜äµÏËÃ9æØ$ÂðG"Aˆáƒ¦ˆ&œFùëŽ^à§?lfëŠ~y¼{ÿ{Œ£¥ M¢ÇC§ â‚E"¦Hr"£Çýß÷Y£U»ÙRŽï)?weV)ý9û>þûa÷i¼ø¢ô±Þw›ÿ¼ûíqŠÏcR AM2"‹qm)F)%Ü«"$Eœ7ƒ%ŠY,¦›¡iq&ÃÍLºI6ÜÍ¥|îŽP +B#wBwþyöaG]ûˆe$jÂN>à–9añ¥&*GV'ëççÀD¥L!Î }Ñvºís}íÝ̞¤1ð¼Ì¬jëÊÎÌȐ®×Iv“¤¦,õƽÍ̎ºöqÉ,NâÒFß©¶Ê^•ãˆÓ”^+ª—w&a?~/ÜYü …Ø’†@:²%V鉻ä܇¤k£ik]çuùs í,æ{…^ÌÚÐuGóÝQë¦3×Z•°bܦÎ⌳uG¶DÝÊÂÔ=q×PŸûðSwmTõ^=Þz÷RÏÚ6û±Iø½ø¹èôxUÆÏaÆÎÐ=fÚ^ÝìIåu¥Ûºì®!›q‚B…Ÿ½m]•ý|®›äWH¼Qo“·£¼6Î$ ð»ôQT ‰‡1LËݑ-%ž•…ÏwMâÍ}øϵQ4ž”#1¢)'k +ýÓÎ$ä~ߪ®»I’Kè •°+[ 9ɂ$}qW¼òá%ya£ªµòÕ/xŽe*`~)º\•CÓT÷­^3™f”D„`:²%˜V†é‰»æ܇¦kãXwúç_çî,~,A)“¡¾È•-´²0HOÜ5 ç>ü ]¯ð(ÿSVNÇ)ÁmœpIZ.]ÙN+ ãôÄ]ƒsîÏӵÑd]÷V·{^J)äÿÒfrB–qpµtdK ­, Òw ȹ?H×FS·zõjîvôQ™Ææ5Khÿú]µW-Êòã¹C¯lS½P¥r­öfP}«)biŒǁ¦ÈUÝnŠ&U°)òE]Ñùlxš¢ ¦)‚Ív:dõÐ[HhèX_•îÛª{¸rjwÕ Ç<´EwT ;t« +nÐ=AWìÏ=&8¶„\ÀÆä!1éc’°ëóz Co\0'%üT[.ñP¶ј'§É("°ó‡ñBÞkö™V»M YªZß#¤ð„¶ÃŒHÆGµ¶ZúG£¦çÚ3c·”@Ãk^ &Œ²Ç6O˜ã¬×v_ÖÀ°y®Ûçar¿}˜§0‚xìmm4×Þ¯ªËÛ¢ÑE]-„Žœ'Ô5hj2;Çßp~o¶‘UåYå[sæY4*/N_™b.*ύØåÅLџïÍ-g¥yëÕ£õ™–ê`–—¾ÒuŸÕêCªÁ^#‰[8ì1ñ!úRwŽ·¢Sh-ûeYo(¿³¾Ö¥êÖæI¶h+Cí6„H ‹î핁` <–¥Á•-¬ “,¸8øâ®X®|øOï.| µä{³1h#|§vïfǤÃxUé"φ¢q•}{Õ2˜³[&a#’¤‹Ç»Žæút—ÓáX&ÓLƒMBÉÍÃZOÄFbÓendstream +endobj +7501 0 obj << +/Type /Page +/Contents 7502 0 R +/Resources 7500 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7274 0 R +>> endobj +7503 0 obj << +/D [7501 0 R /XYZ 71.731 729.2652 null] +>> endobj +7504 0 obj << +/D [7501 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7505 0 obj << +/D [7501 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7506 0 obj << +/D [7501 0 R /XYZ 71.731 706.9629 null] +>> endobj +7507 0 obj << +/D [7501 0 R /XYZ 71.731 706.9629 null] +>> endobj +7508 0 obj << +/D [7501 0 R /XYZ 139.477 690.4109 null] +>> endobj +7509 0 obj << +/D [7501 0 R /XYZ 139.477 690.4109 null] +>> endobj +7510 0 obj << +/D [7501 0 R /XYZ 71.731 688.2541 null] +>> endobj +7511 0 obj << +/D [7501 0 R /XYZ 139.477 672.4782 null] +>> endobj +7512 0 obj << +/D [7501 0 R /XYZ 139.477 672.4782 null] +>> endobj +7513 0 obj << +/D [7501 0 R /XYZ 71.731 670.3214 null] +>> endobj +7514 0 obj << +/D [7501 0 R /XYZ 139.477 654.5454 null] +>> endobj +7515 0 obj << +/D [7501 0 R /XYZ 139.477 654.5454 null] +>> endobj +7516 0 obj << +/D [7501 0 R /XYZ 71.731 652.3886 null] +>> endobj +7517 0 obj << +/D [7501 0 R /XYZ 71.731 652.3886 null] +>> endobj +7518 0 obj << +/D [7501 0 R /XYZ 149.4396 636.6127 null] +>> endobj +7519 0 obj << +/D [7501 0 R /XYZ 76.7123 618.6799 null] +>> endobj +7520 0 obj << +/D [7501 0 R /XYZ 139.477 600.7472 null] +>> endobj +7521 0 obj << +/D [7501 0 R /XYZ 139.477 600.7472 null] +>> endobj +7522 0 obj << +/D [7501 0 R /XYZ 71.731 598.5904 null] +>> endobj +7523 0 obj << +/D [7501 0 R /XYZ 139.477 582.8144 null] +>> endobj +7524 0 obj << +/D [7501 0 R /XYZ 139.477 582.8144 null] +>> endobj +7525 0 obj << +/D [7501 0 R /XYZ 71.731 580.6576 null] +>> endobj +7526 0 obj << +/D [7501 0 R /XYZ 139.477 564.8817 null] +>> endobj +7527 0 obj << +/D [7501 0 R /XYZ 139.477 564.8817 null] +>> endobj +7528 0 obj << +/D [7501 0 R /XYZ 71.731 562.7248 null] +>> endobj +7529 0 obj << +/D [7501 0 R /XYZ 139.477 546.9489 null] +>> endobj +7530 0 obj << +/D [7501 0 R /XYZ 139.477 546.9489 null] +>> endobj +7531 0 obj << +/D [7501 0 R /XYZ 71.731 544.7921 null] +>> endobj +7532 0 obj << +/D [7501 0 R /XYZ 139.477 529.0162 null] +>> endobj +7533 0 obj << +/D [7501 0 R /XYZ 139.477 529.0162 null] +>> endobj +7534 0 obj << +/D [7501 0 R /XYZ 71.731 526.8593 null] +>> endobj +7535 0 obj << +/D [7501 0 R /XYZ 139.477 511.0834 null] +>> endobj +7536 0 obj << +/D [7501 0 R /XYZ 139.477 511.0834 null] +>> endobj +7537 0 obj << +/D [7501 0 R /XYZ 71.731 508.9266 null] +>> endobj +7538 0 obj << +/D [7501 0 R /XYZ 71.731 508.9266 null] +>> endobj +7539 0 obj << +/D [7501 0 R /XYZ 149.4396 493.1507 null] +>> endobj +7540 0 obj << +/D [7501 0 R /XYZ 71.731 437.3599 null] +>> endobj +7541 0 obj << +/D [7501 0 R /XYZ 71.731 424.3089 null] +>> endobj +7542 0 obj << +/D [7501 0 R /XYZ 71.731 423.0636 null] +>> endobj +7543 0 obj << +/D [7501 0 R /XYZ 129.5143 403.985 null] +>> endobj +902 0 obj << +/D [7501 0 R /XYZ 71.731 397.5642 null] +>> endobj +462 0 obj << +/D [7501 0 R /XYZ 219.5239 353.7494 null] +>> endobj +7544 0 obj << +/D [7501 0 R /XYZ 71.731 330.2606 null] +>> endobj +7545 0 obj << +/D [7501 0 R /XYZ 161.0655 320.8727 null] +>> endobj +7546 0 obj << +/D [7501 0 R /XYZ 71.731 308.7532 null] +>> endobj +7547 0 obj << +/D [7501 0 R /XYZ 71.731 277.3873 null] +>> endobj +7548 0 obj << +/D [7501 0 R /XYZ 168.8063 266.3771 null] +>> endobj +7549 0 obj << +/D [7501 0 R /XYZ 71.731 239.3136 null] +>> endobj +7550 0 obj << +/D [7501 0 R /XYZ 71.731 222.8917 null] +>> endobj +7551 0 obj << +/D [7501 0 R /XYZ 71.731 191.9557 null] +>> endobj +7552 0 obj << +/D [7501 0 R /XYZ 181.5683 180.2999 null] +>> endobj +7553 0 obj << +/D [7501 0 R /XYZ 71.731 170.2377 null] +>> endobj +7554 0 obj << +/D [7501 0 R /XYZ 71.731 138.6661 null] +>> endobj +7555 0 obj << +/D [7501 0 R /XYZ 71.731 125.7047 null] +>> endobj +7556 0 obj << +/D [7501 0 R /XYZ 71.731 124.4593 null] +>> endobj +7557 0 obj << +/D [7501 0 R /XYZ 129.5143 105.3808 null] +>> endobj +7558 0 obj << +/D [7501 0 R /XYZ 129.5143 105.3808 null] +>> endobj +7559 0 obj << +/D [7501 0 R /XYZ 71.731 103.9413 null] +>> endobj +7560 0 obj << +/D [7501 0 R /XYZ 71.731 103.9413 null] +>> endobj +7500 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7563 0 obj << +/Length 1229 +/Filter /FlateDecode +>> +stream +xÚÅXËnã6Ýç+´´˜%)¾”]ú +¦HQ#“¬š"ÐÈôXE2ôè ß+‰”i›z ]YX±yÏ=¼/ŠþH ’!|ÐQÁi¼ßàà+üôpC dc0ôãóÍ¿†8ˆP$¨ž÷A Ä% dH‘âDÏ»?W?âc­Ëõ†r¼¢¨ÿÜfq®ëÇøKÿïýöSÿð»®Å®ZÿõüÛÍ/σ}J)02I’a…˜Pa°¡E”p/ŠÀœ0@IÀ‡,”ƒ34 +$"­£à̀`­7¯”òKvÜŔE»¡µ{ùyâaW]óU @TÁ:a„˜”ç4î›úÐkՒ队Ž $î w½²U]¦ù×[£7,×y&qyÿÝ{¿]÷\ýgSé+g ȉ „¤ÀKùb@m\ØIäHâ^ä«ÝFE¦Ü'Ôkw\d»êšÇ¹Èö°Ïxµ.ßÒÝ[Q¾åñ»öH­BD”:W:Íëþ¡(]鯲&9Cœq6­.l"ZØl´úì.ˆV“ 6ZÏh€"&ð¶ÚV‚t×à+ƾ•&„P&TÎIãÀ¦¤±°yiôÇæK–&ýó·5Á+½&|õ1.®`H)2—§.lJ\ ›×cw‰¸—<üâº4’8ÑeíÑ7dHŠH,Ò÷óçÇk}Û}»:ÍX+ÌŠ˜Šæv`S +[ؼ»K¾äáWإѦüH—eqÑE{+çà7<`"蜊lJE ›WÑcw‰Š—<ü*º4ºÂٔÙTqÈ_žÛ­Ú¶ s …‘Âï6yÒuSæÕÝh«b\"©Âp¦U¹°‰V5Àf[•Ïî‚Våãá”R{ðgðŠ9Žáž`œ;v?™iX¿ÇivþC7ÉA»†eÄÃrcº,ÖUR¦Çö2Åæ%.¨Ë³êMÇ.s³ü#Ï>Ì%æ ­'=5s,GôsçÎÎë^GŒ‰ÒlÒt†wÆé8Ë̌VJŸ™aa¦÷æ>ÐäuÑ$½C]JaðŒ ®Hô/Ø7ks{ÓÉÁ|—Ćf18ØSœ}¯töw'º²·ìOÿfñÇüÈ7Þq=,NíE'­[ÛÆ9cn(…[(fòĈ»o'Ž¸ÉêÊað=­4ZX÷YV¬)_}·güTdºZš ñî=Ímt§·ÃU¸\3¼º=ÌR6ÛV׸„ÆTÏK¸ I>S,]ØD±`³ÅÒgwA±¼âáŸëÏx´Å#eÐÁ|ãüíE;Š=/.zdSŽ·ý¶¦­¹ñԅM´ý6Ûö}v´ý+Þ¶Fãÿ{dÞ 2M¾> endobj +7564 0 obj << +/D [7562 0 R /XYZ 71.731 729.2652 null] +>> endobj +7565 0 obj << +/D [7562 0 R /XYZ 139.477 708.3437 null] +>> endobj +7566 0 obj << +/D [7562 0 R /XYZ 139.477 708.3437 null] +>> endobj +7567 0 obj << +/D [7562 0 R /XYZ 76.7123 690.4109 null] +>> endobj +7568 0 obj << +/D [7562 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7569 0 obj << +/D [7562 0 R /XYZ 129.5143 672.4782 null] +>> endobj +7570 0 obj << +/D [7562 0 R /XYZ 71.731 670.3214 null] +>> endobj +7571 0 obj << +/D [7562 0 R /XYZ 71.731 670.3214 null] +>> endobj +7572 0 obj << +/D [7562 0 R /XYZ 139.477 654.5454 null] +>> endobj +7573 0 obj << +/D [7562 0 R /XYZ 71.731 653.1059 null] +>> endobj +7574 0 obj << +/D [7562 0 R /XYZ 139.477 636.6127 null] +>> endobj +7575 0 obj << +/D [7562 0 R /XYZ 76.7123 618.6799 null] +>> endobj +7576 0 obj << +/D [7562 0 R /XYZ 129.5143 600.7472 null] +>> endobj +7577 0 obj << +/D [7562 0 R /XYZ 129.5143 600.7472 null] +>> endobj +7578 0 obj << +/D [7562 0 R /XYZ 71.731 599.3664 null] +>> endobj +7579 0 obj << +/D [7562 0 R /XYZ 71.731 599.3664 null] +>> endobj +7580 0 obj << +/D [7562 0 R /XYZ 139.477 582.8144 null] +>> endobj +7581 0 obj << +/D [7562 0 R /XYZ 139.477 582.8144 null] +>> endobj +7582 0 obj << +/D [7562 0 R /XYZ 71.731 580.6576 null] +>> endobj +7583 0 obj << +/D [7562 0 R /XYZ 139.477 564.8817 null] +>> endobj +7584 0 obj << +/D [7562 0 R /XYZ 139.477 564.8817 null] +>> endobj +7585 0 obj << +/D [7562 0 R /XYZ 71.731 562.7248 null] +>> endobj +7586 0 obj << +/D [7562 0 R /XYZ 139.477 546.9489 null] +>> endobj +7587 0 obj << +/D [7562 0 R /XYZ 139.477 546.9489 null] +>> endobj +7588 0 obj << +/D [7562 0 R /XYZ 71.731 544.7921 null] +>> endobj +7589 0 obj << +/D [7562 0 R /XYZ 139.477 529.0162 null] +>> endobj +7590 0 obj << +/D [7562 0 R /XYZ 139.477 529.0162 null] +>> endobj +7591 0 obj << +/D [7562 0 R /XYZ 71.731 491.1581 null] +>> endobj +7592 0 obj << +/D [7562 0 R /XYZ 71.731 478.1072 null] +>> endobj +7593 0 obj << +/D [7562 0 R /XYZ 71.731 476.8618 null] +>> endobj +7594 0 obj << +/D [7562 0 R /XYZ 129.5143 457.7833 null] +>> endobj +903 0 obj << +/D [7562 0 R /XYZ 71.731 451.3624 null] +>> endobj +466 0 obj << +/D [7562 0 R /XYZ 240.303 407.5477 null] +>> endobj +7595 0 obj << +/D [7562 0 R /XYZ 71.731 384.0589 null] +>> endobj +7596 0 obj << +/D [7562 0 R /XYZ 161.0655 374.671 null] +>> endobj +7597 0 obj << +/D [7562 0 R /XYZ 71.731 362.5515 null] +>> endobj +7598 0 obj << +/D [7562 0 R /XYZ 71.731 331.1856 null] +>> endobj +7599 0 obj << +/D [7562 0 R /XYZ 168.8063 320.1753 null] +>> endobj +7600 0 obj << +/D [7562 0 R /XYZ 71.731 293.1119 null] +>> endobj +7601 0 obj << +/D [7562 0 R /XYZ 71.731 261.746 null] +>> endobj +7602 0 obj << +/D [7562 0 R /XYZ 71.731 245.1084 null] +>> endobj +7603 0 obj << +/D [7562 0 R /XYZ 71.731 214.1724 null] +>> endobj +7604 0 obj << +/D [7562 0 R /XYZ 181.5683 202.5165 null] +>> endobj +7605 0 obj << +/D [7562 0 R /XYZ 71.731 192.4544 null] +>> endobj +7606 0 obj << +/D [7562 0 R /XYZ 71.731 159.0312 null] +>> endobj +7607 0 obj << +/D [7562 0 R /XYZ 71.731 147.9214 null] +>> endobj +7608 0 obj << +/D [7562 0 R /XYZ 71.731 146.676 null] +>> endobj +7609 0 obj << +/D [7562 0 R /XYZ 129.5143 127.5975 null] +>> endobj +7610 0 obj << +/D [7562 0 R /XYZ 129.5143 127.5975 null] +>> endobj +7611 0 obj << +/D [7562 0 R /XYZ 71.731 126.158 null] +>> endobj +7612 0 obj << +/D [7562 0 R /XYZ 71.731 126.158 null] +>> endobj +7613 0 obj << +/D [7562 0 R /XYZ 139.477 109.6647 null] +>> endobj +7614 0 obj << +/D [7562 0 R /XYZ 139.477 109.6647 null] +>> endobj +7561 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7618 0 obj << +/Length 1329 +/Filter /FlateDecode +>> +stream +xڝ˜]£6†ïçWp™H×›¹›íÇv«Víf¯:Uäg‚Détþý°Á!F«Ñ/>¯Ÿc°QÕ +Œ¨ŽŽ(缪[Ÿ–l´fc‹>n~úÀ q„£`{ HÊ€ 8E<Ø&ÿ¬~>‰²‘Õzƒ)\aП3‘ËæO±ï>=îOþ’Í©Hêõ¿Û?~Ýñ)a æ*ȬÉqÂUü8UŀRĂMC"¥7Áq â0ˆÚÎ ºAÖöæc:u‡0$D8°4q§ÇчyêÖáWP£°ó¡ºL‘ê̕RVu‘ïÒdWT;yiÖºêº0ŽG‚ÕxÀî‘Çqš7ýI¡Ç¤nª4½í” Ë0w#T[6ÂDmÖ\uÂÈîÂT¹q;ãއižrú‰ «»ìچ"ò¡Gñ­6‰š&2oÒ±ºr  ièCcÉæЙ#î44¶>74ç*=‹ê½ÿ!7]Òuç"I*YßTíXAª0#Ǿz´dsõhdþztÄ]RSwêÑö¡ëñ˜Ê¬Ÿ¾&tÛ|Ü\—¢¢{94÷Ó BÀBæ­êÇ»+"Â#)öíPز™Ñ ó®ˆ\q¬ˆ\>¬W”þ+ãªZçazԌ/‡ƒ¢w¼˜QQþÔx!ڍáFã„t@1¡Q×ÁvïˆñÕ·2üš6®™)d€cØ¢SßÉ,꧱çªhŠæ½”ÃcÒèg7µ¢ë+Õ +ÑYn J\š“îP­n譗¬xMóÝ^ÔÒ¾×í¨…`W„·&7&¦mòYª´lÒ"Ÿ³I"@#lÛÔï-1Æכlç™NÞæ4t¤7¦µ¥<ô{“YäÒ5¼»V‹JÚwÝa‘éª(T”Êfx0“G=©™¬¸N2]AÕ/(Gýh?ÖO„6T ]郏}­Ç¢v5xQC9ËîÕÓ7u¼Á#’sšOCځÎâÿ]¥*m?\]×O•¹#òÄtI}›D4ê«a̓¡Ç(R_v,²' O½èÇvæ—¬©-ðo©nzI®=eYÑz3ÿE} +ÕK«£Ã¥½”ét®Ñ[Å!WëÔ(žÝM¶4·›ÉjPÍ(CKmh„ÉݽaGÄï ¶( endstream +endobj +7617 0 obj << +/Type /Page +/Contents 7618 0 R +/Resources 7616 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7615 0 R +>> endobj +7619 0 obj << +/D [7617 0 R /XYZ 71.731 729.2652 null] +>> endobj +7620 0 obj << +/D [7617 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7621 0 obj << +/D [7617 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7622 0 obj << +/D [7617 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7623 0 obj << +/D [7617 0 R /XYZ 71.731 688.2541 null] +>> endobj +7624 0 obj << +/D [7617 0 R /XYZ 71.731 688.2541 null] +>> endobj +7625 0 obj << +/D [7617 0 R /XYZ 139.477 672.4782 null] +>> endobj +7626 0 obj << +/D [7617 0 R /XYZ 71.731 671.0386 null] +>> endobj +7627 0 obj << +/D [7617 0 R /XYZ 139.477 654.5454 null] +>> endobj +7628 0 obj << +/D [7617 0 R /XYZ 76.7123 636.6127 null] +>> endobj +7629 0 obj << +/D [7617 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7630 0 obj << +/D [7617 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7631 0 obj << +/D [7617 0 R /XYZ 71.731 617.2992 null] +>> endobj +7632 0 obj << +/D [7617 0 R /XYZ 71.731 617.2992 null] +>> endobj +7633 0 obj << +/D [7617 0 R /XYZ 139.477 600.7472 null] +>> endobj +7634 0 obj << +/D [7617 0 R /XYZ 139.477 600.7472 null] +>> endobj +7635 0 obj << +/D [7617 0 R /XYZ 71.731 598.5904 null] +>> endobj +7636 0 obj << +/D [7617 0 R /XYZ 139.477 582.8144 null] +>> endobj +7637 0 obj << +/D [7617 0 R /XYZ 139.477 582.8144 null] +>> endobj +7638 0 obj << +/D [7617 0 R /XYZ 71.731 580.6576 null] +>> endobj +7639 0 obj << +/D [7617 0 R /XYZ 139.477 564.8817 null] +>> endobj +7640 0 obj << +/D [7617 0 R /XYZ 139.477 564.8817 null] +>> endobj +7641 0 obj << +/D [7617 0 R /XYZ 71.731 562.7248 null] +>> endobj +7642 0 obj << +/D [7617 0 R /XYZ 139.477 546.9489 null] +>> endobj +7643 0 obj << +/D [7617 0 R /XYZ 139.477 546.9489 null] +>> endobj +7644 0 obj << +/D [7617 0 R /XYZ 71.731 544.7921 null] +>> endobj +7645 0 obj << +/D [7617 0 R /XYZ 139.477 529.0162 null] +>> endobj +7646 0 obj << +/D [7617 0 R /XYZ 139.477 529.0162 null] +>> endobj +7647 0 obj << +/D [7617 0 R /XYZ 71.731 526.8593 null] +>> endobj +7648 0 obj << +/D [7617 0 R /XYZ 139.477 511.0834 null] +>> endobj +7649 0 obj << +/D [7617 0 R /XYZ 139.477 511.0834 null] +>> endobj +7650 0 obj << +/D [7617 0 R /XYZ 71.731 509.6439 null] +>> endobj +7651 0 obj << +/D [7617 0 R /XYZ 139.477 493.1507 null] +>> endobj +7652 0 obj << +/D [7617 0 R /XYZ 139.477 493.1507 null] +>> endobj +7653 0 obj << +/D [7617 0 R /XYZ 71.731 490.9938 null] +>> endobj +7654 0 obj << +/D [7617 0 R /XYZ 139.477 475.2179 null] +>> endobj +7655 0 obj << +/D [7617 0 R /XYZ 139.477 475.2179 null] +>> endobj +7656 0 obj << +/D [7617 0 R /XYZ 71.731 473.0611 null] +>> endobj +7657 0 obj << +/D [7617 0 R /XYZ 139.477 457.2852 null] +>> endobj +7658 0 obj << +/D [7617 0 R /XYZ 139.477 457.2852 null] +>> endobj +7659 0 obj << +/D [7617 0 R /XYZ 71.731 419.4271 null] +>> endobj +7660 0 obj << +/D [7617 0 R /XYZ 71.731 406.3762 null] +>> endobj +7661 0 obj << +/D [7617 0 R /XYZ 71.731 405.1308 null] +>> endobj +7662 0 obj << +/D [7617 0 R /XYZ 129.5143 386.0523 null] +>> endobj +904 0 obj << +/D [7617 0 R /XYZ 71.731 379.6314 null] +>> endobj +470 0 obj << +/D [7617 0 R /XYZ 214.2903 335.8167 null] +>> endobj +7663 0 obj << +/D [7617 0 R /XYZ 71.731 312.3279 null] +>> endobj +7664 0 obj << +/D [7617 0 R /XYZ 161.0655 302.9399 null] +>> endobj +7665 0 obj << +/D [7617 0 R /XYZ 71.731 290.8205 null] +>> endobj +7666 0 obj << +/D [7617 0 R /XYZ 71.731 259.4546 null] +>> endobj +7667 0 obj << +/D [7617 0 R /XYZ 168.8063 248.4443 null] +>> endobj +7668 0 obj << +/D [7617 0 R /XYZ 71.731 221.3809 null] +>> endobj +7669 0 obj << +/D [7617 0 R /XYZ 71.731 190.015 null] +>> endobj +7670 0 obj << +/D [7617 0 R /XYZ 71.731 161.7211 null] +>> endobj +7671 0 obj << +/D [7617 0 R /XYZ 71.731 130.7851 null] +>> endobj +7672 0 obj << +/D [7617 0 R /XYZ 181.5683 119.1293 null] +>> endobj +7673 0 obj << +/D [7617 0 R /XYZ 71.731 109.0671 null] +>> endobj +7616 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7676 0 obj << +/Length 1398 +/Filter /FlateDecode +>> +stream +xÚµ™Moã6†ïù>ÆÀš%)Q¤ö–v»ýÀ.ìfOMaÈ6“-C–Òì¿ïH"eŠ¢HµE‘ƒíøçÕ3Ã!)“†?²âñ^hŠhÂèj¼Á«gøê—¢$¥Ù˜¢n~øáUŠÒ„&«‡§U”&ˆñxÅ#Š#bõpøãö§—ì\Ëj½¡ ßRÔ¿ÞÙI֟²]ÿñîþ·þÍgY¿”‡Ëúχßo~~Ⳉ£T@¯ÉA5µISÃ&!)bŒðÇEqÄ;Ÿ÷kÂn³*;Jp{yo[.JD¡8rZTS¦-À8&# ƒ¬µðH)›Ä¥<êŒk¿^}諦>"±€"‰;Š‘8ûȚú¥õaq£1Âm„Vò¾Ï×¥®š}ýÎÊb{½<Õù>«óòd*›JNoP[H ”àÌ V«6¦ì +–´å9º!-› EŠiœ:ã΃ÕWM}ŒÁF)Š9Û¸.}…;è²%1L›o~zÖ|XýpÝûºì_›‹œ¯Þ(FP¡â½ª|µ«Táҝ]R¹–‰™Â5L\òZnóö¬¶EùœŸ¶»¬G1i ՙ1ëüT÷oÊʄ?_¯$AD¤Q¨^ ™¯^µ,\¯Ž¸KêÕáÃ@¢ëÕ´DTé}²ŠÒ¡-ÁGŒ)ôô94,ˆ²$4•M™Í ¢qÅ]€ÆåcŠfdc41¯t.E¾Woϕl)½ÍNE–@¥§$0 •g*jUp*:‚.˜Š¶ ÷T4MtSñ)—E¿˜[H‚Xq\kÉ|MÅ1Š™M7Sæ«)- ה#²}8—‡‘ì=f–]œ¦ž…ácSêßC%êÁÜ,)lÔ( ÎOCæc©ea–Ž¸KXÚ>Ü,MMU¸¿@IäØÃ\Q~ûòI-Oj/£fsö¬ÀÖ/™Z'ò²¯ò¼è/¤‘„Yô°çd)!ô†Ì‡^ËÂèq— ·}¸Ñ›6ä)Ûҵʼn1b˜[•¼+ËBf'Åÿ×LÑÜI©¶8ÆxN¢qŠ¡›x^EšJd9¸€¤åÀÉÑ0P”§ç¼n®ŽÀ0J±…ñP6@IQü ÷ù1S=á:Ò¨°—•kÌ)┇º®)óÖ²0bGÜ%mn̦vÓ3œc %¥‹Aë‘þ g#žÆ¡ŽlÊ|œµ,ÌÙw gۇ›³i㘽m»íÑÅ}ø¡BˆÉ†\aþœ½åÇæ¨V¶æ¸ÓÏ4d5°Õ Çèû1•¨m)ãSÓ¾’™/AQ‚DBB}۔ù¤eá9â.IíÝ ӆ÷ÈäLÐØ `IN!R€êU僪Ta¦Ó KZ&ÜD ªâ_eµxüÏJ~MÙíkûتðÖ>†|‡²dÈ|iÒ²pžq—$ÊöáΔi#¿lÏÐÖóýÌj+0÷íZî»k‹ïý§×\¶™ùkMLÖÞö‰á$ +µSæ!<Ȃ„]qžøpÙÈv»J¾æPf‡íÌAGÀ&2á¾s×ÒU}7Ðܙ¬Â†4NÛ'֐=ÓÞÃY7ÕÉól7"‰'3¹)óÊYðTàXîòav†r0}\; Q]A÷“fKèå©Ñ'ðÇ%¬Ëé†qÄEԝLX?EƆ빸ýv>@N¾¶½ÿ®†¤íÖß6µs_ő ¸I‘à‰zþ^•uY?Ë÷ÃגR×n(4M"úö:°»GÌpûú±&m3S·ÍêË׶¤²¢µŠ‡ßoúýНþÎí£XŸcXaYBMÇöqqˆn<õñ§mðoù¥nŸEÚëëð¨r´¨̛Eví©_tbIRï>†fú›£0É#‘ #µ7Jh<ûŽ#âßGtó¬endstream +endobj +7675 0 obj << +/Type /Page +/Contents 7676 0 R +/Resources 7674 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7615 0 R +>> endobj +7677 0 obj << +/D [7675 0 R /XYZ 71.731 729.2652 null] +>> endobj +7678 0 obj << +/D [7675 0 R /XYZ 71.731 718.3063 null] +>> endobj +7679 0 obj << +/D [7675 0 R /XYZ 71.731 708.2442 null] +>> endobj +7680 0 obj << +/D [7675 0 R /XYZ 71.731 706.9988 null] +>> endobj +7681 0 obj << +/D [7675 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7682 0 obj << +/D [7675 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7683 0 obj << +/D [7675 0 R /XYZ 71.731 686.4807 null] +>> endobj +7684 0 obj << +/D [7675 0 R /XYZ 71.731 686.4807 null] +>> endobj +7685 0 obj << +/D [7675 0 R /XYZ 139.477 669.9875 null] +>> endobj +7686 0 obj << +/D [7675 0 R /XYZ 139.477 669.9875 null] +>> endobj +7687 0 obj << +/D [7675 0 R /XYZ 76.7123 652.0548 null] +>> endobj +7688 0 obj << +/D [7675 0 R /XYZ 129.5143 634.122 null] +>> endobj +7689 0 obj << +/D [7675 0 R /XYZ 129.5143 634.122 null] +>> endobj +7690 0 obj << +/D [7675 0 R /XYZ 71.731 631.9652 null] +>> endobj +7691 0 obj << +/D [7675 0 R /XYZ 71.731 631.9652 null] +>> endobj +7692 0 obj << +/D [7675 0 R /XYZ 139.477 616.1893 null] +>> endobj +7693 0 obj << +/D [7675 0 R /XYZ 71.731 614.7497 null] +>> endobj +7694 0 obj << +/D [7675 0 R /XYZ 139.477 598.2565 null] +>> endobj +7695 0 obj << +/D [7675 0 R /XYZ 76.7123 580.3238 null] +>> endobj +7696 0 obj << +/D [7675 0 R /XYZ 129.5143 562.391 null] +>> endobj +7697 0 obj << +/D [7675 0 R /XYZ 129.5143 562.391 null] +>> endobj +7698 0 obj << +/D [7675 0 R /XYZ 71.731 561.212 null] +>> endobj +7699 0 obj << +/D [7675 0 R /XYZ 71.731 561.212 null] +>> endobj +7700 0 obj << +/D [7675 0 R /XYZ 139.477 544.4583 null] +>> endobj +7701 0 obj << +/D [7675 0 R /XYZ 139.477 544.4583 null] +>> endobj +7702 0 obj << +/D [7675 0 R /XYZ 71.731 542.3014 null] +>> endobj +7703 0 obj << +/D [7675 0 R /XYZ 139.477 526.5255 null] +>> endobj +7704 0 obj << +/D [7675 0 R /XYZ 139.477 526.5255 null] +>> endobj +7705 0 obj << +/D [7675 0 R /XYZ 71.731 524.3687 null] +>> endobj +7706 0 obj << +/D [7675 0 R /XYZ 139.477 508.5928 null] +>> endobj +7707 0 obj << +/D [7675 0 R /XYZ 139.477 508.5928 null] +>> endobj +7708 0 obj << +/D [7675 0 R /XYZ 71.731 507.1532 null] +>> endobj +7709 0 obj << +/D [7675 0 R /XYZ 139.477 490.66 null] +>> endobj +7710 0 obj << +/D [7675 0 R /XYZ 139.477 490.66 null] +>> endobj +7711 0 obj << +/D [7675 0 R /XYZ 71.731 488.5032 null] +>> endobj +7712 0 obj << +/D [7675 0 R /XYZ 139.477 472.7273 null] +>> endobj +7713 0 obj << +/D [7675 0 R /XYZ 139.477 472.7273 null] +>> endobj +7714 0 obj << +/D [7675 0 R /XYZ 71.731 471.2877 null] +>> endobj +7715 0 obj << +/D [7675 0 R /XYZ 139.477 454.7945 null] +>> endobj +7716 0 obj << +/D [7675 0 R /XYZ 139.477 454.7945 null] +>> endobj +7717 0 obj << +/D [7675 0 R /XYZ 71.731 453.355 null] +>> endobj +7718 0 obj << +/D [7675 0 R /XYZ 139.477 436.8618 null] +>> endobj +7719 0 obj << +/D [7675 0 R /XYZ 139.477 436.8618 null] +>> endobj +7720 0 obj << +/D [7675 0 R /XYZ 71.731 434.7049 null] +>> endobj +7721 0 obj << +/D [7675 0 R /XYZ 139.477 418.929 null] +>> endobj +7722 0 obj << +/D [7675 0 R /XYZ 139.477 418.929 null] +>> endobj +7723 0 obj << +/D [7675 0 R /XYZ 71.731 417.4895 null] +>> endobj +7724 0 obj << +/D [7675 0 R /XYZ 139.477 400.9962 null] +>> endobj +7725 0 obj << +/D [7675 0 R /XYZ 139.477 400.9962 null] +>> endobj +7726 0 obj << +/D [7675 0 R /XYZ 71.731 398.8394 null] +>> endobj +7727 0 obj << +/D [7675 0 R /XYZ 139.477 383.0635 null] +>> endobj +7728 0 obj << +/D [7675 0 R /XYZ 139.477 383.0635 null] +>> endobj +7729 0 obj << +/D [7675 0 R /XYZ 71.731 345.2055 null] +>> endobj +7730 0 obj << +/D [7675 0 R /XYZ 71.731 332.1545 null] +>> endobj +7731 0 obj << +/D [7675 0 R /XYZ 71.731 330.9092 null] +>> endobj +7732 0 obj << +/D [7675 0 R /XYZ 129.5143 311.8306 null] +>> endobj +905 0 obj << +/D [7675 0 R /XYZ 71.731 305.4098 null] +>> endobj +474 0 obj << +/D [7675 0 R /XYZ 294.2895 261.595 null] +>> endobj +7733 0 obj << +/D [7675 0 R /XYZ 71.731 238.1062 null] +>> endobj +7734 0 obj << +/D [7675 0 R /XYZ 161.0655 228.7183 null] +>> endobj +7735 0 obj << +/D [7675 0 R /XYZ 71.731 216.5988 null] +>> endobj +7736 0 obj << +/D [7675 0 R /XYZ 71.731 185.2329 null] +>> endobj +7737 0 obj << +/D [7675 0 R /XYZ 168.8063 174.2226 null] +>> endobj +7738 0 obj << +/D [7675 0 R /XYZ 71.731 147.1592 null] +>> endobj +7674 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7741 0 obj << +/Length 1024 +/Filter /FlateDecode +>> +stream +xÚÝXMÛ6½ï¯ÐÑV,?DRÊÍi“"E ,RçÔ- ­­Ȓ!Q»Í¿ïPõaђìA´ý†óæqf8+âaø#ž$H2xÐQÁ©·?Ýaï3üôûi!~‹ñ‡ ·Û»_Þ3ìE(TxÛgEqx’QrzÛÃ?«_ñY%åÚ§¯(2χ,Îõgüd>n>˜Å_‰:‡jýïö»wÛÎ?gE!8™%Ù¡¦4iä…@Sš&_9 ˜'qˆXÀdÃóS•”•aqŠ¿˜E‘gíª>b•˜u¬T™>­)|«’Ö¤x6Ï*K÷Ýwe÷ݚòÕ˚ðUçüÓýÑ,Õ1ѐÖc\¶îNÉé ̬r¾‰$ +"ù„ Ákþjʱêx¦—Âæ÷cÛols8¥ùep·êçMD)Gèãð֜¯PH0)ØÇDÕ¥¥DÌ#µªÕ{P­z®³6üç5u¦,3º|M«¤ÙºIÁ¾RüvéëJ‘Âdà&Ë +Më59˜->YR½éÌû ¶Öb"aÔXÇZ¾–Ë9m5$õ­î´qŸ(WãvXƒ„@Õp"=.0①5Ø¡ü!ÌÖ Ô§Ä¤©ÁÉnšÂ#¥|â—R(RB~/Ÿ=k5åÁBW/ñˆkutÈF„µ yÓ¦*뽺¿hcÚ>ÉUºUZäCd ¹? ÐR(‚»uµ €êe%º;ÂiQWU…“Ç4ˆ\N¯‹j&$ƚ²RŽ8l@Óܺr¨¹îKeÓü³UÖ!èÉlgLÑåûõ¼ÅÉ(âKy;€Í孅-ç­Ãï-y{ÉãJÞy4ogú$ôÈ]êR;ŠÅXì4·9üwß;Gý¶Åô)> endobj +7742 0 obj << +/D [7740 0 R /XYZ 71.731 729.2652 null] +>> endobj +7743 0 obj << +/D [7740 0 R /XYZ 71.731 718.3063 null] +>> endobj +7744 0 obj << +/D [7740 0 R /XYZ 71.731 679.9602 null] +>> endobj +7745 0 obj << +/D [7740 0 R /XYZ 71.731 647.1727 null] +>> endobj +7746 0 obj << +/D [7740 0 R /XYZ 181.5683 635.5168 null] +>> endobj +7747 0 obj << +/D [7740 0 R /XYZ 71.731 625.4546 null] +>> endobj +7748 0 obj << +/D [7740 0 R /XYZ 71.731 592.0315 null] +>> endobj +7749 0 obj << +/D [7740 0 R /XYZ 71.731 580.9216 null] +>> endobj +7750 0 obj << +/D [7740 0 R /XYZ 71.731 579.6763 null] +>> endobj +7751 0 obj << +/D [7740 0 R /XYZ 129.5143 560.5978 null] +>> endobj +7752 0 obj << +/D [7740 0 R /XYZ 129.5143 560.5978 null] +>> endobj +7753 0 obj << +/D [7740 0 R /XYZ 71.731 559.1582 null] +>> endobj +7754 0 obj << +/D [7740 0 R /XYZ 71.731 559.1582 null] +>> endobj +7755 0 obj << +/D [7740 0 R /XYZ 139.477 542.665 null] +>> endobj +7756 0 obj << +/D [7740 0 R /XYZ 139.477 542.665 null] +>> endobj +7757 0 obj << +/D [7740 0 R /XYZ 76.7123 524.7323 null] +>> endobj +7758 0 obj << +/D [7740 0 R /XYZ 129.5143 506.7995 null] +>> endobj +7759 0 obj << +/D [7740 0 R /XYZ 129.5143 506.7995 null] +>> endobj +7760 0 obj << +/D [7740 0 R /XYZ 71.731 505.36 null] +>> endobj +7761 0 obj << +/D [7740 0 R /XYZ 129.5143 488.8667 null] +>> endobj +7762 0 obj << +/D [7740 0 R /XYZ 129.5143 488.8667 null] +>> endobj +7763 0 obj << +/D [7740 0 R /XYZ 71.731 466.7846 null] +>> endobj +7764 0 obj << +/D [7740 0 R /XYZ 71.731 455.8905 null] +>> endobj +7765 0 obj << +/D [7740 0 R /XYZ 71.731 454.6452 null] +>> endobj +7766 0 obj << +/D [7740 0 R /XYZ 129.5143 435.5666 null] +>> endobj +906 0 obj << +/D [7740 0 R /XYZ 71.731 429.1458 null] +>> endobj +478 0 obj << +/D [7740 0 R /XYZ 333.4372 385.331 null] +>> endobj +7767 0 obj << +/D [7740 0 R /XYZ 71.731 361.8422 null] +>> endobj +7768 0 obj << +/D [7740 0 R /XYZ 161.0655 352.4543 null] +>> endobj +7769 0 obj << +/D [7740 0 R /XYZ 71.731 340.3348 null] +>> endobj +7770 0 obj << +/D [7740 0 R /XYZ 71.731 308.9689 null] +>> endobj +7771 0 obj << +/D [7740 0 R /XYZ 168.8063 297.9586 null] +>> endobj +7772 0 obj << +/D [7740 0 R /XYZ 71.731 270.8952 null] +>> endobj +7773 0 obj << +/D [7740 0 R /XYZ 71.731 254.4733 null] +>> endobj +7774 0 obj << +/D [7740 0 R /XYZ 71.731 223.5373 null] +>> endobj +7775 0 obj << +/D [7740 0 R /XYZ 181.5683 211.8814 null] +>> endobj +7776 0 obj << +/D [7740 0 R /XYZ 71.731 201.8193 null] +>> endobj +7777 0 obj << +/D [7740 0 R /XYZ 71.731 170.2476 null] +>> endobj +7778 0 obj << +/D [7740 0 R /XYZ 71.731 157.2863 null] +>> endobj +7779 0 obj << +/D [7740 0 R /XYZ 71.731 156.0409 null] +>> endobj +7780 0 obj << +/D [7740 0 R /XYZ 129.5143 136.9624 null] +>> endobj +7781 0 obj << +/D [7740 0 R /XYZ 129.5143 136.9624 null] +>> endobj +7782 0 obj << +/D [7740 0 R /XYZ 71.731 135.5228 null] +>> endobj +7783 0 obj << +/D [7740 0 R /XYZ 71.731 135.5228 null] +>> endobj +7784 0 obj << +/D [7740 0 R /XYZ 139.477 119.0296 null] +>> endobj +7785 0 obj << +/D [7740 0 R /XYZ 139.477 119.0296 null] +>> endobj +7786 0 obj << +/D [7740 0 R /XYZ 76.7123 101.0969 null] +>> endobj +7739 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7789 0 obj << +/Length 1272 +/Filter /FlateDecode +>> +stream +xÚ­X[£6~Ÿ_Ác"M\Û`æmzÕV]u´}êT“ *—ˆKg÷ßï_0Ä*ò>û|ç; †ñA‡/!Êõùö¾À­ßìfgƒ~|¾ûáW{Š8åÞóÉó#Ž˜<áS2zÏÇ¿7?ãK“TÛexC‘ü~Êâ"iþˆ_åÏǧòâcҜËc½ýçù÷»_ž}æ …`d–d@Bø8òv£ˆæD!ƈgpˆüÀÆy`G`Ò9cpÖyóB)›²#”€PÏÞP۝~<ôªk~è… *zà2#?æ7M•¾¶M²o¾]’}zܗվˆó¤#×{2„…øÔãìvK¤ÔiÑȋRŦ†‹/×Î)ó<Â(  ®STÚÙ°ATÒeíŒÝrÓ rÚ½-ª^åäaK¡@ˆ1 Pä^JñW–y)…ÞR¼±å_âJÃcR4é Æü¦p‚‚­. gÁæ„Ó°eáv×çàáΦ!3çj§“uÄ]ׇ”å„Š… +¶a3l`‹ì²»¢‚¯x¸+xÄcRÁ§4Édã›*N +8ÆÕ ’·‡ævÎA+ä"Z,V 6—s¶œs»krnÊc¬ŸÎ9›FžûªÌºÖçw;‹ëŽ§rôcZ¤y›Ë/˜á,‰kÕ/喲Í[RÚ nùogJeð9VÈC\¨`$“Vz8ÇŃOkW9Ü ÆHb±]X°¹ÐiØrèvׄnÊÃ:›ÆcŠãè:Ïß©µhEXà ‚}m،¾¶¨¯Ëî +}¯x8õÑ8&õ¡J/MZ®Ò ˆóP¼ƒÌ;Þ.$ˆEpÆ(đ$ó)iÚª¨n¶zF`UHøB«·a3­ÞÀ[½ËîŠVïâa5k“6¡ñ¨n’ž”ìíáÔ5t(à'L®}pwL ú~/(õ™<7("ÄïÆhn>_Žq“Èx]G:(¤´ëÆqÁåò§ªlÊ.†fŐNjíŽBŽP6Zۆé—qۜ•KuwÇ@G÷£œk}#½f¸Óm†?i5ÇÎRÆ©Í±Ö W½Äðgu£Tªë¶l Û|Më¦{Òòò-mΓýþë†8kµ¡´p¹ŠúZÀ@Ðʀϵa‘Çߝ"SWmOßÚlBøíœ,2ÀZ-Œ+µ*OòW° Ÿ®>LmÙÀýamÂ8iÛ×ÜLõCB +:ߏO;½¡ò2Ÿ3îËÉð¼y<ÂY¿Ú¡Þâ$¬çò§ÑÛèGu±d#¿î‹:²zdm怢TR½*|•‰œ#ŽCÕ¼Ú›¤3ÒË|¼¤•ÞØ$°.Ÿ©¼yY S‰ÊÆP©œ$ÿš> endobj +7790 0 obj << +/D [7788 0 R /XYZ 71.731 729.2652 null] +>> endobj +7791 0 obj << +/D [7788 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7792 0 obj << +/D [7788 0 R /XYZ 129.5143 708.3437 null] +>> endobj +7793 0 obj << +/D [7788 0 R /XYZ 71.731 706.1869 null] +>> endobj +7794 0 obj << +/D [7788 0 R /XYZ 71.731 706.1869 null] +>> endobj +7795 0 obj << +/D [7788 0 R /XYZ 139.477 690.4109 null] +>> endobj +7796 0 obj << +/D [7788 0 R /XYZ 71.731 688.2541 null] +>> endobj +7797 0 obj << +/D [7788 0 R /XYZ 139.477 672.4782 null] +>> endobj +7798 0 obj << +/D [7788 0 R /XYZ 76.7123 654.5454 null] +>> endobj +7799 0 obj << +/D [7788 0 R /XYZ 129.5143 636.6127 null] +>> endobj +7800 0 obj << +/D [7788 0 R /XYZ 129.5143 636.6127 null] +>> endobj +7801 0 obj << +/D [7788 0 R /XYZ 71.731 635.2319 null] +>> endobj +7802 0 obj << +/D [7788 0 R /XYZ 71.731 635.2319 null] +>> endobj +7803 0 obj << +/D [7788 0 R /XYZ 139.477 618.6799 null] +>> endobj +7804 0 obj << +/D [7788 0 R /XYZ 139.477 618.6799 null] +>> endobj +7805 0 obj << +/D [7788 0 R /XYZ 71.731 616.5231 null] +>> endobj +7806 0 obj << +/D [7788 0 R /XYZ 139.477 600.7472 null] +>> endobj +7807 0 obj << +/D [7788 0 R /XYZ 139.477 600.7472 null] +>> endobj +7808 0 obj << +/D [7788 0 R /XYZ 71.731 598.5904 null] +>> endobj +7809 0 obj << +/D [7788 0 R /XYZ 139.477 582.8144 null] +>> endobj +7810 0 obj << +/D [7788 0 R /XYZ 139.477 582.8144 null] +>> endobj +7811 0 obj << +/D [7788 0 R /XYZ 71.731 544.9564 null] +>> endobj +7812 0 obj << +/D [7788 0 R /XYZ 71.731 531.9054 null] +>> endobj +7813 0 obj << +/D [7788 0 R /XYZ 71.731 530.6601 null] +>> endobj +7814 0 obj << +/D [7788 0 R /XYZ 129.5143 511.5816 null] +>> endobj +907 0 obj << +/D [7788 0 R /XYZ 71.731 505.1607 null] +>> endobj +482 0 obj << +/D [7788 0 R /XYZ 222.915 461.3459 null] +>> endobj +7815 0 obj << +/D [7788 0 R /XYZ 71.731 437.8572 null] +>> endobj +7816 0 obj << +/D [7788 0 R /XYZ 161.0655 428.4692 null] +>> endobj +7817 0 obj << +/D [7788 0 R /XYZ 71.731 416.3497 null] +>> endobj +7818 0 obj << +/D [7788 0 R /XYZ 71.731 384.9839 null] +>> endobj +7819 0 obj << +/D [7788 0 R /XYZ 168.8063 373.9736 null] +>> endobj +7820 0 obj << +/D [7788 0 R /XYZ 71.731 346.9101 null] +>> endobj +7821 0 obj << +/D [7788 0 R /XYZ 71.731 315.5443 null] +>> endobj +7822 0 obj << +/D [7788 0 R /XYZ 71.731 272.3064 null] +>> endobj +7823 0 obj << +/D [7788 0 R /XYZ 71.731 245.8641 null] +>> endobj +7824 0 obj << +/D [7788 0 R /XYZ 71.731 213.0765 null] +>> endobj +7825 0 obj << +/D [7788 0 R /XYZ 181.5683 201.4207 null] +>> endobj +7826 0 obj << +/D [7788 0 R /XYZ 71.731 191.3585 null] +>> endobj +7827 0 obj << +/D [7788 0 R /XYZ 71.731 157.9353 null] +>> endobj +7828 0 obj << +/D [7788 0 R /XYZ 71.731 146.8255 null] +>> endobj +7829 0 obj << +/D [7788 0 R /XYZ 71.731 145.5802 null] +>> endobj +7830 0 obj << +/D [7788 0 R /XYZ 129.5143 126.5016 null] +>> endobj +7831 0 obj << +/D [7788 0 R /XYZ 129.5143 126.5016 null] +>> endobj +7832 0 obj << +/D [7788 0 R /XYZ 71.731 125.0621 null] +>> endobj +7833 0 obj << +/D [7788 0 R /XYZ 71.731 125.0621 null] +>> endobj +7834 0 obj << +/D [7788 0 R /XYZ 139.477 108.5689 null] +>> endobj +7835 0 obj << +/D [7788 0 R /XYZ 139.477 108.5689 null] +>> endobj +7787 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7838 0 obj << +/Length 1432 +/Filter /FlateDecode +>> +stream +xڕXßo¤6~Ï_Á[w¥¬‹ &o×^[]uWEiîT©©"Þ]+,l1Ü&ÿ} جó£ÊÃ{¾ùæ›ñt\ù‚À“?(È'ȉO7®s~»Êd§lv¦ÑO7?þê¹NBùÎãÞñB;‡%:ÉߛŸÑ¹dÅv‡ˆ»A ý½O£Œ•Ÿ£—öß÷ŸÚ‹/¬<æ‰ØþóøûÍ/â ¤ÒÉ,H )Àž:;JÿسZAB`àìüÐJ{ +é'paLgיÕÑnpȐ ”Áôpˆ”Çì™'ÏyñœE'Vcj¸fƒR@ü€Joõ‚»–`ž•íE®2"ʂg‡qHÚi€¨ðÎjgš]©„µfz!h³I*¥r\„C«ßi*õ*+Ž+#Ð åÓ C2rÛRñgÍ©¢)aYɟ\IåNrC0 ˜à%n ³9n´Ù27¿k¸±à°pcÂhÅ1¦G+®¯«Y†~†KÕg˜ÍUŸ6[®>‹ß5Õ7Ä1Q}&Ž¶úöœ¥m¯péÀŔô+OrYÅ崘\8X,4ÃlNLÚlYL¿kÄ4ÄÑgM‹É„Q©…«šVυ#®®ºûúð¹½ØWEyÔ'IÂD\ð—ºw5ÿ—G.ÔâF§S<*Ï&ˆ—ŠÖ4›á¹3[äÙæwÏ#Vž{0NÑÛs–K~,l„ò Šé/Ñ?U'UãÕéE“ïÕ½f[Åw¤N’8ÊڋÕ"!ø!c‰2Ìÿg‚| (••¿ Ãl.AÚl9A¿k4ÄaO ƒg¢Œäñ•<Ï,IªO'D½™’0OªÞfÊ4*gøÅ>1 —ø5ÌæøÕfËüZü®áwˆÃί ƒ½ya•?vÄ!žÒÿǚ·V™V/?©[—#ËLý6—l ɦuw«wSF,γD+žgzÅ×?>ý¥Öžóø8&yáBé<0ÍæҤ͖Ódñ»&MCö4™0Ú~ž(ߧÁº"låì(Dæy'ûuCÒìñÀʪÈÄÝäà‚Iê-½6˜f3ƒKg¶8¸Øü®\l8ŒsU§¾‡ãªu¨äª:»¨â˜ ±¯ô-ñAÒäo§÷¨ Eñ›Í€×/tÝ|Û֊.øþý~ëÕWuakfq(r%‘õ[bà·=ñ¾È˼|?³»nÅU>jíIM@Uä߶Bå‘B÷¾'—¸QUU”çæ‘zOb§ˆ§êÁ÷Ÿ\]øqÓ;Ÿ_·PôûÖ'›iC£è¥;h q§›!~¼Št.HO¾Cûh¤êKêf[D6—kȧJ”ýC8á"zIYÒ lîT‚?l‰L‹ê?»šµo’ÈhÄ ùM¤.Ë®‰4ÅåJŒ²¼(lUði¿ŠÑVmBÏ +­8³¸}ÍJnõ˜ Û¬-Ö5N.h<êE+à´Äç#Ãmÿ,éíóâԟÈI)Ï^ûÛ©¦>±œ£³æ¯CÞ3Uó*MúÔk)–“¿¼ëÁ0M-óù¾Êâë°¶déH¯©©…±ï–/׫J„–£^/HMËe|ÔCí¥j‘ÐIëŽ}C-£Ì ‹K©c,êl\|c…¦?ÓXÕa:Ò_ΚÆ×±WÏyQv-Þ"_›Ü„.û+&ʎû¨ï©ÈSVw•[=í¿IfcTݗ¦Ôµ!éØXVwªÁ]yiì¾|O |ó$·dÝcÅLȕw Lö™(å XÛÑ?¤iÞ4'-‹IX{‚Eɉgá@}hÅT¾Ïùáì·XÃfü)–È1A¢Ô6µ?ˆ‚Éïªÿv3yendstream +endobj +7837 0 obj << +/Type /Page +/Contents 7838 0 R +/Resources 7836 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7615 0 R +>> endobj +7839 0 obj << +/D [7837 0 R /XYZ 71.731 729.2652 null] +>> endobj +7840 0 obj << +/D [7837 0 R /XYZ 76.7123 708.3437 null] +>> endobj +7841 0 obj << +/D [7837 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7842 0 obj << +/D [7837 0 R /XYZ 129.5143 690.4109 null] +>> endobj +7843 0 obj << +/D [7837 0 R /XYZ 71.731 688.2541 null] +>> endobj +7844 0 obj << +/D [7837 0 R /XYZ 71.731 688.2541 null] +>> endobj +7845 0 obj << +/D [7837 0 R /XYZ 139.477 672.4782 null] +>> endobj +7846 0 obj << +/D [7837 0 R /XYZ 71.731 671.0386 null] +>> endobj +7847 0 obj << +/D [7837 0 R /XYZ 139.477 654.5454 null] +>> endobj +7848 0 obj << +/D [7837 0 R /XYZ 76.7123 636.6127 null] +>> endobj +7849 0 obj << +/D [7837 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7850 0 obj << +/D [7837 0 R /XYZ 129.5143 618.6799 null] +>> endobj +7851 0 obj << +/D [7837 0 R /XYZ 71.731 617.5009 null] +>> endobj +7852 0 obj << +/D [7837 0 R /XYZ 71.731 617.5009 null] +>> endobj +7853 0 obj << +/D [7837 0 R /XYZ 139.477 600.7472 null] +>> endobj +7854 0 obj << +/D [7837 0 R /XYZ 139.477 600.7472 null] +>> endobj +7855 0 obj << +/D [7837 0 R /XYZ 71.731 598.5904 null] +>> endobj +7856 0 obj << +/D [7837 0 R /XYZ 139.477 582.8144 null] +>> endobj +7857 0 obj << +/D [7837 0 R /XYZ 139.477 582.8144 null] +>> endobj +7858 0 obj << +/D [7837 0 R /XYZ 71.731 580.6576 null] +>> endobj +7859 0 obj << +/D [7837 0 R /XYZ 139.477 564.8817 null] +>> endobj +7860 0 obj << +/D [7837 0 R /XYZ 139.477 564.8817 null] +>> endobj +7861 0 obj << +/D [7837 0 R /XYZ 71.731 562.7248 null] +>> endobj +7862 0 obj << +/D [7837 0 R /XYZ 139.477 546.9489 null] +>> endobj +7863 0 obj << +/D [7837 0 R /XYZ 139.477 546.9489 null] +>> endobj +7864 0 obj << +/D [7837 0 R /XYZ 71.731 544.7921 null] +>> endobj +7865 0 obj << +/D [7837 0 R /XYZ 139.477 529.0162 null] +>> endobj +7866 0 obj << +/D [7837 0 R /XYZ 139.477 529.0162 null] +>> endobj +7867 0 obj << +/D [7837 0 R /XYZ 71.731 491.1581 null] +>> endobj +7868 0 obj << +/D [7837 0 R /XYZ 71.731 478.1072 null] +>> endobj +7869 0 obj << +/D [7837 0 R /XYZ 71.731 476.8618 null] +>> endobj +7870 0 obj << +/D [7837 0 R /XYZ 129.5143 457.7833 null] +>> endobj +908 0 obj << +/D [7837 0 R /XYZ 71.731 451.3624 null] +>> endobj +486 0 obj << +/D [7837 0 R /XYZ 228.9404 407.5477 null] +>> endobj +7871 0 obj << +/D [7837 0 R /XYZ 71.731 384.0589 null] +>> endobj +7872 0 obj << +/D [7837 0 R /XYZ 161.0655 374.671 null] +>> endobj +7873 0 obj << +/D [7837 0 R /XYZ 71.731 362.5515 null] +>> endobj +7874 0 obj << +/D [7837 0 R /XYZ 71.731 331.1856 null] +>> endobj +7875 0 obj << +/D [7837 0 R /XYZ 168.8063 320.1753 null] +>> endobj +7876 0 obj << +/D [7837 0 R /XYZ 71.731 293.1119 null] +>> endobj +7877 0 obj << +/D [7837 0 R /XYZ 71.731 261.746 null] +>> endobj +7878 0 obj << +/D [7837 0 R /XYZ 71.731 218.5082 null] +>> endobj +7879 0 obj << +/D [7837 0 R /XYZ 71.731 178.558 null] +>> endobj +7880 0 obj << +/D [7837 0 R /XYZ 71.731 146.9764 null] +>> endobj +7881 0 obj << +/D [7837 0 R /XYZ 181.5683 135.9661 null] +>> endobj +7882 0 obj << +/D [7837 0 R /XYZ 71.731 125.9039 null] +>> endobj +7836 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7885 0 obj << +/Length 1044 +/Filter /FlateDecode +>> +stream +xڕX]£6}Ÿ_Ác"ÛÛó6Ým«V³U4J¥JÕˆ&ž Ú"`vš¿×Á&ÌÇ*ŠøÈ1÷p|ÎÅ|pÀ1â6D"’0ìNwQð~úýHh0¡ úe{÷óo4 +$’ I‚ík@e‚N  ‹`»ÿwõᐞkU®C¢AÍvsLsU?¦ÿ5‡›?šOª>ûjýyûçݯ۶>£IE&I¶¨!M"šKÄ揢1åWž›5f«´LO +ØV÷} +í D@Q/…º0KÎðw(´0Má™6¨KpÄÄ[·¿½ñ°£†<¨H‘ÄW Ã1íòHßêƒæÑӍÄ(Ò4侙¯ª.ßvõO½YÔãU^g»´ÎŠÜE¾•jxƒ–B¥g~a-*ta7a±¶gç†,lTX0iDbé­;.¬5äÑ–JsÞ¥ñº4÷¨Ë”Äž¾¾YþÅêë‘õÔ\îº_Íö­Rãî¥1s̙÷†šò®AÍ[wXt‰s{$FŒë8Cp‹ü%Û¿å‹:¥ÙÑ£³”ˆ’¾ÎY^7;Eé +?îUœ ,$óª›òª…Í{ÕSw‰W=<œ~h½êÒEŒíþ®l÷ÎöÚ~ÏQDà̘4L +DX2c6!M ›•ÆWw4>Ci:4:¡Ü”Ù)-/́ +¯¦kšà~_ªªM"KÀèÏ$ÑAM$Ñ¢f“è)º ‰}þ$º$¾©2{5ê嫺xr( ‡pññv÷¤*eRyN«ê}u> endobj +7886 0 obj << +/D [7884 0 R /XYZ 71.731 729.2652 null] +>> endobj +7887 0 obj << +/D [7884 0 R /XYZ 71.731 741.2204 null] +>> endobj +7888 0 obj << +/D [7884 0 R /XYZ 71.731 718.3063 null] +>> endobj +7889 0 obj << +/D [7884 0 R /XYZ 71.731 708.2442 null] +>> endobj +7890 0 obj << +/D [7884 0 R /XYZ 71.731 706.9988 null] +>> endobj +7891 0 obj << +/D [7884 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7892 0 obj << +/D [7884 0 R /XYZ 129.5143 687.9203 null] +>> endobj +7893 0 obj << +/D [7884 0 R /XYZ 71.731 686.4807 null] +>> endobj +7894 0 obj << +/D [7884 0 R /XYZ 71.731 686.4807 null] +>> endobj +7895 0 obj << +/D [7884 0 R /XYZ 139.477 669.9875 null] +>> endobj +7896 0 obj << +/D [7884 0 R /XYZ 139.477 669.9875 null] +>> endobj +7897 0 obj << +/D [7884 0 R /XYZ 76.7123 652.0548 null] +>> endobj +7898 0 obj << +/D [7884 0 R /XYZ 129.5143 634.122 null] +>> endobj +7899 0 obj << +/D [7884 0 R /XYZ 129.5143 634.122 null] +>> endobj +7900 0 obj << +/D [7884 0 R /XYZ 71.731 631.9652 null] +>> endobj +7901 0 obj << +/D [7884 0 R /XYZ 71.731 631.9652 null] +>> endobj +7902 0 obj << +/D [7884 0 R /XYZ 139.477 616.1893 null] +>> endobj +7903 0 obj << +/D [7884 0 R /XYZ 71.731 614.7497 null] +>> endobj +7904 0 obj << +/D [7884 0 R /XYZ 139.477 598.2565 null] +>> endobj +7905 0 obj << +/D [7884 0 R /XYZ 76.7123 580.3238 null] +>> endobj +7906 0 obj << +/D [7884 0 R /XYZ 129.5143 562.391 null] +>> endobj +7907 0 obj << +/D [7884 0 R /XYZ 129.5143 562.391 null] +>> endobj +7908 0 obj << +/D [7884 0 R /XYZ 71.731 560.2342 null] +>> endobj +7909 0 obj << +/D [7884 0 R /XYZ 129.5143 544.4583 null] +>> endobj +7910 0 obj << +/D [7884 0 R /XYZ 129.5143 544.4583 null] +>> endobj +7911 0 obj << +/D [7884 0 R /XYZ 71.731 522.3762 null] +>> endobj +7912 0 obj << +/D [7884 0 R /XYZ 71.731 511.482 null] +>> endobj +7913 0 obj << +/D [7884 0 R /XYZ 71.731 510.2367 null] +>> endobj +7914 0 obj << +/D [7884 0 R /XYZ 129.5143 491.1581 null] +>> endobj +909 0 obj << +/D [7884 0 R /XYZ 71.731 484.02 null] +>> endobj +490 0 obj << +/D [7884 0 R /XYZ 284.1324 440.9225 null] +>> endobj +7915 0 obj << +/D [7884 0 R /XYZ 71.731 417.4337 null] +>> endobj +7916 0 obj << +/D [7884 0 R /XYZ 161.0655 408.0458 null] +>> endobj +7917 0 obj << +/D [7884 0 R /XYZ 71.731 395.9263 null] +>> endobj +7918 0 obj << +/D [7884 0 R /XYZ 71.731 364.5604 null] +>> endobj +7919 0 obj << +/D [7884 0 R /XYZ 168.8063 353.5502 null] +>> endobj +7920 0 obj << +/D [7884 0 R /XYZ 71.731 341.4307 null] +>> endobj +7921 0 obj << +/D [7884 0 R /XYZ 71.731 310.0648 null] +>> endobj +7922 0 obj << +/D [7884 0 R /XYZ 181.5683 299.0545 null] +>> endobj +7923 0 obj << +/D [7884 0 R /XYZ 71.731 288.9923 null] +>> endobj +7924 0 obj << +/D [7884 0 R /XYZ 71.731 269.0671 null] +>> endobj +7925 0 obj << +/D [7884 0 R /XYZ 71.731 256.1156 null] +>> endobj +7926 0 obj << +/D [7884 0 R /XYZ 71.731 254.8703 null] +>> endobj +7927 0 obj << +/D [7884 0 R /XYZ 129.5143 235.7918 null] +>> endobj +7928 0 obj << +/D [7884 0 R /XYZ 71.731 215.7669 null] +>> endobj +7929 0 obj << +/D [7884 0 R /XYZ 71.731 202.8155 null] +>> endobj +7930 0 obj << +/D [7884 0 R /XYZ 71.731 201.5702 null] +>> endobj +7931 0 obj << +/D [7884 0 R /XYZ 129.5143 182.4916 null] +>> endobj +910 0 obj << +/D [7884 0 R /XYZ 71.731 175.3535 null] +>> endobj +7883 0 obj << +/Font << /F30 622 0 R /F29 532 0 R /F38 925 0 R /F21 514 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7935 0 obj << +/Length 805 +/Filter /FlateDecode +>> +stream +xÚÅWMs›0¼ûWЛ=T= }™ÒïtڙLê[Ӎ•˜© ¤Nš_ #Û\ÚN{¥Ý·ï±Áaû‘$¨½ÎHt¿áèÑ~õa-$n1±z½œ½|Oq”¢”-"šrÄD Jd £åêÛüÍ:ÛU-bÂðœ w½Ùd…2Ÿ³îöêæÚ-¾(³.Wzñ}ùiönÙó3*P*-ÉI‘=j,“@`I­³«s ÒF&±K^«r®ŸµQ[´mÄ|T›]­Ç’zµ&I‚E×µ +.šCnªÒ”æy§.ûÒîà k»7&€8HÇ:fjl¸Ã »Ïì +ìqw˜ÏþVéû*ߙ¼,¦òß*ó«*´c]÷üF-€Íw—?¸ëJÝaL +µr·eÛT³Vná$»õ.ÓZ­.ÜMi!ÕS®[\å³f…»ªíÎ<»¥6U^<¢©u_m6傰ùS§ì¶Ü(ÝX`#N,”¦‰kP]WVeV©ªğ3€1"bÛQœ³û07gidgP`¨ÅŽO«%ÜÂF¼„ š ò^÷:º]cTzû40HèPGÛ¬±Ç”! ’XŽvé·äÂJݺ°^6NÇ C8År؛vÀŽ;Ø‰KqÆhuÂçuÖæé—"ö®õ&û"Žº¶Þ‡Ê ™b&”Ö-E„2Þg“eÓ×ü±È¬ÁêßԞî?¦T—YUem^”m@ý,\´ÝÉÕ{½'v7馔 ùÖ̽—tí?¶ëö0«$¨!s½ªs l…ŒÓ¦Â^ùE(!»# {ºërŒÒæP­í®[½x5ªÕ”]”ußîÜæZÛ)=Ð[ûð?$Fv$’3ÁàÃN$C; !Þ Ù0ÒNàŽ¿ÀrZˆò„œsڃrºƒw:À;Å逎@ t{ڜ͎j?V‡Ú»ÓqŠ +,ìY‡Š}ØÞ3¨_>Z;ØQÏlC1IÒ ïqϺ]AžgÔ~+ÄP†·C!í›s"‘žžü©àaÆ¿¡SÉû“jJëÇÑÿã92endstream +endobj +7934 0 obj << +/Type /Page +/Contents 7935 0 R +/Resources 7933 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7932 0 R +>> endobj +7936 0 obj << +/D [7934 0 R /XYZ 71.731 729.2652 null] +>> endobj +912 0 obj << +/D [7934 0 R /XYZ 71.731 741.2204 null] +>> endobj +494 0 obj << +/D [7934 0 R /XYZ 287.9544 706.1179 null] +>> endobj +7937 0 obj << +/D [7934 0 R /XYZ 71.731 682.6291 null] +>> endobj +7938 0 obj << +/D [7934 0 R /XYZ 161.0655 673.2412 null] +>> endobj +7939 0 obj << +/D [7934 0 R /XYZ 71.731 661.1217 null] +>> endobj +7940 0 obj << +/D [7934 0 R /XYZ 71.731 575.2602 null] +>> endobj +7941 0 obj << +/D [7934 0 R /XYZ 181.5683 564.2499 null] +>> endobj +7942 0 obj << +/D [7934 0 R /XYZ 71.731 554.1877 null] +>> endobj +7943 0 obj << +/D [7934 0 R /XYZ 71.731 534.2624 null] +>> endobj +7944 0 obj << +/D [7934 0 R /XYZ 71.731 521.311 null] +>> endobj +7945 0 obj << +/D [7934 0 R /XYZ 71.731 520.0657 null] +>> endobj +7946 0 obj << +/D [7934 0 R /XYZ 129.5143 500.9871 null] +>> endobj +7947 0 obj << +/D [7934 0 R /XYZ 129.5143 500.9871 null] +>> endobj +7948 0 obj << +/D [7934 0 R /XYZ 71.731 478.905 null] +>> endobj +7949 0 obj << +/D [7934 0 R /XYZ 71.731 468.0109 null] +>> endobj +7950 0 obj << +/D [7934 0 R /XYZ 71.731 466.7656 null] +>> endobj +7951 0 obj << +/D [7934 0 R /XYZ 129.5143 447.687 null] +>> endobj +911 0 obj << +/D [7934 0 R /XYZ 71.731 440.5489 null] +>> endobj +498 0 obj << +/D [7934 0 R /XYZ 330.0457 397.4514 null] +>> endobj +7952 0 obj << +/D [7934 0 R /XYZ 71.731 373.6958 null] +>> endobj +7953 0 obj << +/D [7934 0 R /XYZ 161.0655 364.5747 null] +>> endobj +7954 0 obj << +/D [7934 0 R /XYZ 71.731 352.4552 null] +>> endobj +7955 0 obj << +/D [7934 0 R /XYZ 71.731 321.0893 null] +>> endobj +7956 0 obj << +/D [7934 0 R /XYZ 168.8063 310.079 null] +>> endobj +7957 0 obj << +/D [7934 0 R /XYZ 71.731 297.9596 null] +>> endobj +7958 0 obj << +/D [7934 0 R /XYZ 71.731 254.9374 null] +>> endobj +7959 0 obj << +/D [7934 0 R /XYZ 181.5683 243.9271 null] +>> endobj +7960 0 obj << +/D [7934 0 R /XYZ 71.731 233.8649 null] +>> endobj +7961 0 obj << +/D [7934 0 R /XYZ 71.731 213.9397 null] +>> endobj +7962 0 obj << +/D [7934 0 R /XYZ 71.731 200.9882 null] +>> endobj +7963 0 obj << +/D [7934 0 R /XYZ 71.731 199.7429 null] +>> endobj +7964 0 obj << +/D [7934 0 R /XYZ 129.5143 180.6644 null] +>> endobj +7965 0 obj << +/D [7934 0 R /XYZ 129.5143 180.6644 null] +>> endobj +7966 0 obj << +/D [7934 0 R /XYZ 71.731 158.5822 null] +>> endobj +7967 0 obj << +/D [7934 0 R /XYZ 71.731 147.6881 null] +>> endobj +7968 0 obj << +/D [7934 0 R /XYZ 71.731 146.4428 null] +>> endobj +7969 0 obj << +/D [7934 0 R /XYZ 129.5143 127.3642 null] +>> endobj +7970 0 obj << +/D [7934 0 R /XYZ 71.731 125.2074 null] +>> endobj +7971 0 obj << +/D [7934 0 R /XYZ 71.731 125.2074 null] +>> endobj +7972 0 obj << +/D [7934 0 R /XYZ 139.477 109.4315 null] +>> endobj +7933 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +7975 0 obj << +/Length 1059 +/Filter /FlateDecode +>> +stream +xڝWËnã6Ýç+´‹ Œ8|ˆ¯ì¦é´h1S©fºÐØt,TC¦AÑ/%‘2eQ’[dA::¼çÜë+Pÿ¡€#À‰°˜Qì³;¼èG?Þ! &tAßíîÞÿ@` d˜»c@$”G'ŠD°;|Ù<žâs­Êmˆ)Ü`ЏOiœ«úSü­ÿùáé§~òYÕ§âPmßý|÷q7ðSšdQ䀚ÊÄ(@`D£V§É†Q¨“‰B¢UÇŦz«j•l‹á¦Iëd§i+IǑNºC„mºœñ.ÎSYÔEývVà +¡W°ŽØ¬ 1 Éo¹žÎ‡¯ÂöW¥'ÈCÚH.õ÷ªÚ—ɹNŠ|‰œèMbXZµ{UU=iœ›±,ã·~Zû±ÓòÎÂý¤TuSæ«kKUéä*³óm¤~ZŠ&5±¾)ó¿ºlöu5ŽPŸÌÓcQfmfz¿C‚ˆuiü}Ÿu…óKœ©û‡!R’¿Í÷縌³Ê>ëTþ3ŽD»HãýɕÝÏ_»1*ÑbʱæØjºT…‰ÞΉû"¯cýü*—ãÏ-¦›8m”‘\”ãè1ÿٗãéšä±8 Ö$ym}žÿÚÙ56op1ÀïcîN‰Ù;6•:6Ɵד2•ðV4ý$WÊlr]ôcÿÑÒñiq½ßU6¼ûK¹¼j닦ž[T-L-þ¬ëíÆ×æCš­÷¯Væs‘ªêÁæi(‘Qÿºl‘Þ#]IJw´â¶)„$ ñ€`mEÈÛ¦TèÂú6%ÝÂ8D­Øi´VÂWŒé„c@"„½¼×ãE‡]5ÕA„Ó7n¦Ed¬£ß˜©ÅL„š¢E=ÌvSϓL,€#AüZTèÂ.¢¶»”[جƒº Ž¤—wÞA»jªcì ‘ â|,£ïHI8“Ìç £›wî‡Ò>Û"±yi2•×Õ¬£XBÀ¥+Žº°Gت£>ޝèð::’qùx\¥ `!®êrôp-ÍM}”ÐëPԞ. ÐôçîË·Ðp7Á|¥¸°…0ÀV€÷†àÓq±î²é®Ï;%µ ÒöQû[yÕ1ìNCr­0ØRaZØzazxo)LÇ+[˜®ŒE«ælÑ}0ÁñŠ-.lÁ–¶j‹÷[|:¦¶ŒdÌԅ…2 +8"þº(Oú×±f³¾:莏u>{»j*cÜ­"-C_ŽÆ:ŽöXæëVH(Ѹ[]Žm¿}þ>?=šÃŸ=ÂÙ£fÑëiweA|ÅSµà©E­{êa½ÅÓk3žº:Ž—£¬ÇU¦/y\òÿãêAéó{z¢¹HFè·\¼9;˜éřb lˆÔêCÎރ=ŒÿS¢®endstream +endobj +7974 0 obj << +/Type /Page +/Contents 7975 0 R +/Resources 7973 0 R +/MediaBox [0 0 609.7136 789.0411] +/Parent 7932 0 R +>> endobj +7976 0 obj << +/D [7974 0 R /XYZ 71.731 729.2652 null] +>> endobj +502 0 obj << +/D [7974 0 R /XYZ 257.982 658.1081 null] +>> endobj +7977 0 obj << +/D [7974 0 R /XYZ 71.731 634.6193 null] +>> endobj +7978 0 obj << +/D [7974 0 R /XYZ 161.0655 625.2314 null] +>> endobj +7979 0 obj << +/D [7974 0 R /XYZ 71.731 613.1119 null] +>> endobj +7980 0 obj << +/D [7974 0 R /XYZ 71.731 581.746 null] +>> endobj +7981 0 obj << +/D [7974 0 R /XYZ 168.8063 570.7357 null] +>> endobj +7982 0 obj << +/D [7974 0 R /XYZ 71.731 543.6723 null] +>> endobj +7983 0 obj << +/D [7974 0 R /XYZ 71.731 512.3064 null] +>> endobj +7984 0 obj << +/D [7974 0 R /XYZ 71.731 480.7248 null] +>> endobj +7985 0 obj << +/D [7974 0 R /XYZ 71.731 449.1433 null] +>> endobj +7986 0 obj << +/D [7974 0 R /XYZ 71.731 432.5057 null] +>> endobj +7987 0 obj << +/D [7974 0 R /XYZ 71.731 400.9241 null] +>> endobj +7988 0 obj << +/D [7974 0 R /XYZ 181.5683 389.9138 null] +>> endobj +7989 0 obj << +/D [7974 0 R /XYZ 71.731 379.8516 null] +>> endobj +7990 0 obj << +/D [7974 0 R /XYZ 71.731 359.9264 null] +>> endobj +7991 0 obj << +/D [7974 0 R /XYZ 71.731 346.9749 null] +>> endobj +7992 0 obj << +/D [7974 0 R /XYZ 71.731 345.7296 null] +>> endobj +7993 0 obj << +/D [7974 0 R /XYZ 129.5143 326.6511 null] +>> endobj +7994 0 obj << +/D [7974 0 R /XYZ 129.5143 326.6511 null] +>> endobj +7995 0 obj << +/D [7974 0 R /XYZ 71.731 324.4942 null] +>> endobj +7996 0 obj << +/D [7974 0 R /XYZ 71.731 324.4942 null] +>> endobj +7997 0 obj << +/D [7974 0 R /XYZ 139.477 308.7183 null] +>> endobj +7998 0 obj << +/D [7974 0 R /XYZ 139.477 308.7183 null] +>> endobj +7999 0 obj << +/D [7974 0 R /XYZ 71.731 306.5615 null] +>> endobj +8000 0 obj << +/D [7974 0 R /XYZ 139.477 290.7855 null] +>> endobj +8001 0 obj << +/D [7974 0 R /XYZ 139.477 290.7855 null] +>> endobj +8002 0 obj << +/D [7974 0 R /XYZ 71.731 252.9275 null] +>> endobj +8003 0 obj << +/D [7974 0 R /XYZ 71.731 239.8765 null] +>> endobj +8004 0 obj << +/D [7974 0 R /XYZ 71.731 238.6312 null] +>> endobj +8005 0 obj << +/D [7974 0 R /XYZ 129.5143 219.5527 null] +>> endobj +8006 0 obj << +/D [7974 0 R /XYZ 71.731 217.3958 null] +>> endobj +8007 0 obj << +/D [7974 0 R /XYZ 71.731 217.3958 null] +>> endobj +8008 0 obj << +/D [7974 0 R /XYZ 139.477 201.6199 null] +>> endobj +8009 0 obj << +/D [7974 0 R /XYZ 71.731 199.4631 null] +>> endobj +8010 0 obj << +/D [7974 0 R /XYZ 139.477 183.6872 null] +>> endobj +8011 0 obj << +/D [7974 0 R /XYZ 71.731 183.5876 null] +>> endobj +8012 0 obj << +/D [7974 0 R /XYZ 71.731 183.5876 null] +>> endobj +8013 0 obj << +/D [7974 0 R /XYZ 149.4396 165.7544 null] +>> endobj +8014 0 obj << +/D [7974 0 R /XYZ 149.4396 165.7544 null] +>> endobj +8015 0 obj << +/D [7974 0 R /XYZ 71.731 164.3149 null] +>> endobj +8016 0 obj << +/D [7974 0 R /XYZ 149.4396 147.8217 null] +>> endobj +8017 0 obj << +/D [7974 0 R /XYZ 149.4396 147.8217 null] +>> endobj +7973 0 obj << +/Font << /F30 622 0 R /F21 514 0 R /F29 532 0 R /F38 925 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +978 0 obj << +/Length1 756 +/Length2 667 +/Length3 532 +/Length 1211 +/Filter /FlateDecode +>> +stream +xÚíRkPWµU ,´¶‚‘ŒQ0É.2Ä (ˆÊ+ñ1ËîMXIvòÁ±Ú‚Ñø`Êc*ÒZbÓÖ)‚Å‚6"Tm‡Ô ¦` bQ”ZŠ"m» ŽSüÙþêtïŸýî9÷ÜsÏ÷ùy'¨D +’IƒQ ͉01&‘±ª ˜Eüü"YˆsC¯Ä9(Xh( À¤•ÉƒP¹T†øHFob)M:E.ž ɀBYŠÀi‹séPÇk¸¨‚‚œI Z-PNœÈJ˜ÙlHŠ $Ep j(‘L8Š¡Õ =Þ& ú§P6d³xS`or1à-’ ­5ªIÃßy'ÿ†©©âQ­6×MÈO¦ôŽë(­é ƒÑé dA,CB–žJÝ›‹…$eÐMEc8\K +Z£…@„-£ÁÒǕE!™@qD:PãÚ,8¹irª>¾I#’ˆ˜øÄ(Uà“¾N‚ 8EsëMzÐgìÉ{Vó)±”¤¢bÅx"¿žþm™rÙ*š`HŠÖ€ iÀY7!üñ•äb€¢IhÐÈ;–ˆi†ã>š< fXd¢­Ah&& ²0ÓÀ÷„G‘çŸÁsEA¡@ÂËcXÉ¤y#–…4791|(Ok5Å ¡HgC,Û»½ìô›'óWUµà qkûøV§Ó¹ ùG)2O%­LôÖpÕ·÷Ö´ +2lkˆe%nìçs-q¶Ž¼çöQùݚ‡ ¤ÍâïUÓséËãþ·c¬™ÉåoôΓ7³}oïóYÒ9Ⳬ͵’ˆØTÕ4ÚÓá2+@Y°ÀSÖYëÔý©ûç«ó‡v•µ.'†¾éZ“ Ȋ2ûÛÔa.i#øƒÈu¶Í˜xSqÞ>лÃüóÕøÍ©Æ;¢…~¿^PÕï›óçå^»¤w|W4h9~g¼3Ò,Œhén·îmí•*ˆn®ójë Nÿó-0®Ô]ƒö¿xêfÃÜËÛo$}ö VøhÀÉóDþÃ<£¢þ-áÊ;9™ï7.MXòÄkO—§üRÝhuéhœ¹…Û;#½ãwÅÑk¨{Pڐ~pP"è¿»ôJG{tu_nšëÜc;·Ô#–x¾oz{_±ý‡ò¿ÀB€ÐBœåÎf E|£Èendstream +endobj +979 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8018 0 R +/FirstChar 21 +/LastChar 21 +/Widths 8019 0 R +/BaseFont /BIOQFS+CMSY10 +/FontDescriptor 977 0 R +>> endobj +977 0 obj << +/Ascent 750 +/CapHeight 683 +/Descent -194 +/FontName /BIOQFS+CMSY10 +/ItalicAngle -14.035 +/StemV 85 +/XHeight 431 +/FontBBox [-29 -960 1116 775] +/Flags 4 +/CharSet (/greaterequal) +/FontFile 978 0 R +>> endobj +8019 0 obj +[778 ] +endobj +8018 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 21/greaterequal 22/.notdef] +>> endobj +8020 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/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/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/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/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +>> endobj +934 0 obj << +/Length1 1612 +/Length2 15481 +/Length3 532 +/Length 16342 +/Filter /FlateDecode +>> +stream +xÚíºUp&͒%(æ3~bf–JÌÌÌ%}bff†—˜™KÌÌÌR‰™¶þ{§§Çzg_vúimÓ,Í2Ü=Ž÷ãOIN¬¨B/db÷(ngëLÏÌÀĐ·°ùáâ$gg+K¯ 4sü5²Ã‘“‹8œ-ìlEœ<   @h `a0sssÑDìì=-Ì̝TjÊÔ´´tÿiù'ðÃã?<w:Y˜Ù(þ~¸­íìm€¶Î!þ_oTÎæ@€©…5 ¢ ¨%%/ ’WHmŽFÖE—ÖÆY c ­`jç°þ÷`lgkbñOiN ±„œF'{ ±Åßm@wc ý?.:€=ÐÑÆÂÉéï7À `æhdëü·Îv [ck“üµ›Úý‹½£Ýß›¿¾¿`ŠvNÎNƎö΀¿YEÅÿÍÓÙÜÈùŸÜNÝ;Ó¿‘&vÆ.ÿ”ô/ß_˜¿^g# ['€3ÐÝùŸ\?€ '{k#¿¹ÿ‚Ù;Zü‹†‹“…­Ù2 8͌M¬NNaþbÿӝÿ¬ð¿Todooíñ¯ÝvÿŠúŸ,œ€Ö¦ pÌ,s;ÿÍmfa ÇøÏ HٚÚ˜™þm7q±ÿŸ+Ðñ_ ¢úgf¨ÿ’02±³µö˜Máåíœÿ¦Pý¿S™á¿Oäÿ‰ÿ[þo‘÷ÿLÜÿªÑÿrˆÿOÏó…w±¶–7²ù;ÿ¾`o;€,àŸ;ÆÚÈñÿndcaíñ¿Ùð_5€ÿ&ùÿ€#ålô·B¶fab`ú·ÑÂIÜÂh¢háll05²þÛ©ÙÕlM€ŽÖ¶À¿Šþ«™zf&¦ÿâS5·0¶²ý§õìÿvmMþ+ù¿"ý‹:£‚œ’Œ˜í½Sÿ¥øW{gUû¿ÄþG)rv&ÿsñ†°°;À‹þï ¤gaåpüMÈÅÌìó¿Éö/æÿ\Ë9;Z¸tþ–ÌÄü¯ÂÿÇûŸ+½ÿ#fklgòϬ¨8ٚü¯ÿiøÇmìâèøW՝ø¿ÿÇú_ƒºáV—ìŒyƒ-S3Ҝk±r†&Duúz˜Á‡BìKT óý«íºýRÃw¸+ ßkB§x>Û<Oí?ö¥iFz0­)»/óð}H©{óQ6)~sÒ2ê—|K;ӈöºZÝ†Ðæ`R?؝PRÖ/~‡"˜úÍêsõDíOêšïNöhèkœR‹ÑÜ‚Z[pzF‘xüôH90:<4Ø}Ù»G› KÎë +ñ"Êß!O@[­Â+‚*­ ï¦ýê“H£ËK?—œ —,ÒFöUÑ,oͶ]ö= 2­]à{¢œ£dë~¥&æõÜTÔw¡Ä)îٜ¯ur1'¬ïMø“A}·3VdAÓÐõ„C`×T}Ná^µ6Õ4¯½ˆ9óÃÓJ%õn-PûäLôÃ.•ˆ"­öN䞺ËÂ2æÀ÷Ò¬pÛØäÇ|¿{f­jÎdMrôk3°N›ÃN0Nš8 +ŒoDû'e‡‚š®µåÇ%I‹Î”<~û^F¹öá‘Å—¹Ã<2GiêÀW¥Þ36–¨u´ÈΫ>%tµ!µ™ã-g‰‘ùr'"„“Å‘"bþ˜Ï Óù:í?Jwß²EM­8 ð< uÀ$›™/ú_2Ò`•ç‘Y Ùh2þ¦(¿k~Òd­ùÉSö‹8¦¦Èámxlq*3ü{_,f´~èïW$8Ý[vúý±Üçy?ÇAH«71«—!DpODQ3¸˜ïé8wc1 ðDJ‘Ñ.ĸÃâ—s5? +üH£f:Q—ÀY†Ž‚Î +nÓÛ|#¹ž%}“cñWÞmM‘%UØÕ[‘_‰QÚL’að!TéŸ>¯C¶†p6¢ƒ'4Ìùˆ©Ð²Ð# (Iwg hž¯ÙH¦kÖ«¼ø‰á­’vQ“únژÙ¬-‹Û~0ÈNYßÖôzg€C«SC¾[“-Ád²ßÔ{çŸl6ò‡ ?±“ç‘lÀ|1Ï$­WøZõ ¦ øµ¥÷V²ø µñŸ+'% [dè7rÜ +~´zªf?,ŠÄ±M¸³)D‹ŒðW%ïTç5b˜ÞˆÏXi…™Ø / òןÓmªÈ‰íåq’”ÔbÞRœþШÖÿ4Ù·Uƒ|:yní‹ÒºúB2-‡ˆuǸùž=¿¾z`©&YgU‡}Ƙ"àŽš8€¤Þ½Qrޖ>ò8t#7£ +ŽÄEf蘖՘°SÃ׃º¯)@’ǵ’)«¦ÐdK¼·Aufyÿ1zµTæžüêYÎs@"5-Ms3eÔ"Ä5u„ˆË#+±ôú ˜OÔÚ.C ÷!‡æ} ñøÔýì À¢ã7_ ]È'ñrðá§QÙI—ÿT3µ=©†zE~èá~>ÕA+(S“WpÏü Ø@ ÏJ~:&öo1c‰zW¡›¦€Šôa«,ËiOK¢]±Þo´{ʨódÚÎ3g³5“<aÚÇÐpQÃG4¶§´æ©Ì„BÁÇË'—Ù“ùZ‹ôõ&î ÇÇM–IS‹¬ôE‘ñ +^)ð>•ÉÁèÏ7Â??¹ÉeɬwdŠ*ˆAœ`ó¨Ó{F§œtÒ'ꄙÁˆqRØR[Ñ´òb·LM‘ÈW“2H4Dtòýځ<ç±.z•u"õ‘ ‡\ébhÏnÓ.¹)ÂeVdJ üùê\J{ÝËø>•™j¥ô»¶­Zàã잺—í…3ŠJÌe_±åÁ»zëR"êšX³±~^©Žá:(­NŒïíÊϦ`…0©%¸Ä©rªƒ,… øžÍIc0Ò +k^…â^º)`˦5 -@zfçުʁ¤½”Iú ô!¤Z•Fʪ§zՀ¦º¨h¬•uB +º4'¹2ÿ-;ËñXäLdLW9äðßSŽ¾Ž}±dñUmÉ£Pò^\ñ™ìщԢ%L|OÞâJÁ‰šé߸xC«ã‰¶Ù”™ x‰7Ö¶ÞU?.žy †Têƒi 7î.á¾3{+÷~á‚ÈÍ|բ͕W#FxWWt^’,ØežG§$”×ê<Ô¡§k¾®“ÀK(Ï`¾qì®±9­Õ‘rŒtˆ­BR_—öœqÚ7¤(-3-”)Ù+lÒùýµÕT¯L.;P·K«‘äXÛ®~Eñ‡´~ªufúÉÃ{|Ò£Ð/lMWÉTÓc3°2Ï]†àªT¯…›Š`ÔcåêC<ÇTËGK§Xú–º?w Àü"·òõ>±šÍýB‡ë êzÊ$S׆X€8É¿!ª¤tAʛÆM“OkVÀ Ç߆‘Ñjr7×2%Þ‹ÀÖ‡?Ÿ†ÌC(šø»±ÛšP‘%É » +é’F¤ÎԊ¬WÏH?¯Mù+O!A FóšêüjÝF‰õ¦¼LH`v†½½%;"Ã#øq,JSXîD‘D9{iQñ™Öځ$¹ú¦cwñøeWu¼Æ05ÁÎEuÁqK"ú{gan1h6ê ˜#S}qž‰] ¬,2Ñ¿5Ôq¥¨\ºN*Âh«({9ÁoÄÆه(pFª˜¦NKsöÓÓicòÌX´ã[]Ï]É-Œµr¥=©¶äQSd+œÉ/›hšËBÏT¨C˜•..§bÓ[¿¶âú>|*žº#¼i ++öÊd½½¯Ž<¢æGå]n9eXשár®†¯u<[ª†`: ÕÙæ³b‹—Ÿ‹Ã +µ šC ¦«5{œW° }Ô‚ í<Ä¥Ñ>cCÝÞlr³„+FëõÆÜá˜Ã¥’Ü‚¿ÄýcO$Œ£ÑGš£ñ?oåÅõFsߊºu–=Ýý®ÊSˆYìªà:9ðyj%ϪÛÔ!úð868t\Môōؠs{K³ +"ɀf߶4÷ª–ìÖâ4g·)@»‚§þÐVٝÃk„aO­ôì{CÅT̐óç>?—×pFyAÌáÊÚV·Ö€£@;cïì‘Wûm­:0·å U«KFëÀ¶áž´G{^ó]ìI78ß)›?˜â-˜5¦™£´‚±ÓiïB•§¬ä»¨î=³¾Æ@ hé@ér¤·ªiW°ñ•¥¶ ‹äü~TõÏ7,”1>z£Åo3•k?orGùf°²SlÉÂÏV˜&j ‡’ÿTôB¥§ò‹?Ò/M!¾Ÿ)õ5Ž(1dãÁ“aì*l» ÚUiòõÈYá]ÏXDNÙCyÓߌZ(d·.钔ÐönîOލ)Ù{G¼~ùÍ:ÕeA§?ðC„c£0„ìO¨$`ì¨6ýÁR^6 "9qK” ÈãqS7–µéŸ¬‰J5¥´h²²:¦E5ƑeÃ6¸_ükýΚ)#£N’T—·yNIÔ'v¬Za ›˜ÁÏrqJ´û²JGðû³s<úx +gâiGÝɁæ$å(|[°°Á,qnüëÀe +_Ä&C‰WEݚ6ó)Å3I¦[©÷hþ /Œ#'A´Ö–wª²{>çcÇ£Ñðë‡L™„Æk°Ÿ©Ó6ñ©å«—Ýj¡ëfrKJP*ªÄš›(E«Ü¨EíËBÝ!‚\Ä~“¢ÄúU [ÙÖ´&Œ×aG°ê€Òc‚Yo'‚j<ê>ÅÜ®„—S¯¾ó#ôR”ƃF1‚;(¾¶ãtÙ̑€úùH&´¨Áøû¡åbÁ_ÆèaMÌÏI²`=íú½çObWìþŸ–úoñÈíºX±GÐ|ŒÁS²–áîu…b +û´_3=ÃÛ¥L¡Æ®!¹ü›’ü®=xóFN¾ñD¾Îr=8ÇÜ"mrŠûWí9(Hg ¶ÅNfҗnBçÙµõ¼%wœû²™ e(®‹ýÔòL& ¶!ªmõ±Ð}ê0D:±;ù‰/)ÒðœàÜX¨1{=ʹ G‡ëý@Sl#Ý{TƒJÅÑL² ªþïPÝfó?,¡¸}‰R¬”oý™‹„Ò£¸:ecû÷ó3jr3u\ÒK”lWòãú„Ęxñ•Îa-(êg=¨H÷\>§ +<Ö±éw"³eEåºP#W5Nâ‹Âò/ð+Ol×6nJüßÓÉrlÔH]sÚ{í¯4Ü/ëwÊè5»7Ô¼^”.™Ÿ?DÕÍûl+ØÂï¼]ælx…æ9:6`J +¨%…Þ×¥£^ł”è1c-RfíD£§] Pl¸Eækú¦¥'ûý4gw¨"f» ?TWëûqʯzqœ‹!Wr/y`!Þ¾°ÖIbÜØí`NÁ+±T~£´Ð@¤šé²ãÂ4Âñ4 ^÷½üÚ­úG=4WeÅTˍ ʜv'4ƒ˜þÊ)Ñû1Üu~ü È gO?6¬Þô|z¯R¼B ºwυ6ƒÄ^Kƒ¼ÊP×'Bp95U8óˆô¦®z»Y0V©ÍRæÕÖ<]gêø*(!¼åCû¨9¢‘ÓL47U¥aª,Ž½Ô#^Ÿ—j½# VåÛ«±rq‹†ˆPXtfì$O6`*±¶"c «Ö6É +·¥` Z^ƒ?â¡ù0ˆeÑ­ä žÂxß׳$šý¥êArÎөȪèÚÀ’ú¹)œ‡2ÝìÙ×ÐLÏÓÕUÂh?#€çˆÿÈվͧ70+¹G(²œèÒ‰ÅXLá4'¨=eÀ&®cI*N«Î̉}{Œ –*¹9KÆîUÞOuلŠÁO|j÷¼êßڀ·#QOÏXÎÛ¼ÀÌ,.!ý\æ;A[,è4Ô¡º&OÕiž7¿ìÿfֵܑhnÒ!o–ÅÙ­J=¤b‘ï2ï7KÇü.Ô± +Cؤ¶•ŸFaµ¥kõU—€=ÒÍ'Ԋ޺yüM|¸š'>@^)ݽ!gL¬ˆÇª;áòÒP»ÎIp½®CD›4äYòDô±ÑQ-¾[1@&£o«£¾K¢lVÅÍWR²(…£_ŸSü(Ÿû†€Ù¦2r¯Äù±zî¨fþÀoš†!a¬¬VOù5Ü£~ú©`‡„ÜTNFϳM^C€BPòÎ-æYü:ØOä C¼Ýïl2~UÛs„e1¸{gL§•æliú®\‡ñB 2GLÏ·#r¹Ñ%b_0Joà+¾/¿ÜÕê ë +ö¢½UÞ.§ù}LK*:°ÌcúŠ.Ï$|z–yû×ÚTuŽ›}` Æ2DÅÅ +{dô·йJ,—Æxg *1‰S©ÍûG{ý¡Cæ—€K^E4ý E6|ûZ¢ãO8ݪ¹ëCù®Nå:’§ø*³íÐ]ûéiʔN€ Z¸Ý.Gx:¶ö$ÙÊø-ߎz»ÕŽëô ‡š®SZ 5@.lü'M‚†1°¹Ã5a@¶ûØVH Qñ~獃 Nƃ\9òÁE€yåZ(eG»ÇÓ/=Ê 86íAKŸ³Ì&ùóø C/¹i£æ#K”ÕO¾(?ه0Dºr9©_…6ó®kèUçøªU1E¯zóL>B*['jz”ž‚‘ÅAS½9Õõm+aוÔçþ6̼‰ÀžÝWe†è lзe@Ύ§[…*ŝðÒºl×hÏûõ'Wbâ|8bþüš¼B?ÆKÁ<؊Á1» ÉH¬, +*%éϟùmÓ¨0¸š g +ïó7HI]˜´/ô¥¾!tµºˆ<øä £ÔÝót’m”ô#câ»m¼Êô%s·Z}0À[ìæaª©ÅkëC–ÏØq“-€»#L҅,)IiE11#tÕ菣¤31ãä•›A ©³)¨ +¢Þ—fY™Nò&O—R•Ú®]q”·øÙ”ˆ‡µÈoä9BOòEçL¨²C¨p:PhZ‰œ„ëœY\Íßl“»jgPd«j3m›¥¼bývK>#ƒ¥;ÛÑÙata³Yó)qþl蘒pQYë4¤QÆ Q¶†Ksþz¥ÅðøiJ+………Ò[H¥Üþ²˜nZ´¦¥ø"bÆÞ`Iâ7ÔÝÐÙäÒ_ے3á,SÒ7´ƒ#-m™ÁÄm¸ö¼ÁpegÆø+”Ò¸H*»Š“¾-1zž·V[üoÅ *s(ÉYyDhFŸ†>œªbð睹Æ¥58꬈ åB|Y œøCÈO,*‚7™]Est–‘b6Pa'j)ùXzO…9uZÕU½7@Ì$>õ~…¨¡šŸDþd\ ?–ÎTöî—3žý|S•9ÜcÖ÷Ó?b½ë[š»+†ùöBÚ¥³N]3™³y™Öö[ŽFP|ffäÄa#l”TÔnkêšT°t2öæ…Ï”‹O{ Ǩ\Ì`«˜w!Oö¬’Q8R—ŠkêóI}5Ï2°ôéÊöø¥rW¢TKˤ=D<\Z ¡xêTd5©1»+~ôCaDOڀþ3<´U!{J€jÐŒ ȇº`›ŽÔ +Äؗ6‰÷ÊÒ-‰ê!ŒÄöíŠóMË'̎m‚[˼T-BË"ç©]sžšd6«é˜W”ɯ‰§´ +\†ŒŒø@1ò=™ˆôë¨Tw}›E¨Â֙ð\ÉD‡!$Œ~ +O4ˆ%qöð¤c°¡/V`U²ƒ-%Ɗ’¾ Û9Ÿ¬eߖþðaòIv¿ïóWÿ†ã¯8² (n²JÖß±4èiüÙ%v®DSŒe2­†˜x÷è1®E G~-? WbºA˜ÂeÜ0ÍùMƺ¦µò‰ÄÅ–uE¢”Á5àH9uÎèØQ‡ÈãŽKòQz˜ÒÙ 0s ]³Ñh“ÄÂ$#®¯e 3+:x#ƒû¡ê¿;/®IÇà€Ë 7íõÄsÅwBøäî‘ëùíW½± Sûkfžxu.ê…{§Ò· ÑîQùt—¤)Gî¡éîQÓŽ>¿àiPV•tA…rtªý&r;õPÇ ݬ­IéBfK_g Î?p„0…KRH뵞٣Û'ë4›+ˆ¶ÇÌKO½å%(Åi”ƒŸ](4¥”Ï‚äùÓH1Õ¥?ý¾»ÏYGÜÐƄfË·>Qêó,·ü'‚ãâsšeqÈÚJ-sõ,Ï$¥ßޖ(›ã<±Ÿe÷Ñ—ΔÒ5S òœ E†å&ÿÔu”Ý?ñ( Ú= Ú«ÒÅ*ÆqctjëÅôk!”‘¤–úæJ·÷ԙdövB0.À‚O¥ncpÞ§ÜIZþ…µ +%䇸¿ã•9-%MûaéӃhÍù .R¼Ô0 ’ç’Õm=‰ÎÂí-r%p"Õùk¹0¤&þ2D”5N×} ÿɇÁ€ñå\ù»uùƒh°µóŸ¸ö©Åjªžg´j…Jaٌ ËS´uu/‚N2ԐÅEäIïŒÛÆfafÚ­Yѐ‹ét€cjÛ9–#;† ì0R¤H`Z¥û}±£5CQ”¿Ú¬,¾ÊÏQBiu å|\PY®Ên[ÿbÃÄðÿݪ^“8ôՒoì;,*ê¦[•…ãÚ+ä*Ûî~ÝH²÷3ûâÙ?ˆEÄ$ÉI—Vƒ4……0­Éºà™ªzý›C~%z,Ÿ¡¼ÁlVœ½é[…4;œ½yȜ!æM ÏÒ¤jëo¿`Ž­ó/’Jñ¼cJ'ñ;Ž¿÷ÛþÖrÏþ¤RIÈ˟Yæ“em᠟и“NѵMøeµhŸ‚l²7jv8—æ¹ J†rnÄ."‘{ÝçDš[ە…ÉáiPAP 5ÇZ¿”jtœPޛLGMy^ønäË©ð´kžÉïî8Πõ4싒@Õ«B¾ºú;Œ]Ýà¤sçM²}é¶|Ž·šœhH¸}.)¿ëË­o +ÝꨏM@¯vÞyª S˜¹ON÷w:â^DDÄÙ¥þŽðGt 憒{$&Kph „~ï@‹þ¶ ø8iÔYN‚–ÀÈÓ丟p…¤pzÅ/Z¶QhÍ%%CMÎç×µéE›Vع‚[Ñì"ÛGY=Mñ‚á~8`ø“«Ò¨Î2ºz;Œl d)ÒS˜ø@ƨte\?ï\g3.âô­VÓÇÄs©(["|oÓ0®3 ú ÖXg RwÓqûËÞøµìc‚àBƒ×-R_ûjàk:Iødq="óXÃÀ¾œZyëk({•¤÷”2pJ\C–Ø8'çe¶>3w… jvôàž©KIÐޕ#Ð6Uï8Sÿ›“K›~¯Bš ðqI¤¤•öû +ZÔU{¥(Ji2»Øe¯åœ¬8øl;‚©Ãláa-’T˜}c†”1àì\‡è±4;ô·ŸQf{ÞD”sx†(ÚܚnuûŒ‘ÕghJB#Y¡â0Iãs^ÆÁ(v©ú ïOy} 4C2¾’Gˆ-ESó£g«Ûə¥¼£ ÷Øß@ DQ~f°ˆÍ”ƒH¿Õgâë ôÚÁ<><ÐEThœ;Ő¢ŸZÿc<ò + 3¹E¶„XϏ+ ].̼uÛuõ㎒`¿9lE}b‚š<ؒ‡wñ*ìÕ!Ýˍ¥Î·—³Xz¥ g<Œ¬p+Ä.FÌÁÓßì 6cÙð€¾˜AôÖy<ŽW…ىOµ–\{NãW@¥[ ÷mQ¯l;j @4¦kÖW8c­õ€Ò¹¬?×Óû]¬¨Ò]'Ý«ÁS ¤¤Rvï6Ì(´‡F±çrai•ÎXâß]’ŒCü×ð%ëQE0_–­¥óhëûÀÐ>¿ýÁínÚ\1)l2ý…¢Ëì¾p|¡‚˱pŒ9?“ø,0b܎þŁ>¤YäŠmýë$P8v?6UXOšÖ3|]í^zªÅ¬½v¤òÒöRT±Q0‚¤¦Wa.ntN² ‘ê.%¯.h8îã/TəÎ^>3u ”ô¾dö׆ƒ¸2GЗŸ-š´h àŽ3X„ÒP~Ÿ/GŒA¦V·AOö†£Ò“l™g +õ_3˜ÈgÚ÷øúb [gMZïÅoo^2aö¤.‘Ó7 ö½Gbõt>;tëìÛ¥ +Inºcî=ò÷ð˜qíqëêÉæˆ7÷u–ì=缐îî-ěÜ˽ÃA~ݸ氘b,”UôÂ,"XË´o 3ŊݧD%–,rÜS·Ø´kÅÊٙç½ ³³Ï| +¶KåFÑ~¦?[R·™,kMŒ…Þ#ð©FEhQn‡ò&û›¾<#Š&o&&ÆnøŒ¼³–‘†˜¹ƒL̔5uReÁL±*Ö«„BjÜFæPMg' +–7!®…‘>DåöñtCubG;fu³®–é$ܪÎëJuv‘xctS5V„íõDýŽ†A+áôr¦Â:#Ö¯$ÀéóPí½f²2¬{რE¤¿˜Õ¨Ý jä´6 Å®cük>ÀZVèV`T9ÎzÎDœhVê_)K±@q`æ‡êB?ëAèÌOT¢8b³‚( +wØ[âÀŠû=rˆÎùHäÅø ÚÝ#'„Ͼ¥! ƒšZŽ:¿“y¿'>e&inC&wÞ'`¬¶°àƒ$æH%㠋%V3£OÕÕ+ɲVtpüT?=Œê¿ø·òü ŸÈIJl É¥TÞ´ycÊÖ Qàu‚•½äƒ é>s¹ßýÅj× Ü­ÂØ êØ +C½!˜ÓfÌ\bDW€‚™äC^ 4u¥ê#÷Ì I¢p¹l¦ÔìÑǝs^kúròÏÝñ– N7÷¯ù¼¹BTÅü¡{x€Ð Ô-Ÿ¬T8™/Žݺ&íða÷‹\¿zb$w1ùàÍ®_{›RÔi_±ç]»œ•ìÐxëF¥TÔÀ ò§7²šuAã,O,;øèùw">Žæ“RS&ûo“B6”…Iw!qŽi9® ]Ò2óK;ÏÒò§ùwoÏEÀŒ(¿ž?³š;N•½ Ž¯µ¥ü–âó*U¦®ê¨MÝuI`ÒÒ+÷Q3«egT§Ü±˜;¿­…ÇSÌ2ɨÒÑmf´a a‡£T´e0ì%Z¾Ç ÿT=¼ÄrcÈÂߑƒÊeÛ6¯8½Iµ¯ ÞUR¬ôœfÄ7%;©çxóªƒf¾/ô·v„µ[†;’Ý/É#„km`®¢ì‚–úEºÐ3d¿ÊÍú6¾2NbNj˜+2,‹†3íWt„ ¡æÅЗÌ+ù½!§$Ìã6ºxAv'Ò«wŸ¨{>ÅñUµ7iŸSï¹<~ºÑ=i‰Ëà5ɍÀŸm Í ¨v*™TkÕh¸÷ý,¥Sj¡ª#¶·N¤¥¡´Ì?Ùa&×c$ÚÖé 6›å—×Vø‹÷zÖdëëç‡JÔ<_ÄÇlh[ÿ^7óUÉÕkÏrزš‚%(e)“?÷Ð-LO»;ÖÚ Ð¾j_§$/#UlR󀝤L B­b7 î.¤³ÖÝíµÅPEÕ +”J½¸Êè2\sƒÜK&z_´¹žˆ"~óˆwZ<—™0n"4ü6çfW† 2t#žÕÌòupGQ&n…nyZ¹–ä7ˆ`kQШ‚(6£@ƒ› õ¨ÆÇv>ÊZ¼?l”2!m-rçÂSL¸ žÅ'iE˜…SŸ7šŒ#|HŸ†ØäƒÏaÊìà錣ºjBÌà*QŒCÊù:ÞJ9]ÂU¡£G-¾¨4Oñœ1ŒÈÃyv·èëi’Á´Ý¹<î‚y}¼â73,¡~YÕÑ·v.f=K`•e³óM/SA߄k1>T)ý‘n¤ä°ÈÔ©øܺ5æcä1Ý´¯¤3@­Mfqå´ÿþ*ۆZ{ +ÆÆ:÷¤Oƒ= b°8™ "X[󇚉©F÷,œÁBêñwÍxg¡´ YË  ŒShƙ¹ö?rgéÍU‹¾à'ÆגuÕ–¿õÜÀñÜ.°/[w÷Ó†'Êa£D{ +Iæ²#çªm˜:Ñîd ¸¥–Õ©½Õ·6¯b†bz(ÊôÌÆ¥=½,Koé2"ºã_õ.DÔ×ï† µg&‡² ʧݢÃ!‘0zýOºW-9fåCO½ûU[t&‚u9vUC(­ftŒÓ¬Õ¬¤¶OêaM½ †vïÐ֗åö+‚c²h¨62þ@¼:Û±ÛÁ(á5(\—å´Ò+…3[h—Þ`ۖœœâ?nÇ«óΒ§Ö‹hoÏgÁ‚Kg)ŠQ‹@~hºÆ‘2ãÒ±ða©2ÖYL@£ ¯å† +9 Ç[8­UuPș­‡iY_u ”‚4lý*:1÷ý~zYyŸ¸HÜ UaRô÷ì`ú¤á~ úÏM‡£ÑÈ[öŒ~ۇºŠÙlé)…`­9'à +¤%‘^¥îœœ4*¡vÎÄHäñ˜4ª¦Jö[ë,8Èá¿ðÅ`;”‚Mž‚^,IÍïx°‚5ù“Ö j×rY¾ã^öݏw‚Ÿß “â·#F«ÊùŽž—4Åä746n4šdðm’Œ$¨GVÜ×;™õÆõ<ŸÓÚ[Yš.Áau›/ +‚ªh(Äyðþ†uŠaòMBâªá_.聢MÐH˜;£,ZO[ñZ\ Ýé—}È +y´6vAc›¦4øÀøwۅ¦åâãû`*W‹?<ƒþÙ ‰Q¹®ó“ßK±PPX¨Ëâ§W2ÀNÈâôШ¯tŽ™éKéL­Õ™ùTtVrX¬N#WÂ=Ÿ‡ó6m ù„ˆÈ"6^#L¡ƒ¨°K¡T˂Aœy*O›„¯óZb˜ÁH¸±3t÷>ó¢x?ñˆ8 „od˦!˜wüì·P¾,ÇzT±êéõ%ó6bPl¡í”HÑg5$Œ$Ø;àpx?EØúζâ ~åcÉ÷¢õTÉ\\¢éãÙpn7ÕEÎ+±_÷¾ëÆ v\|²Ò¦2˜ +áëW7ý:’Jt)½Þ[քq€…l=û ØùaµÒ=œ)¢#ïS‡Ù‚‚AMD¶àÖVž$çq…€ú´Æ:>JUgü´¨US˜EŒ7]Lz_͸¸Í֖€sÈ¡ù=×( V3‘~ E¤â ’ É¹l‰\ "ãâH—ù?ÚÈf‡…ƒé¢ $ »ÒfÆVxƒ© +ޓ›£šÿ¨StÙ-þ&³ßLx³Î¿­ÎõMH¬Ú6I%Å +ÿ«ŽÎþëªòô¢R(+¯’0±s.B³÷dBʵ!ˆÝP_ƒG?«‰Agœ!ˆ€Dž'³5óšFŠ¥äûIÖ«£DÐ«º2$ÜdpZSÛ­ˆÝ\ â¢cP×Åäð*cÔ'ÝO¶Ï4žoê@·›”e˜z¾8»¬rC°†îÓ¸u6àNÀ(ݞEÅþÉۂ«]œ[ ^fòž`˕Š¶¤å\xDa PÖ(ñÚ¼yêf¦ +N©JhޓʺÏÍ­¶‡W_åœN9©'% ƒø—yAmYw|Sé*æ%îPJÙ¥yÉ!>_„Sž¦m `„ŽØÙL+Àã73ù®¯êFþN/Þ¶vÓü=]Aïó׏óœë“=~ŠÕ·…°²t“±%§ ¾ª"8*6ZûDLžMSÁY1^nȝðš¶Î9gÖ×ÚQsúƒ†Æΰ§ÖP¼ð\ûܪn1Wë1Å´º©ò̸,Ëi50Âé¾,oåX‚»iŽ' j ~Û¦ ®Óµ²Ð©ëO b;ãGE™Æpa¨4†“ŸUeŠëò:‰ý…È+:q¾¥ô¹Ï)T•…ó³€È$ɑõ‹YtqäqMIZ«Ò–ep×HØM·ë”}­$bˆ ÌH·ëb“ÀR¤­:—Úì¯E}YüȚ7óiœlðXõõ×Õ)bzy"S°?ÊóäâZ?³QÉÕðFb!“—º"ö×5‚#¦â~­:Þ÷O‹ª<~<Ž×=]t’)ï—B°Y„"RÚyá$P’ø›üÖVSîÜAà¤k¢CÀ·B6ù͏D"΄Eݾá¬£È ×=‰Œ5^ñÌR .•ESñ*tïÈÜÐY’î½wô2µbªB|‰0ˆ•pˆæ/ҏmàìK»g9×¾=-1wz‚"i'ë7`‚ËVîбÿ d1PXù ›üQ‡ûCn\ ¼ø(I±¯üíI¢ByÃrhúi± ›Ãö]™†ÿ·Y’ªXê~þ塺|cß ûštÕÍØçRö梬™šÆ©°©ÔQ[mf> ¨¬9ï¬"w ׳w¨ÂKuƒû'krПfh¼UçGŸGÌΫb{Ûþ¬ñÜ«½™N-J¨c>:àa`H³gäæL'JÇW֍”:jæyž¾€ºvjD#•ï)ÌÇT—­˜–º*Èy\ ø÷ aõ€2=&£ªÐi=9L<dZbО$Hˆ9bâ¤'ì듫‡Ä9¹3Î/×0.Æ{áŒ62»¦cjë·ÖÖ­¾–E˜ªþ)[˜Ö9‚3cš¯ƒÞË$áðô9¥´ ¨®m‘õº*1È62"„°}•¢#.ƞø“­ ˆpW˜ àŸª÷,˜9H#èfZ’G :óôí+6pæ|äÜF¿†®/7lá<܋oP³ÉQ%äݶ&Ò_îòIñ‚v´faȇ• ‡Û#‹¯ËOÀM_ÃØð°EŸ?C!Ãiõ{fWH@µ¿ë—è¹J^5=äŸ ãÇpĘ~­äöË4uT¢Ëq¢tpïªêi:Ьîɨi&.ͱ®ž‹NEÌ©V‡ÿ}dš©ð <³v?aÿ,7ÉêÐØÇ7!‘Ïðµ]ÉþÃ><é7®Tÿ¤!˜DÒ¿<\vì[ „C&‰ÏyÐ }äL{¦Î 66Oäó*…%!>¢åÆoÚ!q8¡}pi¹pÖeåÒ^F¦à§—€µCùɟd¬4‡ M¨Ú᭝Kzì/üÙY‚Ógon Áåãá5–õƒ‡¥ã#Ür‰v~Ä`GÚ¨†6ñŸ°Ðr®8„Þ 6žÄ9ŒU³BR•Ê¸Ÿk&’U rÙ¤‹e ÊC`B»£îÜ-ë$…ÍtÄˏ;¿è~Kh¨æš¼Tã‚ ƒíT¡çÚ¬á`°Ü‘× ‰¤ŒÐ±™«Îµ¾9ÛU÷`´ñR“7FïOÕö$~i¸ú‚Õì[É%‘à\à¾Qfª{pû 㗁7JÓFò ¹µ£bœþcFÙ¶zÐûòÁ¯ ++H÷Ï ‹òê¶ô Œ5 ðÑûÁP^ٗñ |Uç:=¿zÐH¶4 €ŸAx¾K¨I± +Ù`=¥‚å;¤b>zو¥q5A¬†¨eøQvNôÈz;$,{Q$Uë'lIZTZ’ãVÅÿ»á[¹±P‹ þ-‚Ôc»2/+¹Æv É*SèZhJ{H‘%>H™é¾±v5mip›å÷H¸9â;žL)ÞëUk¨®g=ád]·bG*ýyø냹kŽL€Þ‘d4Û á½±™b0"B`û@ãMÙO5eäsñ*Xü=¡ÆÌÀa"®œ_AّÈїÙ¡{'âT(¾õ^Ã÷8´Ô‚'¨šI~6NøɃïî®^töú9K¨ôDÝ@î’èZôµÅ{ÁáYKà˶ÙôwÊÏ,‡SëY«Û md¹ E3~n¸¡Š½*ع–(/%J——øá{¿MÊ£òFûœMö¾†¸‡×Ÿhi +‚Ç"ì$اYˆ QùÛÇÓ½ÙÍ×üÑnø÷&7e˜¨ȸ—é‚Ñèy¾';ì5¨æH`PŽW‘…ðáÊ>ÊJ1ÉÑnÃSeš°­Ge,`õdÚ¦°þèÕ­ÔOÛiói܂°݇ý˜oøqU9¨Qc´Üûi–å³?á$Ü¢‘)«»¦²tRqŽ ^´«ßaÒ¿‹Cüºø½Ó=ñç5–P)Ł²4££Š– î÷|éö¸Ò|šZñÐu@¶…éådxkÙM!14\+XP´™GeNiMšÙ6Ã;grãZpq6…ÀΈp™am’$T”Å ,¹Âi8ëw7[u†ø]ñ€Õí1AªQ6ôˆkŠž’ŒÎ±1«•´ŽD9z…÷>ÁŠ›+ßÐþ­wŒ|ƐèšÇ£ðïA’Àæ~㉺×gi:eÎJÂ7,aÀ TùÛ0_\ƒä ЏÅ'y]7;¸ÓôQ +^ó±ªÄÕÒ ŠžƒÂ“V¦pû6WµÇb†6F8qEW{%Ÿ]ðCwRkð©æš£®õ Áµ;#oԝLÜÁfÄY1纴 jÒø՟l#½,‚î¢þ¬-²™ ™}ˆa5R.ÚÍJuìs¼#?«p&8KB*{ü¦,u0NVÔWÒ"Œcþðϐ½Q±˜†Õh^µ±_Åôª¡¨`*Æ9h©"aáZ·d–Aö‡ސ»,P®Œ“Ãöû†27ZÓ@úª¶q=ØÁWúÌ^ТèaFjl8 +Ÿ{w0‚Õ‘Ò$bœÂPø6çKL; ÝY3pw@ô6Ë1ó + ¸‹ížtbM*+Éͅ!]¨‡à䀢pE;˜œXÞ‘V¤]pwßPªŠ_Uð4”ˆô…‡U¬Kmov°ƒ¦ÀP;­ò¦Ùù¨g ƒ ]º˜{DÌRÞÅ/PíÔº“‰êúº|é)1½ªáË*‹[rƒz¬x…QÁéìQòž”Æpaq^KR¨ ã¸2ý>pÿ?Àÿ'Œ­FŽÎv6FŽVpÿ3f„endstream +endobj +935 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 33 +/LastChar 125 +/Widths 8021 0 R +/BaseFont /OMQKEW+NimbusMonL-Regu +/FontDescriptor 933 0 R +>> endobj +933 0 obj << +/Ascent 625 +/CapHeight 557 +/Descent -147 +/FontName /OMQKEW+NimbusMonL-Regu +/ItalicAngle 0 +/StemV 41 +/XHeight 426 +/FontBBox [-12 -237 650 811] +/Flags 4 +/CharSet (/exclam/quotedbl/numbersign/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/one/two/three/colon/equal/greater/at/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/X/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/braceright) +/FontFile 934 0 R +>> endobj +8021 0 obj +[600 600 600 0 0 0 600 600 600 0 600 600 600 600 600 0 600 600 600 0 0 0 0 0 0 600 0 0 600 600 0 600 600 600 600 600 600 600 600 600 600 0 0 600 600 600 600 600 0 600 600 600 600 0 600 600 0 0 600 0 600 0 600 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 ] +endobj +924 0 obj << +/Length1 1630 +/Length2 9776 +/Length3 532 +/Length 10644 +/Filter /FlateDecode +>> +stream +xÚízeTœí’-àîNww ®Á=¸5ÐXºq÷àî܂{€àܝàî—|ߜ9³Î_3ç×]·×ê^ïS»jWÕ³ë­_MK©¦É*a 6ʂ¡¬œlBƒ¹ Dì¨Äª´vQ5·^^ZZ)g v”6ƒ…º@K€4ÐÀÅàD¡H<œAÖ6Pƒ¶†.#33Ë?-\æÿ@^"! kGÝ˃+Ðìät„¾Pü5@Ô°ÙRªjïTä r*Ú9 #ÐÙÌ æòҊ@ dt„V`g€ý߀ØÑô§5Û —`€8-@/a@w  ÓˆàtvA /Ï`ílæ}¹(r´°w±üSÀ‹Ý +üWANÎà‡ì…L B,œANPÀKV5iÙ¿ë„Ú˜Aÿ䆀^`ØêÅÓláò§¥¿°šjr„ @wèŸ\æ@€%âdoæñ’û…ÌÉôW.£õ?+`8­Íœ-íÈ Í ÷ŸÛùgŸ€ÿÒ½™““½Ç_Ñ࿼þ³´·bCáäzÉi}Ém rDaÿ3, +ŽV`'ÇßvK§`®@ç¿.ˆáÏÌ0¾af v´÷X­PØUÀЗ”†ÿ™Êlÿ>‘ÿ ÿ[þ·Èû¿÷_5ú//ñÿö}þWjY{{3‡—ø{É^¶  ø³gì͜vÍàÿfæ²÷øoÿÕQøw±ÿÁ÷¯°ÔìåR$­_„aåäbãøÛ ‚Ȃ܁–j ¨… ÀÊÌþåÎþ²k;ZíAŽÀmÿºÖ— ŽÁ´l@vŽDàý:Zþkù/rýU<»šº†¤† ó·aÿòT{™¨–‡ðit•Á–ÿyøÃ#) vx±òqX¹¸ùüü<NNŸÿ&ã_4œÿ<+›AAî6NÀËï?¾ÿ<ý Œ£ØòÏähBÍ-_†í? ` gçÿzÿ_šþÇù¯±݁(s3` á`Û´Ìth ᧁiƒž.ÎW!N%õZ…ùþUàN¿´«‚ŸMªCØF…ž¾xLï;=n*2m vØÓw¦òÈ|¨»ó±—èÚø™·ٍKÐÓt£¼Ž§”V^ëóqèl­¨k? ¶q;#_3úS»æûãÑ\9aøZ¤ÖÅâ·c5ÀàÔìÐ%î^_Ñ÷ }èï<…ïÞ$eΉE¦v}Néÿ!‡TL_û³W8ó\í֛˜î„O|f8VG²·ÉÁ?Ò¦ÊsÕ´µÎø|Ûs¼³Þñ¿*Nþª±ƒTl|™m‹ß–I$qQíÙ·N›ëEf‹wÒdÏ¿Ë,¾5Z¦,Söˆ$ÆûÊ'õYu}žð2»îò1óѺÚ߶iO´!]–èOHúNÝe”x‡û…‡?ÓètÖfš¾qhW?ñ›Í@pm¤Í2ýEÏ~Eä6x{Y×£F)5ܾä ÎXp‡S¢àŽ_› +õSžTêCqR;åU´cø¼L÷X“ÒyU­?µ¡YŒðY‚f¢mú©¹P.aƞ̗eOiñ¶²l%ÖU%Ë,a$/,çõøÉêäO› · Z`ƋúÏC8¸XA¨!ñŠ5Ú4¿\O4ۖƒHÃk;=¸ÅÉÒ¶$ÓýÒêu)¯7­ºãZc±%_+;, hrIœÏ#ÏಈfHÅ M\oïùj«Â°ü|[M_Ûí±³Ð‡ +šBØ8ÏoÐ=ù5 ދŒ;ÆwˆNÿæjÅû6âÆA6ˆsñKöõçf2Û·æNHô؂C¯?Tëóž¹ÛðÏS›´+‡V+ Š÷03@¸6ë?Žç zts:ƒ´®íE}¦ñ|Æ6Fáï?£÷kŸ|ÀWRÅ〈ú:š3‹ëµOi·—û€LO×ØKN݈ÆÌ–¶Ã#HA+W¥vïæù}FwåƒÄlžñC¶}Õ=àZv‘!¿:œ³r¾6z”ÎÆ}«–X–b£^Õ&$¤4`Òþ•ÛZÄ (†9𘈛Üõhª¢ùÕ/Ÿa雜®g½¯ ‘iµç ˜qùwº|kó†+{Lï¼)¢²‚Ñ®Çæ¾VXÌvKŸ- îÐ/2™uûò° äߓâ+Â7ëþ’Ó=`e$cÆr^3}ßêd2?|¸†N‰[ +þè}~*Ó ^µ5:UÒxcÜûL\†`T° ·±‰¦Ñˆ‘ +(¬%çt¾Rš£Êâ•Ò'²Q•³È<Ó°&2§r +ž3ìì1P%îaRÎÞۄH¢2 ,V4Òt—¸¡ÚÌnMٌ²ÏÃw£b îKª,"„(¥¹ímâÛÜk©Ó|^‚ ^sÆ' cw2 ~vüèŠëOZœnØnÕÜÅÒÞ]àÙ óÐF+p¼ {‡ÈAzB‘”Íu÷†Ü@‚ÛtçuX×÷g’Ü-ú`‘aþ(ïRo·ˆŒº”p°bWU{‚ÅB}?û(ÐjR†!À=AŽ«ç=9—Á@ÁS-pš—\?¯ìz†63²YQŠhp/ÎIìÁÀ§Æ»rRn¨hDœ ~`çþqÆA¨W-[u 6†àÐ'lã2><Ù=ç `_æó^Ïaä¬iϟøÅÎZ˜\Ûï·éÞù9(› ÚS’"–ç›-Í³Ç—Áµƪøяè\xėHÁHf¡~´ÆYÕn÷Êñ^jV½ËÓ-ÖþËe÷ÀK'Cð}düƱÍôæ"OEIi,ìˆËÐY)¦…è›3i.”Yv7©Ô¨òmÅÄɉºèNáGËúhü “.Ðk³u!Lc‡·g(`‰Dæ£VԄ./7ÉòI¦Ïú‘o¿N[ ä$)'ýšð®˜w~Óÿ•oÿ]È­;›h 墹'ÏõÖI:=ý§!Ì,ú7jÖæ Ž&ú¹ÍÂëdñ‹á$m˜.ëä¡+hÑõæ„ÛI&^ÂÂsœØ¿°»×'©ìkx~ž™å¢¹Þð@â–0vä6b‡iŽ7¨j=rŒ°ó7°!¿æ‰$Èd¾uR·ÓPDJÉq*‡RÿÔ§&6чÁ4Ã\9htMGX3"¿w|«š÷KÍ&ͯ½D¢A¿kFõ~CN¿®~¹7¤?Q06ϋ4À Ŗ=pÂ3{g}(”P•EîÄ7ÀUqó±3ºQô^ÜMgØUƕnoâøÆ3&Íä7Ý[û¸Ö­ŸY•û<-‰¡òC$‚Þ닙n9ìÔ¬Oû0Ë,^3æè¦Ü%íAâNÜÂ8É§j¥ÇM:’GÊËæ*”˜¤¼{ù ‰°ôâ SJ'¿ê*ypÙ½¹Ä.4QO¨;ßÆä3D Raš•G‚/R(/cq·¤Ñ¦ªVcXžœ^¿FȆ“aªÛ:ǎ»²”𾑧"crž»åÌ^t:Åa´W4ñÜ_$ÔgZ8áµn¿Ç>™$œ]H´FÇ°ÌÙtirO˜~¯r+–Í w•Px-lÝÇËGš³Î‰J $ŒÚ|FÝí:\ŸIÙFÚ:52ÎMXì›ÊÄMˆ'?zLÞSã›àÔ)ÁÒq LŽ(—H‚õîLo~óÒË\pÝú,| '´’–«Chóê¹RÆ…çgÁ Z&|·E•A87DǀÆç(uä%¥5Œ4¯›¬“ Ããë 3ù‘9e©LfÑlsy)MQöœ¹ý¡d Íy-gWP÷IÊþ•3 +£ƒˆ»nîN]œΎ›šeˆg€è.f³éQ…±ö÷¹-R +‘“øՖ¾éÒì¾ Õâ~‚ôË£‡UŒ°óï¶ïÄ¡ 8†á҅áÇåÚ ÚÊ[Û2¦C_º¶ú¶28L=RÜàW)–Sàó¢äô4b£®Ÿäe `T[rœeü~xç8`5s½- +ýNªöe ¼"@H@àþä+V4·E@8N™”.iÿîF֓õ=!† bÚÛ ã}Zdd›|<äÍõä5t:ºÜBÖz=§tYz e…Ë$JÞ wTNÑ^½B }@ª·¯„éÑüzbâ”‹o( 7þ·ÐœXÙ؇ïõ£V÷De:ýLӒE`+wQK]¥][jâô>ÀÊå — Ü!|} +`Çl<ò¢}ŒÑs4%€ßró™HäH°ežy¢Tål}1 *žØÁ0T|d_z1RLD JeQêtdgšŠ…—'æŽïP.N«(ô tUÙ>sˆ‘§tÖZì;ú™ø¥2QêƒjCZOåú»¦†úÆõ¶žl~ª=x_„µÚZ +7A_‡Û –‡º¶cû€5··ý0Ìè9lY·“m ÝwÎCð¬ Á™šÞc¾`vuÑ¡r‡Ö}¶ä£ڂ›ÿöÓø7ü©u½~¶¹m7®îÈ÷SÑ)3ïŒæ/ýé EmNS{ø\ë\:ıkâQã0׬‹ªßú(S¬n¼07ˆŒÎ”ɶl¯ø®€ê¦³Z‚wçmŽÈ®Ñ%[Dâ¨øý(™útöx£Ë¤Ã9θ$ZŸ/œ–eÒ{¯¸4긢¤ +¦Ë×F&ÚVÍãGI³n$—,So¤¥%0`ÆÛ:aÍWŠžž}ß1+e¤ I…Ä73žÀ¸ü¬1éåx«ù —GUa ¤›Àg°Êû‡©Ñã2¥:Sú¾Á=Ú(0Ô]ÜUŠxèç-¾Ç¯ÁÓ&2[WŒ×TŒ°‹‚nýû­÷4‡°n"föpuõz,2ûÊÚ: žüo $rOZw?L7 +³ÂõYx‚J­¸z’Ü*¾&ül¥Y喉æ§?|—Bzòî¹n “†º'N™Sð­b†\Œ–JÇ}ƒ’—ûJK´Ed,^ê<¯8!—¸¢¡î’Á»4¥Ï«Ìøe +J›:ö!´QŸ]PL]yڇХ|x Á18>B:bú¬TI=„#½,l_à’C¨(gôõŒÖ{¼ÃVÔ®©†I¤Z: Úh r𽄍Ìý‚'Jè+ü ӟîТ‘%·Åœêì f|·z+ –^®Ë:|Žµ¶î–_àŒ l{Ìç7Ì£;õ«\wÓh‚ÚPvx4Û¤#q’àÓX»ET:“%]bá˜(|*ú{㠃 ÷¾Xn-[ú{å­§¹É(̨̗žç©ÏÜ•å9á3Ê!'} +•í•þQåÈ;H7ïõ1¿,€x`ÝÅÊiB.LUKnSƒá}ïazë%‰ð„…v^CkÈê\é@ z™1‰QU_hl¸ð¶›Y„Ç-L®dJ 2ãq ðk­@ø uLã.À‚/Ž4¥@–V5Mù1&ç¿KÑ¶‰©×l\šôI¥¦UYß+¹9Ä£ûab.ÄÓÂVúÜWxÙwVðÑæ_ö`#õâÌùúbG©1f nvÙø£#´öy€§Š: };¦"5Nþ°¼Ùhø=@.šWæD» H»Ã·ÌA§—U°P Á +.YÅy<ÿNƒ¯¨ä‘c`bç>NopF†6µCÆ«ë•=~ ÎCNŽW‡v$V+vÐO҄›‰§6BDh—áŽùŠ¡Bš$ž›E@—ÕÝ2í iŽñÈjg¨ ërÅ:3¹ çþTïÙ¶ÞA?o¬J¡¸?§é·z¬ŽA,'gÄîüïÁKæ8½O×#6£× yXiS×)T× iÖ3ìïvµÙ¯l0¿V‡h'Ç>›H¨‚¤á¢ÂÙ©ÿùð÷(u]ÑúÀ«†ùWdã½ï¢B2Vgr¶y¹&¤1ú†ýõú­¢*¶ñSƒr€RB¨2‚`ïcãúÇéXÙ°ÜãÛ£u#azѦõKøùÀSÓ¡‘–c¥uI°³qœDös³õ]ŽÃ¡ð氍2¼ t¼ÆUxo]RÊmx‘q½û-Aj¯/.¶!ªò¹Gýk¥8[Q¿H™V,ù3¥¼cɸ’F ) UìêaYrÕeØJ $'»Yw–QÀ)òW‰WÀ¸ï!B$"‹ö~Ü$Ìĝ§mª<)Œ&e¦·É£<+Eqç +« bQÔΡòf$0„“:=D/!(†Ìž&‚Š®[íT[$<©OWÂߋC.ƒFÞ½±¸¢$|GzöUBð 6º‘QØ[yú<“âí²¾šJÆç„õ¶ëÅ[;ûŠ¦†îF(ÜØðt½âY¤â …Øuèï´É2Û×:œ‡E¹Á2öukE¼%SŽi”ŒyCÎY¿†ëȲß7žwh9)Ôwm…ٍõU€É>^ù•Nf.as§Ólcå­ ´èÖbª‰ý|MCqÎÄnjmbß{o÷¨ 4ô›£~KÌ69¼ÿˆr1U|¢ë/¯Aâë´oxG'uli©d²ÿ½„åšz”6@…#ÌÒéÔÞ86ìZé>¼+Ϩ`ÛŸÕ ÇŸº„ÿCzNMA$ 5OÏø¶L\îQPñÙmßsTµKÔS*³p|‹7¬ãäâá“ð­hp¡lÖ;Ô_¥÷Ìd@阠O:àWþ·cóâb+ˆ+¦Yøô>“ +›,÷vò±Ç'Ï!Œmâ¥+Y¤;x7õ²V ~;}X®¬ìt΀•È`Q)v{œÊíÖ6ïÏÌì½ÝÇ:ÇÙÄÆQ¸š¥Ì&ͤO œ¾Õ* tŽ¿ªé ¬çSZ¯’é¯ÅJ"÷å²Å#~5±mqµÀ™sæêP¥g VÕٜj¹ŠÙÅ?‰[)=ְ݄©8öR¯S6O‡FӖYæÙ:¨ž—4|Õx+>—MQÙ#ýfÌ:µ˜ùЈûF‡hÞô2ü€–ønt3¸ÿ„W‰zT…6Íß퍪՗% Òä8xÑ۟Ìçýþö}pG7q!õ{é²;‚G⪀:žƒNtêapžŽºE«ù?Üß}È]j£h—øµÆýë+ÞÎïÆûùFÔ^¸îâ_´¨6ÈÖm>°~knéÇ°Y‡Á4飋µšäÜ~jjŠÓâVúQÛzë•år6” ?u²ÓÒ3‚?™øyx´#G“½PÓ,AÜ«£.hü +[Ì[=%¹ºëm&áþÝ] Û;Kºb'r䎐†zYwéï…Pßèw¢Ã'dO æÄ~[® Fáž+Ä<àÿDçõU¸1ÝJkHb–¼©·Àú>nÔÝ ez›ŽK5ºŽÚ0·V{lטc&>avyÌŸC}.CÎߒÞíë$‚#·Lâ6Êãí‚w_r&ëê¨ZVáWÀu“’‹½­Êb”'ý¦nâ0«Î¢édÕ«¡È ˜Vñ¶7YQ &N6$’9Ù š9q€ + +£ ±Ï'Áþ3ƒ@¹òö£°öÛ}%Þ<³töÁaF…•…ÑBôb~ÂgÚÇÅOÝrAïP›¦,ò ‹EØ4h9ㆪ’V°ˆuIF{›‚÷·Jõ‘¬iFFvò`> ¹˜‘“†³#N}¶q}u$õ¸&¤rr Qҏþ½níÙÁˆÞwèGùÈGéÞÈ z¾ˆYš†Ê0™¯C§ÒwÂq6†Cø&xkÒµ¸º<åè  +X?Òsjp%+ò~et9³ªÃ7·bõ +ãg|œÇBM"ÿ]µ÷$LÀþ¸)‰°6a^XÓä1ek‹¯^o¶ +šÈ´'BR#”ŠÍ†z§ú\´†hŸQ=¬üZU°ïœð ŒÞ¯ýxžå +[ˆ¹¦C}ö +Zø–JR( =†ÿ¾€E¶ÎÐ?£]7Öz±¸=Ž=çݞÚ&Eób—ÈZ"»\íéÒ·r…ŠA¥¶nûßü…Õ5”.dkg¹YòÍînŠi“Ôþ½%NÄõΕüƒf1C]$ž0Ô$fýx¿Žá=Éés§oE0ïäß¹½^y•t¸¾ˆZ™/ÉB^‹¤)Ÿfd4Ǧ‹¡¤3ôì ù³Øü¼mˆ…ËW#ó›$FIØNc|8\#T^ÐÖK }8¥£O±žèî²ÚÒ_õzÓ$æÊz»lààμþ–Çf3ìTñþÎH¢‡H‘³‚¿ù;×Ò­^ƒŸñ.P„ºҘTwû²²Än¿ÀëÒDÈø»Ùú‹(U»³g—È# ƒI$ٍٹeœU×»(×Xº×fP€¡L$ß;îúI)~ Óêƒá–Swên®Ue}5ï“Ë|–›šÏÛv¦Ç“öƒú턐`||,í4Ÿ„#†HŽhüió[)ǘo?çµu牉_‡2Œ5 zs:Ïe7Ý[Yö)yfWO¼ŽúMJ¾Ð²p W\-ßÃs÷eëý¡$2Yˆ~@sû;-ôN¡J íVc=KÂuºâ¾/:BQJ·¶®·”šåM=.helèãÇ:UVK¼å̸Ý!ÍU$4vGQ‰&«¤e—žÓ"íç'ëOMOweEî>Õg­Å93³|"àUμ@œ¥TIèïøÃnÖ"Þ½ç&»”é½hh×zÇ»fÎbtìÞ§ƒXÛûb…›{.œlÙ^N·MÏngúzëUÛ͘$é¶X…)}({oJ-¨rLˆÃ¿þrˆÐ}µì«3 Ö  㹟àox2¾Ù쎵à½ÏãíèeäÓ2¹c¼˜‡p‡ÀWÃxÊfƒü#)O½>#ù'ì;AiübaÁ´¼BLºCÅÝδ ՟^LìRY,6>䣶U4vƒ#>é}4ðïNô4ú€rŒ[{§ŸW„o’Ÿ°··~ ÃËÅrî-"í/èÛîHሜÜS6×í õºÇƒÀõ=Eß#O”î)£,X|¼Â,ɒ(æIty¤ˆ(;2þ6…©YÁU›z˜€º¬¸»’OA½ð4»Ð¼kIBý=|+فƒ£º2Õ5Á£€H:,VJïÚÕÔíè~+20>•šAq4€á†%R+‡HWù&æµ6šp¥c<÷†,~ŒÖ‡þ]T³Øbõ‡ýY8éve0äqC^–Ƥ6So«M71 £ò™°yá O=‚±Ï…ü±wð0 ÚiøTq‘'[mCù]ÃüYV~Cෛ´j½xqæ-&%T\S6A֔9*¥CL¤f'JžgýPö ùÜÕ.Dê ¡‰_帏?¹x~"Å[Y† Öa*y"{ºçÔnŸçz¹yQu—4͞ZN Ó¨ˆR{$BšåœM¨Î6ü¸=½ + 㩚̗áý†÷އ øN„"¤dßs›T­ +U—pì®Ã`\Ë7·‰>§‡2ö]šÙS±bÔWvá1\7 2z÷5À•M–X]áʌËB(H82'â¬k Œ¿å‚ +yÈÒ>8øçuõ·ó›6{M0'#øYƒšŽ—j˜¶â›†Ž}Õp>üÞh‚’!Õçªó¸6„ŸÙ\I=u+-À;ú¾ãH¢‡zêÊ?¨1Ew~®»ü‹6ý)[>%ƌe'oxEƒ»/j' ³ïµY€ù¾8Ù+aÉìâÞÊ7^„ñˌÕahý¸÷×KÄ>±p+ÌÑí?[£»ƒ @T +N5iU)‰ž|~#³O2Aºrk삏*½G7|ÄA¶ø±CÉB£xvù–¶ç?tøËV{¯ðä ÒB*öÉO¡Ç¶H¥g†÷VÚ¾¹7¯CԚ³Ï—ßC8X²PaZÞÈ))pwõ>LÖUv–³¶ãÿ†ø—D›\#%gÔZRD\™GNÂ{d´L¢8:lêÔyŒ¼¥§:ªî~œk.[¾íò‡Ÿ–Íèlß{ÕmC6>O°J?ÌÑç'¸G J(òنEïY‰éÓðB˜ªl”]kŸÈå–°à‚»?)dU…­b¹*-ÅéóþTzÞ_‡eèð`¶§я¤ªÜçiG1¯CNÓæ'u®‘°ßäGÞ³vÉ!uÙv(^D{Œ£DѺ~:”ÉŽFÛò_7¤˜áRm‰E±- ©àsÏÛá‚m8<¡@Ñý݀Z[eÖ1"ôšÐ¼g4V˜ûùÞdöъôã×ÞQy²‘‹9ƒ°$O§ÊòŽ4Ôe~Ù µ +ÿª!hzŸ>¬c,Md÷´&täë‘c2Ý·íª›ö€oÙ5êÿ9$–ôÄoT¨Î㡤ߺنÆ敵Ãþðo˜“Ѷ$º5{— +?Æìh1„‹6º¸é섉[”Cû¬Í­•› ?°£Á)šuˆ\ClrÈ튄sëI¶Ã2O•c›±ì +¾¤¸&ZóÐüdg©sÅðI,^ +E /Aüí¾#F,®ªbŠï«”ys?LƒƒŽºp$´:ªíÏ;£«Hºƒ:cö|_e3èçx/£È†­ü֞îی4L{«;—Àú´dàSS~¬k|ß{{ŸLQUÇåÚT>¾¿¿ë†ÐïȲøj }pn•e“¿þîS>áÌë*³ºÃE|Ã#\/¾éc^!¯“¾e¬€î՗û6øˆÍ€ö$ÀÚúŠ÷È¥|Î¥IeâškÔäcð¤ÆÃT@šN +¢‘™ Ӓ G…—O»ÿvY Ä}›ž>/kÁT ?w9öú ƒO°‰dG››HwEÄ¥»öo=#s¿)·溷ŠètgB_“°GÆô›õ²dóšëïvq£Vt“|²úvöBόie·œÉ9\Tž’È}Âf¦/ÈÿÌ¡£ŸÅµW`4 œŠ!TÓt“)Mtm.cŸsÈþ|âW™ÊšÒhÝ[ô‘·ûçžú GQl¼ác˜iÝú%¸¯Š;Ø£Õ<´„ æ&®öý}t'eœå±ôw»Ë¡Î·çtÕ_òsýDJ;rîӊ¼8ôQ?Òë>sff ì2÷y¬È¾µtš‘æ +²þ8;%ý„\[ˆeÀЮ,,r7ÍEnËú([À(þ +…½~À3ÏÚ7y¦†vì[ÔÉñ®B;g”,PI$gAGai¡ÍV-¹Ø¬H|ù§ÞSÉg»-ú6 ôàÃöµYRêå~Œ‚ȲúÏåsŸÏ©2Ɵ”••È|»³Çú(ÚdÎm;¨…\+EøeÝ<ˆZ¼á\Ÿ\J°FÕ²Ï +ŽHô¤×Ä7´œxx3fޟÕ&&(ù1ŸÔ¬î´tp"4z[äË"Á¶`ï7Žß”ŽÝwfÌ÷ }f–œ•fàƒg×8jE`yØ¥Äæ`±Àœ[A· 7ö9±Áĵ‹à +§ŸÆ9SŸÃ¿ ['+…·lÁmCRÌð惩û¶&ûT´`vj†hD ƒ´0mMA’BÔ¯õˆ«€UqZµ­äzÖIïœò|º¡âhˆ!~Æ-ð­×@Mg†ùüiyç-j¾ì+4œ×Ò£ ±.5ÔÍCóàõ@¢ú2"¾,¦ò =«Ùþï®pÛDØB—8'×ÅÆ®if´ +¼¿pMb×Z˜2(Ÿ'9D/ÈK´ vM‡òœ ŽWâ»F§/·æñ£?3¡wTr€jÄùOÆ jc®l’ Bb¼ ÜúÙ0Ï]d­yh0\"¿ÞÁñÆ^f1¡¼Úíµ›{‚‰À„Zb{";_kN¹9ë畱.Zò§¸®ܪecՙNÊîéÚ®kÂVž¤ñe“Ö´ìOÙâjЬ¯Þ.ÔK;p¾zj¥m;H5­’LÄ>b1ˆSl1ª¸íÈÇHÅð`ÖÑùØþ æàKxcšÿ:pDãtº9Šò#¦gÊÒo™ä€æ»3ÙÓ`C“?æ"ÞÞݗ\.ŒDΎïúrû)ð)™ÕArËÆ0K±î9)Ô—Þ © KæRsy’à•ÈëӕöúbY©ÉÜJŸÆL˜ª¸'M‰Q‹#Jað{xÁõž”»QÞâÖ }Í!]¢2$-¾†ÄÂ6ÑiCmœ*[ð˜(t@šä0ú< Wª·nþ,Wëþ.d³ÛJꍻŽEJ99JºZ«QH½oòvk×¢×G£Mòb(™w¤¸¥Df¢¸¹¥ûØXó… »³h&Ëó.ÁbŒ‹âÝáüZbJâÿñ÷—1žÏl¶k*í+~ACky¯S[ º?{­Èe× ¥‘q¨T£°Öã-2Ô{TbèñG×?9Æ +lq(&'è/!³]lǍNßÂröÜ(5k¡š™;¥«µÖ(§ 8ž$%;˜3¨‘âø_~Pþ?Áÿö@3g(ØÁÌÙåÿt‚wäendstream +endobj +925 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 49 +/LastChar 121 +/Widths 8022 0 R +/BaseFont /PQRBRE+NimbusMonL-ReguObli +/FontDescriptor 923 0 R +>> endobj +923 0 obj << +/Ascent 625 +/CapHeight 557 +/Descent -147 +/FontName /PQRBRE+NimbusMonL-ReguObli +/ItalicAngle -12 +/StemV 43 +/XHeight 426 +/FontBBox [-61 -237 774 811] +/Flags 4 +/CharSet (/one/two/three/A/C/K/M/N/P/S/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y) +/FontFile 924 0 R +>> endobj +8022 0 obj +[600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 0 0 0 0 0 0 0 600 0 600 600 0 600 0 0 600 0 0 0 0 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 ] +endobj +621 0 obj << +/Length1 1647 +/Length2 9838 +/Length3 532 +/Length 10715 +/Filter /FlateDecode +>> +stream +xÚíyePœÝ².®ÁÝwwwœàMîNpw .Á œàn î—|ßÙgŸÚ÷ž?÷ì_·îTÍÔ»úé~º{=kuÍÔÐRªk±JZ9[圝 ¬œlBU£…;XÓÙQÕYP™Uhã®1w¼b¼(´´Òn@sÈÙIÆè­2@K€SPP… íìâí²±…t4õ™™Yþiùã°ðþò Ù8è^<€Î.Ž@'È+Åÿu €ØÖ  @ZMÝ@AUÀ ¯ª:Ý^›Pw·pY”A–@'0`íìpø{°tv²ýi ÌöÊ% ˜À.@KÐkÐËèòb¸ÝA`ðë3ظ™;A^÷â 9Y:¸[ý)àÕníüWA.nίŽ¯Ø+™º3¶t¹@¯YÕeäþ®bkù“ z…ÎÖ¯žVΖîZú {¥yE!æ '0ô‚üÉeXÀ.æÞ¯¹_É\Ü@•á9Ùü³€ÐÆÜÍÊ¿Ò¼rÿٝö ø/ݛ»¸8xÿíü—×ւ€Öl(œ\¯9-!¯¹m@N(ì΋‚“µ3€“ão»•»Ë?0 Û_ÄðçÌ0¾anåìäà °Z£°«:C^SþïTfû÷‰üoøß"ð¿EÞÿ™¸ÿªÑ¹ÄÿÓûü¯ÔrîªæŽ¯àï9x4æN€×YPü6æn€?dù¿…š;‚¼ÿ»àõÖþ]õpþ+üw +I'›W…X9yÙxÿ6ƒÀr / •:bi °6wxݼ¿ì:NV@7ðUä¿ö÷5ˆƒã_0m[¥½Ó5xÿ†€NVÿÚënuÀ®­j`¨¬ÎüßLÛ¿œÕ_ODÛÛøLz*ÎVÿ¹øC%%åìðeåä°rñs¼^Æ×ë(ÈÅóþÿö/"ήUÌ!n /€'àõóﮌÿ…FÖÉÒÙêÏ9҂˜;Y½½ÿ4ü-ÝÝÜ^ÿk¼vþõ_—ôZ¢,þp¶µKÍHƒÔä ŽÉõvs†¹×kæV9w¤F¬ –›=V‡±5L=·zϺN!¹ )†»KÕYxtwÎ ¼èNÂ;Ä¢óŽ ÂëÖÕ®T§™È)†÷ªñ&ÜubߍÃgÃ>ì¦> ÌYœdE!‹•‘PpÀÐTzÅéòW º´®K¡õq*dµôƒ/òßàìÛù™ pÖËÏ{½åô\§ÝºÔ÷¡ûYã½ö’°1ä6·õ+Ž՛©J"6Pþ‹P R¼üì(.Ã؛äaÄ·ØøFï°Ç‰¡Åè)Py¼mÂl«”%Ï¢¦~¹ÄY`Â*[ *f¥Ø>')T7¿!”’Â5ËY“LÇeˆß€qW›æ™¨Hg‚ë¶/÷ÙF]€7háñ$uGdÕÖì÷#G5¥b=È=­>%šO~á7$'?¯:!é¿ {¬Úˆ:Ö7&Î +¼$t]-4=#¯ +ˆä$Lõ=RÉæyGÿM2g×ä­V<ÿՖگõ¢iòkÄTlƒýL‰üy¤y9ý2­ ÷ôþ¬ËÕµ:ä|¯g³Z¤ŠÜK;štø&Íío]$6 éñ~Ëz4)dœ0GÝUfie}W‹/ô×öÖf@ƒI§ßlìoKU m)N öu;0•ö»g®°êý4òìÞP™T©goßBõ÷/•— +Ä·sN­Š?¬qx<Ô,Ž°és±y"v̓Ö<\™ÞV=>DŒ‘ÄçÉjÁÊtT(ØÕ-ôØ'ðõؖŠI¥~ÑGfà (PDÞÐS3œ‚ti¶ãNïò^I ¡G +ÕBi|°ACh·7‚ÈCG›n¡®Lí/¿\×ñ,†1¼XÞqùî‹ú#ÁÜa#ÙtL[|#ÔÑjúåìYLê/vÁŽ5ôqM{ŒÉRAãd²é!GE/±Ð¯1›;µ‹¹폵sµ)¾qN1öíJ0ÅbêkšjbA±Ç£ãqe£ÒÒôÓçJ×íP®öòl€÷ y Ԟ6 kóðŽ.·}K,Ï‹¯¤ýžÄI4›êö~Ð,jO³»BìÑ~^Œ¬ Æ@GLª\|-ZŽür|x»gºÚjUˆÜ¸Ó—ÉŠ7ªÃšÃŠ3Dßð~´å·çx¼)sÖÆ´/|È[l®D(b‘Š·¯Q!n«ÎçÂ8›'Ú=4­QÅFa"¬=3+ü.ÕaVFrWɁê~*]Ô RË=éò,Fj”ß­Öv[ôüPÜ՝ŒDös?ÙX®W‹–é&Ðÿç¦0ßb-, a+1¼µËi.˔+¡p6Okì‹Í[ÚPË÷îãk^V{Ï?<•Ì›×¹l•‡y$6Jj*|2YŸ×ÅP®VLeðÛ4{i´0¹²*ƒ)z&}+ósù¶«ž>sÉ®WjCµ¥´,ð·)â5ç0÷­\MN¨²ðõ€î¯`ŽÃ>À°ÖÚ¤¬ÊŸÍGV»¹«í±JyBЩ¿?k£æ{Å$°:dš2VùEŠ/RÎ^éD€@Sþz‡^•&h“Î+óJe¿ÉÅÄKùRW÷pqRo¼ñ±9*<òwØ՗Õà©O¦?žx$¸Õù‚ÂpX¼z¯µ¦³¡¿%%£!%CQ㪧šnˆ; 0Ÿ°Àr?Žð9.½¨¹9DÃf–frT:JïâÆÌ-Ý…‹Ê4ԅðìv¾hЧDôv±_âtÀ¿+Ðë“ÔùòÉ<òSÀ‡sbð yYÔ©éÓ( 7ߓ/Ûе=,Y|>¿;W§¶qWϯaÁM«ä&`m¸iÜ~)¸É¿IЅ:ፆDxv*ŠÞñvÞ÷³Þ.+ç ðÒ j6aè§lÆá²lVGÄ©—½|ã 9¤‚‰ŒPž`~þ±ÎçÀY~)^Q¿˜‰Ùk©k°à ’=}c°FâáŒXq_Ü.Í{B‹˜sÔGùÌXÙ`"'ۙx4”åÞÍòKWñpO(ØnŠsªnéyÖv¥V—ã wu†YìÒ _™‰Þ1£(ÏGÔÑô„r'«{|îòu’m¸µQtÎwù¥¤ óÛՀÂíG. Žúi4‡¥ÞÌ£j³•èïClº]2È-’5<£ÔÁQDU 8H¡êÂ0aßî— +\I腽ï\‘rïW^4Åᖅv­S®ÞõuX·ˆŒv;RŽù*ûº'~\w¯§lJ" ¦ÂÛ|J:Pç›æ¤×ñâW·ÖfFå灅˞ž)€ë|SmÝ®øÌ[ªÈcn=§§qc΀¤?…ïò3F¸JÒº–Ö­Ò˜XpkÅ à¢iî>zXä5Ù?ÚÚ¹nC÷͟\vبŠwM t琒ð2…0r‹¡Êí%@(…Çq¨å‡ÛÆÞ´d AøV[àÆ^%±z‡æ¹[»:›mM¼j1’)n2ýÕ1XóY-^Z>öՑª` O¢_bAq9UÏ;§D‡LEýøž©ž*."B”ȝ·¾~–ß•®nO^7Aå8äʬ—‚¢Ü̺²äÜç×eý9ݚÿÆJ6„¾0–Ûhôg£éݔÔ°'ÁŽŸÈEM ¥©¶>ÂMWß%‰”Ç–Ç&Þþ³‹ý‹ÌÛÌÜ'³ÞÒ FY¾¾Gk²º®Ñq|m”l‚G^o©)ºC#´@…(¿†ÜX×8˜ñ~U5³_ë\}Â?ʝœ¶''÷ûĖ¾pO"týˆOJÍď3ÁQ”/Ì#øbd]yµ—DÁ1à',Ÿ´á/ä^+ã æŽÅ#C– 8Ë[û¡‡Õè½Þ„!·“0␸ÈòÝL[³OŽ•!BÖÑ«íj{ÿ‘r±kSó큛àl˜`Þñý@úNáùÙd9=CzB=Vr‡Q ñ2Üå7¥õoõe¡™™Iàb˜Ÿexãî_hXI¦°hK¨KbüÁV3,U‘ÃkŸ”hL:{ Ï‚N-UQÁ„º#ŽØÉ#ÄÏX¿ùòab´Äqˆtd ²?°‘Íïp fÖ g$³ B?+Ë͜ ‘cíó¿Û6SÓõ^¼ò ¿–…»ÞE·ÿÈÞøcÛp~·õZÆT/yÕ¾¼·*JëÖTSÿºwÿ˜z +t€ö9çKAh±d£$‚˜â¸œÍ„þâÖvà進íóa¾§xOWS2LÌZÏ}üWÉƚL: 㚝ءÑÜɼoÉv¦íÈS´ˆ-Ôm©áï ¨¹æâ¥Îà„îu˳ “Öùڀkx] dT×}iôvâ§ùqsƺ§œ t«Q¿ŸoÛ·ÑѯÏ Ns-ôQsòȇ¹äÔ3¿¾·N¶„k¼Y‘æ‡x¸ÀoMÿõ¥2~Ÿ ™*$õq gé©le“h–œ½ZÕÞ2Gˆxk,ˆìÀá)wòçéó9¹Œ›¨Øˆþæ"¿ÑjMŸã­Ï}XIs܊šbÃß̂¢kÄáSû¢IÙÞ¤§_Ç-ÄC­6ñ»Í‹ð­3`D/¯½›½Öö·ø\Nª„‰o¼ßw€™¦Pòh6J‘¬îõ›Kžî%™gyä2=ÑÇé8Äì[â/Os{K¹±§;³Æ‚ﺰ4¤±"Îi®lX…±‘#$·QªvÂÝY?ހw©0\{‰‡/ =í'zºÁ1®9 +íµå†s¤„÷;(ÀՉ˜ÞEsÕ·tR]ßÀWÝ¢Âüèö»¨NµÓ…܁š¢òŠ9&:qŽC—ap7ÿ<ú¶Ò +]qL¸³6±ˆM*6§üŠŸ¼çÅJñ/Y*,¥‘·l®ô¨FÜ3¶XqU' …SÑ»¥´ÑWa>N§ñR¿URÉ+ #ƒ*>×iÞÊZZ#ÐƎê1ˆägÔ.TÇrCåöÐßø儘m-ÈuH‘a…ó8øNÂ>ê})[»ã1§ƒ~ª5‹"YyÞáù­ Nõ·¼‰CÁÑÃÄ­Ö§¦Oé42ꢒÁùsC҉l.Ó[Ì<î3VOèõžÄ‚YX\ïJÂÂwç*­Ph» LHq ­!VîÉ·I(Þ$}¿õ#¦á́Xï¸'&ÕÔîâ®'VD ÉîJL wwZìÖ\ø{½S­[Þ뚸i V: Õ¬÷®kŠ +uª…Iði5’×¼î'†¨ÎÖH +²â b±ýýybtT”vœÖýñ÷‰-’Þ®—_óµ;Wº*ǑqxÒpüÙ7È<¤I¨KK‚É®ºÅÄ ø'Šr²ÙR}ø—J›Ï×FÎi6-+˜/ݗhT¡¦©þV­x ëà´ðŒÞë¥&‘iYúÜ"}²þ`úÀE;þc¸È‘a¤¿6å­—Ú™WUzµ›âeö¹ôÛ4±ªA…-#CžÀÍ/á#ƒ§ø4Å$Vó0d«–i[ÁßÍ«¿ÙìÁÀ|ME͹T‘*Må*K—÷n',îÅô—\ºå)/…ZÇTƒ¨N[Œ&§sRŽ¸§#=gãM*4BSŽ?««ä*qÕæyBïN›X–í(|°e \eú•Ö‚ð¡GÅ⩾6™So1þ÷ñÃq²øÜe½~o$|ZɐxmŽ€qf…ž®¹åãD/žÏcìt|ô´þÔ`"BFGÖœõórZB£uâBŠ7öÃt…òd²¦žÑƛÍh°ÙI>7âŠâ^•ØϪQÀl“ˆ(ŒQT¯Ü„çܤÔ}wó“è‘õK'BڜF¤"ttr!3<_Vnïwñ¦]K#ÝJƋ<]Téa,Ÿò!Œ;‰nµ‚þ\›?Dxá¤6±Œ>~:òƒzüù,þÖI’¾<];´’–«lJ4ÙN‰¢±á\½ˆÓ¶Pp–—Vù¥ ãý²ä£Bïáõ@ǁØ!Ô¯Jmí[ÆO!ó/m¥Ñ¿Œo_¢³³A^çS’1ã7Øì~8Æ«ŸlÊ>8…HœÙ°XAÖ¼9ˆ5’»]‘Ir×$!KÁŒÙã.>vjœnQ’ÐT¤1mEÂVCmB£"ªÁ)P¿‘â)½›O®tjï|WüYŸ—c1;O¶š “8í¡ùÀ1#ûdf¡8ükä;ӋY¶¿ù&Ì?@ǃmù<+xi¹w‘t½IŽÁ®'ý?=ç¼ßÕ'“Ž›ä×;錥(ÖÃBîàPA»ÌzÁºrO]wLy…Ù)¬)êwì8gè[vS³Înöáù¦))hfˆ&¢.ÐëlBˆ2¤'ˆã|OÎކ§y8iŸW¤h‚¡å(êó_kË Ò°¡#÷5*F#¿6Ä0,,Hêcï­ð·¨·(ÿúOÃqõ¿ROw4 ª§$Šcºš–Ob3£K”AkƸӱ]ÀÈÌ]PA‹zî[ÑÐrWÎæË|/žÐSÃ搐³ÉÅGŽ¯V­X§·y6£Q{¨ÞPä+¬ +ê¨~â2Æ^«¼….êíxÓ ^øQ0¼Þ1Ž.‹Y-|CmxÂy ÅWJ<‹¼äxNfts~ðñŒçÊæÂ` :¢ƒã,éÄ°.zàÜÆöo}> ·ºjÇe­ÔÅ«µ}Ð, KˌE¬¦ðÉɝÛ&5šL ºÄØõ»1t¢”¾Ëè«0å¢òN‡ L9OÔ±UPœòÅPûeÏ"uëYñ©s8HGRޒe"ö#•þ6ó¹qÝTìX$r+->ÁÍðáîtƒ"®Ø»§&¨ÑƧ¬Çû…nÊüv„9…ò:³Ú2% ÕÊí˜ýžæF møèÆuLÑ«bk-føþ|1ùÞø¢N}eüb5þˆüøÝ*þ+D`»^SøŒN“-HÚCÕʦ‘·¸äqtž‰ŒV† ƸëgË3;Z‹gîºnBùDâðGc\ؤÀ¯Åa~A20pVæmS.ð‚ünçw’c,u¸óöËe_¶x´ +¡>›¾P”fë5~aON²H®¬ý¼¾?{®•ÙÖ¸˜{™lm‹«ƒkøü3 –‡.Ò1Î6Wþô”À±ÍÄÔ- f±ë0+á¨Ä´F%Ð_f_dª® gXá·VׅqLcá.>ã§:ñLj“BÁ)šïoåYäXÑpïªVeV·Ö€<ýÙvÎP_%¸ˆ 5{¿õ5¯(25«œú:Î19VV÷’®ÅÝ!ò…-':vŠû¥á‘÷-¸µ3RLæN•¯PcÓ'®>Æž¸°1Ì¡@º‹‚v–‰7ˆm3ÝÅßËϼGtŽ(Î.V©µÓ·GÅÌE4Ê,àçôö¬ÏŠX ō@­üùQóN¢b­¬»G6`åýf‚À³—¡·Z,)äýé1ÈbÞÿvÿ°xá'÷´zKèéÖ%üÜya‚Øæ&0"@U–x +m[×Ïa@6̓$žrPÆ㬿6YԙñÛÌ~ž|Ïn¤CêȽSO—²eN`„¥®;›R¤¸qXVÂKò%˜ÆÚÌÓXŽŽûùëæ¹Ì®³BUÑGdòY¢y­{¿EòùóWŽøú O{cvœ+2œÞ*å ½Œ4V²Z„‹ýl—ö—|üߧ *“ôF}äþ§ ¦8ôOˆú&UvšÚ "çË׃¬!¸°­ø¤F&;ºË˜hČp¢Ž©*”ë! +-,ˆ–ÌI P0ÂK@ˆ€ñJQ4ùü¡êÑøaƒµJâ|ÃOàS€ +Ⲩ~-ô×ٚ"S+ê¤Ý!ÄæïèØc™ÅXé›ú·ßØ¡4‹€lM+´”5E±¼Æ +åÐ Ö¥×½O¹ cŠ²æ|M•¬vû´ÁÛ(¿‹;75oXDë¡Døޒ$_¤¡ˆ³¦Lš— ±e䝀²¸/ß¿\o¸“3øgh$y!Sh퇫“nçñÇ¡å“z—oÄ1[ßôµ°~yÒ‰Ä +Tà‚ïØ$T¸êãDT<&}90Ûhë&ÉAcúò¹ ïh ÐwÍ;C¤9y7*&"öŸÇpDið•b`X²¤|{…¤ÔWBÌ;gvï'»þÞ UR̕‚;dˆÕ…‚>¬M©#.ƒWèÔ²ÌDðFš·w+y–å>¦QÊ:-’?ó³vm‚D×±#¨©—ùó;ßè°sY¦Ö§¹œ{K- ›Vè˜0$!?’A¦`ªþ¾ª;‰>iö¨AY¸gl–·¹$…¹z?èà]=Z­:}TŸm¤ö‰Hyc·ٙXj~_ÑY ^jòây›ÞúØ`&¥.ېe'bEœMyh›õ¸/ù°õóJ'u¸„[4Úçƒù2÷n¼¤“×÷òK?rßPŞS±uÆÆó¯xkaR*Àsp +Ñ&Èî8*èFÅÍÙ_¥ZÒuå¡pÀm +_Æ »9Ûà}!µB3ÈØÇx ö˜Æ¤ÅùQŸi)¢7Þt‡dæB®øÓEˆôÂmß.¶³vý¦oÌuµs®N¾ z X~•+â7 ^#ž.õˆƒ—;íà1Öë¿^›fCð‰ý{HÚ´¾Ë$…¿·EH£~Ȍíý,Ô0Œ;»ÒÌ8LB1Úhz~ߏðd¤bv_߁H“eVŸœWsð+µQÈ㺊R;`NªŠdeà{>·þ—_mø*ÌÜùŸOû3­·K®„ÝO‚&Ë%–Ë-_¿Ãk£ÚHÿžçâB$|éÌ*÷‰)‰ÎöM€Dû–½¼a؜©hcäúž' •¬y—ê:è`TxeõÛWñHLuO‘{TÃj›!’˜£èöÙL}TÀ€¢ ­ÄþV“¡„…:œK5ž.¨ÐM*@vê5æÕGÏç亗§âurò½áô]ŒºHm)™:K±€Û[c8 4Q-S¹ë\™U÷žLF÷ê×e^¨r”YXƒPˆ‡­«ì³%ÕJ7{X©£öùOWÒæwþµɓRd`h 3çô+¹V—©¦:V¶«Qn‘FQí8ö}”Þ*ê¼|Áh¥Ò„¦’³büðÖûª=Z’gŒðŒ²¢;Æö¡Òœ{5´<)Ã? +Ês²x 7Uö¤(ûK+¾†ì§ÂÌ-ÐfÔ§U'®;¦g³ž—I<­€²VŠ1Á†mƒ"VoS[ ˜—Œ` +¥Ž6_S¤¢ùVƒtÙ¢]¿Ÿý”LØ¿ßuÕ.5?Øyµ¬l™óÎðóð lMì ‹m“Ô.ºó!Ž÷Ù*ûüòR´š6~çüÜ?òíÒB¤<¢®^¾° GЧ¢ð®´êá"õè$^¨‰°›Í—#ÉÅÁ„Ó2ÈߓïÔ]kþäÂ.¤žÒ®þ¬9ÞgÏ(Džû槤9bkQ´¤¿Ÿ'áãázÕ|Ù`ý£F$º¨–i9Jk|Ê ¼üø>Ùõo°ÃÄjl³m†RS Í×jålô:TV0Y pÁvŒQõƒt¸Z)·®9ËÜ ÖI¬U IÚ᳘‚ߤӎ¾—6`ùî|&é»Y2å[ä²}>9¯D+X±1,}ùüå®_se’×Gº3Ñý¡íÔx¹’:ôRÈ{0aIHÑچ@:¦Æ‹”e™ˆ½ÂD‰á-röÍ;N€¯OéÆÊíã›ï“S(œ¡z‘»®£ý‰úxKÒ€‘€ê_‡^ßå\×=lvÌZA#1Wyá'§±©m2­g]\˜5\¹Ô=~MM{—´¬|¢0 ®1»'† gÃ3êö3{¶J-E_i#́› @ŽjÞ¡)Û¡ƒÐtLÆØÄîgn.xáë…ã(nhÎ㩏pùø¨È¤uûâ)K?ñhfHP*s Ê×1»õÖa§)?Q~­9'îSÌ.¼¾Y»£ìá7°§!ʱŸvØ°ÊMjâ’w¶à& aßo]åшµÝ,€Š +ééi m}sZé‚þ²õ¶OLúNÀµ}Ù}¿G—ˍ Ã̃²ÿcÐKÑ£i-Åʒý:neA½¬É*n„ˆ`ì%õ‰‡Ô,̓žüÀ´d™c×ޏ•Úê¦ÝG’Uýëþ¼ÄÔ²LHxU±©,ÝݬMó÷Ýòéd§ý›}÷?4–÷#ÛeVfWÌeEΉѱe±TŒÅÄ-_>0|Éž]ã#•ûbTk|œØ֟o£®ìl6êX@¼‡ìpwÁ[Û°~­k¦q#ÁÕ¹µðEòÓ¶ïç7°€î`u{bÕy†Â<»Â÷X®ã~¶yÜÅk~¦æ¦F-%@$tXŸ(ð <2 )u‘ï”Ñp¾Ó•Df_\ЎÙ;8 ¥ì!¦Ê–Ö9LÛ#â›îH;'ô:P +sàR»pþ>Ú_hV¨IÆmþ§ÙLÄãWlÔ¬FsÉá›s„x™Áóµš3c4ª5žæx¡:÷J‹ì)™u=Wt^ø fҘån8S]å(9ô%±Æ®VH@èàU.†ò6ύ<:"‚ø=ô‘„µ§;!ç¯l)í[¾žèqW xïÛÅÉLìï÷Çî›ô¾·Åi!çíܧNܾï”ß\ã;äÚùæ,Ê8£þòÈÆ°Gšs¾:c£"z9Hò#ª!’¢cñù\Š£éÊ$u@ëŒ1›…‘P5¡{ÙPHFåsé64Ÿ8º‚5Î^Šx˼äÁ]Qö³(]†™ó·î¥‰÷ˆnÇü’Ð5ŽŠþò=Ë <ÀL?¯€E"q.ß±ÚY®;„-/$ºüâ8Âü‰$˜ß/?-Í-ÎæÃì[ÝøI»WÈäFÅW,ŽÕ-¶†}*HîiؚåM®@½Iïý’=-6³SaJ%ë–R°¬ÍíŸò?ÿâ®M\‘,ÆgåµJºoˆ)+ÐË-õ‚Çîn «ädÝv· ò-QZ®qdNød?¶s’£áùno7Ù_Ûý$ga»·ù|TÛøƒ„(ø¯ _ü]»×úõ7 *ó‡âàuêw’§ãÊØÃ6dɕÊ:©u7a€ßfôö˜V;fݳÒ'útƒÍ*[ΣÑZúpûy!´±Ԗv ,¯'åæ'}s +{Lº2?U«³«n>Vú¸…ú3&ó$¦Õ_á†ÏlH–Q%9„Wm‘Ÿ- ¯ Rº°Œwš½‹¦#¡”ðõ%ßgœ˜VÚ¹ß@ã"ûc¬ WÑȎ”§Õû?|–”;Ëv{–aEEX|6Å'øzë여)XæVk0¨¡'ž4D ƚ2¢ë.8 tFî÷©yS„då.ÆÍÖ] +‚AêK…H!Z‹¤ßß÷å/ÀÑÜæàüÄÌ°ÅÔ*>pk:Rö[֕fÖ©UºmH½=þP¨Î,ÀŒ´‰½3B™ÌÑä‡Od|0—^ô"l?šZ’„m€Dçç°¨£x¤—µGs£%*Ü!ó|[Ÿî¦á숭Š‡á²W ]Jköá{Ú·ÿâÂP²£Ÿ¡Cjðè]ROH»ô¢2Ò²|GÒ}÷r!¶UO,}¥¼Çù¡è"ÅAp'ÿG0Fߔ¡">òÊúœº”~åD_cck|%S¦®29¢\#“4¦ÒA¡ Ø!â@_‡:äˌöž6Ì=¯sîüve±¸Â+º˜afé" g#¡lÞO TK[ ZúÕaEܪŠØVƒÈb—.``ŽÛæ]‚ìuE§)#Êx‚Ä~Ä>ÀèòË)ü˜X€:Üíï¤/;UäûÜvB‰´Ä¢<…_‘V­SËçô‡¬¿5§âjU|@ÞNÜ1_e܉¾£²HPÈåßEúž¯Óۛլ¾µþºì¾dTWVSÈÝ£^ +jIà`¸VXð(zýYÙzÌ}ç}߀wX W“/|++.ÛÆ".IGy<ð>]ȳÊrÌ£¶Ü áJݏfº[¯Ü®¿ƒ-œö| +Y†ŠŒäkžŒy{níx§Äñ?|¡ü‚ÿ',€ængGs7{”ÿš‘rendstream +endobj +622 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 46 +/LastChar 118 +/Widths 8023 0 R +/BaseFont /TNYZLP+NimbusRomNo9L-ReguItal +/FontDescriptor 620 0 R +>> endobj +620 0 obj << +/Ascent 669 +/CapHeight 669 +/Descent -193 +/FontName /TNYZLP+NimbusRomNo9L-ReguItal +/ItalicAngle -15.5 +/StemV 78 +/XHeight 441 +/FontBBox [-169 -270 1010 924] +/Flags 4 +/CharSet (/period/zero/one/two/three/four/five/six/seven/eight/nine/A/C/I/L/M/P/a/b/c/d/e/h/i/l/n/o/p/r/s/t/u/v) +/FontFile 621 0 R +>> endobj +8023 0 obj +[250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 611 0 667 0 0 0 0 0 333 0 0 556 833 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 444 500 444 0 0 500 278 0 0 278 0 500 500 500 0 389 389 278 500 444 ] +endobj +531 0 obj << +/Length1 1630 +/Length2 17287 +/Length3 532 +/Length 18211 +/Filter /FlateDecode +>> +stream +xÚ¬¸eTœm³% ÁÝ-XãîîîNàÚ@ãîîwwwwww nÁÝùò¼ïœ9³Î7ógæüèµî«êª]»j×]«»)H”¿1ˆ˜Ú%ílX™yŠ c'U;E;yU ¹ ௝ž‚BÌhä ²³7rò4¦q  €•ÀÂÃÃO³³÷p™[8¨ÕU5ièèèÿÓòÏ€±ÇxþF:Ìm”\Övö6@[ç¿ÿׁ߀@€³`²Ĕ”µd¥ÔRŠê) -ÐÑÈ ìbl 2ȃL€¶N@€™#Àú߀‰­)èŸÒœÿb‰8ŒNö@Ðß0 » Ðþ=Àèhrrúû 9̍lÿöÀÙ²5±v1ý‡À_»™Ý¿Ù;Úý½aó×÷LÙÎÉÙÉÄdï ø›UY\òß<-ŒœÿÉíúëؙý½ijgâòOIÿòý…ùëu6Ù:œîÎÿä2LANöÖFsÿ³wý‹†‹ÈÖü?ЁæFŽ¦Ö@'§¿0±ÿéÎÖ ø_ª7²··öøW´Ý¿nýO g' µ#< ëߜ&Îs›ƒlá™þ™[3; ó¿í¦.öÿás:þ«AÔÿÌ Í_F¦v¶ÖS <“¢óߔêÿ;•ÿûDþoø¿EàÿyÿßÄý¯ý//ñÿëûü_¡%]¬­lþÀ¿w àï’1²üÝ3yÀ?‹ÆÚÈñÿcd²öø?Eý×ۚÀÓý?€É8ým‹ˆ­ù_i˜™ÿm9I‚܁¦Ê g €™‘õߞýË®nk +t´Ùÿjû¯¶X˜™ÿ‹OÍdbeûÿvmMÿkåú& M- iºÿ͂ý×E心à¬æaÿ—Ûÿ¨FÁÎôþµsx1°prX¹Yþ¾ ñ°²ûüoRþ ˆå?Ï +FΎ w€Îߺ™YþUýÿøüçIï¿ÀHؙؚþ3:ߜlMÿNÛÿ4üã6qqtü+ò¿Àߪÿãü¯¹݁&ðk+v&|Á–i™éÎu8¹#Sâ:},#!ö¥jEþ5v½~iáÛ<•†oµ!ŒM3¼í˧öïû²´c}ØÖT½)À‹|2šþ´MÊN.ºƒ@&ýR¤ô?šQ^—Kò¿!µ9™5v¦TTõKÞ  g:Ùa/iüÉ\ ü1Éì‘}MRb±ºP›ÀÐë +OÿP&?>P Ž ÷^CõïãÓåÄÂQð¹B"QFú;äà i«WzÅ`Ñ +ĉ$ÈÜìi=È}#·Ø C%Ý¿Öµ>«¼£Neüî?dZ83Rþe‹§Ê¬ü€$]lTÍHErùTl?É& ﬓ`žٗúmàglÝDò/›ƒ¶arú C"ß\§ßfÐÎWÚ«¼Ø6å=7L§Ýr”À»æ.քtæôƒ•¬ 6´|§hΞ»&¨ ìÕŠ¹‘Ú:>Êv½u•H‘¢¤ïh„´˜l}bƾϒH¬J¤‰J6e‘‘ñ5ɍŠ°Â?ØÏbª„€-5‚‚䡾' qODbŽwRM+= +Ï=Sˆ­~Áqh^¤ ¯.ãÜçðú€èð.î†ÊȬ×ëeæà–;[Ni¢ ø‚e¯1¡¾¥ ð¹V{ßKߤÒçT†sªÕã:¸ÇK›vüø£È—£n‹ÔÆ_£Þ[ÇR +cgîäDZ”gž† #•‚šo?9OrÀ»'·@š¹ g¤ræš¿LKÕÔ;Íôîh‘åÚ3oVìbߢ0žæzfšbò(ñX†ÞÉpDïA¤ÿì#6»*pALýÐûM\§/ÆSz%¨j#~Û@2 1ï'¯LþT½Ó²«ü$ܗ"xA´x£´nÐum8Š2ˆI ç$Ǽ‘JD¼â$¦(xÿ{êa(µå¸ó ú{2I·z\õf;Ë@P ²ò¶nî™t`V/v RlÄ£ËÃϒž|á½’BÚcI'ŠsY m¾@ÎdS>Â1- œS—Ù`¼w¼N¬ï§“ähüîl/¹õ]?qú<Žè¸ÙìÔ7wæ?PxöB@;gçß8J`_-emk;2/e]ž½Õ ›ÚîCR]3\E\($ÂÿlEv¹ ¹û-aÚNlyLôÉË&VL(éK}ÏÖ±î!jöp]1úœîóÏes Á—‘&Ægv³§á¹:YŸ< ¨šæÓþúÃ*¤ß§Í7·I< ÎÑ~¨½]v£g› ¦ë|ÿm“Ï<北ôMQ8”ÏÉ ŒÖºü{ۏgJS‚,¢çÓuþï_5Çõ­Út½\wd]á‡Ýsv´àï†ñï7#ÆF,œf¦Â4ÉqÝ[P¤1ýµÍ?wép_´½*ÚXSÇg~ž Ê?*V=VÖSp‚nT÷³ÔÝí$¶Â_oVڕÐ÷Oy37¨u΃è¬g|J(®²”%-\xó=Íiö’¢æÑPü¤ý¢–yÁé¸5œMã= Ð–3 +bžs(ñ8Ÿñd~OcÀe mœ4·ƒMvÆO›bQæď?²òßk˟­ƒøéÈVSÓÐį*iZߖ}ªYÀ%7> çSV~:La§ö8ëÅ3é{ óOBV¶¼Py»À3 +B-}œçÊòP€•Ëá§MÙàdTÃÔܼª.ËÌÂw®2d¨þqÌÒVš!MQ_W¹fü"+Kb+’$#êp€Dñ0ÇϾ™‚ˆóÐùlGþ0Âö§qììÈ +j,¸–²>¸,Çñ¤š{þÌ>#¦$ø¾/¿ø%]–þ 'í\üÃgE}Èæ£Ö/JêT·tM°>tIÑçÖⁱ½½iÁB+_«ÄU/ˆÒ³ã¾úµ[»¸F'ê\”#N¢#’¿dÃF¦!â¸?Ïy{°ëV€î6X.ª‚Ùv1Úö÷»üïÏ¥Ž²GÄ Þ–ñÐsûŒ¸b8¿Å©‹ö– +rs*ýÂÇíâdú¥z~¸ÍŽpïC”œ|†™“1ãÄc…1N“0'je ëN»sei#¾Û¬²ÉxŒµ·¹iþåÀ¼ßþ¼:+pà«Ï‹hï¾`‚RZôçó܀sÅȲLÁjqÂWB„"cÿ"™¹oB͙_X»3©oØ~æ•qžk4Á²ªÐIlß­föy<Å^™–‹÷ŒWçqÈ«ôPþcmx.f„wöùè‹e†D(ؚŒÓñÉÀyzæÓz›jp°±×ˆô¬‹ñòJV'9¾ÁhÍOçp·DãùÐ+ÐpÇÃõRxE®å{‡S&¢Ç¾Éúø7"lÙSžÅ¬È#NE}O"yµ1OñÊñ›’×¹½ yš•¯¯WµÀGJ¤ Ÿ¸æ«?P+Žñ­Üa52­Ž ¸Gœ·çÞ»x±E¹—®¤hÆ؂Ȇ̓•Lzg!Jo'÷!î¹Â„iM$2_Á¬T«-9¨!͂ƻ°¿ÿÚÝûzŒgkÆÙFÈüA»µ:v9~¶ÃãÒ*$âSÝLŠIH‐MÜÂ!:V%¢iŠ¤z\Dû6ºƒÈqk‰ÑžQ’>'x҂.#k+ÐͤO.É%ZNî™ÇRo§¼žº‰—`ôã&?ã$lnçgÂj±Z×5Ä£aã¯zôËbϑ£ù•Æ0Ñ[Š:ÿê«ñ3.«Hëßm–f‰Sô-Hë/u51Ȑ»åðÌûᏽãÌQ‰­Ò…Ê삫Sg²Ê€¸”;›¬¥ ¯Wdb†®ÊÛ÷½¼Ç°Q1¥nxØp©/x¬9kBàuŒU~Agñ@uj_²({øìj0µ°Uâißs›¼Ú +¦?›iÜ[¿T;öÁ +Ž3&«EHKT¢Í‚†~Þý€OZháN"‡·B‰Êó þ³ÐÔò¡˜Øv7ÓÁh†A_ ·˜pƒ‹yêó9Šb˜É}hYgÅÕYçëþª Ý;fž jt¡->KVhQ!èBÎzÓô¨”7¡UÊ5Ì ®W˜G’•þ™xöO ÅAýÉÖ¬÷ýó#۔ÜôŽeZ^»È¤ÃaUNõ»óób³rBøن› øwI2$ëîiBŸ2®"ļ¢„ÔÀ+ƒÇåcGEÕìɼÁü__ØyØv;2f>uíº»£ +ÌðoXÁò6 ™[Be·¹Þ\ód§:Æ-U²Æh:'ºF «!9LAÊ2=ùüý§ 홺Æû­“8÷ÙKÞ[J€È²¡ñ¶.ÀgÝ*ø6*1õgèã+-BÙC„–&·kè‹¢dvtê@fnÇ|1…ôn¶Âunû/„YÓ„)G¿8¬<þä/;§uGss_»ˆXP|h-n¯¿ûIY®… !Ofv¾gè㧼L%ÉýŽ +«ƒ ÀTĤ>Pf¾ß ˆÍᏎÔw4vJ¿gv–ÑS¹\JµœÚe™üa.^ VGÝþq•exæ[B¡rdc×0Oky`GéjÙþCœ_o¶,29ýø³þ“ÿÄ% +Q`˜NÀ/MT4x:ƒyˆIu•Ç¬åؗJÉÉSvÞ£fž_ý¾G/ ˜(ÂßxÅDÈ5;Œ.<ÿZc>tCvf(ƒir7”#¬¶åÎHô³ÄºÌ;|F¯Ä_`5„{u“{—2b1­»ZS‡àåúðñÏ#<’e-|fšó5«'Ûܙv†*×°ßóïXÂË;ÖÊ[ùŠK¹êgÒÍy¯/PŽeèŜ§Uœ5ïmQoê2ÆËßz´_ ­ViïTúN ã&1u’$ð·[b'ĂÐ9Ç/KqÄäi“— è›$fmr¯XHRL«O™ ^Hq(Ãõ*`œâŅ×ùaÂ^uƒÄÌ7­Y4šš‰”tŒ†ò,nur|ë}#´ÓŒ'°s,&œ÷;É'LƵ'&;RçÁX µ Žïá¾ëÂO¬8¥>·öÀfXg_,«ªyÄ~öîŽ}û4Ôgy0ћóJ+µûsª²YŽ€«1aƒž2ñÕëXi¯³³E¿ägh +ÛýIkKm‘º^3¢‹E<±Uåí~Ú]º1-îO“ucÎ͟¢zÞ½!èZuOŽË<äöùŽ#M‘±SâçØN«õ¦{Ü¥ý냓ú†|x`ϯ¡?ÀŠ¹u‡9Ìj=…È\š±$‡¨WLŸÒëîDƒd3¹%I(™üè»­ ˘õ|·{üEja9Шú>>,‚­P%úí²WZýBýý~°zÙg쒭‹1Îv9̟,½ã“Ž}"¬dÙ"š"Êýø)'©†Ñ°Í—”ý£,>–ÑrÔaKþd:¯Å¤Ä/Çõx˜„^"³ó9á}*A%Ü›Ü•á‹¹ú¶„ñËBɆc¼l©|ö;EÓxáÜ/ƒ‘N:lƾ«w¼²ž-Û´¯‘ŸÆYsi½PÒ ÖŸw}ˆDx>K6/Öuñâkª¸ ã¡$åx3w@k£ç—e +ž¢ Tœ<<¸+ôʈú2¢%äj ûn¯è<¿[KivڕGþ¥†ÁÄÖJÐá[Ï8Öu,¸ýðæª ô*Þ²ßpG +O98´aYïI†¹]{¥tÎp‹6ò2&yû´_LyŽZ +Îz1ª¤"Õù¾FXül)Ùº"úÃOy:PÎT J6ŸdîA–îazK„¹½ Hƒ 5 + )“7;°Ç½#ŽÿC$¹ã\è'—êHb'h“9ME ܣهvìds„9óÂsySØ7‹¼yÚqو/ˆ(·Ô6;%ļk U•$çåÀg²•\ö¤I˜‹`ïæágéF½úþ€š]d ® +Ù'k§NN8).c=…á@4B]Tâ¶11ÜÎ=zä‘ ÝXF–뺳Ø(¿‹iŸûûñjí½î^•FB—|V­eò}jõ›· +ÂEK¶°¥öfO}Q$Vê¥ ;„åü.Òt£ y ýõØñPƒkLA0/…Õ‘ÞDbÂÚá’ÔXÄh/žxš¿‡I÷—‘ƒÐÏ çó¤lÎØ ë9ôTÑòGàŽ`ú‡6L…U™ý'JoÿM“·rá +Æ0§‘Õ׏©ÄàpÃ%Ï¶½”¢QŸÀ>šNäyJmGâÄ¡ +£ô¨Yø'@¿bm |˯‡Ûi¦ÃcÚÏR¥{Öt5 +Wƒo•Hiç̝I–NeEKjaâW„›ûé9Ì„¾ +‘;¼æ¯J:ƒ ¦BÀtî.ä,Szݎ? ìš Ö¤õ5ú@Y6ƒx€mœ3† mÉέ8ï°Míö¦lû6=‰»ƒn°5ñ½{\‚6-ý:þû*±'ÓÐ6vR~îtŒ:4+OÙ:ü¯øŎðÄÀ'ýb¬àCÏ»”ßàœŒgì5`×}vZ>_Ó­·'@K½¦}Ð:ÉuÜNõºC«‹÷²´"¯yƒ+ àÿóìu†´rßâBüᕗQ-R ¾ùO@wCÖÕ¼e̱•©F’h>ß³¨GÑq„KÛÊÙ$TƒÌ¸Þ¡æì1»÷Th¼A.ÃÞ±¾öÞTX~µŠƒý8Ô;3ÎwN8ÃÛOLFԊíH†’ûç|>:bŽçÄ-Ìàî>MúS9w}Èd‡‰—rùÄÆ7N>OùŽWîí=•—QÈŠ~K¼Ã0øû‹Ó8ü0 +Sê/s`ÞÎøË# ¹.Tt'õ¯›…716mfÊsûMãÌöR®Ýc÷a_QX¥ 0†ã³»Ï!O¬ï¥îÅYpÃvDB¸+ޛÉø<ËT=3Óí/E¯pƒ„ pK¾BßX§Ÿß,vES «ÒÙ;?Ø`‚MF:Ìژ;9ÓI8Eô¢9FæòY•™¤7˜4Rvå8d×>pòÜÏ +VYáT¸®;æ6ü w†àë´à„^I¾&ïßÅ}²QL˜Š£ Ú"ûsÇúé^> ¦¥ Ê¥¸?Ӳ͂T¨áC=Ýљì÷¥¨R„¥¿˜´ #$ ø ázÃ!MÛËÍÖ ŠJÁ §¡Ç¯g=+¦R@<‹õ庿?ƒš_x4¡`ˆØŒêgô8›h¶A¤ %î(*f•óèIÿ3…ö§´8Ë]ó`»èU;¶ÝmL⬴éõ}Sì§gjY/%48J’l‡W“ÝeÓP¼¬éè7øÄ~ö‰ø€Á‰$+ïùÁåK¥9Iˆ ¼Îüßo‹&{ÀTCÿñq¾)tdÆ@§ öÁ¢KØÈ}˵$Aò›÷YM<þ‰ +΢VgŠ„l4<_&Ñ{NA›º‚œP?6mQb<ïuØ(ZæÁuCª›C¶ ‚®6à·'3²O‡‰}S€h«T—Ùyß]òï€Üb\7ßÒøbˆé]³îôBWHˆ¸‘<î Ù¶'3x¬ú|°í$üÐrÔ³¬T™KjÓõځ¦pkۜlÅGÀ’G$ÞZǃ¿W[çÞ-µ³ +ÁZÁtcRr>»Ks’0qäiÆý͇vÕÀÐ3·ì•}HށÿDkûý(t»\×ýó ˜H`å[˜J^uˆƒ½÷CP›ˆpכö$Š£>¥ßy=VuÜÇ£\¬"œ-€fï’‚¡ô‘+WÓ]ªŠ³ÝÕrž2`è‰ò5@!ž…¢I+“ÂdynÏbed +÷MÑ椂X! 8X\·FC& ¬_¨ŽV1=yÐXlÀÜy¼Â7ë܀¯†âñðIØAm‹·>·Â¹#ý¾b@\™Û¹«|_2¸–ôgôÊã®#¦ ”p Ôg=CáËʉéË'à„ûIj§YVxè«$féónÒ*DÎ͌ËáTÁŸ¦ð +RòÒ*—+oø֞_[ÖF²¹{5l]è»5¼Nl]§Ã„qÏävAy{’!(ÊЋºÚ½$Ë 7|5)‘?jÁ}ÏùžX!``¸%õIZ"éOô$Íã×ì=øm{{ Ki¡3U”¬',ØE‡¡Cî'ð±èÙ¬{£OÙ§´Núá*/0Ñå{Ìo¹KÆ*®“['÷8"4T?ìjûz¯ŒÆPC4˜bp¡g¡÷²²ÁAIf:“½äû‰¶&6¿bÃ9Úu‘tBä.¤9çèú™“¿Üì’Fýw¯OFRxédÒÈu&yâÁ tÜJé=?t8¼C*U-vtb»ÌKéaGÁ‡ã\xm¼ÇK2¹Ð¤¦{"#½ÜìÔÕJ©1­ÐAUñ–ëp…Fâï€uØܓ!½·¾œuÏ“ùÅø(N¹äV ;ž„l_Í6øµ+¸þæA™ÙêØpmùBDg#Á/Pµd¤è?ëGõÔ ¸ƒ/ÿ[OB}GæÂ|;xñÂ'£¼%¨Åx +òºï¶ÆòË£GMXñP­û¡½9>Ò&$´‚Z­àI04ßFºßÁ §ÈÛCÉùîjÀH2Y%¼þ¦Ö 3JÜkš«h•½6Ø9ôQ60p²x°o*Ĺ©gFä÷E_Âà&¾¼ “œ)"ÞèÝ,düEM^‡¼n*ÎPhl,¥_¶2™„îæ‚Íɍ`iª¼µÑQ}Nßãª,$´§ð<[PÀâ#KH×h«i|KÈÎݳ=u ªwöµx‚Ž—”öP^Õ7¶ÍãÛÜ)-e£øVÜ¢'Gƒ­®¯Ê+@ÖÍÔÝ"·Çj49]pDX3o¿ý¹+êl¤YGG`›;í†qÙñ~€'=³òØüÄL~R8d‰>=ÎdÎí°$~ȍõJ>k~qϔa3΀w„D_UæÝa´ÁTkñÝ5½¤3"â9¿¼ ôÈOö#ôôÏ…Ø­Îܛ&%:·P6½Æ}1Ǧ™·}éo¹ßFMµú½v°Ë~/{rï¨bkòc…Š×cŠÒV*³ÁW¦ÅéÂ#^ëFØÞ>€&6„yìí6\(±¾"Ó\@À Ï;mFBšÐ ;;¿º«Cÿ˜-gf¶bh[õ®Û%FºÁ:£Dæwvòò‚¼œUòšÜVÖ(Ëùóe¼uBüè|±Å£…¬×Ô g§èY&Üþo®Ç¶÷H÷ŒËCñgšm(0_Î$µó½òÞï9ä4¹‹róœPç؎ãÅ'{ò#-¾‘² ï¿y#L£âLyª5隆Õ2To­6_b¯ÌÕrù­Ë÷ìð‚C1‡ëƒ›‹1Uï…'\v"Ùq[…ò)¡{Ývlð!‚g3}”ØÂ#7ð¤*å¾H5͉Ä1]æä€[D>–äÃÈlÒ ÏÚÕk|¥Ø]óþ\ òŽï΅Iîü°Ç`%5è“äx7ZѦTõéSïýjMƎdÑÀµ8hKÏúqV£Ó¤§ 4w­å:{[ϋ×/û ÎhfmÕ¯›ZËÄðݘŽ$»Œhô’`bl¬^'oówCæafJŽ†Tµ°‘’»NùÖô³êqŒ|š_.ç®òL==ä~ŠlÂTÛð˜,˜‹STìK:b§Ÿ¿¬M3º(ª“]K 9´HšÈÊëÜ5 s|hÓ¤ +J„ÙPh×þÑà Š¥ÎêÅÖóÔ(…\¯Í’‘Ë”ÚYÕN›Žvèçm#˜jÄÝ?1«eXœëŒµøÅõ{·u,z,öº̄M¿Ç{Ô4E±`'Å\=lcèL·C:å£kl`ŽÇ(á¤q ;/ôñ­O¼ !MtxÍuÐj!~`Eòu&šŠƒkõsñçÝm|Æf+,¾5Ž«ÄiÞÂmÙT™ë’óïS,ŸYžîµßí®Ò7£µ¦Eõ(Âî8.Häbئô:®f˜n‡‰‘á™8˜§¿h¶c—#Íó~ïd2¹è£Üºÿњv:«FRóZ&Ÿ9'o¿8cñÌ÷£‚bÝ삢9îñ’ïþ>îöÒw¾€f!2Y¢q;4ÿK›“_û{˜KÿëTwUb¥)ŒmûÉ:«”×£Ó™˜A l2?oýUãlrÁ€¿\ó…×Õƌ= Y“ZÙZÊ× +ÐAnã‹ûH’û>p’ÈÚsB?Ä«£1B¤l+'A"‰—ì8€ˆ¬’š—£Q/lGÇQθ÷ÚÎÀÒ¶EÂ|,r—|A¹ú}¦ä<¯ï0·ÊÕn³moa<Éæ þøPý¥F}/4Ïò´òÀ…ÙûJ’WЅJ—"Nw¿ï^>øô:ŠŒþK¨Dqõð~ˈåfméüAhJ)8ÇTÁ“t¯ü÷w-d8目ÙMê7eá±£t@o}xÉ8 Ÿ+eö+²ýàŸ8mRI”.'†~m7û&²‹g¢¨nDÆ1¥–?‘H'0 +bt¡ïû%°ËuÁmÃKB_6Ñ LV`ÜÍ:‹]9Ð$Xlä½5Ÿqm}]&ðëg´¹­CËðWÓ2¿UÚÑwwº*U£w¡²¼E½J«Í¼{0HU¯ô-\e-È܁• í¸%“˜˜zLh”j=ZiÁ÷G&Þ'^R6ŽÄ"™MðQ÷á9Hg%H¡J’9Îp/à y[Þ©±Dç»FįnàÉÒúV„‚Ò̕“þ«/ÖCU!— Q¯Ôù|ääâ_Þ1z¡…ŽßËít3‹ë÷C‘³·ÖU© ‡Ë©Þ”àðµÀÚ»`ëhW„õÜ¢pdq4z3¯t=q÷ ©%¡ºçîçö¾( KXז¥‹*¿\-Ê#ЍT%´‚Hxg·ìO)w*a§ÕšI¨Z±à‚ù"D·Ž&pói­sšbónhm;Üûô9™ ì6e‡§÷›œý ñfÓÃ%ß/6C™ÔwPa£+Ùðöw·Ååm*x×ë Áç ¶G³¶Bç»U± +ÉØå = ɓö(WˆN·ö>lUr‹&ÂÊÁ–×?÷¾%ä챋0‡åXe\B6ÁK*‘L j/éèR‘ ƒ'm ô w=WáàÀraH¾ÿ®ðvŸ§®å®æŒYzä´ô?ê‚È{y1-þXÅë©/Ç› È¢_½biï¨îoJ×sEt«7Ç$9Ü¥h¦@ˆq©±!k£Õ#Øþukù ås¿0‘jýµûû€ã + 8á¨Hº½ŠªÐ+ ´¯Ô(ˆjB6+¥™Þt¾ƒO%÷Áç±¼ ð€b_i¦•·=D*(Ÿ±wÚ&+ò¿ 7ù,KŠ}ñÅÖòRÿ RÒMݎ NI††g‰°‡ŸÇ‡.obcë]ˆ‡ƒÅ„X³^ÀõÇ%ögçÑÆ/ÎdÕWÆHH s$yú‘<بR«äg‰4Cã|†îèÏ®1|;cuÃß­ìJµnjš™ÜíûpX/Ô'‚(\‹5>ÝäJ£ù\ÑhP<*[ÃË+â€7›lî—oX×,ÇÏF0ö[Ò/ +²·‡´µ¯Á9mÁô ?ýŒqš¦Ï†ÀZ:â èpº`È˹0Ó¨øÏÜ2^u±?DºzØ]:\ OÖס¹Äš”[,ÍRD Q*«›ìÑñMjø#F6:E›ÂB]WQWÒ`p¨†Œæf"hËø¶Ÿì>eGŴЙH6œªÐKü¡w/2Žl- (Ӕ”n{¬þ8¨ÞyH0ªý'ùY2qÂWÇÏ?שâRã3HÕX”fIVpó b–7¹°[1ÇP]Ýϝã.)Þð9Õ,ix´uÀÏàƒd,¯Â÷ò`ï~OÌ¨Ö +ÆñUr{ ‡Ñ8`ý¹——¤ÓqL€Ó؝Мù4©HåræäÑæïS·;F@÷Œï­ag±ïdô.;Ó¦8bÍ¢=¸¥D7Kb°kAHp?ytËØé¸m«+°É¥%—üH Ag­œB"Ÿòžõ?ð +Ãð7cÜÛä@%$œÃ ÜQªpqHy–ÔC!8ûæ¾Á?5 ®ŽÌ;é«ÄòôCN~#t¨Îz¯~ÄY û·3vœ[$×õléW6aŒõ.¸æÅó5aÆ3ì·y$–À{G#Mt¡?‡? ’EÏ +BV=\Ír”d3òA£ ¢eûÄú¸¨ VX¿;.$ +L÷wÙ±m¾ý‚ÀlF¶gë%²Ðörq¯Àn•L“ì°¢¶9e«äœú¹%¼Ø<("Nˆd"øÞ×Ŗ‘œÑ ñ»Ú7¹ÑRõ–ÑQ¶Ë¶°¨5ZIí5^vȸ›÷ÁU†ä´²Š#Éj0éüdn \Ëî¨nèdl°¾ie#ÂA#ÄÈ÷°4îN]o¾ùäÎԁO* +(—×÷œöß´}.õÀx¤~9ëw'wçû_ש-»’=±•>Àù+'B´·Q#9$ xÀ%½nu0ƒQqJ$²SôÝçHfϩ׹DalŸ÷¨ƒëJux2sˆl•¶%Ï*ˆ0Ü𶔋 Á9FÆG'ÙR hX˜8¢sÑ¡˜?;Mc,`Õ5ó]eÖ§7çûÕOÂÑ FBÝ9óå‚çKAèÑ9Ÿ:§Â1G’µ-óS»ip§UíÕª]ssx‹‰!Å~‰Adš8µÁµ½zþѬÑææ?t¬$ÍÇáoÎfkœÁ'U››z®ÜÍ!!DÜ~w•Ý% “tp.ք5ÿ©j»†§ÚmwÂ,ï=D“èÅh8MÔ'±NÌJl$cWøš…#¤Œ+ýKgY|æ›ÁŽëWP&>Մ)ë®u.˜t=*üOšG¨`$ð|f­"Ÿçõ"jCÍó-‘×'öŒòÅæ×g¯bÕÞ*ˆ~HéNJŒp´øŸºhh bK°äí  •å`oéÄ,=üà +Ìþýé?™]1'5G̐­sD¸@ø;ü%•c\¼oÜe¹p—û¹ iè’Ûv{*=ô>znÝÌëáÀnæ V +r—½’”™÷#ÿ:GBõ “ôë ª J°ö4A8‚àýÂñ‡Üï[ôÈ£¦|=ß慒Ë3^(CzJ.'ry.Ûo»ßoð°'[—~C—šñ|Lj€²˜FƒÁÌqPSð)¼Üᬏ³/>±„¡¸û‹û¿ZÜÛñNmWÔ:Wyå<ʽÀÀe£eÖܒU á,ão$ÝV›ª9ØðvbT‰÷bά^äVi´;,ÑÏ^¿f¢ö‰"ÜïÞT¥],Úk±Ä÷8:PÒ|î7~ÇpCì ³c\¢Ý{u¯j¢Fß ra#›ß?ËUY¢ž»8Ö6Ä)«­¡(ˆ¸̓›^Âòý-ž6G·6¸,®Ù×SÑov›8Gf ´ŸT¿úF›yÊ4Ú"EJN‡ˆ¸ø¿áÅ +·ý36D·WÞo ‘xyúÁ=A; öTÏGCŠ¢—áëÄâsa÷dA[óFÑo¾ +».wØ ý¢G2¢"°äe”7:ä–=£;ó£>Ž 1Áü¯>Nó«Í¿;•œûÞ¯´¯°˜~›ô(0JIè9P‰Â1*DõDFÍ¡2ÉNDø¥ÇÊÚX¢²k'$çEÍǓÃqŽ…•¶¼œ +‰¡‰bY· +E“ò=Ó¸’À²6€±Êø7ãP–Ú;R¨óÍ¼­]\s+ƒPÕß\ÑÝ}Ž™Æäèaµ‹ª 6²lÒ KR3p¤s}øPrÚÑ~•;*r~õjìHÍY¶ÛÎÁmîÃõÏ`}Aª¸¦øŠîüiÌ ¾h'TºtÔ¶¿iϐ†ÙV®O>ö³={…Ñqʨœô$P!¾Eí +Æ7§¶”"ãy¾”m*C:©ö}ó+rˆj8Õ|dröç÷esQvDƒSgîéåÏ^F é2Há:cEÕ\¸̇ýì9´šzª—aªÄ/„áS!íéÑN8C–)´xùºCÎü‹ü5®v„\ÌcxŽ‹Ø¶Ø-=¢‘Ò¸7 ‰ŒZ](ÛOüwÜèËf ~4•äÊG2-P~«ˆP!ÒË%ÐoÂa:› #üÓOñ­‰k«5„×(•ßq § M»ttž©žŒÝ@já¢4¿ê?ÉQll?‚Hߧú¿X0m'¹¶)Ò`vQ±-8þ€»»oðÒgB]D8jÊ/;Û;‹‘Ý^®m› NT^ƒ¬U9 ãRÊTTªUF™µ½S¶&Å÷ú0ùNàT}¥qGr}¤ìåc”&ٜïön.ŽÍ¾8`Ði:\.Q%¸ÎaµSOœ%\·Z2@®EÖ©`àÄ®aK*€év³ña@D3îš}…z¦:pé=øQeàQ¸l åîñœtƒº %H©ï£áÛ³Új¯èP <’òSü“u–Ø娺o4o¢ 9Sú±1ÈGc&¸¿jÿŠÄª ÷Ó`/ýVô=~3¡²NºC òÈ_Å +ÒVâv9éäÛ¿Ú.£ü6LLƒMIpkpÆD£ÚjUãú2h6àž¹þòTÆ|O#äA{ÍÛN~öà.⠉%á¾Ð¿“£èóìºgjrLK¾6Pðâü¾*'Ø }ò֓o&AA„ëÌù®ÃÊ44v[.ù[!sí @” «P¤ êòŨM²8¶’ =su0^¿üeU*¡ô×â:4ƒš+:62·ÇUí*:q;ANHùºö,Äe@µ~õ‹ŽÈµâ®xYß<"Bj3„‹çOoý’ƒþÏ^‘ÜŸºŒ/¾†VC5(_^Àí­–éLŽK:hw¼Î/™ç3…ù¡Ð½i»8¸æM7ºG-ЀÙS|¸…,™ý=诟l⚡鲁ƒ/n–Œq2ì)êKÔ(öt=‚*礲¾¿Z B¶Ø(kÌ®oá‘g;{§ÁÉ)OÚîêäºw;-ú;J3ØT”·—æΌ©¸rÔÆçõÿì0£ÈÏ2”ÑôžÎ¡[+Òw†\3µÛ ¹‘\V»:涾 +Ëà(ÿµñ(MØ3wɽ¢MòÑ@«Rÿ˜%NƒLS·D<ëïEß©/ßò±"֚ü`æÛ 3JT–>ÇB— .ߌU”w&” ïƕƒTµ1MŒú̪ñQÿcÆ34ÂQ=Å!Â?¯Úý•â:5“ý,˜š†àÊߜIyÈÖK^![ä |+1?fÌÒùêëo…?ZÛ.«np_2ÝysDWjºaou»@Df•ü‚a˜üÃ+0;ûÌT‰DüÙâêu–U܋dß%૧¼™ÎWö7ŒM.® (ùšd€ñ\¾[$•†HÉ3£`è{³©€8¥óÖA¼™f YˆãâuåŒ[í䇸?…äwY£·S™IŸ_~´ö¾BÝ3Hfi⠘8–Ò|„ˆ$49efEëÈö½›ƒëd!GÝÝDŠ’ Ð҉H!€Ãϗ2ý«ÈVq£±Hq/Y.É>£íßú%6À.¶ÚáPõ¸¶vùGýÐݼĄ8 Uhmn>€œlF¦ãR×ÿðTEv¨n‰ä @pö'æaÑËÖ ðfçµ)žÁ:d7Üɵ#|7Ûq;”«­ˆü€Cè`Œšª·4¼˜öš;ý'¸¬½Ì²å=d" +ËçW÷‹ì„;ÖKD"±Ôù0‚âw]ŏ°ï`úæÏââхy5uft¡Lrc8x +Å á±p~éþn=d4«ó©õlÁ_`¶ûoWµ#bÄwc=@KٕŸŒ05Ç&Ö§^ÕÛ5¯Í:>=K—3 ô­·½ˆä{Qâ6A×j ÊyƒÏŸê‡%; +xO“aÌ»cdÁ!>Z,‘èJûñ#z»‹@Î+ñjIô­¤“„§ÝqÂÛö%OmÆñ¢„©÷e¤ü î§]í€ÿ=x_%udõŋµ »Éü|¼TÑ(PàšÆ.¬*i„\q[áY¤¨µ†g^§©"? †»éÍ5)ö7$­­@Ú¡5š®ÃÏ;0äìTΌ;&†)³OàÕ­^ƒ“3mŒG‚cï뚀|–/^±W êVÙ rõ)2±e„õTÆÛ^÷W’x|¡¸uMãO1̀w¹×‘k+=YÁ (ÉnкÅ4â•LâÚ¹upèíY9×ø¨U¯3$Hœ:ì:¨`£f-cÙXWÿXæ¾JáÍõ":duõá4J5c%liTõÓ™ëj½nkÔg¦ç='p󕟸°¹Ï¸ê4‡ET 9_nœØŠ8Wuœ~i{Ž5ã㱍ïŽDœéŒÆ{úpX’ëì²} Ìë5ƒ‡@ dGÊKKÚ¥jº¡|Úcöívú”ÈOíd«Ñä*+ÍßWO9§2Zr¢Fé4àC&² ÜÒ°ãǽ¿žK‰-aÂ4[Ýÿþ6³‰)ÀØ`{|­ÐÆ:ͦDogö[gÖ?k—h÷ZA{k*Š£»'Ñ2ÜW0Û",¿%¿Šnÿ»ow¶÷øÒŽd÷Dĺ¡³}÷¸Qú݃ñgäOš*s#4‹ïøÕ×t••~¸ƒ§ +iöîOQåú?Û<^¿qÌW+SvlPOy¹4/Ý·Þíàñ¨}‡Þ¼­yÁßMrM:Jd\ë#Ý4ôjÚÎ/-§ý“øâ`L‘ü~ÆöÔ=üe„ˆ œ–¥+ÛzÖs mŠà8´ØLˆkJ_G™¢å©k}¯]–—Ê $5X\üQ,P¢ÛgVÄr%§(V&þí­XbššD!¸@t0÷ŽJK¼^žˆ~Gmۀ¦;{¤·°à/aX’RɈpmÜ{‚wO]RÜÁV«Þø–tƒÌ1b„“؇×üœ՟Z€“TKÊ-aöÉõN“ÇgˆO²»òõ˝ +þò= /”õpk³4™Y\€:`ƒƒb²D^ e)ÒçºÐáð[ë;á|Õ¸½eúçíÞÁ«–«Í^h&Å;iPðæ®ÕÙC[lèåèXD +‰†‹ßC‹ºQ~]À¤¯“ɾêqéXh¦t¨-þßjú5~7\““1 <)Ò총a0õG*ÈÒîڅ>OªüØê'¦ß|ŒF¾xP2\'Ê­A’zÒÂÀµf‡®òïsG`îÛ:-h]Õc¯`QÌRvX…¬íß~¨"Õ~<6֎úH_dþE–²ÍÊe½e*¨—ãéK®Ð_¯¹}8w•y›†WU'×á ƒmNGÌn×­Õ+StÅ<õäg]ŠM¢Çp'Q\m#ªæ±9.ìÍÇçu䃈aJ(I*ÝAXˆŽimAÌ´B«]Çy ¨ºhoEcw¯W`>ˆË9EUÿº!8n€ÚêÂß«—{HÛD¾5Àî‹1þô±¸j¢ŸŠònÙØhï·^ßrì‹}Q ÂçîBÏïìÑX͔ÐÅ£7Pž¯¹@ømïòå{+u-[FríŨýˆ´‹Pð]q× o“8Ñå¦FlSQº†ø¯HD†µï7ã'ùšjRS·–ý¤ó&ü{ÂÚúsµ½ÖLÎ÷ºóåùóÉÃÁZùëxZ”1JB öv%ã7©0ü‡\7o®ï(´b‹Ø0½B¸˜¢ºÙ\ H­+•œ¨µcõü2ԍ{d·a7땱`êç9íJ§ ënþEür™òRP×ø¶xIš®Ò%èÑ*M`EÓù2LàGcþz™Ìï|ÌÍ2ðÔ»=µÒ d‰“ë½®AW`‡áËÂI#йh¹¼v t†Ä@Œ¨aVi…hSïÕb£È ‹ëqwˆ²<› Y¿Ñ§’&ó"ðkéo´Êä]¾8ô¢Koµ?}1µ Ôã vÔùñ$̽ïÏ܎,"—`í¹–³TÕ8åÙÉ·ýëž]Ø}‘ÂDÎ5‚`Ô__“¡¬é&Dž WŠÕ-Æ3™.yT¬˜w»=hðGм§%Ü3Íåç5˜ŠKnnM`¦¼Ë”ÃpkÜ êLnî܃|ħµ,º¬Ÿ…W§ÀBÆ]H¾!>¾O4à„jøŠ/í Š§'^ÉMÜÿ8me‚,ãªõe R‡28}te¯ ¬™÷'.Ú/™IÚ¨nTÏè³N$#ëL„IfroEH[˜Äç¡Óæaënãɞ"&¼)^U‚ÂG/ݙŸ Œ‹:˜• šû:¬îz„Ûã¦kJLô’A1¬¼=¢° +`£1WS¢hVÁó—ÿçHš¯•À 9ÝZþHW®%h´|õ4 C—³š‚sÂø©ª½›Ò µ +»àVŒ`x^°†À³ÆÖR]µq·qۄs´mY£ÇPæž5¿.ü%¬wØQ{aֆlÔË<Ý]K°ˆ7“Qh¯$ÀYlÈ&<£iؐ uå˜n |¤# :íî*9oºˆ_‹ÖKÐ+ª¿X^Æ©¢ |–)±«¥Foìþ|Êܨ·tìqW‘¦NÂm'9?éàSÙQRªÐî‡ȔcЩG;ÆrLrûí·^Ì֌¹b1ٞŒsŠ“SÿPÊT…£i>(%¥ùQüC°¿Ÿ¦[ ï¹×fxŒS{2jϪ›Ó/VœË®q5™7” [ÞøÌ +’ûÆ¥d“h_똬fÿÛhAX ^ÛÝńrWw©ª˜»ÍõïLΏDíQ ÔZBŽ¤’ßÑýovDnM?ý_z€‹½H¿„à¬7“/ªbØØ)»áYÁ u ¤ˆüo|í&ï“; ¾öy?Äٝü`¶°…/=§ÓR]Σ¤GÞfŒ"Ã"ÀËJs’'Þþ¿væüŸ xE–ÙX&3Ç SŽ+&ç\cŽÌCbdŽ"¹r”•!=WJ‹}‚…T:ÁHñOOÃìÒ进+ó]bbkÃcˆúk¢Ùk9cj¼ôØLxœñOý0xË7Y/öã+1ã2/-R–»àIŠâSœž&dþC,f‹ì••„8BP,+¹—Uàžµ¿ýGÉFŸŒH\Ũ²ˆ›—cÿ¢çYtuοbOß»’È?.B:XÓxétÀþ3Oڕ¶P¨]¿¶­¢Saß-F( }ùúaÇÆ°•Ô Ö­³O~ŸT®"Š$íUàDÕ½ràlXŽòF/µ<¹ßø˂Æ%F¼yüÛ_ɸ/Ô5Åê]«`„ƒY ¿Üˆ:?½R½úkâ¬jX>tË짜ycÐܚ1Úr„ô½}ŠS—7š¶ÄõͲlÔý¥RN‚'„UÇJ#½â> XZ¬.¹—²Ñæ ñA*‹#†û qŠ? pŸ†žÖ'JÊA +óZ‹_¸^A¨œpñ®µ4M-ò%"MZ'ªŸNcw‹~Íÿ€æ2ƒfh[QíÄÿÞV-P䵟6ÔlLxP*ÞÒæYJ‘³¿ƒXPÅ„÷èU:!?Máq«Zoü"åÓ»þ%yçj *=÷9]YÿÎ wi¾Ò¸'ÙßÈw­ŽÆ1tÑó0 åYe)55I¸]9=KUö¥aX×ÍÓz}Äíx’ñyOyû`:þ ¦xà“Ö7Ãùƒä°›*©þj¨cÿðÿà?¢Bƒbã¢ÏÅFÿµ +&ôendstream +endobj +532 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 2 +/LastChar 149 +/Widths 8024 0 R +/BaseFont /EAWYEH+NimbusRomNo9L-Regu +/FontDescriptor 530 0 R +>> endobj +530 0 obj << +/Ascent 678 +/CapHeight 651 +/Descent -216 +/FontName /EAWYEH+NimbusRomNo9L-Regu +/ItalicAngle 0 +/StemV 85 +/XHeight 450 +/FontBBox [-168 -281 1000 924] +/Flags 4 +/CharSet (/fi/exclam/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/greater/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/underscore/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/braceleft/braceright/bullet) +/FontFile 531 0 R +>> endobj +8024 0 obj +[556 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 333 0 0 0 0 0 333 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 564 564 0 0 722 667 667 722 611 556 722 722 333 0 722 611 889 722 722 556 0 667 556 611 722 722 944 722 722 0 0 0 0 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 0 480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 ] +endobj +526 0 obj << +/Length1 1626 +/Length2 8267 +/Length3 532 +/Length 9125 +/Filter /FlateDecode +>> +stream +xÚítePœÝ².,¸ îî ¸{ð Ã0ÀÀàƒw‡ààîîî  ¸†Cò½÷©ïžûçœýë֝ª©zWw¯§Ÿî§WÓQ©k±I˜Û›eíí`l\ìœÂUˆ­™‹³¦½­ª½2› +Øx²ó¡ÓÑI90ˆ½4è‚ÍÒ`€›À%$$„N²wðp‚XZÁŒÚšºL,,¬ÿ²ü˜yüÃótÓbi úpCílÁv°'ˆÿñE-0³, P0@JM]_AUÀ(§ª ہ€P€º‹(C@`;g0ÀÂÞ ýëÙۙC~—æÌþ„%á œÀ ÈÓ5°;ìðÛÅ +p;ÙBœŸ¾g€¥ÐöÔ˜=b‚º˜ÿ&ðd·°ÿCÈÁÉþ)ÂöÉ÷¦nï s9A`€§¬êÒ²ñ„Ya¿s;CžÜ{‹§Hs{Ëï’þøž`ž¼0 ÄλÃ~ç2Ì!ÎP ÇSî'0'È.Î;Ë1`8-NæP°³óÌöïîü«NÀ©èàõøsÛþOÔ?9@`Î`¨;:÷SNì)·%ĝã÷¬(ØYظ8ÿ²›»8üÃç +vúÓ Æß3ÃôDhnoõ˜ƒ-Ð9TíaO)Œÿ3•Ùÿ}"ÿ$þ·üo‘÷'îß5ú/øûžÿ-ë…ªmŸà¯xZ2@;ÀӞ(~/Ûÿã +Ðõø¿]ú{´.ø/¶’öPó¿û`À§–HØY>ÉÂÉÎù—â, q›«C` +€úÔ¯?vm;s°b~ÒõOKl\œœ󽱂€lì~ À÷— lgþwúORý!Ï¡« §©eÀòß,×?êOC{ãáðÄí?KQ±7ÿçá7Œ¤¤½;À‹‹_ÀÆÃËõôöž ñszÿ7)ÿqý묄9A܆Ousrý©þ?ÿÿ:ý FÆdoþ{l´`@;ó§Iû§á·äâäô$ðŸÇÿTõ?Îf vƒÐçíA"AÖ©i°Jâ¬þQiÃîN.Äþ`‡Âš7ù¹~Ÿí;|SÃօJMï+‚ÙkDž5yÌí;ÒÏ1“LÜ@»Ô+†8”» ßčšpߧaßUb†a£%¸S¹ëòy ?–¹B1$d@¬DúÛp­¥º(ޞŸWYJµb̃¥éùÅ˼WR­öÑé +ÖñNþâµÀ‡P§Œ%²V±;ö9ZïD¡2ÞásD^ɤø(Õ/ wfè‰i¯•p5;8Ø:\ãঈæŽè•áí¶6hqH.’¤G¿‰â)_ö¥«x{k¼MP°@-_¡qÖ[˜ˆT!7œ"ŒZc3‡,¶ÙÙ¦˜ž©¿b0ÄaaâUdPýÔÒӕÜK }~$úB HŽiy½Ø “B+–Zòâr¯J$¢Ð? r´ØÞ×<¡œ·Þ`²1#«Ø+Åñ¹7ˆ2WïJ}ÂYD)CŠ ˆè4¡òÞ̓º +» +‡ R2©S(KØhG :s†Ñ˜ÁÚ?+SA5®3Rv8«U¥‰ZKKðGÌ/'õK…“ª#¥Ô‘†ŠÚıX>®oqNòS /‚kÅlýrñáƒÇJ;µúèÆÅÕµ}5UÞ g¬>&¥”_Lõrwb<njéâ·2T:ÛÄ1 ¿…„6¸ +І&wŸ :Õt Âãêw³uT(çæGË¥Eþ óAŠóã./TÿéäqŃÞC=b¼Xo§Î$Ó^uhU5ÐÚIC}<éfªŽÚ˜é„3¹±œÌcҊ¸ÅŸ¥WqΔ÷VðÞÿr ò4 +XðŽ§JŸ°°ÓÑ|/(Çø-æ…|ܛ(1ÞZüOê½iT1¾Råörx éx°†‰ñÒ֘¼HöƒÔNN¸CÄɈ}s5óà)?Òãáºà  k>újª\)… ÊÍ ã´Ñò'­Ûo²¼yž…îüo X#ÌQ \ÊðY'†‰”å¨.½@s삑Äx„ßքˆ`£õC?¶P2…à¬R°×K©´ƒ¥w‡õۂÏז^@¦"’ŽíÈ#ì~5ßÌLŽ<Øòù¤ #ýüû™œco|?JGU ² ìÜ]:$¸Ç?Ô¾ù¦bÖ}b2œ½}«1 +š™‹Sm™ ¯ +ˆ^ѤÓ$žÖñÄVšò†mºY;§TI"³ŒY›UÜðW—ÇgêRÝj[rP[j=»ØU€ëaØD¿Z9”z¹vûžýW›Þ%ú7_x…ðý»?”ߎ¡s ˜¶cŠ\Ê`¹F¯)ÎdÄ0 DÓØ홿¤ó –R„Ô<ìì2xhÇ—¾ÓcÞž]WÁª¨Eµp,›ßg–¶ -ë'0Xc rf¶ %½ + ¼Ow|Niö6¯«P)“gC®˜Õ;Y—F„K^ýTá9Ã6G?owò¼æ<ƒˆ°™-üx3_Yá°1/å® ¾–±‘T\1 AݶD( Z¦’0ÿ=@ŒÔç¸6ï5¹z³‚æĎ%Š?áCµGSkgš ãžc„ËÚã€TRwAx`ÃV)wŽ°hïíú–ªü[®;&Í¥éO¸4ƒGÆä« (@#öÌÐØFÞÅÛ®0nêœ!Œü½×ø`À`…w¯Aß6£3]6νôò° ‡®Ÿ­Ã~ €Gî^Ú£÷LF ¥âñ]‹©èŽÓêÌT1^[ŽddsÚ¶ùU)³.§ Eƒú\K¶åÞOáîµãkW}z®“‡GTx×*77ÒDZ`|¢±U+qSO-À;ŽŒ˜Üà™5c?ÝC+]*ü‚·VŽA5†qãÙÇ4·Ú¼‰?Êkx;µÇ%Ý¢mæj‘¹­yñ;²4KKûÝ[󒡠0Ý =$>í:e’¯ØÆByhmڐøÚï ß'¹b&ºBš î­gñ`Lëï)>×2"/¾c¿tFçÄîXêЭװ*F,W¨ª' +³I9ZåÇUòÑb +¶}«MÛÇLþ™Ã ‰ÌŒš#óFïdL.őû¼f^æg\UQÕq*E¾àd#Gj;D0Gß@[‚éxK~THX¹a J7Õkí.ÂÛbBBÁ¯–Oæâ&ã UøÚ¼·Ä áF{Q’ZkiR©k“çeŸDً¬i!Gô¬€·ƒlžä»·Ý«0k{ŽêЬåü~„‘ HXLØõÒޅ÷·;Iô{T¾^$º"ж¤¿[jÊôáý‡TˆÕUù«Ó;ÁBŸ¬wʐçyU«ød?à _‡6Vvˆz Rµž +ƒ|eñ8¨F?Lih¿›Ü$åAPV#ѯ §>A¹£2"‰Ä\£òCP+î§Õ4xf6î[ƒ7†ï„ùŠé7î")BU­/Õ-ÙÁ CA@r°üTŸyT»Mñ«}Ìm´‡Mv€Ù +~—†ä>Só@u¨îËåx¶‡^ó†~a&ø`<é@ºWܼòùVØñ®Ù&Ü5꛲ÍXÑð€&ÐRW¥³4ËNNQŸ¹Ù@™ëÏ3õŽ©ýûüMý`»‡·ME˜äåڋËõªêajfZ~U©Ÿ¸JIªÔ¡l©`•“ +kO¹Y|÷;•q ¤¥Wâ–@Õ¾Ð% Íõ‚L›9ÛU‡4*ޝƒÒ톃®´ÐpÏÝDdÕ5,šù7?݆Êtû»Wò—ù#çæ›Í܇©r½´Ù`$Îa7ƒÆ­·{í×{ôÝ$ûõˆ®5w…Æ4›å%8Vù—;ρ‡ÕKK{ñ™"«e±n=/h9Ó¡Æ=fpÍ¢´­=C÷ø$Âs® U'j‘Þ>™ù}<ìýAü¦” QÿÂ-£2ÊÚF¥¨9À}vÄ:™!™ÒYÁa"_ò!…֍ª­QM }n™£¨íçJH»Øg'òöM ð2‰@Þci ç'GÇ蒙Ô1µª|þ)¤¤Àñ…tU’Z!¿ ‡¯'I‡d`;²œÄ÷³Yœï¸’ôbØtg#={ATñ¶FTG¢jŝä6 ûÆðÌÜE# .§kR<ûظHP¶.ãH×é->GÅgœg}–çÐó‹(Ž0Ìf¨ßT¸óp,¡’Î֕¬•!sŒÕAôHÀ!x'Wר’ïñø¤ ZvY»A%Q3z…Ë´cXvÊ¢+-Ót'D?¦¿#©íí]Ǥ–&ζ­VŽˆ gU¯¢D¬ŽâÕ²¼¡"©cdÃôêþfýÖ4P˜ÓóŠ þܗØ  ++zU߈ŽrHºîºùV.mƒu€§2ôÒêsÛA×fÙPò`x Mِ:Ÿ‰M‚‘B³€–íz\¬Œ‘“à;rI7“KXYLÈ6T,™¨²0çÍ¢®Oý»,BÜïÏïEûA8¬·¼67Ò#-X^¥â–Hþ/Îâ8¿”b™òr¾³TIT¯àwèý^­èŸoœ±@êυÐ¤ÛgäVõåë’M5þM€Ðª¶cØ2#¶^RSöL‚g¸rÆUZ~Æ|¦%N›ƒSq(“¡¸¤T‚Ç©wL¢ë$Qdi²U?€wHÂÖ[ß}M^jZ)5p©º W1#ÝB]AÒ"±X|eâç"¢òñQöôLîŒ½Z›ôÅ1ßyÓ@\ðã¨Ex1qRîR«`ߺÎR +µÿZ…L”˜UuîÊÇ uËËêÙ£ƒãiäR¾Î¶ +ºYOÚÜ\Kmþ¼fƚD]iá°4ÿíûÌ7ì´øÉî,+âi¯Þ$֗¦]ºËÆъˁ;ìšWê§]‰åÕ–NÔŒ.+•Y5ü¶<*}5˜¿Zz¼u••£Ë ù1¦C\Ž’恇2­¶AbÉ@ü¨à5Vé)h(#tküSvÙ;+ûÃk>#OwWtmgo¹àÒTÒ!Üø©üt5¡™Ù}¾$™JM {j^Ãev±(Ûm–œÖ÷½´pÁÄrKo¤èpoÖKŒJÎ4›®Î¾‰£p™ê¦ËýÊÅcãZ9›ÆüTr¿NÉփ%-ξ¡5:ƒä€îZ`<ʯ¦?Ôï¯:>îTOdùpmc>Ã2zëyRB¿›~æ>ÅgüXiv¼÷Í@ôqê"^Ã$!Á¯¶ÒqÖGÿðW…Û爫l8?›ÏM[‰ºiÊ 8ð«7»räÙ[ÓPƒ¥¥ÊåF€w• lE£ÈIò°é+ \âeˆš>Ú#¶\æï¿è/ö°ŽuØJ¢ApO}åGØ®CFÛÑÞ°f +"h¿Rõ¿äZ?R±}Eñ^iB‰ÚÛF*,^éÆ åÊ ïmþsxa”_s]í퓭Ûݑ?s v ™á#™/¯Dµ;|2ky|†ïµï„ˆöO šî»¿S[Mì)£–{Í؀5ÝȾ)¡mÎÀbd.ÿRúYøZ5_[}Ÿ©[+EAžFt óL@,îÒyVÜR>€zߢr--OM¬î(U¿òýÎå$ø›G¾0P˜>*²: ì5o.&¿ ìºY£R7÷Ò3¥àWàà>G®oôöFÎ8ò¯ºÄÊ°ÃÏIQž\§ß¯¹ò qÅׄòÏõù-ü-ž#·?j0¤„u·U~tȤq› â1p³k`A ì‹âX`Ô¬ñ Nb'½Æ¤LJÇõ%†*UfðÏ1êæŠÇ~mê,Ý®—_Ìóø¢8՗Õ{;e7¤øñÓæj9 —Ç‘Í×Ӝü®Žv¾8øó•tyð+®*¸×«f+~”¹ˆÙmæê-°Ù`ÁSo±…§[P:"œ¦eÀpÅ»¼×¯õáK§~¸*!ýˎ‘3F*—|Yïäîã\UüdžìŠ"¢C ¯¯¯·41 +®ö®U„Kpӛäê.š¾}/= {Ϗ²I‹&iŽJ»éPÕKô¸ÚC›Ë†ÓðŠ) { s:z&ގ•txa¼«ùl¥N%$Í­ú™Úºœ“´–^ݚà+m Oƒn°TɺÙÝ·_Óq=–·¾Ûð<“ђ§Ö’j{&©i5 KoËò/(¹s [hQfxkE&-JçRзׯUYb°Ð´ÙœxN.Âèïכùà*vC*\ƒ?²iœq’DŒ}‡;æ›Fß é…÷\é™iõ}àJ<î0 fâG:Ø:͓š=ñƒë?ÁäؘËGj¬5d«A»àɳß)ã6Ù5¨jIpc“õn3ã<4kEócÚHn:»‚òústċ®/³sq^¿Íx»J“?Dý]/Z”£!>Âmç{d(tI¸”’iÆWÝ÷F‚ç½›|OÈùËÜKŠ‰nXÙi,þ¥ mн÷eKWDÞǖÔó|kîʽoÃïYÓµ©c­hæÚ ÐŽãÓÏ`SȸTɀž;e ā¨Ÿ˜`µ.Õ|Ë:2<Žê²e¥IŽi¼^oX¼‡ŸÝê§ØiÚvÂ?(DŠ³¨Ñ#p»{ÊÁÍ· +“«ÒC‰Ü„Q÷fKƒm>´ºG»-?(Ï_x"Úv§uñJ®û³º-Ï>Č^›(jG …”Å­Ñ)½ iÄC9מë•ÀýP’sàǸ‚d}fˆ;´uÐ]9ÿ%‚=bÛ¨]^^ÆS’#c❢±OùMù*ZÑÂAfŒØ8Òíæþv‰ð$ŽFU†ËϤGÑ.N%Öm¯#;wÁÂ!ó[²¡_¯_ŒO\v+`@eùhïï2¥Nï¥q9ŠÕ©c:ªÑ6š~L`ŠÎÑ®ToJdŒÀøhçZÓçê¿àbô³«•’.Ió4f^žþÅB©[­!Æ£‚YA£”{ètÒ͊Àß³<:9—önXm–®ÀG_=ªYéq§ÛŠÔÐÇ,ª[õø ݚÇZ]X¨NӖñ09$E¹½¦~W«vÝítOð³øãWvÊ_ž@åFÅkëݤ žúLXÛۜF ÇMz´Â4߄VÏ©^‰ ˜èdÉòîETò½Ü…PJø·0¸¾2å½~H0õz#óŒ†?“‘žúêz"­±ÁÈL˽{nУ Õ}Íjãö±g·o&q^À4EÜ+R\\,‘eÒ¶È@‚léPà~~ë md[½²*¡Õ_?+²šŽh*ÞA %öថ¹`°ªG…J,×>ŠèX_Sš þŒç¸¼ˆzɋ~Qhrý#’þóFz´¬ÝšD$FcÕCˆÃsëúz]^žºz¤ƒ<'¥¬«+}¿Jf°ï3_r#Gt¹3¼¤qsÁ^à!~JåÒ±¹Ù|,!NS­ë#CÖäÞéÔ4˜ ÏþxûügÕåœa]ƒøÓ´7üBYWÝýÙBlsbŠÒTÁ{¢ô]½™”Ù®ã½ëržâT‘áŠdá-hËwPøÅ!s<ø†Ò¹añ”f½ú<‚Ýà¸Ê«¾Öþº­&U4¤(lë¤ϊ9~í\³7©Lpj…CØËr¯OJ€kãI*¬¬Å’ÆßSÌýÖµùtÉR´î2Ì<δOÑ´æã\zpªÇßYwiHòL{VÊeXïdѦxû?ñ»"Pc1¹ÚâIVrƟŸwâÈA/ñô°|æÂÎP©¬Œ¦N±VW_ý°ÉÄлñ}EÕhæ ‡öVíV9S+¼~®’¹¯ÞBõ¶iMù=_iŠMBôêÃcá6Îå÷B‡q¨bxš…å~ŒÐa~ E¹FG@ʧCVpð.Ûùü-ñ¯zjR³õûí·¿¶cÙ.W’Xxü³Ì¢¦˜d²¥Ûpv8ü‚–#ËÑêŽO»‹Ùºùßý(P~‡èŸÜÉ+ó»}éh+Ƭƒ–NaCï‰ÅûJ¥¯-qo½Š*8§®XS‹>T·<>:)htç›;¤Hd ´v¿åïþäy¯a\âÏöˆ£ykÌ£lÂâ͘Ýå"ËÖQ£È§Q2ïý®ú.þv,Ô:}ԛãsüt¦‹n®(i `JžÉu±$ò™’RŸ§co7µ‡òOf¾ójp›‹»å8¹;fé×p'î‰0TÑÕKíèkƒô+|y߃rŸÈ•¢ŠêOnŒ!a—¤JíXȁ¸4JœwË[¾sû†©^Ÿxú¬1‡¥ÏÞç°P2c$+:Äൿ ÁÕ®íÜYBŠ2 3Ïpç‡øÕ å÷N—•¼«Iz– ²JØ©¥é9¹«—×/qeT¿ñ=YÍ~»7ÏÁ†TÈæŽÿlŸqŠ÷ÑµäuTM–¿5>0ÕÂ&!Ù6%t†FK‹´¤nR>0<óoQpS)·ÞÞ#FÕ0ÑÛ×ÌŒl´XP¨¤:{é´t*r ƒÐv7÷¸æE?BGi^S‚¡çùX:–š²äS…ðæÇo„§QjÚ!_ˬG'VNWæ jº…Õ©fãjÝPqI9ûò­· ‡UüU‘>ëjä(†MA¤÷?¤êö‹_þÀOš—W”ã8R2iN$ ©è­ ûv'=£FŠJë]as^¸îÔÓ.Ÿ–*ç¦÷‹4oEo’žs2¨û‹/þÞéGÁÇé[³lm×ÀjÜ~D…£b^ꗅg:Ÿ+O~M׺Yʺœg÷u¥yþǔdœvNÒߓ¥³s0æ¸zµÏ弸ËB©ŽÑot1›U"dÓKXFË~‰O6Oú‘íjòۂRÐ?¨*¦t*Ei½S¦ŽE¦f<:²Ôr“é˜ZoŸå¨ù–iF܍®Ë¬kwÐ<ÊÀy7ÿ2L“—ÌÅc?Y¾f˜…"í 0@à¡ÿðþ¦Ö¯¶V±fuñ³›G”ÍöæǺV]6ú)^‡v{cJÓüN Š¬7 F­O ¦’u .T¹ÖR¾±º¬›JmÔ¬÷°±ÖTˆàÌ —­Ê‹½?µì65J†Ðp Fw8ïÝ¿™6ÝÖæ“ÜzfõǤ'?Z—l%"òÁøÜ8_1"õŒ €“Ë:jˆö¥K9i[ûy\\YO¯?ðŠáeÆëŽ>…%1蕔ŽÑIO^ÐÐÓo:©R§ê[2QGv5•ô™H£„äºõaXݾ›ˆjÝ2{5×qJ¢| *ëÆÐx)^./šÊyMøÿ¹Œ*ŽÿtŸïg^‹W¸) <Ö톲!u5¾ÔuªZÛnJãï\ŸÝÄEý؋"ÄAFÚbÚlM4÷h%1áG=oêoäV…é%Ý¸ µqL ØI¿ á5šrŒ6 ‡ ÜÈöM‡Û½&íÏ]ØxF‰V÷Yó*°Z­C˜¾¨ÖfjÞöðôDÿÔiëEÐbÓŽÐáŖîn«8pŸxF›æ.e¼Rÿ=ò KØyE†Kžüàä4vä^ºDØ¡+%óí<G\>E¤ý쫙ô§ÓE¯U€“¼ÚóGÀÍ×P©ÞUy.Å MŠ:Õ0+|á.Ÿ]|N¬¶H³!©jæê|@‰ŠÒÚCåÏÅôIStæægQÞä¡Lw‹¬” z±Ï£ƒX?êÀ‹ Ùpc0š‹S¾·+õ†óŒh±Â¼íáü_þÐÿ?Àÿ (è³·:Ù ÿ}@¹Ýendstream +endobj +527 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 46 +/LastChar 117 +/Widths 8025 0 R +/BaseFont /WIXRSZ+NimbusRomNo9L-Medi +/FontDescriptor 525 0 R +>> endobj +525 0 obj << +/Ascent 690 +/CapHeight 690 +/Descent -209 +/FontName /WIXRSZ+NimbusRomNo9L-Medi +/ItalicAngle 0 +/StemV 140 +/XHeight 461 +/FontBBox [-168 -341 1000 960] +/Flags 4 +/CharSet (/period/one/two/five/A/I/L/M/P/a/b/c/d/e/h/i/l/n/o/p/r/s/t/u) +/FontFile 526 0 R +>> endobj +8025 0 obj +[250 0 0 500 500 0 0 500 0 0 0 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 389 0 0 667 944 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 556 444 0 0 556 278 0 0 278 0 556 500 556 0 444 389 333 556 ] +endobj +513 0 obj << +/Length1 1608 +/Length2 10350 +/Length3 532 +/Length 11200 +/Filter /FlateDecode +>> +stream +xÚítePœÝ–.4Hp‡Æ-¸»»»…hm´q‡à®ÁÝ=x°à‚»»;A/ßwfæL;¿fæ×­ÛU]õ.ÙÏzÖzÖÞÔäªLb¦v& i;['&6fV~€²¥‰3DÃØV‘IÜl +xsr!SSK8‚Œ,íl%@ü)@°³Øøøø©vöæN:-uzFƏÿôü•0qÿ÷ÈÛIˆ¥¹-€æíö³·Ù:½Aü·j€@' ÀÌ H¨¨êÉ)Ëèd”µ2 [£1 êl¶- [ˆ`fçÿÃílM-ÿj Âü†% ö  åÛ1dÿWè#Àähc ¼},!sGc[§·8Ù,m`gÓ¿¼ùÍìþ&dïh÷–aó{Sµƒ8A€Ž–öN€·ªª’ÒÿàédaìôWmˆå[`gö–ijtþ«¥¿co0oQ'cK[À äæôW-ÀÔb6v«ýfïhù7 gˆ¥­ù?|8‚̍MÁ ä æ û¯éü³OÀêÞØÞìþ÷i»¿³þƒƒ¥6cFfc« tz«mni‹Ìò×¢ÈٚÙØXÿá7u¶ÿ÷˜ ÈñïÑýµ3ôo$ŒMílÁîS2‹²Ó[IÝOeæÿ=‘ÿ$þ_øEÞÿ™¸ÿªÑºÄÿÓûü¯ÐÒÎ`°²±ÍÛüぼ½0€"à¯7æÿÊ5¶±»ÿÙÿš¨úÃÿ +DÎÉøm b¶æoR°2³þÃi ‘¶t™ªZ:-fÆà·ýíײ59‚-mAoZþ=F׿Ä4-,Ö¶ ›ïïÈÖô_™¿Éó7o) EÆ}MÿÎR}SÝIÓÝþØ¿õ¡dgúÆ_ââvnO&6+ÏÛecåðqòyÿõþbû§­dìähé0xkš•íïÖÿíÿOËð_`¤lv¦퉆“±­éÛjý‡ã¯0ÐÙÑñMÑ¿oû[Ëÿnÿ½ä ˆ¼0k´JIOuúŽ—Ý?"iÐÝÉÛd_\§YçWe×᛺ÎWþå©:ˆ¹~Œÿ¥Ù}æÐþy[žaçW'.˜¶ãè4—Ø›’¾+c…¦•‡q'€ås1jê‘N¤çÙ´âÚ;}nV흍5õÏEOð$c­Žˆgwô~”.y~ØT·öh>ÀäÚœ¶õP˜ßóhöïni{úû:.ຶ‰³b¨\Þ¡ÒDø9d‰èk•{F™±%ôV%vwiÑq¬Ì_à6¬qô÷êʀ‹žG5 FGÿOÙÇÏK'0¹…n*}ޜ!‹…I€–E¢­Çä$³T*vâík³ÑhŸèn9ùS¿ÍÙ¢`›æó‘2y–Íïœ)‡C£Ö|ý%—[Yð­ßÇ™{üò™&šb“F„ª‘âe°µ¿AL\W9ýEhË`î­ë'äûšùø +½lL¹:FV5P°Ü –ú8ՎÝQ?Ùã䆆‡óXgΉ÷ÖÖ´^]¹Ín‘^üâRZóã<”sN;¥ FFY:ŽÕÀÿ(,Ûª-%#cÄв Ìä¸w¦Lc„±¨çÈò˜«'!@ÚÓؖåâ5I¼÷r´†@+¿Ù|ñàºQÉè‰F¨[ZÄ?Á2 +àÀ¡Š-b¿nÔÍžÐ!éC°¥LßËÕòUfº_«²À8T?¢Ðû²pz>f`¹˜Ú™Æ¸B¹ü0ҏÏ=¤…å±ÄÿqAmâ¡úÉ"šõRwu²jücðÉhhw¼\ "Ä!é¡©²UÓI`„A tJ›”ž‡½¹§ +H׌»”!,¢B”*ÉÞ³K²ÿšËiR“ »ƒŠÈ÷ìFd;žÏɋŸ| +{Ow›”E_! ´äV*ï8ƙƒY°ÚÙØ(¶•ˆ,Ž9ÞÑ'Ù¬Rñœé±ž6àܓ°¸>Ùø0w‘˜Ï—ó€±~mI*®­*1N‹¡+Y)'ûÉȵDZ&þfCœ +Ô¾ø@½ù[ŽCÁz\' §E0·­;½+§ù1œ§Š¥}Z‰Ü¨»â;Á‘Ž€ª¹k +ƒ)Š@lf¸‡ú€Ï¤Ì«ô(–7¯Zƒ•æ®¿Bªßlɋ¼¸Áì­Éâ8—Kn:ÒÌ>ü6ÞêôÆ*¸³ßԌÁŽoå¢$[g VbÌåÐáÞoàš Eoˆ‘\%âÑèµ,ÐomíPÅÈÂǎõÏßÁã"ŽÓ8Þê·Z« Îü’‘Dù£.$p)b=Í­°]Ҙ›CÇp +n%AУ ÕÍvämg÷IP½Ù­¢ú9^-ÊbkÐoIõõ`>qnfyÆEt0•¸-+Ó²$lNÈYmÊí'O*Zý*Ztr:¶ëÞÂÃÃFÊ!L[]Ÿ˜Ïӗ3øýÞ?uÒ?Ž{ýWWX4pÅ£Àaói¨„~üÇöë”_s‡ódF0LïÛJÌÑRÓp“eªyç6ò¿lè§»‰Î•®Í8±¼›B¼ëÓ8º±¬¼ìbÈ ÎØ@ÀÊÙ¥RÕ먻)£Dã°Ɩÿü“—:_ö£&…”¢UFë%ÜW\7´_aÜízis³4Š;¨t|D +ç?5rªÄú!àsQL |é"XŒÂn5œ‡Ò±²V"J%&ºZBÏÈ«0¤ˆCH#Èf±µéÀš.IhR±ze=!R»oà‡6zV¸4‘A( pˆŸ.HèñƉD¾lÖO‹³zñ)ãRßí¢Õ0\e×x"²àšNd4å_…¦æŠ€bÃči®}+ lL?Oó, +R´I앬"P ×9È mlo3’åõ.i*Ýgi 7£cV kEM»¤V%Od­H½/×âɉvžkóMþ= ÏÅLÝ L<:ÙÈ·ïÅّk?E¹ÄQqQÉæjzðñ†+¥içòùð7¦lÝ{óN1¬L_ð²»> Vœú¶³݆•¸L¼4ï¡#µLŒaË؍·Ñpâ˜Ö·¤ ÛÜñ·å*w|ö{#| ©å"¥ðàà},a¼Ò%Ê¿øaàg–mBïøúöZf])SØù…=(X6µ¡†ãÆèds ¹x›ª©aóÍ `7PÏLIZíu<öéV«R²®y|c£çE£§°·)¦€´P†¡¤¸â¨Uu +Úeõâ>]lmbώm½F¦(T€ë«˜ÌðRz¢–e ÍCñhFÔs¹î{¬&JK±sŠû¨~Ä+@SðíyÍêo&¦wøHæѤû>߶ùHþþÞÁÓÑcµ¸P˜ú€%âš`Du¦J0¡Éix! !ùÍÁˆîû9°×ê:8‘ø‚^8øÔ!#½Ü(ƒbÔ“ ‚¯ó½¸¦‹âÙ­ÚÍ­ß= FÎÞ2ÿÙK{ȃµ?y®.<~ ïŠG¥˜GŒçn¡Ë‹sN)Žl†îQ0ú«ƒºB@X¿R‡¾ò 2WHTGM×ÁŽ´ˆz‡u&£öøS>]¨•„:{ëÐ9p¯«n2­³þލTp¤í¶¦Ã—¦š¼›$(ÎNå‹Ð’ÅL÷V\¬ær,|ФdÉØS8TîÿٟÞ5š´kÇö•ªdãÖÊÇnViŽ$¥ ߎ¢6ý*›:Äêéߔ¯ip3öçÎ"ô£ç4'GbÇ¿d¤ÝtÃÂgè€"2ž¬²sŸo +ÊßwJD¥}·±+ +íôª»¢2@ÂËlT +˜áäèÛûͅ&ßù$«zHΡ×ëù˜ÎA~ çLaõ ¥ÙÛ7ñN–ÒÖ +ðtóîÔ|·ÓõCIÂû|á.<4Mb£VÑÌèœ|÷kîèQI’ú ]£Q¢l5(W˜œ»GÎcòQø书"ú› ;¡YÕ+¦­E;@C’¯SÝc¨jrt›UlˆoLz†°Ášð£€ÿû?_¸ ×oHa¢ؼØ/@0é°÷n$ ý=H–õû¥-„šT)Vž*£‰(ö#v˜¯\ž£nÁ ]*€ikëuRÝü»E;± Ék‰­°%èޔ»C™ïkþ&ŽGûîýŽb_[f .Èáì¸ÕÍhDÜÜóºØ:ø +¦ìS’öÅ ýúäy2‹ šW èKQ¾“ÞjâÒ+VSpC®Õžœ‘«Þ÷UŸN—ÊÞw¡-þ^eŽ8¬˜ɯm¨‹êPý¤ïî²Q˜|gÃ^FHÐÒ6:z+òÊïúÎs}ïq%L +– ªâq­7--v`˜5H”Dr“iêZ¸©ç’^æzÔ·þþT½›‘&S¦¾Ç[왇ê,ÐîIêŒC÷4~;­uñ ƒcÛ´…ãüÛ¯ BÒ +ᚎX•PÑp†Ôlù•Èš Ú!kú¶ÛÆJ=ú6R€٫̶†Px!ÎÏ„ë´V)ÃZ'ûºÂiXä“ñxb´gOÀžýPËã„ò0 ÙOpÉ$`Dæñlë]sPÁZ»ˆ–˜é”=ÅS㬠7O%—Œ*Ø8i +²’5šÿhðVåT¨GÆ¡V%'â[à4sè—FËÏ«M¾7,¤#”(ò."±³ÿðEꕠö—¼;“œ˜ÛRÉãvC¶%7®q =âRð:`žü‚z%]âÛ¥…Âõ7‘®h9lõ!êz†Ó=Ë܆Lœ©÷ŽñÏ_ÏÈ4gU‘" ¼O€N"´ÌP÷Áh_ª›Ç󰟙y>"e¿´SëŠT‡³˜T%MHáJ+Úµ‹Éhÿö„yææ‚¥yb5Û¸Àri-íLðjф*OWL þRZþ/†mE~ÝEìøLz۵ ÖÉÏÉðvužlG.œ™ƒ[R•²–Ä 2kp.¯ƒ_ÇäÖêÒ;ŠêÛú̃|ðœ‰Ï¢¯}:Ê +ŸDlÉóê=V¹ä”e§š²j—$£GºÈubÇ(1y„ÀÃá ¾L=œ<–=ÖC±UíÑÈZ¬&÷8?Â5¿z±o&Ü[@Ú‚2̐‚F1äó½`>?$%,Z'3ß¡W:•ÁE6þQ þè!”y‘kˆÝô ×*®”'åqVE’=¡uŠE|3DVXñÞg»~-c^úÒS4A ðþêìÖ«ÆY ˜Ÿ×}˜ÏåÓbdݯ~ŸSGŠw{ø|Ô +Ɂ|‰?G)X쪅 “‘ôÏŒ•V„hßÛó­¼]H7i9×¥Avs_µ¯ûÖψ¥ºú <]64\ãâ7¯»UEZ½OB<¢¾=ô«cä¶Ynç:~ª„;µ=ŽÏßäÆØ`‚Ы*ˆ¼¼Ä äu‰Åq”rÑÆq;$Ž¿À*ç)Ú4¢’¼oÏ>Ð;sĸÛï[¾uñ€bÁÌÒß2º^mhæzŒ˜9Óå` +Q鶢ëÿŚcàbºÌv¯}PóíXÅÛÛ«†,zük,4€`ú•ö»ÌX ¾-zØàI÷“ä‹ëX¸á/œ-í:n0¬C·"d‰†’ɼ?¿„D<Ö¼Ñi/ð7îxªŽE®â÷Ã}ôì³(œÊY8©¹|EŒäV<שVöìüpú kÖÀŠåõW;ŸQ¿‘Z²ºóœ¼éÜ÷Ih{-Û[̉›òxǪ̴̃ÝåìDi~U7Ó^Pcˆ*‘©‘I~7ÅPáÍ8æÙÈ«Ì_L!¤¨ð®£–AmS–…>iVÊ&DØE-^[M¶Sf4ƒBq²ÜltŸ¿8YZ[㍬κ|„ó +xÇk¿ÐÕSñÑOIßf†½#Eç³<\\XÜ ´Êm–FP¾©"­¹ˆè:K†ïåbUåÉáþsà©ÞËô¸cRjT›«u&ŠÑå†lüØtþŸM›”Áî v­CðÏ«ím¬?¥U4B¦Ìx7ƒ}Ø}2±Rl¢`í㟵‰]'†„ž”¿º™w»ñŽ6µl’d¢}ä‰r¹Õ`â·»Z aôº¿BssZ©$ÎP1¢Mù^)©Á|¾o‘eXìy™W *œš†ù²ä<ö*hÉ8êïԚÄsòýÞ%m²2ÓU¨}ÞÑëü¦WCø“`_ïûKBTÃQûIÑú”‰`A©e3ñ•wÃË|õéÄêUnn8Ãç#³ñ§Õ]üÓug¶ ™<‘Ë“P/ª¿%EQ¦ Nº’*°öïÐ?3ÇLöd„ÎÕh=‹ œ›t:gs%å¥JU­,%þ­œv_(Û:˜:ü™´Ô>•ÉJ7†Xq4üSД0#‚ÝŒ!ւ[«È"¦fó‚ÃÂøÃÁex×Ô¡Ñ`$2Sy¶?”ˆ˜í ‹oäšÀŒ«î3ög—LåЉÉXÕEÝÛìX…ç™S›³]8ۂœ­4¾¦'B›sÌþ”1ø’óìõ©ƒr‚àlsOŸ¸‚Ç«`ñaWu{ÚLÙ«òož5, ®B™ðïæéBÂ<ãN«ë¨kŒDy·3;¾$ԅ9#&y“"®äJaø̑¼Îÿêj˜²]›æ®9’¼jB/˜eãÔÝAE ¾ö*"§'³÷VËìè$`ƒùfnrì±³¸3>å 5»o#£H?Ýy½[‚¯æFe ³Pyʍ‰!…^&ӞS¬±peQ[¼ÇÚ¶rîú.ý»i>™Im¿“_ý³´÷½“|„MƒÏ»Áô»«Mé?¸tŒùsXßï.»úÂ]¾áF<à£ÞZAj¦t}`°ÌÔ$~‰kƒa Y®»"þhV¬PûßК„caim)DifÎÍ+ ßuŒÐÉ Q¥?ä‡&r›­·´Âˆ”.‰¶F„ê'¦NB7Ww镜!û(½¢UjÎ28ça´¼®”WûìlZ¾B·é¹SAœF£w褼°¹ªå*¿]³år"q˜.ü13Oš‹´N9³‘´—lL,úÇ#JŸtSø@eJ,ýU´µx}ŽbÝ ¤Y$Ω‚=ȵú©RA¤GtTô¿â.ŸPÖj¢Â•(¾,'ÌU` Ô!e¥é¥¤AÔ>rùTJ›rj—}ÑÀÌ•ÄºÝ\Ü7ŒÎñî@÷Ú¯–j«ŠF Ž’ ÒP´+ «Ö„QÍé q;U5>`3÷»9™äכæ°Âa-ÉráÛ¯ô,ñ­ó:I²ˆì ñ×Y™à3X…¥j+xÒëVÜÊ^)ïßãǤZŽ)aoÔÜÐj±ú?dœÀì¦+ÂEªúnd, ʅG€Á¡ñÍUÈû5a<aq=ØA@íkN¶À‡þÙØ€?DÅ»5ÿ¹U ‹jø“¶$ÿтug 6󸛣\H’õpµR| :ØáÙ1cÜ0@)}`éý§¯Îú¤gu4LÓðÌH5ñCEëÅ"õ”y•ðÙÆ{Ù8ZvlnÙ"r±_S¯BëŠd¯ÿȾ2ºjÍbÕçæG‚-_É Œü²},ܧ˘Jî(…K¨R(é<ïšZë‘\GÍ꫐ü úÒ9ÀÐ=£Â>V‡#¾G¾¦_fgž±J ׇ(ËàwLIåÉ6ʦÖ0¿²]:" å¯(Q4Ê°r·?Ç;c¼v “Û`ÁfÇ&b$‹ *¡]—Ð7×¡è¥ jÍ^0dòâgçú¢µSÞݧNßN ([!.¿~Í1½k+%Ȳ üK+LÂ0qsè汌԰Ÿ,Àhk3œ%¶" ÖCw[˜u:@ƒ#úÇP5úx/hf’ð§ÙvZf‡œŽ™Ãj¦óQösðÓ†U–ïrO‡EË:½„$#ó2îɏarB!úÎz ŠgADí÷ïV¡¹ËŸ›Ç#c‚|ëÙ^7s:U'®ê²Å¢ °Éä”xó2m;:éPµä¶sMºsè@ùGÝñ¨ý4/¨ðd^RiÈWä†}:}îƏ]©¾˜ò ÔDñ˜Öçù›Î“Œ_L–¼¨É[¸°‘’…*GÀÝ ¯dáöf$À ¹ê³-×_ è©h#ïgUá—GÛ±#Ñ< +|Ú¿´‘s`ódÑN²ƒS„äT«ÆÝ2Ž[_´ªÕ+êÝ…˜õ#uØkåcÇ\†%þ|úS~£ºá’eª!0ږG‡µÓP™Œ<“x¨ê|ôã¤0‘å‚#¥§U¿W¢wšÀl‹&w€c\òȵ +] `þsÇï".¸e~·o{=úq!mǯ!£- cÿásuîÉ -¡NýÑôÓøØ~qÕ ‚î³}¥“üà—wx¹A-Ž~c)TEòÞVï¸V½õÅëE9¶~   gÞt®@™Ñ!ïM AªzìJŠÄ ¤TˆÐlžt妓.–´i}Ô÷Àª^´Íe¸Á‚Ts% Båȯž< ʉȁ‰;pÕimÂâKÆ"ûƒ°ýþÌ>Bq|¡´\6”´mÕõÖþ†Á®×–ý\Lwæðù"R²´"ß:=§7ºY‘©ÖhÏðë©éséÅž±Ã^>a$}EÝ3±\ŠŒWK$2U²ÔˆL‚ÆÆ\ó —;lpVwë’=uÞýÃ^5Ç[\«ÃÌ6W)ý_—¼$9IÐ È´1õkMõ©ïyò%¸ÌJ¼œ/-ßÙ]ðkQF¹z¢ñªÚEK¢4³ÆV@âށñÚ‚ O‡ñoå?ÑiØe<ª´áËÏ«™ÑÂôí (>áX.¯dZSÐ,P曊¥ïÃÃÉâÙrŸ:1P µBœØ»®Ó„‚û3Nî”U +c#Ùì¾Ö|9FoüÞ®ç1:2/Ë<€R”C^Á± ݧ"5˜’bòu‚œ°ÊS^O ퟒ +vÒ\=mù75M[ûR< D°u¼VoKûvUžÁ)^ûeÿ9‡Þª#¤„1\¥áut e‰Õ·½½Á:Cd¨Ë:­ïÝ'mi¬k¢+­ˆâQ]_CA"“W…vb¿Iþ›¼zs‹‘„õéÃ=S©„¬€ÊSœõ)YûÉDÝ!êÜ×ù«`ÆöÁ¤A…0g¯egd­VbQùù®=<ò”#—•/;íGëOZP^br+Q߸‰*”ǹ ‘‡Í$Ey%;IѤ!–M³Ý+Ûð>»œ +Xë7>5-Òâ^HýúÀ%x5á>r:Ðx}"ćþG̈ÿŽC.í·™Oß5ý©Ëìô3PCŽN†õÚiW$î(›¿wÌ¡ºuw‰J‚W°ÇøO`O䟏Òœý¼)ï Ċ=œîåèC9ê¨çÐí +’örqFÒ ;ûhàwlDn1U—©e~¾†#\ªÜÒþÕÊŽÿ™ä½ãÝ}Q(¥õúbž`¨Ÿ¢r¬*”|BύdäÛs¾°iڌíJ•‰xwüéÜà͊4ƒy¤G¼Ñ½Ù‚ó„ϵ„öi¶gµ ßÇgYs:ÑÝÊ#æp¥mâa9:ÐËÓ3ò@ ËxN»ØØ'1Åâ™ To‹üB‡µEZø­5uÝÜ#BoÙîîü1‡]Øë{Ò¸Óì;ÿ}ž¼k²$ÚTpSì6t*I·ÉæÁÕnäîrH7Œ¤¥<–w{s°}GD@4H®ùbYtùcì2IŠ/š·0‹’·IôøàÅ-/ÕW ”ï„ت0pj¹¯¼oM(´õ£ÄiÁ˜ÁeIx›®k@ÆyÞ[ÕLÈ ËíÆY«qxÄ! <ƒ'Ñàì¦F{s"¥ƒ¹¡ØÏNôÊp(ÉÔÊÚ}Öô6Ús’ÒÆÆT½âKSôz¿þÄÖR²ðòõÛÑnÕöº?;ÁxñÅßn {QÎi|"“üč•£L×\ü¹ŽÊ7æû>‰ózÖµ}LJ=þ3ý³P¾¦Dvi¶­«o¡ÊZžF¾5Åíw~¨Gw¼©Ï*܈¤f  B{º¸‰uøK»¥ûf-ëš7mzâ±ïyɓè˜ý1GÔy¦d3R’—ìüê3ò%ßrÓæ†6Kt¹]­Ö“u +^QW3 sÁ¾Q¤]fõÞ>eŽœð‹-½8$Mzn:ÖI!~%¶a’„½¶’Y#€²ì4â©pS¦×S¡þcÉ7‹&¯RÛw%˜íD›‘ó!”uBRñ~™/Š6 ¤: ÜrÂfL›ù|²„ÝûB4;Ù`”QƗt9]’=ÝüŸQeCÓvç‚0ÏCÝ7-›ÒQÙVÛQ€/mò¾]÷‘ÆBXÚ K¥ª»¯aˆ/Ö·H½ls~Ùª„!¤€9ÁœOÈ5¦š BKڒ"˜e<‹,òäÔ1ø F ê$ŸÔÂn%¦:é؂¹Œ9t­K5 ”:Š ðÙóó¨?Zç9Ð/åW7 ßµZØ&}l?Øl©c„>\lTUÝ÷¨Üè”Ëïá|nÿ¹1-¢¥i§°,ª|~¥ƒP«s»7^H;Ü//ÍÑÙqÁ¿¿_õy…Oª±ü®!MëÞä£.ævùðd˜ß ýô”±€‰J#;OCÈ\Kþړ¬{éÓÈn:_â²Ã°'h»k)§qxÓ éFš'´Ðb+ °’\Æy¢…WF2ˆ¬á½Ïë؇½h Éûþ5éꉒ­Ë©ÐMgÉë²1¢û$ø¨äU½…«% +Æ.I#ì՟’aH™oêöú~u—‘§Noe¥bó‡BÛ”Åv灀_ÀÑo½}!h1Ä+›UïHüëot?`in;Ï\h¬qF¾Âþ C /͇q*RÃ.!}Q¯qÕ肑öª7÷­SÉî +¨Ül3pt’S³ Ë%E4˜ +¤ç£,ËÀá×÷!ÒÎàäØú#o9>~5òŽBÜÚ6µ3}) ÌHÞ¸Á–4Ž1tùÆQ\þ¼ ³GPÌ ek;¨ +¬'@î¢ÑRDµL8ƒâÇeæcS;Kšê;P·6‡‚ö#íQÊ®hœbÞÇ Ï ¶9Õ@›§ö×â¥QëMRîüݹû îÈy;ªQIm¯ª(/"¹žBÝ'÷v¹Uƒ¾xn'a<£ã¼ U”‡2ì-]¥¼ÛõÖ8ž:ê—9™‡¥Rì¹#E°+Âl²g¡×~’&'>Û Iâ´b_ò.G~ýüvÐÛèÂU텅•FÒT»sEª¢4Q,´õ¾ÆIÛñO!lu˜-¥¶{TëÖ6C<üreíÕ +Â"ßS&|á°M=©–æöÁ]ØþxÎú¼d&ÓýÎ̬´ÞøÅ_=r»öõúö¼å÷1q˜Þ>CÎàZ s¤¼nb¿Jªdªœ°i1E’´ÐM'×øhãLñ]—¥v[þû#Y 6º3“O\´Íìý–⤛Œ»®éœä/z\yÉHÇÚg2Eܲ +_Kh96¯>º…jK5”„ +‹ªÆ’ n/@0ÿðacv¿›üÞM{ÚêصùKÇš¶…†=½³4â@í3!0+™'Së˜ï©; .®S"T—ÑÈuWTn›«g~‘5:pûƇ5§ŠúBmc†g}7'WI'¢BF†°Սí?ë@¹æ.|E1*¹9KÑÓó‰ouoñ¤‰ÿ »ª“‹ù¼f‹‚U–¨§¡:,û)Ž§ö•ÙÂ"…à4Ùâ­èÖ®Bð^©êçCÆÊ«]—ÏË5qÙ|‘3BâóÚ¿$éÓK‚`]´•$çø?&¨A4©¦7»LÌmƄ ƒŒðøT¨™±™Ÿ *ÃNumýy§àLР›¯Yÿ‡?äÿðÿ 2vt²³1v´Fþ?q¬‡‹endstream +endobj +514 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 8020 0 R +/FirstChar 46 +/LastChar 121 +/Widths 8026 0 R +/BaseFont /ESSCCL+NimbusSanL-Bold +/FontDescriptor 512 0 R +>> endobj +512 0 obj << +/Ascent 722 +/CapHeight 722 +/Descent -217 +/FontName /ESSCCL+NimbusSanL-Bold +/ItalicAngle 0 +/StemV 141 +/XHeight 532 +/FontBBox [-173 -307 1003 949] +/Flags 4 +/CharSet (/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/y) +/FontFile 513 0 R +>> endobj +8026 0 obj +[278 0 556 556 556 556 556 556 556 556 556 556 0 0 0 0 0 0 0 722 722 722 722 667 611 778 722 278 0 722 611 833 722 778 667 0 722 667 611 722 667 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 0 389 556 333 611 556 778 0 556 ] +endobj +515 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [506 0 R 517 0 R 521 0 R 669 0 R 817 0 R 914 0 R] +>> endobj +971 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [950 0 R 973 0 R 991 0 R 994 0 R 1034 0 R 1080 0 R] +>> endobj +1194 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [1136 0 R 1196 0 R 1238 0 R 1275 0 R 1333 0 R 1371 0 R] +>> endobj +1486 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [1413 0 R 1488 0 R 1541 0 R 1586 0 R 1637 0 R 1697 0 R] +>> endobj +1809 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [1750 0 R 1811 0 R 1861 0 R 1907 0 R 1945 0 R 1992 0 R] +>> endobj +2113 0 obj << +/Type /Pages +/Count 6 +/Parent 8027 0 R +/Kids [2052 0 R 2115 0 R 2169 0 R 2221 0 R 2272 0 R 2318 0 R] +>> endobj +2417 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [2352 0 R 2419 0 R 2487 0 R 2549 0 R 2605 0 R 2650 0 R] +>> endobj +2735 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [2689 0 R 2737 0 R 2786 0 R 2826 0 R 2873 0 R 2911 0 R] +>> endobj +3004 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [2960 0 R 3006 0 R 3048 0 R 3089 0 R 3140 0 R 3178 0 R] +>> endobj +3275 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [3224 0 R 3277 0 R 3322 0 R 3371 0 R 3410 0 R 3458 0 R] +>> endobj +3535 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [3497 0 R 3537 0 R 3582 0 R 3630 0 R 3689 0 R 3763 0 R] +>> endobj +3872 0 obj << +/Type /Pages +/Count 6 +/Parent 8028 0 R +/Kids [3821 0 R 3874 0 R 3933 0 R 4007 0 R 4086 0 R 4145 0 R] +>> endobj +4275 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [4212 0 R 4277 0 R 4347 0 R 4399 0 R 4464 0 R 4509 0 R] +>> endobj +4620 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [4548 0 R 4622 0 R 4679 0 R 4753 0 R 4832 0 R 4890 0 R] +>> endobj +5034 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [4962 0 R 5036 0 R 5098 0 R 5172 0 R 5249 0 R 5301 0 R] +>> endobj +5410 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [5341 0 R 5412 0 R 5474 0 R 5531 0 R 5605 0 R 5677 0 R] +>> endobj +5785 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [5740 0 R 5787 0 R 5857 0 R 5929 0 R 6006 0 R 6062 0 R] +>> endobj +6191 0 obj << +/Type /Pages +/Count 6 +/Parent 8029 0 R +/Kids [6134 0 R 6193 0 R 6265 0 R 6301 0 R 6377 0 R 6450 0 R] +>> endobj +6550 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [6506 0 R 6552 0 R 6650 0 R 6722 0 R 6792 0 R 6866 0 R] +>> endobj +6963 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [6910 0 R 6965 0 R 7009 0 R 7052 0 R 7111 0 R 7160 0 R] +>> endobj +7274 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [7225 0 R 7276 0 R 7335 0 R 7388 0 R 7444 0 R 7501 0 R] +>> endobj +7615 0 obj << +/Type /Pages +/Count 6 +/Parent 8030 0 R +/Kids [7562 0 R 7617 0 R 7675 0 R 7740 0 R 7788 0 R 7837 0 R] +>> endobj +7932 0 obj << +/Type /Pages +/Count 3 +/Parent 8030 0 R +/Kids [7884 0 R 7934 0 R 7974 0 R] +>> endobj +8027 0 obj << +/Type /Pages +/Count 36 +/Parent 8031 0 R +/Kids [515 0 R 971 0 R 1194 0 R 1486 0 R 1809 0 R 2113 0 R] +>> endobj +8028 0 obj << +/Type /Pages +/Count 36 +/Parent 8031 0 R +/Kids [2417 0 R 2735 0 R 3004 0 R 3275 0 R 3535 0 R 3872 0 R] +>> endobj +8029 0 obj << +/Type /Pages +/Count 36 +/Parent 8031 0 R +/Kids [4275 0 R 4620 0 R 5034 0 R 5410 0 R 5785 0 R 6191 0 R] +>> endobj +8030 0 obj << +/Type /Pages +/Count 27 +/Parent 8031 0 R +/Kids [6550 0 R 6963 0 R 7274 0 R 7615 0 R 7932 0 R] +>> endobj +8031 0 obj << +/Type /Pages +/Count 135 +/Kids [8027 0 R 8028 0 R 8029 0 R 8030 0 R] +>> endobj +8032 0 obj << +/Type /Outlines +/First 3 0 R +/Last 31 0 R +/Count 4 +>> endobj +503 0 obj << +/Title 504 0 R +/A 501 0 R +/Parent 31 0 R +/Prev 499 0 R +>> endobj +499 0 obj << +/Title 500 0 R +/A 497 0 R +/Parent 31 0 R +/Prev 495 0 R +/Next 503 0 R +>> endobj +495 0 obj << +/Title 496 0 R +/A 493 0 R +/Parent 31 0 R +/Prev 491 0 R +/Next 499 0 R +>> endobj +491 0 obj << +/Title 492 0 R +/A 489 0 R +/Parent 31 0 R +/Prev 487 0 R +/Next 495 0 R +>> endobj +487 0 obj << +/Title 488 0 R +/A 485 0 R +/Parent 31 0 R +/Prev 483 0 R +/Next 491 0 R +>> endobj +483 0 obj << +/Title 484 0 R +/A 481 0 R +/Parent 31 0 R +/Prev 479 0 R +/Next 487 0 R +>> endobj +479 0 obj << +/Title 480 0 R +/A 477 0 R +/Parent 31 0 R +/Prev 475 0 R +/Next 483 0 R +>> endobj +475 0 obj << +/Title 476 0 R +/A 473 0 R +/Parent 31 0 R +/Prev 471 0 R +/Next 479 0 R +>> endobj +471 0 obj << +/Title 472 0 R +/A 469 0 R +/Parent 31 0 R +/Prev 467 0 R +/Next 475 0 R +>> endobj +467 0 obj << +/Title 468 0 R +/A 465 0 R +/Parent 31 0 R +/Prev 463 0 R +/Next 471 0 R +>> endobj +463 0 obj << +/Title 464 0 R +/A 461 0 R +/Parent 31 0 R +/Prev 459 0 R +/Next 467 0 R +>> endobj +459 0 obj << +/Title 460 0 R +/A 457 0 R +/Parent 31 0 R +/Prev 455 0 R +/Next 463 0 R +>> endobj +455 0 obj << +/Title 456 0 R +/A 453 0 R +/Parent 31 0 R +/Prev 451 0 R +/Next 459 0 R +>> endobj +451 0 obj << +/Title 452 0 R +/A 449 0 R +/Parent 31 0 R +/Prev 447 0 R +/Next 455 0 R +>> endobj +447 0 obj << +/Title 448 0 R +/A 445 0 R +/Parent 31 0 R +/Prev 443 0 R +/Next 451 0 R +>> endobj +443 0 obj << +/Title 444 0 R +/A 441 0 R +/Parent 31 0 R +/Prev 439 0 R +/Next 447 0 R +>> endobj +439 0 obj << +/Title 440 0 R +/A 437 0 R +/Parent 31 0 R +/Prev 435 0 R +/Next 443 0 R +>> endobj +435 0 obj << +/Title 436 0 R +/A 433 0 R +/Parent 31 0 R +/Prev 431 0 R +/Next 439 0 R +>> endobj +431 0 obj << +/Title 432 0 R +/A 429 0 R +/Parent 31 0 R +/Prev 427 0 R +/Next 435 0 R +>> endobj +427 0 obj << +/Title 428 0 R +/A 425 0 R +/Parent 31 0 R +/Prev 423 0 R +/Next 431 0 R +>> endobj +423 0 obj << +/Title 424 0 R +/A 421 0 R +/Parent 31 0 R +/Prev 419 0 R +/Next 427 0 R +>> endobj +419 0 obj << +/Title 420 0 R +/A 417 0 R +/Parent 31 0 R +/Prev 415 0 R +/Next 423 0 R +>> endobj +415 0 obj << +/Title 416 0 R +/A 413 0 R +/Parent 31 0 R +/Prev 411 0 R +/Next 419 0 R +>> endobj +411 0 obj << +/Title 412 0 R +/A 409 0 R +/Parent 31 0 R +/Prev 407 0 R +/Next 415 0 R +>> endobj +407 0 obj << +/Title 408 0 R +/A 405 0 R +/Parent 31 0 R +/Prev 403 0 R +/Next 411 0 R +>> endobj +403 0 obj << +/Title 404 0 R +/A 401 0 R +/Parent 31 0 R +/Prev 399 0 R +/Next 407 0 R +>> endobj +399 0 obj << +/Title 400 0 R +/A 397 0 R +/Parent 31 0 R +/Prev 395 0 R +/Next 403 0 R +>> endobj +395 0 obj << +/Title 396 0 R +/A 393 0 R +/Parent 31 0 R +/Prev 391 0 R +/Next 399 0 R +>> endobj +391 0 obj << +/Title 392 0 R +/A 389 0 R +/Parent 31 0 R +/Prev 387 0 R +/Next 395 0 R +>> endobj +387 0 obj << +/Title 388 0 R +/A 385 0 R +/Parent 31 0 R +/Prev 383 0 R +/Next 391 0 R +>> endobj +383 0 obj << +/Title 384 0 R +/A 381 0 R +/Parent 31 0 R +/Prev 379 0 R +/Next 387 0 R +>> endobj +379 0 obj << +/Title 380 0 R +/A 377 0 R +/Parent 31 0 R +/Prev 375 0 R +/Next 383 0 R +>> endobj +375 0 obj << +/Title 376 0 R +/A 373 0 R +/Parent 31 0 R +/Prev 371 0 R +/Next 379 0 R +>> endobj +371 0 obj << +/Title 372 0 R +/A 369 0 R +/Parent 31 0 R +/Prev 367 0 R +/Next 375 0 R +>> endobj +367 0 obj << +/Title 368 0 R +/A 365 0 R +/Parent 31 0 R +/Prev 363 0 R +/Next 371 0 R +>> endobj +363 0 obj << +/Title 364 0 R +/A 361 0 R +/Parent 31 0 R +/Prev 359 0 R +/Next 367 0 R +>> endobj +359 0 obj << +/Title 360 0 R +/A 357 0 R +/Parent 31 0 R +/Prev 355 0 R +/Next 363 0 R +>> endobj +355 0 obj << +/Title 356 0 R +/A 353 0 R +/Parent 31 0 R +/Prev 351 0 R +/Next 359 0 R +>> endobj +351 0 obj << +/Title 352 0 R +/A 349 0 R +/Parent 31 0 R +/Prev 347 0 R +/Next 355 0 R +>> endobj +347 0 obj << +/Title 348 0 R +/A 345 0 R +/Parent 31 0 R +/Prev 343 0 R +/Next 351 0 R +>> endobj +343 0 obj << +/Title 344 0 R +/A 341 0 R +/Parent 31 0 R +/Prev 339 0 R +/Next 347 0 R +>> endobj +339 0 obj << +/Title 340 0 R +/A 337 0 R +/Parent 31 0 R +/Prev 335 0 R +/Next 343 0 R +>> endobj +335 0 obj << +/Title 336 0 R +/A 333 0 R +/Parent 31 0 R +/Prev 331 0 R +/Next 339 0 R +>> endobj +331 0 obj << +/Title 332 0 R +/A 329 0 R +/Parent 31 0 R +/Prev 327 0 R +/Next 335 0 R +>> endobj +327 0 obj << +/Title 328 0 R +/A 325 0 R +/Parent 31 0 R +/Prev 323 0 R +/Next 331 0 R +>> endobj +323 0 obj << +/Title 324 0 R +/A 321 0 R +/Parent 31 0 R +/Prev 319 0 R +/Next 327 0 R +>> endobj +319 0 obj << +/Title 320 0 R +/A 317 0 R +/Parent 31 0 R +/Prev 315 0 R +/Next 323 0 R +>> endobj +315 0 obj << +/Title 316 0 R +/A 313 0 R +/Parent 31 0 R +/Prev 311 0 R +/Next 319 0 R +>> endobj +311 0 obj << +/Title 312 0 R +/A 309 0 R +/Parent 31 0 R +/Prev 307 0 R +/Next 315 0 R +>> endobj +307 0 obj << +/Title 308 0 R +/A 305 0 R +/Parent 31 0 R +/Prev 303 0 R +/Next 311 0 R +>> endobj +303 0 obj << +/Title 304 0 R +/A 301 0 R +/Parent 31 0 R +/Prev 299 0 R +/Next 307 0 R +>> endobj +299 0 obj << +/Title 300 0 R +/A 297 0 R +/Parent 31 0 R +/Prev 295 0 R +/Next 303 0 R +>> endobj +295 0 obj << +/Title 296 0 R +/A 293 0 R +/Parent 31 0 R +/Prev 291 0 R +/Next 299 0 R +>> endobj +291 0 obj << +/Title 292 0 R +/A 289 0 R +/Parent 31 0 R +/Prev 287 0 R +/Next 295 0 R +>> endobj +287 0 obj << +/Title 288 0 R +/A 285 0 R +/Parent 31 0 R +/Prev 283 0 R +/Next 291 0 R +>> endobj +283 0 obj << +/Title 284 0 R +/A 281 0 R +/Parent 31 0 R +/Prev 279 0 R +/Next 287 0 R +>> endobj +279 0 obj << +/Title 280 0 R +/A 277 0 R +/Parent 31 0 R +/Prev 275 0 R +/Next 283 0 R +>> endobj +275 0 obj << +/Title 276 0 R +/A 273 0 R +/Parent 31 0 R +/Prev 271 0 R +/Next 279 0 R +>> endobj +271 0 obj << +/Title 272 0 R +/A 269 0 R +/Parent 31 0 R +/Prev 267 0 R +/Next 275 0 R +>> endobj +267 0 obj << +/Title 268 0 R +/A 265 0 R +/Parent 31 0 R +/Prev 263 0 R +/Next 271 0 R +>> endobj +263 0 obj << +/Title 264 0 R +/A 261 0 R +/Parent 31 0 R +/Prev 259 0 R +/Next 267 0 R +>> endobj +259 0 obj << +/Title 260 0 R +/A 257 0 R +/Parent 31 0 R +/Prev 255 0 R +/Next 263 0 R +>> endobj +255 0 obj << +/Title 256 0 R +/A 253 0 R +/Parent 31 0 R +/Prev 251 0 R +/Next 259 0 R +>> endobj +251 0 obj << +/Title 252 0 R +/A 249 0 R +/Parent 31 0 R +/Prev 247 0 R +/Next 255 0 R +>> endobj +247 0 obj << +/Title 248 0 R +/A 245 0 R +/Parent 31 0 R +/Prev 243 0 R +/Next 251 0 R +>> endobj +243 0 obj << +/Title 244 0 R +/A 241 0 R +/Parent 31 0 R +/Prev 239 0 R +/Next 247 0 R +>> endobj +239 0 obj << +/Title 240 0 R +/A 237 0 R +/Parent 31 0 R +/Prev 235 0 R +/Next 243 0 R +>> endobj +235 0 obj << +/Title 236 0 R +/A 233 0 R +/Parent 31 0 R +/Prev 231 0 R +/Next 239 0 R +>> endobj +231 0 obj << +/Title 232 0 R +/A 229 0 R +/Parent 31 0 R +/Prev 227 0 R +/Next 235 0 R +>> endobj +227 0 obj << +/Title 228 0 R +/A 225 0 R +/Parent 31 0 R +/Prev 223 0 R +/Next 231 0 R +>> endobj +223 0 obj << +/Title 224 0 R +/A 221 0 R +/Parent 31 0 R +/Prev 219 0 R +/Next 227 0 R +>> endobj +219 0 obj << +/Title 220 0 R +/A 217 0 R +/Parent 31 0 R +/Prev 215 0 R +/Next 223 0 R +>> endobj +215 0 obj << +/Title 216 0 R +/A 213 0 R +/Parent 31 0 R +/Prev 211 0 R +/Next 219 0 R +>> endobj +211 0 obj << +/Title 212 0 R +/A 209 0 R +/Parent 31 0 R +/Prev 207 0 R +/Next 215 0 R +>> endobj +207 0 obj << +/Title 208 0 R +/A 205 0 R +/Parent 31 0 R +/Prev 203 0 R +/Next 211 0 R +>> endobj +203 0 obj << +/Title 204 0 R +/A 201 0 R +/Parent 31 0 R +/Prev 199 0 R +/Next 207 0 R +>> endobj +199 0 obj << +/Title 200 0 R +/A 197 0 R +/Parent 31 0 R +/Prev 195 0 R +/Next 203 0 R +>> endobj +195 0 obj << +/Title 196 0 R +/A 193 0 R +/Parent 31 0 R +/Prev 191 0 R +/Next 199 0 R +>> endobj +191 0 obj << +/Title 192 0 R +/A 189 0 R +/Parent 31 0 R +/Prev 187 0 R +/Next 195 0 R +>> endobj +187 0 obj << +/Title 188 0 R +/A 185 0 R +/Parent 31 0 R +/Prev 183 0 R +/Next 191 0 R +>> endobj +183 0 obj << +/Title 184 0 R +/A 181 0 R +/Parent 31 0 R +/Prev 179 0 R +/Next 187 0 R +>> endobj +179 0 obj << +/Title 180 0 R +/A 177 0 R +/Parent 31 0 R +/Prev 175 0 R +/Next 183 0 R +>> endobj +175 0 obj << +/Title 176 0 R +/A 173 0 R +/Parent 31 0 R +/Prev 171 0 R +/Next 179 0 R +>> endobj +171 0 obj << +/Title 172 0 R +/A 169 0 R +/Parent 31 0 R +/Prev 167 0 R +/Next 175 0 R +>> endobj +167 0 obj << +/Title 168 0 R +/A 165 0 R +/Parent 31 0 R +/Prev 163 0 R +/Next 171 0 R +>> endobj +163 0 obj << +/Title 164 0 R +/A 161 0 R +/Parent 31 0 R +/Prev 159 0 R +/Next 167 0 R +>> endobj +159 0 obj << +/Title 160 0 R +/A 157 0 R +/Parent 31 0 R +/Prev 155 0 R +/Next 163 0 R +>> endobj +155 0 obj << +/Title 156 0 R +/A 153 0 R +/Parent 31 0 R +/Prev 151 0 R +/Next 159 0 R +>> endobj +151 0 obj << +/Title 152 0 R +/A 149 0 R +/Parent 31 0 R +/Prev 147 0 R +/Next 155 0 R +>> endobj +147 0 obj << +/Title 148 0 R +/A 145 0 R +/Parent 31 0 R +/Prev 143 0 R +/Next 151 0 R +>> endobj +143 0 obj << +/Title 144 0 R +/A 141 0 R +/Parent 31 0 R +/Prev 139 0 R +/Next 147 0 R +>> endobj +139 0 obj << +/Title 140 0 R +/A 137 0 R +/Parent 31 0 R +/Prev 135 0 R +/Next 143 0 R +>> endobj +135 0 obj << +/Title 136 0 R +/A 133 0 R +/Parent 31 0 R +/Prev 131 0 R +/Next 139 0 R +>> endobj +131 0 obj << +/Title 132 0 R +/A 129 0 R +/Parent 31 0 R +/Prev 127 0 R +/Next 135 0 R +>> endobj +127 0 obj << +/Title 128 0 R +/A 125 0 R +/Parent 31 0 R +/Prev 123 0 R +/Next 131 0 R +>> endobj +123 0 obj << +/Title 124 0 R +/A 121 0 R +/Parent 31 0 R +/Prev 119 0 R +/Next 127 0 R +>> endobj +119 0 obj << +/Title 120 0 R +/A 117 0 R +/Parent 31 0 R +/Prev 115 0 R +/Next 123 0 R +>> endobj +115 0 obj << +/Title 116 0 R +/A 113 0 R +/Parent 31 0 R +/Prev 111 0 R +/Next 119 0 R +>> endobj +111 0 obj << +/Title 112 0 R +/A 109 0 R +/Parent 31 0 R +/Prev 107 0 R +/Next 115 0 R +>> endobj +107 0 obj << +/Title 108 0 R +/A 105 0 R +/Parent 31 0 R +/Prev 103 0 R +/Next 111 0 R +>> endobj +103 0 obj << +/Title 104 0 R +/A 101 0 R +/Parent 31 0 R +/Prev 99 0 R +/Next 107 0 R +>> endobj +99 0 obj << +/Title 100 0 R +/A 97 0 R +/Parent 31 0 R +/Prev 95 0 R +/Next 103 0 R +>> endobj +95 0 obj << +/Title 96 0 R +/A 93 0 R +/Parent 31 0 R +/Prev 91 0 R +/Next 99 0 R +>> endobj +91 0 obj << +/Title 92 0 R +/A 89 0 R +/Parent 31 0 R +/Prev 87 0 R +/Next 95 0 R +>> endobj +87 0 obj << +/Title 88 0 R +/A 85 0 R +/Parent 31 0 R +/Prev 83 0 R +/Next 91 0 R +>> endobj +83 0 obj << +/Title 84 0 R +/A 81 0 R +/Parent 31 0 R +/Prev 79 0 R +/Next 87 0 R +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 31 0 R +/Prev 75 0 R +/Next 83 0 R +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 31 0 R +/Prev 71 0 R +/Next 79 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 31 0 R +/Prev 67 0 R +/Next 75 0 R +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 31 0 R +/Prev 63 0 R +/Next 71 0 R +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 31 0 R +/Prev 59 0 R +/Next 67 0 R +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 31 0 R +/Prev 55 0 R +/Next 63 0 R +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 31 0 R +/Prev 51 0 R +/Next 59 0 R +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 31 0 R +/Prev 47 0 R +/Next 55 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 31 0 R +/Prev 43 0 R +/Next 51 0 R +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 31 0 R +/Prev 39 0 R +/Next 47 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 31 0 R +/Prev 35 0 R +/Next 43 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 31 0 R +/Next 39 0 R +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 8032 0 R +/Prev 11 0 R +/First 35 0 R +/Last 503 0 R +/Count -118 +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 11 0 R +/Prev 23 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 11 0 R +/Prev 19 0 R +/Next 27 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 11 0 R +/Prev 15 0 R +/Next 23 0 R +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 8032 0 R +/Prev 7 0 R +/Next 31 0 R +/First 15 0 R +/Last 27 0 R +/Count -4 +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 8032 0 R +/Prev 3 0 R +/Next 11 0 R +>> endobj +3 0 obj << +/Title 4 0 R +/A 1 0 R +/Parent 8032 0 R +/Next 7 0 R +>> endobj +8033 0 obj << +/Names [(0:0) 511 0 R (0:100) 986 0 R (0:1000) 1915 0 R (0:1001) 1916 0 R (0:1002) 1917 0 R (0:1003) 1918 0 R (0:1004) 1919 0 R (0:1005) 1920 0 R (0:1006) 1921 0 R (0:1007) 1922 0 R (0:1008) 1923 0 R (0:1009) 1924 0 R (0:101) 987 0 R (0:1010) 1925 0 R (0:1011) 1926 0 R (0:1012) 1927 0 R (0:1013) 1928 0 R (0:1014) 1929 0 R (0:1015) 1930 0 R (0:1016) 1931 0 R (0:1017) 1932 0 R (0:1018) 1933 0 R (0:1019) 1934 0 R (0:102) 988 0 R (0:1020) 1935 0 R (0:1023) 1936 0 R (0:1024) 1937 0 R (0:1025) 1938 0 R (0:1026) 1939 0 R (0:1027) 1940 0 R (0:1028) 1941 0 R (0:1029) 1942 0 R (0:103) 989 0 R (0:1030) 1943 0 R (0:1031) 1948 0 R (0:1032) 1949 0 R (0:1033) 1950 0 R (0:1034) 1951 0 R (0:1035) 1952 0 R (0:1036) 1953 0 R (0:1037) 1954 0 R (0:1038) 1955 0 R (0:1039) 1956 0 R (0:1040) 1957 0 R (0:1041) 1958 0 R (0:1042) 1959 0 R (0:1043) 1960 0 R (0:1044) 1961 0 R (0:1045) 1962 0 R (0:1046) 1963 0 R (0:1047) 1964 0 R (0:1048) 1965 0 R (0:1049) 1966 0 R (0:1050) 1967 0 R (0:1051) 1968 0 R (0:1052) 1969 0 R (0:1053) 1970 0 R (0:1054) 1971 0 R (0:1055) 1972 0 R (0:1056) 1973 0 R (0:1057) 1974 0 R (0:1058) 1975 0 R (0:1059) 1976 0 R (0:106) 996 0 R (0:1060) 1977 0 R (0:1061) 1978 0 R (0:1062) 1979 0 R (0:1065) 1980 0 R (0:1066) 1981 0 R (0:1067) 1982 0 R (0:1068) 1983 0 R (0:1069) 1984 0 R (0:1070) 1985 0 R (0:1071) 1986 0 R (0:1072) 1987 0 R (0:1073) 1988 0 R (0:1074) 1989 0 R (0:1075) 1990 0 R (0:1076) 1995 0 R (0:1077) 1996 0 R (0:1078) 1997 0 R (0:1079) 1998 0 R (0:1080) 1999 0 R (0:1081) 2000 0 R (0:1082) 2001 0 R (0:1083) 2002 0 R (0:1084) 2003 0 R (0:1085) 2004 0 R (0:1086) 2005 0 R (0:1087) 2006 0 R (0:1088) 2007 0 R (0:1089) 2008 0 R (0:109) 997 0 R (0:1090) 2009 0 R (0:1091) 2010 0 R (0:1092) 2011 0 R (0:1093) 2012 0 R (0:1094) 2013 0 R (0:1095) 2014 0 R (0:1096) 2015 0 R (0:1097) 2016 0 R (0:1098) 2017 0 R (0:1099) 2018 0 R (0:110) 998 0 R (0:1100) 2019 0 R (0:1101) 2020 0 R (0:1102) 2021 0 R (0:1103) 2022 0 R (0:1104) 2023 0 R (0:1105) 2024 0 R (0:1106) 2025 0 R (0:1107) 2026 0 R (0:1108) 2027 0 R (0:1109) 2028 0 R (0:111) 999 0 R (0:1110) 2029 0 R (0:1111) 2030 0 R (0:1112) 2031 0 R (0:1113) 2032 0 R (0:1114) 2033 0 R (0:1115) 2034 0 R (0:1116) 2035 0 R (0:1117) 2036 0 R (0:1118) 2037 0 R (0:1119) 2038 0 R (0:112) 1000 0 R (0:1120) 2039 0 R (0:1121) 2040 0 R (0:1124) 2041 0 R (0:1125) 2042 0 R (0:1126) 2043 0 R (0:1127) 2044 0 R (0:1128) 2045 0 R (0:1129) 2046 0 R (0:113) 1001 0 R (0:1130) 2047 0 R (0:1131) 2048 0 R (0:1132) 2049 0 R (0:1133) 2050 0 R (0:1134) 2056 0 R (0:1135) 2057 0 R (0:1136) 2058 0 R (0:1137) 2059 0 R (0:1138) 2060 0 R (0:1139) 2061 0 R (0:114) 1002 0 R (0:1140) 2062 0 R (0:1141) 2063 0 R (0:1142) 2064 0 R (0:1143) 2065 0 R (0:1144) 2066 0 R (0:1145) 2067 0 R (0:1146) 2068 0 R (0:1147) 2069 0 R (0:1148) 2070 0 R (0:1149) 2071 0 R (0:115) 1003 0 R (0:1150) 2072 0 R (0:1151) 2073 0 R (0:1152) 2074 0 R (0:1153) 2075 0 R (0:1154) 2076 0 R (0:1155) 2077 0 R (0:1156) 2078 0 R (0:1157) 2079 0 R (0:1158) 2080 0 R (0:1159) 2081 0 R (0:116) 1004 0 R (0:1160) 2082 0 R (0:1161) 2083 0 R (0:1162) 2084 0 R (0:1163) 2085 0 R (0:1164) 2086 0 R (0:1165) 2087 0 R (0:1166) 2088 0 R (0:1167) 2089 0 R (0:1168) 2090 0 R (0:1169) 2091 0 R (0:117) 1005 0 R (0:1170) 2092 0 R (0:1171) 2093 0 R (0:1172) 2094 0 R (0:1173) 2095 0 R (0:1174) 2096 0 R (0:1175) 2097 0 R (0:1176) 2098 0 R (0:1177) 2099 0 R (0:1178) 2100 0 R (0:1179) 2101 0 R (0:118) 1006 0 R (0:1180) 2102 0 R (0:1183) 2103 0 R (0:1184) 2104 0 R (0:1185) 2105 0 R (0:1186) 2106 0 R (0:1187) 2107 0 R (0:1188) 2108 0 R (0:1189) 2109 0 R (0:119) 1007 0 R (0:1190) 2110 0 R (0:1191) 2111 0 R (0:1192) 2112 0 R (0:1193) 2119 0 R (0:1194) 2055 0 R (0:1195) 2120 0 R (0:1196) 2121 0 R (0:1197) 2122 0 R (0:1198) 2123 0 R (0:1199) 2124 0 R (0:120) 1008 0 R (0:1200) 2125 0 R (0:1201) 2126 0 R (0:1202) 2127 0 R (0:1203) 2128 0 R (0:1204) 2129 0 R (0:1205) 2130 0 R (0:1206) 2131 0 R (0:1207) 2132 0 R (0:1208) 2133 0 R (0:1209) 2134 0 R (0:121) 1009 0 R (0:1210) 2135 0 R (0:1211) 2136 0 R (0:1212) 2137 0 R (0:1213) 2138 0 R (0:1214) 2139 0 R (0:1215) 2140 0 R (0:1216) 2141 0 R (0:1217) 2142 0 R (0:1218) 2143 0 R (0:1219) 2144 0 R (0:122) 1010 0 R (0:1220) 2145 0 R (0:1221) 2146 0 R (0:1222) 2147 0 R (0:1223) 2148 0 R (0:1224) 2149 0 R (0:1225) 2150 0 R (0:1226) 2151 0 R (0:1227) 2152 0 R (0:1228) 2153 0 R (0:1229) 2154 0 R (0:123) 1011 0 R (0:1230) 2155 0 R (0:1231) 2156 0 R (0:1232) 2157 0 R (0:1233) 2158 0 R (0:1236) 2159 0 R (0:1237) 2160 0 R (0:1238) 2161 0 R (0:1239) 2162 0 R (0:124) 1012 0 R (0:1240) 2163 0 R (0:1241) 2164 0 R (0:1242) 2165 0 R (0:1243) 2166 0 R (0:1244) 2167 0 R (0:1245) 2118 0 R (0:1246) 2172 0 R (0:1247) 2173 0 R (0:1248) 2174 0 R (0:1249) 2175 0 R (0:125) 1013 0 R (0:1250) 2176 0 R (0:1251) 2177 0 R (0:1252) 2178 0 R (0:1253) 2179 0 R (0:1254) 2180 0 R (0:1255) 2181 0 R (0:1256) 2182 0 R (0:1257) 2183 0 R (0:1258) 2184 0 R (0:1259) 2185 0 R (0:126) 1014 0 R (0:1260) 2186 0 R (0:1261) 2187 0 R (0:1262) 2188 0 R (0:1263) 2189 0 R (0:1264) 2190 0 R (0:1265) 2191 0 R (0:1266) 2192 0 R (0:1267) 2193 0 R (0:1268) 2194 0 R (0:1269) 2195 0 R (0:127) 1015 0 R (0:1270) 2196 0 R (0:1271) 2197 0 R (0:1274) 2198 0 R (0:1275) 2199 0 R (0:1276) 2200 0 R (0:1277) 2201 0 R (0:1278) 2202 0 R (0:1279) 2203 0 R (0:128) 1016 0 R (0:1280) 2204 0 R (0:1281) 2205 0 R (0:1282) 2206 0 R (0:1283) 2207 0 R (0:1284) 2208 0 R (0:1285) 2209 0 R (0:1286) 2210 0 R (0:1287) 2211 0 R (0:1288) 2212 0 R (0:1289) 2213 0 R (0:129) 1017 0 R (0:1290) 2214 0 R (0:1291) 2215 0 R (0:1292) 2216 0 R (0:1293) 2217 0 R (0:1294) 2218 0 R (0:1295) 2219 0 R (0:1296) 2224 0 R (0:1297) 2225 0 R (0:1298) 2226 0 R (0:1299) 2227 0 R (0:13) 922 0 R (0:130) 1018 0 R (0:1302) 2228 0 R (0:1303) 2229 0 R (0:1304) 2230 0 R (0:1305) 2231 0 R (0:1306) 2232 0 R (0:1307) 2233 0 R (0:1308) 2234 0 R (0:1309) 2235 0 R (0:131) 1019 0 R (0:1310) 2236 0 R (0:1311) 2237 0 R (0:1312) 2238 0 R (0:1313) 2239 0 R (0:1314) 2240 0 R (0:1315) 2241 0 R (0:1316) 2242 0 R (0:1317) 2243 0 R (0:1318) 2244 0 R (0:1319) 2245 0 R (0:132) 1020 0 R (0:1320) 2246 0 R (0:1321) 2247 0 R (0:1322) 2248 0 R (0:1323) 2249 0 R (0:1324) 2250 0 R (0:1325) 2251 0 R (0:1326) 2252 0 R (0:1327) 2253 0 R (0:1328) 2254 0 R (0:1329) 2255 0 R (0:133) 1021 0 R (0:1330) 2256 0 R (0:1331) 2257 0 R (0:1332) 2258 0 R (0:1333) 2259 0 R (0:1334) 2260 0 R (0:1335) 2261 0 R (0:1336) 2262 0 R (0:1337) 2263 0 R (0:1338) 2264 0 R (0:1339) 2265 0 R (0:134) 1022 0 R (0:1340) 2266 0 R (0:1341) 2267 0 R (0:1342) 2268 0 R (0:1343) 2269 0 R (0:1344) 2270 0 R (0:1345) 2276 0 R (0:1348) 2277 0 R (0:1349) 2278 0 R (0:135) 1023 0 R (0:1350) 2279 0 R (0:1351) 2280 0 R (0:1352) 2281 0 R (0:1353) 2282 0 R (0:1354) 2283 0 R (0:1355) 2284 0 R (0:1356) 2285 0 R (0:1357) 2286 0 R (0:1358) 2287 0 R (0:1359) 2288 0 R (0:136) 1024 0 R (0:1360) 2289 0 R (0:1361) 2290 0 R (0:1362) 2291 0 R (0:1363) 2292 0 R (0:1364) 2293 0 R (0:1365) 2294 0 R (0:1366) 2295 0 R (0:1367) 2296 0 R (0:1368) 2297 0 R (0:1369) 2298 0 R (0:137) 1025 0 R (0:1370) 2299 0 R (0:1371) 2300 0 R (0:1372) 2301 0 R (0:1373) 2302 0 R (0:1374) 2303 0 R (0:1375) 2304 0 R (0:1376) 2305 0 R (0:1377) 2306 0 R (0:1378) 2307 0 R (0:1379) 2308 0 R (0:138) 1026 0 R (0:1380) 2309 0 R (0:1381) 2310 0 R (0:1382) 2311 0 R (0:1383) 2312 0 R (0:1384) 2313 0 R (0:1385) 2314 0 R (0:1386) 2315 0 R (0:1387) 2316 0 R (0:139) 1027 0 R (0:1390) 2321 0 R (0:1391) 2322 0 R (0:1392) 2323 0 R (0:1393) 2275 0 R (0:1396) 2324 0 R (0:1397) 2325 0 R (0:1398) 2326 0 R (0:1399) 2327 0 R (0:14) 926 0 R (0:140) 1028 0 R (0:1400) 2328 0 R (0:1401) 2329 0 R (0:1402) 2330 0 R (0:1403) 2331 0 R (0:1404) 2332 0 R (0:1405) 2333 0 R (0:1406) 2334 0 R (0:1407) 2335 0 R (0:1408) 2336 0 R (0:1409) 2337 0 R (0:141) 1029 0 R (0:1410) 2338 0 R (0:1411) 2339 0 R (0:1414) 2340 0 R (0:1415) 2341 0 R (0:1416) 2342 0 R (0:1417) 2343 0 R (0:1418) 2344 0 R (0:1419) 2345 0 R (0:1420) 2346 0 R (0:1421) 2347 0 R (0:1422) 2348 0 R (0:1423) 2349 0 R (0:1424) 2350 0 R (0:1425) 2355 0 R (0:1426) 2356 0 R (0:1427) 2357 0 R (0:1428) 2358 0 R (0:1429) 2359 0 R (0:1430) 2360 0 R (0:1431) 2361 0 R (0:1432) 2362 0 R (0:1433) 2363 0 R (0:1434) 2364 0 R (0:1435) 2365 0 R (0:1436) 2366 0 R (0:1437) 2367 0 R (0:1438) 2368 0 R (0:1439) 2369 0 R (0:144) 1030 0 R (0:1440) 2370 0 R (0:1443) 2371 0 R (0:1444) 2372 0 R (0:1445) 2373 0 R (0:1446) 2374 0 R (0:1447) 2375 0 R (0:1448) 2376 0 R (0:1449) 2377 0 R (0:145) 1031 0 R (0:1450) 2378 0 R (0:1451) 2379 0 R (0:1452) 2380 0 R (0:1453) 2381 0 R (0:1454) 2382 0 R (0:1455) 2383 0 R (0:1456) 2384 0 R (0:1457) 2385 0 R (0:1458) 2386 0 R (0:1459) 2387 0 R (0:146) 1032 0 R (0:1460) 2388 0 R (0:1461) 2389 0 R (0:1462) 2390 0 R (0:1463) 2391 0 R (0:1464) 2392 0 R (0:1465) 2393 0 R (0:1466) 2394 0 R (0:1467) 2395 0 R (0:1468) 2396 0 R (0:1469) 2397 0 R (0:147) 1038 0 R (0:1470) 2398 0 R (0:1471) 2399 0 R (0:1472) 2400 0 R (0:1473) 2401 0 R (0:1474) 2402 0 R (0:1475) 2403 0 R (0:1476) 2404 0 R (0:1477) 2405 0 R (0:1478) 2406 0 R (0:1479) 2407 0 R (0:148) 1039 0 R (0:1480) 2408 0 R (0:1481) 2409 0 R (0:1482) 2410 0 R (0:1483) 2411 0 R (0:1484) 2412 0 R (0:1485) 2413 0 R (0:1486) 2414 0 R (0:1487) 2415 0 R (0:1488) 2416 0 R (0:1489) 2422 0 R (0:149) 1040 0 R (0:1490) 2423 0 R (0:1491) 2424 0 R (0:1492) 2425 0 R (0:1493) 2426 0 R (0:1494) 2427 0 R (0:1495) 2428 0 R (0:1496) 2429 0 R (0:1497) 2430 0 R (0:1498) 2431 0 R (0:1499) 2432 0 R (0:15) 927 0 R (0:150) 1041 0 R (0:1500) 2433 0 R (0:1501) 2434 0 R (0:1502) 2435 0 R (0:1503) 2436 0 R (0:1504) 2437 0 R (0:1505) 2438 0 R (0:1506) 2439 0 R (0:1507) 2440 0 R (0:1508) 2441 0 R (0:1509) 2442 0 R (0:151) 1042 0 R (0:1510) 2443 0 R (0:1511) 2444 0 R (0:1512) 2445 0 R (0:1513) 2446 0 R (0:1514) 2447 0 R (0:1515) 2448 0 R (0:1516) 2449 0 R (0:1517) 2450 0 R (0:1518) 2451 0 R (0:1519) 2452 0 R (0:152) 1043 0 R (0:1520) 2453 0 R (0:1521) 2454 0 R (0:1522) 2455 0 R (0:1523) 2456 0 R (0:1524) 2457 0 R (0:1525) 2458 0 R (0:1526) 2459 0 R (0:1527) 2460 0 R (0:1528) 2461 0 R (0:1529) 2462 0 R (0:153) 1044 0 R (0:1530) 2463 0 R (0:1531) 2464 0 R (0:1532) 2465 0 R (0:1535) 2466 0 R (0:1536) 2467 0 R (0:1537) 2468 0 R (0:1538) 2469 0 R (0:1539) 2470 0 R (0:154) 1045 0 R (0:1540) 2471 0 R (0:1541) 2472 0 R (0:1542) 2473 0 R (0:1543) 2474 0 R (0:1544) 2475 0 R (0:1545) 2476 0 R (0:1546) 2477 0 R (0:1547) 2478 0 R (0:1548) 2479 0 R (0:1549) 2480 0 R (0:155) 1046 0 R (0:1550) 2481 0 R (0:1551) 2482 0 R (0:1552) 2483 0 R (0:1553) 2484 0 R (0:1554) 2485 0 R (0:1555) 2490 0 R (0:1556) 2491 0 R (0:1557) 2492 0 R (0:1558) 2493 0 R (0:1559) 2494 0 R (0:156) 1047 0 R (0:1560) 2495 0 R (0:1561) 2496 0 R (0:1562) 2497 0 R (0:1563) 2498 0 R (0:1564) 2499 0 R (0:1565) 2500 0 R (0:1566) 2501 0 R (0:1567) 2502 0 R (0:1568) 2503 0 R (0:1569) 2504 0 R (0:157) 1048 0 R (0:1570) 2505 0 R (0:1571) 2506 0 R (0:1572) 2507 0 R (0:1573) 2508 0 R (0:1574) 2509 0 R (0:1575) 2510 0 R (0:1578) 2511 0 R (0:1579) 2512 0 R (0:158) 1049 0 R (0:1580) 2513 0 R (0:1581) 2514 0 R (0:1582) 2515 0 R (0:1583) 2516 0 R (0:1584) 2517 0 R (0:1585) 2518 0 R (0:1586) 2519 0 R (0:1587) 2520 0 R (0:1588) 2521 0 R (0:1589) 2522 0 R (0:159) 1050 0 R (0:1590) 2523 0 R (0:1591) 2524 0 R (0:1592) 2525 0 R (0:1593) 2526 0 R (0:1594) 2527 0 R (0:1595) 2528 0 R (0:1596) 2529 0 R (0:1597) 2530 0 R (0:1598) 2531 0 R (0:1599) 2532 0 R (0:16) 928 0 R (0:160) 1051 0 R (0:1600) 2533 0 R (0:1601) 2534 0 R (0:1602) 2535 0 R (0:1603) 2536 0 R (0:1604) 2537 0 R (0:1605) 2538 0 R (0:1606) 2539 0 R (0:1607) 2540 0 R (0:1608) 2541 0 R (0:1609) 2542 0 R (0:161) 1052 0 R (0:1610) 2543 0 R (0:1611) 2544 0 R (0:1612) 2545 0 R (0:1613) 2546 0 R (0:1614) 2547 0 R (0:1615) 2553 0 R (0:1616) 2554 0 R (0:1617) 2555 0 R (0:1618) 2556 0 R (0:1619) 2557 0 R (0:162) 1053 0 R (0:1620) 2558 0 R (0:1621) 2559 0 R (0:1622) 2560 0 R (0:1623) 2561 0 R (0:1624) 2562 0 R (0:1625) 2563 0 R (0:1626) 2564 0 R (0:1627) 2565 0 R (0:1628) 2566 0 R (0:1629) 2567 0 R (0:163) 1054 0 R (0:1630) 2568 0 R (0:1631) 2569 0 R (0:1632) 2570 0 R (0:1633) 2571 0 R (0:1634) 2572 0 R (0:1635) 2573 0 R (0:1636) 2574 0 R (0:1637) 2575 0 R (0:1638) 2576 0 R (0:1639) 2577 0 R (0:164) 1055 0 R (0:1640) 2578 0 R (0:1641) 2579 0 R (0:1642) 2580 0 R (0:1643) 2581 0 R (0:1644) 2582 0 R (0:1647) 2583 0 R (0:1648) 2584 0 R (0:1649) 2585 0 R (0:165) 1056 0 R (0:1650) 2586 0 R (0:1651) 2587 0 R (0:1652) 2588 0 R (0:1653) 2589 0 R (0:1654) 2590 0 R (0:1655) 2591 0 R (0:1656) 2592 0 R (0:1657) 2593 0 R (0:1658) 2594 0 R (0:1659) 2595 0 R (0:166) 1057 0 R (0:1660) 2596 0 R (0:1661) 2597 0 R (0:1662) 2598 0 R (0:1663) 2599 0 R (0:1664) 2600 0 R (0:1665) 2601 0 R (0:1666) 2602 0 R (0:1667) 2603 0 R (0:1668) 2609 0 R (0:1669) 2610 0 R (0:167) 1058 0 R (0:1670) 2552 0 R (0:1671) 2611 0 R (0:1672) 2612 0 R (0:1673) 2613 0 R (0:1676) 2614 0 R (0:1677) 2615 0 R (0:1678) 2616 0 R (0:1679) 2617 0 R (0:168) 1059 0 R (0:1680) 2618 0 R (0:1681) 2619 0 R (0:1682) 2620 0 R (0:1683) 2621 0 R (0:1684) 2622 0 R (0:1685) 2623 0 R (0:1686) 2624 0 R (0:1687) 2625 0 R (0:1688) 2626 0 R (0:1689) 2627 0 R (0:169) 1060 0 R (0:1690) 2628 0 R (0:1691) 2629 0 R (0:1692) 2630 0 R (0:1693) 2631 0 R (0:1694) 2632 0 R (0:1695) 2633 0 R (0:1696) 2634 0 R (0:1697) 2635 0 R (0:1698) 2636 0 R (0:1699) 2637 0 R (0:170) 1061 0 R (0:1700) 2638 0 R (0:1701) 2639 0 R (0:1702) 2640 0 R (0:1703) 2641 0 R (0:1704) 2642 0 R (0:1705) 2643 0 R (0:1706) 2644 0 R (0:1707) 2645 0 R (0:1708) 2646 0 R (0:1709) 2647 0 R (0:171) 1062 0 R (0:1710) 2648 0 R (0:1713) 2654 0 R (0:1714) 2655 0 R (0:1715) 2656 0 R (0:1716) 2608 0 R (0:1719) 2657 0 R (0:172) 1063 0 R (0:1720) 2658 0 R (0:1721) 2659 0 R (0:1722) 2660 0 R (0:1723) 2661 0 R (0:1724) 2662 0 R (0:1725) 2663 0 R (0:1726) 2664 0 R (0:1727) 2665 0 R (0:1728) 2666 0 R (0:1729) 2667 0 R (0:173) 1064 0 R (0:1730) 2668 0 R (0:1731) 2669 0 R (0:1732) 2670 0 R (0:1733) 2671 0 R (0:1734) 2672 0 R (0:1735) 2673 0 R (0:1736) 2674 0 R (0:1737) 2675 0 R (0:1738) 2676 0 R (0:1739) 2677 0 R (0:174) 1065 0 R (0:1740) 2678 0 R (0:1741) 2679 0 R (0:1742) 2680 0 R (0:1743) 2681 0 R (0:1746) 2682 0 R (0:1747) 2683 0 R (0:1748) 2684 0 R (0:1749) 2685 0 R (0:175) 1066 0 R (0:1750) 2686 0 R (0:1751) 2687 0 R (0:1752) 2692 0 R (0:1753) 2653 0 R (0:1754) 2693 0 R (0:1755) 2694 0 R (0:1756) 2695 0 R (0:1757) 2696 0 R (0:1758) 2697 0 R (0:1759) 2698 0 R (0:176) 1067 0 R (0:1760) 2699 0 R (0:1761) 2700 0 R (0:1762) 2701 0 R (0:1763) 2702 0 R (0:1764) 2703 0 R (0:1765) 2704 0 R (0:1766) 2705 0 R (0:1767) 2706 0 R (0:1768) 2707 0 R (0:1769) 2708 0 R (0:177) 1068 0 R (0:1770) 2709 0 R (0:1771) 2710 0 R (0:1772) 2711 0 R (0:1775) 2712 0 R (0:1776) 2713 0 R (0:1777) 2714 0 R (0:1778) 2715 0 R (0:1779) 2716 0 R (0:178) 1069 0 R (0:1780) 2717 0 R (0:1781) 2718 0 R (0:1782) 2719 0 R (0:1783) 2720 0 R (0:1784) 2721 0 R (0:1785) 2722 0 R (0:1786) 2723 0 R (0:1787) 2724 0 R (0:1788) 2725 0 R (0:1789) 2726 0 R (0:1790) 2727 0 R (0:1791) 2728 0 R (0:1792) 2729 0 R (0:1793) 2730 0 R (0:1794) 2731 0 R (0:1795) 2732 0 R (0:1796) 2733 0 R (0:1797) 2734 0 R (0:1798) 2740 0 R (0:1799) 2741 0 R (0:18) 930 0 R (0:1800) 2742 0 R (0:1801) 2743 0 R (0:1802) 2744 0 R (0:1803) 2745 0 R (0:1804) 2746 0 R (0:1805) 2747 0 R (0:1806) 2748 0 R (0:1807) 2749 0 R (0:1808) 2750 0 R (0:181) 1070 0 R (0:1811) 2751 0 R (0:1812) 2752 0 R (0:1813) 2753 0 R (0:1814) 2754 0 R (0:1815) 2755 0 R (0:1816) 2756 0 R (0:1817) 2757 0 R (0:1818) 2758 0 R (0:1819) 2759 0 R (0:182) 1071 0 R (0:1820) 2760 0 R (0:1821) 2761 0 R (0:1822) 2762 0 R (0:1823) 2763 0 R (0:1824) 2764 0 R (0:1825) 2765 0 R (0:1826) 2766 0 R (0:1827) 2767 0 R (0:1828) 2768 0 R (0:1829) 2769 0 R (0:183) 1072 0 R (0:1830) 2770 0 R (0:1831) 2771 0 R (0:1832) 2772 0 R (0:1833) 2773 0 R (0:1834) 2774 0 R (0:1835) 2775 0 R (0:1836) 2776 0 R (0:1837) 2777 0 R (0:1838) 2778 0 R (0:1839) 2779 0 R (0:184) 1073 0 R (0:1840) 2780 0 R (0:1841) 2781 0 R (0:1842) 2782 0 R (0:1843) 2783 0 R (0:1844) 2784 0 R (0:1847) 2790 0 R (0:1848) 2791 0 R (0:1849) 2792 0 R (0:185) 1074 0 R (0:1850) 2793 0 R (0:1851) 2794 0 R (0:1852) 2795 0 R (0:1853) 2796 0 R (0:1854) 2797 0 R (0:1855) 2798 0 R (0:1856) 2799 0 R (0:1857) 2800 0 R (0:1858) 2801 0 R (0:1859) 2802 0 R (0:186) 1075 0 R (0:1860) 2803 0 R (0:1861) 2804 0 R (0:1862) 2805 0 R (0:1863) 2806 0 R (0:1864) 2807 0 R (0:1865) 2808 0 R (0:1866) 2809 0 R (0:1867) 2810 0 R (0:1868) 2811 0 R (0:1869) 2812 0 R (0:187) 1076 0 R (0:1870) 2813 0 R (0:1871) 2814 0 R (0:1874) 2815 0 R (0:1875) 2816 0 R (0:1876) 2817 0 R (0:1877) 2818 0 R (0:1878) 2819 0 R (0:1879) 2820 0 R (0:188) 1077 0 R (0:1880) 2821 0 R (0:1881) 2822 0 R (0:1882) 2823 0 R (0:1883) 2824 0 R (0:1884) 2829 0 R (0:1885) 2789 0 R (0:1886) 2830 0 R (0:1887) 2831 0 R (0:1888) 2832 0 R (0:1889) 2833 0 R (0:189) 1078 0 R (0:1890) 2834 0 R (0:1891) 2835 0 R (0:1892) 2836 0 R (0:1893) 2837 0 R (0:1894) 2838 0 R (0:1895) 2839 0 R (0:1896) 2840 0 R (0:1897) 2841 0 R (0:1898) 2842 0 R (0:1899) 2843 0 R (0:19) 931 0 R (0:190) 1083 0 R (0:1900) 2844 0 R (0:1903) 2845 0 R (0:1904) 2846 0 R (0:1905) 2847 0 R (0:1906) 2848 0 R (0:1907) 2849 0 R (0:1908) 2850 0 R (0:1909) 2851 0 R (0:191) 1037 0 R (0:1910) 2852 0 R (0:1911) 2853 0 R (0:1912) 2854 0 R (0:1913) 2855 0 R (0:1914) 2856 0 R (0:1915) 2857 0 R (0:1916) 2858 0 R (0:1917) 2859 0 R (0:1918) 2860 0 R (0:1919) 2861 0 R (0:192) 1084 0 R (0:1920) 2862 0 R (0:1921) 2863 0 R (0:1922) 2864 0 R (0:1923) 2865 0 R (0:1924) 2866 0 R (0:1925) 2867 0 R (0:1926) 2868 0 R (0:1927) 2869 0 R (0:1928) 2870 0 R (0:1929) 2871 0 R (0:193) 1085 0 R (0:1932) 2876 0 R (0:1933) 2877 0 R (0:1934) 2878 0 R (0:1935) 2879 0 R (0:1936) 2880 0 R (0:1937) 2881 0 R (0:1938) 2882 0 R (0:1939) 2883 0 R (0:194) 1086 0 R (0:1940) 2884 0 R (0:1941) 2885 0 R (0:1942) 2886 0 R (0:1943) 2887 0 R (0:1944) 2888 0 R (0:1945) 2889 0 R (0:1946) 2890 0 R (0:1947) 2891 0 R (0:1948) 2892 0 R (0:1949) 2893 0 R (0:195) 1087 0 R (0:1950) 2894 0 R (0:1951) 2895 0 R (0:1952) 2896 0 R (0:1953) 2897 0 R (0:1954) 2898 0 R (0:1955) 2899 0 R (0:1956) 2900 0 R (0:1957) 2901 0 R (0:196) 1088 0 R (0:1960) 2902 0 R (0:1961) 2903 0 R (0:1962) 2904 0 R (0:1963) 2905 0 R (0:1964) 2906 0 R (0:1965) 2907 0 R (0:1966) 2908 0 R (0:1967) 2909 0 R (0:1968) 2914 0 R (0:1969) 2915 0 R (0:197) 1089 0 R (0:1970) 2916 0 R (0:1971) 2917 0 R (0:1972) 2918 0 R (0:1973) 2919 0 R (0:1974) 2920 0 R (0:1975) 2921 0 R (0:1976) 2922 0 R (0:1977) 2923 0 R (0:1978) 2924 0 R (0:1979) 2925 0 R (0:198) 1090 0 R (0:1980) 2926 0 R (0:1981) 2927 0 R (0:1982) 2928 0 R (0:1983) 2929 0 R (0:1984) 2930 0 R (0:1985) 2931 0 R (0:1986) 2932 0 R (0:1989) 2933 0 R (0:199) 1091 0 R (0:1990) 2934 0 R (0:1991) 2935 0 R (0:1992) 2936 0 R (0:1993) 2937 0 R (0:1994) 2938 0 R (0:1995) 2939 0 R (0:1996) 2940 0 R (0:1997) 2941 0 R (0:1998) 2942 0 R (0:1999) 2943 0 R (0:200) 1092 0 R (0:2000) 2944 0 R (0:2001) 2945 0 R (0:2002) 2946 0 R (0:2003) 2947 0 R (0:2004) 2948 0 R (0:2005) 2949 0 R (0:2006) 2950 0 R (0:2007) 2951 0 R (0:2008) 2952 0 R (0:2009) 2953 0 R (0:201) 1093 0 R (0:2010) 2954 0 R (0:2011) 2955 0 R (0:2012) 2956 0 R (0:2013) 2957 0 R (0:2014) 2958 0 R (0:2015) 2964 0 R (0:2018) 2965 0 R (0:2019) 2966 0 R (0:202) 1094 0 R (0:2020) 2967 0 R (0:2021) 2968 0 R (0:2022) 2969 0 R (0:2023) 2970 0 R (0:2024) 2971 0 R (0:2025) 2972 0 R (0:2026) 2973 0 R (0:2027) 2974 0 R (0:2028) 2975 0 R (0:2029) 2976 0 R (0:203) 1095 0 R (0:2030) 2977 0 R (0:2031) 2978 0 R (0:2032) 2979 0 R (0:2033) 2980 0 R (0:2034) 2981 0 R (0:2035) 2982 0 R (0:2036) 2983 0 R (0:2037) 2984 0 R (0:2038) 2985 0 R (0:2039) 2986 0 R (0:204) 1096 0 R (0:2040) 2987 0 R (0:2041) 2988 0 R (0:2042) 2989 0 R (0:2043) 2990 0 R (0:2044) 2991 0 R (0:2045) 2992 0 R (0:2046) 2993 0 R (0:2047) 2994 0 R (0:2048) 2995 0 R (0:2049) 2996 0 R (0:205) 1097 0 R (0:2050) 2997 0 R (0:2051) 2998 0 R (0:2052) 2999 0 R (0:2053) 3000 0 R (0:2054) 3001 0 R (0:2055) 3002 0 R (0:2056) 3003 0 R (0:2059) 3010 0 R (0:206) 1098 0 R (0:2060) 3011 0 R (0:2061) 3012 0 R (0:2062) 2963 0 R (0:2065) 3013 0 R (0:2066) 3014 0 R (0:2067) 3015 0 R (0:2068) 3016 0 R (0:2069) 3017 0 R (0:2070) 3018 0 R (0:2071) 3019 0 R (0:2072) 3020 0 R (0:2073) 3021 0 R (0:2074) 3022 0 R (0:2075) 3023 0 R (0:2076) 3024 0 R (0:2077) 3025 0 R (0:2078) 3026 0 R (0:2079) 3027 0 R (0:2080) 3028 0 R (0:2081) 3029 0 R (0:2082) 3030 0 R (0:2083) 3031 0 R (0:2084) 3032 0 R (0:2085) 3033 0 R (0:2086) 3034 0 R (0:2087) 3035 0 R (0:2088) 3036 0 R (0:2089) 3037 0 R (0:209) 1099 0 R (0:2090) 3038 0 R (0:2091) 3039 0 R (0:2092) 3040 0 R (0:2093) 3041 0 R (0:2096) 3042 0 R (0:2097) 3043 0 R (0:2098) 3044 0 R (0:2099) 3045 0 R (0:210) 1100 0 R (0:2100) 3046 0 R (0:2101) 3051 0 R (0:2102) 3009 0 R (0:2103) 3052 0 R (0:2104) 3053 0 R (0:2105) 3054 0 R (0:2106) 3055 0 R (0:2107) 3056 0 R (0:2108) 3057 0 R (0:2109) 3058 0 R (0:211) 1101 0 R (0:2110) 3059 0 R (0:2111) 3060 0 R (0:2112) 3061 0 R (0:2113) 3062 0 R (0:2114) 3063 0 R (0:2115) 3064 0 R (0:2116) 3065 0 R (0:2117) 3066 0 R (0:2118) 3067 0 R (0:2119) 3068 0 R (0:212) 1102 0 R (0:2120) 3069 0 R (0:2121) 3070 0 R (0:2122) 3071 0 R (0:2123) 3072 0 R (0:2124) 3073 0 R (0:2125) 3074 0 R (0:2126) 3075 0 R (0:2127) 3076 0 R (0:213) 1103 0 R (0:2130) 3077 0 R (0:2131) 3078 0 R (0:2132) 3079 0 R (0:2133) 3080 0 R (0:2134) 3081 0 R (0:2135) 3082 0 R (0:2136) 3083 0 R (0:2137) 3084 0 R (0:2138) 3085 0 R (0:2139) 3086 0 R (0:214) 1104 0 R (0:2140) 3087 0 R (0:2141) 3092 0 R (0:2142) 3093 0 R (0:2143) 3094 0 R (0:2144) 3095 0 R (0:2145) 3096 0 R (0:2146) 3097 0 R (0:2147) 3098 0 R (0:2148) 3099 0 R (0:2149) 3100 0 R (0:215) 1105 0 R (0:2150) 3101 0 R (0:2151) 3102 0 R (0:2152) 3103 0 R (0:2153) 3104 0 R (0:2154) 3105 0 R (0:2155) 3106 0 R (0:2156) 3107 0 R (0:2159) 3108 0 R (0:216) 1106 0 R (0:2160) 3109 0 R (0:2161) 3110 0 R (0:2162) 3111 0 R (0:2163) 3112 0 R (0:2164) 3113 0 R (0:2165) 3114 0 R (0:2166) 3115 0 R (0:2167) 3116 0 R (0:2168) 3117 0 R (0:2169) 3118 0 R (0:217) 1107 0 R (0:2170) 3119 0 R (0:2171) 3120 0 R (0:2172) 3121 0 R (0:2173) 3122 0 R (0:2174) 3123 0 R (0:2175) 3124 0 R (0:2176) 3125 0 R (0:2177) 3126 0 R (0:2178) 3127 0 R (0:2179) 3128 0 R (0:218) 1108 0 R (0:2180) 3129 0 R (0:2181) 3130 0 R (0:2182) 3131 0 R (0:2183) 3132 0 R (0:2184) 3133 0 R (0:2185) 3134 0 R (0:2186) 3135 0 R (0:2187) 3136 0 R (0:2188) 3137 0 R (0:2189) 3138 0 R (0:219) 1109 0 R (0:2190) 3144 0 R (0:2193) 3145 0 R (0:2194) 3146 0 R (0:2195) 3147 0 R (0:2196) 3148 0 R (0:2197) 3149 0 R (0:2198) 3150 0 R (0:2199) 3151 0 R (0:220) 1110 0 R (0:2200) 3152 0 R (0:2201) 3153 0 R (0:2202) 3154 0 R (0:2203) 3155 0 R (0:2204) 3156 0 R (0:2205) 3157 0 R (0:2206) 3158 0 R (0:2207) 3159 0 R (0:2208) 3160 0 R (0:2209) 3161 0 R (0:221) 1111 0 R (0:2210) 3162 0 R (0:2211) 3163 0 R (0:2212) 3164 0 R (0:2213) 3165 0 R (0:2214) 3166 0 R (0:2215) 3167 0 R (0:2216) 3168 0 R (0:2217) 3169 0 R (0:2218) 3170 0 R (0:2219) 3171 0 R (0:222) 1112 0 R (0:2222) 3172 0 R (0:2223) 3173 0 R (0:2224) 3174 0 R (0:2225) 3175 0 R (0:2226) 3176 0 R (0:2227) 3181 0 R (0:2228) 3143 0 R (0:2229) 3182 0 R (0:223) 1113 0 R (0:2230) 3183 0 R (0:2231) 3184 0 R (0:2232) 3185 0 R (0:2233) 3186 0 R (0:2234) 3187 0 R (0:2235) 3188 0 R (0:2236) 3189 0 R (0:2237) 3190 0 R (0:2238) 3191 0 R (0:2239) 3192 0 R (0:224) 1114 0 R (0:2240) 3193 0 R (0:2241) 3194 0 R (0:2242) 3195 0 R (0:2243) 3196 0 R (0:2244) 3197 0 R (0:2245) 3198 0 R (0:2246) 3199 0 R (0:2247) 3200 0 R (0:2248) 3201 0 R (0:2249) 3202 0 R (0:225) 1115 0 R (0:2250) 3203 0 R (0:2251) 3204 0 R (0:2252) 3205 0 R (0:2255) 3206 0 R (0:2256) 3207 0 R (0:2257) 3208 0 R (0:2258) 3209 0 R (0:2259) 3210 0 R (0:226) 1116 0 R (0:2260) 3211 0 R (0:2261) 3212 0 R (0:2262) 3213 0 R (0:2263) 3214 0 R (0:2264) 3215 0 R (0:2265) 3216 0 R (0:2266) 3217 0 R (0:2267) 3218 0 R (0:2268) 3219 0 R (0:2269) 3220 0 R (0:227) 1117 0 R (0:2270) 3221 0 R (0:2271) 3222 0 R (0:2272) 3227 0 R (0:2273) 3228 0 R (0:2274) 3229 0 R (0:2275) 3230 0 R (0:2276) 3231 0 R (0:2277) 3232 0 R (0:2278) 3233 0 R (0:2279) 3234 0 R (0:228) 1118 0 R (0:2280) 3235 0 R (0:2281) 3236 0 R (0:2282) 3237 0 R (0:2283) 3238 0 R (0:2284) 3239 0 R (0:2285) 3240 0 R (0:2286) 3241 0 R (0:2287) 3242 0 R (0:2288) 3243 0 R (0:2289) 3244 0 R (0:229) 1119 0 R (0:2290) 3245 0 R (0:2291) 3246 0 R (0:2292) 3247 0 R (0:2293) 3248 0 R (0:2296) 3249 0 R (0:2297) 3250 0 R (0:2298) 3251 0 R (0:2299) 3252 0 R (0:230) 1120 0 R (0:2300) 3253 0 R (0:2301) 3254 0 R (0:2302) 3255 0 R (0:2303) 3256 0 R (0:2304) 3257 0 R (0:2305) 3258 0 R (0:2306) 3259 0 R (0:2307) 3260 0 R (0:2308) 3261 0 R (0:2309) 3262 0 R (0:231) 1121 0 R (0:2310) 3263 0 R (0:2311) 3264 0 R (0:2312) 3265 0 R (0:2313) 3266 0 R (0:2314) 3267 0 R (0:2315) 3268 0 R (0:2316) 3269 0 R (0:2317) 3270 0 R (0:2318) 3271 0 R (0:2319) 3272 0 R (0:232) 1122 0 R (0:2320) 3273 0 R (0:2321) 3274 0 R (0:2322) 3280 0 R (0:2323) 3281 0 R (0:2324) 3282 0 R (0:2325) 3283 0 R (0:2326) 3284 0 R (0:2327) 3285 0 R (0:2328) 3286 0 R (0:2329) 3287 0 R (0:233) 1123 0 R (0:2330) 3288 0 R (0:2331) 3289 0 R (0:2332) 3290 0 R (0:2333) 3291 0 R (0:2334) 3292 0 R (0:2337) 3293 0 R (0:2338) 3294 0 R (0:2339) 3295 0 R (0:234) 1124 0 R (0:2340) 3296 0 R (0:2341) 3297 0 R (0:2342) 3298 0 R (0:2343) 3299 0 R (0:2344) 3300 0 R (0:2345) 3301 0 R (0:2346) 3302 0 R (0:2347) 3303 0 R (0:2348) 3304 0 R (0:2349) 3305 0 R (0:235) 1125 0 R (0:2350) 3306 0 R (0:2351) 3307 0 R (0:2352) 3308 0 R (0:2353) 3309 0 R (0:2354) 3310 0 R (0:2355) 3311 0 R (0:2356) 3312 0 R (0:2357) 3313 0 R (0:2358) 3314 0 R (0:2359) 3315 0 R (0:236) 1126 0 R (0:2360) 3316 0 R (0:2361) 3317 0 R (0:2362) 3318 0 R (0:2363) 3319 0 R (0:2364) 3320 0 R (0:2365) 3326 0 R (0:2366) 3327 0 R (0:2367) 3328 0 R (0:2368) 3329 0 R (0:237) 1127 0 R (0:2371) 3330 0 R (0:2372) 3331 0 R (0:2373) 3332 0 R (0:2374) 3333 0 R (0:2375) 3334 0 R (0:2376) 3335 0 R (0:2377) 3336 0 R (0:2378) 3337 0 R (0:2379) 3338 0 R (0:238) 1128 0 R (0:2380) 3339 0 R (0:2381) 3340 0 R (0:2382) 3341 0 R (0:2383) 3342 0 R (0:2384) 3343 0 R (0:2385) 3344 0 R (0:2386) 3345 0 R (0:2387) 3346 0 R (0:2388) 3347 0 R (0:2389) 3348 0 R (0:239) 1129 0 R (0:2390) 3349 0 R (0:2391) 3350 0 R (0:2392) 3351 0 R (0:2393) 3352 0 R (0:2394) 3353 0 R (0:2395) 3354 0 R (0:2396) 3355 0 R (0:2397) 3356 0 R (0:2398) 3357 0 R (0:2399) 3358 0 R (0:240) 1130 0 R (0:2400) 3359 0 R (0:2401) 3360 0 R (0:2402) 3361 0 R (0:2403) 3362 0 R (0:2404) 3363 0 R (0:2405) 3364 0 R (0:2406) 3365 0 R (0:2407) 3366 0 R (0:2408) 3367 0 R (0:2409) 3368 0 R (0:241) 1131 0 R (0:2410) 3369 0 R (0:2413) 3375 0 R (0:2414) 3376 0 R (0:2415) 3377 0 R (0:2416) 3325 0 R (0:2419) 3378 0 R (0:242) 1132 0 R (0:2420) 3379 0 R (0:2421) 3380 0 R (0:2422) 3381 0 R (0:2423) 3382 0 R (0:2424) 3383 0 R (0:2425) 3384 0 R (0:2426) 3385 0 R (0:2427) 3386 0 R (0:2428) 3387 0 R (0:2429) 3388 0 R (0:243) 1133 0 R (0:2430) 3389 0 R (0:2431) 3390 0 R (0:2432) 3391 0 R (0:2433) 3392 0 R (0:2434) 3393 0 R (0:2435) 3394 0 R (0:2436) 3395 0 R (0:2437) 3396 0 R (0:2438) 3397 0 R (0:2439) 3398 0 R (0:244) 1134 0 R (0:2440) 3399 0 R (0:2441) 3400 0 R (0:2442) 3401 0 R (0:2443) 3402 0 R (0:2444) 3403 0 R (0:2447) 3404 0 R (0:2448) 3405 0 R (0:2449) 3406 0 R (0:245) 1140 0 R (0:2450) 3407 0 R (0:2451) 3408 0 R (0:2452) 3413 0 R (0:2453) 3374 0 R (0:2454) 3414 0 R (0:2455) 3415 0 R (0:2456) 3416 0 R (0:2457) 3417 0 R (0:2458) 3418 0 R (0:2459) 3419 0 R (0:246) 1141 0 R (0:2460) 3420 0 R (0:2461) 3421 0 R (0:2462) 3422 0 R (0:2463) 3423 0 R (0:2464) 3424 0 R (0:2465) 3425 0 R (0:2466) 3426 0 R (0:2467) 3427 0 R (0:2468) 3428 0 R (0:2469) 3429 0 R (0:247) 1142 0 R (0:2470) 3430 0 R (0:2471) 3431 0 R (0:2472) 3432 0 R (0:2475) 3433 0 R (0:2476) 3434 0 R (0:2477) 3435 0 R (0:2478) 3436 0 R (0:2479) 3437 0 R (0:248) 1143 0 R (0:2480) 3438 0 R (0:2481) 3439 0 R (0:2482) 3440 0 R (0:2483) 3441 0 R (0:2484) 3442 0 R (0:2485) 3443 0 R (0:2486) 3444 0 R (0:2487) 3445 0 R (0:2488) 3446 0 R (0:2489) 3447 0 R (0:249) 1144 0 R (0:2490) 3448 0 R (0:2491) 3449 0 R (0:2492) 3450 0 R (0:2493) 3451 0 R (0:2494) 3452 0 R (0:2495) 3453 0 R (0:2496) 3454 0 R (0:2497) 3455 0 R (0:2498) 3456 0 R (0:2499) 3462 0 R (0:250) 1145 0 R (0:2500) 3463 0 R (0:2501) 3464 0 R (0:2502) 3465 0 R (0:2503) 3466 0 R (0:2504) 3467 0 R (0:2505) 3468 0 R (0:2508) 3469 0 R (0:2509) 3470 0 R (0:251) 1146 0 R (0:2510) 3471 0 R (0:2511) 3472 0 R (0:2512) 3473 0 R (0:2513) 3474 0 R (0:2514) 3475 0 R (0:2515) 3476 0 R (0:2516) 3477 0 R (0:2517) 3478 0 R (0:2518) 3479 0 R (0:2519) 3480 0 R (0:252) 1147 0 R (0:2520) 3481 0 R (0:2521) 3482 0 R (0:2522) 3483 0 R (0:2523) 3484 0 R (0:2524) 3485 0 R (0:2525) 3486 0 R (0:2526) 3487 0 R (0:2527) 3488 0 R (0:2528) 3489 0 R (0:2529) 3490 0 R (0:253) 1148 0 R (0:2530) 3491 0 R (0:2531) 3492 0 R (0:2532) 3493 0 R (0:2533) 3494 0 R (0:2534) 3495 0 R (0:2537) 3501 0 R (0:2538) 3502 0 R (0:2539) 3503 0 R (0:254) 1149 0 R (0:2540) 3461 0 R (0:2543) 3504 0 R (0:2544) 3505 0 R (0:2545) 3506 0 R (0:2546) 3507 0 R (0:2547) 3508 0 R (0:2548) 3509 0 R (0:2549) 3510 0 R (0:255) 1150 0 R (0:2550) 3511 0 R (0:2551) 3512 0 R (0:2552) 3513 0 R (0:2553) 3514 0 R (0:2554) 3515 0 R (0:2555) 3516 0 R (0:2556) 3517 0 R (0:2557) 3518 0 R (0:2558) 3519 0 R (0:2559) 3520 0 R (0:256) 1151 0 R (0:2560) 3521 0 R (0:2561) 3522 0 R (0:2562) 3523 0 R (0:2563) 3524 0 R (0:2564) 3525 0 R (0:2565) 3526 0 R (0:2566) 3527 0 R (0:2567) 3528 0 R (0:257) 1152 0 R (0:2570) 3529 0 R (0:2571) 3530 0 R (0:2572) 3531 0 R (0:2573) 3532 0 R (0:2574) 3533 0 R (0:2575) 3534 0 R (0:2576) 3541 0 R (0:2577) 3500 0 R (0:258) 1153 0 R (0:2580) 3542 0 R (0:2581) 3543 0 R (0:2582) 3544 0 R (0:2583) 3545 0 R (0:2584) 3546 0 R (0:2585) 3547 0 R (0:2586) 3548 0 R (0:2587) 3549 0 R (0:2588) 3550 0 R (0:2589) 3551 0 R (0:259) 1154 0 R (0:2590) 3552 0 R (0:2591) 3553 0 R (0:2592) 3554 0 R (0:2593) 3555 0 R (0:2594) 3556 0 R (0:2595) 3557 0 R (0:2596) 3558 0 R (0:2597) 3559 0 R (0:2598) 3560 0 R (0:2599) 3561 0 R (0:260) 1155 0 R (0:2600) 3562 0 R (0:2601) 3563 0 R (0:2602) 3564 0 R (0:2603) 3565 0 R (0:2604) 3566 0 R (0:2605) 3567 0 R (0:2606) 3568 0 R (0:2607) 3569 0 R (0:2608) 3570 0 R (0:261) 1156 0 R (0:2611) 3571 0 R (0:2612) 3572 0 R (0:2613) 3573 0 R (0:2614) 3574 0 R (0:2615) 3575 0 R (0:2616) 3576 0 R (0:2617) 3577 0 R (0:2618) 3578 0 R (0:2619) 3579 0 R (0:262) 1157 0 R (0:2620) 3580 0 R (0:2621) 3585 0 R (0:2622) 3540 0 R (0:2623) 3586 0 R (0:2624) 3587 0 R (0:2625) 3588 0 R (0:2626) 3589 0 R (0:2627) 3590 0 R (0:2628) 3591 0 R (0:2629) 3592 0 R (0:263) 1158 0 R (0:2630) 3593 0 R (0:2631) 3594 0 R (0:2632) 3595 0 R (0:2633) 3596 0 R (0:2634) 3597 0 R (0:2635) 3598 0 R (0:2636) 3599 0 R (0:2637) 3600 0 R (0:264) 1159 0 R (0:2640) 3601 0 R (0:2641) 3602 0 R (0:2642) 3603 0 R (0:2643) 3604 0 R (0:2644) 3605 0 R (0:2645) 3606 0 R (0:2646) 3607 0 R (0:2647) 3608 0 R (0:2648) 3609 0 R (0:2649) 3610 0 R (0:265) 1160 0 R (0:2650) 3611 0 R (0:2651) 3612 0 R (0:2652) 3613 0 R (0:2653) 3614 0 R (0:2654) 3615 0 R (0:2655) 3616 0 R (0:2656) 3617 0 R (0:2657) 3618 0 R (0:2658) 3619 0 R (0:2659) 3620 0 R (0:266) 1161 0 R (0:2660) 3621 0 R (0:2661) 3622 0 R (0:2662) 3623 0 R (0:2663) 3624 0 R (0:2664) 3625 0 R (0:2665) 3626 0 R (0:2666) 3627 0 R (0:2667) 3628 0 R (0:2668) 3633 0 R (0:2669) 3634 0 R (0:267) 1162 0 R (0:2670) 3635 0 R (0:2671) 3636 0 R (0:2674) 3637 0 R (0:2675) 3638 0 R (0:2676) 3639 0 R (0:2677) 3640 0 R (0:2678) 3641 0 R (0:2679) 3642 0 R (0:268) 1163 0 R (0:2680) 3643 0 R (0:2681) 3644 0 R (0:2682) 3645 0 R (0:2683) 3646 0 R (0:2684) 3647 0 R (0:2685) 3648 0 R (0:2686) 3649 0 R (0:2687) 3650 0 R (0:2688) 3651 0 R (0:2689) 3652 0 R (0:2690) 3653 0 R (0:2691) 3654 0 R (0:2692) 3655 0 R (0:2693) 3656 0 R (0:2694) 3657 0 R (0:2695) 3658 0 R (0:2696) 3659 0 R (0:2697) 3660 0 R (0:2698) 3661 0 R (0:2699) 3662 0 R (0:2700) 3663 0 R (0:2701) 3664 0 R (0:2702) 3665 0 R (0:2703) 3666 0 R (0:2704) 3667 0 R (0:2705) 3668 0 R (0:2706) 3669 0 R (0:2707) 3670 0 R (0:2708) 3671 0 R (0:2709) 3672 0 R (0:271) 1164 0 R (0:2710) 3673 0 R (0:2711) 3674 0 R (0:2712) 3675 0 R (0:2713) 3676 0 R (0:2714) 3677 0 R (0:2715) 3678 0 R (0:2716) 3679 0 R (0:2717) 3680 0 R (0:2718) 3681 0 R (0:2719) 3682 0 R (0:272) 1165 0 R (0:2720) 3683 0 R (0:2721) 3684 0 R (0:2722) 3685 0 R (0:2723) 3686 0 R (0:2724) 3687 0 R (0:2725) 3692 0 R (0:2726) 3693 0 R (0:2727) 3694 0 R (0:2728) 3695 0 R (0:2729) 3696 0 R (0:273) 1166 0 R (0:2730) 3697 0 R (0:2731) 3698 0 R (0:2732) 3699 0 R (0:2733) 3700 0 R (0:2734) 3701 0 R (0:2735) 3702 0 R (0:2736) 3703 0 R (0:2737) 3704 0 R (0:2738) 3705 0 R (0:2739) 3706 0 R (0:274) 1167 0 R (0:2740) 3707 0 R (0:2741) 3708 0 R (0:2742) 3709 0 R (0:2743) 3710 0 R (0:2744) 3711 0 R (0:2745) 3712 0 R (0:2746) 3713 0 R (0:2747) 3714 0 R (0:2748) 3715 0 R (0:2749) 3716 0 R (0:275) 1168 0 R (0:2750) 3717 0 R (0:2751) 3718 0 R (0:2752) 3719 0 R (0:2753) 3720 0 R (0:2754) 3721 0 R (0:2755) 3722 0 R (0:2756) 3723 0 R (0:2757) 3724 0 R (0:2758) 3725 0 R (0:2759) 3726 0 R (0:276) 1169 0 R (0:2760) 3727 0 R (0:2761) 3728 0 R (0:2762) 3729 0 R (0:2763) 3730 0 R (0:2764) 3731 0 R (0:2765) 3732 0 R (0:2766) 3733 0 R (0:2767) 3734 0 R (0:2768) 3735 0 R (0:2769) 3736 0 R (0:277) 1170 0 R (0:2770) 3737 0 R (0:2771) 3738 0 R (0:2772) 3739 0 R (0:2773) 3740 0 R (0:2774) 3741 0 R (0:2775) 3742 0 R (0:2776) 3743 0 R (0:2777) 3744 0 R (0:2778) 3745 0 R (0:2779) 3746 0 R (0:278) 1171 0 R (0:2780) 3747 0 R (0:2781) 3748 0 R (0:2782) 3749 0 R (0:2783) 3750 0 R (0:2784) 3751 0 R (0:2785) 3752 0 R (0:2786) 3753 0 R (0:2787) 3754 0 R (0:2788) 3755 0 R (0:2789) 3756 0 R (0:279) 1172 0 R (0:2790) 3757 0 R (0:2791) 3758 0 R (0:2792) 3759 0 R (0:2793) 3760 0 R (0:2794) 3761 0 R (0:2795) 3766 0 R (0:2796) 3767 0 R (0:2797) 3768 0 R (0:2798) 3769 0 R (0:2799) 3770 0 R (0:28) 936 0 R (0:280) 1173 0 R (0:2800) 3771 0 R (0:2801) 3772 0 R (0:2802) 3773 0 R (0:2803) 3774 0 R (0:2804) 3775 0 R (0:2805) 3776 0 R (0:2806) 3777 0 R (0:2807) 3778 0 R (0:2808) 3779 0 R (0:2809) 3780 0 R (0:281) 1174 0 R (0:2810) 3781 0 R (0:2811) 3782 0 R (0:2814) 3783 0 R (0:2815) 3784 0 R (0:2816) 3785 0 R (0:2817) 3786 0 R (0:2818) 3787 0 R (0:2819) 3788 0 R (0:282) 1175 0 R (0:2820) 3789 0 R (0:2821) 3790 0 R (0:2822) 3791 0 R (0:2823) 3792 0 R (0:2824) 3793 0 R (0:2825) 3794 0 R (0:2826) 3795 0 R (0:2827) 3796 0 R (0:2828) 3797 0 R (0:2829) 3798 0 R (0:283) 1176 0 R (0:2830) 3799 0 R (0:2831) 3800 0 R (0:2832) 3801 0 R (0:2833) 3802 0 R (0:2834) 3803 0 R (0:2835) 3804 0 R (0:2836) 3805 0 R (0:2837) 3806 0 R (0:2838) 3807 0 R (0:2839) 3808 0 R (0:284) 1177 0 R (0:2840) 3809 0 R (0:2841) 3810 0 R (0:2842) 3811 0 R (0:2843) 3812 0 R (0:2844) 3813 0 R (0:2845) 3814 0 R (0:2846) 3815 0 R (0:2847) 3816 0 R (0:2848) 3817 0 R (0:2849) 3818 0 R (0:285) 1178 0 R (0:2850) 3819 0 R (0:2851) 3824 0 R (0:2852) 3825 0 R (0:2853) 3826 0 R (0:2854) 3827 0 R (0:2855) 3828 0 R (0:2856) 3829 0 R (0:2857) 3830 0 R (0:2858) 3831 0 R (0:2859) 3832 0 R (0:286) 1179 0 R (0:2860) 3833 0 R (0:2861) 3834 0 R (0:2862) 3835 0 R (0:2863) 3836 0 R (0:2864) 3837 0 R (0:2865) 3838 0 R (0:2866) 3839 0 R (0:2867) 3840 0 R (0:2868) 3841 0 R (0:2869) 3842 0 R (0:287) 1180 0 R (0:2870) 3843 0 R (0:2871) 3844 0 R (0:2872) 3845 0 R (0:2873) 3846 0 R (0:2874) 3847 0 R (0:2875) 3848 0 R (0:2876) 3849 0 R (0:2877) 3850 0 R (0:2878) 3851 0 R (0:2879) 3852 0 R (0:288) 1181 0 R (0:2880) 3853 0 R (0:2881) 3854 0 R (0:2882) 3855 0 R (0:2883) 3856 0 R (0:2884) 3857 0 R (0:2885) 3858 0 R (0:2886) 3859 0 R (0:2887) 3860 0 R (0:2888) 3861 0 R (0:2889) 3862 0 R (0:289) 1182 0 R (0:2892) 3863 0 R (0:2893) 3864 0 R (0:2894) 3865 0 R (0:2895) 3866 0 R (0:2896) 3867 0 R (0:2897) 3868 0 R (0:2898) 3869 0 R (0:2899) 3870 0 R (0:29) 937 0 R (0:290) 1183 0 R (0:2900) 3871 0 R (0:2901) 3877 0 R (0:2902) 3878 0 R (0:2903) 3879 0 R (0:2904) 3880 0 R (0:2905) 3881 0 R (0:2906) 3882 0 R (0:2907) 3883 0 R (0:2908) 3884 0 R (0:2909) 3885 0 R (0:291) 1184 0 R (0:2910) 3886 0 R (0:2911) 3887 0 R (0:2912) 3888 0 R (0:2913) 3889 0 R (0:2916) 3890 0 R (0:2917) 3891 0 R (0:2918) 3892 0 R (0:2919) 3893 0 R (0:292) 1185 0 R (0:2920) 3894 0 R (0:2921) 3895 0 R (0:2922) 3896 0 R (0:2923) 3897 0 R (0:2924) 3898 0 R (0:2925) 3899 0 R (0:2926) 3900 0 R (0:2927) 3901 0 R (0:2928) 3902 0 R (0:2929) 3903 0 R (0:293) 1186 0 R (0:2930) 3904 0 R (0:2931) 3905 0 R (0:2932) 3906 0 R (0:2933) 3907 0 R (0:2934) 3908 0 R (0:2935) 3909 0 R (0:2936) 3910 0 R (0:2937) 3911 0 R (0:2938) 3912 0 R (0:2939) 3913 0 R (0:294) 1187 0 R (0:2940) 3914 0 R (0:2941) 3915 0 R (0:2942) 3916 0 R (0:2943) 3917 0 R (0:2944) 3918 0 R (0:2945) 3919 0 R (0:2946) 3920 0 R (0:2947) 3921 0 R (0:2948) 3922 0 R (0:2949) 3923 0 R (0:295) 1188 0 R (0:2950) 3924 0 R (0:2951) 3925 0 R (0:2952) 3926 0 R (0:2953) 3927 0 R (0:2954) 3928 0 R (0:2955) 3929 0 R (0:2956) 3930 0 R (0:2957) 3931 0 R (0:2958) 3936 0 R (0:2959) 3937 0 R (0:296) 1189 0 R (0:2960) 3938 0 R (0:2961) 3939 0 R (0:2962) 3940 0 R (0:2963) 3941 0 R (0:2964) 3942 0 R (0:2965) 3943 0 R (0:2966) 3944 0 R (0:2967) 3945 0 R (0:2968) 3946 0 R (0:2969) 3947 0 R (0:297) 1190 0 R (0:2970) 3948 0 R (0:2971) 3949 0 R (0:2972) 3950 0 R (0:2973) 3951 0 R (0:2974) 3952 0 R (0:2975) 3953 0 R (0:2976) 3954 0 R (0:2977) 3955 0 R (0:2978) 3956 0 R (0:2979) 3957 0 R (0:298) 1191 0 R (0:2980) 3958 0 R (0:2981) 3959 0 R (0:2982) 3960 0 R (0:2983) 3961 0 R (0:2984) 3962 0 R (0:2985) 3963 0 R (0:2986) 3964 0 R (0:2987) 3965 0 R (0:2988) 3966 0 R (0:2989) 3967 0 R (0:299) 1192 0 R (0:2990) 3968 0 R (0:2991) 3969 0 R (0:2992) 3970 0 R (0:2993) 3971 0 R (0:2994) 3972 0 R (0:2995) 3973 0 R (0:2996) 3974 0 R (0:2997) 3975 0 R (0:2998) 3976 0 R (0:2999) 3977 0 R (0:30) 938 0 R (0:300) 1193 0 R (0:3000) 3978 0 R (0:3001) 3979 0 R (0:3002) 3980 0 R (0:3003) 3981 0 R (0:3004) 3982 0 R (0:3005) 3983 0 R (0:3006) 3984 0 R (0:3007) 3985 0 R (0:3008) 3986 0 R (0:3009) 3987 0 R (0:301) 1139 0 R (0:3010) 3988 0 R (0:3011) 3989 0 R (0:3012) 3990 0 R (0:3013) 3991 0 R (0:3014) 3992 0 R (0:3015) 3993 0 R (0:3016) 3994 0 R (0:3017) 3995 0 R (0:3018) 3996 0 R (0:3019) 3997 0 R (0:302) 1200 0 R (0:3020) 3998 0 R (0:3021) 3999 0 R (0:3022) 4000 0 R (0:3023) 4001 0 R (0:3024) 4002 0 R (0:3025) 4003 0 R (0:3026) 4004 0 R (0:3027) 4005 0 R (0:3028) 4010 0 R (0:3029) 4011 0 R (0:303) 1201 0 R (0:3030) 4012 0 R (0:3031) 4013 0 R (0:3032) 4014 0 R (0:3033) 4015 0 R (0:3034) 4016 0 R (0:3035) 4017 0 R (0:3036) 4018 0 R (0:3037) 4019 0 R (0:3038) 4020 0 R (0:3039) 4021 0 R (0:304) 1202 0 R (0:3040) 4022 0 R (0:3041) 4023 0 R (0:3042) 4024 0 R (0:3043) 4025 0 R (0:3044) 4026 0 R (0:3045) 4027 0 R (0:3046) 4028 0 R (0:3047) 4029 0 R (0:3048) 4030 0 R (0:3049) 4031 0 R (0:3050) 4032 0 R (0:3051) 4033 0 R (0:3052) 4034 0 R (0:3053) 4035 0 R (0:3054) 4036 0 R (0:3055) 4037 0 R (0:3056) 4038 0 R (0:3057) 4039 0 R (0:3058) 4040 0 R (0:3059) 4041 0 R (0:3060) 4042 0 R (0:3061) 4043 0 R (0:3062) 4044 0 R (0:3063) 4045 0 R (0:3064) 4046 0 R (0:3065) 4047 0 R (0:3066) 4048 0 R (0:3067) 4049 0 R (0:3068) 4050 0 R (0:3069) 4051 0 R (0:307) 1203 0 R (0:3070) 4052 0 R (0:3071) 4053 0 R (0:3072) 4054 0 R (0:3073) 4055 0 R (0:3074) 4056 0 R (0:3075) 4057 0 R (0:3076) 4058 0 R (0:3077) 4059 0 R (0:3078) 4060 0 R (0:3079) 4061 0 R (0:308) 1204 0 R (0:3080) 4062 0 R (0:3081) 4063 0 R (0:3082) 4064 0 R (0:3083) 4065 0 R (0:3084) 4066 0 R (0:3085) 4067 0 R (0:3086) 4068 0 R (0:3087) 4069 0 R (0:3088) 4070 0 R (0:3089) 4071 0 R (0:309) 1205 0 R (0:3090) 4072 0 R (0:3091) 4073 0 R (0:3092) 4074 0 R (0:3093) 4075 0 R (0:3094) 4076 0 R (0:3095) 4077 0 R (0:3096) 4078 0 R (0:3097) 4079 0 R (0:3098) 4080 0 R (0:3099) 4081 0 R (0:31) 939 0 R (0:310) 1206 0 R (0:3100) 4082 0 R (0:3101) 4083 0 R (0:3102) 4084 0 R (0:3103) 4089 0 R (0:3104) 4090 0 R (0:3105) 4091 0 R (0:3106) 4092 0 R (0:3107) 4093 0 R (0:311) 1207 0 R (0:3110) 4094 0 R (0:3111) 4095 0 R (0:3112) 4096 0 R (0:3113) 4097 0 R (0:3114) 4098 0 R (0:3115) 4099 0 R (0:3116) 4100 0 R (0:3117) 4101 0 R (0:3118) 4102 0 R (0:3119) 4103 0 R (0:312) 1208 0 R (0:3120) 4104 0 R (0:3121) 4105 0 R (0:3122) 4106 0 R (0:3123) 4107 0 R (0:3124) 4108 0 R (0:3125) 4109 0 R (0:3126) 4110 0 R (0:3127) 4111 0 R (0:3128) 4112 0 R (0:3129) 4113 0 R (0:313) 1209 0 R (0:3130) 4114 0 R (0:3131) 4115 0 R (0:3132) 4116 0 R (0:3133) 4117 0 R (0:3134) 4118 0 R (0:3135) 4119 0 R (0:3136) 4120 0 R (0:3137) 4121 0 R (0:3138) 4122 0 R (0:3139) 4123 0 R (0:314) 1210 0 R (0:3140) 4124 0 R (0:3141) 4125 0 R (0:3142) 4126 0 R (0:3143) 4127 0 R (0:3144) 4128 0 R (0:3145) 4129 0 R (0:3146) 4130 0 R (0:3147) 4131 0 R (0:3148) 4132 0 R (0:3149) 4133 0 R (0:315) 1211 0 R (0:3150) 4134 0 R (0:3151) 4135 0 R (0:3152) 4136 0 R (0:3153) 4137 0 R (0:3154) 4138 0 R (0:3155) 4139 0 R (0:3156) 4140 0 R (0:3157) 4141 0 R (0:3158) 4142 0 R (0:3159) 4143 0 R (0:316) 1212 0 R (0:3160) 4148 0 R (0:3161) 4149 0 R (0:3162) 4150 0 R (0:3163) 4151 0 R (0:3164) 4152 0 R (0:3165) 4153 0 R (0:3166) 4154 0 R (0:3167) 4155 0 R (0:3168) 4156 0 R (0:3169) 4157 0 R (0:317) 1213 0 R (0:3170) 4158 0 R (0:3171) 4159 0 R (0:3172) 4160 0 R (0:3173) 4161 0 R (0:3174) 4162 0 R (0:3175) 4163 0 R (0:3176) 4164 0 R (0:3177) 4165 0 R (0:3178) 4166 0 R (0:3179) 4167 0 R (0:318) 1214 0 R (0:3180) 4168 0 R (0:3181) 4169 0 R (0:3182) 4170 0 R (0:3183) 4171 0 R (0:3184) 4172 0 R (0:3185) 4173 0 R (0:3186) 4174 0 R (0:3187) 4175 0 R (0:3188) 4176 0 R (0:3189) 4177 0 R (0:319) 1215 0 R (0:3190) 4178 0 R (0:3191) 4179 0 R (0:3192) 4180 0 R (0:3193) 4181 0 R (0:3194) 4182 0 R (0:3195) 4183 0 R (0:3196) 4184 0 R (0:3197) 4185 0 R (0:3198) 4186 0 R (0:3199) 4187 0 R (0:320) 1216 0 R (0:3200) 4188 0 R (0:3201) 4189 0 R (0:3202) 4190 0 R (0:3203) 4191 0 R (0:3204) 4192 0 R (0:3205) 4193 0 R (0:3206) 4194 0 R (0:3207) 4195 0 R (0:3208) 4196 0 R (0:3209) 4197 0 R (0:321) 1217 0 R (0:3210) 4198 0 R (0:3211) 4199 0 R (0:3212) 4200 0 R (0:3213) 4201 0 R (0:3214) 4202 0 R (0:3215) 4203 0 R (0:3216) 4204 0 R (0:3217) 4205 0 R (0:3218) 4206 0 R (0:3219) 4207 0 R (0:322) 1218 0 R (0:3220) 4208 0 R (0:3221) 4209 0 R (0:3222) 4210 0 R (0:3223) 4215 0 R (0:3224) 4216 0 R (0:3225) 4217 0 R (0:3226) 4218 0 R (0:3227) 4219 0 R (0:3228) 4220 0 R (0:3229) 4221 0 R (0:323) 1219 0 R (0:3230) 4222 0 R (0:3231) 4223 0 R (0:3232) 4224 0 R (0:3233) 4225 0 R (0:3234) 4226 0 R (0:3235) 4227 0 R (0:3236) 4228 0 R (0:3237) 4229 0 R (0:3238) 4230 0 R (0:3239) 4231 0 R (0:324) 1220 0 R (0:3240) 4232 0 R (0:3241) 4233 0 R (0:3242) 4234 0 R (0:3243) 4235 0 R (0:3244) 4236 0 R (0:3245) 4237 0 R (0:3246) 4238 0 R (0:3247) 4239 0 R (0:3248) 4240 0 R (0:3249) 4241 0 R (0:325) 1221 0 R (0:3250) 4242 0 R (0:3251) 4243 0 R (0:3252) 4244 0 R (0:3253) 4245 0 R (0:3254) 4246 0 R (0:3255) 4247 0 R (0:3256) 4248 0 R (0:3257) 4249 0 R (0:3258) 4250 0 R (0:3259) 4251 0 R (0:326) 1222 0 R (0:3260) 4252 0 R (0:3261) 4253 0 R (0:3262) 4254 0 R (0:3263) 4255 0 R (0:3266) 4256 0 R (0:3267) 4257 0 R (0:3268) 4258 0 R (0:3269) 4259 0 R (0:327) 1223 0 R (0:3270) 4260 0 R (0:3271) 4261 0 R (0:3272) 4262 0 R (0:3273) 4263 0 R (0:3274) 4264 0 R (0:3275) 4265 0 R (0:3276) 4266 0 R (0:3277) 4267 0 R (0:3278) 4268 0 R (0:3279) 4269 0 R (0:328) 1224 0 R (0:3280) 4270 0 R (0:3281) 4271 0 R (0:3282) 4272 0 R (0:3283) 4273 0 R (0:3284) 4274 0 R (0:3285) 4280 0 R (0:3286) 4281 0 R (0:3287) 4282 0 R (0:3288) 4283 0 R (0:3289) 4284 0 R (0:329) 1225 0 R (0:3290) 4285 0 R (0:3291) 4286 0 R (0:3292) 4287 0 R (0:3293) 4288 0 R (0:3294) 4289 0 R (0:3295) 4290 0 R (0:3296) 4291 0 R (0:3297) 4292 0 R (0:3298) 4293 0 R (0:3299) 4294 0 R (0:330) 1226 0 R (0:3300) 4295 0 R (0:3301) 4296 0 R (0:3302) 4297 0 R (0:3303) 4298 0 R (0:3304) 4299 0 R (0:3305) 4300 0 R (0:3306) 4301 0 R (0:3307) 4302 0 R (0:3308) 4303 0 R (0:3309) 4304 0 R (0:331) 1227 0 R (0:3310) 4305 0 R (0:3311) 4306 0 R (0:3312) 4307 0 R (0:3313) 4308 0 R (0:3314) 4309 0 R (0:3315) 4310 0 R (0:3316) 4311 0 R (0:3317) 4312 0 R (0:3318) 4313 0 R (0:3319) 4314 0 R (0:332) 1228 0 R (0:3320) 4315 0 R (0:3321) 4316 0 R (0:3322) 4317 0 R (0:3323) 4318 0 R (0:3324) 4319 0 R (0:3325) 4320 0 R (0:3326) 4321 0 R (0:3327) 4322 0 R (0:3328) 4323 0 R (0:3329) 4324 0 R (0:333) 1229 0 R (0:3330) 4325 0 R (0:3331) 4326 0 R (0:3332) 4327 0 R (0:3333) 4328 0 R (0:3334) 4329 0 R (0:3335) 4330 0 R (0:3336) 4331 0 R (0:3337) 4332 0 R (0:3338) 4333 0 R (0:3339) 4334 0 R (0:334) 1230 0 R (0:3340) 4335 0 R (0:3341) 4336 0 R (0:3342) 4337 0 R (0:3343) 4338 0 R (0:3344) 4339 0 R (0:3345) 4340 0 R (0:3346) 4341 0 R (0:3347) 4342 0 R (0:3348) 4343 0 R (0:3349) 4344 0 R (0:335) 1231 0 R (0:3350) 4345 0 R (0:3351) 4350 0 R (0:3352) 4351 0 R (0:3353) 4352 0 R (0:3354) 4353 0 R (0:3355) 4354 0 R (0:3356) 4355 0 R (0:3357) 4356 0 R (0:3358) 4357 0 R (0:3359) 4358 0 R (0:336) 1232 0 R (0:3360) 4359 0 R (0:3361) 4360 0 R (0:3362) 4361 0 R (0:3363) 4362 0 R (0:3364) 4363 0 R (0:3365) 4364 0 R (0:3366) 4365 0 R (0:3367) 4366 0 R (0:3368) 4367 0 R (0:3369) 4368 0 R (0:337) 1233 0 R (0:3370) 4369 0 R (0:3371) 4370 0 R (0:3372) 4371 0 R (0:3373) 4372 0 R (0:3376) 4373 0 R (0:3377) 4374 0 R (0:3378) 4375 0 R (0:3379) 4376 0 R (0:338) 1234 0 R (0:3380) 4377 0 R (0:3381) 4378 0 R (0:3382) 4379 0 R (0:3383) 4380 0 R (0:3384) 4381 0 R (0:3385) 4382 0 R (0:3386) 4383 0 R (0:3387) 4384 0 R (0:3388) 4385 0 R (0:3389) 4386 0 R (0:339) 1235 0 R (0:3390) 4387 0 R (0:3391) 4388 0 R (0:3392) 4389 0 R (0:3393) 4390 0 R (0:3394) 4391 0 R (0:3395) 4392 0 R (0:3396) 4393 0 R (0:3397) 4394 0 R (0:340) 1236 0 R (0:3400) 4395 0 R (0:3401) 4396 0 R (0:3402) 4397 0 R (0:3403) 4402 0 R (0:3404) 4403 0 R (0:3405) 4404 0 R (0:3406) 4405 0 R (0:3407) 4406 0 R (0:3408) 4407 0 R (0:3409) 4408 0 R (0:3410) 4409 0 R (0:3411) 4410 0 R (0:3412) 4411 0 R (0:3413) 4412 0 R (0:3414) 4413 0 R (0:3415) 4414 0 R (0:3416) 4415 0 R (0:3417) 4416 0 R (0:3418) 4417 0 R (0:3419) 4418 0 R (0:3420) 4419 0 R (0:3421) 4420 0 R (0:3422) 4421 0 R (0:3423) 4422 0 R (0:3424) 4423 0 R (0:3425) 4424 0 R (0:3426) 4425 0 R (0:3427) 4426 0 R (0:3428) 4427 0 R (0:3429) 4428 0 R (0:343) 1241 0 R (0:3430) 4429 0 R (0:3431) 4430 0 R (0:3432) 4431 0 R (0:3433) 4432 0 R (0:3434) 4433 0 R (0:3435) 4434 0 R (0:3436) 4435 0 R (0:3437) 4436 0 R (0:3438) 4437 0 R (0:3439) 4438 0 R (0:344) 1242 0 R (0:3440) 4439 0 R (0:3441) 4440 0 R (0:3442) 4441 0 R (0:3443) 4442 0 R (0:3444) 4443 0 R (0:3445) 4444 0 R (0:3446) 4445 0 R (0:3447) 4446 0 R (0:3448) 4447 0 R (0:3449) 4448 0 R (0:345) 1243 0 R (0:3450) 4449 0 R (0:3451) 4450 0 R (0:3452) 4451 0 R (0:3453) 4452 0 R (0:3454) 4453 0 R (0:3455) 4454 0 R (0:3456) 4455 0 R (0:3457) 4456 0 R (0:3458) 4457 0 R (0:3459) 4458 0 R (0:346) 1199 0 R (0:3460) 4459 0 R (0:3461) 4460 0 R (0:3462) 4461 0 R (0:3463) 4462 0 R (0:3464) 4468 0 R (0:3465) 4469 0 R (0:3466) 4470 0 R (0:3467) 4471 0 R (0:3468) 4472 0 R (0:3469) 4473 0 R (0:3470) 4474 0 R (0:3471) 4475 0 R (0:3472) 4476 0 R (0:3473) 4477 0 R (0:3474) 4478 0 R (0:3475) 4479 0 R (0:3476) 4480 0 R (0:3477) 4481 0 R (0:3478) 4482 0 R (0:3479) 4483 0 R (0:3480) 4484 0 R (0:3481) 4485 0 R (0:3484) 4486 0 R (0:3485) 4487 0 R (0:3486) 4488 0 R (0:3487) 4489 0 R (0:3488) 4490 0 R (0:3489) 4491 0 R (0:349) 1244 0 R (0:3490) 4492 0 R (0:3491) 4493 0 R (0:3492) 4494 0 R (0:3493) 4495 0 R (0:3494) 4496 0 R (0:3495) 4497 0 R (0:3496) 4498 0 R (0:3497) 4499 0 R (0:3498) 4500 0 R (0:3499) 4501 0 R (0:350) 1245 0 R (0:3500) 4502 0 R (0:3501) 4503 0 R (0:3502) 4504 0 R (0:3503) 4505 0 R (0:3504) 4506 0 R (0:3505) 4507 0 R (0:3508) 4512 0 R (0:3509) 4513 0 R (0:351) 1246 0 R (0:3510) 4514 0 R (0:3511) 4467 0 R (0:3514) 4515 0 R (0:3515) 4516 0 R (0:3516) 4517 0 R (0:3517) 4518 0 R (0:3518) 4519 0 R (0:3519) 4520 0 R (0:352) 1247 0 R (0:3520) 4521 0 R (0:3521) 4522 0 R (0:3522) 4523 0 R (0:3523) 4524 0 R (0:3524) 4525 0 R (0:3525) 4526 0 R (0:3526) 4527 0 R (0:3527) 4528 0 R (0:3528) 4529 0 R (0:3529) 4530 0 R (0:353) 1248 0 R (0:3532) 4531 0 R (0:3533) 4532 0 R (0:3534) 4533 0 R (0:3535) 4534 0 R (0:3536) 4535 0 R (0:3537) 4536 0 R (0:3538) 4537 0 R (0:3539) 4538 0 R (0:354) 1249 0 R (0:3540) 4539 0 R (0:3541) 4540 0 R (0:3542) 4541 0 R (0:3543) 4542 0 R (0:3544) 4543 0 R (0:3545) 4544 0 R (0:3546) 4545 0 R (0:3547) 4546 0 R (0:3548) 4551 0 R (0:3549) 4552 0 R (0:355) 1250 0 R (0:3550) 4553 0 R (0:3551) 4554 0 R (0:3552) 4555 0 R (0:3553) 4556 0 R (0:3554) 4557 0 R (0:3555) 4558 0 R (0:3556) 4559 0 R (0:3557) 4560 0 R (0:3558) 4561 0 R (0:3559) 4562 0 R (0:356) 1251 0 R (0:3560) 4563 0 R (0:3561) 4564 0 R (0:3562) 4565 0 R (0:3563) 4566 0 R (0:3564) 4567 0 R (0:3565) 4568 0 R (0:3566) 4569 0 R (0:3567) 4570 0 R (0:3568) 4571 0 R (0:3569) 4572 0 R (0:357) 1252 0 R (0:3570) 4573 0 R (0:3571) 4574 0 R (0:3572) 4575 0 R (0:3573) 4576 0 R (0:3574) 4577 0 R (0:3575) 4578 0 R (0:3576) 4579 0 R (0:3577) 4580 0 R (0:3578) 4581 0 R (0:3579) 4582 0 R (0:358) 1253 0 R (0:3580) 4583 0 R (0:3581) 4584 0 R (0:3582) 4585 0 R (0:3583) 4586 0 R (0:3584) 4587 0 R (0:3585) 4588 0 R (0:3586) 4589 0 R (0:3587) 4590 0 R (0:3588) 4591 0 R (0:3589) 4592 0 R (0:359) 1254 0 R (0:3590) 4593 0 R (0:3591) 4594 0 R (0:3592) 4595 0 R (0:3593) 4596 0 R (0:3594) 4597 0 R (0:3595) 4598 0 R (0:3596) 4599 0 R (0:3597) 4600 0 R (0:3598) 4601 0 R (0:3599) 4602 0 R (0:360) 1255 0 R (0:3600) 4603 0 R (0:3601) 4604 0 R (0:3602) 4605 0 R (0:3603) 4606 0 R (0:3604) 4607 0 R (0:3605) 4608 0 R (0:3606) 4609 0 R (0:3607) 4610 0 R (0:3608) 4611 0 R (0:3609) 4612 0 R (0:361) 1256 0 R (0:3610) 4613 0 R (0:3611) 4614 0 R (0:3612) 4615 0 R (0:3613) 4616 0 R (0:3614) 4617 0 R (0:3615) 4618 0 R (0:3616) 4619 0 R (0:3617) 4625 0 R (0:3618) 4626 0 R (0:3619) 4627 0 R (0:362) 1257 0 R (0:3622) 4628 0 R (0:3623) 4629 0 R (0:3624) 4630 0 R (0:3625) 4631 0 R (0:3626) 4632 0 R (0:3627) 4633 0 R (0:3628) 4634 0 R (0:3629) 4635 0 R (0:363) 1258 0 R (0:3630) 4636 0 R (0:3631) 4637 0 R (0:3632) 4638 0 R (0:3633) 4639 0 R (0:3634) 4640 0 R (0:3635) 4641 0 R (0:3636) 4642 0 R (0:3637) 4643 0 R (0:3638) 4644 0 R (0:3639) 4645 0 R (0:364) 1259 0 R (0:3640) 4646 0 R (0:3641) 4647 0 R (0:3642) 4648 0 R (0:3643) 4649 0 R (0:3644) 4650 0 R (0:3645) 4651 0 R (0:3646) 4652 0 R (0:3647) 4653 0 R (0:3648) 4654 0 R (0:3649) 4655 0 R (0:365) 1260 0 R (0:3650) 4656 0 R (0:3651) 4657 0 R (0:3652) 4658 0 R (0:3653) 4659 0 R (0:3654) 4660 0 R (0:3655) 4661 0 R (0:3656) 4662 0 R (0:3657) 4663 0 R (0:3658) 4664 0 R (0:3659) 4665 0 R (0:366) 1261 0 R (0:3660) 4666 0 R (0:3661) 4667 0 R (0:3662) 4668 0 R (0:3663) 4669 0 R (0:3664) 4670 0 R (0:3665) 4671 0 R (0:3666) 4672 0 R (0:3667) 4673 0 R (0:3668) 4674 0 R (0:3669) 4675 0 R (0:367) 1262 0 R (0:3670) 4676 0 R (0:3671) 4677 0 R (0:3672) 4682 0 R (0:3673) 4683 0 R (0:3674) 4684 0 R (0:3675) 4685 0 R (0:3676) 4686 0 R (0:3677) 4687 0 R (0:3678) 4688 0 R (0:3679) 4689 0 R (0:368) 1263 0 R (0:3680) 4690 0 R (0:3681) 4691 0 R (0:3682) 4692 0 R (0:3683) 4693 0 R (0:3684) 4694 0 R (0:3685) 4695 0 R (0:3686) 4696 0 R (0:3687) 4697 0 R (0:3688) 4698 0 R (0:3689) 4699 0 R (0:3690) 4700 0 R (0:3691) 4701 0 R (0:3692) 4702 0 R (0:3693) 4703 0 R (0:3694) 4704 0 R (0:3695) 4705 0 R (0:3696) 4706 0 R (0:3697) 4707 0 R (0:3698) 4708 0 R (0:3699) 4709 0 R (0:3700) 4710 0 R (0:3701) 4711 0 R (0:3702) 4712 0 R (0:3703) 4713 0 R (0:3704) 4714 0 R (0:3705) 4715 0 R (0:3706) 4716 0 R (0:3707) 4717 0 R (0:3708) 4718 0 R (0:3709) 4719 0 R (0:371) 1264 0 R (0:3710) 4720 0 R (0:3711) 4721 0 R (0:3712) 4722 0 R (0:3713) 4723 0 R (0:3714) 4724 0 R (0:3715) 4725 0 R (0:3716) 4726 0 R (0:3717) 4727 0 R (0:3718) 4728 0 R (0:3719) 4729 0 R (0:372) 1265 0 R (0:3720) 4730 0 R (0:3721) 4731 0 R (0:3722) 4732 0 R (0:3723) 4733 0 R (0:3724) 4734 0 R (0:3725) 4735 0 R (0:3726) 4736 0 R (0:3727) 4737 0 R (0:3728) 4738 0 R (0:3729) 4739 0 R (0:373) 1266 0 R (0:3730) 4740 0 R (0:3731) 4741 0 R (0:3732) 4742 0 R (0:3733) 4743 0 R (0:3734) 4744 0 R (0:3735) 4745 0 R (0:3736) 4746 0 R (0:3737) 4747 0 R (0:3738) 4748 0 R (0:3739) 4749 0 R (0:374) 1267 0 R (0:3740) 4750 0 R (0:3741) 4751 0 R (0:3742) 4756 0 R (0:3743) 4757 0 R (0:3744) 4758 0 R (0:3745) 4759 0 R (0:3746) 4760 0 R (0:3747) 4761 0 R (0:3748) 4762 0 R (0:3749) 4763 0 R (0:375) 1268 0 R (0:3750) 4764 0 R (0:3751) 4765 0 R (0:3752) 4766 0 R (0:3753) 4767 0 R (0:3754) 4768 0 R (0:3755) 4769 0 R (0:3756) 4770 0 R (0:3757) 4771 0 R (0:3758) 4772 0 R (0:3759) 4773 0 R (0:376) 1269 0 R (0:3760) 4774 0 R (0:3761) 4775 0 R (0:3762) 4776 0 R (0:3763) 4777 0 R (0:3764) 4778 0 R (0:3765) 4779 0 R (0:3766) 4780 0 R (0:3767) 4781 0 R (0:3768) 4782 0 R (0:3769) 4783 0 R (0:377) 1270 0 R (0:3770) 4784 0 R (0:3771) 4785 0 R (0:3772) 4786 0 R (0:3773) 4787 0 R (0:3774) 4788 0 R (0:3775) 4789 0 R (0:3776) 4790 0 R (0:3777) 4791 0 R (0:3778) 4792 0 R (0:3779) 4793 0 R (0:378) 1271 0 R (0:3780) 4794 0 R (0:3781) 4795 0 R (0:3782) 4796 0 R (0:3783) 4797 0 R (0:3784) 4798 0 R (0:3785) 4799 0 R (0:3786) 4800 0 R (0:3787) 4801 0 R (0:3788) 4802 0 R (0:3789) 4803 0 R (0:379) 1272 0 R (0:3790) 4804 0 R (0:3791) 4805 0 R (0:3792) 4806 0 R (0:3793) 4807 0 R (0:3794) 4808 0 R (0:3795) 4809 0 R (0:3796) 4810 0 R (0:3797) 4811 0 R (0:3798) 4812 0 R (0:3799) 4813 0 R (0:380) 1273 0 R (0:3800) 4814 0 R (0:3801) 4815 0 R (0:3802) 4816 0 R (0:3803) 4817 0 R (0:3804) 4818 0 R (0:3805) 4819 0 R (0:3806) 4820 0 R (0:3807) 4821 0 R (0:3808) 4822 0 R (0:3809) 4823 0 R (0:381) 1278 0 R (0:3810) 4824 0 R (0:3811) 4825 0 R (0:3812) 4826 0 R (0:3813) 4827 0 R (0:3814) 4828 0 R (0:3815) 4829 0 R (0:3816) 4830 0 R (0:3817) 4835 0 R (0:3818) 4836 0 R (0:3819) 4837 0 R (0:382) 1279 0 R (0:3820) 4838 0 R (0:3821) 4839 0 R (0:3822) 4840 0 R (0:3823) 4841 0 R (0:3824) 4842 0 R (0:3827) 4843 0 R (0:3828) 4844 0 R (0:3829) 4845 0 R (0:383) 1280 0 R (0:3830) 4846 0 R (0:3831) 4847 0 R (0:3832) 4848 0 R (0:3833) 4849 0 R (0:3834) 4850 0 R (0:3835) 4851 0 R (0:3836) 4852 0 R (0:3837) 4853 0 R (0:3838) 4854 0 R (0:3839) 4855 0 R (0:384) 1281 0 R (0:3840) 4856 0 R (0:3841) 4857 0 R (0:3842) 4858 0 R (0:3843) 4859 0 R (0:3844) 4860 0 R (0:3845) 4861 0 R (0:3846) 4862 0 R (0:3847) 4863 0 R (0:3848) 4864 0 R (0:3849) 4865 0 R (0:385) 1282 0 R (0:3850) 4866 0 R (0:3851) 4867 0 R (0:3852) 4868 0 R (0:3853) 4869 0 R (0:3854) 4870 0 R (0:3855) 4871 0 R (0:3856) 4872 0 R (0:3857) 4873 0 R (0:3858) 4874 0 R (0:3859) 4875 0 R (0:386) 1283 0 R (0:3860) 4876 0 R (0:3861) 4877 0 R (0:3862) 4878 0 R (0:3863) 4879 0 R (0:3864) 4880 0 R (0:3865) 4881 0 R (0:3866) 4882 0 R (0:3867) 4883 0 R (0:3868) 4884 0 R (0:3869) 4885 0 R (0:387) 1284 0 R (0:3870) 4886 0 R (0:3871) 4887 0 R (0:3872) 4888 0 R (0:3873) 4893 0 R (0:3874) 4894 0 R (0:3875) 4895 0 R (0:3876) 4896 0 R (0:3877) 4897 0 R (0:3878) 4898 0 R (0:3879) 4899 0 R (0:388) 1285 0 R (0:3880) 4900 0 R (0:3881) 4901 0 R (0:3882) 4902 0 R (0:3883) 4903 0 R (0:3884) 4904 0 R (0:3885) 4905 0 R (0:3886) 4906 0 R (0:3887) 4907 0 R (0:3888) 4908 0 R (0:3889) 4909 0 R (0:389) 1286 0 R (0:3890) 4910 0 R (0:3891) 4911 0 R (0:3892) 4912 0 R (0:3893) 4913 0 R (0:3894) 4914 0 R (0:3895) 4915 0 R (0:3896) 4916 0 R (0:3897) 4917 0 R (0:3898) 4918 0 R (0:3899) 4919 0 R (0:390) 1287 0 R (0:3900) 4920 0 R (0:3901) 4921 0 R (0:3902) 4922 0 R (0:3903) 4923 0 R (0:3904) 4924 0 R (0:3905) 4925 0 R (0:3906) 4926 0 R (0:3907) 4927 0 R (0:3908) 4928 0 R (0:3909) 4929 0 R (0:391) 1288 0 R (0:3910) 4930 0 R (0:3911) 4931 0 R (0:3912) 4932 0 R (0:3913) 4933 0 R (0:3914) 4934 0 R (0:3915) 4935 0 R (0:3916) 4936 0 R (0:3917) 4937 0 R (0:3918) 4938 0 R (0:3919) 4939 0 R (0:392) 1289 0 R (0:3920) 4940 0 R (0:3921) 4941 0 R (0:3922) 4942 0 R (0:3923) 4943 0 R (0:3924) 4944 0 R (0:3925) 4945 0 R (0:3926) 4946 0 R (0:3927) 4947 0 R (0:3928) 4948 0 R (0:3929) 4949 0 R (0:393) 1290 0 R (0:3930) 4950 0 R (0:3931) 4951 0 R (0:3932) 4952 0 R (0:3933) 4953 0 R (0:3934) 4954 0 R (0:3935) 4955 0 R (0:3936) 4956 0 R (0:3937) 4957 0 R (0:3938) 4958 0 R (0:3939) 4959 0 R (0:394) 1291 0 R (0:3940) 4960 0 R (0:3941) 4965 0 R (0:3942) 4966 0 R (0:3943) 4967 0 R (0:3944) 4968 0 R (0:3945) 4969 0 R (0:3946) 4970 0 R (0:3947) 4971 0 R (0:3948) 4972 0 R (0:3949) 4973 0 R (0:395) 1292 0 R (0:3950) 4974 0 R (0:3951) 4975 0 R (0:3952) 4976 0 R (0:3953) 4977 0 R (0:3954) 4978 0 R (0:3955) 4979 0 R (0:3956) 4980 0 R (0:3957) 4981 0 R (0:3958) 4982 0 R (0:3959) 4983 0 R (0:396) 1293 0 R (0:3960) 4984 0 R (0:3961) 4985 0 R (0:3962) 4986 0 R (0:3963) 4987 0 R (0:3964) 4988 0 R (0:3965) 4989 0 R (0:3966) 4990 0 R (0:3967) 4991 0 R (0:3968) 4992 0 R (0:3969) 4993 0 R (0:397) 1294 0 R (0:3970) 4994 0 R (0:3971) 4995 0 R (0:3972) 4996 0 R (0:3973) 4997 0 R (0:3974) 4998 0 R (0:3975) 4999 0 R (0:3976) 5000 0 R (0:3977) 5001 0 R (0:3978) 5002 0 R (0:3979) 5003 0 R (0:398) 1295 0 R (0:3980) 5004 0 R (0:3981) 5005 0 R (0:3982) 5006 0 R (0:3983) 5007 0 R (0:3984) 5008 0 R (0:3985) 5009 0 R (0:3986) 5010 0 R (0:3987) 5011 0 R (0:3988) 5012 0 R (0:3989) 5013 0 R (0:399) 1296 0 R (0:3990) 5014 0 R (0:3991) 5015 0 R (0:3992) 5016 0 R (0:3993) 5017 0 R (0:3994) 5018 0 R (0:3995) 5019 0 R (0:3996) 5020 0 R (0:3997) 5021 0 R (0:3998) 5022 0 R (0:3999) 5023 0 R (0:400) 1297 0 R (0:4000) 5024 0 R (0:4001) 5025 0 R (0:4002) 5026 0 R (0:4003) 5027 0 R (0:4004) 5028 0 R (0:4005) 5029 0 R (0:4006) 5030 0 R (0:4007) 5031 0 R (0:4008) 5032 0 R (0:4009) 5033 0 R (0:401) 1298 0 R (0:4010) 5039 0 R (0:4011) 5040 0 R (0:4012) 5041 0 R (0:4013) 5042 0 R (0:4014) 5043 0 R (0:4015) 5044 0 R (0:4016) 5045 0 R (0:4017) 5046 0 R (0:4018) 5047 0 R (0:4019) 5048 0 R (0:402) 1299 0 R (0:4020) 5049 0 R (0:4021) 5050 0 R (0:4022) 5051 0 R (0:4023) 5052 0 R (0:4024) 5053 0 R (0:4025) 5054 0 R (0:4026) 5055 0 R (0:4027) 5056 0 R (0:4028) 5057 0 R (0:4029) 5058 0 R (0:403) 1300 0 R (0:4030) 5059 0 R (0:4031) 5060 0 R (0:4032) 5061 0 R (0:4033) 5062 0 R (0:4034) 5063 0 R (0:4035) 5064 0 R (0:4036) 5065 0 R (0:4037) 5066 0 R (0:4038) 5067 0 R (0:4039) 5068 0 R (0:404) 1301 0 R (0:4040) 5069 0 R (0:4041) 5070 0 R (0:4042) 5071 0 R (0:4043) 5072 0 R (0:4044) 5073 0 R (0:4045) 5074 0 R (0:4046) 5075 0 R (0:4047) 5076 0 R (0:4048) 5077 0 R (0:4049) 5078 0 R (0:405) 1302 0 R (0:4050) 5079 0 R (0:4051) 5080 0 R (0:4052) 5081 0 R (0:4053) 5082 0 R (0:4054) 5083 0 R (0:4055) 5084 0 R (0:4056) 5085 0 R (0:4057) 5086 0 R (0:4058) 5087 0 R (0:4059) 5088 0 R (0:406) 1303 0 R (0:4060) 5089 0 R (0:4063) 5090 0 R (0:4064) 5091 0 R (0:4065) 5092 0 R (0:4066) 5093 0 R (0:4067) 5094 0 R (0:4068) 5095 0 R (0:4069) 5096 0 R (0:407) 1304 0 R (0:4070) 5101 0 R (0:4071) 5102 0 R (0:4072) 5103 0 R (0:4073) 5104 0 R (0:4074) 5105 0 R (0:4075) 5106 0 R (0:4076) 5107 0 R (0:4077) 5108 0 R (0:4078) 5109 0 R (0:4079) 5110 0 R (0:408) 1305 0 R (0:4080) 5111 0 R (0:4081) 5112 0 R (0:4082) 5113 0 R (0:4083) 5114 0 R (0:4084) 5115 0 R (0:4085) 5116 0 R (0:4086) 5117 0 R (0:4087) 5118 0 R (0:4088) 5119 0 R (0:4089) 5120 0 R (0:409) 1306 0 R (0:4090) 5121 0 R (0:4091) 5122 0 R (0:4092) 5123 0 R (0:4093) 5124 0 R (0:4094) 5125 0 R (0:4095) 5126 0 R (0:4096) 5127 0 R (0:4097) 5128 0 R (0:4098) 5129 0 R (0:4099) 5130 0 R (0:4100) 5131 0 R (0:4101) 5132 0 R (0:4102) 5133 0 R (0:4103) 5134 0 R (0:4104) 5135 0 R (0:4105) 5136 0 R (0:4106) 5137 0 R (0:4107) 5138 0 R (0:4108) 5139 0 R (0:4109) 5140 0 R (0:4110) 5141 0 R (0:4111) 5142 0 R (0:4112) 5143 0 R (0:4113) 5144 0 R (0:4114) 5145 0 R (0:4115) 5146 0 R (0:4116) 5147 0 R (0:4117) 5148 0 R (0:4118) 5149 0 R (0:4119) 5150 0 R (0:412) 1307 0 R (0:4120) 5151 0 R (0:4121) 5152 0 R (0:4122) 5153 0 R (0:4123) 5154 0 R (0:4124) 5155 0 R (0:4125) 5156 0 R (0:4126) 5157 0 R (0:4127) 5158 0 R (0:4128) 5159 0 R (0:4129) 5160 0 R (0:413) 1308 0 R (0:4130) 5161 0 R (0:4131) 5162 0 R (0:4132) 5163 0 R (0:4133) 5164 0 R (0:4134) 5165 0 R (0:4135) 5166 0 R (0:4136) 5167 0 R (0:4137) 5168 0 R (0:4138) 5169 0 R (0:4139) 5170 0 R (0:414) 1309 0 R (0:4140) 5175 0 R (0:4141) 5176 0 R (0:4142) 5177 0 R (0:4143) 5178 0 R (0:4144) 5179 0 R (0:4145) 5180 0 R (0:4146) 5181 0 R (0:4147) 5182 0 R (0:4148) 5183 0 R (0:4149) 5184 0 R (0:415) 1310 0 R (0:4150) 5185 0 R (0:4151) 5186 0 R (0:4152) 5187 0 R (0:4153) 5188 0 R (0:4154) 5189 0 R (0:4155) 5190 0 R (0:4156) 5191 0 R (0:4157) 5192 0 R (0:4158) 5193 0 R (0:4159) 5194 0 R (0:416) 1311 0 R (0:4160) 5195 0 R (0:4161) 5196 0 R (0:4162) 5197 0 R (0:4163) 5198 0 R (0:4164) 5199 0 R (0:4165) 5200 0 R (0:4166) 5201 0 R (0:4167) 5202 0 R (0:4168) 5203 0 R (0:4169) 5204 0 R (0:417) 1312 0 R (0:4170) 5205 0 R (0:4171) 5206 0 R (0:4172) 5207 0 R (0:4173) 5208 0 R (0:4174) 5209 0 R (0:4175) 5210 0 R (0:4176) 5211 0 R (0:4177) 5212 0 R (0:4178) 5213 0 R (0:4179) 5214 0 R (0:418) 1313 0 R (0:4180) 5215 0 R (0:4181) 5216 0 R (0:4182) 5217 0 R (0:4183) 5218 0 R (0:4184) 5219 0 R (0:4185) 5220 0 R (0:4186) 5221 0 R (0:4187) 5222 0 R (0:4188) 5223 0 R (0:4189) 5224 0 R (0:419) 1314 0 R (0:4190) 5225 0 R (0:4191) 5226 0 R (0:4192) 5227 0 R (0:4193) 5228 0 R (0:4194) 5229 0 R (0:4195) 5230 0 R (0:4196) 5231 0 R (0:4197) 5232 0 R (0:4198) 5233 0 R (0:4199) 5234 0 R (0:420) 1315 0 R (0:4200) 5235 0 R (0:4201) 5236 0 R (0:4202) 5237 0 R (0:4203) 5238 0 R (0:4204) 5239 0 R (0:4205) 5240 0 R (0:4206) 5241 0 R (0:4207) 5242 0 R (0:4208) 5243 0 R (0:4209) 5244 0 R (0:421) 1316 0 R (0:4210) 5245 0 R (0:4211) 5246 0 R (0:4212) 5247 0 R (0:4215) 5252 0 R (0:4216) 5253 0 R (0:4217) 5254 0 R (0:4218) 5255 0 R (0:4219) 5256 0 R (0:422) 1317 0 R (0:4220) 5257 0 R (0:4221) 5258 0 R (0:4222) 5259 0 R (0:4223) 5260 0 R (0:4224) 5261 0 R (0:4225) 5262 0 R (0:4226) 5263 0 R (0:4227) 5264 0 R (0:4228) 5265 0 R (0:4229) 5266 0 R (0:423) 1318 0 R (0:4230) 5267 0 R (0:4231) 5268 0 R (0:4232) 5269 0 R (0:4233) 5270 0 R (0:4234) 5271 0 R (0:4235) 5272 0 R (0:4236) 5273 0 R (0:4237) 5274 0 R (0:4238) 5275 0 R (0:4239) 5276 0 R (0:424) 1319 0 R (0:4240) 5277 0 R (0:4241) 5278 0 R (0:4242) 5279 0 R (0:4243) 5280 0 R (0:4244) 5281 0 R (0:4245) 5282 0 R (0:4246) 5283 0 R (0:4247) 5284 0 R (0:4248) 5285 0 R (0:4249) 5286 0 R (0:425) 1320 0 R (0:4250) 5287 0 R (0:4251) 5288 0 R (0:4252) 5289 0 R (0:4253) 5290 0 R (0:4254) 5291 0 R (0:4255) 5292 0 R (0:4256) 5293 0 R (0:4257) 5294 0 R (0:4258) 5295 0 R (0:4259) 5296 0 R (0:426) 1321 0 R (0:4260) 5297 0 R (0:4261) 5298 0 R (0:4262) 5299 0 R (0:4263) 5304 0 R (0:4264) 5305 0 R (0:4265) 5306 0 R (0:4266) 5307 0 R (0:4267) 5308 0 R (0:4268) 5309 0 R (0:4269) 5310 0 R (0:427) 1322 0 R (0:4270) 5311 0 R (0:4271) 5312 0 R (0:4274) 5313 0 R (0:4275) 5314 0 R (0:4276) 5315 0 R (0:4277) 5316 0 R (0:4278) 5317 0 R (0:4279) 5318 0 R (0:428) 1323 0 R (0:4280) 5319 0 R (0:4281) 5320 0 R (0:4282) 5321 0 R (0:4283) 5322 0 R (0:4284) 5323 0 R (0:4285) 5324 0 R (0:4286) 5325 0 R (0:4287) 5326 0 R (0:4288) 5327 0 R (0:4289) 5328 0 R (0:429) 1324 0 R (0:4290) 5329 0 R (0:4291) 5330 0 R (0:4292) 5331 0 R (0:4293) 5332 0 R (0:4294) 5333 0 R (0:4295) 5334 0 R (0:4298) 5335 0 R (0:4299) 5336 0 R (0:43) 941 0 R (0:430) 1325 0 R (0:4300) 5337 0 R (0:4301) 5338 0 R (0:4302) 5339 0 R (0:4303) 5344 0 R (0:4304) 5345 0 R (0:4305) 5346 0 R (0:4306) 5347 0 R (0:4307) 5348 0 R (0:4308) 5349 0 R (0:4309) 5350 0 R (0:431) 1326 0 R (0:4310) 5351 0 R (0:4311) 5352 0 R (0:4312) 5353 0 R (0:4313) 5354 0 R (0:4314) 5355 0 R (0:4315) 5356 0 R (0:4316) 5357 0 R (0:4317) 5358 0 R (0:4318) 5359 0 R (0:4319) 5360 0 R (0:432) 1327 0 R (0:4320) 5361 0 R (0:4321) 5362 0 R (0:4322) 5363 0 R (0:4323) 5364 0 R (0:4324) 5365 0 R (0:4325) 5366 0 R (0:4326) 5367 0 R (0:4327) 5368 0 R (0:4328) 5369 0 R (0:4329) 5370 0 R (0:433) 1328 0 R (0:4330) 5371 0 R (0:4331) 5372 0 R (0:4332) 5373 0 R (0:4333) 5374 0 R (0:4334) 5375 0 R (0:4335) 5376 0 R (0:4336) 5377 0 R (0:4337) 5378 0 R (0:4338) 5379 0 R (0:4339) 5380 0 R (0:434) 1329 0 R (0:4340) 5381 0 R (0:4341) 5382 0 R (0:4342) 5383 0 R (0:4343) 5384 0 R (0:4344) 5385 0 R (0:4345) 5386 0 R (0:4346) 5387 0 R (0:4347) 5388 0 R (0:4348) 5389 0 R (0:4349) 5390 0 R (0:435) 1330 0 R (0:4350) 5391 0 R (0:4351) 5392 0 R (0:4352) 5393 0 R (0:4353) 5394 0 R (0:4354) 5395 0 R (0:4355) 5396 0 R (0:4356) 5397 0 R (0:4357) 5398 0 R (0:4358) 5399 0 R (0:4359) 5400 0 R (0:436) 1331 0 R (0:4360) 5401 0 R (0:4361) 5402 0 R (0:4362) 5403 0 R (0:4363) 5404 0 R (0:4364) 5405 0 R (0:4365) 5406 0 R (0:4366) 5407 0 R (0:4367) 5408 0 R (0:4368) 5409 0 R (0:4369) 5416 0 R (0:437) 1336 0 R (0:4370) 5417 0 R (0:4371) 5418 0 R (0:4372) 5419 0 R (0:4373) 5420 0 R (0:4374) 5421 0 R (0:4375) 5422 0 R (0:4376) 5423 0 R (0:4377) 5424 0 R (0:4378) 5425 0 R (0:4379) 5426 0 R (0:4380) 5427 0 R (0:4381) 5428 0 R (0:4382) 5429 0 R (0:4383) 5430 0 R (0:4384) 5431 0 R (0:4385) 5432 0 R (0:4386) 5433 0 R (0:4387) 5434 0 R (0:4388) 5435 0 R (0:4389) 5436 0 R (0:4390) 5437 0 R (0:4391) 5438 0 R (0:4392) 5439 0 R (0:4393) 5440 0 R (0:4394) 5441 0 R (0:4395) 5442 0 R (0:4396) 5443 0 R (0:4397) 5444 0 R (0:4398) 5445 0 R (0:4399) 5446 0 R (0:44) 942 0 R (0:440) 1337 0 R (0:4400) 5447 0 R (0:4401) 5448 0 R (0:4402) 5449 0 R (0:4403) 5450 0 R (0:4404) 5451 0 R (0:4405) 5452 0 R (0:4406) 5453 0 R (0:4407) 5454 0 R (0:4408) 5455 0 R (0:4409) 5456 0 R (0:441) 1338 0 R (0:4410) 5457 0 R (0:4411) 5458 0 R (0:4412) 5459 0 R (0:4413) 5460 0 R (0:4414) 5461 0 R (0:4415) 5462 0 R (0:4416) 5463 0 R (0:4417) 5464 0 R (0:4418) 5465 0 R (0:4419) 5466 0 R (0:442) 1339 0 R (0:4420) 5467 0 R (0:4421) 5468 0 R (0:4422) 5469 0 R (0:4423) 5470 0 R (0:4424) 5471 0 R (0:4425) 5472 0 R (0:4428) 5477 0 R (0:4429) 5478 0 R (0:443) 1340 0 R (0:4430) 5479 0 R (0:4431) 5415 0 R (0:4434) 5480 0 R (0:4435) 5481 0 R (0:4436) 5482 0 R (0:4437) 5483 0 R (0:4438) 5484 0 R (0:4439) 5485 0 R (0:444) 1341 0 R (0:4440) 5486 0 R (0:4441) 5487 0 R (0:4442) 5488 0 R (0:4443) 5489 0 R (0:4444) 5490 0 R (0:4445) 5491 0 R (0:4446) 5492 0 R (0:4447) 5493 0 R (0:4448) 5494 0 R (0:4449) 5495 0 R (0:445) 1342 0 R (0:4450) 5496 0 R (0:4451) 5497 0 R (0:4452) 5498 0 R (0:4453) 5499 0 R (0:4454) 5500 0 R (0:4455) 5501 0 R (0:4456) 5502 0 R (0:4457) 5503 0 R (0:4458) 5504 0 R (0:4459) 5505 0 R (0:446) 1343 0 R (0:4460) 5506 0 R (0:4461) 5507 0 R (0:4462) 5508 0 R (0:4463) 5509 0 R (0:4464) 5510 0 R (0:4465) 5511 0 R (0:4466) 5512 0 R (0:4467) 5513 0 R (0:4468) 5514 0 R (0:4469) 5515 0 R (0:447) 1344 0 R (0:4470) 5516 0 R (0:4471) 5517 0 R (0:4472) 5518 0 R (0:4473) 5519 0 R (0:4474) 5520 0 R (0:4475) 5521 0 R (0:4476) 5522 0 R (0:4477) 5523 0 R (0:4478) 5524 0 R (0:4479) 5525 0 R (0:448) 1345 0 R (0:4480) 5526 0 R (0:4481) 5527 0 R (0:4482) 5528 0 R (0:4483) 5529 0 R (0:4484) 5534 0 R (0:4485) 5535 0 R (0:4486) 5536 0 R (0:4487) 5537 0 R (0:4488) 5538 0 R (0:4489) 5539 0 R (0:449) 1346 0 R (0:4490) 5540 0 R (0:4491) 5541 0 R (0:4492) 5542 0 R (0:4493) 5543 0 R (0:4494) 5544 0 R (0:4495) 5545 0 R (0:4496) 5546 0 R (0:4497) 5547 0 R (0:4498) 5548 0 R (0:4499) 5549 0 R (0:450) 1347 0 R (0:4500) 5550 0 R (0:4501) 5551 0 R (0:4502) 5552 0 R (0:4503) 5553 0 R (0:4504) 5554 0 R (0:4505) 5555 0 R (0:4506) 5556 0 R (0:4507) 5557 0 R (0:4508) 5558 0 R (0:4509) 5559 0 R (0:451) 1348 0 R (0:4510) 5560 0 R (0:4511) 5561 0 R (0:4512) 5562 0 R (0:4513) 5563 0 R (0:4514) 5564 0 R (0:4515) 5565 0 R (0:4516) 5566 0 R (0:4517) 5567 0 R (0:4518) 5568 0 R (0:4519) 5569 0 R (0:452) 1349 0 R (0:4520) 5570 0 R (0:4521) 5571 0 R (0:4522) 5572 0 R (0:4523) 5573 0 R (0:4524) 5574 0 R (0:4525) 5575 0 R (0:4526) 5576 0 R (0:4527) 5577 0 R (0:4528) 5578 0 R (0:4529) 5579 0 R (0:453) 1350 0 R (0:4530) 5580 0 R (0:4531) 5581 0 R (0:4532) 5582 0 R (0:4533) 5583 0 R (0:4534) 5584 0 R (0:4535) 5585 0 R (0:4536) 5586 0 R (0:4537) 5587 0 R (0:4538) 5588 0 R (0:4539) 5589 0 R (0:454) 1351 0 R (0:4540) 5590 0 R (0:4541) 5591 0 R (0:4542) 5592 0 R (0:4543) 5593 0 R (0:4544) 5594 0 R (0:4545) 5595 0 R (0:4546) 5596 0 R (0:4547) 5597 0 R (0:4548) 5598 0 R (0:4549) 5599 0 R (0:455) 1352 0 R (0:4550) 5600 0 R (0:4551) 5601 0 R (0:4552) 5602 0 R (0:4553) 5603 0 R (0:4554) 5608 0 R (0:4555) 5609 0 R (0:4556) 5610 0 R (0:4557) 5611 0 R (0:4558) 5612 0 R (0:4559) 5613 0 R (0:456) 1353 0 R (0:4560) 5614 0 R (0:4561) 5615 0 R (0:4562) 5616 0 R (0:4563) 5617 0 R (0:4564) 5618 0 R (0:4565) 5619 0 R (0:4566) 5620 0 R (0:4567) 5621 0 R (0:4568) 5622 0 R (0:4569) 5623 0 R (0:457) 1354 0 R (0:4570) 5624 0 R (0:4571) 5625 0 R (0:4572) 5626 0 R (0:4573) 5627 0 R (0:4574) 5628 0 R (0:4575) 5629 0 R (0:4576) 5630 0 R (0:4577) 5631 0 R (0:4578) 5632 0 R (0:4579) 5633 0 R (0:458) 1355 0 R (0:4580) 5634 0 R (0:4581) 5635 0 R (0:4582) 5636 0 R (0:4583) 5637 0 R (0:4584) 5638 0 R (0:4585) 5639 0 R (0:4586) 5640 0 R (0:4587) 5641 0 R (0:4588) 5642 0 R (0:4589) 5643 0 R (0:459) 1356 0 R (0:4590) 5644 0 R (0:4591) 5645 0 R (0:4592) 5646 0 R (0:4593) 5647 0 R (0:4594) 5648 0 R (0:4595) 5649 0 R (0:4596) 5650 0 R (0:4597) 5651 0 R (0:4598) 5652 0 R (0:4599) 5653 0 R (0:460) 1357 0 R (0:4600) 5654 0 R (0:4601) 5655 0 R (0:4602) 5656 0 R (0:4603) 5657 0 R (0:4604) 5658 0 R (0:4605) 5659 0 R (0:4606) 5660 0 R (0:4607) 5661 0 R (0:4608) 5662 0 R (0:4609) 5663 0 R (0:461) 1358 0 R (0:4610) 5664 0 R (0:4611) 5665 0 R (0:4612) 5666 0 R (0:4613) 5667 0 R (0:4614) 5668 0 R (0:4615) 5669 0 R (0:4616) 5670 0 R (0:4617) 5671 0 R (0:4618) 5672 0 R (0:4619) 5673 0 R (0:462) 1359 0 R (0:4620) 5674 0 R (0:4621) 5675 0 R (0:4622) 5680 0 R (0:4623) 5681 0 R (0:4624) 5682 0 R (0:4625) 5683 0 R (0:4626) 5684 0 R (0:4627) 5685 0 R (0:4628) 5686 0 R (0:4629) 5687 0 R (0:463) 1360 0 R (0:4630) 5688 0 R (0:4631) 5689 0 R (0:4632) 5690 0 R (0:4633) 5691 0 R (0:4634) 5692 0 R (0:4635) 5693 0 R (0:4636) 5694 0 R (0:4637) 5695 0 R (0:4638) 5696 0 R (0:4639) 5697 0 R (0:464) 1361 0 R (0:4640) 5698 0 R (0:4641) 5699 0 R (0:4642) 5700 0 R (0:4643) 5701 0 R (0:4644) 5702 0 R (0:4645) 5703 0 R (0:4646) 5704 0 R (0:4647) 5705 0 R (0:4648) 5706 0 R (0:4649) 5707 0 R (0:465) 1362 0 R (0:4650) 5708 0 R (0:4651) 5709 0 R (0:4652) 5710 0 R (0:4653) 5711 0 R (0:4654) 5712 0 R (0:4655) 5713 0 R (0:4656) 5714 0 R (0:4657) 5715 0 R (0:4658) 5716 0 R (0:4659) 5717 0 R (0:4660) 5718 0 R (0:4661) 5719 0 R (0:4662) 5720 0 R (0:4663) 5721 0 R (0:4664) 5722 0 R (0:4665) 5723 0 R (0:4666) 5724 0 R (0:4667) 5725 0 R (0:4668) 5726 0 R (0:4671) 5727 0 R (0:4672) 5728 0 R (0:4673) 5729 0 R (0:4674) 5730 0 R (0:4675) 5731 0 R (0:4676) 5732 0 R (0:4677) 5733 0 R (0:4678) 5734 0 R (0:4679) 5735 0 R (0:468) 1363 0 R (0:4680) 5736 0 R (0:4681) 5737 0 R (0:4682) 5738 0 R (0:4683) 5743 0 R (0:4684) 5744 0 R (0:4685) 5745 0 R (0:4686) 5746 0 R (0:4687) 5747 0 R (0:4688) 5748 0 R (0:4689) 5749 0 R (0:469) 1364 0 R (0:4690) 5750 0 R (0:4691) 5751 0 R (0:4692) 5752 0 R (0:4693) 5753 0 R (0:4694) 5754 0 R (0:4695) 5755 0 R (0:4696) 5756 0 R (0:4697) 5757 0 R (0:4698) 5758 0 R (0:4699) 5759 0 R (0:470) 1365 0 R (0:4702) 5760 0 R (0:4703) 5761 0 R (0:4704) 5762 0 R (0:4705) 5763 0 R (0:4706) 5764 0 R (0:4707) 5765 0 R (0:4708) 5766 0 R (0:4709) 5767 0 R (0:471) 1366 0 R (0:4710) 5768 0 R (0:4711) 5769 0 R (0:4712) 5770 0 R (0:4713) 5771 0 R (0:4714) 5772 0 R (0:4715) 5773 0 R (0:4716) 5774 0 R (0:4717) 5775 0 R (0:4718) 5776 0 R (0:4719) 5777 0 R (0:472) 1367 0 R (0:4720) 5778 0 R (0:4721) 5779 0 R (0:4722) 5780 0 R (0:4723) 5781 0 R (0:4726) 5782 0 R (0:4727) 5783 0 R (0:4728) 5784 0 R (0:4729) 5790 0 R (0:473) 1368 0 R (0:4730) 5791 0 R (0:4731) 5792 0 R (0:4732) 5793 0 R (0:4733) 5794 0 R (0:4734) 5795 0 R (0:4735) 5796 0 R (0:4736) 5797 0 R (0:4737) 5798 0 R (0:4738) 5799 0 R (0:4739) 5800 0 R (0:474) 1369 0 R (0:4740) 5801 0 R (0:4741) 5802 0 R (0:4742) 5803 0 R (0:4743) 5804 0 R (0:4744) 5805 0 R (0:4745) 5806 0 R (0:4746) 5807 0 R (0:4747) 5808 0 R (0:4748) 5809 0 R (0:4749) 5810 0 R (0:475) 1374 0 R (0:4750) 5811 0 R (0:4751) 5812 0 R (0:4752) 5813 0 R (0:4753) 5814 0 R (0:4754) 5815 0 R (0:4755) 5816 0 R (0:4756) 5817 0 R (0:4757) 5818 0 R (0:4758) 5819 0 R (0:4759) 5820 0 R (0:476) 1375 0 R (0:4760) 5821 0 R (0:4761) 5822 0 R (0:4762) 5823 0 R (0:4763) 5824 0 R (0:4764) 5825 0 R (0:4765) 5826 0 R (0:4766) 5827 0 R (0:4767) 5828 0 R (0:4768) 5829 0 R (0:4769) 5830 0 R (0:477) 1376 0 R (0:4770) 5831 0 R (0:4771) 5832 0 R (0:4772) 5833 0 R (0:4773) 5834 0 R (0:4774) 5835 0 R (0:4775) 5836 0 R (0:4776) 5837 0 R (0:4777) 5838 0 R (0:4778) 5839 0 R (0:4779) 5840 0 R (0:478) 1377 0 R (0:4780) 5841 0 R (0:4781) 5842 0 R (0:4782) 5843 0 R (0:4783) 5844 0 R (0:4784) 5845 0 R (0:4785) 5846 0 R (0:4786) 5847 0 R (0:4787) 5848 0 R (0:4788) 5849 0 R (0:4789) 5850 0 R (0:479) 1378 0 R (0:4790) 5851 0 R (0:4791) 5852 0 R (0:4792) 5853 0 R (0:4793) 5854 0 R (0:4794) 5855 0 R (0:4795) 5860 0 R (0:4796) 5861 0 R (0:4797) 5862 0 R (0:4798) 5863 0 R (0:4799) 5864 0 R (0:48) 946 0 R (0:480) 1379 0 R (0:4800) 5865 0 R (0:4801) 5866 0 R (0:4802) 5867 0 R (0:4803) 5868 0 R (0:4804) 5869 0 R (0:4805) 5870 0 R (0:4806) 5871 0 R (0:4807) 5872 0 R (0:4808) 5873 0 R (0:4809) 5874 0 R (0:481) 1380 0 R (0:4810) 5875 0 R (0:4811) 5876 0 R (0:4812) 5877 0 R (0:4813) 5878 0 R (0:4814) 5879 0 R (0:4815) 5880 0 R (0:4816) 5881 0 R (0:4817) 5882 0 R (0:4818) 5883 0 R (0:4819) 5884 0 R (0:482) 1381 0 R (0:4820) 5885 0 R (0:4821) 5886 0 R (0:4822) 5887 0 R (0:4823) 5888 0 R (0:4824) 5889 0 R (0:4825) 5890 0 R (0:4826) 5891 0 R (0:4827) 5892 0 R (0:4828) 5893 0 R (0:4829) 5894 0 R (0:483) 1382 0 R (0:4830) 5895 0 R (0:4831) 5896 0 R (0:4832) 5897 0 R (0:4833) 5898 0 R (0:4834) 5899 0 R (0:4835) 5900 0 R (0:4836) 5901 0 R (0:4837) 5902 0 R (0:4838) 5903 0 R (0:4839) 5904 0 R (0:484) 1383 0 R (0:4840) 5905 0 R (0:4841) 5906 0 R (0:4842) 5907 0 R (0:4843) 5908 0 R (0:4844) 5909 0 R (0:4845) 5910 0 R (0:4846) 5911 0 R (0:4847) 5912 0 R (0:4848) 5913 0 R (0:4849) 5914 0 R (0:485) 1384 0 R (0:4850) 5915 0 R (0:4851) 5916 0 R (0:4852) 5917 0 R (0:4853) 5918 0 R (0:4854) 5919 0 R (0:4855) 5920 0 R (0:4856) 5921 0 R (0:4857) 5922 0 R (0:4858) 5923 0 R (0:4859) 5924 0 R (0:486) 1385 0 R (0:4860) 5925 0 R (0:4861) 5926 0 R (0:4862) 5927 0 R (0:4863) 5932 0 R (0:4864) 5933 0 R (0:4865) 5934 0 R (0:4866) 5935 0 R (0:4867) 5936 0 R (0:4868) 5937 0 R (0:4869) 5938 0 R (0:487) 1386 0 R (0:4870) 5939 0 R (0:4871) 5940 0 R (0:4872) 5941 0 R (0:4873) 5942 0 R (0:4874) 5943 0 R (0:4875) 5944 0 R (0:4876) 5945 0 R (0:4877) 5946 0 R (0:4878) 5947 0 R (0:4879) 5948 0 R (0:488) 1387 0 R (0:4880) 5949 0 R (0:4881) 5950 0 R (0:4882) 5951 0 R (0:4883) 5952 0 R (0:4884) 5953 0 R (0:4885) 5954 0 R (0:4886) 5955 0 R (0:4887) 5956 0 R (0:4888) 5957 0 R (0:4889) 5958 0 R (0:489) 1388 0 R (0:4890) 5959 0 R (0:4891) 5960 0 R (0:4892) 5961 0 R (0:4893) 5962 0 R (0:4894) 5963 0 R (0:4895) 5964 0 R (0:4896) 5965 0 R (0:4897) 5966 0 R (0:4898) 5967 0 R (0:4899) 5968 0 R (0:49) 947 0 R (0:490) 1389 0 R (0:4900) 5969 0 R (0:4901) 5970 0 R (0:4902) 5971 0 R (0:4903) 5972 0 R (0:4904) 5973 0 R (0:4905) 5974 0 R (0:4906) 5975 0 R (0:4907) 5976 0 R (0:4908) 5977 0 R (0:4909) 5978 0 R (0:491) 1390 0 R (0:4910) 5979 0 R (0:4911) 5980 0 R (0:4912) 5981 0 R (0:4913) 5982 0 R (0:4914) 5983 0 R (0:4915) 5984 0 R (0:4916) 5985 0 R (0:4917) 5986 0 R (0:4918) 5987 0 R (0:4919) 5988 0 R (0:492) 1391 0 R (0:4920) 5989 0 R (0:4921) 5990 0 R (0:4922) 5991 0 R (0:4923) 5992 0 R (0:4924) 5993 0 R (0:4925) 5994 0 R (0:4926) 5995 0 R (0:4927) 5996 0 R (0:4928) 5997 0 R (0:4929) 5998 0 R (0:493) 1392 0 R (0:4930) 5999 0 R (0:4931) 6000 0 R (0:4932) 6001 0 R (0:4933) 6002 0 R (0:4934) 6003 0 R (0:4935) 6004 0 R (0:4936) 6009 0 R (0:4937) 6010 0 R (0:4938) 6011 0 R (0:4939) 6012 0 R (0:494) 1393 0 R (0:4940) 6013 0 R (0:4941) 6014 0 R (0:4942) 6015 0 R (0:4943) 6016 0 R (0:4944) 6017 0 R (0:4945) 6018 0 R (0:4946) 6019 0 R (0:4947) 6020 0 R (0:4948) 6021 0 R (0:4949) 6022 0 R (0:495) 1394 0 R (0:4950) 6023 0 R (0:4951) 6024 0 R (0:4952) 6025 0 R (0:4953) 6026 0 R (0:4954) 6027 0 R (0:4955) 6028 0 R (0:4956) 6029 0 R (0:4957) 6030 0 R (0:4958) 6031 0 R (0:4959) 6032 0 R (0:496) 1395 0 R (0:4960) 6033 0 R (0:4961) 6034 0 R (0:4962) 6035 0 R (0:4963) 6036 0 R (0:4966) 6037 0 R (0:4967) 6038 0 R (0:4968) 6039 0 R (0:4969) 6040 0 R (0:497) 1396 0 R (0:4970) 6041 0 R (0:4971) 6042 0 R (0:4972) 6043 0 R (0:4973) 6044 0 R (0:4974) 6045 0 R (0:4975) 6046 0 R (0:4976) 6047 0 R (0:4977) 6048 0 R (0:4978) 6049 0 R (0:4979) 6050 0 R (0:498) 1397 0 R (0:4980) 6051 0 R (0:4981) 6052 0 R (0:4982) 6053 0 R (0:4983) 6054 0 R (0:4984) 6055 0 R (0:4985) 6056 0 R (0:4986) 6057 0 R (0:4987) 6058 0 R (0:4988) 6059 0 R (0:4989) 6060 0 R (0:499) 1398 0 R (0:4990) 6065 0 R (0:4991) 6066 0 R (0:4992) 6067 0 R (0:4993) 6068 0 R (0:4994) 6069 0 R (0:4995) 6070 0 R (0:4996) 6071 0 R (0:4997) 6072 0 R (0:4998) 6073 0 R (0:4999) 6074 0 R (0:5) 916 0 R (0:500) 1399 0 R (0:5000) 6075 0 R (0:5001) 6076 0 R (0:5002) 6077 0 R (0:5003) 6078 0 R (0:5004) 6079 0 R (0:5005) 6080 0 R (0:5006) 6081 0 R (0:5007) 6082 0 R (0:5008) 6083 0 R (0:5009) 6084 0 R (0:5010) 6085 0 R (0:5011) 6086 0 R (0:5012) 6087 0 R (0:5013) 6088 0 R (0:5014) 6089 0 R (0:5015) 6090 0 R (0:5016) 6091 0 R (0:5017) 6092 0 R (0:5018) 6093 0 R (0:5019) 6094 0 R (0:5020) 6095 0 R (0:5021) 6096 0 R (0:5022) 6097 0 R (0:5023) 6098 0 R (0:5024) 6099 0 R (0:5025) 6100 0 R (0:5026) 6101 0 R (0:5027) 6102 0 R (0:5028) 6103 0 R (0:5029) 6104 0 R (0:503) 1400 0 R (0:5030) 6105 0 R (0:5031) 6106 0 R (0:5032) 6107 0 R (0:5033) 6108 0 R (0:5034) 6109 0 R (0:5035) 6110 0 R (0:5036) 6111 0 R (0:5037) 6112 0 R (0:5038) 6113 0 R (0:5039) 6114 0 R (0:504) 1401 0 R (0:5040) 6115 0 R (0:5041) 6116 0 R (0:5042) 6117 0 R (0:5043) 6118 0 R (0:5044) 6119 0 R (0:5045) 6120 0 R (0:5046) 6121 0 R (0:5047) 6122 0 R (0:5048) 6123 0 R (0:5049) 6124 0 R (0:505) 1402 0 R (0:5050) 6125 0 R (0:5051) 6126 0 R (0:5052) 6127 0 R (0:5053) 6128 0 R (0:5054) 6129 0 R (0:5055) 6130 0 R (0:5056) 6131 0 R (0:5057) 6132 0 R (0:5058) 6137 0 R (0:5059) 6138 0 R (0:506) 1403 0 R (0:5060) 6139 0 R (0:5061) 6140 0 R (0:5062) 6141 0 R (0:5063) 6142 0 R (0:5064) 6143 0 R (0:5065) 6144 0 R (0:5066) 6145 0 R (0:5067) 6146 0 R (0:5068) 6147 0 R (0:5069) 6148 0 R (0:507) 1404 0 R (0:5070) 6149 0 R (0:5071) 6150 0 R (0:5072) 6151 0 R (0:5073) 6152 0 R (0:5074) 6153 0 R (0:5075) 6154 0 R (0:5076) 6155 0 R (0:5077) 6156 0 R (0:5078) 6157 0 R (0:5079) 6158 0 R (0:508) 1405 0 R (0:5080) 6159 0 R (0:5081) 6160 0 R (0:5082) 6161 0 R (0:5083) 6162 0 R (0:5084) 6163 0 R (0:5085) 6164 0 R (0:5086) 6165 0 R (0:5087) 6166 0 R (0:5088) 6167 0 R (0:5089) 6168 0 R (0:509) 1406 0 R (0:5090) 6169 0 R (0:5091) 6170 0 R (0:5092) 6171 0 R (0:5095) 6172 0 R (0:5096) 6173 0 R (0:5097) 6174 0 R (0:5098) 6175 0 R (0:5099) 6176 0 R (0:510) 1407 0 R (0:5100) 6177 0 R (0:5101) 6178 0 R (0:5102) 6179 0 R (0:5103) 6180 0 R (0:5104) 6181 0 R (0:5105) 6182 0 R (0:5106) 6183 0 R (0:5107) 6184 0 R (0:5108) 6185 0 R (0:5109) 6186 0 R (0:511) 1408 0 R (0:5110) 6187 0 R (0:5111) 6188 0 R (0:5112) 6189 0 R (0:5113) 6190 0 R (0:5114) 6196 0 R (0:5115) 6197 0 R (0:5116) 6198 0 R (0:5117) 6199 0 R (0:5118) 6200 0 R (0:5119) 6201 0 R (0:512) 1409 0 R (0:5120) 6202 0 R (0:5121) 6203 0 R (0:5122) 6204 0 R (0:5123) 6205 0 R (0:5124) 6206 0 R (0:5125) 6207 0 R (0:5126) 6208 0 R (0:5127) 6209 0 R (0:5128) 6210 0 R (0:5129) 6211 0 R (0:513) 1410 0 R (0:5130) 6212 0 R (0:5131) 6213 0 R (0:5132) 6214 0 R (0:5133) 6215 0 R (0:5134) 6216 0 R (0:5135) 6217 0 R (0:5136) 6218 0 R (0:5137) 6219 0 R (0:5138) 6220 0 R (0:5139) 6221 0 R (0:514) 1411 0 R (0:5140) 6222 0 R (0:5141) 6223 0 R (0:5142) 6224 0 R (0:5143) 6225 0 R (0:5144) 6226 0 R (0:5145) 6227 0 R (0:5146) 6228 0 R (0:5147) 6229 0 R (0:5148) 6230 0 R (0:5149) 6231 0 R (0:515) 1417 0 R (0:5150) 6232 0 R (0:5151) 6233 0 R (0:5152) 6234 0 R (0:5153) 6235 0 R (0:5154) 6236 0 R (0:5155) 6237 0 R (0:5156) 6238 0 R (0:5157) 6239 0 R (0:5158) 6240 0 R (0:5159) 6241 0 R (0:516) 1418 0 R (0:5160) 6242 0 R (0:5161) 6243 0 R (0:5162) 6244 0 R (0:5163) 6245 0 R (0:5164) 6246 0 R (0:5165) 6247 0 R (0:5166) 6248 0 R (0:5167) 6249 0 R (0:5168) 6250 0 R (0:5169) 6251 0 R (0:517) 1419 0 R (0:5170) 6252 0 R (0:5171) 6253 0 R (0:5172) 6254 0 R (0:5173) 6255 0 R (0:5174) 6256 0 R (0:5175) 6257 0 R (0:5176) 6258 0 R (0:5177) 6259 0 R (0:5178) 6260 0 R (0:5179) 6261 0 R (0:518) 1420 0 R (0:5180) 6262 0 R (0:5181) 6263 0 R (0:5184) 6268 0 R (0:5185) 6269 0 R (0:5186) 6270 0 R (0:5187) 6271 0 R (0:5188) 6272 0 R (0:5189) 6273 0 R (0:519) 1421 0 R (0:5190) 6274 0 R (0:5191) 6275 0 R (0:5192) 6276 0 R (0:5193) 6277 0 R (0:5194) 6278 0 R (0:5195) 6279 0 R (0:5196) 6280 0 R (0:5197) 6281 0 R (0:5198) 6282 0 R (0:5199) 6283 0 R (0:520) 1422 0 R (0:5200) 6284 0 R (0:5201) 6285 0 R (0:5202) 6286 0 R (0:5203) 6287 0 R (0:5204) 6288 0 R (0:5205) 6289 0 R (0:5208) 6290 0 R (0:5209) 6291 0 R (0:521) 1423 0 R (0:5210) 6292 0 R (0:5211) 6293 0 R (0:5212) 6294 0 R (0:5213) 6295 0 R (0:5214) 6296 0 R (0:5215) 6297 0 R (0:5216) 6298 0 R (0:5217) 6299 0 R (0:5218) 6304 0 R (0:5219) 6305 0 R (0:522) 1424 0 R (0:5220) 6306 0 R (0:5221) 6307 0 R (0:5222) 6308 0 R (0:5223) 6309 0 R (0:5224) 6310 0 R (0:5225) 6311 0 R (0:5226) 6312 0 R (0:5227) 6313 0 R (0:5228) 6314 0 R (0:5229) 6315 0 R (0:523) 1425 0 R (0:5230) 6316 0 R (0:5231) 6317 0 R (0:5232) 6318 0 R (0:5233) 6319 0 R (0:5234) 6320 0 R (0:5235) 6321 0 R (0:5236) 6322 0 R (0:5237) 6323 0 R (0:5238) 6324 0 R (0:5239) 6325 0 R (0:524) 1426 0 R (0:5240) 6326 0 R (0:5241) 6327 0 R (0:5242) 6328 0 R (0:5243) 6329 0 R (0:5244) 6330 0 R (0:5245) 6331 0 R (0:5246) 6332 0 R (0:5247) 6333 0 R (0:5248) 6334 0 R (0:5249) 6335 0 R (0:525) 1427 0 R (0:5250) 6336 0 R (0:5251) 6337 0 R (0:5252) 6338 0 R (0:5253) 6339 0 R (0:5254) 6340 0 R (0:5255) 6341 0 R (0:5256) 6342 0 R (0:5257) 6343 0 R (0:5258) 6344 0 R (0:5259) 6345 0 R (0:526) 1428 0 R (0:5260) 6346 0 R (0:5261) 6347 0 R (0:5262) 6348 0 R (0:5263) 6349 0 R (0:5264) 6350 0 R (0:5265) 6351 0 R (0:5266) 6352 0 R (0:5267) 6353 0 R (0:5268) 6354 0 R (0:5269) 6355 0 R (0:527) 1429 0 R (0:5270) 6356 0 R (0:5271) 6357 0 R (0:5272) 6358 0 R (0:5273) 6359 0 R (0:5274) 6360 0 R (0:5275) 6361 0 R (0:5276) 6362 0 R (0:5277) 6363 0 R (0:5278) 6364 0 R (0:5279) 6365 0 R (0:528) 1430 0 R (0:5280) 6366 0 R (0:5281) 6367 0 R (0:5282) 6368 0 R (0:5283) 6369 0 R (0:5284) 6370 0 R (0:5285) 6371 0 R (0:5286) 6372 0 R (0:5287) 6373 0 R (0:5288) 6374 0 R (0:5289) 6375 0 R (0:529) 1431 0 R (0:5290) 6380 0 R (0:5291) 6381 0 R (0:5292) 6382 0 R (0:5293) 6383 0 R (0:5294) 6384 0 R (0:5295) 6385 0 R (0:5296) 6386 0 R (0:5297) 6387 0 R (0:5298) 6388 0 R (0:5299) 6389 0 R (0:530) 1432 0 R (0:5300) 6390 0 R (0:5301) 6391 0 R (0:5302) 6392 0 R (0:5303) 6393 0 R (0:5304) 6394 0 R (0:5305) 6395 0 R (0:5306) 6396 0 R (0:5307) 6397 0 R (0:5308) 6398 0 R (0:5309) 6399 0 R (0:531) 1433 0 R (0:5310) 6400 0 R (0:5311) 6401 0 R (0:5312) 6402 0 R (0:5313) 6403 0 R (0:5314) 6404 0 R (0:5315) 6405 0 R (0:5316) 6406 0 R (0:5317) 6407 0 R (0:5318) 6408 0 R (0:5319) 6409 0 R (0:532) 1434 0 R (0:5320) 6410 0 R (0:5321) 6411 0 R (0:5322) 6412 0 R (0:5323) 6413 0 R (0:5324) 6414 0 R (0:5325) 6415 0 R (0:5326) 6416 0 R (0:5327) 6417 0 R (0:5328) 6418 0 R (0:5329) 6419 0 R (0:533) 1435 0 R (0:5330) 6420 0 R (0:5331) 6421 0 R (0:5332) 6422 0 R (0:5333) 6423 0 R (0:5334) 6424 0 R (0:5335) 6425 0 R (0:5336) 6426 0 R (0:5337) 6427 0 R (0:5338) 6428 0 R (0:5339) 6429 0 R (0:534) 1436 0 R (0:5340) 6430 0 R (0:5341) 6431 0 R (0:5342) 6432 0 R (0:5343) 6433 0 R (0:5344) 6434 0 R (0:5345) 6435 0 R (0:5346) 6436 0 R (0:5347) 6437 0 R (0:5348) 6438 0 R (0:5349) 6439 0 R (0:535) 1437 0 R (0:5350) 6440 0 R (0:5351) 6441 0 R (0:5352) 6442 0 R (0:5353) 6443 0 R (0:5354) 6444 0 R (0:5355) 6445 0 R (0:5356) 6446 0 R (0:5357) 6447 0 R (0:5358) 6448 0 R (0:5359) 6454 0 R (0:536) 1438 0 R (0:5360) 6455 0 R (0:5361) 6456 0 R (0:5362) 6457 0 R (0:5363) 6458 0 R (0:5364) 6459 0 R (0:5365) 6460 0 R (0:5366) 6461 0 R (0:5367) 6462 0 R (0:5368) 6463 0 R (0:5369) 6464 0 R (0:537) 1439 0 R (0:5370) 6465 0 R (0:5371) 6466 0 R (0:5372) 6467 0 R (0:5373) 6468 0 R (0:5374) 6469 0 R (0:5375) 6470 0 R (0:5376) 6471 0 R (0:5377) 6472 0 R (0:5378) 6473 0 R (0:5379) 6474 0 R (0:538) 1440 0 R (0:5380) 6475 0 R (0:5381) 6476 0 R (0:5382) 6477 0 R (0:5383) 6478 0 R (0:5384) 6479 0 R (0:5385) 6480 0 R (0:5386) 6481 0 R (0:5387) 6482 0 R (0:5388) 6483 0 R (0:5389) 6484 0 R (0:539) 1441 0 R (0:5390) 6485 0 R (0:5391) 6486 0 R (0:5392) 6487 0 R (0:5393) 6488 0 R (0:5394) 6489 0 R (0:5395) 6490 0 R (0:5396) 6491 0 R (0:5397) 6492 0 R (0:5398) 6493 0 R (0:5399) 6494 0 R (0:540) 1442 0 R (0:5400) 6495 0 R (0:5401) 6496 0 R (0:5404) 6497 0 R (0:5405) 6498 0 R (0:5406) 6499 0 R (0:5407) 6500 0 R (0:5408) 6501 0 R (0:5409) 6502 0 R (0:541) 1443 0 R (0:5410) 6503 0 R (0:5411) 6504 0 R (0:5412) 6509 0 R (0:5413) 6453 0 R (0:5416) 6510 0 R (0:5417) 6511 0 R (0:5418) 6512 0 R (0:5419) 6513 0 R (0:542) 1444 0 R (0:5420) 6514 0 R (0:5421) 6515 0 R (0:5422) 6516 0 R (0:5423) 6517 0 R (0:5424) 6518 0 R (0:5425) 6519 0 R (0:5426) 6520 0 R (0:5427) 6521 0 R (0:5428) 6522 0 R (0:5429) 6523 0 R (0:543) 1445 0 R (0:5430) 6524 0 R (0:5431) 6525 0 R (0:5432) 6526 0 R (0:5433) 6527 0 R (0:5434) 6528 0 R (0:5435) 6529 0 R (0:5436) 6530 0 R (0:5439) 6531 0 R (0:544) 1446 0 R (0:5440) 6532 0 R (0:5441) 6533 0 R (0:5442) 6534 0 R (0:5443) 6535 0 R (0:5444) 6536 0 R (0:5445) 6537 0 R (0:5446) 6538 0 R (0:5447) 6539 0 R (0:5448) 6540 0 R (0:5449) 6541 0 R (0:545) 1447 0 R (0:5450) 6542 0 R (0:5451) 6543 0 R (0:5452) 6544 0 R (0:5453) 6545 0 R (0:5454) 6546 0 R (0:5455) 6547 0 R (0:5456) 6548 0 R (0:5457) 6549 0 R (0:5458) 6555 0 R (0:5459) 6556 0 R (0:546) 1448 0 R (0:5460) 6557 0 R (0:5461) 6558 0 R (0:5462) 6559 0 R (0:5463) 6560 0 R (0:5464) 6561 0 R (0:5465) 6562 0 R (0:5466) 6563 0 R (0:5467) 6564 0 R (0:5468) 6565 0 R (0:5469) 6566 0 R (0:547) 1449 0 R (0:5470) 6567 0 R (0:5471) 6568 0 R (0:5472) 6569 0 R (0:5473) 6570 0 R (0:5474) 6571 0 R (0:5475) 6572 0 R (0:5476) 6573 0 R (0:5477) 6574 0 R (0:5478) 6575 0 R (0:5479) 6576 0 R (0:548) 1450 0 R (0:5480) 6577 0 R (0:5481) 6578 0 R (0:5482) 6579 0 R (0:5483) 6580 0 R (0:5484) 6581 0 R (0:5485) 6582 0 R (0:5486) 6583 0 R (0:5487) 6584 0 R (0:5488) 6585 0 R (0:5489) 6586 0 R (0:549) 1451 0 R (0:5490) 6587 0 R (0:5491) 6588 0 R (0:5492) 6589 0 R (0:5493) 6590 0 R (0:5494) 6591 0 R (0:5495) 6592 0 R (0:5496) 6593 0 R (0:5497) 6594 0 R (0:5498) 6595 0 R (0:5499) 6596 0 R (0:550) 1452 0 R (0:5500) 6597 0 R (0:5501) 6598 0 R (0:5502) 6599 0 R (0:5503) 6600 0 R (0:5504) 6601 0 R (0:5505) 6602 0 R (0:5506) 6603 0 R (0:5507) 6604 0 R (0:5508) 6605 0 R (0:5509) 6606 0 R (0:551) 1453 0 R (0:5510) 6607 0 R (0:5511) 6608 0 R (0:5512) 6609 0 R (0:5513) 6610 0 R (0:5514) 6611 0 R (0:5515) 6612 0 R (0:5516) 6613 0 R (0:5517) 6614 0 R (0:5518) 6615 0 R (0:5519) 6616 0 R (0:552) 1454 0 R (0:5520) 6617 0 R (0:5521) 6618 0 R (0:5522) 6619 0 R (0:5523) 6620 0 R (0:5524) 6621 0 R (0:5525) 6622 0 R (0:5526) 6623 0 R (0:5527) 6624 0 R (0:5528) 6625 0 R (0:5529) 6626 0 R (0:553) 1455 0 R (0:5530) 6627 0 R (0:5531) 6628 0 R (0:5532) 6629 0 R (0:5533) 6630 0 R (0:5534) 6631 0 R (0:5535) 6632 0 R (0:5536) 6633 0 R (0:5537) 6634 0 R (0:5538) 6635 0 R (0:5539) 6636 0 R (0:554) 1456 0 R (0:5540) 6637 0 R (0:5541) 6638 0 R (0:5542) 6639 0 R (0:5543) 6640 0 R (0:5544) 6641 0 R (0:5545) 6642 0 R (0:5546) 6643 0 R (0:5547) 6644 0 R (0:5548) 6645 0 R (0:5549) 6646 0 R (0:555) 1457 0 R (0:5550) 6647 0 R (0:5551) 6648 0 R (0:5552) 6654 0 R (0:5553) 6655 0 R (0:5554) 6656 0 R (0:5555) 6657 0 R (0:5556) 6658 0 R (0:5557) 6659 0 R (0:5558) 6660 0 R (0:5559) 6661 0 R (0:556) 1458 0 R (0:5560) 6662 0 R (0:5561) 6663 0 R (0:5562) 6664 0 R (0:5563) 6665 0 R (0:5564) 6666 0 R (0:5565) 6667 0 R (0:5566) 6668 0 R (0:5567) 6669 0 R (0:5568) 6670 0 R (0:5569) 6671 0 R (0:557) 1459 0 R (0:5570) 6672 0 R (0:5571) 6673 0 R (0:5572) 6674 0 R (0:5573) 6675 0 R (0:5574) 6676 0 R (0:5575) 6677 0 R (0:5576) 6678 0 R (0:5577) 6679 0 R (0:5578) 6680 0 R (0:5579) 6681 0 R (0:558) 1460 0 R (0:5580) 6682 0 R (0:5581) 6683 0 R (0:5582) 6684 0 R (0:5583) 6685 0 R (0:5584) 6686 0 R (0:5585) 6687 0 R (0:5586) 6688 0 R (0:5587) 6689 0 R (0:5588) 6690 0 R (0:5589) 6691 0 R (0:559) 1461 0 R (0:5590) 6692 0 R (0:5591) 6693 0 R (0:5592) 6694 0 R (0:5593) 6695 0 R (0:5594) 6696 0 R (0:5595) 6697 0 R (0:5596) 6698 0 R (0:5597) 6699 0 R (0:5598) 6700 0 R (0:5599) 6701 0 R (0:560) 1462 0 R (0:5600) 6702 0 R (0:5601) 6703 0 R (0:5602) 6704 0 R (0:5603) 6705 0 R (0:5604) 6706 0 R (0:5605) 6707 0 R (0:5606) 6708 0 R (0:5607) 6709 0 R (0:5608) 6710 0 R (0:5609) 6711 0 R (0:561) 1463 0 R (0:5610) 6712 0 R (0:5611) 6713 0 R (0:5612) 6714 0 R (0:5613) 6715 0 R (0:5616) 6716 0 R (0:5617) 6717 0 R (0:5618) 6718 0 R (0:5619) 6719 0 R (0:562) 1464 0 R (0:5620) 6720 0 R (0:5621) 6725 0 R (0:5622) 6653 0 R (0:5623) 6726 0 R (0:5624) 6727 0 R (0:5625) 6728 0 R (0:5626) 6729 0 R (0:5627) 6730 0 R (0:5628) 6731 0 R (0:5629) 6732 0 R (0:563) 1465 0 R (0:5630) 6733 0 R (0:5631) 6734 0 R (0:5632) 6735 0 R (0:5633) 6736 0 R (0:5634) 6737 0 R (0:5635) 6738 0 R (0:5636) 6739 0 R (0:5637) 6740 0 R (0:5638) 6741 0 R (0:5639) 6742 0 R (0:564) 1466 0 R (0:5640) 6743 0 R (0:5641) 6744 0 R (0:5642) 6745 0 R (0:5643) 6746 0 R (0:5644) 6747 0 R (0:5645) 6748 0 R (0:5646) 6749 0 R (0:5647) 6750 0 R (0:5648) 6751 0 R (0:5649) 6752 0 R (0:565) 1467 0 R (0:5650) 6753 0 R (0:5651) 6754 0 R (0:5652) 6755 0 R (0:5653) 6756 0 R (0:5654) 6757 0 R (0:5655) 6758 0 R (0:5656) 6759 0 R (0:5657) 6760 0 R (0:5658) 6761 0 R (0:5659) 6762 0 R (0:566) 1468 0 R (0:5660) 6763 0 R (0:5661) 6764 0 R (0:5662) 6765 0 R (0:5663) 6766 0 R (0:5664) 6767 0 R (0:5665) 6768 0 R (0:5666) 6769 0 R (0:5667) 6770 0 R (0:5668) 6771 0 R (0:5669) 6772 0 R (0:567) 1469 0 R (0:5670) 6773 0 R (0:5671) 6774 0 R (0:5672) 6775 0 R (0:5673) 6776 0 R (0:5674) 6777 0 R (0:5675) 6778 0 R (0:5676) 6779 0 R (0:5677) 6780 0 R (0:5678) 6781 0 R (0:5679) 6782 0 R (0:568) 1470 0 R (0:5680) 6783 0 R (0:5681) 6784 0 R (0:5682) 6785 0 R (0:5683) 6786 0 R (0:5684) 6787 0 R (0:5685) 6788 0 R (0:5686) 6789 0 R (0:5687) 6790 0 R (0:5688) 6795 0 R (0:5689) 6796 0 R (0:569) 1471 0 R (0:5690) 6797 0 R (0:5691) 6798 0 R (0:5692) 6799 0 R (0:5693) 6800 0 R (0:5694) 6801 0 R (0:5695) 6802 0 R (0:5696) 6803 0 R (0:5697) 6804 0 R (0:5698) 6805 0 R (0:5699) 6806 0 R (0:570) 1472 0 R (0:5700) 6807 0 R (0:5701) 6808 0 R (0:5702) 6809 0 R (0:5703) 6810 0 R (0:5704) 6811 0 R (0:5705) 6812 0 R (0:5706) 6813 0 R (0:5707) 6814 0 R (0:5708) 6815 0 R (0:5709) 6816 0 R (0:571) 1473 0 R (0:5710) 6817 0 R (0:5711) 6818 0 R (0:5712) 6819 0 R (0:5713) 6820 0 R (0:5714) 6821 0 R (0:5715) 6822 0 R (0:5716) 6823 0 R (0:5717) 6824 0 R (0:5718) 6825 0 R (0:5719) 6826 0 R (0:572) 1474 0 R (0:5720) 6827 0 R (0:5721) 6828 0 R (0:5722) 6829 0 R (0:5723) 6830 0 R (0:5724) 6831 0 R (0:5725) 6832 0 R (0:5726) 6833 0 R (0:5727) 6834 0 R (0:5728) 6835 0 R (0:5729) 6836 0 R (0:573) 1475 0 R (0:5730) 6837 0 R (0:5731) 6838 0 R (0:5732) 6839 0 R (0:5733) 6840 0 R (0:5734) 6841 0 R (0:5735) 6842 0 R (0:5736) 6843 0 R (0:5737) 6844 0 R (0:5738) 6845 0 R (0:5739) 6846 0 R (0:574) 1476 0 R (0:5740) 6847 0 R (0:5741) 6848 0 R (0:5742) 6849 0 R (0:5743) 6850 0 R (0:5744) 6851 0 R (0:5745) 6852 0 R (0:5746) 6853 0 R (0:5747) 6854 0 R (0:5748) 6855 0 R (0:5749) 6856 0 R (0:575) 1477 0 R (0:5750) 6857 0 R (0:5751) 6858 0 R (0:5752) 6859 0 R (0:5753) 6860 0 R (0:5754) 6861 0 R (0:5755) 6862 0 R (0:5756) 6863 0 R (0:5757) 6864 0 R (0:5758) 6869 0 R (0:5759) 6870 0 R (0:576) 1478 0 R (0:5760) 6871 0 R (0:5761) 6872 0 R (0:5762) 6873 0 R (0:5763) 6874 0 R (0:5764) 6875 0 R (0:5765) 6876 0 R (0:5766) 6877 0 R (0:5767) 6878 0 R (0:5768) 6879 0 R (0:5769) 6880 0 R (0:577) 1479 0 R (0:5770) 6881 0 R (0:5771) 6882 0 R (0:5772) 6883 0 R (0:5773) 6884 0 R (0:5774) 6885 0 R (0:5775) 6886 0 R (0:5776) 6887 0 R (0:5777) 6888 0 R (0:5778) 6889 0 R (0:5779) 6890 0 R (0:578) 1480 0 R (0:5780) 6891 0 R (0:5781) 6892 0 R (0:5782) 6893 0 R (0:5783) 6894 0 R (0:5784) 6895 0 R (0:5785) 6896 0 R (0:5786) 6897 0 R (0:5789) 6898 0 R (0:5790) 6899 0 R (0:5791) 6900 0 R (0:5792) 6901 0 R (0:5793) 6902 0 R (0:5794) 6903 0 R (0:5795) 6904 0 R (0:5796) 6905 0 R (0:5797) 6906 0 R (0:5798) 6907 0 R (0:5799) 6908 0 R (0:5800) 6913 0 R (0:5801) 6914 0 R (0:5802) 6915 0 R (0:5803) 6916 0 R (0:5804) 6917 0 R (0:5805) 6918 0 R (0:5806) 6919 0 R (0:5807) 6920 0 R (0:5808) 6921 0 R (0:5809) 6922 0 R (0:581) 1481 0 R (0:5810) 6923 0 R (0:5811) 6924 0 R (0:5812) 6925 0 R (0:5813) 6926 0 R (0:5814) 6927 0 R (0:5815) 6928 0 R (0:5816) 6929 0 R (0:5817) 6930 0 R (0:5818) 6931 0 R (0:5819) 6932 0 R (0:582) 1482 0 R (0:5820) 6933 0 R (0:5823) 6934 0 R (0:5824) 6935 0 R (0:5825) 6936 0 R (0:5826) 6937 0 R (0:5827) 6938 0 R (0:5828) 6939 0 R (0:5829) 6940 0 R (0:583) 1483 0 R (0:5830) 6941 0 R (0:5831) 6942 0 R (0:5832) 6943 0 R (0:5833) 6944 0 R (0:5834) 6945 0 R (0:5835) 6946 0 R (0:5836) 6947 0 R (0:5837) 6948 0 R (0:5838) 6949 0 R (0:5839) 6950 0 R (0:584) 1484 0 R (0:5840) 6951 0 R (0:5841) 6952 0 R (0:5842) 6953 0 R (0:5843) 6954 0 R (0:5844) 6955 0 R (0:5845) 6956 0 R (0:5846) 6957 0 R (0:5847) 6958 0 R (0:5848) 6959 0 R (0:5849) 6960 0 R (0:585) 1485 0 R (0:5850) 6961 0 R (0:5851) 6962 0 R (0:5852) 6969 0 R (0:5855) 6970 0 R (0:5856) 6971 0 R (0:5857) 6972 0 R (0:5858) 6973 0 R (0:5859) 6974 0 R (0:586) 1492 0 R (0:5860) 6975 0 R (0:5861) 6976 0 R (0:5862) 6977 0 R (0:5863) 6978 0 R (0:5864) 6979 0 R (0:5865) 6980 0 R (0:5866) 6981 0 R (0:5867) 6982 0 R (0:5868) 6983 0 R (0:5869) 6984 0 R (0:587) 1416 0 R (0:5870) 6985 0 R (0:5871) 6986 0 R (0:5872) 6987 0 R (0:5873) 6988 0 R (0:5874) 6989 0 R (0:5875) 6990 0 R (0:5876) 6991 0 R (0:5877) 6992 0 R (0:5878) 6993 0 R (0:5879) 6994 0 R (0:588) 1493 0 R (0:5880) 6995 0 R (0:5881) 6996 0 R (0:5882) 6997 0 R (0:5883) 6998 0 R (0:5884) 6999 0 R (0:5885) 7000 0 R (0:5886) 7001 0 R (0:5887) 7002 0 R (0:5888) 7003 0 R (0:5889) 7004 0 R (0:589) 1494 0 R (0:5890) 7005 0 R (0:5891) 7006 0 R (0:5892) 7007 0 R (0:5895) 7012 0 R (0:5896) 7013 0 R (0:5897) 7014 0 R (0:5898) 6968 0 R (0:590) 1495 0 R (0:5901) 7015 0 R (0:5902) 7016 0 R (0:5903) 7017 0 R (0:5904) 7018 0 R (0:5905) 7019 0 R (0:5906) 7020 0 R (0:5907) 7021 0 R (0:5908) 7022 0 R (0:5909) 7023 0 R (0:591) 1496 0 R (0:5910) 7024 0 R (0:5911) 7025 0 R (0:5912) 7026 0 R (0:5913) 7027 0 R (0:5914) 7028 0 R (0:5915) 7029 0 R (0:5916) 7030 0 R (0:5917) 7031 0 R (0:5918) 7032 0 R (0:5919) 7033 0 R (0:592) 1497 0 R (0:5920) 7034 0 R (0:5921) 7035 0 R (0:5922) 7036 0 R (0:5923) 7037 0 R (0:5924) 7038 0 R (0:5925) 7039 0 R (0:5926) 7040 0 R (0:5927) 7041 0 R (0:5928) 7042 0 R (0:5929) 7043 0 R (0:593) 1498 0 R (0:5930) 7044 0 R (0:5931) 7045 0 R (0:5932) 7046 0 R (0:5933) 7047 0 R (0:5936) 7048 0 R (0:5937) 7049 0 R (0:5938) 7050 0 R (0:5939) 7056 0 R (0:594) 1499 0 R (0:5940) 7057 0 R (0:5941) 7058 0 R (0:5942) 7059 0 R (0:5943) 7060 0 R (0:5944) 7061 0 R (0:5945) 7062 0 R (0:5946) 7063 0 R (0:5947) 7064 0 R (0:5948) 7065 0 R (0:5949) 7066 0 R (0:595) 1500 0 R (0:5950) 7067 0 R (0:5951) 7068 0 R (0:5952) 7069 0 R (0:5953) 7070 0 R (0:5954) 7071 0 R (0:5955) 7072 0 R (0:5956) 7073 0 R (0:5957) 7074 0 R (0:5958) 7075 0 R (0:5959) 7076 0 R (0:596) 1501 0 R (0:5960) 7077 0 R (0:5961) 7078 0 R (0:5962) 7079 0 R (0:5963) 7080 0 R (0:5964) 7081 0 R (0:5965) 7082 0 R (0:5966) 7083 0 R (0:5967) 7084 0 R (0:5968) 7085 0 R (0:5969) 7086 0 R (0:597) 1502 0 R (0:5970) 7087 0 R (0:5971) 7088 0 R (0:5972) 7089 0 R (0:5973) 7090 0 R (0:5974) 7091 0 R (0:5975) 7092 0 R (0:5976) 7093 0 R (0:5977) 7094 0 R (0:5978) 7095 0 R (0:5979) 7096 0 R (0:598) 1503 0 R (0:5980) 7097 0 R (0:5981) 7098 0 R (0:5982) 7099 0 R (0:5983) 7100 0 R (0:5984) 7101 0 R (0:5985) 7102 0 R (0:5986) 7103 0 R (0:5987) 7104 0 R (0:599) 1504 0 R (0:5990) 7105 0 R (0:5991) 7106 0 R (0:5992) 7107 0 R (0:5993) 7108 0 R (0:5994) 7109 0 R (0:5995) 7115 0 R (0:5996) 7055 0 R (0:5997) 7116 0 R (0:5998) 7117 0 R (0:5999) 7118 0 R (0:600) 1505 0 R (0:6000) 7119 0 R (0:6001) 7120 0 R (0:6002) 7121 0 R (0:6003) 7122 0 R (0:6004) 7123 0 R (0:6005) 7124 0 R (0:6006) 7125 0 R (0:6007) 7126 0 R (0:6008) 7127 0 R (0:6009) 7128 0 R (0:601) 1506 0 R (0:6010) 7129 0 R (0:6011) 7130 0 R (0:6012) 7131 0 R (0:6013) 7132 0 R (0:6014) 7133 0 R (0:6015) 7134 0 R (0:6016) 7135 0 R (0:6017) 7136 0 R (0:6018) 7137 0 R (0:6019) 7138 0 R (0:602) 1507 0 R (0:6020) 7139 0 R (0:6021) 7140 0 R (0:6022) 7141 0 R (0:6023) 7142 0 R (0:6024) 7143 0 R (0:6025) 7144 0 R (0:6026) 7145 0 R (0:6027) 7146 0 R (0:6028) 7147 0 R (0:6029) 7148 0 R (0:603) 1508 0 R (0:6030) 7149 0 R (0:6033) 7150 0 R (0:6034) 7151 0 R (0:6035) 7152 0 R (0:6036) 7153 0 R (0:6037) 7154 0 R (0:6038) 7155 0 R (0:6039) 7156 0 R (0:604) 1509 0 R (0:6040) 7157 0 R (0:6041) 7158 0 R (0:6042) 7164 0 R (0:6043) 7114 0 R (0:6044) 7165 0 R (0:6045) 7166 0 R (0:6046) 7167 0 R (0:6047) 7168 0 R (0:6048) 7169 0 R (0:6049) 7170 0 R (0:605) 1510 0 R (0:6050) 7171 0 R (0:6051) 7172 0 R (0:6052) 7173 0 R (0:6053) 7174 0 R (0:6054) 7175 0 R (0:6055) 7176 0 R (0:6056) 7177 0 R (0:6057) 7178 0 R (0:6058) 7179 0 R (0:6059) 7180 0 R (0:606) 1511 0 R (0:6060) 7181 0 R (0:6061) 7182 0 R (0:6062) 7183 0 R (0:6063) 7184 0 R (0:6064) 7185 0 R (0:6065) 7186 0 R (0:6066) 7187 0 R (0:6067) 7188 0 R (0:6068) 7189 0 R (0:6069) 7190 0 R (0:607) 1512 0 R (0:6070) 7191 0 R (0:6071) 7192 0 R (0:6072) 7193 0 R (0:6073) 7194 0 R (0:6074) 7195 0 R (0:6075) 7196 0 R (0:6076) 7197 0 R (0:6077) 7198 0 R (0:6078) 7199 0 R (0:6079) 7200 0 R (0:608) 1513 0 R (0:6080) 7201 0 R (0:6081) 7202 0 R (0:6082) 7203 0 R (0:6083) 7204 0 R (0:6084) 7205 0 R (0:6085) 7206 0 R (0:6086) 7207 0 R (0:6087) 7208 0 R (0:6088) 7209 0 R (0:6089) 7210 0 R (0:609) 1514 0 R (0:6090) 7211 0 R (0:6091) 7212 0 R (0:6092) 7213 0 R (0:6093) 7214 0 R (0:6094) 7215 0 R (0:6095) 7216 0 R (0:6098) 7217 0 R (0:6099) 7218 0 R (0:610) 1515 0 R (0:6100) 7219 0 R (0:6101) 7220 0 R (0:6102) 7221 0 R (0:6103) 7222 0 R (0:6104) 7223 0 R (0:6105) 7228 0 R (0:6106) 7163 0 R (0:6109) 7229 0 R (0:611) 1516 0 R (0:6110) 7230 0 R (0:6111) 7231 0 R (0:6112) 7232 0 R (0:6113) 7233 0 R (0:6114) 7234 0 R (0:6115) 7235 0 R (0:6116) 7236 0 R (0:6117) 7237 0 R (0:6118) 7238 0 R (0:6119) 7239 0 R (0:612) 1517 0 R (0:6120) 7240 0 R (0:6121) 7241 0 R (0:6122) 7242 0 R (0:6123) 7243 0 R (0:6124) 7244 0 R (0:6125) 7245 0 R (0:6126) 7246 0 R (0:6127) 7247 0 R (0:6128) 7248 0 R (0:6129) 7249 0 R (0:613) 1518 0 R (0:6130) 7250 0 R (0:6131) 7251 0 R (0:6132) 7252 0 R (0:6133) 7253 0 R (0:6134) 7254 0 R (0:6137) 7255 0 R (0:6138) 7256 0 R (0:6139) 7257 0 R (0:614) 1519 0 R (0:6140) 7258 0 R (0:6141) 7259 0 R (0:6142) 7260 0 R (0:6143) 7261 0 R (0:6144) 7262 0 R (0:6145) 7263 0 R (0:6146) 7264 0 R (0:6147) 7265 0 R (0:6148) 7266 0 R (0:6149) 7267 0 R (0:615) 1520 0 R (0:6150) 7268 0 R (0:6151) 7269 0 R (0:6152) 7270 0 R (0:6153) 7271 0 R (0:6154) 7272 0 R (0:6155) 7273 0 R (0:6156) 7280 0 R (0:6157) 7281 0 R (0:6158) 7282 0 R (0:6159) 7283 0 R (0:616) 1521 0 R (0:6160) 7284 0 R (0:6161) 7285 0 R (0:6162) 7286 0 R (0:6163) 7287 0 R (0:6164) 7288 0 R (0:6165) 7289 0 R (0:6166) 7290 0 R (0:6167) 7291 0 R (0:6168) 7292 0 R (0:6169) 7293 0 R (0:617) 1522 0 R (0:6170) 7294 0 R (0:6171) 7295 0 R (0:6172) 7296 0 R (0:6175) 7297 0 R (0:6176) 7298 0 R (0:6177) 7299 0 R (0:6178) 7300 0 R (0:6179) 7301 0 R (0:618) 1523 0 R (0:6180) 7302 0 R (0:6181) 7303 0 R (0:6182) 7304 0 R (0:6183) 7305 0 R (0:6184) 7306 0 R (0:6185) 7307 0 R (0:6186) 7308 0 R (0:6187) 7309 0 R (0:6188) 7310 0 R (0:6189) 7311 0 R (0:619) 1524 0 R (0:6190) 7312 0 R (0:6191) 7313 0 R (0:6192) 7314 0 R (0:6193) 7315 0 R (0:6194) 7316 0 R (0:6195) 7317 0 R (0:6196) 7318 0 R (0:6197) 7319 0 R (0:6198) 7320 0 R (0:6199) 7321 0 R (0:620) 1525 0 R (0:6200) 7322 0 R (0:6201) 7323 0 R (0:6202) 7324 0 R (0:6203) 7325 0 R (0:6204) 7326 0 R (0:6205) 7327 0 R (0:6206) 7328 0 R (0:6207) 7329 0 R (0:6208) 7330 0 R (0:6209) 7331 0 R (0:621) 1526 0 R (0:6210) 7332 0 R (0:6211) 7333 0 R (0:6212) 7279 0 R (0:6213) 7338 0 R (0:6214) 7339 0 R (0:6215) 7340 0 R (0:6218) 7341 0 R (0:6219) 7342 0 R (0:622) 1527 0 R (0:6220) 7343 0 R (0:6221) 7344 0 R (0:6222) 7345 0 R (0:6223) 7346 0 R (0:6224) 7347 0 R (0:6225) 7348 0 R (0:6226) 7349 0 R (0:6227) 7350 0 R (0:6228) 7351 0 R (0:6229) 7352 0 R (0:623) 1528 0 R (0:6230) 7353 0 R (0:6231) 7354 0 R (0:6232) 7355 0 R (0:6233) 7356 0 R (0:6234) 7357 0 R (0:6235) 7358 0 R (0:6236) 7359 0 R (0:6237) 7360 0 R (0:6238) 7361 0 R (0:6239) 7362 0 R (0:624) 1529 0 R (0:6240) 7363 0 R (0:6241) 7364 0 R (0:6242) 7365 0 R (0:6243) 7366 0 R (0:6244) 7367 0 R (0:6245) 7368 0 R (0:6246) 7369 0 R (0:6247) 7370 0 R (0:6248) 7371 0 R (0:6249) 7372 0 R (0:625) 1530 0 R (0:6250) 7373 0 R (0:6251) 7374 0 R (0:6252) 7375 0 R (0:6253) 7376 0 R (0:6254) 7377 0 R (0:6255) 7378 0 R (0:6256) 7379 0 R (0:6257) 7380 0 R (0:6258) 7381 0 R (0:6259) 7382 0 R (0:626) 1531 0 R (0:6260) 7383 0 R (0:6261) 7384 0 R (0:6262) 7385 0 R (0:6263) 7386 0 R (0:6264) 7391 0 R (0:6265) 7392 0 R (0:6266) 7393 0 R (0:6267) 7394 0 R (0:6268) 7395 0 R (0:6269) 7396 0 R (0:627) 1532 0 R (0:6270) 7397 0 R (0:6271) 7398 0 R (0:6272) 7399 0 R (0:6273) 7400 0 R (0:6274) 7401 0 R (0:6275) 7402 0 R (0:6276) 7403 0 R (0:6277) 7404 0 R (0:6278) 7405 0 R (0:6279) 7406 0 R (0:628) 1533 0 R (0:6280) 7407 0 R (0:6281) 7408 0 R (0:6282) 7409 0 R (0:6283) 7410 0 R (0:6284) 7411 0 R (0:6285) 7412 0 R (0:6286) 7413 0 R (0:6287) 7414 0 R (0:6290) 7415 0 R (0:6291) 7416 0 R (0:6292) 7417 0 R (0:6293) 7418 0 R (0:6294) 7419 0 R (0:6295) 7420 0 R (0:6296) 7421 0 R (0:6297) 7422 0 R (0:6298) 7423 0 R (0:6299) 7424 0 R (0:63) 952 0 R (0:6300) 7425 0 R (0:6301) 7426 0 R (0:6302) 7427 0 R (0:6303) 7428 0 R (0:6304) 7429 0 R (0:6305) 7430 0 R (0:6306) 7431 0 R (0:6307) 7432 0 R (0:6308) 7433 0 R (0:6309) 7434 0 R (0:631) 1534 0 R (0:6310) 7435 0 R (0:6311) 7436 0 R (0:6312) 7437 0 R (0:6313) 7438 0 R (0:6314) 7439 0 R (0:6315) 7440 0 R (0:6316) 7441 0 R (0:6317) 7442 0 R (0:6318) 7447 0 R (0:6319) 7448 0 R (0:632) 1535 0 R (0:6320) 7449 0 R (0:6321) 7450 0 R (0:6322) 7451 0 R (0:6323) 7452 0 R (0:6324) 7453 0 R (0:6325) 7454 0 R (0:6326) 7455 0 R (0:6327) 7456 0 R (0:6328) 7457 0 R (0:6329) 7458 0 R (0:633) 1536 0 R (0:6330) 7459 0 R (0:6331) 7460 0 R (0:6332) 7461 0 R (0:6333) 7462 0 R (0:6334) 7463 0 R (0:6335) 7464 0 R (0:6336) 7465 0 R (0:6337) 7466 0 R (0:6338) 7467 0 R (0:6339) 7468 0 R (0:634) 1537 0 R (0:6340) 7469 0 R (0:6341) 7470 0 R (0:6342) 7471 0 R (0:6343) 7472 0 R (0:6344) 7473 0 R (0:6345) 7474 0 R (0:6346) 7475 0 R (0:6349) 7476 0 R (0:635) 1538 0 R (0:6350) 7477 0 R (0:6351) 7478 0 R (0:6352) 7479 0 R (0:6353) 7480 0 R (0:6354) 7481 0 R (0:6355) 7482 0 R (0:6356) 7483 0 R (0:6357) 7484 0 R (0:6358) 7485 0 R (0:6359) 7486 0 R (0:636) 1539 0 R (0:6360) 7487 0 R (0:6361) 7488 0 R (0:6362) 7489 0 R (0:6363) 7490 0 R (0:6364) 7491 0 R (0:6365) 7492 0 R (0:6366) 7493 0 R (0:6367) 7494 0 R (0:6368) 7495 0 R (0:6369) 7496 0 R (0:637) 1545 0 R (0:6370) 7497 0 R (0:6371) 7498 0 R (0:6372) 7499 0 R (0:6373) 7504 0 R (0:6374) 7505 0 R (0:6375) 7506 0 R (0:6376) 7507 0 R (0:6377) 7508 0 R (0:6378) 7509 0 R (0:6379) 7510 0 R (0:638) 1491 0 R (0:6380) 7511 0 R (0:6381) 7512 0 R (0:6382) 7513 0 R (0:6383) 7514 0 R (0:6384) 7515 0 R (0:6385) 7516 0 R (0:6386) 7517 0 R (0:6387) 7518 0 R (0:6388) 7519 0 R (0:6389) 7520 0 R (0:6390) 7521 0 R (0:6391) 7522 0 R (0:6392) 7523 0 R (0:6393) 7524 0 R (0:6394) 7525 0 R (0:6395) 7526 0 R (0:6396) 7527 0 R (0:6397) 7528 0 R (0:6398) 7529 0 R (0:6399) 7530 0 R (0:64) 953 0 R (0:6400) 7531 0 R (0:6401) 7532 0 R (0:6402) 7533 0 R (0:6403) 7534 0 R (0:6404) 7535 0 R (0:6405) 7536 0 R (0:6406) 7537 0 R (0:6407) 7538 0 R (0:6408) 7539 0 R (0:6409) 7540 0 R (0:641) 1546 0 R (0:6410) 7541 0 R (0:6411) 7542 0 R (0:6412) 7543 0 R (0:6415) 7544 0 R (0:6416) 7545 0 R (0:6417) 7546 0 R (0:6418) 7547 0 R (0:6419) 7548 0 R (0:642) 1547 0 R (0:6420) 7549 0 R (0:6421) 7550 0 R (0:6422) 7551 0 R (0:6423) 7552 0 R (0:6424) 7553 0 R (0:6425) 7554 0 R (0:6426) 7555 0 R (0:6427) 7556 0 R (0:6428) 7557 0 R (0:6429) 7558 0 R (0:643) 1548 0 R (0:6430) 7559 0 R (0:6431) 7560 0 R (0:6432) 7565 0 R (0:6433) 7566 0 R (0:6434) 7567 0 R (0:6435) 7568 0 R (0:6436) 7569 0 R (0:6437) 7570 0 R (0:6438) 7571 0 R (0:6439) 7572 0 R (0:644) 1549 0 R (0:6440) 7573 0 R (0:6441) 7574 0 R (0:6442) 7575 0 R (0:6443) 7576 0 R (0:6444) 7577 0 R (0:6445) 7578 0 R (0:6446) 7579 0 R (0:6447) 7580 0 R (0:6448) 7581 0 R (0:6449) 7582 0 R (0:645) 1550 0 R (0:6450) 7583 0 R (0:6451) 7584 0 R (0:6452) 7585 0 R (0:6453) 7586 0 R (0:6454) 7587 0 R (0:6455) 7588 0 R (0:6456) 7589 0 R (0:6457) 7590 0 R (0:6458) 7591 0 R (0:6459) 7592 0 R (0:646) 1551 0 R (0:6460) 7593 0 R (0:6461) 7594 0 R (0:6464) 7595 0 R (0:6465) 7596 0 R (0:6466) 7597 0 R (0:6467) 7598 0 R (0:6468) 7599 0 R (0:6469) 7600 0 R (0:647) 1552 0 R (0:6470) 7601 0 R (0:6471) 7602 0 R (0:6472) 7603 0 R (0:6473) 7604 0 R (0:6474) 7605 0 R (0:6475) 7606 0 R (0:6476) 7607 0 R (0:6477) 7608 0 R (0:6478) 7609 0 R (0:6479) 7610 0 R (0:648) 1553 0 R (0:6480) 7611 0 R (0:6481) 7612 0 R (0:6482) 7613 0 R (0:6483) 7614 0 R (0:6484) 7620 0 R (0:6485) 7621 0 R (0:6486) 7622 0 R (0:6487) 7623 0 R (0:6488) 7624 0 R (0:6489) 7625 0 R (0:649) 1554 0 R (0:6490) 7626 0 R (0:6491) 7627 0 R (0:6492) 7628 0 R (0:6493) 7629 0 R (0:6494) 7630 0 R (0:6495) 7631 0 R (0:6496) 7632 0 R (0:6497) 7633 0 R (0:6498) 7634 0 R (0:6499) 7635 0 R (0:65) 954 0 R (0:650) 1555 0 R (0:6500) 7636 0 R (0:6501) 7637 0 R (0:6502) 7638 0 R (0:6503) 7639 0 R (0:6504) 7640 0 R (0:6505) 7641 0 R (0:6506) 7642 0 R (0:6507) 7643 0 R (0:6508) 7644 0 R (0:6509) 7645 0 R (0:651) 1556 0 R (0:6510) 7646 0 R (0:6511) 7647 0 R (0:6512) 7648 0 R (0:6513) 7649 0 R (0:6514) 7650 0 R (0:6515) 7651 0 R (0:6516) 7652 0 R (0:6517) 7653 0 R (0:6518) 7654 0 R (0:6519) 7655 0 R (0:652) 1557 0 R (0:6520) 7656 0 R (0:6521) 7657 0 R (0:6522) 7658 0 R (0:6523) 7659 0 R (0:6524) 7660 0 R (0:6525) 7661 0 R (0:6526) 7662 0 R (0:6529) 7663 0 R (0:653) 1558 0 R (0:6530) 7664 0 R (0:6531) 7665 0 R (0:6532) 7666 0 R (0:6533) 7667 0 R (0:6534) 7668 0 R (0:6535) 7669 0 R (0:6536) 7670 0 R (0:6537) 7671 0 R (0:6538) 7672 0 R (0:6539) 7673 0 R (0:654) 1559 0 R (0:6540) 7678 0 R (0:6541) 7679 0 R (0:6542) 7680 0 R (0:6543) 7681 0 R (0:6544) 7682 0 R (0:6545) 7683 0 R (0:6546) 7684 0 R (0:6547) 7685 0 R (0:6548) 7686 0 R (0:6549) 7687 0 R (0:655) 1560 0 R (0:6550) 7688 0 R (0:6551) 7689 0 R (0:6552) 7690 0 R (0:6553) 7691 0 R (0:6554) 7692 0 R (0:6555) 7693 0 R (0:6556) 7694 0 R (0:6557) 7695 0 R (0:6558) 7696 0 R (0:6559) 7697 0 R (0:656) 1561 0 R (0:6560) 7698 0 R (0:6561) 7699 0 R (0:6562) 7700 0 R (0:6563) 7701 0 R (0:6564) 7702 0 R (0:6565) 7703 0 R (0:6566) 7704 0 R (0:6567) 7705 0 R (0:6568) 7706 0 R (0:6569) 7707 0 R (0:657) 1562 0 R (0:6570) 7708 0 R (0:6571) 7709 0 R (0:6572) 7710 0 R (0:6573) 7711 0 R (0:6574) 7712 0 R (0:6575) 7713 0 R (0:6576) 7714 0 R (0:6577) 7715 0 R (0:6578) 7716 0 R (0:6579) 7717 0 R (0:658) 1563 0 R (0:6580) 7718 0 R (0:6581) 7719 0 R (0:6582) 7720 0 R (0:6583) 7721 0 R (0:6584) 7722 0 R (0:6585) 7723 0 R (0:6586) 7724 0 R (0:6587) 7725 0 R (0:6588) 7726 0 R (0:6589) 7727 0 R (0:659) 1564 0 R (0:6590) 7728 0 R (0:6591) 7729 0 R (0:6592) 7730 0 R (0:6593) 7731 0 R (0:6594) 7732 0 R (0:6597) 7733 0 R (0:6598) 7734 0 R (0:6599) 7735 0 R (0:66) 955 0 R (0:660) 1565 0 R (0:6600) 7736 0 R (0:6601) 7737 0 R (0:6602) 7738 0 R (0:6603) 7743 0 R (0:6604) 7744 0 R (0:6605) 7745 0 R (0:6606) 7746 0 R (0:6607) 7747 0 R (0:6608) 7748 0 R (0:6609) 7749 0 R (0:661) 1566 0 R (0:6610) 7750 0 R (0:6611) 7751 0 R (0:6612) 7752 0 R (0:6613) 7753 0 R (0:6614) 7754 0 R (0:6615) 7755 0 R (0:6616) 7756 0 R (0:6617) 7757 0 R (0:6618) 7758 0 R (0:6619) 7759 0 R (0:662) 1567 0 R (0:6620) 7760 0 R (0:6621) 7761 0 R (0:6622) 7762 0 R (0:6623) 7763 0 R (0:6624) 7764 0 R (0:6625) 7765 0 R (0:6626) 7766 0 R (0:6629) 7767 0 R (0:663) 1568 0 R (0:6630) 7768 0 R (0:6631) 7769 0 R (0:6632) 7770 0 R (0:6633) 7771 0 R (0:6634) 7772 0 R (0:6635) 7773 0 R (0:6636) 7774 0 R (0:6637) 7775 0 R (0:6638) 7776 0 R (0:6639) 7777 0 R (0:664) 1569 0 R (0:6640) 7778 0 R (0:6641) 7779 0 R (0:6642) 7780 0 R (0:6643) 7781 0 R (0:6644) 7782 0 R (0:6645) 7783 0 R (0:6646) 7784 0 R (0:6647) 7785 0 R (0:6648) 7786 0 R (0:6649) 7791 0 R (0:665) 1570 0 R (0:6650) 7792 0 R (0:6651) 7793 0 R (0:6652) 7794 0 R (0:6653) 7795 0 R (0:6654) 7796 0 R (0:6655) 7797 0 R (0:6656) 7798 0 R (0:6657) 7799 0 R (0:6658) 7800 0 R (0:6659) 7801 0 R (0:666) 1571 0 R (0:6660) 7802 0 R (0:6661) 7803 0 R (0:6662) 7804 0 R (0:6663) 7805 0 R (0:6664) 7806 0 R (0:6665) 7807 0 R (0:6666) 7808 0 R (0:6667) 7809 0 R (0:6668) 7810 0 R (0:6669) 7811 0 R (0:667) 1572 0 R (0:6670) 7812 0 R (0:6671) 7813 0 R (0:6672) 7814 0 R (0:6675) 7815 0 R (0:6676) 7816 0 R (0:6677) 7817 0 R (0:6678) 7818 0 R (0:6679) 7819 0 R (0:668) 1573 0 R (0:6680) 7820 0 R (0:6681) 7821 0 R (0:6682) 7822 0 R (0:6683) 7823 0 R (0:6684) 7824 0 R (0:6685) 7825 0 R (0:6686) 7826 0 R (0:6687) 7827 0 R (0:6688) 7828 0 R (0:6689) 7829 0 R (0:669) 1574 0 R (0:6690) 7830 0 R (0:6691) 7831 0 R (0:6692) 7832 0 R (0:6693) 7833 0 R (0:6694) 7834 0 R (0:6695) 7835 0 R (0:6696) 7840 0 R (0:6697) 7841 0 R (0:6698) 7842 0 R (0:6699) 7843 0 R (0:6700) 7844 0 R (0:6701) 7845 0 R (0:6702) 7846 0 R (0:6703) 7847 0 R (0:6704) 7848 0 R (0:6705) 7849 0 R (0:6706) 7850 0 R (0:6707) 7851 0 R (0:6708) 7852 0 R (0:6709) 7853 0 R (0:6710) 7854 0 R (0:6711) 7855 0 R (0:6712) 7856 0 R (0:6713) 7857 0 R (0:6714) 7858 0 R (0:6715) 7859 0 R (0:6716) 7860 0 R (0:6717) 7861 0 R (0:6718) 7862 0 R (0:6719) 7863 0 R (0:672) 1575 0 R (0:6720) 7864 0 R (0:6721) 7865 0 R (0:6722) 7866 0 R (0:6723) 7867 0 R (0:6724) 7868 0 R (0:6725) 7869 0 R (0:6726) 7870 0 R (0:6729) 7871 0 R (0:673) 1576 0 R (0:6730) 7872 0 R (0:6731) 7873 0 R (0:6732) 7874 0 R (0:6733) 7875 0 R (0:6734) 7876 0 R (0:6735) 7877 0 R (0:6736) 7878 0 R (0:6737) 7879 0 R (0:6738) 7880 0 R (0:6739) 7881 0 R (0:674) 1577 0 R (0:6740) 7882 0 R (0:6741) 7888 0 R (0:6742) 7889 0 R (0:6743) 7890 0 R (0:6744) 7891 0 R (0:6745) 7892 0 R (0:6746) 7893 0 R (0:6747) 7894 0 R (0:6748) 7895 0 R (0:6749) 7896 0 R (0:675) 1578 0 R (0:6750) 7897 0 R (0:6751) 7898 0 R (0:6752) 7899 0 R (0:6753) 7900 0 R (0:6754) 7901 0 R (0:6755) 7902 0 R (0:6756) 7903 0 R (0:6757) 7904 0 R (0:6758) 7905 0 R (0:6759) 7906 0 R (0:676) 1579 0 R (0:6760) 7907 0 R (0:6761) 7908 0 R (0:6762) 7909 0 R (0:6763) 7910 0 R (0:6764) 7911 0 R (0:6765) 7912 0 R (0:6766) 7913 0 R (0:6767) 7914 0 R (0:677) 1580 0 R (0:6770) 7915 0 R (0:6771) 7916 0 R (0:6772) 7917 0 R (0:6773) 7918 0 R (0:6774) 7919 0 R (0:6775) 7920 0 R (0:6776) 7921 0 R (0:6777) 7922 0 R (0:6778) 7923 0 R (0:6779) 7924 0 R (0:678) 1581 0 R (0:6780) 7925 0 R (0:6781) 7926 0 R (0:6782) 7927 0 R (0:6783) 7928 0 R (0:6784) 7929 0 R (0:6785) 7930 0 R (0:6786) 7931 0 R (0:6789) 7937 0 R (0:679) 1582 0 R (0:6790) 7938 0 R (0:6791) 7939 0 R (0:6792) 7887 0 R (0:6795) 7940 0 R (0:6796) 7941 0 R (0:6797) 7942 0 R (0:6798) 7943 0 R (0:6799) 7944 0 R (0:680) 1583 0 R (0:6800) 7945 0 R (0:6801) 7946 0 R (0:6802) 7947 0 R (0:6803) 7948 0 R (0:6804) 7949 0 R (0:6805) 7950 0 R (0:6806) 7951 0 R (0:6809) 7952 0 R (0:681) 1584 0 R (0:6810) 7953 0 R (0:6811) 7954 0 R (0:6812) 7955 0 R (0:6813) 7956 0 R (0:6814) 7957 0 R (0:6815) 7958 0 R (0:6816) 7959 0 R (0:6817) 7960 0 R (0:6818) 7961 0 R (0:6819) 7962 0 R (0:682) 1544 0 R (0:6820) 7963 0 R (0:6821) 7964 0 R (0:6822) 7965 0 R (0:6823) 7966 0 R (0:6824) 7967 0 R (0:6825) 7968 0 R (0:6826) 7969 0 R (0:6827) 7970 0 R (0:6828) 7971 0 R (0:6829) 7972 0 R (0:683) 1589 0 R (0:6832) 7977 0 R (0:6833) 7978 0 R (0:6834) 7979 0 R (0:6835) 7980 0 R (0:6836) 7981 0 R (0:6837) 7982 0 R (0:6838) 7983 0 R (0:6839) 7984 0 R (0:684) 1590 0 R (0:6840) 7985 0 R (0:6841) 7986 0 R (0:6842) 7987 0 R (0:6843) 7988 0 R (0:6844) 7989 0 R (0:6845) 7990 0 R (0:6846) 7991 0 R (0:6847) 7992 0 R (0:6848) 7993 0 R (0:6849) 7994 0 R (0:685) 1591 0 R (0:6850) 7995 0 R (0:6851) 7996 0 R (0:6852) 7997 0 R (0:6853) 7998 0 R (0:6854) 7999 0 R (0:6855) 8000 0 R (0:6856) 8001 0 R (0:6857) 8002 0 R (0:6858) 8003 0 R (0:6859) 8004 0 R (0:686) 1592 0 R (0:6860) 8005 0 R (0:6861) 8006 0 R (0:6862) 8007 0 R (0:6863) 8008 0 R (0:6864) 8009 0 R (0:6865) 8010 0 R (0:6866) 8011 0 R (0:6867) 8012 0 R (0:6868) 8013 0 R (0:6869) 8014 0 R (0:687) 1593 0 R (0:6870) 8015 0 R (0:6871) 8016 0 R (0:6872) 8017 0 R (0:688) 1594 0 R (0:689) 1595 0 R (0:690) 1596 0 R (0:691) 1597 0 R (0:692) 1598 0 R (0:693) 1599 0 R (0:694) 1600 0 R (0:695) 1601 0 R (0:696) 1602 0 R (0:697) 1603 0 R (0:698) 1604 0 R (0:699) 1605 0 R (0:700) 1606 0 R (0:701) 1607 0 R (0:702) 1608 0 R (0:703) 1609 0 R (0:704) 1610 0 R (0:705) 1611 0 R (0:706) 1612 0 R (0:707) 1613 0 R (0:708) 1614 0 R (0:709) 1615 0 R (0:712) 1616 0 R (0:713) 1617 0 R (0:714) 1618 0 R (0:715) 1619 0 R (0:716) 1620 0 R (0:717) 1621 0 R (0:718) 1622 0 R (0:719) 1623 0 R (0:720) 1624 0 R (0:721) 1625 0 R (0:722) 1626 0 R (0:723) 1627 0 R (0:724) 1628 0 R (0:725) 1629 0 R (0:726) 1630 0 R (0:727) 1631 0 R (0:728) 1632 0 R (0:729) 1633 0 R (0:730) 1634 0 R (0:731) 1635 0 R (0:732) 1640 0 R (0:733) 1641 0 R (0:734) 1642 0 R (0:735) 1643 0 R (0:736) 1644 0 R (0:737) 1645 0 R (0:738) 1646 0 R (0:739) 1647 0 R (0:74) 957 0 R (0:740) 1648 0 R (0:741) 1649 0 R (0:742) 1650 0 R (0:743) 1651 0 R (0:744) 1652 0 R (0:745) 1653 0 R (0:746) 1654 0 R (0:747) 1655 0 R (0:748) 1656 0 R (0:749) 1657 0 R (0:750) 1658 0 R (0:751) 1659 0 R (0:752) 1660 0 R (0:753) 1661 0 R (0:754) 1662 0 R (0:755) 1663 0 R (0:756) 1664 0 R (0:757) 1665 0 R (0:758) 1666 0 R (0:759) 1667 0 R (0:76) 959 0 R (0:760) 1668 0 R (0:761) 1669 0 R (0:762) 1670 0 R (0:763) 1671 0 R (0:764) 1672 0 R (0:765) 1673 0 R (0:766) 1674 0 R (0:767) 1675 0 R (0:768) 1676 0 R (0:77) 960 0 R (0:771) 1677 0 R (0:772) 1678 0 R (0:773) 1679 0 R (0:774) 1680 0 R (0:775) 1681 0 R (0:776) 1682 0 R (0:777) 1683 0 R (0:778) 1684 0 R (0:779) 1685 0 R (0:78) 961 0 R (0:780) 1686 0 R (0:781) 1687 0 R (0:782) 1688 0 R (0:783) 1689 0 R (0:784) 1690 0 R (0:785) 1691 0 R (0:786) 1692 0 R (0:787) 1693 0 R (0:788) 1694 0 R (0:789) 1695 0 R (0:79) 962 0 R (0:790) 1700 0 R (0:791) 1701 0 R (0:792) 1702 0 R (0:793) 1703 0 R (0:794) 1704 0 R (0:795) 1705 0 R (0:796) 1706 0 R (0:797) 1707 0 R (0:798) 1708 0 R (0:799) 1709 0 R (0:8) 917 0 R (0:80) 963 0 R (0:800) 1710 0 R (0:801) 1711 0 R (0:802) 1712 0 R (0:803) 1713 0 R (0:804) 1714 0 R (0:805) 1715 0 R (0:806) 1716 0 R (0:807) 1717 0 R (0:808) 1718 0 R (0:809) 1719 0 R (0:812) 1720 0 R (0:813) 1721 0 R (0:814) 1722 0 R (0:815) 1723 0 R (0:816) 1724 0 R (0:817) 1725 0 R (0:818) 1726 0 R (0:819) 1727 0 R (0:820) 1728 0 R (0:821) 1729 0 R (0:822) 1730 0 R (0:823) 1731 0 R (0:824) 1732 0 R (0:825) 1733 0 R (0:826) 1734 0 R (0:827) 1735 0 R (0:828) 1736 0 R (0:829) 1737 0 R (0:830) 1738 0 R (0:831) 1739 0 R (0:832) 1740 0 R (0:833) 1741 0 R (0:834) 1742 0 R (0:835) 1743 0 R (0:836) 1744 0 R (0:837) 1745 0 R (0:838) 1746 0 R (0:839) 1747 0 R (0:84) 965 0 R (0:840) 1748 0 R (0:841) 1753 0 R (0:842) 1754 0 R (0:843) 1755 0 R (0:844) 1756 0 R (0:845) 1757 0 R (0:846) 1758 0 R (0:847) 1759 0 R (0:848) 1760 0 R (0:849) 1761 0 R (0:85) 966 0 R (0:850) 1762 0 R (0:851) 1763 0 R (0:852) 1764 0 R (0:853) 1765 0 R (0:856) 1766 0 R (0:857) 1767 0 R (0:858) 1768 0 R (0:859) 1769 0 R (0:86) 967 0 R (0:860) 1770 0 R (0:861) 1771 0 R (0:862) 1772 0 R (0:863) 1773 0 R (0:864) 1774 0 R (0:865) 1775 0 R (0:866) 1776 0 R (0:867) 1777 0 R (0:868) 1778 0 R (0:869) 1779 0 R (0:87) 968 0 R (0:870) 1780 0 R (0:871) 1781 0 R (0:872) 1782 0 R (0:873) 1783 0 R (0:874) 1784 0 R (0:875) 1785 0 R (0:876) 1786 0 R (0:877) 1787 0 R (0:878) 1788 0 R (0:879) 1789 0 R (0:88) 969 0 R (0:880) 1790 0 R (0:881) 1791 0 R (0:882) 1792 0 R (0:883) 1793 0 R (0:884) 1794 0 R (0:885) 1795 0 R (0:886) 1796 0 R (0:887) 1797 0 R (0:888) 1798 0 R (0:889) 1799 0 R (0:89) 970 0 R (0:890) 1800 0 R (0:891) 1801 0 R (0:892) 1802 0 R (0:893) 1803 0 R (0:894) 1804 0 R (0:895) 1805 0 R (0:896) 1806 0 R (0:897) 1807 0 R (0:898) 1808 0 R (0:899) 1814 0 R (0:90) 627 0 R (0:900) 1815 0 R (0:901) 1816 0 R (0:902) 1817 0 R (0:903) 1818 0 R (0:904) 1819 0 R (0:905) 1820 0 R (0:906) 1821 0 R (0:907) 1822 0 R (0:910) 1823 0 R (0:911) 1824 0 R (0:912) 1825 0 R (0:913) 1826 0 R (0:914) 1827 0 R (0:915) 1828 0 R (0:916) 1829 0 R (0:917) 1830 0 R (0:918) 1831 0 R (0:919) 1832 0 R (0:92) 975 0 R (0:920) 1833 0 R (0:921) 1834 0 R (0:922) 1835 0 R (0:923) 1836 0 R (0:924) 1837 0 R (0:925) 1838 0 R (0:926) 1839 0 R (0:927) 1840 0 R (0:928) 1841 0 R (0:929) 1842 0 R (0:93) 976 0 R (0:930) 1843 0 R (0:931) 1844 0 R (0:932) 1845 0 R (0:933) 1846 0 R (0:934) 1847 0 R (0:935) 1848 0 R (0:936) 1849 0 R (0:937) 1850 0 R (0:938) 1851 0 R (0:939) 1852 0 R (0:94) 980 0 R (0:940) 1853 0 R (0:941) 1854 0 R (0:942) 1855 0 R (0:943) 1856 0 R (0:944) 1857 0 R (0:945) 1858 0 R (0:946) 1859 0 R (0:947) 1865 0 R (0:948) 1866 0 R (0:95) 981 0 R (0:951) 1867 0 R (0:952) 1868 0 R (0:953) 1869 0 R (0:954) 1870 0 R (0:955) 1871 0 R (0:956) 1872 0 R (0:957) 1873 0 R (0:958) 1874 0 R (0:959) 1875 0 R (0:96) 982 0 R (0:960) 1876 0 R (0:961) 1877 0 R (0:962) 1878 0 R (0:963) 1879 0 R (0:964) 1880 0 R (0:965) 1881 0 R (0:966) 1882 0 R (0:967) 1883 0 R (0:968) 1884 0 R (0:969) 1885 0 R (0:97) 983 0 R (0:970) 1886 0 R (0:971) 1887 0 R (0:972) 1888 0 R (0:973) 1889 0 R (0:974) 1890 0 R (0:975) 1891 0 R (0:976) 1892 0 R (0:977) 1893 0 R (0:978) 1894 0 R (0:979) 1895 0 R (0:98) 984 0 R (0:980) 1896 0 R (0:981) 1897 0 R (0:982) 1898 0 R (0:983) 1899 0 R (0:984) 1900 0 R (0:985) 1901 0 R (0:986) 1902 0 R (0:987) 1903 0 R (0:988) 1904 0 R (0:989) 1905 0 R (0:99) 985 0 R (0:992) 1910 0 R (0:993) 1911 0 R (0:994) 1912 0 R (0:995) 1864 0 R (0:998) 1913 0 R (0:999) 1914 0 R (0:AddAddressType) 629 0 R (0:AddAddressTypeToAddress) 630 0 R (0:AddBootState) 631 0 R (0:AddConfFile) 632 0 R (0:AddConfFileToNode) 634 0 R (0:AddConfFileToNodeGroup) 633 0 R (0:AddKeyType) 635 0 R (0:AddMessage) 636 0 R (0:AddNetworkMethod) 637 0 R (0:AddNetworkType) 638 0 R (0:AddNode) 641 0 R (0:AddNodeGroup) 639 0 R (0:AddNodeNetwork) 640 0 R (0:AddNodeToNodeGroup) 642 0 R (0:AddNodeToPCU) 643 0 R (0:AddPCU) 644 0 R (0:AddPeer) 645 0 R (0:AddPerson) 647 0 R (0:AddPersonKey) 646 0 R (0:AddPersonToSite) 648 0 R (0:AddPersonToSlice) 649 0 R (0:AddRole) 650 0 R (0:AddRoleToPerson) 651 0 R (0:AddSite) 653 0 R (0:AddSiteAddress) 652 0 R (0:AddSlice) 657 0 R (0:AddSliceAttribute) 654 0 R (0:AddSliceAttributeType) 655 0 R (0:AddSliceInstantiation) 656 0 R (0:AddSliceToNodes) 658 0 R (0:AuthCheck) 659 0 R (0:Authentication) 624 0 R (0:BlacklistKey) 660 0 R (0:BootGetNodeDetails) 661 0 R (0:BootNotifyOwners) 662 0 R (0:BootUpdateNode) 663 0 R (0:DeleteAddress) 664 0 R (0:DeleteAddressType) 666 0 R (0:DeleteAddressTypeFromAddress) 665 0 R (0:DeleteBootState) 667 0 R (0:DeleteConfFile) 770 0 R (0:DeleteConfFileFromNode) 769 0 R (0:DeleteConfFileFromNodeGroup) 768 0 R (0:DeleteKey) 771 0 R (0:DeleteKeyType) 772 0 R (0:DeleteMessage) 773 0 R (0:DeleteNetworkMethod) 774 0 R (0:DeleteNetworkType) 775 0 R (0:DeleteNode) 780 0 R (0:DeleteNodeFromNodeGroup) 776 0 R (0:DeleteNodeFromPCU) 777 0 R (0:DeleteNodeGroup) 778 0 R (0:DeleteNodeNetwork) 779 0 R (0:DeletePCU) 781 0 R (0:DeletePeer) 782 0 R (0:DeletePerson) 785 0 R (0:DeletePersonFromSite) 783 0 R (0:DeletePersonFromSlice) 784 0 R (0:DeleteRole) 787 0 R (0:DeleteRoleFromPerson) 786 0 R (0:DeleteSession) 788 0 R (0:DeleteSite) 789 0 R (0:DeleteSlice) 794 0 R (0:DeleteSliceAttribute) 790 0 R (0:DeleteSliceAttributeType) 791 0 R (0:DeleteSliceFromNodes) 792 0 R (0:DeleteSliceInstantiation) 793 0 R (0:Filters) 626 0 R (0:GetAddressTypes) 796 0 R (0:GetAddresses) 795 0 R (0:GetBootStates) 797 0 R (0:GetConfFiles) 798 0 R (0:GetEvents) 799 0 R (0:GetKeyTypes) 801 0 R (0:GetKeys) 800 0 R (0:GetMessages) 802 0 R (0:GetNetworkMethods) 803 0 R (0:GetNetworkTypes) 804 0 R (0:GetNodeGroups) 805 0 R (0:GetNodeNetworks) 806 0 R (0:GetNodes) 807 0 R (0:GetPCUs) 808 0 R (0:GetPeerData) 809 0 R (0:GetPeerName) 810 0 R (0:GetPeers) 811 0 R (0:GetPersons) 812 0 R (0:GetRoles) 813 0 R (0:GetSession) 814 0 R (0:GetSites) 815 0 R (0:GetSliceAttributeTypes) 883 0 R (0:GetSliceAttributes) 882 0 R (0:GetSliceInstantiations) 884 0 R (0:GetSliceTicket) 886 0 R (0:GetSlices) 885 0 R (0:GetSlivers) 887 0 R (0:Introduction) 623 0 R (0:Methods) 628 0 R (0:NotifyPersons) 888 0 R (0:RebootNode) 889 0 R (0:RefreshPeer) 890 0 R (0:ResetPassword) 891 0 R (0:Roles) 625 0 R (0:SetPersonPrimarySite) 892 0 R (0:UpdateAddress) 893 0 R (0:UpdateAddressType) 894 0 R (0:UpdateConfFile) 895 0 R (0:UpdateKey) 896 0 R (0:UpdateMessage) 897 0 R (0:UpdateNode) 900 0 R (0:UpdateNodeGroup) 898 0 R (0:UpdateNodeNetwork) 899 0 R (0:UpdatePCU) 901 0 R (0:UpdatePeer) 902 0 R (0:UpdatePerson) 903 0 R (0:UpdateSite) 904 0 R (0:UpdateSlice) 907 0 R (0:UpdateSliceAttribute) 905 0 R (0:UpdateSliceAttributeType) 906 0 R (0:VerifyPerson) 908 0 R (0:system.listMethods) 909 0 R (0:system.methodHelp) 910 0 R (0:system.methodSignature) 911 0 R (0:system.multicall) 912 0 R (1.0) 2 0 R (2.0) 6 0 R (3.0) 10 0 R (3.1.1) 14 0 R (3.2.1) 18 0 R (3.3.1) 22 0 R (3.4.1) 26 0 R (4.0) 30 0 R (4.10.1) 54 0 R (4.100.1) 414 0 R (4.101.1) 418 0 R (4.102.1) 422 0 R (4.103.1) 426 0 R (4.104.1) 430 0 R (4.105.1) 434 0 R (4.106.1) 438 0 R (4.107.1) 442 0 R (4.108.1) 446 0 R (4.109.1) 450 0 R (4.11.1) 58 0 R (4.110.1) 454 0 R (4.111.1) 458 0 R (4.112.1) 462 0 R (4.113.1) 466 0 R (4.114.1) 470 0 R (4.115.1) 474 0 R (4.116.1) 478 0 R (4.117.1) 482 0 R (4.118.1) 486 0 R (4.119.1) 490 0 R (4.12.1) 62 0 R (4.120.1) 494 0 R (4.121.1) 498 0 R (4.122.1) 502 0 R (4.13.1) 66 0 R (4.14.1) 70 0 R (4.15.1) 74 0 R (4.16.1) 78 0 R (4.17.1) 82 0 R (4.18.1) 86 0 R (4.19.1) 90 0 R (4.20.1) 94 0 R (4.21.1) 98 0 R (4.22.1) 102 0 R (4.23.1) 106 0 R (4.24.1) 110 0 R (4.25.1) 114 0 R (4.26.1) 118 0 R (4.27.1) 122 0 R (4.28.1) 126 0 R (4.29.1) 130 0 R (4.30.1) 134 0 R (4.31.1) 138 0 R (4.32.1) 142 0 R (4.33.1) 146 0 R (4.34.1) 150 0 R (4.35.1) 154 0 R (4.36.1) 158 0 R (4.37.1) 162 0 R (4.38.1) 166 0 R (4.39.1) 170 0 R (4.40.1) 174 0 R (4.41.1) 178 0 R (4.42.1) 182 0 R (4.43.1) 186 0 R (4.44.1) 190 0 R (4.45.1) 194 0 R (4.46.1) 198 0 R (4.47.1) 202 0 R (4.48.1) 206 0 R (4.49.1) 210 0 R (4.5.1) 34 0 R (4.50.1) 214 0 R (4.51.1) 218 0 R (4.52.1) 222 0 R (4.53.1) 226 0 R (4.54.1) 230 0 R (4.55.1) 234 0 R (4.56.1) 238 0 R (4.57.1) 242 0 R (4.58.1) 246 0 R (4.59.1) 250 0 R (4.6.1) 38 0 R (4.60.1) 254 0 R (4.61.1) 258 0 R (4.62.1) 262 0 R (4.63.1) 266 0 R (4.64.1) 270 0 R (4.65.1) 274 0 R (4.66.1) 278 0 R (4.67.1) 282 0 R (4.68.1) 286 0 R (4.69.1) 290 0 R (4.7.1) 42 0 R (4.70.1) 294 0 R (4.71.1) 298 0 R (4.72.1) 302 0 R (4.73.1) 306 0 R (4.74.1) 310 0 R (4.75.1) 314 0 R (4.76.1) 318 0 R (4.77.1) 322 0 R (4.78.1) 326 0 R (4.79.1) 330 0 R (4.8.1) 46 0 R (4.80.1) 334 0 R (4.81.1) 338 0 R (4.82.1) 342 0 R (4.83.1) 346 0 R (4.84.1) 350 0 R (4.85.1) 354 0 R (4.86.1) 358 0 R (4.87.1) 362 0 R (4.88.1) 366 0 R (4.89.1) 370 0 R (4.9.1) 50 0 R (4.90.1) 374 0 R (4.91.1) 378 0 R (4.92.1) 382 0 R (4.93.1) 386 0 R (4.94.1) 390 0 R (4.95.1) 394 0 R (4.96.1) 398 0 R (4.97.1) 402 0 R (4.98.1) 406 0 R (4.99.1) 410 0 R (Doc-Start) 510 0 R (page.1) 509 0 R (page.10) 1240 0 R (page.100) 6267 0 R (page.101) 6303 0 R (page.102) 6379 0 R (page.103) 6452 0 R (page.104) 6508 0 R (page.105) 6554 0 R (page.106) 6652 0 R (page.107) 6724 0 R (page.108) 6794 0 R (page.109) 6868 0 R (page.11) 1277 0 R (page.110) 6912 0 R (page.111) 6967 0 R (page.112) 7011 0 R (page.113) 7054 0 R (page.114) 7113 0 R (page.115) 7162 0 R (page.116) 7227 0 R (page.117) 7278 0 R (page.118) 7337 0 R (page.119) 7390 0 R (page.12) 1335 0 R (page.120) 7446 0 R (page.121) 7503 0 R (page.122) 7564 0 R (page.123) 7619 0 R (page.124) 7677 0 R (page.125) 7742 0 R (page.126) 7790 0 R (page.127) 7839 0 R (page.128) 7886 0 R (page.129) 7936 0 R (page.13) 1373 0 R (page.130) 7976 0 R (page.14) 1415 0 R (page.15) 1490 0 R (page.16) 1543 0 R (page.17) 1588 0 R (page.18) 1639 0 R (page.19) 1699 0 R (page.2) 519 0 R (page.20) 1752 0 R (page.21) 1813 0 R (page.22) 1863 0 R (page.23) 1909 0 R (page.24) 1947 0 R (page.25) 1994 0 R (page.26) 2054 0 R (page.27) 2117 0 R (page.28) 2171 0 R (page.29) 2223 0 R (page.3) 523 0 R (page.30) 2274 0 R (page.31) 2320 0 R (page.32) 2354 0 R (page.33) 2421 0 R (page.34) 2489 0 R (page.35) 2551 0 R (page.36) 2607 0 R (page.37) 2652 0 R (page.38) 2691 0 R (page.39) 2739 0 R (page.4) 671 0 R (page.40) 2788 0 R (page.41) 2828 0 R (page.42) 2875 0 R (page.43) 2913 0 R (page.44) 2962 0 R (page.45) 3008 0 R (page.46) 3050 0 R (page.47) 3091 0 R (page.48) 3142 0 R (page.49) 3180 0 R (page.5) 819 0 R (page.50) 3226 0 R (page.51) 3279 0 R (page.52) 3324 0 R (page.53) 3373 0 R (page.54) 3412 0 R (page.55) 3460 0 R (page.56) 3499 0 R (page.57) 3539 0 R (page.58) 3584 0 R (page.59) 3632 0 R (page.6) 1036 0 R (page.60) 3691 0 R (page.61) 3765 0 R (page.62) 3823 0 R (page.63) 3876 0 R (page.64) 3935 0 R (page.65) 4009 0 R (page.66) 4088 0 R (page.67) 4147 0 R (page.68) 4214 0 R (page.69) 4279 0 R (page.7) 1082 0 R (page.70) 4349 0 R (page.71) 4401 0 R (page.72) 4466 0 R (page.73) 4511 0 R (page.74) 4550 0 R (page.75) 4624 0 R (page.76) 4681 0 R (page.77) 4755 0 R (page.78) 4834 0 R (page.79) 4892 0 R (page.8) 1138 0 R (page.80) 4964 0 R (page.81) 5038 0 R (page.82) 5100 0 R (page.83) 5174 0 R (page.84) 5251 0 R (page.85) 5303 0 R (page.86) 5343 0 R (page.87) 5414 0 R (page.88) 5476 0 R (page.89) 5533 0 R (page.9) 1198 0 R (page.90) 5607 0 R (page.91) 5679 0 R (page.92) 5742 0 R (page.93) 5789 0 R (page.94) 5859 0 R (page.95) 5931 0 R (page.96) 6008 0 R (page.97) 6064 0 R (page.98) 6136 0 R (page.99) 6195 0 R (table.1) 932 0 R (table.2) 940 0 R (table.3) 948 0 R (table.4) 956 0 R] +/Limits [(0:0) (table.4)] +>> endobj +8034 0 obj << +/Kids [8033 0 R] +>> endobj +8035 0 obj << +/Dests 8034 0 R +>> endobj +8036 0 obj << +/Type /Catalog +/Pages 8031 0 R +/Outlines 8032 0 R +/Names 8035 0 R +/PageMode /UseOutlines +/OpenAction 505 0 R +>> endobj +8037 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() +/CreationDate (D:20070219130429-05'00') +/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) +>> endobj +xref +0 8038 +0000000000 65535 f +0000000009 00000 n +0000011173 00000 n +0000948077 00000 n +0000000048 00000 n +0000000101 00000 n +0000081281 00000 n +0000947992 00000 n +0000000140 00000 n +0000000175 00000 n +0000203694 00000 n +0000947868 00000 n +0000000214 00000 n +0000000256 00000 n +0000203880 00000 n +0000947794 00000 n +0000000298 00000 n +0000000336 00000 n +0000207492 00000 n +0000947707 00000 n +0000000378 00000 n +0000000407 00000 n +0000207996 00000 n +0000947620 00000 n +0000000449 00000 n +0000000480 00000 n +0000210273 00000 n +0000947546 00000 n +0000000522 00000 n +0000000561 00000 n +0000213260 00000 n +0000947430 00000 n +0000000601 00000 n +0000000652 00000 n +0000213446 00000 n +0000947356 00000 n +0000000694 00000 n +0000000732 00000 n +0000215663 00000 n +0000947269 00000 n +0000000774 00000 n +0000000821 00000 n +0000219417 00000 n +0000947182 00000 n +0000000863 00000 n +0000000899 00000 n +0000222682 00000 n +0000947095 00000 n +0000000941 00000 n +0000000976 00000 n +0000228587 00000 n +0000947008 00000 n +0000001018 00000 n +0000001064 00000 n +0000232267 00000 n +0000946921 00000 n +0000001107 00000 n +0000001148 00000 n +0000235782 00000 n +0000946834 00000 n +0000001191 00000 n +0000001225 00000 n +0000237394 00000 n +0000946747 00000 n +0000001268 00000 n +0000001302 00000 n +0000241511 00000 n +0000946660 00000 n +0000001345 00000 n +0000001385 00000 n +0000244502 00000 n +0000946573 00000 n +0000001428 00000 n +0000001467 00000 n +0000246308 00000 n +0000946486 00000 n +0000001510 00000 n +0000001547 00000 n +0000250137 00000 n +0000946399 00000 n +0000001590 00000 n +0000001629 00000 n +0000257129 00000 n +0000946312 00000 n +0000001672 00000 n +0000001704 00000 n +0000262063 00000 n +0000946225 00000 n +0000001747 00000 n +0000001790 00000 n +0000266018 00000 n +0000946138 00000 n +0000001833 00000 n +0000001870 00000 n +0000270044 00000 n +0000946051 00000 n +0000001913 00000 n +0000001944 00000 n +0000275462 00000 n +0000945962 00000 n +0000001987 00000 n +0000002020 00000 n +0000279667 00000 n +0000945871 00000 n +0000002064 00000 n +0000002102 00000 n +0000284156 00000 n +0000945779 00000 n +0000002146 00000 n +0000002181 00000 n +0000289217 00000 n +0000945687 00000 n +0000002225 00000 n +0000002266 00000 n +0000293347 00000 n +0000945595 00000 n +0000002310 00000 n +0000002352 00000 n +0000297294 00000 n +0000945503 00000 n +0000002396 00000 n +0000002429 00000 n +0000299104 00000 n +0000945411 00000 n +0000002473 00000 n +0000002514 00000 n +0000303255 00000 n +0000945319 00000 n +0000002558 00000 n +0000002598 00000 n +0000308697 00000 n +0000945227 00000 n +0000002642 00000 n +0000002675 00000 n +0000314496 00000 n +0000945135 00000 n +0000002719 00000 n +0000002762 00000 n +0000319489 00000 n +0000945043 00000 n +0000002806 00000 n +0000002853 00000 n +0000323303 00000 n +0000944951 00000 n +0000002897 00000 n +0000002944 00000 n +0000326884 00000 n +0000944859 00000 n +0000002988 00000 n +0000003022 00000 n +0000331335 00000 n +0000944767 00000 n +0000003066 00000 n +0000003107 00000 n +0000335334 00000 n +0000944675 00000 n +0000003151 00000 n +0000003186 00000 n +0000336686 00000 n +0000944583 00000 n +0000003230 00000 n +0000003268 00000 n +0000340191 00000 n +0000944491 00000 n +0000003312 00000 n +0000003356 00000 n +0000348055 00000 n +0000944399 00000 n +0000003400 00000 n +0000003442 00000 n +0000352503 00000 n +0000944307 00000 n +0000003486 00000 n +0000003526 00000 n +0000358634 00000 n +0000944215 00000 n +0000003570 00000 n +0000003609 00000 n +0000361873 00000 n +0000944123 00000 n +0000003653 00000 n +0000003707 00000 n +0000365554 00000 n +0000944031 00000 n +0000003751 00000 n +0000003794 00000 n +0000367491 00000 n +0000943939 00000 n +0000003838 00000 n +0000003879 00000 n +0000370681 00000 n +0000943847 00000 n +0000003923 00000 n +0000003976 00000 n +0000374504 00000 n +0000943755 00000 n +0000004020 00000 n +0000004068 00000 n +0000378165 00000 n +0000943663 00000 n +0000004112 00000 n +0000004152 00000 n +0000379909 00000 n +0000943571 00000 n +0000004196 00000 n +0000004231 00000 n +0000383041 00000 n +0000943479 00000 n +0000004275 00000 n +0000004314 00000 n +0000386127 00000 n +0000943387 00000 n +0000004358 00000 n +0000004397 00000 n +0000387934 00000 n +0000943295 00000 n +0000004441 00000 n +0000004486 00000 n +0000391133 00000 n +0000943203 00000 n +0000004530 00000 n +0000004573 00000 n +0000394384 00000 n +0000943111 00000 n +0000004617 00000 n +0000004666 00000 n +0000398436 00000 n +0000943019 00000 n +0000004710 00000 n +0000004753 00000 n +0000400629 00000 n +0000942927 00000 n +0000004797 00000 n +0000004838 00000 n +0000404087 00000 n +0000942835 00000 n +0000004882 00000 n +0000004925 00000 n +0000407420 00000 n +0000942743 00000 n +0000004969 00000 n +0000005005 00000 n +0000410808 00000 n +0000942651 00000 n +0000005049 00000 n +0000005084 00000 n +0000412681 00000 n +0000942559 00000 n +0000005128 00000 n +0000005164 00000 n +0000416186 00000 n +0000942467 00000 n +0000005208 00000 n +0000005254 00000 n +0000420352 00000 n +0000942375 00000 n +0000005298 00000 n +0000005345 00000 n +0000424472 00000 n +0000942283 00000 n +0000005389 00000 n +0000005427 00000 n +0000428197 00000 n +0000942191 00000 n +0000005471 00000 n +0000005517 00000 n +0000432284 00000 n +0000942099 00000 n +0000005561 00000 n +0000005597 00000 n +0000434285 00000 n +0000942007 00000 n +0000005641 00000 n +0000005680 00000 n +0000437468 00000 n +0000941915 00000 n +0000005724 00000 n +0000005760 00000 n +0000441085 00000 n +0000941823 00000 n +0000005804 00000 n +0000005850 00000 n +0000444349 00000 n +0000941731 00000 n +0000005894 00000 n +0000005944 00000 n +0000446279 00000 n +0000941639 00000 n +0000005988 00000 n +0000006034 00000 n +0000450203 00000 n +0000941547 00000 n +0000006078 00000 n +0000006128 00000 n +0000453420 00000 n +0000941455 00000 n +0000006172 00000 n +0000006209 00000 n +0000457250 00000 n +0000941363 00000 n +0000006253 00000 n +0000006291 00000 n +0000469578 00000 n +0000941271 00000 n +0000006335 00000 n +0000006376 00000 n +0000476089 00000 n +0000941179 00000 n +0000006420 00000 n +0000006459 00000 n +0000479279 00000 n +0000941087 00000 n +0000006503 00000 n +0000006541 00000 n +0000497497 00000 n +0000940995 00000 n +0000006585 00000 n +0000006620 00000 n +0000511301 00000 n +0000940903 00000 n +0000006664 00000 n +0000006697 00000 n +0000521547 00000 n +0000940811 00000 n +0000006741 00000 n +0000006778 00000 n +0000523095 00000 n +0000940719 00000 n +0000006822 00000 n +0000006859 00000 n +0000531617 00000 n +0000940627 00000 n +0000006903 00000 n +0000006946 00000 n +0000534470 00000 n +0000940535 00000 n +0000006990 00000 n +0000007031 00000 n +0000535822 00000 n +0000940443 00000 n +0000007075 00000 n +0000007114 00000 n +0000545113 00000 n +0000940351 00000 n +0000007158 00000 n +0000007199 00000 n +0000563804 00000 n +0000940259 00000 n +0000007243 00000 n +0000007277 00000 n +0000584619 00000 n +0000940167 00000 n +0000007321 00000 n +0000007354 00000 n +0000599420 00000 n +0000940075 00000 n +0000007398 00000 n +0000007435 00000 n +0000604504 00000 n +0000939983 00000 n +0000007479 00000 n +0000007516 00000 n +0000606052 00000 n +0000939891 00000 n +0000007560 00000 n +0000007594 00000 n +0000619578 00000 n +0000939799 00000 n +0000007638 00000 n +0000007674 00000 n +0000640255 00000 n +0000939707 00000 n +0000007718 00000 n +0000007752 00000 n +0000643567 00000 n +0000939615 00000 n +0000007796 00000 n +0000007832 00000 n +0000645114 00000 n +0000939523 00000 n +0000007876 00000 n +0000007910 00000 n +0000668222 00000 n +0000939431 00000 n +0000007954 00000 n +0000007998 00000 n +0000680047 00000 n +0000939339 00000 n +0000008042 00000 n +0000008090 00000 n +0000688897 00000 n +0000939247 00000 n +0000008134 00000 n +0000008182 00000 n +0000690443 00000 n +0000939155 00000 n +0000008226 00000 n +0000008261 00000 n +0000708780 00000 n +0000939063 00000 n +0000008305 00000 n +0000008345 00000 n +0000712401 00000 n +0000938971 00000 n +0000008389 00000 n +0000008425 00000 n +0000728200 00000 n +0000938879 00000 n +0000008469 00000 n +0000008508 00000 n +0000744453 00000 n +0000938787 00000 n +0000008552 00000 n +0000008588 00000 n +0000748138 00000 n +0000938695 00000 n +0000008633 00000 n +0000008670 00000 n +0000751851 00000 n +0000938603 00000 n +0000008715 00000 n +0000008754 00000 n +0000755914 00000 n +0000938511 00000 n +0000008799 00000 n +0000008845 00000 n +0000758361 00000 n +0000938419 00000 n +0000008890 00000 n +0000008929 00000 n +0000763477 00000 n +0000938327 00000 n +0000008974 00000 n +0000009018 00000 n +0000767718 00000 n +0000938235 00000 n +0000009063 00000 n +0000009104 00000 n +0000773784 00000 n +0000938143 00000 n +0000009149 00000 n +0000009185 00000 n +0000777493 00000 n +0000938051 00000 n +0000009230 00000 n +0000009270 00000 n +0000781536 00000 n +0000937959 00000 n +0000009315 00000 n +0000009357 00000 n +0000786030 00000 n +0000937867 00000 n +0000009402 00000 n +0000009446 00000 n +0000792441 00000 n +0000937775 00000 n +0000009491 00000 n +0000009528 00000 n +0000797898 00000 n +0000937683 00000 n +0000009573 00000 n +0000009609 00000 n +0000803813 00000 n +0000937591 00000 n +0000009654 00000 n +0000009691 00000 n +0000808595 00000 n +0000937499 00000 n +0000009736 00000 n +0000009775 00000 n +0000814505 00000 n +0000937407 00000 n +0000009820 00000 n +0000009857 00000 n +0000820670 00000 n +0000937315 00000 n +0000009902 00000 n +0000009949 00000 n +0000824143 00000 n +0000937223 00000 n +0000009994 00000 n +0000010045 00000 n +0000828773 00000 n +0000937131 00000 n +0000010090 00000 n +0000010128 00000 n +0000834079 00000 n +0000937039 00000 n +0000010173 00000 n +0000010212 00000 n +0000838214 00000 n +0000936947 00000 n +0000010257 00000 n +0000010302 00000 n +0000840691 00000 n +0000936855 00000 n +0000010347 00000 n +0000010391 00000 n +0000841786 00000 n +0000936763 00000 n +0000010436 00000 n +0000010485 00000 n +0000844649 00000 n +0000936685 00000 n +0000010530 00000 n +0000010573 00000 n +0000010865 00000 n +0000011234 00000 n +0000010625 00000 n +0000010987 00000 n +0000011049 00000 n +0000011111 00000 n +0000932562 00000 n +0000921067 00000 n +0000932389 00000 n +0000933189 00000 n +0000011728 00000 n +0000011544 00000 n +0000011306 00000 n +0000011666 00000 n +0000081342 00000 n +0000065810 00000 n +0000011800 00000 n +0000081219 00000 n +0000066664 00000 n +0000920584 00000 n +0000911162 00000 n +0000920408 00000 n +0000066825 00000 n +0000066985 00000 n +0000910199 00000 n +0000891691 00000 n +0000910024 00000 n +0000067148 00000 n +0000067310 00000 n +0000067462 00000 n +0000067613 00000 n +0000067769 00000 n +0000067924 00000 n +0000068075 00000 n +0000068225 00000 n +0000068381 00000 n +0000068536 00000 n +0000068698 00000 n +0000068860 00000 n +0000069032 00000 n +0000069203 00000 n +0000069364 00000 n +0000069524 00000 n +0000069684 00000 n +0000069843 00000 n +0000070014 00000 n +0000070184 00000 n +0000070349 00000 n +0000070513 00000 n +0000070671 00000 n +0000070829 00000 n +0000070988 00000 n +0000071147 00000 n +0000071312 00000 n +0000071477 00000 n +0000071640 00000 n +0000071803 00000 n +0000071964 00000 n +0000072125 00000 n +0000072288 00000 n +0000072451 00000 n +0000072606 00000 n +0000072761 00000 n +0000072928 00000 n +0000073095 00000 n +0000073256 00000 n +0000073417 00000 n +0000073571 00000 n +0000073726 00000 n +0000073882 00000 n +0000074038 00000 n +0000074199 00000 n +0000074360 00000 n +0000074518 00000 n +0000074676 00000 n +0000074838 00000 n +0000075001 00000 n +0000075166 00000 n +0000075331 00000 n +0000075487 00000 n +0000075643 00000 n +0000075806 00000 n +0000075969 00000 n +0000076132 00000 n +0000076295 00000 n +0000076451 00000 n +0000076607 00000 n +0000076773 00000 n +0000076939 00000 n +0000077107 00000 n +0000077275 00000 n +0000077445 00000 n +0000077615 00000 n +0000077772 00000 n +0000077929 00000 n +0000078092 00000 n +0000078255 00000 n +0000078413 00000 n +0000078571 00000 n +0000078732 00000 n +0000078893 00000 n +0000079060 00000 n +0000079227 00000 n +0000079391 00000 n +0000079555 00000 n +0000079718 00000 n +0000079881 00000 n +0000080043 00000 n +0000080205 00000 n +0000080382 00000 n +0000080559 00000 n +0000080725 00000 n +0000080891 00000 n +0000081055 00000 n +0000891140 00000 n +0000880124 00000 n +0000890960 00000 n +0000203632 00000 n +0000203818 00000 n +0000207430 00000 n +0000207934 00000 n +0000208437 00000 n +0000213198 00000 n +0000213384 00000 n +0000215601 00000 n +0000219354 00000 n +0000222619 00000 n +0000228524 00000 n +0000232204 00000 n +0000234529 00000 n +0000237333 00000 n +0000241448 00000 n +0000239514 00000 n +0000246245 00000 n +0000250074 00000 n +0000257066 00000 n +0000262000 00000 n +0000265955 00000 n +0000269981 00000 n +0000275399 00000 n +0000279604 00000 n +0000284093 00000 n +0000289154 00000 n +0000293284 00000 n +0000295932 00000 n +0000299041 00000 n +0000303192 00000 n +0000308634 00000 n +0000314433 00000 n +0000319426 00000 n +0000323240 00000 n +0000326821 00000 n +0000326500 00000 n +0000333988 00000 n +0000336623 00000 n +0000340129 00000 n +0000347992 00000 n +0000352440 00000 n +0000358571 00000 n +0000361810 00000 n +0000364201 00000 n +0000367428 00000 n +0000154083 00000 n +0000137494 00000 n +0000081453 00000 n +0000154021 00000 n +0000138396 00000 n +0000138572 00000 n +0000138748 00000 n +0000138919 00000 n +0000139090 00000 n +0000139252 00000 n +0000139415 00000 n +0000139573 00000 n +0000139731 00000 n +0000139893 00000 n +0000140055 00000 n +0000140217 00000 n +0000140379 00000 n +0000140547 00000 n +0000140715 00000 n +0000140881 00000 n +0000141047 00000 n +0000141219 00000 n +0000141391 00000 n +0000141557 00000 n +0000141723 00000 n +0000141887 00000 n +0000142051 00000 n +0000142217 00000 n +0000142383 00000 n +0000142542 00000 n +0000142701 00000 n +0000142859 00000 n +0000143017 00000 n +0000143176 00000 n +0000143335 00000 n +0000143504 00000 n +0000143673 00000 n +0000143842 00000 n +0000144011 00000 n +0000144172 00000 n +0000144333 00000 n +0000144502 00000 n +0000144671 00000 n +0000144830 00000 n +0000144989 00000 n +0000145151 00000 n +0000145313 00000 n +0000145472 00000 n +0000145631 00000 n +0000145799 00000 n +0000145967 00000 n +0000146140 00000 n +0000146313 00000 n +0000146482 00000 n +0000146651 00000 n +0000146824 00000 n +0000146997 00000 n +0000147157 00000 n +0000147317 00000 n +0000147477 00000 n +0000147638 00000 n +0000147802 00000 n +0000147966 00000 n +0000148127 00000 n +0000148288 00000 n +0000148449 00000 n +0000148610 00000 n +0000148768 00000 n +0000148926 00000 n +0000149082 00000 n +0000149238 00000 n +0000149398 00000 n +0000149558 00000 n +0000149718 00000 n +0000149878 00000 n +0000150044 00000 n +0000150210 00000 n +0000150371 00000 n +0000150533 00000 n +0000150695 00000 n +0000150857 00000 n +0000151021 00000 n +0000151185 00000 n +0000151342 00000 n +0000151499 00000 n +0000151655 00000 n +0000151811 00000 n +0000151971 00000 n +0000152131 00000 n +0000152290 00000 n +0000152450 00000 n +0000152606 00000 n +0000152762 00000 n +0000152921 00000 n +0000153080 00000 n +0000153237 00000 n +0000153394 00000 n +0000153553 00000 n +0000153712 00000 n +0000153866 00000 n +0000370618 00000 n +0000374441 00000 n +0000376764 00000 n +0000379846 00000 n +0000382978 00000 n +0000384851 00000 n +0000387873 00000 n +0000391070 00000 n +0000389776 00000 n +0000396970 00000 n +0000400566 00000 n +0000404024 00000 n +0000407358 00000 n +0000406260 00000 n +0000412618 00000 n +0000416123 00000 n +0000420289 00000 n +0000424409 00000 n +0000428134 00000 n +0000430848 00000 n +0000434222 00000 n +0000437405 00000 n +0000441022 00000 n +0000442896 00000 n +0000446216 00000 n +0000450140 00000 n +0000453357 00000 n +0000457187 00000 n +0000469515 00000 n +0000476028 00000 n +0000479216 00000 n +0000497434 00000 n +0000511238 00000 n +0000521484 00000 n +0000523032 00000 n +0000531554 00000 n +0000533104 00000 n +0000535759 00000 n +0000545050 00000 n +0000563741 00000 n +0000584556 00000 n +0000593139 00000 n +0000604441 00000 n +0000605989 00000 n +0000617769 00000 n +0000640192 00000 n +0000643504 00000 n +0000645051 00000 n +0000200308 00000 n +0000189491 00000 n +0000154168 00000 n +0000200246 00000 n +0000190121 00000 n +0000190288 00000 n +0000190455 00000 n +0000190626 00000 n +0000190797 00000 n +0000190968 00000 n +0000191139 00000 n +0000191296 00000 n +0000191453 00000 n +0000191616 00000 n +0000191779 00000 n +0000191938 00000 n +0000192097 00000 n +0000192258 00000 n +0000192419 00000 n +0000192578 00000 n +0000192737 00000 n +0000192896 00000 n +0000193056 00000 n +0000193218 00000 n +0000193380 00000 n +0000193548 00000 n +0000193717 00000 n +0000193879 00000 n +0000194041 00000 n +0000194207 00000 n +0000194373 00000 n +0000194535 00000 n +0000194697 00000 n +0000194855 00000 n +0000195013 00000 n +0000195175 00000 n +0000195337 00000 n +0000195501 00000 n +0000195665 00000 n +0000195831 00000 n +0000195997 00000 n +0000196156 00000 n +0000196315 00000 n +0000196473 00000 n +0000196631 00000 n +0000196789 00000 n +0000196947 00000 n +0000197108 00000 n +0000197269 00000 n +0000197427 00000 n +0000197585 00000 n +0000197754 00000 n +0000197923 00000 n +0000198096 00000 n +0000198269 00000 n +0000198429 00000 n +0000198589 00000 n +0000198750 00000 n +0000198911 00000 n +0000199078 00000 n +0000199245 00000 n +0000199411 00000 n +0000199577 00000 n +0000199746 00000 n +0000199916 00000 n +0000200081 00000 n +0000668159 00000 n +0000679984 00000 n +0000688834 00000 n +0000690380 00000 n +0000708717 00000 n +0000712338 00000 n +0000728137 00000 n +0000744390 00000 n +0000748075 00000 n +0000746655 00000 n +0000754377 00000 n +0000758298 00000 n +0000763414 00000 n +0000767655 00000 n +0000773721 00000 n +0000777430 00000 n +0000781473 00000 n +0000785967 00000 n +0000792378 00000 n +0000797835 00000 n +0000803750 00000 n +0000808532 00000 n +0000814442 00000 n +0000820607 00000 n +0000824080 00000 n +0000828710 00000 n +0000834016 00000 n +0000838153 00000 n +0000839377 00000 n +0000841723 00000 n +0000840628 00000 n +0000205066 00000 n +0000202132 00000 n +0000200393 00000 n +0000203756 00000 n +0000203943 00000 n +0000202330 00000 n +0000202497 00000 n +0000202668 00000 n +0000202833 00000 n +0000204005 00000 n +0000879590 00000 n +0000868648 00000 n +0000879413 00000 n +0000204069 00000 n +0000204131 00000 n +0000204193 00000 n +0000202998 00000 n +0000204257 00000 n +0000204319 00000 n +0000204381 00000 n +0000867827 00000 n +0000851190 00000 n +0000867654 00000 n +0000204443 00000 n +0000204506 00000 n +0000204570 00000 n +0000204631 00000 n +0000204693 00000 n +0000204755 00000 n +0000204818 00000 n +0000203156 00000 n +0000203317 00000 n +0000203473 00000 n +0000204882 00000 n +0000204944 00000 n +0000205005 00000 n +0000208499 00000 n +0000206648 00000 n +0000205190 00000 n +0000207117 00000 n +0000207180 00000 n +0000207244 00000 n +0000207306 00000 n +0000207368 00000 n +0000207555 00000 n +0000206798 00000 n +0000207617 00000 n +0000207678 00000 n +0000207742 00000 n +0000207806 00000 n +0000207870 00000 n +0000206954 00000 n +0000208059 00000 n +0000208121 00000 n +0000208185 00000 n +0000208247 00000 n +0000208309 00000 n +0000208373 00000 n +0000933307 00000 n +0000211086 00000 n +0000210151 00000 n +0000208610 00000 n +0000210336 00000 n +0000210398 00000 n +0000848967 00000 n +0000847474 00000 n +0000848804 00000 n +0000210462 00000 n +0000210524 00000 n +0000210586 00000 n +0000210648 00000 n +0000210710 00000 n +0000210772 00000 n +0000210834 00000 n +0000210896 00000 n +0000210960 00000 n +0000211024 00000 n +0000212021 00000 n +0000211899 00000 n +0000211223 00000 n +0000215915 00000 n +0000213076 00000 n +0000212106 00000 n +0000213322 00000 n +0000213509 00000 n +0000213571 00000 n +0000213635 00000 n +0000213697 00000 n +0000213760 00000 n +0000213825 00000 n +0000213888 00000 n +0000213951 00000 n +0000214014 00000 n +0000214078 00000 n +0000214141 00000 n +0000214204 00000 n +0000214267 00000 n +0000214330 00000 n +0000214394 00000 n +0000214458 00000 n +0000214521 00000 n +0000214584 00000 n +0000214648 00000 n +0000214712 00000 n +0000214776 00000 n +0000214841 00000 n +0000214906 00000 n +0000214968 00000 n +0000215030 00000 n +0000215093 00000 n +0000215156 00000 n +0000215219 00000 n +0000215283 00000 n +0000215347 00000 n +0000215410 00000 n +0000215473 00000 n +0000215536 00000 n +0000215726 00000 n +0000215788 00000 n +0000215852 00000 n +0000220062 00000 n +0000217031 00000 n +0000216026 00000 n +0000217156 00000 n +0000217220 00000 n +0000217284 00000 n +0000217348 00000 n +0000217414 00000 n +0000217478 00000 n +0000217542 00000 n +0000217606 00000 n +0000217670 00000 n +0000217736 00000 n +0000217800 00000 n +0000217864 00000 n +0000217928 00000 n +0000217992 00000 n +0000218058 00000 n +0000218124 00000 n +0000218188 00000 n +0000218252 00000 n +0000218317 00000 n +0000218382 00000 n +0000218447 00000 n +0000218513 00000 n +0000218579 00000 n +0000218643 00000 n +0000218707 00000 n +0000218772 00000 n +0000218835 00000 n +0000218900 00000 n +0000218965 00000 n +0000219031 00000 n +0000219097 00000 n +0000219161 00000 n +0000219225 00000 n +0000219288 00000 n +0000219481 00000 n +0000219545 00000 n +0000219611 00000 n +0000219675 00000 n +0000219738 00000 n +0000219804 00000 n +0000219868 00000 n +0000219932 00000 n +0000219996 00000 n +0000225075 00000 n +0000221395 00000 n +0000220174 00000 n +0000221520 00000 n +0000221584 00000 n +0000221648 00000 n +0000221712 00000 n +0000221776 00000 n +0000221842 00000 n +0000221908 00000 n +0000221971 00000 n +0000222034 00000 n +0000222099 00000 n +0000222164 00000 n +0000222229 00000 n +0000222295 00000 n +0000222361 00000 n +0000222425 00000 n +0000222489 00000 n +0000222553 00000 n +0000222746 00000 n +0000222810 00000 n +0000222876 00000 n +0000222940 00000 n +0000223004 00000 n +0000223070 00000 n +0000223134 00000 n +0000223198 00000 n +0000223262 00000 n +0000223328 00000 n +0000223392 00000 n +0000223456 00000 n +0000223520 00000 n +0000223584 00000 n +0000223650 00000 n +0000223716 00000 n +0000223780 00000 n +0000223844 00000 n +0000223909 00000 n +0000223974 00000 n +0000224039 00000 n +0000224105 00000 n +0000224171 00000 n +0000224235 00000 n +0000224299 00000 n +0000224364 00000 n +0000224429 00000 n +0000224493 00000 n +0000224558 00000 n +0000224623 00000 n +0000224687 00000 n +0000224752 00000 n +0000224817 00000 n +0000224881 00000 n +0000224946 00000 n +0000225011 00000 n +0000230588 00000 n +0000226718 00000 n +0000225187 00000 n +0000226844 00000 n +0000226908 00000 n +0000226972 00000 n +0000227037 00000 n +0000227102 00000 n +0000227166 00000 n +0000227231 00000 n +0000227296 00000 n +0000227360 00000 n +0000227425 00000 n +0000227490 00000 n +0000227554 00000 n +0000227619 00000 n +0000227684 00000 n +0000227748 00000 n +0000227813 00000 n +0000227878 00000 n +0000227942 00000 n +0000228007 00000 n +0000228072 00000 n +0000228136 00000 n +0000228201 00000 n +0000228266 00000 n +0000228330 00000 n +0000228394 00000 n +0000228458 00000 n +0000228651 00000 n +0000228715 00000 n +0000228780 00000 n +0000228844 00000 n +0000228908 00000 n +0000228974 00000 n +0000229038 00000 n +0000229102 00000 n +0000229166 00000 n +0000229232 00000 n +0000229296 00000 n +0000229359 00000 n +0000229423 00000 n +0000229487 00000 n +0000229553 00000 n +0000229619 00000 n +0000229683 00000 n +0000229747 00000 n +0000229811 00000 n +0000229875 00000 n +0000229940 00000 n +0000230006 00000 n +0000230072 00000 n +0000230136 00000 n +0000230202 00000 n +0000230268 00000 n +0000230332 00000 n +0000230396 00000 n +0000230459 00000 n +0000230523 00000 n +0000933427 00000 n +0000234592 00000 n +0000231756 00000 n +0000230700 00000 n +0000231882 00000 n +0000231946 00000 n +0000232010 00000 n +0000232074 00000 n +0000232138 00000 n +0000232331 00000 n +0000232395 00000 n +0000232461 00000 n +0000232525 00000 n +0000232589 00000 n +0000232655 00000 n +0000232719 00000 n +0000232783 00000 n +0000232847 00000 n +0000232913 00000 n +0000232977 00000 n +0000233041 00000 n +0000233105 00000 n +0000233169 00000 n +0000233235 00000 n +0000233301 00000 n +0000233365 00000 n +0000233429 00000 n +0000233494 00000 n +0000233559 00000 n +0000233624 00000 n +0000233690 00000 n +0000233756 00000 n +0000233819 00000 n +0000233884 00000 n +0000233949 00000 n +0000234013 00000 n +0000234077 00000 n +0000234142 00000 n +0000234206 00000 n +0000234271 00000 n +0000234335 00000 n +0000234399 00000 n +0000234463 00000 n +0000238104 00000 n +0000235592 00000 n +0000234704 00000 n +0000235718 00000 n +0000235846 00000 n +0000235910 00000 n +0000235976 00000 n +0000236040 00000 n +0000236104 00000 n +0000236168 00000 n +0000236234 00000 n +0000236298 00000 n +0000236362 00000 n +0000236426 00000 n +0000236490 00000 n +0000236556 00000 n +0000236622 00000 n +0000236686 00000 n +0000236750 00000 n +0000236815 00000 n +0000236880 00000 n +0000236945 00000 n +0000237010 00000 n +0000237075 00000 n +0000237139 00000 n +0000237203 00000 n +0000237267 00000 n +0000237458 00000 n +0000237522 00000 n +0000237588 00000 n +0000237652 00000 n +0000237716 00000 n +0000237782 00000 n +0000237846 00000 n +0000237910 00000 n +0000237974 00000 n +0000238040 00000 n +0000243191 00000 n +0000239324 00000 n +0000238216 00000 n +0000239450 00000 n +0000239577 00000 n +0000239641 00000 n +0000239705 00000 n +0000239769 00000 n +0000239835 00000 n +0000239901 00000 n +0000239965 00000 n +0000240029 00000 n +0000240094 00000 n +0000240159 00000 n +0000240224 00000 n +0000240289 00000 n +0000240354 00000 n +0000240418 00000 n +0000240482 00000 n +0000240547 00000 n +0000240612 00000 n +0000240676 00000 n +0000240741 00000 n +0000240806 00000 n +0000240870 00000 n +0000240935 00000 n +0000241000 00000 n +0000241064 00000 n +0000241128 00000 n +0000241192 00000 n +0000241255 00000 n +0000241318 00000 n +0000241382 00000 n +0000241575 00000 n +0000241639 00000 n +0000241705 00000 n +0000241769 00000 n +0000241833 00000 n +0000241899 00000 n +0000241963 00000 n +0000242027 00000 n +0000242091 00000 n +0000242156 00000 n +0000242220 00000 n +0000242284 00000 n +0000242348 00000 n +0000242412 00000 n +0000242478 00000 n +0000242544 00000 n +0000242608 00000 n +0000242672 00000 n +0000242737 00000 n +0000242802 00000 n +0000242867 00000 n +0000242933 00000 n +0000242999 00000 n +0000243063 00000 n +0000243127 00000 n +0000246824 00000 n +0000244246 00000 n +0000243303 00000 n +0000244372 00000 n +0000244436 00000 n +0000244566 00000 n +0000244630 00000 n +0000244696 00000 n +0000244760 00000 n +0000244823 00000 n +0000244889 00000 n +0000244953 00000 n +0000245017 00000 n +0000245081 00000 n +0000245147 00000 n +0000245211 00000 n +0000245275 00000 n +0000245339 00000 n +0000245402 00000 n +0000245468 00000 n +0000245534 00000 n +0000245598 00000 n +0000245662 00000 n +0000245727 00000 n +0000245792 00000 n +0000245856 00000 n +0000245922 00000 n +0000245988 00000 n +0000246052 00000 n +0000246115 00000 n +0000246179 00000 n +0000246372 00000 n +0000246436 00000 n +0000246502 00000 n +0000246566 00000 n +0000246630 00000 n +0000246696 00000 n +0000246760 00000 n +0000250972 00000 n +0000248202 00000 n +0000246936 00000 n +0000248328 00000 n +0000248392 00000 n +0000248456 00000 n +0000248522 00000 n +0000248586 00000 n +0000248650 00000 n +0000248714 00000 n +0000248778 00000 n +0000248844 00000 n +0000248910 00000 n +0000248974 00000 n +0000249038 00000 n +0000249103 00000 n +0000249168 00000 n +0000249233 00000 n +0000249299 00000 n +0000249365 00000 n +0000249429 00000 n +0000249493 00000 n +0000249558 00000 n +0000249623 00000 n +0000249687 00000 n +0000249752 00000 n +0000249817 00000 n +0000249881 00000 n +0000249945 00000 n +0000250009 00000 n +0000250201 00000 n +0000250264 00000 n +0000250330 00000 n +0000250394 00000 n +0000250458 00000 n +0000250522 00000 n +0000250586 00000 n +0000250650 00000 n +0000250714 00000 n +0000250778 00000 n +0000250842 00000 n +0000250908 00000 n +0000257515 00000 n +0000252685 00000 n +0000251084 00000 n +0000252811 00000 n +0000252875 00000 n +0000252939 00000 n +0000253003 00000 n +0000253067 00000 n +0000253131 00000 n +0000253197 00000 n +0000253263 00000 n +0000253327 00000 n +0000253391 00000 n +0000253456 00000 n +0000253521 00000 n +0000253586 00000 n +0000253651 00000 n +0000253716 00000 n +0000253780 00000 n +0000253844 00000 n +0000253909 00000 n +0000253973 00000 n +0000254038 00000 n +0000254103 00000 n +0000254168 00000 n +0000254233 00000 n +0000254296 00000 n +0000254359 00000 n +0000254424 00000 n +0000254489 00000 n +0000254553 00000 n +0000254618 00000 n +0000254683 00000 n +0000254747 00000 n +0000254812 00000 n +0000254877 00000 n +0000254941 00000 n +0000255004 00000 n +0000255067 00000 n +0000255131 00000 n +0000255196 00000 n +0000255261 00000 n +0000255325 00000 n +0000255390 00000 n +0000255455 00000 n +0000255518 00000 n +0000255583 00000 n +0000255648 00000 n +0000255712 00000 n +0000255776 00000 n +0000255840 00000 n +0000255904 00000 n +0000255969 00000 n +0000256034 00000 n +0000256098 00000 n +0000256163 00000 n +0000256228 00000 n +0000256292 00000 n +0000256357 00000 n +0000256422 00000 n +0000256486 00000 n +0000256550 00000 n +0000256614 00000 n +0000256678 00000 n +0000256743 00000 n +0000256808 00000 n +0000256872 00000 n +0000256936 00000 n +0000257000 00000 n +0000257193 00000 n +0000257257 00000 n +0000257321 00000 n +0000257385 00000 n +0000257449 00000 n +0000933552 00000 n +0000262512 00000 n +0000259033 00000 n +0000257627 00000 n +0000259159 00000 n +0000259223 00000 n +0000259287 00000 n +0000259351 00000 n +0000259415 00000 n +0000259479 00000 n +0000259545 00000 n +0000259609 00000 n +0000259673 00000 n +0000259737 00000 n +0000259801 00000 n +0000259867 00000 n +0000259933 00000 n +0000259997 00000 n +0000260061 00000 n +0000260125 00000 n +0000260189 00000 n +0000260254 00000 n +0000260320 00000 n +0000260386 00000 n +0000260450 00000 n +0000260514 00000 n +0000260579 00000 n +0000260643 00000 n +0000260707 00000 n +0000260772 00000 n +0000260838 00000 n +0000260904 00000 n +0000260968 00000 n +0000261032 00000 n +0000261097 00000 n +0000261162 00000 n +0000261226 00000 n +0000261290 00000 n +0000261354 00000 n +0000261418 00000 n +0000261483 00000 n +0000261548 00000 n +0000261612 00000 n +0000261677 00000 n +0000261742 00000 n +0000261806 00000 n +0000261870 00000 n +0000261934 00000 n +0000262124 00000 n +0000262188 00000 n +0000262254 00000 n +0000262318 00000 n +0000262382 00000 n +0000262448 00000 n +0000266728 00000 n +0000263759 00000 n +0000262624 00000 n +0000263885 00000 n +0000263949 00000 n +0000264013 00000 n +0000264077 00000 n +0000264141 00000 n +0000264205 00000 n +0000264269 00000 n +0000264335 00000 n +0000264401 00000 n +0000264465 00000 n +0000264529 00000 n +0000264594 00000 n +0000264659 00000 n +0000264724 00000 n +0000264790 00000 n +0000264856 00000 n +0000264920 00000 n +0000264984 00000 n +0000265049 00000 n +0000265113 00000 n +0000265178 00000 n +0000265243 00000 n +0000265309 00000 n +0000265375 00000 n +0000265439 00000 n +0000265503 00000 n +0000265568 00000 n +0000265632 00000 n +0000265697 00000 n +0000265761 00000 n +0000265825 00000 n +0000265889 00000 n +0000266082 00000 n +0000266146 00000 n +0000266212 00000 n +0000266276 00000 n +0000266340 00000 n +0000266406 00000 n +0000266470 00000 n +0000266534 00000 n +0000266598 00000 n +0000266662 00000 n +0000271395 00000 n +0000268044 00000 n +0000266840 00000 n +0000268170 00000 n +0000268234 00000 n +0000268298 00000 n +0000268362 00000 n +0000268426 00000 n +0000268492 00000 n +0000268558 00000 n +0000268621 00000 n +0000268684 00000 n +0000268749 00000 n +0000268814 00000 n +0000268879 00000 n +0000268945 00000 n +0000269011 00000 n +0000269075 00000 n +0000269139 00000 n +0000269204 00000 n +0000269267 00000 n +0000269332 00000 n +0000269397 00000 n +0000269463 00000 n +0000269529 00000 n +0000269593 00000 n +0000269659 00000 n +0000269725 00000 n +0000269789 00000 n +0000269853 00000 n +0000269915 00000 n +0000270108 00000 n +0000270172 00000 n +0000270238 00000 n +0000270302 00000 n +0000270366 00000 n +0000270432 00000 n +0000270494 00000 n +0000270558 00000 n +0000270622 00000 n +0000270686 00000 n +0000270752 00000 n +0000270816 00000 n +0000270879 00000 n +0000270943 00000 n +0000271007 00000 n +0000271073 00000 n +0000271139 00000 n +0000271203 00000 n +0000271267 00000 n +0000271331 00000 n +0000276750 00000 n +0000272813 00000 n +0000271507 00000 n +0000272939 00000 n +0000273003 00000 n +0000273068 00000 n +0000273134 00000 n +0000273200 00000 n +0000273264 00000 n +0000273328 00000 n +0000273393 00000 n +0000273457 00000 n +0000273522 00000 n +0000273587 00000 n +0000273653 00000 n +0000273719 00000 n +0000273783 00000 n +0000273847 00000 n +0000273912 00000 n +0000273977 00000 n +0000274041 00000 n +0000274106 00000 n +0000274171 00000 n +0000274235 00000 n +0000274300 00000 n +0000274365 00000 n +0000274429 00000 n +0000274494 00000 n +0000274559 00000 n +0000274623 00000 n +0000274688 00000 n +0000274753 00000 n +0000274817 00000 n +0000274882 00000 n +0000274947 00000 n +0000275011 00000 n +0000275076 00000 n +0000275141 00000 n +0000275205 00000 n +0000275269 00000 n +0000275333 00000 n +0000275525 00000 n +0000275589 00000 n +0000275655 00000 n +0000275718 00000 n +0000275782 00000 n +0000275848 00000 n +0000275912 00000 n +0000275976 00000 n +0000276040 00000 n +0000276106 00000 n +0000276170 00000 n +0000276234 00000 n +0000276298 00000 n +0000276362 00000 n +0000276428 00000 n +0000276494 00000 n +0000276557 00000 n +0000276620 00000 n +0000276685 00000 n +0000281605 00000 n +0000278119 00000 n +0000276862 00000 n +0000278245 00000 n +0000278309 00000 n +0000278374 00000 n +0000278440 00000 n +0000278506 00000 n +0000278570 00000 n +0000278634 00000 n +0000278699 00000 n +0000278764 00000 n +0000278828 00000 n +0000278893 00000 n +0000278958 00000 n +0000279022 00000 n +0000279087 00000 n +0000279152 00000 n +0000279216 00000 n +0000279281 00000 n +0000279346 00000 n +0000279410 00000 n +0000279474 00000 n +0000279538 00000 n +0000279732 00000 n +0000279796 00000 n +0000279862 00000 n +0000279926 00000 n +0000279990 00000 n +0000280056 00000 n +0000280120 00000 n +0000280184 00000 n +0000280248 00000 n +0000280312 00000 n +0000280378 00000 n +0000280442 00000 n +0000280505 00000 n +0000280569 00000 n +0000280633 00000 n +0000280699 00000 n +0000280765 00000 n +0000280829 00000 n +0000280893 00000 n +0000280958 00000 n +0000281023 00000 n +0000281088 00000 n +0000281153 00000 n +0000281218 00000 n +0000281282 00000 n +0000281346 00000 n +0000281411 00000 n +0000281475 00000 n +0000281540 00000 n +0000286993 00000 n +0000283061 00000 n +0000281717 00000 n +0000283187 00000 n +0000283251 00000 n +0000283317 00000 n +0000283383 00000 n +0000283447 00000 n +0000283511 00000 n +0000283576 00000 n +0000283641 00000 n +0000283705 00000 n +0000283770 00000 n +0000283835 00000 n +0000283899 00000 n +0000283963 00000 n +0000284027 00000 n +0000284221 00000 n +0000284285 00000 n +0000284350 00000 n +0000284414 00000 n +0000284478 00000 n +0000284544 00000 n +0000284608 00000 n +0000284671 00000 n +0000284735 00000 n +0000284799 00000 n +0000284865 00000 n +0000284929 00000 n +0000284993 00000 n +0000285057 00000 n +0000285121 00000 n +0000285187 00000 n +0000285253 00000 n +0000285315 00000 n +0000285377 00000 n +0000285442 00000 n +0000285507 00000 n +0000285571 00000 n +0000285637 00000 n +0000285703 00000 n +0000285767 00000 n +0000285831 00000 n +0000285896 00000 n +0000285961 00000 n +0000286025 00000 n +0000286090 00000 n +0000286155 00000 n +0000286219 00000 n +0000286283 00000 n +0000286347 00000 n +0000286411 00000 n +0000286476 00000 n +0000286541 00000 n +0000286605 00000 n +0000286670 00000 n +0000286735 00000 n +0000286799 00000 n +0000286864 00000 n +0000286929 00000 n +0000933677 00000 n +0000291669 00000 n +0000288382 00000 n +0000287105 00000 n +0000288508 00000 n +0000288572 00000 n +0000288637 00000 n +0000288702 00000 n +0000288766 00000 n +0000288831 00000 n +0000288896 00000 n +0000288960 00000 n +0000289024 00000 n +0000289088 00000 n +0000289282 00000 n +0000289346 00000 n +0000289412 00000 n +0000289476 00000 n +0000289540 00000 n +0000289606 00000 n +0000289670 00000 n +0000289734 00000 n +0000289798 00000 n +0000289864 00000 n +0000289928 00000 n +0000289992 00000 n +0000290056 00000 n +0000290120 00000 n +0000290186 00000 n +0000290252 00000 n +0000290315 00000 n +0000290378 00000 n +0000290443 00000 n +0000290508 00000 n +0000290572 00000 n +0000290638 00000 n +0000290704 00000 n +0000290768 00000 n +0000290832 00000 n +0000290897 00000 n +0000290960 00000 n +0000291025 00000 n +0000291089 00000 n +0000291155 00000 n +0000291221 00000 n +0000291285 00000 n +0000291349 00000 n +0000291414 00000 n +0000291477 00000 n +0000291542 00000 n +0000291606 00000 n +0000295995 00000 n +0000292900 00000 n +0000291781 00000 n +0000293026 00000 n +0000293090 00000 n +0000293154 00000 n +0000293218 00000 n +0000293412 00000 n +0000293476 00000 n +0000293542 00000 n +0000293606 00000 n +0000293669 00000 n +0000293735 00000 n +0000293799 00000 n +0000293863 00000 n +0000293927 00000 n +0000293993 00000 n +0000294055 00000 n +0000294119 00000 n +0000294182 00000 n +0000294246 00000 n +0000294312 00000 n +0000294378 00000 n +0000294442 00000 n +0000294506 00000 n +0000294571 00000 n +0000294636 00000 n +0000294701 00000 n +0000294767 00000 n +0000294833 00000 n +0000294897 00000 n +0000294961 00000 n +0000295026 00000 n +0000295090 00000 n +0000295155 00000 n +0000295220 00000 n +0000295286 00000 n +0000295352 00000 n +0000295416 00000 n +0000295480 00000 n +0000295545 00000 n +0000295609 00000 n +0000295674 00000 n +0000295738 00000 n +0000295802 00000 n +0000295866 00000 n +0000299685 00000 n +0000297104 00000 n +0000296107 00000 n +0000297230 00000 n +0000297359 00000 n +0000297423 00000 n +0000297489 00000 n +0000297553 00000 n +0000297617 00000 n +0000297681 00000 n +0000297747 00000 n +0000297811 00000 n +0000297875 00000 n +0000297939 00000 n +0000298003 00000 n +0000298069 00000 n +0000298135 00000 n +0000298199 00000 n +0000298263 00000 n +0000298328 00000 n +0000298393 00000 n +0000298458 00000 n +0000298523 00000 n +0000298588 00000 n +0000298652 00000 n +0000298718 00000 n +0000298784 00000 n +0000298848 00000 n +0000298911 00000 n +0000298975 00000 n +0000299169 00000 n +0000299233 00000 n +0000299299 00000 n +0000299363 00000 n +0000299427 00000 n +0000299493 00000 n +0000299557 00000 n +0000299621 00000 n +0000304028 00000 n +0000300931 00000 n +0000299797 00000 n +0000301057 00000 n +0000301121 00000 n +0000301185 00000 n +0000301251 00000 n +0000301315 00000 n +0000301379 00000 n +0000301443 00000 n +0000301507 00000 n +0000301573 00000 n +0000301639 00000 n +0000301703 00000 n +0000301767 00000 n +0000301832 00000 n +0000301897 00000 n +0000301962 00000 n +0000302028 00000 n +0000302094 00000 n +0000302158 00000 n +0000302222 00000 n +0000302287 00000 n +0000302351 00000 n +0000302416 00000 n +0000302481 00000 n +0000302547 00000 n +0000302613 00000 n +0000302677 00000 n +0000302741 00000 n +0000302806 00000 n +0000302870 00000 n +0000302935 00000 n +0000302999 00000 n +0000303063 00000 n +0000303127 00000 n +0000303320 00000 n +0000303383 00000 n +0000303449 00000 n +0000303513 00000 n +0000303577 00000 n +0000303642 00000 n +0000303706 00000 n +0000303770 00000 n +0000303834 00000 n +0000303898 00000 n +0000303964 00000 n +0000309408 00000 n +0000305476 00000 n +0000304140 00000 n +0000305602 00000 n +0000305666 00000 n +0000305730 00000 n +0000305794 00000 n +0000305858 00000 n +0000305924 00000 n +0000305990 00000 n +0000306054 00000 n +0000306118 00000 n +0000306183 00000 n +0000306248 00000 n +0000306313 00000 n +0000306378 00000 n +0000306443 00000 n +0000306507 00000 n +0000306571 00000 n +0000306636 00000 n +0000306700 00000 n +0000306765 00000 n +0000306830 00000 n +0000306895 00000 n +0000306960 00000 n +0000307023 00000 n +0000307086 00000 n +0000307151 00000 n +0000307216 00000 n +0000307280 00000 n +0000307345 00000 n +0000307410 00000 n +0000307474 00000 n +0000307539 00000 n +0000307604 00000 n +0000307668 00000 n +0000307731 00000 n +0000307794 00000 n +0000307858 00000 n +0000307923 00000 n +0000307988 00000 n +0000308052 00000 n +0000308117 00000 n +0000308182 00000 n +0000308246 00000 n +0000308311 00000 n +0000308376 00000 n +0000308440 00000 n +0000308504 00000 n +0000308568 00000 n +0000308762 00000 n +0000308826 00000 n +0000308892 00000 n +0000308956 00000 n +0000309020 00000 n +0000309086 00000 n +0000309150 00000 n +0000309214 00000 n +0000309278 00000 n +0000309344 00000 n +0000315206 00000 n +0000311149 00000 n +0000309520 00000 n +0000311275 00000 n +0000311339 00000 n +0000311403 00000 n +0000311467 00000 n +0000311531 00000 n +0000311595 00000 n +0000311661 00000 n +0000311727 00000 n +0000311791 00000 n +0000311855 00000 n +0000311920 00000 n +0000311985 00000 n +0000312050 00000 n +0000312115 00000 n +0000312180 00000 n +0000312243 00000 n +0000312306 00000 n +0000312371 00000 n +0000312436 00000 n +0000312500 00000 n +0000312565 00000 n +0000312630 00000 n +0000312694 00000 n +0000312759 00000 n +0000312824 00000 n +0000312888 00000 n +0000312952 00000 n +0000313016 00000 n +0000313080 00000 n +0000313145 00000 n +0000313210 00000 n +0000313274 00000 n +0000313339 00000 n +0000313404 00000 n +0000313467 00000 n +0000313532 00000 n +0000313597 00000 n +0000313661 00000 n +0000313724 00000 n +0000313787 00000 n +0000313851 00000 n +0000313916 00000 n +0000313981 00000 n +0000314045 00000 n +0000314110 00000 n +0000314175 00000 n +0000314239 00000 n +0000314303 00000 n +0000314367 00000 n +0000314560 00000 n +0000314624 00000 n +0000314690 00000 n +0000314754 00000 n +0000314818 00000 n +0000314884 00000 n +0000314948 00000 n +0000315012 00000 n +0000315076 00000 n +0000315140 00000 n +0000933802 00000 n +0000320134 00000 n +0000316586 00000 n +0000315318 00000 n +0000316712 00000 n +0000316776 00000 n +0000316840 00000 n +0000316904 00000 n +0000316968 00000 n +0000317032 00000 n +0000317098 00000 n +0000317164 00000 n +0000317227 00000 n +0000317290 00000 n +0000317355 00000 n +0000317420 00000 n +0000317485 00000 n +0000317551 00000 n +0000317617 00000 n +0000317681 00000 n +0000317745 00000 n +0000317810 00000 n +0000317873 00000 n +0000317938 00000 n +0000318003 00000 n +0000318069 00000 n +0000318135 00000 n +0000318199 00000 n +0000318263 00000 n +0000318328 00000 n +0000318392 00000 n +0000318457 00000 n +0000318521 00000 n +0000318587 00000 n +0000318653 00000 n +0000318717 00000 n +0000318783 00000 n +0000318849 00000 n +0000318913 00000 n +0000318977 00000 n +0000319042 00000 n +0000319106 00000 n +0000319170 00000 n +0000319233 00000 n +0000319296 00000 n +0000319360 00000 n +0000319554 00000 n +0000319618 00000 n +0000319684 00000 n +0000319748 00000 n +0000319812 00000 n +0000319878 00000 n +0000319942 00000 n +0000320006 00000 n +0000320069 00000 n +0000324792 00000 n +0000321371 00000 n +0000320246 00000 n +0000321497 00000 n +0000321561 00000 n +0000321625 00000 n +0000321689 00000 n +0000321753 00000 n +0000321819 00000 n +0000321885 00000 n +0000321948 00000 n +0000322011 00000 n +0000322076 00000 n +0000322141 00000 n +0000322206 00000 n +0000322272 00000 n +0000322338 00000 n +0000322402 00000 n +0000322466 00000 n +0000322531 00000 n +0000322596 00000 n +0000322660 00000 n +0000322725 00000 n +0000322790 00000 n +0000322853 00000 n +0000322918 00000 n +0000322983 00000 n +0000323046 00000 n +0000323110 00000 n +0000323174 00000 n +0000323368 00000 n +0000323432 00000 n +0000323498 00000 n +0000323562 00000 n +0000323626 00000 n +0000323692 00000 n +0000323756 00000 n +0000323820 00000 n +0000323884 00000 n +0000323949 00000 n +0000324013 00000 n +0000324077 00000 n +0000324141 00000 n +0000324205 00000 n +0000324271 00000 n +0000324337 00000 n +0000324401 00000 n +0000324465 00000 n +0000324530 00000 n +0000324595 00000 n +0000324660 00000 n +0000324726 00000 n +0000329724 00000 n +0000326310 00000 n +0000324904 00000 n +0000326436 00000 n +0000326563 00000 n +0000326627 00000 n +0000326691 00000 n +0000326755 00000 n +0000326949 00000 n +0000327013 00000 n +0000327079 00000 n +0000327143 00000 n +0000327207 00000 n +0000327273 00000 n +0000327337 00000 n +0000327400 00000 n +0000327464 00000 n +0000327528 00000 n +0000327592 00000 n +0000327658 00000 n +0000327722 00000 n +0000327785 00000 n +0000327849 00000 n +0000327913 00000 n +0000327979 00000 n +0000328045 00000 n +0000328109 00000 n +0000328173 00000 n +0000328238 00000 n +0000328303 00000 n +0000328368 00000 n +0000328434 00000 n +0000328500 00000 n +0000328564 00000 n +0000328628 00000 n +0000328693 00000 n +0000328758 00000 n +0000328822 00000 n +0000328887 00000 n +0000328952 00000 n +0000329016 00000 n +0000329081 00000 n +0000329146 00000 n +0000329209 00000 n +0000329274 00000 n +0000329339 00000 n +0000329403 00000 n +0000329468 00000 n +0000329533 00000 n +0000329597 00000 n +0000329661 00000 n +0000334051 00000 n +0000331015 00000 n +0000329836 00000 n +0000331141 00000 n +0000331205 00000 n +0000331269 00000 n +0000331400 00000 n +0000331464 00000 n +0000331530 00000 n +0000331594 00000 n +0000331658 00000 n +0000331724 00000 n +0000331788 00000 n +0000331852 00000 n +0000331916 00000 n +0000331980 00000 n +0000332046 00000 n +0000332110 00000 n +0000332174 00000 n +0000332238 00000 n +0000332302 00000 n +0000332368 00000 n +0000332434 00000 n +0000332498 00000 n +0000332562 00000 n +0000332627 00000 n +0000332692 00000 n +0000332757 00000 n +0000332823 00000 n +0000332889 00000 n +0000332953 00000 n +0000333017 00000 n +0000333082 00000 n +0000333146 00000 n +0000333211 00000 n +0000333276 00000 n +0000333342 00000 n +0000333408 00000 n +0000333472 00000 n +0000333536 00000 n +0000333601 00000 n +0000333665 00000 n +0000333730 00000 n +0000333794 00000 n +0000333858 00000 n +0000333922 00000 n +0000337460 00000 n +0000335144 00000 n +0000334163 00000 n +0000335270 00000 n +0000335399 00000 n +0000335463 00000 n +0000335528 00000 n +0000335592 00000 n +0000335654 00000 n +0000335720 00000 n +0000335784 00000 n +0000335848 00000 n +0000335912 00000 n +0000335976 00000 n +0000336042 00000 n +0000336108 00000 n +0000336172 00000 n +0000336236 00000 n +0000336301 00000 n +0000336366 00000 n +0000336430 00000 n +0000336494 00000 n +0000336558 00000 n +0000336751 00000 n +0000336815 00000 n +0000336881 00000 n +0000336945 00000 n +0000337009 00000 n +0000337075 00000 n +0000337139 00000 n +0000337203 00000 n +0000337267 00000 n +0000337331 00000 n +0000337396 00000 n +0000343223 00000 n +0000338904 00000 n +0000337572 00000 n +0000339030 00000 n +0000339094 00000 n +0000339158 00000 n +0000339222 00000 n +0000339286 00000 n +0000339352 00000 n +0000339418 00000 n +0000339482 00000 n +0000339546 00000 n +0000339611 00000 n +0000339676 00000 n +0000339741 00000 n +0000339806 00000 n +0000339871 00000 n +0000339935 00000 n +0000339999 00000 n +0000340063 00000 n +0000340256 00000 n +0000340320 00000 n +0000340386 00000 n +0000340450 00000 n +0000340514 00000 n +0000340580 00000 n +0000340644 00000 n +0000340708 00000 n +0000340774 00000 n +0000340838 00000 n +0000340902 00000 n +0000340966 00000 n +0000341030 00000 n +0000341096 00000 n +0000341162 00000 n +0000341226 00000 n +0000341290 00000 n +0000341355 00000 n +0000341420 00000 n +0000341484 00000 n +0000341549 00000 n +0000341614 00000 n +0000341678 00000 n +0000341742 00000 n +0000341806 00000 n +0000341870 00000 n +0000341933 00000 n +0000341997 00000 n +0000342063 00000 n +0000342127 00000 n +0000342191 00000 n +0000342256 00000 n +0000342321 00000 n +0000342385 00000 n +0000342450 00000 n +0000342515 00000 n +0000342579 00000 n +0000342644 00000 n +0000342709 00000 n +0000342772 00000 n +0000342837 00000 n +0000342902 00000 n +0000342966 00000 n +0000343030 00000 n +0000343095 00000 n +0000343160 00000 n +0000933927 00000 n +0000349409 00000 n +0000344927 00000 n +0000343335 00000 n +0000345053 00000 n +0000345117 00000 n +0000345183 00000 n +0000345249 00000 n +0000345313 00000 n +0000345379 00000 n +0000345445 00000 n +0000345509 00000 n +0000345575 00000 n +0000345641 00000 n +0000345705 00000 n +0000345771 00000 n +0000345837 00000 n +0000345901 00000 n +0000345967 00000 n +0000346033 00000 n +0000346097 00000 n +0000346163 00000 n +0000346229 00000 n +0000346293 00000 n +0000346359 00000 n +0000346425 00000 n +0000346489 00000 n +0000346555 00000 n +0000346621 00000 n +0000346685 00000 n +0000346751 00000 n +0000346817 00000 n +0000346881 00000 n +0000346947 00000 n +0000347013 00000 n +0000347077 00000 n +0000347143 00000 n +0000347209 00000 n +0000347273 00000 n +0000347339 00000 n +0000347405 00000 n +0000347469 00000 n +0000347535 00000 n +0000347601 00000 n +0000347665 00000 n +0000347731 00000 n +0000347797 00000 n +0000347862 00000 n +0000347927 00000 n +0000348119 00000 n +0000348183 00000 n +0000348249 00000 n +0000348313 00000 n +0000348376 00000 n +0000348442 00000 n +0000348506 00000 n +0000348570 00000 n +0000348634 00000 n +0000348700 00000 n +0000348764 00000 n +0000348828 00000 n +0000348892 00000 n +0000348955 00000 n +0000349021 00000 n +0000349087 00000 n +0000349151 00000 n +0000349215 00000 n +0000349280 00000 n +0000349345 00000 n +0000354952 00000 n +0000350883 00000 n +0000349521 00000 n +0000351009 00000 n +0000351073 00000 n +0000351138 00000 n +0000351203 00000 n +0000351267 00000 n +0000351332 00000 n +0000351397 00000 n +0000351462 00000 n +0000351528 00000 n +0000351594 00000 n +0000351658 00000 n +0000351724 00000 n +0000351790 00000 n +0000351854 00000 n +0000351920 00000 n +0000351986 00000 n +0000352050 00000 n +0000352116 00000 n +0000352182 00000 n +0000352246 00000 n +0000352310 00000 n +0000352374 00000 n +0000352568 00000 n +0000352632 00000 n +0000352698 00000 n +0000352762 00000 n +0000352826 00000 n +0000352892 00000 n +0000352956 00000 n +0000353020 00000 n +0000353084 00000 n +0000353150 00000 n +0000353214 00000 n +0000353278 00000 n +0000353342 00000 n +0000353406 00000 n +0000353472 00000 n +0000353538 00000 n +0000353601 00000 n +0000353664 00000 n +0000353729 00000 n +0000353794 00000 n +0000353857 00000 n +0000353921 00000 n +0000353985 00000 n +0000354049 00000 n +0000354114 00000 n +0000354179 00000 n +0000354244 00000 n +0000354310 00000 n +0000354376 00000 n +0000354440 00000 n +0000354504 00000 n +0000354567 00000 n +0000354630 00000 n +0000354694 00000 n +0000354759 00000 n +0000354824 00000 n +0000354888 00000 n +0000360056 00000 n +0000356361 00000 n +0000355064 00000 n +0000356487 00000 n +0000356551 00000 n +0000356615 00000 n +0000356681 00000 n +0000356747 00000 n +0000356811 00000 n +0000356877 00000 n +0000356943 00000 n +0000357007 00000 n +0000357073 00000 n +0000357139 00000 n +0000357203 00000 n +0000357269 00000 n +0000357335 00000 n +0000357399 00000 n +0000357465 00000 n +0000357531 00000 n +0000357595 00000 n +0000357661 00000 n +0000357727 00000 n +0000357791 00000 n +0000357857 00000 n +0000357923 00000 n +0000357987 00000 n +0000358053 00000 n +0000358119 00000 n +0000358184 00000 n +0000358249 00000 n +0000358314 00000 n +0000358378 00000 n +0000358442 00000 n +0000358506 00000 n +0000358699 00000 n +0000358763 00000 n +0000358829 00000 n +0000358893 00000 n +0000358957 00000 n +0000359023 00000 n +0000359087 00000 n +0000359151 00000 n +0000359215 00000 n +0000359279 00000 n +0000359345 00000 n +0000359409 00000 n +0000359473 00000 n +0000359537 00000 n +0000359601 00000 n +0000359667 00000 n +0000359733 00000 n +0000359797 00000 n +0000359861 00000 n +0000359926 00000 n +0000359991 00000 n +0000364264 00000 n +0000361230 00000 n +0000360168 00000 n +0000361356 00000 n +0000361420 00000 n +0000361484 00000 n +0000361550 00000 n +0000361616 00000 n +0000361680 00000 n +0000361744 00000 n +0000361938 00000 n +0000362002 00000 n +0000362068 00000 n +0000362132 00000 n +0000362196 00000 n +0000362262 00000 n +0000362326 00000 n +0000362390 00000 n +0000362454 00000 n +0000362518 00000 n +0000362584 00000 n +0000362648 00000 n +0000362712 00000 n +0000362776 00000 n +0000362840 00000 n +0000362906 00000 n +0000362972 00000 n +0000363036 00000 n +0000363100 00000 n +0000363164 00000 n +0000363228 00000 n +0000363293 00000 n +0000363359 00000 n +0000363425 00000 n +0000363489 00000 n +0000363553 00000 n +0000363618 00000 n +0000363682 00000 n +0000363746 00000 n +0000363811 00000 n +0000363877 00000 n +0000363943 00000 n +0000364007 00000 n +0000364071 00000 n +0000364135 00000 n +0000367943 00000 n +0000365300 00000 n +0000364376 00000 n +0000365426 00000 n +0000365490 00000 n +0000365619 00000 n +0000365683 00000 n +0000365749 00000 n +0000365813 00000 n +0000365877 00000 n +0000365941 00000 n +0000366007 00000 n +0000366071 00000 n +0000366135 00000 n +0000366199 00000 n +0000366263 00000 n +0000366329 00000 n +0000366395 00000 n +0000366459 00000 n +0000366523 00000 n +0000366588 00000 n +0000366653 00000 n +0000366718 00000 n +0000366783 00000 n +0000366848 00000 n +0000366912 00000 n +0000366976 00000 n +0000367041 00000 n +0000367105 00000 n +0000367170 00000 n +0000367234 00000 n +0000367298 00000 n +0000367362 00000 n +0000367555 00000 n +0000367619 00000 n +0000367685 00000 n +0000367749 00000 n +0000367813 00000 n +0000367879 00000 n +0000372232 00000 n +0000369135 00000 n +0000368055 00000 n +0000369261 00000 n +0000369325 00000 n +0000369389 00000 n +0000369453 00000 n +0000369519 00000 n +0000369583 00000 n +0000369647 00000 n +0000369711 00000 n +0000369775 00000 n +0000369841 00000 n +0000369907 00000 n +0000369971 00000 n +0000370035 00000 n +0000370100 00000 n +0000370165 00000 n +0000370230 00000 n +0000370296 00000 n +0000370362 00000 n +0000370424 00000 n +0000370488 00000 n +0000370552 00000 n +0000370746 00000 n +0000370810 00000 n +0000370876 00000 n +0000370940 00000 n +0000371004 00000 n +0000371069 00000 n +0000371133 00000 n +0000371197 00000 n +0000371261 00000 n +0000371327 00000 n +0000371391 00000 n +0000371455 00000 n +0000371519 00000 n +0000371581 00000 n +0000371647 00000 n +0000371713 00000 n +0000371777 00000 n +0000371841 00000 n +0000371906 00000 n +0000371971 00000 n +0000372036 00000 n +0000372102 00000 n +0000372168 00000 n +0000934052 00000 n +0000376827 00000 n +0000373539 00000 n +0000372344 00000 n +0000373665 00000 n +0000373729 00000 n +0000373795 00000 n +0000373861 00000 n +0000373925 00000 n +0000373989 00000 n +0000374054 00000 n +0000374118 00000 n +0000374183 00000 n +0000374247 00000 n +0000374311 00000 n +0000374375 00000 n +0000374569 00000 n +0000374633 00000 n +0000374698 00000 n +0000374762 00000 n +0000374826 00000 n +0000374892 00000 n +0000374956 00000 n +0000375020 00000 n +0000375084 00000 n +0000375150 00000 n +0000375214 00000 n +0000375278 00000 n +0000375342 00000 n +0000375406 00000 n +0000375472 00000 n +0000375538 00000 n +0000375602 00000 n +0000375666 00000 n +0000375730 00000 n +0000375794 00000 n +0000375859 00000 n +0000375925 00000 n +0000375991 00000 n +0000376055 00000 n +0000376121 00000 n +0000376187 00000 n +0000376250 00000 n +0000376313 00000 n +0000376377 00000 n +0000376441 00000 n +0000376506 00000 n +0000376570 00000 n +0000376634 00000 n +0000376698 00000 n +0000380619 00000 n +0000377911 00000 n +0000376939 00000 n +0000378037 00000 n +0000378101 00000 n +0000378230 00000 n +0000378294 00000 n +0000378359 00000 n +0000378423 00000 n +0000378487 00000 n +0000378553 00000 n +0000378617 00000 n +0000378681 00000 n +0000378747 00000 n +0000378811 00000 n +0000378875 00000 n +0000378939 00000 n +0000379003 00000 n +0000379069 00000 n +0000379135 00000 n +0000379199 00000 n +0000379263 00000 n +0000379328 00000 n +0000379393 00000 n +0000379458 00000 n +0000379524 00000 n +0000379590 00000 n +0000379653 00000 n +0000379717 00000 n +0000379781 00000 n +0000379974 00000 n +0000380038 00000 n +0000380104 00000 n +0000380168 00000 n +0000380232 00000 n +0000380297 00000 n +0000380361 00000 n +0000380425 00000 n +0000380489 00000 n +0000380553 00000 n +0000384914 00000 n +0000381753 00000 n +0000380731 00000 n +0000381879 00000 n +0000381943 00000 n +0000382007 00000 n +0000382071 00000 n +0000382135 00000 n +0000382201 00000 n +0000382267 00000 n +0000382330 00000 n +0000382393 00000 n +0000382458 00000 n +0000382523 00000 n +0000382588 00000 n +0000382654 00000 n +0000382720 00000 n +0000382784 00000 n +0000382848 00000 n +0000382912 00000 n +0000383106 00000 n +0000383170 00000 n +0000383236 00000 n +0000383300 00000 n +0000383364 00000 n +0000383430 00000 n +0000383494 00000 n +0000383558 00000 n +0000383622 00000 n +0000383686 00000 n +0000383752 00000 n +0000383816 00000 n +0000383880 00000 n +0000383944 00000 n +0000384008 00000 n +0000384074 00000 n +0000384140 00000 n +0000384204 00000 n +0000384268 00000 n +0000384333 00000 n +0000384398 00000 n +0000384463 00000 n +0000384529 00000 n +0000384595 00000 n +0000384658 00000 n +0000384722 00000 n +0000384786 00000 n +0000388515 00000 n +0000385937 00000 n +0000385026 00000 n +0000386063 00000 n +0000386192 00000 n +0000386256 00000 n +0000386322 00000 n +0000386386 00000 n +0000386450 00000 n +0000386516 00000 n +0000386580 00000 n +0000386644 00000 n +0000386708 00000 n +0000386774 00000 n +0000386838 00000 n +0000386902 00000 n +0000386966 00000 n +0000387030 00000 n +0000387096 00000 n +0000387162 00000 n +0000387226 00000 n +0000387290 00000 n +0000387355 00000 n +0000387420 00000 n +0000387485 00000 n +0000387550 00000 n +0000387615 00000 n +0000387679 00000 n +0000387743 00000 n +0000387807 00000 n +0000387999 00000 n +0000388063 00000 n +0000388129 00000 n +0000388193 00000 n +0000388257 00000 n +0000388323 00000 n +0000388387 00000 n +0000388451 00000 n +0000392875 00000 n +0000389586 00000 n +0000388627 00000 n +0000389712 00000 n +0000389839 00000 n +0000389903 00000 n +0000389969 00000 n +0000390033 00000 n +0000390097 00000 n +0000390161 00000 n +0000390225 00000 n +0000390291 00000 n +0000390357 00000 n +0000390421 00000 n +0000390485 00000 n +0000390550 00000 n +0000390615 00000 n +0000390680 00000 n +0000390746 00000 n +0000390812 00000 n +0000390876 00000 n +0000390940 00000 n +0000391004 00000 n +0000391198 00000 n +0000391262 00000 n +0000391328 00000 n +0000391392 00000 n +0000391456 00000 n +0000391522 00000 n +0000391586 00000 n +0000391649 00000 n +0000391713 00000 n +0000391777 00000 n +0000391843 00000 n +0000391907 00000 n +0000391971 00000 n +0000392035 00000 n +0000392098 00000 n +0000392164 00000 n +0000392230 00000 n +0000392294 00000 n +0000392358 00000 n +0000392423 00000 n +0000392488 00000 n +0000392552 00000 n +0000392618 00000 n +0000392684 00000 n +0000392748 00000 n +0000392811 00000 n +0000397033 00000 n +0000394064 00000 n +0000392987 00000 n +0000394190 00000 n +0000394254 00000 n +0000394318 00000 n +0000394449 00000 n +0000394513 00000 n +0000394579 00000 n +0000394643 00000 n +0000394706 00000 n +0000394772 00000 n +0000394836 00000 n +0000394900 00000 n +0000394964 00000 n +0000395030 00000 n +0000395094 00000 n +0000395158 00000 n +0000395222 00000 n +0000395285 00000 n +0000395351 00000 n +0000395417 00000 n +0000395481 00000 n +0000395545 00000 n +0000395610 00000 n +0000395675 00000 n +0000395739 00000 n +0000395805 00000 n +0000395871 00000 n +0000395935 00000 n +0000395999 00000 n +0000396064 00000 n +0000396128 00000 n +0000396193 00000 n +0000396258 00000 n +0000396324 00000 n +0000396390 00000 n +0000396454 00000 n +0000396518 00000 n +0000396583 00000 n +0000396647 00000 n +0000396712 00000 n +0000396776 00000 n +0000396840 00000 n +0000396904 00000 n +0000934177 00000 n +0000401018 00000 n +0000398182 00000 n +0000397145 00000 n +0000398308 00000 n +0000398372 00000 n +0000398501 00000 n +0000398565 00000 n +0000398630 00000 n +0000398694 00000 n +0000398758 00000 n +0000398822 00000 n +0000398886 00000 n +0000398952 00000 n +0000399016 00000 n +0000399080 00000 n +0000399144 00000 n +0000399208 00000 n +0000399274 00000 n +0000399340 00000 n +0000399403 00000 n +0000399466 00000 n +0000399531 00000 n +0000399596 00000 n +0000399660 00000 n +0000399726 00000 n +0000399792 00000 n +0000399856 00000 n +0000399920 00000 n +0000399985 00000 n +0000400048 00000 n +0000400113 00000 n +0000400177 00000 n +0000400243 00000 n +0000400309 00000 n +0000400373 00000 n +0000400436 00000 n +0000400500 00000 n +0000400694 00000 n +0000400758 00000 n +0000400824 00000 n +0000400888 00000 n +0000400952 00000 n +0000404862 00000 n +0000402159 00000 n +0000401130 00000 n +0000402285 00000 n +0000402349 00000 n +0000402413 00000 n +0000402477 00000 n +0000402541 00000 n +0000402607 00000 n +0000402671 00000 n +0000402734 00000 n +0000402798 00000 n +0000402862 00000 n +0000402928 00000 n +0000402994 00000 n +0000403058 00000 n +0000403122 00000 n +0000403186 00000 n +0000403250 00000 n +0000403315 00000 n +0000403381 00000 n +0000403447 00000 n +0000403511 00000 n +0000403575 00000 n +0000403640 00000 n +0000403704 00000 n +0000403768 00000 n +0000403831 00000 n +0000403894 00000 n +0000403958 00000 n +0000404152 00000 n +0000404216 00000 n +0000404282 00000 n +0000404346 00000 n +0000404410 00000 n +0000404476 00000 n +0000404540 00000 n +0000404604 00000 n +0000404668 00000 n +0000404732 00000 n +0000404798 00000 n +0000409480 00000 n +0000406070 00000 n +0000404974 00000 n +0000406196 00000 n +0000406323 00000 n +0000406387 00000 n +0000406451 00000 n +0000406515 00000 n +0000406581 00000 n +0000406647 00000 n +0000406711 00000 n +0000406775 00000 n +0000406840 00000 n +0000406905 00000 n +0000406970 00000 n +0000407035 00000 n +0000407100 00000 n +0000407164 00000 n +0000407228 00000 n +0000407292 00000 n +0000407485 00000 n +0000407549 00000 n +0000407615 00000 n +0000407679 00000 n +0000407743 00000 n +0000407809 00000 n +0000407873 00000 n +0000407937 00000 n +0000408000 00000 n +0000408063 00000 n +0000408129 00000 n +0000408192 00000 n +0000408256 00000 n +0000408318 00000 n +0000408382 00000 n +0000408448 00000 n +0000408514 00000 n +0000408578 00000 n +0000408642 00000 n +0000408707 00000 n +0000408772 00000 n +0000408837 00000 n +0000408903 00000 n +0000408969 00000 n +0000409032 00000 n +0000409095 00000 n +0000409160 00000 n +0000409224 00000 n +0000409289 00000 n +0000409353 00000 n +0000409417 00000 n +0000413070 00000 n +0000410488 00000 n +0000409592 00000 n +0000410614 00000 n +0000410678 00000 n +0000410742 00000 n +0000410873 00000 n +0000410937 00000 n +0000411003 00000 n +0000411067 00000 n +0000411130 00000 n +0000411196 00000 n +0000411260 00000 n +0000411323 00000 n +0000411387 00000 n +0000411451 00000 n +0000411517 00000 n +0000411581 00000 n +0000411645 00000 n +0000411709 00000 n +0000411773 00000 n +0000411839 00000 n +0000411905 00000 n +0000411969 00000 n +0000412033 00000 n +0000412098 00000 n +0000412163 00000 n +0000412228 00000 n +0000412294 00000 n +0000412360 00000 n +0000412424 00000 n +0000412488 00000 n +0000412552 00000 n +0000412746 00000 n +0000412810 00000 n +0000412876 00000 n +0000412940 00000 n +0000413004 00000 n +0000417346 00000 n +0000414321 00000 n +0000413182 00000 n +0000414447 00000 n +0000414511 00000 n +0000414575 00000 n +0000414639 00000 n +0000414705 00000 n +0000414769 00000 n +0000414833 00000 n +0000414897 00000 n +0000414961 00000 n +0000415026 00000 n +0000415091 00000 n +0000415155 00000 n +0000415219 00000 n +0000415284 00000 n +0000415349 00000 n +0000415414 00000 n +0000415480 00000 n +0000415546 00000 n +0000415609 00000 n +0000415672 00000 n +0000415736 00000 n +0000415800 00000 n +0000415865 00000 n +0000415929 00000 n +0000415993 00000 n +0000416057 00000 n +0000416251 00000 n +0000416315 00000 n +0000416381 00000 n +0000416445 00000 n +0000416509 00000 n +0000416575 00000 n +0000416638 00000 n +0000416702 00000 n +0000416766 00000 n +0000416832 00000 n +0000416896 00000 n +0000416960 00000 n +0000417024 00000 n +0000417088 00000 n +0000417154 00000 n +0000417220 00000 n +0000417283 00000 n +0000422093 00000 n +0000418673 00000 n +0000417458 00000 n +0000418799 00000 n +0000418863 00000 n +0000418928 00000 n +0000418993 00000 n +0000419058 00000 n +0000419124 00000 n +0000419190 00000 n +0000419254 00000 n +0000419318 00000 n +0000419383 00000 n +0000419447 00000 n +0000419512 00000 n +0000419577 00000 n +0000419643 00000 n +0000419709 00000 n +0000419773 00000 n +0000419837 00000 n +0000419902 00000 n +0000419966 00000 n +0000420031 00000 n +0000420095 00000 n +0000420159 00000 n +0000420223 00000 n +0000420417 00000 n +0000420481 00000 n +0000420547 00000 n +0000420610 00000 n +0000420674 00000 n +0000420740 00000 n +0000420804 00000 n +0000420868 00000 n +0000420932 00000 n +0000420998 00000 n +0000421062 00000 n +0000421125 00000 n +0000421189 00000 n +0000421253 00000 n +0000421319 00000 n +0000421385 00000 n +0000421449 00000 n +0000421513 00000 n +0000421578 00000 n +0000421643 00000 n +0000421708 00000 n +0000421772 00000 n +0000421836 00000 n +0000421900 00000 n +0000421964 00000 n +0000422029 00000 n +0000934302 00000 n +0000426344 00000 n +0000423377 00000 n +0000422205 00000 n +0000423503 00000 n +0000423567 00000 n +0000423632 00000 n +0000423697 00000 n +0000423763 00000 n +0000423829 00000 n +0000423893 00000 n +0000423957 00000 n +0000424022 00000 n +0000424086 00000 n +0000424151 00000 n +0000424215 00000 n +0000424279 00000 n +0000424343 00000 n +0000424537 00000 n +0000424601 00000 n +0000424667 00000 n +0000424730 00000 n +0000424794 00000 n +0000424860 00000 n +0000424924 00000 n +0000424988 00000 n +0000425052 00000 n +0000425116 00000 n +0000425182 00000 n +0000425246 00000 n +0000425310 00000 n +0000425374 00000 n +0000425438 00000 n +0000425504 00000 n +0000425570 00000 n +0000425634 00000 n +0000425698 00000 n +0000425762 00000 n +0000425826 00000 n +0000425891 00000 n +0000425957 00000 n +0000426023 00000 n +0000426087 00000 n +0000426151 00000 n +0000426216 00000 n +0000426280 00000 n +0000430911 00000 n +0000427622 00000 n +0000426456 00000 n +0000427748 00000 n +0000427812 00000 n +0000427876 00000 n +0000427940 00000 n +0000428004 00000 n +0000428068 00000 n +0000428261 00000 n +0000428325 00000 n +0000428391 00000 n +0000428455 00000 n +0000428519 00000 n +0000428585 00000 n +0000428649 00000 n +0000428712 00000 n +0000428776 00000 n +0000428840 00000 n +0000428906 00000 n +0000428970 00000 n +0000429034 00000 n +0000429098 00000 n +0000429162 00000 n +0000429228 00000 n +0000429294 00000 n +0000429358 00000 n +0000429422 00000 n +0000429487 00000 n +0000429552 00000 n +0000429617 00000 n +0000429683 00000 n +0000429749 00000 n +0000429813 00000 n +0000429877 00000 n +0000429942 00000 n +0000430006 00000 n +0000430071 00000 n +0000430136 00000 n +0000430202 00000 n +0000430268 00000 n +0000430332 00000 n +0000430396 00000 n +0000430461 00000 n +0000430525 00000 n +0000430590 00000 n +0000430654 00000 n +0000430718 00000 n +0000430782 00000 n +0000434673 00000 n +0000432030 00000 n +0000431023 00000 n +0000432156 00000 n +0000432220 00000 n +0000432349 00000 n +0000432413 00000 n +0000432479 00000 n +0000432543 00000 n +0000432607 00000 n +0000432671 00000 n +0000432735 00000 n +0000432801 00000 n +0000432865 00000 n +0000432929 00000 n +0000432993 00000 n +0000433055 00000 n +0000433121 00000 n +0000433187 00000 n +0000433251 00000 n +0000433315 00000 n +0000433380 00000 n +0000433445 00000 n +0000433510 00000 n +0000433576 00000 n +0000433642 00000 n +0000433706 00000 n +0000433770 00000 n +0000433835 00000 n +0000433899 00000 n +0000433964 00000 n +0000434028 00000 n +0000434092 00000 n +0000434156 00000 n +0000434350 00000 n +0000434414 00000 n +0000434480 00000 n +0000434543 00000 n +0000434607 00000 n +0000439083 00000 n +0000435924 00000 n +0000434785 00000 n +0000436050 00000 n +0000436114 00000 n +0000436178 00000 n +0000436242 00000 n +0000436308 00000 n +0000436372 00000 n +0000436435 00000 n +0000436499 00000 n +0000436563 00000 n +0000436629 00000 n +0000436695 00000 n +0000436759 00000 n +0000436823 00000 n +0000436888 00000 n +0000436953 00000 n +0000437017 00000 n +0000437082 00000 n +0000437147 00000 n +0000437211 00000 n +0000437275 00000 n +0000437339 00000 n +0000437533 00000 n +0000437597 00000 n +0000437663 00000 n +0000437727 00000 n +0000437791 00000 n +0000437856 00000 n +0000437920 00000 n +0000437984 00000 n +0000438048 00000 n +0000438114 00000 n +0000438178 00000 n +0000438242 00000 n +0000438306 00000 n +0000438368 00000 n +0000438434 00000 n +0000438500 00000 n +0000438564 00000 n +0000438628 00000 n +0000438693 00000 n +0000438758 00000 n +0000438823 00000 n +0000438889 00000 n +0000438955 00000 n +0000439019 00000 n +0000442959 00000 n +0000440316 00000 n +0000439195 00000 n +0000440442 00000 n +0000440506 00000 n +0000440570 00000 n +0000440635 00000 n +0000440699 00000 n +0000440764 00000 n +0000440828 00000 n +0000440892 00000 n +0000440956 00000 n +0000441149 00000 n +0000441213 00000 n +0000441279 00000 n +0000441343 00000 n +0000441407 00000 n +0000441473 00000 n +0000441537 00000 n +0000441601 00000 n +0000441665 00000 n +0000441729 00000 n +0000441795 00000 n +0000441859 00000 n +0000441923 00000 n +0000441987 00000 n +0000442051 00000 n +0000442117 00000 n +0000442183 00000 n +0000442247 00000 n +0000442311 00000 n +0000442376 00000 n +0000442441 00000 n +0000442506 00000 n +0000442572 00000 n +0000442638 00000 n +0000442702 00000 n +0000442766 00000 n +0000442830 00000 n +0000446731 00000 n +0000444095 00000 n +0000443071 00000 n +0000444221 00000 n +0000444285 00000 n +0000444414 00000 n +0000444478 00000 n +0000444543 00000 n +0000444607 00000 n +0000444669 00000 n +0000444732 00000 n +0000444798 00000 n +0000444861 00000 n +0000444925 00000 n +0000444988 00000 n +0000445052 00000 n +0000445118 00000 n +0000445184 00000 n +0000445248 00000 n +0000445312 00000 n +0000445377 00000 n +0000445442 00000 n +0000445507 00000 n +0000445573 00000 n +0000445639 00000 n +0000445702 00000 n +0000445765 00000 n +0000445830 00000 n +0000445894 00000 n +0000445959 00000 n +0000446023 00000 n +0000446087 00000 n +0000446150 00000 n +0000446344 00000 n +0000446408 00000 n +0000446474 00000 n +0000446538 00000 n +0000446601 00000 n +0000446667 00000 n +0000934427 00000 n +0000450913 00000 n +0000447944 00000 n +0000446843 00000 n +0000448070 00000 n +0000448134 00000 n +0000448198 00000 n +0000448262 00000 n +0000448326 00000 n +0000448390 00000 n +0000448454 00000 n +0000448520 00000 n +0000448586 00000 n +0000448650 00000 n +0000448714 00000 n +0000448779 00000 n +0000448844 00000 n +0000448909 00000 n +0000448975 00000 n +0000449041 00000 n +0000449105 00000 n +0000449169 00000 n +0000449234 00000 n +0000449298 00000 n +0000449363 00000 n +0000449428 00000 n +0000449494 00000 n +0000449560 00000 n +0000449624 00000 n +0000449688 00000 n +0000449753 00000 n +0000449817 00000 n +0000449882 00000 n +0000449946 00000 n +0000450010 00000 n +0000450074 00000 n +0000450268 00000 n +0000450332 00000 n +0000450398 00000 n +0000450462 00000 n +0000450526 00000 n +0000450592 00000 n +0000450656 00000 n +0000450720 00000 n +0000450783 00000 n +0000450847 00000 n +0000455289 00000 n +0000452132 00000 n +0000451025 00000 n +0000452258 00000 n +0000452322 00000 n +0000452386 00000 n +0000452450 00000 n +0000452514 00000 n +0000452580 00000 n +0000452646 00000 n +0000452709 00000 n +0000452772 00000 n +0000452837 00000 n +0000452902 00000 n +0000452967 00000 n +0000453033 00000 n +0000453099 00000 n +0000453163 00000 n +0000453227 00000 n +0000453291 00000 n +0000453485 00000 n +0000453549 00000 n +0000453615 00000 n +0000453679 00000 n +0000453743 00000 n +0000453809 00000 n +0000453873 00000 n +0000453937 00000 n +0000454000 00000 n +0000454063 00000 n +0000454129 00000 n +0000454191 00000 n +0000454255 00000 n +0000454318 00000 n +0000454382 00000 n +0000454448 00000 n +0000454514 00000 n +0000454578 00000 n +0000454642 00000 n +0000454707 00000 n +0000454772 00000 n +0000454837 00000 n +0000454903 00000 n +0000454969 00000 n +0000455032 00000 n +0000455095 00000 n +0000455160 00000 n +0000455224 00000 n +0000460613 00000 n +0000456739 00000 n +0000455401 00000 n +0000456865 00000 n +0000456929 00000 n +0000456993 00000 n +0000457057 00000 n +0000457121 00000 n +0000457315 00000 n +0000457379 00000 n +0000457445 00000 n +0000457509 00000 n +0000457573 00000 n +0000457639 00000 n +0000457703 00000 n +0000457767 00000 n +0000457833 00000 n +0000457897 00000 n +0000457961 00000 n +0000458025 00000 n +0000458089 00000 n +0000458154 00000 n +0000458219 00000 n +0000458283 00000 n +0000458347 00000 n +0000458412 00000 n +0000458477 00000 n +0000458542 00000 n +0000458608 00000 n +0000458674 00000 n +0000458736 00000 n +0000458798 00000 n +0000458862 00000 n +0000458926 00000 n +0000458991 00000 n +0000459055 00000 n +0000459119 00000 n +0000459185 00000 n +0000459251 00000 n +0000459315 00000 n +0000459379 00000 n +0000459445 00000 n +0000459508 00000 n +0000459573 00000 n +0000459638 00000 n +0000459704 00000 n +0000459770 00000 n +0000459834 00000 n +0000459898 00000 n +0000459964 00000 n +0000460028 00000 n +0000460093 00000 n +0000460158 00000 n +0000460224 00000 n +0000460290 00000 n +0000460354 00000 n +0000460418 00000 n +0000460484 00000 n +0000460548 00000 n +0000466764 00000 n +0000462036 00000 n +0000460725 00000 n +0000462162 00000 n +0000462226 00000 n +0000462291 00000 n +0000462357 00000 n +0000462423 00000 n +0000462487 00000 n +0000462551 00000 n +0000462617 00000 n +0000462681 00000 n +0000462747 00000 n +0000462812 00000 n +0000462878 00000 n +0000462944 00000 n +0000463008 00000 n +0000463072 00000 n +0000463138 00000 n +0000463202 00000 n +0000463268 00000 n +0000463333 00000 n +0000463399 00000 n +0000463465 00000 n +0000463529 00000 n +0000463593 00000 n +0000463659 00000 n +0000463723 00000 n +0000463789 00000 n +0000463854 00000 n +0000463920 00000 n +0000463986 00000 n +0000464050 00000 n +0000464114 00000 n +0000464180 00000 n +0000464244 00000 n +0000464310 00000 n +0000464375 00000 n +0000464441 00000 n +0000464507 00000 n +0000464571 00000 n +0000464635 00000 n +0000464701 00000 n +0000464765 00000 n +0000464831 00000 n +0000464896 00000 n +0000464962 00000 n +0000465028 00000 n +0000465092 00000 n +0000465156 00000 n +0000465221 00000 n +0000465285 00000 n +0000465349 00000 n +0000465413 00000 n +0000465479 00000 n +0000465543 00000 n +0000465607 00000 n +0000465671 00000 n +0000465735 00000 n +0000465799 00000 n +0000465864 00000 n +0000465929 00000 n +0000465993 00000 n +0000466058 00000 n +0000466123 00000 n +0000466187 00000 n +0000466252 00000 n +0000466317 00000 n +0000466381 00000 n +0000466445 00000 n +0000466509 00000 n +0000466573 00000 n +0000466637 00000 n +0000466701 00000 n +0000472037 00000 n +0000468224 00000 n +0000466863 00000 n +0000468350 00000 n +0000468414 00000 n +0000468479 00000 n +0000468544 00000 n +0000468608 00000 n +0000468672 00000 n +0000468738 00000 n +0000468803 00000 n +0000468868 00000 n +0000468933 00000 n +0000468997 00000 n +0000469062 00000 n +0000469127 00000 n +0000469191 00000 n +0000469256 00000 n +0000469321 00000 n +0000469385 00000 n +0000469449 00000 n +0000469643 00000 n +0000469707 00000 n +0000469773 00000 n +0000469837 00000 n +0000469900 00000 n +0000469966 00000 n +0000470030 00000 n +0000470094 00000 n +0000470160 00000 n +0000470224 00000 n +0000470288 00000 n +0000470352 00000 n +0000470415 00000 n +0000470481 00000 n +0000470547 00000 n +0000470611 00000 n +0000470675 00000 n +0000470740 00000 n +0000470805 00000 n +0000470870 00000 n +0000470936 00000 n +0000471002 00000 n +0000471066 00000 n +0000471130 00000 n +0000471195 00000 n +0000471259 00000 n +0000471323 00000 n +0000471389 00000 n +0000471453 00000 n +0000471519 00000 n +0000471584 00000 n +0000471649 00000 n +0000471713 00000 n +0000471777 00000 n +0000471843 00000 n +0000471909 00000 n +0000471973 00000 n +0000476736 00000 n +0000473310 00000 n +0000472149 00000 n +0000473436 00000 n +0000473500 00000 n +0000473566 00000 n +0000473630 00000 n +0000473696 00000 n +0000473761 00000 n +0000473827 00000 n +0000473893 00000 n +0000473957 00000 n +0000474021 00000 n +0000474087 00000 n +0000474151 00000 n +0000474217 00000 n +0000474282 00000 n +0000474348 00000 n +0000474414 00000 n +0000474478 00000 n +0000474542 00000 n +0000474608 00000 n +0000474672 00000 n +0000474738 00000 n +0000474803 00000 n +0000474869 00000 n +0000474935 00000 n +0000474999 00000 n +0000475063 00000 n +0000475128 00000 n +0000475192 00000 n +0000475256 00000 n +0000475320 00000 n +0000475386 00000 n +0000475450 00000 n +0000475514 00000 n +0000475579 00000 n +0000475644 00000 n +0000475708 00000 n +0000475773 00000 n +0000475838 00000 n +0000475900 00000 n +0000475964 00000 n +0000476154 00000 n +0000476218 00000 n +0000476284 00000 n +0000476348 00000 n +0000476412 00000 n +0000476478 00000 n +0000476542 00000 n +0000476606 00000 n +0000476672 00000 n +0000934552 00000 n +0000482064 00000 n +0000478186 00000 n +0000476848 00000 n +0000478312 00000 n +0000478376 00000 n +0000478440 00000 n +0000478504 00000 n +0000478568 00000 n +0000478634 00000 n +0000478700 00000 n +0000478764 00000 n +0000478828 00000 n +0000478893 00000 n +0000478958 00000 n +0000479022 00000 n +0000479086 00000 n +0000479150 00000 n +0000479343 00000 n +0000479407 00000 n +0000479473 00000 n +0000479537 00000 n +0000479601 00000 n +0000479667 00000 n +0000479731 00000 n +0000479795 00000 n +0000479861 00000 n +0000479925 00000 n +0000479989 00000 n +0000480053 00000 n +0000480116 00000 n +0000480182 00000 n +0000480248 00000 n +0000480312 00000 n +0000480376 00000 n +0000480441 00000 n +0000480506 00000 n +0000480571 00000 n +0000480637 00000 n +0000480703 00000 n +0000480767 00000 n +0000480831 00000 n +0000480896 00000 n +0000480960 00000 n +0000481025 00000 n +0000481089 00000 n +0000481153 00000 n +0000481219 00000 n +0000481285 00000 n +0000481349 00000 n +0000481413 00000 n +0000481479 00000 n +0000481543 00000 n +0000481609 00000 n +0000481674 00000 n +0000481740 00000 n +0000481806 00000 n +0000481870 00000 n +0000481934 00000 n +0000482000 00000 n +0000488431 00000 n +0000483686 00000 n +0000482176 00000 n +0000483812 00000 n +0000483876 00000 n +0000483942 00000 n +0000484007 00000 n +0000484073 00000 n +0000484139 00000 n +0000484203 00000 n +0000484267 00000 n +0000484333 00000 n +0000484397 00000 n +0000484463 00000 n +0000484528 00000 n +0000484594 00000 n +0000484660 00000 n +0000484724 00000 n +0000484788 00000 n +0000484854 00000 n +0000484918 00000 n +0000484984 00000 n +0000485049 00000 n +0000485115 00000 n +0000485181 00000 n +0000485245 00000 n +0000485309 00000 n +0000485375 00000 n +0000485439 00000 n +0000485505 00000 n +0000485570 00000 n +0000485636 00000 n +0000485702 00000 n +0000485766 00000 n +0000485830 00000 n +0000485896 00000 n +0000485960 00000 n +0000486026 00000 n +0000486091 00000 n +0000486157 00000 n +0000486223 00000 n +0000486287 00000 n +0000486351 00000 n +0000486417 00000 n +0000486481 00000 n +0000486547 00000 n +0000486612 00000 n +0000486678 00000 n +0000486744 00000 n +0000486808 00000 n +0000486872 00000 n +0000486938 00000 n +0000487002 00000 n +0000487068 00000 n +0000487133 00000 n +0000487199 00000 n +0000487265 00000 n +0000487329 00000 n +0000487393 00000 n +0000487459 00000 n +0000487523 00000 n +0000487589 00000 n +0000487654 00000 n +0000487720 00000 n +0000487786 00000 n +0000487850 00000 n +0000487914 00000 n +0000487980 00000 n +0000488044 00000 n +0000488110 00000 n +0000488175 00000 n +0000488240 00000 n +0000488305 00000 n +0000488368 00000 n +0000495340 00000 n +0000490297 00000 n +0000488530 00000 n +0000490423 00000 n +0000490487 00000 n +0000490553 00000 n +0000490617 00000 n +0000490683 00000 n +0000490748 00000 n +0000490814 00000 n +0000490880 00000 n +0000490944 00000 n +0000491008 00000 n +0000491074 00000 n +0000491138 00000 n +0000491204 00000 n +0000491269 00000 n +0000491335 00000 n +0000491401 00000 n +0000491465 00000 n +0000491529 00000 n +0000491595 00000 n +0000491659 00000 n +0000491725 00000 n +0000491790 00000 n +0000491856 00000 n +0000491922 00000 n +0000491986 00000 n +0000492050 00000 n +0000492116 00000 n +0000492180 00000 n +0000492246 00000 n +0000492311 00000 n +0000492377 00000 n +0000492443 00000 n +0000492507 00000 n +0000492571 00000 n +0000492636 00000 n +0000492700 00000 n +0000492764 00000 n +0000492828 00000 n +0000492894 00000 n +0000492958 00000 n +0000493022 00000 n +0000493087 00000 n +0000493152 00000 n +0000493216 00000 n +0000493281 00000 n +0000493346 00000 n +0000493410 00000 n +0000493474 00000 n +0000493538 00000 n +0000493602 00000 n +0000493667 00000 n +0000493732 00000 n +0000493796 00000 n +0000493861 00000 n +0000493926 00000 n +0000493989 00000 n +0000494054 00000 n +0000494119 00000 n +0000494183 00000 n +0000494247 00000 n +0000494311 00000 n +0000494375 00000 n +0000494440 00000 n +0000494505 00000 n +0000494569 00000 n +0000494634 00000 n +0000494699 00000 n +0000494763 00000 n +0000494828 00000 n +0000494893 00000 n +0000494957 00000 n +0000495021 00000 n +0000495085 00000 n +0000495149 00000 n +0000495213 00000 n +0000495277 00000 n +0000500802 00000 n +0000496920 00000 n +0000495439 00000 n +0000497046 00000 n +0000497110 00000 n +0000497175 00000 n +0000497240 00000 n +0000497304 00000 n +0000497369 00000 n +0000497562 00000 n +0000497626 00000 n +0000497692 00000 n +0000497756 00000 n +0000497820 00000 n +0000497886 00000 n +0000497950 00000 n +0000498014 00000 n +0000498079 00000 n +0000498143 00000 n +0000498207 00000 n +0000498271 00000 n +0000498335 00000 n +0000498400 00000 n +0000498465 00000 n +0000498529 00000 n +0000498593 00000 n +0000498658 00000 n +0000498723 00000 n +0000498788 00000 n +0000498854 00000 n +0000498920 00000 n +0000498984 00000 n +0000499048 00000 n +0000499113 00000 n +0000499177 00000 n +0000499242 00000 n +0000499306 00000 n +0000499370 00000 n +0000499436 00000 n +0000499502 00000 n +0000499566 00000 n +0000499630 00000 n +0000499696 00000 n +0000499760 00000 n +0000499826 00000 n +0000499891 00000 n +0000499957 00000 n +0000500023 00000 n +0000500087 00000 n +0000500151 00000 n +0000500217 00000 n +0000500281 00000 n +0000500347 00000 n +0000500412 00000 n +0000500478 00000 n +0000500544 00000 n +0000500608 00000 n +0000500672 00000 n +0000500738 00000 n +0000506680 00000 n +0000502387 00000 n +0000500914 00000 n +0000502513 00000 n +0000502577 00000 n +0000502643 00000 n +0000502708 00000 n +0000502774 00000 n +0000502840 00000 n +0000502904 00000 n +0000502968 00000 n +0000503034 00000 n +0000503098 00000 n +0000503164 00000 n +0000503229 00000 n +0000503295 00000 n +0000503361 00000 n +0000503425 00000 n +0000503489 00000 n +0000503555 00000 n +0000503619 00000 n +0000503685 00000 n +0000503750 00000 n +0000503816 00000 n +0000503882 00000 n +0000503946 00000 n +0000504010 00000 n +0000504076 00000 n +0000504140 00000 n +0000504206 00000 n +0000504271 00000 n +0000504337 00000 n +0000504403 00000 n +0000504467 00000 n +0000504531 00000 n +0000504597 00000 n +0000504661 00000 n +0000504727 00000 n +0000504792 00000 n +0000504858 00000 n +0000504924 00000 n +0000504988 00000 n +0000505052 00000 n +0000505118 00000 n +0000505182 00000 n +0000505248 00000 n +0000505313 00000 n +0000505379 00000 n +0000505445 00000 n +0000505509 00000 n +0000505573 00000 n +0000505639 00000 n +0000505703 00000 n +0000505769 00000 n +0000505834 00000 n +0000505900 00000 n +0000505966 00000 n +0000506030 00000 n +0000506094 00000 n +0000506160 00000 n +0000506224 00000 n +0000506290 00000 n +0000506355 00000 n +0000506421 00000 n +0000506487 00000 n +0000506551 00000 n +0000506615 00000 n +0000512591 00000 n +0000508406 00000 n +0000506779 00000 n +0000508532 00000 n +0000508596 00000 n +0000508660 00000 n +0000508724 00000 n +0000508788 00000 n +0000508854 00000 n +0000508918 00000 n +0000508982 00000 n +0000509047 00000 n +0000509112 00000 n +0000509175 00000 n +0000509240 00000 n +0000509305 00000 n +0000509369 00000 n +0000509433 00000 n +0000509497 00000 n +0000509561 00000 n +0000509626 00000 n +0000509691 00000 n +0000509755 00000 n +0000509819 00000 n +0000509885 00000 n +0000509950 00000 n +0000510014 00000 n +0000510078 00000 n +0000510142 00000 n +0000510207 00000 n +0000510272 00000 n +0000510336 00000 n +0000510401 00000 n +0000510466 00000 n +0000510530 00000 n +0000510595 00000 n +0000510660 00000 n +0000510724 00000 n +0000510787 00000 n +0000510850 00000 n +0000510914 00000 n +0000510979 00000 n +0000511044 00000 n +0000511108 00000 n +0000511173 00000 n +0000511366 00000 n +0000511430 00000 n +0000511496 00000 n +0000511560 00000 n +0000511624 00000 n +0000511690 00000 n +0000511754 00000 n +0000511818 00000 n +0000511882 00000 n +0000511947 00000 n +0000512011 00000 n +0000512075 00000 n +0000512139 00000 n +0000512203 00000 n +0000512269 00000 n +0000512335 00000 n +0000512399 00000 n +0000512463 00000 n +0000512527 00000 n +0000934677 00000 n +0000518554 00000 n +0000514071 00000 n +0000512703 00000 n +0000514197 00000 n +0000514261 00000 n +0000514326 00000 n +0000514392 00000 n +0000514458 00000 n +0000514522 00000 n +0000514586 00000 n +0000514651 00000 n +0000514715 00000 n +0000514779 00000 n +0000514845 00000 n +0000514910 00000 n +0000514975 00000 n +0000515039 00000 n +0000515103 00000 n +0000515169 00000 n +0000515235 00000 n +0000515299 00000 n +0000515363 00000 n +0000515429 00000 n +0000515493 00000 n +0000515559 00000 n +0000515624 00000 n +0000515690 00000 n +0000515756 00000 n +0000515820 00000 n +0000515884 00000 n +0000515950 00000 n +0000516014 00000 n +0000516080 00000 n +0000516145 00000 n +0000516211 00000 n +0000516277 00000 n +0000516341 00000 n +0000516405 00000 n +0000516471 00000 n +0000516535 00000 n +0000516601 00000 n +0000516666 00000 n +0000516732 00000 n +0000516798 00000 n +0000516862 00000 n +0000516926 00000 n +0000516992 00000 n +0000517056 00000 n +0000517122 00000 n +0000517187 00000 n +0000517253 00000 n +0000517319 00000 n +0000517383 00000 n +0000517447 00000 n +0000517513 00000 n +0000517577 00000 n +0000517643 00000 n +0000517708 00000 n +0000517774 00000 n +0000517840 00000 n +0000517904 00000 n +0000517968 00000 n +0000518034 00000 n +0000518098 00000 n +0000518164 00000 n +0000518229 00000 n +0000518295 00000 n +0000518361 00000 n +0000518425 00000 n +0000518489 00000 n +0000523354 00000 n +0000519811 00000 n +0000518653 00000 n +0000519937 00000 n +0000520001 00000 n +0000520065 00000 n +0000520129 00000 n +0000520193 00000 n +0000520259 00000 n +0000520323 00000 n +0000520387 00000 n +0000520452 00000 n +0000520517 00000 n +0000520581 00000 n +0000520646 00000 n +0000520711 00000 n +0000520774 00000 n +0000520838 00000 n +0000520902 00000 n +0000520966 00000 n +0000521031 00000 n +0000521096 00000 n +0000521160 00000 n +0000521225 00000 n +0000521290 00000 n +0000521354 00000 n +0000521419 00000 n +0000521612 00000 n +0000521676 00000 n +0000521742 00000 n +0000521806 00000 n +0000521870 00000 n +0000521935 00000 n +0000521999 00000 n +0000522063 00000 n +0000522129 00000 n +0000522193 00000 n +0000522256 00000 n +0000522320 00000 n +0000522384 00000 n +0000522450 00000 n +0000522516 00000 n +0000522580 00000 n +0000522644 00000 n +0000522709 00000 n +0000522774 00000 n +0000522838 00000 n +0000522902 00000 n +0000522966 00000 n +0000523160 00000 n +0000523224 00000 n +0000523290 00000 n +0000529023 00000 n +0000524878 00000 n +0000523466 00000 n +0000525004 00000 n +0000525068 00000 n +0000525132 00000 n +0000525198 00000 n +0000525262 00000 n +0000525325 00000 n +0000525391 00000 n +0000525454 00000 n +0000525518 00000 n +0000525581 00000 n +0000525645 00000 n +0000525711 00000 n +0000525777 00000 n +0000525841 00000 n +0000525905 00000 n +0000525970 00000 n +0000526035 00000 n +0000526100 00000 n +0000526166 00000 n +0000526232 00000 n +0000526296 00000 n +0000526360 00000 n +0000526425 00000 n +0000526489 00000 n +0000526554 00000 n +0000526618 00000 n +0000526682 00000 n +0000526748 00000 n +0000526814 00000 n +0000526878 00000 n +0000526942 00000 n +0000527008 00000 n +0000527072 00000 n +0000527138 00000 n +0000527203 00000 n +0000527269 00000 n +0000527335 00000 n +0000527399 00000 n +0000527463 00000 n +0000527529 00000 n +0000527592 00000 n +0000527658 00000 n +0000527723 00000 n +0000527789 00000 n +0000527855 00000 n +0000527919 00000 n +0000527983 00000 n +0000528049 00000 n +0000528112 00000 n +0000528178 00000 n +0000528243 00000 n +0000528309 00000 n +0000528375 00000 n +0000528439 00000 n +0000528503 00000 n +0000528569 00000 n +0000528632 00000 n +0000528698 00000 n +0000528763 00000 n +0000528829 00000 n +0000528895 00000 n +0000528959 00000 n +0000533167 00000 n +0000530139 00000 n +0000529122 00000 n +0000530265 00000 n +0000530329 00000 n +0000530393 00000 n +0000530458 00000 n +0000530522 00000 n +0000530586 00000 n +0000530650 00000 n +0000530716 00000 n +0000530779 00000 n +0000530842 00000 n +0000530907 00000 n +0000530972 00000 n +0000531036 00000 n +0000531101 00000 n +0000531166 00000 n +0000531230 00000 n +0000531295 00000 n +0000531360 00000 n +0000531424 00000 n +0000531489 00000 n +0000531682 00000 n +0000531746 00000 n +0000531812 00000 n +0000531876 00000 n +0000531940 00000 n +0000532006 00000 n +0000532070 00000 n +0000532134 00000 n +0000532200 00000 n +0000532264 00000 n +0000532328 00000 n +0000532392 00000 n +0000532456 00000 n +0000532522 00000 n +0000532588 00000 n +0000532652 00000 n +0000532716 00000 n +0000532781 00000 n +0000532846 00000 n +0000532910 00000 n +0000532974 00000 n +0000533038 00000 n +0000536921 00000 n +0000534280 00000 n +0000533279 00000 n +0000534406 00000 n +0000534535 00000 n +0000534599 00000 n +0000534664 00000 n +0000534728 00000 n +0000534790 00000 n +0000534856 00000 n +0000534920 00000 n +0000534984 00000 n +0000535048 00000 n +0000535112 00000 n +0000535178 00000 n +0000535244 00000 n +0000535308 00000 n +0000535372 00000 n +0000535437 00000 n +0000535502 00000 n +0000535566 00000 n +0000535630 00000 n +0000535694 00000 n +0000535887 00000 n +0000535951 00000 n +0000536017 00000 n +0000536081 00000 n +0000536145 00000 n +0000536211 00000 n +0000536275 00000 n +0000536339 00000 n +0000536405 00000 n +0000536469 00000 n +0000536533 00000 n +0000536597 00000 n +0000536661 00000 n +0000536727 00000 n +0000536793 00000 n +0000536857 00000 n +0000543122 00000 n +0000538459 00000 n +0000537033 00000 n +0000538585 00000 n +0000538649 00000 n +0000538714 00000 n +0000538779 00000 n +0000538844 00000 n +0000538910 00000 n +0000538976 00000 n +0000539040 00000 n +0000539104 00000 n +0000539169 00000 n +0000539233 00000 n +0000539297 00000 n +0000539363 00000 n +0000539427 00000 n +0000539493 00000 n +0000539558 00000 n +0000539623 00000 n +0000539687 00000 n +0000539751 00000 n +0000539817 00000 n +0000539883 00000 n +0000539947 00000 n +0000540011 00000 n +0000540077 00000 n +0000540141 00000 n +0000540207 00000 n +0000540272 00000 n +0000540338 00000 n +0000540404 00000 n +0000540468 00000 n +0000540532 00000 n +0000540598 00000 n +0000540662 00000 n +0000540728 00000 n +0000540793 00000 n +0000540859 00000 n +0000540925 00000 n +0000540989 00000 n +0000541053 00000 n +0000541119 00000 n +0000541183 00000 n +0000541249 00000 n +0000541314 00000 n +0000541380 00000 n +0000541446 00000 n +0000541510 00000 n +0000541574 00000 n +0000541639 00000 n +0000541703 00000 n +0000541767 00000 n +0000541831 00000 n +0000541897 00000 n +0000541961 00000 n +0000542025 00000 n +0000542090 00000 n +0000542155 00000 n +0000542219 00000 n +0000542283 00000 n +0000542348 00000 n +0000542413 00000 n +0000542478 00000 n +0000542543 00000 n +0000542607 00000 n +0000542672 00000 n +0000542737 00000 n +0000542801 00000 n +0000542865 00000 n +0000542929 00000 n +0000542993 00000 n +0000543057 00000 n +0000934802 00000 n +0000548418 00000 n +0000544665 00000 n +0000543221 00000 n +0000544791 00000 n +0000544855 00000 n +0000544920 00000 n +0000544985 00000 n +0000545178 00000 n +0000545242 00000 n +0000545308 00000 n +0000545372 00000 n +0000545436 00000 n +0000545502 00000 n +0000545566 00000 n +0000545630 00000 n +0000545695 00000 n +0000545759 00000 n +0000545823 00000 n +0000545887 00000 n +0000545951 00000 n +0000546016 00000 n +0000546081 00000 n +0000546145 00000 n +0000546209 00000 n +0000546274 00000 n +0000546339 00000 n +0000546404 00000 n +0000546470 00000 n +0000546536 00000 n +0000546600 00000 n +0000546664 00000 n +0000546729 00000 n +0000546793 00000 n +0000546858 00000 n +0000546922 00000 n +0000546986 00000 n +0000547052 00000 n +0000547118 00000 n +0000547182 00000 n +0000547246 00000 n +0000547312 00000 n +0000547376 00000 n +0000547442 00000 n +0000547507 00000 n +0000547573 00000 n +0000547639 00000 n +0000547703 00000 n +0000547767 00000 n +0000547833 00000 n +0000547897 00000 n +0000547963 00000 n +0000548028 00000 n +0000548094 00000 n +0000548160 00000 n +0000548224 00000 n +0000548288 00000 n +0000548354 00000 n +0000554717 00000 n +0000549972 00000 n +0000548530 00000 n +0000550098 00000 n +0000550162 00000 n +0000550228 00000 n +0000550293 00000 n +0000550359 00000 n +0000550425 00000 n +0000550489 00000 n +0000550553 00000 n +0000550619 00000 n +0000550683 00000 n +0000550749 00000 n +0000550814 00000 n +0000550880 00000 n +0000550946 00000 n +0000551010 00000 n +0000551074 00000 n +0000551140 00000 n +0000551204 00000 n +0000551270 00000 n +0000551335 00000 n +0000551401 00000 n +0000551467 00000 n +0000551531 00000 n +0000551595 00000 n +0000551661 00000 n +0000551725 00000 n +0000551791 00000 n +0000551856 00000 n +0000551922 00000 n +0000551988 00000 n +0000552052 00000 n +0000552116 00000 n +0000552182 00000 n +0000552246 00000 n +0000552312 00000 n +0000552377 00000 n +0000552443 00000 n +0000552509 00000 n +0000552573 00000 n +0000552637 00000 n +0000552703 00000 n +0000552767 00000 n +0000552833 00000 n +0000552898 00000 n +0000552964 00000 n +0000553030 00000 n +0000553094 00000 n +0000553158 00000 n +0000553224 00000 n +0000553288 00000 n +0000553354 00000 n +0000553419 00000 n +0000553485 00000 n +0000553551 00000 n +0000553615 00000 n +0000553679 00000 n +0000553745 00000 n +0000553809 00000 n +0000553875 00000 n +0000553940 00000 n +0000554006 00000 n +0000554072 00000 n +0000554136 00000 n +0000554200 00000 n +0000554266 00000 n +0000554330 00000 n +0000554396 00000 n +0000554461 00000 n +0000554526 00000 n +0000554591 00000 n +0000554654 00000 n +0000561445 00000 n +0000556402 00000 n +0000554816 00000 n +0000556528 00000 n +0000556592 00000 n +0000556658 00000 n +0000556722 00000 n +0000556788 00000 n +0000556853 00000 n +0000556919 00000 n +0000556985 00000 n +0000557049 00000 n +0000557113 00000 n +0000557179 00000 n +0000557243 00000 n +0000557309 00000 n +0000557374 00000 n +0000557440 00000 n +0000557506 00000 n +0000557570 00000 n +0000557634 00000 n +0000557700 00000 n +0000557764 00000 n +0000557830 00000 n +0000557895 00000 n +0000557961 00000 n +0000558027 00000 n +0000558091 00000 n +0000558155 00000 n +0000558221 00000 n +0000558285 00000 n +0000558351 00000 n +0000558416 00000 n +0000558482 00000 n +0000558548 00000 n +0000558612 00000 n +0000558676 00000 n +0000558741 00000 n +0000558805 00000 n +0000558869 00000 n +0000558933 00000 n +0000558999 00000 n +0000559063 00000 n +0000559127 00000 n +0000559192 00000 n +0000559257 00000 n +0000559321 00000 n +0000559386 00000 n +0000559451 00000 n +0000559515 00000 n +0000559579 00000 n +0000559643 00000 n +0000559707 00000 n +0000559772 00000 n +0000559837 00000 n +0000559901 00000 n +0000559966 00000 n +0000560031 00000 n +0000560095 00000 n +0000560160 00000 n +0000560225 00000 n +0000560289 00000 n +0000560353 00000 n +0000560417 00000 n +0000560481 00000 n +0000560546 00000 n +0000560611 00000 n +0000560675 00000 n +0000560740 00000 n +0000560805 00000 n +0000560868 00000 n +0000560933 00000 n +0000560998 00000 n +0000561062 00000 n +0000561126 00000 n +0000561190 00000 n +0000561254 00000 n +0000561318 00000 n +0000561382 00000 n +0000566839 00000 n +0000563033 00000 n +0000561544 00000 n +0000563159 00000 n +0000563223 00000 n +0000563288 00000 n +0000563353 00000 n +0000563417 00000 n +0000563482 00000 n +0000563547 00000 n +0000563611 00000 n +0000563676 00000 n +0000563869 00000 n +0000563933 00000 n +0000563999 00000 n +0000564063 00000 n +0000564126 00000 n +0000564192 00000 n +0000564255 00000 n +0000564319 00000 n +0000564382 00000 n +0000564448 00000 n +0000564512 00000 n +0000564576 00000 n +0000564640 00000 n +0000564704 00000 n +0000564770 00000 n +0000564836 00000 n +0000564900 00000 n +0000564964 00000 n +0000565029 00000 n +0000565094 00000 n +0000565159 00000 n +0000565225 00000 n +0000565291 00000 n +0000565355 00000 n +0000565419 00000 n +0000565484 00000 n +0000565548 00000 n +0000565612 00000 n +0000565678 00000 n +0000565742 00000 n +0000565808 00000 n +0000565873 00000 n +0000565938 00000 n +0000566002 00000 n +0000566066 00000 n +0000566132 00000 n +0000566198 00000 n +0000566261 00000 n +0000566324 00000 n +0000566390 00000 n +0000566454 00000 n +0000566520 00000 n +0000566585 00000 n +0000566650 00000 n +0000566715 00000 n +0000566777 00000 n +0000573019 00000 n +0000568401 00000 n +0000566951 00000 n +0000568527 00000 n +0000568591 00000 n +0000568657 00000 n +0000568721 00000 n +0000568787 00000 n +0000568852 00000 n +0000568918 00000 n +0000568984 00000 n +0000569048 00000 n +0000569112 00000 n +0000569178 00000 n +0000569242 00000 n +0000569308 00000 n +0000569373 00000 n +0000569439 00000 n +0000569505 00000 n +0000569569 00000 n +0000569633 00000 n +0000569699 00000 n +0000569763 00000 n +0000569829 00000 n +0000569894 00000 n +0000569960 00000 n +0000570026 00000 n +0000570090 00000 n +0000570154 00000 n +0000570220 00000 n +0000570284 00000 n +0000570350 00000 n +0000570415 00000 n +0000570481 00000 n +0000570547 00000 n +0000570611 00000 n +0000570675 00000 n +0000570741 00000 n +0000570805 00000 n +0000570871 00000 n +0000570936 00000 n +0000571002 00000 n +0000571068 00000 n +0000571132 00000 n +0000571196 00000 n +0000571262 00000 n +0000571326 00000 n +0000571392 00000 n +0000571457 00000 n +0000571523 00000 n +0000571589 00000 n +0000571653 00000 n +0000571717 00000 n +0000571783 00000 n +0000571847 00000 n +0000571913 00000 n +0000571978 00000 n +0000572044 00000 n +0000572110 00000 n +0000572174 00000 n +0000572238 00000 n +0000572304 00000 n +0000572368 00000 n +0000572434 00000 n +0000572499 00000 n +0000572565 00000 n +0000572631 00000 n +0000572695 00000 n +0000572759 00000 n +0000572825 00000 n +0000572889 00000 n +0000572955 00000 n +0000579297 00000 n +0000574634 00000 n +0000573118 00000 n +0000574760 00000 n +0000574824 00000 n +0000574890 00000 n +0000574956 00000 n +0000575020 00000 n +0000575084 00000 n +0000575150 00000 n +0000575214 00000 n +0000575280 00000 n +0000575345 00000 n +0000575411 00000 n +0000575477 00000 n +0000575541 00000 n +0000575605 00000 n +0000575671 00000 n +0000575735 00000 n +0000575801 00000 n +0000575866 00000 n +0000575932 00000 n +0000575998 00000 n +0000576062 00000 n +0000576126 00000 n +0000576192 00000 n +0000576256 00000 n +0000576322 00000 n +0000576387 00000 n +0000576453 00000 n +0000576519 00000 n +0000576583 00000 n +0000576647 00000 n +0000576713 00000 n +0000576777 00000 n +0000576843 00000 n +0000576908 00000 n +0000576974 00000 n +0000577040 00000 n +0000577104 00000 n +0000577168 00000 n +0000577233 00000 n +0000577297 00000 n +0000577361 00000 n +0000577425 00000 n +0000577491 00000 n +0000577555 00000 n +0000577619 00000 n +0000577684 00000 n +0000577749 00000 n +0000577813 00000 n +0000577877 00000 n +0000577941 00000 n +0000578005 00000 n +0000578069 00000 n +0000578135 00000 n +0000578200 00000 n +0000578265 00000 n +0000578330 00000 n +0000578394 00000 n +0000578458 00000 n +0000578523 00000 n +0000578588 00000 n +0000578653 00000 n +0000578718 00000 n +0000578782 00000 n +0000578847 00000 n +0000578912 00000 n +0000578976 00000 n +0000579040 00000 n +0000579104 00000 n +0000579168 00000 n +0000579232 00000 n +0000934927 00000 n +0000585134 00000 n +0000581064 00000 n +0000579396 00000 n +0000581190 00000 n +0000581254 00000 n +0000581319 00000 n +0000581384 00000 n +0000581449 00000 n +0000581513 00000 n +0000581578 00000 n +0000581643 00000 n +0000581707 00000 n +0000581772 00000 n +0000581837 00000 n +0000581901 00000 n +0000581966 00000 n +0000582031 00000 n +0000582095 00000 n +0000582160 00000 n +0000582225 00000 n +0000582289 00000 n +0000582353 00000 n +0000582419 00000 n +0000582484 00000 n +0000582549 00000 n +0000582614 00000 n +0000582678 00000 n +0000582742 00000 n +0000582808 00000 n +0000582873 00000 n +0000582938 00000 n +0000583003 00000 n +0000583067 00000 n +0000583132 00000 n +0000583197 00000 n +0000583261 00000 n +0000583326 00000 n +0000583391 00000 n +0000583455 00000 n +0000583520 00000 n +0000583585 00000 n +0000583649 00000 n +0000583714 00000 n +0000583779 00000 n +0000583843 00000 n +0000583908 00000 n +0000583973 00000 n +0000584037 00000 n +0000584102 00000 n +0000584167 00000 n +0000584231 00000 n +0000584295 00000 n +0000584361 00000 n +0000584426 00000 n +0000584491 00000 n +0000584684 00000 n +0000584748 00000 n +0000584814 00000 n +0000584878 00000 n +0000584942 00000 n +0000585008 00000 n +0000585072 00000 n +0000591375 00000 n +0000586636 00000 n +0000585246 00000 n +0000586762 00000 n +0000586826 00000 n +0000586890 00000 n +0000586956 00000 n +0000587020 00000 n +0000587084 00000 n +0000587148 00000 n +0000587212 00000 n +0000587278 00000 n +0000587344 00000 n +0000587408 00000 n +0000587472 00000 n +0000587537 00000 n +0000587602 00000 n +0000587667 00000 n +0000587733 00000 n +0000587799 00000 n +0000587863 00000 n +0000587927 00000 n +0000587992 00000 n +0000588056 00000 n +0000588121 00000 n +0000588185 00000 n +0000588249 00000 n +0000588315 00000 n +0000588381 00000 n +0000588445 00000 n +0000588509 00000 n +0000588575 00000 n +0000588639 00000 n +0000588705 00000 n +0000588770 00000 n +0000588836 00000 n +0000588902 00000 n +0000588966 00000 n +0000589030 00000 n +0000589096 00000 n +0000589160 00000 n +0000589226 00000 n +0000589291 00000 n +0000589357 00000 n +0000589423 00000 n +0000589487 00000 n +0000589551 00000 n +0000589617 00000 n +0000589681 00000 n +0000589747 00000 n +0000589812 00000 n +0000589878 00000 n +0000589944 00000 n +0000590008 00000 n +0000590072 00000 n +0000590138 00000 n +0000590202 00000 n +0000590268 00000 n +0000590333 00000 n +0000590399 00000 n +0000590465 00000 n +0000590529 00000 n +0000590593 00000 n +0000590659 00000 n +0000590723 00000 n +0000590789 00000 n +0000590854 00000 n +0000590920 00000 n +0000590986 00000 n +0000591050 00000 n +0000591114 00000 n +0000591180 00000 n +0000591244 00000 n +0000591310 00000 n +0000597924 00000 n +0000592949 00000 n +0000591474 00000 n +0000593075 00000 n +0000593202 00000 n +0000593268 00000 n +0000593334 00000 n +0000593398 00000 n +0000593462 00000 n +0000593528 00000 n +0000593592 00000 n +0000593658 00000 n +0000593723 00000 n +0000593789 00000 n +0000593855 00000 n +0000593919 00000 n +0000593983 00000 n +0000594049 00000 n +0000594113 00000 n +0000594179 00000 n +0000594244 00000 n +0000594310 00000 n +0000594376 00000 n +0000594440 00000 n +0000594504 00000 n +0000594570 00000 n +0000594634 00000 n +0000594700 00000 n +0000594765 00000 n +0000594831 00000 n +0000594897 00000 n +0000594961 00000 n +0000595025 00000 n +0000595090 00000 n +0000595154 00000 n +0000595218 00000 n +0000595282 00000 n +0000595348 00000 n +0000595412 00000 n +0000595476 00000 n +0000595541 00000 n +0000595606 00000 n +0000595668 00000 n +0000595732 00000 n +0000595796 00000 n +0000595860 00000 n +0000595925 00000 n +0000595990 00000 n +0000596054 00000 n +0000596118 00000 n +0000596184 00000 n +0000596249 00000 n +0000596313 00000 n +0000596377 00000 n +0000596441 00000 n +0000596506 00000 n +0000596571 00000 n +0000596635 00000 n +0000596700 00000 n +0000596765 00000 n +0000596829 00000 n +0000596894 00000 n +0000596959 00000 n +0000597023 00000 n +0000597087 00000 n +0000597151 00000 n +0000597215 00000 n +0000597279 00000 n +0000597345 00000 n +0000597410 00000 n +0000597475 00000 n +0000597540 00000 n +0000597604 00000 n +0000597668 00000 n +0000597732 00000 n +0000597796 00000 n +0000597860 00000 n +0000602577 00000 n +0000599230 00000 n +0000598023 00000 n +0000599356 00000 n +0000599485 00000 n +0000599549 00000 n +0000599615 00000 n +0000599679 00000 n +0000599743 00000 n +0000599809 00000 n +0000599873 00000 n +0000599937 00000 n +0000600001 00000 n +0000600067 00000 n +0000600129 00000 n +0000600193 00000 n +0000600256 00000 n +0000600320 00000 n +0000600386 00000 n +0000600452 00000 n +0000600516 00000 n +0000600580 00000 n +0000600645 00000 n +0000600710 00000 n +0000600774 00000 n +0000600838 00000 n +0000600902 00000 n +0000600968 00000 n +0000601031 00000 n +0000601094 00000 n +0000601159 00000 n +0000601224 00000 n +0000601287 00000 n +0000601350 00000 n +0000601415 00000 n +0000601480 00000 n +0000601545 00000 n +0000601610 00000 n +0000601674 00000 n +0000601738 00000 n +0000601804 00000 n +0000601868 00000 n +0000601933 00000 n +0000601998 00000 n +0000602062 00000 n +0000602126 00000 n +0000602192 00000 n +0000602257 00000 n +0000602320 00000 n +0000602383 00000 n +0000602447 00000 n +0000602511 00000 n +0000606440 00000 n +0000603667 00000 n +0000602689 00000 n +0000603793 00000 n +0000603857 00000 n +0000603922 00000 n +0000603987 00000 n +0000604052 00000 n +0000604116 00000 n +0000604180 00000 n +0000604246 00000 n +0000604311 00000 n +0000604376 00000 n +0000604569 00000 n +0000604633 00000 n +0000604699 00000 n +0000604763 00000 n +0000604827 00000 n +0000604892 00000 n +0000604956 00000 n +0000605020 00000 n +0000605086 00000 n +0000605150 00000 n +0000605213 00000 n +0000605277 00000 n +0000605341 00000 n +0000605407 00000 n +0000605473 00000 n +0000605537 00000 n +0000605601 00000 n +0000605666 00000 n +0000605731 00000 n +0000605795 00000 n +0000605859 00000 n +0000605923 00000 n +0000606116 00000 n +0000606180 00000 n +0000606246 00000 n +0000606310 00000 n +0000606374 00000 n +0000612505 00000 n +0000608034 00000 n +0000606552 00000 n +0000608160 00000 n +0000608224 00000 n +0000608288 00000 n +0000608352 00000 n +0000608418 00000 n +0000608482 00000 n +0000608546 00000 n +0000608610 00000 n +0000608674 00000 n +0000608740 00000 n +0000608806 00000 n +0000608870 00000 n +0000608934 00000 n +0000608999 00000 n +0000609064 00000 n +0000609129 00000 n +0000609195 00000 n +0000609261 00000 n +0000609325 00000 n +0000609389 00000 n +0000609454 00000 n +0000609518 00000 n +0000609582 00000 n +0000609648 00000 n +0000609712 00000 n +0000609778 00000 n +0000609843 00000 n +0000609908 00000 n +0000609972 00000 n +0000610036 00000 n +0000610102 00000 n +0000610168 00000 n +0000610232 00000 n +0000610296 00000 n +0000610362 00000 n +0000610425 00000 n +0000610491 00000 n +0000610556 00000 n +0000610622 00000 n +0000610688 00000 n +0000610752 00000 n +0000610816 00000 n +0000610882 00000 n +0000610944 00000 n +0000611010 00000 n +0000611075 00000 n +0000611141 00000 n +0000611207 00000 n +0000611271 00000 n +0000611335 00000 n +0000611401 00000 n +0000611465 00000 n +0000611531 00000 n +0000611596 00000 n +0000611662 00000 n +0000611728 00000 n +0000611792 00000 n +0000611856 00000 n +0000611922 00000 n +0000611985 00000 n +0000612051 00000 n +0000612116 00000 n +0000612182 00000 n +0000612248 00000 n +0000612312 00000 n +0000612376 00000 n +0000612442 00000 n +0000935052 00000 n +0000617832 00000 n +0000613835 00000 n +0000612604 00000 n +0000613961 00000 n +0000614025 00000 n +0000614089 00000 n +0000614155 00000 n +0000614220 00000 n +0000614286 00000 n +0000614352 00000 n +0000614416 00000 n +0000614480 00000 n +0000614545 00000 n +0000614609 00000 n +0000614673 00000 n +0000614737 00000 n +0000614803 00000 n +0000614867 00000 n +0000614931 00000 n +0000614996 00000 n +0000615061 00000 n +0000615125 00000 n +0000615189 00000 n +0000615255 00000 n +0000615320 00000 n +0000615384 00000 n +0000615448 00000 n +0000615512 00000 n +0000615576 00000 n +0000615642 00000 n +0000615707 00000 n +0000615772 00000 n +0000615837 00000 n +0000615900 00000 n +0000615963 00000 n +0000616028 00000 n +0000616093 00000 n +0000616158 00000 n +0000616223 00000 n +0000616287 00000 n +0000616352 00000 n +0000616417 00000 n +0000616479 00000 n +0000616543 00000 n +0000616607 00000 n +0000616671 00000 n +0000616735 00000 n +0000616801 00000 n +0000616866 00000 n +0000616931 00000 n +0000616996 00000 n +0000617060 00000 n +0000617124 00000 n +0000617188 00000 n +0000617252 00000 n +0000617317 00000 n +0000617382 00000 n +0000617446 00000 n +0000617510 00000 n +0000617576 00000 n +0000617641 00000 n +0000617705 00000 n +0000623072 00000 n +0000619388 00000 n +0000617931 00000 n +0000619514 00000 n +0000619643 00000 n +0000619707 00000 n +0000619772 00000 n +0000619836 00000 n +0000619900 00000 n +0000619964 00000 n +0000620030 00000 n +0000620094 00000 n +0000620158 00000 n +0000620222 00000 n +0000620286 00000 n +0000620352 00000 n +0000620418 00000 n +0000620482 00000 n +0000620546 00000 n +0000620611 00000 n +0000620676 00000 n +0000620741 00000 n +0000620806 00000 n +0000620871 00000 n +0000620935 00000 n +0000620999 00000 n +0000621064 00000 n +0000621128 00000 n +0000621192 00000 n +0000621258 00000 n +0000621322 00000 n +0000621388 00000 n +0000621452 00000 n +0000621517 00000 n +0000621581 00000 n +0000621645 00000 n +0000621711 00000 n +0000621777 00000 n +0000621841 00000 n +0000621905 00000 n +0000621971 00000 n +0000622035 00000 n +0000622099 00000 n +0000622164 00000 n +0000622230 00000 n +0000622296 00000 n +0000622360 00000 n +0000622424 00000 n +0000622490 00000 n +0000622554 00000 n +0000622619 00000 n +0000622684 00000 n +0000622750 00000 n +0000622816 00000 n +0000622880 00000 n +0000622944 00000 n +0000623009 00000 n +0000629348 00000 n +0000624603 00000 n +0000623184 00000 n +0000624729 00000 n +0000624793 00000 n +0000624859 00000 n +0000624924 00000 n +0000624990 00000 n +0000625056 00000 n +0000625120 00000 n +0000625184 00000 n +0000625250 00000 n +0000625314 00000 n +0000625380 00000 n +0000625445 00000 n +0000625511 00000 n +0000625577 00000 n +0000625641 00000 n +0000625705 00000 n +0000625771 00000 n +0000625835 00000 n +0000625901 00000 n +0000625966 00000 n +0000626032 00000 n +0000626098 00000 n +0000626162 00000 n +0000626226 00000 n +0000626292 00000 n +0000626356 00000 n +0000626422 00000 n +0000626487 00000 n +0000626553 00000 n +0000626619 00000 n +0000626683 00000 n +0000626747 00000 n +0000626813 00000 n +0000626877 00000 n +0000626943 00000 n +0000627008 00000 n +0000627074 00000 n +0000627140 00000 n +0000627204 00000 n +0000627268 00000 n +0000627334 00000 n +0000627398 00000 n +0000627464 00000 n +0000627529 00000 n +0000627595 00000 n +0000627661 00000 n +0000627725 00000 n +0000627789 00000 n +0000627855 00000 n +0000627919 00000 n +0000627985 00000 n +0000628050 00000 n +0000628116 00000 n +0000628182 00000 n +0000628246 00000 n +0000628310 00000 n +0000628376 00000 n +0000628440 00000 n +0000628506 00000 n +0000628571 00000 n +0000628637 00000 n +0000628703 00000 n +0000628767 00000 n +0000628831 00000 n +0000628897 00000 n +0000628961 00000 n +0000629027 00000 n +0000629092 00000 n +0000629157 00000 n +0000629222 00000 n +0000629285 00000 n +0000635524 00000 n +0000630925 00000 n +0000629447 00000 n +0000631051 00000 n +0000631115 00000 n +0000631181 00000 n +0000631245 00000 n +0000631311 00000 n +0000631376 00000 n +0000631442 00000 n +0000631508 00000 n +0000631572 00000 n +0000631636 00000 n +0000631702 00000 n +0000631766 00000 n +0000631832 00000 n +0000631897 00000 n +0000631963 00000 n +0000632029 00000 n +0000632093 00000 n +0000632157 00000 n +0000632223 00000 n +0000632287 00000 n +0000632353 00000 n +0000632418 00000 n +0000632484 00000 n +0000632550 00000 n +0000632614 00000 n +0000632678 00000 n +0000632744 00000 n +0000632808 00000 n +0000632874 00000 n +0000632939 00000 n +0000633005 00000 n +0000633071 00000 n +0000633135 00000 n +0000633199 00000 n +0000633265 00000 n +0000633329 00000 n +0000633395 00000 n +0000633460 00000 n +0000633526 00000 n +0000633592 00000 n +0000633656 00000 n +0000633720 00000 n +0000633785 00000 n +0000633849 00000 n +0000633913 00000 n +0000633977 00000 n +0000634043 00000 n +0000634107 00000 n +0000634171 00000 n +0000634236 00000 n +0000634301 00000 n +0000634365 00000 n +0000634430 00000 n +0000634495 00000 n +0000634559 00000 n +0000634623 00000 n +0000634687 00000 n +0000634751 00000 n +0000634816 00000 n +0000634881 00000 n +0000634945 00000 n +0000635010 00000 n +0000635075 00000 n +0000635139 00000 n +0000635203 00000 n +0000635269 00000 n +0000635333 00000 n +0000635397 00000 n +0000635461 00000 n +0000641092 00000 n +0000636958 00000 n +0000635623 00000 n +0000637084 00000 n +0000637148 00000 n +0000637213 00000 n +0000637278 00000 n +0000637342 00000 n +0000637407 00000 n +0000637472 00000 n +0000637536 00000 n +0000637600 00000 n +0000637666 00000 n +0000637731 00000 n +0000637796 00000 n +0000637861 00000 n +0000637925 00000 n +0000637990 00000 n +0000638055 00000 n +0000638119 00000 n +0000638183 00000 n +0000638249 00000 n +0000638314 00000 n +0000638379 00000 n +0000638444 00000 n +0000638508 00000 n +0000638573 00000 n +0000638638 00000 n +0000638702 00000 n +0000638767 00000 n +0000638832 00000 n +0000638896 00000 n +0000638960 00000 n +0000639026 00000 n +0000639091 00000 n +0000639156 00000 n +0000639221 00000 n +0000639285 00000 n +0000639350 00000 n +0000639415 00000 n +0000639479 00000 n +0000639544 00000 n +0000639609 00000 n +0000639673 00000 n +0000639737 00000 n +0000639803 00000 n +0000639868 00000 n +0000639933 00000 n +0000639998 00000 n +0000640062 00000 n +0000640127 00000 n +0000640319 00000 n +0000640383 00000 n +0000640449 00000 n +0000640513 00000 n +0000640577 00000 n +0000640643 00000 n +0000640707 00000 n +0000640771 00000 n +0000640836 00000 n +0000640900 00000 n +0000640964 00000 n +0000641028 00000 n +0000645373 00000 n +0000642214 00000 n +0000641204 00000 n +0000642340 00000 n +0000642404 00000 n +0000642470 00000 n +0000642536 00000 n +0000642600 00000 n +0000642664 00000 n +0000642729 00000 n +0000642794 00000 n +0000642858 00000 n +0000642922 00000 n +0000642986 00000 n +0000643052 00000 n +0000643116 00000 n +0000643180 00000 n +0000643245 00000 n +0000643310 00000 n +0000643374 00000 n +0000643439 00000 n +0000643632 00000 n +0000643696 00000 n +0000643762 00000 n +0000643825 00000 n +0000643889 00000 n +0000643955 00000 n +0000644019 00000 n +0000644083 00000 n +0000644149 00000 n +0000644212 00000 n +0000644276 00000 n +0000644339 00000 n +0000644403 00000 n +0000644469 00000 n +0000644535 00000 n +0000644599 00000 n +0000644663 00000 n +0000644728 00000 n +0000644793 00000 n +0000644857 00000 n +0000644921 00000 n +0000644985 00000 n +0000645179 00000 n +0000645243 00000 n +0000645309 00000 n +0000935177 00000 n +0000651540 00000 n +0000647065 00000 n +0000645485 00000 n +0000647191 00000 n +0000647255 00000 n +0000647319 00000 n +0000647385 00000 n +0000647449 00000 n +0000647513 00000 n +0000647579 00000 n +0000647643 00000 n +0000647707 00000 n +0000647771 00000 n +0000647834 00000 n +0000647900 00000 n +0000647966 00000 n +0000648030 00000 n +0000648094 00000 n +0000648159 00000 n +0000648224 00000 n +0000648289 00000 n +0000648355 00000 n +0000648421 00000 n +0000648485 00000 n +0000648549 00000 n +0000648614 00000 n +0000648678 00000 n +0000648742 00000 n +0000648808 00000 n +0000648872 00000 n +0000648938 00000 n +0000649003 00000 n +0000649068 00000 n +0000649132 00000 n +0000649196 00000 n +0000649262 00000 n +0000649328 00000 n +0000649392 00000 n +0000649456 00000 n +0000649522 00000 n +0000649586 00000 n +0000649652 00000 n +0000649717 00000 n +0000649783 00000 n +0000649849 00000 n +0000649913 00000 n +0000649977 00000 n +0000650043 00000 n +0000650107 00000 n +0000650173 00000 n +0000650238 00000 n +0000650304 00000 n +0000650370 00000 n +0000650434 00000 n +0000650498 00000 n +0000650564 00000 n +0000650628 00000 n +0000650694 00000 n +0000650759 00000 n +0000650825 00000 n +0000650891 00000 n +0000650955 00000 n +0000651019 00000 n +0000651085 00000 n +0000651149 00000 n +0000651215 00000 n +0000651280 00000 n +0000651346 00000 n +0000651412 00000 n +0000651476 00000 n +0000657750 00000 n +0000653132 00000 n +0000651639 00000 n +0000653258 00000 n +0000653322 00000 n +0000653388 00000 n +0000653452 00000 n +0000653518 00000 n +0000653583 00000 n +0000653649 00000 n +0000653715 00000 n +0000653779 00000 n +0000653843 00000 n +0000653909 00000 n +0000653973 00000 n +0000654039 00000 n +0000654104 00000 n +0000654170 00000 n +0000654236 00000 n +0000654300 00000 n +0000654364 00000 n +0000654430 00000 n +0000654494 00000 n +0000654560 00000 n +0000654625 00000 n +0000654691 00000 n +0000654757 00000 n +0000654821 00000 n +0000654885 00000 n +0000654951 00000 n +0000655015 00000 n +0000655081 00000 n +0000655146 00000 n +0000655212 00000 n +0000655278 00000 n +0000655342 00000 n +0000655406 00000 n +0000655472 00000 n +0000655536 00000 n +0000655602 00000 n +0000655667 00000 n +0000655733 00000 n +0000655799 00000 n +0000655863 00000 n +0000655927 00000 n +0000655993 00000 n +0000656057 00000 n +0000656123 00000 n +0000656188 00000 n +0000656254 00000 n +0000656320 00000 n +0000656384 00000 n +0000656448 00000 n +0000656514 00000 n +0000656578 00000 n +0000656644 00000 n +0000656709 00000 n +0000656775 00000 n +0000656841 00000 n +0000656905 00000 n +0000656969 00000 n +0000657035 00000 n +0000657099 00000 n +0000657165 00000 n +0000657230 00000 n +0000657296 00000 n +0000657362 00000 n +0000657426 00000 n +0000657490 00000 n +0000657556 00000 n +0000657620 00000 n +0000657686 00000 n +0000664348 00000 n +0000659440 00000 n +0000657849 00000 n +0000659566 00000 n +0000659630 00000 n +0000659696 00000 n +0000659762 00000 n +0000659826 00000 n +0000659890 00000 n +0000659956 00000 n +0000660020 00000 n +0000660086 00000 n +0000660151 00000 n +0000660217 00000 n +0000660283 00000 n +0000660347 00000 n +0000660411 00000 n +0000660477 00000 n +0000660541 00000 n +0000660607 00000 n +0000660672 00000 n +0000660738 00000 n +0000660804 00000 n +0000660868 00000 n +0000660932 00000 n +0000660997 00000 n +0000661061 00000 n +0000661125 00000 n +0000661189 00000 n +0000661255 00000 n +0000661319 00000 n +0000661383 00000 n +0000661448 00000 n +0000661513 00000 n +0000661576 00000 n +0000661639 00000 n +0000661704 00000 n +0000661769 00000 n +0000661834 00000 n +0000661899 00000 n +0000661963 00000 n +0000662027 00000 n +0000662093 00000 n +0000662157 00000 n +0000662222 00000 n +0000662287 00000 n +0000662351 00000 n +0000662416 00000 n +0000662481 00000 n +0000662545 00000 n +0000662610 00000 n +0000662675 00000 n +0000662739 00000 n +0000662803 00000 n +0000662868 00000 n +0000662933 00000 n +0000662998 00000 n +0000663063 00000 n +0000663127 00000 n +0000663192 00000 n +0000663257 00000 n +0000663321 00000 n +0000663385 00000 n +0000663449 00000 n +0000663513 00000 n +0000663577 00000 n +0000663643 00000 n +0000663708 00000 n +0000663773 00000 n +0000663838 00000 n +0000663902 00000 n +0000663966 00000 n +0000664030 00000 n +0000664094 00000 n +0000664158 00000 n +0000664222 00000 n +0000664285 00000 n +0000669834 00000 n +0000666156 00000 n +0000664447 00000 n +0000666282 00000 n +0000666346 00000 n +0000666412 00000 n +0000666477 00000 n +0000666542 00000 n +0000666607 00000 n +0000666671 00000 n +0000666736 00000 n +0000666801 00000 n +0000666865 00000 n +0000666930 00000 n +0000666995 00000 n +0000667059 00000 n +0000667124 00000 n +0000667189 00000 n +0000667253 00000 n +0000667318 00000 n +0000667383 00000 n +0000667447 00000 n +0000667512 00000 n +0000667577 00000 n +0000667641 00000 n +0000667706 00000 n +0000667771 00000 n +0000667835 00000 n +0000667900 00000 n +0000667965 00000 n +0000668029 00000 n +0000668094 00000 n +0000668287 00000 n +0000668351 00000 n +0000668417 00000 n +0000668481 00000 n +0000668544 00000 n +0000668610 00000 n +0000668673 00000 n +0000668737 00000 n +0000668801 00000 n +0000668867 00000 n +0000668931 00000 n +0000668995 00000 n +0000669059 00000 n +0000669123 00000 n +0000669188 00000 n +0000669253 00000 n +0000669317 00000 n +0000669381 00000 n +0000669446 00000 n +0000669511 00000 n +0000669576 00000 n +0000669642 00000 n +0000669708 00000 n +0000669771 00000 n +0000675983 00000 n +0000671368 00000 n +0000669946 00000 n +0000671494 00000 n +0000671558 00000 n +0000671623 00000 n +0000671687 00000 n +0000671752 00000 n +0000671816 00000 n +0000671880 00000 n +0000671946 00000 n +0000672012 00000 n +0000672076 00000 n +0000672140 00000 n +0000672206 00000 n +0000672270 00000 n +0000672336 00000 n +0000672401 00000 n +0000672467 00000 n +0000672533 00000 n +0000672597 00000 n +0000672661 00000 n +0000672727 00000 n +0000672791 00000 n +0000672857 00000 n +0000672922 00000 n +0000672988 00000 n +0000673054 00000 n +0000673118 00000 n +0000673182 00000 n +0000673248 00000 n +0000673312 00000 n +0000673378 00000 n +0000673443 00000 n +0000673509 00000 n +0000673575 00000 n +0000673639 00000 n +0000673703 00000 n +0000673769 00000 n +0000673833 00000 n +0000673899 00000 n +0000673964 00000 n +0000674030 00000 n +0000674096 00000 n +0000674160 00000 n +0000674224 00000 n +0000674290 00000 n +0000674354 00000 n +0000674420 00000 n +0000674485 00000 n +0000674551 00000 n +0000674617 00000 n +0000674681 00000 n +0000674745 00000 n +0000674811 00000 n +0000674875 00000 n +0000674941 00000 n +0000675006 00000 n +0000675072 00000 n +0000675138 00000 n +0000675202 00000 n +0000675266 00000 n +0000675332 00000 n +0000675396 00000 n +0000675462 00000 n +0000675527 00000 n +0000675593 00000 n +0000675659 00000 n +0000675723 00000 n +0000675787 00000 n +0000675853 00000 n +0000675917 00000 n +0000681340 00000 n +0000677532 00000 n +0000676082 00000 n +0000677658 00000 n +0000677722 00000 n +0000677787 00000 n +0000677853 00000 n +0000677919 00000 n +0000677983 00000 n +0000678047 00000 n +0000678112 00000 n +0000678176 00000 n +0000678240 00000 n +0000678304 00000 n +0000678370 00000 n +0000678434 00000 n +0000678498 00000 n +0000678563 00000 n +0000678628 00000 n +0000678692 00000 n +0000678757 00000 n +0000678822 00000 n +0000678886 00000 n +0000678951 00000 n +0000679016 00000 n +0000679080 00000 n +0000679145 00000 n +0000679210 00000 n +0000679274 00000 n +0000679339 00000 n +0000679404 00000 n +0000679468 00000 n +0000679533 00000 n +0000679598 00000 n +0000679662 00000 n +0000679726 00000 n +0000679790 00000 n +0000679854 00000 n +0000679919 00000 n +0000680112 00000 n +0000680176 00000 n +0000680242 00000 n +0000680306 00000 n +0000680370 00000 n +0000680436 00000 n +0000680500 00000 n +0000680564 00000 n +0000680630 00000 n +0000680694 00000 n +0000680757 00000 n +0000680821 00000 n +0000680885 00000 n +0000680951 00000 n +0000681017 00000 n +0000681081 00000 n +0000681145 00000 n +0000681210 00000 n +0000681275 00000 n +0000935302 00000 n +0000687479 00000 n +0000682878 00000 n +0000681452 00000 n +0000683004 00000 n +0000683068 00000 n +0000683134 00000 n +0000683200 00000 n +0000683264 00000 n +0000683328 00000 n +0000683393 00000 n +0000683457 00000 n +0000683521 00000 n +0000683587 00000 n +0000683651 00000 n +0000683717 00000 n +0000683782 00000 n +0000683847 00000 n +0000683911 00000 n +0000683975 00000 n +0000684041 00000 n +0000684107 00000 n +0000684171 00000 n +0000684235 00000 n +0000684301 00000 n +0000684365 00000 n +0000684431 00000 n +0000684496 00000 n +0000684562 00000 n +0000684628 00000 n +0000684692 00000 n +0000684756 00000 n +0000684822 00000 n +0000684886 00000 n +0000684952 00000 n +0000685017 00000 n +0000685083 00000 n +0000685149 00000 n +0000685213 00000 n +0000685277 00000 n +0000685343 00000 n +0000685407 00000 n +0000685473 00000 n +0000685538 00000 n +0000685604 00000 n +0000685670 00000 n +0000685734 00000 n +0000685798 00000 n +0000685864 00000 n +0000685928 00000 n +0000685994 00000 n +0000686059 00000 n +0000686125 00000 n +0000686191 00000 n +0000686255 00000 n +0000686319 00000 n +0000686384 00000 n +0000686448 00000 n +0000686512 00000 n +0000686576 00000 n +0000686641 00000 n +0000686705 00000 n +0000686769 00000 n +0000686834 00000 n +0000686899 00000 n +0000686963 00000 n +0000687028 00000 n +0000687093 00000 n +0000687157 00000 n +0000687222 00000 n +0000687287 00000 n +0000687351 00000 n +0000687415 00000 n +0000691151 00000 n +0000688644 00000 n +0000687578 00000 n +0000688770 00000 n +0000688962 00000 n +0000689026 00000 n +0000689091 00000 n +0000689155 00000 n +0000689219 00000 n +0000689285 00000 n +0000689349 00000 n +0000689411 00000 n +0000689477 00000 n +0000689541 00000 n +0000689605 00000 n +0000689669 00000 n +0000689733 00000 n +0000689799 00000 n +0000689865 00000 n +0000689929 00000 n +0000689993 00000 n +0000690058 00000 n +0000690123 00000 n +0000690187 00000 n +0000690251 00000 n +0000690315 00000 n +0000690506 00000 n +0000690569 00000 n +0000690635 00000 n +0000690699 00000 n +0000690763 00000 n +0000690829 00000 n +0000690893 00000 n +0000690957 00000 n +0000691021 00000 n +0000691087 00000 n +0000697603 00000 n +0000692744 00000 n +0000691263 00000 n +0000692870 00000 n +0000692934 00000 n +0000692998 00000 n +0000693062 00000 n +0000693126 00000 n +0000693192 00000 n +0000693258 00000 n +0000693322 00000 n +0000693386 00000 n +0000693451 00000 n +0000693516 00000 n +0000693581 00000 n +0000693646 00000 n +0000693711 00000 n +0000693775 00000 n +0000693839 00000 n +0000693904 00000 n +0000693968 00000 n +0000694032 00000 n +0000694098 00000 n +0000694161 00000 n +0000694227 00000 n +0000694291 00000 n +0000694356 00000 n +0000694420 00000 n +0000694484 00000 n +0000694550 00000 n +0000694616 00000 n +0000694680 00000 n +0000694744 00000 n +0000694810 00000 n +0000694874 00000 n +0000694938 00000 n +0000695003 00000 n +0000695069 00000 n +0000695135 00000 n +0000695199 00000 n +0000695263 00000 n +0000695329 00000 n +0000695393 00000 n +0000695458 00000 n +0000695523 00000 n +0000695589 00000 n +0000695655 00000 n +0000695719 00000 n +0000695783 00000 n +0000695849 00000 n +0000695913 00000 n +0000695978 00000 n +0000696043 00000 n +0000696109 00000 n +0000696175 00000 n +0000696239 00000 n +0000696303 00000 n +0000696369 00000 n +0000696433 00000 n +0000696498 00000 n +0000696563 00000 n +0000696629 00000 n +0000696695 00000 n +0000696759 00000 n +0000696823 00000 n +0000696889 00000 n +0000696953 00000 n +0000697018 00000 n +0000697083 00000 n +0000697149 00000 n +0000697215 00000 n +0000697279 00000 n +0000697343 00000 n +0000697409 00000 n +0000697473 00000 n +0000697538 00000 n +0000703896 00000 n +0000699229 00000 n +0000697702 00000 n +0000699355 00000 n +0000699419 00000 n +0000699485 00000 n +0000699551 00000 n +0000699615 00000 n +0000699679 00000 n +0000699745 00000 n +0000699809 00000 n +0000699875 00000 n +0000699940 00000 n +0000700006 00000 n +0000700072 00000 n +0000700136 00000 n +0000700200 00000 n +0000700266 00000 n +0000700330 00000 n +0000700396 00000 n +0000700461 00000 n +0000700527 00000 n +0000700593 00000 n +0000700657 00000 n +0000700721 00000 n +0000700787 00000 n +0000700851 00000 n +0000700917 00000 n +0000700982 00000 n +0000701048 00000 n +0000701114 00000 n +0000701178 00000 n +0000701242 00000 n +0000701308 00000 n +0000701372 00000 n +0000701438 00000 n +0000701503 00000 n +0000701569 00000 n +0000701635 00000 n +0000701699 00000 n +0000701763 00000 n +0000701829 00000 n +0000701893 00000 n +0000701959 00000 n +0000702024 00000 n +0000702090 00000 n +0000702156 00000 n +0000702220 00000 n +0000702284 00000 n +0000702350 00000 n +0000702414 00000 n +0000702480 00000 n +0000702545 00000 n +0000702611 00000 n +0000702677 00000 n +0000702741 00000 n +0000702805 00000 n +0000702870 00000 n +0000702934 00000 n +0000702998 00000 n +0000703062 00000 n +0000703128 00000 n +0000703192 00000 n +0000703256 00000 n +0000703321 00000 n +0000703386 00000 n +0000703450 00000 n +0000703514 00000 n +0000703578 00000 n +0000703642 00000 n +0000703706 00000 n +0000703770 00000 n +0000703833 00000 n +0000709361 00000 n +0000705678 00000 n +0000703995 00000 n +0000705804 00000 n +0000705868 00000 n +0000705932 00000 n +0000705998 00000 n +0000706063 00000 n +0000706128 00000 n +0000706193 00000 n +0000706257 00000 n +0000706322 00000 n +0000706387 00000 n +0000706451 00000 n +0000706516 00000 n +0000706581 00000 n +0000706645 00000 n +0000706710 00000 n +0000706775 00000 n +0000706839 00000 n +0000706904 00000 n +0000706969 00000 n +0000707033 00000 n +0000707098 00000 n +0000707163 00000 n +0000707227 00000 n +0000707291 00000 n +0000707357 00000 n +0000707422 00000 n +0000707487 00000 n +0000707552 00000 n +0000707616 00000 n +0000707681 00000 n +0000707746 00000 n +0000707810 00000 n +0000707875 00000 n +0000707940 00000 n +0000708004 00000 n +0000708069 00000 n +0000708134 00000 n +0000708198 00000 n +0000708262 00000 n +0000708328 00000 n +0000708393 00000 n +0000708458 00000 n +0000708523 00000 n +0000708587 00000 n +0000708652 00000 n +0000708845 00000 n +0000708909 00000 n +0000708975 00000 n +0000709039 00000 n +0000709103 00000 n +0000709169 00000 n +0000709233 00000 n +0000709297 00000 n +0000713690 00000 n +0000710725 00000 n +0000709473 00000 n +0000710851 00000 n +0000710915 00000 n +0000710979 00000 n +0000711043 00000 n +0000711107 00000 n +0000711171 00000 n +0000711237 00000 n +0000711303 00000 n +0000711367 00000 n +0000711431 00000 n +0000711496 00000 n +0000711561 00000 n +0000711626 00000 n +0000711692 00000 n +0000711758 00000 n +0000711822 00000 n +0000711886 00000 n +0000711951 00000 n +0000712015 00000 n +0000712080 00000 n +0000712144 00000 n +0000712208 00000 n +0000712272 00000 n +0000712466 00000 n +0000712530 00000 n +0000712595 00000 n +0000712659 00000 n +0000712723 00000 n +0000712789 00000 n +0000712853 00000 n +0000712917 00000 n +0000712981 00000 n +0000713047 00000 n +0000713111 00000 n +0000713175 00000 n +0000713239 00000 n +0000713302 00000 n +0000713368 00000 n +0000713434 00000 n +0000713498 00000 n +0000713562 00000 n +0000713626 00000 n +0000935427 00000 n +0000722160 00000 n +0000715874 00000 n +0000713802 00000 n +0000716000 00000 n +0000716064 00000 n +0000716129 00000 n +0000716195 00000 n +0000716261 00000 n +0000716325 00000 n +0000716389 00000 n +0000716454 00000 n +0000716518 00000 n +0000716583 00000 n +0000716647 00000 n +0000716711 00000 n +0000716775 00000 n +0000716841 00000 n +0000716904 00000 n +0000716967 00000 n +0000717032 00000 n +0000717097 00000 n +0000717160 00000 n +0000717225 00000 n +0000717290 00000 n +0000717354 00000 n +0000717419 00000 n +0000717484 00000 n +0000717548 00000 n +0000717612 00000 n +0000717678 00000 n +0000717744 00000 n +0000717808 00000 n +0000717874 00000 n +0000717940 00000 n +0000718003 00000 n +0000718068 00000 n +0000718133 00000 n +0000718197 00000 n +0000718263 00000 n +0000718329 00000 n +0000718393 00000 n +0000718459 00000 n +0000718525 00000 n +0000718588 00000 n +0000718654 00000 n +0000718720 00000 n +0000718783 00000 n +0000718848 00000 n +0000718913 00000 n +0000718977 00000 n +0000719043 00000 n +0000719109 00000 n +0000719173 00000 n +0000719239 00000 n +0000719305 00000 n +0000719369 00000 n +0000719435 00000 n +0000719501 00000 n +0000719563 00000 n +0000719628 00000 n +0000719693 00000 n +0000719757 00000 n +0000719823 00000 n +0000719889 00000 n +0000719953 00000 n +0000720019 00000 n +0000720085 00000 n +0000720149 00000 n +0000720215 00000 n +0000720281 00000 n +0000720345 00000 n +0000720410 00000 n +0000720475 00000 n +0000720539 00000 n +0000720604 00000 n +0000720669 00000 n +0000720733 00000 n +0000720798 00000 n +0000720863 00000 n +0000720927 00000 n +0000720991 00000 n +0000721056 00000 n +0000721121 00000 n +0000721185 00000 n +0000721251 00000 n +0000721317 00000 n +0000721381 00000 n +0000721447 00000 n +0000721513 00000 n +0000721577 00000 n +0000721643 00000 n +0000721709 00000 n +0000721773 00000 n +0000721838 00000 n +0000721903 00000 n +0000721967 00000 n +0000722032 00000 n +0000722097 00000 n +0000728586 00000 n +0000723835 00000 n +0000722259 00000 n +0000723961 00000 n +0000724025 00000 n +0000724089 00000 n +0000724155 00000 n +0000724221 00000 n +0000724285 00000 n +0000724351 00000 n +0000724417 00000 n +0000724481 00000 n +0000724547 00000 n +0000724613 00000 n +0000724677 00000 n +0000724743 00000 n +0000724809 00000 n +0000724873 00000 n +0000724939 00000 n +0000725005 00000 n +0000725069 00000 n +0000725135 00000 n +0000725201 00000 n +0000725265 00000 n +0000725331 00000 n +0000725397 00000 n +0000725461 00000 n +0000725527 00000 n +0000725593 00000 n +0000725657 00000 n +0000725723 00000 n +0000725789 00000 n +0000725854 00000 n +0000725919 00000 n +0000725984 00000 n +0000726048 00000 n +0000726112 00000 n +0000726178 00000 n +0000726244 00000 n +0000726308 00000 n +0000726374 00000 n +0000726440 00000 n +0000726504 00000 n +0000726570 00000 n +0000726636 00000 n +0000726700 00000 n +0000726766 00000 n +0000726832 00000 n +0000726896 00000 n +0000726960 00000 n +0000727026 00000 n +0000727092 00000 n +0000727156 00000 n +0000727222 00000 n +0000727288 00000 n +0000727353 00000 n +0000727419 00000 n +0000727485 00000 n +0000727549 00000 n +0000727615 00000 n +0000727681 00000 n +0000727745 00000 n +0000727809 00000 n +0000727875 00000 n +0000727941 00000 n +0000728005 00000 n +0000728071 00000 n +0000728264 00000 n +0000728328 00000 n +0000728394 00000 n +0000728458 00000 n +0000728520 00000 n +0000734666 00000 n +0000730201 00000 n +0000728698 00000 n +0000730327 00000 n +0000730391 00000 n +0000730455 00000 n +0000730519 00000 n +0000730585 00000 n +0000730649 00000 n +0000730713 00000 n +0000730777 00000 n +0000730841 00000 n +0000730906 00000 n +0000730971 00000 n +0000731035 00000 n +0000731099 00000 n +0000731164 00000 n +0000731229 00000 n +0000731294 00000 n +0000731360 00000 n +0000731426 00000 n +0000731489 00000 n +0000731552 00000 n +0000731616 00000 n +0000731680 00000 n +0000731744 00000 n +0000731810 00000 n +0000731874 00000 n +0000731940 00000 n +0000732005 00000 n +0000732069 00000 n +0000732133 00000 n +0000732197 00000 n +0000732263 00000 n +0000732329 00000 n +0000732393 00000 n +0000732457 00000 n +0000732523 00000 n +0000732587 00000 n +0000732653 00000 n +0000732717 00000 n +0000732783 00000 n +0000732849 00000 n +0000732913 00000 n +0000732977 00000 n +0000733043 00000 n +0000733107 00000 n +0000733173 00000 n +0000733236 00000 n +0000733302 00000 n +0000733368 00000 n +0000733432 00000 n +0000733496 00000 n +0000733562 00000 n +0000733626 00000 n +0000733692 00000 n +0000733756 00000 n +0000733822 00000 n +0000733888 00000 n +0000733952 00000 n +0000734016 00000 n +0000734082 00000 n +0000734146 00000 n +0000734212 00000 n +0000734276 00000 n +0000734342 00000 n +0000734408 00000 n +0000734472 00000 n +0000734536 00000 n +0000734602 00000 n +0000740935 00000 n +0000736190 00000 n +0000734765 00000 n +0000736316 00000 n +0000736380 00000 n +0000736446 00000 n +0000736511 00000 n +0000736577 00000 n +0000736643 00000 n +0000736707 00000 n +0000736771 00000 n +0000736837 00000 n +0000736901 00000 n +0000736967 00000 n +0000737032 00000 n +0000737098 00000 n +0000737164 00000 n +0000737228 00000 n +0000737292 00000 n +0000737358 00000 n +0000737422 00000 n +0000737488 00000 n +0000737553 00000 n +0000737619 00000 n +0000737685 00000 n +0000737749 00000 n +0000737813 00000 n +0000737879 00000 n +0000737943 00000 n +0000738009 00000 n +0000738074 00000 n +0000738140 00000 n +0000738206 00000 n +0000738270 00000 n +0000738334 00000 n +0000738400 00000 n +0000738464 00000 n +0000738530 00000 n +0000738595 00000 n +0000738661 00000 n +0000738727 00000 n +0000738791 00000 n +0000738855 00000 n +0000738921 00000 n +0000738985 00000 n +0000739051 00000 n +0000739116 00000 n +0000739182 00000 n +0000739248 00000 n +0000739312 00000 n +0000739376 00000 n +0000739442 00000 n +0000739506 00000 n +0000739572 00000 n +0000739637 00000 n +0000739703 00000 n +0000739769 00000 n +0000739833 00000 n +0000739897 00000 n +0000739963 00000 n +0000740027 00000 n +0000740093 00000 n +0000740158 00000 n +0000740224 00000 n +0000740290 00000 n +0000740354 00000 n +0000740418 00000 n +0000740484 00000 n +0000740548 00000 n +0000740614 00000 n +0000740679 00000 n +0000740744 00000 n +0000740809 00000 n +0000740872 00000 n +0000745226 00000 n +0000742312 00000 n +0000741034 00000 n +0000742438 00000 n +0000742502 00000 n +0000742568 00000 n +0000742632 00000 n +0000742698 00000 n +0000742763 00000 n +0000742829 00000 n +0000742895 00000 n +0000742959 00000 n +0000743023 00000 n +0000743089 00000 n +0000743153 00000 n +0000743219 00000 n +0000743284 00000 n +0000743350 00000 n +0000743416 00000 n +0000743480 00000 n +0000743544 00000 n +0000743610 00000 n +0000743674 00000 n +0000743740 00000 n +0000743805 00000 n +0000743871 00000 n +0000743937 00000 n +0000744001 00000 n +0000744067 00000 n +0000744133 00000 n +0000744197 00000 n +0000744261 00000 n +0000744325 00000 n +0000744518 00000 n +0000744581 00000 n +0000744647 00000 n +0000744711 00000 n +0000744775 00000 n +0000744841 00000 n +0000744905 00000 n +0000744969 00000 n +0000745033 00000 n +0000745097 00000 n +0000745162 00000 n +0000750074 00000 n +0000746465 00000 n +0000745338 00000 n +0000746591 00000 n +0000746718 00000 n +0000746782 00000 n +0000746846 00000 n +0000746910 00000 n +0000746976 00000 n +0000747042 00000 n +0000747106 00000 n +0000747170 00000 n +0000747235 00000 n +0000747300 00000 n +0000747365 00000 n +0000747430 00000 n +0000747495 00000 n +0000747559 00000 n +0000747623 00000 n +0000747688 00000 n +0000747752 00000 n +0000747817 00000 n +0000747881 00000 n +0000747945 00000 n +0000748009 00000 n +0000748202 00000 n +0000748266 00000 n +0000748332 00000 n +0000748396 00000 n +0000748459 00000 n +0000748525 00000 n +0000748589 00000 n +0000748653 00000 n +0000748719 00000 n +0000748783 00000 n +0000748845 00000 n +0000748909 00000 n +0000748973 00000 n +0000749039 00000 n +0000749105 00000 n +0000749169 00000 n +0000749233 00000 n +0000749298 00000 n +0000749363 00000 n +0000749428 00000 n +0000749494 00000 n +0000749560 00000 n +0000749624 00000 n +0000749688 00000 n +0000749753 00000 n +0000749817 00000 n +0000749882 00000 n +0000749946 00000 n +0000750010 00000 n +0000935552 00000 n +0000754439 00000 n +0000751531 00000 n +0000750186 00000 n +0000751657 00000 n +0000751721 00000 n +0000751785 00000 n +0000751916 00000 n +0000751980 00000 n +0000752046 00000 n +0000752110 00000 n +0000752173 00000 n +0000752239 00000 n +0000752303 00000 n +0000752367 00000 n +0000752431 00000 n +0000752495 00000 n +0000752561 00000 n +0000752625 00000 n +0000752689 00000 n +0000752753 00000 n +0000752817 00000 n +0000752883 00000 n +0000752949 00000 n +0000753013 00000 n +0000753077 00000 n +0000753142 00000 n +0000753207 00000 n +0000753272 00000 n +0000753338 00000 n +0000753404 00000 n +0000753468 00000 n +0000753532 00000 n +0000753597 00000 n +0000753661 00000 n +0000753726 00000 n +0000753791 00000 n +0000753857 00000 n +0000753923 00000 n +0000753987 00000 n +0000754053 00000 n +0000754119 00000 n +0000754183 00000 n +0000754247 00000 n +0000754311 00000 n +0000758619 00000 n +0000755724 00000 n +0000754551 00000 n +0000755850 00000 n +0000755979 00000 n +0000756043 00000 n +0000756108 00000 n +0000756172 00000 n +0000756234 00000 n +0000756298 00000 n +0000756364 00000 n +0000756427 00000 n +0000756491 00000 n +0000756554 00000 n +0000756618 00000 n +0000756684 00000 n +0000756750 00000 n +0000756814 00000 n +0000756878 00000 n +0000756943 00000 n +0000757008 00000 n +0000757073 00000 n +0000757139 00000 n +0000757205 00000 n +0000757268 00000 n +0000757331 00000 n +0000757396 00000 n +0000757460 00000 n +0000757525 00000 n +0000757590 00000 n +0000757656 00000 n +0000757722 00000 n +0000757785 00000 n +0000757848 00000 n +0000757913 00000 n +0000757977 00000 n +0000758042 00000 n +0000758106 00000 n +0000758170 00000 n +0000758232 00000 n +0000758426 00000 n +0000758489 00000 n +0000758555 00000 n +0000763865 00000 n +0000759990 00000 n +0000758731 00000 n +0000760116 00000 n +0000760180 00000 n +0000760244 00000 n +0000760308 00000 n +0000760374 00000 n +0000760438 00000 n +0000760502 00000 n +0000760566 00000 n +0000760630 00000 n +0000760696 00000 n +0000760760 00000 n +0000760824 00000 n +0000760888 00000 n +0000760952 00000 n +0000761018 00000 n +0000761084 00000 n +0000761148 00000 n +0000761212 00000 n +0000761277 00000 n +0000761342 00000 n +0000761407 00000 n +0000761473 00000 n +0000761539 00000 n +0000761603 00000 n +0000761669 00000 n +0000761735 00000 n +0000761799 00000 n +0000761863 00000 n +0000761928 00000 n +0000761993 00000 n +0000762057 00000 n +0000762122 00000 n +0000762187 00000 n +0000762251 00000 n +0000762316 00000 n +0000762381 00000 n +0000762445 00000 n +0000762510 00000 n +0000762575 00000 n +0000762638 00000 n +0000762703 00000 n +0000762768 00000 n +0000762832 00000 n +0000762897 00000 n +0000762962 00000 n +0000763026 00000 n +0000763091 00000 n +0000763156 00000 n +0000763220 00000 n +0000763284 00000 n +0000763348 00000 n +0000763542 00000 n +0000763606 00000 n +0000763672 00000 n +0000763736 00000 n +0000763799 00000 n +0000768364 00000 n +0000765135 00000 n +0000763977 00000 n +0000765261 00000 n +0000765325 00000 n +0000765389 00000 n +0000765453 00000 n +0000765517 00000 n +0000765583 00000 n +0000765647 00000 n +0000765711 00000 n +0000765775 00000 n +0000765839 00000 n +0000765905 00000 n +0000765971 00000 n +0000766035 00000 n +0000766099 00000 n +0000766164 00000 n +0000766229 00000 n +0000766294 00000 n +0000766360 00000 n +0000766426 00000 n +0000766490 00000 n +0000766554 00000 n +0000766619 00000 n +0000766683 00000 n +0000766748 00000 n +0000766813 00000 n +0000766879 00000 n +0000766945 00000 n +0000767009 00000 n +0000767073 00000 n +0000767138 00000 n +0000767203 00000 n +0000767267 00000 n +0000767332 00000 n +0000767397 00000 n +0000767461 00000 n +0000767525 00000 n +0000767589 00000 n +0000767783 00000 n +0000767847 00000 n +0000767913 00000 n +0000767977 00000 n +0000768040 00000 n +0000768106 00000 n +0000768170 00000 n +0000768234 00000 n +0000768298 00000 n +0000774299 00000 n +0000770046 00000 n +0000768476 00000 n +0000770172 00000 n +0000770236 00000 n +0000770300 00000 n +0000770364 00000 n +0000770428 00000 n +0000770492 00000 n +0000770558 00000 n +0000770624 00000 n +0000770687 00000 n +0000770750 00000 n +0000770815 00000 n +0000770880 00000 n +0000770945 00000 n +0000771011 00000 n +0000771077 00000 n +0000771141 00000 n +0000771207 00000 n +0000771273 00000 n +0000771337 00000 n +0000771401 00000 n +0000771466 00000 n +0000771531 00000 n +0000771594 00000 n +0000771659 00000 n +0000771724 00000 n +0000771788 00000 n +0000771853 00000 n +0000771918 00000 n +0000771982 00000 n +0000772047 00000 n +0000772112 00000 n +0000772176 00000 n +0000772241 00000 n +0000772306 00000 n +0000772369 00000 n +0000772433 00000 n +0000772497 00000 n +0000772561 00000 n +0000772626 00000 n +0000772691 00000 n +0000772755 00000 n +0000772820 00000 n +0000772885 00000 n +0000772949 00000 n +0000773014 00000 n +0000773079 00000 n +0000773142 00000 n +0000773206 00000 n +0000773270 00000 n +0000773334 00000 n +0000773399 00000 n +0000773464 00000 n +0000773528 00000 n +0000773592 00000 n +0000773655 00000 n +0000773849 00000 n +0000773912 00000 n +0000773978 00000 n +0000774042 00000 n +0000774106 00000 n +0000774172 00000 n +0000774235 00000 n +0000778785 00000 n +0000775491 00000 n +0000774411 00000 n +0000775617 00000 n +0000775681 00000 n +0000775745 00000 n +0000775809 00000 n +0000775873 00000 n +0000775937 00000 n +0000776003 00000 n +0000776069 00000 n +0000776133 00000 n +0000776197 00000 n +0000776262 00000 n +0000776327 00000 n +0000776392 00000 n +0000776458 00000 n +0000776524 00000 n +0000776588 00000 n +0000776654 00000 n +0000776720 00000 n +0000776784 00000 n +0000776848 00000 n +0000776913 00000 n +0000776978 00000 n +0000777042 00000 n +0000777107 00000 n +0000777172 00000 n +0000777236 00000 n +0000777300 00000 n +0000777364 00000 n +0000777557 00000 n +0000777621 00000 n +0000777687 00000 n +0000777751 00000 n +0000777815 00000 n +0000777881 00000 n +0000777945 00000 n +0000778009 00000 n +0000778073 00000 n +0000778139 00000 n +0000778203 00000 n +0000778267 00000 n +0000778331 00000 n +0000778395 00000 n +0000778461 00000 n +0000778527 00000 n +0000778591 00000 n +0000778655 00000 n +0000778720 00000 n +0000935677 00000 n +0000783994 00000 n +0000780116 00000 n +0000778897 00000 n +0000780242 00000 n +0000780306 00000 n +0000780370 00000 n +0000780435 00000 n +0000780501 00000 n +0000780567 00000 n +0000780631 00000 n +0000780697 00000 n +0000780763 00000 n +0000780827 00000 n +0000780891 00000 n +0000780956 00000 n +0000781021 00000 n +0000781085 00000 n +0000781150 00000 n +0000781215 00000 n +0000781279 00000 n +0000781343 00000 n +0000781407 00000 n +0000781601 00000 n +0000781665 00000 n +0000781731 00000 n +0000781794 00000 n +0000781858 00000 n +0000781924 00000 n +0000781988 00000 n +0000782052 00000 n +0000782116 00000 n +0000782182 00000 n +0000782246 00000 n +0000782310 00000 n +0000782374 00000 n +0000782438 00000 n +0000782504 00000 n +0000782570 00000 n +0000782633 00000 n +0000782696 00000 n +0000782761 00000 n +0000782826 00000 n +0000782891 00000 n +0000782957 00000 n +0000783023 00000 n +0000783087 00000 n +0000783151 00000 n +0000783216 00000 n +0000783280 00000 n +0000783345 00000 n +0000783410 00000 n +0000783476 00000 n +0000783542 00000 n +0000783606 00000 n +0000783670 00000 n +0000783735 00000 n +0000783800 00000 n +0000783864 00000 n +0000783929 00000 n +0000789066 00000 n +0000785583 00000 n +0000784106 00000 n +0000785709 00000 n +0000785773 00000 n +0000785837 00000 n +0000785901 00000 n +0000786094 00000 n +0000786158 00000 n +0000786224 00000 n +0000786288 00000 n +0000786352 00000 n +0000786418 00000 n +0000786482 00000 n +0000786546 00000 n +0000786610 00000 n +0000786674 00000 n +0000786740 00000 n +0000786804 00000 n +0000786868 00000 n +0000786932 00000 n +0000786996 00000 n +0000787062 00000 n +0000787128 00000 n +0000787192 00000 n +0000787256 00000 n +0000787321 00000 n +0000787386 00000 n +0000787451 00000 n +0000787517 00000 n +0000787583 00000 n +0000787647 00000 n +0000787713 00000 n +0000787779 00000 n +0000787843 00000 n +0000787907 00000 n +0000787972 00000 n +0000788037 00000 n +0000788100 00000 n +0000788165 00000 n +0000788230 00000 n +0000788294 00000 n +0000788359 00000 n +0000788424 00000 n +0000788488 00000 n +0000788553 00000 n +0000788618 00000 n +0000788682 00000 n +0000788747 00000 n +0000788812 00000 n +0000788875 00000 n +0000788939 00000 n +0000789003 00000 n +0000794312 00000 n +0000790636 00000 n +0000789178 00000 n +0000790762 00000 n +0000790826 00000 n +0000790891 00000 n +0000790956 00000 n +0000791020 00000 n +0000791085 00000 n +0000791150 00000 n +0000791214 00000 n +0000791279 00000 n +0000791344 00000 n +0000791408 00000 n +0000791473 00000 n +0000791538 00000 n +0000791602 00000 n +0000791667 00000 n +0000791732 00000 n +0000791796 00000 n +0000791861 00000 n +0000791926 00000 n +0000791990 00000 n +0000792055 00000 n +0000792120 00000 n +0000792184 00000 n +0000792248 00000 n +0000792312 00000 n +0000792506 00000 n +0000792570 00000 n +0000792635 00000 n +0000792699 00000 n +0000792763 00000 n +0000792829 00000 n +0000792893 00000 n +0000792956 00000 n +0000793020 00000 n +0000793084 00000 n +0000793150 00000 n +0000793214 00000 n +0000793278 00000 n +0000793342 00000 n +0000793406 00000 n +0000793472 00000 n +0000793538 00000 n +0000793602 00000 n +0000793666 00000 n +0000793731 00000 n +0000793796 00000 n +0000793861 00000 n +0000793926 00000 n +0000793991 00000 n +0000794055 00000 n +0000794119 00000 n +0000794184 00000 n +0000794248 00000 n +0000799513 00000 n +0000795768 00000 n +0000794424 00000 n +0000795894 00000 n +0000795958 00000 n +0000796023 00000 n +0000796089 00000 n +0000796155 00000 n +0000796219 00000 n +0000796283 00000 n +0000796348 00000 n +0000796413 00000 n +0000796477 00000 n +0000796542 00000 n +0000796607 00000 n +0000796671 00000 n +0000796736 00000 n +0000796801 00000 n +0000796865 00000 n +0000796930 00000 n +0000796995 00000 n +0000797059 00000 n +0000797124 00000 n +0000797189 00000 n +0000797253 00000 n +0000797318 00000 n +0000797383 00000 n +0000797447 00000 n +0000797512 00000 n +0000797577 00000 n +0000797641 00000 n +0000797705 00000 n +0000797769 00000 n +0000797963 00000 n +0000798027 00000 n +0000798093 00000 n +0000798156 00000 n +0000798220 00000 n +0000798286 00000 n +0000798350 00000 n +0000798414 00000 n +0000798478 00000 n +0000798542 00000 n +0000798608 00000 n +0000798672 00000 n +0000798736 00000 n +0000798800 00000 n +0000798864 00000 n +0000798929 00000 n +0000798994 00000 n +0000799058 00000 n +0000799122 00000 n +0000799187 00000 n +0000799252 00000 n +0000799317 00000 n +0000799383 00000 n +0000799449 00000 n +0000804976 00000 n +0000800972 00000 n +0000799625 00000 n +0000801098 00000 n +0000801162 00000 n +0000801228 00000 n +0000801294 00000 n +0000801358 00000 n +0000801422 00000 n +0000801487 00000 n +0000801552 00000 n +0000801616 00000 n +0000801681 00000 n +0000801746 00000 n +0000801810 00000 n +0000801875 00000 n +0000801940 00000 n +0000802004 00000 n +0000802068 00000 n +0000802134 00000 n +0000802199 00000 n +0000802264 00000 n +0000802329 00000 n +0000802393 00000 n +0000802458 00000 n +0000802523 00000 n +0000802587 00000 n +0000802652 00000 n +0000802717 00000 n +0000802781 00000 n +0000802846 00000 n +0000802911 00000 n +0000802975 00000 n +0000803040 00000 n +0000803105 00000 n +0000803169 00000 n +0000803234 00000 n +0000803299 00000 n +0000803363 00000 n +0000803427 00000 n +0000803493 00000 n +0000803557 00000 n +0000803621 00000 n +0000803685 00000 n +0000803878 00000 n +0000803942 00000 n +0000804008 00000 n +0000804072 00000 n +0000804136 00000 n +0000804202 00000 n +0000804266 00000 n +0000804330 00000 n +0000804394 00000 n +0000804460 00000 n +0000804524 00000 n +0000804588 00000 n +0000804652 00000 n +0000804716 00000 n +0000804782 00000 n +0000804848 00000 n +0000804912 00000 n +0000809946 00000 n +0000806398 00000 n +0000805088 00000 n +0000806524 00000 n +0000806588 00000 n +0000806653 00000 n +0000806718 00000 n +0000806783 00000 n +0000806849 00000 n +0000806915 00000 n +0000806979 00000 n +0000807043 00000 n +0000807108 00000 n +0000807172 00000 n +0000807237 00000 n +0000807302 00000 n +0000807368 00000 n +0000807434 00000 n +0000807498 00000 n +0000807562 00000 n +0000807627 00000 n +0000807692 00000 n +0000807756 00000 n +0000807821 00000 n +0000807886 00000 n +0000807950 00000 n +0000808015 00000 n +0000808080 00000 n +0000808144 00000 n +0000808209 00000 n +0000808274 00000 n +0000808338 00000 n +0000808402 00000 n +0000808466 00000 n +0000808659 00000 n +0000808723 00000 n +0000808788 00000 n +0000808852 00000 n +0000808916 00000 n +0000808982 00000 n +0000809046 00000 n +0000809109 00000 n +0000809173 00000 n +0000809237 00000 n +0000809303 00000 n +0000809367 00000 n +0000809431 00000 n +0000809495 00000 n +0000809558 00000 n +0000809624 00000 n +0000809690 00000 n +0000809753 00000 n +0000809816 00000 n +0000809881 00000 n +0000935802 00000 n +0000815279 00000 n +0000811468 00000 n +0000810058 00000 n +0000811594 00000 n +0000811658 00000 n +0000811723 00000 n +0000811789 00000 n +0000811855 00000 n +0000811919 00000 n +0000811983 00000 n +0000812048 00000 n +0000812112 00000 n +0000812177 00000 n +0000812242 00000 n +0000812308 00000 n +0000812374 00000 n +0000812438 00000 n +0000812502 00000 n +0000812567 00000 n +0000812632 00000 n +0000812696 00000 n +0000812761 00000 n +0000812826 00000 n +0000812890 00000 n +0000812955 00000 n +0000813020 00000 n +0000813084 00000 n +0000813149 00000 n +0000813214 00000 n +0000813278 00000 n +0000813343 00000 n +0000813408 00000 n +0000813472 00000 n +0000813537 00000 n +0000813602 00000 n +0000813666 00000 n +0000813731 00000 n +0000813796 00000 n +0000813860 00000 n +0000813925 00000 n +0000813990 00000 n +0000814054 00000 n +0000814119 00000 n +0000814184 00000 n +0000814248 00000 n +0000814312 00000 n +0000814376 00000 n +0000814570 00000 n +0000814634 00000 n +0000814700 00000 n +0000814764 00000 n +0000814828 00000 n +0000814894 00000 n +0000814958 00000 n +0000815021 00000 n +0000815085 00000 n +0000815149 00000 n +0000815215 00000 n +0000821122 00000 n +0000816870 00000 n +0000815391 00000 n +0000816996 00000 n +0000817060 00000 n +0000817124 00000 n +0000817188 00000 n +0000817252 00000 n +0000817318 00000 n +0000817384 00000 n +0000817448 00000 n +0000817512 00000 n +0000817577 00000 n +0000817642 00000 n +0000817707 00000 n +0000817772 00000 n +0000817837 00000 n +0000817901 00000 n +0000817965 00000 n +0000818030 00000 n +0000818094 00000 n +0000818159 00000 n +0000818224 00000 n +0000818289 00000 n +0000818354 00000 n +0000818417 00000 n +0000818480 00000 n +0000818545 00000 n +0000818610 00000 n +0000818674 00000 n +0000818739 00000 n +0000818804 00000 n +0000818868 00000 n +0000818933 00000 n +0000818998 00000 n +0000819062 00000 n +0000819125 00000 n +0000819188 00000 n +0000819252 00000 n +0000819317 00000 n +0000819382 00000 n +0000819446 00000 n +0000819511 00000 n +0000819576 00000 n +0000819639 00000 n +0000819704 00000 n +0000819769 00000 n +0000819833 00000 n +0000819897 00000 n +0000819961 00000 n +0000820025 00000 n +0000820090 00000 n +0000820155 00000 n +0000820219 00000 n +0000820284 00000 n +0000820349 00000 n +0000820413 00000 n +0000820477 00000 n +0000820541 00000 n +0000820734 00000 n +0000820798 00000 n +0000820864 00000 n +0000820928 00000 n +0000820992 00000 n +0000821058 00000 n +0000825500 00000 n +0000822339 00000 n +0000821234 00000 n +0000822465 00000 n +0000822529 00000 n +0000822593 00000 n +0000822657 00000 n +0000822721 00000 n +0000822787 00000 n +0000822851 00000 n +0000822915 00000 n +0000822979 00000 n +0000823043 00000 n +0000823109 00000 n +0000823175 00000 n +0000823239 00000 n +0000823303 00000 n +0000823367 00000 n +0000823431 00000 n +0000823496 00000 n +0000823562 00000 n +0000823628 00000 n +0000823690 00000 n +0000823756 00000 n +0000823822 00000 n +0000823886 00000 n +0000823950 00000 n +0000824014 00000 n +0000824207 00000 n +0000824271 00000 n +0000824337 00000 n +0000824401 00000 n +0000824465 00000 n +0000824531 00000 n +0000824595 00000 n +0000824659 00000 n +0000824723 00000 n +0000824789 00000 n +0000824853 00000 n +0000824917 00000 n +0000824981 00000 n +0000825045 00000 n +0000825111 00000 n +0000825177 00000 n +0000825241 00000 n +0000825305 00000 n +0000825370 00000 n +0000825435 00000 n +0000830193 00000 n +0000826965 00000 n +0000825612 00000 n +0000827091 00000 n +0000827155 00000 n +0000827221 00000 n +0000827287 00000 n +0000827351 00000 n +0000827415 00000 n +0000827480 00000 n +0000827544 00000 n +0000827609 00000 n +0000827674 00000 n +0000827740 00000 n +0000827806 00000 n +0000827870 00000 n +0000827934 00000 n +0000827999 00000 n +0000828064 00000 n +0000828128 00000 n +0000828193 00000 n +0000828258 00000 n +0000828322 00000 n +0000828387 00000 n +0000828452 00000 n +0000828516 00000 n +0000828580 00000 n +0000828644 00000 n +0000828837 00000 n +0000828901 00000 n +0000828967 00000 n +0000829031 00000 n +0000829095 00000 n +0000829161 00000 n +0000829225 00000 n +0000829289 00000 n +0000829353 00000 n +0000829417 00000 n +0000829481 00000 n +0000829547 00000 n +0000829611 00000 n +0000829675 00000 n +0000829739 00000 n +0000829803 00000 n +0000829869 00000 n +0000829935 00000 n +0000829999 00000 n +0000830063 00000 n +0000830128 00000 n +0000834915 00000 n +0000831818 00000 n +0000830305 00000 n +0000831944 00000 n +0000832008 00000 n +0000832073 00000 n +0000832139 00000 n +0000832205 00000 n +0000832269 00000 n +0000832333 00000 n +0000832398 00000 n +0000832462 00000 n +0000832527 00000 n +0000832592 00000 n +0000832658 00000 n +0000832724 00000 n +0000832788 00000 n +0000832852 00000 n +0000832917 00000 n +0000832982 00000 n +0000833046 00000 n +0000833111 00000 n +0000833176 00000 n +0000833240 00000 n +0000833305 00000 n +0000833370 00000 n +0000833434 00000 n +0000833499 00000 n +0000833564 00000 n +0000833628 00000 n +0000833693 00000 n +0000833758 00000 n +0000833822 00000 n +0000833886 00000 n +0000833950 00000 n +0000834144 00000 n +0000834208 00000 n +0000834273 00000 n +0000834337 00000 n +0000834401 00000 n +0000834467 00000 n +0000834531 00000 n +0000834594 00000 n +0000834658 00000 n +0000834721 00000 n +0000834785 00000 n +0000834851 00000 n +0000839440 00000 n +0000836152 00000 n +0000835027 00000 n +0000836278 00000 n +0000836342 00000 n +0000836406 00000 n +0000836470 00000 n +0000836534 00000 n +0000836598 00000 n +0000836664 00000 n +0000836730 00000 n +0000836794 00000 n +0000836858 00000 n +0000836923 00000 n +0000836988 00000 n +0000837053 00000 n +0000837118 00000 n +0000837183 00000 n +0000837247 00000 n +0000837311 00000 n +0000837376 00000 n +0000837440 00000 n +0000837505 00000 n +0000837570 00000 n +0000837635 00000 n +0000837700 00000 n +0000837764 00000 n +0000837830 00000 n +0000837896 00000 n +0000837960 00000 n +0000838023 00000 n +0000838087 00000 n +0000838279 00000 n +0000838343 00000 n +0000838409 00000 n +0000838473 00000 n +0000838537 00000 n +0000838603 00000 n +0000838667 00000 n +0000838731 00000 n +0000838797 00000 n +0000838861 00000 n +0000838925 00000 n +0000838989 00000 n +0000839053 00000 n +0000839119 00000 n +0000839183 00000 n +0000839247 00000 n +0000839311 00000 n +0000935927 00000 n +0000843207 00000 n +0000840438 00000 n +0000839552 00000 n +0000840564 00000 n +0000840756 00000 n +0000840820 00000 n +0000840886 00000 n +0000840950 00000 n +0000841014 00000 n +0000841080 00000 n +0000841144 00000 n +0000841208 00000 n +0000841271 00000 n +0000841335 00000 n +0000841401 00000 n +0000841467 00000 n +0000841530 00000 n +0000841594 00000 n +0000841658 00000 n +0000841851 00000 n +0000841915 00000 n +0000841981 00000 n +0000842045 00000 n +0000842109 00000 n +0000842174 00000 n +0000842238 00000 n +0000842302 00000 n +0000842368 00000 n +0000842432 00000 n +0000842496 00000 n +0000842560 00000 n +0000842624 00000 n +0000842690 00000 n +0000842756 00000 n +0000842820 00000 n +0000842884 00000 n +0000842948 00000 n +0000843014 00000 n +0000843078 00000 n +0000843142 00000 n +0000847362 00000 n +0000844459 00000 n +0000843319 00000 n +0000844585 00000 n +0000844713 00000 n +0000844777 00000 n +0000844843 00000 n +0000844907 00000 n +0000844970 00000 n +0000845036 00000 n +0000845100 00000 n +0000845164 00000 n +0000845228 00000 n +0000845292 00000 n +0000845356 00000 n +0000845420 00000 n +0000845486 00000 n +0000845550 00000 n +0000845614 00000 n +0000845678 00000 n +0000845742 00000 n +0000845808 00000 n +0000845874 00000 n +0000845938 00000 n +0000846002 00000 n +0000846067 00000 n +0000846132 00000 n +0000846196 00000 n +0000846261 00000 n +0000846326 00000 n +0000846390 00000 n +0000846454 00000 n +0000846518 00000 n +0000846584 00000 n +0000846648 00000 n +0000846712 00000 n +0000846777 00000 n +0000846841 00000 n +0000846906 00000 n +0000846970 00000 n +0000847034 00000 n +0000847100 00000 n +0000847166 00000 n +0000847230 00000 n +0000847296 00000 n +0000849207 00000 n +0000849182 00000 n +0000849301 00000 n +0000868305 00000 n +0000879887 00000 n +0000891458 00000 n +0000910693 00000 n +0000920854 00000 n +0000932910 00000 n +0000936025 00000 n +0000936149 00000 n +0000936275 00000 n +0000936401 00000 n +0000936518 00000 n +0000936610 00000 n +0000948149 00000 n +0001073075 00000 n +0001073116 00000 n +0001073156 00000 n +0001073290 00000 n +trailer +<< +/Size 8038 +/Root 8036 0 R +/Info 8037 0 R +/ID [<9BCC16D6BBB391552556A07D72BF57B5> <9BCC16D6BBB391552556A07D72BF57B5>] +>> +startxref +1073554 +%%EOF diff --git a/doc/PLCAPI.xml b/doc/PLCAPI.xml new file mode 100644 index 0000000..f778525 --- /dev/null +++ b/doc/PLCAPI.xml @@ -0,0 +1,239 @@ + + +]> + + + + PlanetLab Central API Documentation + + + + Introduction + + The PlanetLab Central API (PLCAPI) is the interface through + which the PlanetLab Central database should be accessed and + maintained. The API is used by the website, by nodes, by automated + scripts, and by users to access and update information about + users, nodes, sites, slices, and other entities maintained by the + database. + +